ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDAyMGI4NmQuLmI3NTQ2YTUgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw1ICsxLDE3MCBAQAotR0lULVZFUlNJT04tRklMRQorR0lULUNGTEFHUwogR0lULUdVSS1WQVJTCi1naXQtY2l0b29sCi1naXQtZ3VpCi1saWIvdGNsSW5kZXgKK0dJVC1WRVJTSU9OLUZJTEUKK2dpdAorZ2l0LWFkZAorZ2l0LWFkZC0taW50ZXJhY3RpdmUKK2dpdC1hbQorZ2l0LWFubm90YXRlCitnaXQtYXBwbHkKK2dpdC1hcHBseW1ib3gKK2dpdC1hcHBseXBhdGNoCitnaXQtYXJjaGltcG9ydAorZ2l0LWFyY2hpdmUKK2dpdC1iaXNlY3QKK2dpdC1ibGFtZQorZ2l0LWJyYW5jaAorZ2l0LWJ1bmRsZQorZ2l0LWNhdC1maWxlCitnaXQtY2hlY2stYXR0cgorZ2l0LWNoZWNrLXJlZi1mb3JtYXQKK2dpdC1jaGVja291dAorZ2l0LWNoZWNrb3V0LWluZGV4CitnaXQtY2hlcnJ5CitnaXQtY2hlcnJ5LXBpY2sKK2dpdC1jbGVhbgorZ2l0LWNsb25lCitnaXQtY29tbWl0CitnaXQtY29tbWl0LXRyZWUKK2dpdC1jb25maWcKK2dpdC1jb252ZXJ0LW9iamVjdHMKK2dpdC1jb3VudC1vYmplY3RzCitnaXQtY3ZzZXhwb3J0Y29tbWl0CitnaXQtY3ZzaW1wb3J0CitnaXQtY3Zzc2VydmVyCitnaXQtZGFlbW9uCitnaXQtZGlmZgorZ2l0LWRpZmYtZmlsZXMKK2dpdC1kaWZmLWluZGV4CitnaXQtZGlmZi10cmVlCitnaXQtZGVzY3JpYmUKK2dpdC1mYXN0LWltcG9ydAorZ2l0LWZldGNoCitnaXQtZmV0Y2gtLXRvb2wKK2dpdC1mZXRjaC1wYWNrCitnaXQtZmluZHRhZ3MKK2dpdC1mbXQtbWVyZ2UtbXNnCitnaXQtZm9yLWVhY2gtcmVmCitnaXQtZm9ybWF0LXBhdGNoCitnaXQtZnNjaworZ2l0LWZzY2stb2JqZWN0cworZ2l0LWdjCitnaXQtZ2V0LXRhci1jb21taXQtaWQKK2dpdC1ncmVwCitnaXQtaGFzaC1vYmplY3QKK2dpdC1odHRwLWZldGNoCitnaXQtaHR0cC1wdXNoCitnaXQtaW1hcC1zZW5kCitnaXQtaW5kZXgtcGFjaworZ2l0LWluaXQKK2dpdC1pbml0LWRiCitnaXQtaW5zdGF3ZWIKK2dpdC1sb2NhbC1mZXRjaAorZ2l0LWxvZworZ2l0LWxvc3QtZm91bmQKK2dpdC1scy1maWxlcworZ2l0LWxzLXJlbW90ZQorZ2l0LWxzLXRyZWUKK2dpdC1tYWlsaW5mbworZ2l0LW1haWxzcGxpdAorZ2l0LW1lcmdlCitnaXQtbWVyZ2UtYmFzZQorZ2l0LW1lcmdlLWluZGV4CitnaXQtbWVyZ2UtZmlsZQorZ2l0LW1lcmdlLXRyZWUKK2dpdC1tZXJnZS1vY3RvcHVzCitnaXQtbWVyZ2Utb25lLWZpbGUKK2dpdC1tZXJnZS1vdXJzCitnaXQtbWVyZ2UtcmVjdXJzaXZlCitnaXQtbWVyZ2UtcmVzb2x2ZQorZ2l0LW1lcmdlLXN0dXBpZAorZ2l0LW1lcmdlLXN1YnRyZWUKK2dpdC1tZXJnZXRvb2wKK2dpdC1ta3RhZworZ2l0LW1rdHJlZQorZ2l0LW5hbWUtcmV2CitnaXQtbXYKK2dpdC1wYWNrLXJlZHVuZGFudAorZ2l0LXBhY2stb2JqZWN0cworZ2l0LXBhY2stcmVmcworZ2l0LXBhcnNlLXJlbW90ZQorZ2l0LXBhdGNoLWlkCitnaXQtcGVlay1yZW1vdGUKK2dpdC1wcnVuZQorZ2l0LXBydW5lLXBhY2tlZAorZ2l0LXB1bGwKK2dpdC1wdXNoCitnaXQtcXVpbHRpbXBvcnQKK2dpdC1yZWFkLXRyZWUKK2dpdC1yZWJhc2UKK2dpdC1yZWNlaXZlLXBhY2sKK2dpdC1yZWZsb2cKK2dpdC1yZWxpbmsKK2dpdC1yZW1vdGUKK2dpdC1yZXBhY2sKK2dpdC1yZXBvLWNvbmZpZworZ2l0LXJlcXVlc3QtcHVsbAorZ2l0LXJlcmVyZQorZ2l0LXJlc2V0CitnaXQtcmV2LWxpc3QKK2dpdC1yZXYtcGFyc2UKK2dpdC1yZXZlcnQKK2dpdC1ybQorZ2l0LXJ1bnN0YXR1cworZ2l0LXNlbmQtZW1haWwKK2dpdC1zZW5kLXBhY2sKK2dpdC1zaC1zZXR1cAorZ2l0LXNoZWxsCitnaXQtc2hvcnRsb2cKK2dpdC1zaG93CitnaXQtc2hvdy1icmFuY2gKK2dpdC1zaG93LWluZGV4CitnaXQtc2hvdy1yZWYKK2dpdC1zc2gtZmV0Y2gKK2dpdC1zc2gtcHVsbAorZ2l0LXNzaC1wdXNoCitnaXQtc3NoLXVwbG9hZAorZ2l0LXN0YXR1cworZ2l0LXN0cmlwc3BhY2UKK2dpdC1zdm4KK2dpdC1zdm5pbXBvcnQKK2dpdC1zeW1ib2xpYy1yZWYKK2dpdC10YWcKK2dpdC10YXItdHJlZQorZ2l0LXVucGFjay1maWxlCitnaXQtdW5wYWNrLW9iamVjdHMKK2dpdC11cGRhdGUtaW5kZXgKK2dpdC11cGRhdGUtcmVmCitnaXQtdXBkYXRlLXNlcnZlci1pbmZvCitnaXQtdXBsb2FkLWFyY2hpdmUKK2dpdC11cGxvYWQtcGFjaworZ2l0LXZhcgorZ2l0LXZlcmlmeS1wYWNrCitnaXQtdmVyaWZ5LXRhZworZ2l0LXdoYXRjaGFuZ2VkCitnaXQtd3JpdGUtdHJlZQorZ2l0LWNvcmUtKi8/KgorZ2l0ay13aXNoCitnaXR3ZWIvZ2l0d2ViLmNnaQordGVzdC1jaG10aW1lCit0ZXN0LWRhdGUKK3Rlc3QtZGVsdGEKK3Rlc3QtZHVtcC1jYWNoZS10cmVlCit0ZXN0LWdlbnJhbmRvbQordGVzdC1tYXRjaC10cmVlcworY29tbW9uLWNtZHMuaAorKi50YXIuZ3oKKyouZHNjCisqLmRlYgorZ2l0LnNwZWMKKyouZXhlCisqLlthb10KKyoucHlbY29dCitjb25maWcubWFrCithdXRvbTR0ZS5jYWNoZQorY29uZmlnLmNhY2hlCitjb25maWcubG9nCitjb25maWcuc3RhdHVzCitjb25maWcubWFrLmF1dG9nZW4KK2NvbmZpZy5tYWsuYXBwZW5kCitjb25maWd1cmUKZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwNjE1ZQotLS0gL2Rldi9udWxsCisrKyBiLy5tYWlsbWFwCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgVGhpcyBsaXN0IGlzIHVzZWQgYnkgZ2l0LXNob3J0bG9nIHRvIGZpeCBhIGZldyBib3RjaGVkIG5hbWUgdHJhbnNsYXRpb25zCisjIGluIHRoZSBnaXQgYXJjaGl2ZSwgZWl0aGVyIGJlY2F1c2UgdGhlIGF1dGhvcidzIGZ1bGwgbmFtZSB3YXMgbWVzc2VkIHVwCisjIGFuZC9vciBub3QgYWx3YXlzIHdyaXR0ZW4gdGhlIHNhbWUgd2F5LCBtYWtpbmcgY29udHJpYnV0aW9ucyBmcm9tIHRoZQorIyBzYW1lIHBlcnNvbiBhcHBlYXJpbmcgbm90IHRvIGJlIHNvLgorIworCitBbmVlc2ggS3VtYXIgSy5WIDxhbmVlc2gua3VtYXJAZ21haWwuY29tPgorQ2hyaXMgU2hvZW1ha2VyIDxjLnNob2VtYWtlckBjb3gubmV0PgorRGFuaWVsIEJhcmthbG93IDxiYXJrYWxvd0BpYWJlcnZvbi5vcmc+CitEYXZpZCBLw6VnZWRhbCA8ZGF2aWRrQGx5c2F0b3IubGl1LnNlPgorRnJlZHJpayBLdWl2aW5lbiA8ZnJla3UwNDVAc3R1ZGVudC5saXUuc2U+CitILiBQZXRlciBBbnZpbiA8aHBhQGJvbmRlLnNjLm9yaW9ubXVsdGkuY29tPgorSC4gUGV0ZXIgQW52aW4gPGhwYUB0YXplbmRhLnNjLm9yaW9ubXVsdGkuY29tPgorSC4gUGV0ZXIgQW52aW4gPGhwYUB0cmFudG9yLmhvcy5hbnZpbi5vcmc+CitIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KK0pvYWNoaW0gQmVyZGFsIEhhZ2EgPGNqaGFnYUBmeXMudWlvLm5vPgorSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0pvbiBTZXltb3VyIDxqb25AYmxhY2tjdWJlcy5keW5kbnMub3JnPgorS2FybCBIYXNzZWxzdHLDtm0gPGtoYUB0cmVza2FsLmNvbT4KK0tlbnQgRW5nc3Ryb20gPGtlbnRAbHlzYXRvci5saXUuc2U+CitMYXJzIERvZWxsZSA8bGFycy5kb2VsbGVAb24tbGluZS5kZT4KK0xhcnMgRG9lbGxlIDxsYXJzLmRvZWxsZUBvbi1saW5lICEgZGU+CitMdWthcyBTYW5kc3Ryw7ZtIDxsdWthc3NAZXRlay5jaGFsbWVycy5zZT4KK01hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KK01pY2hlbGUgQmFsbGFiaW8gPGJhcnJhX2N1ZGFAa2F0YW1haWwuY29tPgorTmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eSA8cGNsb3Vkc0BnbWFpbC5jb20+CitSYW1zYXkgQWxsYW4gSm9uZXMgPHJhbXNheUByYW1zYXkxLmRlbW9uLmNvLnVrPgorUmVuw6kgU2NoYXJmZSA8cmVuZS5zY2hhcmZlQGxzcmZpcmUuYXRoLmN4PgorUm9iZXJ0IEZpdHpzaW1vbnMgPHJvYmZpdHpAMjczay5uZXQ+CitTYW0gVmlsYWluIDxzYW1AdmlsYWluLm5ldD4KK1NhbnRpIELDqWphciA8c2JlamFyQGdtYWlsLmNvbT4KK1NlYW4gRXN0YWJyb29rcyA8c2VhbmxrbWxAc3ltcGF0aWNvLmNhPgorU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KK1RvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KK1V3ZSBLbGVpbmUtS8O2bmlnIDx6ZWlzYmVyZ0BpbmZvcm1hdGlrLnVuaS1mcmVpYnVyZy5kZT4KK1V3ZSBLbGVpbmUtS8O2bmlnIDxVd2VfWmVpc2JlcmdlckBkaWdpLmNvbT4KK1V3ZSBLbGVpbmUtS8O2bmlnIDx1emVpc2JlcmdlckBpby5mc2ZvcnRoLmRlPgorVXdlIEtsZWluZS1Lw7ZuaWcgPHVrbGVpbmVrQGluZm9ybWF0aWsudW5pLWZyZWlidXJnLmRlPgorVmlsbGUgU2t5dHTDpCA8c2NvcEB4ZW1hY3Mub3JnPgorWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorYW5vbnltb3VzIDxsaW51eEBob3Jpem9uLmNvbT4KK2Fub255bW91cyA8bGludXhAaG9yaXpvbi5uZXQ+CitEYW5hIEwuIEhvdyA8aG93QGRlYXRodmFsbGV5LmNzd2l0Y2guY29tPgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmODdjNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwzNjEgQEAKKworIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorIGlzIGNvbmNlcm5lZCBpcyBfdGhpc18gcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIChpZSB2Miwgbm90CisgdjIuMiBvciB2My54IG9yIHdoYXRldmVyKSwgdW5sZXNzIGV4cGxpY2l0bHkgb3RoZXJ3aXNlIHN0YXRlZC4KKworIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorIGEgZ29vZCBpZGVhLCBJIGFsc28gYXNrIHRoYXQgcGVvcGxlIGludm9sdmVkIHdpdGggdGhlIHByb2plY3QgbWFrZQorIHRoZWlyIHByZWZlcmVuY2VzIGtub3duLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgdHJ1c3QgbWUgdG8gbWFrZSB0aGF0CisgZGVjaXNpb24sIHlvdSBtaWdodCBub3RlIHNvIGluIHlvdXIgY29weXJpZ2h0IG1lc3NhZ2UsIGllIHNvbWV0aGluZworIGxpa2UKKworCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKwlhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cy4KKworICBtaWdodCBhdm9pZCBpc3N1ZXMuIEJ1dCB3ZSBjYW4gYWxzbyBqdXN0IGRlY2lkZSB0byBzeW5jaHJvbml6ZSBhbmQKKyAgY29udGFjdCBhbGwgY29weXJpZ2h0IGhvbGRlcnMgb24gcmVjb3JkIGlmL3doZW4gdGhlIG9jY2FzaW9uIGFyaXNlcy4KKworCQkJTGludXMgVG9ydmFsZHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzN2IyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uLy5naXRpZ25vcmUKQEAgLTAsMCArMSw3IEBACisqLnhtbAorKi5odG1sCisqLlsxLThdCisqLm1hZGUKK2hvd3RvLWluZGV4LnR4dAorZG9jLmRlcAorY21kcy0qLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkZjc4OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKQEAgLTAsMCArMSwxNjAgQEAKK01BTjFfVFhUPSBcCisJJChmaWx0ZXItb3V0ICQoYWRkc3VmZml4IC50eHQsICQoQVJUSUNMRVMpICQoU1BfQVJUSUNMRVMpKSwgXAorCQkkKHdpbGRjYXJkIGdpdC0qLnR4dCkpIFwKKwlnaXRrLnR4dAorTUFONV9UWFQ9Z2l0YXR0cmlidXRlcy50eHQgZ2l0aWdub3JlLnR4dAorTUFON19UWFQ9Z2l0LnR4dAorCitET0NfSFRNTD0kKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKE1BTjFfVFhUKSAkKE1BTjVfVFhUKSAkKE1BTjdfVFhUKSkKKworQVJUSUNMRVMgPSB0dXRvcmlhbAorQVJUSUNMRVMgKz0gdHV0b3JpYWwtMgorQVJUSUNMRVMgKz0gY29yZS10dXRvcmlhbAorQVJUSUNMRVMgKz0gY3ZzLW1pZ3JhdGlvbgorQVJUSUNMRVMgKz0gZGlmZmNvcmUKK0FSVElDTEVTICs9IGhvd3RvLWluZGV4CitBUlRJQ0xFUyArPSByZXBvc2l0b3J5LWxheW91dAorQVJUSUNMRVMgKz0gaG9va3MKK0FSVElDTEVTICs9IGV2ZXJ5ZGF5CitBUlRJQ0xFUyArPSBnaXQtdG9vbHMKK0FSVElDTEVTICs9IGdsb3NzYXJ5CisjIHdpdGggdGhlaXIgb3duIGZvcm1hdHRpbmcgcnVsZXMuCitTUF9BUlRJQ0xFUyA9IGhvd3RvL3JldmVydC1icmFuY2gtcmViYXNlIHVzZXItbWFudWFsCisKK0RPQ19IVE1MICs9ICQocGF0c3Vic3QgJSwlLmh0bWwsJChBUlRJQ0xFUykgJChTUF9BUlRJQ0xFUykpCisKK0RPQ19NQU4xPSQocGF0c3Vic3QgJS50eHQsJS4xLCQoTUFOMV9UWFQpKQorRE9DX01BTjU9JChwYXRzdWJzdCAlLnR4dCwlLjUsJChNQU41X1RYVCkpCitET0NfTUFONz0kKHBhdHN1YnN0ICUudHh0LCUuNywkKE1BTjdfVFhUKSkKKworcHJlZml4Pz0kKEhPTUUpCitiaW5kaXI/PSQocHJlZml4KS9iaW4KK21hbmRpcj89JChwcmVmaXgpL21hbgorbWFuMWRpcj0kKG1hbmRpcikvbWFuMQorbWFuNWRpcj0kKG1hbmRpcikvbWFuNQorbWFuN2Rpcj0kKG1hbmRpcikvbWFuNworIyBERVNURElSPQorCitBU0NJSURPQz1hc2NpaWRvYworQVNDSUlET0NfRVhUUkEgPQoraWZkZWYgQVNDSUlET0M4CitBU0NJSURPQ19FWFRSQSArPSAtYSBhc2NpaWRvYzdjb21wYXRpYmxlCitlbmRpZgorSU5TVEFMTD89aW5zdGFsbAorRE9DX1JFRiA9IG9yaWdpbi9tYW4KKworLWluY2x1ZGUgLi4vY29uZmlnLm1hay5hdXRvZ2VuCistaW5jbHVkZSAuLi9jb25maWcubWFrCisKKyMKKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbm9yIGJ1ZyBpbiBhc2NpaWRvYy4KKyMgVGhlIHZlcnNpb24gYWZ0ZXIgNi4wLjMgX3dpbGxfIGluY2x1ZGUgdGhlIHBhdGNoIGZvdW5kIGhlcmU6CisjICAgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTE1NTg3NTcyMDIyNDMmdz0yCisjCisjIFVudGlsIHRoYXQgdmVyc2lvbiBpcyByZWxlYXNlZCB5b3UgbWF5IGhhdmUgdG8gYXBwbHkgdGhlIHBhdGNoCisjIHlvdXJzZWxmIC0geWVzLCBhbGwgNiBjaGFyYWN0ZXJzIG9mIGl0IQorIworCithbGw6IGh0bWwgbWFuCisKK2h0bWw6ICQoRE9DX0hUTUwpCisKKyQoRE9DX0hUTUwpICQoRE9DX01BTjEpICQoRE9DX01BTjUpICQoRE9DX01BTjcpOiBhc2NpaWRvYy5jb25mCisKK21hbjogbWFuMSBtYW41IG1hbjcKK21hbjE6ICQoRE9DX01BTjEpCittYW41OiAkKERPQ19NQU41KQorbWFuNzogJChET0NfTUFONykKKworaW5zdGFsbDogbWFuCisJJChJTlNUQUxMKSAtZCAtbTc1NSAkKERFU1RESVIpJChtYW4xZGlyKQorCSQoSU5TVEFMTCkgLWQgLW03NTUgJChERVNURElSKSQobWFuNWRpcikKKwkkKElOU1RBTEwpIC1kIC1tNzU1ICQoREVTVERJUikkKG1hbjdkaXIpCisJJChJTlNUQUxMKSAtbTY0NCAkKERPQ19NQU4xKSAkKERFU1RESVIpJChtYW4xZGlyKQorCSQoSU5TVEFMTCkgLW02NDQgJChET0NfTUFONSkgJChERVNURElSKSQobWFuNWRpcikKKwkkKElOU1RBTEwpIC1tNjQ0ICQoRE9DX01BTjcpICQoREVTVERJUikkKG1hbjdkaXIpCisKKworLi4vR0lULVZFUlNJT04tRklMRTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUKKwkkKE1BS0UpIC1DIC4uLyBHSVQtVkVSU0lPTi1GSUxFCisKKy1pbmNsdWRlIC4uL0dJVC1WRVJTSU9OLUZJTEUKKworIworIyBEZXRlcm1pbmUgImluY2x1ZGU6OiIgZmlsZSByZWZlcmVuY2VzIGluIGFzY2lpZG9jIGZpbGVzLgorIworZG9jLmRlcCA6ICQod2lsZGNhcmQgKi50eHQpIGJ1aWxkLWRvY2RlcC5wZXJsCisJcm0gLWYgJEArICRACisJcGVybCAuL2J1aWxkLWRvY2RlcC5wZXJsID4kQCsKKwltdiAkQCsgJEAKKworLWluY2x1ZGUgZG9jLmRlcAorCitjbWRzX3R4dCA9IGNtZHMtYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycy50eHQgXAorCWNtZHMtYW5jaWxsYXJ5bWFuaXB1bGF0b3JzLnR4dCBcCisJY21kcy1tYWlucG9yY2VsYWluLnR4dCBcCisJY21kcy1wbHVtYmluZ2ludGVycm9nYXRvcnMudHh0IFwKKwljbWRzLXBsdW1iaW5nbWFuaXB1bGF0b3JzLnR4dCBcCisJY21kcy1zeW5jaGluZ3JlcG9zaXRvcmllcy50eHQgXAorCWNtZHMtc3luY2hlbHBlcnMudHh0IFwKKwljbWRzLXB1cmVoZWxwZXJzLnR4dCBcCisJY21kcy1mb3JlaWduc2NtaW50ZXJmYWNlLnR4dAorCiskKGNtZHNfdHh0KTogY21kLWxpc3QubWFkZQorCitjbWQtbGlzdC5tYWRlOiBjbWQtbGlzdC5wZXJsICQoTUFOMV9UWFQpCisJcGVybCAuL2NtZC1saXN0LnBlcmwKKwlkYXRlID4kQAorCitnaXQuNyBnaXQuaHRtbDogZ2l0LnR4dCBjb3JlLWludHJvLnR4dAorCitjbGVhbjoKKwlybSAtZiAqLnhtbCAqLnhtbCsgKi5odG1sICouaHRtbCsgKi4xICouNSAqLjcgaG93dG8taW5kZXgudHh0IGhvd3RvLyouaHRtbCBkb2MuZGVwCisJcm0gLWYgJChjbWRzX3R4dCkgKi5tYWRlCisKKyUuaHRtbCA6ICUudHh0CisJcm0gLWYgJEArICRACisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAtZCBtYW5wYWdlIC1mIGFzY2lpZG9jLmNvbmYgXAorCQkkKEFTQ0lJRE9DX0VYVFJBKSAtYWdpdF92ZXJzaW9uPSQoR0lUX1ZFUlNJT04pIC1vICRAKyAkPAorCW12ICRAKyAkQAorCislLjEgJS41ICUuNyA6ICUueG1sCisJeG1sdG8gLW0gY2FsbG91dHMueHNsIG1hbiAkPAorCislLnhtbCA6ICUudHh0CisJcm0gLWYgJEArICRACisJJChBU0NJSURPQykgLWIgZG9jYm9vayAtZCBtYW5wYWdlIC1mIGFzY2lpZG9jLmNvbmYgXAorCQkkKEFTQ0lJRE9DX0VYVFJBKSAtYWdpdF92ZXJzaW9uPSQoR0lUX1ZFUlNJT04pIC1vICRAKyAkPAorCW12ICRAKyAkQAorCit1c2VyLW1hbnVhbC54bWw6IHVzZXItbWFudWFsLnR4dCB1c2VyLW1hbnVhbC5jb25mCisJJChBU0NJSURPQykgLWIgZG9jYm9vayAtZCBib29rICQ8CisKK1hTTFQgPSBodHRwOi8vZG9jYm9vay5zb3VyY2Vmb3JnZS5uZXQvcmVsZWFzZS94c2wvY3VycmVudC9odG1sL2RvY2Jvb2sueHNsCitYU0xUT1BUUyA9IC0teGluY2x1ZGUgLS1zdHJpbmdwYXJhbSBodG1sLnN0eWxlc2hlZXQgZG9jYm9vay14c2wuY3NzCisKK3VzZXItbWFudWFsLmh0bWw6IHVzZXItbWFudWFsLnhtbAorCXhzbHRwcm9jICQoWFNMVE9QVFMpIC1vICRAICQoWFNMVCkgJDwKKworaG93dG8taW5kZXgudHh0OiBob3d0by1pbmRleC5zaCAkKHdpbGRjYXJkIGhvd3RvLyoudHh0KQorCXJtIC1mICRAKyAkQAorCXNoIC4vaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkgPiRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpKSA6ICUuaHRtbCA6ICUudHh0CisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAkKi50eHQKKworV0VCRE9DX0RFU1QgPSAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcworCiskKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKHdpbGRjYXJkIGhvd3RvLyoudHh0KSk6ICUuaHRtbCA6ICUudHh0CisJcm0gLWYgJEArICRACisJc2VkIC1lICcxLC9eJCQvZCcgJDwgfCAkKEFTQ0lJRE9DKSAtYiB4aHRtbDExIC0gPiRAKworCW12ICRAKyAkQAorCitpbnN0YWxsLXdlYmRvYyA6IGh0bWwKKwlzaCAuL2luc3RhbGwtd2ViZG9jLnNoICQoV0VCRE9DX0RFU1QpCisKK3F1aWNrLWluc3RhbGw6CisJc2ggLi9pbnN0YWxsLWRvYy1xdWljay5zaCAkKERPQ19SRUYpICQobWFuZGlyKQorCisuUEhPTlk6IC5GT1JDRS1HSVQtVkVSU0lPTi1GSUxFCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC4xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWEzZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC4xLnR4dApAQCAtMCwwICsxLDQyIEBACitHSVQgdjEuNS4wLjEgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wCistLS0tLS0tLS0tLS0tLS0tLS0KKworKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMKKworICAtIENsYXJpZmljYXRpb25zIGFuZCBjb3JyZWN0aW9ucyB0byAxLjUuMCByZWxlYXNlIG5vdGVzLgorCisgIC0gVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBkaWQgbm90IGxpbmsgdG8gZ2l0LXJlbW90ZSBkb2N1bWVudGF0aW9uLgorCisgIC0gQ2xhcmlmaWVkIGludHJvZHVjdG9yeSB0ZXh0IG9mIGdpdC1yZWJhc2UgZG9jdW1lbnRhdGlvbi4KKworICAtIENvbnZlcnRlZCByZW1haW5pbmcgbWVudGlvbnMgb2YgdXBkYXRlLWluZGV4IG9uIFBvcmNlbGFpbgorICAgIGRvY3VtZW50cyB0byBnaXQtYWRkL2dpdC1ybS4KKworICAtIFNvbWUgaTE4bi4qIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHdlcmUgaW5jb3JyZWN0bHkKKyAgICBkZXNjcmliZWQgYXMgY29yZS4qOyBmaXhlZC4KKworKiBCdWdmaXhlcworCisgIC0gZ2l0LWFkZCBhbmQgZ2l0LXVwZGF0ZS1pbmRleCBvbiBhIGZpbGVzeXN0ZW0gb24gd2hpY2gKKyAgICBleGVjdXRhYmxlIGJpdHMgYXJlIHVucmVsaWFibGUgaW5jb3JyZWN0bHkgcmV1c2VkIHN0X21vZGUKKyAgICBiaXRzIGV2ZW4gd2hlbiB0aGUgcGF0aCBjaGFuZ2VkIGJldHdlZW4gc3ltbGluayBhbmQgcmVndWxhcgorICAgIGZpbGUuCisKKyAgLSBnaXQtZGFlbW9uIG1hcmtzIHRoZSBsaXN0ZW5pbmcgc29ja2V0cyB3aXRoIEZEX0NMT0VYRUMgc28KKyAgICB0aGF0IGl0IHdvbid0IGJlIGxlYWtlZCBpbnRvIHRoZSBjaGlsZHJlbi4KKworICAtIHNlZ2ZhdWx0IGZyb20gZ2l0LWJsYW1lIHdoZW4gdGhlIG1hbmRhdG9yeSBwYXRobmFtZQorICAgIHBhcmFtZXRlciB3YXMgbWlzc2luZyB3YXMgZml4ZWQ7IHVzYWdlKCkgbWVzc2FnZSBpcyBnaXZlbgorICAgIGluc3RlYWQuCisKKyAgLSBnaXQtcmV2LWxpc3QgZGlkIG5vdCByZWFkICRHSVRfRElSL2NvbmZpZyBmaWxlLCB3aGljaCBtZWFucworICAgIHRoYXQgZGlkIG5vdCBob25vciBpMThuLmxvZ291dHB1dGVuY29kaW5nIGNvcnJlY3RseS4KKworKiBUd2Vha3MKKworICAtIHNsaWRpbmcgbW1hcCgpIGluZWZmaWNpZW50bHkgbW1hcGVkIHRoZSBzYW1lIHJlZ2lvbiBvZiBhCisgICAgcGFja2ZpbGUgd2l0aCBhbiBhY2Nlc3MgcGF0dGVybiB0aGF0IHVzZWQgb2JqZWN0cyBpbiB0aGUKKyAgICByZXZlcnNlIG9yZGVyLiAgVGhpcyBoYXMgYmVlbiBtYWRlIG1vcmUgZWZmaWNpZW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC4yLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2MWU1MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMi50eHQKQEAgLTAsMCArMSw2NSBAQAorR0lUIHYxLjUuMC4yIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMC4xCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEJ1Z2ZpeGVzCisKKyAgLSBBdXRvbWF0ZWQgbWVyZ2UgY29uZmxpY3QgaGFuZGxpbmcgd2hlbiBjaGFuZ2VzIHRvIHN5bWJvbGljCisgICAgbGlua3MgY29uZmxpY3RlZCB3ZXJlIGNvbXBsZXRlbHkgYnJva2VuLiAgVGhlIG1lcmdlLXJlc29sdmUKKyAgICBzdHJhdGVneSBjcmVhdGVkIGEgcmVndWxhciBmaWxlIHdpdGggY29uZmxpY3QgbWFya2VycyBpbiBpdAorICAgIGluIHBsYWNlIG9mIHRoZSBzeW1ib2xpYyBsaW5rLiAgVGhlIGRlZmF1bHQgc3RyYXRlZ3ksCisgICAgbWVyZ2UtcmVjdXJzaXZlIHdhcyBldmVuIG1vcmUgYnJva2VuLiAgSXQgcmVtb3ZlZCB0aGUgcGF0aAorICAgIHRoYXQgd2FzIHBvaW50ZWQgYXQgYnkgdGhlIHN5bWJvbGljIGxpbmsuICBCb3RoIG9mIHRoZXNlCisgICAgcHJvYmxlbXMgaGF2ZSBiZWVuIGZpeGVkLgorCisgIC0gJ2dpdCBkaWZmIG1haW50IG1hc3RlciBuZXh0JyBkaWQgbm90IGNvcnJlY3RseSBnaXZlIGNvbWJpbmVkCisgICAgZGlmZiBhY3Jvc3MgdGhyZWUgdHJlZXMuCisKKyAgLSAnZ2l0IGZhc3QtaW1wb3J0JyBwb3J0YWJpbGl0eSBmaXggZm9yIFNvbGFyaXMuCisKKyAgLSAnZ2l0IHNob3ctcmVmIC0tdmVyaWZ5JyB3aXRob3V0IGFyZ3VtZW50cyBkaWQgbm90IGVycm9yIG91dAorICAgIGJ1dCBzZWdmYXVsdGVkLgorCisgIC0gJ2dpdCBkaWZmIDp0cmFja2VkLWZpbGUgYHB3ZGAvYW4tdW50cmFja2VkLWZpbGUnIGdhdmUgYW4gZXh0cmEKKyAgICBzbGFzaGVzIGFmdGVyIGEvIGFuZCBiLy4KKworICAtICdnaXQgZm9ybWF0LXBhdGNoJyBwcm9kdWNlZCB0b28gbG9uZyBmaWxlbmFtZXMgaWYgdGhlIGNvbW1pdAorICAgIG1lc3NhZ2UgaGFkIHRvbyBsb25nIGxpbmUgYXQgdGhlIGJlZ2lubmluZy4KKworICAtIFJ1bm5pbmcgJ21ha2UgYWxsJyBhbmQgdGhlbiB3aXRob3V0IGNoYW5naW5nIGFueXRoaW5nCisgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJyBzdGlsbCByZWJ1aWx0IHNvbWUgZmlsZXMuICBUaGlzCisgICAgd2FzIGluY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIGFzIHlvdXJzZWxmIGFuZCB0aGVuCisgICAgaW5zdGFsbGluZyBhcyByb290IChlc3BlY2lhbGx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZQorICAgIGRpcmVjdG9yeSBpcyBvbiBORlMgYW5kIHJvb3QgaXMgbWFwcGVkIHRvIG5vYm9keSkuCisKKyAgLSAnZ2l0LXJlcmVyZScgZmFpbGVkIHRvIGRlYWwgd2l0aCB0d28gdW5jb25mbGljdGVkIHBhdGhzIHRoYXQKKyAgICBzb3J0ZWQgbmV4dCB0byBlYWNoIG90aGVyLgorCisgIC0gJ2dpdC1yZXJlcmUnIGF0dGVtcHRlZCB0byBvcGVuKDIpIGEgc3ltbGluayBhbmQgZmFpbGVkIGlmCisgICAgdGhlcmUgd2FzIGEgY29uZmxpY3QuICBTaW5jZSBhIGNvbmZsaWN0aW5nIGNoYW5nZSB0byBhCisgICAgc3ltbGluayB3b3VsZCBub3QgYmVuZWZpdCBmcm9tIHJlcmVyZSBhbnl3YXksIHRoZSBjb21tYW5kCisgICAgbm93IGlnbm9yZXMgY29uZmxpY3RpbmcgY2hhbmdlcyB0byBzeW1saW5rcy4KKworICAtICdnaXQtcmVwYWNrJyBkaWQgbm90IGxpa2UgdG8gcGFzcyBtb3JlIHRoYW4gNjQgYXJndW1lbnRzCisgICAgaW50ZXJuYWxseSB0byB1bmRlcmx5aW5nICdyZXYtbGlzdCcgbG9naWMsIHdoaWNoIG1hZGUgaXQKKyAgICBpbXBvc3NpYmxlIHRvIHJlcGFjayBhZnRlciBhY2N1bXVsYXRpbmcgbWFueSAoc21hbGwpIHBhY2tzCisgICAgaW4gdGhlIHJlcG9zaXRvcnkuCisKKyAgLSAnZ2l0LWRpZmYnIHRvIHJldmlldyB0aGUgY29tYmluZWQgZGlmZiBkdXJpbmcgYSBjb25mbGljdGVkCisgICAgbWVyZ2Ugd2VyZSBub3QgcmVhZGluZyB0aGUgd29ya2luZyB0cmVlIHZlcnNpb24gY29ycmVjdGx5CisgICAgd2hlbiBjaGFuZ2VzIHRvIGEgc3ltYm9saWMgbGluayBjb25mbGljdGVkLiAgSXQgc2hvdWxkIGhhdmUKKyAgICByZWFkIHRoZSBkYXRhIHVzaW5nIHJlYWRsaW5rKDIpIGJ1dCByZWFkIGZyb20gdGhlIHJlZ3VsYXIKKyAgICBmaWxlIHRoZSBzeW1ib2xpYyBsaW5rIHBvaW50ZWQgYXQuCisKKyAgLSAnZ2l0LXJlbW90ZScgZGlkIG5vdCBsaWtlIHBlcmlvZCBpbiBhIHJlbW90ZSdzIG5hbWUuCisKKyogRG9jdW1lbnRhdGlvbiB1cGRhdGVzCisKKyAgLSBhZGRlZCBhbmQgY2xhcmlmaWVkIGNvcmUuYmFyZSwgY29yZS5sZWdhY3loZWFkZXJzIGNvbmZpZ3VyYXRpb25zLgorCisgIC0gdXBkYXRlZCAiZ2l0LWNsb25lIC0tZGVwdGgiIGRvY3VtZW50YXRpb24uCisKKworKiBBc3NvcnRlZCBnaXQtZ3VpIGZpeGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC4zLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1MDBmOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMy50eHQKQEAgLTAsMCArMSw1OCBAQAorR0lUIHYxLjUuMC4zIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMC4yCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEJ1Z2ZpeGVzCisKKyAgLSAnZ2l0LmVsJyBob25vcnMgdGhlIGNvbW1pdCBjb2Rpbmcgc3lzdGVtIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCisKKyAgLSAnYmxhbWV2aWV3JyBpbiBjb250cmliLyBjb3JyZWN0bHkgZGlncyBkZWVwZXIgd2hlbiBhIGxpbmUgaXMKKyAgICBjbGlja2VkLgorCisgIC0gJ2h0dHAtcHVzaCcgY29ycmVjdGx5IG1ha2VzIHN1cmUgdGhlIHJlbW90ZSBzaWRlIGhhcyBsZWFkaW5nCisgICAgcGF0aC4gIEVhcmxpZXIgaXQgc3RhcnRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoLCBhbmQKKyAgICBpbmNvcnJlY3RseS4KKworICAtICdnaXQtbWVyZ2UnIGRpZCBub3QgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyB3aGVuIHRoZQorICAgIHdvcmtpbmcgdHJlZSB3YXMgZGlydHkgYW5kIGNhbm5vdCBmYXN0IGZvcndhcmQuICBJdCBkb2VzCisgICAgbm93LgorCisgIC0gJ2N2c2V4cG9ydGNvbW1pdCcgZG9lcyBub3QgbG9zZSB5ZXQtdG8tYmUtdXNlZCBtZXNzYWdlIGZpbGUuCisKKyAgLSBpbnQtdnMtc2l6ZV90IHR5cGVmaXggd2hlbiBydW5uaW5nIGNvbWJpbmVkIGRpZmYgb24gZmlsZXMKKyAgICBvdmVyIDJHQiBsb25nLgorCisgIC0gJ2dpdCBhcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAnIHNob3VsZCBub3QgdG91Y2ggdW5tb2RpZmllZAorICAgIGxpbmVzLgorCisgIC0gJ2dpdC1tYWlsaW5mbycgY2hva2Ugd2hlbiBhIGxvZ2ljYWwgaGVhZGVyIGxpbmUgd2FzIHRvbyBsb25nLgorCisgIC0gJ2dpdCBzaG93IEEuLkInIGRpZCBub3QgZXJyb3Igb3V0LiAgTmVnYXRpdmUgcmVmICgibm90IEEiIGluCisgICAgdGhpcyBleGFtcGxlKSBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciB0aGUgcHVycG9zZSBvZiB0aGUKKyAgICBjb21tYW5kLCBzbyBub3cgaXQgZXJyb3JzIG91dC4KKworICAtICdnaXQgZm10LW1lcmdlLW1zZyAtLWZpbGUnIHdpdGhvdXQgZmlsZSBwYXJhbWV0ZXIgZGlkIG5vdAorICAgIGNvcnJlY3RseSBlcnJvciBvdXQuCisKKyAgLSAnZ2l0IGFyY2hpbXBvcnQnIGJhcmZlZCB1cG9uIGVuY291bnRlcmluZyBhIGNvbW1pdCB3aXRob3V0CisgICAgc3VtbWFyeS4KKworICAtICdnaXQgaW5kZXgtcGFjaycgZGlkIG5vdCBwcm90ZWN0IGl0c2VsZiBmcm9tIGdldHRpbmcgYSBzaG9ydAorICAgIHJlYWQgb3V0IG9mIHByZWFkKDIpLgorCisgIC0gJ2dpdCBodHRwLXB1c2gnIGhhZCBhIGZldyBidWZmZXIgb3ZlcnJ1bnMuCisKKyAgLSBCdWlsZCBkZXBlbmRlbmN5IGZpeGVzIHRvIHJlYnVpbGQgZmV0Y2gubyB3aGVuIG90aGVyIGhlYWRlcnMKKyAgICBjaGFuZ2UuCisKKyogRG9jdW1lbnRhdGlvbiB1cGRhdGVzCisKKyAgLSB1c2VyLW1hbnVhbCB1cGRhdGVzLgorCisgIC0gT3B0aW9ucyB0byAnZ2l0IHJlbW90ZSBhZGQnIHdlcmUgZGVzY3JpYmVkIGluc3VmZmljaWVudGx5LgorCisgIC0gQ29uZmlndXJhdGlvbiBmb3JtYXQuc3VmZml4IHdhcyBub3QgZG9jdW1lbnRlZC4KKworICAtIE90aGVyIGZvcm1hdHRpbmcgYW5kIHNwZWxsaW5nIGZpeGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC40LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyN2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuNC50eHQKQEAgLTAsMCArMSwyNCBAQAorR0lUIHYxLjUuMC40IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMC4zCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEJ1Z2ZpeGVzCisKKyAgLSBnaXQuZWwgZG9lcyBub3QgYWRkIGR1cGxpY2F0ZSBzaWduLW9mZiBsaW5lcy4KKworICAtIGdpdC1jb21taXQgc2hvd3MgdGhlIGZ1bGwgc3RhdCBvZiB0aGUgcmVzdWx0aW5nIGNvbW1pdCwgbm90CisgICAganVzdCBhYm91dCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGVuIHJ1biBmcm9tCisgICAgYSBzdWJkaXJlY3RvcnkuCisKKyAgLSAiZ2l0LWNoZWNrb3V0IC1tICdAezggaG91cnMgYWdvfSciIGhhZCBhIGZ1bm55IGZhaWx1cmUgZnJvbQorICAgIGV2YWw7IGZpeGVkLgorCisgIC0gZ2l0LWd1aSB1cGRhdGVzLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisqIFVzZXIgbWFudWFsIHVwZGF0ZXMKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjUudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC41LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg2MTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC41LnR4dApAQCAtMCwwICsxLDI4IEBACitHSVQgdjEuNS4wLjUgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wLjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1tZXJnZSAoaGVuY2UgZ2l0LXB1bGwpIGRpZCBub3QgcmVmdXNlIGZhc3QtZm9yd2FyZGluZworICAgIHdoZW4gdGhlIHdvcmtpbmcgdHJlZSBoYWQgbG9jYWwgY2hhbmdlcyB0aGF0IHdvdWxkIGhhdmUKKyAgICBjb25mbGljdGVkIHdpdGggaXQuCisKKyAgLSBnaXQuZWwgZG9lcyBub3QgYWRkIGR1cGxpY2F0ZSBzaWduLW9mZiBsaW5lcy4KKworICAtIGdpdC1jb21taXQgc2hvd3MgdGhlIGZ1bGwgc3RhdCBvZiB0aGUgcmVzdWx0aW5nIGNvbW1pdCwgbm90CisgICAganVzdCBhYm91dCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGVuIHJ1biBmcm9tCisgICAgYSBzdWJkaXJlY3RvcnkuCisKKyAgLSAiZ2l0LWNoZWNrb3V0IC1tICdAezggaG91cnMgYWdvfSciIGhhZCBhIGZ1bm55IGZhaWx1cmUgZnJvbQorICAgIGV2YWw7IGZpeGVkLgorCisgIC0gZ2l0LWd1aSB1cGRhdGVzLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisqIFVzZXIgbWFudWFsIHVwZGF0ZXMKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjYudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC42LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU0NDdmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC42LnR4dApAQCAtMCwwICsxLDIyIEBACitHSVQgdjEuNS4wLjYgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGEgaGFuZGZ1bCBzbWFsbCBmaXhlcyB0byBnaXR3ZWIuCisKKyAgLSBidWlsZCBwcm9jZWR1cmUgZm9yIHVzZXItbWFudWFsIGlzIGZpeGVkIG5vdCB0byByZXF1aXJlIGxvY2FsbHkKKyAgICBpbnN0YWxsZWQgc3R5bGVzaGVldHMuCisKKyAgLSAiZ2l0IGNvbW1pdCAkcGF0aHMiIG9uIHBhdGhzIHdob3NlIGVhcmxpZXIgY29udGVudHMgd2VyZQorICAgIGFscmVhZHkgdXBkYXRlZCBpbiB0aGUgaW5kZXggd2VyZSBmYWlsaW5nIG91dC4KKworKiBEb2N1bWVudGF0aW9uCisKKyAgLSB1c2VyLW1hbnVhbCBoYXMgYmV0dGVyIGNyb3NzIHJlZmVyZW5jZXMuCisKKyAgLSBnaXR3ZWIgaW5zdGFsbGF0aW9uL2RlcGxveW1lbnQgcHJvY2VkdXJlIGlzIG5vdyBkb2N1bWVudGVkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjcudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC43LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBhZDMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC43LnR4dApAQCAtMCwwICsxLDE4IEBACitHSVQgdjEuNS4wLjcgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wLjYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC11cGxvYWQtcGFjayBmYWlsZWQgdG8gY2xvc2UgdW51c2VkIHBpcGUgZW5kcywgcmVzdWx0aW5nCisgICAgaW4gbWFueSB6b21iaWVzIHRvIGhhbmcgYXJvdW5kLgorCisgIC0gZ2l0LXJlcmVyZSB3YXMgcmVjb3JkaW5nIHRoZSBjb250ZW50cyBvZiBlYXJsaWVyIGh1bmtzCisgICAgZHVwbGljYXRlZCBpbiBsYXRlciBodW5rcy4gIFRoaXMgcHJldmVudGVkIHJlc29sdmluZyB0aGUgc2FtZQorICAgIGNvbmZsaWN0IHdoZW4gcGVyZm9ybWluZyB0aGUgc2FtZSBtZXJnZSB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworKiBEb2N1bWVudGF0aW9uCisKKyAgLSBhIGZldyBkb2N1bWVudGF0aW9uIGZpeGVzIGZyb20gRGViaWFuIHBhY2thZ2UgbWFpbnRhaW5lci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNGJkYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAudHh0CkBAIC0wLDAgKzEsNDY5IEBACitHSVQgdjEuNS4wIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitPbGQgbmV3cworLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGlzIGZvciBwZW9wbGUgd2hvIGFyZSB1cGdyYWRpbmcgZnJvbSBhbmNpZW50Cit2ZXJzaW9ucyBvZiBnaXQuICBBbHRob3VnaCBhbGwgb2YgdGhlIGNoYW5nZXMgaW4gdGhpcyBzZWN0aW9uCitoYXBwZW5lZCBiZWZvcmUgdGhlIGN1cnJlbnQgdjEuNC40IHJlbGVhc2UsIHRoZXkgYXJlIHN1bW1hcml6ZWQKK2hlcmUgaW4gdGhlIHYxLjUuMCByZWxlYXNlIG5vdGVzIGZvciBwZW9wbGUgd2hvIHNraXBwZWQgZWFybGllcgordmVyc2lvbnMuCisKK0FzIG9mIGdpdCB2MS41LjAgdGhlcmUgYXJlIHNvbWUgb3B0aW9uYWwgZmVhdHVyZXMgdGhhdCBjaGFuZ2VzCit0aGUgcmVwb3NpdG9yeSB0byBhbGxvdyBkYXRhIHRvIGJlIHN0b3JlZCBhbmQgdHJhbnNmZXJyZWQgbW9yZQorZWZmaWNpZW50bHkuICBUaGVzZSBmZWF0dXJlcyBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgYXMgdGhleQord2lsbCBtYWtlIHRoZSByZXBvc2l0b3J5IHVudXNhYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgZ2l0LgorU3BlY2lmaWNhbGx5LCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOgorCisgLSBUaGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgY29yZS5sZWdhY3loZWFkZXJzIHRoYXQKKyAgIGNoYW5nZXMgdGhlIGZvcm1hdCBvZiBsb29zZSBvYmplY3RzIHNvIHRoYXQgdGhleSBhcmUgbW9yZQorICAgZWZmaWNpZW50IHRvIHBhY2sgYW5kIHRvIHNlbmQgb3V0IG9mIHRoZSByZXBvc2l0b3J5IG92ZXIgZ2l0CisgICBuYXRpdmUgcHJvdG9jb2wsIHNpbmNlIHYxLjQuMi4gIEhvd2V2ZXIsIGxvb3NlIG9iamVjdHMKKyAgIHdyaXR0ZW4gaW4gdGhlIG5ldyBmb3JtYXQgY2Fubm90IGJlIHJlYWQgYnkgZ2l0IG9sZGVyIHRoYW4KKyAgIHRoYXQgdmVyc2lvbjsgcGVvcGxlIGZldGNoaW5nIGZyb20geW91ciByZXBvc2l0b3J5IHVzaW5nCisgICBvbGRlciBjbGllbnRzIG92ZXIgZHVtYiB0cmFuc3BvcnRzIChlLmcuIGh0dHApIHVzaW5nIG9sZGVyCisgICB2ZXJzaW9ucyBvZiBnaXQgd2lsbCBhbHNvIGJlIGFmZmVjdGVkLgorCisgICBUbyBsZXQgZ2l0IHVzZSB0aGUgbmV3IGxvb3NlIG9iamVjdCBmb3JtYXQsIHlvdSBoYXZlIHRvCisgICBzZXQgY29yZS5sZWdhY3loZWFkZXJzIHRvIGZhbHNlLgorCisgLSBTaW5jZSB2MS40LjMsIGNvbmZpZ3VyYXRpb24gcmVwYWNrLnVzZWRlbHRhYmFzZW9mZnNldCBhbGxvd3MKKyAgIHBhY2tmaWxlIHRvIGJlIGNyZWF0ZWQgaW4gbW9yZSBzcGFjZSBlZmZpY2llbnQgZm9ybWF0LCB3aGljaAorICAgY2Fubm90IGJlIHJlYWQgYnkgZ2l0IG9sZGVyIHRoYW4gdGhhdCB2ZXJzaW9uLgorCisgICBUbyBsZXQgZ2l0IHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgcGFja2ZpbGVzLCB5b3UgaGF2ZSB0bworICAgc2V0IHJlcGFjay51c2VkZWx0YWJhc2VvZmZzZXQgdG8gdHJ1ZS4KKworVGhlIGFib3ZlIHR3byBuZXcgZmVhdHVyZXMgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHlvdQoraGF2ZSB0byBleHBsaWNpdGx5IGFzayBmb3IgdGhlbSwgYmVjYXVzZSB0aGV5IG1ha2UgcmVwb3NpdG9yaWVzCit1bnJlYWRhYmxlIGJ5IG9sZGVyIHZlcnNpb25zIG9mIGdpdCwgYW5kIGluIHYxLjUuMCB3ZSBzdGlsbCBkbworbm90IGVuYWJsZSB0aGVtIGJ5IGRlZmF1bHQgZm9yIHRoZSBzYW1lIHJlYXNvbi4gIFdlIHdpbGwgY2hhbmdlCit0aGlzIGRlZmF1bHQgcHJvYmFibHkgMSB5ZWFyIGFmdGVyIDEuNC4yJ3MgcmVsZWFzZSwgd2hlbiBpdCBpcworcmVhc29uYWJsZSB0byBleHBlY3QgZXZlcnlib2R5IHRvIGhhdmUgbmV3IGVub3VnaCB2ZXJzaW9uIG9mCitnaXQuCisKKyAtICdnaXQgcGFjay1yZWZzJyBhcHBlYXJlZCBpbiB2MS40LjQ7IHRoaXMgY29tbWFuZCBhbGxvd3MgdGFncworICAgdG8gYmUgYWNjZXNzZWQgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gdGhlIHRyYWRpdGlvbmFsCisgICAnb25lLWZpbGUtcGVyLXRhZycgZm9ybWF0LiAgT2xkZXIgZ2l0LW5hdGl2ZSBjbGllbnRzIGNhbgorICAgc3RpbGwgZmV0Y2ggZnJvbSBhIHJlcG9zaXRvcnkgdGhhdCBwYWNrZWQgYW5kIHBydW5lZCByZWZzCisgICAodGhlIHNlcnZlciBzaWRlIG5lZWRzIHRvIHJ1biB0aGUgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIGdpdCksCisgICBidXQgb2xkZXIgZHVtYiB0cmFuc3BvcnRzIGNhbm5vdC4gIFBhY2tpbmcgb2YgcmVmcyBpcyBkb25lIGJ5CisgICBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbiwgZWl0aGVyIGJ5IHVzZSBvZiAiZ2l0IHBhY2stcmVmcworICAgLS1wcnVuZSIgY29tbWFuZCBvciBieSB1c2Ugb2YgImdpdCBnYyIgY29tbWFuZC4KKworIC0gJ2dpdCAtcCcgdG8gcGFnaW5hdGUgYW55dGhpbmcgLS0gbWFueSBjb21tYW5kcyBkbyBwYWdpbmF0aW9uCisgICBieSBkZWZhdWx0IG9uIGEgdHR5LiAgSW50cm9kdWNlZCBiZXR3ZWVuIHYxLjQuMSBhbmQgdjEuNC4yOworICAgdGhpcyBtYXkgc3VycHJpc2Ugb2xkIHRpbWVycy4KKworIC0gJ2dpdCBhcmNoaXZlJyBzdXBlcnNlZGVkICdnaXQgdGFyLXRyZWUnIGluIHYxLjQuMzsKKworIC0gJ2dpdCBjdnNzZXJ2ZXInIHdhcyBuZXcgaW52ZW50aW9uIGluIHYxLjMuMDsKKworIC0gJ2dpdCByZXBvLWNvbmZpZycsICdnaXQgZ3JlcCcsICdnaXQgcmViYXNlJyBhbmQgJ2dpdGsnIHdlcmUKKyAgIHNlcmlvdXNseSBlbmhhbmNlZCBkdXJpbmcgdjEuNC4wIHRpbWVwZXJpb2QuCisKKyAtICdnaXR3ZWInIGJlY2FtZSBwYXJ0IG9mIGdpdC5naXQgZHVyaW5nIHYxLjQuMCB0aW1lcGVyaW9kIGFuZAorICAgc2VyaW91c2x5IG1vZGlmaWVkIHNpbmNlIHRoZW4uCisKKyAtIHJlZmxvZyBpcyBhbiB2MS40LjAgaW52ZW50aW9uLiAgVGhpcyBhbGxvd3MgeW91IHRvIG5hbWUgYQorICAgcmV2aXNpb24gdGhhdCBhIGJyYW5jaCB1c2VkIHRvIGJlIGF0IChlLmcuICJnaXQgZGlmZgorICAgbWFzdGVyQHt5ZXN0ZXJkYXl9IG1hc3RlciIgYWxsb3dzIHlvdSB0byBzZWUgY2hhbmdlcyBzaW5jZQorICAgeWVzdGVyZGF5J3MgdGlwIG9mIHRoZSBicmFuY2gpLgorCisKK1VwZGF0ZXMgaW4gdjEuNS4wIHNpbmNlIHYxLjQuNCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBJbmRleCBtYW5pcHVsYXRpb24KKworIC0gZ2l0LWFkZCBpcyB0byBhZGQgY29udGVudHMgdG8gdGhlIGluZGV4IChha2EgInN0YWdpbmcgYXJlYSIKKyAgIGZvciB0aGUgbmV4dCBjb21taXQpLCB3aGV0aGVyIHRoZSBmaWxlIHRoZSBjb250ZW50cyBoYXBwZW4gdG8KKyAgIGJlIGlzIGFuIGV4aXN0aW5nIG9uZSBvciBhIG5ld2x5IGNyZWF0ZWQgb25lLgorCisgLSBnaXQtYWRkIHdpdGhvdXQgYW55IGFyZ3VtZW50IGRvZXMgbm90IGFkZCBldmVyeXRoaW5nCisgICBhbnltb3JlLiAgVXNlICdnaXQtYWRkIC4nIGluc3RlYWQuICBBbHNvIHlvdSBjYW4gYWRkCisgICBvdGhlcndpc2UgaWdub3JlZCBmaWxlcyB3aXRoIGFuIC1mIG9wdGlvbi4KKworIC0gZ2l0LWFkZCB0cmllcyB0byBiZSBtb3JlIGZyaWVuZGx5IHRvIHVzZXJzIGJ5IG9mZmVyaW5nIGFuCisgICBpbnRlcmFjdGl2ZSBtb2RlICgiZ2l0LWFkZCAtaSIpLgorCisgLSBnaXQtY29tbWl0IDxwYXRoPiB1c2VkIHRvIHJlZnVzZSB0byBjb21taXQgaWYgPHBhdGg+IHdhcworICAgZGlmZmVyZW50IGJldHdlZW4gSEVBRCBhbmQgdGhlIGluZGV4IChpLmUuIHVwZGF0ZS1pbmRleCB3YXMKKyAgIHVzZWQgb24gaXQgZWFybGllcikuICBUaGlzIGNoZWNrIHdhcyByZW1vdmVkLgorCisgLSBnaXQtcm0gaXMgbXVjaCBzYW5lciBhbmQgc2FmZXIuICBJdCBpcyB1c2VkIHRvIHJlbW92ZSBwYXRocworICAgZnJvbSBib3RoIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUgd29ya2luZyB0cmVlLCBhbmQgbWFrZXMgc3VyZQorICAgeW91IGFyZSBub3QgbG9zaW5nIGFueSBsb2NhbCBtb2RpZmljYXRpb24gYmVmb3JlIGRvaW5nIHNvLgorCisgLSBnaXQtcmVzZXQgPHRyZWU+IDxwYXRocz4uLi4gY2FuIGJlIHVzZWQgdG8gcmV2ZXJ0IGluZGV4CisgICBlbnRyaWVzIGZvciBzZWxlY3RlZCBwYXRocy4KKworIC0gZ2l0LXVwZGF0ZS1pbmRleCBpcyBtdWNoIGxlc3MgdmlzaWJsZS4gIE1hbnkgc3VnZ2VzdGlvbnMgdG8KKyAgIHVzZSB0aGUgY29tbWFuZCBpbiBnaXQgb3V0cHV0IGFuZCBkb2N1bWVudGF0aW9uIGhhdmUgbm93IGJlZW4KKyAgIHJlcGxhY2VkIGJ5IHNpbXBsZXIgY29tbWFuZHMgc3VjaCBhcyAiZ2l0IGFkZCIgb3IgImdpdCBybSIuCisKKworKiBSZXBvc2l0b3J5IGxheW91dCBhbmQgb2JqZWN0cyB0cmFuc2ZlcgorCisgLSBUaGUgZGF0YSBmb3Igb3JpZ2luIHJlcG9zaXRvcnkgaXMgc3RvcmVkIGluIHRoZSBjb25maWd1cmF0aW9uCisgICBmaWxlICRHSVRfRElSL2NvbmZpZywgbm90IGluICRHSVRfRElSL3JlbW90ZXMvLCBmb3IgbmV3bHkKKyAgIGNyZWF0ZWQgY2xvbmVzLiAgVGhlIGxhdHRlciBpcyBzdGlsbCBzdXBwb3J0ZWQgYW5kIHRoZXJlIGlzCisgICBubyBuZWVkIHRvIGNvbnZlcnQgeW91ciBleGlzdGluZyByZXBvc2l0b3J5IGlmIHlvdSBhcmUKKyAgIGFscmVhZHkgY29tZm9ydGFibGUgd2l0aCB5b3VyIHdvcmtmbG93IHdpdGggdGhlIGxheW91dC4KKworIC0gZ2l0LWNsb25lIGFsd2F5cyB1c2VzIHdoYXQgaXMga25vd24gYXMgInNlcGFyYXRlIHJlbW90ZSIKKyAgIGxheW91dCBmb3IgYSBuZXdseSBjcmVhdGVkIHJlcG9zaXRvcnkgd2l0aCBhIHdvcmtpbmcgdHJlZS4KKworICAgQSByZXBvc2l0b3J5IHdpdGggdGhlIHNlcGFyYXRlIHJlbW90ZSBsYXlvdXQgc3RhcnRzIHdpdGggb25seQorICAgb25lIGRlZmF1bHQgYnJhbmNoLCAnbWFzdGVyJywgdG8gYmUgdXNlZCBmb3IgeW91ciBvd24KKyAgIGRldmVsb3BtZW50LiAgVW5saWtlIHRoZSB0cmFkaXRpb25hbCBsYXlvdXQgdGhhdCBjb3BpZWQgYWxsCisgICB0aGUgdXBzdHJlYW0gYnJhbmNoZXMgaW50byB5b3VyIGJyYW5jaCBuYW1lc3BhY2UgKHdoaWxlCisgICByZW5hbWluZyB0aGVpciAnbWFzdGVyJyB0byB5b3VyICdvcmlnaW4nKSwgdGhlIG5ldyBsYXlvdXQKKyAgIHB1dHMgdXBzdHJlYW0gYnJhbmNoZXMgaW50byBsb2NhbCAicmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIgorICAgd2l0aCB0aGVpciBvd24gbmFtZXNwYWNlLiBUaGVzZSBjYW4gYmUgcmVmZXJlbmNlZCB3aXRoIG5hbWVzCisgICBzdWNoIGFzICJvcmlnaW4vJHVwc3RyZWFtX2JyYW5jaF9uYW1lIiBhbmQgYXJlIHN0b3JlZCBpbgorICAgLmdpdC9yZWZzL3JlbW90ZXMgcmF0aGVyIHRoYW4gLmdpdC9yZWZzL2hlYWRzIHdoZXJlIG5vcm1hbAorICAgYnJhbmNoZXMgYXJlIHN0b3JlZC4KKworICAgVGhpcyBsYXlvdXQga2VlcHMgeW91ciBvd24gYnJhbmNoIG5hbWVzcGFjZSBsZXNzIGNsdXR0ZXJlZCwKKyAgIGF2b2lkcyBuYW1lIGNvbGxpc2lvbiB3aXRoIHlvdXIgdXBzdHJlYW0sIG1ha2VzIGl0IHBvc3NpYmxlCisgICB0byBhdXRvbWF0aWNhbGx5IHRyYWNrIG5ldyBicmFuY2hlcyBjcmVhdGVkIGF0IHRoZSByZW1vdGUKKyAgIGFmdGVyIHlvdSBjbG9uZSBmcm9tIGl0LCBhbmQgbWFrZXMgaXQgZWFzaWVyIHRvIGludGVyYWN0IHdpdGgKKyAgIG1vcmUgdGhhbiBvbmUgcmVtb3RlIHJlcG9zaXRvcnkgKHlvdSBjYW4gdXNlICJnaXQgcmVtb3RlIiB0bworICAgYWRkIG90aGVyIHJlcG9zaXRvcmllcyB0byB0cmFjaykuICBUaGVyZSBtaWdodCBiZSBzb21lCisgICBzdXJwcmlzZXM6CisKKyAgICogJ2dpdCBicmFuY2gnIGRvZXMgbm90IHNob3cgdGhlIHJlbW90ZSB0cmFja2luZyBicmFuY2hlcy4KKyAgICAgSXQgb25seSBsaXN0cyB5b3VyIG93biBicmFuY2hlcy4gIFVzZSAnLXInIG9wdGlvbiB0byB2aWV3CisgICAgIHRoZSB0cmFja2luZyBicmFuY2hlcy4KKworICAgKiBJZiB5b3UgYXJlIGZvcmtpbmcgb2ZmIG9mIGEgYnJhbmNoIG9idGFpbmVkIGZyb20gdGhlCisgICAgIHVwc3RyZWFtLCB5b3Ugd291bGQgaGF2ZSBkb25lIHNvbWV0aGluZyBsaWtlICdnaXQgYnJhbmNoCisgICAgIG15LW5leHQgbmV4dCcsIGJlY2F1c2UgdHJhZGl0aW9uYWwgbGF5b3V0IGRyb3BwZWQgdGhlCisgICAgIHRyYWNraW5nIGJyYW5jaCAnbmV4dCcgaW50byB5b3VyIG93biBicmFuY2ggbmFtZXNwYWNlLgorICAgICBXaXRoIHRoZSBzZXBhcmF0ZSByZW1vdGUgbGF5b3V0LCB5b3Ugc2F5ICdnaXQgYnJhbmNoIG5leHQKKyAgICAgb3JpZ2luL25leHQnLCB3aGljaCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgbWF0Y2hpbmcgbmFtZQorICAgICAnbmV4dCcgZm9yIHlvdXIgb3duIGJyYW5jaC4gIEl0IGFsc28gYWxsb3dzIHlvdSB0byB0cmFjayBhCisgICAgIHJlbW90ZSBvdGhlciB0aGFuICdvcmlnaW4nIChpLmUuIHdoZXJlIHlvdSBpbml0aWFsbHkgY2xvbmVkCisgICAgIGZyb20pIGFuZCBmb3JrIG9mZiBvZiBhIGJyYW5jaCBmcm9tIHRoZXJlIHRoZSBzYW1lIHdheQorICAgICAoZS5nLiAiZ2l0IGJyYW5jaCBtaW5ndyBqNnQvbWFzdGVyIikuCisKKyAgIFJlcG9zaXRvcmllcyBpbml0aWFsaXplZCB3aXRoIHRoZSB0cmFkaXRpb25hbCBsYXlvdXQgY29udGludWUKKyAgIHRvIHdvcmsuCisKKyAtIE5ldyBicmFuY2hlcyB0aGF0IGFwcGVhciBvbiB0aGUgb3JpZ2luIHNpZGUgYWZ0ZXIgYSBjbG9uZSBpcworICAgbWFkZSBhcmUgYWxzbyB0cmFja2VkIGF1dG9tYXRpY2FsbHkuICBUaGlzIGlzIGRvbmUgd2l0aCBhbgorICAgd2lsZGNhcmQgcmVmc3BlYyAicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIsIHdoaWNoCisgICBvbGRlciBnaXQgZG9lcyBub3QgdW5kZXJzdGFuZCwgc28gaWYgeW91IGNsb25lIHdpdGggMS41LjAsCisgICB5b3Ugd291bGQgbmVlZCB0byBkb3duZ3JhZGUgcmVtb3RlLiouZmV0Y2ggaW4gdGhlCisgICBjb25maWd1cmF0aW9uIGZpbGUgdG8gc3BlY2lmeSBlYWNoIGJyYW5jaCB5b3UgYXJlIGludGVyZXN0ZWQKKyAgIGluIGluZGl2aWR1YWxseSBpZiB5b3UgcGxhbiB0byBmZXRjaCBpbnRvIHRoZSByZXBvc2l0b3J5IHdpdGgKKyAgIG9sZGVyIHZlcnNpb25zIG9mIGdpdCAoYnV0IHdoeSB3b3VsZCB5b3U/KS4KKworIC0gU2ltaWxhcmx5LCB3aWxkY2FyZCByZWZzcGVjICJyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL21lLyoiCisgICBjYW4gYmUgZ2l2ZW4gdG8gImdpdC1wdXNoIiBjb21tYW5kIHRvIHVwZGF0ZSB0aGUgdHJhY2tpbmcKKyAgIGJyYW5jaGVzIHRoYXQgaXMgdXNlZCB0byB0cmFjayB0aGUgcmVwb3NpdG9yeSB5b3UgYXJlIHB1c2hpbmcKKyAgIGZyb20gb24gdGhlIHJlbW90ZSBzaWRlLgorCisgLSBnaXQtYnJhbmNoIGFuZCBnaXQtc2hvdy1icmFuY2gga25vdyByZW1vdGUgdHJhY2tpbmcgYnJhbmNoZXMKKyAgICh1c2UgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggIi1yIiB0byBsaXN0IG9ubHkgdHJhY2tlZCBicmFuY2hlcykuCisKKyAtIGdpdC1wdXNoIGNhbiBub3cgYmUgdXNlZCB0byBkZWxldGUgYSByZW1vdGUgYnJhbmNoIG9yIGEgdGFnLgorICAgVGhpcyByZXF1aXJlcyB0aGUgdXBkYXRlZCBnaXQgb24gdGhlIHJlbW90ZSBzaWRlICh1c2UgImdpdAorICAgcHVzaCA8cmVtb3RlPiA6cmVmcy9oZWFkcy88YnJhbmNoPiIgdG8gZGVsZXRlICJicmFuY2giKS4KKworIC0gZ2l0LXB1c2ggbW9yZSBhZ2dyZXNzaXZlbHkga2VlcHMgdGhlIHRyYW5zZmVycmVkIG9iamVjdHMKKyAgIHBhY2tlZC4gIEVhcmxpZXIgd2UgcmVjb21tZW5kZWQgdG8gbW9uaXRvciBhbW91bnQgb2YgbG9vc2UKKyAgIG9iamVjdHMgYW5kIHJlcGFjayByZWd1bGFybHksIGJ1dCB5b3Ugc2hvdWxkIHJlcGFjayB3aGVuIHlvdQorICAgYWNjdW11bGF0ZWQgdG9vIG1hbnkgc21hbGwgcGFja3MgdGhpcyB3YXkgYXMgd2VsbC4gIFVwZGF0ZWQKKyAgIGdpdC1jb3VudC1vYmplY3RzIGhlbHBzIHlvdSB3aXRoIHRoaXMuCisKKyAtIGdpdC1mZXRjaCBhbHNvIG1vcmUgYWdncmVzc2l2ZWx5IGtlZXBzIHRoZSB0cmFuc2ZlcnJlZCBvYmplY3RzCisgICBwYWNrZWQuICBUaGlzIGJlaGF2aW9yIG9mIGdpdC1wdXNoIGFuZCBnaXQtZmV0Y2ggY2FuIGJlCisgICB0d2Vha2VkIHdpdGggYSBzaW5nbGUgY29uZmlndXJhdGlvbiB0cmFuc2Zlci51bnBhY2tsaW1pdCAoYnV0CisgICB1c3VhbGx5IHRoZXJlIHNob3VsZCBub3QgYmUgYW55IG5lZWQgZm9yIGEgdXNlciB0byB0d2VhayBpdCkuCisKKyAtIEEgbmV3IGNvbW1hbmQsIGdpdC1yZW1vdGUsIGNhbiBoZWxwIHlvdSBtYW5hZ2UgeW91ciByZW1vdGUKKyAgIHRyYWNraW5nIGJyYW5jaCBkZWZpbml0aW9ucy4KKworIC0gWW91IG1heSBuZWVkIHRvIHNwZWNpZnkgZXhwbGljaXQgcGF0aHMgZm9yIHVwbG9hZC1wYWNrIGFuZC9vcgorICAgcmVjZWl2ZS1wYWNrIGR1ZSB0byB5b3VyIHNzaCBkYWVtb24gY29uZmlndXJhdGlvbiBvbiB0aGUKKyAgIG90aGVyIGVuZC4gIFRoaXMgY2FuIG5vdyBiZSBkb25lIHZpYSByZW1vdGUuKi51cGxvYWRwYWNrIGFuZAorICAgcmVtb3RlLioucmVjZWl2ZXBhY2sgY29uZmlndXJhdGlvbi4KKworCisqIEJhcmUgcmVwb3NpdG9yaWVzCisKKyAtIENlcnRhaW4gY29tbWFuZHMgY2hhbmdlIHRoZWlyIGJlaGF2aW9yIGluIGEgYmFyZSByZXBvc2l0b3J5CisgICAoaS5lLiBhIHJlcG9zaXRvcnkgd2l0aG91dCBhc3NvY2lhdGVkIHdvcmtpbmcgdHJlZSkuICBXZSB1c2UKKyAgIGEgZmFpcmx5IGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgKGlmICRHSVRfRElSIGlzICIuZ2l0Iiwgb3IKKyAgIGVuZHMgd2l0aCAiLy5naXQiLCB0aGUgcmVwb3NpdG9yeSBpcyBub3QgYmFyZSkgdG8gZGVjaWRlIGlmIGEKKyAgIHJlcG9zaXRvcnkgaXMgYmFyZSwgYnV0ICJjb3JlLmJhcmUiIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUKKyAgIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBoZXVyaXN0aWMgd2hlbiBpdCBtaXNpZGVudGlmaWVzCisgICB5b3VyIHJlcG9zaXRvcnkuCisKKyAtIGdpdC1mZXRjaCB1c2VkIHRvIGNvbXBsYWluIHVwZGF0aW5nIHRoZSBjdXJyZW50IGJyYW5jaCBidXQKKyAgIHRoaXMgaXMgbm93IGFsbG93ZWQgZm9yIGEgYmFyZSByZXBvc2l0b3J5LiAgU28gaXMgdGhlIHVzZSBvZgorICAgJ2dpdC1icmFuY2ggLWYnIHRvIHVwZGF0ZSB0aGUgY3VycmVudCBicmFuY2guCisKKyAtIFBvcmNlbGFpbi1pc2ggY29tbWFuZHMgdGhhdCByZXF1aXJlIGEgd29ya2luZyB0cmVlIHJlZnVzZXMgdG8KKyAgIHdvcmsgaW4gYSBiYXJlIHJlcG9zaXRvcnkuCisKKworKiBSZWZsb2cKKworIC0gUmVmbG9nIHJlY29yZHMgdGhlIGhpc3RvcnkgZnJvbSB0aGUgdmlldyBwb2ludCBvZiB0aGUgbG9jYWwKKyAgIHJlcG9zaXRvcnkuIEluIG90aGVyIHdvcmRzLCByZWdhcmRsZXNzIG9mIHRoZSByZWFsIGhpc3RvcnksCisgICB0aGUgcmVmbG9nIHNob3dzIHRoZSBoaXN0b3J5IGFzIHNlZW4gYnkgb25lIHBhcnRpY3VsYXIKKyAgIHJlcG9zaXRvcnkgKHRoaXMgZW5hYmxlcyB5b3UgdG8gYXNrICJ3aGF0IHdhcyB0aGUgY3VycmVudAorICAgcmV2aXNpb24gaW4gX3RoaXNfIHJlcG9zaXRvcnksIHllc3RlcmRheSBhdCAxcG0/IikuICBUaGlzCisgICBmYWNpbGl0eSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIHJlcG9zaXRvcmllcyB3aXRoIHdvcmtpbmcKKyAgIHRyZWVzLCBhbmQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlICJicmFuY2hAe3RpbWV9IiBhbmQKKyAgICJicmFuY2hAe050aH0iIG5vdGF0aW9uLgorCisgLSAiZ2l0IHNob3ctYnJhbmNoIiBsZWFybmVkIHNob3dpbmcgdGhlIHJlZmxvZyBkYXRhIHdpdGggdGhlCisgICBuZXcgLWcgb3B0aW9uLiAgImdpdCBsb2ciIGhhcyAtZyBvcHRpb24gdG8gdmlldyByZWZsb2cKKyAgIGVudHJpZXMgaW4gYSBtb3JlIHZlcmJvc2UgbWFubmVyLgorCisgLSBnaXQtYnJhbmNoIGtub3dzIGhvdyB0byByZW5hbWUgYnJhbmNoZXMgYW5kIG1vdmVzIGV4aXN0aW5nCisgICByZWZsb2cgZGF0YSBmcm9tIHRoZSBvbGQgYnJhbmNoIHRvIHRoZSBuZXcgb25lLgorCisgLSBJbiBhZGRpdGlvbiB0byB0aGUgcmVmbG9nIHN1cHBvcnQgaW4gdjEuNC40IHNlcmllcywgSEVBRAorICAgcmVmZXJlbmNlIG1haW50YWlucyBpdHMgb3duIGxvZy4gICJIRUFEQHs1Lm1pbnV0ZXMuYWdvfSIKKyAgIG1lYW5zIHRoZSBjb21taXQgeW91IHdlcmUgYXQgNSBtaW51dGVzIGFnbywgd2hpY2ggdGFrZXMKKyAgIGJyYW5jaCBzd2l0Y2hpbmcgaW50byBhY2NvdW50LiAgSWYgeW91IHdhbnQgdG8ga25vdyB3aGVyZSB0aGUKKyAgIHRpcCBvZiB5b3VyIGN1cnJlbnQgYnJhbmNoIHdhcyBhdCA1IG1pbnV0ZXMgYWdvLCB5b3UgbmVlZCB0bworICAgZXhwbGljaXRseSBzYXkgaXRzIG5hbWUgKGUuZy4gIm1hc3RlckB7NS5taW51dGVzLmFnb30iKSBvcgorICAgb21pdCB0aGUgcmVmbmFtZSBhbHRvZ2V0aGVyIGkuZS4gIkB7NS5taW51dGVzLmFnb30iLgorCisgLSBUaGUgY29tbWl0cyByZWZlcnJlZCB0byBieSByZWZsb2cgZW50cmllcyBhcmUgbm93IHByb3RlY3RlZAorICAgYWdhaW5zdCBwcnVuaW5nLiAgVGhlIG5ldyBjb21tYW5kICJnaXQgcmVmbG9nIGV4cGlyZSIgY2FuIGJlCisgICB1c2VkIHRvIHRydW5jYXRlIG9sZGVyIHJlZmxvZyBlbnRyaWVzIGFuZCBlbnRyaWVzIHRoYXQgcmVmZXIKKyAgIHRvIGNvbW1pdHMgdGhhdCBoYXZlIGJlZW4gcHJ1bmVkIGF3YXkgcHJldmlvdXNseSB3aXRoIG9sZGVyCisgICB2ZXJzaW9ucyBvZiBnaXQuCisKKyAgIEV4aXN0aW5nIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgYmVlbiB1c2luZyByZWZsb2cgbWF5IGdldAorICAgY29tcGxhaW50cyBmcm9tIGZzY2stb2JqZWN0cyBhbmQgbWF5IG5vdCBiZSBhYmxlIHRvIHJ1bgorICAgZ2l0LXJlcGFjaywgaWYgeW91IGhhZCBydW4gZ2l0LXBydW5lIGZyb20gb2xkZXIgZ2l0OyBwbGVhc2UKKyAgIHJ1biAiZ2l0IHJlZmxvZyBleHBpcmUgLS1zdGFsZS1maXggLS1hbGwiIGZpcnN0IHRvIHJlbW92ZQorICAgcmVmbG9nIGVudHJpZXMgdGhhdCByZWZlciB0byBjb21taXRzIHRoYXQgYXJlIG5vIGxvbmdlciBpbgorICAgdGhlIHJlcG9zaXRvcnkgd2hlbiB0aGF0IGhhcHBlbnMuCisKKworKiBDcnVmdHMgcmVtb3ZhbAorCisgLSBXZSB1c2VkIHRvIHNheSAib2xkIGNvbW1pdHMgYXJlIHJldHJpZXZhYmxlIHVzaW5nIHJlZmxvZyBhbmQKKyAgICdtYXN0ZXJAe3llc3RlcmRheX0nIHN5bnRheCBhcyBsb25nIGFzIHlvdSBoYXZlbid0IHJ1bgorICAgZ2l0LXBydW5lIi4gIFdlIG5vIGxvbmdlciBoYXZlIHRvIHNheSB0aGUgbGF0dGVyIGhhbGYgb2YgdGhlCisgICBhYm92ZSBzZW50ZW5jZSwgYXMgZ2l0LXBydW5lIGRvZXMgbm90IHJlbW92ZSB0aGluZ3MgcmVhY2hhYmxlCisgICBmcm9tIHJlZmxvZyBlbnRyaWVzLgorCisgLSBUaGVyZSBpcyBhIHRvcGxldmVsIGdhcmJhZ2UgY29sbGVjdG9yIHNjcmlwdCwgJ2dpdC1nYycsIHRoYXQKKyAgIHJ1bnMgcGVyaW9kaWMgY2xlYW51cCBmdW5jdGlvbnMsIGluY2x1ZGluZyAnZ2l0LXJlcGFjayAtYSAtZCcsCisgICAnZ2l0LXJlZmxvZyBleHBpcmUnLCAnZ2l0LXBhY2stcmVmcyAtLXBydW5lJywgYW5kICdnaXQtcmVyZXJlCisgICBnYycuCisKKyAtIFRoZSBvdXRwdXQgZnJvbSBmc2NrICgiZnNjay1vYmplY3RzIiBpcyBjYWxsZWQganVzdCAiZnNjayIKKyAgIG5vdywgYnV0IHRoZSBvbGQgbmFtZSBjb250aW51ZXMgdG8gd29yaykgd2FzIG5lZWRsZXNzbHkKKyAgIGFsYXJtaW5nIGluIHRoYXQgaXQgd2FybmVkIG1pc3Npbmcgb2JqZWN0cyB0aGF0IGFyZSByZWFjaGFibGUKKyAgIG9ubHkgZnJvbSBkYW5nbGluZyBvYmplY3RzLiAgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZQorICAgb3V0cHV0IGlzIG11Y2ggbW9yZSB1c2VmdWwuCisKKworKiBEZXRhY2hlZCBIRUFECisKKyAtIFlvdSBjYW4gdXNlICdnaXQtY2hlY2tvdXQnIHRvIGNoZWNrIG91dCBhbiBhcmJpdHJhcnkgcmV2aXNpb24KKyAgIG9yIGEgdGFnIGFzIHdlbGwsIGluc3RlYWQgb2YgbmFtZWQgYnJhbmNoZXMuICBUaGlzIHdpbGwKKyAgIGRpc3NvY2lhdGUgeW91ciBIRUFEIGZyb20gdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbi4KKworICAgQSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gImxvb2sgYXJvdW5kIi4gIEUuZy4KKworCSQgZ2l0IGNoZWNrb3V0IHYyLjYuMTYKKwkuLi4gY29tcGlsZSwgdGVzdCwgZXRjLgorCSQgZ2l0IGNoZWNrb3V0IHYyLjYuMTcKKwkuLi4gY29tcGlsZSwgdGVzdCwgZXRjLgorCisgLSBBZnRlciBkZXRhY2hpbmcgeW91ciBIRUFELCB5b3UgY2FuIGdvIGJhY2sgdG8gYW4gZXhpc3RpbmcKKyAgIGJyYW5jaCB3aXRoIHVzdWFsICJnaXQgY2hlY2tvdXQgJGJyYW5jaCIuICBBbHNvIHlvdSBjYW4KKyAgIHN0YXJ0IGEgbmV3IGJyYW5jaCB1c2luZyAiZ2l0IGNoZWNrb3V0IC1iICRuZXdicmFuY2giIHRvCisgICBzdGFydCBhIG5ldyBicmFuY2ggYXQgdGhhdCBjb21taXQuCisKKyAtIFlvdSBjYW4gZXZlbiBwdWxsIGZyb20gb3RoZXIgcmVwb3NpdG9yaWVzLCBtYWtlIG1lcmdlcyBhbmQKKyAgIGNvbW1pdHMgd2hpbGUgeW91ciBIRUFEIGlzIGRldGFjaGVkLiAgQWxzbyB5b3UgY2FuIHVzZSAiZ2l0CisgICByZXNldCIgdG8ganVtcCB0byBhcmJpdHJhcnkgY29tbWl0LCB3aGlsZSBzdGlsbCBrZWVwaW5nIHlvdXIKKyAgIEhFQUQgZGV0YWNoZWQuCisKKyAgIFJlbWVtYmVyIHRoYXQgYSBkZXRhY2hlZCBzdGF0ZSBpcyB2b2xhdGlsZSwgaS5lLiBpdCB3aWxsIGJlIGZvcmdvdHRlbgorICAgYXMgc29vbiBhcyB5b3UgbW92ZSBhd2F5IGZyb20gaXQgd2l0aCB0aGUgY2hlY2tvdXQgb3IgcmVzZXQgY29tbWFuZCwKKyAgIHVubGVzcyBhIGJyYW5jaCBpcyBjcmVhdGVkIGZyb20gaXQgYXMgbWVudGlvbmVkIGFib3ZlLiAgSXQgaXMgYWxzbworICAgcG9zc2libGUgdG8gcmVzY3VlIGEgbG9zdCBkZXRhY2hlZCBzdGF0ZSBmcm9tIHRoZSBIRUFEIHJlZmxvZy4KKworCisqIFBhY2tlZCByZWZzCisKKyAtIFJlcG9zaXRvcmllcyB3aXRoIGh1bmRyZWRzIG9mIHRhZ3MgaGF2ZSBiZWVuIHBheWluZyBsYXJnZQorICAgb3ZlcmhlYWQsIGJvdGggaW4gc3RvcmFnZSBhbmQgaW4gcnVudGltZSwgZHVlIHRvIHRoZQorICAgdHJhZGl0aW9uYWwgb25lLXJlZi1wZXItZmlsZSBmb3JtYXQuICBBIG5ldyBjb21tYW5kLAorICAgZ2l0LXBhY2stcmVmcywgY2FuIGJlIHVzZWQgdG8gInBhY2siIHRoZW0gaW4gbW9yZSBlZmZpY2llbnQKKyAgIHJlcHJlc2VudGF0aW9uICh5b3UgY2FuIGxldCBnaXQtZ2MgZG8gdGhpcyBmb3IgeW91KS4KKworIC0gQ2xvbmVzIGFuZCBmZXRjaGVzIG92ZXIgZHVtYiB0cmFuc3BvcnRzIGFyZSBub3cgYXdhcmUgb2YKKyAgIHBhY2tlZCByZWZzIGFuZCBjYW4gZG93bmxvYWQgZnJvbSByZXBvc2l0b3JpZXMgdGhhdCB1c2UKKyAgIHRoZW0uCisKKworKiBDb25maWd1cmF0aW9uCisKKyAtIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBjb2xvciBzZXR0aW5nIGFyZSBjb25zb2xpZGF0ZWQgdW5kZXIKKyAgIGNvbG9yLiogbmFtZXNwYWNlIChvbGRlciBkaWZmLmNvbG9yLiosIHN0YXR1cy5jb2xvci4qIGFyZQorICAgc3RpbGwgc3VwcG9ydGVkKS4KKworIC0gJ2dpdC1yZXBvLWNvbmZpZycgY29tbWFuZCBpcyBhY2Nlc3NpYmxlIGFzICdnaXQtY29uZmlnJyBub3cuCisKKworKiBVcGRhdGVkIGZlYXR1cmVzCisKKyAtIGdpdC1kZXNjcmliZSB1c2VzIGJldHRlciBjcml0ZXJpYSB0byBwaWNrIGEgYmFzZSByZWYuICBJdAorICAgdXNlZCB0byBwaWNrIHRoZSBvbmUgd2l0aCB0aGUgbmV3ZXN0IHRpbWVzdGFtcCwgYnV0IG5vdyBpdAorICAgcGlja3MgdGhlIG9uZSB0aGF0IGlzIHRvcG9sb2dpY2FsbHkgdGhlIGNsb3Nlc3QgKHRoYXQgaXMsCisgICBhbW9uZyBhbmNlc3RvcnMgb2YgY29tbWl0IEMsIHRoZSByZWYgVCB0aGF0IGhhcyB0aGUgc2hvcnRlc3QKKyAgIG91dHB1dCBmcm9tICJnaXQtcmV2LWxpc3QgVC4uQyIgaXMgY2hvc2VuKS4KKworIC0gZ2l0LWRlc2NyaWJlIGdpdmVzIHRoZSBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0aGUgYmFzZSByZWYKKyAgIGJldHdlZW4gdGhlIHJlZm5hbWUgYW5kIHRoZSBoYXNoIHN1ZmZpeC4gIEUuZy4gdGhlIGNvbW1pdCBvbmUKKyAgIGJlZm9yZSB2Mi42LjIwLXJjNiBpbiB0aGUga2VybmVsIHJlcG9zaXRvcnkgaXM6CisKKwl2Mi42LjIwLXJjNS0zMDYtZ2EyMWIwNjkKKworICAgd2hpY2ggdGVsbHMgeW91IHRoYXQgaXRzIG9iamVjdCBuYW1lIGJlZ2lucyB3aXRoIGEyMWIwNjksCisgICB2Mi42LjIwLXJjNSBpcyBhbiBhbmNlc3RvciBvZiBpdCAobWVhbmluZywgdGhlIGNvbW1pdAorICAgY29udGFpbnMgZXZlcnl0aGluZyAtcmM1IGhhcyksIGFuZCB0aGVyZSBhcmUgMzA2IGNvbW1pdHMKKyAgIHNpbmNlIHYyLjYuMjAtcmM1LgorCisgLSBnaXQtZGVzY3JpYmUgd2l0aCAtLWFiYnJldj0wIGNhbiBiZSB1c2VkIHRvIHNob3cgb25seSB0aGUKKyAgIG5hbWUgb2YgdGhlIGJhc2UgcmVmLgorCisgLSBnaXQtYmxhbWUgbGVhcm5lZCBhIG5ldyBvcHRpb24sIC0taW5jcmVtZW50YWwsIHRoYXQgdGVsbHMgaXQKKyAgIHRvIG91dHB1dCB0aGUgYmxhbWVzIGFzIHRoZXkgYXJlIGFzc2lnbmVkLiAgQSBzYW1wbGUgc2NyaXB0CisgICB0byB1c2UgaXQgaXMgYWxzbyBpbmNsdWRlZCBhcyBjb250cmliL2JsYW1ldmlldy4KKworIC0gZ2l0LWJsYW1lIHN0YXJ0cyBhbm5vdGF0aW5nIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBieSBkZWZhdWx0LgorCisKKyogTGVzcyBleHRlcm5hbCBkZXBlbmRlbmN5CisKKyAtIFdlIG5vIGxvbmdlciByZXF1aXJlIHRoZSAibWVyZ2UiIHByb2dyYW0gZnJvbSB0aGUgUkNTIHN1aXRlLgorICAgQWxsIDMtd2F5IGZpbGUtbGV2ZWwgbWVyZ2VzIGFyZSBub3cgZG9uZSBpbnRlcm5hbGx5LgorCisgLSBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gb2YgZ2l0LW1lcmdlLXJlY3Vyc2l2ZSB3aGljaCB3YXMKKyAgIGluIFB5dGhvbiBoYXMgYmVlbiByZW1vdmVkOyB3ZSBoYXZlIGEgQyBpbXBsZW1lbnRhdGlvbiBvZiBpdAorICAgbm93LgorCisgLSBnaXQtc2hvcnRsb2cgaXMgbm8gbG9uZ2VyIGEgUGVybCBzY3JpcHQuICBJdCBubyBsb25nZXIKKyAgIHJlcXVpcmVzIG91dHB1dCBwaXBlZCBmcm9tIGdpdC1sb2c7IGl0IGNhbiBhY2NlcHQgcmV2aXNpb24KKyAgIHBhcmFtZXRlcnMgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZS4KKworCisqIEkxOG4KKworIC0gV2UgaGF2ZSBhbHdheXMgZW5jb3VyYWdlZCB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gYmUgZW5jb2RlZCBpbgorICAgVVRGLTgsIGJ1dCB0aGUgdXNlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIGxlZ2FjeSBlbmNvZGluZyBhcworICAgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIHByb2plY3RzLiAgVGhpcyB3aWxsIGNvbnRpbnVlIHRvIGJlIHRoZQorICAgY2FzZS4gIEhvd2V2ZXIsIGEgbm9uIFVURi04IGNvbW1pdCBlbmNvZGluZyBfbXVzdF8gYmUKKyAgIGV4cGxpY2l0bHkgc2V0IHdpdGggaTE4bi5jb21taXRlbmNvZGluZyBpbiB0aGUgcmVwb3NpdG9yeQorICAgd2hlcmUgYSBjb21taXQgaXMgbWFkZTsgb3RoZXJ3aXNlIGdpdC1jb21taXQtdHJlZSB3aWxsCisgICBjb21wbGFpbiBpZiB0aGUgbG9nIG1lc3NhZ2UgZG9lcyBub3QgbG9vayBsaWtlIGEgdmFsaWQgVVRGLTgKKyAgIHN0cmluZy4KKworIC0gVGhlIHZhbHVlIG9mIGkxOG4uY29tbWl0ZW5jb2RpbmcgaW4gdGhlIG9yaWdpbmF0aW5nCisgICByZXBvc2l0b3J5IGlzIHJlY29yZGVkIGluIHRoZSBjb21taXQgb2JqZWN0IG9uIHRoZSAiZW5jb2RpbmciCisgICBoZWFkZXIsIGlmIGl0IGlzIG5vdCBVVEYtOC4gIGdpdC1sb2cgYW5kIGZyaWVuZHMgbm90aWNlIHRoaXMsCisgICBhbmQgcmVlbmNvZGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBsb2cgb3V0cHV0IGVuY29kaW5nIHdoZW4KKyAgIGRpc3BsYXlpbmcsIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4gIFRoZSBsb2cgb3V0cHV0IGVuY29kaW5nCisgICBpcyBkZXRlcm1pbmVkIGJ5ICJnaXQgbG9nIC0tZW5jb2Rpbmc9PGVuY29kaW5nPiIsCisgICBpMThuLmxvZ291dHB1dGVuY29kaW5nIGNvbmZpZ3VyYXRpb24sIG9yIGkxOG4uY29tbWl0ZW5jb2RpbmcKKyAgIGNvbmZpZ3VyYXRpb24sIGluIHRoZSBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UsIGFuZAorICAgZGVmYXVsdHMgdG8gVVRGLTguCisKKyAtIFRvb2xzIGZvciBlLW1haWxlZCBwYXRjaCBhcHBsaWNhdGlvbiBub3cgZGVmYXVsdCB0byAtdQorICAgYmVoYXZpb3I7IGkuZS4gaXQgYWx3YXlzIHJlLWNvZGVzIGZyb20gdGhlIGUtbWFpbGVkIGVuY29kaW5nCisgICB0byB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIHdpdGggaTE4bi5jb21taXRlbmNvZGluZy4gIFRoaXMKKyAgIHVuZm9ydHVuYXRlbHkgZm9yY2VzIHByb2plY3RzIHRoYXQgaGF2ZSBoYXBwaWx5IGJlZW4gdXNpbmcgYQorICAgbGVnYWN5IGVuY29kaW5nIHdpdGhvdXQgc2V0dGluZyBpMThuLmNvbW1pdGVuY29kaW5nIHRvIHNldAorICAgdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0YWtlbiB3aXRoIG90aGVyIGltcHJvdmVtZW50LCBwbGVhc2UKKyAgIGV4Y3VzZSB1cyBmb3IgdGhpcyB2ZXJ5IG1pbm9yIG9uZS10aW1lIGluY29udmVuaWVuY2UuCisKKworKiBlLW1haWxlZCBwYXRjaGVzCisKKyAtIFNlZSB0aGUgYWJvdmUgSTE4biBzZWN0aW9uLgorCisgLSBnaXQtZm9ybWF0LXBhdGNoIG5vdyBlbmFibGVzIC0tYmluYXJ5IHdpdGhvdXQgYmVpbmcgYXNrZWQuCisgICBnaXQtYW0gZG9lcyBfbm90XyBkZWZhdWx0IHRvIGl0LCBhcyBzZW5kaW5nIGJpbmFyeSBwYXRjaCB2aWEKKyAgIGUtbWFpbCBpcyB1bnVzdWFsIGFuZCBpcyBoYXJkZXIgdG8gcmV2aWV3IHRoYW4gdGV4dHVhbAorICAgcGF0Y2hlcyBhbmQgaXQgaXMgcHJ1ZGVudCB0byByZXF1aXJlIHRoZSBwZXJzb24gd2hvIGlzCisgICBhcHBseWluZyB0aGUgcGF0Y2ggdG8gZXhwbGljaXRseSBhc2sgZm9yIGl0LgorCisgLSBUaGUgZGVmYXVsdCBzdWZmaXggZm9yIGdpdC1mb3JtYXQtcGF0Y2ggb3V0cHV0IGlzIG5vdyAiLnBhdGNoIiwKKyAgIG5vdCAiLnR4dCIuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggLS1zdWZmaXg9LnR4dCBvcHRpb24sCisgICBvciBzZXR0aW5nIHRoZSBjb25maWcgdmFyaWFibGUgImZvcm1hdC5zdWZmaXgiIHRvICIudHh0Ii4KKworCisqIEZvcmVpZ24gU0NNIGludGVyZmFjZXMKKworIC0gZ2l0LXN2biBub3cgcmVxdWlyZXMgdGhlIFBlcmwgU1ZOOjogbGlicmFyaWVzLCB0aGUKKyAgIGNvbW1hbmQtbGluZSBiYWNrZW5kIHdhcyB0b28gc2xvdyBhbmQgbGltaXRlZC4KKworIC0gdGhlICdjb21taXQnIHN1YmNvbW1hbmQgb2YgZ2l0LXN2biBoYXMgYmVlbiByZW5hbWVkIHRvCisgICAnc2V0LXRyZWUnLCBhbmQgJ2Rjb21taXQnIGlzIHRoZSByZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmb3IKKyAgIGRheS10by1kYXkgd29yay4KKworIC0gZ2l0IGZhc3QtaW1wb3J0IGJhY2tlbmQuCisKKworKiBVc2VyIHN1cHBvcnQKKworIC0gUXVpdGUgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorCisgLSBCYXNoIGNvbXBsZXRpb24gc2NyaXB0cyBoYXZlIGJlZW4gdXBkYXRlZCBoZWF2aWx5LgorCisgLSBCZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG9mdGVuIHVzZWQgUG9yY2VsYWluaXNoIGNvbW1hbmRzLgorCisgLSBHaXQgR1VJLiAgVGhpcyBpcyBhIHNpbXBsZSBUayBiYXNlZCBncmFwaGljYWwgaW50ZXJmYWNlIGZvcgorICAgY29tbW9uIEdpdCBvcGVyYXRpb25zLgorCisKKyogU2xpZGluZyBtbWFwCisKKyAtIFdlIHVzZWQgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIG1tYXAgdGhlIHdob2xlIHBhY2tmaWxlIHdoaWxlCisgICBpbiB1c2UsIGJ1dCB3aXRoIGEgbGFyZ2UgcHJvamVjdCB0aGlzIGNvbnN1bWVzIGh1Z2UgdmlydHVhbAorICAgbWVtb3J5IHNwYWNlIGFuZCB0cnVseSBodWdlIG9uZXMgd291bGQgbm90IGZpdCBpbiB0aGUKKyAgIHVzZXJsYW5kIGFkZHJlc3Mgc3BhY2Ugb24gMzItYml0IHBsYXRmb3Jtcy4gIFdlIG5vdyBtbWFwIGh1Z2UKKyAgIHBhY2tmaWxlIGluIHBpZWNlcyB0byBhdm9pZCB0aGlzIHByb2JsZW0uCisKKworKiBTaGFsbG93IGNsb25lcworCisgLSBUaGVyZSBpcyBhIHBhcnRpYWwgc3VwcG9ydCBmb3IgJ3NoYWxsb3cnIHJlcG9zaXRvcmllcyB0aGF0CisgICBrZWVwcyBvbmx5IHJlY2VudCBoaXN0b3J5LiAgQSAnc2hhbGxvdyBjbG9uZScgaXMgY3JlYXRlZCBieQorICAgc3BlY2lmeWluZyBob3cgZGVlcCB0aGF0IHRydW5jYXRlZCBoaXN0b3J5IHNob3VsZCBiZQorICAgKGUuZy4gImdpdCBjbG9uZSAtLWRlcHRoIDUgZ2l0Oi8vc29tZS53aGVyZS9yZXBvLmdpdCIpLgorCisgICBDdXJyZW50bHkgYSBzaGFsbG93IHJlcG9zaXRvcnkgaGFzIG51bWJlciBvZiBsaW1pdGF0aW9uczoKKworICAgLSBDbG9uaW5nIGFuZCBmZXRjaGluZyBfZnJvbV8gYSBzaGFsbG93IGNsb25lIGFyZSBub3QKKyAgICAgc3VwcG9ydGVkIChub3IgdGVzdGVkIC0tIHNvIHRoZXkgbWlnaHQgd29yayBieSBhY2NpZGVudCBidXQKKyAgICAgdGhleSBhcmUgbm90IGV4cGVjdGVkIHRvKS4KKworICAgLSBQdXNoaW5nIGZyb20gbm9yIGludG8gYSBzaGFsbG93IGNsb25lIGFyZSBub3QgZXhwZWN0ZWQgdG8KKyAgICAgd29yay4KKworICAgLSBNZXJnaW5nIGluc2lkZSBhIHNoYWxsb3cgcmVwb3NpdG9yeSB3b3VsZCB3b3JrIGFzIGxvbmcgYXMgYQorICAgICBtZXJnZSBiYXNlIGlzIGZvdW5kIGluIHRoZSByZWNlbnQgaGlzdG9yeSwgYnV0IG90aGVyd2lzZSBpdAorICAgICB3aWxsIGJlIGxpa2UgbWVyZ2luZyB1bnJlbGF0ZWQgaGlzdG9yaWVzIGFuZCBtYXkgcmVzdWx0IGluCisgICAgIGh1Z2UgY29uZmxpY3RzLgorCisgICBidXQgdGhpcyB3b3VsZCBiZSBtb3JlIHRoYW4gYWRlcXVhdGUgZm9yIHBlb3BsZSB3aG8gd2FudCB0bworICAgbG9vayBhdCBuZWFyIHRoZSB0aXAgb2YgYSBiaWcgcHJvamVjdCB3aXRoIGEgZGVlcCBoaXN0b3J5IGFuZAorICAgc2VuZCBwYXRjaGVzIGluIGUtbWFpbCBmb3JtYXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ3MTIxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4xLnR4dApAQCAtMCwwICsxLDY1IEBACitHSVQgdjEuNS4xLjEgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xCistLS0tLS0tLS0tLS0tLS0tLS0KKworKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMKKworICAtIFRoZSAtLWxlZnQtcmlnaHQgb3B0aW9uIG9mIHJldi1saXN0IGFuZCBmcmllbmRzIGlzIGRvY3VtZW50ZWQuCisKKyAgLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgY3ZzaW1wb3J0IGhhcyBiZWVuIG1ham9ybHkgaW1wcm92ZWQuCisKKyAgLSAiZ2l0LXNob3ctcmVmIC0tZXhjbHVkZS1leGlzdGluZyIgd2FzIGRvY3VtZW50ZWQuCisKKyogQnVnZml4ZXMKKworICAtIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiAtcCBvcHRpb24gaW4gImdpdCBjdnNleHBvcnRjb21taXQiIGhhZAorICAgIHRoZSBtZWFuaW5nIG9mIC1DIChjb250ZXh0IHJlZHVjdGlvbikgb3B0aW9uIHdyb25nLCBhbmQKKyAgICBsb29zZW5lZCB0aGUgY29udGV4dCByZXF1aXJlbWVudHMgd2hlbiBpdCB3YXMgdG9sZCB0byBiZQorICAgIHN0cmljdC4KKworICAtICJnaXQgY3Zzc2VydmVyIiBkaWQgbm90IGJlaGF2ZSBsaWtlIHRoZSByZWFsIGN2c3NlcnZlciB3aGVuCisgICAgY2xpZW50IHNpZGUgcmVtb3ZlZCBhIGZpbGUgZnJvbSB0aGUgd29ya2luZyB0cmVlIHdpdGhvdXQKKyAgICBkb2luZyBhbnl0aGluZyBlbHNlIG9uIHRoZSBwYXRoLiAgSW4gc3VjaCBhIGNhc2UsIGl0IHNob3VsZAorICAgIHJlc3RvcmUgaXQgZnJvbSB0aGUgY2hlY2tlZCBvdXQgcmV2aXNpb24uCisKKyAgLSAiZ2l0IGZzY2siIGlzc3VlZCBhbiBhbGFybWluZyBlcnJvciBtZXNzYWdlIG9uIGRldGFjaGVkCisgICAgSEVBRC4gIEl0IGlzIG5vdCBhbiBlcnJvciBzaW5jZSBhdCBsZWFzdCAxLjUuMC4KKworICAtICJnaXQgc2VuZC1lbWFpbCIgcHJvZHVjZWQgb2YgUmVmZXJlbmNlcyBoZWFkZXIgb2YgdW5ib3VuZGVkIGxlbmd0aDsKKyAgICBmaXhlZCB0aGlzIHdpdGggbGluZS1mb2xkaW5nLgorCisgIC0gImdpdCBhcmNoaXZlIiB0byBkb3dubG9hZCBmcm9tIHJlbW90ZSBzaXRlIHNob3VsZCBub3QKKyAgICByZXF1aXJlIHlvdSB0byBiZSBpbiBhIGdpdCByZXBvc2l0b3J5LCBidXQgaXQgaW5jb3JyZWN0bHkKKyAgICBkaWQuCisKKyAgLSAiZ2l0IGFwcGx5IiBpZ25vcmVkIC1wPG4+IGZvciAiZGlmZiAtLWdpdCIgZm9ybWF0dGVkCisgICAgcGF0Y2hlcy4KKworICAtICJnaXQgcmVyZXJlIiByZWNvcmRlZCBhIGNvbmZsaWN0IHRoYXQgaGFkIG9uZSBzaWRlIGVtcHR5CisgICAgKHRoZSBvdGhlciBzaWRlIGFkZHMpIGluY29ycmVjdGx5OyB0aGlzIG1hZGUgbWVyZ2luZyBpbiB0aGUKKyAgICBvdGhlciBkaXJlY3Rpb24gZmFpbCB0byB1c2UgcHJldmlvdXNseSByZWNvcmRlZCByZXNvbHV0aW9uLgorCisgIC0gdDQyMDAgdGVzdCB3YXMgYnJva2VuIHdoZXJlICJ3YyAtbCIgcGFkcyBpdHMgb3V0cHV0IHdpdGgKKyAgICBzcGFjZXMuCisKKyAgLSAiZ2l0IGJyYW5jaCAtbSBvbGQgbmV3IiB0byByZW5hbWUgYnJhbmNoIGRpZCBub3Qgd29yaworICAgIHdpdGhvdXQgYSBjb25maWd1cmF0aW9uIGZpbGUgaW4gIi5naXQvY29uZmlnIi4KKworICAtIFRoZSBzYW1wbGUgaG9vayBmb3Igbm90aWZpY2F0aW9uIGUtbWFpbCB3YXMgbWlzbmFtZWQuCisKKyAgLSBnaXR3ZWIgZGlkIG5vdCBzaG93IHR5cGUtY2hhbmdpbmcgcGF0Y2ggY29ycmVjdGx5IGluIHRoZQorICAgIGJsb2JkaWZmIHZpZXcuCisKKyAgLSBnaXQtc3ZuIGRpZCBub3QgZXJyb3Igb3V0IHdpdGggaW5jb3JyZWN0IGNvbW1hbmQgbGluZSBvcHRpb25zLgorCisgIC0gZ2l0LXN2biBmZWxsIGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVuIGluc2FuZWx5IGxvbmcgY29tbWl0CisgICAgbWVzc2FnZSB3YXMgZm91bmQuCisKKyAgLSBnaXQtc3ZuIGRjb21taXQgYW5kIHJlYmFzZSB3YXMgY29uZnVzZWQgYnkgcGF0Y2hlcyB0aGF0IHdlcmUKKyAgICBtZXJnZWQgZnJvbSBhbm90aGVyIGJyYW5jaCB0aGF0IGlzIG1hbmFnZWQgYnkgZ2l0LXN2bi4KKworICAtIGdpdC1zdm4gdXNlZCB0byBnZXQgY29uZnVzZWQgd2hlbiBnbG9iYmluZyByZW1vdGUgYnJhbmNoL3RhZworICAgIHNwZWMgKGUuZy4gImJyYW5jaGVzID0gcHJvai9icmFuY2hlcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpCisgICAgaXMgdXNlZCBhbmQgdGhlcmUgd2FzIGEgcGxhaW4gZmlsZSB0aGF0IG1hdGNoZWQgdGhlIGdsb2IuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg0NTYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4yLnR4dApAQCAtMCwwICsxLDUwIEBACitHSVQgdjEuNS4xLjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtICJnaXQgY2xvbmUiIG92ZXIgaHR0cCBmcm9tIGEgcmVwb3NpdG9yeSB0aGF0IGhhcyBsb3N0IHRoZQorICAgIGxvb3NlIHJlZnMgYnkgcnVubmluZyAiZ2l0IHBhY2stcmVmcyIgd2VyZSBicm9rZW4gKGEgY29kZSB0bworICAgIGRlYWwgd2l0aCB0aGlzIHdhcyBhZGRlZCB0byAiZ2l0IGZldGNoIiBpbiB2MS41LjAsIGJ1dCBpdAorICAgIHdhcyBtaXNzaW5nIGZyb20gImdpdCBjbG9uZSIpLgorCisgIC0gImdpdCBkaWZmIGEvIGIvIiBpbmNvcnJlY3RseSBmZWxsIGluICJkaWZmIGJldHdlZW4gdHdvCisgICAgZmlsZXN5c3RlbSBvYmplY3RzIiBjb2RlcGF0aCwgd2hlbiB0aGUgdXNlciBtb3N0IGxpa2VseQorICAgIHdhbnRlZCB0byBsaW1pdCB0aGUgZXh0ZW50IG9mIG91dHB1dCB0byB0d28gdHJhY2tlZAorICAgIGRpcmVjdG9yaWVzLgorCisgIC0gZ2l0LXF1aWx0aW1wb3J0IGhhZCB0aGUgc2FtZSBidWcgYXMgd2UgZml4ZWQgZm9yCisgICAgZ2l0LWFwcGx5bWJveCBpbiB2MS41LjEuMSAtLSBpdCBnYXZlIGFuIGFsYXJtaW5nICJkaWQgbm90CisgICAgaGF2ZSBhbnkgcGF0Y2giIG1lc3NhZ2UgKGJ1dCBkaWQgbm90IGFjdHVhbGx5IGZhaWwgYW5kIHdhcworICAgIGhhcm1sZXNzKS4KKworICAtIHZhcmlvdXMgZ2l0LXN2biBmaXhlcy4KKworICAtIFNhbXBsZSB1cGRhdGUgaG9vayBpbmNvcnJlY3RseSBhbHdheXMgcmVmdXNlZCByZXF1ZXN0cyB0bworICAgIGRlbGV0ZSBicmFuY2hlcyB0aHJvdWdoIHB1c2guCisKKyAgLSBnaXQtYmxhbWUgb24gYSB2ZXJ5IGxvbmcgd29ya2luZyB0cmVlIHBhdGggaGFkIGJ1ZmZlcgorICAgIG92ZXJydW4gcHJvYmxlbS4KKworICAtIGdpdC1hcHBseSBkaWQgbm90IGxpa2UgdG8gYmUgZmVkIHR3byBwYXRjaGVzIGluIGEgcm93IHRoYXQgY3JlYXRlZAorICAgIGFuZCB0aGVuIG1vZGlmaWVkIHRoZSBzYW1lIGZpbGUuCisKKyAgLSBnaXQtc3ZuIHdhcyBjb25mdXNlZCB3aGVuIGEgbm9uLXByb2plY3Qgd2FzIHN0b3JlZCBkaXJlY3RseSB1bmRlcgorICAgIHRydW5rLywgYnJhbmNoZXMvIGFuZCB0YWdzLy4KKworICAtIGdpdC1zdm4gd2FudHMgdGhlIEVycm9yLnBtIG1vZHVsZSB0aGF0IHdhcyBhdCBsZWFzdCBhcyBuZXcKKyAgICBhcyB3aGF0IHdlIHNoaXAgYXMgcGFydCBvZiBnaXQ7IGluc3RhbGwgb3VycyBpbiBvdXIgcHJpdmF0ZQorICAgIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBpZiB0aGUgb25lIG9uIHRoZSBzeXN0ZW0gaXMgb2xkZXIuCisKKyAgLSBBbiBlYXJsaWVyIHVwZGF0ZSB0byBjb21tYW5kIGxpbmUgaW50ZWdlciBwYXJhbWV0ZXIgcGFyc2VyIHdhcworICAgIGJvdGNoZWQgYW5kIG1hZGUgJ3VwZGF0ZS1pbmRleCAtLWNhY2hlaW5mbycgY29tcGxldGVseSB1c2VsZXNzLgorCisKKyogRG9jdW1lbnRhdGlvbiB1cGRhdGVzCisKKyAgLSBWYXJpb3VzIGRvY3VtZW50YXRpb24gdXBkYXRlcyBmcm9tIEouIEJydWNlIEZpZWxkcywgRnJhbmsKKyAgICBMaWNodGVuaGVsZCwgQWxleCBSaWVzZW4gYW5kIG90aGVycy4gIEFuZHJldyBSdWRlciBzdGFydGVkIGEKKyAgICB3YXIgb24gdW5kb2N1bWVudGVkIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjMudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRlYWJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4zLnR4dApAQCAtMCwwICsxLDQ2IEBACitHSVQgdjEuNS4xLjMgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1hZGQgdHJpZWQgdG8gb3B0aW1pemUgYnkgZmluZGluZyBjb21tb24gbGVhZGluZworICAgIGRpcmVjdG9yaWVzIGFjcm9zcyBpdHMgYXJndW1lbnRzIGJ1dCBib3RjaGVkLCBjYXVzaW5nIHZlcnkKKyAgICBjb25mdXNlZCBiZWhhdmlvdXIuCisKKyAgLSB1bm9mZmljaWFsIHJwbS5zcGVjIGZpbGUgc2hpcHBlZCB3aXRoIGdpdCB3YXMgbGV0dGluZworICAgIEVUQ19HSVRDT05GSUcgc2V0IHRvIC91c3IvZXRjL2dpdGNvbmZpZy4gIFR3ZWFrIHRoZSBvZmZpY2lhbAorICAgIE1ha2VmaWxlIHRvIG1ha2UgaXQgaGFyZGVyIGZvciBkaXN0cm8gcGVvcGxlIHRvIG1ha2UgdGhlCisgICAgc2FtZSBtaXN0YWtlLCBieSBzZXR0aW5nIHRoZSB2YXJpYWJsZSB0byAvZXRjL2dpdGNvbmZpZyBpZgorICAgIHByZWZpeCBpcyBzZXQgdG8gL3Vzci4KKworICAtIGdpdC1zdm4gaW5jb25zaXN0ZW50bHkgc3RyaXBwZWQgYXdheSB1c2VybmFtZSBmcm9tIHRoZSBVUkwKKyAgICBvbmx5IHdoZW4gc3Zuc3luY19wcm9wcyB3YXMgaW4gdXNlLgorCisgIC0gZ2l0LXN2biBnb3QgY29uZnVzZWQgd2hlbiBoYW5kbGluZyBzeW1saW5rcyBvbiBNYWMgT1MuCisKKyAgLSBnaXQtc2VuZC1lbWFpbCB3YXMgbm90IHF1b3RpbmcgcmVjaXBpZW50IG5hbWVzIHRoYXQgaGF2ZQorICAgIHBlcmlvZCAnLicgaW4gdGhlbS4gIEFsc28gaXQgZGlkIG5vdCBhbGxvdyBvdmVycmlkaW5nCisgICAgZW52ZWxvcGUgc2VuZGVyLCB3aGljaCBtYWRlIGl0IGltcG9zc2libGUgdG8gc2VuZCBwYXRjaGVzIHRvCisgICAgY2VydGFpbiBzdWJzY3JpYmVyLW9ubHkgbGlzdHMuCisKKyAgLSBidWlsdC1pbiB3cml0ZV90cmVlKCkgcm91dGluZSBoYWQgYSBzZXF1ZW5jZSB0aGF0IHJlbmFtZWQgYQorICAgIGZpbGUgdGhhdCBpcyBzdGlsbCBvcGVuLCB3aGljaCBzb21lIHN5c3RlbXMgZGlkIG5vdCBsaWtlLgorCisgIC0gd2hlbiBtZW1vcnkgaXMgdmVyeSB0aWdodCwgc2xpZGluZyBtbWFwIGNvZGUgdG8gcmVhZAorICAgIHBhY2tmaWxlcyBpbmNvcnJlY3RseSBjbG9zZWQgdGhlIGZkIHRoYXQgd2FzIHN0aWxsIGJlaW5nCisgICAgdXNlZCB0byByZWFkIHRoZSBwYWNrLgorCisgIC0gaW1wb3J0LXRhcnMgY29udHJpYnV0ZWQgZnJvbnQtZW5kIGZvciBmYXN0aW1wb3J0IHdhcyBwYXNzaW5nCisgICAgd3JvbmcgZGlyZWN0b3J5IG1vZGVzIHdpdGhvdXQgY2hlY2tpbmcuCisKKyAgLSBnaXQtZmFzdGltcG9ydCB0cnVzdGVkIGl0cyBpbnB1dCB0b28gbXVjaCBhbmQgYWxsb3dlZCB0bworICAgIGNyZWF0ZSBjb3JydXB0IHRyZWUgb2JqZWN0cyB3aXRoIGVudHJpZXMgd2l0aG91dCBhIG5hbWUuCisKKyAgLSBnaXQtZmV0Y2ggbmVlZGxlc3NseSBiYXJmZWQgd2hlbiB0b28gbG9uZyByZWZsb2cgYWN0aW9uCisgICAgZGVzY3JpcHRpb24gd2FzIGdpdmVuIGJ5IHRoZSBjYWxsZXIuCisKK0Fsc28gY29udGFpbnMgdmFyaW91cyBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEuNC50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmY2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjQudHh0CkBAIC0wLDAgKzEsMzAgQEAKK0dJVCB2MS41LjEuNCBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjEuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gImdpdC1odHRwLWZldGNoIiBkaWQgbm90IHdvcmsgYXJvdW5kIGEgYnVnIGluIGxpYmN1cmwKKyAgICBlYXJsaWVyIHRoYW4gNy4xNiAoY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgd2FzIGJyb2tlbikuCisKKyAgLSAiZ2l0IGN2c3NlcnZlciIgaGFuZGxlcyBhIGZpbGUgdGhhdCB3YXMgb25jZSByZW1vdmVkIGFuZAorICAgIHRoZW4gYWRkZWQgYWdhaW4gY29ycmVjdGx5LgorCisgIC0gaW1wb3J0LXRhcnMgc2NyaXB0IChpbiBjb250cmliLykgaGFuZGxlcyBHTlUgdGFyIGFyY2hpdmVzCisgICAgdGhhdCBjb250YWluIHBhdGhuYW1lcyBsb25nZXIgdGhhbiAxMDAgYnl0ZXMgKGxvbmctbGluaworICAgIGV4dGVuc2lvbikgY29ycmVjdGx5LgorCisgIC0geGRlbHRhIHRlc3QgcHJvZ3JhbSBkaWQgbm90IGJ1aWxkIGNvcnJlY3RseS4KKworICAtIGdpdHdlYiBzb21ldGltZXMgdHJpZWQgaW5jb3JyZWN0bHkgdG8gYXBwbHkgZnVuY3Rpb24gdG8KKyAgICBkZWNvZGUgdXRmOCB0d2ljZSwgcmVzdWx0aW5nIGluIGNvcnJ1cHQgb3V0cHV0LgorCisgIC0gImdpdCBibGFtZSAtQyIgbWlzaGFuZGxlZCB0ZXh0IGF0IHRoZSBlbmQgb2YgYSBncm91cCBvZgorICAgIGxpbmVzLgorCisgIC0gImdpdCBsb2cvcmV2LWxpc3QgLS1ib3VuZGFyeSIgZGlkIG5vdCBwcm9kdWNlIG91dHB1dAorICAgIGNvcnJlY3RseSB3aXRob3V0IC0tbGVmdC1yaWdodCBvcHRpb24uCisKKyAgLSBNYW55IGRvY3VtZW50YXRpb24gdXBkYXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEuNS50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYWI4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjUudHh0CkBAIC0wLDAgKzEsNDIgQEAKK0dJVCB2MS41LjEuNSBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjEuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gZ2l0LXNlbmQtZW1haWwgZGlkIG5vdCB1bmRlcnN0YW5kIGFsaWFzZXMgZmlsZSBmb3IgbXV0dCwgd2hpY2gKKyAgICBhbGxvd3MgbGVhZGluZyB3aGl0ZXNwYWNlcy4KKworICAtIGdpdC1mb3JtYXQtcGF0Y2ggZW1pdHRlZCBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcKKyAgICBoZWFkZXJzIGZvciBub24gQVNDSUkgY29udGVudHMsIGJ1dCBmYWlsZWQgdG8gYWRkIE1JTUUtVmVyc2lvbi4KKworICAtIGdpdC1uYW1lLXJldiBoYWQgYSBidWZmZXIgb3ZlcnJ1biB3aXRoIGEgZGVlcCBoaXN0b3J5LgorCisgIC0gY29udHJpYnV0ZWQgc2NyaXB0IGltcG9ydC10YXJzIGRpZCBub3QgZ2V0IHRoZSBkaXJlY3RvcnkgaW4KKyAgICB0YXIgYXJjaGl2ZXMgaW50ZXJwcmV0ZWQgY29ycmVjdGx5LgorCisgIC0gZ2l0LXN2biB3YXMgcmVwb3J0ZWQgdG8gc2VnZmF1bHQgZm9yIG1hbnkgcGVvcGxlIG9uIGxpc3QgYW5kCisgICAgI2dpdDsgaG9wZWZ1bGx5IHRoaXMgaGFzIGJlZW4gZml4ZWQuCisKKyAgLSAiZ2l0LXN2biBjbG9uZSIgZG9lcyBub3QgdHJ5IHRvIG1pbmltaXplIHRoZSBVUkwKKyAgICAoaS5lLiBjb25uZWN0IHRvIGhpZ2hlciBsZXZlbCBoaWVyYXJjaHkpIGJ5IGRlZmF1bHQsIGFzIHRoaXMKKyAgICBjYW4gcHJldmVudCBjbG9uZSB0byBmYWlsIGlmIG9ubHkgcGFydCBvZiB0aGUgcmVwb3NpdG9yeQorICAgIChlLmcuICd0cnVuaycpIGlzIG9wZW4gdG8gcHVibGljLgorCisgIC0gImdpdCBjaGVja291dCBicmFuY2heMCIgZGlkIG5vdCBkZXRhY2ggdGhlIGhlYWQgd2hlbiB5b3UgYXJlCisgICAgYWxyZWFkeSBvbiAnYnJhbmNoJzsgYmFja3BvcnRlZCB0aGUgZml4IGZyb20gdGhlICdtYXN0ZXInLgorCisgIC0gImdpdC1jb25maWcgc2VjdGlvbi52YXIiIGRpZCBub3QgY29ycmVjdGx5IHdvcmsgd2hlbgorICAgIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBoYWQgYm90aCBbc2VjdGlvbl0gYW5kIFtzZWN0aW9uICJuYW1lIl0KKyAgICBuZXh0IHRvIGVhY2ggb3RoZXIuCisKKyAgLSAiZ2l0IGNsb25lIC4uL290aGVyLWRpcmVjdG9yeSIgd2FzIGZvb2xlZCBpZiB0aGUgY3VycmVudAorICAgIGRpcmVjdG9yeSAkUFdEIHBvaW50cyBhdCBpcyBhIHN5bWJvbGljIGxpbmsuCisKKyAgLSAoYnVpbGQpIHRyZWVfZW50cnlfZXh0cmFjdCgpIGZ1bmN0aW9uIHdhcyBib3RoIHN0YXRpYyBpbmxpbmUKKyAgICBhbmQgZXh0ZXJuLCB3aGljaCBjYXVzZWQgdHJvdWJsZSBjb21waWxpbmcgd2l0aCBGb3J0ZTEyCisgICAgY29tcGlsZXJzIG9uIFN1bi4KKworICAtIE1hbnkgbWFueSBkb2N1bWVudGF0aW9uIGZpeGVzIGFuZCB1cGRhdGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS42LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEuNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmM2FjMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEuNi50eHQKQEAgLTAsMCArMSw0NSBAQAorR0lUIHYxLjUuMS42IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMS40CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEJ1Z2ZpeGVzCisKKyAgLSBnaXQtc2VuZC1lbWFpbCBkaWQgbm90IHVuZGVyc3RhbmQgYWxpYXNlcyBmaWxlIGZvciBtdXR0LCB3aGljaAorICAgIGFsbG93cyBsZWFkaW5nIHdoaXRlc3BhY2VzLgorCisgIC0gZ2l0LWZvcm1hdC1wYXRjaCBlbWl0dGVkIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZworICAgIGhlYWRlcnMgZm9yIG5vbiBBU0NJSSBjb250ZW50cywgYnV0IGZhaWxlZCB0byBhZGQgTUlNRS1WZXJzaW9uLgorCisgIC0gZ2l0LW5hbWUtcmV2IGhhZCBhIGJ1ZmZlciBvdmVycnVuIHdpdGggYSBkZWVwIGhpc3RvcnkuCisKKyAgLSBjb250cmlidXRlZCBzY3JpcHQgaW1wb3J0LXRhcnMgZGlkIG5vdCBnZXQgdGhlIGRpcmVjdG9yeSBpbgorICAgIHRhciBhcmNoaXZlcyBpbnRlcnByZXRlZCBjb3JyZWN0bHkuCisKKyAgLSBnaXQtc3ZuIHdhcyByZXBvcnRlZCB0byBzZWdmYXVsdCBmb3IgbWFueSBwZW9wbGUgb24gbGlzdCBhbmQKKyAgICAjZ2l0OyBob3BlZnVsbHkgdGhpcyBoYXMgYmVlbiBmaXhlZC4KKworICAtIGdpdC1zdm4gYWxzbyBoYWQgYSBidWcgdG8gY3Jhc2ggc3Zuc2VydmUgYnkgc2VuZGluZyBhIGJhZAorICAgIHNlcXVlbmNlIG9mIHJlcXVlc3RzLgorCisgIC0gImdpdC1zdm4gY2xvbmUiIGRvZXMgbm90IHRyeSB0byBtaW5pbWl6ZSB0aGUgVVJMCisgICAgKGkuZS4gY29ubmVjdCB0byBoaWdoZXIgbGV2ZWwgaGllcmFyY2h5KSBieSBkZWZhdWx0LCBhcyB0aGlzCisgICAgY2FuIHByZXZlbnQgY2xvbmUgdG8gZmFpbCBpZiBvbmx5IHBhcnQgb2YgdGhlIHJlcG9zaXRvcnkKKyAgICAoZS5nLiAndHJ1bmsnKSBpcyBvcGVuIHRvIHB1YmxpYy4KKworICAtICJnaXQgY2hlY2tvdXQgYnJhbmNoXjAiIGRpZCBub3QgZGV0YWNoIHRoZSBoZWFkIHdoZW4geW91IGFyZQorICAgIGFscmVhZHkgb24gJ2JyYW5jaCc7IGJhY2twb3J0ZWQgdGhlIGZpeCBmcm9tIHRoZSAnbWFzdGVyJy4KKworICAtICJnaXQtY29uZmlnIHNlY3Rpb24udmFyIiBkaWQgbm90IGNvcnJlY3RseSB3b3JrIHdoZW4KKyAgICBleGlzdGluZyBjb25maWd1cmF0aW9uIGZpbGUgaGFkIGJvdGggW3NlY3Rpb25dIGFuZCBbc2VjdGlvbiAibmFtZSJdCisgICAgbmV4dCB0byBlYWNoIG90aGVyLgorCisgIC0gImdpdCBjbG9uZSAuLi9vdGhlci1kaXJlY3RvcnkiIHdhcyBmb29sZWQgaWYgdGhlIGN1cnJlbnQKKyAgICBkaXJlY3RvcnkgJFBXRCBwb2ludHMgYXQgaXMgYSBzeW1ib2xpYyBsaW5rLgorCisgIC0gKGJ1aWxkKSB0cmVlX2VudHJ5X2V4dHJhY3QoKSBmdW5jdGlvbiB3YXMgYm90aCBzdGF0aWMgaW5saW5lCisgICAgYW5kIGV4dGVybiwgd2hpY2ggY2F1c2VkIHRyb3VibGUgY29tcGlsaW5nIHdpdGggRm9ydGUxMgorICAgIGNvbXBpbGVycyBvbiBTdW4uCisKKyAgLSBNYW55IG1hbnkgZG9jdW1lbnRhdGlvbiBmaXhlcyBhbmQgdXBkYXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZDM2NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEudHh0CkBAIC0wLDAgKzEsMzcxIEBACitHSVQgdjEuNS4xIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitVcGRhdGVzIHNpbmNlIHYxLjUuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBEZXByZWNhdGVkIGNvbW1hbmRzIGFuZCBvcHRpb25zLgorCisgIC0gZ2l0LWRpZmYtc3RhZ2VzIGFuZCBnaXQtcmVzb2x2ZSBoYXZlIGJlZW4gcmVtb3ZlZC4KKworKiBOZXcgY29tbWFuZHMgYW5kIG9wdGlvbnMuCisKKyAgLSAiZ2l0IGxvZyIgYW5kIGZyaWVuZHMgdGFrZSAtLXJldmVyc2UsIHdoaWNoIGluc3RydWN0cyB0aGVtCisgICAgdG8gZ2l2ZSB0aGVpciBvdXRwdXQgaW4gdGhlIG9yZGVyIG9wcG9zaXRlIGZyb20gdGhlaXIgdXN1YWwuCisgICAgVGhleSB0eXBpY2FsbHkgb3V0cHV0IGZyb20gbmV3IHRvIG9sZCwgYnV0IHdpdGggdGhpcyBvcHRpb24KKyAgICB0aGVpciBvdXRwdXQgd291bGQgcmVhZCBmcm9tIG9sZCB0byBuZXcuICAiZ2l0IHNob3J0bG9nIgorICAgIHVzdWFsbHkgbGlzdHMgb2xkZXIgY29tbWl0cyBmaXJzdCwgYnV0IHdpdGggdGhpcyBvcHRpb24sCisgICAgdGhleSBhcmUgc2hvd24gZnJvbSBuZXcgdG8gb2xkLgorCisgIC0gImdpdCBsb2cgLS1wcmV0dHk9Zm9ybWF0OjxzdHJpbmc+IiB0byBhbGxvdyBtb3JlIGZsZXhpYmxlCisgICAgY3VzdG9tIGxvZyBvdXRwdXQuCisKKyAgLSAiZ2l0IGRpZmYiIGxlYXJuZWQgLS1pZ25vcmUtc3BhY2UtYXQtZW9sLiAgVGhpcyBpcyBhIHdlYWtlcgorICAgIGZvcm0gb2YgLS1pZ25vcmUtc3BhY2UtY2hhbmdlLgorCisgIC0gImdpdCBkaWZmIC0tbm8taW5kZXggcGF0aEEgcGF0aEIiIGNhbiBiZSB1c2VkIGFzIGRpZmYKKyAgICByZXBsYWNlbWVudCB3aXRoIGdpdCBzcGVjaWZpYyBlbmhhbmNlbWVudHMuCisKKyAgLSAiZ2l0IGRpZmYgLS1uby1pbmRleCIgY2FuIHJlYWQgZnJvbSAnLScgKHN0YW5kYXJkIGlucHV0KS4KKworICAtICJnaXQgZGlmZiIgYWxzbyBsZWFybmVkIC0tZXhpdC1jb2RlIHRvIGV4aXQgd2l0aCBub24temVybworICAgIHN0YXR1cyB3aGVuIGl0IGZvdW5kIGRpZmZlcmVuY2VzLiAgSW4gdGhlIGZ1dHVyZSB3ZSBtaWdodAorICAgIHdhbnQgdG8gbWFrZSB0aGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGF0IHdvdWxkIGJlIGEgcmF0aGVyIGJpZworICAgIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2U7IGl0IHdpbGwgc3RheSBhcyBhbiBvcHRpb24gZm9yCisgICAgbm93LgorCisgIC0gImdpdCBkaWZmIC0tcXVpZXQiIGlzIC0tZXhpdC1jb2RlIHdpdGggb3V0cHV0IHR1cm5lZCBvZmYsCisgICAgbWVhbnQgZm9yIHNjcmlwdGVkIHVzZSB0byBxdWlja2x5IGRldGVybWluZSBpZiB0aGVyZSBpcyBhbnkKKyAgICB0cmVlLWxldmVsIGRpZmZlcmVuY2UuCisKKyAgLSBUZXh0dWFsIHBhdGNoIGdlbmVyYXRpb24gd2l0aCAiZ2l0IGRpZmYiIHdpdGhvdXQgLXcvLWIKKyAgICBvcHRpb24gaGFzIGJlZW4gc2lnbmlmaWNhbnRseSBvcHRpbWl6ZWQuICAiZ2l0IGJsYW1lIiBnb3QKKyAgICBmYXN0ZXIgYmVjYXVzZSBvZiB0aGUgc2FtZSBjaGFuZ2UuCisKKyAgLSAiZ2l0IGxvZyIgYW5kICJnaXQgcmV2LWxpc3QiIGhhcyBiZWVuIG9wdGltaXplZAorICAgIHNpZ25pZmljYW50bHkgd2hlbiB0aGV5IGFyZSB1c2VkIHdpdGggcGF0aHNwZWNzLgorCisgIC0gImdpdCBicmFuY2ggLS10cmFjayIgY2FuIGJlIHVzZWQgdG8gc2V0IHVwIGNvbmZpZ3VyYXRpb24KKyAgICB2YXJpYWJsZXMgdG8gaGVscCBpdCBlYXNpZXIgdG8gYmFzZSB5b3VyIHdvcmsgb24gYnJhbmNoZXMKKyAgICB5b3UgdHJhY2sgZnJvbSBhIHJlbW90ZSBzaXRlLgorCisgIC0gImdpdCBmb3JtYXQtcGF0Y2ggLS1hdHRhY2giIG5vdyBlbWl0cyBhdHRhY2htZW50cy4gIFVzZQorICAgIC0taW5saW5lIHRvIGdldCBhbiBpbmxpbmVkIG11bHRpcGFydC9taXhlZC4KKworICAtICJnaXQgbmFtZS1yZXYiIGxlYXJuZWQgLS1yZWZzPTxwYXR0ZXJuPiwgdG8gbGltaXQgdGhlIHRhZ3MKKyAgICB1c2VkIGZvciBuYW1pbmcgdGhlIGdpdmVuIHJldmlzaW9ucyBvbmx5IHRvIHRoZSBvbmVzCisgICAgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdHRlcm4uCisKKyAgLSAiZ2l0IHJlbW90ZSB1cGRhdGUiIGlzIHRvIHJ1biAiZ2l0IGZldGNoIiBmb3IgZGVmaW5lZCByZW1vdGVzCisgICAgdG8gdXBkYXRlIHRyYWNraW5nIGJyYW5jaGVzLgorCisgIC0gImdpdCBjdnNpbXBvcnQiIGNhbiBub3cgdGFrZSAnLWQnIHRvIHRhbGsgd2l0aCBhIENWUworICAgIHJlcG9zaXRvcnkgZGlmZmVyZW50IGZyb20gd2hhdCBhcmUgcmVjb3JkZWQgaW4gQ1ZTL1Jvb3QKKyAgICAob3ZlcnJpZGluZyBpdCB3aXRoIGVudmlyb25tZW50IENWU1JPT1QgZG9lcyBub3Qgd29yaykuCisKKyAgLSAiZ2l0IGJ1bmRsZSIgY2FuIGhlbHAgc25lYWtlci1uZXR0aW5nIHlvdXIgY2hhbmdlcyBiZXR3ZWVuCisgICAgcmVwb3NpdG9yaWVzLgorCisgIC0gImdpdCBtZXJnZXRvb2wiIGNhbiBoZWxwIDMtd2F5IGZpbGUtbGV2ZWwgY29uZmxpY3QKKyAgICByZXNvbHV0aW9uIHdpdGggeW91ciBmYXZvcml0ZSBncmFwaGljYWwgbWVyZ2UgdG9vbHMuCisKKyAgLSBBIG5ldyBjb25maWd1cmF0aW9uICJjb3JlLnN5bWxpbmtzIiBjYW4gYmUgdXNlZCB0byBkaXNhYmxlCisgICAgc3ltbGlua3Mgb24gZmlsZXN5c3RlbXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVtOyB0aGV5IGFyZQorICAgIGNoZWNrZWQgb3V0IGFzIHJlZ3VsYXIgZmlsZXMgaW5zdGVhZC4KKworICAtIFlvdSBjYW4gbmFtZSBhIGNvbW1pdCBvYmplY3Qgd2l0aCBpdHMgZmlyc3QgbGluZSBvZiB0aGUKKyAgICBtZXNzYWdlLiAgVGhlIHN5bnRheCB0byB1c2UgaXMgJzovbWVzc2FnZSB0ZXh0Jy4gIEUuZy4KKworICAgICQgZ2l0IHNob3cgIjovb2JqZWN0IG5hbWU6IGludHJvZHVjZSAnOi88b25lbGluZSBwcmVmaXg+JyBub3RhdGlvbiIKKworICAgIG1lYW5zIHRoZSBzYW1lIHRoaW5nIGFzOgorCisgICAgJCBnaXQgc2hvdyAyOGE0ZDk0MDQ0MzgwNjQxMmVmZmEyNDZlY2M3NzY4YTIxNTUzZWM3CisKKyAgLSAiZ2l0IGJpc2VjdCIgbGVhcm5lZCBhIG5ldyBjb21tYW5kICJydW4iIHRoYXQgdGFrZXMgYSBzY3JpcHQKKyAgICB0byBydW4gYWZ0ZXIgZWFjaCByZXZpc2lvbiBpcyBjaGVja2VkIG91dCB0byBkZXRlcm1pbmUgaWYgaXQKKyAgICBpcyBnb29kIG9yIGJhZCwgdG8gYXV0b21hdGUgdGhlIGJpc2VjdGlvbiBwcm9jZXNzLgorCisgIC0gImdpdCBsb2ciIGZhbWlseSBsZWFybmVkIGEgbmV3IHRyYXZlcnNhbCBvcHRpb24gLS1maXJzdC1wYXJlbnQsCisgICAgd2hpY2ggZG9lcyB3aGF0IHRoZSBuYW1lIHN1Z2dlc3RzLgorCisKKyogVXBkYXRlZCBiZWhhdmlvciBvZiBleGlzdGluZyBjb21tYW5kcy4KKworICAtICJnaXQtbWVyZ2UtcmVjdXJzaXZlIiB1c2VkIHRvIGJhcmYgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuCisgICAgb25lIGNvbW1vbiBhbmNlc3RvcnMgZm9yIHRoZSBtZXJnZSwgYW5kIG1lcmdpbmcgdGhlbSBoYWQgYQorICAgIHJlbmFtZS9yZW5hbWUgY29uZmxpY3QuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgorCisgIC0gImdpdCBmc2NrIiBkb2VzIG5vdCBiYXJmIG9uIGNvcnJ1cHQgbG9vc2Ugb2JqZWN0cy4KKworICAtICJnaXQgcm0iIGRvZXMgbm90IHJlbW92ZSBuZXdseSBhZGRlZCBmaWxlcyB3aXRob3V0IC1mLgorCisgIC0gImdpdCBhcmNoaW1wb3J0IiBhbGxvd3MgcmVtYXBwaW5nIHdoZW4gY29taW5nIHVwIHdpdGggZ2l0CisgICAgYnJhbmNoIG5hbWVzIGZyb20gYXJjaCBuYW1lcy4KKworICAtIGdpdC1zdm4gZ290IGFsbW9zdCBhIHJld3JpdGUuCisKKyAgLSBjb3JlLmF1dG9jcmxmIGNvbmZpZ3VyYXRpb24sIHdoZW4gc2V0IHRvICd0cnVlJywgbWFrZXMgZ2l0CisgICAgdG8gY29udmVydCBDUkxGIGF0IHRoZSBlbmQgb2YgbGluZXMgaW4gdGV4dCBmaWxlcyB0byBMRiB3aGVuCisgICAgcmVhZGluZyBmcm9tIHRoZSBmaWxlc3lzdGVtLCBhbmQgY29udmVydCBpbiByZXZlcnNlIHdoZW4KKyAgICB3cml0aW5nIHRvIHRoZSBmaWxlc3lzdGVtLiAgVGhlIHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8KKyAgICAnaW5wdXQnLCBpbiB3aGljaCBjYXNlIHRoZSBjb252ZXJzaW9uIGhhcHBlbnMgb25seSB3aGlsZQorICAgIHJlYWRpbmcgZnJvbSB0aGUgZmlsZXN5c3RlbSBidXQgZmlsZXMgYXJlIHdyaXR0ZW4gb3V0IHdpdGgKKyAgICBMRiBhdCB0aGUgZW5kIG9mIGxpbmVzLiAgQ3VycmVudGx5LCB3aGljaCBwYXRocyB0byBjb25zaWRlcgorICAgICd0ZXh0JyAoaS5lLiBiZSBzdWJqZWN0ZWQgdG8gdGhlIGF1dG9jcmxmIG1lY2hhbmlzbSkgaXMKKyAgICBkZWNpZGVkIHB1cmVseSBiYXNlZCBvbiB0aGUgY29udGVudHMsIGJ1dCB0aGUgcGxhbiBpcyB0bworICAgIGFsbG93IHVzZXJzIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgdGhpcyBoZXVyaXN0aWMgYmFzZWQgb24KKyAgICBwYXRocy4KKworICAtIFRoZSBiZWhhdmlvciBvZiAnZ2l0LWFwcGx5Jywgd2hlbiBydW4gaW4gYSBzdWJkaXJlY3RvcnksCisgICAgd2l0aG91dCAtLWluZGV4IG5vciAtLWNhY2hlZCB3ZXJlIGluY29uc2lzdGVudCB3aXRoIHRoYXQgb2YKKyAgICB0aGUgY29tbWFuZCB3aXRoIHRoZXNlIG9wdGlvbnMuICBUaGlzIHdhcyBmaXhlZCB0byBtYXRjaCB0aGUKKyAgICBiZWhhdmlvciB3aXRoIC0taW5kZXguICBBIHBhdGNoIHRoYXQgaXMgbWVhbnQgdG8gYmUgYXBwbGllZAorICAgIHdpdGggLXAxIGZyb20gdGhlIHRvcGxldmVsIG9mIHRoZSBwcm9qZWN0IHRyZWUgY2FuIGJlCisgICAgYXBwbGllZCB3aXRoIGFueSBjdXN0b20gLXA8bj4gb3B0aW9uLiAgQSBwYXRjaCB0aGF0IGlzIG5vdAorICAgIHJlbGF0aXZlIHRvIHRoZSB0b3BsZXZlbCBuZWVkcyB0byBiZSBhcHBsaWVkIHdpdGggLXA8bj4KKyAgICBvcHRpb24gd2l0aCBvciB3aXRob3V0IC0taW5kZXggKG9yIC0tY2FjaGVkKS4KKworICAtICJnaXQgZGlmZiIgb3V0cHV0cyBhIHRyYWlsaW5nIEhUIHdoZW4gcGF0aG5hbWVzIGhhdmUgZW1iZWRkZWQKKyAgICBTUCBvbiArKysvLS0tIGhlYWRlciBsaW5lcywgaW4gb3JkZXIgdG8gaGVscCAiR05VIHBhdGNoIiB0bworICAgIHBhcnNlIGl0cyBvdXRwdXQuICAiZ2l0IGFwcGx5IiB3YXMgYWxyZWFkeSB1cGRhdGVkIHRvIGFjY2VwdAorICAgIHRoaXMgbW9kaWZpZWQgb3V0cHV0IGZvcm1hdCBzaW5jZSBjZTc0NjE4ZCAoU2VwIDIyLCAyMDA2KS4KKworICAtICJnaXQgY3Zzc2VydmVyIiBydW5zIGhvb2tzL3VwZGF0ZSBhbmQgaG9ub3JzIGl0cyBleGl0IHN0YXR1cy4KKworICAtICJnaXQgY3Zzc2VydmVyIiBjYW4gYmUgdG9sZCB0byBzZW5kIGV2ZXJ5dGhpbmcgd2l0aCAta2IuCisKKyAgLSAiZ2l0IGRpZmYgLS1jaGVjayIgYWxzbyBob25vcnMgdGhlIC0tY29sb3Igb3V0cHV0IG9wdGlvbi4KKworICAtICJnaXQgbmFtZS1yZXYiIHVzZWQgdG8gc3RyZXNzIHRoZSBmYWN0IHRoYXQgYSByZWYgaXMgYSB0YWcgdG9vCisgICAgbXVjaCwgYnkgc2F5aW5nIHNvbWV0aGluZyBsaWtlICJ2MS4yLjNeMH4yMiIuICBJdCBub3cgc2F5cworICAgICJ2MS4yLjN+MjIiIGluIHN1Y2ggYSBjYXNlIChpdCBzdGlsbCBzYXlzICJ2MS4yLjNeMCIgaWYgaXQgZG9lcworICAgIG5vdCB0YWxrIGFib3V0IGFuIGFuY2VzdG9yIG9mIHRoZSBjb21taXQgdGhhdCBpcyB0YWdnZWQsIHdoaWNoCisgICAgbWFrZXMgc2Vuc2UpLgorCisgIC0gImdpdCByZXYtbGlzdCAtLWJvdW5kYXJ5IiBub3cgc2hvd3MgYm91bmRhcnkgbWFya2VycyBmb3IgdGhlCisgICAgY29tbWl0cyBvbWl0dGVkIGJ5IC0tbWF4LWFnZSBhbmQgLS1tYXgtY291bnQgY29uZGl0aW9uLgorCisgIC0gVGhlIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtIG5vdyByZWFkcyAkKHByZWZpeCkvZXRjL2dpdGNvbmZpZy4KKworICAtICJnaXQgYXBwbHkgLS12ZXJib3NlIiBzaG93cyB3aGF0IHByZWltYWdlIGxpbmVzIHdlcmUgd2FudGVkCisgICAgd2hlbiBpdCBjb3VsZG4ndCBmaW5kIHRoZW0uCisKKyAgLSAiZ2l0IHN0YXR1cyIgaW4gYSByZWFkLW9ubHkgcmVwb3NpdG9yeSBnb3QgYSBiaXQgc2FuZXIuCisKKyAgLSAiZ2l0IGZldGNoIiAoaGVuY2UgImdpdCBjbG9uZSIgYW5kICJnaXQgcHVsbCIpIGFyZSBsZXNzCisgICAgbm9pc3kgd2hlbiB0aGUgb3V0cHV0IGRvZXMgbm90IGdvIHRvIHR0eS4KKworICAtICJnaXQgZmV0Y2giIGJldHdlZW4gcmVwb3NpdG9yaWVzIHdpdGggbWFueSByZWZzIHdlcmUgc2xvdworICAgIGV2ZW4gd2hlbiB0aGVyZSBhcmUgbm90IG1hbnkgY2hhbmdlcyB0aGF0IG5lZWRlZAorICAgIHRyYW5zZmVycmluZy4gIFRoaXMgaGFzIGJlZW4gc3BlZCB1cCBieSBwYXJ0aWFsbHkgcmV3cml0aW5nCisgICAgdGhlIGhlYXZpZXN0IHBhcnRzIGluIEMuCisKKyAgLSAiZ2l0IG1haWxpbmZvIiB3aGljaCBzcGxpdHMgYW4gZS1tYWlsIGludG8gYSBwYXRjaCBhbmQgdGhlCisgICAgbWV0YS1pbmZvcm1hdGlvbiB3YXMgcmV3cml0dGVuLCB0aGFua3MgdG8gRG9uIFppY2t1cy4gIEl0CisgICAgaGFuZGxlcyBuZXN0ZWQgbXVsdGlwYXJ0IGJldHRlci4gIFRoZSBjb21tYW5kIHdhcyBicm9rZW4gZm9yCisgICAgYSBicmllZiBwZXJpb2Qgb24gJ21hc3RlcicgYnJhbmNoIHNpbmNlIDEuNS4wIGJ1dCB0aGUKKyAgICBicmVha2FnZSBpcyBmaXhlZCBub3cuCisKKyAgLSBzZW5kLWVtYWlsIGxlYXJuZWQgY29uZmlndXJhYmxlIGJjYyBhbmQgY2hhaW4tcmVwbHktdG8uCisKKyAgLSAiZ2l0IHJlbW90ZSBzaG93ICRyZW1vdGUiIGFsc28gdGFsa3MgYWJvdXQgYnJhbmNoZXMgdGhhdAorICAgIHdvdWxkIGJlIHB1c2hlZCBpZiB5b3UgcnVuICJnaXQgcHVzaCByZW1vdGUiLgorCisgIC0gVXNpbmcgb2JqZWN0cyBmcm9tIHBhY2tzIGlzIG5vdyBzZXJpb3VzbHkgb3B0aW1pemVkIGJ5IGNsZXZlcgorICAgIHVzZSBvZiBhIGNhY2hlLiAgVGhpcyBzaG91bGQgYmUgbW9zdCBub3RpY2VhYmxlIGluIGdpdC1sb2cKKyAgICBmYW1pbHkgb2YgY29tbWFuZHMgdGhhdCBpbnZvbHZlIHJlYWRpbmcgbWFueSB0cmVlIG9iamVjdHMuCisgICAgSW4gYWRkaXRpb24sIHRyYXZlcnNpbmcgcmV2aXNpb25zIHdoaWxlIGZpbHRlcmluZyBjaGFuZ2VzCisgICAgd2l0aCBwYXRoc3BlY3MgaXMgbWFkZSBmYXN0ZXIgYnkgdGVybWluYXRpbmcgdGhlIGNvbXBhcmlzb24KKyAgICBiZXR3ZWVuIHRoZSB0cmVlcyBhcyBlYXJseSBhcyBwb3NzaWJsZS4KKworCisqIEhvb2tzCisKKyAgLSBUaGUgcGFydCB0byBzZW5kIG91dCBub3RpZmljYXRpb24gZS1tYWlscyB3YXMgcmVtb3ZlZCBmcm9tCisgICAgdGhlIHNhbXBsZSB1cGRhdGUgaG9vaywgYXMgaXQgd2FzIG5vdCBhbiBhcHByb3ByaWF0ZSBwbGFjZQorICAgIHRvIGRvIHNvLiAgVGhlIHByb3BlciBwbGFjZSB0byBkbyB0aGlzIGlzIHRoZSBuZXcgcG9zdC1yZWNlaXZlCisgICAgaG9vay4gIEFuIGV4YW1wbGUgaG9vayBoYXMgYmVlbiBhZGRlZCB0byBjb250cmliL2hvb2tzLy4KKworCisqIE90aGVycworCisgIC0gZ2l0LXJldmVydCwgZ2l0LWdjIGFuZCBnaXQtY2hlcnJ5LXBpY2sgYXJlIG5vdyBidWlsdC1pbnMuCisKK0ZpeGVzIHNpbmNlIHYxLjUuMAorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIGFyZSBhbGwgaW4gdjEuNS4wLnggc2VyaWVzLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisgIC0gQ2xhcmlmaWNhdGlvbnMgYW5kIGNvcnJlY3Rpb25zIHRvIDEuNS4wIHJlbGVhc2Ugbm90ZXMuCisKKyAgLSBUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGRpZCBub3QgbGluayB0byBnaXQtcmVtb3RlIGRvY3VtZW50YXRpb24uCisKKyAgLSBDbGFyaWZpZWQgaW50cm9kdWN0b3J5IHRleHQgb2YgZ2l0LXJlYmFzZSBkb2N1bWVudGF0aW9uLgorCisgIC0gQ29udmVydGVkIHJlbWFpbmluZyBtZW50aW9ucyBvZiB1cGRhdGUtaW5kZXggb24gUG9yY2VsYWluCisgICAgZG9jdW1lbnRzIHRvIGdpdC1hZGQvZ2l0LXJtLgorCisgIC0gU29tZSBpMThuLiogY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgd2VyZSBpbmNvcnJlY3RseQorICAgIGRlc2NyaWJlZCBhcyBjb3JlLio7IGZpeGVkLgorCisgIC0gYWRkZWQgYW5kIGNsYXJpZmllZCBjb3JlLmJhcmUsIGNvcmUubGVnYWN5aGVhZGVycyBjb25maWd1cmF0aW9ucy4KKworICAtIHVwZGF0ZWQgImdpdC1jbG9uZSAtLWRlcHRoIiBkb2N1bWVudGF0aW9uLgorCisgIC0gdXNlci1tYW51YWwgdXBkYXRlcy4KKworICAtIE9wdGlvbnMgdG8gJ2dpdCByZW1vdGUgYWRkJyB3ZXJlIGRlc2NyaWJlZCBpbnN1ZmZpY2llbnRseS4KKworICAtIENvbmZpZ3VyYXRpb24gZm9ybWF0LnN1ZmZpeCB3YXMgbm90IGRvY3VtZW50ZWQuCisKKyAgLSBPdGhlciBmb3JtYXR0aW5nIGFuZCBzcGVsbGluZyBmaXhlcy4KKworICAtIHVzZXItbWFudWFsIGhhcyBiZXR0ZXIgY3Jvc3MgcmVmZXJlbmNlcy4KKworICAtIGdpdHdlYiBpbnN0YWxsYXRpb24vZGVwbG95bWVudCBwcm9jZWR1cmUgaXMgbm93IGRvY3VtZW50ZWQuCisKKworKiBCdWdmaXhlcworCisgIC0gZ2l0LXVwbG9hZC1wYWNrIGNsb3NlcyB1bnVzZWQgcGlwZSBlbmRzOyBlYXJsaWVyIHRoaXMgY2F1c2VkCisgICAgbWFueSB6b21iaWVzIHRvIGhhbmcgYXJvdW5kLgorCisgIC0gZ2l0LXJlcmVyZSB3YXMgcmVjb3JkaW5nIHRoZSBjb250ZW50cyBvZiBlYXJsaWVyIGh1bmtzCisgICAgZHVwbGljYXRlZCBpbiBsYXRlciBodW5rcy4gIFRoaXMgcHJldmVudGVkIHJlc29sdmluZyB0aGUgc2FtZQorICAgIGNvbmZsaWN0IHdoZW4gcGVyZm9ybWluZyB0aGUgc2FtZSBtZXJnZSB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworICAtIGdpdC1hZGQgYW5kIGdpdC11cGRhdGUtaW5kZXggb24gYSBmaWxlc3lzdGVtIG9uIHdoaWNoCisgICAgZXhlY3V0YWJsZSBiaXRzIGFyZSB1bnJlbGlhYmxlIGluY29ycmVjdGx5IHJldXNlZCBzdF9tb2RlCisgICAgYml0cyBldmVuIHdoZW4gdGhlIHBhdGggY2hhbmdlZCBiZXR3ZWVuIHN5bWxpbmsgYW5kIHJlZ3VsYXIKKyAgICBmaWxlLgorCisgIC0gZ2l0LWRhZW1vbiBtYXJrcyB0aGUgbGlzdGVuaW5nIHNvY2tldHMgd2l0aCBGRF9DTE9FWEVDIHNvCisgICAgdGhhdCBpdCB3b24ndCBiZSBsZWFrZWQgaW50byB0aGUgY2hpbGRyZW4uCisKKyAgLSBzZWdmYXVsdCBmcm9tIGdpdC1ibGFtZSB3aGVuIHRoZSBtYW5kYXRvcnkgcGF0aG5hbWUKKyAgICBwYXJhbWV0ZXIgd2FzIG1pc3Npbmcgd2FzIGZpeGVkOyB1c2FnZSgpIG1lc3NhZ2UgaXMgZ2l2ZW4KKyAgICBpbnN0ZWFkLgorCisgIC0gZ2l0LXJldi1saXN0IGRpZCBub3QgcmVhZCAkR0lUX0RJUi9jb25maWcgZmlsZSwgd2hpY2ggbWVhbnMKKyAgICB0aGF0IGRpZCBub3QgaG9ub3IgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBjb3JyZWN0bHkuCisKKyAgLSBBdXRvbWF0ZWQgbWVyZ2UgY29uZmxpY3QgaGFuZGxpbmcgd2hlbiBjaGFuZ2VzIHRvIHN5bWJvbGljCisgICAgbGlua3MgY29uZmxpY3RlZCB3ZXJlIGNvbXBsZXRlbHkgYnJva2VuLiAgVGhlIG1lcmdlLXJlc29sdmUKKyAgICBzdHJhdGVneSBjcmVhdGVkIGEgcmVndWxhciBmaWxlIHdpdGggY29uZmxpY3QgbWFya2VycyBpbiBpdAorICAgIGluIHBsYWNlIG9mIHRoZSBzeW1ib2xpYyBsaW5rLiAgVGhlIGRlZmF1bHQgc3RyYXRlZ3ksCisgICAgbWVyZ2UtcmVjdXJzaXZlIHdhcyBldmVuIG1vcmUgYnJva2VuLiAgSXQgcmVtb3ZlZCB0aGUgcGF0aAorICAgIHRoYXQgd2FzIHBvaW50ZWQgYXQgYnkgdGhlIHN5bWJvbGljIGxpbmsuICBCb3RoIG9mIHRoZXNlCisgICAgcHJvYmxlbXMgaGF2ZSBiZWVuIGZpeGVkLgorCisgIC0gJ2dpdCBkaWZmIG1haW50IG1hc3RlciBuZXh0JyBkaWQgbm90IGNvcnJlY3RseSBnaXZlIGNvbWJpbmVkCisgICAgZGlmZiBhY3Jvc3MgdGhyZWUgdHJlZXMuCisKKyAgLSAnZ2l0IGZhc3QtaW1wb3J0JyBwb3J0YWJpbGl0eSBmaXggZm9yIFNvbGFyaXMuCisKKyAgLSAnZ2l0IHNob3ctcmVmIC0tdmVyaWZ5JyB3aXRob3V0IGFyZ3VtZW50cyBkaWQgbm90IGVycm9yIG91dAorICAgIGJ1dCBzZWdmYXVsdGVkLgorCisgIC0gJ2dpdCBkaWZmIDp0cmFja2VkLWZpbGUgYHB3ZGAvYW4tdW50cmFja2VkLWZpbGUnIGdhdmUgYW4gZXh0cmEKKyAgICBzbGFzaGVzIGFmdGVyIGEvIGFuZCBiLy4KKworICAtICdnaXQgZm9ybWF0LXBhdGNoJyBwcm9kdWNlZCB0b28gbG9uZyBmaWxlbmFtZXMgaWYgdGhlIGNvbW1pdAorICAgIG1lc3NhZ2UgaGFkIHRvbyBsb25nIGxpbmUgYXQgdGhlIGJlZ2lubmluZy4KKworICAtIFJ1bm5pbmcgJ21ha2UgYWxsJyBhbmQgdGhlbiB3aXRob3V0IGNoYW5naW5nIGFueXRoaW5nCisgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJyBzdGlsbCByZWJ1aWx0IHNvbWUgZmlsZXMuICBUaGlzCisgICAgd2FzIGluY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIGFzIHlvdXJzZWxmIGFuZCB0aGVuCisgICAgaW5zdGFsbGluZyBhcyByb290IChlc3BlY2lhbGx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZQorICAgIGRpcmVjdG9yeSBpcyBvbiBORlMgYW5kIHJvb3QgaXMgbWFwcGVkIHRvIG5vYm9keSkuCisKKyAgLSAnZ2l0LXJlcmVyZScgZmFpbGVkIHRvIGRlYWwgd2l0aCB0d28gdW5jb25mbGljdGVkIHBhdGhzIHRoYXQKKyAgICBzb3J0ZWQgbmV4dCB0byBlYWNoIG90aGVyLgorCisgIC0gJ2dpdC1yZXJlcmUnIGF0dGVtcHRlZCB0byBvcGVuKDIpIGEgc3ltbGluayBhbmQgZmFpbGVkIGlmCisgICAgdGhlcmUgd2FzIGEgY29uZmxpY3QuICBTaW5jZSBhIGNvbmZsaWN0aW5nIGNoYW5nZSB0byBhCisgICAgc3ltbGluayB3b3VsZCBub3QgYmVuZWZpdCBmcm9tIHJlcmVyZSBhbnl3YXksIHRoZSBjb21tYW5kCisgICAgbm93IGlnbm9yZXMgY29uZmxpY3RpbmcgY2hhbmdlcyB0byBzeW1saW5rcy4KKworICAtICdnaXQtcmVwYWNrJyBkaWQgbm90IGxpa2UgdG8gcGFzcyBtb3JlIHRoYW4gNjQgYXJndW1lbnRzCisgICAgaW50ZXJuYWxseSB0byB1bmRlcmx5aW5nICdyZXYtbGlzdCcgbG9naWMsIHdoaWNoIG1hZGUgaXQKKyAgICBpbXBvc3NpYmxlIHRvIHJlcGFjayBhZnRlciBhY2N1bXVsYXRpbmcgbWFueSAoc21hbGwpIHBhY2tzCisgICAgaW4gdGhlIHJlcG9zaXRvcnkuCisKKyAgLSAnZ2l0LWRpZmYnIHRvIHJldmlldyB0aGUgY29tYmluZWQgZGlmZiBkdXJpbmcgYSBjb25mbGljdGVkCisgICAgbWVyZ2Ugd2VyZSBub3QgcmVhZGluZyB0aGUgd29ya2luZyB0cmVlIHZlcnNpb24gY29ycmVjdGx5CisgICAgd2hlbiBjaGFuZ2VzIHRvIGEgc3ltYm9saWMgbGluayBjb25mbGljdGVkLiAgSXQgc2hvdWxkIGhhdmUKKyAgICByZWFkIHRoZSBkYXRhIHVzaW5nIHJlYWRsaW5rKDIpIGJ1dCByZWFkIGZyb20gdGhlIHJlZ3VsYXIKKyAgICBmaWxlIHRoZSBzeW1ib2xpYyBsaW5rIHBvaW50ZWQgYXQuCisKKyAgLSAnZ2l0LXJlbW90ZScgZGlkIG5vdCBsaWtlIHBlcmlvZCBpbiBhIHJlbW90ZSdzIG5hbWUuCisKKyAgLSAnZ2l0LmVsJyBob25vcnMgdGhlIGNvbW1pdCBjb2Rpbmcgc3lzdGVtIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCisKKyAgLSAnYmxhbWV2aWV3JyBpbiBjb250cmliLyBjb3JyZWN0bHkgZGlncyBkZWVwZXIgd2hlbiBhIGxpbmUgaXMKKyAgICBjbGlja2VkLgorCisgIC0gJ2h0dHAtcHVzaCcgY29ycmVjdGx5IG1ha2VzIHN1cmUgdGhlIHJlbW90ZSBzaWRlIGhhcyBsZWFkaW5nCisgICAgcGF0aC4gIEVhcmxpZXIgaXQgc3RhcnRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoLCBhbmQKKyAgICBpbmNvcnJlY3RseS4KKworICAtICdnaXQtbWVyZ2UnIGRpZCBub3QgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyB3aGVuIHRoZQorICAgIHdvcmtpbmcgdHJlZSB3YXMgZGlydHkgYW5kIGNhbm5vdCBmYXN0IGZvcndhcmQuICBJdCBkb2VzCisgICAgbm93LgorCisgIC0gJ2N2c2V4cG9ydGNvbW1pdCcgZG9lcyBub3QgbG9zZSB5ZXQtdG8tYmUtdXNlZCBtZXNzYWdlIGZpbGUuCisKKyAgLSBpbnQtdnMtc2l6ZV90IHR5cGVmaXggd2hlbiBydW5uaW5nIGNvbWJpbmVkIGRpZmYgb24gZmlsZXMKKyAgICBvdmVyIDJHQiBsb25nLgorCisgIC0gJ2dpdCBhcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAnIHNob3VsZCBub3QgdG91Y2ggdW5tb2RpZmllZAorICAgIGxpbmVzLgorCisgIC0gJ2dpdC1tYWlsaW5mbycgY2hva2Ugd2hlbiBhIGxvZ2ljYWwgaGVhZGVyIGxpbmUgd2FzIHRvbyBsb25nLgorCisgIC0gJ2dpdCBzaG93IEEuLkInIGRpZCBub3QgZXJyb3Igb3V0LiAgTmVnYXRpdmUgcmVmICgibm90IEEiIGluCisgICAgdGhpcyBleGFtcGxlKSBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciB0aGUgcHVycG9zZSBvZiB0aGUKKyAgICBjb21tYW5kLCBzbyBub3cgaXQgZXJyb3JzIG91dC4KKworICAtICdnaXQgZm10LW1lcmdlLW1zZyAtLWZpbGUnIHdpdGhvdXQgZmlsZSBwYXJhbWV0ZXIgZGlkIG5vdAorICAgIGNvcnJlY3RseSBlcnJvciBvdXQuCisKKyAgLSAnZ2l0IGFyY2hpbXBvcnQnIGJhcmZlZCB1cG9uIGVuY291bnRlcmluZyBhIGNvbW1pdCB3aXRob3V0CisgICAgc3VtbWFyeS4KKworICAtICdnaXQgaW5kZXgtcGFjaycgZGlkIG5vdCBwcm90ZWN0IGl0c2VsZiBmcm9tIGdldHRpbmcgYSBzaG9ydAorICAgIHJlYWQgb3V0IG9mIHByZWFkKDIpLgorCisgIC0gJ2dpdCBodHRwLXB1c2gnIGhhZCBhIGZldyBidWZmZXIgb3ZlcnJ1bnMuCisKKyAgLSBCdWlsZCBkZXBlbmRlbmN5IGZpeGVzIHRvIHJlYnVpbGQgZmV0Y2gubyB3aGVuIG90aGVyIGhlYWRlcnMKKyAgICBjaGFuZ2UuCisKKyAgLSBnaXQuZWwgZG9lcyBub3QgYWRkIGR1cGxpY2F0ZSBzaWduLW9mZiBsaW5lcy4KKworICAtIGdpdC1jb21taXQgc2hvd3MgdGhlIGZ1bGwgc3RhdCBvZiB0aGUgcmVzdWx0aW5nIGNvbW1pdCwgbm90CisgICAganVzdCBhYm91dCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGVuIHJ1biBmcm9tCisgICAgYSBzdWJkaXJlY3RvcnkuCisKKyAgLSAiZ2l0LWNoZWNrb3V0IC1tICdAezggaG91cnMgYWdvfSciIGhhZCBhIGZ1bm55IGZhaWx1cmUgZnJvbQorICAgIGV2YWw7IGZpeGVkLgorCisgIC0gZ2l0LW1lcmdlIChoZW5jZSBnaXQtcHVsbCkgZGlkIG5vdCByZWZ1c2UgZmFzdC1mb3J3YXJkaW5nCisgICAgd2hlbiB0aGUgd29ya2luZyB0cmVlIGhhZCBsb2NhbCBjaGFuZ2VzIHRoYXQgd291bGQgaGF2ZQorICAgIGNvbmZsaWN0ZWQgd2l0aCBpdC4KKworICAtIGEgaGFuZGZ1bCBzbWFsbCBmaXhlcyB0byBnaXR3ZWIuCisKKyAgLSBidWlsZCBwcm9jZWR1cmUgZm9yIHVzZXItbWFudWFsIGlzIGZpeGVkIG5vdCB0byByZXF1aXJlIGxvY2FsbHkKKyAgICBpbnN0YWxsZWQgc3R5bGVzaGVldHMuCisKKyAgLSAiZ2l0IGNvbW1pdCAkcGF0aHMiIG9uIHBhdGhzIHdob3NlIGVhcmxpZXIgY29udGVudHMgd2VyZQorICAgIGFscmVhZHkgdXBkYXRlZCBpbiB0aGUgaW5kZXggd2VyZSBmYWlsaW5nIG91dC4KKworCisqIFR3ZWFrcworCisgIC0gc2xpZGluZyBtbWFwKCkgaW5lZmZpY2llbnRseSBtbWFwZWQgdGhlIHNhbWUgcmVnaW9uIG9mIGEKKyAgICBwYWNrZmlsZSB3aXRoIGFuIGFjY2VzcyBwYXR0ZXJuIHRoYXQgdXNlZCBvYmplY3RzIGluIHRoZQorICAgIHJldmVyc2Ugb3JkZXIuICBUaGlzIGhhcyBiZWVuIG1hZGUgbW9yZSBlZmZpY2llbnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYyMGUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4xLnR4dApAQCAtMCwwICsxLDUzIEBACitHSVQgdjEuNS4yLjEgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4yCistLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gVGVtcG9yYXJ5IGZpbGVzIHRoYXQgYXJlIHVzZWQgd2hlbiBpbnZva2luZyBleHRlcm5hbCBkaWZmCisgICAgcHJvZ3JhbXMgZGlkIG5vdCB0b2xlcmF0ZSBhIGxvbmcgVE1QRElSLgorCisgIC0gZ2l0LWRhZW1vbiBkaWQgbm90IG5vdGljZSB3aGVuIGl0IGNvdWxkIG5vdCB3cml0ZSBpbnRvIGl0cworICAgIHBpZCBmaWxlLgorCisgIC0gZ2l0LXN0YXR1cyBkaWQgbm90IGhvbm9yIGNvcmUuZXhjbHVkZXNGaWxlIGNvbmZpZ3VyYXRpb24gbGlrZQorICAgIGdpdC1hZGQgZGlkLgorCisgIC0gZ2l0LWFubm90YXRlIGRpZCBub3Qgd29yayBmcm9tIGEgc3ViZGlyZWN0b3J5IHdoaWxlCisgICAgZ2l0LWJsYW1lIGRpZC4KKworICAtIGdpdC1jdnNzZXJ2ZXIgc2hvdWxkIGhhdmUgZGlzYWJsZWQgYWNjZXNzIHRvIGEgcmVwb3NpdG9yeQorICAgIHdpdGggImdpdGN2cy5wc2VydmVyLmVuYWJsZWQgPSBmYWxzZSIgc2V0IGV2ZW4gd2hlbgorICAgICJnaXRjdnMuZW5hYmxlZCA9IHRydWUiIHdhcyBzZXQgYXQgdGhlIHNhbWUgdGltZS4gIEl0CisgICAgZGlkbid0LgorCisgIC0gZ2l0LWN2c2ltcG9ydCBkaWQgbm90IHdvcmsgY29ycmVjdGx5IGluIGEgcmVwb3NpdG9yeSB3aXRoCisgICAgaXRzIGJyYW5jaCBoZWFkcyB3ZXJlIHBhY2tlZCB3aXRoIHBhY2stcmVmcy4KKworICAtIGlkZW50IHVuZXhwYW5zaW9uIHRvIHNxdWFzaCAiJElkOiB4eHggJCIgdGhhdCBpcyBpbiB0aGUKKyAgICByZXBvc2l0b3J5IGNvcHkgcmVtb3ZlZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzLgorCisgIC0gZ2l0LXN2biBtaXNiZWhhdmVkIHdoZW4gdGhlIHN1YnZlcnNpb24gcmVwb3NpdG9yeSBkaWQgbm90CisgICAgcHJvdmlkZSBNRDUgY2hlY2tzdW1zIGZvciBmaWxlcy4KKworICAtIGdpdCByZWJhc2UgKGFuZCBnaXQgYW0pIG1pc2JlaGF2ZWQgb24gY29tbWl0cyB0aGF0IGhhdmUgJ1xuJworICAgIChsaXRlcmFsbHkgYmFja3NsYXNoIGFuZCBlbiwgbm90IGEgbGluZWZlZWQpIGluIHRoZSB0aXRsZS4KKworICAtIGNvZGUgdG8gZGVjb2RlIGJhc2U4NSB1c2VkIGluIGJpbmFyeSBwYXRjaGVzIGhhZCBvbmUgZXJyb3IKKyAgICByZXR1cm4gY29kZXBhdGggd3JvbmcuCisKKyAgLSBSRkMyMDQ3IFEgZW5jb2Rpbmcgb3V0cHV0IGJ5IGdpdC1mb3JtYXQtcGF0Y2ggdXNlZCAnXycgZm9yIGEKKyAgICBzcGFjZSwgd2hpY2ggaXMgbm90IHVuZGVyc3Rvb2QgYnkgc29tZSBwcm9ncmFtcy4gIEl0IHVzZXMgPTIwCisgICAgd2hpY2ggaXMgc2FmZXIuCisKKyAgLSBnaXQtZmFzdGltcG9ydCAtLWltcG9ydC1tYXJrcyB3YXMgYnJva2VuOyBmaXhlZC4KKworICAtIEEgbG90IG9mIGRvY3VtZW50YXRpb24gdXBkYXRlcywgY2xhcmlmaWNhdGlvbnMgYW5kIGZpeGVzLgorCistLQorZXhlYyA+L3Zhci90bXAvMQorTz12MS41LjItNjUtZzk5NmUyZDYKK2VjaG8gTz1gZ2l0IGRlc2NyaWJlIHJlZnMvaGVhZHMvbWFpbnRgCitnaXQgc2hvcnRsb2cgLS1uby1tZXJnZXMgJE8uLnJlZnMvaGVhZHMvbWFpbnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuMi50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzkzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjIudHh0CkBAIC0wLDAgKzEsNjEgQEAKK0dJVCB2MS41LjIuMiBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjIuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBVc2FiaWxpdHkgZml4CisKKyAgLSBnaXQtZ3VpIGlzIHNoaXBwZWQgd2l0aCBpdHMgdXBkYXRlZCBibGFtZSBpbnRlcmZhY2UuICBJdCBpcworICAgIHJ1bW9yZWQgdGhhdCB0aGUgb2xkZXIgb25lIHdhcyBub3QganVzdCB1bnVzYWJsZSBidXQgd2FzCisgICAgYWN0aXZlIGhlYWx0aCBoYXphcmQsIGJ1dCB0aGlzIG9uZSBpcyBhY3R1YWxseSBwcmV0dHkuCisgICAgUGxlYXNlIHNlZSBmb3IgeW91cnNlbGYuCisKKyogQnVnZml4ZXMKKworICAtICJnaXQgY2hlY2tvdXQgZnViYXIiIHdhcyB1dHRlcmx5IGNvbmZ1c2VkIHdoZW4gdGhlcmUgaXMgYQorICAgIGJyYW5jaCBmdWJhciBhbmQgYSB0YWcgZnViYXIgYXQgdGhlIHNhbWUgdGltZS4gIEl0IGNvcnJlY3RseQorICAgIGNoZWNrcyBvdXQgdGhlIGJyYW5jaCBmdWJhciBub3cuCisKKyAgLSAiZ2l0IGNsb25lIC9wYXRoL2ZvbyIgdG8gY2xvbmUgYSBsb2NhbCAvcGF0aC9mb28uZ2l0CisgICAgcmVwb3NpdG9yeSBsZWZ0IGFuIGluY29ycmVjdCBjb25maWd1cmF0aW9uLgorCisgIC0gImdpdCBzZW5kLWVtYWlsIiBjb3JyZWN0bHkgdW5xdW90ZXMgUkZDIDIwNDcgcXVvdGVkIG5hbWVzIGluCisgICAgdGhlIHBhdGNoLWVtYWlsIGJlZm9yZSB1c2luZyB0aGVpciB2YWx1ZXMuCisKKyAgLSBXZSBkaWQgbm90IGFjY2VwdCBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBlcG9jaCBvbGRlciB0aGFuCisgICAgeWVhciAyMDAwIGFzIGEgdmFsaWQgdGltZXN0YW1wLiAgV2Ugbm93IGludGVycHJldCBwb3NpdGl2ZQorICAgIGludGVnZXJzIG1vcmUgdGhhbiA4IGRpZ2l0cyBhcyBzdWNoLCB3aGljaCBhbGxvd3MgdXMgdG8KKyAgICBleHByZXNzIHRpbWVzdGFtcHMgbW9yZSByZWNlbnQgdGhhbiBNYXJjaCAxOTczLgorCisgIC0gZ2l0LWN2c2ltcG9ydCBkaWQgbm90IHdvcmsgd2hlbiB5b3UgaGF2ZSBHSVRfRElSIHRvIHBvaW50CisgICAgeW91ciByZXBvc2l0b3J5IGF0IGEgbm9uc3RhbmRhcmQgbG9jYXRpb24uCisKKyAgLSBTb21lIHN5c3RlbXMgKG5vdGFibHksIFNvbGFyaXMpIGxhY2sgaHN0cmVycm9yKCkgdG8gbWFrZQorICAgIGhfZXJybm8gaHVtYW4gcmVhZGFibGU7IHByZXBhcmUgYSByZXBsYWNlbWVudAorICAgIGltcGxlbWVudGF0aW9uLgorCisgIC0gLmdpdGlnbm9yZSBmaWxlIGxpc3RlZCBnaXQtY29yZS5zcGVjIGJ1dCB3aGF0IHdlIGdlbmVyYXRlIGlzCisgICAgZ2l0LnNwZWMsIGFuZCBub2JvZHkgbm90aWNlZCBmb3IgYSBsb25nIHRpbWUuCisKKyAgLSAiZ2l0LW1lcmdlLXJlY3Vyc2l2ZSIgZG9lcyBub3QgdHJ5IHRvIHJ1biBmaWxlIGxldmVsIG1lcmdlCisgICAgb24gYmluYXJ5IGZpbGVzLgorCisgIC0gImdpdC1icmFuY2ggLS10cmFjayIgZGlkIG5vdCBjcmVhdGUgdHJhY2tpbmcgY29uZmlndXJhdGlvbgorICAgIGNvcnJlY3RseSB3aGVuIHRoZSBicmFuY2ggbmFtZSBoYWQgc2xhc2ggaW4gaXQuCisKKyAgLSBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlciBzcGVjaWZpZWQgd2l0aCB1c2VyLmVtYWlsCisgICAgY29uZmlndXJhdGlvbiB3YXMgb3ZlcnJpZGVuIGJ5IEVNQUlMIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisgIC0gVGhlIHRyZWUgcGFyc2VyIGRpZCBub3Qgd2FybiBhYm91dCB0cmVlIGVudHJpZXMgd2l0aAorICAgIG5vbnNlbnNlIGZpbGUgbW9kZXMsIGFuZCBhc3N1bWVkIHRoZXkgbXVzdCBiZSBibG9icy4KKworICAtICJnaXQgbG9nIC16IiB3aXRob3V0IGFueSBvdGhlciByZXF1ZXN0IHRvIGdlbmVyYXRlIGRpZmYgc3RpbGwKKyAgICBpbnZva2VkIHRoZSBkaWZmIG1hY2hpbmVyeSwgd2FzdGluZyBjeWNsZXMuCisKKyogRG9jdW1lbnRhdGlvbgorCisgIC0gTWFueSB1cGRhdGVzIHRvIGZpeCBzdGFsZSBvciBtaXNzaW5nIGRvY3VtZW50YXRpb24uCisKKyAgLSBBbHRob3VnaCBvdXIgZG9jdW1lbnRhdGlvbiB3YXMgcHJpbWFyaWx5IG1lYW50IHRvIGJlIGZvcm1hdHRlZAorICAgIHdpdGggQXNjaWlEb2M3LCBmb3JtYXR0aW5nIHdpdGggQXNjaWlEb2M4IGlzIHN1cHBvcnRlZCBiZXR0ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjMudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRiMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4zLnR4dApAQCAtMCwwICsxLDI3IEBACitHSVQgdjEuNS4yLjMgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4yLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIEJ1Z2ZpeGVzCisKKyAgIC0gVmVyc2lvbiAyIHBhY2sgaW5kZXggZm9ybWF0IHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS41LjIKKyAgICAgdG8gc3VwcG9ydCBwYWNrIGZpbGVzIHRoYXQgaGFzIG9mZnNldCB0aGF0IGNhbm5vdCBiZQorICAgICByZXByZXNlbnRlZCBpbiAzMi1iaXQuICBUaGUgcnVudGltZSBjb2RlIHRvIHZhbGlkYXRlIHN1Y2gKKyAgICAgYW4gaW5kZXggbWlzaGFuZGxlZCBzdWNoIGFuIGluZGV4IGZvciBhbiBlbXB0eSBwYWNrLgorCisgICAtIENvbW1pdCB3YWxrZXJzIChtb3N0IG5vdGFibHksIGZldGNoIG92ZXIgaHR0cCBwcm90b2NvbCkKKyAgICAgdHJpZWQgdG8gdHJhdmVyc2UgY29tbWl0IG9iamVjdHMgY29udGFpbmVkIGluIHRyZWVzIChha2EKKyAgICAgc3VicHJvamVjdCk7IHRoZXkgc2hvdWxkbid0LgorCisgICAtIEEgYnVpbGQgb3B0aW9uIE5PX1JfVE9fR0NDX0xJTktFUiB3YXMgbm90IGV4cGxhaW5lZCBpbiBNYWtlZmlsZQorICAgICBjb21tZW50IGNvcnJlY3RseS4KKworICogRG9jdW1lbnRhdGlvbiBGaXhlcyBhbmQgVXBkYXRlcworCisgICAtIGdpdC1jb25maWcgLS1yZWdleHAgd2FzIG5vdCBkb2N1bWVudGVkIHByb3Blcmx5LgorCisgICAtIGdpdC1yZXBhY2sgLWEgd2FzIG5vdCBkb2N1bWVudGVkIHByb3Blcmx5LgorCisgICAtIGdpdC1yZW1vdGUgLW4gd2FzIG5vdCBkb2N1bWVudGVkIHByb3Blcmx5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk1NzE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi50eHQKQEAgLTAsMCArMSwxOTcgQEAKK0dJVCB2MS41LjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09CisKK1VwZGF0ZXMgc2luY2UgdjEuNS4xCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFBsdW1iaW5nIGxldmVsIHN1cGVycHJvamVjdCBzdXBwb3J0LgorCisgIFlvdSBjYW4gaW5jbHVkZSBhIHN1YmRpcmVjdG9yeSB0aGF0IGhhcyBhbiBpbmRlcGVuZGVudCBnaXQKKyAgcmVwb3NpdG9yeSBpbiB5b3VyIGluZGV4IGFuZCB0cmVlIG9iamVjdHMgb2YgeW91ciBwcm9qZWN0CisgICgic3VwZXJwcm9qZWN0IikuICBUaGlzIHBsdW1iaW5nIChpLmUuICJjb3JlIikgbGV2ZWwKKyAgc3VwZXJwcm9qZWN0IHN1cHBvcnQgZXhwbGljaXRseSBleGNsdWRlcyByZWN1cnNpdmUgYmVoYXZpb3VyLgorCisgIFRoZSAic3VicHJvamVjdCIgZW50cmllcyBpbiB0aGUgaW5kZXggYW5kIHRyZWVzIG9mIGEgc3VwZXJwcm9qZWN0CisgIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBnaXQuICBFeHBlcmltZW50aW5nIHdpdGgKKyAgdGhlIHBsdW1iaW5nIGxldmVsIHN1cHBvcnQgaXMgZW5jb3VyYWdlZCwgYnV0IGJlIHdhcm5lZCB0aGF0CisgIHVubGVzcyBldmVyeWJvZHkgaW4geW91ciBwcm9qZWN0IHVwZGF0ZXMgdG8gdGhpcyByZWxlYXNlIG9yCisgIGxhdGVyLCB1c2luZyB0aGlzIGZlYXR1cmUgd291bGQgbWFrZSB5b3VyIHByb2plY3QKKyAgaW5hY2Nlc3NpYmxlIGJ5IHBlb3BsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGdpdC4KKworKiBQbHVtYmluZyBsZXZlbCBnaXRhdHRyaWJ1dGVzIHN1cHBvcnQuCisKKyAgVGhlIGdpdGF0dHJpYnV0ZXMgbWVjaGFuaXNtIGFsbG93cyB5b3UgdG8gYWRkICdhdHRyaWJ1dGVzJyB0bworICBwYXRocyBpbiB5b3VyIHByb2plY3QsIGFuZCBhZmZlY3QgdGhlIHdheSBjZXJ0YWluIGdpdAorICBvcGVyYXRpb25zIHdvcmsuICBDdXJyZW50bHkgeW91IGNhbiBpbmZsdWVuY2UgaWYgYSBwYXRoIGlzCisgIGNvbnNpZGVyZWQgYSBiaW5hcnkgb3IgdGV4dCAodGhlIGZvcm1lciB3b3VsZCBiZSB0cmVhdGVkIGJ5CisgICdnaXQgZGlmZicgbm90IHRvIHByb2R1Y2UgdGV4dHVhbCBvdXRwdXQ7IHRoZSBsYXR0ZXIgY2FuIGdvCisgIHRocm91Z2ggdGhlIGxpbmUgZW5kaW5ncyBjb252ZXJzaW9uIHByb2Nlc3MgaW4gcmVwb3NpdG9yaWVzCisgIHdpdGggY29yZS5hdXRvY3JsZiBzZXQpLCBleHBhbmQgYW5kIHVuZXhwYW5kICckSWQkJyBrZXl3b3JkCisgIHdpdGggYmxvYiBvYmplY3QgbmFtZSwgc3BlY2lmeSBhIGN1c3RvbSAzLXdheSBtZXJnZSBkcml2ZXIsCisgIGFuZCBzcGVjaWZ5IGEgY3VzdG9tIGRpZmYgZHJpdmVyLiAgWW91IGNhbiBhbHNvIGFwcGx5CisgIGFyYml0cmFyeSBmaWx0ZXIgdG8gY29udGVudHMgb24gY2hlY2staW4vY2hlY2stb3V0IGNvZGVwYXRoCisgIGJ1dCB0aGlzIGZlYXR1cmUgaXMgYW4gZXh0cmVtZWx5IHNoYXJwLWVkZ2VkIHJhem9yIGFuZCBuZWVkcworICB0byBiZSBoYW5kbGVkIHdpdGggY2F1dGlvbiAoZG8gbm90IHVzZSBpdCB1bmxlc3MgeW91CisgIHVuZGVyc3RhbmQgdGhlIGVhcmxpZXIgbWFpbGluZyBsaXN0IGRpc2N1c3Npb24gb24ga2V5d29yZAorICBleHBhbnNpb24pLiAgVGhlc2UgY29udmVyc2lvbnMgYXBwbHkgd2hlbiBjaGVja2luZyBmaWxlcyBpbgorICBvciBvdXQsIGFuZCBleHBvcnRpbmcgdmlhIGdpdC1hcmNoaXZlLgorCisqIFRoZSBwYWNrZmlsZSBmb3JtYXQgbm93IG9wdGlvbmFsbHkgc3Vwb3J0cyA2NC1iaXQgaW5kZXguCisKKyAgVGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSAidmVyc2lvbiAyIiBmb3JtYXQgb2YgdGhlIC5pZHgKKyAgZmlsZS4gIFRoaXMgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIHdoZW4gYSBodWdlIHBhY2tmaWxlCisgIG5lZWRzIG1vcmUgdGhhbiAzMi1iaXQgdG8gZXhwcmVzcyBvZmZzZXRzIG9mIG9iamVjdHMgaW4gdGhlCisgIHBhY2suCisKKyogQ29tZXMgd2l0aCBhbiB1cGRhdGVkIGdpdC1ndWkgMC43LjEKKworKiBVcGRhdGVkIGdpdHdlYjoKKworICAtIGNhbiBzaG93IGNvbWJpbmVkIGRpZmYgZm9yIG1lcmdlczsKKyAgLSB1c2VzIGZvbnQgc2l6ZSBvZiB1c2VyJ3MgcHJlZmVyZW5jZSwgbm90IGhhcmRjb2RlZCBpbiBwaXhlbHM7CisgIC0gY2FuIG5vdyAnZ3JlcCc7CisKKyogTmV3IGNvbW1hbmRzIGFuZCBvcHRpb25zLgorCisgIC0gImdpdCBiaXNlY3Qgc3RhcnQiIGNhbiBvcHRpb25hbGx5IHRha2UgYSBzaW5nbGUgYmFkIGNvbW1pdCBhbmQKKyAgICB6ZXJvIG9yIG1vcmUgZ29vZCBjb21taXRzIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyAgLSAiZ2l0IHNob3J0bG9nIiBjYW4gb3B0aW9uYWxseSBiZSB0b2xkIHRvIHdyYXAgaXRzIG91dHB1dC4KKworICAtICJzdWJ0cmVlIiBtZXJnZSBzdHJhdGVneSBhbGxvd3MgYW5vdGhlciBwcm9qZWN0IHRvIGJlIG1lcmdlZCBpbiBhcworICAgIHlvdXIgc3ViZGlyZWN0b3J5LgorCisgIC0gImdpdCBmb3JtYXQtcGF0Y2giIGxlYXJuZWQgYSBuZXcgLS1zdWJqZWN0LXByZWZpeD08c3RyaW5nPgorICAgIG9wdGlvbiwgdG8gb3ZlcnJpZGUgdGhlIGJ1aWx0LWluICJbUEFUQ0hdIi4KKworICAtICJnaXQgYWRkIC11IiBpcyBhIHF1aWNrIHdheSB0byBkbyB0aGUgZmlyc3Qgc3RhZ2Ugb2YgImdpdAorICAgIGNvbW1pdCAtYSIgKGkuZS4gdXBkYXRlIHRoZSBpbmRleCB0byBtYXRjaCB0aGUgd29ya2luZworICAgIHRyZWUpOyBpdCBvYnZpb3VzbHkgZG9lcyBub3QgbWFrZSBhIGNvbW1pdC4KKworICAtICJnaXQgY2xlYW4iIGhvbm9ycyBhIG5ldyBjb25maWd1cmF0aW9uLCAiY2xlYW4ucmVxdWlyZWZvcmNlIi4gIFdoZW4KKyAgICBzZXQgdG8gdHJ1ZSwgdGhpcyBtYWtlcyAiZ2l0IGNsZWFuIiBhIG5vLW9wLCBwcmV2ZW50aW5nIHlvdQorICAgIGZyb20gbG9zaW5nIGZpbGVzIGJ5IHR5cGluZyAiZ2l0IGNsZWFuIiB3aGVuIHlvdSBtZWFudCB0bworICAgIHNheSAibWFrZSBjbGVhbiIuICBZb3UgY2FuIHN0aWxsIHNheSAiZ2l0IGNsZWFuIC1mIiB0bworICAgIG92ZXJyaWRlIHRoaXMuCisKKyAgLSAiZ2l0IGxvZyIgZmFtaWx5IG9mIGNvbW1hbmRzIGxlYXJuZWQgLS1kYXRlPXtsb2NhbCxyZWxhdGl2ZSxkZWZhdWx0fQorICAgIG9wdGlvbi4gIC0tZGF0ZT1yZWxhdGl2ZSBpcyBzeW5vbnltIHRvIHRoZSAtLXJlbGF0aXZlLWRhdGUuCisgICAgLS1kYXRlPWxvY2FsIGdpdmVzIHRoZSB0aW1lc3RhbXAgaW4gbG9jYWwgdGltZXpvbmUuCisKKyogVXBkYXRlZCBiZWhhdmlvciBvZiBleGlzdGluZyBjb21tYW5kcy4KKworICAtIFdoZW4gJEdJVF9DT01NSVRURVJfRU1BSUwgb3IgJEdJVF9BVVRIT1JfRU1BSUwgaXMgbm90IHNldAorICAgIGJ1dCAkRU1BSUwgaXMgc2V0LCB0aGUgbGF0dGVyIGlzIHVzZWQgYXMgYSBzdWJzdGl0dXRlLgorCisgIC0gImdpdCBkaWZmIC0tc3RhdCIgc2hvd3Mgc2l6ZSBvZiBwcmVpbWFnZSBhbmQgcG9zdGltYWdlIGJsb2JzCisgICAgZm9yIGJpbmFyeSBjb250ZW50cy4gIEVhcmxpZXIgaXQgb25seSBzYWlkICJCaW4iLgorCisgIC0gImdpdCBsb3N0LWZvdW5kIiBzaG93cyBzdHVmZiB0aGF0IGFyZSB1bnJlYWNoYWJsZSBleGNlcHQKKyAgICBmcm9tIHJlZmxvZ3MuCisKKyAgLSAiZ2l0IGNoZWNrb3V0IGJyYW5jaF4wIiBub3cgZGV0YWNoZXMgSEVBRCBhdCB0aGUgdGlwIGNvbW1pdAorICAgIG9uIHRoZSBuYW1lZCBicmFuY2gsIGluc3RlYWQgb2YganVzdCBzd2l0Y2hpbmcgdG8gdGhlCisgICAgYnJhbmNoICh1c2UgImdpdCBjaGVja291dCBicmFuY2giIHRvIHN3aXRjaCB0byB0aGUgYnJhbmNoLAorICAgIGFzIGJlZm9yZSkuCisKKyAgLSAiZ2l0IGJpc2VjdCBuZXh0IiBjYW4gYmUgdXNlZCBhZnRlciBnaXZpbmcgb25seSBhIGJhZCBjb21taXQKKyAgICB3aXRob3V0IGdpdmluZyBhIGdvb2Qgb25lICh0aGlzIHN0YXJ0cyBiaXNlY3Rpb24gaGFsZi13YXkgdG8KKyAgICB0aGUgcm9vdCBjb21taXQpLiAgV2UgdXNlZCB0byByZWZ1c2UgdG8gb3BlcmF0ZSB3aXRob3V0IGEKKyAgICBnb29kIGFuZCBhIGJhZCBjb21taXQuCisKKyAgLSAiZ2l0IHB1c2giLCB3aGVuIHB1c2hpbmcgaW50byBtb3JlIHRoYW4gb25lIHJlcG9zaXRvcnksIGRvZXMKKyAgICBub3Qgc3RvcCBhdCB0aGUgZmlyc3QgZXJyb3IuCisKKyAgLSAiZ2l0IGFyY2hpdmUiIGRvZXMgbm90IGluc2lzdCB5b3UgdG8gZ2l2ZSAtLWZvcm1hdCBwYXJhbWV0ZXIKKyAgICBhbnltb3JlOyBpdCBkZWZhdWx0cyB0byAidGFyIi4KKworICAtICJnaXQgY3Zzc2VydmVyIiBjYW4gdXNlIGJhY2tlbmRzIG90aGVyIHRoYW4gc3FsaXRlLgorCisgIC0gImdpdHZpZXciIChpbiBjb250cmliLyBzZWN0aW9uKSBsZWFybmVkIHRvIGJldHRlciBzdXBwb3J0CisgICAgImdpdC1hbm5vdGF0ZSIuCisKKyAgLSAiZ2l0IGRpZmYgJGNvbW1pdDE6JHBhdGgyICRjb21taXQyOiRwYXRoMiIgY2FuIG5vdyByZXBvcnQKKyAgICBtb2RlIGNoYW5nZXMgYmV0d2VlbiB0aGUgdHdvIGJsb2JzLgorCisgIC0gTG9jYWwgImdpdCBmZXRjaCIgZnJvbSBhIHJlcG9zaXRvcnkgd2hvc2Ugb2JqZWN0IHN0b3JlIGlzCisgICAgb25lIG9mIHRoZSBhbHRlcm5hdGVzIChlLmcuIGZldGNoaW5nIGZyb20gdGhlIG9yaWdpbiBpbiBhCisgICAgcmVwb3NpdG9yeSBjcmVhdGVkIHdpdGggImdpdCBjbG9uZSAtbCAtcyIpIGF2b2lkcworICAgIGRvd25sb2FkaW5nIG9iamVjdHMgdW5uZWNlc3NhcmlseS4KKworICAtICJnaXQgYmxhbWUiIHVzZXMgLm1haWxtYXAgdG8gY2Fub25pY2FsaXplIHRoZSBhdXRob3IgbmFtZQorICAgIGp1c3QgbGlrZSAiZ2l0IHNob3J0bG9nIiBkb2VzLgorCisgIC0gImdpdCBwYWNrLW9iamVjdHMiIHBheXMgYXR0ZW50aW9uIHRvIHBhY2suZGVwdGgKKyAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlLgorCisgIC0gImdpdCBjaGVycnktcGljayIgYW5kICJnaXQgcmV2ZXJ0IiBkb2VzIG5vdCB1c2UgLm1zZyBmaWxlIGluCisgICAgdGhlIHdvcmtpbmcgdHJlZSB0byBwcmVwYXJlIGNvbW1pdCBtZXNzYWdlOyBpbnN0ZWFkIGl0IHVzZXMKKyAgICAkR0lUX0RJUi9NRVJHRV9NU0cgYXMgb3RoZXIgY29tbWFuZHMgZG8uCisKKyogQnVpbGRzCisKKyAgLSBnaXQtcDRpbXBvcnQgaGFzIG5ldmVyIGJlZW4gaW5zdGFsbGVkOyBub3cgdGhlcmUgaXMgYW4KKyAgICBpbnN0YWxsYXRpb24gb3B0aW9uIHRvIGRvIHNvLgorCisgIC0gZ2l0ayBhbmQgZ2l0LWd1aSBjYW4gYmUgY29uZmlndXJlZCBvdXQuCisKKyAgLSBHZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBwYWdlcyBhdXRvbWF0aWNhbGx5IGdldCB2ZXJzaW9uCisgICAgaW5mb3JtYXRpb24gZnJvbSBHSVRfVkVSU0lPTi4KKworICAtIFBhcmFsbGVsIGJ1aWxkIHdpdGggIm1ha2UgLWoiIGRlc2NlbmRpbmcgaW50byBzdWJkaXJlY3RvcnkKKyAgICB3YXMgZml4ZWQuCisKKyogUGVyZm9ybWFuY2UgVHdlYWtzCisKKyAgLSBPcHRpbWl6ZWQgImdpdC1yZXYtbGlzdCAtLWJpc2VjdCIgKGhlbmNlICJnaXQtYmlzZWN0IikuCisKKyAgLSBPcHRpbWl6ZWQgImdpdC1hZGQgJHBhdGgiIGluIGEgbGFyZ2UgZGlyZWN0b3J5LCBtb3N0IG9mCisgICAgd2hvc2UgY29udGVudHMgYXJlIGlnbm9yZWQuCisKKyAgLSBPcHRpbWl6ZWQgImdpdC1kaWZmLXRyZWUiIGZvciByZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQuCisKKyAgLSBUaGUgcmVjdXJzaXZlIG1lcmdlIHN0cmF0ZWd5IHVwZGF0ZWQgYSB3b3JrdHJlZSBmaWxlIHRoYXQKKyAgICB3YXMgY2hhbmdlZCBpZGVudGljYWxseSBpbiB0d28gYnJhbmNoZXMsIHdoZW4gb25lIG9mIHRoZW0KKyAgICByZW5hbWVkIGl0LiAgV2UgZG8gbm90IGRvIHRoYXQgd2hlbiB0aGVyZSBpcyBubyByZW5hbWUsIHNvCisgICAgbWF0Y2ggdGhhdCBiZWhhdmlvdXIuICBUaGlzIGF2b2lkcyBleGNlc3NpdmUgcmVidWlsZHMuCisKKyAgLSBUaGUgZGVmYXVsdCBwYWNrIGRlcHRoIGhhcyBiZWVuIGluY3JlYXNlZCB0byA1MCwgYXMgdGhlCisgICAgcmVjZW50IGFkZGl0aW9uIG9mIGRlbHRhX2Jhc2VfY2FjaGUgbWFrZXMgZGVlcGVyIGRlbHRhIGNoYWlucworICAgIG11Y2ggbGVzcyBleHBlbnNpdmUgdG8gYWNjZXNzLiAgRGVwZW5kaW5nIG9uIHRoZSBwcm9qZWN0LCBpdCB3YXMKKyAgICByZXBvcnRlZCB0aGF0IHRoaXMgcmVkdWNlcyB0aGUgcmVzdWx0aW5nIHBhY2sgZmlsZSBieSAxMCUKKyAgICBvciBzby4KKworCitGaXhlcyBzaW5jZSB2MS41LjEKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgb2YgdGhlIGZpeGVzIGluIHYxLjUuMSBtYWludGVuYW5jZSBzZXJpZXMgYXJlIGluY2x1ZGVkIGluCit0aGlzIHJlbGVhc2UsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQuCisKKyogQnVnZml4ZXMKKworICAtIFN3aXRjaGluZyBicmFuY2hlcyB3aXRoICJnaXQgY2hlY2tvdXQiIHJlZnVzZWQgdG8gd29yayB3aGVuCisgICAgYSBwYXRoIGNoYW5nZXMgZnJvbSBhIGZpbGUgdG8gYSBkaXJlY3RvcnkgYmV0d2VlbiB0aGUKKyAgICBjdXJyZW50IGJyYW5jaCBhbmQgdGhlIG5ldyBicmFuY2gsIGluIG9yZGVyIG5vdCB0byBsb3NlCisgICAgcG9zc2libGUgbG9jYWwgY2hhbmdlcyBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgYmVpbmcgdHVybmVkCisgICAgaW50byBhIGZpbGUgd2l0aCB0aGUgc3dpdGNoLiAgV2Ugbm93IGFsbG93IHN1Y2ggYSBicmFuY2gKKyAgICBzd2l0Y2ggYWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBsb2NhbGx5IG1vZGlmaWVkCisgICAgZmlsZSBub3IgdW4taWdub3JlZCBmaWxlIGluIHRoZSBkaXJlY3RvcnkuICBUaGlzIGhhcyBub3QKKyAgICBiZWVuIGJhY2twb3J0ZWQgdG8gMS41LjEueCBzZXJpZXMsIGFzIGl0IGlzIHJhdGhlciBhbgorICAgIGludHJ1c2l2ZSBjaGFuZ2UuCisKKyAgLSBNZXJnaW5nIGJyYW5jaGVzIHRoYXQgaGF2ZSBhIGZpbGUgaW4gb25lIGFuZCBhIGRpcmVjdG9yeSBpbgorICAgIGFub3RoZXIgYXQgdGhlIHNhbWUgcGF0aCB1c2VkIHRvIGdldCBxdWl0ZSBjb25mdXNlZC4gIFdlCisgICAgaGFuZGxlIHN1Y2ggYSBjYXNlIGEgYml0IG1vcmUgY2FyZWZ1bGx5LCBldmVuIHRob3VnaCB0aGF0IGlzCisgICAgc3RpbGwgbGVmdCBhcyBhIGNvbmZsaWN0IGZvciB0aGUgdXNlciB0byBzb3J0IG91dC4gIFRoaXMKKyAgICB3aWxsIG5vdCBiZSBiYWNrcG9ydGVkIHRvIDEuNS4xLnggc2VyaWVzLCBhcyBpdCBpcyByYXRoZXIgYW4KKyAgICBpbnRydXNpdmUgY2hhbmdlLgorCisgIC0gZ2l0LWZldGNoIGhhZCB0cm91YmxlIHdpdGggYSByZW1vdGUgd2l0aCBpbnNhbmVseSBsYXJnZSBudW1iZXIKKyAgICBvZiByZWZzLgorCisgIC0gImdpdCBjbGVhbiAtZCAtWCIgbm93IGRvZXMgbm90IHJlbW92ZSBub24tZXhjbHVkZWQgZGlyZWN0b3JpZXMuCisKKyAgLSByZWJhc2luZyAod2l0aG91dCAtbSkgYSBzZXJpZXMgdGhhdCBjaGFuZ2VzIGEgc3ltbGluayB0byBhIGRpcmVjdG9yeQorICAgIGluIHRoZSBtaWRkbGUgb2YgYSBwYXRoIGNvbmZ1c2VkIGdpdC1hcHBseSBncmVhdGx5IGFuZCByZWZ1c2VkIHRvCisgICAgb3BlcmF0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGQ5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC0wLDAgKzEsNDAwIEBACitDaGVja2xpc3QgKGFuZCBhIHNob3J0IHZlcnNpb24gZm9yIHRoZSBpbXBhdGllbnQpOgorCisJQ29tbWl0czoKKworCS0gbWFrZSBjb21taXRzIG9mIGxvZ2ljYWwgdW5pdHMKKwktIGNoZWNrIGZvciB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlIHdpdGggImdpdCBkaWZmIC0tY2hlY2siCisJICBiZWZvcmUgY29tbWl0dGluZworCS0gZG8gbm90IGNoZWNrIGluIGNvbW1lbnRlZCBvdXQgY29kZSBvciB1bm5lZWRlZCBmaWxlcworCS0gcHJvdmlkZSBhIG1lYW5pbmdmdWwgY29tbWl0IG1lc3NhZ2UKKwktIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgYSBzaG9ydAorCSAgZGVzY3JpcHRpb24gYW5kIHNob3VsZCBza2lwIHRoZSBmdWxsIHN0b3AKKwktIGlmIHlvdSB3YW50IHlvdXIgd29yayBpbmNsdWRlZCBpbiBnaXQuZ2l0LCBhZGQgYQorCSAgIlNpZ25lZC1vZmYtYnk6IFlvdXIgTmFtZSA8eW91ckBlbWFpbC5jb20+IiBsaW5lIHRvIHRoZQorCSAgY29tbWl0IG1lc3NhZ2UgKG9yIGp1c3QgdXNlIHRoZSBvcHRpb24gIi1zIiB3aGVuCisJICBjb21taXR0aW5nKSB0byBjb25maXJtIHRoYXQgeW91IGFncmVlIHRvIHRoZSBEZXZlbG9wZXIncworCSAgQ2VydGlmaWNhdGUgb2YgT3JpZ2luCisKKwlQYXRjaDoKKworCS0gdXNlICJnaXQgZm9ybWF0LXBhdGNoIC1NIiB0byBjcmVhdGUgdGhlIHBhdGNoCisJLSBzZW5kIHlvdXIgcGF0Y2ggdG8gPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LiBJZiB5b3UgdXNlCisJICBnaXQtc2VuZC1lbWFpbCgxKSwgcGxlYXNlIHRlc3QgaXQgZmlyc3QgYnkgc2VuZGluZworCSAgZW1haWwgdG8geW91cnNlbGYuCisJLSBkbyBub3QgUEdQIHNpZ24geW91ciBwYXRjaAorCS0gZG8gbm90IGF0dGFjaCB5b3VyIHBhdGNoLCBidXQgcmVhZCBpbiB0aGUgbWFpbAorCSAgYm9keSwgdW5sZXNzIHlvdSBjYW5ub3QgdGVhY2ggeW91ciBtYWlsZXIgdG8KKwkgIGxlYXZlIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBwYXRjaCBhbG9uZS4KKwktIGJlIGNhcmVmdWwgZG9pbmcgY3V0ICYgcGFzdGUgaW50byB5b3VyIG1haWxlciwgbm90IHRvCisJICBjb3JydXB0IHdoaXRlc3BhY2VzLgorCS0gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh3aGljaCBpcyB1bnN1aXRhYmxlIGZvcgorCSAgdGhlIGNvbW1pdCBtZXNzYWdlKSBiZXR3ZWVuIHRoZSAiLS0tIiBhbmQgdGhlIGRpZmZzdGF0CisJLSBzZW5kIHRoZSBwYXRjaCB0byB0aGUgbGlzdCBfYW5kXyB0aGUgbWFpbnRhaW5lcgorCS0gaWYgeW91IGNoYW5nZSwgYWRkLCBvciByZW1vdmUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yCisJICBtYWtlIHNvbWUgb3RoZXIgdXNlciBpbnRlcmZhY2UgY2hhbmdlLCB0aGUgYXNzb2NpYXRlZAorCSAgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgdXBkYXRlZCBhcyB3ZWxsLgorCitMb25nIHZlcnNpb246CisKK0kgc3RhcnRlZCByZWFkaW5nIG92ZXIgdGhlIFN1Ym1pdHRpbmdQYXRjaGVzIGRvY3VtZW50IGZvciBMaW51eAora2VybmVsLCBwcmltYXJpbHkgYmVjYXVzZSBJIHdhbnRlZCB0byBoYXZlIGEgZG9jdW1lbnQgc2ltaWxhciB0bworaXQgZm9yIHRoZSBjb3JlIEdJVCB0byBtYWtlIHN1cmUgcGVvcGxlIHVuZGVyc3RhbmQgd2hhdCB0aGV5IGFyZQorZG9pbmcgd2hlbiB0aGV5IHdyaXRlICJTaWduZWQtb2ZmLWJ5IiBsaW5lLgorCitCdXQgdGhlIHBhdGNoIHN1Ym1pc3Npb24gcmVxdWlyZW1lbnRzIGFyZSBhIGxvdCBtb3JlIHJlbGF4ZWQKK2hlcmUgb24gdGhlIHRlY2huaWNhbC9jb250ZW50cyBmcm9udCwgYmVjYXVzZSB0aGUgY29yZSBHSVQgaXMKK3Rob3VzYW5kIHRpbWVzIHNtYWxsZXIgOy0pLiAgU28gaGVyZSBpcyBvbmx5IHRoZSByZWxldmFudCBiaXRzLgorCisKKygxKSBNYWtlIHNlcGFyYXRlIGNvbW1pdHMgZm9yIGxvZ2ljYWxseSBzZXBhcmF0ZSBjaGFuZ2VzLgorCitVbmxlc3MgeW91ciBwYXRjaCBpcyByZWFsbHkgdHJpdmlhbCwgeW91IHNob3VsZCBub3QgYmUgc2VuZGluZworb3V0IGEgcGF0Y2ggdGhhdCB3YXMgZ2VuZXJhdGVkIGJldHdlZW4geW91ciB3b3JraW5nIHRyZWUgYW5kCit5b3VyIGNvbW1pdCBoZWFkLiAgSW5zdGVhZCwgYWx3YXlzIG1ha2UgYSBjb21taXQgd2l0aCBjb21wbGV0ZQorY29tbWl0IG1lc3NhZ2UgYW5kIGdlbmVyYXRlIGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSB5b3VyCityZXBvc2l0b3J5LiAgSXQgaXMgYSBnb29kIGRpc2NpcGxpbmUuCisKK0Rlc2NyaWJlIHRoZSB0ZWNobmljYWwgZGV0YWlsIG9mIHRoZSBjaGFuZ2UocykuCisKK0lmIHlvdXIgZGVzY3JpcHRpb24gc3RhcnRzIHRvIGdldCB0b28gbG9uZywgdGhhdCdzIGEgc2lnbiB0aGF0IHlvdQorcHJvYmFibHkgbmVlZCB0byBzcGxpdCB1cCB5b3VyIGNvbW1pdCB0byBmaW5lciBncmFpbmVkIHBpZWNlcy4KKworT2gsIGFub3RoZXIgdGhpbmcuICBJIGFtIHBpY2t5IGFib3V0IHdoaXRlc3BhY2VzLiAgTWFrZSBzdXJlIHlvdXIKK2NoYW5nZXMgZG8gbm90IHRyaWdnZXIgZXJyb3JzIHdpdGggdGhlIHNhbXBsZSBwcmUtY29tbWl0IGhvb2sgc2hpcHBlZAoraW4gdGVtcGxhdGVzL2hvb2tzLS1wcmUtY29tbWl0LiAgVG8gaGVscCBlbnN1cmUgdGhpcyBkb2VzIG5vdCBoYXBwZW4sCitydW4gZ2l0IGRpZmYgLS1jaGVjayBvbiB5b3VyIGNoYW5nZXMgYmVmb3JlIHlvdSBjb21taXQuCisKKworKDFhKSBUcnkgdG8gYmUgbmljZSB0byBvbGRlciBDIGNvbXBpbGVycworCitXZSB0cnkgdG8gc3VwcG9ydCB3aWRlIHJhbmdlIG9mIEMgY29tcGlsZXJzIHRvIGNvbXBpbGUKK2dpdCB3aXRoLiBUaGF0IG1lYW5zIHRoYXQgeW91IHNob3VsZCBub3QgdXNlIEM5OSBpbml0aWFsaXplcnMsIGV2ZW4KK2lmIGEgbG90IG9mIGNvbXBpbGVycyBncm9rIGl0LgorCitBbHNvLCB2YXJpYWJsZXMgaGF2ZSB0byBiZSBkZWNsYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jaworKHlvdSBjYW4gY2hlY2sgdGhpcyB3aXRoIGdjYywgdXNpbmcgdGhlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50CitvcHRpb24pLgorCitBbm90aGVyIHRoaW5nOiBOVUxMIHBvaW50ZXJzIHNoYWxsIGJlIHdyaXR0ZW4gYXMgTlVMTCwgbm90IGFzIDAuCisKKworKDIpIEdlbmVyYXRlIHlvdXIgcGF0Y2ggdXNpbmcgZ2l0IHRvb2xzIG91dCBvZiB5b3VyIGNvbW1pdHMuCisKK2dpdCBiYXNlZCBkaWZmIHRvb2xzIChnaXQsIENvZ2l0bywgYW5kIFN0R0lUIGluY2x1ZGVkKSBnZW5lcmF0ZQordW5pZGlmZiB3aGljaCBpcyB0aGUgcHJlZmVycmVkIGZvcm1hdC4KKworWW91IGRvIG5vdCBoYXZlIHRvIGJlIGFmcmFpZCB0byB1c2UgLU0gb3B0aW9uIHRvICJnaXQgZGlmZiIgb3IKKyJnaXQgZm9ybWF0LXBhdGNoIiwgaWYgeW91ciBwYXRjaCBpbnZvbHZlcyBmaWxlIHJlbmFtZXMuICBUaGUKK3JlY2VpdmluZyBlbmQgY2FuIGhhbmRsZSB0aGVtIGp1c3QgZmluZS4KKworUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIHBhdGNoIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpbGVzCit3aGljaCBkbyBub3QgYmVsb25nIGluIGEgcGF0Y2ggc3VibWlzc2lvbi4gIE1ha2Ugc3VyZSB0byByZXZpZXcKK3lvdXIgcGF0Y2ggYWZ0ZXIgZ2VuZXJhdGluZyBpdCwgdG8gZW5zdXJlIGFjY3VyYWN5LiAgQmVmb3JlCitzZW5kaW5nIG91dCwgcGxlYXNlIG1ha2Ugc3VyZSBpdCBjbGVhbmx5IGFwcGxpZXMgdG8gdGhlICJtYXN0ZXIiCiticmFuY2ggaGVhZC4gIElmIHlvdSBhcmUgcHJlcGFyaW5nIGEgd29yayBiYXNlZCBvbiAibmV4dCIgYnJhbmNoLAordGhhdCBpcyBmaW5lLCBidXQgcGxlYXNlIG1hcmsgaXQgYXMgc3VjaC4KKworCisoMykgU2VuZGluZyB5b3VyIHBhdGNoZXMuCisKK1Blb3BsZSBvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdCBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCBhbmQKK2NvbW1lbnQgb24gdGhlIGNoYW5nZXMgeW91IGFyZSBzdWJtaXR0aW5nLiAgSXQgaXMgaW1wb3J0YW50IGZvcgorYSBkZXZlbG9wZXIgdG8gYmUgYWJsZSB0byAicXVvdGUiIHlvdXIgY2hhbmdlcywgdXNpbmcgc3RhbmRhcmQKK2UtbWFpbCB0b29scywgc28gdGhhdCB0aGV5IG1heSBjb21tZW50IG9uIHNwZWNpZmljIHBvcnRpb25zIG9mCit5b3VyIGNvZGUuICBGb3IgdGhpcyByZWFzb24sIGFsbCBwYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQKKyJpbmxpbmUiLiAgV0FSTklORzogQmUgd2FyeSBvZiB5b3VyIE1VQXMgd29yZC13cmFwCitjb3JydXB0aW5nIHlvdXIgcGF0Y2guICBEbyBub3QgY3V0LW4tcGFzdGUgeW91ciBwYXRjaDsgeW91IGNhbgorbG9zZSB0YWJzIHRoYXQgd2F5IGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCisKK0l0IGlzIGEgY29tbW9uIGNvbnZlbnRpb24gdG8gcHJlZml4IHlvdXIgc3ViamVjdCBsaW5lIHdpdGgKK1tQQVRDSF0uICBUaGlzIGxldHMgcGVvcGxlIGVhc2lseSBkaXN0aW5ndWlzaCBwYXRjaGVzIGZyb20gb3RoZXIKK2UtbWFpbCBkaXNjdXNzaW9ucy4KKworImdpdCBmb3JtYXQtcGF0Y2giIGNvbW1hbmQgZm9sbG93cyB0aGUgYmVzdCBjdXJyZW50IHByYWN0aWNlIHRvCitmb3JtYXQgdGhlIGJvZHkgb2YgYW4gZS1tYWlsIG1lc3NhZ2UuICBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorcGF0Y2ggc2hvdWxkIGNvbWUgeW91ciBjb21taXQgbWVzc2FnZSwgZW5kaW5nIHdpdGggdGhlCitTaWduZWQtb2ZmLWJ5OiBsaW5lcywgYW5kIGEgbGluZSB0aGF0IGNvbnNpc3RzIG9mIHRocmVlIGRhc2hlcywKK2ZvbGxvd2VkIGJ5IHRoZSBkaWZmc3RhdCBpbmZvcm1hdGlvbiBhbmQgdGhlIHBhdGNoIGl0c2VsZi4gIElmCit5b3UgYXJlIGZvcndhcmRpbmcgYSBwYXRjaCBmcm9tIHNvbWVib2R5IGVsc2UsIG9wdGlvbmFsbHksIGF0Cit0aGUgYmVnaW5uaW5nIG9mIHRoZSBlLW1haWwgbWVzc2FnZSBqdXN0IGJlZm9yZSB0aGUgY29tbWl0CittZXNzYWdlIHN0YXJ0cywgeW91IGNhbiBwdXQgYSAiRnJvbTogIiBsaW5lIHRvIG5hbWUgdGhhdCBwZXJzb24uCisKK1lvdSBvZnRlbiB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGFib3V0IHRoZSBwYXRjaCwKK290aGVyIHRoYW4gdGhlIGNvbW1pdCBtZXNzYWdlIGl0c2VsZi4gIFBsYWNlIHN1Y2ggImNvdmVyIGxldHRlciIKK21hdGVyaWFsIGJldHdlZW4gdGhlIHRocmVlIGRhc2ggbGluZXMgYW5kIHRoZSBkaWZmc3RhdC4KKworRG8gbm90IGF0dGFjaCB0aGUgcGF0Y2ggYXMgYSBNSU1FIGF0dGFjaG1lbnQsIGNvbXByZXNzZWQgb3Igbm90LgorRG8gbm90IGxldCB5b3VyIGUtbWFpbCBjbGllbnQgc2VuZCBxdW90ZWQtcHJpbnRhYmxlLiAgRG8gbm90IGxldAoreW91ciBlLW1haWwgY2xpZW50IHNlbmQgZm9ybWF0PWZsb3dlZCB3aGljaCB3b3VsZCBkZXN0cm95Cit3aGl0ZXNwYWNlcyBpbiB5b3VyIHBhdGNoZXMuIE1hbnkKK3BvcHVsYXIgZS1tYWlsIGFwcGxpY2F0aW9ucyB3aWxsIG5vdCBhbHdheXMgdHJhbnNtaXQgYSBNSU1FCithdHRhY2htZW50IGFzIHBsYWluIHRleHQsIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIGNvbW1lbnQgb24KK3lvdXIgY29kZS4gIEEgTUlNRSBhdHRhY2htZW50IGFsc28gdGFrZXMgYSBiaXQgbW9yZSB0aW1lIHRvCitwcm9jZXNzLiAgVGhpcyBkb2VzIG5vdCBkZWNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiB5b3VyCitNSU1FLWF0dGFjaGVkIGNoYW5nZSBiZWluZyBhY2NlcHRlZCwgYnV0IGl0IG1ha2VzIGl0IG1vcmUgbGlrZWx5Cit0aGF0IGl0IHdpbGwgYmUgcG9zdHBvbmVkLgorCitFeGNlcHRpb246ICBJZiB5b3VyIG1haWxlciBpcyBtYW5nbGluZyBwYXRjaGVzIHRoZW4gc29tZW9uZSBtYXkgYXNrCit5b3UgdG8gcmUtc2VuZCB0aGVtIHVzaW5nIE1JTUUsIHRoYXQgaXMgT0suCisKK0RvIG5vdCBQR1Agc2lnbiB5b3VyIHBhdGNoLCBhdCBsZWFzdCBmb3Igbm93LiAgTW9zdCBsaWtlbHksIHlvdXIKK21haW50YWluZXIgb3Igb3RoZXIgcGVvcGxlIG9uIHRoZSBsaXN0IHdvdWxkIG5vdCBoYXZlIHlvdXIgUEdQCitrZXkgYW5kIHdvdWxkIG5vdCBib3RoZXIgb2J0YWluaW5nIGl0IGFueXdheS4gIFlvdXIgcGF0Y2ggaXMgbm90CitqdWRnZWQgYnkgd2hvIHlvdSBhcmU7IGEgZ29vZCBwYXRjaCBmcm9tIGFuIHVua25vd24gb3JpZ2luIGhhcyBhCitmYXIgYmV0dGVyIGNoYW5jZSBvZiBiZWluZyBhY2NlcHRlZCB0aGFuIGEgcGF0Y2ggZnJvbSBhIGtub3duLAorcmVzcGVjdGVkIG9yaWdpbiB0aGF0IGlzIGRvbmUgcG9vcmx5IG9yIGRvZXMgaW5jb3JyZWN0IHRoaW5ncy4KKworSWYgeW91IHJlYWxseSByZWFsbHkgcmVhbGx5IHJlYWxseSB3YW50IHRvIGRvIGEgUEdQIHNpZ25lZAorcGF0Y2gsIGZvcm1hdCBpdCBhcyAibXVsdGlwYXJ0L3NpZ25lZCIsIG5vdCBhIHRleHQvcGxhaW4gbWVzc2FnZQordGhhdCBzdGFydHMgd2l0aCAnLS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLScuICBUaGF0IGlzCitub3QgYSB0ZXh0L3BsYWluLCBpdCdzIHNvbWV0aGluZyBlbHNlLgorCitOb3RlIHRoYXQgeW91ciBtYWludGFpbmVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgZXZlcnl0aGluZworb24gdGhlIGdpdCBtYWlsaW5nIGxpc3QuICBJZiB5b3VyIHBhdGNoIGlzIGZvciBkaXNjdXNzaW9uIGZpcnN0LAorc2VuZCBpdCAiVG86IiB0aGUgbWFpbGluZyBsaXN0LCBhbmQgb3B0aW9uYWxseSAiY2M6IiBoaW0uICBJZiBpdAoraXMgdHJpdmlhbGx5IGNvcnJlY3Qgb3IgYWZ0ZXIgdGhlIGxpc3QgcmVhY2hlZCBhIGNvbnNlbnN1cywgc2VuZAoraXQgIlRvOiIgdGhlIG1haW50YWluZXIgYW5kIG9wdGlvbmFsbHkgImNjOiIgdGhlIGxpc3QuCisKK0Fsc28gbm90ZSB0aGF0IHlvdXIgbWFpbnRhaW5lciBkb2VzIG5vdCBhY3RpdmVseSBpbnZvbHZlIGhpbXNlbGYgaW4KK21haW50YWluaW5nIHdoYXQgYXJlIGluIGNvbnRyaWIvIGhpZXJhcmNoeS4gIFdoZW4geW91IHNlbmQgZml4ZXMgYW5kCitlbmhhbmNlbWVudHMgdG8gdGhlbSwgZG8gbm90IGZvcmdldCB0byAiY2M6ICIgdGhlIHBlcnNvbiB3aG8gcHJpbWFyaWx5Cit3b3JrZWQgb24gdGhhdCBoaWVyYXJjaHkgaW4gY29udHJpYi8uCisKKworKDQpIFNpZ24geW91ciB3b3JrCisKK1RvIGltcHJvdmUgdHJhY2tpbmcgb2Ygd2hvIGRpZCB3aGF0LCB3ZSd2ZSBib3Jyb3dlZCB0aGUKKyJzaWduLW9mZiIgcHJvY2VkdXJlIGZyb20gdGhlIExpbnV4IGtlcm5lbCBwcm9qZWN0IG9uIHBhdGNoZXMKK3RoYXQgYXJlIGJlaW5nIGVtYWlsZWQgYXJvdW5kLiAgQWx0aG91Z2ggY29yZSBHSVQgaXMgYSBsb3QKK3NtYWxsZXIgcHJvamVjdCBpdCBpcyBhIGdvb2QgZGlzY2lwbGluZSB0byBmb2xsb3cgaXQuCisKK1RoZSBzaWduLW9mZiBpcyBhIHNpbXBsZSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGV4cGxhbmF0aW9uIGZvcgordGhlIHBhdGNoLCB3aGljaCBjZXJ0aWZpZXMgdGhhdCB5b3Ugd3JvdGUgaXQgb3Igb3RoZXJ3aXNlIGhhdmUKK3RoZSByaWdodCB0byBwYXNzIGl0IG9uIGFzIGEgb3Blbi1zb3VyY2UgcGF0Y2guICBUaGUgcnVsZXMgYXJlCitwcmV0dHkgc2ltcGxlOiBpZiB5b3UgY2FuIGNlcnRpZnkgdGhlIGJlbG93OgorCisgICAgICAgIERldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKKworICAgICAgICBCeSBtYWtpbmcgYSBjb250cmlidXRpb24gdG8gdGhpcyBwcm9qZWN0LCBJIGNlcnRpZnkgdGhhdDoKKworICAgICAgICAoYSkgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgY3JlYXRlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IGJ5IG1lIGFuZCBJCisgICAgICAgICAgICBoYXZlIHRoZSByaWdodCB0byBzdWJtaXQgaXQgdW5kZXIgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UKKyAgICAgICAgICAgIGluZGljYXRlZCBpbiB0aGUgZmlsZTsgb3IKKworICAgICAgICAoYikgVGhlIGNvbnRyaWJ1dGlvbiBpcyBiYXNlZCB1cG9uIHByZXZpb3VzIHdvcmsgdGhhdCwgdG8gdGhlIGJlc3QKKyAgICAgICAgICAgIG9mIG15IGtub3dsZWRnZSwgaXMgY292ZXJlZCB1bmRlciBhbiBhcHByb3ByaWF0ZSBvcGVuIHNvdXJjZQorICAgICAgICAgICAgbGljZW5zZSBhbmQgSSBoYXZlIHRoZSByaWdodCB1bmRlciB0aGF0IGxpY2Vuc2UgdG8gc3VibWl0IHRoYXQKKyAgICAgICAgICAgIHdvcmsgd2l0aCBtb2RpZmljYXRpb25zLCB3aGV0aGVyIGNyZWF0ZWQgaW4gd2hvbGUgb3IgaW4gcGFydAorICAgICAgICAgICAgYnkgbWUsIHVuZGVyIHRoZSBzYW1lIG9wZW4gc291cmNlIGxpY2Vuc2UgKHVubGVzcyBJIGFtCisgICAgICAgICAgICBwZXJtaXR0ZWQgdG8gc3VibWl0IHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UpLCBhcyBpbmRpY2F0ZWQKKyAgICAgICAgICAgIGluIHRoZSBmaWxlOyBvcgorCisgICAgICAgIChjKSBUaGUgY29udHJpYnV0aW9uIHdhcyBwcm92aWRlZCBkaXJlY3RseSB0byBtZSBieSBzb21lIG90aGVyCisgICAgICAgICAgICBwZXJzb24gd2hvIGNlcnRpZmllZCAoYSksIChiKSBvciAoYykgYW5kIEkgaGF2ZSBub3QgbW9kaWZpZWQKKyAgICAgICAgICAgIGl0LgorCisJKGQpIEkgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB0aGlzIHByb2plY3QgYW5kIHRoZSBjb250cmlidXRpb24KKwkgICAgYXJlIHB1YmxpYyBhbmQgdGhhdCBhIHJlY29yZCBvZiB0aGUgY29udHJpYnV0aW9uIChpbmNsdWRpbmcgYWxsCisJICAgIHBlcnNvbmFsIGluZm9ybWF0aW9uIEkgc3VibWl0IHdpdGggaXQsIGluY2x1ZGluZyBteSBzaWduLW9mZikgaXMKKwkgICAgbWFpbnRhaW5lZCBpbmRlZmluaXRlbHkgYW5kIG1heSBiZSByZWRpc3RyaWJ1dGVkIGNvbnNpc3RlbnQgd2l0aAorCSAgICB0aGlzIHByb2plY3Qgb3IgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UocykgaW52b2x2ZWQuCisKK3RoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmcKKworCVNpZ25lZC1vZmYtYnk6IFJhbmRvbSBKIERldmVsb3BlciA8cmFuZG9tQGRldmVsb3Blci5leGFtcGxlLm9yZz4KKworVGhpcyBsaW5lIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IGdpdCBpZiB5b3UgcnVuIHRoZSBnaXQtY29tbWl0Citjb21tYW5kIHdpdGggdGhlIC1zIG9wdGlvbi4KKworU29tZSBwZW9wbGUgYWxzbyBwdXQgZXh0cmEgdGFncyBhdCB0aGUgZW5kLiAgVGhleSdsbCBqdXN0IGJlIGlnbm9yZWQgZm9yCitub3csIGJ1dCB5b3UgY2FuIGRvIHRoaXMgdG8gbWFyayBpbnRlcm5hbCBjb21wYW55IHByb2NlZHVyZXMgb3IganVzdAorcG9pbnQgb3V0IHNvbWUgc3BlY2lhbCBkZXRhaWwgYWJvdXQgdGhlIHNpZ24tb2ZmLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTVVBIHNwZWNpZmljIGhpbnRzCisKK1NvbWUgb2YgcGF0Y2hlcyBJIHJlY2VpdmUgb3IgcGljayB1cCBmcm9tIHRoZSBsaXN0IHNoYXJlIGNvbW1vbgorcGF0dGVybnMgb2YgYnJlYWthZ2UuICBQbGVhc2UgbWFrZSBzdXJlIHlvdXIgTVVBIGlzIHNldCB1cAorcHJvcGVybHkgbm90IHRvIGNvcnJ1cHQgd2hpdGVzcGFjZXMuICBIZXJlIGFyZSB0d28gY29tbW9uIG9uZXMKK0kgaGF2ZSBzZWVuOgorCisqIEVtcHR5IGNvbnRleHQgbGluZXMgdGhhdCBkbyBub3QgaGF2ZSBfYW55XyB3aGl0ZXNwYWNlLgorCisqIE5vbiBlbXB0eSBjb250ZXh0IGxpbmVzIHRoYXQgaGF2ZSBvbmUgZXh0cmEgd2hpdGVzcGFjZSBhdCB0aGUKKyAgYmVnaW5uaW5nLgorCitPbmUgdGVzdCB5b3UgY291bGQgZG8geW91cnNlbGYgaWYgeW91ciBNVUEgaXMgc2V0IHVwIGNvcnJlY3RseSBpczoKKworKiBTZW5kIHRoZSBwYXRjaCB0byB5b3Vyc2VsZiwgZXhhY3RseSB0aGUgd2F5IHlvdSB3b3VsZCwgZXhjZXB0CisgIFRvOiBhbmQgQ2M6IGxpbmVzLCB3aGljaCB3b3VsZCBub3QgY29udGFpbiB0aGUgbGlzdCBhbmQKKyAgbWFpbnRhaW5lciBhZGRyZXNzLgorCisqIFNhdmUgdGhhdCBwYXRjaCB0byBhIGZpbGUgaW4gVU5JWCBtYWlsYm94IGZvcm1hdC4gIENhbGwgaXQgc2F5CisgIGEucGF0Y2guCisKKyogVHJ5IHRvIGFwcGx5IHRvIHRoZSB0aXAgb2YgdGhlICJtYXN0ZXIiIGJyYW5jaCBmcm9tIHRoZQorICBnaXQuZ2l0IHB1YmxpYyByZXBvc2l0b3J5OgorCisgICAgJCBnaXQgZmV0Y2ggaHR0cDovL2tlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCBtYXN0ZXI6dGVzdC1hcHBseQorICAgICQgZ2l0IGNoZWNrb3V0IHRlc3QtYXBwbHkKKyAgICAkIGdpdCByZXNldCAtLWhhcmQKKyAgICAkIGdpdCBhcHBseW1ib3ggYS5wYXRjaAorCitJZiBpdCBkb2VzIG5vdCBhcHBseSBjb3JyZWN0bHksIHRoZXJlIGNhbiBiZSB2YXJpb3VzIHJlYXNvbnMuCisKKyogWW91ciBwYXRjaCBpdHNlbGYgZG9lcyBub3QgYXBwbHkgY2xlYW5seS4gIFRoYXQgaXMgX2JhZF8gYnV0CisgIGRvZXMgbm90IGhhdmUgbXVjaCB0byBkbyB3aXRoIHlvdXIgTVVBLiAgUGxlYXNlIHJlYmFzZSB0aGUKKyAgcGF0Y2ggYXBwcm9wcmlhdGVseS4KKworKiBZb3VyIE1VQSBjb3JydXB0ZWQgeW91ciBwYXRjaDsgYXBwbHltYm94IHdvdWxkIGNvbXBsYWluIHRoYXQKKyAgdGhlIHBhdGNoIGRvZXMgbm90IGFwcGx5LiAgTG9vayBhdCAuZG90ZXN0LyBzdWJkaXJlY3RvcnkgYW5kCisgIHNlZSB3aGF0ICdwYXRjaCcgZmlsZSBjb250YWlucyBhbmQgY2hlY2sgZm9yIHRoZSBjb21tb24KKyAgY29ycnVwdGlvbiBwYXR0ZXJucyBtZW50aW9uZWQgYWJvdmUuCisKKyogV2hpbGUgeW91IGFyZSBhdCBpdCwgY2hlY2sgd2hhdCBhcmUgaW4gJ2luZm8nIGFuZAorICAnZmluYWwtY29tbWl0JyBmaWxlcyBhcyB3ZWxsLiAgSWYgd2hhdCBpcyBpbiAnZmluYWwtY29tbWl0JyBpcworICBub3QgZXhhY3RseSB3aGF0IHlvdSB3b3VsZCB3YW50IHRvIHNlZSBpbiB0aGUgY29tbWl0IGxvZworICBtZXNzYWdlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdXIgbWFpbnRhaW5lciB3b3VsZCBlbmQgdXAKKyAgaGFuZCBlZGl0aW5nIHRoZSBsb2cgbWVzc2FnZSB3aGVuIGhlIGFwcGxpZXMgeW91ciBwYXRjaC4KKyAgVGhpbmdzIGxpa2UgIkhpLCB0aGlzIGlzIG15IGZpcnN0IHBhdGNoLlxuIiwgaWYgeW91IHJlYWxseQorICB3YW50IHRvIHB1dCBpbiB0aGUgcGF0Y2ggZS1tYWlsLCBzaG91bGQgY29tZSBhZnRlciB0aGUKKyAgdGhyZWUtZGFzaCBsaW5lIHRoYXQgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBjb21taXQgbWVzc2FnZS4KKworCitQaW5lCistLS0tCisKKyhKb2hhbm5lcyBTY2hpbmRlbGluKQorCitJIGRvbid0IGtub3cgaG93IG1hbnkgcGVvcGxlIHN0aWxsIHVzZSBwaW5lLCBidXQgZm9yIHRob3NlIHBvb3IKK3NvdWxzIGl0IG1heSBiZSBnb29kIHRvIG1lbnRpb24gdGhhdCB0aGUgcXVlbGwtZmxvd2VkLXRleHQgaXMKK25lZWRlZCBmb3IgcmVjZW50IHZlcnNpb25zLgorCisuLi4gdGhlICJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiBvcHRpb24sIHRvby4gQUZBSUsgaXQKK3dhcyBpbnRyb2R1Y2VkIGluIDQuNjAuCisKKyhMaW51cyBUb3J2YWxkcykKKworQW5kIDQuNTggbmVlZHMgYXQgbGVhc3QgdGhpcy4KKworLS0tCitkaWZmLXRyZWUgODMyNmRkODM1MGJlNjRhYzdmYzgwNWY2NTYzYTFkNjFhZDEwZDMyYyAoZnJvbSBlODg2YTYxZjc2ZWRmNTQxMDU3M2U5MmUzOGNlMjI5NzRmOWM0MGYxKQorQXV0aG9yOiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAZzUub3NkbC5vcmc+CitEYXRlOiAgIE1vbiBBdWcgMTUgMTc6MjM6NTEgMjAwNSAtMDcwMAorCisgICAgRml4IHBpbmUgd2hpdGVzcGFjZS1jb3JydXB0aW9uIGJ1ZworCisgICAgVGhlcmUncyBubyBleGN1c2UgZm9yIHVuY29uZGl0aW9uYWxseSByZW1vdmluZyB3aGl0ZXNwYWNlIGZyb20KKyAgICB0aGUgcGljbyBidWZmZXJzIG9uIGNsb3NlLgorCitkaWZmIC0tZ2l0IGEvcGljby9waWNvLmMgYi9waWNvL3BpY28uYworLS0tIGEvcGljby9waWNvLmMKKysrKyBiL3BpY28vcGljby5jCitAQCAtMjE5LDcgKzIxOSw5IEBAIFBJQ08gKnBtOworIAkgICAgc3dpdGNoKHBpY29fYWxsX2RvbmUpewkvKiBwcmVwYXJlIGZvci9oYW5kbGUgZmluYWwgZXZlbnRzICovCisgCSAgICAgIGNhc2UgQ09NUF9FWElUIDoJCS8qIGFscmVhZHkgY29uZmlybWVkICovCisgCQlwYWNraGVhZGVyKCk7CisrI2lmIDAKKyAJCXN0cmlwd2hpdGVzcGFjZSgpOworKyNlbmRpZgorIAkJYyB8PSBDT01QX0VYSVQ7CisgCQlicmVhazsKKyAKKworKERhbmllbCBCYXJrYWxvdykKKworPiBBIHBhdGNoIHRvIFN1Ym1pdHRpbmdQYXRjaGVzLCBNVUEgc3BlY2lmaWMgaGVscCBzZWN0aW9uIGZvcgorPiB1c2VycyBvZiBQaW5lIDQuNjMgd291bGQgYmUgdmVyeSBtdWNoIGFwcHJlY2lhdGVkLgorCitBaCwgaXQgbG9va3MgbGlrZSBhIHJlY2VudCB2ZXJzaW9uIGNoYW5nZWQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdG8gZG8gdGhlCityaWdodCB0aGluZywgYW5kIGludmVydGVkIHRoZSBzZW5zZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24uIChFaXRoZXIKK3RoYXQgb3IgR2VudG9vIGRpZCBpdC4pIFNvIHlvdSBuZWVkIHRvIHNldCB0aGUKKyJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiBvcHRpb24sIHVubGVzcyB0aGUgb3B0aW9uIHlvdSBoYXZlIGlzCisic3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBhdm9pZCBjaGVja2luZworaXQuCisKKworVGh1bmRlcmJpcmQKKy0tLS0tLS0tLS0tCisKKyhBIExhcmdlIEFuZ3J5IFNDTSkKKworSGVyZSBhcmUgc29tZSBoaW50cyBvbiBob3cgdG8gc3VjY2Vzc2Z1bGx5IHN1Ym1pdCBwYXRjaGVzIGlubGluZSB1c2luZworVGh1bmRlcmJpcmQuCisKK1RoaXMgcmVjaXBlIGFwcGVhcnMgdG8gd29yayB3aXRoIHRoZSBjdXJyZW50IFsqMSpdIFRodW5kZXJiaXJkIGZyb20gU3VzZS4KKworVGhlIGZvbGxvd2luZyBUaHVuZGVyYmlyZCBleHRlbnNpb25zIGFyZSBuZWVkZWQ6CisJQWJvdXRDb25maWcgMC41CisJCWh0dHA6Ly9hYm91dGNvbmZpZy5tb3pkZXYub3JnLworCUV4dGVybmFsIEVkaXRvciAwLjcuMgorCQlodHRwOi8vZ2xvYnMub3JnL2FydGljbGVzLnBocD9sbmc9ZW4mcGc9OAorCisxKSBQcmVwYXJlIHRoZSBwYXRjaCBhcyBhIHRleHQgZmlsZSB1c2luZyB5b3VyIG1ldGhvZCBvZiBjaG9pY2UuCisKKzIpIEJlZm9yZSBvcGVuaW5nIGEgY29tcG9zZSB3aW5kb3csIHVzZSBFZGl0LT5BY2NvdW50IFNldHRpbmdzIHRvCit1bmNoZWNrIHRoZSAiQ29tcG9zZSBtZXNzYWdlcyBpbiBIVE1MIGZvcm1hdCIgc2V0dGluZyBpbiB0aGUKKyJDb21wb3NpdGlvbiAmIEFkZHJlc3NpbmciIHBhbmVsIG9mIHRoZSBhY2NvdW50IHRvIGJlIHVzZWQgdG8gc2VuZCB0aGUKK3BhdGNoLiBbKjIqXQorCiszKSBJbiB0aGUgbWFpbiBUaHVuZGVyYmlyZCB3aW5kb3csIF9iZWZvcmVfIHlvdSBvcGVuIHRoZSBjb21wb3NlIHdpbmRvdworZm9yIHRoZSBwYXRjaCwgdXNlIFRvb2xzLT5hYm91dDpjb25maWcgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdG8gdGhlCitpbmRpY2F0ZWQgdmFsdWVzOgorCW1haWxuZXdzLnNlbmRfcGxhaW50ZXh0X2Zsb3dlZAk9PiBmYWxzZQorCW1haWxuZXdzLndyYXBsZW5ndGgJCT0+IDAKKworNCkgT3BlbiBhIGNvbXBvc2Ugd2luZG93IGFuZCBjbGljayB0aGUgZXh0ZXJuYWwgZWRpdG9yIGljb24uCisKKzUpIEluIHRoZSBleHRlcm5hbCBlZGl0b3Igd2luZG93LCByZWFkIGluIHRoZSBwYXRjaCBmaWxlIGFuZCBleGl0IHRoZQorZWRpdG9yIG5vcm1hbGx5LgorCis2KSBCYWNrIGluIHRoZSBjb21wb3NlIHdpbmRvdzogQWRkIHdoYXRldmVyIG90aGVyIHRleHQgeW91IHdpc2ggdG8gdGhlCittZXNzYWdlLCBjb21wbGV0ZSB0aGUgYWRkcmVzc2luZyBhbmQgc3ViamVjdCBmaWVsZHMsIGFuZCBwcmVzcyBzZW5kLgorCis3KSBPcHRpb25hbGx5LCB1bmRvIHRoZSBhYm91dDpjb25maWcvYWNjb3VudCBzZXR0aW5ncyBjaGFuZ2VzIG1hZGUgaW4KK3N0ZXBzIDIgJiAzLgorCisKK1tGb290bm90ZXNdCisqMSogVmVyc2lvbiAxLjAgKDIwMDQxMjA3KSBmcm9tIHRoZSBNb3ppbGxhVGh1bmRlcmJpcmQtMS4wLTUgcnBtIG9mIFN1c2UKKzkuMyBwcm9mZXNzaW9uYWwgdXBkYXRlcy4KKworKjIqIEl0IG1heSBiZSBwb3NzaWJsZSB0byBkbyB0aGlzIHdpdGggYWJvdXQ6Y29uZmlnIGFuZCB0aGUgZm9sbG93aW5nCitzZXR0aW5ncyBidXQgSSBoYXZlbid0IHRyaWVkLCB5ZXQuCisJbWFpbC5odG1sX2NvbXBvc2UJCQk9PiBmYWxzZQorCW1haWwuaWRlbnRpdHkuZGVmYXVsdC5jb21wb3NlX2h0bWwJPT4gZmFsc2UKKwltYWlsLmlkZW50aXR5LmlkPy5jb21wb3NlX2h0bWwJCT0+IGZhbHNlCisKKworR251cworLS0tLQorCisnfCcgaW4gdGhlICpTdW1tYXJ5KiBidWZmZXIgY2FuIGJlIHVzZWQgdG8gcGlwZSB0aGUgY3VycmVudAorbWVzc2FnZSB0byBhbiBleHRlcm5hbCBwcm9ncmFtLCBhbmQgdGhpcyBpcyBhIGhhbmR5IHdheSB0byBkcml2ZQorImdpdCBhbSIuICBIb3dldmVyLCBpZiB0aGUgbWVzc2FnZSBpcyBNSU1FIGVuY29kZWQsIHdoYXQgaXMKK3BpcGVkIGludG8gdGhlIHByb2dyYW0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIHlvdSBzZWUgaW4geW91cgorKkFydGljbGUqIGJ1ZmZlciBhZnRlciB1bndyYXBwaW5nIE1JTUUuICBUaGlzIGlzIG9mdGVuIG5vdCB3aGF0Cit5b3Ugd291bGQgd2FudCBmb3IgdHdvIHJlYXNvbnMuICBJdCB0ZW5kcyB0byBzY3JldyB1cCBub24gQVNDSUkKK2NoYXJhY3RlcnMgKG1vc3Qgbm90YWJseSBpbiBwZW9wbGUncyBuYW1lcyksIGFuZCBhbHNvCit3aGl0ZXNwYWNlcyAoZmF0YWwgaW4gcGF0Y2hlcykuICBSdW5uaW5nICdDLXUgZycgdG8gZGlzcGxheSB0aGUKK21lc3NhZ2UgaW4gcmF3IGZvcm0gYmVmb3JlIHVzaW5nICd8JyB0byBydW4gdGhlIHBpcGUgY2FuIHdvcmsKK3RoaXMgcHJvYmxlbSBhcm91bmQuCisKKworS01haWwKKy0tLS0tCisKK1RoaXMgc2hvdWxkIGhlbHAgeW91IHRvIHN1Ym1pdCBwYXRjaGVzIGlubGluZSB1c2luZyBLTWFpbC4KKworMSkgUHJlcGFyZSB0aGUgcGF0Y2ggYXMgYSB0ZXh0IGZpbGUuCisKKzIpIENsaWNrIG9uIE5ldyBNYWlsLgorCiszKSBHbyB1bmRlciAiT3B0aW9ucyIgaW4gdGhlIENvbXBvc2VyIHdpbmRvdyBhbmQgYmUgc3VyZSB0aGF0CisiV29yZCB3cmFwIiBpcyBub3Qgc2V0LgorCis0KSBVc2UgTWVzc2FnZSAtPiBJbnNlcnQgZmlsZS4uLiBhbmQgaW5zZXJ0IHRoZSBwYXRjaC4KKworNSkgQmFjayBpbiB0aGUgY29tcG9zZSB3aW5kb3c6IGFkZCB3aGF0ZXZlciBvdGhlciB0ZXh0IHlvdSB3aXNoIHRvIHRoZQorbWVzc2FnZSwgY29tcGxldGUgdGhlIGFkZHJlc3NpbmcgYW5kIHN1YmplY3QgZmllbGRzLCBhbmQgcHJlc3Mgc2VuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZiBiL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYxZjczCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCkBAIC0wLDAgKzEsNTkgQEAKKyMjIGdpdGxpbms6IG1hY3JvCisjCisjIFVzYWdlOiBnaXRsaW5rOmNvbW1hbmRbbWFucGFnZS1zZWN0aW9uXQorIworIyBOb3RlLCB7MH0gaXMgdGhlIG1hbnBhZ2Ugc2VjdGlvbiwgd2hpbGUge3RhcmdldH0gaXMgdGhlIGNvbW1hbmQuCisjCisjIFNob3cgR0lUIGxpbmsgYXM6IDxjb21tYW5kPig8c2VjdGlvbj4pOyBpZiBzZWN0aW9uIGlzIGRlZmluZWQsIGVsc2UganVzdCBzaG93CisjIHRoZSBjb21tYW5kLgorCitbYXR0cmlidXRlc10KK3BsdXM9JiM0MzsKK2NhcmV0PSYjOTQ7CitzdGFydHNiPSYjOTE7CitlbmRzYj0mIzkzOwordGlsZGU9JiMxMjY7CisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorW2dpdGxpbmstaW5saW5lbWFjcm9dCit7MCV7dGFyZ2V0fX0KK3swIzxjaXRlcmVmZW50cnk+fQorezAjPHJlZmVudHJ5dGl0bGU+e3RhcmdldH08L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT57MH08L21hbnZvbG51bT59Cit7MCM8L2NpdGVyZWZlbnRyeT59CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCisjICJ1bmJyZWFrIiBkb2Nib29rLXhzbCB2MS42OCBmb3IgbWFucGFnZXMuIHYxLjY5IHdvcmtzIHdpdGggb3Igd2l0aG91dCB0aGlzLgorW2xpc3RpbmdibG9ja10KKzxleGFtcGxlPjx0aXRsZT57dGl0bGV9PC90aXRsZT4KKzxsaXRlcmFsbGF5b3V0PgorfAorPC9saXRlcmFsbGF5b3V0Pgore3RpdGxlI308L2V4YW1wbGU+CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmRvY3R5cGUtbWFucGFnZVtdCitpZmRlZjo6YmFja2VuZC1kb2Nib29rW10KK1toZWFkZXJdCit0ZW1wbGF0ZTo6W2hlYWRlci1kZWNsYXJhdGlvbnNdCis8cmVmZW50cnk+Cis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPnttYW50aXRsZX08L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPnttYW52b2xudW19PC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+R2l0PC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+e2dpdF92ZXJzaW9ufTwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+R2l0IE1hbnVhbDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKyAgPHJlZm5hbWU+e21hbm5hbWV9PC9yZWZuYW1lPgorICA8cmVmcHVycG9zZT57bWFucHVycG9zZX08L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KK2VuZGlmOjpkb2N0eXBlLW1hbnBhZ2VbXQorCitpZmRlZjo6YmFja2VuZC14aHRtbDExW10KK1tnaXRsaW5rLWlubGluZW1hY3JvXQorPGEgaHJlZj0ie3RhcmdldH0uaHRtbCI+e3RhcmdldH17MD8oezB9KX08L2E+CitlbmRpZjo6YmFja2VuZC14aHRtbDExW10KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JsYW1lLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibGFtZS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZiZjZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFtZS1vcHRpb25zLnR4dApAQCAtMCwwICsxLDg3IEBACistYjo6CisJU2hvdyBibGFuayBTSEEtMSBmb3IgYm91bmRhcnkgY29tbWl0cy4gIFRoaXMgY2FuIGFsc28KKwliZSBjb250cm9sbGVkIHZpYSB0aGUgYGJsYW1lLmJsYW5rYm91bmRhcnlgIGNvbmZpZyBvcHRpb24uCisKKy0tcm9vdDo6CisJRG8gbm90IHRyZWF0IHJvb3QgY29tbWl0cyBhcyBib3VuZGFyaWVzLiAgVGhpcyBjYW4gYWxzbyBiZQorCWNvbnRyb2xsZWQgdmlhIHRoZSBgYmxhbWUuc2hvd3Jvb3RgIGNvbmZpZyBvcHRpb24uCisKKy0tc2hvdy1zdGF0czo6CisJSW5jbHVkZSBhZGRpdGlvbmFsIHN0YXRpc3RpY3MgYXQgdGhlIGVuZCBvZiBibGFtZSBvdXRwdXQuCisKKy1MIDxzdGFydD4sPGVuZD46OgorCUFubm90YXRlIG9ubHkgdGhlIGdpdmVuIGxpbmUgcmFuZ2UuICA8c3RhcnQ+IGFuZCA8ZW5kPiBjYW4gdGFrZQorCW9uZSBvZiB0aGVzZSBmb3JtczoKKworCS0gbnVtYmVyCisrCitJZiA8c3RhcnQ+IG9yIDxlbmQ+IGlzIGEgbnVtYmVyLCBpdCBzcGVjaWZpZXMgYW4KK2Fic29sdXRlIGxpbmUgbnVtYmVyIChsaW5lcyBjb3VudCBmcm9tIDEpLgorKworCistIC9yZWdleC8KKysKK1RoaXMgZm9ybSB3aWxsIHVzZSB0aGUgZmlyc3QgbGluZSBtYXRjaGluZyB0aGUgZ2l2ZW4KK1BPU0lYIHJlZ2V4LiAgSWYgPGVuZD4gaXMgYSByZWdleCwgaXQgd2lsbCBzZWFyY2gKK3N0YXJ0aW5nIGF0IHRoZSBsaW5lIGdpdmVuIGJ5IDxzdGFydD4uCisrCisKKy0gK29mZnNldCBvciAtb2Zmc2V0CisrCitUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIDxlbmQ+IGFuZCB3aWxsIHNwZWNpZnkgYSBudW1iZXIKK29mIGxpbmVzIGJlZm9yZSBvciBhZnRlciB0aGUgbGluZSBnaXZlbiBieSA8c3RhcnQ+LgorKworCistbDo6CisJU2hvdyBsb25nIHJldiAoRGVmYXVsdDogb2ZmKS4KKworLXQ6OgorCVNob3cgcmF3IHRpbWVzdGFtcCAoRGVmYXVsdDogb2ZmKS4KKworLVMgPHJldnMtZmlsZT46OgorCVVzZSByZXZzIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBnaXRsaW5rOmdpdC1yZXYtbGlzdFsxXS4KKworLXAsIC0tcG9yY2VsYWluOjoKKwlTaG93IGluIGEgZm9ybWF0IGRlc2lnbmVkIGZvciBtYWNoaW5lIGNvbnN1bXB0aW9uLgorCistLWluY3JlbWVudGFsOjoKKwlTaG93IHRoZSByZXN1bHQgaW5jcmVtZW50YWxseSBpbiBhIGZvcm1hdCBkZXNpZ25lZCBmb3IKKwltYWNoaW5lIGNvbnN1bXB0aW9uLgorCistLWNvbnRlbnRzIDxmaWxlPjo6CisJV2hlbiA8cmV2PiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29tbWFuZCBhbm5vdGF0ZXMgdGhlCisJY2hhbmdlcyBzdGFydGluZyBiYWNrd2FyZHMgZnJvbSB0aGUgd29ya2luZyB0cmVlIGNvcHkuCisJVGhpcyBmbGFnIG1ha2VzIHRoZSBjb21tYW5kIHByZXRlbmQgYXMgaWYgdGhlIHdvcmtpbmcKKwl0cmVlIGNvcHkgaGFzIHRoZSBjb250ZW50cyBvZiBoZSBuYW1lZCBmaWxlIChzcGVjaWZ5CisJYC1gIHRvIG1ha2UgdGhlIGNvbW1hbmQgcmVhZCBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCkuCisKKy1NfDxudW0+fDo6CisJRGV0ZWN0IG1vdmluZyBsaW5lcyBpbiB0aGUgZmlsZSBhcyB3ZWxsLiAgV2hlbiBhIGNvbW1pdAorCW1vdmVzIGEgYmxvY2sgb2YgbGluZXMgaW4gYSBmaWxlIChlLmcuIHRoZSBvcmlnaW5hbCBmaWxlCisJaGFzIEEgYW5kIHRoZW4gQiwgYW5kIHRoZSBjb21taXQgY2hhbmdlcyBpdCB0byBCIGFuZAorCXRoZW4gQSksIHRyYWRpdGlvbmFsICdibGFtZScgYWxnb3JpdGhtIHR5cGljYWxseSBibGFtZXMKKwl0aGUgbGluZXMgdGhhdCB3ZXJlIG1vdmVkIHVwIChpLmUuIEIpIHRvIHRoZSBwYXJlbnQgYW5kCisJYXNzaWducyBibGFtZSB0byB0aGUgbGluZXMgdGhhdCB3ZXJlIG1vdmVkIGRvd24gKGkuZS4gQSkKKwl0byB0aGUgY2hpbGQgY29tbWl0LiAgV2l0aCB0aGlzIG9wdGlvbiwgYm90aCBncm91cHMgb2YgbGluZXMKKwlhcmUgYmxhbWVkIG9uIHRoZSBwYXJlbnQuCisKKwk8bnVtPiBpcyBvcHRpb25hbCBidXQgaXQgaXMgdGhlIGxvd2VyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YKKwlhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0aGF0IGdpdCBtdXN0IGRldGVjdCBhcyBtb3ZpbmcKKwl3aXRoaW4gYSBmaWxlIGZvciBpdCB0byBhc3NvY2lhdGUgdGhvc2UgbGluZXMgd2l0aCB0aGUgcGFyZW50CisJY29tbWl0LgorCistQ3w8bnVtPnw6OgorCUluIGFkZGl0aW9uIHRvIGAtTWAsIGRldGVjdCBsaW5lcyBjb3BpZWQgZnJvbSBvdGhlcgorCWZpbGVzIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGUgc2FtZSBjb21taXQuICBUaGlzIGlzCisJdXNlZnVsIHdoZW4geW91IHJlb3JnYW5pemUgeW91ciBwcm9ncmFtIGFuZCBtb3ZlIGNvZGUKKwlhcm91bmQgYWNyb3NzIGZpbGVzLiAgV2hlbiB0aGlzIG9wdGlvbiBpcyBnaXZlbiB0d2ljZSwKKwl0aGUgY29tbWFuZCBsb29rcyBmb3IgY29waWVzIGZyb20gYWxsIG90aGVyIGZpbGVzIGluIHRoZQorCXBhcmVudCBmb3IgdGhlIGNvbW1pdCB0aGF0IGNyZWF0ZXMgdGhlIGZpbGUgaW4gYWRkaXRpb24uCisKKwk8bnVtPiBpcyBvcHRpb25hbCBidXQgaXQgaXMgdGhlIGxvd2VyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YKKwlhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0aGF0IGdpdCBtdXN0IGRldGVjdCBhcyBtb3ZpbmcKKwliZXR3ZWVuIGZpbGVzIGZvciBpdCB0byBhc3NvY2lhdGUgdGhvc2UgbGluZXMgd2l0aCB0aGUgcGFyZW50CisJY29tbWl0LgorCistaCwgLS1oZWxwOjoKKwlTaG93IGhlbHAgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnVpbGQtZG9jZGVwLnBlcmwgYi9Eb2N1bWVudGF0aW9uL2J1aWxkLWRvY2RlcC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhNDIwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2J1aWxkLWRvY2RlcC5wZXJsCkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9iaW4vcGVybAorCitteSAlaW5jbHVkZSA9ICgpOworbXkgJWluY2x1ZGVkID0gKCk7CisKK2ZvciBteSAkdGV4dCAoPCoudHh0PikgeworICAgIG9wZW4gSSwgJzwnLCAkdGV4dCB8fCBkaWUgImNhbm5vdCByZWFkOiAkdGV4dCI7CisgICAgd2hpbGUgKDxJPikgeworCWlmICgvXmluY2x1ZGU6Oi8pIHsKKwkgICAgY2hvbXA7CisJICAgIHMvXmluY2x1ZGU6OlxzKi8vOworCSAgICBzL1xbXF0vLzsKKwkgICAgJGluY2x1ZGV7JHRleHR9eyRffSA9IDE7CisJICAgICRpbmNsdWRlZHskX30gPSAxOworCX0KKyAgICB9CisgICAgY2xvc2UgSTsKK30KKworIyBEbyB3ZSBjYXJlIGFib3V0IGNoYWluZWQgaW5jbHVkZXM/Pz8KK215ICRjaGFuZ2VkID0gMTsKK3doaWxlICgkY2hhbmdlZCkgeworICAgICRjaGFuZ2VkID0gMDsKKyAgICB3aGlsZSAobXkgKCR0ZXh0LCAkaW5jbHVkZWQpID0gZWFjaCAlaW5jbHVkZSkgeworCWZvciBteSAkaSAoa2V5cyAlJGluY2x1ZGVkKSB7CisJICAgICMgJHRleHQgaGFzIGluY2x1ZGU6OiRpOyBpZiAkaSBpbmNsdWRlcyAkagorCSAgICAjICR0ZXh0IGluZGlyZWN0bHkgaW5jbHVkZXMgJGouCisJICAgIGlmIChleGlzdHMgJGluY2x1ZGV7JGl9KSB7CisJCWZvciBteSAkaiAoa2V5cyAleyRpbmNsdWRleyRpfX0pIHsKKwkJICAgIGlmICghZXhpc3RzICRpbmNsdWRleyR0ZXh0fXskan0pIHsKKwkJCSRpbmNsdWRleyR0ZXh0fXskan0gPSAxOworCQkJJGluY2x1ZGVkeyRqfSA9IDE7CisJCQkkY2hhbmdlZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3doaWxlIChteSAoJHRleHQsICRpbmNsdWRlZCkgPSBlYWNoICVpbmNsdWRlKSB7CisgICAgaWYgKCEgZXhpc3RzICRpbmNsdWRlZHskdGV4dH0gJiYKKwkobXkgJGJhc2UgPSAkdGV4dCkgPX4gcy9cLnR4dCQvLykgeworCXByaW50ICIkYmFzZS5odG1sICRiYXNlLnhtbCA6ICIsIGpvaW4oIiAiLCBrZXlzICUkaW5jbHVkZWQpLCAiXG4iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2FsbG91dHMueHNsIGIvRG9jdW1lbnRhdGlvbi9jYWxsb3V0cy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNjFhMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY2FsbG91dHMueHNsCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0gY2FsbG91dC54c2w6IGNvbnZlcnRzIGFzY2lpZG9jIGNhbGxvdXRzIHRvIG1hbiBwYWdlIGZvcm1hdCAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvIj4KKwk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdcZkIoJyxzdWJzdHJpbmctYWZ0ZXIoQGlkLCctJyksJylcZlInKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0bGlzdCI+CisJPHhzbDp0ZXh0Pi5zcCYjMTA7PC94c2w6dGV4dD4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KKzwveHNsOnRlbXBsYXRlPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2FsbG91dCI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnXGZCJyxzdWJzdHJpbmctYWZ0ZXIoQGFyZWFyZWZzLCctJyksJy4gXGZSJykiLz4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp0ZXh0Pi5iciYjMTA7PC94c2w6dGV4dD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIHNvcnJ5LCB0aGlzIGlzIG5vdCBhYm91dCBjYWxsb3V0cywgYnV0IGF0dGVtcHRzIHRvIHdvcmsgYXJvdW5kCisgc3B1cmlvdXMgLnNwIGF0IHRoZSB0YWlsIG9mIHRoZSBsaW5lIGRvY2Jvb2sgc3R5bGVzaGVldHMgc2VlbSB0byBhZGQgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJzaW1wYXJhIj4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50Ij4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgIDwveHNsOnZhcmlhYmxlPgorICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9ybWFsaXplLXNwYWNlKCRjb250ZW50KSIvPgorICA8eHNsOmlmIHRlc3Q9Im5vdChhbmNlc3Rvcjo6YXV0aG9yYmx1cmIpIGFuZAorICAgICAgICAgICAgICAgIG5vdChhbmNlc3Rvcjo6cGVyc29uYmx1cmIpIj4KKyAgICA8eHNsOnRleHQ+JiMxMDsmIzEwOzwveHNsOnRleHQ+CisgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1saXN0LnBlcmwgYi9Eb2N1bWVudGF0aW9uL2NtZC1saXN0LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQzODAyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY21kLWxpc3QucGVybApAQCAtMCwwICsxLDE5OSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBGaWxlOjpDb21wYXJlIHF3KGNvbXBhcmUpOworCitzdWIgZm9ybWF0X29uZSB7CisJbXkgKCRvdXQsICRuYW1lKSA9IEBfOworCW15ICgkc3RhdGUsICRkZXNjcmlwdGlvbik7CisJJHN0YXRlID0gMDsKKwlvcGVuIEksICc8JywgIiRuYW1lLnR4dCIgb3IgZGllICJObyBzdWNoIGZpbGUgJG5hbWUudHh0IjsKKwl3aGlsZSAoPEk+KSB7CisJCWlmICgvXk5BTUUkLykgeworCQkJJHN0YXRlID0gMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRzdGF0ZSA9PSAxICYmIC9eLS0tLSQvKSB7CisJCQkkc3RhdGUgPSAyOworCQkJbmV4dDsKKwkJfQorCQluZXh0IGlmICgkc3RhdGUgIT0gMik7CisJCWNob21wOworCQkkZGVzY3JpcHRpb24gPSAkXzsKKwkJbGFzdDsKKwl9CisJY2xvc2UgSTsKKwlpZiAoIWRlZmluZWQgJGRlc2NyaXB0aW9uKSB7CisJCWRpZSAiTm8gZGVzY3JpcHRpb24gZm91bmQgaW4gJG5hbWUudHh0IjsKKwl9CisJaWYgKG15ICgkdmVyaWZ5X25hbWUsICR0ZXh0KSA9ICgkZGVzY3JpcHRpb24gPX4gL14oJG5hbWUpIC0gKC4qKS8pKSB7CisJCXByaW50ICRvdXQgImdpdGxpbms6JG5hbWVcWzFcXTo6XG4iOworCQlwcmludCAkb3V0ICJcdCR0ZXh0LlxuXG4iOworCX0KKwllbHNlIHsKKwkJZGllICJEZXNjcmlwdGlvbiBkb2VzIG5vdCBtYXRjaCAkbmFtZTogJGRlc2NyaXB0aW9uIjsKKwl9Cit9CisKK215ICVjbWRzID0gKCk7Cit3aGlsZSAoPERBVEE+KSB7CisJbmV4dCBpZiAvXiMvOworCisJY2hvbXA7CisJbXkgKCRuYW1lLCAkY2F0KSA9IC9eKFxTKylccysoLiopJC87CisJcHVzaCBAeyRjbWRzeyRjYXR9fSwgJG5hbWU7Cit9CisKK2ZvciBteSAkY2F0IChxdyhhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCisJCWFuY2lsbGFyeW1hbmlwdWxhdG9ycworCQltYWlucG9yY2VsYWluCisJCXBsdW1iaW5naW50ZXJyb2dhdG9ycworCQlwbHVtYmluZ21hbmlwdWxhdG9ycworCQlzeW5jaGluZ3JlcG9zaXRvcmllcworCQlmb3JlaWduc2NtaW50ZXJmYWNlCisJCXB1cmVoZWxwZXJzCisJCXN5bmNoZWxwZXJzKSkgeworCW15ICRvdXQgPSAiY21kcy0kY2F0LnR4dCI7CisJb3BlbiBPLCAnPicsICIkb3V0KyIgb3IgZGllICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAkb3V0KyI7CisJZm9yIChAeyRjbWRzeyRjYXR9fSkgeworCQlmb3JtYXRfb25lKFwqTywgJF8pOworCX0KKwljbG9zZSBPOworCisJaWYgKC1mICIkb3V0IiAmJiBjb21wYXJlKCIkb3V0IiwgIiRvdXQrIikgPT0gMCkgeworCQl1bmxpbmsgIiRvdXQrIjsKKwl9CisJZWxzZSB7CisJCXByaW50IFNUREVSUiAiJG91dFxuIjsKKwkJcmVuYW1lICIkb3V0KyIsICIkb3V0IjsKKwl9Cit9CisKK19fREFUQV9fCitnaXQtYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1hbm5vdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtYXBwbHltYm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LWFwcGx5cGF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmVoZWxwZXJzCitnaXQtYXBwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1hcmNoaW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtYXJjaGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWJpc2VjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1ibGFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtYnJhbmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWJ1bmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jYXQtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1jaGVja291dC1pbmRleCAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LWNoZWNrb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jaGVjay1hdHRyICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LWNoZWNrLXJlZi1mb3JtYXQgICAgICAgICAgICAgICAgICAgIHB1cmVoZWxwZXJzCitnaXQtY2hlcnJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LWNoZXJyeS1waWNrICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtY2xvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWNvbW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jb21taXQtdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LWNvbnZlcnQtb2JqZWN0cyAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LWNvdW50LW9iamVjdHMgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1jdnNleHBvcnRjb21taXQgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtY3ZzaW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LWN2c3NlcnZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25zY21pbnRlcmZhY2UKK2dpdC1kYWVtb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaGluZ3JlcG9zaXRvcmllcworZ2l0LWRlc2NyaWJlICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1kaWZmLWZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1kaWZmLWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1kaWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtZGlmZi10cmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCitnaXQtZmFzdC1pbXBvcnQJCQkJYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCitnaXQtZmV0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWZldGNoLXBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoaW5ncmVwb3NpdG9yaWVzCitnaXQtZm10LW1lcmdlLW1zZyAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1mb3ItZWFjaC1yZWYgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1mb3JtYXQtcGF0Y2ggICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtZnNjawkgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtZ2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWdldC10YXItY29tbWl0LWlkICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1ncmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtaGFzaC1vYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1odHRwLWZldGNoICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaGVscGVycworZ2l0LWh0dHAtcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoZWxwZXJzCitnaXQtaW1hcC1zZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LWluZGV4LXBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWluc3Rhd2ViICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtbG9jYWwtZmV0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hpbmdyZXBvc2l0b3JpZXMKK2dpdC1sb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtbG9zdC1mb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCitnaXQtbHMtZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCitnaXQtbHMtcmVtb3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCitnaXQtbHMtdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCitnaXQtbWFpbGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1tYWlsc3BsaXQgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LW1lcmdlLWJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LW1lcmdlLWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtbWVyZ2UtaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1tZXJnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtbWVyZ2Utb25lLWZpbGUgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1tZXJnZS10cmVlICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtbWVyZ2V0b29sICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCitnaXQtbWt0YWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1ta3RyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LW12ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1uYW1lLXJldiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1wYWNrLW9iamVjdHMgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LXBhY2stcmVkdW5kYW50ICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXBhY2stcmVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXBhcnNlLXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoZWxwZXJzCitnaXQtcGF0Y2gtaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1wZWVrLXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LXBydW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXBydW5lLXBhY2tlZCAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtcHVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LXB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1xdWlsdGltcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtcmVhZC10cmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1yZWJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtcmVjZWl2ZS1wYWNrICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hlbHBlcnMKK2dpdC1yZWZsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1yZWxpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1yZXBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1yZW1vdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1yZXF1ZXN0LXB1bGwgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtcmVyZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LXJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1yZXZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtcmV2LWxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCitnaXQtcmV2LXBhcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1ydW5zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtc2VuZC1lbWFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LXNlbmQtcGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoaW5ncmVwb3NpdG9yaWVzCitnaXQtc2hlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hlbHBlcnMKK2dpdC1zaG9ydGxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtc2hvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LXNob3ctYnJhbmNoICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1zaG93LWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1zaG93LXJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1zaC1zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LXNzaC1mZXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoaW5ncmVwb3NpdG9yaWVzCitnaXQtc3NoLXVwbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hpbmdyZXBvc2l0b3JpZXMKK2dpdC1zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtc3RyaXBzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1zdm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtc3ZuaW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LXN5bWJvbGljLXJlZiAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LXRhci10cmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXVucGFjay1maWxlICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXVucGFjay1vYmplY3RzICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtdXBkYXRlLWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC11cGRhdGUtcmVmICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyAgICAgICAgICAgICAgICAgIHN5bmNoaW5ncmVwb3NpdG9yaWVzCitnaXQtdXBsb2FkLWFyY2hpdmUgICAgICAgICAgICAgICAgICAgICAgc3luY2hlbHBlcnMKK2dpdC11cGxvYWQtcGFjayAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaGVscGVycworZ2l0LXZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXZlcmlmeS1wYWNrICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXZlcmlmeS10YWcgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC13aGF0Y2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtd3JpdGUtdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVmN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWcudHh0CkBAIC0wLDAgKzEsNjcyIEBACitDT05GSUdVUkFUSU9OIEZJTEUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ2l0IGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhIG51bWJlciBvZiB2YXJpYWJsZXMgdGhhdCBhZmZlY3QKK3RoZSBnaXQgY29tbWFuZCdzIGJlaGF2aW9yLiBgLmdpdC9jb25maWdgIGZpbGUgZm9yIGVhY2ggcmVwb3NpdG9yeQoraXMgdXNlZCB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoYXQgcmVwb3NpdG9yeSwgYW5kCitgJEhPTUUvLmdpdGNvbmZpZ2AgaXMgdXNlZCB0byBzdG9yZSBwZXIgdXNlciBpbmZvcm1hdGlvbiB0byBnaXZlCitmYWxsYmFjayB2YWx1ZXMgZm9yIGAuZ2l0L2NvbmZpZ2AgZmlsZS4gVGhlIGZpbGUgYC9ldGMvZ2l0Y29uZmlnYAorY2FuIGJlIHVzZWQgdG8gc3RvcmUgc3lzdGVtLXdpZGUgZGVmYXVsdHMuCisKK1RoZXkgY2FuIGJlIHVzZWQgYnkgYm90aCB0aGUgZ2l0IHBsdW1iaW5nCithbmQgdGhlIHBvcmNlbGFpbnMuIFRoZSB2YXJpYWJsZXMgYXJlIGRpdmlkZWQgaW50byBzZWN0aW9ucywgd2hlcmUKK2luIHRoZSBmdWxseSBxdWFsaWZpZWQgdmFyaWFibGUgbmFtZSB0aGUgdmFyaWFibGUgaXRzZWxmIGlzIHRoZSBsYXN0Citkb3Qtc2VwYXJhdGVkIHNlZ21lbnQgYW5kIHRoZSBzZWN0aW9uIG5hbWUgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGxhc3QKK2RvdC4gVGhlIHZhcmlhYmxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBvbmx5IGFscGhhbnVtZXJpYworY2hhcmFjdGVycyBhcmUgYWxsb3dlZC4gU29tZSB2YXJpYWJsZXMgbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcy4KKworU3ludGF4Cit+fn5+fn4KKworVGhlIHN5bnRheCBpcyBmYWlybHkgZmxleGlibGUgYW5kIHBlcm1pc3NpdmU7IHdoaXRlc3BhY2VzIGFyZSBtb3N0bHkKK2lnbm9yZWQuICBUaGUgJyMnIGFuZCAnOycgY2hhcmFjdGVycyBiZWdpbiBjb21tZW50cyB0byB0aGUgZW5kIG9mIGxpbmUsCitibGFuayBsaW5lcyBhcmUgaWdub3JlZC4KKworVGhlIGZpbGUgY29uc2lzdHMgb2Ygc2VjdGlvbnMgYW5kIHZhcmlhYmxlcy4gIEEgc2VjdGlvbiBiZWdpbnMgd2l0aAordGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaW4gc3F1YXJlIGJyYWNrZXRzIGFuZCBjb250aW51ZXMgdW50aWwgdGhlIG5leHQKK3NlY3Rpb24gYmVnaW5zLiAgU2VjdGlvbiBuYW1lcyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLiAgT25seSBhbHBoYW51bWVyaWMKK2NoYXJhY3RlcnMsICdgLWAnIGFuZCAnYC5gJyBhcmUgYWxsb3dlZCBpbiBzZWN0aW9uIG5hbWVzLiAgRWFjaCB2YXJpYWJsZQorbXVzdCBiZWxvbmcgdG8gc29tZSBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZXJlIG11c3QgYmUgc2VjdGlvbgoraGVhZGVyIGJlZm9yZSBmaXJzdCBzZXR0aW5nIG9mIGEgdmFyaWFibGUuCisKK1NlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWJzZWN0aW9ucy4gIFRvIGJlZ2luIGEgc3Vic2VjdGlvbgorcHV0IGl0cyBuYW1lIGluIGRvdWJsZSBxdW90ZXMsIHNlcGFyYXRlZCBieSBzcGFjZSBmcm9tIHRoZSBzZWN0aW9uIG5hbWUsCitpbiB0aGUgc2VjdGlvbiBoZWFkZXIsIGxpa2UgaW4gZXhhbXBsZSBiZWxvdzoKKworLS0tLS0tLS0KKwlbc2VjdGlvbiAic3Vic2VjdGlvbiJdCisKKy0tLS0tLS0tCisKK1N1YnNlY3Rpb24gbmFtZXMgY2FuIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgZXhjZXB0IG5ld2xpbmUgKGRvdWJsZXF1b3RlCisnYCJgJyBhbmQgYmFja3NsYXNoIGhhdmUgdG8gYmUgZXNjYXBlZCBhcyAnYFwiYCcgYW5kICdgXFxgJywKK3Jlc3BlY3RpdmVseSkgYW5kIGFyZSBjYXNlIHNlbnNpdGl2ZS4gIFNlY3Rpb24gaGVhZGVyIGNhbm5vdCBzcGFuIG11bHRpcGxlCitsaW5lcy4gIFZhcmlhYmxlcyBtYXkgYmVsb25nIGRpcmVjdGx5IHRvIGEgc2VjdGlvbiBvciB0byBhIGdpdmVuIHN1YnNlY3Rpb24uCitZb3UgY2FuIGhhdmUgYFtzZWN0aW9uXWAgaWYgeW91IGhhdmUgYFtzZWN0aW9uICJzdWJzZWN0aW9uIl1gLCBidXQgeW91Citkb24ndCBuZWVkIHRvLgorCitUaGVyZSBpcyBhbHNvIChjYXNlIGluc2Vuc2l0aXZlKSBhbHRlcm5hdGl2ZSBgW3NlY3Rpb24uc3Vic2VjdGlvbl1gIHN5bnRheC4KK0luIHRoaXMgc3ludGF4IHN1YnNlY3Rpb24gbmFtZXMgZm9sbG93IHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBmb3Igc2VjdGlvbgorbmFtZS4KKworQWxsIHRoZSBvdGhlciBsaW5lcyBhcmUgcmVjb2duaXplZCBhcyBzZXR0aW5nIHZhcmlhYmxlcywgaW4gdGhlIGZvcm0KKyduYW1lID0gdmFsdWUnLiAgSWYgdGhlcmUgaXMgbm8gZXF1YWwgc2lnbiBvbiB0aGUgbGluZSwgdGhlIGVudGlyZSBsaW5lCitpcyB0YWtlbiBhcyAnbmFtZScgYW5kIHRoZSB2YXJpYWJsZSBpcyByZWNvZ25pemVkIGFzIGJvb2xlYW4gInRydWUiLgorVGhlIHZhcmlhYmxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBvbmx5IGFscGhhbnVtZXJpYworY2hhcmFjdGVycyBhbmQgJ2AtYCcgYXJlIGFsbG93ZWQuICBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSB2YWx1ZQorZm9yIGEgZ2l2ZW4gdmFyaWFibGU7IHdlIHNheSB0aGVuIHRoYXQgdmFyaWFibGUgaXMgbXVsdGl2YWx1ZWQuCisKK0xlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gYSB2YXJpYWJsZSB2YWx1ZSBpcyBkaXNjYXJkZWQuCitJbnRlcm5hbCB3aGl0ZXNwYWNlIHdpdGhpbiBhIHZhcmlhYmxlIHZhbHVlIGlzIHJldGFpbmVkIHZlcmJhdGltLgorCitUaGUgdmFsdWVzIGZvbGxvd2luZyB0aGUgZXF1YWxzIHNpZ24gaW4gdmFyaWFibGUgYXNzaWduIGFyZSBhbGwgZWl0aGVyCithIHN0cmluZywgYW4gaW50ZWdlciwgb3IgYSBib29sZWFuLiAgQm9vbGVhbiB2YWx1ZXMgbWF5IGJlIGdpdmVuIGFzIHllcy9ubywKKzAvMSBvciB0cnVlL2ZhbHNlLiAgQ2FzZSBpcyBub3Qgc2lnbmlmaWNhbnQgaW4gYm9vbGVhbiB2YWx1ZXMsIHdoZW4KK2NvbnZlcnRpbmcgdmFsdWUgdG8gdGhlIGNhbm9uaWNhbCBmb3JtIHVzaW5nICctLWJvb2wnIHR5cGUgc3BlY2lmaWVyOworYGdpdC1jb25maWdgIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyAidHJ1ZSIgb3IgImZhbHNlIi4KKworU3RyaW5nIHZhbHVlcyBtYXkgYmUgZW50aXJlbHkgb3IgcGFydGlhbGx5IGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuCitZb3UgbmVlZCB0byBlbmNsb3NlIHZhcmlhYmxlIHZhbHVlIGluIGRvdWJsZSBxdW90ZXMgaWYgeW91IHdhbnQgdG8KK3ByZXNlcnZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSwgb3IgaWYgdmFyaWFibGUgdmFsdWUgY29udGFpbnMKK2JlZ2lubmluZyBvZiBjb21tZW50IGNoYXJhY3RlcnMgKGlmIGl0IGNvbnRhaW5zICcjJyBvciAnOycpLgorRG91YmxlIHF1b3RlICdgImAnIGFuZCBiYWNrc2xhc2ggJ2BcYCcgY2hhcmFjdGVycyBpbiB2YXJpYWJsZSB2YWx1ZSBtdXN0CitiZSBlc2NhcGVkOiB1c2UgJ2BcImAnIGZvciAnYCJgJyBhbmQgJ2BcXGAnIGZvciAnYFxgJy4KKworVGhlIGZvbGxvd2luZyBlc2NhcGUgc2VxdWVuY2VzIChiZXNpZGUgJ2BcImAnIGFuZCAnYFxcYCcpIGFyZSByZWNvZ25pemVkOgorJ2BcbmAnIGZvciBuZXdsaW5lIGNoYXJhY3RlciAoTkwpLCAnYFx0YCcgZm9yIGhvcml6b250YWwgdGFidWxhdGlvbiAoSFQsIFRBQikKK2FuZCAnYFxiYCcgZm9yIGJhY2tzcGFjZSAoQlMpLiAgTm8gb3RoZXIgY2hhciBlc2NhcGUgc2VxdWVuY2UsIG5vciBvY3RhbAorY2hhciBzZXF1ZW5jZXMgYXJlIHZhbGlkLgorCitWYXJpYWJsZSB2YWx1ZSBlbmRpbmcgaW4gYSAnYFxgJyBpcyBjb250aW51ZWQgb24gdGhlIG5leHQgbGluZSBpbiB0aGUKK2N1c3RvbWFyeSBVTklYIGZhc2hpb24uCisKK1NvbWUgdmFyaWFibGVzIG1heSByZXF1aXJlIHNwZWNpYWwgdmFsdWUgZm9ybWF0LgorCitFeGFtcGxlCit+fn5+fn5+CisKKwkjIENvcmUgdmFyaWFibGVzCisJW2NvcmVdCisJCTsgRG9uJ3QgdHJ1c3QgZmlsZSBtb2RlcworCQlmaWxlbW9kZSA9IGZhbHNlCisKKwkjIE91ciBkaWZmIGFsZ29yaXRobQorCVtkaWZmXQorCQlleHRlcm5hbCA9ICIvdXNyL2xvY2FsL2Jpbi9nbnUtZGlmZiAtdSIKKwkJcmVuYW1lcyA9IHRydWUKKworCVticmFuY2ggImRldmVsIl0KKwkJcmVtb3RlID0gb3JpZ2luCisJCW1lcmdlID0gcmVmcy9oZWFkcy9kZXZlbAorCisJIyBQcm94eSBzZXR0aW5ncworCVtjb3JlXQorCQlnaXRQcm94eT0ic3NoIiBmb3IgInNzaDovL2tlcm5lbC5vcmcvIgorCQlnaXRQcm94eT1kZWZhdWx0LXByb3h5IDsgZm9yIHRoZSByZXN0CisKK1ZhcmlhYmxlcworfn5+fn5+fn5+CisKK05vdGUgdGhhdCB0aGlzIGxpc3QgaXMgbm9uLWNvbXByZWhlbnNpdmUgYW5kIG5vdCBuZWNlc3NhcmlseSBjb21wbGV0ZS4KK0ZvciBjb21tYW5kLXNwZWNpZmljIHZhcmlhYmxlcywgeW91IHdpbGwgZmluZCBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24KK2luIHRoZSBhcHByb3ByaWF0ZSBtYW51YWwgcGFnZS4gWW91IHdpbGwgZmluZCBhIGRlc2NyaXB0aW9uIG9mIG5vbi1jb3JlCitwb3JjZWxhaW4gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlIHJlc3BlY3RpdmUgcG9yY2VsYWluIGRvY3VtZW50YXRpb24uCisKK2NvcmUuZmlsZU1vZGU6OgorCUlmIGZhbHNlLCB0aGUgZXhlY3V0YWJsZSBiaXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgaW5kZXggYW5kCisJdGhlIHdvcmtpbmcgY29weSBhcmUgaWdub3JlZDsgdXNlZnVsIG9uIGJyb2tlbiBmaWxlc3lzdGVtcyBsaWtlIEZBVC4KKwlTZWUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdLiBUcnVlIGJ5IGRlZmF1bHQuCisKK2NvcmUuYXV0b2NybGY6OgorCUlmIHRydWUsIG1ha2VzIGdpdCBjb252ZXJ0IGBDUkxGYCBhdCB0aGUgZW5kIG9mIGxpbmVzIGluIHRleHQgZmlsZXMgdG8KKwlgTEZgIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBmaWxlc3lzdGVtLCBhbmQgY29udmVydCBpbiByZXZlcnNlIHdoZW4KKwl3cml0aW5nIHRvIHRoZSBmaWxlc3lzdGVtLiAgVGhlIHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8KKwknaW5wdXQnLCBpbiB3aGljaCBjYXNlIHRoZSBjb252ZXJzaW9uIGhhcHBlbnMgb25seSB3aGlsZQorCXJlYWRpbmcgZnJvbSB0aGUgZmlsZXN5c3RlbSBidXQgZmlsZXMgYXJlIHdyaXR0ZW4gb3V0IHdpdGgKKwlgTEZgIGF0IHRoZSBlbmQgb2YgbGluZXMuICBDdXJyZW50bHksIHdoaWNoIHBhdGhzIHRvIGNvbnNpZGVyCisJInRleHQiIChpLmUuIGJlIHN1YmplY3RlZCB0byB0aGUgYXV0b2NybGYgbWVjaGFuaXNtKSBpcworCWRlY2lkZWQgcHVyZWx5IGJhc2VkIG9uIHRoZSBjb250ZW50cy4KKworY29yZS5zeW1saW5rczo6CisJSWYgZmFsc2UsIHN5bWJvbGljIGxpbmtzIGFyZSBjaGVja2VkIG91dCBhcyBzbWFsbCBwbGFpbiBmaWxlcyB0aGF0CisJY29udGFpbiB0aGUgbGluayB0ZXh0LiBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0gYW5kCisJZ2l0bGluazpnaXQtYWRkWzFdIHdpbGwgbm90IGNoYW5nZSB0aGUgcmVjb3JkZWQgdHlwZSB0byByZWd1bGFyCisJZmlsZS4gVXNlZnVsIG9uIGZpbGVzeXN0ZW1zIGxpa2UgRkFUIHRoYXQgZG8gbm90IHN1cHBvcnQKKwlzeW1ib2xpYyBsaW5rcy4gVHJ1ZSBieSBkZWZhdWx0LgorCitjb3JlLmdpdFByb3h5OjoKKwlBICJwcm94eSBjb21tYW5kIiB0byBleGVjdXRlIChhcyAnY29tbWFuZCBob3N0IHBvcnQnKSBpbnN0ZWFkCisJb2YgZXN0YWJsaXNoaW5nIGRpcmVjdCBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgc2VydmVyIHdoZW4KKwl1c2luZyB0aGUgZ2l0IHByb3RvY29sIGZvciBmZXRjaGluZy4gSWYgdGhlIHZhcmlhYmxlIHZhbHVlIGlzCisJaW4gdGhlICJDT01NQU5EIGZvciBET01BSU4iIGZvcm1hdCwgdGhlIGNvbW1hbmQgaXMgYXBwbGllZCBvbmx5CisJb24gaG9zdG5hbWVzIGVuZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZG9tYWluIHN0cmluZy4gVGhpcyB2YXJpYWJsZQorCW1heSBiZSBzZXQgbXVsdGlwbGUgdGltZXMgYW5kIGlzIG1hdGNoZWQgaW4gdGhlIGdpdmVuIG9yZGVyOworCXRoZSBmaXJzdCBtYXRjaCB3aW5zLgorKworQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfUFJPWFlfQ09NTUFORCcgZW52aXJvbm1lbnQgdmFyaWFibGUKKyh3aGljaCBhbHdheXMgYXBwbGllcyB1bml2ZXJzYWxseSwgd2l0aG91dCB0aGUgc3BlY2lhbCAiZm9yIgoraGFuZGxpbmcpLgorCitjb3JlLmlnbm9yZVN0YXQ6OgorCVRoZSB3b3JraW5nIGNvcHkgZmlsZXMgYXJlIGFzc3VtZWQgdG8gc3RheSB1bmNoYW5nZWQgdW50aWwgeW91CisJbWFyayB0aGVtIG90aGVyd2lzZSBtYW51YWxseSAtIEdpdCB3aWxsIG5vdCBkZXRlY3QgdGhlIGZpbGUgY2hhbmdlcworCWJ5IGxzdGF0KCkgY2FsbHMuIFRoaXMgaXMgdXNlZnVsIG9uIHN5c3RlbXMgd2hlcmUgdGhvc2UgYXJlIHZlcnkKKwlzbG93LCBzdWNoIGFzIE1pY3Jvc29mdCBXaW5kb3dzLiAgU2VlIGdpdGxpbms6Z2l0LXVwZGF0ZS1pbmRleFsxXS4KKwlGYWxzZSBieSBkZWZhdWx0LgorCitjb3JlLnByZWZlclN5bWxpbmtSZWZzOjoKKwlJbnN0ZWFkIG9mIHRoZSBkZWZhdWx0ICJzeW1yZWYiIGZvcm1hdCBmb3IgSEVBRAorCWFuZCBvdGhlciBzeW1ib2xpYyByZWZlcmVuY2UgZmlsZXMsIHVzZSBzeW1ib2xpYyBsaW5rcy4KKwlUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgdG8gd29yayB3aXRoIG9sZCBzY3JpcHRzIHRoYXQKKwlleHBlY3QgSEVBRCB0byBiZSBhIHN5bWJvbGljIGxpbmsuCisKK2NvcmUuYmFyZTo6CisJSWYgdHJ1ZSB0aGlzIHJlcG9zaXRvcnkgaXMgYXNzdW1lZCB0byBiZSAnYmFyZScgYW5kIGhhcyBubworCXdvcmtpbmcgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIHRoaXMgaXMgdGhlIGNhc2UgYQorCW51bWJlciBvZiBjb21tYW5kcyB0aGF0IHJlcXVpcmUgYSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIGJlCisJZGlzYWJsZWQsIHN1Y2ggYXMgZ2l0bGluazpnaXQtYWRkWzFdIG9yIGdpdGxpbms6Z2l0LW1lcmdlWzFdLgorKworVGhpcyBzZXR0aW5nIGlzIGF1dG9tYXRpY2FsbHkgZ3Vlc3NlZCBieSBnaXRsaW5rOmdpdC1jbG9uZVsxXSBvcgorZ2l0bGluazpnaXQtaW5pdFsxXSB3aGVuIHRoZSByZXBvc2l0b3J5IHdhcyBjcmVhdGVkLiAgQnkgZGVmYXVsdCBhCityZXBvc2l0b3J5IHRoYXQgZW5kcyBpbiAiLy5naXQiIGlzIGFzc3VtZWQgdG8gYmUgbm90IGJhcmUgKGJhcmUgPQorZmFsc2UpLCB3aGlsZSBhbGwgb3RoZXIgcmVwb3NpdG9yaWVzIGFyZSBhc3N1bWVkIHRvIGJlIGJhcmUgKGJhcmUKKz0gdHJ1ZSkuCisKK2NvcmUubG9nQWxsUmVmVXBkYXRlczo6CisJVXBkYXRlcyB0byBhIHJlZiA8cmVmPiBpcyBsb2dnZWQgdG8gdGhlIGZpbGUKKwkiJEdJVF9ESVIvbG9ncy88cmVmPiIsIGJ5IGFwcGVuZGluZyB0aGUgbmV3IGFuZCBvbGQKKwlTSEExLCB0aGUgZGF0ZS90aW1lIGFuZCB0aGUgcmVhc29uIG9mIHRoZSB1cGRhdGUsIGJ1dAorCW9ubHkgd2hlbiB0aGUgZmlsZSBleGlzdHMuICBJZiB0aGlzIGNvbmZpZ3VyYXRpb24KKwl2YXJpYWJsZSBpcyBzZXQgdG8gdHJ1ZSwgbWlzc2luZyAiJEdJVF9ESVIvbG9ncy88cmVmPiIKKwlmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgYnJhbmNoIGhlYWRzLgorKworVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBjb21taXQKK3dhcyB0aGUgdGlwIG9mIGEgYnJhbmNoICIyIGRheXMgYWdvIi4KKysKK1RoaXMgdmFsdWUgaXMgdHJ1ZSBieSBkZWZhdWx0IGluIGEgcmVwb3NpdG9yeSB0aGF0IGhhcworYSB3b3JraW5nIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggaXQsIGFuZCBmYWxzZSBieQorZGVmYXVsdCBpbiBhIGJhcmUgcmVwb3NpdG9yeS4KKworY29yZS5yZXBvc2l0b3J5Rm9ybWF0VmVyc2lvbjo6CisJSW50ZXJuYWwgdmFyaWFibGUgaWRlbnRpZnlpbmcgdGhlIHJlcG9zaXRvcnkgZm9ybWF0IGFuZCBsYXlvdXQKKwl2ZXJzaW9uLgorCitjb3JlLnNoYXJlZFJlcG9zaXRvcnk6OgorCVdoZW4gJ2dyb3VwJyAob3IgJ3RydWUnKSwgdGhlIHJlcG9zaXRvcnkgaXMgbWFkZSBzaGFyZWFibGUgYmV0d2VlbgorCXNldmVyYWwgdXNlcnMgaW4gYSBncm91cCAobWFraW5nIHN1cmUgYWxsIHRoZSBmaWxlcyBhbmQgb2JqZWN0cyBhcmUKKwlncm91cC13cml0YWJsZSkuIFdoZW4gJ2FsbCcgKG9yICd3b3JsZCcgb3IgJ2V2ZXJ5Ym9keScpLCB0aGUKKwlyZXBvc2l0b3J5IHdpbGwgYmUgcmVhZGFibGUgYnkgYWxsIHVzZXJzLCBhZGRpdGlvbmFsbHkgdG8gYmVpbmcKKwlncm91cC1zaGFyZWFibGUuIFdoZW4gJ3VtYXNrJyAob3IgJ2ZhbHNlJyksIGdpdCB3aWxsIHVzZSBwZXJtaXNzaW9ucworCXJlcG9ydGVkIGJ5IHVtYXNrKDIpLiBTZWUgZ2l0bGluazpnaXQtaW5pdFsxXS4gRmFsc2UgYnkgZGVmYXVsdC4KKworY29yZS53YXJuQW1iaWd1b3VzUmVmczo6CisJSWYgdHJ1ZSwgZ2l0IHdpbGwgd2FybiB5b3UgaWYgdGhlIHJlZiBuYW1lIHlvdSBwYXNzZWQgaXQgaXMgYW1iaWd1b3VzCisJYW5kIG1pZ2h0IG1hdGNoIG11bHRpcGxlIHJlZnMgaW4gdGhlIC5naXQvcmVmcy8gdHJlZS4gVHJ1ZSBieSBkZWZhdWx0LgorCitjb3JlLmNvbXByZXNzaW9uOjoKKwlBbiBpbnRlZ2VyIC0xLi45LCBpbmRpY2F0aW5nIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3Igb2JqZWN0cyB0aGF0CisJYXJlIG5vdCBpbiBhIHBhY2sgZmlsZS4gLTEgaXMgdGhlIHpsaWIgYW5kIGdpdCBkZWZhdWx0LiAwIG1lYW5zIG5vCisJY29tcHJlc3Npb24sIGFuZCAxLi45IGFyZSB2YXJpb3VzIHNwZWVkL3NpemUgdHJhZGVvZmZzLCA5IGJlaW5nCisJc2xvd2VzdC4KKworY29yZS5sZWdhY3loZWFkZXJzOjoKKwlBIGJvb2xlYW4gd2hpY2gKKwljaGFuZ2VzIHRoZSBmb3JtYXQgb2YgbG9vc2Ugb2JqZWN0cyBzbyB0aGF0IHRoZXkgYXJlIG1vcmUKKwllZmZpY2llbnQgdG8gcGFjayBhbmQgdG8gc2VuZCBvdXQgb2YgdGhlIHJlcG9zaXRvcnkgb3ZlciBnaXQKKwluYXRpdmUgcHJvdG9jb2wsIHNpbmNlIHYxLjQuMi4gIEhvd2V2ZXIsIGxvb3NlIG9iamVjdHMKKwl3cml0dGVuIGluIHRoZSBuZXcgZm9ybWF0IGNhbm5vdCBiZSByZWFkIGJ5IGdpdCBvbGRlciB0aGFuCisJdGhhdCB2ZXJzaW9uOyBwZW9wbGUgZmV0Y2hpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgdXNpbmcKKwlvbGRlciB2ZXJzaW9ucyBvZiBnaXQgb3ZlciBkdW1iIHRyYW5zcG9ydHMgKGUuZy4gaHR0cCkKKwl3aWxsIGFsc28gYmUgYWZmZWN0ZWQuCisrCitUbyBsZXQgZ2l0IHVzZSB0aGUgbmV3IGxvb3NlIG9iamVjdCBmb3JtYXQsIHlvdSBoYXZlIHRvCitzZXQgY29yZS5sZWdhY3loZWFkZXJzIHRvIGZhbHNlLgorCitjb3JlLnBhY2tlZEdpdFdpbmRvd1NpemU6OgorCU51bWJlciBvZiBieXRlcyBvZiBhIHBhY2sgZmlsZSB0byBtYXAgaW50byBtZW1vcnkgaW4gYQorCXNpbmdsZSBtYXBwaW5nIG9wZXJhdGlvbi4gIExhcmdlciB3aW5kb3cgc2l6ZXMgbWF5IGFsbG93CisJeW91ciBzeXN0ZW0gdG8gcHJvY2VzcyBhIHNtYWxsZXIgbnVtYmVyIG9mIGxhcmdlIHBhY2sgZmlsZXMKKwltb3JlIHF1aWNrbHkuICBTbWFsbGVyIHdpbmRvdyBzaXplcyB3aWxsIG5lZ2F0aXZlbHkgYWZmZWN0CisJcGVyZm9ybWFuY2UgZHVlIHRvIGluY3JlYXNlZCBjYWxscyB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzCisJbWVtb3J5IG1hbmFnZXIsIGJ1dCBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIGFjY2Vzc2luZworCWEgbGFyZ2UgbnVtYmVyIG9mIGxhcmdlIHBhY2sgZmlsZXMuCisrCitEZWZhdWx0IGlzIDEgTWlCIGlmIE5PX01NQVAgd2FzIHNldCBhdCBjb21waWxlIHRpbWUsIG90aGVyd2lzZSAzMgorTWlCIG9uIDMyIGJpdCBwbGF0Zm9ybXMgYW5kIDEgR2lCIG9uIDY0IGJpdCBwbGF0Zm9ybXMuICBUaGlzIHNob3VsZAorYmUgcmVhc29uYWJsZSBmb3IgYWxsIHVzZXJzL29wZXJhdGluZyBzeXN0ZW1zLiAgWW91IHByb2JhYmx5IGRvCitub3QgbmVlZCB0byBhZGp1c3QgdGhpcyB2YWx1ZS4KKysKK0NvbW1vbiB1bml0IHN1ZmZpeGVzIG9mICdrJywgJ20nLCBvciAnZycgYXJlIHN1cHBvcnRlZC4KKworY29yZS5wYWNrZWRHaXRMaW1pdDo6CisJTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFwIHNpbXVsdGFuZW91c2x5IGludG8gbWVtb3J5CisJZnJvbSBwYWNrIGZpbGVzLiAgSWYgR2l0IG5lZWRzIHRvIGFjY2VzcyBtb3JlIHRoYW4gdGhpcyBtYW55CisJYnl0ZXMgYXQgb25jZSB0byBjb21wbGV0ZSBhbiBvcGVyYXRpb24gaXQgd2lsbCB1bm1hcCBleGlzdGluZworCXJlZ2lvbnMgdG8gcmVjbGFpbSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2Ugd2l0aGluIHRoZSBwcm9jZXNzLgorKworRGVmYXVsdCBpcyAyNTYgTWlCIG9uIDMyIGJpdCBwbGF0Zm9ybXMgYW5kIDggR2lCIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCitUaGlzIHNob3VsZCBiZSByZWFzb25hYmxlIGZvciBhbGwgdXNlcnMvb3BlcmF0aW5nIHN5c3RlbXMsIGV4Y2VwdCBvbgordGhlIGxhcmdlc3QgcHJvamVjdHMuICBZb3UgcHJvYmFibHkgZG8gbm90IG5lZWQgdG8gYWRqdXN0IHRoaXMgdmFsdWUuCisrCitDb21tb24gdW5pdCBzdWZmaXhlcyBvZiAnaycsICdtJywgb3IgJ2cnIGFyZSBzdXBwb3J0ZWQuCisKK2NvcmUuZGVsdGFCYXNlQ2FjaGVMaW1pdDo6CisJTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVzZXJ2ZSBmb3IgY2FjaGluZyBiYXNlIG9iamVjdHMKKwl0aGF0IG11bHRpcGxlIGRlbHRhZmllZCBvYmplY3RzIHJlZmVyZW5jZS4gIEJ5IHN0b3JpbmcgdGhlCisJZW50aXJlIGRlY29tcHJlc3NlZCBiYXNlIG9iamVjdHMgaW4gYSBjYWNoZSBHaXQgaXMgYWJsZQorCXRvIGF2b2lkIHVucGFja2luZyBhbmQgZGVjb21wcmVzc2luZyBmcmVxdWVudGx5IHVzZWQgYmFzZQorCW9iamVjdHMgbXVsdGlwbGUgdGltZXMuCisrCitEZWZhdWx0IGlzIDE2IE1pQiBvbiBhbGwgcGxhdGZvcm1zLiAgVGhpcyBzaG91bGQgYmUgcmVhc29uYWJsZQorZm9yIGFsbCB1c2Vycy9vcGVyYXRpbmcgc3lzdGVtcywgZXhjZXB0IG9uIHRoZSBsYXJnZXN0IHByb2plY3RzLgorWW91IHByb2JhYmx5IGRvIG5vdCBuZWVkIHRvIGFkanVzdCB0aGlzIHZhbHVlLgorKworQ29tbW9uIHVuaXQgc3VmZml4ZXMgb2YgJ2snLCAnbScsIG9yICdnJyBhcmUgc3VwcG9ydGVkLgorCitjb3JlLmV4Y2x1ZGVzZmlsZTo6CisJSW4gYWRkaXRpb24gdG8gJy5naXRpZ25vcmUnIChwZXItZGlyZWN0b3J5KSBhbmQKKwknLmdpdC9pbmZvL2V4Y2x1ZGUnLCBnaXQgbG9va3MgaW50byB0aGlzIGZpbGUgZm9yIHBhdHRlcm5zCisJb2YgZmlsZXMgd2hpY2ggYXJlIG5vdCBtZWFudCB0byBiZSB0cmFja2VkLiAgU2VlCisJZ2l0bGluazpnaXRpZ25vcmVbNV0uCisKK2FsaWFzLio6OgorCUNvbW1hbmQgYWxpYXNlcyBmb3IgdGhlIGdpdGxpbms6Z2l0WzFdIGNvbW1hbmQgd3JhcHBlciAtIGUuZy4KKwlhZnRlciBkZWZpbmluZyAiYWxpYXMubGFzdCA9IGNhdC1maWxlIGNvbW1pdCBIRUFEIiwgdGhlIGludm9jYXRpb24KKwkiZ2l0IGxhc3QiIGlzIGVxdWl2YWxlbnQgdG8gImdpdCBjYXQtZmlsZSBjb21taXQgSEVBRCIuIFRvIGF2b2lkCisJY29uZnVzaW9uIGFuZCB0cm91YmxlcyB3aXRoIHNjcmlwdCB1c2FnZSwgYWxpYXNlcyB0aGF0CisJaGlkZSBleGlzdGluZyBnaXQgY29tbWFuZHMgYXJlIGlnbm9yZWQuIEFyZ3VtZW50cyBhcmUgc3BsaXQgYnkKKwlzcGFjZXMsIHRoZSB1c3VhbCBzaGVsbCBxdW90aW5nIGFuZCBlc2NhcGluZyBpcyBzdXBwb3J0ZWQuCisJcXVvdGUgcGFpciBhbmQgYSBiYWNrc2xhc2ggY2FuIGJlIHVzZWQgdG8gcXVvdGUgdGhlbS4KKworCUlmIHRoZSBhbGlhcyBleHBhbnNpb24gaXMgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvbiBwb2ludCwKKwlpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaGVsbCBjb21tYW5kLiAgRm9yIGV4YW1wbGUsIGRlZmluaW5nCisJImFsaWFzLm5ldyA9ICFnaXRrIC0tYWxsIC0tbm90IE9SSUdfSEVBRCIsIHRoZSBpbnZvY2F0aW9uCisJImdpdCBuZXciIGlzIGVxdWl2YWxlbnQgdG8gcnVubmluZyB0aGUgc2hlbGwgY29tbWFuZAorCSJnaXRrIC0tYWxsIC0tbm90IE9SSUdfSEVBRCIuCisKK2FwcGx5LndoaXRlc3BhY2U6OgorCVRlbGxzIGBnaXQtYXBwbHlgIGhvdyB0byBoYW5kbGUgd2hpdGVzcGFjZXMsIGluIHRoZSBzYW1lIHdheQorCWFzIHRoZSAnLS13aGl0ZXNwYWNlJyBvcHRpb24uIFNlZSBnaXRsaW5rOmdpdC1hcHBseVsxXS4KKworYnJhbmNoLmF1dG9zZXR1cG1lcmdlOjoKKwlUZWxscyBgZ2l0LWJyYW5jaGAgYW5kIGBnaXQtY2hlY2tvdXRgIHRvIHNldHVwIG5ldyBicmFuY2hlcworCXNvIHRoYXQgZ2l0bGluazpnaXQtcHVsbFsxXSB3aWxsIGFwcHJvcHJpYXRlbHkgbWVyZ2UgZnJvbSB0aGF0CisJcmVtb3RlIGJyYW5jaC4gIE5vdGUgdGhhdCBldmVuIGlmIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQsCisJdGhpcyBiZWhhdmlvciBjYW4gYmUgY2hvc2VuIHBlci1icmFuY2ggdXNpbmcgdGhlIGAtLXRyYWNrYAorCWFuZCBgLS1uby10cmFja2Agb3B0aW9ucy4gIFRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIGZhbHNlLgorCiticmFuY2guPG5hbWU+LnJlbW90ZTo6CisJV2hlbiBpbiBicmFuY2ggPG5hbWU+LCBpdCB0ZWxscyBgZ2l0IGZldGNoYCB3aGljaCByZW1vdGUgdG8gZmV0Y2guCisJSWYgdGhpcyBvcHRpb24gaXMgbm90IGdpdmVuLCBgZ2l0IGZldGNoYCBkZWZhdWx0cyB0byByZW1vdGUgIm9yaWdpbiIuCisKK2JyYW5jaC48bmFtZT4ubWVyZ2U6OgorCVdoZW4gaW4gYnJhbmNoIDxuYW1lPiwgaXQgdGVsbHMgYGdpdCBmZXRjaGAgdGhlIGRlZmF1bHQgcmVmc3BlYyB0bworCWJlIG1hcmtlZCBmb3IgbWVyZ2luZyBpbiBGRVRDSF9IRUFELiBUaGUgdmFsdWUgaGFzIGV4YWN0bHkgdG8gbWF0Y2gKKwlhIHJlbW90ZSBwYXJ0IG9mIG9uZSBvZiB0aGUgcmVmc3BlY3Mgd2hpY2ggYXJlIGZldGNoZWQgZnJvbSB0aGUgcmVtb3RlCisJZ2l2ZW4gYnkgImJyYW5jaC48bmFtZT4ucmVtb3RlIi4KKwlUaGUgbWVyZ2UgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBgZ2l0IHB1bGxgICh3aGljaCBhdCBmaXJzdCBjYWxscworCWBnaXQgZmV0Y2hgKSB0byBsb29rdXAgdGhlIGRlZmF1bHQgYnJhbmNoIGZvciBtZXJnaW5nLiBXaXRob3V0CisJdGhpcyBvcHRpb24sIGBnaXQgcHVsbGAgZGVmYXVsdHMgdG8gbWVyZ2UgdGhlIGZpcnN0IHJlZnNwZWMgZmV0Y2hlZC4KKwlTcGVjaWZ5IG11bHRpcGxlIHZhbHVlcyB0byBnZXQgYW4gb2N0b3B1cyBtZXJnZS4KKwlJZiB5b3Ugd2lzaCB0byBzZXR1cCBgZ2l0IHB1bGxgIHNvIHRoYXQgaXQgbWVyZ2VzIGludG8gPG5hbWU+IGZyb20KKwlhbm90aGVyIGJyYW5jaCBpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeSwgeW91IGNhbiBwb2ludAorCWJyYW5jaC48bmFtZT4ubWVyZ2UgdG8gdGhlIGRlc2lyZWQgYnJhbmNoLCBhbmQgdXNlIHRoZSBzcGVjaWFsIHNldHRpbmcKKwlgLmAgKGEgcGVyaW9kKSBmb3IgYnJhbmNoLjxuYW1lPi5yZW1vdGUuCisKK2NsZWFuLnJlcXVpcmVGb3JjZTo6CisJQSBib29sZWFuIHRvIG1ha2UgZ2l0LWNsZWFuIGRvIG5vdGhpbmcgdW5sZXNzIGdpdmVuIC1mIG9yIC1uLiAgRGVmYXVsdHMKKwl0byBmYWxzZS4KKworY29sb3IuYnJhbmNoOjoKKwlBIGJvb2xlYW4gdG8gZW5hYmxlL2Rpc2FibGUgY29sb3IgaW4gdGhlIG91dHB1dCBvZgorCWdpdGxpbms6Z2l0LWJyYW5jaFsxXS4gTWF5IGJlIHNldCB0byBgdHJ1ZWAgKG9yIGBhbHdheXNgKSwKKwlgZmFsc2VgIChvciBgbmV2ZXJgKSBvciBgYXV0b2AsIGluIHdoaWNoIGNhc2UgY29sb3JzIGFyZSB1c2VkCisJb25seSB3aGVuIHRoZSBvdXRwdXQgaXMgdG8gYSB0ZXJtaW5hbC4gRGVmYXVsdHMgdG8gZmFsc2UuCisKK2NvbG9yLmJyYW5jaC48c2xvdD46OgorCVVzZSBjdXN0b21pemVkIGNvbG9yIGZvciBicmFuY2ggY29sb3JhdGlvbi4gYDxzbG90PmAgaXMgb25lIG9mCisJYGN1cnJlbnRgICh0aGUgY3VycmVudCBicmFuY2gpLCBgbG9jYWxgIChhIGxvY2FsIGJyYW5jaCksCisJYHJlbW90ZWAgKGEgdHJhY2tpbmcgYnJhbmNoIGluIHJlZnMvcmVtb3Rlcy8pLCBgcGxhaW5gIChvdGhlcgorCXJlZnMpLgorKworVGhlIHZhbHVlIGZvciB0aGVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpcyBhIGxpc3Qgb2YgY29sb3JzIChhdCBtb3N0Cit0d28pIGFuZCBhdHRyaWJ1dGVzIChhdCBtb3N0IG9uZSksIHNlcGFyYXRlZCBieSBzcGFjZXMuICBUaGUgY29sb3JzCithY2NlcHRlZCBhcmUgYG5vcm1hbGAsIGBibGFja2AsIGByZWRgLCBgZ3JlZW5gLCBgeWVsbG93YCwgYGJsdWVgLAorYG1hZ2VudGFgLCBgY3lhbmAgYW5kIGB3aGl0ZWA7IHRoZSBhdHRyaWJ1dGVzIGFyZSBgYm9sZGAsIGBkaW1gLCBgdWxgLAorYGJsaW5rYCBhbmQgYHJldmVyc2VgLiAgVGhlIGZpcnN0IGNvbG9yIGdpdmVuIGlzIHRoZSBmb3JlZ3JvdW5kOyB0aGUKK3NlY29uZCBpcyB0aGUgYmFja2dyb3VuZC4gIFRoZSBwb3NpdGlvbiBvZiB0aGUgYXR0cmlidXRlLCBpZiBhbnksCitkb2Vzbid0IG1hdHRlci4KKworY29sb3IuZGlmZjo6CisJV2hlbiB0cnVlIChvciBgYWx3YXlzYCksIGFsd2F5cyB1c2UgY29sb3JzIGluIHBhdGNoLgorCVdoZW4gZmFsc2UgKG9yIGBuZXZlcmApLCBuZXZlci4gIFdoZW4gc2V0IHRvIGBhdXRvYCwgdXNlCisJY29sb3JzIG9ubHkgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIHRoZSB0ZXJtaW5hbC4KKworY29sb3IuZGlmZi48c2xvdD46OgorCVVzZSBjdXN0b21pemVkIGNvbG9yIGZvciBkaWZmIGNvbG9yaXphdGlvbi4gIGA8c2xvdD5gIHNwZWNpZmllcworCXdoaWNoIHBhcnQgb2YgdGhlIHBhdGNoIHRvIHVzZSB0aGUgc3BlY2lmaWVkIGNvbG9yLCBhbmQgaXMgb25lCisJb2YgYHBsYWluYCAoY29udGV4dCB0ZXh0KSwgYG1ldGFgIChtZXRhaW5mb3JtYXRpb24pLCBgZnJhZ2AKKwkoaHVuayBoZWFkZXIpLCBgb2xkYCAocmVtb3ZlZCBsaW5lcyksIGBuZXdgIChhZGRlZCBsaW5lcyksCisJYGNvbW1pdGAgKGNvbW1pdCBoZWFkZXJzKSwgb3IgYHdoaXRlc3BhY2VgIChoaWdobGlnaHRpbmcgZHViaW91cworCXdoaXRlc3BhY2UpLiAgVGhlIHZhbHVlcyBvZiB0aGVzZSB2YXJpYWJsZXMgbWF5IGJlIHNwZWNpZmllZCBhcworCWluIGNvbG9yLmJyYW5jaC48c2xvdD4uCisKK2NvbG9yLnBhZ2VyOjoKKwlBIGJvb2xlYW4gdG8gZW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQgd2hlbiB0aGUgcGFnZXIgaXMgaW4KKwl1c2UgKGRlZmF1bHQgaXMgdHJ1ZSkuCisKK2NvbG9yLnN0YXR1czo6CisJQSBib29sZWFuIHRvIGVuYWJsZS9kaXNhYmxlIGNvbG9yIGluIHRoZSBvdXRwdXQgb2YKKwlnaXRsaW5rOmdpdC1zdGF0dXNbMV0uIE1heSBiZSBzZXQgdG8gYHRydWVgIChvciBgYWx3YXlzYCksCisJYGZhbHNlYCAob3IgYG5ldmVyYCkgb3IgYGF1dG9gLCBpbiB3aGljaCBjYXNlIGNvbG9ycyBhcmUgdXNlZAorCW9ubHkgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIGEgdGVybWluYWwuIERlZmF1bHRzIHRvIGZhbHNlLgorCitjb2xvci5zdGF0dXMuPHNsb3Q+OjoKKwlVc2UgY3VzdG9taXplZCBjb2xvciBmb3Igc3RhdHVzIGNvbG9yaXphdGlvbi4gYDxzbG90PmAgaXMKKwlvbmUgb2YgYGhlYWRlcmAgKHRoZSBoZWFkZXIgdGV4dCBvZiB0aGUgc3RhdHVzIG1lc3NhZ2UpLAorCWBhZGRlZGAgb3IgYHVwZGF0ZWRgIChmaWxlcyB3aGljaCBhcmUgYWRkZWQgYnV0IG5vdCBjb21taXR0ZWQpLAorCWBjaGFuZ2VkYCAoZmlsZXMgd2hpY2ggYXJlIGNoYW5nZWQgYnV0IG5vdCBhZGRlZCBpbiB0aGUgaW5kZXgpLAorCW9yIGB1bnRyYWNrZWRgIChmaWxlcyB3aGljaCBhcmUgbm90IHRyYWNrZWQgYnkgZ2l0KS4gVGhlIHZhbHVlcyBvZgorCXRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluIGNvbG9yLmJyYW5jaC48c2xvdD4uCisKK2RpZmYucmVuYW1lTGltaXQ6OgorCVRoZSBudW1iZXIgb2YgZmlsZXMgdG8gY29uc2lkZXIgd2hlbiBwZXJmb3JtaW5nIHRoZSBjb3B5L3JlbmFtZQorCWRldGVjdGlvbjsgZXF1aXZhbGVudCB0byB0aGUgZ2l0IGRpZmYgb3B0aW9uICctbCcuCisKK2RpZmYucmVuYW1lczo6CisJVGVsbHMgZ2l0IHRvIGRldGVjdCByZW5hbWVzLiAgSWYgc2V0IHRvIGFueSBib29sZWFuIHZhbHVlLCBpdAorCXdpbGwgZW5hYmxlIGJhc2ljIHJlbmFtZSBkZXRlY3Rpb24uICBJZiBzZXQgdG8gImNvcGllcyIgb3IKKwkiY29weSIsIGl0IHdpbGwgZGV0ZWN0IGNvcGllcywgYXMgd2VsbC4KKworZmV0Y2gudW5wYWNrTGltaXQ6OgorCUlmIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBmZXRjaGVkIG92ZXIgdGhlIGdpdCBuYXRpdmUKKwl0cmFuc2ZlciBpcyBiZWxvdyB0aGlzCisJbGltaXQsIHRoZW4gdGhlIG9iamVjdHMgd2lsbCBiZSB1bnBhY2tlZCBpbnRvIGxvb3NlIG9iamVjdAorCWZpbGVzLiBIb3dldmVyIGlmIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb2JqZWN0cyBlcXVhbHMgb3IKKwlleGNlZWRzIHRoaXMgbGltaXQgdGhlbiB0aGUgcmVjZWl2ZWQgcGFjayB3aWxsIGJlIHN0b3JlZCBhcworCWEgcGFjaywgYWZ0ZXIgYWRkaW5nIGFueSBtaXNzaW5nIGRlbHRhIGJhc2VzLiAgU3RvcmluZyB0aGUKKwlwYWNrIGZyb20gYSBwdXNoIGNhbiBtYWtlIHRoZSBwdXNoIG9wZXJhdGlvbiBjb21wbGV0ZSBmYXN0ZXIsCisJZXNwZWNpYWxseSBvbiBzbG93IGZpbGVzeXN0ZW1zLgorCitmb3JtYXQuaGVhZGVyczo6CisJQWRkaXRpb25hbCBlbWFpbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gYSBwYXRjaCB0byBiZSBzdWJtaXR0ZWQKKwlieSBtYWlsLiAgU2VlIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXS4KKworZm9ybWF0LnN1ZmZpeDo6CisJVGhlIGRlZmF1bHQgZm9yIGZvcm1hdC1wYXRjaCBpcyB0byBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgc3VmZml4CisJYC5wYXRjaGAuIFVzZSB0aGlzIHZhcmlhYmxlIHRvIGNoYW5nZSB0aGF0IHN1ZmZpeCAobWFrZSBzdXJlIHRvCisJaW5jbHVkZSB0aGUgZG90IGlmIHlvdSB3YW50IGl0KS4KKworZ2MucGFja3JlZnM6OgorCWBnaXQgZ2NgIGRvZXMgbm90IHJ1biBgZ2l0IHBhY2stcmVmc2AgaW4gYSBiYXJlIHJlcG9zaXRvcnkgYnkKKwlkZWZhdWx0IHNvIHRoYXQgb2xkZXIgZHVtYi10cmFuc3BvcnQgY2xpZW50cyBjYW4gc3RpbGwgZmV0Y2gKKwlmcm9tIHRoZSByZXBvc2l0b3J5LiAgU2V0dGluZyB0aGlzIHRvIGB0cnVlYCBsZXRzIGBnaXQKKwlnY2AgdG8gcnVuIGBnaXQgcGFjay1yZWZzYC4gIFNldHRpbmcgdGhpcyB0byBgZmFsc2VgIHRlbGxzCisJYGdpdCBnY2AgbmV2ZXIgdG8gcnVuIGBnaXQgcGFjay1yZWZzYC4gVGhlIGRlZmF1bHQgc2V0dGluZyBpcworCWBub3RiYXJlYC4gRW5hYmxlIGl0IG9ubHkgd2hlbiB5b3Uga25vdyB5b3UgZG8gbm90IGhhdmUgdG8KKwlzdXBwb3J0IHN1Y2ggY2xpZW50cy4gIFRoZSBkZWZhdWx0IHNldHRpbmcgd2lsbCBjaGFuZ2UgdG8gYHRydWVgCisJYXQgc29tZSBzdGFnZSwgYW5kIHNldHRpbmcgdGhpcyB0byBgZmFsc2VgIHdpbGwgY29udGludWUgdG8KKwlwcmV2ZW50IGBnaXQgcGFjay1yZWZzYCBmcm9tIGJlaW5nIHJ1biBmcm9tIGBnaXQgZ2NgLgorCitnYy5yZWZsb2dleHBpcmU6OgorCWBnaXQgcmVmbG9nIGV4cGlyZWAgcmVtb3ZlcyByZWZsb2cgZW50cmllcyBvbGRlciB0aGFuCisJdGhpcyB0aW1lOyBkZWZhdWx0cyB0byA5MCBkYXlzLgorCitnYy5yZWZsb2dleHBpcmV1bnJlYWNoYWJsZTo6CisJYGdpdCByZWZsb2cgZXhwaXJlYCByZW1vdmVzIHJlZmxvZyBlbnRyaWVzIG9sZGVyIHRoYW4KKwl0aGlzIHRpbWUgYW5kIGFyZSBub3QgcmVhY2hhYmxlIGZyb20gdGhlIGN1cnJlbnQgdGlwOworCWRlZmF1bHRzIHRvIDMwIGRheXMuCisKK2djLnJlcmVyZXJlc29sdmVkOjoKKwlSZWNvcmRzIG9mIGNvbmZsaWN0ZWQgbWVyZ2UgeW91IHJlc29sdmVkIGVhcmxpZXIgYXJlCisJa2VwdCBmb3IgdGhpcyBtYW55IGRheXMgd2hlbiBgZ2l0IHJlcmVyZSBnY2AgaXMgcnVuLgorCVRoZSBkZWZhdWx0IGlzIDYwIGRheXMuICBTZWUgZ2l0bGluazpnaXQtcmVyZXJlWzFdLgorCitnYy5yZXJlcmV1bnJlc29sdmVkOjoKKwlSZWNvcmRzIG9mIGNvbmZsaWN0ZWQgbWVyZ2UgeW91IGhhdmUgbm90IHJlc29sdmVkIGFyZQorCWtlcHQgZm9yIHRoaXMgbWFueSBkYXlzIHdoZW4gYGdpdCByZXJlcmUgZ2NgIGlzIHJ1bi4KKwlUaGUgZGVmYXVsdCBpcyAxNSBkYXlzLiAgU2VlIGdpdGxpbms6Z2l0LXJlcmVyZVsxXS4KKworZ2l0Y3ZzLmVuYWJsZWQ6OgorCVdoZXRoZXIgdGhlIGN2cyBzZXJ2ZXIgaW50ZXJmYWNlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcmVwb3NpdG9yeS4KKwlTZWUgZ2l0bGluazpnaXQtY3Zzc2VydmVyWzFdLgorCitnaXRjdnMubG9nZmlsZTo6CisJUGF0aCB0byBhIGxvZyBmaWxlIHdoZXJlIHRoZSBjdnMgc2VydmVyIGludGVyZmFjZSB3ZWxsLi4uIGxvZ3MKKwl2YXJpb3VzIHN0dWZmLiBTZWUgZ2l0bGluazpnaXQtY3Zzc2VydmVyWzFdLgorCitnaXRjdnMuYWxsYmluYXJ5OjoKKwlJZiB0cnVlLCBhbGwgZmlsZXMgYXJlIHNlbnQgdG8gdGhlIGNsaWVudCBpbiBtb2RlICcta2InLiBUaGlzCisJY2F1c2VzIHRoZSBjbGllbnQgdG8gdHJlYXQgYWxsIGZpbGVzIGFzIGJpbmFyeSBmaWxlcyB3aGljaCBzdXBwcmVzc2VzCisJYW55IG5ld2xpbmUgbXVuZ2luZyBpdCBvdGhlcndpc2UgbWlnaHQgZG8uIEEgd29yay1hcm91bmQgZm9yIHRoZQorCWZhY3QgdGhhdCB0aGVyZSBpcyBubyB3YXkgeWV0IHRvIHNldCBzaW5nbGUgZmlsZXMgdG8gbW9kZSAnLWtiJy4KKworZ2l0Y3ZzLmRibmFtZTo6CisJRGF0YWJhc2UgdXNlZCBieSBnaXQtY3Zzc2VydmVyIHRvIGNhY2hlIHJldmlzaW9uIGluZm9ybWF0aW9uCisJZGVyaXZlZCBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeS4gVGhlIGV4YWN0IG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUKKwl1c2VkIGRhdGFiYXNlIGRyaXZlciwgZm9yIFNRTGl0ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZHJpdmVyKSB0aGlzCisJaXMgYSBmaWxlbmFtZS4gU3VwcG9ydHMgdmFyaWFibGUgc3Vic3RpdHV0aW9uIChzZWUKKwlnaXRsaW5rOmdpdC1jdnNzZXJ2ZXJbMV0gZm9yIGRldGFpbHMpLiBNYXkgbm90IGNvbnRhaW4gc2VtaWNvbG9ucyAoYDtgKS4KKwlEZWZhdWx0OiAnJUdnaXRjdnMuJW0uc3FsaXRlJworCitnaXRjdnMuZGJkcml2ZXI6OgorCVVzZWQgUGVybCBEQkkgZHJpdmVyLiBZb3UgY2FuIHNwZWNpZnkgYW55IGF2YWlsYWJsZSBkcml2ZXIKKyAgICAgICAgZm9yIHRoaXMgaGVyZSwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrLiBnaXQtY3Zzc2VydmVyIGlzIHRlc3RlZAorCXdpdGggJ0RCRDo6U1FMaXRlJywgcmVwb3J0ZWQgdG8gd29yayB3aXRoICdEQkQ6OlBnJywgYW5kCisJcmVwb3J0ZWQgKm5vdCogdG8gd29yayB3aXRoICdEQkQ6Om15c3FsJy4gRXhwZXJpbWVudGFsIGZlYXR1cmUuCisJTWF5IG5vdCBjb250YWluIGRvdWJsZSBjb2xvbnMgKGA6YCkuIERlZmF1bHQ6ICdTUUxpdGUnLgorCVNlZSBnaXRsaW5rOmdpdC1jdnNzZXJ2ZXJbMV0uCisKK2dpdGN2cy5kYnVzZXIsIGdpdGN2cy5kYnBhc3M6OgorCURhdGFiYXNlIHVzZXIgYW5kIHBhc3N3b3JkLiBPbmx5IHVzZWZ1bCBpZiBzZXR0aW5nICdnaXRjdnMuZGJkcml2ZXInLAorCXNpbmNlIFNRTGl0ZSBoYXMgbm8gY29uY2VwdCBvZiBkYXRhYmFzZSB1c2VycyBhbmQvb3IgcGFzc3dvcmRzLgorCSdnaXRjdnMuZGJ1c2VyJyBzdXBwb3J0cyB2YXJpYWJsZSBzdWJzdGl0dXRpb24gKHNlZQorCWdpdGxpbms6Z2l0LWN2c3NlcnZlclsxXSBmb3IgZGV0YWlscykuCisKK0FsbCBnaXRjdnMgdmFyaWFibGVzIGV4Y2VwdCBmb3IgJ2dpdGN2cy5hbGxiaW5hcnknIGNhbiBhbHNvIHNwZWNpZmVkCithcyAnZ2l0Y3ZzLjxhY2Nlc3NfbWV0aG9kPi48dmFybmFtZT4nICh3aGVyZSAnYWNjZXNzX21ldGhvZCcgaXMgb25lCitvZiAiZXh0IiBhbmQgInBzZXJ2ZXIiKSB0byBtYWtlIHRoZW0gYXBwbHkgb25seSBmb3IgdGhlIGdpdmVuIGFjY2VzcworbWV0aG9kLgorCitodHRwLnNzbFZlcmlmeTo6CisJV2hldGhlciB0byB2ZXJpZnkgdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGZldGNoaW5nIG9yIHB1c2hpbmcKKwlvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9TU0xfTk9fVkVSSUZZJyBlbnZpcm9ubWVudAorCXZhcmlhYmxlLgorCitodHRwLnNzbENlcnQ6OgorCUZpbGUgY29udGFpbmluZyB0aGUgU1NMIGNlcnRpZmljYXRlIHdoZW4gZmV0Y2hpbmcgb3IgcHVzaGluZworCW92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX1NTTF9DRVJUJyBlbnZpcm9ubWVudAorCXZhcmlhYmxlLgorCitodHRwLnNzbEtleTo6CisJRmlsZSBjb250YWluaW5nIHRoZSBTU0wgcHJpdmF0ZSBrZXkgd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nCisJb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfU1NMX0tFWScgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworaHR0cC5zc2xDQUluZm86OgorCUZpbGUgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVzIHRvIHZlcmlmeSB0aGUgcGVlciB3aXRoIHdoZW4KKwlmZXRjaGluZyBvciBwdXNoaW5nIG92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZQorCSdHSVRfU1NMX0NBSU5GTycgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK2h0dHAuc3NsQ0FQYXRoOjoKKwlQYXRoIGNvbnRhaW5pbmcgZmlsZXMgd2l0aCB0aGUgQ0EgY2VydGlmaWNhdGVzIHRvIHZlcmlmeSB0aGUgcGVlcgorCXdpdGggd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nIG92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuCisJYnkgdGhlICdHSVRfU1NMX0NBUEFUSCcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK2h0dHAubWF4UmVxdWVzdHM6OgorCUhvdyBtYW55IEhUVFAgcmVxdWVzdHMgdG8gbGF1bmNoIGluIHBhcmFsbGVsLiBDYW4gYmUgb3ZlcnJpZGRlbgorCWJ5IHRoZSAnR0lUX0hUVFBfTUFYX1JFUVVFU1RTJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRGVmYXVsdCBpcyA1LgorCitodHRwLmxvd1NwZWVkTGltaXQsIGh0dHAubG93U3BlZWRUaW1lOjoKKwlJZiB0aGUgSFRUUCB0cmFuc2ZlciBzcGVlZCBpcyBsZXNzIHRoYW4gJ2h0dHAubG93U3BlZWRMaW1pdCcKKwlmb3IgbG9uZ2VyIHRoYW4gJ2h0dHAubG93U3BlZWRUaW1lJyBzZWNvbmRzLCB0aGUgdHJhbnNmZXIgaXMgYWJvcnRlZC4KKwlDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9IVFRQX0xPV19TUEVFRF9MSU1JVCcgYW5kCisJJ0dJVF9IVFRQX0xPV19TUEVFRF9USU1FJyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK2h0dHAubm9FUFNWOjoKKwlBIGJvb2xlYW4gd2hpY2ggZGlzYWJsZXMgdXNpbmcgb2YgRVBTViBmdHAgY29tbWFuZCBieSBjdXJsLgorCVRoaXMgY2FuIGhlbHBmdWwgd2l0aCBzb21lICJwb29yIiBmdHAgc2VydmVycyB3aGljaCBkb24ndAorCXN1cHBvcnQgRVBTViBtb2RlLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9DVVJMX0ZUUF9OT19FUFNWJworCWVudmlyb25tZW50IHZhcmlhYmxlLiBEZWZhdWx0IGlzIGZhbHNlIChjdXJsIHdpbGwgdXNlIEVQU1YpLgorCitpMThuLmNvbW1pdEVuY29kaW5nOjoKKwlDaGFyYWN0ZXIgZW5jb2RpbmcgdGhlIGNvbW1pdCBtZXNzYWdlcyBhcmUgc3RvcmVkIGluOyBnaXQgaXRzZWxmCisJZG9lcyBub3QgY2FyZSBwZXIgc2UsIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSBlLmcuIHdoZW4KKwlpbXBvcnRpbmcgY29tbWl0cyBmcm9tIGVtYWlscyBvciBpbiB0aGUgZ2l0ayBncmFwaGljYWwgaGlzdG9yeQorCWJyb3dzZXIgKGFuZCBwb3NzaWJseSBhdCBvdGhlciBwbGFjZXMgaW4gdGhlIGZ1dHVyZSBvciBpbiBvdGhlcgorCXBvcmNlbGFpbnMpLiBTZWUgZS5nLiBnaXRsaW5rOmdpdC1tYWlsaW5mb1sxXS4gRGVmYXVsdHMgdG8gJ3V0Zi04Jy4KKworaTE4bi5sb2dPdXRwdXRFbmNvZGluZzo6CisJQ2hhcmFjdGVyIGVuY29kaW5nIHRoZSBjb21taXQgbWVzc2FnZXMgYXJlIGNvbnZlcnRlZCB0byB3aGVuCisJcnVubmluZyBgZ2l0LWxvZ2AgYW5kIGZyaWVuZHMuCisKK2xvZy5zaG93cm9vdDo6CisJSWYgdHJ1ZSwgdGhlIGluaXRpYWwgY29tbWl0IHdpbGwgYmUgc2hvd24gYXMgYSBiaWcgY3JlYXRpb24gZXZlbnQuCisJVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgZGlmZiBhZ2FpbnN0IGFuIGVtcHR5IHRyZWUuCisJVG9vbHMgbGlrZSBnaXRsaW5rOmdpdC1sb2dbMV0gb3IgZ2l0bGluazpnaXQtd2hhdGNoYW5nZWRbMV0sIHdoaWNoCisJbm9ybWFsbHkgaGlkZSB0aGUgcm9vdCBjb21taXQgd2lsbCBub3cgc2hvdyBpdC4gVHJ1ZSBieSBkZWZhdWx0LgorCittZXJnZS5zdW1tYXJ5OjoKKwlXaGV0aGVyIHRvIGluY2x1ZGUgc3VtbWFyaWVzIG9mIG1lcmdlZCBjb21taXRzIGluIG5ld2x5IGNyZWF0ZWQKKwltZXJnZSBjb21taXQgbWVzc2FnZXMuIEZhbHNlIGJ5IGRlZmF1bHQuCisKK21lcmdlLnRvb2w6OgorCUNvbnRyb2xzIHdoaWNoIG1lcmdlIHJlc29sdXRpb24gcHJvZ3JhbSBpcyB1c2VkIGJ5CisJZ2l0bGluazpnaXQtbWVyZ2V0b29sW2xdLiAgVmFsaWQgdmFsdWVzIGFyZTogImtkaWZmMyIsICJ0a2RpZmYiLAorCSJtZWxkIiwgInh4ZGlmZiIsICJlbWVyZ2UiLCAidmltZGlmZiIsIGFuZCAib3BlbmRpZmYiCisKK21lcmdlLnZlcmJvc2l0eTo6CisJQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQgc2hvd24gYnkgdGhlIHJlY3Vyc2l2ZSBtZXJnZQorCXN0cmF0ZWd5LiAgTGV2ZWwgMCBvdXRwdXRzIG5vdGhpbmcgZXhjZXB0IGEgZmluYWwgZXJyb3IKKwltZXNzYWdlIGlmIGNvbmZsaWN0cyB3ZXJlIGRldGVjdGVkLiBMZXZlbCAxIG91dHB1dHMgb25seQorCWNvbmZsaWN0cywgMiBvdXRwdXRzIGNvbmZsaWN0cyBhbmQgZmlsZSBjaGFuZ2VzLiAgTGV2ZWwgNSBhbmQKKwlhYm92ZSBvdXRwdXRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBkZWZhdWx0IGlzIGxldmVsIDIuCisKK21lcmdlLjxkcml2ZXI+Lm5hbWU6OgorCURlZmluZXMgYSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciBhIGN1c3RvbSBsb3ctbGV2ZWwKKwltZXJnZSBkcml2ZXIuICBTZWUgZ2l0bGluazpnaXRhdHRyaWJ1dGVzWzVdIGZvciBkZXRhaWxzLgorCittZXJnZS48ZHJpdmVyPi5kcml2ZXI6OgorCURlZmluZXMgdGhlIGNvbW1hbmQgdGhhdCBpbXBsZW1lbnRzIGEgY3VzdG9tIGxvdy1sZXZlbAorCW1lcmdlIGRyaXZlci4gIFNlZSBnaXRsaW5rOmdpdGF0dHJpYnV0ZXNbNV0gZm9yIGRldGFpbHMuCisKK21lcmdlLjxkcml2ZXI+LnJlY3Vyc2l2ZTo6CisJTmFtZXMgYSBsb3ctbGV2ZWwgbWVyZ2UgZHJpdmVyIHRvIGJlIHVzZWQgd2hlbgorCXBlcmZvcm1pbmcgYW4gaW50ZXJuYWwgbWVyZ2UgYmV0d2VlbiBjb21tb24gYW5jZXN0b3JzLgorCVNlZSBnaXRsaW5rOmdpdGF0dHJpYnV0ZXNbNV0gZm9yIGRldGFpbHMuCisKK3BhY2sud2luZG93OjoKKwlUaGUgc2l6ZSBvZiB0aGUgd2luZG93IHVzZWQgYnkgZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdIHdoZW4gbm8KKwl3aW5kb3cgc2l6ZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiBEZWZhdWx0cyB0byAxMC4KKworcGFjay5kZXB0aDo6CisJVGhlIG1heGltdW0gZGVsdGEgZGVwdGggdXNlZCBieSBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0gd2hlbiBubworCW1heGltdW0gZGVwdGggaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gRGVmYXVsdHMgdG8gNTAuCisKK3B1bGwub2N0b3B1czo6CisJVGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgdG8gdXNlIHdoZW4gcHVsbGluZyBtdWx0aXBsZSBicmFuY2hlcworCWF0IG9uY2UuCisKK3B1bGwudHdvaGVhZDo6CisJVGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgdG8gdXNlIHdoZW4gcHVsbGluZyBhIHNpbmdsZSBicmFuY2guCisKK3JlbW90ZS48bmFtZT4udXJsOjoKKwlUaGUgVVJMIG9mIGEgcmVtb3RlIHJlcG9zaXRvcnkuICBTZWUgZ2l0bGluazpnaXQtZmV0Y2hbMV0gb3IKKwlnaXRsaW5rOmdpdC1wdXNoWzFdLgorCityZW1vdGUuPG5hbWU+LmZldGNoOjoKKwlUaGUgZGVmYXVsdCBzZXQgb2YgInJlZnNwZWMiIGZvciBnaXRsaW5rOmdpdC1mZXRjaFsxXS4gU2VlCisJZ2l0bGluazpnaXQtZmV0Y2hbMV0uCisKK3JlbW90ZS48bmFtZT4ucHVzaDo6CisJVGhlIGRlZmF1bHQgc2V0IG9mICJyZWZzcGVjIiBmb3IgZ2l0bGluazpnaXQtcHVzaFsxXS4gU2VlCisJZ2l0bGluazpnaXQtcHVzaFsxXS4KKworcmVtb3RlLjxuYW1lPi5za2lwRGVmYXVsdFVwZGF0ZTo6CisJSWYgdHJ1ZSwgdGhpcyByZW1vdGUgd2lsbCBiZSBza2lwcGVkIGJ5IGRlZmF1bHQgd2hlbiB1cGRhdGluZworCXVzaW5nIHRoZSByZW1vdGUgc3ViY29tbWFuZCBvZiBnaXRsaW5rOmdpdC1yZW1vdGVbMV0uCisKK3JlbW90ZS48bmFtZT4ucmVjZWl2ZXBhY2s6OgorCVRoZSBkZWZhdWx0IHByb2dyYW0gdG8gZXhlY3V0ZSBvbiB0aGUgcmVtb3RlIHNpZGUgd2hlbiBwdXNoaW5nLiAgU2VlCisJb3B0aW9uIFwtLWV4ZWMgb2YgZ2l0bGluazpnaXQtcHVzaFsxXS4KKworcmVtb3RlLjxuYW1lPi51cGxvYWRwYWNrOjoKKwlUaGUgZGVmYXVsdCBwcm9ncmFtIHRvIGV4ZWN1dGUgb24gdGhlIHJlbW90ZSBzaWRlIHdoZW4gZmV0Y2hpbmcuICBTZWUKKwlvcHRpb24gXC0tZXhlYyBvZiBnaXRsaW5rOmdpdC1mZXRjaC1wYWNrWzFdLgorCityZW1vdGUuPG5hbWU+LnRhZ29wdDo6CisJU2V0dGluZyB0aGlzIHZhbHVlIHRvIC0tbm8tdGFncyBkaXNhYmxlcyBhdXRvbWF0aWMgdGFnIGZvbGxvd2luZyB3aGVuIGZldGNoaW5nCisJZnJvbSByZW1vdGUgPG5hbWU+CisKK3JlbW90ZXMuPGdyb3VwPjo6CisJVGhlIGxpc3Qgb2YgcmVtb3RlcyB3aGljaCBhcmUgZmV0Y2hlZCBieSAiZ2l0IHJlbW90ZSB1cGRhdGUKKwk8Z3JvdXA+Ii4gIFNlZSBnaXRsaW5rOmdpdC1yZW1vdGVbMV0uCisKK3JlcGFjay51c2VkZWx0YWJhc2VvZmZzZXQ6OgorCUFsbG93IGdpdGxpbms6Z2l0LXJlcGFja1sxXSB0byBjcmVhdGUgcGFja3MgdGhhdCB1c2VzCisJZGVsdGEtYmFzZSBvZmZzZXQuICBEZWZhdWx0cyB0byBmYWxzZS4KKworc2hvdy5kaWZmdHJlZTo6CisJVGhlIGRlZmF1bHQgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGFyZ3VtZW50cyB0byBiZSB1c2VkCisJZm9yIGdpdGxpbms6Z2l0LXNob3dbMV0uCisKK3Nob3dicmFuY2guZGVmYXVsdDo6CisJVGhlIGRlZmF1bHQgc2V0IG9mIGJyYW5jaGVzIGZvciBnaXRsaW5rOmdpdC1zaG93LWJyYW5jaFsxXS4KKwlTZWUgZ2l0bGluazpnaXQtc2hvdy1icmFuY2hbMV0uCisKK3Rhci51bWFzazo6CisJQnkgZGVmYXVsdCwgZ2l0bGluazpnaXQtdGFyLXRyZWVbMV0gc2V0cyBmaWxlIGFuZCBkaXJlY3RvcmllcyBtb2RlcworCXRvIDA2NjYgb3IgMDc3Ny4gV2hpbGUgdGhpcyBpcyBib3RoIHVzZWZ1bCBhbmQgYWNjZXB0YWJsZSBmb3IgcHJvamVjdHMKKwlzdWNoIGFzIHRoZSBMaW51eCBLZXJuZWwsIGl0IG1pZ2h0IGJlIGV4Y2Vzc2l2ZSBmb3Igb3RoZXIgcHJvamVjdHMuCisJV2l0aCB0aGlzIHZhcmlhYmxlLCBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIHRlbGwKKwlnaXRsaW5rOmdpdC10YXItdHJlZVsxXSB0byBhcHBseSBhIHNwZWNpZmljIHVtYXNrIHRvIHRoZSBtb2RlcyBhYm92ZS4KKwlUaGUgc3BlY2lhbCB2YWx1ZSAidXNlciIgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyBjdXJyZW50IHVtYXNrIHdpbGwKKwliZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgcHJvamVjdHMsIGFzIGl0IHdpbGwgbGVhZCB0bworCXRoZSBzYW1lIHBlcm1pc3Npb25zIGFzIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIHdvdWxkIHVzZS4gVGhlIGRlZmF1bHQKKwl2YWx1ZSByZW1haW5zIDAsIHdoaWNoIG1lYW5zIHdvcmxkIHJlYWQtd3JpdGUuCisKK3VzZXIuZW1haWw6OgorCVlvdXIgZW1haWwgYWRkcmVzcyB0byBiZSByZWNvcmRlZCBpbiBhbnkgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0FVVEhPUl9FTUFJTCcsICdHSVRfQ09NTUlUVEVSX0VNQUlMJywgYW5kCisJJ0VNQUlMJyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBTZWUgZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0uCisKK3VzZXIubmFtZTo6CisJWW91ciBmdWxsIG5hbWUgdG8gYmUgcmVjb3JkZWQgaW4gYW55IG5ld2x5IGNyZWF0ZWQgY29tbWl0cy4KKwlDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9BVVRIT1JfTkFNRScgYW5kICdHSVRfQ09NTUlUVEVSX05BTUUnCisJZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgU2VlIGdpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdLgorCit1c2VyLnNpZ25pbmdrZXk6OgorCUlmIGdpdGxpbms6Z2l0LXRhZ1sxXSBpcyBub3Qgc2VsZWN0aW5nIHRoZSBrZXkgeW91IHdhbnQgaXQgdG8KKwlhdXRvbWF0aWNhbGx5IHdoZW4gY3JlYXRpbmcgYSBzaWduZWQgdGFnLCB5b3UgY2FuIG92ZXJyaWRlIHRoZQorCWRlZmF1bHQgc2VsZWN0aW9uIHdpdGggdGhpcyB2YXJpYWJsZS4gIFRoaXMgb3B0aW9uIGlzIHBhc3NlZAorCXVuY2hhbmdlZCB0byBncGcncyAtLWxvY2FsLXVzZXIgcGFyYW1ldGVyLCBzbyB5b3UgbWF5IHNwZWNpZnkgYSBrZXkKKwl1c2luZyBhbnkgbWV0aG9kIHRoYXQgZ3BnIHN1cHBvcnRzLgorCit3aGF0Y2hhbmdlZC5kaWZmdHJlZTo6CisJVGhlIGRlZmF1bHQgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGFyZ3VtZW50cyB0byBiZSB1c2VkCisJZm9yIGdpdGxpbms6Z2l0LXdoYXRjaGFuZ2VkWzFdLgorCitpbWFwOjoKKwlUaGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlICdpbWFwJyBzZWN0aW9uIGFyZSBkZXNjcmliZWQKKwlpbiBnaXRsaW5rOmdpdC1pbWFwLXNlbmRbMV0uCisKK3JlY2VpdmUudW5wYWNrTGltaXQ6OgorCUlmIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWNlaXZlZCBpbiBhIHB1c2ggaXMgYmVsb3cgdGhpcworCWxpbWl0IHRoZW4gdGhlIG9iamVjdHMgd2lsbCBiZSB1bnBhY2tlZCBpbnRvIGxvb3NlIG9iamVjdAorCWZpbGVzLiBIb3dldmVyIGlmIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb2JqZWN0cyBlcXVhbHMgb3IKKwlleGNlZWRzIHRoaXMgbGltaXQgdGhlbiB0aGUgcmVjZWl2ZWQgcGFjayB3aWxsIGJlIHN0b3JlZCBhcworCWEgcGFjaywgYWZ0ZXIgYWRkaW5nIGFueSBtaXNzaW5nIGRlbHRhIGJhc2VzLiAgU3RvcmluZyB0aGUKKwlwYWNrIGZyb20gYSBwdXNoIGNhbiBtYWtlIHRoZSBwdXNoIG9wZXJhdGlvbiBjb21wbGV0ZSBmYXN0ZXIsCisJZXNwZWNpYWxseSBvbiBzbG93IGZpbGVzeXN0ZW1zLgorCityZWNlaXZlLmRlbnlOb25GYXN0Rm9yd2FyZHM6OgorCUlmIHNldCB0byB0cnVlLCBnaXQtcmVjZWl2ZS1wYWNrIHdpbGwgZGVueSBhIHJlZiB1cGRhdGUgd2hpY2ggaXMKKwlub3QgYSBmYXN0IGZvcndhcmQuIFVzZSB0aGlzIHRvIHByZXZlbnQgc3VjaCBhbiB1cGRhdGUgdmlhIGEgcHVzaCwKKwlldmVuIGlmIHRoYXQgcHVzaCBpcyBmb3JjZWQuIFRoaXMgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcworCXNldCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCByZXBvc2l0b3J5LgorCit0cmFuc2Zlci51bnBhY2tMaW1pdDo6CisJV2hlbiBgZmV0Y2gudW5wYWNrTGltaXRgIG9yIGByZWNlaXZlLnVucGFja0xpbWl0YCBhcmUKKwlub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluc3RlYWQuCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWludHJvLnR4dCBiL0RvY3VtZW50YXRpb24vY29yZS1pbnRyby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhNDRkOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1pbnRyby50eHQKQEAgLTAsMCArMSw1OTIgQEAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUdJVCAtIHRoZSBzdHVwaWQgY29udGVudCB0cmFja2VyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworImdpdCIgY2FuIG1lYW4gYW55dGhpbmcsIGRlcGVuZGluZyBvbiB5b3VyIG1vb2QuCisKKyAtIHJhbmRvbSB0aHJlZS1sZXR0ZXIgY29tYmluYXRpb24gdGhhdCBpcyBwcm9ub3VuY2VhYmxlLCBhbmQgbm90CisgICBhY3R1YWxseSB1c2VkIGJ5IGFueSBjb21tb24gVU5JWCBjb21tYW5kLiAgVGhlIGZhY3QgdGhhdCBpdCBpcyBhCisgICBtaXNwcm9udW5jaWF0aW9uIG9mICJnZXQiIG1heSBvciBtYXkgbm90IGJlIHJlbGV2YW50LgorIC0gc3R1cGlkLiBjb250ZW1wdGlibGUgYW5kIGRlc3BpY2FibGUuIHNpbXBsZS4gVGFrZSB5b3VyIHBpY2sgZnJvbSB0aGUKKyAgIGRpY3Rpb25hcnkgb2Ygc2xhbmcuCisgLSAiZ2xvYmFsIGluZm9ybWF0aW9uIHRyYWNrZXIiOiB5b3UncmUgaW4gYSBnb29kIG1vb2QsIGFuZCBpdCBhY3R1YWxseQorICAgd29ya3MgZm9yIHlvdS4gQW5nZWxzIHNpbmcsIGFuZCBhIGxpZ2h0IHN1ZGRlbmx5IGZpbGxzIHRoZSByb29tLgorIC0gImdvZGRhbW4gaWRpb3RpYyB0cnVja2xvYWQgb2Ygc2gqdCI6IHdoZW4gaXQgYnJlYWtzCisKK1RoaXMgaXMgYSAobm90IHNvKSBzdHVwaWQgYnV0IGV4dHJlbWVseSBmYXN0IGRpcmVjdG9yeSBjb250ZW50IG1hbmFnZXIuCitJdCBkb2Vzbid0IGRvIGEgd2hvbGUgbG90IGF0IGl0cyBjb3JlLCBidXQgd2hhdCBpdCAnZG9lcycgZG8gaXMgdHJhY2sKK2RpcmVjdG9yeSBjb250ZW50cyBlZmZpY2llbnRseS4KKworVGhlcmUgYXJlIHR3byBvYmplY3QgYWJzdHJhY3Rpb25zOiB0aGUgIm9iamVjdCBkYXRhYmFzZSIsIGFuZCB0aGUKKyJjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSIgYWthICJpbmRleCIuCisKK1RoZSBPYmplY3QgRGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBvYmplY3QgZGF0YWJhc2UgaXMgbGl0ZXJhbGx5IGp1c3QgYSBjb250ZW50LWFkZHJlc3NhYmxlIGNvbGxlY3Rpb24KK29mIG9iamVjdHMuICBBbGwgb2JqZWN0cyBhcmUgbmFtZWQgYnkgdGhlaXIgY29udGVudCwgd2hpY2ggaXMKK2FwcHJveGltYXRlZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgT2JqZWN0cyBtYXkgcmVmZXIKK3RvIG90aGVyIG9iamVjdHMgKGJ5IHJlZmVyZW5jaW5nIHRoZWlyIFNIQTEgaGFzaCksIGFuZCBzbyB5b3UgY2FuCitidWlsZCB1cCBhIGhpZXJhcmNoeSBvZiBvYmplY3RzLgorCitBbGwgb2JqZWN0cyBoYXZlIGEgc3RhdGljYWxseSBkZXRlcm1pbmVkICJ0eXBlIiBha2EgInRhZyIsIHdoaWNoIGlzCitkZXRlcm1pbmVkIGF0IG9iamVjdCBjcmVhdGlvbiB0aW1lLCBhbmQgd2hpY2ggaWRlbnRpZmllcyB0aGUgZm9ybWF0IG9mCit0aGUgb2JqZWN0IChpLmUuIGhvdyBpdCBpcyB1c2VkLCBhbmQgaG93IGl0IGNhbiByZWZlciB0byBvdGhlcgorb2JqZWN0cykuICBUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgZGlmZmVyZW50IG9iamVjdCB0eXBlczogImJsb2IiLAorInRyZWUiLCAiY29tbWl0IiBhbmQgInRhZyIuCisKK0EgImJsb2IiIG9iamVjdCBjYW5ub3QgcmVmZXIgdG8gYW55IG90aGVyIG9iamVjdCwgYW5kIGlzLCBsaWtlIHRoZSB0eXBlCitpbXBsaWVzLCBhIHB1cmUgc3RvcmFnZSBvYmplY3QgY29udGFpbmluZyBzb21lIHVzZXIgZGF0YS4gIEl0IGlzIHVzZWQgdG8KK2FjdHVhbGx5IHN0b3JlIHRoZSBmaWxlIGRhdGEsIGkuZS4gYSBibG9iIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggc29tZQorcGFydGljdWxhciB2ZXJzaW9uIG9mIHNvbWUgZmlsZS4KKworQSAidHJlZSIgb2JqZWN0IGlzIGFuIG9iamVjdCB0aGF0IHRpZXMgb25lIG9yIG1vcmUgImJsb2IiIG9iamVjdHMgaW50byBhCitkaXJlY3Rvcnkgc3RydWN0dXJlLiBJbiBhZGRpdGlvbiwgYSB0cmVlIG9iamVjdCBjYW4gcmVmZXIgdG8gb3RoZXIgdHJlZQorb2JqZWN0cywgdGh1cyBjcmVhdGluZyBhIGRpcmVjdG9yeSBoaWVyYXJjaHkuCisKK0EgImNvbW1pdCIgb2JqZWN0IHRpZXMgc3VjaCBkaXJlY3RvcnkgaGllcmFyY2hpZXMgdG9nZXRoZXIgaW50bworYSBEQUcgb2YgcmV2aXNpb25zIC0gZWFjaCAiY29tbWl0IiBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgdHJlZQorKHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5IGF0IHRoZSB0aW1lIG9mIHRoZSBjb21taXQpLiBJbiBhZGRpdGlvbiwgYQorImNvbW1pdCIgcmVmZXJzIHRvIG9uZSBvciBtb3JlICJwYXJlbnQiIGNvbW1pdCBvYmplY3RzIHRoYXQgZGVzY3JpYmUgdGhlCitoaXN0b3J5IG9mIGhvdyB3ZSBhcnJpdmVkIGF0IHRoYXQgZGlyZWN0b3J5IGhpZXJhcmNoeS4KKworQXMgYSBzcGVjaWFsIGNhc2UsIGEgY29tbWl0IG9iamVjdCB3aXRoIG5vIHBhcmVudHMgaXMgY2FsbGVkIHRoZSAicm9vdCIKK29iamVjdCwgYW5kIGlzIHRoZSBwb2ludCBvZiBhbiBpbml0aWFsIHByb2plY3QgY29tbWl0LiAgRWFjaCBwcm9qZWN0CittdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHJvb3QsIGFuZCB3aGlsZSB5b3UgY2FuIHRpZSBzZXZlcmFsIGRpZmZlcmVudAorcm9vdCBvYmplY3RzIHRvZ2V0aGVyIGludG8gb25lIHByb2plY3QgYnkgY3JlYXRpbmcgYSBjb21taXQgb2JqZWN0IHdoaWNoCitoYXMgdHdvIG9yIG1vcmUgc2VwYXJhdGUgcm9vdHMgYXMgaXRzIHVsdGltYXRlIHBhcmVudHMsIHRoYXQncyBwcm9iYWJseQoranVzdCBnb2luZyB0byBjb25mdXNlIHBlb3BsZS4gIFNvIGFpbSBmb3IgdGhlIG5vdGlvbiBvZiAib25lIHJvb3Qgb2JqZWN0CitwZXIgcHJvamVjdCIsIGV2ZW4gaWYgZ2l0IGl0c2VsZiBkb2VzIG5vdCBlbmZvcmNlIHRoYXQuCisKK0EgInRhZyIgb2JqZWN0IHN5bWJvbGljYWxseSBpZGVudGlmaWVzIGFuZCBjYW4gYmUgdXNlZCB0byBzaWduIG90aGVyCitvYmplY3RzLiBJdCBjb250YWlucyB0aGUgaWRlbnRpZmllciBhbmQgdHlwZSBvZiBhbm90aGVyIG9iamVjdCwgYQorc3ltYm9saWMgbmFtZSAob2YgY291cnNlISkgYW5kLCBvcHRpb25hbGx5LCBhIHNpZ25hdHVyZS4KKworUmVnYXJkbGVzcyBvZiBvYmplY3QgdHlwZSwgYWxsIG9iamVjdHMgc2hhcmUgdGhlIGZvbGxvd2luZworY2hhcmFjdGVyaXN0aWNzOiB0aGV5IGFyZSBhbGwgZGVmbGF0ZWQgd2l0aCB6bGliLCBhbmQgaGF2ZSBhIGhlYWRlcgordGhhdCBub3Qgb25seSBzcGVjaWZpZXMgdGhlaXIgdHlwZSwgYnV0IGFsc28gcHJvdmlkZXMgc2l6ZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIGRhdGEgaW4gdGhlIG9iamVjdC4gIEl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIFNIQTEgaGFzaAordGhhdCBpcyB1c2VkIHRvIG5hbWUgdGhlIG9iamVjdCBpcyB0aGUgaGFzaCBvZiB0aGUgb3JpZ2luYWwgZGF0YQorcGx1cyB0aGlzIGhlYWRlciwgc28gYHNoYTFzdW1gICdmaWxlJyBkb2VzIG5vdCBtYXRjaCB0aGUgb2JqZWN0IG5hbWUKK2ZvciAnZmlsZScuCisoSGlzdG9yaWNhbCBub3RlOiBpbiB0aGUgZGF3biBvZiB0aGUgYWdlIG9mIGdpdCB0aGUgaGFzaAord2FzIHRoZSBzaGExIG9mIHRoZSAnY29tcHJlc3NlZCcgb2JqZWN0LikKKworQXMgYSByZXN1bHQsIHRoZSBnZW5lcmFsIGNvbnNpc3RlbmN5IG9mIGFuIG9iamVjdCBjYW4gYWx3YXlzIGJlIHRlc3RlZAoraW5kZXBlbmRlbnRseSBvZiB0aGUgY29udGVudHMgb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdDogYWxsIG9iamVjdHMgY2FuCitiZSB2YWxpZGF0ZWQgYnkgdmVyaWZ5aW5nIHRoYXQgKGEpIHRoZWlyIGhhc2hlcyBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUKK2ZpbGUgYW5kIChiKSB0aGUgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpbmZsYXRlcyB0byBhIHN0cmVhbSBvZiBieXRlcyB0aGF0Citmb3JtcyBhIHNlcXVlbmNlIG9mIDxhc2NpaSB0eXBlIHdpdGhvdXQgc3BhY2U+ICsgPHNwYWNlPiArIDxhc2NpaSBkZWNpbWFsCitzaXplPiArIDxieXRlXDA+ICsgPGJpbmFyeSBvYmplY3QgZGF0YT4uCisKK1RoZSBzdHJ1Y3R1cmVkIG9iamVjdHMgY2FuIGZ1cnRoZXIgaGF2ZSB0aGVpciBzdHJ1Y3R1cmUgYW5kCitjb25uZWN0aXZpdHkgdG8gb3RoZXIgb2JqZWN0cyB2ZXJpZmllZC4gVGhpcyBpcyBnZW5lcmFsbHkgZG9uZSB3aXRoCit0aGUgYGdpdC1mc2NrYCBwcm9ncmFtLCB3aGljaCBnZW5lcmF0ZXMgYSBmdWxsIGRlcGVuZGVuY3kgZ3JhcGgKK29mIGFsbCBvYmplY3RzLCBhbmQgdmVyaWZpZXMgdGhlaXIgaW50ZXJuYWwgY29uc2lzdGVuY3kgKGluIGFkZGl0aW9uCit0byBqdXN0IHZlcmlmeWluZyB0aGVpciBzdXBlcmZpY2lhbCBjb25zaXN0ZW5jeSB0aHJvdWdoIHRoZSBoYXNoKS4KKworVGhlIG9iamVjdCB0eXBlcyBpbiBzb21lIG1vcmUgZGV0YWlsOgorCitCbG9iIE9iamVjdAorfn5+fn5+fn5+fn4KK0EgImJsb2IiIG9iamVjdCBpcyBub3RoaW5nIGJ1dCBhIGJpbmFyeSBibG9iIG9mIGRhdGEsIGFuZCBkb2Vzbid0CityZWZlciB0byBhbnl0aGluZyBlbHNlLiAgVGhlcmUgaXMgbm8gc2lnbmF0dXJlIG9yIGFueSBvdGhlcgordmVyaWZpY2F0aW9uIG9mIHRoZSBkYXRhLCBzbyB3aGlsZSB0aGUgb2JqZWN0IGlzIGNvbnNpc3RlbnQgKGl0ICdpcycKK2luZGV4ZWQgYnkgaXRzIHNoYTEgaGFzaCwgc28gdGhlIGRhdGEgaXRzZWxmIGlzIGNlcnRhaW5seSBjb3JyZWN0KSwgaXQKK2hhcyBhYnNvbHV0ZWx5IG5vIG90aGVyIGF0dHJpYnV0ZXMuICBObyBuYW1lIGFzc29jaWF0aW9ucywgbm8KK3Blcm1pc3Npb25zLiAgSXQgaXMgcHVyZWx5IGEgYmxvYiBvZiBkYXRhIChpLmUuIG5vcm1hbGx5ICJmaWxlCitjb250ZW50cyIpLgorCitJbiBwYXJ0aWN1bGFyLCBzaW5jZSB0aGUgYmxvYiBpcyBlbnRpcmVseSBkZWZpbmVkIGJ5IGl0cyBkYXRhLCBpZiB0d28KK2ZpbGVzIGluIGEgZGlyZWN0b3J5IHRyZWUgKG9yIGluIG11bHRpcGxlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKK3JlcG9zaXRvcnkpIGhhdmUgdGhlIHNhbWUgY29udGVudHMsIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBibG9iCitvYmplY3QuIFRoZSBvYmplY3QgaXMgdG90YWxseSBpbmRlcGVuZGVudCBvZiBpdHMgbG9jYXRpb24gaW4gdGhlCitkaXJlY3RvcnkgdHJlZSwgYW5kIHJlbmFtaW5nIGEgZmlsZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9iamVjdCB0aGF0CitmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBpbiBhbnkgd2F5LgorCitBIGJsb2IgaXMgdHlwaWNhbGx5IGNyZWF0ZWQgd2hlbiBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0KKyhvciBnaXRsaW5rOmdpdC1hZGRbMV0pIGlzIHJ1biwgYW5kIGl0cyBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieQorZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0uCisKK1RyZWUgT2JqZWN0Cit+fn5+fn5+fn5+fgorVGhlIG5leHQgaGllcmFyY2hpY2FsIG9iamVjdCB0eXBlIGlzIHRoZSAidHJlZSIgb2JqZWN0LiAgQSB0cmVlIG9iamVjdAoraXMgYSBsaXN0IG9mIG1vZGUvbmFtZS9ibG9iIGRhdGEsIHNvcnRlZCBieSBuYW1lLiAgQWx0ZXJuYXRpdmVseSwgdGhlCittb2RlIGRhdGEgbWF5IHNwZWNpZnkgYSBkaXJlY3RvcnkgbW9kZSwgaW4gd2hpY2ggY2FzZSBpbnN0ZWFkIG9mCituYW1pbmcgYSBibG9iLCB0aGF0IG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIgVFJFRSBvYmplY3QuCisKK0xpa2UgdGhlICJibG9iIiBvYmplY3QsIGEgdHJlZSBvYmplY3QgaXMgdW5pcXVlbHkgZGV0ZXJtaW5lZCBieSB0aGUKK3NldCBjb250ZW50cywgYW5kIHNvIHR3byBzZXBhcmF0ZSBidXQgaWRlbnRpY2FsIHRyZWVzIHdpbGwgYWx3YXlzCitzaGFyZSB0aGUgZXhhY3Qgc2FtZSBvYmplY3QuIFRoaXMgaXMgdHJ1ZSBhdCBhbGwgbGV2ZWxzLCBpLmUuIGl0J3MKK3RydWUgZm9yIGEgImxlYWYiIHRyZWUgKHdoaWNoIGRvZXMgbm90IHJlZmVyIHRvIGFueSBvdGhlciB0cmVlcywgb25seQorYmxvYnMpIGFzIHdlbGwgYXMgZm9yIGEgd2hvbGUgc3ViZGlyZWN0b3J5LgorCitGb3IgdGhhdCByZWFzb24gYSAidHJlZSIgb2JqZWN0IGlzIGp1c3QgYSBwdXJlIGRhdGEgYWJzdHJhY3Rpb246IGl0CitoYXMgbm8gaGlzdG9yeSwgbm8gc2lnbmF0dXJlcywgbm8gdmVyaWZpY2F0aW9uIG9mIHZhbGlkaXR5LCBleGNlcHQKK3RoYXQgc2luY2UgdGhlIGNvbnRlbnRzIGFyZSBhZ2FpbiBwcm90ZWN0ZWQgYnkgdGhlIGhhc2ggaXRzZWxmLCB3ZSBjYW4KK3RydXN0IHRoYXQgdGhlIHRyZWUgaXMgaW1tdXRhYmxlIGFuZCBpdHMgY29udGVudHMgbmV2ZXIgY2hhbmdlLgorCitTbyB5b3UgY2FuIHRydXN0IHRoZSBjb250ZW50cyBvZiBhIHRyZWUgdG8gYmUgdmFsaWQsIHRoZSBzYW1lIHdheSB5b3UKK2NhbiB0cnVzdCB0aGUgY29udGVudHMgb2YgYSBibG9iLCBidXQgeW91IGRvbid0IGtub3cgd2hlcmUgdGhvc2UKK2NvbnRlbnRzICdjYW1lJyBmcm9tLgorCitTaWRlIG5vdGUgb24gdHJlZXM6IHNpbmNlIGEgInRyZWUiIG9iamVjdCBpcyBhIHNvcnRlZCBsaXN0IG9mCisiZmlsZW5hbWUrY29udGVudCIsIHlvdSBjYW4gY3JlYXRlIGEgZGlmZiBiZXR3ZWVuIHR3byB0cmVlcyB3aXRob3V0CithY3R1YWxseSBoYXZpbmcgdG8gdW5wYWNrIHR3byB0cmVlcy4gIEp1c3QgaWdub3JlIGFsbCBjb21tb24gcGFydHMsCithbmQgeW91ciBkaWZmIHdpbGwgbG9vayByaWdodC4gIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGVmZmVjdGl2ZWx5CisoYW5kIGVmZmljaWVudGx5KSB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYW55IHR3byByYW5kb20gdHJlZXMgYnkKK08obikgd2hlcmUgIm4iIGlzIHRoZSBzaXplIG9mIHRoZSBkaWZmZXJlbmNlLCByYXRoZXIgdGhhbiB0aGUgc2l6ZSBvZgordGhlIHRyZWUuCisKK1NpZGUgbm90ZSAyIG9uIHRyZWVzOiBzaW5jZSB0aGUgbmFtZSBvZiBhICJibG9iIiBkZXBlbmRzIGVudGlyZWx5IGFuZAorZXhjbHVzaXZlbHkgb24gaXRzIGNvbnRlbnRzIChpLmUuIHRoZXJlIGFyZSBubyBuYW1lcyBvciBwZXJtaXNzaW9ucworaW52b2x2ZWQpLCB5b3UgY2FuIHNlZSB0cml2aWFsIHJlbmFtZXMgb3IgcGVybWlzc2lvbiBjaGFuZ2VzIGJ5Citub3RpY2luZyB0aGF0IHRoZSBibG9iIHN0YXllZCB0aGUgc2FtZS4gIEhvd2V2ZXIsIHJlbmFtZXMgd2l0aCBkYXRhCitjaGFuZ2VzIG5lZWQgYSBzbWFydGVyICJkaWZmIiBpbXBsZW1lbnRhdGlvbi4KKworQSB0cmVlIGlzIGNyZWF0ZWQgd2l0aCBnaXRsaW5rOmdpdC13cml0ZS10cmVlWzFdIGFuZAoraXRzIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGJ5IGdpdGxpbms6Z2l0LWxzLXRyZWVbMV0uCitUd28gdHJlZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdLgorCitDb21taXQgT2JqZWN0Cit+fn5+fn5+fn5+fn5+CitUaGUgImNvbW1pdCIgb2JqZWN0IGlzIGFuIG9iamVjdCB0aGF0IGludHJvZHVjZXMgdGhlIG5vdGlvbiBvZgoraGlzdG9yeSBpbnRvIHRoZSBwaWN0dXJlLiAgSW4gY29udHJhc3QgdG8gdGhlIG90aGVyIG9iamVjdHMsIGl0Citkb2Vzbid0IGp1c3QgZGVzY3JpYmUgdGhlIHBoeXNpY2FsIHN0YXRlIG9mIGEgdHJlZSwgaXQgZGVzY3JpYmVzIGhvdword2UgZ290IHRoZXJlLCBhbmQgd2h5LgorCitBICJjb21taXQiIGlzIGRlZmluZWQgYnkgdGhlIHRyZWUtb2JqZWN0IHRoYXQgaXQgcmVzdWx0cyBpbiwgdGhlCitwYXJlbnQgY29tbWl0cyAoemVybywgb25lIG9yIG1vcmUpIHRoYXQgbGVkIHVwIHRvIHRoYXQgcG9pbnQsIGFuZCBhCitjb21tZW50IG9uIHdoYXQgaGFwcGVuZWQuICBBZ2FpbiwgYSBjb21taXQgaXMgbm90IHRydXN0ZWQgcGVyIHNlOgordGhlIGNvbnRlbnRzIGFyZSB3ZWxsLWRlZmluZWQgYW5kICJzYWZlIiBkdWUgdG8gdGhlIGNyeXB0b2dyYXBoaWNhbGx5CitzdHJvbmcgc2lnbmF0dXJlcyBhdCBhbGwgbGV2ZWxzLCBidXQgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGJlbGlldmUKK3RoYXQgdGhlIHRyZWUgaXMgImdvb2QiIG9yIHRoYXQgdGhlIG1lcmdlIGluZm9ybWF0aW9uIG1ha2VzIHNlbnNlLgorVGhlIHBhcmVudHMgZG8gbm90IGhhdmUgdG8gYWN0dWFsbHkgaGF2ZSBhbnkgcmVsYXRpb25zaGlwIHdpdGggdGhlCityZXN1bHQsIGZvciBleGFtcGxlLgorCitOb3RlIG9uIGNvbW1pdHM6IHVubGlrZSByZWFsIFNDTSdzLCBjb21taXRzIGRvIG5vdCBjb250YWluCityZW5hbWUgaW5mb3JtYXRpb24gb3IgZmlsZSBtb2RlIGNoYW5nZSBpbmZvcm1hdGlvbi4gIEFsbCBvZiB0aGF0IGlzCitpbXBsaWNpdCBpbiB0aGUgdHJlZXMgaW52b2x2ZWQgKHRoZSByZXN1bHQgdHJlZSwgYW5kIHRoZSByZXN1bHQgdHJlZXMKK29mIHRoZSBwYXJlbnRzKSwgYW5kIGRlc2NyaWJpbmcgdGhhdCBtYWtlcyBubyBzZW5zZSBpbiB0aGlzIGlkaW90aWMKK2ZpbGUgbWFuYWdlci4KKworQSBjb21taXQgaXMgY3JlYXRlZCB3aXRoIGdpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdIGFuZAoraXRzIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGJ5IGdpdGxpbms6Z2l0LWNhdC1maWxlWzFdLgorCitUcnVzdAorfn5+fn4KK0FuIGFzaWRlIG9uIHRoZSBub3Rpb24gb2YgInRydXN0Ii4gVHJ1c3QgaXMgcmVhbGx5IG91dHNpZGUgdGhlIHNjb3BlCitvZiAiZ2l0IiwgYnV0IGl0J3Mgd29ydGggbm90aW5nIGEgZmV3IHRoaW5ncy4gIEZpcnN0IG9mZiwgc2luY2UKK2V2ZXJ5dGhpbmcgaXMgaGFzaGVkIHdpdGggU0hBMSwgeW91ICdjYW4nIHRydXN0IHRoYXQgYW4gb2JqZWN0IGlzCitpbnRhY3QgYW5kIGhhcyBub3QgYmVlbiBtZXNzZWQgd2l0aCBieSBleHRlcm5hbCBzb3VyY2VzLiAgU28gdGhlIG5hbWUKK29mIGFuIG9iamVjdCB1bmlxdWVseSBpZGVudGlmaWVzIGEga25vd24gc3RhdGUgLSBqdXN0IG5vdCBhIHN0YXRlIHRoYXQKK3lvdSBtYXkgd2FudCB0byB0cnVzdC4KKworRnVydGhlcm1vcmUsIHNpbmNlIHRoZSBTSEExIHNpZ25hdHVyZSBvZiBhIGNvbW1pdCByZWZlcnMgdG8gdGhlCitTSEExIHNpZ25hdHVyZXMgb2YgdGhlIHRyZWUgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuZCB0aGUgc2lnbmF0dXJlcworb2YgdGhlIHBhcmVudCwgYSBzaW5nbGUgbmFtZWQgY29tbWl0IHNwZWNpZmllcyB1bmlxdWVseSBhIHdob2xlIHNldAorb2YgaGlzdG9yeSwgd2l0aCBmdWxsIGNvbnRlbnRzLiAgWW91IGNhbid0IGxhdGVyIGZha2UgYW55IHN0ZXAgb2YgdGhlCit3YXkgb25jZSB5b3UgaGF2ZSB0aGUgbmFtZSBvZiBhIGNvbW1pdC4KKworU28gdG8gaW50cm9kdWNlIHNvbWUgcmVhbCB0cnVzdCBpbiB0aGUgc3lzdGVtLCB0aGUgb25seSB0aGluZyB5b3UgbmVlZAordG8gZG8gaXMgdG8gZGlnaXRhbGx5IHNpZ24ganVzdCAnb25lJyBzcGVjaWFsIG5vdGUsIHdoaWNoIGluY2x1ZGVzIHRoZQorbmFtZSBvZiBhIHRvcC1sZXZlbCBjb21taXQuICBZb3VyIGRpZ2l0YWwgc2lnbmF0dXJlIHNob3dzIG90aGVycwordGhhdCB5b3UgdHJ1c3QgdGhhdCBjb21taXQsIGFuZCB0aGUgaW1tdXRhYmlsaXR5IG9mIHRoZSBoaXN0b3J5IG9mCitjb21taXRzIHRlbGxzIG90aGVycyB0aGF0IHRoZXkgY2FuIHRydXN0IHRoZSB3aG9sZSBoaXN0b3J5LgorCitJbiBvdGhlciB3b3JkcywgeW91IGNhbiBlYXNpbHkgdmFsaWRhdGUgYSB3aG9sZSBhcmNoaXZlIGJ5IGp1c3QKK3NlbmRpbmcgb3V0IGEgc2luZ2xlIGVtYWlsIHRoYXQgdGVsbHMgdGhlIHBlb3BsZSB0aGUgbmFtZSAoU0hBMSBoYXNoKQorb2YgdGhlIHRvcCBjb21taXQsIGFuZCBkaWdpdGFsbHkgc2lnbiB0aGF0IGVtYWlsIHVzaW5nIHNvbWV0aGluZworbGlrZSBHUEcvUEdQLgorCitUbyBhc3Npc3QgaW4gdGhpcywgZ2l0IGFsc28gcHJvdmlkZXMgdGhlIHRhZyBvYmplY3QuLi4KKworVGFnIE9iamVjdAorfn5+fn5+fn5+fgorR2l0IHByb3ZpZGVzIHRoZSAidGFnIiBvYmplY3QgdG8gc2ltcGxpZnkgY3JlYXRpbmcsIG1hbmFnaW5nIGFuZAorZXhjaGFuZ2luZyBzeW1ib2xpYyBhbmQgc2lnbmVkIHRva2Vucy4gIFRoZSAidGFnIiBvYmplY3QgYXQgaXRzCitzaW1wbGVzdCBzaW1wbHkgc3ltYm9saWNhbGx5IGlkZW50aWZpZXMgYW5vdGhlciBvYmplY3QgYnkgY29udGFpbmluZwordGhlIHNoYTEsIHR5cGUgYW5kIHN5bWJvbGljIG5hbWUuCisKK0hvd2V2ZXIgaXQgY2FuIG9wdGlvbmFsbHkgY29udGFpbiBhZGRpdGlvbmFsIHNpZ25hdHVyZSBpbmZvcm1hdGlvbgorKHdoaWNoIGdpdCBkb2Vzbid0IGNhcmUgYWJvdXQgYXMgbG9uZyBhcyB0aGVyZSdzIGxlc3MgdGhhbiA4ayBvZgoraXQpLiBUaGlzIGNhbiB0aGVuIGJlIHZlcmlmaWVkIGV4dGVybmFsbHkgdG8gZ2l0LgorCitOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgdGFnIGZlYXR1cmVzLCAiZ2l0IiBpdHNlbGYgb25seSBoYW5kbGVzIGNvbnRlbnQKK2ludGVncml0eTsgdGhlIHRydXN0IGZyYW1ld29yayAoYW5kIHNpZ25hdHVyZSBwcm92aXNpb24gYW5kCit2ZXJpZmljYXRpb24pIGhhcyB0byBjb21lIGZyb20gb3V0c2lkZS4KKworQSB0YWcgaXMgY3JlYXRlZCB3aXRoIGdpdGxpbms6Z2l0LW1rdGFnWzFdLAoraXRzIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGJ5IGdpdGxpbms6Z2l0LWNhdC1maWxlWzFdLAorYW5kIHRoZSBzaWduYXR1cmUgY2FuIGJlIHZlcmlmaWVkIGJ5CitnaXRsaW5rOmdpdC12ZXJpZnktdGFnWzFdLgorCisKK1RoZSAiaW5kZXgiIGFrYSAiQ3VycmVudCBEaXJlY3RvcnkgQ2FjaGUiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGluZGV4IGlzIGEgc2ltcGxlIGJpbmFyeSBmaWxlLCB3aGljaCBjb250YWlucyBhbiBlZmZpY2llbnQKK3JlcHJlc2VudGF0aW9uIG9mIGEgdmlydHVhbCBkaXJlY3RvcnkgY29udGVudCBhdCBzb21lIHJhbmRvbSB0aW1lLiAgSXQKK2RvZXMgc28gYnkgYSBzaW1wbGUgYXJyYXkgdGhhdCBhc3NvY2lhdGVzIGEgc2V0IG9mIG5hbWVzLCBkYXRlcywKK3Blcm1pc3Npb25zIGFuZCBjb250ZW50IChha2EgImJsb2IiKSBvYmplY3RzIHRvZ2V0aGVyLiAgVGhlIGNhY2hlIGlzCithbHdheXMga2VwdCBvcmRlcmVkIGJ5IG5hbWUsIGFuZCBuYW1lcyBhcmUgdW5pcXVlICh3aXRoIGEgZmV3IHZlcnkKK3NwZWNpZmljIHJ1bGVzKSBhdCBhbnkgcG9pbnQgaW4gdGltZSwgYnV0IHRoZSBjYWNoZSBoYXMgbm8gbG9uZy10ZXJtCittZWFuaW5nLCBhbmQgY2FuIGJlIHBhcnRpYWxseSB1cGRhdGVkIGF0IGFueSB0aW1lLgorCitJbiBwYXJ0aWN1bGFyLCB0aGUgaW5kZXggY2VydGFpbmx5IGRvZXMgbm90IG5lZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoCit0aGUgY3VycmVudCBkaXJlY3RvcnkgY29udGVudHMgKGluIGZhY3QsIG1vc3Qgb3BlcmF0aW9ucyB3aWxsIGRlcGVuZCBvbgorZGlmZmVyZW50IHdheXMgdG8gbWFrZSB0aGUgaW5kZXggJ25vdCcgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBkaXJlY3RvcnkKK2hpZXJhcmNoeSksIGJ1dCBpdCBoYXMgdGhyZWUgdmVyeSBpbXBvcnRhbnQgYXR0cmlidXRlczoKKworJyhhKSBpdCBjYW4gcmUtZ2VuZXJhdGUgdGhlIGZ1bGwgc3RhdGUgaXQgY2FjaGVzIChub3QganVzdCB0aGUKK2RpcmVjdG9yeSBzdHJ1Y3R1cmU6IGl0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSAiYmxvYiIgb2JqZWN0cyBzbwordGhhdCBpdCBjYW4gcmVnZW5lcmF0ZSB0aGUgZGF0YSB0b28pJworCitBcyBhIHNwZWNpYWwgY2FzZSwgdGhlcmUgaXMgYSBjbGVhciBhbmQgdW5hbWJpZ3VvdXMgb25lLXdheSBtYXBwaW5nCitmcm9tIGEgY3VycmVudCBkaXJlY3RvcnkgY2FjaGUgdG8gYSAidHJlZSBvYmplY3QiLCB3aGljaCBjYW4gYmUKK2VmZmljaWVudGx5IGNyZWF0ZWQgZnJvbSBqdXN0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSB3aXRob3V0CithY3R1YWxseSBsb29raW5nIGF0IGFueSBvdGhlciBkYXRhLiAgU28gYSBkaXJlY3RvcnkgY2FjaGUgYXQgYW55IG9uZQordGltZSB1bmlxdWVseSBzcGVjaWZpZXMgb25lIGFuZCBvbmx5IG9uZSAidHJlZSIgb2JqZWN0IChidXQgaGFzCithZGRpdGlvbmFsIGRhdGEgdG8gbWFrZSBpdCBlYXN5IHRvIG1hdGNoIHVwIHRoYXQgdHJlZSBvYmplY3Qgd2l0aCB3aGF0CitoYXMgaGFwcGVuZWQgaW4gdGhlIGRpcmVjdG9yeSkKKworJyhiKSBpdCBoYXMgZWZmaWNpZW50IG1ldGhvZHMgZm9yIGZpbmRpbmcgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhhdAorY2FjaGVkIHN0YXRlICgidHJlZSBvYmplY3Qgd2FpdGluZyB0byBiZSBpbnN0YW50aWF0ZWQiKSBhbmQgdGhlCitjdXJyZW50IHN0YXRlLicKKworJyhjKSBpdCBjYW4gYWRkaXRpb25hbGx5IGVmZmljaWVudGx5IHJlcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCBtZXJnZQorY29uZmxpY3RzIGJldHdlZW4gZGlmZmVyZW50IHRyZWUgb2JqZWN0cywgYWxsb3dpbmcgZWFjaCBwYXRobmFtZSB0byBiZQorYXNzb2NpYXRlZCB3aXRoIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyZWVzIGludm9sdmVkIHRoYXQKK3lvdSBjYW4gY3JlYXRlIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gdGhlbS4nCisKK1Rob3NlIGFyZSB0aGUgdGhyZWUgT05MWSB0aGluZ3MgdGhhdCB0aGUgZGlyZWN0b3J5IGNhY2hlIGRvZXMuICBJdCdzIGEKK2NhY2hlLCBhbmQgdGhlIG5vcm1hbCBvcGVyYXRpb24gaXMgdG8gcmUtZ2VuZXJhdGUgaXQgY29tcGxldGVseSBmcm9tIGEKK2tub3duIHRyZWUgb2JqZWN0LCBvciB1cGRhdGUvY29tcGFyZSBpdCB3aXRoIGEgbGl2ZSB0cmVlIHRoYXQgaXMgYmVpbmcKK2RldmVsb3BlZC4gIElmIHlvdSBibG93IHRoZSBkaXJlY3RvcnkgY2FjaGUgYXdheSBlbnRpcmVseSwgeW91IGdlbmVyYWxseQoraGF2ZW4ndCBsb3N0IGFueSBpbmZvcm1hdGlvbiBhcyBsb25nIGFzIHlvdSBoYXZlIHRoZSBuYW1lIG9mIHRoZSB0cmVlCit0aGF0IGl0IGRlc2NyaWJlZC4KKworQXQgdGhlIHNhbWUgdGltZSwgdGhlIGluZGV4IGlzIGF0IHRoZSBzYW1lIHRpbWUgYWxzbyB0aGUKK3N0YWdpbmcgYXJlYSBmb3IgY3JlYXRpbmcgbmV3IHRyZWVzLCBhbmQgY3JlYXRpbmcgYSBuZXcgdHJlZSBhbHdheXMKK2ludm9sdmVzIGEgY29udHJvbGxlZCBtb2RpZmljYXRpb24gb2YgdGhlIGluZGV4IGZpbGUuICBJbiBwYXJ0aWN1bGFyLAordGhlIGluZGV4IGZpbGUgY2FuIGhhdmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVybWVkaWF0ZSB0cmVlIHRoYXQKK2hhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkLiAgU28gdGhlIGluZGV4IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEKK3dyaXRlLWJhY2sgY2FjaGUsIHdoaWNoIGNhbiBjb250YWluIGRpcnR5IGluZm9ybWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQKK2JlZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorCisKKworVGhlIFdvcmtmbG93CistLS0tLS0tLS0tLS0KK0dlbmVyYWxseSwgYWxsICJnaXQiIG9wZXJhdGlvbnMgd29yayBvbiB0aGUgaW5kZXggZmlsZS4gU29tZSBvcGVyYXRpb25zCit3b3JrICpwdXJlbHkqIG9uIHRoZSBpbmRleCBmaWxlIChzaG93aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQoraW5kZXgpLCBidXQgbW9zdCBvcGVyYXRpb25zIG1vdmUgZGF0YSB0byBhbmQgZnJvbSB0aGUgaW5kZXggZmlsZS4gRWl0aGVyCitmcm9tIHRoZSBkYXRhYmFzZSBvciBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gVGh1cyB0aGVyZSBhcmUgZm91cgorbWFpbiBjb21iaW5hdGlvbnM6CisKKzEpIHdvcmtpbmcgZGlyZWN0b3J5IC0+IGluZGV4Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitZb3UgdXBkYXRlIHRoZSBpbmRleCB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGgKK3RoZSBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0gY29tbWFuZC4gIFlvdQorZ2VuZXJhbGx5IHVwZGF0ZSB0aGUgaW5kZXggaW5mb3JtYXRpb24gYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZQoreW91IHdhbnQgdG8gdXBkYXRlLCBsaWtlIHNvOgorCisJZ2l0LXVwZGF0ZS1pbmRleCBmaWxlbmFtZQorCitidXQgdG8gYXZvaWQgY29tbW9uIG1pc3Rha2VzIHdpdGggZmlsZW5hbWUgZ2xvYmJpbmcgZXRjLCB0aGUgY29tbWFuZAord2lsbCBub3Qgbm9ybWFsbHkgYWRkIHRvdGFsbHkgbmV3IGVudHJpZXMgb3IgcmVtb3ZlIG9sZCBlbnRyaWVzLAoraS5lLiBpdCB3aWxsIG5vcm1hbGx5IGp1c3QgdXBkYXRlIGV4aXN0aW5nIGNhY2hlIGVudHJpZXMuCisKK1RvIHRlbGwgZ2l0IHRoYXQgeWVzLCB5b3UgcmVhbGx5IGRvIHJlYWxpemUgdGhhdCBjZXJ0YWluIGZpbGVzIG5vCitsb25nZXIgZXhpc3QsIG9yIHRoYXQgbmV3IGZpbGVzIHNob3VsZCBiZSBhZGRlZCwgeW91CitzaG91bGQgdXNlIHRoZSBgLS1yZW1vdmVgIGFuZCBgLS1hZGRgIGZsYWdzIHJlc3BlY3RpdmVseS4KKworTk9URSEgQSBgLS1yZW1vdmVgIGZsYWcgZG9lcyAnbm90JyBtZWFuIHRoYXQgc3Vic2VxdWVudCBmaWxlbmFtZXMgd2lsbAorbmVjZXNzYXJpbHkgYmUgcmVtb3ZlZDogaWYgdGhlIGZpbGVzIHN0aWxsIGV4aXN0IGluIHlvdXIgZGlyZWN0b3J5CitzdHJ1Y3R1cmUsIHRoZSBpbmRleCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGVpciBuZXcgc3RhdHVzLCBub3QKK3JlbW92ZWQuIFRoZSBvbmx5IHRoaW5nIGAtLXJlbW92ZWAgbWVhbnMgaXMgdGhhdCB1cGRhdGUtY2FjaGUgd2lsbCBiZQorY29uc2lkZXJpbmcgYSByZW1vdmVkIGZpbGUgdG8gYmUgYSB2YWxpZCB0aGluZywgYW5kIGlmIHRoZSBmaWxlIHJlYWxseQorZG9lcyBub3QgZXhpc3QgYW55IG1vcmUsIGl0IHdpbGwgdXBkYXRlIHRoZSBpbmRleCBhY2NvcmRpbmdseS4KKworQXMgYSBzcGVjaWFsIGNhc2UsIHlvdSBjYW4gYWxzbyBkbyBgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2hgLCB3aGljaAord2lsbCByZWZyZXNoIHRoZSAic3RhdCIgaW5mb3JtYXRpb24gb2YgZWFjaCBpbmRleCB0byBtYXRjaCB0aGUgY3VycmVudAorc3RhdCBpbmZvcm1hdGlvbi4gSXQgd2lsbCAnbm90JyB1cGRhdGUgdGhlIG9iamVjdCBzdGF0dXMgaXRzZWxmLCBhbmQKK2l0IHdpbGwgb25seSB1cGRhdGUgdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkIHRvIHF1aWNrbHkgdGVzdCB3aGV0aGVyCithbiBvYmplY3Qgc3RpbGwgbWF0Y2hlcyBpdHMgb2xkIGJhY2tpbmcgc3RvcmUgb2JqZWN0LgorCisyKSBpbmRleCAtPiBvYmplY3QgZGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitZb3Ugd3JpdGUgeW91ciBjdXJyZW50IGluZGV4IGZpbGUgdG8gYSAidHJlZSIgb2JqZWN0IHdpdGggdGhlIHByb2dyYW0KKworCWdpdC13cml0ZS10cmVlCisKK3RoYXQgZG9lc24ndCBjb21lIHdpdGggYW55IG9wdGlvbnMgLSBpdCB3aWxsIGp1c3Qgd3JpdGUgb3V0IHRoZQorY3VycmVudCBpbmRleCBpbnRvIHRoZSBzZXQgb2YgdHJlZSBvYmplY3RzIHRoYXQgZGVzY3JpYmUgdGhhdCBzdGF0ZSwKK2FuZCBpdCB3aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIHRvcC1sZXZlbCB0cmVlLiBZb3UgY2FuCit1c2UgdGhhdCB0cmVlIHRvIHJlLWdlbmVyYXRlIHRoZSBpbmRleCBhdCBhbnkgdGltZSBieSBnb2luZyBpbiB0aGUKK290aGVyIGRpcmVjdGlvbjoKKworMykgb2JqZWN0IGRhdGFiYXNlIC0+IGluZGV4Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHJlYWQgYSAidHJlZSIgZmlsZSBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UsIGFuZCB1c2UgdGhhdCB0bworcG9wdWxhdGUgKGFuZCBvdmVyd3JpdGUgLSBkb24ndCBkbyB0aGlzIGlmIHlvdXIgaW5kZXggY29udGFpbnMgYW55Cit1bnNhdmVkIHN0YXRlIHRoYXQgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdG9yZSBsYXRlciEpIHlvdXIgY3VycmVudAoraW5kZXguICBOb3JtYWwgb3BlcmF0aW9uIGlzIGp1c3QKKworCQlnaXQtcmVhZC10cmVlIDxzaGExIG9mIHRyZWU+CisKK2FuZCB5b3VyIGluZGV4IGZpbGUgd2lsbCBub3cgYmUgZXF1aXZhbGVudCB0byB0aGUgdHJlZSB0aGF0IHlvdSBzYXZlZAorZWFybGllci4gSG93ZXZlciwgdGhhdCBpcyBvbmx5IHlvdXIgJ2luZGV4JyBmaWxlOiB5b3VyIHdvcmtpbmcKK2RpcmVjdG9yeSBjb250ZW50cyBoYXZlIG5vdCBiZWVuIG1vZGlmaWVkLgorCis0KSBpbmRleCAtPiB3b3JraW5nIGRpcmVjdG9yeQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHVwZGF0ZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGZyb20gdGhlIGluZGV4IGJ5ICJjaGVja2luZyBvdXQiCitmaWxlcy4gVGhpcyBpcyBub3QgYSB2ZXJ5IGNvbW1vbiBvcGVyYXRpb24sIHNpbmNlIG5vcm1hbGx5IHlvdSdkIGp1c3QKK2tlZXAgeW91ciBmaWxlcyB1cGRhdGVkLCBhbmQgcmF0aGVyIHRoYW4gd3JpdGUgdG8geW91ciB3b3JraW5nCitkaXJlY3RvcnksIHlvdSdkIHRlbGwgdGhlIGluZGV4IGZpbGVzIGFib3V0IHRoZSBjaGFuZ2VzIGluIHlvdXIKK3dvcmtpbmcgZGlyZWN0b3J5IChpLmUuIGBnaXQtdXBkYXRlLWluZGV4YCkuCisKK0hvd2V2ZXIsIGlmIHlvdSBkZWNpZGUgdG8ganVtcCB0byBhIG5ldyB2ZXJzaW9uLCBvciBjaGVjayBvdXQgc29tZWJvZHkKK2Vsc2UncyB2ZXJzaW9uLCBvciBqdXN0IHJlc3RvcmUgYSBwcmV2aW91cyB0cmVlLCB5b3UnZCBwb3B1bGF0ZSB5b3VyCitpbmRleCBmaWxlIHdpdGggcmVhZC10cmVlLCBhbmQgdGhlbiB5b3UgbmVlZCB0byBjaGVjayBvdXQgdGhlIHJlc3VsdAord2l0aAorCisJCWdpdC1jaGVja291dC1pbmRleCBmaWxlbmFtZQorCitvciwgaWYgeW91IHdhbnQgdG8gY2hlY2sgb3V0IGFsbCBvZiB0aGUgaW5kZXgsIHVzZSBgLWFgLgorCitOT1RFISBnaXQtY2hlY2tvdXQtaW5kZXggbm9ybWFsbHkgcmVmdXNlcyB0byBvdmVyd3JpdGUgb2xkIGZpbGVzLCBzbworaWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gb2YgdGhlIHRyZWUgYWxyZWFkeSBjaGVja2VkIG91dCwgeW91IHdpbGwKK25lZWQgdG8gdXNlIHRoZSAiLWYiIGZsYWcgKCdiZWZvcmUnIHRoZSAiLWEiIGZsYWcgb3IgdGhlIGZpbGVuYW1lKSB0bworJ2ZvcmNlJyB0aGUgY2hlY2tvdXQuCisKKworRmluYWxseSwgdGhlcmUgYXJlIGEgZmV3IG9kZHMgYW5kIGVuZHMgd2hpY2ggYXJlIG5vdCBwdXJlbHkgbW92aW5nCitmcm9tIG9uZSByZXByZXNlbnRhdGlvbiB0byB0aGUgb3RoZXI6CisKKzUpIFR5aW5nIGl0IGFsbCB0b2dldGhlcgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUbyBjb21taXQgYSB0cmVlIHlvdSBoYXZlIGluc3RhbnRpYXRlZCB3aXRoICJnaXQtd3JpdGUtdHJlZSIsIHlvdSdkCitjcmVhdGUgYSAiY29tbWl0IiBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhhdCB0cmVlIGFuZCB0aGUgaGlzdG9yeQorYmVoaW5kIGl0IC0gbW9zdCBub3RhYmx5IHRoZSAicGFyZW50IiBjb21taXRzIHRoYXQgcHJlY2VkZWQgaXQgaW4KK2hpc3RvcnkuCisKK05vcm1hbGx5IGEgImNvbW1pdCIgaGFzIG9uZSBwYXJlbnQ6IHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgdHJlZQorYmVmb3JlIGEgY2VydGFpbiBjaGFuZ2Ugd2FzIG1hZGUuIEhvd2V2ZXIsIHNvbWV0aW1lcyBpdCBjYW4gaGF2ZSB0d28KK29yIG1vcmUgcGFyZW50IGNvbW1pdHMsIGluIHdoaWNoIGNhc2Ugd2UgY2FsbCBpdCBhICJtZXJnZSIsIGR1ZSB0byB0aGUKK2ZhY3QgdGhhdCBzdWNoIGEgY29tbWl0IGJyaW5ncyB0b2dldGhlciAoIm1lcmdlcyIpIHR3byBvciBtb3JlCitwcmV2aW91cyBzdGF0ZXMgcmVwcmVzZW50ZWQgYnkgb3RoZXIgY29tbWl0cy4KKworSW4gb3RoZXIgd29yZHMsIHdoaWxlIGEgInRyZWUiIHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBzdGF0ZQorb2YgYSB3b3JraW5nIGRpcmVjdG9yeSwgYSAiY29tbWl0IiByZXByZXNlbnRzIHRoYXQgc3RhdGUgaW4gInRpbWUiLAorYW5kIGV4cGxhaW5zIGhvdyB3ZSBnb3QgdGhlcmUuCisKK1lvdSBjcmVhdGUgYSBjb21taXQgb2JqZWN0IGJ5IGdpdmluZyBpdCB0aGUgdHJlZSB0aGF0IGRlc2NyaWJlcyB0aGUKK3N0YXRlIGF0IHRoZSB0aW1lIG9mIHRoZSBjb21taXQsIGFuZCBhIGxpc3Qgb2YgcGFyZW50czoKKworCWdpdC1jb21taXQtdHJlZSA8dHJlZT4gLXAgPHBhcmVudD4gWy1wIDxwYXJlbnQyPiAuLl0KKworYW5kIHRoZW4gZ2l2aW5nIHRoZSByZWFzb24gZm9yIHRoZSBjb21taXQgb24gc3RkaW4gKGVpdGhlciB0aHJvdWdoCityZWRpcmVjdGlvbiBmcm9tIGEgcGlwZSBvciBmaWxlLCBvciBieSBqdXN0IHR5cGluZyBpdCBhdCB0aGUgdHR5KS4KKworZ2l0LWNvbW1pdC10cmVlIHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCByZXByZXNlbnRzCit0aGF0IGNvbW1pdCwgYW5kIHlvdSBzaG91bGQgc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UuIE5vcm1hbGx5LAoreW91J2QgY29tbWl0IGEgbmV3IGBIRUFEYCBzdGF0ZSwgYW5kIHdoaWxlIGdpdCBkb2Vzbid0IGNhcmUgd2hlcmUgeW91CitzYXZlIHRoZSBub3RlIGFib3V0IHRoYXQgc3RhdGUsIGluIHByYWN0aWNlIHdlIHRlbmQgdG8ganVzdCB3cml0ZSB0aGUKK3Jlc3VsdCB0byB0aGUgZmlsZSBwb2ludGVkIGF0IGJ5IGAuZ2l0L0hFQURgLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgc2VlCit3aGF0IHRoZSBsYXN0IGNvbW1pdHRlZCBzdGF0ZSB3YXMuCisKK0hlcmUgaXMgYW4gQVNDSUkgYXJ0IGJ5IEpvbiBMb2VsaWdlciB0aGF0IGlsbHVzdHJhdGVzIGhvdwordmFyaW91cyBwaWVjZXMgZml0IHRvZ2V0aGVyLgorCistLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICAgY29tbWl0LXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICBjb21taXQgb2JqCisgICAgICAgICAgICAgICAgICAgICAgICstLS0tKworICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIFYgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgT2JqZWN0IERCIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgQmFja2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8ICAgU3RvcmUgICB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICB3cml0ZS10cmVlICB8ICAgICB8CisgICAgICAgICAgICAgdHJlZSBvYmogIHwgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgcmVhZC10cmVlCisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgIHRyZWUgb2JqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8ICAgSW5kZXggICB8CisgICAgICAgICAgICAgICAgICAgIHwgICJjYWNoZSIgIHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgdXBkYXRlLWluZGV4ICBeCisgICAgICAgICAgICAgYmxvYiBvYmogIHwgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAorICAgIGNoZWNrb3V0LWluZGV4IC11ICB8ICAgICB8ICBjaGVja291dC1pbmRleAorICAgICAgICAgICAgIHN0YXQgICAgICB8ICAgICB8ICBibG9iIG9iagorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCAgV29ya2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8IERpcmVjdG9yeSB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKworLS0tLS0tLS0tLS0tCisKKworNikgRXhhbWluaW5nIHRoZSBkYXRhCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IGNhbiBleGFtaW5lIHRoZSBkYXRhIHJlcHJlc2VudGVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHRoZQoraW5kZXggd2l0aCB2YXJpb3VzIGhlbHBlciB0b29scy4gRm9yIGV2ZXJ5IG9iamVjdCwgeW91IGNhbiB1c2UKK2dpdGxpbms6Z2l0LWNhdC1maWxlWzFdIHRvIGV4YW1pbmUgZGV0YWlscyBhYm91dCB0aGUKK29iamVjdDoKKworCQlnaXQtY2F0LWZpbGUgLXQgPG9iamVjdG5hbWU+CisKK3Nob3dzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIGFuZCBvbmNlIHlvdSBoYXZlIHRoZSB0eXBlICh3aGljaCBpcwordXN1YWxseSBpbXBsaWNpdCBpbiB3aGVyZSB5b3UgZmluZCB0aGUgb2JqZWN0KSwgeW91IGNhbiB1c2UKKworCQlnaXQtY2F0LWZpbGUgYmxvYnx0cmVlfGNvbW1pdHx0YWcgPG9iamVjdG5hbWU+CisKK3RvIHNob3cgaXRzIGNvbnRlbnRzLiBOT1RFISBUcmVlcyBoYXZlIGJpbmFyeSBjb250ZW50LCBhbmQgYXMgYSByZXN1bHQKK3RoZXJlIGlzIGEgc3BlY2lhbCBoZWxwZXIgZm9yIHNob3dpbmcgdGhhdCBjb250ZW50LCBjYWxsZWQKK2BnaXQtbHMtdHJlZWAsIHdoaWNoIHR1cm5zIHRoZSBiaW5hcnkgY29udGVudCBpbnRvIGEgbW9yZSBlYXNpbHkKK3JlYWRhYmxlIGZvcm0uCisKK0l0J3MgZXNwZWNpYWxseSBpbnN0cnVjdGl2ZSB0byBsb29rIGF0ICJjb21taXQiIG9iamVjdHMsIHNpbmNlIHRob3NlCit0ZW5kIHRvIGJlIHNtYWxsIGFuZCBmYWlybHkgc2VsZi1leHBsYW5hdG9yeS4gSW4gcGFydGljdWxhciwgaWYgeW91Citmb2xsb3cgdGhlIGNvbnZlbnRpb24gb2YgaGF2aW5nIHRoZSB0b3AgY29tbWl0IG5hbWUgaW4gYC5naXQvSEVBRGAsCit5b3UgY2FuIGRvCisKKwkJZ2l0LWNhdC1maWxlIGNvbW1pdCBIRUFECisKK3RvIHNlZSB3aGF0IHRoZSB0b3AgY29tbWl0IHdhcy4KKworNykgTWVyZ2luZyBtdWx0aXBsZSB0cmVlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitHaXQgaGVscHMgeW91IGRvIGEgdGhyZWUtd2F5IG1lcmdlLCB3aGljaCB5b3UgY2FuIGV4cGFuZCB0byBuLXdheSBieQorcmVwZWF0aW5nIHRoZSBtZXJnZSBwcm9jZWR1cmUgYXJiaXRyYXJ5IHRpbWVzIHVudGlsIHlvdSBmaW5hbGx5CisiY29tbWl0IiB0aGUgc3RhdGUuICBUaGUgbm9ybWFsIHNpdHVhdGlvbiBpcyB0aGF0IHlvdSdkIG9ubHkgZG8gb25lCit0aHJlZS13YXkgbWVyZ2UgKHR3byBwYXJlbnRzKSwgYW5kIGNvbW1pdCBpdCwgYnV0IGlmIHlvdSBsaWtlIHRvLCB5b3UKK2NhbiBkbyBtdWx0aXBsZSBwYXJlbnRzIGluIG9uZSBnby4KKworVG8gZG8gYSB0aHJlZS13YXkgbWVyZ2UsIHlvdSBuZWVkIHRoZSB0d28gc2V0cyBvZiAiY29tbWl0IiBvYmplY3RzCit0aGF0IHlvdSB3YW50IHRvIG1lcmdlLCB1c2UgdGhvc2UgdG8gZmluZCB0aGUgY2xvc2VzdCBjb21tb24gcGFyZW50IChhCit0aGlyZCAiY29tbWl0IiBvYmplY3QpLCBhbmQgdGhlbiB1c2UgdGhvc2UgY29tbWl0IG9iamVjdHMgdG8gZmluZCB0aGUKK3N0YXRlIG9mIHRoZSBkaXJlY3RvcnkgKCJ0cmVlIiBvYmplY3QpIGF0IHRoZXNlIHBvaW50cy4KKworVG8gZ2V0IHRoZSAiYmFzZSIgZm9yIHRoZSBtZXJnZSwgeW91IGZpcnN0IGxvb2sgdXAgdGhlIGNvbW1vbiBwYXJlbnQKK29mIHR3byBjb21taXRzIHdpdGgKKworCQlnaXQtbWVyZ2UtYmFzZSA8Y29tbWl0MT4gPGNvbW1pdDI+CisKK3doaWNoIHdpbGwgcmV0dXJuIHlvdSB0aGUgY29tbWl0IHRoZXkgYXJlIGJvdGggYmFzZWQgb24uICBZb3Ugc2hvdWxkCitub3cgbG9vayB1cCB0aGUgInRyZWUiIG9iamVjdHMgb2YgdGhvc2UgY29tbWl0cywgd2hpY2ggeW91IGNhbiBlYXNpbHkKK2RvIHdpdGggKGZvciBleGFtcGxlKQorCisJCWdpdC1jYXQtZmlsZSBjb21taXQgPGNvbW1pdG5hbWU+IHwgaGVhZCAtMQorCitzaW5jZSB0aGUgdHJlZSBvYmplY3QgaW5mb3JtYXRpb24gaXMgYWx3YXlzIHRoZSBmaXJzdCBsaW5lIGluIGEgY29tbWl0CitvYmplY3QuCisKK09uY2UgeW91IGtub3cgdGhlIHRocmVlIHRyZWVzIHlvdSBhcmUgZ29pbmcgdG8gbWVyZ2UgKHRoZSBvbmUKKyJvcmlnaW5hbCIgdHJlZSwgYWthIHRoZSBjb21tb24gY2FzZSwgYW5kIHRoZSB0d28gInJlc3VsdCIgdHJlZXMsIGFrYQordGhlIGJyYW5jaGVzIHlvdSB3YW50IHRvIG1lcmdlKSwgeW91IGRvIGEgIm1lcmdlIiByZWFkIGludG8gdGhlCitpbmRleC4gVGhpcyB3aWxsIGNvbXBsYWluIGlmIGl0IGhhcyB0byB0aHJvdyBhd2F5IHlvdXIgb2xkIGluZGV4IGNvbnRlbnRzLCBzbyB5b3Ugc2hvdWxkCittYWtlIHN1cmUgdGhhdCB5b3UndmUgY29tbWl0dGVkIHRob3NlIC0gaW4gZmFjdCB5b3Ugd291bGQgbm9ybWFsbHkKK2Fsd2F5cyBkbyBhIG1lcmdlIGFnYWluc3QgeW91ciBsYXN0IGNvbW1pdCAod2hpY2ggc2hvdWxkIHRodXMgbWF0Y2gKK3doYXQgeW91IGhhdmUgaW4geW91ciBjdXJyZW50IGluZGV4IGFueXdheSkuCisKK1RvIGRvIHRoZSBtZXJnZSwgZG8KKworCQlnaXQtcmVhZC10cmVlIC1tIC11IDxvcmlndHJlZT4gPHlvdXJ0cmVlPiA8dGFyZ2V0dHJlZT4KKword2hpY2ggd2lsbCBkbyBhbGwgdHJpdmlhbCBtZXJnZSBvcGVyYXRpb25zIGZvciB5b3UgZGlyZWN0bHkgaW4gdGhlCitpbmRleCBmaWxlLCBhbmQgeW91IGNhbiBqdXN0IHdyaXRlIHRoZSByZXN1bHQgb3V0IHdpdGgKK2BnaXQtd3JpdGUtdHJlZWAuCisKK0hpc3RvcmljYWwgbm90ZS4gIFdlIGRpZCBub3QgaGF2ZSBgLXVgIGZhY2lsaXR5IHdoZW4gdGhpcworc2VjdGlvbiB3YXMgZmlyc3Qgd3JpdHRlbiwgc28gd2UgdXNlZCB0byB3YXJuIHRoYXQKK3RoZSBtZXJnZSBpcyBkb25lIGluIHRoZSBpbmRleCBmaWxlLCBub3QgaW4geW91cgord29ya2luZyB0cmVlLCBhbmQgeW91ciB3b3JraW5nIHRyZWUgd2lsbCBub3QgbWF0Y2ggeW91cgoraW5kZXggYWZ0ZXIgdGhpcyBzdGVwLgorVGhpcyBpcyBubyBsb25nZXIgdHJ1ZS4gIFRoZSBhYm92ZSBjb21tYW5kLCB0aGFua3MgdG8gYC11YAorb3B0aW9uLCB1cGRhdGVzIHlvdXIgd29ya2luZyB0cmVlIHdpdGggdGhlIG1lcmdlIHJlc3VsdHMgZm9yCitwYXRocyB0aGF0IGhhdmUgYmVlbiB0cml2aWFsbHkgbWVyZ2VkLgorCisKKzgpIE1lcmdpbmcgbXVsdGlwbGUgdHJlZXMsIGNvbnRpbnVlZAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1NhZGx5LCBtYW55IG1lcmdlcyBhcmVuJ3QgdHJpdmlhbC4gSWYgdGhlcmUgYXJlIGZpbGVzIHRoYXQgaGF2ZQorYmVlbiBhZGRlZC5tb3ZlZCBvciByZW1vdmVkLCBvciBpZiBib3RoIGJyYW5jaGVzIGhhdmUgbW9kaWZpZWQgdGhlCitzYW1lIGZpbGUsIHlvdSB3aWxsIGJlIGxlZnQgd2l0aCBhbiBpbmRleCB0cmVlIHRoYXQgY29udGFpbnMgIm1lcmdlCitlbnRyaWVzIiBpbiBpdC4gU3VjaCBhbiBpbmRleCB0cmVlIGNhbiAnTk9UJyBiZSB3cml0dGVuIG91dCB0byBhIHRyZWUKK29iamVjdCwgYW5kIHlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBjbGFzaGVzIHVzaW5nCitvdGhlciB0b29scyBiZWZvcmUgeW91IGNhbiB3cml0ZSBvdXQgdGhlIHJlc3VsdC4KKworWW91IGNhbiBleGFtaW5lIHN1Y2ggaW5kZXggc3RhdGUgd2l0aCBgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWRgCitjb21tYW5kLiAgQW4gZXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgLW0gJG9yaWcgSEVBRCAkdGFyZ2V0CiskIGdpdC1scy1maWxlcyAtLXVubWVyZ2VkCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvLmMKKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8uYworMTAwNjQ0IGNjNDRjNzNlYjc4MzU2NWRhNTgzMWI0ZDgyMGM5NjI5NTQwMTliNjkgMwloZWxsby5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRWFjaCBsaW5lIG9mIHRoZSBgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWRgIG91dHB1dCBiZWdpbnMgd2l0aAordGhlIGJsb2IgbW9kZSBiaXRzLCBibG9iIFNIQTEsICdzdGFnZSBudW1iZXInLCBhbmQgdGhlCitmaWxlbmFtZS4gIFRoZSAnc3RhZ2UgbnVtYmVyJyBpcyBnaXQncyB3YXkgdG8gc2F5IHdoaWNoIHRyZWUgaXQKK2NhbWUgZnJvbTogc3RhZ2UgMSBjb3JyZXNwb25kcyB0byBgJG9yaWdgIHRyZWUsIHN0YWdlIDIgYEhFQURgCit0cmVlLCBhbmQgc3RhZ2UzIGAkdGFyZ2V0YCB0cmVlLgorCitFYXJsaWVyIHdlIHNhaWQgdGhhdCB0cml2aWFsIG1lcmdlcyBhcmUgZG9uZSBpbnNpZGUKK2BnaXQtcmVhZC10cmVlIC1tYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsZSBkaWQgbm90IGNoYW5nZQorZnJvbSBgJG9yaWdgIHRvIGBIRUFEYCBub3IgYCR0YXJnZXRgLCBvciBpZiB0aGUgZmlsZSBjaGFuZ2VkCitmcm9tIGAkb3JpZ2AgdG8gYEhFQURgIGFuZCBgJG9yaWdgIHRvIGAkdGFyZ2V0YCB0aGUgc2FtZSB3YXksCitvYnZpb3VzbHkgdGhlIGZpbmFsIG91dGNvbWUgaXMgd2hhdCBpcyBpbiBgSEVBRGAuICBXaGF0IHRoZQorYWJvdmUgZXhhbXBsZSBzaG93cyBpcyB0aGF0IGZpbGUgYGhlbGxvLmNgIHdhcyBjaGFuZ2VkIGZyb20KK2Akb3JpZ2AgdG8gYEhFQURgIGFuZCBgJG9yaWdgIHRvIGAkdGFyZ2V0YCBpbiBhIGRpZmZlcmVudCB3YXkuCitZb3UgY291bGQgcmVzb2x2ZSB0aGlzIGJ5IHJ1bm5pbmcgeW91ciBmYXZvcml0ZSAzLXdheSBtZXJnZQorcHJvZ3JhbSwgZS5nLiAgYGRpZmYzYCBvciBgbWVyZ2VgLCBvbiB0aGUgYmxvYiBvYmplY3RzIGZyb20KK3RoZXNlIHRocmVlIHN0YWdlcyB5b3Vyc2VsZiwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIGJsb2IgMjYzNDE0Zi4uLiA+aGVsbG8uY34xCiskIGdpdC1jYXQtZmlsZSBibG9iIDA2ZmE2YTIuLi4gPmhlbGxvLmN+MgorJCBnaXQtY2F0LWZpbGUgYmxvYiBjYzQ0YzczLi4uID5oZWxsby5jfjMKKyQgbWVyZ2UgaGVsbG8uY34yIGhlbGxvLmN+MSBoZWxsby5jfjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdvdWxkIGxlYXZlIHRoZSBtZXJnZSByZXN1bHQgaW4gYGhlbGxvLmN+MmAgZmlsZSwgYWxvbmcKK3dpdGggY29uZmxpY3QgbWFya2VycyBpZiB0aGVyZSBhcmUgY29uZmxpY3RzLiAgQWZ0ZXIgdmVyaWZ5aW5nCit0aGUgbWVyZ2UgcmVzdWx0IG1ha2VzIHNlbnNlLCB5b3UgY2FuIHRlbGwgZ2l0IHdoYXQgdGhlIGZpbmFsCittZXJnZSByZXN1bHQgZm9yIHRoaXMgZmlsZSBpcyBieToKKworCW12IC1mIGhlbGxvLmN+MiBoZWxsby5jCisJZ2l0LXVwZGF0ZS1pbmRleCBoZWxsby5jCisKK1doZW4gYSBwYXRoIGlzIGluIHVubWVyZ2VkIHN0YXRlLCBydW5uaW5nIGBnaXQtdXBkYXRlLWluZGV4YCBmb3IKK3RoYXQgcGF0aCB0ZWxscyBnaXQgdG8gbWFyayB0aGUgcGF0aCByZXNvbHZlZC4KKworVGhlIGFib3ZlIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGdpdCBtZXJnZSBhdCB0aGUgbG93ZXN0IGxldmVsLAordG8gaGVscCB5b3UgdW5kZXJzdGFuZCB3aGF0IGNvbmNlcHR1YWxseSBoYXBwZW5zIHVuZGVyIHRoZSBob29kLgorSW4gcHJhY3RpY2UsIG5vYm9keSwgbm90IGV2ZW4gZ2l0IGl0c2VsZiwgdXNlcyB0aHJlZSBgZ2l0LWNhdC1maWxlYAorZm9yIHRoaXMuICBUaGVyZSBpcyBgZ2l0LW1lcmdlLWluZGV4YCBwcm9ncmFtIHRoYXQgZXh0cmFjdHMgdGhlCitzdGFnZXMgdG8gdGVtcG9yYXJ5IGZpbGVzIGFuZCBjYWxscyBhICJtZXJnZSIgc2NyaXB0IG9uIGl0OgorCisJZ2l0LW1lcmdlLWluZGV4IGdpdC1tZXJnZS1vbmUtZmlsZSBoZWxsby5jCisKK2FuZCB0aGF0IGlzIHdoYXQgaGlnaGVyIGxldmVsIGBnaXQgbWVyZ2UgLXMgcmVzb2x2ZWAgaXMgaW1wbGVtZW50ZWQKK3dpdGguCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtdHV0b3JpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLXR1dG9yaWFsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjliOWFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb3JlLXR1dG9yaWFsLnR4dApAQCAtMCwwICsxLDE2OTAgQEAKK0EgZ2l0IGNvcmUgdHV0b3JpYWwgZm9yIGRldmVsb3BlcnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0cnlpbmcgdG8gYmUgYSBzaG9ydCB0dXRvcmlhbCBvbiBzZXR0aW5nIHVwIGFuZCB1c2luZyBhIGdpdAorcmVwb3NpdG9yeSwgbWFpbmx5IGJlY2F1c2UgYmVpbmcgaGFuZHMtb24gYW5kIHVzaW5nIGV4cGxpY2l0IGV4YW1wbGVzIGlzCitvZnRlbiB0aGUgYmVzdCB3YXkgb2YgZXhwbGFpbmluZyB3aGF0IGlzIGdvaW5nIG9uLgorCitJbiBub3JtYWwgbGlmZSwgbW9zdCBwZW9wbGUgd291bGRuJ3QgdXNlIHRoZSAiY29yZSIgZ2l0IHByb2dyYW1zCitkaXJlY3RseSwgYnV0IHJhdGhlciBzY3JpcHQgYXJvdW5kIHRoZW0gdG8gbWFrZSB0aGVtIG1vcmUgcGFsYXRhYmxlLiAKK1VuZGVyc3RhbmRpbmcgdGhlIGNvcmUgZ2l0IHN0dWZmIG1heSBoZWxwIHNvbWUgcGVvcGxlIGdldCB0aG9zZSBzY3JpcHRzCitkb25lLCB0aG91Z2gsIGFuZCBpdCBtYXkgYWxzbyBiZSBpbnN0cnVjdGl2ZSBpbiBoZWxwaW5nIHBlb3BsZQordW5kZXJzdGFuZCB3aGF0IGl0IGlzIHRoYXQgdGhlIGhpZ2hlci1sZXZlbCBoZWxwZXIgc2NyaXB0cyBhcmUgYWN0dWFsbHkKK2RvaW5nLiAKKworVGhlIGNvcmUgZ2l0IGlzIG9mdGVuIGNhbGxlZCAicGx1bWJpbmciLCB3aXRoIHRoZSBwcmV0dGllciB1c2VyCitpbnRlcmZhY2VzIG9uIHRvcCBvZiBpdCBjYWxsZWQgInBvcmNlbGFpbiIuIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIHRoZQorcGx1bWJpbmcgZGlyZWN0bHkgdmVyeSBvZnRlbiwgYnV0IGl0IGNhbiBiZSBnb29kIHRvIGtub3cgd2hhdCB0aGUKK3BsdW1iaW5nIGRvZXMgZm9yIHdoZW4gdGhlIHBvcmNlbGFpbiBpc24ndCBmbHVzaGluZy4KKworVGhlIG1hdGVyaWFsIHByZXNlbnRlZCBoZXJlIG9mdGVuIGdvZXMgZGVlcCBkZXNjcmliaW5nIGhvdyB0aGluZ3MKK3dvcmsgaW50ZXJuYWxseS4gIElmIHlvdSBhcmUgbW9zdGx5IGludGVyZXN0ZWQgaW4gdXNpbmcgZ2l0IGFzIGEKK1NDTSwgeW91IGNhbiBza2lwIHRoZW0gZHVyaW5nIHlvdXIgZmlyc3QgcGFzcy4KKworW05PVEVdCitBbmQgdGhvc2UgInRvbyBkZWVwIiBkZXNjcmlwdGlvbnMgYXJlIG9mdGVuIG1hcmtlZCBhcyBOb3RlLgorCitbTk9URV0KK0lmIHlvdSBhcmUgYWxyZWFkeSBmYW1pbGlhciB3aXRoIGFub3RoZXIgdmVyc2lvbiBjb250cm9sIHN5c3RlbSwKK2xpa2UgQ1ZTLCB5b3UgbWF5IHdhbnQgdG8gdGFrZSBhIGxvb2sgYXQKK2xpbms6ZXZlcnlkYXkuaHRtbFtFdmVyeWRheSBHSVQgaW4gMjAgY29tbWFuZHMgb3Igc29dIGZpcnN0CitiZWZvcmUgcmVhZGluZyB0aGlzLgorCisKK0NyZWF0aW5nIGEgZ2l0IHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ3JlYXRpbmcgYSBuZXcgZ2l0IHJlcG9zaXRvcnkgY291bGRuJ3QgYmUgZWFzaWVyOiBhbGwgZ2l0IHJlcG9zaXRvcmllcyBzdGFydAorb3V0IGVtcHR5LCBhbmQgdGhlIG9ubHkgdGhpbmcgeW91IG5lZWQgdG8gZG8gaXMgZmluZCB5b3Vyc2VsZiBhCitzdWJkaXJlY3RvcnkgdGhhdCB5b3Ugd2FudCB0byB1c2UgYXMgYSB3b3JraW5nIHRyZWUgLSBlaXRoZXIgYW4gZW1wdHkKK29uZSBmb3IgYSB0b3RhbGx5IG5ldyBwcm9qZWN0LCBvciBhbiBleGlzdGluZyB3b3JraW5nIHRyZWUgdGhhdCB5b3Ugd2FudAordG8gaW1wb3J0IGludG8gZ2l0LiAKKworRm9yIG91ciBmaXJzdCBleGFtcGxlLCB3ZSdyZSBnb2luZyB0byBzdGFydCBhIHRvdGFsbHkgbmV3IHJlcG9zaXRvcnkgZnJvbQorc2NyYXRjaCwgd2l0aCBubyBwcmUtZXhpc3RpbmcgZmlsZXMsIGFuZCB3ZSdsbCBjYWxsIGl0IGBnaXQtdHV0b3JpYWxgLgorVG8gc3RhcnQgdXAsIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBmb3IgaXQsIGNoYW5nZSBpbnRvIHRoYXQKK3N1YmRpcmVjdG9yeSwgYW5kIGluaXRpYWxpemUgdGhlIGdpdCBpbmZyYXN0cnVjdHVyZSB3aXRoIGBnaXQtaW5pdGA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciBnaXQtdHV0b3JpYWwKKyQgY2QgZ2l0LXR1dG9yaWFsCiskIGdpdC1pbml0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gd2hpY2ggZ2l0IHdpbGwgcmVwbHkKKworLS0tLS0tLS0tLS0tLS0tLQorSW5pdGlhbGl6ZWQgZW1wdHkgR2l0IHJlcG9zaXRvcnkgaW4gLmdpdC8KKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggaXMganVzdCBnaXQncyB3YXkgb2Ygc2F5aW5nIHRoYXQgeW91IGhhdmVuJ3QgYmVlbiBkb2luZyBhbnl0aGluZworc3RyYW5nZSwgYW5kIHRoYXQgaXQgd2lsbCBoYXZlIGNyZWF0ZWQgYSBsb2NhbCBgLmdpdGAgZGlyZWN0b3J5IHNldHVwIGZvcgoreW91ciBuZXcgcHJvamVjdC4gWW91IHdpbGwgbm93IGhhdmUgYSBgLmdpdGAgZGlyZWN0b3J5LCBhbmQgeW91IGNhbgoraW5zcGVjdCB0aGF0IHdpdGggYGxzYC4gRm9yIHlvdXIgbmV3IGVtcHR5IHByb2plY3QsIGl0IHNob3VsZCBzaG93IHlvdQordGhyZWUgZW50cmllcywgYW1vbmcgb3RoZXIgdGhpbmdzOgorCisgLSBhIGZpbGUgY2FsbGVkIGBIRUFEYCwgdGhhdCBoYXMgYHJlZjogcmVmcy9oZWFkcy9tYXN0ZXJgIGluIGl0LgorICAgVGhpcyBpcyBzaW1pbGFyIHRvIGEgc3ltYm9saWMgbGluayBhbmQgcG9pbnRzIGF0CisgICBgcmVmcy9oZWFkcy9tYXN0ZXJgIHJlbGF0aXZlIHRvIHRoZSBgSEVBRGAgZmlsZS4KKysKK0Rvbid0IHdvcnJ5IGFib3V0IHRoZSBmYWN0IHRoYXQgdGhlIGZpbGUgdGhhdCB0aGUgYEhFQURgIGxpbmsgcG9pbnRzIHRvCitkb2Vzbid0IGV2ZW4gZXhpc3QgeWV0IC0tIHlvdSBoYXZlbid0IGNyZWF0ZWQgdGhlIGNvbW1pdCB0aGF0IHdpbGwKK3N0YXJ0IHlvdXIgYEhFQURgIGRldmVsb3BtZW50IGJyYW5jaCB5ZXQuCisKKyAtIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCBgb2JqZWN0c2AsIHdoaWNoIHdpbGwgY29udGFpbiBhbGwgdGhlCisgICBvYmplY3RzIG9mIHlvdXIgcHJvamVjdC4gWW91IHNob3VsZCBuZXZlciBoYXZlIGFueSByZWFsIHJlYXNvbiB0bworICAgbG9vayBhdCB0aGUgb2JqZWN0cyBkaXJlY3RseSwgYnV0IHlvdSBtaWdodCB3YW50IHRvIGtub3cgdGhhdCB0aGVzZQorICAgb2JqZWN0cyBhcmUgd2hhdCBjb250YWlucyBhbGwgdGhlIHJlYWwgJ2RhdGEnIGluIHlvdXIgcmVwb3NpdG9yeS4KKworIC0gYSBzdWJkaXJlY3RvcnkgY2FsbGVkIGByZWZzYCwgd2hpY2ggY29udGFpbnMgcmVmZXJlbmNlcyB0byBvYmplY3RzLgorCitJbiBwYXJ0aWN1bGFyLCB0aGUgYHJlZnNgIHN1YmRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gdHdvIG90aGVyCitzdWJkaXJlY3RvcmllcywgbmFtZWQgYGhlYWRzYCBhbmQgYHRhZ3NgIHJlc3BlY3RpdmVseS4gVGhleSBkbworZXhhY3RseSB3aGF0IHRoZWlyIG5hbWVzIGltcGx5OiB0aGV5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBhbnkgbnVtYmVyCitvZiBkaWZmZXJlbnQgJ2hlYWRzJyBvZiBkZXZlbG9wbWVudCAoYWthICdicmFuY2hlcycpLCBhbmQgdG8gYW55CisndGFncycgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIHRvIG5hbWUgc3BlY2lmaWMgdmVyc2lvbnMgaW4geW91cgorcmVwb3NpdG9yeS4KKworT25lIG5vdGU6IHRoZSBzcGVjaWFsIGBtYXN0ZXJgIGhlYWQgaXMgdGhlIGRlZmF1bHQgYnJhbmNoLCB3aGljaCBpcword2h5IHRoZSBgLmdpdC9IRUFEYCBmaWxlIHdhcyBjcmVhdGVkIHBvaW50cyB0byBpdCBldmVuIGlmIGl0Citkb2Vzbid0IHlldCBleGlzdC4gQmFzaWNhbGx5LCB0aGUgYEhFQURgIGxpbmsgaXMgc3VwcG9zZWQgdG8gYWx3YXlzCitwb2ludCB0byB0aGUgYnJhbmNoIHlvdSBhcmUgd29ya2luZyBvbiByaWdodCBub3csIGFuZCB5b3UgYWx3YXlzCitzdGFydCBvdXQgZXhwZWN0aW5nIHRvIHdvcmsgb24gdGhlIGBtYXN0ZXJgIGJyYW5jaC4KKworSG93ZXZlciwgdGhpcyBpcyBvbmx5IGEgY29udmVudGlvbiwgYW5kIHlvdSBjYW4gbmFtZSB5b3VyIGJyYW5jaGVzCithbnl0aGluZyB5b3Ugd2FudCwgYW5kIGRvbid0IGhhdmUgdG8gZXZlciBldmVuICdoYXZlJyBhIGBtYXN0ZXJgCiticmFuY2guIEEgbnVtYmVyIG9mIHRoZSBnaXQgdG9vbHMgd2lsbCBhc3N1bWUgdGhhdCBgLmdpdC9IRUFEYCBpcwordmFsaWQsIHRob3VnaC4KKworW05PVEVdCitBbiAnb2JqZWN0JyBpcyBpZGVudGlmaWVkIGJ5IGl0cyAxNjAtYml0IFNIQTEgaGFzaCwgYWthICdvYmplY3QgbmFtZScsCithbmQgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGlzIGFsd2F5cyB0aGUgNDAtYnl0ZSBoZXgKK3JlcHJlc2VudGF0aW9uIG9mIHRoYXQgU0hBMSBuYW1lLiBUaGUgZmlsZXMgaW4gdGhlIGByZWZzYAorc3ViZGlyZWN0b3J5IGFyZSBleHBlY3RlZCB0byBjb250YWluIHRoZXNlIGhleCByZWZlcmVuY2VzCisodXN1YWxseSB3aXRoIGEgZmluYWwgYFwnXG5cJ2AgYXQgdGhlIGVuZCksIGFuZCB5b3Ugc2hvdWxkIHRodXMKK2V4cGVjdCB0byBzZWUgYSBudW1iZXIgb2YgNDEtYnl0ZSBmaWxlcyBjb250YWluaW5nIHRoZXNlCityZWZlcmVuY2VzIGluIHRoZXNlIGByZWZzYCBzdWJkaXJlY3RvcmllcyB3aGVuIHlvdSBhY3R1YWxseSBzdGFydAorcG9wdWxhdGluZyB5b3VyIHRyZWUuCisKK1tOT1RFXQorQW4gYWR2YW5jZWQgdXNlciBtYXkgd2FudCB0byB0YWtlIGEgbG9vayBhdCB0aGUKK2xpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5IGxheW91dF0gZG9jdW1lbnQKK2FmdGVyIGZpbmlzaGluZyB0aGlzIHR1dG9yaWFsLgorCitZb3UgaGF2ZSBub3cgY3JlYXRlZCB5b3VyIGZpcnN0IGdpdCByZXBvc2l0b3J5LiBPZiBjb3Vyc2UsIHNpbmNlIGl0J3MKK2VtcHR5LCB0aGF0J3Mgbm90IHZlcnkgdXNlZnVsLCBzbyBsZXQncyBzdGFydCBwb3B1bGF0aW5nIGl0IHdpdGggZGF0YS4KKworCitQb3B1bGF0aW5nIGEgZ2l0IHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSdsbCBrZWVwIHRoaXMgc2ltcGxlIGFuZCBzdHVwaWQsIHNvIHdlJ2xsIHN0YXJ0IG9mZiB3aXRoIHBvcHVsYXRpbmcgYQorZmV3IHRyaXZpYWwgZmlsZXMganVzdCB0byBnZXQgYSBmZWVsIGZvciBpdC4KKworU3RhcnQgb2ZmIHdpdGgganVzdCBjcmVhdGluZyBhbnkgcmFuZG9tIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gbWFpbnRhaW4KK2luIHlvdXIgZ2l0IHJlcG9zaXRvcnkuIFdlJ2xsIHN0YXJ0IG9mZiB3aXRoIGEgZmV3IGJhZCBleGFtcGxlcywganVzdCB0bworZ2V0IGEgZmVlbCBmb3IgaG93IHRoaXMgd29ya3M6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICJIZWxsbyBXb3JsZCIgPmhlbGxvCiskIGVjaG8gIlNpbGx5IGV4YW1wbGUiID5leGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeW91IGhhdmUgbm93IGNyZWF0ZWQgdHdvIGZpbGVzIGluIHlvdXIgd29ya2luZyB0cmVlIChha2EgJ3dvcmtpbmcgZGlyZWN0b3J5JyksCitidXQgdG8gYWN0dWFsbHkgY2hlY2sgaW4geW91ciBoYXJkIHdvcmssIHlvdSB3aWxsIGhhdmUgdG8gZ28gdGhyb3VnaCB0d28gc3RlcHM6CisKKyAtIGZpbGwgaW4gdGhlICdpbmRleCcgZmlsZSAoYWthICdjYWNoZScpIHdpdGggdGhlIGluZm9ybWF0aW9uIGFib3V0IHlvdXIKKyAgIHdvcmtpbmcgdHJlZSBzdGF0ZS4KKworIC0gY29tbWl0IHRoYXQgaW5kZXggZmlsZSBhcyBhbiBvYmplY3QuCisKK1RoZSBmaXJzdCBzdGVwIGlzIHRyaXZpYWw6IHdoZW4geW91IHdhbnQgdG8gdGVsbCBnaXQgYWJvdXQgYW55IGNoYW5nZXMKK3RvIHlvdXIgd29ya2luZyB0cmVlLCB5b3UgdXNlIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAgcHJvZ3JhbS4gVGhhdAorcHJvZ3JhbSBub3JtYWxseSBqdXN0IHRha2VzIGEgbGlzdCBvZiBmaWxlbmFtZXMgeW91IHdhbnQgdG8gdXBkYXRlLCBidXQKK3RvIGF2b2lkIHRyaXZpYWwgbWlzdGFrZXMsIGl0IHJlZnVzZXMgdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBpbmRleAorKG9yIHJlbW92ZSBleGlzdGluZyBvbmVzKSB1bmxlc3MgeW91IGV4cGxpY2l0bHkgdGVsbCBpdCB0aGF0IHlvdSdyZQorYWRkaW5nIGEgbmV3IGVudHJ5IHdpdGggdGhlIGBcLS1hZGRgIGZsYWcgKG9yIHJlbW92aW5nIGFuIGVudHJ5IHdpdGggdGhlCitgXC0tcmVtb3ZlYCkgZmxhZy4KKworU28gdG8gcG9wdWxhdGUgdGhlIGluZGV4IHdpdGggdGhlIHR3byBmaWxlcyB5b3UganVzdCBjcmVhdGVkLCB5b3UgY2FuIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGhlbGxvIGV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91IGhhdmUgbm93IHRvbGQgZ2l0IHRvIHRyYWNrIHRob3NlIHR3byBmaWxlcy4KKworSW4gZmFjdCwgYXMgeW91IGRpZCB0aGF0LCBpZiB5b3Ugbm93IGxvb2sgaW50byB5b3VyIG9iamVjdCBkaXJlY3RvcnksCit5b3UnbGwgbm90aWNlIHRoYXQgZ2l0IHdpbGwgaGF2ZSBhZGRlZCB0d28gbmV3IG9iamVjdHMgdG8gdGhlIG9iamVjdAorZGF0YWJhc2UuIElmIHlvdSBkaWQgZXhhY3RseSB0aGUgc3RlcHMgYWJvdmUsIHlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8KKworCistLS0tLS0tLS0tLS0tLS0tCiskIGxzIC5naXQvb2JqZWN0cy8/Py8qCistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBzZWUgdHdvIGZpbGVzOgorCistLS0tLS0tLS0tLS0tLS0tCisuZ2l0L29iamVjdHMvNTUvN2RiMDNkZTk5N2M4NmE0YTAyOGUxZWJkM2ExY2ViMjI1YmUyMzggCisuZ2l0L29iamVjdHMvZjIvNGM3NGEyZTUwMGY1ZWUxMzMyYzg2Yjk0MTk5ZjUyYjFkMWQ5NjIKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggY29ycmVzcG9uZCB3aXRoIHRoZSBvYmplY3RzIHdpdGggbmFtZXMgb2YgYDU1N2RiLi4uYCBhbmQKK2BmMjRjNy4uLmAgcmVzcGVjdGl2ZWx5LgorCitJZiB5b3Ugd2FudCB0bywgeW91IGNhbiB1c2UgYGdpdC1jYXQtZmlsZWAgdG8gbG9vayBhdCB0aG9zZSBvYmplY3RzLCBidXQKK3lvdSdsbCBoYXZlIHRvIHVzZSB0aGUgb2JqZWN0IG5hbWUsIG5vdCB0aGUgZmlsZW5hbWUgb2YgdGhlIG9iamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgLXQgNTU3ZGIwM2RlOTk3Yzg2YTRhMDI4ZTFlYmQzYTFjZWIyMjViZTIzOAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGVyZSB0aGUgYC10YCB0ZWxscyBgZ2l0LWNhdC1maWxlYCB0byB0ZWxsIHlvdSB3aGF0IHRoZSAidHlwZSIgb2YgdGhlCitvYmplY3QgaXMuIGdpdCB3aWxsIHRlbGwgeW91IHRoYXQgeW91IGhhdmUgYSAiYmxvYiIgb2JqZWN0IChpLmUuLCBqdXN0IGEKK3JlZ3VsYXIgZmlsZSksIGFuZCB5b3UgY2FuIHNlZSB0aGUgY29udGVudHMgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSAiYmxvYiIgNTU3ZGIwMworLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHByaW50IG91dCAiSGVsbG8gV29ybGQiLiBUaGUgb2JqZWN0IGA1NTdkYjAzYCBpcyBub3RoaW5nCittb3JlIHRoYW4gdGhlIGNvbnRlbnRzIG9mIHlvdXIgZmlsZSBgaGVsbG9gLgorCitbTk9URV0KK0Rvbid0IGNvbmZ1c2UgdGhhdCBvYmplY3Qgd2l0aCB0aGUgZmlsZSBgaGVsbG9gIGl0c2VsZi4gVGhlCitvYmplY3QgaXMgbGl0ZXJhbGx5IGp1c3QgdGhvc2Ugc3BlY2lmaWMgKmNvbnRlbnRzKiBvZiB0aGUgZmlsZSwgYW5kCitob3dldmVyIG11Y2ggeW91IGxhdGVyIGNoYW5nZSB0aGUgY29udGVudHMgaW4gZmlsZSBgaGVsbG9gLCB0aGUgb2JqZWN0Cit3ZSBqdXN0IGxvb2tlZCBhdCB3aWxsIG5ldmVyIGNoYW5nZS4gT2JqZWN0cyBhcmUgaW1tdXRhYmxlLgorCitbTk9URV0KK1RoZSBzZWNvbmQgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhhdCB5b3UgY2FuCithYmJyZXZpYXRlIHRoZSBvYmplY3QgbmFtZSB0byBvbmx5IHRoZSBmaXJzdCBzZXZlcmFsCitoZXhhZGVjaW1hbCBkaWdpdHMgaW4gbW9zdCBwbGFjZXMuCisKK0FueXdheSwgYXMgd2UgbWVudGlvbmVkIHByZXZpb3VzbHksIHlvdSBub3JtYWxseSBuZXZlciBhY3R1YWxseSB0YWtlIGEKK2xvb2sgYXQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcywgYW5kIHR5cGluZyBsb25nIDQwLWNoYXJhY3RlciBoZXgKK25hbWVzIGlzIG5vdCBzb21ldGhpbmcgeW91J2Qgbm9ybWFsbHkgd2FudCB0byBkby4gVGhlIGFib3ZlIGRpZ3Jlc3Npb24KK3dhcyBqdXN0IHRvIHNob3cgdGhhdCBgZ2l0LXVwZGF0ZS1pbmRleGAgZGlkIHNvbWV0aGluZyBtYWdpY2FsLCBhbmQKK2FjdHVhbGx5IHNhdmVkIGF3YXkgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZmlsZXMgaW50byB0aGUgZ2l0IG9iamVjdAorZGF0YWJhc2UuCisKK1VwZGF0aW5nIHRoZSBpbmRleCBkaWQgc29tZXRoaW5nIGVsc2UgdG9vOiBpdCBjcmVhdGVkIGEgYC5naXQvaW5kZXhgCitmaWxlLiBUaGlzIGlzIHRoZSBpbmRleCB0aGF0IGRlc2NyaWJlcyB5b3VyIGN1cnJlbnQgd29ya2luZyB0cmVlLCBhbmQKK3NvbWV0aGluZyB5b3Ugc2hvdWxkIGJlIHZlcnkgYXdhcmUgb2YuIEFnYWluLCB5b3Ugbm9ybWFsbHkgbmV2ZXIgd29ycnkKK2Fib3V0IHRoZSBpbmRleCBmaWxlIGl0c2VsZiwgYnV0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdAoreW91IGhhdmUgbm90IGFjdHVhbGx5IHJlYWxseSAiY2hlY2tlZCBpbiIgeW91ciBmaWxlcyBpbnRvIGdpdCBzbyBmYXIsCit5b3UndmUgb25seSAqdG9sZCogZ2l0IGFib3V0IHRoZW0uCisKK0hvd2V2ZXIsIHNpbmNlIGdpdCBrbm93cyBhYm91dCB0aGVtLCB5b3UgY2FuIG5vdyBzdGFydCB1c2luZyBzb21lIG9mIHRoZQorbW9zdCBiYXNpYyBnaXQgY29tbWFuZHMgdG8gbWFuaXB1bGF0ZSB0aGUgZmlsZXMgb3IgbG9vayBhdCB0aGVpciBzdGF0dXMuIAorCitJbiBwYXJ0aWN1bGFyLCBsZXQncyBub3QgZXZlbiBjaGVjayBpbiB0aGUgdHdvIGZpbGVzIGludG8gZ2l0IHlldCwgd2UnbGwKK3N0YXJ0IG9mZiBieSBhZGRpbmcgYW5vdGhlciBsaW5lIHRvIGBoZWxsb2AgZmlyc3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICJJdCdzIGEgbmV3IGRheSBmb3IgZ2l0IiA+PmhlbGxvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSBjYW4gbm93LCBzaW5jZSB5b3UgdG9sZCBnaXQgYWJvdXQgdGhlIHByZXZpb3VzIHN0YXRlIG9mIGBoZWxsb2AsIGFzaworZ2l0IHdoYXQgaGFzIGNoYW5nZWQgaW4gdGhlIHRyZWUgY29tcGFyZWQgdG8geW91ciBvbGQgaW5kZXgsIHVzaW5nIHRoZQorYGdpdC1kaWZmLWZpbGVzYCBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtZmlsZXMKKy0tLS0tLS0tLS0tLQorCitPb3BzLiBUaGF0IHdhc24ndCB2ZXJ5IHJlYWRhYmxlLiBJdCBqdXN0IHNwaXQgb3V0IGl0cyBvd24gaW50ZXJuYWwKK3ZlcnNpb24gb2YgYSBgZGlmZmAsIGJ1dCB0aGF0IGludGVybmFsIHZlcnNpb24gcmVhbGx5IGp1c3QgdGVsbHMgeW91Cit0aGF0IGl0IGhhcyBub3RpY2VkIHRoYXQgImhlbGxvIiBoYXMgYmVlbiBtb2RpZmllZCwgYW5kIHRoYXQgdGhlIG9sZCBvYmplY3QKK2NvbnRlbnRzIGl0IGhhZCBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgZWxzZS4KKworVG8gbWFrZSBpdCByZWFkYWJsZSwgd2UgY2FuIHRlbGwgZ2l0LWRpZmYtZmlsZXMgdG8gb3V0cHV0IHRoZQorZGlmZmVyZW5jZXMgYXMgYSBwYXRjaCwgdXNpbmcgdGhlIGAtcGAgZmxhZzoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLWZpbGVzIC1wCitkaWZmIC0tZ2l0IGEvaGVsbG8gYi9oZWxsbworaW5kZXggNTU3ZGIwMy4uMjYzNDE0ZiAxMDA2NDQKKy0tLSBhL2hlbGxvCisrKysgYi9oZWxsbworQEAgLTEgKzEsMiBAQAorIEhlbGxvIFdvcmxkCisrSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorLS0tLQorCitpLmUuIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2Ugd2UgY2F1c2VkIGJ5IGFkZGluZyBhbm90aGVyIGxpbmUgdG8gYGhlbGxvYC4KKworSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZi1maWxlc2AgYWx3YXlzIHNob3dzIHVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KK3doYXQgaXMgcmVjb3JkZWQgaW4gdGhlIGluZGV4LCBhbmQgd2hhdCBpcyBjdXJyZW50bHkgaW4gdGhlIHdvcmtpbmcKK3RyZWUuIFRoYXQncyB2ZXJ5IHVzZWZ1bC4KKworQSBjb21tb24gc2hvcnRoYW5kIGZvciBgZ2l0LWRpZmYtZmlsZXMgLXBgIGlzIHRvIGp1c3Qgd3JpdGUgYGdpdAorZGlmZmAsIHdoaWNoIHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorZGlmZiAtLWdpdCBhL2hlbGxvIGIvaGVsbG8KK2luZGV4IDU1N2RiMDMuLjI2MzQxNGYgMTAwNjQ0CistLS0gYS9oZWxsbworKysrIGIvaGVsbG8KK0BAIC0xICsxLDIgQEAKKyBIZWxsbyBXb3JsZAorK0l0J3MgYSBuZXcgZGF5IGZvciBnaXQKKy0tLS0tLS0tLS0tLQorCisKK0NvbW1pdHRpbmcgZ2l0IHN0YXRlCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3csIHdlIHdhbnQgdG8gZ28gdG8gdGhlIG5leHQgc3RhZ2UgaW4gZ2l0LCB3aGljaCBpcyB0byB0YWtlIHRoZSBmaWxlcwordGhhdCBnaXQga25vd3MgYWJvdXQgaW4gdGhlIGluZGV4LCBhbmQgY29tbWl0IHRoZW0gYXMgYSByZWFsIHRyZWUuIFdlIGRvCit0aGF0IGluIHR3byBwaGFzZXM6IGNyZWF0aW5nIGEgJ3RyZWUnIG9iamVjdCwgYW5kIGNvbW1pdHRpbmcgdGhhdCAndHJlZScKK29iamVjdCBhcyBhICdjb21taXQnIG9iamVjdCB0b2dldGhlciB3aXRoIGFuIGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhlCit0cmVlIHdhcyBhbGwgYWJvdXQsIGFsb25nIHdpdGggaW5mb3JtYXRpb24gb2YgaG93IHdlIGNhbWUgdG8gdGhhdCBzdGF0ZS4KKworQ3JlYXRpbmcgYSB0cmVlIG9iamVjdCBpcyB0cml2aWFsLCBhbmQgaXMgZG9uZSB3aXRoIGBnaXQtd3JpdGUtdHJlZWAuCitUaGVyZSBhcmUgbm8gb3B0aW9ucyBvciBvdGhlciBpbnB1dDogZ2l0LXdyaXRlLXRyZWUgd2lsbCB0YWtlIHRoZQorY3VycmVudCBpbmRleCBzdGF0ZSwgYW5kIHdyaXRlIGFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGF0IHdob2xlCitpbmRleC4gSW4gb3RoZXIgd29yZHMsIHdlJ3JlIG5vdyB0eWluZyB0b2dldGhlciBhbGwgdGhlIGRpZmZlcmVudAorZmlsZW5hbWVzIHdpdGggdGhlaXIgY29udGVudHMgKGFuZCB0aGVpciBwZXJtaXNzaW9ucyksIGFuZCB3ZSdyZQorY3JlYXRpbmcgdGhlIGVxdWl2YWxlbnQgb2YgYSBnaXQgImRpcmVjdG9yeSIgb2JqZWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXdyaXRlLXRyZWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhpcyB3aWxsIGp1c3Qgb3V0cHV0IHRoZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgdHJlZSwgaW4gdGhpcyBjYXNlCisoaWYgeW91IGhhdmUgZG9uZSBleGFjdGx5IGFzIEkndmUgZGVzY3JpYmVkKSBpdCBzaG91bGQgYmUKKworLS0tLS0tLS0tLS0tLS0tLQorODk4OGRhMTVkMDc3ZDQ4MjlmYzUxZDg1NDRjMDk3ZGVmNjY0NGRiYgorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBpcyBhbm90aGVyIGluY29tcHJlaGVuc2libGUgb2JqZWN0IG5hbWUuIEFnYWluLCBpZiB5b3Ugd2FudCB0bywKK3lvdSBjYW4gdXNlIGBnaXQtY2F0LWZpbGUgLXQgODk4OGRcLi4uYCB0byBzZWUgdGhhdCB0aGlzIHRpbWUgdGhlIG9iamVjdAoraXMgbm90IGEgImJsb2IiIG9iamVjdCwgYnV0IGEgInRyZWUiIG9iamVjdCAoeW91IGNhbiBhbHNvIHVzZQorYGdpdC1jYXQtZmlsZWAgdG8gYWN0dWFsbHkgb3V0cHV0IHRoZSByYXcgb2JqZWN0IGNvbnRlbnRzLCBidXQgeW91J2xsIHNlZQorbWFpbmx5IGEgYmluYXJ5IG1lc3MsIHNvIHRoYXQncyBsZXNzIGludGVyZXN0aW5nKS4KKworSG93ZXZlciAtLSBub3JtYWxseSB5b3UnZCBuZXZlciB1c2UgYGdpdC13cml0ZS10cmVlYCBvbiBpdHMgb3duLCBiZWNhdXNlCitub3JtYWxseSB5b3UgYWx3YXlzIGNvbW1pdCBhIHRyZWUgaW50byBhIGNvbW1pdCBvYmplY3QgdXNpbmcgdGhlCitgZ2l0LWNvbW1pdC10cmVlYCBjb21tYW5kLiBJbiBmYWN0LCBpdCdzIGVhc2llciB0byBub3QgYWN0dWFsbHkgdXNlCitgZ2l0LXdyaXRlLXRyZWVgIG9uIGl0cyBvd24gYXQgYWxsLCBidXQgdG8ganVzdCBwYXNzIGl0cyByZXN1bHQgaW4gYXMgYW4KK2FyZ3VtZW50IHRvIGBnaXQtY29tbWl0LXRyZWVgLgorCitgZ2l0LWNvbW1pdC10cmVlYCBub3JtYWxseSB0YWtlcyBzZXZlcmFsIGFyZ3VtZW50cyAtLSBpdCB3YW50cyB0byBrbm93Cit3aGF0IHRoZSAncGFyZW50JyBvZiBhIGNvbW1pdCB3YXMsIGJ1dCBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBjb21taXQKK2V2ZXIgaW4gdGhpcyBuZXcgcmVwb3NpdG9yeSwgYW5kIGl0IGhhcyBubyBwYXJlbnRzLCB3ZSBvbmx5IG5lZWQgdG8gcGFzcyBpbgordGhlIG9iamVjdCBuYW1lIG9mIHRoZSB0cmVlLiBIb3dldmVyLCBgZ2l0LWNvbW1pdC10cmVlYCBhbHNvIHdhbnRzIHRvIGdldCBhCitjb21taXQgbWVzc2FnZSBvbiBpdHMgc3RhbmRhcmQgaW5wdXQsIGFuZCBpdCB3aWxsIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nCitvYmplY3QgbmFtZSBmb3IgdGhlIGNvbW1pdCB0byBpdHMgc3RhbmRhcmQgb3V0cHV0LgorCitBbmQgdGhpcyBpcyB3aGVyZSB3ZSBjcmVhdGUgdGhlIGAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyYCBmaWxlCit3aGljaCBpcyBwb2ludGVkIGF0IGJ5IGBIRUFEYC4gVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4KK3RoZSByZWZlcmVuY2UgdG8gdGhlIHRvcC1vZi10cmVlIG9mIHRoZSBtYXN0ZXIgYnJhbmNoLCBhbmQgc2luY2UKK3RoYXQncyBleGFjdGx5IHdoYXQgYGdpdC1jb21taXQtdHJlZWAgc3BpdHMgb3V0LCB3ZSBjYW4gZG8gdGhpcworYWxsIHdpdGggYSBzZXF1ZW5jZSBvZiBzaW1wbGUgc2hlbGwgY29tbWFuZHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpCiskIGNvbW1pdD0kKGVjaG8gJ0luaXRpYWwgY29tbWl0JyB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSkKKyQgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhpcyBjYXNlIHRoaXMgY3JlYXRlcyBhIHRvdGFsbHkgbmV3IGNvbW1pdCB0aGF0IGlzIG5vdCByZWxhdGVkIHRvCithbnl0aGluZyBlbHNlLiBOb3JtYWxseSB5b3UgZG8gdGhpcyBvbmx5ICpvbmNlKiBmb3IgYSBwcm9qZWN0IGV2ZXIsIGFuZAorYWxsIGxhdGVyIGNvbW1pdHMgd2lsbCBiZSBwYXJlbnRlZCBvbiB0b3Agb2YgYW4gZWFybGllciBjb21taXQuCisKK0FnYWluLCBub3JtYWxseSB5b3UnZCBuZXZlciBhY3R1YWxseSBkbyB0aGlzIGJ5IGhhbmQuIFRoZXJlIGlzIGEKK2hlbHBmdWwgc2NyaXB0IGNhbGxlZCBgZ2l0IGNvbW1pdGAgdGhhdCB3aWxsIGRvIGFsbCBvZiB0aGlzIGZvciB5b3UuIFNvCit5b3UgY291bGQgaGF2ZSBqdXN0IHdyaXR0ZW4gYGdpdCBjb21taXRgCitpbnN0ZWFkLCBhbmQgaXQgd291bGQgaGF2ZSBkb25lIHRoZSBhYm92ZSBtYWdpYyBzY3JpcHRpbmcgZm9yIHlvdS4KKworCitNYWtpbmcgYSBjaGFuZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitSZW1lbWJlciBob3cgd2UgZGlkIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAgb24gZmlsZSBgaGVsbG9gIGFuZCB0aGVuIHdlCitjaGFuZ2VkIGBoZWxsb2AgYWZ0ZXJ3YXJkLCBhbmQgY291bGQgY29tcGFyZSB0aGUgbmV3IHN0YXRlIG9mIGBoZWxsb2Agd2l0aCB0aGUKK3N0YXRlIHdlIHNhdmVkIGluIHRoZSBpbmRleCBmaWxlPyAKKworRnVydGhlciwgcmVtZW1iZXIgaG93IEkgc2FpZCB0aGF0IGBnaXQtd3JpdGUtdHJlZWAgd3JpdGVzIHRoZSBjb250ZW50cworb2YgdGhlICppbmRleCogZmlsZSB0byB0aGUgdHJlZSwgYW5kIHRodXMgd2hhdCB3ZSBqdXN0IGNvbW1pdHRlZCB3YXMgaW4KK2ZhY3QgdGhlICpvcmlnaW5hbCogY29udGVudHMgb2YgdGhlIGZpbGUgYGhlbGxvYCwgbm90IHRoZSBuZXcgb25lcy4gV2UgZGlkCit0aGF0IG9uIHB1cnBvc2UsIHRvIHNob3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5kZXggc3RhdGUsIGFuZCB0aGUKK3N0YXRlIGluIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBob3cgdGhleSBkb24ndCBoYXZlIHRvIG1hdGNoLCBldmVuCit3aGVuIHdlIGNvbW1pdCB0aGluZ3MuCisKK0FzIGJlZm9yZSwgaWYgd2UgZG8gYGdpdC1kaWZmLWZpbGVzIC1wYCBpbiBvdXIgZ2l0LXR1dG9yaWFsIHByb2plY3QsCit3ZSdsbCBzdGlsbCBzZWUgdGhlIHNhbWUgZGlmZmVyZW5jZSB3ZSBzYXcgbGFzdCB0aW1lOiB0aGUgaW5kZXggZmlsZQoraGFzbid0IGNoYW5nZWQgYnkgdGhlIGFjdCBvZiBjb21taXR0aW5nIGFueXRoaW5nLiBIb3dldmVyLCBub3cgdGhhdCB3ZQoraGF2ZSBjb21taXR0ZWQgc29tZXRoaW5nLCB3ZSBjYW4gYWxzbyBsZWFybiB0byB1c2UgYSBuZXcgY29tbWFuZDoKK2BnaXQtZGlmZi1pbmRleGAuCisKK1VubGlrZSBgZ2l0LWRpZmYtZmlsZXNgLCB3aGljaCBzaG93ZWQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5kZXgKK2ZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUsIGBnaXQtZGlmZi1pbmRleGAgc2hvd3MgdGhlIGRpZmZlcmVuY2VzCitiZXR3ZWVuIGEgY29tbWl0dGVkICp0cmVlKiBhbmQgZWl0aGVyIHRoZSBpbmRleCBmaWxlIG9yIHRoZSB3b3JraW5nCit0cmVlLiBJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWluZGV4YCB3YW50cyBhIHRyZWUgdG8gYmUgZGlmZmVkCithZ2FpbnN0LCBhbmQgYmVmb3JlIHdlIGRpZCB0aGUgY29tbWl0LCB3ZSBjb3VsZG4ndCBkbyB0aGF0LCBiZWNhdXNlIHdlCitkaWRuJ3QgaGF2ZSBhbnl0aGluZyB0byBkaWZmIGFnYWluc3QuIAorCitCdXQgbm93IHdlIGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLWluZGV4IC1wIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKworKHdoZXJlIGAtcGAgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaXQgZGlkIGluIGBnaXQtZGlmZi1maWxlc2ApLCBhbmQgaXQKK3dpbGwgc2hvdyB1cyB0aGUgc2FtZSBkaWZmZXJlbmNlLCBidXQgZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLiAKK05vdyB3ZSdyZSBjb21wYXJpbmcgdGhlIHdvcmtpbmcgdHJlZSBub3QgYWdhaW5zdCB0aGUgaW5kZXggZmlsZSwKK2J1dCBhZ2FpbnN0IHRoZSB0cmVlIHdlIGp1c3Qgd3JvdGUuIEl0IGp1c3Qgc28gaGFwcGVucyB0aGF0IHRob3NlIHR3bworYXJlIG9idmlvdXNseSB0aGUgc2FtZSwgc28gd2UgZ2V0IHRoZSBzYW1lIHJlc3VsdC4KKworQWdhaW4sIGJlY2F1c2UgdGhpcyBpcyBhIGNvbW1vbiBvcGVyYXRpb24sIHlvdSBjYW4gYWxzbyBqdXN0IHNob3J0aGFuZAoraXQgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggZW5kcyB1cCBkb2luZyB0aGUgYWJvdmUgZm9yIHlvdS4KKworSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZi1pbmRleGAgbm9ybWFsbHkgY29tcGFyZXMgYSB0cmVlIGFnYWluc3QgdGhlCit3b3JraW5nIHRyZWUsIGJ1dCB3aGVuIGdpdmVuIHRoZSBgXC0tY2FjaGVkYCBmbGFnLCBpdCBpcyB0b2xkIHRvCitpbnN0ZWFkIGNvbXBhcmUgYWdhaW5zdCBqdXN0IHRoZSBpbmRleCBjYWNoZSBjb250ZW50cywgYW5kIGlnbm9yZSB0aGUKK2N1cnJlbnQgd29ya2luZyB0cmVlIHN0YXRlIGVudGlyZWx5LiBTaW5jZSB3ZSBqdXN0IHdyb3RlIHRoZSBpbmRleAorZmlsZSB0byBIRUFELCBkb2luZyBgZ2l0LWRpZmYtaW5kZXggXC0tY2FjaGVkIC1wIEhFQURgIHNob3VsZCB0aHVzIHJldHVybgorYW4gZW1wdHkgc2V0IG9mIGRpZmZlcmVuY2VzLCBhbmQgdGhhdCdzIGV4YWN0bHkgd2hhdCBpdCBkb2VzLiAKKworW05PVEVdCis9PT09PT09PT09PT09PT09CitgZ2l0LWRpZmYtaW5kZXhgIHJlYWxseSBhbHdheXMgdXNlcyB0aGUgaW5kZXggZm9yIGl0cworY29tcGFyaXNvbnMsIGFuZCBzYXlpbmcgdGhhdCBpdCBjb21wYXJlcyBhIHRyZWUgYWdhaW5zdCB0aGUgd29ya2luZwordHJlZSBpcyB0aHVzIG5vdCBzdHJpY3RseSBhY2N1cmF0ZS4gSW4gcGFydGljdWxhciwgdGhlIGxpc3Qgb2YKK2ZpbGVzIHRvIGNvbXBhcmUgKHRoZSAibWV0YS1kYXRhIikgKmFsd2F5cyogY29tZXMgZnJvbSB0aGUgaW5kZXggZmlsZSwKK3JlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYFwtLWNhY2hlZGAgZmxhZyBpcyB1c2VkIG9yIG5vdC4gVGhlIGBcLS1jYWNoZWRgCitmbGFnIHJlYWxseSBvbmx5IGRldGVybWluZXMgd2hldGhlciB0aGUgZmlsZSAqY29udGVudHMqIHRvIGJlIGNvbXBhcmVkCitjb21lIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBvciBub3QuCisKK1RoaXMgaXMgbm90IGhhcmQgdG8gdW5kZXJzdGFuZCwgYXMgc29vbiBhcyB5b3UgcmVhbGl6ZSB0aGF0IGdpdCBzaW1wbHkKK25ldmVyIGtub3dzIChvciBjYXJlcykgYWJvdXQgZmlsZXMgdGhhdCBpdCBpcyBub3QgdG9sZCBhYm91dAorZXhwbGljaXRseS4gZ2l0IHdpbGwgbmV2ZXIgZ28gKmxvb2tpbmcqIGZvciBmaWxlcyB0byBjb21wYXJlLCBpdAorZXhwZWN0cyB5b3UgdG8gdGVsbCBpdCB3aGF0IHRoZSBmaWxlcyBhcmUsIGFuZCB0aGF0J3Mgd2hhdCB0aGUgaW5kZXgKK2lzIHRoZXJlIGZvci4KKz09PT09PT09PT09PT09PT0KKworSG93ZXZlciwgb3VyIG5leHQgc3RlcCBpcyB0byBjb21taXQgdGhlICpjaGFuZ2UqIHdlIGRpZCwgYW5kIGFnYWluLCB0bwordW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24sIGtlZXAgaW4gbWluZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJ3b3JraW5nCit0cmVlIGNvbnRlbnRzIiwgImluZGV4IGZpbGUiIGFuZCAiY29tbWl0dGVkIHRyZWUiLiBXZSBoYXZlIGNoYW5nZXMKK2luIHRoZSB3b3JraW5nIHRyZWUgdGhhdCB3ZSB3YW50IHRvIGNvbW1pdCwgYW5kIHdlIGFsd2F5cyBoYXZlIHRvCit3b3JrIHRocm91Z2ggdGhlIGluZGV4IGZpbGUsIHNvIHRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIHRvCit1cGRhdGUgdGhlIGluZGV4IGNhY2hlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCBoZWxsbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhub3RlIGhvdyB3ZSBkaWRuJ3QgbmVlZCB0aGUgYFwtLWFkZGAgZmxhZyB0aGlzIHRpbWUsIHNpbmNlIGdpdCBrbmV3CithYm91dCB0aGUgZmlsZSBhbHJlYWR5KS4KKworTm90ZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGRpZmZlcmVudCBgZ2l0LWRpZmYtXCpgIHZlcnNpb25zIGhlcmUuIEFmdGVyCit3ZSd2ZSB1cGRhdGVkIGBoZWxsb2AgaW4gdGhlIGluZGV4LCBgZ2l0LWRpZmYtZmlsZXMgLXBgIG5vdyBzaG93cyBubworZGlmZmVyZW5jZXMsIGJ1dCBgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRGAgc3RpbGwgKmRvZXMqIHNob3cgdGhhdCB0aGUKK2N1cnJlbnQgc3RhdGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHN0YXRlIHdlIGNvbW1pdHRlZC4gSW4gZmFjdCwgbm93CitgZ2l0LWRpZmYtaW5kZXhgIHNob3dzIHRoZSBzYW1lIGRpZmZlcmVuY2Ugd2hldGhlciB3ZSB1c2UgdGhlIGAtLWNhY2hlZGAKK2ZsYWcgb3Igbm90LCBzaW5jZSBub3cgdGhlIGluZGV4IGlzIGNvaGVyZW50IHdpdGggdGhlIHdvcmtpbmcgdHJlZS4KKworTm93LCBzaW5jZSB3ZSd2ZSB1cGRhdGVkIGBoZWxsb2AgaW4gdGhlIGluZGV4LCB3ZSBjYW4gY29tbWl0IHRoZSBuZXcKK3ZlcnNpb24uIFdlIGNvdWxkIGRvIGl0IGJ5IHdyaXRpbmcgdGhlIHRyZWUgYnkgaGFuZCBhZ2FpbiwgYW5kCitjb21taXR0aW5nIHRoZSB0cmVlICh0aGlzIHRpbWUgd2UnZCBoYXZlIHRvIHVzZSB0aGUgYC1wIEhFQURgIGZsYWcgdG8KK3RlbGwgY29tbWl0IHRoYXQgdGhlIEhFQUQgd2FzIHRoZSAqcGFyZW50KiBvZiB0aGUgbmV3IGNvbW1pdCwgYW5kIHRoYXQKK3RoaXMgd2Fzbid0IGFuIGluaXRpYWwgY29tbWl0IGFueSBtb3JlKSwgYnV0IHlvdSd2ZSBkb25lIHRoYXQgb25jZQorYWxyZWFkeSwgc28gbGV0J3MganVzdCB1c2UgdGhlIGhlbHBmdWwgc2NyaXB0IHRoaXMgdGltZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBzdGFydHMgYW4gZWRpdG9yIGZvciB5b3UgdG8gd3JpdGUgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0ZWxscyB5b3UKK2EgYml0IGFib3V0IHdoYXQgeW91IGhhdmUgZG9uZS4KKworV3JpdGUgd2hhdGV2ZXIgbWVzc2FnZSB5b3Ugd2FudCwgYW5kIGFsbCB0aGUgbGluZXMgdGhhdCBzdGFydCB3aXRoICcjJword2lsbCBiZSBwcnVuZWQgb3V0LCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZSBmb3IKK3RoZSBjaGFuZ2UuIElmIHlvdSBkZWNpZGUgeW91IGRvbid0IHdhbnQgdG8gY29tbWl0IGFueXRoaW5nIGFmdGVyIGFsbCBhdAordGhpcyBwb2ludCAoeW91IGNhbiBjb250aW51ZSB0byBlZGl0IHRoaW5ncyBhbmQgdXBkYXRlIHRoZSBpbmRleCksIHlvdQorY2FuIGp1c3QgbGVhdmUgYW4gZW1wdHkgbWVzc2FnZS4gT3RoZXJ3aXNlIGBnaXQgY29tbWl0YCB3aWxsIGNvbW1pdAordGhlIGNoYW5nZSBmb3IgeW91LgorCitZb3UndmUgbm93IG1hZGUgeW91ciBmaXJzdCByZWFsIGdpdCBjb21taXQuIEFuZCBpZiB5b3UncmUgaW50ZXJlc3RlZCBpbgorbG9va2luZyBhdCB3aGF0IGBnaXQgY29tbWl0YCByZWFsbHkgZG9lcywgZmVlbCBmcmVlIHRvIGludmVzdGlnYXRlOgoraXQncyBhIGZldyB2ZXJ5IHNpbXBsZSBzaGVsbCBzY3JpcHRzIHRvIGdlbmVyYXRlIHRoZSBoZWxwZnVsICg/KSBjb21taXQKK21lc3NhZ2UgaGVhZGVycywgYW5kIGEgZmV3IG9uZS1saW5lcnMgdGhhdCBhY3R1YWxseSBkbyB0aGUKK2NvbW1pdCBpdHNlbGYgKGBnaXQtY29tbWl0YCkuCisKKworSW5zcGVjdGluZyBDaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpbGUgY3JlYXRpbmcgY2hhbmdlcyBpcyB1c2VmdWwsIGl0J3MgZXZlbiBtb3JlIHVzZWZ1bCBpZiB5b3UgY2FuIHRlbGwKK2xhdGVyIHdoYXQgY2hhbmdlZC4gVGhlIG1vc3QgdXNlZnVsIGNvbW1hbmQgZm9yIHRoaXMgaXMgYW5vdGhlciBvZiB0aGUKK2BkaWZmYCBmYW1pbHksIG5hbWVseSBgZ2l0LWRpZmYtdHJlZWAuCisKK2BnaXQtZGlmZi10cmVlYCBjYW4gYmUgZ2l2ZW4gdHdvIGFyYml0cmFyeSB0cmVlcywgYW5kIGl0IHdpbGwgdGVsbCB5b3UgdGhlCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uIFBlcmhhcHMgZXZlbiBtb3JlIGNvbW1vbmx5LCB0aG91Z2gsIHlvdSBjYW4KK2dpdmUgaXQganVzdCBhIHNpbmdsZSBjb21taXQgb2JqZWN0LCBhbmQgaXQgd2lsbCBmaWd1cmUgb3V0IHRoZSBwYXJlbnQKK29mIHRoYXQgY29tbWl0IGl0c2VsZiwgYW5kIHNob3cgdGhlIGRpZmZlcmVuY2UgZGlyZWN0bHkuIFRodXMsIHRvIGdldAordGhlIHNhbWUgZGlmZiB0aGF0IHdlJ3ZlIGFscmVhZHkgc2VlbiBzZXZlcmFsIHRpbWVzLCB3ZSBjYW4gbm93IGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtdHJlZSAtcCBIRUFECistLS0tLS0tLS0tLS0tLS0tCisKKyhhZ2FpbiwgYC1wYCBtZWFucyB0byBzaG93IHRoZSBkaWZmZXJlbmNlIGFzIGEgaHVtYW4tcmVhZGFibGUgcGF0Y2gpLAorYW5kIGl0IHdpbGwgc2hvdyB3aGF0IHRoZSBsYXN0IGNvbW1pdCAoaW4gYEhFQURgKSBhY3R1YWxseSBjaGFuZ2VkLgorCitbTk9URV0KKz09PT09PT09PT09PQorSGVyZSBpcyBhbiBBU0NJSSBhcnQgYnkgSm9uIExvZWxpZ2VyIHRoYXQgaWxsdXN0cmF0ZXMgaG93Cit2YXJpb3VzIGRpZmYtXCogY29tbWFuZHMgY29tcGFyZSB0aGluZ3MuCisKKyAgICAgICAgICAgICAgICAgICAgICBkaWZmLXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgViAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCBPYmplY3QgREIgfAorICAgICAgICAgICAgICAgICAgICB8ICBCYWNraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgICBTdG9yZSAgIHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgIF4gICAgXgorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfCAgZGlmZi1pbmRleCAtLWNhY2hlZAorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgIGRpZmYtaW5kZXggIHwgICAgVgorICAgICAgICAgICAgICAgICAgICAgIHwgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICB8ICB8ICAgSW5kZXggICB8CisgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgImNhY2hlIiAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwgIGRpZmYtZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICBWICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8ICBXb3JraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgRGlyZWN0b3J5IHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworPT09PT09PT09PT09CisKK01vcmUgaW50ZXJlc3RpbmdseSwgeW91IGNhbiBhbHNvIGdpdmUgYGdpdC1kaWZmLXRyZWVgIHRoZSBgLS1wcmV0dHlgIGZsYWcsCit3aGljaCB0ZWxscyBpdCB0byBhbHNvIHNob3cgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCBhdXRob3IgYW5kIGRhdGUgb2YgdGhlCitjb21taXQsIGFuZCB5b3UgY2FuIHRlbGwgaXQgdG8gc2hvdyBhIHdob2xlIHNlcmllcyBvZiBkaWZmcy4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdGVsbCBpdCB0byBiZSAic2lsZW50IiwgYW5kIG5vdCBzaG93IHRoZSBkaWZmcyBhdAorYWxsLCBidXQganVzdCBzaG93IHRoZSBhY3R1YWwgY29tbWl0IG1lc3NhZ2UuCisKK0luIGZhY3QsIHRvZ2V0aGVyIHdpdGggdGhlIGBnaXQtcmV2LWxpc3RgIHByb2dyYW0gKHdoaWNoIGdlbmVyYXRlcyBhCitsaXN0IG9mIHJldmlzaW9ucyksIGBnaXQtZGlmZi10cmVlYCBlbmRzIHVwIGJlaW5nIGEgdmVyaXRhYmxlIGZvdW50IG9mCitjaGFuZ2VzLiBBIHRyaXZpYWwgKGJ1dCB2ZXJ5IHVzZWZ1bCkgc2NyaXB0IGNhbGxlZCBgZ2l0LXdoYXRjaGFuZ2VkYCBpcworaW5jbHVkZWQgd2l0aCBnaXQgd2hpY2ggZG9lcyBleGFjdGx5IHRoaXMsIGFuZCBzaG93cyBhIGxvZyBvZiByZWNlbnQKK2FjdGl2aXRpZXMuCisKK1RvIHNlZSB0aGUgd2hvbGUgaGlzdG9yeSBvZiBvdXIgcGl0aWZ1bCBsaXR0bGUgZ2l0LXR1dG9yaWFsIHByb2plY3QsIHlvdQorY2FuIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBzaG93cyBqdXN0IHRoZSBsb2cgbWVzc2FnZXMsIG9yIGlmIHdlIHdhbnQgdG8gc2VlIHRoZSBsb2cgdG9nZXRoZXIKK3dpdGggdGhlIGFzc29jaWF0ZWQgcGF0Y2hlcyB1c2UgdGhlIG1vcmUgY29tcGxleCAoYW5kIG11Y2ggbW9yZQorcG93ZXJmdWwpCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC0tcm9vdAorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91IHdpbGwgc2VlIGV4YWN0bHkgd2hhdCBoYXMgY2hhbmdlZCBpbiB0aGUgcmVwb3NpdG9yeSBvdmVyIGl0cworc2hvcnQgaGlzdG9yeS4gCisKK1tOT1RFXQorVGhlIGBcLS1yb290YCBmbGFnIGlzIGEgZmxhZyB0byBgZ2l0LWRpZmYtdHJlZWAgdG8gdGVsbCBpdCB0bworc2hvdyB0aGUgaW5pdGlhbCBha2EgJ3Jvb3QnIGNvbW1pdCB0b28uIE5vcm1hbGx5IHlvdSdkIHByb2JhYmx5IG5vdAord2FudCB0byBzZWUgdGhlIGluaXRpYWwgaW1wb3J0IGRpZmYsIGJ1dCBzaW5jZSB0aGUgdHV0b3JpYWwgcHJvamVjdAord2FzIHN0YXJ0ZWQgZnJvbSBzY3JhdGNoIGFuZCBpcyBzbyBzbWFsbCwgd2UgdXNlIGl0IHRvIG1ha2UgdGhlIHJlc3VsdAorYSBiaXQgbW9yZSBpbnRlcmVzdGluZy4KKworV2l0aCB0aGF0LCB5b3Ugc2hvdWxkIG5vdyBiZSBoYXZpbmcgc29tZSBpbmtsaW5nIG9mIHdoYXQgZ2l0IGRvZXMsIGFuZAorY2FuIGV4cGxvcmUgb24geW91ciBvd24uCisKK1tOT1RFXQorTW9zdCBsaWtlbHksIHlvdSBhcmUgbm90IGRpcmVjdGx5IHVzaW5nIHRoZSBjb3JlCitnaXQgUGx1bWJpbmcgY29tbWFuZHMsIGJ1dCB1c2luZyBQb3JjZWxhaW4gbGlrZSBDb2dpdG8gb24gdG9wCitvZiBpdC4gQ29naXRvIHdvcmtzIGEgYml0IGRpZmZlcmVudGx5IGFuZCB5b3UgdXN1YWxseSBkbyBub3QKK2hhdmUgdG8gcnVuIGBnaXQtdXBkYXRlLWluZGV4YCB5b3Vyc2VsZiBmb3IgY2hhbmdlZCBmaWxlcyAoeW91CitkbyB0ZWxsIHVuZGVybHlpbmcgZ2l0IGFib3V0IGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMgdmlhCitgY2ctYWRkYCBhbmQgYGNnLXJtYCBjb21tYW5kcykuIEp1c3QgYmVmb3JlIHlvdSBtYWtlIGEgY29tbWl0Cit3aXRoIGBjZy1jb21taXRgLCBDb2dpdG8gZmlndXJlcyBvdXQgd2hpY2ggZmlsZXMgeW91IG1vZGlmaWVkLAorYW5kIHJ1bnMgYGdpdC11cGRhdGUtaW5kZXhgIG9uIHRoZW0gZm9yIHlvdS4KKworCitUYWdnaW5nIGEgdmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gZ2l0LCB0aGVyZSBhcmUgdHdvIGtpbmRzIG9mIHRhZ3MsIGEgImxpZ2h0IiBvbmUsIGFuZCBhbiAiYW5ub3RhdGVkIHRhZyIuCisKK0EgImxpZ2h0IiB0YWcgaXMgdGVjaG5pY2FsbHkgbm90aGluZyBtb3JlIHRoYW4gYSBicmFuY2gsIGV4Y2VwdCB3ZSBwdXQKK2l0IGluIHRoZSBgLmdpdC9yZWZzL3RhZ3MvYCBzdWJkaXJlY3RvcnkgaW5zdGVhZCBvZiBjYWxsaW5nIGl0IGEgYGhlYWRgLgorU28gdGhlIHNpbXBsZXN0IGZvcm0gb2YgdGFnIGludm9sdmVzIG5vdGhpbmcgbW9yZSB0aGFuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIG15LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGp1c3Qgd3JpdGVzIHRoZSBjdXJyZW50IGBIRUFEYCBpbnRvIHRoZSBgLmdpdC9yZWZzL3RhZ3MvbXktZmlyc3QtdGFnYAorZmlsZSwgYWZ0ZXIgd2hpY2ggcG9pbnQgeW91IGNhbiB0aGVuIHVzZSB0aGlzIHN5bWJvbGljIG5hbWUgZm9yIHRoYXQKK3BhcnRpY3VsYXIgc3RhdGUuIFlvdSBjYW4sIGZvciBleGFtcGxlLCBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIG15LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tLS0tLQorCit0byBkaWZmIHlvdXIgY3VycmVudCBzdGF0ZSBhZ2FpbnN0IHRoYXQgdGFnICh3aGljaCBhdCB0aGlzIHBvaW50IHdpbGwKK29idmlvdXNseSBiZSBhbiBlbXB0eSBkaWZmLCBidXQgaWYgeW91IGNvbnRpbnVlIHRvIGRldmVsb3AgYW5kIGNvbW1pdAorc3R1ZmYsIHlvdSBjYW4gdXNlIHlvdXIgdGFnIGFzIGFuICJhbmNob3ItcG9pbnQiIHRvIHNlZSB3aGF0IGhhcyBjaGFuZ2VkCitzaW5jZSB5b3UgdGFnZ2VkIGl0LgorCitBbiAiYW5ub3RhdGVkIHRhZyIgaXMgYWN0dWFsbHkgYSByZWFsIGdpdCBvYmplY3QsIGFuZCBjb250YWlucyBub3Qgb25seSBhCitwb2ludGVyIHRvIHRoZSBzdGF0ZSB5b3Ugd2FudCB0byB0YWcsIGJ1dCBhbHNvIGEgc21hbGwgdGFnIG5hbWUgYW5kCittZXNzYWdlLCBhbG9uZyB3aXRoIG9wdGlvbmFsbHkgYSBQR1Agc2lnbmF0dXJlIHRoYXQgc2F5cyB0aGF0IHllcywKK3lvdSByZWFsbHkgZGlkCit0aGF0IHRhZy4gWW91IGNyZWF0ZSB0aGVzZSBhbm5vdGF0ZWQgdGFncyB3aXRoIGVpdGhlciB0aGUgYC1hYCBvcgorYC1zYCBmbGFnIHRvIGBnaXQgdGFnYDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIC1zIDx0YWduYW1lPgorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHNpZ24gdGhlIGN1cnJlbnQgYEhFQURgIChidXQgeW91IGNhbiBhbHNvIGdpdmUgaXQgYW5vdGhlcgorYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHRoaW5nIHRvIHRhZywgaS5lLiwgeW91IGNvdWxkIGhhdmUgdGFnZ2VkIHRoZQorY3VycmVudCBgbXlicmFuY2hgIHBvaW50IGJ5IHVzaW5nIGBnaXQgdGFnIDx0YWduYW1lPiBteWJyYW5jaGApLgorCitZb3Ugbm9ybWFsbHkgb25seSBkbyBzaWduZWQgdGFncyBmb3IgbWFqb3IgcmVsZWFzZXMgb3IgdGhpbmdzCitsaWtlIHRoYXQsIHdoaWxlIHRoZSBsaWdodC13ZWlnaHQgdGFncyBhcmUgdXNlZnVsIGZvciBhbnkgbWFya2luZyB5b3UKK3dhbnQgdG8gZG8gLS0gYW55IHRpbWUgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIHJlbWVtYmVyIGEgY2VydGFpbgorcG9pbnQsIGp1c3QgY3JlYXRlIGEgcHJpdmF0ZSB0YWcgZm9yIGl0LCBhbmQgeW91IGhhdmUgYSBuaWNlIHN5bWJvbGljCituYW1lIGZvciB0aGUgc3RhdGUgYXQgdGhhdCBwb2ludC4KKworCitDb3B5aW5nIHJlcG9zaXRvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0IHJlcG9zaXRvcmllcyBhcmUgbm9ybWFsbHkgdG90YWxseSBzZWxmLXN1ZmZpY2llbnQgYW5kIHJlbG9jYXRhYmxlLgorVW5saWtlIENWUywgZm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIHNlcGFyYXRlIG5vdGlvbiBvZgorInJlcG9zaXRvcnkiIGFuZCAid29ya2luZyB0cmVlIi4gQSBnaXQgcmVwb3NpdG9yeSBub3JtYWxseSAqaXMqIHRoZQord29ya2luZyB0cmVlLCB3aXRoIHRoZSBsb2NhbCBnaXQgaW5mb3JtYXRpb24gaGlkZGVuIGluIHRoZSBgLmdpdGAKK3N1YmRpcmVjdG9yeS4gVGhlcmUgaXMgbm90aGluZyBlbHNlLiBXaGF0IHlvdSBzZWUgaXMgd2hhdCB5b3UgZ290LgorCitbTk9URV0KK1lvdSBjYW4gdGVsbCBnaXQgdG8gc3BsaXQgdGhlIGdpdCBpbnRlcm5hbCBpbmZvcm1hdGlvbiBmcm9tCit0aGUgZGlyZWN0b3J5IHRoYXQgaXQgdHJhY2tzLCBidXQgd2UnbGwgaWdub3JlIHRoYXQgZm9yIG5vdzogaXQncyBub3QKK2hvdyBub3JtYWwgcHJvamVjdHMgd29yaywgYW5kIGl0J3MgcmVhbGx5IG9ubHkgbWVhbnQgZm9yIHNwZWNpYWwgdXNlcy4KK1NvIHRoZSBtZW50YWwgbW9kZWwgb2YgInRoZSBnaXQgaW5mb3JtYXRpb24gaXMgYWx3YXlzIHRpZWQgZGlyZWN0bHkgdG8KK3RoZSB3b3JraW5nIHRyZWUgdGhhdCBpdCBkZXNjcmliZXMiIG1heSBub3QgYmUgdGVjaG5pY2FsbHkgMTAwJQorYWNjdXJhdGUsIGJ1dCBpdCdzIGEgZ29vZCBtb2RlbCBmb3IgYWxsIG5vcm1hbCB1c2UuCisKK1RoaXMgaGFzIHR3byBpbXBsaWNhdGlvbnM6IAorCisgLSBpZiB5b3UgZ3JvdyBib3JlZCB3aXRoIHRoZSB0dXRvcmlhbCByZXBvc2l0b3J5IHlvdSBjcmVhdGVkIChvciB5b3UndmUKKyAgIG1hZGUgYSBtaXN0YWtlIGFuZCB3YW50IHRvIHN0YXJ0IGFsbCBvdmVyKSwgeW91IGNhbiBqdXN0IGRvIHNpbXBsZQorKworLS0tLS0tLS0tLS0tLS0tLQorJCBybSAtcmYgZ2l0LXR1dG9yaWFsCistLS0tLS0tLS0tLS0tLS0tCisrCithbmQgaXQgd2lsbCBiZSBnb25lLiBUaGVyZSdzIG5vIGV4dGVybmFsIHJlcG9zaXRvcnksIGFuZCB0aGVyZSdzIG5vCitoaXN0b3J5IG91dHNpZGUgdGhlIHByb2plY3QgeW91IGNyZWF0ZWQuCisKKyAtIGlmIHlvdSB3YW50IHRvIG1vdmUgb3IgZHVwbGljYXRlIGEgZ2l0IHJlcG9zaXRvcnksIHlvdSBjYW4gZG8gc28uIFRoZXJlCisgICBpcyBgZ2l0IGNsb25lYCBjb21tYW5kLCBidXQgaWYgYWxsIHlvdSB3YW50IHRvIGRvIGlzIGp1c3QgdG8KKyAgIGNyZWF0ZSBhIGNvcHkgb2YgeW91ciByZXBvc2l0b3J5ICh3aXRoIGFsbCB0aGUgZnVsbCBoaXN0b3J5IHRoYXQKKyAgIHdlbnQgYWxvbmcgd2l0aCBpdCksIHlvdSBjYW4gZG8gc28gd2l0aCBhIHJlZ3VsYXIKKyAgIGBjcCAtYSBnaXQtdHV0b3JpYWwgbmV3LWdpdC10dXRvcmlhbGAuCisrCitOb3RlIHRoYXQgd2hlbiB5b3UndmUgbW92ZWQgb3IgY29waWVkIGEgZ2l0IHJlcG9zaXRvcnksIHlvdXIgZ2l0IGluZGV4CitmaWxlICh3aGljaCBjYWNoZXMgdmFyaW91cyBpbmZvcm1hdGlvbiwgbm90YWJseSBzb21lIG9mIHRoZSAic3RhdCIKK2luZm9ybWF0aW9uIGZvciB0aGUgZmlsZXMgaW52b2x2ZWQpIHdpbGwgbGlrZWx5IG5lZWQgdG8gYmUgcmVmcmVzaGVkLgorU28gYWZ0ZXIgeW91IGRvIGEgYGNwIC1hYCB0byBjcmVhdGUgYSBuZXcgY29weSwgeW91J2xsIHdhbnQgdG8gZG8KKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKysKK2luIHRoZSBuZXcgcmVwb3NpdG9yeSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggZmlsZSBpcyB1cC10by1kYXRlLgorCitOb3RlIHRoYXQgdGhlIHNlY29uZCBwb2ludCBpcyB0cnVlIGV2ZW4gYWNyb3NzIG1hY2hpbmVzLiBZb3UgY2FuCitkdXBsaWNhdGUgYSByZW1vdGUgZ2l0IHJlcG9zaXRvcnkgd2l0aCAqYW55KiByZWd1bGFyIGNvcHkgbWVjaGFuaXNtLCBiZSBpdAorYHNjcGAsIGByc3luY2Agb3IgYHdnZXRgLgorCitXaGVuIGNvcHlpbmcgYSByZW1vdGUgcmVwb3NpdG9yeSwgeW91J2xsIHdhbnQgdG8gYXQgYSBtaW5pbXVtIHVwZGF0ZSB0aGUKK2luZGV4IGNhY2hlIHdoZW4geW91IGRvIHRoaXMsIGFuZCBlc3BlY2lhbGx5IHdpdGggb3RoZXIgcGVvcGxlcycKK3JlcG9zaXRvcmllcyB5b3Ugb2Z0ZW4gd2FudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggY2FjaGUgaXMgaW4gc29tZQora25vd24gc3RhdGUgKHlvdSBkb24ndCBrbm93ICp3aGF0KiB0aGV5J3ZlIGRvbmUgYW5kIG5vdCB5ZXQgY2hlY2tlZCBpbiksCitzbyB1c3VhbGx5IHlvdSdsbCBwcmVjZWRlIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAgd2l0aCBhCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IEhFQUQKKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBmb3JjZSBhIHRvdGFsIGluZGV4IHJlLWJ1aWxkIGZyb20gdGhlIHRyZWUgcG9pbnRlZCB0byBieSBgSEVBRGAuCitJdCByZXNldHMgdGhlIGluZGV4IGNvbnRlbnRzIHRvIGBIRUFEYCwgYW5kIHRoZW4gdGhlIGBnaXQtdXBkYXRlLWluZGV4YAorbWFrZXMgc3VyZSB0byBtYXRjaCB1cCBhbGwgaW5kZXggZW50cmllcyB3aXRoIHRoZSBjaGVja2VkLW91dCBmaWxlcy4KK0lmIHRoZSBvcmlnaW5hbCByZXBvc2l0b3J5IGhhZCB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIGl0cword29ya2luZyB0cmVlLCBgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2hgIG5vdGljZXMgdGhlbSBhbmQKK3RlbGxzIHlvdSB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZC4KKworVGhlIGFib3ZlIGNhbiBhbHNvIGJlIHdyaXR0ZW4gYXMgc2ltcGx5CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBpbiBmYWN0IGEgbG90IG9mIHRoZSBjb21tb24gZ2l0IGNvbW1hbmQgY29tYmluYXRpb25zIGNhbiBiZSBzY3JpcHRlZAord2l0aCB0aGUgYGdpdCB4eXpgIGludGVyZmFjZXMuICBZb3UgY2FuIGxlYXJuIHRoaW5ncyBieSBqdXN0IGxvb2tpbmcKK2F0IHdoYXQgdGhlIHZhcmlvdXMgZ2l0IHNjcmlwdHMgZG8uICBGb3IgZXhhbXBsZSwgYGdpdCByZXNldGAgaXMgdGhlCithYm92ZSB0d28gbGluZXMgaW1wbGVtZW50ZWQgaW4gYGdpdC1yZXNldGAsIGJ1dCBzb21lIHRoaW5ncyBsaWtlCitgZ2l0IHN0YXR1c2AgYW5kIGBnaXQgY29tbWl0YCBhcmUgc2xpZ2h0bHkgbW9yZSBjb21wbGV4IHNjcmlwdHMgYXJvdW5kCit0aGUgYmFzaWMgZ2l0IGNvbW1hbmRzLgorCitNYW55IChtb3N0PykgcHVibGljIHJlbW90ZSByZXBvc2l0b3JpZXMgd2lsbCBub3QgY29udGFpbiBhbnkgb2YKK3RoZSBjaGVja2VkIG91dCBmaWxlcyBvciBldmVuIGFuIGluZGV4IGZpbGUsIGFuZCB3aWxsICpvbmx5KiBjb250YWluIHRoZQorYWN0dWFsIGNvcmUgZ2l0IGZpbGVzLiBTdWNoIGEgcmVwb3NpdG9yeSB1c3VhbGx5IGRvZXNuJ3QgZXZlbiBoYXZlIHRoZQorYC5naXRgIHN1YmRpcmVjdG9yeSwgYnV0IGhhcyBhbGwgdGhlIGdpdCBmaWxlcyBkaXJlY3RseSBpbiB0aGUKK3JlcG9zaXRvcnkuIAorCitUbyBjcmVhdGUgeW91ciBvd24gbG9jYWwgbGl2ZSBjb3B5IG9mIHN1Y2ggYSAicmF3IiBnaXQgcmVwb3NpdG9yeSwgeW91J2QKK2ZpcnN0IGNyZWF0ZSB5b3VyIG93biBzdWJkaXJlY3RvcnkgZm9yIHRoZSBwcm9qZWN0LCBhbmQgdGhlbiBjb3B5IHRoZQorcmF3IHJlcG9zaXRvcnkgY29udGVudHMgaW50byB0aGUgYC5naXRgIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsIHRvCitjcmVhdGUgeW91ciBvd24gY29weSBvZiB0aGUgZ2l0IHJlcG9zaXRvcnksIHlvdSdkIGRvIHRoZSBmb2xsb3dpbmcKKworLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciBteS1naXQKKyQgY2QgbXktZ2l0CiskIHJzeW5jIC1yTCByc3luYzovL3JzeW5jLmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8gLmdpdAorLS0tLS0tLS0tLS0tLS0tLQorCitmb2xsb3dlZCBieSAKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKwordG8gcG9wdWxhdGUgdGhlIGluZGV4LiBIb3dldmVyLCBub3cgeW91IGhhdmUgcG9wdWxhdGVkIHRoZSBpbmRleCwgYW5kCit5b3UgaGF2ZSBhbGwgdGhlIGdpdCBpbnRlcm5hbCBmaWxlcywgYnV0IHlvdSB3aWxsIG5vdGljZSB0aGF0IHlvdSBkb24ndAorYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhlIHdvcmtpbmcgdHJlZSBmaWxlcyB0byB3b3JrIG9uLiBUbyBnZXQKK3Rob3NlLCB5b3UnZCBjaGVjayB0aGVtIG91dCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1hCistLS0tLS0tLS0tLS0tLS0tCisKK3doZXJlIHRoZSBgLXVgIGZsYWcgbWVhbnMgdGhhdCB5b3Ugd2FudCB0aGUgY2hlY2tvdXQgdG8ga2VlcCB0aGUgaW5kZXgKK3VwLXRvLWRhdGUgKHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gcmVmcmVzaCBpdCBhZnRlcndhcmQpLCBhbmQgdGhlCitgLWFgIGZsYWcgbWVhbnMgImNoZWNrIG91dCBhbGwgZmlsZXMiIChpZiB5b3UgaGF2ZSBhIHN0YWxlIGNvcHkgb3IgYW4KK29sZGVyIHZlcnNpb24gb2YgYSBjaGVja2VkIG91dCB0cmVlIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGFkZCB0aGUgYC1mYAorZmxhZyBmaXJzdCwgdG8gdGVsbCBnaXQtY2hlY2tvdXQtaW5kZXggdG8gKmZvcmNlKiBvdmVyd3JpdGluZyBvZiBhbnkgb2xkCitmaWxlcykuIAorCitBZ2FpbiwgdGhpcyBjYW4gYWxsIGJlIHNpbXBsaWZpZWQgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSByc3luYzovL3JzeW5jLmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8gbXktZ2l0CiskIGNkIG15LWdpdAorJCBnaXQgY2hlY2tvdXQKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBlbmQgdXAgZG9pbmcgYWxsIG9mIHRoZSBhYm92ZSBmb3IgeW91LgorCitZb3UgaGF2ZSBub3cgc3VjY2Vzc2Z1bGx5IGNvcGllZCBzb21lYm9keSBlbHNlJ3MgKG1pbmUpIHJlbW90ZQorcmVwb3NpdG9yeSwgYW5kIGNoZWNrZWQgaXQgb3V0LiAKKworCitDcmVhdGluZyBhIG5ldyBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCcmFuY2hlcyBpbiBnaXQgYXJlIHJlYWxseSBub3RoaW5nIG1vcmUgdGhhbiBwb2ludGVycyBpbnRvIHRoZSBnaXQKK29iamVjdCBkYXRhYmFzZSBmcm9tIHdpdGhpbiB0aGUgYC5naXQvcmVmcy9gIHN1YmRpcmVjdG9yeSwgYW5kIGFzIHdlCithbHJlYWR5IGRpc2N1c3NlZCwgdGhlIGBIRUFEYCBicmFuY2ggaXMgbm90aGluZyBidXQgYSBzeW1saW5rIHRvIG9uZSBvZgordGhlc2Ugb2JqZWN0IHBvaW50ZXJzLiAKKworWW91IGNhbiBhdCBhbnkgdGltZSBjcmVhdGUgYSBuZXcgYnJhbmNoIGJ5IGp1c3QgcGlja2luZyBhbiBhcmJpdHJhcnkKK3BvaW50IGluIHRoZSBwcm9qZWN0IGhpc3RvcnksIGFuZCBqdXN0IHdyaXRpbmcgdGhlIFNIQTEgbmFtZSBvZiB0aGF0CitvYmplY3QgaW50byBhIGZpbGUgdW5kZXIgYC5naXQvcmVmcy9oZWFkcy9gLiBZb3UgY2FuIHVzZSBhbnkgZmlsZW5hbWUgeW91Cit3YW50IChhbmQgaW5kZWVkLCBzdWJkaXJlY3RvcmllcyksIGJ1dCB0aGUgY29udmVudGlvbiBpcyB0aGF0IHRoZQorIm5vcm1hbCIgYnJhbmNoIGlzIGNhbGxlZCBgbWFzdGVyYC4gVGhhdCdzIGp1c3QgYSBjb252ZW50aW9uLCB0aG91Z2gsCithbmQgbm90aGluZyBlbmZvcmNlcyBpdC4gCisKK1RvIHNob3cgdGhhdCBhcyBhbiBleGFtcGxlLCBsZXQncyBnbyBiYWNrIHRvIHRoZSBnaXQtdHV0b3JpYWwgcmVwb3NpdG9yeSB3ZQordXNlZCBlYXJsaWVyLCBhbmQgY3JlYXRlIGEgYnJhbmNoIGluIGl0LiBZb3UgZG8gdGhhdCBieSBzaW1wbHkganVzdAorc2F5aW5nIHRoYXQgeW91IHdhbnQgdG8gY2hlY2sgb3V0IGEgbmV3IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtYiBteWJyYW5jaAorLS0tLS0tLS0tLS0tCisKK3dpbGwgY3JlYXRlIGEgbmV3IGJyYW5jaCBiYXNlZCBhdCB0aGUgY3VycmVudCBgSEVBRGAgcG9zaXRpb24sIGFuZCBzd2l0Y2gKK3RvIGl0LiAKKworW05PVEVdCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lmIHlvdSBtYWtlIHRoZSBkZWNpc2lvbiB0byBzdGFydCB5b3VyIG5ldyBicmFuY2ggYXQgc29tZQorb3RoZXIgcG9pbnQgaW4gdGhlIGhpc3RvcnkgdGhhbiB0aGUgY3VycmVudCBgSEVBRGAsIHlvdSBjYW4gZG8gc28gYnkKK2p1c3QgdGVsbGluZyBgZ2l0IGNoZWNrb3V0YCB3aGF0IHRoZSBiYXNlIG9mIHRoZSBjaGVja291dCB3b3VsZCBiZS4KK0luIG90aGVyIHdvcmRzLCBpZiB5b3UgaGF2ZSBhbiBlYXJsaWVyIHRhZyBvciBicmFuY2gsIHlvdSdkIGp1c3QgZG8KKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtYiBteWJyYW5jaCBlYXJsaWVyLWNvbW1pdAorLS0tLS0tLS0tLS0tCisKK2FuZCBpdCB3b3VsZCBjcmVhdGUgdGhlIG5ldyBicmFuY2ggYG15YnJhbmNoYCBhdCB0aGUgZWFybGllciBjb21taXQsCithbmQgY2hlY2sgb3V0IHRoZSBzdGF0ZSBhdCB0aGF0IHRpbWUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBhbHdheXMganVzdCBqdW1wIGJhY2sgdG8geW91ciBvcmlnaW5hbCBgbWFzdGVyYCBicmFuY2ggYnkgZG9pbmcKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCisob3IgYW55IG90aGVyIGJyYW5jaC1uYW1lLCBmb3IgdGhhdCBtYXR0ZXIpIGFuZCBpZiB5b3UgZm9yZ2V0IHdoaWNoCiticmFuY2ggeW91IGhhcHBlbiB0byBiZSBvbiwgYSBzaW1wbGUKKworLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L0hFQUQKKy0tLS0tLS0tLS0tLQorCit3aWxsIHRlbGwgeW91IHdoZXJlIGl0J3MgcG9pbnRpbmcuICBUbyBnZXQgdGhlIGxpc3Qgb2YgYnJhbmNoZXMKK3lvdSBoYXZlLCB5b3UgY2FuIHNheQorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaAorLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIG5vdGhpbmcgbW9yZSB0aGFuIGEgc2ltcGxlIHNjcmlwdCBhcm91bmQgYGxzIC5naXQvcmVmcy9oZWFkc2AuCitUaGVyZSB3aWxsIGJlIGFzdGVyaXNrIGluIGZyb250IG9mIHRoZSBicmFuY2ggeW91IGFyZSBjdXJyZW50bHkgb24uCisKK1NvbWV0aW1lcyB5b3UgbWF5IHdpc2ggdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBfd2l0aG91dF8gYWN0dWFsbHkKK2NoZWNraW5nIGl0IG91dCBhbmQgc3dpdGNoaW5nIHRvIGl0LiBJZiBzbywganVzdCB1c2UgdGhlIGNvbW1hbmQKKworLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggPGJyYW5jaG5hbWU+IFtzdGFydGluZ3BvaW50XQorLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgc2ltcGx5IF9jcmVhdGVfIHRoZSBicmFuY2gsIGJ1dCB3aWxsIG5vdCBkbyBhbnl0aGluZyBmdXJ0aGVyLiAKK1lvdSBjYW4gdGhlbiBsYXRlciAtLSBvbmNlIHlvdSBkZWNpZGUgdGhhdCB5b3Ugd2FudCB0byBhY3R1YWxseSBkZXZlbG9wCitvbiB0aGF0IGJyYW5jaCAtLSBzd2l0Y2ggdG8gdGhhdCBicmFuY2ggd2l0aCBhIHJlZ3VsYXIgYGdpdCBjaGVja291dGAKK3dpdGggdGhlIGJyYW5jaG5hbWUgYXMgdGhlIGFyZ3VtZW50LgorCisKK01lcmdpbmcgdHdvIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGlkZWFzIG9mIGhhdmluZyBhIGJyYW5jaCBpcyB0aGF0IHlvdSBkbyBzb21lIChwb3NzaWJseQorZXhwZXJpbWVudGFsKSB3b3JrIGluIGl0LCBhbmQgZXZlbnR1YWxseSBtZXJnZSBpdCBiYWNrIHRvIHRoZSBtYWluCiticmFuY2guIFNvIGFzc3VtaW5nIHlvdSBjcmVhdGVkIHRoZSBhYm92ZSBgbXlicmFuY2hgIHRoYXQgc3RhcnRlZCBvdXQKK2JlaW5nIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBgbWFzdGVyYCBicmFuY2gsIGxldCdzIG1ha2Ugc3VyZSB3ZSdyZSBpbgordGhhdCBicmFuY2gsIGFuZCBkbyBzb21lIHdvcmsgdGhlcmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXlicmFuY2gKKyQgZWNobyAiV29yaywgd29yaywgd29yayIgPj5oZWxsbworJCBnaXQgY29tbWl0IC1tICdTb21lIHdvcmsuJyAtaSBoZWxsbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUsIHdlIGp1c3QgYWRkZWQgYW5vdGhlciBsaW5lIHRvIGBoZWxsb2AsIGFuZCB3ZSB1c2VkIGEgc2hvcnRoYW5kIGZvcgorZG9pbmcgYm90aCBgZ2l0LXVwZGF0ZS1pbmRleCBoZWxsb2AgYW5kIGBnaXQgY29tbWl0YCBieSBqdXN0IGdpdmluZyB0aGUKK2ZpbGVuYW1lIGRpcmVjdGx5IHRvIGBnaXQgY29tbWl0YCwgd2l0aCBhbiBgLWlgIGZsYWcgKGl0IHRlbGxzCitnaXQgdG8gJ2luY2x1ZGUnIHRoYXQgZmlsZSBpbiBhZGRpdGlvbiB0byB3aGF0IHlvdSBoYXZlIGRvbmUgdG8KK3RoZSBpbmRleCBmaWxlIHNvIGZhciB3aGVuIG1ha2luZyB0aGUgY29tbWl0KS4gIFRoZSBgLW1gIGZsYWcgaXMgdG8gZ2l2ZSB0aGUKK2NvbW1pdCBsb2cgbWVzc2FnZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKK05vdywgdG8gbWFrZSBpdCBhIGJpdCBtb3JlIGludGVyZXN0aW5nLCBsZXQncyBhc3N1bWUgdGhhdCBzb21lYm9keSBlbHNlCitkb2VzIHNvbWUgd29yayBpbiB0aGUgb3JpZ2luYWwgYnJhbmNoLCBhbmQgc2ltdWxhdGUgdGhhdCBieSBnb2luZyBiYWNrCit0byB0aGUgbWFzdGVyIGJyYW5jaCwgYW5kIGVkaXRpbmcgdGhlIHNhbWUgZmlsZSBkaWZmZXJlbnRseSB0aGVyZToKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitIZXJlLCB0YWtlIGEgbW9tZW50IHRvIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIGBoZWxsb2AsIGFuZCBub3RpY2UgaG93IHRoZXkKK2Rvbid0IGNvbnRhaW4gdGhlIHdvcmsgd2UganVzdCBkaWQgaW4gYG15YnJhbmNoYCAtLSBiZWNhdXNlIHRoYXQgd29yaworaGFzbid0IGhhcHBlbmVkIGluIHRoZSBgbWFzdGVyYCBicmFuY2ggYXQgYWxsLiBUaGVuIGRvCisKKy0tLS0tLS0tLS0tLQorJCBlY2hvICJQbGF5LCBwbGF5LCBwbGF5IiA+PmhlbGxvCiskIGVjaG8gIkxvdHMgb2YgZnVuIiA+PmV4YW1wbGUKKyQgZ2l0IGNvbW1pdCAtbSAnU29tZSBmdW4uJyAtaSBoZWxsbyBleGFtcGxlCistLS0tLS0tLS0tLS0KKworc2luY2UgdGhlIG1hc3RlciBicmFuY2ggaXMgb2J2aW91c2x5IGluIGEgbXVjaCBiZXR0ZXIgbW9vZC4KKworTm93LCB5b3UndmUgZ290IHR3byBicmFuY2hlcywgYW5kIHlvdSBkZWNpZGUgdGhhdCB5b3Ugd2FudCB0byBtZXJnZSB0aGUKK3dvcmsgZG9uZS4gQmVmb3JlIHdlIGRvIHRoYXQsIGxldCdzIGludHJvZHVjZSBhIGNvb2wgZ3JhcGhpY2FsIHRvb2wgdGhhdAoraGVscHMgeW91IHZpZXcgd2hhdCdzIGdvaW5nIG9uOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdGsgLS1hbGwKKy0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBzaG93IHlvdSBncmFwaGljYWxseSBib3RoIG9mIHlvdXIgYnJhbmNoZXMgKHRoYXQncyB3aGF0IHRoZSBgXC0tYWxsYAorbWVhbnM6IG5vcm1hbGx5IGl0IHdpbGwganVzdCBzaG93IHlvdSB5b3VyIGN1cnJlbnQgYEhFQURgKSBhbmQgdGhlaXIKK2hpc3Rvcmllcy4gWW91IGNhbiBhbHNvIHNlZSBleGFjdGx5IGhvdyB0aGV5IGNhbWUgdG8gYmUgZnJvbSBhIGNvbW1vbgorc291cmNlLiAKKworQW55d2F5LCBsZXQncyBleGl0IGBnaXRrYCAoYF5RYCBvciB0aGUgRmlsZSBtZW51KSwgYW5kIGRlY2lkZSB0aGF0IHdlIHdhbnQKK3RvIG1lcmdlIHRoZSB3b3JrIHdlIGRpZCBvbiB0aGUgYG15YnJhbmNoYCBicmFuY2ggaW50byB0aGUgYG1hc3RlcmAKK2JyYW5jaCAod2hpY2ggaXMgY3VycmVudGx5IG91ciBgSEVBRGAgdG9vKS4gVG8gZG8gdGhhdCwgdGhlcmUncyBhIG5pY2UKK3NjcmlwdCBjYWxsZWQgYGdpdCBtZXJnZWAsIHdoaWNoIHdhbnRzIHRvIGtub3cgd2hpY2ggYnJhbmNoZXMgeW91IHdhbnQKK3RvIHJlc29sdmUgYW5kIHdoYXQgdGhlIG1lcmdlIGlzIGFsbCBhYm91dDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSAiTWVyZ2Ugd29yayBpbiBteWJyYW5jaCIgSEVBRCBteWJyYW5jaAorLS0tLS0tLS0tLS0tCisKK3doZXJlIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBnb2luZyB0byBiZSB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZSBpZgordGhlIG1lcmdlIGNhbiBiZSByZXNvbHZlZCBhdXRvbWF0aWNhbGx5LgorCitOb3csIGluIHRoaXMgY2FzZSB3ZSd2ZSBpbnRlbnRpb25hbGx5IGNyZWF0ZWQgYSBzaXR1YXRpb24gd2hlcmUgdGhlCittZXJnZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgdXAgYnkgaGFuZCwgdGhvdWdoLCBzbyBnaXQgd2lsbCBkbyBhcyBtdWNoCitvZiBpdCBhcyBpdCBjYW4gYXV0b21hdGljYWxseSAod2hpY2ggaW4gdGhpcyBjYXNlIGlzIGp1c3QgbWVyZ2UgdGhlIGBleGFtcGxlYAorZmlsZSwgd2hpY2ggaGFkIG5vIGRpZmZlcmVuY2VzIGluIHRoZSBgbXlicmFuY2hgIGJyYW5jaCksIGFuZCBzYXk6CisKKy0tLS0tLS0tLS0tLS0tLS0KKwlBdXRvLW1lcmdpbmcgaGVsbG8gCisJQ09ORkxJQ1QgKGNvbnRlbnQpOiBNZXJnZSBjb25mbGljdCBpbiBoZWxsbyAKKwlBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkOyBmaXggdXAgYnkgaGFuZAorLS0tLS0tLS0tLS0tLS0tLQorCitJdCB0ZWxscyB5b3UgdGhhdCBpdCBkaWQgYW4gIkF1dG9tYXRpYyBtZXJnZSIsIHdoaWNoCitmYWlsZWQgZHVlIHRvIGNvbmZsaWN0cyBpbiBgaGVsbG9gLgorCitOb3QgdG8gd29ycnkuIEl0IGxlZnQgdGhlICh0cml2aWFsKSBjb25mbGljdCBpbiBgaGVsbG9gIGluIHRoZSBzYW1lIGZvcm0geW91CitzaG91bGQgYWxyZWFkeSBiZSB3ZWxsIHVzZWQgdG8gaWYgeW91J3ZlIGV2ZXIgdXNlZCBDVlMsIHNvIGxldCdzIGp1c3QKK29wZW4gYGhlbGxvYCBpbiBvdXIgZWRpdG9yICh3aGF0ZXZlciB0aGF0IG1heSBiZSksIGFuZCBmaXggaXQgdXAgc29tZWhvdy4KK0knZCBzdWdnZXN0IGp1c3QgbWFraW5nIGl0IHNvIHRoYXQgYGhlbGxvYCBjb250YWlucyBhbGwgZm91ciBsaW5lczoKKworLS0tLS0tLS0tLS0tCitIZWxsbyBXb3JsZAorSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorUGxheSwgcGxheSwgcGxheQorV29yaywgd29yaywgd29yaworLS0tLS0tLS0tLS0tCisKK2FuZCBvbmNlIHlvdSdyZSBoYXBweSB3aXRoIHlvdXIgbWFudWFsIG1lcmdlLCBqdXN0IGRvIGEKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWkgaGVsbG8KKy0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHZlcnkgbG91ZGx5IHdhcm4geW91IHRoYXQgeW91J3JlIG5vdyBjb21taXR0aW5nIGEgbWVyZ2UKKyh3aGljaCBpcyBjb3JyZWN0LCBzbyBuZXZlciBtaW5kKSwgYW5kIHlvdSBjYW4gd3JpdGUgYSBzbWFsbCBtZXJnZQorbWVzc2FnZSBhYm91dCB5b3VyIGFkdmVudHVyZXMgaW4gZ2l0LW1lcmdlLWxhbmQuCisKK0FmdGVyIHlvdSdyZSBkb25lLCBzdGFydCB1cCBgZ2l0ayBcLS1hbGxgIHRvIHNlZSBncmFwaGljYWxseSB3aGF0IHRoZQoraGlzdG9yeSBsb29rcyBsaWtlLiBOb3RpY2UgdGhhdCBgbXlicmFuY2hgIHN0aWxsIGV4aXN0cywgYW5kIHlvdSBjYW4KK3N3aXRjaCB0byBpdCwgYW5kIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBpdCBpZiB5b3Ugd2FudCB0by4gVGhlCitgbXlicmFuY2hgIGJyYW5jaCB3aWxsIG5vdCBjb250YWluIHRoZSBtZXJnZSwgYnV0IG5leHQgdGltZSB5b3UgbWVyZ2UgaXQKK2Zyb20gdGhlIGBtYXN0ZXJgIGJyYW5jaCwgZ2l0IHdpbGwga25vdyBob3cgeW91IG1lcmdlZCBpdCwgc28geW91J2xsIG5vdAoraGF2ZSB0byBkbyBfdGhhdF8gbWVyZ2UgYWdhaW4uCisKK0Fub3RoZXIgdXNlZnVsIHRvb2wsIGVzcGVjaWFsbHkgaWYgeW91IGRvIG5vdCBhbHdheXMgd29yayBpbiBYLVdpbmRvdworZW52aXJvbm1lbnQsIGlzIGBnaXQgc2hvdy1icmFuY2hgLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tdG9wby1vcmRlciBtYXN0ZXIgbXlicmFuY2gKKyogW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICEgW215YnJhbmNoXSBTb21lIHdvcmsuCistLQorLSAgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorKisgW215YnJhbmNoXSBTb21lIHdvcmsuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IHR3byBsaW5lcyBpbmRpY2F0ZSB0aGF0IGl0IGlzIHNob3dpbmcgdGhlIHR3byBicmFuY2hlcworYW5kIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZnJvbSB0aGVpcgordG9wLW9mLXRoZS10cmVlIGNvbW1pdHMsIHlvdSBhcmUgY3VycmVudGx5IG9uIGBtYXN0ZXJgIGJyYW5jaAorKG5vdGljZSB0aGUgYXN0ZXJpc2sgYFwqYCBjaGFyYWN0ZXIpLCBhbmQgdGhlIGZpcnN0IGNvbHVtbiBmb3IKK3RoZSBsYXRlciBvdXRwdXQgbGluZXMgaXMgdXNlZCB0byBzaG93IGNvbW1pdHMgY29udGFpbmVkIGluIHRoZQorYG1hc3RlcmAgYnJhbmNoLCBhbmQgdGhlIHNlY29uZCBjb2x1bW4gZm9yIHRoZSBgbXlicmFuY2hgCiticmFuY2guIFRocmVlIGNvbW1pdHMgYXJlIHNob3duIGFsb25nIHdpdGggdGhlaXIgbG9nIG1lc3NhZ2VzLgorQWxsIG9mIHRoZW0gaGF2ZSBub24gYmxhbmsgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgY29sdW1uIChgKmAKK3Nob3dzIGFuIG9yZGluYXJ5IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGAuYCBpcyBhIG1lcmdlIGNvbW1pdCksIHdoaWNoCittZWFucyB0aGV5IGFyZSBub3cgcGFydCBvZiB0aGUgYG1hc3RlcmAgYnJhbmNoLiBPbmx5IHRoZSAiU29tZQord29yayIgY29tbWl0IGhhcyB0aGUgcGx1cyBgK2AgY2hhcmFjdGVyIGluIHRoZSBzZWNvbmQgY29sdW1uLAorYmVjYXVzZSBgbXlicmFuY2hgIGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gaW5jb3Jwb3JhdGUgdGhlc2UKK2NvbW1pdHMgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoZSBzdHJpbmcgaW5zaWRlIGJyYWNrZXRzCitiZWZvcmUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpcyBhIHNob3J0IG5hbWUgeW91IGNhbiB1c2UgdG8KK25hbWUgdGhlIGNvbW1pdC4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCAnbWFzdGVyJyBhbmQgJ215YnJhbmNoJworYXJlIGJyYW5jaCBoZWFkcy4gICdtYXN0ZXJ+MScgaXMgdGhlIGZpcnN0IHBhcmVudCBvZiAnbWFzdGVyJworYnJhbmNoIGhlYWQuICBQbGVhc2Ugc2VlICdnaXQtcmV2LXBhcnNlJyBkb2N1bWVudGF0aW9uIGlmIHlvdQorc2VlIG1vcmUgY29tcGxleCBjYXNlcy4KKworTm93LCBsZXQncyBwcmV0ZW5kIHlvdSBhcmUgdGhlIG9uZSB3aG8gZGlkIGFsbCB0aGUgd29yayBpbgorYG15YnJhbmNoYCwgYW5kIHRoZSBmcnVpdCBvZiB5b3VyIGhhcmQgd29yayBoYXMgZmluYWxseSBiZWVuIG1lcmdlZAordG8gdGhlIGBtYXN0ZXJgIGJyYW5jaC4gTGV0J3MgZ28gYmFjayB0byBgbXlicmFuY2hgLCBhbmQgcnVuCitgZ2l0IG1lcmdlYCB0byBnZXQgdGhlICJ1cHN0cmVhbSBjaGFuZ2VzIiBiYWNrIHRvIHlvdXIgYnJhbmNoLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15YnJhbmNoCiskIGdpdCBtZXJnZSAiTWVyZ2UgdXBzdHJlYW0gY2hhbmdlcy4iIEhFQUQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworVGhpcyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlIHRoaXMgKHRoZSBhY3R1YWwgY29tbWl0IG9iamVjdCBuYW1lcword291bGQgYmUgZGlmZmVyZW50KQorCistLS0tLS0tLS0tLS0tLS0tCitVcGRhdGluZyBmcm9tIGFlM2EyZGEuLi4gdG8gYTgwYjRhYS4uLi4KK0Zhc3QgZm9yd2FyZAorIGV4YW1wbGUgfCAgICAxICsKKyBoZWxsbyAgIHwgICAgMSArCisgMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLS0tCisKK0JlY2F1c2UgeW91ciBicmFuY2ggZGlkIG5vdCBjb250YWluIGFueXRoaW5nIG1vcmUgdGhhbiB3aGF0IGFyZQorYWxyZWFkeSBtZXJnZWQgaW50byB0aGUgYG1hc3RlcmAgYnJhbmNoLCB0aGUgbWVyZ2Ugb3BlcmF0aW9uIGRpZAorbm90IGFjdHVhbGx5IGRvIGEgbWVyZ2UuIEluc3RlYWQsIGl0IGp1c3QgdXBkYXRlZCB0aGUgdG9wIG9mCit0aGUgdHJlZSBvZiB5b3VyIGJyYW5jaCB0byB0aGF0IG9mIHRoZSBgbWFzdGVyYCBicmFuY2guIFRoaXMgaXMKK29mdGVuIGNhbGxlZCAnZmFzdCBmb3J3YXJkJyBtZXJnZS4KKworWW91IGNhbiBydW4gYGdpdGsgXC0tYWxsYCBhZ2FpbiB0byBzZWUgaG93IHRoZSBjb21taXQgYW5jZXN0cnkKK2xvb2tzIGxpa2UsIG9yIHJ1biBgc2hvdy1icmFuY2hgLCB3aGljaCB0ZWxscyB5b3UgdGhpcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgbXlicmFuY2gKKyEgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICogW215YnJhbmNoXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCistLQorLS0gW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworTWVyZ2luZyBleHRlcm5hbCB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQncyB1c3VhbGx5IG11Y2ggbW9yZSBjb21tb24gdGhhdCB5b3UgbWVyZ2Ugd2l0aCBzb21lYm9keSBlbHNlIHRoYW4KK21lcmdpbmcgd2l0aCB5b3VyIG93biBicmFuY2hlcywgc28gaXQncyB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCBnaXQKK21ha2VzIHRoYXQgdmVyeSBlYXN5IHRvbywgYW5kIGluIGZhY3QsIGl0J3Mgbm90IHRoYXQgZGlmZmVyZW50IGZyb20KK2RvaW5nIGEgYGdpdCBtZXJnZWAuIEluIGZhY3QsIGEgcmVtb3RlIG1lcmdlIGVuZHMgdXAgYmVpbmcgbm90aGluZworbW9yZSB0aGFuICJmZXRjaCB0aGUgd29yayBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaW50byBhIHRlbXBvcmFyeSB0YWciCitmb2xsb3dlZCBieSBhIGBnaXQgbWVyZ2VgLgorCitGZXRjaGluZyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaXMgZG9uZSBieSwgdW5zdXJwcmlzaW5nbHksCitgZ2l0IGZldGNoYDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggPHJlbW90ZS1yZXBvc2l0b3J5PgorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyB0cmFuc3BvcnRzIGNhbiBiZSB1c2VkIHRvIG5hbWUgdGhlCityZXBvc2l0b3J5IHRvIGRvd25sb2FkIGZyb206CisKK1JzeW5jOjoKKwlgcnN5bmM6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1JzeW5jIHRyYW5zcG9ydCBpcyB1c2FibGUgZm9yIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZywKK2J1dCBpcyBjb21wbGV0ZWx5IHVuYXdhcmUgb2Ygd2hhdCBnaXQgZG9lcywgYW5kIGNhbiBwcm9kdWNlCit1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiB5b3UgZG93bmxvYWQgZnJvbSB0aGUgcHVibGljIHJlcG9zaXRvcnkKK3doaWxlIHRoZSByZXBvc2l0b3J5IG93bmVyIGlzIHVwbG9hZGluZyBpbnRvIGl0IHZpYSBgcnN5bmNgCit0cmFuc3BvcnQuICBNb3N0IG5vdGFibHksIGl0IGNvdWxkIHVwZGF0ZSB0aGUgZmlsZXMgdW5kZXIKK2ByZWZzL2Agd2hpY2ggaG9sZHMgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSB0b3Btb3N0IGNvbW1pdHMKK2JlZm9yZSB1cGxvYWRpbmcgdGhlIGZpbGVzIGluIGBvYmplY3RzL2AgLS0gdGhlIGRvd25sb2FkZXIgd291bGQKK29idGFpbiBoZWFkIGNvbW1pdCBvYmplY3QgbmFtZSB3aGlsZSB0aGF0IG9iamVjdCBpdHNlbGYgaXMgc3RpbGwKK25vdCBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnkuICBGb3IgdGhpcyByZWFzb24sIGl0IGlzCitjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisKK1NTSDo6CisJYHJlbW90ZS5tYWNoaW5lOi9wYXRoL3RvL3JlcG8uZ2l0L2Agb3IKKysKK2Bzc2g6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGNhbiBiZSB1c2VkIGZvciBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcsCithbmQgcmVxdWlyZXMgeW91IHRvIGhhdmUgYSBsb2ctaW4gcHJpdmlsZWdlIG92ZXIgYHNzaGAgdG8gdGhlCityZW1vdGUgbWFjaGluZS4gIEl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIG90aGVyIHNpZGUKK2xhY2tzIGJ5IGV4Y2hhbmdpbmcgdGhlIGhlYWQgY29tbWl0cyBib3RoIGVuZHMgaGF2ZSBhbmQKK3RyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuICBJdCBpcyBieSBmYXIgdGhlCittb3N0IGVmZmljaWVudCB3YXkgdG8gZXhjaGFuZ2UgZ2l0IG9iamVjdHMgYmV0d2VlbiByZXBvc2l0b3JpZXMuCisKK0xvY2FsIGRpcmVjdG9yeTo6CisJYC9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGlzIHRoZSBzYW1lIGFzIFNTSCB0cmFuc3BvcnQgYnV0IHVzZXMgYHNoYCB0byBydW4KK2JvdGggZW5kcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgb3RoZXIgZW5kIG9uCit0aGUgcmVtb3RlIG1hY2hpbmUgdmlhIGBzc2hgLgorCitnaXQgTmF0aXZlOjoKKwlgZ2l0Oi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitUaGlzIHRyYW5zcG9ydCB3YXMgZGVzaWduZWQgZm9yIGFub255bW91cyBkb3dubG9hZGluZy4gIExpa2UgU1NICit0cmFuc3BvcnQsIGl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIGRvd25zdHJlYW0gc2lkZQorbGFja3MgYW5kIHRyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuCisKK0hUVFAoUyk6OgorCWBodHRwOi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitEb3dubG9hZGVyIGZyb20gaHR0cCBhbmQgaHR0cHMgVVJMCitmaXJzdCBvYnRhaW5zIHRoZSB0b3Btb3N0IGNvbW1pdCBvYmplY3QgbmFtZSBmcm9tIHRoZSByZW1vdGUgc2l0ZQorYnkgbG9va2luZyBhdCB0aGUgc3BlY2lmaWVkIHJlZm5hbWUgdW5kZXIgYHJlcG8uZ2l0L3JlZnMvYCBkaXJlY3RvcnksCithbmQgdGhlbiB0cmllcyB0byBvYnRhaW4gdGhlCitjb21taXQgb2JqZWN0IGJ5IGRvd25sb2FkaW5nIGZyb20gYHJlcG8uZ2l0L29iamVjdHMveHgveHh4XC4uLmAKK3VzaW5nIHRoZSBvYmplY3QgbmFtZSBvZiB0aGF0IGNvbW1pdCBvYmplY3QuICBUaGVuIGl0IHJlYWRzIHRoZQorY29tbWl0IG9iamVjdCB0byBmaW5kIG91dCBpdHMgcGFyZW50IGNvbW1pdHMgYW5kIHRoZSBhc3NvY2lhdGUKK3RyZWUgb2JqZWN0OyBpdCByZXBlYXRzIHRoaXMgcHJvY2VzcyB1bnRpbCBpdCBnZXRzIGFsbCB0aGUKK25lY2Vzc2FyeSBvYmplY3RzLiAgQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW9yLCB0aGV5IGFyZQorc29tZXRpbWVzIGFsc28gY2FsbGVkICdjb21taXQgd2Fsa2VycycuCisrCitUaGUgJ2NvbW1pdCB3YWxrZXJzJyBhcmUgc29tZXRpbWVzIGFsc28gY2FsbGVkICdkdW1iCit0cmFuc3BvcnRzJywgYmVjYXVzZSB0aGV5IGRvIG5vdCByZXF1aXJlIGFueSBnaXQgYXdhcmUgc21hcnQKK3NlcnZlciBsaWtlIGdpdCBOYXRpdmUgdHJhbnNwb3J0IGRvZXMuICBBbnkgc3RvY2sgSFRUUCBzZXJ2ZXIKK3RoYXQgZG9lcyBub3QgZXZlbiBzdXBwb3J0IGRpcmVjdG9yeSBpbmRleCB3b3VsZCBzdWZmaWNlLiAgQnV0Cit5b3UgbXVzdCBwcmVwYXJlIHlvdXIgcmVwb3NpdG9yeSB3aXRoIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYAordG8gaGVscCBkdW1iIHRyYW5zcG9ydCBkb3dubG9hZGVycy4KKysKK1RoZXJlIGFyZSAoY29uZnVzaW5nbHkgZW5vdWdoKSBgZ2l0LXNzaC1mZXRjaGAgYW5kIGBnaXQtc3NoLXVwbG9hZGAKK3Byb2dyYW1zLCB3aGljaCBhcmUgJ2NvbW1pdCB3YWxrZXJzJzsgdGhleSBvdXRsaXZlZCB0aGVpcgordXNlZnVsbmVzcyB3aGVuIGdpdCBOYXRpdmUgYW5kIFNTSCB0cmFuc3BvcnRzIHdlcmUgaW50cm9kdWNlZCwKK2FuZCBub3QgdXNlZCBieSBgZ2l0IHB1bGxgIG9yIGBnaXQgcHVzaGAgc2NyaXB0cy4KKworT25jZSB5b3UgZmV0Y2ggZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHlvdSBgbWVyZ2VgIHRoYXQKK3dpdGggeW91ciBjdXJyZW50IGJyYW5jaC4KKworSG93ZXZlciAtLSBpdCdzIHN1Y2ggYSBjb21tb24gdGhpbmcgdG8gYGZldGNoYCBhbmQgdGhlbgoraW1tZWRpYXRlbHkgYG1lcmdlYCwgdGhhdCBpdCdzIGNhbGxlZCBgZ2l0IHB1bGxgLCBhbmQgeW91IGNhbgorc2ltcGx5IGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgPHJlbW90ZS1yZXBvc2l0b3J5PgorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgb3B0aW9uYWxseSBnaXZlIGEgYnJhbmNoLW5hbWUgZm9yIHRoZSByZW1vdGUgZW5kIGFzIGEgc2Vjb25kCithcmd1bWVudC4KKworW05PVEVdCitZb3UgY291bGQgZG8gd2l0aG91dCB1c2luZyBhbnkgYnJhbmNoZXMgYXQgYWxsLCBieQora2VlcGluZyBhcyBtYW55IGxvY2FsIHJlcG9zaXRvcmllcyBhcyB5b3Ugd291bGQgbGlrZSB0byBoYXZlCiticmFuY2hlcywgYW5kIG1lcmdpbmcgYmV0d2VlbiB0aGVtIHdpdGggYGdpdCBwdWxsYCwganVzdCBsaWtlCit5b3UgbWVyZ2UgYmV0d2VlbiBicmFuY2hlcy4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzCit0aGF0IGl0IGxldHMgeW91IGtlZXAgYSBzZXQgb2YgZmlsZXMgZm9yIGVhY2ggYGJyYW5jaGAgY2hlY2tlZAorb3V0IGFuZCB5b3UgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBpZiB5b3UKK2p1Z2dsZSBtdWx0aXBsZSBsaW5lcyBvZiBkZXZlbG9wbWVudCBzaW11bHRhbmVvdXNseS4gT2YKK2NvdXJzZSwgeW91IHdpbGwgcGF5IHRoZSBwcmljZSBvZiBtb3JlIGRpc2sgdXNhZ2UgdG8gaG9sZAorbXVsdGlwbGUgd29ya2luZyB0cmVlcywgYnV0IGRpc2sgc3BhY2UgaXMgY2hlYXAgdGhlc2UgZGF5cy4KKworSXQgaXMgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUgcHVsbGluZyBmcm9tIHRoZSBzYW1lIHJlbW90ZQorcmVwb3NpdG9yeSBmcm9tIHRpbWUgdG8gdGltZS4gQXMgYSBzaG9ydCBoYW5kLCB5b3UgY2FuIHN0b3JlCit0aGUgcmVtb3RlIHJlcG9zaXRvcnkgVVJMIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5J3MgY29uZmlnIGZpbGUKK2xpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb25maWcgcmVtb3RlLmxpbnVzLnVybCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdXNlIHRoZSAibGludXMiIGtleXdvcmQgd2l0aCBgZ2l0IHB1bGxgIGluc3RlYWQgb2YgdGhlIGZ1bGwgVVJMLgorCitFeGFtcGxlcy4KKworLiBgZ2l0IHB1bGwgbGludXNgCisuIGBnaXQgcHVsbCBsaW51cyB0YWcgdjAuOTkuMWAKKwordGhlIGFib3ZlIGFyZSBlcXVpdmFsZW50IHRvOgorCisuIGBnaXQgcHVsbCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8gSEVBRGAKKy4gYGdpdCBwdWxsIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyB0YWcgdjAuOTkuMWAKKworCitIb3cgZG9lcyB0aGUgbWVyZ2Ugd29yaz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBzYWlkIHRoaXMgdHV0b3JpYWwgc2hvd3Mgd2hhdCBwbHVtYmluZyBkb2VzIHRvIGhlbHAgeW91IGNvcGUKK3dpdGggdGhlIHBvcmNlbGFpbiB0aGF0IGlzbid0IGZsdXNoaW5nLCBidXQgd2Ugc28gZmFyIGRpZCBub3QKK3RhbGsgYWJvdXQgaG93IHRoZSBtZXJnZSByZWFsbHkgd29ya3MuICBJZiB5b3UgYXJlIGZvbGxvd2luZwordGhpcyB0dXRvcmlhbCB0aGUgZmlyc3QgdGltZSwgSSdkIHN1Z2dlc3QgdG8gc2tpcCB0byAiUHVibGlzaGluZworeW91ciB3b3JrIiBzZWN0aW9uIGFuZCBjb21lIGJhY2sgaGVyZSBsYXRlci4KKworT0ssIHN0aWxsIHdpdGggbWU/ICBUbyBnaXZlIHVzIGFuIGV4YW1wbGUgdG8gbG9vayBhdCwgbGV0J3MgZ28KK2JhY2sgdG8gdGhlIGVhcmxpZXIgcmVwb3NpdG9yeSB3aXRoICJoZWxsbyIgYW5kICJleGFtcGxlIiBmaWxlLAorYW5kIGJyaW5nIG91cnNlbHZlcyBiYWNrIHRvIHRoZSBwcmUtbWVyZ2Ugc3RhdGU6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTMgbWFzdGVyIG15YnJhbmNoCishIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKyAqIFtteWJyYW5jaF0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0KKy0tIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKysqIFttYXN0ZXJeMl0gU29tZSB3b3JrLgorKyogW21hc3Rlcl5dIFNvbWUgZnVuLgorLS0tLS0tLS0tLS0tCisKK1JlbWVtYmVyLCBiZWZvcmUgcnVubmluZyBgZ2l0IG1lcmdlYCwgb3VyIGBtYXN0ZXJgIGhlYWQgd2FzIGF0CisiU29tZSBmdW4uIiBjb21taXQsIHdoaWxlIG91ciBgbXlicmFuY2hgIGhlYWQgd2FzIGF0ICJTb21lCit3b3JrLiIgY29tbWl0LgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15YnJhbmNoCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyXjIKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcmVzZXQgLS1oYXJkIG1hc3Rlcl4KKy0tLS0tLS0tLS0tLQorCitBZnRlciByZXdpbmRpbmcsIHRoZSBjb21taXQgc3RydWN0dXJlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorKiBbbWFzdGVyXSBTb21lIGZ1bi4KKyAhIFtteWJyYW5jaF0gU29tZSB3b3JrLgorLS0KKyArIFtteWJyYW5jaF0gU29tZSB3b3JrLgorKiAgW21hc3Rlcl0gU29tZSBmdW4uCisqKyBbbXlicmFuY2heXSBOZXcgZGF5LgorLS0tLS0tLS0tLS0tCisKK05vdyB3ZSBhcmUgcmVhZHkgdG8gZXhwZXJpbWVudCB3aXRoIHRoZSBtZXJnZSBieSBoYW5kLgorCitgZ2l0IG1lcmdlYCBjb21tYW5kLCB3aGVuIG1lcmdpbmcgdHdvIGJyYW5jaGVzLCB1c2VzIDMtd2F5IG1lcmdlCithbGdvcml0aG0uICBGaXJzdCwgaXQgZmluZHMgdGhlIGNvbW1vbiBhbmNlc3RvciBiZXR3ZWVuIHRoZW0uCitUaGUgY29tbWFuZCBpdCB1c2VzIGlzIGBnaXQtbWVyZ2UtYmFzZWA6CisKKy0tLS0tLS0tLS0tLQorJCBtYj0kKGdpdC1tZXJnZS1iYXNlIEhFQUQgbXlicmFuY2gpCistLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgd3JpdGVzIHRoZSBjb21taXQgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1vbiBhbmNlc3RvcgordG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgc28gd2UgY2FwdHVyZWQgaXRzIG91dHB1dCB0byBhIHZhcmlhYmxlLAorYmVjYXVzZSB3ZSB3aWxsIGJlIHVzaW5nIGl0IGluIHRoZSBuZXh0IHN0ZXAuICBCVFcsIHRoZSBjb21tb24KK2FuY2VzdG9yIGNvbW1pdCBpcyB0aGUgIk5ldyBkYXkuIiBjb21taXQgaW4gdGhpcyBjYXNlLiAgWW91IGNhbgordGVsbCBpdCBieToKKworLS0tLS0tLS0tLS0tCiskIGdpdC1uYW1lLXJldiAkbWIKK215LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tCisKK0FmdGVyIGZpbmRpbmcgb3V0IGEgY29tbW9uIGFuY2VzdG9yIGNvbW1pdCwgdGhlIHNlY29uZCBzdGVwIGlzCit0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkbWIgSEVBRCBteWJyYW5jaAorLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdGhlIHNhbWUgYGdpdC1yZWFkLXRyZWVgIGNvbW1hbmQgd2UgaGF2ZSBhbHJlYWR5IHNlZW4sCitidXQgaXQgdGFrZXMgdGhyZWUgdHJlZXMsIHVubGlrZSBwcmV2aW91cyBleGFtcGxlcy4gIFRoaXMgcmVhZHMKK3RoZSBjb250ZW50cyBvZiBlYWNoIHRyZWUgaW50byBkaWZmZXJlbnQgJ3N0YWdlJyBpbiB0aGUgaW5kZXgKK2ZpbGUgKHRoZSBmaXJzdCB0cmVlIGdvZXMgdG8gc3RhZ2UgMSwgdGhlIHNlY29uZCBzdGFnZSAyLAorZXRjLikuICBBZnRlciByZWFkaW5nIHRocmVlIHRyZWVzIGludG8gdGhyZWUgc3RhZ2VzLCB0aGUgcGF0aHMKK3RoYXQgYXJlIHRoZSBzYW1lIGluIGFsbCB0aHJlZSBzdGFnZXMgYXJlICdjb2xsYXBzZWQnIGludG8gc3RhZ2UKKzAuICBBbHNvIHBhdGhzIHRoYXQgYXJlIHRoZSBzYW1lIGluIHR3byBvZiB0aHJlZSBzdGFnZXMgYXJlCitjb2xsYXBzZWQgaW50byBzdGFnZSAwLCB0YWtpbmcgdGhlIFNIQTEgZnJvbSBlaXRoZXIgc3RhZ2UgMiBvcgorc3RhZ2UgMywgd2hpY2hldmVyIGlzIGRpZmZlcmVudCBmcm9tIHN0YWdlIDEgKGkuZS4gb25seSBvbmUgc2lkZQorY2hhbmdlZCBmcm9tIHRoZSBjb21tb24gYW5jZXN0b3IpLgorCitBZnRlciAnY29sbGFwc2luZycgb3BlcmF0aW9uLCBwYXRocyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gdGhyZWUKK3RyZWVzIGFyZSBsZWZ0IGluIG5vbi16ZXJvIHN0YWdlcy4gIEF0IHRoaXMgcG9pbnQsIHlvdSBjYW4KK2luc3BlY3QgdGhlIGluZGV4IGZpbGUgd2l0aCB0aGlzIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDdmOGIxNDFiNjVmZGNlZTQ3MzIxZTM5OWEyNTk4YTIzNWEwMzI0MjIgMAlleGFtcGxlCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvCistLS0tLS0tLS0tLS0KKworSW4gb3VyIGV4YW1wbGUgb2Ygb25seSB0d28gZmlsZXMsIHdlIGRpZCBub3QgaGF2ZSB1bmNoYW5nZWQKK2ZpbGVzIHNvIG9ubHkgJ2V4YW1wbGUnIHJlc3VsdGVkIGluIGNvbGxhcHNpbmcsIGJ1dCBpbiByZWFsLWxpZmUKK2xhcmdlIHByb2plY3RzLCBvbmx5IHNtYWxsIG51bWJlciBvZiBmaWxlcyBjaGFuZ2UgaW4gb25lIGNvbW1pdCwKK2FuZCB0aGlzICdjb2xsYXBzaW5nJyB0ZW5kcyB0byB0cml2aWFsbHkgbWVyZ2UgbW9zdCBvZiB0aGUgcGF0aHMKK2ZhaXJseSBxdWlja2x5LCBsZWF2aW5nIG9ubHkgYSBoYW5kZnVsIHRoZSByZWFsIGNoYW5nZXMgaW4gbm9uLXplcm8KK3N0YWdlcy4KKworVG8gbG9vayBhdCBvbmx5IG5vbi16ZXJvIHN0YWdlcywgdXNlIGBcLS11bm1lcmdlZGAgZmxhZzoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1scy1maWxlcyAtLXVubWVyZ2VkCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvCistLS0tLS0tLS0tLS0KKworVGhlIG5leHQgc3RlcCBvZiBtZXJnaW5nIGlzIHRvIG1lcmdlIHRoZXNlIHRocmVlIHZlcnNpb25zIG9mIHRoZQorZmlsZSwgdXNpbmcgMy13YXkgbWVyZ2UuICBUaGlzIGlzIGRvbmUgYnkgZ2l2aW5nCitgZ2l0LW1lcmdlLW9uZS1maWxlYCBjb21tYW5kIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzIHRvCitgZ2l0LW1lcmdlLWluZGV4YCBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LW1lcmdlLWluZGV4IGdpdC1tZXJnZS1vbmUtZmlsZSBoZWxsbworQXV0by1tZXJnaW5nIGhlbGxvLgorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBoZWxsby4KK2ZhdGFsOiBtZXJnZSBwcm9ncmFtIGZhaWxlZAorLS0tLS0tLS0tLS0tCisKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIHNjcmlwdCBpcyBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzIHRvCitkZXNjcmliZSB0aG9zZSB0aHJlZSB2ZXJzaW9ucywgYW5kIGlzIHJlc3BvbnNpYmxlIHRvIGxlYXZlIHRoZQorbWVyZ2UgcmVzdWx0cyBpbiB0aGUgd29ya2luZyB0cmVlLgorSXQgaXMgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIHNoZWxsIHNjcmlwdCwgYW5kCitldmVudHVhbGx5IGNhbGxzIGBtZXJnZWAgcHJvZ3JhbSBmcm9tIFJDUyBzdWl0ZSB0byBwZXJmb3JtIGEKK2ZpbGUtbGV2ZWwgMy13YXkgbWVyZ2UuICBJbiB0aGlzIGNhc2UsIGBtZXJnZWAgZGV0ZWN0cworY29uZmxpY3RzLCBhbmQgdGhlIG1lcmdlIHJlc3VsdCB3aXRoIGNvbmZsaWN0IG1hcmtzIGlzIGxlZnQgaW4KK3RoZSB3b3JraW5nIHRyZWUuLiAgVGhpcyBjYW4gYmUgc2VlbiBpZiB5b3UgcnVuIGBscy1maWxlcworLS1zdGFnZWAgYWdhaW4gYXQgdGhpcyBwb2ludDoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1scy1maWxlcyAtLXN0YWdlCisxMDA2NDQgN2Y4YjE0MWI2NWZkY2VlNDczMjFlMzk5YTI1OThhMjM1YTAzMjQyMiAwCWV4YW1wbGUKKzEwMDY0NCAyNjM0MTRmNDIzZDBlNGQ3MGRhZThmZTUzZmEzNDYxNGZmM2UyODYwIDEJaGVsbG8KKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8KKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8KKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHRoZSBzdGF0ZSBvZiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgZmlsZSBhZnRlcgorYGdpdCBtZXJnZWAgcmV0dXJucyBjb250cm9sIGJhY2sgdG8geW91LCBsZWF2aW5nIHRoZSBjb25mbGljdGluZworbWVyZ2UgZm9yIHlvdSB0byByZXNvbHZlLiAgTm90aWNlIHRoYXQgdGhlIHBhdGggYGhlbGxvYCBpcyBzdGlsbAordW5tZXJnZWQsIGFuZCB3aGF0IHlvdSBzZWUgd2l0aCBgZ2l0IGRpZmZgIGF0IHRoaXMgcG9pbnQgaXMKK2RpZmZlcmVuY2VzIHNpbmNlIHN0YWdlIDIgKGkuZS4geW91ciB2ZXJzaW9uKS4KKworCitQdWJsaXNoaW5nIHlvdXIgd29yaworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28sIHdlIGNhbiB1c2Ugc29tZWJvZHkgZWxzZSdzIHdvcmsgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LCBidXQKK2hvdyBjYW4gKnlvdSogcHJlcGFyZSBhIHJlcG9zaXRvcnkgdG8gbGV0IG90aGVyIHBlb3BsZSBwdWxsIGZyb20KK2l0PworCitZb3UgZG8geW91ciByZWFsIHdvcmsgaW4geW91ciB3b3JraW5nIHRyZWUgdGhhdCBoYXMgeW91cgorcHJpbWFyeSByZXBvc2l0b3J5IGhhbmdpbmcgdW5kZXIgaXQgYXMgaXRzIGAuZ2l0YCBzdWJkaXJlY3RvcnkuCitZb3UgKmNvdWxkKiBtYWtlIHRoYXQgcmVwb3NpdG9yeSBhY2Nlc3NpYmxlIHJlbW90ZWx5IGFuZCBhc2sKK3Blb3BsZSB0byBwdWxsIGZyb20gaXQsIGJ1dCBpbiBwcmFjdGljZSB0aGF0IGlzIG5vdCB0aGUgd2F5Cit0aGluZ3MgYXJlIHVzdWFsbHkgZG9uZS4gQSByZWNvbW1lbmRlZCB3YXkgaXMgdG8gaGF2ZSBhIHB1YmxpYworcmVwb3NpdG9yeSwgbWFrZSBpdCByZWFjaGFibGUgYnkgb3RoZXIgcGVvcGxlLCBhbmQgd2hlbiB0aGUKK2NoYW5nZXMgeW91IG1hZGUgaW4geW91ciBwcmltYXJ5IHdvcmtpbmcgdHJlZSBhcmUgaW4gZ29vZCBzaGFwZSwKK3VwZGF0ZSB0aGUgcHVibGljIHJlcG9zaXRvcnkgZnJvbSBpdC4gVGhpcyBpcyBvZnRlbiBjYWxsZWQKKydwdXNoaW5nJy4KKworW05PVEVdCitUaGlzIHB1YmxpYyByZXBvc2l0b3J5IGNvdWxkIGZ1cnRoZXIgYmUgbWlycm9yZWQsIGFuZCB0aGF0IGlzCitob3cgZ2l0IHJlcG9zaXRvcmllcyBhdCBga2VybmVsLm9yZ2AgYXJlIG1hbmFnZWQuCisKK1B1Ymxpc2hpbmcgdGhlIGNoYW5nZXMgZnJvbSB5b3VyIGxvY2FsIChwcml2YXRlKSByZXBvc2l0b3J5IHRvCit5b3VyIHJlbW90ZSAocHVibGljKSByZXBvc2l0b3J5IHJlcXVpcmVzIGEgd3JpdGUgcHJpdmlsZWdlIG9uCit0aGUgcmVtb3RlIG1hY2hpbmUuIFlvdSBuZWVkIHRvIGhhdmUgYW4gU1NIIGFjY291bnQgdGhlcmUgdG8KK3J1biBhIHNpbmdsZSBjb21tYW5kLCBgZ2l0LXJlY2VpdmUtcGFja2AuCisKK0ZpcnN0LCB5b3UgbmVlZCB0byBjcmVhdGUgYW4gZW1wdHkgcmVwb3NpdG9yeSBvbiB0aGUgcmVtb3RlCittYWNoaW5lIHRoYXQgd2lsbCBob3VzZSB5b3VyIHB1YmxpYyByZXBvc2l0b3J5LiBUaGlzIGVtcHR5CityZXBvc2l0b3J5IHdpbGwgYmUgcG9wdWxhdGVkIGFuZCBiZSBrZXB0IHVwLXRvLWRhdGUgYnkgcHVzaGluZworaW50byBpdCBsYXRlci4gT2J2aW91c2x5LCB0aGlzIHJlcG9zaXRvcnkgY3JlYXRpb24gbmVlZHMgdG8gYmUKK2RvbmUgb25seSBvbmNlLgorCitbTk9URV0KK2BnaXQgcHVzaGAgdXNlcyBhIHBhaXIgb2YgcHJvZ3JhbXMsCitgZ2l0LXNlbmQtcGFja2Agb24geW91ciBsb2NhbCBtYWNoaW5lLCBhbmQgYGdpdC1yZWNlaXZlLXBhY2tgCitvbiB0aGUgcmVtb3RlIG1hY2hpbmUuIFRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHR3byBvdmVyCit0aGUgbmV0d29yayBpbnRlcm5hbGx5IHVzZXMgYW4gU1NIIGNvbm5lY3Rpb24uCisKK1lvdXIgcHJpdmF0ZSByZXBvc2l0b3J5J3MgZ2l0IGRpcmVjdG9yeSBpcyB1c3VhbGx5IGAuZ2l0YCwgYnV0Cit5b3VyIHB1YmxpYyByZXBvc2l0b3J5IGlzIG9mdGVuIG5hbWVkIGFmdGVyIHRoZSBwcm9qZWN0IG5hbWUsCitpLmUuIGA8cHJvamVjdD4uZ2l0YC4gTGV0J3MgY3JlYXRlIHN1Y2ggYSBwdWJsaWMgcmVwb3NpdG9yeSBmb3IKK3Byb2plY3QgYG15LWdpdGAuIEFmdGVyIGxvZ2dpbmcgaW50byB0aGUgcmVtb3RlIG1hY2hpbmUsIGNyZWF0ZQorYW4gZW1wdHkgZGlyZWN0b3J5OgorCistLS0tLS0tLS0tLS0KKyQgbWtkaXIgbXktZ2l0LmdpdAorLS0tLS0tLS0tLS0tCisKK1RoZW4sIG1ha2UgdGhhdCBkaXJlY3RvcnkgaW50byBhIGdpdCByZXBvc2l0b3J5IGJ5IHJ1bm5pbmcKK2BnaXQgaW5pdGAsIGJ1dCB0aGlzIHRpbWUsIHNpbmNlIGl0cyBuYW1lIGlzIG5vdCB0aGUgdXN1YWwKK2AuZ2l0YCwgd2UgZG8gdGhpbmdzIHNsaWdodGx5IGRpZmZlcmVudGx5OgorCistLS0tLS0tLS0tLS0KKyQgR0lUX0RJUj1teS1naXQuZ2l0IGdpdC1pbml0CistLS0tLS0tLS0tLS0KKworTWFrZSBzdXJlIHRoaXMgZGlyZWN0b3J5IGlzIGF2YWlsYWJsZSBmb3Igb3RoZXJzIHlvdSB3YW50IHlvdXIKK2NoYW5nZXMgdG8gYmUgcHVsbGVkIGJ5IHZpYSB0aGUgdHJhbnNwb3J0IG9mIHlvdXIgY2hvaWNlLiBBbHNvCit5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgYGdpdC1yZWNlaXZlLXBhY2tgCitwcm9ncmFtIG9uIHRoZSBgJFBBVEhgLgorCitbTk9URV0KK01hbnkgaW5zdGFsbGF0aW9ucyBvZiBzc2hkIGRvIG5vdCBpbnZva2UgeW91ciBzaGVsbCBhcyB0aGUgbG9naW4KK3NoZWxsIHdoZW4geW91IGRpcmVjdGx5IHJ1biBwcm9ncmFtczsgd2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgaWYKK3lvdXIgbG9naW4gc2hlbGwgaXMgYGJhc2hgLCBvbmx5IGAuYmFzaHJjYCBpcyByZWFkIGFuZCBub3QKK2AuYmFzaF9wcm9maWxlYC4gQXMgYSB3b3JrYXJvdW5kLCBtYWtlIHN1cmUgYC5iYXNocmNgIHNldHMgdXAKK2AkUEFUSGAgc28gdGhhdCB5b3UgY2FuIHJ1biBgZ2l0LXJlY2VpdmUtcGFja2AgcHJvZ3JhbS4KKworW05PVEVdCitJZiB5b3UgcGxhbiB0byBwdWJsaXNoIHRoaXMgcmVwb3NpdG9yeSB0byBiZSBhY2Nlc3NlZCBvdmVyIGh0dHAsCit5b3Ugc2hvdWxkIGRvIGBjaG1vZCAreCBteS1naXQuZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlYCBhdCB0aGlzCitwb2ludC4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IGV2ZXJ5IHRpbWUgeW91IHB1c2ggaW50byB0aGlzCityZXBvc2l0b3J5LCBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AgaXMgcnVuLgorCitZb3VyICJwdWJsaWMgcmVwb3NpdG9yeSIgaXMgbm93IHJlYWR5IHRvIGFjY2VwdCB5b3VyIGNoYW5nZXMuCitDb21lIGJhY2sgdG8gdGhlIG1hY2hpbmUgeW91IGhhdmUgeW91ciBwcml2YXRlIHJlcG9zaXRvcnkuIEZyb20KK3RoZXJlLCBydW4gdGhpcyBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggPHB1YmxpYy1ob3N0PjovcGF0aC90by9teS1naXQuZ2l0IG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1RoaXMgc3luY2hyb25pemVzIHlvdXIgcHVibGljIHJlcG9zaXRvcnkgdG8gbWF0Y2ggdGhlIG5hbWVkCiticmFuY2ggaGVhZCAoaS5lLiBgbWFzdGVyYCBpbiB0aGlzIGNhc2UpIGFuZCBvYmplY3RzIHJlYWNoYWJsZQorZnJvbSB0aGVtIGluIHlvdXIgY3VycmVudCByZXBvc2l0b3J5LgorCitBcyBhIHJlYWwgZXhhbXBsZSwgdGhpcyBpcyBob3cgSSB1cGRhdGUgbXkgcHVibGljIGdpdAorcmVwb3NpdG9yeS4gS2VybmVsLm9yZyBtaXJyb3IgbmV0d29yayB0YWtlcyBjYXJlIG9mIHRoZQorcHJvcGFnYXRpb24gdG8gb3RoZXIgcHVibGljbHkgdmlzaWJsZSBtYWNoaW5lczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIG1hc3Rlci5rZXJuZWwub3JnOi9wdWIvc2NtL2dpdC9naXQuZ2l0LyAKKy0tLS0tLS0tLS0tLQorCisKK1BhY2tpbmcgeW91ciByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYXJsaWVyLCB3ZSBzYXcgdGhhdCBvbmUgZmlsZSB1bmRlciBgLmdpdC9vYmplY3RzLz8/L2AgZGlyZWN0b3J5CitpcyBzdG9yZWQgZm9yIGVhY2ggZ2l0IG9iamVjdCB5b3UgY3JlYXRlLiBUaGlzIHJlcHJlc2VudGF0aW9uCitpcyBlZmZpY2llbnQgdG8gY3JlYXRlIGF0b21pY2FsbHkgYW5kIHNhZmVseSwgYnV0Citub3Qgc28gY29udmVuaWVudCB0byB0cmFuc3BvcnQgb3ZlciB0aGUgbmV0d29yay4gU2luY2UgZ2l0IG9iamVjdHMgYXJlCitpbW11dGFibGUgb25jZSB0aGV5IGFyZSBjcmVhdGVkLCB0aGVyZSBpcyBhIHdheSB0byBvcHRpbWl6ZSB0aGUKK3N0b3JhZ2UgYnkgInBhY2tpbmcgdGhlbSB0b2dldGhlciIuIFRoZSBjb21tYW5kCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrCistLS0tLS0tLS0tLS0KKword2lsbCBkbyBpdCBmb3IgeW91LiBJZiB5b3UgZm9sbG93ZWQgdGhlIHR1dG9yaWFsIGV4YW1wbGVzLCB5b3UKK3dvdWxkIGhhdmUgYWNjdW11bGF0ZWQgYWJvdXQgMTcgb2JqZWN0cyBpbiBgLmdpdC9vYmplY3RzLz8/L2AKK2RpcmVjdG9yaWVzIGJ5IG5vdy4gYGdpdCByZXBhY2tgIHRlbGxzIHlvdSBob3cgbWFueSBvYmplY3RzIGl0CitwYWNrZWQsIGFuZCBzdG9yZXMgdGhlIHBhY2tlZCBmaWxlIGluIGAuZ2l0L29iamVjdHMvcGFja2AKK2RpcmVjdG9yeS4KKworW05PVEVdCitZb3Ugd2lsbCBzZWUgdHdvIGZpbGVzLCBgcGFjay1cKi5wYWNrYCBhbmQgYHBhY2stXCouaWR4YCwKK2luIGAuZ2l0L29iamVjdHMvcGFja2AgZGlyZWN0b3J5LiBUaGV5IGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8KK2VhY2ggb3RoZXIsIGFuZCBpZiB5b3UgZXZlciBjb3B5IHRoZW0gYnkgaGFuZCB0byBhIGRpZmZlcmVudAorcmVwb3NpdG9yeSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB5b3UgY29weQordGhlbSB0b2dldGhlci4gVGhlIGZvcm1lciBob2xkcyBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgb2JqZWN0cworaW4gdGhlIHBhY2ssIGFuZCB0aGUgbGF0dGVyIGhvbGRzIHRoZSBpbmRleCBmb3IgcmFuZG9tCithY2Nlc3MuCisKK0lmIHlvdSBhcmUgcGFyYW5vaWQsIHJ1bm5pbmcgYGdpdC12ZXJpZnktcGFja2AgY29tbWFuZCB3b3VsZAorZGV0ZWN0IGlmIHlvdSBoYXZlIGEgY29ycnVwdCBwYWNrLCBidXQgZG8gbm90IHdvcnJ5IHRvbyBtdWNoLgorT3VyIHByb2dyYW1zIGFyZSBhbHdheXMgcGVyZmVjdCA7LSkuCisKK09uY2UgeW91IGhhdmUgcGFja2VkIG9iamVjdHMsIHlvdSBkbyBub3QgbmVlZCB0byBsZWF2ZSB0aGUKK3VucGFja2VkIG9iamVjdHMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoZSBwYWNrIGZpbGUgYW55bW9yZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBwcnVuZS1wYWNrZWQKKy0tLS0tLS0tLS0tLQorCit3b3VsZCByZW1vdmUgdGhlbSBmb3IgeW91LgorCitZb3UgY2FuIHRyeSBydW5uaW5nIGBmaW5kIC5naXQvb2JqZWN0cyAtdHlwZSBmYCBiZWZvcmUgYW5kIGFmdGVyCit5b3UgcnVuIGBnaXQgcHJ1bmUtcGFja2VkYCBpZiB5b3UgYXJlIGN1cmlvdXMuICBBbHNvIGBnaXQKK2NvdW50LW9iamVjdHNgIHdvdWxkIHRlbGwgeW91IGhvdyBtYW55IHVucGFja2VkIG9iamVjdHMgYXJlIGluCit5b3VyIHJlcG9zaXRvcnkgYW5kIGhvdyBtdWNoIHNwYWNlIHRoZXkgYXJlIGNvbnN1bWluZy4KKworW05PVEVdCitgZ2l0IHB1bGxgIGlzIHNsaWdodGx5IGN1bWJlcnNvbWUgZm9yIEhUVFAgdHJhbnNwb3J0LCBhcyBhCitwYWNrZWQgcmVwb3NpdG9yeSBtYXkgY29udGFpbiByZWxhdGl2ZWx5IGZldyBvYmplY3RzIGluIGEKK3JlbGF0aXZlbHkgbGFyZ2UgcGFjay4gSWYgeW91IGV4cGVjdCBtYW55IEhUVFAgcHVsbHMgZnJvbSB5b3VyCitwdWJsaWMgcmVwb3NpdG9yeSB5b3UgbWlnaHQgd2FudCB0byByZXBhY2sgJiBwcnVuZSBvZnRlbiwgb3IKK25ldmVyLgorCitJZiB5b3UgcnVuIGBnaXQgcmVwYWNrYCBhZ2FpbiBhdCB0aGlzIHBvaW50LCBpdCB3aWxsIHNheQorIk5vdGhpbmcgdG8gcGFjayIuIE9uY2UgeW91IGNvbnRpbnVlIHlvdXIgZGV2ZWxvcG1lbnQgYW5kCithY2N1bXVsYXRlIHRoZSBjaGFuZ2VzLCBydW5uaW5nIGBnaXQgcmVwYWNrYCBhZ2FpbiB3aWxsIGNyZWF0ZSBhCituZXcgcGFjaywgdGhhdCBjb250YWlucyBvYmplY3RzIGNyZWF0ZWQgc2luY2UgeW91IHBhY2tlZCB5b3VyCityZXBvc2l0b3J5IHRoZSBsYXN0IHRpbWUuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSBwYWNrIHlvdXIgcHJvamVjdAorc29vbiBhZnRlciB0aGUgaW5pdGlhbCBpbXBvcnQgKHVubGVzcyB5b3UgYXJlIHN0YXJ0aW5nIHlvdXIKK3Byb2plY3QgZnJvbSBzY3JhdGNoKSwgYW5kIHRoZW4gcnVuIGBnaXQgcmVwYWNrYCBldmVyeSBvbmNlIGluIGEKK3doaWxlLCBkZXBlbmRpbmcgb24gaG93IGFjdGl2ZSB5b3VyIHByb2plY3QgaXMuCisKK1doZW4gYSByZXBvc2l0b3J5IGlzIHN5bmNocm9uaXplZCB2aWEgYGdpdCBwdXNoYCBhbmQgYGdpdCBwdWxsYAorb2JqZWN0cyBwYWNrZWQgaW4gdGhlIHNvdXJjZSByZXBvc2l0b3J5IGFyZSB1c3VhbGx5IHN0b3JlZAordW5wYWNrZWQgaW4gdGhlIGRlc3RpbmF0aW9uLCB1bmxlc3MgcnN5bmMgdHJhbnNwb3J0IGlzIHVzZWQuCitXaGlsZSB0aGlzIGFsbG93cyB5b3UgdG8gdXNlIGRpZmZlcmVudCBwYWNraW5nIHN0cmF0ZWdpZXMgb24KK2JvdGggZW5kcywgaXQgYWxzbyBtZWFucyB5b3UgbWF5IG5lZWQgdG8gcmVwYWNrIGJvdGgKK3JlcG9zaXRvcmllcyBldmVyeSBvbmNlIGluIGEgd2hpbGUuCisKKworV29ya2luZyB3aXRoIE90aGVycworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCBnaXQgaXMgYSB0cnVseSBkaXN0cmlidXRlZCBzeXN0ZW0sIGl0IGlzIG9mdGVuCitjb252ZW5pZW50IHRvIG9yZ2FuaXplIHlvdXIgcHJvamVjdCB3aXRoIGFuIGluZm9ybWFsIGhpZXJhcmNoeQorb2YgZGV2ZWxvcGVycy4gTGludXgga2VybmVsIGRldmVsb3BtZW50IGlzIHJ1biB0aGlzIHdheS4gVGhlcmUKK2lzIGEgbmljZSBpbGx1c3RyYXRpb24gKHBhZ2UgMTcsICJNZXJnZXMgdG8gTWFpbmxpbmUiKSBpbgorbGluazpodHRwOi8vdGlueXVybC5jb20vYTJqZGdbUmFuZHkgRHVubGFwJ3MgcHJlc2VudGF0aW9uXS4KKworSXQgc2hvdWxkIGJlIHN0cmVzc2VkIHRoYXQgdGhpcyBoaWVyYXJjaHkgaXMgcHVyZWx5ICppbmZvcm1hbCouCitUaGVyZSBpcyBub3RoaW5nIGZ1bmRhbWVudGFsIGluIGdpdCB0aGF0IGVuZm9yY2VzIHRoZSAiY2hhaW4gb2YKK3BhdGNoIGZsb3ciIHRoaXMgaGllcmFyY2h5IGltcGxpZXMuIFlvdSBkbyBub3QgaGF2ZSB0byBwdWxsCitmcm9tIG9ubHkgb25lIHJlbW90ZSByZXBvc2l0b3J5LgorCitBIHJlY29tbWVuZGVkIHdvcmtmbG93IGZvciBhICJwcm9qZWN0IGxlYWQiIGdvZXMgbGlrZSB0aGlzOgorCisxLiBQcmVwYXJlIHlvdXIgcHJpbWFyeSByZXBvc2l0b3J5IG9uIHlvdXIgbG9jYWwgbWFjaGluZS4gWW91cgorICAgd29yayBpcyBkb25lIHRoZXJlLgorCisyLiBQcmVwYXJlIGEgcHVibGljIHJlcG9zaXRvcnkgYWNjZXNzaWJsZSB0byBvdGhlcnMuCisrCitJZiBvdGhlciBwZW9wbGUgYXJlIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgb3ZlciBkdW1iCit0cmFuc3BvcnQgcHJvdG9jb2xzIChIVFRQKSwgeW91IG5lZWQgdG8ga2VlcCB0aGlzIHJlcG9zaXRvcnkKKydkdW1iIHRyYW5zcG9ydCBmcmllbmRseScuICBBZnRlciBgZ2l0IGluaXRgLAorYCRHSVRfRElSL2hvb2tzL3Bvc3QtdXBkYXRlYCBjb3BpZWQgZnJvbSB0aGUgc3RhbmRhcmQgdGVtcGxhdGVzCit3b3VsZCBjb250YWluIGEgY2FsbCB0byBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AgYnV0IHRoZQorYHBvc3QtdXBkYXRlYCBob29rIGl0c2VsZiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IC0tIGVuYWJsZSBpdAord2l0aCBgY2htb2QgK3ggcG9zdC11cGRhdGVgLiAgVGhpcyBtYWtlcyBzdXJlIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYAora2VlcHMgdGhlIG5lY2Vzc2FyeSBmaWxlcyB1cC10by1kYXRlLgorCiszLiBQdXNoIGludG8gdGhlIHB1YmxpYyByZXBvc2l0b3J5IGZyb20geW91ciBwcmltYXJ5CisgICByZXBvc2l0b3J5LgorCis0LiBgZ2l0IHJlcGFja2AgdGhlIHB1YmxpYyByZXBvc2l0b3J5LiBUaGlzIGVzdGFibGlzaGVzIGEgYmlnCisgICBwYWNrIHRoYXQgY29udGFpbnMgdGhlIGluaXRpYWwgc2V0IG9mIG9iamVjdHMgYXMgdGhlCisgICBiYXNlbGluZSwgYW5kIHBvc3NpYmx5IGBnaXQgcHJ1bmVgIGlmIHRoZSB0cmFuc3BvcnQKKyAgIHVzZWQgZm9yIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgc3VwcG9ydHMgcGFja2VkCisgICByZXBvc2l0b3JpZXMuCisKKzUuIEtlZXAgd29ya2luZyBpbiB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeS4gWW91ciBjaGFuZ2VzCisgICBpbmNsdWRlIG1vZGlmaWNhdGlvbnMgb2YgeW91ciBvd24sIHBhdGNoZXMgeW91IHJlY2VpdmUgdmlhCisgICBlLW1haWxzLCBhbmQgbWVyZ2VzIHJlc3VsdGluZyBmcm9tIHB1bGxpbmcgdGhlICJwdWJsaWMiCisgICByZXBvc2l0b3JpZXMgb2YgeW91ciAic3Vic3lzdGVtIG1haW50YWluZXJzIi4KKysKK1lvdSBjYW4gcmVwYWNrIHRoaXMgcHJpdmF0ZSByZXBvc2l0b3J5IHdoZW5ldmVyIHlvdSBmZWVsIGxpa2UuCisKKzYuIFB1c2ggeW91ciBjaGFuZ2VzIHRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSwgYW5kIGFubm91bmNlIGl0CisgICB0byB0aGUgcHVibGljLgorCis3LiBFdmVyeSBvbmNlIGluIGEgd2hpbGUsICJnaXQgcmVwYWNrIiB0aGUgcHVibGljIHJlcG9zaXRvcnkuCisgICBHbyBiYWNrIHRvIHN0ZXAgNS4gYW5kIGNvbnRpbnVlIHdvcmtpbmcuCisKKworQSByZWNvbW1lbmRlZCB3b3JrIGN5Y2xlIGZvciBhICJzdWJzeXN0ZW0gbWFpbnRhaW5lciIgd2hvIHdvcmtzCitvbiB0aGF0IHByb2plY3QgYW5kIGhhcyBhbiBvd24gInB1YmxpYyByZXBvc2l0b3J5IiBnb2VzIGxpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHdvcmsgcmVwb3NpdG9yeSwgYnkgYGdpdCBjbG9uZWAgdGhlIHB1YmxpYworICAgcmVwb3NpdG9yeSBvZiB0aGUgInByb2plY3QgbGVhZCIuIFRoZSBVUkwgdXNlZCBmb3IgdGhlCisgICBpbml0aWFsIGNsb25pbmcgaXMgc3RvcmVkIGluIHRoZSByZW1vdGUub3JpZ2luLnVybAorICAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KKworMi4gUHJlcGFyZSBhIHB1YmxpYyByZXBvc2l0b3J5IGFjY2Vzc2libGUgdG8gb3RoZXJzLCBqdXN0IGxpa2UKKyAgIHRoZSAicHJvamVjdCBsZWFkIiBwZXJzb24gZG9lcy4KKworMy4gQ29weSBvdmVyIHRoZSBwYWNrZWQgZmlsZXMgZnJvbSAicHJvamVjdCBsZWFkIiBwdWJsaWMKKyAgIHJlcG9zaXRvcnkgdG8geW91ciBwdWJsaWMgcmVwb3NpdG9yeSwgdW5sZXNzIHRoZSAicHJvamVjdAorICAgbGVhZCIgcmVwb3NpdG9yeSBsaXZlcyBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHlvdXJzLiAgSW4gdGhlCisgICBsYXR0ZXIgY2FzZSwgeW91IGNhbiB1c2UgYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBmaWxlIHRvCisgICBwb2ludCBhdCB0aGUgcmVwb3NpdG9yeSB5b3UgYXJlIGJvcnJvd2luZyBmcm9tLgorCis0LiBQdXNoIGludG8gdGhlIHB1YmxpYyByZXBvc2l0b3J5IGZyb20geW91ciBwcmltYXJ5CisgICByZXBvc2l0b3J5LiBSdW4gYGdpdCByZXBhY2tgLCBhbmQgcG9zc2libHkgYGdpdCBwcnVuZWAgaWYgdGhlCisgICB0cmFuc3BvcnQgdXNlZCBmb3IgcHVsbGluZyBmcm9tIHlvdXIgcmVwb3NpdG9yeSBzdXBwb3J0cworICAgcGFja2VkIHJlcG9zaXRvcmllcy4KKworNS4gS2VlcCB3b3JraW5nIGluIHlvdXIgcHJpbWFyeSByZXBvc2l0b3J5LiBZb3VyIGNoYW5nZXMKKyAgIGluY2x1ZGUgbW9kaWZpY2F0aW9ucyBvZiB5b3VyIG93biwgcGF0Y2hlcyB5b3UgcmVjZWl2ZSB2aWEKKyAgIGUtbWFpbHMsIGFuZCBtZXJnZXMgcmVzdWx0aW5nIGZyb20gcHVsbGluZyB0aGUgInB1YmxpYyIKKyAgIHJlcG9zaXRvcmllcyBvZiB5b3VyICJwcm9qZWN0IGxlYWQiIGFuZCBwb3NzaWJseSB5b3VyCisgICAic3ViLXN1YnN5c3RlbSBtYWludGFpbmVycyIuCisrCitZb3UgY2FuIHJlcGFjayB0aGlzIHByaXZhdGUgcmVwb3NpdG9yeSB3aGVuZXZlciB5b3UgZmVlbAorbGlrZS4KKworNi4gUHVzaCB5b3VyIGNoYW5nZXMgdG8geW91ciBwdWJsaWMgcmVwb3NpdG9yeSwgYW5kIGFzayB5b3VyCisgICAicHJvamVjdCBsZWFkIiBhbmQgcG9zc2libHkgeW91ciAic3ViLXN1YnN5c3RlbQorICAgbWFpbnRhaW5lcnMiIHRvIHB1bGwgZnJvbSBpdC4KKworNy4gRXZlcnkgb25jZSBpbiBhIHdoaWxlLCBgZ2l0IHJlcGFja2AgdGhlIHB1YmxpYyByZXBvc2l0b3J5LgorICAgR28gYmFjayB0byBzdGVwIDUuIGFuZCBjb250aW51ZSB3b3JraW5nLgorCisKK0EgcmVjb21tZW5kZWQgd29yayBjeWNsZSBmb3IgYW4gImluZGl2aWR1YWwgZGV2ZWxvcGVyIiB3aG8gZG9lcworbm90IGhhdmUgYSAicHVibGljIiByZXBvc2l0b3J5IGlzIHNvbWV3aGF0IGRpZmZlcmVudC4gSXQgZ29lcworbGlrZSB0aGlzOgorCisxLiBQcmVwYXJlIHlvdXIgd29yayByZXBvc2l0b3J5LCBieSBgZ2l0IGNsb25lYCB0aGUgcHVibGljCisgICByZXBvc2l0b3J5IG9mIHRoZSAicHJvamVjdCBsZWFkIiAob3IgYSAic3Vic3lzdGVtCisgICBtYWludGFpbmVyIiwgaWYgeW91IHdvcmsgb24gYSBzdWJzeXN0ZW0pLiBUaGUgVVJMIHVzZWQgZm9yCisgICB0aGUgaW5pdGlhbCBjbG9uaW5nIGlzIHN0b3JlZCBpbiB0aGUgcmVtb3RlLm9yaWdpbi51cmwKKyAgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKzIuIERvIHlvdXIgd29yayBpbiB5b3VyIHJlcG9zaXRvcnkgb24gJ21hc3RlcicgYnJhbmNoLgorCiszLiBSdW4gYGdpdCBmZXRjaCBvcmlnaW5gIGZyb20gdGhlIHB1YmxpYyByZXBvc2l0b3J5IG9mIHlvdXIKKyAgIHVwc3RyZWFtIGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4gVGhpcyBkb2VzIG9ubHkgdGhlIGZpcnN0CisgICBoYWxmIG9mIGBnaXQgcHVsbGAgYnV0IGRvZXMgbm90IG1lcmdlLiBUaGUgaGVhZCBvZiB0aGUKKyAgIHB1YmxpYyByZXBvc2l0b3J5IGlzIHN0b3JlZCBpbiBgLmdpdC9yZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcmAuCisKKzQuIFVzZSBgZ2l0IGNoZXJyeSBvcmlnaW5gIHRvIHNlZSB3aGljaCBvbmVzIG9mIHlvdXIgcGF0Y2hlcworICAgd2VyZSBhY2NlcHRlZCwgYW5kL29yIHVzZSBgZ2l0IHJlYmFzZSBvcmlnaW5gIHRvIHBvcnQgeW91cgorICAgdW5tZXJnZWQgY2hhbmdlcyBmb3J3YXJkIHRvIHRoZSB1cGRhdGVkIHVwc3RyZWFtLgorCis1LiBVc2UgYGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luYCB0byBwcmVwYXJlIHBhdGNoZXMgZm9yIGUtbWFpbAorICAgc3VibWlzc2lvbiB0byB5b3VyIHVwc3RyZWFtIGFuZCBzZW5kIGl0IG91dC4gR28gYmFjayB0bworICAgc3RlcCAyLiBhbmQgY29udGludWUuCisKKworV29ya2luZyB3aXRoIE90aGVycywgU2hhcmVkIFJlcG9zaXRvcnkgU3R5bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhcmUgY29taW5nIGZyb20gQ1ZTIGJhY2tncm91bmQsIHRoZSBzdHlsZSBvZiBjb29wZXJhdGlvbgorc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIG1heSBiZSBuZXcgdG8geW91LiBZb3UgZG8gbm90CitoYXZlIHRvIHdvcnJ5LiBnaXQgc3VwcG9ydHMgInNoYXJlZCBwdWJsaWMgcmVwb3NpdG9yeSIgc3R5bGUgb2YKK2Nvb3BlcmF0aW9uIHlvdSBhcmUgcHJvYmFibHkgbW9yZSBmYW1pbGlhciB3aXRoIGFzIHdlbGwuCisKK1NlZSBsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtnaXQgZm9yIENWUyB1c2Vyc10gZm9yIHRoZSBkZXRhaWxzLgorCitCdW5kbGluZyB5b3VyIHdvcmsgdG9nZXRoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBsaWtlbHkgdGhhdCB5b3Ugd2lsbCBiZSB3b3JraW5nIG9uIG1vcmUgdGhhbiBvbmUgdGhpbmcgYXQKK2EgdGltZS4gIEl0IGlzIGVhc3kgdG8gbWFuYWdlIHRob3NlIG1vcmUtb3ItbGVzcyBpbmRlcGVuZGVudCB0YXNrcwordXNpbmcgYnJhbmNoZXMgd2l0aCBnaXQuCisKK1dlIGhhdmUgYWxyZWFkeSBzZWVuIGhvdyBicmFuY2hlcyB3b3JrIHByZXZpb3VzbHksCit3aXRoICJmdW4gYW5kIHdvcmsiIGV4YW1wbGUgdXNpbmcgdHdvIGJyYW5jaGVzLiAgVGhlIGlkZWEgaXMgdGhlCitzYW1lIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gdHdvIGJyYW5jaGVzLiAgTGV0J3Mgc2F5IHlvdSBzdGFydGVkCitvdXQgZnJvbSAibWFzdGVyIiBoZWFkLCBhbmQgaGF2ZSBzb21lIG5ldyBjb2RlIGluIHRoZSAibWFzdGVyIgorYnJhbmNoLCBhbmQgdHdvIGluZGVwZW5kZW50IGZpeGVzIGluIHRoZSAiY29tbWl0LWZpeCIgYW5kCisiZGlmZi1maXgiIGJyYW5jaGVzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKy0tLQorICsgIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyAgW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKysgICBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgICogW21hc3Rlcl0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKysrKiBbZGlmZi1maXh+Ml0gUHJldHR5LXByaW50IG1lc3NhZ2VzLgorLS0tLS0tLS0tLS0tCisKK0JvdGggZml4ZXMgYXJlIHRlc3RlZCB3ZWxsLCBhbmQgYXQgdGhpcyBwb2ludCwgeW91IHdhbnQgdG8gbWVyZ2UKK2luIGJvdGggb2YgdGhlbS4gIFlvdSBjb3VsZCBtZXJnZSBpbiAnZGlmZi1maXgnIGZpcnN0IGFuZCB0aGVuCisnY29tbWl0LWZpeCcgbmV4dCwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlICdNZXJnZSBmaXggaW4gZGlmZi1maXgnIG1hc3RlciBkaWZmLWZpeAorJCBnaXQgbWVyZ2UgJ01lcmdlIGZpeCBpbiBjb21taXQtZml4JyBtYXN0ZXIgY29tbWl0LWZpeAorLS0tLS0tLS0tLS0tCisKK1doaWNoIHdvdWxkIHJlc3VsdCBpbjoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorISBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgISBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICAqIFttYXN0ZXJdIE1lcmdlIGZpeCBpbiBjb21taXQtZml4CistLS0KKyAgLSBbbWFzdGVyXSBNZXJnZSBmaXggaW4gY29tbWl0LWZpeAorKyAqIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAgLSBbbWFzdGVyfjFdIE1lcmdlIGZpeCBpbiBkaWZmLWZpeAorICsqIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyogW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKyAgKiBbbWFzdGVyfjJdIFJlbGVhc2UgY2FuZGlkYXRlICMxCisrKyogW21hc3Rlcn4zXSBQcmV0dHktcHJpbnQgbWVzc2FnZXMuCistLS0tLS0tLS0tLS0KKworSG93ZXZlciwgdGhlcmUgaXMgbm8gcGFydGljdWxhciByZWFzb24gdG8gbWVyZ2UgaW4gb25lIGJyYW5jaAorZmlyc3QgYW5kIHRoZSBvdGhlciBuZXh0LCB3aGVuIHdoYXQgeW91IGhhdmUgYXJlIGEgc2V0IG9mIHRydWx5CitpbmRlcGVuZGVudCBjaGFuZ2VzIChpZiB0aGUgb3JkZXIgbWF0dGVyZWQsIHRoZW4gdGhleSBhcmUgbm90CitpbmRlcGVuZGVudCBieSBkZWZpbml0aW9uKS4gIFlvdSBjb3VsZCBpbnN0ZWFkIG1lcmdlIHRob3NlIHR3bworYnJhbmNoZXMgaW50byB0aGUgY3VycmVudCBicmFuY2ggYXQgb25jZS4gIEZpcnN0IGxldCdzIHVuZG8gd2hhdAord2UganVzdCBkaWQgYW5kIHN0YXJ0IG92ZXIuICBXZSB3b3VsZCB3YW50IHRvIGdldCB0aGUgbWFzdGVyCiticmFuY2ggYmVmb3JlIHRoZXNlIHR3byBtZXJnZXMgYnkgcmVzZXR0aW5nIGl0IHRvICdtYXN0ZXJ+Mic6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQgLS1oYXJkIG1hc3Rlcn4yCistLS0tLS0tLS0tLS0KKworWW91IGNhbiBtYWtlIHN1cmUgJ2dpdCBzaG93LWJyYW5jaCcgbWF0Y2hlcyB0aGUgc3RhdGUgYmVmb3JlCit0aG9zZSB0d28gJ2dpdCBtZXJnZScgeW91IGp1c3QgZGlkLiAgVGhlbiwgaW5zdGVhZCBvZiBydW5uaW5nCit0d28gJ2dpdCBtZXJnZScgY29tbWFuZHMgaW4gYSByb3csIHlvdSB3b3VsZCBtZXJnZSB0aGVzZSB0d28KK2JyYW5jaCBoZWFkcyAodGhpcyBpcyBrbm93biBhcyAnbWFraW5nIGFuIE9jdG9wdXMnKToKKworLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSBjb21taXQtZml4IGRpZmYtZml4CiskIGdpdCBzaG93LWJyYW5jaAorISBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgISBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICAqIFttYXN0ZXJdIE9jdG9wdXMgbWVyZ2Ugb2YgYnJhbmNoZXMgJ2RpZmYtZml4JyBhbmQgJ2NvbW1pdC1maXgnCistLS0KKyAgLSBbbWFzdGVyXSBPY3RvcHVzIG1lcmdlIG9mIGJyYW5jaGVzICdkaWZmLWZpeCcgYW5kICdjb21taXQtZml4JworKyAqIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyArKiBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICsqIFtkaWZmLWZpeH4xXSBCZXR0ZXIgY29tbW9uIHN1YnN0cmluZyBhbGdvcml0aG0uCisgICogW21hc3Rlcn4xXSBSZWxlYXNlIGNhbmRpZGF0ZSAjMQorKysqIFttYXN0ZXJ+Ml0gUHJldHR5LXByaW50IG1lc3NhZ2VzLgorLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBkbyBPY3RvcHVzIGJlY2F1c2UgeW91IGNhbi4gIEFuIG9jdG9wdXMKK2lzIGEgdmFsaWQgdGhpbmcgdG8gZG8gYW5kIG9mdGVuIG1ha2VzIGl0IGVhc2llciB0byB2aWV3IHRoZQorY29tbWl0IGhpc3RvcnkgaWYgeW91IGFyZSBtZXJnaW5nIG1vcmUgdGhhbiB0d28gaW5kZXBlbmRlbnQKK2NoYW5nZXMgYXQgdGhlIHNhbWUgdGltZS4gIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIG1lcmdlIGNvbmZsaWN0cword2l0aCBhbnkgb2YgdGhlIGJyYW5jaGVzIHlvdSBhcmUgbWVyZ2luZyBpbiBhbmQgbmVlZCB0byBoYW5kCityZXNvbHZlLCB0aGF0IGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgZGV2ZWxvcG1lbnQgaGFwcGVuZWQgaW4KK3Rob3NlIGJyYW5jaGVzIHdlcmUgbm90IGluZGVwZW5kZW50IGFmdGVyIGFsbCwgYW5kIHlvdSBzaG91bGQKK21lcmdlIHR3byBhdCBhIHRpbWUsIGRvY3VtZW50aW5nIGhvdyB5b3UgcmVzb2x2ZWQgdGhlIGNvbmZsaWN0cywKK2FuZCB0aGUgcmVhc29uIHdoeSB5b3UgcHJlZmVycmVkIGNoYW5nZXMgbWFkZSBpbiBvbmUgc2lkZSBvdmVyCit0aGUgb3RoZXIuICBPdGhlcndpc2UgaXQgd291bGQgbWFrZSB0aGUgcHJvamVjdCBoaXN0b3J5IGhhcmRlcgordG8gZm9sbG93LCBub3QgZWFzaWVyLgorCitbIHRvIGJlIGNvbnRpbnVlZC4uIGN2c2ltcG9ydHMgXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vY3ZzLW1pZ3JhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2YjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY3ZzLW1pZ3JhdGlvbi50eHQKQEAgLTAsMCArMSwxNzEgQEAKK2dpdCBmb3IgQ1ZTIHVzZXJzCis9PT09PT09PT09PT09PT09PQorCitHaXQgZGlmZmVycyBmcm9tIENWUyBpbiB0aGF0IGV2ZXJ5IHdvcmtpbmcgdHJlZSBjb250YWlucyBhIHJlcG9zaXRvcnkgd2l0aAorYSBmdWxsIGNvcHkgb2YgdGhlIHByb2plY3QgaGlzdG9yeSwgYW5kIG5vIHJlcG9zaXRvcnkgaXMgaW5oZXJlbnRseSBtb3JlCitpbXBvcnRhbnQgdGhhbiBhbnkgb3RoZXIuICBIb3dldmVyLCB5b3UgY2FuIGVtdWxhdGUgdGhlIENWUyBtb2RlbCBieQorZGVzaWduYXRpbmcgYSBzaW5nbGUgc2hhcmVkIHJlcG9zaXRvcnkgd2hpY2ggcGVvcGxlIGNhbiBzeW5jaHJvbml6ZSB3aXRoOwordGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gZG8gdGhhdC4KKworU29tZSBiYXNpYyBmYW1pbGlhcml0eSB3aXRoIGdpdCBpcyByZXF1aXJlZC4gIFRoaXMKK2xpbms6dHV0b3JpYWwuaHRtbFt0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0XSBzaG91bGQgYmUgc3VmZmljaWVudC4KKworRGV2ZWxvcGluZyBhZ2FpbnN0IGEgc2hhcmVkIHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N1cHBvc2UgYSBzaGFyZWQgcmVwb3NpdG9yeSBpcyBzZXQgdXAgaW4gL3B1Yi9yZXBvLmdpdCBvbiB0aGUgaG9zdAorZm9vLmNvbS4gIFRoZW4gYXMgYW4gaW5kaXZpZHVhbCBjb21taXR0ZXIgeW91IGNhbiBjbG9uZSB0aGUgc2hhcmVkCityZXBvc2l0b3J5IG92ZXIgc3NoIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZm9vLmNvbTovcHViL3JlcG8uZ2l0LyBteS1wcm9qZWN0CiskIGNkIG15LXByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgaGFjayBhd2F5LiAgVGhlIGVxdWl2YWxlbnQgb2YgYGN2cyB1cGRhdGVgIGlzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBtZXJnZXMgaW4gYW55IHdvcmsgdGhhdCBvdGhlcnMgbWlnaHQgaGF2ZSBkb25lIHNpbmNlIHRoZSBjbG9uZQorb3BlcmF0aW9uLiAgSWYgdGhlcmUgYXJlIHVuY29tbWl0dGVkIGNoYW5nZXMgaW4geW91ciB3b3JraW5nIHRyZWUsIGNvbW1pdAordGhlbSBmaXJzdCBiZWZvcmUgcnVubmluZyBnaXQgcHVsbC4KKworW05PVEVdCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIGBwdWxsYCBjb21tYW5kIGtub3dzIHdoZXJlIHRvIGdldCB1cGRhdGVzIGZyb20gYmVjYXVzZSBvZiBjZXJ0YWluCitjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IHdlcmUgc2V0IGJ5IHRoZSBmaXJzdCBgZ2l0IGNsb25lYAorY29tbWFuZDsgc2VlIGBnaXQgY29uZmlnIC1sYCBhbmQgdGhlIGdpdGxpbms6Z2l0LWNvbmZpZ1sxXSBtYW4KK3BhZ2UgZm9yIGRldGFpbHMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgY2FuIHVwZGF0ZSB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgd2l0aCB5b3VyIGNoYW5nZXMgYnkgZmlyc3QgY29tbWl0dGluZworeW91ciBjaGFuZ2VzLCBhbmQgdGhlbiB1c2luZyB0aGUgZ2l0bGluazpnaXQtcHVzaFsxXSBjb21tYW5kOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvICJwdXNoIiB0aG9zZSBjb21taXRzIHRvIHRoZSBzaGFyZWQgcmVwb3NpdG9yeS4gIElmIHNvbWVvbmUgZWxzZSBoYXMKK3VwZGF0ZWQgdGhlIHJlcG9zaXRvcnkgbW9yZSByZWNlbnRseSwgYGdpdCBwdXNoYCwgbGlrZSBgY3ZzIGNvbW1pdGAsIHdpbGwKK2NvbXBsYWluLCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHB1bGwgYW55IGNoYW5nZXMgYmVmb3JlIGF0dGVtcHRpbmcgdGhlCitwdXNoIGFnYWluLgorCitJbiB0aGUgYGdpdCBwdXNoYCBjb21tYW5kIGFib3ZlIHdlIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBicmFuY2gKK3RvIHVwZGF0ZSAoYG1hc3RlcmApLiAgSWYgd2UgbGVhdmUgdGhhdCBvdXQsIGBnaXQgcHVzaGAgdHJpZXMgdG8gdXBkYXRlCithbnkgYnJhbmNoZXMgaW4gdGhlIHJlbW90ZSByZXBvc2l0b3J5IHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGEgYnJhbmNoCitpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeS4gIFNvIHRoZSBsYXN0IGBwdXNoYCBjYW4gYmUgZG9uZSB3aXRoIGVpdGhlciBvZjoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIG9yaWdpbgorJCBnaXQgcHVzaCBmb28uY29tOi9wdWIvcHJvamVjdC5naXQvCistLS0tLS0tLS0tLS0KKworYXMgbG9uZyBhcyB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgZG9lcyBub3QgaGF2ZSBhbnkgYnJhbmNoZXMKK290aGVyIHRoYW4gYG1hc3RlcmAuCisKK1NldHRpbmcgVXAgYSBTaGFyZWQgUmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIGFzc3VtZSB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBnaXQgcmVwb3NpdG9yeSBmb3IgeW91ciBwcm9qZWN0LAorcG9zc2libHkgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggb3IgZnJvbSBhIHRhcmJhbGwgKHNlZSB0aGUKK2xpbms6dHV0b3JpYWwuaHRtbFt0dXRvcmlhbF0pLCBvciBpbXBvcnRlZCBmcm9tIGFuIGFscmVhZHkgZXhpc3RpbmcgQ1ZTCityZXBvc2l0b3J5IChzZWUgdGhlIG5leHQgc2VjdGlvbikuCisKK0Fzc3VtZSB5b3VyIGV4aXN0aW5nIHJlcG8gaXMgYXQgL2hvbWUvYWxpY2UvbXlwcm9qZWN0LiAgQ3JlYXRlIGEgbmV3ICJiYXJlIgorcmVwb3NpdG9yeSAoYSByZXBvc2l0b3J5IHdpdGhvdXQgYSB3b3JraW5nIHRyZWUpIGFuZCBmZXRjaCB5b3VyIHByb2plY3QgaW50bworaXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciAvcHViL215LXJlcG8uZ2l0CiskIGNkIC9wdWIvbXktcmVwby5naXQKKyQgZ2l0IC0tYmFyZSBpbml0IC0tc2hhcmVkCiskIGdpdCAtLWJhcmUgZmV0Y2ggL2hvbWUvYWxpY2UvbXlwcm9qZWN0IG1hc3RlcjptYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOZXh0LCBnaXZlIGV2ZXJ5IHRlYW0gbWVtYmVyIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoaXMgcmVwb3NpdG9yeS4gIE9uZQorZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB0byBnaXZlIGFsbCB0aGUgdGVhbSBtZW1iZXJzIHNzaCBhY2Nlc3MgdG8gdGhlCittYWNoaW5lIHdoZXJlIHRoZSByZXBvc2l0b3J5IGlzIGhvc3RlZC4gIElmIHlvdSBkb24ndCB3YW50IHRvIGdpdmUgdGhlbSBhCitmdWxsIHNoZWxsIG9uIHRoZSBtYWNoaW5lLCB0aGVyZSBpcyBhIHJlc3RyaWN0ZWQgc2hlbGwgd2hpY2ggb25seSBhbGxvd3MKK3VzZXJzIHRvIGRvIGdpdCBwdXNoZXMgYW5kIHB1bGxzOyBzZWUgZ2l0bGluazpnaXQtc2hlbGxbMV0uCisKK1B1dCBhbGwgdGhlIGNvbW1pdHRlcnMgaW4gdGhlIHNhbWUgZ3JvdXAsIGFuZCBtYWtlIHRoZSByZXBvc2l0b3J5Cit3cml0YWJsZSBieSB0aGF0IGdyb3VwOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2hncnAgLVIgJGdyb3VwIC9wdWIvbXktcmVwby5naXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYWtlIHN1cmUgY29tbWl0dGVycyBoYXZlIGEgdW1hc2sgb2YgYXQgbW9zdCAwMjcsIHNvIHRoYXQgdGhlIGRpcmVjdG9yaWVzCit0aGV5IGNyZWF0ZSBhcmUgd3JpdGFibGUgYW5kIHNlYXJjaGFibGUgYnkgb3RoZXIgZ3JvdXAgbWVtYmVycy4KKworSW1wb3J0aW5nIGEgQ1ZTIGFyY2hpdmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0LCBpbnN0YWxsIHZlcnNpb24gMi4xIG9yIGhpZ2hlciBvZiBjdnNwcyBmcm9tCitsaW5rOmh0dHA6Ly93d3cuY29iaXRlLmNvbS9jdnNwcy9baHR0cDovL3d3dy5jb2JpdGUuY29tL2N2c3BzL10gYW5kIG1ha2UKK3N1cmUgaXQgaXMgaW4geW91ciBwYXRoLiAgVGhlbiBjZCB0byBhIGNoZWNrZWQgb3V0IENWUyB3b3JraW5nIGRpcmVjdG9yeQorb2YgdGhlIHByb2plY3QgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFuZCBydW4gZ2l0bGluazpnaXQtY3ZzaW1wb3J0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjdnNpbXBvcnQgLUMgPGRlc3RpbmF0aW9uPiA8bW9kdWxlPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHB1dHMgYSBnaXQgYXJjaGl2ZSBvZiB0aGUgbmFtZWQgQ1ZTIG1vZHVsZSBpbiB0aGUgZGlyZWN0b3J5Cis8ZGVzdGluYXRpb24+LCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgorCitUaGUgaW1wb3J0IGNoZWNrcyBvdXQgZnJvbSBDVlMgZXZlcnkgcmV2aXNpb24gb2YgZXZlcnkgZmlsZS4gIFJlcG9ydGVkbHkKK2N2c2ltcG9ydCBjYW4gYXZlcmFnZSBzb21lIHR3ZW50eSByZXZpc2lvbnMgcGVyIHNlY29uZCwgc28gZm9yIGEKK21lZGl1bS1zaXplZCBwcm9qZWN0IHRoaXMgc2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbiBhIGNvdXBsZSBvZiBtaW51dGVzLgorTGFyZ2VyIHByb2plY3RzIG9yIHJlbW90ZSByZXBvc2l0b3JpZXMgbWF5IHRha2UgbG9uZ2VyLgorCitUaGUgbWFpbiB0cnVuayBpcyBzdG9yZWQgaW4gdGhlIGdpdCBicmFuY2ggbmFtZWQgYG9yaWdpbmAsIGFuZCBhZGRpdGlvbmFsCitDVlMgYnJhbmNoZXMgYXJlIHN0b3JlZCBpbiBnaXQgYnJhbmNoZXMgd2l0aCB0aGUgc2FtZSBuYW1lcy4gIFRoZSBtb3N0CityZWNlbnQgdmVyc2lvbiBvZiB0aGUgbWFpbiB0cnVuayBpcyBhbHNvIGxlZnQgY2hlY2tlZCBvdXQgb24gdGhlIGBtYXN0ZXJgCiticmFuY2gsIHNvIHlvdSBjYW4gc3RhcnQgYWRkaW5nIHlvdXIgb3duIGNoYW5nZXMgcmlnaHQgYXdheS4KKworVGhlIGltcG9ydCBpcyBpbmNyZW1lbnRhbCwgc28gaWYgeW91IGNhbGwgaXQgYWdhaW4gbmV4dCBtb250aCBpdCB3aWxsCitmZXRjaCBhbnkgQ1ZTIHVwZGF0ZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgbWVhbnRpbWUuICBGb3IgdGhpcyB0bword29yaywgeW91IG11c3Qgbm90IG1vZGlmeSB0aGUgaW1wb3J0ZWQgYnJhbmNoZXM7IGluc3RlYWQsIGNyZWF0ZSBuZXcKK2JyYW5jaGVzIGZvciB5b3VyIG93biBjaGFuZ2VzLCBhbmQgbWVyZ2UgaW4gdGhlIGltcG9ydGVkIGJyYW5jaGVzIGFzCituZWNlc3NhcnkuCisKK0FkdmFuY2VkIFNoYXJlZCBSZXBvc2l0b3J5IE1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBzY3JpcHRzIGNhbGxlZCAiaG9va3MiIHRvIGJlIHJ1biBhdCBjZXJ0YWluCitwb2ludHMuICBZb3UgY2FuIHVzZSB0aGVzZSwgZm9yIGV4YW1wbGUsIHRvIHNlbmQgYWxsIGNvbW1pdHMgdG8gdGhlIHNoYXJlZAorcmVwb3NpdG9yeSB0byBhIG1haWxpbmcgbGlzdC4gIFNlZSBsaW5rOmhvb2tzLmh0bWxbSG9va3MgdXNlZCBieSBnaXRdLgorCitZb3UgY2FuIGVuZm9yY2UgZmluZXIgZ3JhaW5lZCBwZXJtaXNzaW9ucyB1c2luZyB1cGRhdGUgaG9va3MuICBTZWUKK2xpbms6aG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHRbQ29udHJvbGxpbmcgYWNjZXNzIHRvIGJyYW5jaGVzIHVzaW5nCit1cGRhdGUgaG9va3NdLgorCitQcm92aWRpbmcgQ1ZTIEFjY2VzcyB0byBhIGdpdCBSZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gcHJvdmlkZSB0cnVlIENWUyBhY2Nlc3MgdG8gYSBnaXQgcmVwb3NpdG9yeSwgc28KK3RoYXQgZGV2ZWxvcGVycyBjYW4gc3RpbGwgdXNlIENWUzsgc2VlIGdpdGxpbms6Z2l0LWN2c3NlcnZlclsxXSBmb3IKK2RldGFpbHMuCisKK0FsdGVybmF0aXZlIERldmVsb3BtZW50IE1vZGVscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NWUyB1c2VycyBhcmUgYWNjdXN0b21lZCB0byBnaXZpbmcgYSBncm91cCBvZiBkZXZlbG9wZXJzIGNvbW1pdCBhY2Nlc3MgdG8KK2EgY29tbW9uIHJlcG9zaXRvcnkuICBBcyB3ZSd2ZSBzZWVuLCB0aGlzIGlzIGFsc28gcG9zc2libGUgd2l0aCBnaXQuCitIb3dldmVyLCB0aGUgZGlzdHJpYnV0ZWQgbmF0dXJlIG9mIGdpdCBhbGxvd3Mgb3RoZXIgZGV2ZWxvcG1lbnQgbW9kZWxzLAorYW5kIHlvdSBtYXkgd2FudCB0byBmaXJzdCBjb25zaWRlciB3aGV0aGVyIG9uZSBvZiB0aGVtIG1pZ2h0IGJlIGEgYmV0dGVyCitmaXQgZm9yIHlvdXIgcHJvamVjdC4KKworRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hvb3NlIGEgc2luZ2xlIHBlcnNvbiB0byBtYWludGFpbiB0aGUgcHJvamVjdCdzCitwcmltYXJ5IHB1YmxpYyByZXBvc2l0b3J5LiAgT3RoZXIgZGV2ZWxvcGVycyB0aGVuIGNsb25lIHRoaXMgcmVwb3NpdG9yeQorYW5kIGVhY2ggd29yayBpbiB0aGVpciBvd24gY2xvbmUuICBXaGVuIHRoZXkgaGF2ZSBhIHNlcmllcyBvZiBjaGFuZ2VzIHRoYXQKK3RoZXkncmUgaGFwcHkgd2l0aCwgdGhleSBhc2sgdGhlIG1haW50YWluZXIgdG8gcHVsbCBmcm9tIHRoZSBicmFuY2gKK2NvbnRhaW5pbmcgdGhlIGNoYW5nZXMuICBUaGUgbWFpbnRhaW5lciByZXZpZXdzIHRoZWlyIGNoYW5nZXMgYW5kIHB1bGxzCit0aGVtIGludG8gdGhlIHByaW1hcnkgcmVwb3NpdG9yeSwgd2hpY2ggb3RoZXIgZGV2ZWxvcGVycyBwdWxsIGZyb20gYXMKK25lY2Vzc2FyeSB0byBzdGF5IGNvb3JkaW5hdGVkLiAgVGhlIExpbnV4IGtlcm5lbCBhbmQgb3RoZXIgcHJvamVjdHMgdXNlCit2YXJpYW50cyBvZiB0aGlzIG1vZGVsLgorCitXaXRoIGEgc21hbGwgZ3JvdXAsIGRldmVsb3BlcnMgbWF5IGp1c3QgcHVsbCBjaGFuZ2VzIGZyb20gZWFjaCBvdGhlcidzCityZXBvc2l0b3JpZXMgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBjZW50cmFsIG1haW50YWluZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGExZjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dApAQCAtMCwwICsxLDIzNiBAQAorVGhlIG91dHB1dCBmb3JtYXQgZnJvbSAiZ2l0LWRpZmYtaW5kZXgiLCAiZ2l0LWRpZmYtdHJlZSIgYW5kCisiZ2l0LWRpZmYtZmlsZXMiIGFyZSB2ZXJ5IHNpbWlsYXIuCisKK1RoZXNlIGNvbW1hbmRzIGFsbCBjb21wYXJlIHR3byBzZXRzIG9mIHRoaW5nczsgd2hhdCBpcyAKK2NvbXBhcmVkIGRpZmZlcnM6CisKK2dpdC1kaWZmLWluZGV4IDx0cmVlLWlzaD46OgorICAgICAgICBjb21wYXJlcyB0aGUgPHRyZWUtaXNoPiBhbmQgdGhlIGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorCitnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCA8dHJlZS1pc2g+OjoKKyAgICAgICAgY29tcGFyZXMgdGhlIDx0cmVlLWlzaD4gYW5kIHRoZSBpbmRleC4KKworZ2l0LWRpZmYtdHJlZSBbLXJdIDx0cmVlLWlzaC0xPiA8dHJlZS1pc2gtMj4gWzxwYXR0ZXJuPi4uLl06OgorICAgICAgICBjb21wYXJlcyB0aGUgdHJlZXMgbmFtZWQgYnkgdGhlIHR3byBhcmd1bWVudHMuCisKK2dpdC1kaWZmLWZpbGVzIFs8cGF0dGVybj4uLi5dOjoKKyAgICAgICAgY29tcGFyZXMgdGhlIGluZGV4IGFuZCB0aGUgZmlsZXMgb24gdGhlIGZpbGVzeXN0ZW0uCisKKworQW4gb3V0cHV0IGxpbmUgaXMgZm9ybWF0dGVkIHRoaXMgd2F5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luLXBsYWNlIGVkaXQgIDoxMDA2NDQgMTAwNjQ0IGJjZDEyMzQuLi4gMDEyMzQ1Ni4uLiBNIGZpbGUwCitjb3B5LWVkaXQgICAgICA6MTAwNjQ0IDEwMDY0NCBhYmNkMTIzLi4uIDEyMzQ1NjcuLi4gQzY4IGZpbGUxIGZpbGUyCityZW5hbWUtZWRpdCAgICA6MTAwNjQ0IDEwMDY0NCBhYmNkMTIzLi4uIDEyMzQ1NjcuLi4gUjg2IGZpbGUxIGZpbGUzCitjcmVhdGUgICAgICAgICA6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDEyMzQ1NjcuLi4gQSBmaWxlNAorZGVsZXRlICAgICAgICAgOjEwMDY0NCAwMDAwMDAgMTIzNDU2Ny4uLiAwMDAwMDAwLi4uIEQgZmlsZTUKK3VubWVyZ2VkICAgICAgIDowMDAwMDAgMDAwMDAwIDAwMDAwMDAuLi4gMDAwMDAwMC4uLiBVIGZpbGU2CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhhdCBpcywgZnJvbSB0aGUgbGVmdCB0byB0aGUgcmlnaHQ6CisKKy4gYSBjb2xvbi4KKy4gbW9kZSBmb3IgInNyYyI7IDAwMDAwMCBpZiBjcmVhdGlvbiBvciB1bm1lcmdlZC4KKy4gYSBzcGFjZS4KKy4gbW9kZSBmb3IgImRzdCI7IDAwMDAwMCBpZiBkZWxldGlvbiBvciB1bm1lcmdlZC4KKy4gYSBzcGFjZS4KKy4gc2hhMSBmb3IgInNyYyI7IDBcezQwXH0gaWYgY3JlYXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIHNoYTEgZm9yICJkc3QiOyAwXHs0MFx9IGlmIGNyZWF0aW9uLCB1bm1lcmdlZCBvciAibG9vayBhdCB3b3JrIHRyZWUiLgorLiBhIHNwYWNlLgorLiBzdGF0dXMsIGZvbGxvd2VkIGJ5IG9wdGlvbmFsICJzY29yZSIgbnVtYmVyLgorLiBhIHRhYiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQuCisuIHBhdGggZm9yICJzcmMiCisuIGEgdGFiIG9yIGEgTlVMIHdoZW4gJy16JyBvcHRpb24gaXMgdXNlZDsgb25seSBleGlzdHMgZm9yIEMgb3IgUi4KKy4gcGF0aCBmb3IgImRzdCI7IG9ubHkgZXhpc3RzIGZvciBDIG9yIFIuCisuIGFuIExGIG9yIGEgTlVMIHdoZW4gJy16JyBvcHRpb24gaXMgdXNlZCwgdG8gdGVybWluYXRlIHRoZSByZWNvcmQuCisKKzxzaGExPiBpcyBzaG93biBhcyBhbGwgMCdzIGlmIGEgZmlsZSBpcyBuZXcgb24gdGhlIGZpbGVzeXN0ZW0KK2FuZCBpdCBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBpbmRleC4KKworRXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCA1YmU0YTQuLi4uLi4gMDAwMDAwLi4uLi4uIE0gZmlsZS5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBgLXpgIG9wdGlvbiBpcyBub3QgdXNlZCwgVEFCLCBMRiwgYW5kIGJhY2tzbGFzaCBjaGFyYWN0ZXJzCitpbiBwYXRobmFtZXMgYXJlIHJlcHJlc2VudGVkIGFzIGBcdGAsIGBcbmAsIGFuZCBgXFxgLAorcmVzcGVjdGl2ZWx5LgorCitkaWZmIGZvcm1hdCBmb3IgbWVyZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyJnaXQtZGlmZi10cmVlIiBhbmQgImdpdC1kaWZmLWZpbGVzIiBjYW4gdGFrZSAnLWMnIG9yICctLWNjJyBvcHRpb24KK3RvIGdlbmVyYXRlIGRpZmYgb3V0cHV0IGFsc28gZm9yIG1lcmdlIGNvbW1pdHMuICBUaGUgb3V0cHV0IGRpZmZlcnMKK2Zyb20gdGhlIGZvcm1hdCBkZXNjcmliZWQgYWJvdmUgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKKy4gdGhlcmUgaXMgYSBjb2xvbiBmb3IgZWFjaCBwYXJlbnQKKy4gdGhlcmUgYXJlIG1vcmUgInNyYyIgbW9kZXMgYW5kICJzcmMiIHNoYTEKKy4gc3RhdHVzIGlzIGNvbmNhdGVuYXRlZCBzdGF0dXMgY2hhcmFjdGVycyBmb3IgZWFjaCBwYXJlbnQKKy4gbm8gb3B0aW9uYWwgInNjb3JlIiBudW1iZXIKKy4gc2luZ2xlIHBhdGgsIG9ubHkgZm9yICJkc3QiCisKK0V4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjoxMDA2NDQgMTAwNjQ0IDEwMDY0NCBmYWJhZGI4Li4uIGNjOTVlYjAuLi4gNDg2NjUxMC4uLiBNTQlkZXNjcmliZS5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0ICdjb21iaW5lZCBkaWZmJyBsaXN0cyBvbmx5IGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQgZnJvbQorYWxsIHBhcmVudHMuCisKKworR2VuZXJhdGluZyBwYXRjaGVzIHdpdGggLXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gImdpdC1kaWZmLWluZGV4IiwgImdpdC1kaWZmLXRyZWUiLCBvciAiZ2l0LWRpZmYtZmlsZXMiIGFyZSBydW4KK3dpdGggYSAnLXAnIG9wdGlvbiwgdGhleSBkbyBub3QgcHJvZHVjZSB0aGUgb3V0cHV0IGRlc2NyaWJlZCBhYm92ZTsKK2luc3RlYWQgdGhleSBwcm9kdWNlIGEgcGF0Y2ggZmlsZS4gIFlvdSBjYW4gY3VzdG9taXplIHRoZSBjcmVhdGlvbgorb2Ygc3VjaCBwYXRjaGVzIHZpYSB0aGUgR0lUX0VYVEVSTkFMX0RJRkYgYW5kIHRoZSBHSVRfRElGRl9PUFRTCitlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK1doYXQgdGhlIC1wIG9wdGlvbiBwcm9kdWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgdHJhZGl0aW9uYWwKK2RpZmYgZm9ybWF0LgorCisxLiAgIEl0IGlzIHByZWNlZGVkIHdpdGggYSAiZ2l0IGRpZmYiIGhlYWRlciwgdGhhdCBsb29rcyBsaWtlCisgICAgIHRoaXM6CisKKyAgICAgICBkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMgorKworVGhlIGBhL2AgYW5kIGBiL2AgZmlsZW5hbWVzIGFyZSB0aGUgc2FtZSB1bmxlc3MgcmVuYW1lL2NvcHkgaXMKK2ludm9sdmVkLiAgRXNwZWNpYWxseSwgZXZlbiBmb3IgYSBjcmVhdGlvbiBvciBhIGRlbGV0aW9uLAorYC9kZXYvbnVsbGAgaXMgX25vdF8gdXNlZCBpbiBwbGFjZSBvZiBgYS9gIG9yIGBiL2AgZmlsZW5hbWVzLgorKworV2hlbiByZW5hbWUvY29weSBpcyBpbnZvbHZlZCwgYGZpbGUxYCBhbmQgYGZpbGUyYCBzaG93IHRoZQorbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgb2YgdGhlIHJlbmFtZS9jb3B5IGFuZCB0aGUgbmFtZSBvZgordGhlIGZpbGUgdGhhdCByZW5hbWUvY29weSBwcm9kdWNlcywgcmVzcGVjdGl2ZWx5LgorCisyLiAgIEl0IGlzIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGV4dGVuZGVkIGhlYWRlciBsaW5lczoKKworICAgICAgIG9sZCBtb2RlIDxtb2RlPgorICAgICAgIG5ldyBtb2RlIDxtb2RlPgorICAgICAgIGRlbGV0ZWQgZmlsZSBtb2RlIDxtb2RlPgorICAgICAgIG5ldyBmaWxlIG1vZGUgPG1vZGU+CisgICAgICAgY29weSBmcm9tIDxwYXRoPgorICAgICAgIGNvcHkgdG8gPHBhdGg+CisgICAgICAgcmVuYW1lIGZyb20gPHBhdGg+CisgICAgICAgcmVuYW1lIHRvIDxwYXRoPgorICAgICAgIHNpbWlsYXJpdHkgaW5kZXggPG51bWJlcj4KKyAgICAgICBkaXNzaW1pbGFyaXR5IGluZGV4IDxudW1iZXI+CisgICAgICAgaW5kZXggPGhhc2g+Li48aGFzaD4gPG1vZGU+CisKKzMuICBUQUIsIExGLCBkb3VibGUgcXVvdGUgYW5kIGJhY2tzbGFzaCBjaGFyYWN0ZXJzIGluIHBhdGhuYW1lcworICAgIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBgXCJgIGFuZCBgXFxgLCByZXNwZWN0aXZlbHkuCisgICAgSWYgdGhlcmUgaXMgbmVlZCBmb3Igc3VjaCBzdWJzdGl0dXRpb24gdGhlbiB0aGUgd2hvbGUKKyAgICBwYXRobmFtZSBpcyBwdXQgaW4gZG91YmxlIHF1b3Rlcy4KKworCitjb21iaW5lZCBkaWZmIGZvcm1hdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0LWRpZmYtdHJlZSBhbmQgZ2l0LWRpZmYtZmlsZXMgY2FuIHRha2UgJy1jJyBvciAnLS1jYycgb3B0aW9uCit0byBwcm9kdWNlICdjb21iaW5lZCBkaWZmJywgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KK2RpZmYgLS1jb21iaW5lZCBkZXNjcmliZS5jCitpbmRleCBmYWJhZGI4LGNjOTVlYjAuLjQ4NjY1MTAKKy0tLSBhL2Rlc2NyaWJlLmMKKysrKyBiL2Rlc2NyaWJlLmMKK0BAQCAtOTgsMjAgLTk4LDEyICs5OCwyMCBAQEAKKyAgCXJldHVybiAoYV9kYXRlID4gYl9kYXRlKSA/IC0xIDogKGFfZGF0ZSA9PSBiX2RhdGUpID8gMCA6IDE7CisgIH0KKyAgCistIHN0YXRpYyB2b2lkIGRlc2NyaWJlKGNoYXIgKmFyZykKKyAtc3RhdGljIHZvaWQgZGVzY3JpYmUoc3RydWN0IGNvbW1pdCAqY21pdCwgaW50IGxhc3Rfb25lKQorKytzdGF0aWMgdm9pZCBkZXNjcmliZShjaGFyICphcmcsIGludCBsYXN0X29uZSkKKyAgeworICsJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKyArCXN0cnVjdCBjb21taXQgKmNtaXQ7CisgIAlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisgIAlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgCXN0cnVjdCBjb21taXRfbmFtZSAqbjsKKyAgCisgKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSA8IDApCisgKwkJdXNhZ2UoZGVzY3JpYmVfdXNhZ2UpOworICsJY21pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworICsJaWYgKCFjbWl0KQorICsJCXVzYWdlKGRlc2NyaWJlX3VzYWdlKTsKKyArCisgIAlpZiAoIWluaXRpYWxpemVkKSB7CisgIAkJaW5pdGlhbGl6ZWQgPSAxOworICAJCWZvcl9lYWNoX3JlZihnZXRfbmFtZSk7CistLS0tLS0tLS0tLS0KKworMS4gICBJdCBpcyBwcmVjZWRlZCB3aXRoIGEgImdpdCBkaWZmIiBoZWFkZXIsIHRoYXQgbG9va3MgbGlrZQorICAgICB0aGlzICh3aGVuICctYycgb3B0aW9uIGlzIHVzZWQpOgorCisgICAgICAgZGlmZiAtLWNvbWJpbmVkIGZpbGUKKysKK29yIGxpa2UgdGhpcyAod2hlbiAnLS1jYycgb3B0aW9uIGlzIHVzZWQpOgorCisgICAgICAgZGlmZiAtLWMgZmlsZQorCisyLiAgIEl0IGlzIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGV4dGVuZGVkIGhlYWRlciBsaW5lcworICAgICAodGhpcyBleGFtcGxlIHNob3dzIGEgbWVyZ2Ugd2l0aCB0d28gcGFyZW50cyk6CisKKyAgICAgICBpbmRleCA8aGFzaD4sPGhhc2g+Li48aGFzaD4KKyAgICAgICBtb2RlIDxtb2RlPiw8bW9kZT4uLjxtb2RlPgorICAgICAgIG5ldyBmaWxlIG1vZGUgPG1vZGU+CisgICAgICAgZGVsZXRlZCBmaWxlIG1vZGUgPG1vZGU+LDxtb2RlPgorKworVGhlIGBtb2RlIDxtb2RlPiw8bW9kZT4uLjxtb2RlPmAgbGluZSBhcHBlYXJzIG9ubHkgaWYgYXQgbGVhc3Qgb25lIG9mCit0aGUgPG1vZGU+IGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZXN0LiBFeHRlbmRlZCBoZWFkZXJzIHdpdGgKK2luZm9ybWF0aW9uIGFib3V0IGRldGVjdGVkIGNvbnRlbnRzIG1vdmVtZW50IChyZW5hbWVzIGFuZAorY29weWluZyBkZXRlY3Rpb24pIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggZGlmZiBvZiB0d28KKzx0cmVlLWlzaD4gYW5kIGFyZSBub3QgdXNlZCBieSBjb21iaW5lZCBkaWZmIGZvcm1hdC4KKworMy4gICBJdCBpcyBmb2xsb3dlZCBieSB0d28tbGluZSBmcm9tLWZpbGUvdG8tZmlsZSBoZWFkZXIKKworICAgICAgIC0tLSBhL2ZpbGUKKyAgICAgICArKysgYi9maWxlCisrCitTaW1pbGFyIHRvIHR3by1saW5lIGhlYWRlciBmb3IgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYKK2Zvcm1hdCwgYC9kZXYvbnVsbGAgaXMgdXNlZCB0byBzaWduYWwgY3JlYXRlZCBvciBkZWxldGVkCitmaWxlcy4KKworNC4gICBDaHVuayBoZWFkZXIgZm9ybWF0IGlzIG1vZGlmaWVkIHRvIHByZXZlbnQgcGVvcGxlIGZyb20KKyAgICAgYWNjaWRlbnRhbGx5IGZlZWRpbmcgaXQgdG8gYHBhdGNoIC1wMWAuIENvbWJpbmVkIGRpZmYgZm9ybWF0CisgICAgIHdhcyBjcmVhdGVkIGZvciByZXZpZXcgb2YgbWVyZ2UgY29tbWl0IGNoYW5nZXMsIGFuZCB3YXMgbm90CisgICAgIG1lYW50IGZvciBhcHBseS4gVGhlIGNoYW5nZSBpcyBzaW1pbGFyIHRvIHRoZSBjaGFuZ2UgaW4gdGhlCisgICAgIGV4dGVuZGVkICdpbmRleCcgaGVhZGVyOgorCisgICAgICAgQEBAIDxmcm9tLWZpbGUtcmFuZ2U+IDxmcm9tLWZpbGUtcmFuZ2U+IDx0by1maWxlLXJhbmdlPiBAQEAKKysKK1RoZXJlIGFyZSAobnVtYmVyIG9mIHBhcmVudHMgKyAxKSBgQGAgY2hhcmFjdGVycyBpbiB0aGUgY2h1bmsKK2hlYWRlciBmb3IgY29tYmluZWQgZGlmZiBmb3JtYXQuCisKK1VubGlrZSB0aGUgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYgZm9ybWF0LCB3aGljaCBzaG93cyB0d28KK2ZpbGVzIEEgYW5kIEIgd2l0aCBhIHNpbmdsZSBjb2x1bW4gdGhhdCBoYXMgYC1gIChtaW51cyAtLQorYXBwZWFycyBpbiBBIGJ1dCByZW1vdmVkIGluIEIpLCBgK2AgKHBsdXMgLS0gbWlzc2luZyBpbiBBIGJ1dAorYWRkZWQgdG8gQiksIG9yIGAiICJgIChzcGFjZSAtLSB1bmNoYW5nZWQpIHByZWZpeCwgdGhpcyBmb3JtYXQKK2NvbXBhcmVzIHR3byBvciBtb3JlIGZpbGVzIGZpbGUxLCBmaWxlMiwuLi4gd2l0aCBvbmUgZmlsZSBYLCBhbmQKK3Nob3dzIGhvdyBYIGRpZmZlcnMgZnJvbSBlYWNoIG9mIGZpbGVOLiAgT25lIGNvbHVtbiBmb3IgZWFjaCBvZgorZmlsZU4gaXMgcHJlcGVuZGVkIHRvIHRoZSBvdXRwdXQgbGluZSB0byBub3RlIGhvdyBYJ3MgbGluZSBpcworZGlmZmVyZW50IGZyb20gaXQuCisKK0EgYC1gIGNoYXJhY3RlciBpbiB0aGUgY29sdW1uIE4gbWVhbnMgdGhhdCB0aGUgbGluZSBhcHBlYXJzIGluCitmaWxlTiBidXQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSByZXN1bHQuICBBIGArYCBjaGFyYWN0ZXIKK2luIHRoZSBjb2x1bW4gTiBtZWFucyB0aGF0IHRoZSBsaW5lIGFwcGVhcnMgaW4gdGhlIGxhc3QgZmlsZSwKK2FuZCBmaWxlTiBkb2VzIG5vdCBoYXZlIHRoYXQgbGluZSAoaW4gb3RoZXIgd29yZHMsIHRoZSBsaW5lIHdhcworYWRkZWQsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhhdCBwYXJlbnQpLgorCitJbiB0aGUgYWJvdmUgZXhhbXBsZSBvdXRwdXQsIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgd2FzIGNoYW5nZWQKK2Zyb20gYm90aCBmaWxlcyAoaGVuY2UgdHdvIGAtYCByZW1vdmFscyBmcm9tIGJvdGggZmlsZTEgYW5kCitmaWxlMiwgcGx1cyBgKytgIHRvIG1lYW4gb25lIGxpbmUgdGhhdCB3YXMgYWRkZWQgZG9lcyBub3QgYXBwZWFyCitpbiBlaXRoZXIgZmlsZTEgbm9yIGZpbGUyKS4gIEFsc28gdHdvIG90aGVyIGxpbmVzIGFyZSB0aGUgc2FtZQorZnJvbSBmaWxlMSBidXQgZG8gbm90IGFwcGVhciBpbiBmaWxlMiAoaGVuY2UgcHJlZml4ZWQgd2l0aCBgICtgKS4KKworV2hlbiBzaG93biBieSBgZ2l0IGRpZmYtdHJlZSAtY2AsIGl0IGNvbXBhcmVzIHRoZSBwYXJlbnRzIG9mIGEKK21lcmdlIGNvbW1pdCB3aXRoIHRoZSBtZXJnZSByZXN1bHQgKGkuZS4gZmlsZTEuLmZpbGVOIGFyZSB0aGUKK3BhcmVudHMpLiAgV2hlbiBzaG93biBieSBgZ2l0IGRpZmYtZmlsZXMgLWNgLCBpdCBjb21wYXJlcyB0aGUKK3R3byB1bnJlc29sdmVkIG1lcmdlIHBhcmVudHMgd2l0aCB0aGUgd29ya2luZyB0cmVlIGZpbGUKKyhpLmUuIGZpbGUxIGlzIHN0YWdlIDIgYWthICJvdXIgdmVyc2lvbiIsIGZpbGUyIGlzIHN0YWdlIDMgYWthCisidGhlaXIgdmVyc2lvbiIpLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RpZmYtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmYtb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4OWM3NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGlmZi1vcHRpb25zLnR4dApAQCAtMCwwICsxLDE3MSBAQAorLXA6OgorCUdlbmVyYXRlIHBhdGNoIChzZWUgc2VjdGlvbiBvbiBnZW5lcmF0aW5nIHBhdGNoZXMpCisKKy11OjoKKwlTeW5vbnltIGZvciAiLXAiLgorCistLXJhdzo6CisJR2VuZXJhdGUgdGhlIHJhdyBmb3JtYXQuCisKKy0tcGF0Y2gtd2l0aC1yYXc6OgorCVN5bm9ueW0gZm9yICItcCAtLXJhdyIuCisKKy0tc3RhdFs9d2lkdGhbLG5hbWUtd2lkdGhdXTo6CisJR2VuZXJhdGUgYSBkaWZmc3RhdC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKwlvdXRwdXQgd2lkdGggZm9yIDgwLWNvbHVtbiB0ZXJtaW5hbCBieSAiLS1zdGF0PXdpZHRoIi4KKwlUaGUgd2lkdGggb2YgdGhlIGZpbGVuYW1lIHBhcnQgY2FuIGJlIGNvbnRyb2xsZWQgYnkKKwlnaXZpbmcgYW5vdGhlciB3aWR0aCB0byBpdCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KKworLS1udW1zdGF0OjoKKwlTaW1pbGFyIHRvIFwtLXN0YXQsIGJ1dCBzaG93cyBudW1iZXIgb2YgYWRkZWQgYW5kCisJZGVsZXRlZCBsaW5lcyBpbiBkZWNpbWFsIG5vdGF0aW9uIGFuZCBwYXRobmFtZSB3aXRob3V0CisJYWJicmV2aWF0aW9uLCB0byBtYWtlIGl0IG1vcmUgbWFjaGluZSBmcmllbmRseS4gIEZvcgorCWJpbmFyeSBmaWxlcywgb3V0cHV0cyB0d28gYC1gIGluc3RlYWQgb2Ygc2F5aW5nCisJYDAgMGAuCisKKy0tc2hvcnRzdGF0OjoKKwlPdXRwdXQgb25seSB0aGUgbGFzdCBsaW5lIG9mIHRoZSAtLXN0YXQgZm9ybWF0IGNvbnRhaW5pbmcgdG90YWwKKwludW1iZXIgb2YgbW9kaWZpZWQgZmlsZXMsIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGFkZGVkIGFuZCBkZWxldGVkCisJbGluZXMuCisKKy0tc3VtbWFyeTo6CisJT3V0cHV0IGEgY29uZGVuc2VkIHN1bW1hcnkgb2YgZXh0ZW5kZWQgaGVhZGVyIGluZm9ybWF0aW9uCisJc3VjaCBhcyBjcmVhdGlvbnMsIHJlbmFtZXMgYW5kIG1vZGUgY2hhbmdlcy4KKworLS1wYXRjaC13aXRoLXN0YXQ6OgorCVN5bm9ueW0gZm9yICItcCAtLXN0YXQiLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQKKworLS1uYW1lLW9ubHk6OgorCVNob3cgb25seSBuYW1lcyBvZiBjaGFuZ2VkIGZpbGVzLgorCistLW5hbWUtc3RhdHVzOjoKKwlTaG93IG9ubHkgbmFtZXMgYW5kIHN0YXR1cyBvZiBjaGFuZ2VkIGZpbGVzLgorCistLWNvbG9yOjoKKwlTaG93IGNvbG9yZWQgZGlmZi4KKworLS1uby1jb2xvcjo6CisJVHVybiBvZmYgY29sb3JlZCBkaWZmLCBldmVuIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorCWdpdmVzIHRoZSBkZWZhdWx0IHRvIGNvbG9yIG91dHB1dC4KKworLS1jb2xvci13b3Jkczo6CisJU2hvdyBjb2xvcmVkIHdvcmQgZGlmZiwgaS5lLiBjb2xvciB3b3JkcyB3aGljaCBoYXZlIGNoYW5nZWQuCisKKy0tbm8tcmVuYW1lczo6CisJVHVybiBvZmYgcmVuYW1lIGRldGVjdGlvbiwgZXZlbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uCisJZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCB0byBkbyBzby4KKworLS1jaGVjazo6CisJV2FybiBpZiBjaGFuZ2VzIGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisJb3IgYW4gaW5kZW50IHRoYXQgdXNlcyBhIHNwYWNlIGJlZm9yZSBhIHRhYi4KKworLS1mdWxsLWluZGV4OjoKKwlJbnN0ZWFkIG9mIHRoZSBmaXJzdCBoYW5kZnVsIGNoYXJhY3RlcnMsIHNob3cgZnVsbAorCW9iamVjdCBuYW1lIG9mIHByZS0gYW5kIHBvc3QtaW1hZ2UgYmxvYiBvbiB0aGUgImluZGV4IgorCWxpbmUgd2hlbiBnZW5lcmF0aW5nIGEgcGF0Y2ggZm9ybWF0IG91dHB1dC4KKworLS1iaW5hcnk6OgorCUluIGFkZGl0aW9uIHRvIC0tZnVsbC1pbmRleCwgb3V0cHV0ICJiaW5hcnkgZGlmZiIgdGhhdAorCWNhbiBiZSBhcHBsaWVkIHdpdGggImdpdCBhcHBseSIuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwluYW1lIGluIGRpZmYtcmF3IGZvcm1hdCBvdXRwdXQgYW5kIGRpZmYtdHJlZSBoZWFkZXIKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4gIFRoaXMgaXMKKwlpbmRlcGVuZGVudCBvZiAtLWZ1bGwtaW5kZXggb3B0aW9uIGFib3ZlLCB3aGljaCBjb250cm9scworCXRoZSBkaWZmLXBhdGNoIG91dHB1dCBmb3JtYXQuICBOb24gZGVmYXVsdCBudW1iZXIgb2YKKwlkaWdpdHMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIC0tYWJicmV2PTxuPi4KKworLUI6OgorCUJyZWFrIGNvbXBsZXRlIHJld3JpdGUgY2hhbmdlcyBpbnRvIHBhaXJzIG9mIGRlbGV0ZSBhbmQgY3JlYXRlLgorCistTTo6CisJRGV0ZWN0IHJlbmFtZXMuCisKKy1DOjoKKwlEZXRlY3QgY29waWVzIGFzIHdlbGwgYXMgcmVuYW1lcy4KKworLS1kaWZmLWZpbHRlcj1bQUNETVJUVVhCKl06OgorCVNlbGVjdCBvbmx5IGZpbGVzIHRoYXQgYXJlIEFkZGVkIChgQWApLCBDb3BpZWQgKGBDYCksCisJRGVsZXRlZCAoYERgKSwgTW9kaWZpZWQgKGBNYCksIFJlbmFtZWQgKGBSYCksIGhhdmUgdGhlaXIKKwl0eXBlIChtb2RlKSBjaGFuZ2VkIChgVGApLCBhcmUgVW5tZXJnZWQgKGBVYCksIGFyZQorCVVua25vd24gKGBYYCksIG9yIGhhdmUgaGFkIHRoZWlyIHBhaXJpbmcgQnJva2VuIChgQmApLgorCUFueSBjb21iaW5hdGlvbiBvZiB0aGUgZmlsdGVyIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQuCisJV2hlbiBgKmAgKEFsbC1vci1ub25lKSBpcyBhZGRlZCB0byB0aGUgY29tYmluYXRpb24sIGFsbAorCXBhdGhzIGFyZSBzZWxlY3RlZCBpZiB0aGVyZSBpcyBhbnkgZmlsZSB0aGF0IG1hdGNoZXMKKwlvdGhlciBjcml0ZXJpYSBpbiB0aGUgY29tcGFyaXNvbjsgaWYgdGhlcmUgaXMgbm8gZmlsZQorCXRoYXQgbWF0Y2hlcyBvdGhlciBjcml0ZXJpYSwgbm90aGluZyBpcyBzZWxlY3RlZC4KKworLS1maW5kLWNvcGllcy1oYXJkZXI6OgorCUZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBieSBkZWZhdWx0LCAtQyBvcHRpb24gZmluZHMgY29waWVzIG9ubHkgCisJaWYgdGhlIG9yaWdpbmFsIGZpbGUgb2YgdGhlIGNvcHkgd2FzIG1vZGlmaWVkIGluIHRoZSBzYW1lIAorCWNoYW5nZXNldC4gIFRoaXMgZmxhZyBtYWtlcyB0aGUgY29tbWFuZAorCWluc3BlY3QgdW5tb2RpZmllZCBmaWxlcyBhcyBjYW5kaWRhdGVzIGZvciB0aGUgc291cmNlIG9mCisJY29weS4gIFRoaXMgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gZm9yIGxhcmdlCisJcHJvamVjdHMsIHNvIHVzZSBpdCB3aXRoIGNhdXRpb24uCisKKy1sPG51bT46OgorCS1NIGFuZCAtQyBvcHRpb25zIHJlcXVpcmUgTyhuXjIpIHByb2Nlc3NpbmcgdGltZSB3aGVyZSBuCisJaXMgdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgcmVuYW1lL2NvcHkgdGFyZ2V0cy4gIFRoaXMKKwlvcHRpb24gcHJldmVudHMgcmVuYW1lL2NvcHkgZGV0ZWN0aW9uIGZyb20gcnVubmluZyBpZgorCXRoZSBudW1iZXIgb2YgcmVuYW1lL2NvcHkgdGFyZ2V0cyBleGNlZWRzIHRoZSBzcGVjaWZpZWQKKwludW1iZXIuCisKKy1TPHN0cmluZz46OgorCUxvb2sgZm9yIGRpZmZlcmVuY2VzIHRoYXQgY29udGFpbiB0aGUgY2hhbmdlIGluIDxzdHJpbmc+LgorCistLXBpY2theGUtYWxsOjoKKwlXaGVuIC1TIGZpbmRzIGEgY2hhbmdlLCBzaG93IGFsbCB0aGUgY2hhbmdlcyBpbiB0aGF0CisJY2hhbmdlc2V0LCBub3QganVzdCB0aGUgZmlsZXMgdGhhdCBjb250YWluIHRoZSBjaGFuZ2UKKwlpbiA8c3RyaW5nPi4KKworLS1waWNrYXhlLXJlZ2V4OjoKKwlNYWtlIHRoZSA8c3RyaW5nPiBub3QgYSBwbGFpbiBzdHJpbmcgYnV0IGFuIGV4dGVuZGVkIFBPU0lYCisJcmVnZXggdG8gbWF0Y2guCisKKy1PPG9yZGVyZmlsZT46OgorCU91dHB1dCB0aGUgcGF0Y2ggaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBpbiB0aGUKKwk8b3JkZXJmaWxlPiwgd2hpY2ggaGFzIG9uZSBzaGVsbCBnbG9iIHBhdHRlcm4gcGVyIGxpbmUuCisKKy1SOjoKKwlTd2FwIHR3byBpbnB1dHM7IHRoYXQgaXMsIHNob3cgZGlmZmVyZW5jZXMgZnJvbSBpbmRleCBvcgorCW9uLWRpc2sgZmlsZSB0byB0cmVlIGNvbnRlbnRzLgorCistLXRleHQ6OgorCVRyZWF0IGFsbCBmaWxlcyBhcyB0ZXh0LgorCistYTo6CisJU2hvcnRoYW5kIGZvciAiLS10ZXh0Ii4KKworLS1pZ25vcmUtc3BhY2UtYXQtZW9sOjoKKwlJZ25vcmUgY2hhbmdlcyBpbiB3aGl0ZSBzcGFjZXMgYXQgRU9MLgorCistLWlnbm9yZS1zcGFjZS1jaGFuZ2U6OgorCUlnbm9yZSBjaGFuZ2VzIGluIGFtb3VudCBvZiB3aGl0ZSBzcGFjZS4gIFRoaXMgaWdub3JlcyB3aGl0ZQorCXNwYWNlIGF0IGxpbmUgZW5kLCBhbmQgY29uc2lkZXIgYWxsIG90aGVyIHNlcXVlbmNlcyBvZiBvbmUgb3IKKwltb3JlIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgdG8gYmUgZXF1aXZhbGVudC4KKworLWI6OgorCVNob3J0aGFuZCBmb3IgIi0taWdub3JlLXNwYWNlLWNoYW5nZSIuCisKKy0taWdub3JlLWFsbC1zcGFjZTo6CisJSWdub3JlIHdoaXRlIHNwYWNlIHdoZW4gY29tcGFyaW5nIGxpbmVzLiAgVGhpcyBpZ25vcmVzCisJZGlmZmVyZW5jZSBldmVuIGlmIG9uZSBsaW5lIGhhcyB3aGl0ZSBzcGFjZSB3aGVyZSB0aGUgb3RoZXIKKwlsaW5lIGhhcyBub25lLgorCistdzo6CisJU2hvcnRoYW5kIGZvciAiLS1pZ25vcmUtYWxsLXNwYWNlIi4KKworLS1leGl0LWNvZGU6OgorCU1ha2UgdGhlIHByb2dyYW0gZXhpdCB3aXRoIGNvZGVzIHNpbWlsYXIgdG8gZGlmZigxKS4KKwlUaGF0IGlzLCBpdCBleGl0cyB3aXRoIDEgaWYgdGhlcmUgd2VyZSBkaWZmZXJlbmNlcyBhbmQKKwkwIG1lYW5zIG5vIGRpZmZlcmVuY2VzLgorCistLXF1aWV0OjoKKwlEaXNhYmxlIGFsbCBvdXRwdXQgb2YgdGhlIHByb2dyYW0uIEltcGxpZXMgLS1leGl0LWNvZGUuCisKK0ZvciBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIHRoZXNlIGNvbW1vbiBvcHRpb25zLCBzZWUgYWxzbworbGluazpkaWZmY29yZS5odG1sW2RpZmZjb3JlIGRvY3VtZW50YXRpb25dLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmY29yZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmZjb3JlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNkMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kaWZmY29yZS50eHQKQEAgLTAsMCArMSwyNzIgQEAKK1R3ZWFraW5nIGRpZmYgb3V0cHV0Cis9PT09PT09PT09PT09PT09PT09PQorSnVuZSAyMDA1CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworVGhlIGRpZmYgY29tbWFuZHMgZ2l0LWRpZmYtaW5kZXgsIGdpdC1kaWZmLWZpbGVzLCBhbmQgZ2l0LWRpZmYtdHJlZQorY2FuIGJlIHRvbGQgdG8gbWFuaXB1bGF0ZSBkaWZmZXJlbmNlcyB0aGV5IGZpbmQgaW4KK3VuY29udmVudGlvbmFsIHdheXMgYmVmb3JlIHNob3dpbmcgZGlmZigxKSBvdXRwdXQuICBUaGUgbWFuaXB1bGF0aW9uCitpcyBjb2xsZWN0aXZlbHkgY2FsbGVkICJkaWZmY29yZSB0cmFuc2Zvcm1hdGlvbiIuICBUaGlzIHNob3J0IG5vdGUKK2Rlc2NyaWJlcyB3aGF0IHRoZXkgYXJlIGFuZCBob3cgdG8gdXNlIHRoZW0gdG8gcHJvZHVjZSBkaWZmIG91dHB1dHMKK3RoYXQgYXJlIGVhc2llciB0byB1bmRlcnN0YW5kIHRoYW4gdGhlIGNvbnZlbnRpb25hbCBraW5kLgorCisKK1RoZSBjaGFpbiBvZiBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGdpdC1kaWZmLSogZmFtaWx5IHdvcmtzIGJ5IGZpcnN0IGNvbXBhcmluZyB0d28gc2V0cyBvZgorZmlsZXM6CisKKyAtIGdpdC1kaWZmLWluZGV4IGNvbXBhcmVzIGNvbnRlbnRzIG9mIGEgInRyZWUiIG9iamVjdCBhbmQgdGhlCisgICB3b3JraW5nIGRpcmVjdG9yeSAod2hlbiAnXC0tY2FjaGVkJyBmbGFnIGlzIG5vdCB1c2VkKSBvciBhCisgICAidHJlZSIgb2JqZWN0IGFuZCB0aGUgaW5kZXggZmlsZSAod2hlbiAnXC0tY2FjaGVkJyBmbGFnIGlzCisgICB1c2VkKTsKKworIC0gZ2l0LWRpZmYtZmlsZXMgY29tcGFyZXMgY29udGVudHMgb2YgdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorICAgd29ya2luZyBkaXJlY3Rvcnk7CisKKyAtIGdpdC1kaWZmLXRyZWUgY29tcGFyZXMgY29udGVudHMgb2YgdHdvICJ0cmVlIiBvYmplY3RzOworCitJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZSBjb21tYW5kcyB0aGVtc2VsdmVzIGNvbXBhcmUKK2NvcnJlc3BvbmRpbmcgcGF0aHMgaW4gdGhlIHR3byBzZXRzIG9mIGZpbGVzLiAgVGhlIHJlc3VsdCBvZgorY29tcGFyaXNvbiBpcyBwYXNzZWQgZnJvbSB0aGVzZSBjb21tYW5kcyB0byB3aGF0IGlzIGludGVybmFsbHkKK2NhbGxlZCAiZGlmZmNvcmUiLCBpbiBhIGZvcm1hdCBzaW1pbGFyIHRvIHdoYXQgaXMgb3V0cHV0IHdoZW4KK3RoZSAtcCBvcHRpb24gaXMgbm90IHVzZWQuICBFLmcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW4tcGxhY2UgZWRpdCAgOjEwMDY0NCAxMDA2NDQgYmNkMTIzNC4uLiAwMTIzNDU2Li4uIE0gZmlsZTAKK2NyZWF0ZSAgICAgICAgIDowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMTIzNDU2Ny4uLiBBIGZpbGU0CitkZWxldGUgICAgICAgICA6MTAwNjQ0IDAwMDAwMCAxMjM0NTY3Li4uIDAwMDAwMDAuLi4gRCBmaWxlNQordW5tZXJnZWQgICAgICAgOjAwMDAwMCAwMDAwMDAgMDAwMDAwMC4uLiAwMDAwMDAwLi4uIFUgZmlsZTYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZGlmZmNvcmUgbWVjaGFuaXNtIGlzIGZlZCBhIGxpc3Qgb2Ygc3VjaCBjb21wYXJpc29uIHJlc3VsdHMKKyhlYWNoIG9mIHdoaWNoIGlzIGNhbGxlZCAiZmlsZXBhaXIiLCBhbHRob3VnaCBhdCB0aGlzIHBvaW50IGVhY2gKK29mIHRoZW0gdGFsa3MgYWJvdXQgYSBzaW5nbGUgZmlsZSksIGFuZCB0cmFuc2Zvcm1zIHN1Y2ggYSBsaXN0CitpbnRvIGFub3RoZXIgbGlzdC4gIFRoZXJlIGFyZSBjdXJyZW50bHkgNiBzdWNoIHRyYW5zZm9ybWF0aW9uczoKKworLSBkaWZmY29yZS1wYXRoc3BlYworLSBkaWZmY29yZS1icmVhaworLSBkaWZmY29yZS1yZW5hbWUKKy0gZGlmZmNvcmUtbWVyZ2UtYnJva2VuCistIGRpZmZjb3JlLXBpY2theGUKKy0gZGlmZmNvcmUtb3JkZXIKKworVGhlc2UgYXJlIGFwcGxpZWQgaW4gc2VxdWVuY2UuICBUaGUgc2V0IG9mIGZpbGVwYWlycyBnaXQtZGlmZi1cKgorY29tbWFuZHMgZmluZCBhcmUgdXNlZCBhcyB0aGUgaW5wdXQgdG8gZGlmZmNvcmUtcGF0aHNwZWMsIGFuZAordGhlIG91dHB1dCBmcm9tIGRpZmZjb3JlLXBhdGhzcGVjIGlzIHVzZWQgYXMgdGhlIGlucHV0IHRvIHRoZQorbmV4dCB0cmFuc2Zvcm1hdGlvbi4gIFRoZSBmaW5hbCByZXN1bHQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlCitvdXRwdXQgcm91dGluZSBhbmQgZ2VuZXJhdGVzIGVpdGhlciBkaWZmLXJhdyBmb3JtYXQgKHNlZSBPdXRwdXQKK2Zvcm1hdCBzZWN0aW9ucyBvZiB0aGUgbWFudWFsIGZvciBnaXQtZGlmZi1cKiBjb21tYW5kcykgb3IKK2RpZmYtcGF0Y2ggZm9ybWF0LgorCisKK2RpZmZjb3JlLXBhdGhzcGVjOiBGb3IgSWdub3JpbmcgRmlsZXMgT3V0c2lkZSBPdXIgQ29uc2lkZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmaXJzdCB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgY2hhaW4gaXMgZGlmZmNvcmUtcGF0aHNwZWMsIGFuZAoraXMgY29udHJvbGxlZCBieSBnaXZpbmcgdGhlIHBhdGhuYW1lIHBhcmFtZXRlcnMgdG8gdGhlCitnaXQtZGlmZi0qIGNvbW1hbmRzIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgcGF0aHNwZWMgaXMgdXNlZAordG8gbGltaXQgdGhlIHdvcmxkIGRpZmYgb3BlcmF0ZXMgaW4uICBJdCByZW1vdmVzIHRoZSBmaWxlcGFpcnMKK291dHNpZGUgdGhlIHNwZWNpZmllZCBzZXQgb2YgcGF0aG5hbWVzLiAgRS5nLiBJZiB0aGUgaW5wdXQgc2V0IAorb2YgZmlsZXBhaXJzIGluY2x1ZGVkOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IGJjZDEyMzQuLi4gMDEyMzQ1Ni4uLiBNIGp1bmtmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYnV0IHRoZSBjb21tYW5kIGludm9jYXRpb24gd2FzICJnaXQtZGlmZi1maWxlcyBteWZpbGUiLCB0aGVuIHRoZQoranVua2ZpbGUgZW50cnkgd291bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGJlY2F1c2Ugb25seSAibXlmaWxlIgoraXMgdW5kZXIgY29uc2lkZXJhdGlvbi4KKworSW1wbGVtZW50YXRpb24gbm90ZS4gIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBnaXQtZGlmZi10cmVlCit1c2VzIHRoZSBwYXRobmFtZSBwYXJhbWV0ZXJzIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gY3VsbCBzZXQgb2YKK2ZpbGVwYWlycyBpdCBmZWVkcyB0aGUgZGlmZmNvcmUgbWVjaGFuaXNtIGl0c2VsZiwgYW5kIGRvZXMgbm90Cit1c2UgZGlmZmNvcmUtcGF0aHNwZWMsIGJ1dCB0aGUgZW5kIHJlc3VsdCBpcyB0aGUgc2FtZS4KKworCitkaWZmY29yZS1icmVhazogRm9yIFNwbGl0dGluZyBVcCAiQ29tcGxldGUgUmV3cml0ZXMiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzZWNvbmQgdHJhbnNmb3JtYXRpb24gaW4gdGhlIGNoYWluIGlzIGRpZmZjb3JlLWJyZWFrLCBhbmQgaXMKK2NvbnRyb2xsZWQgYnkgdGhlIC1CIG9wdGlvbiB0byB0aGUgZ2l0LWRpZmYtKiBjb21tYW5kcy4gIFRoaXMgaXMKK3VzZWQgdG8gZGV0ZWN0IGEgZmlsZXBhaXIgdGhhdCByZXByZXNlbnRzICJjb21wbGV0ZSByZXdyaXRlIiBhbmQKK2JyZWFrIHN1Y2ggZmlsZXBhaXIgaW50byB0d28gZmlsZXBhaXJzIHRoYXQgcmVwcmVzZW50IGRlbGV0ZSBhbmQKK2NyZWF0ZS4gIEUuZy4gIElmIHRoZSBpbnB1dCBjb250YWluZWQgdGhpcyBmaWxlcGFpcjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGZpbGUgImZpbGUwIiBpcyBjb21wbGV0ZWx5IHJld3JpdHRlbiwKK2l0IGNoYW5nZXMgaXQgdG86CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAwMDAwMDAgYmNkMTIzNC4uLiAwMDAwMDAwLi4uIEQgZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDEyMzQ1Ni4uLiBBIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHRoZSBwdXJwb3NlIG9mIGJyZWFraW5nIGEgZmlsZXBhaXIsIGRpZmZjb3JlLWJyZWFrIGV4YW1pbmVzCit0aGUgZXh0ZW50IG9mIGNoYW5nZXMgYmV0d2VlbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIGJlZm9yZQorYW5kIGFmdGVyIG1vZGlmaWNhdGlvbiAoaS5lLiB0aGUgY29udGVudHMgdGhhdCBoYXZlICJiY2QxMjM0Li4uIgorYW5kICIwMTIzNDU2Li4uIiBhcyB0aGVpciBTSEExIGNvbnRlbnQgSUQsIGluIHRoZSBhYm92ZQorZXhhbXBsZSkuICBUaGUgYW1vdW50IG9mIGRlbGV0aW9uIG9mIG9yaWdpbmFsIGNvbnRlbnRzIGFuZAoraW5zZXJ0aW9uIG9mIG5ldyBtYXRlcmlhbCBhcmUgYWRkZWQgdG9nZXRoZXIsIGFuZCBpZiBpdCBleGNlZWRzCit0aGUgImJyZWFrIHNjb3JlIiwgdGhlIGZpbGVwYWlyIGlzIGJyb2tlbiBpbnRvIHR3by4gIFRoZSBicmVhaworc2NvcmUgZGVmYXVsdHMgdG8gNTAlIG9mIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVyIG9mIHRoZSBvcmlnaW5hbAorYW5kIHRoZSByZXN1bHQgKGkuZS4gaWYgdGhlIGVkaXQgc2hyaW5rcyB0aGUgZmlsZSwgdGhlIHNpemUgb2YKK3RoZSByZXN1bHQgaXMgdXNlZDsgaWYgdGhlIGVkaXQgbGVuZ3RoZW5zIHRoZSBmaWxlLCB0aGUgc2l6ZSBvZgordGhlIG9yaWdpbmFsIGlzIHVzZWQpLCBhbmQgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgZ2l2aW5nIGEgbnVtYmVyCithZnRlciAiLUIiIG9wdGlvbiAoZS5nLiAiLUI3NSIgdG8gdGVsbCBpdCB0byB1c2UgNzUlKS4KKworCitkaWZmY29yZS1yZW5hbWU6IEZvciBEZXRlY3Rpb24gUmVuYW1lcyBhbmQgQ29waWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgdHJhbnNmb3JtYXRpb24gaXMgdXNlZCB0byBkZXRlY3QgcmVuYW1lcyBhbmQgY29waWVzLCBhbmQgaXMKK2NvbnRyb2xsZWQgYnkgdGhlIC1NIG9wdGlvbiAodG8gZGV0ZWN0IHJlbmFtZXMpIGFuZCB0aGUgLUMgb3B0aW9uCisodG8gZGV0ZWN0IGNvcGllcyBhcyB3ZWxsKSB0byB0aGUgZ2l0LWRpZmYtKiBjb21tYW5kcy4gIElmIHRoZQoraW5wdXQgY29udGFpbmVkIHRoZXNlIGZpbGVwYWlyczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDAwMDAwMCAwMTIzNDU2Li4uIDAwMDAwMDAuLi4gRCBmaWxlWAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMTIzNDU2Li4uIEEgZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWxldGVkIGZpbGUgZmlsZVggaXMgc2ltaWxhciBlbm91Z2ggdG8KK3RoZSBjb250ZW50cyBvZiB0aGUgY3JlYXRlZCBmaWxlIGZpbGUwLCB0aGVuIHJlbmFtZSBkZXRlY3Rpb24KK21lcmdlcyB0aGVzZSBmaWxlcGFpcnMgYW5kIGNyZWF0ZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiAwMTIzNDU2Li4uIFIxMDAgZmlsZVggZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSAiLUMiIG9wdGlvbiBpcyB1c2VkLCB0aGUgb3JpZ2luYWwgY29udGVudHMgb2YgbW9kaWZpZWQgZmlsZXMsCithbmQgZGVsZXRlZCBmaWxlcyAoYW5kIGFsc28gdW5tb2RpZmllZCBmaWxlcywgaWYgdGhlCisiXC0tZmluZC1jb3BpZXMtaGFyZGVyIiBvcHRpb24gaXMgdXNlZCkgYXJlIGNvbnNpZGVyZWQgYXMgY2FuZGlkYXRlcworb2YgdGhlIHNvdXJjZSBmaWxlcyBpbiByZW5hbWUvY29weSBvcGVyYXRpb24uICBJZiB0aGUgaW5wdXQgd2VyZSBsaWtlCit0aGVzZSBmaWxlcGFpcnMsIHRoYXQgdGFsayBhYm91dCBhIG1vZGlmaWVkIGZpbGUgZmlsZVkgYW5kIGEgbmV3bHkKK2NyZWF0ZWQgZmlsZSBmaWxlMDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCAwMTIzNDU2Li4uIDEyMzQ1NjcuLi4gTSBmaWxlWQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiBiY2QzNDU2Li4uIEEgZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGUgb3JpZ2luYWwgY29udGVudHMgb2YgZmlsZVkgYW5kIHRoZSByZXN1bHRpbmcgY29udGVudHMgb2YKK2ZpbGUwIGFyZSBjb21wYXJlZCwgYW5kIGlmIHRoZXkgYXJlIHNpbWlsYXIgZW5vdWdoLCB0aGV5IGFyZQorY2hhbmdlZCB0bzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCAwMTIzNDU2Li4uIDEyMzQ1NjcuLi4gTSBmaWxlWQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiBiY2QzNDU2Li4uIEMxMDAgZmlsZVkgZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBib3RoIHJlbmFtZSBhbmQgY29weSBkZXRlY3Rpb24sIHRoZSBzYW1lICJleHRlbnQgb2YgY2hhbmdlcyIKK2FsZ29yaXRobSB1c2VkIGluIGRpZmZjb3JlLWJyZWFrIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHR3bworZmlsZXMgYXJlICJzaW1pbGFyIGVub3VnaCIsIGFuZCBjYW4gYmUgY3VzdG9taXplZCB0byB1c2UKK2Egc2ltaWxhcml0eSBzY29yZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBvZiA1MCUgYnkgZ2l2aW5nIGEKK251bWJlciBhZnRlciB0aGUgIi1NIiBvciAiLUMiIG9wdGlvbiAoZS5nLiAiLU04IiB0byB0ZWxsIGl0IHRvIHVzZQorOC8xMCA9IDgwJSkuCisKK05vdGUuICBXaGVuIHRoZSAiLUMiIG9wdGlvbiBpcyB1c2VkIHdpdGggYFwtLWZpbmQtY29waWVzLWhhcmRlcmAKK29wdGlvbiwgZ2l0LWRpZmYtXCogY29tbWFuZHMgZmVlZCB1bm1vZGlmaWVkIGZpbGVwYWlycyB0bworZGlmZmNvcmUgbWVjaGFuaXNtIGFzIHdlbGwgYXMgbW9kaWZpZWQgb25lcy4gIFRoaXMgbGV0cyB0aGUgY29weQorZGV0ZWN0b3IgY29uc2lkZXIgdW5tb2RpZmllZCBmaWxlcyBhcyBjb3B5IHNvdXJjZSBjYW5kaWRhdGVzIGF0Cit0aGUgZXhwZW5zZSBvZiBtYWtpbmcgaXQgc2xvd2VyLiAgV2l0aG91dCBgXC0tZmluZC1jb3BpZXMtaGFyZGVyYCwKK2dpdC1kaWZmLVwqIGNvbW1hbmRzIGNhbiBkZXRlY3QgY29waWVzIG9ubHkgaWYgdGhlIGZpbGUgdGhhdCB3YXMKK2NvcGllZCBoYXBwZW5lZCB0byBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gdGhlIHNhbWUgY2hhbmdlc2V0LgorCisKK2RpZmZjb3JlLW1lcmdlLWJyb2tlbjogRm9yIFB1dHRpbmcgIkNvbXBsZXRlIFJld3JpdGVzIiBCYWNrIFRvZ2V0aGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gbWVyZ2UgZmlsZXBhaXJzIGJyb2tlbiBieQorZGlmZmNvcmUtYnJlYWssIGFuZCBub3QgdHJhbnNmb3JtZWQgaW50byByZW5hbWUvY29weSBieQorZGlmZmNvcmUtcmVuYW1lLCBiYWNrIGludG8gYSBzaW5nbGUgbW9kaWZpY2F0aW9uLiAgVGhpcyBhbHdheXMKK3J1bnMgd2hlbiBkaWZmY29yZS1icmVhayBpcyB1c2VkLgorCitGb3IgdGhlIHB1cnBvc2Ugb2YgbWVyZ2luZyBicm9rZW4gZmlsZXBhaXJzIGJhY2ssIGl0IHVzZXMgYQorZGlmZmVyZW50ICJleHRlbnQgb2YgY2hhbmdlcyIgY29tcHV0YXRpb24gZnJvbSB0aGUgb25lcyB1c2VkIGJ5CitkaWZmY29yZS1icmVhayBhbmQgZGlmZmNvcmUtcmVuYW1lLiAgSXQgY291bnRzIG9ubHkgdGhlIGRlbGV0aW9uCitmcm9tIHRoZSBvcmlnaW5hbCwgYW5kIGRvZXMgbm90IGNvdW50IGluc2VydGlvbi4gIElmIHlvdSByZW1vdmVkCitvbmx5IDEwIGxpbmVzIGZyb20gYSAxMDAtbGluZSBkb2N1bWVudCwgZXZlbiBpZiB5b3UgYWRkZWQgOTEwCituZXcgbGluZXMgdG8gbWFrZSBhIG5ldyAxMDAwLWxpbmUgZG9jdW1lbnQsIHlvdSBkaWQgbm90IGRvIGEKK2NvbXBsZXRlIHJld3JpdGUuICBkaWZmY29yZS1icmVhayBicmVha3Mgc3VjaCBhIGNhc2UgaW4gb3JkZXIgdG8KK2hlbHAgZGlmZmNvcmUtcmVuYW1lIHRvIGNvbnNpZGVyIHN1Y2ggZmlsZXBhaXJzIGFzIGNhbmRpZGF0ZSBvZgorcmVuYW1lL2NvcHkgZGV0ZWN0aW9uLCBidXQgaWYgZmlsZXBhaXJzIGJyb2tlbiB0aGF0IHdheSB3ZXJlIG5vdAorbWF0Y2hlZCB3aXRoIG90aGVyIGZpbGVwYWlycyB0byBjcmVhdGUgcmVuYW1lL2NvcHksIHRoZW4gdGhpcwordHJhbnNmb3JtYXRpb24gbWVyZ2VzIHRoZW0gYmFjayBpbnRvIHRoZSBvcmlnaW5hbAorIm1vZGlmaWNhdGlvbiIuCisKK1RoZSAiZXh0ZW50IG9mIGNoYW5nZXMiIHBhcmFtZXRlciBjYW4gYmUgdHdlYWtlZCBmcm9tIHRoZQorZGVmYXVsdCA4MCUgKHRoYXQgaXMsIHVubGVzcyBtb3JlIHRoYW4gODAlIG9mIHRoZSBvcmlnaW5hbAorbWF0ZXJpYWwgaXMgZGVsZXRlZCwgdGhlIGJyb2tlbiBwYWlycyBhcmUgbWVyZ2VkIGJhY2sgaW50byBhCitzaW5nbGUgbW9kaWZpY2F0aW9uKSBieSBnaXZpbmcgYSBzZWNvbmQgbnVtYmVyIHRvIC1CIG9wdGlvbiwKK2xpa2UgdGhlc2U6CisKKyogLUI1MC82MCAoZ2l2ZSA1MCUgImJyZWFrIHNjb3JlIiB0byBkaWZmY29yZS1icmVhaywgdXNlIDYwJQorICBmb3IgZGlmZmNvcmUtbWVyZ2UtYnJva2VuKS4KKworKiAtQi82MCAodGhlIHNhbWUgYXMgYWJvdmUsIHNpbmNlIGRpZmZjb3JlLWJyZWFrIGRlZmF1bHRzIHRvIDUwJSkuCisKK05vdGUgdGhhdCBlYXJsaWVyIGltcGxlbWVudGF0aW9uIGxlZnQgYSBicm9rZW4gcGFpciBhcyBhIHNlcGFyYXRlCitjcmVhdGlvbiBhbmQgZGVsZXRpb24gcGF0Y2hlcy4gIFRoaXMgd2FzIGFuIHVubmVjZXNzYXJ5IGhhY2sgYW5kCit0aGUgbGF0ZXN0IGltcGxlbWVudGF0aW9uIGFsd2F5cyBtZXJnZXMgYWxsIHRoZSBicm9rZW4gcGFpcnMKK2JhY2sgaW50byBtb2RpZmljYXRpb25zLCBidXQgdGhlIHJlc3VsdGluZyBwYXRjaCBvdXRwdXQgaXMKK2Zvcm1hdHRlZCBkaWZmZXJlbnRseSBmb3IgZWFzaWVyIHJldmlldyBpbiBjYXNlIG9mIHN1Y2gKK2EgY29tcGxldGUgcmV3cml0ZSBieSBzaG93aW5nIHRoZSBlbnRpcmUgY29udGVudHMgb2Ygb2xkIHZlcnNpb24KK3ByZWZpeGVkIHdpdGggJy0nLCBmb2xsb3dlZCBieSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIG5ldwordmVyc2lvbiBwcmVmaXhlZCB3aXRoICcrJy4KKworCitkaWZmY29yZS1waWNrYXhlOiBGb3IgRGV0ZWN0aW5nIEFkZGl0aW9uL0RlbGV0aW9uIG9mIFNwZWNpZmllZCBTdHJpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gZmluZCBmaWxlcGFpcnMgdGhhdCByZXByZXNlbnQKK2NoYW5nZXMgdGhhdCB0b3VjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGFuZCBpcyBjb250cm9sbGVkIGJ5IHRoZQorLVMgb3B0aW9uIGFuZCB0aGUgYFwtLXBpY2theGUtYWxsYCBvcHRpb24gdG8gdGhlIGdpdC1kaWZmLSoKK2NvbW1hbmRzLgorCitXaGVuIGRpZmZjb3JlLXBpY2theGUgaXMgaW4gdXNlLCBpdCBjaGVja3MgaWYgdGhlcmUgYXJlCitmaWxlcGFpcnMgd2hvc2UgIm9yaWdpbmFsIiBzaWRlIGhhcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQKK3dob3NlICJyZXN1bHQiIHNpZGUgZG9lcyBub3QuICBTdWNoIGEgZmlsZXBhaXIgcmVwcmVzZW50cyAidGhlCitzdHJpbmcgYXBwZWFyZWQgaW4gdGhpcyBjaGFuZ2VzZXQiLiAgSXQgYWxzbyBjaGVja3MgZm9yIHRoZQorb3Bwb3NpdGUgY2FzZSB0aGF0IGxvc2VzIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgorCitXaGVuIGBcLS1waWNrYXhlLWFsbGAgaXMgbm90IGluIGVmZmVjdCwgZGlmZmNvcmUtcGlja2F4ZSBsZWF2ZXMKK29ubHkgc3VjaCBmaWxlcGFpcnMgdGhhdCB0b3VjaCB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbiBpdHMKK291dHB1dC4gIFdoZW4gYFwtLXBpY2theGUtYWxsYCBpcyB1c2VkLCBkaWZmY29yZS1waWNrYXhlIGxlYXZlcyBhbGwKK2ZpbGVwYWlycyBpbnRhY3QgaWYgdGhlcmUgaXMgc3VjaCBhIGZpbGVwYWlyLCBvciBtYWtlcyB0aGUKK291dHB1dCBlbXB0eSBvdGhlcndpc2UuICBUaGUgbGF0dGVyIGJlaGF2aW91ciBpcyBkZXNpZ25lZCB0bworbWFrZSByZXZpZXdpbmcgb2YgdGhlIGNoYW5nZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdob2xlCitjaGFuZ2VzZXQgZWFzaWVyLgorCisKK2RpZmZjb3JlLW9yZGVyOiBGb3IgU29ydGluZyB0aGUgT3V0cHV0IEJhc2VkIG9uIEZpbGVuYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdXNlZCB0byByZW9yZGVyIHRoZSBmaWxlcGFpcnMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MKKyhvciBwcm9qZWN0J3MpIHRhc3RlLCBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUgLU8gb3B0aW9uIHRvIHRoZQorZ2l0LWRpZmYtKiBjb21tYW5kcy4KKworVGhpcyB0YWtlcyBhIHRleHQgZmlsZSBlYWNoIG9mIHdob3NlIGxpbmVzIGlzIGEgc2hlbGwgZ2xvYgorcGF0dGVybi4gIEZpbGVwYWlycyB0aGF0IG1hdGNoIGEgZ2xvYiBwYXR0ZXJuIG9uIGFuIGVhcmxpZXIgbGluZQoraW4gdGhlIGZpbGUgYXJlIG91dHB1dCBiZWZvcmUgb25lcyB0aGF0IG1hdGNoIGEgbGF0ZXIgbGluZSwgYW5kCitmaWxlcGFpcnMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IGdsb2IgcGF0dGVybiBhcmUgb3V0cHV0IGxhc3QuCisKK0FzIGFuIGV4YW1wbGUsIGEgdHlwaWNhbCBvcmRlcmZpbGUgZm9yIHRoZSBjb3JlIGdpdCBwcm9iYWJseQord291bGQgbG9vayBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUkVBRE1FCitNYWtlZmlsZQorRG9jdW1lbnRhdGlvbgorKi5oCisqLmMKK3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RvY2Jvb2steHNsLmNzcyBiL0RvY3VtZW50YXRpb24vZG9jYm9vay14c2wuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjFlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RvY2Jvb2steHNsLmNzcwpAQCAtMCwwICsxLDI4NiBAQAorLyoNCisgIENTUyBzdHlsZXNoZWV0IGZvciBYSFRNTCBwcm9kdWNlZCBieSBEb2NCb29rIFhTTCBzdHlsZXNoZWV0cy4NCisgIFRlc3RlZCB3aXRoIFhTTCBzdHlsZXNoZWV0cyAxLjYxLjIsIDEuNjcuMg0KKyovDQorDQorc3Bhbi5zdHJvbmcgew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KKw0KK2JvZHkgYmxvY2txdW90ZSB7DQorICBtYXJnaW4tdG9wOiAuNzVlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjU7DQorICBtYXJnaW4tYm90dG9tOiAuNzVlbTsNCit9DQorDQoraHRtbCBib2R5IHsNCisgIG1hcmdpbjogMWVtIDUlIDFlbSA1JTsNCisgIGxpbmUtaGVpZ2h0OiAxLjI7DQorfQ0KKw0KK2JvZHkgZGl2IHsNCisgIG1hcmdpbjogMDsNCit9DQorDQoraDEsIGgyLCBoMywgaDQsIGg1LCBoNiwNCitkaXYudG9jIHAgYiwNCitkaXYubGlzdC1vZi1maWd1cmVzIHAgYiwNCitkaXYubGlzdC1vZi10YWJsZXMgcCBiLA0KK2Rpdi5hYnN0cmFjdCBwLnRpdGxlDQorew0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LWZhbWlseTogdGFob21hLCB2ZXJkYW5hLCBzYW5zLXNlcmlmOw0KK30NCisNCitkaXYudG9jIHA6Zmlyc3QtY2hpbGQsDQorZGl2Lmxpc3Qtb2YtZmlndXJlcyBwOmZpcnN0LWNoaWxkLA0KK2Rpdi5saXN0LW9mLXRhYmxlcyBwOmZpcnN0LWNoaWxkLA0KK2Rpdi5leGFtcGxlIHAudGl0bGUNCit7DQorICBtYXJnaW4tYm90dG9tOiAwLjJlbTsNCit9DQorDQorYm9keSBoMSB7DQorICBtYXJnaW46IC4wZW0gMCAwIC00JTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCisNCitib2R5IGgyIHsNCisgIG1hcmdpbjogMC41ZW0gMCAwIC00JTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorICBib3JkZXItYm90dG9tOiAycHggc29saWQgc2lsdmVyOw0KK30NCisNCitib2R5IGgzIHsNCisgIG1hcmdpbjogLjhlbSAwIDAgLTMlOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQorYm9keSBoNCB7DQorICBtYXJnaW46IC44ZW0gMCAwIC0zJTsNCisgIGxpbmUtaGVpZ2h0OiAxLjM7DQorfQ0KKw0KK2JvZHkgaDUgew0KKyAgbWFyZ2luOiAuOGVtIDAgMCAtMiU7DQorICBsaW5lLWhlaWdodDogMS4zOw0KK30NCisNCitib2R5IGg2IHsNCisgIG1hcmdpbjogLjhlbSAwIDAgLTElOw0KKyAgbGluZS1oZWlnaHQ6IDEuMzsNCit9DQorDQorYm9keSBociB7DQorICBib3JkZXI6IG5vbmU7IC8qIEJyb2tlbiBvbiBJRTYgKi8NCit9DQorZGl2LmZvb3Rub3RlcyBociB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KK2Rpdi5uYXZoZWFkZXIgdGgsIGRpdi5uYXZoZWFkZXIgdGQsIGRpdi5uYXZmb290ZXIgdGQgew0KKyAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7DQorICBmb250LXNpemU6IDAuOWVtOw0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorICBjb2xvcjogIzUyN2JiZDsNCit9DQorZGl2Lm5hdmhlYWRlciBpbWcsIGRpdi5uYXZmb290ZXIgaW1nIHsNCisgIGJvcmRlci1zdHlsZTogbm9uZTsNCit9DQorZGl2Lm5hdmhlYWRlciBhLCBkaXYubmF2Zm9vdGVyIGEgew0KKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCit9DQorZGl2Lm5hdmZvb3RlciBociB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KK2JvZHkgdGQgew0KKyAgbGluZS1oZWlnaHQ6IDEuMg0KK30NCisNCitib2R5IHRoIHsNCisgIGxpbmUtaGVpZ2h0OiAxLjI7DQorfQ0KKw0KK29sIHsNCisgIGxpbmUtaGVpZ2h0OiAxLjI7DQorfQ0KKw0KK3VsLCBib2R5IGRpciwgYm9keSBtZW51IHsNCisgIGxpbmUtaGVpZ2h0OiAxLjI7DQorfQ0KKw0KK2h0bWwgew0KKyAgbWFyZ2luOiAwOyANCisgIHBhZGRpbmc6IDA7DQorfQ0KKw0KK2JvZHkgaDEsIGJvZHkgaDIsIGJvZHkgaDMsIGJvZHkgaDQsIGJvZHkgaDUsIGJvZHkgaDYgew0KKyAgbWFyZ2luLWxlZnQ6IDANCit9IA0KKw0KK2JvZHkgcHJlIHsNCisgIG1hcmdpbjogMC41ZW0gMTAlIDAuNWVtIDFlbTsNCisgIGxpbmUtaGVpZ2h0OiAxLjA7DQorICBjb2xvcjogbmF2eTsNCit9DQorDQordHQubGl0ZXJhbCwgY29kZS5saXRlcmFsIHsNCisgIGNvbG9yOiBuYXZ5Ow0KK30NCisNCitkaXYubGl0ZXJhbGxheW91dCBwIHsNCisgIHBhZGRpbmc6IDBlbTsNCisgIG1hcmdpbjogMGVtOw0KK30NCisNCitkaXYubGl0ZXJhbGxheW91dCB7DQorICBmb250LWZhbWlseTogbW9ub3NwYWNlOw0KKyMgIG1hcmdpbjogMC41ZW0gMTAlIDAuNWVtIDFlbTsNCisgIG1hcmdpbjogMGVtOw0KKyAgY29sb3I6IG5hdnk7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBiYWNrZ3JvdW5kOiAjZjRmNGY0Ow0KKyAgcGFkZGluZzogMC41ZW07DQorfQ0KKw0KKy5wcm9ncmFtbGlzdGluZywgLnNjcmVlbiB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorICBiYWNrZ3JvdW5kOiAjZjRmNGY0Ow0KKyAgbWFyZ2luOiAwLjVlbSAxMCUgMC41ZW0gMDsNCisgIHBhZGRpbmc6IDAuNWVtIDFlbTsNCit9DQorDQorZGl2LnNpZGViYXIgew0KKyAgYmFja2dyb3VuZDogI2ZmZmZlZTsNCisgIG1hcmdpbjogMS4wZW0gMTAlIDAuNWVtIDA7DQorICBwYWRkaW5nOiAwLjVlbSAxZW07DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KK2Rpdi5zaWRlYmFyICogeyBwYWRkaW5nOiAwOyB9DQorZGl2LnNpZGViYXIgZGl2IHsgbWFyZ2luOiAwOyB9DQorZGl2LnNpZGViYXIgcC50aXRsZSB7DQorICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsNCisgIG1hcmdpbi10b3A6IDAuNWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC4yZW07DQorfQ0KKw0KK2Rpdi5iaWJsaW9taXhlZCB7DQorICBtYXJnaW46IDAuNWVtIDUlIDAuNWVtIDFlbTsNCit9DQorDQorZGl2Lmdsb3NzYXJ5IGR0IHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCitkaXYuZ2xvc3NhcnkgZGQgcCB7DQorICBtYXJnaW4tdG9wOiAwLjJlbTsNCit9DQorDQorZGwgew0KKyAgbWFyZ2luOiAuOGVtIDA7DQorICBsaW5lLWhlaWdodDogMS4yOw0KK30NCisNCitkdCB7DQorICBtYXJnaW4tdG9wOiAwLjVlbTsNCit9DQorDQorZHQgc3Bhbi50ZXJtIHsNCisgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCit9DQorDQorZGl2LnZhcmlhYmxlbGlzdCBkZCBwIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK2Rpdi5pdGVtaXplZGxpc3QgbGksIGRpdi5vcmRlcmVkbGlzdCBsaSB7DQorICBtYXJnaW4tbGVmdDogLTAuOGVtOw0KKyAgbWFyZ2luLXRvcDogMC41ZW07DQorfQ0KKw0KK3VsLCBvbCB7DQorICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQorfQ0KKw0KK2Rpdi5zaWRlYmFyIHVsLCBkaXYuc2lkZWJhciBvbCB7DQorICAgIG1hcmdpbi1sZWZ0OiAyLjhlbTsNCit9DQorDQorZGl2Lml0ZW1pemVkbGlzdCBwLnRpdGxlLA0KK2Rpdi5vcmRlcmVkbGlzdCBwLnRpdGxlLA0KK2Rpdi52YXJpYWJsZWxpc3QgcC50aXRsZQ0KK3sNCisgIG1hcmdpbi1ib3R0b206IC0wLjhlbTsNCit9DQorDQorZGl2LnJldmhpc3RvcnkgdGFibGUgew0KKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCisgIGJvcmRlcjogbm9uZTsNCit9DQorZGl2LnJldmhpc3RvcnkgdGggew0KKyAgYm9yZGVyOiBub25lOw0KKyAgY29sb3I6ICM1MjdiYmQ7DQorICBmb250LWZhbWlseTogdGFob21hLCB2ZXJkYW5hLCBzYW5zLXNlcmlmOw0KK30NCitkaXYucmV2aGlzdG9yeSB0ZCB7DQorICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7DQorfQ0KKw0KKy8qIEtlZXAgVE9DIGFuZCBpbmRleCBsaW5lcyBjbG9zZSB0b2dldGhlci4gKi8NCitkaXYudG9jIGRsLCBkaXYudG9jIGR0LA0KK2Rpdi5saXN0LW9mLWZpZ3VyZXMgZGwsIGRpdi5saXN0LW9mLWZpZ3VyZXMgZHQsDQorZGl2Lmxpc3Qtb2YtdGFibGVzIGRsLCBkaXYubGlzdC1vZi10YWJsZXMgZHQsDQorZGl2LmluZGV4ZGl2IGRsLCBkaXYuaW5kZXhkaXYgZHQNCit7DQorICBsaW5lLWhlaWdodDogbm9ybWFsOw0KKyAgbWFyZ2luLXRvcDogMDsNCisgIG1hcmdpbi1ib3R0b206IDA7DQorfQ0KKw0KKy8qDQorICBUYWJsZSBzdHlsaW5nIGRvZXMgbm90IHdvcmsgYmVjYXVzZSBvZiBvdmVycmlkaW5nIGF0dHJpYnV0ZXMgaW4NCisgIGdlbmVyYXRlZCBIVE1MLg0KKyovDQorZGl2LnRhYmxlIHRhYmxlLA0KK2Rpdi5pbmZvcm1hbHRhYmxlIHRhYmxlDQorew0KKyAgICBtYXJnaW4tbGVmdDogMDsNCisgICAgbWFyZ2luLXJpZ2h0OiA1JTsNCisgICAgbWFyZ2luLWJvdHRvbTogMC44ZW07DQorfQ0KK2Rpdi5pbmZvcm1hbHRhYmxlIHRhYmxlDQorew0KKyAgICBtYXJnaW4tdG9wOiAwLjRlbQ0KK30NCitkaXYudGFibGUgdGhlYWQsDQorZGl2LnRhYmxlIHRmb290LA0KK2Rpdi50YWJsZSB0Ym9keSwNCitkaXYuaW5mb3JtYWx0YWJsZSB0aGVhZCwNCitkaXYuaW5mb3JtYWx0YWJsZSB0Zm9vdCwNCitkaXYuaW5mb3JtYWx0YWJsZSB0Ym9keQ0KK3sNCisgICAgLyogTm8gZWZmZWN0IGluIElFNi4gKi8NCisgICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICM1MjdiYmQ7DQorICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNTI3YmJkOw0KK30NCitkaXYudGFibGUgdGhlYWQsIGRpdi50YWJsZSB0Zm9vdCwNCitkaXYuaW5mb3JtYWx0YWJsZSB0aGVhZCwgZGl2LmluZm9ybWFsdGFibGUgdGZvb3QNCit7DQorICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KK30NCisNCitkaXYubWVkaWFvYmplY3QgaW1nIHsNCisgICAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOw0KKyAgICBtYXJnaW4tYm90dG9tOiAwLjhlbTsNCit9DQorZGl2LmZpZ3VyZSBwLnRpdGxlLA0KK2Rpdi50YWJsZSBwLnRpdGxlDQorew0KKyAgbWFyZ2luLXRvcDogMWVtOw0KKyAgbWFyZ2luLWJvdHRvbTogMC40ZW07DQorfQ0KKw0KK0BtZWRpYSBwcmludCB7DQorICBkaXYubmF2aGVhZGVyLCBkaXYubmF2Zm9vdGVyIHsgZGlzcGxheTogbm9uZTsgfQ0KK30NCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dCBiL0RvY3VtZW50YXRpb24vZXZlcnlkYXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzYxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dApAQCAtMCwwICsxLDQ2NSBAQAorRXZlcnlkYXkgR0lUIFdpdGggMjAgQ29tbWFuZHMgT3IgU28KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzw8QmFzaWMgUmVwb3NpdG9yeT4+IGNvbW1hbmRzIGFyZSBuZWVkZWQgYnkgcGVvcGxlIHdobyBoYXZlIGEKK3JlcG9zaXRvcnkgLS0tIHRoYXQgaXMgZXZlcnlib2R5LCBiZWNhdXNlIGV2ZXJ5IHdvcmtpbmcgdHJlZSBvZgorZ2l0IGlzIGEgcmVwb3NpdG9yeS4KKworSW4gYWRkaXRpb24sIDw8SW5kaXZpZHVhbCBEZXZlbG9wZXIgKFN0YW5kYWxvbmUpPj4gY29tbWFuZHMgYXJlCitlc3NlbnRpYWwgZm9yIGFueWJvZHkgd2hvIG1ha2VzIGEgY29tbWl0LCBldmVuIGZvciBzb21lYm9keSB3aG8KK3dvcmtzIGFsb25lLgorCitJZiB5b3Ugd29yayB3aXRoIG90aGVyIHBlb3BsZSwgeW91IHdpbGwgbmVlZCBjb21tYW5kcyBsaXN0ZWQgaW4KK3RoZSA8PEluZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudCk+PiBzZWN0aW9uIGFzIHdlbGwuCisKK1Blb3BsZSB3aG8gcGxheSB0aGUgPDxJbnRlZ3JhdG9yPj4gcm9sZSBuZWVkIHRvIGxlYXJuIHNvbWUgbW9yZQorY29tbWFuZHMgaW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLgorCis8PFJlcG9zaXRvcnkgQWRtaW5pc3RyYXRpb24+PiBjb21tYW5kcyBhcmUgZm9yIHN5c3RlbQorYWRtaW5pc3RyYXRvcnMgd2hvIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIGNhcmUgYW5kIGZlZWRpbmcKK29mIGdpdCByZXBvc2l0b3JpZXMuCisKKworQmFzaWMgUmVwb3NpdG9yeVtbQmFzaWMgUmVwb3NpdG9yeV1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXZlcnlib2R5IHVzZXMgdGhlc2UgY29tbWFuZHMgdG8gbWFpbnRhaW4gZ2l0IHJlcG9zaXRvcmllcy4KKworICAqIGdpdGxpbms6Z2l0LWluaXRbMV0gb3IgZ2l0bGluazpnaXQtY2xvbmVbMV0gdG8gY3JlYXRlIGEKKyAgICBuZXcgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LWZzY2tbMV0gdG8gY2hlY2sgdGhlIHJlcG9zaXRvcnkgZm9yIGVycm9ycy4KKworICAqIGdpdGxpbms6Z2l0LXBydW5lWzFdIHRvIHJlbW92ZSB1bnVzZWQgb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXJlcGFja1sxXSB0byBwYWNrIGxvb3NlIG9iamVjdHMgZm9yIGVmZmljaWVuY3kuCisKKyAgKiBnaXRsaW5rOmdpdC1nY1sxXSB0byBkbyBjb21tb24gaG91c2VrZWVwaW5nIHRhc2tzIHN1Y2ggYXMKKyAgICByZXBhY2sgYW5kIHBydW5lLgorCitFeGFtcGxlcworfn5+fn5+fn4KKworQ2hlY2sgaGVhbHRoIGFuZCByZW1vdmUgY3J1ZnQuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZnNjayA8MT4KKyQgZ2l0IGNvdW50LW9iamVjdHMgPDI+CiskIGdpdCByZXBhY2sgPDM+CiskIGdpdCBnYyA8ND4KKy0tLS0tLS0tLS0tLQorKworPDE+IHJ1bm5pbmcgd2l0aG91dCBgXC0tZnVsbGAgaXMgdXN1YWxseSBjaGVhcCBhbmQgYXNzdXJlcyB0aGUKK3JlcG9zaXRvcnkgaGVhbHRoIHJlYXNvbmFibHkgd2VsbC4KKzwyPiBjaGVjayBob3cgbWFueSBsb29zZSBvYmplY3RzIHRoZXJlIGFyZSBhbmQgaG93IG11Y2gKK2Rpc2sgc3BhY2UgaXMgd2FzdGVkIGJ5IG5vdCByZXBhY2tpbmcuCis8Mz4gd2l0aG91dCBgLWFgIHJlcGFja3MgaW5jcmVtZW50YWxseS4gIHJlcGFja2luZyBldmVyeSA0LTVNQgorb2YgbG9vc2Ugb2JqZWN0cyBhY2N1bXVsYXRpb24gbWF5IGJlIGEgZ29vZCBydWxlIG9mIHRodW1iLgorPDQ+IGl0IGlzIGVhc2llciB0byB1c2UgYGdpdCBnY2AgdGhhbiBpbmRpdmlkdWFsIGhvdXNla2VlcGluZyBjb21tYW5kcworc3VjaCBhcyBgcHJ1bmVgIGFuZCBgcmVwYWNrYC4gIFRoaXMgcnVucyBgcmVwYWNrIC1hIC1kYC4KKworUmVwYWNrIGEgc21hbGwgcHJvamVjdCBpbnRvIHNpbmdsZSBwYWNrLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHJlcGFjayAtYSAtZCA8MT4KKyQgZ2l0IHBydW5lCistLS0tLS0tLS0tLS0KKysKKzwxPiBwYWNrIGFsbCB0aGUgb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgcmVmcyBpbnRvIG9uZSBwYWNrLAordGhlbiByZW1vdmUgdGhlIG90aGVyIHBhY2tzLgorCisKK0luZGl2aWR1YWwgRGV2ZWxvcGVyIChTdGFuZGFsb25lKVtbSW5kaXZpZHVhbCBEZXZlbG9wZXIgKFN0YW5kYWxvbmUpXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBzdGFuZGFsb25lIGluZGl2aWR1YWwgZGV2ZWxvcGVyIGRvZXMgbm90IGV4Y2hhbmdlIHBhdGNoZXMgd2l0aAorb3RoZXIgcGVvcGxlLCBhbmQgd29ya3MgYWxvbmUgaW4gYSBzaW5nbGUgcmVwb3NpdG9yeSwgdXNpbmcgdGhlCitmb2xsb3dpbmcgY29tbWFuZHMuCisKKyAgKiBnaXRsaW5rOmdpdC1zaG93LWJyYW5jaFsxXSB0byBzZWUgd2hlcmUgeW91IGFyZS4KKworICAqIGdpdGxpbms6Z2l0LWxvZ1sxXSB0byBzZWUgd2hhdCBoYXBwZW5lZC4KKworICAqIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIGFuZCBnaXRsaW5rOmdpdC1icmFuY2hbMV0gdG8gc3dpdGNoCisgICAgYnJhbmNoZXMuCisKKyAgKiBnaXRsaW5rOmdpdC1hZGRbMV0gdG8gbWFuYWdlIHRoZSBpbmRleCBmaWxlLgorCisgICogZ2l0bGluazpnaXQtZGlmZlsxXSBhbmQgZ2l0bGluazpnaXQtc3RhdHVzWzFdIHRvIHNlZSB3aGF0CisgICAgeW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nLgorCisgICogZ2l0bGluazpnaXQtY29tbWl0WzFdIHRvIGFkdmFuY2UgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisgICogZ2l0bGluazpnaXQtcmVzZXRbMV0gYW5kIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdICh3aXRoCisgICAgcGF0aG5hbWUgcGFyYW1ldGVycykgdG8gdW5kbyBjaGFuZ2VzLgorCisgICogZ2l0bGluazpnaXQtbWVyZ2VbMV0gdG8gbWVyZ2UgYmV0d2VlbiBsb2NhbCBicmFuY2hlcy4KKworICAqIGdpdGxpbms6Z2l0LXJlYmFzZVsxXSB0byBtYWludGFpbiB0b3BpYyBicmFuY2hlcy4KKworICAqIGdpdGxpbms6Z2l0LXRhZ1sxXSB0byBtYXJrIGtub3duIHBvaW50LgorCitFeGFtcGxlcworfn5+fn5+fn4KKworVXNlIGEgdGFyYmFsbCBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvciBhIG5ldyByZXBvc2l0b3J5Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgdGFyIHp4ZiBmcm90ei50YXIuZ3oKKyQgY2QgZnJvdHoKKyQgZ2l0LWluaXQKKyQgZ2l0IGFkZCAuIDwxPgorJCBnaXQgY29tbWl0IC1tICdpbXBvcnQgb2YgZnJvdHogc291cmNlIHRyZWUuJworJCBnaXQgdGFnIHYyLjQzIDwyPgorLS0tLS0tLS0tLS0tCisrCis8MT4gYWRkIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorPDI+IG1ha2UgYSBsaWdodHdlaWdodCwgdW5hbm5vdGF0ZWQgdGFnLgorCitDcmVhdGUgYSB0b3BpYyBicmFuY2ggYW5kIGRldmVsb3AuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgYWxzYS1hdWRpbyA8MT4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGNoZWNrb3V0IC0tIGN1cnNlcy91eF9hdWRpb19vc3MuYyA8Mj4KKyQgZ2l0IGFkZCBjdXJzZXMvdXhfYXVkaW9fYWxzYS5jIDwzPgorJCBlZGl0L2NvbXBpbGUvdGVzdAorJCBnaXQgZGlmZiBIRUFEIDw0PgorJCBnaXQgY29tbWl0IC1hIC1zIDw1PgorJCBlZGl0L2NvbXBpbGUvdGVzdAorJCBnaXQgcmVzZXQgLS1zb2Z0IEhFQUReIDw2PgorJCBlZGl0L2NvbXBpbGUvdGVzdAorJCBnaXQgZGlmZiBPUklHX0hFQUQgPDc+CiskIGdpdCBjb21taXQgLWEgLWMgT1JJR19IRUFEIDw4PgorJCBnaXQgY2hlY2tvdXQgbWFzdGVyIDw5PgorJCBnaXQgbWVyZ2UgYWxzYS1hdWRpbyA8MTA+CiskIGdpdCBsb2cgLS1zaW5jZT0nMyBkYXlzIGFnbycgPDExPgorJCBnaXQgbG9nIHYyLjQzLi4gY3Vyc2VzLyA8MTI+CistLS0tLS0tLS0tLS0KKysKKzwxPiBjcmVhdGUgYSBuZXcgdG9waWMgYnJhbmNoLgorPDI+IHJldmVydCB5b3VyIGJvdGNoZWQgY2hhbmdlcyBpbiBgY3Vyc2VzL3V4X2F1ZGlvX29zcy5jYC4KKzwzPiB5b3UgbmVlZCB0byB0ZWxsIGdpdCBpZiB5b3UgYWRkZWQgYSBuZXcgZmlsZTsgcmVtb3ZhbCBhbmQKK21vZGlmaWNhdGlvbiB3aWxsIGJlIGNhdWdodCBpZiB5b3UgZG8gYGdpdCBjb21taXQgLWFgIGxhdGVyLgorPDQ+IHRvIHNlZSB3aGF0IGNoYW5nZXMgeW91IGFyZSBjb21taXR0aW5nLgorPDU+IGNvbW1pdCBldmVyeXRoaW5nIGFzIHlvdSBoYXZlIHRlc3RlZCwgd2l0aCB5b3VyIHNpZ24tb2ZmLgorPDY+IHRha2UgdGhlIGxhc3QgY29tbWl0IGJhY2ssIGtlZXBpbmcgd2hhdCBpcyBpbiB0aGUgd29ya2luZyB0cmVlLgorPDc+IGxvb2sgYXQgdGhlIGNoYW5nZXMgc2luY2UgdGhlIHByZW1hdHVyZSBjb21taXQgd2UgdG9vayBiYWNrLgorPDg+IHJlZG8gdGhlIGNvbW1pdCB1bmRvbmUgaW4gdGhlIHByZXZpb3VzIHN0ZXAsIHVzaW5nIHRoZSBtZXNzYWdlCit5b3Ugb3JpZ2luYWxseSB3cm90ZS4KKzw5PiBzd2l0Y2ggdG8gdGhlIG1hc3RlciBicmFuY2guCis8MTA+IG1lcmdlIGEgdG9waWMgYnJhbmNoIGludG8geW91ciBtYXN0ZXIgYnJhbmNoLgorPDExPiByZXZpZXcgY29tbWl0IGxvZ3M7IG90aGVyIGZvcm1zIHRvIGxpbWl0IG91dHB1dCBjYW4gYmUKK2NvbWJpbmVkIGFuZCBpbmNsdWRlIGBcLS1tYXgtY291bnQ9MTBgIChzaG93IDEwIGNvbW1pdHMpLAorYFwtLXVudGlsPTIwMDUtMTItMTBgLCBldGMuCis8MTI+IHZpZXcgb25seSB0aGUgY2hhbmdlcyB0aGF0IHRvdWNoIHdoYXQncyBpbiBgY3Vyc2VzL2AKK2RpcmVjdG9yeSwgc2luY2UgYHYyLjQzYCB0YWcuCisKKworSW5kaXZpZHVhbCBEZXZlbG9wZXIgKFBhcnRpY2lwYW50KVtbSW5kaXZpZHVhbCBEZXZlbG9wZXIgKFBhcnRpY2lwYW50KV1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBkZXZlbG9wZXIgd29ya2luZyBhcyBhIHBhcnRpY2lwYW50IGluIGEgZ3JvdXAgcHJvamVjdCBuZWVkcyB0bworbGVhcm4gaG93IHRvIGNvbW11bmljYXRlIHdpdGggb3RoZXJzLCBhbmQgdXNlcyB0aGVzZSBjb21tYW5kcyBpbgorYWRkaXRpb24gdG8gdGhlIG9uZXMgbmVlZGVkIGJ5IGEgc3RhbmRhbG9uZSBkZXZlbG9wZXIuCisKKyAgKiBnaXRsaW5rOmdpdC1jbG9uZVsxXSBmcm9tIHRoZSB1cHN0cmVhbSB0byBwcmltZSB5b3VyIGxvY2FsCisgICAgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXB1bGxbMV0gYW5kIGdpdGxpbms6Z2l0LWZldGNoWzFdIGZyb20gIm9yaWdpbiIKKyAgICB0byBrZWVwIHVwLXRvLWRhdGUgd2l0aCB0aGUgdXBzdHJlYW0uCisKKyAgKiBnaXRsaW5rOmdpdC1wdXNoWzFdIHRvIHNoYXJlZCByZXBvc2l0b3J5LCBpZiB5b3UgYWRvcHQgQ1ZTCisgICAgc3R5bGUgc2hhcmVkIHJlcG9zaXRvcnkgd29ya2Zsb3cuCisKKyAgKiBnaXRsaW5rOmdpdC1mb3JtYXQtcGF0Y2hbMV0gdG8gcHJlcGFyZSBlLW1haWwgc3VibWlzc2lvbiwgaWYKKyAgICB5b3UgYWRvcHQgTGludXgga2VybmVsLXN0eWxlIHB1YmxpYyBmb3J1bSB3b3JrZmxvdy4KKworRXhhbXBsZXMKK35+fn5+fn5+CisKK0Nsb25lIHRoZSB1cHN0cmVhbSBhbmQgd29yayBvbiBpdC4gIEZlZWQgY2hhbmdlcyB0byB1cHN0cmVhbS46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi90b3J2YWxkcy9saW51eC0yLjYgbXkyLjYKKyQgY2QgbXkyLjYKKyQgZWRpdC9jb21waWxlL3Rlc3Q7IGdpdCBjb21taXQgLWEgLXMgPDE+CiskIGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luIDwyPgorJCBnaXQgcHVsbCA8Mz4KKyQgZ2l0IGxvZyAtcCBPUklHX0hFQUQuLiBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NiA8ND4KKyQgZ2l0IHB1bGwgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViLy4uLi9qZ2FyemlrL2xpYmF0YS1kZXYuZ2l0IEFMTCA8NT4KKyQgZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQgPDY+CiskIGdpdCBwcnVuZSA8Nz4KKyQgZ2l0IGZldGNoIC0tdGFncyA8OD4KKy0tLS0tLS0tLS0tLQorKworPDE+IHJlcGVhdCBhcyBuZWVkZWQuCis8Mj4gZXh0cmFjdCBwYXRjaGVzIGZyb20geW91ciBicmFuY2ggZm9yIGUtbWFpbCBzdWJtaXNzaW9uLgorPDM+IGBnaXQgcHVsbGAgZmV0Y2hlcyBmcm9tIGBvcmlnaW5gIGJ5IGRlZmF1bHQgYW5kIG1lcmdlcyBpbnRvIHRoZQorY3VycmVudCBicmFuY2guCis8ND4gaW1tZWRpYXRlbHkgYWZ0ZXIgcHVsbGluZywgbG9vayBhdCB0aGUgY2hhbmdlcyBkb25lIHVwc3RyZWFtCitzaW5jZSBsYXN0IHRpbWUgd2UgY2hlY2tlZCwgb25seSBpbiB0aGUKK2FyZWEgd2UgYXJlIGludGVyZXN0ZWQgaW4uCis8NT4gZmV0Y2ggZnJvbSBhIHNwZWNpZmljIGJyYW5jaCBmcm9tIGEgc3BlY2lmaWMgcmVwb3NpdG9yeSBhbmQgbWVyZ2UuCis8Nj4gcmV2ZXJ0IHRoZSBwdWxsLgorPDc+IGdhcmJhZ2UgY29sbGVjdCBsZWZ0b3ZlciBvYmplY3RzIGZyb20gcmV2ZXJ0ZWQgcHVsbC4KKzw4PiBmcm9tIHRpbWUgdG8gdGltZSwgb2J0YWluIG9mZmljaWFsIHRhZ3MgZnJvbSB0aGUgYG9yaWdpbmAKK2FuZCBzdG9yZSB0aGVtIHVuZGVyIGAuZ2l0L3JlZnMvdGFncy9gLgorCisKK1B1c2ggaW50byBhbm90aGVyIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorc2F0ZWxsaXRlJCBnaXQgY2xvbmUgbW90aGVyc2hpcDpmcm90eiBmcm90eiA8MT4KK3NhdGVsbGl0ZSQgY2QgZnJvdHoKK3NhdGVsbGl0ZSQgZ2l0IGNvbmZpZyAtLWdldC1yZWdleHAgJ14ocmVtb3RlfGJyYW5jaClcLicgPDI+CityZW1vdGUub3JpZ2luLnVybCBtb3RoZXJzaGlwOmZyb3R6CityZW1vdGUub3JpZ2luLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoKK2JyYW5jaC5tYXN0ZXIucmVtb3RlIG9yaWdpbgorYnJhbmNoLm1hc3Rlci5tZXJnZSByZWZzL2hlYWRzL21hc3Rlcgorc2F0ZWxsaXRlJCBnaXQgY29uZmlnIHJlbW90ZS5vcmlnaW4ucHVzaCBcCisgICAgICAgICAgIG1hc3RlcjpyZWZzL3JlbW90ZXMvc2F0ZWxsaXRlL21hc3RlciA8Mz4KK3NhdGVsbGl0ZSQgZWRpdC9jb21waWxlL3Rlc3QvY29tbWl0CitzYXRlbGxpdGUkIGdpdCBwdXNoIG9yaWdpbiA8ND4KKworbW90aGVyc2hpcCQgY2QgZnJvdHoKK21vdGhlcnNoaXAkIGdpdCBjaGVja291dCBtYXN0ZXIKK21vdGhlcnNoaXAkIGdpdCBtZXJnZSBzYXRlbGxpdGUvbWFzdGVyIDw1PgorLS0tLS0tLS0tLS0tCisrCis8MT4gbW90aGVyc2hpcCBtYWNoaW5lIGhhcyBhIGZyb3R6IHJlcG9zaXRvcnkgdW5kZXIgeW91ciBob21lCitkaXJlY3Rvcnk7IGNsb25lIGZyb20gaXQgdG8gc3RhcnQgYSByZXBvc2l0b3J5IG9uIHRoZSBzYXRlbGxpdGUKK21hY2hpbmUuCis8Mj4gY2xvbmUgc2V0cyB0aGVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBieSBkZWZhdWx0LgorSXQgYXJyYW5nZXMgYGdpdCBwdWxsYCB0byBmZXRjaCBhbmQgc3RvcmUgdGhlIGJyYW5jaGVzIG9mIG1vdGhlcnNoaXAKK21hY2hpbmUgdG8gbG9jYWwgYHJlbW90ZXMvb3JpZ2luLypgIHRyYWNraW5nIGJyYW5jaGVzLgorPDM+IGFycmFuZ2UgYGdpdCBwdXNoYCB0byBwdXNoIGxvY2FsIGBtYXN0ZXJgIGJyYW5jaCB0bworYHJlbW90ZXMvc2F0ZWxsaXRlL21hc3RlcmAgYnJhbmNoIG9mIHRoZSBtb3RoZXJzaGlwIG1hY2hpbmUuCis8ND4gcHVzaCB3aWxsIHN0YXNoIG91ciB3b3JrIGF3YXkgb24gYHJlbW90ZXMvc2F0ZWxsaXRlL21hc3RlcmAKK3RyYWNraW5nIGJyYW5jaCBvbiB0aGUgbW90aGVyc2hpcCBtYWNoaW5lLiAgWW91IGNvdWxkIHVzZSB0aGlzIGFzCithIGJhY2stdXAgbWV0aG9kLgorPDU+IG9uIG1vdGhlcnNoaXAgbWFjaGluZSwgbWVyZ2UgdGhlIHdvcmsgZG9uZSBvbiB0aGUgc2F0ZWxsaXRlCittYWNoaW5lIGludG8gdGhlIG1hc3RlciBicmFuY2guCisKK0JyYW5jaCBvZmYgb2YgYSBzcGVjaWZpYyB0YWcuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgcHJpdmF0ZTIuNi4xNCB2Mi42LjE0IDwxPgorJCBlZGl0L2NvbXBpbGUvdGVzdDsgZ2l0IGNvbW1pdCAtYQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBmb3JtYXQtcGF0Y2ggLWsgLW0gLS1zdGRvdXQgdjIuNi4xNC4ucHJpdmF0ZTIuNi4xNCB8CisgIGdpdCBhbSAtMyAtayA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGNyZWF0ZSBhIHByaXZhdGUgYnJhbmNoIGJhc2VkIG9uIGEgd2VsbCBrbm93biAoYnV0IHNvbWV3aGF0IGJlaGluZCkKK3RhZy4KKzwyPiBmb3J3YXJkIHBvcnQgYWxsIGNoYW5nZXMgaW4gYHByaXZhdGUyLjYuMTRgIGJyYW5jaCB0byBgbWFzdGVyYCBicmFuY2gKK3dpdGhvdXQgYSBmb3JtYWwgIm1lcmdpbmciLgorCisKK0ludGVncmF0b3JbW0ludGVncmF0b3JdXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZmFpcmx5IGNlbnRyYWwgcGVyc29uIGFjdGluZyBhcyB0aGUgaW50ZWdyYXRvciBpbiBhIGdyb3VwCitwcm9qZWN0IHJlY2VpdmVzIGNoYW5nZXMgbWFkZSBieSBvdGhlcnMsIHJldmlld3MgYW5kIGludGVncmF0ZXMKK3RoZW0gYW5kIHB1Ymxpc2hlcyB0aGUgcmVzdWx0IGZvciBvdGhlcnMgdG8gdXNlLCB1c2luZyB0aGVzZQorY29tbWFuZHMgaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgbmVlZGVkIGJ5IHBhcnRpY2lwYW50cy4KKworICAqIGdpdGxpbms6Z2l0LWFtWzFdIHRvIGFwcGx5IHBhdGNoZXMgZS1tYWlsZWQgaW4gZnJvbSB5b3VyCisgICAgY29udHJpYnV0b3JzLgorCisgICogZ2l0bGluazpnaXQtcHVsbFsxXSB0byBtZXJnZSBmcm9tIHlvdXIgdHJ1c3RlZCBsaWV1dGVuYW50cy4KKworICAqIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXSB0byBwcmVwYXJlIGFuZCBzZW5kIHN1Z2dlc3RlZAorICAgIGFsdGVybmF0aXZlIHRvIGNvbnRyaWJ1dG9ycy4KKworICAqIGdpdGxpbms6Z2l0LXJldmVydFsxXSB0byB1bmRvIGJvdGNoZWQgY29tbWl0cy4KKworICAqIGdpdGxpbms6Z2l0LXB1c2hbMV0gdG8gcHVibGlzaCB0aGUgYmxlZWRpbmcgZWRnZS4KKworCitFeGFtcGxlcworfn5+fn5+fn4KKworTXkgdHlwaWNhbCBHSVQgZGF5Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHN0YXR1cyA8MT4KKyQgZ2l0IHNob3ctYnJhbmNoIDwyPgorJCBtYWlseCA8Mz4KKyYgcyAyIDMgNCA1IC4vK3RvLWFwcGx5CismIHMgNyA4IC4vK2hvbGQtbGludXMKKyYgcQorJCBnaXQgY2hlY2tvdXQgLWIgdG9waWMvb25lIG1hc3RlcgorJCBnaXQgYW0gLTMgLWkgLXMgLXUgLi8rdG8tYXBwbHkgPDQ+CiskIGNvbXBpbGUvdGVzdAorJCBnaXQgY2hlY2tvdXQgLWIgaG9sZC9saW51cyAmJiBnaXQgYW0gLTMgLWkgLXMgLXUgLi8raG9sZC1saW51cyA8NT4KKyQgZ2l0IGNoZWNrb3V0IHRvcGljL29uZSAmJiBnaXQgcmViYXNlIG1hc3RlciA8Nj4KKyQgZ2l0IGNoZWNrb3V0IHB1ICYmIGdpdCByZXNldCAtLWhhcmQgbmV4dCA8Nz4KKyQgZ2l0IG1lcmdlIHRvcGljL29uZSB0b3BpYy90d28gJiYgZ2l0IG1lcmdlIGhvbGQvbGludXMgPDg+CiskIGdpdCBjaGVja291dCBtYWludAorJCBnaXQgY2hlcnJ5LXBpY2sgbWFzdGVyfjQgPDk+CiskIGNvbXBpbGUvdGVzdAorJCBnaXQgdGFnIC1zIC1tICdHSVQgMC45OS45eCcgdjAuOTkuOXggPDEwPgorJCBnaXQgZmV0Y2gga28gJiYgZ2l0IHNob3ctYnJhbmNoIG1hc3RlciBtYWludCAndGFncy9rby0qJyA8MTE+CiskIGdpdCBwdXNoIGtvIDwxMj4KKyQgZ2l0IHB1c2gga28gdjAuOTkuOXggPDEzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gc2VlIHdoYXQgSSB3YXMgaW4gdGhlIG1pZGRsZSBvZiBkb2luZywgaWYgYW55LgorPDI+IHNlZSB3aGF0IHRvcGljIGJyYW5jaGVzIEkgaGF2ZSBhbmQgdGhpbmsgYWJvdXQgaG93IHJlYWR5Cit0aGV5IGFyZS4KKzwzPiByZWFkIG1haWxzLCBzYXZlIG9uZXMgdGhhdCBhcmUgYXBwbGljYWJsZSwgYW5kIHNhdmUgb3RoZXJzCit0aGF0IGFyZSBub3QgcXVpdGUgcmVhZHkuCis8ND4gYXBwbHkgdGhlbSwgaW50ZXJhY3RpdmVseSwgd2l0aCBteSBzaWduLW9mZnMuCis8NT4gY3JlYXRlIHRvcGljIGJyYW5jaCBhcyBuZWVkZWQgYW5kIGFwcGx5LCBhZ2FpbiB3aXRoIG15CitzaWduLW9mZnMuCis8Nj4gcmViYXNlIGludGVybmFsIHRvcGljIGJyYW5jaCB0aGF0IGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gdGhlCittYXN0ZXIsIG5vciBleHBvc2VkIGFzIGEgcGFydCBvZiBhIHN0YWJsZSBicmFuY2guCis8Nz4gcmVzdGFydCBgcHVgIGV2ZXJ5IHRpbWUgZnJvbSB0aGUgbmV4dC4KKzw4PiBhbmQgYnVuZGxlIHRvcGljIGJyYW5jaGVzIHN0aWxsIGNvb2tpbmcuCis8OT4gYmFja3BvcnQgYSBjcml0aWNhbCBmaXguCis8MTA+IGNyZWF0ZSBhIHNpZ25lZCB0YWcuCis8MTE+IG1ha2Ugc3VyZSBJIGRpZCBub3QgYWNjaWRlbnRhbGx5IHJld2luZCBtYXN0ZXIgYmV5b25kIHdoYXQgSQorYWxyZWFkeSBwdXNoZWQgb3V0LiAgYGtvYCBzaG9ydGhhbmQgcG9pbnRzIGF0IHRoZSByZXBvc2l0b3J5IEkgaGF2ZQorYXQga2VybmVsLm9yZywgYW5kIGxvb2tzIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9yZW1vdGVzL2tvCitVUkw6IGtlcm5lbC5vcmc6L3B1Yi9zY20vZ2l0L2dpdC5naXQKK1B1bGw6IG1hc3RlcjpyZWZzL3RhZ3Mva28tbWFzdGVyCitQdWxsOiBuZXh0OnJlZnMvdGFncy9rby1uZXh0CitQdWxsOiBtYWludDpyZWZzL3RhZ3Mva28tbWFpbnQKK1B1c2g6IG1hc3RlcgorUHVzaDogbmV4dAorUHVzaDogK3B1CitQdXNoOiBtYWludAorLS0tLS0tLS0tLS0tCisrCitJbiB0aGUgb3V0cHV0IGZyb20gYGdpdCBzaG93LWJyYW5jaGAsIGBtYXN0ZXJgIHNob3VsZCBoYXZlCitldmVyeXRoaW5nIGBrby1tYXN0ZXJgIGhhcywgYW5kIGBuZXh0YCBzaG91bGQgaGF2ZQorZXZlcnl0aGluZyBga28tbmV4dGAgaGFzLgorCis8MTI+IHB1c2ggb3V0IHRoZSBibGVlZGluZyBlZGdlLgorPDEzPiBwdXNoIHRoZSB0YWcgb3V0LCB0b28uCisKKworUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbltbUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXBvc2l0b3J5IGFkbWluaXN0cmF0b3IgdXNlcyB0aGUgZm9sbG93aW5nIHRvb2xzIHRvIHNldCB1cAorYW5kIG1haW50YWluIGFjY2VzcyB0byB0aGUgcmVwb3NpdG9yeSBieSBkZXZlbG9wZXJzLgorCisgICogZ2l0bGluazpnaXQtZGFlbW9uWzFdIHRvIGFsbG93IGFub255bW91cyBkb3dubG9hZCBmcm9tCisgICAgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXNoZWxsWzFdIGNhbiBiZSB1c2VkIGFzIGEgJ3Jlc3RyaWN0ZWQgbG9naW4gc2hlbGwnCisgICAgZm9yIHNoYXJlZCBjZW50cmFsIHJlcG9zaXRvcnkgdXNlcnMuCisKK2xpbms6aG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHRbdXBkYXRlIGhvb2sgaG93dG9dIGhhcyBhIGdvb2QKK2V4YW1wbGUgb2YgbWFuYWdpbmcgYSBzaGFyZWQgY2VudHJhbCByZXBvc2l0b3J5LgorCisKK0V4YW1wbGVzCit+fn5+fn5+fgorV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcgaW4gL2V0Yy9zZXJ2aWNlczo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCA5NDE4IC9ldGMvc2VydmljZXMKK2dpdAkJOTQxOC90Y3AJCSMgR2l0IFZlcnNpb24gQ29udHJvbCBTeXN0ZW0KKy0tLS0tLS0tLS0tLQorCitSdW4gZ2l0LWRhZW1vbiB0byBzZXJ2ZSAvcHViL3NjbSBmcm9tIGluZXRkLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCBnaXQgL2V0Yy9pbmV0ZC5jb25mCitnaXQJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5IFwKKyAgL3Vzci9iaW4vZ2l0LWRhZW1vbiBnaXQtZGFlbW9uIC0taW5ldGQgLS1leHBvcnQtYWxsIC9wdWIvc2NtCistLS0tLS0tLS0tLS0KKysKK1RoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBsaW5lIHNob3VsZCBiZSBvbiBvbmUgbGluZS4KKworUnVuIGdpdC1kYWVtb24gdG8gc2VydmUgL3B1Yi9zY20gZnJvbSB4aW5ldGQuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBjYXQgL2V0Yy94aW5ldGQuZC9naXQtZGFlbW9uCisjIGRlZmF1bHQ6IG9mZgorIyBkZXNjcmlwdGlvbjogVGhlIGdpdCBzZXJ2ZXIgb2ZmZXJzIGFjY2VzcyB0byBnaXQgcmVwb3NpdG9yaWVzCitzZXJ2aWNlIGdpdAoreworICAgICAgICBkaXNhYmxlID0gbm8KKyAgICAgICAgdHlwZSAgICAgICAgICAgID0gVU5MSVNURUQKKyAgICAgICAgcG9ydCAgICAgICAgICAgID0gOTQxOAorICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KKyAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KKyAgICAgICAgdXNlciAgICAgICAgICAgID0gbm9ib2R5CisgICAgICAgIHNlcnZlciAgICAgICAgICA9IC91c3IvYmluL2dpdC1kYWVtb24KKyAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLS1pbmV0ZCAtLWV4cG9ydC1hbGwgLS1iYXNlLXBhdGg9L3B1Yi9zY20KKyAgICAgICAgbG9nX29uX2ZhaWx1cmUgICs9IFVTRVJJRAorfQorLS0tLS0tLS0tLS0tCisrCitDaGVjayB5b3VyIHhpbmV0ZCg4KSBkb2N1bWVudGF0aW9uIGFuZCBzZXR1cCwgdGhpcyBpcyBmcm9tIGEgRmVkb3JhIHN5c3RlbS4KK090aGVycyBtaWdodCBiZSBkaWZmZXJlbnQuCisKK0dpdmUgcHVzaC9wdWxsIG9ubHkgYWNjZXNzIHRvIGRldmVsb3BlcnMuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL3Bhc3N3ZCA8MT4KK2FsaWNlOng6MTAwMDoxMDAwOjovaG9tZS9hbGljZTovdXNyL2Jpbi9naXQtc2hlbGwKK2JvYjp4OjEwMDE6MTAwMTo6L2hvbWUvYm9iOi91c3IvYmluL2dpdC1zaGVsbAorY2luZHk6eDoxMDAyOjEwMDI6Oi9ob21lL2NpbmR5Oi91c3IvYmluL2dpdC1zaGVsbAorZGF2aWQ6eDoxMDAzOjEwMDM6Oi9ob21lL2RhdmlkOi91c3IvYmluL2dpdC1zaGVsbAorJCBncmVwIGdpdCAvZXRjL3NoZWxscyA8Mj4KKy91c3IvYmluL2dpdC1zaGVsbAorLS0tLS0tLS0tLS0tCisrCis8MT4gbG9nLWluIHNoZWxsIGlzIHNldCB0byAvdXNyL2Jpbi9naXQtc2hlbGwsIHdoaWNoIGRvZXMgbm90CithbGxvdyBhbnl0aGluZyBidXQgYGdpdCBwdXNoYCBhbmQgYGdpdCBwdWxsYC4gIFRoZSB1c2VycyBzaG91bGQKK2dldCBhbiBzc2ggYWNjZXNzIHRvIHRoZSBtYWNoaW5lLgorPDI+IGluIG1hbnkgZGlzdHJpYnV0aW9ucyAvZXRjL3NoZWxscyBuZWVkcyB0byBsaXN0IHdoYXQgaXMgdXNlZAorYXMgdGhlIGxvZ2luIHNoZWxsLgorCitDVlMtc3R5bGUgc2hhcmVkIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL2dyb3VwIDwxPgorZ2l0Ong6OTQxODphbGljZSxib2IsY2luZHksZGF2aWQKKyQgY2QgL2hvbWUvZGV2by5naXQKKyQgbHMgLWwgPDI+CisgIGxyd3hyd3hyd3ggICAxIGRhdmlkIGdpdCAgICAxNyBEZWMgIDQgMjI6NDAgSEVBRCAtPiByZWZzL2hlYWRzL21hc3RlcgorICBkcnd4cndzci14ICAgMiBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIGJyYW5jaGVzCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA4NCBEZWMgIDQgMjI6NDAgY29uZmlnCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA1OCBEZWMgIDQgMjI6NDAgZGVzY3JpcHRpb24KKyAgZHJ3eHJ3c3IteCAgIDIgZGF2aWQgZ2l0ICA0MDk2IERlYyAgNCAyMjo0MCBob29rcworICAtcnctcnctci0tICAgMSBkYXZpZCBnaXQgMzc1MDQgRGVjICA0IDIyOjQwIGluZGV4CisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgaW5mbworICBkcnd4cndzci14ICAgNCBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIG9iamVjdHMKKyAgZHJ3eHJ3c3IteCAgIDQgZGF2aWQgZ2l0ICA0MDk2IE5vdiAgNyAxNDo1OCByZWZzCisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgcmVtb3RlcworJCBscyAtbCBob29rcy91cGRhdGUgPDM+CisgIC1yLXhyLXhyLXggICAxIGRhdmlkIGdpdCAgMzUzNiBEZWMgIDQgMjI6NDAgdXBkYXRlCiskIGNhdCBpbmZvL2FsbG93ZWQtdXNlcnMgPDQ+CityZWZzL2hlYWRzL21hc3RlcglhbGljZVx8Y2luZHkKK3JlZnMvaGVhZHMvZG9jLXVwZGF0ZQlib2IKK3JlZnMvdGFncy92WzAtOV0qCWRhdmlkCistLS0tLS0tLS0tLS0KKysKKzwxPiBwbGFjZSB0aGUgZGV2ZWxvcGVycyBpbnRvIHRoZSBzYW1lIGdpdCBncm91cC4KKzwyPiBhbmQgbWFrZSB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgd3JpdGFibGUgYnkgdGhlIGdyb3VwLgorPDM+IHVzZSB1cGRhdGUtaG9vayBleGFtcGxlIGJ5IENhcmwgZnJvbSBEb2N1bWVudGF0aW9uL2hvd3RvLworZm9yIGJyYW5jaCBwb2xpY3kgY29udHJvbC4KKzw0PiBhbGljZSBhbmQgY2luZHkgY2FuIHB1c2ggaW50byBtYXN0ZXIsIG9ubHkgYm9iIGNhbiBwdXNoIGludG8gZG9jLXVwZGF0ZS4KK2RhdmlkIGlzIHRoZSByZWxlYXNlIG1hbmFnZXIgYW5kIGlzIHRoZSBvbmx5IHBlcnNvbiB3aG8gY2FuCitjcmVhdGUgYW5kIHB1c2ggdmVyc2lvbiB0YWdzLgorCitIVFRQIHNlcnZlciB0byBzdXBwb3J0IGR1bWIgcHJvdG9jb2wgdHJhbnNmZXIuOjoKKysKKy0tLS0tLS0tLS0tLQorZGV2JCBnaXQgdXBkYXRlLXNlcnZlci1pbmZvIDwxPgorZGV2JCBmdHAgdXNlckBpc3AuZXhhbXBsZS5jb20gPDI+CitmdHA+IGNwIC1yIC5naXQgL2hvbWUvdXNlci9teXByb2plY3QuZ2l0CistLS0tLS0tLS0tLS0KKysKKzwxPiBtYWtlIHN1cmUgeW91ciBpbmZvL3JlZnMgYW5kIG9iamVjdHMvaW5mby9wYWNrcyBhcmUgdXAtdG8tZGF0ZQorPDI+IHVwbG9hZCB0byBwdWJsaWMgSFRUUCBzZXJ2ZXIgaG9zdGVkIGJ5IHlvdXIgSVNQLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZXRjaC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNzMzMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKQEAgLTAsMCArMSw1NSBAQAorLXEsIFwtLXF1aWV0OjoKKwlQYXNzIC0tcXVpZXQgdG8gZ2l0LWZldGNoLXBhY2sgYW5kIHNpbGVuY2UgYW55IG90aGVyIGludGVybmFsbHkKKwl1c2VkIHByb2dyYW1zLgorCistdiwgXC0tdmVyYm9zZTo6CisJQmUgdmVyYm9zZS4KKworLWEsIFwtLWFwcGVuZDo6CisJQXBwZW5kIHJlZiBuYW1lcyBhbmQgb2JqZWN0IG5hbWVzIG9mIGZldGNoZWQgcmVmcyB0byB0aGUKKwlleGlzdGluZyBjb250ZW50cyBvZiBgLmdpdC9GRVRDSF9IRUFEYC4gIFdpdGhvdXQgdGhpcworCW9wdGlvbiBvbGQgZGF0YSBpbiBgLmdpdC9GRVRDSF9IRUFEYCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCitcLS11cGxvYWQtcGFjayA8dXBsb2FkLXBhY2s+OjoKKwlXaGVuIGdpdmVuLCBhbmQgdGhlIHJlcG9zaXRvcnkgdG8gZmV0Y2ggZnJvbSBpcyBoYW5kbGVkCisJYnkgJ2dpdC1mZXRjaC1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKwl0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisJcnVuIG9uIHRoZSBvdGhlciBlbmQuCisKKy1mLCBcLS1mb3JjZTo6CisJV2hlbiBgZ2l0LWZldGNoYCBpcyB1c2VkIHdpdGggYDxyYnJhbmNoPjo8bGJyYW5jaD5gCisJcmVmc3BlYywgaXQgcmVmdXNlcyB0byB1cGRhdGUgdGhlIGxvY2FsIGJyYW5jaAorCWA8bGJyYW5jaD5gIHVubGVzcyB0aGUgcmVtb3RlIGJyYW5jaCBgPHJicmFuY2g+YCBpdAorCWZldGNoZXMgaXMgYSBkZXNjZW5kYW50IG9mIGA8bGJyYW5jaD5gLiAgVGhpcyBvcHRpb24KKwlvdmVycmlkZXMgdGhhdCBjaGVjay4KKworLW4sIFwtLW5vLXRhZ3M6OgorCUJ5IGRlZmF1bHQsIGBnaXQtZmV0Y2hgIGZldGNoZXMgdGFncyB0aGF0IHBvaW50IGF0CisJb2JqZWN0cyB0aGF0IGFyZSBkb3dubG9hZGVkIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5CisJYW5kIHN0b3JlcyB0aGVtIGxvY2FsbHkuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGlzCisJYXV0b21hdGljIHRhZyBmb2xsb3dpbmcuCisKKy10LCBcLS10YWdzOjoKKwlNb3N0IG9mIHRoZSB0YWdzIGFyZSBmZXRjaGVkIGF1dG9tYXRpY2FsbHkgYXMgYnJhbmNoCisJaGVhZHMgYXJlIGRvd25sb2FkZWQsIGJ1dCB0YWdzIHRoYXQgZG8gbm90IHBvaW50IGF0CisJb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgYnJhbmNoIGhlYWRzIHRoYXQgYXJlIGJlaW5nCisJdHJhY2tlZCB3aWxsIG5vdCBiZSBmZXRjaGVkIGJ5IHRoaXMgbWVjaGFuaXNtLiAgVGhpcworCWZsYWcgbGV0cyBhbGwgdGFncyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvYmplY3RzIGJlCisJZG93bmxvYWRlZC4KKworLWssIFwtLWtlZXA6OgorCUtlZXAgZG93bmxvYWRlZCBwYWNrLgorCistdSwgXC0tdXBkYXRlLWhlYWQtb2s6OgorCUJ5IGRlZmF1bHQgYGdpdC1mZXRjaGAgcmVmdXNlcyB0byB1cGRhdGUgdGhlIGhlYWQgd2hpY2gKKwljb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBicmFuY2guICBUaGlzIGZsYWcgZGlzYWJsZXMgdGhlCisJY2hlY2suICBUaGlzIGlzIHB1cmVseSBmb3IgdGhlIGludGVybmFsIHVzZSBmb3IgYGdpdC1wdWxsYAorCXRvIGNvbW11bmljYXRlIHdpdGggYGdpdC1mZXRjaGAsIGFuZCB1bmxlc3MgeW91IGFyZQorCWltcGxlbWVudGluZyB5b3VyIG93biBQb3JjZWxhaW4geW91IGFyZSBub3Qgc3VwcG9zZWQgdG8KKwl1c2UgaXQuCisKK1wtLWRlcHRoPTxkZXB0aD46OgorCURlZXBlbiB0aGUgaGlzdG9yeSBvZiBhICdzaGFsbG93JyByZXBvc2l0b3J5IGNyZWF0ZWQgYnkKKwlgZ2l0IGNsb25lYCB3aXRoIGAtLWRlcHRoPTxkZXB0aD5gIG9wdGlvbiAoc2VlIGdpdGxpbms6Z2l0LWNsb25lWzFdKQorCWJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbW1pdHMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFkZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hZGQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzlmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hZGQudHh0CkBAIC0wLDAgKzEsMjMxIEBACitnaXQtYWRkKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hZGQgLSBBZGQgZmlsZSBjb250ZW50cyB0byB0aGUgY2hhbmdlc2V0IHRvIGJlIGNvbW1pdHRlZCBuZXh0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1hZGQnIFstbl0gWy12XSBbLWZdIFstLWludGVyYWN0aXZlIHwgLWldIFstdV0gWy0tXSA8ZmlsZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBbGwgdGhlIGNoYW5nZWQgZmlsZSBjb250ZW50cyB0byBiZSBjb21taXR0ZWQgdG9nZXRoZXIgaW4gYSBzaW5nbGUgc2V0CitvZiBjaGFuZ2VzIG11c3QgYmUgImFkZGVkIiB3aXRoIHRoZSAnYWRkJyBjb21tYW5kIGJlZm9yZSB1c2luZyB0aGUKKydjb21taXQnIGNvbW1hbmQuICBUaGlzIGlzIG5vdCBvbmx5IGZvciBhZGRpbmcgbmV3IGZpbGVzLiAgRXZlbiBtb2RpZmllZAorZmlsZXMgbXVzdCBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGNoYW5nZXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkLgorCitUaGlzIGNvbW1hbmQgY2FuIGJlIHBlcmZvcm1lZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgYSBjb21taXQuIFRoZSBhZGRlZAorY29udGVudCBjb3JyZXNwb25kcyB0byB0aGUgc3RhdGUgb2Ygc3BlY2lmaWVkIGZpbGUocykgYXQgdGhlIHRpbWUgdGhlCisnYWRkJyBjb21tYW5kIGlzIHVzZWQuIFRoaXMgbWVhbnMgdGhlICdjb21taXQnIGNvbW1hbmQgd2lsbCBub3QgY29uc2lkZXIKK3N1YnNlcXVlbnQgY2hhbmdlcyB0byBhbHJlYWR5IGFkZGVkIGNvbnRlbnQgaWYgaXQgaXMgbm90IGFkZGVkIGFnYWluIGJlZm9yZQordGhlIGNvbW1pdC4KKworVGhlICdnaXQgc3RhdHVzJyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIHN1bW1hcnkgb2Ygd2hhdCBpcyBpbmNsdWRlZAorZm9yIHRoZSBuZXh0IGNvbW1pdC4KKworVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBpZ25vcmVkIGZpbGVzIHdpdGggYC1mYCAoZm9yY2UpCitvcHRpb24sIGJ1dCB0aGV5IGhhdmUgdG8gYmUKK2V4cGxpY2l0bHkgYW5kIGV4YWN0bHkgc3BlY2lmaWVkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIEZpbGUgZ2xvYmJpbmcKK2FuZCByZWN1cnNpdmUgYmVoYXZpb3VyIGRvIG5vdCBhZGQgaWdub3JlZCBmaWxlcy4KKworUGxlYXNlIHNlZSBnaXRsaW5rOmdpdC1jb21taXRbMV0gZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gYWRkIGNvbnRlbnQgdG8gYQorY29tbWl0LgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxmaWxlPi4uLjo6CisJRmlsZXMgdG8gYWRkIGNvbnRlbnQgZnJvbS4gIEZpbGVnbG9icyAoZS5nLiBgKi5jYCkgY2FuCisJYmUgZ2l2ZW4gdG8gYWRkIGFsbCBtYXRjaGluZyBmaWxlcy4gIEFsc28gYQorCWxlYWRpbmcgZGlyZWN0b3J5IG5hbWUgKGUuZy4gYGRpcmAgdG8gYWRkIGBkaXIvZmlsZTFgCisJYW5kIGBkaXIvZmlsZTJgKSBjYW4gYmUgZ2l2ZW4gdG8gYWRkIGFsbCBmaWxlcyBpbiB0aGUKKwlkaXJlY3RvcnksIHJlY3Vyc2l2ZWx5LgorCistbjo6CisgICAgICAgIERvbid0IGFjdHVhbGx5IGFkZCB0aGUgZmlsZShzKSwganVzdCBzaG93IGlmIHRoZXkgZXhpc3QuCisKKy12OjoKKyAgICAgICAgQmUgdmVyYm9zZS4KKworLWY6OgorCUFsbG93IGFkZGluZyBvdGhlcndpc2UgaWdub3JlZCBmaWxlcy4KKworLWksIFwtLWludGVyYWN0aXZlOjoKKwlBZGQgbW9kaWZpZWQgY29udGVudHMgaW4gdGhlIHdvcmtpbmcgdHJlZSBpbnRlcmFjdGl2ZWx5IHRvCisJdGhlIGluZGV4LgorCistdTo6CisJVXBkYXRlIG9ubHkgZmlsZXMgdGhhdCBnaXQgYWxyZWFkeSBrbm93cyBhYm91dC4gVGhpcyBpcyBzaW1pbGFyCisJdG8gd2hhdCAiZ2l0IGNvbW1pdCAtYSIgZG9lcyBpbiBwcmVwYXJhdGlvbiBmb3IgbWFraW5nIGEgY29tbWl0LAorCWV4Y2VwdCB0aGF0IHRoZSB1cGRhdGUgaXMgbGltaXRlZCB0byBwYXRocyBzcGVjaWZpZWQgb24gdGhlCisJY29tbWFuZCBsaW5lLiBJZiBubyBwYXRocyBhcmUgc3BlY2lmaWVkLCBhbGwgdHJhY2tlZCBmaWxlcyBhcmUKKwl1cGRhdGVkLgorCitcLS06OgorCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZyb20KKwl0aGUgbGlzdCBvZiBmaWxlcywgKHVzZWZ1bCB3aGVuIGZpbGVuYW1lcyBtaWdodCBiZSBtaXN0YWtlbgorCWZvciBjb21tYW5kLWxpbmUgb3B0aW9ucykuCisKKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCitUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAnY29yZS5leGNsdWRlc2ZpbGUnIGluZGljYXRlcyBhIHBhdGggdG8gYQorZmlsZSBjb250YWluaW5nIHBhdHRlcm5zIG9mIGZpbGUgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIGdpdC1hZGQsIHNpbWlsYXIgdG8KKyRHSVRfRElSL2luZm8vZXhjbHVkZS4gIFBhdHRlcm5zIGluIHRoZSBleGNsdWRlIGZpbGUgYXJlIHVzZWQgaW4gYWRkaXRpb24gdG8KK3Rob3NlIGluIGluZm8vZXhjbHVkZS4gIFNlZSBsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeSBsYXlvdXRdLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorZ2l0LWFkZCBEb2N1bWVudGF0aW9uL1xcKi50eHQ6OgorCisJQWRkcyBjb250ZW50IGZyb20gYWxsIGBcKi50eHRgIGZpbGVzIHVuZGVyIGBEb2N1bWVudGF0aW9uYAorCWRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzLgorKworTm90ZSB0aGF0IHRoZSBhc3RlcmlzayBgXCpgIGlzIHF1b3RlZCBmcm9tIHRoZSBzaGVsbCBpbiB0aGlzCitleGFtcGxlOyB0aGlzIGxldHMgdGhlIGNvbW1hbmQgdG8gaW5jbHVkZSB0aGUgZmlsZXMgZnJvbQorc3ViZGlyZWN0b3JpZXMgb2YgYERvY3VtZW50YXRpb24vYCBkaXJlY3RvcnkuCisKK2dpdC1hZGQgZ2l0LSouc2g6OgorCisJQ29uc2lkZXJzIGFkZGluZyBjb250ZW50IGZyb20gYWxsIGdpdC0qLnNoIHNjcmlwdHMuCisJQmVjYXVzZSB0aGlzIGV4YW1wbGUgbGV0cyBzaGVsbCBleHBhbmQgdGhlIGFzdGVyaXNrCisJKGkuZS4geW91IGFyZSBsaXN0aW5nIHRoZSBmaWxlcyBleHBsaWNpdGx5KSwgaXQgZG9lcyBub3QKKwljb25zaWRlciBgc3ViZGlyL2dpdC1mb28uc2hgLgorCitJbnRlcmFjdGl2ZSBtb2RlCistLS0tLS0tLS0tLS0tLS0tCitXaGVuIHRoZSBjb21tYW5kIGVudGVycyB0aGUgaW50ZXJhY3RpdmUgbW9kZSwgaXQgc2hvd3MgdGhlCitvdXRwdXQgb2YgdGhlICdzdGF0dXMnIHN1YmNvbW1hbmQsIGFuZCB0aGVuIGdvZXMgaW50byBpdHMKK2ludGVyYWN0aXZlIGNvbW1hbmQgbG9vcC4KKworVGhlIGNvbW1hbmQgbG9vcCBzaG93cyB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcyBhdmFpbGFibGUsIGFuZAorZ2l2ZXMgYSBwcm9tcHQgIldoYXQgbm93PiAiLiAgSW4gZ2VuZXJhbCwgd2hlbiB0aGUgcHJvbXB0IGVuZHMKK3dpdGggYSBzaW5nbGUgJz4nLCB5b3UgY2FuIHBpY2sgb25seSBvbmUgb2YgdGhlIGNob2ljZXMgZ2l2ZW4KK2FuZCB0eXBlIHJldHVybiwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyAgICAqKiogQ29tbWFuZHMgKioqCisgICAgICAxOiBzdGF0dXMgICAgICAgMjogdXBkYXRlICAgICAgIDM6IHJldmVydCAgICAgICA0OiBhZGQgdW50cmFja2VkCisgICAgICA1OiBwYXRjaCAgICAgICAgNjogZGlmZiAgICAgICAgIDc6IHF1aXQgICAgICAgICA4OiBoZWxwCisgICAgV2hhdCBub3c+IDEKKy0tLS0tLS0tLS0tLQorCitZb3UgYWxzbyBjb3VsZCBzYXkgInMiIG9yICJzdGEiIG9yICJzdGF0dXMiIGFib3ZlIGFzIGxvbmcgYXMgdGhlCitjaG9pY2UgaXMgdW5pcXVlLgorCitUaGUgbWFpbiBjb21tYW5kIGxvb3AgaGFzIDYgc3ViY29tbWFuZHMgKHBsdXMgaGVscCBhbmQgcXVpdCkuCisKK3N0YXR1czo6CisKKyAgIFRoaXMgc2hvd3MgdGhlIGNoYW5nZSBiZXR3ZWVuIEhFQUQgYW5kIGluZGV4IChpLmUuIHdoYXQgd2lsbCBiZQorICAgY29tbWl0dGVkIGlmIHlvdSBzYXkgImdpdCBjb21taXQiKSwgYW5kIGJldHdlZW4gaW5kZXggYW5kCisgICB3b3JraW5nIHRyZWUgZmlsZXMgKGkuZS4gd2hhdCB5b3UgY291bGQgc3RhZ2UgZnVydGhlciBiZWZvcmUKKyAgICJnaXQgY29tbWl0IiB1c2luZyAiZ2l0LWFkZCIpIGZvciBlYWNoIHBhdGguICBBIHNhbXBsZSBvdXRwdXQKKyAgIGxvb2tzIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBzdGFnZWQgICAgIHVuc3RhZ2VkIHBhdGgKKyAgICAgMTogICAgICAgYmluYXJ5ICAgICAgbm90aGluZyBmb28ucG5nCisgICAgIDI6ICAgICArNDAzLy0zNSAgICAgICAgKzEvLTEgZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybAorLS0tLS0tLS0tLS0tCisrCitJdCBzaG93cyB0aGF0IGZvby5wbmcgaGFzIGRpZmZlcmVuY2VzIGZyb20gSEVBRCAoYnV0IHRoYXQgaXMKK2JpbmFyeSBzbyBsaW5lIGNvdW50IGNhbm5vdCBiZSBzaG93bikgYW5kIHRoZXJlIGlzIG5vCitkaWZmZXJlbmNlIGJldHdlZW4gaW5kZXhlZCBjb3B5IGFuZCB0aGUgd29ya2luZyB0cmVlCit2ZXJzaW9uIChpZiB0aGUgd29ya2luZyB0cmVlIHZlcnNpb24gd2VyZSBhbHNvIGRpZmZlcmVudCwKKydiaW5hcnknIHdvdWxkIGhhdmUgYmVlbiBzaG93biBpbiBwbGFjZSBvZiAnbm90aGluZycpLiAgVGhlCitvdGhlciBmaWxlLCBnaXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsLCBoYXMgNDAzIGxpbmVzIGFkZGVkCithbmQgMzUgbGluZXMgZGVsZXRlZCBpZiB5b3UgY29tbWl0IHdoYXQgaXMgaW4gdGhlIGluZGV4LCBidXQKK3dvcmtpbmcgdHJlZSBmaWxlIGhhcyBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMgKG9uZSBhZGRpdGlvbiBhbmQKK29uZSBkZWxldGlvbikuCisKK3VwZGF0ZTo6CisKKyAgIFRoaXMgc2hvd3MgdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgZ2l2ZXMgcHJvbXB0CisgICAiVXBkYXRlPj4iLiAgV2hlbiB0aGUgcHJvbXB0IGVuZHMgd2l0aCBkb3VibGUgJz4+JywgeW91IGNhbgorICAgbWFrZSBtb3JlIHRoYW4gb25lIHNlbGVjdGlvbiwgY29uY2F0ZW5hdGVkIHdpdGggd2hpdGVzcGFjZSBvcgorICAgY29tbWEuICBBbHNvIHlvdSBjYW4gc2F5IHJhbmdlcy4gIEUuZy4gIjItNSA3LDkiIHRvIGNob29zZQorICAgMiwzLDQsNSw3LDkgZnJvbSB0aGUgbGlzdC4gIFlvdSBjYW4gc2F5ICcqJyB0byBjaG9vc2UKKyAgIGV2ZXJ5dGhpbmcuCisrCitXaGF0IHlvdSBjaG9zZSBhcmUgdGhlbiBoaWdobGlnaHRlZCB3aXRoICcqJywKK2xpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICBzdGFnZWQgICAgIHVuc3RhZ2VkIHBhdGgKKyAgMTogICAgICAgYmluYXJ5ICAgICAgbm90aGluZyBmb28ucG5nCisqIDI6ICAgICArNDAzLy0zNSAgICAgICAgKzEvLTEgZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybAorLS0tLS0tLS0tLS0tCisrCitUbyByZW1vdmUgc2VsZWN0aW9uLCBwcmVmaXggdGhlIGlucHV0IHdpdGggYC1gCitsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KK1VwZGF0ZT4+IC0yCistLS0tLS0tLS0tLS0KKysKK0FmdGVyIG1ha2luZyB0aGUgc2VsZWN0aW9uLCBhbnN3ZXIgd2l0aCBhbiBlbXB0eSBsaW5lIHRvIHN0YWdlIHRoZQorY29udGVudHMgb2Ygd29ya2luZyB0cmVlIGZpbGVzIGZvciBzZWxlY3RlZCBwYXRocyBpbiB0aGUgaW5kZXguCisKK3JldmVydDo6CisKKyAgVGhpcyBoYXMgYSB2ZXJ5IHNpbWlsYXIgVUkgdG8gJ3VwZGF0ZScsIGFuZCB0aGUgc3RhZ2VkCisgIGluZm9ybWF0aW9uIGZvciBzZWxlY3RlZCBwYXRocyBhcmUgcmV2ZXJ0ZWQgdG8gdGhhdCBvZiB0aGUKKyAgSEVBRCB2ZXJzaW9uLiAgUmV2ZXJ0aW5nIG5ldyBwYXRocyBtYWtlcyB0aGVtIHVudHJhY2tlZC4KKworYWRkIHVudHJhY2tlZDo6CisKKyAgVGhpcyBoYXMgYSB2ZXJ5IHNpbWlsYXIgVUkgdG8gJ3VwZGF0ZScgYW5kCisgICdyZXZlcnQnLCBhbmQgbGV0cyB5b3UgYWRkIHVudHJhY2tlZCBwYXRocyB0byB0aGUgaW5kZXguCisKK3BhdGNoOjoKKworICBUaGlzIGxldHMgeW91IGNob29zZSBvbmUgcGF0aCBvdXQgb2YgJ3N0YXR1cycgbGlrZSBzZWxlY3Rpb24uCisgIEFmdGVyIGNob29zaW5nIHRoZSBwYXRoLCBpdCBwcmVzZW50cyBkaWZmIGJldHdlZW4gdGhlIGluZGV4CisgIGFuZCB0aGUgd29ya2luZyB0cmVlIGZpbGUgYW5kIGFza3MgeW91IGlmIHlvdSB3YW50IHRvIHN0YWdlCisgIHRoZSBjaGFuZ2Ugb2YgZWFjaCBodW5rLiAgWW91IGNhbiBzYXk6CisKKyAgICAgICB5IC0gYWRkIHRoZSBjaGFuZ2UgZnJvbSB0aGF0IGh1bmsgdG8gaW5kZXgKKyAgICAgICBuIC0gZG8gbm90IGFkZCB0aGUgY2hhbmdlIGZyb20gdGhhdCBodW5rIHRvIGluZGV4CisgICAgICAgYSAtIGFkZCB0aGUgY2hhbmdlIGZyb20gdGhhdCBodW5rIGFuZCBhbGwgdGhlIHJlc3QgdG8gaW5kZXgKKyAgICAgICBkIC0gZG8gbm90IHRoZSBjaGFuZ2UgZnJvbSB0aGF0IGh1bmsgbm9yIGFueSBvZiB0aGUgcmVzdCB0byBpbmRleAorICAgICAgIGogLSBkbyBub3QgZGVjaWRlIG9uIHRoaXMgaHVuayBub3csIGFuZCB2aWV3IHRoZSBuZXh0CisgICAgICAgICAgIHVuZGVjaWRlZCBodW5rCisgICAgICAgSiAtIGRvIG5vdCBkZWNpZGUgb24gdGhpcyBodW5rIG5vdywgYW5kIHZpZXcgdGhlIG5leHQgaHVuaworICAgICAgIGsgLSBkbyBub3QgZGVjaWRlIG9uIHRoaXMgaHVuayBub3csIGFuZCB2aWV3IHRoZSBwcmV2aW91cworICAgICAgICAgICB1bmRlY2lkZWQgaHVuaworICAgICAgIEsgLSBkbyBub3QgZGVjaWRlIG9uIHRoaXMgaHVuayBub3csIGFuZCB2aWV3IHRoZSBwcmV2aW91cyBodW5rCisrCitBZnRlciBkZWNpZGluZyB0aGUgZmF0ZSBmb3IgYWxsIGh1bmtzLCBpZiB0aGVyZSBpcyBhbnkgaHVuawordGhhdCB3YXMgY2hvc2VuLCB0aGUgaW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBodW5rcy4KKworZGlmZjo6CisKKyAgVGhpcyBsZXRzIHlvdSByZXZpZXcgd2hhdCB3aWxsIGJlIGNvbW1pdHRlZCAoaS5lLiBiZXR3ZWVuCisgIEhFQUQgYW5kIGluZGV4KS4KKworCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXN0YXR1c1sxXQorZ2l0bGluazpnaXQtcm1bMV0KK2dpdGxpbms6Z2l0LW12WzFdCitnaXRsaW5rOmdpdC1jb21taXRbMV0KK2dpdGxpbms6Z2l0LXVwZGF0ZS1pbmRleFsxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzk3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK2dpdC1hbSgxKQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hbSAtIEFwcGx5IGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSBhIG1haWxib3gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYW0nIFstLXNpZ25vZmZdIFstLWRvdGVzdD08ZGlyPl0gWy0ta2VlcF0gWy0tdXRmOCB8IC0tbm8tdXRmOF0KKyAgICAgICAgIFstLTN3YXldIFstLWludGVyYWN0aXZlXSBbLS1iaW5hcnldCisgICAgICAgICBbLS13aGl0ZXNwYWNlPTxvcHRpb24+XSBbLUM8bj5dIFstcDxuPl0KKyAgICAgICAgIDxtYm94Pi4uLgorJ2dpdC1hbScgWy0tc2tpcCB8IC0tcmVzb2x2ZWRdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU3BsaXRzIG1haWwgbWVzc2FnZXMgaW4gYSBtYWlsYm94IGludG8gY29tbWl0IGxvZyBtZXNzYWdlLAorYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiBhbmQgcGF0Y2hlcywgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUKK2N1cnJlbnQgYnJhbmNoLgorCitPUFRJT05TCistLS0tLS0tCis8bWJveD4uLi46OgorCVRoZSBsaXN0IG9mIG1haWxib3ggZmlsZXMgdG8gcmVhZCBwYXRjaGVzIGZyb20uIElmIHlvdSBkbyBub3QKKwlzdXBwbHkgdGhpcyBhcmd1bWVudCwgcmVhZHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuCisKKy1zLCAtLXNpZ25vZmY6OgorCUFkZCBgU2lnbmVkLW9mZi1ieTpgIGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLCB1c2luZworCXRoZSBjb21taXR0ZXIgaWRlbnRpdHkgb2YgeW91cnNlbGYuCisKKy1kPTxkaXI+LCAtLWRvdGVzdD08ZGlyPjo6CisJSW5zdGVhZCBvZiBgLmRvdGVzdGAgZGlyZWN0b3J5LCB1c2UgPGRpcj4gYXMgYSB3b3JraW5nCisJYXJlYSB0byBzdG9yZSBleHRyYWN0ZWQgcGF0Y2hlcy4KKworLWssIC0ta2VlcDo6CisJUGFzcyBgLWtgIGZsYWcgdG8gYGdpdC1tYWlsaW5mb2AgKHNlZSBnaXRsaW5rOmdpdC1tYWlsaW5mb1sxXSkuCisKKy11LCAtLXV0Zjg6OgorCVBhc3MgYC11YCBmbGFnIHRvIGBnaXQtbWFpbGluZm9gIChzZWUgZ2l0bGluazpnaXQtbWFpbGluZm9bMV0pLgorCVRoZSBwcm9wb3NlZCBjb21taXQgbG9nIG1lc3NhZ2UgdGFrZW4gZnJvbSB0aGUgZS1tYWlsCisJaXMgcmUtY29kZWQgaW50byBVVEYtOCBlbmNvZGluZyAoY29uZmlndXJhdGlvbiB2YXJpYWJsZQorCWBpMThuLmNvbW1pdGVuY29kaW5nYCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHByb2plY3QncworCXByZWZlcnJlZCBlbmNvZGluZyBpZiBpdCBpcyBub3QgVVRGLTgpLgorKworVGhpcyB3YXMgb3B0aW9uYWwgaW4gcHJpb3IgdmVyc2lvbnMgb2YgZ2l0LCBidXQgbm93IGl0IGlzIHRoZQorZGVmYXVsdC4gICBZb3UgY291bGQgdXNlIGAtLW5vLXV0ZjhgIHRvIG92ZXJyaWRlIHRoaXMuCisKKy0tbm8tdXRmODo6CisJUGFzcyBgLW5gIGZsYWcgdG8gYGdpdC1tYWlsaW5mb2AgKHNlZQorCWdpdGxpbms6Z2l0LW1haWxpbmZvWzFdKS4KKworLTMsIC0tM3dheTo6CisJV2hlbiB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHkgY2xlYW5seSwgZmFsbCBiYWNrIG9uCisJMy13YXkgbWVyZ2UsIGlmIHRoZSBwYXRjaCByZWNvcmRzIHRoZSBpZGVudGl0eSBvZiBibG9icworCWl0IGlzIHN1cHBvc2VkIHRvIGFwcGx5IHRvLCBhbmQgd2UgaGF2ZSB0aG9zZSBibG9icworCWF2YWlsYWJsZSBsb2NhbGx5LgorCistYiwgLS1iaW5hcnk6OgorCVBhc3MgYC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50YCBmbGFnIHRvIGBnaXQtYXBwbHlgCisJKHNlZSBnaXRsaW5rOmdpdC1hcHBseVsxXSkuCisKKy0td2hpdGVzcGFjZT08b3B0aW9uPjo6CisJVGhpcyBmbGFnIGlzIHBhc3NlZCB0byB0aGUgYGdpdC1hcHBseWAgKHNlZSBnaXRsaW5rOmdpdC1hcHBseVsxXSkKKwlwcm9ncmFtIHRoYXQgYXBwbGllcworCXRoZSBwYXRjaC4KKworLUM8bj4sIC1wPG4+OjoKKwlUaGVzZSBmbGFncyBhcmUgcGFzc2VkIHRvIHRoZSBgZ2l0LWFwcGx5YCAoc2VlIGdpdGxpbms6Z2l0LWFwcGx5WzFdKQorCXByb2dyYW0gdGhhdCBhcHBsaWVzCisJdGhlIHBhdGNoLgorCistaSwgLS1pbnRlcmFjdGl2ZTo6CisJUnVuIGludGVyYWN0aXZlbHkuCisKKy0tc2tpcDo6CisJU2tpcCB0aGUgY3VycmVudCBwYXRjaC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KKwlyZXN0YXJ0aW5nIGFuIGFib3J0ZWQgcGF0Y2guCisKKy1yLCAtLXJlc29sdmVkOjoKKwlBZnRlciBhIHBhdGNoIGZhaWx1cmUgKGUuZy4gYXR0ZW1wdGluZyB0byBhcHBseQorCWNvbmZsaWN0aW5nIHBhdGNoKSwgdGhlIHVzZXIgaGFzIGFwcGxpZWQgaXQgYnkgaGFuZCBhbmQKKwl0aGUgaW5kZXggZmlsZSBzdG9yZXMgdGhlIHJlc3VsdCBvZiB0aGUgYXBwbGljYXRpb24uCisJTWFrZSBhIGNvbW1pdCB1c2luZyB0aGUgYXV0aG9yc2hpcCBhbmQgY29tbWl0IGxvZworCWV4dHJhY3RlZCBmcm9tIHRoZSBlLW1haWwgbWVzc2FnZSBhbmQgdGhlIGN1cnJlbnQgaW5kZXgKKwlmaWxlLCBhbmQgY29udGludWUuCisKKy0tcmVzb2x2ZW1zZz08bXNnPjo6CisJV2hlbiBhIHBhdGNoIGZhaWx1cmUgb2NjdXJzLCA8bXNnPiB3aWxsIGJlIHByaW50ZWQKKwl0byB0aGUgc2NyZWVuIGJlZm9yZSBleGl0aW5nLiAgVGhpcyBvdmVycmlkZXMgdGhlCisJc3RhbmRhcmQgbWVzc2FnZSBpbmZvcm1pbmcgeW91IHRvIHVzZSBgLS1yZXNvbHZlZGAKKwlvciBgLS1za2lwYCB0byBoYW5kbGUgdGhlIGZhaWx1cmUuICBUaGlzIGlzIHNvbGVseQorCWZvciBpbnRlcm5hbCB1c2UgYmV0d2VlbiBgZ2l0LXJlYmFzZWAgYW5kIGBnaXQtYW1gLgorCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1RoZSBjb21taXQgYXV0aG9yIG5hbWUgaXMgdGFrZW4gZnJvbSB0aGUgIkZyb206ICIgbGluZSBvZiB0aGUKK21lc3NhZ2UsIGFuZCBjb21taXQgYXV0aG9yIHRpbWUgaXMgdGFrZW4gZnJvbSB0aGUgIkRhdGU6ICIgbGluZQorb2YgdGhlIG1lc3NhZ2UuICBUaGUgIlN1YmplY3Q6ICIgbGluZSBpcyB1c2VkIGFzIHRoZSB0aXRsZSBvZgordGhlIGNvbW1pdCwgYWZ0ZXIgc3RyaXBwaW5nIGNvbW1vbiBwcmVmaXggIltQQVRDSCA8YW55dGhpbmc+XSIuCitJdCBpcyBzdXBwb3NlZCB0byBkZXNjcmliZSB3aGF0IHRoZSBjb21taXQgaXMgYWJvdXQgY29uY2lzZWx5IGFzCithIG9uZSBsaW5lIHRleHQuCisKK1RoZSBib2R5IG9mIHRoZSBtZXNzYWdlIChpb3csIGFmdGVyIGEgYmxhbmsgbGluZSB0aGF0IHRlcm1pbmF0ZXMKK1JGQzI4MjIgaGVhZGVycykgY2FuIGJlZ2luIHdpdGggIlN1YmplY3Q6ICIgYW5kICJGcm9tOiAiIGxpbmVzCit0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBvZiB0aGUgbWFpbCBoZWFkZXIsIHRvIG92ZXJyaWRlCit0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcy4KKworVGhlIGNvbW1pdCBtZXNzYWdlIGlzIGZvcm1lZCBieSB0aGUgdGl0bGUgdGFrZW4gZnJvbSB0aGUKKyJTdWJqZWN0OiAiLCBhIGJsYW5rIGxpbmUgYW5kIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHVwIHRvCit3aGVyZSB0aGUgcGF0Y2ggYmVnaW5zLiAgRXhjZXNzIHdoaXRlc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlCitsaW5lcyBhcmUgYXV0b21hdGljYWxseSBzdHJpcHBlZC4KKworVGhlIHBhdGNoIGlzIGV4cGVjdGVkIHRvIGJlIGlubGluZSwgZGlyZWN0bHkgZm9sbG93aW5nIHRoZQorbWVzc2FnZS4gIEFueSBsaW5lIHRoYXQgaXMgb2YgZm9ybToKKworKiB0aHJlZS1kYXNoZXMgYW5kIGVuZC1vZi1saW5lLCBvcgorKiBhIGxpbmUgdGhhdCBiZWdpbnMgd2l0aCAiZGlmZiAtIiwgb3IKKyogYSBsaW5lIHRoYXQgYmVnaW5zIHdpdGggIkluZGV4OiAiCisKK2lzIHRha2VuIGFzIHRoZSBiZWdpbm5pbmcgb2YgYSBwYXRjaCwgYW5kIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UKK2lzIHRlcm1pbmF0ZWQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHN1Y2ggYSBsaW5lLgorCitXaGVuIGluaXRpYWxseSBpbnZva2luZyBpdCwgeW91IGdpdmUgaXQgbmFtZXMgb2YgdGhlIG1haWxib3hlcwordG8gY3J1bmNoLiAgVXBvbiBzZWVpbmcgdGhlIGZpcnN0IHBhdGNoIHRoYXQgZG9lcyBub3QgYXBwbHksIGl0CithYm9ydHMgaW4gdGhlIG1pZGRsZSwganVzdCBsaWtlICdnaXQtYXBwbHltYm94JyBkb2VzLiAgWW91IGNhbgorcmVjb3ZlciBmcm9tIHRoaXMgaW4gb25lIG9mIHR3byB3YXlzOgorCisuIHNraXAgdGhlIGN1cnJlbnQgcGF0Y2ggYnkgcmUtcnVubmluZyB0aGUgY29tbWFuZCB3aXRoICctLXNraXAnCisgIG9wdGlvbi4KKworLiBoYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHVwZGF0ZQorICB0aGUgaW5kZXggZmlsZSB0byBicmluZyBpdCBpbiBhIHN0YXRlIHRoYXQgdGhlIHBhdGNoIHNob3VsZAorICBoYXZlIHByb2R1Y2VkLiAgVGhlbiBydW4gdGhlIGNvbW1hbmQgd2l0aCAnLS1yZXNvbHZlZCcgb3B0aW9uLgorCitUaGUgY29tbWFuZCByZWZ1c2VzIHRvIHByb2Nlc3MgbmV3IG1haWxib3hlcyB3aGlsZSBgLmRvdGVzdGAKK2RpcmVjdG9yeSBleGlzdHMsIHNvIGlmIHlvdSBkZWNpZGUgdG8gc3RhcnQgb3ZlciBmcm9tIHNjcmF0Y2gsCitydW4gYHJtIC1mIC5kb3Rlc3RgIGJlZm9yZSBydW5uaW5nIHRoZSBjb21tYW5kIHdpdGggbWFpbGJveAorbmFtZXMuCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1hcHBseW1ib3hbMV0sIGdpdGxpbms6Z2l0LWFwcGx5cGF0Y2hbMV0sIGdpdGxpbms6Z2l0LWFwcGx5WzFdLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUGV0ciBCYXVkaXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYW5ub3RhdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYW5ub3RhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGM0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbm5vdGF0ZS50eHQKQEAgLTAsMCArMSwzMSBAQAorZ2l0LWFubm90YXRlKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFubm90YXRlIC0gQW5ub3RhdGUgZmlsZSBsaW5lcyB3aXRoIGNvbW1pdCBpbmZvCisKK1NZTk9QU0lTCistLS0tLS0tLQorZ2l0LWFubm90YXRlIFtvcHRpb25zXSBmaWxlIFtyZXZpc2lvbl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBbm5vdGF0ZXMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBmaWxlIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgY29tbWl0Cit3aGljaCBpbnRyb2R1Y2VkIHRoZSBsaW5lLiBPcHRpb25hbGx5IGFubm90YXRlIGZyb20gYSBnaXZlbiByZXZpc2lvbi4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6YmxhbWUtb3B0aW9ucy50eHRbXQorCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWJsYW1lWzFdCisKK0FVVEhPUgorLS0tLS0tCitXcml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQyYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHkudHh0CkBAIC0wLDAgKzEsMTg2IEBACitnaXQtYXBwbHkoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXBwbHkgLSBBcHBseSBhIHBhdGNoIG9uIGEgZ2l0IGluZGV4IGZpbGUgYW5kIGEgd29ya2luZyB0cmVlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWFwcGx5JyBbLS1zdGF0XSBbLS1udW1zdGF0XSBbLS1zdW1tYXJ5XSBbLS1jaGVja10gWy0taW5kZXhdCisJICBbLS1hcHBseV0gWy0tbm8tYWRkXSBbLS1pbmRleC1pbmZvXSBbLVIgfCAtLXJldmVyc2VdCisJICBbLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgfCAtLWJpbmFyeV0gWy0tcmVqZWN0XSBbLXpdCisJICBbLXBOVU1dIFstQ05VTV0gWy0taW5hY2N1cmF0ZS1lb2ZdIFstLWNhY2hlZF0KKwkgIFstLXdoaXRlc3BhY2U9PG5vd2Fybnx3YXJufGVycm9yfGVycm9yLWFsbHxzdHJpcD5dCisJICBbLS1leGNsdWRlPVBBVEhdIFstLXZlcmJvc2VdIFs8cGF0Y2g+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIHN1cHBsaWVkIGRpZmYgb3V0cHV0IGFuZCBhcHBsaWVzIGl0IG9uIGEgZ2l0IGluZGV4IGZpbGUKK2FuZCBhIHdvcmsgdHJlZS4KKworT1BUSU9OUworLS0tLS0tLQorPHBhdGNoPi4uLjo6CisJVGhlIGZpbGVzIHRvIHJlYWQgcGF0Y2ggZnJvbS4gICctJyBjYW4gYmUgdXNlZCB0byByZWFkCisJZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuCisKKy0tc3RhdDo6CisJSW5zdGVhZCBvZiBhcHBseWluZyB0aGUgcGF0Y2gsIG91dHB1dCBkaWZmc3RhdCBmb3IgdGhlCisJaW5wdXQuICBUdXJucyBvZmYgImFwcGx5Ii4KKworLS1udW1zdGF0OjoKKwlTaW1pbGFyIHRvIFwtLXN0YXQsIGJ1dCBzaG93cyBudW1iZXIgb2YgYWRkZWQgYW5kCisJZGVsZXRlZCBsaW5lcyBpbiBkZWNpbWFsIG5vdGF0aW9uIGFuZCBwYXRobmFtZSB3aXRob3V0CisJYWJicmV2aWF0aW9uLCB0byBtYWtlIGl0IG1vcmUgbWFjaGluZSBmcmllbmRseS4gIEZvcgorCWJpbmFyeSBmaWxlcywgb3V0cHV0cyB0d28gYC1gIGluc3RlYWQgb2Ygc2F5aW5nCisJYDAgMGAuICBUdXJucyBvZmYgImFwcGx5Ii4KKworLS1zdW1tYXJ5OjoKKwlJbnN0ZWFkIG9mIGFwcGx5aW5nIHRoZSBwYXRjaCwgb3V0cHV0IGEgY29uZGVuc2VkCisJc3VtbWFyeSBvZiBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGdpdCBkaWZmIGV4dGVuZGVkCisJaGVhZGVycywgc3VjaCBhcyBjcmVhdGlvbnMsIHJlbmFtZXMgYW5kIG1vZGUgY2hhbmdlcy4KKwlUdXJucyBvZmYgImFwcGx5Ii4KKworLS1jaGVjazo6CisJSW5zdGVhZCBvZiBhcHBseWluZyB0aGUgcGF0Y2gsIHNlZSBpZiB0aGUgcGF0Y2ggaXMKKwlhcHBsaWNhYmxlIHRvIHRoZSBjdXJyZW50IHdvcmsgdHJlZSBhbmQvb3IgdGhlIGluZGV4CisJZmlsZSBhbmQgZGV0ZWN0cyBlcnJvcnMuICBUdXJucyBvZmYgImFwcGx5Ii4KKworLS1pbmRleDo6CisJV2hlbiAtLWNoZWNrIGlzIGluIGVmZmVjdCwgb3Igd2hlbiBhcHBseWluZyB0aGUgcGF0Y2gKKwkod2hpY2ggaXMgdGhlIGRlZmF1bHQgd2hlbiBub25lIG9mIHRoZSBvcHRpb25zIHRoYXQKKwlkaXNhYmxlcyBpdCBpcyBpbiBlZmZlY3QpLCBtYWtlIHN1cmUgdGhlIHBhdGNoIGlzCisJYXBwbGljYWJsZSB0byB3aGF0IHRoZSBjdXJyZW50IGluZGV4IGZpbGUgcmVjb3Jkcy4gIElmCisJdGhlIGZpbGUgdG8gYmUgcGF0Y2hlZCBpbiB0aGUgd29yayB0cmVlIGlzIG5vdAorCXVwLXRvLWRhdGUsIGl0IGlzIGZsYWdnZWQgYXMgYW4gZXJyb3IuICBUaGlzIGZsYWcgYWxzbworCWNhdXNlcyB0aGUgaW5kZXggZmlsZSB0byBiZSB1cGRhdGVkLgorCistLWNhY2hlZDo6CisJQXBwbHkgYSBwYXRjaCB3aXRob3V0IHRvdWNoaW5nIHRoZSB3b3JraW5nIHRyZWUuIEluc3RlYWQsIHRha2UgdGhlCisJY2FjaGVkIGRhdGEsIGFwcGx5IHRoZSBwYXRjaCwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlIGluZGV4LAorCXdpdGhvdXQgdXNpbmcgdGhlIHdvcmtpbmcgdHJlZS4gVGhpcyBpbXBsaWVzICctLWluZGV4Jy4KKworLS1pbmRleC1pbmZvOjoKKwlOZXdlciBnaXQtZGlmZiBvdXRwdXQgaGFzIGVtYmVkZGVkICdpbmRleCBpbmZvcm1hdGlvbicKKwlmb3IgZWFjaCBibG9iIHRvIGhlbHAgaWRlbnRpZnkgdGhlIG9yaWdpbmFsIHZlcnNpb24gdGhhdAorCXRoZSBwYXRjaCBhcHBsaWVzIHRvLiAgV2hlbiB0aGlzIGZsYWcgaXMgZ2l2ZW4sIGFuZCBpZgorCXRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBibG9iIGlzIGF2YWlsYWJsZSBsb2NhbGx5LAorCW91dHB1dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlbSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCistUiwgLS1yZXZlcnNlOjoKKwlBcHBseSB0aGUgcGF0Y2ggaW4gcmV2ZXJzZS4KKworLS1yZWplY3Q6OgorCUZvciBhdG9taWNpdHksIGdpdGxpbms6Z2l0LWFwcGx5WzFdIGJ5IGRlZmF1bHQgZmFpbHMgdGhlIHdob2xlIHBhdGNoIGFuZAorCWRvZXMgbm90IHRvdWNoIHRoZSB3b3JraW5nIHRyZWUgd2hlbiBzb21lIG9mIHRoZSBodW5rcworCWRvIG5vdCBhcHBseS4gIFRoaXMgb3B0aW9uIG1ha2VzIGl0IGFwcGx5CisJdGhlIHBhcnRzIG9mIHRoZSBwYXRjaCB0aGF0IGFyZSBhcHBsaWNhYmxlLCBhbmQgbGVhdmUgdGhlCisJcmVqZWN0ZWQgaHVua3MgaW4gY29ycmVzcG9uZGluZyAqLnJlaiBmaWxlcy4KKworLXo6OgorCVdoZW4gc2hvd2luZyB0aGUgaW5kZXggaW5mb3JtYXRpb24sIGRvIG5vdCBtdW5nZSBwYXRocywKKwlidXQgdXNlIE5VTCB0ZXJtaW5hdGVkIG1hY2hpbmUgcmVhZGFibGUgZm9ybWF0LiAgV2l0aG91dAorCXRoaXMgZmxhZywgdGhlIHBhdGhuYW1lcyBvdXRwdXQgd2lsbCBoYXZlIFRBQiwgTEYsIGFuZAorCWJhY2tzbGFzaCBjaGFyYWN0ZXJzIHJlcGxhY2VkIHdpdGggYFx0YCwgYFxuYCwgYW5kIGBcXGAsCisJcmVzcGVjdGl2ZWx5LgorCistcDxuPjo6CisJUmVtb3ZlIDxuPiBsZWFkaW5nIHNsYXNoZXMgZnJvbSB0cmFkaXRpb25hbCBkaWZmIHBhdGhzLiBUaGUKKwlkZWZhdWx0IGlzIDEuCisKKy1DPG4+OjoKKwlFbnN1cmUgYXQgbGVhc3QgPG4+IGxpbmVzIG9mIHN1cnJvdW5kaW5nIGNvbnRleHQgbWF0Y2ggYmVmb3JlCisJYW5kIGFmdGVyIGVhY2ggY2hhbmdlLiAgV2hlbiBmZXdlciBsaW5lcyBvZiBzdXJyb3VuZGluZworCWNvbnRleHQgZXhpc3QgdGhleSBhbGwgbXVzdCBtYXRjaC4gIEJ5IGRlZmF1bHQgbm8gY29udGV4dCBpcworCWV2ZXIgaWdub3JlZC4KKworLS11bmlkaWZmLXplcm86OgorCUJ5IGRlZmF1bHQsIGdpdGxpbms6Z2l0LWFwcGx5WzFdIGV4cGVjdHMgdGhhdCB0aGUgcGF0Y2ggYmVpbmcKKwlhcHBsaWVkIGlzIGEgdW5pZmllZCBkaWZmIHdpdGggYXQgbGVhc3Qgb25lIGxpbmUgb2YgY29udGV4dC4KKwlUaGlzIHByb3ZpZGVzIGdvb2Qgc2FmZXR5IG1lYXN1cmVzLCBidXQgYnJlYWtzIGRvd24gd2hlbgorCWFwcGx5aW5nIGEgZGlmZiBnZW5lcmF0ZWQgd2l0aCAtLXVuaWZpZWQ9MC4gVG8gYnlwYXNzIHRoZXNlCisJY2hlY2tzIHVzZSAnLS11bmlkaWZmLXplcm8nLgorKworTm90ZSwgZm9yIHRoZSByZWFzb25zIHN0YXRlZCBhYm92ZSB1c2FnZSBvZiBjb250ZXh0LWZyZWUgcGF0Y2hlcyBhcmUKK2Rpc2NvdXJhZ2VkLgorCistLWFwcGx5OjoKKwlJZiB5b3UgdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBtYXJrZWQgIlR1cm5zIG9mZgorCSdhcHBseSciIGFib3ZlLCBnaXRsaW5rOmdpdC1hcHBseVsxXSByZWFkcyBhbmQgb3V0cHV0cyB0aGUKKwlpbmZvcm1hdGlvbiB5b3UgYXNrZWQgd2l0aG91dCBhY3R1YWxseSBhcHBseWluZyB0aGUKKwlwYXRjaC4gIEdpdmUgdGhpcyBmbGFnIGFmdGVyIHRob3NlIGZsYWdzIHRvIGFsc28gYXBwbHkKKwl0aGUgcGF0Y2guCisKKy0tbm8tYWRkOjoKKwlXaGVuIGFwcGx5aW5nIGEgcGF0Y2gsIGlnbm9yZSBhZGRpdGlvbnMgbWFkZSBieSB0aGUKKwlwYXRjaC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBjb21tb24gcGFydCBiZXR3ZWVuCisJdHdvIGZpbGVzIGJ5IGZpcnN0IHJ1bm5pbmcgYGRpZmZgIG9uIHRoZW0gYW5kIGFwcGx5aW5nCisJdGhlIHJlc3VsdCB3aXRoIHRoaXMgb3B0aW9uLCB3aGljaCB3b3VsZCBhcHBseSB0aGUKKwlkZWxldGlvbiBwYXJ0IGJ1dCBub3QgYWRkaXRpb24gcGFydC4KKworLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQsIC0tYmluYXJ5OjoKKwlIaXN0b3JpY2FsbHkgd2UgZGlkIG5vdCBhbGxvdyBiaW5hcnkgcGF0Y2ggYXBwbGllZAorCXdpdGhvdXQgYW4gZXhwbGljaXQgcGVybWlzc2lvbiBmcm9tIHRoZSB1c2VyLCBhbmQgdGhpcworCWZsYWcgd2FzIHRoZSB3YXkgdG8gZG8gc28uICBDdXJyZW50bHkgd2UgYWx3YXlzIGFsbG93IGJpbmFyeQorCXBhdGNoIGFwcGxpY2F0aW9uLCBzbyB0aGlzIGlzIGEgbm8tb3AuCisKKy0tZXhjbHVkZT08cGF0aC1wYXR0ZXJuPjo6CisJRG9uJ3QgYXBwbHkgY2hhbmdlcyB0byBmaWxlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gcGF0aCBwYXR0ZXJuLiBUaGlzIGNhbgorCWJlIHVzZWZ1bCB3aGVuIGltcG9ydGluZyBwYXRjaHNldHMsIHdoZXJlIHlvdSB3YW50IHRvIGV4Y2x1ZGUgY2VydGFpbgorCWZpbGVzIG9yIGRpcmVjdG9yaWVzLgorCistLXdoaXRlc3BhY2U9PG9wdGlvbj46OgorCVdoZW4gYXBwbHlpbmcgYSBwYXRjaCwgZGV0ZWN0IGEgbmV3IG9yIG1vZGlmaWVkIGxpbmUKKwl0aGF0IGVuZHMgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlcyAodGhpcyBpbmNsdWRlcyBhCisJbGluZSB0aGF0IHNvbGVseSBjb25zaXN0cyBvZiB3aGl0ZXNwYWNlcykuICBCeSBkZWZhdWx0LAorCXRoZSBjb21tYW5kIG91dHB1dHMgd2FybmluZyBtZXNzYWdlcyBhbmQgYXBwbGllcyB0aGUKKwlwYXRjaC4KKwlXaGVuIGdpdGxpbms6Z2l0LWFwcGx5WzFdIGlzIHVzZWQgZm9yIHN0YXRpc3RpY3MgYW5kIG5vdCBhcHBseWluZyBhCisJcGF0Y2gsIGl0IGRlZmF1bHRzIHRvIGBub3dhcm5gLgorCVlvdSBjYW4gdXNlIGRpZmZlcmVudCBgPG9wdGlvbj5gIHRvIGNvbnRyb2wgdGhpcworCWJlaGF2aW9yOgorKworKiBgbm93YXJuYCB0dXJucyBvZmYgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugd2FybmluZy4KKyogYHdhcm5gIG91dHB1dHMgd2FybmluZ3MgZm9yIGEgZmV3IHN1Y2ggZXJyb3JzLCBidXQgYXBwbGllcyB0aGUKKyAgcGF0Y2ggKGRlZmF1bHQpLgorKiBgZXJyb3JgIG91dHB1dHMgd2FybmluZ3MgZm9yIGEgZmV3IHN1Y2ggZXJyb3JzLCBhbmQgcmVmdXNlcworICB0byBhcHBseSB0aGUgcGF0Y2guCisqIGBlcnJvci1hbGxgIGlzIHNpbWlsYXIgdG8gYGVycm9yYCBidXQgc2hvd3MgYWxsIGVycm9ycy4KKyogYHN0cmlwYCBvdXRwdXRzIHdhcm5pbmdzIGZvciBhIGZldyBzdWNoIGVycm9ycywgc3RyaXBzIG91dCB0aGUKKyAgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYW5kIGFwcGxpZXMgdGhlIHBhdGNoLgorCistLWluYWNjdXJhdGUtZW9mOjoKKwlVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHNvbWUgdmVyc2lvbnMgb2YgZGlmZiBkbyBub3QgY29ycmVjdGx5CisJZGV0ZWN0IGEgbWlzc2luZyBuZXctbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBBcyBhIHJlc3VsdCwgcGF0Y2hlcworCWNyZWF0ZWQgYnkgc3VjaCBkaWZmIHByb2dyYW1zIGRvIG5vdCByZWNvcmQgaW5jb21wbGV0ZSBsaW5lcworCWNvcnJlY3RseS4gVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBhcHBseWluZyBzdWNoIHBhdGNoZXMgYnkKKwl3b3JraW5nIGFyb3VuZCB0aGlzIGJ1Zy4KKworLXYsIC0tdmVyYm9zZTo6CisJUmVwb3J0IHByb2dyZXNzIHRvIHN0ZGVyci4gQnkgZGVmYXVsdCwgb25seSBhIG1lc3NhZ2UgYWJvdXQgdGhlCisJY3VycmVudCBwYXRjaCBiZWluZyBhcHBsaWVkIHdpbGwgYmUgcHJpbnRlZC4gVGhpcyBvcHRpb24gd2lsbCBjYXVzZQorCWFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgcmVwb3J0ZWQuCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworYXBwbHkud2hpdGVzcGFjZTo6CisJV2hlbiBubyBgLS13aGl0ZXNwYWNlYCBmbGFnIGlzIGdpdmVuIGZyb20gdGhlIGNvbW1hbmQKKwlsaW5lLCB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5bWJveC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseW1ib3gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTE5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseW1ib3gudHh0CkBAIC0wLDAgKzEsOTggQEAKK2dpdC1hcHBseW1ib3goMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFwcGx5bWJveCAtIEFwcGx5IGEgc2VyaWVzIG9mIHBhdGNoZXMgaW4gYSBtYWlsYm94CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWFwcGx5bWJveCcgWy11XSBbLWtdIFstcV0gWy1tXSAoIC1jIC5kb3Rlc3QvPG51bT4gfCA8bWJveD4gKSBbIDxzaWdub2ZmPiBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU3BsaXRzIG1haWwgbWVzc2FnZXMgaW4gYSBtYWlsYm94IGludG8gY29tbWl0IGxvZyBtZXNzYWdlLAorYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiBhbmQgcGF0Y2hlcywgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUKK2N1cnJlbnQgYnJhbmNoLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1xOjoKKwlBcHBseSBwYXRjaGVzIGludGVyYWN0aXZlbHkuICBUaGUgdXNlciB3aWxsIGJlIGdpdmVuCisJb3Bwb3J0dW5pdHkgdG8gZWRpdCB0aGUgbG9nIG1lc3NhZ2UgYW5kIHRoZSBwYXRjaCBiZWZvcmUKKwlhdHRlbXB0aW5nIHRvIGFwcGx5IGl0LgorCistazo6CisJVXN1YWxseSB0aGUgcHJvZ3JhbSAnY2xlYW5zIHVwJyB0aGUgU3ViamVjdDogaGVhZGVyIGxpbmUKKwl0byBleHRyYWN0IHRoZSB0aXRsZSBsaW5lIGZvciB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLAorCWFtb25nIHdoaWNoICgxKSByZW1vdmUgJ1JlOicgb3IgJ3JlOicsICgyKSBsZWFkaW5nCisJd2hpdGVzcGFjZXMsICgzKSAnWycgdXAgdG8gJ10nLCB0eXBpY2FsbHkgJ1tQQVRDSF0nLCBhbmQKKwl0aGVuIHByZXBlbmRzICJbUEFUQ0hdICIuICBUaGlzIGZsYWcgZm9yYmlkcyB0aGlzCisJbXVuZ2luZywgYW5kIGlzIG1vc3QgdXNlZnVsIHdoZW4gdXNlZCB0byByZWFkIGJhY2sgJ2dpdAorCWZvcm1hdC1wYXRjaCAtaycgb3V0cHV0LgorCistbTo6CisJUGF0Y2hlcyBhcmUgYXBwbGllZCB3aXRoIGBnaXQtYXBwbHlgIGNvbW1hbmQsIGFuZCB1bmxlc3MKKwlpdCBjbGVhbmx5IGFwcGxpZXMgd2l0aG91dCBmdXp6LCB0aGUgcHJvY2Vzc2luZyBmYWlscy4KKwlXaXRoIHRoaXMgZmxhZywgaWYgYSB0cmVlIHRoYXQgdGhlIHBhdGNoIGFwcGxpZXMgY2xlYW5seQorCWlzIGZvdW5kIGluIGEgcmVwb3NpdG9yeSwgdGhlIHBhdGNoIGlzIGFwcGxpZWQgdG8gdGhlCisJdHJlZSBhbmQgdGhlbiBhIDMtd2F5IG1lcmdlIGJldHdlZW4gdGhlIHJlc3VsdGluZyB0cmVlCisJYW5kIHRoZSBjdXJyZW50IHRyZWUuCisKKy11OjoKKwlQYXNzIGAtdWAgZmxhZyB0byBgZ2l0LW1haWxpbmZvYCAoc2VlIGdpdGxpbms6Z2l0LW1haWxpbmZvWzFdKS4KKwlUaGUgcHJvcG9zZWQgY29tbWl0IGxvZyBtZXNzYWdlIHRha2VuIGZyb20gdGhlIGUtbWFpbAorCWFyZSByZS1jb2RlZCBpbnRvIFVURi04IGVuY29kaW5nIChjb25maWd1cmF0aW9uIHZhcmlhYmxlCisJYGkxOG4uY29tbWl0ZW5jb2RpbmdgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgcHJvamVjdCdzCisJcHJlZmVycmVkIGVuY29kaW5nIGlmIGl0IGlzIG5vdCBVVEYtOCkuICBUaGlzIHVzZWQgdG8gYmUKKwlvcHRpb25hbCBidXQgbm93IGl0IGlzIHRoZSBkZWZhdWx0LgorKworTm90ZSB0aGF0IHRoZSBwYXRjaCBpcyBhbHdheXMgdXNlZCBhcy1pcyB3aXRob3V0IGNoYXJzZXQKK2NvbnZlcnNpb24sIGV2ZW4gd2l0aCB0aGlzIGZsYWcuCisKKy1uOjoKKwlQYXNzIGAtbmAgZmxhZyB0byBgZ2l0LW1haWxpbmZvYCAoc2VlCisJZ2l0bGluazpnaXQtbWFpbGluZm9bMV0pLgorCistYyAuZG90ZXN0LzxudW0+OjoKKwlXaGVuIHRoZSBwYXRjaCBjb250YWluZWQgaW4gYW4gZS1tYWlsIGRvZXMgbm90IGNsZWFubHkKKwlhcHBseSwgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlLiBUaGUKKwlwYXRjaCBhbmQgZXh0cmFjdGVkIG1lc3NhZ2UgYXJlIGZvdW5kIGluIC5kb3Rlc3QvLCBhbmQKKwl5b3UgY291bGQgcmUtcnVuICdnaXQgYXBwbHltYm94JyB3aXRoICctYyAuZG90ZXN0LzxudW0+JworCWZsYWcgdG8gcmVzdGFydCB0aGUgcHJvY2VzcyBhZnRlciBpbnNwZWN0aW5nIGFuZCBmaXhpbmcKKwl0aGVtLgorCis8bWJveD46OgorCVRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGUtbWFpbCBtZXNzYWdlcworCXdpdGggcGF0Y2hlcy4gIFRoaXMgZmlsZSBzaG91bGQgYmUgaW4gdGhlIFVOSVggbWFpbGJveAorCWZvcm1hdC4gIFNlZSAnU3VibWl0dGluZ1BhdGNoZXMnIGRvY3VtZW50IHRvIGxlYXJuIGFib3V0CisJdGhlIGZvcm1hdHRpbmcgY29udmVudGlvbiBmb3IgZS1tYWlsIHN1Ym1pc3Npb24uCisKKzxzaWdub2ZmPjo6CisJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB5b3VyICJTaWduZWQtb2ZmLWJ5IgorCWxpbmUuICBTZWUgJ1N1Ym1pdHRpbmdQYXRjaGVzJyBkb2N1bWVudCB0byBsZWFybiB3aGF0CisJIlNpZ25lZC1vZmYtYnkiIGxpbmUgbWVhbnMuICBZb3UgY2FuIGFsc28ganVzdCBzYXkKKwkneWVzJywgJ3RydWUnLCAnbWUnLCBvciAncGxlYXNlJyB0byB1c2UgYW4gYXV0b21hdGljYWxseQorCWdlbmVyYXRlZCAiU2lnbmVkLW9mZi1ieSIgbGluZSBiYXNlZCBvbiB5b3VyIGNvbW1pdHRlcgorCWlkZW50aXR5LgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYW1bMV0sIGdpdGxpbms6Z2l0LWFwcGx5cGF0Y2hbMV0uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5cGF0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHlwYXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxNDM0YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5cGF0Y2gudHh0CkBAIC0wLDAgKzEsNTMgQEAKK2dpdC1hcHBseXBhdGNoKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXBwbHlwYXRjaCAtIEFwcGx5IG9uZSBwYXRjaCBleHRyYWN0ZWQgZnJvbSBhbiBlLW1haWwKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtYXBwbHlwYXRjaCcgPG1zZz4gPHBhdGNoPiA8aW5mbz4gWzxzaWdub2ZmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgYW4gZW5kIHVzZXIgd2FudHMgdG8gcnVuIGRpcmVjdGx5LiAgU2VlCitnaXRsaW5rOmdpdC1hbVsxXSBpbnN0ZWFkLgorCitUYWtlcyB0aHJlZSBmaWxlcyA8bXNnPiwgPHBhdGNoPiwgYW5kIDxpbmZvPiBwcmVwYXJlZCBmcm9tIGFuCitlLW1haWwgbWVzc2FnZSBieSAnZ2l0LW1haWxpbmZvJywgYW5kIGNyZWF0ZXMgYSBjb21taXQuICBJdCBpcwordXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGNvbW1hbmQgZGlyZWN0bHkuCisKK1RoaXMgY29tbWFuZCBjYW4gcnVuIGBhcHBseXBhdGNoLW1zZ2AsIGBwcmUtYXBwbHlwYXRjaGAsIGFuZAorYHBvc3QtYXBwbHlwYXRjaGAgaG9va3MuICBTZWUgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKworT1BUSU9OUworLS0tLS0tLQorPG1zZz46OgorCUNvbW1pdCBsb2cgbWVzc2FnZSAoc2FucyB0aGUgZmlyc3QgbGluZSwgd2hpY2ggY29tZXMKKwlmcm9tIGUtbWFpbCBTdWJqZWN0IHN0b3JlZCBpbiA8aW5mbz4pLgorCis8cGF0Y2g+OjoKKwlUaGUgcGF0Y2ggdG8gYXBwbHkuCisKKzxpbmZvPjo6CisJQXV0aG9yIGFuZCBzdWJqZWN0IGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIGUtbWFpbCwKKwl1c2VkIG9uICJhdXRob3IiIGxpbmUgYW5kIGFzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcmNoaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNiNDFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQKQEAgLTAsMCArMSwxMjEgQEAKK2dpdC1hcmNoaW1wb3J0KDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXJjaGltcG9ydCAtIEltcG9ydCBhbiBBcmNoIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYXJjaGltcG9ydCcgWy1oXSBbLXZdIFstb10gWy1hXSBbLWZdIFstVF0gWy1EIGRlcHRoXSBbLXQgdGVtcGRpcl0KKyAgICAgICAgICAgICAgIDxhcmNoaXZlL2JyYW5jaD5bOjxnaXQtYnJhbmNoPl0gLi4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW1wb3J0cyBhIHByb2plY3QgZnJvbSBvbmUgb3IgbW9yZSBBcmNoIHJlcG9zaXRvcmllcy4gSXQgd2lsbCBmb2xsb3cgYnJhbmNoZXMKK2FuZCByZXBvc2l0b3JpZXMgd2l0aGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgYnkgdGhlIDxhcmNoaXZlL2JyYW5jaD4KK3BhcmFtZXRlcnMgc3VwcGxpZWQuIElmIGl0IGNhbm5vdCBmaW5kIHRoZSByZW1vdGUgYnJhbmNoIGEgbWVyZ2UgY29tZXMgZnJvbQoraXQgd2lsbCBqdXN0IGltcG9ydCBpdCBhcyBhIHJlZ3VsYXIgY29tbWl0LiBJZiBpdCBjYW4gZmluZCBpdCwgaXQgd2lsbCBtYXJrIGl0IAorYXMgYSBtZXJnZSB3aGVuZXZlciBwb3NzaWJsZSAoc2VlIGRpc2N1c3Npb24gYmVsb3cpLiAKKworVGhlIHNjcmlwdCBleHBlY3RzIHlvdSB0byBwcm92aWRlIHRoZSBrZXkgcm9vdHMgd2hlcmUgaXQgY2FuIHN0YXJ0IHRoZSBpbXBvcnQgCitmcm9tIGFuICdpbml0aWFsIGltcG9ydCcgb3IgJ3RhZycgdHlwZSBvZiBBcmNoIGNvbW1pdC4gSXQgd2lsbCBmb2xsb3cgYW5kIAoraW1wb3J0IG5ldyBicmFuY2hlcyB3aXRoaW4gdGhlIHByb3ZpZGVkIHJvb3RzLiAKKworSXQgZXhwZWN0cyB0byBiZSBkZWFsaW5nIHdpdGggb25lIHByb2plY3Qgb25seS4gSWYgaXQgc2VlcyAKK2JyYW5jaGVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgcm9vdHMsIGl0IHdpbGwgcmVmdXNlIHRvIHJ1bi4gSW4gdGhhdCBjYXNlLCAKK2VkaXQgeW91ciA8YXJjaGl2ZS9icmFuY2g+IHBhcmFtZXRlcnMgdG8gZGVmaW5lIGNsZWFybHkgdGhlIHNjb3BlIG9mIHRoZSAKK2ltcG9ydC4gCisKK2BnaXQtYXJjaGltcG9ydGAgdXNlcyBgdGxhYCBleHRlbnNpdmVseSBpbiB0aGUgYmFja2dyb3VuZCB0byBhY2Nlc3MgdGhlIAorQXJjaCByZXBvc2l0b3J5LgorTWFrZSBzdXJlIHlvdSBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgYHRsYWAgYXZhaWxhYmxlIGluIHRoZSBwYXRoLiBgdGxhYCBtdXN0Citrbm93IGFib3V0IHRoZSByZXBvc2l0b3JpZXMgeW91IHBhc3MgdG8gYGdpdC1hcmNoaW1wb3J0YC4gCisKK0ZvciB0aGUgaW5pdGlhbCBpbXBvcnQgYGdpdC1hcmNoaW1wb3J0YCBleHBlY3RzIHRvIGZpbmQgaXRzZWxmIGluIGFuIGVtcHR5IAorZGlyZWN0b3J5LiBUbyBmb2xsb3cgdGhlIGRldmVsb3BtZW50IG9mIGEgcHJvamVjdCB0aGF0IHVzZXMgQXJjaCwgcmVydW4gCitgZ2l0LWFyY2hpbXBvcnRgIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgaW5pdGlhbCBpbXBvcnQgdG8gcGVyZm9ybSAKK2luY3JlbWVudGFsIGltcG9ydHMuCisKK1doaWxlIGdpdC1hcmNoaW1wb3J0IHdpbGwgdHJ5IHRvIGNyZWF0ZSBzZW5zaWJsZSBicmFuY2ggbmFtZXMgZm9yIHRoZQorYXJjaGl2ZXMgdGhhdCBpdCBpbXBvcnRzLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgZ2l0IGJyYW5jaCBuYW1lcworbWFudWFsbHkuICBUbyBkbyBzbywgd3JpdGUgYSBnaXQgYnJhbmNoIG5hbWUgYWZ0ZXIgZWFjaCA8YXJjaGl2ZS9icmFuY2g+CitwYXJhbWV0ZXIsIHNlcGFyYXRlZCBieSBhIGNvbG9uLiAgVGhpcyB3YXksIHlvdSBjYW4gc2hvcnRlbiB0aGUgQXJjaAorYnJhbmNoIG5hbWVzIGFuZCBjb252ZXJ0IEFyY2ggamFyZ29uIHRvIGdpdCBqYXJnb24sIGZvciBleGFtcGxlIG1hcHBpbmcgYQorIlBST0pFQ1QtLWRldm8tLVZFUlNJT04iIGJyYW5jaCB0byAibWFzdGVyIi4KKworQXNzb2NpYXRpbmcgbXVsdGlwbGUgQXJjaCBicmFuY2hlcyB0byBvbmUgZ2l0IGJyYW5jaCBpcyBwb3NzaWJsZTsgdGhlCityZXN1bHQgd2lsbCBtYWtlIHRoZSBtb3N0IHNlbnNlIG9ubHkgaWYgbm8gY29tbWl0cyBhcmUgbWFkZSB0byB0aGUgZmlyc3QKK2JyYW5jaCwgYWZ0ZXIgdGhlIHNlY29uZCBicmFuY2ggaXMgY3JlYXRlZC4gIFN0aWxsLCB0aGlzIGlzIHVzZWZ1bCB0bworY29udmVydCBBcmNoIHJlcG9zaXRvcmllcyB0aGF0IGhhZCBiZWVuIHJvdGF0ZWQgcGVyaW9kaWNhbGx5LgorCisKK01FUkdFUworLS0tLS0tCitQYXRjaCBtZXJnZSBkYXRhIGZyb20gQXJjaCBpcyB1c2VkIHRvIG1hcmsgbWVyZ2VzIGluIGdpdCBhcyB3ZWxsLiBnaXQgCitkb2VzIG5vdCBjYXJlIG11Y2ggYWJvdXQgdHJhY2tpbmcgcGF0Y2hlcywgYW5kIG9ubHkgY29uc2lkZXJzIGEgbWVyZ2Ugd2hlbiBhCiticmFuY2ggaW5jb3Jwb3JhdGVzIGFsbCB0aGUgY29tbWl0cyBzaW5jZSB0aGUgcG9pbnQgdGhleSBmb3JrZWQuIFRoZSBlbmQgcmVzdWx0CitpcyB0aGF0IGdpdCB3aWxsIGhhdmUgYSBnb29kIGlkZWEgb2YgaG93IGZhciBicmFuY2hlcyBoYXZlIGRpdmVyZ2VkLiBTbyB0aGUgCitpbXBvcnQgcHJvY2VzcyBkb2VzIGxvc2Ugc29tZSBwYXRjaC10cmFkaW5nIG1ldGFkYXRhLgorCitGb3J0dW5hdGVseSwgd2hlbiB5b3UgdHJ5IGFuZCBtZXJnZSBicmFuY2hlcyBpbXBvcnRlZCBmcm9tIEFyY2gsIAorZ2l0IHdpbGwgZmluZCBhIGdvb2QgbWVyZ2UgYmFzZSwgYW5kIGl0IGhhcyBhIGdvb2QgY2hhbmNlIG9mIGlkZW50aWZ5aW5nIAorcGF0Y2hlcyB0aGF0IGhhdmUgYmVlbiB0cmFkZWQgb3V0LW9mLXNlcXVlbmNlIGJldHdlZW4gdGhlIGJyYW5jaGVzLiAKKworT1BUSU9OUworLS0tLS0tLQorCistaDo6CisJRGlzcGxheSB1c2FnZS4KKworLXY6OgorCVZlcmJvc2Ugb3V0cHV0LiAKKworLVQ6OgorCU1hbnkgdGFncy4gV2lsbCBjcmVhdGUgYSB0YWcgZm9yIGV2ZXJ5IGNvbW1pdCwgcmVmbGVjdGluZyB0aGUgY29tbWl0IAorCW5hbWUgaW4gdGhlIEFyY2ggcmVwb3NpdG9yeS4KKworLWY6OgorCVVzZSB0aGUgZmFzdCBwYXRjaHNldCBpbXBvcnQgc3RyYXRlZ3kuICBUaGlzIGNhbiBiZSBzaWduaWZpY2FudGx5CisJZmFzdGVyIGZvciBsYXJnZSB0cmVlcywgYnV0IGNhbm5vdCBoYW5kbGUgZGlyZWN0b3J5IHJlbmFtZXMgb3IKKwlwZXJtaXNzaW9ucyBjaGFuZ2VzLiAgVGhlIGRlZmF1bHQgc3RyYXRlZ3kgaXMgc2xvdyBhbmQgc2FmZS4KKworLW86OgorCVVzZSB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkLXN0eWxlIGJyYW5jaCBuYW1lcyB1c2VkIGJ5CisJZWFybGllciB2ZXJzaW9ucyBvZiBnaXQtYXJjaGltcG9ydC4gIE9sZC1zdHlsZSBicmFuY2ggbmFtZXMKKwl3ZXJlIGNhdGVnb3J5LS1icmFuY2gsIHdoZXJlYXMgbmV3LXN0eWxlIGJyYW5jaCBuYW1lcyBhcmUKKwlhcmNoaXZlLGNhdGVnb3J5LS1icmFuY2gtLXZlcnNpb24uICBJbiBib3RoIGNhc2VzLCBuYW1lcyBnaXZlbgorCW9uIHRoZSBjb21tYW5kLWxpbmUgd2lsbCBvdmVycmlkZSB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQKKwlvbmVzLgorCistRCA8ZGVwdGg+OjoKKwlGb2xsb3cgbWVyZ2UgYW5jZXN0cnkgYW5kIGF0dGVtcHQgdG8gaW1wb3J0IHRyZWVzIHRoYXQgaGF2ZSBiZWVuCisJbWVyZ2VkIGZyb20uICBTcGVjaWZ5IGEgZGVwdGggZ3JlYXRlciB0aGFuIDEgaWYgcGF0Y2ggbG9ncyBoYXZlIGJlZW4KKwlwcnVuZWQuCisKKy1hOjoKKwlBdHRlbXB0IHRvIGF1dG8tcmVnaXN0ZXIgYXJjaGl2ZXMgYXQgaHR0cDovL21pcnJvcnMuc291cmNlY29udHJvbC5uZXQKKwlUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2l0aCB0aGUgLUQgb3B0aW9uLgorCistdCA8dG1wZGlyPjo6CisJT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGVtcGRpci4KKworCis8YXJjaGl2ZS9icmFuY2g+OjoKKwlBcmNoaXZlL2JyYW5jaCBpZGVudGlmaWVyIGluIGEgZm9ybWF0IHRoYXQgYHRsYSBsb2dgIHVuZGVyc3RhbmRzLiAKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubywgTWFydGluIExhbmdob2ZmIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGl2ZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcmNoaXZlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGEwN2MxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGl2ZS50eHQKQEAgLTAsMCArMSwxMTggQEAKK2dpdC1hcmNoaXZlKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXJjaGl2ZSAtIENyZWF0ZSBhbiBhcmNoaXZlIG9mIGZpbGVzIGZyb20gYSBuYW1lZCB0cmVlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWFyY2hpdmUnIC0tZm9ybWF0PTxmbXQ+IFstLWxpc3RdIFstLXByZWZpeD08cHJlZml4Pi9dIFs8ZXh0cmE+XQorCSAgICAgIFstLXJlbW90ZT08cmVwbz5dIDx0cmVlLWlzaD4gW3BhdGguLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ3JlYXRlcyBhbiBhcmNoaXZlIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGNvbnRhaW5pbmcgdGhlIHRyZWUKK3N0cnVjdHVyZSBmb3IgdGhlIG5hbWVkIHRyZWUuICBJZiA8cHJlZml4PiBpcyBzcGVjaWZpZWQgaXQgaXMKK3ByZXBlbmRlZCB0byB0aGUgZmlsZW5hbWVzIGluIHRoZSBhcmNoaXZlLgorCisnZ2l0LWFyY2hpdmUnIGJlaGF2ZXMgZGlmZmVyZW50bHkgd2hlbiBnaXZlbiBhIHRyZWUgSUQgdmVyc3VzIHdoZW4KK2dpdmVuIGEgY29tbWl0IElEIG9yIHRhZyBJRC4gIEluIHRoZSBmaXJzdCBjYXNlIHRoZSBjdXJyZW50IHRpbWUgaXMKK3VzZWQgYXMgbW9kaWZpY2F0aW9uIHRpbWUgb2YgZWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlLiAgSW4gdGhlIGxhdHRlcgorY2FzZSB0aGUgY29tbWl0IHRpbWUgYXMgcmVjb3JkZWQgaW4gdGhlIHJlZmVyZW5jZWQgY29tbWl0IG9iamVjdCBpcwordXNlZCBpbnN0ZWFkLiAgQWRkaXRpb25hbGx5IHRoZSBjb21taXQgSUQgaXMgc3RvcmVkIGluIGEgZ2xvYmFsCitleHRlbmRlZCBwYXggaGVhZGVyIGlmIHRoZSB0YXIgZm9ybWF0IGlzIHVzZWQ7IGl0IGNhbiBiZSBleHRyYWN0ZWQKK3VzaW5nICdnaXQtZ2V0LXRhci1jb21taXQtaWQnLiBJbiBaSVAgZmlsZXMgaXQgaXMgc3RvcmVkIGFzIGEgZmlsZQorY29tbWVudC4KKworT1BUSU9OUworLS0tLS0tLQorCistLWZvcm1hdD08Zm10Pjo6CisJRm9ybWF0IG9mIHRoZSByZXN1bHRpbmcgYXJjaGl2ZTogJ3RhcicsICd6aXAnLi4uICBUaGUgZGVmYXVsdAorCWlzICd0YXInLgorCistLWxpc3QsIC1sOjoKKwlTaG93IGFsbCBhdmFpbGFibGUgZm9ybWF0cy4KKworLS12ZXJib3NlLCAtdjo6CisJUmVwb3J0IHByb2dyZXNzIHRvIHN0ZGVyci4KKworLS1wcmVmaXg9PHByZWZpeD4vOjoKKwlQcmVwZW5kIDxwcmVmaXg+LyB0byBlYWNoIGZpbGVuYW1lIGluIHRoZSBhcmNoaXZlLgorCis8ZXh0cmE+OjoKKwlUaGlzIGNhbiBiZSBhbnkgb3B0aW9ucyB0aGF0IHRoZSBhcmNoaXZlciBiYWNrZW5kIHVuZGVyc3RhbmQuCisJU2VlIG5leHQgc2VjdGlvbi4KKworLS1yZW1vdGU9PHJlcG8+OjoKKwlJbnN0ZWFkIG9mIG1ha2luZyBhIHRhciBhcmNoaXZlIGZyb20gbG9jYWwgcmVwb3NpdG9yeSwKKwlyZXRyaWV2ZSBhIHRhciBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworPHRyZWUtaXNoPjo6CisJVGhlIHRyZWUgb3IgY29tbWl0IHRvIHByb2R1Y2UgYW4gYXJjaGl2ZSBmb3IuCisKK3BhdGg6OgorCUlmIG9uZSBvciBtb3JlIHBhdGhzIGFyZSBzcGVjaWZpZWQsIGluY2x1ZGUgb25seSB0aGVzZSBpbiB0aGUKKwlhcmNoaXZlLCBvdGhlcndpc2UgaW5jbHVkZSBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgorCitCQUNLRU5EIEVYVFJBIE9QVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit6aXAKK35+fgorLTA6OgorCVN0b3JlIHRoZSBmaWxlcyBpbnN0ZWFkIG9mIGRlZmxhdGluZyB0aGVtLgorLTk6OgorCUhpZ2hlc3QgYW5kIHNsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwuICBZb3UgY2FuIHNwZWNpZnkgYW55CisJbnVtYmVyIGZyb20gMSB0byA5IHRvIGFkanVzdCBjb21wcmVzc2lvbiBzcGVlZCBhbmQgcmF0aW8uCisKKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorQnkgZGVmYXVsdCwgZmlsZSBhbmQgZGlyZWN0b3JpZXMgbW9kZXMgYXJlIHNldCB0byAwNjY2IG9yIDA3NzcgaW4gdGFyCithcmNoaXZlcy4gIEl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGlzIGJ5IHNldHRpbmcgdGhlICJ1bWFzayIgdmFyaWFibGUKK2luIHRoZSByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gYXMgZm9sbG93cyA6CisKK1t0YXJdCisgICAgICAgIHVtYXNrID0gMDAyCTsjIGdyb3VwIGZyaWVuZGx5CisKK1RoZSBzcGVjaWFsIHVtYXNrIHZhbHVlICJ1c2VyIiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcidzIGN1cnJlbnQgdW1hc2sKK3dpbGwgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgZGVmYXVsdCB2YWx1ZSByZW1haW5zIDAsIHdoaWNoIG1lYW5zIHdvcmxkCityZWFkYWJsZS93cml0YWJsZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisKK0VYQU1QTEVTCistLS0tLS0tLQorZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PWp1bmsvIEhFQUQgfCAoY2QgL3Zhci90bXAvICYmIHRhciB4ZiAtKTo6CisKKwlDcmVhdGUgYSB0YXIgYXJjaGl2ZSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUKKwlsYXRlc3QgY29tbWl0IG9uIHRoZSBjdXJyZW50IGJyYW5jaCwgYW5kIGV4dHJhY3RzIGl0IGluCisJYC92YXIvdG1wL2p1bmtgIGRpcmVjdG9yeS4KKworZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PWdpdC0xLjQuMC8gdjEuNC4wIHwgZ3ppcCA+Z2l0LTEuNC4wLnRhci5nejo6CisKKwlDcmVhdGUgYSBjb21wcmVzc2VkIHRhcmJhbGwgZm9yIHYxLjQuMCByZWxlYXNlLgorCitnaXQgYXJjaGl2ZSAtLWZvcm1hdD10YXIgLS1wcmVmaXg9Z2l0LTEuNC4wLyB2MS40LjB7Y2FyZXR9XHt0cmVlXH0gfCBnemlwID5naXQtMS40LjAudGFyLmd6OjoKKworCUNyZWF0ZSBhIGNvbXByZXNzZWQgdGFyYmFsbCBmb3IgdjEuNC4wIHJlbGVhc2UsIGJ1dCB3aXRob3V0IGEKKwlnbG9iYWwgZXh0ZW5kZWQgcGF4IGhlYWRlci4KKworZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9emlwIC0tcHJlZml4PWdpdC1kb2NzLyBIRUFEOkRvY3VtZW50YXRpb24vID4gZ2l0LTEuNC4wLWRvY3MuemlwOjoKKworCVB1dCBldmVyeXRoaW5nIGluIHRoZSBjdXJyZW50IGhlYWQncyBEb2N1bWVudGF0aW9uLyBkaXJlY3RvcnkKKwlpbnRvICdnaXQtMS40LjAtZG9jcy56aXAnLCB3aXRoIHRoZSBwcmVmaXggJ2dpdC1kb2NzLycuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEZyYW5jayBCdWktSHV1IGFuZCBSZW5lIFNjaGFyZmUuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJpc2VjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjhlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0CkBAIC0wLDAgKzEsMjAzIEBACitnaXQtYmlzZWN0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1iaXNlY3QgLSBGaW5kIHRoZSBjaGFuZ2UgdGhhdCBpbnRyb2R1Y2VkIGEgYnVnIGJ5IGJpbmFyeSBzZWFyY2gKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQgYmlzZWN0JyA8c3ViY29tbWFuZD4gPG9wdGlvbnM+IAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjb21tYW5kIHRha2VzIHZhcmlvdXMgc3ViY29tbWFuZHMsIGFuZCBkaWZmZXJlbnQgb3B0aW9ucyBkZXBlbmRpbmcKK29uIHRoZSBzdWJjb21tYW5kOgorCisgZ2l0IGJpc2VjdCBzdGFydCBbPGJhZD4gWzxnb29kPi4uLl1dIFstLV0gWzxwYXRocz4uLi5dCisgZ2l0IGJpc2VjdCBiYWQgPHJldj4KKyBnaXQgYmlzZWN0IGdvb2QgPHJldj4KKyBnaXQgYmlzZWN0IHJlc2V0IFs8YnJhbmNoPl0KKyBnaXQgYmlzZWN0IHZpc3VhbGl6ZQorIGdpdCBiaXNlY3QgcmVwbGF5IDxsb2dmaWxlPgorIGdpdCBiaXNlY3QgbG9nCisgZ2l0IGJpc2VjdCBydW4gPGNtZD4uLi4KKworVGhpcyBjb21tYW5kIHVzZXMgJ2dpdC1yZXYtbGlzdCAtLWJpc2VjdCcgb3B0aW9uIHRvIGhlbHAgZHJpdmUgdGhlCitiaW5hcnkgc2VhcmNoIHByb2Nlc3MgdG8gZmluZCB3aGljaCBjaGFuZ2UgaW50cm9kdWNlZCBhIGJ1ZywgZ2l2ZW4gYW4KK29sZCAiZ29vZCIgY29tbWl0IG9iamVjdCBuYW1lIGFuZCBhIGxhdGVyICJiYWQiIGNvbW1pdCBvYmplY3QgbmFtZS4KKworQmFzaWMgYmlzZWN0IGNvbW1hbmRzOiBzdGFydCwgYmFkLCBnb29kCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHdheSB5b3UgdXNlIGl0IGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydAorJCBnaXQgYmlzZWN0IGJhZCAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZlcnNpb24gaXMgYmFkCiskIGdpdCBiaXNlY3QgZ29vZCB2Mi42LjEzLXJjMiAgICAjIHYyLjYuMTMtcmMyIHdhcyB0aGUgbGFzdCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3RlZCB0aGF0IHdhcyBnb29kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB5b3UgZ2l2ZSBhdCBsZWFzdCBvbmUgYmFkIGFuZCBvbmUgZ29vZCB2ZXJzaW9ucywgaXQgd2lsbCBiaXNlY3QKK3RoZSByZXZpc2lvbiB0cmVlIGFuZCBzYXkgc29tZXRoaW5nIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmlzZWN0aW5nOiA2NzUgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGNoZWNrIG91dCB0aGUgc3RhdGUgaW4gdGhlIG1pZGRsZS4gTm93LCBjb21waWxlIHRoYXQga2VybmVsLCBhbmQKK2Jvb3QgaXQuIE5vdywgbGV0J3Mgc2F5IHRoYXQgdGhpcyBib290ZWQga2VybmVsIHdvcmtzIGZpbmUsIHRoZW4ganVzdAorZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgZ29vZAkJCSMgdGhpcyBvbmUgaXMgZ29vZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgbm93IHNheQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Jpc2VjdGluZzogMzM3IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3UgY29udGludWUgYWxvbmcsIGNvbXBpbGluZyB0aGF0IG9uZSwgdGVzdGluZyBpdCwgYW5kIGRlcGVuZGluZworb24gd2hldGhlciBpdCBpcyBnb29kIG9yIGJhZCwgeW91IHNheSAiZ2l0IGJpc2VjdCBnb29kIiBvciAiZ2l0IGJpc2VjdAorYmFkIiwgYW5kIGFzayBmb3IgdGhlIG5leHQgYmlzZWN0aW9uLgorCitVbnRpbCB5b3UgaGF2ZSBubyBtb3JlIGxlZnQsIGFuZCB5b3UnbGwgaGF2ZSBiZWVuIGxlZnQgd2l0aCB0aGUgZmlyc3QKK2JhZCBrZXJuZWwgcmV2IGluICJyZWZzL2Jpc2VjdC9iYWQiLgorCitCaXNlY3QgcmVzZXQKK35+fn5+fn5+fn5+fgorCitPaCwgYW5kIHRoZW4gYWZ0ZXIgeW91IHdhbnQgdG8gcmVzZXQgdG8gdGhlIG9yaWdpbmFsIGhlYWQsIGRvIGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVzZXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBnZXQgYmFjayB0byB0aGUgbWFzdGVyIGJyYW5jaCwgaW5zdGVhZCBvZiBiZWluZyBpbiBvbmUgb2YgdGhlCitiaXNlY3Rpb24gYnJhbmNoZXMgKCJnaXQgYmlzZWN0IHN0YXJ0IiB3aWxsIGRvIHRoYXQgZm9yIHlvdSB0b28sCithY3R1YWxseTogaXQgd2lsbCByZXNldCB0aGUgYmlzZWN0aW9uIHN0YXRlLCBhbmQgYmVmb3JlIGl0IGRvZXMgdGhhdAoraXQgY2hlY2tzIHRoYXQgeW91J3JlIG5vdCB1c2luZyBzb21lIG9sZCBiaXNlY3Rpb24gYnJhbmNoKS4KKworQmlzZWN0IHZpc3VhbGl6ZQorfn5+fn5+fn5+fn5+fn5+fgorCitEdXJpbmcgdGhlIGJpc2VjdGlvbiBwcm9jZXNzLCB5b3UgY2FuIHNheQorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCB2aXN1YWxpemUKKy0tLS0tLS0tLS0tLQorCit0byBzZWUgdGhlIGN1cnJlbnRseSByZW1haW5pbmcgc3VzcGVjdHMgaW4gYGdpdGtgLgorCitCaXNlY3QgbG9nIGFuZCBiaXNlY3QgcmVwbGF5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBnb29kL2JhZCBpbnB1dCBpcyBsb2dnZWQsIGFuZAorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBsb2cKKy0tLS0tLS0tLS0tLQorCitzaG93cyB3aGF0IHlvdSBoYXZlIGRvbmUgc28gZmFyLiBZb3UgY2FuIHRydW5jYXRlIGl0cyBvdXRwdXQgc29tZXdoZXJlCithbmQgc2F2ZSBpdCBpbiBhIGZpbGUsIGFuZCBydW4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVwbGF5IHRoYXQtZmlsZQorLS0tLS0tLS0tLS0tCisKK2lmIHlvdSBmaW5kIGxhdGVyIHlvdSBtYWRlIGEgbWlzdGFrZSB0ZWxsaW5nIGdvb2QvYmFkIGFib3V0IGEKK3JldmlzaW9uLgorCitBdm9pZGluZyB0byB0ZXN0IGEgY29tbWl0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIGluIGEgbWlkZGxlIG9mIGJpc2VjdCBzZXNzaW9uLCB5b3Uga25vdyB3aGF0IHRoZSBiaXNlY3Qgc3VnZ2VzdGVkCit0byB0cnkgbmV4dCBpcyBub3QgYSBnb29kIG9uZSB0byB0ZXN0IChlLmcuIHRoZSBjaGFuZ2UgdGhlIGNvbW1pdAoraW50cm9kdWNlcyBpcyBrbm93biBub3QgdG8gd29yayBpbiB5b3VyIGVudmlyb25tZW50IGFuZCB5b3Uga25vdyBpdAorZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBidWcgeW91IGFyZSBjaGFzaW5nKSwgeW91IG1heQord2FudCB0byBmaW5kIGEgbmVhci1ieSBjb21taXQgYW5kIHRyeSB0aGF0IGluc3RlYWQuCisKK0l0IGdvZXMgc29tZXRoaW5nIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgZ29vZC9iYWQJCQkjIHByZXZpb3VzIHJvdW5kIHdhcyBnb29kL2JhZC4KK0Jpc2VjdGluZzogMzM3IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworJCBnaXQgYmlzZWN0IHZpc3VhbGl6ZQkJCSMgb29wcywgdGhhdCBpcyB1bmludGVyZXN0aW5nLgorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MwkJIyB0cnkgMyByZXZzIGJlZm9yZSB3aGF0CisJCQkJCSMgd2FzIHN1Z2dlc3RlZAorLS0tLS0tLS0tLS0tCisKK1RoZW4gY29tcGlsZSBhbmQgdGVzdCB0aGUgb25lIHlvdSBjaG9zZSB0byB0cnkuIEFmdGVyIHRoYXQsIHRlbGwKK2Jpc2VjdCB3aGF0IHRoZSByZXN1bHQgd2FzIGFzIHVzdWFsLgorCitDdXR0aW5nIGRvd24gYmlzZWN0aW9uIGJ5IGdpdmluZyBtb3JlIHBhcmFtZXRlcnMgdG8gYmlzZWN0IHN0YXJ0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSBjYW4gZnVydGhlciBjdXQgZG93biB0aGUgbnVtYmVyIG9mIHRyaWFscyBpZiB5b3Uga25vdyB3aGF0IHBhcnQgb2YKK3RoZSB0cmVlIGlzIGludm9sdmVkIGluIHRoZSBwcm9ibGVtIHlvdSBhcmUgdHJhY2tpbmcgZG93biwgYnkgZ2l2aW5nCitwYXRocyBwYXJhbWV0ZXJzIHdoZW4geW91IHNheSBgYmlzZWN0IHN0YXJ0YCwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydCAtLSBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NgorLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBrbm93IGJlZm9yZWhhbmQgbW9yZSB0aGFuIG9uZSBnb29kIGNvbW1pdHMsIHlvdSBjYW4gbmFycm93IHRoZQorYmlzZWN0IHNwYWNlIGRvd24gd2l0aG91dCBkb2luZyB0aGUgd2hvbGUgdHJlZSBjaGVja291dCBldmVyeSB0aW1lIHlvdQorZ2l2ZSBnb29kIGNvbW1pdHMuIFlvdSBnaXZlIHRoZSBiYWQgcmV2aXNpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgYHN0YXJ0YAorYW5kIHRoZW4geW91IGdpdmUgYWxsIHRoZSBnb29kIHJldmlzaW9ucyB5b3UgaGF2ZToKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3Qgc3RhcnQgdjIuNi4yMC1yYzYgdjIuNi4yMC1yYzQgdjIuNi4yMC1yYzEgLS0KKyAgICAgICAgICAgICAgICAgICAjIHYyLjYuMjAtcmM2IGlzIGJhZAorICAgICAgICAgICAgICAgICAgICMgdjIuNi4yMC1yYzQgYW5kIHYyLjYuMjAtcmMxIGFyZSBnb29kCistLS0tLS0tLS0tLS0KKworQmlzZWN0IHJ1bgorfn5+fn5+fn5+fgorCitJZiB5b3UgaGF2ZSBhIHNjcmlwdCB0aGF0IGNhbiB0ZWxsIGlmIHRoZSBjdXJyZW50IHNvdXJjZSBjb2RlIGlzIGdvb2QKK29yIGJhZCwgeW91IGNhbiBhdXRvbWF0aWNhbGx5IGJpc2VjdCB1c2luZzoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcnVuIG15X3NjcmlwdAorLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB0aGUgInJ1biIgc2NyaXB0IChgbXlfc2NyaXB0YCBpbiB0aGUgYWJvdmUgZXhhbXBsZSkgc2hvdWxkCitleGl0IHdpdGggY29kZSAwIGluIGNhc2UgdGhlIGN1cnJlbnQgc291cmNlIGNvZGUgaXMgZ29vZCBhbmQgd2l0aCBhCitjb2RlIGJldHdlZW4gMSBhbmQgMTI3IChpbmNsdWRlZCkgaW4gY2FzZSB0aGUgY3VycmVudCBzb3VyY2UgY29kZSBpcworYmFkLgorCitBbnkgb3RoZXIgZXhpdCBjb2RlIHdpbGwgYWJvcnQgdGhlIGF1dG9tYXRpYyBiaXNlY3QgcHJvY2Vzcy4gKEEKK3Byb2dyYW0gdGhhdCBkb2VzICJleGl0KC0xKSIgbGVhdmVzICQ/ID0gMjU1LCBzZWUgZXhpdCgzKSBtYW51YWwgcGFnZSwKK3RoZSB2YWx1ZSBpcyBjaG9wcGVkIHdpdGggIiYgMDM3NyIuKQorCitZb3UgbWF5IG9mdGVuIGZpbmQgdGhhdCBkdXJpbmcgYmlzZWN0IHlvdSB3YW50IHRvIGhhdmUgbmVhci1jb25zdGFudAordHdlYWtzIChlLmcuLCBzLyNkZWZpbmUgREVCVUcgMC8jZGVmaW5lIERFQlVHIDEvIGluIGEgaGVhZGVyIGZpbGUsIG9yCisicmV2aXNpb24gdGhhdCBkb2VzIG5vdCBoYXZlIHRoaXMgY29tbWl0IG5lZWRzIHRoaXMgcGF0Y2ggYXBwbGllZCB0bword29yayBhcm91bmQgb3RoZXIgcHJvYmxlbSB0aGlzIGJpc2VjdGlvbiBpcyBub3QgaW50ZXJlc3RlZCBpbiIpCithcHBsaWVkIHRvIHRoZSByZXZpc2lvbiBiZWluZyB0ZXN0ZWQuCisKK1RvIGNvcGUgd2l0aCBzdWNoIGEgc2l0dWF0aW9uLCBhZnRlciB0aGUgaW5uZXIgZ2l0LWJpc2VjdCBmaW5kcyB0aGUKK25leHQgcmV2aXNpb24gdG8gdGVzdCwgd2l0aCB0aGUgInJ1biIgc2NyaXB0LCB5b3UgY2FuIGFwcGx5IHRoYXQgdHdlYWsKK2JlZm9yZSBjb21waWxpbmcsIHJ1biB0aGUgcmVhbCB0ZXN0LCBhbmQgYWZ0ZXIgdGhlIHRlc3QgZGVjaWRlcyBpZiB0aGUKK3JldmlzaW9uIChwb3NzaWJseSB3aXRoIHRoZSBuZWVkZWQgdHdlYWtzKSBwYXNzZWQgdGhlIHRlc3QsIHJld2luZCB0aGUKK3RyZWUgdG8gdGhlIHByaXN0aW5lIHN0YXRlLiAgRmluYWxseSB0aGUgInJ1biIgc2NyaXB0IGNhbiBleGl0IHdpdGgKK3RoZSBzdGF0dXMgb2YgdGhlIHJlYWwgdGVzdCB0byBsZXQgImdpdCBiaXNlY3QgcnVuIiBjb21tYW5kIGxvb3AgdG8KK2tub3cgdGhlIG91dGNvbWUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJsYW1lLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWJsYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDY3OGIwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYmxhbWUudHh0CkBAIC0wLDAgKzEsMTkwIEBACitnaXQtYmxhbWUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYmxhbWUgLSBTaG93IHdoYXQgcmV2aXNpb24gYW5kIGF1dGhvciBsYXN0IG1vZGlmaWVkIGVhY2ggbGluZSBvZiBhIGZpbGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJsYW1lJyBbLWNdIFstYl0gWy0tcm9vdF0gWy1zXSBbLWxdIFstdF0gWy1mXSBbLW5dIFstcF0gWy0taW5jcmVtZW50YWxdIFstTCBuLG1dCisgICAgICAgICAgICBbLVMgPHJldnMtZmlsZT5dIFstTV0gWy1DXSBbLUNdIFstLXNpbmNlPTxkYXRlPl0KKyAgICAgICAgICAgIFs8cmV2PiB8IC0tY29udGVudHMgPGZpbGU+XSBbLS1dIDxmaWxlPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworQW5ub3RhdGVzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZmlsZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIHJldmlzaW9uIHdoaWNoCitsYXN0IG1vZGlmaWVkIHRoZSBsaW5lLiBPcHRpb25hbGx5LCBzdGFydCBhbm5vdGF0aW5nIGZyb20gdGhlIGdpdmVuIHJldmlzaW9uLgorCitBbHNvIGl0IGNhbiBsaW1pdCB0aGUgcmFuZ2Ugb2YgbGluZXMgYW5ub3RhdGVkLgorCitUaGlzIHJlcG9ydCBkb2Vzbid0IHRlbGwgeW91IGFueXRoaW5nIGFib3V0IGxpbmVzIHdoaWNoIGhhdmUgYmVlbiBkZWxldGVkIG9yCityZXBsYWNlZDsgeW91IG5lZWQgdG8gdXNlIGEgdG9vbCBzdWNoIGFzIGdpdGxpbms6Z2l0LWRpZmZbMV0gb3IgdGhlICJwaWNrYXhlIgoraW50ZXJmYWNlIGJyaWVmbHkgbWVudGlvbmVkIGluIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoLgorCitBcGFydCBmcm9tIHN1cHBvcnRpbmcgZmlsZSBhbm5vdGF0aW9uLCBnaXQgYWxzbyBzdXBwb3J0cyBzZWFyY2hpbmcgdGhlCitkZXZlbG9wbWVudCBoaXN0b3J5IGZvciB3aGVuIGEgY29kZSBzbmlwcGV0IG9jY3VycmVkIGluIGEgY2hhbmdlLiBUaGlzIG1ha2VzIGl0Citwb3NzaWJsZSB0byB0cmFjayB3aGVuIGEgY29kZSBzbmlwcGV0IHdhcyBhZGRlZCB0byBhIGZpbGUsIG1vdmVkIG9yIGNvcGllZAorYmV0d2VlbiBmaWxlcywgYW5kIGV2ZW50dWFsbHkgZGVsZXRlZCBvciByZXBsYWNlZC4gSXQgd29ya3MgYnkgc2VhcmNoaW5nIGZvcgorYSB0ZXh0IHN0cmluZyBpbiB0aGUgZGlmZi4gQSBzbWFsbCBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgLVMnYmxhbWVfdXNhZ2UnCis1MDQwZjE3ZWJhMTU1MDRiYWQ2NmIxNGE2NDViZGRkOWIwMTVlYmI3IGJsYW1lIC1TIDxhbmNlc3RyeS1maWxlPgorZWE0YzdmOWJmNjllNzgxZGQwY2Q4OGQyYmNjYjJiZjVjYzE1YzlhNyBnaXQtYmxhbWU6IE1ha2UgdGhlIG91dHB1dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6YmxhbWUtb3B0aW9ucy50eHRbXQorCistYzo6CisJVXNlIHRoZSBzYW1lIG91dHB1dCBtb2RlIGFzIGdpdGxpbms6Z2l0LWFubm90YXRlWzFdIChEZWZhdWx0OiBvZmYpLgorCistLXNjb3JlLWRlYnVnOjoKKwlJbmNsdWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBtb3ZlbWVudCBvZgorCWxpbmVzIGJldHdlZW4gZmlsZXMgKHNlZSBgLUNgKSBhbmQgbGluZXMgbW92ZWQgd2l0aGluIGEKKwlmaWxlIChzZWUgYC1NYCkuICBUaGUgZmlyc3QgbnVtYmVyIGxpc3RlZCBpcyB0aGUgc2NvcmUuCisJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGRldGVjdGVkCisJdG8gYmUgbW92ZWQgYmV0d2VlbiBvciB3aXRoaW4gZmlsZXMuICBUaGlzIG11c3QgYmUgYWJvdmUKKwlhIGNlcnRhaW4gdGhyZXNob2xkIGZvciBnaXQtYmxhbWUgdG8gY29uc2lkZXIgdGhvc2UgbGluZXMKKwlvZiBjb2RlIHRvIGhhdmUgYmVlbiBtb3ZlZC4KKworLWYsIC0tc2hvdy1uYW1lOjoKKwlTaG93IGZpbGVuYW1lIGluIHRoZSBvcmlnaW5hbCBjb21taXQuICBCeSBkZWZhdWx0CisJZmlsZW5hbWUgaXMgc2hvd24gaWYgdGhlcmUgaXMgYW55IGxpbmUgdGhhdCBjYW1lIGZyb20gYQorCWZpbGUgd2l0aCBkaWZmZXJlbnQgbmFtZSwgZHVlIHRvIHJlbmFtZSBkZXRlY3Rpb24uCisKKy1uLCAtLXNob3ctbnVtYmVyOjoKKwlTaG93IGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBjb21taXQgKERlZmF1bHQ6IG9mZikuCisKKy1zOjoKKwlTdXBwcmVzcyBhdXRob3IgbmFtZSBhbmQgdGltZXN0YW1wIGZyb20gdGhlIG91dHB1dC4KKworVEhFIFBPUkNFTEFJTiBGT1JNQVQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoaXMgZm9ybWF0LCBlYWNoIGxpbmUgaXMgb3V0cHV0IGFmdGVyIGEgaGVhZGVyOyB0aGUKK2hlYWRlciBhdCB0aGUgbWluaW11bSBoYXMgdGhlIGZpcnN0IGxpbmUgd2hpY2ggaGFzOgorCistIDQwLWJ5dGUgU0hBLTEgb2YgdGhlIGNvbW1pdCB0aGUgbGluZSBpcyBhdHRyaWJ1dGVkIHRvOworLSB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGxpbmUgaW4gdGhlIG9yaWdpbmFsIGZpbGU7CistIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgbGluZSBpbiB0aGUgZmluYWwgZmlsZTsKKy0gb24gYSBsaW5lIHRoYXQgc3RhcnRzIGEgZ3JvdXAgb2YgbGluZSBmcm9tIGEgZGlmZmVyZW50CisgIGNvbW1pdCB0aGFuIHRoZSBwcmV2aW91cyBvbmUsIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcworICBncm91cC4gIE9uIHN1YnNlcXVlbnQgbGluZXMgdGhpcyBmaWVsZCBpcyBhYnNlbnQuCisKK1RoaXMgaGVhZGVyIGxpbmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbgorYXQgbGVhc3Qgb25jZSBmb3IgZWFjaCBjb21taXQ6CisKKy0gYXV0aG9yIG5hbWUgKCJhdXRob3IiKSwgZW1haWwgKCJhdXRob3ItbWFpbCIpLCB0aW1lCisgICgiYXV0aG9yLXRpbWUiKSwgYW5kIHRpbWV6b25lICgiYXV0aG9yLXR6Iik7IHNpbWlsYXJseQorICBmb3IgY29tbWl0dGVyLgorLSBmaWxlbmFtZSBpbiB0aGUgY29tbWl0IHRoZSBsaW5lIGlzIGF0dHJpYnV0ZWQgdG8uCistIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgKCJzdW1tYXJ5IikuCisKK1RoZSBjb250ZW50cyBvZiB0aGUgYWN0dWFsIGxpbmUgaXMgb3V0cHV0IGFmdGVyIHRoZSBhYm92ZQoraGVhZGVyLCBwcmVmaXhlZCBieSBhIFRBQi4gVGhpcyBpcyB0byBhbGxvdyBhZGRpbmcgbW9yZQoraGVhZGVyIGVsZW1lbnRzIGxhdGVyLgorCisKK1NQRUNJRllJTkcgUkFOR0VTCistLS0tLS0tLS0tLS0tLS0tLQorCitVbmxpa2UgYGdpdC1ibGFtZWAgYW5kIGBnaXQtYW5ub3RhdGVgIGluIG9sZGVyIGdpdCwgdGhlIGV4dGVudAorb2YgYW5ub3RhdGlvbiBjYW4gYmUgbGltaXRlZCB0byBib3RoIGxpbmUgcmFuZ2VzIGFuZCByZXZpc2lvbgorcmFuZ2VzLiAgV2hlbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgb3JpZ2luIGZvcgorbGwuIDQwLTYwIGZvciBmaWxlIGBmb29gLCB5b3UgY2FuIHVzZSBgLUxgIG9wdGlvbiBsaWtlIHRoZXNlCisodGhleSBtZWFuIHRoZSBzYW1lIHRoaW5nIC0tIGJvdGggYXNrIGZvciAyMSBsaW5lcyBzdGFydGluZyBhdAorbGluZSA0MCk6CisKKwlnaXQgYmxhbWUgLUwgNDAsNjAgZm9vCisJZ2l0IGJsYW1lIC1MIDQwLCsyMSBmb28KKworQWxzbyB5b3UgY2FuIHVzZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc3BlY2lmeSB0aGUgbGluZSByYW5nZS4KKworCWdpdCBibGFtZSAtTCAnL15zdWIgaGVsbG8gey8sL159JC8nIGZvbworCit3b3VsZCBsaW1pdCB0aGUgYW5ub3RhdGlvbiB0byB0aGUgYm9keSBvZiBgaGVsbG9gIHN1YnJvdXRpbmUuCisKK1doZW4geW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBjaGFuZ2VzIG9sZGVyIHRoYW4gdGhlIHZlcnNpb24KK3YyLjYuMTgsIG9yIGNoYW5nZXMgb2xkZXIgdGhhbiAzIHdlZWtzLCB5b3UgY2FuIHVzZSByZXZpc2lvbgorcmFuZ2Ugc3BlY2lmaWVycyAgc2ltaWxhciB0byBgZ2l0LXJldi1saXN0YDoKKworCWdpdCBibGFtZSB2Mi42LjE4Li4gLS0gZm9vCisJZ2l0IGJsYW1lIC0tc2luY2U9My53ZWVrcyAtLSBmb28KKworV2hlbiByZXZpc2lvbiByYW5nZSBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIGxpbWl0IHRoZSBhbm5vdGF0aW9uLAorbGluZXMgdGhhdCBoYXZlIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSByYW5nZSBib3VuZGFyeSAoZWl0aGVyIHRoZQorY29tbWl0IHYyLjYuMTggb3IgdGhlIG1vc3QgcmVjZW50IGNvbW1pdCB0aGF0IGlzIG1vcmUgdGhhbiAzCit3ZWVrcyBvbGQgaW4gdGhlIGFib3ZlIGV4YW1wbGUpIGFyZSBibGFtZWQgZm9yIHRoYXQgcmFuZ2UKK2JvdW5kYXJ5IGNvbW1pdC4KKworQSBwYXJ0aWN1bGFybHkgdXNlZnVsIHdheSBpcyB0byBzZWUgaWYgYW4gYWRkZWQgZmlsZSBoYXZlIGxpbmVzCitjcmVhdGVkIGJ5IGNvcHktYW5kLXBhc3RlIGZyb20gZXhpc3RpbmcgZmlsZXMuICBTb21ldGltZXMgdGhpcworaW5kaWNhdGVzIHRoYXQgdGhlIGRldmVsb3BlciB3YXMgYmVpbmcgc2xvcHB5IGFuZCBkaWQgbm90CityZWZhY3RvciB0aGUgY29kZSBwcm9wZXJseS4gIFlvdSBjYW4gZmlyc3QgZmluZCB0aGUgY29tbWl0IHRoYXQKK2ludHJvZHVjZWQgdGhlIGZpbGUgd2l0aDoKKworCWdpdCBsb2cgLS1kaWZmLWZpbHRlcj1BIC0tcHJldHR5PXNob3J0IC0tIGZvbworCithbmQgdGhlbiBhbm5vdGF0ZSB0aGUgY2hhbmdlIGJldHdlZW4gdGhlIGNvbW1pdCBhbmQgaXRzCitwYXJlbnRzLCB1c2luZyBgY29tbWl0e2NhcmV0fSFgIG5vdGF0aW9uOgorCisJZ2l0IGJsYW1lIC1DIC1DIC1mICRjb21taXReISAtLSBmb28KKworCitJTkNSRU1FTlRBTCBPVVRQVVQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGNhbGxlZCB3aXRoIGAtLWluY3JlbWVudGFsYCBvcHRpb24sIHRoZSBjb21tYW5kIG91dHB1dHMgdGhlCityZXN1bHQgYXMgaXQgaXMgYnVpbHQuICBUaGUgb3V0cHV0IGdlbmVyYWxseSB3aWxsIHRhbGsgYWJvdXQKK2xpbmVzIHRvdWNoZWQgYnkgbW9yZSByZWNlbnQgY29tbWl0cyBmaXJzdCAoaS5lLiB0aGUgbGluZXMgd2lsbAorYmUgYW5ub3RhdGVkIG91dCBvZiBvcmRlcikgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkKK2ludGVyYWN0aXZlIHZpZXdlcnMuCisKK1RoZSBvdXRwdXQgZm9ybWF0IGlzIHNpbWlsYXIgdG8gdGhlIFBvcmNlbGFpbiBmb3JtYXQsIGJ1dCBpdAorZG9lcyBub3QgY29udGFpbiB0aGUgYWN0dWFsIGxpbmVzIGZyb20gdGhlIGZpbGUgdGhhdCBpcyBiZWluZworYW5ub3RhdGVkLgorCisuIEVhY2ggYmxhbWUgZW50cnkgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGluZSBvZjoKKworCTw0MC1ieXRlIGhleCBzaGExPiA8c291cmNlbGluZT4gPHJlc3VsdGxpbmU+IDxudW1fbGluZXM+CisrCitMaW5lIG51bWJlcnMgY291bnQgZnJvbSAxLgorCisuIFRoZSBmaXJzdCB0aW1lIHRoYXQgY29tbWl0IHNob3dzIHVwIGluIHRoZSBzdHJlYW0sIGl0IGhhcyB2YXJpb3VzCisgIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IGl0IHByaW50ZWQgb3V0IHdpdGggYSBvbmUtd29yZCB0YWcgYXQgdGhlCisgIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgYWJvdXQgdGhhdCAiZXh0ZW5kZWQgY29tbWl0IGluZm8iIChhdXRob3IsCisgIGVtYWlsLCBjb21taXR0ZXIsIGRhdGVzLCBzdW1tYXJ5IGV0YykuCisKKy4gVW5saWtlIFBvcmNlbGFpbiBmb3JtYXQsIHRoZSBmaWxlbmFtZSBpbmZvcm1hdGlvbiBpcyBhbHdheXMKKyAgZ2l2ZW4gYW5kIHRlcm1pbmF0ZXMgdGhlIGVudHJ5OgorCisJImZpbGVuYW1lIiA8d2hpdGVzcGFjZS1xdW90ZWQtZmlsZW5hbWUtZ29lcy1oZXJlPgorKworYW5kIHRodXMgaXQncyByZWFsbHkgcXVpdGUgZWFzeSB0byBwYXJzZSBmb3Igc29tZSBsaW5lLSBhbmQgd29yZC1vcmllbnRlZAorcGFyc2VyICh3aGljaCBzaG91bGQgYmUgcXVpdGUgbmF0dXJhbCBmb3IgbW9zdCBzY3JpcHRpbmcgbGFuZ3VhZ2VzKS4KKysKK1tOT1RFXQorRm9yIHBlb3BsZSB3aG8gZG8gcGFyc2luZzogdG8gbWFrZSBpdCBtb3JlIHJvYnVzdCwganVzdCBpZ25vcmUgYW55CitsaW5lcyBpbiBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBvbmUgKCI8c2hhMT4iIGFuZCAiZmlsZW5hbWUiIGxpbmVzKQord2hlcmUgeW91IGRvbid0IHJlY29nbml6ZSB0aGUgdGFnLXdvcmRzIChvciBjYXJlIGFib3V0IHRoYXQgcGFydGljdWxhcgorb25lKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kZWQgaW5mb3JtYXRpb24iIGxpbmVzLiBUaGF0IHdheSwgaWYKK3RoZXJlIGlzIGV2ZXIgYWRkZWQgaW5mb3JtYXRpb24gKGxpa2UgdGhlIGNvbW1pdCBlbmNvZGluZyBvciBleHRlbmRlZAorY29tbWl0IGNvbW1lbnRhcnkpLCBhIGJsYW1lIHZpZXdlciB3b24ndCBldmVyIGNhcmUuCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1hbm5vdGF0ZVsxXQorCitBVVRIT1IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYnJhbmNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWJyYW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjNTE3MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWJyYW5jaC50eHQKQEAgLTAsMCArMSwxNjEgQEAKK2dpdC1icmFuY2goMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWJyYW5jaCAtIExpc3QsIGNyZWF0ZSwgb3IgZGVsZXRlIGJyYW5jaGVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1icmFuY2gnIFstLWNvbG9yIHwgLS1uby1jb2xvcl0gWy1yIHwgLWFdCisJICAgWy12IFstLWFiYnJldj08bGVuZ3RoPiB8IC0tbm8tYWJicmV2XV0KKydnaXQtYnJhbmNoJyBbLS10cmFjayB8IC0tbm8tdHJhY2tdIFstbF0gWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dCisnZ2l0LWJyYW5jaCcgKC1tIHwgLU0pIFs8b2xkYnJhbmNoPl0gPG5ld2JyYW5jaD4KKydnaXQtYnJhbmNoJyAoLWQgfCAtRCkgWy1yXSA8YnJhbmNobmFtZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitXaXRoIG5vIGFyZ3VtZW50cyBnaXZlbiBhIGxpc3Qgb2YgZXhpc3RpbmcgYnJhbmNoZXMKK3dpbGwgYmUgc2hvd24sIHRoZSBjdXJyZW50IGJyYW5jaCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdpdGggYW4gYXN0ZXJpc2suCitPcHRpb24gYC1yYCBjYXVzZXMgdGhlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyB0byBiZSBsaXN0ZWQsCithbmQgb3B0aW9uIGAtYWAgc2hvd3MgYm90aC4KKworSW4gaXRzIHNlY29uZCBmb3JtLCBhIG5ldyBicmFuY2ggbmFtZWQgPGJyYW5jaG5hbWU+IHdpbGwgYmUgY3JlYXRlZC4KK0l0IHdpbGwgc3RhcnQgb3V0IHdpdGggYSBoZWFkIGVxdWFsIHRvIHRoZSBvbmUgZ2l2ZW4gYXMgPHN0YXJ0LXBvaW50Pi4KK0lmIG5vIDxzdGFydC1wb2ludD4gaXMgZ2l2ZW4sIHRoZSBicmFuY2ggd2lsbCBiZSBjcmVhdGVkIHdpdGggYSBoZWFkCitlcXVhbCB0byB0aGF0IG9mIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBvdXQgYnJhbmNoLgorCitXaGVuIGEgbG9jYWwgYnJhbmNoIGlzIHN0YXJ0ZWQgb2ZmIGEgcmVtb3RlIGJyYW5jaCwgZ2l0IGNhbiBzZXR1cCB0aGUKK2JyYW5jaCBzbyB0aGF0IGdpdGxpbms6Z2l0LXB1bGxbMV0gd2lsbCBhcHByb3ByaWF0ZWx5IG1lcmdlIGZyb20gdGhhdAorcmVtb3RlIGJyYW5jaC4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBpdAordGhlIGRlZmF1bHQgdXNpbmcgdGhlIGdsb2JhbCBgYnJhbmNoLmF1dG9zZXR1cG1lcmdlYCBjb25maWd1cmF0aW9uCitmbGFnLiAgT3RoZXJ3aXNlLCBpdCBjYW4gYmUgY2hvc2VuIHBlci1icmFuY2ggdXNpbmcgdGhlIGAtLXRyYWNrYAorYW5kIGAtLW5vLXRyYWNrYCBvcHRpb25zLgorCitXaXRoIGEgJy1tJyBvciAnLU0nIG9wdGlvbiwgPG9sZGJyYW5jaD4gd2lsbCBiZSByZW5hbWVkIHRvIDxuZXdicmFuY2g+LgorSWYgPG9sZGJyYW5jaD4gaGFkIGEgY29ycmVzcG9uZGluZyByZWZsb2csIGl0IGlzIHJlbmFtZWQgdG8gbWF0Y2gKKzxuZXdicmFuY2g+LCBhbmQgYSByZWZsb2cgZW50cnkgaXMgY3JlYXRlZCB0byByZW1lbWJlciB0aGUgYnJhbmNoCityZW5hbWluZy4gSWYgPG5ld2JyYW5jaD4gZXhpc3RzLCAtTSBtdXN0IGJlIHVzZWQgdG8gZm9yY2UgdGhlIHJlbmFtZQordG8gaGFwcGVuLgorCitXaXRoIGEgYC1kYCBvciBgLURgIG9wdGlvbiwgYDxicmFuY2huYW1lPmAgd2lsbCBiZSBkZWxldGVkLiAgWW91IG1heQorc3BlY2lmeSBtb3JlIHRoYW4gb25lIGJyYW5jaCBmb3IgZGVsZXRpb24uICBJZiB0aGUgYnJhbmNoIGN1cnJlbnRseQoraGFzIGEgcmVmIGxvZyB0aGVuIHRoZSByZWYgbG9nIHdpbGwgYWxzbyBiZSBkZWxldGVkLiBVc2UgLXIgdG9nZXRoZXIgd2l0aCAtZAordG8gZGVsZXRlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcy4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJRGVsZXRlIGEgYnJhbmNoLiBUaGUgYnJhbmNoIG11c3QgYmUgZnVsbHkgbWVyZ2VkLgorCistRDo6CisJRGVsZXRlIGEgYnJhbmNoIGlycmVzcGVjdGl2ZSBvZiBpdHMgaW5kZXggc3RhdHVzLgorCistbDo6CisJQ3JlYXRlIHRoZSBicmFuY2gncyByZWYgbG9nLiAgVGhpcyBhY3RpdmF0ZXMgcmVjb3JkaW5nIG9mCisJYWxsIGNoYW5nZXMgdG8gbWFkZSB0aGUgYnJhbmNoIHJlZiwgZW5hYmxpbmcgdXNlIG9mIGRhdGUKKwliYXNlZCBzaGExIGV4cHJlc3Npb25zIHN1Y2ggYXMgIjxicmFuY2huYW1lPkB7eWVzdGVyZGF5fSIuCisKKy1mOjoKKwlGb3JjZSB0aGUgY3JlYXRpb24gb2YgYSBuZXcgYnJhbmNoIGV2ZW4gaWYgaXQgbWVhbnMgZGVsZXRpbmcKKwlhIGJyYW5jaCB0aGF0IGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUgbmFtZS4KKworLW06OgorCU1vdmUvcmVuYW1lIGEgYnJhbmNoIGFuZCB0aGUgY29ycmVzcG9uZGluZyByZWZsb2cuCisKKy1NOjoKKwlNb3ZlL3JlbmFtZSBhIGJyYW5jaCBldmVuIGlmIHRoZSBuZXcgYnJhbmNobmFtZSBhbHJlYWR5IGV4aXN0cy4KKworLS1jb2xvcjo6CisJQ29sb3IgYnJhbmNoZXMgdG8gaGlnaGxpZ2h0IGN1cnJlbnQsIGxvY2FsLCBhbmQgcmVtb3RlIGJyYW5jaGVzLgorCistLW5vLWNvbG9yOjoKKwlUdXJuIG9mZiBicmFuY2ggY29sb3JzLCBldmVuIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBnaXZlcyB0aGUKKwlkZWZhdWx0IHRvIGNvbG9yIG91dHB1dC4KKworLXI6OgorCUxpc3Qgb3IgZGVsZXRlIChpZiB1c2VkIHdpdGggLWQpIHRoZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMuCisKKy1hOjoKKwlMaXN0IGJvdGggcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIGFuZCBsb2NhbCBicmFuY2hlcy4KKworLXY6OgorCVNob3cgc2hhMSBhbmQgY29tbWl0IHN1YmplY3QgbGluZSBmb3IgZWFjaCBoZWFkLgorCistLWFiYnJldj08bGVuZ3RoPjo6CisJQWx0ZXIgbWluaW11bSBkaXNwbGF5IGxlbmd0aCBmb3Igc2hhMSBpbiBvdXRwdXQgbGlzdGluZywKKwlkZWZhdWx0IHZhbHVlIGlzIDcuCisKKy0tbm8tYWJicmV2OjoKKwlEaXNwbGF5IHRoZSBmdWxsIHNoYTFzIGluIG91dHB1dCBsaXN0aW5nIHJhdGhlciB0aGFuIGFiYnJldmlhdGluZyB0aGVtLgorCis8YnJhbmNobmFtZT46OgorCVRoZSBuYW1lIG9mIHRoZSBicmFuY2ggdG8gY3JlYXRlIG9yIGRlbGV0ZS4KKwlUaGUgbmV3IGJyYW5jaCBuYW1lIG11c3QgcGFzcyBhbGwgY2hlY2tzIGRlZmluZWQgYnkKKwlnaXRsaW5rOmdpdC1jaGVjay1yZWYtZm9ybWF0WzFdLiAgU29tZSBvZiB0aGVzZSBjaGVja3MKKwltYXkgcmVzdHJpY3QgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBhIGJyYW5jaCBuYW1lLgorCis8c3RhcnQtcG9pbnQ+OjoKKwlUaGUgbmV3IGJyYW5jaCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIEhFQUQgZXF1YWwgdG8gdGhpcy4gIEl0IG1heQorCWJlIGdpdmVuIGFzIGEgYnJhbmNoIG5hbWUsIGEgY29tbWl0LWlkLCBvciBhIHRhZy4gIElmIHRoaXMgb3B0aW9uCisJaXMgb21pdHRlZCwgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIGFzc3VtZWQuCisKKzxvbGRicmFuY2g+OjoKKwlUaGUgbmFtZSBvZiBhbiBleGlzdGluZyBicmFuY2ggdG8gcmVuYW1lLgorCis8bmV3YnJhbmNoPjo6CisJVGhlIG5ldyBuYW1lIGZvciBhbiBleGlzdGluZyBicmFuY2guIFRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBmb3IKKwk8YnJhbmNobmFtZT4gYXBwbGllcy4KKworCitFeGFtcGxlcworLS0tLS0tLS0KKworU3RhcnQgZGV2ZWxvcG1lbnQgb2ZmIG9mIGEga25vd24gdGFnOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS8uLi4vbGludXgtMi42IG15Mi42CiskIGNkIG15Mi42CiskIGdpdCBicmFuY2ggbXkyLjYuMTQgdjIuNi4xNCAgIDwxPgorJCBnaXQgY2hlY2tvdXQgbXkyLjYuMTQKKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgc3RlcCBhbmQgdGhlIG5leHQgb25lIGNvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RlcCB3aXRoCisiY2hlY2tvdXQgLWIgbXkyLjYuMTQgdjIuNi4xNCIuCisKK0RlbGV0ZSB1bm5lZWRlZCBicmFuY2g6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy8uLi4vZ2l0LmdpdCBteS5naXQKKyQgY2QgbXkuZ2l0CiskIGdpdCBicmFuY2ggLWQgLXIgdG9kbyBodG1sIG1hbiAgIDwxPgorJCBnaXQgYnJhbmNoIC1EIHRlc3QgICAgICAgICAgICAgICA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGRlbGV0ZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMgInRvZG8iLCAiaHRtbCIsICJtYW4iCis8Mj4gZGVsZXRlICJ0ZXN0IiBicmFuY2ggZXZlbiBpZiB0aGUgIm1hc3RlciIgYnJhbmNoIGRvZXMgbm90IGhhdmUgYWxsCitjb21taXRzIGZyb20gdGVzdCBicmFuY2guCisKKworTm90ZXMKKy0tLS0tCisKK0lmIHlvdSBhcmUgY3JlYXRpbmcgYSBicmFuY2ggdGhhdCB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSBjaGVja291dCwgaXQncworZWFzaWVyIHRvIHVzZSB0aGUgZ2l0IGNoZWNrb3V0IGNvbW1hbmQgd2l0aCBpdHMgYC1iYCBvcHRpb24gdG8gY3JlYXRlCithIGJyYW5jaCBhbmQgY2hlY2sgaXQgb3V0IHdpdGggYSBzaW5nbGUgY29tbWFuZC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZCBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYnVuZGxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWJ1bmRsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MWUyYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWJ1bmRsZS50eHQKQEAgLTAsMCArMSwxNDAgQEAKK2dpdC1idW5kbGUoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWJ1bmRsZSAtIE1vdmUgb2JqZWN0cyBhbmQgcmVmcyBieSBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJ1bmRsZScgY3JlYXRlIDxmaWxlPiBbZ2l0LXJldi1saXN0IGFyZ3NdCisnZ2l0LWJ1bmRsZScgdmVyaWZ5IDxmaWxlPgorJ2dpdC1idW5kbGUnIGxpc3QtaGVhZHMgPGZpbGU+IFtyZWZuYW1lLi4uXQorJ2dpdC1idW5kbGUnIHVuYnVuZGxlIDxmaWxlPiBbcmVmbmFtZS4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1NvbWUgd29ya2Zsb3dzIHJlcXVpcmUgdGhhdCBvbmUgb3IgbW9yZSBicmFuY2hlcyBvZiBkZXZlbG9wbWVudCBvbiBvbmUKK21hY2hpbmUgYmUgcmVwbGljYXRlZCBvbiBhbm90aGVyIG1hY2hpbmUsIGJ1dCB0aGUgdHdvIG1hY2hpbmVzIGNhbm5vdAorYmUgZGlyZWN0bHkgY29ubmVjdGVkIHNvIHRoZSBpbnRlcmFjdGl2ZSBnaXQgcHJvdG9jb2xzIChnaXQsIHNzaCwKK3JzeW5jLCBodHRwKSBjYW5ub3QgYmUgdXNlZC4gIFRoaXMgY29tbWFuZCBwcm92aWRlcyBzdXBwb3J0IGZvcgorZ2l0LWZldGNoIGFuZCBnaXQtcHVsbCB0byBvcGVyYXRlIGJ5IHBhY2thZ2luZyBvYmplY3RzIGFuZCByZWZlcmVuY2VzCitpbiBhbiBhcmNoaXZlIGF0IHRoZSBvcmlnaW5hdGluZyBtYWNoaW5lLCB0aGVuIGltcG9ydGluZyB0aG9zZSBpbnRvCithbm90aGVyIHJlcG9zaXRvcnkgdXNpbmcgZ2l0bGluazpnaXQtZmV0Y2hbMV0gYW5kIGdpdGxpbms6Z2l0LXB1bGxbMV0KK2FmdGVyIG1vdmluZyB0aGUgYXJjaGl2ZSBieSBzb21lIG1lYW5zIChpLmUuLCBieSBzbmVha2VybmV0KS4gIEFzIG5vCitkaXJlY3QgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcyBleGlzdHMsIHRoZSB1c2VyIG11c3Qgc3BlY2lmeSBhCitiYXNpcyBmb3IgdGhlIGJ1bmRsZSB0aGF0IGlzIGhlbGQgYnkgdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnk6IHRoZQorYnVuZGxlIGFzc3VtZXMgdGhhdCBhbGwgb2JqZWN0cyBpbiB0aGUgYmFzaXMgYXJlIGFscmVhZHkgaW4gdGhlCitkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgorCitPUFRJT05TCistLS0tLS0tCisKK2NyZWF0ZSA8ZmlsZT46OgorICAgICAgIFVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIG5hbWVkICdmaWxlJy4gIFRoaXMgcmVxdWlyZXMgdGhlCisgICAgICAgZ2l0LXJldi1saXN0IGFyZ3VtZW50cyB0byBkZWZpbmUgdGhlIGJ1bmRsZSBjb250ZW50cy4KKwordmVyaWZ5IDxmaWxlPjo6CisgICAgICAgVXNlZCB0byBjaGVjayB0aGF0IGEgYnVuZGxlIGZpbGUgaXMgdmFsaWQgYW5kIHdpbGwgYXBwbHkKKyAgICAgICBjbGVhbmx5IHRvIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuICBUaGlzIGluY2x1ZGVzIGNoZWNrcyBvbiB0aGUKKyAgICAgICBidW5kbGUgZm9ybWF0IGl0c2VsZiBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoYXQgdGhlIHByZXJlcXVpc2l0ZQorICAgICAgIGNvbW1pdHMgZXhpc3QgYW5kIGFyZSBmdWxseSBsaW5rZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS4KKyAgICAgICBnaXQtYnVuZGxlIHByaW50cyBhIGxpc3Qgb2YgbWlzc2luZyBjb21taXRzLCBpZiBhbnksIGFuZCBleGl0cworICAgICAgIHdpdGggbm9uLXplcm8gc3RhdHVzLgorCitsaXN0LWhlYWRzIDxmaWxlPjo6CisgICAgICAgTGlzdHMgdGhlIHJlZmVyZW5jZXMgZGVmaW5lZCBpbiB0aGUgYnVuZGxlLiAgSWYgZm9sbG93ZWQgYnkgYQorICAgICAgIGxpc3Qgb2YgcmVmZXJlbmNlcywgb25seSByZWZlcmVuY2VzIG1hdGNoaW5nIHRob3NlIGdpdmVuIGFyZQorICAgICAgIHByaW50ZWQgb3V0LgorCit1bmJ1bmRsZSA8ZmlsZT46OgorICAgICAgIFBhc3NlcyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVuZGxlIHRvIGdpdGxpbms6Z2l0LWluZGV4LXBhY2tbMV0KKyAgICAgICBmb3Igc3RvcmFnZSBpbiB0aGUgcmVwb3NpdG9yeSwgdGhlbiBwcmludHMgdGhlIG5hbWVzIG9mIGFsbAorICAgICAgIGRlZmluZWQgcmVmZXJlbmNlcy4gSWYgYSByZWZsaXN0IGlzIGdpdmVuLCBvbmx5IHJlZmVyZW5jZXMKKyAgICAgICBtYXRjaGluZyB0aG9zZSBpbiB0aGUgZ2l2ZW4gbGlzdCBhcmUgcHJpbnRlZC4gVGhpcyBjb21tYW5kIGlzCisgICAgICAgcmVhbGx5IHBsdW1iaW5nLCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgb25seSBieQorICAgICAgIGdpdGxpbms6Z2l0LWZldGNoWzFdLgorCitbZ2l0LXJldi1saXN0LWFyZ3MuLi5dOjoKKyAgICAgICBBIGxpc3Qgb2YgYXJndW1lbnRzLCBhY2NlcHRhYmxlIHRvIGdpdC1yZXYtcGFyc2UgYW5kCisgICAgICAgZ2l0LXJldi1saXN0LCB0aGF0IHNwZWNpZnkgdGhlIHNwZWNpZmljIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMKKyAgICAgICB0byB0cmFuc3BvcnQuICBGb3IgZXhhbXBsZSwgIm1hc3Rlcn4xMC4ubWFzdGVyIiBjYXVzZXMgdGhlCisgICAgICAgY3VycmVudCBtYXN0ZXIgcmVmZXJlbmNlIHRvIGJlIHBhY2thZ2VkIGFsb25nIHdpdGggYWxsIG9iamVjdHMKKyAgICAgICBhZGRlZCBzaW5jZSBpdHMgMTB0aCBhbmNlc3RvciBjb21taXQuICBUaGVyZSBpcyBubyBleHBsaWNpdAorICAgICAgIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyBhbmQgb2JqZWN0cyB0aGF0IG1heSBiZQorICAgICAgIHBhY2thZ2VkLgorCisKK1tyZWZuYW1lLi4uXTo6CisgICAgICAgQSBsaXN0IG9mIHJlZmVyZW5jZXMgdXNlZCB0byBsaW1pdCB0aGUgcmVmZXJlbmNlcyByZXBvcnRlZCBhcworICAgICAgIGF2YWlsYWJsZS4gVGhpcyBpcyBwcmluY2lwYWxseSBvZiB1c2UgdG8gZ2l0LWZldGNoLCB3aGljaAorICAgICAgIGV4cGVjdHMgdG8gcmVjZWl2ZSBvbmx5IHRob3NlIHJlZmVyZW5jZXMgYXNrZWQgZm9yIGFuZCBub3QKKyAgICAgICBuZWNlc3NhcmlseSBldmVyeXRoaW5nIGluIHRoZSBwYWNrIChpbiB0aGlzIGNhc2UsIGdpdC1idW5kbGUgaXMKKyAgICAgICBhY3RpbmcgbGlrZSBnaXRsaW5rOmdpdC1mZXRjaC1wYWNrWzFdKS4KKworU1BFQ0lGWUlORyBSRUZFUkVOQ0VTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0LWJ1bmRsZSB3aWxsIG9ubHkgcGFja2FnZSByZWZlcmVuY2VzIHRoYXQgYXJlIHNob3duIGJ5CitnaXQtc2hvdy1yZWY6IHRoaXMgaW5jbHVkZXMgaGVhZHMsIHRhZ3MsIGFuZCByZW1vdGUgaGVhZHMuICBSZWZlcmVuY2VzCitzdWNoIGFzIG1hc3Rlcn4xIGNhbm5vdCBiZSBwYWNrYWdlZCwgYnV0IGFyZSBwZXJmZWN0bHkgc3VpdGFibGUgZm9yCitkZWZpbmluZyB0aGUgYmFzaXMuICBNb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBtYXkgYmUgcGFja2FnZWQsIGFuZCBtb3JlCit0aGFuIG9uZSBiYXNpcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhlIG9iamVjdHMgcGFja2FnZWQgYXJlIHRob3NlIG5vdAorY29udGFpbmVkIGluIHRoZSB1bmlvbiBvZiB0aGUgZ2l2ZW4gYmFzZXMuICBFYWNoIGJhc2lzIGNhbiBiZQorc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGUuZy4sIF5tYXN0ZXJ+MTApLCBvciBpbXBsaWNpdGx5IChlLmcuLAorbWFzdGVyfjEwLi5tYXN0ZXIsIG1hc3RlciAtLXNpbmNlPTEwLmRheXMuYWdvKS4KKworSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgYmFzaXMgdXNlZCBiZSBoZWxkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KK0l0IGlzIG9rYXkgdG8gZXJyIG9uIHRoZSBzaWRlIG9mIGNvbnNlcnZhdGlzbSwgY2F1c2luZyB0aGUgYnVuZGxlIGZpbGUKK3RvIGNvbnRhaW4gb2JqZWN0cyBhbHJlYWR5IGluIHRoZSBkZXN0aW5hdGlvbiBhcyB0aGVzZSBhcmUgaWdub3JlZAord2hlbiB1bnBhY2tpbmcgYXQgdGhlIGRlc3RpbmF0aW9uLgorCitFWEFNUExFCistLS0tLS0tCisKK0Fzc3VtZSB0d28gcmVwb3NpdG9yaWVzIGV4aXN0IGFzIFIxIG9uIG1hY2hpbmUgQSwgYW5kIFIyIG9uIG1hY2hpbmUgQi4KK0ZvciB3aGF0ZXZlciByZWFzb24sIGRpcmVjdCBjb25uZWN0aW9uIGJldHdlZW4gQSBhbmQgQiBpcyBub3QgYWxsb3dlZCwKK2J1dCB3ZSBjYW4gbW92ZSBkYXRhIGZyb20gQSB0byBCIHZpYSBzb21lIG1lY2hhbmlzbSAoQ0QsIGVtYWlsLCBldGMpLgorV2Ugd2FudCB0byB1cGRhdGUgUjIgd2l0aCBkZXZlbG9wbWVudHMgbWFkZSBvbiBicmFuY2ggbWFzdGVyIGluIFIxLgorV2Ugc2V0IGEgdGFnIGluIFIxIChsYXN0UjJidW5kbGUpIGFmdGVyIHRoZSBwcmV2aW91cyBzdWNoIHRyYW5zcG9ydCwKK2FuZCBtb3ZlIGl0IGFmdGVyd2FyZHMgdG8gaGVscCBidWlsZCB0aGUgYnVuZGxlLgorCitpbiBSMSBvbiBBOgorJCBnaXQtYnVuZGxlIGNyZWF0ZSBteWJ1bmRsZSBtYXN0ZXIgXmxhc3RSMmJ1bmRsZQorJCBnaXQgdGFnIC1mIGxhc3RSMmJ1bmRsZSBtYXN0ZXIKKworKG1vdmUgbXlidW5kbGUgZnJvbSBBIHRvIEIgYnkgc29tZSBtZWNoYW5pc20pCisKK2luIFIyIG9uIEI6CiskIGdpdC1idW5kbGUgdmVyaWZ5IG15YnVuZGxlCiskIGdpdC1mZXRjaCBteWJ1bmRsZSAgcmVmc3BlYworCit3aGVyZSByZWZzcGVjIGlzIHJlZkluQnVuZGxlOmxvY2FsUmVmCisKKworQWxzbywgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHlvdXIgY29uZmlnOgorCitbcmVtb3RlICJidW5kbGUiXQorICAgIHVybCA9IC9ob21lL21lL3RtcC9maWxlLmJkbAorICAgIGZldGNoID0gcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKgorCitZb3UgY2FuIGZpcnN0IHNuZWFrZXJuZXQgdGhlIGJ1bmRsZSBmaWxlIHRvIH4vdG1wL2ZpbGUuYmRsIGFuZAordGhlbiB0aGVzZSBjb21tYW5kczoKKworJCBnaXQgbHMtcmVtb3RlIGJ1bmRsZQorJCBnaXQgZmV0Y2ggYnVuZGxlCiskIGdpdCBwdWxsIGJ1bmRsZQorCit3b3VsZCB0cmVhdCBpdCBhcyBpZiBpdCBpcyB0YWxraW5nIHdpdGggYSByZW1vdGUgc2lkZSBvdmVyIHRoZQorbmV0d29yay4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTWFyayBMZXZlZGFobCA8bWRsMTIzQHZlcml6b24ubmV0PgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVjMGQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2F0LWZpbGUudHh0CkBAIC0wLDAgKzEsNzQgQEAKK2dpdC1jYXQtZmlsZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jYXQtZmlsZSAtIFByb3ZpZGUgY29udGVudCBvciB0eXBlL3NpemUgaW5mb3JtYXRpb24gZm9yIHJlcG9zaXRvcnkgb2JqZWN0cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jYXQtZmlsZScgWy10IHwgLXMgfCAtZSB8IC1wIHwgPHR5cGU+XSA8b2JqZWN0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Byb3ZpZGVzIGNvbnRlbnQgb3IgdHlwZSBvZiBvYmplY3RzIGluIHRoZSByZXBvc2l0b3J5LiBUaGUgdHlwZQoraXMgcmVxdWlyZWQgdW5sZXNzICctdCcgb3IgJy1wJyBpcyB1c2VkIHRvIGZpbmQgdGhlIG9iamVjdCB0eXBlLAorb3IgJy1zJyBpcyB1c2VkIHRvIGZpbmQgdGhlIG9iamVjdCBzaXplLgorCitPUFRJT05TCistLS0tLS0tCis8b2JqZWN0Pjo6CisJVGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBzaG93LgorCUZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIG9iamVjdCBuYW1lcywgc2VlCisJIlNQRUNJRllJTkcgUkVWSVNJT05TIiBzZWN0aW9uIGluIGdpdGxpbms6Z2l0LXJldi1wYXJzZVsxXS4KKworLXQ6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCB0eXBlIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLXM6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCBzaXplIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLWU6OgorCVN1cHByZXNzIGFsbCBvdXRwdXQ7IGluc3RlYWQgZXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIDxvYmplY3Q+CisJZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG9iamVjdC4KKworLXA6OgorCVByZXR0eS1wcmludCB0aGUgY29udGVudHMgb2YgPG9iamVjdD4gYmFzZWQgb24gaXRzIHR5cGUuCisKKzx0eXBlPjo6CisJVHlwaWNhbGx5IHRoaXMgbWF0Y2hlcyB0aGUgcmVhbCB0eXBlIG9mIDxvYmplY3Q+IGJ1dCBhc2tpbmcKKwlmb3IgYSB0eXBlIHRoYXQgY2FuIHRyaXZpYWxseSBiZSBkZXJlZmVyZW5jZWQgZnJvbSB0aGUgZ2l2ZW4KKwk8b2JqZWN0PiBpcyBhbHNvIHBlcm1pdHRlZC4gIEFuIGV4YW1wbGUgaXMgdG8gYXNrIGZvciBhCisJInRyZWUiIHdpdGggPG9iamVjdD4gYmVpbmcgYSBjb21taXQgb2JqZWN0IHRoYXQgY29udGFpbnMgaXQsCisJb3IgdG8gYXNrIGZvciBhICJibG9iIiB3aXRoIDxvYmplY3Q+IGJlaW5nIGEgdGFnIG9iamVjdCB0aGF0CisJcG9pbnRzIGF0IGl0LgorCitPVVRQVVQKKy0tLS0tLQorSWYgJy10JyBpcyBzcGVjaWZpZWQsIG9uZSBvZiB0aGUgPHR5cGU+LgorCitJZiAnLXMnIGlzIHNwZWNpZmllZCwgdGhlIHNpemUgb2YgdGhlIDxvYmplY3Q+IGluIGJ5dGVzLgorCitJZiAnLWUnIGlzIHNwZWNpZmllZCwgbm8gb3V0cHV0LgorCitJZiAnLXAnIGlzIHNwZWNpZmllZCwgdGhlIGNvbnRlbnRzIG9mIDxvYmplY3Q+IGFyZSBwcmV0dHktcHJpbnRlZC4KKworT3RoZXJ3aXNlIHRoZSByYXcgKHRob3VnaCB1bmNvbXByZXNzZWQpIGNvbnRlbnRzIG9mIHRoZSA8b2JqZWN0PiB3aWxsCitiZSByZXR1cm5lZC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stYXR0ci50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1hdHRyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI1MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stYXR0ci50eHQKQEAgLTAsMCArMSwzNyBAQAorZ2l0LWNoZWNrLWF0dHIoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVjay1hdHRyIC0gRGlzcGxheSBnaXRhdHRyaWJ1dGVzIGluZm9ybWF0aW9uLgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVjay1hdHRyJyBhdHRyLi4uIFstLV0gcGF0aG5hbWUuLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitGb3IgZXZlcnkgcGF0aG5hbWUsIHRoaXMgY29tbWFuZCB3aWxsIGxpc3QgaWYgZWFjaCBhdHRyIGlzICd1bnNwZWNpZmllZCcsCisnc2V0Jywgb3IgJ3Vuc2V0JyBhcyBhIGdpdGF0dHJpYnV0ZSBvbiB0aGF0IHBhdGhuYW1lLgorCitPUFRJT05TCistLS0tLS0tCitcLS06OgorCUludGVycHJldCBhbGwgcHJlY2VkaW5nIGFyZ3VtZW50cyBhcyBhdHRyaWJ1dGVzLCBhbmQgYWxsIGZvbGxvd2luZworCWFyZ3VtZW50cyBhcyBwYXRoIG5hbWVzLiBJZiBub3Qgc3VwcGxpZWQsIG9ubHkgdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwKKwliZSB0cmVhdGVkIGFzIGFuIGF0dHJpYnV0ZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEphbWVzIEJvd2VzLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1yZWYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQKQEAgLTAsMCArMSw1NSBAQAorZ2l0LWNoZWNrLXJlZi1mb3JtYXQoMSkKKz09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVjay1yZWYtZm9ybWF0IC0gTWFrZSBzdXJlIHJlZiBuYW1lIGlzIHdlbGwgZm9ybWVkCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVjay1yZWYtZm9ybWF0JyA8cmVmbmFtZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDaGVja3MgaWYgYSBnaXZlbiAncmVmbmFtZScgaXMgYWNjZXB0YWJsZSwgYW5kIGV4aXRzIG5vbi16ZXJvIGlmCitpdCBpcyBub3QuCisKK0EgcmVmZXJlbmNlIGlzIHVzZWQgaW4gZ2l0IHRvIHNwZWNpZnkgYnJhbmNoZXMgYW5kIHRhZ3MuICBBCiticmFuY2ggaGVhZCBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHNgIGRpcmVjdG9yeSwgYW5kCithIHRhZyBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvdGFnc2AgZGlyZWN0b3J5LiAgZ2l0CitpbXBvc2VzIHRoZSBmb2xsb3dpbmcgcnVsZXMgb24gaG93IHJlZnMgYXJlIG5hbWVkOgorCisuIEl0IGNhbiBpbmNsdWRlIHNsYXNoIGAvYCBmb3IgaGllcmFyY2hpY2FsIChkaXJlY3RvcnkpCisgIGdyb3VwaW5nLCBidXQgbm8gc2xhc2gtc2VwYXJhdGVkIGNvbXBvbmVudCBjYW4gYmVnaW4gd2l0aCBhCisgIGRvdCBgLmA7CisKKy4gSXQgY2Fubm90IGhhdmUgdHdvIGNvbnNlY3V0aXZlIGRvdHMgYC4uYCBhbnl3aGVyZTsKKworLiBJdCBjYW5ub3QgaGF2ZSBBU0NJSSBjb250cm9sIGNoYXJhY3RlciAoaS5lLiBieXRlcyB3aG9zZQorICB2YWx1ZXMgYXJlIGxvd2VyIHRoYW4gXDA0MCwgb3IgXDE3NyBgREVMYCksIHNwYWNlLCB0aWxkZSBgfmAsCisgIGNhcmV0IGB7Y2FyZXR9YCwgY29sb24gYDpgLCBxdWVzdGlvbi1tYXJrIGA/YCwgYXN0ZXJpc2sgYCpgLAorICBvciBvcGVuIGJyYWNrZXQgYFtgIGFueXdoZXJlOworCisuIEl0IGNhbm5vdCBlbmQgd2l0aCBhIHNsYXNoIGAvYC4KKworVGhlc2UgcnVsZXMgbWFrZXMgaXQgZWFzeSBmb3Igc2hlbGwgc2NyaXB0IGJhc2VkIHRvb2xzIHRvIHBhcnNlCityZWZuYW1lcywgcGF0aG5hbWUgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbCB3aGVuIGEgcmVmbmFtZSBpcyB1c2VkCit1bnF1b3RlZCAoYnkgbWlzdGFrZSksIGFuZCBhbHNvIGF2b2lkcyBhbWJpZ3VpdGllcyBpbiBjZXJ0YWluCityZWZuYW1lIGV4cHJlc3Npb25zIChzZWUgZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdKS4gIE5hbWVseToKKworLiBkb3VibGUtZG90IGAuLmAgYXJlIG9mdGVuIHVzZWQgYXMgaW4gYHJlZjEuLnJlZjJgLCBhbmQgaW4gc29tZQorICBjb250ZXh0IHRoaXMgbm90YXRpb24gbWVhbnMgYHtjYXJldH1yZWYxIHJlZjJgIChpLmUuIG5vdCBpbgorICByZWYxIGFuZCBpbiByZWYyKS4KKworLiB0aWxkZSBgfmAgYW5kIGNhcmV0IGB7Y2FyZXR9YCBhcmUgdXNlZCB0byBpbnRyb2R1Y2UgcG9zdGZpeAorICAnbnRoIHBhcmVudCcgYW5kICdwZWVsIG9uaW9uJyBvcGVyYXRpb24uCisKKy4gY29sb24gYDpgIGlzIHVzZWQgYXMgaW4gYHNyY3JlZjpkc3RyZWZgIHRvIG1lYW4gInVzZSBzcmNyZWZcJ3MKKyAgdmFsdWUgYW5kIHN0b3JlIGl0IGluIGRzdHJlZiIgaW4gZmV0Y2ggYW5kIHB1c2ggb3BlcmF0aW9ucy4KKyAgSXQgbWF5IGFsc28gYmUgdXNlZCB0byBzZWxlY3QgYSBzcGVjaWZpYyBvYmplY3Qgc3VjaCBhcyB3aXRoCisgIGdpdGxpbms6Z2l0LWNhdC1maWxlWzFdICJnaXQtY2F0LWZpbGUgYmxvYiB2MS4zLjM6cmVmcy5jIi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ2ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTg1IEBACitnaXQtY2hlY2tvdXQtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlY2tvdXQtaW5kZXggLSBDb3B5IGZpbGVzIGZyb20gdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2hlY2tvdXQtaW5kZXgnIFstdV0gWy1xXSBbLWFdIFstZl0gWy1uXSBbLS1wcmVmaXg9PHN0cmluZz5dCisJCSAgIFstLXN0YWdlPTxudW1iZXI+fGFsbF0KKwkJICAgWy0tdGVtcF0KKwkJICAgWy16XSBbLS1zdGRpbl0KKwkJICAgWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorV2lsbCBjb3B5IGFsbCBmaWxlcyBsaXN0ZWQgZnJvbSB0aGUgaW5kZXggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Cisobm90IG92ZXJ3cml0aW5nIGV4aXN0aW5nIGZpbGVzKS4KKworT1BUSU9OUworLS0tLS0tLQorLXV8LS1pbmRleDo6CisJdXBkYXRlIHN0YXQgaW5mb3JtYXRpb24gZm9yIHRoZSBjaGVja2VkIG91dCBlbnRyaWVzIGluCisJdGhlIGluZGV4IGZpbGUuCisKKy1xfC0tcXVpZXQ6OgorCWJlIHF1aWV0IGlmIGZpbGVzIGV4aXN0IG9yIGFyZSBub3QgaW4gdGhlIGluZGV4CisKKy1mfC0tZm9yY2U6OgorCWZvcmNlcyBvdmVyd3JpdGUgb2YgZXhpc3RpbmcgZmlsZXMKKworLWF8LS1hbGw6OgorCWNoZWNrcyBvdXQgYWxsIGZpbGVzIGluIHRoZSBpbmRleC4gIENhbm5vdCBiZSB1c2VkCisJdG9nZXRoZXIgd2l0aCBleHBsaWNpdCBmaWxlbmFtZXMuCisKKy1ufC0tbm8tY3JlYXRlOjoKKwlEb24ndCBjaGVja291dCBuZXcgZmlsZXMsIG9ubHkgcmVmcmVzaCBmaWxlcyBhbHJlYWR5IGNoZWNrZWQKKwlvdXQuCisKKy0tcHJlZml4PTxzdHJpbmc+OjoKKwlXaGVuIGNyZWF0aW5nIGZpbGVzLCBwcmVwZW5kIDxzdHJpbmc+ICh1c3VhbGx5IGEgZGlyZWN0b3J5CisJaW5jbHVkaW5nIGEgdHJhaWxpbmcgLykKKworLS1zdGFnZT08bnVtYmVyPnxhbGw6OgorCUluc3RlYWQgb2YgY2hlY2tpbmcgb3V0IHVubWVyZ2VkIGVudHJpZXMsIGNvcHkgb3V0IHRoZQorCWZpbGVzIGZyb20gbmFtZWQgc3RhZ2UuICA8bnVtYmVyPiBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMy4KKwlOb3RlOiAtLXN0YWdlPWFsbCBhdXRvbWF0aWNhbGx5IGltcGxpZXMgLS10ZW1wLgorCistLXRlbXA6OgorCUluc3RlYWQgb2YgY29weWluZyB0aGUgZmlsZXMgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGVtcG9yYXJ5IGZpbGVzLiAgVGhlIHRlbXBvcmFyeSBuYW1lCisJYXNzb2NpYXRpb25zIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRvdXQuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgdGFraW5nIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAorCXJlYWQgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4gIFBhdGhzIGFyZQorCXNlcGFyYXRlZCBieSBMRiAoaS5lLiBvbmUgcGF0aCBwZXIgbGluZSkgYnkgZGVmYXVsdC4KKworLXo6OgorCU9ubHkgbWVhbmluZ2Z1bCB3aXRoIGAtLXN0ZGluYDsgcGF0aHMgYXJlIHNlcGFyYXRlZCB3aXRoCisJTlVMIGNoYXJhY3RlciBpbnN0ZWFkIG9mIExGLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKK1RoZSBvcmRlciBvZiB0aGUgZmxhZ3MgdXNlZCB0byBtYXR0ZXIsIGJ1dCBub3QgYW55bW9yZS4KKworSnVzdCBkb2luZyBgZ2l0LWNoZWNrb3V0LWluZGV4YCBkb2VzIG5vdGhpbmcuIFlvdSBwcm9iYWJseSBtZWFudAorYGdpdC1jaGVja291dC1pbmRleCAtYWAuIEFuZCBpZiB5b3Ugd2FudCB0byBmb3JjZSBpdCwgeW91IHdhbnQKK2BnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWFgLgorCitJbnR1aXRpdmVuZXNzIGlzIG5vdCB0aGUgZ29hbCBoZXJlLiBSZXBlYXRhYmlsaXR5IGlzLiBUaGUgcmVhc29uIGZvcgordGhlICJubyBhcmd1bWVudHMgbWVhbnMgbm8gd29yayIgYmVoYXZpb3IgaXMgdGhhdCBmcm9tIHNjcmlwdHMgeW91IGFyZQorc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBkbzoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBmaW5kIC4gLW5hbWUgJyouaCcgLXByaW50MCB8IHhhcmdzIC0wIGdpdC1jaGVja291dC1pbmRleCAtZiAtLQorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGZvcmNlIGFsbCBleGlzdGluZyBgKi5oYCBmaWxlcyB0byBiZSByZXBsYWNlZCB3aXRoIHRoZWlyCitjYWNoZWQgY29waWVzLiBJZiBhbiBlbXB0eSBjb21tYW5kIGxpbmUgaW1wbGllZCAiYWxsIiwgdGhlbiB0aGlzIHdvdWxkCitmb3JjZS1yZWZyZXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIGluZGV4LCB3aGljaCB3YXMgbm90IHRoZSBwb2ludC4gIEJ1dAorc2luY2UgZ2l0LWNoZWNrb3V0LWluZGV4IGFjY2VwdHMgLS1zdGRpbiBpdCB3b3VsZCBiZSBmYXN0ZXIgdG8gdXNlOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC16IC0tc3RkaW4KKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGAtLWAgaXMganVzdCBhIGdvb2QgaWRlYSB3aGVuIHlvdSBrbm93IHRoZSByZXN0IHdpbGwgYmUgZmlsZW5hbWVzOworaXQgd2lsbCBwcmV2ZW50IHByb2JsZW1zIHdpdGggYSBmaWxlbmFtZSBvZiwgZm9yIGV4YW1wbGUsICBgLWFgLgorVXNpbmcgYC0tYCBpcyBwcm9iYWJseSBhIGdvb2QgcG9saWN5IGluIHNjcmlwdHMuCisKKworVXNpbmcgLS10ZW1wIG9yIC0tc3RhZ2U9YWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gYC0tdGVtcGAgaXMgdXNlZCAob3IgaW1wbGllZCBieSBgLS1zdGFnZT1hbGxgKQorYGdpdC1jaGVja291dC1pbmRleGAgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBmb3IgZWFjaCBpbmRleAorZW50cnkgYmVpbmcgY2hlY2tlZCBvdXQuICBUaGUgaW5kZXggd2lsbCBub3QgYmUgdXBkYXRlZCB3aXRoIHN0YXQKK2luZm9ybWF0aW9uLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgdXNlZnVsIGlmIHRoZSBjYWxsZXIgbmVlZHMgYWxsCitzdGFnZXMgb2YgYWxsIHVubWVyZ2VkIGVudHJpZXMgc28gdGhhdCB0aGUgdW5tZXJnZWQgZmlsZXMgY2FuIGJlCitwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgbWVyZ2UgdG9vbC4KKworQSBsaXN0aW5nIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRvdXQgcHJvdmlkaW5nIHRoZSBhc3NvY2lhdGlvbiBvZgordGVtcG9yYXJ5IGZpbGUgbmFtZXMgdG8gdHJhY2tlZCBwYXRoIG5hbWVzLiAgVGhlIGxpc3RpbmcgZm9ybWF0CitoYXMgdHdvIHZhcmlhdGlvbnM6CisKKyAgICAuIHRlbXBuYW1lIFRBQiBwYXRoIFJTCisrCitUaGUgZmlyc3QgZm9ybWF0IGlzIHdoYXQgZ2V0cyB1c2VkIHdoZW4gYC0tc3RhZ2VgIGlzIG9taXR0ZWQgb3IKK2lzIG5vdCBgLS1zdGFnZT1hbGxgLiBUaGUgZmllbGQgdGVtcG5hbWUgaXMgdGhlIHRlbXBvcmFyeSBmaWxlCituYW1lIGhvbGRpbmcgdGhlIGZpbGUgY29udGVudCBhbmQgcGF0aCBpcyB0aGUgdHJhY2tlZCBwYXRoIG5hbWUgaW4KK3RoZSBpbmRleC4gIE9ubHkgdGhlIHJlcXVlc3RlZCBlbnRyaWVzIGFyZSBvdXRwdXQuCisKKyAgICAuIHN0YWdlMXRlbXAgU1Agc3RhZ2UydGVtcCBTUCBzdGFnZTN0bXAgVEFCIHBhdGggUlMKKysKK1RoZSBzZWNvbmQgZm9ybWF0IGlzIHdoYXQgZ2V0cyB1c2VkIHdoZW4gYC0tc3RhZ2U9YWxsYC4gIFRoZSB0aHJlZQorc3RhZ2UgdGVtcG9yYXJ5IGZpZWxkcyAoc3RhZ2UxdGVtcCwgc3RhZ2UydGVtcCwgc3RhZ2UzdGVtcCkgbGlzdCB0aGUKK25hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIHRoZXJlIGlzIGEgc3RhZ2UgZW50cnkgaW4gdGhlIGluZGV4CitvciBgLmAgaWYgdGhlcmUgaXMgbm8gc3RhZ2UgZW50cnkuICBQYXRocyB3aGljaCBvbmx5IGhhdmUgYSBzdGFnZSAwCitlbnRyeSB3aWxsIGFsd2F5cyBiZSBvbWl0dGVkIGZyb20gdGhlIG91dHB1dC4KKworSW4gYm90aCBmb3JtYXRzIFJTICh0aGUgcmVjb3JkIHNlcGFyYXRvcikgaXMgbmV3bGluZSBieSBkZWZhdWx0CitidXQgd2lsbCBiZSB0aGUgbnVsbCBieXRlIGlmIC16IHdhcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK1RoZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBhcmUgYWx3YXlzIHNhZmUgc3RyaW5nczsgdGhleSB3aWxsIG5ldmVyCitjb250YWluIGRpcmVjdG9yeSBzZXBhcmF0b3JzIG9yIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gIFRoZSBwYXRoCitmaWVsZCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCB0aGUgdGVtcG9yYXJ5CitmaWxlIG5hbWVzIGFyZSBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuCisKK0lmIHRoZSBvYmplY3QgYmVpbmcgY29waWVkIG91dCB0byBhIHRlbXBvcmFyeSBmaWxlIGlzIGEgc3ltYm9saWMKK2xpbmsgdGhlIGNvbnRlbnQgb2YgdGhlIGxpbmsgd2lsbCBiZSB3cml0dGVuIHRvIGEgbm9ybWFsIGZpbGUuICBJdCBpcwordXAgdG8gdGhlIGVuZC11c2VyIG9yIHRoZSBQb3JjZWxhaW4gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKworCitFWEFNUExFUworLS0tLS0tLS0KK1RvIHVwZGF0ZSBhbmQgcmVmcmVzaCBvbmx5IHRoZSBmaWxlcyBhbHJlYWR5IGNoZWNrZWQgb3V0OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC1uIC1mIC1hICYmIGdpdC11cGRhdGUtaW5kZXggLS1pZ25vcmUtbWlzc2luZyAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKworVXNpbmcgYGdpdC1jaGVja291dC1pbmRleGAgdG8gImV4cG9ydCBhbiBlbnRpcmUgdHJlZSI6OgorCVRoZSBwcmVmaXggYWJpbGl0eSBiYXNpY2FsbHkgbWFrZXMgaXQgdHJpdmlhbCB0byB1c2UKKwlgZ2l0LWNoZWNrb3V0LWluZGV4YCBhcyBhbiAiZXhwb3J0IGFzIHRyZWUiIGZ1bmN0aW9uLgorCUp1c3QgcmVhZCB0aGUgZGVzaXJlZCB0cmVlIGludG8gdGhlIGluZGV4LCBhbmQgZG86CisrCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD1naXQtZXhwb3J0LWRpci8gLWEKKy0tLS0tLS0tLS0tLS0tLS0KKysKK2BnaXQtY2hlY2tvdXQtaW5kZXhgIHdpbGwgImV4cG9ydCIgdGhlIGluZGV4IGludG8gdGhlIHNwZWNpZmllZAorZGlyZWN0b3J5LgorKworVGhlIGZpbmFsICIvIiBpcyBpbXBvcnRhbnQuIFRoZSBleHBvcnRlZCBuYW1lIGlzIGxpdGVyYWxseSBqdXN0CitwcmVmaXhlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorZm9sbG93aW5nIGV4YW1wbGUuCisKK0V4cG9ydCBmaWxlcyB3aXRoIGEgcHJlZml4OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PS5tZXJnZWQtIE1ha2VmaWxlCistLS0tLS0tLS0tLS0tLS0tCisrCitUaGlzIHdpbGwgY2hlY2sgb3V0IHRoZSBjdXJyZW50bHkgY2FjaGVkIGNvcHkgb2YgYE1ha2VmaWxlYAoraW50byB0aGUgZmlsZSBgLm1lcmdlZC1NYWtlZmlsZWAuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsCitKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGQ4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVja291dC50eHQKQEAgLTAsMCArMSwyMTggQEAKK2dpdC1jaGVja291dCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVja291dCAtIENoZWNrb3V0IGFuZCBzd2l0Y2ggdG8gYSBicmFuY2gKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNoZWNrb3V0JyBbLXFdIFstZl0gW1stLXRyYWNrIHwgLS1uby10cmFja10gLWIgPG5ld19icmFuY2g+IFstbF1dIFstbV0gWzxicmFuY2g+XQorJ2dpdC1jaGVja291dCcgWzx0cmVlLWlzaD5dIDxwYXRocz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1doZW4gPHBhdGhzPiBhcmUgbm90IGdpdmVuLCB0aGlzIGNvbW1hbmQgc3dpdGNoZXMgYnJhbmNoZXMgYnkKK3VwZGF0aW5nIHRoZSBpbmRleCBhbmQgd29ya2luZyB0cmVlIHRvIHJlZmxlY3QgdGhlIHNwZWNpZmllZAorYnJhbmNoLCA8YnJhbmNoPiwgYW5kIHVwZGF0aW5nIEhFQUQgdG8gYmUgPGJyYW5jaD4gb3IsIGlmCitzcGVjaWZpZWQsIDxuZXdfYnJhbmNoPi4gIFVzaW5nIC1iIHdpbGwgY2F1c2UgPG5ld19icmFuY2g+IHRvCitiZSBjcmVhdGVkOyBpbiB0aGlzIGNhc2UgeW91IGNhbiB1c2UgdGhlIC0tdHJhY2sgb3IgLS1uby10cmFjaworb3B0aW9ucywgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYGdpdCBicmFuY2hgLgorCitXaGVuIDxwYXRocz4gYXJlIGdpdmVuLCB0aGlzIGNvbW1hbmQgZG9lcyAqbm90KiBzd2l0Y2gKK2JyYW5jaGVzLiAgSXQgdXBkYXRlcyB0aGUgbmFtZWQgcGF0aHMgaW4gdGhlIHdvcmtpbmcgdHJlZSBmcm9tCit0aGUgaW5kZXggZmlsZSAoaS5lLiBpdCBydW5zIGBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXVgKSwgb3IKK2Zyb20gYSBuYW1lZCBjb21taXQuICBJbgordGhpcyBjYXNlLCB0aGUgYC1mYCBhbmQgYC1iYCBvcHRpb25zIGFyZSBtZWFuaW5nbGVzcyBhbmQgZ2l2aW5nCitlaXRoZXIgb2YgdGhlbSByZXN1bHRzIGluIGFuIGVycm9yLiAgPHRyZWUtaXNoPiBhcmd1bWVudCBjYW4gYmUKK3VzZWQgdG8gc3BlY2lmeSBhIHNwZWNpZmljIHRyZWUtaXNoIChpLmUuIGNvbW1pdCwgdGFnIG9yIHRyZWUpCit0byB1cGRhdGUgdGhlIGluZGV4IGZvciB0aGUgZ2l2ZW4gcGF0aHMgYmVmb3JlIHVwZGF0aW5nIHRoZQord29ya2luZyB0cmVlLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1xOjoKKwlRdWlldCwgc3VwcmVzcyBmZWVkYmFjayBtZXNzYWdlcy4KKworLWY6OgorCVByb2NlZWQgZXZlbiBpZiB0aGUgaW5kZXggb3IgdGhlIHdvcmtpbmcgdHJlZSBkaWZmZXJzCisJZnJvbSBIRUFELiAgVGhpcyBpcyB1c2VkIHRvIHRocm93IGF3YXkgbG9jYWwgY2hhbmdlcy4KKworLWI6OgorCUNyZWF0ZSBhIG5ldyBicmFuY2ggbmFtZWQgPG5ld19icmFuY2g+IGFuZCBzdGFydCBpdCBhdAorCTxicmFuY2g+LiAgVGhlIG5ldyBicmFuY2ggbmFtZSBtdXN0IHBhc3MgYWxsIGNoZWNrcyBkZWZpbmVkCisJYnkgZ2l0bGluazpnaXQtY2hlY2stcmVmLWZvcm1hdFsxXS4gIFNvbWUgb2YgdGhlc2UgY2hlY2tzCisJbWF5IHJlc3RyaWN0IHRoZSBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gYSBicmFuY2ggbmFtZS4KKworLS10cmFjazo6CisJV2hlbiAtYiBpcyBnaXZlbiBhbmQgYSBicmFuY2ggaXMgY3JlYXRlZCBvZmYgYSByZW1vdGUgYnJhbmNoLAorCXNldCB1cCBjb25maWd1cmF0aW9uIHNvIHRoYXQgZ2l0LXB1bGwgd2lsbCBhdXRvbWF0aWNhbGx5CisJcmV0cmlldmUgZGF0YSBmcm9tIHRoZSByZW1vdGUgYnJhbmNoLiAgU2V0IHRoZQorCWJyYW5jaC5hdXRvc2V0dXBtZXJnZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHRvIHRydWUgaWYgeW91CisJd2FudCBnaXQtY2hlY2tvdXQgYW5kIGdpdC1icmFuY2ggdG8gYWx3YXlzIGJlaGF2ZSBhcyBpZgorCSctLXRyYWNrJyB3ZXJlIGdpdmVuLgorCistLW5vLXRyYWNrOjoKKwlXaGVuIC1iIGlzIGdpdmVuIGFuZCBhIGJyYW5jaCBpcyBjcmVhdGVkIG9mZiBhIHJlbW90ZSBicmFuY2gsCisJc2V0IHVwIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBnaXQtcHVsbCB3aWxsIG5vdCByZXRyaWV2ZSBkYXRhCisJZnJvbSB0aGUgcmVtb3RlIGJyYW5jaCwgaWdub3JpbmcgdGhlIGJyYW5jaC5hdXRvc2V0dXBtZXJnZQorCWNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKy1sOjoKKwlDcmVhdGUgdGhlIG5ldyBicmFuY2gncyByZWYgbG9nLiAgVGhpcyBhY3RpdmF0ZXMgcmVjb3JkaW5nIG9mCisJYWxsIGNoYW5nZXMgdG8gbWFkZSB0aGUgYnJhbmNoIHJlZiwgZW5hYmxpbmcgdXNlIG9mIGRhdGUKKwliYXNlZCBzaGExIGV4cHJlc3Npb25zIHN1Y2ggYXMgIjxicmFuY2huYW1lPkB7eWVzdGVyZGF5fSIuCisKKy1tOjoKKwlJZiB5b3UgaGF2ZSBsb2NhbCBtb2RpZmljYXRpb25zIHRvIG9uZSBvciBtb3JlIGZpbGVzIHRoYXQKKwlhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgYnJhbmNoIGFuZCB0aGUgYnJhbmNoIHRvCisJd2hpY2ggeW91IGFyZSBzd2l0Y2hpbmcsIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gc3dpdGNoCisJYnJhbmNoZXMgaW4gb3JkZXIgdG8gcHJlc2VydmUgeW91ciBtb2RpZmljYXRpb25zIGluIGNvbnRleHQuCisJSG93ZXZlciwgd2l0aCB0aGlzIG9wdGlvbiwgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGUgY3VycmVudAorCWJyYW5jaCwgeW91ciB3b3JraW5nIHRyZWUgY29udGVudHMsIGFuZCB0aGUgbmV3IGJyYW5jaAorCWlzIGRvbmUsIGFuZCB5b3Ugd2lsbCBiZSBvbiB0aGUgbmV3IGJyYW5jaC4KKysKK1doZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zLCB0aGUgaW5kZXggZW50cmllcyBmb3IgY29uZmxpY3RpbmcKK3BhdGhzIGFyZSBsZWZ0IHVubWVyZ2VkLCBhbmQgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzCithbmQgbWFyayB0aGUgcmVzb2x2ZWQgcGF0aHMgd2l0aCBgZ2l0IGFkZGAgKG9yIGBnaXQgcm1gIGlmIHRoZSBtZXJnZQorc2hvdWxkIHJlc3VsdCBpbiBkZWxldGlvbiBvZiB0aGUgcGF0aCkuCisKKzxuZXdfYnJhbmNoPjo6CisJTmFtZSBmb3IgdGhlIG5ldyBicmFuY2guCisKKzxicmFuY2g+OjoKKwlCcmFuY2ggdG8gY2hlY2tvdXQ7IG1heSBiZSBhbnkgb2JqZWN0IElEIHRoYXQgcmVzb2x2ZXMgdG8gYQorCWNvbW1pdC4gIERlZmF1bHRzIHRvIEhFQUQuCisrCitXaGVuIHRoaXMgcGFyYW1ldGVyIG5hbWVzIGEgbm9uLWJyYW5jaCAoYnV0IHN0aWxsIGEgdmFsaWQgY29tbWl0IG9iamVjdCksCit5b3VyIEhFQUQgYmVjb21lcyAnZGV0YWNoZWQnLgorCisKK0RldGFjaGVkIEhFQUQKKy0tLS0tLS0tLS0tLS0KKworSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvICdjaGVja291dCcgYSBjb21taXQgdGhhdCBpcworbm90IGF0IHRoZSB0aXAgb2Ygb25lIG9mIHlvdXIgYnJhbmNoZXMuICBUaGUgbW9zdCBvYnZpb3VzCitleGFtcGxlIGlzIHRvIGNoZWNrIG91dCB0aGUgY29tbWl0IGF0IGEgdGFnZ2VkIG9mZmljaWFsIHJlbGVhc2UKK3BvaW50LCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgdjIuNi4xOAorLS0tLS0tLS0tLS0tCisKK0VhcmxpZXIgdmVyc2lvbnMgb2YgZ2l0IGRpZCBub3QgYWxsb3cgdGhpcyBhbmQgYXNrZWQgeW91IHRvCitjcmVhdGUgYSB0ZW1wb3JhcnkgYnJhbmNoIHVzaW5nIGAtYmAgb3B0aW9uLCBidXQgc3RhcnRpbmcgZnJvbQordmVyc2lvbiAxLjUuMCwgdGhlIGFib3ZlIGNvbW1hbmQgJ2RldGFjaGVzJyB5b3VyIEhFQUQgZnJvbSB0aGUKK2N1cnJlbnQgYnJhbmNoIGFuZCBkaXJlY3RseSBwb2ludCBhdCB0aGUgY29tbWl0IG5hbWVkIGJ5IHRoZSB0YWcKKyhgdjIuNi4xOGAgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgorCitZb3UgY2FuIHVzZSB1c3VhbCBnaXQgY29tbWFuZHMgd2hpbGUgaW4gdGhpcyBzdGF0ZS4gIFlvdSBjYW4gdXNlCitgZ2l0LXJlc2V0IC0taGFyZCAkb3RoZXJjb21taXRgIHRvIGZ1cnRoZXIgbW92ZSBhcm91bmQsIGZvcgorZXhhbXBsZS4gIFlvdSBjYW4gbWFrZSBjaGFuZ2VzIGFuZCBjcmVhdGUgYSBuZXcgY29tbWl0IG9uIHRvcCBvZgorYSBkZXRhY2hlZCBIRUFELiAgWW91IGNhbiBldmVuIGNyZWF0ZSBhIG1lcmdlIGJ5IHVzaW5nIGBnaXQKK21lcmdlICRvdGhlcmNvbW1pdGAuCisKK1RoZSBzdGF0ZSB5b3UgYXJlIGluIHdoaWxlIHlvdXIgSEVBRCBpcyBkZXRhY2hlZCBpcyBub3QgcmVjb3JkZWQKK2J5IGFueSBicmFuY2ggKHdoaWNoIGlzIG5hdHVyYWwgLS0tIHlvdSBhcmUgbm90IG9uIGFueSBicmFuY2gpLgorV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgeW91IGNhbiBkaXNjYXJkIHlvdXIgdGVtcG9yYXJ5IGNvbW1pdHMKK2FuZCBtZXJnZXMgYnkgc3dpdGNoaW5nIGJhY2sgdG8gYW4gZXhpc3RpbmcgYnJhbmNoIChlLmcuIGBnaXQKK2NoZWNrb3V0IG1hc3RlcmApLCBhbmQgYSBsYXRlciBgZ2l0IHBydW5lYCBvciBgZ2l0IGdjYCB3b3VsZAorZ2FyYmFnZS1jb2xsZWN0IHRoZW0uICBJZiB5b3UgZGlkIHRoaXMgYnkgbWlzdGFrZSwgeW91IGNhbiBhc2sKK3RoZSByZWZsb2cgZm9yIEhFQUQgd2hlcmUgeW91IHdlcmUsIGUuZy4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgLWcgLTIgSEVBRAorLS0tLS0tLS0tLS0tCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKKy4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBjaGVja3Mgb3V0IHRoZSBgbWFzdGVyYCBicmFuY2gsIHJldmVydHMKK3RoZSBgTWFrZWZpbGVgIHRvIHR3byByZXZpc2lvbnMgYmFjaywgZGVsZXRlcyBoZWxsby5jIGJ5CittaXN0YWtlLCBhbmQgZ2V0cyBpdCBiYWNrIGZyb20gdGhlIGluZGV4LgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXJ+MiBNYWtlZmlsZSAgPDI+CiskIHJtIC1mIGhlbGxvLmMKKyQgZ2l0IGNoZWNrb3V0IGhlbGxvLmMgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHN3aXRjaCBicmFuY2gKKzwyPiB0YWtlIG91dCBhIGZpbGUgb3V0IG9mIG90aGVyIGNvbW1pdAorPDM+IHJlc3RvcmUgaGVsbG8uYyBmcm9tIEhFQUQgb2YgY3VycmVudCBicmFuY2gKKysKK0lmIHlvdSBoYXZlIGFuIHVuZm9ydHVuYXRlIGJyYW5jaCB0aGF0IGlzIG5hbWVkIGBoZWxsby5jYCwgdGhpcworc3RlcCB3b3VsZCBiZSBjb25mdXNlZCBhcyBhbiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggdG8gdGhhdCBicmFuY2guCitZb3Ugc2hvdWxkIGluc3RlYWQgd3JpdGU6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC0tIGhlbGxvLmMKKy0tLS0tLS0tLS0tLQorCisuIEFmdGVyIHdvcmtpbmcgaW4gYSB3cm9uZyBicmFuY2gsIHN3aXRjaGluZyB0byB0aGUgY29ycmVjdAorYnJhbmNoIHdvdWxkIGJlIGRvbmUgdXNpbmc6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15dG9waWMKKy0tLS0tLS0tLS0tLQorKworSG93ZXZlciwgeW91ciAid3JvbmciIGJyYW5jaCBhbmQgY29ycmVjdCAibXl0b3BpYyIgYnJhbmNoIG1heQorZGlmZmVyIGluIGZpbGVzIHRoYXQgeW91IGhhdmUgbG9jYWxseSBtb2RpZmllZCwgaW4gd2hpY2ggY2FzZSwKK3RoZSBhYm92ZSBjaGVja291dCB3b3VsZCBmYWlsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXl0b3BpYworZmF0YWw6IEVudHJ5ICdmcm90eicgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuCistLS0tLS0tLS0tLS0KKysKK1lvdSBjYW4gZ2l2ZSB0aGUgYC1tYCBmbGFnIHRvIHRoZSBjb21tYW5kLCB3aGljaCB3b3VsZCB0cnkgYQordGhyZWUtd2F5IG1lcmdlOgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtbSBteXRvcGljCitBdXRvLW1lcmdpbmcgZnJvdHoKKy0tLS0tLS0tLS0tLQorKworQWZ0ZXIgdGhpcyB0aHJlZS13YXkgbWVyZ2UsIHRoZSBsb2NhbCBtb2RpZmljYXRpb25zIGFyZSBfbm90XworcmVnaXN0ZXJlZCBpbiB5b3VyIGluZGV4IGZpbGUsIHNvIGBnaXQgZGlmZmAgd291bGQgc2hvdyB5b3Ugd2hhdAorY2hhbmdlcyB5b3UgbWFkZSBzaW5jZSB0aGUgdGlwIG9mIHRoZSBuZXcgYnJhbmNoLgorCisuIFdoZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zIGR1cmluZyBzd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aAordGhlIGAtbWAgb3B0aW9uLCB5b3Ugd291bGQgc2VlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1tIG15dG9waWMKK0F1dG8tbWVyZ2luZyBmcm90egorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBmcm90egorZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCistLS0tLS0tLS0tLS0KKysKK0F0IHRoaXMgcG9pbnQsIGBnaXQgZGlmZmAgc2hvd3MgdGhlIGNoYW5nZXMgY2xlYW5seSBtZXJnZWQgYXMgaW4KK3RoZSBwcmV2aW91cyBleGFtcGxlLCBhcyB3ZWxsIGFzIHRoZSBjaGFuZ2VzIGluIHRoZSBjb25mbGljdGVkCitmaWxlcy4gIEVkaXQgYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGFuZCBtYXJrIGl0IHJlc29sdmVkIHdpdGgKK2BnaXQgYWRkYCBhcyB1c3VhbDoKKysKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGZyb3R6CiskIGdpdCBhZGQgZnJvdHoKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiYmE5OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS1waWNrLnR4dApAQCAtMCwwICsxLDcxIEBACitnaXQtY2hlcnJ5LXBpY2soMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlcnJ5LXBpY2sgLSBBcHBseSB0aGUgY2hhbmdlIGludHJvZHVjZWQgYnkgYW4gZXhpc3RpbmcgY29tbWl0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVycnktcGljaycgWy0tZWRpdF0gWy1uXSBbLXhdIDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgYXBwbHkgdGhlIGNoYW5nZSB0aGUgcGF0Y2ggaW50cm9kdWNlcywgYW5kIHJlY29yZCBhCituZXcgY29tbWl0IHRoYXQgcmVjb3JkcyBpdC4gIFRoaXMgcmVxdWlyZXMgeW91ciB3b3JraW5nIHRyZWUgdG8gYmUgY2xlYW4gKG5vCittb2RpZmljYXRpb25zIGZyb20gdGhlIEhFQUQgY29tbWl0KS4KKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1pdD46OgorCUNvbW1pdCB0byBjaGVycnktcGljay4KKwlGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCBjb21taXRzLCBzZWUKKwkiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdLgorCistZXwtLWVkaXQ6OgorCVdpdGggdGhpcyBvcHRpb24sIGBnaXQtY2hlcnJ5LXBpY2tgIHdpbGwgbGV0IHlvdSBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlIHByaW9yIGNvbW1pdHRpbmcuCisKKy14OjoKKwlDYXVzZSB0aGUgY29tbWFuZCB0byBhcHBlbmQgd2hpY2ggY29tbWl0IHdhcworCWNoZXJyeS1waWNrZWQgYWZ0ZXIgdGhlIG9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIHdoZW4KKwltYWtpbmcgYSBjb21taXQuICBEbyBub3QgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUKKwljaGVycnktcGlja2luZyBmcm9tIHlvdXIgcHJpdmF0ZSBicmFuY2ggYmVjYXVzZSB0aGUKKwlpbmZvcm1hdGlvbiBpcyB1c2VsZXNzIHRvIHRoZSByZWNpcGllbnQuICBJZiBvbiB0aGUKKwlvdGhlciBoYW5kIHlvdSBhcmUgY2hlcnJ5LXBpY2tpbmcgYmV0d2VlbiB0d28gcHVibGljbHkKKwl2aXNpYmxlIGJyYW5jaGVzIChlLmcuIGJhY2twb3J0aW5nIGEgZml4IHRvIGEKKwltYWludGVuYW5jZSBicmFuY2ggZm9yIGFuIG9sZGVyIHJlbGVhc2UgZnJvbSBhCisJZGV2ZWxvcG1lbnQgYnJhbmNoKSwgYWRkaW5nIHRoaXMgaW5mb3JtYXRpb24gY2FuIGJlCisJdXNlZnVsLgorCistcjo6CisJSXQgdXNlZCB0byBiZSB0aGF0IHRoZSBjb21tYW5kIGRlZmF1bHRlZCB0byBkbyBgLXhgCisJZGVzY3JpYmVkIGFib3ZlLCBhbmQgYC1yYCB3YXMgdG8gZGlzYWJsZSBpdC4gIE5vdyB0aGUKKwlkZWZhdWx0IGlzIG5vdCB0byBkbyBgLXhgIHNvIHRoaXMgb3B0aW9uIGlzIGEgbm8tb3AuCisKKy1ufC0tbm8tY29tbWl0OjoKKwlVc3VhbGx5IHRoZSBjb21tYW5kIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGNvbW1pdCB3aXRoCisJYSBjb21taXQgbG9nIG1lc3NhZ2Ugc3RhdGluZyB3aGljaCBjb21taXQgd2FzCisJY2hlcnJ5LXBpY2tlZC4gIFRoaXMgZmxhZyBhcHBsaWVzIHRoZSBjaGFuZ2UgbmVjZXNzYXJ5CisJdG8gY2hlcnJ5LXBpY2sgdGhlIG5hbWVkIGNvbW1pdCB0byB5b3VyIHdvcmtpbmcgdHJlZSwKKwlidXQgZG9lcyBub3QgbWFrZSB0aGUgY29tbWl0LiAgSW4gYWRkaXRpb24sIHdoZW4gdGhpcworCW9wdGlvbiBpcyB1c2VkLCB5b3VyIHdvcmtpbmcgdHJlZSBkb2VzIG5vdCBoYXZlIHRvIG1hdGNoCisJdGhlIEhFQUQgY29tbWl0LiAgVGhlIGNoZXJyeS1waWNrIGlzIGRvbmUgYWdhaW5zdCB0aGUKKwliZWdpbm5pbmcgc3RhdGUgb2YgeW91ciB3b3JraW5nIHRyZWUuCisrCitUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZXJyeS1waWNraW5nIG1vcmUgdGhhbiBvbmUgY29tbWl0cycKK2VmZmVjdCB0byB5b3VyIHdvcmtpbmcgdHJlZSBpbiBhIHJvdy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlcnJ5LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ZDk2NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS50eHQKQEAgLTAsMCArMSw3MCBAQAorZ2l0LWNoZXJyeSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlcnJ5IC0gRmluZCBjb21taXRzIG5vdCBtZXJnZWQgdXBzdHJlYW0KKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNoZXJyeScgWy12XSA8dXBzdHJlYW0+IFs8aGVhZD5dIFs8bGltaXQ+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjaGFuZ2VzZXQgKG9yICJkaWZmIikgb2YgZWFjaCBjb21taXQgYmV0d2VlbiB0aGUgZm9yay1wb2ludCBhbmQgPGhlYWQ+CitpcyBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggY29tbWl0IGJldHdlZW4gdGhlIGZvcmstcG9pbnQgYW5kIDx1cHN0cmVhbT4uCisKK0V2ZXJ5IGNvbW1pdCB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIDx1cHN0cmVhbT4gYnJhbmNoCitoYXMgaXRzIGlkIChzaGExKSByZXBvcnRlZCwgcHJlZml4ZWQgYnkgYSBzeW1ib2wuICBUaGUgb25lcyB0aGF0IGhhdmUKK2VxdWl2YWxlbnQgY2hhbmdlIGFscmVhZHkKK2luIHRoZSA8dXBzdHJlYW0+IGJyYW5jaCBhcmUgcHJlZml4ZWQgd2l0aCBhIG1pbnVzICgtKSBzaWduLCBhbmQgdGhvc2UKK3RoYXQgb25seSBleGlzdCBpbiB0aGUgPGhlYWQ+IGJyYW5jaCBhcmUgcHJlZml4ZWQgd2l0aCBhIHBsdXMgKCspIHN5bWJvbDoKKworICAgICAgICAgICAgICAgX18qX18qX18qX18qX18+IDx1cHN0cmVhbT4KKyAgICAgICAgICAgICAgLworICAgIGZvcmstcG9pbnQKKyAgICAgICAgICAgICAgXF9fK19fK19fLV9fK19fK19fLV9fK19fPiA8aGVhZD4KKworCitJZiBhIDxsaW1pdD4gaGFzIGJlZW4gZ2l2ZW4gdGhlbiB0aGUgY29tbWl0cyBhbG9uZyB0aGUgPGhlYWQ+IGJyYW5jaCB1cAordG8gYW5kIGluY2x1ZGluZyA8bGltaXQ+IGFyZSBub3QgcmVwb3J0ZWQ6CisKKyAgICAgICAgICAgICAgIF9fKl9fKl9fKl9fKl9fPiA8dXBzdHJlYW0+CisgICAgICAgICAgICAgIC8KKyAgICBmb3JrLXBvaW50CisgICAgICAgICAgICAgIFxfXypfXypfXzxsaW1pdD5fXy1fXytfXz4gPGhlYWQ+CisKKworQmVjYXVzZSBnaXQtY2hlcnJ5IGNvbXBhcmVzIHRoZSBjaGFuZ2VzZXQgcmF0aGVyIHRoYW4gdGhlIGNvbW1pdCBpZAorKHNoYTEpLCB5b3UgY2FuIHVzZSBnaXQtY2hlcnJ5IHRvIGZpbmQgb3V0IGlmIGEgY29tbWl0IHlvdSBtYWRlIGxvY2FsbHkKK2hhcyBiZWVuIGFwcGxpZWQgPHVwc3RyZWFtPiB1bmRlciBhIGRpZmZlcmVudCBjb21taXQgaWQuICBGb3IgZXhhbXBsZSwKK3RoaXMgd2lsbCBoYXBwZW4gaWYgeW91J3JlIGZlZWRpbmcgcGF0Y2hlcyA8dXBzdHJlYW0+IHZpYSBlbWFpbCByYXRoZXIKK3RoYW4gcHVzaGluZyBvciBwdWxsaW5nIGNvbW1pdHMgZGlyZWN0bHkuCisKKworT1BUSU9OUworLS0tLS0tLQorLXY6OgorCVZlcmJvc2UuCisKKzx1cHN0cmVhbT46OgorCVVwc3RyZWFtIGJyYW5jaCB0byBjb21wYXJlIGFnYWluc3QuCisKKzxoZWFkPjo6CisJV29ya2luZyBicmFuY2g7IGRlZmF1bHRzIHRvIEhFQUQuCisKKzxsaW1pdD46OgorCURvIG5vdCByZXBvcnQgY29tbWl0cyB1cCB0byAoYW5kIGluY2x1ZGluZykgbGltaXQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jbGVhbi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbGVhbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyNTJkNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNsZWFuLnR4dApAQCAtMCwwICsxLDU3IEBACitnaXQtY2xlYW4oMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2xlYW4gLSBSZW1vdmUgdW50cmFja2VkIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2xlYW4nIFstZF0gWy1mXSBbLW5dIFstcV0gWy14IHwgLVhdIFstLV0gPHBhdGhzPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlbW92ZXMgZmlsZXMgdW5rbm93biB0byBnaXQuICBUaGlzIGFsbG93cyB0byBjbGVhbiB0aGUgd29ya2luZyB0cmVlCitmcm9tIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB2ZXJzaW9uIGNvbnRyb2wuICBJZiB0aGUgJy14JyBvcHRpb24gaXMKK3NwZWNpZmllZCwgaWdub3JlZCBmaWxlcyBhcmUgYWxzbyByZW1vdmVkLCBhbGxvd2luZyB0byByZW1vdmUgYWxsCitidWlsZCBwcm9kdWN0cy4KK1doZW4gb3B0aW9uYWwgYDxwYXRocz4uLi5gIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBwYXRocworYWZmZWN0ZWQgYXJlIGZ1cnRoZXIgbGltaXRlZCB0byB0aG9zZSB0aGF0IG1hdGNoIHRoZW0uCisKKworT1BUSU9OUworLS0tLS0tLQorLWQ6OgorCVJlbW92ZSB1bnRyYWNrZWQgZGlyZWN0b3JpZXMgaW4gYWRkaXRpb24gdG8gdW50cmFja2VkIGZpbGVzLgorCistZjo6CisJSWYgdGhlIGdpdCBjb25maWd1cmF0aW9uIHNwZWNpZmllcyBjbGVhbi5yZXF1aXJlRm9yY2UgYXMgdHJ1ZSwKKwlnaXQtY2xlYW4gd2lsbCByZWZ1c2UgdG8gcnVuIHVubGVzcyBnaXZlbiAtZiBvciAtbi4KKworLW46OgorCURvbid0IGFjdHVhbGx5IHJlbW92ZSBhbnl0aGluZywganVzdCBzaG93IHdoYXQgd291bGQgYmUgZG9uZS4KKworLXE6OgorCUJlIHF1aWV0LCBvbmx5IHJlcG9ydCBlcnJvcnMsIGJ1dCBub3QgdGhlIGZpbGVzIHRoYXQgYXJlCisJc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCisKKy14OjoKKwlEb24ndCB1c2UgdGhlIGlnbm9yZSBydWxlcy4gIFRoaXMgYWxsb3dzIHJlbW92aW5nIGFsbCB1bnRyYWNrZWQKKwlmaWxlcywgaW5jbHVkaW5nIGJ1aWxkIHByb2R1Y3RzLiAgVGhpcyBjYW4gYmUgdXNlZCAocG9zc2libHkgaW4KKwljb25qdW5jdGlvbiB3aXRoIGdpdGxpbms6Z2l0LXJlc2V0WzFdKSB0byBjcmVhdGUgYSBwcmlzdGluZQorCXdvcmtpbmcgZGlyZWN0b3J5IHRvIHRlc3QgYSBjbGVhbiBidWlsZC4KKworLVg6OgorCVJlbW92ZSBvbmx5IGZpbGVzIGlnbm9yZWQgYnkgZ2l0LiAgVGhpcyBtYXkgYmUgdXNlZnVsIHRvIHJlYnVpbGQKKwlldmVyeXRoaW5nIGZyb20gc2NyYXRjaCwgYnV0IGtlZXAgbWFudWFsbHkgY3JlYXRlZCBmaWxlcy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTM4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbG9uZS50eHQKQEAgLTAsMCArMSwxNzggQEAKK2dpdC1jbG9uZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jbG9uZSAtIENsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3IGRpcmVjdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jbG9uZScgWy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT5dIFstbCBbLXNdXSBbLXFdIFstbl0gWy0tYmFyZV0KKwkgIFstbyA8bmFtZT5dIFstdSA8dXBsb2FkLXBhY2s+XSBbLS1yZWZlcmVuY2UgPHJlcG9zaXRvcnk+XQorCSAgWy0tZGVwdGggPGRlcHRoPl0gPHJlcG9zaXRvcnk+IFs8ZGlyZWN0b3J5Pl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK0Nsb25lcyBhIHJlcG9zaXRvcnkgaW50byBhIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5LCBjcmVhdGVzCityZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMgZm9yIGVhY2ggYnJhbmNoIGluIHRoZSBjbG9uZWQgcmVwb3NpdG9yeQorKHZpc2libGUgdXNpbmcgYGdpdCBicmFuY2ggLXJgKSwgYW5kIGNyZWF0ZXMgYW5kIGNoZWNrcyBvdXQgYW4gaW5pdGlhbAorYnJhbmNoIGVxdWFsIHRvIHRoZSBjbG9uZWQgcmVwb3NpdG9yeSdzIGN1cnJlbnRseSBhY3RpdmUgYnJhbmNoLgorCitBZnRlciB0aGUgY2xvbmUsIGEgcGxhaW4gYGdpdCBmZXRjaGAgd2l0aG91dCBhcmd1bWVudHMgd2lsbCB1cGRhdGUKK2FsbCB0aGUgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzLCBhbmQgYSBgZ2l0IHB1bGxgIHdpdGhvdXQKK2FyZ3VtZW50cyB3aWxsIGluIGFkZGl0aW9uIG1lcmdlIHRoZSByZW1vdGUgbWFzdGVyIGJyYW5jaCBpbnRvIHRoZQorY3VycmVudCBtYXN0ZXIgYnJhbmNoLCBpZiBhbnkuCisKK1RoaXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGFjaGlldmVkIGJ5IGNyZWF0aW5nIHJlZmVyZW5jZXMgdG8KK3RoZSByZW1vdGUgYnJhbmNoIGhlYWRzIHVuZGVyIGAkR0lUX0RJUi9yZWZzL3JlbW90ZXMvb3JpZ2luYCBhbmQKK2J5IGluaXRpYWxpemluZyBgcmVtb3RlLm9yaWdpbi51cmxgIGFuZCBgcmVtb3RlLm9yaWdpbi5mZXRjaGAKK2NvbmZpZ3VyYXRpb24gdmFyaWFibGVzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tbG9jYWw6OgorLWw6OgorCVdoZW4gdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbSBpcyBvbiBhIGxvY2FsIG1hY2hpbmUsCisJdGhpcyBmbGFnIGJ5cGFzc2VzIG5vcm1hbCAiZ2l0IGF3YXJlIiB0cmFuc3BvcnQKKwltZWNoYW5pc20gYW5kIGNsb25lcyB0aGUgcmVwb3NpdG9yeSBieSBtYWtpbmcgYSBjb3B5IG9mCisJSEVBRCBhbmQgZXZlcnl0aGluZyB1bmRlciBvYmplY3RzIGFuZCByZWZzIGRpcmVjdG9yaWVzLgorCVRoZSBmaWxlcyB1bmRlciAuZ2l0L29iamVjdHMvIGRpcmVjdG9yeSBhcmUgaGFyZGxpbmtlZAorCXRvIHNhdmUgc3BhY2Ugd2hlbiBwb3NzaWJsZS4KKworLS1zaGFyZWQ6OgorLXM6OgorCVdoZW4gdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUsCisJaW5zdGVhZCBvZiB1c2luZyBoYXJkIGxpbmtzLCBhdXRvbWF0aWNhbGx5IHNldHVwCisJLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyB0byBzaGFyZSB0aGUgb2JqZWN0cworCXdpdGggdGhlIHNvdXJjZSByZXBvc2l0b3J5LiAgVGhlIHJlc3VsdGluZyByZXBvc2l0b3J5CisJc3RhcnRzIG91dCB3aXRob3V0IGFueSBvYmplY3Qgb2YgaXRzIG93bi4KKworLS1yZWZlcmVuY2UgPHJlcG9zaXRvcnk+OjoKKwlJZiB0aGUgcmVmZXJlbmNlIHJlcG9zaXRvcnkgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKKwlhdXRvbWF0aWNhbGx5IHNldHVwIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgdG8KKwlvYnRhaW4gb2JqZWN0cyBmcm9tIHRoZSByZWZlcmVuY2UgcmVwb3NpdG9yeS4gIFVzaW5nCisJYW4gYWxyZWFkeSBleGlzdGluZyByZXBvc2l0b3J5IGFzIGFuIGFsdGVybmF0ZSB3aWxsCisJcmVxdWlyZSBsZXNzIG9iamVjdHMgdG8gYmUgY29waWVkIGZyb20gdGhlIHJlcG9zaXRvcnkKKwliZWluZyBjbG9uZWQsIHJlZHVjaW5nIG5ldHdvcmsgYW5kIGxvY2FsIHN0b3JhZ2UgY29zdHMuCisKKy0tcXVpZXQ6OgorLXE6OgorCU9wZXJhdGUgcXVpZXRseS4gIFRoaXMgZmxhZyBpcyBwYXNzZWQgdG8gInJzeW5jIiBhbmQKKwkiZ2l0LWZldGNoLXBhY2siIGNvbW1hbmRzIHdoZW4gZ2l2ZW4uCisKKy1uOjoKKwlObyBjaGVja291dCBvZiBIRUFEIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2xvbmUgaXMgY29tcGxldGUuCisKKy0tYmFyZTo6CisJTWFrZSBhICdiYXJlJyBHSVQgcmVwb3NpdG9yeS4gIFRoYXQgaXMsIGluc3RlYWQgb2YKKwljcmVhdGluZyBgPGRpcmVjdG9yeT5gIGFuZCBwbGFjaW5nIHRoZSBhZG1pbmlzdHJhdGl2ZQorCWZpbGVzIGluIGA8ZGlyZWN0b3J5Pi8uZ2l0YCwgbWFrZSB0aGUgYDxkaXJlY3Rvcnk+YAorCWl0c2VsZiB0aGUgYCRHSVRfRElSYC4gVGhpcyBvYnZpb3VzbHkgaW1wbGllcyB0aGUgYC1uYAorCWJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBjaGVjayBvdXQgdGhlIHdvcmtpbmcgdHJlZS4KKwlBbHNvIHRoZSBicmFuY2ggaGVhZHMgYXQgdGhlIHJlbW90ZSBhcmUgY29waWVkIGRpcmVjdGx5CisJdG8gY29ycmVzcG9uZGluZyBsb2NhbCBicmFuY2ggaGVhZHMsIHdpdGhvdXQgbWFwcGluZworCXRoZW0gdG8gYHJlZnMvcmVtb3Rlcy9vcmlnaW4vYC4gIFdoZW4gdGhpcyBvcHRpb24gaXMKKwl1c2VkLCBuZWl0aGVyIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBub3IgdGhlIHJlbGF0ZWQKKwljb25maWd1cmF0aW9uIHZhcmlhYmxlcyBhcmUgY3JlYXRlZC4KKworLS1vcmlnaW4gPG5hbWU+OjoKKy1vIDxuYW1lPjo6CisJSW5zdGVhZCBvZiB1c2luZyB0aGUgcmVtb3RlIG5hbWUgJ29yaWdpbicgdG8ga2VlcCB0cmFjaworCW9mIHRoZSB1cHN0cmVhbSByZXBvc2l0b3J5LCB1c2UgPG5hbWU+IGluc3RlYWQuCisKKy0tdXBsb2FkLXBhY2sgPHVwbG9hZC1wYWNrPjo6CistdSA8dXBsb2FkLXBhY2s+OjoKKwlXaGVuIGdpdmVuLCBhbmQgdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbSBpcyBoYW5kbGVkCisJYnkgJ2dpdC1mZXRjaC1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKwl0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisJcnVuIG9uIHRoZSBvdGhlciBlbmQuCisKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRlbXBsYXRlcyB3aWxsIGJlIHVzZWQ7CisJaWYgdW5zZXQgdGhlIHRlbXBsYXRlcyBhcmUgdGFrZW4gZnJvbSB0aGUgaW5zdGFsbGF0aW9uCisJZGVmaW5lZCBkZWZhdWx0LCB0eXBpY2FsbHkgYC91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzYC4KKworLS1kZXB0aCA8ZGVwdGg+OjoKKwlDcmVhdGUgYSAnc2hhbGxvdycgY2xvbmUgd2l0aCBhIGhpc3RvcnkgdHJ1bmNhdGVkIHRvIHRoZQorCXNwZWNpZmllZCBudW1iZXIgb2YgcmV2cy4gIEEgc2hhbGxvdyByZXBvc2l0b3J5IGhhcworCW51bWJlciBvZiBsaW1pdGF0aW9ucyAoeW91IGNhbm5vdCBjbG9uZSBvciBmZXRjaCBmcm9tCisJaXQsIG5vciBwdXNoIGZyb20gbm9yIGludG8gaXQpLCBidXQgaXMgYWRlcXVhdGUgaWYgeW91CisJd2FudCB0byBvbmx5IGxvb2sgYXQgbmVhciB0aGUgdGlwIG9mIGEgbGFyZ2UgcHJvamVjdAorCXdpdGggYSBsb25nIGhpc3RvcnksIGFuZCB3b3VsZCB3YW50IHRvIHNlbmQgaW4gYSBmaXhlcworCWFzIHBhdGNoZXMuCisKKzxyZXBvc2l0b3J5Pjo6CisJVGhlIChwb3NzaWJseSByZW1vdGUpIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbS4gIEl0IGNhbgorCWJlIGFueSBVUkwgZ2l0LWZldGNoIHN1cHBvcnRzLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIG5hbWUgb2YgYSBuZXcgZGlyZWN0b3J5IHRvIGNsb25lIGludG8uICBUaGUgImh1bWFuaXNoIgorCXBhcnQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5IGlzIHVzZWQgaWYgbm8gZGlyZWN0b3J5IGlzCisJZXhwbGljaXRseSBnaXZlbiAoInJlcG8iIGZvciAiL3BhdGgvdG8vcmVwby5naXQiIGFuZCAiZm9vIgorCWZvciAiaG9zdC54ejpmb28vLmdpdCIpLiAgQ2xvbmluZyBpbnRvIGFuIGV4aXN0aW5nIGRpcmVjdG9yeQorCWlzIG5vdCBhbGxvd2VkLgorCitFeGFtcGxlcworLS0tLS0tLS0KKworQ2xvbmUgZnJvbSB1cHN0cmVhbTo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vLi4uL2xpbnV4LTIuNiBteTIuNgorJCBjZCBteTIuNgorJCBtYWtlCistLS0tLS0tLS0tLS0KKworCitNYWtlIGEgbG9jYWwgY2xvbmUgdGhhdCBib3Jyb3dzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aXRob3V0IGNoZWNraW5nIHRoaW5ncyBvdXQ6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtbCAtcyAtbiAuIC4uL2NvcHkKKyQgY2QgLi4vY29weQorJCBnaXQgc2hvdy1icmFuY2gKKy0tLS0tLS0tLS0tLQorCisKK0Nsb25lIGZyb20gdXBzdHJlYW0gd2hpbGUgYm9ycm93aW5nIGZyb20gYW4gZXhpc3RpbmcgbG9jYWwgZGlyZWN0b3J5OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1yZWZlcmVuY2UgbXkyLjYgXAorCWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vLi4uL2xpbnV4LTIuNyBcCisJbXkyLjcKKyQgY2QgbXkyLjcKKy0tLS0tLS0tLS0tLQorCisKK0NyZWF0ZSBhIGJhcmUgcmVwb3NpdG9yeSB0byBwdWJsaXNoIHlvdXIgY2hhbmdlcyB0byB0aGUgcHVibGljOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1iYXJlIC1sIC9ob21lL3Byb2ovLmdpdCAvcHViL3NjbS9wcm9qLmdpdAorLS0tLS0tLS0tLS0tCisKKworQ3JlYXRlIGEgcmVwb3NpdG9yeSBvbiB0aGUga2VybmVsLm9yZyBtYWNoaW5lIHRoYXQgYm9ycm93cyBmcm9tIExpbnVzOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1iYXJlIC1sIC1zIC9wdWIvc2NtLy4uLi90b3J2YWxkcy9saW51eC0yLjYuZ2l0IFwKKyAgICAvcHViL3NjbS8uLi4vbWUvc3Vic3lzLTIuNi5naXQKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY29tbWl0LXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY29tbWl0LXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGEzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQKQEAgLTAsMCArMSwxMTAgQEAKK2dpdC1jb21taXQtdHJlZSgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb21taXQtdHJlZSAtIENyZWF0ZSBhIG5ldyBjb21taXQgb2JqZWN0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvbW1pdC10cmVlJyA8dHJlZT4gWy1wIDxwYXJlbnQgY29tbWl0Pl1cKiA8IGNoYW5nZWxvZworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgdXN1YWxseSBub3Qgd2hhdCBhbiBlbmQgdXNlciB3YW50cyB0byBydW4gZGlyZWN0bHkuICBTZWUKK2dpdGxpbms6Z2l0LWNvbW1pdFsxXSBpbnN0ZWFkLgorCitDcmVhdGVzIGEgbmV3IGNvbW1pdCBvYmplY3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRyZWUgb2JqZWN0IGFuZAorZW1pdHMgdGhlIG5ldyBjb21taXQgb2JqZWN0IGlkIG9uIHN0ZG91dC4gSWYgbm8gcGFyZW50IGlzIGdpdmVuIHRoZW4KK2l0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gaW5pdGlhbCB0cmVlLgorCitBIGNvbW1pdCBvYmplY3QgdXN1YWxseSBoYXMgMSBwYXJlbnQgKGEgY29tbWl0IGFmdGVyIGEgY2hhbmdlKSBvciB1cAordG8gMTYgcGFyZW50cy4gIE1vcmUgdGhhbiBvbmUgcGFyZW50IHJlcHJlc2VudHMgYSBtZXJnZSBvZiBicmFuY2hlcwordGhhdCBsZWQgdG8gdGhlbS4KKworV2hpbGUgYSB0cmVlIHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBzdGF0ZSBvZiBhIHdvcmtpbmcKK2RpcmVjdG9yeSwgYSBjb21taXQgcmVwcmVzZW50cyB0aGF0IHN0YXRlIGluICJ0aW1lIiwgYW5kIGV4cGxhaW5zIGhvdwordG8gZ2V0IHRoZXJlLgorCitOb3JtYWxseSBhIGNvbW1pdCB3b3VsZCBpZGVudGlmeSBhIG5ldyAiSEVBRCIgc3RhdGUsIGFuZCB3aGlsZSBnaXQKK2RvZXNuJ3QgY2FyZSB3aGVyZSB5b3Ugc2F2ZSB0aGUgbm90ZSBhYm91dCB0aGF0IHN0YXRlLCBpbiBwcmFjdGljZSB3ZQordGVuZCB0byBqdXN0IHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIGZpbGUgdGhhdCBpcyBwb2ludGVkIGF0IGJ5CitgLmdpdC9IRUFEYCwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHNlZSB3aGF0IHRoZSBsYXN0IGNvbW1pdHRlZAorc3RhdGUgd2FzLgorCitPUFRJT05TCistLS0tLS0tCis8dHJlZT46OgorCUFuIGV4aXN0aW5nIHRyZWUgb2JqZWN0CisKKy1wIDxwYXJlbnQgY29tbWl0Pjo6CisJRWFjaCAnLXAnIGluZGljYXRlcyB0aGUgaWQgb2YgYSBwYXJlbnQgY29tbWl0IG9iamVjdC4KKwkKKworQ29tbWl0IEluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KKworQSBjb21taXQgZW5jYXBzdWxhdGVzOgorCistIGFsbCBwYXJlbnQgb2JqZWN0IGlkcworLSBhdXRob3IgbmFtZSwgZW1haWwgYW5kIGRhdGUKKy0gY29tbWl0dGVyIG5hbWUgYW5kIGVtYWlsIGFuZCB0aGUgY29tbWl0IHRpbWUuCisKK0lmIG5vdCBwcm92aWRlZCwgImdpdC1jb21taXQtdHJlZSIgdXNlcyB5b3VyIG5hbWUsIGhvc3RuYW1lIGFuZCBkb21haW4gdG8KK3Byb3ZpZGUgYXV0aG9yIGFuZCBjb21taXR0ZXIgaW5mby4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieQorZWl0aGVyIGAuZ2l0L2NvbmZpZ2AgZmlsZSwgb3IgdXNpbmcgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKwlHSVRfQVVUSE9SX05BTUUKKwlHSVRfQVVUSE9SX0VNQUlMCisJR0lUX0FVVEhPUl9EQVRFCisJR0lUX0NPTU1JVFRFUl9OQU1FCisJR0lUX0NPTU1JVFRFUl9FTUFJTAorCUdJVF9DT01NSVRURVJfREFURQorCUVNQUlMCisKKyhuYiAiPCIsICI+IiBhbmQgIlxuInMgYXJlIHN0cmlwcGVkKQorCitJbiBgLmdpdC9jb25maWdgIGZpbGUsIHRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHVzZWQgZm9yIEdJVF9BVVRIT1JfTkFNRSBhbmQKK0dJVF9BVVRIT1JfRU1BSUw6CisKKwlbdXNlcl0KKwkJbmFtZSA9ICJZb3VyIE5hbWUiCisJCWVtYWlsID0gInlvdXJAZW1haWwuYWRkcmVzcy54eiIKKworQSBjb21taXQgY29tbWVudCBpcyByZWFkIGZyb20gc3RkaW4gKG1heCA5OTkgY2hhcnMpLiBJZiBhIGNoYW5nZWxvZworZW50cnkgaXMgbm90IHByb3ZpZGVkIHZpYSAiPCIgcmVkaXJlY3Rpb24sICJnaXQtY29tbWl0LXRyZWUiIHdpbGwganVzdCB3YWl0Citmb3Igb25lIHRvIGJlIGVudGVyZWQgYW5kIHRlcm1pbmF0ZWQgd2l0aCBeRC4KKworCitEaWFnbm9zdGljcworLS0tLS0tLS0tLS0KK1lvdSBkb24ndCBleGlzdC4gR28gYXdheSE6OgorICAgIFRoZSBwYXNzd2QoNSkgZ2Vjb3MgZmllbGQgY291bGRuJ3QgYmUgcmVhZAorWW91ciBwYXJlbnRzIG11c3QgaGF2ZSBoYXRlZCB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgZ2Vjb3MgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorWW91ciBzeXNhZG1pbiBtdXN0IGhhdGUgeW91ITo6CisgICAgVGhlIHBhc3N3b3JkKDUpIG5hbWUgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorCitEaXNjdXNzaW9uCistLS0tLS0tLS0tCisKK2luY2x1ZGU6OmkxOG4udHh0W10KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC13cml0ZS10cmVlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTdiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0CkBAIC0wLDAgKzEsMjYyIEBACitnaXQtY29tbWl0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb21taXQgLSBSZWNvcmQgY2hhbmdlcyB0byB0aGUgcmVwb3NpdG9yeQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY29tbWl0JyBbLWEgfCAtLWludGVyYWN0aXZlXSBbLXNdIFstdl0KKwkgICBbKC1jIHwgLUMpIDxjb21taXQ+IHwgLUYgPGZpbGU+IHwgLW0gPG1zZz4gfCAtLWFtZW5kXQorCSAgIFstLW5vLXZlcmlmeV0gWy1lXSBbLS1hdXRob3IgPGF1dGhvcj5dCisJICAgWy0tXSBbWy1pIHwgLW8gXTxmaWxlPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitVc2UgJ2dpdCBjb21taXQnIHdoZW4geW91IHdhbnQgdG8gcmVjb3JkIHlvdXIgY2hhbmdlcyBpbnRvIHRoZSByZXBvc2l0b3J5CithbG9uZyB3aXRoIGEgbG9nIG1lc3NhZ2UgZGVzY3JpYmluZyB3aGF0IHRoZSBjb21taXQgaXMgYWJvdXQuIEFsbCBjaGFuZ2VzCit0byBiZSBjb21taXR0ZWQgbXVzdCBiZSBleHBsaWNpdGx5IGlkZW50aWZpZWQgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcKK21ldGhvZHM6CisKKzEuIGJ5IHVzaW5nIGdpdGxpbms6Z2l0LWFkZFsxXSB0byBpbmNyZW1lbnRhbGx5ICJhZGQiIGNoYW5nZXMgdG8gdGhlCisgICBuZXh0IGNvbW1pdCBiZWZvcmUgdXNpbmcgdGhlICdjb21taXQnIGNvbW1hbmQgKE5vdGU6IGV2ZW4gbW9kaWZpZWQKKyAgIGZpbGVzIG11c3QgYmUgImFkZGVkIik7CisKKzIuIGJ5IHVzaW5nIGdpdGxpbms6Z2l0LXJtWzFdIHRvIGlkZW50aWZ5IGNvbnRlbnQgcmVtb3ZhbCBmb3IgdGhlIG5leHQKKyAgIGNvbW1pdCwgYWdhaW4gYmVmb3JlIHVzaW5nIHRoZSAnY29tbWl0JyBjb21tYW5kOworCiszLiBieSBkaXJlY3RseSBsaXN0aW5nIGZpbGVzIGNvbnRhaW5pbmcgY2hhbmdlcyB0byBiZSBjb21taXR0ZWQgYXMgYXJndW1lbnRzCisgICB0byB0aGUgJ2NvbW1pdCcgY29tbWFuZCwgaW4gd2hpY2ggY2FzZXMgb25seSB0aG9zZSBmaWxlcyBhbG9uZSB3aWxsIGJlCisgICBjb25zaWRlcmVkIGZvciB0aGUgY29tbWl0OworCis0LiBieSB1c2luZyB0aGUgLWEgc3dpdGNoIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQgdG8gYXV0b21hdGljYWxseSAiYWRkIgorICAgY2hhbmdlcyBmcm9tIGFsbCBrbm93biBmaWxlcyBpLmUuIGZpbGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gY29tbWl0dGVkCisgICBiZWZvcmUsIGFuZCB0byBhdXRvbWF0aWNhbGx5ICJybSIgZmlsZXMgdGhhdCBoYXZlIGJlZW4KKyAgIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyB0cmVlLCBhbmQgcGVyZm9ybSB0aGUgYWN0dWFsIGNvbW1pdC4KKworNS4gYnkgdXNpbmcgdGhlIC0taW50ZXJhY3RpdmUgc3dpdGNoIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQgdG8gZGVjaWRlIG9uZQorICAgYnkgb25lIHdoaWNoIGZpbGVzIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBjb21taXQsIGJlZm9yZSBmaW5hbGl6aW5nIHRoZQorICAgb3BlcmF0aW9uLiAgQ3VycmVudGx5LCB0aGlzIGlzIGRvbmUgYnkgaW52b2tpbmcgYGdpdC1hZGQgLS1pbnRlcmFjdGl2ZWAuCisKK1RoZSBnaXRsaW5rOmdpdC1zdGF0dXNbMV0gY29tbWFuZCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYQorc3VtbWFyeSBvZiB3aGF0IGlzIGluY2x1ZGVkIGJ5IGFueSBvZiB0aGUgYWJvdmUgZm9yIHRoZSBuZXh0Citjb21taXQgYnkgZ2l2aW5nIHRoZSBzYW1lIHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3b3VsZCBnaXZlIHRvCit0aGlzIGNvbW1hbmQuCisKK0lmIHlvdSBtYWtlIGEgY29tbWl0IGFuZCB0aGVuIGZvdW5kIGEgbWlzdGFrZSBpbW1lZGlhdGVseSBhZnRlcgordGhhdCwgeW91IGNhbiByZWNvdmVyIGZyb20gaXQgd2l0aCBnaXRsaW5rOmdpdC1yZXNldFsxXS4KKworCitPUFRJT05TCistLS0tLS0tCistYXwtLWFsbDo6CisJVGVsbCB0aGUgY29tbWFuZCB0byBhdXRvbWF0aWNhbGx5IHN0YWdlIGZpbGVzIHRoYXQgaGF2ZQorCWJlZW4gbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGJ1dCBuZXcgZmlsZXMgeW91IGhhdmUgbm90CisJdG9sZCBnaXQgYWJvdXQgYXJlIG5vdCBhZmZlY3RlZC4KKworLWMgb3IgLUMgPGNvbW1pdD46OgorCVRha2UgZXhpc3RpbmcgY29tbWl0IG9iamVjdCwgYW5kIHJldXNlIHRoZSBsb2cgbWVzc2FnZQorCWFuZCB0aGUgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSB0aW1lc3RhbXApCisJd2hlbiBjcmVhdGluZyB0aGUgY29tbWl0LiAgV2l0aCAnLUMnLCB0aGUgZWRpdG9yIGlzIG5vdAorCWludm9rZWQ7IHdpdGggJy1jJyB0aGUgdXNlciBjYW4gZnVydGhlciBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlLgorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1hdXRob3IgPGF1dGhvcj46OgorCU92ZXJyaWRlIHRoZSBhdXRob3IgbmFtZSB1c2VkIGluIHRoZSBjb21taXQuICBVc2UKKwlgQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT5gIGZvcm1hdC4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gPG1zZz4gYXMgdGhlIGNvbW1pdCBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBTaWduZWQtb2ZmLWJ5IGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy0tbm8tdmVyaWZ5OjoKKwlUaGlzIG9wdGlvbiBieXBhc3NlcyB0aGUgcHJlLWNvbW1pdCBob29rLgorCVNlZSBhbHNvIGxpbms6aG9va3MuaHRtbFtob29rc10uCisKKy1lfC0tZWRpdDo6CisJVGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSBmaWxlIHdpdGggYC1GYCwgY29tbWFuZCBsaW5lIHdpdGgKKwlgLW1gLCBhbmQgZnJvbSBmaWxlIHdpdGggYC1DYCBhcmUgdXN1YWxseSB1c2VkIGFzIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZSB1bm1vZGlmaWVkLiAgVGhpcyBvcHRpb24gbGV0cyB5b3UKKwlmdXJ0aGVyIGVkaXQgdGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSB0aGVzZSBzb3VyY2VzLgorCistLWFtZW5kOjoKKworCVVzZWQgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2guIFByZXBhcmUgdGhlIHRyZWUKKwlvYmplY3QgeW91IHdvdWxkIHdhbnQgdG8gcmVwbGFjZSB0aGUgbGF0ZXN0IGNvbW1pdCBhcyB1c3VhbAorCSh0aGlzIGluY2x1ZGVzIHRoZSB1c3VhbCAtaS8tbyBhbmQgZXhwbGljaXQgcGF0aHMpLCBhbmQgdGhlCisJY29tbWl0IGxvZyBlZGl0b3IgaXMgc2VlZGVkIHdpdGggdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlCisJdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4gVGhlIGNvbW1pdCB5b3UgY3JlYXRlIHJlcGxhY2VzIHRoZQorCWN1cnJlbnQgdGlwIC0tIGlmIGl0IHdhcyBhIG1lcmdlLCBpdCB3aWxsIGhhdmUgdGhlIHBhcmVudHMgb2YKKwl0aGUgY3VycmVudCB0aXAgYXMgcGFyZW50cyAtLSBzbyB0aGUgY3VycmVudCB0b3AgY29tbWl0IGlzCisJZGlzY2FyZGVkLgorKworLS0KK0l0IGlzIGEgcm91Z2ggZXF1aXZhbGVudCBmb3I6CistLS0tLS0KKwkkIGdpdCByZXNldCAtLXNvZnQgSEVBRF4KKwkkIC4uLiBkbyBzb21ldGhpbmcgZWxzZSB0byBjb21lIHVwIHdpdGggdGhlIHJpZ2h0IHRyZWUgLi4uCisJJCBnaXQgY29tbWl0IC1jIE9SSUdfSEVBRAorCistLS0tLS0KK2J1dCBjYW4gYmUgdXNlZCB0byBhbWVuZCBhIG1lcmdlIGNvbW1pdC4KKy0tCisKKy1pfC0taW5jbHVkZTo6CisJQmVmb3JlIG1ha2luZyBhIGNvbW1pdCBvdXQgb2Ygc3RhZ2VkIGNvbnRlbnRzIHNvIGZhciwKKwlzdGFnZSB0aGUgY29udGVudHMgb2YgcGF0aHMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZQorCWFzIHdlbGwuICBUaGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgeW91IHdhbnQgdW5sZXNzIHlvdQorCWFyZSBjb25jbHVkaW5nIGEgY29uZmxpY3RlZCBtZXJnZS4KKworLXF8LS1xdWlldDo6CisJU3VwcHJlc3MgY29tbWl0IHN1bW1hcnkgbWVzc2FnZS4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT4uLi46OgorCVdoZW4gZmlsZXMgYXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBjb21tYW5kCisJY29tbWl0cyB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGZpbGVzLCB3aXRob3V0CisJcmVjb3JkaW5nIHRoZSBjaGFuZ2VzIGFscmVhZHkgc3RhZ2VkLiAgVGhlIGNvbnRlbnRzIG9mCisJdGhlc2UgZmlsZXMgYXJlIGFsc28gc3RhZ2VkIGZvciB0aGUgbmV4dCBjb21taXQgb24gdG9wCisJb2Ygd2hhdCBoYXZlIGJlZW4gc3RhZ2VkIGJlZm9yZS4KKworCitFWEFNUExFUworLS0tLS0tLS0KK1doZW4gcmVjb3JkaW5nIHlvdXIgb3duIHdvcmssIHRoZSBjb250ZW50cyBvZiBtb2RpZmllZCBmaWxlcyBpbgoreW91ciB3b3JraW5nIHRyZWUgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCB0byBhIHN0YWdpbmcgYXJlYQorY2FsbGVkIHRoZSAiaW5kZXgiIHdpdGggZ2l0bGluazpnaXQtYWRkWzFdLiAgUmVtb3ZhbAorb2YgYSBmaWxlIGlzIHN0YWdlZCB3aXRoIGdpdGxpbms6Z2l0LXJtWzFdLiAgQWZ0ZXIgYnVpbGRpbmcgdGhlCitzdGF0ZSB0byBiZSBjb21taXR0ZWQgaW5jcmVtZW50YWxseSB3aXRoIHRoZXNlIGNvbW1hbmRzLCBgZ2l0Citjb21taXRgICh3aXRob3V0IGFueSBwYXRobmFtZSBwYXJhbWV0ZXIpIGlzIHVzZWQgdG8gcmVjb3JkIHdoYXQKK2hhcyBiZWVuIHN0YWdlZCBzbyBmYXIuICBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIGZvcm0gb2YgdGhlCitjb21tYW5kLiAgQW4gZXhhbXBsZToKKworLS0tLS0tLS0tLS0tCiskIGVkaXQgaGVsbG8uYworJCBnaXQgcm0gZ29vZGJ5ZS5jCiskIGdpdCBhZGQgaGVsbG8uYworJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0KKworSW5zdGVhZCBvZiBzdGFnaW5nIGZpbGVzIGFmdGVyIGVhY2ggaW5kaXZpZHVhbCBjaGFuZ2UsIHlvdSBjYW4KK3RlbGwgYGdpdCBjb21taXRgIHRvIG5vdGljZSB0aGUgY2hhbmdlcyB0byB0aGUgZmlsZXMgd2hvc2UKK2NvbnRlbnRzIGFyZSB0cmFja2VkIGluCit5b3VyIHdvcmtpbmcgdHJlZSBhbmQgZG8gY29ycmVzcG9uZGluZyBgZ2l0IGFkZGAgYW5kIGBnaXQgcm1gCitmb3IgeW91LiAgVGhhdCBpcywgdGhpcyBleGFtcGxlIGRvZXMgdGhlIHNhbWUgYXMgdGhlIGVhcmxpZXIKK2V4YW1wbGUgaWYgdGhlcmUgaXMgbm8gb3RoZXIgY2hhbmdlIGluIHlvdXIgd29ya2luZyB0cmVlOgorCistLS0tLS0tLS0tLS0KKyQgZWRpdCBoZWxsby5jCiskIHJtIGdvb2RieWUuYworJCBnaXQgY29tbWl0IC1hCistLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgYGdpdCBjb21taXQgLWFgIGZpcnN0IGxvb2tzIGF0IHlvdXIgd29ya2luZyB0cmVlLAorbm90aWNlcyB0aGF0IHlvdSBoYXZlIG1vZGlmaWVkIGhlbGxvLmMgYW5kIHJlbW92ZWQgZ29vZGJ5ZS5jLAorYW5kIHBlcmZvcm1zIG5lY2Vzc2FyeSBgZ2l0IGFkZGAgYW5kIGBnaXQgcm1gIGZvciB5b3UuCisKK0FmdGVyIHN0YWdpbmcgY2hhbmdlcyB0byBtYW55IGZpbGVzLCB5b3UgY2FuIGFsdGVyIHRoZSBvcmRlciB0aGUKK2NoYW5nZXMgYXJlIHJlY29yZGVkIGluLCBieSBnaXZpbmcgcGF0aG5hbWVzIHRvIGBnaXQgY29tbWl0YC4KK1doZW4gcGF0aG5hbWVzIGFyZSBnaXZlbiwgdGhlIGNvbW1hbmQgbWFrZXMgYSBjb21taXQgdGhhdAorb25seSByZWNvcmRzIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIG5hbWVkIHBhdGhzOgorCistLS0tLS0tLS0tLS0KKyQgZWRpdCBoZWxsby5jIGhlbGxvLmgKKyQgZ2l0IGFkZCBoZWxsby5jIGhlbGxvLmgKKyQgZWRpdCBNYWtlZmlsZQorJCBnaXQgY29tbWl0IE1ha2VmaWxlCistLS0tLS0tLS0tLS0KKworVGhpcyBtYWtlcyBhIGNvbW1pdCB0aGF0IHJlY29yZHMgdGhlIG1vZGlmaWNhdGlvbiB0byBgTWFrZWZpbGVgLgorVGhlIGNoYW5nZXMgc3RhZ2VkIGZvciBgaGVsbG8uY2AgYW5kIGBoZWxsby5oYCBhcmUgbm90IGluY2x1ZGVkCitpbiB0aGUgcmVzdWx0aW5nIGNvbW1pdC4gIEhvd2V2ZXIsIHRoZWlyIGNoYW5nZXMgYXJlIG5vdCBsb3N0IC0tCit0aGV5IGFyZSBzdGlsbCBzdGFnZWQgYW5kIG1lcmVseSBoZWxkIGJhY2suICBBZnRlciB0aGUgYWJvdmUKK3NlcXVlbmNlLCBpZiB5b3UgZG86CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0KKwordGhpcyBzZWNvbmQgY29tbWl0IHdvdWxkIHJlY29yZCB0aGUgY2hhbmdlcyB0byBgaGVsbG8uY2AgYW5kCitgaGVsbG8uaGAgYXMgZXhwZWN0ZWQuCisKK0FmdGVyIGEgbWVyZ2UgKGluaXRpYXRlZCBieSBlaXRoZXIgZ2l0bGluazpnaXQtbWVyZ2VbMV0gb3IKK2dpdGxpbms6Z2l0LXB1bGxbMV0pIHN0b3BzIGJlY2F1c2Ugb2YgY29uZmxpY3RzLCBjbGVhbmx5IG1lcmdlZAorcGF0aHMgYXJlIGFscmVhZHkgc3RhZ2VkIHRvIGJlIGNvbW1pdHRlZCBmb3IgeW91LCBhbmQgcGF0aHMgdGhhdAorY29uZmxpY3RlZCBhcmUgbGVmdCBpbiB1bm1lcmdlZCBzdGF0ZS4gIFlvdSB3b3VsZCBoYXZlIHRvIGZpcnN0CitjaGVjayB3aGljaCBwYXRocyBhcmUgY29uZmxpY3Rpbmcgd2l0aCBnaXRsaW5rOmdpdC1zdGF0dXNbMV0KK2FuZCBhZnRlciBmaXhpbmcgdGhlbSBtYW51YWxseSBpbiB5b3VyIHdvcmtpbmcgdHJlZSwgeW91IHdvdWxkCitzdGFnZSB0aGUgcmVzdWx0IGFzIHVzdWFsIHdpdGggZ2l0bGluazpnaXQtYWRkWzFdOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHN0YXR1cyB8IGdyZXAgdW5tZXJnZWQKK3VubWVyZ2VkOiBoZWxsby5jCiskIGVkaXQgaGVsbG8uYworJCBnaXQgYWRkIGhlbGxvLmMKKy0tLS0tLS0tLS0tLQorCitBZnRlciByZXNvbHZpbmcgY29uZmxpY3RzIGFuZCBzdGFnaW5nIHRoZSByZXN1bHQsIGBnaXQgbHMtZmlsZXMgLXVgCit3b3VsZCBzdG9wIG1lbnRpb25pbmcgdGhlIGNvbmZsaWN0ZWQgcGF0aC4gIFdoZW4geW91IGFyZSBkb25lLAorcnVuIGBnaXQgY29tbWl0YCB0byBmaW5hbGx5IHJlY29yZCB0aGUgbWVyZ2U6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0KKworQXMgd2l0aCB0aGUgY2FzZSB0byByZWNvcmQgeW91ciBvd24gY2hhbmdlcywgeW91IGNhbiB1c2UgYC1hYAorb3B0aW9uIHRvIHNhdmUgdHlwaW5nLiAgT25lIGRpZmZlcmVuY2UgaXMgdGhhdCBkdXJpbmcgYSBtZXJnZQorcmVzb2x1dGlvbiwgeW91IGNhbm5vdCB1c2UgYGdpdCBjb21taXRgIHdpdGggcGF0aG5hbWVzIHRvCithbHRlciB0aGUgb3JkZXIgdGhlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCwgYmVjYXVzZSB0aGUgbWVyZ2UKK3Nob3VsZCBiZSByZWNvcmRlZCBhcyBhIHNpbmdsZSBjb21taXQuICBJbiBmYWN0LCB0aGUgY29tbWFuZAorcmVmdXNlcyB0byBydW4gd2hlbiBnaXZlbiBwYXRobmFtZXMgKGJ1dCBzZWUgYC1pYCBvcHRpb24pLgorCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworVGhvdWdoIG5vdCByZXF1aXJlZCwgaXQncyBhIGdvb2QgaWRlYSB0byBiZWdpbiB0aGUgY29tbWl0IG1lc3NhZ2UKK3dpdGggYSBzaW5nbGUgc2hvcnQgKGxlc3MgdGhhbiA1MCBjaGFyYWN0ZXIpIGxpbmUgc3VtbWFyaXppbmcgdGhlCitjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlbiBhIG1vcmUgdGhvcm91Z2ggZGVzY3JpcHRpb24uCitUb29scyB0aGF0IHR1cm4gY29tbWl0cyBpbnRvIGVtYWlsLCBmb3IgZXhhbXBsZSwgdXNlIHRoZSBmaXJzdCBsaW5lCitvbiB0aGUgU3ViamVjdDogbGluZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIGNvbW1pdCBpbiB0aGUgYm9keS4KKworaW5jbHVkZTo6aTE4bi50eHRbXQorCitFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IGVpdGhlciB0aGUgVklTVUFMIG9yIEVESVRPUiBlbnZpcm9ubWVudAordmFyaWFibGVzIGlzIHVzZWQgdG8gZWRpdCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLgorCitIT09LUworLS0tLS0KK1RoaXMgY29tbWFuZCBjYW4gcnVuIGBjb21taXQtbXNnYCwgYHByZS1jb21taXRgLCBhbmQKK2Bwb3N0LWNvbW1pdGAgaG9va3MuICBTZWUgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1hZGRbMV0sCitnaXRsaW5rOmdpdC1ybVsxXSwKK2dpdGxpbms6Z2l0LW12WzFdLAorZ2l0bGluazpnaXQtbWVyZ2VbMV0sCitnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbmZpZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3ZDdiYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbmZpZy50eHQKQEAgLTAsMCArMSwyOTYgQEAKK2dpdC1jb25maWcoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvbmZpZyAtIEdldCBhbmQgc2V0IHJlcG9zaXRvcnkgb3IgZ2xvYmFsIG9wdGlvbnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gLS1hZGQgbmFtZSB2YWx1ZQorJ2dpdC1jb25maWcnIFstLXN5c3RlbSB8IC0tZ2xvYmFsXSAtLXJlcGxhY2UtYWxsIG5hbWUgW3ZhbHVlIFt2YWx1ZV9yZWdleF1dCisnZ2l0LWNvbmZpZycgWy0tc3lzdGVtIHwgLS1nbG9iYWxdIFt0eXBlXSAtLWdldCBuYW1lIFt2YWx1ZV9yZWdleF0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gW3R5cGVdIC0tZ2V0LWFsbCBuYW1lIFt2YWx1ZV9yZWdleF0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gW3R5cGVdIC0tZ2V0LXJlZ2V4cCBuYW1lX3JlZ2V4IFt2YWx1ZV9yZWdleF0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gLS11bnNldCBuYW1lIFt2YWx1ZV9yZWdleF0KKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gLS11bnNldC1hbGwgbmFtZSBbdmFsdWVfcmVnZXhdCisnZ2l0LWNvbmZpZycgWy0tc3lzdGVtIHwgLS1nbG9iYWxdIC0tcmVuYW1lLXNlY3Rpb24gb2xkX25hbWUgbmV3X25hbWUKKydnaXQtY29uZmlnJyBbLS1zeXN0ZW0gfCAtLWdsb2JhbF0gLS1yZW1vdmUtc2VjdGlvbiBuYW1lCisnZ2l0LWNvbmZpZycgWy0tc3lzdGVtIHwgLS1nbG9iYWxdIC1sIHwgLS1saXN0CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorWW91IGNhbiBxdWVyeS9zZXQvcmVwbGFjZS91bnNldCBvcHRpb25zIHdpdGggdGhpcyBjb21tYW5kLiBUaGUgbmFtZSBpcworYWN0dWFsbHkgdGhlIHNlY3Rpb24gYW5kIHRoZSBrZXkgc2VwYXJhdGVkIGJ5IGEgZG90LCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUKK2VzY2FwZWQuCisKK011bHRpcGxlIGxpbmVzIGNhbiBiZSBhZGRlZCB0byBhbiBvcHRpb24gYnkgdXNpbmcgdGhlICctLWFkZCcgb3B0aW9uLgorSWYgeW91IHdhbnQgdG8gdXBkYXRlIG9yIHVuc2V0IGFuIG9wdGlvbiB3aGljaCBjYW4gb2NjdXIgb24gbXVsdGlwbGUKK2xpbmVzLCBhIFBPU0lYIHJlZ2V4cCBgdmFsdWVfcmVnZXhgIG5lZWRzIHRvIGJlIGdpdmVuLiAgT25seSB0aGUKK2V4aXN0aW5nIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSByZWdleHAgYXJlIHVwZGF0ZWQgb3IgdW5zZXQuICBJZgoreW91IHdhbnQgdG8gaGFuZGxlIHRoZSBsaW5lcyB0aGF0IGRvICpub3QqIG1hdGNoIHRoZSByZWdleCwganVzdAorcHJlcGVuZCBhIHNpbmdsZSBleGNsYW1hdGlvbiBtYXJrIGluIGZyb250IChzZWUgYWxzbyA8PEVYQU1QTEVTPj4pLgorCitUaGUgdHlwZSBzcGVjaWZpZXIgY2FuIGJlIGVpdGhlciAnLS1pbnQnIG9yICctLWJvb2wnLCB3aGljaCB3aWxsIG1ha2UKKydnaXQtY29uZmlnJyBlbnN1cmUgdGhhdCB0aGUgdmFyaWFibGUocykgYXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZAorY29udmVydCB0aGUgdmFsdWUgdG8gdGhlIGNhbm9uaWNhbCBmb3JtIChzaW1wbGUgZGVjaW1hbCBudW1iZXIgZm9yIGludCwKK2EgInRydWUiIG9yICJmYWxzZSIgc3RyaW5nIGZvciBib29sKS4gIFR5cGUgc3BlY2lmaWVycyBjdXJyZW50bHkgb25seQordGFrZSBlZmZlY3QgZm9yIHJlYWRpbmcgb3BlcmF0aW9ucy4gIElmIG5vIHR5cGUgc3BlY2lmaWVyIGlzIHBhc3NlZCwKK25vIGNoZWNrcyBvciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgdmFsdWUuCisKK1RoaXMgY29tbWFuZCB3aWxsIGZhaWwgaWY6CisKKy4gVGhlIC5naXQvY29uZmlnIGZpbGUgaXMgaW52YWxpZCwKKy4gQ2FuIG5vdCB3cml0ZSB0byAuZ2l0L2NvbmZpZywKKy4gbm8gc2VjdGlvbiB3YXMgcHJvdmlkZWQsCisuIHRoZSBzZWN0aW9uIG9yIGtleSBpcyBpbnZhbGlkLAorLiB5b3UgdHJ5IHRvIHVuc2V0IGFuIG9wdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCwKKy4geW91IHRyeSB0byB1bnNldC9zZXQgYW4gb3B0aW9uIGZvciB3aGljaCBtdWx0aXBsZSBsaW5lcyBtYXRjaCwgb3IKKy4geW91IHVzZSAnLS1nbG9iYWwnIG9wdGlvbiB3aXRob3V0ICRIT01FIGJlaW5nIHByb3Blcmx5IHNldC4KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tcmVwbGFjZS1hbGw6OgorCURlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVwbGFjZSBhdCBtb3N0IG9uZSBsaW5lLiBUaGlzIHJlcGxhY2VzCisJYWxsIGxpbmVzIG1hdGNoaW5nIHRoZSBrZXkgKGFuZCBvcHRpb25hbGx5IHRoZSB2YWx1ZV9yZWdleCkuCisKKy0tYWRkOjoKKwlBZGRzIGEgbmV3IGxpbmUgdG8gdGhlIG9wdGlvbiB3aXRob3V0IGFsdGVyaW5nIGFueSBleGlzdGluZworCXZhbHVlcy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgcHJvdmlkaW5nICdeJCcgYXMgdGhlIHZhbHVlX3JlZ2V4LgorCistLWdldDo6CisJR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgKG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSByZWdleAorCW1hdGNoaW5nIHRoZSB2YWx1ZSkuIFJldHVybnMgZXJyb3IgY29kZSAxIGlmIHRoZSBrZXkgd2FzIG5vdAorCWZvdW5kIGFuZCBlcnJvciBjb2RlIDIgaWYgbXVsdGlwbGUga2V5IHZhbHVlcyB3ZXJlIGZvdW5kLgorCistLWdldC1hbGw6OgorCUxpa2UgZ2V0LCBidXQgZG9lcyBub3QgZmFpbCBpZiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhlIGtleQorCWlzIG5vdCBleGFjdGx5IG9uZS4KKworLS1nZXQtcmVnZXhwOjoKKwlMaWtlIC0tZ2V0LWFsbCwgYnV0IGludGVycHJldHMgdGhlIG5hbWUgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisJQWxzbyBvdXRwdXRzIHRoZSBrZXkgbmFtZXMuCisKKy0tZ2xvYmFsOjoKKwlGb3Igd3JpdGluZyBvcHRpb25zOiB3cml0ZSB0byBnbG9iYWwgfi8uZ2l0Y29uZmlnIGZpbGUgcmF0aGVyIHRoYW4KKwl0aGUgcmVwb3NpdG9yeSAuZ2l0L2NvbmZpZy4KKysKK0ZvciByZWFkaW5nIG9wdGlvbnM6IHJlYWQgb25seSBmcm9tIGdsb2JhbCB+Ly5naXRjb25maWcgcmF0aGVyIHRoYW4KK2Zyb20gYWxsIGF2YWlsYWJsZSBmaWxlcy4KKysKK1NlZSBhbHNvIDw8RklMRVM+Pi4KKworLS1zeXN0ZW06OgorCUZvciB3cml0aW5nIG9wdGlvbnM6IHdyaXRlIHRvIHN5c3RlbS13aWRlICQocHJlZml4KS9ldGMvZ2l0Y29uZmlnCisJcmF0aGVyIHRoYW4gdGhlIHJlcG9zaXRvcnkgLmdpdC9jb25maWcuCisrCitGb3IgcmVhZGluZyBvcHRpb25zOiByZWFkIG9ubHkgZnJvbSBzeXN0ZW0td2lkZSAkKHByZWZpeCkvZXRjL2dpdGNvbmZpZworcmF0aGVyIHRoYW4gZnJvbSBhbGwgYXZhaWxhYmxlIGZpbGVzLgorKworU2VlIGFsc28gPDxGSUxFUz4+LgorCistLXJlbW92ZS1zZWN0aW9uOjoKKwlSZW1vdmUgdGhlIGdpdmVuIHNlY3Rpb24gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCistLXJlbmFtZS1zZWN0aW9uOjoKKwlSZW5hbWUgdGhlIGdpdmVuIHNlY3Rpb24gdG8gYSBuZXcgbmFtZS4KKworLS11bnNldDo6CisJUmVtb3ZlIHRoZSBsaW5lIG1hdGNoaW5nIHRoZSBrZXkgZnJvbSBjb25maWcgZmlsZS4KKworLS11bnNldC1hbGw6OgorCVJlbW92ZSBhbGwgbGluZXMgbWF0Y2hpbmcgdGhlIGtleSBmcm9tIGNvbmZpZyBmaWxlLgorCistbCwgLS1saXN0OjoKKwlMaXN0IGFsbCB2YXJpYWJsZXMgc2V0IGluIGNvbmZpZyBmaWxlLgorCistLWJvb2w6OgorCWdpdC1jb25maWcgd2lsbCBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGlzICJ0cnVlIiBvciAiZmFsc2UiCisKKy0taW50OjoKKwlnaXQtY29uZmlnIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBhIHNpbXBsZQorCWRlY2ltYWwgbnVtYmVyLiAgQW4gb3B0aW9uYWwgdmFsdWUgc3VmZml4IG9mICdrJywgJ20nLCBvciAnZycKKwlpbiB0aGUgY29uZmlnIGZpbGUgd2lsbCBjYXVzZSB0aGUgdmFsdWUgdG8gYmUgbXVsdGlwbGllZAorCWJ5IDEwMjQsIDEwNDg1NzYsIG9yIDEwNzM3NDE4MjQgcHJpb3IgdG8gb3V0cHV0LgorCisKK1tbRklMRVNdXQorRklMRVMKKy0tLS0tCisKK1RoZXJlIGFyZSB0aHJlZSBmaWxlcyB3aGVyZSBnaXQtY29uZmlnIHdpbGwgc2VhcmNoIGZvciBjb25maWd1cmF0aW9uCitvcHRpb25zOgorCisuZ2l0L2NvbmZpZzo6CisJUmVwb3NpdG9yeSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUuIChUaGUgZmlsZW5hbWUgaXMKKwlvZiBjb3Vyc2UgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCwgbm90IHRoZSB3b3JraW5nCisJZGlyZWN0b3J5LikKKworfi8uZ2l0Y29uZmlnOjoKKwlVc2VyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZS4gQWxzbyBjYWxsZWQgImdsb2JhbCIKKwljb25maWd1cmF0aW9uIGZpbGUuCisKKyQocHJlZml4KS9ldGMvZ2l0Y29uZmlnOjoKKwlTeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGUuCisKK0lmIG5vIGZ1cnRoZXIgb3B0aW9ucyBhcmUgZ2l2ZW4sIGFsbCByZWFkaW5nIG9wdGlvbnMgd2lsbCByZWFkIGFsbCBvZiB0aGVzZQorZmlsZXMgdGhhdCBhcmUgYXZhaWxhYmxlLiBJZiB0aGUgZ2xvYmFsIG9yIHRoZSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uCitmaWxlIGFyZSBub3QgYXZhaWxhYmxlIHRoZXkgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uCitmaWxlIGlzIG5vdCBhdmFpbGFibGUgb3IgcmVhZGFibGUsIGdpdC1jb25maWcgd2lsbCBleGl0IHdpdGggYSBub24temVybworZXJyb3IgY29kZS4gSG93ZXZlciwgaW4gbmVpdGhlciBjYXNlIHdpbGwgYW4gZXJyb3IgbWVzc2FnZSBiZSBpc3N1ZWQuCisKK0FsbCB3cml0aW5nIG9wdGlvbnMgd2lsbCBwZXIgZGVmYXVsdCB3cml0ZSB0byB0aGUgcmVwb3NpdG9yeSBzcGVjaWZpYworY29uZmlndXJhdGlvbiBmaWxlLiBOb3RlIHRoYXQgdGhpcyBhbHNvIGFmZmVjdHMgb3B0aW9ucyBsaWtlICctLXJlcGxhY2UtYWxsJworYW5kICctLXVuc2V0Jy4gKmdpdC1jb25maWcgd2lsbCBvbmx5IGV2ZXIgY2hhbmdlIG9uZSBmaWxlIGF0IGEgdGltZSouCisKK1lvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgcnVsZXMgZWl0aGVyIGJ5IGNvbW1hbmQgbGluZSBvcHRpb25zIG9yIGJ5IGVudmlyb25tZW50Cit2YXJpYWJsZXMuIFRoZSAnLS1nbG9iYWwnIGFuZCB0aGUgJy0tc3lzdGVtJyBvcHRpb25zIHdpbGwgbGltaXQgdGhlIGZpbGUgdXNlZAordG8gdGhlIGdsb2JhbCBvciBzeXN0ZW0td2lkZSBmaWxlIHJlc3BlY3RpdmVseS4gVGhlIEdJVF9DT05GSUcgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGhhcyBhIHNpbWlsYXIgZWZmZWN0LCBidXQgeW91IGNhbiBzcGVjaWZ5IGFueSBmaWxlbmFtZSB5b3Ugd2FudC4KKworVGhlIEdJVF9DT05GSUdfTE9DQUwgZW52aXJvbm1lbnQgdmFyaWFibGUgb24gdGhlIG90aGVyIGhhbmQgb25seSBjaGFuZ2VzCit0aGUgbmFtZSB1c2VkIGluc3RlYWQgb2YgdGhlIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUgZ2xvYmFsIGFuZAordGhlIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2lsbCBzdGlsbCBiZSByZWFkLiAoRm9yIHdyaXRpbmcgb3B0aW9ucwordGhpcyB3aWxsIG9idmlvdXNseSByZXN1bHQgaW4gdGhlIHNhbWUgYmVoYXZpb3IgYXMgdXNpbmcgR0lUX0NPTkZJRy4pCisKKworRU5WSVJPTk1FTlQKKy0tLS0tLS0tLS0tCisKK0dJVF9DT05GSUc6OgorCVRha2UgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZ2l2ZW4gZmlsZSBpbnN0ZWFkIG9mIC5naXQvY29uZmlnLgorCVVzaW5nIHRoZSAiLS1nbG9iYWwiIG9wdGlvbiBmb3JjZXMgdGhpcyB0byB+Ly5naXRjb25maWcuIFVzaW5nIHRoZQorCSItLXN5c3RlbSIgb3B0aW9uIGZvcmNlcyB0aGlzIHRvICQocHJlZml4KS9ldGMvZ2l0Y29uZmlnLgorCitHSVRfQ09ORklHX0xPQ0FMOjoKKwlUYWtlIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuIGZpbGUgaW5zdGVhZCBpZiAuZ2l0L2NvbmZpZy4KKwlTdGlsbCByZWFkIHRoZSBnbG9iYWwgYW5kIHRoZSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGVzLCB0aG91Z2guCisKK1NlZSBhbHNvIDw8RklMRVM+Pi4KKworCitbW0VYQU1QTEVTXV0KK0VYQU1QTEVTCistLS0tLS0tLQorCitHaXZlbiBhIC5naXQvY29uZmlnIGxpa2UgdGhpczoKKworCSMKKwkjIFRoaXMgaXMgdGhlIGNvbmZpZyBmaWxlLCBhbmQKKwkjIGEgJyMnIG9yICc7JyBjaGFyYWN0ZXIgaW5kaWNhdGVzCisJIyBhIGNvbW1lbnQKKwkjCisKKwk7IGNvcmUgdmFyaWFibGVzCisJW2NvcmVdCisJCTsgRG9uJ3QgdHJ1c3QgZmlsZSBtb2RlcworCQlmaWxlbW9kZSA9IGZhbHNlCisKKwk7IE91ciBkaWZmIGFsZ29yaXRobQorCVtkaWZmXQorCQlleHRlcm5hbCA9ICIvdXNyL2xvY2FsL2Jpbi9nbnUtZGlmZiAtdSIKKwkJcmVuYW1lcyA9IHRydWUKKworCTsgUHJveHkgc2V0dGluZ3MKKwlbY29yZV0KKwkJZ2l0cHJveHk9InNzaCIgZm9yICJzc2g6Ly9rZXJuZWwub3JnLyIKKwkJZ2l0cHJveHk9InByb3h5LWNvbW1hbmQiIGZvciBrZXJuZWwub3JnCisJCWdpdHByb3h5PSJteXByb3RvY29sLWNvbW1hbmQiIGZvciAibXk6Ly8iCisJCWdpdHByb3h5PWRlZmF1bHQtcHJveHkgOyBmb3IgYWxsIHRoZSByZXN0CisKK3lvdSBjYW4gc2V0IHRoZSBmaWxlbW9kZSB0byB0cnVlIHdpdGgKKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgY29yZS5maWxlbW9kZSB0cnVlCistLS0tLS0tLS0tLS0KKworVGhlIGh5cG90aGV0aWNhbCBwcm94eSBjb21tYW5kIGVudHJpZXMgYWN0dWFsbHkgaGF2ZSBhIHBvc3RmaXggdG8gZGlzY2Vybgord2hhdCBVUkwgdGhleSBhcHBseSB0by4gSGVyZSBpcyBob3cgdG8gY2hhbmdlIHRoZSBlbnRyeSBmb3Iga2VybmVsLm9yZwordG8gInNzaCIuCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIGNvcmUuZ2l0cHJveHkgJyJzc2giIGZvciBrZXJuZWwub3JnJyAnZm9yIGtlcm5lbC5vcmckJworLS0tLS0tLS0tLS0tCisKK1RoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgdGhlIGtleS92YWx1ZSBwYWlyIGZvciBrZXJuZWwub3JnIGlzIHJlcGxhY2VkLgorCitUbyBkZWxldGUgdGhlIGVudHJ5IGZvciByZW5hbWVzLCBkbworCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyAtLXVuc2V0IGRpZmYucmVuYW1lcworLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IHRvIGRlbGV0ZSBhbiBlbnRyeSBmb3IgYSBtdWx0aXZhciAobGlrZSBjb3JlLmdpdHByb3h5IGFib3ZlKSwKK3lvdSBoYXZlIHRvIHByb3ZpZGUgYSByZWdleCBtYXRjaGluZyB0aGUgdmFsdWUgb2YgZXhhY3RseSBvbmUgbGluZS4KKworVG8gcXVlcnkgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGtleSwgZG8KKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgLS1nZXQgY29yZS5maWxlbW9kZQorLS0tLS0tLS0tLS0tCisKK29yCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvciwgdG8gcXVlcnkgYSBtdWx0aXZhcjoKKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgLS1nZXQgY29yZS5naXRwcm94eSAiZm9yIGtlcm5lbC5vcmckIgorLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IHRvIGtub3cgYWxsIHRoZSB2YWx1ZXMgZm9yIGEgbXVsdGl2YXIsIGRvOgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyAtLWdldC1hbGwgY29yZS5naXRwcm94eQorLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBsaWtlIHRvIGxpdmUgZGFuZ2Vyb3VzLCB5b3UgY2FuIHJlcGxhY2UgKmFsbCogY29yZS5naXRwcm94eSBieSBhCituZXcgb25lIHdpdGgKKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgLS1yZXBsYWNlLWFsbCBjb3JlLmdpdHByb3h5IHNzaAorLS0tLS0tLS0tLS0tCisKK0hvd2V2ZXIsIGlmIHlvdSByZWFsbHkgb25seSB3YW50IHRvIHJlcGxhY2UgdGhlIGxpbmUgZm9yIHRoZSBkZWZhdWx0IHByb3h5LAoraS5lLiB0aGUgb25lIHdpdGhvdXQgYSAiZm9yIC4uLiIgcG9zdGZpeCwgZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgY29yZS5naXRwcm94eSBzc2ggJyEgZm9yICcKKy0tLS0tLS0tLS0tLQorCitUbyBhY3R1YWxseSBtYXRjaCBvbmx5IHZhbHVlcyB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmssIHlvdSBoYXZlIHRvCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIHNlY3Rpb24ua2V5IHZhbHVlICdbIV0nCistLS0tLS0tLS0tLS0KKworVG8gYWRkIGEgbmV3IHByb3h5LCB3aXRob3V0IGFsdGVyaW5nIGFueSBvZiB0aGUgZXhpc3Rpbmcgb25lcywgdXNlCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIGNvcmUuZ2l0cHJveHkgJyJwcm94eSIgZm9yIGV4YW1wbGUuY29tJworLS0tLS0tLS0tLS0tCisKKworaW5jbHVkZTo6Y29uZmlnLnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4sIFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY29udmVydC1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbnZlcnQtb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyMjBjMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbnZlcnQtb2JqZWN0cy50eHQKQEAgLTAsMCArMSwyOSBAQAorZ2l0LWNvbnZlcnQtb2JqZWN0cygxKQorPT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY29udmVydC1vYmplY3RzIC0gQ29udmVydHMgb2xkLXN0eWxlIGdpdCByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvbnZlcnQtb2JqZWN0cycKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb252ZXJ0cyBvbGQtc3R5bGUgZ2l0IHJlcG9zaXRvcnkgdG8gdGhlIGxhdGVzdCBmb3JtYXQKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY291bnQtb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWM4YzkyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY291bnQtb2JqZWN0cy50eHQKQEAgLTAsMCArMSwzOCBAQAorZ2l0LWNvdW50LW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb3VudC1vYmplY3RzIC0gQ291bnQgdW5wYWNrZWQgbnVtYmVyIG9mIG9iamVjdHMgYW5kIHRoZWlyIGRpc2sgY29uc3VtcHRpb24KKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvdW50LW9iamVjdHMnIFstdl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvdW50cyB0aGUgbnVtYmVyIG9mIHVucGFja2VkIG9iamVjdCBmaWxlcyBhbmQgZGlzayBzcGFjZSBjb25zdW1lZCBieQordGhlbSwgdG8gaGVscCB5b3UgZGVjaWRlIHdoZW4gaXQgaXMgYSBnb29kIHRpbWUgdG8gcmVwYWNrLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlJbiBhZGRpdGlvbiB0byB0aGUgbnVtYmVyIG9mIGxvb3NlIG9iamVjdHMgYW5kIGRpc2sKKwlzcGFjZSBjb25zdW1lZCwgaXQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIGluLXBhY2sKKwlvYmplY3RzLCBudW1iZXIgb2YgcGFja3MsIGFuZCBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZQorCXJlbW92ZWQgYnkgcnVubmluZyBgZ2l0LXBydW5lLXBhY2tlZGAuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2V4cG9ydGNvbW1pdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNleHBvcnRjb21taXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTkwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNleHBvcnRjb21taXQudHh0CkBAIC0wLDAgKzEsOTUgQEAKK2dpdC1jdnNleHBvcnRjb21taXQoMSkKKz09PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWN2c2V4cG9ydGNvbW1pdCAtIEV4cG9ydCBhIHNpbmdsZSBjb21taXQgdG8gYSBDVlMgY2hlY2tvdXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY3ZzZXhwb3J0Y29tbWl0JyBbLWhdIFstdl0gWy1jXSBbLVBdIFstcF0gWy1hXSBbLWQgY3Zzcm9vdF0gWy1mXSBbLW0gbXNncHJlZml4XSBbUEFSRU5UQ09NTUlUXSBDT01NSVRJRAorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRXhwb3J0cyBhIGNvbW1pdCBmcm9tIEdJVCB0byBhIENWUyBjaGVja291dCwgbWFraW5nIGl0IGVhc2llcgordG8gbWVyZ2UgcGF0Y2hlcyBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgaW50byBhIENWUyByZXBvc2l0b3J5LiAKKworRXhlY3V0ZSBpdCBmcm9tIHRoZSByb290IG9mIHRoZSBDVlMgd29ya2luZyBjb3B5LiBHSVRfRElSIG11c3QgYmUgZGVmaW5lZC4gCitTZWUgZXhhbXBsZXMgYmVsb3cuCisKK0l0IGRvZXMgaXRzIGJlc3QgdG8gZG8gdGhlIHNhZmUgdGhpbmcsIGl0IHdpbGwgY2hlY2sgdGhhdCB0aGUgZmlsZXMgYXJlIAordW5jaGFuZ2VkIGFuZCB1cCB0byBkYXRlIGluIHRoZSBDVlMgY2hlY2tvdXQsIGFuZCBpdCB3aWxsIG5vdCBhdXRvY29tbWl0IAorYnkgZGVmYXVsdC4KKworU3VwcG9ydHMgZmlsZSBhZGRpdGlvbnMsIHJlbW92YWxzLCBhbmQgY29tbWl0cyB0aGF0IGFmZmVjdCBiaW5hcnkgZmlsZXMuCisKK0lmIHRoZSBjb21taXQgaXMgYSBtZXJnZSBjb21taXQsIHlvdSBtdXN0IHRlbGwgZ2l0LWN2c2V4cG9ydGNvbW1pdCB3aGF0IHBhcmVudAorc2hvdWxkIHRoZSBjaGFuZ2VzZXQgYmUgZG9uZSBhZ2FpbnN0LiAKKworT1BUSU9OUworLS0tLS0tLQorCistYzo6CisJQ29tbWl0IGF1dG9tYXRpY2FsbHkgaWYgdGhlIHBhdGNoIGFwcGxpZWQgY2xlYW5seS4gSXQgd2lsbCBub3QKKwljb21taXQgaWYgYW55IGh1bmtzIGZhaWwgdG8gYXBwbHkgb3IgdGhlcmUgd2VyZSBvdGhlciBwcm9ibGVtcy4KKworLXA6OgorCUJlIHBlZGFudGljIChwYXJhbm9pZCkgd2hlbiBhcHBseWluZyBwYXRjaGVzLiBJbnZva2VzIHBhdGNoIHdpdGgKKwktLWZ1eno9MAorCistYTo6CisJQWRkIGF1dGhvcnNoaXAgaW5mb3JtYXRpb24uIEFkZHMgQXV0aG9yIGxpbmUsIGFuZCBDb21taXR0ZXIgKGlmCisJZGlmZmVyZW50IGZyb20gQXV0aG9yKSB0byB0aGUgbWVzc2FnZS4KKworLWQ6OgorCVNldCBhbiBhbHRlcm5hdGl2ZSBDVlNST09UIHRvIHVzZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIENWUworCS1kIHBhcmFtZXRlci4gIFVzdWFsbHkgdXNlcnMgd2lsbCBub3Qgd2FudCB0byBzZXQgdGhpcywgZXhjZXB0CisJaWYgdXNpbmcgQ1ZTIGluIGFuIGFzeW1tZXRyaWMgZmFzaGlvbi4KKworLWY6OgorCUZvcmNlIHRoZSBtZXJnZSBldmVuIGlmIHRoZSBmaWxlcyBhcmUgbm90IHVwIHRvIGRhdGUuCisKKy1QOjoKKwlGb3JjZSB0aGUgcGFyZW50IGNvbW1pdCwgZXZlbiBpZiBpdCBpcyBub3QgYSBkaXJlY3QgcGFyZW50LgorCistbTo6CisJUHJlcGVuZCB0aGUgY29tbWl0IG1lc3NhZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgcHJlZml4LiAKKwlVc2VmdWwgZm9yIHBhdGNoIHNlcmllcyBhbmQgdGhlIGxpa2UuCisKKy12OjoKKwlWZXJib3NlLgorCitFWEFNUExFUworLS0tLS0tLS0KKworTWVyZ2Ugb25lIHBhdGNoIGludG8gQ1ZTOjoKKysKKy0tLS0tLS0tLS0tLQorJCBleHBvcnQgR0lUX0RJUj1+L3Byb2plY3QvLmdpdAorJCBjZCB+L3Byb2plY3RfY3ZzX2NoZWNrb3V0CiskIGdpdC1jdnNleHBvcnRjb21taXQgLXYgPGNvbW1pdC1zaGExPgorJCBjdnMgY29tbWl0IC1GIC5tZ3MgPGZpbGVzPiAKKy0tLS0tLS0tLS0tLQorCitNZXJnZSBwZW5kaW5nIHBhdGNoZXMgaW50byBDVlMgYXV0b21hdGljYWxseSAtLSBvbmx5IGlmIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmc6OgorKworLS0tLS0tLS0tLS0tCiskIGV4cG9ydCBHSVRfRElSPX4vcHJvamVjdC8uZ2l0CiskIGNkIH4vcHJvamVjdF9jdnNfY2hlY2tvdXQKKyQgZ2l0LWNoZXJyeSBjdnNoZWFkIG15aGVhZCB8IHNlZCAtbiAncy9eKyAvL3AnIHwgeGFyZ3MgLWwxIGdpdC1jdnNleHBvcnRjb21taXQgLWMgLXAgLXYKKy0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmU4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQudHh0CkBAIC0wLDAgKzEsMTU5IEBACitnaXQtY3ZzaW1wb3J0KDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jdnNpbXBvcnQgLSBTYWx2YWdlIHlvdXIgZGF0YSBvdXQgb2YgYW5vdGhlciBTQ00gcGVvcGxlIGxvdmUgdG8gaGF0ZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jdnNpbXBvcnQnIFstbyA8YnJhbmNoLWZvci1IRUFEPl0gWy1oXSBbLXZdIFstZCA8Q1ZTUk9PVD5dCisJICAgICAgWy1BIDxhdXRob3ItY29udi1maWxlPl0gWy1wIDxvcHRpb25zLWZvci1jdnNwcz5dIFstUCA8ZmlsZT5dCisJICAgICAgWy1DIDxnaXRfcmVwb3NpdG9yeT5dIFsteiA8ZnV6ej5dIFstaV0gWy1rXSBbLXVdIFstcyA8c3Vic3Q+XQorCSAgICAgIFstYV0gWy1tXSBbLU0gPHJlZ2V4Pl0gWy1TIDxyZWdleD5dIFstTCA8Y29tbWl0bGltaXQ+XQorCSAgICAgIFs8Q1ZTX21vZHVsZT5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgQ1ZTIHJlcG9zaXRvcnkgaW50byBnaXQuIEl0IHdpbGwgZWl0aGVyIGNyZWF0ZSBhIG5ldworcmVwb3NpdG9yeSwgb3IgaW5jcmVtZW50YWxseSBpbXBvcnQgaW50byBhbiBleGlzdGluZyBvbmUuCisKK1NwbGl0dGluZyB0aGUgQ1ZTIGxvZyBpbnRvIHBhdGNoIHNldHMgaXMgZG9uZSBieSAnY3ZzcHMnLgorQXQgbGVhc3QgdmVyc2lvbiAyLjEgaXMgcmVxdWlyZWQuCisKK1lvdSBzaG91bGQgKm5ldmVyKiBkbyBhbnkgd29yayBvZiB5b3VyIG93biBvbiB0aGUgYnJhbmNoZXMgdGhhdCBhcmUKK2NyZWF0ZWQgYnkgZ2l0LWN2c2ltcG9ydC4gVGhlIGluaXRpYWwgaW1wb3J0IHdpbGwgY3JlYXRlIGFuZCBwb3B1bGF0ZSBhCisibWFzdGVyIiBicmFuY2ggZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkncyBtYWluIGJyYW5jaCB3aGljaCB5b3UncmUgZnJlZQordG8gd29yayB3aXRoOyBhZnRlciB0aGF0LCB5b3UgbmVlZCB0byAnZ2l0IG1lcmdlJyBpbmNyZW1lbnRhbCBpbXBvcnRzLCBvcgorYW55IENWUyBicmFuY2hlcywgeW91cnNlbGYuCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlWZXJib3NpdHk6IGxldCAnY3ZzaW1wb3J0JyByZXBvcnQgd2hhdCBpdCBpcyBkb2luZy4KKworLWQgPENWU1JPT1Q+OjoKKwlUaGUgcm9vdCBvZiB0aGUgQ1ZTIGFyY2hpdmUuIE1heSBiZSBsb2NhbCAoYSBzaW1wbGUgcGF0aCkgb3IgcmVtb3RlOworCWN1cnJlbnRseSwgb25seSB0aGUgOmxvY2FsOiwgOmV4dDogYW5kIDpwc2VydmVyOiBhY2Nlc3MgbWV0aG9kcyAKKwlhcmUgc3VwcG9ydGVkLiBJZiBub3QgZ2l2ZW4sIGdpdC1jdnNpbXBvcnQgd2lsbCB0cnkgdG8gcmVhZCBpdAorCWZyb20gYENWUy9Sb290YC4gSWYgbm8gc3VjaCBmaWxlIGV4aXN0cywgaXQgY2hlY2tzIGZvciB0aGUKKwlgQ1ZTUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKzxDVlNfbW9kdWxlPjo6CisJVGhlIENWUyBtb2R1bGUgeW91IHdhbnQgdG8gaW1wb3J0LiBSZWxhdGl2ZSB0byA8Q1ZTUk9PVD4uCisJSWYgbm90IGdpdmVuLCBnaXQtY3ZzaW1wb3J0IHRyaWVzIHRvIHJlYWQgaXQgZnJvbQorCWBDVlMvUmVwb3NpdG9yeWAuCisKKy1DIDx0YXJnZXQtZGlyPjo6CisgICAgICAgIFRoZSBnaXQgcmVwb3NpdG9yeSB0byBpbXBvcnQgdG8uICBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QKKyAgICAgICAgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIERlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCistbyA8YnJhbmNoLWZvci1IRUFEPjo6CisJVGhlICdIRUFEJyBicmFuY2ggZnJvbSBDVlMgaXMgaW1wb3J0ZWQgdG8gdGhlICdvcmlnaW4nIGJyYW5jaCB3aXRoaW4KKwl0aGUgZ2l0IHJlcG9zaXRvcnksIGFzICdIRUFEJyBhbHJlYWR5IGhhcyBhIHNwZWNpYWwgbWVhbmluZyBmb3IgZ2l0LgorCVVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBpbXBvcnQgaW50byBhIGRpZmZlcmVudCBicmFuY2guCisrCitVc2UgJy1vIG1hc3RlcicgZm9yIGNvbnRpbnVpbmcgYW4gaW1wb3J0IHRoYXQgd2FzIGluaXRpYWxseSBkb25lIGJ5Cit0aGUgb2xkIGN2czJnaXQgdG9vbC4KKworLWk6OgorCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKwllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorCW5vdCBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KKworLWs6OgorCUtpbGwga2V5d29yZHM6IHdpbGwgZXh0cmFjdCBmaWxlcyB3aXRoICcta2snIGZyb20gdGhlIENWUyBhcmNoaXZlCisJdG8gYXZvaWQgbm9pc3kgY2hhbmdlc2V0cy4gSGlnaGx5IHJlY29tbWVuZGVkLCBidXQgb2ZmIGJ5IGRlZmF1bHQKKwl0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggZWFybHkgaW1wb3J0ZWQgdHJlZXMuIAorCistdTo6CisJQ29udmVydCB1bmRlcnNjb3JlcyBpbiB0YWcgYW5kIGJyYW5jaCBuYW1lcyB0byBkb3RzLgorCistcyA8c3Vic3Q+OjoKKwlTdWJzdGl0dXRlIHRoZSBjaGFyYWN0ZXIgIi8iIGluIGJyYW5jaCBuYW1lcyB3aXRoIDxzdWJzdD4KKworLXAgPG9wdGlvbnMtZm9yLWN2c3BzPjo6CisJQWRkaXRpb25hbCBvcHRpb25zIGZvciBjdnNwcy4KKwlUaGUgb3B0aW9ucyAnLXUnIGFuZCAnLUEnIGFyZSBpbXBsaWNpdCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUuCisrCitJZiB5b3UgbmVlZCB0byBwYXNzIG11bHRpcGxlIG9wdGlvbnMsIHNlcGFyYXRlIHRoZW0gd2l0aCBhIGNvbW1hLgorCisteiA8ZnV6ej46OgorCVBhc3MgdGhlIHRpbWVzdGFtcCBmdXp6IGZhY3RvciB0byBjdnNwcywgaW4gc2Vjb25kcy4gSWYgdW5zZXQsCisJY3ZzcHMgZGVmYXVsdHMgdG8gMzAwcy4KKworLVAgPGN2c3BzLW91dHB1dC1maWxlPjo6CisJSW5zdGVhZCBvZiBjYWxsaW5nIGN2c3BzLCByZWFkIHRoZSBwcm92aWRlZCBjdnNwcyBvdXRwdXQgZmlsZS4gVXNlZnVsCisJZm9yIGRlYnVnZ2luZyBvciB3aGVuIGN2c3BzIGlzIGJlaW5nIGhhbmRsZWQgb3V0c2lkZSBjdnNpbXBvcnQuCisKKy1tOjogICAgCisJQXR0ZW1wdCB0byBkZXRlY3QgbWVyZ2VzIGJhc2VkIG9uIHRoZSBjb21taXQgbWVzc2FnZS4gVGhpcyBvcHRpb24KKwl3aWxsIGVuYWJsZSBkZWZhdWx0IHJlZ2V4ZXMgdGhhdCB0cnkgdG8gY2FwdHVyZSB0aGUgbmFtZSBzb3VyY2UgCisJYnJhbmNoIG5hbWUgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UuIAorCistTSA8cmVnZXg+OjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBjdXN0b20KKwlyZWdleC4gSXQgY2FuIGJlIHVzZWQgd2l0aCAnLW0nIHRvIGFsc28gc2VlIHRoZSBkZWZhdWx0IHJlZ2V4ZXMuCisJWW91IG11c3QgZXNjYXBlIGZvcndhcmQgc2xhc2hlcy4gCisKKy1TIDxyZWdleD46OgorCVNraXAgcGF0aHMgbWF0Y2hpbmcgdGhlIHJlZ2V4LgorCistYTo6CisJSW1wb3J0IGFsbCBjb21taXRzLCBpbmNsdWRpbmcgcmVjZW50IG9uZXMuIGN2c2ltcG9ydCBieSBkZWZhdWx0CisJc2tpcHMgY29tbWl0cyB0aGF0IGhhdmUgYSB0aW1lc3RhbXAgbGVzcyB0aGFuIDEwIG1pbnV0ZXMgYWdvLgorCistTCA8bGltaXQ+OjoKKwlMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgaW1wb3J0ZWQuIFdvcmthcm91bmQgZm9yIGNhc2VzIHdoZXJlCisJY3ZzaW1wb3J0IGxlYWtzIG1lbW9yeS4KKworLUEgPGF1dGhvci1jb252LWZpbGU+OjoKKwlDVlMgYnkgZGVmYXVsdCB1c2VzIHRoZSBVbml4IHVzZXJuYW1lIHdoZW4gd3JpdGluZyBpdHMKKwljb21taXQgbG9ncy4gVXNpbmcgdGhpcyBvcHRpb24gYW5kIGFuIGF1dGhvci1jb252LWZpbGUKKwlpbiB0aGlzIGZvcm1hdAorKworLS0tLS0tLS0tCisJZXhvbj1BbmRyZWFzIEVyaWNzc29uIDxhZUBvcDUuc2U+CisJc3Bhd249U2ltb24gUGF3biA8c3Bhd25AZnJvZy1wb25kLm9yZz4KKworLS0tLS0tLS0tCisrCitnaXQtY3ZzaW1wb3J0IHdpbGwgbWFrZSBpdCBhcHBlYXIgYXMgdGhvc2UgYXV0aG9ycyBoYWQKK3RoZWlyIEdJVF9BVVRIT1JfTkFNRSBhbmQgR0lUX0FVVEhPUl9FTUFJTCBzZXQgcHJvcGVybHkKK2FsbCBhbG9uZy4KKysKK0ZvciBjb252ZW5pZW5jZSwgdGhpcyBkYXRhIGlzIHNhdmVkIHRvIGAkR0lUX0RJUi9jdnMtYXV0aG9yc2AKK2VhY2ggdGltZSB0aGUgJy1BJyBvcHRpb24gaXMgcHJvdmlkZWQgYW5kIHJlYWQgZnJvbSB0aGF0IHNhbWUKK2ZpbGUgZWFjaCB0aW1lIGdpdC1jdnNpbXBvcnQgaXMgcnVuLgorKworSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGZlYXR1cmUgaWYgeW91IGludGVuZCB0bworZXhwb3J0IGNoYW5nZXMgYmFjayB0byBDVlMgYWdhaW4gbGF0ZXIgd2l0aAorZ2l0bGluazpnaXQtY3ZzZXhwb3J0Y29tbWl0WzFdLgorCistaDo6CisJUHJpbnQgYSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCitPVVRQVVQKKy0tLS0tLQorSWYgJy12JyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHQgcmVwb3J0cyB3aGF0IGl0IGlzIGRvaW5nLgorCitPdGhlcndpc2UsIHN1Y2Nlc3MgaXMgaW5kaWNhdGVkIHRoZSBVbml4IHdheSwgaS5lLiBieSBzaW1wbHkgZXhpdGluZyB3aXRoCithIHplcm8gZXhpdCBzdGF0dXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LCB3aXRoIGhlbHAgZnJvbQordmFyaW91cyBwYXJ0aWNpcGFudHMgb2YgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c3NlcnZlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwMDVmMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c3NlcnZlci50eHQKQEAgLTAsMCArMSwyNzkgQEAKK2dpdC1jdnNzZXJ2ZXIoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWN2c3NlcnZlciAtIEEgQ1ZTIHNlcnZlciBlbXVsYXRvciBmb3IgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorZXhwb3J0IENWU19TRVJWRVI9Z2l0LWN2c3NlcnZlcgorJ2N2cycgLWQgOmV4dDp1c2VyQHNlcnZlci9wYXRoL3JlcG8uZ2l0IGNvIDxIRUFEX25hbWU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIGFwcGxpY2F0aW9uIGlzIGEgQ1ZTIGVtdWxhdGlvbiBsYXllciBmb3IgZ2l0LgorCitJdCBpcyBoaWdobHkgZnVuY3Rpb25hbC4gSG93ZXZlciwgbm90IGFsbCBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCwKK2FuZCBmb3IgdGhvc2UgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCwKK25vdCBhbGwgc3dpdGNoZXMgYXJlIGltcGxlbWVudGVkLgorCitUZXN0aW5nIGhhcyBiZWVuIGRvbmUgdXNpbmcgYm90aCB0aGUgQ0xJIENWUyBjbGllbnQsIGFuZCB0aGUgRWNsaXBzZSBDVlMKK3BsdWdpbi4gTW9zdCBmdW5jdGlvbmFsaXR5IHdvcmtzIGZpbmUgd2l0aCBib3RoIG9mIHRoZXNlIGNsaWVudHMuCisKK0xJTUlUQVRJT05TCistLS0tLS0tLS0tLQorCitDdXJyZW50bHkgY3Zzc2VydmVyIHdvcmtzIG92ZXIgU1NIIGNvbm5lY3Rpb25zIGZvciByZWFkL3dyaXRlIGNsaWVudHMsIGFuZAorb3ZlciBwc2VydmVyIGZvciBhbm9ueW1vdXMgQ1ZTIGFjY2Vzcy4KKworQ1ZTIGNsaWVudHMgY2Fubm90IHRhZywgYnJhbmNoIG9yIHBlcmZvcm0gR0lUIG1lcmdlcy4KKworZ2l0LWN2c3NlcnZlciBtYXBzIEdJVCBicmFuY2hlcyB0byBDVlMgbW9kdWxlcy4gVGhpcyBpcyB2ZXJ5IGRpZmZlcmVudAorZnJvbSB3aGF0IG1vc3QgQ1ZTIHVzZXJzIHdvdWxkIGV4cGVjdCBzaW5jZSBpbiBDVlMgbW9kdWxlcyB1c3VhbGx5IHJlcHJlc2VudAorb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMuCisKK0lOU1RBTExBVElPTgorLS0tLS0tLS0tLS0tCisKKzEuIElmIHlvdSBhcmUgZ29pbmcgdG8gb2ZmZXIgYW5vbnltb3VzIENWUyBhY2Nlc3MgdmlhIHBzZXJ2ZXIsIGFkZCBhIGxpbmUgaW4KKyAgIC9ldGMvaW5ldGQuY29uZiBsaWtlCisrCistLQorLS0tLS0tCisgICBjdnNwc2VydmVyIHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSBnaXQtY3Zzc2VydmVyIHBzZXJ2ZXIKKworLS0tLS0tCitOb3RlOiBTb21lIGluZXRkIHNlcnZlcnMgbGV0IHlvdSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlCitpbmRlcGVuZGVudGx5IG9mIHRoZSB2YWx1ZSBvZiBhcmd2WzBdIChpLmUuIHRoZSBuYW1lIHRoZSBwcm9ncmFtIGFzc3VtZXMKK2l0IHdhcyBleGVjdXRlZCB3aXRoKS4gSW4gdGhpcyBjYXNlIHRoZSBjb3JyZWN0IGxpbmUgaW4gL2V0Yy9pbmV0ZC5jb25mCitsb29rcyBsaWtlCisKKy0tLS0tLQorICAgY3ZzcHNlcnZlciBzdHJlYW0gdGNwIG5vd2FpdCBub2JvZHkgL3Vzci9iaW4vZ2l0LWN2c3NlcnZlciBnaXQtY3Zzc2VydmVyIHBzZXJ2ZXIKKworLS0tLS0tCitObyBzcGVjaWFsIHNldHVwIGlzIG5lZWRlZCBmb3IgU1NIIGFjY2Vzcywgb3RoZXIgdGhhbiBoYXZpbmcgR0lUIHRvb2xzCitpbiB0aGUgUEFUSC4gSWYgeW91IGhhdmUgY2xpZW50cyB0aGF0IGRvIG5vdCBhY2NlcHQgdGhlIENWU19TRVJWRVIKK2Vudmlyb25tZW50IHZhcmlhYmxlLCB5b3UgY2FuIHJlbmFtZSBnaXQtY3Zzc2VydmVyIHRvIGN2cy4KKworTm90ZTogTmV3ZXIgY3ZzIHZlcnNpb25zICg+PSAxLjEyLjExKSBhbHNvIHN1cHBvcnQgc3BlY2lmeWluZworQ1ZTX1NFUlZFUiBkaXJlY3RseSBpbiBDVlNST09UIGxpa2UKKworLS0tLS0tCitjdnMgLWQgIjpleHQ7Q1ZTX1NFUlZFUj1naXQtY3Zzc2VydmVyOnVzZXJAc2VydmVyL3BhdGgvcmVwby5naXQiIGNvIDxIRUFEX25hbWU+CistLS0tLS0KK1RoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBpdCB3aWxsIGJlIHNhdmVkIGluIHlvdXIgJ0NWUy9Sb290JyBmaWxlcyBhbmQKK3lvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGFsd2F5cyBzZXR0aW5nIHRoZSBjb3JyZWN0IGVudmlyb25tZW50Cit2YXJpYWJsZS4KKy0tCisyLiBGb3IgZWFjaCByZXBvIHRoYXQgeW91IHdhbnQgYWNjZXNzaWJsZSBmcm9tIENWUyB5b3UgbmVlZCB0byBlZGl0IGNvbmZpZyBpbgorICAgdGhlIHJlcG8gYW5kIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24uCisrCistLQorLS0tLS0tCisgICBbZ2l0Y3ZzXQorICAgICAgICBlbmFibGVkPTEKKyAgICAgICAgIyBvcHRpb25hbCBmb3IgZGVidWdnaW5nCisgICAgICAgIGxvZ2ZpbGU9L3BhdGgvdG8vbG9nZmlsZQorCistLS0tLS0KK05vdGU6IHlvdSBuZWVkIHRvIGVuc3VyZSBlYWNoIHVzZXIgdGhhdCBpcyBnb2luZyB0byBpbnZva2UgZ2l0LWN2c3NlcnZlciBoYXMKK3dyaXRlIGFjY2VzcyB0byB0aGUgbG9nIGZpbGUgYW5kIHRvIHRoZSBkYXRhYmFzZSAoc2VlCis8PGRiYmFja2VuZCxEYXRhYmFzZSBCYWNrZW5kPj4uIElmIHlvdSB3YW50IHRvIG9mZmVyIHdyaXRlIGFjY2VzcyBvdmVyCitTU0gsIHRoZSB1c2VycyBvZiBjb3Vyc2UgYWxzbyBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgZ2l0IHJlcG9zaXRvcnkgaXRzZWxmLgorCitbW2NvbmZpZ2FjY2Vzc21ldGhvZF1dCitBbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiBmb3IgYSBzcGVjaWZpYyBtZXRob2Qgb2YKK2FjY2Vzcy4gVmFsaWQgbWV0aG9kIG5hbWVzIGFyZSAiZXh0IiAoZm9yIFNTSCBhY2Nlc3MpIGFuZCAicHNlcnZlciIuIFRoZQorZm9sbG93aW5nIGV4YW1wbGUgY29uZmlndXJhdGlvbiB3b3VsZCBkaXNhYmxlIHBzZXJ2ZXIgYWNjZXNzIHdoaWxlIHN0aWxsCithbGxvd2luZyBhY2Nlc3Mgb3ZlciBTU0guCistLS0tLS0KKyAgIFtnaXRjdnNdCisgICAgICAgIGVuYWJsZWQ9MAorCisgICBbZ2l0Y3ZzICJleHQiXQorICAgICAgICBlbmFibGVkPTEKKy0tLS0tLQorLS0KKzMuIE9uIHRoZSBjbGllbnQgbWFjaGluZSB5b3UgbmVlZCB0byBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMuCisgICBDVlNST09UIHNob3VsZCBiZSBzZXQgYXMgcGVyIG5vcm1hbCwgYnV0IHRoZSBkaXJlY3Rvcnkgc2hvdWxkIHBvaW50IGF0IHRoZQorICAgYXBwcm9wcmlhdGUgZ2l0IHJlcG8uIEZvciBleGFtcGxlOgorKworLS0KK0ZvciBTU0ggYWNjZXNzLCBDVlNfU0VSVkVSIHNob3VsZCBiZSBzZXQgdG8gZ2l0LWN2c3NlcnZlcgorCitFeGFtcGxlOgorCistLS0tLS0KKyAgICAgZXhwb3J0IENWU1JPT1Q9OmV4dDp1c2VyQHNlcnZlcjovdmFyL2dpdC9wcm9qZWN0LmdpdAorICAgICBleHBvcnQgQ1ZTX1NFUlZFUj1naXQtY3Zzc2VydmVyCistLS0tLS0KKy0tCis0LiBGb3IgU1NIIGNsaWVudHMgdGhhdCB3aWxsIG1ha2UgY29tbWl0cywgbWFrZSBzdXJlIHRoZWlyIC5iYXNocmMgZmlsZQorICAgc2V0cyB0aGUgR0lUX0FVVEhPUiBhbmQgR0lUX0NPTU1JVFRFUiB2YXJpYWJsZXMuCisKKzUuIENsaWVudHMgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGNoZWNrIG91dCB0aGUgcHJvamVjdC4gVXNlIHRoZSBDVlMgJ21vZHVsZScKKyAgIG5hbWUgdG8gaW5kaWNhdGUgd2hhdCBHSVQgJ2hlYWQnIHlvdSB3YW50IHRvIGNoZWNrIG91dC4gRXhhbXBsZToKKysKKy0tLS0tLQorICAgICBjdnMgY28gLWQgcHJvamVjdC1tYXN0ZXIgbWFzdGVyCistLS0tLS0KKworW1tkYmJhY2tlbmRdXQorRGF0YWJhc2UgQmFja2VuZAorLS0tLS0tLS0tLS0tLS0tLQorCitnaXQtY3Zzc2VydmVyIHVzZXMgb25lIGRhdGFiYXNlIHBlciBnaXQgaGVhZCAoaS5lLiBDVlMgbW9kdWxlKSB0bworc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcG9zaXRvcnkgZm9yIGZhc3RlciBhY2Nlc3MuIFRoZQorZGF0YWJhc2UgZG9lc24ndCBjb250YWluIGFueSBwZXJzaXN0ZW50IGRhdGEgYW5kIGNhbiBiZSBjb21wbGV0ZWx5CityZWdlbmVyYXRlZCBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSBhdCBhbnkgdGltZS4gVGhlIGRhdGFiYXNlCituZWVkcyB0byBiZSB1cGRhdGVkIChpLmUuIHdyaXR0ZW4gdG8pIGFmdGVyIGV2ZXJ5IGNvbW1pdC4KKworSWYgdGhlIGNvbW1pdCBpcyBkb25lIGRpcmVjdGx5IGJ5IHVzaW5nIGdpdCAoYXMgb3Bwb3NlZCB0bwordXNpbmcgZ2l0LWN2c3NlcnZlcikgdGhlIHVwZGF0ZSB3aWxsIG5lZWQgdG8gaGFwcGVuIG9uIHRoZQorbmV4dCByZXBvc2l0b3J5IGFjY2VzcyBieSBnaXQtY3Zzc2VydmVyLCBpbmRlcGVuZGVudCBvZgorYWNjZXNzIG1ldGhvZCBhbmQgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKworVGhhdCBtZWFucyB0aGF0IGV2ZW4gaWYgeW91IG9mZmVyIG9ubHkgcmVhZCBhY2Nlc3MgKGUuZy4gYnkgdXNpbmcKK3RoZSBwc2VydmVyIG1ldGhvZCksIGdpdC1jdnNzZXJ2ZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzIHRvCit0aGUgZGF0YWJhc2UgdG8gd29yayByZWxpYWJseSAob3RoZXJ3aXNlIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZQordGhhdCB0aGUgZGF0YWJhc2UgaWYgdXAtdG8tZGF0ZSBhbGwgdGhlIHRpbWUgZ2l0LWN2c3NlcnZlciBpcyBydW4pLgorCitCeSBkZWZhdWx0IGl0IHVzZXMgU1FMaXRlIGRhdGFiYXNlcyBpbiB0aGUgZ2l0IGRpcmVjdG9yeSwgbmFtZWQKK2BnaXRjdnMuPG1vZHVsZV9uYW1lPi5zcWxpdGVgLiBOb3RlIHRoYXQgdGhlIFNRTGl0ZSBiYWNrZW5kIGNyZWF0ZXMKK3RlbXBvcmFyeSBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGRhdGFiYXNlIGZpbGUgb24KK3dyaXRlIHNvIGl0IG1pZ2h0IG5vdCBiZSBlbm91Z2ggdG8gZ3JhbnQgdGhlIHVzZXJzIHVzaW5nCitnaXQtY3Zzc2VydmVyIHdyaXRlIGFjY2VzcyB0byB0aGUgZGF0YWJhc2UgZmlsZSB3aXRob3V0IGdyYW50aW5nCit0aGVtIHdyaXRlIGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5LCB0b28uCisKK1lvdSBjYW4gY29uZmlndXJlIHRoZSBkYXRhYmFzZSBiYWNrZW5kIHdpdGggdGhlIGZvbGxvd2luZworY29uZmlndXJhdGlvbiB2YXJpYWJsZXM6CisKK0NvbmZpZ3VyaW5nIGRhdGFiYXNlIGJhY2tlbmQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworZ2l0LWN2c3NlcnZlciB1c2VzIHRoZSBQZXJsIERCSSBtb2R1bGUuIFBsZWFzZSBhbHNvIHJlYWQKK2l0cyBkb2N1bWVudGF0aW9uIGlmIGNoYW5naW5nIHRoZXNlIHZhcmlhYmxlcywgZXNwZWNpYWxseQorYWJvdXQgYERCSS0+Y29ubmVjdCgpYC4KKworZ2l0Y3ZzLmRibmFtZTo6CisJRGF0YWJhc2UgbmFtZS4gVGhlIGV4YWN0IG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUKKwl1c2VkIGRhdGFiYXNlIGRyaXZlciwgZm9yIFNRTGl0ZSB0aGlzIGlzIGEgZmlsZW5hbWUuCisJU3VwcG9ydHMgdmFyaWFibGUgc3Vic3RpdHV0aW9uIChzZWUgYmVsb3cpLiBNYXkKKwlub3QgY29udGFpbiBzZW1pY29sb25zIChgO2ApLgorCURlZmF1bHQ6ICclR2dpdGN2cy4lbS5zcWxpdGUnCisKK2dpdGN2cy5kYmRyaXZlcjo6CisJVXNlZCBEQkkgZHJpdmVyLiBZb3UgY2FuIHNwZWNpZnkgYW55IGF2YWlsYWJsZSBkcml2ZXIKKwlmb3IgdGhpcyBoZXJlLCBidXQgaXQgbWlnaHQgbm90IHdvcmsuIGN2c3NlcnZlciBpcyB0ZXN0ZWQKKwl3aXRoICdEQkQ6OlNRTGl0ZScsIHJlcG9ydGVkIHRvIHdvcmsgd2l0aAorCSdEQkQ6OlBnJywgYW5kIHJlcG9ydGVkICpub3QqIHRvIHdvcmsgd2l0aCAnREJEOjpteXNxbCcuCisJUGxlYXNlIHJlZ2FyZCB0aGlzIGFzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBNYXkgbm90CisJY29udGFpbiBkb3VibGUgY29sb25zIChgOmApLgorCURlZmF1bHQ6ICdTUUxpdGUnCisKK2dpdGN2cy5kYnVzZXI6OgorCURhdGFiYXNlIHVzZXIuIE9ubHkgdXNlZnVsIGlmIHNldHRpbmcgYGRiZHJpdmVyYCwgc2luY2UKKwlTUUxpdGUgaGFzIG5vIGNvbmNlcHQgb2YgZGF0YWJhc2UgdXNlcnMuIFN1cHBvcnRzIHZhcmlhYmxlCisJc3Vic3RpdHV0aW9uIChzZWUgYmVsb3cpLgorCitnaXRjdnMuZGJwYXNzOjoKKwlEYXRhYmFzZSBwYXNzd29yZC4gIE9ubHkgdXNlZnVsIGlmIHNldHRpbmcgYGRiZHJpdmVyYCwgc2luY2UKKwlTUUxpdGUgaGFzIG5vIGNvbmNlcHQgb2YgZGF0YWJhc2UgcGFzc3dvcmRzLgorCitBbGwgdmFyaWFibGVzIGNhbiBhbHNvIGJlIHNldCBwZXIgYWNjZXNzIG1ldGhvZCwgc2VlIDw8Y29uZmlnYWNjZXNzbWV0aG9kLGFib3ZlPj4uCisKK1ZhcmlhYmxlIHN1YnN0aXR1dGlvbgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitJbiBgZGJkcml2ZXJgIGFuZCBgZGJ1c2VyYCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKworJUc6OgorCWdpdCBkaXJlY3RvcnkgbmFtZQorJWc6OgorCWdpdCBkaXJlY3RvcnkgbmFtZSwgd2hlcmUgYWxsIGNoYXJhY3RlcnMgZXhjZXB0IGZvcgorCWFscGhhLW51bWVyaWMgb25lcywgYC5gLCBhbmQgYC1gIGFyZSByZXBsYWNlZCB3aXRoCisJYF9gICh0aGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byB1c2UgdGhlIGRpcmVjdG9yeQorCW5hbWUgaW4gYSBmaWxlbmFtZSBpZiB3YW50ZWQpCislbTo6CisJQ1ZTIG1vZHVsZS9naXQgaGVhZCBuYW1lCislYTo6CisJYWNjZXNzIG1ldGhvZCAob25lIG9mICJleHQiIG9yICJwc2VydmVyIikKKyV1OjoKKwlOYW1lIG9mIHRoZSB1c2VyIHJ1bm5pbmcgZ2l0LWN2c3NlcnZlci4KKwlJZiBubyBuYW1lIGNhbiBiZSBkZXRlcm1pbmVkLCB0aGUKKwludW1lcmljIHVpZCBpcyB1c2VkLgorCitFY2xpcHNlIENWUyBDbGllbnQgTm90ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBnZXQgYSBjaGVja291dCB3aXRoIHRoZSBFY2xpcHNlIENWUyBjbGllbnQ6CisKKzEuIFNlbGVjdCAiQ3JlYXRlIGEgbmV3IHByb2plY3QgLT4gRnJvbSBDVlMgY2hlY2tvdXQiCisyLiBDcmVhdGUgYSBuZXcgbG9jYXRpb24uIFNlZSB0aGUgbm90ZXMgYmVsb3cgZm9yIGRldGFpbHMgb24gaG93IHRvIGNob29zZSB0aGUKKyAgIHJpZ2h0IHByb3RvY29sLgorMy4gQnJvd3NlIHRoZSAnbW9kdWxlcycgYXZhaWxhYmxlLiBJdCB3aWxsIGdpdmUgeW91IGEgbGlzdCBvZiB0aGUgaGVhZHMgaW4KKyAgIHRoZSByZXBvc2l0b3J5LiBZb3Ugd2lsbCBub3QgYmUgYWJsZSB0byBicm93c2UgdGhlIHRyZWUgZnJvbSB0aGVyZS4gT25seQorICAgdGhlIGhlYWRzLgorNC4gUGljayAnSEVBRCcgd2hlbiBpdCBhc2tzIHdoYXQgYnJhbmNoL3RhZyB0byBjaGVjayBvdXQuIFVudGljayB0aGUKKyAgICJsYXVuY2ggY29tbWl0IHdpemFyZCIgdG8gYXZvaWQgY29tbWl0dGluZyB0aGUgLnByb2plY3QgZmlsZS4KKworUHJvdG9jb2wgbm90ZXM6IElmIHlvdSBhcmUgdXNpbmcgYW5vbnltb3VzIGFjY2VzcyB2aWEgcHNlcnZlciwganVzdCBzZWxlY3QgdGhhdC4KK1Rob3NlIHVzaW5nIFNTSCBhY2Nlc3Mgc2hvdWxkIGNob29zZSB0aGUgJ2V4dCcgcHJvdG9jb2wsIGFuZCBjb25maWd1cmUgJ2V4dCcKK2FjY2VzcyBvbiB0aGUgUHJlZmVyZW5jZXMtPlRlYW0tPkNWUy0+RXh0Q29ubmVjdGlvbiBwYW5lLiBTZXQgQ1ZTX1NFUlZFUiB0bworJ2dpdC1jdnNzZXJ2ZXInLiBOb3RlIHRoYXQgcGFzc3dvcmQgc3VwcG9ydCBpcyBub3QgZ29vZCB3aGVuIHVzaW5nICdleHQnLAoreW91IHdpbGwgZGVmaW5pdGVseSB3YW50IHRvIGhhdmUgU1NIIGtleXMgc2V0dXAuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4ganVzdCB1c2UgdGhlIG5vbi1zdGFuZGFyZCBleHRzc2ggcHJvdG9jb2wgdGhhdCBFY2xpcHNlCitvZmZlci4gSW4gdGhhdCBjYXNlIENWU19TRVJWRVIgaXMgaWdub3JlZCwgYW5kIHlvdSB3aWxsIGhhdmUgdG8gcmVwbGFjZQordGhlIGN2cyB1dGlsaXR5IG9uIHRoZSBzZXJ2ZXIgd2l0aCBnaXQtY3Zzc2VydmVyIG9yIG1hbmlwdWxhdGUgeW91ciBgLmJhc2hyY2AKK3NvIHRoYXQgY2FsbGluZyAnY3ZzJyBlZmZlY3RpdmVseSBjYWxscyBnaXQtY3Zzc2VydmVyLgorCitDbGllbnRzIGtub3duIHRvIHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIENWUyAxLjEyLjkgb24gRGViaWFuCistIENWUyAxLjExLjE3IG9uIE1hY09TWCAoZnJvbSBGaW5rIHBhY2thZ2UpCistIEVjbGlwc2UgMy4wLCAzLjEuMiBvbiBNYWNPU1ggKHNlZSBFY2xpcHNlIENWUyBDbGllbnQgTm90ZXMpCistIFRvcnRvaXNlQ1ZTCisKK09wZXJhdGlvbnMgc3VwcG9ydGVkCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgZm9yIG5vcm1hbCB1c2UgYXJlIHN1cHBvcnRlZCwgaW5jbHVkaW5nCitjaGVja291dCwgZGlmZiwgc3RhdHVzLCB1cGRhdGUsIGxvZywgYWRkLCByZW1vdmUsIGNvbW1pdC4KK0xlZ2FjeSBtb25pdG9yaW5nIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgKGVkaXQsIHdhdGNoIGFuZCByZWxhdGVkKS4KK0V4cG9ydHMgYW5kIHRhZ2dpbmcgKHRhZ3MgYW5kIGJyYW5jaGVzKSBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHN0YWdlLgorCitUaGUgc2VydmVyIHNob3VsZCBzZXQgdGhlICctaycgbW9kZSB0byBiaW5hcnkgd2hlbiByZWxldmFudCwgaG93ZXZlciwKK3RoaXMgaXMgbm90IHJlYWxseSBpbXBsZW1lbnRlZCB5ZXQuIEZvciBub3csIHlvdSBjYW4gZm9yY2UgdGhlIHNlcnZlcgordG8gc2V0ICcta2InIGZvciBhbGwgZmlsZXMgYnkgc2V0dGluZyB0aGUgYGdpdGN2cy5hbGxiaW5hcnlgIGNvbmZpZwordmFyaWFibGUuIEluIHByb3BlciBHSVQgdHJhZGl0aW9uLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIGFyZQorYWx3YXlzIHJlc3BlY3RlZC4gTm8ga2V5d29yZCBleHBhbnNpb24gb3IgbmV3bGluZSBtdW5naW5nIGlzIHN1cHBvcnRlZC4KKworRGVwZW5kZW5jaWVzCistLS0tLS0tLS0tLS0KKworZ2l0LWN2c3NlcnZlciBkZXBlbmRzIG9uIERCRDo6U1FMaXRlLgorCitDb3B5cmlnaHQgYW5kIEF1dGhvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHByb2dyYW0gaXMgY29weXJpZ2h0IFRoZSBPcGVuIFVuaXZlcnNpdHkgVUsgLSAyMDA2LgorCitBdXRob3JzOgorCistIE1hcnR5biBTbWl0aCAgICA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4KKy0gTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorCit3aXRoIGlkZWFzIGFuZCBwYXRjaGVzIGZyb20gcGFydGljaXBhbnRzIG9mIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1hcnR5biBTbWl0aCA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4sIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4sIGFuZCBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGFlbW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRhZW1vbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkYWI3MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRhZW1vbi50eHQKQEAgLTAsMCArMSwyMzggQEAKK2dpdC1kYWVtb24oMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRhZW1vbiAtIEEgcmVhbGx5IHNpbXBsZSBzZXJ2ZXIgZm9yIGdpdCByZXBvc2l0b3JpZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWRhZW1vbicgWy0tdmVyYm9zZV0gWy0tc3lzbG9nXSBbLS1leHBvcnQtYWxsXQorICAgICAgICAgICAgIFstLXRpbWVvdXQ9bl0gWy0taW5pdC10aW1lb3V0PW5dIFstLXN0cmljdC1wYXRoc10KKyAgICAgICAgICAgICBbLS1iYXNlLXBhdGg9cGF0aF0gWy0tdXNlci1wYXRoIHwgLS11c2VyLXBhdGg9cGF0aF0KKyAgICAgICAgICAgICBbLS1pbnRlcnBvbGF0ZWQtcGF0aD1wYXRodGVtcGxhdGVdCisgICAgICAgICAgICAgWy0tcmV1c2VhZGRyXSBbLS1kZXRhY2hdIFstLXBpZC1maWxlPWZpbGVdCisgICAgICAgICAgICAgWy0tZW5hYmxlPXNlcnZpY2VdIFstLWRpc2FibGU9c2VydmljZV0KKwkgICAgIFstLWFsbG93LW92ZXJyaWRlPXNlcnZpY2VdIFstLWZvcmJpZC1vdmVycmlkZT1zZXJ2aWNlXQorCSAgICAgWy0taW5ldGQgfCBbLS1saXN0ZW49aG9zdF9vcl9pcGFkZHJdIFstLXBvcnQ9bl0gWy0tdXNlcj11c2VyIFstLWdyb3VwPWdyb3VwXV0KKwkgICAgIFtkaXJlY3RvcnkuLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQSByZWFsbHkgc2ltcGxlIFRDUCBnaXQgZGFlbW9uIHRoYXQgbm9ybWFsbHkgbGlzdGVucyBvbiBwb3J0ICJERUZBVUxUX0dJVF9QT1JUIgorYWthIDk0MTguICBJdCB3YWl0cyBmb3IgYSBjb25uZWN0aW9uIGFza2luZyBmb3IgYSBzZXJ2aWNlLCBhbmQgd2lsbCBzZXJ2ZQordGhhdCBzZXJ2aWNlIGlmIGl0IGlzIGVuYWJsZWQuCisKK0l0IHZlcmlmaWVzIHRoYXQgdGhlIGRpcmVjdG9yeSBoYXMgdGhlIG1hZ2ljIGZpbGUgImdpdC1kYWVtb24tZXhwb3J0LW9rIiwgYW5kCitpdCB3aWxsIHJlZnVzZSB0byBleHBvcnQgYW55IGdpdCBkaXJlY3RvcnkgdGhhdCBoYXNuJ3QgZXhwbGljaXRseSBiZWVuIG1hcmtlZAorZm9yIGV4cG9ydCB0aGlzIHdheSAodW5sZXNzIHRoZSAnLS1leHBvcnQtYWxsJyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkKS4gSWYgeW91CitwYXNzIHNvbWUgZGlyZWN0b3J5IHBhdGhzIGFzICdnaXQtZGFlbW9uJyBhcmd1bWVudHMsIHlvdSBjYW4gZnVydGhlciByZXN0cmljdAordGhlIG9mZmVycyB0byBhIHdoaXRlbGlzdCBjb21wcmlzaW5nIG9mIHRob3NlLgorCitCeSBkZWZhdWx0LCBvbmx5IGB1cGxvYWQtcGFja2Agc2VydmljZSBpcyBlbmFibGVkLCB3aGljaCBzZXJ2ZXMKK2BnaXQtZmV0Y2gtcGFja2AgYW5kIGBnaXQtcGVlay1yZW1vdGVgIGNsaWVudHMgdGhhdCBhcmUgaW52b2tlZAorZnJvbSBgZ2l0LWZldGNoYCwgYGdpdC1scy1yZW1vdGVgLCBhbmQgYGdpdC1jbG9uZWAuCisKK1RoaXMgaXMgaWRlYWxseSBzdWl0ZWQgZm9yIHJlYWQtb25seSB1cGRhdGVzLCBpLmUuLCBwdWxsaW5nIGZyb20KK2dpdCByZXBvc2l0b3JpZXMuCisKK0FuIGB1cGxvYWQtYXJjaGl2ZWAgYWxzbyBleGlzdHMgdG8gc2VydmUgYGdpdC1hcmNoaXZlYC4KKworT1BUSU9OUworLS0tLS0tLQorLS1zdHJpY3QtcGF0aHM6OgorCU1hdGNoIHBhdGhzIGV4YWN0bHkgKGkuZS4gZG9uJ3QgYWxsb3cgIi9mb28vcmVwbyIgd2hlbiB0aGUgcmVhbCBwYXRoIGlzCisJIi9mb28vcmVwby5naXQiIG9yICIvZm9vL3JlcG8vLmdpdCIpIGFuZCBkb24ndCBkbyB1c2VyLXJlbGF0aXZlIHBhdGhzLgorCWdpdC1kYWVtb24gd2lsbCByZWZ1c2UgdG8gc3RhcnQgd2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBubworCXdoaXRlbGlzdCBpcyBzcGVjaWZpZWQuCisKKy0tYmFzZS1wYXRoOjoKKwlSZW1hcCBhbGwgdGhlIHBhdGggcmVxdWVzdHMgYXMgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIHBhdGguCisJVGhpcyBpcyBzb3J0IG9mICJHSVQgcm9vdCIgLSBpZiB5b3UgcnVuIGdpdC1kYWVtb24gd2l0aAorCSctLWJhc2UtcGF0aD0vc3J2L2dpdCcgb24gZXhhbXBsZS5jb20sIHRoZW4gaWYgeW91IGxhdGVyIHRyeSB0byBwdWxsCisJJ2dpdDovL2V4YW1wbGUuY29tL2hlbGxvLmdpdCcsIGBnaXQtZGFlbW9uYCB3aWxsIGludGVycHJldCB0aGUgcGF0aAorCWFzICcvc3J2L2dpdC9oZWxsby5naXQnLgorCistLWludGVycG9sYXRlZC1wYXRoPXBhdGh0ZW1wbGF0ZTo6CisJVG8gc3VwcG9ydCB2aXJ0dWFsIGhvc3RpbmcsIGFuIGludGVycG9sYXRlZCBwYXRoIHRlbXBsYXRlIGNhbiBiZQorCXVzZWQgdG8gZHluYW1pY2FsbHkgY29uc3RydWN0IGFsdGVybmF0ZSBwYXRocy4gIFRoZSB0ZW1wbGF0ZQorCXN1cHBvcnRzICVIIGZvciB0aGUgdGFyZ2V0IGhvc3RuYW1lIGFzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgYnV0CisJY29udmVydGVkIHRvIGFsbCBsb3dlcmNhc2UsICVDSCBmb3IgdGhlIGNhbm9uaWNhbCBob3N0bmFtZSwKKwklSVAgZm9yIHRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzLCAlUCBmb3IgdGhlIHBvcnQgbnVtYmVyLAorCWFuZCAlRCBmb3IgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hbWVkIHJlcG9zaXRvcnkuCisJQWZ0ZXIgaW50ZXJwb2xhdGlvbiwgdGhlIHBhdGggaXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGRpcmVjdG9yeQorCXdoaXRlbGlzdC4KKworLS1leHBvcnQtYWxsOjoKKwlBbGxvdyBwdWxsaW5nIGZyb20gYWxsIGRpcmVjdG9yaWVzIHRoYXQgbG9vayBsaWtlIEdJVCByZXBvc2l0b3JpZXMKKwkoaGF2ZSB0aGUgJ29iamVjdHMnIGFuZCAncmVmcycgc3ViZGlyZWN0b3JpZXMpLCBldmVuIGlmIHRoZXkKKwlkbyBub3QgaGF2ZSB0aGUgJ2dpdC1kYWVtb24tZXhwb3J0LW9rJyBmaWxlLgorCistLWluZXRkOjoKKwlIYXZlIHRoZSBzZXJ2ZXIgcnVuIGFzIGFuIGluZXRkIHNlcnZpY2UuIEltcGxpZXMgLS1zeXNsb2cuCisJSW5jb21wYXRpYmxlIHdpdGggLS1wb3J0LCAtLWxpc3RlbiwgLS11c2VyIGFuZCAtLWdyb3VwIG9wdGlvbnMuCisKKy0tbGlzdGVuPWhvc3Rfb3JfaXBhZGRyOjoKKwlMaXN0ZW4gb24gYW4gYSBzcGVjaWZpYyBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lLiAgSVAgYWRkcmVzc2VzIGNhbgorCWJlIGVpdGhlciBhbiBJUHY0IGFkZHJlc3Mgb3IgYW4gSVBWNiBhZGRyZXNzIGlmIHN1cHBvcnRlZC4gIElmIElQdjYKKwlpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIC0tbGlzdGVuPWhvc3RuYW1lIGlzIGFsc28gbm90IHN1cHBvcnRlZCBhbmQKKwktLWxpc3RlbiBtdXN0IGJlIGdpdmVuIGFuIElQdjQgYWRkcmVzcy4KKwlJbmNvbXBhdGlibGUgd2l0aCAnLS1pbmV0ZCcgb3B0aW9uLgorCistLXBvcnQ9bjo6CisJTGlzdGVuIG9uIGFuIGFsdGVybmF0aXZlIHBvcnQuICBJbmNvbXBhdGlibGUgd2l0aCAnLS1pbmV0ZCcgb3B0aW9uLgorCistLWluaXQtdGltZW91dDo6CisJVGltZW91dCBiZXR3ZWVuIHRoZSBtb21lbnQgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZQorCWNsaWVudCByZXF1ZXN0IGlzIHJlY2VpdmVkICh0eXBpY2FsbHkgYSByYXRoZXIgbG93IHZhbHVlLCBzaW5jZQorCXRoYXQgc2hvdWxkIGJlIGJhc2ljYWxseSBpbW1lZGlhdGUpLgorCistLXRpbWVvdXQ6OgorCVRpbWVvdXQgZm9yIHNwZWNpZmljIGNsaWVudCBzdWItcmVxdWVzdHMuIFRoaXMgaW5jbHVkZXMgdGhlIHRpbWUKKwlpdCB0YWtlcyBmb3IgdGhlIHNlcnZlciB0byBwcm9jZXNzIHRoZSBzdWItcmVxdWVzdCBhbmQgdGltZSBzcGVudAorCXdhaXRpbmcgZm9yIG5leHQgY2xpZW50J3MgcmVxdWVzdC4KKworLS1zeXNsb2c6OgorCUxvZyB0byBzeXNsb2cgaW5zdGVhZCBvZiBzdGRlcnIuIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBpbXBseQorCS0tdmVyYm9zZSwgdGh1cyBieSBkZWZhdWx0IG9ubHkgZXJyb3IgY29uZGl0aW9ucyB3aWxsIGJlIGxvZ2dlZC4KKworLS11c2VyLXBhdGgsIC0tdXNlci1wYXRoPXBhdGg6OgorCUFsbG93IH51c2VyIG5vdGF0aW9uIHRvIGJlIHVzZWQgaW4gcmVxdWVzdHMuICBXaGVuCisJc3BlY2lmaWVkIHdpdGggbm8gcGFyYW1ldGVyLCByZXF1ZXN0cyB0bworCWdpdDovL2hvc3QvfmFsaWNlL2ZvbyBpcyB0YWtlbiBhcyBhIHJlcXVlc3QgdG8gYWNjZXNzCisJJ2ZvbycgcmVwb3NpdG9yeSBpbiB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdXNlciBgYWxpY2VgLgorCUlmIGAtLXVzZXItcGF0aD1wYXRoYCBpcyBzcGVjaWZpZWQsIHRoZSBzYW1lIHJlcXVlc3QgaXMKKwl0YWtlbiBhcyBhIHJlcXVlc3QgdG8gYWNjZXNzIGBwYXRoL2Zvb2AgcmVwb3NpdG9yeSBpbgorCXRoZSBob21lIGRpcmVjdG9yeSBvZiB1c2VyIGBhbGljZWAuCisKKy0tdmVyYm9zZTo6CisJTG9nIGRldGFpbHMgYWJvdXQgdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZCByZXF1ZXN0ZWQgZmlsZXMuCisKKy0tcmV1c2VhZGRyOjoKKwlVc2UgU09fUkVVU0VBRERSIHdoZW4gYmluZGluZyB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKwlUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIHJlc3RhcnQgd2l0aG91dCB3YWl0aW5nIGZvcgorCW9sZCBjb25uZWN0aW9ucyB0byB0aW1lIG91dC4KKworLS1kZXRhY2g6OgorCURldGFjaCBmcm9tIHRoZSBzaGVsbC4gSW1wbGllcyAtLXN5c2xvZy4KKworLS1waWQtZmlsZT1maWxlOjoKKwlTYXZlIHRoZSBwcm9jZXNzIGlkIGluICdmaWxlJy4KKworLS11c2VyPXVzZXIsIC0tZ3JvdXA9Z3JvdXA6OgorCUNoYW5nZSBkYWVtb24ncyB1aWQgYW5kIGdpZCBiZWZvcmUgZW50ZXJpbmcgdGhlIHNlcnZpY2UgbG9vcC4KKwlXaGVuIG9ubHkgYC0tdXNlcmAgaXMgZ2l2ZW4gd2l0aG91dCBgLS1ncm91cGAsIHRoZQorCXByaW1hcnkgZ3JvdXAgSUQgZm9yIHRoZSB1c2VyIGlzIHVzZWQuICBUaGUgdmFsdWVzIG9mCisJdGhlIG9wdGlvbiBhcmUgZ2l2ZW4gdG8gYGdldHB3bmFtKDMpYCBhbmQgYGdldGdybmFtKDMpYAorCWFuZCBudW1lcmljIElEcyBhcmUgbm90IHN1cHBvcnRlZC4KKysKK0dpdmluZyB0aGVzZSBvcHRpb25zIGlzIGFuIGVycm9yIHdoZW4gdXNlZCB3aXRoIGAtLWluZXRkYDsgdXNlCit0aGUgZmFjaWxpdHkgb2YgaW5ldCBkYWVtb24gdG8gYWNoaWV2ZSB0aGUgc2FtZSBiZWZvcmUgc3Bhd25pbmcKK2BnaXQtZGFlbW9uYCBpZiBuZWVkZWQuCisKKy0tZW5hYmxlPXNlcnZpY2UsIC0tZGlzYWJsZT1zZXJ2aWNlOjoKKwlFbmFibGUvZGlzYWJsZSB0aGUgc2VydmljZSBzaXRlLXdpZGUgcGVyIGRlZmF1bHQuICBOb3RlCisJdGhhdCBhIHNlcnZpY2UgZGlzYWJsZWQgc2l0ZS13aWRlIGNhbiBzdGlsbCBiZSBlbmFibGVkCisJcGVyIHJlcG9zaXRvcnkgaWYgaXQgaXMgbWFya2VkIG92ZXJyaWRhYmxlIGFuZCB0aGUKKwlyZXBvc2l0b3J5IGVuYWJsZXMgdGhlIHNlcnZpY2Ugd2l0aCBhbiBjb25maWd1cmF0aW9uCisJaXRlbS4KKworLS1hbGxvdy1vdmVycmlkZT1zZXJ2aWNlLCAtLWZvcmJpZC1vdmVycmlkZT1zZXJ2aWNlOjoKKwlBbGxvdy9mb3JiaWQgb3ZlcnJpZGluZyB0aGUgc2l0ZS13aWRlIGRlZmF1bHQgd2l0aCBwZXIKKwlyZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uICBCeSBkZWZhdWx0LCBhbGwgdGhlIHNlcnZpY2VzCisJYXJlIG92ZXJyaWRhYmxlLgorCis8ZGlyZWN0b3J5Pjo6CisJQSBkaXJlY3RvcnkgdG8gYWRkIHRvIHRoZSB3aGl0ZWxpc3Qgb2YgYWxsb3dlZCBkaXJlY3Rvcmllcy4gVW5sZXNzCisJLS1zdHJpY3QtcGF0aHMgaXMgc3BlY2lmaWVkIHRoaXMgd2lsbCBhbHNvIGluY2x1ZGUgc3ViZGlyZWN0b3JpZXMKKwlvZiBlYWNoIG5hbWVkIGRpcmVjdG9yeS4KKworU0VSVklDRVMKKy0tLS0tLS0tCisKK3VwbG9hZC1wYWNrOjoKKwlUaGlzIHNlcnZlcyBgZ2l0LWZldGNoLXBhY2tgIGFuZCBgZ2l0LXBlZWstcmVtb3RlYAorCWNsaWVudHMuICBJdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBhIHJlcG9zaXRvcnkgY2FuCisJZGlzYWJsZSBpdCBieSBzZXR0aW5nIGBkYWVtb24udXBsb2FkcGFja2AgY29uZmlndXJhdGlvbgorCWl0ZW0gdG8gYGZhbHNlYC4KKwordXBsb2FkLWFyY2hpdmU6OgorCVRoaXMgc2VydmVzIGBnaXQtYXJjaGl2ZSAtLXJlbW90ZWAuCisKK0VYQU1QTEVTCistLS0tLS0tLQorV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcgaW4gL2V0Yy9zZXJ2aWNlczo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCA5NDE4IC9ldGMvc2VydmljZXMKK2dpdAkJOTQxOC90Y3AJCSMgR2l0IFZlcnNpb24gQ29udHJvbCBTeXN0ZW0KKy0tLS0tLS0tLS0tLQorCitnaXQtZGFlbW9uIGFzIGluZXRkIHNlcnZlcjo6CisJVG8gc2V0IHVwIGBnaXQtZGFlbW9uYCBhcyBhbiBpbmV0ZCBzZXJ2aWNlIHRoYXQgaGFuZGxlcyBhbnkKKwlyZXBvc2l0b3J5IHVuZGVyIHRoZSB3aGl0ZWxpc3RlZCBzZXQgb2YgZGlyZWN0b3JpZXMsIC9wdWIvZm9vCisJYW5kIC9wdWIvYmFyLCBwbGFjZSBhbiBlbnRyeSBsaWtlIHRoZSBmb2xsb3dpbmcgaW50bworCS9ldGMvaW5ldGQgYWxsIG9uIG9uZSBsaW5lOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSAgL3Vzci9iaW4vZ2l0LWRhZW1vbgorCQlnaXQtZGFlbW9uIC0taW5ldGQgLS12ZXJib3NlIC0tZXhwb3J0LWFsbAorCQkvcHViL2ZvbyAvcHViL2JhcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZ2l0LWRhZW1vbiBhcyBpbmV0ZCBzZXJ2ZXIgZm9yIHZpcnR1YWwgaG9zdHM6OgorCVRvIHNldCB1cCBgZ2l0LWRhZW1vbmAgYXMgYW4gaW5ldGQgc2VydmljZSB0aGF0IGhhbmRsZXMKKwlyZXBvc2l0b3JpZXMgZm9yIGRpZmZlcmVudCB2aXJ0dWFsIGhvc3RzLCBgd3d3LmV4YW1wbGUuY29tYAorCWFuZCBgd3d3LmV4YW1wbGUub3JnYCwgcGxhY2UgYW4gZW50cnkgbGlrZSB0aGUgZm9sbG93aW5nIGludG8KKwlgL2V0Yy9pbmV0ZGAgYWxsIG9uIG9uZSBsaW5lOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSAvdXNyL2Jpbi9naXQtZGFlbW9uCisJCWdpdC1kYWVtb24gLS1pbmV0ZCAtLXZlcmJvc2UgLS1leHBvcnQtYWxsCisJCS0taW50ZXJwb2xhdGVkLXBhdGg9L3B1Yi8lSCVECisJCS9wdWIvd3d3LmV4YW1wbGUub3JnL3NvZnR3YXJlCisJCS9wdWIvd3d3LmV4YW1wbGUuY29tL3NvZnR3YXJlCisJCS9zb2Z0d2FyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCitJbiB0aGlzIGV4YW1wbGUsIHRoZSByb290LWxldmVsIGRpcmVjdG9yeSBgL3B1YmAgd2lsbCBjb250YWluCithIHN1YmRpcmVjdG9yeSBmb3IgZWFjaCB2aXJ0dWFsIGhvc3QgbmFtZSBzdXBwb3J0ZWQuCitGdXJ0aGVyLCBib3RoIGhvc3RzIGFkdmVydGlzZSByZXBvc2l0b3JpZXMgc2ltcGx5IGFzCitgZ2l0Oi8vd3d3LmV4YW1wbGUuY29tL3NvZnR3YXJlL3JlcG8uZ2l0YC4gIEZvciBwcmUtMS40LjAKK2NsaWVudHMsIGEgc3ltbGluayBmcm9tIGAvc29mdHdhcmVgIGludG8gdGhlIGFwcHJvcHJpYXRlCitkZWZhdWx0IHJlcG9zaXRvcnkgY291bGQgYmUgbWFkZSBhcyB3ZWxsLgorCisKK2dpdC1kYWVtb24gYXMgcmVndWxhciBkYWVtb24gZm9yIHZpcnR1YWwgaG9zdHM6OgorCVRvIHNldCB1cCBgZ2l0LWRhZW1vbmAgYXMgYSByZWd1bGFyLCBub24taW5ldGQgc2VydmljZSB0aGF0CisJaGFuZGxlcyByZXBvc2l0b3JpZXMgZm9yIG11bHRpcGxlIHZpcnR1YWwgaG9zdHMgYmFzZWQgb24KKwl0aGVpciBJUCBhZGRyZXNzZXMsIHN0YXJ0IHRoZSBkYWVtb24gbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0LWRhZW1vbiAtLXZlcmJvc2UgLS1leHBvcnQtYWxsCisJCS0taW50ZXJwb2xhdGVkLXBhdGg9L3B1Yi8lSVAvJUQKKwkJL3B1Yi8xOTIuMTY4LjEuMjAwL3NvZnR3YXJlCisJCS9wdWIvMTAuMTAuMjIwLjIzL3NvZnR3YXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysKK0luIHRoaXMgZXhhbXBsZSwgdGhlIHJvb3QtbGV2ZWwgZGlyZWN0b3J5IGAvcHViYCB3aWxsIGNvbnRhaW4KK2Egc3ViZGlyZWN0b3J5IGZvciBlYWNoIHZpcnR1YWwgaG9zdCBJUCBhZGRyZXNzIHN1cHBvcnRlZC4KK1JlcG9zaXRvcmllcyBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgYnkgaG9zdG5hbWUgdGhvdWdoLCBhc3N1bWluZwordGhleSBjb3JyZXNwb25kIHRvIHRoZXNlIElQIGFkZHJlc3Nlcy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LCBZT1NISUZVSkkgSGlkZWFraQorPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPiBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRlc2NyaWJlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRlc2NyaWJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E1ODNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGVzY3JpYmUudHh0CkBAIC0wLDAgKzEsMTIyIEBACitnaXQtZGVzY3JpYmUoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGVzY3JpYmUgLSBTaG93IHRoZSBtb3N0IHJlY2VudCB0YWcgdGhhdCBpcyByZWFjaGFibGUgZnJvbSBhIGNvbW1pdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kZXNjcmliZScgWy0tYWxsXSBbLS10YWdzXSBbLS1hYmJyZXY9PG4+XSA8Y29tbWl0dGlzaD4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGUgY29tbWFuZCBmaW5kcyB0aGUgbW9zdCByZWNlbnQgdGFnIHRoYXQgaXMgcmVhY2hhYmxlIGZyb20gYQorY29tbWl0LCBhbmQgaWYgdGhlIGNvbW1pdCBpdHNlbGYgaXMgcG9pbnRlZCBhdCBieSB0aGUgdGFnLCBzaG93cwordGhlIHRhZy4gIE90aGVyd2lzZSwgaXQgc3VmZml4ZXMgdGhlIHRhZyBuYW1lIHdpdGggdGhlIG51bWJlciBvZgorYWRkaXRpb25hbCBjb21taXRzIGFuZCB0aGUgYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdC4KKworCitPUFRJT05TCistLS0tLS0tCis8Y29tbWl0dGlzaD46OgorCVRoZSBvYmplY3QgbmFtZSBvZiB0aGUgY29tbWl0dGlzaC4KKworLS1hbGw6OgorCUluc3RlYWQgb2YgdXNpbmcgb25seSB0aGUgYW5ub3RhdGVkIHRhZ3MsIHVzZSBhbnkgcmVmCisJZm91bmQgaW4gYC5naXQvcmVmcy9gLgorCistLXRhZ3M6OgorCUluc3RlYWQgb2YgdXNpbmcgb25seSB0aGUgYW5ub3RhdGVkIHRhZ3MsIHVzZSBhbnkgdGFnCisJZm91bmQgaW4gYC5naXQvcmVmcy90YWdzYC4KKworLS1hYmJyZXY9PG4+OjoKKwlJbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IDggaGV4YWRlY2ltYWwgZGlnaXRzIGFzIHRoZQorCWFiYnJldmlhdGVkIG9iamVjdCBuYW1lLCB1c2UgPG4+IGRpZ2l0cy4KKworLS1jYW5kaWRhdGVzPTxuPjo6CisJSW5zdGVhZCBvZiBjb25zaWRlcmluZyBvbmx5IHRoZSAxMCBtb3N0IHJlY2VudCB0YWdzIGFzCisJY2FuZGlkYXRlcyB0byBkZXNjcmliZSB0aGUgaW5wdXQgY29tbWl0dGlzaCBjb25zaWRlcgorCXVwIHRvIDxuPiBjYW5kaWRhdGVzLiAgSW5jcmVhc2luZyA8bj4gYWJvdmUgMTAgd2lsbCB0YWtlCisJc2xpZ2h0bHkgbG9uZ2VyIGJ1dCBtYXkgcHJvZHVjZSBhIG1vcmUgYWNjdXJhdGUgcmVzdWx0LgorCistLWRlYnVnOjoKKwlWZXJib3NlbHkgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VhcmNoaW5nIHN0cmF0ZWd5CisJYmVpbmcgZW1wbG95ZWQgdG8gc3RhbmRhcmQgZXJyb3IuICBUaGUgdGFnIG5hbWUgd2lsbCBzdGlsbAorCWJlIHByaW50ZWQgdG8gc3RhbmRhcmQgb3V0LgorCitFWEFNUExFUworLS0tLS0tLS0KKworV2l0aCBzb21ldGhpbmcgbGlrZSBnaXQuZ2l0IGN1cnJlbnQgdHJlZSwgSSBnZXQ6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0LWRlc2NyaWJlIHBhcmVudAorCXYxLjAuNC0xNC1nMjQxNDcyMQorCitpLmUuIHRoZSBjdXJyZW50IGhlYWQgb2YgbXkgInBhcmVudCIgYnJhbmNoIGlzIGJhc2VkIG9uIHYxLjAuNCwKK2J1dCBzaW5jZSBpdCBoYXMgYSBoYW5kZnVsIGNvbW1pdHMgb24gdG9wIG9mIHRoYXQsCitkZXNjcmliZSBoYXMgYWRkZWQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvbW1pdHMgKCIxNCIpIGFuZAorYW4gYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUgZm9yIHRoZSBjb21taXQgaXRzZWxmICgiMjQxNDcyMSIpCithdCB0aGUgZW5kLgorCitUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY29tbWl0cyBpcyB0aGUgbnVtYmVyCitvZiBjb21taXRzIHdoaWNoIHdvdWxkIGJlIGRpc3BsYXllZCBieSAiZ2l0IGxvZyB2MS4wLjQuLnBhcmVudCIuCitUaGUgaGFzaCBzdWZmaXggaXMgIi1nIiArIDctY2hhciBhYmJyZXZpYXRpb24gZm9yIHRoZSB0aXAgY29tbWl0CitvZiBwYXJlbnQgKHdoaWNoIHdhcyBgMjQxNDcyMWIxOTQ0NTNmMDU4MDc5ZDg5N2QxM2M0ZTM3N2Y5MmRjNmApLgorCitEb2luZyBhICJnaXQtZGVzY3JpYmUiIG9uIGEgdGFnLW5hbWUgd2lsbCBqdXN0IHNob3cgdGhlIHRhZyBuYW1lOgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdC1kZXNjcmliZSB2MS4wLjQKKwl2MS4wLjQKKworV2l0aCAtLWFsbCwgdGhlIGNvbW1hbmQgY2FuIHVzZSBicmFuY2ggaGVhZHMgYXMgcmVmZXJlbmNlcywgc28KK3RoZSBvdXRwdXQgc2hvd3MgdGhlIHJlZmVyZW5jZSBwYXRoIGFzIHdlbGw6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0IGRlc2NyaWJlIC0tYWxsIC0tYWJicmV2PTQgdjEuMC41XjIKKwl0YWdzL3YxLjAuMC0yMS1nOTc1YgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdCBkZXNjcmliZSAtLWFsbCBIRUFEXgorCWhlYWRzL2x0L2Rlc2NyaWJlLTctZzk3NWIKKworV2l0aCAtLWFiYnJldiBzZXQgdG8gMCwgdGhlIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUKK2Nsb3Nlc3QgdGFnbmFtZSB3aXRob3V0IGFueSBzdWZmaXg6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTAgdjEuMC41XjIKKwl0YWdzL3YxLjAuMAorCitTRUFSQ0ggU1RSQVRFR1kKKy0tLS0tLS0tLS0tLS0tLQorCitGb3IgZWFjaCBjb21taXR0aXNoIHN1cHBsaWVkICJnaXQgZGVzY3JpYmUiIHdpbGwgZmlyc3QgbG9vayBmb3IKK2EgdGFnIHdoaWNoIHRhZ3MgZXhhY3RseSB0aGF0IGNvbW1pdC4gIEFubm90YXRlZCB0YWdzIHdpbGwgYWx3YXlzCitiZSBwcmVmZXJyZWQgb3ZlciBsaWdodHdlaWdodCB0YWdzLCBhbmQgdGFncyB3aXRoIG5ld2VyIGRhdGVzIHdpbGwKK2Fsd2F5cyBiZSBwcmVmZXJyZWQgb3ZlciB0YWdzIHdpdGggb2xkZXIgZGF0ZXMuICBJZiBhbiBleGFjdCBtYXRjaAoraXMgZm91bmQsIGl0cyBuYW1lIHdpbGwgYmUgb3V0cHV0IGFuZCBzZWFyY2hpbmcgd2lsbCBzdG9wLgorCitJZiBhbiBleGFjdCBtYXRjaCB3YXMgbm90IGZvdW5kICJnaXQgZGVzY3JpYmUiIHdpbGwgd2FsayBiYWNrCit0aHJvdWdoIHRoZSBjb21taXQgaGlzdG9yeSB0byBsb2NhdGUgYW4gYW5jZXN0b3IgY29tbWl0IHdoaWNoCitoYXMgYmVlbiB0YWdnZWQuICBUaGUgYW5jZXN0b3IncyB0YWcgd2lsbCBiZSBvdXRwdXQgYWxvbmcgd2l0aCBhbgorYWJicmV2aWF0aW9uIG9mIHRoZSBpbnB1dCBjb21taXR0aXNoJ3MgU0hBMS4KKworSWYgbXVsdGlwbGUgdGFncyB3ZXJlIGZvdW5kIGR1cmluZyB0aGUgd2FsayB0aGVuIHRoZSB0YWcgd2hpY2gKK2hhcyB0aGUgZmV3ZXN0IGNvbW1pdHMgZGlmZmVyZW50IGZyb20gdGhlIGlucHV0IGNvbW1pdHRpc2ggd2lsbCBiZQorc2VsZWN0ZWQgYW5kIG91dHB1dC4gIEhlcmUgZmV3ZXN0IGNvbW1pdHMgZGlmZmVyZW50IGlzIGRlZmluZWQgYXMKK3RoZSBudW1iZXIgb2YgY29tbWl0cyB3aGljaCB3b3VsZCBiZSBzaG93biBieSAiZ2l0IGxvZyB0YWcuLmlucHV0Igord2lsbCBiZSB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGNvbW1pdHMgcG9zc2libGUuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwgYnV0IHNvbWV3aGF0CitidXRjaGVyZWQgYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0Pi4gIExhdGVyIHNpZ25pZmljYW50bHkKK3VwZGF0ZWQgYnkgU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtZmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtZGlmZi1maWxlcygxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtZmlsZXMgLSBDb21wYXJlcyBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZGlmZi1maWxlcycgWy1xXSBbLTB8LTF8LTJ8LTN8LWN8LS1jY3wtLW5vLWluZGV4XSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXguICBXaGVuIHBhdGhzCithcmUgc3BlY2lmaWVkLCBjb21wYXJlcyBvbmx5IHRob3NlIG5hbWVkIHBhdGhzLiAgT3RoZXJ3aXNlIGFsbAorZW50cmllcyBpbiB0aGUgaW5kZXggYXJlIGNvbXBhcmVkLiAgVGhlIG91dHB1dCBmb3JtYXQgaXMgdGhlCitzYW1lIGFzICJnaXQtZGlmZi1pbmRleCIgYW5kICJnaXQtZGlmZi10cmVlIi4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1vcHRpb25zLnR4dFtdCisKKy0xIC0yIC0zIG9yIC0tYmFzZSAtLW91cnMgLS10aGVpcnMsIGFuZCAtMDo6CisJRGlmZiBhZ2FpbnN0IHRoZSAiYmFzZSIgdmVyc2lvbiwgIm91ciBicmFuY2giIG9yICJ0aGVpcgorCWJyYW5jaCIgcmVzcGVjdGl2ZWx5LiAgV2l0aCB0aGVzZSBvcHRpb25zLCBkaWZmcyBmb3IKKwltZXJnZWQgZW50cmllcyBhcmUgbm90IHNob3duLgorKworVGhlIGRlZmF1bHQgaXMgdG8gZGlmZiBhZ2FpbnN0IG91ciBicmFuY2ggKC0yKSBhbmQgdGhlIAorY2xlYW5seSByZXNvbHZlZCBwYXRocy4gIFRoZSBvcHRpb24gLTAgY2FuIGJlIGdpdmVuIHRvCitvbWl0IGRpZmYgb3V0cHV0IGZvciB1bm1lcmdlZCBlbnRyaWVzIGFuZCBqdXN0IHNob3cgIlVubWVyZ2VkIi4KKworLWMsLS1jYzo6CisJVGhpcyBjb21wYXJlcyBzdGFnZSAyIChvdXIgYnJhbmNoKSwgc3RhZ2UgMyAodGhlaXIKKwlicmFuY2gpIGFuZCB0aGUgd29ya2luZyB0cmVlIGZpbGUgYW5kIG91dHB1dHMgYSBjb21iaW5lZAorCWRpZmYsIHNpbWlsYXIgdG8gdGhlIHdheSAnZGlmZi10cmVlJyBzaG93cyBhIG1lcmdlCisJY29tbWl0IHdpdGggdGhlc2UgZmxhZ3MuCisKKy0tbm8taW5kZXg6OgorCUNvbXBhcmUgdGhlIHR3byBnaXZlbiBmaWxlcyAvIGRpcmVjdG9yaWVzLgorCistcTo6CisJUmVtYWluIHNpbGVudCBldmVuIG9uIG5vbmV4aXN0ZW50IGZpbGVzCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmNTgxYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTMzIEBACitnaXQtZGlmZi1pbmRleCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtaW5kZXggLSBDb21wYXJlcyBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGJldHdlZW4gdGhlIGluZGV4IGFuZCByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYtaW5kZXgnIFstbV0gWy0tY2FjaGVkXSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgdGhlIGJsb2JzIGZvdW5kIHZpYSBhIHRyZWUKK29iamVjdCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IGluZGV4IGFuZCwgb3B0aW9uYWxseQoraWdub3JpbmcgdGhlIHN0YXQgc3RhdGUgb2YgdGhlIGZpbGUgb24gZGlzay4gIFdoZW4gcGF0aHMgYXJlCitzcGVjaWZpZWQsIGNvbXBhcmVzIG9ubHkgdGhvc2UgbmFtZWQgcGF0aHMuICBPdGhlcndpc2UgYWxsCitlbnRyaWVzIGluIHRoZSBpbmRleCBhcmUgY29tcGFyZWQuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8dHJlZS1pc2g+OjoKKwlUaGUgaWQgb2YgYSB0cmVlIG9iamVjdCB0byBkaWZmIGFnYWluc3QuCisKKy0tY2FjaGVkOjoKKwlkbyBub3QgY29uc2lkZXIgdGhlIG9uLWRpc2sgZmlsZSBhdCBhbGwKKworLW06OgorCUJ5IGRlZmF1bHQsIGZpbGVzIHJlY29yZGVkIGluIHRoZSBpbmRleCBidXQgbm90IGNoZWNrZWQKKwlvdXQgYXJlIHJlcG9ydGVkIGFzIGRlbGV0ZWQuICBUaGlzIGZsYWcgbWFrZXMKKwkiZ2l0LWRpZmYtaW5kZXgiIHNheSB0aGF0IGFsbCBub24tY2hlY2tlZC1vdXQgZmlsZXMgYXJlIHVwCisJdG8gZGF0ZS4KKworT3V0cHV0IGZvcm1hdAorLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1mb3JtYXQudHh0W10KKworT3BlcmF0aW5nIE1vZGVzCistLS0tLS0tLS0tLS0tLS0KK1lvdSBjYW4gY2hvb3NlIHdoZXRoZXIgeW91IHdhbnQgdG8gdHJ1c3QgdGhlIGluZGV4IGZpbGUgZW50aXJlbHkKKyh1c2luZyB0aGUgJy0tY2FjaGVkJyBmbGFnKSBvciBhc2sgdGhlIGRpZmYgbG9naWMgdG8gc2hvdyBhbnkgZmlsZXMKK3RoYXQgZG9uJ3QgbWF0Y2ggdGhlIHN0YXQgc3RhdGUgYXMgYmVpbmcgInRlbnRhdGl2ZWx5IGNoYW5nZWQiLiAgQm90aAorb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgdmVyeSB1c2VmdWwgaW5kZWVkLgorCitDYWNoZWQgTW9kZQorLS0tLS0tLS0tLS0KK0lmICctLWNhY2hlZCcgaXMgc3BlY2lmaWVkLCBpdCBhbGxvd3MgeW91IHRvIGFzazoKKworCXNob3cgbWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSEVBRCBhbmQgdGhlIGN1cnJlbnQgaW5kZXgKKwljb250ZW50cyAodGhlIG9uZXMgSSdkIHdyaXRlIHdpdGggYSAiZ2l0LXdyaXRlLXRyZWUiKQorCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91IGhhdmUgd29ya2VkIG9uIHlvdXIgd29ya2luZyBkaXJlY3RvcnksIHVwZGF0ZWQKK3NvbWUgZmlsZXMgaW4gdGhlIGluZGV4IGFuZCBhcmUgcmVhZHkgdG8gY29tbWl0LiBZb3Ugd2FudCB0byBzZWUgZXhhY3RseQorKndoYXQqIHlvdSBhcmUgZ29pbmcgdG8gY29tbWl0LCB3aXRob3V0IGhhdmluZyB0byB3cml0ZSBhIG5ldyB0cmVlCitvYmplY3QgYW5kIGNvbXBhcmUgaXQgdGhhdCB3YXksIGFuZCB0byBkbyB0aGF0LCB5b3UganVzdCBkbworCisJZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRAorCitFeGFtcGxlOiBsZXQncyBzYXkgSSBoYWQgcmVuYW1lZCBgY29tbWl0LmNgIHRvIGBnaXQtY29tbWl0LmNgLCBhbmQgSSBoYWQKK2RvbmUgYW4gImdpdC11cGRhdGUtaW5kZXgiIHRvIG1ha2UgdGhhdCBlZmZlY3RpdmUgaW4gdGhlIGluZGV4IGZpbGUuCisiZ2l0LWRpZmYtZmlsZXMiIHdvdWxkbid0IHNob3cgYW55dGhpbmcgYXQgYWxsLCBzaW5jZSB0aGUgaW5kZXggZmlsZQorbWF0Y2hlcyBteSB3b3JraW5nIGRpcmVjdG9yeS4gQnV0IGRvaW5nIGEgImdpdC1kaWZmLWluZGV4IiBkb2VzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L2dpdD4gZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRAorICAtMTAwNjQ0IGJsb2IgICAgNDE2MWFlY2M2NzAwYTJlYjU3OWU4NDJhZjBiN2YyMmI5ODQ0M2Y3NCAgICAgICAgY29tbWl0LmMKKyAgKzEwMDY0NCBibG9iICAgIDQxNjFhZWNjNjcwMGEyZWI1NzllODQyYWYwYjdmMjJiOTg0NDNmNzQgICAgICAgIGdpdC1jb21taXQuYworCitZb3UgY2FuIHNlZSBlYXNpbHkgdGhhdCB0aGUgYWJvdmUgaXMgYSByZW5hbWUuCisKK0luIGZhY3QsICJnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCIgKnNob3VsZCogYWx3YXlzIGJlIGVudGlyZWx5IGVxdWl2YWxlbnQgdG8KK2FjdHVhbGx5IGRvaW5nIGEgImdpdC13cml0ZS10cmVlIiBhbmQgY29tcGFyaW5nIHRoYXQuIEV4Y2VwdCB0aGlzIG9uZSBpcyBtdWNoCituaWNlciBmb3IgdGhlIGNhc2Ugd2hlcmUgeW91IGp1c3Qgd2FudCB0byBjaGVjayB3aGVyZSB5b3UgYXJlLgorCitTbyBkb2luZyBhICJnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCIgaXMgYmFzaWNhbGx5IHZlcnkgdXNlZnVsIHdoZW4geW91IGFyZQorYXNraW5nIHlvdXJzZWxmICJ3aGF0IGhhdmUgSSBhbHJlYWR5IG1hcmtlZCBmb3IgYmVpbmcgY29tbWl0dGVkLCBhbmQgCit3aGF0J3MgdGhlIGRpZmZlcmVuY2UgdG8gYSBwcmV2aW91cyB0cmVlIi4KKworTm9uLWNhY2hlZCBNb2RlCistLS0tLS0tLS0tLS0tLS0KK1RoZSAibm9uLWNhY2hlZCIgbW9kZSB0YWtlcyBhIGRpZmZlcmVudCBhcHByb2FjaCwgYW5kIGlzIHBvdGVudGlhbGx5Cit0aGUgbW9yZSB1c2VmdWwgb2YgdGhlIHR3byBpbiB0aGF0IHdoYXQgaXQgZG9lcyBjYW4ndCBiZSBlbXVsYXRlZCB3aXRoCithICJnaXQtd3JpdGUtdHJlZSIgKyAiZ2l0LWRpZmYtdHJlZSIuIFRodXMgdGhhdCdzIHRoZSBkZWZhdWx0IG1vZGUuCitUaGUgbm9uLWNhY2hlZCB2ZXJzaW9uIGFza3MgdGhlIHF1ZXN0aW9uOgorCisgIHNob3cgbWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSEVBRCBhbmQgdGhlIGN1cnJlbnRseSBjaGVja2VkIG91dAorICB0cmVlIC0gaW5kZXggY29udGVudHMgX2FuZF8gZmlsZXMgdGhhdCBhcmVuJ3QgdXAtdG8tZGF0ZQorCit3aGljaCBpcyBvYnZpb3VzbHkgYSB2ZXJ5IHVzZWZ1bCBxdWVzdGlvbiB0b28sIHNpbmNlIHRoYXQgdGVsbHMgeW91IHdoYXQKK3lvdSAqY291bGQqIGNvbW1pdC4gQWdhaW4sIHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgImdpdC1kaWZmLXRyZWUgLXIiCitvdXRwdXQgdG8gYSB0ZWUsIGJ1dCB3aXRoIGEgdHdpc3QuCisKK1RoZSB0d2lzdCBpcyB0aGF0IGlmIHNvbWUgZmlsZSBkb2Vzbid0IG1hdGNoIHRoZSBpbmRleCwgd2UgZG9uJ3QgaGF2ZQorYSBiYWNraW5nIHN0b3JlIHRoaW5nIGZvciBpdCwgYW5kIHdlIHVzZSB0aGUgbWFnaWMgImFsbC16ZXJvIiBzaGExIHRvCitzaG93IHRoYXQuIFNvIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIGVkaXRlZCBga2VybmVsL3NjaGVkLmNgLCBidXQKK2hhdmUgbm90IGFjdHVhbGx5IGRvbmUgYSAiZ2l0LXVwZGF0ZS1pbmRleCIgb24gaXQgeWV0IC0gdGhlcmUgaXMgbm8KKyJvYmplY3QiIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHN0YXRlLCBhbmQgeW91IGdldDoKKworICB0b3J2YWxkc0BwcGM5NzA6fi92Mi42L2xpbnV4PiBnaXQtZGlmZi1pbmRleCBIRUFECisgICoxMDA2NDQtPjEwMDY2NCBibG9iICAgIDc0NzZiYi4uLi4uLi0+MDAwMDAwLi4uLi4uICAgICAga2VybmVsL3NjaGVkLmMKKworaS5lLiwgaXQgc2hvd3MgdGhhdCB0aGUgdHJlZSBoYXMgY2hhbmdlZCwgYW5kIHRoYXQgYGtlcm5lbC9zY2hlZC5jYCBoYXMgaXMKK25vdCB1cC10by1kYXRlIGFuZCBtYXkgY29udGFpbiBuZXcgc3R1ZmYuIFRoZSBhbGwtemVybyBzaGExIG1lYW5zIHRoYXQgdG8KK2dldCB0aGUgcmVhbCBkaWZmLCB5b3UgbmVlZCB0byBsb29rIGF0IHRoZSBvYmplY3QgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CitkaXJlY3RseSByYXRoZXIgdGhhbiBkbyBhbiBvYmplY3QtdG8tb2JqZWN0IGRpZmYuCisKK05PVEU6IEFzIHdpdGggb3RoZXIgY29tbWFuZHMgb2YgdGhpcyB0eXBlLCAiZ2l0LWRpZmYtaW5kZXgiIGRvZXMgbm90CithY3R1YWxseSBsb29rIGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCBhbGwuIFNvIG1heWJlCitga2VybmVsL3NjaGVkLmNgIGhhc24ndCBhY3R1YWxseSBjaGFuZ2VkLCBhbmQgaXQncyBqdXN0IHRoYXQgeW91Cit0b3VjaGVkIGl0LiBJbiBlaXRoZXIgY2FzZSwgaXQncyBhIG5vdGUgdGhhdCB5b3UgbmVlZCB0bworImdpdC11cGRhdGUtaW5kZXgiIGl0IHRvIG1ha2UgdGhlIGluZGV4IGJlIGluIHN5bmMuCisKK05PVEU6IFlvdSBjYW4gaGF2ZSBhIG1peHR1cmUgb2YgZmlsZXMgc2hvdyB1cCBhcyAiaGFzIGJlZW4gdXBkYXRlZCIKK2FuZCAiaXMgc3RpbGwgZGlydHkgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IiB0b2dldGhlci4gWW91IGNhbiBhbHdheXMKK3RlbGwgd2hpY2ggZmlsZSBpcyBpbiB3aGljaCBzdGF0ZSwgc2luY2UgdGhlICJoYXMgYmVlbiB1cGRhdGVkIiBvbmVzCitzaG93IGEgdmFsaWQgc2hhMSwgYW5kIHRoZSAibm90IGluIHN5bmMgd2l0aCB0aGUgaW5kZXgiIG9uZXMgd2lsbAorYWx3YXlzIGhhdmUgdGhlIHNwZWNpYWwgYWxsLXplcm8gc2hhMS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2NjBlMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtdHJlZS50eHQKQEAgLTAsMCArMSwxNjkgQEAKK2dpdC1kaWZmLXRyZWUoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtdHJlZSAtIENvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGZvdW5kIHZpYSB0d28gdHJlZSBvYmplY3RzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWRpZmYtdHJlZScgWy0tc3RkaW5dIFstbV0gWy1zXSBbLXZdIFstLW5vLWNvbW1pdC1pZF0gWy0tcHJldHR5XQorCSAgICAgIFstdF0gWy1yXSBbLWMgfCAtLWNjXSBbLS1yb290XSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XQorCSAgICAgIDx0cmVlLWlzaD4gWzx0cmVlLWlzaD5dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgdGhlIGJsb2JzIGZvdW5kIHZpYSB0d28gdHJlZSBvYmplY3RzLgorCitJZiB0aGVyZSBpcyBvbmx5IG9uZSA8dHJlZS1pc2g+IGdpdmVuLCB0aGUgY29tbWl0IGlzIGNvbXBhcmVkIHdpdGggaXRzIHBhcmVudHMKKyhzZWUgLS1zdGRpbiBiZWxvdykuCisKK05vdGUgdGhhdCAiZ2l0LWRpZmYtdHJlZSIgY2FuIHVzZSB0aGUgdHJlZSBlbmNhcHN1bGF0ZWQgaW4gYSBjb21taXQgb2JqZWN0LgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworPHRyZWUtaXNoPjo6CisJVGhlIGlkIG9mIGEgdHJlZSBvYmplY3QuCisKKzxwYXRoPi4uLjo6CisJSWYgcHJvdmlkZWQsIHRoZSByZXN1bHRzIGFyZSBsaW1pdGVkIHRvIGEgc3Vic2V0IG9mIGZpbGVzCisJbWF0Y2hpbmcgb25lIG9mIHRoZXNlIHByZWZpeCBzdHJpbmdzLgorCWkuZS4sIGZpbGUgbWF0Y2hlcyBgL148cGF0dGVybjE+fDxwYXR0ZXJuMj58Li4uL2AKKwlOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgcHJvdmlkZSBhbnkgd2lsZGNhcmQgb3IgcmVnZXhwCisJZmVhdHVyZXMuCisKKy1yOjoKKyAgICAgICAgcmVjdXJzZSBpbnRvIHN1Yi10cmVlcworCistdDo6CisJc2hvdyB0cmVlIGVudHJ5IGl0c2VsZiBhcyB3ZWxsIGFzIHN1YnRyZWVzLiAgSW1wbGllcyAtci4KKworLS1yb290OjoKKwlXaGVuICctLXJvb3QnIGlzIHNwZWNpZmllZCB0aGUgaW5pdGlhbCBjb21taXQgd2lsbCBiZSBzaG93ZWQgYXMgYSBiaWcKKwljcmVhdGlvbiBldmVudC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgZGlmZiBhZ2FpbnN0IHRoZSBOVUxMIHRyZWUuCisKKy0tc3RkaW46OgorCVdoZW4gJy0tc3RkaW4nIGlzIHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgZG9lcyBub3QgdGFrZQorCTx0cmVlLWlzaD4gYXJndW1lbnRzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIEluc3RlYWQsIGl0CisJcmVhZHMgZWl0aGVyIG9uZSA8Y29tbWl0PiBvciBhIHBhaXIgb2YgPHRyZWUtaXNoPgorCXNlcGFyYXRlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0LgorKworV2hlbiBhIHNpbmdsZSBjb21taXQgaXMgZ2l2ZW4gb24gb25lIGxpbmUgb2Ygc3VjaCBpbnB1dCwgaXQgY29tcGFyZXMKK3RoZSBjb21taXQgd2l0aCBpdHMgcGFyZW50cy4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgZnVydGhlciBhZmZlY3RzIGl0cworYmVoYXZpb3IuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBjYXNlIHdoZXJlIHR3byA8dHJlZS1pc2g+CitzZXBhcmF0ZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBhcmUgZ2l2ZW4uCisKKy1tOjoKKwlCeSBkZWZhdWx0LCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIiBkb2VzIG5vdCBzaG93CisJZGlmZmVyZW5jZXMgZm9yIG1lcmdlIGNvbW1pdHMuICBXaXRoIHRoaXMgZmxhZywgaXQgc2hvd3MKKwlkaWZmZXJlbmNlcyB0byB0aGF0IGNvbW1pdCBmcm9tIGFsbCBvZiBpdHMgcGFyZW50cy4gU2VlCisJYWxzbyAnLWMnLgorCistczo6CisJQnkgZGVmYXVsdCwgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiIgc2hvd3MgZGlmZmVyZW5jZXMsCisJZWl0aGVyIGluIG1hY2hpbmUtcmVhZGFibGUgZm9ybSAod2l0aG91dCAnLXAnKSBvciBpbiBwYXRjaAorCWZvcm0gKHdpdGggJy1wJykuICBUaGlzIG91dHB1dCBjYW4gYmUgc3VwcHJlc3NlZC4gIEl0IGlzCisJb25seSB1c2VmdWwgd2l0aCAnLXYnIGZsYWcuCisKKy12OjoKKwlUaGlzIGZsYWcgY2F1c2VzICJnaXQtZGlmZi10cmVlIC0tc3RkaW4iIHRvIGFsc28gc2hvdworCXRoZSBjb21taXQgbWVzc2FnZSBiZWZvcmUgdGhlIGRpZmZlcmVuY2VzLgorCitpbmNsdWRlOjpwcmV0dHktb3B0aW9ucy50eHRbXQorCistLW5vLWNvbW1pdC1pZDo6CisJZ2l0LWRpZmYtdHJlZSBvdXRwdXRzIGEgbGluZSB3aXRoIHRoZSBjb21taXQgSUQgd2hlbgorCWFwcGxpY2FibGUuICBUaGlzIGZsYWcgc3VwcHJlc3NlZCB0aGUgY29tbWl0IElEIG91dHB1dC4KKworLWM6OgorCVRoaXMgZmxhZyBjaGFuZ2VzIHRoZSB3YXkgYSBtZXJnZSBjb21taXQgaXMgZGlzcGxheWVkCisJKHdoaWNoIG1lYW5zIGl0IGlzIHVzZWZ1bCBvbmx5IHdoZW4gdGhlIGNvbW1hbmQgaXMgZ2l2ZW4KKwlvbmUgPHRyZWUtaXNoPiwgb3IgJy0tc3RkaW4nKS4gIEl0IHNob3dzIHRoZSBkaWZmZXJlbmNlcworCWZyb20gZWFjaCBvZiB0aGUgcGFyZW50cyB0byB0aGUgbWVyZ2UgcmVzdWx0IHNpbXVsdGFuZW91c2x5CisJaW5zdGVhZCBvZiBzaG93aW5nIHBhaXJ3aXNlIGRpZmYgYmV0d2VlbiBhIHBhcmVudCBhbmQgdGhlCisJcmVzdWx0IG9uZSBhdCBhIHRpbWUgKHdoaWNoIGlzIHdoYXQgdGhlICctbScgb3B0aW9uIGRvZXMpLgorCUZ1cnRoZXJtb3JlLCBpdCBsaXN0cyBvbmx5IGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQKKwlmcm9tIGFsbCBwYXJlbnRzLgorCistLWNjOjoKKwlUaGlzIGZsYWcgY2hhbmdlcyB0aGUgd2F5IGEgbWVyZ2UgY29tbWl0IHBhdGNoIGlzIGRpc3BsYXllZCwKKwlpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSAnLWMnIG9wdGlvbi4gSXQgaW1wbGllcyB0aGUgJy1jJworCWFuZCAnLXAnIG9wdGlvbnMgYW5kIGZ1cnRoZXIgY29tcHJlc3NlcyB0aGUgcGF0Y2ggb3V0cHV0CisJYnkgb21pdHRpbmcgaHVua3MgdGhhdCBzaG93IGRpZmZlcmVuY2VzIGZyb20gb25seSBvbmUKKwlwYXJlbnQsIG9yIHNob3cgdGhlIHNhbWUgY2hhbmdlIGZyb20gYWxsIGJ1dCBvbmUgcGFyZW50CisJZm9yIGFuIE9jdG9wdXMgbWVyZ2UuICBXaGVuIHRoaXMgb3B0aW1pemF0aW9uIG1ha2VzIGFsbAorCWh1bmtzIGRpc2FwcGVhciwgdGhlIGNvbW1pdCBpdHNlbGYgYW5kIHRoZSBjb21taXQgbG9nCisJbWVzc2FnZSBpcyBub3Qgc2hvd24sIGp1c3QgbGlrZSBpbiBhbnkgb3RoZXIgImVtcHR5IGRpZmYiIGNhc2UuCisKKy0tYWx3YXlzOjoKKwlTaG93IHRoZSBjb21taXQgaXRzZWxmIGFuZCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGV2ZW4KKwlpZiB0aGUgZGlmZiBpdHNlbGYgaXMgZW1wdHkuCisKKworaW5jbHVkZTo6cHJldHR5LWZvcm1hdHMudHh0W10KKworCitMaW1pdGluZyBPdXRwdXQKKy0tLS0tLS0tLS0tLS0tLQorSWYgeW91J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBkaWZmZXJlbmNlcyBpbiBhIHN1YnNldCBvZiBmaWxlcywgZm9yCitleGFtcGxlIHNvbWUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzLCB5b3UgbWlnaHQgZG86CisKKwlnaXQtZGlmZi10cmVlIC1yIDx0cmVlLWlzaD4gPHRyZWUtaXNoPiBhcmNoL2lhNjQgaW5jbHVkZS9hc20taWE2NAorCithbmQgaXQgd2lsbCBvbmx5IHNob3cgeW91IHdoYXQgY2hhbmdlZCBpbiB0aG9zZSB0d28gZGlyZWN0b3JpZXMuCisKK09yIGlmIHlvdSBhcmUgc2VhcmNoaW5nIGZvciB3aGF0IGNoYW5nZWQgaW4ganVzdCBga2VybmVsL3NjaGVkLmNgLCBqdXN0IGRvCisKKwlnaXQtZGlmZi10cmVlIC1yIDx0cmVlLWlzaD4gPHRyZWUtaXNoPiBrZXJuZWwvc2NoZWQuYworCithbmQgaXQgd2lsbCBpZ25vcmUgYWxsIGRpZmZlcmVuY2VzIHRvIG90aGVyIGZpbGVzLgorCitUaGUgcGF0dGVybiBpcyBhbHdheXMgdGhlIHByZWZpeCwgYW5kIGlzIG1hdGNoZWQgZXhhY3RseS4gIFRoZXJlIGFyZSBubword2lsZGNhcmRzLiAgRXZlbiBzdHJpY3RlciwgaXQgaGFzIHRvIG1hdGNoIGEgY29tcGxldGUgcGF0aCBjb21wb25lbnQuCitJLmUuICJmb28iIGRvZXMgbm90IHBpY2sgdXAgYGZvb2Jhci5oYC4gICJmb28iIGRvZXMgbWF0Y2ggYGZvby9iYXIuaGAKK3NvIGl0IGNhbiBiZSB1c2VkIHRvIG5hbWUgc3ViZGlyZWN0b3JpZXMuCisKK0FuIGV4YW1wbGUgb2Ygbm9ybWFsIHVzYWdlIGlzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L2dpdD4gZ2l0LWRpZmYtdHJlZSA1MzE5ZTQuLi4uLi4KKyAgKjEwMDY2NC0+MTAwNjY0IGJsb2IgICAgYWMzNDhiLi4uLi4uLi0+YTAxNTEzLi4uLi4uLiAgICAgIGdpdC1mc2NrLW9iamVjdHMuYworCit3aGljaCB0ZWxscyB5b3UgdGhhdCB0aGUgbGFzdCBjb21taXQgY2hhbmdlZCBqdXN0IG9uZSBmaWxlIChpdCdzIGZyb20KK3RoaXMgb25lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY29tbWl0IDNjNmY3Y2ExOWFkNDA0M2U5ZTcyZmE5NDEwNmYzNTI4OTdlNjUxYTgKK3RyZWUgNTMxOWU0ZDYwOWNkZDI4MjA2OWNjNGRjZTMzYzFkYjU1OTUzOWIwMworcGFyZW50IGI0ZTYyOGVhMzBkNWFiMzYwNjExOWQyZWE1Y2FlYWIxNDFkMzhkZjcKK2F1dGhvciBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAcHBjOTcwLm9zZGwub3JnPiBTYXQgQXByIDkgMTI6MDI6MzAgMjAwNQorY29tbWl0dGVyIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0BwcGM5NzAub3NkbC5vcmc+IFNhdCBBcHIgOSAxMjowMjozMCAyMDA1CisKK01ha2UgImdpdC1mc2NrLW9iamVjdHMiIHByaW50IG91dCBhbGwgdGhlIHJvb3QgY29tbWl0cyBpdCBmaW5kcy4KKworT25jZSBJIGRvIHRoZSByZWZlcmVuY2UgdHJhY2tpbmcsIEknbGwgYWxzbyBtYWtlIGl0IHByaW50IG91dCBhbGwgdGhlCitIRUFEIGNvbW1pdHMgaXQgZmluZHMsIHdoaWNoIGlzIGV2ZW4gbW9yZSBpbnRlcmVzdGluZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2luIGNhc2UgeW91IGNhcmUpLgorCitPdXRwdXQgZm9ybWF0CistLS0tLS0tLS0tLS0tCitpbmNsdWRlOjpkaWZmLWZvcm1hdC50eHRbXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NGNlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLnR4dApAQCAtMCwwICsxLDE0MSBAQAorZ2l0LWRpZmYoMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmIC0gU2hvdyBjaGFuZ2VzIGJldHdlZW4gY29tbWl0cywgY29tbWl0IGFuZCB3b3JraW5nIHRyZWUsIGV0YworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kaWZmJyBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8Y29tbWl0PnswLDJ9IFstLV0gWzxwYXRoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTaG93IGNoYW5nZXMgYmV0d2VlbiB0d28gdHJlZXMsIGEgdHJlZSBhbmQgdGhlIHdvcmtpbmcgdHJlZSwgYQordHJlZSBhbmQgdGhlIGluZGV4IGZpbGUsIG9yIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUgd29ya2luZyB0cmVlLgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIFstLV0gWzxwYXRoPi4uLl06OgorCisJVGhpcyBmb3JtIGlzIHRvIHZpZXcgdGhlIGNoYW5nZXMgeW91IG1hZGUgcmVsYXRpdmUgdG8KKwl0aGUgaW5kZXggKHN0YWdpbmcgYXJlYSBmb3IgdGhlIG5leHQgY29tbWl0KS4gIEluIG90aGVyCisJd29yZHMsIHRoZSBkaWZmZXJlbmNlcyBhcmUgd2hhdCB5b3UgX2NvdWxkXyB0ZWxsIGdpdCB0bworCWZ1cnRoZXIgYWRkIHRvIHRoZSBpbmRleCBidXQgeW91IHN0aWxsIGhhdmVuJ3QuICBZb3UgY2FuCisJc3RhZ2UgdGhlc2UgY2hhbmdlcyBieSB1c2luZyBnaXRsaW5rOmdpdC1hZGRbMV0uCisKKwlJZiBleGFjdGx5IHR3byBwYXRocyBhcmUgZ2l2ZW4sIGFuZCBhdCBsZWFzdCBvbmUgaXMgdW50cmFja2VkLAorCWNvbXBhcmUgdGhlIHR3byBmaWxlcyAvIGRpcmVjdG9yaWVzLiBUaGlzIGJlaGF2aW9yIGNhbiBiZQorCWZvcmNlZCBieSAtLW5vLWluZGV4LgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIC0tY2FjaGVkIFs8Y29tbWl0Pl0gWy0tXSBbPHBhdGg+Li4uXTo6CisKKwlUaGlzIGZvcm0gaXMgdG8gdmlldyB0aGUgY2hhbmdlcyB5b3Ugc3RhZ2VkIGZvciB0aGUgbmV4dAorCWNvbW1pdCByZWxhdGl2ZSB0byB0aGUgbmFtZWQgPGNvbW1pdD4uICBUeXBpY2FsbHkgeW91CisJd291bGQgd2FudCBjb21wYXJpc29uIHdpdGggdGhlIGxhdGVzdCBjb21taXQsIHNvIGlmIHlvdQorCWRvIG5vdCBnaXZlIDxjb21taXQ+LCBpdCBkZWZhdWx0cyB0byBIRUFELgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIDxjb21taXQ+IFstLV0gWzxwYXRoPi4uLl06OgorCisJVGhpcyBmb3JtIGlzIHRvIHZpZXcgdGhlIGNoYW5nZXMgeW91IGhhdmUgaW4geW91cgorCXdvcmtpbmcgdHJlZSByZWxhdGl2ZSB0byB0aGUgbmFtZWQgPGNvbW1pdD4uICBZb3UgY2FuCisJdXNlIEhFQUQgdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBsYXRlc3QgY29tbWl0LCBvciBhCisJYnJhbmNoIG5hbWUgdG8gY29tcGFyZSB3aXRoIHRoZSB0aXAgb2YgYSBkaWZmZXJlbnQKKwlicmFuY2guCisKKydnaXQtZGlmZicgWy0tb3B0aW9uc10gPGNvbW1pdD4gPGNvbW1pdD4gWy0tXSBbPHBhdGg+Li4uXTo6CisKKwlUaGlzIGZvcm0gaXMgdG8gdmlldyB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byA8Y29tbWl0PiwKKwlmb3IgZXhhbXBsZSwgdGlwcyBvZiB0d28gYnJhbmNoZXMuCisKK0p1c3QgaW4gY2FzZSBpZiB5b3UgYXJlIGRvaW5nIHNvbWV0aGluZyBleG90aWMsIGl0IHNob3VsZCBiZQorbm90ZWQgdGhhdCBhbGwgb2YgdGhlIDxjb21taXQ+IGluIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiBjYW4gYmUKK2FueSA8dHJlZS1pc2g+LgorCitGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCA8Y29tbWl0Piwgc2VlCisiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8cGF0aD4uLi46OgorCVRoZSA8cGF0aHM+IHBhcmFtZXRlcnMsIHdoZW4gZ2l2ZW4sIGFyZSB1c2VkIHRvIGxpbWl0CisJdGhlIGRpZmYgdG8gdGhlIG5hbWVkIHBhdGhzICh5b3UgY2FuIGdpdmUgZGlyZWN0b3J5CisJbmFtZXMgYW5kIGdldCBkaWZmIGZvciBhbGwgZmlsZXMgdW5kZXIgdGhlbSkuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK1ZhcmlvdXMgd2F5cyB0byBjaGVjayB5b3VyIHdvcmtpbmcgdHJlZTo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgICAgICAgICAgICA8MT4KKyQgZ2l0IGRpZmYgLS1jYWNoZWQgICA8Mj4KKyQgZ2l0IGRpZmYgSEVBRCAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBub3QgeWV0IHN0YWdlZCBmb3IgdGhlIG5leHQgY29tbWl0LgorPDI+IGNoYW5nZXMgYmV0d2VlbiB0aGUgaW5kZXggYW5kIHlvdXIgbGFzdCBjb21taXQ7IHdoYXQgeW91Cit3b3VsZCBiZSBjb21taXR0aW5nIGlmIHlvdSBydW4gImdpdCBjb21taXQiIHdpdGhvdXQgIi1hIiBvcHRpb24uCis8Mz4gY2hhbmdlcyBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHlvdXIgbGFzdCBjb21taXQ7IHdoYXQgeW91Cit3b3VsZCBiZSBjb21taXR0aW5nIGlmIHlvdSBydW4gImdpdCBjb21taXQgLWEiCisKK0NvbXBhcmluZyB3aXRoIGFyYml0cmFyeSBjb21taXRzOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiB0ZXN0ICAgICAgICAgICAgPDE+CiskIGdpdCBkaWZmIEhFQUQgLS0gLi90ZXN0ICA8Mj4KKyQgZ2l0IGRpZmYgSEVBRF4gSEVBRCAgICAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gaW5zdGVhZCBvZiB1c2luZyB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaCwgY29tcGFyZSB3aXRoIHRoZQordGlwIG9mICJ0ZXN0IiBicmFuY2guCis8Mj4gaW5zdGVhZCBvZiBjb21wYXJpbmcgd2l0aCB0aGUgdGlwIG9mICJ0ZXN0IiBicmFuY2gsIGNvbXBhcmUgd2l0aAordGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gsIGJ1dCBsaW1pdCB0aGUgY29tcGFyaXNvbiB0byB0aGUKK2ZpbGUgInRlc3QiLgorPDM+IGNvbXBhcmUgdGhlIHZlcnNpb24gYmVmb3JlIHRoZSBsYXN0IGNvbW1pdCBhbmQgdGhlIGxhc3QgY29tbWl0LgorCisKK0xpbWl0aW5nIHRoZSBkaWZmIG91dHB1dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1kaWZmLWZpbHRlcj1NUkMgICAgICAgICAgICA8MT4KKyQgZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyAtciAgICAgICAgICAgICA8Mj4KKyQgZ2l0IGRpZmYgYXJjaC9pMzg2IGluY2x1ZGUvYXNtLWkzODYgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHNob3cgb25seSBtb2RpZmljYXRpb24sIHJlbmFtZSBhbmQgY29weSwgYnV0IG5vdCBhZGRpdGlvbgorbm9yIGRlbGV0aW9uLgorPDI+IHNob3cgb25seSBuYW1lcyBhbmQgdGhlIG5hdHVyZSBvZiBjaGFuZ2UsIGJ1dCBub3QgYWN0dWFsCitkaWZmIG91dHB1dC4gIC0tbmFtZS1zdGF0dXMgZGlzYWJsZXMgdXN1YWwgcGF0Y2ggZ2VuZXJhdGlvbgord2hpY2ggaW4gdHVybiBhbHNvIGRpc2FibGVzIHJlY3Vyc2l2ZSBiZWhhdmlvciwgc28gd2l0aG91dCAtcgoreW91IHdvdWxkIG9ubHkgc2VlIHRoZSBkaXJlY3RvcnkgbmFtZSBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhCitmaWxlIGluIGEgc3ViZGlyZWN0b3J5LgorPDM+IGxpbWl0IGRpZmYgb3V0cHV0IHRvIG5hbWVkIHN1YnRyZWVzLgorCitNdW5naW5nIHRoZSBkaWZmIG91dHB1dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1maW5kLWNvcGllcy1oYXJkZXIgLUIgLUMgIDwxPgorJCBnaXQgZGlmZiAtUiAgICAgICAgICAgICAgICAgICAgICAgICAgPDI+CistLS0tLS0tLS0tLS0KKysKKzwxPiBzcGVuZCBleHRyYSBjeWNsZXMgdG8gZmluZCByZW5hbWVzLCBjb3BpZXMgYW5kIGNvbXBsZXRlCityZXdyaXRlcyAodmVyeSBleHBlbnNpdmUpLgorPDI+IG91dHB1dCBkaWZmIGluIHJldmVyc2UuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZhc3QtaW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWZhc3QtaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U3MGZlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZmFzdC1pbXBvcnQudHh0CkBAIC0wLDAgKzEsOTEzIEBACitnaXQtZmFzdC1pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmFzdC1pbXBvcnQgLSBCYWNrZW5kIGZvciBmYXN0IEdpdCBkYXRhIGltcG9ydGVycworCisKK1NZTk9QU0lTCistLS0tLS0tLQorZnJvbnRlbmQgfCAnZ2l0LWZhc3QtaW1wb3J0JyBbb3B0aW9uc10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gaXMgdXN1YWxseSBub3Qgd2hhdCB0aGUgZW5kIHVzZXIgd2FudHMgdG8gcnVuIGRpcmVjdGx5LgorTW9zdCBlbmQgdXNlcnMgd2FudCB0byB1c2Ugb25lIG9mIHRoZSBleGlzdGluZyBmcm9udGVuZCBwcm9ncmFtcywKK3doaWNoIHBhcnNlcyBhIHNwZWNpZmljIHR5cGUgb2YgZm9yZWlnbiBzb3VyY2UgYW5kIGZlZWRzIHRoZSBjb250ZW50cworc3RvcmVkIHRoZXJlIHRvIGdpdC1mYXN0LWltcG9ydC4KKworZmFzdC1pbXBvcnQgcmVhZHMgYSBtaXhlZCBjb21tYW5kL2RhdGEgc3RyZWFtIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kCit3cml0ZXMgb25lIG9yIG1vcmUgcGFja2ZpbGVzIGRpcmVjdGx5IGludG8gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS4KK1doZW4gRU9GIGlzIHJlY2VpdmVkIG9uIHN0YW5kYXJkIGlucHV0LCBmYXN0IGltcG9ydCB3cml0ZXMgb3V0Cit1cGRhdGVkIGJyYW5jaCBhbmQgdGFnIHJlZnMsIGZ1bGx5IHVwZGF0aW5nIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkKK3dpdGggdGhlIG5ld2x5IGltcG9ydGVkIGRhdGEuCisKK1RoZSBmYXN0LWltcG9ydCBiYWNrZW5kIGl0c2VsZiBjYW4gaW1wb3J0IGludG8gYW4gZW1wdHkgcmVwb3NpdG9yeSAob25lIHRoYXQKK2hhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYnkgZ2l0bGluazpnaXQtaW5pdFsxXSkgb3IgaW5jcmVtZW50YWxseQordXBkYXRlIGFuIGV4aXN0aW5nIHBvcHVsYXRlZCByZXBvc2l0b3J5LiAgV2hldGhlciBvciBub3QgaW5jcmVtZW50YWwKK2ltcG9ydHMgYXJlIHN1cHBvcnRlZCBmcm9tIGEgcGFydGljdWxhciBmb3JlaWduIHNvdXJjZSBkZXBlbmRzIG9uCit0aGUgZnJvbnRlbmQgcHJvZ3JhbSBpbiB1c2UuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1kYXRlLWZvcm1hdD08Zm10Pjo6CisJU3BlY2lmeSB0aGUgdHlwZSBvZiBkYXRlcyB0aGUgZnJvbnRlbmQgd2lsbCBzdXBwbHkgdG8KKwlmYXN0LWltcG9ydCB3aXRoaW4gYGF1dGhvcmAsIGBjb21taXR0ZXJgIGFuZCBgdGFnZ2VyYCBjb21tYW5kcy4KKwlTZWUgYGBEYXRlIEZvcm1hdHMnJyBiZWxvdyBmb3IgZGV0YWlscyBhYm91dCB3aGljaCBmb3JtYXRzCisJYXJlIHN1cHBvcnRlZCwgYW5kIHRoZWlyIHN5bnRheC4KKworLS1mb3JjZTo6CisJRm9yY2UgdXBkYXRpbmcgbW9kaWZpZWQgZXhpc3RpbmcgYnJhbmNoZXMsIGV2ZW4gaWYgZG9pbmcKKwlzbyB3b3VsZCBjYXVzZSBjb21taXRzIHRvIGJlIGxvc3QgKGFzIHRoZSBuZXcgY29tbWl0IGRvZXMKKwlub3QgY29udGFpbiB0aGUgb2xkIGNvbW1pdCkuCisKKy0tbWF4LXBhY2stc2l6ZT08bj46OgorCU1heGltdW0gc2l6ZSBvZiBlYWNoIG91dHB1dCBwYWNrZmlsZSwgZXhwcmVzc2VkIGluIE1pQi4KKwlUaGUgZGVmYXVsdCBpcyA0MDk2ICg0IEdpQikgYXMgdGhhdCBpcyB0aGUgbWF4aW11bSBhbGxvd2VkCisJcGFja2ZpbGUgc2l6ZSAoZHVlIHRvIGZpbGUgZm9ybWF0IGxpbWl0YXRpb25zKS4gU29tZQorCWltcG9ydGVycyBtYXkgd2lzaCB0byBsb3dlciB0aGlzLCBzdWNoIGFzIHRvIGVuc3VyZSB0aGUKKwlyZXN1bHRpbmcgcGFja2ZpbGVzIGZpdCBvbiBDRHMuCisKKy0tZGVwdGg9PG4+OjoKKwlNYXhpbXVtIGRlbHRhIGRlcHRoLCBmb3IgYmxvYiBhbmQgdHJlZSBkZWx0aWZpY2F0aW9uLgorCURlZmF1bHQgaXMgMTAuCisKKy0tYWN0aXZlLWJyYW5jaGVzPTxuPjo6CisJTWF4aW11bSBudW1iZXIgb2YgYnJhbmNoZXMgdG8gbWFpbnRhaW4gYWN0aXZlIGF0IG9uY2UuCisJU2VlIGBgTWVtb3J5IFV0aWxpemF0aW9uJycgYmVsb3cgZm9yIGRldGFpbHMuICBEZWZhdWx0IGlzIDUuCisKKy0tZXhwb3J0LW1hcmtzPTxmaWxlPjo6CisJRHVtcHMgdGhlIGludGVybmFsIG1hcmtzIHRhYmxlIHRvIDxmaWxlPiB3aGVuIGNvbXBsZXRlLgorCU1hcmtzIGFyZSB3cml0dGVuIG9uZSBwZXIgbGluZSBhcyBgOm1hcmtpZCBTSEEtMWAuCisJRnJvbnRlbmRzIGNhbiB1c2UgdGhpcyBmaWxlIHRvIHZhbGlkYXRlIGltcG9ydHMgYWZ0ZXIgdGhleQorCWhhdmUgYmVlbiBjb21wbGV0ZWQsIG9yIHRvIHNhdmUgdGhlIG1hcmtzIHRhYmxlIGFjcm9zcworCWluY3JlbWVudGFsIHJ1bnMuICBBcyA8ZmlsZT4gaXMgb25seSBvcGVuZWQgYW5kIHRydW5jYXRlZAorCWF0IGNoZWNrcG9pbnQgKG9yIGNvbXBsZXRpb24pIHRoZSBzYW1lIHBhdGggY2FuIGFsc28gYmUKKwlzYWZlbHkgZ2l2ZW4gdG8gXC0taW1wb3J0LW1hcmtzLgorCistLWltcG9ydC1tYXJrcz08ZmlsZT46OgorCUJlZm9yZSBwcm9jZXNzaW5nIGFueSBpbnB1dCwgbG9hZCB0aGUgbWFya3Mgc3BlY2lmaWVkIGluCisJPGZpbGU+LiAgVGhlIGlucHV0IGZpbGUgbXVzdCBleGlzdCwgbXVzdCBiZSByZWFkYWJsZSwgYW5kCisJbXVzdCB1c2UgdGhlIHNhbWUgZm9ybWF0IGFzIHByb2R1Y2VkIGJ5IFwtLWV4cG9ydC1tYXJrcy4KKwlNdWx0aXBsZSBvcHRpb25zIG1heSBiZSBzdXBwbGllZCB0byBpbXBvcnQgbW9yZSB0aGFuIG9uZQorCXNldCBvZiBtYXJrcy4gIElmIGEgbWFyayBpcyBkZWZpbmVkIHRvIGRpZmZlcmVudCB2YWx1ZXMsCisJdGhlIGxhc3QgZmlsZSB3aW5zLgorCistLWV4cG9ydC1wYWNrLWVkZ2VzPTxmaWxlPjo6CisJQWZ0ZXIgY3JlYXRpbmcgYSBwYWNrZmlsZSwgcHJpbnQgYSBsaW5lIG9mIGRhdGEgdG8KKwk8ZmlsZT4gbGlzdGluZyB0aGUgZmlsZW5hbWUgb2YgdGhlIHBhY2tmaWxlIGFuZCB0aGUgbGFzdAorCWNvbW1pdCBvbiBlYWNoIGJyYW5jaCB0aGF0IHdhcyB3cml0dGVuIHRvIHRoYXQgcGFja2ZpbGUuCisJVGhpcyBpbmZvcm1hdGlvbiBtYXkgYmUgdXNlZnVsIGFmdGVyIGltcG9ydGluZyBwcm9qZWN0cworCXdob3NlIHRvdGFsIG9iamVjdCBzZXQgZXhjZWVkcyB0aGUgNCBHaUIgcGFja2ZpbGUgbGltaXQsCisJYXMgdGhlc2UgY29tbWl0cyBjYW4gYmUgdXNlZCBhcyBlZGdlIHBvaW50cyBkdXJpbmcgY2FsbHMKKwl0byBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy0tcXVpZXQ6OgorCURpc2FibGUgYWxsIG5vbi1mYXRhbCBvdXRwdXQsIG1ha2luZyBmYXN0LWltcG9ydCBzaWxlbnQgd2hlbiBpdAorCWlzIHN1Y2Nlc3NmdWwuCVRoaXMgb3B0aW9uIGRpc2FibGVzIHRoZSBvdXRwdXQgc2hvd24gYnkKKwlcLS1zdGF0cy4KKworLS1zdGF0czo6CisJRGlzcGxheSBzb21lIGJhc2ljIHN0YXRpc3RpY3MgYWJvdXQgdGhlIG9iamVjdHMgZmFzdC1pbXBvcnQgaGFzCisJY3JlYXRlZCwgdGhlIHBhY2tmaWxlcyB0aGV5IHdlcmUgc3RvcmVkIGludG8sIGFuZCB0aGUKKwltZW1vcnkgdXNlZCBieSBmYXN0LWltcG9ydCBkdXJpbmcgdGhpcyBydW4uICBTaG93aW5nIHRoaXMgb3V0cHV0CisJaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0LCBidXQgY2FuIGJlIGRpc2FibGVkIHdpdGggXC0tcXVpZXQuCisKKworUGVyZm9ybWFuY2UKKy0tLS0tLS0tLS0tCitUaGUgZGVzaWduIG9mIGZhc3QtaW1wb3J0IGFsbG93cyBpdCB0byBpbXBvcnQgbGFyZ2UgcHJvamVjdHMgaW4gYSBtaW5pbXVtCithbW91bnQgb2YgbWVtb3J5IHVzYWdlIGFuZCBwcm9jZXNzaW5nIHRpbWUuICBBc3N1bWluZyB0aGUgZnJvbnRlbmQKK2lzIGFibGUgdG8ga2VlcCB1cCB3aXRoIGZhc3QtaW1wb3J0IGFuZCBmZWVkIGl0IGEgY29uc3RhbnQgc3RyZWFtIG9mIGRhdGEsCitpbXBvcnQgdGltZXMgZm9yIHByb2plY3RzIGhvbGRpbmcgMTArIHllYXJzIG9mIGhpc3RvcnkgYW5kIGNvbnRhaW5pbmcKKzEwMCwwMDArIGluZGl2aWR1YWwgY29tbWl0cyBhcmUgZ2VuZXJhbGx5IGNvbXBsZXRlZCBpbiBqdXN0IDEtMgoraG91cnMgb24gcXVpdGUgbW9kZXN0ICh+JDIsMDAwIFVTRCkgaGFyZHdhcmUuCisKK01vc3QgYm90dGxlbmVja3MgYXBwZWFyIHRvIGJlIGluIGZvcmVpZ24gc291cmNlIGRhdGEgYWNjZXNzICh0aGUKK3NvdXJjZSBqdXN0IGNhbm5vdCBleHRyYWN0IHJldmlzaW9ucyBmYXN0IGVub3VnaCkgb3IgZGlzayBJTyAoZmFzdC1pbXBvcnQKK3dyaXRlcyBhcyBmYXN0IGFzIHRoZSBkaXNrIHdpbGwgdGFrZSB0aGUgZGF0YSkuICBJbXBvcnRzIHdpbGwgcnVuCitmYXN0ZXIgaWYgdGhlIHNvdXJjZSBkYXRhIGlzIHN0b3JlZCBvbiBhIGRpZmZlcmVudCBkcml2ZSB0aGFuIHRoZQorZGVzdGluYXRpb24gR2l0IHJlcG9zaXRvcnkgKGR1ZSB0byBsZXNzIElPIGNvbnRlbnRpb24pLgorCisKK0RldmVsb3BtZW50IENvc3QKKy0tLS0tLS0tLS0tLS0tLS0KK0EgdHlwaWNhbCBmcm9udGVuZCBmb3IgZmFzdC1pbXBvcnQgdGVuZHMgdG8gd2VpZ2ggaW4gYXQgYXBwcm94aW1hdGVseSAyMDAKK2xpbmVzIG9mIFBlcmwvUHl0aG9uL1J1YnkgY29kZS4gIE1vc3QgZGV2ZWxvcGVycyBoYXZlIGJlZW4gYWJsZSB0bworY3JlYXRlIHdvcmtpbmcgaW1wb3J0ZXJzIGluIGp1c3QgYSBjb3VwbGUgb2YgaG91cnMsIGV2ZW4gdGhvdWdoIGl0CitpcyB0aGVpciBmaXJzdCBleHBvc3VyZSB0byBmYXN0LWltcG9ydCwgYW5kIHNvbWV0aW1lcyBldmVuIHRvIEdpdC4gIFRoaXMgaXMKK2FuIGlkZWFsIHNpdHVhdGlvbiwgZ2l2ZW4gdGhhdCBtb3N0IGNvbnZlcnNpb24gdG9vbHMgYXJlIHRocm93LWF3YXkKKyh1c2Ugb25jZSwgYW5kIG5ldmVyIGxvb2sgYmFjaykuCisKKworUGFyYWxsZWwgT3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KK0xpa2UgYGdpdC1wdXNoYCBvciBgZ2l0LWZldGNoYCwgaW1wb3J0cyBoYW5kbGVkIGJ5IGZhc3QtaW1wb3J0IGFyZSBzYWZlIHRvCitydW4gYWxvbmdzaWRlIHBhcmFsbGVsIGBnaXQgcmVwYWNrIC1hIC1kYCBvciBgZ2l0IGdjYCBpbnZvY2F0aW9ucywKK29yIGFueSBvdGhlciBHaXQgb3BlcmF0aW9uIChpbmNsdWRpbmcgYGdpdCBwcnVuZWAsIGFzIGxvb3NlIG9iamVjdHMKK2FyZSBuZXZlciB1c2VkIGJ5IGZhc3QtaW1wb3J0KS4KKworZmFzdC1pbXBvcnQgZG9lcyBub3QgbG9jayB0aGUgYnJhbmNoIG9yIHRhZyByZWZzIGl0IGlzIGFjdGl2ZWx5IGltcG9ydGluZy4KK0FmdGVyIHRoZSBpbXBvcnQsIGR1cmluZyBpdHMgcmVmIHVwZGF0ZSBwaGFzZSwgZmFzdC1pbXBvcnQgdGVzdHMgZWFjaAorZXhpc3RpbmcgYnJhbmNoIHJlZiB0byB2ZXJpZnkgdGhlIHVwZGF0ZSB3aWxsIGJlIGEgZmFzdC1mb3J3YXJkCit1cGRhdGUgKHRoZSBjb21taXQgc3RvcmVkIGluIHRoZSByZWYgaXMgY29udGFpbmVkIGluIHRoZSBuZXcKK2hpc3Rvcnkgb2YgdGhlIGNvbW1pdCB0byBiZSB3cml0dGVuKS4gIElmIHRoZSB1cGRhdGUgaXMgbm90IGEKK2Zhc3QtZm9yd2FyZCB1cGRhdGUsIGZhc3QtaW1wb3J0IHdpbGwgc2tpcCB1cGRhdGluZyB0aGF0IHJlZiBhbmQgaW5zdGVhZAorcHJpbnRzIGEgd2FybmluZyBtZXNzYWdlLiAgZmFzdC1pbXBvcnQgd2lsbCBhbHdheXMgYXR0ZW1wdCB0byB1cGRhdGUgYWxsCiticmFuY2ggcmVmcywgYW5kIGRvZXMgbm90IHN0b3Agb24gdGhlIGZpcnN0IGZhaWx1cmUuCisKK0JyYW5jaCB1cGRhdGVzIGNhbiBiZSBmb3JjZWQgd2l0aCBcLS1mb3JjZSwgYnV0IGl0cyByZWNvbW1lbmRlZCB0aGF0Cit0aGlzIG9ubHkgYmUgdXNlZCBvbiBhbiBvdGhlcndpc2UgcXVpZXQgcmVwb3NpdG9yeS4gIFVzaW5nIFwtLWZvcmNlCitpcyBub3QgbmVjZXNzYXJ5IGZvciBhbiBpbml0aWFsIGltcG9ydCBpbnRvIGFuIGVtcHR5IHJlcG9zaXRvcnkuCisKKworVGVjaG5pY2FsIERpc2N1c3Npb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitmYXN0LWltcG9ydCB0cmFja3MgYSBzZXQgb2YgYnJhbmNoZXMgaW4gbWVtb3J5LiAgQW55IGJyYW5jaCBjYW4gYmUgY3JlYXRlZAorb3IgbW9kaWZpZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgaW1wb3J0IHByb2Nlc3MgYnkgc2VuZGluZyBhCitgY29tbWl0YCBjb21tYW5kIG9uIHRoZSBpbnB1dCBzdHJlYW0uICBUaGlzIGRlc2lnbiBhbGxvd3MgYSBmcm9udGVuZAorcHJvZ3JhbSB0byBwcm9jZXNzIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYnJhbmNoZXMgc2ltdWx0YW5lb3VzbHksCitnZW5lcmF0aW5nIGNvbW1pdHMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzb3VyY2UKK2RhdGEuICBJdCBhbHNvIHNpbXBsaWZpZXMgdGhlIGZyb250ZW5kIHByb2dyYW1zIGNvbnNpZGVyYWJseS4KKworZmFzdC1pbXBvcnQgZG9lcyBub3QgdXNlIG9yIGFsdGVyIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciBhbnkKK2ZpbGUgd2l0aGluIGl0LiAgKEl0IGRvZXMgaG93ZXZlciB1cGRhdGUgdGhlIGN1cnJlbnQgR2l0IHJlcG9zaXRvcnksCithcyByZWZlcmVuY2VkIGJ5IGBHSVRfRElSYC4pICBUaGVyZWZvcmUgYW4gaW1wb3J0IGZyb250ZW5kIG1heSB1c2UKK3RoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgaXRzIG93biBwdXJwb3Nlcywgc3VjaCBhcyBleHRyYWN0aW5nIGZpbGUKK3JldmlzaW9ucyBmcm9tIHRoZSBmb3JlaWduIHNvdXJjZS4gIFRoaXMgaWdub3JhbmNlIG9mIHRoZSB3b3JraW5nCitkaXJlY3RvcnkgYWxzbyBhbGxvd3MgZmFzdC1pbXBvcnQgdG8gcnVuIHZlcnkgcXVpY2tseSwgYXMgaXQgZG9lcyBub3QKK25lZWQgdG8gcGVyZm9ybSBhbnkgY29zdGx5IGZpbGUgdXBkYXRlIG9wZXJhdGlvbnMgd2hlbiBzd2l0Y2hpbmcKK2JldHdlZW4gYnJhbmNoZXMuCisKK0lucHV0IEZvcm1hdAorLS0tLS0tLS0tLS0tCitXaXRoIHRoZSBleGNlcHRpb24gb2YgcmF3IGZpbGUgZGF0YSAod2hpY2ggR2l0IGRvZXMgbm90IGludGVycHJldCkKK3RoZSBmYXN0LWltcG9ydCBpbnB1dCBmb3JtYXQgaXMgdGV4dCAoQVNDSUkpIGJhc2VkLiAgVGhpcyB0ZXh0IGJhc2VkCitmb3JtYXQgc2ltcGxpZmllcyBkZXZlbG9wbWVudCBhbmQgZGVidWdnaW5nIG9mIGZyb250ZW5kIHByb2dyYW1zLAorZXNwZWNpYWxseSB3aGVuIGEgaGlnaGVyIGxldmVsIGxhbmd1YWdlIHN1Y2ggYXMgUGVybCwgUHl0aG9uIG9yCitSdWJ5IGlzIGJlaW5nIHVzZWQuCisKK2Zhc3QtaW1wb3J0IGlzIHZlcnkgc3RyaWN0IGFib3V0IGl0cyBpbnB1dC4gIFdoZXJlIHdlIHNheSBTUCBiZWxvdyB3ZSBtZWFuCisqZXhhY3RseSogb25lIHNwYWNlLiAgTGlrZXdpc2UgTEYgbWVhbnMgb25lIChhbmQgb25seSBvbmUpIGxpbmVmZWVkLgorU3VwcGx5aW5nIGFkZGl0aW9uYWwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpbGwgY2F1c2UgdW5leHBlY3RlZAorcmVzdWx0cywgc3VjaCBhcyBicmFuY2ggbmFtZXMgb3IgZmlsZSBuYW1lcyB3aXRoIGxlYWRpbmcgb3IgdHJhaWxpbmcKK3NwYWNlcyBpbiB0aGVpciBuYW1lLCBvciBlYXJseSB0ZXJtaW5hdGlvbiBvZiBmYXN0LWltcG9ydCB3aGVuIGl0IGVuY291bnRlcnMKK3VuZXhwZWN0ZWQgaW5wdXQuCisKK0RhdGUgRm9ybWF0cworfn5+fn5+fn5+fn5+CitUaGUgZm9sbG93aW5nIGRhdGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLiAgQSBmcm9udGVuZCBzaG91bGQgc2VsZWN0Cit0aGUgZm9ybWF0IGl0IHdpbGwgdXNlIGZvciB0aGlzIGltcG9ydCBieSBwYXNzaW5nIHRoZSBmb3JtYXQgbmFtZQoraW4gdGhlIFwtLWRhdGUtZm9ybWF0PTxmbXQ+IGNvbW1hbmQgbGluZSBvcHRpb24uCisKK2ByYXdgOjoKKwlUaGlzIGlzIHRoZSBHaXQgbmF0aXZlIGZvcm1hdCBhbmQgaXMgYDx0aW1lPiBTUCA8b2ZmdXRjPmAuCisJSXQgaXMgYWxzbyBmYXN0LWltcG9ydCdzIGRlZmF1bHQgZm9ybWF0LCBpZiBcLS1kYXRlLWZvcm1hdCB3YXMKKwlub3Qgc3BlY2lmaWVkLgorKworVGhlIHRpbWUgb2YgdGhlIGV2ZW50IGlzIHNwZWNpZmllZCBieSBgPHRpbWU+YCBhcyB0aGUgbnVtYmVyIG9mCitzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIChtaWRuaWdodCwgSmFuIDEsIDE5NzAsIFVUQykgYW5kIGlzCit3cml0dGVuIGFzIGFuIEFTQ0lJIGRlY2ltYWwgaW50ZWdlci4KKysKK1RoZSBsb2NhbCBvZmZzZXQgaXMgc3BlY2lmaWVkIGJ5IGA8b2ZmdXRjPmAgYXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorb2Zmc2V0IGZyb20gVVRDLiAgRm9yIGV4YW1wbGUgRVNUICh3aGljaCBpcyA1IGhvdXJzIGJlaGluZCBVVEMpCit3b3VsZCBiZSBleHByZXNzZWQgaW4gYDx0ej5gIGJ5IGBgLTA1MDAnJyB3aGlsZSBVVEMgaXMgYGArMDAwMCcnLgorVGhlIGxvY2FsIG9mZnNldCBkb2VzIG5vdCBhZmZlY3QgYDx0aW1lPmA7IGl0IGlzIHVzZWQgb25seSBhcyBhbgorYWR2aXNlbWVudCB0byBoZWxwIGZvcm1hdHRpbmcgcm91dGluZXMgZGlzcGxheSB0aGUgdGltZXN0YW1wLgorKworSWYgdGhlIGxvY2FsIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBzb3VyY2UgbWF0ZXJpYWwsIHVzZQorYGArMDAwMCcnLCBvciB0aGUgbW9zdCBjb21tb24gbG9jYWwgb2Zmc2V0LiAgRm9yIGV4YW1wbGUgbWFueQorb3JnYW5pemF0aW9ucyBoYXZlIGEgQ1ZTIHJlcG9zaXRvcnkgd2hpY2ggaGFzIG9ubHkgZXZlciBiZWVuIGFjY2Vzc2VkCitieSB1c2VycyB3aG8gYXJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYW5kIHRpbWV6b25lLiAgSW4gdGhpcworY2FzZSBhIHJlYXNvbmFibGUgb2Zmc2V0IGZyb20gVVRDIGNvdWxkIGJlIGFzc3VtZWQuCisrCitVbmxpa2UgdGhlIGByZmMyODIyYCBmb3JtYXQsIHRoaXMgZm9ybWF0IGlzIHZlcnkgc3RyaWN0LiAgQW55Cit2YXJpYXRpb24gaW4gZm9ybWF0dGluZyB3aWxsIGNhdXNlIGZhc3QtaW1wb3J0IHRvIHJlamVjdCB0aGUgdmFsdWUuCisKK2ByZmMyODIyYDo6CisJVGhpcyBpcyB0aGUgc3RhbmRhcmQgZW1haWwgZm9ybWF0IGFzIGRlc2NyaWJlZCBieSBSRkMgMjgyMi4KKysKK0FuIGV4YW1wbGUgdmFsdWUgaXMgYGBUdWUgRmViIDYgMTE6MjI6MTggMjAwNyAtMDUwMCcnLiAgVGhlIEdpdAorcGFyc2VyIGlzIGFjY3VyYXRlLCBidXQgYSBsaXR0bGUgb24gdGhlIGxlbmllbnQgc2lkZS4gIEl0IGlzIHRoZQorc2FtZSBwYXJzZXIgdXNlZCBieSBnaXRsaW5rOmdpdC1hbVsxXSB3aGVuIGFwcGx5aW5nIHBhdGNoZXMKK3JlY2VpdmVkIGZyb20gZW1haWwuCisrCitTb21lIG1hbGZvcm1lZCBzdHJpbmdzIG1heSBiZSBhY2NlcHRlZCBhcyB2YWxpZCBkYXRlcy4gIEluIHNvbWUgb2YKK3RoZXNlIGNhc2VzIEdpdCB3aWxsIHN0aWxsIGJlIGFibGUgdG8gb2J0YWluIHRoZSBjb3JyZWN0IGRhdGUgZnJvbQordGhlIG1hbGZvcm1lZCBzdHJpbmcuICBUaGVyZSBhcmUgYWxzbyBzb21lIHR5cGVzIG9mIG1hbGZvcm1lZAorc3RyaW5ncyB3aGljaCBHaXQgd2lsbCBwYXJzZSB3cm9uZywgYW5kIHlldCBjb25zaWRlciB2YWxpZC4KK1NlcmlvdXNseSBtYWxmb3JtZWQgc3RyaW5ncyB3aWxsIGJlIHJlamVjdGVkLgorKworVW5saWtlIHRoZSBgcmF3YCBmb3JtYXQgYWJvdmUsIHRoZSB0aW1lem9uZS9VVEMgb2Zmc2V0IGluZm9ybWF0aW9uCitjb250YWluZWQgaW4gYW4gUkZDIDI4MjIgZGF0ZSBzdHJpbmcgaXMgdXNlZCB0byBhZGp1c3QgdGhlIGRhdGUKK3ZhbHVlIHRvIFVUQyBwcmlvciB0byBzdG9yYWdlLiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0Cit0aGlzIGluZm9ybWF0aW9uIGJlIGFzIGFjY3VyYXRlIGFzIHBvc3NpYmxlLgorKworSWYgdGhlIHNvdXJjZSBtYXRlcmlhbCB1c2VzIFJGQyAyODIyIHN0eWxlIGRhdGVzLAordGhlIGZyb250ZW5kIHNob3VsZCBsZXQgZmFzdC1pbXBvcnQgaGFuZGxlIHRoZSBwYXJzaW5nIGFuZCBjb252ZXJzaW9uCisocmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkbyBpdCBpdHNlbGYpIGFzIHRoZSBHaXQgcGFyc2VyIGhhcworYmVlbiB3ZWxsIHRlc3RlZCBpbiB0aGUgd2lsZC4KKysKK0Zyb250ZW5kcyBzaG91bGQgcHJlZmVyIHRoZSBgcmF3YCBmb3JtYXQgaWYgdGhlIHNvdXJjZSBtYXRlcmlhbAorYWxyZWFkeSB1c2VzIFVOSVgtZXBvY2ggZm9ybWF0LCBjYW4gYmUgY29heGVkIHRvIGdpdmUgZGF0ZXMgaW4gdGhhdAorZm9ybWF0LCBvciBpdHMgZm9ybWF0IGlzIGVhc2lsaXkgY29udmVydGlibGUgdG8gaXQsIGFzIHRoZXJlIGlzIG5vCithbWJpZ3VpdHkgaW4gcGFyc2luZy4KKworYG5vd2A6OgorCUFsd2F5cyB1c2UgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGltZXpvbmUuICBUaGUgbGl0ZXJhbAorCWBub3dgIG11c3QgYWx3YXlzIGJlIHN1cHBsaWVkIGZvciBgPHdoZW4+YC4KKysKK1RoaXMgaXMgYSB0b3kgZm9ybWF0LiAgVGhlIGN1cnJlbnQgdGltZSBhbmQgdGltZXpvbmUgb2YgdGhpcyBzeXN0ZW0KK2lzIGFsd2F5cyBjb3BpZWQgaW50byB0aGUgaWRlbnRpdHkgc3RyaW5nIGF0IHRoZSB0aW1lIGl0IGlzIGJlaW5nCitjcmVhdGVkIGJ5IGZhc3QtaW1wb3J0LiAgVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdGltZSBvcgordGltZXpvbmUuCisrCitUaGlzIHBhcnRpY3VsYXIgZm9ybWF0IGlzIHN1cHBsaWVkIGFzIGl0cyBzaG9ydCB0byBpbXBsZW1lbnQgYW5kCittYXkgYmUgdXNlZnVsIHRvIGEgcHJvY2VzcyB0aGF0IHdhbnRzIHRvIGNyZWF0ZSBhIG5ldyBjb21taXQKK3JpZ2h0IG5vdywgd2l0aG91dCBuZWVkaW5nIHRvIHVzZSBhIHdvcmtpbmcgZGlyZWN0b3J5IG9yCitnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0uCisrCitJZiBzZXBhcmF0ZSBgYXV0aG9yYCBhbmQgYGNvbW1pdHRlcmAgY29tbWFuZHMgYXJlIHVzZWQgaW4gYSBgY29tbWl0YAordGhlIHRpbWVzdGFtcHMgbWF5IG5vdCBtYXRjaCwgYXMgdGhlIHN5c3RlbSBjbG9jayB3aWxsIGJlIHBvbGxlZAordHdpY2UgKG9uY2UgZm9yIGVhY2ggY29tbWFuZCkuICBUaGUgb25seSB3YXkgdG8gZW5zdXJlIHRoYXQgYm90aAorYXV0aG9yIGFuZCBjb21taXR0ZXIgaWRlbnRpdHkgaW5mb3JtYXRpb24gaGFzIHRoZSBzYW1lIHRpbWVzdGFtcAoraXMgdG8gb21pdCBgYXV0aG9yYCAodGh1cyBjb3B5aW5nIGZyb20gYGNvbW1pdHRlcmApIG9yIHRvIHVzZSBhCitkYXRlIGZvcm1hdCBvdGhlciB0aGFuIGBub3dgLgorCitDb21tYW5kcworfn5+fn5+fn4KK2Zhc3QtaW1wb3J0IGFjY2VwdHMgc2V2ZXJhbCBjb21tYW5kcyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgcmVwb3NpdG9yeQorYW5kIGNvbnRyb2wgdGhlIGN1cnJlbnQgaW1wb3J0IHByb2Nlc3MuICBNb3JlIGRldGFpbGVkIGRpc2N1c3Npb24KKyh3aXRoIGV4YW1wbGVzKSBvZiBlYWNoIGNvbW1hbmQgZm9sbG93cyBsYXRlci4KKworYGNvbW1pdGA6OgorCUNyZWF0ZXMgYSBuZXcgYnJhbmNoIG9yIHVwZGF0ZXMgYW4gZXhpc3RpbmcgYnJhbmNoIGJ5CisJY3JlYXRpbmcgYSBuZXcgY29tbWl0IGFuZCB1cGRhdGluZyB0aGUgYnJhbmNoIHRvIHBvaW50IGF0CisJdGhlIG5ld2x5IGNyZWF0ZWQgY29tbWl0LgorCitgdGFnYDo6CisJQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgdGFnIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIGNvbW1pdCBvcgorCWJyYW5jaC4gIExpZ2h0d2VpZ2h0IHRhZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21tYW5kLAorCWFzIHRoZXkgYXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgcmVjb3JkaW5nIG1lYW5pbmdmdWwgcG9pbnRzCisJaW4gdGltZS4KKworYHJlc2V0YDo6CisJUmVzZXQgYW4gZXhpc3RpbmcgYnJhbmNoIChvciBhIG5ldyBicmFuY2gpIHRvIGEgc3BlY2lmaWMKKwlyZXZpc2lvbi4gIFRoaXMgY29tbWFuZCBtdXN0IGJlIHVzZWQgdG8gY2hhbmdlIGEgYnJhbmNoIHRvCisJYSBzcGVjaWZpYyByZXZpc2lvbiB3aXRob3V0IG1ha2luZyBhIGNvbW1pdCBvbiBpdC4KKworYGJsb2JgOjoKKwlDb252ZXJ0IHJhdyBmaWxlIGRhdGEgaW50byBhIGJsb2IsIGZvciBmdXR1cmUgdXNlIGluIGEKKwlgY29tbWl0YCBjb21tYW5kLiAgVGhpcyBjb21tYW5kIGlzIG9wdGlvbmFsIGFuZCBpcyBub3QKKwluZWVkZWQgdG8gcGVyZm9ybSBhbiBpbXBvcnQuCisKK2BjaGVja3BvaW50YDo6CisJRm9yY2VzIGZhc3QtaW1wb3J0IHRvIGNsb3NlIHRoZSBjdXJyZW50IHBhY2tmaWxlLCBnZW5lcmF0ZSBpdHMKKwl1bmlxdWUgU0hBLTEgY2hlY2tzdW0gYW5kIGluZGV4LCBhbmQgc3RhcnQgYSBuZXcgcGFja2ZpbGUuCisJVGhpcyBjb21tYW5kIGlzIG9wdGlvbmFsIGFuZCBpcyBub3QgbmVlZGVkIHRvIHBlcmZvcm0KKwlhbiBpbXBvcnQuCisKK2Bjb21taXRgCit+fn5+fn5+fgorQ3JlYXRlIG9yIHVwZGF0ZSBhIGJyYW5jaCB3aXRoIGEgbmV3IGNvbW1pdCwgcmVjb3JkaW5nIG9uZSBsb2dpY2FsCitjaGFuZ2UgdG8gdGhlIHByb2plY3QuCisKKy4uLi4KKwknY29tbWl0JyBTUCA8cmVmPiBMRgorCW1hcms/CisJKCdhdXRob3InIFNQIDxuYW1lPiBTUCBMVCA8ZW1haWw+IEdUIFNQIDx3aGVuPiBMRik/CisJJ2NvbW1pdHRlcicgU1AgPG5hbWU+IFNQIExUIDxlbWFpbD4gR1QgU1AgPHdoZW4+IExGCisJZGF0YQorCSgnZnJvbScgU1AgPGNvbW1pdHRpc2g+IExGKT8KKwkoJ21lcmdlJyBTUCA8Y29tbWl0dGlzaD4gTEYpPworCShmaWxlbW9kaWZ5IHwgZmlsZWRlbGV0ZSB8IGZpbGVkZWxldGVhbGwpKgorCUxGCisuLi4uCisKK3doZXJlIGA8cmVmPmAgaXMgdGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byBtYWtlIHRoZSBjb21taXQgb24uCitUeXBpY2FsbHkgYnJhbmNoIG5hbWVzIGFyZSBwcmVmaXhlZCB3aXRoIGByZWZzL2hlYWRzL2AgaW4KK0dpdCwgc28gaW1wb3J0aW5nIHRoZSBDVlMgYnJhbmNoIHN5bWJvbCBgUkVMRU5HLTFfMGAgd291bGQgdXNlCitgcmVmcy9oZWFkcy9SRUxFTkctMV8wYCBmb3IgdGhlIHZhbHVlIG9mIGA8cmVmPmAuICBUaGUgdmFsdWUgb2YKK2A8cmVmPmAgbXVzdCBiZSBhIHZhbGlkIHJlZm5hbWUgaW4gR2l0LiAgQXMgYExGYCBpcyBub3QgdmFsaWQgaW4KK2EgR2l0IHJlZm5hbWUsIG5vIHF1b3Rpbmcgb3IgZXNjYXBpbmcgc3ludGF4IGlzIHN1cHBvcnRlZCBoZXJlLgorCitBIGBtYXJrYCBjb21tYW5kIG1heSBvcHRpb25hbGx5IGFwcGVhciwgcmVxdWVzdGluZyBmYXN0LWltcG9ydCB0byBzYXZlIGEKK3JlZmVyZW5jZSB0byB0aGUgbmV3bHkgY3JlYXRlZCBjb21taXQgZm9yIGZ1dHVyZSB1c2UgYnkgdGhlIGZyb250ZW5kCisoc2VlIGJlbG93IGZvciBmb3JtYXQpLiAgSXQgaXMgdmVyeSBjb21tb24gZm9yIGZyb250ZW5kcyB0byBtYXJrCitldmVyeSBjb21taXQgdGhleSBjcmVhdGUsIHRoZXJlYnkgYWxsb3dpbmcgZnV0dXJlIGJyYW5jaCBjcmVhdGlvbgorZnJvbSBhbnkgaW1wb3J0ZWQgY29tbWl0LgorCitUaGUgYGRhdGFgIGNvbW1hbmQgZm9sbG93aW5nIGBjb21taXR0ZXJgIG11c3Qgc3VwcGx5IHRoZSBjb21taXQKK21lc3NhZ2UgKHNlZSBiZWxvdyBmb3IgYGRhdGFgIGNvbW1hbmQgc3ludGF4KS4gIFRvIGltcG9ydCBhbiBlbXB0eQorY29tbWl0IG1lc3NhZ2UgdXNlIGEgMCBsZW5ndGggZGF0YS4gIENvbW1pdCBtZXNzYWdlcyBhcmUgZnJlZS1mb3JtCithbmQgYXJlIG5vdCBpbnRlcnByZXRlZCBieSBHaXQuICBDdXJyZW50bHkgdGhleSBtdXN0IGJlIGVuY29kZWQgaW4KK1VURi04LCBhcyBmYXN0LWltcG9ydCBkb2VzIG5vdCBwZXJtaXQgb3RoZXIgZW5jb2RpbmdzIHRvIGJlIHNwZWNpZmllZC4KKworWmVybyBvciBtb3JlIGBmaWxlbW9kaWZ5YCwgYGZpbGVkZWxldGVgIGFuZCBgZmlsZWRlbGV0ZWFsbGAgY29tbWFuZHMKK21heSBiZSBpbmNsdWRlZCB0byB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBicmFuY2ggcHJpb3IgdG8KK2NyZWF0aW5nIHRoZSBjb21taXQuICBUaGVzZSBjb21tYW5kcyBtYXkgYmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLgorSG93ZXZlciBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEgYGZpbGVkZWxldGVhbGxgIGNvbW1hbmQgcHJlY2VlZAorYWxsIGBmaWxlbW9kaWZ5YCBjb21tYW5kcyBpbiB0aGUgc2FtZSBjb21taXQsIGFzIGBmaWxlZGVsZXRlYWxsYAord2lwZXMgdGhlIGJyYW5jaCBjbGVhbiAoc2VlIGJlbG93KS4KKworYGF1dGhvcmAKK15eXl5eXl5eCitBbiBgYXV0aG9yYCBjb21tYW5kIG1heSBvcHRpb25hbGx5IGFwcGVhciwgaWYgdGhlIGF1dGhvciBpbmZvcm1hdGlvbgorbWlnaHQgZGlmZmVyIGZyb20gdGhlIGNvbW1pdHRlciBpbmZvcm1hdGlvbi4gIElmIGBhdXRob3JgIGlzIG9taXR0ZWQKK3RoZW4gZmFzdC1pbXBvcnQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgY29tbWl0dGVyJ3MgaW5mb3JtYXRpb24gZm9yCit0aGUgYXV0aG9yIHBvcnRpb24gb2YgdGhlIGNvbW1pdC4gIFNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZgordGhlIGZpZWxkcyBpbiBgYXV0aG9yYCwgYXMgdGhleSBhcmUgaWRlbnRpY2FsIHRvIGBjb21taXR0ZXJgLgorCitgY29tbWl0dGVyYAorXl5eXl5eXl5eXl4KK1RoZSBgY29tbWl0dGVyYCBjb21tYW5kIGluZGljYXRlcyB3aG8gbWFkZSB0aGlzIGNvbW1pdCwgYW5kIHdoZW4KK3RoZXkgbWFkZSBpdC4KKworSGVyZSBgPG5hbWU+YCBpcyB0aGUgcGVyc29uJ3MgZGlzcGxheSBuYW1lIChmb3IgZXhhbXBsZQorYGBDb20gTSBJdHRlcicnKSBhbmQgYDxlbWFpbD5gIGlzIHRoZSBwZXJzb24ncyBlbWFpbCBhZGRyZXNzCisoYGBjbUBleGFtcGxlLmNvbScnKS4gIGBMVGAgYW5kIGBHVGAgYXJlIHRoZSBsaXRlcmFsIGxlc3MtdGhhbiAoXHgzYykKK2FuZCBncmVhdGVyLXRoYW4gKFx4M2UpIHN5bWJvbHMuICBUaGVzZSBhcmUgcmVxdWlyZWQgdG8gZGVsaW1pdAordGhlIGVtYWlsIGFkZHJlc3MgZnJvbSB0aGUgb3RoZXIgZmllbGRzIGluIHRoZSBsaW5lLiAgTm90ZSB0aGF0CitgPG5hbWU+YCBpcyBmcmVlLWZvcm0gYW5kIG1heSBjb250YWluIGFueSBzZXF1ZW5jZSBvZiBieXRlcywgZXhjZXB0CitgTFRgIGFuZCBgTEZgLiAgSXQgaXMgdHlwaWNhbGx5IFVURi04IGVuY29kZWQuCisKK1RoZSB0aW1lIG9mIHRoZSBjaGFuZ2UgaXMgc3BlY2lmaWVkIGJ5IGA8d2hlbj5gIHVzaW5nIHRoZSBkYXRlIGZvcm1hdAordGhhdCB3YXMgc2VsZWN0ZWQgYnkgdGhlIFwtLWRhdGUtZm9ybWF0PTxmbXQ+IGNvbW1hbmQgbGluZSBvcHRpb24uCitTZWUgYGBEYXRlIEZvcm1hdHMnJyBhYm92ZSBmb3IgdGhlIHNldCBvZiBzdXBwb3J0ZWQgZm9ybWF0cywgYW5kCit0aGVpciBzeW50YXguCisKK2Bmcm9tYAorXl5eXl5eCitUaGUgYGZyb21gIGNvbW1hbmQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21taXQgdG8gaW5pdGlhbGl6ZQordGhpcyBicmFuY2ggZnJvbS4gIFRoaXMgcmV2aXNpb24gd2lsbCBiZSB0aGUgZmlyc3QgYW5jZXN0b3Igb2YgdGhlCituZXcgY29tbWl0LgorCitPbWl0dGluZyB0aGUgYGZyb21gIGNvbW1hbmQgaW4gdGhlIGZpcnN0IGNvbW1pdCBvZiBhIG5ldyBicmFuY2gKK3dpbGwgY2F1c2UgZmFzdC1pbXBvcnQgdG8gY3JlYXRlIHRoYXQgY29tbWl0IHdpdGggbm8gYW5jZXN0b3IuIFRoaXMKK3RlbmRzIHRvIGJlIGRlc2lyZWQgb25seSBmb3IgdGhlIGluaXRpYWwgY29tbWl0IG9mIGEgcHJvamVjdC4KK09taXR0aW5nIHRoZSBgZnJvbWAgY29tbWFuZCBvbiBleGlzdGluZyBicmFuY2hlcyBpcyB1c3VhbGx5IGRlc2lyZWQsCithcyB0aGUgY3VycmVudCBjb21taXQgb24gdGhhdCBicmFuY2ggaXMgYXV0b21hdGljYWxseSBhc3N1bWVkIHRvCitiZSB0aGUgZmlyc3QgYW5jZXN0b3Igb2YgdGhlIG5ldyBjb21taXQuCisKK0FzIGBMRmAgaXMgbm90IHZhbGlkIGluIGEgR2l0IHJlZm5hbWUgb3IgU0hBLTEgZXhwcmVzc2lvbiwgbm8KK3F1b3Rpbmcgb3IgZXNjYXBpbmcgc3ludGF4IGlzIHN1cHBvcnRlZCB3aXRoaW4gYDxjb21taXR0aXNoPmAuCisKK0hlcmUgYDxjb21taXR0aXNoPmAgaXMgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisKKyogVGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYnJhbmNoIGFscmVhZHkgaW4gZmFzdC1pbXBvcnQncyBpbnRlcm5hbCBicmFuY2gKKyAgdGFibGUuICBJZiBmYXN0LWltcG9ydCBkb2Vzbid0IGtub3cgdGhlIG5hbWUsIGl0cyB0cmVhdGVkIGFzIGEgU0hBLTEKKyAgZXhwcmVzc2lvbi4KKworKiBBIG1hcmsgcmVmZXJlbmNlLCBgOjxpZG51bT5gLCB3aGVyZSBgPGlkbnVtPmAgaXMgdGhlIG1hcmsgbnVtYmVyLgorKworVGhlIHJlYXNvbiBmYXN0LWltcG9ydCB1c2VzIGA6YCB0byBkZW5vdGUgYSBtYXJrIHJlZmVyZW5jZSBpcyB0aGlzIGNoYXJhY3RlcgoraXMgbm90IGxlZ2FsIGluIGEgR2l0IGJyYW5jaCBuYW1lLiAgVGhlIGxlYWRpbmcgYDpgIG1ha2VzIGl0IGVhc3kKK3RvIGRpc3Rpbmd1c2ggYmV0d2VlbiB0aGUgbWFyayA0MiAoYDo0MmApIGFuZCB0aGUgYnJhbmNoIDQyIChgNDJgCitvciBgcmVmcy9oZWFkcy80MmApLCBvciBhbiBhYmJyZXZpYXRlZCBTSEEtMSB3aGljaCBoYXBwZW5lZCB0bworY29uc2lzdCBvbmx5IG9mIGJhc2UtMTAgZGlnaXRzLgorKworTWFya3MgbXVzdCBiZSBkZWNsYXJlZCAodmlhIGBtYXJrYCkgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCisKKyogQSBjb21wbGV0ZSA0MCBieXRlIG9yIGFiYnJldmlhdGVkIGNvbW1pdCBTSEEtMSBpbiBoZXguCisKKyogQW55IHZhbGlkIEdpdCBTSEEtMSBleHByZXNzaW9uIHRoYXQgcmVzb2x2ZXMgdG8gYSBjb21taXQuICBTZWUKKyAgYGBTUEVDSUZZSU5HIFJFVklTSU9OUycnIGluIGdpdGxpbms6Z2l0LXJldi1wYXJzZVsxXSBmb3IgZGV0YWlscy4KKworVGhlIHNwZWNpYWwgY2FzZSBvZiByZXN0YXJ0aW5nIGFuIGluY3JlbWVudGFsIGltcG9ydCBmcm9tIHRoZQorY3VycmVudCBicmFuY2ggdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gYXM6CistLS0tCisJZnJvbSByZWZzL2hlYWRzL2JyYW5jaF4wCistLS0tCitUaGUgYHtjYXJldH0wYCBzdWZmaXggaXMgbmVjZXNzYXJ5IGFzIGZhc3QtaW1wb3J0IGRvZXMgbm90IHBlcm1pdCBhIGJyYW5jaCB0bworc3RhcnQgZnJvbSBpdHNlbGYsIGFuZCB0aGUgYnJhbmNoIGlzIGNyZWF0ZWQgaW4gbWVtb3J5IGJlZm9yZSB0aGUKK2Bmcm9tYCBjb21tYW5kIGlzIGV2ZW4gcmVhZCBmcm9tIHRoZSBpbnB1dC4gIEFkZGluZyBge2NhcmV0fTBgIHdpbGwgZm9yY2UKK2Zhc3QtaW1wb3J0IHRvIHJlc29sdmUgdGhlIGNvbW1pdCB0aHJvdWdoIEdpdCdzIHJldmlzaW9uIHBhcnNpbmcgbGlicmFyeSwKK3JhdGhlciB0aGFuIGl0cyBpbnRlcm5hbCBicmFuY2ggdGFibGUsIHRoZXJlYnkgbG9hZGluZyBpbiB0aGUKK2V4aXN0aW5nIHZhbHVlIG9mIHRoZSBicmFuY2guCisKK2BtZXJnZWAKK15eXl5eXl4KK0luY2x1ZGVzIG9uZSBhZGRpdGlvbmFsIGFuY2VzdG9yIGNvbW1pdCwgYW5kIG1ha2VzIHRoZSBjdXJyZW50Citjb21taXQgYSBtZXJnZSBjb21taXQuICBBbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGBtZXJnZWAgY29tbWFuZHMgcGVyCitjb21taXQgYXJlIHBlcm1pdHRlZCBieSBmYXN0LWltcG9ydCwgdGhlcmVieSBlc3RhYmxpc2hpbmcgYW4gbi13YXkgbWVyZ2UuCitIb3dldmVyIEdpdCdzIG90aGVyIHRvb2xzIG5ldmVyIGNyZWF0ZSBjb21taXRzIHdpdGggbW9yZSB0aGFuIDE1CithZGRpdGlvbmFsIGFuY2VzdG9ycyAoZm9ybWluZyBhIDE2LXdheSBtZXJnZSkuICBGb3IgdGhpcyByZWFzb24KK2l0IGlzIHN1Z2dlc3RlZCB0aGF0IGZyb250ZW5kcyBkbyBub3QgdXNlIG1vcmUgdGhhbiAxNSBgbWVyZ2VgCitjb21tYW5kcyBwZXIgY29tbWl0LgorCitIZXJlIGA8Y29tbWl0dGlzaD5gIGlzIGFueSBvZiB0aGUgY29tbWl0IHNwZWNpZmljYXRpb24gZXhwcmVzc2lvbnMKK2Fsc28gYWNjZXB0ZWQgYnkgYGZyb21gIChzZWUgYWJvdmUpLgorCitgZmlsZW1vZGlmeWAKK15eXl5eXl5eXl5eXgorSW5jbHVkZWQgaW4gYSBgY29tbWl0YCBjb21tYW5kIHRvIGFkZCBhIG5ldyBmaWxlIG9yIGNoYW5nZSB0aGUKK2NvbnRlbnQgb2YgYW4gZXhpc3RpbmcgZmlsZS4gIFRoaXMgY29tbWFuZCBoYXMgdHdvIGRpZmZlcmVudCBtZWFucworb2Ygc3BlY2lmeWluZyB0aGUgY29udGVudCBvZiB0aGUgZmlsZS4KKworRXh0ZXJuYWwgZGF0YSBmb3JtYXQ6OgorCVRoZSBkYXRhIGNvbnRlbnQgZm9yIHRoZSBmaWxlIHdhcyBhbHJlYWR5IHN1cHBsaWVkIGJ5IGEgcHJpb3IKKwlgYmxvYmAgY29tbWFuZC4gIFRoZSBmcm9udGVuZCBqdXN0IG5lZWRzIHRvIGNvbm5lY3QgaXQuCisrCisuLi4uCisJJ00nIFNQIDxtb2RlPiBTUCA8ZGF0YXJlZj4gU1AgPHBhdGg+IExGCisuLi4uCisrCitIZXJlIGA8ZGF0YXJlZj5gIGNhbiBiZSBlaXRoZXIgYSBtYXJrIHJlZmVyZW5jZSAoYDo8aWRudW0+YCkKK3NldCBieSBhIHByaW9yIGBibG9iYCBjb21tYW5kLCBvciBhIGZ1bGwgNDAtYnl0ZSBTSEEtMSBvZiBhbgorZXhpc3RpbmcgR2l0IGJsb2Igb2JqZWN0LgorCitJbmxpbmUgZGF0YSBmb3JtYXQ6OgorCVRoZSBkYXRhIGNvbnRlbnQgZm9yIHRoZSBmaWxlIGhhcyBub3QgYmVlbiBzdXBwbGllZCB5ZXQuCisJVGhlIGZyb250ZW5kIHdhbnRzIHRvIHN1cHBseSBpdCBhcyBwYXJ0IG9mIHRoaXMgbW9kaWZ5CisJY29tbWFuZC4KKysKKy4uLi4KKwknTScgU1AgPG1vZGU+IFNQICdpbmxpbmUnIFNQIDxwYXRoPiBMRgorCWRhdGEKKy4uLi4KKysKK1NlZSBiZWxvdyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGRhdGFgIGNvbW1hbmQuCisKK0luIGJvdGggZm9ybWF0cyBgPG1vZGU+YCBpcyB0aGUgdHlwZSBvZiBmaWxlIGVudHJ5LCBzcGVjaWZpZWQKK2luIG9jdGFsLiAgR2l0IG9ubHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtb2RlczoKKworKiBgMTAwNjQ0YCBvciBgNjQ0YDogQSBub3JtYWwgKG5vdC1leGVjdXRhYmxlKSBmaWxlLiAgVGhlIG1ham9yaXR5CisgIG9mIGZpbGVzIGluIG1vc3QgcHJvamVjdHMgdXNlIHRoaXMgbW9kZS4gIElmIGluIGRvdWJ0LCB0aGlzIGlzCisgIHdoYXQgeW91IHdhbnQuCisqIGAxMDA3NTVgIG9yIGA3NTVgOiBBIG5vcm1hbCwgYnV0IGV4ZWN1dGFibGUsIGZpbGUuCisqIGAxMjAwMDBgOiBBIHN5bWxpbmssIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHdpbGwgYmUgdGhlIGxpbmsgdGFyZ2V0LgorCitJbiBib3RoIGZvcm1hdHMgYDxwYXRoPmAgaXMgdGhlIGNvbXBsZXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgYWRkZWQKKyhpZiBub3QgYWxyZWFkeSBleGlzdGluZykgb3IgbW9kaWZpZWQgKGlmIGFscmVhZHkgZXhpc3RpbmcpLgorCitBIGA8cGF0aD5gIHN0cmluZyBtdXN0IHVzZSBVTklYLXN0eWxlIGRpcmVjdG9yeSBzZXBhcmF0b3JzIChmb3J3YXJkCitzbGFzaCBgL2ApLCBtYXkgY29udGFpbiBhbnkgYnl0ZSBvdGhlciB0aGFuIGBMRmAsIGFuZCBtdXN0IG5vdAorc3RhcnQgd2l0aCBkb3VibGUgcXVvdGUgKGAiYCkuCisKK0lmIGFuIGBMRmAgb3IgZG91YmxlIHF1b3RlIG11c3QgYmUgZW5jb2RlZCBpbnRvIGA8cGF0aD5gIHNoZWxsLXN0eWxlCitxdW90aW5nIHNob3VsZCBiZSB1c2VkLCBlLmcuIGAicGF0aC93aXRoXG4gYW5kIFwiIGluIGl0ImAuCisKK1RoZSB2YWx1ZSBvZiBgPHBhdGg+YCBtdXN0IGJlIGluIGNhbm9uY2lhbCBmb3JtLiBUaGF0IGlzIGl0IG11c3Qgbm90OgorCisqIGNvbnRhaW4gYW4gZW1wdHkgZGlyZWN0b3J5IGNvbXBvbmVudCAoZS5nLiBgZm9vLy9iYXJgIGlzIGludmFsaWQpLAorKiBlbmQgd2l0aCBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgKGUuZy4gYGZvby9gIGlzIGludmFsaWQpLAorKiBzdGFydCB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvciAoZS5nLiBgL2Zvb2AgaXMgaW52YWxpZCksCisqIGNvbnRhaW4gdGhlIHNwZWNpYWwgY29tcG9uZW50IGAuYCBvciBgLi5gIChlLmcuIGBmb28vLi9iYXJgIGFuZAorICBgZm9vLy4uL2JhcmAgYXJlIGludmFsaWQpLgorCitJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGA8cGF0aD5gIGFsd2F5cyBiZSBlbmNvZGVkIHVzaW5nIFVURi04LgorCitgZmlsZWRlbGV0ZWAKK15eXl5eXl5eXl5eXgorSW5jbHVkZWQgaW4gYSBgY29tbWl0YCBjb21tYW5kIHRvIHJlbW92ZSBhIGZpbGUgb3IgcmVjdXJzaXZlbHkKK2RlbGV0ZSBhbiBlbnRpcmUgZGlyZWN0b3J5IGZyb20gdGhlIGJyYW5jaC4gIElmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQorcmVtb3ZhbCBtYWtlcyBpdHMgcGFyZW50IGRpcmVjdG9yeSBlbXB0eSwgdGhlIHBhcmVudCBkaXJlY3Rvcnkgd2lsbAorYmUgYXV0b21hdGljYWxseSByZW1vdmVkIHRvby4gIFRoaXMgY2FzY2FkZXMgdXAgdGhlIHRyZWUgdW50aWwgdGhlCitmaXJzdCBub24tZW1wdHkgZGlyZWN0b3J5IG9yIHRoZSByb290IGlzIHJlYWNoZWQuCisKKy4uLi4KKwknRCcgU1AgPHBhdGg+IExGCisuLi4uCisKK2hlcmUgYDxwYXRoPmAgaXMgdGhlIGNvbXBsZXRlIHBhdGggb2YgdGhlIGZpbGUgb3Igc3ViZGlyZWN0b3J5IHRvCitiZSByZW1vdmVkIGZyb20gdGhlIGJyYW5jaC4KK1NlZSBgZmlsZW1vZGlmeWAgYWJvdmUgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYDxwYXRoPmAuCisKK2BmaWxlZGVsZXRlYWxsYAorXl5eXl5eXl5eXl5eXl5eCitJbmNsdWRlZCBpbiBhIGBjb21taXRgIGNvbW1hbmQgdG8gcmVtb3ZlIGFsbCBmaWxlcyAoYW5kIGFsc28gYWxsCitkaXJlY3RvcmllcykgZnJvbSB0aGUgYnJhbmNoLiAgVGhpcyBjb21tYW5kIHJlc2V0cyB0aGUgaW50ZXJuYWwKK2JyYW5jaCBzdHJ1Y3R1cmUgdG8gaGF2ZSBubyBmaWxlcyBpbiBpdCwgYWxsb3dpbmcgdGhlIGZyb250ZW5kCit0byBzdWJzZXF1ZW50bHkgYWRkIGFsbCBpbnRlcmVzdGluZyBmaWxlcyBmcm9tIHNjcmF0Y2guCisKKy4uLi4KKwknZGVsZXRlYWxsJyBMRgorLi4uLgorCitUaGlzIGNvbW1hbmQgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB0aGUgZnJvbnRlbmQgZG9lcyBub3Qga25vdworKG9yIGRvZXMgbm90IGNhcmUgdG8ga25vdykgd2hhdCBmaWxlcyBhcmUgY3VycmVudGx5IG9uIHRoZSBicmFuY2gsCithbmQgdGhlcmVmb3JlIGNhbm5vdCBnZW5lcmF0ZSB0aGUgcHJvcGVyIGBmaWxlZGVsZXRlYCBjb21tYW5kcyB0bwordXBkYXRlIHRoZSBjb250ZW50LgorCitJc3N1aW5nIGEgYGZpbGVkZWxldGVhbGxgIGZvbGxvd2VkIGJ5IHRoZSBuZWVkZWQgYGZpbGVtb2RpZnlgCitjb21tYW5kcyB0byBzZXQgdGhlIGNvcnJlY3QgY29udGVudCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0cworYXMgc2VuZGluZyBvbmx5IHRoZSBuZWVkZWQgYGZpbGVtb2RpZnlgIGFuZCBgZmlsZWRlbGV0ZWAgY29tbWFuZHMuCitUaGUgYGZpbGVkZWxldGVhbGxgIGFwcHJvYWNoIG1heSBob3dldmVyIHJlcXVpcmUgZmFzdC1pbXBvcnQgdG8gdXNlIHNsaWdodGx5Cittb3JlIG1lbW9yeSBwZXIgYWN0aXZlIGJyYW5jaCAobGVzcyB0aGFuIDEgTWlCIGZvciBldmVuIG1vc3QgbGFyZ2UKK3Byb2plY3RzKTsgc28gZnJvbnRlbmRzIHRoYXQgY2FuIGVhc2lseSBvYnRhaW4gb25seSB0aGUgYWZmZWN0ZWQKK3BhdGhzIGZvciBhIGNvbW1pdCBhcmUgZW5jb3VyYWdlZCB0byBkbyBzby4KKworYG1hcmtgCit+fn5+fn4KK0FycmFuZ2VzIGZvciBmYXN0LWltcG9ydCB0byBzYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG9iamVjdCwgYWxsb3dpbmcKK3RoZSBmcm9udGVuZCB0byByZWNhbGwgdGhpcyBvYmplY3QgYXQgYSBmdXR1cmUgcG9pbnQgaW4gdGltZSwgd2l0aG91dAora25vd2luZyBpdHMgU0hBLTEuICBIZXJlIHRoZSBjdXJyZW50IG9iamVjdCBpcyB0aGUgb2JqZWN0IGNyZWF0aW9uCitjb21tYW5kIHRoZSBgbWFya2AgY29tbWFuZCBhcHBlYXJzIHdpdGhpbi4gIFRoaXMgY2FuIGJlIGBjb21taXRgLAorYHRhZ2AsIGFuZCBgYmxvYmAsIGJ1dCBgY29tbWl0YCBpcyB0aGUgbW9zdCBjb21tb24gdXNhZ2UuCisKKy4uLi4KKwknbWFyaycgU1AgJzonIDxpZG51bT4gTEYKKy4uLi4KKword2hlcmUgYDxpZG51bT5gIGlzIHRoZSBudW1iZXIgYXNzaWduZWQgYnkgdGhlIGZyb250ZW5kIHRvIHRoaXMgbWFyay4KK1RoZSB2YWx1ZSBvZiBgPGlkbnVtPmAgaXMgZXhwcmVzc2VkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgaW50ZWdlci4KK1RoZSB2YWx1ZSAwIGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBhcworYSBtYXJrLiAgT25seSB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgbWF5IGJlIHVzZWQgYXMgbWFya3MuCisKK05ldyBtYXJrcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiAgRXhpc3RpbmcgbWFya3MgY2FuIGJlIG1vdmVkCit0byBhbm90aGVyIG9iamVjdCBzaW1wbHkgYnkgcmV1c2luZyB0aGUgc2FtZSBgPGlkbnVtPmAgaW4gYW5vdGhlcgorYG1hcmtgIGNvbW1hbmQuCisKK2B0YWdgCit+fn5+fgorQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgdGFnIHJlZmVycmluZyB0byBhIHNwZWNpZmljIGNvbW1pdC4gIFRvIGNyZWF0ZQorbGlnaHR3ZWlnaHQgKG5vbi1hbm5vdGF0ZWQpIHRhZ3Mgc2VlIHRoZSBgcmVzZXRgIGNvbW1hbmQgYmVsb3cuCisKKy4uLi4KKwkndGFnJyBTUCA8bmFtZT4gTEYKKwknZnJvbScgU1AgPGNvbW1pdHRpc2g+IExGCisJJ3RhZ2dlcicgU1AgPG5hbWU+IFNQIExUIDxlbWFpbD4gR1QgU1AgPHdoZW4+IExGCisJZGF0YQorLi4uLgorCit3aGVyZSBgPG5hbWU+YCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIHRvIGNyZWF0ZS4KKworVGFnIG5hbWVzIGFyZSBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGggYHJlZnMvdGFncy9gIHdoZW4gc3RvcmVkCitpbiBHaXQsIHNvIGltcG9ydGluZyB0aGUgQ1ZTIGJyYW5jaCBzeW1ib2wgYFJFTEVORy0xXzAtRklOQUxgIHdvdWxkCit1c2UganVzdCBgUkVMRU5HLTFfMC1GSU5BTGAgZm9yIGA8bmFtZT5gLCBhbmQgZmFzdC1pbXBvcnQgd2lsbCB3cml0ZSB0aGUKK2NvcnJlc3BvbmRpbmcgcmVmIGFzIGByZWZzL3RhZ3MvUkVMRU5HLTFfMC1GSU5BTGAuCisKK1RoZSB2YWx1ZSBvZiBgPG5hbWU+YCBtdXN0IGJlIGEgdmFsaWQgcmVmbmFtZSBpbiBHaXQgYW5kIHRoZXJlZm9yZQorbWF5IGNvbnRhaW4gZm9yd2FyZCBzbGFzaGVzLiAgQXMgYExGYCBpcyBub3QgdmFsaWQgaW4gYSBHaXQgcmVmbmFtZSwKK25vIHF1b3Rpbmcgb3IgZXNjYXBpbmcgc3ludGF4IGlzIHN1cHBvcnRlZCBoZXJlLgorCitUaGUgYGZyb21gIGNvbW1hbmQgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIGBjb21taXRgIGNvbW1hbmQ7IHNlZQorYWJvdmUgZm9yIGRldGFpbHMuCisKK1RoZSBgdGFnZ2VyYCBjb21tYW5kIHVzZXMgdGhlIHNhbWUgZm9ybWF0IGFzIGBjb21taXR0ZXJgIHdpdGhpbgorYGNvbW1pdGA7IGFnYWluIHNlZSBhYm92ZSBmb3IgZGV0YWlscy4KKworVGhlIGBkYXRhYCBjb21tYW5kIGZvbGxvd2luZyBgdGFnZ2VyYCBtdXN0IHN1cHBseSB0aGUgYW5ub3RhdGVkIHRhZworbWVzc2FnZSAoc2VlIGJlbG93IGZvciBgZGF0YWAgY29tbWFuZCBzeW50YXgpLiAgVG8gaW1wb3J0IGFuIGVtcHR5Cit0YWcgbWVzc2FnZSB1c2UgYSAwIGxlbmd0aCBkYXRhLiAgVGFnIG1lc3NhZ2VzIGFyZSBmcmVlLWZvcm0gYW5kIGFyZQorbm90IGludGVycHJldGVkIGJ5IEdpdC4gIEN1cnJlbnRseSB0aGV5IG11c3QgYmUgZW5jb2RlZCBpbiBVVEYtOCwKK2FzIGZhc3QtaW1wb3J0IGRvZXMgbm90IHBlcm1pdCBvdGhlciBlbmNvZGluZ3MgdG8gYmUgc3BlY2lmaWVkLgorCitTaWduaW5nIGFubm90YXRlZCB0YWdzIGR1cmluZyBpbXBvcnQgZnJvbSB3aXRoaW4gZmFzdC1pbXBvcnQgaXMgbm90CitzdXBwb3J0ZWQuICBUcnlpbmcgdG8gaW5jbHVkZSB5b3VyIG93biBQR1AvR1BHIHNpZ25hdHVyZSBpcyBub3QKK3JlY29tbWVuZGVkLCBhcyB0aGUgZnJvbnRlbmQgZG9lcyBub3QgKGVhc2lseSkgaGF2ZSBhY2Nlc3MgdG8gdGhlCitjb21wbGV0ZSBzZXQgb2YgYnl0ZXMgd2hpY2ggbm9ybWFsbHkgZ29lcyBpbnRvIHN1Y2ggYSBzaWduYXR1cmUuCitJZiBzaWduaW5nIGlzIHJlcXVpcmVkLCBjcmVhdGUgbGlnaHR3ZWlnaHQgdGFncyBmcm9tIHdpdGhpbiBmYXN0LWltcG9ydCB3aXRoCitgcmVzZXRgLCB0aGVuIGNyZWF0ZSB0aGUgYW5ub3RhdGVkIHZlcnNpb25zIG9mIHRob3NlIHRhZ3Mgb2ZmbGluZQord2l0aCB0aGUgc3RhbmRhcmQgZ2l0bGluazpnaXQtdGFnWzFdIHByb2Nlc3MuCisKK2ByZXNldGAKK35+fn5+fn4KK0NyZWF0ZXMgKG9yIHJlY3JlYXRlcykgdGhlIG5hbWVkIGJyYW5jaCwgb3B0aW9uYWxseSBzdGFydGluZyBmcm9tCithIHNwZWNpZmljIHJldmlzaW9uLiAgVGhlIHJlc2V0IGNvbW1hbmQgYWxsb3dzIGEgZnJvbnRlbmQgdG8gaXNzdWUKK2EgbmV3IGBmcm9tYCBjb21tYW5kIGZvciBhbiBleGlzdGluZyBicmFuY2gsIG9yIHRvIGNyZWF0ZSBhIG5ldworYnJhbmNoIGZyb20gYW4gZXhpc3RpbmcgY29tbWl0IHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgY29tbWl0LgorCisuLi4uCisJJ3Jlc2V0JyBTUCA8cmVmPiBMRgorCSgnZnJvbScgU1AgPGNvbW1pdHRpc2g+IExGKT8KKwlMRgorLi4uLgorCitGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBgPHJlZj5gIGFuZCBgPGNvbW1pdHRpc2g+YCBzZWUgYWJvdmUKK3VuZGVyIGBjb21taXRgIGFuZCBgZnJvbWAuCisKK1RoZSBgcmVzZXRgIGNvbW1hbmQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgbGlnaHR3ZWlnaHQKKyhub24tYW5ub3RhdGVkKSB0YWdzLiAgRm9yIGV4YW1wbGU6CisKKz09PT0KKwlyZXNldCByZWZzL3RhZ3MvOTM4CisJZnJvbSA6OTM4Cis9PT09CisKK3dvdWxkIGNyZWF0ZSB0aGUgbGlnaHR3ZWlnaHQgdGFnIGByZWZzL3RhZ3MvOTM4YCByZWZlcnJpbmcgdG8KK3doYXRldmVyIGNvbW1pdCBtYXJrIGA6OTM4YCByZWZlcmVuY2VzLgorCitgYmxvYmAKK35+fn5+fgorUmVxdWVzdHMgd3JpdGluZyBvbmUgZmlsZSByZXZpc2lvbiB0byB0aGUgcGFja2ZpbGUuICBUaGUgcmV2aXNpb24KK2lzIG5vdCBjb25uZWN0ZWQgdG8gYW55IGNvbW1pdDsgdGhpcyBjb25uZWN0aW9uIG11c3QgYmUgZm9ybWVkIGluCithIHN1YnNlcXVlbnQgYGNvbW1pdGAgY29tbWFuZCBieSByZWZlcmVuY2luZyB0aGUgYmxvYiB0aHJvdWdoIGFuCithc3NpZ25lZCBtYXJrLgorCisuLi4uCisJJ2Jsb2InIExGCisJbWFyaz8KKwlkYXRhCisuLi4uCisKK1RoZSBtYXJrIGNvbW1hbmQgaXMgb3B0aW9uYWwgaGVyZSBhcyBzb21lIGZyb250ZW5kcyBoYXZlIGNob3NlbgordG8gZ2VuZXJhdGUgdGhlIEdpdCBTSEEtMSBmb3IgdGhlIGJsb2Igb24gdGhlaXIgb3duLCBhbmQgZmVlZCB0aGF0CitkaXJlY3RseSB0byBgY29tbWl0YC4gIFRoaXMgaXMgdHlwaWNhbGx5IG1vcmUgd29yayB0aGFuIGl0cyB3b3J0aAoraG93ZXZlciwgYXMgbWFya3MgYXJlIGluZXhwZW5zaXZlIHRvIHN0b3JlIGFuZCBlYXN5IHRvIHVzZS4KKworYGRhdGFgCit+fn5+fn4KK1N1cHBsaWVzIHJhdyBkYXRhIChmb3IgdXNlIGFzIGJsb2IvZmlsZSBjb250ZW50LCBjb21taXQgbWVzc2FnZXMsIG9yCithbm5vdGF0ZWQgdGFnIG1lc3NhZ2VzKSB0byBmYXN0LWltcG9ydC4gIERhdGEgY2FuIGJlIHN1cHBsaWVkIHVzaW5nIGFuIGV4YWN0CitieXRlIGNvdW50IG9yIGRlbGltaXRlZCB3aXRoIGEgdGVybWluYXRpbmcgbGluZS4gIFJlYWwgZnJvbnRlbmRzCitpbnRlbmRlZCBmb3IgcHJvZHVjdGlvbi1xdWFsaXR5IGNvbnZlcnNpb25zIHNob3VsZCBhbHdheXMgdXNlIHRoZQorZXhhY3QgYnl0ZSBjb3VudCBmb3JtYXQsIGFzIGl0IGlzIG1vcmUgcm9idXN0IGFuZCBwZXJmb3JtcyBiZXR0ZXIuCitUaGUgZGVsaW1pdGVkIGZvcm1hdCBpcyBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcgZmFzdC1pbXBvcnQuCisKK0V4YWN0IGJ5dGUgY291bnQgZm9ybWF0OjoKKwlUaGUgZnJvbnRlbmQgbXVzdCBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YS4KKysKKy4uLi4KKwknZGF0YScgU1AgPGNvdW50PiBMRgorCTxyYXc+IExGCisuLi4uCisrCit3aGVyZSBgPGNvdW50PmAgaXMgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcyBhcHBlYXJpbmcgd2l0aGluCitgPHJhdz5gLiAgVGhlIHZhbHVlIG9mIGA8Y291bnQ+YCBpcyBleHByZXNzZWQgYXMgYW4gQVNDSUkgZGVjaW1hbAoraW50ZWdlci4gIFRoZSBgTEZgIG9uIGVpdGhlciBzaWRlIG9mIGA8cmF3PmAgaXMgbm90CitpbmNsdWRlZCBpbiBgPGNvdW50PmAgYW5kIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBpbXBvcnRlZCBkYXRhLgorCitEZWxpbWl0ZWQgZm9ybWF0OjoKKwlBIGRlbGltaXRlciBzdHJpbmcgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGRhdGEuCisJZmFzdC1pbXBvcnQgd2lsbCBjb21wdXRlIHRoZSBsZW5ndGggYnkgc2VhcmNoaW5nIGZvciB0aGUgZGVsaW1pdGVyLgorCVRoaXMgZm9ybWF0IGlzIHByaW1hcmx5IHVzZWZ1bCBmb3IgdGVzdGluZyBhbmQgaXMgbm90CisJcmVjb21tZW5kZWQgZm9yIHJlYWwgZGF0YS4KKysKKy4uLi4KKwknZGF0YScgU1AgJzw8JyA8ZGVsaW0+IExGCisJPHJhdz4gTEYKKwk8ZGVsaW0+IExGCisuLi4uCisrCit3aGVyZSBgPGRlbGltPmAgaXMgdGhlIGNob3NlbiBkZWxpbWl0ZXIgc3RyaW5nLiAgVGhlIHN0cmluZyBgPGRlbGltPmAKK211c3Qgbm90IGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIHdpdGhpbiBgPHJhdz5gLCBhcyBvdGhlcndpc2UKK2Zhc3QtaW1wb3J0IHdpbGwgdGhpbmsgdGhlIGRhdGEgZW5kcyBlYXJsaWVyIHRoYW4gaXQgcmVhbGx5IGRvZXMuICBUaGUgYExGYAoraW1tZWRpYXRlbHkgdHJhaWxpbmcgYDxyYXc+YCBpcyBwYXJ0IG9mIGA8cmF3PmAuICBUaGlzIGlzIG9uZSBvZgordGhlIGxpbWl0YXRpb25zIG9mIHRoZSBkZWxpbWl0ZWQgZm9ybWF0LCBpdCBpcyBpbXBvc3NpYmxlIHRvIHN1cHBseQorYSBkYXRhIGNodW5rIHdoaWNoIGRvZXMgbm90IGhhdmUgYW4gTEYgYXMgaXRzIGxhc3QgYnl0ZS4KKworYGNoZWNrcG9pbnRgCit+fn5+fn5+fn5+fn4KK0ZvcmNlcyBmYXN0LWltcG9ydCB0byBjbG9zZSB0aGUgY3VycmVudCBwYWNrZmlsZSwgc3RhcnQgYSBuZXcgb25lLCBhbmQgdG8KK3NhdmUgb3V0IGFsbCBjdXJyZW50IGJyYW5jaCByZWZzLCB0YWdzIGFuZCBtYXJrcy4KKworLi4uLgorCSdjaGVja3BvaW50JyBMRgorCUxGCisuLi4uCisKK05vdGUgdGhhdCBmYXN0LWltcG9ydCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIHBhY2tmaWxlcyB3aGVuIHRoZSBjdXJyZW50CitwYWNrZmlsZSByZWFjaGVzIFwtLW1heC1wYWNrLXNpemUsIG9yIDQgR2lCLCB3aGljaGV2ZXIgbGltaXQgaXMKK3NtYWxsZXIuICBEdXJpbmcgYW4gYXV0b21hdGljIHBhY2tmaWxlIHN3aXRjaCBmYXN0LWltcG9ydCBkb2VzIG5vdCB1cGRhdGUKK3RoZSBicmFuY2ggcmVmcywgdGFncyBvciBtYXJrcy4KKworQXMgYSBgY2hlY2twb2ludGAgY2FuIHJlcXVpcmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgQ1BVIHRpbWUgYW5kCitkaXNrIElPICh0byBjb21wdXRlIHRoZSBvdmVyYWxsIHBhY2sgU0hBLTEgY2hlY2tzdW0sIGdlbmVyYXRlIHRoZQorY29ycmVzcG9uZGluZyBpbmRleCBmaWxlLCBhbmQgdXBkYXRlIHRoZSByZWZzKSBpdCBjYW4gZWFzaWx5IHRha2UKK3NldmVyYWwgbWludXRlcyBmb3IgYSBzaW5nbGUgYGNoZWNrcG9pbnRgIGNvbW1hbmQgdG8gY29tcGxldGUuCisKK0Zyb250ZW5kcyBtYXkgY2hvb3NlIHRvIGlzc3VlIGNoZWNrcG9pbnRzIGR1cmluZyBleHRyZW1lbHkgbGFyZ2UKK2FuZCBsb25nIHJ1bm5pbmcgaW1wb3J0cywgb3Igd2hlbiB0aGV5IG5lZWQgdG8gYWxsb3cgYW5vdGhlciBHaXQKK3Byb2Nlc3MgYWNjZXNzIHRvIGEgYnJhbmNoLiAgSG93ZXZlciBnaXZlbiB0aGF0IGEgMzAgR2lCIFN1YnZlcnNpb24KK3JlcG9zaXRvcnkgY2FuIGJlIGxvYWRlZCBpbnRvIEdpdCB0aHJvdWdoIGZhc3QtaW1wb3J0IGluIGFib3V0IDMgaG91cnMsCitleHBsaWNpdCBjaGVja3BvaW50aW5nIG1heSBub3QgYmUgbmVjZXNzYXJ5LgorCisKK1RpcHMgYW5kIFRyaWNrcworLS0tLS0tLS0tLS0tLS0tCitUaGUgZm9sbG93aW5nIHRpcHMgYW5kIHRyaWNrcyBoYXZlIGJlZW4gY29sbGVjdGVkIGZyb20gdmFyaW91cwordXNlcnMgb2YgZmFzdC1pbXBvcnQsIGFuZCBhcmUgb2ZmZXJlZCBoZXJlIGFzIHN1Z2dlc3Rpb25zLgorCitVc2UgT25lIE1hcmsgUGVyIENvbW1pdAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1doZW4gZG9pbmcgYSByZXBvc2l0b3J5IGNvbnZlcnNpb24sIHVzZSBhIHVuaXF1ZSBtYXJrIHBlciBjb21taXQKKyhgbWFyayA6PG4+YCkgYW5kIHN1cHBseSB0aGUgXC0tZXhwb3J0LW1hcmtzIG9wdGlvbiBvbiB0aGUgY29tbWFuZAorbGluZS4gIGZhc3QtaW1wb3J0IHdpbGwgZHVtcCBhIGZpbGUgd2hpY2ggbGlzdHMgZXZlcnkgbWFyayBhbmQgdGhlIEdpdAorb2JqZWN0IFNIQS0xIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQuICBJZiB0aGUgZnJvbnRlbmQgY2FuIHRpZQordGhlIG1hcmtzIGJhY2sgdG8gdGhlIHNvdXJjZSByZXBvc2l0b3J5LCBpdCBpcyBlYXN5IHRvIHZlcmlmeSB0aGUKK2FjY3VyYWN5IGFuZCBjb21wbGV0ZW5lc3Mgb2YgdGhlIGltcG9ydCBieSBjb21wYXJpbmcgZWFjaCBHaXQKK2NvbW1pdCB0byB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgcmV2aXNpb24uCisKK0NvbWluZyBmcm9tIGEgc3lzdGVtIHN1Y2ggYXMgUGVyZm9yY2Ugb3IgU3VidmVyc2lvbiB0aGlzIHNob3VsZCBiZQorcXVpdGUgc2ltcGxlLCBhcyB0aGUgZmFzdC1pbXBvcnQgbWFyayBjYW4gYWxzbyBiZSB0aGUgUGVyZm9yY2UgY2hhbmdlc2V0CitudW1iZXIgb3IgdGhlIFN1YnZlcnNpb24gcmV2aXNpb24gbnVtYmVyLgorCitGcmVlbHkgU2tpcCBBcm91bmQgQnJhbmNoZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorRG9uJ3QgYm90aGVyIHRyeWluZyB0byBvcHRpbWl6ZSB0aGUgZnJvbnRlbmQgdG8gc3RpY2sgdG8gb25lIGJyYW5jaAorYXQgYSB0aW1lIGR1cmluZyBhbiBpbXBvcnQuICBBbHRob3VnaCBkb2luZyBzbyBtaWdodCBiZSBzbGlnaHRseQorZmFzdGVyIGZvciBmYXN0LWltcG9ydCwgaXQgdGVuZHMgdG8gaW5jcmVhc2UgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIGZyb250ZW5kCitjb2RlIGNvbnNpZGVyYWJseS4KKworVGhlIGJyYW5jaCBMUlUgYnVpbHRpbiB0byBmYXN0LWltcG9ydCB0ZW5kcyB0byBiZWhhdmUgdmVyeSB3ZWxsLCBhbmQgdGhlCitjb3N0IG9mIGFjdGl2YXRpbmcgYW4gaW5hY3RpdmUgYnJhbmNoIGlzIHNvIGxvdyB0aGF0IGJvdW5jaW5nIGFyb3VuZAorYmV0d2VlbiBicmFuY2hlcyBoYXMgdmlydHVhbGx5IG5vIGltcGFjdCBvbiBpbXBvcnQgcGVyZm9ybWFuY2UuCisKK0hhbmRsaW5nIFJlbmFtZXMKK35+fn5+fn5+fn5+fn5+fn4KK1doZW4gaW1wb3J0aW5nIGEgcmVuYW1lZCBmaWxlIG9yIGRpcmVjdG9yeSwgc2ltcGx5IGRlbGV0ZSB0aGUgb2xkCituYW1lKHMpIGFuZCBtb2RpZnkgdGhlIG5ldyBuYW1lKHMpIGR1cmluZyB0aGUgY29ycmVzcG9uZGluZyBjb21taXQuCitHaXQgcGVyZm9ybXMgcmVuYW1lIGRldGVjdGlvbiBhZnRlci10aGUtZmFjdCwgcmF0aGVyIHRoYW4gZXhwbGljaXRseQorZHVyaW5nIGEgY29tbWl0LgorCitVc2UgVGFnIEZpeHVwIEJyYW5jaGVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitTb21lIG90aGVyIFNDTSBzeXN0ZW1zIGxldCB0aGUgdXNlciBjcmVhdGUgYSB0YWcgZnJvbSBtdWx0aXBsZQorZmlsZXMgd2hpY2ggYXJlIG5vdCBmcm9tIHRoZSBzYW1lIGNvbW1pdC9jaGFuZ2VzZXQuICBPciB0byBjcmVhdGUKK3RhZ3Mgd2hpY2ggYXJlIGEgc3Vic2V0IG9mIHRoZSBmaWxlcyBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnkuCisKK0ltcG9ydGluZyB0aGVzZSB0YWdzIGFzLWlzIGluIEdpdCBpcyBpbXBvc3NpYmxlIHdpdGhvdXQgbWFraW5nIGF0CitsZWFzdCBvbmUgY29tbWl0IHdoaWNoIGBgZml4ZXMgdXAnJyB0aGUgZmlsZXMgdG8gbWF0Y2ggdGhlIGNvbnRlbnQKK29mIHRoZSB0YWcuICBVc2UgZmFzdC1pbXBvcnQncyBgcmVzZXRgIGNvbW1hbmQgdG8gcmVzZXQgYSBkdW1teSBicmFuY2gKK291dHNpZGUgb2YgeW91ciBub3JtYWwgYnJhbmNoIHNwYWNlIHRvIHRoZSBiYXNlIGNvbW1pdCBmb3IgdGhlIHRhZywKK3RoZW4gY29tbWl0IG9uZSBvciBtb3JlIGZpbGUgZml4dXAgY29tbWl0cywgYW5kIGZpbmFsbHkgdGFnIHRoZQorZHVtbXkgYnJhbmNoLgorCitGb3IgZXhhbXBsZSBzaW5jZSBhbGwgbm9ybWFsIGJyYW5jaGVzIGFyZSBzdG9yZWQgdW5kZXIgYHJlZnMvaGVhZHMvYAorbmFtZSB0aGUgdGFnIGZpeHVwIGJyYW5jaCBgVEFHX0ZJWFVQYC4gIFRoaXMgd2F5IGl0IGlzIGltcG9zc2libGUgZm9yCit0aGUgZml4dXAgYnJhbmNoIHVzZWQgYnkgdGhlIGltcG9ydGVyIHRvIGhhdmUgbmFtZXNwYWNlIGNvbmZsaWN0cword2l0aCByZWFsIGJyYW5jaGVzIGltcG9ydGVkIGZyb20gdGhlIHNvdXJjZSAodGhlIG5hbWUgYFRBR19GSVhVUGAKK2lzIG5vdCBgcmVmcy9oZWFkcy9UQUdfRklYVVBgKS4KKworV2hlbiBjb21taXR0aW5nIGZpeHVwcywgY29uc2lkZXIgdXNpbmcgYG1lcmdlYCB0byBjb25uZWN0IHRoZQorY29tbWl0KHMpIHdoaWNoIGFyZSBzdXBwbHlpbmcgZmlsZSByZXZpc2lvbnMgdG8gdGhlIGZpeHVwIGJyYW5jaC4KK0RvaW5nIHNvIHdpbGwgYWxsb3cgdG9vbHMgc3VjaCBhcyBnaXRsaW5rOmdpdC1ibGFtZVsxXSB0byB0cmFjawordGhyb3VnaCB0aGUgcmVhbCBjb21taXQgaGlzdG9yeSBhbmQgcHJvcGVybHkgYW5ub3RhdGUgdGhlIHNvdXJjZQorZmlsZXMuCisKK0FmdGVyIGZhc3QtaW1wb3J0IHRlcm1pbmF0ZXMgdGhlIGZyb250ZW5kIHdpbGwgbmVlZCB0byBkbyBgcm0gLmdpdC9UQUdfRklYVVBgCit0byByZW1vdmUgdGhlIGR1bW15IGJyYW5jaC4KKworSW1wb3J0IE5vdywgUmVwYWNrIExhdGVyCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0FzIHNvb24gYXMgZmFzdC1pbXBvcnQgY29tcGxldGVzIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjb21wbGV0ZWx5IHZhbGlkCithbmQgcmVhZHkgZm9yIHVzZS4gIFR5cGljYWxsbHkgdGhpcyB0YWtlcyBvbmx5IGEgdmVyeSBzaG9ydCB0aW1lLAorZXZlbiBmb3IgY29uc2lkZXJhYmx5IGxhcmdlIHByb2plY3RzICgxMDAsMDAwKyBjb21taXRzKS4KKworSG93ZXZlciByZXBhY2tpbmcgdGhlIHJlcG9zaXRvcnkgaXMgbmVjZXNzYXJ5IHRvIGltcHJvdmUgZGF0YQorbG9jYWxpdHkgYW5kIGFjY2VzcyBwZXJmb3JtYW5jZS4gIEl0IGNhbiBhbHNvIHRha2UgaG91cnMgb24gZXh0cmVtZWx5CitsYXJnZSBwcm9qZWN0cyAoZXNwZWNpYWxseSBpZiAtZiBhbmQgYSBsYXJnZSBcLS13aW5kb3cgcGFyYW1ldGVyIGlzCit1c2VkKS4gIFNpbmNlIHJlcGFja2luZyBpcyBzYWZlIHRvIHJ1biBhbG9uZ3NpZGUgcmVhZGVycyBhbmQgd3JpdGVycywKK3J1biB0aGUgcmVwYWNrIGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBsZXQgaXQgZmluaXNoIHdoZW4gaXQgZmluaXNoZXMuCitUaGVyZSBpcyBubyByZWFzb24gdG8gd2FpdCB0byBleHBsb3JlIHlvdXIgbmV3IEdpdCBwcm9qZWN0IQorCitJZiB5b3UgY2hvb3NlIHRvIHdhaXQgZm9yIHRoZSByZXBhY2ssIGRvbid0IHRyeSB0byBydW4gYmVuY2htYXJrcworb3IgcGVyZm9ybWFuY2UgdGVzdHMgdW50aWwgcmVwYWNraW5nIGlzIGNvbXBsZXRlZC4gIGZhc3QtaW1wb3J0IG91dHB1dHMKK3N1Ym9wdGltYWwgcGFja2ZpbGVzIHRoYXQgYXJlIHNpbXBseSBuZXZlciBzZWVuIGluIHJlYWwgdXNlCitzaXR1YXRpb25zLgorCitSZXBhY2tpbmcgSGlzdG9yaWNhbCBEYXRhCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitJZiB5b3UgYXJlIHJlcGFja2luZyB2ZXJ5IG9sZCBpbXBvcnRlZCBkYXRhIChlLmcuIG9sZGVyIHRoYW4gdGhlCitsYXN0IHllYXIpLCBjb25zaWRlciBleHBlbmRpbmcgc29tZSBleHRyYSBDUFUgdGltZSBhbmQgc3VwcGx5aW5nCitcLS13aW5kb3c9NTAgKG9yIGhpZ2hlcikgd2hlbiB5b3UgcnVuIGdpdGxpbms6Z2l0LXJlcGFja1sxXS4KK1RoaXMgd2lsbCB0YWtlIGxvbmdlciwgYnV0IHdpbGwgYWxzbyBwcm9kdWNlIGEgc21hbGxlciBwYWNrZmlsZS4KK1lvdSBvbmx5IG5lZWQgdG8gZXhwZW5kIHRoZSBlZmZvcnQgb25jZSwgYW5kIGV2ZXJ5b25lIHVzaW5nIHlvdXIKK3Byb2plY3Qgd2lsbCBiZW5lZml0IGZyb20gdGhlIHNtYWxsZXIgcmVwb3NpdG9yeS4KKworCitQYWNrZmlsZSBPcHRpbWl6YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiBwYWNraW5nIGEgYmxvYiBmYXN0LWltcG9ydCBhbHdheXMgYXR0ZW1wdHMgdG8gZGVsdGlmeSBhZ2FpbnN0IHRoZSBsYXN0CitibG9iIHdyaXR0ZW4uICBVbmxlc3Mgc3BlY2lmaWNhbGx5IGFycmFuZ2VkIGZvciBieSB0aGUgZnJvbnRlbmQsCit0aGlzIHdpbGwgcHJvYmFibHkgbm90IGJlIGEgcHJpb3IgdmVyc2lvbiBvZiB0aGUgc2FtZSBmaWxlLCBzbyB0aGUKK2dlbmVyYXRlZCBkZWx0YSB3aWxsIG5vdCBiZSB0aGUgc21hbGxlc3QgcG9zc2libGUuICBUaGUgcmVzdWx0aW5nCitwYWNrZmlsZSB3aWxsIGJlIGNvbXByZXNzZWQsIGJ1dCB3aWxsIG5vdCBiZSBvcHRpbWFsLgorCitGcm9udGVuZHMgd2hpY2ggaGF2ZSBlZmZpY2llbnQgYWNjZXNzIHRvIGFsbCByZXZpc2lvbnMgb2YgYQorc2luZ2xlIGZpbGUgKGZvciBleGFtcGxlIHJlYWRpbmcgYW4gUkNTL0NWUyAsdiBmaWxlKSBjYW4gY2hvb3NlCit0byBzdXBwbHkgYWxsIHJldmlzaW9ucyBvZiB0aGF0IGZpbGUgYXMgYSBzZXF1ZW5jZSBvZiBjb25zZWN1dGl2ZQorYGJsb2JgIGNvbW1hbmRzLiAgVGhpcyBhbGxvd3MgZmFzdC1pbXBvcnQgdG8gZGVsdGlmeSB0aGUgZGlmZmVyZW50IGZpbGUKK3JldmlzaW9ucyBhZ2FpbnN0IGVhY2ggb3RoZXIsIHNhdmluZyBzcGFjZSBpbiB0aGUgZmluYWwgcGFja2ZpbGUuCitNYXJrcyBjYW4gYmUgdXNlZCB0byBsYXRlciBpZGVudGlmeSBpbmRpdmlkdWFsIGZpbGUgcmV2aXNpb25zIGR1cmluZworYSBzZXF1ZW5jZSBvZiBgY29tbWl0YCBjb21tYW5kcy4KKworVGhlIHBhY2tmaWxlKHMpIGNyZWF0ZWQgYnkgZmFzdC1pbXBvcnQgZG8gbm90IGVuY291cmFnZSBnb29kIGRpc2sgYWNjZXNzCitwYXR0ZXJucy4gIFRoaXMgaXMgY2F1c2VkIGJ5IGZhc3QtaW1wb3J0IHdyaXRpbmcgdGhlIGRhdGEgaW4gdGhlIG9yZGVyCitpdCBpcyByZWNlaXZlZCBvbiBzdGFuZGFyZCBpbnB1dCwgd2hpbGUgR2l0IHR5cGljYWxseSBvcmdhbml6ZXMKK2RhdGEgd2l0aGluIHBhY2tmaWxlcyB0byBtYWtlIHRoZSBtb3N0IHJlY2VudCAoY3VycmVudCB0aXApIGRhdGEKK2FwcGVhciBiZWZvcmUgaGlzdG9yaWNhbCBkYXRhLiAgR2l0IGFsc28gY2x1c3RlcnMgY29tbWl0cyB0b2dldGhlciwKK3NwZWVkaW5nIHVwIHJldmlzaW9uIHRyYXZlcnNhbCB0aHJvdWdoIGJldHRlciBjYWNoZSBsb2NhbGl0eS4KKworRm9yIHRoaXMgcmVhc29uIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgdXNlcnMgcmVwYWNrIHRoZQorcmVwb3NpdG9yeSB3aXRoIGBnaXQgcmVwYWNrIC1hIC1kYCBhZnRlciBmYXN0LWltcG9ydCBjb21wbGV0ZXMsIGFsbG93aW5nCitHaXQgdG8gcmVvcmdhbml6ZSB0aGUgcGFja2ZpbGVzIGZvciBmYXN0ZXIgZGF0YSBhY2Nlc3MuICBJZiBibG9iCitkZWx0YXMgYXJlIHN1Ym9wdGltYWwgKHNlZSBhYm92ZSkgdGhlbiBhbHNvIGFkZGluZyB0aGUgYC1mYCBvcHRpb24KK3RvIGZvcmNlIHJlY29tcHV0YXRpb24gb2YgYWxsIGRlbHRhcyBjYW4gc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlCitmaW5hbCBwYWNrZmlsZSBzaXplICgzMC01MCUgc21hbGxlciBjYW4gYmUgcXVpdGUgdHlwaWNhbCkuCisKKworTWVtb3J5IFV0aWxpemF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSBhIG51bWJlciBvZiBmYWN0b3JzIHdoaWNoIGFmZmVjdCBob3cgbXVjaCBtZW1vcnkgZmFzdC1pbXBvcnQKK3JlcXVpcmVzIHRvIHBlcmZvcm0gYW4gaW1wb3J0LiAgTGlrZSBjcml0aWNhbCBzZWN0aW9ucyBvZiBjb3JlCitHaXQsIGZhc3QtaW1wb3J0IHVzZXMgaXRzIG93biBtZW1vcnkgYWxsb2NhdG9ycyB0byBhbW1vcnRpemUgYW55IG92ZXJoZWFkcworYXNzb2NpYXRlZCB3aXRoIG1hbGxvYy4gIEluIHByYWN0aWNlIGZhc3QtaW1wb3J0IHRlbmRzIHRvIGFtbW9yaXRpemUgYW55CittYWxsb2Mgb3ZlcmhlYWRzIHRvIDAsIGR1ZSB0byBpdHMgdXNlIG9mIGxhcmdlIGJsb2NrIGFsbG9jYXRpb25zLgorCitwZXIgb2JqZWN0Cit+fn5+fn5+fn5+CitmYXN0LWltcG9ydCBtYWludGFpbnMgYW4gaW4tbWVtb3J5IHN0cnVjdHVyZSBmb3IgZXZlcnkgb2JqZWN0IHdyaXR0ZW4gaW4KK3RoaXMgZXhlY3V0aW9uLiAgT24gYSAzMiBiaXQgc3lzdGVtIHRoZSBzdHJ1Y3R1cmUgaXMgMzIgYnl0ZXMsCitvbiBhIDY0IGJpdCBzeXN0ZW0gdGhlIHN0cnVjdHVyZSBpcyA0MCBieXRlcyAoZHVlIHRvIHRoZSBsYXJnZXIKK3BvaW50ZXIgc2l6ZXMpLiAgT2JqZWN0cyBpbiB0aGUgdGFibGUgYXJlIG5vdCBkZWFsbG9jYXRlZCB1bnRpbAorZmFzdC1pbXBvcnQgdGVybWluYXRlcy4gIEltcG9ydGluZyAyIG1pbGxpb24gb2JqZWN0cyBvbiBhIDMyIGJpdCBzeXN0ZW0KK3dpbGwgcmVxdWlyZSBhcHByb3hpbWF0ZWx5IDY0IE1pQiBvZiBtZW1vcnkuCisKK1RoZSBvYmplY3QgdGFibGUgaXMgYWN0dWFsbHkgYSBoYXNodGFibGUga2V5ZWQgb24gdGhlIG9iamVjdCBuYW1lCisodGhlIHVuaXF1ZSBTSEEtMSkuICBUaGlzIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBhbGxvd3MgZmFzdC1pbXBvcnQgdG8gcmV1c2UKK2FuIGV4aXN0aW5nIG9yIGFscmVhZHkgd3JpdHRlbiBvYmplY3QgYW5kIGF2b2lkIHdyaXRpbmcgZHVwbGljYXRlcwordG8gdGhlIG91dHB1dCBwYWNrZmlsZS4gIER1cGxpY2F0ZSBibG9icyBhcmUgc3VycHJpc2luZ2x5IGNvbW1vbgoraW4gYW4gaW1wb3J0LCB0eXBpY2FsbHkgZHVlIHRvIGJyYW5jaCBtZXJnZXMgaW4gdGhlIHNvdXJjZS4KKworcGVyIG1hcmsKK35+fn5+fn5+CitNYXJrcyBhcmUgc3RvcmVkIGluIGEgc3BhcnNlIGFycmF5LCB1c2luZyAxIHBvaW50ZXIgKDQgYnl0ZXMgb3IgOAorYnl0ZXMsIGRlcGVuZGluZyBvbiBwb2ludGVyIHNpemUpIHBlciBtYXJrLiAgQWx0aG91Z2ggdGhlIGFycmF5CitpcyBzcGFyc2UsIGZyb250ZW5kcyBhcmUgc3RpbGwgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgbWFya3MKK2JldHdlZW4gMSBhbmQgbiwgd2hlcmUgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIG1hcmtzIHJlcXVpcmVkIGZvcgordGhpcyBpbXBvcnQuCisKK3BlciBicmFuY2gKK35+fn5+fn5+fn4KK0JyYW5jaGVzIGFyZSBjbGFzc2lmaWVkIGFzIGFjdGl2ZSBhbmQgaW5hY3RpdmUuICBUaGUgbWVtb3J5IHVzYWdlCitvZiB0aGUgdHdvIGNsYXNzZXMgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCisKK0luYWN0aXZlIGJyYW5jaGVzIGFyZSBzdG9yZWQgaW4gYSBzdHJ1Y3R1cmUgd2hpY2ggdXNlcyA5NiBvciAxMjAKK2J5dGVzICgzMiBiaXQgb3IgNjQgYml0IHN5c3RlbXMsIHJlc3BlY3RpdmVseSksIHBsdXMgdGhlIGxlbmd0aCBvZgordGhlIGJyYW5jaCBuYW1lICh0eXBpY2FsbHkgdW5kZXIgMjAwIGJ5dGVzKSwgcGVyIGJyYW5jaC4gIGZhc3QtaW1wb3J0IHdpbGwKK2Vhc2lseSBoYW5kbGUgYXMgbWFueSBhcyAxMCwwMDAgaW5hY3RpdmUgYnJhbmNoZXMgaW4gdW5kZXIgMiBNaUIKK29mIG1lbW9yeS4KKworQWN0aXZlIGJyYW5jaGVzIGhhdmUgdGhlIHNhbWUgb3ZlcmhlYWQgYXMgaW5hY3RpdmUgYnJhbmNoZXMsIGJ1dAorYWxzbyBjb250YWluIGNvcGllcyBvZiBldmVyeSB0cmVlIHRoYXQgaGFzIGJlZW4gcmVjZW50bHkgbW9kaWZpZWQgb24KK3RoYXQgYnJhbmNoLiAgSWYgc3VidHJlZSBgaW5jbHVkZWAgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZQorYnJhbmNoIGJlY2FtZSBhY3RpdmUsIGl0cyBjb250ZW50cyB3aWxsIG5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnksCitidXQgaWYgc3VidHJlZSBgc3JjYCBoYXMgYmVlbiBtb2RpZmllZCBieSBhIGNvbW1pdCBzaW5jZSB0aGUgYnJhbmNoCitiZWNhbWUgYWN0aXZlLCB0aGVuIGl0cyBjb250ZW50cyB3aWxsIGJlIGxvYWRlZCBpbiBtZW1vcnkuCisKK0FzIGFjdGl2ZSBicmFuY2hlcyBzdG9yZSBtZXRhZGF0YSBhYm91dCB0aGUgZmlsZXMgY29udGFpbmVkIG9uIHRoYXQKK2JyYW5jaCwgdGhlaXIgaW4tbWVtb3J5IHN0b3JhZ2Ugc2l6ZSBjYW4gZ3JvdyB0byBhIGNvbnNpZGVyYWJsZSBzaXplCisoc2VlIGJlbG93KS4KKworZmFzdC1pbXBvcnQgYXV0b21hdGljYWxseSBtb3ZlcyBhY3RpdmUgYnJhbmNoZXMgdG8gaW5hY3RpdmUgc3RhdHVzIGJhc2VkIG9uCithIHNpbXBsZSBsZWFzdC1yZWNlbnRseS11c2VkIGFsZ29yaXRobS4gIFRoZSBMUlUgY2hhaW4gaXMgdXBkYXRlZCBvbgorZWFjaCBgY29tbWl0YCBjb21tYW5kLiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBicmFuY2hlcyBjYW4gYmUKK2luY3JlYXNlZCBvciBkZWNyZWFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIFwtLWFjdGl2ZS1icmFuY2hlcz0uCisKK3BlciBhY3RpdmUgdHJlZQorfn5+fn5+fn5+fn5+fn5+CitUcmVlcyAoYWthIGRpcmVjdG9yaWVzKSB1c2UganVzdCAxMiBieXRlcyBvZiBtZW1vcnkgb24gdG9wIG9mIHRoZQorbWVtb3J5IHJlcXVpcmVkIGZvciB0aGVpciBlbnRyaWVzIChzZWUgYGBwZXIgYWN0aXZlIGZpbGUnJyBiZWxvdykuCitUaGUgY29zdCBvZiBhIHRyZWUgaXMgdmlydHVhbGx5IDAsIGFzIGl0cyBvdmVyaGVhZCBhbW1vcnRpemVzIG91dAorb3ZlciB0aGUgaW5kaXZpZHVhbCBmaWxlIGVudHJpZXMuCisKK3BlciBhY3RpdmUgZmlsZSBlbnRyeQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CitGaWxlcyAoYW5kIHBvaW50ZXJzIHRvIHN1YnRyZWVzKSB3aXRoaW4gYWN0aXZlIHRyZWVzIHJlcXVpcmUgNTIgb3IgNjQKK2J5dGVzICgzMi82NCBiaXQgcGxhdGZvcm1zKSBwZXIgZW50cnkuICBUbyBjb25zZXJ2ZSBzcGFjZSwgZmlsZSBhbmQKK3RyZWUgbmFtZXMgYXJlIHBvb2xlZCBpbiBhIGNvbW1vbiBzdHJpbmcgdGFibGUsIGFsbG93aW5nIHRoZSBmaWxlbmFtZQorYGBNYWtlZmlsZScnIHRvIHVzZSBqdXN0IDE2IGJ5dGVzIChhZnRlciBpbmNsdWRpbmcgdGhlIHN0cmluZyBoZWFkZXIKK292ZXJoZWFkKSBubyBtYXR0ZXIgaG93IG1hbnkgdGltZXMgaXQgb2NjdXJzIHdpdGhpbiB0aGUgcHJvamVjdC4KKworVGhlIGFjdGl2ZSBicmFuY2ggTFJVLCB3aGVuIGNvdXBsZWQgd2l0aCB0aGUgZmlsZW5hbWUgc3RyaW5nIHBvb2wKK2FuZCBsYXp5IGxvYWRpbmcgb2Ygc3VidHJlZXMsIGFsbG93cyBmYXN0LWltcG9ydCB0byBlZmZpY2llbnRseSBpbXBvcnQKK3Byb2plY3RzIHdpdGggMiwwMDArIGJyYW5jaGVzIGFuZCA0NSwxMTQrIGZpbGVzIGluIGEgdmVyeSBsaW1pdGVkCittZW1vcnkgZm9vdHByaW50IChsZXNzIHRoYW4gMi43IE1pQiBwZXIgYWN0aXZlIGJyYW5jaCkuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5YTViMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLXBhY2sudHh0CkBAIC0wLDAgKzEsOTYgQEAKK2dpdC1mZXRjaC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmV0Y2gtcGFjayAtIFJlY2VpdmUgbWlzc2luZyBvYmplY3RzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWZldGNoLXBhY2snIFstLWFsbF0gWy0tcXVpZXR8LXFdIFstLWtlZXB8LWtdIFstLXRoaW5dIFstLXVwbG9hZC1wYWNrPTxnaXQtdXBsb2FkLXBhY2s+XSBbLS1kZXB0aD08bj5dIFstLW5vLXByb2dyZXNzXSBbLXZdIFs8aG9zdD46XTxkaXJlY3Rvcnk+IFs8cmVmcz4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVXN1YWxseSB5b3Ugd291bGQgd2FudCB0byB1c2UgZ2l0bGluazpnaXQtZmV0Y2hbMV0gd2hpY2ggaXMgYQoraGlnaGVyIGxldmVsIHdyYXBwZXIgb2YgdGhpcyBjb21tYW5kIGluc3RlYWQuCisKK0ludm9rZXMgJ2dpdC11cGxvYWQtcGFjaycgb24gYSBwb3RlbnRpYWxseSByZW1vdGUgcmVwb3NpdG9yeSwKK2FuZCBhc2tzIGl0IHRvIHNlbmQgb2JqZWN0cyBtaXNzaW5nIGZyb20gdGhpcyByZXBvc2l0b3J5LCB0bwordXBkYXRlIHRoZSBuYW1lZCBoZWFkcy4gIFRoZSBsaXN0IG9mIGNvbW1pdHMgYXZhaWxhYmxlIGxvY2FsbHkKK2lzIGZvdW5kIG91dCBieSBzY2FubmluZyBsb2NhbCAkR0lUX0RJUi9yZWZzLyBhbmQgc2VudCB0bworJ2dpdC11cGxvYWQtcGFjaycgcnVubmluZyBvbiB0aGUgb3RoZXIgZW5kLgorCitUaGlzIGNvbW1hbmQgZGVnZW5lcmF0ZXMgdG8gZG93bmxvYWQgZXZlcnl0aGluZyB0byBjb21wbGV0ZSB0aGUKK2Fza2VkIHJlZnMgZnJvbSB0aGUgcmVtb3RlIHNpZGUgd2hlbiB0aGUgbG9jYWwgc2lkZSBkb2VzIG5vdAoraGF2ZSBhIGNvbW1vbiBhbmNlc3RvciBjb21taXQuCisKKworT1BUSU9OUworLS0tLS0tLQorXC0tYWxsOjoKKwlGZXRjaCBhbGwgcmVtb3RlIHJlZnMuCisKK1wtLXF1aWV0LCBcLXE6OgorCVBhc3MgJy1xJyBmbGFnIHRvICdnaXQtdW5wYWNrLW9iamVjdHMnOyB0aGlzIG1ha2VzIHRoZQorCWNsb25pbmcgcHJvY2VzcyBsZXNzIHZlcmJvc2UuCisKK1wtLWtlZXAsIFwtazo6CisJRG8gbm90IGludm9rZSAnZ2l0LXVucGFjay1vYmplY3RzJyBvbiByZWNlaXZlZCBkYXRhLCBidXQKKwljcmVhdGUgYSBzaW5nbGUgcGFja2ZpbGUgb3V0IG9mIGl0IGluc3RlYWQsIGFuZCBzdG9yZSBpdAorCWluIHRoZSBvYmplY3QgZGF0YWJhc2UuIElmIHByb3ZpZGVkIHR3aWNlIHRoZW4gdGhlIHBhY2sgaXMKKwlsb2NrZWQgYWdhaW5zdCByZXBhY2tpbmcuCisKK1wtLXRoaW46OgorCVNwZW5kIGV4dHJhIGN5Y2xlcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gYmUgc2VudC4KKwlVc2UgaXQgb24gc2xvd2VyIGNvbm5lY3Rpb24uCisKK1wtLXVwbG9hZC1wYWNrPTxnaXQtdXBsb2FkLXBhY2s+OjoKKwlVc2UgdGhpcyB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvICdnaXQtdXBsb2FkLXBhY2snIG9uIHRoZQorCXJlbW90ZSBzaWRlLCBpZiBpcyBub3QgZm91bmQgb24geW91ciAkUEFUSC4KKwlJbnN0YWxsYXRpb25zIG9mIHNzaGQgaWdub3JlcyB0aGUgdXNlcidzIGVudmlyb25tZW50CisJc2V0dXAgc2NyaXB0cyBmb3IgbG9naW4gc2hlbGxzIChlLmcuIC5iYXNoX3Byb2ZpbGUpIGFuZAorCXlvdXIgcHJpdmF0ZWx5IGluc3RhbGxlZCBnaXQgbWF5IG5vdCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtCisJZGVmYXVsdCAkUEFUSC4gIEFub3RoZXIgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgaXMgdG8gc2V0CisJdXAgeW91ciAkUEFUSCBpbiAiLmJhc2hyYyIsIGJ1dCB0aGlzIGZsYWcgaXMgZm9yIHBlb3BsZQorCXdobyBkbyBub3Qgd2FudCB0byBwYXkgdGhlIG92ZXJoZWFkIGZvciBub24taW50ZXJhY3RpdmUKKwlzaGVsbHMgYnkgaGF2aW5nIGEgbGVhbiAuYmFzaHJjIGZpbGUgKHRoZXkgc2V0IG1vc3Qgb2YKKwl0aGUgdGhpbmdzIHVwIGluIC5iYXNoX3Byb2ZpbGUpLgorCitcLS1leGVjPTxnaXQtdXBsb2FkLXBhY2s+OjoKKwlTYW1lIGFzIFwtLXVwbG9hZC1wYWNrPTxnaXQtdXBsb2FkLXBhY2s+LgorCitcLS1kZXB0aD08bj46OgorCUxpbWl0IGZldGNoaW5nIHRvIGFuY2VzdG9yLWNoYWlucyBub3QgbG9uZ2VyIHRoYW4gbi4KKworXC0tbm8tcHJvZ3Jlc3M6OgorCURvIG5vdCBzaG93IHRoZSBwcm9ncmVzcy4KKworXC12OjoKKwlSdW4gdmVyYm9zZWx5LgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdGhhdCBob3VzZXMgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC11cGxvYWQtcGFjaycgaXMgaW52b2tlZCB2aWEKKwlzc2guCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGZyb20uCisKKzxyZWZzPi4uLjo6CisJVGhlIHJlbW90ZSBoZWFkcyB0byB1cGRhdGUgZnJvbS4gVGhpcyBpcyByZWxhdGl2ZSB0bworCSRHSVRfRElSIChlLmcuICJIRUFEIiwgInJlZnMvaGVhZHMvbWFzdGVyIikuICBXaGVuCisJdW5zcGVjaWZpZWQsIHVwZGF0ZSBmcm9tIGFsbCBoZWFkcyB0aGUgcmVtb3RlIHNpZGUgaGFzLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYmVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQKQEAgLTAsMCArMSw1NiBAQAorZ2l0LWZldGNoKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZldGNoIC0gRG93bmxvYWQgb2JqZWN0cyBhbmQgcmVmcyBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1mZXRjaCcgPG9wdGlvbnM+IDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ZldGNoZXMgbmFtZWQgaGVhZHMgb3IgdGFncyBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeSwgYWxvbmcgd2l0aAordGhlIG9iamVjdHMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZW0uCisKK1RoZSByZWYgbmFtZXMgYW5kIHRoZWlyIG9iamVjdCBuYW1lcyBvZiBmZXRjaGVkIHJlZnMgYXJlIHN0b3JlZAoraW4gYC5naXQvRkVUQ0hfSEVBRGAuICBUaGlzIGluZm9ybWF0aW9uIGlzIGxlZnQgZm9yIGEgbGF0ZXIgbWVyZ2UKK29wZXJhdGlvbiBkb25lIGJ5ICJnaXQgbWVyZ2UiLgorCitXaGVuIDxyZWZzcGVjPiBzdG9yZXMgdGhlIGZldGNoZWQgcmVzdWx0IGluIHRyYWNraW5nIGJyYW5jaGVzLAordGhlIHRhZ3MgdGhhdCBwb2ludCBhdCB0aGVzZSBicmFuY2hlcyBhcmUgYXV0b21hdGljYWxseQorZm9sbG93ZWQuICBUaGlzIGlzIGRvbmUgYnkgZmlyc3QgZmV0Y2hpbmcgZnJvbSB0aGUgcmVtb3RlIHVzaW5nCit0aGUgZ2l2ZW4gPHJlZnNwZWM+cywgYW5kIGlmIHRoZSByZXBvc2l0b3J5IGhhcyBvYmplY3RzIHRoYXQgYXJlCitwb2ludGVkIGJ5IHJlbW90ZSB0YWdzIHRoYXQgaXQgZG9lcyBub3QgeWV0IGhhdmUsIHRoZW4gZmV0Y2gKK3Rob3NlIG1pc3NpbmcgdGFncy4gIElmIHRoZSBvdGhlciBlbmQgaGFzIHRhZ3MgdGhhdCBwb2ludCBhdAorYnJhbmNoZXMgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiwgeW91IHdpbGwgbm90IGdldCB0aGVtLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmZldGNoLW9wdGlvbnMudHh0W10KKworaW5jbHVkZTo6cHVsbC1mZXRjaC1wYXJhbS50eHRbXQorCitpbmNsdWRlOjp1cmxzLnR4dFtdCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtcHVsbFsxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZm10LW1lcmdlLW1zZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mbXQtbWVyZ2UtbXNnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTEzYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZm10LW1lcmdlLW1zZy50eHQKQEAgLTAsMCArMSw2MyBAQAorZ2l0LWZtdC1tZXJnZS1tc2coMSkKKz09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mbXQtbWVyZ2UtbXNnIC0gUHJvZHVjZSBhIG1lcmdlIGNvbW1pdCBtZXNzYWdlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCitnaXQtZm10LW1lcmdlLW1zZyBbLS1zdW1tYXJ5IHwgLS1uby1zdW1tYXJ5XSA8JEdJVF9ESVIvRkVUQ0hfSEVBRAorZ2l0LWZtdC1tZXJnZS1tc2cgWy0tc3VtbWFyeSB8IC0tbm8tc3VtbXJheV0gLUYgPGZpbGU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIGxpc3Qgb2YgbWVyZ2VkIG9iamVjdHMgb24gc3RkaW4gYW5kIHByb2R1Y2VzIGEgc3VpdGFibGUKK2NvbW1pdCBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIHRoZSBtZXJnZSBjb21taXQsIHVzdWFsbHkgdG8gYmUKK3Bhc3NlZCBhcyB0aGUgJzxtZXJnZS1tZXNzYWdlPicgYXJndW1lbnQgb2YgYGdpdC1tZXJnZWAuCisKK1RoaXMgc2NyaXB0IGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHNjcmlwdHMKK2F1dG9tYXRpY2FsbHkgaW52b2tpbmcgYGdpdC1tZXJnZWAuCisKK09QVElPTlMKKy0tLS0tLS0KKworLS1zdW1tYXJ5OjoKKwlJbiBhZGRpdGlvbiB0byBicmFuY2ggbmFtZXMsIHBvcHVsYXRlIHRoZSBsb2cgbWVzc2FnZSB3aXRoCisJb25lLWxpbmUgZGVzY3JpcHRpb25zIGZyb20gdGhlIGFjdHVhbCBjb21taXRzIHRoYXQgYXJlIGJlaW5nCisJbWVyZ2VkLgorCistLW5vLXN1bW1hcnk6OgorCURvIG5vdCBsaXN0IG9uZS1saW5lIGRlc2NyaXB0aW9ucyBmcm9tIHRoZSBhY3R1YWwgY29tbWl0cyBiZWluZworCW1lcmdlZC4KKworLS1maWxlIDxmaWxlPiwgLUYgPGZpbGU+OjoKKwlUYWtlIHRoZSBsaXN0IG9mIG1lcmdlZCBvYmplY3RzIGZyb20gPGZpbGU+IGluc3RlYWQgb2YKKwlzdGRpbi4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCittZXJnZS5zdW1tYXJ5OjoKKwlXaGV0aGVyIHRvIGluY2x1ZGUgc3VtbWFyaWVzIG9mIG1lcmdlZCBjb21taXRzIGluIG5ld2x5CisJbWVyZ2UgY29tbWl0IG1lc3NhZ2VzLiBGYWxzZSBieSBkZWZhdWx0LgorCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LW1lcmdlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBQZXRyIEJhdWRpcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mb3ItZWFjaC1yZWYudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZm9yLWVhY2gtcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY4ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZm9yLWVhY2gtcmVmLnR4dApAQCAtMCwwICsxLDE4OCBAQAorZ2l0LWZvci1lYWNoLXJlZigxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZm9yLWVhY2gtcmVmIC0gT3V0cHV0IGluZm9ybWF0aW9uIG9uIGVhY2ggcmVmCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1mb3ItZWFjaC1yZWYnIFstLWNvdW50PTxjb3VudD5dXCoKKyAgICAgICAgICAgICAgICAgICBbLS1zaGVsbHwtLXBlcmx8LS1weXRob258LS10Y2xdCisgICAgICAgICAgICAgICAgICAgWy0tc29ydD08a2V5Pl1cKiBbLS1mb3JtYXQ9PGZvcm1hdD5dIFs8cGF0dGVybj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitJdGVyYXRlIG92ZXIgYWxsIHJlZnMgdGhhdCBtYXRjaCBgPHBhdHRlcm4+YCBhbmQgc2hvdyB0aGVtCithY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGA8Zm9ybWF0PmAsIGFmdGVyIHNvcnRpbmcgdGhlbSBhY2NvcmRpbmcKK3RvIHRoZSBnaXZlbiBzZXQgb2YgYDxrZXk+YC4gIElmIGA8bWF4PmAgaXMgZ2l2ZW4sIHN0b3AgYWZ0ZXIKK3Nob3dpbmcgdGhhdCBtYW55IHJlZnMuICBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBgPGZvcm1hdD5gCitjYW4gb3B0aW9uYWxseSBiZSBxdW90ZWQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIHRoZSBzcGVjaWZpZWQKK2hvc3QgbGFuZ3VhZ2UgYWxsb3dpbmcgdGhlaXIgZGlyZWN0IGV2YWx1YXRpb24gaW4gdGhhdCBsYW5ndWFnZS4KKworT1BUSU9OUworLS0tLS0tLQorPGNvdW50Pjo6CisJQnkgZGVmYXVsdCB0aGUgY29tbWFuZCBzaG93cyBhbGwgcmVmcyB0aGF0IG1hdGNoCisJYDxwYXR0ZXJuPmAuICBUaGlzIG9wdGlvbiBtYWtlcyBpdCBzdG9wIGFmdGVyIHNob3dpbmcKKwl0aGF0IG1hbnkgcmVmcy4KKworPGtleT46OgorCUEgZmllbGQgbmFtZSB0byBzb3J0IG9uLiAgUHJlZml4IGAtYCB0byBzb3J0IGluCisJZGVzY2VuZGluZyBvcmRlciBvZiB0aGUgdmFsdWUuICBXaGVuIHVuc3BlY2lmaWVkLAorCWByZWZuYW1lYCBpcyB1c2VkLiAgTW9yZSB0aGFuIG9uZSBzb3J0IGtleXMgY2FuIGJlCisJZ2l2ZW4uCisKKzxmb3JtYXQ+OjoKKwlBIHN0cmluZyB0aGF0IGludGVycG9sYXRlcyBgJShmaWVsZG5hbWUpYCBmcm9tIHRoZQorCW9iamVjdCBwb2ludGVkIGF0IGJ5IGEgcmVmIGJlaW5nIHNob3duLiAgSWYgYGZpZWxkbmFtZWAKKwlpcyBwcmVmaXhlZCB3aXRoIGFuIGFzdGVyaXNrIChgKmApIGFuZCB0aGUgcmVmIHBvaW50cworCWF0IGEgdGFnIG9iamVjdCwgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQgaW4gdGhlIG9iamVjdAorCXRhZyByZWZlcnMgaXMgdXNlZC4gIFdoZW4gdW5zcGVjaWZpZWQsIGRlZmF1bHRzIHRvCisJYCUob2JqZWN0bmFtZSkgU1BDICUob2JqZWN0dHlwZSkgVEFCICUocmVmbmFtZSlgLgorCUl0IGFsc28gaW50ZXJwb2xhdGVzIGAlJWAgdG8gYCVgLCBhbmQgYCV4eGAgd2hlcmUgYHh4YAorCWFyZSBoZXggZGlnaXRzIGludGVycG9sYXRlcyB0byBjaGFyYWN0ZXIgd2l0aCBoZXggY29kZQorCWB4eGA7IGZvciBleGFtcGxlIGAlMDBgIGludGVycG9sYXRlcyB0byBgXDBgIChOVUwpLAorCWAlMDlgIHRvIGBcdGAgKFRBQikgYW5kIGAlMGFgIHRvIGBcbmAgKExGKS4KKworPHBhdHRlcm4+OjoKKwlJZiBnaXZlbiwgdGhlIG5hbWUgb2YgdGhlIHJlZiBpcyBtYXRjaGVkIGFnYWluc3QgdGhpcworCXVzaW5nIGZubWF0Y2goMykuICBSZWZzIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBwYXR0ZXJuCisJYXJlIG5vdCBzaG93bi4KKworLS1zaGVsbCwgLS1wZXJsLCAtLXB5dGhvbiwgLS10Y2w6OgorCUlmIGdpdmVuLCBzdHJpbmdzIHRoYXQgc3Vic3RpdHV0ZSBgJShmaWVsZG5hbWUpYAorCXBsYWNlaG9sZGVycyBhcmUgcXVvdGVkIGFzIHN0cmluZyBsaXRlcmFscyBzdWl0YWJsZSBmb3IKKwl0aGUgc3BlY2lmaWVkIGhvc3QgbGFuZ3VhZ2UuICBUaGlzIGlzIG1lYW50IHRvIHByb2R1Y2UKKwlhIHNjcmlwdGxldCB0aGF0IGNhbiBkaXJlY3RseSBiZSBgZXZhbGBlZC4KKworCitGSUVMRCBOQU1FUworLS0tLS0tLS0tLS0KKworVmFyaW91cyB2YWx1ZXMgZnJvbSBzdHJ1Y3R1cmVkIGZpZWxkcyBpbiByZWZlcmVuY2VkIG9iamVjdHMgY2FuCitiZSB1c2VkIHRvIGludGVycG9sYXRlIGludG8gdGhlIHJlc3VsdGluZyBvdXRwdXQsIG9yIGFzIHNvcnQKK2tleXMuCisKK0ZvciBhbGwgb2JqZWN0cywgdGhlIGZvbGxvd2luZyBuYW1lcyBjYW4gYmUgdXNlZDoKKworcmVmbmFtZTo6CisJVGhlIG5hbWUgb2YgdGhlIHJlZiAodGhlIHBhcnQgYWZ0ZXIgJEdJVF9ESVIvKS4KKworb2JqZWN0dHlwZTo6CisJVGhlIHR5cGUgb2YgdGhlIG9iamVjdCAoYGJsb2JgLCBgdHJlZWAsIGBjb21taXRgLCBgdGFnYCkuCisKK29iamVjdHNpemU6OgorCVRoZSBzaXplIG9mIHRoZSBvYmplY3QgKHRoZSBzYW1lIGFzIGBnaXQtY2F0LWZpbGUgLXNgIHJlcG9ydHMpLgorCitvYmplY3RuYW1lOjoKKwlUaGUgb2JqZWN0IG5hbWUgKGFrYSBTSEEtMSkuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgZm9yIGNvbW1pdCBhbmQgdGFnIG9iamVjdHMsIHRoZSBoZWFkZXIKK2ZpZWxkIG5hbWVzIChgdHJlZWAsIGBwYXJlbnRgLCBgb2JqZWN0YCwgYHR5cGVgLCBhbmQgYHRhZ2ApIGNhbgorYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB2YWx1ZSBpbiB0aGUgaGVhZGVyIGZpZWxkLgorCitGaWVsZHMgdGhhdCBoYXZlIG5hbWUtZW1haWwtZGF0ZSB0dXBsZSBhcyBpdHMgdmFsdWUgKGBhdXRob3JgLAorYGNvbW1pdHRlcmAsIGFuZCBgdGFnZ2VyYCkgY2FuIGJlIHN1ZmZpeGVkIHdpdGggYG5hbWVgLCBgZW1haWxgLAorYW5kIGBkYXRlYCB0byBleHRyYWN0IHRoZSBuYW1lZCBjb21wb25lbnQuCisKK1RoZSBmaXJzdCBsaW5lIG9mIHRoZSBtZXNzYWdlIGluIGEgY29tbWl0IGFuZCB0YWcgb2JqZWN0IGlzCitgc3ViamVjdGAsIHRoZSByZW1haW5pbmcgbGluZXMgYXJlIGBib2R5YC4gIFRoZSB3aG9sZSBtZXNzYWdlCitpcyBgY29udGVudHNgLgorCitGb3Igc29ydGluZyBwdXJwb3NlcywgZmllbGRzIHdpdGggbnVtZXJpYyB2YWx1ZXMgc29ydCBpbiBudW1lcmljCitvcmRlciAoYG9iamVjdHNpemVgLCBgYXV0aG9yZGF0ZWAsIGBjb21taXR0ZXJkYXRlYCwgYHRhZ2dlcmRhdGVgKS4KK0FsbCBvdGhlciBmaWVsZHMgYXJlIHVzZWQgdG8gc29ydCBpbiB0aGVpciBieXRlLXZhbHVlIG9yZGVyLgorCitJbiBhbnkgY2FzZSwgYSBmaWVsZCBuYW1lIHRoYXQgcmVmZXJzIHRvIGEgZmllbGQgaW5hcHBsaWNhYmxlIHRvCit0aGUgb2JqZWN0IHJlZmVycmVkIGJ5IHRoZSByZWYgZG9lcyBub3QgY2F1c2UgYW4gZXJyb3IuICBJdAorcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZC4KKworCitFWEFNUExFUworLS0tLS0tLS0KKworQW4gZXhhbXBsZSBkaXJlY3RseSBwcm9kdWNpbmcgZm9ybWF0dGVkIHRleHQuICBTaG93IHRoZSBtb3N0IHJlY2VudAorMyB0YWdnZWQgY29tbWl0czo6CisKKy0tLS0tLS0tLS0tLQorIyEvYmluL3NoCisKK2dpdC1mb3ItZWFjaC1yZWYgLS1jb3VudD0zIC0tc29ydD0nLSphdXRob3JkYXRlJyBcCistLWZvcm1hdD0nRnJvbTogJSgqYXV0aG9ybmFtZSkgJSgqYXV0aG9yZW1haWwpCitTdWJqZWN0OiAlKCpzdWJqZWN0KQorRGF0ZTogJSgqYXV0aG9yZGF0ZSkKK1JlZjogJSgqcmVmbmFtZSkKKworJSgqYm9keSkKKycgJ3JlZnMvdGFncycKKy0tLS0tLS0tLS0tLQorCisKK0Egc2ltcGxlIGV4YW1wbGUgc2hvd2luZyB0aGUgdXNlIG9mIHNoZWxsIGV2YWwgb24gdGhlIG91dHB1dCwKK2RlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiAtLXNoZWxsLiAgTGlzdCB0aGUgcHJlZml4ZXMgb2YgYWxsIGhlYWRzOjoKKy0tLS0tLS0tLS0tLQorIyEvYmluL3NoCisKK2dpdC1mb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0icmVmPSUocmVmbmFtZSkiIHJlZnMvaGVhZHMgfCBcCit3aGlsZSByZWFkIGVudHJ5CitkbworCWV2YWwgIiRlbnRyeSIKKwllY2hvIGBkaXJuYW1lICRyZWZgCitkb25lCistLS0tLS0tLS0tLS0KKworCitBIGJpdCBtb3JlIGVsYWJvcmF0ZSByZXBvcnQgb24gdGFncywgZGVtb25zdHJhdGluZyB0aGF0IHRoZSBmb3JtYXQKK21heSBiZSBhbiBlbnRpcmUgc2NyaXB0OjoKKy0tLS0tLS0tLS0tLQorIyEvYmluL3NoCisKK2ZtdD0nCisJcj0lKHJlZm5hbWUpCisJdD0lKCpvYmplY3R0eXBlKQorCVQ9JHtyI3JlZnMvdGFncy99CisKKwlvPSUoKm9iamVjdG5hbWUpCisJbj0lKCphdXRob3JuYW1lKQorCWU9JSgqYXV0aG9yZW1haWwpCisJcz0lKCpzdWJqZWN0KQorCWQ9JSgqYXV0aG9yZGF0ZSkKKwliPSUoKmJvZHkpCisKKwlraW5kPVRhZworCWlmIHRlc3QgInokdCIgPSB6CisJdGhlbgorCQkjIGNvdWxkIGJlIGEgbGlnaHR3ZWlnaHQgdGFnCisJCXQ9JShvYmplY3R0eXBlKQorCQlraW5kPSJMaWdodHdlaWdodCB0YWciCisJCW89JShvYmplY3RuYW1lKQorCQluPSUoYXV0aG9ybmFtZSkKKwkJZT0lKGF1dGhvcmVtYWlsKQorCQlzPSUoc3ViamVjdCkKKwkJZD0lKGF1dGhvcmRhdGUpCisJCWI9JShib2R5KQorCWZpCisJZWNobyAiJGtpbmQgJFQgcG9pbnRzIGF0IGEgJHQgb2JqZWN0ICRvIgorCWlmIHRlc3QgInokdCIgPSB6Y29tbWl0CisJdGhlbgorCQllY2hvICJUaGUgY29tbWl0IHdhcyBhdXRob3JlZCBieSAkbiAkZQorYXQgJGQsIGFuZCB0aXRsZWQKKworICAgICRzCisKK0l0cyBtZXNzYWdlIHJlYWRzIGFzOgorIgorCQllY2hvICIkYiIgfCBzZWQgLWUgInMvXi8gICAgLyIKKwkJZWNobworCWZpCisnCisKK2V2YWw9YGdpdC1mb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJGZtdCIgXAorCS0tc29ydD0nKm9iamVjdHR5cGUnIFwKKwktLXNvcnQ9LXRhZ2dlcmRhdGUgXAorCXJlZnMvdGFnc2AKK2V2YWwgIiRldmFsIgorLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZm9ybWF0LXBhdGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E1OGE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZm9ybWF0LXBhdGNoLnR4dApAQCAtMCwwICsxLDE3NiBAQAorZ2l0LWZvcm1hdC1wYXRjaCgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZm9ybWF0LXBhdGNoIC0gUHJlcGFyZSBwYXRjaGVzIGZvciBlLW1haWwgc3VibWlzc2lvbgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1mb3JtYXQtcGF0Y2gnIFstbiB8IC1rXSBbLW8gPGRpcj4gfCAtLXN0ZG91dF0gWy0tdGhyZWFkXQorICAgICAgICAgICAgICAgICAgIFstLWF0dGFjaFs9PGJvdW5kYXJ5Pl0gfCAtLWlubGluZVs9PGJvdW5kYXJ5Pl1dCisgICAgICAgICAgICAgICAgICAgWy1zIHwgLS1zaWdub2ZmXSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSBbLS1zdGFydC1udW1iZXIgPG4+XQorICAgICAgICAgICAgICAgICAgIFstLWluLXJlcGx5LXRvPU1lc3NhZ2UtSWRdIFstLXN1ZmZpeD0uPHNmeD5dCisgICAgICAgICAgICAgICAgICAgWy0taWdub3JlLWlmLWluLXVwc3RyZWFtXQorICAgICAgICAgICAgICAgICAgIFstLXN1YmplY3QtcHJlZml4PVN1YmplY3QtUHJlZml4XQorICAgICAgICAgICAgICAgICAgIDxzaW5jZT5bLi48dW50aWw+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworUHJlcGFyZSBlYWNoIGNvbW1pdCBiZXR3ZWVuIDxzaW5jZT4gYW5kIDx1bnRpbD4gd2l0aCBpdHMgcGF0Y2ggaW4KK29uZSBmaWxlIHBlciBjb21taXQsIGZvcm1hdHRlZCB0byByZXNlbWJsZSBVTklYIG1haWxib3ggZm9ybWF0LgorSWYgLi48dW50aWw+IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcKK3RyZWUgaXMgaW1wbGllZC4gIEZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsCis8c2luY2U+IGFuZCA8dW50aWw+LCBzZWUgIlNQRUNJRllJTkcgUkVWSVNJT05TIiBzZWN0aW9uIGluCitnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0uCisKK1RoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIGlzIGNvbnZlbmllbnQgZm9yIGUtbWFpbCBzdWJtaXNzaW9uIG9yCitmb3IgdXNlIHdpdGggZ2l0bGluazpnaXQtYW1bMV0uCisKK0VhY2ggb3V0cHV0IGZpbGUgaXMgbnVtYmVyZWQgc2VxdWVudGlhbGx5IGZyb20gMSwgYW5kIHVzZXMgdGhlCitmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSAobWFzc2FnZWQgZm9yIHBhdGhuYW1lIHNhZmV0eSkgYXMKK3RoZSBmaWxlbmFtZS4gVGhlIG5hbWVzIG9mIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHByaW50ZWQgdG8gc3RhbmRhcmQKK291dHB1dCwgdW5sZXNzIHRoZSAtLXN0ZG91dCBvcHRpb24gaXMgc3BlY2lmaWVkLgorCitJZiAtbyBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyBhcmUgY3JlYXRlZCBpbiA8ZGlyPi4gIE90aGVyd2lzZQordGhleSBhcmUgY3JlYXRlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworSWYgLW4gaXMgc3BlY2lmaWVkLCBpbnN0ZWFkIG9mICJbUEFUQ0hdIFN1YmplY3QiLCB0aGUgZmlyc3QgbGluZQoraXMgZm9ybWF0dGVkIGFzICJbUEFUQ0ggbi9tXSBTdWJqZWN0Ii4KKworSWYgZ2l2ZW4gLS10aHJlYWQsIGdpdC1mb3JtYXQtcGF0Y2ggd2lsbCBnZW5lcmF0ZSBJbi1SZXBseS1UbyBhbmQKK1JlZmVyZW5jZXMgaGVhZGVycyB0byBtYWtlIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcGF0Y2ggbWFpbHMgYXBwZWFyCithcyByZXBsaWVzIHRvIHRoZSBmaXJzdCBtYWlsOyB0aGlzIGFsc28gZ2VuZXJhdGVzIGEgTWVzc2FnZS1JZCBoZWFkZXIgdG8KK3JlZmVyZW5jZS4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1vcHRpb25zLnR4dFtdCisKKy08bj46OgorCUxpbWl0cyB0aGUgbnVtYmVyIG9mIHBhdGNoZXMgdG8gcHJlcGFyZS4KKworLW98LS1vdXRwdXQtZGlyZWN0b3J5IDxkaXI+OjoKKwlVc2UgPGRpcj4gdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBmaWxlcywgaW5zdGVhZCBvZiB0aGUKKwljdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCistbnwtLW51bWJlcmVkOjoKKwlOYW1lIG91dHB1dCBpbiAnW1BBVENIIG4vbV0nIGZvcm1hdC4KKworLS1zdGFydC1udW1iZXIgPG4+OjoKKwlTdGFydCBudW1iZXJpbmcgdGhlIHBhdGNoZXMgYXQgPG4+IGluc3RlYWQgb2YgMS4KKworLWt8LS1rZWVwLXN1YmplY3Q6OgorCURvIG5vdCBzdHJpcC9hZGQgJ1tQQVRDSF0nIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisJY29tbWl0IGxvZyBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBgU2lnbmVkLW9mZi1ieTpgIGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLCB1c2luZworCXRoZSBjb21taXR0ZXIgaWRlbnRpdHkgb2YgeW91cnNlbGYuCisKKy0tc3Rkb3V0OjoKKwlQcmludCBhbGwgY29tbWl0cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGluIG1ib3ggZm9ybWF0LAorCWluc3RlYWQgb2YgY3JlYXRpbmcgYSBmaWxlIGZvciBlYWNoIG9uZS4KKworLS1hdHRhY2hbPTxib3VuZGFyeT5dOjoKKwlDcmVhdGUgbXVsdGlwYXJ0L21peGVkIGF0dGFjaG1lbnQsIHRoZSBmaXJzdCBwYXJ0IG9mCisJd2hpY2ggaXMgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGUgcGF0Y2ggaXRzZWxmIGluIHRoZQorCXNlY29uZCBwYXJ0LCB3aXRoICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ii4KKworLS1pbmxpbmVbPTxib3VuZGFyeT5dOjoKKwlDcmVhdGUgbXVsdGlwYXJ0L21peGVkIGF0dGFjaG1lbnQsIHRoZSBmaXJzdCBwYXJ0IG9mCisJd2hpY2ggaXMgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGUgcGF0Y2ggaXRzZWxmIGluIHRoZQorCXNlY29uZCBwYXJ0LCB3aXRoICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUiLgorCistLXRocmVhZDo6CisJQWRkIEluLVJlcGx5LVRvIGFuZCBSZWZlcmVuY2VzIGhlYWRlcnMgdG8gbWFrZSB0aGUgc2Vjb25kIGFuZAorCXN1YnNlcXVlbnQgbWFpbHMgYXBwZWFyIGFzIHJlcGxpZXMgdG8gdGhlIGZpcnN0LiAgQWxzbyBnZW5lcmF0ZXMKKwl0aGUgTWVzc2FnZS1JZCBoZWFkZXIgdG8gcmVmZXJlbmNlLgorCistLWluLXJlcGx5LXRvPU1lc3NhZ2UtSWQ6OgorCU1ha2UgdGhlIGZpcnN0IG1haWwgKG9yIGFsbCB0aGUgbWFpbHMgd2l0aCAtLW5vLXRocmVhZCkgYXBwZWFyIGFzIGEKKwlyZXBseSB0byB0aGUgZ2l2ZW4gTWVzc2FnZS1JZCwgd2hpY2ggYXZvaWRzIGJyZWFraW5nIHRocmVhZHMgdG8KKwlwcm92aWRlIGEgbmV3IHBhdGNoIHNlcmllcy4KKworLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW06OgorCURvIG5vdCBpbmNsdWRlIGEgcGF0Y2ggdGhhdCBtYXRjaGVzIGEgY29tbWl0IGluCisJPHVudGlsPi4uPHNpbmNlPi4gIFRoaXMgd2lsbCBleGFtaW5lIGFsbCBwYXRjaGVzIHJlYWNoYWJsZQorCWZyb20gPHNpbmNlPiBidXQgbm90IGZyb20gPHVudGlsPiBhbmQgY29tcGFyZSB0aGVtIHdpdGggdGhlCisJcGF0Y2hlcyBiZWluZyBnZW5lcmF0ZWQsIGFuZCBhbnkgcGF0Y2ggdGhhdCBtYXRjaGVzIGlzCisJaWdub3JlZC4KKworLS1zdWJqZWN0LXByZWZpeD08U3ViamVjdC1QcmVmaXg+OjoKKwlJbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCAnW1BBVENIXScgcHJlZml4IGluIHRoZSBzdWJqZWN0CisJbGluZSwgaW5zdGVhZCB1c2UgJ1s8U3ViamVjdC1QcmVmaXg+XScuIFRoaXMKKwlhbGxvd3MgZm9yIHVzZWZ1bCBuYW1pbmcgb2YgYSBwYXRjaCBzZXJpZXMsIGFuZCBjYW4gYmUKKwljb21iaW5lZCB3aXRoIHRoZSAtLW51bWJlcmVkIG9wdGlvbi4KKworLS1zdWZmaXg9LjxzZng+OjoKKwlJbnN0ZWFkIG9mIHVzaW5nIGAucGF0Y2hgIGFzIHRoZSBzdWZmaXggZm9yIGdlbmVyYXRlZAorCWZpbGVuYW1lcywgdXNlIHNwZWNpZmVkIHN1ZmZpeC4gIEEgY29tbW9uIGFsdGVybmF0aXZlIGlzCisJYC0tc3VmZml4PS50eHRgLgorKworTm90ZSB0aGF0IHlvdSB3b3VsZCBuZWVkIHRvIGluY2x1ZGUgdGhlIGxlYWRpbmcgZG90IGAuYCBpZiB5b3UKK3dhbnQgYSBmaWxlbmFtZSBsaWtlIGAwMDAxLWRlc2NyaXB0aW9uLW9mLW15LWNoYW5nZS5wYXRjaGAsIGFuZAordGhlIGZpcnN0IGxldHRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgZG90LiAgTGVhdmluZyBpdCBlbXB0eSB3b3VsZAorbm90IGFkZCBhbnkgc3VmZml4LgorCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCitZb3UgY2FuIHNwZWNpZnkgZXh0cmEgbWFpbCBoZWFkZXIgbGluZXMgdG8gYmUgYWRkZWQgdG8gZWFjaAorbWVzc2FnZSBpbiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLiAgQWxzbyB5b3UgY2FuIHNwZWNpZnkKK3RoZSBkZWZhdWx0IHN1ZmZpeCBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbHQtaW4gb25lOgorCistLS0tLS0tLS0tLS0KK1tmb3JtYXRdCisgICAgICAgIGhlYWRlcnMgPSAiT3JnYW5pemF0aW9uOiBnaXQtZm9vXG4iCisgICAgICAgIHN1ZmZpeCA9IC50eHQKKy0tLS0tLS0tLS0tLQorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitnaXQtZm9ybWF0LXBhdGNoIC1rIC0tc3Rkb3V0IFIxLi5SMiB8IGdpdC1hbSAtMyAtazo6CisJRXh0cmFjdCBjb21taXRzIGJldHdlZW4gcmV2aXNpb25zIFIxIGFuZCBSMiwgYW5kIGFwcGx5CisJdGhlbSBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgYnJhbmNoIHVzaW5nIGBnaXQtYW1gIHRvCisJY2hlcnJ5LXBpY2sgdGhlbS4KKworZ2l0LWZvcm1hdC1wYXRjaCBvcmlnaW46OgorCUV4dHJhY3QgYWxsIGNvbW1pdHMgd2hpY2ggYXJlIGluIHRoZSBjdXJyZW50IGJyYW5jaCBidXQKKwlub3QgaW4gdGhlIG9yaWdpbiBicmFuY2guICBGb3IgZWFjaCBjb21taXQgYSBzZXBhcmF0ZSBmaWxlCisJaXMgY3JlYXRlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK2dpdC1mb3JtYXQtcGF0Y2ggLU0gLUIgb3JpZ2luOjoKKwlUaGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLiAgQWRkaXRpb25hbGx5LCBpdCBkZXRlY3RzCisJYW5kIGhhbmRsZXMgcmVuYW1lcyBhbmQgY29tcGxldGUgcmV3cml0ZXMgaW50ZWxsaWdlbnRseSB0bworCXByb2R1Y2UgYSByZW5hbWluZyBwYXRjaC4gIEEgcmVuYW1pbmcgcGF0Y2ggcmVkdWNlcyB0aGUKKwlhbW91bnQgb2YgdGV4dCBvdXRwdXQsIGFuZCBnZW5lcmFsbHkgbWFrZXMgaXQgZWFzaWVyIHRvCisJcmV2aWV3IGl0LiAgTm90ZSB0aGF0IHRoZSAicGF0Y2giIHByb2dyYW0gZG9lcyBub3QKKwl1bmRlcnN0YW5kIHJlbmFtaW5nIHBhdGNoZXMsIHNvIHVzZSBpdCBvbmx5IHdoZW4geW91IGtub3cKKwl0aGUgcmVjaXBpZW50IHVzZXMgZ2l0IHRvIGFwcGx5IHlvdXIgcGF0Y2guCisKK2dpdC1mb3JtYXQtcGF0Y2ggLTM6OgorCUV4dHJhY3QgdGhyZWUgdG9wbW9zdCBjb21taXRzIGZyb20gdGhlIGN1cnJlbnQgYnJhbmNoCisJYW5kIGZvcm1hdCB0aGVtIGFzIGUtbWFpbGFibGUgcGF0Y2hlcy4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1hbVsxXSwgZ2l0bGluazpnaXQtc2VuZC1lbWFpbFsxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLW9iamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZnNjay1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjEwNjFlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZnNjay1vYmplY3RzLnR4dApAQCAtMCwwICsxLDE3IEBACitnaXQtZnNjay1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mc2NrLW9iamVjdHMgLSBWZXJpZmllcyB0aGUgY29ubmVjdGl2aXR5IGFuZCB2YWxpZGl0eSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZnNjay1vYmplY3RzJyAuLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSBzeW5vbnltIGZvciBnaXRsaW5rOmdpdC1mc2NrWzFdLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQorZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNvbW1hbmQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWZzY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjhjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLnR4dApAQCAtMCwwICsxLDE0NSBAQAorZ2l0LWZzY2soMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mc2NrIC0gVmVyaWZpZXMgdGhlIGNvbm5lY3Rpdml0eSBhbmQgdmFsaWRpdHkgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGRhdGFiYXNlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWZzY2snIFstLXRhZ3NdIFstLXJvb3RdIFstLXVucmVhY2hhYmxlXSBbLS1jYWNoZV0gWy0tbm8tcmVmbG9nc10KKwkJIFstLWZ1bGxdIFstLXN0cmljdF0gWzxvYmplY3Q+Kl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitWZXJpZmllcyB0aGUgY29ubmVjdGl2aXR5IGFuZCB2YWxpZGl0eSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UuCisKK09QVElPTlMKKy0tLS0tLS0KKzxvYmplY3Q+OjoKKwlBbiBvYmplY3QgdG8gdHJlYXQgYXMgdGhlIGhlYWQgb2YgYW4gdW5yZWFjaGFiaWxpdHkgdHJhY2UuCisrCitJZiBubyBvYmplY3RzIGFyZSBnaXZlbiwgZ2l0LWZzY2sgZGVmYXVsdHMgdG8gdXNpbmcgdGhlCitpbmRleCBmaWxlIGFuZCBhbGwgU0hBMSByZWZlcmVuY2VzIGluIC5naXQvcmVmcy8qIGFzIGhlYWRzLgorCistLXVucmVhY2hhYmxlOjoKKwlQcmludCBvdXQgb2JqZWN0cyB0aGF0IGV4aXN0IGJ1dCB0aGF0IGFyZW4ndCByZWFkYWJsZSBmcm9tIGFueQorCW9mIHRoZSByZWZlcmVuY2Ugbm9kZXMuCisKKy0tcm9vdDo6CisJUmVwb3J0IHJvb3Qgbm9kZXMuCisKKy0tdGFnczo6CisJUmVwb3J0IHRhZ3MuCisKKy0tY2FjaGU6OgorCUNvbnNpZGVyIGFueSBvYmplY3QgcmVjb3JkZWQgaW4gdGhlIGluZGV4IGFsc28gYXMgYSBoZWFkIG5vZGUgZm9yCisJYW4gdW5yZWFjaGFiaWxpdHkgdHJhY2UuCisKKy0tbm8tcmVmbG9nczo6CisJRG8gbm90IGNvbnNpZGVyIGNvbW1pdHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBvbmx5IGJ5IGFuCisJZW50cnkgaW4gYSByZWZsb2cgdG8gYmUgcmVhY2hhYmxlLiAgVGhpcyBvcHRpb24gaXMgbWVhbnQKKwlvbmx5IHRvIHNlYXJjaCBmb3IgY29tbWl0cyB0aGF0IHVzZWQgdG8gYmUgaW4gYSByZWYsIGJ1dAorCW5vdyBhcmVuJ3QsIGJ1dCBhcmUgc3RpbGwgaW4gdGhhdCBjb3JyZXNwb25kaW5nIHJlZmxvZy4KKworLS1mdWxsOjoKKwlDaGVjayBub3QganVzdCBvYmplY3RzIGluIEdJVF9PQkpFQ1RfRElSRUNUT1JZCisJKCRHSVRfRElSL29iamVjdHMpLCBidXQgYWxzbyB0aGUgb25lcyBmb3VuZCBpbiBhbHRlcm5hdGUKKwlvYmplY3QgcG9vbHMgbGlzdGVkIGluIEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTCisJb3IgJEdJVF9ESVIvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMsCisJYW5kIGluIHBhY2tlZCBnaXQgYXJjaGl2ZXMgZm91bmQgaW4gJEdJVF9ESVIvb2JqZWN0cy9wYWNrCisJYW5kIGNvcnJlc3BvbmRpbmcgcGFjayBzdWJkaXJlY3RvcmllcyBpbiBhbHRlcm5hdGUKKwlvYmplY3QgcG9vbHMuCisKKy0tc3RyaWN0OjoKKwlFbmFibGUgbW9yZSBzdHJpY3QgY2hlY2tpbmcsIG5hbWVseSB0byBjYXRjaCBhIGZpbGUgbW9kZQorCXJlY29yZGVkIHdpdGggZyt3IGJpdCBzZXQsIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IG9sZGVyCisJdmVyc2lvbnMgb2YgZ2l0LiAgRXhpc3RpbmcgcmVwb3NpdG9yaWVzLCBpbmNsdWRpbmcgdGhlCisJTGludXgga2VybmVsLCBnaXQgaXRzZWxmLCBhbmQgc3BhcnNlIHJlcG9zaXRvcnkgaGF2ZSBvbGQKKwlvYmplY3RzIHRoYXQgdHJpZ2dlcnMgdGhpcyBjaGVjaywgYnV0IGl0IGlzIHJlY29tbWVuZGVkCisJdG8gY2hlY2sgbmV3IHByb2plY3RzIHdpdGggdGhpcyBmbGFnLgorCitJdCB0ZXN0cyBTSEExIGFuZCBnZW5lcmFsIG9iamVjdCBzYW5pdHksIGFuZCBpdCBkb2VzIGZ1bGwgdHJhY2tpbmcgb2YKK3RoZSByZXN1bHRpbmcgcmVhY2hhYmlsaXR5IGFuZCBldmVyeXRoaW5nIGVsc2UuIEl0IHByaW50cyBvdXQgYW55Citjb3JydXB0aW9uIGl0IGZpbmRzIChtaXNzaW5nIG9yIGJhZCBvYmplY3RzKSwgYW5kIGlmIHlvdSB1c2UgdGhlCisnLS11bnJlYWNoYWJsZScgZmxhZyBpdCB3aWxsIGFsc28gcHJpbnQgb3V0IG9iamVjdHMgdGhhdCBleGlzdCBidXQKK3RoYXQgYXJlbid0IHJlYWRhYmxlIGZyb20gYW55IG9mIHRoZSBzcGVjaWZpZWQgaGVhZCBub2Rlcy4KKworU28gZm9yIGV4YW1wbGUKKworCWdpdC1mc2NrIC0tdW5yZWFjaGFibGUgSEVBRCAkKGNhdCAuZ2l0L3JlZnMvaGVhZHMvKikKKword2lsbCBkbyBxdWl0ZSBhIF9sb3RfIG9mIHZlcmlmaWNhdGlvbiBvbiB0aGUgdHJlZS4gVGhlcmUgYXJlIGEgZmV3CitleHRyYSB2YWxpZGl0eSB0ZXN0cyB0byBiZSBhZGRlZCAobWFrZSBzdXJlIHRoYXQgdHJlZSBvYmplY3RzIGFyZQorc29ydGVkIHByb3Blcmx5IGV0YyksIGJ1dCBvbiB0aGUgd2hvbGUgaWYgImdpdC1mc2NrIiBpcyBoYXBweSwgeW91CitkbyBoYXZlIGEgdmFsaWQgdHJlZS4KKworQW55IGNvcnJ1cHQgb2JqZWN0cyB5b3Ugd2lsbCBoYXZlIHRvIGZpbmQgaW4gYmFja3VwcyBvciBvdGhlciBhcmNoaXZlcworKGkuZS4sIHlvdSBjYW4ganVzdCByZW1vdmUgdGhlbSBhbmQgZG8gYW4gInJzeW5jIiB3aXRoIHNvbWUgb3RoZXIgc2l0ZSBpbgordGhlIGhvcGVzIHRoYXQgc29tZWJvZHkgZWxzZSBoYXMgdGhlIG9iamVjdCB5b3UgaGF2ZSBjb3JydXB0ZWQpLgorCitPZiBjb3Vyc2UsICJ2YWxpZCB0cmVlIiBkb2Vzbid0IG1lYW4gdGhhdCBpdCB3YXNuJ3QgZ2VuZXJhdGVkIGJ5IHNvbWUKK2V2aWwgcGVyc29uLCBhbmQgdGhlIGVuZCByZXN1bHQgbWlnaHQgYmUgY3JhcC4gZ2l0IGlzIGEgcmV2aXNpb24KK3RyYWNraW5nIHN5c3RlbSwgbm90IGEgcXVhbGl0eSBhc3N1cmFuY2Ugc3lzdGVtIDspCisKK0V4dHJhY3RlZCBEaWFnbm9zdGljcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4cGVjdCBkYW5nbGluZyBjb21taXRzIC0gcG90ZW50aWFsIGhlYWRzIC0gZHVlIHRvIGxhY2sgb2YgaGVhZCBpbmZvcm1hdGlvbjo6CisJWW91IGhhdmVuJ3Qgc3BlY2lmaWVkIGFueSBub2RlcyBhcyBoZWFkcyBzbyBpdCB3b24ndCBiZQorCXBvc3NpYmxlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB1bi1wYXJlbnRlZCBjb21taXRzIGFuZAorCXJvb3Qgbm9kZXMuCisKK21pc3Npbmcgc2hhMSBkaXJlY3RvcnkgJzxkaXI+Jzo6CisJVGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBzaGExIG9iamVjdHMgaXMgbWlzc2luZy4KKwordW5yZWFjaGFibGUgPHR5cGU+IDxvYmplY3Q+OjoKKwlUaGUgPHR5cGU+IG9iamVjdCA8b2JqZWN0PiwgaXNuJ3QgYWN0dWFsbHkgcmVmZXJyZWQgdG8gZGlyZWN0bHkKKwlvciBpbmRpcmVjdGx5IGluIGFueSBvZiB0aGUgdHJlZXMgb3IgY29tbWl0cyBzZWVuLiBUaGlzIGNhbgorCW1lYW4gdGhhdCB0aGVyZSdzIGFub3RoZXIgcm9vdCBub2RlIHRoYXQgeW91J3JlIG5vdCBzcGVjaWZ5aW5nCisJb3IgdGhhdCB0aGUgdHJlZSBpcyBjb3JydXB0LiBJZiB5b3UgaGF2ZW4ndCBtaXNzZWQgYSByb290IG5vZGUKKwl0aGVuIHlvdSBtaWdodCBhcyB3ZWxsIGRlbGV0ZSB1bnJlYWNoYWJsZSBub2RlcyBzaW5jZSB0aGV5CisJY2FuJ3QgYmUgdXNlZC4KKworbWlzc2luZyA8dHlwZT4gPG9iamVjdD46OgorCVRoZSA8dHlwZT4gb2JqZWN0IDxvYmplY3Q+LCBpcyByZWZlcnJlZCB0byBidXQgaXNuJ3QgcHJlc2VudCBpbgorCXRoZSBkYXRhYmFzZS4KKworZGFuZ2xpbmcgPHR5cGU+IDxvYmplY3Q+OjoKKwlUaGUgPHR5cGU+IG9iamVjdCA8b2JqZWN0PiwgaXMgcHJlc2VudCBpbiB0aGUgZGF0YWJhc2UgYnV0IG5ldmVyCisJJ2RpcmVjdGx5JyB1c2VkLiBBIGRhbmdsaW5nIGNvbW1pdCBjb3VsZCBiZSBhIHJvb3Qgbm9kZS4KKword2FybmluZzogZ2l0LWZzY2s6IHRyZWUgPHRyZWU+IGhhcyBmdWxsIHBhdGhuYW1lcyBpbiBpdDo6CisJQW5kIGl0IHNob3VsZG4ndC4uLgorCitzaGExIG1pc21hdGNoIDxvYmplY3Q+OjoKKwlUaGUgZGF0YWJhc2UgaGFzIGFuIG9iamVjdCB3aG8ncyBzaGExIGRvZXNuJ3QgbWF0Y2ggdGhlCisJZGF0YWJhc2UgdmFsdWUuCisJVGhpcyBpbmRpY2F0ZXMgYSBzZXJpb3VzIGRhdGEgaW50ZWdyaXR5IHByb2JsZW0uCisKK0Vudmlyb25tZW50IFZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dJVF9PQkpFQ1RfRElSRUNUT1JZOjoKKwl1c2VkIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBkYXRhYmFzZSByb290ICh1c3VhbGx5ICRHSVRfRElSL29iamVjdHMpCisKK0dJVF9JTkRFWF9GSUxFOjoKKwl1c2VkIHRvIHNwZWNpZnkgdGhlIGluZGV4IGZpbGUgb2YgdGhlIGluZGV4CisKK0dJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTOjoKKwl1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBvYmplY3QgZGF0YWJhc2Ugcm9vdHMgKHVzdWFsbHkgdW5zZXQpCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1nYy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1nYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxNjU4NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWdjLnR4dApAQCAtMCwwICsxLDgzIEBACitnaXQtZ2MoMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZ2MgLSBDbGVhbnVwIHVubmVjZXNzYXJ5IGZpbGVzIGFuZCBvcHRpbWl6ZSB0aGUgbG9jYWwgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1nYycgWy0tcHJ1bmVdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyBhIG51bWJlciBvZiBob3VzZWtlZXBpbmcgdGFza3Mgd2l0aGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnksCitzdWNoIGFzIGNvbXByZXNzaW5nIGZpbGUgcmV2aXNpb25zICh0byByZWR1Y2UgZGlzayBzcGFjZSBhbmQgaW5jcmVhc2UKK3BlcmZvcm1hbmNlKSBhbmQgcmVtb3ZpbmcgdW5yZWFjaGFibGUgb2JqZWN0cyB3aGljaCBtYXkgaGF2ZSBiZWVuCitjcmVhdGVkIGZyb20gcHJpb3IgaW52b2NhdGlvbnMgb2YgZ2l0bGluazpnaXQtYWRkWzFdLgorCitVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBydW4gdGhpcyB0YXNrIG9uIGEgcmVndWxhciBiYXNpcyB3aXRoaW4KK2VhY2ggcmVwb3NpdG9yeSB0byBtYWludGFpbiBnb29kIGRpc2sgc3BhY2UgdXRpbGl6YXRpb24gYW5kIGdvb2QKK29wZXJhdGluZyBwZXJmb3JtYW5jZS4KKworT1BUSU9OUworLS0tLS0tLQorCistLXBydW5lOjoKKwlVc3VhbGx5IGBnaXQtZ2NgIHBhY2tzIHJlZnMsIGV4cGlyZXMgb2xkIHJlZmxvZyBlbnRyaWVzLAorCXBhY2tzIGxvb3NlIG9iamVjdHMsCisJYW5kIHJlbW92ZXMgb2xkICdyZXJlcmUnIHJlY29yZHMuICBSZW1vdmFsCisJb2YgdW5yZWZlcmVuY2VkIGxvb3NlIG9iamVjdHMgaXMgYW4gdW5zYWZlIG9wZXJhdGlvbgorCXdoaWxlIG90aGVyIGdpdCBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgc28gaXQgaXMgbm90CisJZG9uZSBieSBkZWZhdWx0LiAgUGFzcyB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBpdCwgYW5kIG9ubHkKKwl3aGVuIHlvdSBrbm93IG5vYm9keSBlbHNlIGlzIGNyZWF0aW5nIG5ldyBvYmplY3RzIGluIHRoZQorCXJlcG9zaXRvcnkgYXQgdGhlIHNhbWUgdGltZSAoZS5nLiBuZXZlciB1c2UgdGhpcyBvcHRpb24KKwlpbiBhIGNyb24gc2NyaXB0KS4KKworCitDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5yZWZsb2dFeHBpcmUnIGNhbiBiZQorc2V0IHRvIGluZGljYXRlIGhvdyBsb25nIGhpc3RvcmljYWwgZW50cmllcyB3aXRoaW4gZWFjaCBicmFuY2gncworcmVmbG9nIHNob3VsZCByZW1haW4gYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeS4gIFRoZSBzZXR0aW5nIGlzCitleHByZXNzZWQgYXMgYSBsZW5ndGggb2YgdGltZSwgZm9yIGV4YW1wbGUgJzkwIGRheXMnIG9yICczIG1vbnRocycuCitJdCBkZWZhdWx0cyB0byAnOTAgZGF5cycuCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5yZWZsb2dFeHBpcmVVbnJlYWNoYWJsZScKK2NhbiBiZSBzZXQgdG8gaW5kaWNhdGUgaG93IGxvbmcgaGlzdG9yaWNhbCByZWZsb2cgZW50cmllcyB3aGljaAorYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGJyYW5jaCBzaG91bGQgcmVtYWluIGF2YWlsYWJsZSBpbgordGhpcyByZXBvc2l0b3J5LiAgVGhlc2UgdHlwZXMgb2YgZW50cmllcyBhcmUgZ2VuZXJhbGx5IGNyZWF0ZWQgYXMKK2EgcmVzdWx0IG9mIHVzaW5nIGBnaXQgY29tbWl0IFwtLWFtZW5kYCBvciBgZ2l0IHJlYmFzZWAgYW5kIGFyZSB0aGUKK2NvbW1pdHMgcHJpb3IgdG8gdGhlIGFtZW5kIG9yIHJlYmFzZSBvY2N1cnJpbmcuICBTaW5jZSB0aGVzZSBjaGFuZ2VzCithcmUgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCBtb3N0IHVzZXJzIHdpbGwgd2FudCB0byBleHBpcmUKK3RoZW0gc29vbmVyLiAgVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gJzMwIGRheXMnLgorCitUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAnZ2MucmVyZXJlcmVzb2x2ZWQnIGluZGljYXRlcworaG93IGxvbmcgcmVjb3JkcyBvZiBjb25mbGljdGVkIG1lcmdlIHlvdSByZXNvbHZlZCBlYXJsaWVyIGFyZQora2VwdC4gIFRoaXMgZGVmYXVsdHMgdG8gNjAgZGF5cy4KKworVGhlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgJ2djLnJlcmVyZXVucmVzb2x2ZWQnIGluZGljYXRlcworaG93IGxvbmcgcmVjb3JkcyBvZiBjb25mbGljdGVkIG1lcmdlIHlvdSBoYXZlIG5vdCByZXNvbHZlZCBhcmUKK2tlcHQuICBUaGlzIGRlZmF1bHRzIHRvIDE1IGRheXMuCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5wYWNrcmVmcycgZGV0ZXJtaW5lcyBpZgorYGdpdCBnY2AgcnVucyBgZ2l0LXBhY2stcmVmc2AuICBXaXRob3V0IHRoZSBjb25maWd1cmF0aW9uLCBgZ2l0LXBhY2stcmVmc2AKK2lzIG5vdCBydW4gaW4gYmFyZSByZXBvc2l0b3JpZXMgYnkgZGVmYXVsdCwgdG8gYWxsb3cgb2xkZXIgZHVtYi10cmFuc3BvcnQKK2NsaWVudHMgZmV0Y2ggZnJvbSB0aGUgcmVwb3NpdG9yeSwgIGJ1dCB0aGlzIHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcHJ1bmVbMV0KK2dpdGxpbms6Z2l0LXJlZmxvZ1sxXQorZ2l0bGluazpnaXQtcmVwYWNrWzFdCitnaXRsaW5rOmdpdC1yZXJlcmVbMV0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWdldC10YXItY29tbWl0LWlkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWdldC10YXItY29tbWl0LWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODgwNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZ2V0LXRhci1jb21taXQtaWQudHh0CkBAIC0wLDAgKzEsMzcgQEAKK2dpdC1nZXQtdGFyLWNvbW1pdC1pZCgxKQorPT09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1nZXQtdGFyLWNvbW1pdC1pZCAtIEV4dHJhY3QgY29tbWl0IElEIGZyb20gYW4gYXJjaGl2ZSBjcmVhdGVkIHVzaW5nIGdpdC10YXItdHJlZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1nZXQtdGFyLWNvbW1pdC1pZCcgPCA8dGFyZmlsZT4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0FjdHMgYXMgYSBmaWx0ZXIsIGV4dHJhY3RpbmcgdGhlIGNvbW1pdCBJRCBzdG9yZWQgaW4gYXJjaGl2ZXMgY3JlYXRlZCBieQorZ2l0LXRhci10cmVlLiAgSXQgcmVhZHMgb25seSB0aGUgZmlyc3QgMTAyNCBieXRlcyBvZiBpbnB1dCwgdGh1cyBpdHMKK3J1bnRpbWUgaXMgbm90IGluZmx1ZW5jZWQgYnkgdGhlIHNpemUgb2YgPHRhcmZpbGU+IHZlcnkgbXVjaC4KKworSWYgbm8gY29tbWl0IElEIGlzIGZvdW5kLCBnaXQtZ2V0LXRhci1jb21taXQtaWQgcXVpZXRseSBleGlzdHMgd2l0aCBhCityZXR1cm4gY29kZSBvZiAxLiAgVGhpcyBjYW4gaGFwcGVuIGlmIDx0YXJmaWxlPiBoYWQgbm90IGJlZW4gY3JlYXRlZAordXNpbmcgZ2l0LXRhci10cmVlIG9yIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgZ2l0LXRhci10cmVlIGhhZCBiZWVuCithIHRyZWUgSUQgaW5zdGVhZCBvZiBhIGNvbW1pdCBJRCBvciB0YWcuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUmVuZSBTY2hhcmZlIDxyZW5lLnNjaGFyZmVAbHNyZmlyZS5hdGguY3g+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZ3JlcC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ncmVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE1ZGFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZ3JlcC50eHQKQEAgLTAsMCArMSwxNDcgQEAKK2dpdC1ncmVwKDEpCis9PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZ3JlcCAtIFByaW50IGxpbmVzIG1hdGNoaW5nIGEgcGF0dGVybgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1ncmVwJyBbLS1jYWNoZWRdCisJICAgWy1hIHwgLS10ZXh0XSBbLUldIFstaSB8IC0taWdub3JlLWNhc2VdIFstdyB8IC0td29yZC1yZWdleHBdCisJICAgWy12IHwgLS1pbnZlcnQtbWF0Y2hdIFstaHwtSF0gWy0tZnVsbC1uYW1lXQorCSAgIFstRSB8IC0tZXh0ZW5kZWQtcmVnZXhwXSBbLUcgfCAtLWJhc2ljLXJlZ2V4cF0KKwkgICBbLUYgfCAtLWZpeGVkLXN0cmluZ3NdIFstbl0KKwkgICBbLWwgfCAtLWZpbGVzLXdpdGgtbWF0Y2hlc10gWy1MIHwgLS1maWxlcy13aXRob3V0LW1hdGNoXQorCSAgIFstYyB8IC0tY291bnRdIFstLWFsbC1tYXRjaF0KKwkgICBbLUEgPHBvc3QtY29udGV4dD5dIFstQiA8cHJlLWNvbnRleHQ+XSBbLUMgPGNvbnRleHQ+XQorCSAgIFstZiA8ZmlsZT5dIFstZV0gPHBhdHRlcm4+CisJICAgWy0tYW5kfC0tb3J8LS1ub3R8KHwpfC1lIDxwYXR0ZXJuPi4uLl0gWzx0cmVlPi4uLl0KKwkgICBbLS1dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTG9vayBmb3Igc3BlY2lmaWVkIHBhdHRlcm5zIGluIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMsIGJsb2JzCityZWdpc3RlcmVkIGluIHRoZSBpbmRleCBmaWxlLCBvciBnaXZlbiB0cmVlIG9iamVjdHMuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1jYWNoZWQ6OgorCUluc3RlYWQgb2Ygc2VhcmNoaW5nIGluIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMsIGNoZWNrCisJdGhlIGJsb2JzIHJlZ2lzdGVyZWQgaW4gdGhlIGluZGV4IGZpbGUuCisKKy1hIHwgLS10ZXh0OjoKKwlQcm9jZXNzIGJpbmFyeSBmaWxlcyBhcyBpZiB0aGV5IHdlcmUgdGV4dC4KKworLWkgfCAtLWlnbm9yZS1jYXNlOjoKKwlJZ25vcmUgY2FzZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwYXR0ZXJucyBhbmQgdGhlCisJZmlsZXMuCisKKy1JOjoKKwlEb24ndCBtYXRjaCB0aGUgcGF0dGVybiBpbiBiaW5hcnkgZmlsZXMuCisKKy13IHwgLS13b3JkLXJlZ2V4cDo6CisJTWF0Y2ggdGhlIHBhdHRlcm4gb25seSBhdCB3b3JkIGJvdW5kYXJ5IChlaXRoZXIgYmVnaW4gYXQgdGhlCisJYmVnaW5uaW5nIG9mIGEgbGluZSwgb3IgcHJlY2VkZWQgYnkgYSBub24td29yZCBjaGFyYWN0ZXI7IGVuZCBhdAorCXRoZSBlbmQgb2YgYSBsaW5lIG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyKS4KKworLXYgfCAtLWludmVydC1tYXRjaDo6CisJU2VsZWN0IG5vbi1tYXRjaGluZyBsaW5lcy4KKworLWggfCAtSDo6CisJQnkgZGVmYXVsdCwgdGhlIGNvbW1hbmQgc2hvd3MgdGhlIGZpbGVuYW1lIGZvciBlYWNoCisJbWF0Y2guICBgLWhgIG9wdGlvbiBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMgb3V0cHV0LgorCWAtSGAgaXMgdGhlcmUgZm9yIGNvbXBsZXRlbmVzcyBhbmQgZG9lcyBub3QgZG8gYW55dGhpbmcKKwlleGNlcHQgaXQgb3ZlcnJpZGVzIGAtaGAgZ2l2ZW4gZWFybGllciBvbiB0aGUgY29tbWFuZAorCWxpbmUuCisKKy0tZnVsbC1uYW1lOjoKKwlXaGVuIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5LCB0aGUgY29tbWFuZCB1c3VhbGx5CisJb3V0cHV0cyBwYXRocyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzCisJb3B0aW9uIGZvcmNlcyBwYXRocyB0byBiZSBvdXRwdXQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKwl0b3AgZGlyZWN0b3J5LgorCistRSB8IC0tZXh0ZW5kZWQtcmVnZXhwIHwgLUcgfCAtLWJhc2ljLXJlZ2V4cDo6CisJVXNlIFBPU0lYIGV4dGVuZGVkL2Jhc2ljIHJlZ2V4cCBmb3IgcGF0dGVybnMuICBEZWZhdWx0CisJaXMgdG8gdXNlIGJhc2ljIHJlZ2V4cC4KKworLUYgfCAtLWZpeGVkLXN0cmluZ3M6OgorCVVzZSBmaXhlZCBzdHJpbmdzIGZvciBwYXR0ZXJucyAoZG9uJ3QgaW50ZXJwcmV0IHBhdHRlcm4KKwlhcyBhIHJlZ2V4KS4KKworLW46OgorCVByZWZpeCB0aGUgbGluZSBudW1iZXIgdG8gbWF0Y2hpbmcgbGluZXMuCisKKy1sIHwgLS1maWxlcy13aXRoLW1hdGNoZXMgfCAtTCB8IC0tZmlsZXMtd2l0aG91dC1tYXRjaDo6CisJSW5zdGVhZCBvZiBzaG93aW5nIGV2ZXJ5IG1hdGNoZWQgbGluZSwgc2hvdyBvbmx5IHRoZQorCW5hbWVzIG9mIGZpbGVzIHRoYXQgY29udGFpbiAob3IgZG8gbm90IGNvbnRhaW4pIG1hdGNoZXMuCisKKy1jIHwgLS1jb3VudDo6CisJSW5zdGVhZCBvZiBzaG93aW5nIGV2ZXJ5IG1hdGNoZWQgbGluZSwgc2hvdyB0aGUgbnVtYmVyIG9mCisJbGluZXMgdGhhdCBtYXRjaC4KKworLVtBQkNdIDxjb250ZXh0Pjo6CisJU2hvdyBgY29udGV4dGAgdHJhaWxpbmcgKGBBYCAtLSBhZnRlciksIG9yIGxlYWRpbmcgKGBCYAorCS0tIGJlZm9yZSksIG9yIGJvdGggKGBDYCAtLSBjb250ZXh0KSBsaW5lcywgYW5kIHBsYWNlIGEKKwlsaW5lIGNvbnRhaW5pbmcgYC0tYCBiZXR3ZWVuIGNvbnRpZ3VvdXMgZ3JvdXBzIG9mCisJbWF0Y2hlcy4KKworLTxudW0+OjoKKwlBIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIC1DPG51bT4uCisKKy1mIDxmaWxlPjo6CisJUmVhZCBwYXR0ZXJucyBmcm9tIDxmaWxlPiwgb25lIHBlciBsaW5lLgorCistZTo6CisJVGhlIG5leHQgcGFyYW1ldGVyIGlzIHRoZSBwYXR0ZXJuLiBUaGlzIG9wdGlvbiBoYXMgdG8gYmUKKwl1c2VkIGZvciBwYXR0ZXJucyBzdGFydGluZyB3aXRoIC0gYW5kIHNob3VsZCBiZSB1c2VkIGluCisJc2NyaXB0cyBwYXNzaW5nIHVzZXIgaW5wdXQgdG8gZ3JlcC4gIE11bHRpcGxlIHBhdHRlcm5zIGFyZQorCWNvbWJpbmVkIGJ5ICdvcicuCisKKy0tYW5kIHwgLS1vciB8IC0tbm90IHwgKCB8ICk6OgorCVNwZWNpZnkgaG93IG11bHRpcGxlIHBhdHRlcm5zIGFyZSBjb21iaW5lZCB1c2luZyBCb29sZWFuCisJZXhwcmVzc2lvbnMuICBgLS1vcmAgaXMgdGhlIGRlZmF1bHQgb3BlcmF0b3IuICBgLS1hbmRgIGhhcworCWhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gYC0tb3JgLiAgYC1lYCBoYXMgdG8gYmUgdXNlZCBmb3IgYWxsCisJcGF0dGVybnMuCisKKy0tYWxsLW1hdGNoOjoKKwlXaGVuIGdpdmluZyBtdWx0aXBsZSBwYXR0ZXJuIGV4cHJlc3Npb25zIGNvbWJpbmVkIHdpdGggYC0tb3JgLAorCXRoaXMgZmxhZyBpcyBzcGVjaWZpZWQgdG8gbGltaXQgdGhlIG1hdGNoIHRvIGZpbGVzIHRoYXQKKwloYXZlIGxpbmVzIHRvIG1hdGNoIGFsbCBvZiB0aGVtLgorCitgPHRyZWU+Li4uYDo6CisJU2VhcmNoIGJsb2JzIGluIHRoZSB0cmVlcyBmb3Igc3BlY2lmaWVkIHBhdHRlcm5zLgorCitcLS06OgorCVNpZ25hbHMgdGhlIGVuZCBvZiBvcHRpb25zOyB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycworCWFyZSA8cGF0aD4gbGltaXRlcnMuCisKKworRXhhbXBsZQorLS0tLS0tLQorCitnaXQgZ3JlcCAtZSBcJyNkZWZpbmVcJyAtLWFuZCBcKCAtZSBNQVhfUEFUSCAtZSBQQVRIX01BWCBcKTo6CisJTG9va3MgZm9yIGEgbGluZSB0aGF0IGhhcyBgI2RlZmluZWAgYW5kIGVpdGhlciBgTUFYX1BBVEhgIG9yCisJYFBBVEhfTUFYYC4KKworZ2l0IGdyZXAgLS1hbGwtbWF0Y2ggLWUgTk9ERSAtZSBVbmV4cGVjdGVkOjoKKwlMb29rcyBmb3IgYSBsaW5lIHRoYXQgaGFzIGBOT0RFYCBvciBgVW5leHBlY3RlZGAgaW4KKwlmaWxlcyB0aGF0IGhhdmUgbGluZXMgdGhhdCBtYXRjaCBib3RoLgorCitBdXRob3IKKy0tLS0tLQorT3JpZ2luYWxseSB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIGxhdGVyCityZXZhbXBlZCBieSBKdW5pbyBDIEhhbWFuby4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRjMzZmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaGFzaC1vYmplY3QudHh0CkBAIC0wLDAgKzEsNDYgQEAKK2dpdC1oYXNoLW9iamVjdCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1oYXNoLW9iamVjdCAtIENvbXB1dGUgb2JqZWN0IElEIGFuZCBvcHRpb25hbGx5IGNyZWF0ZXMgYSBibG9iIGZyb20gYSBmaWxlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWhhc2gtb2JqZWN0JyBbLXQgPHR5cGU+XSBbLXddIFstLXN0ZGluXSBbLS1dIDxmaWxlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXB1dGVzIHRoZSBvYmplY3QgSUQgdmFsdWUgZm9yIGFuIG9iamVjdCB3aXRoIHNwZWNpZmllZCB0eXBlCit3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZmlsZSAod2hpY2ggY2FuIGJlIG91dHNpZGUgb2YgdGhlCit3b3JrIHRyZWUpLCBhbmQgb3B0aW9uYWxseSB3cml0ZXMgdGhlIHJlc3VsdGluZyBvYmplY3QgaW50byB0aGUKK29iamVjdCBkYXRhYmFzZS4gIFJlcG9ydHMgaXRzIG9iamVjdCBJRCB0byBpdHMgc3RhbmRhcmQgb3V0cHV0LgorVGhpcyBpcyB1c2VkIGJ5ICJnaXQtY3ZzaW1wb3J0IiB0byB1cGRhdGUgdGhlIGluZGV4Cit3aXRob3V0IG1vZGlmeWluZyBmaWxlcyBpbiB0aGUgd29yayB0cmVlLiAgV2hlbiA8dHlwZT4gaXMgbm90CitzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvICJibG9iIi4gCisKK09QVElPTlMKKy0tLS0tLS0KKworLXQgPHR5cGU+OjoKKwlTcGVjaWZ5IHRoZSB0eXBlIChkZWZhdWx0OiAiYmxvYiIpLgorCistdzo6CisJQWN0dWFsbHkgd3JpdGUgdGhlIG9iamVjdCBpbnRvIHRoZSBvYmplY3QgZGF0YWJhc2UuCisKKy0tc3RkaW46OgorCVJlYWQgdGhlIG9iamVjdCBmcm9tIHN0YW5kYXJkIGlucHV0IGluc3RlYWQgb2YgZnJvbSBhIGZpbGUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLWZldGNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWFiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLWZldGNoLnR4dApAQCAtMCwwICsxLDU3IEBACitnaXQtaHR0cC1mZXRjaCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWh0dHAtZmV0Y2ggLSBEb3dubG9hZCBmcm9tIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWh0dHAtZmV0Y2gnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIFstLXN0ZGluXSA8Y29tbWl0PiA8dXJsPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Rvd25sb2FkcyBhIHJlbW90ZSBnaXQgcmVwb3NpdG9yeSB2aWEgSFRUUC4KKworT1BUSU9OUworLS0tLS0tLQorY29tbWl0LWlkOjoKKyAgICAgICAgRWl0aGVyIHRoZSBoYXNoIG9yIHRoZSBmaWxlbmFtZSB1bmRlciBbVVJMXS9yZWZzLyB0bworICAgICAgICBwdWxsLgorCistYzo6CisJR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy10OjoKKwlHZXQgdHJlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21taXQgb2JqZWN0cy4KKy1hOjoKKwlHZXQgYWxsIHRoZSBvYmplY3RzLgorLXY6OgorCVJlcG9ydCB3aGF0IGlzIGRvd25sb2FkZWQuCisKKy13IDxmaWxlbmFtZT46OgorICAgICAgICBXcml0ZXMgdGhlIGNvbW1pdC1pZCBpbnRvIHRoZSBmaWxlbmFtZSB1bmRlciAkR0lUX0RJUi9yZWZzLzxmaWxlbmFtZT4gb24KKyAgICAgICAgdGhlIGxvY2FsIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgYSBjb21taXQgaWQgb24gdGhlIGNvbW1hbmRsaW5lICh3aGljaCBpcyBub3QgZXhwZWN0ZWQgaW4gdGhpcworCWNhc2UpLCAnZ2l0LWh0dHAtZmV0Y2gnIGV4cGVjdHMgbGluZXMgb24gc3RkaW4gaW4gdGhlIGZvcm1hdAorCisJCTxjb21taXQtaWQ+WydcdCc8ZmlsZW5hbWUtYXMtaW4tLXc+XQorCistLXJlY292ZXI6OgorCVZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gdGFyZ2V0IGlzIGZldGNoZWQuICBVc2VkIGFmdGVyCisJYW4gZWFybGllciBmZXRjaCBpcyBpbnRlcnJ1cHRlZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtcHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLXB1c2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWNmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLXB1c2gudHh0CkBAIC0wLDAgKzEsOTggQEAKK2dpdC1odHRwLXB1c2goMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWh0dHAtcHVzaCAtIFB1c2ggb2JqZWN0cyBvdmVyIEhUVFAvREFWIHRvIGFub3RoZXIgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1odHRwLXB1c2gnIFstLWFsbF0gWy0tZm9yY2VdIFstLXZlcmJvc2VdIDx1cmw+IDxyZWY+IFs8cmVmPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTZW5kcyBtaXNzaW5nIG9iamVjdHMgdG8gcmVtb3RlIHJlcG9zaXRvcnksIGFuZCB1cGRhdGVzIHRoZQorcmVtb3RlIGJyYW5jaC4KKworCitPUFRJT05TCistLS0tLS0tCistLWFsbDo6CisJRG8gbm90IGFzc3VtZSB0aGF0IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBjb21wbGV0ZSBpbiBpdHMKKwljdXJyZW50IHN0YXRlLCBhbmQgdmVyaWZ5IGFsbCBvYmplY3RzIGluIHRoZSBlbnRpcmUgbG9jYWwKKwlyZWYncyBoaXN0b3J5IGV4aXN0IGluIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKworLS1mb3JjZTo6CisJVXN1YWxseSwgdGhlIGNvbW1hbmQgcmVmdXNlcyB0byB1cGRhdGUgYSByZW1vdGUgcmVmIHRoYXQKKwlpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGxvY2FsIHJlZiB1c2VkIHRvIG92ZXJ3cml0ZSBpdC4KKwlUaGlzIGZsYWcgZGlzYWJsZXMgdGhlIGNoZWNrLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQKKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnkgY2FuIGxvc2UgY29tbWl0czsgdXNlIGl0IHdpdGgKKwljYXJlLgorCistLXZlcmJvc2U6OgorCVJlcG9ydCB0aGUgbGlzdCBvZiBvYmplY3RzIGJlaW5nIHdhbGtlZCBsb2NhbGx5IGFuZCB0aGUKKwlsaXN0IG9mIG9iamVjdHMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCistZCwgLUQ6OgorCVJlbW92ZSA8cmVmPiBmcm9tIHJlbW90ZSByZXBvc2l0b3J5LiAgVGhlIHNwZWNpZmllZCBicmFuY2gKKwljYW5ub3QgYmUgdGhlIHJlbW90ZSBIRUFELiAgSWYgLWQgaXMgc3BlY2lmaWVkIHRoZSBmb2xsb3dpbmcKKwlvdGhlciBjb25kaXRpb25zIG11c3QgYWxzbyBiZSBtZXQ6CisKKwktIFJlbW90ZSBIRUFEIG11c3QgcmVzb2x2ZSB0byBhbiBvYmplY3QgdGhhdCBleGlzdHMgbG9jYWxseQorCS0gU3BlY2lmaWVkIGJyYW5jaCByZXNvbHZlcyB0byBhbiBvYmplY3QgdGhhdCBleGlzdHMgbG9jYWxseQorCS0gU3BlY2lmaWVkIGJyYW5jaCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgcmVtb3RlIEhFQUQKKworPHJlZj4uLi46OgorCVRoZSByZW1vdGUgcmVmcyB0byB1cGRhdGUuCisKKworU3BlY2lmeWluZyB0aGUgUmVmcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBICc8cmVmPicgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHBhdHRlcm4sIG9yIGEgcGFpcgorb2Ygc3VjaCBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAiOiIgKHRoaXMgbWVhbnMgdGhhdCBhIHJlZiBuYW1lCitjYW5ub3QgaGF2ZSBhIGNvbG9uIGluIGl0KS4gIEEgc2luZ2xlIHBhdHRlcm4gJzxuYW1lPicgaXMganVzdCBhIAorc2hvcnRoYW5kIGZvciAnPG5hbWU+OjxuYW1lPicuCisKK0VhY2ggcGF0dGVybiBwYWlyIGNvbnNpc3RzIG9mIHRoZSBzb3VyY2Ugc2lkZSAoYmVmb3JlIHRoZSBjb2xvbikKK2FuZCB0aGUgZGVzdGluYXRpb24gc2lkZSAoYWZ0ZXIgdGhlIGNvbG9uKS4gIFRoZSByZWYgdG8gYmUKK3B1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYSBtYXRjaCB0aGF0IG1hdGNoZXMgdGhlIHNvdXJjZQorc2lkZSwgYW5kIHdoZXJlIGl0IGlzIHB1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IHVzaW5nIHRoZQorZGVzdGluYXRpb24gc2lkZS4KKworIC0gSXQgaXMgYW4gZXJyb3IgaWYgPHNyYz4gZG9lcyBub3QgbWF0Y2ggZXhhY3RseSBvbmUgb2YgdGhlCisgICBsb2NhbCByZWZzLgorCisgLSBJZiA8ZHN0PiBkb2VzIG5vdCBtYXRjaCBhbnkgcmVtb3RlIHJlZiwgZWl0aGVyCisKKyAgICogaXQgaGFzIHRvIHN0YXJ0IHdpdGggInJlZnMvIjsgPGRzdD4gaXMgdXNlZCBhcyB0aGUKKyAgICAgZGVzdGluYXRpb24gbGl0ZXJhbGx5IGluIHRoaXMgY2FzZS4KKworICAgKiA8c3JjPiA9PSA8ZHN0PiBhbmQgdGhlIHJlZiB0aGF0IG1hdGNoZWQgdGhlIDxzcmM+IG11c3Qgbm90CisgICAgIGV4aXN0IGluIHRoZSBzZXQgb2YgcmVtb3RlIHJlZnM7IHRoZSByZWYgbWF0Y2hlZCA8c3JjPgorICAgICBsb2NhbGx5IGlzIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uLgorCitXaXRob3V0ICctLWZvcmNlJywgdGhlIDxzcmM+IHJlZiBpcyBzdG9yZWQgYXQgdGhlIHJlbW90ZSBvbmx5IGlmCis8ZHN0PiBkb2VzIG5vdCBleGlzdCwgb3IgPGRzdD4gaXMgYSBwcm9wZXIgc3Vic2V0IChpLmUuIGFuCithbmNlc3Rvcikgb2YgPHNyYz4uICBUaGlzIGNoZWNrLCBrbm93biBhcyAiZmFzdCBmb3J3YXJkIGNoZWNrIiwKK2lzIHBlcmZvcm1lZCBpbiBvcmRlciB0byBhdm9pZCBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlCityZW1vdGUgcmVmIGFuZCBsb3NlIG90aGVyIHBlb3BsZXMnIGNvbW1pdHMgZnJvbSB0aGVyZS4KKworV2l0aCAnLS1mb3JjZScsIHRoZSBmYXN0IGZvcndhcmQgY2hlY2sgaXMgZGlzYWJsZWQgZm9yIGFsbCByZWZzLgorCitPcHRpb25hbGx5LCBhIDxyZWY+IHBhcmFtZXRlciBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIHBsdXMgJysnIHNpZ24KK3RvIGRpc2FibGUgdGhlIGZhc3QtZm9yd2FyZCBjaGVjayBvbmx5IG9uIHRoYXQgcmVmLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE5pY2sgSGVuZ2V2ZWxkIDxuaWNraEByZWFjdHJpeC5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE5pY2sgSGVuZ2V2ZWxkCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW1hcC1zZW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWltYXAtc2VuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhOWU5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWltYXAtc2VuZC50eHQKQEAgLTAsMCArMSw2MiBAQAorZ2l0LWltYXAtc2VuZCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaW1hcC1zZW5kIC0gRHVtcCBhIG1haWxib3ggZnJvbSBzdGRpbiBpbnRvIGFuIGltYXAgZm9sZGVyCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWltYXAtc2VuZCcKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCB1cGxvYWRzIGEgbWFpbGJveCBnZW5lcmF0ZWQgd2l0aCBnaXQtZm9ybWF0LXBhdGNoCitpbnRvIGFuIGltYXAgZHJhZnRzIGZvbGRlci4gIFRoaXMgYWxsb3dzIHBhdGNoZXMgdG8gYmUgc2VudCBhcworb3RoZXIgZW1haWwgaXMgc2VudCB3aXRoIG1haWwgY2xpZW50cyB0aGF0IGNhbm5vdCByZWFkIG1haWxib3gKK2ZpbGVzIGRpcmVjdGx5LgorCitUeXBpY2FsIHVzYWdlIGlzIHNvbWV0aGluZyBsaWtlOgorCitnaXQtZm9ybWF0LXBhdGNoIC0tc2lnbm9mZiAtLXN0ZG91dCAtLWF0dGFjaCBvcmlnaW4gfCBnaXQtaW1hcC1zZW5kCisKKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCitnaXQtaW1hcC1zZW5kIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIHRoZSByZXBvc2l0b3J5Citjb25maWd1cmF0aW9uIGZpbGUgKHNob3duIHdpdGggZXhhbXBsZXMpOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorW2ltYXBdCisgICAgRm9sZGVyID0gIklOQk9YLkRyYWZ0cyIKKworW2ltYXBdCisgICAgVHVubmVsID0gInNzaCAtcSB1c2VyQHNlcnZlci5jb20gL3Vzci9iaW4vaW1hcGQgLi9NYWlsZGlyIDI+IC9kZXYvbnVsbCIKKworW2ltYXBdCisgICAgSG9zdCA9IGltYXAuc2VydmVyLmNvbQorICAgIFVzZXIgPSBib2IKKyAgICBQYXNzID0gcHdkCisgICAgUG9ydCA9IDE0MworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCitCVUdTCistLS0tCitEb2Vzbid0IGhhbmRsZSBsaW5lcyBzdGFydGluZyB3aXRoICJGcm9tICIgaW4gdGhlIG1lc3NhZ2UgYm9keS4KKworCitBdXRob3IKKy0tLS0tLQorRGVyaXZlZCBmcm9tIGlzeW5jIDEuMC4xIGJ5IE1pa2UgTWNDb3JtYWNrLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNaWtlIE1jQ29ybWFjaworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluZGV4LXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5kZXgtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2OTI2OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWluZGV4LXBhY2sudHh0CkBAIC0wLDAgKzEsMTAxIEBACitnaXQtaW5kZXgtcGFjaygxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWluZGV4LXBhY2sgLSBCdWlsZCBwYWNrIGluZGV4IGZpbGUgZm9yIGFuIGV4aXN0aW5nIHBhY2tlZCBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWluZGV4LXBhY2snIFstdl0gWy1vIDxpbmRleC1maWxlPl0gPHBhY2stZmlsZT4KKydnaXQtaW5kZXgtcGFjaycgLS1zdGRpbiBbLS1maXgtdGhpbl0gWy0ta2VlcF0gWy12XSBbLW8gPGluZGV4LWZpbGU+XQorICAgICAgICAgICAgICAgICBbPHBhY2stZmlsZT5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBhIHBhY2tlZCBhcmNoaXZlICgucGFjaykgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUsIGFuZAorYnVpbGRzIGEgcGFjayBpbmRleCBmaWxlICguaWR4KSBmb3IgaXQuICBUaGUgcGFja2VkIGFyY2hpdmUKK3RvZ2V0aGVyIHdpdGggdGhlIHBhY2sgaW5kZXggY2FuIHRoZW4gYmUgcGxhY2VkIGluIHRoZQorb2JqZWN0cy9wYWNrLyBkaXJlY3Rvcnkgb2YgYSBnaXQgcmVwb3NpdG9yeS4KKworCitPUFRJT05TCistLS0tLS0tCistdjo6CisJQmUgdmVyYm9zZSBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLCBpbmNsdWRpbmcgcHJvZ3Jlc3Mgc3RhdHVzLgorCistbyA8aW5kZXgtZmlsZT46OgorCVdyaXRlIHRoZSBnZW5lcmF0ZWQgcGFjayBpbmRleCBpbnRvIHRoZSBzcGVjaWZpZWQKKwlmaWxlLiAgV2l0aG91dCB0aGlzIG9wdGlvbiB0aGUgbmFtZSBvZiBwYWNrIGluZGV4CisJZmlsZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBuYW1lIG9mIHBhY2tlZCBhcmNoaXZlCisJZmlsZSBieSByZXBsYWNpbmcgLnBhY2sgd2l0aCAuaWR4IChhbmQgdGhlIHByb2dyYW0KKwlmYWlscyBpZiB0aGUgbmFtZSBvZiBwYWNrZWQgYXJjaGl2ZSBkb2VzIG5vdCBlbmQKKwl3aXRoIC5wYWNrKS4KKworLS1zdGRpbjo6CisJV2hlbiB0aGlzIGZsYWcgaXMgcHJvdmlkZWQsIHRoZSBwYWNrIGlzIHJlYWQgZnJvbSBzdGRpbgorCWluc3RlYWQgYW5kIGEgY29weSBpcyB0aGVuIHdyaXR0ZW4gdG8gPHBhY2stZmlsZT4uIElmCisJPHBhY2stZmlsZT4gaXMgbm90IHNwZWNpZmllZCwgdGhlIHBhY2sgaXMgd3JpdHRlbiB0bworCW9iamVjdHMvcGFjay8gZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGdpdCByZXBvc2l0b3J5IHdpdGgKKwlhIGRlZmF1bHQgbmFtZSBkZXRlcm1pbmVkIGZyb20gdGhlIHBhY2sgY29udGVudC4gIElmCisJPHBhY2stZmlsZT4gaXMgbm90IHNwZWNpZmllZCBjb25zaWRlciB1c2luZyAtLWtlZXAgdG8KKwlwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiB0aGlzIHByb2Nlc3MgYW5kCisJZ2l0bGluazo6Z2l0LXJlcGFja1sxXSAuCisKKy0tZml4LXRoaW46OgorCUl0IGlzIHBvc3NpYmxlIGZvciBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0gdG8gYnVpbGQKKwkidGhpbiIgcGFjaywgd2hpY2ggcmVjb3JkcyBvYmplY3RzIGluIGRlbHRpZmllZCBmb3JtIGJhc2VkIG9uCisJb2JqZWN0cyBub3QgaW5jbHVkZWQgaW4gdGhlIHBhY2sgdG8gcmVkdWNlIG5ldHdvcmsgdHJhZmZpYy4KKwlUaG9zZSBvYmplY3RzIGFyZSBleHBlY3RlZCB0byBiZSBwcmVzZW50IG9uIHRoZSByZWNlaXZpbmcgZW5kCisJYW5kIHRoZXkgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcGFjayBmb3IgdGhhdCBwYWNrIHRvIGJlIHNlbGYKKwljb250YWluZWQgYW5kIGluZGV4YWJsZS4gV2l0aG91dCB0aGlzIG9wdGlvbiBhbnkgYXR0ZW1wdCB0bworCWluZGV4IGEgdGhpbiBwYWNrIHdpbGwgZmFpbC4gVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSBpbgorCWNvbmp1bmN0aW9uIHdpdGggLS1zdGRpbi4KKworLS1rZWVwOjoKKwlCZWZvcmUgbW92aW5nIHRoZSBpbmRleCBpbnRvIGl0cyBmaW5hbCBkZXN0aW5hdGlvbgorCWNyZWF0ZSBhbiBlbXB0eSAua2VlcCBmaWxlIGZvciB0aGUgYXNzb2NpYXRlZCBwYWNrIGZpbGUuCisJVGhpcyBvcHRpb24gaXMgdXN1YWxseSBuZWNlc3Nhcnkgd2l0aCAtLXN0ZGluIHRvIHByZXZlbnQgYQorCXNpbXVsdGFuZW91cyBnaXRsaW5rOmdpdC1yZXBhY2tbMV0gcHJvY2VzcyBmcm9tIGRlbGV0aW5nCisJdGhlIG5ld2x5IGNvbnN0cnVjdGVkIHBhY2sgYW5kIGluZGV4IGJlZm9yZSByZWZzIGNhbiBiZQorCXVwZGF0ZWQgdG8gdXNlIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBwYWNrLgorCistLWtlZXA9J3doeSc6OgorCUxpa2UgLS1rZWVwIGNyZWF0ZSBhIC5rZWVwIGZpbGUgYmVmb3JlIG1vdmluZyB0aGUgaW5kZXggaW50bworCWl0cyBmaW5hbCBkZXN0aW5hdGlvbiwgYnV0IHJhdGhlciB0aGFuIGNyZWF0aW5nIGFuIGVtcHR5IGZpbGUKKwlwbGFjZSAnd2h5JyBmb2xsb3dlZCBieSBhbiBMRiBpbnRvIHRoZSAua2VlcCBmaWxlLiAgVGhlICd3aHknCisJbWVzc2FnZSBjYW4gbGF0ZXIgYmUgc2VhcmNoZWQgZm9yIHdpdGhpbiBhbGwgLmtlZXAgZmlsZXMgdG8KKwlsb2NhdGUgYW55IHdoaWNoIGhhdmUgb3V0bGl2ZWQgdGhlaXIgdXNlZnVsbmVzcy4KKworLS1pbmRleC12ZXJzaW9uPTx2ZXJzaW9uPlssPG9mZnNldD5dOjoKKwlUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUgb25seS4gSXQgYWxsb3dzCisJdG8gZm9yY2UgdGhlIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgcGFjayBpbmRleCwgYW5kIHRvIGZvcmNlCisJNjQtYml0IGluZGV4IGVudHJpZXMgb24gb2JqZWN0cyBsb2NhdGVkIGFib3ZlIHRoZSBnaXZlbiBvZmZzZXQuCisKKworTm90ZQorLS0tLQorCitPbmNlIHRoZSBpbmRleCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGlzdCBvZiBvYmplY3QgbmFtZXMgaXMgc29ydGVkCithbmQgdGhlIFNIQTEgaGFzaCBvZiB0aGF0IGxpc3QgaXMgcHJpbnRlZCB0byBzdGRvdXQuIElmIC0tc3RkaW4gd2FzCithbHNvIHVzZWQgdGhlbiB0aGlzIGlzIHByZWZpeGVkIGJ5IGVpdGhlciAicGFja1x0Iiwgb3IgImtlZXBcdCIgaWYgYQorbmV3IC5rZWVwIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBUaGlzIGlzIHVzZWZ1bCB0byByZW1vdmUgYQorLmtlZXAgZmlsZSB1c2VkIGFzIGEgbG9jayB0byBwcmV2ZW50IHRoZSByYWNlIHdpdGggZ2l0bGluazpnaXQtcmVwYWNrWzFdCittZW50aW9uZWQgYWJvdmUuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgU2VyZ2V5IFZsYXNvdiA8dnN1QGFsdGxpbnV4LnJ1PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFNlcmdleSBWbGFzb3YKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluaXQtZGIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC1kYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxMjEzNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWluaXQtZGIudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2dpdC1pbml0LWRiKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaW5pdC1kYiAtIENyZWF0ZXMgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtaW5pdC1kYicgWy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT5dIFstLXNoYXJlZFs9PHBlcm1pc3Npb25zPl1dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSBzeW5vbnltIGZvciBnaXRsaW5rOmdpdC1pbml0WzFdLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQorZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNvbW1hbmQuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2NGQzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWluaXQudHh0CkBAIC0wLDAgKzEsMTExIEBACitnaXQtaW5pdCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWluaXQgLSBDcmVhdGUgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkgb3IgcmVpbml0aWFsaXplIGFuIGV4aXN0aW5nIG9uZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbml0JyBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tc2hhcmVkWz08cGVybWlzc2lvbnM+XV0KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tCisKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCitQcm92aWRlIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0ZW1wbGF0ZXMgd2lsbCBiZSB1c2VkLiAgVGhlIGRlZmF1bHQgdGVtcGxhdGUKK2RpcmVjdG9yeSBpcyBgL3Vzci9zaGFyZS9naXQtY29yZS90ZW1wbGF0ZXNgLgorCitXaGVuIHNwZWNpZmllZCwgYDx0ZW1wbGF0ZV9kaXJlY3Rvcnk+YCBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIHRlbXBsYXRlCitmaWxlcyByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdC4gIFRoZSB0ZW1wbGF0ZSBmaWxlcyBpbmNsdWRlIHNvbWUgZGlyZWN0b3J5CitzdHJ1Y3R1cmUsIHNvbWUgc3VnZ2VzdGVkICJleGNsdWRlIHBhdHRlcm5zIiwgYW5kIGNvcGllcyBvZiBub24tZXhlY3V0aW5nCisiaG9vayIgZmlsZXMuICBUaGUgc3VnZ2VzdGVkIHBhdHRlcm5zIGFuZCBob29rIGZpbGVzIGFyZSBhbGwgbW9kaWZpYWJsZSBhbmQKK2V4dGVuc2libGUuCisKKy0tc2hhcmVkWz17ZmFsc2V8dHJ1ZXx1bWFza3xncm91cHxhbGx8d29ybGR8ZXZlcnlib2R5fV06OgorCitTcGVjaWZ5IHRoYXQgdGhlIGdpdCByZXBvc2l0b3J5IGlzIHRvIGJlIHNoYXJlZCBhbW9uZ3N0IHNldmVyYWwgdXNlcnMuICBUaGlzCithbGxvd3MgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBzYW1lIGdyb3VwIHRvIHB1c2ggaW50byB0aGF0CityZXBvc2l0b3J5LiAgV2hlbiBzcGVjaWZpZWQsIHRoZSBjb25maWcgdmFyaWFibGUgImNvcmUuc2hhcmVkUmVwb3NpdG9yeSIgaXMKK3NldCBzbyB0aGF0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB1bmRlciBgJEdJVF9ESVJgIGFyZSBjcmVhdGVkIHdpdGggdGhlCityZXF1ZXN0ZWQgcGVybWlzc2lvbnMuICBXaGVuIG5vdCBzcGVjaWZpZWQsIGdpdCB3aWxsIHVzZSBwZXJtaXNzaW9ucyByZXBvcnRlZAorYnkgdW1hc2soMikuCisKK1RoZSBvcHRpb24gY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gJ2dyb3VwJyBpZiBubyB2YWx1ZQoraXMgZ2l2ZW46CisKKyAtICd1bWFzaycgKG9yICdmYWxzZScpOiBVc2UgcGVybWlzc2lvbnMgcmVwb3J0ZWQgYnkgdW1hc2soMikuIFRoZSBkZWZhdWx0LAorICAgd2hlbiBgLS1zaGFyZWRgIGlzIG5vdCBzcGVjaWZpZWQuCisKKyAtICdncm91cCcgKG9yICd0cnVlJyk6IE1ha2UgdGhlIHJlcG9zaXRvcnkgZ3JvdXAtd3JpdGFibGUsIChhbmQgZytzeCwgc2luY2UKKyAgIHRoZSBnaXQgZ3JvdXAgbWF5IGJlIG5vdCB0aGUgcHJpbWFyeSBncm91cCBvZiBhbGwgdXNlcnMpLgorCisgLSAnYWxsJyAob3IgJ3dvcmxkJyBvciAnZXZlcnlib2R5Jyk6IFNhbWUgYXMgJ2dyb3VwJywgYnV0IG1ha2UgdGhlIHJlcG9zaXRvcnkKKyAgIHJlYWRhYmxlIGJ5IGFsbCB1c2Vycy4KKworQnkgZGVmYXVsdCwgdGhlIGNvbmZpZ3VyYXRpb24gZmxhZyByZWNlaXZlLmRlbnlOb25GYXN0Zm9yd2FyZCBpcyBlbmFibGVkCitpbiBzaGFyZWQgcmVwb3NpdG9yaWVzLCBzbyB0aGF0IHlvdSBjYW5ub3QgZm9yY2UgYSBub24gZmFzdC1mb3J3YXJkaW5nIHB1c2gKK2ludG8gaXQuCisKKy0tCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgY3JlYXRlcyBhbiBlbXB0eSBnaXQgcmVwb3NpdG9yeSAtIGJhc2ljYWxseSBhIGAuZ2l0YCBkaXJlY3RvcnkKK3dpdGggc3ViZGlyZWN0b3JpZXMgZm9yIGBvYmplY3RzYCwgYHJlZnMvaGVhZHNgLCBgcmVmcy90YWdzYCwgYW5kCit0ZW1wbGF0ZSBmaWxlcy4KK0FuIGluaXRpYWwgYEhFQURgIGZpbGUgdGhhdCByZWZlcmVuY2VzIHRoZSBIRUFEIG9mIHRoZSBtYXN0ZXIgYnJhbmNoCitpcyBhbHNvIGNyZWF0ZWQuCisKK0lmIHRoZSBgJEdJVF9ESVJgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0aGVuIGl0IHNwZWNpZmllcyBhIHBhdGgKK3RvIHVzZSBpbnN0ZWFkIG9mIGAuLy5naXRgIGZvciB0aGUgYmFzZSBvZiB0aGUgcmVwb3NpdG9yeS4KKworSWYgdGhlIG9iamVjdCBzdG9yYWdlIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgdmlhIHRoZSBgJEdJVF9PQkpFQ1RfRElSRUNUT1JZYAorZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlbiB0aGUgc2hhMSBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCB1bmRlcm5lYXRoIC0KK290aGVyd2lzZSB0aGUgZGVmYXVsdCBgJEdJVF9ESVIvb2JqZWN0c2AgZGlyZWN0b3J5IGlzIHVzZWQuCisKK1J1bm5pbmcgYGdpdC1pbml0YCBpbiBhbiBleGlzdGluZyByZXBvc2l0b3J5IGlzIHNhZmUuIEl0IHdpbGwgbm90IG92ZXJ3cml0ZQordGhpbmdzIHRoYXQgYXJlIGFscmVhZHkgdGhlcmUuIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgcmVydW5uaW5nIGBnaXQtaW5pdGAKK2lzIHRvIHBpY2sgdXAgbmV3bHkgYWRkZWQgdGVtcGxhdGVzLgorCitOb3RlIHRoYXQgYGdpdC1pbml0YCBpcyB0aGUgc2FtZSBhcyBgZ2l0LWluaXQtZGJgLiAgVGhlIGNvbW1hbmQKK3dhcyBwcmltYXJpbHkgbWVhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGRhdGFiYXNlLCBidXQgb3ZlcgordGltZSBpdCBoYXMgYmVjb21lIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBvdGhlciBhc3BlY3RzCitvZiB0aGUgcmVwb3NpdG9yeSwgc3VjaCBhcyBpbnN0YWxsaW5nIHRoZSBkZWZhdWx0IGhvb2tzIGFuZAorc2V0dGluZyB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuICBUaGUgb2xkIG5hbWUgaXMgcmV0YWluZWQKK2ZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK1N0YXJ0IGEgbmV3IGdpdCByZXBvc2l0b3J5IGZvciBhbiBleGlzdGluZyBjb2RlIGJhc2U6OgorKworLS0tLS0tLS0tLS0tLS0tLQorJCBjZCAvcGF0aC90by9teS9jb2RlYmFzZQorJCBnaXQtaW5pdCAgICAgIDwxPgorJCBnaXQtYWRkIC4gICAgIDwyPgorLS0tLS0tLS0tLS0tLS0tLQorKworPDE+IHByZXBhcmUgL3BhdGgvdG8vbXkvY29kZWJhc2UvLmdpdCBkaXJlY3RvcnkKKzwyPiBhZGQgYWxsIGV4aXN0aW5nIGZpbGUgdG8gdGhlIGluZGV4CisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluc3Rhd2ViLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWluc3Rhd2ViLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGYwYWIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW5zdGF3ZWIudHh0CkBAIC0wLDAgKzEsODUgQEAKK2dpdC1pbnN0YXdlYigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbnN0YXdlYiAtIEluc3RhbnRseSBicm93c2UgeW91ciB3b3JraW5nIHJlcG9zaXRvcnkgaW4gZ2l0d2ViCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1pbnN0YXdlYicgWy0tbG9jYWxdIFstLWh0dHBkPTxodHRwZD5dIFstLXBvcnQ9PHBvcnQ+XQorICAgICAgICAgICAgICAgWy0tYnJvd3Nlcj08YnJvd3Nlcj5dCisnZ2l0LWluc3Rhd2ViJyBbLS1zdGFydF0gWy0tc3RvcF0gWy0tcmVzdGFydF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHNpbXBsZSBzY3JpcHQgdG8gc2V0dXAgZ2l0d2ViIGFuZCBhIHdlYiBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHRoZSBsb2NhbAorcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorCistbHwtLWxvY2FsOjoKKwlPbmx5IGJpbmQgdGhlIHdlYiBzZXJ2ZXIgdG8gdGhlIGxvY2FsIElQICgxMjcuMC4wLjEpLgorCistZHwtLWh0dHBkOjoKKwlUaGUgSFRUUCBkYWVtb24gY29tbWFuZC1saW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4KKwlDb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIGhlcmUsIGFuZCB0aGUKKwljb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLWxpbmUuCisJQ3VycmVudGx5LCBsaWdodHRwZCBhbmQgYXBhY2hlMiBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIHNlcnZlcnMuCisJKERlZmF1bHQ6IGxpZ2h0dHBkKQorCistbXwtLW1vZHVsZS1wYXRoOjoKKwlUaGUgbW9kdWxlIHBhdGggKG9ubHkgbmVlZGVkIGlmIGh0dHBkIGlzIEFwYWNoZSkuCisJKERlZmF1bHQ6IC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcykKKworLXB8LS1wb3J0OjoKKwlUaGUgcG9ydCBudW1iZXIgdG8gYmluZCB0aGUgaHR0cGQgdG8uICAoRGVmYXVsdDogMTIzNCkKKworLWJ8LS1icm93c2VyOjoKKworCVRoZSB3ZWIgYnJvd3NlciBjb21tYW5kLWxpbmUgdG8gZXhlY3V0ZSB0byB2aWV3IHRoZSBnaXR3ZWIgcGFnZS4KKwlJZiBibGFuaywgdGhlIFVSTCBvZiB0aGUgZ2l0d2ViIGluc3RhbmNlIHdpbGwgYmUgcHJpbnRlZCB0bworCXN0ZG91dC4gIChEZWZhdWx0OiAnZmlyZWZveCcpCisKKy0tc3RhcnQ6OgorCVN0YXJ0IHRoZSBodHRwZCBpbnN0YW5jZSBhbmQgZXhpdC4gIFRoaXMgZG9lcyBub3QgZ2VuZXJhdGUKKwlhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHNwYXduaW5nIGEgbmV3IGluc3RhbmNlLgorCistLXN0b3A6OgorCVN0b3AgdGhlIGh0dHBkIGluc3RhbmNlIGFuZCBleGl0LiAgVGhpcyBkb2VzIG5vdCBnZW5lcmF0ZQorCWFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3Igc3Bhd25pbmcgYSBuZXcgaW5zdGFuY2UsCisJbm9yIGRvZXMgaXQgY2xvc2UgdGhlIGJyb3dzZXIuCisKKy0tcmVzdGFydDo6CisJUmVzdGFydCB0aGUgaHR0cGQgaW5zdGFuY2UgYW5kIGV4aXQuICBUaGlzIGRvZXMgbm90IGdlbmVyYXRlCisJYW55IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBzcGF3bmluZyBhIG5ldyBpbnN0YW5jZS4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCitZb3UgbWF5IHNwZWNpZnkgY29uZmlndXJhdGlvbiBpbiB5b3VyIC5naXQvY29uZmlnCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbaW5zdGF3ZWJdCisJbG9jYWwgPSB0cnVlCisJaHR0cGQgPSBhcGFjaGUyIC1mCisJcG9ydCA9IDQzMjEKKwlicm93c2VyID0ga29ucXVlcm9yCisJbW9kdWxlcGF0aCA9IC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzg5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1sb2NhbC1mZXRjaC50eHQKQEAgLTAsMCArMSw2NSBAQAorZ2l0LWxvY2FsLWZldGNoKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxvY2FsLWZldGNoIC0gRHVwbGljYXRlIGFub3RoZXIgZ2l0IHJlcG9zaXRvcnkgb24gYSBsb2NhbCBzeXN0ZW0KKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbG9jYWwtZmV0Y2gnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIFstbF0gWy1zXSBbLW5dCisgICAgICAgICAgICAgICAgICBjb21taXQtaWQgcGF0aAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0R1cGxpY2F0ZXMgYW5vdGhlciBnaXQgcmVwb3NpdG9yeSBvbiBhIGxvY2FsIHN5c3RlbS4KKworT1BUSU9OUworLS0tLS0tLQorLWM6OgorCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCistdDo6CisJR2V0IHRyZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWl0IG9iamVjdHMuCistYTo6CisJR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy12OjoKKwlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorLXM6OgorCUluc3RlYWQgb2YgcmVndWxhciBmaWxlLXRvLWZpbGUgY29weWluZyB1c2Ugc3ltYm9saWMgbGlua3MgdG8gdGhlIG9iamVjdHMKKwlpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCistbDo6CisJQmVmb3JlIGF0dGVtcHRpbmcgc3ltbGlua3MgKGlmIC1zIGlzIHNwZWNpZmllZCkgb3IgZmlsZS10by1maWxlIGNvcHlpbmcgdGhlCisJcmVtb3RlIG9iamVjdHMsIHRyeSB0byBoYXJkbGluayB0aGUgcmVtb3RlIG9iamVjdHMgaW50byB0aGUgbG9jYWwKKwlyZXBvc2l0b3J5LgorLW46OgorCU5ldmVyIGF0dGVtcHQgdG8gZmlsZS10by1maWxlIGNvcHkgcmVtb3RlIG9iamVjdHMuICBPbmx5IHVzZWZ1bCB3aXRoCisJLXMgb3IgLWwgY29tbWFuZC1saW5lIG9wdGlvbnMuCisKKy13IDxmaWxlbmFtZT46OgorICAgICAgICBXcml0ZXMgdGhlIGNvbW1pdC1pZCBpbnRvIHRoZSBmaWxlbmFtZSB1bmRlciAkR0lUX0RJUi9yZWZzLzxmaWxlbmFtZT4gb24KKyAgICAgICAgdGhlIGxvY2FsIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgYSBjb21taXQgaWQgb24gdGhlIGNvbW1hbmRsaW5lICh3aGljaCBpcyBub3QgZXhwZWN0ZWQgaW4gdGhpcworCWNhc2UpLCAnZ2l0LWxvY2FsLWZldGNoJyBleHBlY3RzIGxpbmVzIG9uIHN0ZGluIGluIHRoZSBmb3JtYXQKKworCQk8Y29tbWl0LWlkPlsnXHQnPGZpbGVuYW1lLWFzLWluLS13Pl0KKworLS1yZWNvdmVyOjoKKwlWZXJpZnkgdGhhdCBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIHRhcmdldCBpcyBmZXRjaGVkLiAgVXNlZCBhZnRlcgorCWFuIGVhcmxpZXIgZmV0Y2ggaXMgaW50ZXJydXB0ZWQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1sb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM1M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApAQCAtMCwwICsxLDEwNCBAQAorZ2l0LWxvZygxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbG9nIC0gU2hvdyBjb21taXQgbG9ncworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1sb2cnIDxvcHRpb24+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvd3MgdGhlIGNvbW1pdCBsb2dzLgorCitUaGUgY29tbWFuZCB0YWtlcyBvcHRpb25zIGFwcGxpY2FibGUgdG8gdGhlIGdpdGxpbms6Z2l0LXJldi1saXN0WzFdCitjb21tYW5kIHRvIGNvbnRyb2wgd2hhdCBpcyBzaG93biBhbmQgaG93LCBhbmQgb3B0aW9ucyBhcHBsaWNhYmxlIHRvCit0aGUgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGNvbW1hbmRzIHRvIGNvbnRyb2wgaG93IHRoZSBjaGFuZ2VzCitlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzIGFyZSBzaG93bi4KKworVGhpcyBtYW51YWwgcGFnZSBkZXNjcmliZXMgb25seSB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3B0aW9ucy4KKworCitPUFRJT05TCistLS0tLS0tCisKK2luY2x1ZGU6OnByZXR0eS1vcHRpb25zLnR4dFtdCisKKy08bj46OgorCUxpbWl0cyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgdG8gc2hvdy4KKworPHNpbmNlPi4uPHVudGlsPjo6CisJU2hvdyBvbmx5IGNvbW1pdHMgYmV0d2VlbiB0aGUgbmFtZWQgdHdvIGNvbW1pdHMuICBXaGVuCisJZWl0aGVyIDxzaW5jZT4gb3IgPHVudGlsPiBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bworCWBIRUFEYCwgaS5lLiB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4KKwlGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCA8c2luY2U+CisJYW5kIDx1bnRpbD4sIHNlZSAiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4KKwlnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0uCisKKy0tZmlyc3QtcGFyZW50OjoKKwlGb2xsb3cgb25seSB0aGUgZmlyc3QgcGFyZW50IGNvbW1pdCB1cG9uIHNlZWluZyBhIG1lcmdlCisJY29tbWl0LiAgVGhpcyAgb3B0aW9uIGdpdmVzIGEgYmV0dGVyIG92ZXJ2aWV3IG9mIHRoZQorCWV2b2x1dGlvbiBvZiBhIHBhcnRpY3VsYXIgYnJhbmNoLgorCistcDo6CisJU2hvdyB0aGUgY2hhbmdlIHRoZSBjb21taXQgaW50cm9kdWNlcyBpbiBhIHBhdGNoIGZvcm0uCisKKy1nLCBcLS13YWxrLXJlZmxvZ3M6OgorCVNob3cgY29tbWl0cyBhcyB0aGV5IHdlcmUgcmVjb3JkZWQgaW4gdGhlIHJlZmxvZy4gVGhlIGxvZyBjb250YWlucworCWEgcmVjb3JkIGFib3V0IGhvdyB0aGUgdGlwIG9mIGEgcmVmZXJlbmNlIHdhcyBjaGFuZ2VkLgorCVNlZSBhbHNvIGdpdGxpbms6Z2l0LXJlZmxvZ1sxXS4KKworLS1kZWNvcmF0ZTo6CisgICAgUHJpbnQgb3V0IHRoZSByZWYgbmFtZXMgb2YgYW55IGNvbW1pdHMgdGhhdCBhcmUgc2hvd24uCisKKzxwYXRocz4uLi46OgorCVNob3cgb25seSBjb21taXRzIHRoYXQgYWZmZWN0IHRoZSBzcGVjaWZpZWQgcGF0aHMuCisKKworaW5jbHVkZTo6cHJldHR5LWZvcm1hdHMudHh0W10KKworCitFeGFtcGxlcworLS0tLS0tLS0KK2dpdCBsb2cgLS1uby1tZXJnZXM6OgorCisJU2hvdyB0aGUgd2hvbGUgY29tbWl0IGhpc3RvcnksIGJ1dCBza2lwIGFueSBtZXJnZXMKKworZ2l0IGxvZyB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFsbCBjb21taXRzIHNpbmNlIHZlcnNpb24gJ3YyLjYuMTInIHRoYXQgY2hhbmdlZCBhbnkgZmlsZQorCWluIHRoZSBpbmNsdWRlL3Njc2kgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKK2dpdCBsb2cgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIFwtLSBnaXRrOjoKKworCVNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcyB0byB0aGUgZmlsZSAnZ2l0aycuCisJVGhlICItLSIgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSAqYnJhbmNoKiBuYW1lZAorCSdnaXRrJworCitnaXQgbG9nIC1yIC0tbmFtZS1zdGF0dXMgcmVsZWFzZS4udGVzdDo6CisKKwlTaG93IHRoZSBjb21taXRzIHRoYXQgYXJlIGluIHRoZSAidGVzdCIgYnJhbmNoIGJ1dCBub3QgeWV0CisJaW4gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFsb25nIHdpdGggdGhlIGxpc3Qgb2YgcGF0aHMKKwllYWNoIGNvbW1pdCBtb2RpZmllcy4KKworRGlzY3Vzc2lvbgorLS0tLS0tLS0tLQorCitpbmNsdWRlOjppMThuLnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9zdC1mb3VuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NjA3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0CkBAIC0wLDAgKzEsNzcgQEAKK2dpdC1sb3N0LWZvdW5kKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbG9zdC1mb3VuZCAtIFJlY292ZXIgbG9zdCByZWZzIHRoYXQgbHVja2lseSBoYXZlIG5vdCB5ZXQgYmVlbiBwcnVuZWQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxvc3QtZm91bmQnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmluZHMgZGFuZ2xpbmcgY29tbWl0cyBhbmQgdGFncyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UsIGFuZAorY3JlYXRlcyByZWZzIHRvIHRoZW0gaW4gdGhlIC5naXQvbG9zdC1mb3VuZC8gZGlyZWN0b3J5LiAgQ29tbWl0cyBhbmQKK3RhZ3MgdGhhdCBkZXJlZmVyZW5jZSB0byBjb21taXRzIGFyZSBzdG9yZWQgaW4gLmdpdC9sb3N0LWZvdW5kL2NvbW1pdCwKK2FuZCBvdGhlciBvYmplY3RzIGFyZSBzdG9yZWQgaW4gLmdpdC9sb3N0LWZvdW5kL290aGVyLgorCisKK09VVFBVVAorLS0tLS0tCitQcmludHMgdG8gc3RhbmRhcmQgb3V0cHV0IHRoZSBvYmplY3QgbmFtZXMgYW5kIG9uZS1saW5lIGRlc2NyaXB0aW9ucworb2YgYW55IGNvbW1pdHMgb3IgdGFncyBmb3VuZC4KKworRVhBTVBMRQorLS0tLS0tLQorCitTdXBwb3NlIHlvdSBydW4gJ2dpdCB0YWcgLWYnIGFuZCBtaXN0eXBlIHRoZSB0YWcgdG8gb3ZlcndyaXRlLgorVGhlIHJlZiB0byB5b3VyIHRhZyBpcyBvdmVyd3JpdHRlbiwgYnV0IHVudGlsIHlvdSBydW4gJ2dpdAorcHJ1bmUnLCB0aGUgdGFnIGl0c2VsZiBpcyBzdGlsbCB0aGVyZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBsb3N0LWZvdW5kCitbMWVmMmIxOTZkOTA5ZWVkNTIzZDRmM2M5YmY1NGI3OGNkZDY4NDNjNl0gR0lUIDAuOTkuOWMKKy4uLgorLS0tLS0tLS0tLS0tCisKK0Fsc28geW91IGNhbiB1c2UgZ2l0ayB0byBicm93c2UgaG93IGFueSB0YWdzIGZvdW5kIHJlbGF0ZSB0byBlYWNoCitvdGhlci4KKworLS0tLS0tLS0tLS0tCiskIGdpdGsgJChjZCAuZ2l0L2xvc3QtZm91bmQvY29tbWl0ICYmIGVjaG8gPz8qKQorLS0tLS0tLS0tLS0tCisKK0FmdGVyIG1ha2luZyBzdXJlIHlvdSBrbm93IHdoaWNoIHRoZSBvYmplY3QgaXMgdGhlIHRhZyB5b3UgYXJlIGxvb2tpbmcKK2ZvciwgeW91IGNhbiByZWNvbm5lY3QgaXQgdG8geW91ciByZWd1bGFyIC5naXQvcmVmcyBoaWVyYXJjaHkuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgLXQgMWVmMmIxOTYKK3RhZworJCBnaXQgY2F0LWZpbGUgdGFnIDFlZjJiMTk2CitvYmplY3QgZmE0MWJiY2U4ZTM4YzY3YTIxODQxNWRlNmNmYTUxMGM3ZTUwMDMyYQordHlwZSBjb21taXQKK3RhZyB2MC45OS45YwordGFnZ2VyIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gMTEzMTA1OTU5NCAtMDgwMAorCitHSVQgMC45OS45YworCitUaGlzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyBmcm9tIHRoZSAibWFzdGVyIiBicmFuY2gsIHNpbmNlCisuLi4KKyQgZ2l0IHVwZGF0ZS1yZWYgcmVmcy90YWdzL25vdC1sb3N0LWFueW1vcmUgMWVmMmIxOTYKKyQgZ2l0IHJldi1wYXJzZSBub3QtbG9zdC1hbnltb3JlCisxZWYyYjE5NmQ5MDllZWQ1MjNkNGYzYzliZjU0Yjc4Y2RkNjg0M2M2CistLS0tLS0tLS0tLS0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8g5r+x6YeOIOe0lCA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbHMtZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtZmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGE5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy1maWxlcy50eHQKQEAgLTAsMCArMSwxODMgQEAKK2dpdC1scy1maWxlcygxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1scy1maWxlcyAtIFNob3cgaW5mb3JtYXRpb24gYWJvdXQgZmlsZXMgaW4gdGhlIGluZGV4IGFuZCB0aGUgd29ya2luZyB0cmVlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWxzLWZpbGVzJyBbLXpdIFstdF0gWy12XQorCQkoLS1bY2FjaGVkfGRlbGV0ZWR8b3RoZXJzfGlnbm9yZWR8c3RhZ2V8dW5tZXJnZWR8a2lsbGVkfG1vZGlmaWVkXSlcKgorCQkoLVtjfGR8b3xpfHN8dXxrfG1dKVwqCisJCVsteCA8cGF0dGVybj58LS1leGNsdWRlPTxwYXR0ZXJuPl0KKwkJWy1YIDxmaWxlPnwtLWV4Y2x1ZGUtZnJvbT08ZmlsZT5dCisJCVstLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08ZmlsZT5dCisJCVstLWVycm9yLXVubWF0Y2hdCisJCVstLWZ1bGwtbmFtZV0gWy0tYWJicmV2XSBbLS1dIFs8ZmlsZT5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIG1lcmdlcyB0aGUgZmlsZSBsaXN0aW5nIGluIHRoZSBkaXJlY3RvcnkgY2FjaGUgaW5kZXggd2l0aCB0aGUKK2FjdHVhbCB3b3JraW5nIGRpcmVjdG9yeSBsaXN0LCBhbmQgc2hvd3MgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiB0aGUKK3R3by4KKworT25lIG9yIG1vcmUgb2YgdGhlIG9wdGlvbnMgYmVsb3cgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlcworc2hvd246CisKK09QVElPTlMKKy0tLS0tLS0KKy1jfC0tY2FjaGVkOjoKKwlTaG93IGNhY2hlZCBmaWxlcyBpbiB0aGUgb3V0cHV0IChkZWZhdWx0KQorCistZHwtLWRlbGV0ZWQ6OgorCVNob3cgZGVsZXRlZCBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy1tfC0tbW9kaWZpZWQ6OgorCVNob3cgbW9kaWZpZWQgZmlsZXMgaW4gdGhlIG91dHB1dAorCistb3wtLW90aGVyczo6CisJU2hvdyBvdGhlciBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy1pfC0taWdub3JlZDo6CisJU2hvdyBpZ25vcmVkIGZpbGVzIGluIHRoZSBvdXRwdXQuCisJTm90ZSB0aGF0IHRoaXMgYWxzbyByZXZlcnNlcyBhbnkgZXhjbHVkZSBsaXN0IHByZXNlbnQuCisKKy1zfC0tc3RhZ2U6OgorCVNob3cgc3RhZ2UgZmlsZXMgaW4gdGhlIG91dHB1dAorCistLWRpcmVjdG9yeTo6CisJSWYgYSB3aG9sZSBkaXJlY3RvcnkgaXMgY2xhc3NpZmllZCBhcyAib3RoZXIiLCBzaG93IGp1c3QgaXRzCisJbmFtZSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKSBhbmQgbm90IGl0cyB3aG9sZSBjb250ZW50cy4KKworLS1uby1lbXB0eS1kaXJlY3Rvcnk6OgorCURvIG5vdCBsaXN0IGVtcHR5IGRpcmVjdG9yaWVzLiBIYXMgbm8gZWZmZWN0IHdpdGhvdXQgLS1kaXJlY3RvcnkuCisKKy11fC0tdW5tZXJnZWQ6OgorCVNob3cgdW5tZXJnZWQgZmlsZXMgaW4gdGhlIG91dHB1dCAoZm9yY2VzIC0tc3RhZ2UpCisKKy1rfC0ta2lsbGVkOjoKKwlTaG93IGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGR1ZQorCXRvIGZpbGUvZGlyZWN0b3J5IGNvbmZsaWN0cyBmb3IgY2hlY2tvdXQtaW5kZXggdG8KKwlzdWNjZWVkLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQuCisKKy14fC0tZXhjbHVkZT08cGF0dGVybj46OgorCVNraXBzIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm4uCisJTm90ZSB0aGF0IHBhdHRlcm4gaXMgYSBzaGVsbCB3aWxkY2FyZCBwYXR0ZXJuLgorCistWHwtLWV4Y2x1ZGUtZnJvbT08ZmlsZT46OgorCWV4Y2x1ZGUgcGF0dGVybnMgYXJlIHJlYWQgZnJvbSA8ZmlsZT47IDEgcGVyIGxpbmUuCisKKy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxmaWxlPjo6CisJcmVhZCBhZGRpdGlvbmFsIGV4Y2x1ZGUgcGF0dGVybnMgdGhhdCBhcHBseSBvbmx5IHRvIHRoZQorCWRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIGluIDxmaWxlPi4KKworLS1lcnJvci11bm1hdGNoOjoKKwlJZiBhbnkgPGZpbGU+IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgaW5kZXgsIHRyZWF0IHRoaXMgYXMgYW4KKwllcnJvciAocmV0dXJuIDEpLgorCistdDo6CisJSWRlbnRpZnkgdGhlIGZpbGUgc3RhdHVzIHdpdGggdGhlIGZvbGxvd2luZyB0YWdzIChmb2xsb3dlZCBieQorCWEgc3BhY2UpIGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmU6CisJSDo6CWNhY2hlZAorCU06Ogl1bm1lcmdlZAorCVI6OglyZW1vdmVkL2RlbGV0ZWQKKwlDOjoJbW9kaWZpZWQvY2hhbmdlZAorCUs6Ogl0byBiZSBraWxsZWQKKwk/OjoJb3RoZXIKKworLXY6OgorCVNpbWlsYXIgdG8gYC10YCwgYnV0IHVzZSBsb3dlcmNhc2UgbGV0dGVycyBmb3IgZmlsZXMKKwl0aGF0IGFyZSBtYXJrZWQgYXMgJ2Fsd2F5cyBtYXRjaGluZyBpbmRleCcuCisKKy0tZnVsbC1uYW1lOjoKKwlXaGVuIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5LCB0aGUgY29tbWFuZCB1c3VhbGx5CisJb3V0cHV0cyBwYXRocyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzCisJb3B0aW9uIGZvcmNlcyBwYXRocyB0byBiZSBvdXRwdXQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKwl0b3AgZGlyZWN0b3J5LgorCistLWFiYnJldls9PG4+XTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgb2JqZWN0CisJbGluZXMsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguCisJTm9uIGRlZmF1bHQgbnVtYmVyIG9mIGRpZ2l0cyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLS1hYmJyZXY9PG4+LgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxmaWxlPjo6CisJRmlsZXMgdG8gc2hvdy4gSWYgbm8gZmlsZXMgYXJlIGdpdmVuIGFsbCBmaWxlcyB3aGljaCBtYXRjaCB0aGUgb3RoZXIKKwlzcGVjaWZpZWQgY3JpdGVyaWEgYXJlIHNob3duLgorCitPdXRwdXQKKy0tLS0tLQorc2hvdyBmaWxlcyBqdXN0IG91dHB1dHMgdGhlIGZpbGVuYW1lIHVubGVzcyAnLS1zdGFnZScgaXMgc3BlY2lmaWVkIGluCit3aGljaCBjYXNlIGl0IG91dHB1dHM6CisKKyAgICAgICAgWzx0YWc+IF08bW9kZT4gPG9iamVjdD4gPHN0YWdlPiA8ZmlsZT4KKworImdpdC1scy1maWxlcyAtLXVubWVyZ2VkIiBhbmQgImdpdC1scy1maWxlcyAtLXN0YWdlIiBjYW4gYmUgdXNlZCB0byBleGFtaW5lCitkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB1bm1lcmdlZCBwYXRocy4KKworRm9yIGFuIHVubWVyZ2VkIHBhdGgsIGluc3RlYWQgb2YgcmVjb3JkaW5nIGEgc2luZ2xlIG1vZGUvU0hBMSBwYWlyLAordGhlIGluZGV4IHJlY29yZHMgdXAgdG8gdGhyZWUgc3VjaCBwYWlyczsgb25lIGZyb20gdHJlZSBPIGluIHN0YWdlCisxLCBBIGluIHN0YWdlIDIsIGFuZCBCIGluIHN0YWdlIDMuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIGJ5Cit0aGUgdXNlciAob3IgdGhlIHBvcmNlbGFpbikgdG8gc2VlIHdoYXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVjb3JkZWQgYXQgdGhlCitwYXRoLiAoc2VlIGdpdC1yZWFkLXRyZWUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3RhdGUpCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworCitFeGNsdWRlIFBhdHRlcm5zCistLS0tLS0tLS0tLS0tLS0tCisKKydnaXQtbHMtZmlsZXMnIGNhbiB1c2UgYSBsaXN0IG9mICJleGNsdWRlIHBhdHRlcm5zIiB3aGVuCit0cmF2ZXJzaW5nIHRoZSBkaXJlY3RvcnkgdHJlZSBhbmQgZmluZGluZyBmaWxlcyB0byBzaG93IHdoZW4gdGhlCitmbGFncyAtLW90aGVycyBvciAtLWlnbm9yZWQgYXJlIHNwZWNpZmllZC4gIGdpdGxpbms6Z2l0aWdub3JlWzVdCitzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiBleGNsdWRlIHBhdHRlcm5zLgorCitUaGVzZSBleGNsdWRlIHBhdHRlcm5zIGNvbWUgZnJvbSB0aGVzZSBwbGFjZXMsIGluIG9yZGVyOgorCisgIDEuIFRoZSBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGU9PHBhdHRlcm4+IHNwZWNpZmllcyBhCisgICAgIHNpbmdsZSBwYXR0ZXJuLiAgUGF0dGVybnMgYXJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIKKyAgICAgdGhleSBhcHBlYXIgaW4gdGhlIGNvbW1hbmQgbGluZS4KKworICAyLiBUaGUgY29tbWFuZCBsaW5lIGZsYWcgLS1leGNsdWRlLWZyb209PGZpbGU+IHNwZWNpZmllcyBhCisgICAgIGZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2YgcGF0dGVybnMuICBQYXR0ZXJucyBhcmUgb3JkZXJlZAorICAgICBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgZmlsZS4KKworICAzLiBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08bmFtZT4gc3BlY2lmaWVzCisgICAgIGEgbmFtZSBvZiB0aGUgZmlsZSBpbiBlYWNoIGRpcmVjdG9yeSAnZ2l0LWxzLWZpbGVzJworICAgICBleGFtaW5lcywgbm9ybWFsbHkgYC5naXRpZ25vcmVgLiAgRmlsZXMgaW4gZGVlcGVyCisgICAgIGRpcmVjdG9yaWVzIHRha2UgcHJlY2VkZW5jZS4gIFBhdHRlcm5zIGFyZSBvcmRlcmVkIGluIHRoZQorICAgICBzYW1lIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBmaWxlcy4KKworQSBwYXR0ZXJuIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLS1leGNsdWRlIG9yIHJlYWQKK2Zyb20gdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLS1leGNsdWRlLWZyb20gaXMgcmVsYXRpdmUgdG8gdGhlCit0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLiAgQSBwYXR0ZXJuIHJlYWQgZnJvbSBhIGZpbGUgc3BlY2lmaWVkCitieSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlCitwYXR0ZXJuIGZpbGUgYXBwZWFycyBpbi4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1yZWFkLXRyZWVbMV0sIGdpdGxpbms6Z2l0aWdub3JlWzVdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubywgSm9zaCBUcmlwbGV0dCwgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU0MDA1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtcmVtb3RlLnR4dApAQCAtMCwwICsxLDczIEBACitnaXQtbHMtcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1scy1yZW1vdGUgLSBMaXN0IHJlZmVyZW5jZXMgaW4gYSByZW1vdGUgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1scy1yZW1vdGUnIFstLWhlYWRzXSBbLS10YWdzXSAgWy11IDxleGVjPiB8IC0tdXBsb2FkLXBhY2sgPGV4ZWM+XQorCSAgICAgIDxyZXBvc2l0b3J5PiA8cmVmcz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitEaXNwbGF5cyByZWZlcmVuY2VzIGF2YWlsYWJsZSBpbiBhIHJlbW90ZSByZXBvc2l0b3J5IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQKK2NvbW1pdCBJRHMuCisKKworT1BUSU9OUworLS0tLS0tLQorLWh8LS1oZWFkcywgLXR8LS10YWdzOjoKKwlMaW1pdCB0byBvbmx5IHJlZnMvaGVhZHMgYW5kIHJlZnMvdGFncywgcmVzcGVjdGl2ZWx5LgorCVRoZXNlIG9wdGlvbnMgYXJlIF9ub3RfIG11dHVhbGx5IGV4Y2x1c2l2ZTsgd2hlbiBnaXZlbgorCWJvdGgsIHJlZmVyZW5jZXMgc3RvcmVkIGluIHJlZnMvaGVhZHMgYW5kIHJlZnMvdGFncyBhcmUKKwlkaXNwbGF5ZWQuCisKKy11IDxleGVjPiwgLS11cGxvYWQtcGFjaz08ZXhlYz46OgorCVNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBvZiBnaXRsaW5rOmdpdC11cGxvYWQtcGFja1sxXSBvbiB0aGUgcmVtb3RlCisJaG9zdC4gVGhpcyBhbGxvd3MgbGlzdGluZyByZWZlcmVuY2VzIGZyb20gcmVwb3NpdG9yaWVzIGFjY2Vzc2VkIHZpYQorCVNTSCBhbmQgd2hlcmUgdGhlIFNTSCBkYWVtb24gZG9lcyBub3QgdXNlIHRoZSBQQVRIIGNvbmZpZ3VyZWQgYnkgdGhlCisJdXNlci4gQWxzbyBzZWUgdGhlICctLWV4ZWMnIG9wdGlvbiBmb3IgZ2l0bGluazpnaXQtcGVlay1yZW1vdGVbMV0uCisKKzxyZXBvc2l0b3J5Pjo6CisJTG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkuICBUaGUgc2hvcnRoYW5kIGRlZmluZWQgaW4KKwkkR0lUX0RJUi9icmFuY2hlcy8gY2FuIGJlIHVzZWQuIFVzZSAiLiIgKGRvdCkgdG8gbGlzdCByZWZlcmVuY2VzIGluCisJdGhlIGxvY2FsIHJlcG9zaXRvcnkuCisKKzxyZWZzPi4uLjo6CisJV2hlbiB1bnNwZWNpZmllZCwgYWxsIHJlZmVyZW5jZXMsIGFmdGVyIGZpbHRlcmluZyBkb25lCisJd2l0aCAtLWhlYWRzIGFuZCAtLXRhZ3MsIGFyZSBzaG93bi4gIFdoZW4gPHJlZnM+Li4uIGFyZQorCXNwZWNpZmllZCwgb25seSByZWZlcmVuY2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXR0ZXJucworCWFyZSBkaXNwbGF5ZWQuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCisJJCBnaXQgbHMtcmVtb3RlIC0tdGFncyAuLy4KKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwk3Y2VjYTI3NWQwNDdjOTBjMGM3ZDVhZmIxM2FiOTdlZmRmNTFiZDZlCXJlZnMvdGFncy92MC45OS4zCisJYzVkYjU0NTZhZTNiMDg3M2ZjNjU5YzE5ZmFmZGRlMjIzMTNjYzQ0MQlyZWZzL3RhZ3MvdjAuOTkuMgorCTA5MTgzODVkYmQ5NjU2Y2FiMGQxZDgxYmE3NDUzZDQ5YmJjMTYyNTAJcmVmcy90YWdzL2p1bmlvLWdwZy1wdWIKKwkkIGdpdCBscy1yZW1vdGUgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQgbWFzdGVyIHB1IHJjCisJNWZlOTc4YTUzODFmMWZiYWQyNmE4MGU2ODJkZGQyYTQwMTk2Njc0MAlyZWZzL2hlYWRzL21hc3RlcgorCWM3ODFhODRiNTIwNGZiMjk0YzljY2M3OWY4YjNiYWNlZWIzMmMwNjEJcmVmcy9oZWFkcy9wdQorCWIxZDA5NmYyOTI2YzRlMzdjOWMwYjZhN2JmMjExOWJlZGFhMjc3Y2IJcmVmcy9oZWFkcy9yYworCSQgZWNobyBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCA+LmdpdC9icmFuY2hlcy9wdWJsaWMKKwkkIGdpdCBscy1yZW1vdGUgLS10YWdzIHB1YmxpYyB2XCoKKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwljNWRiNTQ1NmFlM2IwODczZmM2NTljMTlmYWZkZGUyMjMxM2NjNDQxCXJlZnMvdGFncy92MC45OS4yCisJN2NlY2EyNzVkMDQ3YzkwYzBjN2Q1YWZiMTNhYjk3ZWZkZjUxYmQ2ZQlyZWZzL3RhZ3MvdjAuOTkuMworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTkzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dApAQCAtMCwwICsxLDgzIEBACitnaXQtbHMtdHJlZSgxKQorPT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxzLXRyZWUgLSBMaXN0IHRoZSBjb250ZW50cyBvZiBhIHRyZWUgb2JqZWN0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWxzLXRyZWUnIFstZF0gWy1yXSBbLXRdIFstel0KKwkgICAgWy0tbmFtZS1vbmx5XSBbLS1uYW1lLXN0YXR1c10gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXY9WzxuPl1dCisJICAgIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0xpc3RzIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIHRyZWUgb2JqZWN0LCBsaWtlIHdoYXQgIi9iaW4vbHMgLWEiIGRvZXMKK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIHVzYWdlIGlzIHN1YnRseSBkaWZmZXJlbnQsCit0aG91Z2ggLSAncGF0aHMnIGRlbm90ZSBqdXN0IGEgbGlzdCBvZiBwYXR0ZXJucyB0byBtYXRjaCwgZS5nLiBzbyBzcGVjaWZ5aW5nCitkaXJlY3RvcnkgbmFtZSAod2l0aG91dCAnLXInKSB3aWxsIGJlaGF2ZSBkaWZmZXJlbnRseSwgYW5kIG9yZGVyIG9mIHRoZQorYXJndW1lbnRzIGRvZXMgbm90IG1hdHRlci4KKworT1BUSU9OUworLS0tLS0tLQorPHRyZWUtaXNoPjo6CisJSWQgb2YgYSB0cmVlLWlzaC4KKworLWQ6OgorCVNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4uCisKKy1yOjoKKwlSZWN1cnNlIGludG8gc3ViLXRyZWVzLgorCistdDo6CisJU2hvdyB0cmVlIGVudHJpZXMgZXZlbiB3aGVuIGdvaW5nIHRvIHJlY3Vyc2UgdGhlbS4gSGFzIG5vIGVmZmVjdAorCWlmICctcicgd2FzIG5vdCBwYXNzZWQuICctZCcgaW1wbGllcyAnLXQnLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQuCisKKy0tbmFtZS1vbmx5OjoKKy0tbmFtZS1zdGF0dXM6OgorCUxpc3Qgb25seSBmaWxlbmFtZXMgKGluc3RlYWQgb2YgdGhlICJsb25nIiBvdXRwdXQpLCBvbmUgcGVyIGxpbmUuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4KKwlOb24gZGVmYXVsdCBudW1iZXIgb2YgZGlnaXRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCAtLWFiYnJldj08bj4uCisKKy0tZnVsbC1uYW1lOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIHBhdGggbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZworCWRpcmVjdG9yeSwgc2hvdyB0aGUgZnVsbCBwYXRoIG5hbWVzLgorCitwYXRoczo6CisJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3cgdGhlbSAobm90ZSB0aGF0IHRoaXMgaXNuJ3QgcmVhbGx5IHJhdworCXBhdGhuYW1lcywgYnV0IHJhdGhlciBhIGxpc3Qgb2YgcGF0dGVybnMgdG8gbWF0Y2gpLiAgT3RoZXJ3aXNlCisJaW1wbGljaXRseSB1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisKKworT3V0cHV0IEZvcm1hdAorLS0tLS0tLS0tLS0tLQorICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKworV2hlbiB0aGUgYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwgcmVzcGVjdGl2ZWx5LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFBldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6PgorQ29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4sCithbm90aGVyIG1ham9yIHJld3JpdGUgYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0Cis8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsaW5mby50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsaW5mby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhZGNlYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1haWxpbmZvLnR4dApAQCAtMCwwICsxLDcwIEBACitnaXQtbWFpbGluZm8oMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWFpbGluZm8gLSBFeHRyYWN0cyBwYXRjaCBhbmQgYXV0aG9yc2hpcCBmcm9tIGEgc2luZ2xlIGUtbWFpbCBtZXNzYWdlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1haWxpbmZvJyBbLWtdIFstdSB8IC0tZW5jb2Rpbmc9PGVuY29kaW5nPl0gPG1zZz4gPHBhdGNoPgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZGluZyBhIHNpbmdsZSBlLW1haWwgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kCit3cml0ZXMgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpbiA8bXNnPiBmaWxlLCBhbmQgdGhlIHBhdGNoZXMgaW4KKzxwYXRjaD4gZmlsZS4gIFRoZSBhdXRob3IgbmFtZSwgZS1tYWlsIGFuZCBlLW1haWwgc3ViamVjdCBhcmUKK3dyaXR0ZW4gb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgdG8gYmUgdXNlZCBieSBnaXQtYXBwbHlwYXRjaAordG8gY3JlYXRlIGEgY29tbWl0LiAgSXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzCitjb21tYW5kIGRpcmVjdGx5LiAgU2VlIGdpdGxpbms6Z2l0LWFtWzFdIGluc3RlYWQuCisKKworT1BUSU9OUworLS0tLS0tLQorLWs6OgorCVVzdWFsbHkgdGhlIHByb2dyYW0gJ2NsZWFucyB1cCcgdGhlIFN1YmplY3Q6IGhlYWRlciBsaW5lCisJdG8gZXh0cmFjdCB0aGUgdGl0bGUgbGluZSBmb3IgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSwKKwlhbW9uZyB3aGljaCAoMSkgcmVtb3ZlICdSZTonIG9yICdyZTonLCAoMikgbGVhZGluZworCXdoaXRlc3BhY2VzLCAoMykgJ1snIHVwIHRvICddJywgdHlwaWNhbGx5ICdbUEFUQ0hdJywgYW5kCisJdGhlbiBwcmVwZW5kcyAiW1BBVENIXSAiLiAgVGhpcyBmbGFnIGZvcmJpZHMgdGhpcworCW11bmdpbmcsIGFuZCBpcyBtb3N0IHVzZWZ1bCB3aGVuIHVzZWQgdG8gcmVhZCBiYWNrICdnaXQKKwlmb3JtYXQtcGF0Y2ggLWsnIG91dHB1dC4KKworLXU6OgorCVRoZSBjb21taXQgbG9nIG1lc3NhZ2UsIGF1dGhvciBuYW1lIGFuZCBhdXRob3IgZW1haWwgYXJlCisJdGFrZW4gZnJvbSB0aGUgZS1tYWlsLCBhbmQgYWZ0ZXIgbWluaW1hbGx5IGRlY29kaW5nIE1JTUUKKwl0cmFuc2ZlciBlbmNvZGluZywgcmUtY29kZWQgaW4gVVRGLTggYnkgdHJhbnNsaXRlcmF0aW5nCisJdGhlbS4gIFRoaXMgdXNlZCB0byBiZSBvcHRpb25hbCBidXQgbm93IGl0IGlzIHRoZSBkZWZhdWx0LgorKworTm90ZSB0aGF0IHRoZSBwYXRjaCBpcyBhbHdheXMgdXNlZCBhcy1pcyB3aXRob3V0IGNoYXJzZXQKK2NvbnZlcnNpb24sIGV2ZW4gd2l0aCB0aGlzIGZsYWcuCisKKy0tZW5jb2Rpbmc9PGVuY29kaW5nPjo6CisJU2ltaWxhciB0byAtdSBidXQgaWYgdGhlIGxvY2FsIGNvbnZlbnRpb24gaXMgZGlmZmVyZW50CisJZnJvbSB3aGF0IGlzIHNwZWNpZmllZCBieSBpMThuLmNvbW1pdGVuY29kaW5nLCB0aGlzIGZsYWcKKwljYW4gYmUgdXNlZCB0byBvdmVycmlkZSBpdC4KKworPG1zZz46OgorCVRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZXh0cmFjdGVkIGZyb20gZS1tYWlsLCB1c3VhbGx5CisJZXhjZXB0IHRoZSB0aXRsZSBsaW5lIHdoaWNoIGNvbWVzIGZyb20gZS1tYWlsIFN1YmplY3QuCisKKzxwYXRjaD46OgorCVRoZSBwYXRjaCBleHRyYWN0ZWQgZnJvbSBlLW1haWwuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1haWxzcGxpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsc3BsaXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMWQ2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsc3BsaXQudHh0CkBAIC0wLDAgKzEsNTIgQEAKK2dpdC1tYWlsc3BsaXQoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1haWxzcGxpdCAtIFNpbXBsZSBVTklYIG1ib3ggc3BsaXR0ZXIgcHJvZ3JhbQorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWFpbHNwbGl0JyBbLWJdIFstZjxubj5dIFstZDxwcmVjPl0gLW88ZGlyZWN0b3J5PiBbLS1dIFs8bWJveD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU3BsaXRzIGEgbWJveCBmaWxlIGludG8gYSBsaXN0IG9mIGZpbGVzOiAiMDAwMSIgIjAwMDIiIC4uICBpbiB0aGUgc3BlY2lmaWVkCitkaXJlY3Rvcnkgc28geW91IGNhbiBwcm9jZXNzIHRoZW0gZnVydGhlciBmcm9tIHRoZXJlLgorCitPUFRJT05TCistLS0tLS0tCis8bWJveD46OgorCU1ib3ggZmlsZSB0byBzcGxpdC4gIElmIG5vdCBnaXZlbiwgdGhlIG1ib3ggaXMgcmVhZCBmcm9tCisJdGhlIHN0YW5kYXJkIGlucHV0LgorCis8ZGlyZWN0b3J5Pjo6CisJRGlyZWN0b3J5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbmRpdmlkdWFsIG1lc3NhZ2VzLgorCistYjo6CisJSWYgYW55IGZpbGUgZG9lc24ndCBiZWdpbiB3aXRoIGEgRnJvbSBsaW5lLCBhc3N1bWUgaXQgaXMgYQorCXNpbmdsZSBtYWlsIG1lc3NhZ2UgaW5zdGVhZCBvZiBzaWduYWxpbmcgZXJyb3IuCisKKy1kPHByZWM+OjoKKwlJbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQgZGlnaXRzIHdpdGggbGVhZGluZyB6ZXJvcywKKwlkaWZmZXJlbnQgcHJlY2lzaW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIHRoZSBnZW5lcmF0ZWQKKwlmaWxlbmFtZXMuCisKKy1mPG5uPjo6CisJU2tpcCB0aGUgZmlyc3QgPG5uPiBudW1iZXJzLCBmb3IgZXhhbXBsZSBpZiAtZjMgaXMgc3BlY2lmaWVkLAorCXN0YXJ0IHRoZSBudW1iZXJpbmcgd2l0aCAwMDA0LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CithbmQgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1iYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTkwYWVkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LW1lcmdlLWJhc2UoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1iYXNlIC0gRmluZCBhcyBnb29kIGNvbW1vbiBhbmNlc3RvcnMgYXMgcG9zc2libGUgZm9yIGEgbWVyZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2UtYmFzZScgWy0tYWxsXSA8Y29tbWl0PiA8Y29tbWl0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworImdpdC1tZXJnZS1iYXNlIiBmaW5kcyBhcyBnb29kIGEgY29tbW9uIGFuY2VzdG9yIGFzIHBvc3NpYmxlIGJldHdlZW4KK3RoZSB0d28gY29tbWl0cy4gVGhhdCBpcywgZ2l2ZW4gdHdvIGNvbW1pdHMgQSBhbmQgQiAnZ2l0LW1lcmdlLWJhc2UgQQorQicgd2lsbCBvdXRwdXQgYSBjb21taXQgd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gYm90aCBBIGFuZCBCIHRocm91Z2gKK3RoZSBwYXJlbnQgcmVsYXRpb25zaGlwLgorCitHaXZlbiBhIHNlbGVjdGlvbiBvZiBlcXVhbGx5IGdvb2QgY29tbW9uIGFuY2VzdG9ycyBpdCBzaG91bGQgbm90IGJlCityZWxpZWQgb24gdG8gZGVjaWRlIGluIGFueSBwYXJ0aWN1bGFyIHdheS4KKworVGhlICJnaXQtbWVyZ2UtYmFzZSIgYWxnb3JpdGhtIGlzIHN0aWxsIGluIGZsdXggLSB1c2UgdGhlIHNvdXJjZS4uLgorCitPUFRJT05TCistLS0tLS0tCistLWFsbDo6CisJT3V0cHV0IGFsbCBjb21tb24gYW5jZXN0b3JzIGZvciB0aGUgdHdvIGNvbW1pdHMgaW5zdGVhZCBvZgorCWp1c3Qgb25lLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg4MmFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtZmlsZS50eHQKQEAgLTAsMCArMSw5MiBAQAorZ2l0LW1lcmdlLWZpbGUoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1maWxlIC0gUnVuIGEgdGhyZWUtd2F5IGZpbGUgbWVyZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbWVyZ2UtZmlsZScgWy1MIDxjdXJyZW50LW5hbWU+IFstTCA8YmFzZS1uYW1lPiBbLUwgPG90aGVyLW5hbWU+XV1dCisJWy1wfC0tc3Rkb3V0XSBbLXF8LS1xdWlldF0gPGN1cnJlbnQtZmlsZT4gPGJhc2UtZmlsZT4gPG90aGVyLWZpbGU+CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitnaXQtZmlsZS1tZXJnZSBpbmNvcnBvcmF0ZXMgYWxsIGNoYW5nZXMgdGhhdCBsZWFkIGZyb20gdGhlIGA8YmFzZS1maWxlPmAKK3RvIGA8b3RoZXItZmlsZT5gIGludG8gYDxjdXJyZW50LWZpbGU+YC4gVGhlIHJlc3VsdCBvcmRpbmFyaWx5IGdvZXMgaW50bworYDxjdXJyZW50LWZpbGU+YC4gZ2l0LW1lcmdlLWZpbGUgaXMgdXNlZnVsIGZvciBjb21iaW5pbmcgc2VwYXJhdGUgY2hhbmdlcwordG8gYW4gb3JpZ2luYWwuIFN1cHBvc2UgYDxiYXNlLWZpbGU+YCBpcyB0aGUgb3JpZ2luYWwsIGFuZCBib3RoCitgPGN1cnJlbnQtZmlsZT5gIGFuZCBgPG90aGVyLWZpbGU+YCBhcmUgbW9kaWZpY2F0aW9ucyBvZiBgPGJhc2UtZmlsZT5gLgorVGhlbiBnaXQtbWVyZ2UtZmlsZSBjb21iaW5lcyBib3RoIGNoYW5nZXMuCisKK0EgY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggYDxjdXJyZW50LWZpbGU+YCBhbmQgYDxvdGhlci1maWxlPmAgaGF2ZSBjaGFuZ2VzCitpbiBhIGNvbW1vbiBzZWdtZW50IG9mIGxpbmVzLiBJZiBhIGNvbmZsaWN0IGlzIGZvdW5kLCBnaXQtbWVyZ2UtZmlsZQorbm9ybWFsbHkgb3V0cHV0cyBhIHdhcm5pbmcgYW5kIGJyYWNrZXRzIHRoZSBjb25mbGljdCB3aXRoIDw8PDw8PDwgYW5kCis+Pj4+Pj4+IGxpbmVzLiBBIHR5cGljYWwgY29uZmxpY3Qgd2lsbCBsb29rIGxpa2UgdGhpczoKKworCTw8PDw8PDwgQQorCWxpbmVzIGluIGZpbGUgQQorCT09PT09PT0KKwlsaW5lcyBpbiBmaWxlIEIKKwk+Pj4+Pj4+IEIKKworSWYgdGhlcmUgYXJlIGNvbmZsaWN0cywgdGhlIHVzZXIgc2hvdWxkIGVkaXQgdGhlIHJlc3VsdCBhbmQgZGVsZXRlIG9uZSBvZgordGhlIGFsdGVybmF0aXZlcy4KKworVGhlIGV4aXQgdmFsdWUgb2YgdGhpcyBwcm9ncmFtIGlzIG5lZ2F0aXZlIG9uIGVycm9yLCBhbmQgdGhlIG51bWJlciBvZgorY29uZmxpY3RzIG90aGVyd2lzZS4gSWYgdGhlIG1lcmdlIHdhcyBjbGVhbiwgdGhlIGV4aXQgdmFsdWUgaXMgMC4KKworZ2l0LW1lcmdlLWZpbGUgaXMgZGVzaWduZWQgdG8gYmUgYSBtaW5pbWFsIGNsb25lIG9mIFJDUyBtZXJnZSwgdGhhdCBpcywgaXQKK2ltcGxlbWVudHMgYWxsIG9mIFJDUyBtZXJnZSdzIGZ1bmN0aW9uYWxpdHkgd2hpY2ggaXMgbmVlZGVkIGJ5CitnaXRsaW5rOmdpdFsxXS4KKworCitPUFRJT05TCistLS0tLS0tCisKKy1MIDxsYWJlbD46OgorCVRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiB1cCB0byB0aHJlZSB0aW1lcywgYW5kCisJc3BlY2lmaWVzIGxhYmVscyB0byBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZQorCWNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lcyBpbiBjb25mbGljdCByZXBvcnRzLiBUaGF0IGlzLAorCWBnaXQtbWVyZ2UtZmlsZSAtTCB4IC1MIHkgLUwgeiBhIGIgY2AgZ2VuZXJhdGVzIG91dHB1dCB0aGF0CisJbG9va3MgbGlrZSBpdCBjYW1lIGZyb20gZmlsZXMgeCwgeSBhbmQgeiBpbnN0ZWFkIG9mCisJZnJvbSBmaWxlcyBhLCBiIGFuZCBjLgorCistcDo6CisJU2VuZCByZXN1bHRzIHRvIHN0YW5kYXJkIG91dHB1dCBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nCisJYDxjdXJyZW50LWZpbGU+YC4KKworLXE6OgorCVF1aWV0OyAgZG8gIG5vdCAgd2FybiBhYm91dCBjb25mbGljdHMuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK2dpdCBtZXJnZS1maWxlIFJFQURNRS5teSBSRUFETUUgUkVBRE1FLnVwc3RyZWFtOjoKKworCWNvbWJpbmVzIHRoZSBjaGFuZ2VzIG9mIFJFQURNRS5teSBhbmQgUkVBRE1FLnVwc3RyZWFtIHNpbmNlIFJFQURNRSwKKwl0cmllcyB0byBtZXJnZSB0aGVtIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbnRvIFJFQURNRS5teS4KKworZ2l0IG1lcmdlLWZpbGUgLUwgYSAtTCBiIC1MIGMgdG1wL2ExMjMgdG1wL2IyMzQgdG1wL2MzNDU6OgorCisJbWVyZ2VzIHRtcC9hMTIzIGFuZCB0bXAvYzM0NSB3aXRoIHRoZSBiYXNlIHRtcC9iMjM0LCBidXQgdXNlcyBsYWJlbHMKKwlgYWAgYW5kIGBjYCBpbnN0ZWFkIG9mIGB0bXAvYTEyM2AgYW5kIGB0bXAvYzM0NWAuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPiwKK3dpdGggcGFydHMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGRvY3VtZW50YXRpb24gb2YgUkNTIG1lcmdlLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVlMWZmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtaW5kZXgudHh0CkBAIC0wLDAgKzEsODggQEAKK2dpdC1tZXJnZS1pbmRleCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1pbmRleCAtIFJ1biBhIG1lcmdlIGZvciBmaWxlcyBuZWVkaW5nIG1lcmdpbmcKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2UtaW5kZXgnIFstb10gWy1xXSA8bWVyZ2UtcHJvZ3JhbT4gKC1hIHwgXC0tIHwgPGZpbGU+XCopCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBsb29rcyB1cCB0aGUgPGZpbGU+KHMpIGluIHRoZSBpbmRleCBhbmQsIGlmIHRoZXJlIGFyZSBhbnkgbWVyZ2UKK2VudHJpZXMsIHBhc3NlcyB0aGUgU0hBMSBoYXNoIGZvciB0aG9zZSBmaWxlcyBhcyBhcmd1bWVudHMgMSwgMiwgMyAoZW1wdHkKK2FyZ3VtZW50IGlmIG5vIGZpbGUpLCBhbmQgPGZpbGU+IGFzIGFyZ3VtZW50IDQuICBGaWxlIG1vZGVzIGZvciB0aGUgdGhyZWUKK2ZpbGVzIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIDUsIDYgYW5kIDcuCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworLWE6OgorCVJ1biBtZXJnZSBhZ2FpbnN0IGFsbCBmaWxlcyBpbiB0aGUgaW5kZXggdGhhdCBuZWVkIG1lcmdpbmcuCisKKy1vOjoKKwlJbnN0ZWFkIG9mIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBmYWlsZWQgbWVyZ2UsIGRvIGFsbCBvZiB0aGVtCisJaW4gb25lIHNob3QgLSBjb250aW51ZSB3aXRoIG1lcmdpbmcgZXZlbiB3aGVuIHByZXZpb3VzIG1lcmdlcworCXJldHVybmVkIGVycm9ycywgYW5kIG9ubHkgcmV0dXJuIHRoZSBlcnJvciBjb2RlIGFmdGVyIGFsbCB0aGUKKwltZXJnZXMgYXJlIG92ZXIuCisKKy1xOjoKKwlEbyBub3QgY29tcGxhaW4gYWJvdXQgZmFpbGVkIG1lcmdlIHByb2dyYW0gKHRoZSBtZXJnZSBwcm9ncmFtCisJZmFpbHVyZSB1c3VhbGx5IGluZGljYXRlcyBjb25mbGljdHMgZHVyaW5nIG1lcmdlKS4gVGhpcyBpcyBmb3IKKwlwb3JjZWxhaW5zIHdoaWNoIG1pZ2h0IHdhbnQgdG8gZW1pdCBjdXN0b20gbWVzc2FnZXMuCisKK0lmICJnaXQtbWVyZ2UtaW5kZXgiIGlzIGNhbGxlZCB3aXRoIG11bHRpcGxlIDxmaWxlPnMgKG9yIC1hKSB0aGVuIGl0Citwcm9jZXNzZXMgdGhlbSBpbiB0dXJuIG9ubHkgc3RvcHBpbmcgaWYgbWVyZ2UgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQKK2NvZGUuCisKK1R5cGljYWxseSB0aGlzIGlzIHJ1biB3aXRoIHRoZSBhIHNjcmlwdCBjYWxsaW5nIGdpdCdzIGltaXRhdGlvbiBvZgordGhlIG1lcmdlIGNvbW1hbmQgZnJvbSB0aGUgUkNTIHBhY2thZ2UuCisKK0Egc2FtcGxlIHNjcmlwdCBjYWxsZWQgImdpdC1tZXJnZS1vbmUtZmlsZSIgaXMgaW5jbHVkZWQgaW4gdGhlCitkaXN0cmlidXRpb24uCisKK0FMRVJUIEFMRVJUIEFMRVJUISBUaGUgZ2l0ICJtZXJnZSBvYmplY3Qgb3JkZXIiIGlzIGRpZmZlcmVudCBmcm9tIHRoZQorUkNTICJtZXJnZSIgcHJvZ3JhbSBtZXJnZSBvYmplY3Qgb3JkZXIuIEluIHRoZSBhYm92ZSBvcmRlcmluZywgdGhlCitvcmlnaW5hbCBpcyBmaXJzdC4gQnV0IHRoZSBhcmd1bWVudCBvcmRlciB0byB0aGUgMy13YXkgbWVyZ2UgcHJvZ3JhbQorIm1lcmdlIiBpcyB0byBoYXZlIHRoZSBvcmlnaW5hbCBpbiB0aGUgbWlkZGxlLiBEb24ndCBhc2sgbWUgd2h5LgorCitFeGFtcGxlczoKKworICB0b3J2YWxkc0BwcGM5NzA6fi9tZXJnZS10ZXN0PiBnaXQtbWVyZ2UtaW5kZXggY2F0IE1NCisgIFRoaXMgaXMgTU0gZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4JCQkjIG9yaWdpbmFsCisgIFRoaXMgaXMgbW9kaWZpZWQgTU0gaW4gdGhlIGJyYW5jaCBBLgkJCSMgbWVyZ2UxCisgIFRoaXMgaXMgbW9kaWZpZWQgTU0gaW4gdGhlIGJyYW5jaCBCLgkJCSMgbWVyZ2UyCisgIFRoaXMgaXMgbW9kaWZpZWQgTU0gaW4gdGhlIGJyYW5jaCBCLgkJCSMgY3VycmVudCBjb250ZW50cworCitvciAKKworICB0b3J2YWxkc0BwcGM5NzA6fi9tZXJnZS10ZXN0PiBnaXQtbWVyZ2UtaW5kZXggY2F0IEFBIE1NCisgIGNhdDogOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgIFRoaXMgaXMgYWRkZWQgQUEgaW4gdGhlIGJyYW5jaCBBLgorICBUaGlzIGlzIGFkZGVkIEFBIGluIHRoZSBicmFuY2ggQi4KKyAgVGhpcyBpcyBhZGRlZCBBQSBpbiB0aGUgYnJhbmNoIEIuCisgIGZhdGFsOiBtZXJnZSBwcm9ncmFtIGZhaWxlZAorCit3aGVyZSB0aGUgbGF0dGVyIGV4YW1wbGUgc2hvd3MgaG93ICJnaXQtbWVyZ2UtaW5kZXgiIHdpbGwgc3RvcCB0cnlpbmcgdG8KK21lcmdlIG9uY2UgYW55dGhpbmcgaGFzIHJldHVybmVkIGFuIGVycm9yIChpLmUuLCAiY2F0IiByZXR1cm5lZCBhbiBlcnJvcgorZm9yIHRoZSBBQSBmaWxlLCBiZWNhdXNlIGl0IGRpZG4ndCBleGlzdCBpbiB0aGUgb3JpZ2luYWwsIGFuZCB0aHVzCisiZ2l0LW1lcmdlLWluZGV4IiBkaWRuJ3QgZXZlbiB0cnkgdG8gbWVyZ2UgdGhlIE1NIHRoaW5nKS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorT25lLXNob3QgbWVyZ2UgYnkgUGV0ciBCYXVkaXMgPHBhc2t5QHVjdy5jej4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1vbmUtZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1vbmUtZmlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYWIzYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLW9uZS1maWxlLnR4dApAQCAtMCwwICsxLDMwIEBACitnaXQtbWVyZ2Utb25lLWZpbGUoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2Utb25lLWZpbGUgLSBUaGUgc3RhbmRhcmQgaGVscGVyIHByb2dyYW0gdG8gdXNlIHdpdGggZ2l0LW1lcmdlLWluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLW9uZS1maWxlJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIHN0YW5kYXJkIGhlbHBlciBwcm9ncmFtIHRvIHVzZSB3aXRoICJnaXQtbWVyZ2UtaW5kZXgiCit0byByZXNvbHZlIGEgbWVyZ2UgYWZ0ZXIgdGhlIHRyaXZpYWwgbWVyZ2UgZG9uZSB3aXRoICJnaXQtcmVhZC10cmVlIC1tIi4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIFBldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmI0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dApAQCAtMCwwICsxLDM3IEBACitnaXQtbWVyZ2UtdHJlZSgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1lcmdlLXRyZWUgLSBTaG93IHRocmVlLXdheSBtZXJnZSB3aXRob3V0IHRvdWNoaW5nIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLXRyZWUnIDxiYXNlLXRyZWU+IDxicmFuY2gxPiA8YnJhbmNoMj4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aHJlZSB0cmVlaXNoLCBhbmQgb3V0cHV0IHRyaXZpYWwgbWVyZ2UgcmVzdWx0cyBhbmQKK2NvbmZsaWN0aW5nIHN0YWdlcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgVGhpcyBpcyBzaW1pbGFyIHRvCit3aGF0IHRocmVlLXdheSByZWFkLXRyZWUgLW0gZG9lcywgYnV0IGluc3RlYWQgb2Ygc3RvcmluZyB0aGUKK3Jlc3VsdHMgaW4gdGhlIGluZGV4LCB0aGUgY29tbWFuZCBvdXRwdXRzIHRoZSBlbnRyaWVzIHRvIHRoZQorc3RhbmRhcmQgb3V0cHV0LgorCitUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgaGlnaGVyIGxldmVsIHNjcmlwdHMgdG8gY29tcHV0ZQorbWVyZ2UgcmVzdWx0cyBvdXRzaWRlIGluZGV4LCBhbmQgc3R1ZmYgdGhlIHJlc3VsdHMgYmFjayBpbnRvIHRoZQoraW5kZXguICBGb3IgdGhpcyByZWFzb24sIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBvbWl0cworZW50cmllcyB0aGF0IG1hdGNoIDxicmFuY2gxPiB0cmVlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMDhlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS50eHQKQEAgLTAsMCArMSwxNjAgQEAKK2dpdC1tZXJnZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZSAtIEpvaW4gdHdvIG9yIG1vcmUgZGV2ZWxvcG1lbnQgaGlzdG9yaWVzIHRvZ2V0aGVyCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LW1lcmdlJyBbLW5dIFstLW5vLWNvbW1pdF0gWy0tc3F1YXNoXSBbLXMgPHN0cmF0ZWd5Pl0uLi4KKwlbLW0gPG1zZz5dIDxyZW1vdGU+IDxyZW1vdGU+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgdG9wLWxldmVsIGludGVyZmFjZSB0byB0aGUgbWVyZ2UgbWFjaGluZXJ5Cit3aGljaCBkcml2ZXMgbXVsdGlwbGUgbWVyZ2Ugc3RyYXRlZ3kgc2NyaXB0cy4KKworCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjptZXJnZS1vcHRpb25zLnR4dFtdCisKKzxtc2c+OjoKKwlUaGUgY29tbWl0IG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1lcmdlIGNvbW1pdCAoaW4gY2FzZQorCWl0IGlzIGNyZWF0ZWQpLiBUaGUgYGdpdC1mbXQtbWVyZ2UtbXNnYCBzY3JpcHQgY2FuIGJlIHVzZWQKKwl0byBnaXZlIGEgZ29vZCBkZWZhdWx0IGZvciBhdXRvbWF0ZWQgYGdpdC1tZXJnZWAgaW52b2NhdGlvbnMuCisKKzxoZWFkPjo6CisJT3VyIGJyYW5jaCBoZWFkIGNvbW1pdC4gIFRoaXMgaGFzIHRvIGJlIGBIRUFEYCwgc28gbmV3CisJc3ludGF4IGRvZXMgbm90IHJlcXVpcmUgaXQKKworPHJlbW90ZT46OgorCU90aGVyIGJyYW5jaCBoZWFkIG1lcmdlZCBpbnRvIG91ciBicmFuY2guICBZb3UgbmVlZCBhdAorCWxlYXN0IG9uZSA8cmVtb3RlPi4gIFNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSA8cmVtb3RlPgorCW9idmlvdXNseSBtZWFucyB5b3UgYXJlIHRyeWluZyBhbiBPY3RvcHVzLgorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKKworSWYgeW91IHRyaWVkIGEgbWVyZ2Ugd2hpY2ggcmVzdWx0ZWQgaW4gYSBjb21wbGV4IGNvbmZsaWN0cyBhbmQKK3dvdWxkIHdhbnQgdG8gc3RhcnQgb3ZlciwgeW91IGNhbiByZWNvdmVyIHdpdGgKK2dpdGxpbms6Z2l0LXJlc2V0WzFdLgorCisKK0hPVyBNRVJHRSBXT1JLUworLS0tLS0tLS0tLS0tLS0tCisKK0EgbWVyZ2UgaXMgYWx3YXlzIGJldHdlZW4gdGhlIGN1cnJlbnQgYEhFQURgIGFuZCBvbmUgb3IgbW9yZQorcmVtb3RlIGJyYW5jaCBoZWFkcywgYW5kIHRoZSBpbmRleCBmaWxlIG11c3QgZXhhY3RseSBtYXRjaCB0aGUKK3RyZWUgb2YgYEhFQURgIGNvbW1pdCAoaS5lLiB0aGUgY29udGVudHMgb2YgdGhlIGxhc3QgY29tbWl0KSB3aGVuCitpdCBoYXBwZW5zLiAgSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZiAtLWNhY2hlZCBIRUFEYCBtdXN0CityZXBvcnQgbm8gY2hhbmdlcy4KKworW05PVEVdCitUaGlzIGlzIGEgYml0IG9mIGxpZS4gIEluIGNlcnRhaW4gc3BlY2lhbCBjYXNlcywgeW91ciBpbmRleCBhcmUKK2FsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIHRyZWUgb2YgYEhFQURgIGNvbW1pdC4gIFRoZSBtb3N0Citub3RhYmxlIGNhc2UgaXMgd2hlbiB5b3VyIGBIRUFEYCBjb21taXQgaXMgYWxyZWFkeSBhaGVhZCBvZiB3aGF0CitpcyBiZWluZyBtZXJnZWQsIGluIHdoaWNoIGNhc2UgeW91ciBpbmRleCBjYW4gaGF2ZSBhcmJpdHJhcnkKK2RpZmZlcmVuY2UgZnJvbSB5b3VyIGBIRUFEYCBjb21taXQuICBPdGhlcndpc2UsIHlvdXIgaW5kZXggZW50cmllcworYXJlIGFsbG93ZWQgaGF2ZSBkaWZmZXJlbmNlcyBmcm9tIHlvdXIgYEhFQURgIGNvbW1pdCB0aGF0IG1hdGNoCit0aGUgcmVzdWx0IG9mIHRyaXZpYWwgbWVyZ2UgKGUuZy4geW91IHJlY2VpdmVkIHRoZSBzYW1lIHBhdGNoCitmcm9tIGV4dGVybmFsIHNvdXJjZSB0byBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdCBhcyB3aGF0IHlvdSBhcmUKK21lcmdpbmcpLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0aCBkaWQgbm90IGV4aXN0IGluIHRoZSBjb21tb24KK2FuY2VzdG9yIGFuZCB5b3VyIGhlYWQgY29tbWl0IGJ1dCBleGlzdHMgaW4gdGhlIHRyZWUgeW91IGFyZQorbWVyZ2luZyBpbnRvIHlvdXIgcmVwb3NpdG9yeSwgYW5kIGlmIHlvdSBhbHJlYWR5IGhhcHBlbiB0byBoYXZlCit0aGF0IHBhdGggZXhhY3RseSBpbiB5b3VyIGluZGV4LCB0aGUgbWVyZ2UgZG9lcyBub3QgaGF2ZSB0bworZmFpbC4KKworT3RoZXJ3aXNlLCBtZXJnZSB3aWxsIHJlZnVzZSB0byBkbyBhbnkgaGFybSB0byB5b3VyIHJlcG9zaXRvcnkKKyh0aGF0IGlzLCBpdCBtYXkgZmV0Y2ggdGhlIG9iamVjdHMgZnJvbSByZW1vdGUsIGFuZCBpdCBtYXkgZXZlbgordXBkYXRlIHRoZSBsb2NhbCBicmFuY2ggdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSByZW1vdGUgYnJhbmNoCit3aXRoIGBnaXQgcHVsbCByZW1vdGUgcmJyYW5jaDpsYnJhbmNoYCwgYnV0IHlvdXIgd29ya2luZyB0cmVlLAorYC5naXQvSEVBRGAgcG9pbnRlciBhbmQgaW5kZXggZmlsZSBhcmUgbGVmdCBpbnRhY3QpLgorCitZb3UgbWF5IGhhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLiAgSW4KK290aGVyIHdvcmRzLCBgZ2l0LWRpZmZgIGlzIGFsbG93ZWQgdG8gcmVwb3J0IGNoYW5nZXMuCitIb3dldmVyLCB0aGUgbWVyZ2UgdXNlcyB5b3VyIHdvcmtpbmcgdHJlZSBhcyB0aGUgd29ya2luZyBhcmVhLAorYW5kIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIG1lcmdlIG9wZXJhdGlvbiBmcm9tIGxvc2luZyBzdWNoCitjaGFuZ2VzLCBpdCBtYWtlcyBzdXJlIHRoYXQgdGhleSBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlCittZXJnZS4gVGhvc2UgY29tcGxleCB0YWJsZXMgaW4gcmVhZC10cmVlIGRvY3VtZW50YXRpb24gZGVmaW5lCit3aGF0IGl0IG1lYW5zIGZvciBhIHBhdGggdG8gImludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSIuICBBbmQgaWYKK3lvdXIgbG9jYWwgbW9kaWZpY2F0aW9ucyBpbnRlcmZlcmUgd2l0aCB0aGUgbWVyZ2UsIGFnYWluLCBpdAorc3RvcHMgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgorCitTbyBpbiB0aGUgYWJvdmUgdHdvICJmYWlsZWQgbWVyZ2UiIGNhc2UsIHlvdSBkbyBub3QgaGF2ZSB0bword29ycnkgYWJvdXQgbG9zcyBvZiBkYXRhIC0tLSB5b3Ugc2ltcGx5IHdlcmUgbm90IHJlYWR5IHRvIGRvCithIG1lcmdlLCBzbyBubyBtZXJnZSBoYXBwZW5lZCBhdCBhbGwuICBZb3UgbWF5IHdhbnQgdG8gZmluaXNoCit3aGF0ZXZlciB5b3Ugd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nLCBhbmQgcmV0cnkgdGhlIHNhbWUKK3B1bGwgYWZ0ZXIgeW91IGFyZSBkb25lIGFuZCByZWFkeS4KKworV2hlbiB0aGluZ3MgY2xlYW5seSBtZXJnZSwgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKworMS4gdGhlIHJlc3VsdHMgYXJlIHVwZGF0ZWQgYm90aCBpbiB0aGUgaW5kZXggZmlsZSBhbmQgaW4geW91cgorICAgd29ya2luZyB0cmVlLAorMi4gaW5kZXggZmlsZSBpcyB3cml0dGVuIG91dCBhcyBhIHRyZWUsCiszLiB0aGUgdHJlZSBnZXRzIGNvbW1pdHRlZCwgYW5kIAorNC4gdGhlIGBIRUFEYCBwb2ludGVyIGdldHMgYWR2YW5jZWQuCisKK0JlY2F1c2Ugb2YgMi4sIHdlIHJlcXVpcmUgdGhhdCB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIGluZGV4CitmaWxlIHRvIG1hdGNoIGV4YWN0bHkgdGhlIGN1cnJlbnQgYEhFQURgIGNvbW1pdDsgb3RoZXJ3aXNlIHdlCit3aWxsIHdyaXRlIG91dCB5b3VyIGxvY2FsIGNoYW5nZXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHlvdXIKK2luZGV4IGZpbGUgYWxvbmcgd2l0aCB0aGUgbWVyZ2UgcmVzdWx0LCB3aGljaCBpcyBub3QgZ29vZC4KK0JlY2F1c2UgMS4gaW52b2x2ZXMgb25seSB0aGUgcGF0aHMgZGlmZmVyZW50IGJldHdlZW4geW91cgorYnJhbmNoIGFuZCB0aGUgcmVtb3RlIGJyYW5jaCB5b3UgYXJlIHB1bGxpbmcgZnJvbSBkdXJpbmcgdGhlCittZXJnZSAod2hpY2ggaXMgdHlwaWNhbGx5IGEgZnJhY3Rpb24gb2YgdGhlIHdob2xlIHRyZWUpLCB5b3UgY2FuCitoYXZlIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4geW91ciB3b3JraW5nIHRyZWUgYXMgbG9uZyBhcyB0aGV5IGRvCitub3Qgb3ZlcmxhcCB3aXRoIHdoYXQgdGhlIG1lcmdlIHVwZGF0ZXMuCisKK1doZW4gdGhlcmUgYXJlIGNvbmZsaWN0cywgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKworMS4gYEhFQURgIHN0YXlzIHRoZSBzYW1lLgorCisyLiBDbGVhbmx5IG1lcmdlZCBwYXRocyBhcmUgdXBkYXRlZCBib3RoIGluIHRoZSBpbmRleCBmaWxlIGFuZAorICAgaW4geW91ciB3b3JraW5nIHRyZWUuCisKKzMuIEZvciBjb25mbGljdGluZyBwYXRocywgdGhlIGluZGV4IGZpbGUgcmVjb3JkcyB1cCB0byB0aHJlZQorICAgdmVyc2lvbnM7IHN0YWdlMSBzdG9yZXMgdGhlIHZlcnNpb24gZnJvbSB0aGUgY29tbW9uIGFuY2VzdG9yLAorICAgc3RhZ2UyIGZyb20gYEhFQURgLCBhbmQgc3RhZ2UzIGZyb20gdGhlIHJlbW90ZSBicmFuY2ggKHlvdQorICAgY2FuIGluc3BlY3QgdGhlIHN0YWdlcyB3aXRoIGBnaXQtbHMtZmlsZXMgLXVgKS4gIFRoZSB3b3JraW5nCisgICB0cmVlIGZpbGVzIGhhdmUgdGhlIHJlc3VsdCBvZiAibWVyZ2UiIHByb2dyYW07IGkuZS4gMy13YXkKKyAgIG1lcmdlIHJlc3VsdCB3aXRoIGZhbWlsaWFyIGNvbmZsaWN0IG1hcmtlcnMgYDw8PCA9PT0gPj4+YC4KKworNC4gTm8gb3RoZXIgY2hhbmdlcyBhcmUgZG9uZS4gIEluIHBhcnRpY3VsYXIsIHRoZSBsb2NhbAorICAgbW9kaWZpY2F0aW9ucyB5b3UgaGFkIGJlZm9yZSB5b3Ugc3RhcnRlZCBtZXJnZSB3aWxsIHN0YXkgdGhlCisgICBzYW1lIGFuZCB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlbSBzdGF5IGFzIHRoZXkgd2VyZSwKKyAgIGkuZS4gbWF0Y2hpbmcgYEhFQURgLgorCitBZnRlciBzZWVpbmcgYSBjb25mbGljdCwgeW91IGNhbiBkbyB0d28gdGhpbmdzOgorCisgKiBEZWNpZGUgbm90IHRvIG1lcmdlLiAgVGhlIG9ubHkgY2xlYW4tdXAgeW91IG5lZWQgYXJlIHRvIHJlc2V0CisgICB0aGUgaW5kZXggZmlsZSB0byB0aGUgYEhFQURgIGNvbW1pdCB0byByZXZlcnNlIDIuIGFuZCB0byBjbGVhbgorICAgdXAgd29ya2luZyB0cmVlIGNoYW5nZXMgbWFkZSBieSAyLiBhbmQgMy47IGBnaXQtcmVzZXRgIGNhbgorICAgYmUgdXNlZCBmb3IgdGhpcy4KKworICogUmVzb2x2ZSB0aGUgY29uZmxpY3RzLiAgYGdpdC1kaWZmYCB3b3VsZCByZXBvcnQgb25seSB0aGUKKyAgIGNvbmZsaWN0aW5nIHBhdGhzIGJlY2F1c2Ugb2YgdGhlIGFib3ZlIDIuIGFuZCAzLi4gIEVkaXQgdGhlCisgICB3b3JraW5nIHRyZWUgZmlsZXMgaW50byBhIGRlc2lyYWJsZSBzaGFwZSwgYGdpdC1hZGRgIG9yIGBnaXQtcm1gCisgICB0aGVtLCB0byBtYWtlIHRoZSBpbmRleCBmaWxlIGNvbnRhaW4gd2hhdCB0aGUgbWVyZ2UgcmVzdWx0CisgICBzaG91bGQgYmUsIGFuZCBydW4gYGdpdC1jb21taXRgIHRvIGNvbW1pdCB0aGUgcmVzdWx0LgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtZm10LW1lcmdlLW1zZ1sxXSwgZ2l0bGluazpnaXQtcHVsbFsxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZXRvb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2V0b29sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQwMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2V0b29sLnR4dApAQCAtMCwwICsxLDQ2IEBACitnaXQtbWVyZ2V0b29sKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZXRvb2wgLSBSdW4gbWVyZ2UgY29uZmxpY3QgcmVzb2x1dGlvbiB0b29scyB0byByZXNvbHZlIG1lcmdlIGNvbmZsaWN0cworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2V0b29sJyBbLS10b29sPTx0b29sPl0gWzxmaWxlPl0uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VzZSAnZ2l0IG1lcmdldG9vbCcgdG8gcnVuIG9uZSBvZiBzZXZlcmFsIG1lcmdlIHV0aWxpdGllcyB0byByZXNvbHZlCittZXJnZSBjb25mbGljdHMuICBJdCBpcyB0eXBpY2FsbHkgcnVuIGFmdGVyIGdpdGxpbms6Z2l0LW1lcmdlWzFdLgorCitJZiBvbmUgb3IgbW9yZSA8ZmlsZT4gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZSBtZXJnZSB0b29sIHByb2dyYW0gd2lsbAorYmUgcnVuIHRvIHJlc29sdmUgZGlmZmVyZW5jZXMgb24gZWFjaCBmaWxlLiAgSWYgbm8gPGZpbGU+IG5hbWVzIGFyZQorc3BlY2lmaWVkLCAnZ2l0IG1lcmdldG9vbCcgd2lsbCBydW4gdGhlIG1lcmdlIHRvb2wgcHJvZ3JhbSBvbiBldmVyeSBmaWxlCit3aXRoIG1lcmdlIGNvbmZsaWN0cy4KKworT1BUSU9OUworLS0tLS0tLQorLXQgb3IgLS10b29sPTx0b29sPjo6CisJVXNlIHRoZSBtZXJnZSByZXNvbHV0aW9uIHByb2dyYW0gc3BlY2lmaWVkIGJ5IDx0b29sPi4KKwlWYWxpZCBtZXJnZSB0b29scyBhcmU6CisJa2RpZmYzLCB0a2RpZmYsIG1lbGQsIHh4ZGlmZiwgZW1lcmdlLCB2aW1kaWZmLCBhbmQgb3BlbmRpZmYKKysKK0lmIGEgbWVyZ2UgcmVzb2x1dGlvbiBwcm9ncmFtIGlzIG5vdCBzcGVjaWZpZWQsICdnaXQgbWVyZ2V0b29sJword2lsbCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgbWVyZ2UudG9vbC4gIElmIHRoZQorY29uZmlndXJhdGlvbiB2YXJpYWJsZSBtZXJnZS50b29sIGlzIG5vdCBzZXQsICdnaXQgbWVyZ2V0b29sJword2lsbCBwaWNrIGEgc3VpdGFibGUgZGVmYXVsdC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgVGhlb2RvcmUgWSBUcydvIDx0eXRzb0BtaXQuZWR1PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBUaGVvZG9yZSBZIFRzJ28uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MGEzZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdGFnLnR4dApAQCAtMCwwICsxLDQ3IEBACitnaXQtbWt0YWcoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWt0YWcgLSBDcmVhdGVzIGEgdGFnIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ta3RhZycgPCBzaWduYXR1cmVfZmlsZQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGEgdGFnIGNvbnRlbnRzIG9uIHN0YW5kYXJkIGlucHV0IGFuZCBjcmVhdGVzIGEgdGFnIG9iamVjdAordGhhdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNpZ24gb3RoZXIgb2JqZWN0cy4KKworVGhlIG91dHB1dCBpcyB0aGUgbmV3IHRhZydzIDxvYmplY3Q+IGlkZW50aWZpZXIuCisKK1RhZyBGb3JtYXQKKy0tLS0tLS0tLS0KK0EgdGFnIHNpZ25hdHVyZSBmaWxlIGhhcyBhIHZlcnkgc2ltcGxlIGZpeGVkIGZvcm1hdDogdGhyZWUgbGluZXMgb2YKKworICBvYmplY3QgPHNoYTE+CisgIHR5cGUgPHR5cGVuYW1lPgorICB0YWcgPHRhZ25hbWU+CisKK2ZvbGxvd2VkIGJ5IHNvbWUgJ29wdGlvbmFsJyBmcmVlLWZvcm0gc2lnbmF0dXJlIHRoYXQgZ2l0IGl0c2VsZgorZG9lc24ndCBjYXJlIGFib3V0LCBidXQgdGhhdCBjYW4gYmUgdmVyaWZpZWQgd2l0aCBncGcgb3Igc2ltaWxhci4KKworVGhlIHNpemUgb2YgdGhlIGZ1bGwgb2JqZWN0IGlzIGFydGlmaWNpYWxseSBsaW1pdGVkIHRvIDhrQi4gIChKdXN0CitiZWNhdXNlIEknbSBhIGxhenkgYmFzdGFyZCwgYW5kIGlmIHlvdSBjYW4ndCBmaXQgYSBzaWduYXR1cmUgaW4gdGhhdAorc2l6ZSwgeW91J3JlIGRvaW5nIHNvbWV0aGluZyB3cm9uZykKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5ZWU2MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdHJlZS50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LW1rdHJlZSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWt0cmVlIC0gQnVpbGQgYSB0cmVlLW9iamVjdCBmcm9tIGxzLXRyZWUgZm9ybWF0dGVkIHRleHQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWt0cmVlJyBbLXpdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgc3RhbmRhcmQgaW5wdXQgaW4gbm9uLXJlY3Vyc2l2ZSBgbHMtdHJlZWAgb3V0cHV0IGZvcm1hdCwKK2FuZCBjcmVhdGVzIGEgdHJlZSBvYmplY3QuICBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHRyZWUgb2JqZWN0CitidWlsdCBpcyB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK09QVElPTlMKKy0tLS0tLS0KKy16OjoKKwlSZWFkIHRoZSBOVUwtdGVybWluYXRlZCBgbHMtdHJlZSAtemAgb3V0cHV0IGluc3RlYWQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1NmI3NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW12LnR4dApAQCAtMCwwICsxLDU0IEBACitnaXQtbXYoMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbXYgLSBNb3ZlIG9yIHJlbmFtZSBhIGZpbGUsIGEgZGlyZWN0b3J5LCBvciBhIHN5bWxpbmsKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbXYnIDxvcHRpb25zPi4uLiA8YXJncz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIG1vdmUgb3IgcmVuYW1lIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWxpbmsuCisKKyBnaXQtbXYgWy1mXSBbLW5dIDxzb3VyY2U+IDxkZXN0aW5hdGlvbj4KKyBnaXQtbXYgWy1mXSBbLW5dIFsta10gPHNvdXJjZT4gLi4uIDxkZXN0aW5hdGlvbiBkaXJlY3Rvcnk+CisKK0luIHRoZSBmaXJzdCBmb3JtLCBpdCByZW5hbWVzIDxzb3VyY2U+LCB3aGljaCBtdXN0IGV4aXN0IGFuZCBiZSBlaXRoZXIKK2EgZmlsZSwgc3ltbGluayBvciBkaXJlY3RvcnksIHRvIDxkZXN0aW5hdGlvbj4uCitJbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBsYXN0IGFyZ3VtZW50IGhhcyB0byBiZSBhbiBleGlzdGluZworZGlyZWN0b3J5OyB0aGUgZ2l2ZW4gc291cmNlcyB3aWxsIGJlIG1vdmVkIGludG8gdGhpcyBkaXJlY3RvcnkuCisKK1RoZSBpbmRleCBpcyB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgYnV0IHRoZSBjaGFuZ2UgbXVzdCBzdGlsbCBiZQorY29tbWl0dGVkLgorCitPUFRJT05TCistLS0tLS0tCistZjo6CisJRm9yY2UgcmVuYW1pbmcgb3IgbW92aW5nIG9mIGEgZmlsZSBldmVuIGlmIHRoZSB0YXJnZXQgZXhpc3RzCistazo6CisgICAgICAgIFNraXAgbW92ZSBvciByZW5hbWUgYWN0aW9ucyB3aGljaCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yCisJY29uZGl0aW9uLiBBbiBlcnJvciBoYXBwZW5zIHdoZW4gYSBzb3VyY2UgaXMgbmVpdGhlciBleGlzdGluZyBub3IKKyAgICAgICAgY29udHJvbGxlZCBieSBHSVQsIG9yIHdoZW4gaXQgd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nCisgICAgICAgIGZpbGUgdW5sZXNzICctZicgaXMgZ2l2ZW4uCistbjo6CisJRG8gbm90aGluZzsgb25seSBzaG93IHdoYXQgd291bGQgaGFwcGVuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorUmV3cml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CitNb3ZlIGZ1bmN0aW9uYWxpdHkgYWRkZWQgYnkgSm9zZWYgV2VpZGVuZG9yZmVyIDxKb3NlZi5XZWlkZW5kb3JmZXJAZ214LmRlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM4YmY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbmFtZS1yZXYudHh0CkBAIC0wLDAgKzEsNzIgQEAKK2dpdC1uYW1lLXJldigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1uYW1lLXJldiAtIEZpbmQgc3ltYm9saWMgbmFtZXMgZm9yIGdpdmVuIHJldnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbmFtZS1yZXYnIFstLXRhZ3NdIFstLXJlZnM9PHBhdHRlcm4+XQorCSAgICAgICAoIC0tYWxsIHwgLS1zdGRpbiB8IDxjb21taXR0aXNoPi4uLiApCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmluZHMgc3ltYm9saWMgbmFtZXMgc3VpdGFibGUgZm9yIGh1bWFuIGRpZ2VzdGlvbiBmb3IgcmV2aXNpb25zIGdpdmVuIGluIGFueQorZm9ybWF0IHBhcnNhYmxlIGJ5IGdpdC1yZXYtcGFyc2UuCisKKworT1BUSU9OUworLS0tLS0tLQorCistLXRhZ3M6OgorCURvIG5vdCB1c2UgYnJhbmNoIG5hbWVzLCBidXQgb25seSB0YWdzIHRvIG5hbWUgdGhlIGNvbW1pdHMKKworLS1yZWZzPTxwYXR0ZXJuPjo6CisJT25seSB1c2UgcmVmcyB3aG9zZSBuYW1lcyBtYXRjaCBhIGdpdmVuIHNoZWxsIHBhdHRlcm4uCisKKy0tYWxsOjoKKwlMaXN0IGFsbCBjb21taXRzIHJlYWNoYWJsZSBmcm9tIGFsbCByZWZzCisKKy0tc3RkaW46OgorCVJlYWQgZnJvbSBzdGRpbiwgYXBwZW5kICIoPHJldl9uYW1lPikiIHRvIGFsbCBzaGExJ3Mgb2YgbmFtZWFibGUKKwljb21taXRzLCBhbmQgcGFzcyB0byBzdGRvdXQKKworRVhBTVBMRQorLS0tLS0tLQorCitHaXZlbiBhIGNvbW1pdCwgZmluZCBvdXQgd2hlcmUgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJlZnMuIFNheSBzb21lYm9keQord3JvdGUgeW91IGFib3V0IHRoYXQgZmFudGFzdGljIGNvbW1pdCAzM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhLgorT2YgY291cnNlLCB5b3UgbG9vayBpbnRvIHRoZSBjb21taXQsIGJ1dCB0aGF0IG9ubHkgdGVsbHMgeW91IHdoYXQgaGFwcGVuZWQsIGJ1dAorbm90IHRoZSBjb250ZXh0LgorCitFbnRlciBnaXQtbmFtZS1yZXY6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgbmFtZS1yZXYgMzNkYjVmNGQ5MDI3YTEwZTQ3N2NjZjA1NGIyYzFhYjk0Zjc0Yzg1YQorMzNkYjVmNGQ5MDI3YTEwZTQ3N2NjZjA1NGIyYzFhYjk0Zjc0Yzg1YSB0YWdzL3YwLjk5XjB+OTQwCistLS0tLS0tLS0tLS0KKworTm93IHlvdSBhcmUgd2lzZXIsIGJlY2F1c2UgeW91IGtub3cgdGhhdCBpdCBoYXBwZW5lZCA5NDAgcmV2aXNpb25zIGJlZm9yZSB2MC45OS4KKworQW5vdGhlciBuaWNlIHRoaW5nIHlvdSBjYW4gZG8gaXM6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgbG9nIHwgZ2l0IG5hbWUtcmV2IC0tc3RkaW4KKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKb2hhbm5lcyBTY2hpbmRlbGluLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcDRpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcDRpbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGFiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wNGltcG9ydC50eHQKQEAgLTAsMCArMSwxNjggQEAKK2dpdC1wNGltcG9ydCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wNGltcG9ydCAtIEltcG9ydCBhIFBlcmZvcmNlIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KK2BnaXQtcDRpbXBvcnRgIFstcXwtdl0gWy0tbm90YWdzXSBbLS1hdXRob3JzIDxmaWxlPl0gWy10IDx0aW1lem9uZT5dCisgICAgICAgICAgICAgICA8Ly9wNHJlcG8vcGF0aD4gPGJyYW5jaD4KK2BnaXQtcDRpbXBvcnRgIC0tc3RpdGNoIDwvL3A0cmVwby9wYXRoPgorYGdpdC1wNGltcG9ydGAKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ltcG9ydCBhIFBlcmZvcmNlIHJlcG9zaXRvcnkgaW50byBhbiBleGlzdGluZyBnaXQgcmVwb3NpdG9yeS4gIFdoZW4KK2EgPC8vcDRyZXBvL3BhdGg+IGFuZCA8YnJhbmNoPiBhcmUgc3BlY2lmaWVkIGEgbmV3IGJyYW5jaCB3aXRoIHRoZQorZ2l2ZW4gbmFtZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBpbml0aWFsIGltcG9ydCB3aWxsIGJlZ2luLgorCitPbmNlIHRoZSBpbml0aWFsIGltcG9ydCBpcyBjb21wbGV0ZSB5b3UgY2FuIGRvIGFuIGluY3JlbWVudGFsIGltcG9ydAorb2YgbmV3IGNvbW1pdHMgZnJvbSB0aGUgUGVyZm9yY2UgcmVwb3NpdG9yeS4gIFlvdSBkbyB0aGlzIGJ5IGNoZWNraW5nCitvdXQgdGhlIGFwcHJvcHJpYXRlIGdpdCBicmFuY2ggYW5kIHRoZW4gcnVubmluZyBgZ2l0LXA0aW1wb3J0YCB3aXRob3V0Cithbnkgb3B0aW9ucy4KKworVGhlIHN0YW5kYXJkIHA0IGNsaWVudCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIFBlcmZvcmNlCityZXBvc2l0b3J5OyBpdCBtdXN0IGJlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGluIG9yZGVyIGZvciBgZ2l0LXA0aW1wb3J0YAordG8gb3BlcmF0ZSAoc2VlIGJlbG93KS4KKworCitPUFRJT05TCistLS0tLS0tCistcTo6CisJRG8gbm90IGRpc3BsYXkgYW55IHByb2dyZXNzIGluZm9ybWF0aW9uLgorCistdjo6CisgICAgICAgIEdpdmUgZXh0cmEgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisKK1wtLWF1dGhvcnM6OgorCVNwZWNpZnkgYW4gYXV0aG9ycyBmaWxlIGNvbnRhaW5pbmcgYSBtYXBwaW5nIG9mIFBlcmZvcmNlIHVzZXIKKwlpZHMgdG8gZnVsbCBuYW1lcyBhbmQgZW1haWwgYWRkcmVzc2VzIChzZWUgTm90ZXMgYmVsb3cpLgorCitcLS1ub3RhZ3M6OgorCURvIG5vdCBjcmVhdGUgYSB0YWcgZm9yIGVhY2ggaW1wb3J0ZWQgY29tbWl0LgorCitcLS1zdGl0Y2g6OgorCUltcG9ydCB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHBlcmZvcmNlIGJyYW5jaCBpbnRvIHRoZQorCWN1cnJlbnRseSBjaGVja2VkIG91dCBnaXQgYnJhbmNoLgorCitcLS1sb2c6OgorCVN0b3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCisKKy10OjoKKwlTcGVjaWZ5IHRoYXQgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGlzIGluIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCisJVGltZXpvbmUgbXVzdCBiZSBpbiB0aGUgZm9ybWF0ICJVUy9QYWNpZmljIiBvciAiRXVyb3BlL0xvbmRvbiIKKwlldGMuICBZb3Ugb25seSBuZWVkIHRvIHNwZWNpZnkgdGhpcyBvbmNlLCBpdCB3aWxsIGJlIHNhdmVkIGluCisJdGhlIGdpdCBjb25maWcgZmlsZSBmb3IgdGhlIHJlcG9zaXRvcnkuCisKKzwvL3A0cmVwby9wYXRoPjo6CisJVGhlIFBlcmZvcmNlIHBhdGggdGhhdCB3aWxsIGJlIGltcG9ydGVkIGludG8gdGhlIHNwZWNpZmllZCBicmFuY2guCisKKzxicmFuY2g+OjoKKwlUaGUgbmV3IGJyYW5jaCB0aGF0IHdpbGwgYmUgY3JlYXRlZCB0byBob2xkIHRoZSBQZXJmb3JjZSBpbXBvcnRzLgorCisKK1A0IENsaWVudAorLS0tLS0tLS0tCitZb3UgbXVzdCBtYWtlIHRoZSBgcDRgIGNsaWVudCBjb21tYW5kIGF2YWlsYWJsZSBpbiB5b3VyICRQQVRIIGFuZAorY29uZmlndXJlIGl0IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHRhcmdldCBQZXJmb3JjZSByZXBvc2l0b3J5LgorVHlwaWNhbGx5IHRoaXMgbWVhbnMgeW91IG11c3Qgc2V0IHRoZSAiJFA0UE9SVCIgYW5kICIkUDRDTElFTlQiCitlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK1lvdSBtdXN0IGFsc28gY29uZmlndXJlIGEgYHA0YCBjbGllbnQgInZpZXciIHdoaWNoIG1hcHMgdGhlIFBlcmZvcmNlCiticmFuY2ggaW50byB0aGUgdG9wIGxldmVsIG9mIHlvdXIgZ2l0IHJlcG9zaXRvcnksIGZvciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0KK0NsaWVudDogbXlob3N0CisKK1Jvb3Q6ICAgL2hvbWUvc2Vhbi9pbXBvcnQKKworT3B0aW9uczogICBub2FsbHdyaXRlIGNsb2JiZXIgbm9jb21wcmVzcyB1bmxvY2tlZCBtb2R0aW1lIHJtZGlyCisKK1ZpZXc6CisgICAgICAgIC8vcHVibGljL2phbS8uLi4gLy9teWhvc3QvamFtLy4uLgorLS0tLS0tLS0tLS0tCisKK1dpdGggdGhlIGFib3ZlIGBwNGAgY2xpZW50IHNldHVwLCB5b3UgY291bGQgaW1wb3J0IHRoZSAiamFtIgorcGVyZm9yY2UgYnJhbmNoIGludG8gYSBicmFuY2ggbmFtZWQgImphbW15IiwgbGlrZSBzbzoKKworLS0tLS0tLS0tLS0tCiskIG1rZGlyIC1wIC9ob21lL3NlYW4vaW1wb3J0L2phbQorJCBjZCAvaG9tZS9zZWFuL2ltcG9ydC9qYW0KKyQgZ2l0IGluaXQKKyQgZ2l0IHA0aW1wb3J0IC8vcHVibGljL2phbSBqYW1teQorLS0tLS0tLS0tLS0tCisKKworTXVsdGlwbGUgQnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCitOb3RlIHRoYXQgYnkgY3JlYXRpbmcgbXVsdGlwbGUgInZpZXdzIiB5b3UgY2FuIHVzZSBgZ2l0LXA0aW1wb3J0YAordG8gaW1wb3J0IGFkZGl0aW9uYWwgYnJhbmNoZXMgaW50byB0aGUgc2FtZSBnaXQgcmVwb3NpdG9yeS4KK0hvd2V2ZXIsIHRoZSBgcDRgIGNsaWVudCBoYXMgYSBsaW1pdGF0aW9uIGluIHRoYXQgaXQgc2lsZW50bHkKK2lnbm9yZXMgYWxsIGJ1dCB0aGUgbGFzdCAidmlldyIgdGhhdCBtYXBzIGludG8gdGhlIHNhbWUgbG9jYWwKK2RpcmVjdG9yeS4gIFNvIHRoZSBmb2xsb3dpbmcgd2lsbCAqbm90KiB3b3JrOgorCistLS0tLS0tLS0tLS0KK1ZpZXc6CisgICAgICAgIC8vcHVibGljL2phbS8uLi4gLy9teWhvc3QvamFtLy4uLgorICAgICAgICAvL3B1YmxpYy9vdGhlci8uLi4gLy9teWhvc3QvamFtLy4uLgorICAgICAgICAvL3B1YmxpYy9ndWVzdC8uLi4gLy9teWhvc3QvamFtLy4uLgorLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IG1vcmUgdGhhbiBvbmUgUGVyZm9yY2UgYnJhbmNoIHRvIGJlIGltcG9ydGVkIGludG8gdGhlCitzYW1lIGRpcmVjdG9yeSB5b3UgbXVzdCBlbXBsb3kgYSB3b3JrYXJvdW5kLiAgQSBzaW1wbGUgb3B0aW9uIGlzCit0byBhZGp1c3QgeW91ciBgcDRgIGNsaWVudCBiZWZvcmUgZWFjaCBpbXBvcnQgdG8gb25seSBpbmNsdWRlIGEKK3NpbmdsZSB2aWV3LgorCitBbm90aGVyIG9wdGlvbiBpcyB0byBjcmVhdGUgbXVsdGlwbGUgc3ltbGlua3MgbG9jYWxseSB3aGljaCBhbGwKK3BvaW50IHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBpbiB5b3VyIGdpdCByZXBvc2l0b3J5IGFuZCB0aGVuIHVzZQorb25lIHBlciAidmlldyIgaW5zdGVhZCBvZiBsaXN0aW5nIHRoZSBhY3R1YWwgZGlyZWN0b3J5LgorCisKK1RhZ3MKKy0tLS0KK0EgZ2l0IHRhZyBvZiB0aGUgZm9ybSBwNC94eCBpcyBjcmVhdGVkIGZvciBldmVyeSBjaGFuZ2UgaW1wb3J0ZWQgZnJvbQordGhlIFBlcmZvcmNlIHJlcG9zaXRvcnkgd2hlcmUgeHggaXMgdGhlIFBlcmZvcmNlIGNoYW5nZXNldCBudW1iZXIuCitUaGVyZWZvcmUgYWZ0ZXIgdGhlIGltcG9ydCB5b3UgY2FuIHVzZSBnaXQgdG8gYWNjZXNzIGFueSBjb21taXQgYnkgaXRzCitQZXJmb3JjZSBudW1iZXIsIGUuZy4gZ2l0IHNob3cgcDQvMzI3LgorCitUaGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgSEVBRCBjb21taXQgaXMgYWxzbyBob3cgYGdpdC1wNGltcG9ydGAKK2RldGVybWluZXMgaWYgdGhlcmUgYXJlIG5ldyBjaGFuZ2VzIHRvIGluY3JlbWVudGFsbHkgaW1wb3J0IGZyb20gdGhlCitQZXJmb3JjZSByZXBvc2l0b3J5LgorCitJZiB5b3UgaW1wb3J0IGZyb20gYSByZXBvc2l0b3J5IHdpdGggbWFueSB0aG91c2FuZHMgb2YgY2hhbmdlcworeW91IHdpbGwgaGF2ZSBhbiBlcXVhbCBudW1iZXIgb2YgcDQveHh4eCBnaXQgdGFncy4gIEdpdCB0YWdzIGNhbgorYmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIGRpc2sgc3BhY2UgYW5kIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy4KK0lmIHlvdSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gZnVydGhlciBpbmNyZW1lbnRhbCBpbXBvcnRzLCB5b3UKK21heSBkZWxldGUgdGhlIHRhZ3MuCisKKworTm90ZXMKKy0tLS0tCitZb3UgY2FuIGludGVycnVwdCB0aGUgaW1wb3J0IChlLmcuIGN0cmwtYykgYXQgYW55IHRpbWUgYW5kIHJlc3RhcnQgaXQKK3dpdGhvdXQgd29ycnkuCisKK0F1dGhvciBpbmZvcm1hdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgcXVlcnlpbmcgdGhlCitQZXJmb3JjZSAidXNlcnMiIHRhYmxlIHVzaW5nIHRoZSBpZCBhc3NvY2lhdGVkIHdpdGggZWFjaCBjaGFuZ2UuCitIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBtYW51YWxseSBzdXBwbHkgdGhlc2UgbWFwcGluZ3MgeW91IGNhbiBkbworc28gd2l0aCB0aGUgIi0tYXV0aG9ycyIgb3B0aW9uLiAgSXQgYWNjZXB0cyBhIGZpbGUgY29udGFpbmluZyBhIGxpc3QKK29mIG1hcHBpbmdzIHdpdGggZWFjaCBsaW5lIGNvbnRhaW5pbmcgb25lIG1hcHBpbmcgaW4gdGhlIGZvcm1hdDoKKworLS0tLS0tLS0tLS0tCisgICAgcGVyZm9yY2VfaWQgPSBGdWxsIE5hbWUgPGVtYWlsQGFkZHJlc3MuY29tPgorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgU2VhbiBFc3RhYnJvb2tzIDxzZWFubGttbEBzeW1wYXRpY28uY2E+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2VlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLW9iamVjdHMudHh0CkBAIC0wLDAgKzEsMTY0IEBACitnaXQtcGFjay1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYWNrLW9iamVjdHMgLSBDcmVhdGUgYSBwYWNrZWQgYXJjaGl2ZSBvZiBvYmplY3RzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXBhY2stb2JqZWN0cycgWy1xXSBbLS1uby1yZXVzZS1kZWx0YV0gWy0tZGVsdGEtYmFzZS1vZmZzZXRdIFstLW5vbi1lbXB0eV0KKwlbLS1sb2NhbF0gWy0taW5jcmVtZW50YWxdIFstLXdpbmRvdz1OXSBbLS1kZXB0aD1OXSBbLS1hbGwtcHJvZ3Jlc3NdCisJWy0tcmV2cyBbLS11bnBhY2tlZCB8IC0tYWxsXSpdIFstLXN0ZG91dCB8IGJhc2UtbmFtZV0gPCBvYmplY3QtbGlzdAorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgbGlzdCBvZiBvYmplY3RzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBhbmQgd3JpdGVzIGEgcGFja2VkCithcmNoaXZlIHdpdGggc3BlY2lmaWVkIGJhc2UtbmFtZSwgb3IgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworQSBwYWNrZWQgYXJjaGl2ZSBpcyBhbiBlZmZpY2llbnQgd2F5IHRvIHRyYW5zZmVyIHNldCBvZiBvYmplY3RzCitiZXR3ZWVuIHR3byByZXBvc2l0b3JpZXMsIGFuZCBhbHNvIGlzIGFuIGFyY2hpdmFsIGZvcm1hdCB3aGljaAoraXMgZWZmaWNpZW50IHRvIGFjY2Vzcy4gIFRoZSBwYWNrZWQgYXJjaGl2ZSBmb3JtYXQgKC5wYWNrKSBpcworZGVzaWduZWQgdG8gYmUgdW5wYWNrYWJsZSB3aXRob3V0IGhhdmluZyBhbnl0aGluZyBlbHNlLCBidXQgZm9yCityYW5kb20gYWNjZXNzLCBhY2NvbXBhbmllZCB3aXRoIHRoZSBwYWNrIGluZGV4IGZpbGUgKC5pZHgpLgorCisnZ2l0LXVucGFjay1vYmplY3RzJyBjb21tYW5kIGNhbiByZWFkIHRoZSBwYWNrZWQgYXJjaGl2ZSBhbmQKK2V4cGFuZCB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIHBhY2sgaW50byAib25lLWZpbGUKK29uZS1vYmplY3QiIGZvcm1hdDsgdGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBieSB0aGUgc21hcnQtcHVsbAorY29tbWFuZHMgd2hlbiBhIHBhY2sgaXMgY3JlYXRlZCBvbi10aGUtZmx5IGZvciBlZmZpY2llbnQgbmV0d29yawordHJhbnNwb3J0IGJ5IHRoZWlyIHBlZXJzLgorCitQbGFjaW5nIGJvdGggaW4gdGhlIHBhY2svIHN1YmRpcmVjdG9yeSBvZiAkR0lUX09CSkVDVF9ESVJFQ1RPUlkgKG9yCithbnkgb2YgdGhlIGRpcmVjdG9yaWVzIG9uICRHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUykKK2VuYWJsZXMgZ2l0IHRvIHJlYWQgZnJvbSBzdWNoIGFuIGFyY2hpdmUuCisKK0luIGEgcGFja2VkIGFyY2hpdmUsIGFuIG9iamVjdCBpcyBlaXRoZXIgc3RvcmVkIGFzIGEgY29tcHJlc3NlZAord2hvbGUsIG9yIGFzIGEgZGlmZmVyZW5jZSBmcm9tIHNvbWUgb3RoZXIgb2JqZWN0LiAgVGhlIGxhdHRlciBpcworb2Z0ZW4gY2FsbGVkIGEgZGVsdGEuCisKKworT1BUSU9OUworLS0tLS0tLQorYmFzZS1uYW1lOjoKKwlXcml0ZSBpbnRvIGEgcGFpciBvZiBmaWxlcyAoLnBhY2sgYW5kIC5pZHgpLCB1c2luZworCTxiYXNlLW5hbWU+IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgY3JlYXRlZCBmaWxlLgorCVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgdGhlIHR3byBmaWxlcyBhcmUgd3JpdHRlbiBpbgorCTxiYXNlLW5hbWU+LTxTSEExPi57cGFjayxpZHh9IGZpbGVzLiAgPFNIQTE+IGlzIGEgaGFzaAorCW9mIHRoZSBzb3J0ZWQgb2JqZWN0IG5hbWVzIHRvIG1ha2UgdGhlIHJlc3VsdGluZyBmaWxlbmFtZQorCWJhc2VkIG9uIHRoZSBwYWNrIGNvbnRlbnQsIGFuZCB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZAorCW91dHB1dCBvZiB0aGUgY29tbWFuZC4KKworLS1zdGRvdXQ6OgorCVdyaXRlIHRoZSBwYWNrIGNvbnRlbnRzICh3aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisJLnBhY2sgZmlsZSkgb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKy0tcmV2czo6CisJUmVhZCB0aGUgcmV2aXNpb24gYXJndW1lbnRzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBpbnN0ZWFkIG9mCisJaW5kaXZpZHVhbCBvYmplY3QgbmFtZXMuICBUaGUgcmV2aXNpb24gYXJndW1lbnRzIGFyZSBwcm9jZXNzZWQKKwl0aGUgc2FtZSB3YXkgYXMgZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0gd2l0aCBgLS1vYmplY3RzYCBmbGFnCisJdXNlcyBpdHMgYGNvbW1pdGAgYXJndW1lbnRzIHRvIGJ1aWxkIHRoZSBsaXN0IG9mIG9iamVjdHMgaXQKKwlvdXRwdXRzLiAgVGhlIG9iamVjdHMgb24gdGhlIHJlc3VsdGluZyBsaXN0IGFyZSBwYWNrZWQuCisKKy0tdW5wYWNrZWQ6OgorCVRoaXMgaW1wbGllcyBgLS1yZXZzYC4gIFdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZgorCXJldmlzaW9uIGFyZ3VtZW50cyByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBsaW1pdAorCXRoZSBvYmplY3RzIHBhY2tlZCB0byB0aG9zZSB0aGF0IGFyZSBub3QgYWxyZWFkeSBwYWNrZWQuCisKKy0tYWxsOjoKKwlUaGlzIGltcGxpZXMgYC0tcmV2c2AuICBJbiBhZGRpdGlvbiB0byB0aGUgbGlzdCBvZgorCXJldmlzaW9uIGFyZ3VtZW50cyByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBwcmV0ZW5kCisJYXMgaWYgYWxsIHJlZnMgdW5kZXIgYCRHSVRfRElSL3JlZnNgIGFyZSBzcGVjaWZpZWQgdG8gYmUKKwlpbmNsdWRlZC4KKworLS13aW5kb3c9W05dLCAtLWRlcHRoPVtOXTo6CisJVGhlc2UgdHdvIG9wdGlvbnMgYWZmZWN0IGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4KKwl0aGUgcGFjayBhcmUgc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiAgVGhlCisJb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseSBzb3J0ZWQgYnkgdHlwZSwgc2l6ZSBhbmQKKwlvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBvdGhlciBvYmplY3RzCisJd2l0aGluIC0td2luZG93IHRvIHNlZSBpZiB1c2luZyBkZWx0YSBjb21wcmVzc2lvbiBzYXZlcworCXNwYWNlLiAgLS1kZXB0aCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZworCWl0IHRvbyBkZWVwIGFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlcgorCXNpZGUsIGJlY2F1c2UgZGVsdGEgZGF0YSBuZWVkcyB0byBiZSBhcHBsaWVkIHRoYXQgbWFueQorCXRpbWVzIHRvIGdldCB0byB0aGUgbmVjZXNzYXJ5IG9iamVjdC4KKwlUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgLS13aW5kb3cgaXMgMTAgYW5kIC0tZGVwdGggaXMgNTAuCisKKy0taW5jcmVtZW50YWw6OgorCVRoaXMgZmxhZyBjYXVzZXMgYW4gb2JqZWN0IGFscmVhZHkgaW4gYSBwYWNrIGlnbm9yZWQKKwlldmVuIGlmIGl0IGFwcGVhcnMgaW4gdGhlIHN0YW5kYXJkIGlucHV0LgorCistLWxvY2FsOjoKKwlUaGlzIGZsYWcgaXMgc2ltaWxhciB0byBgLS1pbmNyZW1lbnRhbGA7IGluc3RlYWQgb2YKKwlpZ25vcmluZyBhbGwgcGFja2VkIG9iamVjdHMsIGl0IG9ubHkgaWdub3JlcyBvYmplY3RzCisJdGhhdCBhcmUgcGFja2VkIGFuZCBub3QgaW4gdGhlIGxvY2FsIG9iamVjdCBzdG9yZQorCShpLmUuIGJvcnJvd2VkIGZyb20gYW4gYWx0ZXJuYXRlKS4KKworLS1ub24tZW1wdHk6OgorICAgICAgICBPbmx5IGNyZWF0ZSBhIHBhY2tlZCBhcmNoaXZlIGlmIGl0IHdvdWxkIGNvbnRhaW4gYXQKKyAgICAgICAgbGVhc3Qgb25lIG9iamVjdC4KKworLS1wcm9ncmVzczo6CisJUHJvZ3Jlc3Mgc3RhdHVzIGlzIHJlcG9ydGVkIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0KKwlieSBkZWZhdWx0IHdoZW4gaXQgaXMgYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbCwgdW5sZXNzIC1xCisJaXMgc3BlY2lmaWVkLiBUaGlzIGZsYWcgZm9yY2VzIHByb2dyZXNzIHN0YXR1cyBldmVuIGlmCisJdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSBpcyBub3QgZGlyZWN0ZWQgdG8gYSB0ZXJtaW5hbC4KKworLS1hbGwtcHJvZ3Jlc3M6OgorCVdoZW4gLS1zdGRvdXQgaXMgc3BlY2lmaWVkIHRoZW4gcHJvZ3Jlc3MgcmVwb3J0IGlzCisJZGlzcGxheWVkIGR1cmluZyB0aGUgb2JqZWN0IGNvdW50IGFuZCBkZWx0aWZpY2F0aW9uIHBoYXNlcworCWJ1dCBpbmhpYml0ZWQgZHVyaW5nIHRoZSB3cml0ZS1vdXQgcGhhc2UuIFRoZSByZWFzb24gaXMKKwl0aGF0IGluIHNvbWUgY2FzZXMgdGhlIG91dHB1dCBzdHJlYW0gaXMgZGlyZWN0bHkgbGlua2VkCisJdG8gYW5vdGhlciBjb21tYW5kIHdoaWNoIG1heSB3aXNoIHRvIGRpc3BsYXkgcHJvZ3Jlc3MKKwlzdGF0dXMgb2YgaXRzIG93biBhcyBpdCBwcm9jZXNzZXMgaW5jb21pbmcgcGFjayBkYXRhLgorCVRoaXMgZmxhZyBpcyBsaWtlIC0tcHJvZ3Jlc3MgZXhjZXB0IHRoYXQgaXQgZm9yY2VzIHByb2dyZXNzCisJcmVwb3J0IGZvciB0aGUgd3JpdGUtb3V0IHBoYXNlIGFzIHdlbGwgZXZlbiBpZiAtLXN0ZG91dCBpcworCXVzZWQuCisKKy1xOjoKKwlUaGlzIGZsYWcgbWFrZXMgdGhlIGNvbW1hbmQgbm90IHRvIHJlcG9ydCBpdHMgcHJvZ3Jlc3MKKwlvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtLgorCistLW5vLXJldXNlLWRlbHRhOjoKKwlXaGVuIGNyZWF0aW5nIGEgcGFja2VkIGFyY2hpdmUgaW4gYSByZXBvc2l0b3J5IHRoYXQKKwloYXMgZXhpc3RpbmcgcGFja3MsIHRoZSBjb21tYW5kIHJldXNlcyBleGlzdGluZyBkZWx0YXMuCisJVGhpcyBzb21ldGltZXMgcmVzdWx0cyBpbiBhIHNsaWdodGx5IHN1Ym9wdGltYWwgcGFjay4KKwlUaGlzIGZsYWcgdGVsbHMgdGhlIGNvbW1hbmQgbm90IHRvIHJldXNlIGV4aXN0aW5nIGRlbHRhcworCWJ1dCBjb21wdXRlIHRoZW0gZnJvbSBzY3JhdGNoLgorCistLWRlbHRhLWJhc2Utb2Zmc2V0OjoKKwlBIHBhY2tlZCBhcmNoaXZlIGNhbiBleHByZXNzIGJhc2Ugb2JqZWN0IG9mIGEgZGVsdGEgYXMKKwllaXRoZXIgMjAtYnl0ZSBvYmplY3QgbmFtZSBvciBhcyBhbiBvZmZzZXQgaW4gdGhlCisJc3RyZWFtLCBidXQgb2xkZXIgdmVyc2lvbiBvZiBnaXQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUKKwlsYXR0ZXIuICBCeSBkZWZhdWx0LCBnaXQtcGFjay1vYmplY3RzIG9ubHkgdXNlcyB0aGUKKwlmb3JtZXIgZm9ybWF0IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS4gIFRoaXMgb3B0aW9uCisJYWxsb3dzIHRoZSBjb21tYW5kIHRvIHVzZSB0aGUgbGF0dGVyIGZvcm1hdCBmb3IKKwljb21wYWN0bmVzcy4gIERlcGVuZGluZyBvbiB0aGUgYXZlcmFnZSBkZWx0YSBjaGFpbgorCWxlbmd0aCwgdGhpcyBvcHRpb24gdHlwaWNhbGx5IHNocmlua3MgdGhlIHJlc3VsdGluZworCXBhY2tmaWxlIGJ5IDMtNSBwZXItY2VudC4KKworLS1pbmRleC12ZXJzaW9uPTx2ZXJzaW9uPlssPG9mZnNldD5dOjoKKwlUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUgb25seS4gSXQgYWxsb3dzCisJdG8gZm9yY2UgdGhlIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgcGFjayBpbmRleCwgYW5kIHRvIGZvcmNlCisJNjQtYml0IGluZGV4IGVudHJpZXMgb24gb2JqZWN0cyBsb2NhdGVkIGFib3ZlIHRoZSBnaXZlbiBvZmZzZXQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0KK2dpdGxpbms6Z2l0LXJlcGFja1sxXQorZ2l0bGluazpnaXQtcHJ1bmUtcGFja2VkWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZHVuZGFudC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZHVuZGFudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiYmVhMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVkdW5kYW50LnR4dApAQCAtMCwwICsxLDU4IEBACitnaXQtcGFjay1yZWR1bmRhbnQoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcGFjay1yZWR1bmRhbnQgLSBGaW5kIHJlZHVuZGFudCBwYWNrIGZpbGVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBhY2stcmVkdW5kYW50JyBbIC0tdmVyYm9zZSBdIFsgLS1hbHQtb2RiIF0gPCAtLWFsbCB8IC5wYWNrIGZpbGVuYW1lIC4uLiA+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBwcm9ncmFtIGNvbXB1dGVzIHdoaWNoIHBhY2tzIGluIHlvdXIgcmVwb3NpdG9yeQorYXJlIHJlZHVuZGFudC4gVGhlIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgcGlwaW5nIHRvCisneGFyZ3Mgcm0nIGlmIHlvdSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuCisKK2dpdC1wYWNrLXJlZHVuZGFudCBhY2NlcHRzIGEgbGlzdCBvZiBvYmplY3RzIG9uIHN0YW5kYXJkIGlucHV0LiBBbnkgb2JqZWN0cworZ2l2ZW4gd2lsbCBiZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgd2hpY2ggcGFja3MgYXJlIHJlcXVpcmVkLiBUaGlzIG1ha2VzIHRoZSAKK2ZvbGxvd2luZyBjb21tYW5kIHVzZWZ1bCB3aGVuIHdhbnRpbmcgdG8gcmVtb3ZlIHBhY2tzIHdoaWNoIGNvbnRhaW4gdW5yZWFjaGFibGUKK29iamVjdHMuCisKK2dpdC1mc2NrIC0tZnVsbCAtLXVucmVhY2hhYmxlIHwgY3V0IC1kICcgJyAtZjMgfCBcCitnaXQtcGFjay1yZWR1bmRhbnQgLS1hbGwgfCB4YXJncyBybQorCitPUFRJT05TCistLS0tLS0tCisKKworLS1hbGw6OgorCVByb2Nlc3NlcyBhbGwgcGFja3MuIEFueSBmaWxlbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZSBhcmUgaWdub3JlZC4KKworLS1hbHQtb2RiOjoKKwlEb24ndCByZXF1aXJlIG9iamVjdHMgcHJlc2VudCBpbiBwYWNrcyBmcm9tIGFsdGVybmF0ZSBvYmplY3QKKwlkaXJlY3RvcmllcyB0byBiZSBwcmVzZW50IGluIGxvY2FsIHBhY2tzLgorCistLXZlcmJvc2U6OgorCU91dHB1dHMgc29tZSBzdGF0aXN0aWNzIHRvIHN0ZGVyci4gSGFzIGEgc21hbGwgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTHVrYXMgU2FuZHN0csO2bSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEx1a2FzIFNhbmRzdHLDtm0gPGx1a2Fzc0BldGVrLmNoYWxtZXJzLnNlPgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXQorZ2l0bGluazpnaXQtcmVwYWNrWzFdCitnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV0KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGZjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZnMudHh0CkBAIC0wLDAgKzEsNjYgQEAKK2dpdC1wYWNrLXJlZnMoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stcmVmcyAtIFBhY2sgaGVhZHMgYW5kIHRhZ3MgZm9yIGVmZmljaWVudCByZXBvc2l0b3J5IGFjY2VzcworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGFjay1yZWZzJyBbLS1hbGxdIFstLW5vLXBydW5lXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVHJhZGl0aW9uYWxseSwgdGlwcyBvZiBicmFuY2hlcyBhbmQgdGFncyAoY29sbGVjdGl2ZWx5IGtub3duIGFzCisncmVmcycpIHdlcmUgc3RvcmVkIG9uZSBmaWxlIHBlciByZWYgdW5kZXIgYCRHSVRfRElSL3JlZnNgCitkaXJlY3RvcnkuICBXaGlsZSBtYW55IGJyYW5jaCB0aXBzIHRlbmQgdG8gYmUgdXBkYXRlZCBvZnRlbiwKK21vc3QgdGFncyBhbmQgc29tZSBicmFuY2ggdGlwcyBhcmUgbmV2ZXIgdXBkYXRlZC4gIFdoZW4gYQorcmVwb3NpdG9yeSBoYXMgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIHRhZ3MsIHRoaXMKK29uZS1maWxlLXBlci1yZWYgZm9ybWF0IGJvdGggd2FzdGVzIHN0b3JhZ2UgYW5kIGh1cnRzCitwZXJmb3JtYW5jZS4KKworVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc29sdmUgdGhlIHN0b3JhZ2UgYW5kIHBlcmZvcm1hbmNlCitwcm9ibGVtIGJ5IHN0YXNoaW5nIHRoZSByZWZzIGluIGEgc2luZ2xlIGZpbGUsCitgJEdJVF9ESVIvcGFja2VkLXJlZnNgLiAgV2hlbiBhIHJlZiBpcyBtaXNzaW5nIGZyb20gdGhlCit0cmFkaXRpb25hbCBgJEdJVF9ESVIvcmVmc2AgaGllcmFyY2h5LCBpdCBpcyBsb29rZWQgdXAgaW4gdGhpcworZmlsZSBhbmQgdXNlZCBpZiBmb3VuZC4KKworU3Vic2VxdWVudCB1cGRhdGVzIHRvIGJyYW5jaGVzIGFsd2F5cyBjcmVhdGVzIG5ldyBmaWxlIHVuZGVyCitgJEdJVF9ESVIvcmVmc2AgaGllcmFyY2h5LgorCitBIHJlY29tbWVuZGVkIHByYWN0aWNlIHRvIGRlYWwgd2l0aCBhIHJlcG9zaXRvcnkgd2l0aCB0b28gbWFueQorcmVmcyBpcyB0byBwYWNrIGl0cyByZWZzIHdpdGggYC0tYWxsIC0tcHJ1bmVgIG9uY2UsIGFuZAorb2NjYXNpb25hbGx5IHJ1biBgZ2l0LXBhY2stcmVmcyBcLS1wcnVuZWAuICBUYWdzIGFyZSBieQorZGVmaW5pdGlvbiBzdGF0aW9uYXJ5IGFuZCBhcmUgbm90IGV4cGVjdGVkIHRvIGNoYW5nZS4gIEJyYW5jaAoraGVhZHMgd2lsbCBiZSBwYWNrZWQgd2l0aCB0aGUgaW5pdGlhbCBgcGFjay1yZWZzIC0tYWxsYCwgYnV0Citvbmx5IHRoZSBjdXJyZW50bHkgYWN0aXZlIGJyYW5jaCBoZWFkcyB3aWxsIGJlY29tZSB1bnBhY2tlZCwKK2FuZCBuZXh0IGBwYWNrLXJlZnNgICh3aXRob3V0IGAtLWFsbGApIHdpbGwgbGVhdmUgdGhlbQordW5wYWNrZWQuCisKKworT1BUSU9OUworLS0tLS0tLQorCitcLS1hbGw6OgorCitUaGUgY29tbWFuZCBieSBkZWZhdWx0IHBhY2tzIGFsbCB0YWdzIGFuZCByZWZzIHRoYXQgYXJlIGFscmVhZHkKK3BhY2tlZCwgYW5kIGxlYXZlcyBvdGhlciByZWZzCithbG9uZS4gIFRoaXMgaXMgYmVjYXVzZSBicmFuY2hlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgYWN0aXZlbHkKK2RldmVsb3BlZCBhbmQgcGFja2luZyB0aGVpciB0aXBzIGRvZXMgbm90IGhlbHAgcGVyZm9ybWFuY2UuCitUaGlzIG9wdGlvbiBjYXVzZXMgYnJhbmNoIHRpcHMgdG8gYmUgcGFja2VkIGFzIHdlbGwuICBVc2VmdWwgZm9yCithIHJlcG9zaXRvcnkgd2l0aCBtYW55IGJyYW5jaGVzIG9mIGhpc3RvcmljYWwgaW50ZXJlc3RzLgorCitcLS1uby1wcnVuZTo6CisKK1RoZSBjb21tYW5kIHVzdWFsbHkgcmVtb3ZlcyBsb29zZSByZWZzIHVuZGVyIGAkR0lUX0RJUi9yZWZzYAoraGllcmFyY2h5IGFmdGVyIHBhY2tpbmcgdGhlbS4gIFRoaXMgb3B0aW9uIHRlbGxzIGl0IG5vdCB0by4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFyc2UtcmVtb3RlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhcnNlLXJlbW90ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMWY0ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhcnNlLXJlbW90ZS50eHQKQEAgLTAsMCArMSw1MCBAQAorZ2l0LXBhcnNlLXJlbW90ZSgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcGFyc2UtcmVtb3RlIC0gUm91dGluZXMgdG8gaGVscCBwYXJzaW5nIHJlbW90ZSByZXBvc2l0b3J5IGFjY2VzcyBwYXJhbWV0ZXJzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnLiBnaXQtcGFyc2UtcmVtb3RlJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgc2NyaXB0IGlzIGluY2x1ZGVkIGluIHZhcmlvdXMgc2NyaXB0cyB0byBzdXBwbHkKK3JvdXRpbmVzIHRvIHBhcnNlIGZpbGVzIHVuZGVyICRHSVRfRElSL3JlbW90ZXMvIGFuZAorJEdJVF9ESVIvYnJhbmNoZXMvIGFuZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IGFyZSByZWxhdGVkCit0byBmZXRjaGluZywgcHVsbGluZyBhbmQgcHVzaGluZy4KKworVGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGFyZToKKworZ2V0X3JlbW90ZV9yZWZzX2Zvcl9mZXRjaDo6CisJR2l2ZW4gdGhlIGxpc3Qgb2YgdXNlci1zdXBwbGllZCBgPHJlcG8+IDxyZWZzcGVjPi4uLmAsCisJcmV0dXJuIHRoZSBsaXN0IG9mIHJlZnMgdG8gZmV0Y2ggYWZ0ZXIgY2Fub25pY2FsaXppbmcKKwl0aGVtIGludG8gYCRHSVRfRElSYCByZWxhdGl2ZSBwYXRocworCShlLmcuIGByZWZzL2hlYWRzL2Zvb2ApLiAgV2hlbiBgPHJlZnNwZWM+Li4uYCBpcyBlbXB0eQorCXRoZSByZXR1cm5lZCBsaXN0IG9mIHJlZnMgY29uc2lzdHMgb2YgdGhlIGRlZmF1bHRzCisJZm9yIHRoZSBnaXZlbiBgPHJlcG8+YCwgaWYgc3BlY2lmaWVkIGluCisJYCRHSVRfRElSL3JlbW90ZXMvYCwgYCRHSVRfRElSL2JyYW5jaGVzL2AsIG9yIGByZW1vdGUuKi5mZXRjaGAKKwljb25maWd1cmF0aW9uLgorCitnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2g6OgorCUdpdmVuIHRoZSBsaXN0IG9mIHVzZXItc3VwcGxpZWQgYDxyZXBvPiA8cmVmc3BlYz4uLi5gLAorCXJldHVybiB0aGUgbGlzdCBvZiByZWZzIHRvIHB1c2ggaW4gYSBmb3JtIHN1aXRhYmxlIHRvIGJlCisJZmVkIHRvIHRoZSBgZ2l0LXNlbmQtcGFja2AgY29tbWFuZC4gIFdoZW4gYDxyZWZzcGVjPi4uLmAKKwlpcyBlbXB0eSB0aGUgcmV0dXJuZWQgbGlzdCBvZiByZWZzIGNvbnNpc3RzIG9mIHRoZQorCWRlZmF1bHRzIGZvciB0aGUgZ2l2ZW4gYDxyZXBvPmAsIGlmIHNwZWNpZmllZCBpbgorCWAkR0lUX0RJUi9yZW1vdGVzL2AuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wYXRjaC1pZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYXRjaC1pZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlOWZkMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhdGNoLWlkLnR4dApAQCAtMCwwICsxLDQzIEBACitnaXQtcGF0Y2gtaWQoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcGF0Y2gtaWQgLSBDb21wdXRlIHVuaXF1ZSBJRCBmb3IgYSBwYXRjaAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGF0Y2gtaWQnIDwgPHBhdGNoPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgInBhdGNoIElEIiBpcyBub3RoaW5nIGJ1dCBhIFNIQTEgb2YgdGhlIGRpZmYgYXNzb2NpYXRlZCB3aXRoIGEgcGF0Y2gsIHdpdGgKK3doaXRlc3BhY2UgYW5kIGxpbmUgbnVtYmVycyBpZ25vcmVkLiAgQXMgc3VjaCwgaXQncyAicmVhc29uYWJseSBzdGFibGUiLCBidXQgYXQKK3RoZSBzYW1lIHRpbWUgYWxzbyByZWFzb25hYmx5IHVuaXF1ZSwgaS5lLiwgdHdvIHBhdGNoZXMgdGhhdCBoYXZlIHRoZSBzYW1lICJwYXRjaAorSUQiIGFyZSBhbG1vc3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSB0aGluZy4KKworSU9XLCB5b3UgY2FuIHVzZSB0aGlzIHRoaW5nIHRvIGxvb2sgZm9yIGxpa2VseSBkdXBsaWNhdGUgY29tbWl0cy4KKworV2hlbiBkZWFsaW5nIHdpdGggZ2l0LWRpZmYtdHJlZSBvdXRwdXQsIGl0IHRha2VzIGFkdmFudGFnZSBvZgordGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggaXMgcHJlZml4ZWQgd2l0aCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlCitjb21taXQsIGFuZCBvdXRwdXRzIHR3byA0MC1ieXRlIGhleGFkZWNpbWFsIHN0cmluZy4gIFRoZSBmaXJzdAorc3RyaW5nIGlzIHRoZSBwYXRjaCBJRCwgYW5kIHRoZSBzZWNvbmQgc3RyaW5nIGlzIHRoZSBjb21taXQgSUQuCitUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBtYXBwaW5nIGZyb20gcGF0Y2ggSUQgdG8gY29tbWl0IElELgorCitPUFRJT05TCistLS0tLS0tCis8cGF0Y2g+OjoKKwlUaGUgZGlmZiB0byBjcmVhdGUgdGhlIElEIG9mLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjM3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wZWVrLXJlbW90ZS50eHQKQEAgLTAsMCArMSw1NSBAQAorZ2l0LXBlZWstcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBlZWstcmVtb3RlIC0gTGlzdCB0aGUgcmVmZXJlbmNlcyBpbiBhIHJlbW90ZSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBlZWstcmVtb3RlJyBbLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPl0gWzxob3N0PjpdPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitMaXN0cyB0aGUgcmVmZXJlbmNlcyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaGFzLCBhbmQgb3B0aW9uYWxseQorc3RvcmVzIHRoZW0gaW4gdGhlIGxvY2FsIHJlcG9zaXRvcnkgdW5kZXIgdGhlIHNhbWUgbmFtZS4KKworT1BUSU9OUworLS0tLS0tLQorXC0tdXBsb2FkLXBhY2s9PGdpdC11cGxvYWQtcGFjaz46OgorCVVzZSB0aGlzIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gJ2dpdC11cGxvYWQtcGFjaycgb24gdGhlCisJcmVtb3RlIHNpZGUsIGlmIGl0IGlzIG5vdCBmb3VuZCBvbiB5b3VyICRQQVRILiBTb21lCisJaW5zdGFsbGF0aW9ucyBvZiBzc2hkIGlnbm9yZXMgdGhlIHVzZXIncyBlbnZpcm9ubWVudAorCXNldHVwIHNjcmlwdHMgZm9yIGxvZ2luIHNoZWxscyAoZS5nLiAuYmFzaF9wcm9maWxlKSBhbmQKKwl5b3VyIHByaXZhdGVseSBpbnN0YWxsZWQgZ2l0IG1heSBub3QgYmUgZm91bmQgb24gdGhlIHN5c3RlbQorCWRlZmF1bHQgJFBBVEguICBBbm90aGVyIHdvcmthcm91bmQgc3VnZ2VzdGVkIGlzIHRvIHNldAorCXVwIHlvdXIgJFBBVEggaW4gIi5iYXNocmMiLCBidXQgdGhpcyBmbGFnIGlzIGZvciBwZW9wbGUKKwl3aG8gZG8gbm90IHdhbnQgdG8gcGF5IHRoZSBvdmVyaGVhZCBmb3Igbm9uLWludGVyYWN0aXZlCisJc2hlbGxzLCBidXQgcHJlZmVyIGhhdmluZyBhIGxlYW4gLmJhc2hyYyBmaWxlICh0aGV5IHNldCBtb3N0IG9mCisJdGhlIHRoaW5ncyB1cCBpbiAuYmFzaF9wcm9maWxlKS4KKworXC0tZXhlYz08Z2l0LXVwbG9hZC1wYWNrPjo6CisJU2FtZSBcLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPi4KKworPGhvc3Q+OjoKKwlBIHJlbW90ZSBob3N0IHRoYXQgaG91c2VzIHRoZSByZXBvc2l0b3J5LiAgV2hlbiB0aGlzCisJcGFydCBpcyBzcGVjaWZpZWQsICdnaXQtdXBsb2FkLXBhY2snIGlzIGludm9rZWQgdmlhCisJc3NoLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBmcm9tLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS1wYWNrZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUtcGFja2VkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAwMzNlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUtcGFja2VkLnR4dApAQCAtMCwwICsxLDUzIEBACitnaXQtcHJ1bmUtcGFja2VkKDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBydW5lLXBhY2tlZCAtIFJlbW92ZSBleHRyYSBvYmplY3RzIHRoYXQgYXJlIGFscmVhZHkgaW4gcGFjayBmaWxlcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wcnVuZS1wYWNrZWQnIFstbl0gWy1xXQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBwcm9ncmFtIHNlYXJjaCB0aGUgYCRHSVRfT0JKRUNUX0RJUmAgZm9yIGFsbCBvYmplY3RzIHRoYXQgY3VycmVudGx5CitleGlzdCBpbiBhIHBhY2sgZmlsZSBhcyB3ZWxsIGFzIHRoZSBpbmRlcGVuZGVudCBvYmplY3QgZGlyZWN0b3JpZXMuCisKK0FsbCBzdWNoIGV4dHJhIG9iamVjdHMgYXJlIHJlbW92ZWQuCisKK0EgcGFjayBpcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cywgaW5kaXZpZHVhbGx5IGNvbXByZXNzZWQsIHdpdGggZGVsdGEKK2NvbXByZXNzaW9uIGFwcGxpZWQsIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLCB3aXRoIGFuIGFzc29jaWF0ZWQgaW5kZXggZmlsZS4KKworUGFja3MgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBsb2FkIG9uIG1pcnJvciBzeXN0ZW1zLCBiYWNrdXAgZW5naW5lcywKK2Rpc2sgc3RvcmFnZSwgZXRjLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1uOjoKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgcmVtb3ZlIGFueSBvYmplY3RzLCBvbmx5IHNob3cgdGhvc2UgdGhhdCB3b3VsZCBoYXZlIGJlZW4KKyAgICAgICAgcmVtb3ZlZC4KKworLXE6OgorCVNxdWVsY2ggdGhlIHByb2dyZXNzIGluZGljYXRvci4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXQorZ2l0bGluazpnaXQtcmVwYWNrWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxNjZhMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtcHJ1bmUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHJ1bmUgLSBQcnVuZSBhbGwgdW5yZWFjaGFibGUgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcHJ1bmUnIFstbl0gWy0tXSBbPGhlYWQ+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBydW5zIGBnaXQtZnNjayAtLXVucmVhY2hhYmxlYCB1c2luZyBhbGwgdGhlIHJlZnMKK2F2YWlsYWJsZSBpbiBgJEdJVF9ESVIvcmVmc2AsIG9wdGlvbmFsbHkgd2l0aCBhZGRpdGlvbmFsIHNldCBvZgorb2JqZWN0cyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHBydW5lcyBhbGwKK29iamVjdHMgdW5yZWFjaGFibGUgZnJvbSBhbnkgb2YgdGhlc2UgaGVhZCBvYmplY3RzIGZyb20gdGhlIG9iamVjdCBkYXRhYmFzZS4KK0luIGFkZGl0aW9uLCBpdAorcHJ1bmVzIHRoZSB1bnBhY2tlZCBvYmplY3RzIHRoYXQgYXJlIGFsc28gZm91bmQgaW4gcGFja3MgYnkKK3J1bm5pbmcgYGdpdCBwcnVuZS1wYWNrZWRgLgorCitPUFRJT05TCistLS0tLS0tCisKKy1uOjoKKwlEbyBub3QgcmVtb3ZlIGFueXRoaW5nOyBqdXN0IHJlcG9ydCB3aGF0IGl0IHdvdWxkCisJcmVtb3ZlLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxoZWFkPi4uLjo6CisJSW4gYWRkaXRpb24gdG8gb2JqZWN0cworCXJlYWNoYWJsZSBmcm9tIGFueSBvZiBvdXIgcmVmZXJlbmNlcywga2VlcCBvYmplY3RzCisJcmVhY2hhYmxlIGZyb20gbGlzdGVkIDxoZWFkPnMuCisKK0VYQU1QTEUKKy0tLS0tLS0KKworVG8gcHJ1bmUgb2JqZWN0cyBub3QgdXNlZCBieSB5b3VyIHJlcG9zaXRvcnkgbm9yIGFub3RoZXIgdGhhdAorYm9ycm93cyBmcm9tIHlvdXIgcmVwb3NpdG9yeSB2aWEgaXRzCitgLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlc2A6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUgJChjZCAuLi9hbm90aGVyICYmICQoZ2l0LXJldi1wYXJzZSAtLWFsbCkpCistLS0tLS0tLS0tLS0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0NzhlZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0CkBAIC0wLDAgKzEsMTY4IEBACitnaXQtcHVsbCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXB1bGwgLSBGZXRjaCBmcm9tIGFuZCBtZXJnZSB3aXRoIGFub3RoZXIgcmVwb3NpdG9yeSBvciBhIGxvY2FsIGJyYW5jaAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wdWxsJyA8b3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyBgZ2l0LWZldGNoYCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLCBhbmQgY2FsbHMgYGdpdC1tZXJnZWAKK3RvIG1lcmdlIHRoZSByZXRyaWV2ZWQgaGVhZChzKSBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworTm90ZSB0aGF0IHlvdSBjYW4gdXNlIGAuYCAoY3VycmVudCBkaXJlY3RvcnkpIGFzIHRoZQorPHJlcG9zaXRvcnk+IHRvIHB1bGwgZnJvbSB0aGUgbG9jYWwgcmVwb3NpdG9yeSAtLSB0aGlzIGlzIHVzZWZ1bAord2hlbiBtZXJnaW5nIGxvY2FsIGJyYW5jaGVzIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6Om1lcmdlLW9wdGlvbnMudHh0W10KKworaW5jbHVkZTo6ZmV0Y2gtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwdWxsLWZldGNoLXBhcmFtLnR4dFtdCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworaW5jbHVkZTo6bWVyZ2Utc3RyYXRlZ2llcy50eHRbXQorCitERUZBVUxUIEJFSEFWSU9VUgorLS0tLS0tLS0tLS0tLS0tLS0KKworT2Z0ZW4gcGVvcGxlIHVzZSBgZ2l0IHB1bGxgIHdpdGhvdXQgZ2l2aW5nIGFueSBwYXJhbWV0ZXIuCitUcmFkaXRpb25hbGx5LCB0aGlzIGhhcyBiZWVuIGVxdWl2YWxlbnQgdG8gc2F5aW5nIGBnaXQgcHVsbAorb3JpZ2luYC4gIEhvd2V2ZXIsIHdoZW4gY29uZmlndXJhdGlvbiBgYnJhbmNoLjxuYW1lPi5yZW1vdGVgIGlzCitwcmVzZW50IHdoaWxlIG9uIGJyYW5jaCBgPG5hbWU+YCwgdGhhdCB2YWx1ZSBpcyB1c2VkIGluc3RlYWQgb2YKK2BvcmlnaW5gLgorCitJbiBvcmRlciB0byBkZXRlcm1pbmUgd2hhdCBVUkwgdG8gdXNlIHRvIGZldGNoIGZyb20sIHRoZSB2YWx1ZQorb2YgdGhlIGNvbmZpZ3VyYXRpb24gYHJlbW90ZS48b3JpZ2luPi51cmxgIGlzIGNvbnN1bHRlZAorYW5kIGlmIHRoZXJlIGlzIG5vdCBhbnkgc3VjaCB2YXJpYWJsZSwgdGhlIHZhbHVlIG9uIGBVUkw6IGAgbGluZQoraW4gYCRHSVRfRElSL3JlbW90ZXMvPG9yaWdpbj5gIGZpbGUgaXMgdXNlZC4KKworSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoYXQgcmVtb3RlIGJyYW5jaGVzIHRvIGZldGNoIChhbmQKK29wdGlvbmFsbHkgc3RvcmUgaW4gdGhlIHRyYWNraW5nIGJyYW5jaGVzKSB3aGVuIHRoZSBjb21tYW5kIGlzCitydW4gd2l0aG91dCBhbnkgcmVmc3BlYyBwYXJhbWV0ZXJzIG9uIHRoZSBjb21tYW5kIGxpbmUsIHZhbHVlcworb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgYHJlbW90ZS48b3JpZ2luPi5mZXRjaGAgYXJlCitjb25zdWx0ZWQsIGFuZCBpZiB0aGVyZSBhcmVuJ3QgYW55LCBgJEdJVF9ESVIvcmVtb3Rlcy88b3JpZ2luPmAKK2ZpbGUgaXMgY29uc3VsdGVkIGFuZCBpdHMgYFB1bGw6IGAgbGluZXMgYXJlIHVzZWQuCitJbiBhZGRpdGlvbiB0byB0aGUgcmVmc3BlYyBmb3JtYXRzIGRlc2NyaWJlZCBpbiB0aGUgT1BUSU9OUworc2VjdGlvbiwgeW91IGNhbiBoYXZlIGEgZ2xvYmJpbmcgcmVmc3BlYyB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qCistLS0tLS0tLS0tLS0KKworQSBnbG9iYmluZyByZWZzcGVjIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBSSFMgKGkuZS4gbXVzdCBzdG9yZQord2hhdCB3ZXJlIGZldGNoZWQgaW4gdHJhY2tpbmcgYnJhbmNoZXMpLCBhbmQgaXRzIExIUyBhbmQgUkhTCittdXN0IGVuZCB3aXRoIGAvKmAuICBUaGUgYWJvdmUgc3BlY2lmaWVzIHRoYXQgYWxsIHJlbW90ZQorYnJhbmNoZXMgYXJlIHRyYWNrZWQgdXNpbmcgdHJhY2tpbmcgYnJhbmNoZXMgaW4KK2ByZWZzL3JlbW90ZXMvb3JpZ2luL2AgaGllcmFyY2h5IHVuZGVyIHRoZSBzYW1lIG5hbWUuCisKK1RoZSBydWxlIHRvIGRldGVybWluZSB3aGljaCByZW1vdGUgYnJhbmNoIHRvIG1lcmdlIGFmdGVyCitmZXRjaGluZyBpcyBhIGJpdCBpbnZvbHZlZCwgaW4gb3JkZXIgbm90IHRvIGJyZWFrIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5LgorCitJZiBleHBsaWNpdCByZWZzcGVjcyB3ZXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kCitsaW5lIG9mIGBnaXQgcHVsbGAsIHRoZXkgYXJlIGFsbCBtZXJnZWQuCisKK1doZW4gbm8gcmVmc3BlYyB3YXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiBgZ2l0IHB1bGxgCit1c2VzIHRoZSByZWZzcGVjIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gb3IKK2AkR0lUX0RJUi9yZW1vdGVzLzxvcmlnaW4+YC4gIEluIHN1Y2ggY2FzZXMsIHRoZSBmb2xsb3dpbmcKK3J1bGVzIGFwcGx5OgorCisuIElmIGBicmFuY2guPG5hbWU+Lm1lcmdlYCBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudAorICBicmFuY2ggYDxuYW1lPmAgZXhpc3RzLCB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBicmFuY2ggYXQgdGhlCisgIHJlbW90ZSBzaXRlIHRoYXQgaXMgbWVyZ2VkLgorCisuIElmIHRoZSByZWZzcGVjIGlzIGEgZ2xvYmJpbmcgb25lLCBub3RoaW5nIGlzIG1lcmdlZC4KKworLiBPdGhlcndpc2UgdGhlIHJlbW90ZSBicmFuY2ggb2YgdGhlIGZpcnN0IHJlZnNwZWMgaXMgbWVyZ2VkLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitnaXQgcHVsbCwgZ2l0IHB1bGwgb3JpZ2luOjoKKwlVcGRhdGUgdGhlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBmb3IgdGhlIHJlcG9zaXRvcnkKKwl5b3UgY2xvbmVkIGZyb20sIHRoZW4gbWVyZ2Ugb25lIG9mIHRoZW0gaW50byB5b3VyCisJY3VycmVudCBicmFuY2guICBOb3JtYWxseSB0aGUgYnJhbmNoIG1lcmdlZCBpbiBpcworCXRoZSBIRUFEIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwgYnV0IHRoZSBjaG9pY2UgaXMKKwlkZXRlcm1pbmVkIGJ5IHRoZSBicmFuY2guPG5hbWU+LnJlbW90ZSBhbmQKKwlicmFuY2guPG5hbWU+Lm1lcmdlIG9wdGlvbnM7IHNlZSBnaXRsaW5rOmdpdC1jb25maWdbMV0KKwlmb3IgZGV0YWlscy4KKworZ2l0IHB1bGwgb3JpZ2luIG5leHQ6OgorCU1lcmdlIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoIHRoZSByZW1vdGUgYnJhbmNoIGBuZXh0YDsKKwlsZWF2ZXMgYSBjb3B5IG9mIGBuZXh0YCB0ZW1wb3JhcmlseSBpbiBGRVRDSF9IRUFELCBidXQKKwlkb2VzIG5vdCB1cGRhdGUgYW55IHJlbW90ZS10cmFja2luZyBicmFuY2hlcy4KKworZ2l0IHB1bGwgLiBmaXhlcyBlbmhhbmNlbWVudHM6OgorCUJ1bmRsZSBsb2NhbCBicmFuY2ggYGZpeGVzYCBhbmQgYGVuaGFuY2VtZW50c2Agb24gdG9wIG9mCisJdGhlIGN1cnJlbnQgYnJhbmNoLCBtYWtpbmcgYW4gT2N0b3B1cyBtZXJnZS4gIFRoaXMgYGdpdCBwdWxsIC5gCisJc3ludGF4IGlzIGVxdWl2YWxlbnQgdG8gYGdpdCBtZXJnZWAuCisKK2dpdCBwdWxsIC1zIG91cnMgLiBvYnNvbGV0ZTo6CisJTWVyZ2UgbG9jYWwgYnJhbmNoIGBvYnNvbGV0ZWAgaW50byB0aGUgY3VycmVudCBicmFuY2gsCisJdXNpbmcgYG91cnNgIG1lcmdlIHN0cmF0ZWd5LgorCitnaXQgcHVsbCAtLW5vLWNvbW1pdCAuIG1haW50OjoKKwlNZXJnZSBsb2NhbCBicmFuY2ggYG1haW50YCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgYnV0CisJZG8gbm90IG1ha2UgYSBjb21taXQgYXV0b21hdGljYWxseS4gIFRoaXMgY2FuIGJlIHVzZWQKKwl3aGVuIHlvdSB3YW50IHRvIGluY2x1ZGUgZnVydGhlciBjaGFuZ2VzIHRvIHRoZSBtZXJnZSwKKwlvciB3YW50IHRvIHdyaXRlIHlvdXIgb3duIG1lcmdlIGNvbW1pdCBtZXNzYWdlLgorKworWW91IHNob3VsZCByZWZyYWluIGZyb20gYWJ1c2luZyB0aGlzIG9wdGlvbiB0byBzbmVhayBzdWJzdGFudGlhbAorY2hhbmdlcyBpbnRvIGEgbWVyZ2UgY29tbWl0LiAgU21hbGwgZml4dXBzIGxpa2UgYnVtcGluZworcmVsZWFzZS92ZXJzaW9uIG5hbWUgd291bGQgYmUgYWNjZXB0YWJsZS4KKworQ29tbWFuZCBsaW5lIHB1bGwgb2YgbXVsdGlwbGUgYnJhbmNoZXMgZnJvbSBvbmUgcmVwb3NpdG9yeTo6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgZmV0Y2ggb3JpZ2luICtwdTpwdSBtYWludDp0bXAKKyQgZ2l0IHB1bGwgLiB0bXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKworVGhpcyB1cGRhdGVzIChvciBjcmVhdGVzLCBhcyBuZWNlc3NhcnkpIGJyYW5jaGVzIGBwdWAgYW5kIGB0bXBgCitpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeSBieSBmZXRjaGluZyBmcm9tIHRoZSBicmFuY2hlcworKHJlc3BlY3RpdmVseSkgYHB1YCBhbmQgYG1haW50YCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKysKK1RoZSBgcHVgIGJyYW5jaCB3aWxsIGJlIHVwZGF0ZWQgZXZlbiBpZiBpdCBpcyBkb2VzIG5vdAorZmFzdC1mb3J3YXJkOyB0aGUgb3RoZXJzIHdpbGwgbm90IGJlLgorKworVGhlIGZpbmFsIGNvbW1hbmQgdGhlbiBtZXJnZXMgdGhlIG5ld2x5IGZldGNoZWQgYHRtcGAgaW50byBtYXN0ZXIuCisKKworSWYgeW91IHRyaWVkIGEgcHVsbCB3aGljaCByZXN1bHRlZCBpbiBhIGNvbXBsZXggY29uZmxpY3RzIGFuZAord291bGQgd2FudCB0byBzdGFydCBvdmVyLCB5b3UgY2FuIHJlY292ZXIgd2l0aAorZ2l0bGluazpnaXQtcmVzZXRbMV0uCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1mZXRjaFsxXSwgZ2l0bGluazpnaXQtbWVyZ2VbMV0sIGdpdGxpbms6Z2l0LWNvbmZpZ1sxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK2FuZCBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvbiBMb2VsaWdlciwKK0RhdmlkIEdyZWF2ZXMsCitKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhZDEwNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0CkBAIC0wLDAgKzEsMTEzIEBACitnaXQtcHVzaCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXB1c2ggLSBVcGRhdGUgcmVtb3RlIHJlZnMgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcHVzaCcgWy0tYWxsXSBbLS10YWdzXSBbLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+XQorICAgICAgICAgICBbLS1yZXBvPWFsbF0gWy1mIHwgLS1mb3JjZV0gWy12XSBbPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VwZGF0ZXMgcmVtb3RlIHJlZnMgdXNpbmcgbG9jYWwgcmVmcywgd2hpbGUgc2VuZGluZyBvYmplY3RzCituZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIGdpdmVuIHJlZnMuCisKK1lvdSBjYW4gbWFrZSBpbnRlcmVzdGluZyB0aGluZ3MgaGFwcGVuIHRvIGEgcmVwb3NpdG9yeQorZXZlcnkgdGltZSB5b3UgcHVzaCBpbnRvIGl0LCBieSBzZXR0aW5nIHVwICdob29rcycgdGhlcmUuICBTZWUKK2RvY3VtZW50YXRpb24gZm9yIGdpdGxpbms6Z2l0LXJlY2VpdmUtcGFja1sxXS4KKworCitPUFRJT05TCistLS0tLS0tCis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgZGVzdGluYXRpb24gb2YgYSBwdXNoCisJb3BlcmF0aW9uLiAgU2VlIHRoZSBzZWN0aW9uIDw8VVJMUyxHSVQgVVJMUz4+IGJlbG93LgorCis8cmVmc3BlYz46OgorCVRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGEgPHJlZnNwZWM+IHBhcmFtZXRlciBpcworCWArPzxzcmM+Ojxkc3Q+YDsgdGhhdCBpcywgYW4gb3B0aW9uYWwgcGx1cyBgK2AsIGZvbGxvd2VkCisJYnkgdGhlIHNvdXJjZSByZWYsIGZvbGxvd2VkIGJ5IGEgY29sb24gYDpgLCBmb2xsb3dlZCBieQorCXRoZSBkZXN0aW5hdGlvbiByZWYuCisrCitUaGUgPHNyYz4gc2lkZSBjYW4gYmUgYW4KK2FyYml0cmFyeSAiU0hBMSBleHByZXNzaW9uIiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuCithcmd1bWVudCB0byBgZ2l0LWNhdC1maWxlIC10YC4gIEUuZy4gYG1hc3Rlcn40YCAocHVzaAorZm91ciBwYXJlbnRzIGJlZm9yZSB0aGUgY3VycmVudCBtYXN0ZXIgaGVhZCkuCisrCitUaGUgbG9jYWwgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPiBpcyB1c2VkCit0byBmYXN0IGZvcndhcmQgdGhlIHJlbW90ZSByZWYgdGhhdCBtYXRjaGVzIDxkc3Q+LiAgSWYKK3RoZSBvcHRpb25hbCBwbHVzIGArYCBpcyB1c2VkLCB0aGUgcmVtb3RlIHJlZiBpcyB1cGRhdGVkCitldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZCB1cGRhdGUuCisrCitOb3RlOiBJZiBubyBleHBsaWNpdCByZWZzcGVjIGlzIGZvdW5kLCAodGhhdCBpcyBuZWl0aGVyCitvbiB0aGUgY29tbWFuZCBsaW5lIG5vciBpbiBhbnkgUHVzaCBsaW5lIG9mIHRoZQorY29ycmVzcG9uZGluZyByZW1vdGVzIGZpbGUtLS1zZWUgYmVsb3cpLCB0aGVuIGFsbCB0aGUKK3JlZnMgdGhhdCBleGlzdCBib3RoIG9uIHRoZSBsb2NhbCBzaWRlIGFuZCBvbiB0aGUgcmVtb3RlCitzaWRlIGFyZSB1cGRhdGVkLgorKworYHRhZyA8dGFnPmAgbWVhbnMgdGhlIHNhbWUgYXMgYHJlZnMvdGFncy88dGFnPjpyZWZzL3RhZ3MvPHRhZz5gLgorKworQSBwYXJhbWV0ZXIgPHJlZj4gd2l0aG91dCBhIGNvbG9uIGlzIGVxdWl2YWxlbnQgdG8KKzxyZWY+YDpgPHJlZj4sIGhlbmNlIHVwZGF0ZXMgPHJlZj4gaW4gdGhlIGRlc3RpbmF0aW9uIGZyb20gPHJlZj4KK2luIHRoZSBzb3VyY2UuCisrCitQdXNoaW5nIGFuIGVtcHR5IDxzcmM+IGFsbG93cyB5b3UgdG8gZGVsZXRlIHRoZSA8ZHN0PiByZWYgZnJvbQordGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCitcLS1hbGw6OgorCUluc3RlYWQgb2YgbmFtaW5nIGVhY2ggcmVmIHRvIHB1c2gsIHNwZWNpZmllcyB0aGF0IGFsbAorCXJlZnMgYmUgcHVzaGVkLgorCitcLS10YWdzOjoKKwlBbGwgcmVmcyB1bmRlciBgJEdJVF9ESVIvcmVmcy90YWdzYCBhcmUgcHVzaGVkLCBpbgorCWFkZGl0aW9uIHRvIHJlZnNwZWNzIGV4cGxpY2l0bHkgbGlzdGVkIG9uIHRoZSBjb21tYW5kCisJbGluZS4KKworXC0tcmVjZWl2ZS1wYWNrPTxnaXQtcmVjZWl2ZS1wYWNrPjo6CisJUGF0aCB0byB0aGUgJ2dpdC1yZWNlaXZlLXBhY2snIHByb2dyYW0gb24gdGhlIHJlbW90ZQorCWVuZC4gIFNvbWV0aW1lcyB1c2VmdWwgd2hlbiBwdXNoaW5nIHRvIGEgcmVtb3RlCisJcmVwb3NpdG9yeSBvdmVyIHNzaCwgYW5kIHlvdSBkbyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbgorCWEgZGlyZWN0b3J5IG9uIHRoZSBkZWZhdWx0ICRQQVRILgorCitcLS1leGVjPTxnaXQtcmVjZWl2ZS1wYWNrPjo6CisJU2FtZSBhcyBcLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+LgorCistZiwgXC0tZm9yY2U6OgorCVVzdWFsbHksIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gdXBkYXRlIGEgcmVtb3RlIHJlZiB0aGF0IGlzCisJbm90IGEgZGVzY2VuZGFudCBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBUaGlzIGNhbiBjYXVzZSB0aGUKKwlyZW1vdGUgcmVwb3NpdG9yeSB0byBsb3NlIGNvbW1pdHM7IHVzZSBpdCB3aXRoIGNhcmUuCisKK1wtLXJlcG89PHJlcG8+OjoKKwlXaGVuIG5vIHJlcG9zaXRvcnkgaXMgc3BlY2lmaWVkIHRoZSBjb21tYW5kIGRlZmF1bHRzIHRvCisJIm9yaWdpbiI7IHRoaXMgb3ZlcnJpZGVzIGl0LgorCitcLS10aGluLCBcLS1uby10aGluOjoKKwlUaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYGdpdC1zZW5kLXBhY2tgLiAgVGhpbgorCXRyYW5zZmVyIHNwZW5kcyBleHRyYSBjeWNsZXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZgorCW9iamVjdHMgdG8gYmUgc2VudCBhbmQgbWVhbnQgdG8gYmUgdXNlZCBvbiBzbG93ZXIgY29ubmVjdGlvbi4KKworLXY6OgorCVJ1biB2ZXJib3NlbHkuCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PiwgbGF0ZXIgcmV3cml0dGVuIGluIEMKK2J5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1xdWlsdGltcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1xdWlsdGltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2OTM3YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtcXVpbHRpbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXF1aWx0aW1wb3J0IC0gQXBwbGllcyBhIHF1aWx0IHBhdGNoc2V0IG9udG8gdGhlIGN1cnJlbnQgYnJhbmNoCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXF1aWx0aW1wb3J0JyBbLS1kcnktcnVuXSBbLS1hdXRob3IgPGF1dGhvcj5dIFstLXBhdGNoZXMgPGRpcj5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBcHBsaWVzIGEgcXVpbHQgcGF0Y2hzZXQgb250byB0aGUgY3VycmVudCBnaXQgYnJhbmNoLCBwcmVzZXJ2aW5nCit0aGUgcGF0Y2ggYm91bmRhcmllcywgcGF0Y2ggb3JkZXIsIGFuZCBwYXRjaCBkZXNjcmlwdGlvbnMgcHJlc2VudAoraW4gdGhlIHF1aWx0IHBhdGNoc2V0LgorCitGb3IgZWFjaCBwYXRjaCB0aGUgY29kZSBhdHRlbXB0cyB0byBleHRyYWN0IHRoZSBhdXRob3IgZnJvbSB0aGUKK3BhdGNoIGRlc2NyaXB0aW9uLiAgSWYgdGhhdCBmYWlscyBpdCBmYWxscyBiYWNrIHRvIHRoZSBhdXRob3IKK3NwZWNpZmllZCB3aXRoIC0tYXV0aG9yLiAgSWYgdGhlIC0tYXV0aG9yIGZsYWcgd2FzIG5vdCBnaXZlbgordGhlIHBhdGNoIGRlc2NyaXB0aW9uIGlzIGRpc3BsYXllZCBhbmQgdGhlIHVzZXIgaXMgYXNrZWQgdG8KK2ludGVyYWN0aXZlbHkgZW50ZXIgdGhlIGF1dGhvciBvZiB0aGUgcGF0Y2guCisKK0lmIGEgc3ViamVjdCBpcyBub3QgZm91bmQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uIHRoZSBwYXRjaCBuYW1lIGlzCitwcmVzZXJ2ZWQgYXMgdGhlIDEgbGluZSBzdWJqZWN0IGluIHRoZSBnaXQgZGVzY3JpcHRpb24uCisKK09QVElPTlMKKy0tLS0tLS0KKy0tZHJ5LXJ1bjo6CisJV2FsayB0aHJvdWdoIHRoZSBwYXRjaGVzIGluIHRoZSBzZXJpZXMgYW5kIHdhcm4KKwlpZiB3ZSBjYW5ub3QgZmluZCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjb21taXQKKwlhIHBhdGNoLiAgQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nIG9ubHkgbWlzc2luZyBhdXRob3IKKwlpbmZvcm1hdGlvbiBpcyB3YXJuZWQgYWJvdXQuCisKKy0tYXV0aG9yIEF1dGhvciBOYW1lIDxBdXRob3IgRW1haWw+OjoKKwlUaGUgYXV0aG9yIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MgdG8gdXNlIHdoZW4gbm8gYXV0aG9yCisJaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRjaCBkZXNjcmlwdGlvbi4KKworLS1wYXRjaGVzIDxkaXI+OjoKKwlUaGUgZGlyZWN0b3J5IHRvIGZpbmQgdGhlIHF1aWx0IHBhdGNoZXMgYW5kIHRoZQorCXF1aWx0IHNlcmllcyBmaWxlLgorKworVGhlIGRlZmF1bHQgZm9yIHRoZSBwYXRjaCBkaXJlY3RvcnkgaXMgcGF0Y2hlcworb3IgdGhlIHZhbHVlIG9mIHRoZSAkUVVJTFRfUEFUQ0hFUyBlbnZpcm9ubWVudAordmFyaWFibGUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUBsbnhpLmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQGxueGkuY29tPgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiNTc0NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQKQEAgLTAsMCArMSwzNTkgQEAKK2dpdC1yZWFkLXRyZWUoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlYWQtdHJlZSAtIFJlYWRzIHRyZWUgaW5mb3JtYXRpb24gaW50byB0aGUgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVhZC10cmVlJyAoPHRyZWUtaXNoPiB8IFtbLW0gWy0tYWdncmVzc2l2ZV0gfCAtLXJlc2V0IHwgLS1wcmVmaXg9PHByZWZpeD5dIFstdSB8IC1pXV0gWy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxnaXRpZ25vcmU+XSBbLS1pbmRleC1vdXRwdXQ9PGZpbGU+XSA8dHJlZS1pc2gxPiBbPHRyZWUtaXNoMj4gWzx0cmVlLWlzaDM+XV0pCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aGUgdHJlZSBpbmZvcm1hdGlvbiBnaXZlbiBieSA8dHJlZS1pc2g+IGludG8gdGhlIGluZGV4LAorYnV0IGRvZXMgbm90IGFjdHVhbGx5ICp1cGRhdGUqIGFueSBvZiB0aGUgZmlsZXMgaXQgImNhY2hlcyIuIChzZWU6CitnaXRsaW5rOmdpdC1jaGVja291dC1pbmRleFsxXSkKKworT3B0aW9uYWxseSwgaXQgY2FuIG1lcmdlIGEgdHJlZSBpbnRvIHRoZSBpbmRleCwgcGVyZm9ybSBhCitmYXN0LWZvcndhcmQgKGkuZS4gMi13YXkpIG1lcmdlLCBvciBhIDMtd2F5IG1lcmdlLCB3aXRoIHRoZSBgLW1gCitmbGFnLiAgV2hlbiB1c2VkIHdpdGggYC1tYCwgdGhlIGAtdWAgZmxhZyBjYXVzZXMgaXQgdG8gYWxzbyB1cGRhdGUKK3RoZSBmaWxlcyBpbiB0aGUgd29yayB0cmVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisKK1RyaXZpYWwgbWVyZ2VzIGFyZSBkb25lIGJ5IGBnaXQtcmVhZC10cmVlYCBpdHNlbGYuICBPbmx5IGNvbmZsaWN0aW5nIHBhdGhzCit3aWxsIGJlIGluIHVubWVyZ2VkIHN0YXRlIHdoZW4gYGdpdC1yZWFkLXRyZWVgIHJldHVybnMuCisKK09QVElPTlMKKy0tLS0tLS0KKy1tOjoKKwlQZXJmb3JtIGEgbWVyZ2UsIG5vdCBqdXN0IGEgcmVhZC4gIFRoZSBjb21tYW5kIHdpbGwKKwlyZWZ1c2UgdG8gcnVuIGlmIHlvdXIgaW5kZXggZmlsZSBoYXMgdW5tZXJnZWQgZW50cmllcywKKwlpbmRpY2F0aW5nIHRoYXQgeW91IGhhdmUgbm90IGZpbmlzaGVkIHByZXZpb3VzIG1lcmdlIHlvdQorCXN0YXJ0ZWQuCisKKy0tcmVzZXQ6OgorICAgICAgICBTYW1lIGFzIC1tLCBleGNlcHQgdGhhdCB1bm1lcmdlZCBlbnRyaWVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgaW5zdGVhZCBvZiBmYWlsaW5nLgorCistdTo6CisJQWZ0ZXIgYSBzdWNjZXNzZnVsIG1lcmdlLCB1cGRhdGUgdGhlIGZpbGVzIGluIHRoZSB3b3JrCisJdHJlZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCistaTo6CisJVXN1YWxseSBhIG1lcmdlIHJlcXVpcmVzIHRoZSBpbmRleCBmaWxlIGFzIHdlbGwgYXMgdGhlCisJZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcmUgdXAgdG8gZGF0ZSB3aXRoIHRoZQorCWN1cnJlbnQgaGVhZCBjb21taXQsIGluIG9yZGVyIG5vdCB0byBsb3NlIGxvY2FsCisJY2hhbmdlcy4gIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2sgd2l0aCB0aGUgd29ya2luZworCXRyZWUgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIG1lcmdlIG9mCisJdHJlZXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQKKwl3b3JraW5nIHRyZWUgc3RhdHVzIGludG8gYSB0ZW1wb3JhcnkgaW5kZXggZmlsZS4KKworLS1hZ2dyZXNzaXZlOjoKKwlVc3VhbGx5IGEgdGhyZWUtd2F5IG1lcmdlIGJ5IGBnaXQtcmVhZC10cmVlYCByZXNvbHZlcworCXRoZSBtZXJnZSBmb3IgcmVhbGx5IHRyaXZpYWwgY2FzZXMgYW5kIGxlYXZlcyBvdGhlcgorCWNhc2VzIHVucmVzb2x2ZWQgaW4gdGhlIGluZGV4LCBzbyB0aGF0IFBvcmNlbGFpbnMgY2FuCisJaW1wbGVtZW50IGRpZmZlcmVudCBtZXJnZSBwb2xpY2llcy4gIFRoaXMgZmxhZyBtYWtlcyB0aGUKKwljb21tYW5kIHRvIHJlc29sdmUgYSBmZXcgbW9yZSBjYXNlcyBpbnRlcm5hbGx5OgorKworKiB3aGVuIG9uZSBzaWRlIHJlbW92ZXMgYSBwYXRoIGFuZCB0aGUgb3RoZXIgc2lkZSBsZWF2ZXMgdGhlIHBhdGgKKyAgdW5tb2RpZmllZC4gIFRoZSByZXNvbHV0aW9uIGlzIHRvIHJlbW92ZSB0aGF0IHBhdGguCisqIHdoZW4gYm90aCBzaWRlcyByZW1vdmUgYSBwYXRoLiAgVGhlIHJlc29sdXRpb24gaXMgdG8gcmVtb3ZlIHRoYXQgcGF0aC4KKyogd2hlbiBib3RoIHNpZGVzIGFkZHMgYSBwYXRoIGlkZW50aWNhbGx5LiAgVGhlIHJlc29sdXRpb24KKyAgaXMgdG8gYWRkIHRoYXQgcGF0aC4KKworLS1wcmVmaXg9PHByZWZpeD4vOjoKKwlLZWVwIHRoZSBjdXJyZW50IGluZGV4IGNvbnRlbnRzLCBhbmQgcmVhZCB0aGUgY29udGVudHMKKwlvZiBuYW1lZCB0cmVlLWlzaCB1bmRlciBkaXJlY3RvcnkgYXQgYDxwcmVmaXg+YC4gIFRoZQorCW9yaWdpbmFsIGluZGV4IGZpbGUgY2Fubm90IGhhdmUgYW55dGhpbmcgYXQgdGhlIHBhdGgKKwlgPHByZWZpeD5gIGl0c2VsZiwgYW5kIGhhdmUgbm90aGluZyBpbiBgPHByZWZpeD4vYAorCWRpcmVjdG9yeS4gIE5vdGUgdGhhdCB0aGUgYDxwcmVmaXg+L2AgdmFsdWUgbXVzdCBlbmQKKwl3aXRoIGEgc2xhc2guCisKKy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxnaXRpZ25vcmU+OjoKKwlXaGVuIHJ1bm5pbmcgdGhlIGNvbW1hbmQgd2l0aCBgLXVgIGFuZCBgLW1gIG9wdGlvbnMsIHRoZQorCW1lcmdlIHJlc3VsdCBtYXkgbmVlZCB0byBvdmVyd3JpdGUgcGF0aHMgdGhhdCBhcmUgbm90CisJdHJhY2tlZCBpbiB0aGUgY3VycmVudCBicmFuY2guICBUaGUgY29tbWFuZCB1c3VhbGx5CisJcmVmdXNlcyB0byBwcm9jZWVkIHdpdGggdGhlIG1lcmdlIHRvIGF2b2lkIGxvc2luZyBzdWNoIGEKKwlwYXRoLiAgSG93ZXZlciB0aGlzIHNhZmV0eSB2YWx2ZSBzb21ldGltZXMgZ2V0cyBpbiB0aGUKKwl3YXkuICBGb3IgZXhhbXBsZSwgaXQgb2Z0ZW4gaGFwcGVucyB0aGF0IHRoZSBvdGhlcgorCWJyYW5jaCBhZGRlZCBhIGZpbGUgdGhhdCB1c2VkIHRvIGJlIGEgZ2VuZXJhdGVkIGZpbGUgaW4KKwl5b3VyIGJyYW5jaCwgYW5kIHRoZSBzYWZldHkgdmFsdmUgdHJpZ2dlcnMgd2hlbiB5b3UgdHJ5CisJdG8gc3dpdGNoIHRvIHRoYXQgYnJhbmNoIGFmdGVyIHlvdSByYW4gYG1ha2VgIGJ1dCBiZWZvcmUKKwlydW5uaW5nIGBtYWtlIGNsZWFuYCB0byByZW1vdmUgdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhpcworCW9wdGlvbiB0ZWxscyB0aGUgY29tbWFuZCB0byByZWFkIHBlci1kaXJlY3RvcnkgZXhjbHVkZQorCWZpbGUgKHVzdWFsbHkgJy5naXRpZ25vcmUnKSBhbmQgYWxsb3dzIHN1Y2ggYW4gdW50cmFja2VkCisJYnV0IGV4cGxpY2l0bHkgaWdub3JlZCBmaWxlIHRvIGJlIG92ZXJ3cml0dGVuLgorCistLWluZGV4LW91dHB1dD08ZmlsZT46OgorCUluc3RlYWQgb2Ygd3JpdGluZyB0aGUgcmVzdWx0cyBvdXQgdG8gYCRHSVRfSU5ERVhfRklMRWAsCisJd3JpdGUgdGhlIHJlc3VsdGluZyBpbmRleCBpbiB0aGUgbmFtZWQgZmlsZS4gIFdoaWxlIHRoZQorCWNvbW1hbmQgaXMgb3BlcmF0aW5nLCB0aGUgb3JpZ2luYWwgaW5kZXggZmlsZSBpcyBsb2NrZWQKKwl3aXRoIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyB1c3VhbC4gIFRoZSBmaWxlIG11c3QgYWxsb3cKKwl0byBiZSByZW5hbWUoMillZCBpbnRvIGZyb20gYSB0ZW1wb3JhcnkgZmlsZSB0aGF0IGlzCisJY3JlYXRlZCBuZXh0IHRvIHRoZSB1c3VhbCBpbmRleCBmaWxlOyB0eXBpY2FsbHkgdGhpcworCW1lYW5zIGl0IG5lZWRzIHRvIGJlIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0gYXMgdGhlIGluZGV4CisJZmlsZSBpdHNlbGYsIGFuZCB5b3UgbmVlZCB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZQorCWRpcmVjdG9yaWVzIHRoZSBpbmRleCBmaWxlIGFuZCBpbmRleCBvdXRwdXQgZmlsZSBhcmUKKwlsb2NhdGVkIGluLgorCis8dHJlZS1pc2gjPjo6CisJVGhlIGlkIG9mIHRoZSB0cmVlIG9iamVjdChzKSB0byBiZSByZWFkL21lcmdlZC4KKworCitNZXJnaW5nCistLS0tLS0tCitJZiBgLW1gIGlzIHNwZWNpZmllZCwgYGdpdC1yZWFkLXRyZWVgIGNhbiBwZXJmb3JtIDMga2luZHMgb2YKK21lcmdlLCBhIHNpbmdsZSB0cmVlIG1lcmdlIGlmIG9ubHkgMSB0cmVlIGlzIGdpdmVuLCBhCitmYXN0LWZvcndhcmQgbWVyZ2Ugd2l0aCAyIHRyZWVzLCBvciBhIDMtd2F5IG1lcmdlIGlmIDMgdHJlZXMgYXJlCitwcm92aWRlZC4KKworCitTaW5nbGUgVHJlZSBNZXJnZQorfn5+fn5+fn5+fn5+fn5+fn4KK0lmIG9ubHkgMSB0cmVlIGlzIHNwZWNpZmllZCwgZ2l0LXJlYWQtdHJlZSBvcGVyYXRlcyBhcyBpZiB0aGUgdXNlciBkaWQgbm90CitzcGVjaWZ5IGAtbWAsIGV4Y2VwdCB0aGF0IGlmIHRoZSBvcmlnaW5hbCBpbmRleCBoYXMgYW4gZW50cnkgZm9yIGEKK2dpdmVuIHBhdGhuYW1lLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXRoIG1hdGNoZXMgd2l0aCB0aGUgdHJlZQorYmVpbmcgcmVhZCwgdGhlIHN0YXQgaW5mbyBmcm9tIHRoZSBpbmRleCBpcyB1c2VkLiAoSW4gb3RoZXIgd29yZHMsIHRoZQoraW5kZXgncyBzdGF0KClzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBtZXJnZWQgdHJlZSdzKS4KKworVGhhdCBtZWFucyB0aGF0IGlmIHlvdSBkbyBhIGBnaXQtcmVhZC10cmVlIC1tIDxuZXd0cmVlPmAgZm9sbG93ZWQgYnkgYQorYGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtYWAsIHRoZSBgZ2l0LWNoZWNrb3V0LWluZGV4YCBvbmx5IGNoZWNrcyBvdXQKK3RoZSBzdHVmZiB0aGF0IHJlYWxseSBjaGFuZ2VkLgorCitUaGlzIGlzIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZmFsc2UgaGl0cyB3aGVuIGBnaXQtZGlmZi1maWxlc2AgaXMKK3J1biBhZnRlciBgZ2l0LXJlYWQtdHJlZWAuCisKKworVHdvIFRyZWUgTWVyZ2UKK35+fn5+fn5+fn5+fn5+CisKK1R5cGljYWxseSwgdGhpcyBpcyBpbnZva2VkIGFzIGBnaXQtcmVhZC10cmVlIC1tICRIICRNYCwgd2hlcmUgJEgKK2lzIHRoZSBoZWFkIGNvbW1pdCBvZiB0aGUgY3VycmVudCByZXBvc2l0b3J5LCBhbmQgJE0gaXMgdGhlIGhlYWQKK29mIGEgZm9yZWlnbiB0cmVlLCB3aGljaCBpcyBzaW1wbHkgYWhlYWQgb2YgJEggKGkuZS4gd2UgYXJlIGluIGEKK2Zhc3QgZm9yd2FyZCBzaXR1YXRpb24pLgorCitXaGVuIHR3byB0cmVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgdXNlciBpcyB0ZWxsaW5nIGdpdC1yZWFkLXRyZWUKK3RoZSBmb2xsb3dpbmc6CisKKyAgICAgMS4gVGhlIGN1cnJlbnQgaW5kZXggYW5kIHdvcmsgdHJlZSBpcyBkZXJpdmVkIGZyb20gJEgsIGJ1dAorICAgICAgICB0aGUgdXNlciBtYXkgaGF2ZSBsb2NhbCBjaGFuZ2VzIGluIHRoZW0gc2luY2UgJEg7CisKKyAgICAgMi4gVGhlIHVzZXIgd2FudHMgdG8gZmFzdC1mb3J3YXJkIHRvICRNLgorCitJbiB0aGlzIGNhc2UsIHRoZSBgZ2l0LXJlYWQtdHJlZSAtbSAkSCAkTWAgY29tbWFuZCBtYWtlcyBzdXJlCit0aGF0IG5vIGxvY2FsIGNoYW5nZSBpcyBsb3N0IGFzIHRoZSByZXN1bHQgb2YgdGhpcyAibWVyZ2UiLgorSGVyZSBhcmUgdGhlICJjYXJyeSBmb3J3YXJkIiBydWxlczoKKworICAgICAgICBJIChpbmRleCkgICAgICAgICAgIEggICAgICAgIE0gICAgICAgIFJlc3VsdAorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIDAgbm90aGluZyAgICAgICAgICAgICBub3RoaW5nICBub3RoaW5nICAoZG9lcyBub3QgaGFwcGVuKQorICAgICAgMSBub3RoaW5nICAgICAgICAgICAgIG5vdGhpbmcgIGV4aXN0cyAgIHVzZSBNCisgICAgICAyIG5vdGhpbmcgICAgICAgICAgICAgZXhpc3RzICAgbm90aGluZyAgcmVtb3ZlIHBhdGggZnJvbSBpbmRleAorICAgICAgMyBub3RoaW5nICAgICAgICAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIHVzZSBNCisKKyAgICAgICAgY2xlYW4gST09SCAgST09TQorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgNCB5ZXMgICBOL0EgICBOL0EgICAgIG5vdGhpbmcgIG5vdGhpbmcgIGtlZXAgaW5kZXgKKyAgICAgIDUgbm8gICAgTi9BICAgTi9BICAgICBub3RoaW5nICBub3RoaW5nICBrZWVwIGluZGV4CisKKyAgICAgIDYgeWVzICAgTi9BICAgeWVzICAgICBub3RoaW5nICBleGlzdHMgICBrZWVwIGluZGV4CisgICAgICA3IG5vICAgIE4vQSAgIHllcyAgICAgbm90aGluZyAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAgOCB5ZXMgICBOL0EgICBubyAgICAgIG5vdGhpbmcgIGV4aXN0cyAgIGZhaWwKKyAgICAgIDkgbm8gICAgTi9BICAgbm8gICAgICBub3RoaW5nICBleGlzdHMgICBmYWlsCisKKyAgICAgMTAgeWVzICAgeWVzICAgTi9BICAgICBleGlzdHMgICBub3RoaW5nICByZW1vdmUgcGF0aCBmcm9tIGluZGV4CisgICAgIDExIG5vICAgIHllcyAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgZmFpbAorICAgICAxMiB5ZXMgICBubyAgICBOL0EgICAgIGV4aXN0cyAgIG5vdGhpbmcgIGZhaWwKKyAgICAgMTMgbm8gICAgbm8gICAgTi9BICAgICBleGlzdHMgICBub3RoaW5nICBmYWlsCisKKyAgICAgICAgY2xlYW4gKEg9TSkKKyAgICAgICAtLS0tLS0KKyAgICAgMTQgeWVzICAgICAgICAgICAgICAgICBleGlzdHMgICBleGlzdHMgICBrZWVwIGluZGV4CisgICAgIDE1IG5vICAgICAgICAgICAgICAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorCisgICAgICAgIGNsZWFuIEk9PUggIEk9PU0gKEghPU0pCisgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDE2IHllcyAgIG5vICAgIG5vICAgICAgZXhpc3RzICAgZXhpc3RzICAgZmFpbAorICAgICAxNyBubyAgICBubyAgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKyAgICAgMTggeWVzICAgbm8gICAgeWVzICAgICBleGlzdHMgICBleGlzdHMgICBrZWVwIGluZGV4CisgICAgIDE5IG5vICAgIG5vICAgIHllcyAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAyMCB5ZXMgICB5ZXMgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIHVzZSBNCisgICAgIDIxIG5vICAgIHllcyAgIG5vICAgICAgZXhpc3RzICAgZXhpc3RzICAgZmFpbAorCitJbiBhbGwgImtlZXAgaW5kZXgiIGNhc2VzLCB0aGUgaW5kZXggZW50cnkgc3RheXMgYXMgaW4gdGhlCitvcmlnaW5hbCBpbmRleCBmaWxlLiAgSWYgdGhlIGVudHJ5IHdlcmUgbm90IHVwIHRvIGRhdGUsCitnaXQtcmVhZC10cmVlIGtlZXBzIHRoZSBjb3B5IGluIHRoZSB3b3JrIHRyZWUgaW50YWN0IHdoZW4KK29wZXJhdGluZyB1bmRlciB0aGUgLXUgZmxhZy4KKworV2hlbiB0aGlzIGZvcm0gb2YgZ2l0LXJlYWQtdHJlZSByZXR1cm5zIHN1Y2Nlc3NmdWxseSwgeW91IGNhbgorc2VlIHdoYXQgImxvY2FsIGNoYW5nZXMiIHlvdSBtYWRlIGFyZSBjYXJyaWVkIGZvcndhcmQgYnkgcnVubmluZworYGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICRNYC4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CituZWNlc3NhcmlseSBtYXRjaCBgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJEhgIHdvdWxkIGhhdmUKK3Byb2R1Y2VkIGJlZm9yZSBzdWNoIGEgdHdvIHRyZWUgbWVyZ2UuICBUaGlzIGlzIGJlY2F1c2Ugb2YgY2FzZXMKKzE4IGFuZCAxOSAtLS0gaWYgeW91IGFscmVhZHkgaGFkIHRoZSBjaGFuZ2VzIGluICRNIChlLmcuIG1heWJlCit5b3UgcGlja2VkIGl0IHVwIHZpYSBlLW1haWwgaW4gYSBwYXRjaCBmb3JtKSwgYGdpdC1kaWZmLWluZGV4CistLWNhY2hlZCAkSGAgd291bGQgaGF2ZSB0b2xkIHlvdSBhYm91dCB0aGUgY2hhbmdlIGJlZm9yZSB0aGlzCittZXJnZSwgYnV0IGl0IHdvdWxkIG5vdCBzaG93IGluIGBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkTWAKK291dHB1dCBhZnRlciB0d28tdHJlZSBtZXJnZS4KKworCiszLVdheSBNZXJnZQorfn5+fn5+fn5+fn4KK0VhY2ggImluZGV4IiBlbnRyeSBoYXMgdHdvIGJpdHMgd29ydGggb2YgInN0YWdlIiBzdGF0ZS4gc3RhZ2UgMCBpcyB0aGUKK25vcm1hbCBvbmUsIGFuZCBpcyB0aGUgb25seSBvbmUgeW91J2Qgc2VlIGluIGFueSBraW5kIG9mIG5vcm1hbCB1c2UuCisKK0hvd2V2ZXIsIHdoZW4geW91IGRvIGBnaXQtcmVhZC10cmVlYCB3aXRoIHRocmVlIHRyZWVzLCB0aGUgInN0YWdlIgorc3RhcnRzIG91dCBhdCAxLgorCitUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgLW0gPHRyZWUxPiA8dHJlZTI+IDx0cmVlMz4KKy0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSB3aWxsIGVuZCB1cCB3aXRoIGFuIGluZGV4IHdpdGggYWxsIG9mIHRoZSA8dHJlZTE+IGVudHJpZXMgaW4KKyJzdGFnZTEiLCBhbGwgb2YgdGhlIDx0cmVlMj4gZW50cmllcyBpbiAic3RhZ2UyIiBhbmQgYWxsIG9mIHRoZQorPHRyZWUzPiBlbnRyaWVzIGluICJzdGFnZTMiLiAgV2hlbiBwZXJmb3JtaW5nIGEgbWVyZ2Ugb2YgYW5vdGhlcgorYnJhbmNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLCB3ZSB1c2UgdGhlIGNvbW1vbiBhbmNlc3RvciB0cmVlCithcyA8dHJlZTE+LCB0aGUgY3VycmVudCBicmFuY2ggaGVhZCBhcyA8dHJlZTI+LCBhbmQgdGhlIG90aGVyCiticmFuY2ggaGVhZCBhcyA8dHJlZTM+LgorCitGdXJ0aGVybW9yZSwgYGdpdC1yZWFkLXRyZWVgIGhhcyBzcGVjaWFsLWNhc2UgbG9naWMgdGhhdCBzYXlzOiBpZiB5b3Ugc2VlCithIGZpbGUgdGhhdCBtYXRjaGVzIGluIGFsbCByZXNwZWN0cyBpbiB0aGUgZm9sbG93aW5nIHN0YXRlcywgaXQKKyJjb2xsYXBzZXMiIGJhY2sgdG8gInN0YWdlMCI6CisKKyAgIC0gc3RhZ2UgMiBhbmQgMyBhcmUgdGhlIHNhbWU7IHRha2Ugb25lIG9yIHRoZSBvdGhlciAoaXQgbWFrZXMgbm8KKyAgICAgZGlmZmVyZW5jZSAtIHRoZSBzYW1lIHdvcmsgaGFzIGJlZW4gZG9uZSBvbiBvdXIgYnJhbmNoIGluCisgICAgIHN0YWdlIDIgYW5kIHRoZWlyIGJyYW5jaCBpbiBzdGFnZSAzKQorCisgICAtIHN0YWdlIDEgYW5kIHN0YWdlIDIgYXJlIHRoZSBzYW1lIGFuZCBzdGFnZSAzIGlzIGRpZmZlcmVudDsgdGFrZQorICAgICBzdGFnZSAzIChvdXIgYnJhbmNoIGluIHN0YWdlIDIgZGlkIG5vdCBkbyBhbnl0aGluZyBzaW5jZSB0aGUKKyAgICAgYW5jZXN0b3IgaW4gc3RhZ2UgMSB3aGlsZSB0aGVpciBicmFuY2ggaW4gc3RhZ2UgMyB3b3JrZWQgb24KKyAgICAgaXQpCisKKyAgIC0gc3RhZ2UgMSBhbmQgc3RhZ2UgMyBhcmUgdGhlIHNhbWUgYW5kIHN0YWdlIDIgaXMgZGlmZmVyZW50IHRha2UKKyAgICAgc3RhZ2UgMiAod2UgZGlkIHNvbWV0aGluZyB3aGlsZSB0aGV5IGRpZCBub3RoaW5nKQorCitUaGUgYGdpdC13cml0ZS10cmVlYCBjb21tYW5kIHJlZnVzZXMgdG8gd3JpdGUgYSBub25zZW5zaWNhbCB0cmVlLCBhbmQgaXQKK3dpbGwgY29tcGxhaW4gYWJvdXQgdW5tZXJnZWQgZW50cmllcyBpZiBpdCBzZWVzIGEgc2luZ2xlIGVudHJ5IHRoYXQgaXMgbm90CitzdGFnZSAwLgorCitPSywgdGhpcyBhbGwgc291bmRzIGxpa2UgYSBjb2xsZWN0aW9uIG9mIHRvdGFsbHkgbm9uc2Vuc2ljYWwgcnVsZXMsCitidXQgaXQncyBhY3R1YWxseSBleGFjdGx5IHdoYXQgeW91IHdhbnQgaW4gb3JkZXIgdG8gZG8gYSBmYXN0CittZXJnZS4gVGhlIGRpZmZlcmVudCBzdGFnZXMgcmVwcmVzZW50IHRoZSAicmVzdWx0IHRyZWUiIChzdGFnZSAwLCBha2EKKyJtZXJnZWQiKSwgdGhlIG9yaWdpbmFsIHRyZWUgKHN0YWdlIDEsIGFrYSAib3JpZyIpLCBhbmQgdGhlIHR3byB0cmVlcworeW91IGFyZSB0cnlpbmcgdG8gbWVyZ2UgKHN0YWdlIDIgYW5kIDMgcmVzcGVjdGl2ZWx5KS4KKworVGhlIG9yZGVyIG9mIHN0YWdlcyAxLCAyIGFuZCAzIChoZW5jZSB0aGUgb3JkZXIgb2YgdGhyZWUKKzx0cmVlLWlzaD4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cykgYXJlIHNpZ25pZmljYW50IHdoZW4geW91CitzdGFydCBhIDMtd2F5IG1lcmdlIHdpdGggYW4gaW5kZXggZmlsZSB0aGF0IGlzIGFscmVhZHkKK3BvcHVsYXRlZC4gIEhlcmUgaXMgYW4gb3V0bGluZSBvZiBob3cgdGhlIGFsZ29yaXRobSB3b3JrczoKKworLSBpZiBhIGZpbGUgZXhpc3RzIGluIGlkZW50aWNhbCBmb3JtYXQgaW4gYWxsIHRocmVlIHRyZWVzLCBpdCB3aWxsCisgIGF1dG9tYXRpY2FsbHkgY29sbGFwc2UgdG8gIm1lcmdlZCIgc3RhdGUgYnkgZ2l0LXJlYWQtdHJlZS4KKworLSBhIGZpbGUgdGhhdCBoYXMgX2FueV8gZGlmZmVyZW5jZSB3aGF0LXNvLWV2ZXIgaW4gdGhlIHRocmVlIHRyZWVzCisgIHdpbGwgc3RheSBhcyBzZXBhcmF0ZSBlbnRyaWVzIGluIHRoZSBpbmRleC4gSXQncyB1cCB0byAicG9yY2VsYWluCisgIHBvbGljeSIgdG8gZGV0ZXJtaW5lIGhvdyB0byByZW1vdmUgdGhlIG5vbi0wIHN0YWdlcywgYW5kIGluc2VydCBhCisgIG1lcmdlZCB2ZXJzaW9uLgorCistIHRoZSBpbmRleCBmaWxlIHNhdmVzIGFuZCByZXN0b3JlcyB3aXRoIGFsbCB0aGlzIGluZm9ybWF0aW9uLCBzbyB5b3UKKyAgY2FuIG1lcmdlIHRoaW5ncyBpbmNyZW1lbnRhbGx5LCBidXQgYXMgbG9uZyBhcyBpdCBoYXMgZW50cmllcyBpbgorICBzdGFnZXMgMS8yLzMgKGkuZS4sICJ1bm1lcmdlZCBlbnRyaWVzIikgeW91IGNhbid0IHdyaXRlIHRoZSByZXN1bHQuIFNvCisgIG5vdyB0aGUgbWVyZ2UgYWxnb3JpdGhtIGVuZHMgdXAgYmVpbmcgcmVhbGx5IHNpbXBsZToKKworICAqIHlvdSB3YWxrIHRoZSBpbmRleCBpbiBvcmRlciwgYW5kIGlnbm9yZSBhbGwgZW50cmllcyBvZiBzdGFnZSAwLAorICAgIHNpbmNlIHRoZXkndmUgYWxyZWFkeSBiZWVuIGRvbmUuCisKKyAgKiBpZiB5b3UgZmluZCBhICJzdGFnZTEiLCBidXQgbm8gbWF0Y2hpbmcgInN0YWdlMiIgb3IgInN0YWdlMyIsIHlvdQorICAgIGtub3cgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSBib3RoIHRyZWVzIChpdCBvbmx5IGV4aXN0ZWQgaW4gdGhlCisgICAgb3JpZ2luYWwgdHJlZSksIGFuZCB5b3UgcmVtb3ZlIHRoYXQgZW50cnkuCisKKyAgKiBpZiB5b3UgZmluZCBhIG1hdGNoaW5nICJzdGFnZTIiIGFuZCAic3RhZ2UzIiB0cmVlLCB5b3UgcmVtb3ZlIG9uZQorICAgIG9mIHRoZW0sIGFuZCB0dXJuIHRoZSBvdGhlciBpbnRvIGEgInN0YWdlMCIgZW50cnkuIFJlbW92ZSBhbnkKKyAgICBtYXRjaGluZyAic3RhZ2UxIiBlbnRyeSBpZiBpdCBleGlzdHMgdG9vLiAgLi4gYWxsIHRoZSBub3JtYWwKKyAgICB0cml2aWFsIHJ1bGVzIC4uCisKK1lvdSB3b3VsZCBub3JtYWxseSB1c2UgYGdpdC1tZXJnZS1pbmRleGAgd2l0aCBzdXBwbGllZAorYGdpdC1tZXJnZS1vbmUtZmlsZWAgdG8gZG8gdGhpcyBsYXN0IHN0ZXAuICBUaGUgc2NyaXB0IHVwZGF0ZXMKK3RoZSBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIGFzIGl0IG1lcmdlcyBlYWNoIHBhdGggYW5kIGF0IHRoZQorZW5kIG9mIGEgc3VjY2Vzc2Z1bCBtZXJnZS4KKworV2hlbiB5b3Ugc3RhcnQgYSAzLXdheSBtZXJnZSB3aXRoIGFuIGluZGV4IGZpbGUgdGhhdCBpcyBhbHJlYWR5Citwb3B1bGF0ZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUKK2ZpbGVzIGluIHlvdXIgd29yayB0cmVlLCBhbmQgeW91IGNhbiBldmVuIGhhdmUgZmlsZXMgd2l0aAorY2hhbmdlcyB1bnJlY29yZGVkIGluIHRoZSBpbmRleCBmaWxlLiAgSXQgaXMgZnVydGhlciBhc3N1bWVkCit0aGF0IHRoaXMgc3RhdGUgaXMgImRlcml2ZWQiIGZyb20gdGhlIHN0YWdlIDIgdHJlZS4gIFRoZSAzLXdheQorbWVyZ2UgcmVmdXNlcyB0byBydW4gaWYgaXQgZmluZHMgYW4gZW50cnkgaW4gdGhlIG9yaWdpbmFsIGluZGV4CitmaWxlIHRoYXQgZG9lcyBub3QgbWF0Y2ggc3RhZ2UgMi4KKworVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgeW91IGZyb20gbG9zaW5nIHlvdXIgd29yay1pbi1wcm9ncmVzcworY2hhbmdlcywgYW5kIG1peGluZyB5b3VyIHJhbmRvbSBjaGFuZ2VzIGluIGFuIHVucmVsYXRlZCBtZXJnZQorY29tbWl0LiAgVG8gaWxsdXN0cmF0ZSwgc3VwcG9zZSB5b3Ugc3RhcnQgZnJvbSB3aGF0IGhhcyBiZWVuCitjb21taXR0ZWQgbGFzdCB0byB5b3VyIHJlcG9zaXRvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgSkM9YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIkhFQUReMCJgCiskIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtYSAkSkMKKy0tLS0tLS0tLS0tLS0tLS0KKworWW91IGRvIHJhbmRvbSBlZGl0cywgd2l0aG91dCBydW5uaW5nIGdpdC11cGRhdGUtaW5kZXguICBBbmQgdGhlbgoreW91IG5vdGljZSB0aGF0IHRoZSB0aXAgb2YgeW91ciAidXBzdHJlYW0iIHRyZWUgaGFzIGFkdmFuY2VkCitzaW5jZSB5b3UgcHVsbGVkIGZyb20gaGltOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1mZXRjaCBnaXQ6Ly8uLi4uIGxpbnVzCiskIExUPWBjYXQgLmdpdC9GRVRDSF9IRUFEYAorLS0tLS0tLS0tLS0tLS0tLQorCitZb3VyIHdvcmsgdHJlZSBpcyBzdGlsbCBiYXNlZCBvbiB5b3VyIEhFQUQgKCRKQyksIGJ1dCB5b3UgaGF2ZQorc29tZSBlZGl0cyBzaW5jZS4gIFRocmVlLXdheSBtZXJnZSBtYWtlcyBzdXJlIHRoYXQgeW91IGhhdmUgbm90CithZGRlZCBvciBtb2RpZmllZCBpbmRleCBlbnRyaWVzIHNpbmNlICRKQywgYW5kIGlmIHlvdSBoYXZlbid0LAordGhlbiBkb2VzIHRoZSByaWdodCB0aGluZy4gIFNvIHdpdGggdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIC11IGBnaXQtbWVyZ2UtYmFzZSAkSkMgJExUYCAkSkMgJExUCiskIGdpdC1tZXJnZS1pbmRleCBnaXQtbWVyZ2Utb25lLWZpbGUgLWEKKyQgZWNobyAiTWVyZ2Ugd2l0aCBMaW51cyIgfCBcCisgIGdpdC1jb21taXQtdHJlZSBgZ2l0LXdyaXRlLXRyZWVgIC1wICRKQyAtcCAkTFQKKy0tLS0tLS0tLS0tLS0tLS0KKword2hhdCB5b3Ugd291bGQgY29tbWl0IGlzIGEgcHVyZSBtZXJnZSBiZXR3ZWVuICRKQyBhbmQgJExUIHdpdGhvdXQKK3lvdXIgd29yay1pbi1wcm9ncmVzcyBjaGFuZ2VzLCBhbmQgeW91ciB3b3JrIHRyZWUgd291bGQgYmUKK3VwZGF0ZWQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisKK0hvd2V2ZXIsIGlmIHlvdSBoYXZlIGxvY2FsIGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSB0aGF0Cit3b3VsZCBiZSBvdmVyd3JpdHRlbiBieSB0aGlzIG1lcmdlLGBnaXQtcmVhZC10cmVlYCB3aWxsIHJlZnVzZQordG8gcnVuIHRvIHByZXZlbnQgeW91ciBjaGFuZ2VzIGZyb20gYmVpbmcgbG9zdC4KKworSW4gb3RoZXIgd29yZHMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCBleGlzdHMgb25seQoraW4gdGhlIHdvcmtpbmcgdHJlZS4gIFdoZW4geW91IGhhdmUgbG9jYWwgY2hhbmdlcyBpbiBhIHBhcnQgb2YKK3RoZSBwcm9qZWN0IHRoYXQgaXMgbm90IGludm9sdmVkIGluIHRoZSBtZXJnZSwgeW91ciBjaGFuZ2VzIGRvCitub3QgaW50ZXJmZXJlIHdpdGggdGhlIG1lcmdlLCBhbmQgYXJlIGtlcHQgaW50YWN0LiAgV2hlbiB0aGV5CisqZG8qIGludGVyZmVyZSwgdGhlIG1lcmdlIGRvZXMgbm90IGV2ZW4gc3RhcnQgKGBnaXQtcmVhZC10cmVlYAorY29tcGxhaW5zIGxvdWRseSBhbmQgZmFpbHMgd2l0aG91dCBtb2RpZnlpbmcgYW55dGhpbmcpLiAgSW4gc3VjaAorYSBjYXNlLCB5b3UgY2FuIHNpbXBseSBjb250aW51ZSBkb2luZyB3aGF0IHlvdSB3ZXJlIGluIHRoZQorbWlkZGxlIG9mIGRvaW5nLCBhbmQgd2hlbiB5b3VyIHdvcmtpbmcgdHJlZSBpcyByZWFkeSAoaS5lLiB5b3UKK2hhdmUgZmluaXNoZWQgeW91ciB3b3JrLWluLXByb2dyZXNzKSwgYXR0ZW1wdCB0aGUgbWVyZ2UgYWdhaW4uCisKKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC13cml0ZS10cmVlWzFdOyBnaXRsaW5rOmdpdC1scy1maWxlc1sxXTsKK2dpdGxpbms6Z2l0aWdub3JlWzVdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWJhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2IyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWJhc2UudHh0CkBAIC0wLDAgKzEsMjQwIEBACitnaXQtcmViYXNlKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWJhc2UgLSBGb3J3YXJkLXBvcnQgbG9jYWwgY29tbWl0cyB0byB0aGUgdXBkYXRlZCB1cHN0cmVhbSBoZWFkCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1yZWJhc2UnIFstdl0gWy0tbWVyZ2VdIFstQzxuPl0gWy0tb250byA8bmV3YmFzZT5dIDx1cHN0cmVhbT4gWzxicmFuY2g+XQorJ2dpdC1yZWJhc2UnIC0tY29udGludWUgfCAtLXNraXAgfCAtLWFib3J0CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSWYgPGJyYW5jaD4gaXMgc3BlY2lmaWVkLCBnaXQtcmViYXNlIHdpbGwgcGVyZm9ybSBhbiBhdXRvbWF0aWMKK2BnaXQgY2hlY2tvdXQgPGJyYW5jaD5gIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgT3RoZXJ3aXNlCitpdCByZW1haW5zIG9uIHRoZSBjdXJyZW50IGJyYW5jaC4KKworQWxsIGNoYW5nZXMgbWFkZSBieSBjb21taXRzIGluIHRoZSBjdXJyZW50IGJyYW5jaCBidXQgdGhhdCBhcmUgbm90CitpbiA8dXBzdHJlYW0+IGFyZSBzYXZlZCB0byBhIHRlbXBvcmFyeSBhcmVhLiAgVGhpcyBpcyB0aGUgc2FtZSBzZXQKK29mIGNvbW1pdHMgdGhhdCB3b3VsZCBiZSBzaG93biBieSBgZ2l0IGxvZyA8dXBzdHJlYW0+Li5IRUFEYC4KKworVGhlIGN1cnJlbnQgYnJhbmNoIGlzIHJlc2V0IHRvIDx1cHN0cmVhbT4sIG9yIDxuZXdiYXNlPiBpZiB0aGUKKy0tb250byBvcHRpb24gd2FzIHN1cHBsaWVkLiAgVGhpcyBoYXMgdGhlIGV4YWN0IHNhbWUgZWZmZWN0IGFzCitgZ2l0IHJlc2V0IC0taGFyZCA8dXBzdHJlYW0+YCAob3IgPG5ld2Jhc2U+KS4KKworVGhlIGNvbW1pdHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2F2ZWQgaW50byB0aGUgdGVtcG9yYXJ5IGFyZWEgYXJlCit0aGVuIHJlYXBwbGllZCB0byB0aGUgY3VycmVudCBicmFuY2gsIG9uZSBieSBvbmUsIGluIG9yZGVyLgorCitJdCBpcyBwb3NzaWJsZSB0aGF0IGEgbWVyZ2UgZmFpbHVyZSB3aWxsIHByZXZlbnQgdGhpcyBwcm9jZXNzIGZyb20gYmVpbmcKK2NvbXBsZXRlbHkgYXV0b21hdGljLiAgWW91IHdpbGwgaGF2ZSB0byByZXNvbHZlIGFueSBzdWNoIG1lcmdlIGZhaWx1cmUKK2FuZCBydW4gYGdpdCByZWJhc2UgLS1jb250aW51ZWAuICBBbm90aGVyIG9wdGlvbiBpcyB0byBieXBhc3MgdGhlIGNvbW1pdAordGhhdCBjYXVzZWQgdGhlIG1lcmdlIGZhaWx1cmUgd2l0aCBgZ2l0IHJlYmFzZSAtLXNraXBgLiAgVG8gcmVzdG9yZSB0aGUKK29yaWdpbmFsIDxicmFuY2g+IGFuZCByZW1vdmUgdGhlIC5kb3Rlc3Qgd29ya2luZyBmaWxlcywgdXNlIHRoZSBjb21tYW5kCitgZ2l0IHJlYmFzZSAtLWFib3J0YCBpbnN0ZWFkLgorCitBc3N1bWUgdGhlIGZvbGxvd2luZyBoaXN0b3J5IGV4aXN0cyBhbmQgdGhlIGN1cnJlbnQgYnJhbmNoIGlzICJ0b3BpYyI6CisKKy0tLS0tLS0tLS0tLQorICAgICAgICAgIEEtLS1CLS0tQyB0b3BpYworICAgICAgICAgLworICAgIEQtLS1FLS0tRi0tLUcgbWFzdGVyCistLS0tLS0tLS0tLS0KKworRnJvbSB0aGlzIHBvaW50LCB0aGUgcmVzdWx0IG9mIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisKKyAgICBnaXQtcmViYXNlIG1hc3RlcgorICAgIGdpdC1yZWJhc2UgbWFzdGVyIHRvcGljCisKK3dvdWxkIGJlOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgIEEnLS1CJy0tQycgdG9waWMKKyAgICAgICAgICAgICAgICAgLworICAgIEQtLS1FLS0tRi0tLUcgbWFzdGVyCistLS0tLS0tLS0tLS0KKworVGhlIGxhdHRlciBmb3JtIGlzIGp1c3QgYSBzaG9ydC1oYW5kIG9mIGBnaXQgY2hlY2tvdXQgdG9waWNgCitmb2xsb3dlZCBieSBgZ2l0IHJlYmFzZSBtYXN0ZXJgLgorCitIZXJlIGlzIGhvdyB5b3Ugd291bGQgdHJhbnNwbGFudCBhIHRvcGljIGJyYW5jaCBiYXNlZCBvbiBvbmUKK2JyYW5jaCB0byBhbm90aGVyLCB0byBwcmV0ZW5kIHRoYXQgeW91IGZvcmtlZCB0aGUgdG9waWMgYnJhbmNoCitmcm9tIHRoZSBsYXR0ZXIgYnJhbmNoLCB1c2luZyBgcmViYXNlIC0tb250b2AuCisKK0ZpcnN0IGxldCdzIGFzc3VtZSB5b3VyICd0b3BpYycgaXMgYmFzZWQgb24gYnJhbmNoICduZXh0Jy4KK0ZvciBleGFtcGxlIGZlYXR1cmUgZGV2ZWxvcGVkIGluICd0b3BpYycgZGVwZW5kcyBvbiBzb21lCitmdW5jdGlvbmFsaXR5IHdoaWNoIGlzIGZvdW5kIGluICduZXh0Jy4KKworLS0tLS0tLS0tLS0tCisgICAgby0tLW8tLS1vLS0tby0tLW8gIG1hc3RlcgorICAgICAgICAgXAorICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vICBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgby0tLW8tLS1vICB0b3BpYworLS0tLS0tLS0tLS0tCisKK1dlIHdvdWxkIHdhbnQgdG8gbWFrZSAndG9waWMnIGZvcmtlZCBmcm9tIGJyYW5jaCAnbWFzdGVyJywKK2ZvciBleGFtcGxlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgJ3RvcGljJyBicmFuY2ggZGVwZW5kIG9uCitnb3QgbWVyZ2VkIGludG8gbW9yZSBzdGFibGUgJ21hc3RlcicgYnJhbmNoLCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorICAgIG8tLS1vLS0tby0tLW8tLS1vICBtYXN0ZXIKKyAgICAgICAgfCAgICAgICAgICAgIFwKKyAgICAgICAgfCAgICAgICAgICAgICBvJy0tbyctLW8nICB0b3BpYworICAgICAgICAgXAorICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vICBuZXh0CistLS0tLS0tLS0tLS0KKworV2UgY2FuIGdldCB0aGlzIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3RlciBuZXh0IHRvcGljCisKKworQW5vdGhlciBleGFtcGxlIG9mIC0tb250byBvcHRpb24gaXMgdG8gcmViYXNlIHBhcnQgb2YgYQorYnJhbmNoLiAgSWYgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSC0tLUktLS1KIHRvcGljQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAgICAgICAgICAgICAgRS0tLUYtLS1HICB0b3BpY0EKKyAgICAgICAgICAgICAgICAgLworICAgIEEtLS1CLS0tQy0tLUQgIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK3RoZW4gdGhlIGNvbW1hbmQKKworICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3RlciB0b3BpY0EgdG9waWNCCisKK3dvdWxkIHJlc3VsdCBpbjoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgIEgnLS1JJy0tSicgIHRvcGljQgorICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAgICB8IEUtLS1GLS0tRyAgdG9waWNBCisgICAgICAgICAgICAgICAgfC8KKyAgICBBLS0tQi0tLUMtLS1EICBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWZ1bCB3aGVuIHRvcGljQiBkb2VzIG5vdCBkZXBlbmQgb24gdG9waWNBLgorCitBIHJhbmdlIG9mIGNvbW1pdHMgY291bGQgYWxzbyBiZSByZW1vdmVkIHdpdGggcmViYXNlLiAgSWYgd2UgaGF2ZQordGhlIGZvbGxvd2luZyBzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLQorICAgIEUtLS1GLS0tRy0tLUgtLS1JLS0tSiAgdG9waWNBCistLS0tLS0tLS0tLS0KKwordGhlbiB0aGUgY29tbWFuZAorCisgICAgZ2l0LXJlYmFzZSAtLW9udG8gdG9waWNBfjUgdG9waWNBfjIgdG9waWNBCisKK3dvdWxkIHJlc3VsdCBpbiB0aGUgcmVtb3ZhbCBvZiBjb21taXRzIEYgYW5kIEc6CisKKy0tLS0tLS0tLS0tLQorICAgIEUtLS1IJy0tLUknLS0tSicgIHRvcGljQQorLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdXNlZnVsIGlmIEYgYW5kIEcgd2VyZSBmbGF3ZWQgaW4gc29tZSB3YXksIG9yIHNob3VsZCBub3QgYmUKK3BhcnQgb2YgdG9waWNBLiAgTm90ZSB0aGF0IHRoZSBhcmd1bWVudCB0byAtLW9udG8gYW5kIHRoZSA8dXBzdHJlYW0+CitwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWxpZCBjb21taXQtaXNoLgorCitJbiBjYXNlIG9mIGNvbmZsaWN0LCBnaXQtcmViYXNlIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3QgcHJvYmxlbWF0aWMgY29tbWl0CithbmQgbGVhdmUgY29uZmxpY3QgbWFya2VycyBpbiB0aGUgdHJlZS4gIFlvdSBjYW4gdXNlIGdpdCBkaWZmIHRvIGxvY2F0ZQordGhlIG1hcmtlcnMgKDw8PDw8PCkgYW5kIG1ha2UgZWRpdHMgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QuICBGb3IgZWFjaAorZmlsZSB5b3UgZWRpdCwgeW91IG5lZWQgdG8gdGVsbCBnaXQgdGhhdCB0aGUgY29uZmxpY3QgaGFzIGJlZW4gcmVzb2x2ZWQsCit0eXBpY2FsbHkgdGhpcyB3b3VsZCBiZSBkb25lIHdpdGgKKworCisgICAgZ2l0IGFkZCA8ZmlsZW5hbWU+CisKKworQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdCBtYW51YWxseSBhbmQgdXBkYXRpbmcgdGhlIGluZGV4IHdpdGggdGhlCitkZXNpcmVkIHJlc29sdXRpb24sIHlvdSBjYW4gY29udGludWUgdGhlIHJlYmFzaW5nIHByb2Nlc3Mgd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tY29udGludWUKKworCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVuZG8gdGhlIGdpdC1yZWJhc2Ugd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tYWJvcnQKKworT1BUSU9OUworLS0tLS0tLQorPG5ld2Jhc2U+OjoKKwlTdGFydGluZyBwb2ludCBhdCB3aGljaCB0byBjcmVhdGUgdGhlIG5ldyBjb21taXRzLiBJZiB0aGUKKwktLW9udG8gb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFydGluZyBwb2ludCBpcworCTx1cHN0cmVhbT4uICBNYXkgYmUgYW55IHZhbGlkIGNvbW1pdCwgYW5kIG5vdCBqdXN0IGFuCisJZXhpc3RpbmcgYnJhbmNoIG5hbWUuCisKKzx1cHN0cmVhbT46OgorCVVwc3RyZWFtIGJyYW5jaCB0byBjb21wYXJlIGFnYWluc3QuICBNYXkgYmUgYW55IHZhbGlkIGNvbW1pdCwKKwlub3QganVzdCBhbiBleGlzdGluZyBicmFuY2ggbmFtZS4KKworPGJyYW5jaD46OgorCVdvcmtpbmcgYnJhbmNoOyBkZWZhdWx0cyB0byBIRUFELgorCistLWNvbnRpbnVlOjoKKwlSZXN0YXJ0IHRoZSByZWJhc2luZyBwcm9jZXNzIGFmdGVyIGhhdmluZyByZXNvbHZlZCBhIG1lcmdlIGNvbmZsaWN0LgorCistLWFib3J0OjoKKwlSZXN0b3JlIHRoZSBvcmlnaW5hbCBicmFuY2ggYW5kIGFib3J0IHRoZSByZWJhc2Ugb3BlcmF0aW9uLgorCistLXNraXA6OgorCVJlc3RhcnQgdGhlIHJlYmFzaW5nIHByb2Nlc3MgYnkgc2tpcHBpbmcgdGhlIGN1cnJlbnQgcGF0Y2guCisKKy0tbWVyZ2U6OgorCVVzZSBtZXJnaW5nIHN0cmF0ZWdpZXMgdG8gcmViYXNlLiAgV2hlbiB0aGUgcmVjdXJzaXZlIChkZWZhdWx0KSBtZXJnZQorCXN0cmF0ZWd5IGlzIHVzZWQsIHRoaXMgYWxsb3dzIHJlYmFzZSB0byBiZSBhd2FyZSBvZiByZW5hbWVzIG9uIHRoZQorCXVwc3RyZWFtIHNpZGUuCisKKy1zIDxzdHJhdGVneT4sIFwtLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCVVzZSB0aGUgZ2l2ZW4gbWVyZ2Ugc3RyYXRlZ3k7IGNhbiBiZSBzdXBwbGllZCBtb3JlIHRoYW4KKwlvbmNlIHRvIHNwZWNpZnkgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJpZWQuCisJSWYgdGhlcmUgaXMgbm8gYC1zYCBvcHRpb24sIGEgYnVpbHQtaW4gbGlzdCBvZiBzdHJhdGVnaWVzCisJaXMgdXNlZCBpbnN0ZWFkIChgZ2l0LW1lcmdlLXJlY3Vyc2l2ZWAgd2hlbiBtZXJnaW5nIGEgc2luZ2xlCisJaGVhZCwgYGdpdC1tZXJnZS1vY3RvcHVzYCBvdGhlcndpc2UpLiAgVGhpcyBpbXBsaWVzIC0tbWVyZ2UuCisKKy12LCBcLS12ZXJib3NlOjoKKwlEaXNwbGF5IGEgZGlmZnN0YXQgb2Ygd2hhdCBjaGFuZ2VkIHVwc3RyZWFtIHNpbmNlIHRoZSBsYXN0IHJlYmFzZS4KKworLUM8bj46OgorCUVuc3VyZSBhdCBsZWFzdCA8bj4gbGluZXMgb2Ygc3Vycm91bmRpbmcgY29udGV4dCBtYXRjaCBiZWZvcmUKKwlhbmQgYWZ0ZXIgZWFjaCBjaGFuZ2UuICBXaGVuIGZld2VyIGxpbmVzIG9mIHN1cnJvdW5kaW5nCisJY29udGV4dCBleGlzdCB0aGV5IGFsbCBtdXN0IG1hdGNoLiAgQnkgZGVmYXVsdCBubyBjb250ZXh0IGlzCisJZXZlciBpZ25vcmVkLgorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKK05PVEVTCistLS0tLQorV2hlbiB5b3UgcmViYXNlIGEgYnJhbmNoLCB5b3UgYXJlIGNoYW5naW5nIGl0cyBoaXN0b3J5IGluIGEgd2F5IHRoYXQKK3dpbGwgY2F1c2UgcHJvYmxlbXMgZm9yIGFueW9uZSB3aG8gYWxyZWFkeSBoYXMgYSBjb3B5IG9mIHRoZSBicmFuY2gKK2luIHRoZWlyIHJlcG9zaXRvcnkgYW5kIHRyaWVzIHRvIHB1bGwgdXBkYXRlcyBmcm9tIHlvdS4gIFlvdSBzaG91bGQKK3VuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB1c2luZyAnZ2l0IHJlYmFzZScgb24gYSByZXBvc2l0b3J5IHRoYXQKK3lvdSBzaGFyZS4KKworV2hlbiB0aGUgZ2l0IHJlYmFzZSBjb21tYW5kIGlzIHJ1biwgaXQgd2lsbCBmaXJzdCBleGVjdXRlIGEgInByZS1yZWJhc2UiCitob29rIGlmIG9uZSBleGlzdHMuICBZb3UgY2FuIHVzZSB0aGlzIGhvb2sgdG8gZG8gc2FuaXR5IGNoZWNrcyBhbmQKK3JlamVjdCB0aGUgcmViYXNlIGlmIGl0IGlzbid0IGFwcHJvcHJpYXRlLiAgUGxlYXNlIHNlZSB0aGUgdGVtcGxhdGUKK3ByZS1yZWJhc2UgaG9vayBzY3JpcHQgZm9yIGFuIGV4YW1wbGUuCisKK1lvdSBtdXN0IGJlIGluIHRoZSB0b3AgZGlyZWN0b3J5IG9mIHlvdXIgcHJvamVjdCB0byBzdGFydCAob3IgY29udGludWUpCithIHJlYmFzZS4gIFVwb24gY29tcGxldGlvbiwgPGJyYW5jaD4gd2lsbCBiZSB0aGUgY3VycmVudCBicmFuY2guCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWNlaXZlLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVjZWl2ZS1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE0YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVjZWl2ZS1wYWNrLnR4dApAQCAtMCwwICsxLDE2NSBAQAorZ2l0LXJlY2VpdmUtcGFjaygxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVjZWl2ZS1wYWNrIC0gUmVjZWl2ZSB3aGF0IGlzIHB1c2hlZCBpbnRvIHRoZSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlY2VpdmUtcGFjaycgPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VkIGJ5ICdnaXQtc2VuZC1wYWNrJyBhbmQgdXBkYXRlcyB0aGUgcmVwb3NpdG9yeSB3aXRoIHRoZQoraW5mb3JtYXRpb24gZmVkIGZyb20gdGhlIHJlbW90ZSBlbmQuCisKK1RoaXMgY29tbWFuZCBpcyB1c3VhbGx5IG5vdCBpbnZva2VkIGRpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlci4KK1RoZSBVSSBmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LXNlbmQtcGFjaycgc2lkZSwgYW5kIHRoZQorcHJvZ3JhbSBwYWlyIGlzIG1lYW50IHRvIGJlIHVzZWQgdG8gcHVzaCB1cGRhdGVzIHRvIHJlbW90ZQorcmVwb3NpdG9yeS4gIEZvciBwdWxsIG9wZXJhdGlvbnMsIHNlZSAnZ2l0LWZldGNoLXBhY2snLgorCitUaGUgY29tbWFuZCBhbGxvd3MgZm9yIGNyZWF0aW9uIGFuZCBmYXN0IGZvcndhcmRpbmcgb2Ygc2hhMSByZWZzCisoaGVhZHMvdGFncykgb24gdGhlIHJlbW90ZSBlbmQgKHN0cmljdGx5IHNwZWFraW5nLCBpdCBpcyB0aGUKK2xvY2FsIGVuZCByZWNlaXZlLXBhY2sgcnVucywgYnV0IHRvIHRoZSB1c2VyIHdobyBpcyBzaXR0aW5nIGF0Cit0aGUgc2VuZC1wYWNrIGVuZCwgaXQgaXMgdXBkYXRpbmcgdGhlIHJlbW90ZS4gIENvbmZ1c2VkPykKKworVGhlcmUgYXJlIG90aGVyIHJlYWwtd29ybGQgZXhhbXBsZXMgb2YgdXNpbmcgdXBkYXRlIGFuZAorcG9zdC11cGRhdGUgaG9va3MgZm91bmQgaW4gdGhlIERvY3VtZW50YXRpb24vaG93dG8gZGlyZWN0b3J5LgorCitnaXQtcmVjZWl2ZS1wYWNrIGhvbm91cnMgdGhlIHJlY2VpdmUuZGVueU5vbkZhc3RGb3J3YXJkcyBjb25maWcKK29wdGlvbiwgd2hpY2ggdGVsbHMgaXQgaWYgdXBkYXRlcyB0byBhIHJlZiBzaG91bGQgYmUgZGVuaWVkIGlmIHRoZXkKK2FyZSBub3QgZmFzdC1mb3J3YXJkcy4KKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIHN5bmMgaW50by4KKworcHJlLXJlY2VpdmUgSG9vaworLS0tLS0tLS0tLS0tLS0tLQorQmVmb3JlIGFueSByZWYgaXMgdXBkYXRlZCwgaWYgJEdJVF9ESVIvaG9va3MvcHJlLXJlY2VpdmUgZmlsZSBleGlzdHMKK2FuZCBpcyBleGVjdXRhYmxlLCBpdCB3aWxsIGJlIGludm9rZWQgb25jZSB3aXRoIG5vIHBhcmFtZXRlcnMuICBUaGUKK3N0YW5kYXJkIGlucHV0IG9mIHRoZSBob29rIHdpbGwgYmUgb25lIGxpbmUgcGVyIHJlZiB0byBiZSB1cGRhdGVkOgorCisgICAgICAgc2hhMS1vbGQgU1Agc2hhMS1uZXcgU1AgcmVmbmFtZSBMRgorCitUaGUgcmVmbmFtZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byAkR0lUX0RJUjsgZS5nLiBmb3IgdGhlIG1hc3RlcgoraGVhZCB0aGlzIGlzICJyZWZzL2hlYWRzL21hc3RlciIuICBUaGUgdHdvIHNoYTEgdmFsdWVzIGJlZm9yZQorZWFjaCByZWZuYW1lIGFyZSB0aGUgb2JqZWN0IG5hbWVzIGZvciB0aGUgcmVmbmFtZSBiZWZvcmUgYW5kIGFmdGVyCit0aGUgdXBkYXRlLiAgUmVmcyB0byBiZSBjcmVhdGVkIHdpbGwgaGF2ZSBzaGExLW9sZCBlcXVhbCB0byAwezQwfSwKK3doaWxlIHJlZnMgdG8gYmUgZGVsZXRlZCB3aWxsIGhhdmUgc2hhMS1uZXcgZXF1YWwgdG8gMHs0MH0sIG90aGVyd2lzZQorc2hhMS1vbGQgYW5kIHNoYTEtbmV3IHNob3VsZCBiZSB2YWxpZCBvYmplY3RzIGluIHRoZSByZXBvc2l0b3J5LgorCitUaGlzIGhvb2sgaXMgY2FsbGVkIGJlZm9yZSBhbnkgcmVmbmFtZSBpcyB1cGRhdGVkIGFuZCBiZWZvcmUgYW55CitmYXN0LWZvcndhcmQgY2hlY2tzIGFyZSBwZXJmb3JtZWQuCisKK0lmIHRoZSBwcmUtcmVjZWl2ZSBob29rIGV4aXRzIHdpdGggYSBub24temVybyBleGl0IHN0YXR1cyBubyB1cGRhdGVzCit3aWxsIGJlIHBlcmZvcm1lZCwgYW5kIHRoZSB1cGRhdGUsIHBvc3QtcmVjZWl2ZSBhbmQgcG9zdC11cGRhdGUKK2hvb2tzIHdpbGwgbm90IGJlIGludm9rZWQgZWl0aGVyLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHF1aWNrbHkKK2JhaWwgb3V0IGlmIHRoZSB1cGRhdGUgaXMgbm90IHRvIGJlIHN1cHBvcnRlZC4KKwordXBkYXRlIEhvb2sKKy0tLS0tLS0tLS0tCitCZWZvcmUgZWFjaCByZWYgaXMgdXBkYXRlZCwgaWYgJEdJVF9ESVIvaG9va3MvdXBkYXRlIGZpbGUgZXhpc3RzCithbmQgaXMgZXhlY3V0YWJsZSwgaXQgaXMgaW52b2tlZCBvbmNlIHBlciByZWYsIHdpdGggdGhyZWUgcGFyYW1ldGVyczoKKworICAgICAgICRHSVRfRElSL2hvb2tzL3VwZGF0ZSByZWZuYW1lIHNoYTEtb2xkIHNoYTEtbmV3CisKK1RoZSByZWZuYW1lIHBhcmFtZXRlciBpcyByZWxhdGl2ZSB0byAkR0lUX0RJUjsgZS5nLiBmb3IgdGhlIG1hc3RlcgoraGVhZCB0aGlzIGlzICJyZWZzL2hlYWRzL21hc3RlciIuICBUaGUgdHdvIHNoYTEgYXJndW1lbnRzIGFyZQordGhlIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlZm5hbWUgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlLgorTm90ZSB0aGF0IHRoZSBob29rIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHJlZm5hbWUgaXMgdXBkYXRlZCwKK3NvIGVpdGhlciBzaGExLW9sZCBpcyAwezQwfSAobWVhbmluZyB0aGVyZSBpcyBubyBzdWNoIHJlZiB5ZXQpLAorb3IgaXQgc2hvdWxkIG1hdGNoIHdoYXQgaXMgcmVjb3JkZWQgaW4gcmVmbmFtZS4KKworVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgaWYgaXQgd2FudHMgdG8gZGlzYWxsb3cKK3VwZGF0aW5nIHRoZSBuYW1lZCByZWYuICBPdGhlcndpc2UgaXQgc2hvdWxkIGV4aXQgd2l0aCB6ZXJvLgorCitTdWNjZXNzZnVsIGV4ZWN1dGlvbiAoYSB6ZXJvIGV4aXQgc3RhdHVzKSBvZiB0aGlzIGhvb2sgZG9lcyBub3QKK2Vuc3VyZSB0aGUgcmVmIHdpbGwgYWN0dWxseSBiZSB1cGRhdGVkLCBpdCBpcyBvbmx5IGEgcHJlcmVxdWlzaXRlLgorQXMgc3VjaCBpdCBpcyBub3QgYSBnb29kIGlkZWEgdG8gc2VuZCBub3RpY2VzIChlLmcuIGVtYWlsKSBmcm9tCit0aGlzIGhvb2suICBDb25zaWRlciB1c2luZyB0aGUgcG9zdC1yZWNlaXZlIGhvb2sgaW5zdGVhZC4KKworcG9zdC1yZWNlaXZlIEhvb2sKKy0tLS0tLS0tLS0tLS0tLS0tCitBZnRlciBhbGwgcmVmcyB3ZXJlIHVwZGF0ZWQgKG9yIGF0dGVtcHRlZCB0byBiZSB1cGRhdGVkKSwgaWYgYW55CityZWYgdXBkYXRlIHdhcyBzdWNjZXNzZnVsLCBhbmQgaWYgJEdJVF9ESVIvaG9va3MvcG9zdC1yZWNlaXZlCitmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZSwgaXQgd2lsbCBiZSBpbnZva2Ugb25jZSB3aXRoIG5vCitwYXJhbWV0ZXJzLiAgVGhlIHN0YW5kYXJkIGlucHV0IG9mIHRoZSBob29rIHdpbGwgYmUgb25lIGxpbmUKK2ZvciBlYWNoIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHJlZjoKKworICAgICAgIHNoYTEtb2xkIFNQIHNoYTEtbmV3IFNQIHJlZm5hbWUgTEYKKworVGhlIHJlZm5hbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gJEdJVF9ESVI7IGUuZy4gZm9yIHRoZSBtYXN0ZXIKK2hlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVGhlIHR3byBzaGExIHZhbHVlcyBiZWZvcmUKK2VhY2ggcmVmbmFtZSBhcmUgdGhlIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlZm5hbWUgYmVmb3JlIGFuZCBhZnRlcgordGhlIHVwZGF0ZS4gIFJlZnMgdGhhdCB3ZXJlIGNyZWF0ZWQgd2lsbCBoYXZlIHNoYTEtb2xkIGVxdWFsIHRvCiswezQwfSwgd2hpbGUgcmVmcyB0aGF0IHdlcmUgZGVsZXRlZCB3aWxsIGhhdmUgc2hhMS1uZXcgZXF1YWwgdG8KKzB7NDB9LCBvdGhlcndpc2Ugc2hhMS1vbGQgYW5kIHNoYTEtbmV3IHNob3VsZCBiZSB2YWxpZCBvYmplY3RzIGluCit0aGUgcmVwb3NpdG9yeS4KKworVXNpbmcgdGhpcyBob29rLCBpdCBpcyBlYXN5IHRvIGdlbmVyYXRlIG1haWxzIGRlc2NyaWJpbmcgdGhlIHVwZGF0ZXMKK3RvIHRoZSByZXBvc2l0b3J5LiAgVGhpcyBleGFtcGxlIHNjcmlwdCBzZW5kcyBvbmUgbWFpbCBtZXNzYWdlIHBlcgorcmVmIGxpc3RpbmcgdGhlIGNvbW1pdHMgcHVzaGVkIHRvIHRoZSByZXBvc2l0b3J5OgorCisJIyEvYmluL3NoCisJIyBtYWlsIG91dCBjb21taXQgdXBkYXRlIGluZm9ybWF0aW9uLgorCXdoaWxlIHJlYWQgb3ZhbCBudmFsIHJlZgorCWRvCisJCWlmIGV4cHIgIiRvdmFsIiA6ICcwKiQnID4vZGV2L251bGwKKwkJdGhlbgorCQkJZWNobyAiQ3JlYXRlZCBhIG5ldyByZWYsIHdpdGggdGhlIGZvbGxvd2luZyBjb21taXRzOiIKKwkJCWdpdC1yZXYtbGlzdCAtLXByZXR0eSAiJG52YWwiCisJCWVsc2UKKwkJCWVjaG8gIk5ldyBjb21taXRzOiIKKwkJCWdpdC1yZXYtbGlzdCAtLXByZXR0eSAiJG52YWwiICJeJG92YWwiCisJCWZpIHwKKwkJbWFpbCAtcyAiQ2hhbmdlcyB0byByZWYgJHJlZiIgY29tbWl0LWxpc3RAbXlkb21haW4KKwlkb25lCisJZXhpdCAwCisKK1RoZSBleGl0IGNvZGUgZnJvbSB0aGlzIGhvb2sgaW52b2NhdGlvbiBpcyBpZ25vcmVkLCBob3dldmVyIGEKK25vbi16ZXJvIGV4aXQgY29kZSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UuCisKK05vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgcmVmbmFtZSB0byBub3QgaGF2ZSBzaGExLW5ldyB3aGVuIHRoaXMKK2hvb2sgcnVucy4gIFRoaXMgY2FuIGVhc2lseSBvY2N1ciBpZiBhbm90aGVyIHVzZXIgbW9kaWZpZXMgdGhlIHJlZgorYWZ0ZXIgaXQgd2FzIHVwZGF0ZWQgYnkgcmVjZWl2ZS1wYWNrLCBidXQgYmVmb3JlIHRoZSBob29rIHdhcyBhYmxlCit0byBldmFsdWF0ZSBpdC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaG9va3MgcmVseSBvbiBzaGExLW5ldworcmF0aGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVmbmFtZS4KKworcG9zdC11cGRhdGUgSG9vaworLS0tLS0tLS0tLS0tLS0tLQorQWZ0ZXIgYWxsIG90aGVyIHByb2Nlc3NpbmcsIGlmIGF0IGxlYXN0IG9uZSByZWYgd2FzIHVwZGF0ZWQsIGFuZAoraWYgJEdJVF9ESVIvaG9va3MvcG9zdC11cGRhdGUgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUsIHRoZW4KK3Bvc3QtdXBkYXRlIHdpbGwgY2FsbGVkIHdpdGggdGhlIGxpc3Qgb2YgcmVmcyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkLgorVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYW55IHJlcG9zaXRvcnkgd2lkZSBjbGVhbnVwIHRhc2tzLgorCitUaGUgZXhpdCBjb2RlIGZyb20gdGhpcyBob29rIGludm9jYXRpb24gaXMgaWdub3JlZDsgdGhlIG9ubHkgdGhpbmcKK2xlZnQgZm9yIGdpdC1yZWNlaXZlLXBhY2sgdG8gZG8gYXQgdGhhdCBwb2ludCBpcyB0byBleGl0IGl0c2VsZgorYW55d2F5LgorCitUaGlzIGhvb2sgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBydW4gImdpdC11cGRhdGUtc2VydmVyLWluZm8iCitpZiB0aGUgcmVwb3NpdG9yeSBpcyBwYWNrZWQgYW5kIGlzIHNlcnZlZCB2aWEgYSBkdW1iIHRyYW5zcG9ydC4KKworCSMhL2Jpbi9zaAorCWV4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtc2VuZC1wYWNrWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWZsb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVmbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM0M2JjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVmbG9nLnR4dApAQCAtMCwwICsxLDY4IEBACitnaXQtcmVmbG9nKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWZsb2cgLSBNYW5hZ2UgcmVmbG9nIGluZm9ybWF0aW9uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0IHJlZmxvZycgPHN1YmNvbW1hbmQ+IDxvcHRpb25zPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjb21tYW5kIHRha2VzIHZhcmlvdXMgc3ViY29tbWFuZHMsIGFuZCBkaWZmZXJlbnQgb3B0aW9ucworZGVwZW5kaW5nIG9uIHRoZSBzdWJjb21tYW5kOgorCitbdmVyc2VdCitnaXQgcmVmbG9nIGV4cGlyZSBbLS1kcnktcnVuXSBbLS1zdGFsZS1maXhdCisJWy0tZXhwaXJlPTx0aW1lPl0gWy0tZXhwaXJlLXVucmVhY2hhYmxlPTx0aW1lPl0gWy0tYWxsXSA8cmVmcz4uLi4KKworZ2l0IHJlZmxvZyBbc2hvd10gW2xvZy1vcHRpb25zXQorCitSZWZsb2cgaXMgYSBtZWNoYW5pc20gdG8gcmVjb3JkIHdoZW4gdGhlIHRpcCBvZiBicmFuY2hlcyBhcmUKK3VwZGF0ZWQuICBUaGlzIGNvbW1hbmQgaXMgdG8gbWFuYWdlIHRoZSBpbmZvcm1hdGlvbiByZWNvcmRlZCBpbiBpdC4KKworVGhlIHN1YmNvbW1hbmQgImV4cGlyZSIgaXMgdXNlZCB0byBwcnVuZSBvbGRlciByZWZsb2cgZW50cmllcy4KK0VudHJpZXMgb2xkZXIgdGhhbiBgZXhwaXJlYCB0aW1lLCBvciBlbnRyaWVzIG9sZGVyIHRoYW4KK2BleHBpcmUtdW5yZWFjaGFibGVgIHRpbWUgYW5kIGFyZSBub3QgcmVhY2hhYmxlIGZyb20gdGhlIGN1cnJlbnQKK3RpcCwgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVmbG9nLiAgVGhpcyBpcyB0eXBpY2FsbHkgbm90IHVzZWQKK2RpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlcnMgLS0gaW5zdGVhZCwgc2VlIGdpdGxpbms6Z2l0LWdjWzFdLgorCitUaGUgc3ViY29tbWFuZCAic2hvdyIgKHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQsIGluIHRoZSBhYnNlbnNlIG9mIGFueQorc3ViY29tbWFuZHMpIHdpbGwgdGFrZSBhbGwgdGhlIG5vcm1hbCBsb2cgb3B0aW9ucywgYW5kIHNob3cgdGhlIGxvZyBvZgordGhlIGN1cnJlbnQgYnJhbmNoLiBJdCBpcyBiYXNpY2FsbHkgYW4gYWxpYXMgZm9yICdnaXQgbG9nIC1nIC0tYWJicmV2LWNvbW1pdAorLS1wcmV0dHk9b25lbGluZScsIHNlZSBnaXRsaW5rOmdpdC1sb2dbMV0uCisKKworT1BUSU9OUworLS0tLS0tLQorCistLWV4cGlyZT08dGltZT46OgorCUVudHJpZXMgb2xkZXIgdGhhbiB0aGlzIHRpbWUgYXJlIHBydW5lZC4gIFdpdGhvdXQgdGhlCisJb3B0aW9uIGl0IGlzIHRha2VuIGZyb20gY29uZmlndXJhdGlvbiBgZ2MucmVmbG9nRXhwaXJlYCwKKwl3aGljaCBpbiB0dXJuIGRlZmF1bHRzIHRvIDkwIGRheXMuCisKKy0tZXhwaXJlLXVucmVhY2hhYmxlPTx0aW1lPjo6CisJRW50cmllcyBvbGRlciB0aGFuIHRoaXMgdGltZSBhbmQgYXJlIG5vdCByZWFjaGFibGUgZnJvbQorCXRoZSBjdXJyZW50IHRpcCBvZiB0aGUgYnJhbmNoIGFyZSBwcnVuZWQuICBXaXRob3V0IHRoZQorCW9wdGlvbiBpdCBpcyB0YWtlbiBmcm9tIGNvbmZpZ3VyYXRpb24KKwlgZ2MucmVmbG9nRXhwaXJlVW5yZWFjaGFibGVgLCB3aGljaCBpbiB0dXJuIGRlZmF1bHRzIHRvCisJMzAgZGF5cy4KKworLS1hbGw6OgorCUluc3RlYWQgb2YgbGlzdGluZyA8cmVmcz4gZXhwbGljaXRseSwgcHJ1bmUgYWxsIHJlZnMuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWxpbmsudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVsaW5rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E2MDEyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVsaW5rLnR4dApAQCAtMCwwICsxLDM3IEBACitnaXQtcmVsaW5rKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWxpbmsgLSBIYXJkbGluayBjb21tb24gb2JqZWN0cyBpbiBsb2NhbCByZXBvc2l0b3JpZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlbGluaycgWy0tc2FmZV0gPGRpcj4gPGRpcj4gWzxkaXI+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyB3aWxsIHNjYW4gMiBvciBtb3JlIG9iamVjdCByZXBvc2l0b3JpZXMgYW5kIGxvb2sgZm9yIGNvbW1vbiBvYmplY3RzLCBjaGVjaworaWYgdGhleSBhcmUgaGFyZGxpbmtlZCwgYW5kIHJlcGxhY2Ugb25lIHdpdGggYSBoYXJkbGluayB0byB0aGUgb3RoZXIgaWYgbm90LgorCitPUFRJT05TCistLS0tLS0tCistLXNhZmU6OgorCVN0b3BzIGlmIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUgaGFzaCBleGlzdCBidXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuCisJRGVmYXVsdCBpcyB0byB3YXJuIGFuZCBjb250aW51ZS4KKworPGRpcj46OgorCURpcmVjdG9yaWVzIGNvbnRhaW5pbmcgYSAuZ2l0L29iamVjdHMvIHN1YmRpcmVjdG9yeS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzVjNjViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVtb3RlLnR4dApAQCAtMCwwICsxLDEzOCBAQAorZ2l0LXJlbW90ZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZW1vdGUgLSBtYW5hZ2Ugc2V0IG9mIHRyYWNrZWQgcmVwb3NpdG9yaWVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXJlbW90ZScKKydnaXQtcmVtb3RlJyBhZGQgWy10IDxicmFuY2g+XSBbLW0gPGJyYW5jaD5dIFstZl0gPG5hbWU+IDx1cmw+CisnZ2l0LXJlbW90ZScgc2hvdyA8bmFtZT4KKydnaXQtcmVtb3RlJyBwcnVuZSA8bmFtZT4KKydnaXQtcmVtb3RlJyB1cGRhdGUgW2dyb3VwXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworTWFuYWdlIHRoZSBzZXQgb2YgcmVwb3NpdG9yaWVzICgicmVtb3RlcyIpIHdob3NlIGJyYW5jaGVzIHlvdSB0cmFjay4KKworCitDT01NQU5EUworLS0tLS0tLS0KKworV2l0aCBubyBhcmd1bWVudHMsIHNob3dzIGEgbGlzdCBvZiBleGlzdGluZyByZW1vdGVzLiAgU2V2ZXJhbAorc3ViY29tbWFuZHMgYXJlIGF2YWlsYWJsZSB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlIHJlbW90ZXMuCisKKydhZGQnOjoKKworQWRkcyBhIHJlbW90ZSBuYW1lZCA8bmFtZT4gZm9yIHRoZSByZXBvc2l0b3J5IGF0Cis8dXJsPi4gIFRoZSBjb21tYW5kIGBnaXQgZmV0Y2ggPG5hbWU+YCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQKK3VwZGF0ZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMgPG5hbWU+LzxicmFuY2g+LgorKworV2l0aCBgLWZgIG9wdGlvbiwgYGdpdCBmZXRjaCA8bmFtZT5gIGlzIHJ1biBpbW1lZGlhdGVseSBhZnRlcgordGhlIHJlbW90ZSBpbmZvcm1hdGlvbiBpcyBzZXQgdXAuCisrCitXaXRoIGAtdCA8YnJhbmNoPmAgb3B0aW9uLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGdsb2IKK3JlZnNwZWMgZm9yIHRoZSByZW1vdGUgdG8gdHJhY2sgYWxsIGJyYW5jaGVzIHVuZGVyCitgJEdJVF9ESVIvcmVtb3Rlcy88bmFtZT4vYCwgYSByZWZzcGVjIHRvIHRyYWNrIG9ubHkgYDxicmFuY2g+YAoraXMgY3JlYXRlZC4gIFlvdSBjYW4gZ2l2ZSBtb3JlIHRoYW4gb25lIGAtdCA8YnJhbmNoPmAgdG8gdHJhY2sKK211bHRpcGxlIGJyYW5jaGVzIHdpdGhvdXQgZ3JhYmJpbmcgYWxsIGJyYW5jaGVzLgorKworV2l0aCBgLW0gPG1hc3Rlcj5gIG9wdGlvbiwgYCRHSVRfRElSL3JlbW90ZXMvPG5hbWU+L0hFQURgIGlzIHNldAordXAgdG8gcG9pbnQgYXQgcmVtb3RlJ3MgYDxtYXN0ZXI+YCBicmFuY2ggaW5zdGVhZCBvZiB3aGF0ZXZlcgorYnJhbmNoIHRoZSBgSEVBRGAgYXQgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGFjdHVhbGx5IHBvaW50cyBhdC4KKworJ3Nob3cnOjoKKworR2l2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVtb3RlIDxuYW1lPi4KKysKK1dpdGggYC1uYCBvcHRpb24sIHRoZSByZW1vdGUgaGVhZHMgYXJlIG5vdCBxdWVyaWVkIGZpcnN0IHdpdGgKK2BnaXQgbHMtcmVtb3RlIDxuYW1lPmA7IGNhY2hlZCBpbmZvcm1hdGlvbiBpcyB1c2VkIGluc3RlYWQuCisKKydwcnVuZSc6OgorCitEZWxldGVzIGFsbCBzdGFsZSB0cmFja2luZyBicmFuY2hlcyB1bmRlciA8bmFtZT4uCitUaGVzZSBzdGFsZSBicmFuY2hlcyBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5CityZWZlcmVuY2VkIGJ5IDxuYW1lPiwgYnV0IGFyZSBzdGlsbCBsb2NhbGx5IGF2YWlsYWJsZSBpbgorInJlbW90ZXMvPG5hbWU+Ii4KKysKK1dpdGggYC1uYCBvcHRpb24sIHRoZSByZW1vdGUgaGVhZHMgYXJlIG5vdCBjb25maXJtZWQgZmlyc3Qgd2l0aCBgZ2l0Citscy1yZW1vdGUgPG5hbWU+YDsgY2FjaGVkIGluZm9ybWF0aW9uIGlzIHVzZWQgaW5zdGVhZC4gIFVzZSB3aXRoCitjYXV0aW9uLgorCisndXBkYXRlJzo6CisKK0ZldGNoIHVwZGF0ZXMgZm9yIGEgbmFtZWQgc2V0IG9mIHJlbW90ZXMgaW4gdGhlIHJlcG9zaXRvcnkgYXMgZGVmaW5lZCBieQorcmVtb3Rlcy48Z3JvdXA+LiAgSWYgYSBuYW1lZCBncm91cCBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCit0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgcmVtb3Rlcy5kZWZhdWx0IHdpbGwgZ2V0IHVzZWQ7IGlmCityZW1vdGVzLmRlZmF1bHQgaXMgbm90IGRlZmluZWQsIGFsbCByZW1vdGVzIHdoaWNoIGRvIG5vdCB0aGUKK2NvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHJlbW90ZS48bmFtZT4uc2tpcERlZmF1bHRVcGRhdGUgc2V0IHRvIHRydWUgd2lsbAorYmUgdXBkYXRlZC4gIChTZWUgZ2l0bGluazpnaXQtY29uZmlnWzFdKS4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1RoZSByZW1vdGUgY29uZmlndXJhdGlvbiBpcyBhY2hpZXZlZCB1c2luZyB0aGUgYHJlbW90ZS5vcmlnaW4udXJsYCBhbmQKK2ByZW1vdGUub3JpZ2luLmZldGNoYCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4gIChTZWUKK2dpdGxpbms6Z2l0LWNvbmZpZ1sxXSkuCisKK0V4YW1wbGVzCistLS0tLS0tLQorCisqIEFkZCBhIG5ldyByZW1vdGUsIGZldGNoLCBhbmQgY2hlY2sgb3V0IGEgYnJhbmNoIGZyb20gaXQKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVtb3RlCitvcmlnaW4KKyQgZ2l0IGJyYW5jaCAtcgorb3JpZ2luL21hc3RlcgorJCBnaXQgcmVtb3RlIGFkZCBsaW51eC1uZnMgZ2l0Oi8vbGludXgtbmZzLm9yZy9wdWIvbmZzLTIuNi5naXQKKyQgZ2l0IHJlbW90ZQorbGludXgtbmZzCitvcmlnaW4KKyQgZ2l0IGZldGNoCisqIHJlZnMvcmVtb3Rlcy9saW51eC1uZnMvbWFzdGVyOiBzdG9yaW5nIGJyYW5jaCAnbWFzdGVyJyAuLi4KKyAgY29tbWl0OiBiZjgxYjQ2CiskIGdpdCBicmFuY2ggLXIKK29yaWdpbi9tYXN0ZXIKK2xpbnV4LW5mcy9tYXN0ZXIKKyQgZ2l0IGNoZWNrb3V0IC1iIG5mcyBsaW51eC1uZnMvbWFzdGVyCisuLi4KKy0tLS0tLS0tLS0tLQorCisqIEltaXRhdGUgJ2dpdCBjbG9uZScgYnV0IHRyYWNrIG9ubHkgc2VsZWN0ZWQgYnJhbmNoZXMKKysKKy0tLS0tLS0tLS0tLQorJCBta2RpciBwcm9qZWN0LmdpdAorJCBjZCBwcm9qZWN0LmdpdAorJCBnaXQgaW5pdAorJCBnaXQgcmVtb3RlIGFkZCAtZiAtdCBtYXN0ZXIgLW0gbWFzdGVyIG9yaWdpbiBnaXQ6Ly9leGFtcGxlLmNvbS9naXQuZ2l0LworJCBnaXQgbWVyZ2Ugb3JpZ2luCistLS0tLS0tLS0tLS0KKworCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWZldGNoWzFdCitnaXRsaW5rOmdpdC1icmFuY2hbMV0KK2dpdGxpbms6Z2l0LWNvbmZpZ1sxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBIYW1hbm8KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKLiBCcnVjZSBGaWVsZHMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzAxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0CkBAIC0wLDAgKzEsMTAyIEBACitnaXQtcmVwYWNrKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXBhY2sgLSBQYWNrIHVucGFja2VkIG9iamVjdHMgaW4gYSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlcGFjaycgWy1hXSBbLWRdIFstZl0gWy1sXSBbLW5dIFstcV0gWy0td2luZG93PU5dIFstLWRlcHRoPU5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbWJpbmUgYWxsIG9iamVjdHMgdGhhdCBkbyBub3QgY3VycmVudGx5CityZXNpZGUgaW4gYSAicGFjayIsIGludG8gYSBwYWNrLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZS1vcmdhbmlzZQorZXhpc3RpbmcgcGFja3MgaW50byBhIHNpbmdsZSwgbW9yZSBlZmZpY2llbnQgcGFjay4KKworQSBwYWNrIGlzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLCBpbmRpdmlkdWFsbHkgY29tcHJlc3NlZCwgd2l0aAorZGVsdGEgY29tcHJlc3Npb24gYXBwbGllZCwgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUsIHdpdGggYW4KK2Fzc29jaWF0ZWQgaW5kZXggZmlsZS4KKworUGFja3MgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBsb2FkIG9uIG1pcnJvciBzeXN0ZW1zLCBiYWNrdXAKK2VuZ2luZXMsIGRpc2sgc3RvcmFnZSwgZXRjLgorCitPUFRJT05TCistLS0tLS0tCisKKy1hOjoKKwlJbnN0ZWFkIG9mIGluY3JlbWVudGFsbHkgcGFja2luZyB0aGUgdW5wYWNrZWQgb2JqZWN0cywKKwlwYWNrIGV2ZXJ5dGhpbmcgcmVmZXJlbmNlZCBpbnRvIGEgc2luZ2xlIHBhY2suCisJRXNwZWNpYWxseSB1c2VmdWwgd2hlbiBwYWNraW5nIGEgcmVwb3NpdG9yeSB0aGF0IGlzIHVzZWQKKwlmb3IgcHJpdmF0ZSBkZXZlbG9wbWVudCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQorCWFib3V0IHBlb3BsZSBmZXRjaGluZyB2aWEgZHVtYiBwcm90b2NvbHMgZnJvbSBpdC4gIFVzZQorCXdpdGggJy1kJy4gIFRoaXMgd2lsbCBjbGVhbiB1cCB0aGUgb2JqZWN0cyB0aGF0IGBnaXQgcHJ1bmVgCisJbGVhdmVzIGJlaGluZCwgYnV0IGBnaXQgZnNjayAtLWZ1bGxgIHNob3dzIGFzCisJZGFuZ2xpbmcuCisKKy1kOjoKKwlBZnRlciBwYWNraW5nLCBpZiB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrcyBtYWtlIHNvbWUKKwlleGlzdGluZyBwYWNrcyByZWR1bmRhbnQsIHJlbW92ZSB0aGUgcmVkdW5kYW50IHBhY2tzLgorCUFsc28gcnVucyBnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV0uCisKKy1sOjoKKyAgICAgICAgUGFzcyB0aGUgYC0tbG9jYWxgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorICAgICAgICBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy1mOjoKKyAgICAgICAgUGFzcyB0aGUgYC0tbm8tcmV1c2UtZGVsdGFgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorICAgICAgICBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy1xOjoKKyAgICAgICAgUGFzcyB0aGUgYC1xYCBvcHRpb24gdG8gYGdpdCBwYWNrLW9iamVjdHNgLCBzZWUKKyAgICAgICAgZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdLgorCistbjo6CisgICAgICAgIERvIG5vdCB1cGRhdGUgdGhlIHNlcnZlciBpbmZvcm1hdGlvbiB3aXRoCisgICAgICAgIGBnaXQgdXBkYXRlLXNlcnZlci1pbmZvYC4KKworLS13aW5kb3c9W05dLCAtLWRlcHRoPVtOXTo6CisJVGhlc2UgdHdvIG9wdGlvbnMgYWZmZWN0IGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIHBhY2sgYXJlCisJc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiBUaGUgb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseQorCXNvcnRlZCBieSB0eXBlLCBzaXplIGFuZCBvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZQorCW90aGVyIG9iamVjdHMgd2l0aGluIGAtLXdpbmRvd2AgdG8gc2VlIGlmIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uIHNhdmVzCisJc3BhY2UuIGAtLWRlcHRoYCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZyBpdCB0b28gZGVlcAorCWFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlciBzaWRlLCBiZWNhdXNlIGRlbHRhIGRhdGEgbmVlZHMKKwl0byBiZSBhcHBsaWVkIHRoYXQgbWFueSB0aW1lcyB0byBnZXQgdG8gdGhlIG5lY2Vzc2FyeSBvYmplY3QuCisJVGhlIGRlZmF1bHQgdmFsdWUgZm9yIC0td2luZG93IGlzIDEwIGFuZCAtLWRlcHRoIGlzIDUwLgorCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworV2hlbiBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGByZXBhY2suVXNlRGVsdGFCYXNlT2Zmc2V0YCBpcyBzZXQKK2ZvciB0aGUgcmVwb3NpdG9yeSwgdGhlIGNvbW1hbmQgcGFzc2VzIGAtLWRlbHRhLWJhc2Utb2Zmc2V0YAorb3B0aW9uIHRvIGBnaXQtcGFjay1vYmplY3RzYDsgdGhpcyB0eXBpY2FsbHkgcmVzdWx0cyBpbiBzbGlnaHRseQorc21hbGxlciBwYWNrcywgYnV0IHRoZSBnZW5lcmF0ZWQgcGFja3MgYXJlIGluY29tcGF0aWJsZSB3aXRoCit2ZXJzaW9ucyBvZiBnaXQgb2xkZXIgdGhhbiAoYW5kIGluY2x1ZGluZykgdjEuNC4zOyBkbyBub3Qgc2V0Cit0aGUgdmFyaWFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgb2xkZXIgdmVyc2lvbiBvZiBnaXQgbmVlZHMgdG8KK2JlIGFibGUgdG8gcmVhZCAodGhpcyBpbmNsdWRlcyByZXBvc2l0b3JpZXMgZnJvbSB3aGljaCBwYWNrcyBjYW4KK2JlIGNvcGllZCBvdXQgb3ZlciBodHRwIG9yIHJzeW5jLCBhbmQgcGVvcGxlIHdobyBvYnRhaW5lZCBwYWNrcwordGhhdCB3YXkgY2FuIHRyeSB0byB1c2Ugb2xkZXIgZ2l0IHdpdGggaXQpLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0KK2dpdGxpbms6Z2l0LXBydW5lLXBhY2tlZFsxXQorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVwby1jb25maWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVwby1jb25maWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWJhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBvLWNvbmZpZy50eHQKQEAgLTAsMCArMSwxOCBAQAorZ2l0LXJlcG8tY29uZmlnKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlcG8tY29uZmlnIC0gR2V0IGFuZCBzZXQgcmVwb3NpdG9yeSBvciBnbG9iYWwgb3B0aW9ucworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXBvLWNvbmZpZycgLi4uCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSBzeW5vbnltIGZvciBnaXRsaW5rOmdpdC1jb25maWdbMV0uICBQbGVhc2UgcmVmZXIgdG8gdGhlCitkb2N1bWVudGF0aW9uIG9mIHRoYXQgY29tbWFuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcXVlc3QtcHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXF1ZXN0LXB1bGwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OGE1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXF1ZXN0LXB1bGwudHh0CkBAIC0wLDAgKzEsNDAgQEAKK2dpdC1yZXF1ZXN0LXB1bGwoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlcXVlc3QtcHVsbCAtIEdlbmVyYXRlcyBhIHN1bW1hcnkgb2YgcGVuZGluZyBjaGFuZ2VzCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXF1ZXN0LXB1bGwnIDxzdGFydD4gPHVybD4gWzxlbmQ+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworU3VtbWFyaXplcyB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byBjb21taXRzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFuZCBpbmNsdWRlcwordGhlIGdpdmVuIFVSTCBpbiB0aGUgZ2VuZXJhdGVkIHN1bW1hcnkuCisKK09QVElPTlMKKy0tLS0tLS0KKzxzdGFydD46OgorCUNvbW1pdCB0byBzdGFydCBhdC4KKworPHVybD46OgorCVVSTCB0byBpbmNsdWRlIGluIHRoZSBzdW1tYXJ5LgorCis8ZW5kPjo6CisJQ29tbWl0IHRvIHNlbmQgYXQ7IGRlZmF1bHRzIHRvIEhFQUQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+IGFuZCBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcmVyZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmOWIwNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcmVyZS50eHQKQEAgLTAsMCArMSwyMTEgQEAKK2dpdC1yZXJlcmUoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlcmVyZSAtIFJldXNlIHJlY29yZGVkIHJlc29sdXRpb24gb2YgY29uZmxpY3RlZCBtZXJnZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlcmVyZScgW2NsZWFyfGRpZmZ8c3RhdHVzfGdjXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworSW4gYSB3b3JrZmxvdyB0aGF0IGVtcGxveXMgcmVsYXRpdmVseSBsb25nIGxpdmVkIHRvcGljIGJyYW5jaGVzLAordGhlIGRldmVsb3BlciBzb21ldGltZXMgbmVlZHMgdG8gcmVzb2x2ZSB0aGUgc2FtZSBjb25mbGljdCBvdmVyCithbmQgb3ZlciBhZ2FpbiB1bnRpbCB0aGUgdG9waWMgYnJhbmNoZXMgYXJlIGRvbmUgKGVpdGhlciBtZXJnZWQKK3RvIHRoZSAicmVsZWFzZSIgYnJhbmNoLCBvciBzZW50IG91dCBhbmQgYWNjZXB0ZWQgdXBzdHJlYW0pLgorCitUaGlzIGNvbW1hbmQgaGVscHMgdGhpcyBwcm9jZXNzIGJ5IHJlY29yZGluZyBjb25mbGljdGVkCithdXRvbWVyZ2UgcmVzdWx0cyBhbmQgY29ycmVzcG9uZGluZyBoYW5kLXJlc29sdmUgcmVzdWx0cyBvbiB0aGUKK2luaXRpYWwgbWFudWFsIG1lcmdlLCBhbmQgbGF0ZXIgYnkgbm90aWNpbmcgdGhlIHNhbWUgYXV0b21lcmdlCityZXN1bHRzIGFuZCBhcHBseWluZyB0aGUgcHJldmlvdXNseSByZWNvcmRlZCBoYW5kIHJlc29sdXRpb24uCisKK1tOT1RFXQorWW91IG5lZWQgdG8gY3JlYXRlIGAkR0lUX0RJUi9yci1jYWNoZWAgZGlyZWN0b3J5IHRvIGVuYWJsZSB0aGlzCitjb21tYW5kLgorCisKK0NPTU1BTkRTCistLS0tLS0tLQorCitOb3JtYWxseSwgZ2l0LXJlcmVyZSBpcyBydW4gd2l0aG91dCBhcmd1bWVudHMgb3IgdXNlci1pbnRlcnZlbnRpb24uCitIb3dldmVyLCBpdCBoYXMgc2V2ZXJhbCBjb21tYW5kcyB0aGF0IGFsbG93IGl0IHRvIGludGVyYWN0IHdpdGgKK2l0cyB3b3JraW5nIHN0YXRlLgorCisnY2xlYXInOjoKKworVGhpcyByZXNldHMgdGhlIG1ldGFkYXRhIHVzZWQgYnkgcmVyZXJlIGlmIGEgbWVyZ2UgcmVzb2x1dGlvbiBpcyB0byBiZQoraXMgYWJvcnRlZC4gIENhbGxpbmcgZ2l0bGluazpnaXQtYW1bMV0gLS1za2lwIG9yIGdpdGxpbms6Z2l0LXJlYmFzZVsxXQorWy0tc2tpcHwtLWFib3J0XSB3aWxsIGF1dG9tYXRpY2FsbHkgaW52b2tlIHRoaXMgY29tbWFuZC4KKworJ2RpZmYnOjoKKworVGhpcyBkaXNwbGF5cyBkaWZmcyBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlc29sdXRpb24uICBJdCBpcwordXNlZnVsIGZvciB0cmFja2luZyB3aGF0IGhhcyBjaGFuZ2VkIHdoaWxlIHRoZSB1c2VyIGlzIHJlc29sdmluZworY29uZmxpY3RzLiAgQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgc3lzdGVtCitkaWZmKDEpIGNvbW1hbmQgaW5zdGFsbGVkIGluIFBBVEguCisKKydzdGF0dXMnOjoKKworTGlrZSBkaWZmLCBidXQgdGhpcyBvbmx5IHByaW50cyB0aGUgZmlsZW5hbWVzIHRoYXQgd2lsbCBiZSB0cmFja2VkCitmb3IgcmVzb2x1dGlvbnMuCisKKydnYyc6OgorCitUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBwcnVuZSByZWNvcmRzIG9mIGNvbmZsaWN0ZWQgbWVyZ2UgdGhhdAorb2NjdXJyZWQgbG9uZyB0aW1lIGFnby4gIEJ5IGRlZmF1bHQsIGNvbmZsaWN0cyBvbGRlciB0aGFuIDE1CitkYXlzIHRoYXQgeW91IGhhdmUgbm90IHJlY29yZGVkIHRoZWlyIHJlc29sdXRpb24sIGFuZCBjb25mbGljdHMKK29sZGVyIHRoYW4gNjAgZGF5cywgYXJlIHBydW5lZC4gIFRoZXNlIGFyZSBjb250cm9sbGVkIHdpdGgKK2BnYy5yZXJlcmV1bnJlc29sdmVkYCBhbmQgYGdjLnJlcmVyZXJlc29sdmVkYCBjb25maWd1cmF0aW9uCit2YXJpYWJsZXMuCisKKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitXaGVuIHlvdXIgdG9waWMgYnJhbmNoIG1vZGlmaWVzIG92ZXJsYXBwaW5nIGFyZWEgdGhhdCB5b3VyCittYXN0ZXIgYnJhbmNoIChvciB1cHN0cmVhbSkgdG91Y2hlZCBzaW5jZSB5b3VyIHRvcGljIGJyYW5jaAorZm9ya2VkIGZyb20gaXQsIHlvdSBtYXkgd2FudCB0byB0ZXN0IGl0IHdpdGggdGhlIGxhdGVzdCBtYXN0ZXIsCitldmVuIGJlZm9yZSB5b3VyIHRvcGljIGJyYW5jaCBpcyByZWFkeSB0byBiZSBwdXNoZWQgdXBzdHJlYW06CisKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBvLS0tKi0tLW8gdG9waWMKKyAgICAgICAgICAgICAvCisgICAgby0tLW8tLS1vLS0tKi0tLW8tLS1vIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK0ZvciBzdWNoIGEgdGVzdCwgeW91IG5lZWQgdG8gbWVyZ2UgbWFzdGVyIGFuZCB0b3BpYyBzb21laG93LgorT25lIHdheSB0byBkbyBpdCBpcyB0byBwdWxsIG1hc3RlciBpbnRvIHRoZSB0b3BpYyBicmFuY2g6CisKKy0tLS0tLS0tLS0tLQorCSQgZ2l0IGNoZWNrb3V0IHRvcGljCisJJCBnaXQgbWVyZ2UgbWFzdGVyCisKKyAgICAgICAgICAgICAgby0tLSotLS1vLS0tKyB0b3BpYworICAgICAgICAgICAgIC8gICAgICAgICAgIC8KKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8gbWFzdGVyCistLS0tLS0tLS0tLS0KKworVGhlIGNvbW1pdHMgbWFya2VkIHdpdGggYCpgIHRvdWNoIHRoZSBzYW1lIGFyZWEgaW4gdGhlIHNhbWUKK2ZpbGU7IHlvdSBuZWVkIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0cyB3aGVuIGNyZWF0aW5nIHRoZSBjb21taXQKK21hcmtlZCB3aXRoIGArYC4gIFRoZW4geW91IGNhbiB0ZXN0IHRoZSByZXN1bHQgdG8gbWFrZSBzdXJlIHlvdXIKK3dvcmstaW4tcHJvZ3Jlc3Mgc3RpbGwgd29ya3Mgd2l0aCB3aGF0IGlzIGluIHRoZSBsYXRlc3QgbWFzdGVyLgorCitBZnRlciB0aGlzIHRlc3QgbWVyZ2UsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBjb250aW51ZSB5b3VyIHdvcmsKK29uIHRoZSB0b3BpYy4gIFRoZSBlYXNpZXN0IGlzIHRvIGJ1aWxkIG9uIHRvcCBvZiB0aGUgdGVzdCBtZXJnZQorY29tbWl0IGArYCwgYW5kIHdoZW4geW91ciB3b3JrIGluIHRoZSB0b3BpYyBicmFuY2ggaXMgZmluYWxseQorcmVhZHksIHB1bGwgdGhlIHRvcGljIGJyYW5jaCBpbnRvIG1hc3RlciwgYW5kL29yIGFzayB0aGUKK3Vwc3RyZWFtIHRvIHB1bGwgZnJvbSB5b3UuICBCeSB0aGF0IHRpbWUsIGhvd2V2ZXIsIHRoZSBtYXN0ZXIgb3IKK3RoZSB1cHN0cmVhbSBtaWdodCBoYXZlIGJlZW4gYWR2YW5jZWQgc2luY2UgdGhlIHRlc3QgbWVyZ2UgYCtgLAoraW4gd2hpY2ggY2FzZSB0aGUgZmluYWwgY29tbWl0IGdyYXBoIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKwkkIGdpdCBjaGVja291dCB0b3BpYworCSQgZ2l0IG1lcmdlIG1hc3RlcgorCSQgLi4uIHdvcmsgb24gYm90aCB0b3BpYyBhbmQgbWFzdGVyIGJyYW5jaGVzCisJJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisJJCBnaXQgbWVyZ2UgdG9waWMKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0rLS0tby0tLW8gdG9waWMKKyAgICAgICAgICAgICAvICAgICAgICAgICAvICAgICAgICAgXAorICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vLS0tKyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitXaGVuIHlvdXIgdG9waWMgYnJhbmNoIGlzIGxvbmctbGl2ZWQsIGhvd2V2ZXIsIHlvdXIgdG9waWMgYnJhbmNoCit3b3VsZCBlbmQgdXAgaGF2aW5nIG1hbnkgc3VjaCAiTWVyZ2UgZnJvbSBtYXN0ZXIiIGNvbW1pdHMgb24gaXQsCit3aGljaCB3b3VsZCB1bm5lY2Vzc2FyaWx5IGNsdXR0ZXIgdGhlIGRldmVsb3BtZW50IGhpc3RvcnkuCitSZWFkZXJzIG9mIHRoZSBMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IG1heSByZW1lbWJlciB0aGF0IExpbnVzCitjb21wbGFpbmVkIGFib3V0IHN1Y2ggdG9vIGZyZXF1ZW50IHRlc3QgbWVyZ2VzIHdoZW4gYSBzdWJzeXN0ZW0KK21haW50YWluZXIgYXNrZWQgdG8gcHVsbCBmcm9tIGEgYnJhbmNoIGZ1bGwgb2YgInVzZWxlc3MgbWVyZ2VzIi4KKworQXMgYW4gYWx0ZXJuYXRpdmUsIHRvIGtlZXAgdGhlIHRvcGljIGJyYW5jaCBjbGVhbiBvZiB0ZXN0CittZXJnZXMsIHlvdSBjb3VsZCBibG93IGF3YXkgdGhlIHRlc3QgbWVyZ2UsIGFuZCBrZWVwIGJ1aWxkaW5nIG9uCit0b3Agb2YgdGhlIHRpcCBiZWZvcmUgdGhlIHRlc3QgbWVyZ2U6CisKKy0tLS0tLS0tLS0tLQorCSQgZ2l0IGNoZWNrb3V0IHRvcGljCisJJCBnaXQgbWVyZ2UgbWFzdGVyCisJJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUReIDsjIHJld2luZCB0aGUgdGVzdCBtZXJnZQorCSQgLi4uIHdvcmsgb24gYm90aCB0b3BpYyBhbmQgbWFzdGVyIGJyYW5jaGVzCisJJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisJJCBnaXQgbWVyZ2UgdG9waWMKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKyAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgXAorICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vLS0tKyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIHdvdWxkIGxlYXZlIG9ubHkgb25lIG1lcmdlIGNvbW1pdCB3aGVuIHlvdXIgdG9waWMgYnJhbmNoIGlzCitmaW5hbGx5IHJlYWR5IGFuZCBtZXJnZWQgaW50byB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoaXMgbWVyZ2UKK3dvdWxkIHJlcXVpcmUgeW91IHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LCBpbnRyb2R1Y2VkIGJ5IHRoZQorY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAuICBIb3dldmVyLCBvZnRlbiB0aGlzIGNvbmZsaWN0IGlzIHRoZQorc2FtZSBjb25mbGljdCB5b3UgcmVzb2x2ZWQgd2hlbiB5b3UgY3JlYXRlZCB0aGUgdGVzdCBtZXJnZSB5b3UKK2JsZXcgYXdheS4gIGBnaXQtcmVyZXJlYCBjb21tYW5kIGhlbHBzIHlvdSB0byByZXNvbHZlIHRoaXMgZmluYWwKK2NvbmZsaWN0ZWQgbWVyZ2UgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20geW91ciBlYXJsaWVyIGhhbmQKK3Jlc29sdmUuCisKK1J1bm5pbmcgYGdpdC1yZXJlcmVgIGNvbW1hbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjb25mbGljdGVkCithdXRvbWVyZ2UgcmVjb3JkcyB0aGUgY29uZmxpY3RlZCB3b3JraW5nIHRyZWUgZmlsZXMsIHdpdGggdGhlCit1c3VhbCBjb25mbGljdCBtYXJrZXJzIGA8PDw8PDw8YCwgYD09PT09PT1gLCBhbmQgYD4+Pj4+Pj5gIGluCit0aGVtLiAgTGF0ZXIsIGFmdGVyIHlvdSBhcmUgZG9uZSByZXNvbHZpbmcgdGhlIGNvbmZsaWN0cywKK3J1bm5pbmcgYGdpdC1yZXJlcmVgIGFnYWluIHJlY29yZHMgdGhlIHJlc29sdmVkIHN0YXRlIG9mIHRoZXNlCitmaWxlcy4gIFN1cHBvc2UgeW91IGRpZCB0aGlzIHdoZW4geW91IGNyZWF0ZWQgdGhlIHRlc3QgbWVyZ2Ugb2YKK21hc3RlciBpbnRvIHRoZSB0b3BpYyBicmFuY2guCisKK05leHQgdGltZSwgcnVubmluZyBgZ2l0LXJlcmVyZWAgYWZ0ZXIgc2VlaW5nIGEgY29uZmxpY3RlZAorYXV0b21lcmdlLCBpZiB0aGUgY29uZmxpY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVhcmxpZXIgb25lCityZWNvcmRlZCwgaXQgaXMgbm90aWNlZCBhbmQgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGUKK2VhcmxpZXIgY29uZmxpY3RlZCBhdXRvbWVyZ2UsIHRoZSBlYXJsaWVyIG1hbnVhbCByZXNvbHV0aW9uLCBhbmQKK3RoZSBjdXJyZW50IGNvbmZsaWN0ZWQgYXV0b21lcmdlIGlzIHBlcmZvcm1lZCBieSB0aGUgY29tbWFuZC4KK0lmIHRoaXMgdGhyZWUtd2F5IG1lcmdlIHJlc29sdmVzIGNsZWFubHksIHRoZSByZXN1bHQgaXMgd3JpdHRlbgorb3V0IHRvIHlvdXIgd29ya2luZyB0cmVlIGZpbGUsIHNvIHlvdSB3b3VsZCBub3QgaGF2ZSB0byBtYW51YWxseQorcmVzb2x2ZSBpdC4gIE5vdGUgdGhhdCBgZ2l0LXJlcmVyZWAgbGVhdmVzIHRoZSBpbmRleCBmaWxlIGFsb25lLAorc28geW91IHN0aWxsIG5lZWQgdG8gZG8gdGhlIGZpbmFsIHNhbml0eSBjaGVja3Mgd2l0aCBgZ2l0IGRpZmZgCisob3IgYGdpdCBkaWZmIC1jYCkgYW5kIGBnaXQgYWRkYCB3aGVuIHlvdSBhcmUgc2F0aXNmaWVkLgorCitBcyBhIGNvbnZlbmllbmNlIG1lYXN1cmUsIGBnaXQtbWVyZ2VgIGF1dG9tYXRpY2FsbHkgaW52b2tlcworYGdpdC1yZXJlcmVgIHdoZW4gaXQgZXhpdHMgd2l0aCBhIGZhaWxlZCBhdXRvbWVyZ2UsIHdoaWNoCityZWNvcmRzIGl0IGlmIGl0IGlzIGEgbmV3IGNvbmZsaWN0LCBvciByZXVzZXMgdGhlIGVhcmxpZXIgaGFuZAorcmVzb2x2ZSB3aGVuIGl0IGlzIG5vdC4gIGBnaXQtY29tbWl0YCBhbHNvIGludm9rZXMgYGdpdC1yZXJlcmVgCit3aGVuIHJlY29yZGluZyBhIG1lcmdlIHJlc3VsdC4gIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHlvdSBkbworbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB5b3Vyc2VsZiAoTm90ZTogeW91IHN0aWxsIGhhdmUKK3RvIGNyZWF0ZSBgJEdJVF9ESVIvcnItY2FjaGVgIGRpcmVjdG9yeSB0byBlbmFibGUgdGhpcyBjb21tYW5kKS4KKworSW4gb3VyIGV4YW1wbGUsIHdoZW4geW91IGRpZCB0aGUgdGVzdCBtZXJnZSwgdGhlIG1hbnVhbAorcmVzb2x1dGlvbiBpcyByZWNvcmRlZCwgYW5kIGl0IHdpbGwgYmUgcmV1c2VkIHdoZW4geW91IGRvIHRoZQorYWN0dWFsIG1lcmdlIGxhdGVyIHdpdGggdXBkYXRlZCBtYXN0ZXIgYW5kIHRvcGljIGJyYW5jaCwgYXMgbG9uZworYXMgdGhlIGVhcmxpZXIgcmVzb2x1dGlvbiBpcyBzdGlsbCBhcHBsaWNhYmxlLgorCitUaGUgaW5mb3JtYXRpb24gYGdpdC1yZXJlcmVgIHJlY29yZHMgaXMgYWxzbyB1c2VkIHdoZW4gcnVubmluZworYGdpdC1yZWJhc2VgLiAgQWZ0ZXIgYmxvd2luZyBhd2F5IHRoZSB0ZXN0IG1lcmdlIGFuZCBjb250aW51aW5nCitkZXZlbG9wbWVudCBvbiB0aGUgdG9waWMgYnJhbmNoOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgby0tLSotLS1vLS0tLS0tLW8tLS1vIHRvcGljCisgICAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vICAgbWFzdGVyCisKKwkkIGdpdCByZWJhc2UgbWFzdGVyIHRvcGljCisKKwkJCQkgIG8tLS0qLS0tby0tLS0tLS1vLS0tbyB0b3BpYworCQkJCSAvCisgICAgby0tLW8tLS1vLS0tKi0tLW8tLS1vLS0tby0tLW8gICBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCit5b3UgY291bGQgcnVuIGBnaXQgcmViYXNlIG1hc3RlciB0b3BpY2AsIHRvIGtlZXAgeW91cnNlbGYKK3VwLXRvLWRhdGUgZXZlbiBiZWZvcmUgeW91ciB0b3BpYyBpcyByZWFkeSB0byBiZSBzZW50IHVwc3RyZWFtLgorVGhpcyB3b3VsZCByZXN1bHQgaW4gZmFsbGluZyBiYWNrIHRvIHRocmVlLXdheSBtZXJnZSwgYW5kIGl0Cit3b3VsZCBjb25mbGljdCB0aGUgc2FtZSB3YXkgdGhlIHRlc3QgbWVyZ2UgeW91IHJlc29sdmVkIGVhcmxpZXIuCitgZ2l0LXJlcmVyZWAgaXMgcnVuIGJ5IGBnaXQgcmViYXNlYCB0byBoZWxwIHlvdSByZXNvbHZlIHRoaXMKK2NvbmZsaWN0LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXNldC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXNldC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNWI5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlc2V0LnR4dApAQCAtMCwwICsxLDE4NiBAQAorZ2l0LXJlc2V0KDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlc2V0IC0gUmVzZXQgY3VycmVudCBIRUFEIHRvIHRoZSBzcGVjaWZpZWQgc3RhdGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXJlc2V0JyBbLS1taXhlZCB8IC0tc29mdCB8IC0taGFyZF0gWzxjb21taXQ+XQorJ2dpdC1yZXNldCcgWy0tbWl4ZWRdIDxjb21taXQ+IFstLV0gPHBhdGhzPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1NldHMgdGhlIGN1cnJlbnQgaGVhZCB0byB0aGUgc3BlY2lmaWVkIGNvbW1pdCBhbmQgb3B0aW9uYWxseSByZXNldHMgdGhlCitpbmRleCBhbmQgd29ya2luZyB0cmVlIHRvIG1hdGNoLgorCitUaGlzIGNvbW1hbmQgaXMgdXNlZnVsIGlmIHlvdSBub3RpY2Ugc29tZSBzbWFsbCBlcnJvciBpbiBhIHJlY2VudAorY29tbWl0IChvciBzZXQgb2YgY29tbWl0cykgYW5kIHdhbnQgdG8gcmVkbyB0aGF0IHBhcnQgd2l0aG91dCBzaG93aW5nCit0aGUgdW5kbyBpbiB0aGUgaGlzdG9yeS4KKworSWYgeW91IHdhbnQgdG8gdW5kbyBhIGNvbW1pdCBvdGhlciB0aGFuIHRoZSBsYXRlc3Qgb24gYSBicmFuY2gsCitnaXRsaW5rOmdpdC1yZXZlcnRbMV0gaXMgeW91ciBmcmllbmQuCisKK1RoZSBzZWNvbmQgZm9ybSB3aXRoICdwYXRocycgaXMgdXNlZCB0byByZXZlcnQgc2VsZWN0ZWQgcGF0aHMgaW4KK3RoZSBpbmRleCBmcm9tIGEgZ2l2ZW4gY29tbWl0LCB3aXRob3V0IG1vdmluZyBIRUFELgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tbWl4ZWQ6OgorCVJlc2V0cyB0aGUgaW5kZXggYnV0IG5vdCB0aGUgd29ya2luZyB0cmVlIChpLmUuLCB0aGUgY2hhbmdlZCBmaWxlcworCWFyZSBwcmVzZXJ2ZWQgYnV0IG5vdCBtYXJrZWQgZm9yIGNvbW1pdCkgYW5kIHJlcG9ydHMgd2hhdCBoYXMgbm90CisJYmVlbiB1cGRhdGVkLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGFjdGlvbi4KKworLS1zb2Z0OjoKKwlEb2VzIG5vdCB0b3VjaCB0aGUgaW5kZXggZmlsZSBub3IgdGhlIHdvcmtpbmcgdHJlZSBhdCBhbGwsIGJ1dAorCXJlcXVpcmVzIHRoZW0gdG8gYmUgaW4gYSBnb29kIG9yZGVyLiBUaGlzIGxlYXZlcyBhbGwgeW91ciBjaGFuZ2VkCisJZmlsZXMgIkFkZGVkIGJ1dCBub3QgeWV0IGNvbW1pdHRlZCIsIGFzIGdpdGxpbms6Z2l0LXN0YXR1c1sxXSB3b3VsZAorCXB1dCBpdC4KKworLS1oYXJkOjoKKwlNYXRjaGVzIHRoZSB3b3JraW5nIHRyZWUgYW5kIGluZGV4IHRvIHRoYXQgb2YgdGhlIHRyZWUgYmVpbmcKKwlzd2l0Y2hlZCB0by4gQW55IGNoYW5nZXMgdG8gdHJhY2tlZCBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlCisJc2luY2UgPGNvbW1pdD4gYXJlIGxvc3QuCisKKzxjb21taXQ+OjoKKwlDb21taXQgdG8gbWFrZSB0aGUgY3VycmVudCBIRUFELgorCitFeGFtcGxlcworLS0tLS0tLS0KKworVW5kbyBhIGNvbW1pdCBhbmQgcmVkbzo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAuLi4KKyQgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiAgICAgIDwxPgorJCBlZGl0ICAgICAgICAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBjb21taXQgLWEgLWMgT1JJR19IRUFEICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgaXMgbW9zdCBvZnRlbiBkb25lIHdoZW4geW91IHJlbWVtYmVyZWQgd2hhdCB5b3UKK2p1c3QgY29tbWl0dGVkIGlzIGluY29tcGxldGUsIG9yIHlvdSBtaXNzcGVsbGVkIHlvdXIgY29tbWl0CittZXNzYWdlLCBvciBib3RoLiAgTGVhdmVzIHdvcmtpbmcgdHJlZSBhcyBpdCB3YXMgYmVmb3JlICJyZXNldCIuCis8Mj4gbWFrZSBjb3JyZWN0aW9ucyB0byB3b3JraW5nIHRyZWUgZmlsZXMuCis8Mz4gInJlc2V0IiBjb3BpZXMgdGhlIG9sZCBoZWFkIHRvIC5naXQvT1JJR19IRUFEOyByZWRvIHRoZQorY29tbWl0IGJ5IHN0YXJ0aW5nIHdpdGggaXRzIGxvZyBtZXNzYWdlLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRvCitlZGl0IHRoZSBtZXNzYWdlIGZ1cnRoZXIsIHlvdSBjYW4gZ2l2ZSAtQyBvcHRpb24gaW5zdGVhZC4KKysKK1NlZSBhbHNvIHRoZSAtLWFtZW5kIG9wdGlvbiB0byBnaXRsaW5rOmdpdC1jb21taXRbMV0uCisKK1VuZG8gY29tbWl0cyBwZXJtYW5lbnRseTo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAuLi4KKyQgZ2l0IHJlc2V0IC0taGFyZCBIRUFEfjMgICA8MT4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoZSBsYXN0IHRocmVlIGNvbW1pdHMgKEhFQUQsIEhFQUReLCBhbmQgSEVBRH4yKSB3ZXJlIGJhZAorYW5kIHlvdSBkbyBub3Qgd2FudCB0byBldmVyIHNlZSB0aGVtIGFnYWluLiAgRG8gKm5vdCogZG8gdGhpcyBpZgoreW91IGhhdmUgYWxyZWFkeSBnaXZlbiB0aGVzZSBjb21taXRzIHRvIHNvbWVib2R5IGVsc2UuCisKK1VuZG8gYSBjb21taXQsIG1ha2luZyBpdCBhIHRvcGljIGJyYW5jaDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCB0b3BpYy93aXAgICAgIDwxPgorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MyAgPDI+CiskIGdpdCBjaGVja291dCB0b3BpYy93aXAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFlvdSBoYXZlIG1hZGUgc29tZSBjb21taXRzLCBidXQgcmVhbGl6ZSB0aGV5IHdlcmUgcHJlbWF0dXJlCit0byBiZSBpbiB0aGUgIm1hc3RlciIgYnJhbmNoLiAgWW91IHdhbnQgdG8gY29udGludWUgcG9saXNoaW5nCit0aGVtIGluIGEgdG9waWMgYnJhbmNoLCBzbyBjcmVhdGUgInRvcGljL3dpcCIgYnJhbmNoIG9mZiBvZiB0aGUKK2N1cnJlbnQgSEVBRC4KKzwyPiBSZXdpbmQgdGhlIG1hc3RlciBicmFuY2ggdG8gZ2V0IHJpZCBvZiB0aG9zZSB0aHJlZSBjb21taXRzLgorPDM+IFN3aXRjaCB0byAidG9waWMvd2lwIiBicmFuY2ggYW5kIGtlZXAgd29ya2luZy4KKworVW5kbyBhZGQ6OgorKworLS0tLS0tLS0tLS0tCiskIGVkaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDE+CiskIGdpdCBhZGQgZnJvdHouYyBmaWxmcmUuYworJCBtYWlseCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwyPgorJCBnaXQgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwzPgorJCBnaXQgcHVsbCBnaXQ6Ly9pbmZvLmV4YW1wbGUuY29tLyBuaXRmb2wgIDw0PgorLS0tLS0tLS0tLS0tCisrCis8MT4geW91IGFyZSBoYXBwaWx5IHdvcmtpbmcgb24gc29tZXRoaW5nLCBhbmQgZmluZCB0aGUgY2hhbmdlcworaW4gdGhlc2UgZmlsZXMgYXJlIGluIGdvb2Qgb3JkZXIuICBZb3UgZG8gbm90IHdhbnQgdG8gc2VlIHRoZW0KK3doZW4geW91IHJ1biAiZ2l0IGRpZmYiLCBiZWNhdXNlIHlvdSBwbGFuIHRvIHdvcmsgb24gb3RoZXIgZmlsZXMKK2FuZCBjaGFuZ2VzIHdpdGggdGhlc2UgZmlsZXMgYXJlIGRpc3RyYWN0aW5nLgorPDI+IHNvbWVib2R5IGFza3MgeW91IHRvIHB1bGwsIGFuZCB0aGUgY2hhbmdlcyBzb3VuZHMgd29ydGh5IG9mIG1lcmdpbmcuCis8Mz4gaG93ZXZlciwgeW91IGFscmVhZHkgZGlydGllZCB0aGUgaW5kZXggKGkuZS4geW91ciBpbmRleCBkb2VzCitub3QgbWF0Y2ggdGhlIEhFQUQgY29tbWl0KS4gIEJ1dCB5b3Uga25vdyB0aGUgcHVsbCB5b3UgYXJlIGdvaW5nCit0byBtYWtlIGRvZXMgbm90IGFmZmVjdCBmcm90ei5jIG5vciBmaWxmcmUuYywgc28geW91IHJldmVydCB0aGUKK2luZGV4IGNoYW5nZXMgZm9yIHRoZXNlIHR3byBmaWxlcy4gIFlvdXIgY2hhbmdlcyBpbiB3b3JraW5nIHRyZWUKK3JlbWFpbiB0aGVyZS4KKzw0PiB0aGVuIHlvdSBjYW4gcHVsbCBhbmQgbWVyZ2UsIGxlYXZpbmcgZnJvdHouYyBhbmQgZmlsZnJlLmMKK2NoYW5nZXMgc3RpbGwgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKworVW5kbyBhIG1lcmdlIG9yIHB1bGw6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsICAgICAgICAgICAgICAgICAgICAgICAgIDwxPgorQXV0by1tZXJnaW5nIG5pdGZvbAorQ09ORkxJQ1QgKGNvbnRlbnQpOiBNZXJnZSBjb25mbGljdCBpbiBuaXRmb2wKK0F1dG9tYXRpYyBtZXJnZSBmYWlsZWQvcHJldmVudGVkOyBmaXggdXAgYnkgaGFuZAorJCBnaXQgcmVzZXQgLS1oYXJkICAgICAgICAgICAgICAgICA8Mj4KKyQgZ2l0IHB1bGwgLiB0b3BpYy9icmFuY2ggICAgICAgICAgPDM+CitVcGRhdGluZyBmcm9tIDQxMjIzLi4uIHRvIDEzMTM0Li4uCitGYXN0IGZvcndhcmQKKyQgZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQgICAgICAgPDQ+CistLS0tLS0tLS0tLS0KKysKKzwxPiB0cnkgdG8gdXBkYXRlIGZyb20gdGhlIHVwc3RyZWFtIHJlc3VsdGVkIGluIGEgbG90IG9mCitjb25mbGljdHM7IHlvdSB3ZXJlIG5vdCByZWFkeSB0byBzcGVuZCBhIGxvdCBvZiB0aW1lIG1lcmdpbmcKK3JpZ2h0IG5vdywgc28geW91IGRlY2lkZSB0byBkbyB0aGF0IGxhdGVyLgorPDI+ICJwdWxsIiBoYXMgbm90IG1hZGUgbWVyZ2UgY29tbWl0LCBzbyAiZ2l0IHJlc2V0IC0taGFyZCIKK3doaWNoIGlzIGEgc3lub255bSBmb3IgImdpdCByZXNldCAtLWhhcmQgSEVBRCIgY2xlYXJzIHRoZSBtZXNzCitmcm9tIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUgd29ya2luZyB0cmVlLgorPDM+IG1lcmdlIGEgdG9waWMgYnJhbmNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLCB3aGljaCByZXN1bHRlZAoraW4gYSBmYXN0IGZvcndhcmQuCis8ND4gYnV0IHlvdSBkZWNpZGVkIHRoYXQgdGhlIHRvcGljIGJyYW5jaCBpcyBub3QgcmVhZHkgZm9yIHB1YmxpYworY29uc3VtcHRpb24geWV0LiAgInB1bGwiIG9yICJtZXJnZSIgYWx3YXlzIGxlYXZlcyB0aGUgb3JpZ2luYWwKK3RpcCBvZiB0aGUgY3VycmVudCBicmFuY2ggaW4gT1JJR19IRUFELCBzbyByZXNldHRpbmcgaGFyZCB0byBpdAorYnJpbmdzIHlvdXIgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZSBiYWNrIHRvIHRoYXQgc3RhdGUsCithbmQgcmVzZXRzIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCB0byB0aGF0IGNvbW1pdC4KKworSW50ZXJydXB0ZWQgd29ya2Zsb3c6OgorKworU3VwcG9zZSB5b3UgYXJlIGludGVycnVwdGVkIGJ5IGFuIHVyZ2VudCBmaXggcmVxdWVzdCB3aGlsZSB5b3UKK2FyZSBpbiB0aGUgbWlkZGxlIG9mIGEgbGFyZ2UgY2hhbmdlLiAgVGhlIGZpbGVzIGluIHlvdXIKK3dvcmtpbmcgdHJlZSBhcmUgbm90IGluIGFueSBzaGFwZSB0byBiZSBjb21taXR0ZWQgeWV0LCBidXQgeW91CituZWVkIHRvIGdldCB0byB0aGUgb3RoZXIgYnJhbmNoIGZvciBhIHF1aWNrIGJ1Z2ZpeC4KKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgZmVhdHVyZSA7IyB5b3Ugd2VyZSB3b3JraW5nIGluICJmZWF0dXJlIiBicmFuY2ggYW5kCiskIHdvcmsgd29yayB3b3JrICAgICAgIDsjIGdvdCBpbnRlcnJ1cHRlZAorJCBnaXQgY29tbWl0IC1hIC1tICdzbmFwc2hvdCBXSVAnICAgICAgICAgICAgICAgICA8MT4KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBmaXggZml4IGZpeAorJCBnaXQgY29tbWl0IDsjIGNvbW1pdCB3aXRoIHJlYWwgbG9nCiskIGdpdCBjaGVja291dCBmZWF0dXJlCiskIGdpdCByZXNldCAtLXNvZnQgSEVBRF4gOyMgZ28gYmFjayB0byBXSVAgc3RhdGUgIDwyPgorJCBnaXQgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgY29tbWl0IHdpbGwgZ2V0IGJsb3duIGF3YXkgc28gYSB0aHJvdy1hd2F5IGxvZyBtZXNzYWdlIGlzIE9LLgorPDI+IFRoaXMgcmVtb3ZlcyB0aGUgJ1dJUCcgY29tbWl0IGZyb20gdGhlIGNvbW1pdCBoaXN0b3J5LCBhbmQgc2V0cworICAgIHlvdXIgd29ya2luZyB0cmVlIHRvIHRoZSBzdGF0ZSBqdXN0IGJlZm9yZSB5b3UgbWFkZSB0aGF0IHNuYXBzaG90LgorPDM+IEF0IHRoaXMgcG9pbnQgdGhlIGluZGV4IGZpbGUgc3RpbGwgaGFzIGFsbCB0aGUgV0lQIGNoYW5nZXMgeW91CisgICAgY29tbWl0dGVkIGFzICdzbmFwc2hvdCBXSVAnLiAgVGhpcyB1cGRhdGVzIHRoZSBpbmRleCB0byBzaG93IHlvdXIKKyAgICBXSVAgZmlsZXMgYXMgdW5jb21taXR0ZWQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzIwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtbGlzdC50eHQKQEAgLTAsMCArMSwzODUgQEAKK2dpdC1yZXYtbGlzdCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXYtbGlzdCAtIExpc3RzIGNvbW1pdCBvYmplY3RzIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1yZXYtbGlzdCcgWyBcLS1tYXgtY291bnQ9bnVtYmVyIF0KKwkgICAgIFsgXC0tc2tpcD1udW1iZXIgXQorCSAgICAgWyBcLS1tYXgtYWdlPXRpbWVzdGFtcCBdCisJICAgICBbIFwtLW1pbi1hZ2U9dGltZXN0YW1wIF0KKwkgICAgIFsgXC0tc3BhcnNlIF0KKwkgICAgIFsgXC0tbm8tbWVyZ2VzIF0KKwkgICAgIFsgXC0tcmVtb3ZlLWVtcHR5IF0KKwkgICAgIFsgXC0tbm90IF0KKwkgICAgIFsgXC0tYWxsIF0KKwkgICAgIFsgXC0tc3RkaW4gXQorCSAgICAgWyBcLS10b3BvLW9yZGVyIF0KKwkgICAgIFsgXC0tcGFyZW50cyBdCisJICAgICBbIFwtLWxlZnQtcmlnaHQgXQorCSAgICAgWyBcLS1jaGVycnktcGljayBdCisJICAgICBbIFwtLWVuY29kaW5nWz08ZW5jb2Rpbmc+XSBdCisJICAgICBbIFwtLShhdXRob3J8Y29tbWl0dGVyfGdyZXApPTxwYXR0ZXJuPiBdCisJICAgICBbIFwtLWRhdGU9e2xvY2FsfHJlbGF0aXZlfGRlZmF1bHR9IF0KKwkgICAgIFsgW1wtLW9iamVjdHMgfCBcLS1vYmplY3RzLWVkZ2VdIFsgXC0tdW5wYWNrZWQgXSBdCisJICAgICBbIFwtLXByZXR0eSB8IFwtLWhlYWRlciBdCisJICAgICBbIFwtLWJpc2VjdCBdCisJICAgICBbIFwtLWJpc2VjdC12YXJzIF0KKwkgICAgIFsgXC0tbWVyZ2UgXQorCSAgICAgWyBcLS1yZXZlcnNlIF0KKwkgICAgIFsgXC0td2Fsay1yZWZsb2dzIF0KKwkgICAgIDxjb21taXQ+Li4uIFsgXC0tIDxwYXRocz4uLi4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworTGlzdHMgY29tbWl0IG9iamVjdHMgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyIHN0YXJ0aW5nIGF0IHRoZQorZ2l2ZW4gY29tbWl0KHMpLCB0YWtpbmcgYW5jZXN0cnkgcmVsYXRpb25zaGlwIGludG8gYWNjb3VudC4gIFRoaXMgaXMKK3VzZWZ1bCB0byBwcm9kdWNlIGh1bWFuLXJlYWRhYmxlIGxvZyBvdXRwdXQuCisKK0NvbW1pdHMgd2hpY2ggYXJlIHN0YXRlZCB3aXRoIGEgcHJlY2VkaW5nICd7Y2FyZXR9JyBjYXVzZSBsaXN0aW5nIHRvCitzdG9wIGF0IHRoYXQgcG9pbnQuIFRoZWlyIHBhcmVudHMgYXJlIGltcGxpZWQuIFRodXMgdGhlIGZvbGxvd2luZworY29tbWFuZDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkkIGdpdC1yZXYtbGlzdCBmb28gYmFyIF5iYXoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21lYW5zICJsaXN0IGFsbCB0aGUgY29tbWl0cyB3aGljaCBhcmUgaW5jbHVkZWQgaW4gJ2ZvbycgYW5kICdiYXInLCBidXQKK25vdCBpbiAnYmF6JyIuCisKK0Egc3BlY2lhbCBub3RhdGlvbiAiJzxjb21taXQxPicuLic8Y29tbWl0Mj4nIiBjYW4gYmUgdXNlZCBhcyBhCitzaG9ydC1oYW5kIGZvciAie2NhcmV0fSc8Y29tbWl0MT4nICc8Y29tbWl0Mj4nIi4gRm9yIGV4YW1wbGUsIGVpdGhlciBvZgordGhlIGZvbGxvd2luZyBtYXkgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJJCBnaXQtcmV2LWxpc3Qgb3JpZ2luLi5IRUFECisJJCBnaXQtcmV2LWxpc3QgSEVBRCBeb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbm90aGVyIHNwZWNpYWwgbm90YXRpb24gaXMgIic8Y29tbWl0MT4nLi4uJzxjb21taXQyPiciIHdoaWNoIGlzIHVzZWZ1bAorZm9yIG1lcmdlcy4gIFRoZSByZXN1bHRpbmcgc2V0IG9mIGNvbW1pdHMgaXMgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlCitiZXR3ZWVuIHRoZSB0d28gb3BlcmFuZHMuICBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcyBhcmUgZXF1aXZhbGVudDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkkIGdpdC1yZXYtbGlzdCBBIEIgLS1ub3QgJChnaXQtbWVyZ2UtYmFzZSAtLWFsbCBBIEIpCisJJCBnaXQtcmV2LWxpc3QgQS4uLkIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2dpdGxpbms6Z2l0LXJldi1saXN0WzFdIGlzIGEgdmVyeSBlc3NlbnRpYWwgZ2l0IHByb2dyYW0sIHNpbmNlIGl0Citwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBidWlsZCBhbmQgdHJhdmVyc2UgY29tbWl0IGFuY2VzdHJ5IGdyYXBocy4gRm9yCit0aGlzIHJlYXNvbiwgaXQgaGFzIGEgbG90IG9mIGRpZmZlcmVudCBvcHRpb25zIHRoYXQgZW5hYmxlcyBpdCB0byBiZQordXNlZCBieSBjb21tYW5kcyBhcyBkaWZmZXJlbnQgYXMgZ2l0bGluazpnaXQtYmlzZWN0WzFdIGFuZAorZ2l0bGluazpnaXQtcmVwYWNrWzFdLgorCitPUFRJT05TCistLS0tLS0tCisKK0NvbW1pdCBGb3JtYXR0aW5nCit+fn5+fn5+fn5+fn5+fn5+fgorCitVc2luZyB0aGVzZSBvcHRpb25zLCBnaXRsaW5rOmdpdC1yZXYtbGlzdFsxXSB3aWxsIGFjdCBzaW1pbGFyIHRvIHRoZQorbW9yZSBzcGVjaWFsaXplZCBmYW1pbHkgb2YgY29tbWl0IGxvZyB0b29sczogZ2l0bGluazpnaXQtbG9nWzFdLAorZ2l0bGluazpnaXQtc2hvd1sxXSwgYW5kIGdpdGxpbms6Z2l0LXdoYXRjaGFuZ2VkWzFdCisKK2luY2x1ZGU6OnByZXR0eS1vcHRpb25zLnR4dFtdCisKKy0tcmVsYXRpdmUtZGF0ZTo6CisKKwlTeW5vbnltIGZvciBgLS1kYXRlPXJlbGF0aXZlYC4KKworLS1kYXRlPXtyZWxhdGl2ZSxsb2NhbCxkZWZhdWx0fTo6CisKKwlPbmx5IHRha2VzIGVmZmVjdCBmb3IgZGF0ZXMgc2hvd24gaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0LCBzdWNoCisJYXMgd2hlbiB1c2luZyAiLS1wcmV0dHkiLgorKworYC0tZGF0ZT1yZWxhdGl2ZWAgc2hvd3MgZGF0ZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgdGltZSwKK2UuZy4gIjIgaG91cnMgYWdvIi4KKysKK2AtLWRhdGU9bG9jYWxgIHNob3dzIHRpbWVzdGFtcHMgaW4gdXNlcidzIGxvY2FsIHRpbWV6b25lLgorKworYC0tZGF0ZT1kZWZhdWx0YCBzaG93cyB0aW1lc3RhbXBzIGluIHRoZSBvcmlnaW5hbCB0aW1lem9uZQorKGVpdGhlciBjb21taXR0ZXIncyBvciBhdXRob3IncykuCisKKy0taGVhZGVyOjoKKworCVByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY29tbWl0IGluIHJhdy1mb3JtYXQ7IGVhY2ggcmVjb3JkIGlzCisJc2VwYXJhdGVkIHdpdGggYSBOVUwgY2hhcmFjdGVyLgorCistLXBhcmVudHM6OgorCisJUHJpbnQgdGhlIHBhcmVudHMgb2YgdGhlIGNvbW1pdC4KKworLS1sZWZ0LXJpZ2h0OjoKKworCU1hcmsgd2hpY2ggc2lkZSBvZiBhIHN5bW1ldHJpYyBkaWZmIGEgY29tbWl0IGlzIHJlYWNoYWJsZSBmcm9tLgorCUNvbW1pdHMgZnJvbSB0aGUgbGVmdCBzaWRlIGFyZSBwcmVmaXhlZCB3aXRoIGA8YCBhbmQgdGhvc2UgZnJvbQorCXRoZSByaWdodCB3aXRoIGA+YC4gIElmIGNvbWJpbmVkIHdpdGggYC0tYm91bmRhcnlgLCB0aG9zZQorCWNvbW1pdHMgYXJlIHByZWZpeGVkIHdpdGggYC1gLgorKworRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXMgdG9wb2xvZ3k6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgIHktLS1iLS0tYiAgYnJhbmNoIEIKKyAgICAgICAgICAgIC8gXCAvCisgICAgICAgICAgIC8gICAuCisgICAgICAgICAgLyAgIC8gXAorICAgICAgICAgby0tLXgtLS1hLS0tYSAgYnJhbmNoIEEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCit5b3Ugd291bGQgZ2V0IGFuIG91dHB1dCBsaW5lIHRoaXM6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSQgZ2l0IHJldi1saXN0IC0tbGVmdC1yaWdodCAtLWJvdW5kYXJ5IC0tcHJldHR5PW9uZWxpbmUgQS4uLkIKKworCT5iYmJiYmJiLi4uIDNyZCBvbiBiCisJPmJiYmJiYmIuLi4gMm5kIG9uIGIKKwk8YWFhYWFhYS4uLiAzcmQgb24gYQorCTxhYWFhYWFhLi4uIDJuZCBvbiBhCisJLXl5eXl5eXkuLi4gMXN0IG9uIGIKKwkteHh4eHh4eC4uLiAxc3Qgb24gYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGlmZiBGb3JtYXR0aW5nCit+fn5+fn5+fn5+fn5+fn4KKworQmVsb3cgYXJlIGxpc3RlZCBvcHRpb25zIHRoYXQgY29udHJvbCB0aGUgZm9ybWF0dGluZyBvZiBkaWZmIG91dHB1dC4KK1NvbWUgb2YgdGhlbSBhcmUgc3BlY2lmaWMgdG8gZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0sIGhvd2V2ZXIgb3RoZXIgZGlmZgorb3B0aW9ucyBtYXkgYmUgZ2l2ZW4uIFNlZSBnaXRsaW5rOmdpdC1kaWZmLWZpbGVzWzFdIGZvciBtb3JlIG9wdGlvbnMuCisKKy1jOjoKKworCVRoaXMgZmxhZyBjaGFuZ2VzIHRoZSB3YXkgYSBtZXJnZSBjb21taXQgaXMgZGlzcGxheWVkLiAgSXQgc2hvd3MKKwl0aGUgZGlmZmVyZW5jZXMgZnJvbSBlYWNoIG9mIHRoZSBwYXJlbnRzIHRvIHRoZSBtZXJnZSByZXN1bHQKKwlzaW11bHRhbmVvdXNseSBpbnN0ZWFkIG9mIHNob3dpbmcgcGFpcndpc2UgZGlmZiBiZXR3ZWVuIGEgcGFyZW50CisJYW5kIHRoZSByZXN1bHQgb25lIGF0IGEgdGltZS4gRnVydGhlcm1vcmUsIGl0IGxpc3RzIG9ubHkgZmlsZXMKKwl3aGljaCB3ZXJlIG1vZGlmaWVkIGZyb20gYWxsIHBhcmVudHMuCisKKy0tY2M6OgorCisJVGhpcyBmbGFnIGltcGxpZXMgdGhlICctYycgb3B0aW9ucyBhbmQgZnVydGhlciBjb21wcmVzc2VzIHRoZQorCXBhdGNoIG91dHB1dCBieSBvbWl0dGluZyBodW5rcyB0aGF0IHNob3cgZGlmZmVyZW5jZXMgZnJvbSBvbmx5CisJb25lIHBhcmVudCwgb3Igc2hvdyB0aGUgc2FtZSBjaGFuZ2UgZnJvbSBhbGwgYnV0IG9uZSBwYXJlbnQgZm9yCisJYW4gT2N0b3B1cyBtZXJnZS4KKworLXI6OgorCisJU2hvdyByZWN1cnNpdmUgZGlmZnMuCisKKy10OjoKKworCVNob3cgdGhlIHRyZWUgb2JqZWN0cyBpbiB0aGUgZGlmZiBvdXRwdXQuIFRoaXMgaW1wbGllcyAnLXInLgorCitDb21taXQgTGltaXRpbmcKK35+fn5+fn5+fn5+fn5+fgorCitCZXNpZGVzIHNwZWNpZnlpbmcgYSByYW5nZSBvZiBjb21taXRzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZCB1c2luZyB0aGUKK3NwZWNpYWwgbm90YXRpb25zIGV4cGxhaW5lZCBpbiB0aGUgZGVzY3JpcHRpb24sIGFkZGl0aW9uYWwgY29tbWl0CitsaW1pdGluZyBtYXkgYmUgYXBwbGllZC4KKworLS0KKworLW4gJ251bWJlcicsIC0tbWF4LWNvdW50PSdudW1iZXInOjoKKworCUxpbWl0IHRoZSBudW1iZXIgb2YgY29tbWl0cyBvdXRwdXQuCisKKy0tc2tpcD0nbnVtYmVyJzo6CisKKwlTa2lwICdudW1iZXInIGNvbW1pdHMgYmVmb3JlIHN0YXJ0aW5nIHRvIHNob3cgdGhlIGNvbW1pdCBvdXRwdXQuCisKKy0tc2luY2U9J2RhdGUnLCAtLWFmdGVyPSdkYXRlJzo6CisKKwlTaG93IGNvbW1pdHMgbW9yZSByZWNlbnQgdGhhbiBhIHNwZWNpZmljIGRhdGUuCisKKy0tdW50aWw9J2RhdGUnLCAtLWJlZm9yZT0nZGF0ZSc6OgorCisJU2hvdyBjb21taXRzIG9sZGVyIHRoYW4gYSBzcGVjaWZpYyBkYXRlLgorCistLW1heC1hZ2U9J3RpbWVzdGFtcCcsIC0tbWluLWFnZT0ndGltZXN0YW1wJzo6CisKKwlMaW1pdCB0aGUgY29tbWl0cyBvdXRwdXQgdG8gc3BlY2lmaWVkIHRpbWUgcmFuZ2UuCisKKy0tYXV0aG9yPSdwYXR0ZXJuJywgLS1jb21taXR0ZXI9J3BhdHRlcm4nOjoKKworCUxpbWl0IHRoZSBjb21taXRzIG91dHB1dCB0byBvbmVzIHdpdGggYXV0aG9yL2NvbW1pdHRlcgorCWhlYWRlciBsaW5lcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiAocmVndWxhciBleHByZXNzaW9uKS4KKworLS1ncmVwPSdwYXR0ZXJuJzo6CisKKwlMaW1pdCB0aGUgY29tbWl0cyBvdXRwdXQgdG8gb25lcyB3aXRoIGxvZyBtZXNzYWdlIHRoYXQKKwltYXRjaGVzIHRoZSBzcGVjaWZpZWQgcGF0dGVybiAocmVndWxhciBleHByZXNzaW9uKS4KKworLS1yZW1vdmUtZW1wdHk6OgorCisJU3RvcCB3aGVuIGEgZ2l2ZW4gcGF0aCBkaXNhcHBlYXJzIGZyb20gdGhlIHRyZWUuCisKKy0tbm8tbWVyZ2VzOjoKKworCURvIG5vdCBwcmludCBjb21taXRzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJlbnQuCisKKy0tbm90OjoKKworCVJldmVyc2VzIHRoZSBtZWFuaW5nIG9mIHRoZSAne2NhcmV0fScgcHJlZml4IChvciBsYWNrIHRoZXJlb2YpCisJZm9yIGFsbCBmb2xsb3dpbmcgcmV2aXNpb24gc3BlY2lmaWVycywgdXAgdG8gdGhlIG5leHQgJy0tbm90Jy4KKworLS1hbGw6OgorCisJUHJldGVuZCBhcyBpZiBhbGwgdGhlIHJlZnMgaW4gYCRHSVRfRElSL3JlZnMvYCBhcmUgbGlzdGVkIG9uIHRoZQorCWNvbW1hbmQgbGluZSBhcyAnPGNvbW1pdD4nLgorCistLXN0ZGluOjoKKworCUluIGFkZGl0aW9uIHRvIHRoZSAnPGNvbW1pdD4nIGxpc3RlZCBvbiB0aGUgY29tbWFuZAorCWxpbmUsIHJlYWQgdGhlbSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1jaGVycnktcGljazo6CisKKwlPbWl0IGFueSBjb21taXQgdGhhdCBpbnRyb2R1Y2VzIHRoZSBzYW1lIGNoYW5nZSBhcworCWFub3RoZXIgY29tbWl0IG9uIHRoZSAib3RoZXIgc2lkZSIgd2hlbiB0aGUgc2V0IG9mCisJY29tbWl0cyBhcmUgbGltaXRlZCB3aXRoIHN5bW1ldHJpYyBkaWZmZXJlbmNlLgorKworRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBicmFuY2hlcywgYEFgIGFuZCBgQmAsIGEgdXN1YWwgd2F5Cit0byBsaXN0IGFsbCBjb21taXRzIG9uIG9ubHkgb25lIHNpZGUgb2YgdGhlbSBpcyB3aXRoCitgLS1sZWZ0LXJpZ2h0YCwgbGlrZSB0aGUgZXhhbXBsZSBhYm92ZSBpbiB0aGUgZGVzY3JpcHRpb24gb2YKK3RoYXQgb3B0aW9uLiAgSXQgaG93ZXZlciBzaG93cyB0aGUgY29tbWl0cyB0aGF0IHdlcmUgY2hlcnJ5LXBpY2tlZAorZnJvbSB0aGUgb3RoZXIgYnJhbmNoIChmb3IgZXhhbXBsZSwgIjNyZCBvbiBiIiBtYXkgYmUgY2hlcnJ5LXBpY2tlZAorZnJvbSBicmFuY2ggQSkuICBXaXRoIHRoaXMgb3B0aW9uLCBzdWNoIHBhaXJzIG9mIGNvbW1pdHMgYXJlCitleGNsdWRlZCBmcm9tIHRoZSBvdXRwdXQuCisKKy1nLCAtLXdhbGstcmVmbG9nczo6CisKKwlJbnN0ZWFkIG9mIHdhbGtpbmcgdGhlIGNvbW1pdCBhbmNlc3RyeSBjaGFpbiwgd2FsaworCXJlZmxvZyBlbnRyaWVzIGZyb20gdGhlIG1vc3QgcmVjZW50IG9uZSB0byBvbGRlciBvbmVzLgorCVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCB5b3UgY2Fubm90IHNwZWNpZnkgY29tbWl0cyB0bworCWV4Y2x1ZGUgKHRoYXQgaXMsICd7Y2FyZXR9Y29tbWl0JywgJ2NvbW1pdDEuLmNvbW1pdDInLAorCW5vciAnY29tbWl0MS4uLmNvbW1pdDInIG5vdGF0aW9ucyBjYW5ub3QgYmUgdXNlZCkuCisrCitXaXRoICdcLS1wcmV0dHknIGZvcm1hdCBvdGhlciB0aGFuIG9uZWxpbmUgKGZvciBvYnZpb3VzIHJlYXNvbnMpLAordGhpcyBjYXVzZXMgdGhlIG91dHB1dCB0byBoYXZlIHR3byBleHRyYSBsaW5lcyBvZiBpbmZvcm1hdGlvbgordGFrZW4gZnJvbSB0aGUgcmVmbG9nLiAgQnkgZGVmYXVsdCwgJ2NvbW1pdEB7TnRofScgbm90YXRpb24gaXMKK3VzZWQgaW4gdGhlIG91dHB1dC4gIFdoZW4gdGhlIHN0YXJ0aW5nIGNvbW1pdCBpcyBzcGVjaWZpZWQgYXMKKydjb21taXRAe25vd30nLCBvdXRwdXQgYWxzbyB1c2VzICdjb21taXRAe3RpbWVzdGFtcH0nIG5vdGF0aW9uCitpbnN0ZWFkLiAgVW5kZXIgJ1wtLXByZXR0eT1vbmVsaW5lJywgdGhlIGNvbW1pdCBtZXNzYWdlIGlzCitwcmVmaXhlZCB3aXRoIHRoaXMgaW5mb3JtYXRpb24gb24gdGhlIHNhbWUgbGluZS4KKworLS1tZXJnZTo6CisKKwlBZnRlciBhIGZhaWxlZCBtZXJnZSwgc2hvdyByZWZzIHRoYXQgdG91Y2ggZmlsZXMgaGF2aW5nIGEKKwljb25mbGljdCBhbmQgZG9uJ3QgZXhpc3Qgb24gYWxsIGhlYWRzIHRvIG1lcmdlLgorCistLWJvdW5kYXJ5OjoKKworCU91dHB1dCB1bmludGVyZXN0aW5nIGNvbW1pdHMgYXQgdGhlIGJvdW5kYXJ5LCB3aGljaCBhcmUgdXN1YWxseQorCW5vdCBzaG93bi4KKworLS1kZW5zZSwgLS1zcGFyc2U6OgorCitXaGVuIG9wdGlvbmFsIHBhdGhzIGFyZSBnaXZlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyICgnLS1kZW5zZScpIGlzIHRvCitvbmx5IG91dHB1dCBjb21taXRzIHRoYXQgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlbSwgYW5kIGFsc28gaWdub3JlCittZXJnZXMgdGhhdCBkbyBub3QgdG91Y2ggdGhlIGdpdmVuIHBhdGhzLgorCitVc2UgdGhlICctLXNwYXJzZScgZmxhZyB0byBtYWtlcyB0aGUgY29tbWFuZCBvdXRwdXQgYWxsIGVsaWdpYmxlIGNvbW1pdHMKKyhzdGlsbCBzdWJqZWN0IHRvIGNvdW50IGFuZCBhZ2UgbGltaXRhdGlvbiksIGJ1dCBhcHBseSBtZXJnZQorc2ltcGxpZmljYXRpb24gbmV2ZXJ0aGVsZXNzLgorCistLWJpc2VjdDo6CisKK0xpbWl0IG91dHB1dCB0byB0aGUgb25lIGNvbW1pdCBvYmplY3Qgd2hpY2ggaXMgcm91Z2hseSBoYWxmd2F5IGJldHdlZW4KK3RoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgY29tbWl0cy4gVGh1cywgaWYKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkkIGdpdC1yZXYtbGlzdCAtLWJpc2VjdCBmb28gXmJhciBeYmF6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvdXRwdXRzICdtaWRwb2ludCcsIHRoZSBvdXRwdXQgb2YgdGhlIHR3byBjb21tYW5kcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSQgZ2l0LXJldi1saXN0IGZvbyBebWlkcG9pbnQKKwkkIGdpdC1yZXYtbGlzdCBtaWRwb2ludCBeYmFyIF5iYXoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dvdWxkIGJlIG9mIHJvdWdobHkgdGhlIHNhbWUgbGVuZ3RoLiAgRmluZGluZyB0aGUgY2hhbmdlIHdoaWNoCitpbnRyb2R1Y2VzIGEgcmVncmVzc2lvbiBpcyB0aHVzIHJlZHVjZWQgdG8gYSBiaW5hcnkgc2VhcmNoOiByZXBlYXRlZGx5CitnZW5lcmF0ZSBhbmQgdGVzdCBuZXcgJ21pZHBvaW50J3MgdW50aWwgdGhlIGNvbW1pdCBjaGFpbiBpcyBvZiBsZW5ndGgKK29uZS4KKworLS1iaXNlY3QtdmFyczo6CisKK1RoaXMgY2FsY3VsYXRlcyB0aGUgc2FtZSBhcyBgLS1iaXNlY3RgLCBidXQgb3V0cHV0cyB0ZXh0IHJlYWR5Cit0byBiZSBldmFsJ2VkIGJ5IHRoZSBzaGVsbC4gVGhlc2UgbGluZXMgd2lsbCBhc3NpZ24gdGhlIG5hbWUgb2YKK3RoZSBtaWRwb2ludCByZXZpc2lvbiB0byB0aGUgdmFyaWFibGUgYGJpc2VjdF9yZXZgLCBhbmQgdGhlCitleHBlY3RlZCBudW1iZXIgb2YgY29tbWl0cyB0byBiZSB0ZXN0ZWQgYWZ0ZXIgYGJpc2VjdF9yZXZgIGlzCit0ZXN0ZWQgdG8gYGJpc2VjdF9ucmAsIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgY29tbWl0cyB0byBiZQordGVzdGVkIGlmIGBiaXNlY3RfcmV2YCB0dXJucyBvdXQgdG8gYmUgZ29vZCB0byBgYmlzZWN0X2dvb2RgLAordGhlIGV4cGVjdGVkIG51bWJlciBvZiBjb21taXRzIHRvIGJlIHRlc3RlZCBpZiBgYmlzZWN0X3JldmAKK3R1cm5zIG91dCB0byBiZSBiYWQgdG8gYGJpc2VjdF9iYWRgLCBhbmQgdGhlIG51bWJlciBvZiBjb21taXRzCit3ZSBhcmUgYmlzZWN0aW5nIHJpZ2h0IG5vdyB0byBgYmlzZWN0X2FsbGAuCisKKy0tCisKK0NvbW1pdCBPcmRlcmluZworfn5+fn5+fn5+fn5+fn5+CisKK0J5IGRlZmF1bHQsIHRoZSBjb21taXRzIGFyZSBzaG93biBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKy0tdG9wby1vcmRlcjo6CisKKwlUaGlzIG9wdGlvbiBtYWtlcyB0aGVtIGFwcGVhciBpbiB0b3BvbG9naWNhbCBvcmRlciAoaS5lLgorCWRlc2NlbmRhbnQgY29tbWl0cyBhcmUgc2hvd24gYmVmb3JlIHRoZWlyIHBhcmVudHMpLgorCistLWRhdGUtb3JkZXI6OgorCisJVGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byAnLS10b3BvLW9yZGVyJyBpbiB0aGUgc2Vuc2UgdGhhdCBubworCXBhcmVudCBjb21lcyBiZWZvcmUgYWxsIG9mIGl0cyBjaGlsZHJlbiwgYnV0IG90aGVyd2lzZSB0aGluZ3MKKwlhcmUgc3RpbGwgb3JkZXJlZCBpbiB0aGUgY29tbWl0IHRpbWVzdGFtcCBvcmRlci4KKworLS1yZXZlcnNlOjoKKworCU91dHB1dCB0aGUgY29tbWl0cyBpbiByZXZlcnNlIG9yZGVyLgorCitPYmplY3QgVHJhdmVyc2FsCit+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXNlIG9wdGlvbnMgYXJlIG1vc3RseSB0YXJnZXRlZCBmb3IgcGFja2luZyBvZiBnaXQgcmVwb3NpdG9yaWVzLgorCistLW9iamVjdHM6OgorCisJUHJpbnQgdGhlIG9iamVjdCBJRHMgb2YgYW55IG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoZSBsaXN0ZWQKKwljb21taXRzLiAgJ2dpdC1yZXYtbGlzdCAtLW9iamVjdHMgZm9vIF5iYXInIHRodXMgbWVhbnMgInNlbmQgbWUKKwlhbGwgb2JqZWN0IElEcyB3aGljaCBJIG5lZWQgdG8gZG93bmxvYWQgaWYgSSBoYXZlIHRoZSBjb21taXQKKwlvYmplY3QgJ2JhcicsIGJ1dCBub3QgJ2ZvbyciLgorCistLW9iamVjdHMtZWRnZTo6CisKKwlTaW1pbGFyIHRvICctLW9iamVjdHMnLCBidXQgYWxzbyBwcmludCB0aGUgSURzIG9mIGV4Y2x1ZGVkCisJY29tbWl0cyBwcmVmaXhlZCB3aXRoIGEgIi0iIGNoYXJhY3Rlci4gIFRoaXMgaXMgdXNlZCBieQorCWdpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXSB0byBidWlsZCAidGhpbiIgcGFjaywgd2hpY2ggcmVjb3JkcworCW9iamVjdHMgaW4gZGVsdGlmaWVkIGZvcm0gYmFzZWQgb24gb2JqZWN0cyBjb250YWluZWQgaW4gdGhlc2UKKwlleGNsdWRlZCBjb21taXRzIHRvIHJlZHVjZSBuZXR3b3JrIHRyYWZmaWMuCisKKy0tdW5wYWNrZWQ6OgorCisJT25seSB1c2VmdWwgd2l0aCAnLS1vYmplY3RzJzsgcHJpbnQgdGhlIG9iamVjdCBJRHMgdGhhdCBhcmUgbm90CisJaW4gcGFja3MuCisKKworaW5jbHVkZTo6cHJldHR5LWZvcm1hdHMudHh0W10KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vLCBKb25hcyBGb25zZWNhCithbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtcGFyc2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LXBhcnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU3YWJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LXBhcnNlLnR4dApAQCAtMCwwICsxLDI4OSBAQAorZ2l0LXJldi1wYXJzZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmV2LXBhcnNlIC0gUGljayBvdXQgYW5kIG1hc3NhZ2UgcGFyYW1ldGVycworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXYtcGFyc2UnIFsgLS1vcHRpb24gXSA8YXJncz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK01hbnkgZ2l0IHBvcmNlbGFpbmlzaCBjb21tYW5kcyB0YWtlIG1peHR1cmUgb2YgZmxhZ3MKKyhpLmUuIHBhcmFtZXRlcnMgdGhhdCBiZWdpbiB3aXRoIGEgZGFzaCAnLScpIGFuZCBwYXJhbWV0ZXJzCittZWFudCBmb3IgdW5kZXJseWluZyBgZ2l0LXJldi1saXN0YCBjb21tYW5kIHRoZXkgdXNlIGludGVybmFsbHkKK2FuZCBmbGFncyBhbmQgcGFyYW1ldGVycyBmb3Igb3RoZXIgY29tbWFuZHMgdGhleSB1c2UgYXMgdGhlCitkb3duc3RyZWFtIG9mIGBnaXQtcmV2LWxpc3RgLiAgVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8KK2Rpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4KKworCitPUFRJT05TCistLS0tLS0tCistLXJldnMtb25seTo6CisJRG8gbm90IG91dHB1dCBmbGFncyBhbmQgcGFyYW1ldGVycyBub3QgbWVhbnQgZm9yCisJYGdpdC1yZXYtbGlzdGAgY29tbWFuZC4KKworLS1uby1yZXZzOjoKKwlEbyBub3Qgb3V0cHV0IGZsYWdzIGFuZCBwYXJhbWV0ZXJzIG1lYW50IGZvcgorCWBnaXQtcmV2LWxpc3RgIGNvbW1hbmQuCisKKy0tZmxhZ3M6OgorCURvIG5vdCBvdXRwdXQgbm9uLWZsYWcgcGFyYW1ldGVycy4KKworLS1uby1mbGFnczo6CisJRG8gbm90IG91dHB1dCBmbGFnIHBhcmFtZXRlcnMuCisKKy0tZGVmYXVsdCA8YXJnPjo6CisJSWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIGdpdmVuIGJ5IHRoZSB1c2VyLCB1c2UgYDxhcmc+YAorCWluc3RlYWQuCisKKy0tdmVyaWZ5OjoKKwlUaGUgcGFyYW1ldGVyIGdpdmVuIG11c3QgYmUgdXNhYmxlIGFzIGEgc2luZ2xlLCB2YWxpZAorCW9iamVjdCBuYW1lLiAgT3RoZXJ3aXNlIGJhcmYgYW5kIGFib3J0LgorCistLXNxOjoKKwlVc3VhbGx5IHRoZSBvdXRwdXQgaXMgbWFkZSBvbmUgbGluZSBwZXIgZmxhZyBhbmQKKwlwYXJhbWV0ZXIuICBUaGlzIG9wdGlvbiBtYWtlcyBvdXRwdXQgYSBzaW5nbGUgbGluZSwKKwlwcm9wZXJseSBxdW90ZWQgZm9yIGNvbnN1bXB0aW9uIGJ5IHNoZWxsLiAgVXNlZnVsIHdoZW4KKwl5b3UgZXhwZWN0IHlvdXIgcGFyYW1ldGVyIHRvIGNvbnRhaW4gd2hpdGVzcGFjZXMgYW5kCisJbmV3bGluZXMgKGUuZy4gd2hlbiB1c2luZyBwaWNrYXhlIGAtU2Agd2l0aAorCWBnaXQtZGlmZi1cKmApLgorCistLW5vdDo6CisJV2hlbiBzaG93aW5nIG9iamVjdCBuYW1lcywgcHJlZml4IHRoZW0gd2l0aCAne2NhcmV0fScgYW5kCisJc3RyaXAgJ3tjYXJldH0nIHByZWZpeCBmcm9tIHRoZSBvYmplY3QgbmFtZXMgdGhhdCBhbHJlYWR5IGhhdmUKKwlvbmUuCisKKy0tc3ltYm9saWM6OgorCVVzdWFsbHkgdGhlIG9iamVjdCBuYW1lcyBhcmUgb3V0cHV0IGluIFNIQTEgZm9ybSAod2l0aAorCXBvc3NpYmxlICd7Y2FyZXR9JyBwcmVmaXgpOyB0aGlzIG9wdGlvbiBtYWtlcyB0aGVtIG91dHB1dCBpbiBhCisJZm9ybSBhcyBjbG9zZSB0byB0aGUgb3JpZ2luYWwgaW5wdXQgYXMgcG9zc2libGUuCisKKworLS1hbGw6OgorCVNob3cgYWxsIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnNgLgorCistLWJyYW5jaGVzOjoKKwlTaG93IGJyYW5jaCByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzL2hlYWRzYC4KKworLS10YWdzOjoKKwlTaG93IHRhZyByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzL3RhZ3NgLgorCistLXJlbW90ZXM6OgorCVNob3cgdGFnIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnMvcmVtb3Rlc2AuCisKKy0tc2hvdy1wcmVmaXg6OgorCVdoZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZCBmcm9tIGEgc3ViZGlyZWN0b3J5LCBzaG93IHRoZQorCXBhdGggb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSB0b3AtbGV2ZWwKKwlkaXJlY3RvcnkuCisKKy0tc2hvdy1jZHVwOjoKKwlXaGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSwgc2hvdyB0aGUKKwlwYXRoIG9mIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CisJZGlyZWN0b3J5ICh0eXBpY2FsbHkgYSBzZXF1ZW5jZSBvZiAiLi4vIiwgb3IgYW4gZW1wdHkgc3RyaW5nKS4KKworLS1naXQtZGlyOjoKKwlTaG93IGAkR0lUX0RJUmAgaWYgZGVmaW5lZCBlbHNlIHNob3cgdGhlIHBhdGggdG8gdGhlIC5naXQgZGlyZWN0b3J5LgorCistLXNob3J0LCAtLXNob3J0PW51bWJlcjo6CisJSW5zdGVhZCBvZiBvdXRwdXR0aW5nIHRoZSBmdWxsIFNIQTEgdmFsdWVzIG9mIG9iamVjdCBuYW1lcyB0cnkgdG8KKwlhYmJyZXZpYXRlIHRoZW0gdG8gYSBzaG9ydGVyIHVuaXF1ZSBuYW1lLiBXaGVuIG5vIGxlbmd0aCBpcyBzcGVjaWZpZWQKKwk3IGlzIHVzZWQuIFRoZSBtaW5pbXVtIGxlbmd0aCBpcyA0LgorCistLXNpbmNlPWRhdGVzdHJpbmcsIC0tYWZ0ZXI9ZGF0ZXN0cmluZzo6CisJUGFyc2VzIHRoZSBkYXRlIHN0cmluZywgYW5kIG91dHB1dHMgY29ycmVzcG9uZGluZworCS0tbWF4LWFnZT0gcGFyYW1ldGVyIGZvciBnaXQtcmV2LWxpc3QgY29tbWFuZC4KKworLS11bnRpbD1kYXRlc3RyaW5nLCAtLWJlZm9yZT1kYXRlc3RyaW5nOjoKKwlQYXJzZXMgdGhlIGRhdGUgc3RyaW5nLCBhbmQgb3V0cHV0cyBjb3JyZXNwb25kaW5nCisJLS1taW4tYWdlPSBwYXJhbWV0ZXIgZm9yIGdpdC1yZXYtbGlzdCBjb21tYW5kLgorCis8YXJncz4uLi46OgorCUZsYWdzIGFuZCBwYXJhbWV0ZXJzIHRvIGJlIHBhcnNlZC4KKworCitTUEVDSUZZSU5HIFJFVklTSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXZpc2lvbiBwYXJhbWV0ZXIgdHlwaWNhbGx5LCBidXQgbm90IG5lY2Vzc2FyaWx5LCBuYW1lcyBhCitjb21taXQgb2JqZWN0LiAgVGhleSB1c2Ugd2hhdCBpcyBjYWxsZWQgYW4gJ2V4dGVuZGVkIFNIQTEnCitzeW50YXguICBIZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gc3BlbGwgb2JqZWN0IG5hbWVzLiAgVGhlCitvbmVzIGxpc3RlZCBuZWFyIHRoZSBlbmQgb2YgdGhpcyBsaXN0IGFyZSB0byBuYW1lIHRyZWVzIGFuZAorYmxvYnMgY29udGFpbmVkIGluIGEgY29tbWl0LgorCisqIFRoZSBmdWxsIFNIQTEgb2JqZWN0IG5hbWUgKDQwLWJ5dGUgaGV4YWRlY2ltYWwgc3RyaW5nKSwgb3IKKyAgYSBzdWJzdHJpbmcgb2Ygc3VjaCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuCisgIEUuZy4gZGFlODZlMTk1MGIxMjc3ZTU0NWNlZTE4MDU1MTc1MDAyOWNmZTczNSBhbmQgZGFlODZlIGJvdGgKKyAgbmFtZSB0aGUgc2FtZSBjb21taXQgb2JqZWN0IGlmIHRoZXJlIGFyZSBubyBvdGhlciBvYmplY3QgaW4KKyAgeW91ciByZXBvc2l0b3J5IHdob3NlIG9iamVjdCBuYW1lIHN0YXJ0cyB3aXRoIGRhZTg2ZS4KKworKiBBbiBvdXRwdXQgZnJvbSBgZ2l0LWRlc2NyaWJlYDsgaS5lLiBhIGNsb3Nlc3QgdGFnLCBmb2xsb3dlZCBieSBhCisgIGRhc2gsIGEgYGdgLCBhbmQgYW4gYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUuCisKKyogQSBzeW1ib2xpYyByZWYgbmFtZS4gIEUuZy4gJ21hc3RlcicgdHlwaWNhbGx5IG1lYW5zIHRoZSBjb21taXQKKyAgb2JqZWN0IHJlZmVyZW5jZWQgYnkgJEdJVF9ESVIvcmVmcy9oZWFkcy9tYXN0ZXIuICBJZiB5b3UKKyAgaGFwcGVuIHRvIGhhdmUgYm90aCBoZWFkcy9tYXN0ZXIgYW5kIHRhZ3MvbWFzdGVyLCB5b3UgY2FuCisgIGV4cGxpY2l0bHkgc2F5ICdoZWFkcy9tYXN0ZXInIHRvIHRlbGwgZ2l0IHdoaWNoIG9uZSB5b3UgbWVhbi4KKyAgV2hlbiBhbWJpZ3VvdXMsIGEgYDxuYW1lPmAgaXMgZGlzYW1iaWd1YXRlZCBieSB0YWtpbmcgdGhlCisgIGZpcnN0IG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisKKyAgLiBpZiBgJEdJVF9ESVIvPG5hbWU+YCBleGlzdHMsIHRoYXQgaXMgd2hhdCB5b3UgbWVhbiAodGhpcyBpcyB1c3VhbGx5CisgICAgdXNlZnVsIG9ubHkgZm9yIGBIRUFEYCwgYEZFVENIX0hFQURgIGFuZCBgTUVSR0VfSEVBRGApOworCisgIC4gb3RoZXJ3aXNlLCBgJEdJVF9ESVIvcmVmcy88bmFtZT5gIGlmIGV4aXN0czsKKworICAuIG90aGVyd2lzZSwgYCRHSVRfRElSL3JlZnMvdGFncy88bmFtZT5gIGlmIGV4aXN0czsKKworICAuIG90aGVyd2lzZSwgYCRHSVRfRElSL3JlZnMvaGVhZHMvPG5hbWU+YCBpZiBleGlzdHM7CisKKyAgLiBvdGhlcndpc2UsIGAkR0lUX0RJUi9yZWZzL3JlbW90ZXMvPG5hbWU+YCBpZiBleGlzdHM7CisKKyAgLiBvdGhlcndpc2UsIGAkR0lUX0RJUi9yZWZzL3JlbW90ZXMvPG5hbWU+L0hFQURgIGlmIGV4aXN0cy4KKworKiBBIHJlZiBmb2xsb3dlZCBieSB0aGUgc3VmZml4ICdAJyB3aXRoIGEgZGF0ZSBzcGVjaWZpY2F0aW9uCisgIGVuY2xvc2VkIGluIGEgYnJhY2UKKyAgcGFpciAoZS5nLiAnXHt5ZXN0ZXJkYXlcfScsICdcezEgbW9udGggMiB3ZWVrcyAzIGRheXMgMSBob3VyIDEKKyAgc2Vjb25kIGFnb1x9JyBvciAnXHsxOTc5LTAyLTI2IDE4OjMwOjAwXH0nKSB0byBzcGVjaWZ5IHRoZSB2YWx1ZQorICBvZiB0aGUgcmVmIGF0IGEgcHJpb3IgcG9pbnQgaW4gdGltZS4gIFRoaXMgc3VmZml4IG1heSBvbmx5IGJlCisgIHVzZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgcmVmIG5hbWUgYW5kIHRoZSByZWYgbXVzdCBoYXZlIGFuCisgIGV4aXN0aW5nIGxvZyAoJEdJVF9ESVIvbG9ncy88cmVmPikuCisKKyogQSByZWYgZm9sbG93ZWQgYnkgdGhlIHN1ZmZpeCAnQCcgd2l0aCBhbiBvcmRpbmFsIHNwZWNpZmljYXRpb24KKyAgZW5jbG9zZWQgaW4gYSBicmFjZSBwYWlyIChlLmcuICdcezFcfScsICdcezE1XH0nKSB0byBzcGVjaWZ5CisgIHRoZSBuLXRoIHByaW9yIHZhbHVlIG9mIHRoYXQgcmVmLiAgRm9yIGV4YW1wbGUgJ21hc3RlckBcezFcfScKKyAgaXMgdGhlIGltbWVkaWF0ZSBwcmlvciB2YWx1ZSBvZiAnbWFzdGVyJyB3aGlsZSAnbWFzdGVyQFx7NVx9JworICBpcyB0aGUgNXRoIHByaW9yIHZhbHVlIG9mICdtYXN0ZXInLiBUaGlzIHN1ZmZpeCBtYXkgb25seSBiZSB1c2VkCisgIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIHJlZiBuYW1lIGFuZCB0aGUgcmVmIG11c3QgaGF2ZSBhbiBleGlzdGluZworICBsb2cgKCRHSVRfRElSL2xvZ3MvPHJlZj4pLgorCisqIFlvdSBjYW4gdXNlIHRoZSAnQCcgY29uc3RydWN0IHdpdGggYW4gZW1wdHkgcmVmIHBhcnQgdG8gZ2V0IGF0IGEKKyAgcmVmbG9nIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgb24gdGhlCisgIGJyYW5jaCAnYmxhYmxhJywgdGhlbiAnQFx7MVx9JyBtZWFucyB0aGUgc2FtZSBhcyAnYmxhYmxhQFx7MVx9Jy4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgdG8gYSByZXZpc2lvbiBwYXJhbWV0ZXIgbWVhbnMgdGhlIGZpcnN0IHBhcmVudCBvZgorICB0aGF0IGNvbW1pdCBvYmplY3QuICAne2NhcmV0fTxuPicgbWVhbnMgdGhlIDxuPnRoIHBhcmVudCAoaS5lLgorICAncmV2e2NhcmV0fScKKyAgaXMgZXF1aXZhbGVudCB0byAncmV2e2NhcmV0fTEnKS4gIEFzIGEgc3BlY2lhbCBydWxlLAorICAncmV2e2NhcmV0fTAnIG1lYW5zIHRoZSBjb21taXQgaXRzZWxmIGFuZCBpcyB1c2VkIHdoZW4gJ3JldicgaXMgdGhlCisgIG9iamVjdCBuYW1lIG9mIGEgdGFnIG9iamVjdCB0aGF0IHJlZmVycyB0byBhIGNvbW1pdCBvYmplY3QuCisKKyogQSBzdWZmaXggJ3t0aWxkZX08bj4nIHRvIGEgcmV2aXNpb24gcGFyYW1ldGVyIG1lYW5zIHRoZSBjb21taXQKKyAgb2JqZWN0IHRoYXQgaXMgdGhlIDxuPnRoIGdlbmVyYXRpb24gZ3JhbmQtcGFyZW50IG9mIHRoZSBuYW1lZAorICBjb21taXQgb2JqZWN0LCBmb2xsb3dpbmcgb25seSB0aGUgZmlyc3QgcGFyZW50LiAgSS5lLiByZXZ+MyBpcworICBlcXVpdmFsZW50IHRvIHJldntjYXJldH17Y2FyZXR9e2NhcmV0fSB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgIHJldntjYXJldH0xe2NhcmV0fTF7Y2FyZXR9MS4gIFNlZSBiZWxvdyBmb3IgYSBpbGx1c3RyYXRpb24gb2YKKyAgdGhlIHVzYWdlIG9mIHRoaXMgZm9ybS4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgZm9sbG93ZWQgYnkgYW4gb2JqZWN0IHR5cGUgbmFtZSBlbmNsb3NlZCBpbgorICBicmFjZSBwYWlyIChlLmcuIGB2MC45OS44e2NhcmV0fVx7Y29tbWl0XH1gKSBtZWFucyB0aGUgb2JqZWN0CisgIGNvdWxkIGJlIGEgdGFnLCBhbmQgZGVyZWZlcmVuY2UgdGhlIHRhZyByZWN1cnNpdmVseSB1bnRpbCBhbgorICBvYmplY3Qgb2YgdGhhdCB0eXBlIGlzIGZvdW5kIG9yIHRoZSBvYmplY3QgY2Fubm90IGJlCisgIGRlcmVmZXJlbmNlZCBhbnltb3JlIChpbiB3aGljaCBjYXNlLCBiYXJmKS4gIGByZXZ7Y2FyZXR9MGAKKyAgaW50cm9kdWNlZCBlYXJsaWVyIGlzIGEgc2hvcnQtaGFuZCBmb3IgYHJldntjYXJldH1ce2NvbW1pdFx9YC4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgZm9sbG93ZWQgYnkgYW4gZW1wdHkgYnJhY2UgcGFpcgorICAoZS5nLiBgdjAuOTkuOHtjYXJldH1ce1x9YCkgbWVhbnMgdGhlIG9iamVjdCBjb3VsZCBiZSBhIHRhZywKKyAgYW5kIGRlcmVmZXJlbmNlIHRoZSB0YWcgcmVjdXJzaXZlbHkgdW50aWwgYSBub24tdGFnIG9iamVjdCBpcworICBmb3VuZC4KKworKiBBIGNvbG9uLCBmb2xsb3dlZCBieSBhIHNsYXNoLCBmb2xsb3dlZCBieSBhIHRleHQ6IHRoaXMgbmFtZXMKKyAgYSBjb21taXQgd2hvc2UgY29tbWl0IG1lc3NhZ2Ugc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgorICBUaGlzIG5hbWUgcmV0dXJucyB0aGUgeW91bmdlc3QgbWF0Y2hpbmcgY29tbWl0IHdoaWNoIGlzCisgIHJlYWNoYWJsZSBmcm9tIGFueSByZWYuICBJZiB0aGUgY29tbWl0IG1lc3NhZ2Ugc3RhcnRzIHdpdGggYQorICAnIScsIHlvdSBoYXZlIHRvIHJlcGVhdCB0aGF0OyAgdGhlIHNwZWNpYWwgc2VxdWVuY2UgJzovIScsCisgIGZvbGxvd2VkIGJ5IHNvbWV0aGluZyBlbHNlIHRoYW4gJyEnIGlzIHJlc2VydmVkIGZvciBub3cuCisKKyogQSBzdWZmaXggJzonIGZvbGxvd2VkIGJ5IGEgcGF0aDsgdGhpcyBuYW1lcyB0aGUgYmxvYiBvciB0cmVlCisgIGF0IHRoZSBnaXZlbiBwYXRoIGluIHRoZSB0cmVlLWlzaCBvYmplY3QgbmFtZWQgYnkgdGhlIHBhcnQKKyAgYmVmb3JlIHRoZSBjb2xvbi4KKworKiBBIGNvbG9uLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgc3RhZ2UgbnVtYmVyICgwIHRvIDMpIGFuZCBhCisgIGNvbG9uLCBmb2xsb3dlZCBieSBhIHBhdGg7IHRoaXMgbmFtZXMgYSBibG9iIG9iamVjdCBpbiB0aGUKKyAgaW5kZXggYXQgdGhlIGdpdmVuIHBhdGguICBNaXNzaW5nIHN0YWdlIG51bWJlciAoYW5kIHRoZSBjb2xvbgorICB0aGF0IGZvbGxvd3MgaXQpIG5hbWVzIGFuIHN0YWdlIDAgZW50cnkuCisKK0hlcmUgaXMgYW4gaWxsdXN0cmF0aW9uLCBieSBKb24gTG9lbGlnZXIuICBCb3RoIG5vZGUgQiBhbmQgQyBhcmUKK2EgY29tbWl0IHBhcmVudHMgb2YgY29tbWl0IG5vZGUgQS4gIFBhcmVudCBjb21taXRzIGFyZSBvcmRlcmVkCitsZWZ0LXRvLXJpZ2h0LgorCisgICAgRyAgIEggICBJICAgSgorICAgICBcIC8gICAgIFwgLworICAgICAgRCAgIEUgICBGCisgICAgICAgXCAgfCAgLyBcCisgICAgICAgIFwgfCAvICAgfAorICAgICAgICAgXHwvICAgIHwKKyAgICAgICAgICBCICAgICBDCisgICAgICAgICAgIFwgICAvCisgICAgICAgICAgICBcIC8KKyAgICAgICAgICAgICBBCisKKyAgICBBID0gICAgICA9IEFeMAorICAgIEIgPSBBXiAgID0gQV4xICAgICA9IEF+MQorICAgIEMgPSBBXjIgID0gQV4yCisgICAgRCA9IEFeXiAgPSBBXjFeMSAgID0gQX4yCisgICAgRSA9IEJeMiAgPSBBXl4yCisgICAgRiA9IEJeMyAgPSBBXl4zCisgICAgRyA9IEFeXl4gPSBBXjFeMV4xID0gQX4zCisgICAgSCA9IEReMiAgPSBCXl4yICAgID0gQV5eXjIgID0gQX4yXjIKKyAgICBJID0gRl4gICA9IEJeM14gICAgPSBBXl4zXgorICAgIEogPSBGXjIgID0gQl4zXjIgICA9IEFeXjNeMgorCisKK1NQRUNJRllJTkcgUkFOR0VTCistLS0tLS0tLS0tLS0tLS0tLQorCitIaXN0b3J5IHRyYXZlcnNpbmcgY29tbWFuZHMgc3VjaCBhcyBgZ2l0LWxvZ2Agb3BlcmF0ZSBvbiBhIHNldAorb2YgY29tbWl0cywgbm90IGp1c3QgYSBzaW5nbGUgY29tbWl0LiAgVG8gdGhlc2UgY29tbWFuZHMsCitzcGVjaWZ5aW5nIGEgc2luZ2xlIHJldmlzaW9uIHdpdGggdGhlIG5vdGF0aW9uIGRlc2NyaWJlZCBpbiB0aGUKK3ByZXZpb3VzIHNlY3Rpb24gbWVhbnMgdGhlIHNldCBvZiBjb21taXRzIHJlYWNoYWJsZSBmcm9tIHRoYXQKK2NvbW1pdCwgZm9sbG93aW5nIHRoZSBjb21taXQgYW5jZXN0cnkgY2hhaW4uCisKK1RvIGV4Y2x1ZGUgY29tbWl0cyByZWFjaGFibGUgZnJvbSBhIGNvbW1pdCwgYSBwcmVmaXggYHtjYXJldH1gCitub3RhdGlvbiBpcyB1c2VkLiAgRS5nLiAiYHtjYXJldH1yMSByMmAiIG1lYW5zIGNvbW1pdHMgcmVhY2hhYmxlCitmcm9tIGByMmAgYnV0IGV4Y2x1ZGUgdGhlIG9uZXMgcmVhY2hhYmxlIGZyb20gYHIxYC4KKworVGhpcyBzZXQgb3BlcmF0aW9uIGFwcGVhcnMgc28gb2Z0ZW4gdGhhdCB0aGVyZSBpcyBhIHNob3J0aGFuZAorZm9yIGl0LiAgImByMS4ucjJgIiBpcyBlcXVpdmFsZW50IHRvICJge2NhcmV0fXIxIHIyYCIuICBJdCBpcwordGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgKHN1YnRyYWN0IHRoZSBzZXQgb2YgY29tbWl0cworcmVhY2hhYmxlIGZyb20gYHIxYCBmcm9tIHRoZSBzZXQgb2YgY29tbWl0cyByZWFjaGFibGUgZnJvbQorYHIyYCkuCisKK0Egc2ltaWxhciBub3RhdGlvbiAiYHIxXC4uLnIyYCIgaXMgY2FsbGVkIHN5bW1ldHJpYyBkaWZmZXJlbmNlCitvZiBgcjFgIGFuZCBgcjJgIGFuZCBpcyBkZWZpbmVkIGFzCisiYHIxIHIyIC0tbm90ICQoZ2l0LW1lcmdlLWJhc2UgLS1hbGwgcjEgcjIpYCIuCitJdCBpcyB0aGUgc2V0IG9mIGNvbW1pdHMgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gZWl0aGVyIG9uZSBvZgorYHIxYCBvciBgcjJgIGJ1dCBub3QgZnJvbSBib3RoLgorCitUd28gb3RoZXIgc2hvcnRoYW5kcyBmb3IgbmFtaW5nIGEgc2V0IHRoYXQgaXMgZm9ybWVkIGJ5IGEgY29tbWl0CithbmQgaXRzIHBhcmVudCBjb21taXRzIGV4aXN0cy4gIGByMXtjYXJldH1AYCBub3RhdGlvbiBtZWFucyBhbGwKK3BhcmVudHMgb2YgYHIxYC4gIGByMXtjYXJldH0hYCBpbmNsdWRlcyBjb21taXQgYHIxYCBidXQgZXhjbHVkZXMKK2l0cyBhbGwgcGFyZW50cy4KKworSGVyZSBhcmUgYSBoYW5kZnVsIGV4YW1wbGVzOgorCisgICBEICAgICAgICAgICAgICAgIEcgSCBECisgICBEIEYgICAgICAgICAgICAgIEcgSCBJIEogRCBGCisgICBeRyBEICAgICAgICAgICAgIEggRAorICAgXkQgQiAgICAgICAgICAgICBFIEkgSiBGIEIKKyAgIEIuLi5DICAgICAgICAgICAgRyBIIEQgRSBCIEMKKyAgIF5EIEIgQyAgICAgICAgICAgRSBJIEogRiBCIEMKKyAgIENeQCAgICAgICAgICAgICAgSSBKIEYKKyAgIEZeISBEICAgICAgICAgICAgRyBIIEQgRgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldmVydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXZlcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODFiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXZlcnQudHh0CkBAIC0wLDAgKzEsNTkgQEAKK2dpdC1yZXZlcnQoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJldmVydCAtIFJldmVydCBhbiBleGlzdGluZyBjb21taXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJldmVydCcgWy0tZWRpdCB8IC0tbm8tZWRpdF0gWy1uXSA8Y29tbWl0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0dpdmVuIG9uZSBleGlzdGluZyBjb21taXQsIHJldmVydCB0aGUgY2hhbmdlIHRoZSBwYXRjaCBpbnRyb2R1Y2VzLCBhbmQgcmVjb3JkIGEKK25ldyBjb21taXQgdGhhdCByZWNvcmRzIGl0LiAgVGhpcyByZXF1aXJlcyB5b3VyIHdvcmtpbmcgdHJlZSB0byBiZSBjbGVhbiAobm8KK21vZGlmaWNhdGlvbnMgZnJvbSB0aGUgSEVBRCBjb21taXQpLgorCitPUFRJT05TCistLS0tLS0tCis8Y29tbWl0Pjo6CisJQ29tbWl0IHRvIHJldmVydC4KKwlGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCBjb21taXQgbmFtZXMsIHNlZQorCSJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBpbiBnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0uCisKKy1lfC0tZWRpdDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgYGdpdC1yZXZlcnRgIHdpbGwgbGV0IHlvdSBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlIHByaW9yIGNvbW1pdHRpbmcgdGhlIHJldmVydC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpZgorCXlvdSBydW4gdGhlIGNvbW1hbmQgZnJvbSBhIHRlcm1pbmFsLgorCistLW5vLWVkaXQ6OgorCVdpdGggdGhpcyBvcHRpb24sIGBnaXQtcmV2ZXJ0YCB3aWxsIG5vdCBzdGFydCB0aGUgY29tbWl0CisJbWVzc2FnZSBlZGl0b3IuCisKKy1ufC0tbm8tY29tbWl0OjoKKwlVc3VhbGx5IHRoZSBjb21tYW5kIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGNvbW1pdCB3aXRoCisJYSBjb21taXQgbG9nIG1lc3NhZ2Ugc3RhdGluZyB3aGljaCBjb21taXQgd2FzIHJldmVydGVkLgorCVRoaXMgZmxhZyBhcHBsaWVzIHRoZSBjaGFuZ2UgbmVjZXNzYXJ5IHRvIHJldmVydCB0aGUKKwluYW1lZCBjb21taXQgdG8geW91ciB3b3JraW5nIHRyZWUsIGJ1dCBkb2VzIG5vdCBtYWtlIHRoZQorCWNvbW1pdC4gIEluIGFkZGl0aW9uLCB3aGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHlvdXIKKwl3b3JraW5nIHRyZWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaCB0aGUgSEVBRCBjb21taXQuCisJVGhlIHJldmVydCBpcyBkb25lIGFnYWluc3QgdGhlIGJlZ2lubmluZyBzdGF0ZSBvZiB5b3VyCisJd29ya2luZyB0cmVlLgorKworVGhpcyBpcyB1c2VmdWwgd2hlbiByZXZlcnRpbmcgbW9yZSB0aGFuIG9uZSBjb21taXRzJworZWZmZWN0IHRvIHlvdXIgd29ya2luZyB0cmVlIGluIGEgcm93LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ybS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ybS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZjI0YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJtLnR4dApAQCAtMCwwICsxLDk4IEBACitnaXQtcm0oMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcm0gLSBSZW1vdmUgZmlsZXMgZnJvbSB0aGUgd29ya2luZyB0cmVlIGFuZCBmcm9tIHRoZSBpbmRleAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcm0nIFstZl0gWy1uXSBbLXJdIFstLWNhY2hlZF0gWy0taWdub3JlLXVubWF0Y2hdIFstLXF1aWV0XSBbLS1dIDxmaWxlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYW5kIGZyb20gdGhlIGluZGV4LiAgVGhlCitmaWxlcyBoYXZlIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgdGlwIG9mIHRoZSBicmFuY2gsIGFuZCBubwordXBkYXRlcyB0byBpdHMgY29udGVudHMgbXVzdCBoYXZlIGJlZW4gcGxhY2VkIGluIHRoZSBzdGFnaW5nCithcmVhIChha2EgaW5kZXgpLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxmaWxlPi4uLjo6CisJRmlsZXMgdG8gcmVtb3ZlLiAgRmlsZWdsb2JzIChlLmcuIGAqLmNgKSBjYW4gYmUgZ2l2ZW4gdG8KKwlyZW1vdmUgYWxsIG1hdGNoaW5nIGZpbGVzLiAgQWxzbyBhIGxlYWRpbmcgZGlyZWN0b3J5IG5hbWUKKwkoZS5nLiBgZGlyYCB0byBhZGQgYGRpci9maWxlMWAgYW5kIGBkaXIvZmlsZTJgKSBjYW4gYmUKKwlnaXZlbiB0byByZW1vdmUgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnksIHJlY3Vyc2l2ZWx5LAorCWJ1dCB0aGlzIHJlcXVpcmVzIGAtcmAgb3B0aW9uIHRvIGJlIGdpdmVuIGZvciBzYWZldHkuCisKKy1mOjoKKwlPdmVycmlkZSB0aGUgdXAtdG8tZGF0ZSBjaGVjay4KKworLW46OgorICAgICAgICBEb24ndCBhY3R1YWxseSByZW1vdmUgdGhlIGZpbGUocyksIGp1c3Qgc2hvdyBpZiB0aGV5IGV4aXN0IGluCisgICAgICAgIHRoZSBpbmRleC4KKworLXI6OgorICAgICAgICBBbGxvdyByZWN1cnNpdmUgcmVtb3ZhbCB3aGVuIGEgbGVhZGluZyBkaXJlY3RvcnkgbmFtZSBpcworICAgICAgICBnaXZlbi4KKworXC0tOjoKKwlUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmcm9tCisJdGhlIGxpc3Qgb2YgZmlsZXMsICh1c2VmdWwgd2hlbiBmaWxlbmFtZXMgbWlnaHQgYmUgbWlzdGFrZW4KKwlmb3IgY29tbWFuZC1saW5lIG9wdGlvbnMpLgorCitcLS1jYWNoZWQ6OgorCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHRlbGwgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlCisJdGhlIHBhdGhzIG9ubHkgZnJvbSB0aGUgaW5kZXgsIGxlYXZpbmcgd29ya2luZyB0cmVlCisJZmlsZXMuCisKK1wtLWlnbm9yZS11bm1hdGNoOjoKKwlFeGl0IHdpdGggYSB6ZXJvIHN0YXR1cyBldmVuIGlmIG5vIGZpbGVzIG1hdGNoZWQuCisKK1wtLXF1aWV0OjoKKwlnaXQtcm0gbm9ybWFsbHkgb3V0cHV0cyBvbmUgbGluZSAoaW4gdGhlIGZvcm0gb2YgYW4gInJtIiBjb21tYW5kKQorCWZvciBlYWNoIGZpbGUgcmVtb3ZlZC4gVGhpcyBvcHRpb24gc3VwcHJlc3NlcyB0aGF0IG91dHB1dC4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1RoZSBsaXN0IG9mIDxmaWxlPiBnaXZlbiB0byB0aGUgY29tbWFuZCBjYW4gYmUgZXhhY3QgcGF0aG5hbWVzLAorZmlsZSBnbG9iIHBhdHRlcm5zLCBvciBsZWFkaW5nIGRpcmVjdG9yeSBuYW1lLiAgVGhlIGNvbW1hbmQKK3JlbW92ZXMgb25seSB0aGUgcGF0aHMgdGhhdCBpcyBrbm93biB0byBnaXQuICBHaXZpbmcgdGhlIG5hbWUgb2YKK2EgZmlsZSB0aGF0IHlvdSBoYXZlIG5vdCB0b2xkIGdpdCBhYm91dCBkb2VzIG5vdCByZW1vdmUgdGhhdCBmaWxlLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorZ2l0LXJtIERvY3VtZW50YXRpb24vXFwqLnR4dDo6CisJUmVtb3ZlcyBhbGwgYFwqLnR4dGAgZmlsZXMgZnJvbSB0aGUgaW5kZXggdGhhdCBhcmUgdW5kZXIgdGhlCisJYERvY3VtZW50YXRpb25gIGRpcmVjdG9yeSBhbmQgYW55IG9mIGl0cyBzdWJkaXJlY3Rvcmllcy4KKysKK05vdGUgdGhhdCB0aGUgYXN0ZXJpc2sgYFwqYCBpcyBxdW90ZWQgZnJvbSB0aGUgc2hlbGwgaW4gdGhpcworZXhhbXBsZTsgdGhpcyBsZXRzIHRoZSBjb21tYW5kIGluY2x1ZGUgdGhlIGZpbGVzIGZyb20KK3N1YmRpcmVjdG9yaWVzIG9mIGBEb2N1bWVudGF0aW9uL2AgZGlyZWN0b3J5LgorCitnaXQtcm0gLWYgZ2l0LSouc2g6OgorCVJlbW92ZSBhbGwgZ2l0LSouc2ggc2NyaXB0cyB0aGF0IGFyZSBpbiB0aGUgaW5kZXguCisJQmVjYXVzZSB0aGlzIGV4YW1wbGUgbGV0cyB0aGUgc2hlbGwgZXhwYW5kIHRoZSBhc3RlcmlzaworCShpLmUuIHlvdSBhcmUgbGlzdGluZyB0aGUgZmlsZXMgZXhwbGljaXRseSksIGl0CisJZG9lcyBub3QgcmVtb3ZlIGBzdWJkaXIvZ2l0LWZvby5zaGAuCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtYWRkWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ydW5zdGF0dXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcnVuc3RhdHVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI1MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcnVuc3RhdHVzLnR4dApAQCAtMCwwICsxLDY5IEBACitnaXQtcnVuc3RhdHVzKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ydW5zdGF0dXMgLSBBIGhlbHBlciBmb3IgZ2l0LXN0YXR1cyBhbmQgZ2l0LWNvbW1pdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ydW5zdGF0dXMnIFstLWNvbG9yfC0tbm9jb2xvcl0gWy0tYW1lbmRdIFstLXZlcmJvc2VdIFstLXVudHJhY2tlZF0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0V4YW1pbmVzIHBhdGhzIGluIHRoZSB3b3JraW5nIHRyZWUgdGhhdCBoYXMgY2hhbmdlcyB1bnJlY29yZGVkCit0byB0aGUgaW5kZXggZmlsZSwgYW5kIGNoYW5nZXMgYmV0d2VlbiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlCitjdXJyZW50IEhFQUQgY29tbWl0LiAgVGhlIGZvcm1lciBwYXRocyBhcmUgd2hhdCB5b3UgX2NvdWxkXworY29tbWl0IGJ5IHJ1bm5pbmcgJ2dpdCBhZGQnIChvciAnZ2l0IHJtJyBpZiB5b3UgYXJlIGRlbGV0aW5nKSBiZWZvcmUgcnVubmluZyAnZ2l0Citjb21taXQnLCBhbmQgdGhlIGxhdHRlciBwYXRocyBhcmUgd2hhdCB5b3UgX3dvdWxkXyBjb21taXQgYnkKK3J1bm5pbmcgJ2dpdCBjb21taXQnLgorCitJZiB0aGVyZSBpcyBubyBwYXRoIHRoYXQgaXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIGluZGV4IGZpbGUgYW5kCit0aGUgY3VycmVudCBIRUFEIGNvbW1pdCwgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBub24temVybyBzdGF0dXMuCisKK05vdGUgdGhhdCB0aGlzIGlzIF9ub3RfIHRoZSB1c2VyIGxldmVsIGNvbW1hbmQgeW91IHdvdWxkIHdhbnQgdG8KK3J1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBVc2UgJ2dpdC1zdGF0dXMnIGluc3RlYWQuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1jb2xvcjo6CisJU2hvdyBjb2xvcmVkIHN0YXR1cywgaGlnaGxpZ2h0aW5nIG1vZGlmaWVkIGZpbGUgbmFtZXMuCisKKy0tbm9jb2xvcjo6CisJVHVybiBvZmYgY29sb3JpbmcuCisKKy0tYW1lbmQ6OgorCVNob3cgc3RhdHVzIGJhc2VkIG9uIEhFQUReMSwgbm90IEhFQUQsIGkuZS4gc2hvdyB3aGF0CisJJ2dpdC1jb21taXQgLS1hbWVuZCcgd291bGQgZG8uCisKKy0tdmVyYm9zZTo6CisJU2hvdyB1bmlmaWVkIGRpZmYgb2YgYWxsIGZpbGUgY2hhbmdlcy4KKworLS11bnRyYWNrZWQ6OgorCVNob3cgZmlsZXMgaW4gdW50cmFja2VkIGRpcmVjdG9yaWVzLCB0b28uICBXaXRob3V0IHRoaXMKKwlvcHRpb24gb25seSBpdHMgbmFtZSBhbmQgYSB0cmFpbGluZyBzbGFzaCBhcmUgZGlzcGxheWVkCisJZm9yIGVhY2ggdW50cmFja2VkIGRpcmVjdG9yeS4KKworCitPVVRQVVQKKy0tLS0tLQorVGhlIG91dHB1dCBmcm9tIHRoaXMgY29tbWFuZCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgY29tbWl0Cit0ZW1wbGF0ZSBjb21tZW50cywgYW5kIGFsbCB0aGUgb3V0cHV0IGxpbmVzIGFyZSBwcmVmaXhlZCB3aXRoICcjJy4KKworCitBdXRob3IKKy0tLS0tLQorT3JpZ2luYWxseSB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYXMgcGFydAorb2YgZ2l0LWNvbW1pdCwgYW5kIGxhdGVyIHJld3JpdHRlbiBpbiBDIGJ5IEplZmYgS2luZy4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtZW1haWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTM5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dApAQCAtMCwwICsxLDE0MCBAQAorZ2l0LXNlbmQtZW1haWwoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zZW5kLWVtYWlsIC0gU2VuZCBhIGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyBhcyBlbWFpbHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2VuZC1lbWFpbCcgW29wdGlvbnNdIDxmaWxlfGRpcmVjdG9yeT4gWy4uLiBmaWxlfGRpcmVjdG9yeV0KKworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIHBhdGNoZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgZW1haWxzIHRoZW0gb3V0LgorCitUaGUgaGVhZGVyIG9mIHRoZSBlbWFpbCBpcyBjb25maWd1cmFibGUgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICBJZiBub3QKK3NwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBSZWFkTGluZQorZW5hYmxlZCBpbnRlcmZhY2UgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCitUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOgorCistLWJjYzo6CisJU3BlY2lmeSBhICJCY2M6IiB2YWx1ZSBmb3IgZWFjaCBlbWFpbC4KKysKK1RoZSAtLWJjYyBvcHRpb24gbXVzdCBiZSByZXBlYXRlZCBmb3IgZWFjaCB1c2VyIHlvdSB3YW50IG9uIHRoZSBiY2MgbGlzdC4KKworLS1jYzo6CisJU3BlY2lmeSBhIHN0YXJ0aW5nICJDYzoiIHZhbHVlIGZvciBlYWNoIGVtYWlsLgorKworVGhlIC0tY2Mgb3B0aW9uIG11c3QgYmUgcmVwZWF0ZWQgZm9yIGVhY2ggdXNlciB5b3Ugd2FudCBvbiB0aGUgY2MgbGlzdC4KKworLS1jaGFpbi1yZXBseS10bywgLS1uby1jaGFpbi1yZXBseS10bzo6CisJSWYgdGhpcyBpcyBzZXQsIGVhY2ggZW1haWwgd2lsbCBiZSBzZW50IGFzIGEgcmVwbHkgdG8gdGhlIHByZXZpb3VzCisJZW1haWwgc2VudC4gIElmIGRpc2FibGVkIHdpdGggIi0tbm8tY2hhaW4tcmVwbHktdG8iLCBhbGwgZW1haWxzIGFmdGVyCisJdGhlIGZpcnN0IHdpbGwgYmUgc2VudCBhcyByZXBsaWVzIHRvIHRoZSBmaXJzdCBlbWFpbCBzZW50LiAgV2hlbiB1c2luZworCXRoaXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGZpcnN0IGZpbGUgZ2l2ZW4gYmUgYW4gb3ZlcnZpZXcgb2YgdGhlCisJZW50aXJlIHBhdGNoIHNlcmllcy4KKwlEZWZhdWx0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgJ3NlbmRlbWFpbC5jaGFpbnJlcGx5dG8nIGNvbmZpZ3VyYXRpb24KKwl2YWx1ZTsgaWYgdGhhdCBpcyB1bnNwZWNpZmllZCwgZGVmYXVsdCB0byAtLWNoYWluLXJlcGx5LXRvLgorCistLWNvbXBvc2U6OgorCVVzZSAkRURJVE9SIHRvIGVkaXQgYW4gaW50cm9kdWN0b3J5IG1lc3NhZ2UgZm9yIHRoZQorCXBhdGNoIHNlcmllcy4KKworLS1mcm9tOjoKKwlTcGVjaWZ5IHRoZSBzZW5kZXIgb2YgdGhlIGVtYWlscy4gIFRoaXMgd2lsbCBkZWZhdWx0IHRvCisJdGhlIHZhbHVlIEdJVF9DT01NSVRURVJfSURFTlQsIGFzIHJldHVybmVkIGJ5ICJnaXQtdmFyIC1sIi4KKwlUaGUgdXNlciB3aWxsIHN0aWxsIGJlIHByb21wdGVkIHRvIGNvbmZpcm0gdGhpcyBlbnRyeS4KKworLS1pbi1yZXBseS10bzo6CisJU3BlY2lmeSB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IEluLVJlcGx5LVRvIGhlYWRlci4KKwlTdWJzZXF1ZW50IGVtYWlscyB3aWxsIHJlZmVyIHRvIHRoZSBwcmV2aW91cyBlbWFpbAorCWluc3RlYWQgb2YgdGhpcyBpZiAtLWNoYWluLXJlcGx5LXRvIGlzIHNldCAodGhlIGRlZmF1bHQpCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1uby1zaWduZWQtb2ZmLWJ5LWNjOjoKKwlEbyBub3QgYWRkIGVtYWlscyBmb3VuZCBpbiBTaWduZWQtb2ZmLWJ5OiBvciBDYzogbGluZXMgdG8gdGhlCisJY2MgbGlzdC4KKworLS1xdWlldDo6CisJTWFrZSBnaXQtc2VuZC1lbWFpbCBsZXNzIHZlcmJvc2UuICBPbmUgbGluZSBwZXIgZW1haWwgc2hvdWxkIGJlCisJYWxsIHRoYXQgaXMgb3V0cHV0LgorCistLXNtdHAtc2VydmVyOjoKKwlJZiBzZXQsIHNwZWNpZmllcyB0aGUgb3V0Z29pbmcgU01UUCBzZXJ2ZXIgdG8gdXNlIChlLmcuCisJYHNtdHAuZXhhbXBsZS5jb21gIG9yIGEgcmF3IElQIGFkZHJlc3MpLiAgQWx0ZXJuYXRpdmVseSBpdCBjYW4KKwlzcGVjaWZ5IGEgZnVsbCBwYXRobmFtZSBvZiBhIHNlbmRtYWlsLWxpa2UgcHJvZ3JhbSBpbnN0ZWFkOworCXRoZSBwcm9ncmFtIG11c3Qgc3VwcG9ydCB0aGUgYC1pYCBvcHRpb24uICBEZWZhdWx0IHZhbHVlIGNhbgorCWJlIHNwZWNpZmllZCBieSB0aGUgJ3NlbmRlbWFpbC5zbXRwc2VydmVyJyBjb25maWd1cmF0aW9uCisJb3B0aW9uOyB0aGUgYnVpbHQtaW4gZGVmYXVsdCBpcyBgL3Vzci9zYmluL3NlbmRtYWlsYCBvcgorCWAvdXNyL2xpYi9zZW5kbWFpbGAgaWYgc3VjaCBwcm9ncmFtIGlzIGF2YWlsYWJsZSwgb3IKKwlgbG9jYWxob3N0YCBvdGhlcndpc2UuCisKKy0tc3ViamVjdDo6CisgICAJU3BlY2lmeSB0aGUgaW5pdGlhbCBzdWJqZWN0IG9mIHRoZSBlbWFpbCB0aHJlYWQuCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1zdXBwcmVzcy1mcm9tOjoKKwlEbyBub3QgYWRkIHRoZSBGcm9tOiBhZGRyZXNzIHRvIHRoZSBjYzogbGlzdCwgaWYgaXQgc2hvd3MgdXAgaW4gYSBGcm9tOgorCWxpbmUuCisKKy0tZHJ5LXJ1bjo6CisJRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0dWFsbHkgc2VuZCB0aGUgZW1haWxzLgorCistLWVudmVsb3BlLXNlbmRlcjo6CisJU3BlY2lmeSB0aGUgZW52ZWxvcGUgc2VuZGVyIHVzZWQgdG8gc2VuZCB0aGUgZW1haWxzLgorCVRoaXMgaXMgdXNlZnVsIGlmIHlvdXIgZGVmYXVsdCBhZGRyZXNzIGlzIG5vdCB0aGUgYWRkcmVzcyB0aGF0IGlzCisJc3Vic2NyaWJlZCB0byBhIGxpc3QuIElmIHlvdSB1c2UgdGhlIHNlbmRtYWlsIGJpbmFyeSwgeW91IG11c3QgaGF2ZQorCXN1aXRhYmxlIHByaXZpbGVnZXMgZm9yIHRoZSAtZiBwYXJhbWV0ZXIuCisKKy0tdG86OgorCVNwZWNpZnkgdGhlIHByaW1hcnkgcmVjaXBpZW50IG9mIHRoZSBlbWFpbHMgZ2VuZXJhdGVkLgorCUdlbmVyYWxseSwgdGhpcyB3aWxsIGJlIHRoZSB1cHN0cmVhbSBtYWludGFpbmVyIG9mIHRoZQorCXByb2plY3QgaW52b2x2ZWQuCisrCitUaGUgLS10byBvcHRpb24gbXVzdCBiZSByZXBlYXRlZCBmb3IgZWFjaCB1c2VyIHlvdSB3YW50IG9uIHRoZSB0byBsaXN0LgorCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KK3NlbmRlbWFpbC5hbGlhc2VzZmlsZTo6CisJVG8gYXZvaWQgdHlwaW5nIGxvbmcgZW1haWwgYWRkcmVzc2VzLCBwb2ludCB0aGlzIHRvIG9uZSBvciBtb3JlCisJZW1haWwgYWxpYXNlcyBmaWxlcy4gIFlvdSBtdXN0IGFsc28gc3VwcGx5ICdzZW5kZW1haWwuYWxpYXNmaWxldHlwZScuCisKK3NlbmRlbWFpbC5hbGlhc2ZpbGV0eXBlOjoKKwlGb3JtYXQgb2YgdGhlIGZpbGUocykgc3BlY2lmaWVkIGluIHNlbmRlbWFpbC5hbGlhc2VzZmlsZS4gTXVzdCBiZQorCW9uZSBvZiAnbXV0dCcsICdtYWlscmMnLCAncGluZScsIG9yICdnbnVzJy4KKworc2VuZGVtYWlsLmJjYzo6CisJRW1haWwgYWRkcmVzcyAob3IgYWxpYXMpIHRvIGFsd2F5cyBiY2MuCisKK3NlbmRlbWFpbC5jaGFpbnJlcGx5dG86OgorCUJvb2xlYW4gdmFsdWUgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCB0byB0aGUgJy0tY2hhaW5fcmVwbHlfdG8nCisJcGFyYW1ldGVyLgorCitzZW5kZW1haWwuc210cHNlcnZlcjo6CisJRGVmYXVsdCBzbXRwIHNlcnZlciB0byB1c2UuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK2dpdC1zZW5kLWVtYWlsIGlzIG9yaWdpbmFsbHkgYmFzZWQgdXBvbgorc2VuZF9sb3RzX29mX2VtYWlsLnBsIGJ5IEdyZWcgS3JvYWgtSGFydG1hbi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUnlhbiBBbmRlcnNvbgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1wYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1YmZkMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtcGFjay50eHQKQEAgLTAsMCArMSwxMjMgQEAKK2dpdC1zZW5kLXBhY2soMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNlbmQtcGFjayAtIFB1c2ggb2JqZWN0cyBvdmVyIGdpdCBwcm90b2NvbCB0byBhbm90aGVyIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2VuZC1wYWNrJyBbLS1hbGxdIFstLWZvcmNlXSBbLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+XSBbLS12ZXJib3NlXSBbLS10aGluXSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZj4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVXN1YWxseSB5b3Ugd291bGQgd2FudCB0byB1c2UgZ2l0bGluazpnaXQtcHVzaFsxXSB3aGljaCBpcyBhCitoaWdoZXIgbGV2ZWwgd3JhcHBlciBvZiB0aGlzIGNvbW1hbmQgaW5zdGVhZC4KKworSW52b2tlcyAnZ2l0LXJlY2VpdmUtcGFjaycgb24gYSBwb3NzaWJseSByZW1vdGUgcmVwb3NpdG9yeSwgYW5kCit1cGRhdGVzIGl0IGZyb20gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgc2VuZGluZyBuYW1lZCByZWZzLgorCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLXJlY2VpdmUtcGFjaz08Z2l0LXJlY2VpdmUtcGFjaz46OgorCVBhdGggdG8gdGhlICdnaXQtcmVjZWl2ZS1wYWNrJyBwcm9ncmFtIG9uIHRoZSByZW1vdGUKKwllbmQuICBTb21ldGltZXMgdXNlZnVsIHdoZW4gcHVzaGluZyB0byBhIHJlbW90ZQorCXJlcG9zaXRvcnkgb3ZlciBzc2gsIGFuZCB5b3UgZG8gbm90IGhhdmUgdGhlIHByb2dyYW0gaW4KKwlhIGRpcmVjdG9yeSBvbiB0aGUgZGVmYXVsdCAkUEFUSC4KKworXC0tZXhlYz08Z2l0LXJlY2VpdmUtcGFjaz46OgorCVNhbWUgYXMgXC0tcmVjZWl2ZS1wYWNrPTxnaXQtcmVjZWl2ZS1wYWNrPi4KKworXC0tYWxsOjoKKwlJbnN0ZWFkIG9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZyB3aGljaCByZWZzIHRvIHVwZGF0ZSwKKwl1cGRhdGUgYWxsIHJlZnMgdGhhdCBsb2NhbGx5IGV4aXN0LgorCitcLS1mb3JjZTo6CisJVXN1YWxseSwgdGhlIGNvbW1hbmQgcmVmdXNlcyB0byB1cGRhdGUgYSByZW1vdGUgcmVmIHRoYXQKKwlpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGxvY2FsIHJlZiB1c2VkIHRvIG92ZXJ3cml0ZSBpdC4KKwlUaGlzIGZsYWcgZGlzYWJsZXMgdGhlIGNoZWNrLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQKKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnkgY2FuIGxvc2UgY29tbWl0czsgdXNlIGl0IHdpdGgKKwljYXJlLgorCitcLS12ZXJib3NlOjoKKwlSdW4gdmVyYm9zZWx5LgorCitcLS10aGluOjoKKwlTcGVuZCBleHRyYSBjeWNsZXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIHNlbnQuCisJVXNlIGl0IG9uIHNsb3dlciBjb25uZWN0aW9uLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdG8gaG91c2UgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC1yZWNlaXZlLXBhY2snIGlzIGludm9rZWQgdmlhCisJc3NoLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gdXBkYXRlLgorCis8cmVmPi4uLjo6CisJVGhlIHJlbW90ZSByZWZzIHRvIHVwZGF0ZS4KKworCitTcGVjaWZ5aW5nIHRoZSBSZWZzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHNwZWNpZnkgd2hpY2ggcmVmcyB0byB1cGRhdGUgb24gdGhlCityZW1vdGUgZW5kLgorCitXaXRoICctLWFsbCcgZmxhZywgYWxsIHJlZnMgdGhhdCBleGlzdCBsb2NhbGx5IGFyZSB0cmFuc2ZlcnJlZCB0bwordGhlIHJlbW90ZSBzaWRlLiAgWW91IGNhbm5vdCBzcGVjaWZ5IGFueSAnPHJlZj4nIGlmIHlvdSB1c2UKK3RoaXMgZmxhZy4KKworV2l0aG91dCAnLS1hbGwnIGFuZCB3aXRob3V0IGFueSAnPHJlZj4nLCB0aGUgcmVmcyB0aGF0IGV4aXN0Citib3RoIG9uIHRoZSBsb2NhbCBzaWRlIGFuZCBvbiB0aGUgcmVtb3RlIHNpZGUgYXJlIHVwZGF0ZWQuCisKK1doZW4gb25lIG9yIG1vcmUgJzxyZWY+JyBhcmUgc3BlY2lmaWVkIGV4cGxpY2l0bHksIGl0IGNhbiBiZSBlaXRoZXIgYQorc2luZ2xlIHBhdHRlcm4sIG9yIGEgcGFpciBvZiBzdWNoIHBhdHRlcm4gc2VwYXJhdGVkIGJ5IGEgY29sb24KKyI6IiAodGhpcyBtZWFucyB0aGF0IGEgcmVmIG5hbWUgY2Fubm90IGhhdmUgYSBjb2xvbiBpbiBpdCkuICBBCitzaW5nbGUgcGF0dGVybiAnPG5hbWU+JyBpcyBqdXN0IGEgc2hvcnRoYW5kIGZvciAnPG5hbWU+OjxuYW1lPicuCisKK0VhY2ggcGF0dGVybiBwYWlyIGNvbnNpc3RzIG9mIHRoZSBzb3VyY2Ugc2lkZSAoYmVmb3JlIHRoZSBjb2xvbikKK2FuZCB0aGUgZGVzdGluYXRpb24gc2lkZSAoYWZ0ZXIgdGhlIGNvbG9uKS4gIFRoZSByZWYgdG8gYmUKK3B1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYSBtYXRjaCB0aGF0IG1hdGNoZXMgdGhlIHNvdXJjZQorc2lkZSwgYW5kIHdoZXJlIGl0IGlzIHB1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IHVzaW5nIHRoZQorZGVzdGluYXRpb24gc2lkZS4KKworIC0gSXQgaXMgYW4gZXJyb3IgaWYgPHNyYz4gZG9lcyBub3QgbWF0Y2ggZXhhY3RseSBvbmUgb2YgdGhlCisgICBsb2NhbCByZWZzLgorCisgLSBJdCBpcyBhbiBlcnJvciBpZiA8ZHN0PiBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgcmVtb3RlIHJlZnMuCisKKyAtIElmIDxkc3Q+IGRvZXMgbm90IG1hdGNoIGFueSByZW1vdGUgcmVmLCBlaXRoZXIKKworICAgKiBpdCBoYXMgdG8gc3RhcnQgd2l0aCAicmVmcy8iOyA8ZHN0PiBpcyB1c2VkIGFzIHRoZQorICAgICBkZXN0aW5hdGlvbiBsaXRlcmFsbHkgaW4gdGhpcyBjYXNlLgorCisgICAqIDxzcmM+ID09IDxkc3Q+IGFuZCB0aGUgcmVmIHRoYXQgbWF0Y2hlZCB0aGUgPHNyYz4gbXVzdCBub3QKKyAgICAgZXhpc3QgaW4gdGhlIHNldCBvZiByZW1vdGUgcmVmczsgdGhlIHJlZiBtYXRjaGVkIDxzcmM+CisgICAgIGxvY2FsbHkgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24uCisKK1dpdGhvdXQgJy0tZm9yY2UnLCB0aGUgPHNyYz4gcmVmIGlzIHN0b3JlZCBhdCB0aGUgcmVtb3RlIG9ubHkgaWYKKzxkc3Q+IGRvZXMgbm90IGV4aXN0LCBvciA8ZHN0PiBpcyBhIHByb3BlciBzdWJzZXQgKGkuZS4gYW4KK2FuY2VzdG9yKSBvZiA8c3JjPi4gIFRoaXMgY2hlY2ssIGtub3duIGFzICJmYXN0IGZvcndhcmQgY2hlY2siLAoraXMgcGVyZm9ybWVkIGluIG9yZGVyIHRvIGF2b2lkIGFjY2lkZW50YWxseSBvdmVyd3JpdGluZyB0aGUKK3JlbW90ZSByZWYgYW5kIGxvc2Ugb3RoZXIgcGVvcGxlcycgY29tbWl0cyBmcm9tIHRoZXJlLgorCitXaXRoICctLWZvcmNlJywgdGhlIGZhc3QgZm9yd2FyZCBjaGVjayBpcyBkaXNhYmxlZCBmb3IgYWxsIHJlZnMuCisKK09wdGlvbmFsbHksIGEgPHJlZj4gcGFyYW1ldGVyIGNhbiBiZSBwcmVmaXhlZCB3aXRoIGEgcGx1cyAnKycgc2lnbgordG8gZGlzYWJsZSB0aGUgZmFzdC1mb3J3YXJkIGNoZWNrIG9ubHkgb24gdGhhdCByZWYuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaC1zZXR1cC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaC1zZXR1cC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYWJlYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dApAQCAtMCwwICsxLDcyIEBACitnaXQtc2gtc2V0dXAoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2gtc2V0dXAgLSBDb21tb24gZ2l0IHNoZWxsIHNjcmlwdCBzZXR1cCBjb2RlCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaC1zZXR1cCcKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgaXMgbm90IGEgY29tbWFuZCB0aGUgZW5kIHVzZXIgd291bGQgd2FudCB0byBydW4uICBFdmVyLgorVGhpcyBkb2N1bWVudGF0aW9uIGlzIG1lYW50IGZvciBwZW9wbGUgd2hvIGFyZSBzdHVkeWluZyB0aGUKK1BvcmNlbGFpbi1pc2ggc2NyaXB0cyBhbmQvb3IgYXJlIHdyaXRpbmcgbmV3IG9uZXMuCisKK1RoZSBgZ2l0LXNoLXNldHVwYCBzY3JpcHRsZXQgaXMgZGVzaWduZWQgdG8gYmUgc291cmNlZCAodXNpbmcKK2AuYCkgYnkgb3RoZXIgc2hlbGwgc2NyaXB0cyB0byBzZXQgdXAgc29tZSB2YXJpYWJsZXMgcG9pbnRpbmcgYXQKK3RoZSBub3JtYWwgZ2l0IGRpcmVjdG9yaWVzIGFuZCBhIGZldyBoZWxwZXIgc2hlbGwgZnVuY3Rpb25zLgorCitCZWZvcmUgc291cmNpbmcgaXQsIHlvdXIgc2NyaXB0IHNob3VsZCBzZXQgdXAgYSBmZXcgdmFyaWFibGVzOworYFVTQUdFYCAoYW5kIGBMT05HX1VTQUdFYCwgaWYgYW55KSBpcyB1c2VkIHRvIGRlZmluZSBtZXNzYWdlCitnaXZlbiBieSBgdXNhZ2UoKWAgc2hlbGwgZnVuY3Rpb24uICBgU1VCRElSRUNUT1JZX09LYCBjYW4gYmUgc2V0CitpZiB0aGUgc2NyaXB0IGNhbiBydW4gZnJvbSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgd29ya2luZyB0cmVlCisoc29tZSBjb21tYW5kcyBkbyBub3QpLgorCitUaGUgc2NyaXB0bGV0IHNldHMgYEdJVF9ESVJgIGFuZCBgR0lUX09CSkVDVF9ESVJFQ1RPUllgIHNoZWxsCit2YXJpYWJsZXMsIGJ1dCBkb2VzICpub3QqIGV4cG9ydCB0aGVtIHRvIHRoZSBlbnZpcm9ubWVudC4KKworRlVOQ1RJT05TCistLS0tLS0tLS0KKworZGllOjoKKwlleGl0IGFmdGVyIGVtaXR0aW5nIHRoZSBzdXBwbGllZCBlcnJvciBtZXNzYWdlIHRvIHRoZQorCXN0YW5kYXJkIGVycm9yIHN0cmVhbS4KKwordXNhZ2U6OgorCWRpZSB3aXRoIHRoZSB1c2FnZSBtZXNzYWdlLgorCitzZXRfcmVmbG9nX2FjdGlvbjo6CisJc2V0IHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSByZWNvcmRlZCB0byBkZXNjcmliZSB0aGUKKwllbmQtdXNlciBhY3Rpb24gaW4gdGhlIHJlZmxvZywgd2hlbiB0aGUgc2NyaXB0IHVwZGF0ZXMgYQorCXJlZi4KKworaXNfYmFyZV9yZXBvc2l0b3J5OjoKKwlvdXRwdXRzIGB0cnVlYCBvciBgZmFsc2VgIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtCisJdG8gaW5kaWNhdGUgaWYgdGhlIHJlcG9zaXRvcnkgaXMgYSBiYXJlIHJlcG9zaXRvcnkKKwkoaS5lLiB3aXRob3V0IGFuIGFzc29jaWF0ZWQgd29ya2luZyB0cmVlKS4KKworY2RfdG9fdG9wbGV2ZWw6OgorCXJ1bnMgY2hkaXIgdG8gdGhlIHRvcGxldmVsIG9mIHRoZSB3b3JraW5nIHRyZWUuCisKK3JlcXVpcmVfd29ya190cmVlOjoKKwljaGVja3MgaWYgdGhlIHJlcG9zaXRvcnkgaXMgYSBiYXJlIHJlcG9zaXRvcnksIGFuZCBkaWVzCisJaWYgc28uICBVc2VkIGJ5IHNjcmlwdHMgdGhhdCByZXF1aXJlIHdvcmtpbmcgdHJlZQorCShlLmcuIGBjaGVja291dGApLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4YjlmMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNoZWxsLnR4dApAQCAtMCwwICsxLDM1IEBACitnaXQtc2hlbGwoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hlbGwgLSBSZXN0cmljdGVkIGxvZ2luIHNoZWxsIGZvciBHSVQtb25seSBTU0ggYWNjZXNzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNoZWxsJyAtYyA8Y29tbWFuZD4gPGFyZ3VtZW50PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGxvZ2luIHNoZWxsIGZvciBTU0ggYWNjb3VudHMgeW91IHdhbnQKK3RvIHJlc3RyaWN0IHRvIEdJVCBwdWxsL3B1c2ggYWNjZXNzIG9ubHkuIEl0IHBlcm1pdHMgZXhlY3V0aW9uIG9ubHkKK29mIHNlcnZlci1zaWRlIEdJVCBjb21tYW5kcyBpbXBsZW1lbnRpbmcgdGhlIHB1bGwvcHVzaCBmdW5jdGlvbmFsaXR5LgorVGhlIGNvbW1hbmRzIGNhbiBiZSBleGVjdXRlZCBvbmx5IGJ5IHRoZSAnLWMnIG9wdGlvbjsgdGhlIHNoZWxsIGlzIG5vdAoraW50ZXJhY3RpdmUuCisKK0N1cnJlbnRseSwgb25seSB0aGUgYGdpdC1yZWNlaXZlLXBhY2tgIGFuZCBgZ2l0LXVwbG9hZC1wYWNrYCBjb21tYW5kcworYXJlIHBlcm1pdHRlZCB0byBiZSBjYWxsZWQsIHdpdGggYSBzaW5nbGUgcmVxdWlyZWQgYXJndW1lbnQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUGV0ciBCYXVkaXMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG9ydGxvZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG9ydGxvZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjYzZmNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3J0bG9nLnR4dApAQCAtMCwwICsxLDU5IEBACitnaXQtc2hvcnRsb2coMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hvcnRsb2cgLSBTdW1tYXJpemUgJ2dpdCBsb2cnIG91dHB1dAorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KK2dpdC1sb2cgLS1wcmV0dHk9c2hvcnQgfCAnZ2l0LXNob3J0bG9nJyBbLWhdIFstbl0gWy1zXQorZ2l0LXNob3J0bG9nIFstbnwtLW51bWJlcmVkXSBbLXN8LS1zdW1tYXJ5XSBbPGNvbW1pdHRpc2g+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1N1bW1hcml6ZXMgJ2dpdCBsb2cnIG91dHB1dCBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uCitpbiByZWxlYXNlIGFubm91bmNlbWVudHMuIEVhY2ggY29tbWl0IHdpbGwgYmUgZ3JvdXBlZCBieSBhdXRob3IgYW5kCit0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2Ugd2lsbCBiZSBzaG93bi4KKworQWRkaXRpb25hbGx5LCAiW1BBVENIXSIgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBjb21taXQgZGVzY3JpcHRpb24uCisKK09QVElPTlMKKy0tLS0tLS0KKworLWgsIFwtLWhlbHA6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworLW4sIFwtLW51bWJlcmVkOjoKKwlTb3J0IG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBjb21taXRzIHBlciBhdXRob3IgaW5zdGVhZAorCW9mIGF1dGhvciBhbHBoYWJldGljIG9yZGVyLgorCistcywgXC0tc3VtbWFyeTo6CisJU3VwcHJlc3MgY29tbWl0IGRlc2NyaXB0aW9uIGFuZCBwcm92aWRlIGEgY29tbWl0IGNvdW50IHN1bW1hcnkgb25seS4KKworRklMRVMKKy0tLS0tCisKKy5tYWlsbWFwOjoKKwlJZiB0aGlzIGZpbGUgZXhpc3RzLCBpdCB3aWxsIGJlIHVzZWQgZm9yIG1hcHBpbmcgYXV0aG9yIGVtYWlsCisJYWRkcmVzc2VzIHRvIGEgcmVhbCBhdXRob3IgbmFtZS4gT25lIG1hcHBpbmcgcGVyIGxpbmUsIGZpcnN0CisJdGhlIGF1dGhvciBuYW1lIGZvbGxvd2VkIGJ5IHRoZSBlbWFpbCBhZGRyZXNzIGVuY2xvc2VkIGJ5CisJJzwnIGFuZCAnPicuIFVzZSBoYXNoICcjJyBmb3IgY29tbWVudHMuIEV4YW1wbGU6CisKKwkJIyBLZWVwIGFscGhhYmV0aXplZAorCQlBZGFtIE1vcnJvdyA8YWRhbUBsb2NhbGhvc3QubG9jYWxkb21haW4+CisJCUV2ZSBKb25lcyA8ZXZlQGxhcHRvcC4obm9uZSk+CisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWJyYW5jaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWJyYW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1MzEzZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3ctYnJhbmNoLnR4dApAQCAtMCwwICsxLDE5MyBAQAorZ2l0LXNob3ctYnJhbmNoKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3ctYnJhbmNoIC0gU2hvdyBicmFuY2hlcyBhbmQgdGhlaXIgY29tbWl0cworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc2hvdy1icmFuY2gnIFstLWFsbF0gWy0tcmVtb3Rlc10gWy0tdG9wby1vcmRlcl0gWy0tY3VycmVudF0KKwkJWy0tbW9yZT08bj4gfCAtLWxpc3QgfCAtLWluZGVwZW5kZW50IHwgLS1tZXJnZS1iYXNlXQorCQlbLS1uby1uYW1lIHwgLS1zaGExLW5hbWVdIFstLXRvcGljc10gWzxyZXY+IHwgPGdsb2I+XS4uLgorJ2dpdC1zaG93LWJyYW5jaCcgKC1nfC0tcmVmbG9nKVs9PG4+Wyw8YmFzZT5dXSBbLS1saXN0XSBbPHJlZj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitTaG93cyB0aGUgY29tbWl0IGFuY2VzdHJ5IGdyYXBoIHN0YXJ0aW5nIGZyb20gdGhlIGNvbW1pdHMgbmFtZWQKK3dpdGggPHJldj5zIG9yIDxnbG9icz5zIChvciBhbGwgcmVmcyB1bmRlciAkR0lUX0RJUi9yZWZzL2hlYWRzCithbmQvb3IgJEdJVF9ESVIvcmVmcy90YWdzKSBzZW1pLXZpc3VhbGx5LgorCitJdCBjYW5ub3Qgc2hvdyBtb3JlIHRoYW4gMjkgYnJhbmNoZXMgYW5kIGNvbW1pdHMgYXQgYSB0aW1lLgorCitJdCB1c2VzIGBzaG93YnJhbmNoLmRlZmF1bHRgIG11bHRpLXZhbHVlZCBjb25maWd1cmF0aW9uIGl0ZW1zIGlmCitubyA8cmV2PiBub3IgPGdsb2I+IGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKworT1BUSU9OUworLS0tLS0tLQorPHJldj46OgorCUFyYml0cmFyeSBleHRlbmRlZCBTSEExIGV4cHJlc3Npb24gKHNlZSBgZ2l0LXJldi1wYXJzZWApCisJdGhhdCB0eXBpY2FsbHkgbmFtZXMgYSBicmFuY2ggSEVBRCBvciBhIHRhZy4KKworPGdsb2I+OjoKKwlBIGdsb2IgcGF0dGVybiB0aGF0IG1hdGNoZXMgYnJhbmNoIG9yIHRhZyBuYW1lcyB1bmRlcgorCSRHSVRfRElSL3JlZnMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgbWFueSB0b3BpYworCWJyYW5jaGVzIHVuZGVyICRHSVRfRElSL3JlZnMvaGVhZHMvdG9waWMsIGdpdmluZworCWB0b3BpYy8qYCB3b3VsZCBzaG93IGFsbCBvZiB0aGVtLgorCistcnwtLXJlbW90ZXM6OgorCVNob3cgdGhlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcy4KKworLWF8LS1hbGw6OgorCVNob3cgYm90aCByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMgYW5kIGxvY2FsIGJyYW5jaGVzLgorCistLWN1cnJlbnQ6OgorCVdpdGggdGhpcyBvcHRpb24sIHRoZSBjb21tYW5kIGluY2x1ZGVzIHRoZSBjdXJyZW50CisJYnJhbmNoIHRvIHRoZSBsaXN0IG9mIHJldnMgdG8gYmUgc2hvd24gd2hlbiBpdCBpcyBub3QKKwlnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCistLXRvcG8tb3JkZXI6OgorICAgICAgICBCeSBkZWZhdWx0LCB0aGUgYnJhbmNoZXMgYW5kIHRoZWlyIGNvbW1pdHMgYXJlIHNob3duIGluCisgICAgICAgIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4gIFRoaXMgb3B0aW9uIG1ha2VzIHRoZW0KKyAgICAgICAgYXBwZWFyIGluIHRvcG9sb2dpY2FsIG9yZGVyIChpLmUuLCBkZXNjZW5kYW50IGNvbW1pdHMKKyAgICAgICAgYXJlIHNob3duIGJlZm9yZSB0aGVpciBwYXJlbnRzKS4KKworLS1zcGFyc2U6OgorCUJ5IGRlZmF1bHQsIHRoZSBvdXRwdXQgb21pdHMgbWVyZ2VzIHRoYXQgYXJlIHJlYWNoYWJsZQorCWZyb20gb25seSBvbmUgdGlwIGJlaW5nIHNob3duLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlbQorCXZpc2libGUuCisKKy0tbW9yZT08bj46OgorCVVzdWFsbHkgdGhlIGNvbW1hbmQgc3RvcHMgb3V0cHV0IHVwb24gc2hvd2luZyB0aGUgY29tbWl0CisJdGhhdCBpcyB0aGUgY29tbW9uIGFuY2VzdG9yIG9mIGFsbCB0aGUgYnJhbmNoZXMuICBUaGlzCisJZmxhZyB0ZWxscyB0aGUgY29tbWFuZCB0byBnbyA8bj4gbW9yZSBjb21tb24gY29tbWl0cworCWJleW9uZCB0aGF0LiAgV2hlbiA8bj4gaXMgbmVnYXRpdmUsIGRpc3BsYXkgb25seSB0aGUKKwk8cmVmZXJlbmNlPnMgZ2l2ZW4sIHdpdGhvdXQgc2hvd2luZyB0aGUgY29tbWl0IGFuY2VzdHJ5CisJdHJlZS4KKworLS1saXN0OjoKKwlTeW5vbnltIHRvIGAtLW1vcmU9LTFgCisKKy0tbWVyZ2UtYmFzZTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBjb21taXQgbGlzdCwganVzdCBhY3QgbGlrZSB0aGUKKwknZ2l0LW1lcmdlLWJhc2UgLWEnIGNvbW1hbmQsIGV4Y2VwdCB0aGF0IGl0IGNhbiBhY2NlcHQKKwltb3JlIHRoYW4gdHdvIGhlYWRzLgorCistLWluZGVwZW5kZW50OjoKKwlBbW9uZyB0aGUgPHJlZmVyZW5jZT5zIGdpdmVuLCBkaXNwbGF5IG9ubHkgdGhlIG9uZXMgdGhhdAorCWNhbm5vdCBiZSByZWFjaGVkIGZyb20gYW55IG90aGVyIDxyZWZlcmVuY2U+LgorCistLW5vLW5hbWU6OgorCURvIG5vdCBzaG93IG5hbWluZyBzdHJpbmdzIGZvciBlYWNoIGNvbW1pdC4KKworLS1zaGExLW5hbWU6OgorCUluc3RlYWQgb2YgbmFtaW5nIHRoZSBjb21taXRzIHVzaW5nIHRoZSBwYXRoIHRvIHJlYWNoCisJdGhlbSBmcm9tIGhlYWRzIChlLmcuICJtYXN0ZXJ+MiIgdG8gbWVhbiB0aGUgZ3JhbmRwYXJlbnQKKwlvZiAibWFzdGVyIiksIG5hbWUgdGhlbSB3aXRoIHRoZSB1bmlxdWUgcHJlZml4IG9mIHRoZWlyCisJb2JqZWN0IG5hbWVzLgorCistLXRvcGljczo6CisJU2hvd3Mgb25seSBjb21taXRzIHRoYXQgYXJlIE5PVCBvbiB0aGUgZmlyc3QgYnJhbmNoIGdpdmVuLgorCVRoaXMgaGVscHMgdHJhY2sgdG9waWMgYnJhbmNoZXMgYnkgaGlkaW5nIGFueSBjb21taXQgdGhhdAorCWlzIGFscmVhZHkgaW4gdGhlIG1haW4gbGluZSBvZiBkZXZlbG9wbWVudC4gIFdoZW4gZ2l2ZW4KKwkiZ2l0IHNob3ctYnJhbmNoIC0tdG9waWNzIG1hc3RlciB0b3BpYzEgdG9waWMyIiwgdGhpcworCXdpbGwgc2hvdyB0aGUgcmV2aXNpb25zIGdpdmVuIGJ5ICJnaXQgcmV2LWxpc3Qge2NhcmV0fW1hc3RlcgorCXRvcGljMSB0b3BpYzIiCisKKy0tcmVmbG9nWz08bj5bLDxiYXNlPl1dIFs8cmVmPl06OgorCVNob3dzIDxuPiBtb3N0IHJlY2VudCByZWYtbG9nIGVudHJpZXMgZm9yIHRoZSBnaXZlbgorCXJlZi4gIElmIDxiYXNlPiBpcyBnaXZlbiwgPG4+IGVudHJpZXMgZ29pbmcgYmFjayBmcm9tCisJdGhhdCBlbnRyeS4gIDxiYXNlPiBjYW4gYmUgc3BlY2lmaWVkIGFzIGNvdW50IG9yIGRhdGUuCisJYC1nYCBjYW4gYmUgdXNlZCBhcyBhIHNob3J0LWhhbmQgZm9yIHRoaXMgb3B0aW9uLiAgV2hlbgorCW5vIGV4cGxpY2l0IDxyZWY+IHBhcmFtZXRlciBpcyBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlCisJY3VycmVudCBicmFuY2ggKG9yIGBIRUFEYCBpZiBpdCBpcyBkZXRhY2hlZCkuCisKK05vdGUgdGhhdCAtLW1vcmUsIC0tbGlzdCwgLS1pbmRlcGVuZGVudCBhbmQgLS1tZXJnZS1iYXNlIG9wdGlvbnMKK2FyZSBtdXR1YWxseSBleGNsdXNpdmUuCisKKworT1VUUFVUCistLS0tLS0KK0dpdmVuIE4gPHJlZmVyZW5jZXM+LCB0aGUgZmlyc3QgTiBsaW5lcyBhcmUgdGhlIG9uZS1saW5lCitkZXNjcmlwdGlvbiBmcm9tIHRoZWlyIGNvbW1pdCBtZXNzYWdlLiAgVGhlIGJyYW5jaCBoZWFkIHRoYXQgaXMKK3BvaW50ZWQgYXQgYnkgJEdJVF9ESVIvSEVBRCBpcyBwcmVmaXhlZCB3aXRoIGFuIGFzdGVyaXNrIGAqYAorY2hhcmFjdGVyIHdoaWxlIG90aGVyIGhlYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgYCFgIGNoYXJhY3Rlci4KKworRm9sbG93aW5nIHRoZXNlIE4gbGluZXMsIG9uZS1saW5lIGxvZyBmb3IgZWFjaCBjb21taXQgaXMKK2Rpc3BsYXllZCwgaW5kZW50ZWQgTiBwbGFjZXMuICBJZiBhIGNvbW1pdCBpcyBvbiB0aGUgSS10aAorYnJhbmNoLCB0aGUgSS10aCBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIgc2hvd3MgYSBgK2Agc2lnbjsKK290aGVyd2lzZSBpdCBzaG93cyBhIHNwYWNlLiAgTWVyZ2UgY29tbWl0cyBhcmUgZGVub3RlZCBieQorYSBgLWAgc2lnbi4gIEVhY2ggY29tbWl0IHNob3dzIGEgc2hvcnQgbmFtZSB0aGF0CitjYW4gYmUgdXNlZCBhcyBhbiBleHRlbmRlZCBTSEExIHRvIG5hbWUgdGhhdCBjb21taXQuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aHJlZSBicmFuY2hlcywgIm1hc3RlciIsICJmaXhlcyIKK2FuZCAibWhmIjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgZml4ZXMgbWhmCisqIFttYXN0ZXJdIEFkZCAnZ2l0IHNob3ctYnJhbmNoJy4KKyAhIFtmaXhlc10gSW50cm9kdWNlICJyZXNldCB0eXBlIiBmbGFnIHRvICJnaXQgcmVzZXQiCisgICEgW21oZl0gQWxsb3cgIityZW1vdGU6bG9jYWwiIHJlZnNwZWMgdG8gY2F1c2UgLS1mb3JjZSB3aGVuIGZldGNoaW5nLgorLS0tCisgICsgW21oZl0gQWxsb3cgIityZW1vdGU6bG9jYWwiIHJlZnNwZWMgdG8gY2F1c2UgLS1mb3JjZSB3aGVuIGZldGNoaW5nLgorICArIFttaGZ+MV0gVXNlIGdpdC1vY3RvcHVzIHdoZW4gcHVsbGluZyBtb3JlIHRoYW4gb25lIGhlYWRzLgorICsgIFtmaXhlc10gSW50cm9kdWNlICJyZXNldCB0eXBlIiBmbGFnIHRvICJnaXQgcmVzZXQiCisgICsgW21oZn4yXSAiZ2l0IGZldGNoIC0tZm9yY2UiLgorICArIFttaGZ+M10gVXNlIC5naXQvcmVtb3RlL29yaWdpbiwgbm90IC5naXQvYnJhbmNoZXMvb3JpZ2luLgorICArIFttaGZ+NF0gTWFrZSAiZ2l0IHB1bGwiIGFuZCAiZ2l0IGZldGNoIiBkZWZhdWx0IHRvIG9yaWdpbgorICArIFttaGZ+NV0gSW5mYW1vdXMgJ29jdG9wdXMgbWVyZ2UnCisgICsgW21oZn42XSBSZXRpcmUgZ2l0LXBhcnNlLXJlbW90ZS4KKyAgKyBbbWhmfjddIE11bHRpLWhlYWQgZmV0Y2guCisgICsgW21oZn44XSBTdGFydCBhZGRpbmcgdGhlICRHSVRfRElSL3JlbW90ZXMvIHN1cHBvcnQuCisqKysgW21hc3Rlcl0gQWRkICdnaXQgc2hvdy1icmFuY2gnLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIHRocmVlIGJyYW5jaGVzIGFsbCBmb3JrZWQgZnJvbSBhIGNvbW1vbiBjb21taXQsIFttYXN0ZXJdLAord2hvc2UgY29tbWl0IG1lc3NhZ2UgaXMgIkFkZCAnZ2l0IHNob3ctYnJhbmNoJy4gICJmaXhlcyIgYnJhbmNoCithZGRzIG9uZSBjb21taXQgJ0ludHJvZHVjZSAicmVzZXQgdHlwZSInLiAgIm1oZiIgYnJhbmNoIGhhcyBtYW55CitvdGhlciBjb21taXRzLiAgVGhlIGN1cnJlbnQgYnJhbmNoIGlzICJtYXN0ZXIiLgorCisKK0VYQU1QTEUKKy0tLS0tLS0KKworSWYgeW91IGtlZXAgeW91ciBwcmltYXJ5IGJyYW5jaGVzIGltbWVkaWF0ZWx5IHVuZGVyCitgJEdJVF9ESVIvcmVmcy9oZWFkc2AsIGFuZCB0b3BpYyBicmFuY2hlcyBpbiBzdWJkaXJlY3RvcmllcyBvZgoraXQsIGhhdmluZyB0aGUgZm9sbG93aW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbWF5IGhlbHA6CisKKy0tLS0tLS0tLS0tLQorW3Nob3dicmFuY2hdCisJZGVmYXVsdCA9IC0tdG9wby1vcmRlcgorCWRlZmF1bHQgPSBoZWFkcy8qCisKKy0tLS0tLS0tLS0tLQorCitXaXRoIHRoaXMsIGBnaXQgc2hvdy1icmFuY2hgIHdpdGhvdXQgZXh0cmEgcGFyYW1ldGVycyB3b3VsZCBzaG93Citvbmx5IHRoZSBwcmltYXJ5IGJyYW5jaGVzLiAgSW4gYWRkaXRpb24sIGlmIHlvdSBoYXBwZW4gdG8gYmUgb24KK3lvdXIgdG9waWMgYnJhbmNoLCBpdCBpcyBzaG93biBhcyB3ZWxsLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tcmVmbG9nPScxMCwxIGhvdXIgYWdvJyAtLWxpc3QgbWFzdGVyCistLS0tLS0tLS0tLS0KKworc2hvd3MgMTAgcmVmbG9nIGVudHJpZXMgZ29pbmcgYmFjayBmcm9tIHRoZSB0aXAgYXMgb2YgMSBob3VyIGFnby4KK1dpdGhvdXQgYC0tbGlzdGAsIHRoZSBvdXRwdXQgYWxzbyBzaG93cyBob3cgdGhlc2UgdGlwcyBhcmUKK3RvcG9sb2dpY2FsbHkgcmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA5YjYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1pbmRleC50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LXNob3ctaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LWluZGV4IC0gU2hvdyBwYWNrZWQgYXJjaGl2ZSBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaG93LWluZGV4JyA8IGlkeC1maWxlCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBnaXZlbiBpZHggZmlsZSBmb3IgcGFja2VkIGdpdCBhcmNoaXZlIGNyZWF0ZWQgd2l0aAorZ2l0LXBhY2stb2JqZWN0cyBjb21tYW5kLCBhbmQgZHVtcHMgaXRzIGNvbnRlbnRzLgorCitUaGUgaW5mb3JtYXRpb24gaXQgb3V0cHV0cyBpcyBzdWJzZXQgb2Ygd2hhdCB5b3UgY2FuIGdldCBmcm9tCisnZ2l0LXZlcmlmeS1wYWNrIC12JzsgdGhpcyBjb21tYW5kIG9ubHkgc2hvd3MgdGhlIHBhY2tmaWxlCitvZmZzZXQgYW5kIFNIQTEgb2YgZWFjaCBvYmplY3QuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1yZWYudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTVhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LXJlZi50eHQKQEAgLTAsMCArMSwxNzIgQEAKK2dpdC1zaG93LXJlZigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LXJlZiAtIExpc3QgcmVmZXJlbmNlcyBpbiBhIGxvY2FsIHJlcG9zaXRvcnkKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXNob3ctcmVmJyBbLXF8LS1xdWlldF0gWy0tdmVyaWZ5XSBbLWh8LS1oZWFkXSBbLWR8LS1kZXJlZmVyZW5jZV0KKwkgICAgIFstc3wtLWhhc2hdIFstLWFiYnJldl0gWy0tdGFnc10gWy0taGVhZHNdIFstLV0gPHBhdHRlcm4+Li4uCisnZ2l0LXNob3ctcmVmJyAtLWV4Y2x1ZGUtZXhpc3RpbmdbPXBhdHRlcm5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitEaXNwbGF5cyByZWZlcmVuY2VzIGF2YWlsYWJsZSBpbiBhIGxvY2FsIHJlcG9zaXRvcnkgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZAorY29tbWl0IElEcy4gUmVzdWx0cyBjYW4gYmUgZmlsdGVyZWQgdXNpbmcgYSBwYXR0ZXJuIGFuZCB0YWdzIGNhbiBiZQorZGVyZWZlcmVuY2VkIGludG8gb2JqZWN0IElEcy4gQWRkaXRpb25hbGx5LCBpdCBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYQorcGFydGljdWxhciByZWYgZXhpc3RzLgorCitUaGUgLS1leGNsdWRlLWV4aXN0aW5nIGZvcm0gaXMgYSBmaWx0ZXIgdGhhdCBkb2VzIHRoZSBpbnZlcnNlLCBpdCBzaG93cyB0aGUKK3JlZnMgZnJvbSBzdGRpbiB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBsb2NhbCByZXBvc2l0b3J5LgorCitVc2Ugb2YgdGhpcyB1dGlsaXR5IGlzIGVuY291cmFnZWQgaW4gZmF2b3Igb2YgZGlyZWN0bHkgYWNjZXNzaW5nIGZpbGVzIHVuZGVyCitpbiB0aGUgYC5naXRgIGRpcmVjdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorCistaCwgLS1oZWFkOjoKKworCVNob3cgdGhlIEhFQUQgcmVmZXJlbmNlLgorCistLXRhZ3MsIC0taGVhZHM6OgorCisJTGltaXQgdG8gb25seSAicmVmcy9oZWFkcyIgYW5kICJyZWZzL3RhZ3MiLCByZXNwZWN0aXZlbHkuICBUaGVzZQorCW9wdGlvbnMgYXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmU7IHdoZW4gZ2l2ZW4gYm90aCwgcmVmZXJlbmNlcyBzdG9yZWQKKwlpbiAicmVmcy9oZWFkcyIgYW5kICJyZWZzL3RhZ3MiIGFyZSBkaXNwbGF5ZWQuCisKKy1kLCAtLWRlcmVmZXJlbmNlOjoKKworCURlcmVmZXJlbmNlIHRhZ3MgaW50byBvYmplY3QgSURzIGFzIHdlbGwuIFRoZXkgd2lsbCBiZSBzaG93biB3aXRoICJee30iCisJYXBwZW5kZWQuCisKKy1zLCAtLWhhc2g6OgorCisJT25seSBzaG93IHRoZSBTSEExIGhhc2gsIG5vdCB0aGUgcmVmZXJlbmNlIG5hbWUuIFdoZW4gYWxzbyB1c2luZworCS0tZGVyZWZlcmVuY2UgdGhlIGRlcmVmZXJlbmNlZCB0YWcgd2lsbCBzdGlsbCBiZSBzaG93biBhZnRlciB0aGUgU0hBMS4KKworLS12ZXJpZnk6OgorCisJRW5hYmxlIHN0cmljdGVyIHJlZmVyZW5jZSBjaGVja2luZyBieSByZXF1aXJpbmcgYW4gZXhhY3QgcmVmIHBhdGguCisJQXNpZGUgZnJvbSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZSBvZiAxLCBpdCB3aWxsIGFsc28gcHJpbnQgYW4gZXJyb3IKKwltZXNzYWdlIGlmICctLXF1aWV0JyB3YXMgbm90IHNwZWNpZmllZC4KKworLS1hYmJyZXYsIC0tYWJicmV2PWxlbjo6CisKKwlBYmJyZXZpYXRlIHRoZSBvYmplY3QgbmFtZS4gIFdoZW4gdXNpbmcgYC0taGFzaGAsIHlvdSBkbworCW5vdCBoYXZlIHRvIHNheSBgLS1oYXNoIC0tYWJicmV2YDsgYC0taGFzaD1sZW5gIHdvdWxkIGRvLgorCistcSwgLS1xdWlldDo6CisKKwlEbyBub3QgcHJpbnQgYW55IHJlc3VsdHMgdG8gc3Rkb3V0LiBXaGVuIGNvbWJpbmVkIHdpdGggJy0tdmVyaWZ5JyB0aGlzCisJY2FuIGJlIHVzZWQgdG8gc2lsZW50bHkgY2hlY2sgaWYgYSByZWZlcmVuY2UgZXhpc3RzLgorCistLWV4Y2x1ZGUtZXhpc3RpbmcsIC0tZXhjbHVkZS1leGlzdGluZz1wYXR0ZXJuOjoKKworCU1ha2UgZ2l0LXNob3ctcmVmIGFjdCBhcyBhIGZpbHRlciB0aGF0IHJlYWRzIHJlZnMgZnJvbSBzdGRpbiBvZiB0aGUKKwlmb3JtICJeKD86PGFueXRoaW5nPlxzKT88cmVmbmFtZT4oPzpcXlx7XH0pPyQiIGFuZCBwZXJmb3JtcyB0aGUKKwlmb2xsb3dpbmcgYWN0aW9ucyBvbiBlYWNoOgorCSgxKSBzdHJpcCAiXnt9IiBhdCB0aGUgZW5kIG9mIGxpbmUgaWYgYW55OworCSgyKSBpZ25vcmUgaWYgcGF0dGVybiBpcyBwcm92aWRlZCBhbmQgZG9lcyBub3QgaGVhZC1tYXRjaCByZWZuYW1lOworCSgzKSB3YXJuIGlmIHJlZm5hbWUgaXMgbm90IGEgd2VsbC1mb3JtZWQgcmVmbmFtZSBhbmQgc2tpcDsKKwkoNCkgaWdub3JlIGlmIHJlZm5hbWUgaXMgYSByZWYgdGhhdCBleGlzdHMgaW4gdGhlIGxvY2FsIHJlcG9zaXRvcnk7CisJKDUpIG90aGVyd2lzZSBvdXRwdXQgdGhlIGxpbmUuCisKKworPHBhdHRlcm4+OjoKKworCVNob3cgcmVmZXJlbmNlcyBtYXRjaGluZyBvbmUgb3IgbW9yZSBwYXR0ZXJucy4KKworT1VUUFVUCistLS0tLS0KKworVGhlIG91dHB1dCBpcyBpbiB0aGUgZm9ybWF0OiAnPFNIQS0xIElEPicgJzxzcGFjZT4nICc8cmVmZXJlbmNlIG5hbWU+Jy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctcmVmIC0taGVhZCAtLWRlcmVmZXJlbmNlCis4MzJlNzZhOTg5OWY1NjBhOTBmZmQ2MmFlMmNlODNiYmVmZjU4ZjU0IEhFQUQKKzgzMmU3NmE5ODk5ZjU2MGE5MGZmZDYyYWUyY2U4M2JiZWZmNThmNTQgcmVmcy9oZWFkcy9tYXN0ZXIKKzgzMmU3NmE5ODk5ZjU2MGE5MGZmZDYyYWUyY2U4M2JiZWZmNThmNTQgcmVmcy9oZWFkcy9vcmlnaW4KKzM1MjEwMTc1NTZjNWRlNDE1OWRhNDYxNWEzOWZhNGQ1ZDJjMjc5YjUgcmVmcy90YWdzL3YwLjk5LjljCis2ZGRjMDk2NDAzNDM0MjUxOWE4N2ZlMDEzNzgxYWJmMzFjNmRiNmFkIHJlZnMvdGFncy92MC45OS45Y157fQorMDU1ZTRhZTNhZTZlYjM0NGNiYWJmMmE1MjU2YTQ5ZWE2NjA0MDEzMSByZWZzL3RhZ3MvdjEuMHJjNAorNDIzMzI1YTJkMjQ2MzhkZGNjODJjZTQ3YmU1ZTQwYmU1NTBmNDUwNyByZWZzL3RhZ3MvdjEuMHJjNF57fQorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHVzaW5nIC0taGFzaCAoYW5kIG5vdCAtLWRlcmVmZXJlbmNlKSB0aGUgb3V0cHV0IGZvcm1hdCBpczogJzxTSEEtMSBJRD4nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LXJlZiAtLWhlYWRzIC0taGFzaAorMmUzYmEwMTE0YTFmNTJiNDdkZjI5NzQzZDY5MTVkMDU2YmUxMzI3OAorMTg1MDA4YWU5Nzk2MGM4ZDU1MWFkY2Q5ZTIzNTY1MTk0NjUxYjVkMQorMDNhZGY0MmM5ODgxOTViNTBlMWExOTM1YmE1ZmNiYzM5YjJiMDI5YgorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFWEFNUExFCistLS0tLS0tCisKK1RvIHNob3cgYWxsIHJlZmVyZW5jZXMgY2FsbGVkICJtYXN0ZXIiLCB3aGV0aGVyIHRhZ3Mgb3IgaGVhZHMgb3IgYW55dGhpbmcKK2Vsc2UsIGFuZCByZWdhcmRsZXNzIG9mIGhvdyBkZWVwIGluIHRoZSByZWZlcmVuY2UgbmFtaW5nIGhpZXJhcmNoeSB0aGV5IGFyZSwKK3VzZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlnaXQgc2hvdy1yZWYgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdpbGwgc2hvdyAicmVmcy9oZWFkcy9tYXN0ZXIiIGJ1dCBhbHNvICJyZWZzL3JlbW90ZS9vdGhlci1yZXBvL21hc3RlciIsCitpZiBzdWNoIHJlZmVyZW5jZXMgZXhpc3RzLgorCitXaGVuIHVzaW5nIHRoZSAnLS12ZXJpZnknIGZsYWcsIHRoZSBjb21tYW5kIHJlcXVpcmVzIGFuIGV4YWN0IHBhdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIG9ubHkgbWF0Y2ggdGhlIGV4YWN0IGJyYW5jaCBjYWxsZWQgIm1hc3RlciIuCisKK0lmIG5vdGhpbmcgbWF0Y2hlcywgZ2l0bGluazpnaXQtc2hvdy1yZWZbMV0gd2lsbCByZXR1cm4gYW4gZXJyb3IgY29kZSBvZiAxLAorYW5kIGluIHRoZSBjYXNlIG9mIHZlcmlmaWNhdGlvbiwgaXQgd2lsbCBzaG93IGFuIGVycm9yIG1lc3NhZ2UuCisKK0ZvciBzY3JpcHRpbmcsIHlvdSBjYW4gYXNrIGl0IHRvIGJlIHF1aWV0IHdpdGggdGhlICItLXF1aWV0IiBmbGFnLCB3aGljaAorYWxsb3dzIHlvdSB0byBkbyB0aGluZ3MgbGlrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWdpdC1zaG93LXJlZiAtLXF1aWV0IC0tdmVyaWZ5IC0tICJyZWZzL2hlYWRzLyRoZWFkbmFtZSIgfHwKKwkJZWNobyAiJGhlYWRuYW1lIGlzIG5vdCBhIHZhbGlkIGJyYW5jaCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIGNoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGJyYW5jaCBleGlzdHMgb3Igbm90IChub3RpY2UgaG93IHdlIGRvbid0CithY3R1YWxseSB3YW50IHRvIHNob3cgYW55IHJlc3VsdHMsIGFuZCB3ZSB3YW50IHRvIHVzZSB0aGUgZnVsbCByZWZuYW1lIGZvciBpdAoraW4gb3JkZXIgdG8gbm90IHRyaWdnZXIgdGhlIHByb2JsZW0gd2l0aCBhbWJpZ3VvdXMgcGFydGlhbCBtYXRjaGVzKS4KKworVG8gc2hvdyBvbmx5IHRhZ3MsIG9yIG9ubHkgcHJvcGVyIGJyYW5jaCBoZWFkcywgdXNlICItLXRhZ3MiIGFuZC9vciAiLS1oZWFkcyIKK3Jlc3BlY3RpdmVseSAodXNpbmcgYm90aCBtZWFucyB0aGF0IGl0IHNob3dzIHRhZ3MgYW5kIGhlYWRzLCBidXQgbm90IG90aGVyCityYW5kb20gcmVmZXJlbmNlcyB1bmRlciB0aGUgcmVmcy8gc3ViZGlyZWN0b3J5KS4KKworVG8gZG8gYXV0b21hdGljIHRhZyBvYmplY3QgZGVyZWZlcmVuY2luZywgdXNlIHRoZSAiLWQiIG9yICItLWRlcmVmZXJlbmNlIgorZmxhZywgc28geW91IGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWdpdCBzaG93LXJlZiAtLXRhZ3MgLS1kZXJlZmVyZW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gZ2V0IGEgbGlzdGluZyBvZiBhbGwgdGFncyB0b2dldGhlciB3aXRoIHdoYXQgdGhleSBkZXJlZmVyZW5jZS4KKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1scy1yZW1vdGVbMV0sIGdpdGxpbms6Z2l0LXBlZWstcmVtb3RlWzFdCisKK0FVVEhPUlMKKy0tLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPi4KK01hbiBwYWdlIGJ5IEpvbmFzIEZvbnNlY2EgPGZvbnNlY2FAZGlrdS5kaz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM1Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy50eHQKQEAgLTAsMCArMSw4NyBAQAorZ2l0LXNob3coMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93IC0gU2hvdyB2YXJpb3VzIHR5cGVzIG9mIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2hvdycgW29wdGlvbnNdIDxvYmplY3Q+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvd3Mgb25lIG9yIG1vcmUgb2JqZWN0cyAoYmxvYnMsIHRyZWVzLCB0YWdzIGFuZCBjb21taXRzKS4KKworRm9yIGNvbW1pdHMgaXQgc2hvd3MgdGhlIGxvZyBtZXNzYWdlIGFuZCB0ZXh0dWFsIGRpZmYuIEl0IGFsc28KK3ByZXNlbnRzIHRoZSBtZXJnZSBjb21taXQgaW4gYSBzcGVjaWFsIGZvcm1hdCBhcyBwcm9kdWNlZCBieQorJ2dpdC1kaWZmLXRyZWUgLS1jYycuCisKK0ZvciB0YWdzLCBpdCBzaG93cyB0aGUgdGFnIG1lc3NhZ2UgYW5kIHRoZSByZWZlcmVuY2VkIG9iamVjdHMuCisKK0ZvciB0cmVlcywgaXQgc2hvd3MgdGhlIG5hbWVzIChlcXVpdmFsZW50IHRvIGdpdGxpbms6Z2l0LWxzLXRyZWVbMV0KK3dpdGggXC0tbmFtZS1vbmx5KS4KKworRm9yIHBsYWluIGJsb2JzLCBpdCBzaG93cyB0aGUgcGxhaW4gY29udGVudHMuCisKK1RoZSBjb21tYW5kIHRha2VzIG9wdGlvbnMgYXBwbGljYWJsZSB0byB0aGUgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGNvbW1hbmQgdG8KK2NvbnRyb2wgaG93IHRoZSBjaGFuZ2VzIHRoZSBjb21taXQgaW50cm9kdWNlcyBhcmUgc2hvd24uCisKK1RoaXMgbWFudWFsIHBhZ2UgZGVzY3JpYmVzIG9ubHkgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIG9wdGlvbnMuCisKKworT1BUSU9OUworLS0tLS0tLQorPG9iamVjdD46OgorCVRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gc2hvdy4KKwlGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCBvYmplY3QgbmFtZXMsIHNlZQorCSJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBpbiBnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0uCisKK2luY2x1ZGU6OnByZXR0eS1vcHRpb25zLnR4dFtdCisKKworaW5jbHVkZTo6cHJldHR5LWZvcm1hdHMudHh0W10KKworCitFWEFNUExFUworLS0tLS0tLS0KKworZ2l0IHNob3cgdjEuMC4wOjoKKwlTaG93cyB0aGUgdGFnIGB2MS4wLjBgLCBhbG9uZyB3aXRoIHRoZSBvYmplY3QgdGhlIHRhZ3MKKwlwb2ludHMgYXQuCisKK2dpdCBzaG93IHYxLjAuMF5ce3RyZWVcfTo6CisJU2hvd3MgdGhlIHRyZWUgcG9pbnRlZCB0byBieSB0aGUgdGFnIGB2MS4wLjBgLgorCitnaXQgc2hvdyBuZXh0fjEwOkRvY3VtZW50YXRpb24vUkVBRE1FOjoKKwlTaG93cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYERvY3VtZW50YXRpb24vUkVBRE1FYCBhcworCXRoZXkgd2VyZSBjdXJyZW50IGluIHRoZSAxMHRoIGxhc3QgY29tbWl0IG9mIHRoZSBicmFuY2gKKwlgbmV4dGAuCisKK2dpdCBzaG93IG1hc3RlcjpNYWtlZmlsZSBtYXN0ZXI6dC9NYWtlZmlsZTo6CisJQ29uY2F0ZW5hdGVzIHRoZSBjb250ZW50cyBvZiBzYWlkIE1ha2VmaWxlcyBpbiB0aGUgaGVhZAorCW9mIHRoZSBicmFuY2ggYG1hc3RlcmAuCisKK0Rpc2N1c3Npb24KKy0tLS0tLS0tLS0KKworaW5jbHVkZTo6aTE4bi50eHRbXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0Pi4gIFNpZ25pZmljYW50bHkgZW5oYW5jZWQgYnkKK0pvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPi4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitUaGlzIG1hbnVhbCBwYWdlIGlzIGEgc3R1Yi4gWW91IGNhbiBoZWxwIHRoZSBnaXQgZG9jdW1lbnRhdGlvbiBieSBleHBhbmRpbmcgaXQuCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLWZldGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJiMWYxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLWZldGNoLnR4dApAQCAtMCwwICsxLDUxIEBACitnaXQtc3NoLWZldGNoKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zc2gtZmV0Y2ggLSBGZXRjaCBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNzaC1mZXRjaCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1B1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZworZ2l0LXNzaC11cGxvYWQgb24gdGhlIG90aGVyIGVuZC4gSXQgZnVuY3Rpb25zIGlkZW50aWNhbGx5IHRvCitnaXQtc3NoLXVwbG9hZCwgYXNpZGUgZnJvbSB3aGljaCBlbmQgeW91IHJ1biBpdCBvbi4KKworCitPUFRJT05TCistLS0tLS0tCitjb21taXQtaWQ6OgorICAgICAgICBFaXRoZXIgdGhlIGhhc2ggb3IgdGhlIGZpbGVuYW1lIHVuZGVyIFtVUkxdL3JlZnMvIHRvCisgICAgICAgIHB1bGwuCisKKy1jOjoKKwlHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLXQ6OgorCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLWE6OgorCUdldCBhbGwgdGhlIG9iamVjdHMuCistdjo6CisJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKy13OjoKKyAgICAgICAgV3JpdGVzIHRoZSBjb21taXQtaWQgaW50byB0aGUgZmlsZW5hbWUgdW5kZXIgJEdJVF9ESVIvcmVmcy8gb24KKyAgICAgICAgdGhlIGxvY2FsIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRGFuaWVsIEJhcmthbG93IDxiYXJrYWxvd0BpYWJlcnZvbi5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXVwbG9hZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtdXBsb2FkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI3ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXVwbG9hZC50eHQKQEAgLTAsMCArMSw0NyBAQAorZ2l0LXNzaC11cGxvYWQoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zc2gtdXBsb2FkIC0gUHVzaCB0byBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc3NoLXVwbG9hZCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1B1c2hlcyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcKK2dpdC1zc2gtZmV0Y2ggb24gdGhlIG90aGVyIGVuZC4gSXQgZnVuY3Rpb25zIGlkZW50aWNhbGx5IHRvCitnaXQtc3NoLWZldGNoLCBhc2lkZSBmcm9tIHdoaWNoIGVuZCB5b3UgcnVuIGl0IG9uLgorCitPUFRJT05TCistLS0tLS0tCitjb21taXQtaWQ6OgorICAgICAgICBJZCBvZiBjb21taXQgdG8gcHVzaC4KKworLWM6OgorICAgICAgICBHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLXQ6OgorICAgICAgICBHZXQgdHJlZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBjb21taXQgb2JqZWN0LgorLWE6OgorICAgICAgICBHZXQgYWxsIHRoZSBvYmplY3RzLgorLXY6OgorICAgICAgICBSZXBvcnQgd2hhdCBpcyB1cGxvYWRlZC4KKy13OjoKKyAgICAgICAgV3JpdGVzIHRoZSBjb21taXQtaWQgaW50byB0aGUgZmlsZW5hbWUgdW5kZXIgW1VSTF0vcmVmcy8gb24KKyAgICAgICAgdGhlIHJlbW90ZSBlbmQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBEYW5pZWwgQmFya2Fsb3cgPGJhcmthbG93QGlhYmVydm9uLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGFuaWVsIEJhcmthbG93CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdGF0dXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3RhdHVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQxYWYxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3RhdHVzLnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtc3RhdHVzKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdGF0dXMgLSBTaG93IHRoZSB3b3JraW5nIHRyZWUgc3RhdHVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN0YXR1cycgPG9wdGlvbnM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRXhhbWluZXMgcGF0aHMgaW4gdGhlIHdvcmtpbmcgdHJlZSB0aGF0IGhhcyBjaGFuZ2VzIHVucmVjb3JkZWQKK3RvIHRoZSBpbmRleCBmaWxlLCBhbmQgY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUKK2N1cnJlbnQgSEVBRCBjb21taXQuICBUaGUgZm9ybWVyIHBhdGhzIGFyZSB3aGF0IHlvdSBfY291bGRfCitjb21taXQgYnkgcnVubmluZyAnZ2l0IGFkZCcgYmVmb3JlIHJ1bm5pbmcgJ2dpdAorY29tbWl0JywgYW5kIHRoZSBsYXR0ZXIgcGF0aHMgYXJlIHdoYXQgeW91IF93b3VsZF8gY29tbWl0IGJ5CitydW5uaW5nICdnaXQgY29tbWl0Jy4KKworSWYgdGhlcmUgaXMgbm8gcGF0aCB0aGF0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBpbmRleCBmaWxlIGFuZAordGhlIGN1cnJlbnQgSEVBRCBjb21taXQsIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggbm9uLXplcm8KK3N0YXR1cy4KKworVGhlIGNvbW1hbmQgdGFrZXMgdGhlIHNhbWUgc2V0IG9mIG9wdGlvbnMgYXMgYGdpdC1jb21taXRgOyBpdAorc2hvd3Mgd2hhdCB3b3VsZCBiZSBjb21taXR0ZWQgaWYgdGhlIHNhbWUgb3B0aW9ucyBhcmUgZ2l2ZW4gdG8KK2BnaXQtY29tbWl0YC4KKworCitPVVRQVVQKKy0tLS0tLQorVGhlIG91dHB1dCBmcm9tIHRoaXMgY29tbWFuZCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgY29tbWl0Cit0ZW1wbGF0ZSBjb21tZW50cywgYW5kIGFsbCB0aGUgb3V0cHV0IGxpbmVzIGFyZSBwcmVmaXhlZCB3aXRoICcjJy4KKworCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCisKK1RoZSBjb21tYW5kIGhvbm9ycyBgY29sb3Iuc3RhdHVzYCAob3IgYHN0YXR1cy5jb2xvcmAgLS0gdGhleQorbWVhbiB0aGUgc2FtZSB0aGluZyBhbmQgdGhlIGxhdHRlciBpcyBrZXB0IGZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSkgYW5kIGBjb2xvci5zdGF0dXMuPHNsb3Q+YCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwordG8gY29sb3JpemUgaXRzIG91dHB1dC4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdGlnbm9yZVs1XQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdHJpcHNwYWNlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN0cmlwc3BhY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDNkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdHJpcHNwYWNlLnR4dApAQCAtMCwwICsxLDMzIEBACitnaXQtc3RyaXBzcGFjZSgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXN0cmlwc3BhY2UgLSBGaWx0ZXIgb3V0IGVtcHR5IGxpbmVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN0cmlwc3BhY2UnIDwgPHN0cmVhbT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZW1vdmUgbXVsdGlwbGUgZW1wdHkgbGluZXMsIGFuZCBlbXB0eSBsaW5lcyBhdCBiZWdpbm5pbmcgYW5kIGVuZC4KKworT1BUSU9OUworLS0tLS0tLQorPHN0cmVhbT46OgorCUJ5dGUgc3RyZWFtIHRvIGFjdCBvbi4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXN2bi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdm4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDdkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdm4udHh0CkBAIC0wLDAgKzEsNTExIEBACitnaXQtc3ZuKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdm4gLSBCaWRpcmVjdGlvbmFsIG9wZXJhdGlvbiBiZXR3ZWVuIGEgc2luZ2xlIFN1YnZlcnNpb24gYnJhbmNoIGFuZCBnaXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN2bicgPGNvbW1hbmQ+IFtvcHRpb25zXSBbYXJndW1lbnRzXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK2dpdC1zdm4gaXMgYSBzaW1wbGUgY29uZHVpdCBmb3IgY2hhbmdlc2V0cyBiZXR3ZWVuIFN1YnZlcnNpb24gYW5kIGdpdC4KK0l0IGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGdpdGxpbms6Z2l0LXN2bmltcG9ydFsxXSwgd2hpY2ggaXMKK3JlYWQtb25seS4KKworZ2l0LXN2biB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgYW4gaW5kaXZpZHVhbCBkZXZlbG9wZXIgd2hvIHdhbnRzIGEKK2JpZGlyZWN0aW9uYWwgZmxvdyBvZiBjaGFuZ2VzZXRzIGJldHdlZW4gYSBzaW5nbGUgYnJhbmNoIGluIFN1YnZlcnNpb24KK2FuZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJyYW5jaGVzIGluIGdpdC4gIFNpbmNlIGl0cyBpbmNlcHRpb24sCitnaXQtc3ZuIGhhcyBnYWluZWQgdGhlIGFiaWxpdHkgdG8gdHJhY2sgbXVsdGlwbGUgYnJhbmNoZXMgaW4gYSBtYW5uZXIKK3NpbWlsYXIgdG8gZ2l0LXN2bmltcG9ydC4KKworZ2l0LXN2biBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGl0IGNvbWVzIHRvIHRyYWNraW5nIHJlcG9zaXRvcmllcworbm90IG9yZ2FuaXplZCBpbiB0aGUgd2F5IFN1YnZlcnNpb24gZGV2ZWxvcGVycyByZWNvbW1lbmQgKHRydW5rLAorYnJhbmNoZXMsIHRhZ3MgZGlyZWN0b3JpZXMpLgorCitDT01NQU5EUworLS0tLS0tLS0KKy0tCisKKydpbml0Jzo6CisJSW5pdGlhbGl6ZXMgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkgd2l0aCBhZGRpdGlvbmFsCisJbWV0YWRhdGEgZGlyZWN0b3JpZXMgZm9yIGdpdC1zdm4uICBUaGUgU3VidmVyc2lvbiBVUkwKKwltYXkgYmUgc3BlY2lmaWVkIGFzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50LCBvciBhcyBmdWxsCisJVVJMIGFyZ3VtZW50cyB0byAtVC8tdC8tYi4gIE9wdGlvbmFsbHksIHRoZSB0YXJnZXQKKwlkaXJlY3RvcnkgdG8gb3BlcmF0ZSBvbiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgc2Vjb25kCisJYXJndW1lbnQuICBOb3JtYWxseSB0aGlzIGNvbW1hbmQgaW5pdGlhbGl6ZXMgdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnkuCisKKy1UPHRydW5rX3N1YmRpcj47OworLS10cnVuaz08dHJ1bmtfc3ViZGlyPjs7CistdDx0YWdzX3N1YmRpcj47OworLS10YWdzPTx0YWdzX3N1YmRpcj47OworLWI8YnJhbmNoZXNfc3ViZGlyPjs7CistLWJyYW5jaGVzPTxicmFuY2hlc19zdWJkaXI+OzsKKwlUaGVzZSBhcmUgb3B0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIGluaXQuICBFYWNoIG9mCisJdGhlc2UgZmxhZ3MgY2FuIHBvaW50IHRvIGEgcmVsYXRpdmUgcmVwb3NpdG9yeSBwYXRoCisJKC0tdGFncz1wcm9qZWN0L3RhZ3MnKSBvciBhIGZ1bGwgdXJsCisJKC0tdGFncz1odHRwczovL2Zvby5vcmcvcHJvamVjdC90YWdzKQorLS1uby1tZXRhZGF0YTs7CisJU2V0IHRoZSAnbm9NZXRhZGF0YScgb3B0aW9uIGluIHRoZSBbc3ZuLXJlbW90ZV0gY29uZmlnLgorLS11c2Utc3ZtLXByb3BzOzsKKwlTZXQgdGhlICd1c2VTdm1Qcm9wcycgb3B0aW9uIGluIHRoZSBbc3ZuLXJlbW90ZV0gY29uZmlnLgorLS11c2Utc3Zuc3luYy1wcm9wczs7CisJU2V0IHRoZSAndXNlU3Zuc3luY1Byb3BzJyBvcHRpb24gaW4gdGhlIFtzdm4tcmVtb3RlXSBjb25maWcuCistLXJld3JpdGUtcm9vdD08VVJMPjs7CisJU2V0IHRoZSAncmV3cml0ZVJvb3QnIG9wdGlvbiBpbiB0aGUgW3N2bi1yZW1vdGVdIGNvbmZpZy4KKy0tdXNlcm5hbWU9PFVTRVI+OzsKKwlGb3IgdHJhbnNwb3J0cyB0aGF0IFNWTiBoYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGZvciAoaHR0cCwKKwlodHRwcywgYW5kIHBsYWluIHN2biksIHNwZWNpZnkgdGhlIHVzZXJuYW1lLiAgRm9yIG90aGVyCisJdHJhbnNwb3J0cyAoZWcgc3ZuK3NzaDovLyksIHlvdSBtdXN0IGluY2x1ZGUgdGhlIHVzZXJuYW1lIGluCisJdGhlIFVSTCwgZWcgc3ZuK3NzaDovL2Zvb0Bzdm4uYmFyLmNvbS9wcm9qZWN0CistLXByZWZpeD08cHJlZml4Pjs7CisJVGhpcyBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgYSBwcmVmaXggd2hpY2ggaXMgcHJlcGVuZGVkCisJdG8gdGhlIG5hbWVzIG9mIHJlbW90ZXMgaWYgdHJ1bmsvYnJhbmNoZXMvdGFncyBhcmUKKwlzcGVjaWZpZWQuICBUaGUgcHJlZml4IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhCisJdHJhaWxpbmcgc2xhc2gsIHNvIGJlIHN1cmUgeW91IGluY2x1ZGUgb25lIGluIHRoZQorCWFyZ3VtZW50IGlmIHRoYXQgaXMgd2hhdCB5b3Ugd2FudC4gIFRoaXMgaXMgdXNlZnVsIGlmCisJeW91IHdpc2ggdG8gdHJhY2sgbXVsdGlwbGUgcHJvamVjdHMgdGhhdCBzaGFyZSBhIGNvbW1vbgorCXJlcG9zaXRvcnkuCisKKydmZXRjaCc6OgorCUZldGNoIHVuZmV0Y2hlZCByZXZpc2lvbnMgZnJvbSB0aGUgU3VidmVyc2lvbiByZW1vdGUgd2UgYXJlCisJdHJhY2tpbmcuICBUaGUgbmFtZSBvZiB0aGUgW3N2bi1yZW1vdGUgIi4uLiJdIHNlY3Rpb24gaW4gdGhlCisJLmdpdC9jb25maWcgZmlsZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuIG9wdGlvbmFsIGNvbW1hbmQtbGluZQorCWFyZ3VtZW50LgorCisnY2xvbmUnOjoKKwlSdW5zICdpbml0JyBhbmQgJ2ZldGNoJy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYQorCWRpcmVjdG9yeSBiYXNlZCBvbiB0aGUgYmFzZW5hbWUgb2YgdGhlIFVSTCBwYXNzZWQgdG8gaXQ7CisJb3IgaWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgcGFzc2VkOyBpdCB3aWxsIGNyZWF0ZSBhIGRpcmVjdG9yeQorCWFuZCB3b3JrIHdpdGhpbiB0aGF0LiAgSXQgYWNjZXB0cyBhbGwgYXJndW1lbnRzIHRoYXQgdGhlCisJJ2luaXQnIGFuZCAnZmV0Y2gnIGNvbW1hbmRzIGFjY2VwdDsgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCisJJy0tZmV0Y2gtYWxsJy4gICBBZnRlciBhIHJlcG9zaXRvcnkgaXMgY2xvbmVkLCB0aGUgJ2ZldGNoJworCWNvbW1hbmQgd2lsbCBiZSBhYmxlIHRvIHVwZGF0ZSByZXZpc2lvbnMgd2l0aG91dCBhZmZlY3RpbmcKKwl0aGUgd29ya2luZyB0cmVlOyBhbmQgdGhlICdyZWJhc2UnIGNvbW1hbmQgd2lsbCBiZSBhYmxlCisJdG8gdXBkYXRlIHRoZSB3b3JraW5nIHRyZWUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMuCisKKydyZWJhc2UnOjoKKwlUaGlzIGZldGNoZXMgcmV2aXNpb25zIGZyb20gdGhlIFNWTiBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgSEVBRAorCWFuZCByZWJhc2VzIHRoZSBjdXJyZW50ICh1bmNvbW1pdHRlZCB0byBTVk4pIHdvcmsgYWdhaW5zdCBpdC4KKworVGhpcyB3b3JrcyBzaW1pbGFybHkgdG8gJ3N2biB1cGRhdGUnIG9yICdnaXQtcHVsbCcgZXhjZXB0IHRoYXQKK2l0IHByZXNlcnZlcyBsaW5lYXIgaGlzdG9yeSB3aXRoICdnaXQtcmViYXNlJyBpbnN0ZWFkIG9mCisnZ2l0LW1lcmdlJyBmb3IgZWFzZSBvZiBkY29tbWl0LWluZyB3aXRoIGdpdC1zdm4uCisKK1RoaXMgYWNjZXB0cyBhbGwgb3B0aW9ucyB0aGF0ICdnaXQtc3ZuIGZldGNoJyBhbmQgJ2dpdC1yZWJhc2UnCithY2NlcHRzLiAgSG93ZXZlciAnLS1mZXRjaC1hbGwnIG9ubHkgZmV0Y2hlcyBmcm9tIHRoZSBjdXJyZW50Citbc3ZuLXJlbW90ZV0sIGFuZCBub3QgYWxsIFtzdm4tcmVtb3RlXSBkZWZpbml0aW9ucy4KKworTGlrZSAnZ2l0LXJlYmFzZSc7IHRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgd29ya2luZyB0cmVlIGJlIGNsZWFuCithbmQgaGF2ZSBubyB1bmNvbW1pdHRlZCBjaGFuZ2VzLgorCistbDs7CistLWxvY2FsOzsKKwlEbyBub3QgZmV0Y2ggcmVtb3RlbHk7IG9ubHkgcnVuICdnaXQtcmViYXNlJyBhZ2FpbnN0IHRoZQorCWxhc3QgZmV0Y2hlZCBjb21taXQgZnJvbSB0aGUgdXBzdHJlYW0gU1ZOLgorCisnZGNvbW1pdCc6OgorCUNvbW1pdCBlYWNoIGRpZmYgZnJvbSBhIHNwZWNpZmllZCBoZWFkIGRpcmVjdGx5IHRvIHRoZSBTVk4KKwlyZXBvc2l0b3J5LCBhbmQgdGhlbiByZWJhc2Ugb3IgcmVzZXQgKGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yCisJbm90IHRoZXJlIGlzIGEgZGlmZiBiZXR3ZWVuIFNWTiBhbmQgaGVhZCkuICBUaGlzIHdpbGwgY3JlYXRlCisJYSByZXZpc2lvbiBpbiBTVk4gZm9yIGVhY2ggY29tbWl0IGluIGdpdC4KKwlJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBydW4gZ2l0LXN2biBmZXRjaCBhbmQgcmViYXNlIChub3QKKwlwdWxsIG9yIG1lcmdlKSB5b3VyIGNvbW1pdHMgYWdhaW5zdCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gdGhlCisJU1ZOIHJlcG9zaXRvcnkuCisJQW4gb3B0aW9uYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQgYXMgYW4KKwlhbHRlcm5hdGl2ZSB0byBIRUFELgorCVRoaXMgaXMgYWR2YW50YWdlb3VzIG92ZXIgJ3NldC10cmVlJyAoYmVsb3cpIGJlY2F1c2UgaXQgcHJvZHVjZXMKKwljbGVhbmVyLCBtb3JlIGxpbmVhciBoaXN0b3J5LgorKworLS1uby1yZWJhc2U7OworCUFmdGVyIGNvbW1pdHRpbmcsIGRvIG5vdCByZWJhc2Ugb3IgcmVzZXQuCistLQorCisnbG9nJzo6CisJVGhpcyBzaG91bGQgbWFrZSBpdCBlYXN5IHRvIGxvb2sgdXAgc3ZuIGxvZyBtZXNzYWdlcyB3aGVuIHN2bgorCXVzZXJzIHJlZmVyIHRvIC1yLy0tcmV2aXNpb24gbnVtYmVycy4KKysKK1RoZSBmb2xsb3dpbmcgZmVhdHVyZXMgZnJvbSBgc3ZuIGxvZycgYXJlIHN1cHBvcnRlZDoKKysKKy0tCistLXJldmlzaW9uPTxuPls6PG4+XTs7CisJaXMgc3VwcG9ydGVkLCBub24tbnVtZXJpYyBhcmdzIGFyZSBub3Q6CisJSEVBRCwgTkVYVCwgQkFTRSwgUFJFViwgZXRjIC4uLgorLXYvLS12ZXJib3NlOzsKKwlpdCdzIG5vdCBjb21wbGV0ZWx5IGNvbXBhdGlibGUgd2l0aCB0aGUgLS12ZXJib3NlCisJb3V0cHV0IGluIHN2biBsb2csIGJ1dCByZWFzb25hYmx5IGNsb3NlLgorLS1saW1pdD08bj47OworCWlzIE5PVCB0aGUgc2FtZSBhcyAtLW1heC1jb3VudCwgZG9lc24ndCBjb3VudAorCW1lcmdlZC9leGNsdWRlZCBjb21taXRzCistLWluY3JlbWVudGFsOzsKKwlzdXBwb3J0ZWQKKy0tCisrCitOZXcgZmVhdHVyZXM6CisrCistLQorLS1zaG93LWNvbW1pdDs7CisJc2hvd3MgdGhlIGdpdCBjb21taXQgc2hhMSwgYXMgd2VsbAorLS1vbmVsaW5lOzsKKwlvdXIgdmVyc2lvbiBvZiAtLXByZXR0eT1vbmVsaW5lCistLQorKworQW55IG90aGVyIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIGBnaXQgbG9nJworCistLQorJ2ZpbmQtcmV2Jzo6CisJV2hlbiBnaXZlbiBhbiBTVk4gcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmb3JtICdyTicsIHJldHVybnMgdGhlCisJY29ycmVzcG9uZGluZyBnaXQgY29tbWl0IGhhc2ggKHRoaXMgY2FuIG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgYQorCXRyZWUtaXNoIHRvIHNwZWNpZnkgd2hpY2ggYnJhbmNoIHNob3VsZCBiZSBzZWFyY2hlZCkuICBXaGVuIGdpdmVuIGEKKwl0cmVlLWlzaCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBTVk4gcmV2aXNpb24gbnVtYmVyLgorCisnc2V0LXRyZWUnOjoKKwlZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nICdkY29tbWl0JyBpbnN0ZWFkIG9mIHRoaXMgY29tbWFuZC4KKwlDb21taXQgc3BlY2lmaWVkIGNvbW1pdCBvciB0cmVlIG9iamVjdHMgdG8gU1ZOLiAgVGhpcyByZWxpZXMgb24KKwl5b3VyIGltcG9ydGVkIGZldGNoIGRhdGEgYmVpbmcgdXAtdG8tZGF0ZS4gIFRoaXMgbWFrZXMKKwlhYnNvbHV0ZWx5IG5vIGF0dGVtcHRzIHRvIGRvIHBhdGNoaW5nIHdoZW4gY29tbWl0dGluZyB0byBTVk4sIGl0CisJc2ltcGx5IG92ZXJ3cml0ZXMgZmlsZXMgd2l0aCB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIHRyZWUgb3IKKwljb21taXQuICBBbGwgbWVyZ2luZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGFrZW4gcGxhY2UKKwlpbmRlcGVuZGVudGx5IG9mIGdpdC1zdm4gZnVuY3Rpb25zLgorCisnc2hvdy1pZ25vcmUnOjoKKwlSZWN1cnNpdmVseSBmaW5kcyBhbmQgbGlzdHMgdGhlIHN2bjppZ25vcmUgcHJvcGVydHkgb24KKwlkaXJlY3Rvcmllcy4gIFRoZSBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIGFwcGVuZGluZyB0bworCXRoZSAkR0lUX0RJUi9pbmZvL2V4Y2x1ZGUgZmlsZS4KKworJ2NvbW1pdC1kaWZmJzo6CisJQ29tbWl0cyB0aGUgZGlmZiBvZiB0d28gdHJlZS1pc2ggYXJndW1lbnRzIGZyb20gdGhlCisJY29tbWFuZC1saW5lLiAgVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGgKKwlnaXQtc3ZuaW1wb3J0IGFuZCBkb2VzIG5vdCByZWx5IG9uIGJlaW5nIGluc2lkZSBhbiBnaXQtc3ZuCisJaW5pdC1lZCByZXBvc2l0b3J5LiAgVGhpcyBjb21tYW5kIHRha2VzIHRocmVlIGFyZ3VtZW50cywgKGEpIHRoZQorCW9yaWdpbmFsIHRyZWUgdG8gZGlmZiBhZ2FpbnN0LCAoYikgdGhlIG5ldyB0cmVlIHJlc3VsdCwgKGMpIHRoZQorCVVSTCBvZiB0aGUgdGFyZ2V0IFN1YnZlcnNpb24gcmVwb3NpdG9yeS4gIFRoZSBmaW5hbCBhcmd1bWVudAorCShVUkwpIG1heSBiZSBvbWl0dGVkIGlmIHlvdSBhcmUgd29ya2luZyBmcm9tIGEgZ2l0LXN2bi1hd2FyZQorCXJlcG9zaXRvcnkgKHRoYXQgaGFzIGJlZW4gaW5pdC1lZCB3aXRoIGdpdC1zdm4pLgorCVRoZSAtcjxyZXZpc2lvbj4gb3B0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGlzLgorCistLQorCitPUFRJT05TCistLS0tLS0tCistLQorCistLXNoYXJlZFs9e2ZhbHNlfHRydWV8dW1hc2t8Z3JvdXB8YWxsfHdvcmxkfGV2ZXJ5Ym9keX1dOjoKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCU9ubHkgdXNlZCB3aXRoIHRoZSAnaW5pdCcgY29tbWFuZC4KKwlUaGVzZSBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIGdpdGxpbms6Z2l0LWluaXRbMV0uCisKKy1yIDxBUkc+OjoKKy0tcmV2aXNpb24gPEFSRz46OgorCitVc2VkIHdpdGggdGhlICdmZXRjaCcgY29tbWFuZC4KKworVGhpcyBhbGxvd3MgcmV2aXNpb24gcmFuZ2VzIGZvciBwYXJ0aWFsL2NhdXRlcml6ZWQgaGlzdG9yeQordG8gYmUgc3VwcG9ydGVkLiAgJE5VTUJFUiwgJE5VTUJFUjE6JE5VTUJFUjIgKG51bWVyaWMgcmFuZ2VzKSwKKyROVU1CRVI6SEVBRCwgYW5kIEJBU0U6JE5VTUJFUiBhcmUgYWxsIHN1cHBvcnRlZC4KKworVGhpcyBjYW4gYWxsb3cgeW91IHRvIG1ha2UgcGFydGlhbCBtaXJyb3JzIHdoZW4gcnVubmluZyBmZXRjaDsKK2J1dCBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgaGlzdG9yeSB3aWxsIGJlIHNraXBwZWQKK2FuZCBsb3N0LgorCistOjoKKy0tc3RkaW46OgorCitPbmx5IHVzZWQgd2l0aCB0aGUgJ3NldC10cmVlJyBjb21tYW5kLgorCitSZWFkIGEgbGlzdCBvZiBjb21taXRzIGZyb20gc3RkaW4gYW5kIGNvbW1pdCB0aGVtIGluIHJldmVyc2UKK29yZGVyLiAgT25seSB0aGUgbGVhZGluZyBzaGExIGlzIHJlYWQgZnJvbSBlYWNoIGxpbmUsIHNvCitnaXQtcmV2LWxpc3QgLS1wcmV0dHk9b25lbGluZSBvdXRwdXQgY2FuIGJlIHVzZWQuCisKKy0tcm1kaXI6OgorCitPbmx5IHVzZWQgd2l0aCB0aGUgJ2Rjb21taXQnLCAnc2V0LXRyZWUnIGFuZCAnY29tbWl0LWRpZmYnIGNvbW1hbmRzLgorCitSZW1vdmUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgU1ZOIHRyZWUgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGxlZnQKK2JlaGluZC4gIFNWTiBjYW4gdmVyc2lvbiBlbXB0eSBkaXJlY3RvcmllcywgYW5kIHRoZXkgYXJlIG5vdAorcmVtb3ZlZCBieSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0IGluIHRoZW0uICBnaXQKK2Nhbm5vdCB2ZXJzaW9uIGVtcHR5IGRpcmVjdG9yaWVzLiAgRW5hYmxpbmcgdGhpcyBmbGFnIHdpbGwgbWFrZQordGhlIGNvbW1pdCB0byBTVk4gYWN0IGxpa2UgZ2l0LgorCitjb25maWcga2V5OiBzdm4ucm1kaXIKKworLWU6OgorLS1lZGl0OjoKKworT25seSB1c2VkIHdpdGggdGhlICdkY29tbWl0JywgJ3NldC10cmVlJyBhbmQgJ2NvbW1pdC1kaWZmJyBjb21tYW5kcy4KKworRWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgYmVmb3JlIGNvbW1pdHRpbmcgdG8gU1ZOLiAgVGhpcyBpcyBvZmYgYnkKK2RlZmF1bHQgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29tbWl0cywgYW5kIGZvcmNlZCBvbiB3aGVuIGNvbW1pdHRpbmcKK3RyZWUgb2JqZWN0cy4KKworY29uZmlnIGtleTogc3ZuLmVkaXQKKworLWw8bnVtPjo6CistLWZpbmQtY29waWVzLWhhcmRlcjo6CisKK09ubHkgdXNlZCB3aXRoIHRoZSAnZGNvbW1pdCcsICdzZXQtdHJlZScgYW5kICdjb21taXQtZGlmZicgY29tbWFuZHMuCisKK1RoZXkgYXJlIGJvdGggcGFzc2VkIGRpcmVjdGx5IHRvIGdpdC1kaWZmLXRyZWUgc2VlCitnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1t2ZXJzZV0KK2NvbmZpZyBrZXk6IHN2bi5sCitjb25maWcga2V5OiBzdm4uZmluZGNvcGllc2hhcmRlcgorCistQTxmaWxlbmFtZT46OgorLS1hdXRob3JzLWZpbGU9PGZpbGVuYW1lPjo6CisKK1N5bnRheCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGZpbGVzIHVzZWQgYnkgZ2l0LXN2bmltcG9ydCBhbmQKK2dpdC1jdnNpbXBvcnQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWxvZ2lubmFtZSA9IEpvZSBVc2VyIDx1c2VyQGV4YW1wbGUuY29tPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCBhbmQgZ2l0LXN2biBlbmNvdW50ZXJzIGFuIFNWTgorY29tbWl0dGVyIG5hbWUgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXV0aG9ycy1maWxlLCBnaXQtc3ZuCit3aWxsIGFib3J0IG9wZXJhdGlvbi4gVGhlIHVzZXIgd2lsbCB0aGVuIGhhdmUgdG8gYWRkIHRoZQorYXBwcm9wcmlhdGUgZW50cnkuICBSZS1ydW5uaW5nIHRoZSBwcmV2aW91cyBnaXQtc3ZuIGNvbW1hbmQKK2FmdGVyIHRoZSBhdXRob3JzLWZpbGUgaXMgbW9kaWZpZWQgc2hvdWxkIGNvbnRpbnVlIG9wZXJhdGlvbi4KKworY29uZmlnIGtleTogc3ZuLmF1dGhvcnNmaWxlCisKKy1xOjoKKy0tcXVpZXQ6OgorCU1ha2UgZ2l0LXN2biBsZXNzIHZlcmJvc2UuCisKKy0tcmVwYWNrWz08bj5dOjoKKy0tcmVwYWNrLWZsYWdzPTxmbGFncz46OgorCitUaGVzZSBzaG91bGQgaGVscCBrZWVwIGRpc2sgdXNhZ2Ugc2FuZSBmb3IgbGFyZ2UgZmV0Y2hlcword2l0aCBtYW55IHJldmlzaW9ucy4KKworLS1yZXBhY2sgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgZm9yIHRoZSBudW1iZXIgb2YgcmV2aXNpb25zCit0byBmZXRjaCBiZWZvcmUgcmVwYWNraW5nLiAgVGhpcyBkZWZhdWx0cyB0byByZXBhY2tpbmcgZXZlcnkKKzEwMDAgY29tbWl0cyBmZXRjaGVkIGlmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KKworLS1yZXBhY2stZmxhZ3MgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBnaXRsaW5rOmdpdC1yZXBhY2tbMV0uCisKK1t2ZXJzZV0KK2NvbmZpZyBrZXk6IHN2bi5yZXBhY2sKK2NvbmZpZyBrZXk6IHN2bi5yZXBhY2tmbGFncworCistbTo6CistLW1lcmdlOjoKKy1zPHN0cmF0ZWd5Pjo6CistLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCitUaGVzZSBhcmUgb25seSB1c2VkIHdpdGggdGhlICdkY29tbWl0JyBhbmQgJ3JlYmFzZScgY29tbWFuZHMuCisKK1Bhc3NlZCBkaXJlY3RseSB0byBnaXQtcmViYXNlIHdoZW4gdXNpbmcgJ2Rjb21taXQnIGlmIGEKKydnaXQtcmVzZXQnIGNhbm5vdCBiZSB1c2VkIChzZWUgZGNvbW1pdCkuCisKKy1uOjoKKy0tZHJ5LXJ1bjo6CisKK1RoaXMgaXMgb25seSB1c2VkIHdpdGggdGhlICdkY29tbWl0JyBjb21tYW5kLgorCitQcmludCBvdXQgdGhlIHNlcmllcyBvZiBnaXQgYXJndW1lbnRzIHRoYXQgd291bGQgc2hvdword2hpY2ggZGlmZnMgd291bGQgYmUgY29tbWl0dGVkIHRvIFNWTi4KKworLS0KKworQURWQU5DRUQgT1BUSU9OUworLS0tLS0tLS0tLS0tLS0tLQorLS0KKworLWk8R0lUX1NWTl9JRD46OgorLS1pZCA8R0lUX1NWTl9JRD46OgorCitUaGlzIHNldHMgR0lUX1NWTl9JRCAoaW5zdGVhZCBvZiB1c2luZyB0aGUgZW52aXJvbm1lbnQpLiAgVGhpcworYWxsb3dzIHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlZm5hbWUgdG8gZmV0Y2ggZnJvbQord2hlbiB0cmFja2luZyBhIHNpbmdsZSBVUkwuICBUaGUgJ2xvZycgYW5kICdkY29tbWl0JyBjb21tYW5kcworbm8gbG9uZ2VyIHJlcXVpcmUgdGhpcyBzd2l0Y2ggYXMgYW4gYXJndW1lbnQuCisKKy1SPHJlbW90ZSBuYW1lPjo6CistLXN2bi1yZW1vdGUgPHJlbW90ZSBuYW1lPjo6CisJU3BlY2lmeSB0aGUgW3N2bi1yZW1vdGUgIjxyZW1vdGUgbmFtZT4iXSBzZWN0aW9uIHRvIHVzZSwKKwl0aGlzIGFsbG93cyBTVk4gbXVsdGlwbGUgcmVwb3NpdG9yaWVzIHRvIGJlIHRyYWNrZWQuCisJRGVmYXVsdDogInN2biIKKworLS1mb2xsb3ctcGFyZW50OjoKKwlUaGlzIGlzIGVzcGVjaWFsbHkgaGVscGZ1bCB3aGVuIHdlJ3JlIHRyYWNraW5nIGEgZGlyZWN0b3J5CisJdGhhdCBoYXMgYmVlbiBtb3ZlZCBhcm91bmQgd2l0aGluIHRoZSByZXBvc2l0b3J5LCBvciBpZiB3ZQorCXN0YXJ0ZWQgdHJhY2tpbmcgYSBicmFuY2ggYW5kIG5ldmVyIHRyYWNrZWQgdGhlIHRydW5rIGl0IHdhcworCWRlc2NlbmRlZCBmcm9tLiBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB1c2UKKwktLW5vLWZvbGxvdy1wYXJlbnQgdG8gZGlzYWJsZSBpdC4KKworY29uZmlnIGtleTogc3ZuLmZvbGxvd3BhcmVudAorCistLQorQ09ORklHIEZJTEUtT05MWSBPUFRJT05TCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCisKK3N2bi5ub01ldGFkYXRhOjoKK3N2bi1yZW1vdGUuPG5hbWU+Lm5vTWV0YWRhdGE6OgorCitUaGlzIGdldHMgcmlkIG9mIHRoZSBnaXQtc3ZuLWlkOiBsaW5lcyBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGNvbW1pdC4KKworSWYgeW91IGxvc2UgeW91ciAuZ2l0L3N2bi9naXQtc3ZuLy5yZXZfZGIgZmlsZSwgZ2l0LXN2biB3aWxsIG5vdAorYmUgYWJsZSB0byByZWJ1aWxkIGl0IGFuZCB5b3Ugd29uJ3QgYmUgYWJsZSB0byBmZXRjaCBhZ2FpbiwKK2VpdGhlci4gIFRoaXMgaXMgZmluZSBmb3Igb25lLXNob3QgaW1wb3J0cy4KKworVGhlICdnaXQtc3ZuIGxvZycgY29tbWFuZCB3aWxsIG5vdCB3b3JrIG9uIHJlcG9zaXRvcmllcyB1c2luZwordGhpcywgZWl0aGVyLiAgVXNpbmcgdGhpcyBjb25mbGljdHMgd2l0aCB0aGUgJ3VzZVN2bVByb3BzJworb3B0aW9uIGZvciAoaG9wZWZ1bGx5KSBvYnZpb3VzIHJlYXNvbnMuCisKK3N2bi51c2VTdm1Qcm9wczo6Citzdm4tcmVtb3RlLjxuYW1lPi51c2VTdm1Qcm9wczo6CisKK1RoaXMgYWxsb3dzIGdpdC1zdm4gdG8gcmUtbWFwIHJlcG9zaXRvcnkgVVJMcyBhbmQgVVVJRHMgZnJvbQorbWlycm9ycyBjcmVhdGVkIHVzaW5nIFNWTjo6TWlycm9yIChvciBzdmspIGZvciBtZXRhZGF0YS4KKworSWYgYW4gU1ZOIHJldmlzaW9uIGhhcyBhIHByb3BlcnR5LCAic3ZtOmhlYWRyZXYiLCBpdCBpcyBsaWtlbHkKK3RoYXQgdGhlIHJldmlzaW9uIHdhcyBjcmVhdGVkIGJ5IFNWTjo6TWlycm9yIChhbHNvIHVzZWQgYnkgU1ZLKS4KK1RoZSBwcm9wZXJ0eSBjb250YWlucyBhIHJlcG9zaXRvcnkgVVVJRCBhbmQgYSByZXZpc2lvbi4gIFdlIHdhbnQKK3RvIG1ha2UgaXQgbG9vayBsaWtlIHdlIGFyZSBtaXJyb3JpbmcgdGhlIG9yaWdpbmFsIFVSTCwgc28KK2ludHJvZHVjZSBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG9yaWdpbmFsIGlkZW50aXR5CitVUkwgYW5kIFVVSUQsIGFuZCB1c2UgaXQgd2hlbiBnZW5lcmF0aW5nIG1ldGFkYXRhIGluIGNvbW1pdAorbWVzc2FnZXMuCisKK3N2bi51c2VTdm5zeW5jUHJvcHM6Ogorc3ZuLXJlbW90ZS48bmFtZT4udXNlU3Zuc3luY3Byb3BzOjoKKwlTaW1pbGFyIHRvIHRoZSB1c2VTdm1Qcm9wcyBvcHRpb247IHRoaXMgaXMgZm9yIHVzZXJzCisJb2YgdGhlIHN2bnN5bmMoMSkgY29tbWFuZCBkaXN0cmlidXRlZCB3aXRoIFNWTiAxLjQueCBhbmQKKwlsYXRlci4KKworc3ZuLXJlbW90ZS48bmFtZT4ucmV3cml0ZVJvb3Q6OgorCVRoaXMgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZSByZXBvc2l0b3JpZXMgZnJvbSBhbHRlcm5hdGUKKwlVUkxzLiAgRm9yIGV4YW1wbGUsIGFuIGFkbWluaXN0cmF0b3IgY291bGQgcnVuIGdpdC1zdm4gb24gdGhlCisJc2VydmVyIGxvY2FsbHkgKGFjY2Vzc2luZyB2aWEgZmlsZTovLykgYnV0IHdpc2ggdG8gZGlzdHJpYnV0ZQorCXRoZSByZXBvc2l0b3J5IHdpdGggYSBwdWJsaWMgaHR0cDovLyBvciBzdm46Ly8gVVJMIGluIHRoZQorCW1ldGFkYXRhIHNvIHVzZXJzIG9mIGl0IHdpbGwgc2VlIHRoZSBwdWJsaWMgVVJMLgorCitTaW5jZSB0aGUgbm9NZXRhZGF0YSwgcmV3cml0ZVJvb3QsIHVzZVN2bnN5bmNQcm9wcyBhbmQgdXNlU3ZtUHJvcHMKK29wdGlvbnMgYWxsIGFmZmVjdCB0aGUgbWV0YWRhdGEgZ2VuZXJhdGVkIGFuZCB1c2VkIGJ5IGdpdC1zdm47IHRoZXkKKyptdXN0KiBiZSBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBiZWZvcmUgYW55IGhpc3RvcnkgaXMgaW1wb3J0ZWQKK2FuZCB0aGVzZSBzZXR0aW5ncyBzaG91bGQgbmV2ZXIgYmUgY2hhbmdlZCBvbmNlIHRoZXkgYXJlIHNldC4KKworQWRkaXRpb25hbGx5LCBvbmx5IG9uZSBvZiB0aGVzZSBmb3VyIG9wdGlvbnMgY2FuIGJlIHVzZWQgcGVyLXN2bi1yZW1vdGUKK3NlY3Rpb24gYmVjYXVzZSB0aGV5IGFmZmVjdCB0aGUgJ2dpdC1zdm4taWQ6JyBtZXRhZGF0YSBsaW5lLgorCistLQorCitCQVNJQyBFWEFNUExFUworLS0tLS0tLS0tLS0tLS0KKworVHJhY2tpbmcgYW5kIGNvbnRyaWJ1dGluZyB0byBhIHRoZSB0cnVuayBvZiBhIFN1YnZlcnNpb24tbWFuYWdlZCBwcm9qZWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2xvbmUgYSByZXBvIChsaWtlIGdpdCBjbG9uZSk6CisJZ2l0LXN2biBjbG9uZSBodHRwOi8vc3ZuLmZvby5vcmcvcHJvamVjdC90cnVuaworIyBFbnRlciB0aGUgbmV3bHkgY2xvbmVkIGRpcmVjdG9yeToKKwljZCB0cnVuaworIyBZb3Ugc2hvdWxkIGJlIG9uIG1hc3RlciBicmFuY2gsIGRvdWJsZS1jaGVjayB3aXRoIGdpdC1icmFuY2gKKwlnaXQgYnJhbmNoCisjIERvIHNvbWUgd29yayBhbmQgY29tbWl0IGxvY2FsbHkgdG8gZ2l0OgorCWdpdCBjb21taXQgLi4uCisjIFNvbWV0aGluZyBpcyBjb21taXR0ZWQgdG8gU1ZOLCByZWJhc2UgeW91ciBsb2NhbCBjaGFuZ2VzIGFnYWluc3QgdGhlCisjIGxhdGVzdCBjaGFuZ2VzIGluIFNWTjoKKwlnaXQtc3ZuIHJlYmFzZQorIyBOb3cgY29tbWl0IHlvdXIgY2hhbmdlcyAodGhhdCB3ZXJlIGNvbW1pdHRlZCBwcmV2aW91c2x5IHVzaW5nIGdpdCkgdG8gU1ZOLAorIyBhcyB3ZWxsIGFzIGF1dG9tYXRpY2FsbHkgdXBkYXRpbmcgeW91ciB3b3JraW5nIEhFQUQ6CisJZ2l0LXN2biBkY29tbWl0CisjIEFwcGVuZCBzdm46aWdub3JlIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IGdpdCBleGNsdWRlIGZpbGU6CisJZ2l0LXN2biBzaG93LWlnbm9yZSA+PiAuZ2l0L2luZm8vZXhjbHVkZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RyYWNraW5nIGFuZCBjb250cmlidXRpbmcgdG8gYW4gZW50aXJlIFN1YnZlcnNpb24tbWFuYWdlZCBwcm9qZWN0CisoY29tcGxldGUgd2l0aCBhIHRydW5rLCB0YWdzIGFuZCBicmFuY2hlcyk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDbG9uZSBhIHJlcG8gKGxpa2UgZ2l0IGNsb25lKToKKwlnaXQtc3ZuIGNsb25lIGh0dHA6Ly9zdm4uZm9vLm9yZy9wcm9qZWN0IC1UIHRydW5rIC1iIGJyYW5jaGVzIC10IHRhZ3MKKyMgVmlldyBhbGwgYnJhbmNoZXMgYW5kIHRhZ3MgeW91IGhhdmUgY2xvbmVkOgorCWdpdCBicmFuY2ggLXIKKyMgUmVzZXQgeW91ciBtYXN0ZXIgdG8gdHJ1bmsgKG9yIGFueSBvdGhlciBicmFuY2gsIHJlcGxhY2luZyAndHJ1bmsnCisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIG5hbWUpOgorCWdpdCByZXNldCAtLWhhcmQgcmVtb3Rlcy90cnVuaworIyBZb3UgbWF5IG9ubHkgZGNvbW1pdCB0byBvbmUgYnJhbmNoL3RhZy90cnVuayBhdCBhIHRpbWUuICBUaGUgdXNhZ2UKKyMgb2YgZGNvbW1pdC9yZWJhc2Uvc2hvdy1pZ25vcmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGFib3ZlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JFQkFTRSBWUy4gUFVMTC9NRVJHRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yaWdpbmFsbHksIGdpdC1zdm4gcmVjb21tZW5kZWQgdGhhdCB0aGUgcmVtb3Rlcy9naXQtc3ZuIGJyYW5jaCBiZQorcHVsbGVkIG9yIG1lcmdlZCBmcm9tLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBhdXRob3IgZmF2b3JlZAorJ2dpdC1zdm4gc2V0LXRyZWUgQicgdG8gY29tbWl0IGEgc2luZ2xlIGhlYWQgcmF0aGVyIHRoYW4gdGhlCisnZ2l0LXN2biBzZXQtdHJlZSBBLi5CJyBub3RhdGlvbiB0byBjb21taXQgbXVsdGlwbGUgY29tbWl0cy4KKworSWYgeW91IHVzZSAnZ2l0LXN2biBzZXQtdHJlZSBBLi5CJyB0byBjb21taXQgc2V2ZXJhbCBkaWZmcyBhbmQgeW91IGRvCitub3QgaGF2ZSB0aGUgbGF0ZXN0IHJlbW90ZXMvZ2l0LXN2biBtZXJnZWQgaW50byBteS1icmFuY2gsIHlvdSBzaG91bGQKK3VzZSAnZ2l0LXN2biByZWJhc2UnIHRvIHVwZGF0ZSB5b3VyIHdvcmsgYnJhbmNoIGluc3RlYWQgb2YgJ2dpdCBwdWxsJyBvcgorJ2dpdCBtZXJnZScuICAncHVsbC9tZXJnZScgY2FuIGNhdXNlIG5vbi1saW5lYXIgaGlzdG9yeSB0byBiZSBmbGF0dGVuZWQKK3doZW4gY29tbWl0dGluZyBpbnRvIFNWTiwgd2hpY2ggY2FuIGxlYWQgdG8gbWVyZ2UgY29tbWl0cyByZXZlcnNpbmcKK3ByZXZpb3VzIGNvbW1pdHMgaW4gU1ZOLgorCitERVNJR04gUEhJTE9TT1BIWQorLS0tLS0tLS0tLS0tLS0tLS0KK01lcmdlIHRyYWNraW5nIGluIFN1YnZlcnNpb24gaXMgbGFja2luZyBhbmQgZG9pbmcgYnJhbmNoZWQgZGV2ZWxvcG1lbnQKK3dpdGggU3VidmVyc2lvbiBpcyBjdW1iZXJzb21lIGFzIGEgcmVzdWx0LiAgZ2l0LXN2biBkb2VzIG5vdCBkbworYXV0b21hdGVkIG1lcmdlL2JyYW5jaCB0cmFja2luZyBieSBkZWZhdWx0IGFuZCBsZWF2ZXMgaXQgZW50aXJlbHkgdXAgdG8KK3RoZSB1c2VyIG9uIHRoZSBnaXQgc2lkZS4gIGdpdC1zdm4gZG9lcyBob3dldmVyIGZvbGxvdyBjb3B5CitoaXN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBpdCBpcyB0cmFja2luZywgaG93ZXZlciAobXVjaCBsaWtlCitob3cgJ3N2biBsb2cnIHdvcmtzKS4KKworQlVHUworLS0tLQorCitXZSBpZ25vcmUgYWxsIFNWTiBwcm9wZXJ0aWVzIGV4Y2VwdCBzdm46ZXhlY3V0YWJsZS4gIEFueSB1bmhhbmRsZWQKK3Byb3BlcnRpZXMgYXJlIGxvZ2dlZCB0byAkR0lUX0RJUi9zdm4vPHJlZm5hbWU+L3VuaGFuZGxlZC5sb2cKKworUmVuYW1lZCBhbmQgY29waWVkIGRpcmVjdG9yaWVzIGFyZSBub3QgZGV0ZWN0ZWQgYnkgZ2l0IGFuZCBoZW5jZSBub3QKK3RyYWNrZWQgd2hlbiBjb21taXR0aW5nIHRvIFNWTi4gIEkgZG8gbm90IHBsYW4gb24gYWRkaW5nIHN1cHBvcnQgZm9yCit0aGlzIGFzIGl0J3MgcXVpdGUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZyB0byBnZXQgd29ya2luZyBmb3IgYWxsCit0aGUgcG9zc2libGUgY29ybmVyIGNhc2VzIChnaXQgZG9lc24ndCBkbyBpdCwgZWl0aGVyKS4gIENvbW1pdHRpbmcKK3JlbmFtZWQgYW5kIGNvcGllZCBmaWxlcyBhcmUgZnVsbHkgc3VwcG9ydGVkIGlmIHRoZXkncmUgc2ltaWxhciBlbm91Z2gKK2ZvciBnaXQgdG8gZGV0ZWN0IHRoZW0uCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KKworZ2l0LXN2biBzdG9yZXMgW3N2bi1yZW1vdGVdIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gdGhlCityZXBvc2l0b3J5IC5naXQvY29uZmlnIGZpbGUuICBJdCBpcyBzaW1pbGFyIHRoZSBjb3JlIGdpdAorW3JlbW90ZV0gc2VjdGlvbnMgZXhjZXB0ICdmZXRjaCcga2V5cyBkbyBub3QgYWNjZXB0IGdsb2IKK2FyZ3VtZW50czsgYnV0IHRoZXkgYXJlIGluc3RlYWQgaGFuZGxlZCBieSB0aGUgJ2JyYW5jaGVzJworYW5kICd0YWdzJyBrZXlzLiAgU2luY2Ugc29tZSBTVk4gcmVwb3NpdG9yaWVzIGFyZSBvZGRseQorY29uZmlndXJlZCB3aXRoIG11bHRpcGxlIHByb2plY3RzIGdsb2IgZXhwYW5zaW9ucyBzdWNoIHRob3NlCitsaXN0ZWQgYmVsb3cgYXJlIGFsbG93ZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW3N2bi1yZW1vdGUgInByb2plY3QtYSJdCisJdXJsID0gaHR0cDovL3NlcnZlci5vcmcvc3ZuCisJYnJhbmNoZXMgPSBicmFuY2hlcy8qL3Byb2plY3QtYTpyZWZzL3JlbW90ZXMvcHJvamVjdC1hL2JyYW5jaGVzLyoKKwl0YWdzID0gdGFncy8qL3Byb2plY3QtYTpyZWZzL3JlbW90ZXMvcHJvamVjdC1hL3RhZ3MvKgorCXRydW5rID0gdHJ1bmsvcHJvamVjdC1hOnJlZnMvcmVtb3Rlcy9wcm9qZWN0LWEvdHJ1bmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitLZWVwIGluIG1pbmQgdGhhdCB0aGUgJyonIChhc3Rlcmlzaykgd2lsZGNhcmQgb2YgdGhlIGxvY2FsIHJlZgorKGxlZnQgb2YgdGhlICc6JykgKm11c3QqIGJlIHRoZSBmYXJ0aGVzdCByaWdodCBwYXRoIGNvbXBvbmVudDsKK2hvd2V2ZXIgdGhlIHJlbW90ZSB3aWxkY2FyZCBtYXkgYmUgYW55d2hlcmUgYXMgbG9uZyBhcyBpdCdzIG93bgoraW5kZXBlbmRlbnQgcGF0aCBjb21wb25ldCAoc3Vycm91bmRlZCBieSAnLycgb3IgRU9MKS4gICBUaGlzCit0eXBlIG9mIGNvbmZpZ3VyYXRpb24gaXMgbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSAnaW5pdCcgYW5kCitzaG91bGQgYmUgbWFudWFsbHkgZW50ZXJlZCB3aXRoIGEgdGV4dC1lZGl0b3Igb3IgdXNpbmcKK2dpdGxpbms6Z2l0LWNvbmZpZ1sxXQorCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXJlYmFzZVsxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ZuaW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZTdkOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKQEAgLTAsMCArMSwxNzcgQEAKK2dpdC1zdm5pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KK3YwLjEsIEp1bHkgMjAwNQorCitOQU1FCistLS0tCitnaXQtc3ZuaW1wb3J0IC0gSW1wb3J0IGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc3ZuaW1wb3J0JyBbIC1vIDxicmFuY2gtZm9yLUhFQUQ+IF0gWyAtaCBdIFsgLXYgXSBbIC1kIHwgLUQgXQorCQlbIC1DIDxHSVRfcmVwb3NpdG9yeT4gXSBbIC1pIF0gWyAtdSBdIFstbCBsaW1pdF9yZXZdCisJCVsgLWIgYnJhbmNoX3N1YmRpciBdIFsgLVQgdHJ1bmtfc3ViZGlyIF0gWyAtdCB0YWdfc3ViZGlyIF0KKwkJWyAtcyBzdGFydF9jaGcgXSBbIC1tIF0gWyAtciBdIFsgLU0gcmVnZXggXQorCQlbIC1JIDxpZ25vcmVmaWxlX25hbWU+IF0gWyAtQSA8YXV0aG9yX2ZpbGU+IF0KKwkJWyAtUiA8cmVwYWNrX2VhY2hfcmV2cz5dIFsgLVAgPHBhdGhfZnJvbV90cnVuaz4gXQorCQk8U1ZOX3JlcG9zaXRvcnlfVVJMPiBbIDxwYXRoPiBdCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQuIEl0IHdpbGwgZWl0aGVyIGNyZWF0ZSBhIG5ldworcmVwb3NpdG9yeSwgb3IgaW5jcmVtZW50YWxseSBpbXBvcnQgaW50byBhbiBleGlzdGluZyBvbmUuCisKK1NWTiBhY2Nlc3MgaXMgZG9uZSBieSB0aGUgU1ZOOjpQZXJsIG1vZHVsZS4KKworZ2l0LXN2bmltcG9ydCBhc3N1bWVzIHRoYXQgU1ZOIHJlcG9zaXRvcmllcyBhcmUgb3JnYW5pemVkIGludG8gb25lCisidHJ1bmsiIGRpcmVjdG9yeSB3aGVyZSB0aGUgbWFpbiBkZXZlbG9wbWVudCBoYXBwZW5zLCAiYnJhbmNoZXMvRk9PIgorZGlyZWN0b3JpZXMgZm9yIGJyYW5jaGVzLCBhbmQgIi90YWdzL0ZPTyIgZGlyZWN0b3JpZXMgZm9yIHRhZ3MuCitPdGhlciBzdWJkaXJlY3RvcmllcyBhcmUgaWdub3JlZC4KKworZ2l0LXN2bmltcG9ydCBjcmVhdGVzIGEgZmlsZSAiLmdpdC9zdm4yZ2l0Iiwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yCitpbmNyZW1lbnRhbCBTVk4gaW1wb3J0cy4KKworT1BUSU9OUworLS0tLS0tLQorLUMgPHRhcmdldC1kaXI+OjoKKyAgICAgICAgVGhlIEdJVCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorICAgICAgICBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgRGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKy1zIDxzdGFydF9yZXY+OjoKKyAgICAgICAgU3RhcnQgaW1wb3J0aW5nIGF0IHRoaXMgU1ZOIGNoYW5nZSBudW1iZXIuIFRoZSAgZGVmYXVsdCBpcyAxLgorKworV2hlbiBpbXBvcnRpbmcgaW5jcmVtZW50YWxseSwgeW91IG1pZ2h0IG5lZWQgdG8gZWRpdCB0aGUgLmdpdC9zdm4yZ2l0IGZpbGUuCisKKy1pOjoKKwlJbXBvcnQtb25seTogZG9uJ3QgcGVyZm9ybSBhIGNoZWNrb3V0IGFmdGVyIGltcG9ydGluZy4gIFRoaXMgb3B0aW9uCisJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGluZGV4IHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKKwlub3QgY3JlYXRlIHRoZW0gaWYgdGhleSBkbyBub3QgZXhpc3QuCisKKy1UIDx0cnVua19zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gdHJ1bmsuIERlZmF1bHQgInRydW5rIi4KKworLXQgPHRhZ19zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gc3ViZGlyZWN0b3J5IGZvciB0YWdzLiBEZWZhdWx0ICJ0YWdzIi4KKworLWIgPGJyYW5jaF9zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gc3ViZGlyZWN0b3J5IGZvciBicmFuY2hlcy4gRGVmYXVsdCAiYnJhbmNoZXMiLgorCistbyA8YnJhbmNoLWZvci1IRUFEPjo6CisJVGhlICd0cnVuaycgYnJhbmNoIGZyb20gU1ZOIGlzIGltcG9ydGVkIHRvIHRoZSAnb3JpZ2luJyBicmFuY2ggd2l0aGluCisJdGhlIGdpdCByZXBvc2l0b3J5LiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gaW1wb3J0IGludG8gYQorCWRpZmZlcmVudCBicmFuY2guCisKKy1yOjoKKwlQcmVwZW5kICdyWDogJyB0byBjb21taXQgbWVzc2FnZXMsIHdoZXJlIFggaXMgdGhlIGltcG9ydGVkCisJc3VidmVyc2lvbiByZXZpc2lvbi4KKworLUkgPGlnbm9yZWZpbGVfbmFtZT46OgorCUltcG9ydCB0aGUgc3ZuOmlnbm9yZSBkaXJlY3RvcnkgcHJvcGVydHkgdG8gZmlsZXMgd2l0aCB0aGlzCisJbmFtZSBpbiBlYWNoIGRpcmVjdG9yeS4gKFRoZSBTdWJ2ZXJzaW9uIGFuZCBHSVQgaWdub3JlCisJc3ludGF4ZXMgYXJlIHNpbWlsYXIgZW5vdWdoIHRoYXQgdXNpbmcgdGhlIFN1YnZlcnNpb24gcGF0dGVybnMKKwlkaXJlY3RseSB3aXRoICItSSAuZ2l0aWdub3JlIiB3aWxsIGFsbW9zdCBhbHdheXMganVzdCB3b3JrLikKKworLUEgPGF1dGhvcl9maWxlPjo6CisJUmVhZCBhIGZpbGUgd2l0aCBsaW5lcyBvbiB0aGUgZm9ybQorKworLS0tLS0tCisJdXNlcm5hbWUgPSBVc2VyJ3MgRnVsbCBOYW1lIDxlbWFpbEBhZGRyLmVzPgorCistLS0tLS0KKysKK2FuZCB1c2UgIlVzZXIncyBGdWxsIE5hbWUgPGVtYWlsQGFkZHIuZXM+IiBhcyB0aGUgR0lUCithdXRob3IgYW5kIGNvbW1pdHRlciBmb3IgU3VidmVyc2lvbiBjb21taXRzIG1hZGUgYnkKKyJ1c2VybmFtZSIuIElmIGVuY291bnRlcmluZyBhIGNvbW1pdCBtYWRlIGJ5IGEgdXNlciBub3QgaW4gdGhlCitsaXN0LCBhYm9ydC4KKysKK0ZvciBjb252ZW5pZW5jZSwgdGhpcyBkYXRhIGlzIHNhdmVkIHRvICRHSVRfRElSL3N2bi1hdXRob3JzCitlYWNoIHRpbWUgdGhlIC1BIG9wdGlvbiBpcyBwcm92aWRlZCwgYW5kIHJlYWQgZnJvbSB0aGF0IHNhbWUKK2ZpbGUgZWFjaCB0aW1lIGdpdC1zdm5pbXBvcnQgaXMgcnVuIHdpdGggYW4gZXhpc3RpbmcgR0lUCityZXBvc2l0b3J5IHdpdGhvdXQgLUEuCisKKy1tOjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlLiBUaGlzIG9wdGlvbgorCXdpbGwgZW5hYmxlIGRlZmF1bHQgcmVnZXhlcyB0aGF0IHRyeSB0byBjYXB0dXJlIHRoZSBuYW1lIHNvdXJjZQorCWJyYW5jaCBuYW1lIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlLgorCistTSA8cmVnZXg+OjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBjdXN0b20KKwlyZWdleC4gSXQgY2FuIGJlIHVzZWQgd2l0aCAtbSB0byBhbHNvIHNlZSB0aGUgZGVmYXVsdCByZWdleGVzLgorCVlvdSBtdXN0IGVzY2FwZSBmb3J3YXJkIHNsYXNoZXMuCisKKy1sIDxtYXhfcmV2Pjo6CisJU3BlY2lmeSBhIG1heGltdW0gcmV2aXNpb24gbnVtYmVyIHRvIHB1bGwuCisrCitGb3JtZXJseSwgdGhpcyBvcHRpb24gY29udHJvbGxlZCBob3cgbWFueSByZXZpc2lvbnMgdG8gcHVsbCwKK2R1ZSB0byBTVk4gbWVtb3J5IGxlYWtzLiAoVGhlc2UgaGF2ZSBiZWVuIHdvcmtlZCBhcm91bmQuKQorCistUiA8cmVwYWNrX2VhY2hfcmV2cz46OgorCVNwZWNpZnkgaG93IG9mdGVuIGdpdCByZXBvc2l0b3J5IHNob3VsZCBiZSByZXBhY2tlZC4KKysKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDAuIGdpdC1zdm5pbXBvcnQgd2lsbCBkbyBpbXBvcnQgaW4gY2h1bmtzIG9mIDEwMDAKK3JldmlzaW9ucywgYWZ0ZXIgZWFjaCBjaHVuayBnaXQgcmVwb3NpdG9yeSB3aWxsIGJlIHJlcGFja2VkLiBUbyBkaXNhYmxlCit0aGlzIGJlaGF2aW9yIHNwZWNpZnkgc29tZSBiaWcgdmFsdWUgaGVyZSB3aGljaCBpcyBtb3RlIHRoYW4gbnVtYmVyIG9mCityZXZpc2lvbnMgdG8gaW1wb3J0LgorCistUCA8cGF0aF9mcm9tX3RydW5rPjo6CisJUGFydGlhbCBpbXBvcnQgb2YgdGhlIFNWTiB0cmVlLgorKworQnkgZGVmYXVsdCwgdGhlIHdob2xlIHRyZWUgb24gdGhlIFNWTiB0cnVuayAoL3RydW5rKSBpcyBpbXBvcnRlZC4KKyctUCBteS9wcm9qJyB3aWxsIGltcG9ydCBzdGFydGluZyBvbmx5IGZyb20gJy90cnVuay9teS9wcm9qJy4KK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGltcG9ydCBvbmUgcHJvamVjdCBmcm9tIGEKK3N2biByZXBvIHdoaWNoIGhvc3RzIG11bHRpcGxlIHByb2plY3RzIHVuZGVyIHRoZSBzYW1lIHRydW5rLgorCistdjo6CisJVmVyYm9zaXR5OiBsZXQgJ3N2bmltcG9ydCcgcmVwb3J0IHdoYXQgaXQgaXMgZG9pbmcuCisKKy1kOjoKKwlVc2UgZGlyZWN0IEhUVFAgcmVxdWVzdHMgaWYgcG9zc2libGUuIFRoZSAiPHBhdGg+IiBhcmd1bWVudCBpcyB1c2VkCisJb25seSBmb3IgcmV0cmlldmluZyB0aGUgU1ZOIGxvZ3M7IHRoZSBwYXRoIHRvIHRoZSBjb250ZW50cyBpcworCWluY2x1ZGVkIGluIHRoZSBTVk4gbG9nLgorCistRDo6CisJVXNlIGRpcmVjdCBIVFRQIHJlcXVlc3RzIGlmIHBvc3NpYmxlLiBUaGUgIjxwYXRoPiIgYXJndW1lbnQgaXMgdXNlZAorCWZvciByZXRyaWV2aW5nIHRoZSBsb2dzLCBhcyB3ZWxsIGFzIGZvciB0aGUgY29udGVudHMuCisrCitUaGVyZSdzIG5vIHNhZmUgd2F5IHRvIGF1dG9tYXRpY2FsbHkgZmluZCBvdXQgd2hpY2ggb2YgdGhlc2Ugb3B0aW9ucyB0bwordXNlLCBzbyB5b3UgbmVlZCB0byB0cnkgYm90aC4gVXN1YWxseSwgdGhlIG9uZSB0aGF0J3Mgd3Jvbmcgd2lsbCBkaWUKK3dpdGggYSA0MHggZXJyb3IgcHJldHR5IHF1aWNrbHkuCisKKzxTVk5fcmVwb3NpdG9yeV9VUkw+OjoKKwlUaGUgVVJMIG9mIHRoZSBTVk4gbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydC4gRm9yIGxvY2FsCisJcmVwb3NpdG9yaWVzLCB1c2UgImZpbGU6Ly8vYWJzb2x1dGUvcGF0aCIuCisrCitJZiB5b3UncmUgdXNpbmcgdGhlICItZCIgb3IgIi1EIiBvcHRpb24sIHRoaXMgaXMgdGhlIFVSTCBvZiB0aGUgU1ZOCityZXBvc2l0b3J5IGl0c2VsZjsgaXQgdXN1YWxseSBlbmRzIGluICIvc3ZuIi4KKworPHBhdGg+OjoKKwlUaGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGNoZWNrIG91dC4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KKworT3RoZXJ3aXNlLCBzdWNjZXNzIGlzIGluZGljYXRlZCB0aGUgVW5peCB3YXksIGkuZS4gYnkgc2ltcGx5IGV4aXRpbmcgd2l0aAorYSB6ZXJvIGV4aXQgc3RhdHVzLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4sIHdpdGggaGVscCBmcm9tCit2YXJpb3VzIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitCYXNlZCBvbiBhIGN2czJnaXQgc2NyaXB0IGJ5IHRoZSBzYW1lIGF1dGhvci4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ltYm9saWMtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4ZjcyMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKQEAgLTAsMCArMSw2MSBAQAorZ2l0LXN5bWJvbGljLXJlZigxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3ltYm9saWMtcmVmIC0gUmVhZCBhbmQgbW9kaWZ5IHN5bWJvbGljIHJlZnMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN5bWJvbGljLXJlZicgWy1xXSBbLW0gPHJlYXNvbj5dIDxuYW1lPiBbPHJlZj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGFyZ3VtZW50LCByZWFkcyB3aGljaCBicmFuY2ggaGVhZCB0aGUgZ2l2ZW4gc3ltYm9saWMKK3JlZiByZWZlcnMgdG8gYW5kIG91dHB1dHMgaXRzIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSBgLmdpdC9gCitkaXJlY3RvcnkuICBUeXBpY2FsbHkgeW91IHdvdWxkIGdpdmUgYEhFQURgIGFzIHRoZSA8bmFtZT4KK2FyZ3VtZW50IHRvIHNlZSBvbiB3aGljaCBicmFuY2ggeW91ciB3b3JraW5nIHRyZWUgaXMgb24uCisKK0dpdmUgdHdvIGFyZ3VtZW50cywgY3JlYXRlIG9yIHVwZGF0ZSBhIHN5bWJvbGljIHJlZiA8bmFtZT4gdG8KK3BvaW50IGF0IHRoZSBnaXZlbiBicmFuY2ggPHJlZj4uCisKK0Egc3ltYm9saWMgcmVmIGlzIGEgcmVndWxhciBmaWxlIHRoYXQgc3RvcmVzIGEgc3RyaW5nIHRoYXQKK2JlZ2lucyB3aXRoIGByZWY6IHJlZnMvYC4gIEZvciBleGFtcGxlLCB5b3VyIGAuZ2l0L0hFQURgIGlzCithIHJlZ3VsYXIgZmlsZSB3aG9zZSBjb250ZW50cyBpcyBgcmVmOiByZWZzL2hlYWRzL21hc3RlcmAuCisKK09QVElPTlMKKy0tLS0tLS0KKworLXE6OgorCURvIG5vdCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSA8bmFtZT4gaXMgbm90IGEKKwlzeW1ib2xpYyByZWYgYnV0IGEgZGV0YWNoZWQgSEVBRDsgaW5zdGVhZCBleGl0IHdpdGgKKwlub24temVybyBzdGF0dXMgc2lsZW50bHkuCisKKy1tOjoKKwlVcGRhdGUgdGhlIHJlZmxvZyBmb3IgPG5hbWU+IHdpdGggPHJlYXNvbj4uICBUaGlzIGlzIHZhbGlkIG9ubHkKKwl3aGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgc3ltYm9saWMgcmVmLgorCitOT1RFUworLS0tLS0KK0luIHRoZSBwYXN0LCBgLmdpdC9IRUFEYCB3YXMgYSBzeW1ib2xpYyBsaW5rIHBvaW50aW5nIGF0CitgcmVmcy9oZWFkcy9tYXN0ZXJgLiAgV2hlbiB3ZSB3YW50ZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgYnJhbmNoLAord2UgZGlkIGBsbiAtc2YgcmVmcy9oZWFkcy9uZXdicmFuY2ggLmdpdC9IRUFEYCwgYW5kIHdoZW4gd2Ugd2FudGVkCit0byBmaW5kIG91dCB3aGljaCBicmFuY2ggd2UgYXJlIG9uLCB3ZSBkaWQgYHJlYWRsaW5rIC5naXQvSEVBRGAuCitUaGlzIHdhcyBmaW5lLCBhbmQgaW50ZXJuYWxseSB0aGF0IGlzIHdoYXQgc3RpbGwgaGFwcGVucyBieQorZGVmYXVsdCwgYnV0IG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBoYXZlIHdvcmtpbmcgc3ltbGlua3MsCitvciB0aGF0IGRvIG5vdCBoYXZlIHRoZSBgcmVhZGxpbmsoMSlgIGNvbW1hbmQsIHRoaXMgd2FzIGEgYml0CitjdW1iZXJzb21lLiAgT24gc29tZSBwbGF0Zm9ybXMsIGBsbiAtc2ZgIGRvZXMgbm90IGV2ZW4gd29yayBhcworYWR2ZXJ0aXNlZCAoaG9ycm9ycykuICBUaGVyZWZvcmUgc3ltYm9saWMgbGlua3MgYXJlIG5vdyBkZXByZWNhdGVkCithbmQgc3ltYm9saWMgcmVmcyBhcmUgdXNlZCBieSBkZWZhdWx0LgorCitnaXQtc3ltYm9saWMtcmVmIHdpbGwgZXhpdCB3aXRoIHN0YXR1cyAwIGlmIHRoZSBjb250ZW50cyBvZiB0aGUKK3N5bWJvbGljIHJlZiB3ZXJlIHByaW50ZWQgY29ycmVjdGx5LCB3aXRoIHN0YXR1cyAxIGlmIHRoZSByZXF1ZXN0ZWQKK25hbWUgaXMgbm90IGEgc3ltYm9saWMgcmVmLCBvciAxMjggaWYgYW5vdGhlciBlcnJvciBvY2N1cnMuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC10YWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTNlMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApAQCAtMCwwICsxLDIyOCBAQAorZ2l0LXRhZygxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdGFnIC0gQ3JlYXRlLCBsaXN0LCBkZWxldGUgb3IgdmVyaWZ5IGEgdGFnIG9iamVjdCBzaWduZWQgd2l0aCBHUEcKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtdGFnJyBbLWEgfCAtcyB8IC11IDxrZXktaWQ+XSBbLWZdIFstbSA8bXNnPiB8IC1GIDxmaWxlPl0gIDxuYW1lPiBbPGhlYWQ+XQorJ2dpdC10YWcnIC1kIDxuYW1lPi4uLgorJ2dpdC10YWcnIC1sIFs8cGF0dGVybj5dCisnZ2l0LXRhZycgLXYgPG5hbWU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQWRkcyBhICd0YWcnIHJlZmVyZW5jZSBpbiBgLmdpdC9yZWZzL3RhZ3MvYAorCitVbmxlc3MgYC1mYCBpcyBnaXZlbiwgdGhlIHRhZyBtdXN0IG5vdCB5ZXQgZXhpc3QgaW4KK2AuZ2l0L3JlZnMvdGFncy9gIGRpcmVjdG9yeS4KKworSWYgb25lIG9mIGAtYWAsIGAtc2AsIG9yIGAtdSA8a2V5LWlkPmAgaXMgcGFzc2VkLCB0aGUgY29tbWFuZAorY3JlYXRlcyBhICd0YWcnIG9iamVjdCwgYW5kIHJlcXVpcmVzIHRoZSB0YWcgbWVzc2FnZS4gIFVubGVzcworYC1tIDxtc2c+YCBpcyBnaXZlbiwgYW4gZWRpdG9yIGlzIHN0YXJ0ZWQgZm9yIHRoZSB1c2VyIHRvIHR5cGUKK2luIHRoZSB0YWcgbWVzc2FnZS4KKworT3RoZXJ3aXNlIGp1c3QgdGhlIFNIQTEgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdCBvYmplY3QgaXMKK3dyaXR0ZW4gKGkuZS4gYSBsaWdodHdlaWdodCB0YWcpLgorCitBIEdudVBHIHNpZ25lZCB0YWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGAtc2Agb3IgYC11Cis8a2V5LWlkPmAgaXMgdXNlZC4gIFdoZW4gYC11IDxrZXktaWQ+YCBpcyBub3QgdXNlZCwgdGhlCitjb21taXR0ZXIgaWRlbnRpdHkgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZCB0byBmaW5kIHRoZQorR251UEcga2V5IGZvciBzaWduaW5nLgorCitgLWQgPHRhZz5gIGRlbGV0ZXMgdGhlIHRhZy4KKworYC12IDx0YWc+YCB2ZXJpZmllcyB0aGUgZ3BnIHNpZ25hdHVyZSBvZiB0aGUgdGFnLgorCitgLWwgPHBhdHRlcm4+YCBsaXN0cyB0YWdzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gKG9yIGFsbAoraWYgbm8gcGF0dGVybiBpcyBnaXZlbikuCisKK09QVElPTlMKKy0tLS0tLS0KKy1hOjoKKwlNYWtlIGFuIHVuc2lnbmVkLCBhbm5vdGF0ZWQgdGFnIG9iamVjdAorCistczo6CisJTWFrZSBhIEdQRy1zaWduZWQgdGFnLCB1c2luZyB0aGUgZGVmYXVsdCBlLW1haWwgYWRkcmVzcydzIGtleQorCistdSA8a2V5LWlkPjo6CisJTWFrZSBhIEdQRy1zaWduZWQgdGFnLCB1c2luZyB0aGUgZ2l2ZW4ga2V5CisKKy1mOjoKKwlSZXBsYWNlIGFuIGV4aXN0aW5nIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lIChpbnN0ZWFkIG9mIGZhaWxpbmcpCisKKy1kOjoKKwlEZWxldGUgZXhpc3RpbmcgdGFncyB3aXRoIHRoZSBnaXZlbiBuYW1lcy4KKworLXY6OgorCVZlcmlmeSB0aGUgZ3BnIHNpZ25hdHVyZSBvZiBnaXZlbiB0aGUgdGFnCisKKy1sIDxwYXR0ZXJuPjo6CisJTGlzdCB0YWdzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gKG9yIGFsbCBpZiBubyBwYXR0ZXJuIGlzIGdpdmVuKS4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gdGFnIG1lc3NhZ2UgKGluc3RlYWQgb2YgcHJvbXB0aW5nKQorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIHRhZyBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorQnkgZGVmYXVsdCwgZ2l0LXRhZyBpbiBzaWduLXdpdGgtZGVmYXVsdCBtb2RlICgtcykgd2lsbCB1c2UgeW91cgorY29tbWl0dGVyIGlkZW50aXR5IChvZiB0aGUgZm9ybSAiWW91ciBOYW1lIDx5b3VyQGVtYWlsLmFkZHJlc3M+IikgdG8KK2ZpbmQgYSBrZXkuICBJZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBrZXksIHlvdSBjYW4gc3BlY2lmeQoraXQgaW4gdGhlIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBhcyBmb2xsb3dzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbdXNlcl0KKyAgICBzaWduaW5na2V5ID0gPGdwZy1rZXktaWQ+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitPbiBSZS10YWdnaW5nCit+fn5+fn5+fn5+fn5+CisKK1doYXQgc2hvdWxkIHlvdSBkbyB3aGVuIHlvdSB0YWcgYSB3cm9uZyBjb21taXQgYW5kIHlvdSB3b3VsZAord2FudCB0byByZS10YWc/CisKK0lmIHlvdSBuZXZlciBwdXNoZWQgYW55dGhpbmcgb3V0LCBqdXN0IHJlLXRhZyBpdC4gVXNlICItZiIgdG8KK3JlcGxhY2UgdGhlIG9sZCBvbmUuIEFuZCB5b3UncmUgZG9uZS4KKworQnV0IGlmIHlvdSBoYXZlIHB1c2hlZCB0aGluZ3Mgb3V0IChvciBvdGhlcnMgY291bGQganVzdCByZWFkCit5b3VyIHJlcG9zaXRvcnkgZGlyZWN0bHkpLCB0aGVuIG90aGVycyB3aWxsIGhhdmUgYWxyZWFkeSBzZWVuCit0aGUgb2xkIHRhZy4gSW4gdGhhdCBjYXNlIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CisKKy4gVGhlIHNhbmUgdGhpbmcuCitKdXN0IGFkbWl0IHlvdSBzY3Jld2VkIHVwLCBhbmQgdXNlIGEgZGlmZmVyZW50IG5hbWUuIE90aGVycyBoYXZlCithbHJlYWR5IHNlZW4gb25lIHRhZy1uYW1lLCBhbmQgaWYgeW91IGtlZXAgdGhlIHNhbWUgbmFtZSwgeW91CittYXkgYmUgaW4gdGhlIHNpdHVhdGlvbiB0aGF0IHR3byBwZW9wbGUgYm90aCBoYXZlICJ2ZXJzaW9uIFgiLAorYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSAnZGlmZmVyZW50JyAiWCIncy4gIFNvIGp1c3QgY2FsbCBpdCAiWC4xIgorYW5kIGJlIGRvbmUgd2l0aCBpdC4KKworLiBUaGUgaW5zYW5lIHRoaW5nLgorWW91IHJlYWxseSB3YW50IHRvIGNhbGwgdGhlIG5ldyB2ZXJzaW9uICJYIiB0b28sICdldmVuIHRob3VnaCcKK290aGVycyBoYXZlIGFscmVhZHkgc2VlbiB0aGUgb2xkIG9uZS4gU28ganVzdCB1c2UgImdpdCB0YWcgLWYiCithZ2FpbiwgYXMgaWYgeW91IGhhZG4ndCBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgb2xkIG9uZS4KKworSG93ZXZlciwgR2l0IGRvZXMgKm5vdCogKGFuZCBpdCBzaG91bGQgbm90KWNoYW5nZSB0YWdzIGJlaGluZAordXNlcnMgYmFjay4gU28gaWYgc29tZWJvZHkgYWxyZWFkeSBnb3QgdGhlIG9sZCB0YWcsIGRvaW5nIGEgImdpdAorcHVsbCIgb24geW91ciB0cmVlIHNob3VsZG4ndCBqdXN0IG1ha2UgdGhlbSBvdmVyd3JpdGUgdGhlIG9sZAorb25lLgorCitJZiBzb21lYm9keSBnb3QgYSByZWxlYXNlIHRhZyBmcm9tIHlvdSwgeW91IGNhbm5vdCBqdXN0IGNoYW5nZQordGhlIHRhZyBmb3IgdGhlbSBieSB1cGRhdGluZyB5b3VyIG93biBvbmUuIFRoaXMgaXMgYSBiaWcKK3NlY3VyaXR5IGlzc3VlLCBpbiB0aGF0IHBlb3BsZSBNVVNUIGJlIGFibGUgdG8gdHJ1c3QgdGhlaXIKK3RhZy1uYW1lcy4gIElmIHlvdSByZWFsbHkgd2FudCB0byBkbyB0aGUgaW5zYW5lIHRoaW5nLCB5b3UgbmVlZAordG8ganVzdCBmZXNzIHVwIHRvIGl0LCBhbmQgdGVsbCBwZW9wbGUgdGhhdCB5b3UgbWVzc2VkIHVwLiBZb3UKK2NhbiBkbyB0aGF0IGJ5IG1ha2luZyBhIHZlcnkgcHVibGljIGFubm91bmNlbWVudCBzYXlpbmc6CisKKy0tLS0tLS0tLS0tLQorT2ssIEkgbWVzc2VkIHVwLCBhbmQgSSBwdXNoZWQgb3V0IGFuIGVhcmxpZXIgdmVyc2lvbiB0YWdnZWQgYXMgWC4gSQordGhlbiBmaXhlZCBzb21ldGhpbmcsIGFuZCByZXRhZ2dlZCB0aGUgKmZpeGVkKiB0cmVlIGFzIFggYWdhaW4uCisKK0lmIHlvdSBnb3QgdGhlIHdyb25nIHRhZywgYW5kIHdhbnQgdGhlIG5ldyBvbmUsIHBsZWFzZSBkZWxldGUKK3RoZSBvbGQgb25lIGFuZCBmZXRjaCB0aGUgbmV3IG9uZSBieSBkb2luZzoKKworCWdpdCB0YWcgLWQgWAorCWdpdCBmZXRjaCBvcmlnaW4gdGFnIFgKKwordG8gZ2V0IG15IHVwZGF0ZWQgdGFnLgorCitZb3UgY2FuIHRlc3Qgd2hpY2ggdGFnIHlvdSBoYXZlIGJ5IGRvaW5nCisKKwlnaXQgcmV2LXBhcnNlIFgKKword2hpY2ggc2hvdWxkIHJldHVybiAwMTIzNDU2Nzg5YWJjZGVmLi4gaWYgeW91IGhhdmUgdGhlIG5ldyB2ZXJzaW9uLgorCitTb3JyeSBmb3IgaW5jb252ZW5pZW5jZS4KKy0tLS0tLS0tLS0tLQorCitEb2VzIHRoaXMgc2VlbSBhIGJpdCBjb21wbGljYXRlZD8gIEl0ICpzaG91bGQqIGJlLiBUaGVyZSBpcyBubword2F5IHRoYXQgaXQgd291bGQgYmUgY29ycmVjdCB0byBqdXN0ICJmaXgiIGl0IGJlaGluZCBwZW9wbGVzCitiYWNrcy4gUGVvcGxlIG5lZWQgdG8ga25vdyB0aGF0IHRoZWlyIHRhZ3MgbWlnaHQgaGF2ZSBiZWVuCitjaGFuZ2VkLgorCisKK09uIEF1dG9tYXRpYyBmb2xsb3dpbmcKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgeW91IGFyZSBmb2xsb3dpbmcgc29tZWJvZHkgZWxzZSdzIHRyZWUsIHlvdSBhcmUgbW9zdCBsaWtlbHkKK3VzaW5nIHRyYWNraW5nIGJyYW5jaGVzIChgcmVmcy9oZWFkcy9vcmlnaW5gIGluIHRyYWRpdGlvbmFsCitsYXlvdXQsIG9yIGByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcmAgaW4gdGhlIHNlcGFyYXRlLXJlbW90ZQorbGF5b3V0KS4gIFlvdSB1c3VhbGx5IHdhbnQgdGhlIHRhZ3MgZnJvbSB0aGUgb3RoZXIgZW5kLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGFyZSBmZXRjaGluZyBiZWNhdXNlIHlvdSB3b3VsZCB3YW50IGEKK29uZS1zaG90IG1lcmdlIGZyb20gc29tZWJvZHkgZWxzZSwgeW91IHR5cGljYWxseSBkbyBub3Qgd2FudCB0bworZ2V0IHRhZ3MgZnJvbSB0aGVyZS4gIFRoaXMgaGFwcGVucyBtb3JlIG9mdGVuIGZvciBwZW9wbGUgbmVhcgordGhlIHRvcGxldmVsIGJ1dCBub3QgbGltaXRlZCB0byB0aGVtLiAgTWVyZSBtb3J0YWxzIHdoZW4gcHVsbGluZworZnJvbSBlYWNoIG90aGVyIGRvIG5vdCBuZWNlc3NhcmlseSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZ2V0Citwcml2YXRlIGFuY2hvciBwb2ludCB0YWdzIGZyb20gdGhlIG90aGVyIHBlcnNvbi4KKworWW91IHdvdWxkIG5vdGljZSAicGxlYXNlIHB1bGwiIG1lc3NhZ2VzIG9uIHRoZSBtYWlsaW5nIGxpc3Qgc2F5cworcmVwbyBVUkwgYW5kIGJyYW5jaCBuYW1lIGFsb25lLiAgVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkKK2N1dCZwYXN0ZWQgdG8gImdpdCBmZXRjaCIgY29tbWFuZCBsaW5lOgorCistLS0tLS0tLS0tLS0KK0xpbnVzLCBwbGVhc2UgcHVsbCBmcm9tCisKKwlnaXQ6Ly9naXQuLi4uL3Byb2ouZ2l0IG1hc3RlcgorCit0byBnZXQgdGhlIGZvbGxvd2luZyB1cGRhdGVzLi4uCistLS0tLS0tLS0tLS0KKworYmVjb21lczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIGdpdDovL2dpdC4uLi4vcHJvai5naXQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworSW4gc3VjaCBhIGNhc2UsIHlvdSBkbyBub3Qgd2FudCB0byBhdXRvbWF0aWNhbGx5IGZvbGxvdyBvdGhlcidzCit0YWdzLgorCitPbmUgaW1wb3J0YW50IGFzcGVjdCBvZiBnaXQgaXMgaXQgaXMgZGlzdHJpYnV0ZWQsIGFuZCBiZWluZworZGlzdHJpYnV0ZWQgbGFyZ2VseSBtZWFucyB0aGVyZSBpcyBubyBpbmhlcmVudCAidXBzdHJlYW0iIG9yCisiZG93bnN0cmVhbSIgaW4gdGhlIHN5c3RlbS4gIE9uIHRoZSBmYWNlIG9mIGl0LCB0aGUgYWJvdmUKK2V4YW1wbGUgbWlnaHQgc2VlbSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgbmFtZXNwYWNlIGlzIG93bmVkCitieSB1cHBlciBlY2hlbG9uIG9mIHBlb3BsZSBhbmQgdGFncyBvbmx5IGZsb3cgZG93bndhcmRzLCBidXQKK3RoYXQgaXMgbm90IHRoZSBjYXNlLiAgSXQgb25seSBzaG93cyB0aGF0IHRoZSB1c2FnZSBwYXR0ZXJuCitkZXRlcm1pbmVzIHdobyBhcmUgaW50ZXJlc3RlZCBpbiB3aG9zZSB0YWdzLgorCitBIG9uZS1zaG90IHB1bGwgaXMgYSBzaWduIHRoYXQgYSBjb21taXQgaGlzdG9yeSBpcyBub3cgY3Jvc3NpbmcKK3RoZSBib3VuZGFyeSBiZXR3ZWVuIG9uZSBjaXJjbGUgb2YgcGVvcGxlIChlLmcuICJwZW9wbGUgd2hvIGFyZQorcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4gbmV0d29ya2luZyBwYXJ0IG9mIHRoZSBrZXJuZWwiKSB3aG8gbWF5CitoYXZlIHRoZWlyIG93biBzZXQgb2YgdGFncyAoZS5nLiAidGhpcyBpcyB0aGUgdGhpcmQgcmVsZWFzZQorY2FuZGlkYXRlIGZyb20gdGhlIG5ldHdvcmtpbmcgZ3JvdXAgdG8gYmUgcHJvcG9zZWQgZm9yIGdlbmVyYWwKK2NvbnN1bXB0aW9uIHdpdGggMi42LjIxIHJlbGVhc2UiKSB0byBhbm90aGVyIGNpcmNsZSBvZiBwZW9wbGUKKyhlLmcuICJwZW9wbGUgd2hvIGludGVncmF0ZSB2YXJpb3VzIHN1YnN5c3RlbSBpbXByb3ZlbWVudHMiKS4KK1RoZSBsYXR0ZXIgYXJlIHVzdWFsbHkgbm90IGludGVyZXN0ZWQgaW4gdGhlIGRldGFpbGVkIHRhZ3MgdXNlZAoraW50ZXJuYWxseSBpbiB0aGUgZm9ybWVyIGdyb3VwICh0aGF0IGlzIHdoYXQgImludGVybmFsIiBtZWFucykuCitUaGF0IGlzIHdoeSBpdCBpcyBkZXNpcmFibGUgbm90IHRvIGZvbGxvdyB0YWdzIGF1dG9tYXRpY2FsbHkgaW4KK3RoaXMgY2FzZS4KKworSXQgbWF5IHdlbGwgYmUgdGhhdCBhbW9uZyBuZXR3b3JraW5nIHBlb3BsZSwgdGhleSBtYXkgd2FudCB0bworZXhjaGFuZ2UgdGhlIHRhZ3MgaW50ZXJuYWwgdG8gdGhlaXIgZ3JvdXAsIGJ1dCBpbiB0aGF0IHdvcmtmbG93Cit0aGV5IGFyZSBtb3N0IGxpa2VseSB0cmFja2luZyB3aXRoIGVhY2ggb3RoZXIncyBwcm9ncmVzcyBieQoraGF2aW5nIHRyYWNraW5nIGJyYW5jaGVzLiAgQWdhaW4sIHRoZSBoZXVyaXN0aWMgdG8gYXV0b21hdGljYWxseQorZm9sbG93IHN1Y2ggdGFncyBpcyBhIGdvb2QgdGhpbmcuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdGFyLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdGFyLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGU3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC10YXItdHJlZS50eHQKQEAgLTAsMCArMSw5MyBAQAorZ2l0LXRhci10cmVlKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXRhci10cmVlIC0gQ3JlYXRlIGEgdGFyIGFyY2hpdmUgb2YgdGhlIGZpbGVzIGluIHRoZSBuYW1lZCB0cmVlIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC10YXItdHJlZScgWy0tcmVtb3RlPTxyZXBvPl0gPHRyZWUtaXNoPiBbIDxiYXNlPiBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVEhJUyBDT01NQU5EIElTIERFUFJFQ0FURUQuICBVc2UgYGdpdC1hcmNoaXZlYCB3aXRoIGAtLWZvcm1hdD10YXJgCitvcHRpb24gaW5zdGVhZCAoYW5kIG1vdmUgdGhlIDxiYXNlPiBhcmd1bWVudCB0byBgLS1wcmVmaXg9YmFzZS9gKS4KKworQ3JlYXRlcyBhIHRhciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIHRyZWUgc3RydWN0dXJlIGZvciB0aGUgbmFtZWQgdHJlZS4KK1doZW4gPGJhc2U+IGlzIHNwZWNpZmllZCBpdCBpcyBhZGRlZCBhcyBhIGxlYWRpbmcgcGF0aCB0byB0aGUgZmlsZXMgaW4gdGhlCitnZW5lcmF0ZWQgdGFyIGFyY2hpdmUuCisKK2dpdC10YXItdHJlZSBiZWhhdmVzIGRpZmZlcmVudGx5IHdoZW4gZ2l2ZW4gYSB0cmVlIElEIHZlcnN1cyB3aGVuIGdpdmVuCithIGNvbW1pdCBJRCBvciB0YWcgSUQuICBJbiB0aGUgZmlyc3QgY2FzZSB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQgYXMKK21vZGlmaWNhdGlvbiB0aW1lIG9mIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKK2NvbW1pdCB0aW1lIGFzIHJlY29yZGVkIGluIHRoZSByZWZlcmVuY2VkIGNvbW1pdCBvYmplY3QgaXMgdXNlZCBpbnN0ZWFkLgorQWRkaXRpb25hbGx5IHRoZSBjb21taXQgSUQgaXMgc3RvcmVkIGluIGEgZ2xvYmFsIGV4dGVuZGVkIHBheCBoZWFkZXIuCitJdCBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nIGdpdC1nZXQtdGFyLWNvbW1pdC1pZC4KKworT1BUSU9OUworLS0tLS0tLQorCis8dHJlZS1pc2g+OjoKKwlUaGUgdHJlZSBvciBjb21taXQgdG8gcHJvZHVjZSB0YXIgYXJjaGl2ZSBmb3IuICBJZiBpdCBpcworCXRoZSBvYmplY3QgbmFtZSBvZiBhIGNvbW1pdCBvYmplY3QuCisKKzxiYXNlPjo6CisJTGVhZGluZyBwYXRoIHRvIHRoZSBmaWxlcyBpbiB0aGUgcmVzdWx0aW5nIHRhciBhcmNoaXZlLgorCistLXJlbW90ZT08cmVwbz46OgorCUluc3RlYWQgb2YgbWFraW5nIGEgdGFyIGFyY2hpdmUgZnJvbSBsb2NhbCByZXBvc2l0b3J5LAorCXJldHJpZXZlIGEgdGFyIGFyY2hpdmUgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LgorCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCitCeSBkZWZhdWx0LCBmaWxlIGFuZCBkaXJlY3RvcmllcyBtb2RlcyBhcmUgc2V0IHRvIDA2NjYgb3IgMDc3Ny4gSXQgaXMKK3Bvc3NpYmxlIHRvIGNoYW5nZSB0aGlzIGJ5IHNldHRpbmcgdGhlICJ1bWFzayIgdmFyaWFibGUgaW4gdGhlCityZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gYXMgZm9sbG93cyA6CisKK1t0YXJdCisgICAgICAgIHVtYXNrID0gMDAyCTsjIGdyb3VwIGZyaWVuZGx5CisKK1RoZSBzcGVjaWFsIHVtYXNrIHZhbHVlICJ1c2VyIiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcidzIGN1cnJlbnQgdW1hc2sKK3dpbGwgYmUgdXNlZCBpbnN0ZWFkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDAyLCB3aGljaCBtZWFucyBncm91cAorcmVhZGFibGUvd3JpdGFibGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCitFWEFNUExFUworLS0tLS0tLS0KK2dpdCB0YXItdHJlZSBIRUFEIGp1bmsgfCAoY2QgL3Zhci90bXAvICYmIHRhciB4ZiAtKTo6CisKKwlDcmVhdGUgYSB0YXIgYXJjaGl2ZSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUKKwlsYXRlc3QgY29tbWl0IG9uIHRoZSBjdXJyZW50IGJyYW5jaCwgYW5kIGV4dHJhY3RzIGl0IGluCisJYC92YXIvdG1wL2p1bmtgIGRpcmVjdG9yeS4KKworZ2l0IHRhci10cmVlIHYxLjQuMCBnaXQtMS40LjAgfCBnemlwID5naXQtMS40LjAudGFyLmd6OjoKKworCUNyZWF0ZSBhIHRhcmJhbGwgZm9yIHYxLjQuMCByZWxlYXNlLgorCitnaXQgdGFyLXRyZWUgdjEuNC4we2NhcmV0fVx7dHJlZVx9IGdpdC0xLjQuMCB8IGd6aXAgPmdpdC0xLjQuMC50YXIuZ3o6OgorCisJQ3JlYXRlIGEgdGFyYmFsbCBmb3IgdjEuNC4wIHJlbGVhc2UsIGJ1dCB3aXRob3V0IGEKKwlnbG9iYWwgZXh0ZW5kZWQgcGF4IGhlYWRlci4KKworZ2l0IHRhci10cmVlIC0tcmVtb3RlPWV4YW1wbGUuY29tOmdpdC5naXQgdjEuNC4wID5naXQtMS40LjAudGFyOjoKKworCUdldCBhIHRhcmJhbGwgdjEuNC4wIGZyb20gZXhhbXBsZS5jb20uCisKK2dpdCB0YXItdHJlZSBIRUFEOkRvY3VtZW50YXRpb24vIGdpdC1kb2NzID4gZ2l0LTEuNC4wLWRvY3MudGFyOjoKKworCVB1dCBldmVyeXRoaW5nIGluIHRoZSBjdXJyZW50IGhlYWQncyBEb2N1bWVudGF0aW9uLyBkaXJlY3RvcnkKKwlpbnRvICdnaXQtMS40LjAtZG9jcy50YXInLCB3aXRoIHRoZSBwcmVmaXggJ2dpdC1kb2NzLycuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJlbmUgU2NoYXJmZS4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC10b29scy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC10b29scy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2NTNmZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXRvb2xzLnR4dApAQCAtMCwwICsxLDExNSBAQAorQSBzaG9ydCBnaXQgdG9vbHMgc3VydmV5Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitBcGFydCBmcm9tIGdpdCBjb250cmliLyBhcmVhIHRoZXJlIGFyZSBzb21lIG90aGVycyB0aGlyZC1wYXJ0eSB0b29scworeW91IG1heSB3YW50IHRvIGxvb2suCisKK1RoaXMgZG9jdW1lbnQgcHJlc2VudHMgYSBicmllZiBzdW1tYXJ5IG9mIGVhY2ggdG9vbCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKK2xpbmsuCisKKworQWx0ZXJuYXRpdmUvQXVnbWVudGF0aXZlIFBvcmNlbGFpbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIC0gKkNvZ2l0byogKGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2NvZ2l0by8pCisKKyAgIENvZ2l0byBpcyBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIGdpdCB0cmVlIGhpc3RvcnkKKyAgIHN0b3JhZ2Ugc3lzdGVtLiBJdCBhaW1zIGF0IHNlYW1sZXNzIHVzZXIgaW50ZXJmYWNlIGFuZCBlYXNlIG9mIHVzZSwKKyAgIHByb3ZpZGluZyBnZW5lcmFsbHkgc21vb3RoZXIgdXNlciBleHBlcmllbmNlIHRoYW4gdGhlICJyYXciIENvcmUgR0lUCisgICBpdHNlbGYgYW5kIGluZGVlZCBtYW55IG90aGVyIHZlcnNpb24gY29udHJvbCBzeXN0ZW1zLgorCisKKyAgIC0gKnBnKiAoaHR0cDovL3d3dy5zcGVhcmNlLm9yZy9jYXRlZ29yeS9wcm9qZWN0cy9zY20vcGcvKQorCisgICBwZyBpcyBhIHNoZWxsIHNjcmlwdCB3cmFwcGVyIGFyb3VuZCBHSVQgdG8gaGVscCB0aGUgdXNlciBtYW5hZ2UgYSBzZXQgb2YKKyAgIHBhdGNoZXMgdG8gZmlsZXMuIHBnIGlzIHNvbWV3aGF0IGxpa2UgcXVpbHQgb3IgU3RHSVQsIGJ1dCBpdCBkb2VzIGhhdmUgYQorICAgc2xpZ2h0bHkgZGlmZmVyZW50IGZlYXR1cmUgc2V0LgorCisKKyAgIC0gKlN0R2l0KiAoaHR0cDovL3d3dy5wcm9jb2RlLm9yZy9zdGdpdC8pCisKKyAgIFN0YWNrZWQgR0lUIHByb3ZpZGVzIGEgcXVpbHQtbGlrZSBwYXRjaCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgaW4gdGhlCisgICAgR0lUIGVudmlyb25tZW50LiBZb3UgY2FuIGVhc2lseSBtYW5hZ2UgeW91ciBwYXRjaGVzIGluIHRoZSBzY29wZSBvZiBHSVQKKyAgIHVudGlsIHRoZXkgZ2V0IG1lcmdlZCB1cHN0cmVhbS4KKworCitIaXN0b3J5IFZpZXdlcnMKKy0tLS0tLS0tLS0tLS0tLQorCisgICAtICpnaXRrKiAoc2hpcHBlZCB3aXRoIGdpdC1jb3JlKQorCisgICBnaXRrIGlzIGEgc2ltcGxlIFRrIEdVSSBmb3IgYnJvd3NpbmcgaGlzdG9yeSBvZiBHSVQgcmVwb3NpdG9yaWVzIGVhc2lseS4KKworCisgICAtICpnaXR2aWV3KiAgKGNvbnRyaWIvKQorCisgICBnaXR2aWV3IGlzIGEgR1RLIGJhc2VkIHJlcG9zaXRvcnkgYnJvd3NlciBmb3IgZ2l0CisKKworICAgLSAqZ2l0d2ViKiAoc2hpcHBlZCB3aXRoIGdpdC1jb3JlKQorCisgICBHSVR3ZWIgcHJvdmlkZXMgZnVsbC1mbGVkZ2VkIHdlYiBpbnRlcmZhY2UgZm9yIEdJVCByZXBvc2l0b3JpZXMuCisKKworICAgLSAqcWdpdCogKGh0dHA6Ly9kaWdpbGFuZGVyLmxpYmVyby5pdC9tY29zdGFsYmEvKQorCisgICBRR2l0IGlzIGEgZ2l0L1N0R0lUIEdVSSB2aWV3ZXIgYnVpbHQgb24gUXQvQysrLiBRR2l0IGNvdWxkIGJlIHVzZWQKKyAgIHRvIGJyb3dzZSBoaXN0b3J5IGFuZCBkaXJlY3RvcnkgdHJlZSwgdmlldyBhbm5vdGF0ZWQgZmlsZXMsIGNvbW1pdAorICAgY2hhbmdlcyBjaGVycnkgcGlja2luZyBzaW5nbGUgZmlsZXMgb3IgYXBwbHlpbmcgcGF0Y2hlcy4KKyAgIEN1cnJlbnRseSBpdCBpcyB0aGUgZmFzdGVzdCBhbmQgbW9zdCBmZWF0dXJlIHJpY2ggYW1vbmcgdGhlIGdpdAorICAgdmlld2VycyBhbmQgY29tbWl0IHRvb2xzLgorCisgICAtICp0aWcqIChodHRwOi8vam9uYXMubml0cm8uZGsvdGlnLykKKworICAgdGlnIGJ5IEpvbmFzIEZvbnNlY2EgaXMgYSBzaW1wbGUgZ2l0IHJlcG9zaXRvcnkgYnJvd3NlcgorICAgd3JpdHRlbiB1c2luZyBuY3Vyc2VzLiBCYXNpY2FsbHksIGl0IGp1c3QgYWN0cyBhcyBhIGZyb250LWVuZAorICAgZm9yIGdpdC1sb2cgYW5kIGdpdC1zaG93L2dpdC1kaWZmLiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gYWxzbworICAgdXNlIGl0IGFzIGEgcGFnZXIgZm9yIGdpdCBjb21tYW5kcy4KKworCitGb3JlaWduIFNDTSBpbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAtICpnaXQtc3ZuKiAoc2hpcHBlZCB3aXRoIGdpdC1jb3JlKQorCisgICBnaXQtc3ZuIGlzIGEgc2ltcGxlIGNvbmR1aXQgZm9yIGNoYW5nZXNldHMgYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uCisgICBicmFuY2ggYW5kIGdpdC4KKworCisgICAtICpxdWlsdDJnaXQgLyBnaXQycXVpbHQqIChodHRwOi8vaG9tZS10ai5vcmcvd2lraS9pbmRleC5waHAvTWlzYykKKworICAgVGhlc2UgdXRpbGl0aWVzIGNvbnZlcnQgcGF0Y2ggc2VyaWVzIGluIGEgcXVpbHQgcmVwb3NpdG9yeSBhbmQgY29tbWl0CisgICBzZXJpZXMgaW4gZ2l0IGJhY2sgYW5kIGZvcnRoLgorCisKKyAgIC0gKmhnLXRvLWdpdCogKGNvbnRyaWIvKQorCisgICBoZy10by1naXQgY29udmVydHMgYSBNZXJjdXJpYWwgcmVwb3NpdG9yeSBpbnRvIGEgZ2l0IG9uZSwgYW5kCisgICBwcmVzZXJ2ZXMgdGhlIGZ1bGwgYnJhbmNoIGhpc3RvcnkgaW4gdGhlIHByb2Nlc3MuIGhnLXRvLWdpdCBjYW4KKyAgIGFsc28gYmUgdXNlZCBpbiBhbiBpbmNyZW1lbnRhbCB3YXkgdG8ga2VlcCB0aGUgZ2l0IHJlcG9zaXRvcnkKKyAgIGluIHN5bmMgd2l0aCB0aGUgbWFzdGVyIE1lcmN1cmlhbCByZXBvc2l0b3J5LgorCisKK090aGVycworLS0tLS0tCisKKyAgIC0gKihoKWdjdCogKGh0dHA6Ly93d3cuY3lkLmxpdS5zZS91c2Vycy9+ZnJla3UwNDUvZ2N0LykKKworICAgQ29tbWl0IFRvb2wgb3IgKGgpZ2N0IGlzIGEgR1VJIGVuYWJsZWQgY29tbWl0IHRvb2wgZm9yIGdpdCBhbmQKKyAgIE1lcmN1cmlhbCAoaGcpLiBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gdmlldyBkaWZmcywgc2VsZWN0IHdoaWNoIGZpbGVzCisgICB0byBjb21taXR0ZWQgKG9yIGlnbm9yZWQgLyByZXZlcnRlZCkgd3JpdGUgY29tbWl0IG1lc3NhZ2VzIGFuZAorICAgcGVyZm9ybSB0aGUgY29tbWl0IGl0c2VsZi4KKworICAgLSAqZ2l0LmVsKiAoY29udHJpYi8pCisKKyAgIFRoaXMgaXMgYW4gRW1hY3MgaW50ZXJmYWNlIGZvciBnaXQuIFRoZSB1c2VyIGludGVyZmFjZSBpcyBtb2RlbGVkIG9uCisgICBwY2wtY3ZzLiBJdCBoYXMgYmVlbiBkZXZlbG9wZWQgb24gRW1hY3MgMjEgYW5kIHdpbGwgcHJvYmFibHkgbmVlZCBzb21lCisgICB0d2Vha2luZyB0byB3b3JrIG9uIFhFbWFjcy4KKworCitodHRwOi8vZ2l0Lm9yLmN6L2dpdHdpa2kvSW50ZXJmYWNlc0Zyb250ZW5kc0FuZFRvb2xzIGhhcyBtb3JlCitjb21wcmVoZW5zaXZlIGxpc3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stZmlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzZGM4MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1maWxlLnR4dApAQCAtMCwwICsxLDM2IEBACitnaXQtdW5wYWNrLWZpbGUoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdW5wYWNrLWZpbGUgLSBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgd2l0aCBhIGJsb2IncyBjb250ZW50cworCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVucGFjay1maWxlJyA8YmxvYj4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDcmVhdGVzIGEgZmlsZSBob2xkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBzcGVjaWZpZWQgYnkgc2hhMS4gSXQKK3JldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCS5tZXJnZV9maWxlX1hYWFhYCisKK09QVElPTlMKKy0tLS0tLS0KKzxibG9iPjo6CisJTXVzdCBiZSBhIGJsb2IgaWQKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWIzZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLW9iamVjdHMudHh0CkBAIC0wLDAgKzEsNTUgQEAKK2dpdC11bnBhY2stb2JqZWN0cygxKQorPT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11bnBhY2stb2JqZWN0cyAtIFVucGFjayBvYmplY3RzIGZyb20gYSBwYWNrZWQgYXJjaGl2ZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11bnBhY2stb2JqZWN0cycgWy1uXSBbLXFdIFstcl0gPHBhY2stZmlsZQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZCBhIHBhY2tlZCBhcmNoaXZlICgucGFjaykgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsIGV4cGFuZGluZwordGhlIG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiBhbmQgd3JpdGluZyB0aGVtIGludG8gdGhlIHJlcG9zaXRvcnkgaW4KKyJsb29zZSIgKG9uZSBvYmplY3QgcGVyIGZpbGUpIGZvcm1hdC4KKworT2JqZWN0cyB0aGF0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHJlcG9zaXRvcnkgd2lsbCAqbm90KiBiZSB1bnBhY2tlZAorZnJvbSB0aGUgcGFjay1maWxlLiAgVGhlcmVmb3JlLCBub3RoaW5nIHdpbGwgYmUgdW5wYWNrZWQgaWYgeW91IHVzZQordGhpcyBjb21tYW5kIG9uIGEgcGFjay1maWxlIHRoYXQgZXhpc3RzIHdpdGhpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuCisKK1BsZWFzZSBzZWUgdGhlIGBnaXQtcmVwYWNrYCBkb2N1bWVudGF0aW9uIGZvciBvcHRpb25zIHRvIGdlbmVyYXRlCituZXcgcGFja3MgYW5kIHJlcGxhY2UgZXhpc3Rpbmcgb25lcy4KKworT1BUSU9OUworLS0tLS0tLQorLW46OgorICAgICAgICBEcnkgcnVuLiAgQ2hlY2sgdGhlIHBhY2sgZmlsZSB3aXRob3V0IGFjdHVhbGx5IHVucGFja2luZworCXRoZSBvYmplY3RzLgorCistcTo6CisJVGhlIGNvbW1hbmQgdXN1YWxseSBzaG93cyBwZXJjZW50YWdlIHByb2dyZXNzLiAgVGhpcworCWZsYWcgc3VwcHJlc3NlcyBpdC4KKworLXI6OgorCVdoZW4gdW5wYWNraW5nIGEgY29ycnVwdCBwYWNrZmlsZSwgdGhlIGNvbW1hbmQgZGllcyBhdAorCXRoZSBmaXJzdCBjb3JydXB0aW9uLiAgVGhpcyBmbGFnIHRlbGxzIGl0IHRvIGtlZXAgZ29pbmcKKwlhbmQgbWFrZSB0aGUgYmVzdCBlZmZvcnQgdG8gcmVjb3ZlciBhcyBtYW55IG9iamVjdHMgYXMKKwlwb3NzaWJsZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmJkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtaW5kZXgudHh0CkBAIC0wLDAgKzEsMzI3IEBACitnaXQtdXBkYXRlLWluZGV4KDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtaW5kZXggLSBSZWdpc3RlciBmaWxlIGNvbnRlbnRzIGluIHRoZSB3b3JraW5nIHRyZWUgdG8gdGhlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXVwZGF0ZS1pbmRleCcKKwkgICAgIFstLWFkZF0gWy0tcmVtb3ZlIHwgLS1mb3JjZS1yZW1vdmVdIFstLXJlcGxhY2VdCisJICAgICBbLS1yZWZyZXNoXSBbLXFdIFstLXVubWVyZ2VkXSBbLS1pZ25vcmUtbWlzc2luZ10KKwkgICAgIFstLWNhY2hlaW5mbyA8bW9kZT4gPG9iamVjdD4gPGZpbGU+XVwqCisJICAgICBbLS1jaG1vZD0oK3wtKXhdCisJICAgICBbLS1hc3N1bWUtdW5jaGFuZ2VkIHwgLS1uby1hc3N1bWUtdW5jaGFuZ2VkXQorCSAgICAgWy0tcmVhbGx5LXJlZnJlc2hdIFstLXVucmVzb2x2ZV0gWy0tYWdhaW4gfCAtZ10KKwkgICAgIFstLWluZm8tb25seV0gWy0taW5kZXgtaW5mb10KKwkgICAgIFstel0gWy0tc3RkaW5dCisJICAgICBbLS12ZXJib3NlXQorCSAgICAgWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTW9kaWZpZXMgdGhlIGluZGV4IG9yIGRpcmVjdG9yeSBjYWNoZS4gRWFjaCBmaWxlIG1lbnRpb25lZCBpcyB1cGRhdGVkCitpbnRvIHRoZSBpbmRleCBhbmQgYW55ICd1bm1lcmdlZCcgb3IgJ25lZWRzIHVwZGF0aW5nJyBzdGF0ZSBpcworY2xlYXJlZC4KKworU2VlIGFsc28gZ2l0bGluazpnaXQtYWRkWzFdIGZvciBhIG1vcmUgdXNlci1mcmllbmRseSB3YXkgdG8gZG8gc29tZSBvZgordGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgb24gdGhlIGluZGV4LgorCitUaGUgd2F5ICJnaXQtdXBkYXRlLWluZGV4IiBoYW5kbGVzIGZpbGVzIGl0IGlzIHRvbGQgYWJvdXQgY2FuIGJlIG1vZGlmaWVkCit1c2luZyB0aGUgdmFyaW91cyBvcHRpb25zOgorCitPUFRJT05TCistLS0tLS0tCistLWFkZDo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpc24ndCBpbiB0aGUgaW5kZXggYWxyZWFkeSB0aGVuIGl0J3MKKwlhZGRlZC4KKwlEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBpZ25vcmUgbmV3IGZpbGVzLgorCistLXJlbW92ZTo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpcyBpbiB0aGUgaW5kZXggYnV0IGlzIG1pc3NpbmcgdGhlbiBpdCdzCisJcmVtb3ZlZC4KKwlEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGlnbm9yZSByZW1vdmVkIGZpbGUuCisKKy0tcmVmcmVzaDo6CisJTG9va3MgYXQgdGhlIGN1cnJlbnQgaW5kZXggYW5kIGNoZWNrcyB0byBzZWUgaWYgbWVyZ2VzIG9yCisJdXBkYXRlcyBhcmUgbmVlZGVkIGJ5IGNoZWNraW5nIHN0YXQoKSBpbmZvcm1hdGlvbi4KKworLXE6OgorICAgICAgICBRdWlldC4gIElmIC0tcmVmcmVzaCBmaW5kcyB0aGF0IHRoZSBpbmRleCBuZWVkcyBhbiB1cGRhdGUsIHRoZQorICAgICAgICBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGVycm9yIG91dC4gIFRoaXMgb3B0aW9uIG1ha2VzCisgICAgICAgIGdpdC11cGRhdGUtaW5kZXggY29udGludWUgYW55d2F5LgorCistLXVubWVyZ2VkOjoKKyAgICAgICAgSWYgLS1yZWZyZXNoIGZpbmRzIHVubWVyZ2VkIGNoYW5nZXMgaW4gdGhlIGluZGV4LCB0aGUgZGVmYXVsdAorICAgICAgICBiZWhhdmlvciBpcyB0byBlcnJvciBvdXQuICBUaGlzIG9wdGlvbiBtYWtlcyBnaXQtdXBkYXRlLWluZGV4IAorICAgICAgICBjb250aW51ZSBhbnl3YXkuCisKKy0taWdub3JlLW1pc3Npbmc6OgorCUlnbm9yZXMgbWlzc2luZyBmaWxlcyBkdXJpbmcgYSAtLXJlZnJlc2gKKworLS1jYWNoZWluZm8gPG1vZGU+IDxvYmplY3Q+IDxwYXRoPjo6CisJRGlyZWN0bHkgaW5zZXJ0IHRoZSBzcGVjaWZpZWQgaW5mbyBpbnRvIHRoZSBpbmRleC4KKwkKKy0taW5kZXgtaW5mbzo6CisgICAgICAgIFJlYWQgaW5kZXggaW5mb3JtYXRpb24gZnJvbSBzdGRpbi4KKworLS1jaG1vZD0oK3wtKXg6OgorICAgICAgICBTZXQgdGhlIGV4ZWN1dGUgcGVybWlzc2lvbnMgb24gdGhlIHVwZGF0ZWQgZmlsZXMuICAgICAgICAKKworLS1hc3N1bWUtdW5jaGFuZ2VkLCAtLW5vLWFzc3VtZS11bmNoYW5nZWQ6OgorCVdoZW4gdGhlc2UgZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIG9iamVjdCBuYW1lIHJlY29yZGVkCisJZm9yIHRoZSBwYXRocyBhcmUgbm90IHVwZGF0ZWQuICBJbnN0ZWFkLCB0aGVzZSBvcHRpb25zCisJc2V0cyBhbmQgdW5zZXRzIHRoZSAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IGZvciB0aGUKKwlwYXRocy4gIFdoZW4gdGhlICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQgaXMgb24sIGdpdCBzdG9wcworCWNoZWNraW5nIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMgZm9yIHBvc3NpYmxlCisJbW9kaWZpY2F0aW9ucywgc28geW91IG5lZWQgdG8gbWFudWFsbHkgdW5zZXQgdGhlIGJpdCB0bworCXRlbGwgZ2l0IHdoZW4geW91IGNoYW5nZSB0aGUgd29ya2luZyB0cmVlIGZpbGUuIFRoaXMgaXMKKwlzb21ldGltZXMgaGVscGZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBhIGJpZyBwcm9qZWN0IG9uIGEKKwlmaWxlc3lzdGVtIHRoYXQgaGFzIHZlcnkgc2xvdyBsc3RhdCgyKSBzeXN0ZW0gY2FsbAorCShlLmcuIGNpZnMpLgorCistLWFnYWluLCAtZzo6CisJUnVucyBgZ2l0LXVwZGF0ZS1pbmRleGAgaXRzZWxmIG9uIHRoZSBwYXRocyB3aG9zZSBpbmRleAorCWVudHJpZXMgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIGZyb20gdGhlIGBIRUFEYCBjb21taXQuCisKKy0tdW5yZXNvbHZlOjoKKwlSZXN0b3JlcyB0aGUgJ3VubWVyZ2VkJyBvciAnbmVlZHMgdXBkYXRpbmcnIHN0YXRlIG9mIGEKKwlmaWxlIGR1cmluZyBhIG1lcmdlIGlmIGl0IHdhcyBjbGVhcmVkIGJ5IGFjY2lkZW50LgorCistLWluZm8tb25seTo6CisJRG8gbm90IGNyZWF0ZSBvYmplY3RzIGluIHRoZSBvYmplY3QgZGF0YWJhc2UgZm9yIGFsbAorCTxmaWxlPiBhcmd1bWVudHMgdGhhdCBmb2xsb3cgdGhpcyBmbGFnOyBqdXN0IGluc2VydAorCXRoZWlyIG9iamVjdCBJRHMgaW50byB0aGUgaW5kZXguCisKKy0tZm9yY2UtcmVtb3ZlOjoKKwlSZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgaW5kZXggZXZlbiB3aGVuIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCXN0aWxsIGhhcyBzdWNoIGEgZmlsZS4gKEltcGxpZXMgLS1yZW1vdmUuKQorCistLXJlcGxhY2U6OgorCUJ5IGRlZmF1bHQsIHdoZW4gYSBmaWxlIGBwYXRoYCBleGlzdHMgaW4gdGhlIGluZGV4LAorCWdpdC11cGRhdGUtaW5kZXggcmVmdXNlcyBhbiBhdHRlbXB0IHRvIGFkZCBgcGF0aC9maWxlYC4KKwlTaW1pbGFybHkgaWYgYSBmaWxlIGBwYXRoL2ZpbGVgIGV4aXN0cywgYSBmaWxlIGBwYXRoYAorCWNhbm5vdCBiZSBhZGRlZC4gIFdpdGggLS1yZXBsYWNlIGZsYWcsIGV4aXN0aW5nIGVudHJpZXMKKwl0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBlbnRyeSBiZWluZyBhZGRlZCBhcmUKKwlhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzLgorCistLXN0ZGluOjoKKwlJbnN0ZWFkIG9mIHRha2luZyBsaXN0IG9mIHBhdGhzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKKwlyZWFkIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuICBQYXRocyBhcmUKKwlzZXBhcmF0ZWQgYnkgTEYgKGkuZS4gb25lIHBhdGggcGVyIGxpbmUpIGJ5IGRlZmF1bHQuCisKKy0tdmVyYm9zZTo6CisgICAgICAgIFJlcG9ydCB3aGF0IGlzIGJlaW5nIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gaW5kZXguCisKKy16OjoKKwlPbmx5IG1lYW5pbmdmdWwgd2l0aCBgLS1zdGRpbmA7IHBhdGhzIGFyZSBzZXBhcmF0ZWQgd2l0aAorCU5VTCBjaGFyYWN0ZXIgaW5zdGVhZCBvZiBMRi4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT46OgorCUZpbGVzIHRvIGFjdCBvbi4KKwlOb3RlIHRoYXQgZmlsZXMgYmVnaW5uaW5nIHdpdGggJy4nIGFyZSBkaXNjYXJkZWQuIFRoaXMgaW5jbHVkZXMKKwlgLi9maWxlYCBhbmQgYGRpci8uL2ZpbGVgLiBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzLCB0aGVuIHVzZQkKKwljbGVhbmVyIG5hbWVzLgorCVRoZSBzYW1lIGFwcGxpZXMgdG8gZGlyZWN0b3JpZXMgZW5kaW5nICcvJyBhbmQgcGF0aHMgd2l0aCAnLy8nCisKK1VzaW5nIC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tCisnLS1yZWZyZXNoJyBkb2VzIG5vdCBjYWxjdWxhdGUgYSBuZXcgc2hhMSBmaWxlIG9yIGJyaW5nIHRoZSBpbmRleAordXAtdG8tZGF0ZSBmb3IgbW9kZS9jb250ZW50IGNoYW5nZXMuIEJ1dCB3aGF0IGl0ICpkb2VzKiBkbyBpcyB0bworInJlLW1hdGNoIiB0aGUgc3RhdCBpbmZvcm1hdGlvbiBvZiBhIGZpbGUgd2l0aCB0aGUgaW5kZXgsIHNvIHRoYXQgeW91CitjYW4gcmVmcmVzaCB0aGUgaW5kZXggZm9yIGEgZmlsZSB0aGF0IGhhc24ndCBiZWVuIGNoYW5nZWQgYnV0IHdoZXJlCit0aGUgc3RhdCBlbnRyeSBpcyBvdXQgb2YgZGF0ZS4KKworRm9yIGV4YW1wbGUsIHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhZnRlciBkb2luZyBhICJnaXQtcmVhZC10cmVlIiwgdG8gbGluawordXAgdGhlIHN0YXQgaW5kZXggZGV0YWlscyB3aXRoIHRoZSBwcm9wZXIgZmlsZXMuCisKK1VzaW5nIC0tY2FjaGVpbmZvIG9yIC0taW5mby1vbmx5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJy0tY2FjaGVpbmZvJyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUKK2N1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbWluaW11bS1jaGVja291dAorbWVyZ2luZy4KKworVG8gcHJldGVuZCB5b3UgaGF2ZSBhIGZpbGUgd2l0aCBtb2RlIGFuZCBzaGExIGF0IHBhdGgsIHNheToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IC0tY2FjaGVpbmZvIG1vZGUgc2hhMSBwYXRoCistLS0tLS0tLS0tLS0tLS0tCisKKyctLWluZm8tb25seScgaXMgdXNlZCB0byByZWdpc3RlciBmaWxlcyB3aXRob3V0IHBsYWNpbmcgdGhlbSBpbiB0aGUgb2JqZWN0CitkYXRhYmFzZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBzdGF0dXMtb25seSByZXBvc2l0b3JpZXMuCisKK0JvdGggJy0tY2FjaGVpbmZvJyBhbmQgJy0taW5mby1vbmx5JyBiZWhhdmUgc2ltaWxhcmx5OiB0aGUgaW5kZXggaXMgdXBkYXRlZAorYnV0IHRoZSBvYmplY3QgZGF0YWJhc2UgaXNuJ3QuICAnLS1jYWNoZWluZm8nIGlzIHVzZWZ1bCB3aGVuIHRoZSBvYmplY3QgaXMKK2luIHRoZSBkYXRhYmFzZSBidXQgdGhlIGZpbGUgaXNuJ3QgYXZhaWxhYmxlIGxvY2FsbHkuICAnLS1pbmZvLW9ubHknIGlzCit1c2VmdWwgd2hlbiB0aGUgZmlsZSBpcyBhdmFpbGFibGUsIGJ1dCB5b3UgZG8gbm90IHdpc2ggdG8gdXBkYXRlIHRoZQorb2JqZWN0IGRhdGFiYXNlLgorCisKK1VzaW5nIC0taW5kZXgtaW5mbworLS0tLS0tLS0tLS0tLS0tLS0tCisKK2AtLWluZGV4LWluZm9gIGlzIGEgbW9yZSBwb3dlcmZ1bCBtZWNoYW5pc20gdGhhdCBsZXRzIHlvdSBmZWVkCittdWx0aXBsZSBlbnRyeSBkZWZpbml0aW9ucyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kIGRlc2lnbmVkCitzcGVjaWZpY2FsbHkgZm9yIHNjcmlwdHMuICBJdCBjYW4gdGFrZSBpbnB1dHMgb2YgdGhyZWUgZm9ybWF0czoKKworICAgIC4gbW9kZSAgICAgICAgIFNQIHNoYTEgICAgICAgICAgVEFCIHBhdGgKKysKK1RoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCAiZ2l0LWFwcGx5IC0taW5kZXgtaW5mbyIKK3JlcG9ydHMsIGFuZCB1c2VkIHRvIHJlY29uc3RydWN0IGEgcGFydGlhbCB0cmVlCit0aGF0IGlzIHVzZWQgZm9yIHBob255IG1lcmdlIGJhc2UgdHJlZSB3aGVuIGZhbGxpbmcKK2JhY2sgb24gMy13YXkgbWVyZ2UuCisKKyAgICAuIG1vZGUgU1AgdHlwZSBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisrCitUaGUgc2Vjb25kIGZvcm1hdCBpcyB0byBzdHVmZiBnaXQtbHMtdHJlZSBvdXRwdXQKK2ludG8gdGhlIGluZGV4IGZpbGUuCisKKyAgICAuIG1vZGUgICAgICAgICBTUCBzaGExIFNQIHN0YWdlIFRBQiBwYXRoCisrCitUaGlzIGZvcm1hdCBpcyB0byBwdXQgaGlnaGVyIG9yZGVyIHN0YWdlcyBpbnRvIHRoZQoraW5kZXggZmlsZSBhbmQgbWF0Y2hlcyBnaXQtbHMtZmlsZXMgLS1zdGFnZSBvdXRwdXQuCisKK1RvIHBsYWNlIGEgaGlnaGVyIHN0YWdlIGVudHJ5IHRvIHRoZSBpbmRleCwgdGhlIHBhdGggc2hvdWxkCitmaXJzdCBiZSByZW1vdmVkIGJ5IGZlZWRpbmcgYSBtb2RlPTAgZW50cnkgZm9yIHRoZSBwYXRoLCBhbmQKK3RoZW4gZmVlZGluZyBuZWNlc3NhcnkgaW5wdXQgbGluZXMgaW4gdGhlIHRoaXJkIGZvcm1hdC4KKworRm9yIGV4YW1wbGUsIHN0YXJ0aW5nIHdpdGggdGhpcyBpbmRleDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtcworMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMCAgICAgICBmcm90egorLS0tLS0tLS0tLS0tCisKK3lvdSBjYW4gZmVlZCB0aGUgZm9sbG93aW5nIGlucHV0IHRvIGAtLWluZGV4LWluZm9gOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8KKzAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlmcm90egorMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMQlmcm90egorMTAwNzU1IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMglmcm90egorLS0tLS0tLS0tLS0tCisKK1RoZSBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmZWVkcyAwIGFzIHRoZSBtb2RlIHRvIHJlbW92ZSB0aGUKK3BhdGg7IHRoZSBTSEExIGRvZXMgbm90IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzIHdlbGwgZm9ybWF0dGVkLgorVGhlbiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBsaW5lIGZlZWRzIHN0YWdlIDEgYW5kIHN0YWdlIDIgZW50cmllcworZm9yIHRoYXQgcGF0aC4gIEFmdGVyIHRoZSBhYm92ZSwgd2Ugd291bGQgZW5kIHVwIHdpdGggdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtcworMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMQlmcm90egorMTAwNzU1IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMglmcm90egorLS0tLS0tLS0tLS0tCisKKworVXNpbmcgYGBhc3N1bWUgdW5jaGFuZ2VkJycgYml0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFueSBvcGVyYXRpb25zIGluIGdpdCBkZXBlbmQgb24geW91ciBmaWxlc3lzdGVtIHRvIGhhdmUgYW4KK2VmZmljaWVudCBgbHN0YXQoMilgIGltcGxlbWVudGF0aW9uLCBzbyB0aGF0IGBzdF9tdGltZWAKK2luZm9ybWF0aW9uIGZvciB3b3JraW5nIHRyZWUgZmlsZXMgY2FuIGJlIGNoZWFwbHkgY2hlY2tlZCB0byBzZWUKK2lmIHRoZSBmaWxlIGNvbnRlbnRzIGhhdmUgY2hhbmdlZCBmcm9tIHRoZSB2ZXJzaW9uIHJlY29yZGVkIGluCit0aGUgaW5kZXggZmlsZS4gIFVuZm9ydHVuYXRlbHksIHNvbWUgZmlsZXN5c3RlbXMgaGF2ZQoraW5lZmZpY2llbnQgYGxzdGF0KDIpYC4gIElmIHlvdXIgZmlsZXN5c3RlbSBpcyBvbmUgb2YgdGhlbSwgeW91CitjYW4gc2V0ICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQgdG8gcGF0aHMgeW91IGhhdmUgbm90IGNoYW5nZWQgdG8KK2NhdXNlIGdpdCBub3QgdG8gZG8gdGhpcyBjaGVjay4gIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgYml0IG9uIGEKK3BhdGggZG9lcyBub3QgbWVhbiBnaXQgd2lsbCBjaGVjayB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgdG8KK3NlZSBpZiBpdCBoYXMgY2hhbmdlZCAtLSBpdCBtYWtlcyBnaXQgdG8gb21pdCBhbnkgY2hlY2tpbmcgYW5kCithc3N1bWUgaXQgaGFzICpub3QqIGNoYW5nZWQuICBXaGVuIHlvdSBtYWtlIGNoYW5nZXMgdG8gd29ya2luZwordHJlZSBmaWxlcywgeW91IGhhdmUgdG8gZXhwbGljaXRseSB0ZWxsIGdpdCBhYm91dCBpdCBieSBkcm9wcGluZworImFzc3VtZSB1bmNoYW5nZWQiIGJpdCwgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB5b3UgbW9kaWZ5IHRoZW0uCisKK0luIG9yZGVyIHRvIHNldCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0LCB1c2UgYC0tYXNzdW1lLXVuY2hhbmdlZGAKK29wdGlvbi4gIFRvIHVuc2V0LCB1c2UgYC0tbm8tYXNzdW1lLXVuY2hhbmdlZGAuCisKK1RoZSBjb21tYW5kIGxvb2tzIGF0IGBjb3JlLmlnbm9yZXN0YXRgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuICBXaGVuCit0aGlzIGlzIHRydWUsIHBhdGhzIHVwZGF0ZWQgd2l0aCBgZ2l0LXVwZGF0ZS1pbmRleCBwYXRocy4uLmAgYW5kCitwYXRocyB1cGRhdGVkIHdpdGggb3RoZXIgZ2l0IGNvbW1hbmRzIHRoYXQgdXBkYXRlIGJvdGggaW5kZXggYW5kCit3b3JraW5nIHRyZWUgKGUuZy4gYGdpdC1hcHBseSAtLWluZGV4YCwgYGdpdC1jaGVja291dC1pbmRleCAtdWAsCithbmQgYGdpdC1yZWFkLXRyZWUgLXVgKSBhcmUgYXV0b21hdGljYWxseSBtYXJrZWQgYXMgImFzc3VtZQordW5jaGFuZ2VkIi4gIE5vdGUgdGhhdCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IGlzICpub3QqIHNldCBpZgorYGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoYCBmaW5kcyB0aGUgd29ya2luZyB0cmVlIGZpbGUgbWF0Y2hlcwordGhlIGluZGV4ICh1c2UgYGdpdC11cGRhdGUtaW5kZXggLS1yZWFsbHktcmVmcmVzaGAgaWYgeW91IHdhbnQKK3RvIG1hcmsgdGhlbSBhcyAiYXNzdW1lIHVuY2hhbmdlZCIpLgorCisKK0V4YW1wbGVzCistLS0tLS0tLQorVG8gdXBkYXRlIGFuZCByZWZyZXNoIG9ubHkgdGhlIGZpbGVzIGFscmVhZHkgY2hlY2tlZCBvdXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC1uIC1mIC1hICYmIGdpdC11cGRhdGUtaW5kZXggLS1pZ25vcmUtbWlzc2luZyAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKworT24gYW4gaW5lZmZpY2llbnQgZmlsZXN5c3RlbSB3aXRoIGBjb3JlLmlnbm9yZXN0YXRgIHNldDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHVwZGF0ZS1pbmRleCAtLXJlYWxseS1yZWZyZXNoICAgICAgICAgICAgICA8MT4KKyQgZ2l0IHVwZGF0ZS1pbmRleCAtLW5vLWFzc3VtZS11bmNoYW5nZWQgZm9vLmMgICA8Mj4KKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mz4KKyQgZWRpdCBmb28uYworJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw0PgorTSBmb28uYworJCBnaXQgdXBkYXRlLWluZGV4IGZvby5jICAgICAgICAgICAgICAgICAgICAgICAgIDw1PgorJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw2PgorJCBlZGl0IGZvby5jCiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDc+CiskIGdpdCB1cGRhdGUtaW5kZXggLS1uby1hc3N1bWUtdW5jaGFuZ2VkIGZvby5jICAgPDg+CiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDk+CitNIGZvby5jCistLS0tLS0tLS0tLS0KKysKKzwxPiBmb3JjZXMgbHN0YXQoMikgdG8gc2V0ICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXRzIGZvciBwYXRocyB0aGF0IG1hdGNoIGluZGV4LgorPDI+IG1hcmsgdGhlIHBhdGggdG8gYmUgZWRpdGVkLgorPDM+IHRoaXMgZG9lcyBsc3RhdCgyKSBhbmQgZmluZHMgaW5kZXggbWF0Y2hlcyB0aGUgcGF0aC4KKzw0PiB0aGlzIGRvZXMgbHN0YXQoMikgYW5kIGZpbmRzIGluZGV4IGRvZXMgKm5vdCogbWF0Y2ggdGhlIHBhdGguCis8NT4gcmVnaXN0ZXJpbmcgdGhlIG5ldyB2ZXJzaW9uIHRvIGluZGV4IHNldHMgImFzc3VtZSB1bmNoYW5nZWQiIGJpdC4KKzw2PiBhbmQgaXQgaXMgYXNzdW1lZCB1bmNoYW5nZWQuCis8Nz4gZXZlbiBhZnRlciB5b3UgZWRpdCBpdC4KKzw4PiB5b3UgY2FuIHRlbGwgYWJvdXQgdGhlIGNoYW5nZSBhZnRlciB0aGUgZmFjdC4KKzw5PiBub3cgaXQgY2hlY2tzIHdpdGggbHN0YXQoMikgYW5kIGZpbmRzIGl0IGhhcyBiZWVuIGNoYW5nZWQuCisKKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCitUaGUgY29tbWFuZCBob25vcnMgYGNvcmUuZmlsZW1vZGVgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuICBJZgoreW91ciByZXBvc2l0b3J5IGlzIG9uIGFuIGZpbGVzeXN0ZW0gd2hvc2UgZXhlY3V0YWJsZSBiaXRzIGFyZQordW5yZWxpYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvICdmYWxzZScgKHNlZSBnaXRsaW5rOmdpdC1jb25maWdbMV0pLgorVGhpcyBjYXVzZXMgdGhlIGNvbW1hbmQgdG8gaWdub3JlIGRpZmZlcmVuY2VzIGluIGZpbGUgbW9kZXMgcmVjb3JkZWQKK2luIHRoZSBpbmRleCBhbmQgdGhlIGZpbGUgbW9kZSBvbiB0aGUgZmlsZXN5c3RlbSBpZiB0aGV5IGRpZmZlciBvbmx5IG9uCitleGVjdXRhYmxlIGJpdC4gICBPbiBzdWNoIGFuIHVuZm9ydHVuYXRlIGZpbGVzeXN0ZW0sIHlvdSBtYXkKK25lZWQgdG8gdXNlIGBnaXQtdXBkYXRlLWluZGV4IC0tY2htb2Q9YC4KKworUXVpdGUgc2ltaWxhcmx5LCBpZiBgY29yZS5zeW1saW5rc2AgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBzZXQKK3RvICdmYWxzZScgKHNlZSBnaXRsaW5rOmdpdC1jb25maWdbMV0pLCBzeW1ib2xpYyBsaW5rcyBhcmUgY2hlY2tlZCBvdXQKK2FzIHBsYWluIGZpbGVzLCBhbmQgdGhpcyBjb21tYW5kIGRvZXMgbm90IG1vZGlmeSBhIHJlY29yZGVkIGZpbGUgbW9kZQorZnJvbSBzeW1ib2xpYyBsaW5rIHRvIHJlZ3VsYXIgZmlsZS4KKworVGhlIGNvbW1hbmQgbG9va3MgYXQgYGNvcmUuaWdub3Jlc3RhdGAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gIFNlZQorJ1VzaW5nICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQnIHNlY3Rpb24gYWJvdmUuCisKKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1jb25maWdbMV0sCitnaXRsaW5rOmdpdC1hZGRbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXJlZi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI0ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXJlZi50eHQKQEAgLTAsMCArMSw5MCBAQAorZ2l0LXVwZGF0ZS1yZWYoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtcmVmIC0gVXBkYXRlIHRoZSBvYmplY3QgbmFtZSBzdG9yZWQgaW4gYSByZWYgc2FmZWx5CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGRhdGUtcmVmJyBbLW0gPHJlYXNvbj5dICgtZCA8cmVmPiA8b2xkdmFsdWU+IHwgPHJlZj4gPG5ld3ZhbHVlPiBbPG9sZHZhbHVlPl0pCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gdHdvIGFyZ3VtZW50cywgc3RvcmVzIHRoZSA8bmV3dmFsdWU+IGluIHRoZSA8cmVmPiwgcG9zc2libHkKK2RlcmVmZXJlbmNpbmcgdGhlIHN5bWJvbGljIHJlZnMuICBFLmcuIGBnaXQtdXBkYXRlLXJlZiBIRUFECis8bmV3dmFsdWU+YCB1cGRhdGVzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkIHRvIHRoZSBuZXcgb2JqZWN0LgorCitHaXZlbiB0aHJlZSBhcmd1bWVudHMsIHN0b3JlcyB0aGUgPG5ld3ZhbHVlPiBpbiB0aGUgPHJlZj4sCitwb3NzaWJseSBkZXJlZmVyZW5jaW5nIHRoZSBzeW1ib2xpYyByZWZzLCBhZnRlciB2ZXJpZnlpbmcgdGhhdAordGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIDxyZWY+IG1hdGNoZXMgPG9sZHZhbHVlPi4KK0UuZy4gYGdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyIDxuZXd2YWx1ZT4gPG9sZHZhbHVlPmAKK3VwZGF0ZXMgdGhlIG1hc3RlciBicmFuY2ggaGVhZCB0byA8bmV3dmFsdWU+IG9ubHkgaWYgaXRzIGN1cnJlbnQKK3ZhbHVlIGlzIDxvbGR2YWx1ZT4uICBZb3UgY2FuIHNwZWNpZnkgNDAgIjAiIG9yIGFuIGVtcHR5IHN0cmluZworYXMgPG9sZHZhbHVlPiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVmIHlvdSBhcmUgY3JlYXRpbmcgZG9lcworbm90IGV4aXN0LgorCitJdCBhbHNvIGFsbG93cyBhICJyZWYiIGZpbGUgdG8gYmUgYSBzeW1ib2xpYyBwb2ludGVyIHRvIGFub3RoZXIKK3JlZiBmaWxlIGJ5IHN0YXJ0aW5nIHdpdGggdGhlIGZvdXItYnl0ZSBoZWFkZXIgc2VxdWVuY2Ugb2YKKyJyZWY6Ii4KKworTW9yZSBpbXBvcnRhbnRseSwgaXQgYWxsb3dzIHRoZSB1cGRhdGUgb2YgYSByZWYgZmlsZSB0byBmb2xsb3cKK3RoZXNlIHN5bWJvbGljIHBvaW50ZXJzLCB3aGV0aGVyIHRoZXkgYXJlIHN5bWxpbmtzIG9yIHRoZXNlCisicmVndWxhciBmaWxlIHN5bWJvbGljIHJlZnMiLiAgSXQgZm9sbG93cyAqcmVhbCogc3ltbGlua3Mgb25seQoraWYgdGhleSBzdGFydCB3aXRoICJyZWZzLyI6IG90aGVyd2lzZSBpdCB3aWxsIGp1c3QgdHJ5IHRvIHJlYWQKK3RoZW0gYW5kIHVwZGF0ZSB0aGVtIGFzIGEgcmVndWxhciBmaWxlIChpLmUuIGl0IHdpbGwgYWxsb3cgdGhlCitmaWxlc3lzdGVtIHRvIGZvbGxvdyB0aGVtLCBidXQgd2lsbCBvdmVyd3JpdGUgc3VjaCBhIHN5bWxpbmsgdG8KK3NvbWV3aGVyZSBlbHNlIHdpdGggYSByZWd1bGFyIGZpbGVuYW1lKS4KKworSW4gZ2VuZXJhbCwgdXNpbmcKKworCWdpdC11cGRhdGUtcmVmIEhFQUQgIiRoZWFkIgorCitzaG91bGQgYmUgYSBfbG90XyBzYWZlciB0aGFuIGRvaW5nCisKKwllY2hvICIkaGVhZCIgPiAiJEdJVF9ESVIvSEVBRCIKKworYm90aCBmcm9tIGEgc3ltbGluayBmb2xsb3dpbmcgc3RhbmRwb2ludCAqYW5kKiBhbiBlcnJvciBjaGVja2luZworc3RhbmRwb2ludC4gIFRoZSAicmVmcy8iIHJ1bGUgZm9yIHN5bWxpbmtzIG1lYW5zIHRoYXQgc3ltbGlua3MKK3RoYXQgcG9pbnQgdG8gIm91dHNpZGUiIHRoZSB0cmVlIGFyZSBzYWZlOiB0aGV5J2xsIGJlIGZvbGxvd2VkCitmb3IgcmVhZGluZyBidXQgbm90IGZvciB3cml0aW5nIChzbyB3ZSdsbCBuZXZlciB3cml0ZSB0aHJvdWdoIGEKK3JlZiBzeW1saW5rIHRvIHNvbWUgb3RoZXIgdHJlZSwgaWYgeW91IGhhdmUgY29waWVkIGEgd2hvbGUKK2FyY2hpdmUgYnkgY3JlYXRpbmcgYSBzeW1saW5rIHRyZWUpLgorCitXaXRoIGAtZGAgZmxhZywgaXQgZGVsZXRlcyB0aGUgbmFtZWQgPHJlZj4gYWZ0ZXIgdmVyaWZ5aW5nIGl0CitzdGlsbCBjb250YWlucyA8b2xkdmFsdWU+LgorCisKK0xvZ2dpbmcgVXBkYXRlcworLS0tLS0tLS0tLS0tLS0tCitJZiBjb25maWcgcGFyYW1ldGVyICJjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMiIGlzIHRydWUgb3IgdGhlIGZpbGUKKyIkR0lUX0RJUi9sb2dzLzxyZWY+IiBleGlzdHMgdGhlbiBgZ2l0LXVwZGF0ZS1yZWZgIHdpbGwgYXBwZW5kCithIGxpbmUgdG8gdGhlIGxvZyBmaWxlICIkR0lUX0RJUi9sb2dzLzxyZWY+IiAoZGVyZWZlcmVuY2luZyBhbGwKK3N5bWJvbGljIHJlZnMgYmVmb3JlIGNyZWF0aW5nIHRoZSBsb2cgbmFtZSkgZGVzY3JpYmluZyB0aGUgY2hhbmdlCitpbiByZWYgdmFsdWUuICBMb2cgbGluZXMgYXJlIGZvcm1hdHRlZCBhczoKKworICAgIC4gb2xkc2hhMSBTUCBuZXdzaGExIFNQIGNvbW1pdHRlciBMRgorKworV2hlcmUgIm9sZHNoYTEiIGlzIHRoZSA0MCBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgdmFsdWUgcHJldmlvdXNseQorc3RvcmVkIGluIDxyZWY+LCAibmV3c2hhMSIgaXMgdGhlIDQwIGNoYXJhY3RlciBoZXhhZGVjaW1hbCB2YWx1ZSBvZgorPG5ld3ZhbHVlPiBhbmQgImNvbW1pdHRlciIgaXMgdGhlIGNvbW1pdHRlcidzIG5hbWUsIGVtYWlsIGFkZHJlc3MKK2FuZCBkYXRlIGluIHRoZSBzdGFuZGFyZCBHSVQgY29tbWl0dGVyIGlkZW50IGZvcm1hdC4KKworT3B0aW9uYWxseSB3aXRoIC1tOgorCisgICAgLiBvbGRzaGExIFNQIG5ld3NoYTEgU1AgY29tbWl0dGVyIFRBQiBtZXNzYWdlIExGCisrCitXaGVyZSBhbGwgZmllbGRzIGFyZSBhcyBkZXNjcmliZWQgYWJvdmUgYW5kICJtZXNzYWdlIiBpcyB0aGUKK3ZhbHVlIHN1cHBsaWVkIHRvIHRoZSAtbSBvcHRpb24uCisKK0FuIHVwZGF0ZSB3aWxsIGZhaWwgKHdpdGhvdXQgY2hhbmdpbmcgPHJlZj4pIGlmIHRoZSBjdXJyZW50IHVzZXIgaXMKK3VuYWJsZSB0byBjcmVhdGUgYSBuZXcgbG9nIGZpbGUsIGFwcGVuZCB0byB0aGUgZXhpc3RpbmcgbG9nIGZpbGUKK29yIGRvZXMgbm90IGhhdmUgY29tbWl0dGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXNlcnZlci1pbmZvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGEwM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXNlcnZlci1pbmZvLnR4dApAQCAtMCwwICsxLDU4IEBACitnaXQtdXBkYXRlLXNlcnZlci1pbmZvKDEpCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtc2VydmVyLWluZm8gLSBVcGRhdGUgYXV4aWxpYXJ5IGluZm8gZmlsZSB0byBoZWxwIGR1bWIgc2VydmVycworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGRhdGUtc2VydmVyLWluZm8nIFstLWZvcmNlXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgZHVtYiBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBkbyBvbi10aGUtZmx5IHBhY2sgZ2VuZXJhdGlvbnMgbXVzdAoraGF2ZSBzb21lIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmaWxlcyBpbiAkR0lUX0RJUi9pbmZvIGFuZAorJEdJVF9PQkpFQ1RfRElSRUNUT1JZL2luZm8gZGlyZWN0b3JpZXMgdG8gaGVscCBjbGllbnRzIGRpc2NvdmVyCit3aGF0IHJlZmVyZW5jZXMgYW5kIHBhY2tzIHRoZSBzZXJ2ZXIgaGFzLiAgVGhpcyBjb21tYW5kCitnZW5lcmF0ZXMgc3VjaCBhdXhpbGlhcnkgZmlsZXMuCisKKworT1BUSU9OUworLS0tLS0tLQorCistZnwtLWZvcmNlOjoKKwlVcGRhdGUgdGhlIGluZm8gZmlsZXMgZnJvbSBzY3JhdGNoLgorCisKK09VVFBVVAorLS0tLS0tCisKK0N1cnJlbnRseSB0aGUgY29tbWFuZCB1cGRhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMuICBQbGVhc2Ugc2VlCitsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeS1sYXlvdXRdIGZvciBkZXNjcmlwdGlvbgorb2Ygd2hhdCB0aGV5IGFyZSBmb3I6CisKKyogb2JqZWN0cy9pbmZvL3BhY2tzCisKKyogaW5mby9yZWZzCisKKworQlVHUworLS0tLQorV2hlbiB5b3UgcmVtb3ZlIGFuIGV4aXN0aW5nIHJlZiwgdGhlIGNvbW1hbmQgZmFpbHMgdG8gdXBkYXRlCitpbmZvL3JlZnMgZmlsZSB1bmxlc3MgYC0tZm9yY2VgIGZsYWcgaXMgZ2l2ZW4uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1hcmNoaXZlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1hcmNoaXZlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM4NzFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLWFyY2hpdmUudHh0CkBAIC0wLDAgKzEsMzcgQEAKK2dpdC11cGxvYWQtYXJjaGl2ZSgxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwbG9hZC1hcmNoaXZlIC0gU2VuZCBhcmNoaXZlIGJhY2sgdG8gZ2l0LWFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdXBsb2FkLWFyY2hpdmUnIDxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlZCBieSAnZ2l0LWFyY2hpdmUgLS1yZW1vdGUnIGFuZCBzZW5kcyBhIGdlbmVyYXRlZCBhcmNoaXZlIHRvIHRoZQorb3RoZXIgZW5kIG92ZXIgdGhlIGdpdCBwcm90b2NvbC4KKworVGhpcyBjb21tYW5kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VyLiAgVGhlIFVJCitmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LWFyY2hpdmUnIHNpZGUsIGFuZCB0aGUgcHJvZ3JhbSBwYWlyCitpcyBtZWFudCB0byBiZSB1c2VkIHRvIGdldCBhbiBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIGdldCBhIHRhciBhcmNoaXZlIGZyb20uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEZyYW5jayBCdWktSHV1LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NTE5MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1wYWNrLnR4dApAQCAtMCwwICsxLDQ2IEBACitnaXQtdXBsb2FkLXBhY2soMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdXBsb2FkLXBhY2sgLSBTZW5kIG9iamVjdHMgcGFja2VkIGJhY2sgdG8gZ2l0LWZldGNoLXBhY2sKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdXBsb2FkLXBhY2snIFstLXN0cmljdF0gWy0tdGltZW91dD08bj5dIDxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlZCBieSAnZ2l0LWZldGNoLXBhY2snLCBsZWFybnMgd2hhdAorb2JqZWN0cyB0aGUgb3RoZXIgc2lkZSBpcyBtaXNzaW5nLCBhbmQgc2VuZHMgdGhlbSBhZnRlciBwYWNraW5nLgorCitUaGlzIGNvbW1hbmQgaXMgdXN1YWxseSBub3QgaW52b2tlZCBkaXJlY3RseSBieSB0aGUgZW5kIHVzZXIuCitUaGUgVUkgZm9yIHRoZSBwcm90b2NvbCBpcyBvbiB0aGUgJ2dpdC1mZXRjaC1wYWNrJyBzaWRlLCBhbmQgdGhlCitwcm9ncmFtIHBhaXIgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBwdWxsIHVwZGF0ZXMgZnJvbSBhIHJlbW90ZQorcmVwb3NpdG9yeS4gIEZvciBwdXNoIG9wZXJhdGlvbnMsIHNlZSAnZ2l0LXNlbmQtcGFjaycuCisKKworT1BUSU9OUworLS0tLS0tLQorCitcLS1zdHJpY3Q6OgorCURvIG5vdCB0cnkgPGRpcmVjdG9yeT4vLmdpdC8gaWYgPGRpcmVjdG9yeT4gaXMgbm8gZ2l0IGRpcmVjdG9yeS4KKworXC0tdGltZW91dD08bj46OgorCUludGVycnVwdCB0cmFuc2ZlciBhZnRlciA8bj4gc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBmcm9tLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXZhci50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGRlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0CkBAIC0wLDAgKzEsNjUgQEAKK2dpdC12YXIoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXZhciAtIFNob3cgYSBnaXQgbG9naWNhbCB2YXJpYWJsZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12YXInIFsgLWwgfCA8dmFyaWFibGU+IF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQcmludHMgYSBnaXQgbG9naWNhbCB2YXJpYWJsZS4KKworT1BUSU9OUworLS0tLS0tLQorLWw6OgorCUNhdXNlIHRoZSBsb2dpY2FsIHZhcmlhYmxlcyB0byBiZSBsaXN0ZWQuIEluIGFkZGl0aW9uLCBhbGwgdGhlCisJdmFyaWFibGVzIG9mIHRoZSBnaXQgY29uZmlndXJhdGlvbiBmaWxlIC5naXQvY29uZmlnIGFyZSBsaXN0ZWQKKwlhcyB3ZWxsLiAoSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGxpc3RpbmcgZnVuY3Rpb25hbGl0eQorCWlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGdpdC1jb25maWcgLWxgLikKKworRVhBTVBMRQorLS0tLS0tLS0KKwkkIGdpdC12YXIgR0lUX0FVVEhPUl9JREVOVAorCUVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybUBsbnhpLmNvbT4gMTEyMTIyMzI3OCAtMDYwMAorCisKK1ZBUklBQkxFUworLS0tLS0tLS0tLQorR0lUX0FVVEhPUl9JREVOVDo6CisgICAgVGhlIGF1dGhvciBvZiBhIHBpZWNlIG9mIGNvZGUuCisKK0dJVF9DT01NSVRURVJfSURFTlQ6OgorICAgIFRoZSBwZXJzb24gd2hvIHB1dCBhIHBpZWNlIG9mIGNvZGUgaW50byBnaXQuCisKK0RpYWdub3N0aWNzCistLS0tLS0tLS0tLQorWW91IGRvbid0IGV4aXN0LiBHbyBhd2F5ITo6CisgICAgVGhlIHBhc3N3ZCg1KSBnZWNvcyBmaWVsZCBjb3VsZG4ndCBiZSByZWFkCitZb3VyIHBhcmVudHMgbXVzdCBoYXZlIGhhdGVkIHlvdSE6OgorICAgIFRoZSBwYXNzd29yZCg1KSBnZWNvcyBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCitZb3VyIHN5c2FkbWluIG11c3QgaGF0ZSB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgbmFtZSBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0KK2dpdGxpbms6Z2l0LXRhZ1sxXQorZ2l0bGluazpnaXQtY29uZmlnWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEVyaWMgQmllZGVybWFuIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjEzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktcGFjay50eHQKQEAgLTAsMCArMSw1NCBAQAorZ2l0LXZlcmlmeS1wYWNrKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXZlcmlmeS1wYWNrIC0gVmFsaWRhdGUgcGFja2VkIGdpdCBhcmNoaXZlIGZpbGVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZlcmlmeS1wYWNrJyBbLXZdIFstLV0gPHBhY2s+LmlkeCAuLi4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGdpdmVuIGlkeCBmaWxlIGZvciBwYWNrZWQgZ2l0IGFyY2hpdmUgY3JlYXRlZCB3aXRoCitnaXQtcGFjay1vYmplY3RzIGNvbW1hbmQgYW5kIHZlcmlmaWVzIGlkeCBmaWxlIGFuZCB0aGUKK2NvcnJlc3BvbmRpbmcgcGFjayBmaWxlLgorCitPUFRJT05TCistLS0tLS0tCis8cGFjaz4uaWR4IC4uLjo6CisJVGhlIGlkeCBmaWxlcyB0byB2ZXJpZnkuCisKKy12OjoKKwlBZnRlciB2ZXJpZnlpbmcgdGhlIHBhY2ssIHNob3cgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5lZAorCWluIHRoZSBwYWNrLgorXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCitPVVRQVVQgRk9STUFUCistLS0tLS0tLS0tLS0tCitXaGVuIHNwZWNpZnlpbmcgdGhlIC12IG9wdGlvbiB0aGUgZm9ybWF0IHVzZWQgaXM6CisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUKKworZm9yIG9iamVjdHMgdGhhdCBhcmUgbm90IGRlbHRpZmllZCBpbiB0aGUgcGFjaywgYW5kCisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUgZGVwdGggYmFzZS1TSEExCisKK2ZvciBvYmplY3RzIHRoYXQgYXJlIGRlbHRpZmllZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjliZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQKQEAgLTAsMCArMSwzMiBAQAorZ2l0LXZlcmlmeS10YWcoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12ZXJpZnktdGFnIC0gQ2hlY2sgdGhlIEdQRyBzaWduYXR1cmUgb2YgdGFnCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12ZXJpZnktdGFnJyA8dGFnPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1ZhbGlkYXRlcyB0aGUgZ3BnIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IGdpdC10YWcuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0YWc+OjoKKwlTSEExIGlkZW50aWZpZXIgb2YgYSBnaXQgdGFnIG9iamVjdC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSmFuIEhhcmtlcyA8amFoYXJrZXNAY3MuY211LmVkdT4gYW5kIEVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWJmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC13aGF0Y2hhbmdlZC50eHQKQEAgLTAsMCArMSw4MSBAQAorZ2l0LXdoYXRjaGFuZ2VkKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXdoYXRjaGFuZ2VkIC0gU2hvdyBsb2dzIHdpdGggZGlmZmVyZW5jZSBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXdoYXRjaGFuZ2VkJyA8b3B0aW9uPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Nob3dzIGNvbW1pdCBsb2dzIGFuZCBkaWZmIG91dHB1dCBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzLiAgVGhlCitjb21tYW5kIGludGVybmFsbHkgaW52b2tlcyAnZ2l0LXJldi1saXN0JyBwaXBlZCB0bworJ2dpdC1kaWZmLXRyZWUnLCBhbmQgdGFrZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGJvdGggb2YKK3RoZXNlIGNvbW1hbmRzLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1wOjoKKwlTaG93IHRleHR1YWwgZGlmZnMsIGluc3RlYWQgb2YgdGhlIGdpdCBpbnRlcm5hbCBkaWZmCisJb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHVzZWZ1bCBvbmx5IHRvIHRlbGwgdGhlIGNoYW5nZWQKKwlwYXRocyBhbmQgdGhlaXIgbmF0dXJlIG9mIGNoYW5nZXMuCisKKy08bj46OgorCUxpbWl0IG91dHB1dCB0byA8bj4gY29tbWl0cy4KKworPHNpbmNlPi4uPHVudGlsPjo6CisJTGltaXQgb3V0cHV0IHRvIGJldHdlZW4gdGhlIHR3byBuYW1lZCBjb21taXRzIChib3R0b20KKwlleGNsdXNpdmUsIHRvcCBpbmNsdXNpdmUpLgorCistcjo6CisJU2hvdyBnaXQgaW50ZXJuYWwgZGlmZiBvdXRwdXQsIGJ1dCBmb3IgdGhlIHdob2xlIHRyZWUsCisJbm90IGp1c3QgdGhlIHRvcCBsZXZlbC4KKworLS1wcmV0dHk9PGZvcm1hdD46OgorCUNvbnRyb2xzIHRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgY29tbWl0IGxvZ3MuCisJPGZvcm1hdD4gY2FuIGJlIG9uZSBvZiAncmF3JywgJ21lZGl1bScsICdzaG9ydCcsICdmdWxsJywKKwlhbmQgJ29uZWxpbmUnLgorCistbTo6CisJQnkgZGVmYXVsdCwgZGlmZmVyZW5jZXMgZm9yIG1lcmdlIGNvbW1pdHMgYXJlIG5vdCBzaG93bi4KKwlXaXRoIHRoaXMgZmxhZywgc2hvdyBkaWZmZXJlbmNlcyB0byB0aGF0IGNvbW1pdCBmcm9tIGFsbAorCW9mIGl0cyBwYXJlbnRzLgorKworSG93ZXZlciwgaXQgaXMgbm90IHZlcnkgdXNlZnVsIGluIGdlbmVyYWwsIGFsdGhvdWdoIGl0CisqaXMqIHVzZWZ1bCBvbiBhIGZpbGUtYnktZmlsZSBiYXNpcy4KKworRXhhbXBsZXMKKy0tLS0tLS0tCitnaXQtd2hhdGNoYW5nZWQgLXAgdjIuNi4xMi4uIGluY2x1ZGUvc2NzaSBkcml2ZXJzL3Njc2k6OgorCisJU2hvdyBhcyBwYXRjaGVzIHRoZSBjb21taXRzIHNpbmNlIHZlcnNpb24gJ3YyLjYuMTInIHRoYXQgY2hhbmdlZAorCWFueSBmaWxlIGluIHRoZSBpbmNsdWRlL3Njc2kgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKK2dpdC13aGF0Y2hhbmdlZCAtLXNpbmNlPSIyIHdlZWtzIGFnbyIgXC0tIGdpdGs6OgorCisJU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzIHRvIHRoZSBmaWxlICdnaXRrJy4KKwlUaGUgIi0tIiBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGhlICpicmFuY2gqIG5hbWVkCisJJ2dpdGsnCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXdyaXRlLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkNWUwNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXdyaXRlLXRyZWUudHh0CkBAIC0wLDAgKzEsNTAgQEAKK2dpdC13cml0ZS10cmVlKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtd3JpdGUtdHJlZSAtIENyZWF0ZSBhIHRyZWUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtd3JpdGUtdHJlZScgWy0tbWlzc2luZy1va10gWy0tcHJlZml4PTxwcmVmaXg+L10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDcmVhdGVzIGEgdHJlZSBvYmplY3QgdXNpbmcgdGhlIGN1cnJlbnQgaW5kZXguCisKK1RoZSBpbmRleCBtdXN0IGJlIGluIGEgZnVsbHkgbWVyZ2VkIHN0YXRlLgorCitDb25jZXB0dWFsbHksIGBnaXQtd3JpdGUtdHJlZWAgc3luYygpcyB0aGUgY3VycmVudCBpbmRleCBjb250ZW50cworaW50byBhIHNldCBvZiB0cmVlIGZpbGVzLgorSW4gb3JkZXIgdG8gaGF2ZSB0aGF0IG1hdGNoIHdoYXQgaXMgYWN0dWFsbHkgaW4geW91ciBkaXJlY3RvcnkgcmlnaHQKK25vdywgeW91IG5lZWQgdG8gaGF2ZSBkb25lIGEgYGdpdC11cGRhdGUtaW5kZXhgIHBoYXNlIGJlZm9yZSB5b3UgZGlkIHRoZQorYGdpdC13cml0ZS10cmVlYC4KKworCitPUFRJT05TCistLS0tLS0tCistLW1pc3Npbmctb2s6OgorCU5vcm1hbGx5IGBnaXQtd3JpdGUtdHJlZWAgZW5zdXJlcyB0aGF0IHRoZSBvYmplY3RzIHJlZmVyZW5jZWQgYnkgdGhlCisJZGlyZWN0b3J5IGV4aXN0IGluIHRoZSBvYmplY3QgZGF0YWJhc2UuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGlzCisJY2hlY2suCisKKy0tcHJlZml4PTxwcmVmaXg+Lzo6CisJV3JpdGVzIGEgdHJlZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgc3ViZGlyZWN0b3J5CisJYDxwcmVmaXg+YC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIHRyZWUgb2JqZWN0CisJZm9yIGEgc3VicHJvamVjdCB0aGF0IGlzIGluIHRoZSBuYW1lZCBzdWJkaXJlY3RvcnkuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg2MGFmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CkBAIC0wLDAgKzEsNDMxIEBACitnaXQoNykKKz09PT09PQorCitOQU1FCistLS0tCitnaXQgLSB0aGUgc3R1cGlkIGNvbnRlbnQgdHJhY2tlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdCcgWy0tdmVyc2lvbl0gWy0tZXhlYy1wYXRoWz1HSVRfRVhFQ19QQVRIXV0gWy1wfC0tcGFnaW5hdGVdCisgICAgWy0tYmFyZV0gWy0tZ2l0LWRpcj1HSVRfRElSXSBbLS1oZWxwXSBDT01NQU5EIFtBUkdTXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitTZWUgdGhpcyBsaW5rOnR1dG9yaWFsLmh0bWxbdHV0b3JpYWxdIHRvIGdldCBzdGFydGVkLCB0aGVuIHNlZQorbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdpdF0gZm9yIGEgdXNlZnVsIG1pbmltdW0gc2V0IG9mIGNvbW1hbmRzLCBhbmQKKyJtYW4gZ2l0LWNvbW1hbmRuYW1lIiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGNvbW1hbmQuICBDVlMgdXNlcnMgbWF5CithbHNvIHdhbnQgdG8gcmVhZCBsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtDVlMgbWlncmF0aW9uXS4gIFNlZQorbGluazp1c2VyLW1hbnVhbC5odG1sW0dpdCBVc2VyJ3MgTWFudWFsXSBmb3IgYSBtb3JlIGluLWRlcHRoCitpbnRyb2R1Y3Rpb24uCisKK1RoZSBDT01NQU5EIGlzIGVpdGhlciBhIG5hbWUgb2YgYSBHaXQgY29tbWFuZCAoc2VlIGJlbG93KSBvciBhbiBhbGlhcworYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIChzZWUgZ2l0bGluazpnaXQtY29uZmlnWzFdKS4KKworRm9ybWF0dGVkIGFuZCBoeXBlcmxpbmtlZCB2ZXJzaW9uIG9mIHRoZSBsYXRlc3QgZ2l0Citkb2N1bWVudGF0aW9uIGNhbiBiZSB2aWV3ZWQgYXQKK2BodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy9gLgorCitpZmRlZjo6c3RhbGVub3Rlc1tdCitbTk9URV0KKz09PT09PT09PT09PQorCitZb3UgYXJlIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBsYXRlc3QgKHBvc3NpYmx5Cit1bnJlbGVhc2VkKSB2ZXJzaW9uIG9mIGdpdCwgdGhhdCBpcyBhdmFpbGFibGUgZnJvbSAnbWFzdGVyJworYnJhbmNoIG9mIHRoZSBgZ2l0LmdpdGAgcmVwb3NpdG9yeS4KK0RvY3VtZW50YXRpb24gZm9yIG9sZGVyIHJlbGVhc2VzIGFyZSBhdmFpbGFibGUgaGVyZToKKworKiBsaW5rOnYxLjUuMi9naXQuaHRtbFtkb2N1bWVudGF0aW9uIGZvciByZWxlYXNlIDEuNS4yXQorCisqIHJlbGVhc2Ugbm90ZXMgZm9yCisgIGxpbms6UmVsTm90ZXMtMS41LjIudHh0WzEuNS4yXS4KKworKiBsaW5rOnYxLjUuMS42L2dpdC5odG1sW2RvY3VtZW50YXRpb24gZm9yIHJlbGVhc2UgMS41LjEuNl0KKworKiByZWxlYXNlIG5vdGVzIGZvcgorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjYudHh0WzEuNS4xLjZdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjUudHh0WzEuNS4xLjVdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjQudHh0WzEuNS4xLjRdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjMudHh0WzEuNS4xLjNdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjIudHh0WzEuNS4xLjJdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLjEudHh0WzEuNS4xLjFdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4xLnR4dFsxLjUuMV0uCisKKyogbGluazp2MS41LjAuNy9naXQuaHRtbFtkb2N1bWVudGF0aW9uIGZvciByZWxlYXNlIDEuNS4wLjddCisKKyogcmVsZWFzZSBub3RlcyBmb3IKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC43LnR4dFsxLjUuMC43XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC42LnR4dFsxLjUuMC42XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC41LnR4dFsxLjUuMC41XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC4zLnR4dFsxLjUuMC4zXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC4yLnR4dFsxLjUuMC4yXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC4xLnR4dFsxLjUuMC4xXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMC50eHRbMS41LjBdLgorCisqIGRvY3VtZW50YXRpb24gZm9yIHJlbGVhc2UgbGluazp2MS40LjQuNC9naXQuaHRtbFsxLjQuNC40XSwKKyAgbGluazp2MS4zLjMvZ2l0Lmh0bWxbMS4zLjNdLAorICBsaW5rOnYxLjIuNi9naXQuaHRtbFsxLjIuNl0sCisgIGxpbms6djEuMC4xMy9naXQuaHRtbFsxLjAuMTNdLgorCis9PT09PT09PT09PT0KKworZW5kaWY6OnN0YWxlbm90ZXNbXQorCitPUFRJT05TCistLS0tLS0tCistLXZlcnNpb246OgorCVByaW50cyB0aGUgZ2l0IHN1aXRlIHZlcnNpb24gdGhhdCB0aGUgJ2dpdCcgcHJvZ3JhbSBjYW1lIGZyb20uCisKKy0taGVscDo6CisJUHJpbnRzIHRoZSBzeW5vcHNpcyBhbmQgYSBsaXN0IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQKKwljb21tYW5kcy4gIElmIGEgZ2l0IGNvbW1hbmQgaXMgbmFtZWQgdGhpcyBvcHRpb24gd2lsbCBicmluZyB1cAorCXRoZSBtYW4tcGFnZSBmb3IgdGhhdCBjb21tYW5kLiBJZiB0aGUgb3B0aW9uICctLWFsbCcgb3IgJy1hJyBpcworCWdpdmVuIHRoZW4gYWxsIGF2YWlsYWJsZSBjb21tYW5kcyBhcmUgcHJpbnRlZC4KKworLS1leGVjLXBhdGg6OgorCVBhdGggdG8gd2hlcmV2ZXIgeW91ciBjb3JlIGdpdCBwcm9ncmFtcyBhcmUgaW5zdGFsbGVkLgorCVRoaXMgY2FuIGFsc28gYmUgY29udHJvbGxlZCBieSBzZXR0aW5nIHRoZSBHSVRfRVhFQ19QQVRICisJZW52aXJvbm1lbnQgdmFyaWFibGUuIElmIG5vIHBhdGggaXMgZ2l2ZW4gJ2dpdCcgd2lsbCBwcmludAorCXRoZSBjdXJyZW50IHNldHRpbmcgYW5kIHRoZW4gZXhpdC4KKworLXB8LS1wYWdpbmF0ZTo6CisJUGlwZSBhbGwgb3V0cHV0IGludG8gJ2xlc3MnIChvciBpZiBzZXQsICRQQUdFUikuCisKKy0tZ2l0LWRpcj08cGF0aD46OgorCVNldCB0aGUgcGF0aCB0byB0aGUgcmVwb3NpdG9yeS4gVGhpcyBjYW4gYWxzbyBiZSBjb250cm9sbGVkIGJ5CisJc2V0dGluZyB0aGUgR0lUX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworLS1iYXJlOjoKKwlTYW1lIGFzIC0tZ2l0LWRpcj1gcHdkYC4KKworRlVSVEhFUiBET0NVTUVOVEFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIHRoZSByZWZlcmVuY2VzIGFib3ZlIHRvIGdldCBzdGFydGVkIHVzaW5nIGdpdC4gIFRoZSBmb2xsb3dpbmcgaXMKK3Byb2JhYmx5IG1vcmUgZGV0YWlsIHRoYW4gbmVjZXNzYXJ5IGZvciBhIGZpcnN0LXRpbWUgdXNlci4KKworVGhlIDw8RGlzY3Vzc2lvbixEaXNjdXNzaW9uPj4gc2VjdGlvbiBiZWxvdyBhbmQgdGhlCitsaW5rOmNvcmUtdHV0b3JpYWwuaHRtbFtDb3JlIHR1dG9yaWFsXSBib3RoIHByb3ZpZGUgaW50cm9kdWN0aW9ucyB0byB0aGUKK3VuZGVybHlpbmcgZ2l0IGFyY2hpdGVjdHVyZS4KKworU2VlIGFsc28gdGhlIGxpbms6aG93dG8taW5kZXguaHRtbFtob3d0b10gZG9jdW1lbnRzIGZvciBzb21lIHVzZWZ1bAorZXhhbXBsZXMuCisKK0dJVCBDT01NQU5EUworLS0tLS0tLS0tLS0tCisKK1dlIGRpdmlkZSBnaXQgaW50byBoaWdoIGxldmVsICgicG9yY2VsYWluIikgY29tbWFuZHMgYW5kIGxvdyBsZXZlbAorKCJwbHVtYmluZyIpIGNvbW1hbmRzLgorCitIaWdoLWxldmVsIGNvbW1hbmRzIChwb3JjZWxhaW4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHNlcGFyYXRlIHRoZSBwb3JjZWxhaW4gY29tbWFuZHMgaW50byB0aGUgbWFpbiBjb21tYW5kcyBhbmQgc29tZQorYW5jaWxsYXJ5IHVzZXIgdXRpbGl0aWVzLgorCitNYWluIHBvcmNlbGFpbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworaW5jbHVkZTo6Y21kcy1tYWlucG9yY2VsYWluLnR4dFtdCisKK0FuY2lsbGFyeSBDb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+CitNYW5pcHVsYXRvcnM6CisKK2luY2x1ZGU6OmNtZHMtYW5jaWxsYXJ5bWFuaXB1bGF0b3JzLnR4dFtdCisKK0ludGVycm9nYXRvcnM6CisKK2luY2x1ZGU6OmNtZHMtYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycy50eHRbXQorCisKK0ludGVyYWN0aW5nIHdpdGggT3RoZXJzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBjb21tYW5kcyBhcmUgdG8gaW50ZXJhY3Qgd2l0aCBmb3JlaWduIFNDTSBhbmQgd2l0aCBvdGhlcgorcGVvcGxlIHZpYSBwYXRjaCBvdmVyIGUtbWFpbC4KKworaW5jbHVkZTo6Y21kcy1mb3JlaWduc2NtaW50ZXJmYWNlLnR4dFtdCisKKworTG93LWxldmVsIGNvbW1hbmRzIChwbHVtYmluZykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGhvdWdoIGdpdCBpbmNsdWRlcyBpdHMKK293biBwb3JjZWxhaW4gbGF5ZXIsIGl0cyBsb3ctbGV2ZWwgY29tbWFuZHMgYXJlIHN1ZmZpY2llbnQgdG8gc3VwcG9ydAorZGV2ZWxvcG1lbnQgb2YgYWx0ZXJuYXRpdmUgcG9yY2VsYWlucy4gIERldmVsb3BlcnMgb2Ygc3VjaCBwb3JjZWxhaW5zCittaWdodCBzdGFydCBieSByZWFkaW5nIGFib3V0IGdpdGxpbms6Z2l0LXVwZGF0ZS1pbmRleFsxXSBhbmQKK2dpdGxpbms6Z2l0LXJlYWQtdHJlZVsxXS4KKworVGhlIGludGVyZmFjZSAoaW5wdXQsIG91dHB1dCwgc2V0IG9mIG9wdGlvbnMgYW5kIHRoZSBzZW1hbnRpY3MpCit0byB0aGVzZSBsb3ctbGV2ZWwgY29tbWFuZHMgYXJlIG1lYW50IHRvIGJlIGEgbG90IG1vcmUgc3RhYmxlCit0aGFuIFBvcmNlbGFpbiBsZXZlbCBjb21tYW5kcywgYmVjYXVzZSB0aGVzZSBjb21tYW5kcyBhcmUKK3ByaW1hcmlseSBmb3Igc2NyaXB0ZWQgdXNlLiAgVGhlIGludGVyZmFjZSB0byBQb3JjZWxhaW4gY29tbWFuZHMKK29uIHRoZSBvdGhlciBoYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZQorZW5kIHVzZXIgZXhwZXJpZW5jZS4KKworVGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBkaXZpZGVzCit0aGUgbG93LWxldmVsIGNvbW1hbmRzIGludG8gY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdHMgKGluCit0aGUgcmVwb3NpdG9yeSwgaW5kZXgsIGFuZCB3b3JraW5nIHRyZWUpLCBjb21tYW5kcyB0aGF0IGludGVycm9nYXRlIGFuZAorY29tcGFyZSBvYmplY3RzLCBhbmQgY29tbWFuZHMgdGhhdCBtb3ZlIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMgYmV0d2VlbgorcmVwb3NpdG9yaWVzLgorCisKK01hbmlwdWxhdGlvbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtcGx1bWJpbmdtYW5pcHVsYXRvcnMudHh0W10KKworCitJbnRlcnJvZ2F0aW9uIGNvbW1hbmRzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtcGx1bWJpbmdpbnRlcnJvZ2F0b3JzLnR4dFtdCisKK0luIGdlbmVyYWwsIHRoZSBpbnRlcnJvZ2F0ZSBjb21tYW5kcyBkbyBub3QgdG91Y2ggdGhlIGZpbGVzIGluCit0aGUgd29ya2luZyB0cmVlLgorCisKK1N5bmNoaW5nIHJlcG9zaXRvcmllcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtc3luY2hpbmdyZXBvc2l0b3JpZXMudHh0W10KKworVGhlIGZvbGxvd2luZyBhcmUgaGVscGVyIHByb2dyYW1zIHVzZWQgYnkgdGhlIGFib3ZlOyBlbmQgdXNlcnMKK3R5cGljYWxseSBkbyBub3QgdXNlIHRoZW0gZGlyZWN0bHkuCisKK2luY2x1ZGU6OmNtZHMtc3luY2hlbHBlcnMudHh0W10KKworCitJbnRlcm5hbCBoZWxwZXIgY29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBhcmUgaW50ZXJuYWwgaGVscGVyIGNvbW1hbmRzIHVzZWQgYnkgb3RoZXIgY29tbWFuZHM7IGVuZAordXNlcnMgdHlwaWNhbGx5IGRvIG5vdCB1c2UgdGhlbSBkaXJlY3RseS4KKworaW5jbHVkZTo6Y21kcy1wdXJlaGVscGVycy50eHRbXQorCisKK0NvbmZpZ3VyYXRpb24gTWVjaGFuaXNtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdGFydGluZyBmcm9tIDAuOTkuOSAoYWN0dWFsbHkgbWlkIDAuOTkuOC5HSVQpLCBgLmdpdC9jb25maWdgIGZpbGUKK2lzIHVzZWQgdG8gaG9sZCBwZXItcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIG9wdGlvbnMuICBJdCBpcyBhCitzaW1wbGUgdGV4dCBmaWxlIG1vZGVsZWQgYWZ0ZXIgYC5pbmlgIGZvcm1hdCBmYW1pbGlhciB0byBzb21lCitwZW9wbGUuICBIZXJlIGlzIGFuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLQorIworIyBBICcjJyBvciAnOycgY2hhcmFjdGVyIGluZGljYXRlcyBhIGNvbW1lbnQuCisjCisKKzsgY29yZSB2YXJpYWJsZXMKK1tjb3JlXQorCTsgRG9uJ3QgdHJ1c3QgZmlsZSBtb2RlcworCWZpbGVtb2RlID0gZmFsc2UKKworOyB1c2VyIGlkZW50aXR5CitbdXNlcl0KKwluYW1lID0gIkp1bmlvIEMgSGFtYW5vIgorCWVtYWlsID0gImp1bmtpb0B0d2luc3VuLmNvbSIKKworLS0tLS0tLS0tLS0tCisKK1ZhcmlvdXMgY29tbWFuZHMgcmVhZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGFkanVzdAordGhlaXIgb3BlcmF0aW9uIGFjY29yZGluZ2x5LgorCisKK0lkZW50aWZpZXIgVGVybWlub2xvZ3kKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzxvYmplY3Q+OjoKKwlJbmRpY2F0ZXMgdGhlIG9iamVjdCBuYW1lIGZvciBhbnkgdHlwZSBvZiBvYmplY3QuCisKKzxibG9iPjo6CisJSW5kaWNhdGVzIGEgYmxvYiBvYmplY3QgbmFtZS4KKworPHRyZWU+OjoKKwlJbmRpY2F0ZXMgYSB0cmVlIG9iamVjdCBuYW1lLgorCis8Y29tbWl0Pjo6CisJSW5kaWNhdGVzIGEgY29tbWl0IG9iamVjdCBuYW1lLgorCis8dHJlZS1pc2g+OjoKKwlJbmRpY2F0ZXMgYSB0cmVlLCBjb21taXQgb3IgdGFnIG9iamVjdCBuYW1lLiAgQQorCWNvbW1hbmQgdGhhdCB0YWtlcyBhIDx0cmVlLWlzaD4gYXJndW1lbnQgdWx0aW1hdGVseSB3YW50cyB0bworCW9wZXJhdGUgb24gYSA8dHJlZT4gb2JqZWN0IGJ1dCBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlcworCTxjb21taXQ+IGFuZCA8dGFnPiBvYmplY3RzIHRoYXQgcG9pbnQgYXQgYSA8dHJlZT4uCisKKzxjb21taXQtaXNoPjo6CisJSW5kaWNhdGVzIGEgY29tbWl0IG9yIHRhZyBvYmplY3QgbmFtZS4gIEEKKwljb21tYW5kIHRoYXQgdGFrZXMgYSA8Y29tbWl0LWlzaD4gYXJndW1lbnQgdWx0aW1hdGVseSB3YW50cyB0bworCW9wZXJhdGUgb24gYSA8Y29tbWl0PiBvYmplY3QgYnV0IGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2VzCisJPHRhZz4gb2JqZWN0cyB0aGF0IHBvaW50IGF0IGEgPGNvbW1pdD4uCisKKzx0eXBlPjo6CisJSW5kaWNhdGVzIHRoYXQgYW4gb2JqZWN0IHR5cGUgaXMgcmVxdWlyZWQuCisJQ3VycmVudGx5IG9uZSBvZjogYGJsb2JgLCBgdHJlZWAsIGBjb21taXRgLCBvciBgdGFnYC4KKworPGZpbGU+OjoKKwlJbmRpY2F0ZXMgYSBmaWxlbmFtZSAtIGFsbW9zdCBhbHdheXMgcmVsYXRpdmUgdG8gdGhlCisJcm9vdCBvZiB0aGUgdHJlZSBzdHJ1Y3R1cmUgYEdJVF9JTkRFWF9GSUxFYCBkZXNjcmliZXMuCisKK1N5bWJvbGljIElkZW50aWZpZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorQW55IGdpdCBjb21tYW5kIGFjY2VwdGluZyBhbnkgPG9iamVjdD4gY2FuIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcKK3N5bWJvbGljIG5vdGF0aW9uOgorCitIRUFEOjoKKwlpbmRpY2F0ZXMgdGhlIGhlYWQgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIChpLmUuIHRoZQorCWNvbnRlbnRzIG9mIGAkR0lUX0RJUi9IRUFEYCkuCisKKzx0YWc+OjoKKwlhIHZhbGlkIHRhZyAnbmFtZScKKwkoaS5lLiB0aGUgY29udGVudHMgb2YgYCRHSVRfRElSL3JlZnMvdGFncy88dGFnPmApLgorCis8aGVhZD46OgorCWEgdmFsaWQgaGVhZCAnbmFtZScKKwkoaS5lLiB0aGUgY29udGVudHMgb2YgYCRHSVRfRElSL3JlZnMvaGVhZHMvPGhlYWQ+YCkuCisKK0ZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIG9iamVjdCBuYW1lcywgc2VlCisiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdLgorCisKK0ZpbGUvRGlyZWN0b3J5IFN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BsZWFzZSBzZWUgbGluazpyZXBvc2l0b3J5LWxheW91dC5odG1sW3JlcG9zaXRvcnkgbGF5b3V0XSBkb2N1bWVudC4KKworUmVhZCBsaW5rOmhvb2tzLmh0bWxbaG9va3NdIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZWFjaCBob29rLgorCitIaWdoZXIgbGV2ZWwgU0NNcyBtYXkgcHJvdmlkZSBhbmQgbWFuYWdlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlCitgJEdJVF9ESVJgLgorCisKK1Rlcm1pbm9sb2d5CistLS0tLS0tLS0tLQorUGxlYXNlIHNlZSBsaW5rOmdsb3NzYXJ5Lmh0bWxbZ2xvc3NhcnldIGRvY3VtZW50LgorCisKK0Vudmlyb25tZW50IFZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitWYXJpb3VzIGdpdCBjb21tYW5kcyB1c2UgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisKK1RoZSBnaXQgUmVwb3NpdG9yeQorfn5+fn5+fn5+fn5+fn5+fn5+CitUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXBwbHkgdG8gJ2FsbCcgY29yZSBnaXQgY29tbWFuZHMuIE5iOiBpdAoraXMgd29ydGggbm90aW5nIHRoYXQgdGhleSBtYXkgYmUgdXNlZC9vdmVycmlkZGVuIGJ5IFNDTVMgc2l0dGluZyBhYm92ZQorZ2l0IHNvIHRha2UgY2FyZSBpZiB1c2luZyBDb2dpdG8gZXRjLgorCisnR0lUX0lOREVYX0ZJTEUnOjoKKwlUaGlzIGVudmlyb25tZW50IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhbiBhbHRlcm5hdGUKKwlpbmRleCBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvZiBgJEdJVF9ESVIvaW5kZXhgCisJaXMgdXNlZC4KKworJ0dJVF9PQkpFQ1RfRElSRUNUT1JZJzo6CisJSWYgdGhlIG9iamVjdCBzdG9yYWdlIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgdmlhIHRoaXMKKwllbnZpcm9ubWVudCB2YXJpYWJsZSB0aGVuIHRoZSBzaGExIGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkCisJdW5kZXJuZWF0aCAtIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBgJEdJVF9ESVIvb2JqZWN0c2AKKwlkaXJlY3RvcnkgaXMgdXNlZC4KKworJ0dJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTJzo6CisJRHVlIHRvIHRoZSBpbW11dGFibGUgbmF0dXJlIG9mIGdpdCBvYmplY3RzLCBvbGQgb2JqZWN0cyBjYW4gYmUKKwlhcmNoaXZlZCBpbnRvIHNoYXJlZCwgcmVhZC1vbmx5IGRpcmVjdG9yaWVzLiBUaGlzIHZhcmlhYmxlCisJc3BlY2lmaWVzIGEgIjoiIHNlcGFyYXRlZCBsaXN0IG9mIGdpdCBvYmplY3QgZGlyZWN0b3JpZXMgd2hpY2gKKwljYW4gYmUgdXNlZCB0byBzZWFyY2ggZm9yIGdpdCBvYmplY3RzLiBOZXcgb2JqZWN0cyB3aWxsIG5vdCBiZQorCXdyaXR0ZW4gdG8gdGhlc2UgZGlyZWN0b3JpZXMuCisKKydHSVRfRElSJzo6CisJSWYgdGhlICdHSVRfRElSJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdGhlbiBpdAorCXNwZWNpZmllcyBhIHBhdGggdG8gdXNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYC5naXRgCisJZm9yIHRoZSBiYXNlIG9mIHRoZSByZXBvc2l0b3J5LgorCitnaXQgQ29tbWl0cworfn5+fn5+fn5+fn4KKydHSVRfQVVUSE9SX05BTUUnOjoKKydHSVRfQVVUSE9SX0VNQUlMJzo6CisnR0lUX0FVVEhPUl9EQVRFJzo6CisnR0lUX0NPTU1JVFRFUl9OQU1FJzo6CisnR0lUX0NPTU1JVFRFUl9FTUFJTCc6OgorJ0dJVF9DT01NSVRURVJfREFURSc6OgorJ0VNQUlMJzo6CisJc2VlIGdpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdCisKK2dpdCBEaWZmcworfn5+fn5+fn5+CisnR0lUX0RJRkZfT1BUUyc6OgorCU9ubHkgdmFsaWQgc2V0dGluZyBpcyAiLS11bmlmaWVkPT8/IiBvciAiLXU/PyIgdG8gc2V0IHRoZQorCW51bWJlciBvZiBjb250ZXh0IGxpbmVzIHNob3duIHdoZW4gYSB1bmlmaWVkIGRpZmYgaXMgY3JlYXRlZC4KKwlUaGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhbnkgIi1VIiBvciAiLS11bmlmaWVkIiBvcHRpb24KKwl2YWx1ZSBwYXNzZWQgb24gdGhlIGdpdCBkaWZmIGNvbW1hbmQgbGluZS4KKworJ0dJVF9FWFRFUk5BTF9ESUZGJzo6CisJV2hlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ0dJVF9FWFRFUk5BTF9ESUZGJyBpcyBzZXQsIHRoZQorCXByb2dyYW0gbmFtZWQgYnkgaXQgaXMgY2FsbGVkLCBpbnN0ZWFkIG9mIHRoZSBkaWZmIGludm9jYXRpb24KKwlkZXNjcmliZWQgYWJvdmUuICBGb3IgYSBwYXRoIHRoYXQgaXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkLAorICAgICAgICAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDcgcGFyYW1ldGVyczoKKworCXBhdGggb2xkLWZpbGUgb2xkLWhleCBvbGQtbW9kZSBuZXctZmlsZSBuZXctaGV4IG5ldy1tb2RlCisrCit3aGVyZToKKworCTxvbGR8bmV3Pi1maWxlOjogYXJlIGZpbGVzIEdJVF9FWFRFUk5BTF9ESUZGIGNhbiB1c2UgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyBvZiA8b2xkfG5ldz4sCisJPG9sZHxuZXc+LWhleDo6IGFyZSB0aGUgNDAtaGV4ZGlnaXQgU0hBMSBoYXNoZXMsCisJPG9sZHxuZXc+LW1vZGU6OiBhcmUgdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWxlIG1vZGVzLgorCisrCitUaGUgZmlsZSBwYXJhbWV0ZXJzIGNhbiBwb2ludCBhdCB0aGUgdXNlcidzIHdvcmtpbmcgZmlsZQorKGUuZy4gYG5ldy1maWxlYCBpbiAiZ2l0LWRpZmYtZmlsZXMiKSwgYC9kZXYvbnVsbGAgKGUuZy4gYG9sZC1maWxlYAord2hlbiBhIG5ldyBmaWxlIGlzIGFkZGVkKSwgb3IgYSB0ZW1wb3JhcnkgZmlsZSAoZS5nLiBgb2xkLWZpbGVgIGluIHRoZQoraW5kZXgpLiAgJ0dJVF9FWFRFUk5BTF9ESUZGJyBzaG91bGQgbm90IHdvcnJ5IGFib3V0IHVubGlua2luZyB0aGUKK3RlbXBvcmFyeSBmaWxlIC0tLSBpdCBpcyByZW1vdmVkIHdoZW4gJ0dJVF9FWFRFUk5BTF9ESUZGJyBleGl0cy4KKysKK0ZvciBhIHBhdGggdGhhdCBpcyB1bm1lcmdlZCwgJ0dJVF9FWFRFUk5BTF9ESUZGJyBpcyBjYWxsZWQgd2l0aCAxCitwYXJhbWV0ZXIsIDxwYXRoPi4KKworb3RoZXIKK35+fn5+CisnR0lUX1BBR0VSJzo6CisJVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgYCRQQUdFUmAuCisKKydHSVRfVFJBQ0UnOjoKKwlJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAiMSIsICIyIiBvciAidHJ1ZSIgKGNvbXBhcmlzb24KKwlpcyBjYXNlIGluc2Vuc2l0aXZlKSwgZ2l0IHdpbGwgcHJpbnQgYHRyYWNlOmAgbWVzc2FnZXMgb24KKwlzdGRlcnIgdGVsbGluZyBhYm91dCBhbGlhcyBleHBhbnNpb24sIGJ1aWx0LWluIGNvbW1hbmQKKwlleGVjdXRpb24gYW5kIGV4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uLgorCUlmIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIGFuIGludGVnZXIgdmFsdWUgZ3JlYXRlciB0aGFuIDEKKwlhbmQgbG93ZXIgdGhhbiAxMCAoc3RyaWN0bHkpIHRoZW4gZ2l0IHdpbGwgaW50ZXJwcmV0IHRoaXMKKwl2YWx1ZSBhcyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBhbmQgd2lsbCB0cnkgdG8gd3JpdGUgdGhlCisJdHJhY2UgbWVzc2FnZXMgaW50byB0aGlzIGZpbGUgZGVzY3JpcHRvci4KKwlBbHRlcm5hdGl2ZWx5LCBpZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byBhbiBhYnNvbHV0ZSBwYXRoCisJKHN0YXJ0aW5nIHdpdGggYSAnLycgY2hhcmFjdGVyKSwgZ2l0IHdpbGwgaW50ZXJwcmV0IHRoaXMKKwlhcyBhIGZpbGUgcGF0aCBhbmQgd2lsbCB0cnkgdG8gd3JpdGUgdGhlIHRyYWNlIG1lc3NhZ2VzCisJaW50byBpdC4KKworRGlzY3Vzc2lvbltbRGlzY3Vzc2lvbl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmNvcmUtaW50cm8udHh0W10KKworQXV0aG9ycworLS0tLS0tLQorKiBnaXQncyBmb3VuZGluZyBmYXRoZXIgaXMgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPi4KKyogVGhlIGN1cnJlbnQgZ2l0IG51cnNlIGlzIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4uCisqIFRoZSBnaXQgcG90dHkgd2FzIHdyaXR0ZW4gYnkgQW5kcmVzIEVyaWNzc29uIDxhZUBvcDUuc2U+LgorKiBHZW5lcmFsIHVwYnJpbmdpbmcgaXMgaGFuZGxlZCBieSB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorVGhlIGRvY3VtZW50YXRpb24gZm9yIGdpdCBzdWl0ZSB3YXMgc3RhcnRlZCBieSBEYXZpZCBHcmVhdmVzCis8ZGF2aWRAZGdyZWF2ZXMuY29tPiwgYW5kIGxhdGVyIGVuaGFuY2VkIGdyZWF0bHkgYnkgdGhlCitjb250cmlidXRvcnMgb24gdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0YXR0cmlidXRlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdGF0dHJpYnV0ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWM5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdGF0dHJpYnV0ZXMudHh0CkBAIC0wLDAgKzEsMzc5IEBACitnaXRhdHRyaWJ1dGVzKDUpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdGF0dHJpYnV0ZXMgLSBkZWZpbmluZyBhdHRyaWJ1dGVzIHBlciBwYXRoCisKK1NZTk9QU0lTCistLS0tLS0tLQorJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzLCBnaXRhdHRyaWJ1dGVzCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK0EgYGdpdGF0dHJpYnV0ZXNgIGZpbGUgaXMgYSBzaW1wbGUgdGV4dCBmaWxlIHRoYXQgZ2l2ZXMKK2BhdHRyaWJ1dGVzYCB0byBwYXRobmFtZXMuCisKK0VhY2ggbGluZSBpbiBgZ2l0YXR0cmlidXRlc2AgZmlsZSBpcyBvZiBmb3JtOgorCisJZ2xvYglhdHRyMSBhdHRyMiAuLi4KKworVGhhdCBpcywgYSBnbG9iIHBhdHRlcm4gZm9sbG93ZWQgYnkgYW4gYXR0cmlidXRlcyBsaXN0LAorc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2VzLiAgV2hlbiB0aGUgZ2xvYiBwYXR0ZXJuIG1hdGNoZXMgdGhlCitwYXRoIGluIHF1ZXN0aW9uLCB0aGUgYXR0cmlidXRlcyBsaXN0ZWQgb24gdGhlIGxpbmUgYXJlIGdpdmVuIHRvCit0aGUgcGF0aC4KKworRWFjaCBhdHRyaWJ1dGUgY2FuIGJlIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXMgZm9yIGEgZ2l2ZW4gcGF0aDoKKworU2V0OjoKKworCVRoZSBwYXRoIGhhcyB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lhbCB2YWx1ZSAidHJ1ZSI7CisJdGhpcyBpcyBzcGVjaWZpZWQgYnkgbGlzdGluZyBvbmx5IHRoZSBuYW1lIG9mIHRoZQorCWF0dHJpYnV0ZSBpbiB0aGUgYXR0cmlidXRlIGxpc3QuCisKK1Vuc2V0OjoKKworCVRoZSBwYXRoIGhhcyB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lhbCB2YWx1ZSAiZmFsc2UiOworCXRoaXMgaXMgc3BlY2lmaWVkIGJ5IGxpc3RpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorCXByZWZpeGVkIHdpdGggYSBkYXNoIGAtYCBpbiB0aGUgYXR0cmlidXRlIGxpc3QuCisKK1NldCB0byBhIHZhbHVlOjoKKworCVRoZSBwYXRoIGhhcyB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lmaWVkIHN0cmluZyB2YWx1ZTsKKwl0aGlzIGlzIHNwZWNpZmllZCBieSBsaXN0aW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKwlmb2xsb3dlZCBieSBhbiBlcXVhbCBzaWduIGA9YCBhbmQgaXRzIHZhbHVlIGluIHRoZQorCWF0dHJpYnV0ZSBsaXN0LgorCitVbnNwZWNpZmllZDo6CisKKwlObyBnbG9iIHBhdHRlcm4gbWF0Y2hlcyB0aGUgcGF0aCwgYW5kIG5vdGhpbmcgc2F5cyBpZgorCXRoZSBwYXRoIGhhcyBvciBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUsIHRoZQorCWF0dHJpYnV0ZSBmb3IgdGhlIHBhdGggaXMgc2FpZCB0byBiZSBVbnNwZWNpZmllZC4KKworV2hlbiBtb3JlIHRoYW4gb25lIGdsb2IgcGF0dGVybiBtYXRjaGVzIHRoZSBwYXRoLCBhIGxhdGVyIGxpbmUKK292ZXJyaWRlcyBhbiBlYXJsaWVyIGxpbmUuICBUaGlzIG92ZXJyaWRpbmcgaXMgZG9uZSBwZXIKK2F0dHJpYnV0ZS4KKworV2hlbiBkZWNpZGluZyB3aGF0IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIHRvIGEgcGF0aCwgZ2l0Citjb25zdWx0cyBgJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzYCBmaWxlICh3aGljaCBoYXMgdGhlIGhpZ2hlc3QKK3ByZWNlZGVuY2UpLCBgLmdpdGF0dHJpYnV0ZXNgIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQorcGF0aCBpbiBxdWVzdGlvbiwgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3JpZXMgKHRoZSBmdXJ0aGVyIHRoZQorZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYC5naXRhdHRyaWJ1dGVzYCBpcyBmcm9tIHRoZSBwYXRoIGluCitxdWVzdGlvbiwgdGhlIGxvd2VyIGl0cyBwcmVjZWRlbmNlKS4KKworU29tZXRpbWVzIHlvdSB3b3VsZCBuZWVkIHRvIG92ZXJyaWRlIGFuIHNldHRpbmcgb2YgYW4gYXR0cmlidXRlCitmb3IgYSBwYXRoIHRvIGB1bnNwZWNpZmllZGAgc3RhdGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGxpc3RpbmcKK3RoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvbiBwb2ludCBgIWAuCisKKworRUZGRUNUUworLS0tLS0tLQorCitDZXJ0YWluIG9wZXJhdGlvbnMgYnkgZ2l0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGFzc2lnbmluZworcGFydGljdWxhciBhdHRyaWJ1dGVzIHRvIGEgcGF0aC4gIEN1cnJlbnRseSwgdGhyZWUgb3BlcmF0aW9ucworYXJlIGF0dHJpYnV0ZXMtYXdhcmUuCisKK0NoZWNraW5nLW91dCBhbmQgY2hlY2tpbmctaW4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlc2UgYXR0cmlidXRlcyBhZmZlY3QgaG93IHRoZSBjb250ZW50cyBzdG9yZWQgaW4gdGhlCityZXBvc2l0b3J5IGFyZSBjb3BpZWQgdG8gdGhlIHdvcmtpbmcgdHJlZSBmaWxlcyB3aGVuIGNvbW1hbmRzCitzdWNoIGFzIGBnaXQgY2hlY2tvdXRgIGFuZCBgZ2l0IG1lcmdlYCBydW4uICBUaGV5IGFsc28gYWZmZWN0IGhvdworZ2l0IHN0b3JlcyB0aGUgY29udGVudHMgeW91IHByZXBhcmUgaW4gdGhlIHdvcmtpbmcgdHJlZSBpbiB0aGUKK3JlcG9zaXRvcnkgdXBvbiBgZ2l0IGFkZGAgYW5kIGBnaXQgY29tbWl0YC4KKworYGNybGZgCiteXl5eXl4KKworVGhpcyBhdHRyaWJ1dGUgY29udHJvbHMgdGhlIGxpbmUtZW5kaW5nIGNvbnZlbnRpb24uCisKK1NldDo6CisKKwlTZXR0aW5nIHRoZSBgY3JsZmAgYXR0cmlidXRlIG9uIGEgcGF0aCBpcyBtZWFudCB0byBtYXJrCisJdGhlIHBhdGggYXMgYSAidGV4dCIgZmlsZS4gICdjb3JlLmF1dG9jcmxmJyBjb252ZXJzaW9uCisJdGFrZXMgcGxhY2Ugd2l0aG91dCBndWVzc2luZyB0aGUgY29udGVudCB0eXBlIGJ5CisJaW5zcGVjdGlvbi4KKworVW5zZXQ6OgorCisJVW5zZXR0aW5nIHRoZSBgY3JsZmAgYXR0cmlidXRlIG9uIGEgcGF0aCBpcyBtZWFudCB0bworCW1hcmsgdGhlIHBhdGggYXMgYSAiYmluYXJ5IiBmaWxlLiAgVGhlIHBhdGggbmV2ZXIgZ29lcworCXRocm91Z2ggbGluZSBlbmRpbmdzIGNvbnZlcnNpb24gdXBvbiBjaGVja2luL2NoZWNrb3V0LgorCitVbnNwZWNpZmllZDo6CisKKwlVbnNwZWNpZmllZCBgY3JsZmAgYXR0cmlidXRlIHRlbGxzIGdpdCB0byBhcHBseSB0aGUKKwlgY29yZS5hdXRvY3JsZmAgY29udmVyc2lvbiB3aGVuIHRoZSBmaWxlIGNvbnRlbnQgbG9va3MKKwlsaWtlIHRleHQuCisKK1NldCB0byBzdHJpbmcgdmFsdWUgImlucHV0Ijo6CisKKwlUaGlzIGlzIHNpbWlsYXIgdG8gc2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGB0cnVlYCwgYnV0CisJYWxzbyBmb3JjZXMgZ2l0IHRvIGFjdCBhcyBpZiBgY29yZS5hdXRvY3JsZmAgaXMgc2V0IHRvCisJYGlucHV0YCBmb3IgdGhlIHBhdGguCisKK0FueSBvdGhlciB2YWx1ZSBzZXQgdG8gYGNybGZgIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGFuZCBnaXQgYWN0cworYXMgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsZWZ0IHVuc3BlY2lmaWVkLgorCisKK1RoZSBgY29yZS5hdXRvY3JsZmAgY29udmVyc2lvbgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK0lmIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGBjb3JlLmF1dG9jcmxmYCBpcyBmYWxzZSwgbm8KK2NvbnZlcnNpb24gaXMgZG9uZS4KKworV2hlbiBgY29yZS5hdXRvY3JsZmAgaXMgdHJ1ZSwgaXQgbWVhbnMgdGhhdCB0aGUgcGxhdGZvcm0gd2FudHMKK0NSTEYgbGluZSBlbmRpbmdzIGZvciBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlLCBhbmQgeW91IHdhbnQgdG8KK2NvbnZlcnQgdGhlbSBiYWNrIHRvIHRoZSBub3JtYWwgTEYgbGluZSBlbmRpbmdzIHdoZW4gY2hlY2tpbmcKK2luIHRvIHRoZSByZXBvc2l0b3J5LgorCitXaGVuIGBjb3JlLmF1dG9jcmxmYCBpcyBzZXQgdG8gImlucHV0IiwgbGluZSBlbmRpbmdzIGFyZQorY29udmVydGVkIHRvIExGIHVwb24gY2hlY2tpbiwgYnV0IHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gZG9uZQordXBvbiBjaGVja291dC4KKworCitgaWRlbnRgCiteXl5eXl5eCisKK1doZW4gdGhlIGF0dHJpYnV0ZSBgaWRlbnRgIGlzIHNldCB0byBhIHBhdGgsIGdpdCByZXBsYWNlcworYCRJZCRgIGluIHRoZSBibG9iIG9iamVjdCB3aXRoIGAkSWQ6YCwgZm9sbG93ZWQgYnkKKzQwLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBibG9iIG9iamVjdCBuYW1lLCBmb2xsb3dlZCBieSBhIGRvbGxhcgorc2lnbiBgJGAgdXBvbiBjaGVja291dC4gIEFueSBieXRlIHNlcXVlbmNlIHRoYXQgYmVnaW5zIHdpdGgKK2AkSWQ6YCBhbmQgZW5kcyB3aXRoIGAkYCBpbiB0aGUgd29ya3RyZWUgZmlsZSBpcyByZXBsYWNlZAord2l0aCBgJElkJGAgdXBvbiBjaGVjay1pbi4KKworCitJbnRlcmFjdGlvbiBiZXR3ZWVuIGNoZWNraW4vY2hlY2tvdXQgYXR0cmlidXRlcworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworSW4gdGhlIGNoZWNrLWluIGNvZGVwYXRoLCB0aGUgd29ya3RyZWUgZmlsZSBpcyBmaXJzdCBjb252ZXJ0ZWQKK3dpdGggYGlkZW50YCAoaWYgc3BlY2lmaWVkKSwgYW5kIHRoZW4gd2l0aCBgY3JsZmAgKGFnYWluLCBpZgorc3BlY2lmaWVkIGFuZCBhcHBsaWNhYmxlKS4KKworSW4gdGhlIGNoZWNrLW91dCBjb2RlcGF0aCwgdGhlIGJsb2IgY29udGVudCBpcyBmaXJzdCBjb252ZXJ0ZWQKK3dpdGggYGNybGZgLCBhbmQgdGhlbiBgaWRlbnRgLgorCisKK2BmaWx0ZXJgCiteXl5eXl5eXgorCitBIGBmaWx0ZXJgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IHRvIGEgc3RyaW5nIHZhbHVlLiAgVGhpcyBuYW1lcworZmlsdGVyIGRyaXZlciBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCisKK0EgZmlsdGVyIGRyaXZlciBjb25zaXN0cyBvZiBgY2xlYW5gIGNvbW1hbmQgYW5kIGBzbXVkZ2VgCitjb21tYW5kLCBlaXRoZXIgb2Ygd2hpY2ggY2FuIGJlIGxlZnQgdW5zcGVjaWZpZWQuICBVcG9uCitjaGVja291dCwgd2hlbiBgc211ZGdlYCBjb21tYW5kIGlzIHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgaXMgZmVkCit0aGUgYmxvYiBvYmplY3QgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQsIGFuZCBpdHMgc3RhbmRhcmQgb3V0cHV0CitpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgd29ya3RyZWUgZmlsZS4gIFNpbWlsYXJseSwgYGNsZWFuYCBjb21tYW5kCitpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGNvbnRlbnRzIG9mIHdvcmt0cmVlIGZpbGUgdXBvbiBjaGVja2luLgorCitNaXNzaW5nIGZpbHRlciBkcml2ZXIgZGVmaW5pdGlvbiBpbiB0aGUgY29uZmlnIGlzIG5vdCBhbiBlcnJvcgorYnV0IG1ha2VzIHRoZSBmaWx0ZXIgYSBuby1vcCBwYXNzdGhydS4KKworVGhlIGNvbnRlbnQgZmlsdGVyaW5nIGlzIGRvbmUgdG8gbWFzc2FnZSB0aGUgY29udGVudCBpbnRvIGEKK3NoYXBlIHRoYXQgaXMgbW9yZSBjb252ZW5pZW50IGZvciB0aGUgcGxhdGZvcm0sIGZpbGVzeXN0ZW0sIGFuZAordGhlIHVzZXIgdG8gdXNlLiAgVGhlIGtleXdvcmQgaGVyZSBpcyAibW9yZSBjb252ZW5pZW50IiBhbmQgbm90CisidHVybmluZyBzb21ldGhpbmcgdW51c2FibGUgaW50byB1c2FibGUiLiAgSW4gb3RoZXIgd29yZHMsIGl0IGlzCisiaGFuZ2luZyB5b3Vyc2VsZiBiZWNhdXNlIHdlIGdhdmUgeW91IGEgbG9uZyByb3BlIiBpZiB5b3VyCitwcm9qZWN0IHVzZXMgZmlsdGVyaW5nIG1lY2hhbmlzbSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgbWFrZXMKK3lvdXIgcHJvamVjdCB1bnVzYWJsZSB1bmxlc3MgdGhlIGNoZWNrb3V0IGlzIGRvbmUgd2l0aCBhCitzcGVjaWZpYyBmaWx0ZXIgaW4gZWZmZWN0LgorCisKK0ludGVyYWN0aW9uIGJldHdlZW4gY2hlY2tpbi9jaGVja291dCBhdHRyaWJ1dGVzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitJbiB0aGUgY2hlY2staW4gY29kZXBhdGgsIHRoZSB3b3JrdHJlZSBmaWxlIGlzIGZpcnN0IGNvbnZlcnRlZAord2l0aCBgZmlsdGVyYCBkcml2ZXIgKGlmIHNwZWNpZmllZCBhbmQgY29ycmVzcG9uZGluZyBkcml2ZXIKK2RlZmluZWQpLCB0aGVuIHRoZSByZXN1bHQgaXMgcHJvY2Vzc2VkIHdpdGggYGlkZW50YCAoaWYKK3NwZWNpZmllZCksIGFuZCB0aGVuIGZpbmFsbHkgd2l0aCBgY3JsZmAgKGFnYWluLCBpZiBzcGVjaWZpZWQKK2FuZCBhcHBsaWNhYmxlKS4KKworSW4gdGhlIGNoZWNrLW91dCBjb2RlcGF0aCwgdGhlIGJsb2IgY29udGVudCBpcyBmaXJzdCBjb252ZXJ0ZWQKK3dpdGggYGNybGZgLCBhbmQgdGhlbiBgaWRlbnRgIGFuZCBmZWQgdG8gYGZpbHRlcmAuCisKKworR2VuZXJhdGluZyBkaWZmIHRleHQKK35+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBhdHRyaWJ1dGUgYGRpZmZgIGFmZmVjdHMgaWYgYGdpdCBkaWZmYCBnZW5lcmF0ZXMgdGV4dHVhbAorcGF0Y2ggZm9yIHRoZSBwYXRoIG9yIGp1c3Qgc2F5cyBgQmluYXJ5IGZpbGVzIGRpZmZlcmAuCisKK1NldDo6CisKKwlBIHBhdGggdG8gd2hpY2ggdGhlIGBkaWZmYCBhdHRyaWJ1dGUgaXMgc2V0IGlzIHRyZWF0ZWQKKwlhcyB0ZXh0LCBldmVuIHdoZW4gdGhleSBjb250YWluIGJ5dGUgdmFsdWVzIHRoYXQKKwlub3JtYWxseSBuZXZlciBhcHBlYXIgaW4gdGV4dCBmaWxlcywgc3VjaCBhcyBOVUwuCisKK1Vuc2V0OjoKKworCUEgcGF0aCB0byB3aGljaCB0aGUgYGRpZmZgIGF0dHJpYnV0ZSBpcyB1bnNldCB3aWxsCisJZ2VuZXJhdGUgYEJpbmFyeSBmaWxlcyBkaWZmZXJgLgorCitVbnNwZWNpZmllZDo6CisKKwlBIHBhdGggdG8gd2hpY2ggdGhlIGBkaWZmYCBhdHRyaWJ1dGUgaXMgdW5zcGVjaWZpZWQKKwlmaXJzdCBnZXRzIGl0cyBjb250ZW50cyBpbnNwZWN0ZWQsIGFuZCBpZiBpdCBsb29rcyBsaWtlCisJdGV4dCwgaXQgaXMgdHJlYXRlZCBhcyB0ZXh0LiAgT3RoZXJ3aXNlIGl0IHdvdWxkCisJZ2VuZXJhdGUgYEJpbmFyeSBmaWxlcyBkaWZmZXJgLgorCitTdHJpbmc6OgorCisJRGlmZiBpcyBzaG93biB1c2luZyB0aGUgc3BlY2lmaWVkIGN1c3RvbSBkaWZmIGRyaXZlci4KKwlUaGUgZHJpdmVyIHByb2dyYW0gaXMgZ2l2ZW4gaXRzIGlucHV0IHVzaW5nIHRoZSBzYW1lCisJY2FsbGluZyBjb252ZW50aW9uIGFzIHVzZWQgZm9yIEdJVF9FWFRFUk5BTF9ESUZGCisJcHJvZ3JhbS4KKworCitEZWZpbmluZyBhIGN1c3RvbSBkaWZmIGRyaXZlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhlIGRlZmluaXRpb24gb2YgYSBkaWZmIGRyaXZlciBpcyBkb25lIGluIGBnaXRjb25maWdgLCBub3QKK2BnaXRhdHRyaWJ1dGVzYCBmaWxlLCBzbyBzdHJpY3RseSBzcGVha2luZyB0aGlzIG1hbnVhbCBwYWdlIGlzIGEKK3dyb25nIHBsYWNlIHRvIHRhbGsgYWJvdXQgaXQuICBIb3dldmVyLi4uCisKK1RvIGRlZmluZSBhIGN1c3RvbSBkaWZmIGRyaXZlciBgamNkaWZmYCwgYWRkIGEgc2VjdGlvbiB0byB5b3VyCitgJEdJVF9ESVIvY29uZmlnYCBmaWxlIChvciBgJEhPTUUvLmdpdGNvbmZpZ2AgZmlsZSkgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbZGlmZiAiamNkaWZmIl0KKwljb21tYW5kID0gai1jLWRpZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBnaXQgbmVlZHMgdG8gc2hvdyB5b3UgYSBkaWZmIGZvciB0aGUgcGF0aCB3aXRoIGBkaWZmYAorYXR0cmlidXRlIHNldCB0byBgamNkaWZmYCwgaXQgY2FsbHMgdGhlIGNvbW1hbmQgeW91IHNwZWNpZmllZAord2l0aCB0aGUgYWJvdmUgY29uZmlndXJhdGlvbiwgaS5lLiBgai1jLWRpZmZgLCB3aXRoIDcKK3BhcmFtZXRlcnMsIGp1c3QgbGlrZSBgR0lUX0VYVEVSTkFMX0RJRkZgIHByb2dyYW0gaXMgY2FsbGVkLgorU2VlIGdpdGxpbms6Z2l0WzddIGZvciBkZXRhaWxzLgorCisKK1BlcmZvcm1pbmcgYSB0aHJlZS13YXkgbWVyZ2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGF0dHJpYnV0ZSBgbWVyZ2VgIGFmZmVjdHMgaG93IHRocmVlIHZlcnNpb25zIG9mIGEgZmlsZSBpcworbWVyZ2VkIHdoZW4gYSBmaWxlLWxldmVsIG1lcmdlIGlzIG5lY2Vzc2FyeSBkdXJpbmcgYGdpdCBtZXJnZWAsCithbmQgb3RoZXIgcHJvZ3JhbXMgc3VjaCBhcyBgZ2l0IHJldmVydGAgYW5kIGBnaXQgY2hlcnJ5LXBpY2tgLgorCitTZXQ6OgorCisJQnVpbHQtaW4gMy13YXkgbWVyZ2UgZHJpdmVyIGlzIHVzZWQgdG8gbWVyZ2UgdGhlCisJY29udGVudHMgaW4gYSB3YXkgc2ltaWxhciB0byBgbWVyZ2VgIGNvbW1hbmQgb2YgYFJDU2AKKwlzdWl0ZS4gIFRoaXMgaXMgc3VpdGFibGUgZm9yIG9yZGluYXJ5IHRleHQgZmlsZXMuCisKK1Vuc2V0OjoKKworCVRha2UgdGhlIHZlcnNpb24gZnJvbSB0aGUgY3VycmVudCBicmFuY2ggYXMgdGhlCisJdGVudGF0aXZlIG1lcmdlIHJlc3VsdCwgYW5kIGRlY2xhcmUgdGhhdCB0aGUgbWVyZ2UgaGFzCisJY29uZmxpY3RzLiAgVGhpcyBpcyBzdWl0YWJsZSBmb3IgYmluYXJ5IGZpbGVzIHRoYXQgZG9lcworCW5vdCBoYXZlIGEgd2VsbC1kZWZpbmVkIG1lcmdlIHNlbWFudGljcy4KKworVW5zcGVjaWZpZWQ6OgorCisJQnkgZGVmYXVsdCwgdGhpcyB1c2VzIHRoZSBzYW1lIGJ1aWx0LWluIDMtd2F5IG1lcmdlCisJZHJpdmVyIGFzIGlzIHRoZSBjYXNlIHRoZSBgbWVyZ2VgIGF0dHJpYnV0ZSBpcyBzZXQuCisJSG93ZXZlciwgYG1lcmdlLmRlZmF1bHRgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgY2FuIG5hbWUKKwlkaWZmZXJlbnQgbWVyZ2UgZHJpdmVyIHRvIGJlIHVzZWQgZm9yIHBhdGhzIHRvIHdoaWNoIHRoZQorCWBtZXJnZWAgYXR0cmlidXRlIGlzIHVuc3BlY2lmaWVkLgorCitTdHJpbmc6OgorCisJMy13YXkgbWVyZ2UgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgY3VzdG9tCisJbWVyZ2UgZHJpdmVyLiAgVGhlIGJ1aWx0LWluIDMtd2F5IG1lcmdlIGRyaXZlciBjYW4gYmUKKwlleHBsaWNpdGx5IHNwZWNpZmllZCBieSBhc2tpbmcgZm9yICJ0ZXh0IiBkcml2ZXI7IHRoZQorCWJ1aWx0LWluICJ0YWtlIHRoZSBjdXJyZW50IGJyYW5jaCIgZHJpdmVyIGNhbiBiZQorCXJlcXVlc3RlZCB3aXRoICJiaW5hcnkiLgorCisKK0RlZmluaW5nIGEgY3VzdG9tIG1lcmdlIGRyaXZlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RoZSBkZWZpbml0aW9uIG9mIGEgbWVyZ2UgZHJpdmVyIGlzIGRvbmUgaW4gYGdpdGNvbmZpZ2Agbm90CitgZ2l0YXR0cmlidXRlc2AgZmlsZSwgc28gc3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBtYW51YWwgcGFnZSBpcyBhCit3cm9uZyBwbGFjZSB0byB0YWxrIGFib3V0IGl0LiAgSG93ZXZlci4uLgorCitUbyBkZWZpbmUgYSBjdXN0b20gbWVyZ2UgZHJpdmVyIGBmaWxmcmVgLCBhZGQgYSBzZWN0aW9uIHRvIHlvdXIKK2AkR0lUX0RJUi9jb25maWdgIGZpbGUgKG9yIGAkSE9NRS8uZ2l0Y29uZmlnYCBmaWxlKSBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ttZXJnZSAiZmlsZnJlIl0KKwluYW1lID0gZmVlbC1mcmVlIG1lcmdlIGRyaXZlcgorCWRyaXZlciA9IGZpbGZyZSAlTyAlQSAlQgorCXJlY3Vyc2l2ZSA9IGJpbmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYG1lcmdlLioubmFtZWAgdmFyaWFibGUgZ2l2ZXMgdGhlIGRyaXZlciBhIGh1bWFuLXJlYWRhYmxlCituYW1lLgorCitUaGUgYG1lcmdlLiouZHJpdmVyYCB2YXJpYWJsZSdzIHZhbHVlIGlzIHVzZWQgdG8gY29uc3RydWN0IGEKK2NvbW1hbmQgdG8gcnVuIHRvIG1lcmdlIGFuY2VzdG9yJ3MgdmVyc2lvbiAoYCVPYCksIGN1cnJlbnQKK3ZlcnNpb24gKGAlQWApIGFuZCB0aGUgb3RoZXIgYnJhbmNoZXMnIHZlcnNpb24gKGAlQmApLiAgVGhlc2UKK3RocmVlIHRva2VucyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZXMgb2YgdGVtcG9yYXJ5IGZpbGVzIHRoYXQKK2hvbGQgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIHZlcnNpb25zIHdoZW4gdGhlIGNvbW1hbmQgbGluZSBpcworYnVpbHQuCisKK1RoZSBtZXJnZSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gbGVhdmUgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UgaW4KK3RoZSBmaWxlIG5hbWVkIHdpdGggYCVBYCBieSBvdmVyd3JpdGluZyBpdCwgYW5kIGV4aXQgd2l0aCB6ZXJvCitzdGF0dXMgaWYgaXQgbWFuYWdlZCB0byBtZXJnZSB0aGVtIGNsZWFubHksIG9yIG5vbi16ZXJvIGlmIHRoZXJlCit3ZXJlIGNvbmZsaWN0cy4KKworVGhlIGBtZXJnZS4qLnJlY3Vyc2l2ZWAgdmFyaWFibGUgc3BlY2lmaWVzIHdoYXQgb3RoZXIgbWVyZ2UKK2RyaXZlciB0byB1c2Ugd2hlbiB0aGUgbWVyZ2UgZHJpdmVyIGlzIGNhbGxlZCBmb3IgYW4gaW50ZXJuYWwKK21lcmdlIGJldHdlZW4gY29tbW9uIGFuY2VzdG9ycywgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZS4KK1doZW4gbGVmdCB1bnNwZWNpZmllZCwgdGhlIGRyaXZlciBpdHNlbGYgaXMgdXNlZCBmb3IgYm90aAoraW50ZXJuYWwgbWVyZ2UgYW5kIHRoZSBmaW5hbCBtZXJnZS4KKworCitFWEFNUExFCistLS0tLS0tCisKK0lmIHlvdSBoYXZlIHRoZXNlIHRocmVlIGBnaXRhdHRyaWJ1dGVzYCBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoaW4gJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzKQorCithKglmb28gIWJhciAtYmF6CisKKyhpbiAuZ2l0YXR0cmlidXRlcykKK2FiYwlmb28gYmFyIGJhegorCisoaW4gdC8uZ2l0YXR0cmlidXRlcykKK2FiKgltZXJnZT1maWxmcmUKK2FiYwktZm9vIC1iYXIKKyouYwlmcm90egorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGUgYXR0cmlidXRlcyBnaXZlbiB0byBwYXRoIGB0L2FiY2AgYXJlIGNvbXB1dGVkIGFzIGZvbGxvd3M6CisKKzEuIEJ5IGV4YW1pbmluZyBgdC8uZ2l0YXR0cmlidXRlc2AgKHdoaWNoIGlzIGluIHRoZSBzYW1lCisgICBkaXJldG9yeSBhcyB0aGUgcGF0aCBpbiBxdWVzdGlvbiksIGdpdCBmaW5kcyB0aGF0IHRoZSBmaXJzdAorICAgbGluZSBtYXRjaGVzLiAgYG1lcmdlYCBhdHRyaWJ1dGUgaXMgc2V0LiAgSXQgYWxzbyBmaW5kcyB0aGF0CisgICB0aGUgc2Vjb25kIGxpbmUgbWF0Y2hlcywgYW5kIGF0dHJpYnV0ZXMgYGZvb2AgYW5kIGBiYXJgCisgICBhcmUgdW5zZXQuCisKKzIuIFRoZW4gaXQgZXhhbWluZXMgYC5naXRhdHRyaWJ1dGVzYCAod2hpY2ggaXMgaW4gdGhlIHBhcmVudAorICAgZGlyZWN0b3J5KSwgYW5kIGZpbmRzIHRoYXQgdGhlIGZpcnN0IGxpbmUgbWF0Y2hlcywgYnV0CisgICBgdC8uZ2l0YXR0cmlidXRlc2AgZmlsZSBhbHJlYWR5IGRlY2lkZWQgaG93IGBtZXJnZWAsIGBmb29gCisgICBhbmQgYGJhcmAgYXR0cmlidXRlcyBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhpcyBwYXRoLCBzbyBpdAorICAgbGVhdmVzIGBmb29gIGFuZCBgYmFyYCB1bnNldC4gIEF0dHJpYnV0ZSBgYmF6YCBpcyBzZXQuCisKKzMuIEZpbmFsbHkgaXQgZXhhbWluZXMgYCRHSVRfRElSL2luZm8vZ2l0YXR0cmlidXRlc2AuICBUaGlzIGZpbGUKKyAgIGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGluLXRyZWUgc2V0dGluZ3MuICBUaGUgZmlyc3QgbGluZSBpcworICAgYSBtYXRjaCwgYW5kIGBmb29gIGlzIHNldCwgYGJhcmAgaXMgcmV2ZXJ0ZWQgdG8gdW5zcGVjaWZpZWQKKyAgIHN0YXRlLCBhbmQgYGJhemAgaXMgdW5zZXQuCisKK0FzIHRoZSByZXN1bHQsIHRoZSBhdHRyaWJ1dGVzIGFzc2lnbmVtZW50IHRvIGB0L2FiY2AgYmVjb21lczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9vCXNldCB0byB0cnVlCitiYXIJdW5zcGVjaWZpZWQKK2JheglzZXQgdG8gZmFsc2UKK21lcmdlCXNldCB0byBzdHJpbmcgdmFsdWUgImZpbGZyZSIKK2Zyb3R6CXVuc3BlY2lmaWVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdGlnbm9yZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdGlnbm9yZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3OWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0aWdub3JlLnR4dApAQCAtMCwwICsxLDExNiBAQAorZ2l0aWdub3JlKDUpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0aWdub3JlIC0gU3BlY2lmaWVzIGludGVudGlvbmFsbHkgdW50cmFja2VkIGZpbGVzIHRvIGlnbm9yZQorCitTWU5PUFNJUworLS0tLS0tLS0KKyRHSVRfRElSL2luZm8vZXhjbHVkZSwgLmdpdGlnbm9yZQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworQSBgZ2l0aWdub3JlYCBmaWxlIHNwZWNpZmllcyBpbnRlbnRpb25hbGx5IHVudHJhY2tlZCBmaWxlcyB0aGF0CitnaXQgc2hvdWxkIGlnbm9yZS4gIEVhY2ggbGluZSBpbiBhIGBnaXRpZ25vcmVgIGZpbGUgc3BlY2lmaWVzIGEKK3BhdHRlcm4uCisKK1doZW4gZGVjaWRpbmcgd2hldGhlciB0byBpZ25vcmUgYSBwYXRoLCBnaXQgbm9ybWFsbHkgY2hlY2tzCitgZ2l0aWdub3JlYCBwYXR0ZXJucyBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIHdpdGggdGhlIGZvbGxvd2luZworb3JkZXIgb2YgcHJlY2VkZW5jZToKKworICogUGF0dGVybnMgcmVhZCBmcm9tIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgY29uZmlndXJhdGlvbgorICAgdmFyaWFibGUgJ2NvcmUuZXhjbHVkZXNmaWxlJy4KKworICogUGF0dGVybnMgcmVhZCBmcm9tIGAkR0lUX0RJUi9pbmZvL2V4Y2x1ZGVgLgorCisgKiBQYXR0ZXJucyByZWFkIGZyb20gYSBgLmdpdGlnbm9yZWAgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKyAgIGFzIHRoZSBwYXRoLCBvciBpbiBhbnkgcGFyZW50IGRpcmVjdG9yeSwgb3JkZXJlZCBmcm9tIHRoZQorICAgZGVlcGVzdCBzdWNoIGZpbGUgdG8gYSBmaWxlIGluIHRoZSByb290IG9mIHRoZSByZXBvc2l0b3J5LgorICAgVGhlc2UgcGF0dGVybnMgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgYC5naXRpZ25vcmVgIGZpbGUuICBBIHByb2plY3Qgbm9ybWFsbHkgaW5jbHVkZXMgc3VjaAorICAgYC5naXRpZ25vcmVgIGZpbGVzIGluIGl0cyByZXBvc2l0b3J5LCBjb250YWluaW5nIHBhdHRlcm5zIGZvcgorICAgZmlsZXMgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgYnVpbGQuCisKK1RoZSB1bmRlcmx5aW5nIGdpdCBwbHVtYmluZyB0b29scywgc3VjaCBhcworZ2l0bGluazpnaXQtbHMtZmlsZXNbMV0gYW5kIGdpdGxpbms6Z2l0LXJlYWQtdHJlZVsxXSwgcmVhZAorYGdpdGlnbm9yZWAgcGF0dGVybnMgc3BlY2lmaWVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLCBvciBmcm9tCitmaWxlcyBzcGVjaWZpZWQgYnkgY29tbWFuZC1saW5lIG9wdGlvbnMuICBIaWdoZXItbGV2ZWwgZ2l0Cit0b29scywgc3VjaCBhcyBnaXRsaW5rOmdpdC1zdGF0dXNbMV0gYW5kIGdpdGxpbms6Z2l0LWFkZFsxXSwKK3VzZSBwYXR0ZXJucyBmcm9tIHRoZSBzb3VyY2VzIHNwZWNpZmllZCBhYm92ZS4KKworUGF0dGVybnMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworIC0gQSBibGFuayBsaW5lIG1hdGNoZXMgbm8gZmlsZXMsIHNvIGl0IGNhbiBzZXJ2ZSBhcyBhIHNlcGFyYXRvcgorICAgZm9yIHJlYWRhYmlsaXR5LgorCisgLSBBIGxpbmUgc3RhcnRpbmcgd2l0aCAjIHNlcnZlcyBhcyBhIGNvbW1lbnQuCisKKyAtIEFuIG9wdGlvbmFsIHByZWZpeCAnIScgd2hpY2ggbmVnYXRlcyB0aGUgcGF0dGVybjsgYW55CisgICBtYXRjaGluZyBmaWxlIGV4Y2x1ZGVkIGJ5IGEgcHJldmlvdXMgcGF0dGVybiB3aWxsIGJlY29tZQorICAgaW5jbHVkZWQgYWdhaW4uCisKKyAtIElmIHRoZSBwYXR0ZXJuIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCAnLycsIGdpdCB0cmVhdHMgaXQgYXMKKyAgIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuIGFuZCBjaGVja3MgZm9yIGEgbWF0Y2ggYWdhaW5zdCB0aGUKKyAgIHBhdGhuYW1lIHdpdGhvdXQgbGVhZGluZyBkaXJlY3Rvcmllcy4KKworIC0gT3RoZXJ3aXNlLCBnaXQgdHJlYXRzIHRoZSBwYXR0ZXJuIGFzIGEgc2hlbGwgZ2xvYiBzdWl0YWJsZQorICAgZm9yIGNvbnN1bXB0aW9uIGJ5IGZubWF0Y2goMykgd2l0aCB0aGUgRk5NX1BBVEhOQU1FIGZsYWc6CisgICB3aWxkY2FyZHMgaW4gdGhlIHBhdHRlcm4gd2lsbCBub3QgbWF0Y2ggYSAvIGluIHRoZSBwYXRobmFtZS4KKyAgIEZvciBleGFtcGxlLCAiRG9jdW1lbnRhdGlvbi9cKi5odG1sIiBtYXRjaGVzCisgICAiRG9jdW1lbnRhdGlvbi9naXQuaHRtbCIgYnV0IG5vdAorICAgIkRvY3VtZW50YXRpb24vcHBjL3BwYy5odG1sIi4gIEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZTsgZm9yIGV4YW1wbGUsICIvKi5jIiBtYXRjaGVzCisgICAiY2F0LWZpbGUuYyIgYnV0IG5vdCAibW96aWxsYS1zaGExL3NoYTEuYyIuCisKK0FuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgJCBnaXQtc3RhdHVzCisgICAgWy4uLl0KKyAgICAjIFVudHJhY2tlZCBmaWxlczoKKyAgICBbLi4uXQorICAgICMgICAgICAgRG9jdW1lbnRhdGlvbi9mb28uaHRtbAorICAgICMgICAgICAgRG9jdW1lbnRhdGlvbi9naXRpZ25vcmUuaHRtbAorICAgICMgICAgICAgZmlsZS5vCisgICAgIyAgICAgICBsaWIuYQorICAgICMgICAgICAgc3JjL2ludGVybmFsLm8KKyAgICBbLi4uXQorICAgICQgY2F0IC5naXQvaW5mby9leGNsdWRlCisgICAgIyBpZ25vcmUgb2JqZWN0cyBhbmQgYXJjaGl2ZXMsIGFueXdoZXJlIGluIHRoZSB0cmVlLgorICAgICouW29hXQorICAgICQgY2F0IERvY3VtZW50YXRpb24vLmdpdGlnbm9yZQorICAgICMgaWdub3JlIGdlbmVyYXRlZCBodG1sIGZpbGVzLAorICAgICouaHRtbAorICAgICMgZXhjZXB0IGZvby5odG1sIHdoaWNoIGlzIG1haW50YWluZWQgYnkgaGFuZAorICAgICFmb28uaHRtbAorICAgICQgZ2l0LXN0YXR1cworICAgIFsuLi5dCisgICAgIyBVbnRyYWNrZWQgZmlsZXM6CisgICAgWy4uLl0KKyAgICAjICAgICAgIERvY3VtZW50YXRpb24vZm9vLmh0bWwKKyAgICBbLi4uXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5vdGhlciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICQgY2F0IC5naXRpZ25vcmUKKyAgICB2bWxpbnV4KgorICAgICQgbHMgYXJjaC9mb28va2VybmVsL3ZtKgorICAgIGFyY2gvZm9vL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisgICAgJCBlY2hvICchL3ZtbGludXgqJyA+YXJjaC9mb28va2VybmVsLy5naXRpZ25vcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzZWNvbmQgLmdpdGlnbm9yZSBwcmV2ZW50cyBnaXQgZnJvbSBpZ25vcmluZworYGFyY2gvZm9vL2tlcm5lbC92bWxpbnV4Lmxkcy5TYC4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubywgSm9zaCBUcmlwbGV0dCwKK0ZyYW5rIExpY2h0ZW5oZWxkLCBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdGsudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM1ODk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApAQCAtMCwwICsxLDEwMiBAQAorZ2l0aygxKQorPT09PT09PQorCitOQU1FCistLS0tCitnaXRrIC0gVGhlIGdpdCByZXBvc2l0b3J5IGJyb3dzZXIKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0aycgWzxvcHRpb24+Li4uXSBbPHJldnM+XSBbLS1dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgY2hhbmdlcyBpbiBhIHJlcG9zaXRvcnkgb3IgYSBzZWxlY3RlZCBzZXQgb2YgY29tbWl0cy4gVGhpcyBpbmNsdWRlcwordmlzdWFsaXppbmcgdGhlIGNvbW1pdCBncmFwaCwgc2hvd2luZyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGVhY2ggY29tbWl0LCBhbmQKK3RoZSBmaWxlcyBpbiB0aGUgdHJlZXMgb2YgZWFjaCByZXZpc2lvbi4KKworSGlzdG9yaWNhbGx5LCBnaXRrIHdhcyB0aGUgZmlyc3QgcmVwb3NpdG9yeSBicm93c2VyLiBJdCdzIHdyaXR0ZW4gaW4gdGNsL3RrCithbmQgc3RhcnRlZCBvZmYgaW4gYSBzZXBhcmF0ZSByZXBvc2l0b3J5IGJ1dCB3YXMgbGF0ZXIgbWVyZ2VkIGludG8gdGhlIG1haW4KK2dpdCByZXBvc2l0b3J5LgorCitPUFRJT05TCistLS0tLS0tCitUbyBjb250cm9sIHdoaWNoIHJldmlzaW9ucyB0byBzaG93biwgdGhlIGNvbW1hbmQgdGFrZXMgb3B0aW9ucyBhcHBsaWNhYmxlIHRvCit0aGUgZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0gY29tbWFuZC4gVGhpcyBtYW51YWwgcGFnZSBkZXNjcmliZXMgb25seSB0aGUgbW9zdAorZnJlcXVlbnRseSB1c2VkIG9wdGlvbnMuCisKKy1uIDxudW1iZXI+LCAtLW1heC1jb3VudD08bnVtYmVyPjo6CisKKwlMaW1pdHMgdGhlIG51bWJlciBvZiBjb21taXRzIHRvIHNob3cuCisKKy0tc2luY2U9PGRhdGU+OjoKKworCVNob3cgY29tbWl0cyBtb3JlIHJlY2VudCB0aGFuIGEgc3BlY2lmaWMgZGF0ZS4KKworLS11bnRpbD08ZGF0ZT46OgorCisJU2hvdyBjb21taXRzIG9sZGVyIHRoYW4gYSBzcGVjaWZpYyBkYXRlLgorCistLWFsbDo6CisKKwlTaG93IGFsbCBicmFuY2hlcy4KKworPHJldnM+OjoKKworCUxpbWl0IHRoZSByZXZpc2lvbnMgdG8gc2hvdy4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHJldmlzaW9uCisJbWVhbmluZyBzaG93IGZyb20gdGhlIGdpdmVuIHJldmlzaW9uIGFuZCBiYWNrLCBvciBpdCBjYW4gYmUgYSByYW5nZSBpbgorCXRoZSBmb3JtICInPGZyb20+Jy4uJzx0bz4nIiB0byBzaG93IGFsbCByZXZpc2lvbnMgYmV0d2VlbiAnPGZyb20+JyBhbmQKKwliYWNrIHRvICc8dG8+Jy4gTm90ZSwgbW9yZSBhZHZhbmNlZCByZXZpc2lvbiBzZWxlY3Rpb24gY2FuIGJlIGFwcGxpZWQuCisJRm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0IG9mIHdheXMgdG8gc3BlbGwgb2JqZWN0IG5hbWVzLCBzZWUKKwkiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdLgorCis8cGF0aD46OgorCisJTGltaXQgY29tbWl0cyB0byB0aGUgb25lcyB0b3VjaGluZyBmaWxlcyBpbiB0aGUgZ2l2ZW4gcGF0aHMuIE5vdGUsIHRvCisJYXZvaWQgYW1iaWd1aXR5IHdydC4gcmV2aXNpb24gbmFtZXMgdXNlICItLSIgdG8gc2VwYXJhdGUgdGhlIHBhdGhzCisJZnJvbSBhbnkgcHJlY2VkaW5nIG9wdGlvbnMuCisKK0V4YW1wbGVzCistLS0tLS0tLQorZ2l0ayB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHRoZSBjaGFuZ2VzIHNpbmNlIHZlcnNpb24gJ3YyLjYuMTInIHRoYXQgY2hhbmdlZCBhbnkKKwlmaWxlIGluIHRoZSBpbmNsdWRlL3Njc2kgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKK2dpdGsgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIFwtLSBnaXRrOjoKKworCVNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcyB0byB0aGUgZmlsZSAnZ2l0aycuCisJVGhlICItLSIgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSAqYnJhbmNoKiBuYW1lZAorCSdnaXRrJworCitnaXRrIC0tbWF4LWNvdW50PTEwMCAtLWFsbCAtLSBNYWtlZmlsZTo6CisKKwlTaG93IGF0IG1vc3QgMTAwIGNoYW5nZXMgbWFkZSB0byB0aGUgZmlsZSAnTWFrZWZpbGUnLiBJbnN0ZWFkIG9mIG9ubHkKKwlsb29raW5nIGZvciBjaGFuZ2VzIGluIHRoZSBjdXJyZW50IGJyYW5jaCBsb29rIGluIGFsbCBicmFuY2hlcy4KKworU2VlIEFsc28KKy0tLS0tLS0tCisncWdpdCgxKSc6OgorCUEgcmVwb3NpdG9yeSBicm93c2VyIHdyaXR0ZW4gaW4gQysrIHVzaW5nIFF0LgorCisnZ2l0dmlldygxKSc6OgorCUEgcmVwb3NpdG9yeSBicm93c2VyIHdyaXR0ZW4gaW4gUHl0aG9uIHVzaW5nIEd0ay4gSXQncyBiYXNlZCBvbgorCSdienJrKDEpJyBhbmQgZGlzdHJpYnV0ZWQgaW4gdGhlIGNvbnRyaWIgYXJlYSBvZiB0aGUgZ2l0IHJlcG9zaXRvcnkuCisKKyd0aWcoMSknOjoKKwlBIG1pbmltYWwgcmVwb3NpdG9yeSBicm93c2VyIGFuZCBnaXQgdG9vbCBvdXRwdXQgaGlnaGxpZ2h0ZXIgd3JpdHRlbgorCWluIEMgdXNpbmcgTmN1cnNlcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubywgSm9uYXMgRm9uc2VjYSwgYW5kIHRoZSBnaXQtbGlzdAorPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9nbG9zc2FyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2dsb3NzYXJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdiMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2xvc3NhcnkudHh0CkBAIC0wLDAgKzEsNDU1IEBACitHSVQgR2xvc3NhcnkKKz09PT09PT09PT09PQorCitbW2RlZl9hbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlXV1hbHRlcm5hdGUgb2JqZWN0IGRhdGFiYXNlOjoKKwlWaWEgdGhlIGFsdGVybmF0ZXMgbWVjaGFuaXNtLCBhIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+CisJY2FuIGluaGVyaXQgcGFydCBvZiBpdHMgPDxkZWZfb2JqZWN0X2RhdGFiYXNlLG9iamVjdCBkYXRhYmFzZT4+CisJZnJvbSBhbm90aGVyIG9iamVjdCBkYXRhYmFzZSwgd2hpY2ggaXMgY2FsbGVkICJhbHRlcm5hdGUiLgorCitbW2RlZl9iYXJlX3JlcG9zaXRvcnldXWJhcmUgcmVwb3NpdG9yeTo6CisJQSBiYXJlIHJlcG9zaXRvcnkgaXMgbm9ybWFsbHkgYW4gYXBwcm9wcmlhdGVseQorCW5hbWVkIDw8ZGVmX2RpcmVjdG9yeSxkaXJlY3Rvcnk+PiB3aXRoIGEgYC5naXRgIHN1ZmZpeCB0aGF0IGRvZXMgbm90CisJaGF2ZSBhIGxvY2FsbHkgY2hlY2tlZC1vdXQgY29weSBvZiBhbnkgb2YgdGhlIGZpbGVzIHVuZGVyCisJcmV2aXNpb24gY29udHJvbC4gVGhhdCBpcywgYWxsIG9mIHRoZSBgZ2l0YAorCWFkbWluaXN0cmF0aXZlIGFuZCBjb250cm9sIGZpbGVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgcHJlc2VudCBpbiB0aGUKKwloaWRkZW4gYC5naXRgIHN1Yi1kaXJlY3RvcnkgYXJlIGRpcmVjdGx5IHByZXNlbnQgaW4gdGhlCisJYHJlcG9zaXRvcnkuZ2l0YCBkaXJlY3RvcnkgaW5zdGVhZCwKKwlhbmQgbm8gb3RoZXIgZmlsZXMgYXJlIHByZXNlbnQgYW5kIGNoZWNrZWQgb3V0LiBVc3VhbGx5IHB1Ymxpc2hlcnMgb2YKKwlwdWJsaWMgcmVwb3NpdG9yaWVzIG1ha2UgYmFyZSByZXBvc2l0b3JpZXMgYXZhaWxhYmxlLgorCitbW2RlZl9ibG9iX29iamVjdF1dYmxvYiBvYmplY3Q6OgorCVVudHlwZWQgPDxkZWZfb2JqZWN0LG9iamVjdD4+LCBlLmcuIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCisKK1tbZGVmX2JyYW5jaF1dYnJhbmNoOjoKKwlBICJicmFuY2giIGlzIGFuIGFjdGl2ZSBsaW5lIG9mIGRldmVsb3BtZW50LiAgVGhlIG1vc3QgcmVjZW50CisJPDxkZWZfY29tbWl0LGNvbW1pdD4+IG9uIGEgYnJhbmNoIGlzIHJlZmVycmVkIHRvIGFzIHRoZSB0aXAgb2YKKwl0aGF0IGJyYW5jaC4gIFRoZSB0aXAgb2YgdGhlIGJyYW5jaCBpcyByZWZlcmVuY2VkIGJ5IGEgYnJhbmNoCisJPDxkZWZfaGVhZCxoZWFkPj4sIHdoaWNoIG1vdmVzIGZvcndhcmQgYXMgYWRkaXRpb25hbCBkZXZlbG9wbWVudAorCWlzIGRvbmUgb24gdGhlIGJyYW5jaC4gIEEgc2luZ2xlIGdpdAorCTw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+IGNhbiB0cmFjayBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisJYnJhbmNoZXMsIGJ1dCB5b3VyIDw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+PiBpcworCWFzc29jaWF0ZWQgd2l0aCBqdXN0IG9uZSBvZiB0aGVtICh0aGUgImN1cnJlbnQiIG9yICJjaGVja2VkIG91dCIKKwlicmFuY2gpLCBhbmQgPDxkZWZfSEVBRCxIRUFEPj4gcG9pbnRzIHRvIHRoYXQgYnJhbmNoLgorCitbW2RlZl9jYWNoZV1dY2FjaGU6OgorCU9ic29sZXRlIGZvcjogPDxkZWZfaW5kZXgsaW5kZXg+Pi4KKworW1tkZWZfY2hhaW5dXWNoYWluOjoKKwlBIGxpc3Qgb2Ygb2JqZWN0cywgd2hlcmUgZWFjaCA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gaW4gdGhlIGxpc3QgY29udGFpbnMKKwlhIHJlZmVyZW5jZSB0byBpdHMgc3VjY2Vzc29yIChmb3IgZXhhbXBsZSwgdGhlIHN1Y2Nlc3NvciBvZiBhCisJPDxkZWZfY29tbWl0LGNvbW1pdD4+IGNvdWxkIGJlIG9uZSBvZiBpdHMgPDxkZWZfcGFyZW50LHBhcmVudHM+PikuCisKK1tbZGVmX2NoYW5nZXNldF1dY2hhbmdlc2V0OjoKKwlCaXRLZWVwZXIvY3ZzcHMgc3BlYWsgZm9yICI8PGRlZl9jb21taXQsY29tbWl0Pj4iLiBTaW5jZSBnaXQgZG9lcyBub3QKKwlzdG9yZSBjaGFuZ2VzLCBidXQgc3RhdGVzLCBpdCByZWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB1c2UgdGhlIHRlcm0KKwkiY2hhbmdlc2V0cyIgd2l0aCBnaXQuCisKK1tbZGVmX2NoZWNrb3V0XV1jaGVja291dDo6CisJVGhlIGFjdGlvbiBvZiB1cGRhdGluZyB0aGUgPDxkZWZfd29ya2luZ190cmVlLHdvcmtpbmcgdHJlZT4+IHRvIGEKKwk8PGRlZl9yZXZpc2lvbixyZXZpc2lvbj4+IHdoaWNoIHdhcyBzdG9yZWQgaW4gdGhlCisJPDxkZWZfb2JqZWN0X2RhdGFiYXNlLG9iamVjdCBkYXRhYmFzZT4+LgorCitbW2RlZl9jaGVycnktcGlja2luZ11dY2hlcnJ5LXBpY2tpbmc6OgorCUluIDw8ZGVmX1NDTSxTQ00+PiBqYXJnb24sICJjaGVycnkgcGljayIgbWVhbnMgdG8gY2hvb3NlIGEgc3Vic2V0IG9mCisJY2hhbmdlcyBvdXQgb2YgYSBzZXJpZXMgb2YgY2hhbmdlcyAodHlwaWNhbGx5IGNvbW1pdHMpIGFuZCByZWNvcmQgdGhlbQorCWFzIGEgbmV3IHNlcmllcyBvZiBjaGFuZ2VzIG9uIHRvcCBvZiBkaWZmZXJlbnQgY29kZWJhc2UuIEluIEdJVCwgdGhpcyBpcworCXBlcmZvcm1lZCBieSAiZ2l0IGNoZXJyeS1waWNrIiBjb21tYW5kIHRvIGV4dHJhY3QgdGhlIGNoYW5nZSBpbnRyb2R1Y2VkCisJYnkgYW4gZXhpc3RpbmcgPDxkZWZfY29tbWl0LGNvbW1pdD4+IGFuZCB0byByZWNvcmQgaXQgYmFzZWQgb24gdGhlIHRpcAorCW9mIHRoZSBjdXJyZW50IDw8ZGVmX2JyYW5jaCxicmFuY2g+PiBhcyBhIG5ldyBjb21taXQuCisKK1tbZGVmX2NsZWFuXV1jbGVhbjo6CisJQSA8PGRlZl93b3JraW5nX3RyZWUsd29ya2luZyB0cmVlPj4gaXMgY2xlYW4sIGlmIGl0CisJY29ycmVzcG9uZHMgdG8gdGhlIDw8ZGVmX3JldmlzaW9uLHJldmlzaW9uPj4gcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudAorCTw8ZGVmX2hlYWQsaGVhZD4+LiBBbHNvIHNlZSAiPDxkZWZfZGlydHksZGlydHk+PiIuCisKK1tbZGVmX2NvbW1pdF1dY29tbWl0OjoKKwlBcyBhIG5vdW46IEEgc2luZ2xlIHBvaW50IGluIHRoZQorCWdpdCBoaXN0b3J5OyB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgYSBwcm9qZWN0IGlzIHJlcHJlc2VudGVkIGFzIGEKKwlzZXQgb2YgaW50ZXJyZWxhdGVkIGNvbW1pdHMuICBUaGUgd29yZCAiY29tbWl0IiBpcyBvZnRlbgorCXVzZWQgYnkgZ2l0IGluIHRoZSBzYW1lIHBsYWNlcyBvdGhlciByZXZpc2lvbiBjb250cm9sIHN5c3RlbXMKKwl1c2UgdGhlIHdvcmRzICJyZXZpc2lvbiIgb3IgInZlcnNpb24iLiAgQWxzbyB1c2VkIGFzIGEgc2hvcnQKKwloYW5kIGZvciA8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdCBvYmplY3Q+Pi4KKysKK0FzIGEgdmVyYjogVGhlIGFjdGlvbiBvZiBzdG9yaW5nIGEgbmV3IHNuYXBzaG90IG9mIHRoZSBwcm9qZWN0J3MKK3N0YXRlIGluIHRoZSBnaXQgaGlzdG9yeSwgYnkgY3JlYXRpbmcgYSBuZXcgY29tbWl0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudAorc3RhdGUgb2YgdGhlIDw8ZGVmX2luZGV4LGluZGV4Pj4gYW5kIGFkdmFuY2luZyA8PGRlZl9IRUFELEhFQUQ+PgordG8gcG9pbnQgYXQgdGhlIG5ldyBjb21taXQuCisKK1tbZGVmX2NvbW1pdF9vYmplY3RdXWNvbW1pdCBvYmplY3Q6OgorCUFuIDw8ZGVmX29iamVjdCxvYmplY3Q+PiB3aGljaCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYQorCXBhcnRpY3VsYXIgPDxkZWZfcmV2aXNpb24scmV2aXNpb24+Piwgc3VjaCBhcyA8PGRlZl9wYXJlbnQscGFyZW50cz4+LCBjb21taXR0ZXIsCisJYXV0aG9yLCBkYXRlIGFuZCB0aGUgPDxkZWZfdHJlZV9vYmplY3QsdHJlZSBvYmplY3Q+PiB3aGljaCBjb3JyZXNwb25kcworCXRvIHRoZSB0b3AgPDxkZWZfZGlyZWN0b3J5LGRpcmVjdG9yeT4+IG9mIHRoZSBzdG9yZWQKKwlyZXZpc2lvbi4KKworW1tkZWZfY29yZV9naXRdXWNvcmUgZ2l0OjoKKwlGdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHV0aWxpdGllcyBvZiBnaXQuIEV4cG9zZXMgb25seSBsaW1pdGVkCisJc291cmNlIGNvZGUgbWFuYWdlbWVudCB0b29scy4KKworW1tkZWZfREFHXV1EQUc6OgorCURpcmVjdGVkIGFjeWNsaWMgZ3JhcGguIFRoZSA8PGRlZl9jb21taXQsY29tbWl0Pj4gb2JqZWN0cyBmb3JtIGEKKwlkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCBiZWNhdXNlIHRoZXkgaGF2ZSBwYXJlbnRzIChkaXJlY3RlZCksIGFuZCB0aGUKKwlncmFwaCBvZiBjb21taXQgb2JqZWN0cyBpcyBhY3ljbGljICh0aGVyZSBpcyBubworCTw8ZGVmX2NoYWluLGNoYWluPj4gd2hpY2ggYmVnaW5zIGFuZCBlbmRzIHdpdGggdGhlIHNhbWUKKwk8PGRlZl9vYmplY3Qsb2JqZWN0Pj4pLgorCitbW2RlZl9kYW5nbGluZ19vYmplY3RdXWRhbmdsaW5nIG9iamVjdDo6CisJQW4gPDxkZWZfdW5yZWFjaGFibGVfb2JqZWN0LHVucmVhY2hhYmxlIG9iamVjdD4+IHdoaWNoIGlzIG5vdAorCTw8ZGVmX3JlYWNoYWJsZSxyZWFjaGFibGU+PiBldmVuIGZyb20gb3RoZXIgdW5yZWFjaGFibGUgb2JqZWN0czsgYQorCWRhbmdsaW5nIG9iamVjdCBoYXMgbm8gcmVmZXJlbmNlcyB0byBpdCBmcm9tIGFueQorCXJlZmVyZW5jZSBvciA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gaW4gdGhlIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+LgorCitbW2RlZl9kZXRhY2hlZF9IRUFEXV1kZXRhY2hlZCBIRUFEOjoKKwlOb3JtYWxseSB0aGUgPDxkZWZfSEVBRCxIRUFEPj4gc3RvcmVzIHRoZSBuYW1lIG9mIGEKKwk8PGRlZl9icmFuY2gsYnJhbmNoPj4uICBIb3dldmVyLCBnaXQgYWxzbyBhbGxvd3MgeW91IHRvIDw8ZGVmX2NoZWNrb3V0LGNoZWNrIG91dD4+CisJYW4gYXJiaXRyYXJ5IDw8ZGVmX2NvbW1pdCxjb21taXQ+PiB0aGF0IGlzbid0IG5lY2Vzc2FyaWx5IHRoZSB0aXAgb2YgYW55CisJcGFydGljdWxhciBicmFuY2guICBJbiB0aGlzIGNhc2UgSEVBRCBpcyBzYWlkIHRvIGJlICJkZXRhY2hlZCIuCisKK1tbZGVmX2RpcmNhY2hlXV1kaXJjYWNoZTo6CisJWW91IGFyZSAqd2FhYWFheSogYmVoaW5kLiBTZWUgPDxkZWZfaW5kZXgsaW5kZXg+Pi4KKworW1tkZWZfZGlyZWN0b3J5XV1kaXJlY3Rvcnk6OgorCVRoZSBsaXN0IHlvdSBnZXQgd2l0aCAibHMiIDotKQorCitbW2RlZl9kaXJ0eV1dZGlydHk6OgorCUEgPDxkZWZfd29ya2luZ190cmVlLHdvcmtpbmcgdHJlZT4+IGlzIHNhaWQgdG8gYmUgImRpcnR5IiBpZgorCWl0IGNvbnRhaW5zIG1vZGlmaWNhdGlvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiA8PGRlZl9jb21taXQsY29tbWl0dGVkPj4gdG8gdGhlIGN1cnJlbnQKKwk8PGRlZl9icmFuY2gsYnJhbmNoPj4uCisKK1tbZGVmX2VudF1dZW50OjoKKwlGYXZvcml0ZSBzeW5vbnltIHRvICI8PGRlZl90cmVlLWlzaCx0cmVlLWlzaD4+IiBieSBzb21lIHRvdGFsIGdlZWtzLiBTZWUKKwlgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbnRfKE1pZGRsZS1lYXJ0aClgIGZvciBhbiBpbi1kZXB0aAorCWV4cGxhbmF0aW9uLiBBdm9pZCB0aGlzIHRlcm0sIG5vdCB0byBjb25mdXNlIHBlb3BsZS4KKworW1tkZWZfZXZpbF9tZXJnZV1dZXZpbCBtZXJnZTo6CisJQW4gZXZpbCBtZXJnZSBpcyBhIDw8ZGVmX21lcmdlLG1lcmdlPj4gdGhhdCBpbnRyb2R1Y2VzIGNoYW5nZXMgdGhhdAorCWRvIG5vdCBhcHBlYXIgaW4gYW55IDw8ZGVmX3BhcmVudCxwYXJlbnQ+Pi4KKworW1tkZWZfZmFzdF9mb3J3YXJkXV1mYXN0IGZvcndhcmQ6OgorCUEgZmFzdC1mb3J3YXJkIGlzIGEgc3BlY2lhbCB0eXBlIG9mIDw8ZGVmX21lcmdlLG1lcmdlPj4gd2hlcmUgeW91IGhhdmUgYQorCTw8ZGVmX3JldmlzaW9uLHJldmlzaW9uPj4gYW5kIHlvdSBhcmUgIm1lcmdpbmciIGFub3RoZXIKKwk8PGRlZl9icmFuY2gsYnJhbmNoPj4ncyBjaGFuZ2VzIHRoYXQgaGFwcGVuIHRvIGJlIGEgZGVzY2VuZGFudCBvZiB3aGF0CisJeW91IGhhdmUuIEluIHN1Y2ggdGhlc2UgY2FzZXMsIHlvdSBkbyBub3QgbWFrZSBhIG5ldyA8PGRlZl9tZXJnZSxtZXJnZT4+CisJPDxkZWZfY29tbWl0LGNvbW1pdD4+IGJ1dCBpbnN0ZWFkIGp1c3QgdXBkYXRlIHRvIGhpcworCXJldmlzaW9uLiBUaGlzIHdpbGwgaGFwcGVuIGZyZXF1ZW50bHkgb24gYQorCTw8ZGVmX3RyYWNraW5nX2JyYW5jaCx0cmFja2luZyBicmFuY2g+PiBvZiBhIHJlbW90ZQorCTw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+LgorCitbW2RlZl9mZXRjaF1dZmV0Y2g6OgorCUZldGNoaW5nIGEgPDxkZWZfYnJhbmNoLGJyYW5jaD4+IG1lYW5zIHRvIGdldCB0aGUKKwlicmFuY2gncyA8PGRlZl9oZWFkX3JlZixoZWFkIHJlZj4+IGZyb20gYSByZW1vdGUKKwk8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PiwgdG8gZmluZCBvdXQgd2hpY2ggb2JqZWN0cyBhcmUKKwltaXNzaW5nIGZyb20gdGhlIGxvY2FsIDw8ZGVmX29iamVjdF9kYXRhYmFzZSxvYmplY3QgZGF0YWJhc2U+PiwKKwlhbmQgdG8gZ2V0IHRoZW0sIHRvby4gIFNlZSBhbHNvIGdpdGxpbms6Z2l0LWZldGNoWzFdLgorCitbW2RlZl9maWxlX3N5c3RlbV1dZmlsZSBzeXN0ZW06OgorCUxpbnVzIFRvcnZhbGRzIG9yaWdpbmFsbHkgZGVzaWduZWQgZ2l0IHRvIGJlIGEgdXNlciBzcGFjZSBmaWxlIHN5c3RlbSwKKwlpLmUuIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBob2xkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gVGhhdCBlbnN1cmVkIHRoZQorCWVmZmljaWVuY3kgYW5kIHNwZWVkIG9mIGdpdC4KKworW1tkZWZfZ2l0X2FyY2hpdmVdXWdpdCBhcmNoaXZlOjoKKwlTeW5vbnltIGZvciA8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PiAoZm9yIGFyY2ggcGVvcGxlKS4KKworW1tkZWZfZ3JhZnRzXV1ncmFmdHM6OgorCUdyYWZ0cyBlbmFibGVzIHR3byBvdGhlcndpc2UgZGlmZmVyZW50IGxpbmVzIG9mIGRldmVsb3BtZW50IHRvIGJlIGpvaW5lZAorCXRvZ2V0aGVyIGJ5IHJlY29yZGluZyBmYWtlIGFuY2VzdHJ5IGluZm9ybWF0aW9uIGZvciBjb21taXRzLiBUaGlzIHdheQorCXlvdSBjYW4gbWFrZSBnaXQgcHJldGVuZCB0aGUgc2V0IG9mIDw8ZGVmX3BhcmVudCxwYXJlbnRzPj4gYSA8PGRlZl9jb21taXQsY29tbWl0Pj4gaGFzCisJaXMgZGlmZmVyZW50IGZyb20gd2hhdCB3YXMgcmVjb3JkZWQgd2hlbiB0aGUgY29tbWl0IHdhcworCWNyZWF0ZWQuIENvbmZpZ3VyZWQgdmlhIHRoZSBgLmdpdC9pbmZvL2dyYWZ0c2AgZmlsZS4KKworW1tkZWZfaGFzaF1daGFzaDo6CisJSW4gZ2l0J3MgY29udGV4dCwgc3lub255bSB0byA8PGRlZl9vYmplY3RfbmFtZSxvYmplY3QgbmFtZT4+LgorCitbW2RlZl9oZWFkXV1oZWFkOjoKKwlBIDw8ZGVmX3JlZixuYW1lZCByZWZlcmVuY2U+PiB0byB0aGUgPDxkZWZfY29tbWl0LGNvbW1pdD4+IGF0IHRoZSB0aXAgb2YgYQorCTw8ZGVmX2JyYW5jaCxicmFuY2g+Pi4gIEhlYWRzIGFyZSBzdG9yZWQgaW4KKwlgJEdJVF9ESVIvcmVmcy9oZWFkcy9gLCBleGNlcHQgd2hlbiB1c2luZyBwYWNrZWQgcmVmcy4gKFNlZQorCWdpdGxpbms6Z2l0LXBhY2stcmVmc1sxXS4pCisKK1tbZGVmX0hFQURdXUhFQUQ6OgorCVRoZSBjdXJyZW50IDw8ZGVmX2JyYW5jaCxicmFuY2g+Pi4gIEluIG1vcmUgZGV0YWlsOiBZb3VyIDw8ZGVmX3dvcmtpbmdfdHJlZSwKKwl3b3JraW5nIHRyZWU+PiBpcyBub3JtYWxseSBkZXJpdmVkIGZyb20gdGhlIHN0YXRlIG9mIHRoZSB0cmVlCisJcmVmZXJyZWQgdG8gYnkgSEVBRC4gIEhFQUQgaXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZQorCTw8ZGVmX2hlYWQsaGVhZHM+PiBpbiB5b3VyIHJlcG9zaXRvcnksIGV4Y2VwdCB3aGVuIHVzaW5nIGEKKwk8PGRlZl9kZXRhY2hlZF9IRUFELGRldGFjaGVkIEhFQUQ+PiwgaW4gd2hpY2ggY2FzZSBpdCBtYXkKKwlyZWZlcmVuY2UgYW4gYXJiaXRyYXJ5IGNvbW1pdC4KKworW1tkZWZfaGVhZF9yZWZdXWhlYWQgcmVmOjoKKwlBIHN5bm9ueW0gZm9yIDw8ZGVmX2hlYWQsaGVhZD4+LgorCitbW2RlZl9ob29rXV1ob29rOjoKKwlEdXJpbmcgdGhlIG5vcm1hbCBleGVjdXRpb24gb2Ygc2V2ZXJhbCBnaXQgY29tbWFuZHMsIGNhbGwtb3V0cyBhcmUgbWFkZQorCXRvIG9wdGlvbmFsIHNjcmlwdHMgdGhhdCBhbGxvdyBhIGRldmVsb3BlciB0byBhZGQgZnVuY3Rpb25hbGl0eSBvcgorCWNoZWNraW5nLiBUeXBpY2FsbHksIHRoZSBob29rcyBhbGxvdyBmb3IgYSBjb21tYW5kIHRvIGJlIHByZS12ZXJpZmllZAorCWFuZCBwb3RlbnRpYWxseSBhYm9ydGVkLCBhbmQgYWxsb3cgZm9yIGEgcG9zdC1ub3RpZmljYXRpb24gYWZ0ZXIgdGhlCisJb3BlcmF0aW9uIGlzIGRvbmUuIFRoZSBob29rIHNjcmlwdHMgYXJlIGZvdW5kIGluIHRoZQorCWAkR0lUX0RJUi9ob29rcy9gIGRpcmVjdG9yeSwgYW5kIGFyZSBlbmFibGVkIGJ5IHNpbXBseQorCW1ha2luZyB0aGVtIGV4ZWN1dGFibGUuCisKK1tbZGVmX2luZGV4XV1pbmRleDo6CisJQSBjb2xsZWN0aW9uIG9mIGZpbGVzIHdpdGggc3RhdCBpbmZvcm1hdGlvbiwgd2hvc2UgY29udGVudHMgYXJlIHN0b3JlZAorCWFzIG9iamVjdHMuIFRoZSBpbmRleCBpcyBhIHN0b3JlZCB2ZXJzaW9uIG9mIHlvdXIKKwk8PGRlZl93b3JraW5nX3RyZWUsd29ya2luZyB0cmVlPj4uIFRydXRoIGJlIHRvbGQsIGl0IGNhbiBhbHNvIGNvbnRhaW4gYSBzZWNvbmQsIGFuZCBldmVuCisJYSB0aGlyZCB2ZXJzaW9uIG9mIGEgd29ya2luZyB0cmVlLCB3aGljaCBhcmUgdXNlZAorCXdoZW4gPDxkZWZfbWVyZ2UsbWVyZ2luZz4+LgorCitbW2RlZl9pbmRleF9lbnRyeV1daW5kZXggZW50cnk6OgorCVRoZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYSBwYXJ0aWN1bGFyIGZpbGUsIHN0b3JlZCBpbiB0aGUKKwk8PGRlZl9pbmRleCxpbmRleD4+LiBBbiBpbmRleCBlbnRyeSBjYW4gYmUgdW5tZXJnZWQsIGlmIGEKKwk8PGRlZl9tZXJnZSxtZXJnZT4+IHdhcyBzdGFydGVkLCBidXQgbm90IHlldCBmaW5pc2hlZCAoaS5lLiBpZgorCXRoZSBpbmRleCBjb250YWlucyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGF0IGZpbGUpLgorCitbW2RlZl9tYXN0ZXJdXW1hc3Rlcjo6CisJVGhlIGRlZmF1bHQgZGV2ZWxvcG1lbnQgPDxkZWZfYnJhbmNoLGJyYW5jaD4+LiBXaGVuZXZlciB5b3UKKwljcmVhdGUgYSBnaXQgPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4sIGEgYnJhbmNoIG5hbWVkCisJIm1hc3RlciIgaXMgY3JlYXRlZCwgYW5kIGJlY29tZXMgdGhlIGFjdGl2ZSBicmFuY2guIEluIG1vc3QKKwljYXNlcywgdGhpcyBjb250YWlucyB0aGUgbG9jYWwgZGV2ZWxvcG1lbnQsIHRob3VnaCB0aGF0IGlzCisJcHVyZWx5IGJ5IGNvbnZlbnRpb24gYW5kIGlzIG5vdCByZXF1aXJlZC4KKworW1tkZWZfbWVyZ2VdXW1lcmdlOjoKKwlBcyBhIHZlcmI6IFRvIGJyaW5nIHRoZSBjb250ZW50cyBvZiBhbm90aGVyCisJPDxkZWZfYnJhbmNoLGJyYW5jaD4+IChwb3NzaWJseSBmcm9tIGFuIGV4dGVybmFsCisJPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4pIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiAgSW4gdGhlCisJY2FzZSB3aGVyZSB0aGUgbWVyZ2VkLWluIGJyYW5jaCBpcyBmcm9tIGEgZGlmZmVyZW50IHJlcG9zaXRvcnksCisJdGhpcyBpcyBkb25lIGJ5IGZpcnN0IDw8ZGVmX2ZldGNoLGZldGNoaW5nPj4gdGhlIHJlbW90ZSBicmFuY2gKKwlhbmQgdGhlbiBtZXJnaW5nIHRoZSByZXN1bHQgaW50byB0aGUgY3VycmVudCBicmFuY2guICBUaGlzCisJY29tYmluYXRpb24gb2YgZmV0Y2ggYW5kIG1lcmdlIG9wZXJhdGlvbnMgaXMgY2FsbGVkIGEKKwk8PGRlZl9wdWxsLHB1bGw+Pi4gIE1lcmdpbmcgaXMgcGVyZm9ybWVkIGJ5IGFuIGF1dG9tYXRpYyBwcm9jZXNzCisJdGhhdCBpZGVudGlmaWVzIGNoYW5nZXMgbWFkZSBzaW5jZSB0aGUgYnJhbmNoZXMgZGl2ZXJnZWQsIGFuZAorCXRoZW4gYXBwbGllcyBhbGwgdGhvc2UgY2hhbmdlcyB0b2dldGhlci4gIEluIGNhc2VzIHdoZXJlIGNoYW5nZXMKKwljb25mbGljdCwgbWFudWFsIGludGVydmVudGlvbiBtYXkgYmUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlCisJbWVyZ2UuCisrCitBcyBhIG5vdW46IHVubGVzcyBpdCBpcyBhIDw8ZGVmX2Zhc3RfZm9yd2FyZCxmYXN0IGZvcndhcmQ+PiwgYQorc3VjY2Vzc2Z1bCBtZXJnZSByZXN1bHRzIGluIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyA8PGRlZl9jb21taXQsY29tbWl0Pj4KK3JlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBtZXJnZSwgYW5kIGhhdmluZyBhcworPDxkZWZfcGFyZW50LHBhcmVudHM+PiB0aGUgdGlwcyBvZiB0aGUgbWVyZ2VkIDw8ZGVmX2JyYW5jaCxicmFuY2hlcz4+LgorVGhpcyBjb21taXQgaXMgcmVmZXJyZWQgdG8gYXMgYSAibWVyZ2UgY29tbWl0Iiwgb3Igc29tZXRpbWVzIGp1c3QgYQorIm1lcmdlIi4KKworW1tkZWZfb2JqZWN0XV1vYmplY3Q6OgorCVRoZSB1bml0IG9mIHN0b3JhZ2UgaW4gZ2l0LiBJdCBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IHRoZQorCTw8ZGVmX1NIQTEsU0hBMT4+IG9mIGl0cyBjb250ZW50cy4gQ29uc2VxdWVudGx5LCBhbgorCW9iamVjdCBjYW4gbm90IGJlIGNoYW5nZWQuCisKK1tbZGVmX29iamVjdF9kYXRhYmFzZV1db2JqZWN0IGRhdGFiYXNlOjoKKwlTdG9yZXMgYSBzZXQgb2YgIm9iamVjdHMiLCBhbmQgYW4gaW5kaXZpZHVhbCA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gaXMKKwlpZGVudGlmaWVkIGJ5IGl0cyA8PGRlZl9vYmplY3RfbmFtZSxvYmplY3QgbmFtZT4+LiBUaGUgb2JqZWN0cyB1c3VhbGx5CisJbGl2ZSBpbiBgJEdJVF9ESVIvb2JqZWN0cy9gLgorCitbW2RlZl9vYmplY3RfaWRlbnRpZmllcl1db2JqZWN0IGlkZW50aWZpZXI6OgorCVN5bm9ueW0gZm9yIDw8ZGVmX29iamVjdF9uYW1lLG9iamVjdCBuYW1lPj4uCisKK1tbZGVmX29iamVjdF9uYW1lXV1vYmplY3QgbmFtZTo6CisJVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGFuIDw8ZGVmX29iamVjdCxvYmplY3Q+Pi4gVGhlIDw8ZGVmX2hhc2gsaGFzaD4+CisJb2YgdGhlIG9iamVjdCdzIGNvbnRlbnRzIHVzaW5nIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0KKwkxIGFuZCB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IHRoZSA0MCBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgZW5jb2Rpbmcgb2YKKwl0aGUgPDxkZWZfaGFzaCxoYXNoPj4gb2YgdGhlIG9iamVjdCAocG9zc2libHkgZm9sbG93ZWQgYnkKKwlhIHdoaXRlIHNwYWNlKS4KKworW1tkZWZfb2JqZWN0X3R5cGVdXW9iamVjdCB0eXBlOjoKKwlPbmUgb2YgdGhlIGlkZW50aWZpZXJzCisJIjw8ZGVmX2NvbW1pdCxjb21taXQ+PiIsIjw8ZGVmX3RyZWUsdHJlZT4+IiwiPDxkZWZfdGFnLHRhZz4+IiBvciAiPDxkZWZfYmxvYl9vYmplY3QsYmxvYj4+IgorCWRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgYW4gPDxkZWZfb2JqZWN0LG9iamVjdD4+LgorCitbW2RlZl9vY3RvcHVzXV1vY3RvcHVzOjoKKwlUbyA8PGRlZl9tZXJnZSxtZXJnZT4+IG1vcmUgdGhhbiB0d28gPDxkZWZfYnJhbmNoLGJyYW5jaGVzPj4uIEFsc28gZGVub3RlcyBhbgorCWludGVsbGlnZW50IHByZWRhdG9yLgorCitbW2RlZl9vcmlnaW5dXW9yaWdpbjo6CisJVGhlIGRlZmF1bHQgdXBzdHJlYW0gPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4uIE1vc3QgcHJvamVjdHMgaGF2ZQorCWF0IGxlYXN0IG9uZSB1cHN0cmVhbSBwcm9qZWN0IHdoaWNoIHRoZXkgdHJhY2suIEJ5IGRlZmF1bHQKKwknb3JpZ2luJyBpcyB1c2VkIGZvciB0aGF0IHB1cnBvc2UuIE5ldyB1cHN0cmVhbSB1cGRhdGVzCisJd2lsbCBiZSBmZXRjaGVkIGludG8gcmVtb3RlIDw8ZGVmX3RyYWNraW5nX2JyYW5jaCx0cmFja2luZyBicmFuY2hlcz4+IG5hbWVkCisJb3JpZ2luL25hbWUtb2YtdXBzdHJlYW0tYnJhbmNoLCB3aGljaCB5b3UgY2FuIHNlZSB1c2luZworCSJgZ2l0IGJyYW5jaCAtcmAiLgorCitbW2RlZl9wYWNrXV1wYWNrOjoKKwlBIHNldCBvZiBvYmplY3RzIHdoaWNoIGhhdmUgYmVlbiBjb21wcmVzc2VkIGludG8gb25lIGZpbGUgKHRvIHNhdmUgc3BhY2UKKwlvciB0byB0cmFuc21pdCB0aGVtIGVmZmljaWVudGx5KS4KKworW1tkZWZfcGFja19pbmRleF1dcGFjayBpbmRleDo6CisJVGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMsIGFuZCBvdGhlciBpbmZvcm1hdGlvbiwgb2YgdGhlIG9iamVjdHMgaW4gYQorCTw8ZGVmX3BhY2sscGFjaz4+LCB0byBhc3Npc3QgaW4gZWZmaWNpZW50bHkgYWNjZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhCisJcGFjay4KKworW1tkZWZfcGFyZW50XV1wYXJlbnQ6OgorCUEgPDxkZWZfY29tbWl0X29iamVjdCxjb21taXQgb2JqZWN0Pj4gY29udGFpbnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3QKKwlvZiB0aGUgbG9naWNhbCBwcmVkZWNlc3NvcihzKSBpbiB0aGUgbGluZSBvZiBkZXZlbG9wbWVudCwgaS5lLiBpdHMKKwlwYXJlbnRzLgorCitbW2RlZl9waWNrYXhlXV1waWNrYXhlOjoKKwlUaGUgdGVybSA8PGRlZl9waWNrYXhlLHBpY2theGU+PiByZWZlcnMgdG8gYW4gb3B0aW9uIHRvIHRoZSBkaWZmY29yZQorCXJvdXRpbmVzIHRoYXQgaGVscCBzZWxlY3QgY2hhbmdlcyB0aGF0IGFkZCBvciBkZWxldGUgYSBnaXZlbiB0ZXh0CisJc3RyaW5nLiBXaXRoIHRoZSAtLXBpY2theGUtYWxsIG9wdGlvbiwgaXQgY2FuIGJlIHVzZWQgdG8gdmlldyB0aGUgZnVsbAorCTw8ZGVmX2NoYW5nZXNldCxjaGFuZ2VzZXQ+PiB0aGF0IGludHJvZHVjZWQgb3IgcmVtb3ZlZCwgc2F5LCBhCisJcGFydGljdWxhciBsaW5lIG9mIHRleHQuIFNlZSBnaXRsaW5rOmdpdC1kaWZmWzFdLgorCitbW2RlZl9wbHVtYmluZ11dcGx1bWJpbmc6OgorCUN1dGUgbmFtZSBmb3IgPDxkZWZfY29yZV9naXQsY29yZSBnaXQ+Pi4KKworW1tkZWZfcG9yY2VsYWluXV1wb3JjZWxhaW46OgorCUN1dGUgbmFtZSBmb3IgcHJvZ3JhbXMgYW5kIHByb2dyYW0gc3VpdGVzIGRlcGVuZGluZyBvbgorCTw8ZGVmX2NvcmVfZ2l0LGNvcmUgZ2l0Pj4sIHByZXNlbnRpbmcgYSBoaWdoIGxldmVsIGFjY2VzcyB0bworCWNvcmUgZ2l0LiBQb3JjZWxhaW5zIGV4cG9zZSBtb3JlIG9mIGEgPDxkZWZfU0NNLFNDTT4+CisJaW50ZXJmYWNlIHRoYW4gdGhlIDw8ZGVmX3BsdW1iaW5nLHBsdW1iaW5nPj4uCisKK1tbZGVmX3B1bGxdXXB1bGw6OgorCVB1bGxpbmcgYSA8PGRlZl9icmFuY2gsYnJhbmNoPj4gbWVhbnMgdG8gPDxkZWZfZmV0Y2gsZmV0Y2g+PiBpdCBhbmQKKwk8PGRlZl9tZXJnZSxtZXJnZT4+IGl0LiAgU2VlIGFsc28gZ2l0bGluazpnaXQtcHVsbFsxXS4KKworW1tkZWZfcHVzaF1dcHVzaDo6CisJUHVzaGluZyBhIDw8ZGVmX2JyYW5jaCxicmFuY2g+PiBtZWFucyB0byBnZXQgdGhlIGJyYW5jaCdzCisJPDxkZWZfaGVhZF9yZWYsaGVhZCByZWY+PiBmcm9tIGEgcmVtb3RlIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+LAorCWZpbmQgb3V0IGlmIGl0IGlzIGFuIGFuY2VzdG9yIHRvIHRoZSBicmFuY2gncyBsb2NhbAorCWhlYWQgcmVmIGlzIGEgZGlyZWN0LCBhbmQgaW4gdGhhdCBjYXNlLCBwdXR0aW5nIGFsbAorCW9iamVjdHMsIHdoaWNoIGFyZSA8PGRlZl9yZWFjaGFibGUscmVhY2hhYmxlPj4gZnJvbSB0aGUgbG9jYWwKKwloZWFkIHJlZiwgYW5kIHdoaWNoIGFyZSBtaXNzaW5nIGZyb20gdGhlIHJlbW90ZQorCXJlcG9zaXRvcnksIGludG8gdGhlIHJlbW90ZQorCTw8ZGVmX29iamVjdF9kYXRhYmFzZSxvYmplY3QgZGF0YWJhc2U+PiwgYW5kIHVwZGF0aW5nIHRoZSByZW1vdGUKKwloZWFkIHJlZi4gSWYgdGhlIHJlbW90ZSA8PGRlZl9oZWFkLGhlYWQ+PiBpcyBub3QgYW4KKwlhbmNlc3RvciB0byB0aGUgbG9jYWwgaGVhZCwgdGhlIHB1c2ggZmFpbHMuCisKK1tbZGVmX3JlYWNoYWJsZV1dcmVhY2hhYmxlOjoKKwlBbGwgb2YgdGhlIGFuY2VzdG9ycyBvZiBhIGdpdmVuIDw8ZGVmX2NvbW1pdCxjb21taXQ+PiBhcmUgc2FpZCB0byBiZQorCSJyZWFjaGFibGUiIGZyb20gdGhhdCBjb21taXQuIE1vcmUKKwlnZW5lcmFsbHksIG9uZSA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gaXMgcmVhY2hhYmxlIGZyb20KKwlhbm90aGVyIGlmIHdlIGNhbiByZWFjaCB0aGUgb25lIGZyb20gdGhlIG90aGVyIGJ5IGEgPDxkZWZfY2hhaW4sY2hhaW4+PgorCXRoYXQgZm9sbG93cyA8PGRlZl90YWcsdGFncz4+IHRvIHdoYXRldmVyIHRoZXkgdGFnLAorCTw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0cz4+IHRvIHRoZWlyIHBhcmVudHMgb3IgdHJlZXMsIGFuZAorCTw8ZGVmX3RyZWVfb2JqZWN0LHRyZWVzPj4gdG8gdGhlIHRyZWVzIG9yIDw8ZGVmX2Jsb2Jfb2JqZWN0LGJsb2JzPj4KKwl0aGF0IHRoZXkgY29udGFpbi4KKworW1tkZWZfcmViYXNlXV1yZWJhc2U6OgorCVRvIHJlYXBwbHkgYSBzZXJpZXMgb2YgY2hhbmdlcyBmcm9tIGEgPDxkZWZfYnJhbmNoLGJyYW5jaD4+IHRvIGEKKwlkaWZmZXJlbnQgYmFzZSwgYW5kIHJlc2V0IHRoZSA8PGRlZl9oZWFkLGhlYWQ+PiBvZiB0aGF0IGJyYW5jaAorCXRvIHRoZSByZXN1bHQuCisKK1tbZGVmX3JlZl1dcmVmOjoKKwlBIDQwLWJ5dGUgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGEgPDxkZWZfU0hBMSxTSEExPj4gb3IgYSBuYW1lIHRoYXQKKwlkZW5vdGVzIGEgcGFydGljdWxhciA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4uIFRoZXNlIG1heSBiZSBzdG9yZWQgaW4KKwlgJEdJVF9ESVIvcmVmcy9gLgorCitbW2RlZl9yZWZsb2ddXXJlZmxvZzo6CisJQSByZWZsb2cgc2hvd3MgdGhlIGxvY2FsICJoaXN0b3J5IiBvZiBhIHJlZi4gIEluIG90aGVyIHdvcmRzLAorCWl0IGNhbiB0ZWxsIHlvdSB3aGF0IHRoZSAzcmQgbGFzdCByZXZpc2lvbiBpbiBfdGhpc18gcmVwb3NpdG9yeQorCXdhcywgYW5kIHdoYXQgd2FzIHRoZSBjdXJyZW50IHN0YXRlIGluIF90aGlzXyByZXBvc2l0b3J5LAorCXllc3RlcmRheSA5OjE0cG0uICBTZWUgZ2l0bGluazpnaXQtcmVmbG9nWzFdIGZvciBkZXRhaWxzLgorCitbW2RlZl9yZWZzcGVjXV1yZWZzcGVjOjoKKwlBICJyZWZzcGVjIiBpcyB1c2VkIGJ5IDw8ZGVmX2ZldGNoLGZldGNoPj4gYW5kCisJPDxkZWZfcHVzaCxwdXNoPj4gdG8gZGVzY3JpYmUgdGhlIG1hcHBpbmcgYmV0d2VlbiByZW1vdGUKKwk8PGRlZl9yZWYscmVmPj4gYW5kIGxvY2FsIHJlZi4gVGhleSBhcmUgY29tYmluZWQgd2l0aCBhIGNvbG9uIGluCisJdGhlIGZvcm1hdCA8c3JjPjo8ZHN0PiwgcHJlY2VkZWQgYnkgYW4gb3B0aW9uYWwgcGx1cyBzaWduLCArLgorCUZvciBleGFtcGxlOiBgZ2l0IGZldGNoICRVUkwKKwlyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL29yaWdpbmAgbWVhbnMgImdyYWIgdGhlIG1hc3RlcgorCTw8ZGVmX2JyYW5jaCxicmFuY2g+PiA8PGRlZl9oZWFkLGhlYWQ+PiBmcm9tIHRoZSAkVVJMIGFuZCBzdG9yZQorCWl0IGFzIG15IG9yaWdpbiBicmFuY2ggaGVhZCIuIEFuZCBgZ2l0IHB1c2gKKwkkVVJMIHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvdG8tdXBzdHJlYW1gIG1lYW5zICJwdWJsaXNoIG15CisJbWFzdGVyIGJyYW5jaCBoZWFkIGFzIHRvLXVwc3RyZWFtIGJyYW5jaCBhdCAkVVJMIi4gU2VlIGFsc28KKwlnaXRsaW5rOmdpdC1wdXNoWzFdCisKK1tbZGVmX3JlcG9zaXRvcnldXXJlcG9zaXRvcnk6OgorCUEgY29sbGVjdGlvbiBvZiA8PGRlZl9yZWYscmVmcz4+IHRvZ2V0aGVyIHdpdGggYW4KKwk8PGRlZl9vYmplY3RfZGF0YWJhc2Usb2JqZWN0IGRhdGFiYXNlPj4gY29udGFpbmluZyBhbGwgb2JqZWN0cworCXdoaWNoIGFyZSA8PGRlZl9yZWFjaGFibGUscmVhY2hhYmxlPj4gZnJvbSB0aGUgcmVmcywgcG9zc2libHkKKwlhY2NvbXBhbmllZCBieSBtZXRhIGRhdGEgZnJvbSBvbmUgb3IgbW9yZSA8PGRlZl9wb3JjZWxhaW4scG9yY2VsYWlucz4+LiBBCisJcmVwb3NpdG9yeSBjYW4gc2hhcmUgYW4gb2JqZWN0IGRhdGFiYXNlIHdpdGggb3RoZXIgcmVwb3NpdG9yaWVzCisJdmlhIDw8ZGVmX2FsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UsYWx0ZXJuYXRlcyBtZWNoYW5pc20+Pi4KKworW1tkZWZfcmVzb2x2ZV1dcmVzb2x2ZTo6CisJVGhlIGFjdGlvbiBvZiBmaXhpbmcgdXAgbWFudWFsbHkgd2hhdCBhIGZhaWxlZCBhdXRvbWF0aWMKKwk8PGRlZl9tZXJnZSxtZXJnZT4+IGxlZnQgYmVoaW5kLgorCitbW2RlZl9yZXZpc2lvbl1dcmV2aXNpb246OgorCUEgcGFydGljdWxhciBzdGF0ZSBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUKKwk8PGRlZl9vYmplY3RfZGF0YWJhc2Usb2JqZWN0IGRhdGFiYXNlPj4uIEl0IGlzIHJlZmVyZW5jZWQgYnkgYQorCTw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0IG9iamVjdD4+LgorCitbW2RlZl9yZXdpbmRdXXJld2luZDo6CisJVG8gdGhyb3cgYXdheSBwYXJ0IG9mIHRoZSBkZXZlbG9wbWVudCwgaS5lLiB0byBhc3NpZ24gdGhlCisJPDxkZWZfaGVhZCxoZWFkPj4gdG8gYW4gZWFybGllciA8PGRlZl9yZXZpc2lvbixyZXZpc2lvbj4+LgorCitbW2RlZl9TQ01dXVNDTTo6CisJU291cmNlIGNvZGUgbWFuYWdlbWVudCAodG9vbCkuCisKK1tbZGVmX1NIQTFdXVNIQTE6OgorCVN5bm9ueW0gZm9yIDw8ZGVmX29iamVjdF9uYW1lLG9iamVjdCBuYW1lPj4uCisKK1tbZGVmX3NoYWxsb3dfcmVwb3NpdG9yeV1dc2hhbGxvdyByZXBvc2l0b3J5OjoKKwlBIHNoYWxsb3cgPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4gaGFzIGFuIGluY29tcGxldGUKKwloaXN0b3J5IHNvbWUgb2Ygd2hvc2UgPDxkZWZfY29tbWl0LGNvbW1pdHM+PiBoYXZlIDw8ZGVmX3BhcmVudCxwYXJlbnRzPj4gY2F1dGVyaXplZCBhd2F5IChpbiBvdGhlcgorCXdvcmRzLCBnaXQgaXMgdG9sZCB0byBwcmV0ZW5kIHRoYXQgdGhlc2UgY29tbWl0cyBkbyBub3QgaGF2ZSB0aGUKKwlwYXJlbnRzLCBldmVuIHRob3VnaCB0aGV5IGFyZSByZWNvcmRlZCBpbiB0aGUgPDxkZWZfY29tbWl0X29iamVjdCxjb21taXQKKwlvYmplY3Q+PikuIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgaW50ZXJlc3RlZCBvbmx5IGluIHRoZQorCXJlY2VudCBoaXN0b3J5IG9mIGEgcHJvamVjdCBldmVuIHRob3VnaCB0aGUgcmVhbCBoaXN0b3J5IHJlY29yZGVkIGluIHRoZQorCXVwc3RyZWFtIGlzIG11Y2ggbGFyZ2VyLiBBIHNoYWxsb3cgcmVwb3NpdG9yeQorCWlzIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBgLS1kZXB0aGAgb3B0aW9uIHRvIGdpdGxpbms6Z2l0LWNsb25lWzFdLCBhbmQKKwlpdHMgaGlzdG9yeSBjYW4gYmUgbGF0ZXIgZGVlcGVuZWQgd2l0aCBnaXRsaW5rOmdpdC1mZXRjaFsxXS4KKworW1tkZWZfc3ltcmVmXV1zeW1yZWY6OgorCVN5bWJvbGljIHJlZmVyZW5jZTogaW5zdGVhZCBvZiBjb250YWluaW5nIHRoZSA8PGRlZl9TSEExLFNIQTE+PgorCWlkIGl0c2VsZiwgaXQgaXMgb2YgdGhlIGZvcm1hdCAncmVmOiByZWZzL3NvbWUvdGhpbmcnIGFuZCB3aGVuCisJcmVmZXJlbmNlZCwgaXQgcmVjdXJzaXZlbHkgZGVyZWZlcmVuY2VzIHRvIHRoaXMgcmVmZXJlbmNlLgorCSc8PGRlZl9IRUFELEhFQUQ+PicgaXMgYSBwcmltZSBleGFtcGxlIG9mIGEgc3ltcmVmLiBTeW1ib2xpYworCXJlZmVyZW5jZXMgYXJlIG1hbmlwdWxhdGVkIHdpdGggdGhlIGdpdGxpbms6Z2l0LXN5bWJvbGljLXJlZlsxXQorCWNvbW1hbmQuCisKK1tbZGVmX3RhZ11ddGFnOjoKKwlBIDw8ZGVmX3JlZixyZWY+PiBwb2ludGluZyB0byBhIDw8ZGVmX3RhZ19vYmplY3QsdGFnPj4gb3IKKwk8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdCBvYmplY3Q+Pi4gSW4gY29udHJhc3QgdG8gYSA8PGRlZl9oZWFkLGhlYWQ+PiwKKwlhIHRhZyBpcyBub3QgY2hhbmdlZCBieSBhIDw8ZGVmX2NvbW1pdCxjb21taXQ+Pi4gVGFncyAobm90CisJPDxkZWZfdGFnX29iamVjdCx0YWcgb2JqZWN0cz4+KSBhcmUgc3RvcmVkIGluIGAkR0lUX0RJUi9yZWZzL3RhZ3MvYC4gQQorCWdpdCB0YWcgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBhIExpc3AgdGFnICh3aGljaCB3b3VsZCBiZQorCWNhbGxlZCBhbiA8PGRlZl9vYmplY3RfdHlwZSxvYmplY3QgdHlwZT4+IGluIGdpdCdzIGNvbnRleHQpLiBBCisJdGFnIGlzIG1vc3QgdHlwaWNhbGx5IHVzZWQgdG8gbWFyayBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlCisJY29tbWl0IGFuY2VzdHJ5IDw8ZGVmX2NoYWluLGNoYWluPj4uCisKK1tbZGVmX3RhZ19vYmplY3RdXXRhZyBvYmplY3Q6OgorCUFuIDw8ZGVmX29iamVjdCxvYmplY3Q+PiBjb250YWluaW5nIGEgPDxkZWZfcmVmLHJlZj4+IHBvaW50aW5nIHRvCisJYW5vdGhlciBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluIGEgbWVzc2FnZSBqdXN0IGxpa2UgYQorCTw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0IG9iamVjdD4+LiBJdCBjYW4gYWxzbyBjb250YWluIGEgKFBHUCkKKwlzaWduYXR1cmUsIGluIHdoaWNoIGNhc2UgaXQgaXMgY2FsbGVkIGEgInNpZ25lZCB0YWcgb2JqZWN0Ii4KKworW1tkZWZfdG9waWNfYnJhbmNoXV10b3BpYyBicmFuY2g6OgorCUEgcmVndWxhciBnaXQgPDxkZWZfYnJhbmNoLGJyYW5jaD4+IHRoYXQgaXMgdXNlZCBieSBhIGRldmVsb3BlciB0bworCWlkZW50aWZ5IGEgY29uY2VwdHVhbCBsaW5lIG9mIGRldmVsb3BtZW50LiBTaW5jZSBicmFuY2hlcyBhcmUgdmVyeSBlYXN5CisJYW5kIGluZXhwZW5zaXZlLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaGF2ZSBzZXZlcmFsIHNtYWxsIGJyYW5jaGVzCisJdGhhdCBlYWNoIGNvbnRhaW4gdmVyeSB3ZWxsIGRlZmluZWQgY29uY2VwdHMgb3Igc21hbGwgaW5jcmVtZW50YWwgeWV0CisJcmVsYXRlZCBjaGFuZ2VzLgorCitbW2RlZl90cmFja2luZ19icmFuY2hdXXRyYWNraW5nIGJyYW5jaDo6CisJQSByZWd1bGFyIGdpdCA8PGRlZl9icmFuY2gsYnJhbmNoPj4gdGhhdCBpcyB1c2VkIHRvIGZvbGxvdyBjaGFuZ2VzIGZyb20KKwlhbm90aGVyIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+LiBBIHRyYWNraW5nCisJYnJhbmNoIHNob3VsZCBub3QgY29udGFpbiBkaXJlY3QgbW9kaWZpY2F0aW9ucyBvciBoYXZlIGxvY2FsIGNvbW1pdHMKKwltYWRlIHRvIGl0LiBBIHRyYWNraW5nIGJyYW5jaCBjYW4gdXN1YWxseSBiZQorCWlkZW50aWZpZWQgYXMgdGhlIHJpZ2h0LWhhbmQtc2lkZSA8PGRlZl9yZWYscmVmPj4gaW4gYSBQdWxsOgorCTw8ZGVmX3JlZnNwZWMscmVmc3BlYz4+LgorCitbW2RlZl90cmVlXV10cmVlOjoKKwlFaXRoZXIgYSA8PGRlZl93b3JraW5nX3RyZWUsd29ya2luZyB0cmVlPj4sIG9yIGEgPDxkZWZfdHJlZV9vYmplY3QsdHJlZQorCW9iamVjdD4+IHRvZ2V0aGVyIHdpdGggdGhlIGRlcGVuZGVudCA8PGRlZl9ibG9iX29iamVjdCxibG9iPj4gYW5kIHRyZWUgb2JqZWN0cworCShpLmUuIGEgc3RvcmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgd29ya2luZyB0cmVlKS4KKworW1tkZWZfdHJlZV9vYmplY3RdXXRyZWUgb2JqZWN0OjoKKwlBbiA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyBhbmQgbW9kZXMgYWxvbmcKKwl3aXRoIHJlZnMgdG8gdGhlIGFzc29jaWF0ZWQgYmxvYiBhbmQvb3IgdHJlZSBvYmplY3RzLiBBCisJPDxkZWZfdHJlZSx0cmVlPj4gaXMgZXF1aXZhbGVudCB0byBhIDw8ZGVmX2RpcmVjdG9yeSxkaXJlY3Rvcnk+Pi4KKworW1tkZWZfdHJlZS1pc2hdXXRyZWUtaXNoOjoKKwlBIDw8ZGVmX3JlZixyZWY+PiBwb2ludGluZyB0byBlaXRoZXIgYSA8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdAorCW9iamVjdD4+LCBhIDw8ZGVmX3RyZWVfb2JqZWN0LHRyZWUgb2JqZWN0Pj4sIG9yIGEgPDxkZWZfdGFnX29iamVjdCx0YWcKKwlvYmplY3Q+PiBwb2ludGluZyB0byBhIHRhZyBvciBjb21taXQgb3IgdHJlZSBvYmplY3QuCisKK1tbZGVmX3VubWVyZ2VkX2luZGV4XV11bm1lcmdlZCBpbmRleDo6CisJQW4gPDxkZWZfaW5kZXgsaW5kZXg+PiB3aGljaCBjb250YWlucyB1bm1lcmdlZAorCTw8ZGVmX2luZGV4X2VudHJ5LGluZGV4IGVudHJpZXM+Pi4KKworW1tkZWZfdW5yZWFjaGFibGVfb2JqZWN0XV11bnJlYWNoYWJsZSBvYmplY3Q6OgorCUFuIDw8ZGVmX29iamVjdCxvYmplY3Q+PiB3aGljaCBpcyBub3QgPDxkZWZfcmVhY2hhYmxlLHJlYWNoYWJsZT4+IGZyb20gYQorCTw8ZGVmX2JyYW5jaCxicmFuY2g+PiwgPDxkZWZfdGFnLHRhZz4+LCBvciBhbnkgb3RoZXIgcmVmZXJlbmNlLgorCitbW2RlZl93b3JraW5nX3RyZWVdXXdvcmtpbmcgdHJlZTo6CisJVGhlIHRyZWUgb2YgYWN0dWFsIGNoZWNrZWQgb3V0IGZpbGVzLiAgVGhlIHdvcmtpbmcgdHJlZSBpcworCW5vcm1hbGx5IGVxdWFsIHRvIHRoZSA8PGRlZl9IRUFELEhFQUQ+PiBwbHVzIGFueSBsb2NhbCBjaGFuZ2VzCisJdGhhdCB5b3UgaGF2ZSBtYWRlIGJ1dCBub3QgeWV0IGNvbW1pdHRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG9va3MudHh0IGIvRG9jdW1lbnRhdGlvbi9ob29rcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiYjk3NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG9va3MudHh0CkBAIC0wLDAgKzEsMjI1IEBACitIb29rcyB1c2VkIGJ5IGdpdAorPT09PT09PT09PT09PT09PT0KKworSG9va3MgYXJlIGxpdHRsZSBzY3JpcHRzIHlvdSBjYW4gcGxhY2UgaW4gYCRHSVRfRElSL2hvb2tzYAorZGlyZWN0b3J5IHRvIHRyaWdnZXIgYWN0aW9uIGF0IGNlcnRhaW4gcG9pbnRzLiAgV2hlbgorYGdpdC1pbml0YCBpcyBydW4sIGEgaGFuZGZ1bCBleGFtcGxlIGhvb2tzIGFyZSBjb3BpZWQgaW4gdGhlCitgaG9va3NgIGRpcmVjdG9yeSBvZiB0aGUgbmV3IHJlcG9zaXRvcnksIGJ1dCBieSBkZWZhdWx0IHRoZXkgYXJlCithbGwgZGlzYWJsZWQuICBUbyBlbmFibGUgYSBob29rLCBtYWtlIGl0IGV4ZWN1dGFibGUgd2l0aCBgY2htb2QgK3hgLgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY3VycmVudGx5IGRlZmluZWQgaG9va3MuCisKK2FwcGx5cGF0Y2gtbXNnCistLS0tLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWFwcGx5cGF0Y2hgIHNjcmlwdCwgd2hpY2ggaXMKK3R5cGljYWxseSBpbnZva2VkIGJ5IGBnaXQtYXBwbHltYm94YC4gIEl0IHRha2VzIGEgc2luZ2xlCitwYXJhbWV0ZXIsIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaG9sZHMgdGhlIHByb3Bvc2VkIGNvbW1pdAorbG9nIG1lc3NhZ2UuICBFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGNhdXNlcworYGdpdC1hcHBseXBhdGNoYCB0byBhYm9ydCBiZWZvcmUgYXBwbHlpbmcgdGhlIHBhdGNoLgorCitUaGUgaG9vayBpcyBhbGxvd2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UgZmlsZSBpbiBwbGFjZSwgYW5kIGNhbgorYmUgdXNlZCB0byBub3JtYWxpemUgdGhlIG1lc3NhZ2UgaW50byBzb21lIHByb2plY3Qgc3RhbmRhcmQKK2Zvcm1hdCAoaWYgdGhlIHByb2plY3QgaGFzIG9uZSkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmdXNlCit0aGUgY29tbWl0IGFmdGVyIGluc3BlY3RpbmcgdGhlIG1lc3NhZ2UgZmlsZS4KKworVGhlIGRlZmF1bHQgJ2FwcGx5cGF0Y2gtbXNnJyBob29rLCB3aGVuIGVuYWJsZWQsIHJ1bnMgdGhlCisnY29tbWl0LW1zZycgaG9vaywgaWYgdGhlIGxhdHRlciBpcyBlbmFibGVkLgorCitwcmUtYXBwbHlwYXRjaAorLS0tLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1hcHBseXBhdGNoYCBzY3JpcHQsIHdoaWNoIGlzCit0eXBpY2FsbHkgaW52b2tlZCBieSBgZ2l0LWFwcGx5bWJveGAuICBJdCB0YWtlcyBubyBwYXJhbWV0ZXIsCithbmQgaXMgaW52b2tlZCBhZnRlciB0aGUgcGF0Y2ggaXMgYXBwbGllZCwgYnV0IGJlZm9yZSBhIGNvbW1pdAoraXMgbWFkZS4gIEV4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgY2F1c2VzIHRoZSB3b3JraW5nIHRyZWUKK2FmdGVyIGFwcGxpY2F0aW9uIG9mIHRoZSBwYXRjaCBub3QgY29tbWl0dGVkLgorCitJdCBjYW4gYmUgdXNlZCB0byBpbnNwZWN0IHRoZSBjdXJyZW50IHdvcmtpbmcgdHJlZSBhbmQgcmVmdXNlIHRvCittYWtlIGEgY29tbWl0IGlmIGl0IGRvZXMgbm90IHBhc3MgY2VydGFpbiB0ZXN0LgorCitUaGUgZGVmYXVsdCAncHJlLWFwcGx5cGF0Y2gnIGhvb2ssIHdoZW4gZW5hYmxlZCwgcnVucyB0aGUKKydwcmUtY29tbWl0JyBob29rLCBpZiB0aGUgbGF0dGVyIGlzIGVuYWJsZWQuCisKK3Bvc3QtYXBwbHlwYXRjaAorLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYXBwbHlwYXRjaGAgc2NyaXB0LCB3aGljaCBpcwordHlwaWNhbGx5IGludm9rZWQgYnkgYGdpdC1hcHBseW1ib3hgLiAgSXQgdGFrZXMgbm8gcGFyYW1ldGVyLAorYW5kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQgYW5kIGEgY29tbWl0IGlzIG1hZGUuCisKK1RoaXMgaG9vayBpcyBtZWFudCBwcmltYXJpbHkgZm9yIG5vdGlmaWNhdGlvbiwgYW5kIGNhbm5vdCBhZmZlY3QKK3RoZSBvdXRjb21lIG9mIGBnaXQtYXBwbHlwYXRjaGAuCisKK3ByZS1jb21taXQKKy0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLCBhbmQgY2FuIGJlIGJ5cGFzc2VkCit3aXRoIGBcLS1uby12ZXJpZnlgIG9wdGlvbi4gIEl0IHRha2VzIG5vIHBhcmFtZXRlciwgYW5kIGlzCitpbnZva2VkIGJlZm9yZSBvYnRhaW5pbmcgdGhlIHByb3Bvc2VkIGNvbW1pdCBsb2cgbWVzc2FnZSBhbmQKK21ha2luZyBhIGNvbW1pdC4gIEV4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgZnJvbSB0aGlzIHNjcmlwdAorY2F1c2VzIHRoZSBgZ2l0LWNvbW1pdGAgdG8gYWJvcnQuCisKK1RoZSBkZWZhdWx0ICdwcmUtY29tbWl0JyBob29rLCB3aGVuIGVuYWJsZWQsIGNhdGNoZXMgaW50cm9kdWN0aW9uCitvZiBsaW5lcyB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBhYm9ydHMgdGhlIGNvbW1pdCB3aGVuCitzdWNoIGEgbGluZSBpcyBmb3VuZC4KKworY29tbWl0LW1zZworLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWNvbW1pdGAsIGFuZCBjYW4gYmUgYnlwYXNzZWQKK3dpdGggYFwtLW5vLXZlcmlmeWAgb3B0aW9uLiAgSXQgdGFrZXMgYSBzaW5nbGUgcGFyYW1ldGVyLCB0aGUKK25hbWUgb2YgdGhlIGZpbGUgdGhhdCBob2xkcyB0aGUgcHJvcG9zZWQgY29tbWl0IGxvZyBtZXNzYWdlLgorRXhpdGluZyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBjYXVzZXMgdGhlIGBnaXQtY29tbWl0YCB0bworYWJvcnQuCisKK1RoZSBob29rIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgbWVzc2FnZSBmaWxlIGluIHBsYWNlLCBhbmQgY2FuCitiZSB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgbWVzc2FnZSBpbnRvIHNvbWUgcHJvamVjdCBzdGFuZGFyZAorZm9ybWF0IChpZiB0aGUgcHJvamVjdCBoYXMgb25lKS4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZWZ1c2UKK3RoZSBjb21taXQgYWZ0ZXIgaW5zcGVjdGluZyB0aGUgbWVzc2FnZSBmaWxlLgorCitUaGUgZGVmYXVsdCAnY29tbWl0LW1zZycgaG9vaywgd2hlbiBlbmFibGVkLCBkZXRlY3RzIGR1cGxpY2F0ZQorIlNpZ25lZC1vZmYtYnkiIGxpbmVzLCBhbmQgYWJvcnRzIHRoZSBjb21taXQgaWYgb25lIGlzIGZvdW5kLgorCitwb3N0LWNvbW1pdAorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLiAgSXQgdGFrZXMgbm8KK3BhcmFtZXRlciwgYW5kIGlzIGludm9rZWQgYWZ0ZXIgYSBjb21taXQgaXMgbWFkZS4KKworVGhpcyBob29rIGlzIG1lYW50IHByaW1hcmlseSBmb3Igbm90aWZpY2F0aW9uLCBhbmQgY2Fubm90IGFmZmVjdAordGhlIG91dGNvbWUgb2YgYGdpdC1jb21taXRgLgorCitbW3ByZS1yZWNlaXZlXV0KK3ByZS1yZWNlaXZlCistLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LXJlY2VpdmUtcGFja2Agb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5LAord2hpY2ggaGFwcGVucyB3aGVuIGEgYGdpdCBwdXNoYCBpcyBkb25lIG9uIGEgbG9jYWwgcmVwb3NpdG9yeS4KK0p1c3QgYmVmb3JlIHN0YXJ0aW5nIHRvIHVwZGF0ZSByZWZzIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwgdGhlCitwcmUtcmVjZWl2ZSBob29rIGlzIGludm9rZWQuICBJdHMgZXhpdCBzdGF0dXMgZGV0ZXJtaW5lcyB0aGUgc3VjY2Vzcworb3IgZmFpbHVyZSBvZiB0aGUgdXBkYXRlLgorCitUaGlzIGhvb2sgZXhlY3V0ZXMgb25jZSBmb3IgdGhlIHJlY2VpdmUgb3BlcmF0aW9uLiBJdCB0YWtlcyBubworYXJndW1lbnRzLCBidXQgZm9yIGVhY2ggcmVmIHRvIGJlIHVwZGF0ZWQgaXQgcmVjZWl2ZXMgb24gc3RhbmRhcmQKK2lucHV0IGEgbGluZSBvZiB0aGUgZm9ybWF0OgorCisgIDxvbGQtdmFsdWU+IFNQIDxuZXctdmFsdWU+IFNQIDxyZWYtbmFtZT4gTEYKKword2hlcmUgYDxvbGQtdmFsdWU+YCBpcyB0aGUgb2xkIG9iamVjdCBuYW1lIHN0b3JlZCBpbiB0aGUgcmVmLAorYDxuZXctdmFsdWU+YCBpcyB0aGUgbmV3IG9iamVjdCBuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVmIGFuZAorYDxyZWYtbmFtZT5gIGlzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHJlZi4KK1doZW4gY3JlYXRpbmcgYSBuZXcgcmVmLCBgPG9sZC12YWx1ZT5gIGlzIDQwIGAwYC4KKworSWYgdGhlIGhvb2sgZXhpdHMgd2l0aCBub24temVybyBzdGF0dXMsIG5vbmUgb2YgdGhlIHJlZnMgd2lsbCBiZQordXBkYXRlZC4gSWYgdGhlIGhvb2sgZXhpdHMgd2l0aCB6ZXJvLCB1cGRhdGluZyBvZiBpbmRpdmlkdWFsIHJlZnMgY2FuCitzdGlsbCBiZSBwcmV2ZW50ZWQgYnkgdGhlIDw8dXBkYXRlLCd1cGRhdGUnPj4gaG9vay4KKworQm90aCBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIG91dHB1dCBhcmUgZm9yd2FyZGVkIHRvCitgZ2l0LXNlbmQtcGFja2Agb24gdGhlIG90aGVyIGVuZCwgc28geW91IGNhbiBzaW1wbHkgYGVjaG9gIG1lc3NhZ2VzCitmb3IgdGhlIHVzZXIuCisKK1tbdXBkYXRlXV0KK3VwZGF0ZQorLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtcmVjZWl2ZS1wYWNrYCBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksCit3aGljaCBoYXBwZW5zIHdoZW4gYSBgZ2l0IHB1c2hgIGlzIGRvbmUgb24gYSBsb2NhbCByZXBvc2l0b3J5LgorSnVzdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHJlZiBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHRoZSB1cGRhdGUgaG9vaworaXMgaW52b2tlZC4gIEl0cyBleGl0IHN0YXR1cyBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YKK3RoZSByZWYgdXBkYXRlLgorCitUaGUgaG9vayBleGVjdXRlcyBvbmNlIGZvciBlYWNoIHJlZiB0byBiZSB1cGRhdGVkLCBhbmQgdGFrZXMKK3RocmVlIHBhcmFtZXRlcnM6CisKKyAtIHRoZSBuYW1lIG9mIHRoZSByZWYgYmVpbmcgdXBkYXRlZCwKKyAtIHRoZSBvbGQgb2JqZWN0IG5hbWUgc3RvcmVkIGluIHRoZSByZWYsCisgLSBhbmQgdGhlIG5ldyBvYmplY3RuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVmLgorCitBIHplcm8gZXhpdCBmcm9tIHRoZSB1cGRhdGUgaG9vayBhbGxvd3MgdGhlIHJlZiB0byBiZSB1cGRhdGVkLgorRXhpdGluZyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzIHByZXZlbnRzIGBnaXQtcmVjZWl2ZS1wYWNrYAorZnJvbSB1cGRhdGluZyB0aGF0IHJlZi4KKworVGhpcyBob29rIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgJ2ZvcmNlZCcgdXBkYXRlIG9uIGNlcnRhaW4gcmVmcyBieQorbWFraW5nIHN1cmUgdGhhdCB0aGUgb2JqZWN0IG5hbWUgaXMgYSBjb21taXQgb2JqZWN0IHRoYXQgaXMgYQorZGVzY2VuZGFudCBvZiB0aGUgY29tbWl0IG9iamVjdCBuYW1lZCBieSB0aGUgb2xkIG9iamVjdCBuYW1lLgorVGhhdCBpcywgdG8gZW5mb3JjZSBhICJmYXN0IGZvcndhcmQgb25seSIgcG9saWN5LgorCitJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gbG9nIHRoZSBvbGQuLm5ldyBzdGF0dXMuICBIb3dldmVyLCBpdAorZG9lcyBub3Qga25vdyB0aGUgZW50aXJlIHNldCBvZiBicmFuY2hlcywgc28gaXQgd291bGQgZW5kIHVwCitmaXJpbmcgb25lIGUtbWFpbCBwZXIgcmVmIHdoZW4gdXNlZCBuYWl2ZWx5LCB0aG91Z2guICBUaGUKKzw8cG9zdC1yZWNlaXZlLCdwb3N0LXJlY2VpdmUnPj4gaG9vayBpcyBtb3JlIHN1aXRlZCB0byB0aGF0LgorCitBbm90aGVyIHVzZSBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBpcyB0byB1c2UgdGhpcyBob29rIHRvCitpbXBsZW1lbnQgYWNjZXNzIGNvbnRyb2wgd2hpY2ggaXMgZmluZXIgZ3JhaW5lZCB0aGFuIHRoZSBvbmUKK2Jhc2VkIG9uIGZpbGVzeXN0ZW0gZ3JvdXAuCisKK0JvdGggc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQgYXJlIGZvcndhcmRlZCB0bworYGdpdC1zZW5kLXBhY2tgIG9uIHRoZSBvdGhlciBlbmQsIHNvIHlvdSBjYW4gc2ltcGx5IGBlY2hvYCBtZXNzYWdlcworZm9yIHRoZSB1c2VyLgorCitUaGUgZGVmYXVsdCAndXBkYXRlJyBob29rLCB3aGVuIGVuYWJsZWQtLWFuZCB3aXRoCitgaG9va3MuYWxsb3d1bmFubm90YXRlZGAgY29uZmlnIG9wdGlvbiB0dXJuZWQgb24tLXByZXZlbnRzCit1bmFubm90YXRlZCB0YWdzIHRvIGJlIHB1c2hlZC4KKworW1twb3N0LXJlY2VpdmVdXQorcG9zdC1yZWNlaXZlCistLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1yZWNlaXZlLXBhY2tgIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwKK3doaWNoIGhhcHBlbnMgd2hlbiBhIGBnaXQgcHVzaGAgaXMgZG9uZSBvbiBhIGxvY2FsIHJlcG9zaXRvcnkuCitJdCBleGVjdXRlcyBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgb25jZSBhZnRlciBhbGwgdGhlIHJlZnMgaGF2ZQorYmVlbiB1cGRhdGVkLgorCitUaGlzIGhvb2sgZXhlY3V0ZXMgb25jZSBmb3IgdGhlIHJlY2VpdmUgb3BlcmF0aW9uLiAgSXQgdGFrZXMgbm8KK2FyZ3VtZW50cywgYnV0IGdldHMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlCis8PHByZS1yZWNlaXZlLCdwcmUtcmVjZWl2ZSc+PgoraG9vayBkb2VzIG9uIGl0cyBzdGFuZGFyZCBpbnB1dC4KKworVGhpcyBob29rIGRvZXMgbm90IGFmZmVjdCB0aGUgb3V0Y29tZSBvZiBgZ2l0LXJlY2VpdmUtcGFja2AsIGFzIGl0CitpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlYWwgd29yayBpcyBkb25lLgorCitUaGlzIHN1cGVyc2VkZXMgdGhlIDw8cG9zdC11cGRhdGUsJ3Bvc3QtdXBkYXRlJz4+IGhvb2sgaW4gdGhhdCBpdCBnZXQncworYm90aCBvbGQgYW5kIG5ldyB2YWx1ZXMgb2YgYWxsIHRoZSByZWZzIGluIGFkZGl0aW9uIHRvIHRoZWlyCituYW1lcy4KKworQm90aCBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIG91dHB1dCBhcmUgZm9yd2FyZGVkIHRvCitgZ2l0LXNlbmQtcGFja2Agb24gdGhlIG90aGVyIGVuZCwgc28geW91IGNhbiBzaW1wbHkgYGVjaG9gIG1lc3NhZ2VzCitmb3IgdGhlIHVzZXIuCisKK1RoZSBkZWZhdWx0ICdwb3N0LXJlY2VpdmUnIGhvb2sgaXMgZW1wdHksIGJ1dCB0aGVyZSBpcworYSBzYW1wbGUgc2NyaXB0IGBwb3N0LXJlY2VpdmUtZW1haWxgIHByb3ZpZGVkIGluIHRoZSBgY29udHJpYi9ob29rc2AKK2RpcmVjdG9yeSBpbiBnaXQgZGlzdHJpYnV0aW9uLCB3aGljaCBpbXBsZW1lbnRzIHNlbmRpbmcgY29tbWl0CitlbWFpbHMuCisKK1tbcG9zdC11cGRhdGVdXQorcG9zdC11cGRhdGUKKy0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtcmVjZWl2ZS1wYWNrYCBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksCit3aGljaCBoYXBwZW5zIHdoZW4gYSBgZ2l0IHB1c2hgIGlzIGRvbmUgb24gYSBsb2NhbCByZXBvc2l0b3J5LgorSXQgZXhlY3V0ZXMgb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5IG9uY2UgYWZ0ZXIgYWxsIHRoZSByZWZzIGhhdmUKK2JlZW4gdXBkYXRlZC4KKworSXQgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycywgZWFjaCBvZiB3aGljaCBpcyB0aGUKK25hbWUgb2YgcmVmIHRoYXQgd2FzIGFjdHVhbGx5IHVwZGF0ZWQuCisKK1RoaXMgaG9vayBpcyBtZWFudCBwcmltYXJpbHkgZm9yIG5vdGlmaWNhdGlvbiwgYW5kIGNhbm5vdCBhZmZlY3QKK3RoZSBvdXRjb21lIG9mIGBnaXQtcmVjZWl2ZS1wYWNrYC4KKworVGhlICdwb3N0LXVwZGF0ZScgaG9vayBjYW4gdGVsbCB3aGF0IGFyZSB0aGUgaGVhZHMgdGhhdCB3ZXJlIHB1c2hlZCwKK2J1dCBpdCBkb2VzIG5vdCBrbm93IHdoYXQgdGhlaXIgb3JpZ2luYWwgYW5kIHVwZGF0ZWQgdmFsdWVzIGFyZSwKK3NvIGl0IGlzIGEgcG9vciBwbGFjZSB0byBkbyBsb2cgb2xkLi5uZXcuIFRoZQorPDxwb3N0LXJlY2VpdmUsJ3Bvc3QtcmVjZWl2ZSc+PiBob29rIGRvZXMgZ2V0IGJvdGggb3JpZ2luYWwgYW5kCit1cGRhdGVkIHZhbHVlcyBvZiB0aGUgcmVmcy4gWW91IG1pZ2h0IGNvbnNpZGVyIGl0IGluc3RlYWQgaWYgeW91IG5lZWQKK3RoZW0uCisKK1doZW4gZW5hYmxlZCwgdGhlIGRlZmF1bHQgJ3Bvc3QtdXBkYXRlJyBob29rIHJ1bnMKK2BnaXQtdXBkYXRlLXNlcnZlci1pbmZvYCB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IGR1bWIKK3RyYW5zcG9ydHMgKGUuZy4sIEhUVFApIHVwLXRvLWRhdGUuICBJZiB5b3UgYXJlIHB1Ymxpc2hpbmcKK2EgZ2l0IHJlcG9zaXRvcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIHZpYSBIVFRQLCB5b3Ugc2hvdWxkCitwcm9iYWJseSBlbmFibGUgdGhpcyBob29rLgorCitCb3RoIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IGFyZSBmb3J3YXJkZWQgdG8KK2BnaXQtc2VuZC1wYWNrYCBvbiB0aGUgb3RoZXIgZW5kLCBzbyB5b3UgY2FuIHNpbXBseSBgZWNob2AgbWVzc2FnZXMKK2ZvciB0aGUgdXNlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2ggYi9Eb2N1bWVudGF0aW9uL2hvd3RvLWluZGV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YWEzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvLWluZGV4LnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9zaAorCitjYXQgPDxcRU9GCitHSVQgSG93dG8gSW5kZXgKKz09PT09PT09PT09PT09PQorCitIZXJlIGlzIGEgY29sbGVjdGlvbiBvZiBtYWlsaW5nIGxpc3QgcG9zdGluZ3MgbWFkZSBieSB2YXJpb3VzCitwZW9wbGUgZGVzY3JpYmluZyBob3cgdGhleSB1c2UgZ2l0IGluIHRoZWlyIHdvcmtmbG93LgorCitFT0YKKworZm9yIHR4dAorZG8KKwl0aXRsZT1gZXhwciAiJHR4dCIgOiAnLiovXCguKlwpXC50eHQkJ2AKKwlmcm9tPWBzZWQgLW5lICcKKwkvXiQvcQorCS9eRnJvbTpbIAldL3sKKwkJcy8vLworCQlzL15bIAldKi8vCisJCXMvWyAJXSokLy8KKwkJcy9eL2J5IC8KKwkJcAorCX0KKwknICIkdHh0ImAKKworCWFic3RyYWN0PWBzZWQgLW5lICcKKwkvXkFic3RyYWN0OlsgCV0veworCQlzL15bXiAJXSovLworCQl4CisJCXMvLiovLworCQl4CisJCTogYWdhaW4KKwkJL15bIAldL3sKKwkJCXMvXlsgCV0qLy8KKwkJCUgKKwkJCW4KKwkJCWIgYWdhaW4KKwkJfQorCQl4CisJCXAKKwkJcQorCX0nICIkdHh0ImAKKworCWlmIGdyZXAgJ0NvbnRlbnQtdHlwZTogdGV4dC9hc2NpaWRvYycgPi9kZXYvbnVsbCAkdHh0CisJdGhlbgorCQlmaWxlPWBleHByICIkdHh0IiA6ICdcKC4qXClcLnR4dCQnYC5odG1sCisJZWxzZQorCQlmaWxlPSIkdHh0IgorCWZpCisKKwllY2hvICIqIGxpbms6JGZpbGVbJHRpdGxlXSAkZnJvbQorJGFic3RyYWN0CisKKyIKKworZG9uZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtYW5kLWVkaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtYW5kLWVkaXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1hbmQtZWRpdC50eHQKQEAgLTAsMCArMSw4MSBAQAorRGF0ZToJU2F0LCAxMyBBdWcgMjAwNSAyMjoxNjowMiAtMDcwMCAoUERUKQorRnJvbToJTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorVG86CVN0ZXZlIEZyZW5jaCA8c21mcmVuY2hAYXVzdGluLnJyLmNvbT4KK2NjOglnaXRAdmdlci5rZXJuZWwub3JnCitTdWJqZWN0OiBSZTogc2VuZGluZyBjaGFuZ2VzZXRzIGZyb20gdGhlIG1pZGRsZSBvZiBhIGdpdCB0cmVlCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBMaW51cyBkZW1vbnN0cmF0ZXMgaG93IGEgYnJva2VuIGNvbW1pdAorIGluIGEgc2VxdWVuY2Ugb2YgY29tbWl0cyBjYW4gYmUgcmVtb3ZlZCBieSByZXdpbmRpbmcgdGhlIGhlYWQgYW5kCisgcmVhcHBseWluZyBzZWxlY3RlZCBjaGFuZ2VzLgorCitPbiBTYXQsIDEzIEF1ZyAyMDA1LCBMaW51cyBUb3J2YWxkcyB3cm90ZToKKworPiBUaGF0J3MgY29ycmVjdC4gU2FtZSB0aGluZ3MgYXBwbHk6IHlvdSBjYW4gbW92ZSBhIHBhdGNoIG92ZXIsIGFuZCBjcmVhdGUgYSAKKz4gbmV3IG9uZSB3aXRoIGEgbW9kaWZpZWQgY29tbWVudCwgYnV0IGJhc2ljYWxseSB0aGUgX29sZF8gY29tbWl0IHdpbGwgYmUgCis+IGltbXV0YWJsZS4KKworTGV0IG1lIGNsYXJpZnkuCisKK1lvdSBjYW4gZW50aXJlbHkgX2Ryb3BfIG9sZCBicmFuY2hlcywgc28gY29tbWl0cyBtYXkgYmUgaW1tdXRhYmxlLCBidXQKK25vdGhpbmcgZm9yY2VzIHlvdSB0byBrZWVwIHRoZW0uIE9mIGNvdXJzZSwgd2hlbiB5b3UgZHJvcCBhIGNvbW1pdCwgeW91J2xsIAorYWx3YXlzIGVuZCB1cCBkcm9wcGluZyBhbGwgdGhlIGNvbW1pdHMgdGhhdCBkZXBlbmRlZCBvbiBpdCwgYW5kIGlmIHlvdSAKK2FjdHVhbGx5IGdvdCBzb21lYm9keSBlbHNlIHRvIHB1bGwgdGhhdCBjb21taXQgeW91IGNhbid0IGRyb3AgaXQgZnJvbSAKK190aGVpcl8gcmVwb3NpdG9yeSwgYnV0IHVuZG9pbmcgdGhpbmdzIGlzIG5vdCBpbXBvc3NpYmxlLgorCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91J3ZlIG1hZGUgYSBtZXNzIG9mIHRoaW5nczogeW91J3ZlIGNvbW1pdHRlZAordGhyZWUgY29tbWl0cyAib2xkLT5hLT5iLT5jIiwgYW5kIHlvdSBub3RpY2UgdGhhdCAiYSIgd2FzIGJyb2tlbiwgYnV0IHlvdQord2FudCB0byBzYXZlICJiIiBhbmQgImMiLiBXaGF0IHlvdSBjYW4gZG8gaXMKKworCSMgQ3JlYXRlIGEgYnJhbmNoICJicm9rZW4iIHRoYXQgaXMgdGhlIGN1cnJlbnQgY29kZQorCSMgZm9yIHJlZmVyZW5jZQorCWdpdCBicmFuY2ggYnJva2VuCisKKwkjIFJlc2V0IHRoZSBtYWluIGJyYW5jaCB0byB0aHJlZSBwYXJlbnRzIGJhY2s6IHRoaXMgCisJIyBlZmZlY3RpdmVseSB1bmRvZXMgdGhlIHRocmVlIHRvcCBjb21taXRzCisJZ2l0IHJlc2V0IEhFQUReXl4KKwlnaXQgY2hlY2tvdXQgLWYKKworCSMgQ2hlY2sgdGhlIHJlc3VsdCB2aXN1YWxseSB0byBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCdzCisJIyBnb2luZyBvbgorCWdpdGsgLS1hbGwKKworCSMgUmUtYXBwbHkgdGhlIHR3byB0b3Agb25lcyBmcm9tICJicm9rZW4iCisJIworCSMgRmlyc3QgInBhcmVudCBvZiBicm9rZW4iIChha2EgYik6CisJZ2l0LWRpZmYtdHJlZSAtcCBicm9rZW5eIHwgZ2l0LWFwcGx5IC0taW5kZXgKKwlnaXQgY29tbWl0IC0tcmVlZGl0PWJyb2tlbl4KKworCSMgVGhlbiAidG9wIG9mIGJyb2tlbiIgKGFrYSBjKToKKwlnaXQtZGlmZi10cmVlIC1wIGJyb2tlbiB8IGdpdC1hcHBseSAtLWluZGV4CisJZ2l0IGNvbW1pdCAtLXJlZWRpdD1icm9rZW4KKworYW5kIHlvdSd2ZSBub3cgcmUtYXBwbGllZCAoYW5kIHBvc3NpYmx5IGVkaXRlZCB0aGUgY29tbWVudHMpIHRoZSB0d28KK2NvbW1pdHMgYi9jLCBhbmQgY29tbWl0ICJhIiBpcyBiYXNpY2FsbHkgZ29uZSAoaXQgc3RpbGwgZXhpc3RzIGluIHRoZQorImJyb2tlbiIgYnJhbmNoLCBvZiBjb3Vyc2UpLgorCitGaW5hbGx5LCBjaGVjayBvdXQgdGhlIGVuZCByZXN1bHQgYWdhaW46CisKKwkjIExvb2sgYXQgdGhlIG5ldyBjb21taXQgaGlzdG9yeQorCWdpdGsgLS1hbGwKKwordG8gc2VlIHRoYXQgZXZlcnl0aGluZyBsb29rcyBzZW5zaWJsZS4KKworQW5kIHRoZW4sIHlvdSBjYW4ganVzdCByZW1vdmUgdGhlIGJyb2tlbiBicmFuY2ggaWYgeW91IGRlY2lkZSB5b3UgcmVhbGx5IAorZG9uJ3Qgd2FudCBpdDoKKworCSMgcmVtb3ZlICdicm9rZW4nIGJyYW5jaAorCWdpdCBicmFuY2ggLWQgYnJva2VuCisKKwkjIFBydW5lIG9sZCBvYmplY3RzIGlmIHlvdSdyZSByZWFsbHkgcmVhbGx5IHN1cmUKKwlnaXQgcHJ1bmUKKworQW5kIHllYWgsIEknbSBzdXJlIHRoZXJlIGFyZSBvdGhlciB3YXlzIG9mIGRvaW5nIHRoaXMuIEFuZCBhcyB1c3VhbCwgdGhlIAorYWJvdmUgaXMgdG90YWxseSB1bnRlc3RlZCwgYW5kIEkganVzdCB3cm90ZSBpdCBkb3duIGluIHRoaXMgZW1haWwsIHNvIGlmIAorSSd2ZSBkb25lIHNvbWV0aGluZyB3cm9uZywgeW91J2xsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBvbiB5b3VyIG93biA7KQorCisJCQlMaW51cworLQorVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGdpdCIgaW4KK3RoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCitNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYTVjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vcmViYXNlLWZyb20taW50ZXJuYWwtYnJhbmNoLnR4dApAQCAtMCwwICsxLDE2NSBAQAorRnJvbToJSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorVG86CWdpdEB2Z2VyLmtlcm5lbC5vcmcKK0NjOglQZXRyIEJhdWRpcyA8cGFza3lAc3VzZS5jej4sIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK1N1YmplY3Q6IFJlOiBzZW5kaW5nIGNoYW5nZXNldHMgZnJvbSB0aGUgbWlkZGxlIG9mIGEgZ2l0IHRyZWUKK0RhdGU6CVN1biwgMTQgQXVnIDIwMDUgMTg6Mzc6MzkgLTA3MDAKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIEpDIHRhbGtzIGFib3V0IGhvdyBoZSByZWJhc2VzIHRoZQorIHB1YmxpYyAicHUiIGJyYW5jaCB1c2luZyB0aGUgY29yZSBHSVQgdG9vbHMgd2hlbiBoZSB1cGRhdGVzCisgdGhlICJtYXN0ZXIiIGJyYW5jaCwgYW5kIGhvdyAicmViYXNlIiB3b3Jrcy4gIEFsc28gZGlzY3Vzc2VkCisgaXMgaG93IHRoaXMgYXBwbGllcyB0byBpbmRpdmlkdWFsIGRldmVsb3BlcnMgd2hvIHNlbmRzIHBhdGNoZXMKKyB1cHN0cmVhbS4KKworUGV0ciBCYXVkaXMgPHBhc2t5QHN1c2UuY3o+IHdyaXRlczoKKworPiBEZWFyIGRpYXJ5LCBvbiBTdW4sIEF1ZyAxNCwgMjAwNSBhdCAwOTo1NzoxM0FNIENFU1QsIEkgZ290IGEgbGV0dGVyCis+IHdoZXJlIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gdG9sZCBtZSB0aGF0Li4uCis+PiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IHdyaXRlczoKKz4+IAorPj4gPiBKdW5pbywgbWF5YmUgeW91IHdhbnQgdG8gdGFsayBhYm91dCBob3cgeW91IG1vdmUgcGF0Y2hlcyBmcm9tIHlvdXIgInB1IiAKKz4+ID4gYnJhbmNoIHRvIHRoZSByZWFsIGJyYW5jaGVzLgorPj4gCis+IEFjdHVhbGx5LCB3b3VsZG4ndCB0aGlzIGJlIGFsc28gcHJlY2lzZWx5IGZvciB3aGF0IFN0R0lUIGlzIGludGVuZGVkIHRvPworCitFeGFjdGx5IG15IGZlZWxpbmcuICBJIHdhcyBzb3J0IG9mIHdhaXRpbmcgZm9yIENhdGFsaW4gdG8gc3BlYWsKK3VwLiAgV2l0aCBpdHMgYmFzaW5nIHBoaWxvc29waGljYWwgYW5jZXN0cnkgb24gcXVpbHQsIHRoaXMgaXMKK3RoZSBraW5kIG9mIHRhc2sgU3RHSVQgaXMgZGVzaWduZWQgdG8gZG8uCisKK0kganVzdCBoYXZlIGRvbmUgYSBzaW1wbGVyIG9uZSwgdGhpcyB0aW1lIHVzaW5nIG9ubHkgdGhlIGNvcmUKK0dJVCB0b29scy4KKworSSBoYWQgYSBoYW5kZnVsIGNvbW1pdHMgdGhhdCB3ZXJlIGFoZWFkIG9mIG1hc3RlciBpbiBwdSwgYW5kIEkKK3dhbnRlZCB0byBhZGQgc29tZSBkb2N1bWVudGF0aW9uIGJ5cGFzc2luZyBteSB1c3VhbCBoYWJpdCBvZgorcGxhY2luZyBuZXcgdGhpbmdzIGluIHB1IGZpcnN0LiAgQXQgdGhlIGJlZ2lubmluZywgdGhlIGNvbW1pdAorYW5jZXN0cnkgZ3JhcGggbG9va2VkIGxpa2UgdGhpczoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgbWFzdGVyIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisKK1NvIEkgc3RhcnRlZCBmcm9tIG1hc3RlciwgbWFkZSBhIGJ1bmNoIG9mIGVkaXRzLCBhbmQgY29tbWl0dGVkOgorCisgICAgJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgJCBjZCBEb2N1bWVudGF0aW9uOyBlZCBnaXQudHh0IC4uLgorICAgICQgY2QgLi47IGdpdCBhZGQgRG9jdW1lbnRhdGlvbi8qLnR4dAorICAgICQgZ2l0IGNvbW1pdCAtcworCitBZnRlciB0aGUgY29tbWl0LCB0aGUgYW5jZXN0cnkgZ3JhcGggd291bGQgbG9vayBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoicHUiIGhlYWQKKyAgICBtYXN0ZXJeIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgICAgICAgXAorICAgICAgICAgICAgXC0tLT4gbWFzdGVyCisKK1RoZSBvbGQgbWFzdGVyIGlzIG5vdyBtYXN0ZXJeICh0aGUgZmlyc3QgcGFyZW50IG9mIHRoZSBtYXN0ZXIpLgorVGhlIG5ldyBtYXN0ZXIgY29tbWl0IGhvbGRzIG15IGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKworTm93IEkgaGF2ZSB0byBkZWFsIHdpdGggInB1IiBicmFuY2guCisKK1RoaXMgaXMgdGhlIGtpbmQgb2Ygc2l0dWF0aW9uIEkgdXNlZCB0byBoYXZlIGFsbCB0aGUgdGltZSB3aGVuCitMaW51cyB3YXMgdGhlIG1haW50YWluZXIgYW5kIEkgd2FzIGEgY29udHJpYnV0b3IsIHdoZW4geW91IGxvb2sKK2F0ICJtYXN0ZXIiIGJyYW5jaCBiZWluZyB0aGUgIm1haW50YWluZXIiIGJyYW5jaCwgYW5kICJwdSIKK2JyYW5jaCBiZWluZyB0aGUgImNvbnRyaWJ1dG9yIiBicmFuY2guICBZb3VyIHdvcmsgc3RhcnRlZCBhdCB0aGUKK3RpcCBvZiB0aGUgIm1haW50YWluZXIiIGJyYW5jaCBzb21lIHRpbWUgYWdvLCB5b3UgbWFkZSBhIGxvdCBvZgorcHJvZ3Jlc3MgaW4gdGhlIG1lYW50aW1lLCBhbmQgbm93IHRoZSBtYWludGFpbmVyIGJyYW5jaCBoYXMgc29tZQorb3RoZXIgY29tbWl0cyB5b3UgZG8gbm90IGhhdmUgeWV0LiAgQW5kICJnaXQgcmViYXNlIiB3YXMgd3JpdHRlbgord2l0aCB0aGUgZXhwbGljaXQgcHVycG9zZSBvZiBoZWxwaW5nIHRvIG1haW50YWluIGJyYW5jaGVzIGxpa2UKKyJwdSIuICBZb3UgX2NvdWxkXyBtZXJnZSBtYXN0ZXIgdG8gcHUgYW5kIGtlZXAgZ29pbmcsIGJ1dCBpZiB5b3UKK2V2ZW50dWFsbHkgd2FudCB0byBjaGVycnlwaWNrIGFuZCBtZXJnZSBzb21lIGJ1dCBub3QgbmVjZXNzYXJpbHkKK2FsbCBjaGFuZ2VzIGJhY2sgdG8gdGhlIG1hc3RlciBicmFuY2gsIGl0IG9mdGVuIG1ha2VzIGxhdGVyCitvcGVyYXRpb25zIGZvciBfeW91XyBlYXNpZXIgaWYgeW91IHJlYmFzZSAoaS5lLiBjYXJyeSBmb3J3YXJkCit5b3VyIGNoYW5nZXMpICJwdSIgcmF0aGVyIHRoYW4gbWVyZ2UuICBTbyBJIHJhbiAiZ2l0IHJlYmFzZSI6CisKKyAgICAkIGdpdCBjaGVja291dCBwdQorICAgICQgZ2l0IHJlYmFzZSBtYXN0ZXIgcHUKKworV2hhdCB0aGlzIGRvZXMgaXMgdG8gcGljayBhbGwgdGhlIGNvbW1pdHMgc2luY2UgdGhlIGN1cnJlbnQKK2JyYW5jaCAobm90ZSB0aGF0IEkgbm93IGFtIG9uICJwdSIgYnJhbmNoKSBmb3JrZWQgZnJvbSB0aGUKK21hc3RlciBicmFuY2gsIGFuZCBmb3J3YXJkIHBvcnQgdGhlc2UgY2hhbmdlcy4KKworICAgIG1hc3Rlcl4gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKyAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoicHUiIGhlYWQKKyAgICAgICAgICAgIFwtLS0+IG1hc3RlciAtLT4gIzEnIC0tPiAjMicgLS0+ICMzJworCitUaGUgZGlmZiBiZXR3ZWVuIG1hc3Rlcl4gYW5kICMxIGlzIGFwcGxpZWQgdG8gbWFzdGVyIGFuZAorY29tbWl0dGVkIHRvIGNyZWF0ZSAjMScgY29tbWl0IHdpdGggdGhlIGNvbW1pdCBpbmZvcm1hdGlvbiAobG9nLAorYXV0aG9yIGFuZCBkYXRlKSB0YWtlbiBmcm9tIGNvbW1pdCAjMS4gIE9uIHRvcCBvZiB0aGF0ICMyJyBhbmQgIzMnCitjb21taXRzIGFyZSBtYWRlIHNpbWlsYXJseSBvdXQgb2YgIzIgYW5kICMzIGNvbW1pdHMuCisKK09sZCAjMyBpcyBub3QgcmVjb3JkZWQgaW4gYW55IG9mIHRoZSAuZ2l0L3JlZnMvaGVhZHMvIGZpbGUKK2FueW1vcmUsIHNvIGFmdGVyIGRvaW5nIHRoaXMgeW91IHdpbGwgaGF2ZSBkYW5nbGluZyBjb21taXQgaWYKK3lvdSByYW4gZnNjay1jYWNoZSwgd2hpY2ggaXMgbm9ybWFsLiAgQWZ0ZXIgdGVzdGluZyAicHUiLCB5b3UKK2NhbiBydW4gImdpdCBwcnVuZSIgdG8gZ2V0IHJpZCBvZiB0aG9zZSBvcmlnaW5hbCB0aHJlZSBjb21taXRzLgorCitXaGlsZSBJIGFtIHRhbGtpbmcgYWJvdXQgImdpdCByZWJhc2UiLCBJIHNob3VsZCB0YWxrIGFib3V0IGhvdwordG8gZG8gY2hlcnJ5cGlja2luZyB1c2luZyBvbmx5IHRoZSBjb3JlIEdJVCB0b29scy4KKworTGV0J3MgZ28gYmFjayB0byB0aGUgZWFybGllciBwaWN0dXJlLCB3aXRoIGRpZmZlcmVudCBsYWJlbHMuCisKK1lvdSwgYXMgYW4gaW5kaXZpZHVhbCBkZXZlbG9wZXIsIGNsb25lZCB1cHN0cmVhbSByZXBvc2l0b3J5IGFuZAorbWFkZSBhIGNvdXBsZSBvZiBjb21taXRzIG9uIHRvcCBvZiBpdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnlvdXIgIm1hc3RlciIgaGVhZAorICAgdXBzdHJlYW0gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKworWW91IHdvdWxkIHdhbnQgY2hhbmdlcyAjMiBhbmQgIzMgaW5jb3Jwb3JhdGVkIGluIHRoZSB1cHN0cmVhbSwKK3doaWxlIHlvdSBmZWVsIHRoYXQgIzEgbWF5IG5lZWQgZnVydGhlciBpbXByb3ZlbWVudHMuICBTbyB5b3UKK3ByZXBhcmUgIzIgYW5kICMzIGZvciBlLW1haWwgc3VibWlzc2lvbi4KKworICAgICQgZ2l0IGZvcm1hdC1wYXRjaCBtYXN0ZXJeXiBtYXN0ZXIKKworVGhpcyBjcmVhdGVzIHR3byBmaWxlcywgMDAwMS1YWFhYLnBhdGNoIGFuZCAwMDAyLVhYWFgucGF0Y2guICBTZW5kCit0aGVtIG91dCAiVG86ICIgeW91ciBwcm9qZWN0IG1haW50YWluZXIgYW5kICJDYzogIiB5b3VyIG1haWxpbmcKK2xpc3QuICBZb3UgY291bGQgdXNlIGNvbnRyaWJ1dGVkIHNjcmlwdCBnaXQtc2VuZC1lbWFpbCBpZgoreW91ciBob3N0IGhhcyBuZWNlc3NhcnkgcGVybCBtb2R1bGVzIGZvciB0aGlzLCBidXQgeW91ciB1c3VhbAorTVVBIHdvdWxkIGRvIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QgY29ycnVwdCB3aGl0ZXNwYWNlcyBpbiB0aGUKK3BhdGNoLgorCitUaGVuIHlvdSB3b3VsZCB3YWl0LCBhbmQgeW91IGZpbmQgb3V0IHRoYXQgdGhlIHVwc3RyZWFtIHBpY2tlZAordXAgeW91ciBjaGFuZ2VzLCBhbG9uZyB3aXRoIG90aGVyIGNoYW5nZXMuCisKKyAgIHdoZXJlICAgICAgICAgICAgICAgICAgICAgICp5b3VyICJtYXN0ZXIiIGhlYWQKKyAgdXBzdHJlYW0gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKyAgICB1c2VkICAgXCAKKyAgIHRvIGJlICAgICBcLS0+ICNBIC0tPiAjMicgLS0+ICMzJyAtLT4gI0IgLS0+ICNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXBzdHJlYW0gaGVhZAorCitUaGUgdHdvIGNvbW1pdHMgIzInIGFuZCAjMycgaW4gdGhlIGFib3ZlIHBpY3R1cmUgcmVjb3JkIHRoZSBzYW1lCitjaGFuZ2VzIHlvdXIgZS1tYWlsIHN1Ym1pc3Npb24gZm9yICMyIGFuZCAjMyBjb250YWluZWQsIGJ1dAorcHJvYmFibHkgd2l0aCB0aGUgbmV3IHNpZ24tb2ZmIGxpbmUgYWRkZWQgYnkgdGhlIHVwc3RyZWFtCittYWludGFpbmVyIGFuZCBkZWZpbml0ZWx5IHdpdGggZGlmZmVyZW50IGNvbW1pdHRlciBhbmQgYW5jZXN0cnkKK2luZm9ybWF0aW9uLCB0aGV5IGFyZSBkaWZmZXJlbnQgb2JqZWN0cyBmcm9tICMyIGFuZCAjMyBjb21taXRzLgorCitZb3UgZmV0Y2ggZnJvbSB1cHN0cmVhbSwgYnV0IG5vdCBtZXJnZS4KKworICAgICQgZ2l0IGZldGNoIHVwc3RyZWFtCisKK1RoaXMgbGVhdmVzIHRoZSB1cGRhdGVkIHVwc3RyZWFtIGhlYWQgaW4gLmdpdC9GRVRDSF9IRUFEIGJ1dAorZG9lcyBub3QgdG91Y2ggeW91ciAuZ2l0L0hFQUQgbm9yIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIuICAKK1lvdSBydW4gImdpdCByZWJhc2UiIG5vdy4KKworICAgICQgZ2l0IHJlYmFzZSBGRVRDSF9IRUFEIG1hc3RlcgorCitFYXJsaWVyLCBJIHNhaWQgdGhhdCByZWJhc2UgYXBwbGllcyBhbGwgdGhlIGNvbW1pdHMgZnJvbSB5b3VyCiticmFuY2ggb24gdG9wIG9mIHRoZSB1cHN0cmVhbSBoZWFkLiAgV2VsbCwgSSBsaWVkLiAgImdpdCByZWJhc2UiCitpcyBhIGJpdCBzbWFydGVyIHRoYW4gdGhhdCBhbmQgbm90aWNlcyB0aGF0ICMyIGFuZCAjMyBuZWVkIG5vdAorYmUgYXBwbGllZCwgc28gaXQgb25seSBhcHBsaWVzICMxLiAgVGhlIGNvbW1pdCBhbmNlc3RyeSBncmFwaAorYmVjb21lcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICB3aGVyZSAgICAgICAgICAgICAgICAgICAgICp5b3VyIG9sZCAibWFzdGVyIiBoZWFkCisgIHVwc3RyZWFtIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgdXNlZCAgIFwgICAgICAgICAgICAgICAgICAgICAgeW91ciBuZXcgIm1hc3RlciIgaGVhZCoKKyAgIHRvIGJlICAgICBcLS0+ICNBIC0tPiAjMicgLS0+ICMzJyAtLT4gI0IgLS0+ICNDIC0tPiAjMScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZAorCitBZ2FpbiwgImdpdCBwcnVuZSIgd291bGQgZGlzY2FyZCB0aGUgZGlzdXNlZCBjb21taXRzICMxLSMzIGFuZAoreW91IGNvbnRpbnVlIG9uIHN0YXJ0aW5nIGZyb20gdGhlIG5ldyAibWFzdGVyIiBoZWFkLCB3aGljaCBpcwordGhlICMxJyBjb21taXQuCisKKy1qYworCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAorCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjYyMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJ1aWxkLWZyb20tdXBkYXRlLWhvb2sudHh0CkBAIC0wLDAgKzEsODcgQEAKK1N1YmplY3Q6IFtIT1dUT10gVXNpbmcgcG9zdC11cGRhdGUgaG9vaworTWVzc2FnZS1JRDogPDd2eTg2bzZ1c3guZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK0RhdGU6IEZyaSwgMjYgQXVnIDIwMDUgMTg6MTk6MTAgLTA3MDAKK0Fic3RyYWN0OiBJbiB0aGlzIGhvdy10byBhcnRpY2xlLCBKQyB0YWxrcyBhYm91dCBob3cgaGUKKyB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIHRvIGF1dG9tYXRlIGdpdCBkb2N1bWVudGF0aW9uIHBhZ2UKKyBzaG93biBhdCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8uCisKK1RoZSBwYWdlcyB1bmRlciBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KK2FyZSBidWlsdCBmcm9tIERvY3VtZW50YXRpb24vIGRpcmVjdG9yeSBvZiB0aGUgZ2l0LmdpdCBwcm9qZWN0CithbmQgbmVlZGVkIHRvIGJlIGtlcHQgdXAtdG8tZGF0ZS4gIFRoZSB3d3cua2VybmVsLm9yZy8gc2VydmVycworYXJlIG1pcnJvcmVkIGFuZCBJIHdhcyB0b2xkIHRoYXQgdGhlIG9yaWdpbiBvZiB0aGUgbWlycm9yIGlzIG9uCit0aGUgbWFjaGluZSAkc29tZS5rZXJuZWwub3JnLCBvbiB3aGljaCBJIHdhcyBnaXZlbiBhbiBhY2NvdW50Cit3aGVuIEkgdG9vayBvdmVyIGdpdCBtYWludGFpbmVyc2hpcCBmcm9tIExpbnVzLgorCitUaGUgZGlyZWN0b3JpZXMgcmVsZXZhbnQgdG8gdGhpcyBob3ctdG8gYXJlIHRoZXNlIHR3bzoKKworICAgIC9wdWIvc2NtL2dpdC9naXQuZ2l0LwlUaGUgcHVibGljIGdpdCByZXBvc2l0b3J5LgorICAgIC9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLwlUaGUgSFRNTCBkb2N1bWVudGF0aW9uIHBhZ2UuCisKK1NvIEkgbWFkZSBhIHJlcG9zaXRvcnkgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24gdW5kZXIgbXkKK2hvbWUgZGlyZWN0b3J5IG92ZXIgdGhlcmUuCisKKyAgICAkIGNkCisgICAgJCBta2RpciBkb2MtZ2l0ICYmIGNkIGRvYy1naXQKKyAgICAkIGdpdCBjbG9uZSAvcHViL3NjbS9naXQvZ2l0LmdpdC8gZG9jZ2VuCisKK1doYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRvIHVwZGF0ZSB0aGUgJEhPTUUvZG9jLWdpdC9kb2NnZW4vCit3b3JraW5nIHRyZWUsIGJ1aWxkIEhUTUwgZG9jcyB0aGVyZSBhbmQgaW5zdGFsbCB0aGUgcmVzdWx0IGluCisvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8gZGlyZWN0b3J5LiAgU28gSSB3cm90ZSBhIGxpdHRsZQorc2NyaXB0OgorCisgICAgJCBjYXQgPmRvZG9kb2Muc2ggPDxcRU9GCisgICAgIyEvYmluL3NoCisgICAgY2QgJEhPTUUvZG9jLWdpdC9kb2NnZW4gfHwgZXhpdAorCisgICAgdW5zZXQgR0lUX0RJUgorCisgICAgZ2l0IHB1bGwgL3B1Yi9zY20vZ2l0L2dpdC5naXQvIG1hc3RlciAmJgorICAgIGNkIERvY3VtZW50YXRpb24gJiYKKyAgICBtYWtlIGluc3RhbGwtd2ViZG9jCisgICAgRU9GCisKK0luaXRpYWxseSBJIHVzZWQgdG8gcnVuIHRoaXMgYnkgaGFuZCB3aGVuZXZlciBJIHB1c2ggaW50byB0aGUKK3B1YmxpYyBnaXQgcmVwb3NpdG9yeS4gIFRoZW4gSSBkaWQgYSBjcm9uIGpvYiB0aGF0IHJhbiB0d2ljZSBhCitkYXkuICBUaGUgY3VycmVudCByb3VuZCB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIG1lY2hhbmlzbSwKK2xpa2UgdGhpczoKKworICAgICQgY2F0ID4vcHViL3NjbS9naXQvZ2l0LmdpdC9ob29rcy9wb3N0LXVwZGF0ZSA8PFxFT0YKKyAgICAjIS9iaW4vc2gKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIHByZXBhcmUgYSBwYWNrZWQgcmVwb3NpdG9yeSBmb3IgdXNlIG92ZXIKKyAgICAjIGR1bWIgdHJhbnNwb3J0cy4KKyAgICAjCisgICAgIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlIGJ5ICJjaG1vZCAreCBwb3N0LXVwZGF0ZSIuCisKKyAgICBjYXNlICIgJCogIiBpbgorICAgIConIHJlZnMvaGVhZHMvbWFzdGVyICcqKQorICAgICAgICAgICAgZWNobyAkSE9NRS9kb2MtZ2l0L2RvZG9kb2Muc2ggfCBhdCBub3cKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGV4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworICAgIEVPRgorICAgICQgY2htb2QgK3ggL3B1Yi9zY20vZ2l0L2dpdC5naXQvaG9va3MvcG9zdC11cGRhdGUKKworVGhlcmUgYXJlIGZvdXIgdGhpbmdzIHdvcnRoIG1lbnRpb25pbmc6CisKKyAtIFRoZSB1cGRhdGUtaG9vayBpcyBydW4gYWZ0ZXIgdGhlIHJlcG9zaXRvcnkgYWNjZXB0cyBhICJnaXQKKyAgIHB1c2giLCB1bmRlciBteSB1c2VyIHByaXZpbGVnZS4gIEl0IGlzIGdpdmVuIHRoZSBmdWxsIG5hbWVzCisgICBvZiByZWZzIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQgYXMgYXJndW1lbnRzLiAgTXkgcG9zdC11cGRhdGUKKyAgIHJ1bnMgdGhlIGRvZG9kb2Muc2ggc2NyaXB0IG9ubHkgd2hlbiB0aGUgbWFzdGVyIGhlYWQgaXMKKyAgIHVwZGF0ZWQuCisKKyAtIFdoZW4gdXBkYXRlLWhvb2sgaXMgcnVuLCBHSVRfRElSIGlzIHNldCB0byAnLicgYnkgdGhlIGNhbGxpbmcKKyAgIHJlY2VpdmUtcGFjay4gIFRoaXMgaXMgaW5oZXJpdGVkIGJ5IHRoZSBkb2RvZG9jLnNoIHJ1biB2aWEKKyAgIHRoZSAiYXQiIGNvbW1hbmQsIGFuZCBuZWVkcyB0byBiZSB1bnNldDsgb3RoZXJ3aXNlLCAiZ2l0CisgICBwdWxsIiBpdCBkb2VzIGludG8gJEhPTUUvZG9jLWdpdC9kb2NnZW4vIHJlcG9zaXRvcnkgd291bGQgbm90CisgICB3b3JrIGNvcnJlY3RseS4KKworIC0gVGhlIHN0ZG91dCBvZiB1cGRhdGUgaG9vayBzY3JpcHQgaXMgbm90IGNvbm5lY3RlZCB0byBnaXQKKyAgIHB1c2g7IEkgcnVuIHRoZSBoZWF2eSBwYXJ0IG9mIHRoZSBjb21tYW5kIGluc2lkZSAiYXQiLCB0bworICAgcmVjZWl2ZSB0aGUgZXhlY3V0aW9uIHJlcG9ydCB2aWEgZS1tYWlsLgorCisgLSBUaGlzIGlzIHN0aWxsIGNydWRlIGFuZCBkb2VzIG5vdCBwcm90ZWN0IGFnYWluc3Qgc2ltdWx0YW5lb3VzCisgICBtYWtlIGludm9jYXRpb25zIHN0b21waW5nIG9uIGVhY2ggb3RoZXIuICBJIHdvdWxkIG5lZWQgdG8gYWRkCisgICBzb21lIGxvY2tpbmcgbWVjaGFuaXNtIGZvciB0aGlzLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmV2ZXJ0LWJyYW5jaC1yZWJhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGVjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dApAQCAtMCwwICsxLDE5MyBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorVG86IGdpdEB2Z2VyLmtlcm5lbC5vcmcKK1N1YmplY3Q6IFtIT1dUT10gUmV2ZXJ0aW5nIGFuIGV4aXN0aW5nIGNvbW1pdAorQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgSkMgZ2l2ZXMgYSBzbWFsbCByZWFsLWxpZmUgZXhhbXBsZSBvZiB1c2luZworICdnaXQgcmV2ZXJ0JyBjb21tYW5kLCBhbmQgdXNpbmcgYSB0ZW1wb3JhcnkgYnJhbmNoIGFuZCB0YWcgZm9yIHNhZmV0eQorIGFuZCBlYXNpZXIgc2FuaXR5IGNoZWNraW5nLgorRGF0ZTogTW9uLCAyOSBBdWcgMjAwNSAyMTozOTowMiAtMDcwMAorQ29udGVudC10eXBlOiB0ZXh0L2FzY2lpZG9jCitNZXNzYWdlLUlEOiA8N3ZvZTdnM3VvcC5mc2ZAYXNzaWduZWQtYnktZGhjcC5jb3gubmV0PgorCitSZXZlcnRpbmcgYW4gZXhpc3RpbmcgY29tbWl0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK09uZSBvZiB0aGUgY2hhbmdlcyBJIHB1bGxlZCBpbnRvIHRoZSAnbWFzdGVyJyBicmFuY2ggdHVybnMgb3V0IHRvCiticmVhayBidWlsZGluZyBHSVQgd2l0aCBHQ0MgMi45NS4gIFdoaWxlIHRoZXkgd2VyZSB3ZWxsIGludGVudGlvbmVkCitwb3J0YWJpbGl0eSBmaXhlcywga2VlcGluZyB0aGluZ3Mgd29ya2luZyB3aXRoIGdjYy0yLjk1IHdhcyBhbHNvCitpbXBvcnRhbnQuICBIZXJlIGlzIHdoYXQgSSBkaWQgdG8gcmV2ZXJ0IHRoZSBjaGFuZ2UgaW4gdGhlICdtYXN0ZXInCiticmFuY2ggYW5kIHRvIGFkanVzdCB0aGUgJ3B1JyBicmFuY2gsIHVzaW5nIGNvcmUgR0lUIHRvb2xzIGFuZAorYmFyZWJvbmUgUG9yY2VsYWluLgorCitGaXJzdCwgcHJlcGFyZSBhIHRocm93LWF3YXkgYnJhbmNoIGluIGNhc2UgSSBzY3JldyB0aGluZ3MgdXAuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgcmV2ZXJ0LWM5OSBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgSSBhbSBvbiB0aGUgJ3JldmVydC1jOTknIGJyYW5jaC4gIExldCdzIGZpZ3VyZSBvdXQgd2hpY2ggY29tbWl0IHRvCityZXZlcnQuICBJIGhhcHBlbiB0byBrbm93IHRoYXQgdGhlIHRvcCBvZiB0aGUgJ21hc3RlcicgYnJhbmNoIGlzIGEKK21lcmdlLCBhbmQgaXRzIHNlY29uZCBwYXJlbnQgKGkuZS4gZm9yZWlnbiBjb21taXQgSSBtZXJnZWQgZnJvbSkgaGFzCit0aGUgY2hhbmdlIEkgd291bGQgd2FudCB0byB1bmRvLiAgRnVydGhlciBJIGhhcHBlbiB0byBrbm93IHRoYXQgdGhhdAorbWVyZ2UgaW50cm9kdWNlZCA1IGNvbW1pdHMgb3Igc286CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTQgbWFzdGVyIG1hc3Rlcl4yIHwgaGVhZAorKiBbbWFzdGVyXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKyAhIFttYXN0ZXJeMl0gUmVwbGFjZSBDOTkgYXJyYXkgaW5pdGlhbGl6ZXJzIHdpdGggY29kZS4KKy0tCistICBbbWFzdGVyXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKyorIFttYXN0ZXJeMl0gUmVwbGFjZSBDOTkgYXJyYXkgaW5pdGlhbGl6ZXJzIHdpdGggY29kZS4KKyorIFttYXN0ZXJeMn4xXSBSZXBsYWNlIHVuc2V0ZW52KCkgYW5kIHNldGVudigpIHdpdGggb2xkZXIgcHV0ZW52KCkuCisqKyBbbWFzdGVyXjJ+Ml0gSW5jbHVkZSBzeXMvdGltZS5oIGluIGRhZW1vbi5jLgorKisgW21hc3Rlcl4yfjNdIEZpeCA/OiBzdGF0ZW1lbnRzLgorKisgW21hc3Rlcl4yfjRdIFJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4KKyogIFttYXN0ZXJ+MV0gdHV0b3JpYWwgbm90ZSBhYm91dCBnaXQgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICctLW1vcmU9NCcgYWJvdmUgbWVhbnMgImFmdGVyIHdlIHJlYWNoIHRoZSBtZXJnZSBiYXNlIG9mIHJlZnMsCitzaG93IHVudGlsIHdlIGRpc3BsYXkgZm91ciBtb3JlIGNvbW1vbiBjb21taXRzIi4gIFRoYXQgbGFzdCBjb21taXQKK3dvdWxkIGhhdmUgYmVlbiB3aGVyZSB0aGUgInBvcnRhYmxlIiBicmFuY2ggd2FzIGZvcmtlZCBmcm9tIHRoZSBtYWluCitnaXQuZ2l0IHJlcG9zaXRvcnksIHNvIHRoaXMgd291bGQgc2hvdyBldmVyeXRoaW5nIG9uIGJvdGggYnJhbmNoZXMKK3NpbmNlIHRoZW4uICBJIGp1c3QgbGltaXRlZCB0aGUgb3V0cHV0IHRvIHRoZSBmaXJzdCBoYW5kZnVsIHVzaW5nCisnaGVhZCcuCisKK05vdyBJIGtub3cgJ21hc3Rlcl4yfjQnIChwcm9ub3VuY2UgaXQgYXMgImZpbmQgdGhlIHNlY29uZCBwYXJlbnQgb2YKK3RoZSAnbWFzdGVyJywgYW5kIHRoZW4gZ28gZm91ciBnZW5lcmF0aW9ucyBiYWNrIGZvbGxvd2luZyB0aGUgZmlyc3QKK3BhcmVudCIpIGlzIHRoZSBvbmUgSSB3b3VsZCB3YW50IHRvIHJldmVydC4gIFNpbmNlIEkgYWxzbyB3YW50IHRvIHNheQord2h5IEkgYW0gcmV2ZXJ0aW5nIGl0LCB0aGUgJy1uJyBmbGFnIGlzIGdpdmVuIHRvICdnaXQgcmV2ZXJ0Jy4gIFRoaXMKK3ByZXZlbnRzIGl0IGZyb20gYWN0dWFsbHkgbWFraW5nIGEgY29tbWl0LCBhbmQgaW5zdGVhZCAnZ2l0IHJldmVydCcKK2xlYXZlcyB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGl0IHdhbnRlZCB0byB1c2UgaW4gJy5tc2cnIGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2ZXJ0IC1uIG1hc3Rlcl4yfjQKKyQgY2F0IC5tc2cKK1JldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKworVGhpcyByZXZlcnRzIDZjNWY5YmFhM2JjMGQ2M2UxNDFlMGFmYzIzMTEwMjA1Mzc5OTA1YTQgY29tbWl0LgorJCBnaXQgZGlmZiBIRUFEIDsjIHRvIG1ha2Ugc3VyZSB3aGF0IHdlIGFyZSByZXZlcnRpbmcgbWFrZXMgc2Vuc2UuCiskIG1ha2UgQ0M9Z2NjLTIuOTUgY2xlYW4gdGVzdCA7IyBtYWtlIHN1cmUgaXQgZml4ZWQgdGhlIGJyZWFrYWdlLgorJCBtYWtlIGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGRpZCBub3QgY2F1c2Ugb3RoZXIgYnJlYWthZ2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJldmVydGVkIGNoYW5nZSBtYWtlcyBzZW5zZSAoZnJvbSByZWFkaW5nIHRoZSAnZGlmZicgb3V0cHV0KSwgZG9lcworZml4IHRoZSBwcm9ibGVtIChmcm9tICdtYWtlIENDPWdjYy0yLjk1JyB0ZXN0KSwgYW5kIGRvZXMgbm90IGNhdXNlIG5ldworYnJlYWthZ2UgKGZyb20gdGhlIGxhc3QgJ21ha2UgdGVzdCcpLiAgSSdtIHJlYWR5IHRvIGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWEgLXMgOyMgcmVhZCAubXNnIGludG8gdGhlIGxvZywKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgZXhwbGFpbiB3aHkgSSBhbSByZXZlcnRpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSSBjb3VsZCBoYXZlIHNjcmV3ZWQgdXAgaW4gYW55IG9mIHRoZSBhYm92ZSBzdGVwcywgYnV0IGluIHRoZSB3b3JzdAorY2FzZSBJIGNvdWxkIGp1c3QgaGF2ZSBkb25lICdnaXQgY2hlY2tvdXQgbWFzdGVyJyB0byBzdGFydCBvdmVyLgorRm9ydHVuYXRlbHkgSSBkaWQgbm90IGhhdmUgdG87IHdoYXQgSSBoYXZlIGluIHRoZSBjdXJyZW50IGJyYW5jaAorJ3JldmVydC1jOTknIGlzIHdoYXQgSSB3YW50LiAgU28gbWVyZ2UgdGhhdCBiYWNrIGludG8gJ21hc3Rlcic6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBtZXJnZSByZXZlcnQtYzk5IDsjIHRoaXMgc2hvdWxkIGJlIGEgZmFzdCBmb3J3YXJkCitVcGRhdGluZyBmcm9tIDEwZDc4MWI5Y2FhNGY3MTQ5NWM3YjM0OTYzYmVmMTM3MjE2Zjg2YTggdG8gZTNhNjkzYy4uLgorIGNhY2hlLmggICAgICAgIHwgICAgOCArKysrLS0tLQorIGNvbW1pdC5jICAgICAgIHwgICAgMiArLQorIGxzLWZpbGVzLmMgICAgIHwgICAgMiArLQorIHJlY2VpdmUtcGFjay5jIHwgICAgMiArLQorIHNlcnZlci1pbmZvLmMgIHwgICAgMiArLQorIDUgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGlzIG5vIG5lZWQgdG8gcmVkbyB0aGUgdGVzdCBhdCB0aGlzIHBvaW50LiAgV2UgZmFzdCBmb3J3YXJkZWQKK2FuZCB3ZSBrbm93ICdtYXN0ZXInIG1hdGNoZXMgJ3JldmVydC1jOTknIGV4YWN0bHkuICBJbiBmYWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgbWFzdGVyLi5yZXZlcnQtYzk5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2F5cyBub3RoaW5nLgorCitUaGVuIHdlIHJlYmFzZSB0aGUgJ3B1JyBicmFuY2ggYXMgdXN1YWwuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgcHUKKyQgZ2l0IHRhZyBwdS1hbmNob3IgcHUKKyQgZ2l0IHJlYmFzZSBtYXN0ZXIKKyogQXBwbHlpbmc6IFJlZG8gInJldmVydCIgdXNpbmcgdGhyZWUtd2F5IG1lcmdlIG1hY2hpbmVyeS4KK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCisqIEFwcGx5aW5nOiBSZW1vdmUgZ2l0LWFwcGx5LXBhdGNoLXNjcmlwdC4KK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitTaW1wbGUgY2hlcnJ5LXBpY2sgZmFpbHM7IHRyeWluZyBBdXRvbWF0aWMgY2hlcnJ5LXBpY2suCitSZW1vdmluZyBEb2N1bWVudGF0aW9uL2dpdC1hcHBseS1wYXRjaC1zY3JpcHQudHh0CitSZW1vdmluZyBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0CitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCisqIEFwcGx5aW5nOiBEb2N1bWVudCAiZ2l0IGNoZXJyeS1waWNrIiBhbmQgImdpdCByZXZlcnQiCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogbWFpbGluZm8gYW5kIGFwcGx5bWJveCB1cGRhdGVzCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogU2hvdyBjb21taXRzIGluIHRvcG8gb3JkZXIgYW5kIG5hbWUgYWxsIGNvbW1pdHMuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogTW9yZSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0ZW1wb3JhcnkgdGFnICdwdS1hbmNob3InIGlzIG1lIGp1c3QgYmVpbmcgY2FyZWZ1bCwgaW4gY2FzZSAnZ2l0CityZWJhc2UnIHNjcmV3cyB1cC4gIEFmdGVyIHRoaXMsIEkgY2FuIGRvIHRoZXNlIGZvciBzYW5pdHkgY2hlY2s6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiBwdS1hbmNob3IuLnB1IDsjIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIG1hc3RlciBmaXguCiskIG1ha2UgQ0M9Z2NjLTIuOTUgY2xlYW4gdGVzdCA7IyBtYWtlIHN1cmUgaXQgZml4ZWQgdGhlIGJyZWFrYWdlLgorJCBtYWtlIGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGRpZCBub3QgY2F1c2Ugb3RoZXIgYnJlYWthZ2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXZlcnl0aGluZyBpcyBpbiB0aGUgZ29vZCBvcmRlci4gIEkgZG8gbm90IG5lZWQgdGhlIHRlbXBvcmFyeSBicmFuY2gKK25vciB0YWcgYW55bW9yZSwgc28gcmVtb3ZlIHRoZW06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBybSAtZiAuZ2l0L3JlZnMvdGFncy9wdS1hbmNob3IgCiskIGdpdCBicmFuY2ggLWQgcmV2ZXJ0LWM5OQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IHdhcyBhbiBlbWVyZ2VuY3kgZml4LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIG1lcmdlIGl0IGludG8gdGhlCisncmVsZWFzZSBjYW5kaWRhdGUnIGJyYW5jaCwgYWx0aG91Z2ggSSBleHBlY3QgdGhlIG5leHQgcmVsZWFzZSB3b3VsZAorYmUgc29tZSBkYXlzIG9mZjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCByYworJCBnaXQgcHVsbCAuIG1hc3RlcgorUGFja2luZyAwIG9iamVjdHMKK1VucGFja2luZyAwIG9iamVjdHMKKworKiBjb21taXR0aXNoOiBlM2E2OTNjLi4uCXJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorVHJ5aW5nIHRvIG1lcmdlIGUzYTY5M2MuLi4gaW50byA4YzFmNWYwLi4uIHVzaW5nIDEwZDc4MWIuLi4KK0NvbW1pdHRlZCBtZXJnZSA3ZmI5YjcyNjJhMWQxZTBhNDdiYmZkY2JiY2Y1MGNlMDYzNWQzZjhmCisgY2FjaGUuaCAgICAgICAgfCAgICA4ICsrKystLS0tCisgY29tbWl0LmMgICAgICAgfCAgICAyICstCisgbHMtZmlsZXMuYyAgICAgfCAgICAyICstCisgcmVjZWl2ZS1wYWNrLmMgfCAgICAyICstCisgc2VydmVyLWluZm8uYyAgfCAgICAyICstCisgNSBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kIHRoZSBmaW5hbCByZXBvc2l0b3J5IHN0YXR1cyBsb29rcyBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTEgbWFzdGVyIHB1IHJjCishIFttYXN0ZXJdIFJldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKyAhIFtwdV0gZ2l0LXJlcGFjazogQWRkIG9wdGlvbiB0byByZXBhY2sgYWxsIG9iamVjdHMuCisgICogW3JjXSBNZXJnZSByZWZzL2hlYWRzL21hc3RlciBmcm9tIC4KKy0tLQorICsgIFtwdV0gZ2l0LXJlcGFjazogQWRkIG9wdGlvbiB0byByZXBhY2sgYWxsIG9iamVjdHMuCisgKyAgW3B1fjFdIE1vcmUgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorICsgIFtwdX4yXSBTaG93IGNvbW1pdHMgaW4gdG9wbyBvcmRlciBhbmQgbmFtZSBhbGwgY29tbWl0cy4KKyArICBbcHV+M10gbWFpbGluZm8gYW5kIGFwcGx5bWJveCB1cGRhdGVzCisgKyAgW3B1fjRdIERvY3VtZW50ICJnaXQgY2hlcnJ5LXBpY2siIGFuZCAiZ2l0IHJldmVydCIKKyArICBbcHV+NV0gUmVtb3ZlIGdpdC1hcHBseS1wYXRjaC1zY3JpcHQuCisgKyAgW3B1fjZdIFJlZG8gInJldmVydCIgdXNpbmcgdGhyZWUtd2F5IG1lcmdlIG1hY2hpbmVyeS4KKyAgLSBbcmNdIE1lcmdlIHJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorKysqIFttYXN0ZXJdIFJldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKyAgLSBbcmN+MV0gTWVyZ2UgcmVmcy9oZWFkcy9tYXN0ZXIgZnJvbSAuCisuLi4gW21hc3Rlcn4xXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9zZXBhcmF0aW5nLXRvcGljLWJyYW5jaGVzLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vc2VwYXJhdGluZy10b3BpYy1icmFuY2hlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwZTJjOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vc2VwYXJhdGluZy10b3BpYy1icmFuY2hlcy50eHQKQEAgLTAsMCArMSw5MSBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorU3ViamVjdDogU2VwYXJhdGluZyB0b3BpYyBicmFuY2hlcworQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgSkMgZGVzY3JpYmVzIGhvdyB0byBzZXBhcmF0ZSB0b3BpYyBicmFuY2hlcy4KKworVGhpcyB0ZXh0IHdhcyBvcmlnaW5hbGx5IGEgZm9vdG5vdGUgdG8gYSBkaXNjdXNzaW9uIGFib3V0IHRoZQorYmVoYXZpb3VyIG9mIHRoZSBnaXQgZGlmZiBjb21tYW5kcy4KKworT2Z0ZW4gSSBmaW5kIG15c2VsZiBkb2luZyB0aGF0IFtydW5uaW5nIGRpZmYgYWdhaW5zdCBzb21ldGhpbmcgb3RoZXIKK3RoYW4gSEVBRF0gd2hpbGUgcmV3cml0aW5nIG1lc3N5IGRldmVsb3BtZW50IGhpc3RvcnkuICBGb3IgZXhhbXBsZSwgSQorc3RhcnQgZG9pbmcgc29tZSB3b3JrIHdpdGhvdXQga25vd2luZyBleGFjdGx5IHdoZXJlIGl0IGxlYWRzLCBhbmQgZW5kCit1cCB3aXRoIGEgaGlzdG9yeSBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICJtYXN0ZXIiCisgICAgICAgIG8tLS1vCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIiAKKyAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS1vCisKK0F0IHRoaXMgcG9pbnQsICJ0b3BpYyIgY29udGFpbnMgc29tZXRoaW5nIEkga25vdyBJIHdhbnQsIGJ1dCBpdAorY29udGFpbnMgdHdvIGNvbmNlcHRzIHRoYXQgdHVybmVkIG91dCB0byBiZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50LgorQW5kIG9mdGVuLCBvbmUgdG9waWMgY29tcG9uZW50IGlzIGxhcmdlciB0aGFuIHRoZSBvdGhlci4gIEl0IG1heQorY29udGFpbiBtb3JlIHRoYW4gdHdvIHRvcGljcy4KKworSW4gb3JkZXIgdG8gcmV3cml0ZSB0aGlzIG1lc3MgdG8gYmUgbW9yZSBtYW5hZ2VhYmxlLCBJIHdvdWxkIGZpcnN0IGRvCisiZGlmZiBtYXN0ZXIuLnRvcGljIiwgdG8gZXh0cmFjdCB0aGUgY2hhbmdlcyBpbnRvIGEgc2luZ2xlIHBhdGNoLCBzdGFydAorcGlja2luZyBwaWVjZXMgZnJvbSBpdCB0byBnZXQgbG9naWNhbGx5IHNlbGYtY29udGFpbmVkIHVuaXRzLCBhbmQKK3N0YXJ0IGJ1aWxkaW5nIG9uIHRvcCBvZiAibWFzdGVyIjoKKworICAgICAgICAkIGdpdCBkaWZmIG1hc3Rlci4udG9waWMgPlAuZGlmZgorICAgICAgICAkIGdpdCBjaGVja291dCAtYiB0b3BpY0EgbWFzdGVyCisgICAgICAgIC4uLiBwaWNrIGFuZCBhcHBseSBwaWVjZXMgZnJvbSBQLmRpZmYgdG8gYnVpbGQKKyAgICAgICAgLi4uIGNvbW1pdHMgb24gdG9waWNBIGJyYW5jaC4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgby0tLW8tLS1vCisgICAgICAgICAgICAgLyAgICAgICAgInRvcGljQSIKKyAgICAgICAgby0tLW8ibWFzdGVyIgorICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICJ0b3BpYyIgCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitCZWZvcmUgZG9pbmcgZWFjaCBjb21taXQgb24gInRvcGljQSIgSEVBRCwgSSBydW4gImRpZmYgSEVBRCIKK2JlZm9yZSB1cGRhdGUtaW5kZXggdGhlIGFmZmVjdGVkIHBhdGhzLCBvciAiZGlmZiAtLWNhY2hlZCBIRUFEIgorYWZ0ZXIuICBBbHNvIEkgd291bGQgcnVuICJkaWZmIC0tY2FjaGVkIG1hc3RlciIgdG8gbWFrZSBzdXJlCit0aGF0IHRoZSBjaGFuZ2VzIGFyZSBvbmx5IHRoZSBvbmVzIHJlbGF0ZWQgdG8gInRvcGljQSIuICBVc3VhbGx5CitJIGRvIHRoaXMgZm9yIHNtYWxsZXIgdG9waWNzIGZpcnN0LgorCitBZnRlciB0aGF0LCBJJ2QgZG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgb3JpZ2luYWwgInRvcGljIiwgYnV0Citmb3IgdGhhdCwgSSBkbyBub3Qgc3RhcnQgZnJvbSB0aGUgcGF0Y2hmaWxlIEkgZXh0cmFjdGVkIGJ5Citjb21wYXJpbmcgIm1hc3RlciIgYW5kICJ0b3BpYyIgSSB1c2VkIGluaXRpYWxseS4gIFN0aWxsIG9uCisidG9waWNBIiwgSSBleHRyYWN0ICJkaWZmIHRvcGljIiwgYW5kIHVzZSBpdCB0byByZWJ1aWxkIHRoZQorb3RoZXIgdG9waWM6CisKKyAgICAgICAgJCBnaXQgZGlmZiAtUiB0b3BpYyA+UC5kaWZmIDsjIC0tY2FjaGVkIGFsc28gd291bGQgd29yayBmaW5lCisgICAgICAgICQgZ2l0IGNoZWNrb3V0IC1iIHRvcGljQiBtYXN0ZXIKKyAgICAgICAgLi4uIHBpY2sgYW5kIGFwcGx5IHBpZWNlcyBmcm9tIFAuZGlmZiB0byBidWlsZAorICAgICAgICAuLi4gY29tbWl0cyBvbiB0b3BpY0IgYnJhbmNoLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3BpY0IiCisgICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tbworICAgICAgICAgICAgICAvCisgICAgICAgICAgICAgL28tLS1vLS0tbworICAgICAgICAgICAgfC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiIAorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworQWZ0ZXIgSSBhbSBkb25lLCBJJ2QgdHJ5IGEgcHJldGVuZC1tZXJnZSBiZXR3ZWVuICJ0b3BpY0EiIGFuZAorInRvcGljQiIgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIEkgaGF2ZSBub3QgbWlzc2VkIGFueXRoaW5nOgorCisgICAgICAgICQgZ2l0IHB1bGwgLiB0b3BpY0EgOyMgbWVyZ2UgaXQgaW50byBjdXJyZW50ICJ0b3BpY0IiCisgICAgICAgICQgZ2l0IGRpZmYgdG9waWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcGljQiIKKyAgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tKiAocHJldGVuZCBtZXJnZSkKKyAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAvCisgICAgICAgICAgICAgL28tLS1vLS0tby0tLS0tLS0tLS0nCisgICAgICAgICAgICB8LyAgICAgICAgInRvcGljQSIKKyAgICAgICAgby0tLW8ibWFzdGVyIgorICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICJ0b3BpYyIgCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitUaGUgbGFzdCBkaWZmIGJldHRlciBub3QgdG8gc2hvdyBhbnl0aGluZyBvdGhlciB0aGFuIGNsZWFudXBzCitmb3IgY3J1ZnRzLiAgVGhlbiBJIGNhbiBmaW5hbGx5IGNsZWFuIHRoaW5ncyB1cDoKKworICAgICAgICAkIGdpdCBicmFuY2ggLUQgdG9waWMKKyAgICAgICAgJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUReIDsjIG51a2UgcHJldGVuZCBtZXJnZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3BpY0IiCisgICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tbworICAgICAgICAgICAgICAvIAorICAgICAgICAgICAgIC9vLS0tby0tLW8KKyAgICAgICAgICAgIHwvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9zZXR1cC1naXQtc2VydmVyLW92ZXItaHR0cC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhZGMyMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0CkBAIC0wLDAgKzEsMjU2IEBACitGcm9tOiBSdXRnZXIgTmlqbHVuc2luZyA8cnV0Z2VyQG5vc3BhbS5jb20+CitTdWJqZWN0OiBTZXR0aW5nIHVwIGEgZ2l0IHJlcG9zaXRvcnkgd2hpY2ggY2FuIGJlIHB1c2hlZCBpbnRvIGFuZCBwdWxsZWQgZnJvbSBvdmVyIEhUVFAuCitEYXRlOiBUaHUsIDEwIEF1ZyAyMDA2IDIyOjAwOjI2ICswMjAwCisKK1NpbmNlIEFwYWNoZSBpcyBvbmUgb2YgdGhvc2UgcGFja2FnZXMgcGVvcGxlIGxpa2UgdG8gY29tcGlsZQordGhlbXNlbHZlcyB3aGlsZSBvdGhlcnMgcHJlZmVyIHRoZSBidXJlYXVjcmF0J3MgZHJlYW0gRGViaWFuLCBpdCBpcworaW1wb3NzaWJsZSB0byBnaXZlIGd1aWRlbGluZXMgd2hpY2ggd2lsbCB3b3JrIGZvciBldmVyeW9uZS4gSnVzdCBzZW5kCitzb21lIGZlZWRiYWNrIHRvIHRoZSBtYWlsaW5nIGxpc3QgYXQgZ2l0QHZnZXIua2VybmVsLm9yZyB0byBnZXQgdGhpcworZG9jdW1lbnQgdGFpbG9yZWQgdG8geW91ciBmYXZvcml0ZSBkaXN0cm8uCisKKworV2hhdCdzIG5lZWRlZDoKKworLSBIYXZlIGFuIEFwYWNoZSB3ZWItc2VydmVyCisKKyAgT24gRGViaWFuOgorICAgICQgYXB0LWdldCBpbnN0YWxsIGFwYWNoZTIKKyAgICBUbyBnZXQgYXBhY2hlMiBieSBkZWZhdWx0IHN0YXJ0ZWQsCisgICAgZWRpdCAvZXRjL2RlZmF1bHQvYXBhY2hlMiBhbmQgc2V0IE5PX1NUQVJUPTAKKworLSBjYW4gZWRpdCB0aGUgY29uZmlndXJhdGlvbiBvZiBpdC4KKworICBUaGlzIGNvdWxkIGJlIGZvdW5kIHVuZGVyIC9ldGMvaHR0cGQsIG9yIHJlZmVyIHRvIHlvdXIgQXBhY2hlIGRvY3VtZW50YXRpb24uCisKKyAgT24gRGViaWFuOiB0aGlzIG1lYW5zIGJlaW5nIGFibGUgdG8gZWRpdCBmaWxlcyB1bmRlciAvZXRjL2FwYWNoZTIKKworLSBjYW4gcmVzdGFydCBpdC4KKworICAnYXBhY2hlY3RsIC0tZ3JhY2VmdWwnIG1pZ2h0IGRvLiBJZiBpdCBkb2Vzbid0LCBqdXN0IHN0b3AgYW5kCisgIHJlc3RhcnQgYXBhY2hlLiBCZSB3YXJuaW5nIHRoYXQgYWN0aXZlIGNvbm5lY3Rpb25zIHRvIHlvdXIgc2VydmVyCisgIG1pZ2h0IGJlIGFib3J0ZWQgYnkgdGhpcy4KKworICBPbiBEZWJpYW46CisgICAgJCAvZXRjL2luaXQuZC9hcGFjaGUyIHJlc3RhcnQKKyAgb3IKKyAgICAkIC9ldGMvaW5pdC5kL2FwYWNoZTIgZm9yY2UtcmVsb2FkCisgICAgKHdoaWNoIHNlZW1zIHRvIGRvIHRoZSBzYW1lKQorICBUaGlzIGFkZHMgc3ltbGlua3MgZnJvbSB0aGUgL2V0Yy9hcGFjaGUyL21vZHMtZW5hYmxlZCB0bworICAvZXRjL2FwYWNoZTIvbW9kcy1hdmFpbGFibGUuCisKKy0gaGF2ZSBwZXJtaXNzaW9ucyB0byBjaG93biBhIGRpcmVjdG9yeQorCistIGhhdmUgZ2l0IGluc3RhbGxlZCBhdCB0aGUgc2VydmVyIF9hbmRfIGNsaWVudAorCitJbiBlZmZlY3QsIHRoaXMgcHJvYmFibHkgbWVhbnMgeW91J3JlIGdvaW5nIHRvIGJlIHJvb3QuCisKKworU3RlcCAxOiBzZXR1cCBhIGJhcmUgR0lUIHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIGdpdC1odHRwLXB1c2ggY2Fubm90IHJlbW90ZWx5IGNyZWF0ZSBhIEdJVAorcmVwb3NpdG9yeS4gU28gd2UgaGF2ZSB0byBkbyB0aGF0IGF0IHRoZSBzZXJ2ZXIgc2lkZSB3aXRoIGdpdC4gQW5vdGhlcgorb3B0aW9uIHdvdWxkIGJlIHRvIGdlbmVyYXRlIGFuIGVtcHR5IHJlcG9zaXRvcnkgYXQgdGhlIGNsaWVudCBhbmQgY29weQoraXQgdG8gdGhlIHNlcnZlciB3aXRoIFdlYkRBVi4gQnV0IHRoZW4geW91J3JlIHByb2JhYmx5IHRoZSBmaXJzdCB0bwordHJ5IHRoYXQgb3V0IDopCisKK0NyZWF0ZSB0aGUgZGlyZWN0b3J5IHVuZGVyIHRoZSBEb2N1bWVudFJvb3Qgb2YgdGhlIGRpcmVjdG9yaWVzIHNlcnZlZAorYnkgQXBhY2hlLiBBcyBhbiBleGFtcGxlIHdlIHRha2UgL3Vzci9sb2NhbC9hcGFjaGUyLCBidXQgdHJ5ICJncmVwCitEb2N1bWVudFJvb3QgL3doZXJlL2V2ZXIvaHR0cGQuY29uZiIgdG8gZmluZCB5b3VyIHJvb3Q6CisKKyAgICAkIGNkIC91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcworICAgICQgbWtkaXIgbXktbmV3LXJlcG8uZ2l0CisKKyAgT24gRGViaWFuOgorCisgICAgJCBjZCAvdmFyL3d3dworICAgICQgbWtkaXIgbXktbmV3LXJlcG8uZ2l0CisKKworSW5pdGlhbGl6ZSBhIGJhcmUgcmVwb3NpdG9yeQorCisgICAgJCBjZCBteS1uZXctcmVwby5naXQKKyAgICAkIGdpdCAtLWJhcmUgaW5pdAorCisKK0NoYW5nZSB0aGUgb3duZXJzaGlwIHRvIHlvdXIgd2ViLXNlcnZlcidzIGNyZWRlbnRpYWxzLiBVc2UgImdyZXAgXlVzZXIKK2h0dHBkLmNvbmYiIGFuZCAiZ3JlcCBeR3JvdXAgaHR0cGQuY29uZiIgdG8gZmluZCBvdXQ6CisKKyAgICAkIGNob3duIC1SIHd3dy53d3cgLgorCisgIE9uIERlYmlhbjoKKworICAgICQgY2hvd24gLVIgd3d3LWRhdGEud3d3LWRhdGEgLgorCisKK0lmIHlvdSBkbyBub3Qga25vdyB3aGljaCB1c2VyIEFwYWNoZSBydW5zIGFzLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgZG8KK2EgImNobW9kIC1SIGErdyAuIiwgaW5zcGVjdCB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgbGF0ZXIgb24sIGFuZAorc2V0IHRoZSBwZXJtaXNzaW9ucyBhcHByb3ByaWF0ZWx5LgorCitSZXN0YXJ0IGFwYWNoZTIsIGFuZCBjaGVjayB3aGV0aGVyIGh0dHA6Ly9zZXJ2ZXIvbXktbmV3LXJlcG8uZ2l0IGdpdmVzCithIGRpcmVjdG9yeSBsaXN0aW5nLiBJZiBub3QsIGNoZWNrIHdoZXRoZXIgYXBhY2hlIHN0YXJ0ZWQgdXAKK3N1Y2Nlc3NmdWxseS4KKworCitTdGVwIDI6IGVuYWJsZSBEQVYgb24gdGhpcyByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0IG1ha2Ugc3VyZSB0aGUgZGF2X21vZHVsZSBpcyBsb2FkZWQuIEZvciB0aGlzLCBpbnNlcnQgaW4gaHR0cGQuY29uZjoKKworICAgIExvYWRNb2R1bGUgZGF2X21vZHVsZSBsaWJleGVjL2h0dHBkL2xpYmRhdi5zbworICAgIEFkZE1vZHVsZSBtb2RfZGF2LmMKKworQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGlzIGxpbmUgZXhpc3RzIHdoaWNoIGlzIHRoZSBmaWxlIHVzZWQgZm9yCitsb2NraW5nIERBViBvcGVyYXRpb25zOgorCisgIERBVkxvY2tEQiAiL3Vzci9sb2NhbC9hcGFjaGUyL3RlbXAvREFWLmxvY2siCisKKyAgT24gRGViaWFuIHRoZXNlIHN0ZXBzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aDoKKworICAgIEVuYWJsZSB0aGUgZGF2IGFuZCBkYXZfZnMgbW9kdWxlcyBvZiBhcGFjaGU6CisgICAgJCBhMmVubW9kIGRhdl9mcworICAgIChqdXN0IHRvIGJlIHN1cmUuIGRhdl9mcyBtaWdodCBiZSB1bm5lZWRlZCwgSSBkb24ndCBrbm93KQorICAgICQgYTJlbm1vZCBkYXYKKyAgICBUaGUgREFWIGxvY2sgaXMgbG9jYXRlZCBpbiAvZXRjL2FwYWNoZTIvbW9kcy1hdmFpbGFibGUvZGF2X2ZzLmNvbmY6CisgICAgICBEQVZMb2NrREIgL3Zhci9sb2NrL2FwYWNoZTIvREFWTG9jaworCitPZiBjb3Vyc2UsIGl0IGNhbiBwb2ludCBzb21ld2hlcmUgZWxzZSwgYnV0IHRoZSBzdHJpbmcgaXMgYWN0dWFsbHkganVzdCBhCitwcmVmaXggaW4gc29tZSBBcGFjaGUgY29uZmlndXJhdGlvbnMsIGFuZCB0aGVyZWZvcmUgdGhlIF9kaXJlY3RvcnlfIGhhcyB0bworYmUgd3JpdGFibGUgYnkgdGhlIHVzZXIgQXBhY2hlIHJ1bnMgYXMuCisKK1RoZW4sIGFkZCBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHlvdXIgaHR0cGQuY29uZgorCisgIDxMb2NhdGlvbiAvbXktbmV3LXJlcG8uZ2l0PgorICAgICBEQVYgb24KKyAgICAgQXV0aFR5cGUgQmFzaWMKKyAgICAgQXV0aE5hbWUgIkdpdCIKKyAgICAgQXV0aFVzZXJGaWxlIC91c3IvbG9jYWwvYXBhY2hlMi9jb25mL3Bhc3N3ZC5naXQKKyAgICAgUmVxdWlyZSB2YWxpZC11c2VyCisgIDwvTG9jYXRpb24+CisKKyAgT24gRGViaWFuOgorICAgIENyZWF0ZSAob3IgYWRkIHRvKSAvZXRjL2FwYWNoZTIvY29uZi5kL2dpdC5jb25mIDoKKworICAgIDxMb2NhdGlvbiAvbXktbmV3LXJlcG8uZ2l0PgorICAgICAgIERBViBvbgorICAgICAgIEF1dGhUeXBlIEJhc2ljCisgICAgICAgQXV0aE5hbWUgIkdpdCIKKyAgICAgICBBdXRoVXNlckZpbGUgL2V0Yy9hcGFjaGUyL3Bhc3N3ZC5naXQKKyAgICAgICBSZXF1aXJlIHZhbGlkLXVzZXIKKyAgICA8L0xvY2F0aW9uPgorCisgICAgRGViaWFuIGF1dG9tYXRpY2FsbHkgcmVhZHMgYWxsIGZpbGVzIHVuZGVyIC9ldGMvYXBhY2gyL2NvbmYuZC4KKworVGhlIHBhc3N3b3JkIGZpbGUgY2FuIGJlIHNvbWV3aGVyZSBlbHNlLCBidXQgaXQgaGFzIHRvIGJlIHJlYWRhYmxlIGJ5CitBcGFjaGUgYW5kIHByZWZlcmFibHkgbm90IHJlYWRhYmxlIGJ5IHRoZSB3b3JsZC4KKworQ3JlYXRlIHRoaXMgZmlsZSBieQorICAgICQgaHRwYXNzd2QgLWMgL3Vzci9sb2NhbC9hcGFjaGUyL2NvbmYvcGFzc3dkLmdpdCA8dXNlcj4KKworICAgIE9uIERlYmlhbjoKKyAgICAgICQgaHRwYXNzd2QgLWMgL2V0Yy9hcGFjaGUyL3Bhc3N3ZC5naXQgPHVzZXI+CisKK1lvdSB3aWxsIGJlIGFza2VkIGEgcGFzc3dvcmQsIGFuZCB0aGUgZmlsZSBpcyBjcmVhdGVkLiBTdWJzZXF1ZW50IGNhbGxzCit0byBodHBhc3N3ZCBzaG91bGQgb21pdCB0aGUgJy1jJyBvcHRpb24sIHNpbmNlIHlvdSB3YW50IHRvIGFwcGVuZCB0byB0aGUKK2V4aXN0aW5nIGZpbGUuCisKK1lvdSBuZWVkIHRvIHJlc3RhcnQgQXBhY2hlLgorCitOb3cgZ28gdG8gaHR0cDovLzx1c2VybmFtZT5APHNlcnZlcm5hbWU+L215LW5ldy1yZXBvLmdpdCBpbiB5b3VyCiticm93c2VyIHRvIGNoZWNrIHdoZXRoZXIgaXQgYXNrcyBmb3IgYSBwYXNzd29yZCBhbmQgYWNjZXB0cyB0aGUgcmlnaHQKK3Bhc3N3b3JkLgorCitPbiBEZWJpYW46CisKKyAgIFRvIHRlc3QgdGhlIFdlYkRBViBwYXJ0LCBkbzoKKworICAgJCBhcHQtZ2V0IGluc3RhbGwgbGl0bXVzCisgICAkIGxpdG11cyBodHRwOi8vPHNlcnZlcm5hbWU+L215LW5ldy1yZXBvLmdpdCA8dXNlcm5hbWU+IDxwYXNzd29yZD4KKworICAgTW9zdCB0ZXN0cyBzaG91bGQgcGFzcy4KKworQSBjb21tYW5kIGxpbmUgdG9vbCB0byB0ZXN0IFdlYkRBViBpcyBjYWRhdmVyLgorCitJZiB5b3UncmUgaW50byBXaW5kb3dzLCBmcm9tIFhQIG9ud2FyZHMgSW50ZXJuZXQgRXhwbG9yZXIgc3VwcG9ydHMKK1dlYkRBVi4gRm9yIHRoaXMsIGRvIEludGVybmV0IEV4cGxvcmVyIC0+IE9wZW4gTG9jYXRpb24gLT4KK2h0dHA6Ly88c2VydmVybmFtZT4vbXktbmV3LXJlcG8uZ2l0IFt4XSBPcGVuIGFzIHdlYmZvbGRlciAtPiBsb2dpbiAuCisKKworU3RlcCAzOiBzZXR1cCB0aGUgY2xpZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgSFRUUCBzdXBwb3J0LCBpLmUuIHlvdXIgZ2l0IHdhcyBidWlsdCB3aXRoIGN1cmwuCitUaGUgZWFzaWVzdCB3YXkgdG8gY2hlY2sgaXMgdG8gbG9vayBmb3IgdGhlIGV4ZWN1dGFibGUgJ2dpdC1odHRwLXB1c2gnLgorCitUaGVuLCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyICRIT01FLy5uZXRyYyAoeW91IGNhbiBkbyB3aXRob3V0LCBidXQgd2lsbCBiZQorYXNrZWQgdG8gaW5wdXQgeW91ciBwYXNzd29yZCBhIF9sb3RfIG9mIHRpbWVzKToKKworICAgIG1hY2hpbmUgPHNlcnZlcm5hbWU+CisgICAgbG9naW4gPHVzZXJuYW1lPgorICAgIHBhc3N3b3JkIDxwYXNzd29yZD4KKworLi4uYW5kIHNldCBwZXJtaXNzaW9uczoKKyAgICAgY2htb2QgNjAwIH4vLm5ldHJjCisKK0lmIHlvdSB3YW50IHRvIGFjY2VzcyB0aGUgd2ViLXNlcnZlciBieSBpdHMgSVAsIHlvdSBoYXZlIHRvIHR5cGUgdGhhdCBpbiwKK2luc3RlYWQgb2YgdGhlIHNlcnZlciBuYW1lLgorCitUbyBjaGVjayB3aGV0aGVyIGFsbCBpcyBPSywgZG86CisKKyAgIGN1cmwgLS1uZXRyYyAtLWxvY2F0aW9uIC12IGh0dHA6Ly88dXNlcm5hbWU+QDxzZXJ2ZXJuYW1lPi9teS1uZXctcmVwby5naXQvCisKKy4uLnRoaXMgc2hvdWxkIGdpdmUgYSBkaXJlY3RvcnkgbGlzdGluZyBpbiBIVE1MIG9mIC92YXIvd3d3L215LW5ldy1yZXBvLmdpdCAuCisKKworTm93LCBhZGQgdGhlIHJlbW90ZSBpbiB5b3VyIGV4aXN0aW5nIHJlcG9zaXRvcnkgd2hpY2ggY29udGFpbnMgdGhlIHByb2plY3QKK3lvdSB3YW50IHRvIGV4cG9ydDoKKworICAgJCBnaXQtY29uZmlnIHJlbW90ZS51cGxvYWQudXJsIFwKKyAgICAgICBodHRwOi8vPHVzZXJuYW1lPkA8c2VydmVybmFtZT4vbXktbmV3LXJlcG8uZ2l0LworCitJdCBpcyBpbXBvcnRhbnQgdG8gcHV0IHRoZSBsYXN0ICcvJzsgV2l0aG91dCBpdCwgdGhlIHNlcnZlciB3aWxsIHNlbmQKK2EgcmVkaXJlY3Qgd2hpY2ggZ2l0LWh0dHAtcHVzaCBkb2VzIG5vdCAoeWV0KSB1bmRlcnN0YW5kLCBhbmQgZ2l0LWh0dHAtcHVzaAord2lsbCByZXBlYXQgdGhlIHJlcXVlc3QgaW5maW5pdGVseS4KKworCitTdGVwIDQ6IG1ha2UgdGhlIGluaXRpYWwgcHVzaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSB5b3VyIGNsaWVudCByZXBvc2l0b3J5LCBkbworCisgICAkIGdpdCBwdXNoIHVwbG9hZCBtYXN0ZXIKKworVGhpcyBwdXNoZXMgYnJhbmNoICdtYXN0ZXInICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBicmFuY2ggeW91Cit3YW50IHRvIGV4cG9ydCkgdG8gcmVwb3NpdG9yeSBjYWxsZWQgJ3VwbG9hZCcsIHdoaWNoIHdlIHByZXZpb3VzbHkKK2RlZmluZWQgd2l0aCBnaXQtY29uZmlnLgorCisKK1Ryb3VibGVzaG9vdGluZzoKKy0tLS0tLS0tLS0tLS0tLS0KKworSWYgZ2l0LWh0dHAtcHVzaCBzYXlzCisKKyAgIEVycm9yOiBubyBEQVYgbG9ja2luZyBzdXBwb3J0IG9uIHJlbW90ZSByZXBvIGh0dHA6Ly8uLi4KKwordGhlbiBpdCBtZWFucyB0aGUgd2ViLXNlcnZlciBkaWQgbm90IGFjY2VwdCB5b3VyIGF1dGhlbnRpY2F0aW9uLiBNYWtlIHN1cmUKK3RoYXQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgbWF0Y2hlcyBpbiBodHRwZC5jb25mLCAubmV0cmMgYW5kIHRoZSBVUkwKK3lvdSBhcmUgdXBsb2FkaW5nIHRvLgorCitJZiBnaXQtaHR0cC1wdXNoIHNob3dzIHlvdSBhbiBlcnJvciAoMjIvNTAyKSB3aGVuIHRyeWluZyB0byBNT1ZFIGEgYmxvYiwKK2l0IG1lYW5zIHRoYXQgeW91ciB3ZWItc2VydmVyIHNvbWVob3cgZG9lcyBub3QgcmVjb2duaXplIGl0cyBuYW1lIGluIHRoZQorcmVxdWVzdDsgVGhpcyBjYW4gaGFwcGVuIHdoZW4geW91IHN0YXJ0IEFwYWNoZSwgYnV0IHRoZW4gZGlzYWJsZSB0aGUKK25ldHdvcmsgaW50ZXJmYWNlLiBBIHNpbXBsZSByZXN0YXJ0IG9mIEFwYWNoZSBoZWxwcy4KKworRXJyb3JzIGxpa2UgKDIyLzUwMikgYXJlIG9mIGZvcm1hdCAoY3VybCBlcnJvciBjb2RlL2h0dHAgZXJyb3IKK2NvZGUpLiBTbyAoMjIvNDA0KSBtZWFucyBzb21ldGhpbmcgbGlrZSAnbm90IGZvdW5kJyBhdCB0aGUgc2VydmVyLgorCitSZWFkaW5nIC91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yX2xvZyBpcyBvZnRlbiBoZWxwZnVsLgorCisgIE9uIERlYmlhbjogUmVhZCAvdmFyL2xvZy9hcGFjaGUyL2Vycm9yLmxvZyBpbnN0ZWFkLgorCisKK0RlYmlhbiBSZWZlcmVuY2VzOiBodHRwOi8vd3d3LmRlYmlhbi1hZG1pbmlzdHJhdGlvbi5vcmcvYXJ0aWNsZXMvMjg1CisKK0F1dGhvcnMKKyAgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisgIFJ1dGdlciBOaWpsdW5zaW5nIDxnaXRAd2luZ2RpbmcuZGVtb24ubmw+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3VwZGF0ZS1ob29rLWV4YW1wbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTMzNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dApAQCAtMCwwICsxLDE3MiBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PiBhbmQgQ2FybCBCYWxkd2luIDxjbmJAZmMuaHAuY29tPgorU3ViamVjdDogY29udHJvbCBhY2Nlc3MgdG8gYnJhbmNoZXMuCitEYXRlOiBUaHUsIDE3IE5vdiAyMDA1IDIzOjU1OjMyIC0wODAwCitNZXNzYWdlLUlEOiA8N3ZmeXB1bWx1My5mc2ZAYXNzaWduZWQtYnktZGhjcC5jb3gubmV0PgorQWJzdHJhY3Q6IEFuIGV4YW1wbGUgaG9va3MvdXBkYXRlIHNjcmlwdCBpcyBwcmVzZW50ZWQgdG8KKyBpbXBsZW1lbnQgcmVwb3NpdG9yeSBtYWludGVuYW5jZSBwb2xpY2llcywgc3VjaCBhcyB3aG8gY2FuIHB1c2gKKyBpbnRvIHdoaWNoIGJyYW5jaCBhbmQgd2hvIGNhbiBtYWtlIGEgdGFnLgorCitXaGVuIHlvdXIgZGV2ZWxvcGVyIHJ1bnMgZ2l0LXB1c2ggaW50byB0aGUgcmVwb3NpdG9yeSwKK2dpdC1yZWNlaXZlLXBhY2sgaXMgcnVuIChlaXRoZXIgbG9jYWxseSBvciBvdmVyIHNzaCkgYXMgdGhhdAorZGV2ZWxvcGVyLCBzbyBpcyBob29rcy91cGRhdGUgc2NyaXB0LiAgUXVvdGluZyBmcm9tIHRoZSByZWxldmFudAorc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbjoKKworICAgIEJlZm9yZSBlYWNoIHJlZiBpcyB1cGRhdGVkLCBpZiAkR0lUX0RJUi9ob29rcy91cGRhdGUgZmlsZSBleGlzdHMKKyAgICBhbmQgZXhlY3V0YWJsZSwgaXQgaXMgY2FsbGVkIHdpdGggdGhyZWUgcGFyYW1ldGVyczoKKworICAgICAgICAgICAkR0lUX0RJUi9ob29rcy91cGRhdGUgcmVmbmFtZSBzaGExLW9sZCBzaGExLW5ldworCisgICAgVGhlIHJlZm5hbWUgcGFyYW1ldGVyIGlzIHJlbGF0aXZlIHRvICRHSVRfRElSOyBlLmcuIGZvciB0aGUKKyAgICBtYXN0ZXIgaGVhZCB0aGlzIGlzICJyZWZzL2hlYWRzL21hc3RlciIuICBUd28gc2hhMSBhcmUgdGhlCisgICAgb2JqZWN0IG5hbWVzIGZvciB0aGUgcmVmbmFtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUuICBOb3RlCisgICAgdGhhdCB0aGUgaG9vayBpcyBjYWxsZWQgYmVmb3JlIHRoZSByZWZuYW1lIGlzIHVwZGF0ZWQsIHNvIGVpdGhlcgorICAgIHNoYTEtb2xkIGlzIDB7NDB9IChtZWFuaW5nIHRoZXJlIGlzIG5vIHN1Y2ggcmVmIHlldCksIG9yIGl0CisgICAgc2hvdWxkIG1hdGNoIHdoYXQgaXMgcmVjb3JkZWQgaW4gcmVmbmFtZS4KKworU28gaWYgeW91ciBwb2xpY3kgaXMgKDEpIGFsd2F5cyByZXF1aXJlIGZhc3QtZm9yd2FyZCBwdXNoCisoaS5lLiBuZXZlciBhbGxvdyAiZ2l0LXB1c2ggcmVwbyArYnJhbmNoOmJyYW5jaCIpLCAoMikgeW91CitoYXZlIGEgbGlzdCBvZiB1c2VycyBhbGxvd2VkIHRvIHVwZGF0ZSBlYWNoIGJyYW5jaCwgYW5kICgzKSB5b3UKK2RvIG5vdCBsZXQgdGFncyB0byBiZSBvdmVyd3JpdHRlbiwgdGhlbiB5b3UgY2FuIHVzZSBzb21ldGhpbmcKK2xpa2UgdGhpcyBhcyB5b3VyIGhvb2tzL3VwZGF0ZSBzY3JpcHQuCisKK1tqYzogZWRpdG9yaWFsIG5vdGUuICBUaGlzIGlzIGEgbXVjaCBpbXByb3ZlZCB2ZXJzaW9uIGJ5IENhcmwKK3NpbmNlIEkgcG9zdGVkIHRoZSBvcmlnaW5hbCBvdXRsaW5lXQorCistLSA+OCAtLSBiZWdpbm5pbmcgb2Ygc2NyaXB0IC0tID44IC0tCisKKyMhL2Jpbi9iYXNoCisKK3VtYXNrIDAwMgorCisjIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCB0aGlzIGFjY2VzcyBjb250cm9sIGhvb2sgc2NyaXB0CisjIHlvdSBjYW4gdHJ5IHNldHRpbmcgdGhpcyB0byB0cnVlLiAgSXQgd2lsbCB0ZWxsIHlvdSBleGFjdGx5CisjIHdoeSBhIHVzZXIgaXMgYmVpbmcgYWxsb3dlZC9kZW5pZWQgYWNjZXNzLgorCit2ZXJib3NlPWZhbHNlCisKKyMgRGVmYXVsdCBzaGVsbCBnbG9iYmluZyBtZXNzZXMgdGhpbmdzIHVwIGRvd25zdHJlYW0KK0dMT0JJR05PUkU9KgorCitmdW5jdGlvbiBncmFudCB7CisgICR2ZXJib3NlICYmIGVjaG8gPiYyICItR3JhbnQtCQkkMSIKKyAgZWNobyBncmFudAorICBleGl0IDAKK30KKworZnVuY3Rpb24gZGVueSB7CisgICR2ZXJib3NlICYmIGVjaG8gPiYyICItRGVueS0JCSQxIgorICBlY2hvIGRlbnkKKyAgZXhpdCAxCit9CisKK2Z1bmN0aW9uIGluZm8geworICAkdmVyYm9zZSAmJiBlY2hvID4mMiAiLUluZm8tCQkkMSIKK30KKworIyBJbXBsZW1lbnQgZ2VuZXJpYyBicmFuY2ggYW5kIHRhZyBwb2xpY2llcy4KKyMgLSBUYWdzIHNob3VsZCBub3QgYmUgdXBkYXRlZCBvbmNlIGNyZWF0ZWQuCisjIC0gQnJhbmNoZXMgc2hvdWxkIG9ubHkgYmUgZmFzdC1mb3J3YXJkZWQuCitjYXNlICIkMSIgaW4KKyAgcmVmcy90YWdzLyopCisgICAgWyAtZiAiJEdJVF9ESVIvJDEiIF0gJiYKKyAgICBkZW55ID4vZGV2L251bGwgIllvdSBjYW4ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGFnIgorICAgIDs7CisgIHJlZnMvaGVhZHMvKikKKyAgICAjIE5vIHJlYmFzaW5nIG9yIHJld2luZGluZworICAgIGlmIGV4cHIgIiQyIiA6ICcwKiQnID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGluZm8gIlRoZSBicmFuY2ggJyQxJyBpcyBuZXcuLi4iCisgICAgZWxzZQorICAgICAgIyB1cGRhdGluZyAtLSBtYWtlIHN1cmUgaXQgaXMgYSBmYXN0IGZvcndhcmQKKyAgICAgIG1iPSQoZ2l0LW1lcmdlLWJhc2UgIiQyIiAiJDMiKQorICAgICAgY2FzZSAiJG1iLCQyIiBpbgorICAgICAgICAiJDIsJG1iIikgaW5mbyAiVXBkYXRlIGlzIGZhc3QtZm9yd2FyZCIgOzsKKyAgICAgICAgKikgICAgICAgIGRlbnkgPi9kZXYvbnVsbCAgIlRoaXMgaXMgbm90IGEgZmFzdC1mb3J3YXJkIHVwZGF0ZS4iIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGRlbnkgPi9kZXYvbnVsbCBcCisgICAgIkJyYW5jaCBpcyBub3QgdW5kZXIgcmVmcy9oZWFkcyBvciByZWZzL3RhZ3MuICBXaGF0IGFyZSB5b3UgdHJ5aW5nIHRvIGRvPyIKKyAgICA7OworZXNhYworCisjIEltcGxlbWVudCBwZXItYnJhbmNoIGNvbnRyb2xzIGJhc2VkIG9uIHVzZXJuYW1lCithbGxvd2VkX3VzZXJzX2ZpbGU9JEdJVF9ESVIvaW5mby9hbGxvd2VkLXVzZXJzCit1c2VybmFtZT0kKGlkIC11IC1uKQoraW5mbyAiVGhlIHVzZXIgaXM6ICckdXNlcm5hbWUnIgorCitpZiBbIC1mICIkYWxsb3dlZF91c2Vyc19maWxlIiBdOyB0aGVuCisgIHJjPSQoY2F0ICRhbGxvd2VkX3VzZXJzX2ZpbGUgfCBncmVwIC12ICdeIycgfCBncmVwIC12ICdeJCcgfAorICAgIHdoaWxlIHJlYWQgaGVhZF9wYXR0ZXJuIHVzZXJfcGF0dGVybnM7IGRvCisgICAgICBtYXRjaGxlbj0kKGV4cHIgIiQxIiA6ICIkaGVhZF9wYXR0ZXJuIikKKyAgICAgIGlmIFsgIiRtYXRjaGxlbiIgPT0gIiR7IzF9IiBdOyB0aGVuCisgICAgICAgIGluZm8gIkZvdW5kIG1hdGNoaW5nIGhlYWQgcGF0dGVybjogJyRoZWFkX3BhdHRlcm4nIgorICAgICAgICBmb3IgdXNlcl9wYXR0ZXJuIGluICR1c2VyX3BhdHRlcm5zOyBkbworICAgICAgICAgIGluZm8gIkNoZWNraW5nIHVzZXI6ICckdXNlcm5hbWUnIGFnYWluc3QgcGF0dGVybjogJyR1c2VyX3BhdHRlcm4nIgorICAgICAgICAgIG1hdGNobGVuPSQoZXhwciAiJHVzZXJuYW1lIiA6ICIkdXNlcl9wYXR0ZXJuIikKKyAgICAgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyN1c2VybmFtZX0iIF07IHRoZW4KKyAgICAgICAgICAgIGdyYW50ICJBbGxvd2luZyB1c2VyOiAnJHVzZXJuYW1lJyB3aXRoIHBhdHRlcm46ICckdXNlcl9wYXR0ZXJuJyIKKyAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgICAgIGRlbnkgIlRoZSB1c2VyIGlzIG5vdCBpbiB0aGUgYWNjZXNzIGxpc3QgZm9yIHRoaXMgYnJhbmNoIgorICAgICAgZmkKKyAgICBkb25lCisgICkKKyAgY2FzZSAiJHJjIiBpbgorICAgIGdyYW50KSBncmFudCA+L2Rldi9udWxsICJHcmFudGluZyBhY2Nlc3MgYmFzZWQgb24gJGFsbG93ZWRfdXNlcnNfZmlsZSIgOzsKKyAgICBkZW55KSAgZGVueSAgPi9kZXYvbnVsbCAiRGVueWluZyAgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX3VzZXJzX2ZpbGUiIDs7CisgICAgKikgOzsKKyAgZXNhYworZmkKKworYWxsb3dlZF9ncm91cHNfZmlsZT0kR0lUX0RJUi9pbmZvL2FsbG93ZWQtZ3JvdXBzCitncm91cHM9JChpZCAtRyAtbikKK2luZm8gIlRoZSB1c2VyIGJlbG9uZ3MgdG8gdGhlIGZvbGxvd2luZyBncm91cHM6IgoraW5mbyAiJyRncm91cHMnIgorCitpZiBbIC1mICIkYWxsb3dlZF9ncm91cHNfZmlsZSIgXTsgdGhlbgorICByYz0kKGNhdCAkYWxsb3dlZF9ncm91cHNfZmlsZSB8IGdyZXAgLXYgJ14jJyB8IGdyZXAgLXYgJ14kJyB8CisgICAgd2hpbGUgcmVhZCBoZWFkX3BhdHRlcm4gZ3JvdXBfcGF0dGVybnM7IGRvCisgICAgICBtYXRjaGxlbj0kKGV4cHIgIiQxIiA6ICIkaGVhZF9wYXR0ZXJuIikKKyAgICAgIGlmIFsgIiRtYXRjaGxlbiIgPT0gIiR7IzF9IiBdOyB0aGVuCisgICAgICAgIGluZm8gIkZvdW5kIG1hdGNoaW5nIGhlYWQgcGF0dGVybjogJyRoZWFkX3BhdHRlcm4nIgorICAgICAgICBmb3IgZ3JvdXBfcGF0dGVybiBpbiAkZ3JvdXBfcGF0dGVybnM7IGRvCisgICAgICAgICAgZm9yIGdyb3VwbmFtZSBpbiAkZ3JvdXBzOyBkbworICAgICAgICAgICAgaW5mbyAiQ2hlY2tpbmcgZ3JvdXA6ICckZ3JvdXBuYW1lJyBhZ2FpbnN0IHBhdHRlcm46ICckZ3JvdXBfcGF0dGVybiciCisgICAgICAgICAgICBtYXRjaGxlbj0kKGV4cHIgIiRncm91cG5hbWUiIDogIiRncm91cF9wYXR0ZXJuIikKKyAgICAgICAgICAgIGlmIFsgIiRtYXRjaGxlbiIgPT0gIiR7I2dyb3VwbmFtZX0iIF07IHRoZW4KKyAgICAgICAgICAgICAgZ3JhbnQgIkFsbG93aW5nIGdyb3VwOiAnJGdyb3VwbmFtZScgd2l0aCBwYXR0ZXJuOiAnJGdyb3VwX3BhdHRlcm4nIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgIGRvbmUKKyAgICAgICAgZGVueSAiTm9uZSBvZiB0aGUgdXNlcidzIGdyb3VwcyBhcmUgaW4gdGhlIGFjY2VzcyBsaXN0IGZvciB0aGlzIGJyYW5jaCIKKyAgICAgIGZpCisgICAgZG9uZQorICApCisgIGNhc2UgIiRyYyIgaW4KKyAgICBncmFudCkgZ3JhbnQgPi9kZXYvbnVsbCAiR3JhbnRpbmcgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX2dyb3Vwc19maWxlIiA7OworICAgIGRlbnkpICBkZW55ICA+L2Rldi9udWxsICJEZW55aW5nICBhY2Nlc3MgYmFzZWQgb24gJGFsbG93ZWRfZ3JvdXBzX2ZpbGUiIDs7CisgICAgKikgOzsKKyAgZXNhYworZmkKKworZGVueSA+L2Rldi9udWxsICJUaGVyZSBhcmUgbm8gbW9yZSBydWxlcyB0byBjaGVjay4gIERlbnlpbmcgYWNjZXNzIgorCistLSA+OCAtLSBlbmQgb2Ygc2NyaXB0IC0tID44IC0tCisKK1RoaXMgdXNlcyB0d28gZmlsZXMsICRHSVRfRElSL2luZm8vYWxsb3dlZC11c2VycyBhbmQKK2FsbG93ZWQtZ3JvdXBzLCB0byBkZXNjcmliZSB3aGljaCBoZWFkcyBjYW4gYmUgcHVzaGVkIGludG8gYnkKK3dob20uICBUaGUgZm9ybWF0IG9mIGVhY2ggZmlsZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKKworCXJlZnMvaGVhZHMvbWFzdGVyCWp1bmlvCisgICAgICAgIHJlZnMvaGVhZHMvY29naXRvJAlwYXNreQorCXJlZnMvaGVhZHMvYncvCQlsaW51cworICAgICAgICByZWZzL2hlYWRzL3RtcC8JCSoKKyAgICAgICAgcmVmcy90YWdzL3ZbMC05XSoJanVuaW8KKworV2l0aCB0aGlzLCBMaW51cyBjYW4gcHVzaCBvciBjcmVhdGUgImJ3L3Blbmd1aW4iIG9yICJidy96ZWJyYSIKK29yICJidy9wYW5kYSIgYnJhbmNoZXMsIFBhc2t5IGNhbiBkbyBvbmx5ICJjb2dpdG8iLCBhbmQgSkMgY2FuCitkbyBtYXN0ZXIgYnJhbmNoIGFuZCBtYWtlIHZlcnNpb25lZCB0YWdzLiAgQW5kIGFueWJvZHkgY2FuIGRvCit0bXAvYmxhaCBicmFuY2hlcy4KKworLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3VzZS1naXQtZGFlbW9uLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vdXNlLWdpdC1kYWVtb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWViMjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3VzZS1naXQtZGFlbW9uLnR4dApAQCAtMCwwICsxLDUyIEBACitIb3cgdG8gdXNlIGdpdC1kYWVtb24KKworR2l0IGNhbiBiZSBydW4gaW4gaW5ldGQgbW9kZSBhbmQgaW4gc3RhbmQgYWxvbmUgbW9kZS4gQnV0IGFsbCB5b3Ugd2FudCBpcworbGV0IGEgY293b3JrZXIgcHVsbCBmcm9tIHlvdSwgYW5kIHRoZXJlZm9yZSBuZWVkIHRvIHNldCB1cCBhIGdpdCBzZXJ2ZXIKK3JlYWwgcXVpY2ssIHJpZ2h0PworCitOb3RlIHRoYXQgZ2l0LWRhZW1vbiBpcyBub3QgcmVhbGx5IGNoYXR0eSBhdCB0aGUgbW9tZW50LCBlc3BlY2lhbGx5IHdoZW4KK3RoaW5ncyBkbyBub3QgZ28gYWNjb3JkaW5nIHRvIHBsYW4gKGUuZy4gYSBzb2NrZXQgY291bGQgbm90IGJlIGJvdW5kKS4KKworQW5vdGhlciB3b3JkIG9mIHdhcm5pbmc6IGlmIHlvdSBydW4KKworCSQgZ2l0IGxzLXJlbW90ZSBnaXQ6Ly8xMjcuMC4wLjEvcnVsZS10aGUtd29ybGQuZ2l0CisKK2FuZCB5b3Ugc2VlIGEgbWVzc2FnZSBsaWtlCisKKwlmYXRhbDogVGhlIHJlbW90ZSBlbmQgaHVuZyB1cCB1bmV4cGVjdGVkbHkKKworaXQgb25seSBtZWFucyB0aGF0IF9zb21ldGhpbmdfIHdlbnQgd3JvbmcuIFRvIGZpbmQgb3V0IF93aGF0XyB3ZW50IHdyb25nLAoreW91IGhhdmUgdG8gYXNrIHRoZSBzZXJ2ZXIuIChHaXQgcmVmdXNlcyB0byBiZSBtb3JlIHByZWNpc2UgZm9yIHlvdXIKK3NlY3VyaXR5IG9ubHkuIFRha2Ugb2ZmIHlvdXIgc2hvZXMgbm93LiBZb3UgaGF2ZSBhbnkgY29pbnMgaW4geW91ciBwb2NrZXRzPworU29ycnksIG5vdCBhbGxvd2VkIC0tIHdobyBrbm93cyB3aGF0IHlvdSBwbGFubmVkIHRvIGRvIHdpdGggdGhlbT8pCisKK1dpdGggdGhlc2UgdHdvIGNhdmVhdHMsIGxldCdzIHNlZSBhbiBleGFtcGxlOgorCisJJCBnaXQgZGFlbW9uIC0tcmV1c2VhZGRyIC0tdmVyYm9zZSAtLWJhc2UtcGF0aD0vaG9tZS9naXR0ZS9naXQgXAorCSAgLS1leHBvcnQtYWxsIC0tIC9ob21lL2dpdHRlL2dpdC9ydWxlLXRoZS13b3JsZC5naXQKKworKE9mIGNvdXJzZSwgdW5sZXNzIHlvdXIgdXNlciBuYW1lIGlzIGBnaXR0ZWAgX2FuZF8geW91ciByZXBvc2l0b3J5IGlzIGluCit+L3J1bGUtdGhlLXdvcmxkLmdpdCwgeW91IGhhdmUgdG8gYWRqdXN0IHRoZSBwYXRocy4gSWYgeW91ciByZXBvc2l0b3J5IGlzCitub3QgYmFyZSwgYmUgYXdhcmUgdGhhdCB5b3UgaGF2ZSB0byB0eXBlIHRoZSBwYXRoIHRvIHRoZSAuZ2l0IGRpcmVjdG9yeSEpCisKK1RoaXMgaW52b2NhdGlvbiB0cmllcyB0byByZXVzZSB0aGUgYWRkcmVzcyBpZiBpdCBpcyBhbHJlYWR5IHRha2VuCisodGhpcyBjYW4gc2F2ZSB5b3Ugc29tZSBkZWJ1Z2dpbmcsIGJlY2F1c2Ugb3RoZXJ3aXNlIGtpbGxpbmcgYW5kIHJlc3RhcnRpbmcKK2dpdC1kYWVtb24gY291bGQganVzdCBzaWxlbnRseSBmYWlsIHRvIGJpbmQgdG8gYSBzb2NrZXQpLgorCitBbHNvLCBpdCBpcyAocmVsYXRpdmVseSkgdmVyYm9zZSB3aGVuIHNvbWVib2R5IGFjdHVhbGx5IGNvbm5lY3RzIHRvIGl0LgorSXQgYWxzbyBzZXRzIHRoZSBiYXNlIHBhdGgsIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHRoZSBwcm9qZWN0cyB3aGljaCBjYW4gYmUKK2FjY2Vzc2VkIHVzaW5nIHRoaXMgZGFlbW9uIGhhdmUgdG8gcmVzaWRlIGluIG9yIHVuZGVyIHRoYXQgcGF0aC4KKworVGhlIG9wdGlvbiBgLS1leHBvcnQtYWxsYCBqdXN0IG1lYW5zIHRoYXQgeW91IF9kb24ndF8gaGF2ZSB0byBjcmVhdGUgYQorZmlsZSBuYW1lZCBgZ2l0LWRhZW1vbi1leHBvcnQtb2tgIGluIGVhY2ggZXhwb3J0ZWQgcmVwb3NpdG9yeS4gKE90aGVyd2lzZSwKK2dpdC1kYWVtb24gd291bGQgY29tcGxhaW4gbG91ZGx5LCBhbmQgcmVmdXNlIHRvIGNvb3BlcmF0ZS4pCisKK0xhc3Qgb2YgYWxsLCB0aGUgcmVwb3NpdG9yeSB3aGljaCBzaG91bGQgYmUgZXhwb3J0ZWQgaXMgc3BlY2lmaWVkLiBJdCBpcworYSBnb29kIHByYWN0aWNlIHRvIHB1dCB0aGUgcGF0aHMgYWZ0ZXIgYSAiLS0iIHNlcGFyYXRvci4KKworTm93LCB0ZXN0IHlvdXIgZGFlbW9uIHdpdGgKKworCSQgZ2l0IGxzLXJlbW90ZSBnaXQ6Ly8xMjcuMC4wLjEvcnVsZS10aGUtd29ybGQuZ2l0CisKK0lmIHRoaXMgZG9lcyBub3Qgd29yaywgZmluZCBvdXQgd2h5LCBhbmQgc3VibWl0IGEgcGF0Y2ggdG8gdGhpcyBkb2N1bWVudC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMThuLnR4dCBiL0RvY3VtZW50YXRpb24vaTE4bi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1Zjk5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaTE4bi50eHQKQEAgLTAsMCArMSw1NyBAQAorQXQgdGhlIGNvcmUgbGV2ZWwsIGdpdCBpcyBjaGFyYWN0ZXIgZW5jb2RpbmcgYWdub3N0aWMuCisKKyAtIFRoZSBwYXRobmFtZXMgcmVjb3JkZWQgaW4gdGhlIGluZGV4IGFuZCBpbiB0aGUgdHJlZSBvYmplY3RzCisgICBhcmUgdHJlYXRlZCBhcyB1bmludGVycHJldGVkIHNlcXVlbmNlcyBvZiBub24tTlVMIGJ5dGVzLgorICAgV2hhdCByZWFkZGlyKDIpIHJldHVybnMgYXJlIHdoYXQgYXJlIHJlY29yZGVkIGFuZCBjb21wYXJlZAorICAgd2l0aCB0aGUgZGF0YSBnaXQga2VlcHMgdHJhY2sgb2YsIHdoaWNoIGluIHR1cm4gYXJlIGV4cGVjdGVkCisgICB0byBiZSB3aGF0IGxzdGF0KDIpIGFuZCBjcmVhdCgyKSBhY2NlcHRzLiAgVGhlcmUgaXMgbm8gc3VjaAorICAgdGhpbmcgYXMgcGF0aG5hbWUgZW5jb2RpbmcgdHJhbnNsYXRpb24uCisKKyAtIFRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBvYmplY3RzIGFyZSB1bmludGVycHJldGVkIHNlcXVlbmNlCisgICBvZiBieXRlcy4gIFRoZXJlIGlzIG5vIGVuY29kaW5nIHRyYW5zbGF0aW9uIGF0IHRoZSBjb3JlCisgICBsZXZlbC4KKworIC0gVGhlIGNvbW1pdCBsb2cgbWVzc2FnZXMgYXJlIHVuaW50ZXJwcmV0ZWQgc2VxdWVuY2Ugb2Ygbm9uLU5VTAorICAgYnl0ZXMuCisKK0FsdGhvdWdoIHdlIGVuY291cmFnZSB0aGF0IHRoZSBjb21taXQgbG9nIG1lc3NhZ2VzIGFyZSBlbmNvZGVkCitpbiBVVEYtOCwgYm90aCB0aGUgY29yZSBhbmQgZ2l0IFBvcmNlbGFpbiBhcmUgZGVzaWduZWQgbm90IHRvCitmb3JjZSBVVEYtOCBvbiBwcm9qZWN0cy4gIElmIGFsbCBwYXJ0aWNpcGFudHMgb2YgYSBwYXJ0aWN1bGFyCitwcm9qZWN0IGZpbmQgaXQgbW9yZSBjb252ZW5pZW50IHRvIHVzZSBsZWdhY3kgZW5jb2RpbmdzLCBnaXQKK2RvZXMgbm90IGZvcmJpZCBpdC4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdG8ga2VlcCBpbgorbWluZC4KKworLiBgZ2l0LWNvbW1pdC10cmVlYCAoaGVuY2UsIGBnaXQtY29tbWl0YCB3aGljaCB1c2VzIGl0KSBpc3N1ZXMKKyAgYW4gd2FybmluZyBpZiB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGdpdmVuIHRvIGl0IGRvZXMgbm90IGxvb2sKKyAgbGlrZSBhIHZhbGlkIFVURi04IHN0cmluZywgdW5sZXNzIHlvdSBleHBsaWNpdGx5IHNheSB5b3VyCisgIHByb2plY3QgdXNlcyBhIGxlZ2FjeSBlbmNvZGluZy4gIFRoZSB3YXkgdG8gc2F5IHRoaXMgaXMgdG8KKyAgaGF2ZSBpMThuLmNvbW1pdGVuY29kaW5nIGluIGAuZ2l0L2NvbmZpZ2AgZmlsZSwgbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tCitbaTE4bl0KKwljb21taXRlbmNvZGluZyA9IElTTy04ODU5LTEKKy0tLS0tLS0tLS0tLQorKworQ29tbWl0IG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBhYm92ZSBzZXR0aW5nIHJlY29yZCB0aGUgdmFsdWUKK29mIGBpMThuLmNvbW1pdGVuY29kaW5nYCBpbiBpdHMgYGVuY29kaW5nYCBoZWFkZXIuICBUaGlzIGlzIHRvCitoZWxwIG90aGVyIHBlb3BsZSB3aG8gbG9vayBhdCB0aGVtIGxhdGVyLiAgTGFjayBvZiB0aGlzIGhlYWRlcgoraW1wbGllcyB0aGF0IHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgaXMgZW5jb2RlZCBpbiBVVEYtOC4KKworLiBgZ2l0LWxvZ2AsIGBnaXQtc2hvd2AgYW5kIGZyaWVuZHMgbG9va3MgYXQgdGhlIGBlbmNvZGluZ2AKKyAgaGVhZGVyIG9mIGEgY29tbWl0IG9iamVjdCwgYW5kIHRyaWVzIHRvIHJlLWNvZGUgdGhlIGxvZworICBtZXNzYWdlIGludG8gVVRGLTggdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICBZb3UgY2FuCisgIHNwZWNpZnkgdGhlIGRlc2lyZWQgb3V0cHV0IGVuY29kaW5nIHdpdGgKKyAgYGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmdgIGluIGAuZ2l0L2NvbmZpZ2AgZmlsZSwgbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tCitbaTE4bl0KKwlsb2dvdXRwdXRlbmNvZGluZyA9IElTTy04ODU5LTEKKy0tLS0tLS0tLS0tLQorKworSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgY29uZmlndXJhdGlvbiB2YXJpYWJsZSwgdGhlIHZhbHVlIG9mCitgaTE4bi5jb21taXRlbmNvZGluZ2AgaXMgdXNlZCBpbnN0ZWFkLgorCitOb3RlIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IGNob3NlIG5vdCB0byByZS1jb2RlIHRoZSBjb21taXQgbG9nCittZXNzYWdlIHdoZW4gYSBjb21taXQgaXMgbWFkZSB0byBmb3JjZSBVVEYtOCBhdCB0aGUgY29tbWl0CitvYmplY3QgbGV2ZWwsIGJlY2F1c2UgcmUtY29kaW5nIHRvIFVURi04IGlzIG5vdCBuZWNlc3NhcmlseSBhCityZXZlcnNpYmxlIG9wZXJhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC1kb2MtcXVpY2suc2ggYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtZG9jLXF1aWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE2NDA1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtZG9jLXF1aWNrLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBUaGlzIHJlcXVpcmVzIGEgYnJhbmNoIG5hbWVkIGluICRoZWFkCisjICh1c3VhbGx5ICdtYW4nIG9yICdodG1sJywgcHJvdmlkZWQgYnkgdGhlIGdpdC5naXQgcmVwb3NpdG9yeSkKK3NldCAtZQoraGVhZD0iJDEiCittYW5kaXI9IiQyIgorU1VCRElSRUNUT1JZX09LPXQKK1VTQUdFPSc8cmVmbmFtZT4gPHRhcmdldCBkaXJlY3Rvcnk+JworLiBnaXQtc2gtc2V0dXAKK2V4cG9ydCBHSVRfRElSCisKK3Rlc3QgLXogIiRtYW5kaXIiICYmIHVzYWdlCitpZiAhIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRoZWFkXjAiID4vZGV2L251bGw7IHRoZW4KKwllY2hvID4mMiAiaGVhZDogJGhlYWQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSIKKwl1c2FnZQorZmkKKworR0lUX0lOREVYX0ZJTEU9YHB3ZGAvLnF1aWNrLWRvYy5pbmRleAorZXhwb3J0IEdJVF9JTkRFWF9GSUxFCitybSAtZiAiJEdJVF9JTkRFWF9GSUxFIgorZ2l0LXJlYWQtdHJlZSAkaGVhZAorZ2l0LWNoZWNrb3V0LWluZGV4IC1hIC1mIC0tcHJlZml4PSIkbWFuZGlyIi8KKworaWYgdGVzdCAtbiAiJEdaIjsgdGhlbgorCWNkICIkbWFuZGlyIgorCWZvciBpIGluIGBnaXQtbHMtdHJlZSAtciAtLW5hbWUtb25seSAkaGVhZGAKKwlkbworCQlnemlwIDwgJGkgPiAkaS5neiAmJiBybSAkaQorCWRvbmUKK2ZpCitybSAtZiAiJEdJVF9JTkRFWF9GSUxFIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXdlYmRvYy5zaCBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC13ZWJkb2Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2QzYTE4ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC13ZWJkb2Muc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisKK1Q9IiQxIgorCitmb3IgaCBpbiAqLmh0bWwgKi50eHQgaG93dG8vKi50eHQgaG93dG8vKi5odG1sIFJlbE5vdGVzLSoudHh0ICouY3NzCitkbworCWlmIHRlc3QgLWYgIiRULyRoIiAmJgorCSAgIGRpZmYgLXUgLUknTGFzdCB1cGRhdGVkIFswLTldWzAtOV0tW0EtWl1bYS16XVthLXpdLScgIiRULyRoIiAiJGgiCisJdGhlbgorCQk6OyAjIHVwIHRvIGRhdGUKKwllbHNlCisJCWVjaG8gPiYyICIjIGluc3RhbGwgJGggJFQvJGgiCisJCXJtIC1mICIkVC8kaCIKKwkJbWtkaXIgLXAgYGRpcm5hbWUgIiRULyRoImAKKwkJY3AgIiRoIiAiJFQvJGgiCisJZmkKK2RvbmUKK3N0cmlwX2xlYWRpbmc9YGVjaG8gIiRULyIgfCBzZWQgLWUgJ3N8LnwufGcnYAorZm9yIHRoIGluICIkVCIvKi5odG1sICIkVCIvKi50eHQgIiRUIi9ob3d0by8qLnR4dCAiJFQiL2hvd3RvLyouaHRtbAorZG8KKwloPWBleHByICIkdGgiIDogIiRzdHJpcF9sZWFkaW5nIidcKC4qXCknYAorCWNhc2UgIiRoIiBpbgorCWluZGV4Lmh0bWwpIGNvbnRpbnVlIDs7CisJZXNhYworCXRlc3QgLWYgIiRoIiAmJiBjb250aW51ZQorCWVjaG8gPiYyICIjIHJtIC1mICR0aCIKKwlybSAtZiAiJHRoIgorZG9uZQorbG4gLXNmIGdpdC5odG1sICIkVC9pbmRleC5odG1sIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZXJnZS1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbWVyZ2Utb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyY2VmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVyZ2Utb3B0aW9ucy50eHQKQEAgLTAsMCArMSwyNCBAQAorLW4sIFwtLW5vLXN1bW1hcnk6OgorCURvIG5vdCBzaG93IGRpZmZzdGF0IGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlLgorCistLW5vLWNvbW1pdDo6CisJUGVyZm9ybSB0aGUgbWVyZ2UgYnV0IHByZXRlbmQgdGhlIG1lcmdlIGZhaWxlZCBhbmQgZG8KKwlub3QgYXV0b2NvbW1pdCwgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IGFuZAorCWZ1cnRoZXIgdHdlYWsgdGhlIG1lcmdlIHJlc3VsdCBiZWZvcmUgY29tbWl0dGluZy4KKworLS1zcXVhc2g6OgorCVByb2R1Y2UgdGhlIHdvcmtpbmcgdHJlZSBhbmQgaW5kZXggc3RhdGUgYXMgaWYgYSByZWFsCisJbWVyZ2UgaGFwcGVuZWQsIGJ1dCBkbyBub3QgYWN0dWFsbHkgbWFrZSBhIGNvbW1pdCBvcgorCW1vdmUgdGhlIGBIRUFEYCwgbm9yIHJlY29yZCBgJEdJVF9ESVIvTUVSR0VfSEVBRGAgdG8KKwljYXVzZSB0aGUgbmV4dCBgZ2l0IGNvbW1pdGAgY29tbWFuZCB0byBjcmVhdGUgYSBtZXJnZQorCWNvbW1pdC4gIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBzaW5nbGUgY29tbWl0IG9uCisJdG9wIG9mIHRoZSBjdXJyZW50IGJyYW5jaCB3aG9zZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMKKwltZXJnaW5nIGFub3RoZXIgYnJhbmNoIChvciBtb3JlIGluIGNhc2Ugb2YgYW4gb2N0b3B1cykuCisKKy1zIDxzdHJhdGVneT4sIFwtLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCVVzZSB0aGUgZ2l2ZW4gbWVyZ2Ugc3RyYXRlZ3k7IGNhbiBiZSBzdXBwbGllZCBtb3JlIHRoYW4KKwlvbmNlIHRvIHNwZWNpZnkgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJpZWQuCisJSWYgdGhlcmUgaXMgbm8gYC1zYCBvcHRpb24sIGEgYnVpbHQtaW4gbGlzdCBvZiBzdHJhdGVnaWVzCisJaXMgdXNlZCBpbnN0ZWFkIChgZ2l0LW1lcmdlLXJlY3Vyc2l2ZWAgd2hlbiBtZXJnaW5nIGEgc2luZ2xlCisJaGVhZCwgYGdpdC1tZXJnZS1vY3RvcHVzYCBvdGhlcndpc2UpLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lcmdlLXN0cmF0ZWdpZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYwMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApAQCAtMCwwICsxLDM1IEBACitNRVJHRSBTVFJBVEVHSUVTCistLS0tLS0tLS0tLS0tLS0tCisKK3Jlc29sdmU6OgorCVRoaXMgY2FuIG9ubHkgcmVzb2x2ZSB0d28gaGVhZHMgKGkuZS4gdGhlIGN1cnJlbnQgYnJhbmNoCisJYW5kIGFub3RoZXIgYnJhbmNoIHlvdSBwdWxsZWQgZnJvbSkgdXNpbmcgMy13YXkgbWVyZ2UKKwlhbGdvcml0aG0uICBJdCB0cmllcyB0byBjYXJlZnVsbHkgZGV0ZWN0IGNyaXNzLWNyb3NzCisJbWVyZ2UgYW1iaWd1aXRpZXMgYW5kIGlzIGNvbnNpZGVyZWQgZ2VuZXJhbGx5IHNhZmUgYW5kCisJZmFzdC4KKworcmVjdXJzaXZlOjoKKwlUaGlzIGNhbiBvbmx5IHJlc29sdmUgdHdvIGhlYWRzIHVzaW5nIDMtd2F5IG1lcmdlCisJYWxnb3JpdGhtLiAgV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjb21tb24KKwlhbmNlc3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgMy13YXkgbWVyZ2UsIGl0IGNyZWF0ZXMgYQorCW1lcmdlZCB0cmVlIG9mIHRoZSBjb21tb24gYW5jZXN0b3JzIGFuZCB1c2VzIHRoYXQgYXMKKwl0aGUgcmVmZXJlbmNlIHRyZWUgZm9yIHRoZSAzLXdheSBtZXJnZS4gIFRoaXMgaGFzIGJlZW4KKwlyZXBvcnRlZCB0byByZXN1bHQgaW4gZmV3ZXIgbWVyZ2UgY29uZmxpY3RzIHdpdGhvdXQKKwljYXVzaW5nIG1pcy1tZXJnZXMgYnkgdGVzdHMgZG9uZSBvbiBhY3R1YWwgbWVyZ2UgY29tbWl0cworCXRha2VuIGZyb20gTGludXggMi42IGtlcm5lbCBkZXZlbG9wbWVudCBoaXN0b3J5LgorCUFkZGl0aW9uYWxseSB0aGlzIGNhbiBkZXRlY3QgYW5kIGhhbmRsZSBtZXJnZXMgaW52b2x2aW5nCisJcmVuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgd2hlbgorCXB1bGxpbmcgb3IgbWVyZ2luZyBvbmUgYnJhbmNoLgorCitvY3RvcHVzOjoKKwlUaGlzIHJlc29sdmVzIG1vcmUgdGhhbiB0d28taGVhZCBjYXNlLCBidXQgcmVmdXNlcyB0byBkbworCWNvbXBsZXggbWVyZ2UgdGhhdCBuZWVkcyBtYW51YWwgcmVzb2x1dGlvbi4gIEl0IGlzCisJcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGJ1bmRsaW5nIHRvcGljIGJyYW5jaAorCWhlYWRzIHRvZ2V0aGVyLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtZXJnZSBzdHJhdGVneSB3aGVuCisJcHVsbGluZyBvciBtZXJnaW5nIG1vcmUgdGhhbiBvbmUgYnJhbmNoZXMuCisKK291cnM6OgorCVRoaXMgcmVzb2x2ZXMgYW55IG51bWJlciBvZiBoZWFkcywgYnV0IHRoZSByZXN1bHQgb2YgdGhlCisJbWVyZ2UgaXMgYWx3YXlzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiAgSXQgaXMgbWVhbnQgdG8KKwliZSB1c2VkIHRvIHN1cGVyc2VkZSBvbGQgZGV2ZWxvcG1lbnQgaGlzdG9yeSBvZiBzaWRlCisJYnJhbmNoZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ByZXR0eS1mb3JtYXRzLnR4dCBiL0RvY3VtZW50YXRpb24vcHJldHR5LWZvcm1hdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjJlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ByZXR0eS1mb3JtYXRzLnR4dApAQCAtMCwwICsxLDEyNCBAQAorUFJFVFRZIEZPUk1BVFMKKy0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBjb21taXQgaXMgYSBtZXJnZSwgYW5kIGlmIHRoZSBwcmV0dHktZm9ybWF0CitpcyBub3QgJ29uZWxpbmUnLCAnZW1haWwnIG9yICdyYXcnLCBhbiBhZGRpdGlvbmFsIGxpbmUgaXMKK2luc2VydGVkIGJlZm9yZSB0aGUgJ0F1dGhvcjonIGxpbmUuICBUaGlzIGxpbmUgYmVnaW5zIHdpdGgKKyJNZXJnZTogIiBhbmQgdGhlIHNoYTFzIG9mIGFuY2VzdHJhbCBjb21taXRzIGFyZSBwcmludGVkLAorc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIE5vdGUgdGhhdCB0aGUgbGlzdGVkIGNvbW1pdHMgbWF5IG5vdAorbmVjZXNzYXJpbHkgYmUgdGhlIGxpc3Qgb2YgdGhlICpkaXJlY3QqIHBhcmVudCBjb21taXRzIGlmIHlvdQoraGF2ZSBsaW1pdGVkIHlvdXIgdmlldyBvZiBoaXN0b3J5OiBmb3IgZXhhbXBsZSwgaWYgeW91IGFyZQorb25seSBpbnRlcmVzdGVkIGluIGNoYW5nZXMgcmVsYXRlZCB0byBhIGNlcnRhaW4gZGlyZWN0b3J5IG9yCitmaWxlLgorCitIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgZGV0YWlscyBmb3IgZWFjaCBmb3JtYXQ6CisKKyogJ29uZWxpbmUnCisKKwkgIDxzaGExPiA8dGl0bGUgbGluZT4KKysKK1RoaXMgaXMgZGVzaWduZWQgdG8gYmUgYXMgY29tcGFjdCBhcyBwb3NzaWJsZS4KKworKiAnc2hvcnQnCisKKwkgIGNvbW1pdCA8c2hhMT4KKwkgIEF1dGhvcjogPGF1dGhvcj4KKworCSAgICAgIDx0aXRsZSBsaW5lPgorCisqICdtZWRpdW0nCisKKwkgIGNvbW1pdCA8c2hhMT4KKwkgIEF1dGhvcjogPGF1dGhvcj4KKwkgIERhdGU6IDxkYXRlPgorCisJICAgICAgPHRpdGxlIGxpbmU+CisKKwkgICAgICA8ZnVsbCBjb21taXQgbWVzc2FnZT4KKworKiAnZnVsbCcKKworCSAgY29tbWl0IDxzaGExPgorCSAgQXV0aG9yOiA8YXV0aG9yPgorCSAgQ29tbWl0OiA8Y29tbWl0dGVyPgorCisJICAgICAgPHRpdGxlIGxpbmU+CisKKwkgICAgICA8ZnVsbCBjb21taXQgbWVzc2FnZT4KKworKiAnZnVsbGVyJworCisJICBjb21taXQgPHNoYTE+CisJICBBdXRob3I6IDxhdXRob3I+CisJICBBdXRob3JEYXRlOiA8ZGF0ZSAmIHRpbWU+CisJICBDb21taXQ6IDxjb21taXR0ZXI+CisJICBDb21taXREYXRlOiA8ZGF0ZSAmIHRpbWU+CisKKwkgICAgICAgPHRpdGxlIGxpbmU+CisKKwkgICAgICAgPGZ1bGwgY29tbWl0IG1lc3NhZ2U+CisKKyogJ2VtYWlsJworCisJICBGcm9tIDxzaGExPiA8ZGF0ZT4KKwkgIEZyb206IDxhdXRob3I+CisJICBEYXRlOiA8ZGF0ZSAmIHRpbWU+CisJICBTdWJqZWN0OiBbUEFUQ0hdIDx0aXRsZSBsaW5lPgorCisJICA8ZnVsbCBjb21taXQgbWVzc2FnZT4KKworKiAncmF3JworKworVGhlICdyYXcnIGZvcm1hdCBzaG93cyB0aGUgZW50aXJlIGNvbW1pdCBleGFjdGx5IGFzCitzdG9yZWQgaW4gdGhlIGNvbW1pdCBvYmplY3QuICBOb3RhYmx5LCB0aGUgU0hBMXMgYXJlCitkaXNwbGF5ZWQgaW4gZnVsbCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIC0tYWJicmV2IG9yCistLW5vLWFiYnJldiBhcmUgdXNlZCwgYW5kICdwYXJlbnRzJyBpbmZvcm1hdGlvbiBzaG93IHRoZQordHJ1ZSBwYXJlbnQgY29tbWl0cywgd2l0aG91dCB0YWtpbmcgZ3JhZnRzIG5vciBoaXN0b3J5CitzaW1wbGlmaWNhdGlvbiBpbnRvIGFjY291bnQuCisKKyogJ2Zvcm1hdDonCisrCitUaGUgJ2Zvcm1hdDonIGZvcm1hdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggaW5mb3JtYXRpb24KK3lvdSB3YW50IHRvIHNob3cuIEl0IHdvcmtzIGEgbGl0dGxlIGJpdCBsaWtlIHByaW50ZiBmb3JtYXQsCit3aXRoIHRoZSBub3RhYmxlIGV4Y2VwdGlvbiB0aGF0IHlvdSBnZXQgYSBuZXdsaW5lIHdpdGggJyVuJworaW5zdGVhZCBvZiAnXG4nLgorKworRS5nLCAnZm9ybWF0OiJUaGUgYXV0aG9yIG9mICVoIHdhcyAlYW4sICVhciVuVGhlIHRpdGxlIHdhcyA+PiVzPDwlbiInCit3b3VsZCBzaG93IHNvbWV0aGluZyBsaWtlIHRoaXM6CisrCistLS0tLS0tCitUaGUgYXV0aG9yIG9mIGZlNmUwZWUgd2FzIEp1bmlvIEMgSGFtYW5vLCAyMyBob3VycyBhZ28KK1RoZSB0aXRsZSB3YXMgPj50NDExOTogdGVzdCBhdXRvY29tcHV0aW5nIC1wPG4+IGZvciB0cmFkaXRpb25hbCBkaWZmIGlucHV0Ljw8CisKKy0tLS0tLS0tCisrCitUaGUgcGxhY2Vob2xkZXJzIGFyZToKKworLSAnJUgnOiBjb21taXQgaGFzaAorLSAnJWgnOiBhYmJyZXZpYXRlZCBjb21taXQgaGFzaAorLSAnJVQnOiB0cmVlIGhhc2gKKy0gJyV0JzogYWJicmV2aWF0ZWQgdHJlZSBoYXNoCistICclUCc6IHBhcmVudCBoYXNoZXMKKy0gJyVwJzogYWJicmV2aWF0ZWQgcGFyZW50IGhhc2hlcworLSAnJWFuJzogYXV0aG9yIG5hbWUKKy0gJyVhZSc6IGF1dGhvciBlbWFpbAorLSAnJWFkJzogYXV0aG9yIGRhdGUKKy0gJyVhRCc6IGF1dGhvciBkYXRlLCBSRkMyODIyIHN0eWxlCistICclYXInOiBhdXRob3IgZGF0ZSwgcmVsYXRpdmUKKy0gJyVhdCc6IGF1dGhvciBkYXRlLCBVTklYIHRpbWVzdGFtcAorLSAnJWNuJzogY29tbWl0dGVyIG5hbWUKKy0gJyVjZSc6IGNvbW1pdHRlciBlbWFpbAorLSAnJWNkJzogY29tbWl0dGVyIGRhdGUKKy0gJyVjRCc6IGNvbW1pdHRlciBkYXRlLCBSRkMyODIyIHN0eWxlCistICclY3InOiBjb21taXR0ZXIgZGF0ZSwgcmVsYXRpdmUKKy0gJyVjdCc6IGNvbW1pdHRlciBkYXRlLCBVTklYIHRpbWVzdGFtcAorLSAnJWUnOiBlbmNvZGluZworLSAnJXMnOiBzdWJqZWN0CistICclYic6IGJvZHkKKy0gJyVDcmVkJzogc3dpdGNoIGNvbG9yIHRvIHJlZAorLSAnJUNncmVlbic6IHN3aXRjaCBjb2xvciB0byBncmVlbgorLSAnJUNibHVlJzogc3dpdGNoIGNvbG9yIHRvIGJsdWUKKy0gJyVDcmVzZXQnOiByZXNldCBjb2xvcgorLSAnJW0nOiBsZWZ0LCByaWdodCBvciBib3VuZGFyeSBtYXJrCistICclbic6IG5ld2xpbmUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wcmV0dHktb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3ByZXR0eS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUxNWJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wcmV0dHktb3B0aW9ucy50eHQKQEAgLTAsMCArMSwxNCBAQAorLS1wcmV0dHlbPSc8Zm9ybWF0PiddOjoKKworCVByZXR0eSBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1pdCBsb2dzIGluIGEgZ2l2ZW4gZm9ybWF0LAorCXdoZXJlICc8Zm9ybWF0PicgY2FuIGJlIG9uZSBvZiAnb25lbGluZScsICdzaG9ydCcsICdtZWRpdW0nLAorCSdmdWxsJywgJ2Z1bGxlcicsICdlbWFpbCcsICdyYXcnIGFuZCAnZm9ybWF0OjxzdHJpbmc+Jy4KKwlXaGVuIGxlZnQgb3V0IHRoZSBmb3JtYXQgZGVmYXVsdCB0byAnbWVkaXVtJy4KKworLS1lbmNvZGluZ1s9PGVuY29kaW5nPl06OgorCVRoZSBjb21taXQgb2JqZWN0cyByZWNvcmQgdGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBsb2cgbWVzc2FnZQorCWluIHRoZWlyIGVuY29kaW5nIGhlYWRlcjsgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gdGVsbCB0aGUKKwljb21tYW5kIHRvIHJlLWNvZGUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpbiB0aGUgZW5jb2RpbmcKKwlwcmVmZXJyZWQgYnkgdGhlIHVzZXIuICBGb3Igbm9uIHBsdW1iaW5nIGNvbW1hbmRzIHRoaXMKKwlkZWZhdWx0cyB0byBVVEYtOC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dCBiL0RvY3VtZW50YXRpb24vcHVsbC1mZXRjaC1wYXJhbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZTk1MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcHVsbC1mZXRjaC1wYXJhbS50eHQKQEAgLTAsMCArMSw2NSBAQAorPHJlcG9zaXRvcnk+OjoKKwlUaGUgInJlbW90ZSIgcmVwb3NpdG9yeSB0aGF0IGlzIHRoZSBzb3VyY2Ugb2YgYSBmZXRjaAorCW9yIHB1bGwgb3BlcmF0aW9uLiAgU2VlIHRoZSBzZWN0aW9uIDw8VVJMUyxHSVQgVVJMUz4+IGJlbG93LgorCis8cmVmc3BlYz46OgorCVRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGEgPHJlZnNwZWM+IHBhcmFtZXRlciBpcworCWArPzxzcmM+Ojxkc3Q+YDsgdGhhdCBpcywgYW4gb3B0aW9uYWwgcGx1cyBgK2AsIGZvbGxvd2VkCisJYnkgdGhlIHNvdXJjZSByZWYsIGZvbGxvd2VkIGJ5IGEgY29sb24gYDpgLCBmb2xsb3dlZCBieQorCXRoZSBkZXN0aW5hdGlvbiByZWYuCisrCitUaGUgcmVtb3RlIHJlZiB0aGF0IG1hdGNoZXMgPHNyYz4KK2lzIGZldGNoZWQsIGFuZCBpZiA8ZHN0PiBpcyBub3QgZW1wdHkgc3RyaW5nLCB0aGUgbG9jYWwKK3JlZiB0aGF0IG1hdGNoZXMgaXQgaXMgZmFzdCBmb3J3YXJkZWQgdXNpbmcgPHNyYz4uCitBZ2FpbiwgaWYgdGhlIG9wdGlvbmFsIHBsdXMgYCtgIGlzIHVzZWQsIHRoZSBsb2NhbCByZWYKK2lzIHVwZGF0ZWQgZXZlbiBpZiBpdCBkb2VzIG5vdCByZXN1bHQgaW4gYSBmYXN0IGZvcndhcmQKK3VwZGF0ZS4KKysKK1tOT1RFXQorSWYgdGhlIHJlbW90ZSBicmFuY2ggZnJvbSB3aGljaCB5b3Ugd2FudCB0byBwdWxsIGlzCittb2RpZmllZCBpbiBub24tbGluZWFyIHdheXMgc3VjaCBhcyBiZWluZyByZXdvdW5kIGFuZAorcmViYXNlZCBmcmVxdWVudGx5LCB0aGVuIGEgcHVsbCB3aWxsIGF0dGVtcHQgYSBtZXJnZSB3aXRoCithbiBvbGRlciB2ZXJzaW9uIG9mIGl0c2VsZiwgbGlrZWx5IGNvbmZsaWN0LCBhbmQgZmFpbC4KK0l0IGlzIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMgdGhhdCB5b3Ugd291bGQgd2FudCB0byB1c2UKK3RoZSBgK2Agc2lnbiB0byBpbmRpY2F0ZSBub24tZmFzdC1mb3J3YXJkIHVwZGF0ZXMgd2lsbAorYmUgbmVlZGVkLiAgVGhlcmUgaXMgY3VycmVudGx5IG5vIGVhc3kgd2F5IHRvIGRldGVybWluZQorb3IgZGVjbGFyZSB0aGF0IGEgYnJhbmNoIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgaW4gYQorcmVwb3NpdG9yeSB3aXRoIHRoaXMgYmVoYXZpb3I7IHRoZSBwdWxsaW5nIHVzZXIgc2ltcGx5CittdXN0IGtub3cgdGhpcyBpcyB0aGUgZXhwZWN0ZWQgdXNhZ2UgcGF0dGVybiBmb3IgYSBicmFuY2guCisrCitbTk9URV0KK1lvdSBuZXZlciBkbyB5b3VyIG93biBkZXZlbG9wbWVudCBvbiBicmFuY2hlcyB0aGF0IGFwcGVhcgorb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhIDxyZWZzcGVjPiBjb2xvbiBvbiBgUHVsbDpgIGxpbmVzOwordGhleSBhcmUgdG8gYmUgdXBkYXRlZCBieSBgZ2l0LWZldGNoYC4gIElmIHlvdSBpbnRlbmQgdG8gZG8KK2RldmVsb3BtZW50IGRlcml2ZWQgZnJvbSBhIHJlbW90ZSBicmFuY2ggYEJgLCBoYXZlIGEgYFB1bGw6YAorbGluZSB0byB0cmFjayBpdCAoaS5lLiBgUHVsbDogQjpyZW1vdGUtQmApLCBhbmQgaGF2ZSBhIHNlcGFyYXRlCiticmFuY2ggYG15LUJgIHRvIGRvIHlvdXIgZGV2ZWxvcG1lbnQgb24gdG9wIG9mIGl0LiAgVGhlIGxhdHRlcgoraXMgY3JlYXRlZCBieSBgZ2l0IGJyYW5jaCBteS1CIHJlbW90ZS1CYCAob3IgaXRzIGVxdWl2YWxlbnQgYGdpdAorY2hlY2tvdXQgLWIgbXktQiByZW1vdGUtQmApLiAgUnVuIGBnaXQgZmV0Y2hgIHRvIGtlZXAgdHJhY2sgb2YKK3RoZSBwcm9ncmVzcyBvZiB0aGUgcmVtb3RlIHNpZGUsIGFuZCB3aGVuIHlvdSBzZWUgc29tZXRoaW5nIG5ldworb24gdGhlIHJlbW90ZSBicmFuY2gsIG1lcmdlIGl0IGludG8geW91ciBkZXZlbG9wbWVudCBicmFuY2ggd2l0aAorYGdpdCBwdWxsIC4gcmVtb3RlLUJgLCB3aGlsZSB5b3UgYXJlIG9uIGBteS1CYCBicmFuY2guCisrCitbTk9URV0KK1RoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGxpc3RpbmcgbXVsdGlwbGUgPHJlZnNwZWM+CitkaXJlY3RseSBvbiBgZ2l0LXB1bGxgIGNvbW1hbmQgbGluZSBhbmQgaGF2aW5nIG11bHRpcGxlCitgUHVsbDpgIDxyZWZzcGVjPiBsaW5lcyBmb3IgYSA8cmVwb3NpdG9yeT4gYW5kIHJ1bm5pbmcKK2BnaXQtcHVsbGAgY29tbWFuZCB3aXRob3V0IGFueSBleHBsaWNpdCA8cmVmc3BlYz4gcGFyYW1ldGVycy4KKzxyZWZzcGVjPiBsaXN0ZWQgZXhwbGljaXRseSBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBhbHdheXMKK21lcmdlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCBhZnRlciBmZXRjaGluZy4gIEluIG90aGVyIHdvcmRzLAoraWYgeW91IGxpc3QgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcywgeW91IHdvdWxkIGJlIG1ha2luZworYW4gT2N0b3B1cy4gIFdoaWxlIGBnaXQtcHVsbGAgcnVuIHdpdGhvdXQgYW55IGV4cGxpY2l0IDxyZWZzcGVjPgorcGFyYW1ldGVyIHRha2VzIGRlZmF1bHQgPHJlZnNwZWM+cyBmcm9tIGBQdWxsOmAgbGluZXMsIGl0CittZXJnZXMgb25seSB0aGUgZmlyc3QgPHJlZnNwZWM+IGZvdW5kIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLAorYWZ0ZXIgZmV0Y2hpbmcgYWxsIHRoZSByZW1vdGUgcmVmcy4gIFRoaXMgaXMgYmVjYXVzZSBtYWtpbmcgYW4KK09jdG9wdXMgZnJvbSByZW1vdGUgcmVmcyBpcyByYXJlbHkgZG9uZSwgd2hpbGUga2VlcGluZyB0cmFjaworb2YgbXVsdGlwbGUgcmVtb3RlIGhlYWRzIGluIG9uZS1nbyBieSBmZXRjaGluZyBtb3JlIHRoYW4gb25lCitpcyBvZnRlbiB1c2VmdWwuCisrCitTb21lIHNob3J0LWN1dCBub3RhdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkLgorKworKiBgdGFnIDx0YWc+YCBtZWFucyB0aGUgc2FtZSBhcyBgcmVmcy90YWdzLzx0YWc+OnJlZnMvdGFncy88dGFnPmA7IAorICBpdCByZXF1ZXN0cyBmZXRjaGluZyBldmVyeXRoaW5nIHVwIHRvIHRoZSBnaXZlbiB0YWcuCisqIEEgcGFyYW1ldGVyIDxyZWY+IHdpdGhvdXQgYSBjb2xvbiBpcyBlcXVpdmFsZW50IHRvCisgIDxyZWY+OiB3aGVuIHB1bGxpbmcvZmV0Y2hpbmcsIHNvIGl0IG1lcmdlcyA8cmVmPiBpbnRvIHRoZSBjdXJyZW50CisgIGJyYW5jaCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlbW90ZSBicmFuY2ggYW55d2hlcmUgbG9jYWxseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQgYi9Eb2N1bWVudGF0aW9uL3JlcG9zaXRvcnktbGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTIyMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQKQEAgLTAsMCArMSwxODAgQEAKK2dpdCByZXBvc2l0b3J5IGxheW91dAorPT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBtYXkgZmluZCB0aGVzZSB0aGluZ3MgaW4geW91ciBnaXQgcmVwb3NpdG9yeSAoYC5naXRgCitkaXJlY3RvcnkgZm9yIGEgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggeW91ciB3b3JraW5nIHRyZWUsIG9yCitgJ3Byb2plY3QnLmdpdGAgZGlyZWN0b3J5IGZvciBhIHB1YmxpYyAnYmFyZScgcmVwb3NpdG9yeSkuCisKK29iamVjdHM6OgorCU9iamVjdCBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LiAgVXN1YWxseQorCWFuIG9iamVjdCBzdG9yZSBpcyBzZWxmIHN1ZmZpY2llbnQgKGkuZS4gYWxsIHRoZSBvYmplY3RzCisJdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkgYW4gb2JqZWN0IGZvdW5kIGluIGl0IGFyZSBhbHNvCisJZm91bmQgaW4gaXQpLCBidXQgdGhlcmUgYXJlIGNvdXBsZSBvZiB3YXlzIHRvIHZpb2xhdGUKKwlpdC4KKysKKy4gWW91IGNvdWxkIHBvcHVsYXRlIHRoZSByZXBvc2l0b3J5IGJ5IHJ1bm5pbmcgYSBjb21taXQgd2Fsa2VyCit3aXRob3V0IGAtYWAgb3B0aW9uLiAgRGVwZW5kaW5nIG9uIHdoaWNoIG9wdGlvbnMgYXJlIGdpdmVuLCB5b3UKK2NvdWxkIGhhdmUgb25seSBjb21taXQgb2JqZWN0cyB3aXRob3V0IGFzc29jaWF0ZWQgYmxvYnMgYW5kCit0cmVlcyB0aGlzIHdheSwgZm9yIGV4YW1wbGUuICBBIHJlcG9zaXRvcnkgd2l0aCB0aGlzIGtpbmQgb2YKK2luY29tcGxldGUgb2JqZWN0IHN0b3JlIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBwdWJsaXNoZWQgdG8gdGhlCitvdXRzaWRlIHdvcmxkIGJ1dCBzb21ldGltZXMgdXNlZnVsIGZvciBwcml2YXRlIHJlcG9zaXRvcnkuCisuIFlvdSBhbHNvIGNvdWxkIGhhdmUgYW4gaW5jb21wbGV0ZSBidXQgbG9jYWxseSB1c2FibGUgcmVwb3NpdG9yeQorYnkgY2xvbmluZyBzaGFsbG93bHkuICBTZWUgZ2l0bGluazpnaXQtY2xvbmVbMV0uCisuIFlvdSBjYW4gYmUgdXNpbmcgYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBtZWNoYW5pc20sIG9yCitgJEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTYCBtZWNoYW5pc20gdG8gJ2JvcnJvdycKK29iamVjdHMgZnJvbSBvdGhlciBvYmplY3Qgc3RvcmVzLiAgQSByZXBvc2l0b3J5IHdpdGggdGhpcyBraW5kCitvZiBpbmNvbXBsZXRlIG9iamVjdCBzdG9yZSBpcyBub3Qgc3VpdGFibGUgdG8gYmUgcHVibGlzaGVkIGZvcgordXNlIHdpdGggZHVtYiB0cmFuc3BvcnRzIGJ1dCBvdGhlcndpc2UgaXMgT0sgYXMgbG9uZyBhcworYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBwb2ludHMgYXQgdGhlIHJpZ2h0IG9iamVjdCBzdG9yZXMKK2l0IGJvcnJvd3MgZnJvbS4KKworb2JqZWN0cy9bMC05YS1mXVswLTlhLWZdOjoKKwlUcmFkaXRpb25hbGx5LCBlYWNoIG9iamVjdCBpcyBzdG9yZWQgaW4gaXRzIG93biBmaWxlLgorCVRoZXkgYXJlIHNwbGl0IGludG8gMjU2IHN1YmRpcmVjdG9yaWVzIHVzaW5nIHRoZSBmaXJzdAorCXR3byBsZXR0ZXJzIGZyb20gaXRzIG9iamVjdCBuYW1lIHRvIGtlZXAgdGhlIG51bWJlciBvZgorCWRpcmVjdG9yeSBlbnRyaWVzIGBvYmplY3RzYCBkaXJlY3RvcnkgaXRzZWxmIG5lZWRzIHRvCisJaG9sZC4gIE9iamVjdHMgZm91bmQgaGVyZSBhcmUgb2Z0ZW4gY2FsbGVkICd1bnBhY2tlZCcKKwkob3IgJ2xvb3NlJykgb2JqZWN0cy4KKworb2JqZWN0cy9wYWNrOjoKKwlQYWNrcyAoZmlsZXMgdGhhdCBzdG9yZSBtYW55IG9iamVjdCBpbiBjb21wcmVzc2VkIGZvcm0sCisJYWxvbmcgd2l0aCBpbmRleCBmaWxlcyB0byBhbGxvdyB0aGVtIHRvIGJlIHJhbmRvbWx5CisJYWNjZXNzZWQpIGFyZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS4KKworb2JqZWN0cy9pbmZvOjoKKwlBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3Qgc3RvcmUgaXMKKwlyZWNvcmRlZCBpbiB0aGlzIGRpcmVjdG9yeS4KKworb2JqZWN0cy9pbmZvL3BhY2tzOjoKKwlUaGlzIGZpbGUgaXMgdG8gaGVscCBkdW1iIHRyYW5zcG9ydHMgZGlzY292ZXIgd2hhdCBwYWNrcworCWFyZSBhdmFpbGFibGUgaW4gdGhpcyBvYmplY3Qgc3RvcmUuICBXaGVuZXZlciBhIHBhY2sgaXMKKwlhZGRlZCBvciByZW1vdmVkLCBgZ2l0IHVwZGF0ZS1zZXJ2ZXItaW5mb2Agc2hvdWxkIGJlIHJ1bgorCXRvIGtlZXAgdGhpcyBmaWxlIHVwLXRvLWRhdGUgaWYgdGhlIHJlcG9zaXRvcnkgaXMKKwlwdWJsaXNoZWQgZm9yIGR1bWIgdHJhbnNwb3J0cy4gIGBnaXQgcmVwYWNrYCBkb2VzIHRoaXMKKwlieSBkZWZhdWx0LgorCitvYmplY3RzL2luZm8vYWx0ZXJuYXRlczo6CisJVGhpcyBmaWxlIHJlY29yZHMgcGF0aHMgdG8gYWx0ZXJuYXRlIG9iamVjdCBzdG9yZXMgdGhhdAorCXRoaXMgb2JqZWN0IHN0b3JlIGJvcnJvd3Mgb2JqZWN0cyBmcm9tLCBvbmUgcGF0aG5hbWUgcGVyCisJbGluZS4gTm90ZSB0aGF0IG5vdCBvbmx5IG5hdGl2ZSBHaXQgdG9vbHMgdXNlIGl0IGxvY2FsbHksCisJYnV0IHRoZSBIVFRQIGZldGNoZXIgYWxzbyB0cmllcyB0byB1c2UgaXQgcmVtb3RlbHk7IHRoaXMKKwl3aWxsIHVzdWFsbHkgd29yayBpZiB5b3UgaGF2ZSByZWxhdGl2ZSBwYXRocyAocmVsYXRpdmUKKwl0byB0aGUgb2JqZWN0IGRhdGFiYXNlLCBub3QgdG8gdGhlIHJlcG9zaXRvcnkhKSBpbiB5b3VyCisJYWx0ZXJuYXRlcyBmaWxlLCBidXQgaXQgd2lsbCBub3Qgd29yayBpZiB5b3UgdXNlIGFic29sdXRlCisJcGF0aHMgdW5sZXNzIHRoZSBhYnNvbHV0ZSBwYXRoIGluIGZpbGVzeXN0ZW0gYW5kIHdlYiBVUkwKKwlpcyB0aGUgc2FtZS4gU2VlIGFsc28gJ29iamVjdHMvaW5mby9odHRwLWFsdGVybmF0ZXMnLgorCitvYmplY3RzL2luZm8vaHR0cC1hbHRlcm5hdGVzOjoKKwlUaGlzIGZpbGUgcmVjb3JkcyBVUkxzIHRvIGFsdGVybmF0ZSBvYmplY3Qgc3RvcmVzIHRoYXQKKwl0aGlzIG9iamVjdCBzdG9yZSBib3Jyb3dzIG9iamVjdHMgZnJvbSwgdG8gYmUgdXNlZCB3aGVuCisJdGhlIHJlcG9zaXRvcnkgaXMgZmV0Y2hlZCBvdmVyIEhUVFAuCisKK3JlZnM6OgorCVJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGlzCisJZGlyZWN0b3J5LiAgVGhlIGBnaXQgcHJ1bmVgIGNvbW1hbmQga25vd3MgdG8ga2VlcAorCW9iamVjdHMgcmVhY2hhYmxlIGZyb20gcmVmcyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQKKwlpdHMgc3ViZGlyZWN0b3JpZXMuCisKK3JlZnMvaGVhZHMvYG5hbWVgOjoKKwlyZWNvcmRzIHRpcC1vZi10aGUtdHJlZSBjb21taXQgb2JqZWN0cyBvZiBicmFuY2ggYG5hbWVgCisKK3JlZnMvdGFncy9gbmFtZWA6OgorCXJlY29yZHMgYW55IG9iamVjdCBuYW1lIChub3QgbmVjZXNzYXJpbHkgYSBjb21taXQKKwlvYmplY3QsIG9yIGEgdGFnIG9iamVjdCB0aGF0IHBvaW50cyBhdCBhIGNvbW1pdCBvYmplY3QpLgorCityZWZzL3JlbW90ZXMvYG5hbWVgOjoKKwlyZWNvcmRzIHRpcC1vZi10aGUtdHJlZSBjb21taXQgb2JqZWN0cyBvZiBicmFuY2hlcyBjb3BpZWQKKwlmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkuCisKK3BhY2tlZC1yZWZzOjoKKwlyZWNvcmRzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHJlZnMvaGVhZHMvLCByZWZzL3RhZ3MvLAorCWFuZCBmcmllbmRzIHJlY29yZCBpbiBhIG1vcmUgZWZmaWNpZW50IHdheS4gIFNlZQorCWdpdGxpbms6Z2l0LXBhY2stcmVmc1sxXS4KKworSEVBRDo6CisJQSBzeW1yZWYgKHNlZSBnbG9zc2FyeSkgdG8gdGhlIGByZWZzL2hlYWRzL2AgbmFtZXNwYWNlCisJZGVzY3JpYmluZyB0aGUgY3VycmVudGx5IGFjdGl2ZSBicmFuY2guICBJdCBkb2VzIG5vdCBtZWFuCisJbXVjaCBpZiB0aGUgcmVwb3NpdG9yeSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB3b3JraW5nIHRyZWUKKwkoaS5lLiBhICdiYXJlJyByZXBvc2l0b3J5KSwgYnV0IGEgdmFsaWQgZ2l0IHJlcG9zaXRvcnkKKwkqbXVzdCogaGF2ZSB0aGUgSEVBRCBmaWxlOyBzb21lIHBvcmNlbGFpbnMgbWF5IHVzZSBpdCB0bworCWd1ZXNzIHRoZSBkZXNpZ25hdGVkICJkZWZhdWx0IiBicmFuY2ggb2YgdGhlIHJlcG9zaXRvcnkKKwkodXN1YWxseSAnbWFzdGVyJykuICBJdCBpcyBsZWdhbCBpZiB0aGUgbmFtZWQgYnJhbmNoCisJJ25hbWUnIGRvZXMgbm90ICh5ZXQpIGV4aXN0LiAgSW4gc29tZSBsZWdhY3kgc2V0dXBzLCBpdCBpcworCWEgc3ltYm9saWMgbGluayBpbnN0ZWFkIG9mIGEgc3ltcmVmIHRoYXQgcG9pbnRzIGF0IHRoZSBjdXJyZW50CisJYnJhbmNoLgorKworSEVBRCBjYW4gYWxzbyByZWNvcmQgYSBzcGVjaWZpYyBjb21taXQgZGlyZWN0bHksIGluc3RlYWQgb2YKK2JlaW5nIGEgc3ltcmVmIHRvIHBvaW50IGF0IHRoZSBjdXJyZW50IGJyYW5jaC4gIFN1Y2ggYSBzdGF0ZQoraXMgb2Z0ZW4gY2FsbGVkICdkZXRhY2hlZCBIRUFEJywgYW5kIGFsbW9zdCBhbGwgY29tbWFuZHMgd29yaworaWRlbnRpY2FsbHkgYXMgbm9ybWFsLiAgU2VlIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIGZvcgorZGV0YWlscy4KKworYnJhbmNoZXM6OgorCUEgc2xpZ2h0bHkgZGVwcmVjYXRlZCB3YXkgdG8gc3RvcmUgc2hvcnRoYW5kcyB0byBiZSB1c2VkCisJdG8gc3BlY2lmeSBVUkwgdG8gYGdpdCBmZXRjaGAsIGBnaXQgcHVsbGAgYW5kIGBnaXQgcHVzaGAKKwljb21tYW5kcyBpcyB0byBzdG9yZSBhIGZpbGUgaW4gYGJyYW5jaGVzLyduYW1lJ2AgYW5kCisJZ2l2ZSAnbmFtZScgdG8gdGhlc2UgY29tbWFuZHMgaW4gcGxhY2Ugb2YgJ3JlcG9zaXRvcnknCisJYXJndW1lbnQuCisKK2hvb2tzOjoKKwlIb29rcyBhcmUgY3VzdG9taXphdGlvbiBzY3JpcHRzIHVzZWQgYnkgdmFyaW91cyBnaXQKKwljb21tYW5kcy4gIEEgaGFuZGZ1bCBvZiBzYW1wbGUgaG9va3MgYXJlIGluc3RhbGxlZCB3aGVuCisJYGdpdCBpbml0YCBpcyBydW4sIGJ1dCBhbGwgb2YgdGhlbSBhcmUgZGlzYWJsZWQgYnkKKwlkZWZhdWx0LiAgVG8gZW5hYmxlLCB0aGV5IG5lZWQgdG8gYmUgbWFkZSBleGVjdXRhYmxlLgorCVJlYWQgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CisJZWFjaCBob29rLgorCitpbmRleDo6CisJVGhlIGN1cnJlbnQgaW5kZXggZmlsZSBmb3IgdGhlIHJlcG9zaXRvcnkuICBJdCBpcworCXVzdWFsbHkgbm90IGZvdW5kIGluIGEgYmFyZSByZXBvc2l0b3J5LgorCitpbmZvOjoKKwlBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXBvc2l0b3J5IGlzIHJlY29yZGVkCisJaW4gdGhpcyBkaXJlY3RvcnkuCisKK2luZm8vcmVmczo6CisJVGhpcyBmaWxlIGhlbHBzIGR1bWIgdHJhbnNwb3J0cyBkaXNjb3ZlciB3aGF0IHJlZnMgYXJlCisJYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeS4gIElmIHRoZSByZXBvc2l0b3J5IGlzCisJcHVibGlzaGVkIGZvciBkdW1iIHRyYW5zcG9ydHMsIHRoaXMgZmlsZSBzaG91bGQgYmUKKwlyZWdlbmVyYXRlZCBieSBgZ2l0IHVwZGF0ZS1zZXJ2ZXItaW5mb2AgZXZlcnkgdGltZSBhIHRhZworCW9yIGJyYW5jaCBpcyBjcmVhdGVkIG9yIG1vZGlmaWVkLiAgVGhpcyBpcyBub3JtYWxseSBkb25lCisJZnJvbSB0aGUgYGhvb2tzL3VwZGF0ZWAgaG9vaywgd2hpY2ggaXMgcnVuIGJ5IHRoZQorCWBnaXQtcmVjZWl2ZS1wYWNrYCBjb21tYW5kIHdoZW4geW91IGBnaXQgcHVzaGAgaW50byB0aGUKKwlyZXBvc2l0b3J5LgorCitpbmZvL2dyYWZ0czo6CisJVGhpcyBmaWxlIHJlY29yZHMgZmFrZSBjb21taXQgYW5jZXN0cnkgaW5mb3JtYXRpb24sIHRvCisJcHJldGVuZCB0aGUgc2V0IG9mIHBhcmVudHMgYSBjb21taXQgaGFzIGlzIGRpZmZlcmVudAorCWZyb20gaG93IHRoZSBjb21taXQgd2FzIGFjdHVhbGx5IGNyZWF0ZWQuICBPbmUgcmVjb3JkCisJcGVyIGxpbmUgZGVzY3JpYmVzIGEgY29tbWl0IGFuZCBpdHMgZmFrZSBwYXJlbnRzIGJ5CisJbGlzdGluZyB0aGVpciA0MC1ieXRlIGhleGFkZWNpbWFsIG9iamVjdCBuYW1lcyBzZXBhcmF0ZWQKKwlieSBhIHNwYWNlIGFuZCB0ZXJtaW5hdGVkIGJ5IGEgbmV3bGluZS4KKworaW5mby9leGNsdWRlOjoKKwlUaGlzIGZpbGUsIGJ5IGNvbnZlbnRpb24gYW1vbmcgUG9yY2VsYWlucywgc3RvcmVzIHRoZQorCWV4Y2x1ZGUgcGF0dGVybiBsaXN0LiBgLmdpdGlnbm9yZWAgaXMgdGhlIHBlci1kaXJlY3RvcnkKKwlpZ25vcmUgZmlsZS4gIGBnaXQgc3RhdHVzYCwgYGdpdCBhZGRgLCBgZ2l0IHJtYCBhbmQgYGdpdAorCWNsZWFuYCBsb29rIGF0IGl0IGJ1dCB0aGUgY29yZSBnaXQgY29tbWFuZHMgZG8gbm90IGxvb2sKKwlhdCBpdC4gIFNlZSBhbHNvOiBnaXRsaW5rOmdpdGlnbm9yZVs1XS4KKworcmVtb3Rlczo6CisJU3RvcmVzIHNob3J0aGFuZHMgdG8gYmUgdXNlZCB0byBnaXZlIFVSTCBhbmQgZGVmYXVsdAorCXJlZm5hbWVzIHRvIGludGVyYWN0IHdpdGggcmVtb3RlIHJlcG9zaXRvcnkgdG8gYGdpdAorCWZldGNoYCwgYGdpdCBwdWxsYCBhbmQgYGdpdCBwdXNoYCBjb21tYW5kcy4KKworbG9nczo6CisJUmVjb3JkcyBvZiBjaGFuZ2VzIG1hZGUgdG8gcmVmcyBhcmUgc3RvcmVkIGluIHRoaXMKKwlkaXJlY3RvcnkuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gZ2l0LXVwZGF0ZS1yZWYKKwlmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworbG9ncy9yZWZzL2hlYWRzL2BuYW1lYDo6CisJUmVjb3JkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSBicmFuY2ggdGlwIG5hbWVkIGBuYW1lYC4KKworbG9ncy9yZWZzL3RhZ3MvYG5hbWVgOjoKKwlSZWNvcmRzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHRhZyBuYW1lZCBgbmFtZWAuCisKK3NoYWxsb3c6OgorCVRoaXMgaXMgc2ltaWxhciB0byBgaW5mby9ncmFmdHNgIGJ1dCBpcyBpbnRlcm5hbGx5IHVzZWQKKwlhbmQgbWFpbnRhaW5lZCBieSBzaGFsbG93IGNsb25lIG1lY2hhbmlzbS4gIFNlZSBgLS1kZXB0aGAKKwlvcHRpb24gdG8gZ2l0bGluazpnaXQtY2xvbmVbMV0gYW5kIGdpdGxpbms6Z2l0LWZldGNoWzFdLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWZvcm1hdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlM2M0NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stZm9ybWF0LnR4dApAQCAtMCwwICsxLDExOCBAQAorR0lUIHBhY2sgZm9ybWF0Cis9PT09PT09PT09PT09PT0KKworPSBwYWNrLSoucGFjayBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgLSBUaGUgaGVhZGVyIGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBhbmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICA0LWJ5dGUgc2lnbmF0dXJlOgorICAgICAgICAgVGhlIHNpZ25hdHVyZSBpczogeydQJywgJ0EnLCAnQycsICdLJ30KKworICAgICA0LWJ5dGUgdmVyc2lvbiBudW1iZXIgKG5ldHdvcmsgYnl0ZSBvcmRlcik6CisgICAgICAgICBHSVQgY3VycmVudGx5IGFjY2VwdHMgdmVyc2lvbiBudW1iZXIgMiBvciAzIGJ1dAorICAgICAgICAgZ2VuZXJhdGVzIHZlcnNpb24gMiBvbmx5LgorCisgICAgIDQtYnl0ZSBudW1iZXIgb2Ygb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIHBhY2sgKG5ldHdvcmsgYnl0ZSBvcmRlcikKKworICAgICBPYnNlcnZhdGlvbjogd2UgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDRHIHZlcnNpb25zIDstKSBhbmQKKyAgICAgbW9yZSB0aGFuIDRHIG9iamVjdHMgaW4gYSBwYWNrLgorCisgICAtIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgbnVtYmVyIG9mIG9iamVjdCBlbnRyaWVzLCBlYWNoIG9mCisgICAgIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKKworICAgICAodW5kZWx0aWZpZWQgcmVwcmVzZW50YXRpb24pCisgICAgIG4tYnl0ZSB0eXBlIGFuZCBsZW5ndGggKDMtYml0IHR5cGUsIChuLTEpKjcrNC1iaXQgbGVuZ3RoKQorICAgICBjb21wcmVzc2VkIGRhdGEKKworICAgICAoZGVsdGlmaWVkIHJlcHJlc2VudGF0aW9uKQorICAgICBuLWJ5dGUgdHlwZSBhbmQgbGVuZ3RoICgzLWJpdCB0eXBlLCAobi0xKSo3KzQtYml0IGxlbmd0aCkKKyAgICAgMjAtYnl0ZSBiYXNlIG9iamVjdCBuYW1lCisgICAgIGNvbXByZXNzZWQgZGVsdGEgZGF0YQorCisgICAgIE9ic2VydmF0aW9uOiBsZW5ndGggb2YgZWFjaCBvYmplY3QgaXMgZW5jb2RlZCBpbiBhIHZhcmlhYmxlCisgICAgIGxlbmd0aCBmb3JtYXQgYW5kIGlzIG5vdCBjb25zdHJhaW5lZCB0byAzMi1iaXQgb3IgYW55dGhpbmcuCisKKyAgLSBUaGUgdHJhaWxlciByZWNvcmRzIDIwLWJ5dGUgU0hBMSBjaGVja3N1bSBvZiBhbGwgb2YgdGhlIGFib3ZlLgorCis9IHBhY2stKi5pZHggZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgLSBUaGUgaGVhZGVyIGNvbnNpc3RzIG9mIDI1NiA0LWJ5dGUgbmV0d29yayBieXRlIG9yZGVyCisgICAgaW50ZWdlcnMuICBOLXRoIGVudHJ5IG9mIHRoaXMgdGFibGUgcmVjb3JkcyB0aGUgbnVtYmVyIG9mCisgICAgb2JqZWN0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBwYWNrLCB0aGUgZmlyc3QgYnl0ZSBvZiB3aG9zZQorICAgIG9iamVjdCBuYW1lIGFyZSBzbWFsbGVyIHRoYW4gTi4gIFRoaXMgaXMgY2FsbGVkIHRoZQorICAgICdmaXJzdC1sZXZlbCBmYW4tb3V0JyB0YWJsZS4KKworICAgIE9ic2VydmF0aW9uOiB3ZSB3b3VsZCBuZWVkIHRvIGV4dGVuZCB0aGlzIHRvIGFuIGFycmF5IG9mCisgICAgOC1ieXRlIGludGVnZXJzIHRvIGdvIGJleW9uZCA0RyBvYmplY3RzIHBlciBwYWNrLCBidXQgaXQgaXMKKyAgICBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LgorCisgIC0gVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBzb3J0ZWQgMjQtYnl0ZSBlbnRyaWVzLCBvbmUgZW50cnkKKyAgICBwZXIgb2JqZWN0IGluIHRoZSBwYWNrLiAgRWFjaCBlbnRyeSBpczoKKworICAgIDQtYnl0ZSBuZXR3b3JrIGJ5dGUgb3JkZXIgaW50ZWdlciwgcmVjb3JkaW5nIHdoZXJlIHRoZQorICAgIG9iamVjdCBpcyBzdG9yZWQgaW4gdGhlIHBhY2tmaWxlIGFzIHRoZSBvZmZzZXQgZnJvbSB0aGUKKyAgICBiZWdpbm5pbmcuCisKKyAgICAyMC1ieXRlIG9iamVjdCBuYW1lLgorCisgICAgT2JzZXJ2YXRpb246IHdlIHdvdWxkIGRlZmluaXRlbHkgbmVlZCB0byBleHRlbmQgdGhpcyB0bworICAgIDgtYnl0ZSBpbnRlZ2VyIHBsdXMgMjAtYnl0ZSBvYmplY3QgbmFtZSB0byBoYW5kbGUgYSBwYWNrZmlsZQorICAgIHRoYXQgaXMgbGFyZ2VyIHRoYW4gNEdCLgorCisgIC0gVGhlIGZpbGUgaXMgY29uY2x1ZGVkIHdpdGggYSB0cmFpbGVyOgorCisgICAgQSBjb3B5IG9mIHRoZSAyMC1ieXRlIFNIQTEgY2hlY2tzdW0gYXQgdGhlIGVuZCBvZgorICAgIGNvcnJlc3BvbmRpbmcgcGFja2ZpbGUuCisKKyAgICAyMC1ieXRlIFNIQTEtY2hlY2tzdW0gb2YgYWxsIG9mIHRoZSBhYm92ZS4KKworUGFjayBJZHggZmlsZToKKworCWlkeAorCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICAgIHwgZmFub3V0WzBdID0gMiAgICAgICAgICAgICAgICAgIHwtLgorCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKKwkgICAgfCBmYW5vdXRbMV0gICAgICAgICAgICAgICAgICAgICAgfCB8CisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorCSAgICB8IGZhbm91dFsyXSAgICAgICAgICAgICAgICAgICAgICB8IHwKKwkgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiB8CisJICAgIHwgZmFub3V0WzI1NV0gICAgICAgICAgICAgICAgICAgIHwgfAorCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKK21haW4JICAgIHwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAoraW5kZXgJICAgIHwgb2JqZWN0IG5hbWUgMDBYWFhYWFhYWFhYWFhYWFhYIHwgfAordGFibGUJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCAKKwkgICAgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisJICAgIHwgb2JqZWN0IG5hbWUgMDBYWFhYWFhYWFhYWFhYWFhYIHwgfAorCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKKwkgIC4tfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfDwrCisJICB8IHwgb2JqZWN0IG5hbWUgMDFYWFhYWFhYWFhYWFhYWFhYIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgfCB8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICB8IHwgb2JqZWN0IG5hbWUgMDFYWFhYWFhYWFhYWFhYWFhYIHwKKwkgIHwgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCSAgfCB8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICB8IHwgb2JqZWN0IG5hbWUgRkZYWFhYWFhYWFhYWFhYWFhYIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwordHJhaWxlcgkgIHwgfCBwYWNrZmlsZSBjaGVja3N1bSAgICAgICAgICAgICAgfAorCSAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICB8IHwgaWR4ZmlsZSBjaGVja3N1bSAgICAgICAgICAgICAgIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgIC4tLS0tLS0tLiAgICAgIAorICAgICAgICAgICAgICAgICAgfAorUGFjayBmaWxlIGVudHJ5OiA8KworCisgICAgIHBhY2tlZCBvYmplY3QgaGVhZGVyOgorCTEtYnl0ZSBzaXplIGV4dGVuc2lvbiBiaXQgKE1TQikKKwkgICAgICAgdHlwZSAobmV4dCAzIGJpdCkKKwkgICAgICAgc2l6ZTAgKGxvd2VyIDQtYml0KSAKKyAgICAgICAgbi1ieXRlIHNpemVOIChhcyBsb25nIGFzIE1TQiBpcyBzZXQsIGVhY2ggNy1iaXQpCisJCXNpemUwLi5zaXplTiBmb3JtIDQrNys3Ky4uKzcgYml0IGludGVnZXIsIHNpemUwCisJCWlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0LCBhbmQgc2l6ZU4gaXMgdGhlCisJCW1vc3Qgc2lnbmlmaWNhbnQgcGFydC4KKyAgICAgcGFja2VkIG9iamVjdCBkYXRhOgorICAgICAgICBJZiBpdCBpcyBub3QgREVMVEEsIHRoZW4gZGVmbGF0ZWQgYnl0ZXMgKHRoZSBzaXplIGFib3ZlCisJCWlzIHRoZSBzaXplIGJlZm9yZSBjb21wcmVzc2lvbikuCisJSWYgaXQgaXMgREVMVEEsIHRoZW4KKwkgIDIwLWJ5dGUgYmFzZSBvYmplY3QgbmFtZSBTSEExICh0aGUgc2l6ZSBhYm92ZSBpcyB0aGUKKwkgIAlzaXplIG9mIHRoZSBkZWx0YSBkYXRhIHRoYXQgZm9sbG93cykuCisgICAgICAgICAgZGVsdGEgZGF0YSwgZGVmbGF0ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWhldXJpc3RpY3MudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1oZXVyaXN0aWNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNlYjVkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1oZXVyaXN0aWNzLnR4dApAQCAtMCwwICsxLDQ2NiBAQAorICAgICAgICBDb25jZXJuaW5nIEdpdCdzIFBhY2tpbmcgSGV1cmlzdGljcworICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE9oLCBoZXJlJ3MgYSByZWFsbHkgc3R1cGlkIHF1ZXN0aW9uOgorCisgICAgICAgICAgICAgICAgICBXaGVyZSBkbyBJIGdvCisgICAgICAgICAgICAgICB0byBsZWFybiB0aGUgZGV0YWlscworCSAgICBvZiBnaXQncyBwYWNraW5nIGhldXJpc3RpY3M/CisKK0JlIGNhcmVmdWwgd2hhdCB5b3UgYXNrIQorCitGb2xsb3dlcnMgb2YgdGhlIGdpdCwgcGxlYXNlIG9wZW4gdGhlIGdpdCBJUkMgTG9nIGFuZCB0dXJuIHRvCitGZWJydWFyeSAxMCwgMjAwNi4KKworSXQncyBhIHJhcmUgb2NjYXNpb24sIGFuZCB3ZSBhcmUgam9pbmVkIGJ5IHRoZSBLaW5nIEdpdCBIaW1zZWxmLAorTGludXMgVG9ydmFsZHMgKGxpbnVzKS4gIE5hdGhhbmllbCBTbWl0aCwgKG5qc2ApLCBoYXMgdGhlIGZsb29yCithbmQgc2Vla3MgZW5saWdodGVubWVudC4gIE90aGVycyBhcmUgcHJlc2VudCwgYnV0IHNpbGVudC4KKworTGV0J3MgbGlzdGVuIGluIQorCisgICAgPG5qc2A+IE9oLCBoZXJlJ3MgYSByZWFsbHkgc3R1cGlkIHF1ZXN0aW9uIC0tIHdoZXJlIGRvIEkgZ28gdG8KKyAgICAgICAgbGVhcm4gdGhlIGRldGFpbHMgb2YgZ2l0J3MgcGFja2luZyBoZXVyaXN0aWNzPyAgZ29vZ2xlIGF2YWlscworICAgICAgICBtZSBub3QsIHJlYWRpbmcgdGhlIHNvdXJjZSBkaWRuJ3QgaGVscCBhIGxvdCwgYW5kIHdhZGluZworICAgICAgICB0aHJvdWdoIHRoZSB3aG9sZSBtYWlsaW5nIGxpc3Qgc2VlbXMgbGVzcyBlZmZpY2llbnQgdGhhbiBhbnkKKyAgICAgICAgb2YgdGhhdC4KKworSXQgaXMgYSBib2xkIHN0YXJ0ISAgQSBwbGVhIGZvciBoZWxwIGNvbWJpbmVkIHdpdGggYSBzaW11bHRhbmVvdXMKK3RyaS1wYXJ0IGF0dGFjayBvbiBzb21lIG9mIHRoZSB0cmllZCBhbmQgdHJ1ZSBtYWluc3RheXMgaW4gdGhlIHF1ZXN0Citmb3IgZW5saWdodGVubWVudC4gIEJyYXNoIGFjY3VzYXRpb25zIG9mIGdvb2dsZSBiZWluZyB1c2VsZXNzLiBIdWJyaXMhCitNYWxpZ25pbmcgdGhlIHNvdXJjZS4gIEhlcmVzeSEgIERpc2RhaW4gZm9yIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMuCitXb2UuCisKKyAgICA8cGFza3k+IHllcywgdGhlIHBhY2tpbmctcmVsYXRlZCBkZWx0YSBzdHVmZiBpcyBzb21ld2hhdAorICAgICAgICBteXN0ZXJpb3VzIGV2ZW4gZm9yIG1lIDspCisKK0FoISAgTW9kZXN0eSBhZnRlciBhbGwuCisKKyAgICA8bGludXM+IG5qcywgSSBkb24ndCB0aGluayB0aGUgZG9jcyBleGlzdC4gVGhhdCdzIHNvbWV0aGluZyB3aGVyZQorCSBJIGRvbid0IHRoaW5rIGFueWJvZHkgZWxzZSB0aGFuIG1lIGV2ZW4gcmVhbGx5IGdvdCBpbnZvbHZlZC4KKwkgTW9zdCBvZiB0aGUgcmVzdCBvZiBnaXQgb3RoZXJzIGhhdmUgYmVlbiBidXN5IHdpdGggKGVzcGVjaWFsbHkKKwkgSnVuaW8pLCBidXQgcGFja2luZyBub2JvZHkgdG91Y2hlZCBhZnRlciBJIGRpZCBpdC4KKworSXQncyBjcnlwdGljLCB5ZXQgdmFndWUuICBMaW51cyBpbiBzdHlsZSBmb3Igc3VyZS4gIFdpc2UgbWVuCitpbnRlcnByZXQgdGhpcyBhcyBhbiBhcG9sb2d5LiAgQSBmZXcgYXJndWUgaXQgaXMgbWVyZWx5IGEKK3N0YXRlbWVudCBvZiBmYWN0LgorCisgICAgPG5qc2A+IEkgZ3Vlc3MgdGhlIG5leHQgc3RlcCBpcyAicmVhZCB0aGUgc291cmNlIGFnYWluIiwgYnV0IEkKKyAgICAgICAgaGF2ZSB0byBidWlsZCB1cCBhIGNlcnRhaW4gbGV2ZWwgb2YgZ3VtcHRpb24gZmlyc3QgOi0pCisKK0luZGVlZCEgIE9uIGJvdGggcG9pbnRzLgorCisgICAgPGxpbnVzPiBUaGUgcGFja2luZyBoZXVyaXN0aWMgaXMgYWN0dWFsbHkgcmVhbGx5IHJlYWxseSBzaW1wbGUuCisKK0JhaXQuLi4KKworICAgIDxsaW51cz4gQnV0IHN0cmFuZ2UuCisKK0FuZCBzd2l0Y2guICBUaGF0IG91Z2h0IHRvIGRvIGl0IQorCisgICAgPGxpbnVzPiBSZW1lbWJlcjogZ2l0IHJlYWxseSBkb2Vzbid0IGZvbGxvdyBmaWxlcy4gU28gd2hhdCBpdCBkb2VzIGlzCisgICAgICAgIC0gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBvYmplY3RzCisgICAgICAgIC0gc29ydCB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gbWFnaWMgaGV1cmlzdGljcworICAgICAgICAtIHdhbGsgdGhlIGxpc3QsIHVzaW5nIGEgc2xpZGluZyB3aW5kb3csIHNlZWluZyBpZiBhbiBvYmplY3QKKyAgICAgICAgICBjYW4gYmUgZGlmZmVkIGFnYWluc3QgYW5vdGhlciBvYmplY3QgaW4gdGhlIHdpbmRvdworICAgICAgICAtIHdyaXRlIG91dCB0aGUgbGlzdCBpbiByZWNlbmN5IG9yZGVyCisKK1RoZSB0cmFkaXRpb25hbCB1bmRlcnN0YXRlbWVudDoKKworICAgIDxuanNgPiBJIHN1c3BlY3QgdGhhdCB3aGF0IEknbSBtaXNzaW5nIGlzIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gb2YKKyAgICAgICAgdGhlIHdvcmQgIm1hZ2ljIgorCitUaGUgdHJhZGl0aW9uYWwgaW5zaWdodDoKKworICAgIDxwYXNreT4geWVzCisKK0FuZCBCYWJlbC1saWtlIGNvbmZ1c2lvbiBmbG93ZWQuCisKKyAgICA8bmpzYD4gb2gsIGhtbSwgYW5kIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgc2xpZGluZyB3aW5kb3cgbWVhbnMgZWl0aGVyCisKKyAgICA8cGFza3k+IGlpcmMsIGl0IGFwcGVhcmVkIHRvIG1lIHRvIGJlIGp1c3QgdGhlIHNoYTEgb2YgdGhlIG9iamVjdAorICAgICAgICB3aGVuIHJlYWRpbmcgdGhlIGNvZGUgY2FzdWFsbHkgLi4uCisKKyAgICAgICAgLi4uIHdoaWNoIHNpbXBseSBkb2Vzbid0IHNvdW5kIGFzIGEgdmVyeSBnb29kIGhldXJpc3RpY3MsIHRob3VnaCA7KQorCisgICAgPG5qc2A+IC4uLi4uYW5kIHJlY2VuY3kgb3JkZXIuICBva2F5LCBJIHRoaW5rIGl0J3MgY2xlYXIgSSBkaWRuJ3QKKyAgICAgICBldmVuIHJlYWxpemUgaG93IG11Y2ggSSB3YXNuJ3QgcmVhbGl6aW5nIDotKQorCitBaCwgZ3Jhc3Nob3BwZXIhICBBbmQgdGh1cyB0aGUgZW5saWdodGVubWVudCBiZWdpbnMgYW5ldy4KKworICAgIDxsaW51cz4gVGhlICJtYWdpYyIgaXMgYWN0dWFsbHkgaW4gdGhlb3J5IHRvdGFsbHkgYXJiaXRyYXJ5LgorICAgICAgICBBTlkgb3JkZXIgd2lsbCBnaXZlIHlvdSBhIHdvcmtpbmcgcGFjaywgYnV0IG5vLCBpdCdzIG5vdAorICAgICAgICBvcmRlcmVkIGJ5IFNIQTEuCisKKyAgICAgICAgQmVmb3JlIHRhbGtpbmcgYWJvdXQgdGhlIG9yZGVyaW5nIGZvciB0aGUgc2xpZGluZyBkZWx0YQorICAgICAgICB3aW5kb3csIGxldCdzIHRhbGsgYWJvdXQgdGhlIHJlY2VuY3kgb3JkZXIuIFRoYXQncyBtb3JlCisgICAgICAgIGltcG9ydGFudCBpbiBvbmUgd2F5LgorCisgICAgPG5qc2A+IFJpZ2h0LCBidXQgaWYgYWxsIHlvdSB3YW50IGlzIGEgd29ya2luZyB3YXkgdG8gcGFjayB0aGluZ3MKKyAgICAgICAgdG9nZXRoZXIsIHlvdSBjb3VsZCBqdXN0IHVzZSBjYXQgYW5kIHNhdmUgeW91cnNlbGYgc29tZQorICAgICAgICB0cm91YmxlLi4uCisKK1dhYWFpdCBmb3IgaXQuLi4uCisKKyAgICA8bGludXM+IFRoZSByZWNlbmN5IG9yZGVyaW5nICh3aGljaCBpcyBiYXNpY2FsbHk6IHB1dCBvYmplY3RzCisgICAgICAgIF9waHlzaWNhbGx5XyBpbnRvIHRoZSBwYWNrIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlCisgICAgICAgICJyZWFjaGFibGUiIGZyb20gdGhlIGhlYWQpIGlzIGltcG9ydGFudC4KKworICAgIDxuanNgPiBva2F5CisKKyAgICA8bGludXM+IEl0J3MgaW1wb3J0YW50IGJlY2F1c2UgdGhhdCdzIHRoZSB0aGluZyB0aGF0IGdpdmVzIHBhY2tzCisgICAgICAgIGdvb2QgbG9jYWxpdHkuIEl0IGtlZXBzIHRoZSBvYmplY3RzIGNsb3NlIHRvIHRoZSBoZWFkICh3aGV0aGVyCisgICAgICAgIHRoZXkgYXJlIG9sZCBvciBuZXcsIGJ1dCB0aGV5IGFyZSBfcmVhY2hhYmxlXyBmcm9tIHRoZSBoZWFkKQorICAgICAgICBhdCB0aGUgaGVhZCBvZiB0aGUgcGFjay4gU28gcGFja3MgYWN0dWFsbHkgaGF2ZSBhYnNvbHV0ZWx5CisgICAgICAgIF93b25kZXJmdWxfIElPIHBhdHRlcm5zLgorCitSZWFkIHRoYXQgYWdhaW4sIGJlY2F1c2UgaXQgaXMgaW1wb3J0YW50LgorCisgICAgPGxpbnVzPiBCdXQgcmVjZW5jeSBvcmRlcmluZyBpcyB0b3RhbGx5IHVzZWxlc3MgZm9yIGRlY2lkaW5nIGhvdworICAgICAgICB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgZGVsdGFzLCBzbyB0aGUgZGVsdGEgb3JkZXJpbmcgaXMKKyAgICAgICAgc29tZXRoaW5nIGVsc2UuCisKKyAgICAgICAgVGhlIGRlbHRhIG9yZGVyaW5nIGlzICh3YWl0IGZvciBpdCk6CisgICAgICAgIC0gZmlyc3Qgc29ydCBieSB0aGUgImJhc2VuYW1lIiBvZiB0aGUgb2JqZWN0LCBhcyBkZWZpbmVkIGJ5CisgICAgICAgICAgdGhlIG5hbWUgdGhlIG9iamVjdCB3YXMgX2ZpcnN0XyByZWFjaGVkIHRocm91Z2ggd2hlbgorICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIG9iamVjdCBsaXN0CisgICAgICAgIC0gd2l0aGluIHRoZSBzYW1lIGJhc2VuYW1lLCBzb3J0IGJ5IHNpemUgb2YgdGhlIG9iamVjdAorICAgICAgICAtIGJ1dCBhbHdheXMgc29ydCBkaWZmZXJlbnQgdHlwZXMgc2VwYXJhdGVseSAoY29tbWl0cyBmaXJzdCkuCisKKyAgICAgICAgVGhhdCdzIG5vdCBleGFjdGx5IGl0LCBidXQgaXQncyB2ZXJ5IGNsb3NlLgorCisgICAgPG5qc2A+IFRoZSAiX2ZpcnN0XyByZWFjaGVkIiB0aGluZyBpcyBub3QgdG9vIGltcG9ydGFudCwganVzdCB5b3UKKyAgICAgICAgbmVlZCBzb21lIHdheSB0byBicmVhayB0aWVzIHNpbmNlIHRoZSBzYW1lIG9iamVjdHMgbWF5IGJlCisgICAgICAgIHJlYWNoYWJsZSBtYW55IHdheXMsIHllcz8KKworQW5kIGFzIGlmIHRvIGNsYXJpZnk6CisKKyAgICA8bGludXM+IFRoZSBwb2ludCBpcyB0aGF0IGl0J3MgYWxsIHJlYWxseSBqdXN0IGFueSByYW5kb20KKyAgICAgICAgaGV1cmlzdGljLCBhbmQgdGhlIG9yZGVyaW5nIGlzIHRvdGFsbHkgdW5pbXBvcnRhbnQgZm9yCisgICAgICAgIGNvcnJlY3RuZXNzLCBidXQgaXQgaGVscHMgYSBsb3QgaWYgdGhlIGhldXJpc3RpYyBnaXZlcworICAgICAgICAiY2x1bXBpbmciIGZvciB0aGluZ3MgdGhhdCBhcmUgbGlrZWx5IHRvIGRlbHRhIHdlbGwgYWdhaW5zdAorICAgICAgICBlYWNoIG90aGVyLgorCitJdCBpcyBhbiBpbXBvcnRhbnQgcG9pbnQsIHNvIHNlY3JldGx5LCBJIGRpZCBteSBvd24gcmVzZWFyY2ggYW5kIGhhdmUKK2luY2x1ZGVkIG15IHJlc3VsdHMgYmVsb3cuICBUbyBiZSBmYWlyLCBpdCBoYXMgY2hhbmdlZCBzb21lIG92ZXIgdGltZS4KK0FuZCB0aHJvdWdoIHRoZSBtYWdpYyBvZiBSZXZpc2lvbmlzdGljIEhpc3RvcnksIEkgZHJhdyB1cG9uIHRoaXMgZW50cnkKK2Zyb20gVGhlIEdpdCBJUkMgTG9ncyBvbiBteSBmYXRoZXIncyBiaXJ0aGRheSwgTWFyY2ggMToKKworICAgIDxnaXRzdGVyPiBUaGUgcXVvdGUgZnJvbSB0aGUgYWJvdmUgbGludXMgc2hvdWxkIGJlIHJld3JpdHRlbiBhCisgICAgICAgIGJpdCAod2FpdCBmb3IgaXQpOgorICAgICAgICAtIGZpcnN0IHNvcnQgYnkgdHlwZS4gIERpZmZlcmVudCBvYmplY3RzIG5ldmVyIGRlbHRhIHdpdGgKKwkgIGVhY2ggb3RoZXIuCisgICAgICAgIC0gdGhlbiBzb3J0IGJ5IGZpbGVuYW1lL2Rpcm5hbWUuICBoYXNoIG9mIHRoZSBiYXNlbmFtZQorICAgICAgICAgIG9jY3VwaWVzIHRoZSB0b3AgQklUU19QRVJfSU5ULURJUl9CSVRTIGJpdHMsIGFuZCBib3R0b20KKyAgICAgICAgICBESVJfQklUUyBhcmUgZm9yIHRoZSBoYXNoIG9mIGxlYWRpbmcgcGF0aCBlbGVtZW50cy4KKyAgICAgICAgLSB0aGVuIGlmIHdlIGFyZSBkb2luZyAidGhpbiIgcGFjaywgdGhlIG9iamVjdHMgd2UgYXJlIF9ub3RfCisgICAgICAgICAgZ29pbmcgdG8gcGFjayBidXQgd2Uga25vdyBhYm91dCBhcmUgc29ydGVkIGVhcmxpZXIgdGhhbgorICAgICAgICAgIG90aGVyIG9iamVjdHMuCisgICAgICAgIC0gYW5kIGZpbmFsbHkgc29ydCBieSBzaXplLCBsYXJnZXIgdG8gc21hbGxlci4KKworSW4gb25lIHN3ZWxsLWZvb3AsIGNsYXJpZmljYXRpb24gYW5kIG9ic2N1cmlmaWNhdGlvbiEgIE5vbmV0aGVsZXNzLAorYXV0aG9yaXRhdGl2ZS4gIENyeXB0aWMsIHlldCBjb25jaXNlLiAgSXQgZXZlbiBzb2xpY2l0cyBub3Rpb25zIG9mCitxdW90ZXMgZnJvbSBUaGUgU291cmNlIENvZGUuICBDbGVhcmx5LCBtb3JlIHN0dWR5IGlzIG5lZWRlZC4KKworICAgIDxnaXRzdGVyPiBUaGF0J3MgdGhlIHNvcnQgb3JkZXIuICBXaGF0IHRoaXMgbWVhbnMgaXM6CisgICAgICAgIC0gd2UgZG8gbm90IGRlbHRhIGRpZmZlcmVudCBvYmplY3QgdHlwZXMuCisJLSB3ZSBwcmVmZXIgdG8gZGVsdGEgdGhlIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBmdWxsIHBhdGgsIGJ1dAorICAgICAgICAgIGFsbG93IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKwktIHdlIGFsd2F5cyBwcmVmZXIgdG8gZGVsdGEgYWdhaW5zdCBvYmplY3RzIHdlIGFyZSBub3QgZ29pbmcKKyAgICAgICAgICB0byBzZW5kLCBpZiB0aGVyZSBhcmUgc29tZS4KKwktIHdlIHByZWZlciB0byBkZWx0YSBhZ2FpbnN0IGxhcmdlciBvYmplY3RzLCBzbyB0aGF0IHdlIGhhdmUKKyAgICAgICAgICBsb3RzIG9mIHJlbW92YWxzLgorCisgICAgICAgIFRoZSBwZW51bHRpbWF0ZSBydWxlIGlzIGZvciAidGhpbiIgcGFja3MuICBJdCBpcyB1c2VkIHdoZW4KKyAgICAgICAgdGhlIG90aGVyIHNpZGUgaXMga25vd24gdG8gaGF2ZSBzdWNoIG9iamVjdHMuCisKK1RoZXJlIGl0IGlzIGFnYWluLiAiVGhpbiIgcGFja3MuICBJJ20gdGhpbmtpbmcgdG8gbXlzZWxmLCAiV2hhdAoraXMgYSAndGhpbicgcGFjaz8iICBTbyBJIGFzazoKKworICAgIDxqZGw+IFdoYXQgaXMgYSAidGhpbiIgcGFjaz8KKworICAgIDxnaXRzdGVyPiBVc2Ugb2YgLS1vYmplY3RzLWVkZ2UgdG8gcmV2LWxpc3QgYXMgdGhlIHVwc3RyZWFtIG9mCisgICAgICAgIHBhY2stb2JqZWN0cy4gIFRoZSBwYWNrIHRyYW5zZmVyIHByb3RvY29sIG5lZ290aWF0ZXMgdGhhdC4KKworV29vIGhvbyEgIENsZWFyZWQgdGhhdCBfcmlnaHRfIHVwIQorCisgICAgPGdpdHN0ZXI+IFRoZXJlIGFyZSB0d28gZGlyZWN0aW9ucyAtIHB1c2ggYW5kIGZldGNoLgorCitUaGVyZSEgIERpZCB5b3Ugc2VlIGl0PyAgSXQgaXMgbm90ICcicHVzaCIgYW5kICJwdWxsIichICBIb3cgb2Z0ZW4gdGhlCitjb25mdXNpb24gaGFzIHN0YXJ0ZWQgaGVyZS4gIFNvIGNhc3VhbGx5IG1lbnRpb25lZCwgdG9vIQorCisgICAgPGdpdHN0ZXI+IEZvciBwdXNoLCBnaXQtc2VuZC1wYWNrIGludm9rZXMgZ2l0LXJlY2VpdmUtcGFjayBvbiB0aGUKKyAgICAgICAgb3RoZXIgZW5kLiAgVGhlIHJlY2VpdmUtcGFjayBzYXlzICJJIGhhdmUgdXAgdG8gdGhlc2UgY29tbWl0cyIuCisgICAgICAgIHNlbmQtcGFjayBsb29rcyBhdCB0aGVtLCBhbmQgY29tcHV0ZXMgd2hhdCBhcmUgbWlzc2luZyBmcm9tCisgICAgICAgIHRoZSBvdGhlciBlbmQuICBTbyAidGhpbiIgY291bGQgYmUgdGhlIGRlZmF1bHQgdGhlcmUuCisKKyAgICAgICAgSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgZmV0Y2gsIGdpdC1mZXRjaC1wYWNrIGFuZAorICAgICAgICBnaXQtY2xvbmUtcGFjayBpbnZva2VzIGdpdC11cGxvYWQtcGFjayBvbiB0aGUgb3RoZXIgZW5kCisJKHZpYSBzc2ggb3IgYnkgdGFsa2luZyB0byB0aGUgZGFlbW9uKS4KKworCVRoZXJlIGFyZSB0d28gY2FzZXM6IGZldGNoLXBhY2sgd2l0aCAtayBhbmQgY2xvbmUtcGFjayBpcyBvbmUsCisgICAgICAgIGZldGNoLXBhY2sgd2l0aG91dCAtayBpcyB0aGUgb3RoZXIuICBjbG9uZS1wYWNrIGFuZCBmZXRjaC1wYWNrCisgICAgICAgIHdpdGggLWsgd2lsbCBrZWVwIHRoZSBkb3dubG9hZGVkIHBhY2tmaWxlIHdpdGhvdXQgZXhwYW5kZWQsIHNvCisgICAgICAgIHdlIGRvIG5vdCB1c2UgdGhpbiBwYWNrIHRyYW5zZmVyLiAgT3RoZXJ3aXNlLCB0aGUgZ2VuZXJhdGVkCisgICAgICAgIHBhY2sgd2lsbCBoYXZlIGRlbHRhIHdpdGhvdXQgYmFzZSBvYmplY3QgaW4gdGhlIHNhbWUgcGFjay4KKworICAgICAgICBCdXQgZmV0Y2gtcGFjayB3aXRob3V0IC1rIHdpbGwgZXhwbG9kZSB0aGUgcmVjZWl2ZWQgcGFjayBpbnRvCisgICAgICAgIGluZGl2aWR1YWwgb2JqZWN0cywgc28gd2UgYXV0b21hdGljYWxseSBhc2sgdXBsb2FkLXBhY2sgdG8KKyAgICAgICAgZ2l2ZSB1cyBhIHRoaW4gcGFjayBpZiB1cGxvYWQtcGFjayBzdXBwb3J0cyBpdC4KKworT0sgdGhlbi4KKworVWguCisKK0xldCdzIHJldHVybiB0byB0aGUgcHJldmlvdXMgY29udmVyc2F0aW9uIHN0aWxsIGluIHByb2dyZXNzLgorCisgICAgPG5qc2A+IGFuZCAiYmFzZW5hbWUiIG1lYW5zIHNvbWV0aGluZyBsaWtlICJ0aGUgdGFpbCBvZiBlbmQgb2YKKyAgICAgICAgcGF0aCBvZiBmaWxlIG9iamVjdHMgYW5kIGRpciBvYmplY3RzLCBhcyBwZXIgYmFzZW5hbWUoMyksIGFuZAorICAgICAgICB3ZSBqdXN0IGRlY2xhcmUgYWxsIGNvbW1pdCBhbmQgdGFnIG9iamVjdHMgdG8gaGF2ZSB0aGUgc2FtZQorICAgICAgICBiYXNlbmFtZSIgb3Igc29tZXRoaW5nPworCitMdWNraWx5LCB0aGF0IHRvbyBpcyBhIHBvaW50IHRoYXQgZ2l0c3RlciBjbGFyaWZpZWQgZm9yIHVzIQorCitJZiBJIG1pZ2h0IGFkZCwgdGhlIHRyaWNrIGlzIHRvIG1ha2UgZmlsZXMgdGhhdCBfbWlnaHRfIGJlIHNpbWlsYXIgYmUKK2xvY2F0ZWQgY2xvc2UgdG8gZWFjaCBvdGhlciBpbiB0aGUgaGFzaCBidWNrZXRzIGJhc2VkIG9uIHRoZWlyIGZpbGUKK25hbWVzLiAgSXQgdXNlZCB0byBiZSB0aGF0ICJmb28vTWFrZWZpbGUiLCAiYmFyL2Jhei9xdXV4L01ha2VmaWxlIiBhbmQKKyJNYWtlZmlsZSIgYWxsIGxhbmRlZCBpbiB0aGUgc2FtZSBidWNrZXQgZHVlIHRvIHRoZWlyIGNvbW1vbiBiYXNlbmFtZSwKKyJNYWtlZmlsZSIuIEhvd2V2ZXIsIG5vdyB0aGV5IGxhbmQgaW4gImNsb3NlIiBidWNrZXRzLgorCitUaGUgYWxnb3JpdGhtIGFsbG93cyBub3QganVzdCBmb3IgdGhlIF9zYW1lXyBidWNrZXQsIGJ1dCBmb3IgX2Nsb3NlXworYnVja2V0cyB0byBiZSBjb25zaWRlcmVkIGRlbHRhIGNhbmRpZGF0ZXMuICBUaGUgcmF0aW9uYWxlIGlzCitlc3NlbnRpYWxseSB0aGF0IGZpbGVzLCBsaWtlIE1ha2VmaWxlcywgb2Z0ZW4gaGF2ZSB2ZXJ5IHNpbWlsYXIKK2NvbnRlbnQgbm8gbWF0dGVyIHdoYXQgZGlyZWN0b3J5IHRoZXkgbGl2ZSBpbi4KKworICAgIDxsaW51cz4gSSBwbGF5ZWQgYXJvdW5kIHdpdGggZGlmZmVyZW50IGRlbHRhIGFsZ29yaXRobXMsIGFuZCB3aXRoCisgICAgICAgIG1ha2luZyB0aGUgImRlbHRhIHdpbmRvdyIgYmlnZ2VyLCBidXQgaGF2aW5nIHRvbyBiaWcgb2YgYQorICAgICAgICBzbGlkaW5nIHdpbmRvdyBtYWtlcyBpdCB2ZXJ5IGV4cGVuc2l2ZSB0byBnZW5lcmF0ZSB0aGUgcGFjazoKKyAgICAgICAgeW91IG5lZWQgdG8gY29tcGFyZSBldmVyeSBvYmplY3Qgd2l0aCBhIF90b25fIG9mIG90aGVyIG9iamVjdHMuCisKKyAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIHRyaXZpYWwgaGV1cmlzdGljcyB0b28sIHdoaWNoCisgICAgICAgIGJhc2ljYWxseSBib2lsIGRvd24gdG8gImRvbid0IGJvdGhlciBldmVuIHRyeWluZyB0byBkZWx0YSB0aGlzCisgICAgICAgIHBhaXIiIGlmIHdlIGNhbiB0ZWxsIGJlZm9yZS1oYW5kIHRoYXQgdGhlIGRlbHRhIGlzbid0IHdvcnRoIGl0CisgICAgICAgIChkdWUgdG8gc2l6ZSBkaWZmZXJlbmNlcywgd2hlcmUgd2UgY2FuIHRha2UgYSBwcmV2aW91cyBkZWx0YQorICAgICAgICByZXN1bHQgaW50byBhY2NvdW50IHRvIGRlY2lkZSB0aGF0ICJvaywgbm8gcG9pbnQgaW4gdHJ5aW5nCisgICAgICAgIHRoYXQgb25lLCBpdCB3aWxsIGJlIHdvcnNlIikuCisKKyAgICAgICAgRW5kIHJlc3VsdDogcGFja2luZyBpcyBhY3R1YWxseSB2ZXJ5IHNpemUgZWZmaWNpZW50LiBJdCdzCisgICAgICAgIHNvbWV3aGF0IENQVS13YXN0ZWZ1bCwgYnV0IG9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB5b3UncmUKKyAgICAgICAgcmVhbGx5IG9ubHkgc3VwcG9zZWQgdG8gZG8gaXQgbWF5YmUgb25jZSBhIG1vbnRoIChhbmQgeW91IGNhbgorICAgICAgICBkbyBpdCBkdXJpbmcgdGhlIG5pZ2h0KSwgbm9ib2R5IHJlYWxseSBzZWVtcyB0byBjYXJlLgorCitOaWNlIEVuZ2luZWVyaW5nIFRvdWNoLCB0aGVyZS4gIEZpbmQgd2hlbiBpdCBkb2Vzbid0IG1hdHRlciwgYW5kCitwcm9jbGFpbSBpdCBhIG5vbi1pc3N1ZS4gIEdvb2Qgc3R5bGUgdG9vIQorCisgICAgPG5qc2A+IFNvLCBqdXN0IHRvIHJlcGVhdCB0byBzZWUgaWYgSSdtIGZvbGxvd2luZywgd2Ugc3RhcnQgYnkKKyAgICAgICAgZ2V0dGluZyBhIGxpc3Qgb2YgdGhlIG9iamVjdHMgd2Ugd2FudCB0byBwYWNrLCB3ZSBzb3J0IGl0IGJ5CisgICAgICAgIHRoaXMgaGV1cmlzdGljIChiYXNpY2FsbHkgbGV4aWNvZ3JhcGhpY2FsbHkgb24gdGhlIHR1cGxlCisgICAgICAgICh0eXBlLCBiYXNlbmFtZSwgc2l6ZSkpLgorCisgICAgICAgIFRoZW4gd2Ugd2FsayB0aHJvdWdoIHRoaXMgbGlzdCwgYW5kIGNhbGN1bGF0ZSBhIGRlbHRhIG9mCisgICAgICAgIGVhY2ggb2JqZWN0IGFnYWluc3QgdGhlIGxhc3QgbiAodHVuYWJsZSBwYXJhbWV0ZXIpIG9iamVjdHMsCisgICAgICAgIGFuZCBwaWNrIHRoZSBzbWFsbGVzdCBvZiB0aGVzZSBkZWx0YXMuCisKK1Zhc3RseSBzaW1wbGlmaWVkLCBidXQgdGhlIGVzc2VuY2UgaXMgdGhlcmUhCisKKyAgICA8bGludXM+IENvcnJlY3QuCisKKyAgICA8bmpzYD4gQW5kIHRoZW4gb25jZSB3ZSBoYXZlIHBpY2tlZCBhIGRlbHRhIG9yIGZ1bGx0ZXh0IHRvCisgICAgICAgIHJlcHJlc2VudCBlYWNoIG9iamVjdCwgd2UgcmUtc29ydCBieSByZWNlbmN5LCBhbmQgd3JpdGUgdGhlbQorICAgICAgICBvdXQgaW4gdGhhdCBvcmRlci4KKworICAgIDxsaW51cz4gWXVwLiBTb21lIG90aGVyIHNtYWxsIGRldGFpbHM6CisKK0FuZCBvZiBjb3Vyc2UgdGhlcmUgaXMgdGhlICJPdGhlciBTaG9lIiBGYWN0b3IgdG9vLgorCisgICAgPGxpbnVzPiAtIFdlIGxpbWl0IHRoZSBkZWx0YSBkZXB0aCB0byBhbm90aGVyIG1hZ2ljIHZhbHVlIChyaWdodAorICAgICAgICBub3cgYm90aCB0aGUgd2luZG93IGFuZCBkZWx0YSBkZXB0aCBtYWdpYyB2YWx1ZXMgYXJlIGp1c3QgIjEwIikKKworICAgIDxuanNgPiBIcm0sIG15IGludHVpdGlvbiBpcyB0aGF0IHlvdSdkIGVuZCB1cCB3aXRoIHJlYWxseSBfYmFkXyBJTworICAgICAgICBwYXR0ZXJucywgYmVjYXVzZSB0aGUgdGhpbmdzIHlvdSB3YW50IGFyZSBuZWFyIGJ5LCBidXQgdG8KKyAgICAgICAgYWN0dWFsbHkgcmVjb25zdHJ1Y3QgdGhlbSB5b3UgbWF5IGhhdmUgdG8ganVtcCBhbGwgb3ZlciBpbgorICAgICAgICByYW5kb20gd2F5cy4KKworICAgIDxsaW51cz4gLSBXaGVuIHdlIHdyaXRlIG91dCBhIGRlbHRhLCBhbmQgd2UgaGF2ZW4ndCB5ZXQgd3JpdHRlbgorICAgICAgICBvdXQgdGhlIG9iamVjdCBpdCBpcyBhIGRlbHRhIGFnYWluc3QsIHdlIHdyaXRlIG91dCB0aGUgYmFzZQorICAgICAgICBvYmplY3QgZmlyc3QuICBBbmQgbm8sIHdoZW4gd2UgcmVjb25zdHJ1Y3QgdGhlbSwgd2UgYWN0dWFsbHkKKyAgICAgICAgZ2V0IG5pY2UgSU8gcGF0dGVybnMsIGJlY2F1c2U6CisgICAgICAgIC0gbGFyZ2VyIG9iamVjdHMgdGVuZCB0byBiZSAibW9yZSByZWNlbnQiIChMaW51cycgbGF3OiBmaWxlcyBncm93KQorICAgICAgICAtIHdlIGFjdGl2ZWx5IHRyeSB0byBnZW5lcmF0ZSBkZWx0YXMgZnJvbSBhIGxhcmdlciBvYmplY3QgdG8gYQorICAgICAgICAgIHNtYWxsZXIgb25lCisgICAgICAgIC0gdGhpcyBtZWFucyB0aGF0IHRoZSB0b3Atb2YtdHJlZSB2ZXJ5IHNlbGRvbSBoYXMgZGVsdGFzCisgICAgICAgICAgKGkuZS4gZGVsdGFzIGluIF9wcmFjdGljZV8gYXJlICJiYWNrd2FyZHMgZGVsdGFzIikKKworQWdhaW4sIHdlIHNob3VsZCByZXJlYWQgdGhhdCB3aG9sZSBwYXJhZ3JhcGguICBOb3QganVzdCBiZWNhdXNlCitMaW51cyBoYXMgc2xpcHBlZCBMaW51cydzIExhdyBpbiB0aGVyZSBvbiB1cywgYnV0IGJlY2F1c2UgaXQgaXMKK2ltcG9ydGFudC4gIExldCdzIG1ha2Ugc3VyZSB3ZSBjbGFyaWZ5IHNvbWUgb2YgdGhlIHBvaW50cyBoZXJlOgorCisgICAgPG5qc2A+IFNvIHRoZSBwb2ludCBpcyBqdXN0IHRoYXQgaW4gcHJhY3RpY2UsIGRlbHRhIG9yZGVyIGFuZAorICAgICAgICByZWNlbmN5IG9yZGVyIG1hdGNoIGVhY2ggb3RoZXIgcXVpdGUgd2VsbC4KKworICAgIDxsaW51cz4gWWVzLiBUaGVyZSdzIGFub3RoZXIgbmljZSBzaWRlIHRvIHRoaXMgKGFuZCB5ZXMsIGl0IHdhcworCWRlc2lnbmVkIHRoYXQgd2F5IDspOgorICAgICAgICAtIHRoZSByZWFzb24gd2UgZ2VuZXJhdGUgZGVsdGFzIGFnYWluc3QgdGhlIGxhcmdlciBvYmplY3QgaXMKKwkgIGFjdHVhbGx5IGEgYmlnIHNwYWNlIHNhdmVyIHRvbyEKKworICAgIDxuanNgPiBIbW0sIGJ1dCB5b3VyIGxhc3QgY29tbWVudCAoaWYgIndlIGhhdmVuJ3QgeWV0IHdyaXR0ZW4gb3V0CisgICAgICAgIHRoZSBvYmplY3QgaXQgaXMgYSBkZWx0YSBhZ2FpbnN0LCB3ZSB3cml0ZSBvdXQgdGhlIGJhc2Ugb2JqZWN0CisgICAgICAgIGZpcnN0IiksIHNlZW1zIGxpa2UgaXQgd291bGQgbWFrZSB0aGVzZSBmYWN0cyBtb3N0bHkKKyAgICAgICAgaXJyZWxldmFudCBiZWNhdXNlIGV2ZW4gaWYgaW4gcHJhY3RpY2UgeW91IHdvdWxkIG5vdCBoYXZlIHRvCisgICAgICAgIHdhbmRlciBhcm91bmQgbXVjaCwgaW4gZmFjdCB5b3UganVzdCBicnV0ZS1mb3JjZSBzYXkgdGhhdCBpbgorICAgICAgICB0aGUgY2FzZXMgd2hlcmUgeW91IG1pZ2h0IGhhdmUgdG8gd2FuZGVyLCBkb24ndCBkbyB0aGF0IDotKQorCisgICAgPGxpbnVzPiBZZXMgYW5kIG5vLiBOb3RpY2UgdGhlIHJ1bGU6IHdlIG9ubHkgd3JpdGUgb3V0IHRoZSBiYXNlCisgICAgICAgIG9iamVjdCBmaXJzdCBpZiB0aGUgZGVsdGEgYWdhaW5zdCBpdCB3YXMgbW9yZSByZWNlbnQuICBUaGF0CisgICAgICAgIG1lYW5zIHRoYXQgeW91IGNhbiBhY3R1YWxseSBoYXZlIGRlbHRhcyB0aGF0IHJlZmVyIHRvIGEgYmFzZQorICAgICAgICBvYmplY3QgdGhhdCBpcyBfbm90XyBjbG9zZSB0byB0aGUgZGVsdGEgb2JqZWN0LCBidXQgdGhhdCBvbmx5CisgICAgICAgIGhhcHBlbnMgd2hlbiB0aGUgZGVsdGEgaXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIF9vbGRfIG9iamVjdC4KKworICAgIDxsaW51cz4gU2VlPworCitZZWFoLCBuby4gIEkgbWlzc2VkIHRoYXQgb24gdGhlIGZpcnN0IHR3byBvciB0aHJlZSByZWFkaW5ncyBteXNlbGYuCisKKyAgICA8bGludXM+IFRoaXMga2VlcHMgdGhlIGZyb250IG9mIHRoZSBwYWNrIGRlbnNlLiBUaGUgZnJvbnQgb2YgdGhlCisgICAgICAgIHBhY2sgbmV2ZXIgY29udGFpbnMgZGF0YSB0aGF0IGlzbid0IHJlbGV2YW50IHRvIGEgInJlY2VudCIKKyAgICAgICAgb2JqZWN0LiAgVGhlIHNpemUgb3B0aW1pemF0aW9uIGNvbWVzIGZyb20gb3VyIHVzZSBvZiB4ZGVsdGEKKyAgICAgICAgKGJ1dCBpcyB0cnVlIGZvciBtYW55IG90aGVyIGRlbHRhIGFsZ29yaXRobXMpOiByZW1vdmluZyBkYXRhCisgICAgICAgIGlzIGNoZWFwZXIgKGluIHNpemUpIHRoYW4gYWRkaW5nIGRhdGEuCisKKyAgICAgICAgV2hlbiB5b3UgcmVtb3ZlIGRhdGEsIHlvdSBvbmx5IG5lZWQgdG8gc2F5ICJjb3B5IGJ5dGVzIG4tLW0iLgorCUluIGNvbnRyYXN0LCBpbiBhIGRlbHRhIHRoYXQgX2FkZHNfIGRhdGEsIHlvdSBoYXZlIHRvIHNheSAiYWRkCisgICAgICAgIHRoZXNlIGJ5dGVzOiAnYWN0dWFsIGRhdGEgZ29lcyBoZXJlJyIKKworICAgICoqKiBuanNgIGhhcyBxdWl0OiBSZWFkIGVycm9yOiAxMDQgKENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcikKKworICAgIDxsaW51cz4gVWhodWguIEkgaG9wZSBJIGRpZG4ndCBibG93IG5qc2AgbWluZC4KKworICAgICoqKiBuanNgIGhhcyBqb2luZWQgY2hhbm5lbCAjZ2l0CisKKyAgICA8cGFza3k+IDopCisKK1RoZSBzaWxlbnQgb2JzZXJ2ZXJzIGFyZSBhbXVzZWQuICBPZiBjb3Vyc2UuCisKK0FuZCBhcyBpZiBuanNgIHdhcyBleHBlY3RlZCB0byBiZSBvbW5pc2NpZW50OgorCisgICAgPGxpbnVzPiBuanMgLSBkaWQgeW91IG1pc3MgYW55dGhpbmc/CisKK09LLCBJJ2xsIHNwZWxsIGl0IG91dC4gIFRoYXQncyBHZWVrIEh1bW9yLiAgSWYgbmpzYCB3YXMgbm90IGFjdHVhbGx5Citjb25uZWN0ZWQgZm9yIGEgbGl0dGxlIGJpdCB0aGVyZSwgaG93IHdvdWxkIGhlIGtub3cgaWYgbWlzc2VkIGFueXRoaW5nCit3aGlsZSBoZSB3YXMgZGlzY29ubmVjdGVkPyAgSGUncyBhIGJlbmV2b2xlbnQgZGljdGF0b3Igd2l0aCBhIHNlbnNlIG9mCitodW1vciEgIFdlbGwgbm90ZWQhCisKKyAgICA8bmpzYD4gU3R1cGlkIHJvdXRlci4gIE9yIGdyZW1saW5zLCBvciB3aGF0ZXZlci4KKworSXQncyBhIGNoZWFwIHNob3QgYXQgQ2lzY28uICBUYWtlICdlbSB3aGVuIHlvdSBjYW4uCisKKyAgICA8bmpzYD4gWWVzIGFuZCBuby4gTm90aWNlIHRoZSBydWxlOiB3ZSBvbmx5IHdyaXRlIG91dCB0aGUgYmFzZQorICAgICAgICBvYmplY3QgZmlyc3QgaWYgdGhlIGRlbHRhIGFnYWluc3QgaXQgd2FzIG1vcmUgcmVjZW50LgorCisgICAgICAgIEknbSBnZXR0aW5nIGxvc3QgaW4gYWxsIHRoZXNlIG9yZGVycywgbGV0IG1lIHJlLXJlYWQgOi0pCisJU28gdGhlIHdyaXRlLW91dCBvcmRlciBpcyBmcm9tIG1vc3QgcmVjZW50IHRvIGxlYXN0IHJlY2VudD8KKyAgICAgICAgKENvbmNlaXZhYmx5IGl0IGNvdWxkIGJlIHRoZSBvcHBvc2l0ZSB3YXkgdG9vLCBJJ20gbm90IHN1cmUgaWYKKyAgICAgICAgd2UndmUgc2FpZCkgdGhvdWdoIG15IGNvbm5lY3Rpb24gYmFjayBhdCBob21lIGlzIGxvZ2dpbmcsIHNvIEkKKyAgICAgICAgY2FuIGp1c3QgcmVhZCB3aGF0IHlvdSBzYWlkIHRoZXJlIDotKQorCitBbmQgZm9yIHRob3NlIG9mIHlvdSBwYXlpbmcgYXR0ZW50aW9uLCB0aGUgT21uaXNjaWVudCBUcmljayBoYXMganVzdAorYmVlbiBkZXRhaWxlZCEKKworICAgIDxsaW51cz4gWWVzLCB3ZSBhbHdheXMgd3JpdGUgb3V0IG1vc3QgcmVjZW50IGZpcnN0CisKK0ZvciB0aGUgb3RoZXIgcmVjb3JkOgorCisgICAgPHBhc2t5PiBuanNgOiBodHRwOi8vcGFzdGViaW4uY29tLzU0Nzk2NQorCitUaGUgJ25ldCBuZXZlciBmb3JnZXRzLCBzbyB0aGF0IHNob3VsZCBiZSBnb29kIHVudGlsIHRoZSBlbmQgb2YgdGltZS4KKworICAgIDxuanNgPiBBbmQsIHllYWgsIEkgZ290IHRoZSBwYXJ0IGFib3V0IGRlZXBlci1pbi1oaXN0b3J5IHN0dWZmCisgICAgICAgIGhhdmluZyB3b3JzZSBJTyBjaGFyYWN0ZXJpc3RpY3MsIG9uZSBzb3J0IG9mIGRvZXNuJ3QgY2FyZS4KKworICAgIDxsaW51cz4gV2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgdGhlICJtb3N0IHJlY2VudCIgbmVlZHMgYW4gb2xkZXIKKyAgICAgICAgb2JqZWN0IHRvIGRlbHRhIGFnYWluc3QgKGhleSwgc2hyaW5raW5nIHNvbWV0aW1lcyBkb2VzCisgICAgICAgIGhhcHBlbiksIHdlIHdyaXRlIG91dCB0aGUgb2xkIG9iamVjdCB3aXRoIHRoZSBkZWx0YS4KKworICAgIDxuanNgPiAoaWYgb25seSBpdCBoYXBwZW5lZCBtb3JlLi4uKQorCisgICAgPGxpbnVzPiBBbnl3YXksIHRoZSBwYWNrLWZpbGUgY291bGQgZWFzaWx5IGJlIGRlbnNlciBzdGlsbCwgYnV0CisgICAgICAgIGJlY2F1c2UgaXQncyB1c2VkIGJvdGggZm9yIHN0cmVhbWluZyAodGhlIGdpdCBwcm90b2NvbCkgYW5kCisgICAgICAgIGZvciBvbi1kaXNrLCBpdCBoYXMgYSBmZXcgcGVzc2ltaXphdGlvbnMuCisKK0FjdHVhbGx5LCBpdCBpcyBhIG1hZGUtdXAgd29yZC4gQnV0IGl0IGlzIGEgbWFkZS11cCB3b3JkIGJlaW5nCit1c2VkIGFzIHNldHVwIGZvciBhIGxhdGVyIG9wdGltaXphdGlvbiwgd2hpY2ggaXMgYSByZWFsIHdvcmQ6CisKKyAgICA8bGludXM+IEluIHBhcnRpY3VsYXIsIHdoaWxlIHRoZSBwYWNrLWZpbGUgaXMgdGhlbiBjb21wcmVzc2VkLAorICAgICAgICBpdCdzIGNvbXByZXNzZWQganVzdCBvbmUgb2JqZWN0IGF0IGEgdGltZSwgc28gdGhlIGFjdHVhbAorICAgICAgICBjb21wcmVzc2lvbiBmYWN0b3IgaXMgbGVzcyB0aGFuIGl0IGNvdWxkIGJlIGluIHRoZW9yeS4gQnV0IGl0CisgICAgICAgIG1lYW5zIHRoYXQgaXQncyBhbGwgbmljZSByYW5kb20tYWNjZXNzIHdpdGggYSBzaW1wbGUgaW5kZXggdG8KKyAgICAgICAgZG8gIm9iamVjdCBuYW1lLT5sb2NhdGlvbiBpbiBwYWNrZmlsZSIgdHJhbnNsYXRpb24uCisKKyAgICA8bmpzYD4gSSdtIGFzc3VtaW5nIHRoZSByZWFsIHdpbiBmb3IgZGVsdGEtaW5nIGxhcmdlLT5zbWFsbCBpcworICAgICAgICBtb3JlIGhvbW9nZW5lb3VzIHN0YXRpc3RpY3MgZm9yIGd6aXAgdG8gcnVuIG92ZXI/CisKKyAgICAgICAgKFlvdSBoYXZlIHRvIHB1dCB0aGUgYnl0ZXMgaW4gb25lIHBsYWNlIG9yIGFub3RoZXIsIGJ1dAorICAgICAgICBwdXR0aW5nIHRoZW0gaW4gYSBsYXJnZXIgYmxvYiB3aW5zIG9uIGNvbXByZXNzaW9uKQorCisgICAgICAgIEFjdHVhbGx5LCB3aGF0IGlzIHRoZSBjb21wcmVzc2lvbiBzdHJhdGVneSAtLSBlYWNoIGRlbHRhCisgICAgICAgIGluZGl2aWR1YWxseSBnemlwcGVkLCB0aGUgd2hvbGUgZmlsZSBnemlwcGVkLCBzb21ld2hlcmUgaW4KKyAgICAgICAgYmV0d2Vlbiwgbm8gY29tcHJlc3Npb24gYXQgYWxsLCAuLi4uPworCisgICAgICAgIFJpZ2h0LgorCitSZWFsaXR5IElSQyBzZXRzIGluLiAgRm9yIGV4YW1wbGU6CisKKyAgICA8cGFza3k+IEknbGwgcmVhZCB0aGUgcmVzdCBpbiB0aGUgbW9ybmluZywgSSByZWFsbHkgaGF2ZSB0byBnbworICAgICAgICBzbGVlcCBvciB0aGVyZSdzIG5vIGhvcGUgd2hhdHNvZXZlciBmb3IgbWUgYXQgdGhlIHRvZGF5J3MKKyAgICAgICAgZXhhbS4uLiBnJ25pdGUgYWxsLgorCitIZWguCisKKyAgICA8bGludXM+IHBhc2t5OiBnJ25pdGUKKworICAgIDxuanNgPiBwYXNreTogJ2x1Y2sKKworICAgIDxsaW51cz4gUmlnaHQ6IGxhcmdlLT5zbWFsbCBtYXR0ZXJzIGV4YWN0bHkgYmVjYXVzZSBvZiBjb21wcmVzc2lvbgorICAgICAgICBiZWhhdmlvdXIuIElmIGl0IHdhcyBub24tY29tcHJlc3NlZCwgaXQgcHJvYmFibHkgd291bGRuJ3QgbWFrZQorICAgICAgICBhbnkgZGlmZmVyZW5jZS4KKworICAgIDxuanNgPiB5ZWFoCisKKyAgICA8bGludXM+IEFueXdheTogSSdtIG5vdCBldmVuIHRyeWluZyB0byBjbGFpbSB0aGF0IHRoZSBwYWNrLWZpbGVzCisgICAgICAgIGFyZSBwZXJmZWN0LCBidXQgdGhleSBkbyB0ZW5kIHRvIGhhdmUgYSBuaWNlIGJhbGFuY2Ugb2YKKyAgICAgICAgZGVuc2l0eSB2cyBlYXNlLW9mIHVzZS4KKworR2FzcCEgIE9LLCBzYXZlZC4gIFRoYXQncyBhIGZhaXIgRW5naW5lZXJpbmcgdHJhZGUgb2ZmLiAgQ2xvc2UgY2FsbCEKK0luIGZhY3QsIExpbnVzIHJlZmxlY3RzIG9uIHNvbWUgQmFzaWMgRW5naW5lZXJpbmcgRnVuZGFtZW50YWxzLAorZGVzaWduIG9wdGlvbnMsIGV0Yy4KKworICAgIDxsaW51cz4gTW9yZSBpbXBvcnRhbnRseSwgdGhleSBhbGxvdyBnaXQgdG8gc3RpbGwgX2NvbmNlcHR1YWxseV8KKyAgICAgICAgbmV2ZXIgZGVhbCB3aXRoIGRlbHRhcyBhdCBhbGwsIGFuZCBiZSBhICJ3aG9sZSBvYmplY3QiIHN0b3JlLgorCisgICAgICAgIFdoaWNoIGhhcyBzb21lIHByb2JsZW1zICh3ZSBkaXNjdXNzZWQgYmFkIGh1Z2UtZmlsZQorICAgICAgICBiZWhhdmlvdXIgb24gdGhlIGdpdCBsaXN0cyB0aGUgb3RoZXIgZGF5KSwgYnV0IGl0IGRvZXMgbWVhbgorICAgICAgICB0aGF0IHRoZSBiYXNpYyBnaXQgY29uY2VwdHMgYXJlIHJlYWxseSByZWFsbHkgc2ltcGxlIGFuZAorICAgICAgICBzdHJhaWdodGZvcndhcmQuCisKKyAgICAgICAgSXQncyBhbGwgYmVlbiBxdWl0ZSBzdGFibGUuCisKKyAgICAgICAgV2hpY2ggSSB0aGluayBpcyB2ZXJ5IG11Y2ggYSByZXN1bHQgb2YgaGF2aW5nIHZlcnkgc2ltcGxlCisgICAgICAgIGJhc2ljIGlkZWFzLCBzbyB0aGF0IHRoZXJlJ3MgbmV2ZXIgYW55IGNvbmZ1c2lvbiBhYm91dCB3aGF0J3MKKyAgICAgICAgZ29pbmcgb24uCisKKyAgICAgICAgQnVncyBoYXBwZW4sIGJ1dCB0aGV5IGFyZSAic2ltcGxlIiBidWdzLiBBbmQgYnVncyB0aGF0CisgICAgICAgIGFjdHVhbGx5IGdldCBzb21lIG9iamVjdCBzdG9yZSBkZXRhaWwgd3JvbmcgYXJlIGFsbW9zdCBhbHdheXMKKyAgICAgICAgc28gb2J2aW91cyB0aGF0IHRoZXkgbmV2ZXIgZ28gYW55d2hlcmUuCisKKyAgICA8bmpzYD4gWWVhaC4KKworTnVmZiBzYWlkLgorCisgICAgPGxpbnVzPiBBbnl3YXkuICBJJ20gb2ZmIGZvciBiZWQuIEl0J3Mgbm90IDZBTSBoZXJlLCBidXQgSSd2ZSBnb3QKKwkgdGhyZWUga2lkcywgYW5kIGhhdmUgdG8gZ2V0IHVwIGVhcmx5IGluIHRoZSBtb3JuaW5nIHRvIHNlbmQKKwkgdGhlbSBvZmYuIEkgbmVlZCBteSBiZWF1dHkgc2xlZXAuCisKKyAgICA8bmpzYD4gOi0pCisKKyAgICA8bmpzYD4gYXBwcmVjaWF0ZSB0aGUgaW5mb2R1bXAsIEkgcmVhbGx5IHdhcyBmYWlsaW5nIHRvIGZpbmQgdGhlCisgICAgICAgIGRldGFpbHMgb24gZ2l0IHBhY2tzIDotKQorCitBbmQgbm93IHlvdSBrbm93IHRoZSByZXN0IG9mIHRoZSBzdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stcHJvdG9jb2wudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1wcm90b2NvbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkNDhiNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stcHJvdG9jb2wudHh0CkBAIC0wLDAgKzEsNDEgQEAKK1BhY2sgdHJhbnNmZXIgcHJvdG9jb2xzCis9PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVyZSBhcmUgdHdvIFBhY2sgcHVzaC1wdWxsIHByb3RvY29scy4KKwordXBsb2FkLXBhY2sgKFMpIHwgZmV0Y2gvY2xvbmUtcGFjayAoQykgcHJvdG9jb2w6CisKKwkjIFRlbGwgdGhlIHB1bGxlciB3aGF0IGNvbW1pdHMgd2UgaGF2ZSBhbmQgd2hhdCB0aGVpciBuYW1lcyBhcmUKKwlTOiBTSEExIG5hbWUKKwlTOiAuLi4KKwlTOiBTSEExIG5hbWUKKwlTOiAjIGZsdXNoIC0tIGl0J3MgeW91ciB0dXJuCisJIyBUZWxsIHRoZSBwdXNoZXIgd2hhdCBjb21taXRzIHdlIHdhbnQsIGFuZCB3aGF0IHdlIGhhdmUKKwlDOiB3YW50IG5hbWUKKwlDOiAuLgorCUM6IHdhbnQgbmFtZQorCUM6IGhhdmUgU0hBMQorCUM6IGhhdmUgU0hBMQorCUM6IC4uLgorCUM6ICMgZmx1c2ggLS0gb2NjYXNpb25hbGx5IGFzayAiaGFkIGVub3VnaD8iCisJUzogTkFLCisJQzogaGF2ZSBTSEExCisJQzogLi4uCisJQzogaGF2ZSBTSEExCisJUzogQUNLCisJQzogZG9uZQorCVM6IFhYWFhYWFggLS0gcGFja2ZpbGUgY29udGVudHMuCisKK3NlbmQtcGFjayB8IHJlY2VpdmUtcGFjayBwcm90b2NvbC4KKworCSMgVGVsbCB0aGUgcHVzaGVyIHdoYXQgY29tbWl0cyB3ZSBoYXZlIGFuZCB3aGF0IHRoZWlyIG5hbWVzIGFyZQorCUM6IFNIQTEgbmFtZQorCUM6IC4uLgorCUM6IFNIQTEgbmFtZQorCUM6ICMgZmx1c2ggLS0gaXQncyB5b3VyIHR1cm4KKwkjIFRlbGwgdGhlIHB1bGxlciB3aGF0IHRoZSBwdXNoZXIgaGFzCisJUzogb2xkLVNIQTEgbmV3LVNIQTEgbmFtZQorCVM6IG9sZC1TSEExIG5ldy1TSEExIG5hbWUKKwlTOiAuLi4KKwlTOiAjIGZsdXNoIC0tIGRvbmUgd2l0aCB0aGUgbGlzdAorCVM6IFhYWFhYWFggLS0tIHBhY2tmaWxlIGNvbnRlbnRzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcmFjeS1naXQudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcmFjeS1naXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzBkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9yYWN5LWdpdC50eHQKQEAgLTAsMCArMSwxOTUgQEAKK1VzZSBvZiBpbmRleCBhbmQgUmFjeSBnaXQgcHJvYmxlbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JhY2tncm91bmQKKy0tLS0tLS0tLS0KKworVGhlIGluZGV4IGlzIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgZGF0YSBzdHJ1Y3R1cmVzIGluIGdpdC4KK0l0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIHdvcmtpbmcgdHJlZSBzdGF0ZSBieSByZWNvcmRpbmcgbGlzdCBvZgorcGF0aHMgYW5kIHRoZWlyIG9iamVjdCBuYW1lcyBhbmQgc2VydmVzIGFzIGEgc3RhZ2luZyBhcmVhIHRvCit3cml0ZSBvdXQgdGhlIG5leHQgdHJlZSBvYmplY3QgdG8gYmUgY29tbWl0dGVkLiAgVGhlIHN0YXRlIGlzCisidmlydHVhbCIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0bywgYW5kCitvZnRlbiBkb2VzIG5vdCwgbWF0Y2ggdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUuCisKK1RoZXJlIGFyZSBjYXNlcyBnaXQgbmVlZHMgdG8gZXhhbWluZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUKK3ZpcnR1YWwgd29ya2luZyB0cmVlIHN0YXRlIGluIHRoZSBpbmRleCBhbmQgdGhlIGZpbGVzIGluIHRoZQord29ya2luZyB0cmVlLiAgVGhlIG1vc3Qgb2J2aW91cyBjYXNlIGlzIHdoZW4gdGhlIHVzZXIgYXNrcyBgZ2l0CitkaWZmYCAob3IgaXRzIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiwgYGdpdCBkaWZmLWZpbGVzYCkgb3IKK2BnaXQtbHMtZmlsZXMgLS1tb2RpZmllZGAuICBJbiBhZGRpdGlvbiwgZ2l0IGludGVybmFsbHkgY2hlY2tzCitpZiB0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcmUgZGlmZmVyZW50IGZyb20gd2hhdCBhcmUKK3JlY29yZGVkIGluIHRoZSBpbmRleCB0byBhdm9pZCBzdG9tcGluZyBvbiBsb2NhbCBjaGFuZ2VzIGluIHRoZW0KK2R1cmluZyBwYXRjaCBhcHBsaWNhdGlvbiwgc3dpdGNoaW5nIGJyYW5jaGVzLCBhbmQgbWVyZ2luZy4KKworSW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhpcyBjb21wYXJpc29uIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZQord29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXggZW50cmllcywgdGhlIGluZGV4IGVudHJpZXMgcmVjb3JkIHRoZQoraW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSB2aWEgYGxzdGF0KDIpYCBzeXN0ZW0KK2NhbGwgd2hlbiB0aGV5IHdlcmUgbGFzdCB1cGRhdGVkLiAgV2hlbiBjaGVja2luZyBpZiB0aGV5IGRpZmZlciwKK2dpdCBmaXJzdCBydW5zIGBsc3RhdCgyKWAgb24gdGhlIGZpbGVzIGFuZCBjb21wYXJlcyB0aGUgcmVzdWx0Cit3aXRoIHRoaXMgaW5mb3JtYXRpb24gKHRoaXMgaXMgd2hhdCB3YXMgb3JpZ2luYWxseSBkb25lIGJ5IHRoZQorYGNlX21hdGNoX3N0YXQoKWAgZnVuY3Rpb24sIGJ1dCB0aGUgY3VycmVudCBjb2RlIGRvZXMgaXQgaW4KK2BjZV9tYXRjaF9zdGF0X2Jhc2ljKClgIGZ1bmN0aW9uKS4gIElmIHNvbWUgb2YgdGhlc2UgImNhY2hlZAorc3RhdCBpbmZvcm1hdGlvbiIgZmllbGRzIGRvIG5vdCBtYXRjaCwgZ2l0IGNhbiB0ZWxsIHRoYXQgdGhlCitmaWxlcyBhcmUgbW9kaWZpZWQgd2l0aG91dCBldmVuIGxvb2tpbmcgYXQgdGhlaXIgY29udGVudHMuCisKK05vdGU6IG5vdCBhbGwgbWVtYmVycyBpbiBgc3RydWN0IHN0YXRgIG9idGFpbmVkIHZpYSBgbHN0YXQoMilgCithcmUgdXNlZCBmb3IgdGhpcyBjb21wYXJpc29uLiAgRm9yIGV4YW1wbGUsIGBzdF9hdGltZWAgb2J2aW91c2x5CitpcyBub3QgdXNlZnVsLiAgQ3VycmVudGx5LCBnaXQgY29tcGFyZXMgdGhlIGZpbGUgdHlwZSAocmVndWxhcgorZmlsZXMgdnMgc3ltYm9saWMgbGlua3MpIGFuZCBleGVjdXRhYmxlIGJpdHMgKG9ubHkgZm9yIHJlZ3VsYXIKK2ZpbGVzKSBmcm9tIGBzdF9tb2RlYCBtZW1iZXIsIGBzdF9tdGltZWAgYW5kIGBzdF9jdGltZWAKK3RpbWVzdGFtcHMsIGBzdF91aWRgLCBgc3RfZ2lkYCwgYHN0X2lub2AsIGFuZCBgc3Rfc2l6ZWAgbWVtYmVycy4KK1dpdGggYSBgVVNFX1NUREVWYCBjb21waWxlLXRpbWUgb3B0aW9uLCBgc3RfZGV2YCBpcyBhbHNvCitjb21wYXJlZCwgYnV0IHRoaXMgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoaXMgbWVtYmVyCitpcyBub3Qgc3RhYmxlIG9uIG5ldHdvcmsgZmlsZXN5c3RlbXMuICBXaXRoIGBVU0VfTlNFQ2AKK2NvbXBpbGUtdGltZSBvcHRpb24sIGBzdF9tdGltLnR2X25zZWNgIGFuZCBgc3RfY3RpbS50dl9uc2VjYAorbWVtYmVycyBhcmUgYWxzbyBjb21wYXJlZCwgYnV0IHRoaXMgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdAorYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhpcyBtZW1iZXIgYmVjb21lcyBtZWFuaW5nbGVzcyBvbmNlIHRoZQoraW5vZGUgaXMgZXZpY3RlZCBmcm9tIHRoZSBpbm9kZSBjYWNoZSBvbiBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdAorc3RvcmUgaXQgb24gZGlzay4KKworCitSYWN5IGdpdAorLS0tLS0tLS0KKworVGhlcmUgaXMgb25lIHNsaWdodCBwcm9ibGVtIHdpdGggdGhlIG9wdGltaXphdGlvbiBiYXNlZCBvbiB0aGUKK2NhY2hlZCBzdGF0IGluZm9ybWF0aW9uLiAgQ29uc2lkZXIgdGhpcyBzZXF1ZW5jZToKKworICA6IG1vZGlmeSAnZm9vJworICAkIGdpdCB1cGRhdGUtaW5kZXggJ2ZvbycKKyAgOiBtb2RpZnkgJ2ZvbycgYWdhaW4sIGluLXBsYWNlLCB3aXRob3V0IGNoYW5naW5nIGl0cyBzaXplCisKK1RoZSBmaXJzdCBgdXBkYXRlLWluZGV4YCBjb21wdXRlcyB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlCitjb250ZW50cyBvZiBmaWxlIGBmb29gIGFuZCB1cGRhdGVzIHRoZSBpbmRleCBlbnRyeSBmb3IgYGZvb2AKK2Fsb25nIHdpdGggdGhlIGBzdHJ1Y3Qgc3RhdGAgaW5mb3JtYXRpb24uICBJZiB0aGUgbW9kaWZpY2F0aW9uCit0aGF0IGZvbGxvd3MgaXQgaGFwcGVucyB2ZXJ5IGZhc3Qgc28gdGhhdCB0aGUgZmlsZSdzIGBzdF9tdGltZWAKK3RpbWVzdGFtcCBkb2VzIG5vdCBjaGFuZ2UsIGFmdGVyIHRoaXMgc2VxdWVuY2UsIHRoZSBjYWNoZWQgc3RhdAoraW5mb3JtYXRpb24gdGhlIGluZGV4IGVudHJ5IHJlY29yZHMgc3RpbGwgZXhhY3RseSBtYXRjaCB3aGF0IHlvdQord291bGQgc2VlIGluIHRoZSBmaWxlc3lzdGVtLCBldmVuIHRob3VnaCB0aGUgZmlsZSBgZm9vYCBpcyBub3cKK2RpZmZlcmVudC4KK1RoaXMgd2F5LCBnaXQgY2FuIGluY29ycmVjdGx5IHRoaW5rIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUKK2FyZSB1bm1vZGlmaWVkIGV2ZW4gdGhvdWdoIHRoZXkgYWN0dWFsbHkgYXJlLiAgVGhpcyBpcyBjYWxsZWQKK3RoZSAicmFjeSBnaXQiIHByb2JsZW0gKGRpc2NvdmVyZWQgYnkgUGFza3kpLCBhbmQgdGhlIGVudHJpZXMKK3RoYXQgYXBwZWFyIGNsZWFuIHdoZW4gdGhleSBtYXkgbm90IGJlIGJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtCithcmUgY2FsbGVkICJyYWNpbHkgY2xlYW4iLgorCitUbyBhdm9pZCB0aGlzIHByb2JsZW0sIGdpdCBkb2VzIHR3byB0aGluZ3M6CisKKy4gV2hlbiB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24gc2F5cyB0aGUgZmlsZSBoYXMgbm90IGJlZW4KKyAgbW9kaWZpZWQsIGFuZCB0aGUgYHN0X210aW1lYCBpcyB0aGUgc2FtZSBhcyAob3IgbmV3ZXIgdGhhbikKKyAgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5kZXggZmlsZSBpdHNlbGYgKHdoaWNoIGlzIHRoZSB0aW1lIGBnaXQKKyAgdXBkYXRlLWluZGV4IGZvb2AgZmluaXNoZWQgcnVubmluZyBpbiB0aGUgYWJvdmUgZXhhbXBsZSksIGl0CisgIGFsc28gY29tcGFyZXMgdGhlIGNvbnRlbnRzIHdpdGggdGhlIG9iamVjdCByZWdpc3RlcmVkIGluIHRoZQorICBpbmRleCBlbnRyeSB0byBtYWtlIHN1cmUgdGhleSBtYXRjaC4KKworLiBXaGVuIHRoZSBpbmRleCBmaWxlIGlzIHVwZGF0ZWQgdGhhdCBjb250YWlucyByYWNpbHkgY2xlYW4KKyAgZW50cmllcywgY2FjaGVkIGBzdF9zaXplYCBpbmZvcm1hdGlvbiBpcyB0cnVuY2F0ZWQgdG8gemVybworICBiZWZvcmUgd3JpdGluZyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBpbmRleCBmaWxlLgorCitCZWNhdXNlIHRoZSBpbmRleCBmaWxlIGl0c2VsZiBpcyB3cml0dGVuIGFmdGVyIGNvbGxlY3RpbmcgYWxsCit0aGUgc3RhdCBpbmZvcm1hdGlvbiBmcm9tIHVwZGF0ZWQgcGF0aHMsIGBzdF9tdGltZWAgdGltZXN0YW1wIG9mCitpdCBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIG9yIG5ld2VyIHRoYW4gYW55IG9mIHRoZSBwYXRocyB0aGUKK2luZGV4IGNvbnRhaW5zLiAgQW5kIG5vIG1hdHRlciBob3cgcXVpY2sgdGhlIG1vZGlmaWNhdGlvbiB0aGF0Citmb2xsb3dzIGBnaXQgdXBkYXRlLWluZGV4IGZvb2AgZmluaXNoZXMsIHRoZSByZXN1bHRpbmcKK2BzdF9tdGltZWAgdGltZXN0YW1wIG9uIGBmb29gIGNhbm5vdCBnZXQgYSB2YWx1ZSBlYXJsaWVyCit0aGFuIHRoZSBpbmRleCBmaWxlLiAgVGhlcmVmb3JlLCBpbmRleCBlbnRyaWVzIHRoYXQgY2FuIGJlCityYWNpbHkgY2xlYW4gYXJlIGxpbWl0ZWQgdG8gdGhlIG9uZXMgdGhhdCBoYXZlIHRoZSBzYW1lCit0aW1lc3RhbXAgYXMgdGhlIGluZGV4IGZpbGUgaXRzZWxmLgorCitUaGUgY2FsbGVycyB0aGF0IHdhbnQgdG8gY2hlY2sgaWYgYW4gaW5kZXggZW50cnkgbWF0Y2hlcyB0aGUKK2NvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUgd29ya2luZyB0cmVlIGNvbnRpbnVlIHRvIGNhbGwKK2BjZV9tYXRjaF9zdGF0KClgLCBidXQgd2l0aCB0aGlzIGNoYW5nZSwgYGNlX21hdGNoX3N0YXQoKWAgdXNlcworYGNlX21vZGlmaWVkX2NoZWNrX2ZzKClgIHRvIHNlZSBpZiByYWNpbHkgY2xlYW4gb25lcyBhcmUKK2FjdHVhbGx5IGNsZWFuIGFmdGVyIGNvbXBhcmluZyB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24gdXNpbmcKK2BjZV9tYXRjaF9zdGF0X2Jhc2ljKClgLgorCitUaGUgcHJvYmxlbSB0aGUgbGF0dGVyIHNvbHZlcyBpcyB0aGlzIHNlcXVlbmNlOgorCisgICQgZ2l0IHVwZGF0ZS1pbmRleCAnZm9vJworICA6IG1vZGlmeSAnZm9vJyBpbi1wbGFjZSB3aXRob3V0IGNoYW5naW5nIGl0cyBzaXplCisgIDogd2FpdCBmb3IgZW5vdWdoIHRpbWUKKyAgJCBnaXQgdXBkYXRlLWluZGV4ICdiYXInCisKK1dpdGhvdXQgdGhlIGxhdHRlciwgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5kZXggZmlsZSBnZXRzIGEgbmV3ZXIKK3ZhbHVlLCBhbmQgZmFsc2VseSBjbGVhbiBlbnRyeSBgZm9vYCB3b3VsZCBub3QgYmUgY2F1Z2h0IGJ5IHRoZQordGltZXN0YW1wIGNvbXBhcmlzb24gY2hlY2sgZG9uZSB3aXRoIHRoZSBmb3JtZXIgbG9naWMgYW55bW9yZS4KK1RoZSBsYXR0ZXIgbWFrZXMgc3VyZSB0aGF0IHRoZSBjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbiBmb3IgYGZvb2AKK3dvdWxkIG5ldmVyIG1hdGNoIHdpdGggdGhlIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZSwgc28gbGF0ZXIKK2NoZWNrcyBieSBgY2VfbWF0Y2hfc3RhdF9iYXNpYygpYCB3b3VsZCByZXBvcnQgdGhhdCB0aGUgaW5kZXggZW50cnkKK2RvZXMgbm90IG1hdGNoIHRoZSBmaWxlIGFuZCBnaXQgZG9lcyBub3QgaGF2ZSB0byBmYWxsIGJhY2sgb24gbW9yZQorZXhwZW5zaXZlIGBjZV9tb2RpZmllZF9jaGVja19mcygpYC4KKworCitSdW50aW1lIHBlbmFsdHkKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgcnVudGltZSBwZW5hbHR5IG9mIGZhbGxpbmcgYmFjayB0byBgY2VfbW9kaWZpZWRfY2hlY2tfZnMoKWAKK2Zyb20gYGNlX21hdGNoX3N0YXQoKWAgY2FuIGJlIHZlcnkgZXhwZW5zaXZlIHdoZW4gdGhlcmUgYXJlIG1hbnkKK3JhY2lseSBjbGVhbiBlbnRyaWVzLiAgQW4gb2J2aW91cyB3YXkgdG8gYXJ0aWZpY2lhbGx5IGNyZWF0ZQordGhpcyBzaXR1YXRpb24gaXMgdG8gZ2l2ZSB0aGUgc2FtZSB0aW1lc3RhbXAgdG8gYWxsIHRoZSBmaWxlcyBpbgordGhlIHdvcmtpbmcgdHJlZSBpbiBhIGxhcmdlIHByb2plY3QsIHJ1biBgZ2l0IHVwZGF0ZS1pbmRleGAgb24KK3RoZW0sIGFuZCBnaXZlIHRoZSBzYW1lIHRpbWVzdGFtcCB0byB0aGUgaW5kZXggZmlsZToKKworICAkIGRhdGUgPi5kYXRlc3RhbXAKKyAgJCBnaXQgbHMtZmlsZXMgfCB4YXJncyB0b3VjaCAtciAuZGF0ZXN0YW1wCisgICQgZ2l0IGxzLWZpbGVzIHwgZ2l0IHVwZGF0ZS1pbmRleCAtLXN0ZGluCisgICQgdG91Y2ggLXIgLmRhdGVzdGFtcCAuZ2l0L2luZGV4CisKK1RoaXMgd2lsbCBtYWtlIGFsbCBpbmRleCBlbnRyaWVzIHJhY2lseSBjbGVhbi4gIFRoZSBsaW51eC0yLjYKK3Byb2plY3QsIGZvciBleGFtcGxlLCB0aGVyZSBhcmUgb3ZlciAyMCwwMDAgZmlsZXMgaW4gdGhlIHdvcmtpbmcKK3RyZWUuICBPbiBteSBBdGhyb24gNjRYMiAzODAwKywgYWZ0ZXIgdGhlIGFib3ZlOgorCisgICQgL3Vzci9iaW4vdGltZSBnaXQgZGlmZi1maWxlcworICAxLjY4dXNlciAwLjU0c3lzdGVtIDA6MDIuMjJlbGFwc2VkIDEwMCVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCisgIDBpbnB1dHMrMG91dHB1dHMgKDBtYWpvcis2NzExMW1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisgICQgZ2l0IHVwZGF0ZS1pbmRleCBNQUlOVEFJTkVSUworICAkIC91c3IvYmluL3RpbWUgZ2l0IGRpZmYtZmlsZXMKKyAgMC4wMnVzZXIgMC4xMnN5c3RlbSAwOjAwLjE0ZWxhcHNlZCAxMDAlQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworICAwaW5wdXRzKzBvdXRwdXRzICgwbWFqb3IrOTM1bWlub3IpcGFnZWZhdWx0cyAwc3dhcHMKKworUnVubmluZyBgZ2l0IHVwZGF0ZS1pbmRleGAgaW4gdGhlIG1pZGRsZSBjaGVja2VkIHRoZSByYWNpbHkKK2NsZWFuIGVudHJpZXMsIGFuZCBsZWZ0IHRoZSBjYWNoZWQgYHN0X210aW1lYCBmb3IgYWxsIHRoZSBwYXRocworaW50YWN0IGJlY2F1c2UgdGhleSB3ZXJlIGFjdHVhbGx5IGNsZWFuIChzbyB0aGlzIHN0ZXAgdG9vayBhYm91dAordGhlIHNhbWUgYW1vdW50IG9mIHRpbWUgYXMgdGhlIGZpcnN0IGBnaXQgZGlmZi1maWxlc2ApLiAgQWZ0ZXIKK3RoYXQsIHRoZXkgYXJlIG5vdCByYWNpbHkgY2xlYW4gYW55bW9yZSBidXQgYXJlIHRydWx5IGNsZWFuLCBzbwordGhlIHNlY29uZCBpbnZvY2F0aW9uIG9mIGBnaXQgZGlmZi1maWxlc2AgZnVsbHkgdG9vayBhZHZhbnRhZ2UKK29mIHRoZSBjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbi4KKworCitBdm9pZGluZyBydW50aW1lIHBlbmFsdHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBhdm9pZCB0aGUgYWJvdmUgcnVudGltZSBwZW5hbHR5LCBwb3N0IDEuNC4yIGdpdCB1c2VkCit0byBoYXZlIGEgY29kZSB0aGF0IG1hZGUgc3VyZSB0aGUgaW5kZXggZmlsZQorZ290IHRpbWVzdGFtcCBuZXdlciB0aGFuIHRoZSB5b3VuZ2VzdCBmaWxlcyBpbiB0aGUgaW5kZXggd2hlbgordGhlcmUgYXJlIG1hbnkgeW91bmcgZmlsZXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgYXMgdGhlCityZXN1bHRpbmcgaW5kZXggZmlsZSB3b3VsZCBvdGhlcndpc2Ugd291bGQgaGF2ZSBieSB3YWl0aW5nCitiZWZvcmUgZmluaXNoaW5nIHdyaXRpbmcgdGhlIGluZGV4IGZpbGUgb3V0LgorCitJIHN1c3BlY3RlZCB0aGF0IGluIHByYWN0aWNlIHRoZSBzaXR1YXRpb24gd2hlcmUgbWFueSBwYXRocyBpbiB0aGUKK2luZGV4IGFyZSBhbGwgcmFjaWx5IGNsZWFuIHdhcyBxdWl0ZSByYXJlLiAgVGhlIG9ubHkgY29kZSBwYXRocwordGhhdCBjYW4gcmVjb3JkIHJlY2VudCB0aW1lc3RhbXAgZm9yIGxhcmdlIG51bWJlciBvZiBwYXRocyBhcmU6CisKKy4gSW5pdGlhbCBgZ2l0IGFkZCAuYCBvZiBhIGxhcmdlIHByb2plY3QuCisKKy4gYGdpdCBjaGVja291dGAgb2YgYSBsYXJnZSBwcm9qZWN0IGZyb20gYW4gZW1wdHkgaW5kZXggaW50byBhbgorICB1bnBvcHVsYXRlZCB3b3JraW5nIHRyZWUuCisKK05vdGU6IHN3aXRjaGluZyBicmFuY2hlcyB3aXRoIGBnaXQgY2hlY2tvdXRgIGtlZXBzIHRoZSBjYWNoZWQKK3N0YXQgaW5mb3JtYXRpb24gb2YgZXhpc3Rpbmcgd29ya2luZyB0cmVlIGZpbGVzIHRoYXQgYXJlIHRoZQorc2FtZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGJyYW5jaCBhbmQgdGhlIG5ldyBicmFuY2gsIHdoaWNoIGFyZQorYWxsIG9sZGVyIHRoYW4gdGhlIHJlc3VsdGluZyBpbmRleCBmaWxlLCBhbmQgdGhleSB3aWxsIG5vdAorYmVjb21lIHJhY2lseSBjbGVhbi4gIE9ubHkgdGhlIGZpbGVzIHRoYXQgYXJlIGFjdHVhbGx5IGNoZWNrZWQKK291dCBjYW4gYmVjb21lIHJhY2lseSBjbGVhbi4KKworSW4gYSBsYXJnZSBwcm9qZWN0IHdoZXJlIHJhY2luZXNzIGF2b2lkYW5jZSBjb3N0IHJlYWxseSBtYXR0ZXJzLAoraG93ZXZlciwgdGhlIGluaXRpYWwgY29tcHV0YXRpb24gb2YgYWxsIG9iamVjdCBuYW1lcyBpbiB0aGUKK2luZGV4IHRha2VzIG1vcmUgdGhhbiBvbmUgc2Vjb25kLCBhbmQgdGhlIGluZGV4IGZpbGUgaXMgd3JpdHRlbgorb3V0IGFmdGVyIGFsbCB0aGF0IGhhcHBlbnMuICBUaGVyZWZvcmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUKK2luZGV4IGZpbGUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIHNlY29uZHMgbGF0ZXIgdGhhbiB0aGUgdGhlCit5b3VuZ2VzdCBmaWxlIGluIHRoZSB3b3JraW5nIHRyZWUuICBUaGlzIG1lYW5zIHRoYXQgaW4gdGhlc2UKK2Nhc2VzIHRoZXJlIGFjdHVhbGx5IHdpbGwgbm90IGJlIGFueSByYWNpbHkgY2xlYW4gZW50cnkgaW4KK3RoZSByZXN1bHRpbmcgaW5kZXguCisKK0Jhc2VkIG9uIHRoaXMgZGlzY3Vzc2lvbiwgdGhlIGN1cnJlbnQgY29kZSBkb2VzIG5vdCB1c2UgdGhlCisid29ya2Fyb3VuZCIgdG8gYXZvaWQgdGhlIHJ1bnRpbWUgcGVuYWx0eSB0aGF0IGRvZXMgbm90IGV4aXN0IGluCitwcmFjdGljZSBhbnltb3JlLiAgVGhpcyB3YXMgZG9uZSB3aXRoIGNvbW1pdCAwZmM4MmNmZiBvbiBBdWcgMTUsCisyMDA2LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvc2VuZC1wYWNrLXBpcGVsaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NlbmQtcGFjay1waXBlbGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxZWZlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NlbmQtcGFjay1waXBlbGluZS50eHQKQEAgLTAsMCArMSw2MyBAQAorZ2l0LXNlbmQtcGFjaworPT09PT09PT09PT09PQorCitPdmVyYWxsIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworLiBDb25uZWN0cyB0byB0aGUgcmVtb3RlIHNpZGUgYW5kIGludm9rZXMgZ2l0LXJlY2VpdmUtcGFjay4KKworLiBMZWFybnMgd2hhdCByZWZzIHRoZSByZW1vdGUgaGFzIGFuZCB3aGF0IGNvbW1pdCB0aGV5IHBvaW50IGF0LgorICBNYXRjaGVzIHRoZW0gdG8gdGhlIHJlZnNwZWNzIHdlIGFyZSBwdXNoaW5nLgorCisuIENoZWNrcyBpZiB0aGVyZSBhcmUgbm9uLWZhc3QtZm9yd2FyZHMuICBVbmxpa2UgZmV0Y2gtcGFjaywKKyAgdGhlIHJlcG9zaXRvcnkgc2VuZC1wYWNrIHJ1bnMgaW4gaXMgc3VwcG9zZWQgdG8gYmUgYSBzdXBlcnNldAorICBvZiB0aGUgcmVjaXBpZW50IGluIGZhc3QtZm9yd2FyZCBjYXNlcywgc28gdGhlcmUgaXMgbm8gbmVlZAorICBmb3Igd2FudC9oYXZlIGV4Y2hhbmdlcywgYW5kIGZhc3QtZm9yd2FyZCBjaGVjayBjYW4gYmUgZG9uZQorICBsb2NhbGx5LiAgVGVsbCB0aGUgcmVzdWx0IHRvIHRoZSBvdGhlciBlbmQuCisKKy4gQ2FsbHMgcGFja19vYmplY3RzKCkgd2hpY2ggZ2VuZXJhdGVzIGEgcGFja2ZpbGUgYW5kIHNlbmRzIGl0CisgIG92ZXIgdG8gdGhlIG90aGVyIGVuZC4KKworLiBJZiB0aGUgcmVtb3RlIHNpZGUgaXMgbmV3IGVub3VnaCAodjEuMS4wIG9yIGxhdGVyKSwgd2FpdCBmb3IKKyAgdGhlIHVucGFjayBhbmQgaG9vayBzdGF0dXMgZnJvbSB0aGUgb3RoZXIgZW5kLgorCisuIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBlcnJvciBjb2Rlcy4KKworCitQYWNrX29iamVjdHMgcGlwZWxpbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZ1bmN0aW9uIGdldHMgb25lIGZpbGUgZGVzY3JpcHRvciAoYGZkYCkgd2hpY2ggaXMgZWl0aGVyIGEKK3NvY2tldCAob3ZlciB0aGUgbmV0d29yaykgb3IgYSBwaXBlIChsb2NhbCkuICBXaGF0J3Mgd3JpdHRlbiB0bwordGhpcyBmZCBnb2VzIHRvIGdpdC1yZWNlaXZlLXBhY2sgdG8gYmUgdW5wYWNrZWQuCisKKyAgICBzZW5kLXBhY2sgLS0tPiBmZCAtLS0+IHJlY2VpdmUtcGFjaworCitUaGUgZnVuY3Rpb24gcGFja19vYmplY3RzIGNyZWF0ZXMgYSBwaXBlIGFuZCB0aGVuIGZvcmtzLiAgVGhlCitmb3JrZWQgY2hpbGQgZXhlY3MgcGFjay1vYmplY3RzIHdpdGggLS1yZXZzIHRvIHJlY2VpdmUgcmV2aXNpb24KK3BhcmFtZXRlcnMgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQuIFRoaXMgcHJvY2VzcyB3aWxsIHdyaXRlIHRoZQorcGFja2ZpbGUgdG8gdGhlIG90aGVyIGVuZC4KKworICAgIHNlbmQtcGFjaworICAgICAgIHwKKyAgICAgICBwYWNrX29iamVjdHMoKSAtLS0+IGZkIC0tLT4gcmVjZWl2ZS1wYWNrCisgICAgICAgICAgfCBeIChwaXBlKQorCSAgdiB8CisgICAgICAgICAoY2hpbGQpCisKK1RoZSBjaGlsZCBkdXAyJ3MgdG8gYXJyYW5nZSBpdHMgc3RhbmRhcmQgb3V0cHV0IHRvIGdvIGJhY2sgdG8KK3RoZSBvdGhlciBlbmQsIGFuZCByZWFkIGl0cyBzdGFuZGFyZCBpbnB1dCB0byBjb21lIGZyb20gdGhlCitwaXBlLiAgQWZ0ZXIgdGhhdCBpdCBleGVjJ3MgcGFjay1vYmplY3RzLiAgT24gdGhlIG90aGVyIGhhbmQsCit0aGUgcGFyZW50IHByb2Nlc3MsIGJlZm9yZSBzdGFydGluZyB0byBmZWVkIHRoZSBjaGlsZCBwaXBlbGluZSwKK2Nsb3NlcyB0aGUgcmVhZGluZyBzaWRlIG9mIHRoZSBwaXBlIGFuZCBmZCB0byByZWNlaXZlLXBhY2suCisKKyAgICBzZW5kLXBhY2sKKyAgICAgICB8CisgICAgICAgcGFja19vYmplY3RzKHBhcmVudCkKKyAgICAgICAgICB8CisJICB2IFswXQorICAgICAgICAgcGFjay1vYmplY3RzIFswXSAtLS0+IHJlY2VpdmUtcGFjaworCisKK1tqYzogdGhlIHBpcGVsaW5lIHdhcyBtdWNoIG1vcmUgY29tcGxleCBhbmQgbmVlZGVkIGRvY3VtZW50YXRpb24gYmVmb3JlCisgSSB1bmRlcnN0b29kIGFuIGVhcmxpZXIgYnVnLCBidXQgbm93IGl0IGlzIHRyaXZpYWwgYW5kIHN0cmFpZ2h0Zm9yd2FyZC5dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9zaGFsbG93LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NoYWxsb3cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTI2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9zaGFsbG93LnR4dApAQCAtMCwwICsxLDQ5IEBACitEZWYuOiBTaGFsbG93IGNvbW1pdHMgZG8gaGF2ZSBwYXJlbnRzLCBidXQgbm90IGluIHRoZSBzaGFsbG93CityZXBvLCBhbmQgdGhlcmVmb3JlIGdyYWZ0cyBhcmUgaW50cm9kdWNlZCBwcmV0ZW5kaW5nIHRoYXQKK3RoZXNlIGNvbW1pdHMgaGF2ZSBubyBwYXJlbnRzLgorCitUaGUgYmFzaWMgaWRlYSBpcyB0byB3cml0ZSB0aGUgU0hBMXMgb2Ygc2hhbGxvdyBjb21taXRzIGludG8KKyRHSVRfRElSL3NoYWxsb3csIGFuZCBoYW5kbGUgaXRzIGNvbnRlbnRzIGxpa2UgdGhlIGNvbnRlbnRzCitvZiAkR0lUX0RJUi9pbmZvL2dyYWZ0cyAod2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHNoYWxsb3cKK2Nhbm5vdCBjb250YWluIHBhcmVudCBpbmZvcm1hdGlvbikuCisKK1RoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGEgbmV3IGZpbGUgaW5zdGVhZCBvZiBncmFmdHMsIG9yCitldmVuIHRoZSBjb25maWcsIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBub3QgdG91Y2ggdGhhdCBmaWxlCithdCBhbGwgKGV2ZW4gdGhyb3VnaG91dCBkZXZlbG9wbWVudCBvZiB0aGUgc2hhbGxvdyBjbG9uZSwgaXQKK3dhcyBuZXZlciBtYW51YWxseSBlZGl0ZWQhKS4KKworRWFjaCBsaW5lIGNvbnRhaW5zIGV4YWN0bHkgb25lIFNIQTEuIFdoZW4gcmVhZCwgYSBjb21taXRfZ3JhZnQKK3dpbGwgYmUgY29uc3RydWN0ZWQsIHdoaWNoIGhhcyBucl9wYXJlbnQgPCAwIHRvIG1ha2UgaXQgZWFzaWVyCit0byBkaXNjZXJuIGZyb20gdXNlciBwcm92aWRlZCBncmFmdHMuCisKK1NpbmNlIGZzY2stb2JqZWN0cyByZWxpZXMgb24gdGhlIGxpYnJhcnkgdG8gcmVhZCB0aGUgb2JqZWN0cywKK2l0IGhvbm91cnMgc2hhbGxvdyBjb21taXRzIGF1dG9tYXRpY2FsbHkuCisKK1RoZXJlIGFyZSBzb21lIHVuZmluaXNoZWQgZW5kcyBvZiB0aGUgd2hvbGUgc2hhbGxvdyBidXNpbmVzczoKKworLSBtYXliZSB3ZSBoYXZlIHRvIGZvcmNlIG5vbi10aGluIHBhY2tzIHdoZW4gZmV0Y2hpbmcgaW50byBhCisgIHNoYWxsb3cgcmVwbyAoQVRNIHRoZXkgYXJlIGZvcmNlZCBub24tdGhpbikuCisKKy0gQSBzcGVjaWFsIGhhbmRsaW5nIG9mIGEgc2hhbGxvdyB1cHN0cmVhbSBpcyBuZWVkZWQuIEF0IHNvbWUKKyAgc3RhZ2UsIHVwbG9hZC1wYWNrIGhhcyB0byBjaGVjayBpZiBpdCBzZW5kcyBhIHNoYWxsb3cgY29tbWl0LAorICBhbmQgaXQgc2hvdWxkIHNlbmQgdGhhdCBpbmZvcm1hdGlvbiBlYXJseSAob3IgZmFpbCwgaWYgdGhlCisgIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHNoYWxsb3cgcmVwb3NpdG9yaWVzKS4gVGhlcmUgaXMgbm8KKyAgc3VwcG9ydCBhdCBhbGwgZm9yIHRoaXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMuCisKKy0gSW5zdGVhZCBvZiBsb2NraW5nICRHSVRfRElSL3NoYWxsb3cgYXQgdGhlIHN0YXJ0LCBqdXN0CisgIHRoZSB0aW1lc3RhbXAgb2YgaXQgaXMgbm90ZWQsIGFuZCB3aGVuIGl0IGNvbWVzIHRvIHdyaXRpbmcgaXQsCisgIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGlmIHRoZSBtdGltZSBpcyBzdGlsbCB0aGUgc2FtZSwgZHlpbmcgaWYKKyAgaXQgaXMgbm90LgorCistIEl0IGlzIHVuY2xlYXIgaG93ICJwdXNoIGludG8vZnJvbSBhIHNoYWxsb3cgcmVwbyIgc2hvdWxkIGJlaGF2ZS4KKworLSBJZiB5b3UgZGVlcGVuIGEgaGlzdG9yeSwgeW91J2Qgd2FudCB0byBnZXQgdGhlIHRhZ3Mgb2YgdGhlCisgIG5ld2x5IHN0b3JlZCAoYnV0IG9sZGVyISkgY29tbWl0cy4gVGhpcyBkb2VzIG5vdCB3b3JrIHJpZ2h0IG5vdy4KKworVG8gbWFrZSBhIHNoYWxsb3cgY2xvbmUsIHlvdSBjYW4gY2FsbCAiZ2l0LWNsb25lIC0tZGVwdGggMjAgcmVwbyIuCitUaGUgcmVzdWx0IGNvbnRhaW5zIG9ubHkgY29tbWl0IGNoYWlucyB3aXRoIGEgbGVuZ3RoIG9mIGF0IG1vc3QgMjAuCitJdCBhbHNvIHdyaXRlcyBhbiBhcHByb3ByaWF0ZSAkR0lUX0RJUi9zaGFsbG93LgorCitZb3UgY2FuIGRlZXBlbiBhIHNoYWxsb3cgcmVwb3NpdG9yeSB3aXRoICJnaXQtZmV0Y2ggLS1kZXB0aCAyMAorcmVwbyBicmFuY2giLCB3aGljaCB3aWxsIGZldGNoIGJyYW5jaCBmcm9tIHJlcG8sIGJ1dCBzdG9wIGF0IGRlcHRoCisyMCwgdXBkYXRpbmcgJEdJVF9ESVIvc2hhbGxvdy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvdHJpdmlhbC1tZXJnZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjODQxMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0CkBAIC0wLDAgKzEsMTIxIEBACitUcml2aWFsIG1lcmdlIHJ1bGVzCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBvdXRjb21lcyBvZiB0aGUgdHJpdmlhbCBtZXJnZSBsb2dpYyBpbiByZWFkLXRyZWUuCisKK09uZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0KKworVGhpcyByZXBsYWNlcyB0aGUgaW5kZXggd2l0aCBhIGRpZmZlcmVudCB0cmVlLCBrZWVwaW5nIHRoZSBzdGF0IGluZm8KK2ZvciBlbnRyaWVzIHRoYXQgZG9uJ3QgY2hhbmdlLCBhbmQgYWxsb3dpbmcgLXUgdG8gbWFrZSB0aGUgbWluaW11bQorcmVxdWlyZWQgY2hhbmdlcyB0byB0aGUgd29ya2luZyB0cmVlIHRvIGhhdmUgaXQgbWF0Y2guCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworICAgaW5kZXggICB0cmVlICAgIHJlc3VsdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgICAoZW1wdHkpIHRyZWUgICAgdHJlZQorICAgaW5kZXgrICB0cmVlICAgIHRyZWUKKyAgIGluZGV4KyAgaW5kZXggICBpbmRleCsKKworVHdvLXdheSBtZXJnZQorLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZSBvbGQKK29yIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCB3aGljaCBjaGFuZ2VzIHRoZSBpbmRleCBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5CithbmQgbm90IHVwLXRvLWRhdGUuCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworIGNhc2UgIGluZGV4ICAgb2xkICAgICBuZXcgICAgIHJlc3VsdAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwLzIgICAoZW1wdHkpICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgMS8zICAgKGVtcHR5KSAqICAgICAgIG5ldyAgICAgbmV3CisgNC81ICAgaW5kZXgrICAoZW1wdHkpIChlbXB0eSkgaW5kZXgrCisgNi83ICAgaW5kZXgrICAoZW1wdHkpIGluZGV4ICAgaW5kZXgrCisgMTAgICAgaW5kZXgrICBpbmRleCAgIChlbXB0eSkgKGVtcHR5KQorIDE0LzE1IGluZGV4KyAgb2xkICAgICBvbGQgICAgIGluZGV4KworIDE4LzE5IGluZGV4KyAgb2xkICAgICBpbmRleCAgIGluZGV4KworIDIwICAgIGluZGV4KyAgaW5kZXggICBuZXcgICAgIG5ldworCitUaHJlZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZQoraGVhZCBvciAoaWYgdGhlIG1lcmdlIGlzIHRyaXZpYWwpIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCBvZiAibm8gbWVyZ2UiIG1lYW5zIHRoYXQgaW5kZXggaXMgbGVmdCBpbiBzdGFnZSAwLCBhbmNlc3QgaW4KK3N0YWdlIDEsIGhlYWQgaW4gc3RhZ2UgMiwgYW5kIHJlbW90ZSBpbiBzdGFnZSAzIChpZiBhbnkgb2YgdGhlc2UgYXJlCitlbXB0eSwgbm8gZW50cnkgaXMgbGVmdCBmb3IgdGhhdCBzdGFnZSkuIE90aGVyd2lzZSwgdGhlIGdpdmVuIGVudHJ5IGlzCitsZWZ0IGluIHN0YWdlIDAsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgZW50cmllcy4KKworQSByZXN1bHQgb2YgIm5vIG1lcmdlIiBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5IGFuZCBub3QKK3VwLXRvLWRhdGUuCisKKyplbXB0eSogbWVhbnMgdGhhdCB0aGUgdHJlZSBtdXN0IG5vdCBoYXZlIGEgZGlyZWN0b3J5LWZpbGUgY29uZmxpY3QKKyB3aXRoIHRoZSBlbnRyeS4KKworRm9yIG11bHRpcGxlIGFuY2VzdG9ycywgYSAnKycgbWVhbnMgdGhhdCB0aGlzIGNhc2UgYXBwbGllcyBldmVuIGlmCitvbmx5IG9uZSBhbmNlc3RvciBvciByZW1vdGUgZml0czsgYSAnXicgbWVhbnMgYWxsIG9mIHRoZSBhbmNlc3RvcnMKK211c3QgYmUgdGhlIHNhbWUuCisKK2Nhc2UgIGFuY2VzdCAgICBoZWFkICAgIHJlbW90ZSAgICByZXN1bHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEgICAgIChlbXB0eSkrICAoZW1wdHkpIChlbXB0eSkgICAoZW1wdHkpCisyQUxUICAoZW1wdHkpKyAgKmVtcHR5KiByZW1vdGUgICAgcmVtb3RlCisyICAgICAoZW1wdHkpXiAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzNBTFQgIChlbXB0eSkrICBoZWFkICAgICplbXB0eSogICBoZWFkCiszICAgICAoZW1wdHkpXiAgaGVhZCAgICAoZW1wdHkpICAgbm8gbWVyZ2UKKzQgICAgIChlbXB0eSleICBoZWFkICAgIHJlbW90ZSAgICBubyBtZXJnZQorNUFMVCAgKiAgICAgICAgIGhlYWQgICAgaGVhZCAgICAgIGhlYWQKKzYgICAgIGFuY2VzdCsgICAoZW1wdHkpIChlbXB0eSkgICBubyBtZXJnZQorOCAgICAgYW5jZXN0XiAgIChlbXB0eSkgYW5jZXN0ICAgIG5vIG1lcmdlCis3ICAgICBhbmNlc3QrICAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzEwICAgIGFuY2VzdF4gICBhbmNlc3QgIChlbXB0eSkgICBubyBtZXJnZQorOSAgICAgYW5jZXN0KyAgIGhlYWQgICAgKGVtcHR5KSAgIG5vIG1lcmdlCisxNiAgICBhbmMxL2FuYzIgYW5jMSAgICBhbmMyICAgICAgbm8gbWVyZ2UKKzEzICAgIGFuY2VzdCsgICBoZWFkICAgIGFuY2VzdCAgICBoZWFkCisxNCAgICBhbmNlc3QrICAgYW5jZXN0ICByZW1vdGUgICAgcmVtb3RlCisxMSAgICBhbmNlc3QrICAgaGVhZCAgICByZW1vdGUgICAgbm8gbWVyZ2UKKworT25seSAjMkFMVCBhbmQgIzNBTFQgdXNlICplbXB0eSosIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBvbmx5IGNhc2VzCit3aGVyZSB0aGVyZSBjYW4gYmUgY29uZmxpY3RzIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZS4gTm90ZSB0aGF0IHdlCithbGxvdyBkaXJlY3RvcnktZmlsZSBjb25mbGljdHMgYmV0d2VlbiB0aGluZ3MgaW4gZGlmZmVyZW50IHN0YWdlcworYWZ0ZXIgdGhlIHRyaXZpYWwgbWVyZ2UuCisKK0EgcG9zc2libGUgYWx0ZXJuYXRpdmUgZm9yICM2IGlzIChlbXB0eSksIHdoaWNoIHdvdWxkIG1ha2UgaXQgbGlrZQorIzEuIFRoaXMgaXMgbm90IHVzZWQsIGR1ZSB0byB0aGUgbGlrZWxpaG9vZCB0aGF0IGl0IGFyaXNlcyBkdWUgdG8KK21vdmluZyB0aGUgZmlsZSB0byBtdWx0aXBsZSBkaWZmZXJlbnQgbG9jYXRpb25zIG9yIG1vdmluZyBhbmQgZGVsZXRpbmcKK2l0IGluIGRpZmZlcmVudCBicmFuY2hlcy4KKworQ2FzZSAjMSBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLCBhbmQgYWxzbyBpbiBjYXNlIHdlIGRlY2lkZSB0bworcHV0IG9uICcrJyBtYXJraW5nczsgYW55IHBhdGggdGhhdCBpcyBuZXZlciBtZW50aW9uZWQgYXQgYWxsIGlzbid0CitoYW5kbGVkLgorCitOb3RlIHRoYXQgIzE2IGlzIHdoZW4gYm90aCAjMTMgYW5kICMxNCBhcHBseTsgaW4gdGhpcyBjYXNlLCB3ZSByZWZ1c2UKK3RoZSB0cml2aWFsIG1lcmdlLCBiZWNhdXNlIHdlIGNhbid0IHRlbGwgZnJvbSB0aGlzIGRhdGEgd2hpY2ggaXMKK3JpZ2h0LiBUaGlzIGlzIGEgY2FzZSBvZiBhIHJldmVydGVkIHBhdGNoIChpbiBzb21lIGRpcmVjdGlvbiwgbWF5YmUKK211bHRpcGxlIHRpbWVzKSwgYW5kIHRoZSByaWdodCBhbnN3ZXIgZGVwZW5kcyBvbiBsb29raW5nIGF0IGNyb3NzaW5ncworb2YgaGlzdG9yeSBvciBjb21tb24gYW5jZXN0b3JzIG9mIHRoZSBhbmNlc3RvcnMuCisKK05vdGUgdGhhdCwgYmV0d2VlbiAjNiwgIzcsICM5LCBhbmQgIzExLCBhbGwgY2FzZXMgbm90IG90aGVyd2lzZQorY292ZXJlZCBhcmUgaGFuZGxlZCBpbiB0aGlzIHRhYmxlLgorCitGb3IgIzggYW5kICMxMCwgdGhlcmUgaXMgYWx0ZXJuYXRpdmUgYmVoYXZpb3IsIG5vdCBjdXJyZW50bHkKK2ltcGxlbWVudGVkLCB3aGVyZSB0aGUgcmVzdWx0IGlzIChlbXB0eSkuIEFzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCwKK3RoZSBhdXRvbWF0aWMgbWVyZ2Ugd2lsbCBnZW5lcmFsbHkgZ2l2ZSB0aGlzIGVmZmVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHV0b3JpYWwtMi50eHQgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzlhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0CkBAIC0wLDAgKzEsNDA2IEBACitBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byBnaXQ6IHBhcnQgdHdvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBzaG91bGQgd29yayB0aHJvdWdoIGxpbms6dHV0b3JpYWwuaHRtbFtBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0bworZ2l0XSBiZWZvcmUgcmVhZGluZyB0aGlzIHR1dG9yaWFsLgorCitUaGUgZ29hbCBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGludHJvZHVjZSB0d28gZnVuZGFtZW50YWwgcGllY2VzIG9mCitnaXQncyBhcmNoaXRlY3R1cmUtLXRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHRoZSBpbmRleCBmaWxlLS1hbmQgdG8KK3Byb3ZpZGUgdGhlIHJlYWRlciB3aXRoIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHVuZGVyc3RhbmQgdGhlIHJlc3QKK29mIHRoZSBnaXQgZG9jdW1lbnRhdGlvbi4KKworVGhlIGdpdCBvYmplY3QgZGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xldCdzIHN0YXJ0IGEgbmV3IHByb2plY3QgYW5kIGNyZWF0ZSBhIHNtYWxsIGFtb3VudCBvZiBoaXN0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgdGVzdC1wcm9qZWN0CiskIGNkIHRlc3QtcHJvamVjdAorJCBnaXQgaW5pdAorSW5pdGlhbGl6ZWQgZW1wdHkgR2l0IHJlcG9zaXRvcnkgaW4gLmdpdC8KKyQgZWNobyAnaGVsbG8gd29ybGQnID4gZmlsZS50eHQKKyQgZ2l0IGFkZCAuCiskIGdpdCBjb21taXQgLWEgLW0gImluaXRpYWwgY29tbWl0IgorQ3JlYXRlZCBpbml0aWFsIGNvbW1pdCA1NDE5NmNjMjcwM2RjMTY1Y2JkMzczYTY1YTRkY2YyMmQ1MGFlN2Y3CisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUudHh0CiskIGVjaG8gJ2hlbGxvIHdvcmxkIScgPmZpbGUudHh0CiskIGdpdCBjb21taXQgLWEgLW0gImFkZCBlbXBoYXNpcyIKK0NyZWF0ZWQgY29tbWl0IGM0ZDU5ZjM5MGI5Y2ZkNDMxODExN2FmZGUxMWQ2MDFjMTA4NWYyNDEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0IGFyZSB0aGUgNDAgZGlnaXRzIG9mIGhleCB0aGF0IGdpdCByZXNwb25kZWQgdG8gdGhlIGNvbW1pdCB3aXRoPworCitXZSBzYXcgaW4gcGFydCBvbmUgb2YgdGhlIHR1dG9yaWFsIHRoYXQgY29tbWl0cyBoYXZlIG5hbWVzIGxpa2UgdGhpcy4KK0l0IHR1cm5zIG91dCB0aGF0IGV2ZXJ5IG9iamVjdCBpbiB0aGUgZ2l0IGhpc3RvcnkgaXMgc3RvcmVkIHVuZGVyCitzdWNoIGEgNDAtZGlnaXQgaGV4IG5hbWUuICBUaGF0IG5hbWUgaXMgdGhlIFNIQTEgaGFzaCBvZiB0aGUgb2JqZWN0J3MKK2NvbnRlbnRzOyBhbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgZW5zdXJlcyB0aGF0IGdpdCB3aWxsIG5ldmVyIHN0b3JlCit0aGUgc2FtZSBkYXRhIHR3aWNlIChzaW5jZSBpZGVudGljYWwgZGF0YSBpcyBnaXZlbiBhbiBpZGVudGljYWwgU0hBMQorbmFtZSksIGFuZCB0aGF0IHRoZSBjb250ZW50cyBvZiBhIGdpdCBvYmplY3Qgd2lsbCBuZXZlciBjaGFuZ2UgKHNpbmNlCit0aGF0IHdvdWxkIGNoYW5nZSB0aGUgb2JqZWN0J3MgbmFtZSBhcyB3ZWxsKS4KKworSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgY29tbWl0IG9iamVjdCB5b3UgY3JlYXRlZCB3aGlsZQorZm9sbG93aW5nIHRoZSBleGFtcGxlIGFib3ZlIGdlbmVyYXRlcyBhIGRpZmZlcmVudCBTSEExIGhhc2ggdGhhbgordGhlIG9uZSBzaG93biBhYm92ZSBiZWNhdXNlIHRoZSBjb21taXQgb2JqZWN0IHJlY29yZHMgdGhlIHRpbWUgd2hlbgoraXQgd2FzIGNyZWF0ZWQgYW5kIHRoZSBuYW1lIG9mIHRoZSBwZXJzb24gcGVyZm9ybWluZyB0aGUgY29tbWl0LgorCitXZSBjYW4gYXNrIGdpdCBhYm91dCB0aGlzIHBhcnRpY3VsYXIgb2JqZWN0IHdpdGggdGhlIGNhdC1maWxlCitjb21tYW5kLiBEb24ndCBjb3B5IHRoZSA0MCBoZXggZGlnaXRzIGZyb20gdGhpcyBleGFtcGxlIGJ1dCB1c2UgdGhvc2UKK2Zyb20geW91ciBvd24gdmVyc2lvbi4gTm90ZSB0aGF0IHlvdSBjYW4gc2hvcnRlbiBpdCB0byBvbmx5IGEgZmV3CitjaGFyYWN0ZXJzIHRvIHNhdmUgeW91cnNlbGYgdHlwaW5nIGFsbCA0MCBoZXggZGlnaXRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIC10IDU0MTk2Y2MyCitjb21taXQKKyQgZ2l0LWNhdC1maWxlIGNvbW1pdCA1NDE5NmNjMgordHJlZSA5MmI4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCithdXRob3IgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHB1enpsZS5maWVsZHNlcy5vcmc+IDExNDM0MTQ2NjggLTA1MDAKK2NvbW1pdHRlciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorCitpbml0aWFsIGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgdHJlZSBjYW4gcmVmZXIgdG8gb25lIG9yIG1vcmUgImJsb2IiIG9iamVjdHMsIGVhY2ggY29ycmVzcG9uZGluZyB0bworYSBmaWxlLiAgSW4gYWRkaXRpb24sIGEgdHJlZSBjYW4gYWxzbyByZWZlciB0byBvdGhlciB0cmVlIG9iamVjdHMsCit0aHVzIGNyZWF0aW5nIGEgZGlyZWN0b3J5IGhpZXJhcmNoeS4gIFlvdSBjYW4gZXhhbWluZSB0aGUgY29udGVudHMgb2YKK2FueSB0cmVlIHVzaW5nIGxzLXRyZWUgKHJlbWVtYmVyIHRoYXQgYSBsb25nIGVub3VnaCBpbml0aWFsIHBvcnRpb24KK29mIHRoZSBTSEExIHdpbGwgYWxzbyB3b3JrKToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy10cmVlIDkyYjhiNjk0CisxMDA2NDQgYmxvYiAzYjE4ZTUxMmRiYTc5ZTRjODMwMGRkMDhhZWIzN2Y4ZTcyOGI4ZGFkICAgIGZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGh1cyB3ZSBzZWUgdGhhdCB0aGlzIHRyZWUgaGFzIG9uZSBmaWxlIGluIGl0LiAgVGhlIFNIQTEgaGFzaCBpcyBhCityZWZlcmVuY2UgdG8gdGhhdCBmaWxlJ3MgZGF0YToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSAtdCAzYjE4ZTUxMgorYmxvYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgImJsb2IiIGlzIGp1c3QgZmlsZSBkYXRhLCB3aGljaCB3ZSBjYW4gYWxzbyBleGFtaW5lIHdpdGggY2F0LWZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgYmxvYiAzYjE4ZTUxMgoraGVsbG8gd29ybGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb2xkIGZpbGUgZGF0YTsgc28gdGhlIG9iamVjdCB0aGF0IGdpdCBuYW1lZCBpbgoraXRzIHJlc3BvbnNlIHRvIHRoZSBpbml0aWFsIHRyZWUgd2FzIGEgdHJlZSB3aXRoIGEgc25hcHNob3Qgb2YgdGhlCitkaXJlY3Rvcnkgc3RhdGUgdGhhdCB3YXMgcmVjb3JkZWQgYnkgdGhlIGZpcnN0IGNvbW1pdC4KKworQWxsIG9mIHRoZXNlIG9iamVjdHMgYXJlIHN0b3JlZCB1bmRlciB0aGVpciBTSEExIG5hbWVzIGluc2lkZSB0aGUgZ2l0CitkaXJlY3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBmaW5kIC5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy9wYWNrCisuZ2l0L29iamVjdHMvaW5mbworLmdpdC9vYmplY3RzLzNiCisuZ2l0L29iamVjdHMvM2IvMThlNTEyZGJhNzllNGM4MzAwZGQwOGFlYjM3ZjhlNzI4YjhkYWQKKy5naXQvb2JqZWN0cy85MgorLmdpdC9vYmplY3RzLzkyL2I4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCisuZ2l0L29iamVjdHMvNTQKKy5naXQvb2JqZWN0cy81NC8xOTZjYzI3MDNkYzE2NWNiZDM3M2E2NWE0ZGNmMjJkNTBhZTdmNworLmdpdC9vYmplY3RzL2EwCisuZ2l0L29iamVjdHMvYTAvNDIzODk2OTczNjQ0NzcxNDk3YmRjMDNlYjk5ZDUyODE2MTViNTEKKy5naXQvb2JqZWN0cy9kMAorLmdpdC9vYmplY3RzL2QwLzQ5MmIzNjhiNjZiZGFiZjJhYzFmZDhjOTJiMzlkM2RiOTE2ZTU5CisuZ2l0L29iamVjdHMvYzQKKy5naXQvb2JqZWN0cy9jNC9kNTlmMzkwYjljZmQ0MzE4MTE3YWZkZTExZDYwMWMxMDg1ZjI0MQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGUgY29udGVudHMgb2YgdGhlc2UgZmlsZXMgaXMganVzdCB0aGUgY29tcHJlc3NlZCBkYXRhIHBsdXMgYQoraGVhZGVyIGlkZW50aWZ5aW5nIHRoZWlyIGxlbmd0aCBhbmQgdGhlaXIgdHlwZS4gIFRoZSB0eXBlIGlzIGVpdGhlciBhCitibG9iLCBhIHRyZWUsIGEgY29tbWl0LCBvciBhIHRhZy4KKworVGhlIHNpbXBsZXN0IGNvbW1pdCB0byBmaW5kIGlzIHRoZSBIRUFEIGNvbW1pdCwgd2hpY2ggd2UgY2FuIGZpbmQKK2Zyb20gLmdpdC9IRUFEOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorcmVmOiByZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBjYW4gc2VlLCB0aGlzIHRlbGxzIHVzIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgb24sIGFuZCBpdAordGVsbHMgdXMgdGhpcyBieSBuYW1pbmcgYSBmaWxlIHVuZGVyIHRoZSAuZ2l0IGRpcmVjdG9yeSwgd2hpY2ggaXRzZWxmCitjb250YWlucyBhIFNIQTEgbmFtZSByZWZlcnJpbmcgdG8gYSBjb21taXQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KK2V4YW1pbmUgd2l0aCBjYXQtZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCitjNGQ1OWYzOTBiOWNmZDQzMTgxMTdhZmRlMTFkNjAxYzEwODVmMjQxCiskIGdpdCBjYXQtZmlsZSAtdCBjNGQ1OWYzOQorY29tbWl0CiskIGdpdCBjYXQtZmlsZSBjb21taXQgYzRkNTlmMzkKK3RyZWUgZDA0OTJiMzY4YjY2YmRhYmYyYWMxZmQ4YzkyYjM5ZDNkYjkxNmU1OQorcGFyZW50IDU0MTk2Y2MyNzAzZGMxNjVjYmQzNzNhNjVhNGRjZjIyZDUwYWU3ZjcKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxODcwMiAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE4NzAyIC0wNTAwCisKK2FkZCBlbXBoYXNpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAidHJlZSIgb2JqZWN0IGhlcmUgcmVmZXJzIHRvIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHRyZWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtdHJlZSBkMDQ5MmIzNgorMTAwNjQ0IGJsb2IgYTA0MjM4OTY5NzM2NDQ3NzE0OTdiZGMwM2ViOTlkNTI4MTYxNWI1MSAgICBmaWxlLnR4dAorJCBnaXQgY2F0LWZpbGUgYmxvYiBhMDQyMzg5NgoraGVsbG8gd29ybGQhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZSAicGFyZW50IiBvYmplY3QgcmVmZXJzIHRvIHRoZSBwcmV2aW91cyBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgY29tbWl0IDU0MTk2Y2MyCit0cmVlIDkyYjhiNjk0ZmZiMTY3NWU1OTc1MTQ4ZTExMjE4MTAwODFkYmRmZmUKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE0NjY4IC0wNTAwCisKK2luaXRpYWwgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRyZWUgb2JqZWN0IGlzIHRoZSB0cmVlIHdlIGV4YW1pbmVkIGZpcnN0LCBhbmQgdGhpcyBjb21taXQgaXMKK3VudXN1YWwgaW4gdGhhdCBpdCBsYWNrcyBhbnkgcGFyZW50LgorCitNb3N0IGNvbW1pdHMgaGF2ZSBvbmx5IG9uZSBwYXJlbnQsIGJ1dCBpdCBpcyBhbHNvIGNvbW1vbiBmb3IgYSBjb21taXQKK3RvIGhhdmUgbXVsdGlwbGUgcGFyZW50cy4gICBJbiB0aGF0IGNhc2UgdGhlIGNvbW1pdCByZXByZXNlbnRzIGEKK21lcmdlLCB3aXRoIHRoZSBwYXJlbnQgcmVmZXJlbmNlcyBwb2ludGluZyB0byB0aGUgaGVhZHMgb2YgdGhlIG1lcmdlZAorYnJhbmNoZXMuCisKK0Jlc2lkZXMgYmxvYnMsIHRyZWVzLCBhbmQgY29tbWl0cywgdGhlIG9ubHkgcmVtYWluaW5nIHR5cGUgb2Ygb2JqZWN0CitpcyBhICJ0YWciLCB3aGljaCB3ZSB3b24ndCBkaXNjdXNzIGhlcmU7IHJlZmVyIHRvIGdpdGxpbms6Z2l0LXRhZ1sxXQorZm9yIGRldGFpbHMuCisKK1NvIG5vdyB3ZSBrbm93IGhvdyBnaXQgdXNlcyB0aGUgb2JqZWN0IGRhdGFiYXNlIHRvIHJlcHJlc2VudCBhCitwcm9qZWN0J3MgaGlzdG9yeToKKworICAqICJjb21taXQiIG9iamVjdHMgcmVmZXIgdG8gInRyZWUiIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZQorICAgIHNuYXBzaG90IG9mIGEgZGlyZWN0b3J5IHRyZWUgYXQgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZQorICAgIGhpc3RvcnksIGFuZCByZWZlciB0byAicGFyZW50IiBjb21taXRzIHRvIHNob3cgaG93IHRoZXkncmUKKyAgICBjb25uZWN0ZWQgaW50byB0aGUgcHJvamVjdCBoaXN0b3J5LgorICAqICJ0cmVlIiBvYmplY3RzIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgZGlyZWN0b3J5LAorICAgIGFzc29jaWF0aW5nIGRpcmVjdG9yeSBuYW1lcyB0byAiYmxvYiIgb2JqZWN0cyBjb250YWluaW5nIGZpbGUKKyAgICBkYXRhIGFuZCAidHJlZSIgb2JqZWN0cyBjb250YWluaW5nIHN1YmRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgKiAiYmxvYiIgb2JqZWN0cyBjb250YWluIGZpbGUgZGF0YSB3aXRob3V0IGFueSBvdGhlciBzdHJ1Y3R1cmUuCisgICogUmVmZXJlbmNlcyB0byBjb21taXQgb2JqZWN0cyBhdCB0aGUgaGVhZCBvZiBlYWNoIGJyYW5jaCBhcmUKKyAgICBzdG9yZWQgaW4gZmlsZXMgdW5kZXIgLmdpdC9yZWZzL2hlYWRzLy4KKyAgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2ggaXMgc3RvcmVkIGluIC5naXQvSEVBRC4KKworTm90ZSwgYnkgdGhlIHdheSwgdGhhdCBsb3RzIG9mIGNvbW1hbmRzIHRha2UgYSB0cmVlIGFzIGFuIGFyZ3VtZW50LgorQnV0IGFzIHdlIGNhbiBzZWUgYWJvdmUsIGEgdHJlZSBjYW4gYmUgcmVmZXJyZWQgdG8gaW4gbWFueSBkaWZmZXJlbnQKK3dheXMtLWJ5IHRoZSBTSEExIG5hbWUgZm9yIHRoYXQgdHJlZSwgYnkgdGhlIG5hbWUgb2YgYSBjb21taXQgdGhhdAorcmVmZXJzIHRvIHRoZSB0cmVlLCBieSB0aGUgbmFtZSBvZiBhIGJyYW5jaCB3aG9zZSBoZWFkIHJlZmVycyB0byB0aGF0Cit0cmVlLCBldGMuLS1hbmQgbW9zdCBzdWNoIGNvbW1hbmRzIGNhbiBhY2NlcHQgYW55IG9mIHRoZXNlIG5hbWVzLgorCitJbiBjb21tYW5kIHN5bm9wc2VzLCB0aGUgd29yZCAidHJlZS1pc2giIGlzIHNvbWV0aW1lcyB1c2VkIHRvCitkZXNpZ25hdGUgc3VjaCBhbiBhcmd1bWVudC4KKworVGhlIGluZGV4IGZpbGUKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcmltYXJ5IHRvb2wgd2UndmUgYmVlbiB1c2luZyB0byBjcmVhdGUgY29tbWl0cyBpcyAiZ2l0IGNvbW1pdAorLWEiLCB3aGljaCBjcmVhdGVzIGEgY29tbWl0IGluY2x1ZGluZyBldmVyeSBjaGFuZ2UgeW91J3ZlIG1hZGUgdG8KK3lvdXIgd29ya2luZyB0cmVlLiAgQnV0IHdoYXQgaWYgeW91IHdhbnQgdG8gY29tbWl0IGNoYW5nZXMgb25seSB0bworY2VydGFpbiBmaWxlcz8gIE9yIG9ubHkgY2VydGFpbiBjaGFuZ2VzIHRvIGNlcnRhaW4gZmlsZXM/CisKK0lmIHdlIGxvb2sgYXQgdGhlIHdheSBjb21taXRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoZSBjb3Zlciwgd2UnbGwgc2VlCit0aGF0IHRoZXJlIGFyZSBtb3JlIGZsZXhpYmxlIHdheXMgY3JlYXRpbmcgY29tbWl0cy4KKworQ29udGludWluZyB3aXRoIG91ciB0ZXN0LXByb2plY3QsIGxldCdzIG1vZGlmeSBmaWxlLnR4dCBhZ2FpbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gImhlbGxvIHdvcmxkLCBhZ2FpbiIgPj5maWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0aGlzIHRpbWUgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBtYWtpbmcgdGhlIGNvbW1pdCwgbGV0J3MgdGFrZSBhbgoraW50ZXJtZWRpYXRlIHN0ZXAsIGFuZCBhc2sgZm9yIGRpZmZzIGFsb25nIHRoZSB3YXkgdG8ga2VlcCB0cmFjayBvZgord2hhdCdzIGhhcHBlbmluZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKyQgZ2l0IGFkZCBmaWxlLnR4dAorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBsYXN0IGRpZmYgaXMgZW1wdHksIGJ1dCBubyBuZXcgY29tbWl0cyBoYXZlIGJlZW4gbWFkZSwgYW5kIHRoZQoraGVhZCBzdGlsbCBkb2Vzbid0IGNvbnRhaW4gdGhlIG5ldyBsaW5lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLjUxM2ZlYmEgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyAiZ2l0IGRpZmYiIGlzIGNvbXBhcmluZyBhZ2FpbnN0IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkLgorVGhlIHRoaW5nIHRoYXQgaXQncyBjb21wYXJpbmcgYWdhaW5zdCBpcyBhY3R1YWxseSB0aGUgaW5kZXggZmlsZSwKK3doaWNoIGlzIHN0b3JlZCBpbiAuZ2l0L2luZGV4IGluIGEgYmluYXJ5IGZvcm1hdCwgYnV0IHdob3NlIGNvbnRlbnRzCit3ZSBjYW4gZXhhbWluZSB3aXRoIGxzLWZpbGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UKKzEwMDY0NCA1MTNmZWJhMmU1M2ViYmQyNTMyNDE5ZGVkODQ4YmExOWRlODhiYTAwIDAgICAgICAgZmlsZS50eHQKKyQgZ2l0IGNhdC1maWxlIC10IDUxM2ZlYmEyCitibG9iCiskIGdpdCBjYXQtZmlsZSBibG9iIDUxM2ZlYmEyCitoZWxsbyB3b3JsZCEKK2hlbGxvIHdvcmxkLCBhZ2FpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvIHdoYXQgb3VyICJnaXQgYWRkIiBkaWQgd2FzIHN0b3JlIGEgbmV3IGJsb2IgYW5kIHRoZW4gcHV0CithIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgaW5kZXggZmlsZS4gIElmIHdlIG1vZGlmeSB0aGUgZmlsZSBhZ2FpbiwKK3dlJ2xsIHNlZSB0aGF0IHRoZSBuZXcgbW9kaWZpY2F0aW9ucyBhcmUgcmVmbGVjdGVkIGluIHRoZSAiZ2l0LWRpZmYiCitvdXRwdXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICdhZ2Fpbj8nID4+ZmlsZS50eHQKKyQgZ2l0IGRpZmYKK2luZGV4IDUxM2ZlYmEuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xLDIgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorIGhlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cywgZ2l0IGRpZmYgY2FuIGFsc28gc2hvdyB1cyB0aGUgZGlmZmVyZW5jZQorYmV0d2VlbiB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIHRoZSBsYXN0IGNvbW1pdCwgb3IgYmV0d2VlbiB0aGUKK2luZGV4IGFuZCB0aGUgbGFzdCBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiBIRUFECitkaWZmIC0tZ2l0IGEvZmlsZS50eHQgYi9maWxlLnR4dAoraW5kZXggYTA0MjM4OS4uYmEzZGE3YiAxMDA2NDQKKy0tLSBhL2ZpbGUudHh0CisrKysgYi9maWxlLnR4dAorQEAgLTEgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorK2hlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworJCBnaXQgZGlmZiAtLWNhY2hlZAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLjUxM2ZlYmEgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBhbnkgdGltZSwgd2UgY2FuIGNyZWF0ZSBhIG5ldyBjb21taXQgdXNpbmcgImdpdCBjb21taXQiICh3aXRob3V0Cit0aGUgLWEgb3B0aW9uKSwgYW5kIHZlcmlmeSB0aGF0IHRoZSBzdGF0ZSBjb21taXR0ZWQgb25seSBpbmNsdWRlcyB0aGUKK2NoYW5nZXMgc3RvcmVkIGluIHRoZSBpbmRleCBmaWxlLCBub3QgdGhlIGFkZGl0aW9uYWwgY2hhbmdlIHRoYXQgaXMKK3N0aWxsIG9ubHkgaW4gb3VyIHdvcmtpbmcgdHJlZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLW0gInJlcGVhdCIKKyQgZ2l0IGRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IDUxM2ZlYmEuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xLDIgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorIGhlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvIGJ5IGRlZmF1bHQgImdpdCBjb21taXQiIHVzZXMgdGhlIGluZGV4IHRvIGNyZWF0ZSB0aGUgY29tbWl0LCBub3QKK3RoZSB3b3JraW5nIHRyZWU7IHRoZSAtYSBvcHRpb24gdG8gY29tbWl0IHRlbGxzIGl0IHRvIGZpcnN0IHVwZGF0ZQordGhlIGluZGV4IHdpdGggYWxsIGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKworRmluYWxseSwgaXQncyB3b3J0aCBsb29raW5nIGF0IHRoZSBlZmZlY3Qgb2YgImdpdCBhZGQiIG9uIHRoZSBpbmRleAorZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gImdvb2RieWUsIHdvcmxkIiA+Y2xvc2luZy50eHQKKyQgZ2l0IGFkZCBjbG9zaW5nLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBlZmZlY3Qgb2YgdGhlICJnaXQgYWRkIiB3YXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgaW5kZXggZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtLXN0YWdlCisxMDA2NDQgOGI5NzQzYjIwZDRiMTViZTM5NTVmYzhkNWNkMmIwOWNkMjMzNjEzOCAwICAgICAgIGNsb3NpbmcudHh0CisxMDA2NDQgNTEzZmViYTJlNTNlYmJkMjUzMjQxOWRlZDg0OGJhMTlkZTg4YmEwMCAwICAgICAgIGZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kLCBhcyB5b3UgY2FuIHNlZSB3aXRoIGNhdC1maWxlLCB0aGlzIG5ldyBlbnRyeSByZWZlcnMgdG8gdGhlCitjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIGJsb2IgOGI5NzQzYjIKK2dvb2RieWUsIHdvcmxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJzdGF0dXMiIGNvbW1hbmQgaXMgYSB1c2VmdWwgd2F5IHRvIGdldCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlCitzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzCisjIE9uIGJyYW5jaCBtYXN0ZXIKKyMgQ2hhbmdlcyB0byBiZSBjb21taXR0ZWQ6CisjICAgKHVzZSAiZ2l0IHJlc2V0IEhFQUQgPGZpbGU+Li4uIiB0byB1bnN0YWdlKQorIworIyAgICAgICBuZXcgZmlsZTogY2xvc2luZy50eHQKKyMKKyMgQ2hhbmdlZCBidXQgbm90IHVwZGF0ZWQ6CisjICAgKHVzZSAiZ2l0IGFkZCA8ZmlsZT4uLi4iIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIyAgICAgICBtb2RpZmllZDogZmlsZS50eHQKKyMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaW5jZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBjbG9zaW5nLnR4dCBpcyBjYWNoZWQgaW4gdGhlIGluZGV4IGZpbGUsCitpdCBpcyBsaXN0ZWQgYXMgIkNoYW5nZXMgdG8gYmUgY29tbWl0dGVkIi4gIFNpbmNlIGZpbGUudHh0IGhhcworY2hhbmdlcyBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCBhcmVuJ3QgcmVmbGVjdGVkIGluIHRoZSBpbmRleCwKK2l0IGlzIG1hcmtlZCAiY2hhbmdlZCBidXQgbm90IHVwZGF0ZWQiLiAgQXQgdGhpcyBwb2ludCwgcnVubmluZyAiZ2l0Citjb21taXQiIHdvdWxkIGNyZWF0ZSBhIGNvbW1pdCB0aGF0IGFkZGVkIGNsb3NpbmcudHh0ICh3aXRoIGl0cyBuZXcKK2NvbnRlbnRzKSwgYnV0IHRoYXQgZGlkbid0IG1vZGlmeSBmaWxlLnR4dC4KKworQWxzbywgbm90ZSB0aGF0IGEgYmFyZSAiZ2l0IGRpZmYiIHNob3dzIHRoZSBjaGFuZ2VzIHRvIGZpbGUudHh0LCBidXQKK25vdCB0aGUgYWRkaXRpb24gb2YgY2xvc2luZy50eHQsIGJlY2F1c2UgdGhlIHZlcnNpb24gb2YgY2xvc2luZy50eHQKK2luIHRoZSBpbmRleCBmaWxlIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKworSW4gYWRkaXRpb24gdG8gYmVpbmcgdGhlIHN0YWdpbmcgYXJlYSBmb3IgbmV3IGNvbW1pdHMsIHRoZSBpbmRleCBmaWxlCitpcyBhbHNvIHBvcHVsYXRlZCBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2hlbiBjaGVja2luZyBvdXQgYQorYnJhbmNoLCBhbmQgaXMgdXNlZCB0byBob2xkIHRoZSB0cmVlcyBpbnZvbHZlZCBpbiBhIG1lcmdlIG9wZXJhdGlvbi4KK1NlZSB0aGUgbGluazpjb3JlLXR1dG9yaWFsLmh0bWxbY29yZSB0dXRvcmlhbF0gYW5kIHRoZSByZWxldmFudCBtYW4KK3BhZ2VzIGZvciBkZXRhaWxzLgorCitXaGF0IG5leHQ/CistLS0tLS0tLS0tCisKK0F0IHRoaXMgcG9pbnQgeW91IHNob3VsZCBrbm93IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIG1hbgorcGFnZXMgZm9yIGFueSBvZiB0aGUgZ2l0IGNvbW1hbmRzOyBvbmUgZ29vZCBwbGFjZSB0byBzdGFydCB3b3VsZCBiZQord2l0aCB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGluIGxpbms6ZXZlcnlkYXkuaHRtbFtFdmVyeWRheSBnaXRdLiAgWW91CitzaG91bGQgYmUgYWJsZSB0byBmaW5kIGFueSB1bmtub3duIGphcmdvbiBpbiB0aGUKK2xpbms6Z2xvc3NhcnkuaHRtbFtHbG9zc2FyeV0uCisKK1RoZSBsaW5rOnVzZXItbWFudWFsLmh0bWxbR2l0IFVzZXIncyBNYW51YWxdIHByb3ZpZGVzIGEgbW9yZQorY29tcHJlaGVuc2l2ZSBpbnRyb2R1Y3Rpb24gdG8gZ2l0LgorCitUaGUgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbQ1ZTIG1pZ3JhdGlvbl0gZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvCitpbXBvcnQgYSBDVlMgcmVwb3NpdG9yeSBpbnRvIGdpdCwgYW5kIHNob3dzIGhvdyB0byB1c2UgZ2l0IGluIGEKK0NWUy1saWtlIHdheS4KKworRm9yIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgb2YgZ2l0IHVzZSwgc2VlIHRoZQorbGluazpob3d0by1pbmRleC5odG1sW2hvd3Rvc10uCisKK0ZvciBnaXQgZGV2ZWxvcGVycywgdGhlIGxpbms6Y29yZS10dXRvcmlhbC5odG1sW0NvcmUgdHV0b3JpYWxdIGdvZXMKK2ludG8gZGV0YWlsIG9uIHRoZSBsb3dlci1sZXZlbCBnaXQgbWVjaGFuaXNtcyBpbnZvbHZlZCBpbiwgZm9yCitleGFtcGxlLCBjcmVhdGluZyBhIG5ldyBjb21taXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWVjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dApAQCAtMCwwICsxLDU4NCBAQAorQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0IChmb3IgdmVyc2lvbiAxLjUuMSBvciBuZXdlcikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgdHV0b3JpYWwgZXhwbGFpbnMgaG93IHRvIGltcG9ydCBhIG5ldyBwcm9qZWN0IGludG8gZ2l0LCBtYWtlCitjaGFuZ2VzIHRvIGl0LCBhbmQgc2hhcmUgY2hhbmdlcyB3aXRoIG90aGVyIGRldmVsb3BlcnMuCisKK0lmIHlvdSBhcmUgaW5zdGVhZCBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB1c2luZyBnaXQgdG8gZmV0Y2ggYSBwcm9qZWN0LAorZm9yIGV4YW1wbGUsIHRvIHRlc3QgdGhlIGxhdGVzdCB2ZXJzaW9uLCB5b3UgbWF5IHByZWZlciB0byBzdGFydCB3aXRoCit0aGUgZmlyc3QgdHdvIGNoYXB0ZXJzIG9mIGxpbms6dXNlci1tYW51YWwuaHRtbFtUaGUgR2l0IFVzZXIncyBNYW51YWxdLgorCitGaXJzdCwgbm90ZSB0aGF0IHlvdSBjYW4gZ2V0IGRvY3VtZW50YXRpb24gZm9yIGEgY29tbWFuZCBzdWNoIGFzICJnaXQKK2RpZmYiIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBtYW4gZ2l0LWRpZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBhIGdvb2QgaWRlYSB0byBpbnRyb2R1Y2UgeW91cnNlbGYgdG8gZ2l0IHdpdGggeW91ciBuYW1lIGFuZAorcHVibGljIGVtYWlsIGFkZHJlc3MgYmVmb3JlIGRvaW5nIGFueSBvcGVyYXRpb24uICBUaGUgZWFzaWVzdAord2F5IHRvIGRvIHNvIGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIllvdXIgTmFtZSBDb21lcyBIZXJlIgorJCBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgeW91QHlvdXJkb21haW4uZXhhbXBsZS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0ltcG9ydGluZyBhIG5ldyBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBc3N1bWUgeW91IGhhdmUgYSB0YXJiYWxsIHByb2plY3QudGFyLmd6IHdpdGggeW91ciBpbml0aWFsIHdvcmsuICBZb3UKK2NhbiBwbGFjZSBpdCB1bmRlciBnaXQgcmV2aXNpb24gY29udHJvbCBhcyBmb2xsb3dzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgdGFyIHh6ZiBwcm9qZWN0LnRhci5negorJCBjZCBwcm9qZWN0CiskIGdpdCBpbml0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IHdpbGwgcmVwbHkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbml0aWFsaXplZCBlbXB0eSBHaXQgcmVwb3NpdG9yeSBpbiAuZ2l0LworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSd2ZSBub3cgaW5pdGlhbGl6ZWQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LS15b3UgbWF5IG5vdGljZSBhIG5ldworZGlyZWN0b3J5IGNyZWF0ZWQsIG5hbWVkICIuZ2l0Ii4KKworTmV4dCwgdGVsbCBnaXQgdG8gdGFrZSBhIHNuYXBzaG90IG9mIHRoZSBjb250ZW50cyBvZiBhbGwgZmlsZXMgdW5kZXIgdGhlCitjdXJyZW50IGRpcmVjdG9yeSAobm90ZSB0aGUgJy4nKSwgd2l0aCBnaXRsaW5rOmdpdC1hZGRbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNuYXBzaG90IGlzIG5vdyBzdG9yZWQgaW4gYSB0ZW1wb3Jhcnkgc3RhZ2luZyBhcmVhIHdoaWNoIGdpdCBjYWxscwordGhlICJpbmRleCIuICBZb3UgY2FuIHBlcm1hbmVudGx5IHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggaW4gdGhlCityZXBvc2l0b3J5IHdpdGggZ2l0bGluazpnaXQtY29tbWl0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgd2lsbCBwcm9tcHQgeW91IGZvciBhIGNvbW1pdCBtZXNzYWdlLiAgWW91J3ZlIG5vdyBzdG9yZWQgdGhlIGZpcnN0Cit2ZXJzaW9uIG9mIHlvdXIgcHJvamVjdCBpbiBnaXQuCisKK01ha2luZyBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLQorCitNb2RpZnkgc29tZSBmaWxlcywgdGhlbiBhZGQgdGhlaXIgdXBkYXRlZCBjb250ZW50cyB0byB0aGUgaW5kZXg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIGZpbGUxIGZpbGUyIGZpbGUzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGFyZSBub3cgcmVhZHkgdG8gY29tbWl0LiAgWW91IGNhbiBzZWUgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQKK3VzaW5nIGdpdGxpbms6Z2l0LWRpZmZbMV0gd2l0aCB0aGUgLS1jYWNoZWQgb3B0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1jYWNoZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoV2l0aG91dCAtLWNhY2hlZCwgZ2l0bGluazpnaXQtZGlmZlsxXSB3aWxsIHNob3cgeW91IGFueSBjaGFuZ2VzIHRoYXQKK3lvdSd2ZSBtYWRlIGJ1dCBub3QgeWV0IGFkZGVkIHRvIHRoZSBpbmRleC4pICBZb3UgY2FuIGFsc28gZ2V0IGEgYnJpZWYKK3N1bW1hcnkgb2YgdGhlIHNpdHVhdGlvbiB3aXRoIGdpdGxpbms6Z2l0LXN0YXR1c1sxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzdGF0dXMKKyMgT24gYnJhbmNoIG1hc3RlcgorIyBDaGFuZ2VzIHRvIGJlIGNvbW1pdHRlZDoKKyMgICAodXNlICJnaXQgcmVzZXQgSEVBRCA8ZmlsZT4uLi4iIHRvIHVuc3RhZ2UpCisjCisjCW1vZGlmaWVkOiAgIGZpbGUxCisjCW1vZGlmaWVkOiAgIGZpbGUyCisjCW1vZGlmaWVkOiAgIGZpbGUzCisjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IG5lZWQgdG8gbWFrZSBhbnkgZnVydGhlciBhZGp1c3RtZW50cywgZG8gc28gbm93LCBhbmQgdGhlbiBhZGQgYW55CituZXdseSBtb2RpZmllZCBjb250ZW50IHRvIHRoZSBpbmRleC4gIEZpbmFsbHksIGNvbW1pdCB5b3VyIGNoYW5nZXMgd2l0aDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdpbGwgYWdhaW4gcHJvbXB0IHlvdXIgZm9yIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UsIGFuZCB0aGVuCityZWNvcmQgYSBuZXcgdmVyc2lvbiBvZiB0aGUgcHJvamVjdC4KKworQWx0ZXJuYXRpdmVseSwgaW5zdGVhZCBvZiBydW5uaW5nIGBnaXQgYWRkYCBiZWZvcmVoYW5kLCB5b3UgY2FuIHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgYXV0b21hdGljYWxseSBub3RpY2UgYW55IG1vZGlmaWVkIChidXQgbm90IG5ldykgZmlsZXMsIGFkZAordGhlbSB0byB0aGUgaW5kZXgsIGFuZCBjb21taXQsIGFsbCBpbiBvbmUgc3RlcC4KKworQSBub3RlIG9uIGNvbW1pdCBtZXNzYWdlczogVGhvdWdoIG5vdCByZXF1aXJlZCwgaXQncyBhIGdvb2QgaWRlYSB0bworYmVnaW4gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBzaW5nbGUgc2hvcnQgKGxlc3MgdGhhbiA1MCBjaGFyYWN0ZXIpCitsaW5lIHN1bW1hcml6aW5nIHRoZSBjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlbiBhIG1vcmUKK3Rob3JvdWdoIGRlc2NyaXB0aW9uLiAgVG9vbHMgdGhhdCB0dXJuIGNvbW1pdHMgaW50byBlbWFpbCwgZm9yCitleGFtcGxlLCB1c2UgdGhlIGZpcnN0IGxpbmUgb24gdGhlIFN1YmplY3Q6IGxpbmUgYW5kIHRoZSByZXN0IG9mIHRoZQorY29tbWl0IGluIHRoZSBib2R5LgorCitHaXQgdHJhY2tzIGNvbnRlbnQgbm90IGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbnkgcmV2aXNpb24gY29udHJvbCBzeXN0ZW1zIHByb3ZpZGUgYW4gImFkZCIgY29tbWFuZCB0aGF0IHRlbGxzIHRoZQorc3lzdGVtIHRvIHN0YXJ0IHRyYWNraW5nIGNoYW5nZXMgdG8gYSBuZXcgZmlsZS4gIEdpdCdzICJhZGQiIGNvbW1hbmQKK2RvZXMgc29tZXRoaW5nIHNpbXBsZXIgYW5kIG1vcmUgcG93ZXJmdWw6IGBnaXQgYWRkYCBpcyB1c2VkIGJvdGggZm9yIG5ldworYW5kIG5ld2x5IG1vZGlmaWVkIGZpbGVzLCBhbmQgaW4gYm90aCBjYXNlcyBpdCB0YWtlcyBhIHNuYXBzaG90IG9mIHRoZQorZ2l2ZW4gZmlsZXMgYW5kIHN0YWdlcyB0aGF0IGNvbnRlbnQgaW4gdGhlIGluZGV4LCByZWFkeSBmb3IgaW5jbHVzaW9uIGluCit0aGUgbmV4dCBjb21taXQuCisKK1ZpZXdpbmcgcHJvamVjdCBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBhbnkgcG9pbnQgeW91IGNhbiB2aWV3IHRoZSBoaXN0b3J5IG9mIHlvdXIgY2hhbmdlcyB1c2luZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhbHNvIHdhbnQgdG8gc2VlIGNvbXBsZXRlIGRpZmZzIGF0IGVhY2ggc3RlcCwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2Z0ZW4gdGhlIG92ZXJ2aWV3IG9mIHRoZSBjaGFuZ2UgaXMgdXNlZnVsIHRvIGdldCBhIGZlZWwgb2YKK2VhY2ggc3RlcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLXN0YXQgLS1zdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFuYWdpbmcgYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0Egc2luZ2xlIGdpdCByZXBvc2l0b3J5IGNhbiBtYWludGFpbiBtdWx0aXBsZSBicmFuY2hlcyBvZgorZGV2ZWxvcG1lbnQuICBUbyBjcmVhdGUgYSBuZXcgYnJhbmNoIG5hbWVkICJleHBlcmltZW50YWwiLCB1c2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggZXhwZXJpbWVudGFsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IG5vdyBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit5b3UnbGwgZ2V0IGEgbGlzdCBvZiBhbGwgZXhpc3RpbmcgYnJhbmNoZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBleHBlcmltZW50YWwKKyogbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJleHBlcmltZW50YWwiIGJyYW5jaCBpcyB0aGUgb25lIHlvdSBqdXN0IGNyZWF0ZWQsIGFuZCB0aGUKKyJtYXN0ZXIiIGJyYW5jaCBpcyBhIGRlZmF1bHQgYnJhbmNoIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHlvdQorYXV0b21hdGljYWxseS4gIFRoZSBhc3RlcmlzayBtYXJrcyB0aGUgYnJhbmNoIHlvdSBhcmUgY3VycmVudGx5IG9uOwordHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHN3aXRjaCB0byB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaC4gIE5vdyBlZGl0IGEgZmlsZSwgY29tbWl0IHRoZQorY2hhbmdlLCBhbmQgc3dpdGNoIGJhY2sgdG8gdGhlIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGVkaXQgZmlsZSkKKyQgZ2l0IGNvbW1pdCAtYQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hlY2sgdGhhdCB0aGUgY2hhbmdlIHlvdSBtYWRlIGlzIG5vIGxvbmdlciB2aXNpYmxlLCBzaW5jZSBpdCB3YXMKK21hZGUgb24gdGhlIGV4cGVyaW1lbnRhbCBicmFuY2ggYW5kIHlvdSdyZSBiYWNrIG9uIHRoZSBtYXN0ZXIgYnJhbmNoLgorCitZb3UgY2FuIG1ha2UgYSBkaWZmZXJlbnQgY2hhbmdlIG9uIHRoZSBtYXN0ZXIgYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGUpCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithdCB0aGlzIHBvaW50IHRoZSB0d28gYnJhbmNoZXMgaGF2ZSBkaXZlcmdlZCwgd2l0aCBkaWZmZXJlbnQgY2hhbmdlcworbWFkZSBpbiBlYWNoLiAgVG8gbWVyZ2UgdGhlIGNoYW5nZXMgbWFkZSBpbiBleHBlcmltZW50YWwgaW50byBtYXN0ZXIsIHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBjaGFuZ2VzIGRvbid0IGNvbmZsaWN0LCB5b3UncmUgZG9uZS4gIElmIHRoZXJlIGFyZSBjb25mbGljdHMsCittYXJrZXJzIHdpbGwgYmUgbGVmdCBpbiB0aGUgcHJvYmxlbWF0aWMgZmlsZXMgc2hvd2luZyB0aGUgY29uZmxpY3Q7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGlzLiAgT25jZSB5b3UndmUgZWRpdGVkIHRoZSBmaWxlcyB0byByZXNvbHZlIHRoZQorY29uZmxpY3RzLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgY29tbWl0IHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLiBGaW5hbGx5LAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0aworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyBhIG5pY2UgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgaGlzdG9yeS4KKworQXQgdGhpcyBwb2ludCB5b3UgY291bGQgZGVsZXRlIHRoZSBleHBlcmltZW50YWwgYnJhbmNoIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLWQgZXhwZXJpbWVudGFsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBjb21tYW5kIGVuc3VyZXMgdGhhdCB0aGUgY2hhbmdlcyBpbiB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaCBhcmUKK2FscmVhZHkgaW4gdGhlIGN1cnJlbnQgYnJhbmNoLgorCitJZiB5b3UgZGV2ZWxvcCBvbiBhIGJyYW5jaCBjcmF6eS1pZGVhLCB0aGVuIHJlZ3JldCBpdCwgeW91IGNhbiBhbHdheXMKK2RlbGV0ZSB0aGUgYnJhbmNoIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIC1EIGNyYXp5LWlkZWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnJhbmNoZXMgYXJlIGNoZWFwIGFuZCBlYXN5LCBzbyB0aGlzIGlzIGEgZ29vZCB3YXkgdG8gdHJ5IHNvbWV0aGluZworb3V0LgorCitVc2luZyBnaXQgZm9yIGNvbGxhYm9yYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHRoYXQgQWxpY2UgaGFzIHN0YXJ0ZWQgYSBuZXcgcHJvamVjdCB3aXRoIGEgZ2l0IHJlcG9zaXRvcnkgaW4KKy9ob21lL2FsaWNlL3Byb2plY3QsIGFuZCB0aGF0IEJvYiwgd2hvIGhhcyBhIGhvbWUgZGlyZWN0b3J5IG9uIHRoZQorc2FtZSBtYWNoaW5lLCB3YW50cyB0byBjb250cmlidXRlLgorCitCb2IgYmVnaW5zIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgL2hvbWUvYWxpY2UvcHJvamVjdCBteXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5ICJteXJlcG8iIGNvbnRhaW5pbmcgYSBjbG9uZSBvZiBBbGljZSdzCityZXBvc2l0b3J5LiAgVGhlIGNsb25lIGlzIG9uIGFuIGVxdWFsIGZvb3Rpbmcgd2l0aCB0aGUgb3JpZ2luYWwKK3Byb2plY3QsIHBvc3Nlc3NpbmcgaXRzIG93biBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwcm9qZWN0J3MgaGlzdG9yeS4KKworQm9iIHRoZW4gbWFrZXMgc29tZSBjaGFuZ2VzIGFuZCBjb21taXRzIHRoZW06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGVkaXQgZmlsZXMpCiskIGdpdCBjb21taXQgLWEKKyhyZXBlYXQgYXMgbmVjZXNzYXJ5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gaGUncyByZWFkeSwgaGUgdGVsbHMgQWxpY2UgdG8gcHVsbCBjaGFuZ2VzIGZyb20gdGhlIHJlcG9zaXRvcnkKK2F0IC9ob21lL2JvYi9teXJlcG8uICBTaGUgZG9lcyB0aGlzIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjZCAvaG9tZS9hbGljZS9wcm9qZWN0CiskIGdpdCBwdWxsIC9ob21lL2JvYi9teXJlcG8gbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBtZXJnZXMgdGhlIGNoYW5nZXMgZnJvbSBCb2IncyAibWFzdGVyIiBicmFuY2ggaW50byBBbGljZSdzCitjdXJyZW50IGJyYW5jaC4gIElmIEFsaWNlIGhhcyBtYWRlIGhlciBvd24gY2hhbmdlcyBpbiB0aGUgbWVhbnRpbWUsCit0aGVuIHNoZSBtYXkgbmVlZCB0byBtYW51YWxseSBmaXggYW55IGNvbmZsaWN0cy4gIChOb3RlIHRoYXQgdGhlCisibWFzdGVyIiBhcmd1bWVudCBpbiB0aGUgYWJvdmUgY29tbWFuZCBpcyBhY3R1YWxseSB1bm5lY2Vzc2FyeSwgYXMgaXQKK2lzIHRoZSBkZWZhdWx0LikKKworVGhlICJwdWxsIiBjb21tYW5kIHRodXMgcGVyZm9ybXMgdHdvIG9wZXJhdGlvbnM6IGl0IGZldGNoZXMgY2hhbmdlcworZnJvbSBhIHJlbW90ZSBicmFuY2gsIHRoZW4gbWVyZ2VzIHRoZW0gaW50byB0aGUgY3VycmVudCBicmFuY2guCisKK1doZW4geW91IGFyZSB3b3JraW5nIGluIGEgc21hbGwgY2xvc2VseSBrbml0IGdyb3VwLCBpdCBpcyBub3QKK3VudXN1YWwgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc2FtZSByZXBvc2l0b3J5IG92ZXIgYW5kIG92ZXIKK2FnYWluLiAgQnkgZGVmaW5pbmcgJ3JlbW90ZScgcmVwb3NpdG9yeSBzaG9ydGhhbmQsIHlvdSBjYW4gbWFrZQoraXQgZWFzaWVyOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgYm9iIC9ob21lL2JvYi9teXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaXRoIHRoaXMsIEFsaWNlIGNhbiBwZXJmb3JtIHRoZSBmaXJzdCBvcGVyYXRpb24gYWxvbmUgdXNpbmcgdGhlCisiZ2l0IGZldGNoIiBjb21tYW5kIHdpdGhvdXQgbWVyZ2luZyB0aGVtIHdpdGggaGVyIG93biBicmFuY2gsCit1c2luZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggYm9iCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VubGlrZSB0aGUgbG9uZ2hhbmQgZm9ybSwgd2hlbiBBbGljZSBmZXRjaGVzIGZyb20gQm9iIHVzaW5nIGEKK3JlbW90ZSByZXBvc2l0b3J5IHNob3J0aGFuZCBzZXQgdXAgd2l0aCBgZ2l0IHJlbW90ZWAsIHdoYXQgd2FzCitmZXRjaGVkIGlzIHN0b3JlZCBpbiBhIHJlbW90ZSB0cmFja2luZyBicmFuY2gsIGluIHRoaXMgY2FzZQorYGJvYi9tYXN0ZXJgLiAgU28gYWZ0ZXIgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wIG1hc3Rlci4uYm9iL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgQm9iIG1hZGUgc2luY2UgaGUgYnJhbmNoZWQgZnJvbQorQWxpY2UncyBtYXN0ZXIgYnJhbmNoLgorCitBZnRlciBleGFtaW5pbmcgdGhvc2UgY2hhbmdlcywgQWxpY2UKK2NvdWxkIG1lcmdlIHRoZSBjaGFuZ2VzIGludG8gaGVyIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGJvYi9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBgbWVyZ2VgIGNhbiBhbHNvIGJlIGRvbmUgYnkgJ3B1bGxpbmcgZnJvbSBoZXIgb3duIHJlbW90ZQordHJhY2tpbmcgYnJhbmNoJywgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIC4gcmVtb3Rlcy9ib2IvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBnaXQgcHVsbCBhbHdheXMgbWVyZ2VzIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLAorcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmRsaW5lLgorCitMYXRlciwgQm9iIGNhbiB1cGRhdGUgaGlzIHJlcG8gd2l0aCBBbGljZSdzIGxhdGVzdCBjaGFuZ2VzIHVzaW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IGhlIGRvZXNuJ3QgbmVlZCB0byBnaXZlIHRoZSBwYXRoIHRvIEFsaWNlJ3MgcmVwb3NpdG9yeTsKK3doZW4gQm9iIGNsb25lZCBBbGljZSdzIHJlcG9zaXRvcnksIGdpdCBzdG9yZWQgdGhlIGxvY2F0aW9uIG9mIGhlcgorcmVwb3NpdG9yeSBpbiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLCBhbmQgdGhhdCBsb2NhdGlvbiBpcwordXNlZCBmb3IgcHVsbHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtLWdldCByZW1vdGUub3JpZ2luLnVybAorL2hvbWUvYm9iL215cmVwbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoVGhlIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gY3JlYXRlZCBieSBnaXQtY2xvbmUgaXMgdmlzaWJsZSB1c2luZworImdpdCBjb25maWcgLWwiLCBhbmQgdGhlIGdpdGxpbms6Z2l0LWNvbmZpZ1sxXSBtYW4gcGFnZQorZXhwbGFpbnMgdGhlIG1lYW5pbmcgb2YgZWFjaCBvcHRpb24uKQorCitHaXQgYWxzbyBrZWVwcyBhIHByaXN0aW5lIGNvcHkgb2YgQWxpY2UncyBtYXN0ZXIgYnJhbmNoIHVuZGVyIHRoZQorbmFtZSAib3JpZ2luL21hc3RlciI6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCAtcgorICBvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIEJvYiBsYXRlciBkZWNpZGVzIHRvIHdvcmsgZnJvbSBhIGRpZmZlcmVudCBob3N0LCBoZSBjYW4gc3RpbGwKK3BlcmZvcm0gY2xvbmVzIGFuZCBwdWxscyB1c2luZyB0aGUgc3NoIHByb3RvY29sOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBhbGljZS5vcmc6L2hvbWUvYWxpY2UvcHJvamVjdCBteXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWx0ZXJuYXRpdmVseSwgZ2l0IGhhcyBhIG5hdGl2ZSBwcm90b2NvbCwgb3IgY2FuIHVzZSByc3luYyBvciBodHRwOworc2VlIGdpdGxpbms6Z2l0LXB1bGxbMV0gZm9yIGRldGFpbHMuCisKK0dpdCBjYW4gYWxzbyBiZSB1c2VkIGluIGEgQ1ZTLWxpa2UgbW9kZSwgd2l0aCBhIGNlbnRyYWwgcmVwb3NpdG9yeQordGhhdCB2YXJpb3VzIHVzZXJzIHB1c2ggY2hhbmdlcyB0bzsgc2VlIGdpdGxpbms6Z2l0LXB1c2hbMV0gYW5kCitsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtnaXQgZm9yIENWUyB1c2Vyc10uCisKK0V4cGxvcmluZyBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgaGlzdG9yeSBpcyByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBvZiBpbnRlcnJlbGF0ZWQgY29tbWl0cy4gIFdlCitoYXZlIGFscmVhZHkgc2VlbiB0aGF0IHRoZSBnaXQgbG9nIGNvbW1hbmQgY2FuIGxpc3QgdGhvc2UgY29tbWl0cy4KK05vdGUgdGhhdCBmaXJzdCBsaW5lIG9mIGVhY2ggZ2l0IGxvZyBlbnRyeSBhbHNvIGdpdmVzIGEgbmFtZSBmb3IgdGhlCitjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworY29tbWl0IGM4MmEyMmMzOWNiYzMyNTc2ZjY0ZjVjNmIzZjI0Yjk5ZWE4MTQ5YzcKK0F1dGhvcjogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorRGF0ZTogICBUdWUgTWF5IDE2IDE3OjE4OjIyIDIwMDYgLTA3MDAKKworICAgIG1lcmdlLWJhc2U6IENsYXJpZnkgdGhlIGNvbW1lbnRzIG9uIHBvc3QgcHJvY2Vzc2luZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UgY2FuIGdpdmUgdGhpcyBuYW1lIHRvIGdpdCBzaG93IHRvIHNlZSB0aGUgZGV0YWlscyBhYm91dCB0aGlzCitjb21taXQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgYzgyYTIyYzM5Y2JjMzI1NzZmNjRmNWM2YjNmMjRiOTllYTgxNDljNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCdXQgdGhlcmUgYXJlIG90aGVyIHdheXMgdG8gcmVmZXIgdG8gY29tbWl0cy4gIFlvdSBjYW4gdXNlIGFueSBpbml0aWFsCitwYXJ0IG9mIHRoZSBuYW1lIHRoYXQgaXMgbG9uZyBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyBjODJhMjJjMzljCSMgdGhlIGZpcnN0IGZldyBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIGFyZQorCQkJIyB1c3VhbGx5IGVub3VnaAorJCBnaXQgc2hvdyBIRUFECQkjIHRoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoCiskIGdpdCBzaG93IGV4cGVyaW1lbnRhbAkjIHRoZSB0aXAgb2YgdGhlICJleHBlcmltZW50YWwiIGJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVyeSBjb21taXQgdXN1YWxseSBoYXMgb25lICJwYXJlbnQiIGNvbW1pdAord2hpY2ggcG9pbnRzIHRvIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyBIRUFEXiAgIyB0byBzZWUgdGhlIHBhcmVudCBvZiBIRUFECiskIGdpdCBzaG93IEhFQUReXiAjIHRvIHNlZSB0aGUgZ3JhbmRwYXJlbnQgb2YgSEVBRAorJCBnaXQgc2hvdyBIRUFEfjQgIyB0byBzZWUgdGhlIGdyZWF0LWdyZWF0IGdyYW5kcGFyZW50IG9mIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IG1lcmdlIGNvbW1pdHMgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBwYXJlbnQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBRF4xICMgc2hvdyB0aGUgZmlyc3QgcGFyZW50IG9mIEhFQUQgKHNhbWUgYXMgSEVBRF4pCiskIGdpdCBzaG93IEhFQUReMiAjIHNob3cgdGhlIHNlY29uZCBwYXJlbnQgb2YgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gZ2l2ZSBjb21taXRzIG5hbWVzIG9mIHlvdXIgb3duOyBhZnRlciBydW5uaW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXRhZyB2Mi41IDFiMmUxZDYzZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeW91IGNhbiByZWZlciB0byAxYjJlMWQ2M2ZmIGJ5IHRoZSBuYW1lICJ2Mi41Ii4gIElmIHlvdSBpbnRlbmQgdG8KK3NoYXJlIHRoaXMgbmFtZSB3aXRoIG90aGVyIHBlb3BsZSAoZm9yIGV4YW1wbGUsIHRvIGlkZW50aWZ5IGEgcmVsZWFzZQordmVyc2lvbiksIHlvdSBzaG91bGQgY3JlYXRlIGEgInRhZyIgb2JqZWN0LCBhbmQgcGVyaGFwcyBzaWduIGl0OyBzZWUKK2dpdGxpbms6Z2l0LXRhZ1sxXSBmb3IgZGV0YWlscy4KKworQW55IGdpdCBjb21tYW5kIHRoYXQgbmVlZHMgdG8ga25vdyBhIGNvbW1pdCBjYW4gdGFrZSBhbnkgb2YgdGhlc2UKK25hbWVzLiAgRm9yIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgdjIuNSBIRUFECSAjIGNvbXBhcmUgdGhlIGN1cnJlbnQgSEVBRCB0byB2Mi41CiskIGdpdCBicmFuY2ggc3RhYmxlIHYyLjUgIyBzdGFydCBhIG5ldyBicmFuY2ggbmFtZWQgInN0YWJsZSIgYmFzZWQKKwkJCSAjIGF0IHYyLjUKKyQgZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiAjIHJlc2V0IHlvdXIgY3VycmVudCBicmFuY2ggYW5kIHdvcmtpbmcKKwkJCSAjIGRpcmVjdG9yeSB0byBpdHMgc3RhdGUgYXQgSEVBRF4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmUgY2FyZWZ1bCB3aXRoIHRoYXQgbGFzdCBjb21tYW5kOiBpbiBhZGRpdGlvbiB0byBsb3NpbmcgYW55IGNoYW5nZXMKK2luIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgaXQgd2lsbCBhbHNvIHJlbW92ZSBhbGwgbGF0ZXIgY29tbWl0cyBmcm9tCit0aGlzIGJyYW5jaC4gIElmIHRoaXMgYnJhbmNoIGlzIHRoZSBvbmx5IGJyYW5jaCBjb250YWluaW5nIHRob3NlCitjb21taXRzLCB0aGV5IHdpbGwgYmUgbG9zdC4gIEFsc28sIGRvbid0IHVzZSAiZ2l0IHJlc2V0IiBvbiBhCitwdWJsaWNseS12aXNpYmxlIGJyYW5jaCB0aGF0IG90aGVyIGRldmVsb3BlcnMgcHVsbCBmcm9tLCBhcyBpdCB3aWxsCitmb3JjZSBuZWVkbGVzcyBtZXJnZXMgb24gb3RoZXIgZGV2ZWxvcGVycyB0byBjbGVhbiB1cCB0aGUgaGlzdG9yeS4KK0lmIHlvdSBuZWVkIHRvIHVuZG8gY2hhbmdlcyB0aGF0IHlvdSBoYXZlIHB1c2hlZCwgdXNlIGdpdGxpbms6Z2l0LXJldmVydFsxXQoraW5zdGVhZC4KKworVGhlIGdpdCBncmVwIGNvbW1hbmQgY2FuIHNlYXJjaCBmb3Igc3RyaW5ncyBpbiBhbnkgdmVyc2lvbiBvZiB5b3VyCitwcm9qZWN0LCBzbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBncmVwICJoZWxsbyIgdjIuNQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzZWFyY2hlcyBmb3IgYWxsIG9jY3VycmVuY2VzIG9mICJoZWxsbyIgaW4gdjIuNS4KKworSWYgeW91IGxlYXZlIG91dCB0aGUgY29tbWl0IG5hbWUsIGdpdCBncmVwIHdpbGwgc2VhcmNoIGFueSBvZiB0aGUKK2ZpbGVzIGl0IG1hbmFnZXMgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeS4gIFNvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGdyZXAgImhlbGxvIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpcyBhIHF1aWNrIHdheSB0byBzZWFyY2gganVzdCB0aGUgZmlsZXMgdGhhdCBhcmUgdHJhY2tlZCBieSBnaXQuCisKK01hbnkgZ2l0IGNvbW1hbmRzIGFsc28gdGFrZSBzZXRzIG9mIGNvbW1pdHMsIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQKK2luIGEgbnVtYmVyIG9mIHdheXMuICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIHdpdGggZ2l0IGxvZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIHYyLjUuLnYyLjYgICAgICAgICAgICAjIGNvbW1pdHMgYmV0d2VlbiB2Mi41IGFuZCB2Mi42CiskIGdpdCBsb2cgdjIuNS4uICAgICAgICAgICAgICAgICMgY29tbWl0cyBzaW5jZSB2Mi41CiskIGdpdCBsb2cgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iICMgY29tbWl0cyBmcm9tIHRoZSBsYXN0IDIgd2Vla3MKKyQgZ2l0IGxvZyB2Mi41Li4gTWFrZWZpbGUgICAgICAgIyBjb21taXRzIHNpbmNlIHYyLjUgd2hpY2ggbW9kaWZ5CisJCQkJIyBNYWtlZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gZ2l2ZSBnaXQgbG9nIGEgInJhbmdlIiBvZiBjb21taXRzIHdoZXJlIHRoZSBmaXJzdCBpcyBub3QKK25lY2Vzc2FyaWx5IGFuIGFuY2VzdG9yIG9mIHRoZSBzZWNvbmQ7IGZvciBleGFtcGxlLCBpZiB0aGUgdGlwcyBvZgordGhlIGJyYW5jaGVzICJzdGFibGUtcmVsZWFzZSIgYW5kICJtYXN0ZXIiIGRpdmVyZ2VkIGZyb20gYSBjb21tb24KK2NvbW1pdCBzb21lIHRpbWUgYWdvLCB0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyBzdGFibGUuLmV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIGxpc3QgY29tbWl0cyBtYWRlIGluIHRoZSBleHBlcmltZW50YWwgYnJhbmNoIGJ1dCBub3QgaW4gdGhlCitzdGFibGUgYnJhbmNoLCB3aGlsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgZXhwZXJpbWVudGFsLi5zdGFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBzaG93IHRoZSBsaXN0IG9mIGNvbW1pdHMgbWFkZSBvbiB0aGUgc3RhYmxlIGJyYW5jaCBidXQgbm90Cit0aGUgZXhwZXJpbWVudGFsIGJyYW5jaC4KKworVGhlICJnaXQgbG9nIiBjb21tYW5kIGhhcyBhIHdlYWtuZXNzOiBpdCBtdXN0IHByZXNlbnQgY29tbWl0cyBpbiBhCitsaXN0LiAgV2hlbiB0aGUgaGlzdG9yeSBoYXMgbGluZXMgb2YgZGV2ZWxvcG1lbnQgdGhhdCBkaXZlcmdlZCBhbmQKK3RoZW4gbWVyZ2VkIGJhY2sgdG9nZXRoZXIsIHRoZSBvcmRlciBpbiB3aGljaCAiZ2l0IGxvZyIgcHJlc2VudHMKK3Rob3NlIGNvbW1pdHMgaXMgbWVhbmluZ2xlc3MuCisKK01vc3QgcHJvamVjdHMgd2l0aCBtdWx0aXBsZSBjb250cmlidXRvcnMgKHN1Y2ggYXMgdGhlIGxpbnV4IGtlcm5lbCwKK29yIGdpdCBpdHNlbGYpIGhhdmUgZnJlcXVlbnQgbWVyZ2VzLCBhbmQgZ2l0ayBkb2VzIGEgYmV0dGVyIGpvYiBvZgordmlzdWFsaXppbmcgdGhlaXIgaGlzdG9yeS4gIEZvciBleGFtcGxlLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdGsgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIGRyaXZlcnMvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbG93cyB5b3UgdG8gYnJvd3NlIGFueSBjb21taXRzIGZyb20gdGhlIGxhc3QgMiB3ZWVrcyBvZiBjb21taXRzCit0aGF0IG1vZGlmaWVkIGZpbGVzIHVuZGVyIHRoZSAiZHJpdmVycyIgZGlyZWN0b3J5LiAgKE5vdGU6IHlvdSBjYW4KK2FkanVzdCBnaXRrJ3MgZm9udHMgYnkgaG9sZGluZyBkb3duIHRoZSBjb250cm9sIGtleSB3aGlsZSBwcmVzc2luZworIi0iIG9yICIrIi4pCisKK0ZpbmFsbHksIG1vc3QgY29tbWFuZHMgdGhhdCB0YWtlIGZpbGVuYW1lcyB3aWxsIG9wdGlvbmFsbHkgYWxsb3cgeW91Cit0byBwcmVjZWRlIGFueSBmaWxlbmFtZSBieSBhIGNvbW1pdCwgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgdmVyc2lvbgorb2YgdGhlIGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgdjIuNTpNYWtlZmlsZSBIRUFEOk1ha2VmaWxlLmluCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gYWxzbyB1c2UgImdpdCBzaG93IiB0byBzZWUgYW55IHN1Y2ggZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyB2Mi41Ok1ha2VmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05leHQgU3RlcHMKKy0tLS0tLS0tLS0KKworVGhpcyB0dXRvcmlhbCBzaG91bGQgYmUgZW5vdWdoIHRvIHBlcmZvcm0gYmFzaWMgZGlzdHJpYnV0ZWQgcmV2aXNpb24KK2NvbnRyb2wgZm9yIHlvdXIgcHJvamVjdHMuICBIb3dldmVyLCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBkZXB0aAorYW5kIHBvd2VyIG9mIGdpdCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIHR3byBzaW1wbGUgaWRlYXMgb24gd2hpY2ggaXQKK2lzIGJhc2VkOgorCisgICogVGhlIG9iamVjdCBkYXRhYmFzZSBpcyB0aGUgcmF0aGVyIGVsZWdhbnQgc3lzdGVtIHVzZWQgdG8KKyAgICBzdG9yZSB0aGUgaGlzdG9yeSBvZiB5b3VyIHByb2plY3QtLWZpbGVzLCBkaXJlY3RvcmllcywgYW5kCisgICAgY29tbWl0cy4KKworICAqIFRoZSBpbmRleCBmaWxlIGlzIGEgY2FjaGUgb2YgdGhlIHN0YXRlIG9mIGEgZGlyZWN0b3J5IHRyZWUsCisgICAgdXNlZCB0byBjcmVhdGUgY29tbWl0cywgY2hlY2sgb3V0IHdvcmtpbmcgZGlyZWN0b3JpZXMsIGFuZAorICAgIGhvbGQgdGhlIHZhcmlvdXMgdHJlZXMgaW52b2x2ZWQgaW4gYSBtZXJnZS4KKworbGluazp0dXRvcmlhbC0yLmh0bWxbUGFydCB0d28gb2YgdGhpcyB0dXRvcmlhbF0gZXhwbGFpbnMgdGhlIG9iamVjdAorZGF0YWJhc2UsIHRoZSBpbmRleCBmaWxlLCBhbmQgYSBmZXcgb3RoZXIgb2RkcyBhbmQgZW5kcyB0aGF0IHlvdSdsbAorbmVlZCB0byBtYWtlIHRoZSBtb3N0IG9mIGdpdC4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gY29udGludWUgd2l0aCB0aGF0IHJpZ2h0IGF3YXksIGEgZmV3IG90aGVyCitkaWdyZXNzaW9ucyB0aGF0IG1heSBiZSBpbnRlcmVzdGluZyBhdCB0aGlzIHBvaW50IGFyZToKKworICAqIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXSwgZ2l0bGluazpnaXQtYW1bMV06IFRoZXNlIGNvbnZlcnQKKyAgICBzZXJpZXMgb2YgZ2l0IGNvbW1pdHMgaW50byBlbWFpbGVkIHBhdGNoZXMsIGFuZCB2aWNlIHZlcnNhLAorICAgIHVzZWZ1bCBmb3IgcHJvamVjdHMgc3VjaCBhcyB0aGUgbGludXgga2VybmVsIHdoaWNoIHJlbHkgaGVhdmlseQorICAgIG9uIGVtYWlsZWQgcGF0Y2hlcy4KKworICAqIGdpdGxpbms6Z2l0LWJpc2VjdFsxXTogV2hlbiB0aGVyZSBpcyBhIHJlZ3Jlc3Npb24gaW4geW91cgorICAgIHByb2plY3QsIG9uZSB3YXkgdG8gdHJhY2sgZG93biB0aGUgYnVnIGlzIGJ5IHNlYXJjaGluZyB0aHJvdWdoCisgICAgdGhlIGhpc3RvcnkgdG8gZmluZCB0aGUgZXhhY3QgY29tbWl0IHRoYXQncyB0byBibGFtZS4gIEdpdCBiaXNlY3QKKyAgICBjYW4gaGVscCB5b3UgcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoYXQgY29tbWl0LiAgSXQgaXMKKyAgICBzbWFydCBlbm91Z2ggdG8gcGVyZm9ybSBhIGNsb3NlLXRvLW9wdGltYWwgc2VhcmNoIGV2ZW4gaW4gdGhlCisgICAgY2FzZSBvZiBjb21wbGV4IG5vbi1saW5lYXIgaGlzdG9yeSB3aXRoIGxvdHMgb2YgbWVyZ2VkIGJyYW5jaGVzLgorCisgICogbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdJVCB3aXRoIDIwIENvbW1hbmRzIE9yIFNvXQorCisgICogbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91cmxzLnR4dCBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1Zjk2NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKQEAgLTAsMCArMSw4OCBAQAorR0lUIFVSTFNbW1VSTFNdXQorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQKK3RvIG5hbWUgdGhlIHJlbW90ZSByZXBvc2l0b3J5OgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gcnN5bmM6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHA6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHBzOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBnaXQ6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGdpdDovL2hvc3QueHovfnVzZXIvcGF0aC90by9yZXBvLmdpdC8KKy0gc3NoOi8ve3N0YXJ0c2J9dXNlckB7ZW5kc2J9aG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBzc2g6Ly97c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6L351c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHNzaDovL3tzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHovfi9wYXRoL3RvL3JlcG8uZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU1NIIGlzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwcm90b2NvbC4gIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5Cit3aGljaCB1c2VyIHRvIGxvZy1pbiBhcywgYW5kIGFuIGFsdGVybmF0ZSwgc2NwLWxpa2Ugc3ludGF4IGlzIGFsc28KK3N1cHBvcnRlZC4gIEJvdGggc3ludGF4ZXMgc3VwcG9ydCB1c2VybmFtZSBleHBhbnNpb24sCithcyBkb2VzIHRoZSBuYXRpdmUgZ2l0IHByb3RvY29sLiBUaGUgZm9sbG93aW5nIHRocmVlIGFyZQoraWRlbnRpY2FsIHRvIHRoZSBsYXN0IHRocmVlIGFib3ZlLCByZXNwZWN0aXZlbHk6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSB7c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6Oi9wYXRoL3RvL3JlcG8uZ2l0LworLSB7c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6On51c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHtzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHo6cGF0aC90by9yZXBvLmdpdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHN5bmMgd2l0aCBhIGxvY2FsIGRpcmVjdG9yeSwgdXNlOgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gL3BhdGgvdG8vcmVwby5naXQvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUkVNT1RFUworLS0tLS0tLQorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIGFzIGEgc2hvcnQtaGFuZCwgdGhlIG5hbWUgb2YgYQorZmlsZSBpbiBgJEdJVF9ESVIvcmVtb3Rlc2AgZGlyZWN0b3J5IGNhbiBiZSBnaXZlbjsgdGhlCituYW1lZCBmaWxlIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworLS0tLS0tLS0tLS0tCisJVVJMOiBvbmUgb2YgdGhlIGFib3ZlIFVSTCBmb3JtYXQKKwlQdXNoOiA8cmVmc3BlYz4KKwlQdWxsOiA8cmVmc3BlYz4KKworLS0tLS0tLS0tLS0tCisKK1RoZW4gc3VjaCBhIHNob3J0LWhhbmQgaXMgc3BlY2lmaWVkIGluIHBsYWNlIG9mCis8cmVwb3NpdG9yeT4gd2l0aG91dCA8cmVmc3BlYz4gcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZAorbGluZSwgPHJlZnNwZWM+IHNwZWNpZmllZCBvbiBgUHVzaDpgIGxpbmVzIG9yIGBQdWxsOmAKK2xpbmVzIGFyZSB1c2VkIGZvciBgZ2l0LXB1c2hgIGFuZCBgZ2l0LWZldGNoYC9gZ2l0LXB1bGxgLAorcmVzcGVjdGl2ZWx5LiAgTXVsdGlwbGUgYFB1c2g6YCBhbmQgYFB1bGw6YCBsaW5lcyBtYXkKK2JlIHNwZWNpZmllZCBmb3IgYWRkaXRpb25hbCBicmFuY2ggbWFwcGluZ3MuCisKK09yLCBlcXVpdmFsZW50bHksIGluIHRoZSBgJEdJVF9ESVIvY29uZmlnYCAobm90ZSB0aGUgdXNlCitvZiBgZmV0Y2hgIGluc3RlYWQgb2YgYFB1bGw6YCk6CisKKy0tLS0tLS0tLS0tLQorCVtyZW1vdGUgIjxyZW1vdGU+Il0KKwkJdXJsID0gPHVybD4KKwkJcHVzaCA9IDxyZWZzcGVjPgorCQlmZXRjaCA9IDxyZWZzcGVjPgorCistLS0tLS0tLS0tLS0KKworVGhlIG5hbWUgb2YgYSBmaWxlIGluIGAkR0lUX0RJUi9icmFuY2hlc2AgZGlyZWN0b3J5IGNhbiBiZQorc3BlY2lmaWVkIGFzIGFuIG9sZGVyIG5vdGF0aW9uIHNob3J0LWhhbmQ7IHRoZSBuYW1lZAorZmlsZSBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBsaW5lLCBhIFVSTCBpbiBvbmUgb2YgdGhlCithYm92ZSBmb3JtYXRzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaGFzaCBgI2AgYW5kIHRoZQorbmFtZSBvZiByZW1vdGUgaGVhZCAoVVJMIGZyYWdtZW50IG5vdGF0aW9uKS4KK2AkR0lUX0RJUi9icmFuY2hlcy88cmVtb3RlPmAgZmlsZSB0aGF0IHN0b3JlcyBhIDx1cmw+Cit3aXRob3V0IHRoZSBmcmFnbWVudCBpcyBlcXVpdmFsZW50IHRvIGhhdmUgdGhpcyBpbiB0aGUKK2NvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUgYCRHSVRfRElSL3JlbW90ZXMvYCBkaXJlY3RvcnkuCisKKy0tLS0tLS0tLS0tLQorCVVSTDogPHVybD4KKwlQdWxsOiByZWZzL2hlYWRzL21hc3Rlcjo8cmVtb3RlPgorCistLS0tLS0tLS0tLS0KKword2hpbGUgaGF2aW5nIGA8dXJsPiM8aGVhZD5gIGlzIGVxdWl2YWxlbnQgdG8KKworLS0tLS0tLS0tLS0tCisJVVJMOiA8dXJsPgorCVB1bGw6IHJlZnMvaGVhZHMvPGhlYWQ+OjxyZW1vdGU+CistLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwuY29uZiBiL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIwMWVjZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwuY29uZgpAQCAtMCwwICsxLDIxIEBACitbdGl0bGVzXQorCXVuZGVybGluZXM9Il9fIiwiPT0iLCItLSIsIn5+IiwiXl4iCisKK1thdHRyaWJ1dGVzXQorY2FyZXQ9Xgorc3RhcnRzYj0mIzkxOworZW5kc2I9JiM5MzsKK3RpbGRlPSYjMTI2OworCitbZ2l0bGluay1pbmxpbmVtYWNyb10KKzx1bGluayB1cmw9Int0YXJnZXR9Lmh0bWwiPnt0YXJnZXR9ezA/KHswfSl9PC91bGluaz4KKworaWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCisjICJ1bmJyZWFrIiBkb2Nib29rLXhzbCB2MS42OCBmb3IgbWFucGFnZXMuIHYxLjY5IHdvcmtzIHdpdGggb3Igd2l0aG91dCB0aGlzLgorW2xpc3RpbmdibG9ja10KKzxleGFtcGxlPjx0aXRsZT57dGl0bGV9PC90aXRsZT4KKzxsaXRlcmFsbGF5b3V0PgorfAorPC9saXRlcmFsbGF5b3V0Pgore3RpdGxlI308L2V4YW1wbGU+CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLW1hbnVhbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjYWZmNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwudHh0CkBAIC0wLDAgKzEsMzk3NSBAQAorR2l0IFVzZXIncyBNYW51YWwgKGZvciB2ZXJzaW9uIDEuNS4xIG9yIG5ld2VyKQorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisKK0dpdCBpcyBhIGZhc3QgZGlzdHJpYnV0ZWQgcmV2aXNpb24gY29udHJvbCBzeXN0ZW0uCisKK1RoaXMgbWFudWFsIGlzIGRlc2lnbmVkIHRvIGJlIHJlYWRhYmxlIGJ5IHNvbWVvbmUgd2l0aCBiYXNpYyB1bml4Citjb21tYW5kLWxpbmUgc2tpbGxzLCBidXQgbm8gcHJldmlvdXMga25vd2xlZGdlIG9mIGdpdC4KKworPDxyZXBvc2l0b3JpZXMtYW5kLWJyYW5jaGVzPj4gYW5kIDw8ZXhwbG9yaW5nLWdpdC1oaXN0b3J5Pj4gZXhwbGFpbiBob3cKK3RvIGZldGNoIGFuZCBzdHVkeSBhIHByb2plY3QgdXNpbmcgZ2l0LS1yZWFkIHRoZXNlIGNoYXB0ZXJzIHRvIGxlYXJuIGhvdwordG8gYnVpbGQgYW5kIHRlc3QgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgYSBzb2Z0d2FyZSBwcm9qZWN0LCBzZWFyY2ggZm9yCityZWdyZXNzaW9ucywgYW5kIHNvIG9uLgorCitQZW9wbGUgbmVlZGluZyB0byBkbyBhY3R1YWwgZGV2ZWxvcG1lbnQgd2lsbCBhbHNvIHdhbnQgdG8gcmVhZAorPDxEZXZlbG9waW5nLXdpdGgtZ2l0Pj4gYW5kIDw8c2hhcmluZy1kZXZlbG9wbWVudD4+LgorCitGdXJ0aGVyIGNoYXB0ZXJzIGNvdmVyIG1vcmUgc3BlY2lhbGl6ZWQgdG9waWNzLgorCitDb21wcmVoZW5zaXZlIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBtYW4KK3BhZ2VzLiAgRm9yIGEgY29tbWFuZCBzdWNoIGFzICJnaXQgY2xvbmUiLCBqdXN0IHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWFuIGdpdC1jbG9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NlZSBhbHNvIDw8Z2l0LXF1aWNrLXN0YXJ0Pj4gZm9yIGEgYnJpZWYgb3ZlcnZpZXcgb2YgZ2l0IGNvbW1hbmRzLAord2l0aG91dCBhbnkgZXhwbGFuYXRpb24uCisKK0ZpbmFsbHksIHNlZSA8PHRvZG8+PiBmb3Igd2F5cyB0aGF0IHlvdSBjYW4gaGVscCBtYWtlIHRoaXMgbWFudWFsIG1vcmUKK2NvbXBsZXRlLgorCisKK1tbcmVwb3NpdG9yaWVzLWFuZC1icmFuY2hlc11dCitSZXBvc2l0b3JpZXMgYW5kIEJyYW5jaGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbaG93LXRvLWdldC1hLWdpdC1yZXBvc2l0b3J5XV0KK0hvdyB0byBnZXQgYSBnaXQgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IHdpbGwgYmUgdXNlZnVsIHRvIGhhdmUgYSBnaXQgcmVwb3NpdG9yeSB0byBleHBlcmltZW50IHdpdGggYXMgeW91CityZWFkIHRoaXMgbWFudWFsLgorCitUaGUgYmVzdCB3YXkgdG8gZ2V0IG9uZSBpcyBieSB1c2luZyB0aGUgZ2l0bGluazpnaXQtY2xvbmVbMV0gY29tbWFuZAordG8gZG93bmxvYWQgYSBjb3B5IG9mIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkgZm9yIGEgcHJvamVjdCB0aGF0IHlvdQorYXJlIGludGVyZXN0ZWQgaW4uICBJZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgcHJvamVjdCBpbiBtaW5kLCBoZXJlCithcmUgc29tZSBpbnRlcmVzdGluZyBleGFtcGxlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIyBnaXQgaXRzZWxmIChhcHByb3guIDEwTUIgZG93bmxvYWQpOgorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdAorCSMgdGhlIGxpbnV4IGtlcm5lbCAoYXBwcm94LiAxNTBNQiBkb3dubG9hZCk6CiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXgtMi42LmdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpbml0aWFsIGNsb25lIG1heSBiZSB0aW1lLWNvbnN1bWluZyBmb3IgYSBsYXJnZSBwcm9qZWN0LCBidXQgeW91Cit3aWxsIG9ubHkgbmVlZCB0byBjbG9uZSBvbmNlLgorCitUaGUgY2xvbmUgY29tbWFuZCBjcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgcHJvamVjdAorKCJnaXQiIG9yICJsaW51eC0yLjYiIGluIHRoZSBleGFtcGxlcyBhYm92ZSkuICBBZnRlciB5b3UgY2QgaW50byB0aGlzCitkaXJlY3RvcnksIHlvdSB3aWxsIHNlZSB0aGF0IGl0IGNvbnRhaW5zIGEgY29weSBvZiB0aGUgcHJvamVjdCBmaWxlcywKK3RvZ2V0aGVyIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBkaXJlY3RvcnkgbmFtZWQgIi5naXQiLCB3aGljaAorY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGlzdG9yeSBvZiB0aGUgcHJvamVjdC4KKworSW4gbW9zdCBvZiB0aGUgZm9sbG93aW5nLCBleGFtcGxlcyB3aWxsIGJlIHRha2VuIGZyb20gb25lIG9mIHRoZSB0d28KK3JlcG9zaXRvcmllcyBhYm92ZS4KKworW1tob3ctdG8tY2hlY2stb3V0XV0KK0hvdyB0byBjaGVjayBvdXQgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBhIHByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGlzIGJlc3QgdGhvdWdodCBvZiBhcyBhIHRvb2wgZm9yIHN0b3JpbmcgdGhlIGhpc3Rvcnkgb2YgYQorY29sbGVjdGlvbiBvZiBmaWxlcy4gIEl0IHN0b3JlcyB0aGUgaGlzdG9yeSBhcyBhIGNvbXByZXNzZWQKK2NvbGxlY3Rpb24gb2YgaW50ZXJyZWxhdGVkIHNuYXBzaG90cyAodmVyc2lvbnMpIG9mIHRoZSBwcm9qZWN0J3MKK2NvbnRlbnRzLgorCitBIHNpbmdsZSBnaXQgcmVwb3NpdG9yeSBtYXkgY29udGFpbiBtdWx0aXBsZSBicmFuY2hlcy4gIEl0IGtlZXBzIHRyYWNrCitvZiB0aGVtIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIDw8ZGVmX2hlYWQsaGVhZHM+PiB3aGljaCByZWZlcmVuY2UgdGhlCitsYXRlc3QgdmVyc2lvbiBvbiBlYWNoIGJyYW5jaDsgdGhlIGdpdGxpbms6Z2l0LWJyYW5jaFsxXSBjb21tYW5kIHNob3dzCit5b3UgdGhlIGxpc3Qgb2YgYnJhbmNoIGhlYWRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaAorKiBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGZyZXNobHkgY2xvbmVkIHJlcG9zaXRvcnkgY29udGFpbnMgYSBzaW5nbGUgYnJhbmNoIGhlYWQsIGJ5IGRlZmF1bHQKK25hbWVkICJtYXN0ZXIiLCB3aXRoIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpbml0aWFsaXplZCB0byB0aGUgc3RhdGUgb2YKK3RoZSBwcm9qZWN0IHJlZmVycmVkIHRvIGJ5IHRoYXQgYnJhbmNoIGhlYWQuCisKK01vc3QgcHJvamVjdHMgYWxzbyB1c2UgPDxkZWZfdGFnLHRhZ3M+Pi4gIFRhZ3MsIGxpa2UgaGVhZHMsIGFyZQorcmVmZXJlbmNlcyBpbnRvIHRoZSBwcm9qZWN0J3MgaGlzdG9yeSwgYW5kIGNhbiBiZSBsaXN0ZWQgdXNpbmcgdGhlCitnaXRsaW5rOmdpdC10YWdbMV0gY29tbWFuZDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCB0YWcgLWwKK3YyLjYuMTEKK3YyLjYuMTEtdHJlZQordjIuNi4xMgordjIuNi4xMi1yYzIKK3YyLjYuMTItcmMzCit2Mi42LjEyLXJjNAordjIuNi4xMi1yYzUKK3YyLjYuMTItcmM2Cit2Mi42LjEzCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUYWdzIGFyZSBleHBlY3RlZCB0byBhbHdheXMgcG9pbnQgYXQgdGhlIHNhbWUgdmVyc2lvbiBvZiBhIHByb2plY3QsCit3aGlsZSBoZWFkcyBhcmUgZXhwZWN0ZWQgdG8gYWR2YW5jZSBhcyBkZXZlbG9wbWVudCBwcm9ncmVzc2VzLgorCitDcmVhdGUgYSBuZXcgYnJhbmNoIGhlYWQgcG9pbnRpbmcgdG8gb25lIG9mIHRoZXNlIHZlcnNpb25zIGFuZCBjaGVjayBpdAorb3V0IHVzaW5nIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG5ldyB2Mi42LjEzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZW4gcmVmbGVjdHMgdGhlIGNvbnRlbnRzIHRoYXQgdGhlIHByb2plY3QgaGFkCit3aGVuIGl0IHdhcyB0YWdnZWQgdjIuNi4xMywgYW5kIGdpdGxpbms6Z2l0LWJyYW5jaFsxXSBzaG93cyB0d28KK2JyYW5jaGVzLCB3aXRoIGFuIGFzdGVyaXNrIG1hcmtpbmcgdGhlIGN1cnJlbnRseSBjaGVja2VkLW91dCBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCisgIG1hc3RlcgorKiBuZXcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgZGVjaWRlIHRoYXQgeW91J2QgcmF0aGVyIHNlZSB2ZXJzaW9uIDIuNi4xNywgeW91IGNhbiBtb2RpZnkKK3RoZSBjdXJyZW50IGJyYW5jaCB0byBwb2ludCBhdCB2Mi42LjE3IGluc3RlYWQsIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgdjIuNi4xNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBpZiB0aGUgY3VycmVudCBicmFuY2ggaGVhZCB3YXMgeW91ciBvbmx5IHJlZmVyZW5jZSB0byBhCitwYXJ0aWN1bGFyIHBvaW50IGluIGhpc3RvcnksIHRoZW4gcmVzZXR0aW5nIHRoYXQgYnJhbmNoIG1heSBsZWF2ZSB5b3UKK3dpdGggbm8gd2F5IHRvIGZpbmQgdGhlIGhpc3RvcnkgaXQgdXNlZCB0byBwb2ludCB0bzsgc28gdXNlIHRoaXMgY29tbWFuZAorY2FyZWZ1bGx5LgorCitbW3VuZGVyc3RhbmRpbmctY29tbWl0c11dCitVbmRlcnN0YW5kaW5nIEhpc3Rvcnk6IENvbW1pdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVyeSBjaGFuZ2UgaW4gdGhlIGhpc3Rvcnkgb2YgYSBwcm9qZWN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgY29tbWl0LgorVGhlIGdpdGxpbms6Z2l0LXNob3dbMV0gY29tbWFuZCBzaG93cyB0aGUgbW9zdCByZWNlbnQgY29tbWl0IG9uIHRoZQorY3VycmVudCBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdworY29tbWl0IDJiNWY2ZGNjZTViZjk0YjliMTE5ZTllZDhkNTM3MDk4ZWM2MWMzZDIKK0F1dGhvcjogSmFtYWwgSGFkaSBTYWxpbSA8aGFkaUBjeWJlcnVzLmNhPgorRGF0ZTogICBTYXQgRGVjIDIgMjI6MjI6MjUgMjAwNiAtMDgwMAorCisgICAgW1hGUk1dOiBGaXggYWV2ZW50IHN0cnVjdHVyaW5nIHRvIGJlIG1vcmUgY29tcGxldGUuCisgICAgCisgICAgYWV2ZW50cyBjYW4gbm90IHVuaXF1ZWx5IGlkZW50aWZ5IGFuIFNBLiBXZSBicmVhayB0aGUgQUJJIHdpdGggdGhpcworICAgIHBhdGNoLCBidXQgY29uc2Vuc3VzIGlzIHRoYXQgc2luY2UgaXQgaXMgbm90IHlldCB1dGlsaXplZCBieSBhbnkKKyAgICAoa25vd24pIGFwcGxpY2F0aW9uIHRoZW4gaXQgaXMgZmluZSAoYmV0dGVyIGRvIGl0IG5vdyB0aGFuIGxhdGVyKS4KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYW1hbCBIYWRpIFNhbGltIDxoYWRpQGN5YmVydXMuY2E+CisgICAgU2lnbmVkLW9mZi1ieTogRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3hmcm1fc3luYy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveGZybV9zeW5jLnR4dAoraW5kZXggOGJlNjI2Zi4uZDdhYWM5ZCAxMDA2NDQKKy0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy94ZnJtX3N5bmMudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveGZybV9zeW5jLnR4dAorQEAgLTQ3LDEwICs0NywxMyBAQCBhZXZlbnRfaWQgc3RydWN0dXJlIGxvb2tzIGxpa2U6CisgCisgICAgc3RydWN0IHhmcm1fYWV2ZW50X2lkIHsKKyAgICAgICAgICAgICAgc3RydWN0IHhmcm1fdXNlcnNhX2lkICAgICAgICAgICBzYV9pZDsKKysgICAgICAgICAgICAgeGZybV9hZGRyZXNzX3QgICAgICAgICAgICAgICAgICBzYWRkcjsKKyAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKysgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFpZDsKKyAgICB9OworLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgeW91IGNhbiBzZWUsIGEgY29tbWl0IHNob3dzIHdobyBtYWRlIHRoZSBsYXRlc3QgY2hhbmdlLCB3aGF0IHRoZXkKK2RpZCwgYW5kIHdoeS4KKworRXZlcnkgY29tbWl0IGhhcyBhIDQwLWhleGRpZ2l0IGlkLCBzb21ldGltZXMgY2FsbGVkIHRoZSAib2JqZWN0IG5hbWUiIG9yIHRoZQorIlNIQTEgaWQiLCBzaG93biBvbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgImdpdCBzaG93IiBvdXRwdXQuICBZb3UgY2FuIHVzdWFsbHkKK3JlZmVyIHRvIGEgY29tbWl0IGJ5IGEgc2hvcnRlciBuYW1lLCBzdWNoIGFzIGEgdGFnIG9yIGEgYnJhbmNoIG5hbWUsIGJ1dCB0aGlzCitsb25nZXIgbmFtZSBjYW4gYWxzbyBiZSB1c2VmdWwuICBNb3N0IGltcG9ydGFudGx5LCBpdCBpcyBhIGdsb2JhbGx5IHVuaXF1ZQorbmFtZSBmb3IgdGhpcyBjb21taXQ6IHNvIGlmIHlvdSB0ZWxsIHNvbWVib2R5IGVsc2UgdGhlIG9iamVjdCBuYW1lIChmb3IKK2V4YW1wbGUgaW4gZW1haWwpLCB0aGVuIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IG5hbWUgd2lsbCByZWZlciB0byB0aGUgc2FtZQorY29tbWl0IGluIHRoZWlyIHJlcG9zaXRvcnkgdGhhdCBpdCBkb2VzIGluIHlvdXJzIChhc3N1bWluZyB0aGVpciByZXBvc2l0b3J5CitoYXMgdGhhdCBjb21taXQgYXQgYWxsKS4gIFNpbmNlIHRoZSBvYmplY3QgbmFtZSBpcyBjb21wdXRlZCBhcyBhIGhhc2ggb3ZlciB0aGUKK2NvbnRlbnRzIG9mIHRoZSBjb21taXQsIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBjb21taXQgY2FuIG5ldmVyIGNoYW5nZQord2l0aG91dCBpdHMgbmFtZSBhbHNvIGNoYW5naW5nLgorCitJbiBmYWN0LCBpbiA8PGdpdC1pbnRlcm5hbHM+PiB3ZSBzaGFsbCBzZWUgdGhhdCBldmVyeXRoaW5nIHN0b3JlZCBpbiBnaXQKK2hpc3RvcnksIGluY2x1ZGluZyBmaWxlIGRhdGEgYW5kIGRpcmVjdG9yeSBjb250ZW50cywgaXMgc3RvcmVkIGluIGFuIG9iamVjdAord2l0aCBhIG5hbWUgdGhhdCBpcyBhIGhhc2ggb2YgaXRzIGNvbnRlbnRzLgorCitbW3VuZGVyc3RhbmRpbmctcmVhY2hhYmlsaXR5XV0KK1VuZGVyc3RhbmRpbmcgaGlzdG9yeTogY29tbWl0cywgcGFyZW50cywgYW5kIHJlYWNoYWJpbGl0eQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0V2ZXJ5IGNvbW1pdCAoZXhjZXB0IHRoZSB2ZXJ5IGZpcnN0IGNvbW1pdCBpbiBhIHByb2plY3QpIGFsc28gaGFzIGEKK3BhcmVudCBjb21taXQgd2hpY2ggc2hvd3Mgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhpcyBjb21taXQuCitGb2xsb3dpbmcgdGhlIGNoYWluIG9mIHBhcmVudHMgd2lsbCBldmVudHVhbGx5IHRha2UgeW91IGJhY2sgdG8gdGhlCitiZWdpbm5pbmcgb2YgdGhlIHByb2plY3QuCisKK0hvd2V2ZXIsIHRoZSBjb21taXRzIGRvIG5vdCBmb3JtIGEgc2ltcGxlIGxpc3Q7IGdpdCBhbGxvd3MgbGluZXMgb2YKK2RldmVsb3BtZW50IHRvIGRpdmVyZ2UgYW5kIHRoZW4gcmVjb252ZXJnZSwgYW5kIHRoZSBwb2ludCB3aGVyZSB0d28KK2xpbmVzIG9mIGRldmVsb3BtZW50IHJlY29udmVyZ2UgaXMgY2FsbGVkIGEgIm1lcmdlIi4gIFRoZSBjb21taXQKK3JlcHJlc2VudGluZyBhIG1lcmdlIGNhbiB0aGVyZWZvcmUgaGF2ZSBtb3JlIHRoYW4gb25lIHBhcmVudCwgd2l0aAorZWFjaCBwYXJlbnQgcmVwcmVzZW50aW5nIHRoZSBtb3N0IHJlY2VudCBjb21taXQgb24gb25lIG9mIHRoZSBsaW5lcworb2YgZGV2ZWxvcG1lbnQgbGVhZGluZyB0byB0aGF0IHBvaW50LgorCitUaGUgYmVzdCB3YXkgdG8gc2VlIGhvdyB0aGlzIHdvcmtzIGlzIHVzaW5nIHRoZSBnaXRsaW5rOmdpdGtbMV0KK2NvbW1hbmQ7IHJ1bm5pbmcgZ2l0ayBub3cgb24gYSBnaXQgcmVwb3NpdG9yeSBhbmQgbG9va2luZyBmb3IgbWVyZ2UKK2NvbW1pdHMgd2lsbCBoZWxwIHVuZGVyc3RhbmQgaG93IHRoZSBnaXQgb3JnYW5pemVzIGhpc3RvcnkuCisKK0luIHRoZSBmb2xsb3dpbmcsIHdlIHNheSB0aGF0IGNvbW1pdCBYIGlzICJyZWFjaGFibGUiIGZyb20gY29tbWl0IFkKK2lmIGNvbW1pdCBYIGlzIGFuIGFuY2VzdG9yIG9mIGNvbW1pdCBZLiAgRXF1aXZhbGVudGx5LCB5b3UgY291bGQgc2F5Cit0aGF0IFkgaXMgYSBkZXNjZW5kZW50IG9mIFgsIG9yIHRoYXQgdGhlcmUgaXMgYSBjaGFpbiBvZiBwYXJlbnRzCitsZWFkaW5nIGZyb20gY29tbWl0IFkgdG8gY29tbWl0IFguCisKK1tbaGlzdG9yeS1kaWFncmFtc11dCitVbmRlcnN0YW5kaW5nIGhpc3Rvcnk6IEhpc3RvcnkgZGlhZ3JhbXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXZSB3aWxsIHNvbWV0aW1lcyByZXByZXNlbnQgZ2l0IGhpc3RvcnkgdXNpbmcgZGlhZ3JhbXMgbGlrZSB0aGUgb25lCitiZWxvdy4gIENvbW1pdHMgYXJlIHNob3duIGFzICJvIiwgYW5kIHRoZSBsaW5rcyBiZXR3ZWVuIHRoZW0gd2l0aAorbGluZXMgZHJhd24gd2l0aCAtIC8gYW5kIFwuICBUaW1lIGdvZXMgbGVmdCB0byByaWdodDoKKworCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICAgICAgIG8tLW8tLW8gPC0tIEJyYW5jaCBBCisgICAgICAgIC8KKyBvLS1vLS1vIDwtLSBtYXN0ZXIKKyAgICAgICAgXAorICAgICAgICAgby0tby0tbyA8LS0gQnJhbmNoIEIKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitJZiB3ZSBuZWVkIHRvIHRhbGsgYWJvdXQgYSBwYXJ0aWN1bGFyIGNvbW1pdCwgdGhlIGNoYXJhY3RlciAibyIgbWF5CitiZSByZXBsYWNlZCB3aXRoIGFub3RoZXIgbGV0dGVyIG9yIG51bWJlci4KKworW1t3aGF0LWlzLWEtYnJhbmNoXV0KK1VuZGVyc3RhbmRpbmcgaGlzdG9yeTogV2hhdCBpcyBhIGJyYW5jaD8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV2hlbiB3ZSBuZWVkIHRvIGJlIHByZWNpc2UsIHdlIHdpbGwgdXNlIHRoZSB3b3JkICJicmFuY2giIHRvIG1lYW4gYSBsaW5lCitvZiBkZXZlbG9wbWVudCwgYW5kICJicmFuY2ggaGVhZCIgKG9yIGp1c3QgImhlYWQiKSB0byBtZWFuIGEgcmVmZXJlbmNlCit0byB0aGUgbW9zdCByZWNlbnQgY29tbWl0IG9uIGEgYnJhbmNoLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBicmFuY2gKK2hlYWQgbmFtZWQgIkEiIGlzIGEgcG9pbnRlciB0byBvbmUgcGFydGljdWxhciBjb21taXQsIGJ1dCB3ZSByZWZlciB0bwordGhlIGxpbmUgb2YgdGhyZWUgY29tbWl0cyBsZWFkaW5nIHVwIHRvIHRoYXQgcG9pbnQgYXMgYWxsIGJlaW5nIHBhcnQgb2YKKyJicmFuY2ggQSIuCisKK0hvd2V2ZXIsIHdoZW4gbm8gY29uZnVzaW9uIHdpbGwgcmVzdWx0LCB3ZSBvZnRlbiBqdXN0IHVzZSB0aGUgdGVybQorImJyYW5jaCIgYm90aCBmb3IgYnJhbmNoZXMgYW5kIGZvciBicmFuY2ggaGVhZHMuCisKK1tbbWFuaXB1bGF0aW5nLWJyYW5jaGVzXV0KK01hbmlwdWxhdGluZyBicmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NyZWF0aW5nLCBkZWxldGluZywgYW5kIG1vZGlmeWluZyBicmFuY2hlcyBpcyBxdWljayBhbmQgZWFzeTsgaGVyZSdzCithIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmRzOgorCitnaXQgYnJhbmNoOjoKKwlsaXN0IGFsbCBicmFuY2hlcworZ2l0IGJyYW5jaCA8YnJhbmNoPjo6CisJY3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCA8YnJhbmNoPiwgcmVmZXJlbmNpbmcgdGhlIHNhbWUKKwlwb2ludCBpbiBoaXN0b3J5IGFzIHRoZSBjdXJyZW50IGJyYW5jaAorZ2l0IGJyYW5jaCA8YnJhbmNoPiA8c3RhcnQtcG9pbnQ+OjoKKwljcmVhdGUgYSBuZXcgYnJhbmNoIG5hbWVkIDxicmFuY2g+LCByZWZlcmVuY2luZworCTxzdGFydC1wb2ludD4sIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgYW55IHdheSB5b3UgbGlrZSwKKwlpbmNsdWRpbmcgdXNpbmcgYSBicmFuY2ggbmFtZSBvciBhIHRhZyBuYW1lCitnaXQgYnJhbmNoIC1kIDxicmFuY2g+OjoKKwlkZWxldGUgdGhlIGJyYW5jaCA8YnJhbmNoPjsgaWYgdGhlIGJyYW5jaCB5b3UgYXJlIGRlbGV0aW5nCisJcG9pbnRzIHRvIGEgY29tbWl0IHdoaWNoIGlzIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgY3VycmVudAorCWJyYW5jaCwgdGhpcyBjb21tYW5kIHdpbGwgZmFpbCB3aXRoIGEgd2FybmluZy4KK2dpdCBicmFuY2ggLUQgPGJyYW5jaD46OgorCWV2ZW4gaWYgdGhlIGJyYW5jaCBwb2ludHMgdG8gYSBjb21taXQgbm90IHJlYWNoYWJsZQorCWZyb20gdGhlIGN1cnJlbnQgYnJhbmNoLCB5b3UgbWF5IGtub3cgdGhhdCB0aGF0IGNvbW1pdAorCWlzIHN0aWxsIHJlYWNoYWJsZSBmcm9tIHNvbWUgb3RoZXIgYnJhbmNoIG9yIHRhZy4gIEluIHRoYXQKKwljYXNlIGl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgY29tbWFuZCB0byBmb3JjZSBnaXQgdG8gZGVsZXRlCisJdGhlIGJyYW5jaC4KK2dpdCBjaGVja291dCA8YnJhbmNoPjo6CisJbWFrZSB0aGUgY3VycmVudCBicmFuY2ggPGJyYW5jaD4sIHVwZGF0aW5nIHRoZSB3b3JraW5nCisJZGlyZWN0b3J5IHRvIHJlZmxlY3QgdGhlIHZlcnNpb24gcmVmZXJlbmNlZCBieSA8YnJhbmNoPgorZ2l0IGNoZWNrb3V0IC1iIDxuZXc+IDxzdGFydC1wb2ludD46OgorCWNyZWF0ZSBhIG5ldyBicmFuY2ggPG5ldz4gcmVmZXJlbmNpbmcgPHN0YXJ0LXBvaW50PiwgYW5kCisJY2hlY2sgaXQgb3V0LgorCitUaGUgc3BlY2lhbCBzeW1ib2wgIkhFQUQiIGNhbiBhbHdheXMgYmUgdXNlZCB0byByZWZlciB0byB0aGUgY3VycmVudAorYnJhbmNoLiAgSW4gZmFjdCwgZ2l0IHVzZXMgYSBmaWxlIG5hbWVkICJIRUFEIiBpbiB0aGUgLmdpdCBkaXJlY3RvcnkgdG8KK3JlbWVtYmVyIHdoaWNoIGJyYW5jaCBpcyBjdXJyZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorcmVmOiByZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbZGV0YWNoZWQtaGVhZF1dCitFeGFtaW5pbmcgYW4gb2xkIHZlcnNpb24gd2l0aG91dCBjcmVhdGluZyBhIG5ldyBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ2l0LWNoZWNrb3V0IGNvbW1hbmQgbm9ybWFsbHkgZXhwZWN0cyBhIGJyYW5jaCBoZWFkLCBidXQgd2lsbCBhbHNvCithY2NlcHQgYW4gYXJiaXRyYXJ5IGNvbW1pdDsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hlY2sgb3V0IHRoZSBjb21taXQKK3JlZmVyZW5jZWQgYnkgYSB0YWc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgdjIuNi4xNworTm90ZTogbW92aW5nIHRvICJ2Mi42LjE3IiB3aGljaCBpc24ndCBhIGxvY2FsIGJyYW5jaAorSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBmcm9tIHRoaXMgY2hlY2tvdXQsIHlvdSBtYXkgZG8gc28KKyhub3cgb3IgbGF0ZXIpIGJ5IHVzaW5nIC1iIHdpdGggdGhlIGNoZWNrb3V0IGNvbW1hbmQgYWdhaW4uIEV4YW1wbGU6CisgIGdpdCBjaGVja291dCAtYiA8bmV3X2JyYW5jaF9uYW1lPgorSEVBRCBpcyBub3cgYXQgNDI3YWJmYS4uLiBMaW51eCB2Mi42LjE3CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEhFQUQgdGhlbiByZWZlcnMgdG8gdGhlIFNIQTEgb2YgdGhlIGNvbW1pdCBpbnN0ZWFkIG9mIHRvIGEgYnJhbmNoLAorYW5kIGdpdCBicmFuY2ggc2hvd3MgdGhhdCB5b3UgYXJlIG5vIGxvbmdlciBvbiBhIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L0hFQUQKKzQyN2FiZmEyOGFmZWRmZmFkZmNhOWRkOGIwNjdlYjZkMzZiYWM1M2YKKyQgZ2l0IGJyYW5jaAorKiAobm8gYnJhbmNoKQorICBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGlzIGNhc2Ugd2Ugc2F5IHRoYXQgdGhlIEhFQUQgaXMgImRldGFjaGVkIi4KKworVGhpcyBpcyBhbiBlYXN5IHdheSB0byBjaGVjayBvdXQgYSBwYXJ0aWN1bGFyIHZlcnNpb24gd2l0aG91dCBoYXZpbmcgdG8KK21ha2UgdXAgYSBuYW1lIGZvciB0aGUgbmV3IGJyYW5jaC4gICBZb3UgY2FuIHN0aWxsIGNyZWF0ZSBhIG5ldyBicmFuY2gKKyhvciB0YWcpIGZvciB0aGlzIHZlcnNpb24gbGF0ZXIgaWYgeW91IGRlY2lkZSB0by4KKworW1tleGFtaW5pbmctcmVtb3RlLWJyYW5jaGVzXV0KK0V4YW1pbmluZyBicmFuY2hlcyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJtYXN0ZXIiIGJyYW5jaCB0aGF0IHdhcyBjcmVhdGVkIGF0IHRoZSB0aW1lIHlvdSBjbG9uZWQgaXMgYSBjb3B5CitvZiB0aGUgSEVBRCBpbiB0aGUgcmVwb3NpdG9yeSB0aGF0IHlvdSBjbG9uZWQgZnJvbS4gIFRoYXQgcmVwb3NpdG9yeQorbWF5IGFsc28gaGF2ZSBoYWQgb3RoZXIgYnJhbmNoZXMsIHRob3VnaCwgYW5kIHlvdXIgbG9jYWwgcmVwb3NpdG9yeQora2VlcHMgYnJhbmNoZXMgd2hpY2ggdHJhY2sgZWFjaCBvZiB0aG9zZSByZW1vdGUgYnJhbmNoZXMsIHdoaWNoIHlvdQorY2FuIHZpZXcgdXNpbmcgdGhlICItciIgb3B0aW9uIHRvIGdpdGxpbms6Z2l0LWJyYW5jaFsxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLXIKKyAgb3JpZ2luL0hFQUQKKyAgb3JpZ2luL2h0bWwKKyAgb3JpZ2luL21haW50CisgIG9yaWdpbi9tYW4KKyAgb3JpZ2luL21hc3RlcgorICBvcmlnaW4vbmV4dAorICBvcmlnaW4vcHUKKyAgb3JpZ2luL3RvZG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2Fubm90IGNoZWNrIG91dCB0aGVzZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMsIGJ1dCB5b3UgY2FuCitleGFtaW5lIHRoZW0gb24gYSBicmFuY2ggb2YgeW91ciBvd24sIGp1c3QgYXMgeW91IHdvdWxkIGEgdGFnOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15LXRvZG8tY29weSBvcmlnaW4vdG9kbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB0aGUgbmFtZSAib3JpZ2luIiBpcyBqdXN0IHRoZSBuYW1lIHRoYXQgZ2l0IHVzZXMgYnkgZGVmYXVsdAordG8gcmVmZXIgdG8gdGhlIHJlcG9zaXRvcnkgdGhhdCB5b3UgY2xvbmVkIGZyb20uCisKK1tbaG93LWdpdC1zdG9yZXMtcmVmZXJlbmNlc11dCitOYW1pbmcgYnJhbmNoZXMsIHRhZ3MsIGFuZCBvdGhlciByZWZlcmVuY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JyYW5jaGVzLCByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMsIGFuZCB0YWdzIGFyZSBhbGwgcmVmZXJlbmNlcyB0bworY29tbWl0cy4gIEFsbCByZWZlcmVuY2VzIGFyZSBuYW1lZCB3aXRoIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggbmFtZQorc3RhcnRpbmcgd2l0aCAicmVmcyI7IHRoZSBuYW1lcyB3ZSd2ZSBiZWVuIHVzaW5nIHNvIGZhciBhcmUgYWN0dWFsbHkKK3Nob3J0aGFuZDoKKworCS0gVGhlIGJyYW5jaCAidGVzdCIgaXMgc2hvcnQgZm9yICJyZWZzL2hlYWRzL3Rlc3QiLgorCS0gVGhlIHRhZyAidjIuNi4xOCIgaXMgc2hvcnQgZm9yICJyZWZzL3RhZ3MvdjIuNi4xOCIuCisJLSAib3JpZ2luL21hc3RlciIgaXMgc2hvcnQgZm9yICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIuCisKK1RoZSBmdWxsIG5hbWUgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCBpZiwgZm9yIGV4YW1wbGUsIHRoZXJlIGV2ZXIKK2V4aXN0cyBhIHRhZyBhbmQgYSBicmFuY2ggd2l0aCB0aGUgc2FtZSBuYW1lLgorCitBcyBhbm90aGVyIHVzZWZ1bCBzaG9ydGN1dCwgdGhlICJIRUFEIiBvZiBhIHJlcG9zaXRvcnkgY2FuIGJlIHJlZmVycmVkCit0byBqdXN0IHVzaW5nIHRoZSBuYW1lIG9mIHRoYXQgcmVwb3NpdG9yeS4gIFNvLCBmb3IgZXhhbXBsZSwgIm9yaWdpbiIKK2lzIHVzdWFsbHkgYSBzaG9ydGN1dCBmb3IgdGhlIEhFQUQgYnJhbmNoIGluIHRoZSByZXBvc2l0b3J5ICJvcmlnaW4iLgorCitGb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGF0aHMgd2hpY2ggZ2l0IGNoZWNrcyBmb3IgcmVmZXJlbmNlcywgYW5kCit0aGUgb3JkZXIgaXQgdXNlcyB0byBkZWNpZGUgd2hpY2ggdG8gY2hvb3NlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCityZWZlcmVuY2VzIHdpdGggdGhlIHNhbWUgc2hvcnRoYW5kIG5hbWUsIHNlZSB0aGUgIlNQRUNJRllJTkcKK1JFVklTSU9OUyIgc2VjdGlvbiBvZiBnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0uCisKK1tbVXBkYXRpbmctYS1yZXBvc2l0b3J5LXdpdGgtZ2l0LWZldGNoXV0KK1VwZGF0aW5nIGEgcmVwb3NpdG9yeSB3aXRoIGdpdCBmZXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZW50dWFsbHkgdGhlIGRldmVsb3BlciBjbG9uZWQgZnJvbSB3aWxsIGRvIGFkZGl0aW9uYWwgd29yayBpbiBoZXIKK3JlcG9zaXRvcnksIGNyZWF0aW5nIG5ldyBjb21taXRzIGFuZCBhZHZhbmNpbmcgdGhlIGJyYW5jaGVzIHRvIHBvaW50CithdCB0aGUgbmV3IGNvbW1pdHMuCisKK1RoZSBjb21tYW5kICJnaXQgZmV0Y2giLCB3aXRoIG5vIGFyZ3VtZW50cywgd2lsbCB1cGRhdGUgYWxsIG9mIHRoZQorcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBmb3VuZCBpbiBoZXIKK3JlcG9zaXRvcnkuICBJdCB3aWxsIG5vdCB0b3VjaCBhbnkgb2YgeW91ciBvd24gYnJhbmNoZXMtLW5vdCBldmVuIHRoZQorIm1hc3RlciIgYnJhbmNoIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHlvdSBvbiBjbG9uZS4KKworW1tmZXRjaGluZy1icmFuY2hlc11dCitGZXRjaGluZyBicmFuY2hlcyBmcm9tIG90aGVyIHJlcG9zaXRvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIHRyYWNrIGJyYW5jaGVzIGZyb20gcmVwb3NpdG9yaWVzIG90aGVyIHRoYW4gdGhlIG9uZSB5b3UKK2Nsb25lZCBmcm9tLCB1c2luZyBnaXRsaW5rOmdpdC1yZW1vdGVbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgbGludXgtbmZzIGdpdDovL2xpbnV4LW5mcy5vcmcvcHViL25mcy0yLjYuZ2l0CiskIGdpdCBmZXRjaCBsaW51eC1uZnMKKyogcmVmcy9yZW1vdGVzL2xpbnV4LW5mcy9tYXN0ZXI6IHN0b3JpbmcgYnJhbmNoICdtYXN0ZXInIC4uLgorICBjb21taXQ6IGJmODFiNDYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmV3IHJlbW90ZS10cmFja2luZyBicmFuY2hlcyB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgc2hvcnRoYW5kIG5hbWUKK3RoYXQgeW91IGdhdmUgImdpdCByZW1vdGUgYWRkIiwgaW4gdGhpcyBjYXNlIGxpbnV4LW5mczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIC1yCitsaW51eC1uZnMvbWFzdGVyCitvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBydW4gImdpdCBmZXRjaCA8cmVtb3RlPiIgbGF0ZXIsIHRoZSB0cmFja2luZyBicmFuY2hlcyBmb3IgdGhlCituYW1lZCA8cmVtb3RlPiB3aWxsIGJlIHVwZGF0ZWQuCisKK0lmIHlvdSBleGFtaW5lIHRoZSBmaWxlIC5naXQvY29uZmlnLCB5b3Ugd2lsbCBzZWUgdGhhdCBnaXQgaGFzIGFkZGVkCithIG5ldyBzdGFuemE6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvY29uZmlnCisuLi4KK1tyZW1vdGUgImxpbnV4LW5mcyJdCisJdXJsID0gZ2l0Oi8vbGludXgtbmZzLm9yZy9wdWIvbmZzLTIuNi5naXQKKwlmZXRjaCA9ICtyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL2xpbnV4LW5mcy8qCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB3aGF0IGNhdXNlcyBnaXQgdG8gdHJhY2sgdGhlIHJlbW90ZSdzIGJyYW5jaGVzOyB5b3UgbWF5IG1vZGlmeQorb3IgZGVsZXRlIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBieSBlZGl0aW5nIC5naXQvY29uZmlnIHdpdGggYQordGV4dCBlZGl0b3IuICAoU2VlIHRoZSAiQ09ORklHVVJBVElPTiBGSUxFIiBzZWN0aW9uIG9mCitnaXRsaW5rOmdpdC1jb25maWdbMV0gZm9yIGRldGFpbHMuKQorCitbW2V4cGxvcmluZy1naXQtaGlzdG9yeV1dCitFeHBsb3JpbmcgZ2l0IGhpc3RvcnkKKz09PT09PT09PT09PT09PT09PT09PQorCitHaXQgaXMgYmVzdCB0aG91Z2h0IG9mIGFzIGEgdG9vbCBmb3Igc3RvcmluZyB0aGUgaGlzdG9yeSBvZiBhCitjb2xsZWN0aW9uIG9mIGZpbGVzLiAgSXQgZG9lcyB0aGlzIGJ5IHN0b3JpbmcgY29tcHJlc3NlZCBzbmFwc2hvdHMgb2YKK3RoZSBjb250ZW50cyBvZiBhIGZpbGUgaGVpcmFyY2h5LCB0b2dldGhlciB3aXRoICJjb21taXRzIiB3aGljaCBzaG93Cit0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIHNuYXBzaG90cy4KKworR2l0IHByb3ZpZGVzIGV4dHJlbWVseSBmbGV4aWJsZSBhbmQgZmFzdCB0b29scyBmb3IgZXhwbG9yaW5nIHRoZQoraGlzdG9yeSBvZiBhIHByb2plY3QuCisKK1dlIHN0YXJ0IHdpdGggb25lIHNwZWNpYWxpemVkIHRvb2wgdGhhdCBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgdGhlCitjb21taXQgdGhhdCBpbnRyb2R1Y2VkIGEgYnVnIGludG8gYSBwcm9qZWN0LgorCitbW3VzaW5nLWJpc2VjdF1dCitIb3cgdG8gdXNlIGJpc2VjdCB0byBmaW5kIGEgcmVncmVzc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB2ZXJzaW9uIDIuNi4xOCBvZiB5b3VyIHByb2plY3Qgd29ya2VkLCBidXQgdGhlIHZlcnNpb24gYXQKKyJtYXN0ZXIiIGNyYXNoZXMuICBTb21ldGltZXMgdGhlIGJlc3Qgd2F5IHRvIGZpbmQgdGhlIGNhdXNlIG9mIHN1Y2ggYQorcmVncmVzc2lvbiBpcyB0byBwZXJmb3JtIGEgYnJ1dGUtZm9yY2Ugc2VhcmNoIHRocm91Z2ggdGhlIHByb2plY3QncworaGlzdG9yeSB0byBmaW5kIHRoZSBwYXJ0aWN1bGFyIGNvbW1pdCB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4gIFRoZQorZ2l0bGluazpnaXQtYmlzZWN0WzFdIGNvbW1hbmQgY2FuIGhlbHAgeW91IGRvIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydAorJCBnaXQgYmlzZWN0IGdvb2QgdjIuNi4xOAorJCBnaXQgYmlzZWN0IGJhZCBtYXN0ZXIKK0Jpc2VjdGluZzogMzUzNyByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMKK1s2NTkzNGE5YTAyOGI4OGU4M2UyYjBmOGIzNjYxOGZlNTAzMzQ5ZjhlXSBCTE9DSzogTWFrZSBVU0Igc3RvcmFnZSBkZXBlbmQgb24gU0NTSSByYXRoZXIgdGhhbiBzZWxlY3RpbmcgaXQgW3RyeSAjNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IHJ1biAiZ2l0IGJyYW5jaCIgYXQgdGhpcyBwb2ludCwgeW91J2xsIHNlZSB0aGF0IGdpdCBoYXMKK3RlbXBvcmFyaWx5IG1vdmVkIHlvdSB0byBhIG5ldyBicmFuY2ggbmFtZWQgImJpc2VjdCIuICBUaGlzIGJyYW5jaAorcG9pbnRzIHRvIGEgY29tbWl0ICh3aXRoIGNvbW1pdCBpZCA2NTkzNC4uLikgdGhhdCBpcyByZWFjaGFibGUgZnJvbQordjIuNi4xOSBidXQgbm90IGZyb20gdjIuNi4xOC4gIENvbXBpbGUgYW5kIHRlc3QgaXQsIGFuZCBzZWUgd2hldGhlcgoraXQgY3Jhc2hlcy4gIEFzc3VtZSBpdCBkb2VzIGNyYXNoLiAgVGhlbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IGJhZAorQmlzZWN0aW5nOiAxNzY5IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworWzdlZmY4MmM4YjE1MTEwMTdhZTYwNWYwYzk5YWMyNzVhN2UyMWI4NjddIGkyYy1jb3JlOiBEcm9wIHVzZWxlc3MgYml0bWFza2luZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2hlY2tzIG91dCBhbiBvbGRlciB2ZXJzaW9uLiAgQ29udGludWUgbGlrZSB0aGlzLCB0ZWxsaW5nIGdpdCBhdCBlYWNoCitzdGFnZSB3aGV0aGVyIHRoZSB2ZXJzaW9uIGl0IGdpdmVzIHlvdSBpcyBnb29kIG9yIGJhZCwgYW5kIG5vdGljZQordGhhdCB0aGUgbnVtYmVyIG9mIHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgaXMgY3V0IGFwcHJveGltYXRlbHkgaW4KK2hhbGYgZWFjaCB0aW1lLgorCitBZnRlciBhYm91dCAxMyB0ZXN0cyAoaW4gdGhpcyBjYXNlKSwgaXQgd2lsbCBvdXRwdXQgdGhlIGNvbW1pdCBpZCBvZgordGhlIGd1aWx0eSBjb21taXQuICBZb3UgY2FuIHRoZW4gZXhhbWluZSB0aGUgY29tbWl0IHdpdGgKK2dpdGxpbms6Z2l0LXNob3dbMV0sIGZpbmQgb3V0IHdobyB3cm90ZSBpdCwgYW5kIG1haWwgdGhlbSB5b3VyIGJ1ZworcmVwb3J0IHdpdGggdGhlIGNvbW1pdCBpZC4gIEZpbmFsbHksIHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVzZXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gcmV0dXJuIHlvdSB0byB0aGUgYnJhbmNoIHlvdSB3ZXJlIG9uIGJlZm9yZSBhbmQgZGVsZXRlIHRoZQordGVtcG9yYXJ5ICJiaXNlY3QiIGJyYW5jaC4KKworTm90ZSB0aGF0IHRoZSB2ZXJzaW9uIHdoaWNoIGdpdC1iaXNlY3QgY2hlY2tzIG91dCBmb3IgeW91IGF0IGVhY2gKK3BvaW50IGlzIGp1c3QgYSBzdWdnZXN0aW9uLCBhbmQgeW91J3JlIGZyZWUgdG8gdHJ5IGEgZGlmZmVyZW50Cit2ZXJzaW9uIGlmIHlvdSB0aGluayBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYS4gIEZvciBleGFtcGxlLAorb2NjYXNpb25hbGx5IHlvdSBtYXkgbGFuZCBvbiBhIGNvbW1pdCB0aGF0IGJyb2tlIHNvbWV0aGluZyB1bnJlbGF0ZWQ7CitydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHZpc3VhbGl6ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHJ1biBnaXRrIGFuZCBsYWJlbCB0aGUgY29tbWl0IGl0IGNob3NlIHdpdGggYSBtYXJrZXIgdGhhdAorc2F5cyAiYmlzZWN0Ii4gIENob3NlIGEgc2FmZS1sb29raW5nIGNvbW1pdCBuZWFyYnksIG5vdGUgaXRzIGNvbW1pdAoraWQsIGFuZCBjaGVjayBpdCBvdXQgd2l0aDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQgLS1oYXJkIGZiNDdkZGIyZGIuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlbiB0ZXN0LCBydW4gImJpc2VjdCBnb29kIiBvciAiYmlzZWN0IGJhZCIgYXMgYXBwcm9wcmlhdGUsIGFuZAorY29udGludWUuCisKK1tbbmFtaW5nLWNvbW1pdHNdXQorTmFtaW5nIGNvbW1pdHMKKy0tLS0tLS0tLS0tLS0tCisKK1dlIGhhdmUgc2VlbiBzZXZlcmFsIHdheXMgb2YgbmFtaW5nIGNvbW1pdHMgYWxyZWFkeToKKworCS0gNDAtaGV4ZGlnaXQgb2JqZWN0IG5hbWUKKwktIGJyYW5jaCBuYW1lOiByZWZlcnMgdG8gdGhlIGNvbW1pdCBhdCB0aGUgaGVhZCBvZiB0aGUgZ2l2ZW4KKwkgIGJyYW5jaAorCS0gdGFnIG5hbWU6IHJlZmVycyB0byB0aGUgY29tbWl0IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIHRhZworCSAgKHdlJ3ZlIHNlZW4gYnJhbmNoZXMgYW5kIHRhZ3MgYXJlIHNwZWNpYWwgY2FzZXMgb2YKKwkgIDw8aG93LWdpdC1zdG9yZXMtcmVmZXJlbmNlcyxyZWZlcmVuY2VzPj4pLgorCS0gSEVBRDogcmVmZXJzIHRvIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IGJyYW5jaAorCitUaGVyZSBhcmUgbWFueSBtb3JlOyBzZWUgdGhlICJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBvZiB0aGUKK2dpdGxpbms6Z2l0LXJldi1wYXJzZVsxXSBtYW4gcGFnZSBmb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0bworbmFtZSByZXZpc2lvbnMuICBTb21lIGV4YW1wbGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IGZiNDdkZGIyICMgdGhlIGZpcnN0IGZldyBjaGFyYWN0ZXJzIG9mIHRoZSBvYmplY3QgbmFtZQorCQkgICAgIyBhcmUgdXN1YWxseSBlbm91Z2ggdG8gc3BlY2lmeSBpdCB1bmlxdWVseQorJCBnaXQgc2hvdyBIRUFEXiAgICAjIHRoZSBwYXJlbnQgb2YgdGhlIEhFQUQgY29tbWl0CiskIGdpdCBzaG93IEhFQUReXiAgICMgdGhlIGdyYW5kcGFyZW50CiskIGdpdCBzaG93IEhFQUR+NCAgICMgdGhlIGdyZWF0LWdyZWF0LWdyYW5kcGFyZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlY2FsbCB0aGF0IG1lcmdlIGNvbW1pdHMgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBwYXJlbnQ7IGJ5IGRlZmF1bHQsCiteIGFuZCB+IGZvbGxvdyB0aGUgZmlyc3QgcGFyZW50IGxpc3RlZCBpbiB0aGUgY29tbWl0LCBidXQgeW91IGNhbgorYWxzbyBjaG9vc2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBRF4xICAgIyBzaG93IHRoZSBmaXJzdCBwYXJlbnQgb2YgSEVBRAorJCBnaXQgc2hvdyBIRUFEXjIgICAjIHNob3cgdGhlIHNlY29uZCBwYXJlbnQgb2YgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBhZGRpdGlvbiB0byBIRUFELCB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBzcGVjaWFsIG5hbWVzIGZvcgorY29tbWl0czoKKworTWVyZ2VzICh0byBiZSBkaXNjdXNzZWQgbGF0ZXIpLCBhcyB3ZWxsIGFzIG9wZXJhdGlvbnMgc3VjaCBhcworZ2l0LXJlc2V0LCB3aGljaCBjaGFuZ2UgdGhlIGN1cnJlbnRseSBjaGVja2VkLW91dCBjb21taXQsIGdlbmVyYWxseQorc2V0IE9SSUdfSEVBRCB0byB0aGUgdmFsdWUgSEVBRCBoYWQgYmVmb3JlIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KKworVGhlIGdpdC1mZXRjaCBvcGVyYXRpb24gYWx3YXlzIHN0b3JlcyB0aGUgaGVhZCBvZiB0aGUgbGFzdCBmZXRjaGVkCiticmFuY2ggaW4gRkVUQ0hfSEVBRC4gIEZvciBleGFtcGxlLCBpZiB5b3UgcnVuIGdpdCBmZXRjaCB3aXRob3V0CitzcGVjaWZ5aW5nIGEgbG9jYWwgYnJhbmNoIGFzIHRoZSB0YXJnZXQgb2YgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qLmdpdCB0aGVpcmJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGUgZmV0Y2hlZCBjb21taXRzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGZyb20gRkVUQ0hfSEVBRC4KKworV2hlbiB3ZSBkaXNjdXNzIG1lcmdlcyB3ZSdsbCBhbHNvIHNlZSB0aGUgc3BlY2lhbCBuYW1lIE1FUkdFX0hFQUQsCit3aGljaCByZWZlcnMgdG8gdGhlIG90aGVyIGJyYW5jaCB0aGF0IHdlJ3JlIG1lcmdpbmcgaW4gdG8gdGhlIGN1cnJlbnQKK2JyYW5jaC4KKworVGhlIGdpdGxpbms6Z2l0LXJldi1wYXJzZVsxXSBjb21tYW5kIGlzIGEgbG93LWxldmVsIGNvbW1hbmQgdGhhdCBpcworb2NjYXNpb25hbGx5IHVzZWZ1bCBmb3IgdHJhbnNsYXRpbmcgc29tZSBuYW1lIGZvciBhIGNvbW1pdCB0byB0aGUgb2JqZWN0CituYW1lIGZvciB0aGF0IGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2LXBhcnNlIG9yaWdpbgorZTA1ZGIwZmQ0ZjMxZGRlNzAwNWYwNzVhODRmOTZiMzYwZDA1OTg0YgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2NyZWF0aW5nLXRhZ3NdXQorQ3JlYXRpbmcgdGFncworLS0tLS0tLS0tLS0tLQorCitXZSBjYW4gYWxzbyBjcmVhdGUgYSB0YWcgdG8gcmVmZXIgdG8gYSBwYXJ0aWN1bGFyIGNvbW1pdDsgYWZ0ZXIKK3J1bm5pbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIHN0YWJsZS0xIDFiMmUxZDYzZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiB1c2Ugc3RhYmxlLTEgdG8gcmVmZXIgdG8gdGhlIGNvbW1pdCAxYjJlMWQ2M2ZmLgorCitUaGlzIGNyZWF0ZXMgYSAibGlnaHR3ZWlnaHQiIHRhZy4gIElmIHlvdSB3b3VsZCBhbHNvIGxpa2UgdG8gaW5jbHVkZSBhCitjb21tZW50IHdpdGggdGhlIHRhZywgYW5kIHBvc3NpYmx5IHNpZ24gaXQgY3J5cHRvZ3JhcGhpY2FsbHksIHRoZW4geW91CitzaG91bGQgY3JlYXRlIGEgdGFnIG9iamVjdCBpbnN0ZWFkOyBzZWUgdGhlIGdpdGxpbms6Z2l0LXRhZ1sxXSBtYW4gcGFnZQorZm9yIGRldGFpbHMuCisKK1tbYnJvd3NpbmctcmV2aXNpb25zXV0KK0Jyb3dzaW5nIHJldmlzaW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnaXRsaW5rOmdpdC1sb2dbMV0gY29tbWFuZCBjYW4gc2hvdyBsaXN0cyBvZiBjb21taXRzLiAgT24gaXRzCitvd24sIGl0IHNob3dzIGFsbCBjb21taXRzIHJlYWNoYWJsZSBmcm9tIHRoZSBwYXJlbnQgY29tbWl0OyBidXQgeW91CitjYW4gYWxzbyBtYWtlIG1vcmUgc3BlY2lmaWMgcmVxdWVzdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB2Mi41Li4JIyBjb21taXRzIHNpbmNlIChub3QgcmVhY2hhYmxlIGZyb20pIHYyLjUKKyQgZ2l0IGxvZyB0ZXN0Li5tYXN0ZXIJIyBjb21taXRzIHJlYWNoYWJsZSBmcm9tIG1hc3RlciBidXQgbm90IHRlc3QKKyQgZ2l0IGxvZyBtYXN0ZXIuLnRlc3QJIyAuLi5yZWFjaGFibGUgZnJvbSB0ZXN0IGJ1dCBub3QgbWFzdGVyCiskIGdpdCBsb2cgbWFzdGVyLi4udGVzdAkjIC4uLnJlYWNoYWJsZSBmcm9tIGVpdGhlciB0ZXN0IG9yIG1hc3RlciwKKwkJCSMgICAgYnV0IG5vdCBib3RoCiskIGdpdCBsb2cgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iICMgY29tbWl0cyBmcm9tIHRoZSBsYXN0IDIgd2Vla3MKKyQgZ2l0IGxvZyBNYWtlZmlsZSAgICAgICMgY29tbWl0cyB3aGljaCBtb2RpZnkgTWFrZWZpbGUKKyQgZ2l0IGxvZyBmcy8JCSMgLi4uIHdoaWNoIG1vZGlmeSBhbnkgZmlsZSB1bmRlciBmcy8KKyQgZ2l0IGxvZyAtUydmb28oKScJIyBjb21taXRzIHdoaWNoIGFkZCBvciByZW1vdmUgYW55IGZpbGUgZGF0YQorCQkJIyBtYXRjaGluZyB0aGUgc3RyaW5nICdmb28oKScKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kIG9mIGNvdXJzZSB5b3UgY2FuIGNvbWJpbmUgYWxsIG9mIHRoZXNlOyB0aGUgZm9sbG93aW5nIGZpbmRzCitjb21taXRzIHNpbmNlIHYyLjUgd2hpY2ggdG91Y2ggdGhlIE1ha2VmaWxlIG9yIGFueSBmaWxlIHVuZGVyIGZzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgdjIuNS4uIE1ha2VmaWxlIGZzLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gYXNrIGdpdCBsb2cgdG8gc2hvdyBwYXRjaGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgLXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIHRoZSAiLS1wcmV0dHkiIG9wdGlvbiBpbiB0aGUgZ2l0bGluazpnaXQtbG9nWzFdIG1hbiBwYWdlIGZvciBtb3JlCitkaXNwbGF5IG9wdGlvbnMuCisKK05vdGUgdGhhdCBnaXQgbG9nIHN0YXJ0cyB3aXRoIHRoZSBtb3N0IHJlY2VudCBjb21taXQgYW5kIHdvcmtzCitiYWNrd2FyZHMgdGhyb3VnaCB0aGUgcGFyZW50czsgaG93ZXZlciwgc2luY2UgZ2l0IGhpc3RvcnkgY2FuIGNvbnRhaW4KK211bHRpcGxlIGluZGVwZW5kZW50IGxpbmVzIG9mIGRldmVsb3BtZW50LCB0aGUgcGFydGljdWxhciBvcmRlciB0aGF0Citjb21taXRzIGFyZSBsaXN0ZWQgaW4gbWF5IGJlIHNvbWV3aGF0IGFyYml0cmFyeS4KKworW1tnZW5lcmF0aW5nLWRpZmZzXV0KK0dlbmVyYXRpbmcgZGlmZnMKKy0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBnZW5lcmF0ZSBkaWZmcyBiZXR3ZWVuIGFueSB0d28gdmVyc2lvbnMgdXNpbmcKK2dpdGxpbms6Z2l0LWRpZmZbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgbWFzdGVyLi50ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyB3aGF0IHlvdSB3YW50IGluc3RlYWQgaXMgYSBzZXQgb2YgcGF0Y2hlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZm9ybWF0LXBhdGNoIG1hc3Rlci4udGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIGdlbmVyYXRlIGEgZmlsZSB3aXRoIGEgcGF0Y2ggZm9yIGVhY2ggY29tbWl0IHJlYWNoYWJsZSBmcm9tIHRlc3QKK2J1dCBub3QgZnJvbSBtYXN0ZXIuICBOb3RlIHRoYXQgaWYgbWFzdGVyIGFsc28gaGFzIGNvbW1pdHMgd2hpY2ggYXJlCitub3QgcmVhY2hhYmxlIGZyb20gdGVzdCwgdGhlbiB0aGUgY29tYmluZWQgcmVzdWx0IG9mIHRoZXNlIHBhdGNoZXMKK3dpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBkaWZmIHByb2R1Y2VkIGJ5IHRoZSBnaXQtZGlmZiBleGFtcGxlLgorCitbW3ZpZXdpbmctb2xkLWZpbGUtdmVyc2lvbnNdXQorVmlld2luZyBvbGQgZmlsZSB2ZXJzaW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsd2F5cyB2aWV3IGFuIG9sZCB2ZXJzaW9uIG9mIGEgZmlsZSBieSBqdXN0IGNoZWNraW5nIG91dCB0aGUKK2NvcnJlY3QgcmV2aXNpb24gZmlyc3QuICBCdXQgc29tZXRpbWVzIGl0IGlzIG1vcmUgY29udmVuaWVudCB0byBiZQorYWJsZSB0byB2aWV3IGFuIG9sZCB2ZXJzaW9uIG9mIGEgc2luZ2xlIGZpbGUgd2l0aG91dCBjaGVja2luZworYW55dGhpbmcgb3V0OyB0aGlzIGNvbW1hbmQgZG9lcyB0aGF0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IHYyLjU6ZnMvbG9ja3MuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWZvcmUgdGhlIGNvbG9uIG1heSBiZSBhbnl0aGluZyB0aGF0IG5hbWVzIGEgY29tbWl0LCBhbmQgYWZ0ZXIgaXQKK21heSBiZSBhbnkgcGF0aCB0byBhIGZpbGUgdHJhY2tlZCBieSBnaXQuCisKK1tbaGlzdG9yeS1leGFtcGxlc11dCitFeGFtcGxlcworLS0tLS0tLS0KKworW1tjb3VudGluZy1jb21taXRzLW9uLWEtYnJhbmNoXV0KK0NvdW50aW5nIHRoZSBudW1iZXIgb2YgY29tbWl0cyBvbiBhIGJyYW5jaAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1N1cHBvc2UgeW91IHdhbnQgdG8ga25vdyBob3cgbWFueSBjb21taXRzIHlvdSd2ZSBtYWRlIG9uICJteWJyYW5jaCIKK3NpbmNlIGl0IGRpdmVyZ2VkIGZyb20gIm9yaWdpbiI6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLXByZXR0eT1vbmVsaW5lIG9yaWdpbi4ubXlicmFuY2ggfCB3YyAtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IG9mdGVuIHNlZSB0aGlzIHNvcnQgb2YgdGhpbmcgZG9uZSB3aXRoIHRoZQorbG93ZXItbGV2ZWwgY29tbWFuZCBnaXRsaW5rOmdpdC1yZXYtbGlzdFsxXSwgd2hpY2gganVzdCBsaXN0cyB0aGUgU0hBMSdzCitvZiBhbGwgdGhlIGdpdmVuIGNvbW1pdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldi1saXN0IG9yaWdpbi4ubXlicmFuY2ggfCB3YyAtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2NoZWNraW5nLWZvci1lcXVhbC1icmFuY2hlc11dCitDaGVjayB3aGV0aGVyIHR3byBicmFuY2hlcyBwb2ludCBhdCB0aGUgc2FtZSBoaXN0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1N1cHBvc2UgeW91IHdhbnQgdG8gY2hlY2sgd2hldGhlciB0d28gYnJhbmNoZXMgcG9pbnQgYXQgdGhlIHNhbWUgcG9pbnQKK2luIGhpc3RvcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgb3JpZ2luLi5tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCB0ZWxsIHlvdSB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvamVjdCBhcmUgdGhlIHNhbWUgYXQgdGhlCit0d28gYnJhbmNoZXM7IGluIHRoZW9yeSwgaG93ZXZlciwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzYW1lIHByb2plY3QKK2NvbnRlbnRzIGNvdWxkIGhhdmUgYmVlbiBhcnJpdmVkIGF0IGJ5IHR3byBkaWZmZXJlbnQgaGlzdG9yaWNhbAorcm91dGVzLiAgWW91IGNvdWxkIGNvbXBhcmUgdGhlIG9iamVjdCBuYW1lczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2LWxpc3Qgb3JpZ2luCitlMDVkYjBmZDRmMzFkZGU3MDA1ZjA3NWE4NGY5NmIzNjBkMDU5ODRiCiskIGdpdCByZXYtbGlzdCBtYXN0ZXIKK2UwNWRiMGZkNGYzMWRkZTcwMDVmMDc1YTg0Zjk2YjM2MGQwNTk4NGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3IgeW91IGNvdWxkIHJlY2FsbCB0aGF0IHRoZSAuLi4gb3BlcmF0b3Igc2VsZWN0cyBhbGwgY29tbWl0cworY29udGFpbmVkIHJlYWNoYWJsZSBmcm9tIGVpdGhlciBvbmUgcmVmZXJlbmNlIG9yIHRoZSBvdGhlciBidXQgbm90Citib3RoOiBzbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgb3JpZ2luLi4ubWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgcmV0dXJuIG5vIGNvbW1pdHMgd2hlbiB0aGUgdHdvIGJyYW5jaGVzIGFyZSBlcXVhbC4KKworW1tmaW5kaW5nLXRhZ2dlZC1kZXNjZW5kYW50c11dCitGaW5kIGZpcnN0IHRhZ2dlZCB2ZXJzaW9uIGluY2x1ZGluZyBhIGdpdmVuIGZpeAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworU3VwcG9zZSB5b3Uga25vdyB0aGF0IHRoZSBjb21taXQgZTA1ZGIwZmQgZml4ZWQgYSBjZXJ0YWluIHByb2JsZW0uCitZb3UnZCBsaWtlIHRvIGZpbmQgdGhlIGVhcmxpZXN0IHRhZ2dlZCByZWxlYXNlIHRoYXQgY29udGFpbnMgdGhhdAorZml4LgorCitPZiBjb3Vyc2UsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGFuc3dlci0taWYgdGhlIGhpc3RvcnkgYnJhbmNoZWQKK2FmdGVyIGNvbW1pdCBlMDVkYjBmZCwgdGhlbiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSAiZWFybGllc3QiIHRhZ2dlZAorcmVsZWFzZXMuCisKK1lvdSBjb3VsZCBqdXN0IHZpc3VhbGx5IGluc3BlY3QgdGhlIGNvbW1pdHMgc2luY2UgZTA1ZGIwZmQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayBlMDVkYjBmZC4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yIHlvdSBjYW4gdXNlIGdpdGxpbms6Z2l0LW5hbWUtcmV2WzFdLCB3aGljaCB3aWxsIGdpdmUgdGhlIGNvbW1pdCBhCituYW1lIGJhc2VkIG9uIGFueSB0YWcgaXQgZmluZHMgcG9pbnRpbmcgdG8gb25lIG9mIHRoZSBjb21taXQncworZGVzY2VuZGFudHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG5hbWUtcmV2IC0tdGFncyBlMDVkYjBmZAorZTA1ZGIwZmQgdGFncy92MS41LjAtcmMxXjB+MjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGdpdGxpbms6Z2l0LWRlc2NyaWJlWzFdIGNvbW1hbmQgZG9lcyB0aGUgb3Bwb3NpdGUsIG5hbWluZyB0aGUKK3JldmlzaW9uIHVzaW5nIGEgdGFnIG9uIHdoaWNoIHRoZSBnaXZlbiBjb21taXQgaXMgYmFzZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRlc2NyaWJlIGUwNWRiMGZkCit2MS41LjAtcmMwLTI2MC1nZTA1ZGIwZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitidXQgdGhhdCBtYXkgc29tZXRpbWVzIGhlbHAgeW91IGd1ZXNzIHdoaWNoIHRhZ3MgbWlnaHQgY29tZSBhZnRlciB0aGUKK2dpdmVuIGNvbW1pdC4KKworSWYgeW91IGp1c3Qgd2FudCB0byB2ZXJpZnkgd2hldGhlciBhIGdpdmVuIHRhZ2dlZCB2ZXJzaW9uIGNvbnRhaW5zIGEKK2dpdmVuIGNvbW1pdCwgeW91IGNvdWxkIHVzZSBnaXRsaW5rOmdpdC1tZXJnZS1iYXNlWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZS1iYXNlIGUwNWRiMGZkIHYxLjUuMC1yYzEKK2UwNWRiMGZkNGYzMWRkZTcwMDVmMDc1YTg0Zjk2YjM2MGQwNTk4NGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1lcmdlLWJhc2UgY29tbWFuZCBmaW5kcyBhIGNvbW1vbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gY29tbWl0cywKK2FuZCBhbHdheXMgcmV0dXJucyBvbmUgb3IgdGhlIG90aGVyIGluIHRoZSBjYXNlIHdoZXJlIG9uZSBpcyBhCitkZXNjZW5kYW50IG9mIHRoZSBvdGhlcjsgc28gdGhlIGFib3ZlIG91dHB1dCBzaG93cyB0aGF0IGUwNWRiMGZkCithY3R1YWxseSBpcyBhbiBhbmNlc3RvciBvZiB2MS41LjAtcmMxLgorCitBbHRlcm5hdGl2ZWx5LCBub3RlIHRoYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIHYxLjUuMC1yYzEuLmUwNWRiMGZkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgcHJvZHVjZSBlbXB0eSBvdXRwdXQgaWYgYW5kIG9ubHkgaWYgdjEuNS4wLXJjMSBpbmNsdWRlcyBlMDVkYjBmZCwKK2JlY2F1c2UgaXQgb3V0cHV0cyBvbmx5IGNvbW1pdHMgdGhhdCBhcmUgbm90IHJlYWNoYWJsZSBmcm9tIHYxLjUuMC1yYzEuCisKK0FzIHlldCBhbm90aGVyIGFsdGVybmF0aXZlLCB0aGUgZ2l0bGluazpnaXQtc2hvdy1icmFuY2hbMV0gY29tbWFuZCBsaXN0cwordGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gaXRzIGFyZ3VtZW50cyB3aXRoIGEgZGlzcGxheSBvbiB0aGUgbGVmdC1oYW5kCitzaWRlIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGFyZ3VtZW50cyB0aGF0IGNvbW1pdCBpcyByZWFjaGFibGUgZnJvbS4gIFNvLAoreW91IGNhbiBydW4gc29tZXRoaW5nIGxpa2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggZTA1ZGIwZmQgdjEuNS4wLXJjMCB2MS41LjAtcmMxIHYxLjUuMC1yYzIKKyEgW2UwNWRiMGZkXSBGaXggd2FybmluZ3MgaW4gc2hhMV9maWxlLmMgLSB1c2UgQzk5IHByaW50ZiBmb3JtYXQgaWYKK2F2YWlsYWJsZQorICEgW3YxLjUuMC1yYzBdIEdJVCB2MS41LjAgcHJldmlldworICAhIFt2MS41LjAtcmMxXSBHSVQgdjEuNS4wLXJjMQorICAgISBbdjEuNS4wLXJjMl0gR0lUIHYxLjUuMC1yYzIKKy4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuIHNlYXJjaCBmb3IgYSBsaW5lIHRoYXQgbG9va3MgbGlrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrICsrIFtlMDVkYjBmZF0gRml4IHdhcm5pbmdzIGluIHNoYTFfZmlsZS5jIC0gdXNlIEM5OSBwcmludGYgZm9ybWF0IGlmCithdmFpbGFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpY2ggc2hvd3MgdGhhdCBlMDVkYjBmZCBpcyByZWFjaGFibGUgZnJvbSBpdHNlbGYsIGZyb20gdjEuNS4wLXJjMSwgYW5kCitmcm9tIHYxLjUuMC1yYzIsIGJ1dCBub3QgZnJvbSB2MS41LjAtcmMwLgorCitbW3Nob3dpbmctY29tbWl0cy11bmlxdWUtdG8tYS1icmFuY2hdXQorU2hvd2luZyBjb21taXRzIHVuaXF1ZSB0byBhIGdpdmVuIGJyYW5jaAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitTdXBwb3NlIHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBhbGwgdGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gdGhlIGJyYW5jaAoraGVhZCBuYW1lZCAibWFzdGVyIiBidXQgbm90IGZyb20gYW55IG90aGVyIGhlYWQgaW4geW91ciByZXBvc2l0b3J5LgorCitXZSBjYW4gbGlzdCBhbGwgdGhlIGhlYWRzIGluIHRoaXMgcmVwb3NpdG9yeSB3aXRoCitnaXRsaW5rOmdpdC1zaG93LXJlZlsxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1yZWYgLS1oZWFkcworYmY2MjE5NmI1ZTM2M2Q3MzM1M2E5ZGNmMDk0YzU5NTk1ZjMxNTNiNyByZWZzL2hlYWRzL2NvcmUtdHV0b3JpYWwKK2RiNzY4ZDU1MDRjMWJiNDZmNjNlZTlkNmUxNzcyYmQwNDdlMDViZjkgcmVmcy9oZWFkcy9tYWludAorYTA3MTU3YWM2MjRiMjUyNGEwNTlhMzQxNGU5OWY2ZjQ0YmViYzFlNyByZWZzL2hlYWRzL21hc3RlcgorMjRkYmMxODBlYTE0ZGMxYWViZTA5ZjE0YzhlY2YzMjAxMDY5MDYyNyByZWZzL2hlYWRzL3R1dG9yaWFsLTIKKzFlODc0ODZhZTA2NjI2YzJmMzFlYWE2M2QyNmZjMGZkNjQ2YzhhZjIgcmVmcy9oZWFkcy90dXRvcmlhbC1maXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBjYW4gZ2V0IGp1c3QgdGhlIGJyYW5jaC1oZWFkIG5hbWVzLCBhbmQgcmVtb3ZlICJtYXN0ZXIiLCB3aXRoCit0aGUgaGVscCBvZiB0aGUgc3RhbmRhcmQgdXRpbGl0aWVzIGN1dCBhbmQgZ3JlcDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1yZWYgLS1oZWFkcyB8IGN1dCAtZCcgJyAtZjIgfCBncmVwIC12ICdecmVmcy9oZWFkcy9tYXN0ZXInCityZWZzL2hlYWRzL2NvcmUtdHV0b3JpYWwKK3JlZnMvaGVhZHMvbWFpbnQKK3JlZnMvaGVhZHMvdHV0b3JpYWwtMgorcmVmcy9oZWFkcy90dXRvcmlhbC1maXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbmQgdGhlbiB3ZSBjYW4gYXNrIHRvIHNlZSBhbGwgdGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gbWFzdGVyCitidXQgbm90IGZyb20gdGhlc2Ugb3RoZXIgaGVhZHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayBtYXN0ZXIgLS1ub3QgJCggZ2l0IHNob3ctcmVmIC0taGVhZHMgfCBjdXQgLWQnICcgLWYyIHwKKwkJCQlncmVwIC12ICdecmVmcy9oZWFkcy9tYXN0ZXInICkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2J2aW91c2x5LCBlbmRsZXNzIHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlOyBmb3IgZXhhbXBsZSwgdG8gc2VlIGFsbAorY29tbWl0cyByZWFjaGFibGUgZnJvbSBzb21lIGhlYWQgYnV0IG5vdCBmcm9tIGFueSB0YWcgaW4gdGhlIHJlcG9zaXRvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayAkKCBnaXQgc2hvdy1yZWYgLS1oZWFkcyApIC0tbm90ICAkKCBnaXQgc2hvdy1yZWYgLS10YWdzICkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFNlZSBnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV0gZm9yIGV4cGxhbmF0aW9ucyBvZiBjb21taXQtc2VsZWN0aW5nCitzeW50YXggc3VjaCBhcyBgLS1ub3RgLikKKworW1ttYWtpbmctYS1yZWxlYXNlXV0KK0NyZWF0aW5nIGEgY2hhbmdlbG9nIGFuZCB0YXJiYWxsIGZvciBhIHNvZnR3YXJlIHJlbGVhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGdpdGxpbms6Z2l0LWFyY2hpdmVbMV0gY29tbWFuZCBjYW4gY3JlYXRlIGEgdGFyIG9yIHppcCBhcmNoaXZlIGZyb20KK2FueSB2ZXJzaW9uIG9mIGEgcHJvamVjdDsgZm9yIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PXByb2plY3QvIEhFQUQgfCBnemlwID5sYXRlc3QudGFyLmd6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgdXNlIEhFQUQgdG8gcHJvZHVjZSBhIHRhciBhcmNoaXZlIGluIHdoaWNoIGVhY2ggZmlsZW5hbWUgaXMKK3ByZWNlZGVkIGJ5ICJwcm9qZWN0LyIuCisKK0lmIHlvdSdyZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbiBvZiBhIHNvZnR3YXJlIHByb2plY3QsIHlvdSBtYXkgd2FudAordG8gc2ltdWx0YW5lb3VzbHkgbWFrZSBhIGNoYW5nZWxvZyB0byBpbmNsdWRlIGluIHRoZSByZWxlYXNlCithbm5vdW5jZW1lbnQuCisKK0xpbnVzIFRvcnZhbGRzLCBmb3IgZXhhbXBsZSwgbWFrZXMgbmV3IGtlcm5lbCByZWxlYXNlcyBieSB0YWdnaW5nIHRoZW0sCit0aGVuIHJ1bm5pbmc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgcmVsZWFzZS1zY3JpcHQgMi42LjEyIDIuNi4xMy1yYzYgMi42LjEzLXJjNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGVyZSByZWxlYXNlLXNjcmlwdCBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGxvb2tzIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMhL2Jpbi9zaAorc3RhYmxlPSIkMSIKK2xhc3Q9IiQyIgorbmV3PSIkMyIKK2VjaG8gIiMgZ2l0IHRhZyB2JG5ldyIKK2VjaG8gImdpdCBhcmNoaXZlIC0tcHJlZml4PWxpbnV4LSRuZXcvIHYkbmV3IHwgZ3ppcCAtOSA+IC4uL2xpbnV4LSRuZXcudGFyLmd6IgorZWNobyAiZ2l0IGRpZmYgdiRzdGFibGUgdiRuZXcgfCBnemlwIC05ID4gLi4vcGF0Y2gtJG5ldy5neiIKK2VjaG8gImdpdCBsb2cgLS1uby1tZXJnZXMgdiRuZXcgXnYkbGFzdCA+IC4uL0NoYW5nZUxvZy0kbmV3IgorZWNobyAiZ2l0IHNob3J0bG9nIC0tbm8tbWVyZ2VzIHYkbmV3IF52JGxhc3QgPiAuLi9TaG9ydExvZyIKK2VjaG8gImdpdCBkaWZmIC0tc3RhdCAtLXN1bW1hcnkgLU0gdiRsYXN0IHYkbmV3ID4gLi4vZGlmZnN0YXQtJG5ldyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZW4gaGUganVzdCBjdXQtYW5kLXBhc3RlcyB0aGUgb3V0cHV0IGNvbW1hbmRzIGFmdGVyIHZlcmlmeWluZyB0aGF0Cit0aGV5IGxvb2sgT0suCisKK1tbRmluZGluZy1jb21tZW50cy13aXRoLWdpdmVuLWNvbnRlbnRdXQorRmluZGluZyBjb21taXRzIHJlZmVyZW5jaW5nIGEgZmlsZSB3aXRoIGdpdmVuIGNvbnRlbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWVib2R5IGhhbmRzIHlvdSBhIGNvcHkgb2YgYSBmaWxlLCBhbmQgYXNrcyB3aGljaCBjb21taXRzIG1vZGlmaWVkIGEKK2ZpbGUgc3VjaCB0aGF0IGl0IGNvbnRhaW5lZCB0aGUgZ2l2ZW4gY29udGVudCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZQorY29tbWl0LiAgWW91IGNhbiBmaW5kIG91dCB3aXRoIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgIGdpdCBsb2cgLS1yYXcgLXIgLS1hYmJyZXY9NDAgLS1wcmV0dHk9b25lbGluZSAtLSBmaWxlbmFtZSB8CisJZ3JlcCAtQiAxIGBnaXQgaGFzaC1vYmplY3QgZmlsZW5hbWVgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpZ3VyaW5nIG91dCB3aHkgdGhpcyB3b3JrcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSAoYWR2YW5jZWQpCitzdHVkZW50LiAgVGhlIGdpdGxpbms6Z2l0LWxvZ1sxXSwgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdLCBhbmQKK2dpdGxpbms6Z2l0LWhhc2gtb2JqZWN0WzFdIG1hbiBwYWdlcyBtYXkgcHJvdmUgaGVscGZ1bC4KKworW1tEZXZlbG9waW5nLXdpdGgtZ2l0XV0KK0RldmVsb3Bpbmcgd2l0aCBnaXQKKz09PT09PT09PT09PT09PT09PT0KKworW1t0ZWxsaW5nLWdpdC15b3VyLW5hbWVdXQorVGVsbGluZyBnaXQgeW91ciBuYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVmb3JlIGNyZWF0aW5nIGFueSBjb21taXRzLCB5b3Ugc2hvdWxkIGludHJvZHVjZSB5b3Vyc2VsZiB0byBnaXQuICBUaGUKK2Vhc2llc3Qgd2F5IHRvIGRvIHNvIGlzIHRvIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGxpbmVzIGFwcGVhciBpbiBhCitmaWxlIG5hbWVkIC5naXRjb25maWcgaW4geW91ciBob21lIGRpcmVjdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbdXNlcl0KKwluYW1lID0gWW91ciBOYW1lIENvbWVzIEhlcmUKKwllbWFpbCA9IHlvdUB5b3VyZG9tYWluLmV4YW1wbGUuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFNlZSB0aGUgIkNPTkZJR1VSQVRJT04gRklMRSIgc2VjdGlvbiBvZiBnaXRsaW5rOmdpdC1jb25maWdbMV0gZm9yCitkZXRhaWxzIG9uIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuKQorCisKK1tbY3JlYXRpbmctYS1uZXctcmVwb3NpdG9yeV1dCitDcmVhdGluZyBhIG5ldyByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NyZWF0aW5nIGEgbmV3IHJlcG9zaXRvcnkgZnJvbSBzY3JhdGNoIGlzIHZlcnkgZWFzeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciBwcm9qZWN0CiskIGNkIHByb2plY3QKKyQgZ2l0IGluaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmUgc29tZSBpbml0aWFsIGNvbnRlbnQgKHNheSwgYSB0YXJiYWxsKToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0YXIgLXh6dmYgcHJvamVjdC50YXIuZ3oKKyQgY2QgcHJvamVjdAorJCBnaXQgaW5pdAorJCBnaXQgYWRkIC4gIyBpbmNsdWRlIGV2ZXJ5dGhpbmcgYmVsb3cgLi8gaW4gdGhlIGZpcnN0IGNvbW1pdDoKKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2hvdy10by1tYWtlLWEtY29tbWl0XV0KK0hvdyB0byBtYWtlIGEgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGluZyBhIG5ldyBjb21taXQgdGFrZXMgdGhyZWUgc3RlcHM6CisKKwkxLiBNYWtpbmcgc29tZSBjaGFuZ2VzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB1c2luZyB5b3VyCisJICAgZmF2b3JpdGUgZWRpdG9yLgorCTIuIFRlbGxpbmcgZ2l0IGFib3V0IHlvdXIgY2hhbmdlcy4KKwkzLiBDcmVhdGluZyB0aGUgY29tbWl0IHVzaW5nIHRoZSBjb250ZW50IHlvdSB0b2xkIGdpdCBhYm91dAorCSAgIGluIHN0ZXAgMi4KKworSW4gcHJhY3RpY2UsIHlvdSBjYW4gaW50ZXJsZWF2ZSBhbmQgcmVwZWF0IHN0ZXBzIDEgYW5kIDIgYXMgbWFueQordGltZXMgYXMgeW91IHdhbnQ6IGluIG9yZGVyIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB5b3Ugd2FudCBjb21taXR0ZWQKK2F0IHN0ZXAgMywgZ2l0IG1haW50YWlucyBhIHNuYXBzaG90IG9mIHRoZSB0cmVlJ3MgY29udGVudHMgaW4gYQorc3BlY2lhbCBzdGFnaW5nIGFyZWEgY2FsbGVkICJ0aGUgaW5kZXguIgorCitBdCB0aGUgYmVnaW5uaW5nLCB0aGUgY29udGVudCBvZiB0aGUgaW5kZXggd2lsbCBiZSBpZGVudGljYWwgdG8KK3RoYXQgb2YgdGhlIEhFQUQuICBUaGUgY29tbWFuZCAiZ2l0IGRpZmYgLS1jYWNoZWQiLCB3aGljaCBzaG93cwordGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSEVBRCBhbmQgdGhlIGluZGV4LCBzaG91bGQgdGhlcmVmb3JlCitwcm9kdWNlIG5vIG91dHB1dCBhdCB0aGF0IHBvaW50LgorCitNb2RpZnlpbmcgdGhlIGluZGV4IGlzIGVhc3k6CisKK1RvIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCB0aGUgbmV3IGNvbnRlbnRzIG9mIGEgbW9kaWZpZWQgZmlsZSwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYWRkIHRoZSBjb250ZW50cyBvZiBhIG5ldyBmaWxlIHRvIHRoZSBpbmRleCwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gcmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBpbmRleCBhbmQgZnJvbSB0aGUgd29ya2luZyB0cmVlLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBybSBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgZWFjaCBzdGVwIHlvdSBjYW4gdmVyaWZ5IHRoYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAtLWNhY2hlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbHdheXMgc2hvd3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSEVBRCBhbmQgdGhlIGluZGV4IGZpbGUtLXRoaXMKK2lzIHdoYXQgeW91J2QgY29tbWl0IGlmIHlvdSBjcmVhdGVkIHRoZSBjb21taXQgbm93LS1hbmQgdGhhdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Nob3dzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4IGZpbGUuCisKK05vdGUgdGhhdCAiZ2l0IGFkZCIgYWx3YXlzIGFkZHMganVzdCB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhIGZpbGUKK3RvIHRoZSBpbmRleDsgZnVydGhlciBjaGFuZ2VzIHRvIHRoZSBzYW1lIGZpbGUgd2lsbCBiZSBpZ25vcmVkIHVubGVzcworeW91IHJ1biBnaXQtYWRkIG9uIHRoZSBmaWxlIGFnYWluLgorCitXaGVuIHlvdSdyZSByZWFkeSwganVzdCBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBnaXQgd2lsbCBwcm9tcHQgeW91IGZvciBhIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGVuIGNyZWF0ZSB0aGUgbmV3Citjb21taXQuICBDaGVjayB0byBtYWtlIHN1cmUgaXQgbG9va3MgbGlrZSB3aGF0IHlvdSBleHBlY3RlZCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgYSBzcGVjaWFsIHNob3J0Y3V0LAorCQkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBhbnkgZmlsZXMgdGhhdCB5b3UndmUgbW9kaWZpZWQgb3IgcmVtb3ZlZAorYW5kIGNyZWF0ZSBhIGNvbW1pdCwgYWxsIGluIG9uZSBzdGVwLgorCitBIG51bWJlciBvZiBjb21tYW5kcyBhcmUgdXNlZnVsIGZvciBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgeW91J3JlCithYm91dCB0byBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1jYWNoZWQgIyBkaWZmZXJlbmNlIGJldHdlZW4gSEVBRCBhbmQgdGhlIGluZGV4OyB3aGF0CisJCSAgICAjIHdvdWxkIGJlIGNvbW1pdGVkIGlmIHlvdSByYW4gImNvbW1pdCIgbm93LgorJCBnaXQgZGlmZgkgICAgIyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGluZGV4IGZpbGUgYW5kIHlvdXIKKwkJICAgICMgd29ya2luZyBkaXJlY3Rvcnk7IGNoYW5nZXMgdGhhdCB3b3VsZCBub3QKKwkJICAgICMgYmUgaW5jbHVkZWQgaWYgeW91IHJhbiAiY29tbWl0IiBub3cuCiskIGdpdCBkaWZmIEhFQUQJICAgICMgZGlmZmVyZW5jZSBiZXR3ZWVuIEhFQUQgYW5kIHdvcmtpbmcgdHJlZTsgd2hhdAorCQkgICAgIyB3b3VsZCBiZSBjb21taXR0ZWQgaWYgeW91IHJhbiAiY29tbWl0IC1hIiBub3cuCiskIGdpdCBzdGF0dXMJICAgICMgYSBicmllZiBwZXItZmlsZSBzdW1tYXJ5IG9mIHRoZSBhYm92ZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW1tjcmVhdGluZy1nb29kLWNvbW1pdC1tZXNzYWdlc11dCitDcmVhdGluZyBnb29kIGNvbW1pdCBtZXNzYWdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhvdWdoIG5vdCByZXF1aXJlZCwgaXQncyBhIGdvb2QgaWRlYSB0byBiZWdpbiB0aGUgY29tbWl0IG1lc3NhZ2UKK3dpdGggYSBzaW5nbGUgc2hvcnQgKGxlc3MgdGhhbiA1MCBjaGFyYWN0ZXIpIGxpbmUgc3VtbWFyaXppbmcgdGhlCitjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlbiBhIG1vcmUgdGhvcm91Z2gKK2Rlc2NyaXB0aW9uLiAgVG9vbHMgdGhhdCB0dXJuIGNvbW1pdHMgaW50byBlbWFpbCwgZm9yIGV4YW1wbGUsIHVzZQordGhlIGZpcnN0IGxpbmUgb24gdGhlIFN1YmplY3QgbGluZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIGNvbW1pdCBpbiB0aGUKK2JvZHkuCisKK1tbaWdub3JpbmctZmlsZXNdXQorSWdub3JpbmcgZmlsZXMKKy0tLS0tLS0tLS0tLS0tCisKK0EgcHJvamVjdCB3aWxsIG9mdGVuIGdlbmVyYXRlIGZpbGVzIHRoYXQgeW91IGRvICdub3QnIHdhbnQgdG8gdHJhY2sgd2l0aCBnaXQuCitUaGlzIHR5cGljYWxseSBpbmNsdWRlcyBmaWxlcyBnZW5lcmF0ZWQgYnkgYSBidWlsZCBwcm9jZXNzIG9yIHRlbXBvcmFyeQorYmFja3VwIGZpbGVzIG1hZGUgYnkgeW91ciBlZGl0b3IuIE9mIGNvdXJzZSwgJ25vdCcgdHJhY2tpbmcgZmlsZXMgd2l0aCBnaXQKK2lzIGp1c3QgYSBtYXR0ZXIgb2YgJ25vdCcgY2FsbGluZyAiYGdpdCBhZGRgIiBvbiB0aGVtLiBCdXQgaXQgcXVpY2tseSBiZWNvbWVzCithbm5veWluZyB0byBoYXZlIHRoZXNlIHVudHJhY2tlZCBmaWxlcyBseWluZyBhcm91bmQ7IGUuZy4gdGhleSBtYWtlCisiYGdpdCBhZGQgLmAiIGFuZCAiYGdpdCBjb21taXQgLWFgIiBwcmFjdGljYWxseSB1c2VsZXNzLCBhbmQgdGhleSBrZWVwCitzaG93aW5nIHVwIGluIHRoZSBvdXRwdXQgb2YgImBnaXQgc3RhdHVzYCIsIGV0Yy4KKworR2l0IHRoZXJlZm9yZSBwcm92aWRlcyAiZXhjbHVkZSBwYXR0ZXJucyIgZm9yIHRlbGxpbmcgZ2l0IHdoaWNoIGZpbGVzIHRvCithY3RpdmVseSBpZ25vcmUuIEV4Y2x1ZGUgcGF0dGVybnMgYXJlIHRob3JvdWdobHkgZXhwbGFpbmVkIGluIHRoZQorZ2l0bGluazpnaXRpZ25vcmVbNV0gbWFudWFsIHBhZ2UsIGJ1dCB0aGUgaGVhcnQgb2YgdGhlIGNvbmNlcHQgaXMgc2ltcGx5CithIGxpc3Qgb2YgZmlsZXMgd2hpY2ggZ2l0IHNob3VsZCBpZ25vcmUuIEVudHJpZXMgaW4gdGhlIGxpc3QgbWF5IGNvbnRhaW4KK2dsb2JzIHRvIHNwZWNpZnkgbXVsdGlwbGUgZmlsZXMsIG9yIG1heSBiZSBwcmVmaXhlZCBieSAiYCFgIiB0bworZXhwbGljaXRseSBpbmNsdWRlICh1bi1pZ25vcmUpIGEgcHJldmlvdXNseSBleGNsdWRlZCAoaWdub3JlZCkgZmlsZQorKGkuZS4gbGF0ZXIgZXhjbHVkZSBwYXR0ZXJucyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpLiAgVGhlIGZvbGxvd2luZworZXhhbXBsZSBzaG91bGQgaWxsdXN0cmF0ZSBzdWNoIHBhdHRlcm5zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBjb25zaWRlcmVkIGNvbW1lbnRzLgorIyBJZ25vcmUgZm9vLnR4dC4KK2Zvby50eHQKKyMgSWdub3JlIChnZW5lcmF0ZWQpIGh0bWwgZmlsZXMsCisqLmh0bWwKKyMgZXhjZXB0IGZvby5odG1sIHdoaWNoIGlzIG1haW50YWluZWQgYnkgaGFuZC4KKyFmb28uaHRtbAorIyBJZ25vcmUgb2JqZWN0cyBhbmQgYXJjaGl2ZXMuCisqLltvYV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG5leHQgcXVlc3Rpb24gaXMgd2hlcmUgdG8gcHV0IHRoZXNlIGV4Y2x1ZGUgcGF0dGVybnMgc28gdGhhdCBnaXQgY2FuCitmaW5kIHRoZW0uIEdpdCBsb29rcyBmb3IgZXhjbHVkZSBwYXR0ZXJucyBpbiB0aGUgZm9sbG93aW5nIGZpbGVzOgorCitgLmdpdGlnbm9yZWAgZmlsZXMgaW4geW91ciB3b3JraW5nIHRyZWU6OjoKKwkgICBZb3UgbWF5IHN0b3JlIG11bHRpcGxlIGAuZ2l0aWdub3JlYCBmaWxlcyBhdCB2YXJpb3VzIGxvY2F0aW9ucyBpbiB5b3VyCisJICAgd29ya2luZyB0cmVlLiBFYWNoIGAuZ2l0aWdub3JlYCBmaWxlIGlzIGFwcGxpZWQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZQorCSAgIGl0J3MgbG9jYXRlZCwgaW5jbHVkaW5nIGl0cyBzdWJkaXJlY3Rvcmllcy4gRnVydGhlcm1vcmUsIHRoZQorCSAgIGAuZ2l0aWdub3JlYCBmaWxlcyBjYW4gYmUgdHJhY2tlZCBsaWtlIGFueSBvdGhlciBmaWxlcyBpbiB5b3VyIHdvcmtpbmcKKwkgICB0cmVlOyBqdXN0IGRvIGEgImBnaXQgYWRkIC5naXRpZ25vcmVgIiBhbmQgY29tbWl0LiBgLmdpdGlnbm9yZWAgaXMKKwkgICB0aGVyZWZvcmUgdGhlIHJpZ2h0IHBsYWNlIHRvIHB1dCBleGNsdWRlIHBhdHRlcm5zIHRoYXQgYXJlIG1lYW50IHRvCisJICAgYmUgc2hhcmVkIGJldHdlZW4gYWxsIHByb2plY3QgcGFydGljaXBhbnRzLCBzdWNoIGFzIGJ1aWxkIG91dHB1dCBmaWxlcworCSAgIChlLmcuIGBcKi5vYCksIGV0Yy4KK2AuZ2l0L2luZm8vZXhjbHVkZWAgaW4geW91ciByZXBvOjo6CisJICAgRXhjbHVkZSBwYXR0ZXJucyBpbiB0aGlzIGZpbGUgYXJlIGFwcGxpZWQgdG8gdGhlIHdvcmtpbmcgdHJlZSBhcyBhCisJICAgd2hvbGUuIFNpbmNlIHRoZSBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHlvdXIgd29ya2luZyB0cmVlLCBpdCBkb2VzCisJICAgbm90IGZvbGxvdyBwdXNoL3B1bGwvY2xvbmUgbGlrZSBgLmdpdGlnbm9yZWAgY2FuIGRvLiBUaGlzIGlzIHRoZXJlZm9yZQorCSAgIHRoZSBwbGFjZSB0byBwdXQgZXhjbHVkZSBwYXR0ZXJucyB0aGF0IGFyZSBsb2NhbCB0byB5b3VyIGNvcHkgb2YgdGhlCisJICAgcmVwbyAoaS5lLiAnbm90JyBzaGFyZWQgYmV0d2VlbiBwcm9qZWN0IHBhcnRpY2lwYW50cyksIHN1Y2ggYXMKKwkgICB0ZW1wb3JhcnkgYmFja3VwIGZpbGVzIG1hZGUgYnkgeW91ciBlZGl0b3IgKGUuZy4gYFwqfmApLCBldGMuCitUaGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIGBjb3JlLmV4Y2x1ZGVzZmlsZWAgY29uZmlnIGRpcmVjdGl2ZTo6OgorCSAgIEJ5IHNldHRpbmcgdGhlIGBjb3JlLmV4Y2x1ZGVzZmlsZWAgY29uZmlnIGRpcmVjdGl2ZSB5b3UgY2FuIHRlbGwgZ2l0CisJICAgd2hlcmUgdG8gZmluZCBtb3JlIGV4Y2x1ZGUgcGF0dGVybnMgKHNlZSBnaXRsaW5rOmdpdC1jb25maWdbMV0gZm9yCisJICAgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMpLiBUaGlzIGNvbmZpZyBkaXJlY3RpdmUKKwkgICBjYW4gYmUgc2V0IGluIHRoZSBwZXItcmVwbyBgLmdpdC9jb25maWdgIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlCisJICAgZXhjbHVkZSBwYXR0ZXJucyB3aWxsIGFwcGx5IHRvIHRoYXQgcmVwbyBvbmx5LiBBbHRlcm5hdGl2ZWx5LCB5b3UKKwkgICBjYW4gc2V0IHRoZSBkaXJlY3RpdmUgaW4gdGhlIGdsb2JhbCBgfi8uZ2l0Y29uZmlnYCBmaWxlIHRvIGFwcGx5CisJICAgdGhlIGV4Y2x1ZGUgcGF0dGVybiB0byBhbGwgeW91ciBnaXQgcmVwb3MuIEFzIHdpdGggdGhlIGFib3ZlCisJICAgYC5naXQvaW5mby9leGNsdWRlYCAoYW5kLCBpbmRlZWQsIHdpdGggZ2l0IGNvbmZpZyBkaXJlY3RpdmVzIGluCisJICAgZ2VuZXJhbCksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90IGZvbGxvdyBwdXNoL3B1bGwvY2xvbmUsIGJ1dCByZW1haW4KKwkgICBsb2NhbCB0byB5b3VyIHJlcG8ocykuCisKK1tOT1RFXQorSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGFsdGVybmF0aXZlcywgdGhlcmUgYXJlIGdpdCBjb21tYW5kcyB0aGF0IGNhbiB0YWtlCitleGNsdWRlIHBhdHRlcm5zIGRpcmVjdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuIFNlZSBnaXRsaW5rOmdpdC1scy1maWxlc1sxXQorZm9yIGFuIGV4YW1wbGUgb2YgdGhpcy4KKworW1tob3ctdG8tbWVyZ2VdXQorSG93IHRvIG1lcmdlCistLS0tLS0tLS0tLS0KKworWW91IGNhbiByZWpvaW4gdHdvIGRpdmVyZ2luZyBicmFuY2hlcyBvZiBkZXZlbG9wbWVudCB1c2luZworZ2l0bGluazpnaXQtbWVyZ2VbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGJyYW5jaG5hbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbWVyZ2VzIHRoZSBkZXZlbG9wbWVudCBpbiB0aGUgYnJhbmNoICJicmFuY2huYW1lIiBpbnRvIHRoZSBjdXJyZW50CiticmFuY2guICBJZiB0aGVyZSBhcmUgY29uZmxpY3RzLS1mb3IgZXhhbXBsZSwgaWYgdGhlIHNhbWUgZmlsZSBpcworbW9kaWZpZWQgaW4gdHdvIGRpZmZlcmVudCB3YXlzIGluIHRoZSByZW1vdGUgYnJhbmNoIGFuZCB0aGUgbG9jYWwKK2JyYW5jaC0tdGhlbiB5b3UgYXJlIHdhcm5lZDsgdGhlIG91dHB1dCBtYXkgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSBuZXh0CisgMTAwJSAoNC80KSBkb25lCitBdXRvLW1lcmdlZCBmaWxlLnR4dAorQ09ORkxJQ1QgKGNvbnRlbnQpOiBNZXJnZSBjb25mbGljdCBpbiBmaWxlLnR4dAorQXV0b21hdGljIG1lcmdlIGZhaWxlZDsgZml4IGNvbmZsaWN0cyBhbmQgdGhlbiBjb21taXQgdGhlIHJlc3VsdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29uZmxpY3QgbWFya2VycyBhcmUgbGVmdCBpbiB0aGUgcHJvYmxlbWF0aWMgZmlsZXMsIGFuZCBhZnRlcgoreW91IHJlc29sdmUgdGhlIGNvbmZsaWN0cyBtYW51YWxseSwgeW91IGNhbiB1cGRhdGUgdGhlIGluZGV4Cit3aXRoIHRoZSBjb250ZW50cyBhbmQgcnVuIGdpdCBjb21taXQsIGFzIHlvdSBub3JtYWxseSB3b3VsZCB3aGVuCitjcmVhdGluZyBhIG5ldyBmaWxlLgorCitJZiB5b3UgZXhhbWluZSB0aGUgcmVzdWx0aW5nIGNvbW1pdCB1c2luZyBnaXRrLCB5b3Ugd2lsbCBzZWUgdGhhdCBpdAoraGFzIHR3byBwYXJlbnRzLCBvbmUgcG9pbnRpbmcgdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBicmFuY2gsIGFuZAorb25lIHRvIHRoZSB0b3Agb2YgdGhlIG90aGVyIGJyYW5jaC4KKworW1tyZXNvbHZpbmctYS1tZXJnZV1dCitSZXNvbHZpbmcgYSBtZXJnZQorLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBhIG1lcmdlIGlzbid0IHJlc29sdmVkIGF1dG9tYXRpY2FsbHksIGdpdCBsZWF2ZXMgdGhlIGluZGV4IGFuZAordGhlIHdvcmtpbmcgdHJlZSBpbiBhIHNwZWNpYWwgc3RhdGUgdGhhdCBnaXZlcyB5b3UgYWxsIHRoZQoraW5mb3JtYXRpb24geW91IG5lZWQgdG8gaGVscCByZXNvbHZlIHRoZSBtZXJnZS4KKworRmlsZXMgd2l0aCBjb25mbGljdHMgYXJlIG1hcmtlZCBzcGVjaWFsbHkgaW4gdGhlIGluZGV4LCBzbyB1bnRpbCB5b3UKK3Jlc29sdmUgdGhlIHByb2JsZW0gYW5kIHVwZGF0ZSB0aGUgaW5kZXgsIGdpdGxpbms6Z2l0LWNvbW1pdFsxXSB3aWxsCitmYWlsOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKK2ZpbGUudHh0OiBuZWVkcyBtZXJnZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHNvLCBnaXRsaW5rOmdpdC1zdGF0dXNbMV0gd2lsbCBsaXN0IHRob3NlIGZpbGVzIGFzICJ1bm1lcmdlZCIsIGFuZCB0aGUKK2ZpbGVzIHdpdGggY29uZmxpY3RzIHdpbGwgaGF2ZSBjb25mbGljdCBtYXJrZXJzIGFkZGVkLCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzw8PDw8PDwgSEVBRDpmaWxlLnR4dAorSGVsbG8gd29ybGQKKz09PT09PT0KK0dvb2RieWUKKz4+Pj4+Pj4gNzc5NzZkYTM1YTExZGI0NTgwYjgwYWUyN2U4ZDY1Y2FmNTIwODA4NjpmaWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgeW91IG5lZWQgdG8gZG8gaXMgZWRpdCB0aGUgZmlsZXMgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzLCBhbmQgdGhlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBhZGQgZmlsZS50eHQKKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhlIGNvbW1pdCBtZXNzYWdlIHdpbGwgYWxyZWFkeSBiZSBmaWxsZWQgaW4gZm9yIHlvdSB3aXRoCitzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXJnZS4gIE5vcm1hbGx5IHlvdSBjYW4ganVzdCB1c2UgdGhpcworZGVmYXVsdCBtZXNzYWdlIHVuY2hhbmdlZCwgYnV0IHlvdSBtYXkgYWRkIGFkZGl0aW9uYWwgY29tbWVudGFyeSBvZgoreW91ciBvd24gaWYgZGVzaXJlZC4KKworVGhlIGFib3ZlIGlzIGFsbCB5b3UgbmVlZCB0byBrbm93IHRvIHJlc29sdmUgYSBzaW1wbGUgbWVyZ2UuICBCdXQgZ2l0CithbHNvIHByb3ZpZGVzIG1vcmUgaW5mb3JtYXRpb24gdG8gaGVscCByZXNvbHZlIGNvbmZsaWN0czoKKworW1tjb25mbGljdC1yZXNvbHV0aW9uXV0KK0dldHRpbmcgY29uZmxpY3QtcmVzb2x1dGlvbiBoZWxwIGR1cmluZyBhIG1lcmdlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbGwgb2YgdGhlIGNoYW5nZXMgdGhhdCBnaXQgd2FzIGFibGUgdG8gbWVyZ2UgYXV0b21hdGljYWxseSBhcmUKK2FscmVhZHkgYWRkZWQgdG8gdGhlIGluZGV4IGZpbGUsIHNvIGdpdGxpbms6Z2l0LWRpZmZbMV0gc2hvd3Mgb25seQordGhlIGNvbmZsaWN0cy4gIEl0IHVzZXMgYW4gdW51c3VhbCBzeW50YXg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYKK2RpZmYgLS1jYyBmaWxlLnR4dAoraW5kZXggODAyOTkyYywyYjYwMjA3Li4wMDAwMDAwCistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAQCAtMSwxIC0xLDEgKzEsNSBAQEAKKysrPDw8PDw8PCBIRUFEOmZpbGUudHh0CisgK0hlbGxvIHdvcmxkCisrKz09PT09PT0KKysgR29vZGJ5ZQorKys+Pj4+Pj4+IDc3OTc2ZGEzNWExMWRiNDU4MGI4MGFlMjdlOGQ2NWNhZjUyMDgwODY6ZmlsZS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVjYWxsIHRoYXQgdGhlIGNvbW1pdCB3aGljaCB3aWxsIGJlIGNvbW1pdGVkIGFmdGVyIHdlIHJlc29sdmUgdGhpcworY29uZmxpY3Qgd2lsbCBoYXZlIHR3byBwYXJlbnRzIGluc3RlYWQgb2YgdGhlIHVzdWFsIG9uZTogb25lIHBhcmVudAord2lsbCBiZSBIRUFELCB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaDsgdGhlIG90aGVyIHdpbGwgYmUgdGhlCit0aXAgb2YgdGhlIG90aGVyIGJyYW5jaCwgd2hpY2ggaXMgc3RvcmVkIHRlbXBvcmFyaWx5IGluIE1FUkdFX0hFQUQuCisKK0R1cmluZyB0aGUgbWVyZ2UsIHRoZSBpbmRleCBob2xkcyB0aHJlZSB2ZXJzaW9ucyBvZiBlYWNoIGZpbGUuICBFYWNoIG9mCit0aGVzZSB0aHJlZSAiZmlsZSBzdGFnZXMiIHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyA6MTpmaWxlLnR4dAkjIHRoZSBmaWxlIGluIGEgY29tbW9uIGFuY2VzdG9yIG9mIGJvdGggYnJhbmNoZXMKKyQgZ2l0IHNob3cgOjI6ZmlsZS50eHQJIyB0aGUgdmVyc2lvbiBmcm9tIEhFQUQsIGJ1dCBpbmNsdWRpbmcgYW55CisJCQkjIG5vbmNvbmZsaWN0aW5nIGNoYW5nZXMgZnJvbSBNRVJHRV9IRUFECiskIGdpdCBzaG93IDozOmZpbGUudHh0CSMgdGhlIHZlcnNpb24gZnJvbSBNRVJHRV9IRUFELCBidXQgaW5jbHVkaW5nIGFueQorCQkJIyBub25jb25mbGljdGluZyBjaGFuZ2VzIGZyb20gSEVBRC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2luY2UgdGhlIHN0YWdlIDIgYW5kIHN0YWdlIDMgdmVyc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCB3aXRoCitub25jb25mbGljdGluZyBjaGFuZ2VzLCB0aGUgb25seSByZW1haW5pbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtIGFyZQordGhlIGltcG9ydGFudCBvbmVzOyB0aHVzIGdpdGxpbms6Z2l0LWRpZmZbMV0gY2FuIHVzZSB0aGUgaW5mb3JtYXRpb24gaW4KK3RoZSBpbmRleCB0byBzaG93IG9ubHkgdGhvc2UgY29uZmxpY3RzLgorCitUaGUgZGlmZiBhYm92ZSBzaG93cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgd29ya2luZy10cmVlIHZlcnNpb24gb2YKK2ZpbGUudHh0IGFuZCB0aGUgc3RhZ2UgMiBhbmQgc3RhZ2UgMyB2ZXJzaW9ucy4gIFNvIGluc3RlYWQgb2YgcHJlY2VkaW5nCitlYWNoIGxpbmUgYnkgYSBzaW5nbGUgIisiIG9yICItIiwgaXQgbm93IHVzZXMgdHdvIGNvbHVtbnM6IHRoZSBmaXJzdAorY29sdW1uIGlzIHVzZWQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGZpcnN0IHBhcmVudCBhbmQgdGhlIHdvcmtpbmcKK2RpcmVjdG9yeSBjb3B5LCBhbmQgdGhlIHNlY29uZCBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2Vjb25kIHBhcmVudAorYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjb3B5LiAgKFNlZSB0aGUgIkNPTUJJTkVEIERJRkYgRk9STUFUIiBzZWN0aW9uCitvZiBnaXRsaW5rOmdpdC1kaWZmLWZpbGVzWzFdIGZvciBhIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4pCisKK0FmdGVyIHJlc29sdmluZyB0aGUgY29uZmxpY3QgaW4gdGhlIG9idmlvdXMgd2F5IChidXQgYmVmb3JlIHVwZGF0aW5nIHRoZQoraW5kZXgpLCB0aGUgZGlmZiB3aWxsIGxvb2sgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorZGlmZiAtLWNjIGZpbGUudHh0CitpbmRleCA4MDI5OTJjLDJiNjAyMDcuLjAwMDAwMDAKKy0tLSBhL2ZpbGUudHh0CisrKysgYi9maWxlLnR4dAorQEBAIC0xLDEgLTEsMSArMSwxIEBAQAorLSBIZWxsbyB3b3JsZAorIC1Hb29kYnllCisrK0dvb2RieWUgd29ybGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzaG93cyB0aGF0IG91ciByZXNvbHZlZCB2ZXJzaW9uIGRlbGV0ZWQgIkhlbGxvIHdvcmxkIiBmcm9tIHRoZQorZmlyc3QgcGFyZW50LCBkZWxldGVkICJHb29kYnllIiBmcm9tIHRoZSBzZWNvbmQgcGFyZW50LCBhbmQgYWRkZWQKKyJHb29kYnllIHdvcmxkIiwgd2hpY2ggd2FzIHByZXZpb3VzbHkgYWJzZW50IGZyb20gYm90aC4KKworU29tZSBzcGVjaWFsIGRpZmYgb3B0aW9ucyBhbGxvdyBkaWZmaW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhZ2FpbnN0Cithbnkgb2YgdGhlc2Ugc3RhZ2VzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIC0xIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAxCiskIGdpdCBkaWZmIC0tYmFzZSBmaWxlLnR4dAkjIHNhbWUgYXMgdGhlIGFib3ZlCiskIGdpdCBkaWZmIC0yIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAyCiskIGdpdCBkaWZmIC0tb3VycyBmaWxlLnR4dAkjIHNhbWUgYXMgdGhlIGFib3ZlCiskIGdpdCBkaWZmIC0zIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAzCiskIGdpdCBkaWZmIC0tdGhlaXJzIGZpbGUudHh0CSMgc2FtZSBhcyB0aGUgYWJvdmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnaXRsaW5rOmdpdC1sb2dbMV0gYW5kIGdpdGtbMV0gY29tbWFuZHMgYWxzbyBwcm92aWRlIHNwZWNpYWwgaGVscAorZm9yIG1lcmdlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC0tbWVyZ2UKKyQgZ2l0ayAtLW1lcmdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIHdpbGwgZGlzcGxheSBhbGwgY29tbWl0cyB3aGljaCBleGlzdCBvbmx5IG9uIEhFQUQgb3Igb24KK01FUkdFX0hFQUQsIGFuZCB3aGljaCB0b3VjaCBhbiB1bm1lcmdlZCBmaWxlLgorCitZb3UgbWF5IGFsc28gdXNlIGdpdGxpbms6Z2l0LW1lcmdldG9vbFsxXSwgd2hpY2ggbGV0cyB5b3UgbWVyZ2UgdGhlCit1bm1lcmdlZCBmaWxlcyB1c2luZyBleHRlcm5hbCB0b29scyBzdWNoIGFzIGVtYWNzIG9yIGtkaWZmMy4KKworRWFjaCB0aW1lIHlvdSByZXNvbHZlIHRoZSBjb25mbGljdHMgaW4gYSBmaWxlIGFuZCB1cGRhdGUgdGhlIGluZGV4OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBhZGQgZmlsZS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIGRpZmZlcmVudCBzdGFnZXMgb2YgdGhhdCBmaWxlIHdpbGwgYmUgImNvbGxhcHNlZCIsIGFmdGVyIHdoaWNoCitnaXQtZGlmZiB3aWxsIChieSBkZWZhdWx0KSBubyBsb25nZXIgc2hvdyBkaWZmcyBmb3IgdGhhdCBmaWxlLgorCitbW3VuZG9pbmctYS1tZXJnZV1dCitVbmRvaW5nIGEgbWVyZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgZ2V0IHN0dWNrIGFuZCBkZWNpZGUgdG8ganVzdCBnaXZlIHVwIGFuZCB0aHJvdyB0aGUgd2hvbGUgbWVzcworYXdheSwgeW91IGNhbiBhbHdheXMgcmV0dXJuIHRvIHRoZSBwcmUtbWVyZ2Ugc3RhdGUgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPciwgaWYgeW91J3ZlIGFscmVhZHkgY29tbWl0ZWQgdGhlIG1lcmdlIHRoYXQgeW91IHdhbnQgdG8gdGhyb3cgYXdheSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQgLS1oYXJkIE9SSUdfSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIb3dldmVyLCB0aGlzIGxhc3QgY29tbWFuZCBjYW4gYmUgZGFuZ2Vyb3VzIGluIHNvbWUgY2FzZXMtLW5ldmVyCit0aHJvdyBhd2F5IGEgY29tbWl0IHlvdSBoYXZlIGFscmVhZHkgY29tbWl0dGVkIGlmIHRoYXQgY29tbWl0IG1heQoraXRzZWxmIGhhdmUgYmVlbiBtZXJnZWQgaW50byBhbm90aGVyIGJyYW5jaCwgYXMgZG9pbmcgc28gbWF5IGNvbmZ1c2UKK2Z1cnRoZXIgbWVyZ2VzLgorCitbW2Zhc3QtZm9yd2FyZHNdXQorRmFzdC1mb3J3YXJkIG1lcmdlcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBpcyBvbmUgc3BlY2lhbCBjYXNlIG5vdCBtZW50aW9uZWQgYWJvdmUsIHdoaWNoIGlzIHRyZWF0ZWQKK2RpZmZlcmVudGx5LiAgTm9ybWFsbHksIGEgbWVyZ2UgcmVzdWx0cyBpbiBhIG1lcmdlIGNvbW1pdCwgd2l0aCB0d28KK3BhcmVudHMsIG9uZSBwb2ludGluZyBhdCBlYWNoIG9mIHRoZSB0d28gbGluZXMgb2YgZGV2ZWxvcG1lbnQgdGhhdAord2VyZSBtZXJnZWQuCisKK0hvd2V2ZXIsIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIG90aGVyLS1zbyBldmVyeQorY29tbWl0IHByZXNlbnQgaW4gdGhlIG9uZSBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgb3RoZXItLXRoZW4gZ2l0CitqdXN0IHBlcmZvcm1zIGEgImZhc3QgZm9yd2FyZCI7IHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBtb3ZlZAorZm9yd2FyZCB0byBwb2ludCBhdCB0aGUgaGVhZCBvZiB0aGUgbWVyZ2VkLWluIGJyYW5jaCwgd2l0aG91dCBhbnkgbmV3Citjb21taXRzIGJlaW5nIGNyZWF0ZWQuCisKK1tbZml4aW5nLW1pc3Rha2VzXV0KK0ZpeGluZyBtaXN0YWtlcworLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSd2ZSBtZXNzZWQgdXAgdGhlIHdvcmtpbmcgdHJlZSwgYnV0IGhhdmVuJ3QgeWV0IGNvbW1pdHRlZCB5b3VyCittaXN0YWtlLCB5b3UgY2FuIHJldHVybiB0aGUgZW50aXJlIHdvcmtpbmcgdHJlZSB0byB0aGUgbGFzdCBjb21taXR0ZWQKK3N0YXRlIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IG1ha2UgYSBjb21taXQgdGhhdCB5b3UgbGF0ZXIgd2lzaCB5b3UgaGFkbid0LCB0aGVyZSBhcmUgdHdvCitmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB3YXlzIHRvIGZpeCB0aGUgcHJvYmxlbToKKworCTEuIFlvdSBjYW4gY3JlYXRlIGEgbmV3IGNvbW1pdCB0aGF0IHVuZG9lcyB3aGF0ZXZlciB3YXMgZG9uZQorCWJ5IHRoZSBwcmV2aW91cyBjb21taXQuICBUaGlzIGlzIHRoZSBjb3JyZWN0IHRoaW5nIGlmIHlvdXIKKwltaXN0YWtlIGhhcyBhbHJlYWR5IGJlZW4gbWFkZSBwdWJsaWMuCisKKwkyLiBZb3UgY2FuIGdvIGJhY2sgYW5kIG1vZGlmeSB0aGUgb2xkIGNvbW1pdC4gIFlvdSBzaG91bGQKKwluZXZlciBkbyB0aGlzIGlmIHlvdSBoYXZlIGFscmVhZHkgbWFkZSB0aGUgaGlzdG9yeSBwdWJsaWM7CisJZ2l0IGRvZXMgbm90IG5vcm1hbGx5IGV4cGVjdCB0aGUgImhpc3RvcnkiIG9mIGEgcHJvamVjdCB0bworCWNoYW5nZSwgYW5kIGNhbm5vdCBjb3JyZWN0bHkgcGVyZm9ybSByZXBlYXRlZCBtZXJnZXMgZnJvbQorCWEgYnJhbmNoIHRoYXQgaGFzIGhhZCBpdHMgaGlzdG9yeSBjaGFuZ2VkLgorCitbW3JldmVydGluZy1hLWNvbW1pdF1dCitGaXhpbmcgYSBtaXN0YWtlIHdpdGggYSBuZXcgY29tbWl0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0NyZWF0aW5nIGEgbmV3IGNvbW1pdCB0aGF0IHJldmVydHMgYW4gZWFybGllciBjaGFuZ2UgaXMgdmVyeSBlYXN5OworanVzdCBwYXNzIHRoZSBnaXRsaW5rOmdpdC1yZXZlcnRbMV0gY29tbWFuZCBhIHJlZmVyZW5jZSB0byB0aGUgYmFkCitjb21taXQ7IGZvciBleGFtcGxlLCB0byByZXZlcnQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2ZXJ0IEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBjb21taXQgd2hpY2ggdW5kb2VzIHRoZSBjaGFuZ2UgaW4gSEVBRC4gIFlvdQord2lsbCBiZSBnaXZlbiBhIGNoYW5jZSB0byBlZGl0IHRoZSBjb21taXQgbWVzc2FnZSBmb3IgdGhlIG5ldyBjb21taXQuCisKK1lvdSBjYW4gYWxzbyByZXZlcnQgYW4gZWFybGllciBjaGFuZ2UsIGZvciBleGFtcGxlLCB0aGUgbmV4dC10by1sYXN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXZlcnQgSEVBRF4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhpcyBjYXNlIGdpdCB3aWxsIGF0dGVtcHQgdG8gdW5kbyB0aGUgb2xkIGNoYW5nZSB3aGlsZSBsZWF2aW5nCitpbnRhY3QgYW55IGNoYW5nZXMgbWFkZSBzaW5jZSB0aGVuLiAgSWYgbW9yZSByZWNlbnQgY2hhbmdlcyBvdmVybGFwCit3aXRoIHRoZSBjaGFuZ2VzIHRvIGJlIHJldmVydGVkLCB0aGVuIHlvdSB3aWxsIGJlIGFza2VkIHRvIGZpeAorY29uZmxpY3RzIG1hbnVhbGx5LCBqdXN0IGFzIGluIHRoZSBjYXNlIG9mIDw8cmVzb2x2aW5nLWEtbWVyZ2UsCityZXNvbHZpbmcgYSBtZXJnZT4+LgorCitbW2ZpeGluZy1hLW1pc3Rha2UtYnktZWRpdGluZy1oaXN0b3J5XV0KK0ZpeGluZyBhIG1pc3Rha2UgYnkgZWRpdGluZyBoaXN0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiB0aGUgcHJvYmxlbWF0aWMgY29tbWl0IGlzIHRoZSBtb3N0IHJlY2VudCBjb21taXQsIGFuZCB5b3UgaGF2ZSBub3QKK3lldCBtYWRlIHRoYXQgY29tbWl0IHB1YmxpYywgdGhlbiB5b3UgbWF5IGp1c3QKKzw8dW5kb2luZy1hLW1lcmdlLGRlc3Ryb3kgaXQgdXNpbmcgZ2l0LXJlc2V0Pj4uCisKK0FsdGVybmF0aXZlbHksIHlvdQorY2FuIGVkaXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB1cGRhdGUgdGhlIGluZGV4IHRvIGZpeCB5b3VyCittaXN0YWtlLCBqdXN0IGFzIGlmIHlvdSB3ZXJlIGdvaW5nIHRvIDw8aG93LXRvLW1ha2UtYS1jb21taXQsY3JlYXRlIGEKK25ldyBjb21taXQ+PiwgdGhlbiBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC0tYW1lbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCByZXBsYWNlIHRoZSBvbGQgY29tbWl0IGJ5IGEgbmV3IGNvbW1pdCBpbmNvcnBvcmF0aW5nIHlvdXIKK2NoYW5nZXMsIGdpdmluZyB5b3UgYSBjaGFuY2UgdG8gZWRpdCB0aGUgb2xkIGNvbW1pdCBtZXNzYWdlIGZpcnN0LgorCitBZ2FpbiwgeW91IHNob3VsZCBuZXZlciBkbyB0aGlzIHRvIGEgY29tbWl0IHRoYXQgbWF5IGFscmVhZHkgaGF2ZQorYmVlbiBtZXJnZWQgaW50byBhbm90aGVyIGJyYW5jaDsgdXNlIGdpdGxpbms6Z2l0LXJldmVydFsxXSBpbnN0ZWFkIGluCit0aGF0IGNhc2UuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gZWRpdCBjb21taXRzIGZ1cnRoZXIgYmFjayBpbiB0aGUgaGlzdG9yeSwgYnV0Cit0aGlzIGlzIGFuIGFkdmFuY2VkIHRvcGljIHRvIGJlIGxlZnQgZm9yCis8PGNsZWFuaW5nLXVwLWhpc3RvcnksYW5vdGhlciBjaGFwdGVyPj4uCisKK1tbY2hlY2tvdXQtb2YtcGF0aF1dCitDaGVja2luZyBvdXQgYW4gb2xkIHZlcnNpb24gb2YgYSBmaWxlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0luIHRoZSBwcm9jZXNzIG9mIHVuZG9pbmcgYSBwcmV2aW91cyBiYWQgY2hhbmdlLCB5b3UgbWF5IGZpbmQgaXQKK3VzZWZ1bCB0byBjaGVjayBvdXQgYW4gb2xkZXIgdmVyc2lvbiBvZiBhIHBhcnRpY3VsYXIgZmlsZSB1c2luZworZ2l0bGluazpnaXQtY2hlY2tvdXRbMV0uICBXZSd2ZSB1c2VkIGdpdCBjaGVja291dCBiZWZvcmUgdG8gc3dpdGNoCiticmFuY2hlcywgYnV0IGl0IGhhcyBxdWl0ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaWYgaXQgaXMgZ2l2ZW4gYSBwYXRoCituYW1lOiB0aGUgY29tbWFuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBIRUFEXiBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVwbGFjZXMgcGF0aC90by9maWxlIGJ5IHRoZSBjb250ZW50cyBpdCBoYWQgaW4gdGhlIGNvbW1pdCBIRUFEXiwgYW5kCithbHNvIHVwZGF0ZXMgdGhlIGluZGV4IHRvIG1hdGNoLiAgSXQgZG9lcyBub3QgY2hhbmdlIGJyYW5jaGVzLgorCitJZiB5b3UganVzdCB3YW50IHRvIGxvb2sgYXQgYW4gb2xkIHZlcnNpb24gb2YgdGhlIGZpbGUsIHdpdGhvdXQKK21vZGlmeWluZyB0aGUgd29ya2luZyBkaXJlY3RvcnksIHlvdSBjYW4gZG8gdGhhdCB3aXRoCitnaXRsaW5rOmdpdC1zaG93WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReOnBhdGgvdG8vZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGRpc3BsYXkgdGhlIGdpdmVuIHZlcnNpb24gb2YgdGhlIGZpbGUuCisKK1tbZW5zdXJpbmctZ29vZC1wZXJmb3JtYW5jZV1dCitFbnN1cmluZyBnb29kIHBlcmZvcm1hbmNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uIGxhcmdlIHJlcG9zaXRvcmllcywgZ2l0IGRlcGVuZHMgb24gY29tcHJlc3Npb24gdG8ga2VlcCB0aGUgaGlzdG9yeQoraW5mb3JtYXRpb24gZnJvbSB0YWtpbmcgdXAgdG8gbXVjaCBzcGFjZSBvbiBkaXNrIG9yIGluIG1lbW9yeS4KKworVGhpcyBjb21wcmVzc2lvbiBpcyBub3QgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkuICBUaGVyZWZvcmUgeW91CitzaG91bGQgb2NjYXNpb25hbGx5IHJ1biBnaXRsaW5rOmdpdC1nY1sxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZ2MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gcmVjb21wcmVzcyB0aGUgYXJjaGl2ZS4gIFRoaXMgY2FuIGJlIHZlcnkgdGltZS1jb25zdW1pbmcsIHNvCit5b3UgbWF5IHByZWZlciB0byBydW4gZ2l0LWdjIHdoZW4geW91IGFyZSBub3QgZG9pbmcgb3RoZXIgd29yay4KKworCitbW2Vuc3VyaW5nLXJlbGlhYmlsaXR5XV0KK0Vuc3VyaW5nIHJlbGlhYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2NoZWNraW5nLWZvci1jb3JydXB0aW9uXV0KK0NoZWNraW5nIHRoZSByZXBvc2l0b3J5IGZvciBjb3JydXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZ2l0bGluazpnaXQtZnNja1sxXSBjb21tYW5kIHJ1bnMgYSBudW1iZXIgb2Ygc2VsZi1jb25zaXN0ZW5jeSBjaGVja3MKK29uIHRoZSByZXBvc2l0b3J5LCBhbmQgcmVwb3J0cyBvbiBhbnkgcHJvYmxlbXMuICBUaGlzIG1heSB0YWtlIHNvbWUKK3RpbWUuICBUaGUgbW9zdCBjb21tb24gd2FybmluZyBieSBmYXIgaXMgYWJvdXQgImRhbmdsaW5nIiBvYmplY3RzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmc2NrCitkYW5nbGluZyBjb21taXQgNzI4MTI1MWRkZDJhNjFlMzg2NTdjODI3NzM5YzU3MDE1NjcxYTZiMworZGFuZ2xpbmcgY29tbWl0IDI3MDZhMDU5ZjI1OGM2YjI0NWYyOThkYzRmZjJjY2QzMGVjMjFhNjMKK2RhbmdsaW5nIGNvbW1pdCAxMzQ3MmI3YzRiODA4NTFhMWJjNTUxNzc5MTcxZGNiMDM2NTVlOWI1CitkYW5nbGluZyBibG9iIDIxODc2MWY5ZDkwNzEyZDM3YTljNWUzNmY0MDZmOTIyMDJkYjA3ZWIKK2RhbmdsaW5nIGNvbW1pdCBiZjA5MzUzNWEzNGE0ZDM1NzMxYWEyYmQ5MGZlNmIxNzYzMDJmMTRmCitkYW5nbGluZyBjb21taXQgOGU0YmVjN2YyZGRhYTI2OGJlZjk5OTg1M2MyNTc1NTQ1MjEwMGY4ZQorZGFuZ2xpbmcgdHJlZSBkNTBiYjg2MTg2YmYyN2I2ODFkMjVhZjg5ZDNiNWI2ODM4MmU0MDg1CitkYW5nbGluZyB0cmVlIGIyNGMyNDczZjFmZDNkOTEzNTJhNjI0Nzk1YmUwMjZkNjRjODg0MWYKKy4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEYW5nbGluZyBvYmplY3RzIGFyZSBub3QgYSBwcm9ibGVtLiAgQXQgd29yc3QgdGhleSBtYXkgdGFrZSB1cCBhIGxpdHRsZQorZXh0cmEgZGlzayBzcGFjZS4gIFRoZXkgY2FuIHNvbWV0aW1lcyBwcm92aWRlIGEgbGFzdC1yZXNvcnQgbWV0aG9kIGZvcgorcmVjb3ZlcmluZyBsb3N0IHdvcmstLXNlZSA8PGRhbmdsaW5nLW9iamVjdHM+PiBmb3IgZGV0YWlscy4gIEhvd2V2ZXIsIGlmCit5b3Ugd2lzaCwgeW91IGNhbiByZW1vdmUgdGhlbSB3aXRoIGdpdGxpbms6Z2l0LXBydW5lWzFdIG9yIHRoZSAtLXBydW5lCitvcHRpb24gdG8gZ2l0bGluazpnaXQtZ2NbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGdjIC0tcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBtYXkgYmUgdGltZS1jb25zdW1pbmcuICBVbmxpa2UgbW9zdCBvdGhlciBnaXQgb3BlcmF0aW9ucyAoaW5jbHVkaW5nCitnaXQtZ2Mgd2hlbiBydW4gd2l0aG91dCBhbnkgb3B0aW9ucyksIGl0IGlzIG5vdCBzYWZlIHRvIHBydW5lIHdoaWxlCitvdGhlciBnaXQgb3BlcmF0aW9ucyBhcmUgaW4gcHJvZ3Jlc3MgaW4gdGhlIHNhbWUgcmVwb3NpdG9yeS4KKworW1tyZWNvdmVyaW5nLWxvc3QtY2hhbmdlc11dCitSZWNvdmVyaW5nIGxvc3QgY2hhbmdlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW1tyZWZsb2dzXV0KK1JlZmxvZ3MKK15eXl5eXl4KKworU2F5IHlvdSBtb2RpZnkgYSBicmFuY2ggd2l0aCBnaXRsaW5rOmdpdC1yZXNldFsxXSAtLWhhcmQsIGFuZCB0aGVuCityZWFsaXplIHRoYXQgdGhlIGJyYW5jaCB3YXMgdGhlIG9ubHkgcmVmZXJlbmNlIHlvdSBoYWQgdG8gdGhhdCBwb2ludCBpbgoraGlzdG9yeS4KKworRm9ydHVuYXRlbHksIGdpdCBhbHNvIGtlZXBzIGEgbG9nLCBjYWxsZWQgYSAicmVmbG9nIiwgb2YgYWxsIHRoZQorcHJldmlvdXMgdmFsdWVzIG9mIGVhY2ggYnJhbmNoLiAgU28gaW4gdGhpcyBjYXNlIHlvdSBjYW4gc3RpbGwgZmluZCB0aGUKK29sZCBoaXN0b3J5IHVzaW5nLCBmb3IgZXhhbXBsZSwgCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyBtYXN0ZXJAezF9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgbGlzdHMgdGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGhlYWQuCitUaGlzIHN5bnRheCBjYW4gYmUgdXNlZCB0byB3aXRoIGFueSBnaXQgY29tbWFuZCB0aGF0IGFjY2VwdHMgYSBjb21taXQsCitub3QganVzdCB3aXRoIGdpdCBsb2cuICBTb21lIG90aGVyIGV4YW1wbGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IG1hc3RlckB7Mn0JCSMgU2VlIHdoZXJlIHRoZSBicmFuY2ggcG9pbnRlZCAyLAorJCBnaXQgc2hvdyBtYXN0ZXJAezN9CQkjIDMsIC4uLiBjaGFuZ2VzIGFnby4KKyQgZ2l0ayBtYXN0ZXJAe3llc3RlcmRheX0JIyBTZWUgd2hlcmUgaXQgcG9pbnRlZCB5ZXN0ZXJkYXksCiskIGdpdGsgbWFzdGVyQHsiMSB3ZWVrIGFnbyJ9CSMgLi4uIG9yIGxhc3Qgd2VlaworJCBnaXQgbG9nIC0td2Fsay1yZWZsb2dzIG1hc3RlcgkjIHNob3cgcmVmbG9nIGVudHJpZXMgZm9yIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHNlcGFyYXRlIHJlZmxvZyBpcyBrZXB0IGZvciB0aGUgSEVBRCwgc28KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyBIRUFEQHsiMSB3ZWVrIGFnbyJ9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB3aGF0IEhFQUQgcG9pbnRlZCB0byBvbmUgd2VlayBhZ28sIG5vdCB3aGF0IHRoZSBjdXJyZW50IGJyYW5jaAorcG9pbnRlZCB0byBvbmUgd2VlayBhZ28uICBUaGlzIGFsbG93cyB5b3UgdG8gc2VlIHRoZSBoaXN0b3J5IG9mIHdoYXQKK3lvdSd2ZSBjaGVja2VkIG91dC4KKworVGhlIHJlZmxvZ3MgYXJlIGtlcHQgYnkgZGVmYXVsdCBmb3IgMzAgZGF5cywgYWZ0ZXIgd2hpY2ggdGhleSBtYXkgYmUKK3BydW5lZC4gIFNlZSBnaXRsaW5rOmdpdC1yZWZsb2dbMV0gYW5kIGdpdGxpbms6Z2l0LWdjWzFdIHRvIGxlYXJuCitob3cgdG8gY29udHJvbCB0aGlzIHBydW5pbmcsIGFuZCBzZWUgdGhlICJTUEVDSUZZSU5HIFJFVklTSU9OUyIKK3NlY3Rpb24gb2YgZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdIGZvciBkZXRhaWxzLgorCitOb3RlIHRoYXQgdGhlIHJlZmxvZyBoaXN0b3J5IGlzIHZlcnkgZGlmZmVyZW50IGZyb20gbm9ybWFsIGdpdCBoaXN0b3J5LgorV2hpbGUgbm9ybWFsIGhpc3RvcnkgaXMgc2hhcmVkIGJ5IGV2ZXJ5IHJlcG9zaXRvcnkgdGhhdCB3b3JrcyBvbiB0aGUKK3NhbWUgcHJvamVjdCwgdGhlIHJlZmxvZyBoaXN0b3J5IGlzIG5vdCBzaGFyZWQ6IGl0IHRlbGxzIHlvdSBvbmx5IGFib3V0Citob3cgdGhlIGJyYW5jaGVzIGluIHlvdXIgbG9jYWwgcmVwb3NpdG9yeSBoYXZlIGNoYW5nZWQgb3ZlciB0aW1lLgorCitbW2RhbmdsaW5nLW9iamVjdC1yZWNvdmVyeV1dCitFeGFtaW5pbmcgZGFuZ2xpbmcgb2JqZWN0cworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworSW4gc29tZSBzaXR1YXRpb25zIHRoZSByZWZsb2cgbWF5IG5vdCBiZSBhYmxlIHRvIHNhdmUgeW91LiAgRm9yIGV4YW1wbGUsCitzdXBwb3NlIHlvdSBkZWxldGUgYSBicmFuY2gsIHRoZW4gcmVhbGl6ZSB5b3UgbmVlZCB0aGUgaGlzdG9yeSBpdAorY29udGFpbmVkLiAgVGhlIHJlZmxvZyBpcyBhbHNvIGRlbGV0ZWQ7IGhvd2V2ZXIsIGlmIHlvdSBoYXZlIG5vdCB5ZXQKK3BydW5lZCB0aGUgcmVwb3NpdG9yeSwgdGhlbiB5b3UgbWF5IHN0aWxsIGJlIGFibGUgdG8gZmluZCB0aGUgbG9zdAorY29tbWl0cyBpbiB0aGUgZGFuZ2xpbmcgb2JqZWN0cyB0aGF0IGdpdC1mc2NrIHJlcG9ydHMuICBTZWUKKzw8ZGFuZ2xpbmctb2JqZWN0cz4+IGZvciB0aGUgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZnNjaworZGFuZ2xpbmcgY29tbWl0IDcyODEyNTFkZGQyYTYxZTM4NjU3YzgyNzczOWM1NzAxNTY3MWE2YjMKK2RhbmdsaW5nIGNvbW1pdCAyNzA2YTA1OWYyNThjNmIyNDVmMjk4ZGM0ZmYyY2NkMzBlYzIxYTYzCitkYW5nbGluZyBjb21taXQgMTM0NzJiN2M0YjgwODUxYTFiYzU1MTc3OTE3MWRjYjAzNjU1ZTliNQorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gZXhhbWluZQorb25lIG9mIHRob3NlIGRhbmdsaW5nIGNvbW1pdHMgd2l0aCwgZm9yIGV4YW1wbGUsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXRrIDcyODEyNTFkZGQgLS1ub3QgLS1hbGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBkb2VzIHdoYXQgaXQgc291bmRzIGxpa2U6IGl0IHNheXMgdGhhdCB5b3Ugd2FudCB0byBzZWUgdGhlIGNvbW1pdAoraGlzdG9yeSB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUgZGFuZ2xpbmcgY29tbWl0KHMpLCBidXQgbm90IHRoZQoraGlzdG9yeSB0aGF0IGlzIGRlc2NyaWJlZCBieSBhbGwgeW91ciBleGlzdGluZyBicmFuY2hlcyBhbmQgdGFncy4gIFRodXMKK3lvdSBnZXQgZXhhY3RseSB0aGUgaGlzdG9yeSByZWFjaGFibGUgZnJvbSB0aGF0IGNvbW1pdCB0aGF0IGlzIGxvc3QuCisoQW5kIG5vdGljZSB0aGF0IGl0IG1pZ2h0IG5vdCBiZSBqdXN0IG9uZSBjb21taXQ6IHdlIG9ubHkgcmVwb3J0IHRoZQorInRpcCBvZiB0aGUgbGluZSIgYXMgYmVpbmcgZGFuZ2xpbmcsIGJ1dCB0aGVyZSBtaWdodCBiZSBhIHdob2xlIGRlZXAKK2FuZCBjb21wbGV4IGNvbW1pdCBoaXN0b3J5IHRoYXQgd2FzIGRyb3BwZWQuKQorCitJZiB5b3UgZGVjaWRlIHlvdSB3YW50IHRoZSBoaXN0b3J5IGJhY2ssIHlvdSBjYW4gYWx3YXlzIGNyZWF0ZSBhIG5ldworcmVmZXJlbmNlIHBvaW50aW5nIHRvIGl0LCBmb3IgZXhhbXBsZSwgYSBuZXcgYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCByZWNvdmVyZWQtYnJhbmNoIDcyODEyNTFkZGQgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3RoZXIgdHlwZXMgb2YgZGFuZ2xpbmcgb2JqZWN0cyAoYmxvYnMgYW5kIHRyZWVzKSBhcmUgYWxzbyBwb3NzaWJsZSwgYW5kCitkYW5nbGluZyBvYmplY3RzIGNhbiBhcmlzZSBpbiBvdGhlciBzaXR1YXRpb25zLgorCisKK1tbc2hhcmluZy1kZXZlbG9wbWVudF1dCitTaGFyaW5nIGRldmVsb3BtZW50IHdpdGggb3RoZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZ2V0dGluZy11cGRhdGVzLXdpdGgtZ2l0LXB1bGxdXQorR2V0dGluZyB1cGRhdGVzIHdpdGggZ2l0IHB1bGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIHlvdSBjbG9uZSBhIHJlcG9zaXRvcnkgYW5kIG1ha2UgYSBmZXcgY2hhbmdlcyBvZiB5b3VyIG93biwgeW91CittYXkgd2lzaCB0byBjaGVjayB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yeSBmb3IgdXBkYXRlcyBhbmQgbWVyZ2UgdGhlbQoraW50byB5b3VyIG93biB3b3JrLgorCitXZSBoYXZlIGFscmVhZHkgc2VlbiA8PFVwZGF0aW5nLWEtcmVwb3NpdG9yeS13aXRoLWdpdC1mZXRjaCxob3cgdG8KK2tlZXAgcmVtb3RlIHRyYWNraW5nIGJyYW5jaGVzIHVwIHRvIGRhdGU+PiB3aXRoIGdpdGxpbms6Z2l0LWZldGNoWzFdLAorYW5kIGhvdyB0byBtZXJnZSB0d28gYnJhbmNoZXMuICBTbyB5b3UgY2FuIG1lcmdlIGluIGNoYW5nZXMgZnJvbSB0aGUKK29yaWdpbmFsIHJlcG9zaXRvcnkncyBtYXN0ZXIgYnJhbmNoIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZldGNoCiskIGdpdCBtZXJnZSBvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hvd2V2ZXIsIHRoZSBnaXRsaW5rOmdpdC1wdWxsWzFdIGNvbW1hbmQgcHJvdmlkZXMgYSB3YXkgdG8gZG8gdGhpcyBpbgorb25lIHN0ZXA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgb3JpZ2luIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBmYWN0LCAib3JpZ2luIiBpcyBub3JtYWxseSB0aGUgZGVmYXVsdCByZXBvc2l0b3J5IHRvIHB1bGwgZnJvbSwKK2FuZCB0aGUgZGVmYXVsdCBicmFuY2ggaXMgbm9ybWFsbHkgdGhlIEhFQUQgb2YgdGhlIHJlbW90ZSByZXBvc2l0b3J5LAorc28gb2Z0ZW4geW91IGNhbiBhY2NvbXBsaXNoIHRoZSBhYm92ZSB3aXRoIGp1c3QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgYnJhbmNoLjxuYW1lPi5yZW1vdGUgYW5kIGJyYW5jaC48bmFtZT4ubWVyZ2UKK29wdGlvbnMgaW4gZ2l0bGluazpnaXQtY29uZmlnWzFdIHRvIGxlYXJuIGhvdyB0byBjb250cm9sIHRoZXNlIGRlZmF1bHRzCitkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgYnJhbmNoLiAgQWxzbyBub3RlIHRoYXQgdGhlIC0tdHJhY2sgb3B0aW9uIHRvCitnaXRsaW5rOmdpdC1icmFuY2hbMV0gYW5kIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIGNhbiBiZSB1c2VkIHRvCithdXRvbWF0aWNhbGx5IHNldCB0aGUgZGVmYXVsdCByZW1vdGUgYnJhbmNoIHRvIHB1bGwgZnJvbSBhdCB0aGUgdGltZQordGhhdCBhIGJyYW5jaCBpcyBjcmVhdGVkOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtLXRyYWNrIC1iIG1haW50IG9yaWdpbi9tYWludAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBhZGRpdGlvbiB0byBzYXZpbmcgeW91IGtleXN0cm9rZXMsICJnaXQgcHVsbCIgYWxzbyBoZWxwcyB5b3UgYnkKK3Byb2R1Y2luZyBhIGRlZmF1bHQgY29tbWl0IG1lc3NhZ2UgZG9jdW1lbnRpbmcgdGhlIGJyYW5jaCBhbmQKK3JlcG9zaXRvcnkgdGhhdCB5b3UgcHVsbGVkIGZyb20uCisKKyhCdXQgbm90ZSB0aGF0IG5vIHN1Y2ggY29tbWl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgY2FzZSBvZiBhCis8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj47IGluc3RlYWQsIHlvdXIgYnJhbmNoIHdpbGwganVzdCBiZQordXBkYXRlZCB0byBwb2ludCB0byB0aGUgbGF0ZXN0IGNvbW1pdCBmcm9tIHRoZSB1cHN0cmVhbSBicmFuY2guKQorCitUaGUgZ2l0LXB1bGwgY29tbWFuZCBjYW4gYWxzbyBiZSBnaXZlbiAiLiIgYXMgdGhlICJyZW1vdGUiIHJlcG9zaXRvcnksCitpbiB3aGljaCBjYXNlIGl0IGp1c3QgbWVyZ2VzIGluIGEgYnJhbmNoIGZyb20gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc28KK3RoZSBjb21tYW5kcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIC4gYnJhbmNoCiskIGdpdCBtZXJnZSBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJlIHJvdWdobHkgZXF1aXZhbGVudC4gIFRoZSBmb3JtZXIgaXMgYWN0dWFsbHkgdmVyeSBjb21tb25seSB1c2VkLgorCitbW3N1Ym1pdHRpbmctcGF0Y2hlc11dCitTdWJtaXR0aW5nIHBhdGNoZXMgdG8gYSBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBqdXN0IGhhdmUgYSBmZXcgY2hhbmdlcywgdGhlIHNpbXBsZXN0IHdheSB0byBzdWJtaXQgdGhlbSBtYXkKK2p1c3QgYmUgdG8gc2VuZCB0aGVtIGFzIHBhdGNoZXMgaW4gZW1haWw6CisKK0ZpcnN0LCB1c2UgZ2l0bGluazpnaXQtZm9ybWF0LXBhdGNoWzFdOyBmb3IgZXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHByb2R1Y2UgYSBudW1iZXJlZCBzZXJpZXMgb2YgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbmUKK2ZvciBlYWNoIHBhdGNoIGluIHRoZSBjdXJyZW50IGJyYW5jaCBidXQgbm90IGluIG9yaWdpbi9IRUFELgorCitZb3UgY2FuIHRoZW4gaW1wb3J0IHRoZXNlIGludG8geW91ciBtYWlsIGNsaWVudCBhbmQgc2VuZCB0aGVtIGJ5CitoYW5kLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgYSBsb3QgdG8gc2VuZCBhdCBvbmNlLCB5b3UgbWF5IHByZWZlciB0bwordXNlIHRoZSBnaXRsaW5rOmdpdC1zZW5kLWVtYWlsWzFdIHNjcmlwdCB0byBhdXRvbWF0ZSB0aGUgcHJvY2Vzcy4KK0NvbnN1bHQgdGhlIG1haWxpbmcgbGlzdCBmb3IgeW91ciBwcm9qZWN0IGZpcnN0IHRvIGRldGVybWluZSBob3cgdGhleQorcHJlZmVyIHN1Y2ggcGF0Y2hlcyBiZSBoYW5kbGVkLgorCitbW2ltcG9ydGluZy1wYXRjaGVzXV0KK0ltcG9ydGluZyBwYXRjaGVzIHRvIGEgcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dpdCBhbHNvIHByb3ZpZGVzIGEgdG9vbCBjYWxsZWQgZ2l0bGluazpnaXQtYW1bMV0gKGFtIHN0YW5kcyBmb3IKKyJhcHBseSBtYWlsYm94IiksIGZvciBpbXBvcnRpbmcgc3VjaCBhbiBlbWFpbGVkIHNlcmllcyBvZiBwYXRjaGVzLgorSnVzdCBzYXZlIGFsbCBvZiB0aGUgcGF0Y2gtY29udGFpbmluZyBtZXNzYWdlcywgaW4gb3JkZXIsIGludG8gYQorc2luZ2xlIG1haWxib3ggZmlsZSwgc2F5ICJwYXRjaGVzLm1ib3giLCB0aGVuIHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBhbSAtMyBwYXRjaGVzLm1ib3gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IHdpbGwgYXBwbHkgZWFjaCBwYXRjaCBpbiBvcmRlcjsgaWYgYW55IGNvbmZsaWN0cyBhcmUgZm91bmQsIGl0Cit3aWxsIHN0b3AsIGFuZCB5b3UgY2FuIGZpeCB0aGUgY29uZmxpY3RzIGFzIGRlc2NyaWJlZCBpbgorIjw8cmVzb2x2aW5nLWEtbWVyZ2UsUmVzb2x2aW5nIGEgbWVyZ2U+PiIuICAoVGhlICItMyIgb3B0aW9uIHRlbGxzCitnaXQgdG8gcGVyZm9ybSBhIG1lcmdlOyBpZiB5b3Ugd291bGQgcHJlZmVyIGl0IGp1c3QgdG8gYWJvcnQgYW5kCitsZWF2ZSB5b3VyIHRyZWUgYW5kIGluZGV4IHVudG91Y2hlZCwgeW91IG1heSBvbWl0IHRoYXQgb3B0aW9uLikKKworT25jZSB0aGUgaW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBjb25mbGljdAorcmVzb2x1dGlvbiwgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBjb21taXQsIGp1c3QgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFtIC0tcmVzb2x2ZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGdpdCB3aWxsIGNyZWF0ZSB0aGUgY29tbWl0IGZvciB5b3UgYW5kIGNvbnRpbnVlIGFwcGx5aW5nIHRoZQorcmVtYWluaW5nIHBhdGNoZXMgZnJvbSB0aGUgbWFpbGJveC4KKworVGhlIGZpbmFsIHJlc3VsdCB3aWxsIGJlIGEgc2VyaWVzIG9mIGNvbW1pdHMsIG9uZSBmb3IgZWFjaCBwYXRjaCBpbgordGhlIG9yaWdpbmFsIG1haWxib3gsIHdpdGggYXV0aG9yc2hpcCBhbmQgY29tbWl0IGxvZyBtZXNzYWdlIGVhY2gKK3Rha2VuIGZyb20gdGhlIG1lc3NhZ2UgY29udGFpbmluZyBlYWNoIHBhdGNoLgorCitbW3B1YmxpYy1yZXBvc2l0b3JpZXNdXQorUHVibGljIGdpdCByZXBvc2l0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fub3RoZXIgd2F5IHRvIHN1Ym1pdCBjaGFuZ2VzIHRvIGEgcHJvamVjdCBpcyB0byB0ZWxsIHRoZSBtYWludGFpbmVyIG9mCit0aGF0IHByb2plY3QgdG8gcHVsbCB0aGUgY2hhbmdlcyBmcm9tIHlvdXIgcmVwb3NpdG9yeSB1c2luZyBnaXQtcHVsbFsxXS4KK0luIHRoZSBzZWN0aW9uICI8PGdldHRpbmctdXBkYXRlcy13aXRoLWdpdC1wdWxsLCBHZXR0aW5nIHVwZGF0ZXMgd2l0aAorZ2l0IHB1bGw+PiIgd2UgZGVzY3JpYmVkIHRoaXMgYXMgYSB3YXkgdG8gZ2V0IHVwZGF0ZXMgZnJvbSB0aGUgIm1haW4iCityZXBvc2l0b3J5LCBidXQgaXQgd29ya3MganVzdCBhcyB3ZWxsIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uCisKK0lmIHlvdSBhbmQgdGhlIG1haW50YWluZXIgYm90aCBoYXZlIGFjY291bnRzIG9uIHRoZSBzYW1lIG1hY2hpbmUsIHRoZW4KK3lvdSBjYW4ganVzdCBwdWxsIGNoYW5nZXMgZnJvbSBlYWNoIG90aGVyJ3MgcmVwb3NpdG9yaWVzIGRpcmVjdGx5OworY29tbWFuZHMgdGhhdCBhY2NlcHQgcmVwb3NpdG9yeSBVUkxzIGFzIGFyZ3VtZW50cyB3aWxsIGFsc28gYWNjZXB0IGEKK2xvY2FsIGRpcmVjdG9yeSBuYW1lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAvcGF0aC90by9yZXBvc2l0b3J5CiskIGdpdCBwdWxsIC9wYXRoL3RvL290aGVyL3JlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3IgYW4gc3NoIHVybDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgc3NoOi8veW91cmhvc3QvfnlvdS9yZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBwcm9qZWN0cyB3aXRoIGZldyBkZXZlbG9wZXJzLCBvciBmb3Igc3luY2hyb25pemluZyBhIGZldyBwcml2YXRlCityZXBvc2l0b3JpZXMsIHRoaXMgbWF5IGJlIGFsbCB5b3UgbmVlZC4KKworSG93ZXZlciwgdGhlIG1vcmUgY29tbW9uIHdheSB0byBkbyB0aGlzIGlzIHRvIG1haW50YWluIGEgc2VwYXJhdGUgcHVibGljCityZXBvc2l0b3J5ICh1c3VhbGx5IG9uIGEgZGlmZmVyZW50IGhvc3QpIGZvciBvdGhlcnMgdG8gcHVsbCBjaGFuZ2VzCitmcm9tLiAgVGhpcyBpcyB1c3VhbGx5IG1vcmUgY29udmVuaWVudCwgYW5kIGFsbG93cyB5b3UgdG8gY2xlYW5seQorc2VwYXJhdGUgcHJpdmF0ZSB3b3JrIGluIHByb2dyZXNzIGZyb20gcHVibGljbHkgdmlzaWJsZSB3b3JrLgorCitZb3Ugd2lsbCBjb250aW51ZSB0byBkbyB5b3VyIGRheS10by1kYXkgd29yayBpbiB5b3VyIHBlcnNvbmFsCityZXBvc2l0b3J5LCBidXQgcGVyaW9kaWNhbGx5ICJwdXNoIiBjaGFuZ2VzIGZyb20geW91ciBwZXJzb25hbAorcmVwb3NpdG9yeSBpbnRvIHlvdXIgcHVibGljIHJlcG9zaXRvcnksIGFsbG93aW5nIG90aGVyIGRldmVsb3BlcnMgdG8KK3B1bGwgZnJvbSB0aGF0IHJlcG9zaXRvcnkuICBTbyB0aGUgZmxvdyBvZiBjaGFuZ2VzLCBpbiBhIHNpdHVhdGlvbgord2hlcmUgdGhlcmUgaXMgb25lIG90aGVyIGRldmVsb3BlciB3aXRoIGEgcHVibGljIHJlcG9zaXRvcnksIGxvb2tzCitsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBwdXNoCisgIHlvdXIgcGVyc29uYWwgcmVwbyAtLS0tLS0tLS0tLS0tLS0tLS0+IHlvdXIgcHVibGljIHJlcG8KKyAgCV4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCXwgeW91IHB1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGV5IHB1bGwKKwl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgIHRoZXkgcHVzaCAgICAgICAgICAgICBWCisgIHRoZWlyIHB1YmxpYyByZXBvIDwtLS0tLS0tLS0tLS0tLS0tLS0tIHRoZWlyIHJlcG8KKworV2UgZXhwbGFpbiBob3cgdG8gZG8gdGhpcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorCitbW3NldHRpbmctdXAtYS1wdWJsaWMtcmVwb3NpdG9yeV1dCitTZXR0aW5nIHVwIGEgcHVibGljIHJlcG9zaXRvcnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBc3N1bWUgeW91ciBwZXJzb25hbCByZXBvc2l0b3J5IGlzIGluIHRoZSBkaXJlY3Rvcnkgfi9wcm9qLiAgV2UKK2ZpcnN0IGNyZWF0ZSBhIG5ldyBjbG9uZSBvZiB0aGUgcmVwb3NpdG9yeSBhbmQgdGVsbCBnaXQtZGFlbW9uIHRoYXQgaXQKK2lzIG1lYW50IHRvIGJlIHB1YmxpYzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1iYXJlIH4vcHJvaiBwcm9qLmdpdAorJCB0b3VjaCBwcm9qLmdpdC9naXQtZGFlbW9uLWV4cG9ydC1vaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcmVzdWx0aW5nIGRpcmVjdG9yeSBwcm9qLmdpdCBjb250YWlucyBhICJiYXJlIiBnaXQgcmVwb3NpdG9yeS0taXQgaXMKK2p1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSAiLmdpdCIgZGlyZWN0b3J5LCB3aXRob3V0IGFueSBmaWxlcyBjaGVja2VkIG91dAorYXJvdW5kIGl0LgorCitOZXh0LCBjb3B5IHByb2ouZ2l0IHRvIHRoZSBzZXJ2ZXIgd2hlcmUgeW91IHBsYW4gdG8gaG9zdCB0aGUKK3B1YmxpYyByZXBvc2l0b3J5LiAgWW91IGNhbiB1c2Ugc2NwLCByc3luYywgb3Igd2hhdGV2ZXIgaXMgbW9zdAorY29udmVuaWVudC4KKworW1tleHBvcnRpbmctdmlhLWdpdF1dCitFeHBvcnRpbmcgYSBnaXQgcmVwb3NpdG9yeSB2aWEgdGhlIGdpdCBwcm90b2NvbAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZC4KKworSWYgc29tZW9uZSBlbHNlIGFkbWluaXN0ZXJzIHRoZSBzZXJ2ZXIsIHRoZXkgc2hvdWxkIHRlbGwgeW91IHdoYXQKK2RpcmVjdG9yeSB0byBwdXQgdGhlIHJlcG9zaXRvcnkgaW4sIGFuZCB3aGF0IGdpdDovLyB1cmwgaXQgd2lsbCBhcHBlYXIKK2F0LiAgWW91IGNhbiB0aGVuIHNraXAgdG8gdGhlIHNlY3Rpb24KKyI8PHB1c2hpbmctY2hhbmdlcy10by1hLXB1YmxpYy1yZXBvc2l0b3J5LFB1c2hpbmcgY2hhbmdlcyB0byBhIHB1YmxpYworcmVwb3NpdG9yeT4+IiwgYmVsb3cuCisKK090aGVyd2lzZSwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHN0YXJ0IGdpdGxpbms6Z2l0LWRhZW1vblsxXTsgaXQgd2lsbAorbGlzdGVuIG9uIHBvcnQgOTQxOC4gIEJ5IGRlZmF1bHQsIGl0IHdpbGwgYWxsb3cgYWNjZXNzIHRvIGFueSBkaXJlY3RvcnkKK3RoYXQgbG9va3MgbGlrZSBhIGdpdCBkaXJlY3RvcnkgYW5kIGNvbnRhaW5zIHRoZSBtYWdpYyBmaWxlCitnaXQtZGFlbW9uLWV4cG9ydC1vay4gIFBhc3Npbmcgc29tZSBkaXJlY3RvcnkgcGF0aHMgYXMgZ2l0LWRhZW1vbgorYXJndW1lbnRzIHdpbGwgZnVydGhlciByZXN0cmljdCB0aGUgZXhwb3J0cyB0byB0aG9zZSBwYXRocy4KKworWW91IGNhbiBhbHNvIHJ1biBnaXQtZGFlbW9uIGFzIGFuIGluZXRkIHNlcnZpY2U7IHNlZSB0aGUKK2dpdGxpbms6Z2l0LWRhZW1vblsxXSBtYW4gcGFnZSBmb3IgZGV0YWlscy4gIChTZWUgZXNwZWNpYWxseSB0aGUKK2V4YW1wbGVzIHNlY3Rpb24uKQorCitbW2V4cG9ydGluZy12aWEtaHR0cF1dCitFeHBvcnRpbmcgYSBnaXQgcmVwb3NpdG9yeSB2aWEgaHR0cAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGdpdCBwcm90b2NvbCBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LCBidXQgb24gYQoraG9zdCB3aXRoIGEgd2ViIHNlcnZlciBzZXQgdXAsIGh0dHAgZXhwb3J0cyBtYXkgYmUgc2ltcGxlciB0byBzZXQgdXAuCisKK0FsbCB5b3UgbmVlZCB0byBkbyBpcyBwbGFjZSB0aGUgbmV3bHkgY3JlYXRlZCBiYXJlIGdpdCByZXBvc2l0b3J5IGluCithIGRpcmVjdG9yeSB0aGF0IGlzIGV4cG9ydGVkIGJ5IHRoZSB3ZWIgc2VydmVyLCBhbmQgbWFrZSBzb21lCithZGp1c3RtZW50cyB0byBnaXZlIHdlYiBjbGllbnRzIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24gdGhleSBuZWVkOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG12IHByb2ouZ2l0IC9ob21lL3lvdS9wdWJsaWNfaHRtbC9wcm9qLmdpdAorJCBjZCBwcm9qLmdpdAorJCBnaXQgLS1iYXJlIHVwZGF0ZS1zZXJ2ZXItaW5mbworJCBjaG1vZCBhK3ggaG9va3MvcG9zdC11cGRhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgbGFzdCB0d28gbGluZXMsIHNlZQorZ2l0bGluazpnaXQtdXBkYXRlLXNlcnZlci1pbmZvWzFdLCBhbmQgdGhlIGRvY3VtZW50YXRpb24KK2xpbms6aG9va3MuaHRtbFtIb29rcyB1c2VkIGJ5IGdpdF0uKQorCitBZHZlcnRpc2UgdGhlIHVybCBvZiBwcm9qLmdpdC4gIEFueWJvZHkgZWxzZSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvCitjbG9uZSBvciBwdWxsIGZyb20gdGhhdCB1cmwsIGZvciBleGFtcGxlIHdpdGggYSBjb21tYW5kbGluZSBsaWtlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBodHRwOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoU2VlIGFsc28KK2xpbms6aG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0W3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwXQorZm9yIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHNldHVwIHVzaW5nIFdlYkRBViB3aGljaCBhbHNvCithbGxvd3MgcHVzaGluZyBvdmVyIGh0dHAuKQorCitbW3B1c2hpbmctY2hhbmdlcy10by1hLXB1YmxpYy1yZXBvc2l0b3J5XV0KK1B1c2hpbmcgY2hhbmdlcyB0byBhIHB1YmxpYyByZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitOb3RlIHRoYXQgdGhlIHR3byB0ZWNobmlxdWVzIG91dGxpbmVkIGFib3ZlIChleHBvcnRpbmcgdmlhCis8PGV4cG9ydGluZy12aWEtaHR0cCxodHRwPj4gb3IgPDxleHBvcnRpbmctdmlhLWdpdCxnaXQ+PikgYWxsb3cgb3RoZXIKK21haW50YWluZXJzIHRvIGZldGNoIHlvdXIgbGF0ZXN0IGNoYW5nZXMsIGJ1dCB0aGV5IGRvIG5vdCBhbGxvdyB3cml0ZQorYWNjZXNzLCB3aGljaCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgcHVibGljIHJlcG9zaXRvcnkgd2l0aCB0aGUKK2xhdGVzdCBjaGFuZ2VzIGNyZWF0ZWQgaW4geW91ciBwcml2YXRlIHJlcG9zaXRvcnkuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyB1c2luZyBnaXRsaW5rOmdpdC1wdXNoWzFdIGFuZCBzc2g7IHRvCit1cGRhdGUgdGhlIHJlbW90ZSBicmFuY2ggbmFtZWQgIm1hc3RlciIgd2l0aCB0aGUgbGF0ZXN0IHN0YXRlIG9mIHlvdXIKK2JyYW5jaCBuYW1lZCAibWFzdGVyIiwgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggc3NoOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdCBtYXN0ZXI6bWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yIGp1c3QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBzc2g6Ly95b3Vyc2VydmVyLmNvbS9+eW91L3Byb2ouZ2l0IG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB3aXRoIGdpdC1mZXRjaCwgZ2l0LXB1c2ggd2lsbCBjb21wbGFpbiBpZiB0aGlzIGRvZXMgbm90IHJlc3VsdCBpbgorYSA8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj4uICBOb3JtYWxseSB0aGlzIGlzIGEgc2lnbiBvZgorc29tZXRoaW5nIHdyb25nLiAgSG93ZXZlciwgaWYgeW91IGFyZSBzdXJlIHlvdSBrbm93IHdoYXQgeW91J3JlCitkb2luZywgeW91IG1heSBmb3JjZSBnaXQtcHVzaCB0byBwZXJmb3JtIHRoZSB1cGRhdGUgYW55d2F5IGJ5Citwcm9jZWVkaW5nIHRoZSBicmFuY2ggbmFtZSBieSBhIHBsdXMgc2lnbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBzc2g6Ly95b3Vyc2VydmVyLmNvbS9+eW91L3Byb2ouZ2l0ICttYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSAicHVzaCIgaXMgbm9ybWFsbHkgYQorPDxkZWZfYmFyZV9yZXBvc2l0b3J5LGJhcmU+PiByZXBvc2l0b3J5LiAgWW91IGNhbiBhbHNvIHB1c2ggdG8gYQorcmVwb3NpdG9yeSB0aGF0IGhhcyBhIGNoZWNrZWQtb3V0IHdvcmtpbmcgdHJlZSwgYnV0IHRoZSB3b3JraW5nIHRyZWUKK3dpbGwgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIHB1c2guICBUaGlzIG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZgordGhlIGJyYW5jaCB5b3UgcHVzaCB0byBpcyB0aGUgY3VycmVudGx5IGNoZWNrZWQtb3V0IGJyYW5jaCEKKworQXMgd2l0aCBnaXQtZmV0Y2gsIHlvdSBtYXkgYWxzbyBzZXQgdXAgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvCitzYXZlIHR5cGluZzsgc28sIGZvciBleGFtcGxlLCBhZnRlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCA+Pi5naXQvY29uZmlnIDw8RU9GCitbcmVtb3RlICJwdWJsaWMtcmVwbyJdCisJdXJsID0gc3NoOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdAorRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBzaG91bGQgYmUgYWJsZSB0byBwZXJmb3JtIHRoZSBhYm92ZSBwdXNoIHdpdGgganVzdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIHB1YmxpYy1yZXBvIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGV4cGxhbmF0aW9ucyBvZiB0aGUgcmVtb3RlLjxuYW1lPi51cmwsIGJyYW5jaC48bmFtZT4ucmVtb3RlLAorYW5kIHJlbW90ZS48bmFtZT4ucHVzaCBvcHRpb25zIGluIGdpdGxpbms6Z2l0LWNvbmZpZ1sxXSBmb3IKK2RldGFpbHMuCisKK1tbc2V0dGluZy11cC1hLXNoYXJlZC1yZXBvc2l0b3J5XV0KK1NldHRpbmcgdXAgYSBzaGFyZWQgcmVwb3NpdG9yeQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0Fub3RoZXIgd2F5IHRvIGNvbGxhYm9yYXRlIGlzIGJ5IHVzaW5nIGEgbW9kZWwgc2ltaWxhciB0byB0aGF0Citjb21tb25seSB1c2VkIGluIENWUywgd2hlcmUgc2V2ZXJhbCBkZXZlbG9wZXJzIHdpdGggc3BlY2lhbCByaWdodHMKK2FsbCBwdXNoIHRvIGFuZCBwdWxsIGZyb20gYSBzaW5nbGUgc2hhcmVkIHJlcG9zaXRvcnkuICBTZWUKK2xpbms6Y3ZzLW1pZ3JhdGlvbi5odG1sW2dpdCBmb3IgQ1ZTIHVzZXJzXSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0bworc2V0IHRoaXMgdXAuCisKK0hvd2V2ZXIsIHdoaWxlIHRoZXJlIGlzIG5vdGhpbmcgd3Jvbmcgd2l0aCBnaXQncyBzdXBwb3J0IGZvciBzaGFyZWQKK3JlcG9zaXRvcmllcywgdGhpcyBtb2RlIG9mIG9wZXJhdGlvbiBpcyBub3QgZ2VuZXJhbGx5IHJlY29tbWVuZGVkLAorc2ltcGx5IGJlY2F1c2UgdGhlIG1vZGUgb2YgY29sbGFib3JhdGlvbiB0aGF0IGdpdCBzdXBwb3J0cy0tYnkKK2V4Y2hhbmdpbmcgcGF0Y2hlcyBhbmQgcHVsbGluZyBmcm9tIHB1YmxpYyByZXBvc2l0b3JpZXMtLWhhcyBzbyBtYW55CithZHZhbnRhZ2VzIG92ZXIgdGhlIGNlbnRyYWwgc2hhcmVkIHJlcG9zaXRvcnk6CisKKwktIEdpdCdzIGFiaWxpdHkgdG8gcXVpY2tseSBpbXBvcnQgYW5kIG1lcmdlIHBhdGNoZXMgYWxsb3dzIGEKKwkgIHNpbmdsZSBtYWludGFpbmVyIHRvIHByb2Nlc3MgaW5jb21pbmcgY2hhbmdlcyBldmVuIGF0IHZlcnkKKwkgIGhpZ2ggcmF0ZXMuICBBbmQgd2hlbiB0aGF0IGJlY29tZXMgdG9vIG11Y2gsIGdpdC1wdWxsIHByb3ZpZGVzCisJICBhbiBlYXN5IHdheSBmb3IgdGhhdCBtYWludGFpbmVyIHRvIGRlbGVnYXRlIHRoaXMgam9iIHRvIG90aGVyCisJICBtYWludGFpbmVycyB3aGlsZSBzdGlsbCBhbGxvd2luZyBvcHRpb25hbCByZXZpZXcgb2YgaW5jb21pbmcKKwkgIGNoYW5nZXMuCisJLSBTaW5jZSBldmVyeSBkZXZlbG9wZXIncyByZXBvc2l0b3J5IGhhcyB0aGUgc2FtZSBjb21wbGV0ZSBjb3B5CisJICBvZiB0aGUgcHJvamVjdCBoaXN0b3J5LCBubyByZXBvc2l0b3J5IGlzIHNwZWNpYWwsIGFuZCBpdCBpcworCSAgdHJpdmlhbCBmb3IgYW5vdGhlciBkZXZlbG9wZXIgdG8gdGFrZSBvdmVyIG1haW50ZW5hbmNlIG9mIGEKKwkgIHByb2plY3QsIGVpdGhlciBieSBtdXR1YWwgYWdyZWVtZW50LCBvciBiZWNhdXNlIGEgbWFpbnRhaW5lcgorCSAgYmVjb21lcyB1bnJlc3BvbnNpdmUgb3IgZGlmZmljdWx0IHRvIHdvcmsgd2l0aC4KKwktIFRoZSBsYWNrIG9mIGEgY2VudHJhbCBncm91cCBvZiAiY29tbWl0dGVycyIgbWVhbnMgdGhlcmUgaXMKKwkgIGxlc3MgbmVlZCBmb3IgZm9ybWFsIGRlY2lzaW9ucyBhYm91dCB3aG8gaXMgImluIiBhbmQgd2hvIGlzCisJICAib3V0Ii4KKworW1tzZXR0aW5nLXVwLWdpdHdlYl1dCitBbGxvd2luZyB3ZWIgYnJvd3Npbmcgb2YgYSByZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBnaXR3ZWIgY2dpIHNjcmlwdCBwcm92aWRlcyB1c2VycyBhbiBlYXN5IHdheSB0byBicm93c2UgeW91cgorcHJvamVjdCdzIGZpbGVzIGFuZCBoaXN0b3J5IHdpdGhvdXQgaGF2aW5nIHRvIGluc3RhbGwgZ2l0OyBzZWUgdGhlIGZpbGUKK2dpdHdlYi9JTlNUQUxMIGluIHRoZSBnaXQgc291cmNlIHRyZWUgZm9yIGluc3RydWN0aW9ucyBvbiBzZXR0aW5nIGl0IHVwLgorCitbW3NoYXJpbmctZGV2ZWxvcG1lbnQtZXhhbXBsZXNdXQorRXhhbXBsZXMKKy0tLS0tLS0tCisKK1tbbWFpbnRhaW5pbmctdG9waWMtYnJhbmNoZXNdXQorTWFpbnRhaW5pbmcgdG9waWMgYnJhbmNoZXMgZm9yIGEgTGludXggc3Vic3lzdGVtIG1haW50YWluZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoaXMgZGVzY3JpYmVzIGhvdyBUb255IEx1Y2sgdXNlcyBnaXQgaW4gaGlzIHJvbGUgYXMgbWFpbnRhaW5lciBvZiB0aGUKK0lBNjQgYXJjaGl0ZWN0dXJlIGZvciB0aGUgTGludXgga2VybmVsLgorCitIZSB1c2VzIHR3byBwdWJsaWMgYnJhbmNoZXM6CisKKyAtIEEgInRlc3QiIHRyZWUgaW50byB3aGljaCBwYXRjaGVzIGFyZSBpbml0aWFsbHkgcGxhY2VkIHNvIHRoYXQgdGhleQorICAgY2FuIGdldCBzb21lIGV4cG9zdXJlIHdoZW4gaW50ZWdyYXRlZCB3aXRoIG90aGVyIG9uZ29pbmcgZGV2ZWxvcG1lbnQuCisgICBUaGlzIHRyZWUgaXMgYXZhaWxhYmxlIHRvIEFuZHJldyBmb3IgcHVsbGluZyBpbnRvIC1tbSB3aGVuZXZlciBoZQorICAgd2FudHMuCisKKyAtIEEgInJlbGVhc2UiIHRyZWUgaW50byB3aGljaCB0ZXN0ZWQgcGF0Y2hlcyBhcmUgbW92ZWQgZm9yIGZpbmFsIHNhbml0eQorICAgY2hlY2tpbmcsIGFuZCBhcyBhIHZlaGljbGUgdG8gc2VuZCB0aGVtIHVwc3RyZWFtIHRvIExpbnVzIChieSBzZW5kaW5nCisgICBoaW0gYSAicGxlYXNlIHB1bGwiIHJlcXVlc3QuKQorCitIZSBhbHNvIHVzZXMgYSBzZXQgb2YgdGVtcG9yYXJ5IGJyYW5jaGVzICgidG9waWMgYnJhbmNoZXMiKSwgZWFjaAorY29udGFpbmluZyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcGF0Y2hlcy4KKworVG8gc2V0IHRoaXMgdXAsIGZpcnN0IGNyZWF0ZSB5b3VyIHdvcmsgdHJlZSBieSBjbG9uaW5nIExpbnVzJ3MgcHVibGljCit0cmVlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXgtMi42LmdpdCB3b3JrCiskIGNkIHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGludXMncyB0cmVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZW1vdGUgYnJhbmNoIG5hbWVkIG9yaWdpbi9tYXN0ZXIsCithbmQgY2FuIGJlIHVwZGF0ZWQgdXNpbmcgZ2l0bGluazpnaXQtZmV0Y2hbMV07IHlvdSBjYW4gdHJhY2sgb3RoZXIKK3B1YmxpYyB0cmVlcyB1c2luZyBnaXRsaW5rOmdpdC1yZW1vdGVbMV0gdG8gc2V0IHVwIGEgInJlbW90ZSIgYW5kCitnaXQtZmV0Y2hbMV0gdG8ga2VlcCB0aGVtIHVwLXRvLWRhdGU7IHNlZSA8PHJlcG9zaXRvcmllcy1hbmQtYnJhbmNoZXM+Pi4KKworTm93IGNyZWF0ZSB0aGUgYnJhbmNoZXMgaW4gd2hpY2ggeW91IGFyZSBnb2luZyB0byB3b3JrOyB0aGVzZSBzdGFydCBvdXQKK2F0IHRoZSBjdXJyZW50IHRpcCBvZiBvcmlnaW4vbWFzdGVyIGJyYW5jaCwgYW5kIHNob3VsZCBiZSBzZXQgdXAgKHVzaW5nCit0aGUgLS10cmFjayBvcHRpb24gdG8gZ2l0bGluazpnaXQtYnJhbmNoWzFdKSB0byBtZXJnZSBjaGFuZ2VzIGluIGZyb20KK0xpbnVzIGJ5IGRlZmF1bHQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCAtLXRyYWNrIHRlc3Qgb3JpZ2luL21hc3RlcgorJCBnaXQgYnJhbmNoIC0tdHJhY2sgcmVsZWFzZSBvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIGNhbiBiZSBlYXNpbHkga2VwdCB1cCB0byBkYXRlIHVzaW5nIGdpdGxpbms6Z2l0LXB1bGxbMV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgdGVzdCAmJiBnaXQgcHVsbAorJCBnaXQgY2hlY2tvdXQgcmVsZWFzZSAmJiBnaXQgcHVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbXBvcnRhbnQgbm90ZSEgIElmIHlvdSBoYXZlIGFueSBsb2NhbCBjaGFuZ2VzIGluIHRoZXNlIGJyYW5jaGVzLCB0aGVuCit0aGlzIG1lcmdlIHdpbGwgY3JlYXRlIGEgY29tbWl0IG9iamVjdCBpbiB0aGUgaGlzdG9yeSAod2l0aCBubyBsb2NhbAorY2hhbmdlcyBnaXQgd2lsbCBzaW1wbHkgZG8gYSAiRmFzdCBmb3J3YXJkIiBtZXJnZSkuICBNYW55IHBlb3BsZSBkaXNsaWtlCit0aGUgIm5vaXNlIiB0aGF0IHRoaXMgY3JlYXRlcyBpbiB0aGUgTGludXggaGlzdG9yeSwgc28geW91IHNob3VsZCBhdm9pZAorZG9pbmcgdGhpcyBjYXByaWNpb3VzbHkgaW4gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFzIHRoZXNlIG5vaXN5IGNvbW1pdHMKK3dpbGwgYmVjb21lIHBhcnQgb2YgdGhlIHBlcm1hbmVudCBoaXN0b3J5IHdoZW4geW91IGFzayBMaW51cyB0byBwdWxsCitmcm9tIHRoZSByZWxlYXNlIGJyYW5jaC4KKworQSBmZXcgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgKHNlZSBnaXRsaW5rOmdpdC1jb25maWdbMV0pIGNhbgorbWFrZSBpdCBlYXN5IHRvIHB1c2ggYm90aCBicmFuY2hlcyB0byB5b3VyIHB1YmxpYyB0cmVlLiAgKFNlZQorPDxzZXR0aW5nLXVwLWEtcHVibGljLXJlcG9zaXRvcnk+Pi4pCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0ID4+IC5naXQvY29uZmlnIDw8RU9GCitbcmVtb3RlICJteXRyZWUiXQorCXVybCA9ICBtYXN0ZXIua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAorCXB1c2ggPSByZWxlYXNlCisJcHVzaCA9IHRlc3QKK0VPRgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVuIHlvdSBjYW4gcHVzaCBib3RoIHRoZSB0ZXN0IGFuZCByZWxlYXNlIHRyZWVzIHVzaW5nCitnaXRsaW5rOmdpdC1wdXNoWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIG15dHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvciBwdXNoIGp1c3Qgb25lIG9mIHRoZSB0ZXN0IGFuZCByZWxlYXNlIGJyYW5jaGVzIHVzaW5nOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIG15dHJlZSB0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggbXl0cmVlIHJlbGVhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IHRvIGFwcGx5IHNvbWUgcGF0Y2hlcyBmcm9tIHRoZSBjb21tdW5pdHkuICBUaGluayBvZiBhIHNob3J0CitzbmFwcHkgbmFtZSBmb3IgYSBicmFuY2ggdG8gaG9sZCB0aGlzIHBhdGNoIChvciByZWxhdGVkIGdyb3VwIG9mCitwYXRjaGVzKSwgYW5kIGNyZWF0ZSBhIG5ldyBicmFuY2ggZnJvbSB0aGUgY3VycmVudCB0aXAgb2YgTGludXMncworYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtYiBzcGVlZC11cC1zcGlubG9ja3Mgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdyB5b3UgYXBwbHkgdGhlIHBhdGNoKGVzKSwgcnVuIHNvbWUgdGVzdHMsIGFuZCBjb21taXQgdGhlIGNoYW5nZShzKS4gIElmCit0aGUgcGF0Y2ggaXMgYSBtdWx0aS1wYXJ0IHNlcmllcywgdGhlbiB5b3Ugc2hvdWxkIGFwcGx5IGVhY2ggYXMgYSBzZXBhcmF0ZQorY29tbWl0IHRvIHRoaXMgYnJhbmNoLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIC4uLiBwYXRjaCAuLi4gdGVzdCAgLi4uIGNvbW1pdCBbIC4uLiBwYXRjaCAuLi4gdGVzdCAuLi4gY29tbWl0IF0qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4geW91IGFyZSBoYXBweSB3aXRoIHRoZSBzdGF0ZSBvZiB0aGlzIGNoYW5nZSwgeW91IGNhbiBwdWxsIGl0IGludG8gdGhlCisidGVzdCIgYnJhbmNoIGluIHByZXBhcmF0aW9uIHRvIG1ha2UgaXQgcHVibGljOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCB0ZXN0ICYmIGdpdCBwdWxsIC4gc3BlZWQtdXAtc3BpbmxvY2tzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHVubGlrZWx5IHRoYXQgeW91IHdvdWxkIGhhdmUgYW55IGNvbmZsaWN0cyBoZXJlIC4uLiBidXQgeW91IG1pZ2h0IGlmIHlvdQorc3BlbnQgYSB3aGlsZSBvbiB0aGlzIHN0ZXAgYW5kIGhhZCBhbHNvIHB1bGxlZCBuZXcgdmVyc2lvbnMgZnJvbSB1cHN0cmVhbS4KKworU29tZSB0aW1lIGxhdGVyIHdoZW4gZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBhbmQgdGVzdGluZyBkb25lLCB5b3UgY2FuIHB1bGwgdGhlCitzYW1lIGJyYW5jaCBpbnRvIHRoZSAicmVsZWFzZSIgdHJlZSByZWFkeSB0byBnbyB1cHN0cmVhbS4gIFRoaXMgaXMgd2hlcmUgeW91CitzZWUgdGhlIHZhbHVlIG9mIGtlZXBpbmcgZWFjaCBwYXRjaCAob3IgcGF0Y2ggc2VyaWVzKSBpbiBpdHMgb3duIGJyYW5jaC4gIEl0CittZWFucyB0aGF0IHRoZSBwYXRjaGVzIGNhbiBiZSBtb3ZlZCBpbnRvIHRoZSAicmVsZWFzZSIgdHJlZSBpbiBhbnkgb3JkZXIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IHJlbGVhc2UgJiYgZ2l0IHB1bGwgLiBzcGVlZC11cC1zcGlubG9ja3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgYSB3aGlsZSwgeW91IHdpbGwgaGF2ZSBhIG51bWJlciBvZiBicmFuY2hlcywgYW5kIGRlc3BpdGUgdGhlCit3ZWxsIGNob3NlbiBuYW1lcyB5b3UgcGlja2VkIGZvciBlYWNoIG9mIHRoZW0sIHlvdSBtYXkgZm9yZ2V0IHdoYXQKK3RoZXkgYXJlIGZvciwgb3Igd2hhdCBzdGF0dXMgdGhleSBhcmUgaW4uICBUbyBnZXQgYSByZW1pbmRlciBvZiB3aGF0CitjaGFuZ2VzIGFyZSBpbiBhIHNwZWNpZmljIGJyYW5jaCwgdXNlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgbGludXguLmJyYW5jaG5hbWUgfCBnaXQtc2hvcnRsb2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gc2VlIHdoZXRoZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBtZXJnZWQgaW50byB0aGUgdGVzdCBvciByZWxlYXNlIGJyYW5jaGVzCit1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB0ZXN0Li5icmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyByZWxlYXNlLi5icmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhJZiB0aGlzIGJyYW5jaCBoYXMgbm90IHlldCBiZWVuIG1lcmdlZCB5b3Ugd2lsbCBzZWUgc29tZSBsb2cgZW50cmllcy4KK0lmIGl0IGhhcyBiZWVuIG1lcmdlZCwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG91dHB1dC4pCisKK09uY2UgYSBwYXRjaCBjb21wbGV0ZXMgdGhlIGdyZWF0IGN5Y2xlIChtb3ZpbmcgZnJvbSB0ZXN0IHRvIHJlbGVhc2UsCit0aGVuIHB1bGxlZCBieSBMaW51cywgYW5kIGZpbmFsbHkgY29taW5nIGJhY2sgaW50byB5b3VyIGxvY2FsCisib3JpZ2luL21hc3RlciIgYnJhbmNoKSB0aGUgYnJhbmNoIGZvciB0aGlzIGNoYW5nZSBpcyBubyBsb25nZXIgbmVlZGVkLgorWW91IGRldGVjdCB0aGlzIHdoZW4gdGhlIG91dHB1dCBmcm9tOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgb3JpZ2luLi5icmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lzIGVtcHR5LiAgQXQgdGhpcyBwb2ludCB0aGUgYnJhbmNoIGNhbiBiZSBkZWxldGVkOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLWQgYnJhbmNobmFtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21lIGNoYW5nZXMgYXJlIHNvIHRyaXZpYWwgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHNlcGFyYXRlCiticmFuY2ggYW5kIHRoZW4gbWVyZ2UgaW50byBlYWNoIG9mIHRoZSB0ZXN0IGFuZCByZWxlYXNlIGJyYW5jaGVzLiAgRm9yCit0aGVzZSBjaGFuZ2VzLCBqdXN0IGFwcGx5IGRpcmVjdGx5IHRvIHRoZSAicmVsZWFzZSIgYnJhbmNoLCBhbmQgdGhlbgorbWVyZ2UgdGhhdCBpbnRvIHRoZSAidGVzdCIgYnJhbmNoLgorCitUbyBjcmVhdGUgZGlmZnN0YXQgYW5kIHNob3J0bG9nIHN1bW1hcmllcyBvZiBjaGFuZ2VzIHRvIGluY2x1ZGUgaW4gYSAicGxlYXNlCitwdWxsIiByZXF1ZXN0IHRvIExpbnVzIHlvdSBjYW4gdXNlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIC0tc3RhdCBvcmlnaW4uLnJlbGVhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtcCBvcmlnaW4uLnJlbGVhc2UgfCBnaXQgc2hvcnRsb2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSBhcmUgc29tZSBvZiB0aGUgc2NyaXB0cyB0aGF0IHNpbXBsaWZ5IGFsbCB0aGlzIGV2ZW4gZnVydGhlci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PSB1cGRhdGUgc2NyaXB0ID09PT0KKyMgVXBkYXRlIGEgYnJhbmNoIGluIG15IEdJVCB0cmVlLiAgSWYgdGhlIGJyYW5jaCB0byBiZSB1cGRhdGVkCisjIGlzIG9yaWdpbiwgdGhlbiBwdWxsIGZyb20ga2VybmVsLm9yZy4gIE90aGVyd2lzZSBtZXJnZQorIyBvcmlnaW4vbWFzdGVyIGJyYW5jaCBpbnRvIHRlc3R8cmVsZWFzZSBicmFuY2gKKworY2FzZSAiJDEiIGluCit0ZXN0fHJlbGVhc2UpCisJZ2l0IGNoZWNrb3V0ICQxICYmIGdpdCBwdWxsIC4gb3JpZ2luCisJOzsKK29yaWdpbikKKwliZWZvcmU9JChjYXQgLmdpdC9yZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcikKKwlnaXQgZmV0Y2ggb3JpZ2luCisJYWZ0ZXI9JChjYXQgLmdpdC9yZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcikKKwlpZiBbICRiZWZvcmUgIT0gJGFmdGVyIF0KKwl0aGVuCisJCWdpdCBsb2cgJGJlZm9yZS4uJGFmdGVyIHwgZ2l0IHNob3J0bG9nCisJZmkKKwk7OworKikKKwllY2hvICJVc2FnZTogJDAgb3JpZ2lufHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorCTs7Citlc2FjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKz09PT0gbWVyZ2Ugc2NyaXB0ID09PT0KKyMgTWVyZ2UgYSBicmFuY2ggaW50byBlaXRoZXIgdGhlIHRlc3Qgb3IgcmVsZWFzZSBicmFuY2gKKworcG5hbWU9JDAKKwordXNhZ2UoKQoreworCWVjaG8gIlVzYWdlOiAkcG5hbWUgYnJhbmNoIHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorfQorCitpZiBbICEgLWYgLmdpdC9yZWZzL2hlYWRzLyIkMSIgXQordGhlbgorCWVjaG8gIkNhbid0IHNlZSBicmFuY2ggPCQxPiIgMT4mMgorCXVzYWdlCitmaQorCitjYXNlICIkMiIgaW4KK3Rlc3R8cmVsZWFzZSkKKwlpZiBbICQoZ2l0IGxvZyAkMi4uJDEgfCB3YyAtYykgLWVxIDAgXQorCXRoZW4KKwkJZWNobyAkMSBhbHJlYWR5IG1lcmdlZCBpbnRvICQyIDE+JjIKKwkJZXhpdCAxCisJZmkKKwlnaXQgY2hlY2tvdXQgJDIgJiYgZ2l0IHB1bGwgLiAkMQorCTs7CisqKQorCXVzYWdlCisJOzsKK2VzYWMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PSBzdGF0dXMgc2NyaXB0ID09PT0KKyMgcmVwb3J0IG9uIHN0YXR1cyBvZiBteSBpYTY0IEdJVCB0cmVlCisKK2diPSQodHB1dCBzZXRhYiAyKQorcmI9JCh0cHV0IHNldGFiIDEpCityZXN0b3JlPSQodHB1dCBzZXRhYiA5KQorCitpZiBbIGBnaXQgcmV2LWxpc3QgdGVzdC4ucmVsZWFzZSB8IHdjIC1jYCAtZ3QgMCBdCit0aGVuCisJZWNobyAkcmIgV2FybmluZzogY29tbWl0cyBpbiByZWxlYXNlIHRoYXQgYXJlIG5vdCBpbiB0ZXN0ICRyZXN0b3JlCisJZ2l0IGxvZyB0ZXN0Li5yZWxlYXNlCitmaQorCitmb3IgYnJhbmNoIGluIGBscyAuZ2l0L3JlZnMvaGVhZHNgCitkbworCWlmIFsgJGJyYW5jaCA9IHRlc3QgLW8gJGJyYW5jaCA9IHJlbGVhc2UgXQorCXRoZW4KKwkJY29udGludWUKKwlmaQorCisJZWNobyAtbiAkZ2IgPT09PT09PSAkYnJhbmNoID09PT09PSAkcmVzdG9yZSAiICIKKwlzdGF0dXM9CisJZm9yIHJlZiBpbiB0ZXN0IHJlbGVhc2Ugb3JpZ2luL21hc3RlcgorCWRvCisJCWlmIFsgYGdpdCByZXYtbGlzdCAkcmVmLi4kYnJhbmNoIHwgd2MgLWNgIC1ndCAwIF0KKwkJdGhlbgorCQkJc3RhdHVzPSRzdGF0dXMke3JlZjowOjF9CisJCWZpCisJZG9uZQorCWNhc2UgJHN0YXR1cyBpbgorCXRybCkKKwkJZWNobyAkcmIgTmVlZCB0byBwdWxsIGludG8gdGVzdCAkcmVzdG9yZQorCQk7OworCXJsKQorCQllY2hvICJJbiB0ZXN0IgorCQk7OworCWwpCisJCWVjaG8gIldhaXRpbmcgZm9yIGxpbnVzIgorCQk7OworCSIiKQorCQllY2hvICRyYiBBbGwgZG9uZSAkcmVzdG9yZQorCQk7OworCSopCisJCWVjaG8gJHJiICI8JHN0YXR1cz4iICRyZXN0b3JlCisJCTs7CisJZXNhYworCWdpdCBsb2cgb3JpZ2luL21hc3Rlci4uJGJyYW5jaCB8IGdpdCBzaG9ydGxvZworZG9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tbY2xlYW5pbmctdXAtaGlzdG9yeV1dCitSZXdyaXRpbmcgaGlzdG9yeSBhbmQgbWFpbnRhaW5pbmcgcGF0Y2ggc2VyaWVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK05vcm1hbGx5IGNvbW1pdHMgYXJlIG9ubHkgYWRkZWQgdG8gYSBwcm9qZWN0LCBuZXZlciB0YWtlbiBhd2F5IG9yCityZXBsYWNlZC4gIEdpdCBpcyBkZXNpZ25lZCB3aXRoIHRoaXMgYXNzdW1wdGlvbiwgYW5kIHZpb2xhdGluZyBpdCB3aWxsCitjYXVzZSBnaXQncyBtZXJnZSBtYWNoaW5lcnkgKGZvciBleGFtcGxlKSB0byBkbyB0aGUgd3JvbmcgdGhpbmcuCisKK0hvd2V2ZXIsIHRoZXJlIGlzIGEgc2l0dWF0aW9uIGluIHdoaWNoIGl0IGNhbiBiZSB1c2VmdWwgdG8gdmlvbGF0ZSB0aGlzCithc3N1bXB0aW9uLgorCitbW3BhdGNoLXNlcmllc11dCitDcmVhdGluZyB0aGUgcGVyZmVjdCBwYXRjaCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHlvdSBhcmUgYSBjb250cmlidXRvciB0byBhIGxhcmdlIHByb2plY3QsIGFuZCB5b3Ugd2FudCB0byBhZGQgYQorY29tcGxpY2F0ZWQgZmVhdHVyZSwgYW5kIHRvIHByZXNlbnQgaXQgdG8gdGhlIG90aGVyIGRldmVsb3BlcnMgaW4gYSB3YXkKK3RoYXQgbWFrZXMgaXQgZWFzeSBmb3IgdGhlbSB0byByZWFkIHlvdXIgY2hhbmdlcywgdmVyaWZ5IHRoYXQgdGhleSBhcmUKK2NvcnJlY3QsIGFuZCB1bmRlcnN0YW5kIHdoeSB5b3UgbWFkZSBlYWNoIGNoYW5nZS4KKworSWYgeW91IHByZXNlbnQgYWxsIG9mIHlvdXIgY2hhbmdlcyBhcyBhIHNpbmdsZSBwYXRjaCAob3IgY29tbWl0KSwgdGhleQorbWF5IGZpbmQgdGhhdCBpdCBpcyB0b28gbXVjaCB0byBkaWdlc3QgYWxsIGF0IG9uY2UuCisKK0lmIHlvdSBwcmVzZW50IHRoZW0gd2l0aCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgeW91ciB3b3JrLCBjb21wbGV0ZSB3aXRoCittaXN0YWtlcywgY29ycmVjdGlvbnMsIGFuZCBkZWFkIGVuZHMsIHRoZXkgbWF5IGJlIG92ZXJ3aGVsbWVkLgorCitTbyB0aGUgaWRlYWwgaXMgdXN1YWxseSB0byBwcm9kdWNlIGEgc2VyaWVzIG9mIHBhdGNoZXMgc3VjaCB0aGF0OgorCisJMS4gRWFjaCBwYXRjaCBjYW4gYmUgYXBwbGllZCBpbiBvcmRlci4KKworCTIuIEVhY2ggcGF0Y2ggaW5jbHVkZXMgYSBzaW5nbGUgbG9naWNhbCBjaGFuZ2UsIHRvZ2V0aGVyIHdpdGggYQorCSAgIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgY2hhbmdlLgorCisJMy4gTm8gcGF0Y2ggaW50cm9kdWNlcyBhIHJlZ3Jlc3Npb246IGFmdGVyIGFwcGx5aW5nIGFueSBpbml0aWFsCisJICAgcGFydCBvZiB0aGUgc2VyaWVzLCB0aGUgcmVzdWx0aW5nIHByb2plY3Qgc3RpbGwgY29tcGlsZXMgYW5kCisJICAgd29ya3MsIGFuZCBoYXMgbm8gYnVncyB0aGF0IGl0IGRpZG4ndCBoYXZlIGJlZm9yZS4KKworCTQuIFRoZSBjb21wbGV0ZSBzZXJpZXMgcHJvZHVjZXMgdGhlIHNhbWUgZW5kIHJlc3VsdCBhcyB5b3VyIG93bgorCSAgIChwcm9iYWJseSBtdWNoIG1lc3NpZXIhKSBkZXZlbG9wbWVudCBwcm9jZXNzIGRpZC4KKworV2Ugd2lsbCBpbnRyb2R1Y2Ugc29tZSB0b29scyB0aGF0IGNhbiBoZWxwIHlvdSBkbyB0aGlzLCBleHBsYWluIGhvdyB0bwordXNlIHRoZW0sIGFuZCB0aGVuIGV4cGxhaW4gc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBjYW4gYXJpc2UgYmVjYXVzZQoreW91IGFyZSByZXdyaXRpbmcgaGlzdG9yeS4KKworW1t1c2luZy1naXQtcmViYXNlXV0KK0tlZXBpbmcgYSBwYXRjaCBzZXJpZXMgdXAgdG8gZGF0ZSB1c2luZyBnaXQtcmViYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHRoYXQgeW91IGNyZWF0ZSBhIGJyYW5jaCAibXl3b3JrIiBvbiBhIHJlbW90ZS10cmFja2luZyBicmFuY2gKKyJvcmlnaW4iLCBhbmQgY3JlYXRlIHNvbWUgY29tbWl0cyBvbiB0b3Agb2YgaXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15d29yayBvcmlnaW4KKyQgdmkgZmlsZS50eHQKKyQgZ2l0IGNvbW1pdAorJCB2aSBvdGhlcmZpbGUudHh0CiskIGdpdCBjb21taXQKKy4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgaGF2ZSBwZXJmb3JtZWQgbm8gbWVyZ2VzIGludG8gbXl3b3JrLCBzbyBpdCBpcyBqdXN0IGEgc2ltcGxlIGxpbmVhcgorc2VxdWVuY2Ugb2YgcGF0Y2hlcyBvbiB0b3Agb2YgIm9yaWdpbiI6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLW8gPC0tIG9yaWdpbgorICAgICAgICBcCisgICAgICAgICBvLS1vLS1vIDwtLSBteXdvcmsKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitTb21lIG1vcmUgaW50ZXJlc3Rpbmcgd29yayBoYXMgYmVlbiBkb25lIGluIHRoZSB1cHN0cmVhbSBwcm9qZWN0LCBhbmQKKyJvcmlnaW4iIGhhcyBhZHZhbmNlZDoKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgby0tby0tTy0tby0tby0tbyA8LS0gb3JpZ2luCisgICAgICAgIFwKKyAgICAgICAgIGEtLWItLWMgPC0tIG15d29yaworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBjb3VsZCB1c2UgInB1bGwiIHRvIG1lcmdlIHlvdXIgY2hhbmdlcyBiYWNrIGluOwordGhlIHJlc3VsdCB3b3VsZCBjcmVhdGUgYSBuZXcgbWVyZ2UgY29tbWl0LCBsaWtlIHRoaXM6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9yaWdpbgorICAgICAgICBcICAgICAgICBcCisgICAgICAgICBhLS1iLS1jLS1tIDwtLSBteXdvcmsKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIAorSG93ZXZlciwgaWYgeW91IHByZWZlciB0byBrZWVwIHRoZSBoaXN0b3J5IGluIG15d29yayBhIHNpbXBsZSBzZXJpZXMgb2YKK2NvbW1pdHMgd2l0aG91dCBhbnkgbWVyZ2VzLCB5b3UgbWF5IGluc3RlYWQgY2hvb3NlIHRvIHVzZQorZ2l0bGluazpnaXQtcmViYXNlWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBteXdvcmsKKyQgZ2l0IHJlYmFzZSBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3aWxsIHJlbW92ZSBlYWNoIG9mIHlvdXIgY29tbWl0cyBmcm9tIG15d29yaywgdGVtcG9yYXJpbHkgc2F2aW5nCit0aGVtIGFzIHBhdGNoZXMgKGluIGEgZGlyZWN0b3J5IG5hbWVkICIuZG90ZXN0IiksIHVwZGF0ZSBteXdvcmsgdG8KK3BvaW50IGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvcmlnaW4sIHRoZW4gYXBwbHkgZWFjaCBvZiB0aGUgc2F2ZWQKK3BhdGNoZXMgdG8gdGhlIG5ldyBteXdvcmsuICBUaGUgcmVzdWx0IHdpbGwgbG9vayBsaWtlOgorCisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9yaWdpbgorCQkgXAorCQkgIGEnLS1iJy0tYycgPC0tIG15d29yaworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0luIHRoZSBwcm9jZXNzLCBpdCBtYXkgZGlzY292ZXIgY29uZmxpY3RzLiAgSW4gdGhhdCBjYXNlIGl0IHdpbGwgc3RvcAorYW5kIGFsbG93IHlvdSB0byBmaXggdGhlIGNvbmZsaWN0czsgYWZ0ZXIgZml4aW5nIGNvbmZsaWN0cywgdXNlICJnaXQKK2FkZCIgdG8gdXBkYXRlIHRoZSBpbmRleCB3aXRoIHRob3NlIGNvbnRlbnRzLCBhbmQgdGhlbiwgaW5zdGVhZCBvZgorcnVubmluZyBnaXQtY29tbWl0LCBqdXN0IHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZWJhc2UgLS1jb250aW51ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgZ2l0IHdpbGwgY29udGludWUgYXBwbHlpbmcgdGhlIHJlc3Qgb2YgdGhlIHBhdGNoZXMuCisKK0F0IGFueSBwb2ludCB5b3UgbWF5IHVzZSB0aGUgLS1hYm9ydCBvcHRpb24gdG8gYWJvcnQgdGhpcyBwcm9jZXNzIGFuZAorcmV0dXJuIG15d29yayB0byB0aGUgc3RhdGUgaXQgaGFkIGJlZm9yZSB5b3Ugc3RhcnRlZCB0aGUgcmViYXNlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZWJhc2UgLS1hYm9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW21vZGlmeWluZy1vbmUtY29tbWl0XV0KK01vZGlmeWluZyBhIHNpbmdsZSBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2Ugc2F3IGluIDw8Zml4aW5nLWEtbWlzdGFrZS1ieS1lZGl0aW5nLWhpc3Rvcnk+PiB0aGF0IHlvdSBjYW4gcmVwbGFjZSB0aGUKK21vc3QgcmVjZW50IGNvbW1pdCB1c2luZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLS1hbWVuZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHJlcGxhY2UgdGhlIG9sZCBjb21taXQgYnkgYSBuZXcgY29tbWl0IGluY29ycG9yYXRpbmcgeW91cgorY2hhbmdlcywgZ2l2aW5nIHlvdSBhIGNoYW5jZSB0byBlZGl0IHRoZSBvbGQgY29tbWl0IG1lc3NhZ2UgZmlyc3QuCisKK1lvdSBjYW4gYWxzbyB1c2UgYSBjb21iaW5hdGlvbiBvZiB0aGlzIGFuZCBnaXRsaW5rOmdpdC1yZWJhc2VbMV0gdG8gZWRpdAorY29tbWl0cyBmdXJ0aGVyIGJhY2sgaW4geW91ciBoaXN0b3J5LiAgRmlyc3QsIHRhZyB0aGUgcHJvYmxlbWF0aWMgY29tbWl0IHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIGJhZCBteXdvcmt+NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoRWl0aGVyIGdpdGsgb3IgZ2l0LWxvZyBtYXkgYmUgdXNlZnVsIGZvciBmaW5kaW5nIHRoZSBjb21taXQuKQorCitUaGVuIGNoZWNrIG91dCB0aGF0IGNvbW1pdCwgZWRpdCBpdCwgYW5kIHJlYmFzZSB0aGUgcmVzdCBvZiB0aGUgc2VyaWVzCitvbiB0b3Agb2YgaXQgKG5vdGUgdGhhdCB3ZSBjb3VsZCBjaGVjayBvdXQgdGhlIGNvbW1pdCBvbiBhIHRlbXBvcmFyeQorYnJhbmNoLCBidXQgaW5zdGVhZCB3ZSdyZSB1c2luZyBhIDw8ZGV0YWNoZWQtaGVhZCxkZXRhY2hlZCBoZWFkPj4pOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBiYWQKKyQgIyBtYWtlIGNoYW5nZXMgaGVyZSBhbmQgdXBkYXRlIHRoZSBpbmRleAorJCBnaXQgY29tbWl0IC0tYW1lbmQKKyQgZ2l0IHJlYmFzZSAtLW9udG8gSEVBRCBiYWQgbXl3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4geW91J3JlIGRvbmUsIHlvdSdsbCBiZSBsZWZ0IHdpdGggbXl3b3JrIGNoZWNrZWQgb3V0LCB3aXRoIHRoZSB0b3AKK3BhdGNoZXMgb24gbXl3b3JrIHJlYXBwbGllZCBvbiB0b3Agb2YgeW91ciBtb2RpZmllZCBjb21taXQuICBZb3UgY2FuCit0aGVuIGNsZWFuIHVwIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIC1kIGJhZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhlIGltbXV0YWJsZSBuYXR1cmUgb2YgZ2l0IGhpc3RvcnkgbWVhbnMgdGhhdCB5b3UgaGF2ZW4ndCByZWFsbHkKKyJtb2RpZmllZCIgZXhpc3RpbmcgY29tbWl0czsgaW5zdGVhZCwgeW91IGhhdmUgcmVwbGFjZWQgdGhlIG9sZCBjb21taXRzIHdpdGgKK25ldyBjb21taXRzIGhhdmluZyBuZXcgb2JqZWN0IG5hbWVzLgorCitbW3Jlb3JkZXJpbmctcGF0Y2gtc2VyaWVzXV0KK1Jlb3JkZXJpbmcgb3Igc2VsZWN0aW5nIGZyb20gYSBwYXRjaCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgdGhlIGdpdGxpbms6Z2l0LWNoZXJyeS1waWNrWzFdIGNvbW1hbmQKK2FsbG93cyB5b3UgdG8gYXBwbHkgdGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGJ5IHRoYXQgY29tbWl0IGFuZCBjcmVhdGUgYQorbmV3IGNvbW1pdCB0aGF0IHJlY29yZHMgaXQuICBTbywgZm9yIGV4YW1wbGUsIGlmICJteXdvcmsiIHBvaW50cyB0byBhCitzZXJpZXMgb2YgcGF0Y2hlcyBvbiB0b3Agb2YgIm9yaWdpbiIsIHlvdSBtaWdodCBkbyBzb21ldGhpbmcgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgbXl3b3JrLW5ldyBvcmlnaW4KKyQgZ2l0ayBvcmlnaW4uLm15d29yayAmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZCBicm93c2UgdGhyb3VnaCB0aGUgbGlzdCBvZiBwYXRjaGVzIGluIHRoZSBteXdvcmsgYnJhbmNoIHVzaW5nIGdpdGssCithcHBseWluZyB0aGVtIChwb3NzaWJseSBpbiBhIGRpZmZlcmVudCBvcmRlcikgdG8gbXl3b3JrLW5ldyB1c2luZworY2hlcnJ5LXBpY2ssIGFuZCBwb3NzaWJseSBtb2RpZnlpbmcgdGhlbSBhcyB5b3UgZ28gdXNpbmcgY29tbWl0CistLWFtZW5kLgorCitBbm90aGVyIHRlY2huaXF1ZSBpcyB0byB1c2UgZ2l0LWZvcm1hdC1wYXRjaCB0byBjcmVhdGUgYSBzZXJpZXMgb2YKK3BhdGNoZXMsIHRoZW4gcmVzZXQgdGhlIHN0YXRlIHRvIGJlZm9yZSB0aGUgcGF0Y2hlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbgorJCBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVuIG1vZGlmeSwgcmVvcmRlciwgb3IgZWxpbWluYXRlIHBhdGNoZXMgYXMgcHJlZmVycmVkIGJlZm9yZSBhcHBseWluZwordGhlbSBhZ2FpbiB3aXRoIGdpdGxpbms6Z2l0LWFtWzFdLgorCitbW3BhdGNoLXNlcmllcy10b29sc11dCitPdGhlciB0b29scworLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIG51bWVyb3VzIG90aGVyIHRvb2xzLCBzdWNoIGFzIHN0Z2l0LCB3aGljaCBleGlzdCBmb3IgdGhlCitwdXJwb3NlIG9mIG1haW50YWluaW5nIGEgcGF0Y2ggc2VyaWVzLiAgVGhlc2UgYXJlIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mCit0aGlzIG1hbnVhbC4KKworW1twcm9ibGVtcy13aXRoLXJld3JpdGluZy1oaXN0b3J5XV0KK1Byb2JsZW1zIHdpdGggcmV3cml0aW5nIGhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHByaW1hcnkgcHJvYmxlbSB3aXRoIHJld3JpdGluZyB0aGUgaGlzdG9yeSBvZiBhIGJyYW5jaCBoYXMgdG8gZG8KK3dpdGggbWVyZ2luZy4gIFN1cHBvc2Ugc29tZWJvZHkgZmV0Y2hlcyB5b3VyIGJyYW5jaCBhbmQgbWVyZ2VzIGl0IGludG8KK3RoZWlyIGJyYW5jaCwgd2l0aCBhIHJlc3VsdCBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyBvLS1vLS1PLS1vLS1vLS1vIDwtLSBvcmlnaW4KKyAgICAgICAgXCAgICAgICAgXAorICAgICAgICAgdC0tdC0tdC0tbSA8LS0gdGhlaXIgYnJhbmNoOgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK1RoZW4gc3VwcG9zZSB5b3UgbW9kaWZ5IHRoZSBsYXN0IHRocmVlIGNvbW1pdHM6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCSBvLS1vLS1vIDwtLSBuZXcgaGVhZCBvZiBvcmlnaW4KKwkvCisgby0tby0tTy0tby0tby0tbyA8LS0gb2xkIGhlYWQgb2Ygb3JpZ2luCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworSWYgd2UgZXhhbWluZWQgYWxsIHRoaXMgaGlzdG9yeSB0b2dldGhlciBpbiBvbmUgcmVwb3NpdG9yeSwgaXQgd2lsbAorbG9vayBsaWtlOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkgby0tby0tbyA8LS0gbmV3IGhlYWQgb2Ygb3JpZ2luCisJLworIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9sZCBoZWFkIG9mIG9yaWdpbgorICAgICAgICBcICAgICAgICBcCisgICAgICAgICB0LS10LS10LS1tIDwtLSB0aGVpciBicmFuY2g6CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworR2l0IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGF0IHRoZSBuZXcgaGVhZCBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2YKK3RoZSBvbGQgaGVhZDsgaXQgdHJlYXRzIHRoaXMgc2l0dWF0aW9uIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgd291bGQgaWYKK3R3byBkZXZlbG9wZXJzIGhhZCBpbmRlcGVuZGVudGx5IGRvbmUgdGhlIHdvcmsgb24gdGhlIG9sZCBhbmQgbmV3IGhlYWRzCitpbiBwYXJhbGxlbC4gIEF0IHRoaXMgcG9pbnQsIGlmIHNvbWVvbmUgYXR0ZW1wdHMgdG8gbWVyZ2UgdGhlIG5ldyBoZWFkCitpbiB0byB0aGVpciBicmFuY2gsIGdpdCB3aWxsIGF0dGVtcHQgdG8gbWVyZ2UgdG9nZXRoZXIgdGhlIHR3byAob2xkIGFuZAorbmV3KSBsaW5lcyBvZiBkZXZlbG9wbWVudCwgaW5zdGVhZCBvZiB0cnlpbmcgdG8gcmVwbGFjZSB0aGUgb2xkIGJ5IHRoZQorbmV3LiAgVGhlIHJlc3VsdHMgYXJlIGxpa2VseSB0byBiZSB1bmV4cGVjdGVkLgorCitZb3UgbWF5IHN0aWxsIGNob29zZSB0byBwdWJsaXNoIGJyYW5jaGVzIHdob3NlIGhpc3RvcnkgaXMgcmV3cml0dGVuLAorYW5kIGl0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVycyB0byBiZSBhYmxlIHRvIGZldGNoIHRob3NlIGJyYW5jaGVzIGluCitvcmRlciB0byBleGFtaW5lIG9yIHRlc3QgdGhlbSwgYnV0IHRoZXkgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHB1bGwgc3VjaAorYnJhbmNoZXMgaW50byB0aGVpciBvd24gd29yay4KKworRm9yIHRydWUgZGlzdHJpYnV0ZWQgZGV2ZWxvcG1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXIgbWVyZ2luZywKK3B1Ymxpc2hlZCBicmFuY2hlcyBzaG91bGQgbmV2ZXIgYmUgcmV3cml0dGVuLgorCitbW2FkdmFuY2VkLWJyYW5jaC1tYW5hZ2VtZW50XV0KK0FkdmFuY2VkIGJyYW5jaCBtYW5hZ2VtZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2ZldGNoaW5nLWluZGl2aWR1YWwtYnJhbmNoZXNdXQorRmV0Y2hpbmcgaW5kaXZpZHVhbCBicmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0ZWFkIG9mIHVzaW5nIGdpdGxpbms6Z2l0LXJlbW90ZVsxXSwgeW91IGNhbiBhbHNvIGNob29zZSBqdXN0Cit0byB1cGRhdGUgb25lIGJyYW5jaCBhdCBhIHRpbWUsIGFuZCB0byBzdG9yZSBpdCBsb2NhbGx5IHVuZGVyIGFuCithcmJpdHJhcnkgbmFtZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggb3JpZ2luIHRvZG86bXktdG9kby13b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmaXJzdCBhcmd1bWVudCwgIm9yaWdpbiIsIGp1c3QgdGVsbHMgZ2l0IHRvIGZldGNoIGZyb20gdGhlCityZXBvc2l0b3J5IHlvdSBvcmlnaW5hbGx5IGNsb25lZCBmcm9tLiAgVGhlIHNlY29uZCBhcmd1bWVudCB0ZWxscyBnaXQKK3RvIGZldGNoIHRoZSBicmFuY2ggbmFtZWQgInRvZG8iIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LCBhbmQgdG8KK3N0b3JlIGl0IGxvY2FsbHkgdW5kZXIgdGhlIG5hbWUgcmVmcy9oZWFkcy9teS10b2RvLXdvcmsuCisKK1lvdSBjYW4gYWxzbyBmZXRjaCBicmFuY2hlcyBmcm9tIG90aGVyIHJlcG9zaXRvcmllczsgc28KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvai5naXQgbWFzdGVyOmV4YW1wbGUtbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgY3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCAiZXhhbXBsZS1tYXN0ZXIiIGFuZCBzdG9yZSBpbiBpdCB0aGUKK2JyYW5jaCBuYW1lZCAibWFzdGVyIiBmcm9tIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBVUkwuICBJZiB5b3UKK2FscmVhZHkgaGF2ZSBhIGJyYW5jaCBuYW1lZCBleGFtcGxlLW1hc3RlciwgaXQgd2lsbCBhdHRlbXB0IHRvCis8PGZhc3QtZm9yd2FyZHMsZmFzdC1mb3J3YXJkPj4gdG8gdGhlIGNvbW1pdCBnaXZlbiBieSBleGFtcGxlLmNvbSdzCittYXN0ZXIgYnJhbmNoLiAgSW4gbW9yZSBkZXRhaWw6CisKK1tbZmV0Y2gtZmFzdC1mb3J3YXJkc11dCitnaXQgZmV0Y2ggYW5kIGZhc3QtZm9yd2FyZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgd2hlbiB1cGRhdGluZyBhbiBleGlzdGluZyBicmFuY2gsICJnaXQKK2ZldGNoIiBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdCBvbiB0aGUgcmVtb3RlCiticmFuY2ggaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBtb3N0IHJlY2VudCBjb21taXQgb24geW91ciBjb3B5IG9mIHRoZQorYnJhbmNoIGJlZm9yZSB1cGRhdGluZyB5b3VyIGNvcHkgb2YgdGhlIGJyYW5jaCB0byBwb2ludCBhdCB0aGUgbmV3Citjb21taXQuICBHaXQgY2FsbHMgdGhpcyBwcm9jZXNzIGEgPDxmYXN0LWZvcndhcmRzLGZhc3QgZm9yd2FyZD4+LgorCitBIGZhc3QgZm9yd2FyZCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyBvLS1vLS1vLS1vIDwtLSBvbGQgaGVhZCBvZiB0aGUgYnJhbmNoCisgICAgICAgICAgIFwKKyAgICAgICAgICAgIG8tLW8tLW8gPC0tIG5ldyBoZWFkIG9mIHRoZSBicmFuY2gKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKK0luIHNvbWUgY2FzZXMgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgbmV3IGhlYWQgd2lsbCAqbm90KiBhY3R1YWxseSBiZQorYSBkZXNjZW5kYW50IG9mIHRoZSBvbGQgaGVhZC4gIEZvciBleGFtcGxlLCB0aGUgZGV2ZWxvcGVyIG1heSBoYXZlCityZWFsaXplZCBzaGUgbWFkZSBhIHNlcmlvdXMgbWlzdGFrZSwgYW5kIGRlY2lkZWQgdG8gYmFja3RyYWNrLAorcmVzdWx0aW5nIGluIGEgc2l0dWF0aW9uIGxpa2U6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLW8tLW8tLWEtLWIgPC0tIG9sZCBoZWFkIG9mIHRoZSBicmFuY2gKKyAgICAgICAgICAgXAorICAgICAgICAgICAgby0tby0tbyA8LS0gbmV3IGhlYWQgb2YgdGhlIGJyYW5jaAorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0luIHRoaXMgY2FzZSwgImdpdCBmZXRjaCIgd2lsbCBmYWlsLCBhbmQgcHJpbnQgb3V0IGEgd2FybmluZy4KKworSW4gdGhhdCBjYXNlLCB5b3UgY2FuIHN0aWxsIGZvcmNlIGdpdCB0byB1cGRhdGUgdG8gdGhlIG5ldyBoZWFkLCBhcworZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4gIEhvd2V2ZXIsIG5vdGUgdGhhdCBpbiB0aGUKK3NpdHVhdGlvbiBhYm92ZSB0aGlzIG1heSBtZWFuIGxvc2luZyB0aGUgY29tbWl0cyBsYWJlbGVkICJhIiBhbmQgImIiLAordW5sZXNzIHlvdSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYSByZWZlcmVuY2Ugb2YgeW91ciBvd24gcG9pbnRpbmcgdG8KK3RoZW0uCisKK1tbZm9yY2luZy1mZXRjaF1dCitGb3JjaW5nIGdpdCBmZXRjaCB0byBkbyBub24tZmFzdC1mb3J3YXJkIHVwZGF0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiBnaXQgZmV0Y2ggZmFpbHMgYmVjYXVzZSB0aGUgbmV3IGhlYWQgb2YgYSBicmFuY2ggaXMgbm90IGEKK2Rlc2NlbmRhbnQgb2YgdGhlIG9sZCBoZWFkLCB5b3UgbWF5IGZvcmNlIHRoZSB1cGRhdGUgd2l0aDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvai5naXQgK21hc3RlcjpyZWZzL3JlbW90ZXMvZXhhbXBsZS9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGUgYWRkaXRpb24gb2YgdGhlICIrIiBzaWduLiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlICItZiIKK2ZsYWcgdG8gZm9yY2UgdXBkYXRlcyBvZiBhbGwgdGhlIGZldGNoZWQgYnJhbmNoZXMsIGFzIGluOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCAtZiBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmUgYXdhcmUgdGhhdCBjb21taXRzIHRoYXQgdGhlIG9sZCB2ZXJzaW9uIG9mIGV4YW1wbGUvbWFzdGVyIHBvaW50ZWQgYXQKK21heSBiZSBsb3N0LCBhcyB3ZSBzYXcgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uCisKK1tbcmVtb3RlLWJyYW5jaC1jb25maWd1cmF0aW9uXV0KK0NvbmZpZ3VyaW5nIHJlbW90ZSBicmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHNhdyBhYm92ZSB0aGF0ICJvcmlnaW4iIGlzIGp1c3QgYSBzaG9ydGN1dCB0byByZWZlciB0byB0aGUKK3JlcG9zaXRvcnkgdGhhdCB5b3Ugb3JpZ2luYWxseSBjbG9uZWQgZnJvbS4gIFRoaXMgaW5mb3JtYXRpb24gaXMKK3N0b3JlZCBpbiBnaXQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMsIHdoaWNoIHlvdSBjYW4gc2VlIHVzaW5nCitnaXRsaW5rOmdpdC1jb25maWdbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtbAorY29yZS5yZXBvc2l0b3J5Zm9ybWF0dmVyc2lvbj0wCitjb3JlLmZpbGVtb2RlPXRydWUKK2NvcmUubG9nYWxscmVmdXBkYXRlcz10cnVlCityZW1vdGUub3JpZ2luLnVybD1naXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0CityZW1vdGUub3JpZ2luLmZldGNoPStyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qCiticmFuY2gubWFzdGVyLnJlbW90ZT1vcmlnaW4KK2JyYW5jaC5tYXN0ZXIubWVyZ2U9cmVmcy9oZWFkcy9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgdGhlcmUgYXJlIG90aGVyIHJlcG9zaXRvcmllcyB0aGF0IHlvdSBhbHNvIHVzZSBmcmVxdWVudGx5LCB5b3UgY2FuCitjcmVhdGUgc2ltaWxhciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gc2F2ZSB0eXBpbmc7IGZvciBleGFtcGxlLAorYWZ0ZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29uZmlnIHJlbW90ZS5leGFtcGxlLnVybCBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qLmdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuIHRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIHdpbGwgZG8gdGhlIHNhbWUgdGhpbmc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZldGNoIGdpdDovL2V4YW1wbGUuY29tL3Byb2ouZ2l0IG1hc3RlcjpyZWZzL3JlbW90ZXMvZXhhbXBsZS9tYXN0ZXIKKyQgZ2l0IGZldGNoIGV4YW1wbGUgbWFzdGVyOnJlZnMvcmVtb3Rlcy9leGFtcGxlL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVuIGJldHRlciwgaWYgeW91IGFkZCBvbmUgbW9yZSBvcHRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyByZW1vdGUuZXhhbXBsZS5mZXRjaCBtYXN0ZXI6cmVmcy9yZW1vdGVzL2V4YW1wbGUvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcyB3aWxsIGFsbCBkbyB0aGUgc2FtZSB0aGluZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvai5naXQgbWFzdGVyOnJlZnMvcmVtb3Rlcy9leGFtcGxlL21hc3RlcgorJCBnaXQgZmV0Y2ggZXhhbXBsZSBtYXN0ZXI6cmVmcy9yZW1vdGVzL2V4YW1wbGUvbWFzdGVyCiskIGdpdCBmZXRjaCBleGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gYWxzbyBhZGQgYSAiKyIgdG8gZm9yY2UgdGhlIHVwZGF0ZSBlYWNoIHRpbWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyByZW1vdGUuZXhhbXBsZS5mZXRjaCArbWFzdGVyOnJlZi9yZW1vdGVzL2V4YW1wbGUvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Rvbid0IGRvIHRoaXMgdW5sZXNzIHlvdSdyZSBzdXJlIHlvdSB3b24ndCBtaW5kICJnaXQgZmV0Y2giIHBvc3NpYmx5Cit0aHJvd2luZyBhd2F5IGNvbW1pdHMgb24gbXlicmFuY2guCisKK0Fsc28gbm90ZSB0aGF0IGFsbCBvZiB0aGUgYWJvdmUgY29uZmlndXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5CitkaXJlY3RseSBlZGl0aW5nIHRoZSBmaWxlIC5naXQvY29uZmlnIGluc3RlYWQgb2YgdXNpbmcKK2dpdGxpbms6Z2l0LWNvbmZpZ1sxXS4KKworU2VlIGdpdGxpbms6Z2l0LWNvbmZpZ1sxXSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBjb25maWd1cmF0aW9uCitvcHRpb25zIG1lbnRpb25lZCBhYm92ZS4KKworCitbW2dpdC1pbnRlcm5hbHNdXQorR2l0IGludGVybmFscworPT09PT09PT09PT09PQorCitHaXQgZGVwZW5kcyBvbiB0d28gZnVuZGFtZW50YWwgYWJzdHJhY3Rpb25zOiB0aGUgIm9iamVjdCBkYXRhYmFzZSIsIGFuZAordGhlICJjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSIgYWthICJpbmRleCIuCisKK1tbdGhlLW9iamVjdC1kYXRhYmFzZV1dCitUaGUgT2JqZWN0IERhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBvYmplY3QgZGF0YWJhc2UgaXMgbGl0ZXJhbGx5IGp1c3QgYSBjb250ZW50LWFkZHJlc3NhYmxlIGNvbGxlY3Rpb24KK29mIG9iamVjdHMuICBBbGwgb2JqZWN0cyBhcmUgbmFtZWQgYnkgdGhlaXIgY29udGVudCwgd2hpY2ggaXMKK2FwcHJveGltYXRlZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgT2JqZWN0cyBtYXkgcmVmZXIKK3RvIG90aGVyIG9iamVjdHMgKGJ5IHJlZmVyZW5jaW5nIHRoZWlyIFNIQTEgaGFzaCksIGFuZCBzbyB5b3UgY2FuCitidWlsZCB1cCBhIGhpZXJhcmNoeSBvZiBvYmplY3RzLgorCitBbGwgb2JqZWN0cyBoYXZlIGEgc3RhdGljYWxseSBkZXRlcm1pbmVkICJ0eXBlIiB3aGljaCBpcworZGV0ZXJtaW5lZCBhdCBvYmplY3QgY3JlYXRpb24gdGltZSwgYW5kIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZvcm1hdCBvZgordGhlIG9iamVjdCAoaS5lLiBob3cgaXQgaXMgdXNlZCwgYW5kIGhvdyBpdCBjYW4gcmVmZXIgdG8gb3RoZXIKK29iamVjdHMpLiAgVGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIGRpZmZlcmVudCBvYmplY3QgdHlwZXM6ICJibG9iIiwKKyJ0cmVlIiwgImNvbW1pdCIsIGFuZCAidGFnIi4KKworQSA8PGRlZl9ibG9iX29iamVjdCwiYmxvYiIgb2JqZWN0Pj4gY2Fubm90IHJlZmVyIHRvIGFueSBvdGhlciBvYmplY3QsCithbmQgaXMsIGFzIHRoZSBuYW1lIGltcGxpZXMsIGEgcHVyZSBzdG9yYWdlIG9iamVjdCBjb250YWluaW5nIHNvbWUKK3VzZXIgZGF0YS4gIEl0IGlzIHVzZWQgdG8gYWN0dWFsbHkgc3RvcmUgdGhlIGZpbGUgZGF0YSwgaS5lLiBhIGJsb2IKK29iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggc29tZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2Ygc29tZSBmaWxlLgorCitBIDw8ZGVmX3RyZWVfb2JqZWN0LCJ0cmVlIiBvYmplY3Q+PiBpcyBhbiBvYmplY3QgdGhhdCB0aWVzIG9uZSBvciBtb3JlCisiYmxvYiIgb2JqZWN0cyBpbnRvIGEgZGlyZWN0b3J5IHN0cnVjdHVyZS4gSW4gYWRkaXRpb24sIGEgdHJlZSBvYmplY3QKK2NhbiByZWZlciB0byBvdGhlciB0cmVlIG9iamVjdHMsIHRodXMgY3JlYXRpbmcgYSBkaXJlY3RvcnkgaGllcmFyY2h5LgorCitBIDw8ZGVmX2NvbW1pdF9vYmplY3QsImNvbW1pdCIgb2JqZWN0Pj4gdGllcyBzdWNoIGRpcmVjdG9yeSBoaWVyYXJjaGllcwordG9nZXRoZXIgaW50byBhIDw8ZGVmX0RBRyxkaXJlY3RlZCBhY3ljbGljIGdyYXBoPj4gb2YgcmV2aXNpb25zIC0gZWFjaAorImNvbW1pdCIgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHRyZWUgKHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5IGF0Cit0aGUgdGltZSBvZiB0aGUgY29tbWl0KS4gSW4gYWRkaXRpb24sIGEgImNvbW1pdCIgcmVmZXJzIHRvIG9uZSBvciBtb3JlCisicGFyZW50IiBjb21taXQgb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHRoZSBoaXN0b3J5IG9mIGhvdyB3ZSBhcnJpdmVkIGF0Cit0aGF0IGRpcmVjdG9yeSBoaWVyYXJjaHkuCisKK0FzIGEgc3BlY2lhbCBjYXNlLCBhIGNvbW1pdCBvYmplY3Qgd2l0aCBubyBwYXJlbnRzIGlzIGNhbGxlZCB0aGUgInJvb3QiCitjb21taXQsIGFuZCBpcyB0aGUgcG9pbnQgb2YgYW4gaW5pdGlhbCBwcm9qZWN0IGNvbW1pdC4gIEVhY2ggcHJvamVjdAorbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSByb290LCBhbmQgd2hpbGUgeW91IGNhbiB0aWUgc2V2ZXJhbCBkaWZmZXJlbnQKK3Jvb3Qgb2JqZWN0cyB0b2dldGhlciBpbnRvIG9uZSBwcm9qZWN0IGJ5IGNyZWF0aW5nIGEgY29tbWl0IG9iamVjdCB3aGljaAoraGFzIHR3byBvciBtb3JlIHNlcGFyYXRlIHJvb3RzIGFzIGl0cyB1bHRpbWF0ZSBwYXJlbnRzLCB0aGF0J3MgcHJvYmFibHkKK2p1c3QgZ29pbmcgdG8gY29uZnVzZSBwZW9wbGUuICBTbyBhaW0gZm9yIHRoZSBub3Rpb24gb2YgIm9uZSByb290IG9iamVjdAorcGVyIHByb2plY3QiLCBldmVuIGlmIGdpdCBpdHNlbGYgZG9lcyBub3QgZW5mb3JjZSB0aGF0LiAKKworQSA8PGRlZl90YWdfb2JqZWN0LCJ0YWciIG9iamVjdD4+IHN5bWJvbGljYWxseSBpZGVudGlmaWVzIGFuZCBjYW4gYmUKK3VzZWQgdG8gc2lnbiBvdGhlciBvYmplY3RzLiBJdCBjb250YWlucyB0aGUgaWRlbnRpZmllciBhbmQgdHlwZSBvZgorYW5vdGhlciBvYmplY3QsIGEgc3ltYm9saWMgbmFtZSAob2YgY291cnNlISkgYW5kLCBvcHRpb25hbGx5LCBhCitzaWduYXR1cmUuCisKK1JlZ2FyZGxlc3Mgb2Ygb2JqZWN0IHR5cGUsIGFsbCBvYmplY3RzIHNoYXJlIHRoZSBmb2xsb3dpbmcKK2NoYXJhY3RlcmlzdGljczogdGhleSBhcmUgYWxsIGRlZmxhdGVkIHdpdGggemxpYiwgYW5kIGhhdmUgYSBoZWFkZXIKK3RoYXQgbm90IG9ubHkgc3BlY2lmaWVzIHRoZWlyIHR5cGUsIGJ1dCBhbHNvIHByb3ZpZGVzIHNpemUgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBkYXRhIGluIHRoZSBvYmplY3QuICBJdCdzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBTSEExIGhhc2gKK3RoYXQgaXMgdXNlZCB0byBuYW1lIHRoZSBvYmplY3QgaXMgdGhlIGhhc2ggb2YgdGhlIG9yaWdpbmFsIGRhdGEKK3BsdXMgdGhpcyBoZWFkZXIsIHNvIGBzaGExc3VtYCAnZmlsZScgZG9lcyBub3QgbWF0Y2ggdGhlIG9iamVjdCBuYW1lCitmb3IgJ2ZpbGUnLgorKEhpc3RvcmljYWwgbm90ZTogaW4gdGhlIGRhd24gb2YgdGhlIGFnZSBvZiBnaXQgdGhlIGhhc2gKK3dhcyB0aGUgc2hhMSBvZiB0aGUgJ2NvbXByZXNzZWQnIG9iamVjdC4pCisKK0FzIGEgcmVzdWx0LCB0aGUgZ2VuZXJhbCBjb25zaXN0ZW5jeSBvZiBhbiBvYmplY3QgY2FuIGFsd2F5cyBiZSB0ZXN0ZWQKK2luZGVwZW5kZW50bHkgb2YgdGhlIGNvbnRlbnRzIG9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Q6IGFsbCBvYmplY3RzIGNhbgorYmUgdmFsaWRhdGVkIGJ5IHZlcmlmeWluZyB0aGF0IChhKSB0aGVpciBoYXNoZXMgbWF0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlCitmaWxlIGFuZCAoYikgdGhlIG9iamVjdCBzdWNjZXNzZnVsbHkgaW5mbGF0ZXMgdG8gYSBzdHJlYW0gb2YgYnl0ZXMgdGhhdAorZm9ybXMgYSBzZXF1ZW5jZSBvZiA8YXNjaWkgdHlwZSB3aXRob3V0IHNwYWNlPiB7cGx1c30gPHNwYWNlPiB7cGx1c30gPGFzY2lpIGRlY2ltYWwKK3NpemU+IHtwbHVzfSA8Ynl0ZVwwPiB7cGx1c30gPGJpbmFyeSBvYmplY3QgZGF0YT4uCisKK1RoZSBzdHJ1Y3R1cmVkIG9iamVjdHMgY2FuIGZ1cnRoZXIgaGF2ZSB0aGVpciBzdHJ1Y3R1cmUgYW5kCitjb25uZWN0aXZpdHkgdG8gb3RoZXIgb2JqZWN0cyB2ZXJpZmllZC4gVGhpcyBpcyBnZW5lcmFsbHkgZG9uZSB3aXRoCit0aGUgYGdpdC1mc2NrYCBwcm9ncmFtLCB3aGljaCBnZW5lcmF0ZXMgYSBmdWxsIGRlcGVuZGVuY3kgZ3JhcGgKK29mIGFsbCBvYmplY3RzLCBhbmQgdmVyaWZpZXMgdGhlaXIgaW50ZXJuYWwgY29uc2lzdGVuY3kgKGluIGFkZGl0aW9uCit0byBqdXN0IHZlcmlmeWluZyB0aGVpciBzdXBlcmZpY2lhbCBjb25zaXN0ZW5jeSB0aHJvdWdoIHRoZSBoYXNoKS4KKworVGhlIG9iamVjdCB0eXBlcyBpbiBzb21lIG1vcmUgZGV0YWlsOgorCitbW2Jsb2Itb2JqZWN0XV0KK0Jsb2IgT2JqZWN0CistLS0tLS0tLS0tLQorCitBICJibG9iIiBvYmplY3QgaXMgbm90aGluZyBidXQgYSBiaW5hcnkgYmxvYiBvZiBkYXRhLCBhbmQgZG9lc24ndAorcmVmZXIgdG8gYW55dGhpbmcgZWxzZS4gIFRoZXJlIGlzIG5vIHNpZ25hdHVyZSBvciBhbnkgb3RoZXIKK3ZlcmlmaWNhdGlvbiBvZiB0aGUgZGF0YSwgc28gd2hpbGUgdGhlIG9iamVjdCBpcyBjb25zaXN0ZW50IChpdCAnaXMnCitpbmRleGVkIGJ5IGl0cyBzaGExIGhhc2gsIHNvIHRoZSBkYXRhIGl0c2VsZiBpcyBjZXJ0YWlubHkgY29ycmVjdCksIGl0CitoYXMgYWJzb2x1dGVseSBubyBvdGhlciBhdHRyaWJ1dGVzLiAgTm8gbmFtZSBhc3NvY2lhdGlvbnMsIG5vCitwZXJtaXNzaW9ucy4gIEl0IGlzIHB1cmVseSBhIGJsb2Igb2YgZGF0YSAoaS5lLiBub3JtYWxseSAiZmlsZQorY29udGVudHMiKS4KKworSW4gcGFydGljdWxhciwgc2luY2UgdGhlIGJsb2IgaXMgZW50aXJlbHkgZGVmaW5lZCBieSBpdHMgZGF0YSwgaWYgdHdvCitmaWxlcyBpbiBhIGRpcmVjdG9yeSB0cmVlIChvciBpbiBtdWx0aXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCityZXBvc2l0b3J5KSBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzLCB0aGV5IHdpbGwgc2hhcmUgdGhlIHNhbWUgYmxvYgorb2JqZWN0LiBUaGUgb2JqZWN0IGlzIHRvdGFsbHkgaW5kZXBlbmRlbnQgb2YgaXRzIGxvY2F0aW9uIGluIHRoZQorZGlyZWN0b3J5IHRyZWUsIGFuZCByZW5hbWluZyBhIGZpbGUgZG9lcyBub3QgY2hhbmdlIHRoZSBvYmplY3QgdGhhdAorZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggaW4gYW55IHdheS4KKworQSBibG9iIGlzIHR5cGljYWxseSBjcmVhdGVkIHdoZW4gZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdCitpcyBydW4sIGFuZCBpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0uCisKK1tbdHJlZS1vYmplY3RdXQorVHJlZSBPYmplY3QKKy0tLS0tLS0tLS0tCisKK1RoZSBuZXh0IGhpZXJhcmNoaWNhbCBvYmplY3QgdHlwZSBpcyB0aGUgInRyZWUiIG9iamVjdC4gIEEgdHJlZSBvYmplY3QKK2lzIGEgbGlzdCBvZiBtb2RlL25hbWUvYmxvYiBkYXRhLCBzb3J0ZWQgYnkgbmFtZS4gIEFsdGVybmF0aXZlbHksIHRoZQorbW9kZSBkYXRhIG1heSBzcGVjaWZ5IGEgZGlyZWN0b3J5IG1vZGUsIGluIHdoaWNoIGNhc2UgaW5zdGVhZCBvZgorbmFtaW5nIGEgYmxvYiwgdGhhdCBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIFRSRUUgb2JqZWN0LgorCitMaWtlIHRoZSAiYmxvYiIgb2JqZWN0LCBhIHRyZWUgb2JqZWN0IGlzIHVuaXF1ZWx5IGRldGVybWluZWQgYnkgdGhlCitzZXQgY29udGVudHMsIGFuZCBzbyB0d28gc2VwYXJhdGUgYnV0IGlkZW50aWNhbCB0cmVlcyB3aWxsIGFsd2F5cworc2hhcmUgdGhlIGV4YWN0IHNhbWUgb2JqZWN0LiBUaGlzIGlzIHRydWUgYXQgYWxsIGxldmVscywgaS5lLiBpdCdzCit0cnVlIGZvciBhICJsZWFmIiB0cmVlICh3aGljaCBkb2VzIG5vdCByZWZlciB0byBhbnkgb3RoZXIgdHJlZXMsIG9ubHkKK2Jsb2JzKSBhcyB3ZWxsIGFzIGZvciBhIHdob2xlIHN1YmRpcmVjdG9yeS4KKworRm9yIHRoYXQgcmVhc29uIGEgInRyZWUiIG9iamVjdCBpcyBqdXN0IGEgcHVyZSBkYXRhIGFic3RyYWN0aW9uOiBpdAoraGFzIG5vIGhpc3RvcnksIG5vIHNpZ25hdHVyZXMsIG5vIHZlcmlmaWNhdGlvbiBvZiB2YWxpZGl0eSwgZXhjZXB0Cit0aGF0IHNpbmNlIHRoZSBjb250ZW50cyBhcmUgYWdhaW4gcHJvdGVjdGVkIGJ5IHRoZSBoYXNoIGl0c2VsZiwgd2UgY2FuCit0cnVzdCB0aGF0IHRoZSB0cmVlIGlzIGltbXV0YWJsZSBhbmQgaXRzIGNvbnRlbnRzIG5ldmVyIGNoYW5nZS4KKworU28geW91IGNhbiB0cnVzdCB0aGUgY29udGVudHMgb2YgYSB0cmVlIHRvIGJlIHZhbGlkLCB0aGUgc2FtZSB3YXkgeW91CitjYW4gdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYiwgYnV0IHlvdSBkb24ndCBrbm93IHdoZXJlIHRob3NlCitjb250ZW50cyAnY2FtZScgZnJvbS4KKworU2lkZSBub3RlIG9uIHRyZWVzOiBzaW5jZSBhICJ0cmVlIiBvYmplY3QgaXMgYSBzb3J0ZWQgbGlzdCBvZgorImZpbGVuYW1lK2NvbnRlbnQiLCB5b3UgY2FuIGNyZWF0ZSBhIGRpZmYgYmV0d2VlbiB0d28gdHJlZXMgd2l0aG91dAorYWN0dWFsbHkgaGF2aW5nIHRvIHVucGFjayB0d28gdHJlZXMuICBKdXN0IGlnbm9yZSBhbGwgY29tbW9uIHBhcnRzLAorYW5kIHlvdXIgZGlmZiB3aWxsIGxvb2sgcmlnaHQuICBJbiBvdGhlciB3b3JkcywgeW91IGNhbiBlZmZlY3RpdmVseQorKGFuZCBlZmZpY2llbnRseSkgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFueSB0d28gcmFuZG9tIHRyZWVzIGJ5CitPKG4pIHdoZXJlICJuIiBpcyB0aGUgc2l6ZSBvZiB0aGUgZGlmZmVyZW5jZSwgcmF0aGVyIHRoYW4gdGhlIHNpemUgb2YKK3RoZSB0cmVlLgorCitTaWRlIG5vdGUgMiBvbiB0cmVlczogc2luY2UgdGhlIG5hbWUgb2YgYSAiYmxvYiIgZGVwZW5kcyBlbnRpcmVseSBhbmQKK2V4Y2x1c2l2ZWx5IG9uIGl0cyBjb250ZW50cyAoaS5lLiB0aGVyZSBhcmUgbm8gbmFtZXMgb3IgcGVybWlzc2lvbnMKK2ludm9sdmVkKSwgeW91IGNhbiBzZWUgdHJpdmlhbCByZW5hbWVzIG9yIHBlcm1pc3Npb24gY2hhbmdlcyBieQorbm90aWNpbmcgdGhhdCB0aGUgYmxvYiBzdGF5ZWQgdGhlIHNhbWUuICBIb3dldmVyLCByZW5hbWVzIHdpdGggZGF0YQorY2hhbmdlcyBuZWVkIGEgc21hcnRlciAiZGlmZiIgaW1wbGVtZW50YXRpb24uCisKK0EgdHJlZSBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtd3JpdGUtdHJlZVsxXSBhbmQKK2l0cyBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBnaXRsaW5rOmdpdC1scy10cmVlWzFdLgorVHdvIHRyZWVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIGdpdGxpbms6Z2l0LWRpZmYtdHJlZVsxXS4KKworW1tjb21taXQtb2JqZWN0XV0KK0NvbW1pdCBPYmplY3QKKy0tLS0tLS0tLS0tLS0KKworVGhlICJjb21taXQiIG9iamVjdCBpcyBhbiBvYmplY3QgdGhhdCBpbnRyb2R1Y2VzIHRoZSBub3Rpb24gb2YKK2hpc3RvcnkgaW50byB0aGUgcGljdHVyZS4gIEluIGNvbnRyYXN0IHRvIHRoZSBvdGhlciBvYmplY3RzLCBpdAorZG9lc24ndCBqdXN0IGRlc2NyaWJlIHRoZSBwaHlzaWNhbCBzdGF0ZSBvZiBhIHRyZWUsIGl0IGRlc2NyaWJlcyBob3cKK3dlIGdvdCB0aGVyZSwgYW5kIHdoeS4KKworQSAiY29tbWl0IiBpcyBkZWZpbmVkIGJ5IHRoZSB0cmVlLW9iamVjdCB0aGF0IGl0IHJlc3VsdHMgaW4sIHRoZQorcGFyZW50IGNvbW1pdHMgKHplcm8sIG9uZSBvciBtb3JlKSB0aGF0IGxlZCB1cCB0byB0aGF0IHBvaW50LCBhbmQgYQorY29tbWVudCBvbiB3aGF0IGhhcHBlbmVkLiAgQWdhaW4sIGEgY29tbWl0IGlzIG5vdCB0cnVzdGVkIHBlciBzZToKK3RoZSBjb250ZW50cyBhcmUgd2VsbC1kZWZpbmVkIGFuZCAic2FmZSIgZHVlIHRvIHRoZSBjcnlwdG9ncmFwaGljYWxseQorc3Ryb25nIHNpZ25hdHVyZXMgYXQgYWxsIGxldmVscywgYnV0IHRoZXJlIGlzIG5vIHJlYXNvbiB0byBiZWxpZXZlCit0aGF0IHRoZSB0cmVlIGlzICJnb29kIiBvciB0aGF0IHRoZSBtZXJnZSBpbmZvcm1hdGlvbiBtYWtlcyBzZW5zZS4KK1RoZSBwYXJlbnRzIGRvIG5vdCBoYXZlIHRvIGFjdHVhbGx5IGhhdmUgYW55IHJlbGF0aW9uc2hpcCB3aXRoIHRoZQorcmVzdWx0LCBmb3IgZXhhbXBsZS4KKworTm90ZSBvbiBjb21taXRzOiB1bmxpa2Ugc29tZSBTQ00ncywgY29tbWl0cyBkbyBub3QgY29udGFpbgorcmVuYW1lIGluZm9ybWF0aW9uIG9yIGZpbGUgbW9kZSBjaGFuZ2UgaW5mb3JtYXRpb24uICBBbGwgb2YgdGhhdCBpcworaW1wbGljaXQgaW4gdGhlIHRyZWVzIGludm9sdmVkICh0aGUgcmVzdWx0IHRyZWUsIGFuZCB0aGUgcmVzdWx0IHRyZWVzCitvZiB0aGUgcGFyZW50cyksIGFuZCBkZXNjcmliaW5nIHRoYXQgbWFrZXMgbm8gc2Vuc2UgaW4gdGhpcyBpZGlvdGljCitmaWxlIG1hbmFnZXIuCisKK0EgY29tbWl0IGlzIGNyZWF0ZWQgd2l0aCBnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXSBhbmQKK2l0cyBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXS4KKworW1t0cnVzdF1dCitUcnVzdAorLS0tLS0KKworQW4gYXNpZGUgb24gdGhlIG5vdGlvbiBvZiAidHJ1c3QiLiBUcnVzdCBpcyByZWFsbHkgb3V0c2lkZSB0aGUgc2NvcGUKK29mICJnaXQiLCBidXQgaXQncyB3b3J0aCBub3RpbmcgYSBmZXcgdGhpbmdzLiAgRmlyc3Qgb2ZmLCBzaW5jZQorZXZlcnl0aGluZyBpcyBoYXNoZWQgd2l0aCBTSEExLCB5b3UgJ2NhbicgdHJ1c3QgdGhhdCBhbiBvYmplY3QgaXMKK2ludGFjdCBhbmQgaGFzIG5vdCBiZWVuIG1lc3NlZCB3aXRoIGJ5IGV4dGVybmFsIHNvdXJjZXMuICBTbyB0aGUgbmFtZQorb2YgYW4gb2JqZWN0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBrbm93biBzdGF0ZSAtIGp1c3Qgbm90IGEgc3RhdGUgdGhhdAoreW91IG1heSB3YW50IHRvIHRydXN0LgorCitGdXJ0aGVybW9yZSwgc2luY2UgdGhlIFNIQTEgc2lnbmF0dXJlIG9mIGEgY29tbWl0IHJlZmVycyB0byB0aGUKK1NIQTEgc2lnbmF0dXJlcyBvZiB0aGUgdHJlZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGggYW5kIHRoZSBzaWduYXR1cmVzCitvZiB0aGUgcGFyZW50LCBhIHNpbmdsZSBuYW1lZCBjb21taXQgc3BlY2lmaWVzIHVuaXF1ZWx5IGEgd2hvbGUgc2V0CitvZiBoaXN0b3J5LCB3aXRoIGZ1bGwgY29udGVudHMuICBZb3UgY2FuJ3QgbGF0ZXIgZmFrZSBhbnkgc3RlcCBvZiB0aGUKK3dheSBvbmNlIHlvdSBoYXZlIHRoZSBuYW1lIG9mIGEgY29tbWl0LgorCitTbyB0byBpbnRyb2R1Y2Ugc29tZSByZWFsIHRydXN0IGluIHRoZSBzeXN0ZW0sIHRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkCit0byBkbyBpcyB0byBkaWdpdGFsbHkgc2lnbiBqdXN0ICdvbmUnIHNwZWNpYWwgbm90ZSwgd2hpY2ggaW5jbHVkZXMgdGhlCituYW1lIG9mIGEgdG9wLWxldmVsIGNvbW1pdC4gIFlvdXIgZGlnaXRhbCBzaWduYXR1cmUgc2hvd3Mgb3RoZXJzCit0aGF0IHlvdSB0cnVzdCB0aGF0IGNvbW1pdCwgYW5kIHRoZSBpbW11dGFiaWxpdHkgb2YgdGhlIGhpc3Rvcnkgb2YKK2NvbW1pdHMgdGVsbHMgb3RoZXJzIHRoYXQgdGhleSBjYW4gdHJ1c3QgdGhlIHdob2xlIGhpc3RvcnkuCisKK0luIG90aGVyIHdvcmRzLCB5b3UgY2FuIGVhc2lseSB2YWxpZGF0ZSBhIHdob2xlIGFyY2hpdmUgYnkganVzdAorc2VuZGluZyBvdXQgYSBzaW5nbGUgZW1haWwgdGhhdCB0ZWxscyB0aGUgcGVvcGxlIHRoZSBuYW1lIChTSEExIGhhc2gpCitvZiB0aGUgdG9wIGNvbW1pdCwgYW5kIGRpZ2l0YWxseSBzaWduIHRoYXQgZW1haWwgdXNpbmcgc29tZXRoaW5nCitsaWtlIEdQRy9QR1AuCisKK1RvIGFzc2lzdCBpbiB0aGlzLCBnaXQgYWxzbyBwcm92aWRlcyB0aGUgdGFnIG9iamVjdC4uLgorCitbW3RhZy1vYmplY3RdXQorVGFnIE9iamVjdAorLS0tLS0tLS0tLQorCitHaXQgcHJvdmlkZXMgdGhlICJ0YWciIG9iamVjdCB0byBzaW1wbGlmeSBjcmVhdGluZywgbWFuYWdpbmcgYW5kCitleGNoYW5naW5nIHN5bWJvbGljIGFuZCBzaWduZWQgdG9rZW5zLiAgVGhlICJ0YWciIG9iamVjdCBhdCBpdHMKK3NpbXBsZXN0IHNpbXBseSBzeW1ib2xpY2FsbHkgaWRlbnRpZmllcyBhbm90aGVyIG9iamVjdCBieSBjb250YWluaW5nCit0aGUgc2hhMSwgdHlwZSBhbmQgc3ltYm9saWMgbmFtZS4KKworSG93ZXZlciBpdCBjYW4gb3B0aW9uYWxseSBjb250YWluIGFkZGl0aW9uYWwgc2lnbmF0dXJlIGluZm9ybWF0aW9uCisod2hpY2ggZ2l0IGRvZXNuJ3QgY2FyZSBhYm91dCBhcyBsb25nIGFzIHRoZXJlJ3MgbGVzcyB0aGFuIDhrIG9mCitpdCkuIFRoaXMgY2FuIHRoZW4gYmUgdmVyaWZpZWQgZXh0ZXJuYWxseSB0byBnaXQuCisKK05vdGUgdGhhdCBkZXNwaXRlIHRoZSB0YWcgZmVhdHVyZXMsICJnaXQiIGl0c2VsZiBvbmx5IGhhbmRsZXMgY29udGVudAoraW50ZWdyaXR5OyB0aGUgdHJ1c3QgZnJhbWV3b3JrIChhbmQgc2lnbmF0dXJlIHByb3Zpc2lvbiBhbmQKK3ZlcmlmaWNhdGlvbikgaGFzIHRvIGNvbWUgZnJvbSBvdXRzaWRlLgorCitBIHRhZyBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtbWt0YWdbMV0sCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0sCithbmQgdGhlIHNpZ25hdHVyZSBjYW4gYmUgdmVyaWZpZWQgYnkKK2dpdGxpbms6Z2l0LXZlcmlmeS10YWdbMV0uCisKKworW1t0aGUtaW5kZXhdXQorVGhlICJpbmRleCIgYWthICJDdXJyZW50IERpcmVjdG9yeSBDYWNoZSIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpbmRleCBpcyBhIHNpbXBsZSBiaW5hcnkgZmlsZSwgd2hpY2ggY29udGFpbnMgYW4gZWZmaWNpZW50CityZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSB2aXJ0dWFsIGRpcmVjdG9yeS4gIEl0Citkb2VzIHNvIGJ5IGEgc2ltcGxlIGFycmF5IHRoYXQgYXNzb2NpYXRlcyBhIHNldCBvZiBuYW1lcywgZGF0ZXMsCitwZXJtaXNzaW9ucyBhbmQgY29udGVudCAoYWthICJibG9iIikgb2JqZWN0cyB0b2dldGhlci4gIFRoZSBjYWNoZSBpcworYWx3YXlzIGtlcHQgb3JkZXJlZCBieSBuYW1lLCBhbmQgbmFtZXMgYXJlIHVuaXF1ZSAod2l0aCBhIGZldyB2ZXJ5CitzcGVjaWZpYyBydWxlcykgYXQgYW55IHBvaW50IGluIHRpbWUsIGJ1dCB0aGUgY2FjaGUgaGFzIG5vIGxvbmctdGVybQorbWVhbmluZywgYW5kIGNhbiBiZSBwYXJ0aWFsbHkgdXBkYXRlZCBhdCBhbnkgdGltZS4KKworSW4gcGFydGljdWxhciwgdGhlIGluZGV4IGNlcnRhaW5seSBkb2VzIG5vdCBuZWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAordGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRlbnRzIChpbiBmYWN0LCBtb3N0IG9wZXJhdGlvbnMgd2lsbCBkZXBlbmQgb24KK2RpZmZlcmVudCB3YXlzIHRvIG1ha2UgdGhlIGluZGV4ICdub3QnIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGlyZWN0b3J5CitoaWVyYXJjaHkpLCBidXQgaXQgaGFzIHRocmVlIHZlcnkgaW1wb3J0YW50IGF0dHJpYnV0ZXM6CisKKycoYSkgaXQgY2FuIHJlLWdlbmVyYXRlIHRoZSBmdWxsIHN0YXRlIGl0IGNhY2hlcyAobm90IGp1c3QgdGhlCitkaXJlY3Rvcnkgc3RydWN0dXJlOiBpdCBjb250YWlucyBwb2ludGVycyB0byB0aGUgImJsb2IiIG9iamVjdHMgc28KK3RoYXQgaXQgY2FuIHJlZ2VuZXJhdGUgdGhlIGRhdGEgdG9vKScKKworQXMgYSBzcGVjaWFsIGNhc2UsIHRoZXJlIGlzIGEgY2xlYXIgYW5kIHVuYW1iaWd1b3VzIG9uZS13YXkgbWFwcGluZworZnJvbSBhIGN1cnJlbnQgZGlyZWN0b3J5IGNhY2hlIHRvIGEgInRyZWUgb2JqZWN0Iiwgd2hpY2ggY2FuIGJlCitlZmZpY2llbnRseSBjcmVhdGVkIGZyb20ganVzdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgY2FjaGUgd2l0aG91dAorYWN0dWFsbHkgbG9va2luZyBhdCBhbnkgb3RoZXIgZGF0YS4gIFNvIGEgZGlyZWN0b3J5IGNhY2hlIGF0IGFueSBvbmUKK3RpbWUgdW5pcXVlbHkgc3BlY2lmaWVzIG9uZSBhbmQgb25seSBvbmUgInRyZWUiIG9iamVjdCAoYnV0IGhhcworYWRkaXRpb25hbCBkYXRhIHRvIG1ha2UgaXQgZWFzeSB0byBtYXRjaCB1cCB0aGF0IHRyZWUgb2JqZWN0IHdpdGggd2hhdAoraGFzIGhhcHBlbmVkIGluIHRoZSBkaXJlY3RvcnkpCisKKycoYikgaXQgaGFzIGVmZmljaWVudCBtZXRob2RzIGZvciBmaW5kaW5nIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHRoYXQKK2NhY2hlZCBzdGF0ZSAoInRyZWUgb2JqZWN0IHdhaXRpbmcgdG8gYmUgaW5zdGFudGlhdGVkIikgYW5kIHRoZQorY3VycmVudCBzdGF0ZS4nCisKKycoYykgaXQgY2FuIGFkZGl0aW9uYWxseSBlZmZpY2llbnRseSByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgbWVyZ2UKK2NvbmZsaWN0cyBiZXR3ZWVuIGRpZmZlcmVudCB0cmVlIG9iamVjdHMsIGFsbG93aW5nIGVhY2ggcGF0aG5hbWUgdG8gYmUKK2Fzc29jaWF0ZWQgd2l0aCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmVlcyBpbnZvbHZlZCB0aGF0Cit5b3UgY2FuIGNyZWF0ZSBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIHRoZW0uJworCitUaG9zZSBhcmUgdGhlIE9OTFkgdGhyZWUgdGhpbmdzIHRoYXQgdGhlIGRpcmVjdG9yeSBjYWNoZSBkb2VzLiAgSXQncyBhCitjYWNoZSwgYW5kIHRoZSBub3JtYWwgb3BlcmF0aW9uIGlzIHRvIHJlLWdlbmVyYXRlIGl0IGNvbXBsZXRlbHkgZnJvbSBhCitrbm93biB0cmVlIG9iamVjdCwgb3IgdXBkYXRlL2NvbXBhcmUgaXQgd2l0aCBhIGxpdmUgdHJlZSB0aGF0IGlzIGJlaW5nCitkZXZlbG9wZWQuICBJZiB5b3UgYmxvdyB0aGUgZGlyZWN0b3J5IGNhY2hlIGF3YXkgZW50aXJlbHksIHlvdSBnZW5lcmFsbHkKK2hhdmVuJ3QgbG9zdCBhbnkgaW5mb3JtYXRpb24gYXMgbG9uZyBhcyB5b3UgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgdHJlZQordGhhdCBpdCBkZXNjcmliZWQuIAorCitBdCB0aGUgc2FtZSB0aW1lLCB0aGUgaW5kZXggaXMgYXQgdGhlIHNhbWUgdGltZSBhbHNvIHRoZQorc3RhZ2luZyBhcmVhIGZvciBjcmVhdGluZyBuZXcgdHJlZXMsIGFuZCBjcmVhdGluZyBhIG5ldyB0cmVlIGFsd2F5cworaW52b2x2ZXMgYSBjb250cm9sbGVkIG1vZGlmaWNhdGlvbiBvZiB0aGUgaW5kZXggZmlsZS4gIEluIHBhcnRpY3VsYXIsCit0aGUgaW5kZXggZmlsZSBjYW4gaGF2ZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZXJtZWRpYXRlIHRyZWUgdGhhdAoraGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQuICBTbyB0aGUgaW5kZXggY2FuIGJlIHRob3VnaHQgb2YgYXMgYQord3JpdGUtYmFjayBjYWNoZSwgd2hpY2ggY2FuIGNvbnRhaW4gZGlydHkgaW5mb3JtYXRpb24gdGhhdCBoYXMgbm90IHlldAorYmVlbiB3cml0dGVuIGJhY2sgdG8gdGhlIGJhY2tpbmcgc3RvcmUuCisKKworCitbW3RoZS13b3JrZmxvd11dCitUaGUgV29ya2Zsb3cKKy0tLS0tLS0tLS0tLQorCitHZW5lcmFsbHksIGFsbCAiZ2l0IiBvcGVyYXRpb25zIHdvcmsgb24gdGhlIGluZGV4IGZpbGUuIFNvbWUgb3BlcmF0aW9ucword29yayAqcHVyZWx5KiBvbiB0aGUgaW5kZXggZmlsZSAoc2hvd2luZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKK2luZGV4KSwgYnV0IG1vc3Qgb3BlcmF0aW9ucyBtb3ZlIGRhdGEgdG8gYW5kIGZyb20gdGhlIGluZGV4IGZpbGUuIEVpdGhlcgorZnJvbSB0aGUgZGF0YWJhc2Ugb3IgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkuIFRodXMgdGhlcmUgYXJlIGZvdXIKK21haW4gY29tYmluYXRpb25zOiAKKworW1t3b3JraW5nLWRpcmVjdG9yeS10by1pbmRleF1dCit3b3JraW5nIGRpcmVjdG9yeSAtPiBpbmRleAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aXRoCit0aGUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdIGNvbW1hbmQuICBZb3UKK2dlbmVyYWxseSB1cGRhdGUgdGhlIGluZGV4IGluZm9ybWF0aW9uIGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUKK3lvdSB3YW50IHRvIHVwZGF0ZSwgbGlrZSBzbzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IGZpbGVuYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0byBhdm9pZCBjb21tb24gbWlzdGFrZXMgd2l0aCBmaWxlbmFtZSBnbG9iYmluZyBldGMsIHRoZSBjb21tYW5kCit3aWxsIG5vdCBub3JtYWxseSBhZGQgdG90YWxseSBuZXcgZW50cmllcyBvciByZW1vdmUgb2xkIGVudHJpZXMsCitpLmUuIGl0IHdpbGwgbm9ybWFsbHkganVzdCB1cGRhdGUgZXhpc3RpbmcgY2FjaGUgZW50cmllcy4KKworVG8gdGVsbCBnaXQgdGhhdCB5ZXMsIHlvdSByZWFsbHkgZG8gcmVhbGl6ZSB0aGF0IGNlcnRhaW4gZmlsZXMgbm8KK2xvbmdlciBleGlzdCwgb3IgdGhhdCBuZXcgZmlsZXMgc2hvdWxkIGJlIGFkZGVkLCB5b3UKK3Nob3VsZCB1c2UgdGhlIGAtLXJlbW92ZWAgYW5kIGAtLWFkZGAgZmxhZ3MgcmVzcGVjdGl2ZWx5LgorCitOT1RFISBBIGAtLXJlbW92ZWAgZmxhZyBkb2VzICdub3QnIG1lYW4gdGhhdCBzdWJzZXF1ZW50IGZpbGVuYW1lcyB3aWxsCituZWNlc3NhcmlseSBiZSByZW1vdmVkOiBpZiB0aGUgZmlsZXMgc3RpbGwgZXhpc3QgaW4geW91ciBkaXJlY3RvcnkKK3N0cnVjdHVyZSwgdGhlIGluZGV4IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZWlyIG5ldyBzdGF0dXMsIG5vdAorcmVtb3ZlZC4gVGhlIG9ubHkgdGhpbmcgYC0tcmVtb3ZlYCBtZWFucyBpcyB0aGF0IHVwZGF0ZS1jYWNoZSB3aWxsIGJlCitjb25zaWRlcmluZyBhIHJlbW92ZWQgZmlsZSB0byBiZSBhIHZhbGlkIHRoaW5nLCBhbmQgaWYgdGhlIGZpbGUgcmVhbGx5Citkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgaXQgd2lsbCB1cGRhdGUgdGhlIGluZGV4IGFjY29yZGluZ2x5LgorCitBcyBhIHNwZWNpYWwgY2FzZSwgeW91IGNhbiBhbHNvIGRvIGBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaGAsIHdoaWNoCit3aWxsIHJlZnJlc2ggdGhlICJzdGF0IiBpbmZvcm1hdGlvbiBvZiBlYWNoIGluZGV4IHRvIG1hdGNoIHRoZSBjdXJyZW50CitzdGF0IGluZm9ybWF0aW9uLiBJdCB3aWxsICdub3QnIHVwZGF0ZSB0aGUgb2JqZWN0IHN0YXR1cyBpdHNlbGYsIGFuZAoraXQgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQgdG8gcXVpY2tseSB0ZXN0IHdoZXRoZXIKK2FuIG9iamVjdCBzdGlsbCBtYXRjaGVzIGl0cyBvbGQgYmFja2luZyBzdG9yZSBvYmplY3QuCisKK1tbaW5kZXgtdG8tb2JqZWN0LWRhdGFiYXNlXV0KK2luZGV4IC0+IG9iamVjdCBkYXRhYmFzZQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSB3cml0ZSB5b3VyIGN1cnJlbnQgaW5kZXggZmlsZSB0byBhICJ0cmVlIiBvYmplY3Qgd2l0aCB0aGUgcHJvZ3JhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC13cml0ZS10cmVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoYXQgZG9lc24ndCBjb21lIHdpdGggYW55IG9wdGlvbnMgLSBpdCB3aWxsIGp1c3Qgd3JpdGUgb3V0IHRoZQorY3VycmVudCBpbmRleCBpbnRvIHRoZSBzZXQgb2YgdHJlZSBvYmplY3RzIHRoYXQgZGVzY3JpYmUgdGhhdCBzdGF0ZSwKK2FuZCBpdCB3aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIHRvcC1sZXZlbCB0cmVlLiBZb3UgY2FuCit1c2UgdGhhdCB0cmVlIHRvIHJlLWdlbmVyYXRlIHRoZSBpbmRleCBhdCBhbnkgdGltZSBieSBnb2luZyBpbiB0aGUKK290aGVyIGRpcmVjdGlvbjoKKworW1tvYmplY3QtZGF0YWJhc2UtdG8taW5kZXhdXQorb2JqZWN0IGRhdGFiYXNlIC0+IGluZGV4Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHJlYWQgYSAidHJlZSIgZmlsZSBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UsIGFuZCB1c2UgdGhhdCB0bworcG9wdWxhdGUgKGFuZCBvdmVyd3JpdGUgLSBkb24ndCBkbyB0aGlzIGlmIHlvdXIgaW5kZXggY29udGFpbnMgYW55Cit1bnNhdmVkIHN0YXRlIHRoYXQgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdG9yZSBsYXRlciEpIHlvdXIgY3VycmVudAoraW5kZXguICBOb3JtYWwgb3BlcmF0aW9uIGlzIGp1c3QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIDxzaGExIG9mIHRyZWU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3VyIGluZGV4IGZpbGUgd2lsbCBub3cgYmUgZXF1aXZhbGVudCB0byB0aGUgdHJlZSB0aGF0IHlvdSBzYXZlZAorZWFybGllci4gSG93ZXZlciwgdGhhdCBpcyBvbmx5IHlvdXIgJ2luZGV4JyBmaWxlOiB5b3VyIHdvcmtpbmcKK2RpcmVjdG9yeSBjb250ZW50cyBoYXZlIG5vdCBiZWVuIG1vZGlmaWVkLgorCitbW2luZGV4LXRvLXdvcmtpbmctZGlyZWN0b3J5XV0KK2luZGV4IC0+IHdvcmtpbmcgZGlyZWN0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitZb3UgdXBkYXRlIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgZnJvbSB0aGUgaW5kZXggYnkgImNoZWNraW5nIG91dCIKK2ZpbGVzLiBUaGlzIGlzIG5vdCBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbiwgc2luY2Ugbm9ybWFsbHkgeW91J2QganVzdAora2VlcCB5b3VyIGZpbGVzIHVwZGF0ZWQsIGFuZCByYXRoZXIgdGhhbiB3cml0ZSB0byB5b3VyIHdvcmtpbmcKK2RpcmVjdG9yeSwgeW91J2QgdGVsbCB0aGUgaW5kZXggZmlsZXMgYWJvdXQgdGhlIGNoYW5nZXMgaW4geW91cgord29ya2luZyBkaXJlY3RvcnkgKGkuZS4gYGdpdC11cGRhdGUtaW5kZXhgKS4KKworSG93ZXZlciwgaWYgeW91IGRlY2lkZSB0byBqdW1wIHRvIGEgbmV3IHZlcnNpb24sIG9yIGNoZWNrIG91dCBzb21lYm9keQorZWxzZSdzIHZlcnNpb24sIG9yIGp1c3QgcmVzdG9yZSBhIHByZXZpb3VzIHRyZWUsIHlvdSdkIHBvcHVsYXRlIHlvdXIKK2luZGV4IGZpbGUgd2l0aCByZWFkLXRyZWUsIGFuZCB0aGVuIHlvdSBuZWVkIHRvIGNoZWNrIG91dCB0aGUgcmVzdWx0Cit3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IGZpbGVuYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yLCBpZiB5b3Ugd2FudCB0byBjaGVjayBvdXQgYWxsIG9mIHRoZSBpbmRleCwgdXNlIGAtYWAuCisKK05PVEUhIGdpdC1jaGVja291dC1pbmRleCBub3JtYWxseSByZWZ1c2VzIHRvIG92ZXJ3cml0ZSBvbGQgZmlsZXMsIHNvCitpZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgdHJlZSBhbHJlYWR5IGNoZWNrZWQgb3V0LCB5b3Ugd2lsbAorbmVlZCB0byB1c2UgdGhlICItZiIgZmxhZyAoJ2JlZm9yZScgdGhlICItYSIgZmxhZyBvciB0aGUgZmlsZW5hbWUpIHRvCisnZm9yY2UnIHRoZSBjaGVja291dC4KKworCitGaW5hbGx5LCB0aGVyZSBhcmUgYSBmZXcgb2RkcyBhbmQgZW5kcyB3aGljaCBhcmUgbm90IHB1cmVseSBtb3ZpbmcKK2Zyb20gb25lIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBvdGhlcjoKKworW1t0eWluZy1pdC1hbGwtdG9nZXRoZXJdXQorVHlpbmcgaXQgYWxsIHRvZ2V0aGVyCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVG8gY29tbWl0IGEgdHJlZSB5b3UgaGF2ZSBpbnN0YW50aWF0ZWQgd2l0aCAiZ2l0LXdyaXRlLXRyZWUiLCB5b3UnZAorY3JlYXRlIGEgImNvbW1pdCIgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoYXQgdHJlZSBhbmQgdGhlIGhpc3RvcnkKK2JlaGluZCBpdCAtIG1vc3Qgbm90YWJseSB0aGUgInBhcmVudCIgY29tbWl0cyB0aGF0IHByZWNlZGVkIGl0IGluCitoaXN0b3J5LgorCitOb3JtYWxseSBhICJjb21taXQiIGhhcyBvbmUgcGFyZW50OiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHRyZWUKK2JlZm9yZSBhIGNlcnRhaW4gY2hhbmdlIHdhcyBtYWRlLiBIb3dldmVyLCBzb21ldGltZXMgaXQgY2FuIGhhdmUgdHdvCitvciBtb3JlIHBhcmVudCBjb21taXRzLCBpbiB3aGljaCBjYXNlIHdlIGNhbGwgaXQgYSAibWVyZ2UiLCBkdWUgdG8gdGhlCitmYWN0IHRoYXQgc3VjaCBhIGNvbW1pdCBicmluZ3MgdG9nZXRoZXIgKCJtZXJnZXMiKSB0d28gb3IgbW9yZQorcHJldmlvdXMgc3RhdGVzIHJlcHJlc2VudGVkIGJ5IG90aGVyIGNvbW1pdHMuCisKK0luIG90aGVyIHdvcmRzLCB3aGlsZSBhICJ0cmVlIiByZXByZXNlbnRzIGEgcGFydGljdWxhciBkaXJlY3Rvcnkgc3RhdGUKK29mIGEgd29ya2luZyBkaXJlY3RvcnksIGEgImNvbW1pdCIgcmVwcmVzZW50cyB0aGF0IHN0YXRlIGluICJ0aW1lIiwKK2FuZCBleHBsYWlucyBob3cgd2UgZ290IHRoZXJlLgorCitZb3UgY3JlYXRlIGEgY29tbWl0IG9iamVjdCBieSBnaXZpbmcgaXQgdGhlIHRyZWUgdGhhdCBkZXNjcmliZXMgdGhlCitzdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgY29tbWl0LCBhbmQgYSBsaXN0IG9mIHBhcmVudHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNvbW1pdC10cmVlIDx0cmVlPiAtcCA8cGFyZW50PiBbLXAgPHBhcmVudDI+IC4uXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhlbiBnaXZpbmcgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbW1pdCBvbiBzdGRpbiAoZWl0aGVyIHRocm91Z2gKK3JlZGlyZWN0aW9uIGZyb20gYSBwaXBlIG9yIGZpbGUsIG9yIGJ5IGp1c3QgdHlwaW5nIGl0IGF0IHRoZSB0dHkpLgorCitnaXQtY29tbWl0LXRyZWUgd2lsbCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMKK3RoYXQgY29tbWl0LCBhbmQgeW91IHNob3VsZCBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZS4gTm9ybWFsbHksCit5b3UnZCBjb21taXQgYSBuZXcgYEhFQURgIHN0YXRlLCBhbmQgd2hpbGUgZ2l0IGRvZXNuJ3QgY2FyZSB3aGVyZSB5b3UKK3NhdmUgdGhlIG5vdGUgYWJvdXQgdGhhdCBzdGF0ZSwgaW4gcHJhY3RpY2Ugd2UgdGVuZCB0byBqdXN0IHdyaXRlIHRoZQorcmVzdWx0IHRvIHRoZSBmaWxlIHBvaW50ZWQgYXQgYnkgYC5naXQvSEVBRGAsIHNvIHRoYXQgd2UgY2FuIGFsd2F5cyBzZWUKK3doYXQgdGhlIGxhc3QgY29tbWl0dGVkIHN0YXRlIHdhcy4KKworSGVyZSBpcyBhbiBBU0NJSSBhcnQgYnkgSm9uIExvZWxpZ2VyIHRoYXQgaWxsdXN0cmF0ZXMgaG93Cit2YXJpb3VzIHBpZWNlcyBmaXQgdG9nZXRoZXIuCisKKy0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgICAgICBjb21taXQtdHJlZQorICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCBvYmoKKyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgViAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCBPYmplY3QgREIgfAorICAgICAgICAgICAgICAgICAgICB8ICBCYWNraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgICBTdG9yZSAgIHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgIHdyaXRlLXRyZWUgIHwgICAgIHwKKyAgICAgICAgICAgICB0cmVlIG9iaiAgfCAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICByZWFkLXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgdHJlZSBvYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgICBJbmRleCAgIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgImNhY2hlIiAgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICB1cGRhdGUtaW5kZXggIF4KKyAgICAgICAgICAgICBibG9iIG9iaiAgfCAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8CisgICAgY2hlY2tvdXQtaW5kZXggLXUgIHwgICAgIHwgIGNoZWNrb3V0LWluZGV4CisgICAgICAgICAgICAgc3RhdCAgICAgIHwgICAgIHwgIGJsb2Igb2JqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8ICBXb3JraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgRGlyZWN0b3J5IHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworCistLS0tLS0tLS0tLS0KKworCitbW2V4YW1pbmluZy10aGUtZGF0YV1dCitFeGFtaW5pbmcgdGhlIGRhdGEKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGV4YW1pbmUgdGhlIGRhdGEgcmVwcmVzZW50ZWQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZSBhbmQgdGhlCitpbmRleCB3aXRoIHZhcmlvdXMgaGVscGVyIHRvb2xzLiBGb3IgZXZlcnkgb2JqZWN0LCB5b3UgY2FuIHVzZQorZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0gdG8gZXhhbWluZSBkZXRhaWxzIGFib3V0IHRoZQorb2JqZWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSAtdCA8b2JqZWN0bmFtZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2hvd3MgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCwgYW5kIG9uY2UgeW91IGhhdmUgdGhlIHR5cGUgKHdoaWNoIGlzCit1c3VhbGx5IGltcGxpY2l0IGluIHdoZXJlIHlvdSBmaW5kIHRoZSBvYmplY3QpLCB5b3UgY2FuIHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSBibG9ifHRyZWV8Y29tbWl0fHRhZyA8b2JqZWN0bmFtZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gc2hvdyBpdHMgY29udGVudHMuIE5PVEUhIFRyZWVzIGhhdmUgYmluYXJ5IGNvbnRlbnQsIGFuZCBhcyBhIHJlc3VsdAordGhlcmUgaXMgYSBzcGVjaWFsIGhlbHBlciBmb3Igc2hvd2luZyB0aGF0IGNvbnRlbnQsIGNhbGxlZAorYGdpdC1scy10cmVlYCwgd2hpY2ggdHVybnMgdGhlIGJpbmFyeSBjb250ZW50IGludG8gYSBtb3JlIGVhc2lseQorcmVhZGFibGUgZm9ybS4KKworSXQncyBlc3BlY2lhbGx5IGluc3RydWN0aXZlIHRvIGxvb2sgYXQgImNvbW1pdCIgb2JqZWN0cywgc2luY2UgdGhvc2UKK3RlbmQgdG8gYmUgc21hbGwgYW5kIGZhaXJseSBzZWxmLWV4cGxhbmF0b3J5LiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UKK2ZvbGxvdyB0aGUgY29udmVudGlvbiBvZiBoYXZpbmcgdGhlIHRvcCBjb21taXQgbmFtZSBpbiBgLmdpdC9IRUFEYCwKK3lvdSBjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgY29tbWl0IEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gc2VlIHdoYXQgdGhlIHRvcCBjb21taXQgd2FzLgorCitbW21lcmdpbmctbXVsdGlwbGUtdHJlZXNdXQorTWVyZ2luZyBtdWx0aXBsZSB0cmVlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgaGVscHMgeW91IGRvIGEgdGhyZWUtd2F5IG1lcmdlLCB3aGljaCB5b3UgY2FuIGV4cGFuZCB0byBuLXdheSBieQorcmVwZWF0aW5nIHRoZSBtZXJnZSBwcm9jZWR1cmUgYXJiaXRyYXJ5IHRpbWVzIHVudGlsIHlvdSBmaW5hbGx5CisiY29tbWl0IiB0aGUgc3RhdGUuICBUaGUgbm9ybWFsIHNpdHVhdGlvbiBpcyB0aGF0IHlvdSdkIG9ubHkgZG8gb25lCit0aHJlZS13YXkgbWVyZ2UgKHR3byBwYXJlbnRzKSwgYW5kIGNvbW1pdCBpdCwgYnV0IGlmIHlvdSBsaWtlIHRvLCB5b3UKK2NhbiBkbyBtdWx0aXBsZSBwYXJlbnRzIGluIG9uZSBnby4KKworVG8gZG8gYSB0aHJlZS13YXkgbWVyZ2UsIHlvdSBuZWVkIHRoZSB0d28gc2V0cyBvZiAiY29tbWl0IiBvYmplY3RzCit0aGF0IHlvdSB3YW50IHRvIG1lcmdlLCB1c2UgdGhvc2UgdG8gZmluZCB0aGUgY2xvc2VzdCBjb21tb24gcGFyZW50IChhCit0aGlyZCAiY29tbWl0IiBvYmplY3QpLCBhbmQgdGhlbiB1c2UgdGhvc2UgY29tbWl0IG9iamVjdHMgdG8gZmluZCB0aGUKK3N0YXRlIG9mIHRoZSBkaXJlY3RvcnkgKCJ0cmVlIiBvYmplY3QpIGF0IHRoZXNlIHBvaW50cy4KKworVG8gZ2V0IHRoZSAiYmFzZSIgZm9yIHRoZSBtZXJnZSwgeW91IGZpcnN0IGxvb2sgdXAgdGhlIGNvbW1vbiBwYXJlbnQKK29mIHR3byBjb21taXRzIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtbWVyZ2UtYmFzZSA8Y29tbWl0MT4gPGNvbW1pdDI+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgcmV0dXJuIHlvdSB0aGUgY29tbWl0IHRoZXkgYXJlIGJvdGggYmFzZWQgb24uICBZb3Ugc2hvdWxkCitub3cgbG9vayB1cCB0aGUgInRyZWUiIG9iamVjdHMgb2YgdGhvc2UgY29tbWl0cywgd2hpY2ggeW91IGNhbiBlYXNpbHkKK2RvIHdpdGggKGZvciBleGFtcGxlKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSBjb21taXQgPGNvbW1pdG5hbWU+IHwgaGVhZCAtMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaW5jZSB0aGUgdHJlZSBvYmplY3QgaW5mb3JtYXRpb24gaXMgYWx3YXlzIHRoZSBmaXJzdCBsaW5lIGluIGEgY29tbWl0CitvYmplY3QuCisKK09uY2UgeW91IGtub3cgdGhlIHRocmVlIHRyZWVzIHlvdSBhcmUgZ29pbmcgdG8gbWVyZ2UgKHRoZSBvbmUgIm9yaWdpbmFsIgordHJlZSwgYWthIHRoZSBjb21tb24gdHJlZSwgYW5kIHRoZSB0d28gInJlc3VsdCIgdHJlZXMsIGFrYSB0aGUgYnJhbmNoZXMKK3lvdSB3YW50IHRvIG1lcmdlKSwgeW91IGRvIGEgIm1lcmdlIiByZWFkIGludG8gdGhlIGluZGV4LiBUaGlzIHdpbGwKK2NvbXBsYWluIGlmIGl0IGhhcyB0byB0aHJvdyBhd2F5IHlvdXIgb2xkIGluZGV4IGNvbnRlbnRzLCBzbyB5b3Ugc2hvdWxkCittYWtlIHN1cmUgdGhhdCB5b3UndmUgY29tbWl0dGVkIHRob3NlIC0gaW4gZmFjdCB5b3Ugd291bGQgbm9ybWFsbHkKK2Fsd2F5cyBkbyBhIG1lcmdlIGFnYWluc3QgeW91ciBsYXN0IGNvbW1pdCAod2hpY2ggc2hvdWxkIHRodXMgbWF0Y2ggd2hhdAoreW91IGhhdmUgaW4geW91ciBjdXJyZW50IGluZGV4IGFueXdheSkuCisKK1RvIGRvIHRoZSBtZXJnZSwgZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIC11IDxvcmlndHJlZT4gPHlvdXJ0cmVlPiA8dGFyZ2V0dHJlZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBkbyBhbGwgdHJpdmlhbCBtZXJnZSBvcGVyYXRpb25zIGZvciB5b3UgZGlyZWN0bHkgaW4gdGhlCitpbmRleCBmaWxlLCBhbmQgeW91IGNhbiBqdXN0IHdyaXRlIHRoZSByZXN1bHQgb3V0IHdpdGgKK2BnaXQtd3JpdGUtdHJlZWAuCisKKworW1ttZXJnaW5nLW11bHRpcGxlLXRyZWVzLTJdXQorTWVyZ2luZyBtdWx0aXBsZSB0cmVlcywgY29udGludWVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2FkbHksIG1hbnkgbWVyZ2VzIGFyZW4ndCB0cml2aWFsLiBJZiB0aGVyZSBhcmUgZmlsZXMgdGhhdCBoYXZlCitiZWVuIGFkZGVkLm1vdmVkIG9yIHJlbW92ZWQsIG9yIGlmIGJvdGggYnJhbmNoZXMgaGF2ZSBtb2RpZmllZCB0aGUKK3NhbWUgZmlsZSwgeW91IHdpbGwgYmUgbGVmdCB3aXRoIGFuIGluZGV4IHRyZWUgdGhhdCBjb250YWlucyAibWVyZ2UKK2VudHJpZXMiIGluIGl0LiBTdWNoIGFuIGluZGV4IHRyZWUgY2FuICdOT1QnIGJlIHdyaXR0ZW4gb3V0IHRvIGEgdHJlZQorb2JqZWN0LCBhbmQgeW91IHdpbGwgaGF2ZSB0byByZXNvbHZlIGFueSBzdWNoIG1lcmdlIGNsYXNoZXMgdXNpbmcKK290aGVyIHRvb2xzIGJlZm9yZSB5b3UgY2FuIHdyaXRlIG91dCB0aGUgcmVzdWx0LgorCitZb3UgY2FuIGV4YW1pbmUgc3VjaCBpbmRleCBzdGF0ZSB3aXRoIGBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZGAKK2NvbW1hbmQuICBBbiBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAkb3JpZyBIRUFEICR0YXJnZXQKKyQgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQKKzEwMDY0NCAyNjM0MTRmNDIzZDBlNGQ3MGRhZThmZTUzZmEzNDYxNGZmM2UyODYwIDEJaGVsbG8uYworMTAwNjQ0IDA2ZmE2YTI0MjU2ZGM3ZTU2MGVmYTU2ODdmYTg0YjUxZjAyNjNjM2EgMgloZWxsby5jCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGxpbmUgb2YgdGhlIGBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZGAgb3V0cHV0IGJlZ2lucyB3aXRoCit0aGUgYmxvYiBtb2RlIGJpdHMsIGJsb2IgU0hBMSwgJ3N0YWdlIG51bWJlcicsIGFuZCB0aGUKK2ZpbGVuYW1lLiAgVGhlICdzdGFnZSBudW1iZXInIGlzIGdpdCdzIHdheSB0byBzYXkgd2hpY2ggdHJlZSBpdAorY2FtZSBmcm9tOiBzdGFnZSAxIGNvcnJlc3BvbmRzIHRvIGAkb3JpZ2AgdHJlZSwgc3RhZ2UgMiBgSEVBRGAKK3RyZWUsIGFuZCBzdGFnZTMgYCR0YXJnZXRgIHRyZWUuCisKK0VhcmxpZXIgd2Ugc2FpZCB0aGF0IHRyaXZpYWwgbWVyZ2VzIGFyZSBkb25lIGluc2lkZQorYGdpdC1yZWFkLXRyZWUgLW1gLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBmaWxlIGRpZCBub3QgY2hhbmdlCitmcm9tIGAkb3JpZ2AgdG8gYEhFQURgIG5vciBgJHRhcmdldGAsIG9yIGlmIHRoZSBmaWxlIGNoYW5nZWQKK2Zyb20gYCRvcmlnYCB0byBgSEVBRGAgYW5kIGAkb3JpZ2AgdG8gYCR0YXJnZXRgIHRoZSBzYW1lIHdheSwKK29idmlvdXNseSB0aGUgZmluYWwgb3V0Y29tZSBpcyB3aGF0IGlzIGluIGBIRUFEYC4gIFdoYXQgdGhlCithYm92ZSBleGFtcGxlIHNob3dzIGlzIHRoYXQgZmlsZSBgaGVsbG8uY2Agd2FzIGNoYW5nZWQgZnJvbQorYCRvcmlnYCB0byBgSEVBRGAgYW5kIGAkb3JpZ2AgdG8gYCR0YXJnZXRgIGluIGEgZGlmZmVyZW50IHdheS4KK1lvdSBjb3VsZCByZXNvbHZlIHRoaXMgYnkgcnVubmluZyB5b3VyIGZhdm9yaXRlIDMtd2F5IG1lcmdlCitwcm9ncmFtLCBlLmcuICBgZGlmZjNgLCBgbWVyZ2VgLCBvciBnaXQncyBvd24gbWVyZ2UtZmlsZSwgb24KK3RoZSBibG9iIG9iamVjdHMgZnJvbSB0aGVzZSB0aHJlZSBzdGFnZXMgeW91cnNlbGYsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSBibG9iIDI2MzQxNGYuLi4gPmhlbGxvLmN+MQorJCBnaXQtY2F0LWZpbGUgYmxvYiAwNmZhNmEyLi4uID5oZWxsby5jfjIKKyQgZ2l0LWNhdC1maWxlIGJsb2IgY2M0NGM3My4uLiA+aGVsbG8uY34zCiskIGdpdCBtZXJnZS1maWxlIGhlbGxvLmN+MiBoZWxsby5jfjEgaGVsbG8uY34zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3b3VsZCBsZWF2ZSB0aGUgbWVyZ2UgcmVzdWx0IGluIGBoZWxsby5jfjJgIGZpbGUsIGFsb25nCit3aXRoIGNvbmZsaWN0IG1hcmtlcnMgaWYgdGhlcmUgYXJlIGNvbmZsaWN0cy4gIEFmdGVyIHZlcmlmeWluZwordGhlIG1lcmdlIHJlc3VsdCBtYWtlcyBzZW5zZSwgeW91IGNhbiB0ZWxsIGdpdCB3aGF0IHRoZSBmaW5hbAorbWVyZ2UgcmVzdWx0IGZvciB0aGlzIGZpbGUgaXMgYnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbXYgLWYgaGVsbG8uY34yIGhlbGxvLmMKKyQgZ2l0LXVwZGF0ZS1pbmRleCBoZWxsby5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gYSBwYXRoIGlzIGluIHVubWVyZ2VkIHN0YXRlLCBydW5uaW5nIGBnaXQtdXBkYXRlLWluZGV4YCBmb3IKK3RoYXQgcGF0aCB0ZWxscyBnaXQgdG8gbWFyayB0aGUgcGF0aCByZXNvbHZlZC4KKworVGhlIGFib3ZlIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGdpdCBtZXJnZSBhdCB0aGUgbG93ZXN0IGxldmVsLAordG8gaGVscCB5b3UgdW5kZXJzdGFuZCB3aGF0IGNvbmNlcHR1YWxseSBoYXBwZW5zIHVuZGVyIHRoZSBob29kLgorSW4gcHJhY3RpY2UsIG5vYm9keSwgbm90IGV2ZW4gZ2l0IGl0c2VsZiwgdXNlcyB0aHJlZSBgZ2l0LWNhdC1maWxlYAorZm9yIHRoaXMuICBUaGVyZSBpcyBgZ2l0LW1lcmdlLWluZGV4YCBwcm9ncmFtIHRoYXQgZXh0cmFjdHMgdGhlCitzdGFnZXMgdG8gdGVtcG9yYXJ5IGZpbGVzIGFuZCBjYWxscyBhICJtZXJnZSIgc2NyaXB0IG9uIGl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1tZXJnZS1pbmRleCBnaXQtbWVyZ2Utb25lLWZpbGUgaGVsbG8uYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhhdCBpcyB3aGF0IGhpZ2hlciBsZXZlbCBgZ2l0IG1lcmdlIC1zIHJlc29sdmVgIGlzIGltcGxlbWVudGVkIHdpdGguCisKK1tbcGFjay1maWxlc11dCitIb3cgZ2l0IHN0b3JlcyBvYmplY3RzIGVmZmljaWVudGx5OiBwYWNrIGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlJ3ZlIHNlZW4gaG93IGdpdCBzdG9yZXMgZWFjaCBvYmplY3QgaW4gYSBmaWxlIG5hbWVkIGFmdGVyIHRoZQorb2JqZWN0J3MgU0hBMSBoYXNoLgorCitVbmZvcnR1bmF0ZWx5IHRoaXMgc3lzdGVtIGJlY29tZXMgaW5lZmZpY2llbnQgb25jZSBhIHByb2plY3QgaGFzIGEKK2xvdCBvZiBvYmplY3RzLiAgVHJ5IHRoaXMgb24gYW4gb2xkIHByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY291bnQtb2JqZWN0cworNjkzMCBvYmplY3RzLCA0NzYyMCBraWxvYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB3aGljaCBhcmUga2VwdCBpbgoraW5kaXZpZHVhbCBmaWxlcy4gIFRoZSBzZWNvbmQgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0YWtlbiB1cCBieQordGhvc2UgImxvb3NlIiBvYmplY3RzLgorCitZb3UgY2FuIHNhdmUgc3BhY2UgYW5kIG1ha2UgZ2l0IGZhc3RlciBieSBtb3ZpbmcgdGhlc2UgbG9vc2Ugb2JqZWN0cyBpbgordG8gYSAicGFjayBmaWxlIiwgd2hpY2ggc3RvcmVzIGEgZ3JvdXAgb2Ygb2JqZWN0cyBpbiBhbiBlZmZpY2llbnQKK2NvbXByZXNzZWQgZm9ybWF0OyB0aGUgZGV0YWlscyBvZiBob3cgcGFjayBmaWxlcyBhcmUgZm9ybWF0dGVkIGNhbiBiZQorZm91bmQgaW4gbGluazp0ZWNobmljYWwvcGFjay1mb3JtYXQudHh0W3RlY2huaWNhbC9wYWNrLWZvcm1hdC50eHRdLgorCitUbyBwdXQgdGhlIGxvb3NlIG9iamVjdHMgaW50byBhIHBhY2ssIGp1c3QgcnVuIGdpdCByZXBhY2s6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrCitHZW5lcmF0aW5nIHBhY2suLi4KK0RvbmUgY291bnRpbmcgNjAyMCBvYmplY3RzLgorRGVsdGlmeWluZyA2MDIwIG9iamVjdHMuCisgMTAwJSAoNjAyMC82MDIwKSBkb25lCitXcml0aW5nIDYwMjAgb2JqZWN0cy4KKyAxMDAlICg2MDIwLzYwMjApIGRvbmUKK1RvdGFsIDYwMjAsIHdyaXR0ZW4gNjAyMCAoZGVsdGEgNDA3MCksIHJldXNlZCAwIChkZWx0YSAwKQorUGFjayBwYWNrLTNlNTRhZDI5ZDViMmUwNTgzOGM3NWRmNTgyYzY1MjU3YjhkMDhlMWMgY3JlYXRlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIHRoZW4gcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byByZW1vdmUgYW55IG9mIHRoZSAibG9vc2UiIG9iamVjdHMgdGhhdCBhcmUgbm93IGNvbnRhaW5lZCBpbiB0aGUKK3BhY2suICBUaGlzIHdpbGwgYWxzbyByZW1vdmUgYW55IHVucmVmZXJlbmNlZCBvYmplY3RzICh3aGljaCBtYXkgYmUKK2NyZWF0ZWQgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSB1c2UgImdpdCByZXNldCIgdG8gcmVtb3ZlIGEgY29tbWl0KS4KK1lvdSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGxvb3NlIG9iamVjdHMgYXJlIGdvbmUgYnkgbG9va2luZyBhdCB0aGUKKy5naXQvb2JqZWN0cyBkaXJlY3Rvcnkgb3IgYnkgcnVubmluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvdW50LW9iamVjdHMKKzAgb2JqZWN0cywgMCBraWxvYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCB0aGUgb2JqZWN0IGZpbGVzIGFyZSBnb25lLCBhbnkgY29tbWFuZHMgdGhhdCByZWZlciB0byB0aG9zZQorb2JqZWN0cyB3aWxsIHdvcmsgZXhhY3RseSBhcyB0aGV5IGRpZCBiZWZvcmUuCisKK1RoZSBnaXRsaW5rOmdpdC1nY1sxXSBjb21tYW5kIHBlcmZvcm1zIHBhY2tpbmcsIHBydW5pbmcsIGFuZCBtb3JlIGZvcgoreW91LCBzbyBpcyBub3JtYWxseSB0aGUgb25seSBoaWdoLWxldmVsIGNvbW1hbmQgeW91IG5lZWQuCisKK1tbZGFuZ2xpbmctb2JqZWN0c11dCitEYW5nbGluZyBvYmplY3RzCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnaXRsaW5rOmdpdC1mc2NrWzFdIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgY29tcGxhaW4gYWJvdXQgZGFuZ2xpbmcKK29iamVjdHMuICBUaGV5IGFyZSBub3QgYSBwcm9ibGVtLgorCitUaGUgbW9zdCBjb21tb24gY2F1c2Ugb2YgZGFuZ2xpbmcgb2JqZWN0cyBpcyB0aGF0IHlvdSd2ZSByZWJhc2VkIGEKK2JyYW5jaCwgb3IgeW91IGhhdmUgcHVsbGVkIGZyb20gc29tZWJvZHkgZWxzZSB3aG8gcmViYXNlZCBhIGJyYW5jaC0tc2VlCis8PGNsZWFuaW5nLXVwLWhpc3Rvcnk+Pi4gIEluIHRoYXQgY2FzZSwgdGhlIG9sZCBoZWFkIG9mIHRoZSBvcmlnaW5hbAorYnJhbmNoIHN0aWxsIGV4aXN0cywgYXMgZG9lcyBldmVyeXRoaW5nIGl0IHBvaW50ZWQgdG8uIFRoZSBicmFuY2gKK3BvaW50ZXIgaXRzZWxmIGp1c3QgZG9lc24ndCwgc2luY2UgeW91IHJlcGxhY2VkIGl0IHdpdGggYW5vdGhlciBvbmUuCisKK1RoZXJlIGFyZSBhbHNvIG90aGVyIHNpdHVhdGlvbnMgdGhhdCBjYXVzZSBkYW5nbGluZyBvYmplY3RzLiBGb3IKK2V4YW1wbGUsIGEgImRhbmdsaW5nIGJsb2IiIG1heSBhcmlzZSBiZWNhdXNlIHlvdSBkaWQgYSAiZ2l0IGFkZCIgb2YgYQorZmlsZSwgYnV0IHRoZW4sIGJlZm9yZSB5b3UgYWN0dWFsbHkgY29tbWl0dGVkIGl0IGFuZCBtYWRlIGl0IHBhcnQgb2YgdGhlCitiaWdnZXIgcGljdHVyZSwgeW91IGNoYW5nZWQgc29tZXRoaW5nIGVsc2UgaW4gdGhhdCBmaWxlIGFuZCBjb21taXR0ZWQKK3RoYXQgKnVwZGF0ZWQqIHRoaW5nIC0gdGhlIG9sZCBzdGF0ZSB0aGF0IHlvdSBhZGRlZCBvcmlnaW5hbGx5IGVuZHMgdXAKK25vdCBiZWluZyBwb2ludGVkIHRvIGJ5IGFueSBjb21taXQgb3IgdHJlZSwgc28gaXQncyBub3cgYSBkYW5nbGluZyBibG9iCitvYmplY3QuCisKK1NpbWlsYXJseSwgd2hlbiB0aGUgInJlY3Vyc2l2ZSIgbWVyZ2Ugc3RyYXRlZ3kgcnVucywgYW5kIGZpbmRzIHRoYXQKK3RoZXJlIGFyZSBjcmlzcy1jcm9zcyBtZXJnZXMgYW5kIHRodXMgbW9yZSB0aGFuIG9uZSBtZXJnZSBiYXNlICh3aGljaCBpcworZmFpcmx5IHVudXN1YWwsIGJ1dCBpdCBkb2VzIGhhcHBlbiksIGl0IHdpbGwgZ2VuZXJhdGUgb25lIHRlbXBvcmFyeQorbWlkd2F5IHRyZWUgKG9yIHBvc3NpYmx5IGV2ZW4gbW9yZSwgaWYgeW91IGhhZCBsb3RzIG9mIGNyaXNzLWNyb3NzaW5nCittZXJnZXMgYW5kIG1vcmUgdGhhbiB0d28gbWVyZ2UgYmFzZXMpIGFzIGEgdGVtcG9yYXJ5IGludGVybmFsIG1lcmdlCitiYXNlLCBhbmQgYWdhaW4sIHRob3NlIGFyZSByZWFsIG9iamVjdHMsIGJ1dCB0aGUgZW5kIHJlc3VsdCB3aWxsIG5vdCBlbmQKK3VwIHBvaW50aW5nIHRvIHRoZW0sIHNvIHRoZXkgZW5kIHVwICJkYW5nbGluZyIgaW4geW91ciByZXBvc2l0b3J5LgorCitHZW5lcmFsbHksIGRhbmdsaW5nIG9iamVjdHMgYXJlbid0IGFueXRoaW5nIHRvIHdvcnJ5IGFib3V0LiBUaGV5IGNhbgorZXZlbiBiZSB2ZXJ5IHVzZWZ1bDogaWYgeW91IHNjcmV3IHNvbWV0aGluZyB1cCwgdGhlIGRhbmdsaW5nIG9iamVjdHMgY2FuCitiZSBob3cgeW91IHJlY292ZXIgeW91ciBvbGQgdHJlZSAoc2F5LCB5b3UgZGlkIGEgcmViYXNlLCBhbmQgcmVhbGl6ZWQKK3RoYXQgeW91IHJlYWxseSBkaWRuJ3Qgd2FudCB0byAtIHlvdSBjYW4gbG9vayBhdCB3aGF0IGRhbmdsaW5nIG9iamVjdHMKK3lvdSBoYXZlLCBhbmQgZGVjaWRlIHRvIHJlc2V0IHlvdXIgaGVhZCB0byBzb21lIG9sZCBkYW5nbGluZyBzdGF0ZSkuCisKK0ZvciBjb21taXRzLCB5b3UgY2FuIGp1c3QgdXNlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayA8ZGFuZ2xpbmctY29tbWl0LXNoYS1nb2VzLWhlcmU+IC0tbm90IC0tYWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBhc2tzIGZvciBhbGwgdGhlIGhpc3RvcnkgcmVhY2hhYmxlIGZyb20gdGhlIGdpdmVuIGNvbW1pdCBidXQgbm90Citmcm9tIGFueSBicmFuY2gsIHRhZywgb3Igb3RoZXIgcmVmZXJlbmNlLiAgSWYgeW91IGRlY2lkZSBpdCdzIHNvbWV0aGluZworeW91IHdhbnQsIHlvdSBjYW4gYWx3YXlzIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2UgdG8gaXQsIGUuZy4sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIHJlY292ZXJlZC1icmFuY2ggPGRhbmdsaW5nLWNvbW1pdC1zaGEtZ29lcy1oZXJlPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBibG9icyBhbmQgdHJlZXMsIHlvdSBjYW4ndCBkbyB0aGUgc2FtZSwgYnV0IHlvdSBjYW4gc3RpbGwgZXhhbWluZQordGhlbS4gIFlvdSBjYW4ganVzdCBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgPGRhbmdsaW5nLWJsb2IvdHJlZS1zaGEtZ29lcy1oZXJlPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHNob3cgd2hhdCB0aGUgY29udGVudHMgb2YgdGhlIGJsb2Igd2VyZSAob3IsIGZvciBhIHRyZWUsIGJhc2ljYWxseQord2hhdCB0aGUgImxzIiBmb3IgdGhhdCBkaXJlY3Rvcnkgd2FzKSwgYW5kIHRoYXQgbWF5IGdpdmUgeW91IHNvbWUgaWRlYQorb2Ygd2hhdCB0aGUgb3BlcmF0aW9uIHdhcyB0aGF0IGxlZnQgdGhhdCBkYW5nbGluZyBvYmplY3QuCisKK1VzdWFsbHksIGRhbmdsaW5nIGJsb2JzIGFuZCB0cmVlcyBhcmVuJ3QgdmVyeSBpbnRlcmVzdGluZy4gVGhleSdyZQorYWxtb3N0IGFsd2F5cyB0aGUgcmVzdWx0IG9mIGVpdGhlciBiZWluZyBhIGhhbGYtd2F5IG1lcmdlYmFzZSAodGhlIGJsb2IKK3dpbGwgb2Z0ZW4gZXZlbiBoYXZlIHRoZSBjb25mbGljdCBtYXJrZXJzIGZyb20gYSBtZXJnZSBpbiBpdCwgaWYgeW91CitoYXZlIGhhZCBjb25mbGljdGluZyBtZXJnZXMgdGhhdCB5b3UgZml4ZWQgdXAgYnkgaGFuZCksIG9yIHNpbXBseQorYmVjYXVzZSB5b3UgaW50ZXJydXB0ZWQgYSAiZ2l0IGZldGNoIiB3aXRoIF5DIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQsCitsZWF2aW5nIF9zb21lXyBvZiB0aGUgbmV3IG9iamVjdHMgaW4gdGhlIG9iamVjdCBkYXRhYmFzZSwgYnV0IGp1c3QKK2RhbmdsaW5nIGFuZCB1c2VsZXNzLgorCitBbnl3YXksIG9uY2UgeW91IGFyZSBzdXJlIHRoYXQgeW91J3JlIG5vdCBpbnRlcmVzdGVkIGluIGFueSBkYW5nbGluZyAKK3N0YXRlLCB5b3UgY2FuIGp1c3QgcHJ1bmUgYWxsIHVucmVhY2hhYmxlIG9iamVjdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhleSdsbCBiZSBnb25lLiBCdXQgeW91IHNob3VsZCBvbmx5IHJ1biAiZ2l0IHBydW5lIiBvbiBhIHF1aWVzY2VudAorcmVwb3NpdG9yeSAtIGl0J3Mga2luZCBvZiBsaWtlIGRvaW5nIGEgZmlsZXN5c3RlbSBmc2NrIHJlY292ZXJ5OiB5b3UKK2Rvbid0IHdhbnQgdG8gZG8gdGhhdCB3aGlsZSB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkLgorCisoVGhlIHNhbWUgaXMgdHJ1ZSBvZiAiZ2l0LWZzY2siIGl0c2VsZiwgYnR3IC0gYnV0IHNpbmNlIAorZ2l0LWZzY2sgbmV2ZXIgYWN0dWFsbHkgKmNoYW5nZXMqIHRoZSByZXBvc2l0b3J5LCBpdCBqdXN0IHJlcG9ydHMgCitvbiB3aGF0IGl0IGZvdW5kLCBnaXQtZnNjayBpdHNlbGYgaXMgbmV2ZXIgImRhbmdlcm91cyIgdG8gcnVuLiAKK1J1bm5pbmcgaXQgd2hpbGUgc29tZWJvZHkgaXMgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIHJlcG9zaXRvcnkgY2FuIGNhdXNlIAorY29uZnVzaW5nIGFuZCBzY2FyeSBtZXNzYWdlcywgYnV0IGl0IHdvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJhZC4gSW4gCitjb250cmFzdCwgcnVubmluZyAiZ2l0IHBydW5lIiB3aGlsZSBzb21lYm9keSBpcyBhY3RpdmVseSBjaGFuZ2luZyB0aGUgCityZXBvc2l0b3J5IGlzIGEgKkJBRCogaWRlYSkuCisKK1tbYmlyZHZpZXctb24tdGhlLXNvdXJjZS1jb2RlXV0KK0EgYmlyZHMtZXllIHZpZXcgb2YgR2l0J3Mgc291cmNlIGNvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgbm90IGFsd2F5cyBlYXN5IGZvciBuZXcgZGV2ZWxvcGVycyB0byBmaW5kIHRoZWlyIHdheSB0aHJvdWdoIEdpdCdzCitzb3VyY2UgY29kZS4gIFRoaXMgc2VjdGlvbiBnaXZlcyB5b3UgYSBsaXR0bGUgZ3VpZGFuY2UgdG8gc2hvdyB3aGVyZSB0bworc3RhcnQuCisKK0EgZ29vZCBwbGFjZSB0byBzdGFydCBpcyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgaW5pdGlhbCBjb21taXQsIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGU4M2M1MTYzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpbml0aWFsIHJldmlzaW9uIGxheXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbW9zdCBldmVyeXRoaW5nIGdpdCBoYXMKK3RvZGF5LCBidXQgaXMgc21hbGwgZW5vdWdoIHRvIHJlYWQgaW4gb25lIHNpdHRpbmcuCisKK05vdGUgdGhhdCB0ZXJtaW5vbG9neSBoYXMgY2hhbmdlZCBzaW5jZSB0aGF0IHJldmlzaW9uLiAgRm9yIGV4YW1wbGUsIHRoZQorUkVBRE1FIGluIHRoYXQgcmV2aXNpb24gdXNlcyB0aGUgd29yZCAiY2hhbmdlc2V0IiB0byBkZXNjcmliZSB3aGF0IHdlCitub3cgY2FsbCBhIDw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0Pj4uCisKK0Fsc28sIHdlIGRvIG5vdCBjYWxsIGl0ICJjYWNoZSIgYW55IG1vcmUsIGJ1dCAiaW5kZXgiLCBob3dldmVyLCB0aGUKK2ZpbGUgaXMgc3RpbGwgY2FsbGVkIGBjYWNoZS5oYC4gIFJlbWFyazogTm90IG11Y2ggcmVhc29uIHRvIGNoYW5nZSBpdCBub3csCitlc3BlY2lhbGx5IHNpbmNlIHRoZXJlIGlzIG5vIGdvb2Qgc2luZ2xlIG5hbWUgZm9yIGl0IGFueXdheSwgYmVjYXVzZSBpdCBpcworYmFzaWNhbGx5IF90aGVfIGhlYWRlciBmaWxlIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IF9hbGxfIG9mIEdpdCdzIEMgc291cmNlcy4KKworSWYgeW91IGdyYXNwIHRoZSBpZGVhcyBpbiB0aGF0IGluaXRpYWwgY29tbWl0LCB5b3Ugc2hvdWxkIGNoZWNrIG91dCBhCittb3JlIHJlY2VudCB2ZXJzaW9uIGFuZCBza2ltIGBjYWNoZS5oYCwgYG9iamVjdC5oYCBhbmQgYGNvbW1pdC5oYC4KKworSW4gdGhlIGVhcmx5IGRheXMsIEdpdCAoaW4gdGhlIHRyYWRpdGlvbiBvZiBVTklYKSB3YXMgYSBidW5jaCBvZiBwcm9ncmFtcword2hpY2ggd2VyZSBleHRyZW1lbHkgc2ltcGxlLCBhbmQgd2hpY2ggeW91IHVzZWQgaW4gc2NyaXB0cywgcGlwaW5nIHRoZQorb3V0cHV0IG9mIG9uZSBpbnRvIGFub3RoZXIuIFRoaXMgdHVybmVkIG91dCB0byBiZSBnb29kIGZvciBpbml0aWFsCitkZXZlbG9wbWVudCwgc2luY2UgaXQgd2FzIGVhc2llciB0byB0ZXN0IG5ldyB0aGluZ3MuICBIb3dldmVyLCByZWNlbnRseQorbWFueSBvZiB0aGVzZSBwYXJ0cyBoYXZlIGJlY29tZSBidWlsdGlucywgYW5kIHNvbWUgb2YgdGhlIGNvcmUgaGFzIGJlZW4KKyJsaWJpZmllZCIsIGkuZS4gcHV0IGludG8gbGliZ2l0LmEgZm9yIHBlcmZvcm1hbmNlLCBwb3J0YWJpbGl0eSByZWFzb25zLAorYW5kIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCisKK0J5IG5vdywgeW91IGtub3cgd2hhdCB0aGUgaW5kZXggaXMgKGFuZCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEKK3N0cnVjdHVyZXMgaW4gYGNhY2hlLmhgKSwgYW5kIHRoYXQgdGhlcmUgYXJlIGp1c3QgYSBjb3VwbGUgb2Ygb2JqZWN0IHR5cGVzCisoYmxvYnMsIHRyZWVzLCBjb21taXRzIGFuZCB0YWdzKSB3aGljaCBpbmhlcml0IHRoZWlyIGNvbW1vbiBzdHJ1Y3R1cmUgZnJvbQorYHN0cnVjdCBvYmplY3RgLCB3aGljaCBpcyB0aGVpciBmaXJzdCBtZW1iZXIgKGFuZCB0aHVzLCB5b3UgY2FuIGNhc3QgZS5nLgorYChzdHJ1Y3Qgb2JqZWN0ICopY29tbWl0YCB0byBhY2hpZXZlIHRoZSBfc2FtZV8gYXMgYCZjb21taXQtPm9iamVjdGAsIGkuZS4KK2dldCBhdCB0aGUgb2JqZWN0IG5hbWUgYW5kIGZsYWdzKS4KKworTm93IGlzIGEgZ29vZCBwb2ludCB0byB0YWtlIGEgYnJlYWsgdG8gbGV0IHRoaXMgaW5mb3JtYXRpb24gc2luayBpbi4KKworTmV4dCBzdGVwOiBnZXQgZmFtaWxpYXIgd2l0aCB0aGUgb2JqZWN0IG5hbWluZy4gIFJlYWQgPDxuYW1pbmctY29tbWl0cz4+LgorVGhlcmUgYXJlIHF1aXRlIGEgZmV3IHdheXMgdG8gbmFtZSBhbiBvYmplY3QgKGFuZCBub3Qgb25seSByZXZpc2lvbnMhKS4KK0FsbCBvZiB0aGVzZSBhcmUgaGFuZGxlZCBpbiBgc2hhMV9uYW1lLmNgLiBKdXN0IGhhdmUgYSBxdWljayBsb29rIGF0Cit0aGUgZnVuY3Rpb24gYGdldF9zaGExKClgLiBBIGxvdCBvZiB0aGUgc3BlY2lhbCBoYW5kbGluZyBpcyBkb25lIGJ5CitmdW5jdGlvbnMgbGlrZSBgZ2V0X3NoYTFfYmFzaWMoKWAgb3IgdGhlIGxpa2VzLgorCitUaGlzIGlzIGp1c3QgdG8gZ2V0IHlvdSBpbnRvIHRoZSBncm9vdmUgZm9yIHRoZSBtb3N0IGxpYmlmaWVkIHBhcnQgb2YgR2l0OgordGhlIHJldmlzaW9uIHdhbGtlci4KKworQmFzaWNhbGx5LCB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIGBnaXQgbG9nYCB3YXMgYSBzaGVsbCBzY3JpcHQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJldi1saXN0IC0tcHJldHR5ICQoZ2l0LXJldi1wYXJzZSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8IFwKKwlMRVNTPS1TICR7UEFHRVI6LWxlc3N9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQgZG9lcyB0aGlzIG1lYW4/CisKK2BnaXQtcmV2LWxpc3RgIGlzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSByZXZpc2lvbiB3YWxrZXIsIHdoaWNoCitfYWx3YXlzXyBwcmludGVkIGEgbGlzdCBvZiByZXZpc2lvbnMgdG8gc3Rkb3V0LiAgSXQgaXMgc3RpbGwgZnVuY3Rpb25hbCwKK2FuZCBuZWVkcyB0bywgc2luY2UgbW9zdCBuZXcgR2l0IHByb2dyYW1zIHN0YXJ0IG91dCBhcyBzY3JpcHRzIHVzaW5nCitgZ2l0LXJldi1saXN0YC4KKworYGdpdC1yZXYtcGFyc2VgIGlzIG5vdCBhcyBpbXBvcnRhbnQgYW55IG1vcmU7IGl0IHdhcyBvbmx5IHVzZWQgdG8gZmlsdGVyIG91dAorb3B0aW9ucyB0aGF0IHdlcmUgcmVsZXZhbnQgZm9yIHRoZSBkaWZmZXJlbnQgcGx1bWJpbmcgY29tbWFuZHMgdGhhdCB3ZXJlCitjYWxsZWQgYnkgdGhlIHNjcmlwdC4KKworTW9zdCBvZiB3aGF0IGBnaXQtcmV2LWxpc3RgIGRpZCBpcyBjb250YWluZWQgaW4gYHJldmlzaW9uLmNgIGFuZAorYHJldmlzaW9uLmhgLiAgSXQgd3JhcHMgdGhlIG9wdGlvbnMgaW4gYSBzdHJ1Y3QgbmFtZWQgYHJldl9pbmZvYCwgd2hpY2gKK2NvbnRyb2xzIGhvdyBhbmQgd2hhdCByZXZpc2lvbnMgYXJlIHdhbGtlZCwgYW5kIG1vcmUuCisKK1RoZSBvcmlnaW5hbCBqb2Igb2YgYGdpdC1yZXYtcGFyc2VgIGlzIG5vdyB0YWtlbiBieSB0aGUgZnVuY3Rpb24KK2BzZXR1cF9yZXZpc2lvbnMoKWAsIHdoaWNoIHBhcnNlcyB0aGUgcmV2aXNpb25zIGFuZCB0aGUgY29tbW9uIGNvbW1hbmQgbGluZQorb3B0aW9ucyBmb3IgdGhlIHJldmlzaW9uIHdhbGtlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHN0cnVjdAorYHJldl9pbmZvYCBmb3IgbGF0ZXIgY29uc3VtcHRpb24uIFlvdSBjYW4gZG8geW91ciBvd24gY29tbWFuZCBsaW5lIG9wdGlvbgorcGFyc2luZyBhZnRlciBjYWxsaW5nIGBzZXR1cF9yZXZpc2lvbnMoKWAuIEFmdGVyIHRoYXQsIHlvdSBoYXZlIHRvIGNhbGwKK2BwcmVwYXJlX3JldmlzaW9uX3dhbGsoKWAgZm9yIGluaXRpYWxpemF0aW9uLCBhbmQgdGhlbiB5b3UgY2FuIGdldCB0aGUKK2NvbW1pdHMgb25lIGJ5IG9uZSB3aXRoIHRoZSBmdW5jdGlvbiBgZ2V0X3JldmlzaW9uKClgLgorCitJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbW9yZSBkZXRhaWxzIG9mIHRoZSByZXZpc2lvbiB3YWxraW5nIHByb2Nlc3MsCitqdXN0IGhhdmUgYSBsb29rIGF0IHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiBvZiBgY21kX2xvZygpYDsgY2FsbAorYGdpdC1zaG93IHYxLjMuMH4xNTVeMn40YCBhbmQgc2Nyb2xsIGRvd24gdG8gdGhhdCBmdW5jdGlvbiAobm90ZSB0aGF0IHlvdQorbm8gbG9uZ2VyIG5lZWQgdG8gY2FsbCBgc2V0dXBfcGFnZXIoKWAgZGlyZWN0bHkpLgorCitOb3dhZGF5cywgYGdpdCBsb2dgIGlzIGEgYnVpbHRpbiwgd2hpY2ggbWVhbnMgdGhhdCBpdCBpcyBfY29udGFpbmVkXyBpbiB0aGUKK2NvbW1hbmQgYGdpdGAuICBUaGUgc291cmNlIHNpZGUgb2YgYSBidWlsdGluIGlzCisKKy0gYSBmdW5jdGlvbiBjYWxsZWQgYGNtZF88YmxhPmAsIHR5cGljYWxseSBkZWZpbmVkIGluIGBidWlsdGluLTxibGE+LmNgLAorICBhbmQgZGVjbGFyZWQgaW4gYGJ1aWx0aW4uaGAsCisKKy0gYW4gZW50cnkgaW4gdGhlIGBjb21tYW5kc1tdYCBhcnJheSBpbiBgZ2l0LmNgLCBhbmQKKworLSBhbiBlbnRyeSBpbiBgQlVJTFRJTl9PQkpFQ1RTYCBpbiB0aGUgYE1ha2VmaWxlYC4KKworU29tZXRpbWVzLCBtb3JlIHRoYW4gb25lIGJ1aWx0aW4gaXMgY29udGFpbmVkIGluIG9uZSBzb3VyY2UgZmlsZS4gIEZvcgorZXhhbXBsZSwgYGNtZF93aGF0Y2hhbmdlZCgpYCBhbmQgYGNtZF9sb2coKWAgYm90aCByZXNpZGUgaW4gYGJ1aWx0aW4tbG9nLmNgLAorc2luY2UgdGhleSBzaGFyZSBxdWl0ZSBhIGJpdCBvZiBjb2RlLiAgSW4gdGhhdCBjYXNlLCB0aGUgY29tbWFuZHMgd2hpY2ggYXJlCitfbm90XyBuYW1lZCBsaWtlIHRoZSBgLmNgIGZpbGUgaW4gd2hpY2ggdGhleSBsaXZlIGhhdmUgdG8gYmUgbGlzdGVkIGluCitgQlVJTFRfSU5TYCBpbiB0aGUgYE1ha2VmaWxlYC4KKworYGdpdCBsb2dgIGxvb2tzIG1vcmUgY29tcGxpY2F0ZWQgaW4gQyB0aGFuIGl0IGRvZXMgaW4gdGhlIG9yaWdpbmFsIHNjcmlwdCwKK2J1dCB0aGF0IGFsbG93cyBmb3IgYSBtdWNoIGdyZWF0ZXIgZmxleGliaWxpdHkgYW5kIHBlcmZvcm1hbmNlLgorCitIZXJlIGFnYWluIGl0IGlzIGEgZ29vZCBwb2ludCB0byB0YWtlIGEgcGF1c2UuCisKK0xlc3NvbiB0aHJlZSBpczogc3R1ZHkgdGhlIGNvZGUuICBSZWFsbHksIGl0IGlzIHRoZSBiZXN0IHdheSB0byBsZWFybiBhYm91dAordGhlIG9yZ2FuaXphdGlvbiBvZiBHaXQgKGFmdGVyIHlvdSBrbm93IHRoZSBiYXNpYyBjb25jZXB0cykuCisKK1NvLCB0aGluayBhYm91dCBzb21ldGhpbmcgd2hpY2ggeW91IGFyZSBpbnRlcmVzdGVkIGluLCBzYXksICJob3cgY2FuIEkKK2FjY2VzcyBhIGJsb2IganVzdCBrbm93aW5nIHRoZSBvYmplY3QgbmFtZSBvZiBpdD8iLiAgVGhlIGZpcnN0IHN0ZXAgaXMgdG8KK2ZpbmQgYSBHaXQgY29tbWFuZCB3aXRoIHdoaWNoIHlvdSBjYW4gZG8gaXQuICBJbiB0aGlzIGV4YW1wbGUsIGl0IGlzIGVpdGhlcgorYGdpdCBzaG93YCBvciBgZ2l0IGNhdC1maWxlYC4KKworRm9yIHRoZSBzYWtlIG9mIGNsYXJpdHksIGxldCdzIHN0YXkgd2l0aCBgZ2l0IGNhdC1maWxlYCwgYmVjYXVzZSBpdAorCistIGlzIHBsdW1iaW5nLCBhbmQKKworLSB3YXMgYXJvdW5kIGV2ZW4gaW4gdGhlIGluaXRpYWwgY29tbWl0IChpdCBsaXRlcmFsbHkgd2VudCBvbmx5IHRocm91Z2gKKyAgc29tZSAyMCByZXZpc2lvbnMgYXMgYGNhdC1maWxlLmNgLCB3YXMgcmVuYW1lZCB0byBgYnVpbHRpbi1jYXQtZmlsZS5jYAorICB3aGVuIG1hZGUgYSBidWlsdGluLCBhbmQgdGhlbiBzYXcgbGVzcyB0aGFuIDEwIHZlcnNpb25zKS4KKworU28sIGxvb2sgaW50byBgYnVpbHRpbi1jYXQtZmlsZS5jYCwgc2VhcmNoIGZvciBgY21kX2NhdF9maWxlKClgIGFuZCBsb29rIHdoYXQKK2l0IGRvZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisgICAgICAgIGlmIChhcmdjICE9IDMpCisgICAgICAgICAgICAgICAgdXNhZ2UoImdpdC1jYXQtZmlsZSBbLXR8LXN8LWV8LXB8PHR5cGU+XSA8c2hhMT4iKTsKKyAgICAgICAgaWYgKGdldF9zaGExKGFyZ3ZbMl0sIHNoYTEpKQorICAgICAgICAgICAgICAgIGRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMZXQncyBza2lwIG92ZXIgdGhlIG9idmlvdXMgZGV0YWlsczsgdGhlIG9ubHkgcmVhbGx5IGludGVyZXN0aW5nIHBhcnQKK2hlcmUgaXMgdGhlIGNhbGwgdG8gYGdldF9zaGExKClgLiAgSXQgdHJpZXMgdG8gaW50ZXJwcmV0IGBhcmd2WzJdYCBhcyBhbgorb2JqZWN0IG5hbWUsIGFuZCBpZiBpdCByZWZlcnMgdG8gYW4gb2JqZWN0IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQKK3JlcG9zaXRvcnksIGl0IHdyaXRlcyB0aGUgcmVzdWx0aW5nIFNIQS0xIGludG8gdGhlIHZhcmlhYmxlIGBzaGExYC4KKworVHdvIHRoaW5ncyBhcmUgaW50ZXJlc3RpbmcgaGVyZToKKworLSBgZ2V0X3NoYTEoKWAgcmV0dXJucyAwIG9uIF9zdWNjZXNzXy4gIFRoaXMgbWlnaHQgc3VycHJpc2Ugc29tZSBuZXcKKyAgR2l0IGhhY2tlcnMsIGJ1dCB0aGVyZSBpcyBhIGxvbmcgdHJhZGl0aW9uIGluIFVOSVggdG8gcmV0dXJuIGRpZmZlcmVudAorICBuZWdhdGl2ZSBudW1iZXJzIGluIGNhc2Ugb2YgZGlmZmVyZW50IGVycm9ycyAtLSBhbmQgMCBvbiBzdWNjZXNzLgorCistIHRoZSB2YXJpYWJsZSBgc2hhMWAgaW4gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBgZ2V0X3NoYTEoKWAgaXMgYHVuc2lnbmVkCisgIGNoYXIgXCpgLCBidXQgaXMgYWN0dWFsbHkgZXhwZWN0ZWQgdG8gYmUgYSBwb2ludGVyIHRvIGB1bnNpZ25lZAorICBjaGFyWzIwXWAuICBUaGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgMTYwLWJpdCBTSEEtMSBvZiB0aGUgZ2l2ZW4KKyAgY29tbWl0LiAgTm90ZSB0aGF0IHdoZW5ldmVyIGEgU0hBLTEgaXMgcGFzc2VkIGFzIGB1bnNpZ25lZCBjaGFyIFwqYCwgaXQKKyAgaXMgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiwgYXMgb3Bwb3NlZCB0byB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24gaW4KKyAgaGV4IGNoYXJhY3RlcnMsIHdoaWNoIGlzIHBhc3NlZCBhcyBgY2hhciAqYC4KKworWW91IHdpbGwgc2VlIGJvdGggb2YgdGhlc2UgdGhpbmdzIHRocm91Z2hvdXQgdGhlIGNvZGUuCisKK05vdywgZm9yIHRoZSBtZWF0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgYXJndlsxXSwgJnNpemUsIE5VTEwpOworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBob3cgeW91IHJlYWQgYSBibG9iIChhY3R1YWxseSwgbm90IG9ubHkgYSBibG9iLCBidXQgYW55IHR5cGUgb2YKK29iamVjdCkuICBUbyBrbm93IGhvdyB0aGUgZnVuY3Rpb24gYHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKClgIGFjdHVhbGx5Cit3b3JrcywgZmluZCB0aGUgc291cmNlIGNvZGUgZm9yIGl0IChzb21ldGhpbmcgbGlrZSBgZ2l0IGdyZXAKK3JlYWRfb2JqZWN0X3dpdGggfCBncmVwICI6W2Etel0iYCBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkpLCBhbmQgcmVhZAordGhlIHNvdXJjZS4KKworVG8gZmluZCBvdXQgaG93IHRoZSByZXN1bHQgY2FuIGJlIHVzZWQsIGp1c3QgcmVhZCBvbiBpbiBgY21kX2NhdF9maWxlKClgOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB3cml0ZV9vcl9kaWUoMSwgYnVmLCBzaXplKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcywgeW91IGRvIG5vdCBrbm93IHdoZXJlIHRvIGxvb2sgZm9yIGEgZmVhdHVyZS4gIEluIG1hbnkgc3VjaCBjYXNlcywKK2l0IGhlbHBzIHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBvdXRwdXQgb2YgYGdpdCBsb2dgLCBhbmQgdGhlbiBgZ2l0IHNob3dgIHRoZQorY29ycmVzcG9uZGluZyBjb21taXQuCisKK0V4YW1wbGU6IElmIHlvdSBrbm93IHRoYXQgdGhlcmUgd2FzIHNvbWUgdGVzdCBjYXNlIGZvciBgZ2l0IGJ1bmRsZWAsIGJ1dAorZG8gbm90IHJlbWVtYmVyIHdoZXJlIGl0IHdhcyAoeWVzLCB5b3UgX2NvdWxkXyBgZ2l0IGdyZXAgYnVuZGxlIHQvYCwgYnV0IHRoYXQKK2RvZXMgbm90IGlsbHVzdHJhdGUgdGhlIHBvaW50ISk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC0tbm8tbWVyZ2VzIHQvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhlIHBhZ2VyIChgbGVzc2ApLCBqdXN0IHNlYXJjaCBmb3IgImJ1bmRsZSIsIGdvIGEgZmV3IGxpbmVzIGJhY2ssCithbmQgc2VlIHRoYXQgaXQgaXMgaW4gY29tbWl0IDE4NDQ5YWIwLi4uICBOb3cganVzdCBjb3B5IHRoaXMgb2JqZWN0IG5hbWUsCithbmQgcGFzdGUgaXQgaW50byB0aGUgY29tbWFuZCBsaW5lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgMTg0NDlhYjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVm9pbGEuCisKK0Fub3RoZXIgZXhhbXBsZTogRmluZCBvdXQgd2hhdCB0byBkbyBpbiBvcmRlciB0byBtYWtlIHNvbWUgc2NyaXB0IGEKK2J1aWx0aW46CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLW5vLW1lcmdlcyAtLWRpZmYtZmlsdGVyPUEgYnVpbHRpbi0qLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IHNlZSwgR2l0IGlzIGFjdHVhbGx5IHRoZSBiZXN0IHRvb2wgdG8gZmluZCBvdXQgYWJvdXQgdGhlIHNvdXJjZSBvZiBHaXQKK2l0c2VsZiEKKworW1tnbG9zc2FyeV1dCitpbmNsdWRlOjpnbG9zc2FyeS50eHRbXQorCitbW2dpdC1xdWljay1zdGFydF1dCitBcHBlbmRpeCBBOiBHaXQgUXVpY2sgUmVmZXJlbmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgYSBxdWljayBzdW1tYXJ5IG9mIHRoZSBtYWpvciBjb21tYW5kczsgdGhlIHByZXZpb3VzIGNoYXB0ZXJzCitleHBsYWluIGhvdyB0aGVzZSB3b3JrIGluIG1vcmUgZGV0YWlsLgorCitbW3F1aWNrLWNyZWF0aW5nLWEtbmV3LXJlcG9zaXRvcnldXQorQ3JlYXRpbmcgYSBuZXcgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGcm9tIGEgdGFyYmFsbDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgdGFyIHh6ZiBwcm9qZWN0LnRhci5negorJCBjZCBwcm9qZWN0CiskIGdpdCBpbml0CitJbml0aWFsaXplZCBlbXB0eSBHaXQgcmVwb3NpdG9yeSBpbiAuZ2l0LworJCBnaXQgYWRkIC4KKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZXhhbXBsZS5jb20vcHViL3Byb2plY3QuZ2l0CiskIGNkIHByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbWFuYWdpbmctYnJhbmNoZXNdXQorTWFuYWdpbmcgYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gJICAgICAjIGxpc3QgYWxsIGxvY2FsIGJyYW5jaGVzIGluIHRoaXMgcmVwbworJCBnaXQgY2hlY2tvdXQgdGVzdCAgIyBzd2l0Y2ggd29ya2luZyBkaXJlY3RvcnkgdG8gYnJhbmNoICJ0ZXN0IgorJCBnaXQgYnJhbmNoIG5ldyAgICAgIyBjcmVhdGUgYnJhbmNoICJuZXciIHN0YXJ0aW5nIGF0IGN1cnJlbnQgSEVBRAorJCBnaXQgYnJhbmNoIC1kIG5ldyAgIyBkZWxldGUgYnJhbmNoICJuZXciCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0ZWFkIG9mIGJhc2luZyBuZXcgYnJhbmNoIG9uIGN1cnJlbnQgSEVBRCAodGhlIGRlZmF1bHQpLCB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggbmV3IHRlc3QgICAgIyBicmFuY2ggbmFtZWQgInRlc3QiCiskIGdpdCBicmFuY2ggbmV3IHYyLjYuMTUgIyB0YWcgbmFtZWQgdjIuNi4xNQorJCBnaXQgYnJhbmNoIG5ldyBIRUFEXiAgICMgY29tbWl0IGJlZm9yZSB0aGUgbW9zdCByZWNlbnQKKyQgZ2l0IGJyYW5jaCBuZXcgSEVBRF5eICAjIGNvbW1pdCBiZWZvcmUgdGhhdAorJCBnaXQgYnJhbmNoIG5ldyB0ZXN0fjEwICMgdGVuIGNvbW1pdHMgYmVmb3JlIHRpcCBvZiBicmFuY2ggInRlc3QiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGUgYW5kIHN3aXRjaCB0byBhIG5ldyBicmFuY2ggYXQgdGhlIHNhbWUgdGltZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG5ldyB2Mi42LjE1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVcGRhdGUgYW5kIGV4YW1pbmUgYnJhbmNoZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSB5b3UgY2xvbmVkIGZyb206CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaAkJIyB1cGRhdGUKKyQgZ2l0IGJyYW5jaCAtcgkJIyBsaXN0CisgIG9yaWdpbi9tYXN0ZXIKKyAgb3JpZ2luL25leHQKKyAgLi4uCiskIGdpdCBjaGVja291dCAtYiBtYXN0ZXJ3b3JrIG9yaWdpbi9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZldGNoIGEgYnJhbmNoIGZyb20gYSBkaWZmZXJlbnQgcmVwb3NpdG9yeSwgYW5kIGdpdmUgaXQgYSBuZXcKK25hbWUgaW4geW91ciByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2g6bXlicmFuY2gKKyQgZ2l0IGZldGNoIGdpdDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IHYyLjYuMTU6bXlicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tlZXAgYSBsaXN0IG9mIHJlcG9zaXRvcmllcyB5b3Ugd29yayB3aXRoIHJlZ3VsYXJseToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgZXhhbXBsZSBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qZWN0LmdpdAorJCBnaXQgcmVtb3RlCQkJIyBsaXN0IHJlbW90ZSByZXBvc2l0b3JpZXMKK2V4YW1wbGUKK29yaWdpbgorJCBnaXQgcmVtb3RlIHNob3cgZXhhbXBsZQkjIGdldCBkZXRhaWxzCisqIHJlbW90ZSBleGFtcGxlCisgIFVSTDogZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQKKyAgVHJhY2tlZCByZW1vdGUgYnJhbmNoZXMKKyAgICBtYXN0ZXIgbmV4dCAuLi4KKyQgZ2l0IGZldGNoIGV4YW1wbGUJCSMgdXBkYXRlIGJyYW5jaGVzIGZyb20gZXhhbXBsZQorJCBnaXQgYnJhbmNoIC1yCQkJIyBsaXN0IGFsbCByZW1vdGUgYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworW1tleHBsb3JpbmctaGlzdG9yeV1dCitFeHBsb3JpbmcgaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0awkJCSAgICAjIHZpc3VhbGl6ZSBhbmQgYnJvd3NlIGhpc3RvcnkKKyQgZ2l0IGxvZwkJICAgICMgbGlzdCBhbGwgY29tbWl0cworJCBnaXQgbG9nIHNyYy8JCSAgICAjIC4uLm1vZGlmeWluZyBzcmMvCiskIGdpdCBsb2cgdjIuNi4xNS4udjIuNi4xNiAgIyAuLi5pbiB2Mi42LjE2LCBub3QgaW4gdjIuNi4xNQorJCBnaXQgbG9nIG1hc3Rlci4udGVzdAkgICAgIyAuLi5pbiBicmFuY2ggdGVzdCwgbm90IGluIGJyYW5jaCBtYXN0ZXIKKyQgZ2l0IGxvZyB0ZXN0Li5tYXN0ZXIJICAgICMgLi4uaW4gYnJhbmNoIG1hc3RlciwgYnV0IG5vdCBpbiB0ZXN0CiskIGdpdCBsb2cgdGVzdC4uLm1hc3RlcgkgICAgIyAuLi5pbiBvbmUgYnJhbmNoLCBub3QgaW4gYm90aAorJCBnaXQgbG9nIC1TJ2ZvbygpJwkgICAgIyAuLi53aGVyZSBkaWZmZXJlbmNlIGNvbnRhaW4gImZvbygpIgorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIgorJCBnaXQgbG9nIC1wCQkgICAgIyBzaG93IHBhdGNoZXMgYXMgd2VsbAorJCBnaXQgc2hvdwkJICAgICMgbW9zdCByZWNlbnQgY29tbWl0CiskIGdpdCBkaWZmIHYyLjYuMTUuLnYyLjYuMTYgIyBkaWZmIGJldHdlZW4gdHdvIHRhZ2dlZCB2ZXJzaW9ucworJCBnaXQgZGlmZiB2Mi42LjE1Li5IRUFEICAgICMgZGlmZiB3aXRoIGN1cnJlbnQgaGVhZAorJCBnaXQgZ3JlcCAiZm9vKCkiCSAgICAjIHNlYXJjaCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgImZvbygpIgorJCBnaXQgZ3JlcCB2Mi42LjE1ICJmb28oKSIgICMgc2VhcmNoIG9sZCB0cmVlIGZvciAiZm9vKCkiCiskIGdpdCBzaG93IHYyLjYuMTU6YS50eHQgICAgIyBsb29rIGF0IG9sZCB2ZXJzaW9uIG9mIGEudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWFyY2ggZm9yIHJlZ3Jlc3Npb25zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHN0YXJ0CiskIGdpdCBiaXNlY3QgYmFkCQkjIGN1cnJlbnQgdmVyc2lvbiBpcyBiYWQKKyQgZ2l0IGJpc2VjdCBnb29kIHYyLjYuMTMtcmMyCSMgbGFzdCBrbm93biBnb29kIHJldmlzaW9uCitCaXNlY3Rpbmc6IDY3NSByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMKKwkJCQkjIHRlc3QgaGVyZSwgdGhlbjoKKyQgZ2l0IGJpc2VjdCBnb29kCQkjIGlmIHRoaXMgcmV2aXNpb24gaXMgZ29vZCwgb3IKKyQgZ2l0IGJpc2VjdCBiYWQJCSMgaWYgdGhpcyByZXZpc2lvbiBpcyBiYWQuCisJCQkJIyByZXBlYXQgdW50aWwgZG9uZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbWFraW5nLWNoYW5nZXNdXQorTWFraW5nIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSBnaXQga25vd3Mgd2hvIHRvIGJsYW1lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0ID4+fi8uZ2l0Y29uZmlnIDw8XEVPRgorW3VzZXJdCisJbmFtZSA9IFlvdXIgTmFtZSBDb21lcyBIZXJlCisJZW1haWwgPSB5b3VAeW91cmRvbWFpbi5leGFtcGxlLmNvbQorRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VsZWN0IGZpbGUgY29udGVudHMgdG8gaW5jbHVkZSBpbiB0aGUgbmV4dCBjb21taXQsIHRoZW4gbWFrZSB0aGUKK2NvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBhLnR4dCAgICAjIHVwZGF0ZWQgZmlsZQorJCBnaXQgYWRkIGIudHh0ICAgICMgbmV3IGZpbGUKKyQgZ2l0IHJtIGMudHh0ICAgICAjIG9sZCBmaWxlCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yLCBwcmVwYXJlIGFuZCBjcmVhdGUgdGhlIGNvbW1pdCBpbiBvbmUgc3RlcDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCBkLnR4dCAjIHVzZSBsYXRlc3QgY29udGVudCBvbmx5IG9mIGQudHh0CiskIGdpdCBjb21taXQgLWEJICAgIyB1c2UgbGF0ZXN0IGNvbnRlbnQgb2YgYWxsIHRyYWNrZWQgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbWVyZ2luZ11dCitNZXJnaW5nCistLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSB0ZXN0ICAgIyBtZXJnZSBicmFuY2ggInRlc3QiIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoCiskIGdpdCBwdWxsIGdpdDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IG1hc3RlcgorCQkgICAjIGZldGNoIGFuZCBtZXJnZSBpbiByZW1vdGUgYnJhbmNoCiskIGdpdCBwdWxsIC4gdGVzdCAgIyBlcXVpdmFsZW50IHRvIGdpdCBtZXJnZSB0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW3NoYXJpbmcteW91ci1jaGFuZ2VzXV0KK1NoYXJpbmcgeW91ciBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbXBvcnRpbmcgb3IgZXhwb3J0aW5nIHBhdGNoZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luLi5IRUFEICMgZm9ybWF0IGEgcGF0Y2ggZm9yIGVhY2ggY29tbWl0CisJCQkJIyBpbiBIRUFEIGJ1dCBub3QgaW4gb3JpZ2luCiskIGdpdCBhbSBtYm94ICMgaW1wb3J0IHBhdGNoZXMgZnJvbSB0aGUgbWFpbGJveCAibWJveCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZldGNoIGEgYnJhbmNoIGluIGEgZGlmZmVyZW50IGdpdCByZXBvc2l0b3J5LCB0aGVuIG1lcmdlIGludG8gdGhlCitjdXJyZW50IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0b3JlIHRoZSBmZXRjaGVkIGJyYW5jaCBpbnRvIGEgbG9jYWwgYnJhbmNoIGJlZm9yZSBtZXJnaW5nIGludG8gdGhlCitjdXJyZW50IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2g6bXlicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIGNyZWF0aW5nIGNvbW1pdHMgb24gYSBsb2NhbCBicmFuY2gsIHVwZGF0ZSB0aGUgcmVtb3RlCiticmFuY2ggd2l0aCB5b3VyIGNvbW1pdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIHNzaDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IG15YnJhbmNoOnRoZWlyYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHJlbW90ZSBhbmQgbG9jYWwgYnJhbmNoIGFyZSBib3RoIG5hbWVkICJ0ZXN0IjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggc3NoOi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2hvcnRjdXQgdmVyc2lvbiBmb3IgYSBmcmVxdWVudGx5IHVzZWQgcmVtb3RlIHJlcG9zaXRvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZW1vdGUgYWRkIGV4YW1wbGUgc3NoOi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQKKyQgZ2l0IHB1c2ggZXhhbXBsZSB0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW3JlcG9zaXRvcnktbWFpbnRlbmFuY2VdXQorUmVwb3NpdG9yeSBtYWludGVuYW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDaGVjayBmb3IgY29ycnVwdGlvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZzY2sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlY29tcHJlc3MsIHJlbW92ZSB1bnVzZWQgY3J1ZnQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBnYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitbW3RvZG9dXQorQXBwZW5kaXggQjogTm90ZXMgYW5kIHRvZG8gbGlzdCBmb3IgdGhpcyBtYW51YWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLgorCitUaGUgYmFzaWMgcmVxdWlyZW1lbnRzOgorCS0gSXQgbXVzdCBiZSByZWFkYWJsZSBpbiBvcmRlciwgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCBieQorCSAgc29tZW9uZSBpbnRlbGxpZ2VudCB3aXRoIGEgYmFzaWMgZ3Jhc3Agb2YgdGhlIHVuaXgKKwkgIGNvbW1hbmRsaW5lLCBidXQgd2l0aG91dCBhbnkgc3BlY2lhbCBrbm93bGVkZ2Ugb2YgZ2l0LiAgSWYKKwkgIG5lY2Vzc2FyeSwgYW55IG90aGVyIHByZXJlcXVpc2l0ZXMgc2hvdWxkIGJlIHNwZWNpZmljYWxseQorCSAgbWVudGlvbmVkIGFzIHRoZXkgYXJpc2UuCisJLSBXaGVuZXZlciBwb3NzaWJsZSwgc2VjdGlvbiBoZWFkaW5ncyBzaG91bGQgY2xlYXJseSBkZXNjcmliZQorCSAgdGhlIHRhc2sgdGhleSBleHBsYWluIGhvdyB0byBkbywgaW4gbGFuZ3VhZ2UgdGhhdCByZXF1aXJlcworCSAgbm8gbW9yZSBrbm93bGVkZ2UgdGhhbiBuZWNlc3Nhcnk6IGZvciBleGFtcGxlLCAiaW1wb3J0aW5nCisJICBwYXRjaGVzIGludG8gYSBwcm9qZWN0IiByYXRoZXIgdGhhbiAidGhlIGdpdC1hbSBjb21tYW5kIgorCitUaGluayBhYm91dCBob3cgdG8gY3JlYXRlIGEgY2xlYXIgY2hhcHRlciBkZXBlbmRlbmN5IGdyYXBoIHRoYXQgd2lsbAorYWxsb3cgcGVvcGxlIHRvIGdldCB0byBpbXBvcnRhbnQgdG9waWNzIHdpdGhvdXQgbmVjZXNzYXJpbHkgcmVhZGluZworZXZlcnl0aGluZyBpbiBiZXR3ZWVuLgorCitTY2FuIERvY3VtZW50YXRpb24vIGZvciBvdGhlciBzdHVmZiBsZWZ0IG91dDsgaW4gcGFydGljdWxhcjoKKwlob3d0bydzCisJc29tZSBvZiB0ZWNobmljYWwvPworCWhvb2tzCisJbGlzdCBvZiBjb21tYW5kcyBpbiBnaXRsaW5rOmdpdFsxXQorCitTY2FuIGVtYWlsIGFyY2hpdmVzIGZvciBvdGhlciBzdHVmZiBsZWZ0IG91dAorCitTY2FuIG1hbiBwYWdlcyB0byBzZWUgaWYgYW55IGFzc3VtZSBtb3JlIGJhY2tncm91bmQgdGhhbiB0aGlzIG1hbnVhbAorcHJvdmlkZXMuCisKK1NpbXBsaWZ5IGJlZ2lubmluZyBieSBzdWdnZXN0aW5nIGRpc2Nvbm5lY3RlZCBoZWFkIGluc3RlYWQgb2YKK3RlbXBvcmFyeSBicmFuY2ggY3JlYXRpb24/CisKK0FkZCBtb3JlIGdvb2QgZXhhbXBsZXMuICBFbnRpcmUgc2VjdGlvbnMgb2YganVzdCBjb29rYm9vayBleGFtcGxlcworbWlnaHQgYmUgYSBnb29kIGlkZWE7IG1heWJlIG1ha2UgYW4gImFkdmFuY2VkIGV4YW1wbGVzIiBzZWN0aW9uIGEKK3N0YW5kYXJkIGVuZC1vZi1jaGFwdGVyIHNlY3Rpb24/CisKK0luY2x1ZGUgY3Jvc3MtcmVmZXJlbmNlcyB0byB0aGUgZ2xvc3NhcnksIHdoZXJlIGFwcHJvcHJpYXRlLgorCitEb2N1bWVudCBzaGFsbG93IGNsb25lcz8gIFNlZSBkcmFmdCAxLjUuMCByZWxlYXNlIG5vdGVzIGZvciBzb21lCitkb2N1bWVudGF0aW9uLgorCitBZGQgYSBzZWN0aW9uIG9uIHdvcmtpbmcgd2l0aCBvdGhlciB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcywgaW5jbHVkaW5nCitDVlMsIFN1YnZlcnNpb24sIGFuZCBqdXN0IGltcG9ydHMgb2Ygc2VyaWVzIG9mIHJlbGVhc2UgdGFyYmFsbHMuCisKK01vcmUgZGV0YWlscyBvbiBnaXR3ZWI/CisKK1dyaXRlIGEgY2hhcHRlciBvbiB1c2luZyBwbHVtYmluZyBhbmQgd3JpdGluZyBzY3JpcHRzLgorCitBbHRlcm5hdGVzLCBjbG9uZSAtcmVmZXJlbmNlLCBldGMuCisKK2dpdCB1bnBhY2stb2JqZWN0cyAtciBmb3IgcmVjb3ZlcnkKZGlmZiAtLWdpdCBhL0dJVC1WRVJTSU9OLUdFTiBiL0dJVC1WRVJTSU9OLUdFTgppbmRleCBlZWU0OTVhLi41YzZkMmIyIDEwMDc1NQotLS0gYS9HSVQtVkVSU0lPTi1HRU4KKysrIGIvR0lULVZFUlNJT04tR0VOCkBAIC0xLDY1ICsxLDMwIEBACiAjIS9iaW4vc2gKIAogR1ZGPUdJVC1WRVJTSU9OLUZJTEUKLURFRl9WRVI9MC43LkdJVEdVSQorREVGX1ZFUj12MS41LjIuMy5HSVQKIAogTEY9JwogJwogCi10cmVlX3NlYXJjaCAoKQotewotCWhlYWQ9JDEKLQl0cmVlPSQyCi0JZm9yIHAgaW4gJChnaXQgcmV2LWxpc3QgLS1wYXJlbnRzIC0tbWF4LWNvdW50PTEgJGhlYWQgMj4vZGV2L251bGwpCi0JZG8KLQkJdGVzdCAkdHJlZSA9ICQoZ2l0IHJldi1wYXJzZSAkcF57dHJlZX0gMj4vZGV2L251bGwpICYmCi0JCXZuPSQoZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgJHAgMj4vZGV2L251bGwpICYmCi0JCWNhc2UgIiR2biIgaW4KLQkJZ2l0Z3VpLVswLTldKikgZWNobyAkdm47IGJyZWFrOzsKLQkJZXNhYwotCWRvbmUKLX0KLQotIyBBbHdheXMgdXNlIHRoZSB0YXJiYWxsIHZlcnNpb24gZmlsZSBpZiBmb3VuZCwganVzdAotIyBpbiBjYXNlIHdlIGFyZSBzb21laG93IGNvbnRhaW5lZCBpbiBhIGxhcmdlciBnaXQKLSMgcmVwb3NpdG9yeSB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgdHJhY2sgb3VyIHN0YXRlLgotIyAoQXQgbGVhc3Qgb25lIHBhY2thZ2UgbWFuYWdlciBpcyBkb2luZyB0aGlzLikKLSMKLSMgV2UgbWF5IGJlIGEgc3VicHJvamVjdCwgc28gdHJ5IGxvb2tpbmcgZm9yIHRoZSBtZXJnZQotIyBjb21taXQgdGhhdCBzdXBwbGllZCB0aGlzIGRpcmVjdG9yeSBjb250ZW50IGlmIHdlIGFyZQotIyBub3QgYXQgdGhlIHRvcGxldmVsLiAgV2UgcHJvYmFibHkgd2lsbCBhbHdheXMgYmUgdGhlCi0jIHNlY29uZCBwYXJlbnQgaW4gdGhlIGNvbW1pdCwgYnV0IHdlIHNob3VsZG4ndCByZWx5IG9uCi0jIHRoYXQgZmFjdC4KLSMKLSMgSWYgd2UgYXJlIGF0IHRoZSB0b3BsZXZlbCBvciB0aGUgbWVyZ2UgYXNzdW1wdGlvbiBmYWlscwotIyB0cnkgbG9va2luZyBmb3IgYSBnaXRndWktKiB0YWcuCi0KLWlmIHRlc3QgLWYgdmVyc2lvbiAmJgotICAgVk49JChjYXQgdmVyc2lvbikKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBmaWxlIChpbmNsdWRlZCBpbiByZWxlYXNlIHRhcmJhbGxzKSwKKyMgdGhlbiB0cnkgZ2l0LWRlc2NyaWJlLCB0aGVuIGRlZmF1bHQuCitpZiB0ZXN0IC1mIHZlcnNpb24KIHRoZW4KLQk6IGhhcHB5Ci1lbGlmIHByZWZpeD0iJChnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXggMj4vZGV2L251bGwpIgotICAgdGVzdCAtbiAiJHByZWZpeCIgJiYKLSAgIGhlYWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEIC0tIC4gMj4vZGV2L251bGwpICYmCi0gICB0cmVlPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiSEVBRDokcHJlZml4IiAyPi9kZXYvbnVsbCkgJiYKLSAgIFZOPSQodHJlZV9zZWFyY2ggJGhlYWQgJHRyZWUpCi0gICBjYXNlICIkVk4iIGluCi0gICBnaXRndWktWzAtOV0qKSA6IGhhcHB5IDs7Ci0gICAqKSAoZXhpdCAxKSA7OwotICAgZXNhYworCVZOPSQoY2F0IHZlcnNpb24pIHx8IFZOPSIkREVGX1ZFUiIKK2VsaWYgdGVzdCAtZCAuZ2l0ICYmCisJVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorCWNhc2UgIiRWTiIgaW4KKwkqJExGKikgKGV4aXQgMSkgOzsKKwl2WzAtOV0qKSA6IGhhcHB5IDs7CisJZXNhYwogdGhlbgotCVZOPSQoZWNobyAiJFZOIiB8IHNlZCAtZSAncy9eZ2l0Z3VpLS8vO3MvLS8uL2cnKTsKLWVsaWYgVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgotICAgY2FzZSAiJFZOIiBpbgotICAgZ2l0Z3VpLVswLTldKikgOiBoYXBweSA7OwotICAgKikgKGV4aXQgMSkgOzsKLSAgIGVzYWMKLXRoZW4KLQlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvXmdpdGd1aS0vLztzLy0vLi9nJyk7CisJVk49JChlY2hvICIkVk4iIHwgc2VkIC1lICdzLy0vLi9nJyk7CiBlbHNlCiAJVk49IiRERUZfVkVSIgogZmkKIAorVk49JChleHByICIkVk4iIDogdionXCguKlwpJykKKwogZGlydHk9JChzaCAtYyAnZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCcgMj4vZGV2L251bGwpIHx8IGRpcnR5PQogY2FzZSAiJGRpcnR5IiBpbgogJycpCkBAIC03MCwxMSArMzUsMTMgQEAKIAogaWYgdGVzdCAtciAkR1ZGCiB0aGVuCi0JVkM9JChzZWQgLWUgJ3MvXkdJVEdVSV9WRVJTSU9OID0gLy8nIDwkR1ZGKQorCVZDPSQoc2VkIC1lICdzL15HSVRfVkVSU0lPTiA9IC8vJyA8JEdWRikKIGVsc2UKIAlWQz11bnNldAogZmkKIHRlc3QgIiRWTiIgPSAiJFZDIiB8fCB7Ci0JZWNobyA+JjIgIkdJVEdVSV9WRVJTSU9OID0gJFZOIgotCWVjaG8gIkdJVEdVSV9WRVJTSU9OID0gJFZOIiA+JEdWRgorCWVjaG8gPiYyICJHSVRfVkVSU0lPTiA9ICRWTiIKKwllY2hvICJHSVRfVkVSU0lPTiA9ICRWTiIgPiRHVkYKIH0KKworCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFjNjViCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDExNCBAQAorCisJCUdpdCBpbnN0YWxsYXRpb24KKworTm9ybWFsbHkgeW91IGNhbiBqdXN0IGRvICJtYWtlIiBmb2xsb3dlZCBieSAibWFrZSBpbnN0YWxsIiwgYW5kIHRoYXQKK3dpbGwgaW5zdGFsbCB0aGUgZ2l0IHByb2dyYW1zIGluIHlvdXIgb3duIH4vYmluLyBkaXJlY3RvcnkuICBJZiB5b3Ugd2FudAordG8gZG8gYSBnbG9iYWwgaW5zdGFsbCwgeW91IGNhbiBkbworCisJJCBtYWtlIHByZWZpeD0vdXNyIGFsbCBkb2MgOyMgYXMgeW91cnNlbGYKKwkjIG1ha2UgcHJlZml4PS91c3IgaW5zdGFsbCBpbnN0YWxsLWRvYyA7IyBhcyByb290CisKKyhvciBwcmVmaXg9L3Vzci9sb2NhbCwgb2YgY291cnNlKS4gIEp1c3QgbGlrZSBhbnkgcHJvZ3JhbSBzdWl0ZQordGhhdCB1c2VzICRwcmVmaXgsIHRoZSBidWlsdCByZXN1bHRzIGhhdmUgc29tZSBwYXRocyBlbmNvZGVkLAord2hpY2ggYXJlIGRlcml2ZWQgZnJvbSAkcHJlZml4LCBzbyAibWFrZSBhbGw7IG1ha2UgcHJlZml4PS91c3IKK2luc3RhbGwiIHdvdWxkIG5vdCB3b3JrLgorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIGF1dG9jb25mIGdlbmVyYXRlZCAuL2NvbmZpZ3VyZSBzY3JpcHQgdG8KK3NldCB1cCBpbnN0YWxsIHBhdGhzICh2aWEgY29uZmlnLm1hay5hdXRvZ2VuKSwgc28geW91IGNhbiB3cml0ZSBpbnN0ZWFkCisKKwkkIG1ha2UgY29uZmlndXJlIDsjIGFzIHlvdXJzZWxmCisJJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIDsjIGFzIHlvdXJzZWxmCisJJCBtYWtlIGFsbCBkb2MgOyMgYXMgeW91cnNlbGYKKwkjIG1ha2UgaW5zdGFsbCBpbnN0YWxsLWRvYyA7IyBhcyByb290CisKKworSXNzdWVzIG9mIG5vdGU6CisKKyAtIGdpdCBub3JtYWxseSBpbnN0YWxscyBhIGhlbHBlciBzY3JpcHQgd3JhcHBlciBjYWxsZWQgImdpdCIsIHdoaWNoCisgICBjb25mbGljdHMgd2l0aCBhIHNpbWlsYXJseSBuYW1lZCAiR05VIGludGVyYWN0aXZlIHRvb2xzIiBwcm9ncmFtLgorCisgICBUb3VnaC4gIEVpdGhlciBkb24ndCB1c2UgdGhlIHdyYXBwZXIgc2NyaXB0LCBvciBkZWxldGUgdGhlIG9sZCBHTlUKKyAgIGludGVyYWN0aXZlIHRvb2xzLiAgTm9uZSBvZiB0aGUgY29yZSBnaXQgc3R1ZmYgbmVlZHMgdGhlIHdyYXBwZXIsCisgICBpdCdzIGp1c3QgYSBjb252ZW5pZW50IHNob3J0aGFuZCBhbmQgd2hpbGUgaXQgaXMgZG9jdW1lbnRlZCBpbiBzb21lCisgICBwbGFjZXMsIHlvdSBjYW4gYWx3YXlzIHJlcGxhY2UgImdpdCBjb21taXQiIHdpdGggImdpdC1jb21taXQiCisgICBpbnN0ZWFkLiAKKworICAgQnV0IGxldCdzIGZhY2UgaXQsIG1vc3Qgb2YgdXMgZG9uJ3QgaGF2ZSBHTlUgaW50ZXJhY3RpdmUgdG9vbHMsIGFuZAorICAgZXZlbiBpZiB3ZSBoYWQgaXQsIHdlIHdvdWxkbid0IGtub3cgd2hhdCBpdCBkb2VzLiAgSSBkb24ndCB0aGluayBpdAorICAgaGFzIGJlZW4gYWN0aXZlbHkgZGV2ZWxvcGVkIHNpbmNlIDE5OTcsIGFuZCBwZW9wbGUgaGF2ZSBtb3ZlZCBvdmVyIHRvCisgICBncmFwaGljYWwgZmlsZSBtYW5hZ2Vycy4KKworIC0gWW91IGNhbiB1c2UgZ2l0IGFmdGVyIGJ1aWxkaW5nIGJ1dCB3aXRob3V0IGluc3RhbGxpbmcgaWYgeW91CisgICB3YW50ZWQgdG8uICBWYXJpb3VzIGdpdCBjb21tYW5kcyBuZWVkIHRvIGZpbmQgb3RoZXIgZ2l0CisgICBjb21tYW5kcyBhbmQgc2NyaXB0cyB0byBkbyB0aGVpciB3b3JrLCBzbyB5b3Ugd291bGQgbmVlZCB0bworICAgYXJyYW5nZSBhIGZldyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdGVsbCB0aGVtIHRoYXQgdGhlaXIKKyAgIGZyaWVuZHMgd2lsbCBiZSBmb3VuZCBpbiB5b3VyIGJ1aWx0IHNvdXJjZSBhcmVhIGluc3RlYWQgb2YgYXQKKyAgIHRoZWlyIHN0YW5kYXJkIGluc3RhbGxhdGlvbiBhcmVhLiAgU29tZXRoaW5nIGxpa2UgdGhpcyB3b3JrcworICAgZm9yIG1lOgorCisJR0lUX0VYRUNfUEFUSD1gcHdkYAorCVBBVEg9YHB3ZGA6JFBBVEgKKwlHSVRQRVJMTElCPWBwd2RgL3BlcmwvYmxpYi9saWIKKwlleHBvcnQgR0lUX0VYRUNfUEFUSCBQQVRIIEdJVFBFUkxMSUIKKworIC0gR2l0IGlzIHJlYXNvbmFibHkgc2VsZi1zdWZmaWNpZW50LCBidXQgZG9lcyBkZXBlbmQgb24gYSBmZXcgZXh0ZXJuYWwKKyAgIHByb2dyYW1zIGFuZCBsaWJyYXJpZXM6CisKKwktICJ6bGliIiwgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkuIEdpdCB3b24ndCBidWlsZCB3aXRob3V0IGl0LgorCisJLSAib3BlbnNzbCIuICBUaGUgZ2l0LXJldi1saXN0IHByb2dyYW0gdXNlcyBiaWdudW0gc3VwcG9ydCBmcm9tCisJICBvcGVuc3NsLCBhbmQgdW5sZXNzIHlvdSBzcGVjaWZ5IG90aGVyd2lzZSwgeW91J2xsIGFsc28gZ2V0IHRoZQorCSAgU0hBMSBsaWJyYXJ5IGZyb20gaGVyZS4KKworCSAgSWYgeW91IGRvbid0IGhhdmUgb3BlbnNzbCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBTSEExIGxpYnJhcmllcworCSAgdGhhdCBjb21lIHdpdGggZ2l0IChnaXQgaW5jbHVkZXMgdGhlIG9uZSBmcm9tIE1vemlsbGEsIGFuZCBoYXMKKwkgIGl0cyBvd24gUG93ZXJQQyBhbmQgQVJNIG9wdGltaXplZCBvbmVzIHRvbyAtIHNlZSB0aGUgTWFrZWZpbGUpLgorCisJLSAibGliY3VybCIgYW5kICJjdXJsIiBleGVjdXRhYmxlLiAgZ2l0LWh0dHAtZmV0Y2ggYW5kCisJICBnaXQtZmV0Y2ggdXNlIHRoZW0uICBJZiB5b3UgZG8gbm90IHVzZSBodHRwCisJICB0cmFuc2ZlciwgeW91IGFyZSBwcm9iYWJseSBPSyBpZiB5b3UgZG8gbm90IGhhdmUKKwkgIHRoZW0uCisKKwktIGV4cGF0IGxpYnJhcnk7IGdpdC1odHRwLXB1c2ggdXNlcyBpdCBmb3IgcmVtb3RlIGxvY2sKKwkgIG1hbmFnZW1lbnQgb3ZlciBEQVYuICBTaW1pbGFyIHRvICJjdXJsIiBhYm92ZSwgdGhpcyBpcyBvcHRpb25hbC4KKworICAgICAgICAtICJ3aXNoIiwgdGhlIFRjbC9UayB3aW5kb3dpbmcgc2hlbGwgaXMgdXNlZCBpbiBnaXRrIHRvIHNob3cgdGhlCisgICAgICAgICAgaGlzdG9yeSBncmFwaGljYWxseQorCisJLSAic3NoIiBpcyB1c2VkIHRvIHB1c2ggYW5kIHB1bGwgb3ZlciB0aGUgbmV0CisKKwktICJwZXJsIiBhbmQgUE9TSVgtY29tcGxpYW50IHNoZWxscyBhcmUgbmVlZGVkIHRvIHVzZSBtb3N0IG9mCisJICB0aGUgYmFyZWJvbmUgUG9yY2VsYWluaXNoIHNjcmlwdHMuCisKKyAtIFNvbWUgcGxhdGZvcm0gc3BlY2lmaWMgaXNzdWVzIGFyZSBkZWFsdCB3aXRoIE1ha2VmaWxlIHJ1bGVzLAorICAgYnV0IGRlcGVuZGluZyBvbiB5b3VyIHNwZWNpZmljIGluc3RhbGxhdGlvbiwgeW91IG1heSBub3QKKyAgIGhhdmUgYWxsIHRoZSBsaWJyYXJpZXMvdG9vbHMgbmVlZGVkLCBvciB5b3UgbWF5IGhhdmUKKyAgIG5lY2Vzc2FyeSBsaWJyYXJpZXMgYXQgdW51c3VhbCBsb2NhdGlvbnMuICBQbGVhc2UgbG9vayBhdCB0aGUKKyAgIHRvcCBvZiB0aGUgTWFrZWZpbGUgdG8gc2VlIHdoYXQgY2FuIGJlIGFkanVzdGVkIGZvciB5b3VyIG5lZWRzLgorICAgWW91IGNhbiBwbGFjZSBsb2NhbCBzZXR0aW5ncyBpbiBjb25maWcubWFrIGFuZCB0aGUgTWFrZWZpbGUKKyAgIHdpbGwgaW5jbHVkZSB0aGVtLiAgTm90ZSB0aGF0IGNvbmZpZy5tYWsgaXMgbm90IGRpc3RyaWJ1dGVkOworICAgdGhlIG5hbWUgaXMgcmVzZXJ2ZWQgZm9yIGxvY2FsIHNldHRpbmdzLgorCisgLSBUbyBidWlsZCBhbmQgaW5zdGFsbCBkb2N1bWVudGF0aW9uIHN1aXRlLCB5b3UgbmVlZCB0byBoYXZlIHRoZQorICAgYXNjaWlkb2MveG1sdG8gdG9vbGNoYWluLiAgQWx0ZXJuYXRpdmVseSwgcHJlLWZvcm1hdHRlZAorICAgZG9jdW1lbnRhdGlvbiBhcmUgYXZhaWxhYmxlIGluICJodG1sIiBhbmQgIm1hbiIgYnJhbmNoZXMgb2YgdGhlIGdpdAorICAgcmVwb3NpdG9yeSBpdHNlbGYuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkOgorCisJJCBta2RpciBtYW51YWwgJiYgY2QgbWFudWFsCisJJCBnaXQgaW5pdAorCSQgZ2l0IGZldGNoLXBhY2sgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCBtYW4gaHRtbCB8CisJICB3aGlsZSByZWFkIGEgYgorCSAgZG8KKwkgICAgZWNobyAkYSA+LmdpdC8kYgorCSAgZG9uZQorCSQgY3AgLmdpdC9yZWZzL2hlYWRzL21hbiAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCisJJCBnaXQgY2hlY2tvdXQKKworICAgdG8gY2hlY2tvdXQgdGhlIHByZS1idWlsdCBtYW4gcGFnZXMuICBBbHNvIGluIHRoaXMgcmVwb3NpdG9yeToKKworCSQgZ2l0IGNoZWNrb3V0IGh0bWwKKworICAgd291bGQgaW5zdGVhZCBnaXZlIHlvdSBhIGNvcHkgb2Ygd2hhdCB5b3Ugc2VlIGF0OgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCisKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggYWI1NTBmYy4uZWI0NDNiZCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsMTM1ICsxLDExMjUgQEAKKyMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KIGFsbDo6CiAKICMgRGVmaW5lIFY9MSB0byBoYXZlIGEgbW9yZSB2ZXJib3NlIGNvbXBpbGUuCiAjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0VYUEFUIGlmIHlvdSBkbyBub3QgaGF2ZSBleHBhdCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdXNoIGlzCisjIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgcHVzaCB1c2luZyBodHRwOi8vIGFuZCBodHRwczovLyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KKyMKKyMgRGVmaW5lIE5PX0RfVFlQRV9JTl9ESVJFTlQgaWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzIERUX1VOS05PV04gYnV0IGxhY2tzCisjIGRfdHlwZSBpbiBzdHJ1Y3QgZGlyZW50IChsYXRlc3QgQ3lnd2luIC0tIHdpbGwgYmUgZml4ZWQgc29vbmlzaCkuCisjCisjIERlZmluZSBOT19DOTlfRk9STUFUIGlmIHlvdXIgZm9ybWF0dGVkIElPIGZ1bmN0aW9ucyAocHJpbnRmL3NjYW5mIGV0LmFsLikKKyMgZG8gbm90IHN1cHBvcnQgdGhlICdzaXplIHNwZWNpZmllcnMnIGludHJvZHVjZWQgYnkgQzk5LCBuYW1lbHkgbGwsIGhoLAorIyBqLCB6LCB0LiAocmVwcmVzZW50aW5nIGxvbmcgbG9uZyBpbnQsIGNoYXIsIGludG1heF90LCBzaXplX3QsIHB0cmRpZmZfdCkuCisjIHNvbWUgQyBjb21waWxlcnMgc3VwcG9ydGVkIHRoZXNlIHNwZWNpZmllcnMgcHJpb3IgdG8gQzk5IGFzIGFuIGV4dGVuc2lvbi4KKyMKKyMgRGVmaW5lIE5PX1NUUkNBU0VTVFIgaWYgeW91IGRvbid0IGhhdmUgc3RyY2FzZXN0ci4KKyMKKyMgRGVmaW5lIE5PX1NUUkxDUFkgaWYgeW91IGRvbid0IGhhdmUgc3RybGNweS4KKyMKKyMgRGVmaW5lIE5PX1NUUlRPVU1BWCBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJ0b3VtYXggaW4gdGhlIEMgbGlicmFyeS4KKyMgSWYgeW91ciBjb21waWxlciBhbHNvIGRvZXMgbm90IHN1cHBvcnQgbG9uZyBsb25nIG9yIGRvZXMgbm90IGhhdmUKKyMgc3RydG91bGwsIGRlZmluZSBOT19TVFJUT1VMTC4KKyMKKyMgRGVmaW5lIE5PX1NFVEVOViBpZiB5b3UgZG9uJ3QgaGF2ZSBzZXRlbnYgaW4gdGhlIEMgbGlicmFyeS4KKyMKKyMgRGVmaW5lIE5PX1NZTUxJTktfSEVBRCBpZiB5b3UgbmV2ZXIgd2FudCAuZ2l0L0hFQUQgdG8gYmUgYSBzeW1ib2xpYyBsaW5rLgorIyBFbmFibGUgaXQgb24gV2luZG93cy4gIEJ5IGRlZmF1bHQsIHN5bXJlZnMgYXJlIHN0aWxsIHVzZWQuCisjCisjIERlZmluZSBOT19TVk5fVEVTVFMgaWYgeW91IHdhbnQgdG8gc2tpcCB0aW1lLWNvbnN1bWluZyBTVk4gaW50ZXJvcGVyYWJpbGl0eQorIyB0ZXN0cy4gIFRoZXNlIHRlc3RzIHRha2UgdXAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGhlIHRvdGFsIHRlc3QgdGltZQorIyBidXQgYXJlIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBwbGFuIHRvIHRhbGsgdG8gU1ZOIHJlcG9zLgorIworIyBEZWZpbmUgTk9fRklOSyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIERhcndpbi9NYWMgT1MgWCwgaGF2ZSBGaW5rCisjIGluc3RhbGxlZCBpbiAvc3csIGJ1dCBkb24ndCB3YW50IEdJVCB0byBsaW5rIGFnYWluc3QgYW55IGxpYnJhcmllcworIyBpbnN0YWxsZWQgdGhlcmUuICBJZiBkZWZpbmVkIHlvdSBtYXkgc3BlY2lmeSB5b3VyIG93biAob3IgRmluaydzKQorIyBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzIGJ5IGRlZmluaW5nIENGTEFHUworIyBhbmQgTERGTEFHUyBhcHByb3ByaWF0ZWx5LgorIworIyBEZWZpbmUgTk9fREFSV0lOX1BPUlRTIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLAorIyBoYXZlIERhcndpblBvcnRzIGluc3RhbGxlZCBpbiAvb3B0L2xvY2FsLCBidXQgZG9uJ3Qgd2FudCBHSVQgdG8KKyMgbGluayBhZ2FpbnN0IGFueSBsaWJyYXJpZXMgaW5zdGFsbGVkIHRoZXJlLiAgSWYgZGVmaW5lZCB5b3UgbWF5CisjIHNwZWNpZnkgeW91ciBvd24gKG9yIERhcndpblBvcnQncykgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQKKyMgbGlicmFyeSBkaXJlY3RvcmllcyBieSBkZWZpbmluZyBDRkxBR1MgYW5kIExERkxBR1MgYXBwcm9wcmlhdGVseS4KKyMKKyMgRGVmaW5lIFBQQ19TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBQb3dlclBDLgorIworIyBEZWZpbmUgQVJNX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIEFSTS4KKyMKKyMgRGVmaW5lIE1PWklMTEFfU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIGNvbWluZyBmcm9tIE1vemlsbGEuIEl0IGlzIEdQTCdkIGFuZCBzaG91bGQgYmUgZmFzdAorIyBvbiBub24teDg2IGFyY2hpdGVjdHVyZXMgKGUuZy4gUG93ZXJQQyksIHdoaWxlIHRoZSBPcGVuU1NMIHZlcnNpb24gKGRlZmF1bHQKKyMgY2hvaWNlKSBoYXMgdmVyeSBmYXN0IHZlcnNpb24gb3B0aW1pemVkIGZvciBpNTg2LgorIworIyBEZWZpbmUgTkVFRFNfU1NMX1dJVEhfQ1JZUFRPIGlmIHlvdSBuZWVkIC1sY3J5cHRvIHdpdGggLWxzc2wgKERhcndpbikuCisjCisjIERlZmluZSBORUVEU19MSUJJQ09OViBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChEYXJ3aW4pLgorIworIyBEZWZpbmUgTkVFRFNfU09DS0VUIGlmIGxpbmtpbmcgd2l0aCBsaWJjIGlzIG5vdCBlbm91Z2ggKFN1bk9TLAorIyBQYXRyaWNrIE1hdXJpdHopLgorIworIyBEZWZpbmUgTk9fTU1BUCBpZiB5b3Ugd2FudCB0byBhdm9pZCBtbWFwLgorIworIyBEZWZpbmUgTk9fUFJFQUQgaWYgeW91IGhhdmUgYSBwcm9ibGVtIHdpdGggcHJlYWQoKSBzeXN0ZW0gY2FsbCAoZS5nLgorIyBjeWd3aW4uZGxsIGJlZm9yZSB2MS41LjIyKS4KKyMKKyMgRGVmaW5lIE5PX0ZBU1RfV09SS0lOR19ESVJFQ1RPUlkgaWYgYWNjZXNzaW5nIG9iamVjdHMgaW4gcGFjayBmaWxlcyBpcworIyBnZW5lcmFsbHkgZmFzdGVyIG9uIHlvdXIgcGxhdGZvcm0gdGhhbiBhY2Nlc3NpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorIworIyBEZWZpbmUgTk9fVFJVU1RBQkxFX0ZJTEVNT0RFIGlmIHlvdXIgZmlsZXN5c3RlbSBtYXkgY2xhaW0gdG8gc3VwcG9ydAorIyB0aGUgZXhlY3V0YWJsZSBtb2RlIGJpdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIHNvLgorIworIyBEZWZpbmUgTk9fSVBWNiBpZiB5b3UgbGFjayBJUHY2IHN1cHBvcnQgYW5kIGdldGFkZHJpbmZvKCkuCisjCisjIERlZmluZSBOT19TT0NLQUREUl9TVE9SQUdFIGlmIHlvdXIgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBzdHJ1Y3QKKyMgc29ja2FkZHJfc3RvcmFnZS4KKyMKKyMgRGVmaW5lIE5PX0lDT05WIGlmIHlvdXIgbGliYyBkb2VzIG5vdCBwcm9wZXJseSBzdXBwb3J0IGljb252LgorIworIyBEZWZpbmUgT0xEX0lDT05WIGlmIHlvdXIgbGlicmFyeSBoYXMgYW4gb2xkIGljb252KCksIHdoZXJlIHRoZSBzZWNvbmQKKyMgKGlucHV0IGJ1ZmZlciBwb2ludGVyKSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgd2l0aCB0eXBlIChjb25zdCBjaGFyICoqKS4KKyMKKyMgRGVmaW5lIE5PX1JfVE9fR0NDX0xJTktFUiBpZiB5b3VyIGdjYyBkb2VzIG5vdCBsaWtlICItUi9wYXRoL2xpYiIKKyMgdGhhdCB0ZWxscyBydW50aW1lIHBhdGhzIHRvIGR5bmFtaWMgbGlicmFyaWVzOworIyAiLVdsLC1ycGF0aD0vcGF0aC9saWIiIGlzIHVzZWQgaW5zdGVhZC4KKyMKKyMgRGVmaW5lIFVTRV9OU0VDIGJlbG93IGlmIHlvdSB3YW50IGdpdCB0byBjYXJlIGFib3V0IHN1Yi1zZWNvbmQgZmlsZSBtdGltZXMKKyMgYW5kIGN0aW1lcy4gTm90ZSB0aGF0IHlvdSBuZWVkIHJlY2VudCBnbGliYyAoYXQgbGVhc3QgMi4yLjQpIGZvciB0aGlzLCBhbmQKKyMgaXQgd2lsbCBCUkVBSyBZT1VSIExPQ0FMIERJRkZTISBzaG93LWRpZmYgYW5kIGFueXRoaW5nIHVzaW5nIGl0IHdpbGwgbGlrZWx5CisjIHJhbmRvbWx5IGJyZWFrIHVubGVzcyB5b3VyIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBzdXBwb3J0cyB0aG9zZSBzdWItc2Vjb25kCisjIHRpbWVzIChteSBleHQzIGRvZXNuJ3QpLgorIworIyBEZWZpbmUgVVNFX1NUREVWIGJlbG93IGlmIHlvdSB3YW50IGdpdCB0byBjYXJlIGFib3V0IHRoZSB1bmRlcmx5aW5nIGRldmljZQorIyBjaGFuZ2UgYmVpbmcgY29uc2lkZXJlZCBhbiBpbm9kZSBjaGFuZ2UgZnJvbSB0aGUgdXBkYXRlLWNhY2hlIHBlcnNwZWN0aXZlLgorIworIyBEZWZpbmUgQVNDSUlET0M4IGlmIHlvdSB3YW50IHRvIGZvcm1hdCBkb2N1bWVudGF0aW9uIHdpdGggQXNjaWlEb2MgOAorIworIyBEZWZpbmUgTk9fUEVSTF9NQUtFTUFLRVIgaWYgeW91IGNhbm5vdCB1c2UgTWFrZWZpbGVzIGdlbmVyYXRlZCBieSBwZXJsJ3MKKyMgTWFrZU1ha2VyIChlLmcuIHVzaW5nIEFjdGl2ZVN0YXRlIHVuZGVyIEN5Z3dpbikuCisjCisjIERlZmluZSBXSVRIX1A0SU1QT1JUIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIFB5dGhvbiBnaXQtcDRpbXBvcnQgc2NyaXB0LgorIworIyBEZWZpbmUgTk9fVENMVEsgaWYgeW91IGRvIG5vdCB3YW50IFRjbC9UayBHVUkuCisjCisjIFRoZSBUQ0xfUEFUSCB2YXJpYWJsZSBnb3Zlcm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgVGNsIGludGVycHJldGVyCisjIHVzZWQgdG8gb3B0aW1pemUgZ2l0LWd1aSBmb3IgeW91ciBzeXN0ZW0uICBPbmx5IHVzZWQgaWYgTk9fVENMVEsKKyMgaXMgbm90IHNldC4gIERlZmF1bHRzIHRvIHRoZSBiYXJlICd0Y2xzaCcuCisjCisjIFRoZSBUQ0xUS19QQVRIIHZhcmlhYmxlIGdvdmVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBUY2wvVGsgaW50ZXJwcmV0ZXIuCisjIElmIG5vdCBzZXQgaXQgZGVmYXVsdHMgdG8gdGhlIGJhcmUgJ3dpc2gnLiBJZiBpdCBpcyBzZXQgdG8gdGhlIGVtcHR5CisjIHN0cmluZyB0aGVuIE5PX1RDTFRLIHdpbGwgYmUgZm9yY2VkICh0aGlzIGlzIHVzZWQgYnkgY29uZmlndXJlIHNjcmlwdCkuCisjCiAKIEdJVC1WRVJTSU9OLUZJTEU6IC5GT1JDRS1HSVQtVkVSU0lPTi1GSUxFCiAJQCQoU0hFTExfUEFUSCkgLi9HSVQtVkVSU0lPTi1HRU4KIC1pbmNsdWRlIEdJVC1WRVJTSU9OLUZJTEUKIAordW5hbWVfUyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9NIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKIHVuYW1lX08gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW8gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfUiA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtciAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9QIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1wIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKIAotU0NSSVBUX1NIID0gZ2l0LWd1aS5zaAotR0lUR1VJX0JVSUxUX0lOUyA9IGdpdC1jaXRvb2wKLUFMTF9QUk9HUkFNUyA9ICQoR0lUR1VJX0JVSUxUX0lOUykgJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKQotQUxMX0xJQkZJTEVTID0gJCh3aWxkY2FyZCBsaWIvKi50Y2wpCi1QUkVMT0FEX0ZJTEVTID0gbGliL2NsYXNzLnRjbAorIyBDRkxBR1MgYW5kIExERkxBR1MgYXJlIGZvciB0aGUgdXNlcnMgdG8gb3ZlcnJpZGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgogCitDRkxBR1MgPSAtZyAtTzIgLVdhbGwKK0xERkxBR1MgPQorQUxMX0NGTEFHUyA9ICQoQ0ZMQUdTKQorQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCitTVFJJUCA/PSBzdHJpcAorCitwcmVmaXggPSAkKEhPTUUpCitiaW5kaXIgPSAkKHByZWZpeCkvYmluCitnaXRleGVjZGlyID0gJChiaW5kaXIpCitzaGFyZWRpciA9ICQocHJlZml4KS9zaGFyZS8KK3RlbXBsYXRlX2RpciA9ICQoc2hhcmVkaXIpL2dpdC1jb3JlL3RlbXBsYXRlcy8KK2lmZXEgKCQocHJlZml4KSwvdXNyKQorc3lzY29uZmRpciA9IC9ldGMKK2Vsc2UKK3N5c2NvbmZkaXIgPSAkKHByZWZpeCkvZXRjCitlbmRpZgorRVRDX0dJVENPTkZJRyA9ICQoc3lzY29uZmRpcikvZ2l0Y29uZmlnCisjIERFU1RESVI9CisKKyMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBnaXR3ZWIKK0dJVFdFQl9DT05GSUcgPSBnaXR3ZWJfY29uZmlnLnBlcmwKK0dJVFdFQl9IT01FX0xJTktfU1RSID0gcHJvamVjdHMKK0dJVFdFQl9TSVRFTkFNRSA9CitHSVRXRUJfUFJPSkVDVFJPT1QgPSAvcHViL2dpdAorR0lUV0VCX0VYUE9SVF9PSyA9CitHSVRXRUJfU1RSSUNUX0VYUE9SVCA9CitHSVRXRUJfQkFTRV9VUkwgPQorR0lUV0VCX0xJU1QgPQorR0lUV0VCX0hPTUVURVhUID0gaW5kZXh0ZXh0Lmh0bWwKK0dJVFdFQl9DU1MgPSBnaXR3ZWIuY3NzCitHSVRXRUJfTE9HTyA9IGdpdC1sb2dvLnBuZworR0lUV0VCX0ZBVklDT04gPSBnaXQtZmF2aWNvbi5wbmcKK0dJVFdFQl9TSVRFX0hFQURFUiA9CitHSVRXRUJfU0lURV9GT09URVIgPQorCitleHBvcnQgcHJlZml4IGJpbmRpciBnaXRleGVjZGlyIHNoYXJlZGlyIHRlbXBsYXRlX2RpciBzeXNjb25mZGlyCisKK0NDID0gZ2NjCitBUiA9IGFyCitUQVIgPSB0YXIKK0lOU1RBTEwgPSBpbnN0YWxsCitSUE1CVUlMRCA9IHJwbWJ1aWxkCitUQ0xfUEFUSCA9IHRjbHNoCitUQ0xUS19QQVRIID0gd2lzaAorCitleHBvcnQgVENMX1BBVEggVENMVEtfUEFUSAorCisjIHNwYXJzZSBpcyBhcmNoaXRlY3R1cmUtbmV1dHJhbCwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHRlbGwgaXQKKyMgZXhwbGljaXRseSB3aGF0IGFyY2hpdGVjdHVyZSB0byBjaGVjayBmb3IuIEZpeCB0aGlzIHVwIGZvciB5b3Vycy4uCitTUEFSU0VfRkxBR1MgPSAtRF9fQklHX0VORElBTl9fIC1EX19wb3dlcnBjX18KKworCisKKyMjIyAtLS0gRU5EIENPTkZJR1VSQVRJT04gU0VDVElPTiAtLS0KKworIyBUaG9zZSBtdXN0IG5vdCBiZSBHTlUtc3BlY2lmaWM7IHRoZXkgYXJlIHNoYXJlZCB3aXRoIHBlcmwvIHdoaWNoIG1heQorIyBiZSBidWlsdCBieSBhIGRpZmZlcmVudCBjb21waWxlci4gKE5vdGUgdGhhdCB0aGlzIGlzIGFuIGFydGlmYWN0IG5vdworIyBidXQgaXQgc3RpbGwgbWlnaHQgYmUgbmljZSB0byBrZWVwIHRoYXQgZGlzdGluY3Rpb24uKQorQkFTSUNfQ0ZMQUdTID0KK0JBU0lDX0xERkxBR1MgPQorCitTQ1JJUFRfU0ggPSBcCisJZ2l0LWJpc2VjdC5zaCBnaXQtY2hlY2tvdXQuc2ggXAorCWdpdC1jbGVhbi5zaCBnaXQtY2xvbmUuc2ggZ2l0LWNvbW1pdC5zaCBcCisJZ2l0LWZldGNoLnNoIFwKKwlnaXQtbHMtcmVtb3RlLnNoIFwKKwlnaXQtbWVyZ2Utb25lLWZpbGUuc2ggZ2l0LW1lcmdldG9vbC5zaCBnaXQtcGFyc2UtcmVtb3RlLnNoIFwKKwlnaXQtcHVsbC5zaCBnaXQtcmViYXNlLnNoIFwKKwlnaXQtcmVwYWNrLnNoIGdpdC1yZXF1ZXN0LXB1bGwuc2ggZ2l0LXJlc2V0LnNoIFwKKwlnaXQtc2gtc2V0dXAuc2ggXAorCWdpdC10YWcuc2ggZ2l0LXZlcmlmeS10YWcuc2ggXAorCWdpdC1hcHBseW1ib3guc2ggZ2l0LWFwcGx5cGF0Y2guc2ggZ2l0LWFtLnNoIFwKKwlnaXQtbWVyZ2Uuc2ggZ2l0LW1lcmdlLXN0dXBpZC5zaCBnaXQtbWVyZ2Utb2N0b3B1cy5zaCBcCisJZ2l0LW1lcmdlLXJlc29sdmUuc2ggZ2l0LW1lcmdlLW91cnMuc2ggXAorCWdpdC1sb3N0LWZvdW5kLnNoIGdpdC1xdWlsdGltcG9ydC5zaAorCitTQ1JJUFRfUEVSTCA9IFwKKwlnaXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsIFwKKwlnaXQtYXJjaGltcG9ydC5wZXJsIGdpdC1jdnNpbXBvcnQucGVybCBnaXQtcmVsaW5rLnBlcmwgXAorCWdpdC1jdnNzZXJ2ZXIucGVybCBnaXQtcmVtb3RlLnBlcmwgXAorCWdpdC1zdm5pbXBvcnQucGVybCBnaXQtY3ZzZXhwb3J0Y29tbWl0LnBlcmwgXAorCWdpdC1zZW5kLWVtYWlsLnBlcmwgZ2l0LXN2bi5wZXJsCisKK1NDUklQVF9QWVRIT04gPSBcCisJZ2l0LXA0aW1wb3J0LnB5CisKK2lmZGVmIFdJVEhfUDRJTVBPUlQKK1NDUklQVFMgPSAkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIFwKKwkgICQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpIFwKKwkgICQocGF0c3Vic3QgJS5weSwlLCQoU0NSSVBUX1BZVEhPTikpIFwKKwkgIGdpdC1zdGF0dXMgZ2l0LWluc3Rhd2ViCitlbHNlCitTQ1JJUFRTID0gJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSBcCisJICAkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJICBnaXQtc3RhdHVzIGdpdC1pbnN0YXdlYgorZW5kaWYKKworCisjIC4uLiBhbmQgYWxsIHRoZSByZXN0IHRoYXQgY291bGQgYmUgbW92ZWQgb3V0IG9mIGJpbmRpciB0byBnaXRleGVjZGlyCitQUk9HUkFNUyA9IFwKKwlnaXQtY29udmVydC1vYmplY3RzJFggZ2l0LWZldGNoLXBhY2skWCBcCisJZ2l0LWhhc2gtb2JqZWN0JFggZ2l0LWluZGV4LXBhY2skWCBnaXQtbG9jYWwtZmV0Y2gkWCBcCisJZ2l0LWZhc3QtaW1wb3J0JFggXAorCWdpdC1tZXJnZS1iYXNlJFggXAorCWdpdC1kYWVtb24kWCBcCisJZ2l0LW1lcmdlLWluZGV4JFggZ2l0LW1rdGFnJFggZ2l0LW1rdHJlZSRYIGdpdC1wYXRjaC1pZCRYIFwKKwlnaXQtcGVlay1yZW1vdGUkWCBnaXQtcmVjZWl2ZS1wYWNrJFggXAorCWdpdC1zZW5kLXBhY2skWCBnaXQtc2hlbGwkWCBcCisJZ2l0LXNob3ctaW5kZXgkWCBnaXQtc3NoLWZldGNoJFggXAorCWdpdC1zc2gtdXBsb2FkJFggZ2l0LXVucGFjay1maWxlJFggXAorCWdpdC11cGRhdGUtc2VydmVyLWluZm8kWCBcCisJZ2l0LXVwbG9hZC1wYWNrJFggXAorCWdpdC1wYWNrLXJlZHVuZGFudCRYIGdpdC12YXIkWCBcCisJZ2l0LW1lcmdlLXRyZWUkWCBnaXQtaW1hcC1zZW5kJFggXAorCWdpdC1tZXJnZS1yZWN1cnNpdmUkWCBcCisJJChFWFRSQV9QUk9HUkFNUykKKworIyBFbXB0eS4uLgorRVhUUkFfUFJPR1JBTVMgPQorCitCVUlMVF9JTlMgPSBcCisJZ2l0LWZvcm1hdC1wYXRjaCRYIGdpdC1zaG93JFggZ2l0LXdoYXRjaGFuZ2VkJFggZ2l0LWNoZXJyeSRYIFwKKwlnaXQtZ2V0LXRhci1jb21taXQtaWQkWCBnaXQtaW5pdCRYIGdpdC1yZXBvLWNvbmZpZyRYIFwKKwlnaXQtZnNjay1vYmplY3RzJFggZ2l0LWNoZXJyeS1waWNrJFggXAorCSQocGF0c3Vic3QgYnVpbHRpbi0lLm8sZ2l0LSUkWCwkKEJVSUxUSU5fT0JKUykpCisKKyMgd2hhdCAnYWxsJyB3aWxsIGJ1aWxkIGFuZCAnaW5zdGFsbCcgd2lsbCBpbnN0YWxsLCBpbiBnaXRleGVjZGlyCitBTExfUFJPR1JBTVMgPSAkKFBST0dSQU1TKSAkKFNDUklQVFMpCisKK0FMTF9QUk9HUkFNUyArPSBnaXQtbWVyZ2Utc3VidHJlZSRYCisKKyMgd2hhdCAnYWxsJyB3aWxsIGJ1aWxkIGJ1dCBub3QgaW5zdGFsbCBpbiBnaXRleGVjZGlyCitPVEhFUl9QUk9HUkFNUyA9IGdpdCRYIGdpdHdlYi9naXR3ZWIuY2dpCitpZm5kZWYgTk9fVENMVEsKK09USEVSX1BST0dSQU1TICs9IGdpdGstd2lzaAorZW5kaWYKKworIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0tIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgMS4wCitQUk9HUkFNUyArPSBnaXQtc3NoLXB1bGwkWCBnaXQtc3NoLXB1c2gkWAorCisjIFNldCBwYXRocyB0byB0b29scyBlYXJseSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIHZlcnNpb24gdGVzdHMuCiBpZm5kZWYgU0hFTExfUEFUSAogCVNIRUxMX1BBVEggPSAvYmluL3NoCiBlbmRpZgotCi1pZm5kZWYgZ2l0ZXhlY2RpcgotCWdpdGV4ZWNkaXIgOj0gJChzaGVsbCBnaXQgLS1leGVjLXBhdGgpCitpZm5kZWYgUEVSTF9QQVRICisJUEVSTF9QQVRIID0gL3Vzci9iaW4vcGVybAorZW5kaWYKK2lmbmRlZiBQWVRIT05fUEFUSAorCVBZVEhPTl9QQVRIID0gL3Vzci9sb2NhbC9iaW4vcHl0aG9uCiBlbmRpZgogCi1pZm5kZWYgc2hhcmVkaXIKLQlzaGFyZWRpciA6PSAkKGRpciAkKGdpdGV4ZWNkaXIpKXNoYXJlCitleHBvcnQgUEVSTF9QQVRICisKK0xJQl9GSUxFPWxpYmdpdC5hCitYRElGRl9MSUI9eGRpZmYvbGliLmEKKworTElCX0ggPSBcCisJYXJjaGl2ZS5oIGJsb2IuaCBjYWNoZS5oIGNvbW1pdC5oIGNzdW0tZmlsZS5oIGRlbHRhLmggZ3JlcC5oIFwKKwlkaWZmLmggb2JqZWN0LmggcGFjay5oIHBrdC1saW5lLmggcXVvdGUuaCByZWZzLmggbGlzdC1vYmplY3RzLmggc2lkZWJhbmQuaCBcCisJcnVuLWNvbW1hbmQuaCBzdHJidWYuaCB0YWcuaCB0cmVlLmggZ2l0LWNvbXBhdC11dGlsLmggcmV2aXNpb24uaCBcCisJdHJlZS13YWxrLmggbG9nLXRyZWUuaCBkaXIuaCBwYXRoLWxpc3QuaCB1bnBhY2stdHJlZXMuaCBidWlsdGluLmggXAorCXV0ZjguaCByZWZsb2ctd2Fsay5oIHBhdGNoLWlkcy5oIGF0dHIuaCBkZWNvcmF0ZS5oIHByb2dyZXNzLmggbWFpbG1hcC5oCisKK0RJRkZfT0JKUyA9IFwKKwlkaWZmLm8gZGlmZi1saWIubyBkaWZmY29yZS1icmVhay5vIGRpZmZjb3JlLW9yZGVyLm8gXAorCWRpZmZjb3JlLXBpY2theGUubyBkaWZmY29yZS1yZW5hbWUubyB0cmVlLWRpZmYubyBjb21iaW5lLWRpZmYubyBcCisJZGlmZmNvcmUtZGVsdGEubyBsb2ctdHJlZS5vCisKK0xJQl9PQkpTID0gXAorCWJsb2IubyBjb21taXQubyBjb25uZWN0Lm8gY3N1bS1maWxlLm8gY2FjaGUtdHJlZS5vIGJhc2U4NS5vIFwKKwlkYXRlLm8gZGlmZi1kZWx0YS5vIGVudHJ5Lm8gZXhlY19jbWQubyBpZGVudC5vIFwKKwlpbnRlcnBvbGF0ZS5vIFwKKwlsb2NrZmlsZS5vIFwKKwlwYXRjaC1pZHMubyBcCisJb2JqZWN0Lm8gcGFjay1jaGVjay5vIHBhY2std3JpdGUubyBwYXRjaC1kZWx0YS5vIHBhdGgubyBwa3QtbGluZS5vIFwKKwlzaWRlYmFuZC5vIHJlYWNoYWJsZS5vIHJlZmxvZy13YWxrLm8gXAorCXF1b3RlLm8gcmVhZC1jYWNoZS5vIHJlZnMubyBydW4tY29tbWFuZC5vIGRpci5vIG9iamVjdC1yZWZzLm8gXAorCXNlcnZlci1pbmZvLm8gc2V0dXAubyBzaGExX2ZpbGUubyBzaGExX25hbWUubyBzdHJidWYubyBcCisJdGFnLm8gdHJlZS5vIHVzYWdlLm8gY29uZmlnLm8gZW52aXJvbm1lbnQubyBjdHlwZS5vIGNvcHkubyBcCisJcmV2aXNpb24ubyBwYWdlci5vIHRyZWUtd2Fsay5vIHhkaWZmLWludGVyZmFjZS5vIFwKKwl3cml0ZV9vcl9kaWUubyB0cmFjZS5vIGxpc3Qtb2JqZWN0cy5vIGdyZXAubyBtYXRjaC10cmVlcy5vIFwKKwlhbGxvYy5vIG1lcmdlLWZpbGUubyBwYXRoLWxpc3QubyBoZWxwLm8gdW5wYWNrLXRyZWVzLm8gJChESUZGX09CSlMpIFwKKwljb2xvci5vIHd0LXN0YXR1cy5vIGFyY2hpdmUtemlwLm8gYXJjaGl2ZS10YXIubyBzaGFsbG93Lm8gdXRmOC5vIFwKKwljb252ZXJ0Lm8gYXR0ci5vIGRlY29yYXRlLm8gcHJvZ3Jlc3MubyBtYWlsbWFwLm8gc3ltbGlua3MubworCitCVUlMVElOX09CSlMgPSBcCisJYnVpbHRpbi1hZGQubyBcCisJYnVpbHRpbi1hbm5vdGF0ZS5vIFwKKwlidWlsdGluLWFwcGx5Lm8gXAorCWJ1aWx0aW4tYXJjaGl2ZS5vIFwKKwlidWlsdGluLWJsYW1lLm8gXAorCWJ1aWx0aW4tYnJhbmNoLm8gXAorCWJ1aWx0aW4tYnVuZGxlLm8gXAorCWJ1aWx0aW4tY2F0LWZpbGUubyBcCisJYnVpbHRpbi1jaGVjay1hdHRyLm8gXAorCWJ1aWx0aW4tY2hlY2tvdXQtaW5kZXgubyBcCisJYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0Lm8gXAorCWJ1aWx0aW4tY29tbWl0LXRyZWUubyBcCisJYnVpbHRpbi1jb3VudC1vYmplY3RzLm8gXAorCWJ1aWx0aW4tZGVzY3JpYmUubyBcCisJYnVpbHRpbi1kaWZmLm8gXAorCWJ1aWx0aW4tZGlmZi1maWxlcy5vIFwKKwlidWlsdGluLWRpZmYtaW5kZXgubyBcCisJYnVpbHRpbi1kaWZmLXRyZWUubyBcCisJYnVpbHRpbi1mZXRjaC0tdG9vbC5vIFwKKwlidWlsdGluLWZtdC1tZXJnZS1tc2cubyBcCisJYnVpbHRpbi1mb3ItZWFjaC1yZWYubyBcCisJYnVpbHRpbi1mc2NrLm8gXAorCWJ1aWx0aW4tZ2MubyBcCisJYnVpbHRpbi1ncmVwLm8gXAorCWJ1aWx0aW4taW5pdC1kYi5vIFwKKwlidWlsdGluLWxvZy5vIFwKKwlidWlsdGluLWxzLWZpbGVzLm8gXAorCWJ1aWx0aW4tbHMtdHJlZS5vIFwKKwlidWlsdGluLW1haWxpbmZvLm8gXAorCWJ1aWx0aW4tbWFpbHNwbGl0Lm8gXAorCWJ1aWx0aW4tbWVyZ2UtYmFzZS5vIFwKKwlidWlsdGluLW1lcmdlLWZpbGUubyBcCisJYnVpbHRpbi1tdi5vIFwKKwlidWlsdGluLW5hbWUtcmV2Lm8gXAorCWJ1aWx0aW4tcGFjay1vYmplY3RzLm8gXAorCWJ1aWx0aW4tcHJ1bmUubyBcCisJYnVpbHRpbi1wcnVuZS1wYWNrZWQubyBcCisJYnVpbHRpbi1wdXNoLm8gXAorCWJ1aWx0aW4tcmVhZC10cmVlLm8gXAorCWJ1aWx0aW4tcmVmbG9nLm8gXAorCWJ1aWx0aW4tY29uZmlnLm8gXAorCWJ1aWx0aW4tcmVyZXJlLm8gXAorCWJ1aWx0aW4tcmV2LWxpc3QubyBcCisJYnVpbHRpbi1yZXYtcGFyc2UubyBcCisJYnVpbHRpbi1yZXZlcnQubyBcCisJYnVpbHRpbi1ybS5vIFwKKwlidWlsdGluLXJ1bnN0YXR1cy5vIFwKKwlidWlsdGluLXNob3J0bG9nLm8gXAorCWJ1aWx0aW4tc2hvdy1icmFuY2gubyBcCisJYnVpbHRpbi1zdHJpcHNwYWNlLm8gXAorCWJ1aWx0aW4tc3ltYm9saWMtcmVmLm8gXAorCWJ1aWx0aW4tdGFyLXRyZWUubyBcCisJYnVpbHRpbi11bnBhY2stb2JqZWN0cy5vIFwKKwlidWlsdGluLXVwZGF0ZS1pbmRleC5vIFwKKwlidWlsdGluLXVwZGF0ZS1yZWYubyBcCisJYnVpbHRpbi11cGxvYWQtYXJjaGl2ZS5vIFwKKwlidWlsdGluLXZlcmlmeS1wYWNrLm8gXAorCWJ1aWx0aW4td3JpdGUtdHJlZS5vIFwKKwlidWlsdGluLXNob3ctcmVmLm8gXAorCWJ1aWx0aW4tcGFjay1yZWZzLm8KKworR0lUTElCUyA9ICQoTElCX0ZJTEUpICQoWERJRkZfTElCKQorRVhUTElCUyA9IC1segorCisjCisjIFBsYXRmb3JtIHNwZWNpZmljIHR3ZWFrcworIworCisjIFdlIGNob29zZSB0byBhdm9pZCAiaWYgLi4gZWxzZSBpZiAuLiBlbHNlIC4uIGVuZGlmIGVuZGlmIgorIyBiZWNhdXNlIG1haW50YWluaW5nIHRoZSBuZXN0aW5nIHRvIG1hdGNoIGlzIGEgcGFpbi4gIElmCisjIHdlIGhhZCAiZWxpZiIgdGhpbmdzIHdvdWxkIGhhdmUgYmVlbiBtdWNoIG5pY2VyLi4uCisKK2lmZXEgKCQodW5hbWVfUyksTGludXgpCisJTk9fU1RSTENQWSA9IFllc1BsZWFzZQorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksR05VL2tGcmVlQlNEKQorCU5PX1NUUkxDUFkgPSBZZXNQbGVhc2UKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLERhcndpbikKKwlORUVEU19TU0xfV0lUSF9DUllQVE8gPSBZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCU9MRF9JQ09OViA9IFVuZm9ydHVuYXRlbHlZZXMKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxTdW5PUykKKwlORUVEU19TT0NLRVQgPSBZZXNQbGVhc2UKKwlORUVEU19OU0wgPSBZZXNQbGVhc2UKKwlTSEVMTF9QQVRIID0gL2Jpbi9iYXNoCisJTk9fU1RSQ0FTRVNUUiA9IFllc1BsZWFzZQorCU5PX0hTVFJFUlJPUiA9IFllc1BsZWFzZQorCWlmZXEgKCQodW5hbWVfUiksNS44KQorCQlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fQzk5X0ZPUk1BVCA9IFllc1BsZWFzZQorCQlOT19TVFJUT1VNQVggPSBZZXNQbGVhc2UKKwllbmRpZgorCWlmZXEgKCQodW5hbWVfUiksNS45KQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fQzk5X0ZPUk1BVCA9IFllc1BsZWFzZQorCQlOT19TVFJUT1VNQVggPSBZZXNQbGVhc2UKKwllbmRpZgorCUlOU1RBTEwgPSBnaW5zdGFsbAorCVRBUiA9IGd0YXIKKwlCQVNJQ19DRkxBR1MgKz0gLURfX0VYVEVOU0lPTlNfXworZW5kaWYKK2lmZXEgKCQodW5hbWVfTyksQ3lnd2luKQorCU5PX0RfVFlQRV9JTl9ESVJFTlQgPSBZZXNQbGVhc2UKKwlOT19EX0lOT19JTl9ESVJFTlQgPSBZZXNQbGVhc2UKKwlOT19TVFJDQVNFU1RSID0gWWVzUGxlYXNlCisJTk9fU1lNTElOS19IRUFEID0gWWVzUGxlYXNlCisJTkVFRFNfTElCSUNPTlYgPSBZZXNQbGVhc2UKKwlOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZID0gVW5mb3J0dW5hdGVseVllcworCU5PX1RSVVNUQUJMRV9GSUxFTU9ERSA9IFVuZm9ydHVuYXRlbHlZZXMKKwkjIFRoZXJlIGFyZSBjb25mbGljdGluZyByZXBvcnRzIGFib3V0IHRoaXMuCisJIyBPbiBzb21lIGJveGVzIE5PX01NQVAgaXMgbmVlZGVkLCBhbmQgbm90IHNvIGVsc2V3aGVyZS4KKwkjIFRyeSBjb21tZW50aW5nIHRoaXMgb3V0IGlmIHlvdSBzdXNwZWN0IE1NQVAgaXMgbW9yZSBlZmZpY2llbnQKKwlOT19NTUFQID0gWWVzUGxlYXNlCisJTk9fSVBWNiA9IFllc1BsZWFzZQorCVggPSAuZXhlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxGcmVlQlNEKQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJQkFTSUNfQ0ZMQUdTICs9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCisJQkFTSUNfTERGTEFHUyArPSAtTC91c3IvbG9jYWwvbGliCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxPcGVuQlNEKQorCU5PX1NUUkNBU0VTVFIgPSBZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCUJBU0lDX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUJBU0lDX0xERkxBR1MgKz0gLUwvdXNyL2xvY2FsL2xpYgorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksTmV0QlNEKQorCWlmZXEgKCQoc2hlbGwgZXhwciAiJCh1bmFtZV9SKSIgOiAnWzAxXVwuJyksMikKKwkJTkVFRFNfTElCSUNPTlYgPSBZZXNQbGVhc2UKKwllbmRpZgorCUJBU0lDX0NGTEFHUyArPSAtSS91c3IvcGtnL2luY2x1ZGUKKwlCQVNJQ19MREZMQUdTICs9IC1ML3Vzci9wa2cvbGliCisJQUxMX0xERkxBR1MgKz0gLVdsLC1ycGF0aCwvdXNyL3BrZy9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLEFJWCkKKwlOT19TVFJDQVNFU1RSPVllc1BsZWFzZQorCU5PX1NUUkxDUFkgPSBZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OVj1ZZXNQbGVhc2UKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLElSSVg2NCkKKwlOT19JUFY2PVllc1BsZWFzZQorCU5PX1NFVEVOVj1ZZXNQbGVhc2UKKwlOT19TVFJDQVNFU1RSPVllc1BsZWFzZQorCU5PX1NUUkxDUFkgPSBZZXNQbGVhc2UKKwlOT19TT0NLQUREUl9TVE9SQUdFPVllc1BsZWFzZQorCVNIRUxMX1BBVEg9L3Vzci9nbnUvYmluL2Jhc2gKKwlCQVNJQ19DRkxBR1MgKz0gLURQQVRIX01BWD0xMDI0CisJIyBmb3Igbm93LCBidWlsZCAzMi1iaXQgdmVyc2lvbgorCUJBU0lDX0xERkxBR1MgKz0gLUwvdXNyL2xpYjMyCitlbmRpZgoraWZuZXEgKCwkKGZpbmRzdHJpbmcgYXJtLCQodW5hbWVfTSkpKQorCUFSTV9TSEExID0gWWVzUGxlYXNlCiBlbmRpZgogCi1pZm5kZWYgSU5TVEFMTAotCUlOU1RBTEwgPSBpbnN0YWxsCistaW5jbHVkZSBjb25maWcubWFrLmF1dG9nZW4KKy1pbmNsdWRlIGNvbmZpZy5tYWsKKworaWZlcSAoJCh1bmFtZV9TKSxEYXJ3aW4pCisJaWZuZGVmIE5PX0ZJTksKKwkJaWZlcSAoJChzaGVsbCB0ZXN0IC1kIC9zdy9saWIgJiYgZWNobyB5KSx5KQorCQkJQkFTSUNfQ0ZMQUdTICs9IC1JL3N3L2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvc3cvbGliCisJCWVuZGlmCisJZW5kaWYKKwlpZm5kZWYgTk9fREFSV0lOX1BPUlRTCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvb3B0L2xvY2FsL2xpYiAmJiBlY2hvIHkpLHkpCisJCQlCQVNJQ19DRkxBR1MgKz0gLUkvb3B0L2xvY2FsL2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvb3B0L2xvY2FsL2xpYgorCQllbmRpZgorCWVuZGlmCiBlbmRpZgogCitpZmRlZiBOT19SX1RPX0dDQ19MSU5LRVIKKwkjIFNvbWUgZ2NjIGRvZXMgbm90IGFjY2VwdCBhbmQgcGFzcyAtUiB0byB0aGUgbGlua2VyIHRvIHNwZWNpZnkKKwkjIHRoZSBydW50aW1lIGR5bmFtaWMgbGlicmFyeSBwYXRoLgorCUNDX0xEX0RZTlBBVEggPSAtV2wsLXJwYXRoPQorZWxzZQorCUNDX0xEX0RZTlBBVEggPSAtUgorZW5kaWYKKworaWZuZGVmIE5PX0NVUkwKKwlpZmRlZiBDVVJMRElSCisJCSMgVHJ5ICItV2wsLXJwYXRoPSQoQ1VSTERJUikvbGliIiBpbiBzdWNoIGEgY2FzZS4KKwkJQkFTSUNfQ0ZMQUdTICs9IC1JJChDVVJMRElSKS9pbmNsdWRlCisJCUNVUkxfTElCQ1VSTCA9IC1MJChDVVJMRElSKS9saWIgJChDQ19MRF9EWU5QQVRIKSQoQ1VSTERJUikvbGliIC1sY3VybAorCWVsc2UKKwkJQ1VSTF9MSUJDVVJMID0gLWxjdXJsCisJZW5kaWYKKwlQUk9HUkFNUyArPSBnaXQtaHR0cC1mZXRjaCRYCisJY3VybF9jaGVjayA6PSAkKHNoZWxsIChlY2hvIDA3MDkwODsgY3VybC1jb25maWcgLS12ZXJudW0pIHwgc29ydCAtciB8IHNlZCAtbmUgMnApCisJaWZlcSAiJChjdXJsX2NoZWNrKSIgIjA3MDkwOCIKKwkJaWZuZGVmIE5PX0VYUEFUCisJCQlQUk9HUkFNUyArPSBnaXQtaHR0cC1wdXNoJFgKKwkJZW5kaWYKKwllbmRpZgorCWlmbmRlZiBOT19FWFBBVAorCQlFWFBBVF9MSUJFWFBBVCA9IC1sZXhwYXQKKwllbmRpZgorZW5kaWYKKworaWZuZGVmIE5PX09QRU5TU0wKKwlPUEVOU1NMX0xJQlNTTCA9IC1sc3NsCisJaWZkZWYgT1BFTlNTTERJUgorCQlCQVNJQ19DRkxBR1MgKz0gLUkkKE9QRU5TU0xESVIpL2luY2x1ZGUKKwkJT1BFTlNTTF9MSU5LID0gLUwkKE9QRU5TU0xESVIpL2xpYiAkKENDX0xEX0RZTlBBVEgpJChPUEVOU1NMRElSKS9saWIKKwllbHNlCisJCU9QRU5TU0xfTElOSyA9CisJZW5kaWYKK2Vsc2UKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19PUEVOU1NMCisJTU9aSUxMQV9TSEExID0gMQorCU9QRU5TU0xfTElCU1NMID0KK2VuZGlmCitpZmRlZiBORUVEU19TU0xfV0lUSF9DUllQVE8KKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8gLWxzc2wKK2Vsc2UKKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8KK2VuZGlmCitpZmRlZiBORUVEU19MSUJJQ09OVgorCWlmZGVmIElDT05WRElSCisJCUJBU0lDX0NGTEFHUyArPSAtSSQoSUNPTlZESVIpL2luY2x1ZGUKKwkJSUNPTlZfTElOSyA9IC1MJChJQ09OVkRJUikvbGliICQoQ0NfTERfRFlOUEFUSCkkKElDT05WRElSKS9saWIKKwllbHNlCisJCUlDT05WX0xJTksgPQorCWVuZGlmCisJRVhUTElCUyArPSAkKElDT05WX0xJTkspIC1saWNvbnYKK2VuZGlmCitpZmRlZiBORUVEU19TT0NLRVQKKwlFWFRMSUJTICs9IC1sc29ja2V0CitlbmRpZgoraWZkZWYgTkVFRFNfTlNMCisJRVhUTElCUyArPSAtbG5zbAorZW5kaWYKK2lmZGVmIE5PX0RfVFlQRV9JTl9ESVJFTlQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19EX1RZUEVfSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fRF9JTk9fSU5fRElSRU5UCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRF9JTk9fSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fQzk5X0ZPUk1BVAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0M5OV9GT1JNQVQKK2VuZGlmCitpZmRlZiBOT19TWU1MSU5LX0hFQUQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19TWU1MSU5LX0hFQUQKK2VuZGlmCitpZmRlZiBOT19TVFJDQVNFU1RSCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1NUUkNBU0VTVFIKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RyY2FzZXN0ci5vCitlbmRpZgoraWZkZWYgTk9fU1RSTENQWQorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJMQ1BZCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3N0cmxjcHkubworZW5kaWYKK2lmZGVmIE5PX1NUUlRPVU1BWAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VNQVgKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RydG91bWF4Lm8KK2VuZGlmCitpZmRlZiBOT19TVFJUT1VMTAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VMTAorZW5kaWYKK2lmZGVmIE5PX1NFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc2V0ZW52Lm8KK2VuZGlmCitpZmRlZiBOT19VTlNFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19VTlNFVEVOVgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC91bnNldGVudi5vCitlbmRpZgoraWZkZWYgTk9fTU1BUAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19NTUFQCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L21tYXAubworZW5kaWYKK2lmZGVmIE5PX1BSRUFECisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1BSRUFECisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3ByZWFkLm8KK2VuZGlmCitpZmRlZiBOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRkFTVF9XT1JLSU5HX0RJUkVDVE9SWQorZW5kaWYKK2lmZGVmIE5PX1RSVVNUQUJMRV9GSUxFTU9ERQorCUJBU0lDX0NGTEFHUyArPSAtRE5PX1RSVVNUQUJMRV9GSUxFTU9ERQorZW5kaWYKK2lmZGVmIE5PX0lQVjYKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19JUFY2CitlbmRpZgoraWZkZWYgTk9fU09DS0FERFJfU1RPUkFHRQoraWZkZWYgTk9fSVBWNgorCUJBU0lDX0NGTEFHUyArPSAtRHNvY2thZGRyX3N0b3JhZ2U9c29ja2FkZHJfaW4KK2Vsc2UKKwlCQVNJQ19DRkxBR1MgKz0gLURzb2NrYWRkcl9zdG9yYWdlPXNvY2thZGRyX2luNgorZW5kaWYKK2VuZGlmCitpZmRlZiBOT19JTkVUX05UT1AKKwlMSUJfT0JKUyArPSBjb21wYXQvaW5ldF9udG9wLm8KK2VuZGlmCitpZmRlZiBOT19JTkVUX1BUT04KKwlMSUJfT0JKUyArPSBjb21wYXQvaW5ldF9wdG9uLm8KK2VuZGlmCisKK2lmZGVmIE5PX0lDT05WCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fSUNPTlYKK2VuZGlmCisKK2lmZGVmIE9MRF9JQ09OVgorCUJBU0lDX0NGTEFHUyArPSAtRE9MRF9JQ09OVgorZW5kaWYKKworaWZkZWYgUFBDX1NIQTEKKwlTSEExX0hFQURFUiA9ICJwcGMvc2hhMS5oIgorCUxJQl9PQkpTICs9IHBwYy9zaGExLm8gcHBjL3NoYTFwcGMubworZWxzZQoraWZkZWYgQVJNX1NIQTEKKwlTSEExX0hFQURFUiA9ICJhcm0vc2hhMS5oIgorCUxJQl9PQkpTICs9IGFybS9zaGExLm8gYXJtL3NoYTFfYXJtLm8KK2Vsc2UKK2lmZGVmIE1PWklMTEFfU0hBMQorCVNIQTFfSEVBREVSID0gIm1vemlsbGEtc2hhMS9zaGExLmgiCisJTElCX09CSlMgKz0gbW96aWxsYS1zaGExL3NoYTEubworZWxzZQorCVNIQTFfSEVBREVSID0gPG9wZW5zc2wvc2hhLmg+CisJRVhUTElCUyArPSAkKExJQl80X0NSWVBUTykKK2VuZGlmCitlbmRpZgorZW5kaWYKK2lmZGVmIE5PX1BFUkxfTUFLRU1BS0VSCisJZXhwb3J0IE5PX1BFUkxfTUFLRU1BS0VSCitlbmRpZgoraWZkZWYgTk9fSFNUUkVSUk9SCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX0hTVFJFUlJPUgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9oc3RyZXJyb3IubworZW5kaWYKKworaWZlcSAoJChUQ0xUS19QQVRIKSwpCitOT19UQ0xUSz1Ob1RoYW5rcworZW5kaWYKKworUVVJRVRfU1VCRElSMCAgPSArJChNQUtFKSAtQyAjIHNwYWNlIHRvIHNlcGFyYXRlIC1DIGFuZCBzdWJkaXIKK1FVSUVUX1NVQkRJUjEgID0KKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUyksdyksdykKK1BSSU5UX0RJUiA9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CitlbHNlICMgIm1ha2UgLXciCitOT19TVUJESVIgPSA6CitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nICQoTUFLRUZMQUdTKSxzKSxzKQogaWZuZGVmIFYKLQlRVUlFVF9HRU4gICAgICA9IEBlY2hvICcgICAnIEdFTiAkQDsKKwlRVUlFVF9DQyAgICAgICA9IEBlY2hvICcgICAnIENDICRAOworCVFVSUVUX0FSICAgICAgID0gQGVjaG8gJyAgICcgQVIgJEA7CisJUVVJRVRfTElOSyAgICAgPSBAZWNobyAnICAgJyBMSU5LICRAOwogCVFVSUVUX0JVSUxUX0lOID0gQGVjaG8gJyAgICcgQlVJTFRJTiAkQDsKLQlRVUlFVF9JTkRFWCAgICA9IEBlY2hvICcgICAnIElOREVYICQoZGlyICRAKTsKLQlRVUlFVF8yREVWTlVMTCA9IDI+L2Rldi9udWxsCisJUVVJRVRfR0VOICAgICAgPSBAZWNobyAnICAgJyBHRU4gJEA7CisJUVVJRVRfU1VCRElSMCAgPSArQHN1YmRpcj0KKwlRVUlFVF9TVUJESVIxICA9IDskKE5PX1NVQkRJUikgZWNobyAnICAgJyBTVUJESVIgJCRzdWJkaXI7IFwKKwkJCSAkKE1BS0UpICQoUFJJTlRfRElSKSAtQyAkJHN1YmRpcgorCWV4cG9ydCBWCisJZXhwb3J0IFFVSUVUX0dFTgorCWV4cG9ydCBRVUlFVF9CVUlMVF9JTgorZW5kaWYKIGVuZGlmCiAKLVRDTF9QQVRIICAgPz0gdGNsc2gKLVRDTFRLX1BBVEggPz0gd2lzaAotCi1pZmVxICgkKGZpbmRzdHJpbmcgJChNQUtFRkxBR1MpLHMpLHMpCi1RVUlFVF9HRU4gPQotUVVJRVRfQlVJTFRfSU4gPQoraWZkZWYgQVNDSUlET0M4CisJZXhwb3J0IEFTQ0lJRE9DOAogZW5kaWYKIAorIyBTaGVsbCBxdW90ZSAoZG8gbm90IHVzZSAkKGNhbGwpIHRvIGFjY29tbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKKworU0hBMV9IRUFERVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIQTFfSEVBREVSKSkKK0VUQ19HSVRDT05GSUdfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKEVUQ19HSVRDT05GSUcpKQorCiBERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKK2JpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKIGdpdGV4ZWNkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGdpdGV4ZWNkaXIpKQordGVtcGxhdGVfZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJCh0ZW1wbGF0ZV9kaXIpKQorcHJlZml4X1NRID0gJChzdWJzdCAnLCdcJycsJChwcmVmaXgpKQorCiBTSEVMTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEVMTF9QQVRIKSkKLVRDTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChUQ0xfUEFUSCkpCitQRVJMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFBFUkxfUEFUSCkpCitQWVRIT05fUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoUFlUSE9OX1BBVEgpKQogVENMVEtfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoVENMVEtfUEFUSCkpCiAKLWxpYmRpciAgID89ICQoc2hhcmVkaXIpL2dpdC1ndWkvbGliCi1saWJkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGxpYmRpcikpCitMSUJTID0gJChHSVRMSUJTKSAkKEVYVExJQlMpCiAKLWV4ZWRpciAgICA9ICQoZGlyICQoZ2l0ZXhlY2Rpcikpc2hhcmUvZ2l0LWd1aS9saWIKLWV4ZWRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoZXhlZGlyKSkKK0JBU0lDX0NGTEFHUyArPSAtRFNIQTFfSEVBREVSPSckKFNIQTFfSEVBREVSX1NRKScgXAorCS1ERVRDX0dJVENPTkZJRz0nIiQoRVRDX0dJVENPTkZJR19TUSkiJyAkKENPTVBBVF9DRkxBR1MpCitMSUJfT0JKUyArPSAkKENPTVBBVF9PQkpTKQorCitBTExfQ0ZMQUdTICs9ICQoQkFTSUNfQ0ZMQUdTKQorQUxMX0xERkxBR1MgKz0gJChCQVNJQ19MREZMQUdTKQorCitleHBvcnQgVEFSIElOU1RBTEwgREVTVERJUiBTSEVMTF9QQVRICisKKworIyMjIEJ1aWxkIHJ1bGVzCisKK2FsbDo6ICQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgJChPVEhFUl9QUk9HUkFNUykKK2lmbmVxICgsJFgpCisJJChmb3JlYWNoIHAsJChwYXRzdWJzdCAlJFgsJSwkKGZpbHRlciAlJFgsJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCkpLCBybSAtZiAnJHAnOykKK2VuZGlmCisKK2FsbDo6CitpZm5kZWYgTk9fVENMVEsKKwkkKFFVSUVUX1NVQkRJUjApZ2l0LWd1aSAkKFFVSUVUX1NVQkRJUjEpIGFsbAorZW5kaWYKKwkkKFFVSUVUX1NVQkRJUjApcGVybCAkKFFVSUVUX1NVQkRJUjEpIFBFUkxfUEFUSD0nJChQRVJMX1BBVEhfU1EpJyBwcmVmaXg9JyQocHJlZml4X1NRKScgYWxsCisJJChRVUlFVF9TVUJESVIwKXRlbXBsYXRlcyAkKFFVSUVUX1NVQkRJUjEpCisKK3N0cmlwOiAkKFBST0dSQU1TKSBnaXQkWAorCSQoU1RSSVApICQoU1RSSVBfT1BUUykgJChQUk9HUkFNUykgZ2l0JFgKKworZ2l0ay13aXNoOiBnaXRrIEdJVC1HVUktVkFSUworCSQoUVVJRVRfR0VOKXJtIC1mICRAICRAKyAmJiBcCisJc2VkIC1lICcxLDNzfF5leGVjIC4qICIkJDAifGV4ZWMgJChzdWJzdCB8LCdcfCcsJChUQ0xUS19QQVRIX1NRKSkgIiQkMCJ8JyA8Z2l0ayA+JEArICYmIFwKKwljaG1vZCAreCAkQCsgJiYgXAorCW12IC1mICRAKyAkQAorCitnaXQkWDogZ2l0LmMgY29tbW9uLWNtZHMuaCAkKEJVSUxUSU5fT0JKUykgJChHSVRMSUJTKSBHSVQtQ0ZMQUdTCisJJChRVUlFVF9MSU5LKSQoQ0MpIC1ER0lUX1ZFUlNJT049JyIkKEdJVF9WRVJTSU9OKSInIFwKKwkJJChBTExfQ0ZMQUdTKSAtbyAkQCAkKGZpbHRlciAlLmMsJF4pIFwKKwkJJChCVUlMVElOX09CSlMpICQoQUxMX0xERkxBR1MpICQoTElCUykKKworaGVscC5vOiBjb21tb24tY21kcy5oCisKK2dpdC1tZXJnZS1zdWJ0cmVlJFg6IGdpdC1tZXJnZS1yZWN1cnNpdmUkWAorCSQoUVVJRVRfQlVJTFRfSU4pcm0gLWYgJEAgJiYgbG4gZ2l0LW1lcmdlLXJlY3Vyc2l2ZSRYICRACisKKyQoQlVJTFRfSU5TKTogZ2l0JFgKKwkkKFFVSUVUX0JVSUxUX0lOKXJtIC1mICRAICYmIGxuIGdpdCRYICRACisKK2NvbW1vbi1jbWRzLmg6ICQod2lsZGNhcmQgRG9jdW1lbnRhdGlvbi9naXQtKi50eHQpCisJJChRVUlFVF9HRU4pLi9nZW5lcmF0ZS1jbWRsaXN0LnNoID4gJEArICYmIG12ICRAKyAkQAogCiAkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIDogJSA6ICUuc2gKIAkkKFFVSUVUX0dFTilybSAtZiAkQCAkQCsgJiYgXAotCUdJVEdVSV9SRUxBVElWRT0gJiYgXAotCWlmIHRlc3QgJyQoZXhlZGlyX1NRKScgPSAnJChsaWJkaXJfU1EpJzsgdGhlbiBcCi0JCWlmIHRlc3QgIiQodW5hbWVfTykiID0gQ3lnd2luOyBcCi0JCXRoZW4gR0lUR1VJX1JFTEFUSVZFPSA7IFwKLQkJZWxzZSBHSVRHVUlfUkVMQVRJVkU9MTsgXAotCQlmaTsgXAotCWZpICYmIFwKIAlzZWQgLWUgJzFzfCMhLiovc2h8IyEkKFNIRUxMX1BBVEhfU1EpfCcgXAotCQktZSAnc3xeIGV4ZWMgd2lzaCAiJCQwInwgZXhlYyAkKHN1YnN0IHwsJ1x8JywkKFRDTFRLX1BBVEhfU1EpKSAiJCQwInwnIFwKLQkJLWUgJ3MvQEBHSVRHVUlfVkVSU0lPTkBALyQoR0lUR1VJX1ZFUlNJT04pL2cnIFwKLQkJLWUgJ3N8QEBHSVRHVUlfUkVMQVRJVkVAQHwnJCRHSVRHVUlfUkVMQVRJVkUnfCcgXAotCQktZSAkJEdJVEdVSV9SRUxBVElWRSdzfEBAR0lUR1VJX0xJQkRJUkBAfCQobGliZGlyX1NRKXwnIFwKLQkJJEAuc2ggPiRAKyAmJiBcCisJICAgIC1lICdzfEBAUEVSTEBAfCQoUEVSTF9QQVRIX1NRKXxnJyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgIC1lICdzL0BATk9fQ1VSTEBALyQoTk9fQ1VSTCkvZycgXAorCSAgICAkQC5zaCA+JEArICYmIFwKIAljaG1vZCAreCAkQCsgJiYgXAogCW12ICRAKyAkQAogCi0kKEdJVEdVSV9CVUlMVF9JTlMpOiBnaXQtZ3VpCi0JJChRVUlFVF9CVUlMVF9JTilybSAtZiAkQCAmJiBsbiBnaXQtZ3VpICRACiskKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKTogcGVybC9wZXJsLm1hawogCi1saWIvdGNsSW5kZXg6ICQoQUxMX0xJQkZJTEVTKQotCSQoUVVJRVRfSU5ERVgpaWYgZWNobyBcCi0JICAkKGZvcmVhY2ggcCwkKFBSRUxPQURfRklMRVMpLHNvdXJjZSAkcFw7KSBcCi0JICBhdXRvX21raW5kZXggbGliICcqLnRjbCcgXAotCXwgJChUQ0xfUEFUSCkgJChRVUlFVF8yREVWTlVMTCk7IHRoZW4gOiBvazsgXAotCWVsc2UgXAotCSBlY2hvIDE+JjIgIiAgICAqICQoVENMX1BBVEgpIGZhaWxlZDsgdXNpbmcgdW5vcHRpbWl6ZWQgbG9hZGluZyI7IFwKLQkgcm0gLWYgJEAgOyBcCi0JIGVjaG8gJyMgQXV0b2dlbmVyYXRlZCBieSBnaXQtZ3VpIE1ha2VmaWxlJyA+JEAgJiYgXAotCSBlY2hvID4+JEAgJiYgXAotCSAkKGZvcmVhY2ggcCwkKFBSRUxPQURfRklMRVMpICQoQUxMX0xJQkZJTEVTKSxlY2hvICckKHN1YnN0IGxpYi8sLCRwKScgPj4kQCAmJikgXAotCSBlY2hvID4+JEAgOyBcCi0JZmkKKyQocGF0c3Vic3QgJS5weSwlLCQoU0NSSVBUX1BZVEhPTikpIDogJSA6ICUucHkKKwlybSAtZiAkQCAkQCsKKwlzZWQgLWUgJzFzfCMhLiovcHl0aG9ufCMhJChQWVRIT05fUEFUSF9TUSl8JyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgIC1lICdzL0BATk9fQ1VSTEBALyQoTk9fQ1VSTCkvZycgXAorCSAgICAkQC5weSA+JEArCisJY2htb2QgK3ggJEArCisJbXYgJEArICRACiAKLSMgVGhlc2UgY2FuIHJlY29yZCBHSVRHVUlfVkVSU0lPTgotJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKTogR0lULVZFUlNJT04tRklMRSBHSVQtR1VJLVZBUlMKLWxpYi90Y2xJbmRleDogR0lULUdVSS1WQVJTCitwZXJsL3BlcmwubWFrOiBHSVQtQ0ZMQUdTCisJJChRVUlFVF9TVUJESVIwKXBlcmwgJChRVUlFVF9TVUJESVIxKSBQRVJMX1BBVEg9JyQoUEVSTF9QQVRIX1NRKScgcHJlZml4PSckKHByZWZpeF9TUSknICQoQEYpCiAKLVRSQUNLX1ZBUlMgPSBcCi0JJChzdWJzdCAnLCdcJycsU0hFTExfUEFUSD0nJChTSEVMTF9QQVRIX1NRKScpIFwKLQkkKHN1YnN0ICcsJ1wnJyxUQ0xfUEFUSD0nJChUQ0xfUEFUSF9TUSknKSBcCi0JJChzdWJzdCAnLCdcJycsVENMVEtfUEFUSD0nJChUQ0xUS19QQVRIX1NRKScpIFwKLQkkKHN1YnN0ICcsJ1wnJyxnaXRleGVjZGlyPSckKGdpdGV4ZWNkaXJfU1EpJykgXAotCSQoc3Vic3QgJywnXCcnLGxpYmRpcj0nJChsaWJkaXJfU1EpJykgXAotI2VuZCBUUkFDS19WQVJTCiskKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKTogJSA6ICUucGVybAorCSQoUVVJRVRfR0VOKXJtIC1mICRAICRAKyAmJiBcCisJSU5TVExJQkRJUj1gJChNQUtFKSAtQyBwZXJsIC1zIC0tbm8tcHJpbnQtZGlyZWN0b3J5IGluc3RsaWJkaXJgICYmIFwKKwlzZWQgLWUgJzF7JyBcCisJICAgIC1lICcJc3wjIS4qcGVybHwjISQoUEVSTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJwloJyBcCisJICAgIC1lICcJcz0uKj11c2UgbGliIChzcGxpdCgvOi8sICQkRU5We0dJVFBFUkxMSUJ9IHx8ICJAQElOU1RMSUJESVJAQCIpKTs9JyBcCisJICAgIC1lICcJSCcgXAorCSAgICAtZSAnCXgnIFwKKwkgICAgLWUgJ30nIFwKKwkgICAgLWUgJ3N8QEBJTlNUTElCRElSQEB8JyIkJElOU1RMSUJESVIiJ3xnJyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgICRALnBlcmwgPiRAKyAmJiBcCisJY2htb2QgK3ggJEArICYmIFwKKwltdiAkQCsgJEAKKworZ2l0LXN0YXR1czogZ2l0LWNvbW1pdAorCSQoUVVJRVRfR0VOKWNwICQ8ICRAKyAmJiBtdiAkQCsgJEAKKworZ2l0d2ViL2dpdHdlYi5jZ2k6IGdpdHdlYi9naXR3ZWIucGVybAorCSQoUVVJRVRfR0VOKXJtIC1mICRAICRAKyAmJiBcCisJc2VkIC1lICcxc3wjIS4qcGVybHwjISQoUEVSTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3N8KytHSVRfVkVSU0lPTisrfCQoR0lUX1ZFUlNJT04pfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRfQklORElSKyt8JChiaW5kaXIpfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfQ09ORklHKyt8JChHSVRXRUJfQ09ORklHKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX0hPTUVfTElOS19TVFIrK3wkKEdJVFdFQl9IT01FX0xJTktfU1RSKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX1NJVEVOQU1FKyt8JChHSVRXRUJfU0lURU5BTUUpfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfUFJPSkVDVFJPT1QrK3wkKEdJVFdFQl9QUk9KRUNUUk9PVCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9FWFBPUlRfT0srK3wkKEdJVFdFQl9FWFBPUlRfT0spfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfU1RSSUNUX0VYUE9SVCsrfCQoR0lUV0VCX1NUUklDVF9FWFBPUlQpfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfQkFTRV9VUkwrK3wkKEdJVFdFQl9CQVNFX1VSTCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9MSVNUKyt8JChHSVRXRUJfTElTVCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9IT01FVEVYVCsrfCQoR0lUV0VCX0hPTUVURVhUKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX0NTUysrfCQoR0lUV0VCX0NTUyl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9MT0dPKyt8JChHSVRXRUJfTE9HTyl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9GQVZJQ09OKyt8JChHSVRXRUJfRkFWSUNPTil8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9TSVRFX0hFQURFUisrfCQoR0lUV0VCX1NJVEVfSEVBREVSKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX1NJVEVfRk9PVEVSKyt8JChHSVRXRUJfU0lURV9GT09URVIpfGcnIFwKKwkgICAgJDwgPiRAKyAmJiBcCisJY2htb2QgK3ggJEArICYmIFwKKwltdiAkQCsgJEAKKworZ2l0LWluc3Rhd2ViOiBnaXQtaW5zdGF3ZWIuc2ggZ2l0d2ViL2dpdHdlYi5jZ2kgZ2l0d2ViL2dpdHdlYi5jc3MKKwkkKFFVSUVUX0dFTilybSAtZiAkQCAkQCsgJiYgXAorCXNlZCAtZSAnMXN8IyEuKi9zaHwjISQoU0hFTExfUEFUSF9TUSl8JyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgIC1lICdzL0BATk9fQ1VSTEBALyQoTk9fQ1VSTCkvZycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NHSUBAL3IgZ2l0d2ViL2dpdHdlYi5jZ2knIFwKKwkgICAgLWUgJy9AQEdJVFdFQl9DR0lAQC9kJyBcCisJICAgIC1lICcvQEBHSVRXRUJfQ1NTQEAvciBnaXR3ZWIvZ2l0d2ViLmNzcycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NTU0BAL2QnIFwKKwkgICAgJEAuc2ggPiAkQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgJEArICRACisKK2NvbmZpZ3VyZTogY29uZmlndXJlLmFjCisJJChRVUlFVF9HRU4pcm0gLWYgJEAgJDwrICYmIFwKKwlzZWQgLWUgJ3MvQEBHSVRfVkVSU0lPTkBALyQoR0lUX1ZFUlNJT04pL2cnIFwKKwkgICAgJDwgPiAkPCsgJiYgXAorCWF1dG9jb25mIC1vICRAICQ8KyAmJiBcCisJcm0gLWYgJDwrCisKKyMgVGhlc2UgY2FuIHJlY29yZCBHSVRfVkVSU0lPTgorZ2l0JFggZ2l0LnNwZWMgXAorCSQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgXAorCSQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpIFwKKwk6IEdJVC1WRVJTSU9OLUZJTEUKKworJS5vOiAlLmMgR0lULUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CislLm86ICUuUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CisKK2V4ZWNfY21kLm86IGV4ZWNfY21kLmMgR0lULUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICctREdJVF9FWEVDX1BBVEg9IiQoZ2l0ZXhlY2Rpcl9TUSkiJyAkPAorYnVpbHRpbi1pbml0LWRiLm86IGJ1aWx0aW4taW5pdC1kYi5jIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRERFRkFVTFRfR0lUX1RFTVBMQVRFX0RJUj0nIiQodGVtcGxhdGVfZGlyX1NRKSInICQ8CisKK2h0dHAubzogaHR0cC5jIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtREdJVF9VU0VSX0FHRU5UPSciZ2l0LyQoR0lUX1ZFUlNJT04pIicgJDwKKworaWZkZWYgTk9fRVhQQVQKK2h0dHAtZmV0Y2gubzogaHR0cC1mZXRjaC5jIGh0dHAuaCBHSVQtQ0ZMQUdTCisJJChRVUlFVF9DQykkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLUROT19FWFBBVCAkPAorZW5kaWYKKworZ2l0LSUkWDogJS5vICQoR0lUTElCUykKKwkkKFFVSUVUX0xJTkspJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKKworc3NoLXB1bGwubzogc3NoLWZldGNoLmMKK3NzaC1wdXNoLm86IHNzaC11cGxvYWQuYworZ2l0LWxvY2FsLWZldGNoJFg6IGZldGNoLm8KK2dpdC1zc2gtZmV0Y2gkWDogcnNoLm8gZmV0Y2gubworZ2l0LXNzaC11cGxvYWQkWDogcnNoLm8KK2dpdC1zc2gtcHVsbCRYOiByc2gubyBmZXRjaC5vCitnaXQtc3NoLXB1c2gkWDogcnNoLm8KKworZ2l0LWltYXAtc2VuZCRYOiBpbWFwLXNlbmQubyAkKExJQl9GSUxFKQorCitodHRwLm8gaHR0cC1mZXRjaC5vIGh0dHAtcHVzaC5vOiBodHRwLmgKK2dpdC1odHRwLWZldGNoJFg6IGZldGNoLm8gaHR0cC5vIGh0dHAtZmV0Y2gubyAkKEdJVExJQlMpCisJJChRVUlFVF9MSU5LKSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSBcCisJCSQoTElCUykgJChDVVJMX0xJQkNVUkwpICQoRVhQQVRfTElCRVhQQVQpCisKK2dpdC1odHRwLXB1c2gkWDogcmV2aXNpb24ubyBodHRwLm8gaHR0cC1wdXNoLm8gJChHSVRMSUJTKQorCSQoUVVJRVRfTElOSykkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAorCQkkKExJQlMpICQoQ1VSTF9MSUJDVVJMKSAkKEVYUEFUX0xJQkVYUEFUKQorCiskKExJQl9PQkpTKSAkKEJVSUxUSU5fT0JKUykgZmV0Y2gubzogJChMSUJfSCkKKyQocGF0c3Vic3QgZ2l0LSUkWCwlLm8sJChQUk9HUkFNUykpOiAkKExJQl9IKSAkKHdpbGRjYXJkICovKi5oKQorJChESUZGX09CSlMpOiBkaWZmY29yZS5oCisKKyQoTElCX0ZJTEUpOiAkKExJQl9PQkpTKQorCSQoUVVJRVRfQVIpcm0gLWYgJEAgJiYgJChBUikgcmNzICRAICQoTElCX09CSlMpCisKK1hESUZGX09CSlM9eGRpZmYveGRpZmZpLm8geGRpZmYveHByZXBhcmUubyB4ZGlmZi94dXRpbHMubyB4ZGlmZi94ZW1pdC5vIFwKKwl4ZGlmZi94bWVyZ2UubworJChYRElGRl9PQkpTKTogeGRpZmYveGluY2x1ZGUuaCB4ZGlmZi94bWFjcm9zLmggeGRpZmYveGRpZmYuaCB4ZGlmZi94dHlwZXMuaCBcCisJeGRpZmYveHV0aWxzLmggeGRpZmYveHByZXBhcmUuaCB4ZGlmZi94ZGlmZmkuaCB4ZGlmZi94ZW1pdC5oCisKKyQoWERJRkZfTElCKTogJChYRElGRl9PQkpTKQorCSQoUVVJRVRfQVIpcm0gLWYgJEAgJiYgJChBUikgcmNzICRAICQoWERJRkZfT0JKUykKKworCitwZXJsL01ha2VmaWxlOiBwZXJsL0dpdC5wbSBwZXJsL01ha2VmaWxlLlBMIEdJVC1DRkxBR1MKKwkoY2QgcGVybCAmJiAkKFBFUkxfUEFUSCkgTWFrZWZpbGUuUEwgXAorCQlQUkVGSVg9JyQocHJlZml4X1NRKScpCisKK2RvYzoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gYWxsCisKK1RBR1M6CisJcm0gLWYgVEFHUworCWZpbmQgLiAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgZXRhZ3MgLWEKKwordGFnczoKKwlybSAtZiB0YWdzCisJZmluZCAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBjdGFncyAtYQorCisjIyMgRGV0ZWN0IHByZWZpeCBjaGFuZ2VzCitUUkFDS19DRkxBR1MgPSAkKHN1YnN0ICcsJ1wnJywkKEFMTF9DRkxBR1MpKTpcCisgICAgICAgICAgICAgJChiaW5kaXJfU1EpOiQoZ2l0ZXhlY2Rpcl9TUSk6JCh0ZW1wbGF0ZV9kaXJfU1EpOiQocHJlZml4X1NRKQorCitHSVQtQ0ZMQUdTOiAuRk9SQ0UtR0lULUNGTEFHUworCUBGTEFHUz0nJChUUkFDS19DRkxBR1MpJzsgXAorCSAgICBpZiB0ZXN0IHgiJCRGTEFHUyIgIT0geCJgY2F0IEdJVC1DRkxBR1MgMj4vZGV2L251bGxgIiA7IHRoZW4gXAorCQllY2hvIDE+JjIgIiAgICAqIG5ldyBidWlsZCBmbGFncyBvciBwcmVmaXgiOyBcCisJCWVjaG8gIiQkRkxBR1MiID5HSVQtQ0ZMQUdTOyBcCisgICAgICAgICAgICBmaQorCisjIyMgRGV0ZWN0IFRjay9UayBpbnRlcnByZXRlciBwYXRoIGNoYW5nZXMKK2lmbmRlZiBOT19UQ0xUSworVFJBQ0tfVkFSUyA9ICQoc3Vic3QgJywnXCcnLC1EVENMVEtfUEFUSD0nJChUQ0xUS19QQVRIX1NRKScpCiAKIEdJVC1HVUktVkFSUzogLkZPUkNFLUdJVC1HVUktVkFSUwogCUBWQVJTPSckKFRSQUNLX1ZBUlMpJzsgXAotCWlmIHRlc3QgeCIkJFZBUlMiICE9IHgiYGNhdCAkQCAyPi9kZXYvbnVsbGAiIDsgdGhlbiBcCi0JCWVjaG8gMT4mMiAiICAgICogbmV3IGxvY2F0aW9ucyBvciBUY2wvVGsgaW50ZXJwcmV0ZXIiOyBcCi0JCWVjaG8gMT4kQCAiJCRWQVJTIjsgXAotCWZpCisJICAgIGlmIHRlc3QgeCIkJFZBUlMiICE9IHgiYGNhdCAkQCAyPi9kZXYvbnVsbGAiIDsgdGhlbiBcCisJCWVjaG8gMT4mMiAiICAgICogbmV3IFRjbC9UayBpbnRlcnByZXRlciBsb2NhdGlvbiI7IFwKKwkJZWNobyAiJCRWQVJTIiA+JEA7IFwKKyAgICAgICAgICAgIGZpCiAKLWFsbDo6ICQoQUxMX1BST0dSQU1TKSBsaWIvdGNsSW5kZXgKKy5QSE9OWTogLkZPUkNFLUdJVC1HVUktVkFSUworZW5kaWYKKworIyMjIFRlc3RpbmcgcnVsZXMKKworVEVTVF9QUk9HUkFNUyA9IHRlc3QtY2htdGltZSRYIHRlc3QtZ2VucmFuZG9tJFgKKworYWxsOjogJChURVNUX1BST0dSQU1TKQorCisjIEdOVSBtYWtlIHN1cHBvcnRzIGV4cG9ydGluZyBhbGwgdmFyaWFibGVzIGJ5ICJleHBvcnQiIHdpdGhvdXQgcGFyYW1ldGVycy4KKyMgSG93ZXZlciwgdGhlIGVudmlyb25tZW50IGdldHMgcXVpdGUgYmlnLCBhbmQgc29tZSBwcm9ncmFtcyBoYXZlIHByb2JsZW1zCisjIHdpdGggdGhhdC4KKworZXhwb3J0IE5PX1NWTl9URVNUUworCit0ZXN0OiBhbGwKKwkkKE1BS0UpIC1DIHQvIGFsbAorCit0ZXN0LWRhdGUkWDogdGVzdC1kYXRlLmMgZGF0ZS5vIGN0eXBlLm8KKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpIHRlc3QtZGF0ZS5jIGRhdGUubyBjdHlwZS5vCisKK3Rlc3QtZGVsdGEkWDogdGVzdC1kZWx0YS5vIGRpZmYtZGVsdGEubyBwYXRjaC1kZWx0YS5vICQoR0lUTElCUykKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgJChMSUJTKQorCit0ZXN0LWR1bXAtY2FjaGUtdHJlZSRYOiBkdW1wLWNhY2hlLXRyZWUubyAkKEdJVExJQlMpCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKKwordGVzdC1zaGExJFg6IHRlc3Qtc2hhMS5vICQoR0lUTElCUykKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgJChMSUJTKQorCit0ZXN0LW1hdGNoLXRyZWVzJFg6IHRlc3QtbWF0Y2gtdHJlZXMubyAkKEdJVExJQlMpCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKKwordGVzdC1jaG10aW1lJFg6IHRlc3QtY2htdGltZS5jCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkPAorCit0ZXN0LWdlbnJhbmRvbSRYOiB0ZXN0LWdlbnJhbmRvbS5jCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkPAorCitjaGVjay1zaGExOjogdGVzdC1zaGExJFgKKwkuL3Rlc3Qtc2hhMS5zaAorCitjaGVjazogY29tbW9uLWNtZHMuaAorCWZvciBpIGluICouYzsgZG8gc3BhcnNlICQoQUxMX0NGTEFHUykgJChTUEFSU0VfRkxBR1MpICQkaSB8fCBleGl0OyBkb25lCisKKworCisjIyMgSW5zdGFsbGF0aW9uIHJ1bGVzCiAKIGluc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgLW03NTUgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCiAJJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSknCi0JJChJTlNUQUxMKSBnaXQtZ3VpICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScKLQkkKGZvcmVhY2ggcCwkKEdJVEdVSV9CVUlMVF9JTlMpLCBybSAtZiAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnICYmIGxuICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS9naXQtZ3VpJyAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnIDspCi0JJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQobGliZGlyX1NRKScKLQkkKElOU1RBTEwpIC1tNjQ0IGxpYi90Y2xJbmRleCAnJChERVNURElSX1NRKSQobGliZGlyX1NRKScKLQkkKGZvcmVhY2ggcCwkKEFMTF9MSUJGSUxFUyksICQoSU5TVEFMTCkgLW02NDQgJHAgJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknIDspCisJJChJTlNUQUxMKSAkKEFMTF9QUk9HUkFNUykgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJworCSQoSU5TVEFMTCkgZ2l0JFggJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCisJJChNQUtFKSAtQyB0ZW1wbGF0ZXMgREVTVERJUj0nJChERVNURElSX1NRKScgaW5zdGFsbAorCSQoTUFLRSkgLUMgcGVybCBwcmVmaXg9JyQocHJlZml4X1NRKScgaW5zdGFsbAoraWZuZGVmIE5PX1RDTFRLCisJJChJTlNUQUxMKSBnaXRrLXdpc2ggJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknL2dpdGsKKwkkKE1BS0UpIC1DIGdpdC1ndWkgaW5zdGFsbAorZW5kaWYKKwlpZiB0ZXN0ICd6JChiaW5kaXJfU1EpJyAhPSAneiQoZ2l0ZXhlY2Rpcl9TUSknOyBcCisJdGhlbiBcCisJCWxuIC1mICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpL2dpdCRYJyBcCisJCQknJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0JFgnIHx8IFwKKwkJY3AgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSkvZ2l0JFgnIFwKKwkJCSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS9naXQkWCc7IFwKKwlmaQorCSQoZm9yZWFjaCBwLCQoQlVJTFRfSU5TKSwgcm0gLWYgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyAmJiBsbiAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0JFgnICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS8kcCcgOykKK2lmbmVxICgsJFgpCisJJChmb3JlYWNoIHAsJChwYXRzdWJzdCAlJFgsJSwkKGZpbHRlciAlJFgsJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCkpLCBybSAtZiAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnOykKK2VuZGlmCiAKLWRpc3QtdmVyc2lvbjoKLQlAbWtkaXIgLXAgJChUQVJESVIpCi0JQGVjaG8gJChHSVRHVUlfVkVSU0lPTikgPiAkKFRBUkRJUikvdmVyc2lvbgoraW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwKIAotY2xlYW46OgotCXJtIC1mICQoQUxMX1BST0dSQU1TKSBsaWIvdGNsSW5kZXgKLQlybSAtZiBHSVQtVkVSU0lPTi1GSUxFIEdJVC1HVUktVkFSUworcXVpY2staW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHF1aWNrLWluc3RhbGwKIAotLlBIT05ZOiBhbGwgaW5zdGFsbCBkaXN0LXZlcnNpb24gY2xlYW4KLS5QSE9OWTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUKLS5QSE9OWTogLkZPUkNFLUdJVC1HVUktVkFSUworCisKKyMjIyBNYWludGFpbmVyJ3MgZGlzdCBydWxlcworCitnaXQuc3BlYzogZ2l0LnNwZWMuaW4KKwlzZWQgLWUgJ3MvQEBWRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgPCAkPCA+ICRAKworCW12ICRAKyAkQAorCitHSVRfVEFSTkFNRT1naXQtJChHSVRfVkVSU0lPTikKK2Rpc3Q6IGdpdC5zcGVjIGdpdC1hcmNoaXZlCisJLi9naXQtYXJjaGl2ZSAtLWZvcm1hdD10YXIgXAorCQktLXByZWZpeD0kKEdJVF9UQVJOQU1FKS8gSEVBRF57dHJlZX0gPiAkKEdJVF9UQVJOQU1FKS50YXIKKwlAbWtkaXIgLXAgJChHSVRfVEFSTkFNRSkKKwlAY3AgZ2l0LnNwZWMgJChHSVRfVEFSTkFNRSkKKwlAZWNobyAkKEdJVF9WRVJTSU9OKSA+ICQoR0lUX1RBUk5BTUUpL3ZlcnNpb24KKwlAJChNQUtFKSAtQyBnaXQtZ3VpIFRBUkRJUj0uLi8kKEdJVF9UQVJOQU1FKS9naXQtZ3VpIGRpc3QtdmVyc2lvbgorCSQoVEFSKSByZiAkKEdJVF9UQVJOQU1FKS50YXIgXAorCQkkKEdJVF9UQVJOQU1FKS9naXQuc3BlYyBcCisJCSQoR0lUX1RBUk5BTUUpL3ZlcnNpb24gXAorCQkkKEdJVF9UQVJOQU1FKS9naXQtZ3VpL3ZlcnNpb24KKwlAcm0gLXJmICQoR0lUX1RBUk5BTUUpCisJZ3ppcCAtZiAtOSAkKEdJVF9UQVJOQU1FKS50YXIKKworcnBtOiBkaXN0CisJJChSUE1CVUlMRCkgLXRhICQoR0lUX1RBUk5BTUUpLnRhci5negorCitodG1sZG9jcyA9IGdpdC1odG1sZG9jcy0kKEdJVF9WRVJTSU9OKQorbWFucGFnZXMgPSBnaXQtbWFucGFnZXMtJChHSVRfVkVSU0lPTikKK2Rpc3QtZG9jOgorCXJtIC1mciAuZG9jLXRtcC1kaXIKKwlta2RpciAuZG9jLXRtcC1kaXIKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gV0VCRE9DX0RFU1Q9Li4vLmRvYy10bXAtZGlyIGluc3RhbGwtd2ViZG9jCisJY2QgLmRvYy10bXAtZGlyICYmICQoVEFSKSBjZiAuLi8kKGh0bWxkb2NzKS50YXIgLgorCWd6aXAgLW4gLTkgLWYgJChodG1sZG9jcykudGFyCisJOgorCXJtIC1mciAuZG9jLXRtcC1kaXIKKwlta2RpciAtcCAuZG9jLXRtcC1kaXIvbWFuMSAuZG9jLXRtcC1kaXIvbWFuNSAuZG9jLXRtcC1kaXIvbWFuNworCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBERVNURElSPS4vIFwKKwkJbWFuMWRpcj0uLi8uZG9jLXRtcC1kaXIvbWFuMSBcCisJCW1hbjVkaXI9Li4vLmRvYy10bXAtZGlyL21hbjUgXAorCQltYW43ZGlyPS4uLy5kb2MtdG1wLWRpci9tYW43IFwKKwkJaW5zdGFsbAorCWNkIC5kb2MtdG1wLWRpciAmJiAkKFRBUikgY2YgLi4vJChtYW5wYWdlcykudGFyIC4KKwlnemlwIC1uIC05IC1mICQobWFucGFnZXMpLnRhcgorCXJtIC1mciAuZG9jLXRtcC1kaXIKKworIyMjIENsZWFuaW5nIHJ1bGVzCisKK2NsZWFuOgorCXJtIC1mICoubyBtb3ppbGxhLXNoYTEvKi5vIGFybS8qLm8gcHBjLyoubyBjb21wYXQvKi5vIHhkaWZmLyoubyBcCisJCXRlc3QtY2htdGltZSRYIHRlc3QtZ2VucmFuZG9tJFggJChMSUJfRklMRSkgJChYRElGRl9MSUIpCisJcm0gLWYgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWAorCXJtIC1mICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MKKwlybSAtcmYgYXV0b200dGUuY2FjaGUKKwlybSAtZiBjb25maWd1cmUgY29uZmlnLmxvZyBjb25maWcubWFrLmF1dG9nZW4gY29uZmlnLm1hay5hcHBlbmQgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKKwlybSAtcmYgJChHSVRfVEFSTkFNRSkgLmRvYy10bXAtZGlyCisJcm0gLWYgJChHSVRfVEFSTkFNRSkudGFyLmd6IGdpdC1jb3JlXyQoR0lUX1ZFUlNJT04pLSoudGFyLmd6CisJcm0gLWYgJChodG1sZG9jcykudGFyLmd6ICQobWFucGFnZXMpLnRhci5negorCXJtIC1mIGdpdHdlYi9naXR3ZWIuY2dpCisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uLyBjbGVhbgorCSQoTUFLRSkgLUMgcGVybCBjbGVhbgorCSQoTUFLRSkgLUMgdGVtcGxhdGVzLyBjbGVhbgorCSQoTUFLRSkgLUMgdC8gY2xlYW4KK2lmbmRlZiBOT19UQ0xUSworCXJtIC1mIGdpdGstd2lzaAorCSQoTUFLRSkgLUMgZ2l0LWd1aSBjbGVhbgorZW5kaWYKKwlybSAtZiBHSVQtVkVSU0lPTi1GSUxFIEdJVC1DRkxBR1MgR0lULUdVSS1WQVJTCisKKy5QSE9OWTogYWxsIGluc3RhbGwgY2xlYW4gc3RyaXAKKy5QSE9OWTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUgVEFHUyB0YWdzIC5GT1JDRS1HSVQtQ0ZMQUdTCisKKyMjIyBDaGVjayBkb2N1bWVudGF0aW9uCisjCitjaGVjay1kb2NzOjoKKwlAZm9yIHYgaW4gJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCBnaXRrOyBcCisJZG8gXAorCQljYXNlICIkJHYiIGluIFwKKwkJZ2l0LW1lcmdlLW9jdG9wdXMgfCBnaXQtbWVyZ2Utb3VycyB8IGdpdC1tZXJnZS1yZWN1cnNpdmUgfCBcCisJCWdpdC1tZXJnZS1yZXNvbHZlIHwgZ2l0LW1lcmdlLXN0dXBpZCB8IFwKKwkJZ2l0LWFkZC0taW50ZXJhY3RpdmUgfCBnaXQtZnNjay1vYmplY3RzIHwgZ2l0LWluaXQtZGIgfCBcCisJCWdpdC1yZXBvLWNvbmZpZyB8IGdpdC1mZXRjaC0tdG9vbCB8IFwKKwkJZ2l0LXNzaC1wdWxsIHwgZ2l0LXNzaC1wdXNoICkgY29udGludWUgOzsgXAorCQllc2FjIDsgXAorCQl0ZXN0IC1mICJEb2N1bWVudGF0aW9uLyQkdi50eHQiIHx8IFwKKwkJZWNobyAibm8gZG9jOiAkJHYiOyBcCisJCXNlZCAtZSAnMSwvXl9fREFUQV9fL2QnIERvY3VtZW50YXRpb24vY21kLWxpc3QucGVybCB8IFwKKwkJZ3JlcCAtcSAiXiQkdlsgCV0iIHx8IFwKKwkJY2FzZSAiJCR2IiBpbiBcCisJCWdpdCkgOzsgXAorCQkqKSBlY2hvICJubyBsaW5rOiAkJHYiOzsgXAorCQllc2FjIDsgXAorCWRvbmUgfCBzb3J0CisKKyMjIyBNYWtlIHN1cmUgYnVpbHQtaW5zIGRvIG5vdCBoYXZlIGR1cHMgYW5kIGxpc3RlZCBpbiBnaXQuYworIworY2hlY2stYnVpbHRpbnM6OgorCS4vY2hlY2stYnVpbHRpbnMuc2gKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDgxNDJjCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsNDYgQEAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUdJVCAtIHRoZSBzdHVwaWQgY29udGVudCB0cmFja2VyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworImdpdCIgY2FuIG1lYW4gYW55dGhpbmcsIGRlcGVuZGluZyBvbiB5b3VyIG1vb2QuCisKKyAtIHJhbmRvbSB0aHJlZS1sZXR0ZXIgY29tYmluYXRpb24gdGhhdCBpcyBwcm9ub3VuY2VhYmxlLCBhbmQgbm90CisgICBhY3R1YWxseSB1c2VkIGJ5IGFueSBjb21tb24gVU5JWCBjb21tYW5kLiAgVGhlIGZhY3QgdGhhdCBpdCBpcyBhCisgICBtaXNwcm9udW5jaWF0aW9uIG9mICJnZXQiIG1heSBvciBtYXkgbm90IGJlIHJlbGV2YW50LgorIC0gc3R1cGlkLiBjb250ZW1wdGlibGUgYW5kIGRlc3BpY2FibGUuIHNpbXBsZS4gVGFrZSB5b3VyIHBpY2sgZnJvbSB0aGUKKyAgIGRpY3Rpb25hcnkgb2Ygc2xhbmcuCisgLSAiZ2xvYmFsIGluZm9ybWF0aW9uIHRyYWNrZXIiOiB5b3UncmUgaW4gYSBnb29kIG1vb2QsIGFuZCBpdCBhY3R1YWxseQorICAgd29ya3MgZm9yIHlvdS4gQW5nZWxzIHNpbmcsIGFuZCBhIGxpZ2h0IHN1ZGRlbmx5IGZpbGxzIHRoZSByb29tLgorIC0gImdvZGRhbW4gaWRpb3RpYyB0cnVja2xvYWQgb2Ygc2gqdCI6IHdoZW4gaXQgYnJlYWtzCisKK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitHaXQgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK0l0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgd2l0aCBoZWxwIG9mIGEgZ3JvdXAgb2YKK2hhY2tlcnMgYXJvdW5kIHRoZSBuZXQuIEl0IGlzIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitQbGVhc2UgcmVhZCB0aGUgZmlsZSBJTlNUQUxMIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorU2VlIERvY3VtZW50YXRpb24vdHV0b3JpYWwudHh0IHRvIGdldCBzdGFydGVkLCB0aGVuIHNlZQorRG9jdW1lbnRhdGlvbi9ldmVyeWRheS50eHQgZm9yIGEgdXNlZnVsIG1pbmltdW0gc2V0IG9mIGNvbW1hbmRzLAorYW5kICJtYW4gZ2l0LWNvbW1hbmRuYW1lIiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGNvbW1hbmQuCitDVlMgdXNlcnMgbWF5IGFsc28gd2FudCB0byByZWFkIERvY3VtZW50YXRpb24vY3ZzLW1pZ3JhdGlvbi50eHQuCisKK01hbnkgR2l0IG9ubGluZSByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUgZnJvbSBodHRwOi8vZ2l0Lm9yLmN6LworaW5jbHVkaW5nIGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgR2l0IHJlbGF0ZWQgdG9vbHMuCisKK1RoZSB1c2VyIGRpc2N1c3Npb24gYW5kIGRldmVsb3BtZW50IG9mIEdpdCB0YWtlIHBsYWNlIG9uIHRoZSBHaXQKK21haWxpbmcgbGlzdCAtLSBldmVyeW9uZSBpcyB3ZWxjb21lIHRvIHBvc3QgYnVnIHJlcG9ydHMsIGZlYXR1cmUKK3JlcXVlc3RzLCBjb21tZW50cyBhbmQgcGF0Y2hlcyB0byBnaXRAdmdlci5rZXJuZWwub3JnLiBUbyBzdWJzY3JpYmUKK3RvIHRoZSBsaXN0LCBzZW5kIGFuIGVtYWlsIHdpdGgganVzdCAic3Vic2NyaWJlIGdpdCIgaW4gdGhlIGJvZHkgdG8KK21ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcuIFRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMgYXJlIGF2YWlsYWJsZSBhdAoraHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQgYW5kIG90aGVyIGFyY2hpdmFsIHNpdGVzLgorCitUaGUgbWVzc2FnZXMgdGl0bGVkICJBIG5vdGUgZnJvbSB0aGUgbWFpbnRhaW5lciIsICJXaGF0J3MgaW4KK2dpdC5naXQgKHN0YWJsZSkiIGFuZCAiV2hhdCdzIGNvb2tpbmcgaW4gZ2l0LmdpdCAodG9waWNzKSIgYW5kCit0aGUgZGlzY3Vzc2lvbiBmb2xsb3dpbmcgdGhlbSBvbiB0aGUgbWFpbGluZyBsaXN0IGdpdmUgYSBnb29kCityZWZlcmVuY2UgZm9yIHByb2plY3Qgc3RhdHVzLCBkZXZlbG9wbWVudCBkaXJlY3Rpb24gYW5kCityZW1haW5pbmcgdGFza3MuCmRpZmYgLS1naXQgYS9SZWxOb3RlcyBiL1JlbE5vdGVzCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmExYzgyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9SZWxOb3RlcwpAQCAtMCwwICsxIEBACitEb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjMudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWxsb2MuYyBiL2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FsbG9jLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIGFsbG9jLmMgIC0gc3BlY2lhbGl6ZWQgYWxsb2NhdG9yIGZvciBpbnRlcm5hbCBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlIHN0YW5kYXJkIG1hbGxvYy9mcmVlIHdhc3RlcyB0b28gbXVjaCBzcGFjZSBmb3Igb2JqZWN0cywgcGFydGx5IGJlY2F1c2UKKyAqIGl0IG1haW50YWlucyBhbGwgdGhlIGFsbG9jYXRpb24gaW5mcmFzdHJ1Y3R1cmUgKHdoaWNoIGlzbid0IG5lZWRlZCwgc2luY2UKKyAqIHdlIG5ldmVyIGZyZWUgYW4gb2JqZWN0IGRlc2NyaXB0b3IgYW55d2F5KSwgYnV0IGV2ZW4gbW9yZSBiZWNhdXNlIGl0IGVuZHMKKyAqIHVwIHdpdGggbWF4aW1hbCBhbGlnbm1lbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgd2hhdCB0aGUgb2JqZWN0IGFsaWdubWVudAorICogZm9yIHRoZSBuZXcgYWxsb2NhdGlvbiBpcy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworI2RlZmluZSBCTE9DS0lORyAxMDI0CisKKyNkZWZpbmUgREVGSU5FX0FMTE9DQVRPUihuYW1lLCB0eXBlKQkJCQlcCitzdGF0aWMgdW5zaWduZWQgaW50IG5hbWUjI19hbGxvY3M7CQkJCVwKK3ZvaWQgKmFsbG9jXyMjbmFtZSMjX25vZGUodm9pZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwlzdGF0aWMgaW50IG5yOwkJCQkJCVwKKwlzdGF0aWMgdHlwZSAqYmxvY2s7CQkJCQlcCisJdm9pZCAqcmV0OwkJCQkJCVwKKwkJCQkJCQkJXAorCWlmICghbnIpIHsJCQkJCQlcCisJCW5yID0gQkxPQ0tJTkc7CQkJCQlcCisJCWJsb2NrID0geG1hbGxvYyhCTE9DS0lORyAqIHNpemVvZih0eXBlKSk7CVwKKwl9CQkJCQkJCVwKKwluci0tOwkJCQkJCQlcCisJbmFtZSMjX2FsbG9jcysrOwkJCQkJXAorCXJldCA9IGJsb2NrKys7CQkJCQkJXAorCW1lbXNldChyZXQsIDAsIHNpemVvZih0eXBlKSk7CQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCVwKK30KKwordW5pb24gYW55X29iamVjdCB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJc3RydWN0IGJsb2IgYmxvYjsKKwlzdHJ1Y3QgdHJlZSB0cmVlOworCXN0cnVjdCBjb21taXQgY29tbWl0OworCXN0cnVjdCB0YWcgdGFnOworfTsKKworREVGSU5FX0FMTE9DQVRPUihibG9iLCBzdHJ1Y3QgYmxvYikKK0RFRklORV9BTExPQ0FUT1IodHJlZSwgc3RydWN0IHRyZWUpCitERUZJTkVfQUxMT0NBVE9SKGNvbW1pdCwgc3RydWN0IGNvbW1pdCkKK0RFRklORV9BTExPQ0FUT1IodGFnLCBzdHJ1Y3QgdGFnKQorREVGSU5FX0FMTE9DQVRPUihvYmplY3QsIHVuaW9uIGFueV9vYmplY3QpCisKKyNpZmRlZiBOT19DOTlfRk9STUFUCisjZGVmaW5lIFNaX0ZNVCAiJXUiCisjZWxzZQorI2RlZmluZSBTWl9GTVQgIiV6dSIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgaW50IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUxMHM6ICU4dSAoIiBTWl9GTVQgIiBrQilcbiIsIG5hbWUsIGNvdW50LCBzaXplKTsKK30KKworI3VuZGVmIFNaX0ZNVAorCisjZGVmaW5lIFJFUE9SVChuYW1lKQlcCisgICAgcmVwb3J0KCNuYW1lLCBuYW1lIyNfYWxsb2NzLCBuYW1lIyNfYWxsb2NzKnNpemVvZihzdHJ1Y3QgbmFtZSkgPj4gMTApCisKK3ZvaWQgYWxsb2NfcmVwb3J0KHZvaWQpCit7CisJUkVQT1JUKGJsb2IpOworCVJFUE9SVCh0cmVlKTsKKwlSRVBPUlQoY29tbWl0KTsKKwlSRVBPUlQodGFnKTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmUtdGFyLmMgYi9hcmNoaXZlLXRhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTc2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZlLXRhci5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IFJlbmUgU2NoYXJmZQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKyNpbmNsdWRlICJ0YXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisjZGVmaW5lIFJFQ09SRFNJWkUJKDUxMikKKyNkZWZpbmUgQkxPQ0tTSVpFCShSRUNPUkRTSVpFICogMjApCisKK3N0YXRpYyBjaGFyIGJsb2NrW0JMT0NLU0laRV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKK3N0YXRpYyB0aW1lX3QgYXJjaGl2ZV90aW1lOworc3RhdGljIGludCB0YXJfdW1hc2sgPSAwMDI7CitzdGF0aWMgaW50IHZlcmJvc2U7CisKKy8qIHdyaXRlcyBvdXQgdGhlIHdob2xlIGJsb2NrLCBidXQgb25seSBpZiBpdCBpcyBmdWxsICovCitzdGF0aWMgdm9pZCB3cml0ZV9pZl9uZWVkZWQodm9pZCkKK3sKKwlpZiAob2Zmc2V0ID09IEJMT0NLU0laRSkgeworCQl3cml0ZV9vcl9kaWUoMSwgYmxvY2ssIEJMT0NLU0laRSk7CisJCW9mZnNldCA9IDA7CisJfQorfQorCisvKgorICogcXVldWVzIHVwIHdyaXRlcywgc28gdGhhdCBhbGwgb3VyIHdyaXRlKDIpIGNhbGxzIHdyaXRlIGV4YWN0bHkgb25lCisgKiBmdWxsIGJsb2NrOyBwYWRzIHdyaXRlcyB0byBSRUNPUkRTSVpFCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrZWQoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyB0YWlsOworCisJaWYgKG9mZnNldCkgeworCQl1bnNpZ25lZCBsb25nIGNodW5rID0gQkxPQ0tTSVpFIC0gb2Zmc2V0OworCQlpZiAoc2l6ZSA8IGNodW5rKQorCQkJY2h1bmsgPSBzaXplOworCQltZW1jcHkoYmxvY2sgKyBvZmZzZXQsIGJ1ZiwgY2h1bmspOworCQlzaXplIC09IGNodW5rOworCQlvZmZzZXQgKz0gY2h1bms7CisJCWJ1ZiArPSBjaHVuazsKKwkJd3JpdGVfaWZfbmVlZGVkKCk7CisJfQorCXdoaWxlIChzaXplID49IEJMT0NLU0laRSkgeworCQl3cml0ZV9vcl9kaWUoMSwgYnVmLCBCTE9DS1NJWkUpOworCQlzaXplIC09IEJMT0NLU0laRTsKKwkJYnVmICs9IEJMT0NLU0laRTsKKwl9CisJaWYgKHNpemUpIHsKKwkJbWVtY3B5KGJsb2NrICsgb2Zmc2V0LCBidWYsIHNpemUpOworCQlvZmZzZXQgKz0gc2l6ZTsKKwl9CisJdGFpbCA9IG9mZnNldCAlIFJFQ09SRFNJWkU7CisJaWYgKHRhaWwpICB7CisJCW1lbXNldChibG9jayArIG9mZnNldCwgMCwgUkVDT1JEU0laRSAtIHRhaWwpOworCQlvZmZzZXQgKz0gUkVDT1JEU0laRSAtIHRhaWw7CisJfQorCXdyaXRlX2lmX25lZWRlZCgpOworfQorCisvKgorICogVGhlIGVuZCBvZiB0YXIgYXJjaGl2ZXMgaXMgbWFya2VkIGJ5IDIqNTEyIG51bCBieXRlcyBhbmQgYWZ0ZXIgdGhhdAorICogZm9sbG93cyB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgKGlmIGFueSkuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3RyYWlsZXIodm9pZCkKK3sKKwlpbnQgdGFpbCA9IEJMT0NLU0laRSAtIG9mZnNldDsKKwltZW1zZXQoYmxvY2sgKyBvZmZzZXQsIDAsIHRhaWwpOworCXdyaXRlX29yX2RpZSgxLCBibG9jaywgQkxPQ0tTSVpFKTsKKwlpZiAodGFpbCA8IDIgKiBSRUNPUkRTSVpFKSB7CisJCW1lbXNldChibG9jaywgMCwgb2Zmc2V0KTsKKwkJd3JpdGVfb3JfZGllKDEsIGJsb2NrLCBCTE9DS1NJWkUpOworCX0KK30KKworc3RhdGljIHZvaWQgc3RyYnVmX2FwcGVuZF9zdHJpbmcoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IHNsZW4gPSBzdHJsZW4ocyk7CisJaW50IHRvdGFsID0gc2ItPmxlbiArIHNsZW47CisJaWYgKHRvdGFsICsgMSA+IHNiLT5hbGxvYykgeworCQlzYi0+YnVmID0geHJlYWxsb2Moc2ItPmJ1ZiwgdG90YWwgKyAxKTsKKwkJc2ItPmFsbG9jID0gdG90YWwgKyAxOworCX0KKwltZW1jcHkoc2ItPmJ1ZiArIHNiLT5sZW4sIHMsIHNsZW4pOworCXNiLT5sZW4gPSB0b3RhbDsKKwlzYi0+YnVmW3RvdGFsXSA9ICdcMCc7Cit9CisKKy8qCisgKiBwYXggZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgaGF2ZSB0aGUgZm9ybWF0ICIldSAlcz0lc1xuIi4gICV1IGNvbnRhaW5zCisgKiB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgc3RyaW5nIChpbmNsdWRpbmcgdGhlICV1KSwgdGhlIGZpcnN0ICVzIGlzIHRoZQorICoga2V5d29yZCwgdGhlIHNlY29uZCBvbmUgaXMgdGhlIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHN1Y2ggYQorICogc3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIGEgc3RydWN0IHN0cmJ1Zi4KKyAqLworc3RhdGljIHZvaWQgc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICprZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgdmFsdWVsZW4pCit7CisJY2hhciAqcDsKKwlpbnQgbGVuLCB0b3RhbCwgdG1wOworCisJLyogIiV1ICVzPSVzXG4iICovCisJbGVuID0gMSArIDEgKyBzdHJsZW4oa2V5d29yZCkgKyAxICsgdmFsdWVsZW4gKyAxOworCWZvciAodG1wID0gbGVuOyB0bXAgPiA5OyB0bXAgLz0gMTApCisJCWxlbisrOworCisJdG90YWwgPSBzYi0+bGVuICsgbGVuOworCWlmICh0b3RhbCA+IHNiLT5hbGxvYykgeworCQlzYi0+YnVmID0geHJlYWxsb2Moc2ItPmJ1ZiwgdG90YWwpOworCQlzYi0+YWxsb2MgPSB0b3RhbDsKKwl9CisKKwlwID0gc2ItPmJ1ZjsKKwlwICs9IHNwcmludGYocCwgIiV1ICVzPSIsIGxlbiwga2V5d29yZCk7CisJbWVtY3B5KHAsIHZhbHVlLCB2YWx1ZWxlbik7CisJcCArPSB2YWx1ZWxlbjsKKwkqcCA9ICdcbic7CisJc2ItPmxlbiA9IHRvdGFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHVzdGFyX2hlYWRlcl9jaGtzdW0oY29uc3Qgc3RydWN0IHVzdGFyX2hlYWRlciAqaGVhZGVyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKWhlYWRlcjsKKwl1bnNpZ25lZCBpbnQgY2hrc3VtID0gMDsKKwl3aGlsZSAocCA8IGhlYWRlci0+Y2hrc3VtKQorCQljaGtzdW0gKz0gKnArKzsKKwljaGtzdW0gKz0gc2l6ZW9mKGhlYWRlci0+Y2hrc3VtKSAqICcgJzsKKwlwICs9IHNpemVvZihoZWFkZXItPmNoa3N1bSk7CisJd2hpbGUgKHAgPCAoY2hhciAqKWhlYWRlciArIHNpemVvZihzdHJ1Y3QgdXN0YXJfaGVhZGVyKSkKKwkJY2hrc3VtICs9ICpwKys7CisJcmV0dXJuIGNoa3N1bTsKK30KKworc3RhdGljIGludCBnZXRfcGF0aF9wcmVmaXgoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqcGF0aCwgaW50IG1heGxlbikKK3sKKwlpbnQgaSA9IHBhdGgtPmxlbjsKKwlpZiAoaSA+IG1heGxlbikKKwkJaSA9IG1heGxlbjsKKwlkbyB7CisJCWktLTsKKwl9IHdoaWxlIChpID4gMCAmJiBwYXRoLT5idWZbaV0gIT0gJy8nKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHN0cmJ1ZiAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgdXN0YXJfaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3Qgc3RyYnVmIGV4dF9oZWFkZXI7CisKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCWV4dF9oZWFkZXIuYnVmID0gTlVMTDsKKwlleHRfaGVhZGVyLmxlbiA9IGV4dF9oZWFkZXIuYWxsb2MgPSAwOworCisJaWYgKCFzaGExKSB7CisJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19HTE9CQUxfSEVBREVSOworCQltb2RlID0gMDEwMDY2NjsKKwkJc3RyY3B5KGhlYWRlci5uYW1lLCAicGF4X2dsb2JhbF9oZWFkZXIiKTsKKwl9IGVsc2UgaWYgKCFwYXRoKSB7CisJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19FWFRfSEVBREVSOworCQltb2RlID0gMDEwMDY2NjsKKwkJc3ByaW50ZihoZWFkZXIubmFtZSwgIiVzLnBheGhlYWRlciIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9IGVsc2UgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJS4qc1xuIiwgcGF0aC0+bGVuLCBwYXRoLT5idWYpOworCQlpZiAoU19JU0RJUihtb2RlKSB8fCBTX0lTRElSTE5LKG1vZGUpKSB7CisJCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfRElSOworCQkJbW9kZSA9IChtb2RlIHwgMDc3NykgJiB+dGFyX3VtYXNrOworCQl9IGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIHsKKwkJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19MTks7CisJCQltb2RlIHw9IDA3Nzc7CisJCX0gZWxzZSBpZiAoU19JU1JFRyhtb2RlKSkgeworCQkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX1JFRzsKKwkJCW1vZGUgPSAobW9kZSB8ICgobW9kZSAmIDAxMDApID8gMDc3NyA6IDA2NjYpKSAmIH50YXJfdW1hc2s7CisJCX0gZWxzZSB7CisJCQllcnJvcigidW5zdXBwb3J0ZWQgZmlsZSBtb2RlOiAwJW8gKFNIQTE6ICVzKSIsCisJCQkgICAgICBtb2RlLCBzaGExX3RvX2hleChzaGExKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBhdGgtPmxlbiA+IHNpemVvZihoZWFkZXIubmFtZSkpIHsKKwkJCWludCBwbGVuID0gZ2V0X3BhdGhfcHJlZml4KHBhdGgsIHNpemVvZihoZWFkZXIucHJlZml4KSk7CisJCQlpbnQgcmVzdCA9IHBhdGgtPmxlbiAtIHBsZW4gLSAxOworCQkJaWYgKHBsZW4gPiAwICYmIHJlc3QgPD0gc2l6ZW9mKGhlYWRlci5uYW1lKSkgeworCQkJCW1lbWNweShoZWFkZXIucHJlZml4LCBwYXRoLT5idWYsIHBsZW4pOworCQkJCW1lbWNweShoZWFkZXIubmFtZSwgcGF0aC0+YnVmICsgcGxlbiArIDEsIHJlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKGhlYWRlci5uYW1lLCAiJXMuZGF0YSIsCisJCQkJICAgICAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQkJc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKCZleHRfaGVhZGVyLCAicGF0aCIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgtPmJ1ZiwgcGF0aC0+bGVuKTsKKwkJCX0KKwkJfSBlbHNlCisJCQltZW1jcHkoaGVhZGVyLm5hbWUsIHBhdGgtPmJ1ZiwgcGF0aC0+bGVuKTsKKwl9CisKKwlpZiAoU19JU0xOSyhtb2RlKSAmJiBidWZmZXIpIHsKKwkJaWYgKHNpemUgPiBzaXplb2YoaGVhZGVyLmxpbmtuYW1lKSkgeworCQkJc3ByaW50ZihoZWFkZXIubGlua25hbWUsICJzZWUgJXMucGF4aGVhZGVyIiwKKwkJCSAgICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCQkJc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKCZleHRfaGVhZGVyLCAibGlua3BhdGgiLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSk7CisJCX0gZWxzZQorCQkJbWVtY3B5KGhlYWRlci5saW5rbmFtZSwgYnVmZmVyLCBzaXplKTsKKwl9CisKKwlzcHJpbnRmKGhlYWRlci5tb2RlLCAiJTA3byIsIG1vZGUgJiAwNzc3Nyk7CisJc3ByaW50ZihoZWFkZXIuc2l6ZSwgIiUwMTFsbyIsIFNfSVNSRUcobW9kZSkgPyBzaXplIDogMCk7CisJc3ByaW50ZihoZWFkZXIubXRpbWUsICIlMDExbG8iLCBhcmNoaXZlX3RpbWUpOworCisJc3ByaW50ZihoZWFkZXIudWlkLCAiJTA3byIsIDApOworCXNwcmludGYoaGVhZGVyLmdpZCwgIiUwN28iLCAwKTsKKwlzdHJsY3B5KGhlYWRlci51bmFtZSwgInJvb3QiLCBzaXplb2YoaGVhZGVyLnVuYW1lKSk7CisJc3RybGNweShoZWFkZXIuZ25hbWUsICJyb290Iiwgc2l6ZW9mKGhlYWRlci5nbmFtZSkpOworCXNwcmludGYoaGVhZGVyLmRldm1ham9yLCAiJTA3byIsIDApOworCXNwcmludGYoaGVhZGVyLmRldm1pbm9yLCAiJTA3byIsIDApOworCisJbWVtY3B5KGhlYWRlci5tYWdpYywgInVzdGFyIiwgNik7CisJbWVtY3B5KGhlYWRlci52ZXJzaW9uLCAiMDAiLCAyKTsKKworCXNwcmludGYoaGVhZGVyLmNoa3N1bSwgIiUwN28iLCB1c3Rhcl9oZWFkZXJfY2hrc3VtKCZoZWFkZXIpKTsKKworCWlmIChleHRfaGVhZGVyLmxlbiA+IDApIHsKKwkJd3JpdGVfZW50cnkoc2hhMSwgTlVMTCwgMCwgZXh0X2hlYWRlci5idWYsIGV4dF9oZWFkZXIubGVuKTsKKwkJZnJlZShleHRfaGVhZGVyLmJ1Zik7CisJfQorCXdyaXRlX2Jsb2NrZWQoJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCWlmIChTX0lTUkVHKG1vZGUpICYmIGJ1ZmZlciAmJiBzaXplID4gMCkKKwkJd3JpdGVfYmxvY2tlZChidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9nbG9iYWxfZXh0ZW5kZWRfaGVhZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHN0cmJ1ZiBleHRfaGVhZGVyOworCWV4dF9oZWFkZXIuYnVmID0gTlVMTDsKKwlleHRfaGVhZGVyLmxlbiA9IGV4dF9oZWFkZXIuYWxsb2MgPSAwOworCXN0cmJ1Zl9hcHBlbmRfZXh0X2hlYWRlcigmZXh0X2hlYWRlciwgImNvbW1lbnQiLCBzaGExX3RvX2hleChzaGExKSwgNDApOworCXdyaXRlX2VudHJ5KE5VTEwsIE5VTEwsIDAsIGV4dF9oZWFkZXIuYnVmLCBleHRfaGVhZGVyLmxlbik7CisJZnJlZShleHRfaGVhZGVyLmJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3Rhcl9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJ0YXIudW1hc2siKSkgeworCQlpZiAoIXN0cmNtcCh2YWx1ZSwgInVzZXIiKSkgeworCQkJdGFyX3VtYXNrID0gdW1hc2soMCk7CisJCQl1bWFzayh0YXJfdW1hc2spOworCQl9IGVsc2UgeworCQkJdGFyX3VtYXNrID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdGFyX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJc3RhdGljIHN0cnVjdCBzdHJidWYgcGF0aDsKKwlpbnQgZmlsZW5hbWVsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCXZvaWQgKmJ1ZmZlcjsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKCFwYXRoLmFsbG9jKSB7CisJCXBhdGguYnVmID0geG1hbGxvYyhQQVRIX01BWCk7CisJCXBhdGguYWxsb2MgPSBQQVRIX01BWDsKKwkJcGF0aC5sZW4gPSBwYXRoLmVvZiA9IDA7CisJfQorCWlmIChwYXRoLmFsbG9jIDwgYmFzZWxlbiArIGZpbGVuYW1lbGVuICsgMSkgeworCQlmcmVlKHBhdGguYnVmKTsKKwkJcGF0aC5idWYgPSB4bWFsbG9jKGJhc2VsZW4gKyBmaWxlbmFtZWxlbiArIDEpOworCQlwYXRoLmFsbG9jID0gYmFzZWxlbiArIGZpbGVuYW1lbGVuICsgMTsKKwl9CisJbWVtY3B5KHBhdGguYnVmLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkocGF0aC5idWYgKyBiYXNlbGVuLCBmaWxlbmFtZSwgZmlsZW5hbWVsZW4pOworCXBhdGgubGVuID0gYmFzZWxlbiArIGZpbGVuYW1lbGVuOworCXBhdGguYnVmW3BhdGgubGVuXSA9ICdcMCc7CisJaWYgKFNfSVNESVIobW9kZSkgfHwgU19JU0RJUkxOSyhtb2RlKSkgeworCQlzdHJidWZfYXBwZW5kX3N0cmluZygmcGF0aCwgIi8iKTsKKwkJYnVmZmVyID0gTlVMTDsKKwkJc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJYnVmZmVyID0gY29udmVydF9zaGExX2ZpbGUocGF0aC5idWYsIHNoYTEsIG1vZGUsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghYnVmZmVyKQorCQkJZGllKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwl3cml0ZV9lbnRyeShzaGExLCAmcGF0aCwgbW9kZSwgYnVmZmVyLCBzaXplKTsKKwlmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gUkVBRF9UUkVFX1JFQ1VSU0lWRTsKK30KKworaW50IHdyaXRlX3Rhcl9hcmNoaXZlKHN0cnVjdCBhcmNoaXZlcl9hcmdzICphcmdzKQoreworCWludCBwbGVuID0gYXJncy0+YmFzZSA/IHN0cmxlbihhcmdzLT5iYXNlKSA6IDA7CisKKwlnaXRfY29uZmlnKGdpdF90YXJfY29uZmlnKTsKKworCWFyY2hpdmVfdGltZSA9IGFyZ3MtPnRpbWU7CisJdmVyYm9zZSA9IGFyZ3MtPnZlcmJvc2U7CisKKwlpZiAoYXJncy0+Y29tbWl0X3NoYTEpCisJCXdyaXRlX2dsb2JhbF9leHRlbmRlZF9oZWFkZXIoYXJncy0+Y29tbWl0X3NoYTEpOworCisJaWYgKGFyZ3MtPmJhc2UgJiYgcGxlbiA+IDAgJiYgYXJncy0+YmFzZVtwbGVuIC0gMV0gPT0gJy8nKSB7CisJCWNoYXIgKmJhc2UgPSB4c3RyZHVwKGFyZ3MtPmJhc2UpOworCQlpbnQgYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKworCQl3aGlsZSAoYmFzZWxlbiA+IDAgJiYgYmFzZVtiYXNlbGVuIC0gMV0gPT0gJy8nKQorCQkJYmFzZVstLWJhc2VsZW5dID0gJ1wwJzsKKwkJd3JpdGVfdGFyX2VudHJ5KGFyZ3MtPnRyZWUtPm9iamVjdC5zaGExLCAiIiwgMCwgYmFzZSwgMDQwNzc3LCAwKTsKKwkJZnJlZShiYXNlKTsKKwl9CisJcmVhZF90cmVlX3JlY3Vyc2l2ZShhcmdzLT50cmVlLCBhcmdzLT5iYXNlLCBwbGVuLCAwLAorCQkJICAgIGFyZ3MtPnBhdGhzcGVjLCB3cml0ZV90YXJfZW50cnkpOworCXdyaXRlX3RyYWlsZXIoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS16aXAuYyBiL2FyY2hpdmUtemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiZjZiYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmUtemlwLmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUmVuZSBTY2hhcmZlCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IHppcF9kYXRlOworc3RhdGljIGludCB6aXBfdGltZTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnppcF9kaXI7CitzdGF0aWMgdW5zaWduZWQgaW50IHppcF9kaXJfc2l6ZTsKKworc3RhdGljIHVuc2lnbmVkIGludCB6aXBfb2Zmc2V0Oworc3RhdGljIHVuc2lnbmVkIGludCB6aXBfZGlyX29mZnNldDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemlwX2Rpcl9lbnRyaWVzOworCisjZGVmaW5lIFpJUF9ESVJFQ1RPUllfTUlOX1NJWkUJKDEwMjQgKiAxMDI0KQorCitzdHJ1Y3QgemlwX2xvY2FsX2hlYWRlciB7CisJdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb25bMl07CisJdW5zaWduZWQgY2hhciBmbGFnc1syXTsKKwl1bnNpZ25lZCBjaGFyIGNvbXByZXNzaW9uX21ldGhvZFsyXTsKKwl1bnNpZ25lZCBjaGFyIG10aW1lWzJdOworCXVuc2lnbmVkIGNoYXIgbWRhdGVbMl07CisJdW5zaWduZWQgY2hhciBjcmMzMls0XTsKKwl1bnNpZ25lZCBjaGFyIGNvbXByZXNzZWRfc2l6ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIHNpemVbNF07CisJdW5zaWduZWQgY2hhciBmaWxlbmFtZV9sZW5ndGhbMl07CisJdW5zaWduZWQgY2hhciBleHRyYV9sZW5ndGhbMl07CisJdW5zaWduZWQgY2hhciBfZW5kWzFdOworfTsKKworc3RydWN0IHppcF9kaXJfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOworCXVuc2lnbmVkIGNoYXIgY3JlYXRvcl92ZXJzaW9uWzJdOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvblsyXTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzWzJdOworCXVuc2lnbmVkIGNoYXIgY29tcHJlc3Npb25fbWV0aG9kWzJdOworCXVuc2lnbmVkIGNoYXIgbXRpbWVbMl07CisJdW5zaWduZWQgY2hhciBtZGF0ZVsyXTsKKwl1bnNpZ25lZCBjaGFyIGNyYzMyWzRdOworCXVuc2lnbmVkIGNoYXIgY29tcHJlc3NlZF9zaXplWzRdOworCXVuc2lnbmVkIGNoYXIgc2l6ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIGZpbGVuYW1lX2xlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyIGV4dHJhX2xlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyIGNvbW1lbnRfbGVuZ3RoWzJdOworCXVuc2lnbmVkIGNoYXIgZGlza1syXTsKKwl1bnNpZ25lZCBjaGFyIGF0dHIxWzJdOworCXVuc2lnbmVkIGNoYXIgYXR0cjJbNF07CisJdW5zaWduZWQgY2hhciBvZmZzZXRbNF07CisJdW5zaWduZWQgY2hhciBfZW5kWzFdOworfTsKKworc3RydWN0IHppcF9kaXJfdHJhaWxlciB7CisJdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKKwl1bnNpZ25lZCBjaGFyIGRpc2tbMl07CisJdW5zaWduZWQgY2hhciBkaXJlY3Rvcnlfc3RhcnRfZGlza1syXTsKKwl1bnNpZ25lZCBjaGFyIGVudHJpZXNfb25fdGhpc19kaXNrWzJdOworCXVuc2lnbmVkIGNoYXIgZW50cmllc1syXTsKKwl1bnNpZ25lZCBjaGFyIHNpemVbNF07CisJdW5zaWduZWQgY2hhciBvZmZzZXRbNF07CisJdW5zaWduZWQgY2hhciBjb21tZW50X2xlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyIF9lbmRbMV07Cit9OworCisvKgorICogT24gQVJNLCBwYWRkaW5nIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCwgc28gYSBzaW1wbGUKKyAqIHNpemVvZihzdHJ1Y3QgLi4uKSByZXBvcnRzIHR3byBieXRlcyBtb3JlIHRoYW4gdGhlIHBheWxvYWQgc2l6ZQorICogd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAqLworI2RlZmluZSBaSVBfTE9DQUxfSEVBREVSX1NJWkUJb2Zmc2V0b2Yoc3RydWN0IHppcF9sb2NhbF9oZWFkZXIsIF9lbmQpCisjZGVmaW5lIFpJUF9ESVJfSEVBREVSX1NJWkUJb2Zmc2V0b2Yoc3RydWN0IHppcF9kaXJfaGVhZGVyLCBfZW5kKQorI2RlZmluZSBaSVBfRElSX1RSQUlMRVJfU0laRQlvZmZzZXRvZihzdHJ1Y3QgemlwX2Rpcl90cmFpbGVyLCBfZW5kKQorCitzdGF0aWMgdm9pZCBjb3B5X2xlMTYodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IG4pCit7CisJZGVzdFswXSA9IDB4ZmYgJiBuOworCWRlc3RbMV0gPSAweGZmICYgKG4gPj4gMDEwKTsKK30KKworc3RhdGljIHZvaWQgY29weV9sZTMyKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGludCBuKQoreworCWRlc3RbMF0gPSAweGZmICYgbjsKKwlkZXN0WzFdID0gMHhmZiAmIChuID4+IDAxMCk7CisJZGVzdFsyXSA9IDB4ZmYgJiAobiA+PiAwMjApOworCWRlc3RbM10gPSAweGZmICYgKG4gPj4gMDMwKTsKK30KKworc3RhdGljIHZvaWQgKnpsaWJfZGVmbGF0ZSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbXByZXNzZWRfc2l6ZSkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgbG9uZyBtYXhzaXplOworCXZvaWQgKmJ1ZmZlcjsKKwlpbnQgcmVzdWx0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwltYXhzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCWJ1ZmZlciA9IHhtYWxsb2MobWF4c2l6ZSk7CisKKwlzdHJlYW0ubmV4dF9pbiA9IGRhdGE7CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWZmZXI7CisJc3RyZWFtLmF2YWlsX291dCA9IG1heHNpemU7CisKKwlkbyB7CisJCXJlc3VsdCA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCX0gd2hpbGUgKHJlc3VsdCA9PSBaX09LKTsKKworCWlmIChyZXN1bHQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwkqY29tcHJlc3NlZF9zaXplID0gc3RyZWFtLnRvdGFsX291dDsKKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBjaGFyICpjb25zdHJ1Y3RfcGF0aChjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGlzZGlyLCBpbnQgKnBhdGhsZW4pCit7CisJaW50IGZpbGVuYW1lbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlpbnQgbGVuID0gYmFzZWxlbiArIGZpbGVuYW1lbGVuOworCWNoYXIgKnBhdGgsICpwOworCisJaWYgKGlzZGlyKQorCQlsZW4rKzsKKwlwID0gcGF0aCA9IHhtYWxsb2MobGVuICsgMSk7CisKKwltZW1jcHkocCwgYmFzZSwgYmFzZWxlbik7CisJcCArPSBiYXNlbGVuOworCW1lbWNweShwLCBmaWxlbmFtZSwgZmlsZW5hbWVsZW4pOworCXAgKz0gZmlsZW5hbWVsZW47CisJaWYgKGlzZGlyKQorCQkqcCsrID0gJy8nOworCSpwID0gJ1wwJzsKKworCSpwYXRobGVuID0gbGVuOworCisJcmV0dXJuIHBhdGg7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfemlwX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJc3RydWN0IHppcF9sb2NhbF9oZWFkZXIgaGVhZGVyOworCXN0cnVjdCB6aXBfZGlyX2hlYWRlciBkaXJlbnQ7CisJdW5zaWduZWQgbG9uZyBhdHRyMjsKKwl1bnNpZ25lZCBsb25nIGNvbXByZXNzZWRfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVuY29tcHJlc3NlZF9zaXplOworCXVuc2lnbmVkIGxvbmcgY3JjOworCXVuc2lnbmVkIGxvbmcgZGlyZW50c2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IG1ldGhvZDsKKwlpbnQgcmVzdWx0ID0gLTE7CisJaW50IHBhdGhsZW47CisJdW5zaWduZWQgY2hhciAqb3V0OworCWNoYXIgKnBhdGg7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZmZlciA9IE5VTEw7CisJdm9pZCAqZGVmbGF0ZWQgPSBOVUxMOworCisJY3JjID0gY3JjMzIoMCwgTlVMTCwgMCk7CisKKwlwYXRoID0gY29uc3RydWN0X3BhdGgoYmFzZSwgYmFzZWxlbiwgZmlsZW5hbWUsIFNfSVNESVIobW9kZSksICZwYXRobGVuKTsKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgcGF0aCk7CisJaWYgKHBhdGhsZW4gPiAweGZmZmYpIHsKKwkJZXJyb3IoInBhdGggdG9vIGxvbmcgKCVkIGNoYXJzLCBTSEExOiAlcyk6ICVzIiwgcGF0aGxlbiwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSksIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU19JU0RJUihtb2RlKSB8fCBTX0lTRElSTE5LKG1vZGUpKSB7CisJCW1ldGhvZCA9IDA7CisJCWF0dHIyID0gMTY7CisJCXJlc3VsdCA9IChTX0lTRElSKG1vZGUpID8gUkVBRF9UUkVFX1JFQ1VSU0lWRSA6IDApOworCQlvdXQgPSBOVUxMOworCQl1bmNvbXByZXNzZWRfc2l6ZSA9IDA7CisJCWNvbXByZXNzZWRfc2l6ZSA9IDA7CisJfSBlbHNlIGlmIChTX0lTUkVHKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpIHsKKwkJbWV0aG9kID0gMDsKKwkJYXR0cjIgPSBTX0lTTE5LKG1vZGUpID8gKChtb2RlIHwgMDc3NykgPDwgMTYpIDogMDsKKwkJaWYgKFNfSVNSRUcobW9kZSkgJiYgemxpYl9jb21wcmVzc2lvbl9sZXZlbCAhPSAwKQorCQkJbWV0aG9kID0gODsKKwkJcmVzdWx0ID0gMDsKKwkJYnVmZmVyID0gY29udmVydF9zaGExX2ZpbGUocGF0aCwgc2hhMSwgbW9kZSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFidWZmZXIpCisJCQlkaWUoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQljcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgc2l6ZSk7CisJCW91dCA9IGJ1ZmZlcjsKKwkJdW5jb21wcmVzc2VkX3NpemUgPSBzaXplOworCQljb21wcmVzc2VkX3NpemUgPSBzaXplOworCX0gZWxzZSB7CisJCWVycm9yKCJ1bnN1cHBvcnRlZCBmaWxlIG1vZGU6IDAlbyAoU0hBMTogJXMpIiwgbW9kZSwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobWV0aG9kID09IDgpIHsKKwkJZGVmbGF0ZWQgPSB6bGliX2RlZmxhdGUoYnVmZmVyLCBzaXplLCAmY29tcHJlc3NlZF9zaXplKTsKKwkJaWYgKGRlZmxhdGVkICYmIGNvbXByZXNzZWRfc2l6ZSAtIDYgPCBzaXplKSB7CisJCQkvKiBaTElCIC0tPiByYXcgY29tcHJlc3NlZCBkYXRhIChzZWUgUkZDIDE5NTApICovCisJCQkvKiBDTUYgYW5kIEZMRyAuLi4gKi8KKwkJCW91dCA9ICh1bnNpZ25lZCBjaGFyICopZGVmbGF0ZWQgKyAyOworCQkJY29tcHJlc3NlZF9zaXplIC09IDY7CS8qIC4uLiBhbmQgQURMRVIzMiAqLworCQl9IGVsc2UgeworCQkJbWV0aG9kID0gMDsKKwkJCWNvbXByZXNzZWRfc2l6ZSA9IHNpemU7CisJCX0KKwl9CisKKwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSBpbiB0aGUgZGljdGlvbmFyeSAqLworCWRpcmVudHNpemUgPSBaSVBfRElSX0hFQURFUl9TSVpFICsgcGF0aGxlbjsKKwl3aGlsZSAoemlwX2Rpcl9zaXplIDwgemlwX2Rpcl9vZmZzZXQgKyBkaXJlbnRzaXplKSB7CisJCXppcF9kaXJfc2l6ZSArPSBaSVBfRElSRUNUT1JZX01JTl9TSVpFOworCQl6aXBfZGlyID0geHJlYWxsb2MoemlwX2RpciwgemlwX2Rpcl9zaXplKTsKKwl9CisKKwljb3B5X2xlMzIoZGlyZW50Lm1hZ2ljLCAweDAyMDE0YjUwKTsKKwljb3B5X2xlMTYoZGlyZW50LmNyZWF0b3JfdmVyc2lvbiwgU19JU0xOSyhtb2RlKSA/IDB4MDMxNyA6IDApOworCWNvcHlfbGUxNihkaXJlbnQudmVyc2lvbiwgMTApOworCWNvcHlfbGUxNihkaXJlbnQuZmxhZ3MsIDApOworCWNvcHlfbGUxNihkaXJlbnQuY29tcHJlc3Npb25fbWV0aG9kLCBtZXRob2QpOworCWNvcHlfbGUxNihkaXJlbnQubXRpbWUsIHppcF90aW1lKTsKKwljb3B5X2xlMTYoZGlyZW50Lm1kYXRlLCB6aXBfZGF0ZSk7CisJY29weV9sZTMyKGRpcmVudC5jcmMzMiwgY3JjKTsKKwljb3B5X2xlMzIoZGlyZW50LmNvbXByZXNzZWRfc2l6ZSwgY29tcHJlc3NlZF9zaXplKTsKKwljb3B5X2xlMzIoZGlyZW50LnNpemUsIHVuY29tcHJlc3NlZF9zaXplKTsKKwljb3B5X2xlMTYoZGlyZW50LmZpbGVuYW1lX2xlbmd0aCwgcGF0aGxlbik7CisJY29weV9sZTE2KGRpcmVudC5leHRyYV9sZW5ndGgsIDApOworCWNvcHlfbGUxNihkaXJlbnQuY29tbWVudF9sZW5ndGgsIDApOworCWNvcHlfbGUxNihkaXJlbnQuZGlzaywgMCk7CisJY29weV9sZTE2KGRpcmVudC5hdHRyMSwgMCk7CisJY29weV9sZTMyKGRpcmVudC5hdHRyMiwgYXR0cjIpOworCWNvcHlfbGUzMihkaXJlbnQub2Zmc2V0LCB6aXBfb2Zmc2V0KTsKKwltZW1jcHkoemlwX2RpciArIHppcF9kaXJfb2Zmc2V0LCAmZGlyZW50LCBaSVBfRElSX0hFQURFUl9TSVpFKTsKKwl6aXBfZGlyX29mZnNldCArPSBaSVBfRElSX0hFQURFUl9TSVpFOworCW1lbWNweSh6aXBfZGlyICsgemlwX2Rpcl9vZmZzZXQsIHBhdGgsIHBhdGhsZW4pOworCXppcF9kaXJfb2Zmc2V0ICs9IHBhdGhsZW47CisJemlwX2Rpcl9lbnRyaWVzKys7CisKKwljb3B5X2xlMzIoaGVhZGVyLm1hZ2ljLCAweDA0MDM0YjUwKTsKKwljb3B5X2xlMTYoaGVhZGVyLnZlcnNpb24sIDEwKTsKKwljb3B5X2xlMTYoaGVhZGVyLmZsYWdzLCAwKTsKKwljb3B5X2xlMTYoaGVhZGVyLmNvbXByZXNzaW9uX21ldGhvZCwgbWV0aG9kKTsKKwljb3B5X2xlMTYoaGVhZGVyLm10aW1lLCB6aXBfdGltZSk7CisJY29weV9sZTE2KGhlYWRlci5tZGF0ZSwgemlwX2RhdGUpOworCWNvcHlfbGUzMihoZWFkZXIuY3JjMzIsIGNyYyk7CisJY29weV9sZTMyKGhlYWRlci5jb21wcmVzc2VkX3NpemUsIGNvbXByZXNzZWRfc2l6ZSk7CisJY29weV9sZTMyKGhlYWRlci5zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisJY29weV9sZTE2KGhlYWRlci5maWxlbmFtZV9sZW5ndGgsIHBhdGhsZW4pOworCWNvcHlfbGUxNihoZWFkZXIuZXh0cmFfbGVuZ3RoLCAwKTsKKwl3cml0ZV9vcl9kaWUoMSwgJmhlYWRlciwgWklQX0xPQ0FMX0hFQURFUl9TSVpFKTsKKwl6aXBfb2Zmc2V0ICs9IFpJUF9MT0NBTF9IRUFERVJfU0laRTsKKwl3cml0ZV9vcl9kaWUoMSwgcGF0aCwgcGF0aGxlbik7CisJemlwX29mZnNldCArPSBwYXRobGVuOworCWlmIChjb21wcmVzc2VkX3NpemUgPiAwKSB7CisJCXdyaXRlX29yX2RpZSgxLCBvdXQsIGNvbXByZXNzZWRfc2l6ZSk7CisJCXppcF9vZmZzZXQgKz0gY29tcHJlc3NlZF9zaXplOworCX0KKworb3V0OgorCWZyZWUoYnVmZmVyKTsKKwlmcmVlKGRlZmxhdGVkKTsKKwlmcmVlKHBhdGgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfemlwX3RyYWlsZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgemlwX2Rpcl90cmFpbGVyIHRyYWlsZXI7CisKKwljb3B5X2xlMzIodHJhaWxlci5tYWdpYywgMHgwNjA1NGI1MCk7CisJY29weV9sZTE2KHRyYWlsZXIuZGlzaywgMCk7CisJY29weV9sZTE2KHRyYWlsZXIuZGlyZWN0b3J5X3N0YXJ0X2Rpc2ssIDApOworCWNvcHlfbGUxNih0cmFpbGVyLmVudHJpZXNfb25fdGhpc19kaXNrLCB6aXBfZGlyX2VudHJpZXMpOworCWNvcHlfbGUxNih0cmFpbGVyLmVudHJpZXMsIHppcF9kaXJfZW50cmllcyk7CisJY29weV9sZTMyKHRyYWlsZXIuc2l6ZSwgemlwX2Rpcl9vZmZzZXQpOworCWNvcHlfbGUzMih0cmFpbGVyLm9mZnNldCwgemlwX29mZnNldCk7CisJY29weV9sZTE2KHRyYWlsZXIuY29tbWVudF9sZW5ndGgsIHNoYTEgPyA0MCA6IDApOworCisJd3JpdGVfb3JfZGllKDEsIHppcF9kaXIsIHppcF9kaXJfb2Zmc2V0KTsKKwl3cml0ZV9vcl9kaWUoMSwgJnRyYWlsZXIsIFpJUF9ESVJfVFJBSUxFUl9TSVpFKTsKKwlpZiAoc2hhMSkKKwkJd3JpdGVfb3JfZGllKDEsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvc190aW1lKHRpbWVfdCAqdGltZSwgaW50ICpkb3NfZGF0ZSwgaW50ICpkb3NfdGltZSkKK3sKKwlzdHJ1Y3QgdG0gKnQgPSBsb2NhbHRpbWUodGltZSk7CisKKwkqZG9zX2RhdGUgPSB0LT50bV9tZGF5ICsgKHQtPnRtX21vbiArIDEpICogMzIgKworCSAgICAgICAgICAgICh0LT50bV95ZWFyICsgMTkwMCAtIDE5ODApICogNTEyOworCSpkb3NfdGltZSA9IHQtPnRtX3NlYyAvIDIgKyB0LT50bV9taW4gKiAzMiArIHQtPnRtX2hvdXIgKiAyMDQ4OworfQorCitpbnQgd3JpdGVfemlwX2FyY2hpdmUoc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyZ3MpCit7CisJaW50IHBsZW4gPSBzdHJsZW4oYXJncy0+YmFzZSk7CisKKwlkb3NfdGltZSgmYXJncy0+dGltZSwgJnppcF9kYXRlLCAmemlwX3RpbWUpOworCisJemlwX2RpciA9IHhtYWxsb2MoWklQX0RJUkVDVE9SWV9NSU5fU0laRSk7CisJemlwX2Rpcl9zaXplID0gWklQX0RJUkVDVE9SWV9NSU5fU0laRTsKKwl2ZXJib3NlID0gYXJncy0+dmVyYm9zZTsKKworCWlmIChhcmdzLT5iYXNlICYmIHBsZW4gPiAwICYmIGFyZ3MtPmJhc2VbcGxlbiAtIDFdID09ICcvJykgeworCQljaGFyICpiYXNlID0geHN0cmR1cChhcmdzLT5iYXNlKTsKKwkJaW50IGJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisKKwkJd2hpbGUgKGJhc2VsZW4gPiAwICYmIGJhc2VbYmFzZWxlbiAtIDFdID09ICcvJykKKwkJCWJhc2VbLS1iYXNlbGVuXSA9ICdcMCc7CisJCXdyaXRlX3ppcF9lbnRyeShhcmdzLT50cmVlLT5vYmplY3Quc2hhMSwgIiIsIDAsIGJhc2UsIDA0MDc3NywgMCk7CisJCWZyZWUoYmFzZSk7CisJfQorCXJlYWRfdHJlZV9yZWN1cnNpdmUoYXJncy0+dHJlZSwgYXJncy0+YmFzZSwgcGxlbiwgMCwKKwkJCSAgICBhcmdzLT5wYXRoc3BlYywgd3JpdGVfemlwX2VudHJ5KTsKKwl3cml0ZV96aXBfdHJhaWxlcihhcmdzLT5jb21taXRfc2hhMSk7CisKKwlmcmVlKHppcF9kaXIpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKnBhcnNlX2V4dHJhX3ppcF9hcmdzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlmb3IgKDsgYXJnYyA+IDA7IGFyZ2MtLSwgYXJndisrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMF07CisKKwkJaWYgKGFyZ1swXSA9PSAnLScgJiYgaXNkaWdpdChhcmdbMV0pICYmIGFyZ1syXSA9PSAnXDAnKQorCQkJemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IGFyZ1sxXSAtICcwJzsKKwkJZWxzZQorCQkJZGllKCJVbmtub3duIGFyZ3VtZW50IGZvciB6aXAgZm9ybWF0OiAlcyIsIGFyZyk7CisJfQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS5oIGIvYXJjaGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzhkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZlLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBBUkNISVZFX0gKKyNkZWZpbmUgQVJDSElWRV9ICisKKyNkZWZpbmUgTUFYX0VYVFJBX0FSR1MJMzIKKyNkZWZpbmUgTUFYX0FSR1MJKE1BWF9FWFRSQV9BUkdTICsgMzIpCisKK3N0cnVjdCBhcmNoaXZlcl9hcmdzIHsKKwljb25zdCBjaGFyICpiYXNlOworCXN0cnVjdCB0cmVlICp0cmVlOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbW1pdF9zaGExOworCXRpbWVfdCB0aW1lOworCWNvbnN0IGNoYXIgKipwYXRoc3BlYzsKKwl1bnNpZ25lZCBpbnQgdmVyYm9zZSA6IDE7CisJdm9pZCAqZXh0cmE7Cit9OworCit0eXBlZGVmIGludCAoKndyaXRlX2FyY2hpdmVfZm5fdCkoc3RydWN0IGFyY2hpdmVyX2FyZ3MgKik7CisKK3R5cGVkZWYgdm9pZCAqKCpwYXJzZV9leHRyYV9hcmdzX2ZuX3QpKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CisKK3N0cnVjdCBhcmNoaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYXJjaGl2ZXJfYXJncyBhcmdzOworCXdyaXRlX2FyY2hpdmVfZm5fdCB3cml0ZV9hcmNoaXZlOworCXBhcnNlX2V4dHJhX2FyZ3NfZm5fdCBwYXJzZV9leHRyYTsKK307CisKK2V4dGVybiBpbnQgcGFyc2VfYXJjaGl2ZV9hcmdzKGludCBhcmdjLAorCQkJICAgICAgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgICBzdHJ1Y3QgYXJjaGl2ZXIgKmFyKTsKKworZXh0ZXJuIHZvaWQgcGFyc2VfdHJlZWlzaF9hcmcoY29uc3QgY2hhciAqKnRyZWVpc2gsCisJCQkgICAgICBzdHJ1Y3QgYXJjaGl2ZXJfYXJncyAqYXJfYXJncywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKK2V4dGVybiB2b2lkIHBhcnNlX3BhdGhzcGVjX2FyZyhjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCQkgICAgICAgc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyZ3MpOworLyoKKyAqIEFyY2hpdmUtZm9ybWF0IHNwZWNpZmljIGJhY2tlbmRzLgorICovCitleHRlcm4gaW50IHdyaXRlX3Rhcl9hcmNoaXZlKHN0cnVjdCBhcmNoaXZlcl9hcmdzICopOworZXh0ZXJuIGludCB3cml0ZV96aXBfYXJjaGl2ZShzdHJ1Y3QgYXJjaGl2ZXJfYXJncyAqKTsKK2V4dGVybiB2b2lkICpwYXJzZV9leHRyYV96aXBfYXJncyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworCisjZW5kaWYJLyogQVJDSElWRV9IICovCmRpZmYgLS1naXQgYS9hcm0vc2hhMS5jIGIvYXJtL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIxYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTEuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogQ3JlYXRlZDogICAgIFNlcHRlbWJlciAxNywgMjAwNQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzaGExLmgiCisKK2V4dGVybiB2b2lkIHNoYV90cmFuc2Zvcm0odWludDMyX3QgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90ICpXKTsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqYykKK3sKKwljLT5sZW4gPSAwOworCWMtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWMtPmhhc2hbMV0gPSAweGVmY2RhYjg5OworCWMtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWMtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWMtPmhhc2hbNF0gPSAweGMzZDJlMWYwOworfQorCit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1aW50MzJfdCB3b3Jrc3BhY2VbODBdOworCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgZG9uZTsKKworCXBhcnRpYWwgPSBjLT5sZW4gJiAweDNmOworCWMtPmxlbiArPSBuOworCWlmICgocGFydGlhbCArIG4pID49IDY0KSB7CisJCWlmIChwYXJ0aWFsKSB7CisJCQlkb25lID0gNjQgLSBwYXJ0aWFsOworCQkJbWVtY3B5KGMtPmJ1ZmZlciArIHBhcnRpYWwsIHAsIGRvbmUpOworCQkJc2hhX3RyYW5zZm9ybShjLT5oYXNoLCBjLT5idWZmZXIsIHdvcmtzcGFjZSk7CisJCQlwYXJ0aWFsID0gMDsKKwkJfSBlbHNlCisJCQlkb25lID0gMDsKKwkJd2hpbGUgKG4gPj0gZG9uZSArIDY0KSB7CisJCQlzaGFfdHJhbnNmb3JtKGMtPmhhc2gsIHAgKyBkb25lLCB3b3Jrc3BhY2UpOworCQkJZG9uZSArPSA2NDsKKwkJfQorCX0gZWxzZQorCQlkb25lID0gMDsKKwlpZiAobiAtIGRvbmUpCisJCW1lbWNweShjLT5idWZmZXIgKyBwYXJ0aWFsLCBwICsgZG9uZSwgbiAtIGRvbmUpOworfQorCit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqaGFzaCwgU0hBX0NUWCAqYykKK3sKKwl1aW50NjRfdCBiaXRsZW47CisJdWludDMyX3QgYml0bGVuX2hpLCBiaXRsZW5fbG87IAorCXVuc2lnbmVkIGludCBpLCBvZmZzZXQsIHBhZGxlbjsKKwl1bnNpZ25lZCBjaGFyIGJpdHNbOF07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGFkZGluZ1s2NF0gPSB7IDB4ODAsIH07CisKKwliaXRsZW4gPSBjLT5sZW4gPDwgMzsKKwlvZmZzZXQgPSBjLT5sZW4gJiAweDNmOworCXBhZGxlbiA9ICgob2Zmc2V0IDwgNTYpID8gNTYgOiAoNjQgKyA1NikpIC0gb2Zmc2V0OworCVNIQTFfVXBkYXRlKGMsIHBhZGRpbmcsIHBhZGxlbik7CisKKwliaXRsZW5faGkgPSBiaXRsZW4gPj4gMzI7CisJYml0bGVuX2xvID0gYml0bGVuICYgMHhmZmZmZmZmZjsKKwliaXRzWzBdID0gYml0bGVuX2hpID4+IDI0OworCWJpdHNbMV0gPSBiaXRsZW5faGkgPj4gMTY7CisJYml0c1syXSA9IGJpdGxlbl9oaSA+PiA4OworCWJpdHNbM10gPSBiaXRsZW5faGk7CisJYml0c1s0XSA9IGJpdGxlbl9sbyA+PiAyNDsKKwliaXRzWzVdID0gYml0bGVuX2xvID4+IDE2OworCWJpdHNbNl0gPSBiaXRsZW5fbG8gPj4gODsKKwliaXRzWzddID0gYml0bGVuX2xvOworCVNIQTFfVXBkYXRlKGMsIGJpdHMsIDgpOyAKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdWludDMyX3QgdiA9IGMtPmhhc2hbaV07CisJCWhhc2hbMF0gPSB2ID4+IDI0OworCQloYXNoWzFdID0gdiA+PiAxNjsKKwkJaGFzaFsyXSA9IHYgPj4gODsKKwkJaGFzaFszXSA9IHY7CisJCWhhc2ggKz0gNDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcm0vc2hhMS5oIGIvYXJtL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUyNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTEuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiBDb3B5cmlnaHQ6CShDKSAyMDA1IGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqIENyZWF0ZWQ6CVNlcHRlbWJlciAxNywgMjAwNQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc2hhX2NvbnRleHQgeworCXVpbnQ2NF90IGxlbjsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsKK30gU0hBX0NUWDsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqYyk7Cit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7Cit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqaGFzaCwgU0hBX0NUWCAqYyk7CmRpZmYgLS1naXQgYS9hcm0vc2hhMV9hcm0uUyBiL2FybS9zaGExX2FybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjhiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcm0vc2hhMV9hcm0uUwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICBTSEEgdHJhbnNmb3JtIG9wdGltaXplZCBmb3IgQVJNCisgKgorICogIENvcHlyaWdodDoJKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogIENyZWF0ZWQ6CVNlcHRlbWJlciAxNywgMjAwNQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCS50ZXh0CisJLmdsb2JsCXNoYV90cmFuc2Zvcm0KKworLyoKKyAqIHZvaWQgc2hhX3RyYW5zZm9ybSh1aW50MzJfdCAqaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdWludDMyX3QgKlcpOworICoKKyAqIG5vdGU6IHRoZSAiZGF0YSIgcG9pbnRlciBtYXkgYmUgdW5hbGlnbmVkLgorICovCisKK3NoYV90cmFuc2Zvcm06CisKKwlzdG1mZAlzcCEsIHtyNCAtIHI4LCBscn0KKworCUAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJQCAgICAgICAgIFdbaV0gPSBudG9obCgoKHVpbnQzMl90ICopZGF0YSlbaV0pOworCisjaWZkZWYgX19BUk1FQl9fCisJbW92CXI0LCByMAorCW1vdglyMCwgcjIKKwltb3YJcjIsICM2NAorCWJsCW1lbWNweQorCW1vdglyMiwgcjAKKwltb3YJcjAsIHI0CisjZWxzZQorCW1vdglyMywgcjIKKwltb3YJbHIsICMxNgorMToJbGRyYglyNCwgW3IxXSwgIzEKKwlsZHJiCXI1LCBbcjFdLCAjMQorCWxkcmIJcjYsIFtyMV0sICMxCisJbGRyYglyNywgW3IxXSwgIzEKKwlzdWJzCWxyLCBsciwgIzEKKwlvcnIJcjUsIHI1LCByNCwgbHNsICM4CisJb3JyCXI2LCByNiwgcjUsIGxzbCAjOAorCW9ycglyNywgcjcsIHI2LCBsc2wgIzgKKwlzdHIJcjcsIFtyM10sICM0CisJYm5lCTFiCisjZW5kaWYKKworCUAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJQCAgICAgICAgIFdbaSsxNl0gPSByb3IoV1tpKzEzXSBeIFdbaSs4XSBeIFdbaSsyXSBeIFdbaV0sIDMxKTsKKworCXN1YglyMywgcjIsICM0CisJbW92CWxyLCAjNjQKKzI6CWxkcglyNCwgW3IzLCAjNF0hCisJc3VicwlsciwgbHIsICMxCisJbGRyCXI1LCBbcjMsICM4XQorCWxkcglyNiwgW3IzLCAjMzJdCisJbGRyCXI3LCBbcjMsICM1Ml0KKwllb3IJcjQsIHI0LCByNQorCWVvcglyNCwgcjQsIHI2CisJZW9yCXI0LCByNCwgcjcKKwltb3YJcjQsIHI0LCByb3IgIzMxCisJc3RyCXI0LCBbcjMsICM2NF0KKwlibmUJMmIKKworCS8qCisJICogVGhlIFNIQSBmdW5jdGlvbnMgYXJlOgorCSAqCisJICogZjEoQixDLEQpID0gKEQgXiAoQiAmIChDIF4gRCkpKQorCSAqIGYyKEIsQyxEKSA9IChCIF4gQyBeIEQpCisJICogZjMoQixDLEQpID0gKChCICYgQykgfCAoRCAmIChCIHwgQykpKQorCSAqCisJICogVGhlbiB0aGUgc3ViLWJsb2NrcyBhcmUgcHJvY2Vzc2VkIGFzIGZvbGxvd3M6CisJICoKKwkgKiBBJyA9IHJvcihBLCAyNykgKyBmKEIsQyxEKSArIEUgKyBLICsgKlcrKworCSAqIEInID0gQQorCSAqIEMnID0gcm9yKEIsIDIpCisJICogRCcgPSBDCisJICogRScgPSBECisJICoKKwkgKiBXZSB0aGVyZWZvcmUgdW5yb2xsIGVhY2ggbG9vcCA1IHRpbWVzIHRvIGF2b2lkIHJlZ2lzdGVyIHNodWZmbGluZy4KKwkgKiBBbHNvIHRoZSByb3IgZm9yIEMgKGFuZCBhbHNvIEQgYW5kIEUgd2hpY2ggYXJlIHN1Y2Nlc3NpdmVseWRlcml2ZWQKKwkgKiBmcm9tIGl0KSBpcyBhcHBsaWVkIGluIHBsYWNlIHRvIGN1dCBvbiBhbiBhZGRpdGlvbmFsIG1vdiBpbnNuIGZvcgorCSAqIGVhY2ggcm91bmQuCisJICovCisKKwkubWFjcm8Jc2hhX2YxLCBBLCBCLCBDLCBELCBFCisJbGRyCXIzLCBbcjJdLCAjNAorCWVvcglpcCwgXEMsIFxECisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCWFuZAlpcCwgXEIsIGlwLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWVvcglpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCS5tYWNybwlzaGFfZjIsIEEsIEIsIEMsIEQsIEUKKwlsZHIJcjMsIFtyMl0sICM0CisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCWVvcglpcCwgXEIsIFxDLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWVvcglpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCS5tYWNybwlzaGFfZjMsIEEsIEIsIEMsIEQsIEUKKwlsZHIJcjMsIFtyMl0sICM0CisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCW9ycglpcCwgXEIsIFxDLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWFuZAlpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFuZAlyMywgXEIsIFxDLCByb3IgIzIKKwlvcnIJaXAsIGlwLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCWxkbWlhCXIwLCB7cjQgLSByOH0KKworCW1vdglsciwgIzQKKwlsZHIJcjEsIC5MX3NoYV9LICsgMAorCisJLyogYWRqdXN0IGluaXRpYWwgdmFsdWVzICovCisJbW92CXI2LCByNiwgcm9yICMzMAorCW1vdglyNywgcjcsIHJvciAjMzAKKwltb3YJcjgsIHI4LCByb3IgIzMwCisKKzM6CXN1YnMJbHIsIGxyLCAjMQorCXNoYV9mMQlyNCwgcjUsIHI2LCByNywgcjgKKwlzaGFfZjEJcjgsIHI0LCByNSwgcjYsIHI3CisJc2hhX2YxCXI3LCByOCwgcjQsIHI1LCByNgorCXNoYV9mMQlyNiwgcjcsIHI4LCByNCwgcjUKKwlzaGFfZjEJcjUsIHI2LCByNywgcjgsIHI0CisJYm5lCTNiCisKKwlsZHIJcjEsIC5MX3NoYV9LICsgNAorCW1vdglsciwgIzQKKworNDoJc3VicwlsciwgbHIsICMxCisJc2hhX2YyCXI0LCByNSwgcjYsIHI3LCByOAorCXNoYV9mMglyOCwgcjQsIHI1LCByNiwgcjcKKwlzaGFfZjIJcjcsIHI4LCByNCwgcjUsIHI2CisJc2hhX2YyCXI2LCByNywgcjgsIHI0LCByNQorCXNoYV9mMglyNSwgcjYsIHI3LCByOCwgcjQKKwlibmUJNGIKKworCWxkcglyMSwgLkxfc2hhX0sgKyA4CisJbW92CWxyLCAjNAorCis1OglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjMJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YzCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMwlyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjMJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YzCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQk1YgorCisJbGRyCXIxLCAuTF9zaGFfSyArIDEyCisJbW92CWxyLCAjNAorCis2OglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjIJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YyCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMglyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjIJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YyCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQk2YgorCisJbGRtaWEJcjAsIHtyMSwgcjIsIHIzLCBpcCwgbHJ9CisJYWRkCXI0LCByMSwgcjQKKwlhZGQJcjUsIHIyLCByNQorCWFkZAlyNiwgcjMsIHI2LCByb3IgIzIKKwlhZGQJcjcsIGlwLCByNywgcm9yICMyCisJYWRkCXI4LCBsciwgcjgsIHJvciAjMgorCXN0bWlhCXIwLCB7cjQgLSByOH0KKworCWxkbWZkCXNwISwge3I0IC0gcjgsIHBjfQorCisuTF9zaGFfSzoKKwkud29yZAkweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2CisKZGlmZiAtLWdpdCBhL2F0dHIuYyBiL2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcxMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXR0ci5jCkBAIC0wLDAgKzEsNTY1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisKK2NvbnN0IGNoYXIgZ2l0X2F0dHJfX3RydWVbXSA9ICIoYnVpbHRpbil0cnVlIjsKK2NvbnN0IGNoYXIgZ2l0X2F0dHJfX2ZhbHNlW10gPSAiXDAoYnVpbHRpbilmYWxzZSI7CitzdGF0aWMgY29uc3QgY2hhciBnaXRfYXR0cl9fdW5rbm93bltdID0gIihidWlsdGluKXVua25vd24iOworI2RlZmluZSBBVFRSX19UUlVFIGdpdF9hdHRyX190cnVlCisjZGVmaW5lIEFUVFJfX0ZBTFNFIGdpdF9hdHRyX19mYWxzZQorI2RlZmluZSBBVFRSX19VTlNFVCBOVUxMCisjZGVmaW5lIEFUVFJfX1VOS05PV04gZ2l0X2F0dHJfX3Vua25vd24KKworLyoKKyAqIFRoZSBiYXNpYyBkZXNpZ24gZGVjaXNpb24gaGVyZSBpcyB0aGF0IHdlIGFyZSBub3QgZ29pbmcgdG8gaGF2ZQorICogaW5zYW5lbHkgbGFyZ2UgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuCisgKgorICogVGhpcyBpcyBhIHJhbmRvbWx5IGNob3NlbiBwcmltZS4KKyAqLworI2RlZmluZSBIQVNIU0laRSAyNTcKKworI2lmbmRlZiBERUJVR19BVFRSCisjZGVmaW5lIERFQlVHX0FUVFIgMAorI2VuZGlmCisKK3N0cnVjdCBnaXRfYXR0ciB7CisJc3RydWN0IGdpdF9hdHRyICpuZXh0OworCXVuc2lnbmVkIGg7CisJaW50IGF0dHJfbnI7CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfTsKK3N0YXRpYyBpbnQgYXR0cl9ucjsKKworc3RhdGljIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2tfYWxsX2F0dHI7CitzdGF0aWMgc3RydWN0IGdpdF9hdHRyICooZ2l0X2F0dHJfaGFzaFtIQVNIU0laRV0pOworCitzdGF0aWMgdW5zaWduZWQgaGFzaF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXVuc2lnbmVkIHZhbCA9IDA7CisJdW5zaWduZWQgY2hhciBjOworCisJd2hpbGUgKG5hbWVsZW4tLSkgeworCQljID0gKm5hbWUrKzsKKwkJdmFsID0gKCh2YWwgPDwgNykgfCAodmFsID4+IDIyKSkgXiBjOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGludmFsaWRfYXR0cl9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCS8qCisJICogQXR0cmlidXRlIG5hbWUgY2Fubm90IGJlZ2luIHdpdGggJy0nIGFuZCBmcm9tCisJICogWy1BLVphLXowLTlfLl0uICBXZSdkIHNwZWNpZmljYWxseSBleGNsdWRlICc9JyBmb3Igbm93LAorCSAqIGFzIHdlIG1pZ2h0IGxhdGVyIHdhbnQgdG8gYWxsb3cgbm9uLWJpbmFyeSB2YWx1ZSBmb3IKKwkgKiBhdHRyaWJ1dGVzLCBlLmcuICIqLnN2ZwltZXJnZT1zcGVjaWFsLW1lcmdlLXByb2dyYW0tZm9yLXN2ZyIKKwkgKi8KKwlpZiAoKm5hbWUgPT0gJy0nKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKG5hbWVsZW4tLSkgeworCQljaGFyIGNoID0gKm5hbWUrKzsKKwkJaWYgKCEgKGNoID09ICctJyB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJ18nIHx8CisJCSAgICAgICAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwKKwkJICAgICAgICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fAorCQkgICAgICAgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpKSApCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ2l0X2F0dHIgKmdpdF9hdHRyKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJdW5zaWduZWQgaHZhbCA9IGhhc2hfbmFtZShuYW1lLCBsZW4pOworCXVuc2lnbmVkIHBvcyA9IGh2YWwgJSBIQVNIU0laRTsKKwlzdHJ1Y3QgZ2l0X2F0dHIgKmE7CisKKwlmb3IgKGEgPSBnaXRfYXR0cl9oYXNoW3Bvc107IGE7IGEgPSBhLT5uZXh0KSB7CisJCWlmIChhLT5oID09IGh2YWwgJiYKKwkJICAgICFtZW1jbXAoYS0+bmFtZSwgbmFtZSwgbGVuKSAmJiAhYS0+bmFtZVtsZW5dKQorCQkJcmV0dXJuIGE7CisJfQorCisJaWYgKGludmFsaWRfYXR0cl9uYW1lKG5hbWUsIGxlbikpCisJCXJldHVybiBOVUxMOworCisJYSA9IHhtYWxsb2Moc2l6ZW9mKCphKSArIGxlbiArIDEpOworCW1lbWNweShhLT5uYW1lLCBuYW1lLCBsZW4pOworCWEtPm5hbWVbbGVuXSA9IDA7CisJYS0+aCA9IGh2YWw7CisJYS0+bmV4dCA9IGdpdF9hdHRyX2hhc2hbcG9zXTsKKwlhLT5hdHRyX25yID0gYXR0cl9ucisrOworCWdpdF9hdHRyX2hhc2hbcG9zXSA9IGE7CisKKwljaGVja19hbGxfYXR0ciA9IHhyZWFsbG9jKGNoZWNrX2FsbF9hdHRyLAorCQkJCSAgc2l6ZW9mKCpjaGVja19hbGxfYXR0cikgKiBhdHRyX25yKTsKKwljaGVja19hbGxfYXR0clthLT5hdHRyX25yXS5hdHRyID0gYTsKKwljaGVja19hbGxfYXR0clthLT5hdHRyX25yXS52YWx1ZSA9IEFUVFJfX1VOS05PV047CisJcmV0dXJuIGE7Cit9CisKKy8qCisgKiAuZ2l0YXR0cmlidXRlcyBmaWxlIGlzIG9uZSBsaW5lIHBlciByZWNvcmQsIGVhY2ggb2Ygd2hpY2ggaXMKKyAqCisgKiAoMSkgZ2xvYiBwYXR0ZXJuLgorICogKDIpIHdoaXRlc3BhY2UKKyAqICgzKSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZSBuYW1lcywgZWFjaCBvZiB3aGljaAorICogICAgIGNvdWxkIGJlIHByZWZpeGVkIHdpdGggJy0nIHRvIG1lYW4gInNldCB0byBmYWxzZSIsICchJyB0byBtZWFuCisgKiAgICAgInVuc2V0Ii4KKyAqLworCisvKiBXaGF0IGRvZXMgYSBtYXRjaGVkIHBhdHRlcm4gZGVjaWRlPyAqLworc3RydWN0IGF0dHJfc3RhdGUgeworCXN0cnVjdCBnaXRfYXR0ciAqYXR0cjsKKwljb25zdCBjaGFyICpzZXR0bzsKK307CisKK3N0cnVjdCBtYXRjaF9hdHRyIHsKKwl1bmlvbiB7CisJCWNoYXIgKnBhdHRlcm47CisJCXN0cnVjdCBnaXRfYXR0ciAqYXR0cjsKKwl9IHU7CisJY2hhciBpc19tYWNybzsKKwl1bnNpZ25lZCBudW1fYXR0cjsKKwlzdHJ1Y3QgYXR0cl9zdGF0ZSBzdGF0ZVtGTEVYX0FSUkFZXTsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGJsYW5rW10gPSAiIFx0XHJcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9hdHRyKGNvbnN0IGNoYXIgKnNyYywgaW50IGxpbmVubywgY29uc3QgY2hhciAqY3AsCisJCQkgICAgICBpbnQgKm51bV9hdHRyLCBzdHJ1Y3QgbWF0Y2hfYXR0ciAqcmVzKQoreworCWNvbnN0IGNoYXIgKmVwLCAqZXF1YWxzOworCWludCBsZW47CisKKwllcCA9IGNwICsgc3RyY3NwbihjcCwgYmxhbmspOworCWVxdWFscyA9IHN0cmNocihjcCwgJz0nKTsKKwlpZiAoZXF1YWxzICYmIGVwIDwgZXF1YWxzKQorCQllcXVhbHMgPSBOVUxMOworCWlmIChlcXVhbHMpCisJCWxlbiA9IGVxdWFscyAtIGNwOworCWVsc2UKKwkJbGVuID0gZXAgLSBjcDsKKwlpZiAoIXJlcykgeworCQlpZiAoKmNwID09ICctJyB8fCAqY3AgPT0gJyEnKSB7CisJCQljcCsrOworCQkJbGVuLS07CisJCX0KKwkJaWYgKGludmFsaWRfYXR0cl9uYW1lKGNwLCBsZW4pKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJS4qcyBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUgbmFtZTogJXM6JWRcbiIsCisJCQkJbGVuLCBjcCwgc3JjLCBsaW5lbm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgYXR0cl9zdGF0ZSAqZTsKKworCQllID0gJihyZXMtPnN0YXRlWypudW1fYXR0cl0pOworCQlpZiAoKmNwID09ICctJyB8fCAqY3AgPT0gJyEnKSB7CisJCQllLT5zZXR0byA9ICgqY3AgPT0gJy0nKSA/IEFUVFJfX0ZBTFNFIDogQVRUUl9fVU5TRVQ7CisJCQljcCsrOworCQkJbGVuLS07CisJCX0KKwkJZWxzZSBpZiAoIWVxdWFscykKKwkJCWUtPnNldHRvID0gQVRUUl9fVFJVRTsKKwkJZWxzZSB7CisJCQljaGFyICp2YWx1ZTsKKwkJCWludCB2YWxsZW4gPSBlcCAtIGVxdWFsczsKKwkJCXZhbHVlID0geG1hbGxvYyh2YWxsZW4pOworCQkJbWVtY3B5KHZhbHVlLCBlcXVhbHMrMSwgdmFsbGVuLTEpOworCQkJdmFsdWVbdmFsbGVuLTFdID0gMDsKKwkJCWUtPnNldHRvID0gdmFsdWU7CisJCX0KKwkJZS0+YXR0ciA9IGdpdF9hdHRyKGNwLCBsZW4pOworCX0KKwkoKm51bV9hdHRyKSsrOworCXJldHVybiBlcCArIHN0cnNwbihlcCwgYmxhbmspOworfQorCitzdGF0aWMgc3RydWN0IG1hdGNoX2F0dHIgKnBhcnNlX2F0dHJfbGluZShjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpzcmMsCisJCQkJCSAgaW50IGxpbmVubywgaW50IG1hY3JvX29rKQoreworCWludCBuYW1lbGVuOworCWludCBudW1fYXR0cjsKKwljb25zdCBjaGFyICpjcCwgKm5hbWU7CisJc3RydWN0IG1hdGNoX2F0dHIgKnJlcyA9IE5VTEw7CisJaW50IHBhc3M7CisJaW50IGlzX21hY3JvOworCisJY3AgPSBsaW5lICsgc3Ryc3BuKGxpbmUsIGJsYW5rKTsKKwlpZiAoISpjcCB8fCAqY3AgPT0gJyMnKQorCQlyZXR1cm4gTlVMTDsKKwluYW1lID0gY3A7CisJbmFtZWxlbiA9IHN0cmNzcG4obmFtZSwgYmxhbmspOworCWlmIChzdHJsZW4oQVRUUklCVVRFX01BQ1JPX1BSRUZJWCkgPCBuYW1lbGVuICYmCisJICAgICFwcmVmaXhjbXAobmFtZSwgQVRUUklCVVRFX01BQ1JPX1BSRUZJWCkpIHsKKwkJaWYgKCFtYWNyb19vaykgeworCQkJZnByaW50ZihzdGRlcnIsICIlcyBub3QgYWxsb3dlZDogJXM6JWRcbiIsCisJCQkJbmFtZSwgc3JjLCBsaW5lbm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaXNfbWFjcm8gPSAxOworCQluYW1lICs9IHN0cmxlbihBVFRSSUJVVEVfTUFDUk9fUFJFRklYKTsKKwkJbmFtZSArPSBzdHJzcG4obmFtZSwgYmxhbmspOworCQluYW1lbGVuID0gc3RyY3NwbihuYW1lLCBibGFuayk7CisJCWlmIChpbnZhbGlkX2F0dHJfbmFtZShuYW1lLCBuYW1lbGVuKSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiUuKnMgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIG5hbWU6ICVzOiVkXG4iLAorCQkJCW5hbWVsZW4sIG5hbWUsIHNyYywgbGluZW5vKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwkJaXNfbWFjcm8gPSAwOworCisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQkvKiBwYXNzIDAgY291bnRzIGFuZCBhbGxvY2F0ZXMsIHBhc3MgMSBmaWxscyAqLworCQludW1fYXR0ciA9IDA7CisJCWNwID0gbmFtZSArIG5hbWVsZW47CisJCWNwID0gY3AgKyBzdHJzcG4oY3AsIGJsYW5rKTsKKwkJd2hpbGUgKCpjcCkKKwkJCWNwID0gcGFyc2VfYXR0cihzcmMsIGxpbmVubywgY3AsICZudW1fYXR0ciwgcmVzKTsKKwkJaWYgKHBhc3MpCisJCQlicmVhazsKKwkJcmVzID0geGNhbGxvYygxLAorCQkJICAgICAgc2l6ZW9mKCpyZXMpICsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYXR0cl9zdGF0ZSkgKiBudW1fYXR0ciArCisJCQkgICAgICAoaXNfbWFjcm8gPyAwIDogbmFtZWxlbiArIDEpKTsKKwkJaWYgKGlzX21hY3JvKQorCQkJcmVzLT51LmF0dHIgPSBnaXRfYXR0cihuYW1lLCBuYW1lbGVuKTsKKwkJZWxzZSB7CisJCQlyZXMtPnUucGF0dGVybiA9IChjaGFyKikmKHJlcy0+c3RhdGVbbnVtX2F0dHJdKTsKKwkJCW1lbWNweShyZXMtPnUucGF0dGVybiwgbmFtZSwgbmFtZWxlbik7CisJCQlyZXMtPnUucGF0dGVybltuYW1lbGVuXSA9IDA7CisJCX0KKwkJcmVzLT5pc19tYWNybyA9IGlzX21hY3JvOworCQlyZXMtPm51bV9hdHRyID0gbnVtX2F0dHI7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBMaWtlIGluZm8vZXhjbHVkZSBhbmQgLmdpdGlnbm9yZSwgdGhlIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBjYW4KKyAqIGNvbWUgZnJvbSBtYW55IHBsYWNlcy4KKyAqCisgKiAoMSkgLmdpdGF0dHJpYnV0ZSBmaWxlIG9mIHRoZSBzYW1lIGRpcmVjdG9yeTsKKyAqICgyKSAuZ2l0YXR0cmlidXRlIGZpbGUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgaWYgKDEpIGRvZXMgbm90IGhhdmUKKyAqICAgICAgYW55IG1hdGNoOyB0aGlzIGdvZXMgcmVjdXJzaXZlbHkgdXB3YXJkcywganVzdCBsaWtlIC5naXRpZ25vcmUuCisgKiAoMykgJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzLCB3aGljaCBvdmVycmlkZXMgYm90aCBvZiB0aGUgYWJvdmUuCisgKgorICogSW4gdGhlIHNhbWUgZmlsZSwgbGF0ZXIgZW50cmllcyBvdmVycmlkZSB0aGUgZWFybGllciBtYXRjaCwgc28gaW4gdGhlCisgKiBnbG9iYWwgbGlzdCwgd2Ugd291bGQgaGF2ZSBlbnRyaWVzIGZyb20gaW5mby9hdHRyaWJ1dGVzIHRoZSBlYXJsaWVzdAorICogKHJlYWRpbmcgdGhlIGZpbGUgZnJvbSB0b3AgdG8gYm90dG9tKSwgLmdpdGF0dHJpYnV0ZSBvZiB0aGUgcm9vdAorICogZGlyZWN0b3J5IChhZ2FpbiwgcmVhZGluZyB0aGUgZmlsZSBmcm9tIHRvcCB0byBib3R0b20pIGRvd24gdG8gdGhlCisgKiBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIHRoZW4gc2NhbiB0aGUgbGlzdCBiYWNrd2FyZHMgdG8gZmluZCB0aGUgZmlyc3QgbWF0Y2guCisgKiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2hhdCBleGNsdWRlZCgpIGRvZXMgaW4gZGlyLmMgdG8gZGVhbCB3aXRoCisgKiAuZ2l0aWdub3JlCisgKi8KKworc3RhdGljIHN0cnVjdCBhdHRyX3N0YWNrIHsKKwlzdHJ1Y3QgYXR0cl9zdGFjayAqcHJldjsKKwljaGFyICpvcmlnaW47CisJdW5zaWduZWQgbnVtX21hdGNoZXM7CisJc3RydWN0IG1hdGNoX2F0dHIgKiphdHRyczsKK30gKmF0dHJfc3RhY2s7CisKK3N0YXRpYyB2b2lkIGZyZWVfYXR0cl9lbGVtKHN0cnVjdCBhdHRyX3N0YWNrICplKQoreworCWludCBpOworCWZyZWUoZS0+b3JpZ2luKTsKKwlmb3IgKGkgPSAwOyBpIDwgZS0+bnVtX21hdGNoZXM7IGkrKykgeworCQlzdHJ1Y3QgbWF0Y2hfYXR0ciAqYSA9IGUtPmF0dHJzW2ldOworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IGEtPm51bV9hdHRyOyBqKyspIHsKKwkJCWNvbnN0IGNoYXIgKnNldHRvID0gYS0+c3RhdGVbal0uc2V0dG87CisJCQlpZiAoc2V0dG8gPT0gQVRUUl9fVFJVRSB8fAorCQkJICAgIHNldHRvID09IEFUVFJfX0ZBTFNFIHx8CisJCQkgICAgc2V0dG8gPT0gQVRUUl9fVU5TRVQgfHwKKwkJCSAgICBzZXR0byA9PSBBVFRSX19VTktOT1dOKQorCQkJCTsKKwkJCWVsc2UKKwkJCQlmcmVlKChjaGFyKikgc2V0dG8pOworCQl9CisJCWZyZWUoYSk7CisJfQorCWZyZWUoZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpidWlsdGluX2F0dHJbXSA9IHsKKwkiW2F0dHJdYmluYXJ5IC1kaWZmIC1jcmxmIiwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyX3N0YWNrICpyZWFkX2F0dHJfZnJvbV9hcnJheShjb25zdCBjaGFyICoqbGlzdCkKK3sKKwlzdHJ1Y3QgYXR0cl9zdGFjayAqcmVzOworCWNvbnN0IGNoYXIgKmxpbmU7CisJaW50IGxpbmVubyA9IDA7CisKKwlyZXMgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVzKSk7CisJd2hpbGUgKChsaW5lID0gKihsaXN0KyspKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBtYXRjaF9hdHRyICphOworCisJCWEgPSBwYXJzZV9hdHRyX2xpbmUobGluZSwgIltidWlsdGluXSIsICsrbGluZW5vLCAxKTsKKwkJaWYgKCFhKQorCQkJY29udGludWU7CisJCXJlcy0+YXR0cnMgPSB4cmVhbGxvYyhyZXMtPmF0dHJzLAorCQkJc2l6ZW9mKHN0cnVjdCBtYXRjaF9hdHRyICopICogKHJlcy0+bnVtX21hdGNoZXMgKyAxKSk7CisJCXJlcy0+YXR0cnNbcmVzLT5udW1fbWF0Y2hlcysrXSA9IGE7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cl9zdGFjayAqcmVhZF9hdHRyX2Zyb21fZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgbWFjcm9fb2spCit7CisJRklMRSAqZnA7CisJc3RydWN0IGF0dHJfc3RhY2sgKnJlczsKKwljaGFyIGJ1ZlsyMDQ4XTsKKwlpbnQgbGluZW5vID0gMDsKKworCXJlcyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZXMpKTsKKwlmcCA9IGZvcGVuKHBhdGgsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIHJlczsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJc3RydWN0IG1hdGNoX2F0dHIgKmE7CisKKwkJYSA9IHBhcnNlX2F0dHJfbGluZShidWYsIHBhdGgsICsrbGluZW5vLCBtYWNyb19vayk7CisJCWlmICghYSkKKwkJCWNvbnRpbnVlOworCQlyZXMtPmF0dHJzID0geHJlYWxsb2MocmVzLT5hdHRycywKKwkJCXNpemVvZihzdHJ1Y3QgbWF0Y2hfYXR0ciAqKSAqIChyZXMtPm51bV9tYXRjaGVzICsgMSkpOworCQlyZXMtPmF0dHJzW3Jlcy0+bnVtX21hdGNoZXMrK10gPSBhOworCX0KKwlmY2xvc2UoZnApOworCXJldHVybiByZXM7Cit9CisKKyNpZiBERUJVR19BVFRSCitzdGF0aWMgdm9pZCBkZWJ1Z19pbmZvKGNvbnN0IGNoYXIgKndoYXQsIHN0cnVjdCBhdHRyX3N0YWNrICplbGVtKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCB3aGF0LCBlbGVtLT5vcmlnaW4gPyBlbGVtLT5vcmlnaW4gOiAiKCkiKTsKK30KK3N0YXRpYyB2b2lkIGRlYnVnX3NldChjb25zdCBjaGFyICp3aGF0LCBjb25zdCBjaGFyICptYXRjaCwgc3RydWN0IGdpdF9hdHRyICphdHRyLCB2b2lkICp2KQoreworCWNvbnN0IGNoYXIgKnZhbHVlID0gdjsKKworCWlmIChBVFRSX1RSVUUodmFsdWUpKQorCQl2YWx1ZSA9ICJzZXQiOworCWVsc2UgaWYgKEFUVFJfRkFMU0UodmFsdWUpKQorCQl2YWx1ZSA9ICJ1bnNldCI7CisJZWxzZSBpZiAoQVRUUl9VTlNFVCh2YWx1ZSkpCisJCXZhbHVlID0gInVuc3BlY2lmaWVkIjsKKworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzID0+ICVzICglcylcbiIsCisJCXdoYXQsIGF0dHItPm5hbWUsIChjaGFyICopIHZhbHVlLCBtYXRjaCk7Cit9CisjZGVmaW5lIGRlYnVnX3B1c2goYSkgZGVidWdfaW5mbygicHVzaCIsIChhKSkKKyNkZWZpbmUgZGVidWdfcG9wKGEpIGRlYnVnX2luZm8oInBvcCIsIChhKSkKKyNlbHNlCisjZGVmaW5lIGRlYnVnX3B1c2goYSkgZG8geyA7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3BvcChhKSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfc2V0KGEsYixjLGQpIGRvIHsgOyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9hdHRyX3N0YWNrKHZvaWQpCit7CisJaWYgKCFhdHRyX3N0YWNrKSB7CisJCXN0cnVjdCBhdHRyX3N0YWNrICplbGVtOworCisJCWVsZW0gPSByZWFkX2F0dHJfZnJvbV9hcnJheShidWlsdGluX2F0dHIpOworCQllbGVtLT5vcmlnaW4gPSBOVUxMOworCQllbGVtLT5wcmV2ID0gYXR0cl9zdGFjazsKKwkJYXR0cl9zdGFjayA9IGVsZW07CisKKwkJZWxlbSA9IHJlYWRfYXR0cl9mcm9tX2ZpbGUoR0lUQVRUUklCVVRFU19GSUxFLCAxKTsKKwkJZWxlbS0+b3JpZ2luID0gc3RyZHVwKCIiKTsKKwkJZWxlbS0+cHJldiA9IGF0dHJfc3RhY2s7CisJCWF0dHJfc3RhY2sgPSBlbGVtOworCQlkZWJ1Z19wdXNoKGVsZW0pOworCisJCWVsZW0gPSByZWFkX2F0dHJfZnJvbV9maWxlKGdpdF9wYXRoKElORk9BVFRSSUJVVEVTX0ZJTEUpLCAxKTsKKwkJZWxlbS0+b3JpZ2luID0gTlVMTDsKKwkJZWxlbS0+cHJldiA9IGF0dHJfc3RhY2s7CisJCWF0dHJfc3RhY2sgPSBlbGVtOworCX0KK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9hdHRyX3N0YWNrKGNvbnN0IGNoYXIgKnBhdGgsIGludCBkaXJsZW4pCit7CisJc3RydWN0IGF0dHJfc3RhY2sgKmVsZW0sICppbmZvOworCWludCBsZW47CisJY2hhciBwYXRoYnVmW1BBVEhfTUFYXTsKKworCS8qCisJICogQXQgdGhlIGJvdHRvbSBvZiB0aGUgYXR0cmlidXRlIHN0YWNrIGlzIHRoZSBidWlsdC1pbgorCSAqIHNldCBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuICBUaGVuLCBjb250ZW50cyBmcm9tCisJICogLmdpdGF0dHJpYnV0ZSBmaWxlcyBmcm9tIGRpcmVjdG9yaWVzIGNsb3NlciB0byB0aGUKKwkgKiByb290IHRvIHRoZSBvbmVzIGluIGRlZXBlciBkaXJlY3RvcmllcyBhcmUgcHVzaGVkCisJICogdG8gdGhlIHN0YWNrLiAgRmluYWxseSwgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBzdGFjaworCSAqIHdlIGFsd2F5cyBrZWVwIHRoZSBjb250ZW50cyBvZiAkR0lUX0RJUi9pbmZvL2F0dHJpYnV0ZXMuCisJICoKKwkgKiBXaGVuIGNoZWNraW5nLCB3ZSB1c2UgZW50cmllcyBmcm9tIG5lYXIgdGhlIHRvcCBvZiB0aGUKKwkgKiBzdGFjaywgcHJlZmVycmluZyAkR0lUX0RJUi9pbmZvL2F0dHJpYnV0ZXMsIHRoZW4KKwkgKiAuZ2l0YXR0cmlidXRlcyBpbiBkZWVwZXIgZGlyZWN0b3JpZXMgdG8gc2hhbGxvd2VyIG9uZXMsCisJICogYW5kIGZpbmFsbHkgdXNlIHRoZSBidWlsdC1pbiBzZXQgYXMgdGhlIGRlZmF1bHQuCisJICovCisJaWYgKCFhdHRyX3N0YWNrKQorCQlib290c3RyYXBfYXR0cl9zdGFjaygpOworCisJLyoKKwkgKiBQb3AgdGhlICJpbmZvIiBvbmUgdGhhdCBpcyBhbHdheXMgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisJICovCisJaW5mbyA9IGF0dHJfc3RhY2s7CisJYXR0cl9zdGFjayA9IGluZm8tPnByZXY7CisKKwkvKgorCSAqIFBvcCB0aGUgb25lcyBmcm9tIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCB0aGUgcHJlZml4IG9mCisJICogdGhlIHBhdGggd2UgYXJlIGNoZWNraW5nLgorCSAqLworCXdoaWxlIChhdHRyX3N0YWNrICYmIGF0dHJfc3RhY2stPm9yaWdpbikgeworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihhdHRyX3N0YWNrLT5vcmlnaW4pOworCisJCWVsZW0gPSBhdHRyX3N0YWNrOworCQlpZiAobmFtZWxlbiA8PSBkaXJsZW4gJiYKKwkJICAgICFzdHJuY21wKGVsZW0tPm9yaWdpbiwgcGF0aCwgbmFtZWxlbikpCisJCQlicmVhazsKKworCQlkZWJ1Z19wb3AoZWxlbSk7CisJCWF0dHJfc3RhY2sgPSBlbGVtLT5wcmV2OworCQlmcmVlX2F0dHJfZWxlbShlbGVtKTsKKwl9CisKKwkvKgorCSAqIFJlYWQgZnJvbSBwYXJlbnQgZGlyZWN0b3JpZXMgYW5kIHB1c2ggdGhlbSBkb3duCisJICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqY3A7CisKKwkJbGVuID0gc3RybGVuKGF0dHJfc3RhY2stPm9yaWdpbik7CisJCWlmIChkaXJsZW4gPD0gbGVuKQorCQkJYnJlYWs7CisJCW1lbWNweShwYXRoYnVmLCBwYXRoLCBkaXJsZW4pOworCQltZW1jcHkocGF0aGJ1ZiArIGRpcmxlbiwgIi8iLCAyKTsKKwkJY3AgPSBzdHJjaHIocGF0aGJ1ZiArIGxlbiArIDEsICcvJyk7CisJCXN0cmNweShjcCArIDEsIEdJVEFUVFJJQlVURVNfRklMRSk7CisJCWVsZW0gPSByZWFkX2F0dHJfZnJvbV9maWxlKHBhdGhidWYsIDApOworCQkqY3AgPSAnXDAnOworCQllbGVtLT5vcmlnaW4gPSBzdHJkdXAocGF0aGJ1Zik7CisJCWVsZW0tPnByZXYgPSBhdHRyX3N0YWNrOworCQlhdHRyX3N0YWNrID0gZWxlbTsKKwkJZGVidWdfcHVzaChlbGVtKTsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgcHVzaCB0aGUgImluZm8iIG9uZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKwkgKi8KKwlpbmZvLT5wcmV2ID0gYXR0cl9zdGFjazsKKwlhdHRyX3N0YWNrID0gaW5mbzsKK30KKworc3RhdGljIGludCBwYXRoX21hdGNoZXMoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBwYXRobGVuLAorCQkJY29uc3QgY2hhciAqcGF0dGVybiwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuKQoreworCWlmICghc3RyY2hyKHBhdHRlcm4sICcvJykpIHsKKwkJLyogbWF0Y2ggYmFzZW5hbWUgKi8KKwkJY29uc3QgY2hhciAqYmFzZW5hbWUgPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOworCQliYXNlbmFtZSA9IGJhc2VuYW1lID8gYmFzZW5hbWUgKyAxIDogcGF0aG5hbWU7CisJCXJldHVybiAoZm5tYXRjaChwYXR0ZXJuLCBiYXNlbmFtZSwgMCkgPT0gMCk7CisJfQorCS8qCisJICogbWF0Y2ggd2l0aCBGTk1fUEFUSE5BTUU7IHRoZSBwYXR0ZXJuIGhhcyBiYXNlIGltcGxpY2l0bHkKKwkgKiBpbiBmcm9udCBvZiBpdC4KKwkgKi8KKwlpZiAoKnBhdHRlcm4gPT0gJy8nKQorCQlwYXR0ZXJuKys7CisJaWYgKHBhdGhsZW4gPCBiYXNlbGVuIHx8CisJICAgIChiYXNlbGVuICYmIHBhdGhuYW1lW2Jhc2VsZW4gLSAxXSAhPSAnLycpIHx8CisJICAgIHN0cm5jbXAocGF0aG5hbWUsIGJhc2UsIGJhc2VsZW4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZm5tYXRjaChwYXR0ZXJuLCBwYXRobmFtZSArIGJhc2VsZW4sIEZOTV9QQVRITkFNRSkgPT0gMDsKK30KKworc3RhdGljIGludCBmaWxsX29uZShjb25zdCBjaGFyICp3aGF0LCBzdHJ1Y3QgbWF0Y2hfYXR0ciAqYSwgaW50IHJlbSkKK3sKKwlzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrID0gY2hlY2tfYWxsX2F0dHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAwIDwgcmVtICYmIGkgPCBhLT5udW1fYXR0cjsgaSsrKSB7CisJCXN0cnVjdCBnaXRfYXR0ciAqYXR0ciA9IGEtPnN0YXRlW2ldLmF0dHI7CisJCWNvbnN0IGNoYXIgKipuID0gJihjaGVja1thdHRyLT5hdHRyX25yXS52YWx1ZSk7CisJCWNvbnN0IGNoYXIgKnYgPSBhLT5zdGF0ZVtpXS5zZXR0bzsKKworCQlpZiAoKm4gPT0gQVRUUl9fVU5LTk9XTikgeworCQkJZGVidWdfc2V0KHdoYXQsIGEtPnUucGF0dGVybiwgYXR0ciwgdik7CisJCQkqbiA9IHY7CisJCQlyZW0tLTsKKwkJfQorCX0KKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IGZpbGwoY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4sIHN0cnVjdCBhdHRyX3N0YWNrICpzdGssIGludCByZW0pCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqYmFzZSA9IHN0ay0+b3JpZ2luID8gc3RrLT5vcmlnaW4gOiAiIjsKKworCWZvciAoaSA9IHN0ay0+bnVtX21hdGNoZXMgLSAxOyAwIDwgcmVtICYmIDAgPD0gaTsgaS0tKSB7CisJCXN0cnVjdCBtYXRjaF9hdHRyICphID0gc3RrLT5hdHRyc1tpXTsKKwkJaWYgKGEtPmlzX21hY3JvKQorCQkJY29udGludWU7CisJCWlmIChwYXRoX21hdGNoZXMocGF0aCwgcGF0aGxlbiwKKwkJCQkgYS0+dS5wYXR0ZXJuLCBiYXNlLCBzdHJsZW4oYmFzZSkpKQorCQkJcmVtID0gZmlsbF9vbmUoImZpbGwiLCBhLCByZW0pOworCX0KKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IG1hY3JvZXhwYW5kKHN0cnVjdCBhdHRyX3N0YWNrICpzdGssIGludCByZW0pCit7CisJaW50IGk7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjayA9IGNoZWNrX2FsbF9hdHRyOworCisJZm9yIChpID0gc3RrLT5udW1fbWF0Y2hlcyAtIDE7IDAgPCByZW0gJiYgMCA8PSBpOyBpLS0pIHsKKwkJc3RydWN0IG1hdGNoX2F0dHIgKmEgPSBzdGstPmF0dHJzW2ldOworCQlpZiAoIWEtPmlzX21hY3JvKQorCQkJY29udGludWU7CisJCWlmIChjaGVja1thLT51LmF0dHItPmF0dHJfbnJdLnZhbHVlICE9IEFUVFJfX1RSVUUpCisJCQljb250aW51ZTsKKwkJcmVtID0gZmlsbF9vbmUoImV4cGFuZCIsIGEsIHJlbSk7CisJfQorCXJldHVybiByZW07Cit9CisKK2ludCBnaXRfY2hlY2thdHRyKGNvbnN0IGNoYXIgKnBhdGgsIGludCBudW0sIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2spCit7CisJc3RydWN0IGF0dHJfc3RhY2sgKnN0azsKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgZGlybGVuLCBwYXRobGVuLCBpLCByZW07CisKKwlib290c3RyYXBfYXR0cl9zdGFjaygpOworCWZvciAoaSA9IDA7IGkgPCBhdHRyX25yOyBpKyspCisJCWNoZWNrX2FsbF9hdHRyW2ldLnZhbHVlID0gQVRUUl9fVU5LTk9XTjsKKworCXBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisJY3AgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisJaWYgKCFjcCkKKwkJZGlybGVuID0gMDsKKwllbHNlCisJCWRpcmxlbiA9IGNwIC0gcGF0aDsKKwlwcmVwYXJlX2F0dHJfc3RhY2socGF0aCwgZGlybGVuKTsKKwlyZW0gPSBhdHRyX25yOworCWZvciAoc3RrID0gYXR0cl9zdGFjazsgMCA8IHJlbSAmJiBzdGs7IHN0ayA9IHN0ay0+cHJldikKKwkJcmVtID0gZmlsbChwYXRoLCBwYXRobGVuLCBzdGssIHJlbSk7CisKKwlmb3IgKHN0ayA9IGF0dHJfc3RhY2s7IDAgPCByZW0gJiYgc3RrOyBzdGsgPSBzdGstPnByZXYpCisJCXJlbSA9IG1hY3JvZXhwYW5kKHN0aywgcmVtKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrX2FsbF9hdHRyW2NoZWNrW2ldLmF0dHItPmF0dHJfbnJdLnZhbHVlOworCQlpZiAodmFsdWUgPT0gQVRUUl9fVU5LTk9XTikKKwkJCXZhbHVlID0gQVRUUl9fVU5TRVQ7CisJCWNoZWNrW2ldLnZhbHVlID0gdmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hdHRyLmggYi9hdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjMjAzOAotLS0gL2Rldi9udWxsCisrKyBiL2F0dHIuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIEFUVFJfSAorI2RlZmluZSBBVFRSX0gKKworLyogQW4gYXR0cmlidXRlIGlzIGEgcG9pbnRlciB0byB0aGlzIG9wYXF1ZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBnaXRfYXR0cjsKKworLyoKKyAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm4gdGhlIGdpdGF0dHJpYnV0ZSBvYmplY3QgdGhhdAorICogY29ycmVzcG9uZHMgdG8gaXQuCisgKi8KK3N0cnVjdCBnaXRfYXR0ciAqZ2l0X2F0dHIoY29uc3QgY2hhciAqLCBpbnQpOworCisvKiBJbnRlcm5hbCB1c2UgKi8KK2V4dGVybiBjb25zdCBjaGFyIGdpdF9hdHRyX190cnVlW107CitleHRlcm4gY29uc3QgY2hhciBnaXRfYXR0cl9fZmFsc2VbXTsKKworLyogRm9yIHB1YmxpYyB0byBjaGVjayBnaXRfYXR0cl9jaGVjayByZXN1bHRzICovCisjZGVmaW5lIEFUVFJfVFJVRSh2KSAoKHYpID09IGdpdF9hdHRyX190cnVlKQorI2RlZmluZSBBVFRSX0ZBTFNFKHYpICgodikgPT0gZ2l0X2F0dHJfX2ZhbHNlKQorI2RlZmluZSBBVFRSX1VOU0VUKHYpICgodikgPT0gTlVMTCkKKworLyoKKyAqIFNlbmQgb25lIG9yIG1vcmUgZ2l0X2F0dHJfY2hlY2sgdG8gZ2l0X2NoZWNrYXR0cigpLCBhbmQKKyAqIGVhY2ggJ3ZhbHVlJyBtZW1iZXIgdGVsbHMgd2hhdCBpdHMgdmFsdWUgaXMuCisgKiBVbnNldCBvbmUgaXMgcmV0dXJuZWQgYXMgTlVMTC4KKyAqLworc3RydWN0IGdpdF9hdHRyX2NoZWNrIHsKKwlzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHI7CisJY29uc3QgY2hhciAqdmFsdWU7Cit9OworCitpbnQgZ2l0X2NoZWNrYXR0cihjb25zdCBjaGFyICpwYXRoLCBpbnQsIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqKTsKKworI2VuZGlmIC8qIEFUVFJfSCAqLwpkaWZmIC0tZ2l0IGEvYmFzZTg1LmMgYi9iYXNlODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODgyNzBmCi0tLSAvZGV2L251bGwKKysrIGIvYmFzZTg1LmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjdW5kZWYgREVCVUdfODUKKworI2lmZGVmIERFQlVHXzg1CisjZGVmaW5lIHNheShhKSBmcHJpbnRmKHN0ZGVyciwgYSkKKyNkZWZpbmUgc2F5MShhLGIpIGZwcmludGYoc3RkZXJyLCBhLCBiKQorI2RlZmluZSBzYXkyKGEsYixjKSBmcHJpbnRmKHN0ZGVyciwgYSwgYiwgYykKKyNlbHNlCisjZGVmaW5lIHNheShhKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBzYXkxKGEsYikgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgc2F5MihhLGIsYykgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBlbjg1W10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorCSdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywKKwknSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsCisJJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKKwknYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsCisJJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLAorCSd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCisJJyEnLCAnIycsICckJywgJyUnLCAnJicsICcoJywgJyknLCAnKicsICcrJywgJy0nLAorCSc7JywgJzwnLCAnPScsICc+JywgJz8nLCAnQCcsICdeJywgJ18nLAknYCcsICd7JywKKwknfCcsICd9JywgJ34nCit9OworCitzdGF0aWMgY2hhciBkZTg1WzI1Nl07CitzdGF0aWMgdm9pZCBwcmVwX2Jhc2U4NSh2b2lkKQoreworCWludCBpOworCWlmIChkZTg1WydaJ10pCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbjg1KTsgaSsrKSB7CisJCWludCBjaCA9IGVuODVbaV07CisJCWRlODVbY2hdID0gaSArIDE7CisJfQorfQorCitpbnQgZGVjb2RlXzg1KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCXByZXBfYmFzZTg1KCk7CisKKwlzYXkyKCJkZWNvZGUgODUgPCUuKnM+IiwgbGVuLzQqNSwgYnVmZmVyKTsKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGFjYyA9IDA7CisJCWludCBkZSwgY250ID0gNDsKKwkJdW5zaWduZWQgY2hhciBjaDsKKwkJZG8geworCQkJY2ggPSAqYnVmZmVyKys7CisJCQlkZSA9IGRlODVbY2hdOworCQkJaWYgKC0tZGUgPCAwKQorCQkJCXJldHVybiBlcnJvcigiaW52YWxpZCBiYXNlODUgYWxwaGFiZXQgJWMiLCBjaCk7CisJCQlhY2MgPSBhY2MgKiA4NSArIGRlOworCQl9IHdoaWxlICgtLWNudCk7CisJCWNoID0gKmJ1ZmZlcisrOworCQlkZSA9IGRlODVbY2hdOworCQlpZiAoLS1kZSA8IDApCisJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgYmFzZTg1IGFscGhhYmV0ICVjIiwgY2gpOworCQkvKgorCQkgKiBEZXRlY3Qgb3ZlcmZsb3cuICBUaGUgbGFyZ2VzdAorCQkgKiA1LWxldHRlciBwb3NzaWJsZSBpcyAifE5zQzAiIHRvCisJCSAqIGVuY29kZSAweGZmZmZmZmZmLCBhbmQgInxOc0MiIGdpdmVzCisJCSAqIDB4MDMwMzAzMDMgYXQgdGhpcyBwb2ludCAoaS5lLgorCQkgKiAweGZmZmZmZmZmID0gMHgwMzAzMDMwMyAqIDg1KS4KKwkJICovCisJCWlmICgweDAzMDMwMzAzIDwgYWNjIHx8CisJCSAgICAweGZmZmZmZmZmIC0gZGUgPCAoYWNjICo9IDg1KSkKKwkJCXJldHVybiBlcnJvcigiaW52YWxpZCBiYXNlODUgc2VxdWVuY2UgJS41cyIsIGJ1ZmZlci01KTsKKwkJYWNjICs9IGRlOworCQlzYXkxKCIgJTA4eCIsIGFjYyk7CisKKwkJY250ID0gKGxlbiA8IDQpID8gbGVuIDogNDsKKwkJbGVuIC09IGNudDsKKwkJZG8geworCQkJYWNjID0gKGFjYyA8PCA4KSB8IChhY2MgPj4gMjQpOworCQkJKmRzdCsrID0gYWNjOworCQl9IHdoaWxlICgtLWNudCk7CisJfQorCXNheSgiXG4iKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuY29kZV84NShjaGFyICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBieXRlcykKK3sKKwlwcmVwX2Jhc2U4NSgpOworCisJc2F5KCJlbmNvZGUgODUiKTsKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJdW5zaWduZWQgYWNjID0gMDsKKwkJaW50IGNudDsKKwkJZm9yIChjbnQgPSAyNDsgY250ID49IDA7IGNudCAtPSA4KSB7CisJCQlpbnQgY2ggPSAqZGF0YSsrOworCQkJYWNjIHw9IGNoIDw8IGNudDsKKwkJCWlmICgtLWJ5dGVzID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJc2F5MSgiICUwOHgiLCBhY2MpOworCQlmb3IgKGNudCA9IDQ7IGNudCA+PSAwOyBjbnQtLSkgeworCQkJaW50IHZhbCA9IGFjYyAlIDg1OworCQkJYWNjIC89IDg1OworCQkJYnVmW2NudF0gPSBlbjg1W3ZhbF07CisJCX0KKwkJYnVmICs9IDU7CisJfQorCXNheSgiXG4iKTsKKworCSpidWYgPSAwOworfQorCisjaWZkZWYgREVCVUdfODUKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKCFzdHJjbXAoYXZbMV0sICItZSIpKSB7CisJCWludCBsZW4gPSBzdHJsZW4oYXZbMl0pOworCQllbmNvZGVfODUoYnVmLCBhdlsyXSwgbGVuKTsKKwkJaWYgKGxlbiA8PSAyNikgbGVuID0gbGVuICsgJ0EnIC0gMTsKKwkJZWxzZSBsZW4gPSBsZW4gKyAnYScgLSAyNiArIDE7CisJCXByaW50ZigiZW5jb2RlZDogJWMlc1xuIiwgbGVuLCBidWYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoYXZbMV0sICItZCIpKSB7CisJCWludCBsZW4gPSAqYXZbMl07CisJCWlmICgnQScgPD0gbGVuICYmIGxlbiA8PSAnWicpIGxlbiA9IGxlbiAtICdBJyArIDE7CisJCWVsc2UgbGVuID0gbGVuIC0gJ2EnICsgMjYgKyAxOworCQlkZWNvZGVfODUoYnVmLCBhdlsyXSsxLCBsZW4pOworCQlwcmludGYoImRlY29kZWQ6ICUuKnNcbiIsIGxlbiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKGF2WzFdLCAiLXQiKSkgeworCQljaGFyIHRbNF0gPSB7IC0xLC0xLC0xLC0xIH07CisJCWVuY29kZV84NShidWYsIHQsIDQpOworCQlwcmludGYoImVuY29kZWQ6IEQlc1xuIiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ibG9iLmMgYi9ibG9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3ZDA3OAotLS0gL2Rldi9udWxsCisrKyBiL2Jsb2IuYwpAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK2NvbnN0IGNoYXIgKmJsb2JfdHlwZSA9ICJibG9iIjsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX0JMT0IsIGFsbG9jX2Jsb2Jfbm9kZSgpKTsKKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gT0JKX0JMT0I7CisJaWYgKG9iai0+dHlwZSAhPSBPQkpfQkxPQikgeworCQllcnJvcigiT2JqZWN0ICVzIGlzIGEgJXMsIG5vdCBhIGJsb2IiLAorCQkgICAgICBzaGExX3RvX2hleChzaGExKSwgdHlwZW5hbWUob2JqLT50eXBlKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBibG9iICopIG9iajsKK30KKworaW50IHBhcnNlX2Jsb2JfYnVmZmVyKHN0cnVjdCBibG9iICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpdGVtLT5vYmplY3QucGFyc2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pCit7CisgICAgICAgIGVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKyAgICAgICAgdm9pZCAqYnVmZmVyOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworICAgICAgICBpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworICAgICAgICBpZiAodHlwZSAhPSBPQkpfQkxPQikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBibG9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlyZXQgPSBwYXJzZV9ibG9iX2J1ZmZlcihpdGVtLCBidWZmZXIsIHNpemUpOworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmxvYi5oIGIvYmxvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ibG9iLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBCTE9CX0gKKyNkZWZpbmUgQkxPQl9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsb2JfdHlwZTsKKworc3RydWN0IGJsb2IgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworfTsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitpbnQgcGFyc2VfYmxvYl9idWZmZXIoc3RydWN0IGJsb2IgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pOworCisjZW5kaWYgLyogQkxPQl9IICovCmRpZmYgLS1naXQgYS9idWlsdGluLWFkZC5jIGIvYnVpbHRpbi1hZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTkxMTcxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1hZGQuYwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqICJnaXQgYWRkIiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGludXMgVG9ydmFsZHMKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fYWRkX3VzYWdlW10gPQorImdpdC1hZGQgWy1uXSBbLXZdIFstZl0gWy0taW50ZXJhY3RpdmUgfCAtaV0gWy11XSBbLS1dIDxmaWxlcGF0dGVybj4uLi4iOworCitzdGF0aWMgaW50IHRha2Vfd29ya3RyZWVfY2hhbmdlczsKK3N0YXRpYyBjb25zdCBjaGFyICpleGNsdWRlc19maWxlOworCitzdGF0aWMgdm9pZCBwcnVuZV9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqKnBhdGhzcGVjLCBpbnQgcHJlZml4KQoreworCWNoYXIgKnNlZW47CisJaW50IGksIHNwZWNzOworCXN0cnVjdCBkaXJfZW50cnkgKipzcmMsICoqZHN0OworCisJZm9yIChzcGVjcyA9IDA7IHBhdGhzcGVjW3NwZWNzXTsgIHNwZWNzKyspCisJCS8qIG5vdGhpbmcgKi87CisJc2VlbiA9IHhjYWxsb2Moc3BlY3MsIDEpOworCisJc3JjID0gZHN0ID0gZGlyLT5lbnRyaWVzOworCWkgPSBkaXItPm5yOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnRyeSA9ICpzcmMrKzsKKwkJaWYgKG1hdGNoX3BhdGhzcGVjKHBhdGhzcGVjLCBlbnRyeS0+bmFtZSwgZW50cnktPmxlbiwKKwkJCQkgICBwcmVmaXgsIHNlZW4pKQorCQkJKmRzdCsrID0gZW50cnk7CisJfQorCWRpci0+bnIgPSBkc3QgLSBkaXItPmVudHJpZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlY3M7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY29uc3QgY2hhciAqbWF0Y2g7CisJCWlmIChzZWVuW2ldKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggPSBwYXRoc3BlY1tpXTsKKwkJaWYgKCFtYXRjaFswXSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4aXN0aW5nIGZpbGU/IFdlIG11c3QgaGF2ZSBpZ25vcmVkIGl0ICovCisJCWlmICghbHN0YXQobWF0Y2gsICZzdCkpIHsKKwkJCXN0cnVjdCBkaXJfZW50cnkgKmVudDsKKworCQkJZW50ID0gZGlyX2FkZF9uYW1lKGRpciwgbWF0Y2gsIHN0cmxlbihtYXRjaCkpOworCQkJZW50LT5pZ25vcmVkID0gMTsKKwkJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJCWVudC0+aWdub3JlZF9kaXIgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJwYXRoc3BlYyAnJXMnIGRpZCBub3QgbWF0Y2ggYW55IGZpbGVzIiwgbWF0Y2gpOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsbF9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqKnBhdGhzcGVjKQoreworCWNvbnN0IGNoYXIgKnBhdGgsICpiYXNlOworCWludCBiYXNlbGVuOworCisJLyogU2V0IHVwIHRoZSBkZWZhdWx0IGdpdCBwb3JjZWxhaW4gZXhjbHVkZXMgKi8KKwltZW1zZXQoZGlyLCAwLCBzaXplb2YoKmRpcikpOworCWRpci0+ZXhjbHVkZV9wZXJfZGlyID0gIi5naXRpZ25vcmUiOworCXBhdGggPSBnaXRfcGF0aCgiaW5mby9leGNsdWRlIik7CisJaWYgKCFhY2Nlc3MocGF0aCwgUl9PSykpCisJCWFkZF9leGNsdWRlc19mcm9tX2ZpbGUoZGlyLCBwYXRoKTsKKwlpZiAoIWFjY2VzcyhleGNsdWRlc19maWxlLCBSX09LKSkKKwkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZShkaXIsIGV4Y2x1ZGVzX2ZpbGUpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY29tbW9uIHByZWZpeCBmb3IgdGhlIHBhdGhzcGVjLCBhbmQKKwkgKiB1c2UgdGhhdCB0byBvcHRpbWl6ZSB0aGUgZGlyZWN0b3J5IHdhbGsKKwkgKi8KKwliYXNlbGVuID0gY29tbW9uX3ByZWZpeChwYXRoc3BlYyk7CisJcGF0aCA9ICIuIjsKKwliYXNlID0gIiI7CisJaWYgKGJhc2VsZW4pIHsKKwkJY2hhciAqY29tbW9uID0geG1hbGxvYyhiYXNlbGVuICsgMSk7CisJCW1lbWNweShjb21tb24sICpwYXRoc3BlYywgYmFzZWxlbik7CisJCWNvbW1vbltiYXNlbGVuXSA9IDA7CisJCXBhdGggPSBiYXNlID0gY29tbW9uOworCX0KKworCS8qIFJlYWQgdGhlIGRpcmVjdG9yeSBhbmQgcHJ1bmUgaXQgKi8KKwlyZWFkX2RpcmVjdG9yeShkaXIsIHBhdGgsIGJhc2UsIGJhc2VsZW4sIHBhdGhzcGVjKTsKKwlpZiAocGF0aHNwZWMpCisJCXBydW5lX2RpcmVjdG9yeShkaXIsIHBhdGhzcGVjLCBiYXNlbGVuKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2NhbGxiYWNrKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKwkJCSAgICBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQsIHZvaWQgKmNiZGF0YSkKK3sKKwlpbnQgaSwgdmVyYm9zZTsKKworCXZlcmJvc2UgPSAqKChpbnQgKiljYmRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWNvbnN0IGNoYXIgKnBhdGggPSBwLT5vbmUtPnBhdGg7CisJCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJCWRlZmF1bHQ6CisJCQlkaWUoInVuZXhwYWN0ZWQgZGlmZiBzdGF0dXMgJWMiLCBwLT5zdGF0dXMpOworCQljYXNlIERJRkZfU1RBVFVTX1VOTUVSR0VEOgorCQljYXNlIERJRkZfU1RBVFVTX01PRElGSUVEOgorCQkJYWRkX2ZpbGVfdG9fY2FjaGUocGF0aCwgdmVyYm9zZSk7CisJCQlicmVhazsKKwkJY2FzZSBESUZGX1NUQVRVU19ERUxFVEVEOgorCQkJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKTsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigicmVtb3ZlICclcydcbiIsIHBhdGgpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZShpbnQgdmVyYm9zZSwgY29uc3QgY2hhciAqKmZpbGVzKQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgIiIpOworCXNldHVwX3JldmlzaW9ucygwLCBOVUxMLCAmcmV2LCBOVUxMKTsKKwlyZXYucHJ1bmVfZGF0YSA9IGdldF9wYXRoc3BlYyhyZXYucHJlZml4LCBmaWxlcyk7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX0NBTExCQUNLOworCXJldi5kaWZmb3B0LmZvcm1hdF9jYWxsYmFjayA9IHVwZGF0ZV9jYWxsYmFjazsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2tfZGF0YSA9ICZ2ZXJib3NlOworCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworCXJ1bl9kaWZmX2ZpbGVzKCZyZXYsIDApOworfQorCitzdGF0aWMgaW50IGdpdF9hZGRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5leGNsdWRlc2ZpbGUiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJZGllKCJjb3JlLmV4Y2x1ZGVzZmlsZSB3aXRob3V0IHZhbHVlIik7CisJCWV4Y2x1ZGVzX2ZpbGUgPSB4c3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitzdGF0aWMgY29uc3QgY2hhciBpZ25vcmVfd2FybmluZ1tdID0KKyJUaGUgZm9sbG93aW5nIHBhdGhzIGFyZSBpZ25vcmVkIGJ5IG9uZSBvZiB5b3VyIC5naXRpZ25vcmUgZmlsZXM6XG4iOworCitpbnQgY21kX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQ7CisJaW50IHZlcmJvc2UgPSAwLCBzaG93X29ubHkgPSAwLCBpZ25vcmVkX3RvbyA9IDA7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjOworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKwlpbnQgYWRkX2ludGVyYWN0aXZlID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoIi0taW50ZXJhY3RpdmUiLCBhcmd2W2ldKSB8fAorCQkgICAgIXN0cmNtcCgiLWkiLCBhcmd2W2ldKSkKKwkJCWFkZF9pbnRlcmFjdGl2ZSsrOworCX0KKwlpZiAoYWRkX2ludGVyYWN0aXZlKSB7CisJCWNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsgImFkZC0taW50ZXJhY3RpdmUiLCBOVUxMIH07CisKKwkJaWYgKGFkZF9pbnRlcmFjdGl2ZSAhPSAxIHx8IGFyZ2MgIT0gMikKKwkJCWRpZSgiYWRkIC0taW50ZXJhY3RpdmUgZG9lcyBub3QgdGFrZSBhbnkgcGFyYW1ldGVycyIpOworCQlleGVjdl9naXRfY21kKGFyZ3MpOworCQlleGl0KDEpOworCX0KKworCWdpdF9jb25maWcoZ2l0X2FkZF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleCgmbG9ja19maWxlLCAxKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQlzaG93X29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSkgeworCQkJaWdub3JlZF90b28gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdmVyYm9zZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItdSIpKSB7CisJCQl0YWtlX3dvcmt0cmVlX2NoYW5nZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UoYnVpbHRpbl9hZGRfdXNhZ2UpOworCX0KKworCWlmICh0YWtlX3dvcmt0cmVlX2NoYW5nZXMpIHsKKwkJdXBkYXRlKHZlcmJvc2UsIGFyZ3YgKyBpKTsKKwkJZ290byBmaW5pc2g7CisJfQorCisJaWYgKGFyZ2MgPD0gaSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdGhpbmcgc3BlY2lmaWVkLCBub3RoaW5nIGFkZGVkLlxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiTWF5YmUgeW91IHdhbnRlZCB0byBzYXkgJ2dpdCBhZGQgLic/XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIGkpOworCisJZmlsbF9kaXJlY3RvcnkoJmRpciwgcGF0aHNwZWMpOworCisJaWYgKHNob3dfb25seSkgeworCQljb25zdCBjaGFyICpzZXAgPSAiIiwgKmVvZiA9ICIiOworCQlmb3IgKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspIHsKKwkJCWlmICghaWdub3JlZF90b28gJiYgZGlyLmVudHJpZXNbaV0tPmlnbm9yZWQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzJXMiLCBzZXAsIGRpci5lbnRyaWVzW2ldLT5uYW1lKTsKKwkJCXNlcCA9ICIgIjsKKwkJCWVvZiA9ICJcbiI7CisJCX0KKwkJZnB1dHMoZW9mLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKworCWlmICghaWdub3JlZF90b28pIHsKKwkJaW50IGhhc19pZ25vcmVkID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGRpci5ucjsgaSsrKQorCQkJaWYgKGRpci5lbnRyaWVzW2ldLT5pZ25vcmVkKQorCQkJCWhhc19pZ25vcmVkID0gMTsKKwkJaWYgKGhhc19pZ25vcmVkKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgaWdub3JlX3dhcm5pbmcpOworCQkJZm9yIChpID0gMDsgaSA8IGRpci5ucjsgaSsrKSB7CisJCQkJaWYgKCFkaXIuZW50cmllc1tpXS0+aWdub3JlZCkKKwkJCQkJY29udGludWU7CisJCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIGRpci5lbnRyaWVzW2ldLT5uYW1lKTsKKwkJCQlpZiAoZGlyLmVudHJpZXNbaV0tPmlnbm9yZWRfZGlyKQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAoZGlyZWN0b3J5KSIpOworCQkJCWZwdXRjKCdcbicsIHN0ZGVycik7CisJCQl9CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiVXNlIC1mIGlmIHlvdSByZWFsbHkgd2FudCB0byBhZGQgdGhlbS5cbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBkaXIubnI7IGkrKykKKwkJYWRkX2ZpbGVfdG9fY2FjaGUoZGlyLmVudHJpZXNbaV0tPm5hbWUsIHZlcmJvc2UpOworCisgZmluaXNoOgorCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCkgeworCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1hbm5vdGF0ZS5jIGIvYnVpbHRpbi1hbm5vdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjdjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWFubm90YXRlLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqICJnaXQgYW5ub3RhdGUiIGJ1aWx0aW4gYWxpYXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUnlhbiBBbmRlcnNvbgorICovCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKipuYXJndjsKKwlpbnQgaTsKKwluYXJndiA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAoYXJnYyArIDIpKTsKKworCW5hcmd2WzBdID0gImFubm90YXRlIjsKKwluYXJndlsxXSA9ICItYyI7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCW5hcmd2W2krMV0gPSBhcmd2W2ldOworCX0KKwluYXJndlthcmdjICsgMV0gPSBOVUxMOworCisJcmV0dXJuIGNtZF9ibGFtZShhcmdjICsgMSwgbmFyZ3YsIHByZWZpeCk7Cit9CisKZGlmZiAtLWdpdCBhL2J1aWx0aW4tYXBwbHkuYyBiL2J1aWx0aW4tYXBwbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBlMjNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1hcHBseS5jCkBAIC0wLDAgKzEsMjg5NiBAQAorLyoKKyAqIGFwcGx5LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKgorICogVGhpcyBhcHBsaWVzIHBhdGNoZXMgb24gdG9wIG9mIHNvbWUgKGFyYml0cmFyeSkgdmVyc2lvbiBvZiB0aGUgU0NNLgorICoKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisvKgorICogIC0tY2hlY2sgdHVybnMgb24gY2hlY2tpbmcgdGhhdCB0aGUgd29ya2luZyB0cmVlIG1hdGNoZXMgdGhlCisgKiAgICBmaWxlcyB0aGF0IGFyZSBiZWluZyBtb2RpZmllZCwgYnV0IGRvZXNuJ3QgYXBwbHkgdGhlIHBhdGNoCisgKiAgLS1zdGF0IGRvZXMganVzdCBhIGRpZmZzdGF0LCBhbmQgZG9lc24ndCBhY3R1YWxseSBhcHBseQorICogIC0tbnVtc3RhdCBkb2VzIG51bWVyaWMgZGlmZnN0YXQsIGFuZCBkb2Vzbid0IGFjdHVhbGx5IGFwcGx5CisgKiAgLS1pbmRleC1pbmZvIHNob3dzIHRoZSBvbGQgYW5kIG5ldyBpbmRleCBpbmZvIGZvciBwYXRocyBpZiBhdmFpbGFibGUuCisgKiAgLS1pbmRleCB1cGRhdGVzIHRoZSBjYWNoZSBhcyB3ZWxsLgorICogIC0tY2FjaGVkIHVwZGF0ZXMgb25seSB0aGUgY2FjaGUgd2l0aG91dCBldmVyIHRvdWNoaW5nIHRoZSB3b3JraW5nIHRyZWUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXg7CitzdGF0aWMgaW50IHByZWZpeF9sZW5ndGggPSAtMTsKK3N0YXRpYyBpbnQgbmV3ZmQgPSAtMTsKKworc3RhdGljIGludCB1bmlkaWZmX3plcm87CitzdGF0aWMgaW50IHBfdmFsdWUgPSAxOworc3RhdGljIGludCBwX3ZhbHVlX2tub3duOworc3RhdGljIGludCBjaGVja19pbmRleDsKK3N0YXRpYyBpbnQgdXBkYXRlX2luZGV4Oworc3RhdGljIGludCBjYWNoZWQ7CitzdGF0aWMgaW50IGRpZmZzdGF0Oworc3RhdGljIGludCBudW1zdGF0Oworc3RhdGljIGludCBzdW1tYXJ5Oworc3RhdGljIGludCBjaGVjazsKK3N0YXRpYyBpbnQgYXBwbHkgPSAxOworc3RhdGljIGludCBhcHBseV9pbl9yZXZlcnNlOworc3RhdGljIGludCBhcHBseV93aXRoX3JlamVjdDsKK3N0YXRpYyBpbnQgYXBwbHlfdmVyYm9zZWx5Oworc3RhdGljIGludCBub19hZGQ7CitzdGF0aWMgaW50IHNob3dfaW5kZXhfaW5mbzsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwX2NvbnRleHQgPSBVTE9OR19NQVg7CitzdGF0aWMgY29uc3QgY2hhciBhcHBseV91c2FnZVtdID0KKyJnaXQtYXBwbHkgWy0tc3RhdF0gWy0tbnVtc3RhdF0gWy0tc3VtbWFyeV0gWy0tY2hlY2tdIFstLWluZGV4XSBbLS1jYWNoZWRdIFstLWFwcGx5XSBbLS1uby1hZGRdIFstLWluZGV4LWluZm9dIFstLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudF0gWy0tcmV2ZXJzZV0gWy0tcmVqZWN0XSBbLS12ZXJib3NlXSBbLXpdIFstcE5VTV0gWy1DTlVNXSBbLS13aGl0ZXNwYWNlPTxub3dhcm58d2FybnxlcnJvcnxlcnJvci1hbGx8c3RyaXA+XSA8cGF0Y2g+Li4uIjsKKworc3RhdGljIGVudW0gd2hpdGVzcGFjZV9lb2wgeworCW5vd2Fybl93aGl0ZXNwYWNlLAorCXdhcm5fb25fd2hpdGVzcGFjZSwKKwllcnJvcl9vbl93aGl0ZXNwYWNlLAorCXN0cmlwX3doaXRlc3BhY2UsCit9IG5ld193aGl0ZXNwYWNlID0gd2Fybl9vbl93aGl0ZXNwYWNlOworc3RhdGljIGludCB3aGl0ZXNwYWNlX2Vycm9yOworc3RhdGljIGludCBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzID0gNTsKK3N0YXRpYyBpbnQgYXBwbGllZF9hZnRlcl9zdHJpcHBpbmc7CitzdGF0aWMgY29uc3QgY2hhciAqcGF0Y2hfaW5wdXRfZmlsZTsKKworc3RhdGljIHZvaWQgcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uKQoreworCWlmICghb3B0aW9uKSB7CisJCW5ld193aGl0ZXNwYWNlID0gd2Fybl9vbl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgIndhcm4iKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IHdhcm5fb25fd2hpdGVzcGFjZTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXN0cmNtcChvcHRpb24sICJub3dhcm4iKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IG5vd2Fybl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yIikpIHsKKwkJbmV3X3doaXRlc3BhY2UgPSBlcnJvcl9vbl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yLWFsbCIpKSB7CisJCW5ld193aGl0ZXNwYWNlID0gZXJyb3Jfb25fd2hpdGVzcGFjZTsKKwkJc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAic3RyaXAiKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IHN0cmlwX3doaXRlc3BhY2U7CisJCXJldHVybjsKKwl9CisJZGllKCJ1bnJlY29nbml6ZWQgd2hpdGVzcGFjZSBvcHRpb24gJyVzJyIsIG9wdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZShjb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbikKK3sKKwlpZiAoIXdoaXRlc3BhY2Vfb3B0aW9uICYmICFhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpIHsKKwkJbmV3X3doaXRlc3BhY2UgPSAoYXBwbHkKKwkJCQkgID8gd2Fybl9vbl93aGl0ZXNwYWNlCisJCQkJICA6IG5vd2Fybl93aGl0ZXNwYWNlKTsKKwl9Cit9CisKKy8qCisgKiBGb3IgImRpZmYtc3RhdCIgbGlrZSBiZWhhdmlvdXIsIHdlIGtlZXAgdHJhY2sgb2YgdGhlIGJpZ2dlc3QgY2hhbmdlCisgKiB3ZSd2ZSBzZWVuLCBhbmQgdGhlIGxvbmdlc3QgZmlsZW5hbWUuIFRoYXQgYWxsb3dzIHVzIHRvIGRvIHNpbXBsZQorICogc2NhbGluZy4KKyAqLworc3RhdGljIGludCBtYXhfY2hhbmdlLCBtYXhfbGVuOworCisvKgorICogVmFyaW91cyAiY3VycmVudCBzdGF0ZSIsIG5vdGFibHkgbGluZSBudW1iZXJzIGFuZCB3aGF0CisgKiBmaWxlIChhbmQgaG93KSB3ZSdyZSBwYXRjaGluZyByaWdodCBub3cuLiBUaGUgImlzX3h4eHgiCisgKiB0aGluZ3MgYXJlIGZsYWdzLCB3aGVyZSAtMSBtZWFucyAiZG9uJ3Qga25vdyB5ZXQiLgorICovCitzdGF0aWMgaW50IGxpbmVuciA9IDE7CisKKy8qCisgKiBUaGlzIHJlcHJlc2VudHMgb25lICJodW5rIiBmcm9tIGEgcGF0Y2gsIHN0YXJ0aW5nIHdpdGgKKyAqICJAQCAtb2xkcG9zLG9sZGxpbmVzICtuZXdwb3MsbmV3bGluZXMgQEAiIG1hcmtlci4gIFRoZQorICogcGF0Y2ggdGV4dCBpcyBwb2ludGVkIGF0IGJ5IHBhdGNoLCBhbmQgaXRzIGJ5dGUgbGVuZ3RoCisgKiBpcyBzdG9yZWQgaW4gc2l6ZS4gIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGFyZSB0aGUgbnVtYmVyCisgKiBvZiBjb250ZXh0IGxpbmVzLgorICovCitzdHJ1Y3QgZnJhZ21lbnQgeworCXVuc2lnbmVkIGxvbmcgbGVhZGluZywgdHJhaWxpbmc7CisJdW5zaWduZWQgbG9uZyBvbGRwb3MsIG9sZGxpbmVzOworCXVuc2lnbmVkIGxvbmcgbmV3cG9zLCBuZXdsaW5lczsKKwljb25zdCBjaGFyICpwYXRjaDsKKwlpbnQgc2l6ZTsKKwlpbnQgcmVqZWN0ZWQ7CisJc3RydWN0IGZyYWdtZW50ICpuZXh0OworfTsKKworLyoKKyAqIFdoZW4gZGVhbGluZyB3aXRoIGEgYmluYXJ5IHBhdGNoLCB3ZSByZXVzZSAibGVhZGluZyIgZmllbGQKKyAqIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBiaW5hcnkgaHVuaywgZWl0aGVyIGRlZmxhdGVkICJkZWx0YSIKKyAqIG9yIGRlZmxhdGVkICJsaXRlcmFsIi4KKyAqLworI2RlZmluZSBiaW5hcnlfcGF0Y2hfbWV0aG9kIGxlYWRpbmcKKyNkZWZpbmUgQklOQVJZX0RFTFRBX0RFRkxBVEVECTEKKyNkZWZpbmUgQklOQVJZX0xJVEVSQUxfREVGTEFURUQgMgorCitzdHJ1Y3QgcGF0Y2ggeworCWNoYXIgKm5ld19uYW1lLCAqb2xkX25hbWUsICpkZWZfbmFtZTsKKwl1bnNpZ25lZCBpbnQgb2xkX21vZGUsIG5ld19tb2RlOworCWludCBpc19uZXcsIGlzX2RlbGV0ZTsJLyogLTEgPSB1bmtub3duLCAwID0gZmFsc2UsIDEgPSB0cnVlICovCisJaW50IHJlamVjdGVkOworCXVuc2lnbmVkIGxvbmcgZGVmbGF0ZV9vcmlnbGVuOworCWludCBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZDsKKwlpbnQgc2NvcmU7CisJdW5zaWduZWQgaW50IGlzX3RvcGxldmVsX3JlbGF0aXZlOjE7CisJdW5zaWduZWQgaW50IGluYWNjdXJhdGVfZW9mOjE7CisJdW5zaWduZWQgaW50IGlzX2JpbmFyeToxOworCXVuc2lnbmVkIGludCBpc19jb3B5OjE7CisJdW5zaWduZWQgaW50IGlzX3JlbmFtZToxOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnRzOworCWNoYXIgKnJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdHNpemU7CisJY2hhciBvbGRfc2hhMV9wcmVmaXhbNDFdOworCWNoYXIgbmV3X3NoYTFfcHJlZml4WzQxXTsKKwlzdHJ1Y3QgcGF0Y2ggKm5leHQ7Cit9OworCitzdGF0aWMgdm9pZCBzYXlfcGF0Y2hfbmFtZShGSUxFICpvdXRwdXQsIGNvbnN0IGNoYXIgKnByZSwgc3RydWN0IHBhdGNoICpwYXRjaCwgY29uc3QgY2hhciAqcG9zdCkKK3sKKwlmcHV0cyhwcmUsIG91dHB1dCk7CisJaWYgKHBhdGNoLT5vbGRfbmFtZSAmJiBwYXRjaC0+bmV3X25hbWUgJiYKKwkgICAgc3RyY21wKHBhdGNoLT5vbGRfbmFtZSwgcGF0Y2gtPm5ld19uYW1lKSkgeworCQl3cml0ZV9uYW1lX3F1b3RlZChOVUxMLCAwLCBwYXRjaC0+b2xkX25hbWUsIDEsIG91dHB1dCk7CisJCWZwdXRzKCIgPT4gIiwgb3V0cHV0KTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQoTlVMTCwgMCwgcGF0Y2gtPm5ld19uYW1lLCAxLCBvdXRwdXQpOworCX0KKwllbHNlIHsKKwkJY29uc3QgY2hhciAqbiA9IHBhdGNoLT5uZXdfbmFtZTsKKwkJaWYgKCFuKQorCQkJbiA9IHBhdGNoLT5vbGRfbmFtZTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQoTlVMTCwgMCwgbiwgMSwgb3V0cHV0KTsKKwl9CisJZnB1dHMocG9zdCwgb3V0cHV0KTsKK30KKworI2RlZmluZSBDSFVOS1NJWkUgKDgxOTIpCisjZGVmaW5lIFNMT1AgKDE2KQorCitzdGF0aWMgdm9pZCAqcmVhZF9wYXRjaF9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMCwgYWxsb2MgPSBDSFVOS1NJWkU7CisJdm9pZCAqYnVmZmVyID0geG1hbGxvYyhhbGxvYyk7CisKKwlmb3IgKDs7KSB7CisJCXNzaXplX3QgbnIgPSBhbGxvYyAtIHNpemU7CisJCWlmIChuciA8IDEwMjQpIHsKKwkJCWFsbG9jICs9IENIVU5LU0laRTsKKwkJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgYWxsb2MpOworCQkJbnIgPSBhbGxvYyAtIHNpemU7CisJCX0KKwkJbnIgPSB4cmVhZChmZCwgKGNoYXIgKikgYnVmZmVyICsgc2l6ZSwgbnIpOworCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWlmIChuciA8IDApCisJCQlkaWUoImdpdC1hcHBseTogcmVhZCByZXR1cm5lZCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXNpemUgKz0gbnI7CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc29tZSBzbG9wIGluIHRoZSBidWZmZXIKKwkgKiBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjdWxhdGl2ZSAibWVtY21wIiBldGMsIGFuZAorCSAqIHNlZSB0byBpdCB0aGF0IGl0IGlzIE5VTC1maWxsZWQuCisJICovCisJaWYgKGFsbG9jIDwgc2l6ZSArIFNMT1ApCisJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgc2l6ZSArIFNMT1ApOworCW1lbXNldCgoY2hhciAqKSBidWZmZXIgKyBzaXplLCAwLCBTTE9QKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsaW5lbGVuKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKKwl3aGlsZSAoc2l6ZS0tKSB7CisJCWxlbisrOworCQlpZiAoKmJ1ZmZlcisrID09ICdcbicpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBpc19kZXZfbnVsbChjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuICFtZW1jbXAoIi9kZXYvbnVsbCIsIHN0ciwgOSkgJiYgaXNzcGFjZShzdHJbOV0pOworfQorCisjZGVmaW5lIFRFUk1fU1BBQ0UJMQorI2RlZmluZSBURVJNX1RBQgkyCisKK3N0YXRpYyBpbnQgbmFtZV90ZXJtaW5hdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCBjLCBpbnQgdGVybWluYXRlKQoreworCWlmIChjID09ICcgJyAmJiAhKHRlcm1pbmF0ZSAmIFRFUk1fU1BBQ0UpKQorCQlyZXR1cm4gMDsKKwlpZiAoYyA9PSAnXHQnICYmICEodGVybWluYXRlICYgVEVSTV9UQUIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgY2hhciAqZmluZF9uYW1lKGNvbnN0IGNoYXIgKmxpbmUsIGNoYXIgKmRlZiwgaW50IHBfdmFsdWUsIGludCB0ZXJtaW5hdGUpCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpzdGFydCA9IGxpbmU7CisJY2hhciAqbmFtZTsKKworCWlmICgqbGluZSA9PSAnIicpIHsKKwkJLyogUHJvcG9zZWQgIm5ldy1zdHlsZSIgR05VIHBhdGNoL2RpZmYgZm9ybWF0OyBzZWUKKwkJICogaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTI5MjczMTY0MDg2OTAmdz0yCisJCSAqLworCQluYW1lID0gdW5xdW90ZV9jX3N0eWxlKGxpbmUsIE5VTEwpOworCQlpZiAobmFtZSkgeworCQkJY2hhciAqY3AgPSBuYW1lOworCQkJd2hpbGUgKHBfdmFsdWUpIHsKKwkJCQljcCA9IHN0cmNocihuYW1lLCAnLycpOworCQkJCWlmICghY3ApCisJCQkJCWJyZWFrOworCQkJCWNwKys7CisJCQkJcF92YWx1ZS0tOworCQkJfQorCQkJaWYgKGNwKSB7CisJCQkJLyogbmFtZSBjYW4gbGF0ZXIgYmUgZnJlZWQsIHNvIHdlIG5lZWQKKwkJCQkgKiB0byBtZW1tb3ZlLCBub3QganVzdCByZXR1cm4gY3AKKwkJCQkgKi8KKwkJCQltZW1tb3ZlKG5hbWUsIGNwLCBzdHJsZW4oY3ApICsgMSk7CisJCQkJZnJlZShkZWYpOworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQkJZWxzZSB7CisJCQkJZnJlZShuYW1lKTsKKwkJCQluYW1lID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKmxpbmU7CisKKwkJaWYgKGlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICdcbicpCisJCQkJYnJlYWs7CisJCQlpZiAobmFtZV90ZXJtaW5hdGUoc3RhcnQsIGxpbmUtc3RhcnQsIGMsIHRlcm1pbmF0ZSkpCisJCQkJYnJlYWs7CisJCX0KKwkJbGluZSsrOworCQlpZiAoYyA9PSAnLycgJiYgIS0tcF92YWx1ZSkKKwkJCXN0YXJ0ID0gbGluZTsKKwl9CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIGRlZjsKKwlsZW4gPSBsaW5lIC0gc3RhcnQ7CisJaWYgKCFsZW4pCisJCXJldHVybiBkZWY7CisKKwkvKgorCSAqIEdlbmVyYWxseSB3ZSBwcmVmZXIgdGhlIHNob3J0ZXIgbmFtZSwgZXNwZWNpYWxseQorCSAqIGlmIHRoZSBvdGhlciBvbmUgaXMganVzdCBhIHZhcmlhdGlvbiBvZiB0aGF0IHdpdGgKKwkgKiBzb21ldGhpbmcgZWxzZSB0YWNrZWQgb24gdG8gdGhlIGVuZCAoaWUgImZpbGUub3JpZyIKKwkgKiBvciAiZmlsZX4iKS4KKwkgKi8KKwlpZiAoZGVmKSB7CisJCWludCBkZWZsZW4gPSBzdHJsZW4oZGVmKTsKKwkJaWYgKGRlZmxlbiA8IGxlbiAmJiAhc3RybmNtcChzdGFydCwgZGVmLCBkZWZsZW4pKQorCQkJcmV0dXJuIGRlZjsKKwl9CisKKwluYW1lID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkobmFtZSwgc3RhcnQsIGxlbik7CisJbmFtZVtsZW5dID0gMDsKKwlmcmVlKGRlZik7CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfc2xhc2hlcyhjb25zdCBjaGFyICpjcCkKK3sKKwlpbnQgY250ID0gMDsKKwljaGFyIGNoOworCisJd2hpbGUgKChjaCA9ICpjcCsrKSkKKwkJaWYgKGNoID09ICcvJykKKwkJCWNudCsrOworCXJldHVybiBjbnQ7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgc3RyaW5nIGFmdGVyICItLS0gIiBvciAiKysrICIsIGd1ZXNzIHRoZSBhcHByb3ByaWF0ZQorICogcF92YWx1ZSBmb3IgdGhlIGdpdmVuIHBhdGNoLgorICovCitzdGF0aWMgaW50IGd1ZXNzX3BfdmFsdWUoY29uc3QgY2hhciAqbmFtZWxpbmUpCit7CisJY2hhciAqbmFtZSwgKmNwOworCWludCB2YWwgPSAtMTsKKworCWlmIChpc19kZXZfbnVsbChuYW1lbGluZSkpCisJCXJldHVybiAtMTsKKwluYW1lID0gZmluZF9uYW1lKG5hbWVsaW5lLCBOVUxMLCAwLCBURVJNX1NQQUNFIHwgVEVSTV9UQUIpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC0xOworCWNwID0gc3RyY2hyKG5hbWUsICcvJyk7CisJaWYgKCFjcCkKKwkJdmFsID0gMDsKKwllbHNlIGlmIChwcmVmaXgpIHsKKwkJLyoKKwkJICogRG9lcyBpdCBiZWdpbiB3aXRoICJhLyRvdXItcHJlZml4IiBhbmQgc3VjaD8gIFRoZW4gdGhpcyBpcworCQkgKiB2ZXJ5IGxpa2VseSB0byBhcHBseSB0byBvdXIgZGlyZWN0b3J5LgorCQkgKi8KKwkJaWYgKCFzdHJuY21wKG5hbWUsIHByZWZpeCwgcHJlZml4X2xlbmd0aCkpCisJCQl2YWwgPSBjb3VudF9zbGFzaGVzKHByZWZpeCk7CisJCWVsc2UgeworCQkJY3ArKzsKKwkJCWlmICghc3RybmNtcChjcCwgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKSkKKwkJCQl2YWwgPSBjb3VudF9zbGFzaGVzKHByZWZpeCkgKyAxOworCQl9CisJfQorCWZyZWUobmFtZSk7CisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIEdldCB0aGUgbmFtZSBldGMgaW5mbyBmcm9tIHRoZSAtLS8rKysgbGluZXMgb2YgYSB0cmFkaXRpb25hbCBwYXRjaCBoZWFkZXIKKyAqCisgKiBGSVhNRSEgVGhlIGVuZC1vZi1maWxlbmFtZSBoZXVyaXN0aWNzIGFyZSBraW5kIG9mIHNjcmV3eS4gRm9yIGV4aXN0aW5nCisgKiBmaWxlcywgd2UgY2FuIGhhcHBpbHkgY2hlY2sgdGhlIGluZGV4IGZvciBhIG1hdGNoLCBidXQgZm9yIGNyZWF0aW5nIGEKKyAqIG5ldyBmaWxlIHdlIHNob3VsZCB0cnkgdG8gbWF0Y2ggd2hhdGV2ZXIgInBhdGNoIiBkb2VzLiBJIGhhdmUgbm8gaWRlYS4KKyAqLworc3RhdGljIHZvaWQgcGFyc2VfdHJhZGl0aW9uYWxfcGF0Y2goY29uc3QgY2hhciAqZmlyc3QsIGNvbnN0IGNoYXIgKnNlY29uZCwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwljaGFyICpuYW1lOworCisJZmlyc3QgKz0gNDsJLyogc2tpcCAiLS0tICIgKi8KKwlzZWNvbmQgKz0gNDsJLyogc2tpcCAiKysrICIgKi8KKwlpZiAoIXBfdmFsdWVfa25vd24pIHsKKwkJaW50IHAsIHE7CisJCXAgPSBndWVzc19wX3ZhbHVlKGZpcnN0KTsKKwkJcSA9IGd1ZXNzX3BfdmFsdWUoc2Vjb25kKTsKKwkJaWYgKHAgPCAwKSBwID0gcTsKKwkJaWYgKDAgPD0gcCAmJiBwID09IHEpIHsKKwkJCXBfdmFsdWUgPSBwOworCQkJcF92YWx1ZV9rbm93biA9IDE7CisJCX0KKwl9CisJaWYgKGlzX2Rldl9udWxsKGZpcnN0KSkgeworCQlwYXRjaC0+aXNfbmV3ID0gMTsKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDA7CisJCW5hbWUgPSBmaW5kX25hbWUoc2Vjb25kLCBOVUxMLCBwX3ZhbHVlLCBURVJNX1NQQUNFIHwgVEVSTV9UQUIpOworCQlwYXRjaC0+bmV3X25hbWUgPSBuYW1lOworCX0gZWxzZSBpZiAoaXNfZGV2X251bGwoc2Vjb25kKSkgeworCQlwYXRjaC0+aXNfbmV3ID0gMDsKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDE7CisJCW5hbWUgPSBmaW5kX25hbWUoZmlyc3QsIE5VTEwsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5vbGRfbmFtZSA9IG5hbWU7CisJfSBlbHNlIHsKKwkJbmFtZSA9IGZpbmRfbmFtZShmaXJzdCwgTlVMTCwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJbmFtZSA9IGZpbmRfbmFtZShzZWNvbmQsIG5hbWUsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5vbGRfbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA9IG5hbWU7CisJfQorCWlmICghbmFtZSkKKwkJZGllKCJ1bmFibGUgdG8gZmluZCBmaWxlbmFtZSBpbiBwYXRjaCBhdCBsaW5lICVkIiwgbGluZW5yKTsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2hkcmVuZChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFdlJ3JlIGFuYWwgYWJvdXQgZGlmZiBoZWFkZXIgY29uc2lzdGVuY3ksIHRvIG1ha2UKKyAqIHN1cmUgdGhhdCB3ZSBkb24ndCBlbmQgdXAgaGF2aW5nIHN0cmFuZ2UgYW1iaWd1b3VzCisgKiBwYXRjaGVzIGZsb2F0aW5nIGFyb3VuZC4KKyAqCisgKiBBcyBhIHJlc3VsdCwgZ2l0ZGlmZl97b2xkfG5ld31uYW1lKCkgd2lsbCBjaGVjaworICogdGhlaXIgbmFtZXMgYWdhaW5zdCBhbnkgcHJldmlvdXMgaW5mb3JtYXRpb24sIGp1c3QKKyAqIHRvIG1ha2Ugc3VyZS4uCisgKi8KK3N0YXRpYyBjaGFyICpnaXRkaWZmX3ZlcmlmeV9uYW1lKGNvbnN0IGNoYXIgKmxpbmUsIGludCBpc251bGwsIGNoYXIgKm9yaWdfbmFtZSwgY29uc3QgY2hhciAqb2xkbmV3KQoreworCWlmICghb3JpZ19uYW1lICYmICFpc251bGwpCisJCXJldHVybiBmaW5kX25hbWUobGluZSwgTlVMTCwgcF92YWx1ZSwgVEVSTV9UQUIpOworCisJaWYgKG9yaWdfbmFtZSkgeworCQlpbnQgbGVuOworCQljb25zdCBjaGFyICpuYW1lOworCQljaGFyICphbm90aGVyOworCQluYW1lID0gb3JpZ19uYW1lOworCQlsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChpc251bGwpCisJCQlkaWUoImdpdC1hcHBseTogYmFkIGdpdC1kaWZmIC0gZXhwZWN0ZWQgL2Rldi9udWxsLCBnb3QgJXMgb24gbGluZSAlZCIsIG5hbWUsIGxpbmVucik7CisJCWFub3RoZXIgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgcF92YWx1ZSwgVEVSTV9UQUIpOworCQlpZiAoIWFub3RoZXIgfHwgbWVtY21wKGFub3RoZXIsIG5hbWUsIGxlbikpCisJCQlkaWUoImdpdC1hcHBseTogYmFkIGdpdC1kaWZmIC0gaW5jb25zaXN0ZW50ICVzIGZpbGVuYW1lIG9uIGxpbmUgJWQiLCBvbGRuZXcsIGxpbmVucik7CisJCWZyZWUoYW5vdGhlcik7CisJCXJldHVybiBvcmlnX25hbWU7CisJfQorCWVsc2UgeworCQkvKiBleHBlY3QgIi9kZXYvbnVsbCIgKi8KKwkJaWYgKG1lbWNtcCgiL2Rldi9udWxsIiwgbGluZSwgOSkgfHwgbGluZVs5XSAhPSAnXG4nKQorCQkJZGllKCJnaXQtYXBwbHk6IGJhZCBnaXQtZGlmZiAtIGV4cGVjdGVkIC9kZXYvbnVsbCBvbiBsaW5lICVkIiwgbGluZW5yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGdpdGRpZmZfb2xkbmFtZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5vbGRfbmFtZSA9IGdpdGRpZmZfdmVyaWZ5X25hbWUobGluZSwgcGF0Y2gtPmlzX25ldywgcGF0Y2gtPm9sZF9uYW1lLCAib2xkIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9uZXduYW1lKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPm5ld19uYW1lID0gZ2l0ZGlmZl92ZXJpZnlfbmFtZShsaW5lLCBwYXRjaC0+aXNfZGVsZXRlLCBwYXRjaC0+bmV3X25hbWUsICJuZXciKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX29sZG1vZGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+b2xkX21vZGUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfbmV3bW9kZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5uZXdfbW9kZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9kZWxldGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfZGVsZXRlID0gMTsKKwlwYXRjaC0+b2xkX25hbWUgPSBwYXRjaC0+ZGVmX25hbWU7CisJcmV0dXJuIGdpdGRpZmZfb2xkbW9kZShsaW5lLCBwYXRjaCk7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9uZXdmaWxlKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX25ldyA9IDE7CisJcGF0Y2gtPm5ld19uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCXJldHVybiBnaXRkaWZmX25ld21vZGUobGluZSwgcGF0Y2gpOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfY29weXNyYyhjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19jb3B5ID0gMTsKKwlwYXRjaC0+b2xkX25hbWUgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9jb3B5ZHN0KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX2NvcHkgPSAxOworCXBhdGNoLT5uZXdfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3JlbmFtZXNyYyhjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19yZW5hbWUgPSAxOworCXBhdGNoLT5vbGRfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3JlbmFtZWRzdChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19yZW5hbWUgPSAxOworCXBhdGNoLT5uZXdfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3NpbWlsYXJpdHkoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAoKHBhdGNoLT5zY29yZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgMTApKSA9PSBVTE9OR19NQVgpCisJCXBhdGNoLT5zY29yZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9kaXNzaW1pbGFyaXR5KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaWYgKChwYXRjaC0+c2NvcmUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDEwKSkgPT0gVUxPTkdfTUFYKQorCQlwYXRjaC0+c2NvcmUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfaW5kZXgoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwkvKiBpbmRleCBsaW5lIGlzIE4gaGV4YWRlY2ltYWwsICIuLiIsIE4gaGV4YWRlY2ltYWwsCisJICogYW5kIG9wdGlvbmFsIHNwYWNlIHdpdGggb2N0YWwgbW9kZS4KKwkgKi8KKwljb25zdCBjaGFyICpwdHIsICplb2w7CisJaW50IGxlbjsKKworCXB0ciA9IHN0cmNocihsaW5lLCAnLicpOworCWlmICghcHRyIHx8IHB0clsxXSAhPSAnLicgfHwgNDAgPCBwdHIgLSBsaW5lKQorCQlyZXR1cm4gMDsKKwlsZW4gPSBwdHIgLSBsaW5lOworCW1lbWNweShwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBsaW5lLCBsZW4pOworCXBhdGNoLT5vbGRfc2hhMV9wcmVmaXhbbGVuXSA9IDA7CisKKwlsaW5lID0gcHRyICsgMjsKKwlwdHIgPSBzdHJjaHIobGluZSwgJyAnKTsKKwllb2wgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisKKwlpZiAoIXB0ciB8fCBlb2wgPCBwdHIpCisJCXB0ciA9IGVvbDsKKwlsZW4gPSBwdHIgLSBsaW5lOworCisJaWYgKDQwIDwgbGVuKQorCQlyZXR1cm4gMDsKKwltZW1jcHkocGF0Y2gtPm5ld19zaGExX3ByZWZpeCwgbGluZSwgbGVuKTsKKwlwYXRjaC0+bmV3X3NoYTFfcHJlZml4W2xlbl0gPSAwOworCWlmICgqcHRyID09ICcgJykKKwkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlID0gc3RydG91bChwdHIrMSwgTlVMTCwgOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIG5vcm1hbCBmb3IgYSBkaWZmIHRoYXQgZG9lc24ndCBjaGFuZ2UgYW55dGhpbmc6IHdlJ2xsIGZhbGwgdGhyb3VnaAorICogaW50byB0aGUgbmV4dCBkaWZmLiBUZWxsIHRoZSBwYXJzZXIgdG8gYnJlYWsgb3V0LgorICovCitzdGF0aWMgaW50IGdpdGRpZmZfdW5yZWNvZ25pemVkKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RvcF9hdF9zbGFzaChjb25zdCBjaGFyICpsaW5lLCBpbnQgbGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsbGVuOyBpKyspIHsKKwkJaW50IGNoID0gbGluZVtpXTsKKwkJaWYgKGNoID09ICcvJykKKwkJCXJldHVybiBsaW5lICsgaTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoaXMgaXMgdG8gZXh0cmFjdCB0aGUgc2FtZSBuYW1lIHRoYXQgYXBwZWFycyBvbiAiZGlmZiAtLWdpdCIKKyAqIGxpbmUuICBXZSBkbyBub3QgZmluZCBhbmQgcmV0dXJuIGFueXRoaW5nIGlmIGl0IGlzIGEgcmVuYW1lCisgKiBwYXRjaCwgYW5kIGl0IGlzIE9LIGJlY2F1c2Ugd2Ugd2lsbCBmaW5kIHRoZSBuYW1lIGVsc2V3aGVyZS4KKyAqIFdlIG5lZWQgdG8gcmVsaWFibHkgZmluZCBuYW1lIG9ubHkgd2hlbiBpdCBpcyBtb2RlLWNoYW5nZSBvbmx5LAorICogY3JlYXRpb24gb3IgZGVsZXRpb24gb2YgYW4gZW1wdHkgZmlsZS4gIEluIGFueSBvZiB0aGVzZSBjYXNlcywKKyAqIGJvdGggc2lkZXMgYXJlIHRoZSBzYW1lIG5hbWUgdW5kZXIgYS8gYW5kIGIvIHJlc3BlY3RpdmVseS4KKyAqLworc3RhdGljIGNoYXIgKmdpdF9oZWFkZXJfbmFtZShjaGFyICpsaW5lLCBpbnQgbGxlbikKK3sKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqc2Vjb25kID0gTlVMTDsKKworCWxpbmUgKz0gc3RybGVuKCJkaWZmIC0tZ2l0ICIpOworCWxsZW4gLT0gc3RybGVuKCJkaWZmIC0tZ2l0ICIpOworCisJaWYgKCpsaW5lID09ICciJykgeworCQljb25zdCBjaGFyICpjcDsKKwkJY2hhciAqZmlyc3QgPSB1bnF1b3RlX2Nfc3R5bGUobGluZSwgJnNlY29uZCk7CisJCWlmICghZmlyc3QpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBhZHZhbmNlIHRvIHRoZSBmaXJzdCBzbGFzaCAqLworCQljcCA9IHN0b3BfYXRfc2xhc2goZmlyc3QsIHN0cmxlbihmaXJzdCkpOworCQlpZiAoIWNwIHx8IGNwID09IGZpcnN0KSB7CisJCQkvKiB3ZSBkbyBub3QgYWNjZXB0IGFic29sdXRlIHBhdGhzICovCisJCWZyZWVfZmlyc3RfYW5kX2ZhaWw6CisJCQlmcmVlKGZpcnN0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxlbiA9IHN0cmxlbihjcCsxKTsKKwkJbWVtbW92ZShmaXJzdCwgY3ArMSwgbGVuKzEpOyAvKiBpbmNsdWRpbmcgTlVMICovCisKKwkJLyogc2Vjb25kIHBvaW50cyBhdCBvbmUgcGFzdCBjbG9zaW5nIGRxIG9mIG5hbWUuCisJCSAqIGZpbmQgdGhlIHNlY29uZCBuYW1lLgorCQkgKi8KKwkJd2hpbGUgKChzZWNvbmQgPCBsaW5lICsgbGxlbikgJiYgaXNzcGFjZSgqc2Vjb25kKSkKKwkJCXNlY29uZCsrOworCisJCWlmIChsaW5lICsgbGxlbiA8PSBzZWNvbmQpCisJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCWlmICgqc2Vjb25kID09ICciJykgeworCQkJY2hhciAqc3AgPSB1bnF1b3RlX2Nfc3R5bGUoc2Vjb25kLCBOVUxMKTsKKwkJCWlmICghc3ApCisJCQkJZ290byBmcmVlX2ZpcnN0X2FuZF9mYWlsOworCQkJY3AgPSBzdG9wX2F0X3NsYXNoKHNwLCBzdHJsZW4oc3ApKTsKKwkJCWlmICghY3AgfHwgY3AgPT0gc3ApIHsKKwkJCWZyZWVfYm90aF9hbmRfZmFpbDoKKwkJCQlmcmVlKHNwKTsKKwkJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCQl9CisJCQkvKiBUaGV5IG11c3QgbWF0Y2gsIG90aGVyd2lzZSBpZ25vcmUgKi8KKwkJCWlmIChzdHJjbXAoY3ArMSwgZmlyc3QpKQorCQkJCWdvdG8gZnJlZV9ib3RoX2FuZF9mYWlsOworCQkJZnJlZShzcCk7CisJCQlyZXR1cm4gZmlyc3Q7CisJCX0KKworCQkvKiB1bnF1b3RlZCBzZWNvbmQgKi8KKwkJY3AgPSBzdG9wX2F0X3NsYXNoKHNlY29uZCwgbGluZSArIGxsZW4gLSBzZWNvbmQpOworCQlpZiAoIWNwIHx8IGNwID09IHNlY29uZCkKKwkJCWdvdG8gZnJlZV9maXJzdF9hbmRfZmFpbDsKKwkJY3ArKzsKKwkJaWYgKGxpbmUgKyBsbGVuIC0gY3AgIT0gbGVuICsgMSB8fAorCQkgICAgbWVtY21wKGZpcnN0LCBjcCwgbGVuKSkKKwkJCWdvdG8gZnJlZV9maXJzdF9hbmRfZmFpbDsKKwkJcmV0dXJuIGZpcnN0OworCX0KKworCS8qIHVucXVvdGVkIGZpcnN0IG5hbWUgKi8KKwluYW1lID0gc3RvcF9hdF9zbGFzaChsaW5lLCBsbGVuKTsKKwlpZiAoIW5hbWUgfHwgbmFtZSA9PSBsaW5lKQorCQlyZXR1cm4gTlVMTDsKKworCW5hbWUrKzsKKworCS8qIHNpbmNlIHRoZSBmaXJzdCBuYW1lIGlzIHVucXVvdGVkLCBhIGRxIGlmIGV4aXN0cyBtdXN0IGJlCisJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIG5hbWUuCisJICovCisJZm9yIChzZWNvbmQgPSBuYW1lOyBzZWNvbmQgPCBsaW5lICsgbGxlbjsgc2Vjb25kKyspIHsKKwkJaWYgKCpzZWNvbmQgPT0gJyInKSB7CisJCQljb25zdCBjaGFyICpjcCA9IHNlY29uZDsKKwkJCWNvbnN0IGNoYXIgKm5wOworCQkJY2hhciAqc3AgPSB1bnF1b3RlX2Nfc3R5bGUoc2Vjb25kLCBOVUxMKTsKKworCQkJaWYgKCFzcCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW5wID0gc3RvcF9hdF9zbGFzaChzcCwgc3RybGVuKHNwKSk7CisJCQlpZiAoIW5wIHx8IG5wID09IHNwKSB7CisJCQlmcmVlX3NlY29uZF9hbmRfZmFpbDoKKwkJCQlmcmVlKHNwKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW5wKys7CisJCQlsZW4gPSBzdHJsZW4obnApOworCQkJaWYgKGxlbiA8IGNwIC0gbmFtZSAmJgorCQkJICAgICFzdHJuY21wKG5wLCBuYW1lLCBsZW4pICYmCisJCQkgICAgaXNzcGFjZShuYW1lW2xlbl0pKSB7CisJCQkJLyogR29vZCAqLworCQkJCW1lbW1vdmUoc3AsIG5wLCBsZW4gKyAxKTsKKwkJCQlyZXR1cm4gc3A7CisJCQl9CisJCQlnb3RvIGZyZWVfc2Vjb25kX2FuZF9mYWlsOworCQl9CisJfQorCisJLyoKKwkgKiBBY2NlcHQgYSBuYW1lIG9ubHkgaWYgaXQgc2hvd3MgdXAgdHdpY2UsIGV4YWN0bHkgdGhlIHNhbWUKKwkgKiBmb3JtLgorCSAqLworCWZvciAobGVuID0gMCA7IDsgbGVuKyspIHsKKwkJc3dpdGNoIChuYW1lW2xlbl0pIHsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQljYXNlICdcbic6CisJCQlyZXR1cm4gTlVMTDsKKwkJY2FzZSAnXHQnOiBjYXNlICcgJzoKKwkJCXNlY29uZCA9IG5hbWUrbGVuOworCQkJZm9yICg7OykgeworCQkJCWNoYXIgYyA9ICpzZWNvbmQrKzsKKwkJCQlpZiAoYyA9PSAnXG4nKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlpZiAoYyA9PSAnLycpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNlY29uZFtsZW5dID09ICdcbicgJiYgIW1lbWNtcChuYW1lLCBzZWNvbmQsIGxlbikpIHsKKwkJCQljaGFyICpyZXQgPSB4bWFsbG9jKGxlbiArIDEpOworCQkJCW1lbWNweShyZXQsIG5hbWUsIGxlbik7CisJCQkJcmV0W2xlbl0gPSAwOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFZlcmlmeSB0aGF0IHdlIHJlY29nbml6ZSB0aGUgbGluZXMgZm9sbG93aW5nIGEgZ2l0IGhlYWRlciAqLworc3RhdGljIGludCBwYXJzZV9naXRfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sIHVuc2lnbmVkIGludCBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyogQSBnaXQgZGlmZiBoYXMgZXhwbGljaXQgbmV3L2RlbGV0ZSBpbmZvcm1hdGlvbiwgc28gd2UgZG9uJ3QgZ3Vlc3MgKi8KKwlwYXRjaC0+aXNfbmV3ID0gMDsKKwlwYXRjaC0+aXNfZGVsZXRlID0gMDsKKworCS8qCisJICogU29tZSB0aGluZ3MgbWF5IG5vdCBoYXZlIHRoZSBvbGQgbmFtZSBpbiB0aGUKKwkgKiByZXN0IG9mIHRoZSBoZWFkZXJzIGFueXdoZXJlIChwdXJlIG1vZGUgY2hhbmdlcywKKwkgKiBvciByZW1vdmluZyBvciBhZGRpbmcgZW1wdHkgZmlsZXMpLCBzbyB3ZSBnZXQKKwkgKiB0aGUgZGVmYXVsdCBuYW1lIGZyb20gdGhlIGhlYWRlci4KKwkgKi8KKwlwYXRjaC0+ZGVmX25hbWUgPSBnaXRfaGVhZGVyX25hbWUobGluZSwgbGVuKTsKKworCWxpbmUgKz0gbGVuOworCXNpemUgLT0gbGVuOworCWxpbmVucisrOworCWZvciAob2Zmc2V0ID0gbGVuIDsgc2l6ZSA+IDAgOyBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlbnRyeSB7CisJCQljb25zdCBjaGFyICpzdHI7CisJCQlpbnQgKCpmbikoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcGF0Y2ggKik7CisJCX0gb3B0YWJsZVtdID0geworCQkJeyAiQEAgLSIsIGdpdGRpZmZfaGRyZW5kIH0sCisJCQl7ICItLS0gIiwgZ2l0ZGlmZl9vbGRuYW1lIH0sCisJCQl7ICIrKysgIiwgZ2l0ZGlmZl9uZXduYW1lIH0sCisJCQl7ICJvbGQgbW9kZSAiLCBnaXRkaWZmX29sZG1vZGUgfSwKKwkJCXsgIm5ldyBtb2RlICIsIGdpdGRpZmZfbmV3bW9kZSB9LAorCQkJeyAiZGVsZXRlZCBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9kZWxldGUgfSwKKwkJCXsgIm5ldyBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9uZXdmaWxlIH0sCisJCQl7ICJjb3B5IGZyb20gIiwgZ2l0ZGlmZl9jb3B5c3JjIH0sCisJCQl7ICJjb3B5IHRvICIsIGdpdGRpZmZfY29weWRzdCB9LAorCQkJeyAicmVuYW1lIG9sZCAiLCBnaXRkaWZmX3JlbmFtZXNyYyB9LAorCQkJeyAicmVuYW1lIG5ldyAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAicmVuYW1lIGZyb20gIiwgZ2l0ZGlmZl9yZW5hbWVzcmMgfSwKKwkJCXsgInJlbmFtZSB0byAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAic2ltaWxhcml0eSBpbmRleCAiLCBnaXRkaWZmX3NpbWlsYXJpdHkgfSwKKwkJCXsgImRpc3NpbWlsYXJpdHkgaW5kZXggIiwgZ2l0ZGlmZl9kaXNzaW1pbGFyaXR5IH0sCisJCQl7ICJpbmRleCAiLCBnaXRkaWZmX2luZGV4IH0sCisJCQl7ICIiLCBnaXRkaWZmX3VucmVjb2duaXplZCB9LAorCQl9OworCQlpbnQgaTsKKworCQlsZW4gPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCQlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGFibGUpOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCBvcGVudHJ5ICpwID0gb3B0YWJsZSArIGk7CisJCQlpbnQgb3BsZW4gPSBzdHJsZW4ocC0+c3RyKTsKKwkJCWlmIChsZW4gPCBvcGxlbiB8fCBtZW1jbXAocC0+c3RyLCBsaW5lLCBvcGxlbikpCisJCQkJY29udGludWU7CisJCQlpZiAocC0+Zm4obGluZSArIG9wbGVuLCBwYXRjaCkgPCAwKQorCQkJCXJldHVybiBvZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNvbnN0IGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgKnApCit7CisJY2hhciAqcHRyOworCisJaWYgKCFpc2RpZ2l0KCpsaW5lKSkKKwkJcmV0dXJuIDA7CisJKnAgPSBzdHJ0b3VsKGxpbmUsICZwdHIsIDEwKTsKKwlyZXR1cm4gcHRyIC0gbGluZTsKK30KKworc3RhdGljIGludCBwYXJzZV9yYW5nZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpleHBlY3QsCisJCQl1bnNpZ25lZCBsb25nICpwMSwgdW5zaWduZWQgbG9uZyAqcDIpCit7CisJaW50IGRpZ2l0cywgZXg7CisKKwlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuKQorCQlyZXR1cm4gLTE7CisJbGluZSArPSBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKworCWRpZ2l0cyA9IHBhcnNlX251bShsaW5lLCBwMSk7CisJaWYgKCFkaWdpdHMpCisJCXJldHVybiAtMTsKKworCW9mZnNldCArPSBkaWdpdHM7CisJbGluZSArPSBkaWdpdHM7CisJbGVuIC09IGRpZ2l0czsKKworCSpwMiA9IDE7CisJaWYgKCpsaW5lID09ICcsJykgeworCQlkaWdpdHMgPSBwYXJzZV9udW0obGluZSsxLCBwMik7CisJCWlmICghZGlnaXRzKQorCQkJcmV0dXJuIC0xOworCisJCW9mZnNldCArPSBkaWdpdHMrMTsKKwkJbGluZSArPSBkaWdpdHMrMTsKKwkJbGVuIC09IGRpZ2l0cysxOworCX0KKworCWV4ID0gc3RybGVuKGV4cGVjdCk7CisJaWYgKGV4ID4gbGVuKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChsaW5lLCBleHBlY3QsIGV4KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG9mZnNldCArIGV4OworfQorCisvKgorICogUGFyc2UgYSB1bmlmaWVkIGRpZmYgZnJhZ21lbnQgaGVhZGVyIG9mIHRoZQorICogZm9ybSAiQEAgLWEsYiArYyxkIEBAIgorICovCitzdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50X2hlYWRlcihjaGFyICpsaW5lLCBpbnQgbGVuLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50KQoreworCWludCBvZmZzZXQ7CisKKwlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBmcmFnbWVudCAqLworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgNCwgIiArIiwgJmZyYWdtZW50LT5vbGRwb3MsICZmcmFnbWVudC0+b2xkbGluZXMpOworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgb2Zmc2V0LCAiIEBAIiwgJmZyYWdtZW50LT5uZXdwb3MsICZmcmFnbWVudC0+bmV3bGluZXMpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBmaW5kX2hlYWRlcihjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCAqaGRyc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGVuOworCisJcGF0Y2gtPmlzX3RvcGxldmVsX3JlbGF0aXZlID0gMDsKKwlwYXRjaC0+aXNfcmVuYW1lID0gcGF0Y2gtPmlzX2NvcHkgPSAwOworCXBhdGNoLT5pc19uZXcgPSBwYXRjaC0+aXNfZGVsZXRlID0gLTE7CisJcGF0Y2gtPm9sZF9tb2RlID0gcGF0Y2gtPm5ld19tb2RlID0gMDsKKwlwYXRjaC0+b2xkX25hbWUgPSBwYXRjaC0+bmV3X25hbWUgPSBOVUxMOworCWZvciAob2Zmc2V0ID0gMDsgc2l6ZSA+IDA7IG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJdW5zaWduZWQgbG9uZyBuZXh0bGVuOworCisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJLyogVGVzdGluZyB0aGlzIGVhcmx5IGFsbG93cyB1cyB0byB0YWtlIGEgZmV3IHNob3J0Y3V0cy4uICovCisJCWlmIChsZW4gPCA2KQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGRvbid0IGZpbmQgYW55IHVuY29ubmVjdGVkIHBhdGNoIGZyYWdtZW50cy4KKwkJICogVGhhdCdzIGEgc2lnbiB0aGF0IHdlIGRpZG4ndCBmaW5kIGEgaGVhZGVyLCBhbmQgdGhhdCBhCisJCSAqIHBhdGNoIGhhcyBiZWNvbWUgY29ycnVwdGVkL2Jyb2tlbiB1cC4KKwkJICovCisJCWlmICghbWVtY21wKCJAQCAtIiwgbGluZSwgNCkpIHsKKwkJCXN0cnVjdCBmcmFnbWVudCBkdW1teTsKKwkJCWlmIChwYXJzZV9mcmFnbWVudF9oZWFkZXIobGluZSwgbGVuLCAmZHVtbXkpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWRpZSgicGF0Y2ggZnJhZ21lbnQgd2l0aG91dCBoZWFkZXIgYXQgbGluZSAlZDogJS4qcyIsCisJCQkgICAgbGluZW5yLCAoaW50KWxlbi0xLCBsaW5lKTsKKwkJfQorCisJCWlmIChzaXplIDwgbGVuICsgNikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEdpdCBwYXRjaD8gSXQgbWlnaHQgbm90IGhhdmUgYSByZWFsIHBhdGNoLCBqdXN0IGEgcmVuYW1lCisJCSAqIG9yIG1vZGUgY2hhbmdlLCBzbyB3ZSBoYW5kbGUgdGhhdCBzcGVjaWFsbHkKKwkJICovCisJCWlmICghbWVtY21wKCJkaWZmIC0tZ2l0ICIsIGxpbmUsIDExKSkgeworCQkJaW50IGdpdF9oZHJfbGVuID0gcGFyc2VfZ2l0X2hlYWRlcihsaW5lLCBsZW4sIHNpemUsIHBhdGNoKTsKKwkJCWlmIChnaXRfaGRyX2xlbiA8PSBsZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoIXBhdGNoLT5vbGRfbmFtZSAmJiAhcGF0Y2gtPm5ld19uYW1lKSB7CisJCQkJaWYgKCFwYXRjaC0+ZGVmX25hbWUpCisJCQkJCWRpZSgiZ2l0IGRpZmYgaGVhZGVyIGxhY2tzIGZpbGVuYW1lIGluZm9ybWF0aW9uIChsaW5lICVkKSIsIGxpbmVucik7CisJCQkJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCQkJfQorCQkJcGF0Y2gtPmlzX3RvcGxldmVsX3JlbGF0aXZlID0gMTsKKwkJCSpoZHJzaXplID0gZ2l0X2hkcl9sZW47CisJCQlyZXR1cm4gb2Zmc2V0OworCQl9CisKKwkJLyoqIC0tLSBmb2xsb3dlZCBieSArKysgPyAqLworCQlpZiAobWVtY21wKCItLS0gIiwgbGluZSwgIDQpIHx8IG1lbWNtcCgiKysrICIsIGxpbmUgKyBsZW4sIDQpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2Ugb25seSBhY2NlcHQgdW5pZmllZCBwYXRjaGVzLCBzbyB3ZSB3YW50IGl0IHRvCisJCSAqIGF0IGxlYXN0IGhhdmUgIkBAIC1hLGIgK2MsZCBAQFxuIiwgd2hpY2ggaXMgMTQgY2hhcnMKKwkJICogbWluaW11bQorCQkgKi8KKwkJbmV4dGxlbiA9IGxpbmVsZW4obGluZSArIGxlbiwgc2l6ZSAtIGxlbik7CisJCWlmIChzaXplIDwgbmV4dGxlbiArIDE0IHx8IG1lbWNtcCgiQEAgLSIsIGxpbmUgKyBsZW4gKyBuZXh0bGVuLCA0KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE9rLCB3ZSdsbCBjb25zaWRlciBpdCBhIHBhdGNoICovCisJCXBhcnNlX3RyYWRpdGlvbmFsX3BhdGNoKGxpbmUsIGxpbmUrbGVuLCBwYXRjaCk7CisJCSpoZHJzaXplID0gbGVuICsgbmV4dGxlbjsKKwkJbGluZW5yICs9IDI7CisJCXJldHVybiBvZmZzZXQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfd2hpdGVzcGFjZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKmVyciA9ICJBZGRzIHRyYWlsaW5nIHdoaXRlc3BhY2UiOworCWludCBzZWVuX3NwYWNlID0gMDsKKwlpbnQgaTsKKworCS8qCisJICogV2Uga25vdyBsZW4gaXMgYXQgbGVhc3QgdHdvLCBzaW5jZSB3ZSBoYXZlIGEgJysnIGFuZCB3ZQorCSAqIGNoZWNrZWQgdGhhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgd2FzIGEgJ1xuJyBiZWZvcmUgY2FsbGluZworCSAqIHRoaXMgZnVuY3Rpb24uICBUaGF0IGlzLCBhbiBhZGRpdGlvbiBvZiBhbiBlbXB0eSBsaW5lIHdvdWxkCisJICogY2hlY2sgdGhlICcrJyBoZXJlLiAgU25lYWt5Li4uCisJICovCisJaWYgKGlzc3BhY2UobGluZVtsZW4tMl0pKQorCQlnb3RvIGVycm9yOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBzcGFjZSBmb2xsb3dlZCBieSBhIHRhYiBpbgorCSAqIGluZGVudGF0aW9uLgorCSAqLworCWVyciA9ICJTcGFjZSBpbiBpbmRlbnQgaXMgZm9sbG93ZWQgYnkgYSB0YWIiOworCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQlpZiAobGluZVtpXSA9PSAnXHQnKSB7CisJCQlpZiAoc2Vlbl9zcGFjZSkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCWVsc2UgaWYgKGxpbmVbaV0gPT0gJyAnKQorCQkJc2Vlbl9zcGFjZSA9IDE7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47CisKKyBlcnJvcjoKKwl3aGl0ZXNwYWNlX2Vycm9yKys7CisJaWYgKHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnMgJiYKKwkgICAgc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA8IHdoaXRlc3BhY2VfZXJyb3IpCisJCTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiJXMuXG4lczolZDolLipzXG4iLAorCQkJZXJyLCBwYXRjaF9pbnB1dF9maWxlLCBsaW5lbnIsIGxlbi0yLCBsaW5lKzEpOworfQorCisKKy8qCisgKiBQYXJzZSBhIHVuaWZpZWQgZGlmZi4gTm90ZSB0aGF0IHRoaXMgcmVhbGx5IG5lZWRzIHRvIHBhcnNlIGVhY2gKKyAqIGZyYWdtZW50IHNlcGFyYXRlbHksIHNpbmNlIHRoZSBvbmx5IHdheSB0byBrbm93IHRoZSBkaWZmZXJlbmNlCisgKiBiZXR3ZWVuIGEgIi0tLSIgdGhhdCBpcyBwYXJ0IG9mIGEgcGF0Y2gsIGFuZCBhICItLS0iIHRoYXQgc3RhcnRzCisgKiB0aGUgbmV4dCBwYXRjaCBpcyB0byBsb29rIGF0IHRoZSBsaW5lIGNvdW50cy4uCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZnJhZ21lbnQoY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50KQoreworCWludCBhZGRlZCwgZGVsZXRlZDsKKwlpbnQgbGVuID0gbGluZWxlbihsaW5lLCBzaXplKSwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2xkbGluZXMsIG5ld2xpbmVzOworCXVuc2lnbmVkIGxvbmcgbGVhZGluZywgdHJhaWxpbmc7CisKKwlvZmZzZXQgPSBwYXJzZV9mcmFnbWVudF9oZWFkZXIobGluZSwgbGVuLCBmcmFnbWVudCk7CisJaWYgKG9mZnNldCA8IDApCisJCXJldHVybiAtMTsKKwlvbGRsaW5lcyA9IGZyYWdtZW50LT5vbGRsaW5lczsKKwluZXdsaW5lcyA9IGZyYWdtZW50LT5uZXdsaW5lczsKKwlsZWFkaW5nID0gMDsKKwl0cmFpbGluZyA9IDA7CisKKwkvKiBQYXJzZSB0aGUgdGhpbmcuLiAqLworCWxpbmUgKz0gbGVuOworCXNpemUgLT0gbGVuOworCWxpbmVucisrOworCWFkZGVkID0gZGVsZXRlZCA9IDA7CisJZm9yIChvZmZzZXQgPSBsZW47CisJICAgICAwIDwgc2l6ZTsKKwkgICAgIG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJaWYgKCFvbGRsaW5lcyAmJiAhbmV3bGluZXMpCisJCQlicmVhazsKKwkJbGVuID0gbGluZWxlbihsaW5lLCBzaXplKTsKKwkJaWYgKCFsZW4gfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJc3dpdGNoICgqbGluZSkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQljYXNlICdcbic6IC8qIG5ld2VyIEdOVSBkaWZmLCBhbiBlbXB0eSBjb250ZXh0IGxpbmUgKi8KKwkJY2FzZSAnICc6CisJCQlvbGRsaW5lcy0tOworCQkJbmV3bGluZXMtLTsKKwkJCWlmICghZGVsZXRlZCAmJiAhYWRkZWQpCisJCQkJbGVhZGluZysrOworCQkJdHJhaWxpbmcrKzsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCWlmIChhcHBseV9pbl9yZXZlcnNlICYmCisJCQkJCW5ld193aGl0ZXNwYWNlICE9IG5vd2Fybl93aGl0ZXNwYWNlKQorCQkJCWNoZWNrX3doaXRlc3BhY2UobGluZSwgbGVuKTsKKwkJCWRlbGV0ZWQrKzsKKwkJCW9sZGxpbmVzLS07CisJCQl0cmFpbGluZyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQlpZiAoIWFwcGx5X2luX3JldmVyc2UgJiYKKwkJCQkJbmV3X3doaXRlc3BhY2UgIT0gbm93YXJuX3doaXRlc3BhY2UpCisJCQkJY2hlY2tfd2hpdGVzcGFjZShsaW5lLCBsZW4pOworCQkJYWRkZWQrKzsKKwkJCW5ld2xpbmVzLS07CisJCQl0cmFpbGluZyA9IDA7CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIC8qIFdlIGFsbG93ICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiLiBEZXBlbmRpbmcKKyAgICAgICAgICAgICAgICAgKiBvbiBsb2NhbGUgc2V0dGluZ3Mgd2hlbiB0aGUgcGF0Y2ggd2FzIHByb2R1Y2VkIHdlCisgICAgICAgICAgICAgICAgICogZG9uJ3Qga25vdyB3aGF0IHRoaXMgbGluZSBsb29rcyBsaWtlLiBUaGUgb25seQorICAgICAgICAgICAgICAgICAqIHRoaW5nIHdlIGRvIGtub3cgaXMgdGhhdCBpdCBiZWdpbnMgd2l0aCAiXCAiLgorCQkgKiBDaGVja2luZyBmb3IgMTIgaXMganVzdCBmb3Igc2FuaXR5IGNoZWNrIC0tIGFueQorCQkgKiBsMTBuIG9mICJcIE5vIG5ld2xpbmUuLi4iIGlzIGF0IGxlYXN0IHRoYXQgbG9uZy4KKwkJICovCisJCWNhc2UgJ1xcJzoKKwkJCWlmIChsZW4gPCAxMiB8fCBtZW1jbXAobGluZSwgIlxcICIsIDIpKQorCQkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvbGRsaW5lcyB8fCBuZXdsaW5lcykKKwkJcmV0dXJuIC0xOworCWZyYWdtZW50LT5sZWFkaW5nID0gbGVhZGluZzsKKwlmcmFnbWVudC0+dHJhaWxpbmcgPSB0cmFpbGluZzsKKworCS8qIElmIGEgZnJhZ21lbnQgZW5kcyB3aXRoIGFuIGluY29tcGxldGUgbGluZSwgd2UgZmFpbGVkIHRvIGluY2x1ZGUKKwkgKiBpdCBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhpdCBvbGRsaW5lcyA9PSBuZXdsaW5lcyA9PSAwCisJICogYmVmb3JlIHNlZWluZyBpdC4KKwkgKi8KKwlpZiAoMTIgPCBzaXplICYmICFtZW1jbXAobGluZSwgIlxcICIsIDIpKQorCQlvZmZzZXQgKz0gbGluZWxlbihsaW5lLCBzaXplKTsKKworCXBhdGNoLT5saW5lc19hZGRlZCArPSBhZGRlZDsKKwlwYXRjaC0+bGluZXNfZGVsZXRlZCArPSBkZWxldGVkOworCisJaWYgKDAgPCBwYXRjaC0+aXNfbmV3ICYmIG9sZGxpbmVzKQorCQlyZXR1cm4gZXJyb3IoIm5ldyBmaWxlIGRlcGVuZHMgb24gb2xkIGNvbnRlbnRzIik7CisJaWYgKDAgPCBwYXRjaC0+aXNfZGVsZXRlICYmIG5ld2xpbmVzKQorCQlyZXR1cm4gZXJyb3IoImRlbGV0ZWQgZmlsZSBzdGlsbCBoYXMgY29udGVudHMiKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IHBhcnNlX3NpbmdsZV9wYXRjaChjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgb2xkbGluZXMgPSAwLCBuZXdsaW5lcyA9IDAsIGNvbnRleHQgPSAwOworCXN0cnVjdCBmcmFnbWVudCAqKmZyYWdwID0gJnBhdGNoLT5mcmFnbWVudHM7CisKKwl3aGlsZSAoc2l6ZSA+IDQgJiYgIW1lbWNtcChsaW5lLCAiQEAgLSIsIDQpKSB7CisJCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQ7CisJCWludCBsZW47CisKKwkJZnJhZ21lbnQgPSB4Y2FsbG9jKDEsIHNpemVvZigqZnJhZ21lbnQpKTsKKwkJbGVuID0gcGFyc2VfZnJhZ21lbnQobGluZSwgc2l6ZSwgcGF0Y2gsIGZyYWdtZW50KTsKKwkJaWYgKGxlbiA8PSAwKQorCQkJZGllKCJjb3JydXB0IHBhdGNoIGF0IGxpbmUgJWQiLCBsaW5lbnIpOworCQlmcmFnbWVudC0+cGF0Y2ggPSBsaW5lOworCQlmcmFnbWVudC0+c2l6ZSA9IGxlbjsKKwkJb2xkbGluZXMgKz0gZnJhZ21lbnQtPm9sZGxpbmVzOworCQluZXdsaW5lcyArPSBmcmFnbWVudC0+bmV3bGluZXM7CisJCWNvbnRleHQgKz0gZnJhZ21lbnQtPmxlYWRpbmcgKyBmcmFnbWVudC0+dHJhaWxpbmc7CisKKwkJKmZyYWdwID0gZnJhZ21lbnQ7CisJCWZyYWdwID0gJmZyYWdtZW50LT5uZXh0OworCisJCW9mZnNldCArPSBsZW47CisJCWxpbmUgKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisKKwkvKgorCSAqIElmIHNvbWV0aGluZyB3YXMgcmVtb3ZlZCAoaS5lLiB3ZSBoYXZlIG9sZC1saW5lcykgaXQgY2Fubm90CisJICogYmUgY3JlYXRpb24sIGFuZCBpZiBzb21ldGhpbmcgd2FzIGFkZGVkIGl0IGNhbm5vdCBiZQorCSAqIGRlbGV0aW9uLiAgSG93ZXZlciwgdGhlIHJldmVyc2UgaXMgbm90IHRydWU7IC0tdW5pZmllZD0wCisJICogcGF0Y2hlcyB0aGF0IG9ubHkgYWRkIGFyZSBub3QgbmVjZXNzYXJpbHkgY3JlYXRpb24gZXZlbgorCSAqIHRob3VnaCB0aGV5IGRvIG5vdCBoYXZlIGFueSBvbGQgbGluZXMsIGFuZCBvbmVzIHRoYXQgb25seQorCSAqIGRlbGV0ZSBhcmUgbm90IG5lY2Vzc2FyaWx5IGRlbGV0aW9uLgorCSAqCisJICogVW5mb3J0dW5hdGVseSwgYSByZWFsIGNyZWF0aW9uL2RlbGV0aW9uIHBhdGNoIGRvIF9ub3RfIGhhdmUKKwkgKiBhbnkgY29udGV4dCBsaW5lIGJ5IGRlZmluaXRpb24sIHNvIHdlIGNhbm5vdCBzYWZlbHkgdGVsbCBpdAorCSAqIGFwYXJ0IHdpdGggLS11bmlmaWVkPTAgaW5zYW5pdHkuICBBdCBsZWFzdCBpZiB0aGUgcGF0Y2ggaGFzCisJICogbW9yZSB0aGFuIG9uZSBodW5rIGl0IGlzIG5vdCBjcmVhdGlvbiBvciBkZWxldGlvbi4KKwkgKi8KKwlpZiAocGF0Y2gtPmlzX25ldyA8IDAgJiYKKwkgICAgKG9sZGxpbmVzIHx8IChwYXRjaC0+ZnJhZ21lbnRzICYmIHBhdGNoLT5mcmFnbWVudHMtPm5leHQpKSkKKwkJcGF0Y2gtPmlzX25ldyA9IDA7CisJaWYgKHBhdGNoLT5pc19kZWxldGUgPCAwICYmCisJICAgIChuZXdsaW5lcyB8fCAocGF0Y2gtPmZyYWdtZW50cyAmJiBwYXRjaC0+ZnJhZ21lbnRzLT5uZXh0KSkpCisJCXBhdGNoLT5pc19kZWxldGUgPSAwOworCWlmICghdW5pZGlmZl96ZXJvIHx8IGNvbnRleHQpIHsKKwkJLyogSWYgdGhlIHVzZXIgc2F5cyB0aGUgcGF0Y2ggaXMgbm90IGdlbmVyYXRlZCB3aXRoCisJCSAqIC0tdW5pZmllZD0wLCBvciBpZiB3ZSBoYXZlIHNlZW4gY29udGV4dCBsaW5lcywKKwkJICogdGhlbiBub3QgaGF2aW5nIG9sZGxpbmVzIG1lYW5zIHRoZSBwYXRjaCBpcyBjcmVhdGlvbiwKKwkJICogYW5kIG5vdCBoYXZpbmcgbmV3bGluZXMgbWVhbnMgdGhlIHBhdGNoIGlzIGRlbGV0aW9uLgorCQkgKi8KKwkJaWYgKHBhdGNoLT5pc19uZXcgPCAwICYmICFvbGRsaW5lcykgeworCQkJcGF0Y2gtPmlzX25ldyA9IDE7CisJCQlwYXRjaC0+b2xkX25hbWUgPSBOVUxMOworCQl9CisJCWlmIChwYXRjaC0+aXNfZGVsZXRlIDwgMCAmJiAhbmV3bGluZXMpIHsKKwkJCXBhdGNoLT5pc19kZWxldGUgPSAxOworCQkJcGF0Y2gtPm5ld19uYW1lID0gTlVMTDsKKwkJfQorCX0KKworCWlmICgwIDwgcGF0Y2gtPmlzX25ldyAmJiBvbGRsaW5lcykKKwkJZGllKCJuZXcgZmlsZSAlcyBkZXBlbmRzIG9uIG9sZCBjb250ZW50cyIsIHBhdGNoLT5uZXdfbmFtZSk7CisJaWYgKDAgPCBwYXRjaC0+aXNfZGVsZXRlICYmIG5ld2xpbmVzKQorCQlkaWUoImRlbGV0ZWQgZmlsZSAlcyBzdGlsbCBoYXMgY29udGVudHMiLCBwYXRjaC0+b2xkX25hbWUpOworCWlmICghcGF0Y2gtPmlzX2RlbGV0ZSAmJiAhbmV3bGluZXMgJiYgY29udGV4dCkKKwkJZnByaW50ZihzdGRlcnIsICIqKiB3YXJuaW5nOiBmaWxlICVzIGJlY29tZXMgZW1wdHkgYnV0ICIKKwkJCSJpcyBub3QgZGVsZXRlZFxuIiwgcGF0Y2gtPm5ld19uYW1lKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1ldGFkYXRhX2NoYW5nZXMoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlyZXR1cm4JcGF0Y2gtPmlzX3JlbmFtZSA+IDAgfHwKKwkJcGF0Y2gtPmlzX2NvcHkgPiAwIHx8CisJCXBhdGNoLT5pc19uZXcgPiAwIHx8CisJCXBhdGNoLT5pc19kZWxldGUgfHwKKwkJKHBhdGNoLT5vbGRfbW9kZSAmJiBwYXRjaC0+bmV3X21vZGUgJiYKKwkJIHBhdGNoLT5vbGRfbW9kZSAhPSBwYXRjaC0+bmV3X21vZGUpOworfQorCitzdGF0aWMgY2hhciAqaW5mbGF0ZV9pdChjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQl1bnNpZ25lZCBsb25nIGluZmxhdGVkX3NpemUpCit7CisJel9zdHJlYW0gc3RyZWFtOworCXZvaWQgKm91dDsKKwlpbnQgc3Q7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCisJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBvdXQgPSB4bWFsbG9jKGluZmxhdGVkX3NpemUpOworCXN0cmVhbS5hdmFpbF9vdXQgPSBpbmZsYXRlZF9zaXplOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCXN0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJaWYgKChzdCAhPSBaX1NUUkVBTV9FTkQpIHx8IHN0cmVhbS50b3RhbF9vdXQgIT0gaW5mbGF0ZWRfc2l6ZSkgeworCQlmcmVlKG91dCk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZyYWdtZW50ICpwYXJzZV9iaW5hcnlfaHVuayhjaGFyICoqYnVmX3AsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqc3pfcCwKKwkJCQkJICBpbnQgKnN0YXR1c19wLAorCQkJCQkgIGludCAqdXNlZF9wKQoreworCS8qIEV4cGVjdCBhIGxpbmUgdGhhdCBiZWdpbnMgd2l0aCBiaW5hcnkgcGF0Y2ggbWV0aG9kICgibGl0ZXJhbCIKKwkgKiBvciAiZGVsdGEiKSwgZm9sbG93ZWQgYnkgdGhlIGxlbmd0aCBvZiBkYXRhIGJlZm9yZSBkZWZsYXRpbmcuCisJICogYSBzZXF1ZW5jZSBvZiAnbGVuZ3RoLWJ5dGUnIGZvbGxvd2VkIGJ5IGJhc2UtODUgZW5jb2RlZCBkYXRhCisJICogc2hvdWxkIGZvbGxvdywgdGVybWluYXRlZCBieSBhIG5ld2xpbmUuCisJICoKKwkgKiBFYWNoIDUtYnl0ZSBzZXF1ZW5jZSBvZiBiYXNlLTg1IGVuY29kZXMgdXAgdG8gNCBieXRlcywKKwkgKiBhbmQgd2Ugd291bGQgbGltaXQgdGhlIHBhdGNoIGxpbmUgdG8gNjYgY2hhcmFjdGVycywKKwkgKiBzbyBvbmUgbGluZSBjYW4gZml0IHVwIHRvIDEzIGdyb3VwcyB0aGF0IHdvdWxkIGRlY29kZQorCSAqIHRvIDUyIGJ5dGVzIG1heC4gIFRoZSBsZW5ndGggYnl0ZSAnQSctJ1onIGNvcnJlc3BvbmRzCisJICogdG8gMS0yNiBieXRlcywgYW5kICdhJy0neicgY29ycmVzcG9uZHMgdG8gMjctNTIgYnl0ZXMuCisJICovCisJaW50IGxsZW4sIHVzZWQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gKnN6X3A7CisJY2hhciAqYnVmZmVyID0gKmJ1Zl9wOworCWludCBwYXRjaF9tZXRob2Q7CisJdW5zaWduZWQgbG9uZyBvcmlnbGVuOworCWNoYXIgKmRhdGEgPSBOVUxMOworCWludCBodW5rX3NpemUgPSAwOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZzsKKworCWxsZW4gPSBsaW5lbGVuKGJ1ZmZlciwgc2l6ZSk7CisJdXNlZCA9IGxsZW47CisKKwkqc3RhdHVzX3AgPSAwOworCisJaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAiZGVsdGEgIikpIHsKKwkJcGF0Y2hfbWV0aG9kID0gQklOQVJZX0RFTFRBX0RFRkxBVEVEOworCQlvcmlnbGVuID0gc3RydG91bChidWZmZXIgKyA2LCBOVUxMLCAxMCk7CisJfQorCWVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAibGl0ZXJhbCAiKSkgeworCQlwYXRjaF9tZXRob2QgPSBCSU5BUllfTElURVJBTF9ERUZMQVRFRDsKKwkJb3JpZ2xlbiA9IHN0cnRvdWwoYnVmZmVyICsgOCwgTlVMTCwgMTApOworCX0KKwllbHNlCisJCXJldHVybiBOVUxMOworCisJbGluZW5yKys7CisJYnVmZmVyICs9IGxsZW47CisJd2hpbGUgKDEpIHsKKwkJaW50IGJ5dGVfbGVuZ3RoLCBtYXhfYnl0ZV9sZW5ndGgsIG5ld3NpemU7CisJCWxsZW4gPSBsaW5lbGVuKGJ1ZmZlciwgc2l6ZSk7CisJCXVzZWQgKz0gbGxlbjsKKwkJbGluZW5yKys7CisJCWlmIChsbGVuID09IDEpIHsKKwkJCS8qIGNvbnN1bWUgdGhlIGJsYW5rIGxpbmUgKi8KKwkJCWJ1ZmZlcisrOworCQkJc2l6ZS0tOworCQkJYnJlYWs7CisJCX0KKwkJLyogTWluaW11bSBsaW5lIGlzICJBMDAwMDBcbiIgd2hpY2ggaXMgNy1ieXRlIGxvbmcsCisJCSAqIGFuZCB0aGUgbGluZSBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiA1IHBsdXMgMi4KKwkJICovCisJCWlmICgobGxlbiA8IDcpIHx8IChsbGVuLTIpICUgNSkKKwkJCWdvdG8gY29ycnVwdDsKKwkJbWF4X2J5dGVfbGVuZ3RoID0gKGxsZW4gLSAyKSAvIDUgKiA0OworCQlieXRlX2xlbmd0aCA9ICpidWZmZXI7CisJCWlmICgnQScgPD0gYnl0ZV9sZW5ndGggJiYgYnl0ZV9sZW5ndGggPD0gJ1onKQorCQkJYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCAtICdBJyArIDE7CisJCWVsc2UgaWYgKCdhJyA8PSBieXRlX2xlbmd0aCAmJiBieXRlX2xlbmd0aCA8PSAneicpCisJCQlieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoIC0gJ2EnICsgMjc7CisJCWVsc2UKKwkJCWdvdG8gY29ycnVwdDsKKwkJLyogaWYgdGhlIGlucHV0IGxlbmd0aCB3YXMgbm90IG11bHRpcGxlIG9mIDQsIHdlIHdvdWxkCisJCSAqIGhhdmUgZmlsbGVyIGF0IHRoZSBlbmQgYnV0IHRoZSBmaWxsZXIgc2hvdWxkIG5ldmVyCisJCSAqIGV4Y2VlZCAzIGJ5dGVzCisJCSAqLworCQlpZiAobWF4X2J5dGVfbGVuZ3RoIDwgYnl0ZV9sZW5ndGggfHwKKwkJICAgIGJ5dGVfbGVuZ3RoIDw9IG1heF9ieXRlX2xlbmd0aCAtIDQpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCW5ld3NpemUgPSBodW5rX3NpemUgKyBieXRlX2xlbmd0aDsKKwkJZGF0YSA9IHhyZWFsbG9jKGRhdGEsIG5ld3NpemUpOworCQlpZiAoZGVjb2RlXzg1KGRhdGEgKyBodW5rX3NpemUsIGJ1ZmZlciArIDEsIGJ5dGVfbGVuZ3RoKSkKKwkJCWdvdG8gY29ycnVwdDsKKwkJaHVua19zaXplID0gbmV3c2l6ZTsKKwkJYnVmZmVyICs9IGxsZW47CisJCXNpemUgLT0gbGxlbjsKKwl9CisKKwlmcmFnID0geGNhbGxvYygxLCBzaXplb2YoKmZyYWcpKTsKKwlmcmFnLT5wYXRjaCA9IGluZmxhdGVfaXQoZGF0YSwgaHVua19zaXplLCBvcmlnbGVuKTsKKwlpZiAoIWZyYWctPnBhdGNoKQorCQlnb3RvIGNvcnJ1cHQ7CisJZnJlZShkYXRhKTsKKwlmcmFnLT5zaXplID0gb3JpZ2xlbjsKKwkqYnVmX3AgPSBidWZmZXI7CisJKnN6X3AgPSBzaXplOworCSp1c2VkX3AgPSB1c2VkOworCWZyYWctPmJpbmFyeV9wYXRjaF9tZXRob2QgPSBwYXRjaF9tZXRob2Q7CisJcmV0dXJuIGZyYWc7CisKKyBjb3JydXB0OgorCWZyZWUoZGF0YSk7CisJKnN0YXR1c19wID0gLTE7CisJZXJyb3IoImNvcnJ1cHQgYmluYXJ5IHBhdGNoIGF0IGxpbmUgJWQ6ICUuKnMiLAorCSAgICAgIGxpbmVuci0xLCBsbGVuLTEsIGJ1ZmZlcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYmluYXJ5KGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCS8qIFdlIGhhdmUgcmVhZCAiR0lUIGJpbmFyeSBwYXRjaFxuIjsgd2hhdCBmb2xsb3dzIGlzIGEgbGluZQorCSAqIHRoYXQgc2F5cyB0aGUgcGF0Y2ggbWV0aG9kIChjdXJyZW50bHksIGVpdGhlciAibGl0ZXJhbCIgb3IKKwkgKiAiZGVsdGEiKSBhbmQgdGhlIGxlbmd0aCBvZiBkYXRhIGJlZm9yZSBkZWZsYXRpbmc7IGEKKwkgKiBzZXF1ZW5jZSBvZiAnbGVuZ3RoLWJ5dGUnIGZvbGxvd2VkIGJ5IGJhc2UtODUgZW5jb2RlZCBkYXRhCisJICogZm9sbG93cy4KKwkgKgorCSAqIFdoZW4gYSBiaW5hcnkgcGF0Y2ggaXMgcmV2ZXJzaWJsZSwgdGhlcmUgaXMgYW5vdGhlciBiaW5hcnkKKwkgKiBodW5rIGluIHRoZSBzYW1lIGZvcm1hdCwgc3RhcnRpbmcgd2l0aCBwYXRjaCBtZXRob2QgKGVpdGhlcgorCSAqICJsaXRlcmFsIiBvciAiZGVsdGEiKSB3aXRoIHRoZSBsZW5ndGggb2YgZGF0YSwgYW5kIGEgc2VxdWVuY2UKKwkgKiBvZiBsZW5ndGgtYnl0ZSArIGJhc2UtODUgZW5jb2RlZCBkYXRhLCB0ZXJtaW5hdGVkIHdpdGggYW5vdGhlcgorCSAqIGVtcHR5IGxpbmUuICBUaGlzIGRhdGEsIHdoZW4gYXBwbGllZCB0byB0aGUgcG9zdGltYWdlLCBwcm9kdWNlcworCSAqIHRoZSBwcmVpbWFnZS4KKwkgKi8KKwlzdHJ1Y3QgZnJhZ21lbnQgKmZvcndhcmQ7CisJc3RydWN0IGZyYWdtZW50ICpyZXZlcnNlOworCWludCBzdGF0dXM7CisJaW50IHVzZWQsIHVzZWRfMTsKKworCWZvcndhcmQgPSBwYXJzZV9iaW5hcnlfaHVuaygmYnVmZmVyLCAmc2l6ZSwgJnN0YXR1cywgJnVzZWQpOworCWlmICghZm9yd2FyZCAmJiAhc3RhdHVzKQorCQkvKiB0aGVyZSBoYXMgdG8gYmUgb25lIGh1bmsgKGZvcndhcmQgaHVuaykgKi8KKwkJcmV0dXJuIGVycm9yKCJ1bnJlY29nbml6ZWQgYmluYXJ5IHBhdGNoIGF0IGxpbmUgJWQiLCBsaW5lbnItMSk7CisJaWYgKHN0YXR1cykKKwkJLyogb3RoZXJ3aXNlIHdlIGFscmVhZHkgZ2F2ZSBhbiBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXZlcnNlID0gcGFyc2VfYmluYXJ5X2h1bmsoJmJ1ZmZlciwgJnNpemUsICZzdGF0dXMsICZ1c2VkXzEpOworCWlmIChyZXZlcnNlKQorCQl1c2VkICs9IHVzZWRfMTsKKwllbHNlIGlmIChzdGF0dXMpIHsKKwkJLyogbm90IGhhdmluZyByZXZlcnNlIGh1bmsgaXMgbm90IGFuIGVycm9yLCBidXQgaGF2aW5nCisJCSAqIGEgY29ycnVwdCByZXZlcnNlIGh1bmsgaXMuCisJCSAqLworCQlmcmVlKCh2b2lkKikgZm9yd2FyZC0+cGF0Y2gpOworCQlmcmVlKGZvcndhcmQpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlmb3J3YXJkLT5uZXh0ID0gcmV2ZXJzZTsKKwlwYXRjaC0+ZnJhZ21lbnRzID0gZm9yd2FyZDsKKwlwYXRjaC0+aXNfYmluYXJ5ID0gMTsKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIGludCBwYXJzZV9jaHVuayhjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpbnQgaGRyc2l6ZSwgcGF0Y2hzaXplOworCWludCBvZmZzZXQgPSBmaW5kX2hlYWRlcihidWZmZXIsIHNpemUsICZoZHJzaXplLCBwYXRjaCk7CisKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKworCXBhdGNoc2l6ZSA9IHBhcnNlX3NpbmdsZV9wYXRjaChidWZmZXIgKyBvZmZzZXQgKyBoZHJzaXplLCBzaXplIC0gb2Zmc2V0IC0gaGRyc2l6ZSwgcGF0Y2gpOworCisJaWYgKCFwYXRjaHNpemUpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmJpbmhkcltdID0geworCQkJIkJpbmFyeSBmaWxlcyAiLAorCQkJIkZpbGVzICIsCisJCQlOVUxMLAorCQl9OworCQlzdGF0aWMgY29uc3QgY2hhciBnaXRfYmluYXJ5W10gPSAiR0lUIGJpbmFyeSBwYXRjaFxuIjsKKwkJaW50IGk7CisJCWludCBoZCA9IGhkcnNpemUgKyBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbGxlbiA9IGxpbmVsZW4oYnVmZmVyICsgaGQsIHNpemUgLSBoZCk7CisKKwkJaWYgKGxsZW4gPT0gc2l6ZW9mKGdpdF9iaW5hcnkpIC0gMSAmJgorCQkgICAgIW1lbWNtcChnaXRfYmluYXJ5LCBidWZmZXIgKyBoZCwgbGxlbikpIHsKKwkJCWludCB1c2VkOworCQkJbGluZW5yKys7CisJCQl1c2VkID0gcGFyc2VfYmluYXJ5KGJ1ZmZlciArIGhkICsgbGxlbiwKKwkJCQkJICAgIHNpemUgLSBoZCAtIGxsZW4sIHBhdGNoKTsKKwkJCWlmICh1c2VkKQorCQkJCXBhdGNoc2l6ZSA9IHVzZWQgKyBsbGVuOworCQkJZWxzZQorCQkJCXBhdGNoc2l6ZSA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIW1lbWNtcCgiIGRpZmZlclxuIiwgYnVmZmVyICsgaGQgKyBsbGVuIC0gOCwgOCkpIHsKKwkJCWZvciAoaSA9IDA7IGJpbmhkcltpXTsgaSsrKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihiaW5oZHJbaV0pOworCQkJCWlmIChsZW4gPCBzaXplIC0gaGQgJiYKKwkJCQkgICAgIW1lbWNtcChiaW5oZHJbaV0sIGJ1ZmZlciArIGhkLCBsZW4pKSB7CisJCQkJCWxpbmVucisrOworCQkJCQlwYXRjaC0+aXNfYmluYXJ5ID0gMTsKKwkJCQkJcGF0Y2hzaXplID0gbGxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogRW1wdHkgcGF0Y2ggY2Fubm90IGJlIGFwcGxpZWQgaWYgaXQgaXMgYSB0ZXh0IHBhdGNoCisJCSAqIHdpdGhvdXQgbWV0YWRhdGEgY2hhbmdlLiAgQSBiaW5hcnkgcGF0Y2ggYXBwZWFycworCQkgKiBlbXB0eSB0byB1cyBoZXJlLgorCQkgKi8KKwkJaWYgKChhcHBseSB8fCBjaGVjaykgJiYKKwkJICAgICghcGF0Y2gtPmlzX2JpbmFyeSAmJiAhbWV0YWRhdGFfY2hhbmdlcyhwYXRjaCkpKQorCQkJZGllKCJwYXRjaCB3aXRoIG9ubHkgZ2FyYmFnZSBhdCBsaW5lICVkIiwgbGluZW5yKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0ICsgaGRyc2l6ZSArIHBhdGNoc2l6ZTsKK30KKworI2RlZmluZSBzd2FwKGEsYikgbXlzd2FwKChhKSwoYiksc2l6ZW9mKGEpKQorCisjZGVmaW5lIG15c3dhcChhLCBiLCBzaXplKSBkbyB7CQlcCisJdW5zaWduZWQgY2hhciBteXRtcFtzaXplXTsJXAorCW1lbWNweShteXRtcCwgJmEsIHNpemUpOwkJXAorCW1lbWNweSgmYSwgJmIsIHNpemUpOwkJXAorCW1lbWNweSgmYiwgbXl0bXAsIHNpemUpOwkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgcmV2ZXJzZV9wYXRjaGVzKHN0cnVjdCBwYXRjaCAqcCkKK3sKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGZyYWdtZW50ICpmcmFnID0gcC0+ZnJhZ21lbnRzOworCisJCXN3YXAocC0+bmV3X25hbWUsIHAtPm9sZF9uYW1lKTsKKwkJc3dhcChwLT5uZXdfbW9kZSwgcC0+b2xkX21vZGUpOworCQlzd2FwKHAtPmlzX25ldywgcC0+aXNfZGVsZXRlKTsKKwkJc3dhcChwLT5saW5lc19hZGRlZCwgcC0+bGluZXNfZGVsZXRlZCk7CisJCXN3YXAocC0+b2xkX3NoYTFfcHJlZml4LCBwLT5uZXdfc2hhMV9wcmVmaXgpOworCisJCWZvciAoOyBmcmFnOyBmcmFnID0gZnJhZy0+bmV4dCkgeworCQkJc3dhcChmcmFnLT5uZXdwb3MsIGZyYWctPm9sZHBvcyk7CisJCQlzd2FwKGZyYWctPm5ld2xpbmVzLCBmcmFnLT5vbGRsaW5lcyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBsdXNlc1tdID0gIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiOworc3RhdGljIGNvbnN0IGNoYXIgbWludXNlc1tdPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKwljaGFyICpuYW1lID0gcGF0Y2gtPm5ld19uYW1lOworCWNoYXIgKnFuYW1lID0gTlVMTDsKKwlpbnQgbGVuLCBtYXgsIGFkZCwgZGVsLCB0b3RhbDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9IHBhdGNoLT5vbGRfbmFtZTsKKworCWlmICgwIDwgKGxlbiA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCkpKSB7CisJCXFuYW1lID0geG1hbGxvYyhsZW4gKyAxKTsKKwkJcXVvdGVfY19zdHlsZShuYW1lLCBxbmFtZSwgTlVMTCwgMCk7CisJCW5hbWUgPSBxbmFtZTsKKwl9CisKKwkvKgorCSAqICJzY2FsZSIgdGhlIGZpbGVuYW1lCisJICovCisJbGVuID0gc3RybGVuKG5hbWUpOworCW1heCA9IG1heF9sZW47CisJaWYgKG1heCA+IDUwKQorCQltYXggPSA1MDsKKwlpZiAobGVuID4gbWF4KSB7CisJCWNoYXIgKnNsYXNoOworCQlwcmVmaXggPSAiLi4uIjsKKwkJbWF4IC09IDM7CisJCW5hbWUgKz0gbGVuIC0gbWF4OworCQlzbGFzaCA9IHN0cmNocihuYW1lLCAnLycpOworCQlpZiAoc2xhc2gpCisJCQluYW1lID0gc2xhc2g7CisJfQorCWxlbiA9IG1heDsKKworCS8qCisJICogc2NhbGUgdGhlIGFkZC9kZWxldGUKKwkgKi8KKwltYXggPSBtYXhfY2hhbmdlOworCWlmIChtYXggKyBsZW4gPiA3MCkKKwkJbWF4ID0gNzAgLSBsZW47CisKKwlhZGQgPSBwYXRjaC0+bGluZXNfYWRkZWQ7CisJZGVsID0gcGF0Y2gtPmxpbmVzX2RlbGV0ZWQ7CisJdG90YWwgPSBhZGQgKyBkZWw7CisKKwlpZiAobWF4X2NoYW5nZSA+IDApIHsKKwkJdG90YWwgPSAodG90YWwgKiBtYXggKyBtYXhfY2hhbmdlIC8gMikgLyBtYXhfY2hhbmdlOworCQlhZGQgPSAoYWRkICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJZGVsID0gdG90YWwgLSBhZGQ7CisJfQorCWlmIChwYXRjaC0+aXNfYmluYXJ5KQorCQlwcmludGYoIiAlcyUtKnMgfCAgQmluXG4iLCBwcmVmaXgsIGxlbiwgbmFtZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyUtKnMgfCU1ZCAlLipzJS4qc1xuIiwgcHJlZml4LAorCQkgICAgICAgbGVuLCBuYW1lLCBwYXRjaC0+bGluZXNfYWRkZWQgKyBwYXRjaC0+bGluZXNfZGVsZXRlZCwKKwkJICAgICAgIGFkZCwgcGx1c2VzLCBkZWwsIG1pbnVzZXMpOworCWZyZWUocW5hbWUpOworfQorCitzdGF0aWMgaW50IHJlYWRfb2xkX2RhdGEoc3RydWN0IHN0YXQgKnN0LCBjb25zdCBjaGFyICpwYXRoLCBjaGFyICoqYnVmX3AsIHVuc2lnbmVkIGxvbmcgKmFsbG9jX3AsIHVuc2lnbmVkIGxvbmcgKnNpemVfcCkKK3sKKwlpbnQgZmQ7CisJdW5zaWduZWQgbG9uZyBnb3Q7CisJdW5zaWduZWQgbG9uZyBuc2l6ZTsKKwljaGFyICpuYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpzaXplX3A7CisJY2hhciAqYnVmID0gKmJ1Zl9wOworCisJc3dpdGNoIChzdC0+c3RfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkxOSzoKKwkJcmV0dXJuIHJlYWRsaW5rKHBhdGgsIGJ1Ziwgc2l6ZSkgIT0gc2l6ZTsKKwljYXNlIFNfSUZSRUc6CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBvcGVuICVzIiwgcGF0aCk7CisJCWdvdCA9IDA7CisJCWZvciAoOzspIHsKKwkJCXNzaXplX3QgcmV0ID0geHJlYWQoZmQsIGJ1ZiArIGdvdCwgc2l6ZSAtIGdvdCk7CisJCQlpZiAocmV0IDw9IDApCisJCQkJYnJlYWs7CisJCQlnb3QgKz0gcmV0OworCQl9CisJCWNsb3NlKGZkKTsKKwkJbnNpemUgPSBnb3Q7CisJCW5idWYgPSBjb252ZXJ0X3RvX2dpdChwYXRoLCBidWYsICZuc2l6ZSk7CisJCWlmIChuYnVmKSB7CisJCQlmcmVlKGJ1Zik7CisJCQkqYnVmX3AgPSBuYnVmOworCQkJKmFsbG9jX3AgPSBuc2l6ZTsKKwkJCSpzaXplX3AgPSBuc2l6ZTsKKwkJfQorCQlyZXR1cm4gZ290ICE9IHNpemU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIGludCBmaW5kX29mZnNldChjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZnJhZ21lbnQsIHVuc2lnbmVkIGxvbmcgZnJhZ3NpemUsIGludCBsaW5lLCBpbnQgKmxpbmVzKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGJhY2t3YXJkcywgZm9yd2FyZHM7CisKKwlpZiAoZnJhZ3NpemUgPiBzaXplKQorCQlyZXR1cm4gLTE7CisKKwlzdGFydCA9IDA7CisJaWYgKGxpbmUgPiAxKSB7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwkJaSA9IGxpbmUtMTsKKwkJd2hpbGUgKG9mZnNldCArIGZyYWdzaXplIDw9IHNpemUpIHsKKwkJCWlmIChidWZbb2Zmc2V0KytdID09ICdcbicpIHsKKwkJCQlzdGFydCA9IG9mZnNldDsKKwkJCQlpZiAoIS0taSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBFeGFjdCBsaW5lIG51bWJlcj8gKi8KKwlpZiAoIW1lbWNtcChidWYgKyBzdGFydCwgZnJhZ21lbnQsIGZyYWdzaXplKSkKKwkJcmV0dXJuIHN0YXJ0OworCisJLyoKKwkgKiBUaGVyZSdzIHByb2JhYmx5IHNvbWUgc21hcnQgd2F5IHRvIGRvIHRoaXMsIGJ1dCBJJ2xsIGxlYXZlCisJICogdGhhdCB0byB0aGUgc21hcnQgYW5kIGJlYXV0aWZ1bCBwZW9wbGUuIEknbSBzaW1wbGUgYW5kIHN0dXBpZC4KKwkgKi8KKwliYWNrd2FyZHMgPSBzdGFydDsKKwlmb3J3YXJkcyA9IHN0YXJ0OworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdHJ5OworCQlpbnQgbjsKKworCQkvKiAiYmFja3dhcmQiICovCisJCWlmIChpICYgMSkgeworCQkJaWYgKCFiYWNrd2FyZHMpIHsKKwkJCQlpZiAoZm9yd2FyZHMgKyBmcmFnc2l6ZSA+IHNpemUpCisJCQkJCWJyZWFrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZG8geworCQkJCS0tYmFja3dhcmRzOworCQkJfSB3aGlsZSAoYmFja3dhcmRzICYmIGJ1ZltiYWNrd2FyZHMtMV0gIT0gJ1xuJyk7CisJCQl0cnkgPSBiYWNrd2FyZHM7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoZm9yd2FyZHMgKyBmcmFnc2l6ZSA8PSBzaXplKSB7CisJCQkJaWYgKGJ1Zltmb3J3YXJkcysrXSA9PSAnXG4nKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXRyeSA9IGZvcndhcmRzOworCQl9CisKKwkJaWYgKHRyeSArIGZyYWdzaXplID4gc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKGJ1ZiArIHRyeSwgZnJhZ21lbnQsIGZyYWdzaXplKSkKKwkJCWNvbnRpbnVlOworCQluID0gKGkgPj4gMSkrMTsKKwkJaWYgKGkgJiAxKQorCQkJbiA9IC1uOworCQkqbGluZXMgPSBuOworCQlyZXR1cm4gdHJ5OworCX0KKworCS8qCisJICogV2Ugc2hvdWxkIHN0YXJ0IHNlYXJjaGluZyBmb3J3YXJkIGFuZCBiYWNrd2FyZC4KKwkgKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9maXJzdF9saW5lKGNvbnN0IGNoYXIgKipyYnVmLCBpbnQgKnJzaXplKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9ICpyYnVmOworCWludCBzaXplID0gKnJzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCW9mZnNldCA9IDA7CisJd2hpbGUgKG9mZnNldCA8PSBzaXplKSB7CisJCWlmIChidWZbb2Zmc2V0KytdID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnJzaXplID0gc2l6ZSAtIG9mZnNldDsKKwkqcmJ1ZiA9IGJ1ZiArIG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xhc3RfbGluZShjb25zdCBjaGFyICoqcmJ1ZiwgaW50ICpyc2l6ZSkKK3sKKwljb25zdCBjaGFyICpidWYgPSAqcmJ1ZjsKKwlpbnQgc2l6ZSA9ICpyc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlvZmZzZXQgPSBzaXplIC0gMTsKKwl3aGlsZSAob2Zmc2V0ID4gMCkgeworCQlpZiAoYnVmWy0tb2Zmc2V0XSA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCSpyc2l6ZSA9IG9mZnNldCArIDE7Cit9CisKK3N0cnVjdCBidWZmZXJfZGVzYyB7CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFsbG9jOworfTsKKworc3RhdGljIGludCBhcHBseV9saW5lKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqcGF0Y2gsIGludCBwbGVuKQoreworCS8qIHBsZW4gaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZCBmcm9tIHBhdGNoLAorCSAqIHN0YXJ0aW5nIGF0IHBhdGNoKzEgKHBhdGNoWzBdIGlzICcrJykuICBUeXBpY2FsbHkKKwkgKiBwYXRjaFtwbGVuXSBpcyAnXG4nLCB1bmxlc3MgdGhpcyBpcyB0aGUgaW5jb21wbGV0ZQorCSAqIGxhc3QgbGluZS4KKwkgKi8KKwlpbnQgaTsKKwlpbnQgYWRkX25sX3RvX3RhaWwgPSAwOworCWludCBmaXhlZCA9IDA7CisJaW50IGxhc3RfdGFiX2luX2luZGVudCA9IC0xOworCWludCBsYXN0X3NwYWNlX2luX2luZGVudCA9IC0xOworCWludCBuZWVkX2ZpeF9sZWFkaW5nX3NwYWNlID0gMDsKKwljaGFyICpidWY7CisKKwlpZiAoKG5ld193aGl0ZXNwYWNlICE9IHN0cmlwX3doaXRlc3BhY2UpIHx8ICF3aGl0ZXNwYWNlX2Vycm9yIHx8CisJICAgICpwYXRjaCAhPSAnKycpIHsKKwkJbWVtY3B5KG91dHB1dCwgcGF0Y2ggKyAxLCBwbGVuKTsKKwkJcmV0dXJuIHBsZW47CisJfQorCisJaWYgKDEgPCBwbGVuICYmIGlzc3BhY2UocGF0Y2hbcGxlbi0xXSkpIHsKKwkJaWYgKHBhdGNoW3BsZW5dID09ICdcbicpCisJCQlhZGRfbmxfdG9fdGFpbCA9IDE7CisJCXBsZW4tLTsKKwkJd2hpbGUgKDAgPCBwbGVuICYmIGlzc3BhY2UocGF0Y2hbcGxlbl0pKQorCQkJcGxlbi0tOworCQlmaXhlZCA9IDE7CisJfQorCisJZm9yIChpID0gMTsgaSA8IHBsZW47IGkrKykgeworCQljaGFyIGNoID0gcGF0Y2hbaV07CisJCWlmIChjaCA9PSAnXHQnKSB7CisJCQlsYXN0X3RhYl9pbl9pbmRlbnQgPSBpOworCQkJaWYgKDAgPD0gbGFzdF9zcGFjZV9pbl9pbmRlbnQpCisJCQkJbmVlZF9maXhfbGVhZGluZ19zcGFjZSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoY2ggPT0gJyAnKQorCQkJbGFzdF9zcGFjZV9pbl9pbmRlbnQgPSBpOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlidWYgPSBvdXRwdXQ7CisJaWYgKG5lZWRfZml4X2xlYWRpbmdfc3BhY2UpIHsKKwkJLyogYmV0d2VlbiBwYXRjaFsxLi5sYXN0X3RhYl9pbl9pbmRlbnRdIHN0cmlwIHRoZQorCQkgKiBmdW5ueSBzcGFjZXMsIHVwZGF0aW5nIHRoZW0gdG8gdGFiIGFzIG5lZWRlZC4KKwkJICovCisJCWZvciAoaSA9IDE7IGkgPCBsYXN0X3RhYl9pbl9pbmRlbnQ7IGkrKywgcGxlbi0tKSB7CisJCQljaGFyIGNoID0gcGF0Y2hbaV07CisJCQlpZiAoY2ggIT0gJyAnKQorCQkJCSpvdXRwdXQrKyA9IGNoOworCQkJZWxzZSBpZiAoKGkgJSA4KSA9PSAwKQorCQkJCSpvdXRwdXQrKyA9ICdcdCc7CisJCX0KKwkJZml4ZWQgPSAxOworCQlpID0gbGFzdF90YWJfaW5faW5kZW50OworCX0KKwllbHNlCisJCWkgPSAxOworCisJbWVtY3B5KG91dHB1dCwgcGF0Y2ggKyBpLCBwbGVuKTsKKwlpZiAoYWRkX25sX3RvX3RhaWwpCisJCW91dHB1dFtwbGVuKytdID0gJ1xuJzsKKwlpZiAoZml4ZWQpCisJCWFwcGxpZWRfYWZ0ZXJfc3RyaXBwaW5nKys7CisJcmV0dXJuIG91dHB1dCArIHBsZW4gLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfb25lX2ZyYWdtZW50KHN0cnVjdCBidWZmZXJfZGVzYyAqZGVzYywgc3RydWN0IGZyYWdtZW50ICpmcmFnLCBpbnQgaW5hY2N1cmF0ZV9lb2YpCit7CisJaW50IG1hdGNoX2JlZ2lubmluZywgbWF0Y2hfZW5kOworCWNoYXIgKmJ1ZiA9IGRlc2MtPmJ1ZmZlcjsKKwljb25zdCBjaGFyICpwYXRjaCA9IGZyYWctPnBhdGNoOworCWludCBvZmZzZXQsIHNpemUgPSBmcmFnLT5zaXplOworCWNoYXIgKm9sZCA9IHhtYWxsb2Moc2l6ZSk7CisJY2hhciAqbmV3ID0geG1hbGxvYyhzaXplKTsKKwljb25zdCBjaGFyICpvbGRsaW5lcywgKm5ld2xpbmVzOworCWludCBvbGRzaXplID0gMCwgbmV3c2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsZWFkaW5nLCB0cmFpbGluZzsKKwlpbnQgcG9zLCBsaW5lczsKKworCXdoaWxlIChzaXplID4gMCkgeworCQljaGFyIGZpcnN0OworCQlpbnQgbGVuID0gbGluZWxlbihwYXRjaCwgc2l6ZSk7CisJCWludCBwbGVuOworCisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogInBsZW4iIGlzIGhvdyBtdWNoIG9mIHRoZSBsaW5lIHdlIHNob3VsZCB1c2UgZm9yCisJCSAqIHRoZSBhY3R1YWwgcGF0Y2ggZGF0YS4gTm9ybWFsbHkgd2UganVzdCByZW1vdmUgdGhlCisJCSAqIGZpcnN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwgYnV0IGlmIHRoZSBsaW5lIGlzCisJCSAqIGZvbGxvd2VkIGJ5ICJcIE5vIG5ld2xpbmUiLCB0aGVuIHdlIGFsc28gcmVtb3ZlIHRoZQorCQkgKiBsYXN0IG9uZSAod2hpY2ggaXMgdGhlIG5ld2xpbmUsIG9mIGNvdXJzZSkuCisJCSAqLworCQlwbGVuID0gbGVuLTE7CisJCWlmIChsZW4gPCBzaXplICYmIHBhdGNoW2xlbl0gPT0gJ1xcJykKKwkJCXBsZW4tLTsKKwkJZmlyc3QgPSAqcGF0Y2g7CisJCWlmIChhcHBseV9pbl9yZXZlcnNlKSB7CisJCQlpZiAoZmlyc3QgPT0gJy0nKQorCQkJCWZpcnN0ID0gJysnOworCQkJZWxzZSBpZiAoZmlyc3QgPT0gJysnKQorCQkJCWZpcnN0ID0gJy0nOworCQl9CisJCXN3aXRjaCAoZmlyc3QpIHsKKwkJY2FzZSAnXG4nOgorCQkJLyogTmV3ZXIgR05VIGRpZmYsIGVtcHR5IGNvbnRleHQgbGluZSAqLworCQkJaWYgKHBsZW4gPCAwKQorCQkJCS8qIC4uLiBmb2xsb3dlZCBieSAnXE5vIG5ld2xpbmUnOyBub3RoaW5nICovCisJCQkJYnJlYWs7CisJCQlvbGRbb2xkc2l6ZSsrXSA9ICdcbic7CisJCQluZXdbbmV3c2l6ZSsrXSA9ICdcbic7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCWNhc2UgJy0nOgorCQkJbWVtY3B5KG9sZCArIG9sZHNpemUsIHBhdGNoICsgMSwgcGxlbik7CisJCQlvbGRzaXplICs9IHBsZW47CisJCQlpZiAoZmlyc3QgPT0gJy0nKQorCQkJCWJyZWFrOworCQkvKiBGYWxsLXRocm91Z2ggZm9yICcgJyAqLworCQljYXNlICcrJzoKKwkJCWlmIChmaXJzdCAhPSAnKycgfHwgIW5vX2FkZCkKKwkJCQluZXdzaXplICs9IGFwcGx5X2xpbmUobmV3ICsgbmV3c2l6ZSwgcGF0Y2gsCisJCQkJCQkgICAgICBwbGVuKTsKKwkJCWJyZWFrOworCQljYXNlICdAJzogY2FzZSAnXFwnOgorCQkJLyogSWdub3JlIGl0LCB3ZSBhbHJlYWR5IGhhbmRsZWQgaXQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGFwcGx5X3ZlcmJvc2VseSkKKwkJCQllcnJvcigiaW52YWxpZCBzdGFydCBvZiBsaW5lOiAnJWMnIiwgZmlyc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXBhdGNoICs9IGxlbjsKKwkJc2l6ZSAtPSBsZW47CisJfQorCisJaWYgKGluYWNjdXJhdGVfZW9mICYmIG9sZHNpemUgPiAwICYmIG9sZFtvbGRzaXplIC0gMV0gPT0gJ1xuJyAmJgorCQkJbmV3c2l6ZSA+IDAgJiYgbmV3W25ld3NpemUgLSAxXSA9PSAnXG4nKSB7CisJCW9sZHNpemUtLTsKKwkJbmV3c2l6ZS0tOworCX0KKworCW9sZGxpbmVzID0gb2xkOworCW5ld2xpbmVzID0gbmV3OworCWxlYWRpbmcgPSBmcmFnLT5sZWFkaW5nOworCXRyYWlsaW5nID0gZnJhZy0+dHJhaWxpbmc7CisKKwkvKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYW55IGxlYWRpbmcvdHJhaWxpbmcgZGF0YSBpbiB0aGUgcGF0Y2gsCisJICogd2Ugd2FudCBpdCB0byBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nL2VuZCBvZiB0aGUgZmlsZS4KKwkgKgorCSAqIEJ1dCB0aGF0IHdvdWxkIGJyZWFrIGlmIHRoZSBwYXRjaCBpcyBnZW5lcmF0ZWQgd2l0aAorCSAqIC0tdW5pZmllZD0wOyBzYW5lIHBlb3BsZSB3b3VsZG4ndCBkbyB0aGF0IHRvIGNhdXNlIHVzCisJICogdHJvdWJsZSwgYnV0IHdlIHRyeSB0byBwbGVhc2Ugbm90IHNvIHNhbmUgb25lcyBhcyB3ZWxsLgorCSAqLworCWlmICh1bmlkaWZmX3plcm8pIHsKKwkJbWF0Y2hfYmVnaW5uaW5nID0gKCFsZWFkaW5nICYmICFmcmFnLT5vbGRwb3MpOworCQltYXRjaF9lbmQgPSAwOworCX0KKwllbHNlIHsKKwkJbWF0Y2hfYmVnaW5uaW5nID0gIWxlYWRpbmcgJiYgKGZyYWctPm9sZHBvcyA9PSAxKTsKKwkJbWF0Y2hfZW5kID0gIXRyYWlsaW5nOworCX0KKworCWxpbmVzID0gMDsKKwlwb3MgPSBmcmFnLT5uZXdwb3M7CisJZm9yICg7OykgeworCQlvZmZzZXQgPSBmaW5kX29mZnNldChidWYsIGRlc2MtPnNpemUsCisJCQkJICAgICBvbGRsaW5lcywgb2xkc2l6ZSwgcG9zLCAmbGluZXMpOworCQlpZiAobWF0Y2hfZW5kICYmIG9mZnNldCArIG9sZHNpemUgIT0gZGVzYy0+c2l6ZSkKKwkJCW9mZnNldCA9IC0xOworCQlpZiAobWF0Y2hfYmVnaW5uaW5nICYmIG9mZnNldCkKKwkJCW9mZnNldCA9IC0xOworCQlpZiAob2Zmc2V0ID49IDApIHsKKwkJCWludCBkaWZmID0gbmV3c2l6ZSAtIG9sZHNpemU7CisJCQl1bnNpZ25lZCBsb25nIHNpemUgPSBkZXNjLT5zaXplICsgZGlmZjsKKwkJCXVuc2lnbmVkIGxvbmcgYWxsb2MgPSBkZXNjLT5hbGxvYzsKKworCQkJLyogV2FybiBpZiBpdCB3YXMgbmVjZXNzYXJ5IHRvIHJlZHVjZSB0aGUgbnVtYmVyCisJCQkgKiBvZiBjb250ZXh0IGxpbmVzLgorCQkJICovCisJCQlpZiAoKGxlYWRpbmcgIT0gZnJhZy0+bGVhZGluZykgfHwKKwkJCSAgICAodHJhaWxpbmcgIT0gZnJhZy0+dHJhaWxpbmcpKQorCQkJCWZwcmludGYoc3RkZXJyLCAiQ29udGV4dCByZWR1Y2VkIHRvICglbGQvJWxkKSIKKwkJCQkJIiB0byBhcHBseSBmcmFnbWVudCBhdCAlZFxuIiwKKwkJCQkJbGVhZGluZywgdHJhaWxpbmcsIHBvcyArIGxpbmVzKTsKKworCQkJaWYgKHNpemUgPiBhbGxvYykgeworCQkJCWFsbG9jID0gc2l6ZSArIDgxOTI7CisJCQkJZGVzYy0+YWxsb2MgPSBhbGxvYzsKKwkJCQlidWYgPSB4cmVhbGxvYyhidWYsIGFsbG9jKTsKKwkJCQlkZXNjLT5idWZmZXIgPSBidWY7CisJCQl9CisJCQlkZXNjLT5zaXplID0gc2l6ZTsKKwkJCW1lbW1vdmUoYnVmICsgb2Zmc2V0ICsgbmV3c2l6ZSwKKwkJCQlidWYgKyBvZmZzZXQgKyBvbGRzaXplLAorCQkJCXNpemUgLSBvZmZzZXQgLSBuZXdzaXplKTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIG5ld2xpbmVzLCBuZXdzaXplKTsKKwkJCW9mZnNldCA9IDA7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQW0gSSBhdCBteSBjb250ZXh0IGxpbWl0cz8gKi8KKwkJaWYgKChsZWFkaW5nIDw9IHBfY29udGV4dCkgJiYgKHRyYWlsaW5nIDw9IHBfY29udGV4dCkpCisJCQlicmVhazsKKwkJaWYgKG1hdGNoX2JlZ2lubmluZyB8fCBtYXRjaF9lbmQpIHsKKwkJCW1hdGNoX2JlZ2lubmluZyA9IG1hdGNoX2VuZCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBjb250ZXh0IGxpbmVzCisJCSAqIFJlZHVjZSBib3RoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGlmIHRoZXkgYXJlIGVxdWFsCisJCSAqIG90aGVyd2lzZSBqdXN0IHJlZHVjZSB0aGUgbGFyZ2VyIGNvbnRleHQuCisJCSAqLworCQlpZiAobGVhZGluZyA+PSB0cmFpbGluZykgeworCQkJcmVtb3ZlX2ZpcnN0X2xpbmUoJm9sZGxpbmVzLCAmb2xkc2l6ZSk7CisJCQlyZW1vdmVfZmlyc3RfbGluZSgmbmV3bGluZXMsICZuZXdzaXplKTsKKwkJCXBvcy0tOworCQkJbGVhZGluZy0tOworCQl9CisJCWlmICh0cmFpbGluZyA+IGxlYWRpbmcpIHsKKwkJCXJlbW92ZV9sYXN0X2xpbmUoJm9sZGxpbmVzLCAmb2xkc2l6ZSk7CisJCQlyZW1vdmVfbGFzdF9saW5lKCZuZXdsaW5lcywgJm5ld3NpemUpOworCQkJdHJhaWxpbmctLTsKKwkJfQorCX0KKworCWlmIChvZmZzZXQgJiYgYXBwbHlfdmVyYm9zZWx5KQorCQllcnJvcigid2hpbGUgc2VhcmNoaW5nIGZvcjpcbiUuKnMiLCBvbGRzaXplLCBvbGRsaW5lcyk7CisKKwlmcmVlKG9sZCk7CisJZnJlZShuZXcpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfYmluYXJ5X2ZyYWdtZW50KHN0cnVjdCBidWZmZXJfZGVzYyAqZGVzYywgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIGRzdF9zaXplOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQgPSBwYXRjaC0+ZnJhZ21lbnRzOworCXZvaWQgKmRhdGE7CisJdm9pZCAqcmVzdWx0OworCisJLyogQmluYXJ5IHBhdGNoIGlzIGlycmV2ZXJzaWJsZSB3aXRob3V0IHRoZSBvcHRpb25hbCBzZWNvbmQgaHVuayAqLworCWlmIChhcHBseV9pbl9yZXZlcnNlKSB7CisJCWlmICghZnJhZ21lbnQtPm5leHQpCisJCQlyZXR1cm4gZXJyb3IoImNhbm5vdCByZXZlcnNlLWFwcGx5IGEgYmluYXJ5IHBhdGNoICIKKwkJCQkgICAgICJ3aXRob3V0IHRoZSByZXZlcnNlIGh1bmsgdG8gJyVzJyIsCisJCQkJICAgICBwYXRjaC0+bmV3X25hbWUKKwkJCQkgICAgID8gcGF0Y2gtPm5ld19uYW1lIDogcGF0Y2gtPm9sZF9uYW1lKTsKKwkJZnJhZ21lbnQgPSBmcmFnbWVudC0+bmV4dDsKKwl9CisJZGF0YSA9ICh2b2lkKikgZnJhZ21lbnQtPnBhdGNoOworCXN3aXRjaCAoZnJhZ21lbnQtPmJpbmFyeV9wYXRjaF9tZXRob2QpIHsKKwljYXNlIEJJTkFSWV9ERUxUQV9ERUZMQVRFRDoKKwkJcmVzdWx0ID0gcGF0Y2hfZGVsdGEoZGVzYy0+YnVmZmVyLCBkZXNjLT5zaXplLAorCQkJCSAgICAgZGF0YSwKKwkJCQkgICAgIGZyYWdtZW50LT5zaXplLAorCQkJCSAgICAgJmRzdF9zaXplKTsKKwkJZnJlZShkZXNjLT5idWZmZXIpOworCQlkZXNjLT5idWZmZXIgPSByZXN1bHQ7CisJCWJyZWFrOworCWNhc2UgQklOQVJZX0xJVEVSQUxfREVGTEFURUQ6CisJCWZyZWUoZGVzYy0+YnVmZmVyKTsKKwkJZGVzYy0+YnVmZmVyID0gZGF0YTsKKwkJZHN0X3NpemUgPSBmcmFnbWVudC0+c2l6ZTsKKwkJYnJlYWs7CisJfQorCWlmICghZGVzYy0+YnVmZmVyKQorCQlyZXR1cm4gLTE7CisJZGVzYy0+c2l6ZSA9IGRlc2MtPmFsbG9jID0gZHN0X3NpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfYmluYXJ5KHN0cnVjdCBidWZmZXJfZGVzYyAqZGVzYywgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gcGF0Y2gtPm9sZF9uYW1lID8gcGF0Y2gtPm9sZF9uYW1lIDogcGF0Y2gtPm5ld19uYW1lOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwkvKiBGb3Igc2FmZXR5LCB3ZSByZXF1aXJlIHBhdGNoIGluZGV4IGxpbmUgdG8gY29udGFpbgorCSAqIGZ1bGwgNDAtYnl0ZSB0ZXh0dWFsIFNIQTEgZm9yIG9sZCBhbmQgbmV3LCBhdCBsZWFzdCBmb3Igbm93LgorCSAqLworCWlmIChzdHJsZW4ocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCkgIT0gNDAgfHwKKwkgICAgc3RybGVuKHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgpICE9IDQwIHx8CisJICAgIGdldF9zaGExX2hleChwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBzaGExKSB8fAorCSAgICBnZXRfc2hhMV9oZXgocGF0Y2gtPm5ld19zaGExX3ByZWZpeCwgc2hhMSkpCisJCXJldHVybiBlcnJvcigiY2Fubm90IGFwcGx5IGJpbmFyeSBwYXRjaCB0byAnJXMnICIKKwkJCSAgICAgIndpdGhvdXQgZnVsbCBpbmRleCBsaW5lIiwgbmFtZSk7CisKKwlpZiAocGF0Y2gtPm9sZF9uYW1lKSB7CisJCS8qIFNlZSBpZiB0aGUgb2xkIG9uZSBtYXRjaGVzIHdoYXQgdGhlIHBhdGNoCisJCSAqIGFwcGxpZXMgdG8uCisJCSAqLworCQloYXNoX3NoYTFfZmlsZShkZXNjLT5idWZmZXIsIGRlc2MtPnNpemUsIGJsb2JfdHlwZSwgc2hhMSk7CisJCWlmIChzdHJjbXAoc2hhMV90b19oZXgoc2hhMSksIHBhdGNoLT5vbGRfc2hhMV9wcmVmaXgpKQorCQkJcmV0dXJuIGVycm9yKCJ0aGUgcGF0Y2ggYXBwbGllcyB0byAnJXMnICglcyksICIKKwkJCQkgICAgICJ3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgIgorCQkJCSAgICAgImN1cnJlbnQgY29udGVudHMuIiwKKwkJCQkgICAgIG5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJZWxzZSB7CisJCS8qIE90aGVyd2lzZSwgdGhlIG9sZCBvbmUgbXVzdCBiZSBlbXB0eS4gKi8KKwkJaWYgKGRlc2MtPnNpemUpCisJCQlyZXR1cm4gZXJyb3IoInRoZSBwYXRjaCBhcHBsaWVzIHRvIGFuIGVtcHR5ICIKKwkJCQkgICAgICInJXMnIGJ1dCBpdCBpcyBub3QgZW1wdHkiLCBuYW1lKTsKKwl9CisKKwlnZXRfc2hhMV9oZXgocGF0Y2gtPm5ld19zaGExX3ByZWZpeCwgc2hhMSk7CisJaWYgKGlzX251bGxfc2hhMShzaGExKSkgeworCQlmcmVlKGRlc2MtPmJ1ZmZlcik7CisJCWRlc2MtPmFsbG9jID0gZGVzYy0+c2l6ZSA9IDA7CisJCWRlc2MtPmJ1ZmZlciA9IE5VTEw7CisJCXJldHVybiAwOyAvKiBkZWxldGlvbiBwYXRjaCAqLworCX0KKworCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCS8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgcG9zdGltYWdlICovCisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCWZyZWUoZGVzYy0+YnVmZmVyKTsKKwkJZGVzYy0+YnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFkZXNjLT5idWZmZXIpCisJCQlyZXR1cm4gZXJyb3IoInRoZSBuZWNlc3NhcnkgcG9zdGltYWdlICVzIGZvciAiCisJCQkJICAgICAiJyVzJyBjYW5ub3QgYmUgcmVhZCIsCisJCQkJICAgICBwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBuYW1lKTsKKwkJZGVzYy0+YWxsb2MgPSBkZXNjLT5zaXplID0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCS8qIFdlIGhhdmUgdmVyaWZpZWQgZGVzYyBtYXRjaGVzIHRoZSBwcmVpbWFnZTsKKwkJICogYXBwbHkgdGhlIHBhdGNoIGRhdGEgdG8gaXQsIHdoaWNoIGlzIHN0b3JlZAorCQkgKiBpbiB0aGUgcGF0Y2gtPmZyYWdtZW50cy0+e3BhdGNoLHNpemV9LgorCQkgKi8KKwkJaWYgKGFwcGx5X2JpbmFyeV9mcmFnbWVudChkZXNjLCBwYXRjaCkpCisJCQlyZXR1cm4gZXJyb3IoImJpbmFyeSBwYXRjaCBkb2VzIG5vdCBhcHBseSB0byAnJXMnIiwKKwkJCQkgICAgIG5hbWUpOworCisJCS8qIHZlcmlmeSB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyAqLworCQloYXNoX3NoYTFfZmlsZShkZXNjLT5idWZmZXIsIGRlc2MtPnNpemUsIGJsb2JfdHlwZSwgc2hhMSk7CisJCWlmIChzdHJjbXAoc2hhMV90b19oZXgoc2hhMSksIHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgpKQorCQkJcmV0dXJuIGVycm9yKCJiaW5hcnkgcGF0Y2ggdG8gJyVzJyBjcmVhdGVzIGluY29ycmVjdCByZXN1bHQgKGV4cGVjdGluZyAlcywgZ290ICVzKSIsIG5hbWUsIHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBseV9mcmFnbWVudHMoc3RydWN0IGJ1ZmZlcl9kZXNjICpkZXNjLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBmcmFnbWVudCAqZnJhZyA9IHBhdGNoLT5mcmFnbWVudHM7CisJY29uc3QgY2hhciAqbmFtZSA9IHBhdGNoLT5vbGRfbmFtZSA/IHBhdGNoLT5vbGRfbmFtZSA6IHBhdGNoLT5uZXdfbmFtZTsKKworCWlmIChwYXRjaC0+aXNfYmluYXJ5KQorCQlyZXR1cm4gYXBwbHlfYmluYXJ5KGRlc2MsIHBhdGNoKTsKKworCXdoaWxlIChmcmFnKSB7CisJCWlmIChhcHBseV9vbmVfZnJhZ21lbnQoZGVzYywgZnJhZywgcGF0Y2gtPmluYWNjdXJhdGVfZW9mKSkgeworCQkJZXJyb3IoInBhdGNoIGZhaWxlZDogJXM6JWxkIiwgbmFtZSwgZnJhZy0+b2xkcG9zKTsKKwkJCWlmICghYXBwbHlfd2l0aF9yZWplY3QpCisJCQkJcmV0dXJuIC0xOworCQkJZnJhZy0+cmVqZWN0ZWQgPSAxOworCQl9CisJCWZyYWcgPSBmcmFnLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBseV9kYXRhKHN0cnVjdCBwYXRjaCAqcGF0Y2gsIHN0cnVjdCBzdGF0ICpzdCwgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplLCBhbGxvYzsKKwlzdHJ1Y3QgYnVmZmVyX2Rlc2MgZGVzYzsKKworCXNpemUgPSAwOworCWFsbG9jID0gMDsKKwlidWYgPSBOVUxMOworCWlmIChjYWNoZWQpIHsKKwkJaWYgKGNlKSB7CisJCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCQlidWYgPSByZWFkX3NoYTFfZmlsZShjZS0+c2hhMSwgJnR5cGUsICZzaXplKTsKKwkJCWlmICghYnVmKQorCQkJCXJldHVybiBlcnJvcigicmVhZCBvZiAlcyBmYWlsZWQiLAorCQkJCQkgICAgIHBhdGNoLT5vbGRfbmFtZSk7CisJCQlhbGxvYyA9IHNpemU7CisJCX0KKwl9CisJZWxzZSBpZiAocGF0Y2gtPm9sZF9uYW1lKSB7CisJCXNpemUgPSB4c2l6ZV90KHN0LT5zdF9zaXplKTsKKwkJYWxsb2MgPSBzaXplICsgODE5MjsKKwkJYnVmID0geG1hbGxvYyhhbGxvYyk7CisJCWlmIChyZWFkX29sZF9kYXRhKHN0LCBwYXRjaC0+b2xkX25hbWUsICZidWYsICZhbGxvYywgJnNpemUpKQorCQkJcmV0dXJuIGVycm9yKCJyZWFkIG9mICVzIGZhaWxlZCIsIHBhdGNoLT5vbGRfbmFtZSk7CisJfQorCisJZGVzYy5zaXplID0gc2l6ZTsKKwlkZXNjLmFsbG9jID0gYWxsb2M7CisJZGVzYy5idWZmZXIgPSBidWY7CisKKwlpZiAoYXBwbHlfZnJhZ21lbnRzKCZkZXNjLCBwYXRjaCkgPCAwKQorCQlyZXR1cm4gLTE7IC8qIG5vdGUgd2l0aCAtLXJlamVjdCB0aGlzIHN1Y2NlZWRzLiAqLworCisJLyogTlVMIHRlcm1pbmF0ZSB0aGUgcmVzdWx0ICovCisJaWYgKGRlc2MuYWxsb2MgPD0gZGVzYy5zaXplKQorCQlkZXNjLmJ1ZmZlciA9IHhyZWFsbG9jKGRlc2MuYnVmZmVyLCBkZXNjLnNpemUgKyAxKTsKKwlkZXNjLmJ1ZmZlcltkZXNjLnNpemVdID0gMDsKKworCXBhdGNoLT5yZXN1bHQgPSBkZXNjLmJ1ZmZlcjsKKwlwYXRjaC0+cmVzdWx0c2l6ZSA9IGRlc2Muc2l6ZTsKKworCWlmICgwIDwgcGF0Y2gtPmlzX2RlbGV0ZSAmJiBwYXRjaC0+cmVzdWx0c2l6ZSkKKwkJcmV0dXJuIGVycm9yKCJyZW1vdmFsIHBhdGNoIGxlYXZlcyBmaWxlIGNvbnRlbnRzIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja190b19jcmVhdGVfYmxvYihjb25zdCBjaGFyICpuZXdfbmFtZSwgaW50IG9rX2lmX2V4aXN0cykKK3sKKwlzdHJ1Y3Qgc3RhdCBuc3Q7CisJaWYgKCFsc3RhdChuZXdfbmFtZSwgJm5zdCkpIHsKKwkJaWYgKFNfSVNESVIobnN0LnN0X21vZGUpIHx8IG9rX2lmX2V4aXN0cykKKwkJCXJldHVybiAwOworCQkvKgorCQkgKiBBIGxlYWRpbmcgY29tcG9uZW50IG9mIG5ld19uYW1lIG1pZ2h0IGJlIGEgc3ltbGluaworCQkgKiB0aGF0IGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgd2l0aCB0aGlzIHBhdGNoLCBidXQKKwkJICogc3RpbGwgcG9pbnRpbmcgYXQgc29tZXdoZXJlIHRoYXQgaGFzIHRoZSBwYXRoLgorCQkgKiBJbiBzdWNoIGEgY2FzZSwgcGF0aCAibmV3X25hbWUiIGRvZXMgbm90IGV4aXN0IGFzCisJCSAqIGZhciBhcyBnaXQgaXMgY29uY2VybmVkLgorCQkgKi8KKwkJaWYgKGhhc19zeW1saW5rX2xlYWRpbmdfcGF0aChuZXdfbmFtZSwgTlVMTCkpCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gZXJyb3IoIiVzOiBhbHJlYWR5IGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIsIG5ld19uYW1lKTsKKwl9CisJZWxzZSBpZiAoKGVycm5vICE9IEVOT0VOVCkgJiYgKGVycm5vICE9IEVOT1RESVIpKQorCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG5ld19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhdGNoKHN0cnVjdCBwYXRjaCAqcGF0Y2gsIHN0cnVjdCBwYXRjaCAqcHJldl9wYXRjaCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IHBhdGNoLT5vbGRfbmFtZTsKKwljb25zdCBjaGFyICpuZXdfbmFtZSA9IHBhdGNoLT5uZXdfbmFtZTsKKwljb25zdCBjaGFyICpuYW1lID0gb2xkX25hbWUgPyBvbGRfbmFtZSA6IG5ld19uYW1lOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBOVUxMOworCWludCBva19pZl9leGlzdHM7CisKKwlwYXRjaC0+cmVqZWN0ZWQgPSAxOyAvKiB3ZSB3aWxsIGRyb3AgdGhpcyBhZnRlciB3ZSBzdWNjZWVkICovCisJaWYgKG9sZF9uYW1lKSB7CisJCWludCBjaGFuZ2VkID0gMDsKKwkJaW50IHN0YXRfcmV0ID0gMDsKKwkJdW5zaWduZWQgc3RfbW9kZSA9IDA7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdGF0X3JldCA9IGxzdGF0KG9sZF9uYW1lLCAmc3QpOworCQlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhvbGRfbmFtZSwgc3RybGVuKG9sZF9uYW1lKSk7CisJCQlpZiAocG9zIDwgMCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBleGlzdCBpbiBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChzdGF0X3JldCA8IDApIHsKKwkJCQlzdHJ1Y3QgY2hlY2tvdXQgY29zdGF0ZTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG9sZF9uYW1lLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCS8qIGNoZWNrb3V0ICovCisJCQkJY29zdGF0ZS5iYXNlX2RpciA9ICIiOworCQkJCWNvc3RhdGUuYmFzZV9kaXJfbGVuID0gMDsKKwkJCQljb3N0YXRlLmZvcmNlID0gMDsKKwkJCQljb3N0YXRlLnF1aWV0ID0gMDsKKwkJCQljb3N0YXRlLm5vdF9uZXcgPSAwOworCQkJCWNvc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLAorCQkJCQkJICAgJmNvc3RhdGUsCisJCQkJCQkgICBOVUxMKSB8fAorCQkJCSAgICBsc3RhdChvbGRfbmFtZSwgJnN0KSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCFjYWNoZWQpCisJCQkJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMSk7CisJCQlpZiAoY2hhbmdlZCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBtYXRjaCBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJaWYgKGNhY2hlZCkKKwkJCQlzdF9tb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQl9CisJCWVsc2UgaWYgKHN0YXRfcmV0IDwgMCkKKwkJCXJldHVybiBlcnJvcigiJXM6ICVzIiwgb2xkX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdF9tb2RlID0gbnRvaGwoY2VfbW9kZV9mcm9tX3N0YXQoY2UsIHN0LnN0X21vZGUpKTsKKworCQlpZiAocGF0Y2gtPmlzX25ldyA8IDApCisJCQlwYXRjaC0+aXNfbmV3ID0gMDsKKwkJaWYgKCFwYXRjaC0+b2xkX21vZGUpCisJCQlwYXRjaC0+b2xkX21vZGUgPSBzdF9tb2RlOworCQlpZiAoKHN0X21vZGUgXiBwYXRjaC0+b2xkX21vZGUpICYgU19JRk1UKQorCQkJcmV0dXJuIGVycm9yKCIlczogd3JvbmcgdHlwZSIsIG9sZF9uYW1lKTsKKwkJaWYgKHN0X21vZGUgIT0gcGF0Y2gtPm9sZF9tb2RlKQorCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlcyBoYXMgdHlwZSAlbywgZXhwZWN0ZWQgJW9cbiIsCisJCQkJb2xkX25hbWUsIHN0X21vZGUsIHBhdGNoLT5vbGRfbW9kZSk7CisJfQorCisJaWYgKG5ld19uYW1lICYmIHByZXZfcGF0Y2ggJiYgMCA8IHByZXZfcGF0Y2gtPmlzX2RlbGV0ZSAmJgorCSAgICAhc3RyY21wKHByZXZfcGF0Y2gtPm9sZF9uYW1lLCBuZXdfbmFtZSkpCisJCS8qIEEgdHlwZS1jaGFuZ2UgZGlmZiBpcyBhbHdheXMgc3BsaXQgaW50byBhIHBhdGNoIHRvCisJCSAqIGRlbGV0ZSBvbGQsIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgcGF0Y2ggdG8KKwkJICogY3JlYXRlIG5ldyAoc2VlIGRpZmYuYzo6cnVuX2RpZmYoKSk7IGluIHN1Y2ggYSBjYXNlCisJCSAqIGl0IGlzIE9rIHRoYXQgdGhlIGVudHJ5IHRvIGJlIGRlbGV0ZWQgYnkgdGhlCisJCSAqIHByZXZpb3VzIHBhdGNoIGlzIHN0aWxsIGluIHRoZSB3b3JraW5nIHRyZWUgYW5kIGluCisJCSAqIHRoZSBpbmRleC4KKwkJICovCisJCW9rX2lmX2V4aXN0cyA9IDE7CisJZWxzZQorCQlva19pZl9leGlzdHMgPSAwOworCisJaWYgKG5ld19uYW1lICYmCisJICAgICgoMCA8IHBhdGNoLT5pc19uZXcpIHwgKDAgPCBwYXRjaC0+aXNfcmVuYW1lKSB8IHBhdGNoLT5pc19jb3B5KSkgeworCQlpZiAoY2hlY2tfaW5kZXggJiYKKwkJICAgIGNhY2hlX25hbWVfcG9zKG5ld19uYW1lLCBzdHJsZW4obmV3X25hbWUpKSA+PSAwICYmCisJCSAgICAhb2tfaWZfZXhpc3RzKQorCQkJcmV0dXJuIGVycm9yKCIlczogYWxyZWFkeSBleGlzdHMgaW4gaW5kZXgiLCBuZXdfbmFtZSk7CisJCWlmICghY2FjaGVkKSB7CisJCQlpbnQgZXJyID0gY2hlY2tfdG9fY3JlYXRlX2Jsb2IobmV3X25hbWUsIG9rX2lmX2V4aXN0cyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKCFwYXRjaC0+bmV3X21vZGUpIHsKKwkJCWlmICgwIDwgcGF0Y2gtPmlzX25ldykKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwkJCWVsc2UKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBwYXRjaC0+b2xkX21vZGU7CisJCX0KKwl9CisKKwlpZiAobmV3X25hbWUgJiYgb2xkX25hbWUpIHsKKwkJaW50IHNhbWUgPSAhc3RyY21wKG9sZF9uYW1lLCBuZXdfbmFtZSk7CisJCWlmICghcGF0Y2gtPm5ld19tb2RlKQorCQkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlOworCQlpZiAoKHBhdGNoLT5vbGRfbW9kZSBeIHBhdGNoLT5uZXdfbW9kZSkgJiBTX0lGTVQpCisJCQlyZXR1cm4gZXJyb3IoIm5ldyBtb2RlICglbykgb2YgJXMgZG9lcyBub3QgbWF0Y2ggb2xkIG1vZGUgKCVvKSVzJXMiLAorCQkJCXBhdGNoLT5uZXdfbW9kZSwgbmV3X25hbWUsIHBhdGNoLT5vbGRfbW9kZSwKKwkJCQlzYW1lID8gIiIgOiAiIG9mICIsIHNhbWUgPyAiIiA6IG9sZF9uYW1lKTsKKwl9CisKKwlpZiAoYXBwbHlfZGF0YShwYXRjaCwgJnN0LCBjZSkgPCAwKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBwYXRjaCBkb2VzIG5vdCBhcHBseSIsIG5hbWUpOworCXBhdGNoLT5yZWplY3RlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBwYXRjaCAqcHJldl9wYXRjaCA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKHByZXZfcGF0Y2ggPSBOVUxMOyBwYXRjaCA7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJaWYgKGFwcGx5X3ZlcmJvc2VseSkKKwkJCXNheV9wYXRjaF9uYW1lKHN0ZGVyciwKKwkJCQkgICAgICAgIkNoZWNraW5nIHBhdGNoICIsIHBhdGNoLCAiLi4uXG4iKTsKKwkJZXJyIHw9IGNoZWNrX3BhdGNoKHBhdGNoLCBwcmV2X3BhdGNoKTsKKwkJcHJldl9wYXRjaCA9IHBhdGNoOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzaG93X2luZGV4X2xpc3Qoc3RydWN0IHBhdGNoICpsaXN0KQoreworCXN0cnVjdCBwYXRjaCAqcGF0Y2g7CisKKwkvKiBPbmNlIHdlIHN0YXJ0IHN1cHBvcnRpbmcgdGhlIHJldmVyc2UgcGF0Y2gsIGl0IG1heSBiZQorCSAqIHdvcnRoIHNob3dpbmcgdGhlIG5ldyBzaGExIHByZWZpeCwgYnV0IHVudGlsIHRoZW4uLi4KKwkgKi8KKwlmb3IgKHBhdGNoID0gbGlzdDsgcGF0Y2g7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMV9wdHI7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJbmFtZSA9IHBhdGNoLT5vbGRfbmFtZSA/IHBhdGNoLT5vbGRfbmFtZSA6IHBhdGNoLT5uZXdfbmFtZTsKKwkJaWYgKDAgPCBwYXRjaC0+aXNfbmV3KQorCQkJc2hhMV9wdHIgPSBudWxsX3NoYTE7CisJCWVsc2UgaWYgKGdldF9zaGExKHBhdGNoLT5vbGRfc2hhMV9wcmVmaXgsIHNoYTEpKQorCQkJZGllKCJzaGExIGluZm9ybWF0aW9uIGlzIGxhY2tpbmcgb3IgdXNlbGVzcyAoJXMpLiIsCisJCQkgICAgbmFtZSk7CisJCWVsc2UKKwkJCXNoYTFfcHRyID0gc2hhMTsKKworCQlwcmludGYoIiUwNm8gJXMJIixwYXRjaC0+b2xkX21vZGUsIHNoYTFfdG9faGV4KHNoYTFfcHRyKSk7CisJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCkpCisJCQlxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIHN0ZG91dCwgMCk7CisJCWVsc2UKKwkJCWZwdXRzKG5hbWUsIHN0ZG91dCk7CisJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGF0X3BhdGNoX2xpc3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpbnQgZmlsZXMsIGFkZHMsIGRlbHM7CisKKwlmb3IgKGZpbGVzID0gYWRkcyA9IGRlbHMgPSAwIDsgcGF0Y2ggOyBwYXRjaCA9IHBhdGNoLT5uZXh0KSB7CisJCWZpbGVzKys7CisJCWFkZHMgKz0gcGF0Y2gtPmxpbmVzX2FkZGVkOworCQlkZWxzICs9IHBhdGNoLT5saW5lc19kZWxldGVkOworCQlzaG93X3N0YXRzKHBhdGNoKTsKKwl9CisKKwlwcmludGYoIiAlZCBmaWxlcyBjaGFuZ2VkLCAlZCBpbnNlcnRpb25zKCspLCAlZCBkZWxldGlvbnMoLSlcbiIsIGZpbGVzLCBhZGRzLCBkZWxzKTsKK30KKworc3RhdGljIHZvaWQgbnVtc3RhdF9wYXRjaF9saXN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJZm9yICggOyBwYXRjaDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQljb25zdCBjaGFyICpuYW1lOworCQluYW1lID0gcGF0Y2gtPm5ld19uYW1lID8gcGF0Y2gtPm5ld19uYW1lIDogcGF0Y2gtPm9sZF9uYW1lOworCQlpZiAocGF0Y2gtPmlzX2JpbmFyeSkKKwkJCXByaW50ZigiLVx0LVx0Iik7CisJCWVsc2UKKwkJCXByaW50ZigiJWRcdCVkXHQiLAorCQkJICAgICAgIHBhdGNoLT5saW5lc19hZGRlZCwgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQpOworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKQorCQkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBzdGRvdXQsIDApOworCQllbHNlCisJCQlmcHV0cyhuYW1lLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlX21vZGVfbmFtZShjb25zdCBjaGFyICpuZXdkZWxldGUsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChtb2RlKQorCQlwcmludGYoIiAlcyBtb2RlICUwNm8gJXNcbiIsIG5ld2RlbGV0ZSwgbW9kZSwgbmFtZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlc1xuIiwgbmV3ZGVsZXRlLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19tb2RlX2NoYW5nZShzdHJ1Y3QgcGF0Y2ggKnAsIGludCBzaG93X25hbWUpCit7CisJaWYgKHAtPm9sZF9tb2RlICYmIHAtPm5ld19tb2RlICYmIHAtPm9sZF9tb2RlICE9IHAtPm5ld19tb2RlKSB7CisJCWlmIChzaG93X25hbWUpCisJCQlwcmludGYoIiBtb2RlIGNoYW5nZSAlMDZvID0+ICUwNm8gJXNcbiIsCisJCQkgICAgICAgcC0+b2xkX21vZGUsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2b1xuIiwKKwkJCSAgICAgICBwLT5vbGRfbW9kZSwgcC0+bmV3X21vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19yZW5hbWVfY29weShzdHJ1Y3QgcGF0Y2ggKnApCit7CisJY29uc3QgY2hhciAqcmVuYW1lY29weSA9IHAtPmlzX3JlbmFtZSA/ICJyZW5hbWUiIDogImNvcHkiOworCWNvbnN0IGNoYXIgKm9sZCwgKm5ldzsKKworCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCW9sZCA9IHAtPm9sZF9uYW1lOworCW5ldyA9IHAtPm5ld19uYW1lOworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKnNsYXNoX29sZCwgKnNsYXNoX25ldzsKKwkJc2xhc2hfb2xkID0gc3RyY2hyKG9sZCwgJy8nKTsKKwkJc2xhc2hfbmV3ID0gc3RyY2hyKG5ldywgJy8nKTsKKwkJaWYgKCFzbGFzaF9vbGQgfHwKKwkJICAgICFzbGFzaF9uZXcgfHwKKwkJICAgIHNsYXNoX29sZCAtIG9sZCAhPSBzbGFzaF9uZXcgLSBuZXcgfHwKKwkJICAgIG1lbWNtcChvbGQsIG5ldywgc2xhc2hfbmV3IC0gbmV3KSkKKwkJCWJyZWFrOworCQlvbGQgPSBzbGFzaF9vbGQgKyAxOworCQluZXcgPSBzbGFzaF9uZXcgKyAxOworCX0KKwkvKiBwLT5vbGRfbmFtZSB0aHJ1IG9sZCBpcyB0aGUgY29tbW9uIHByZWZpeCwgYW5kIG9sZCBhbmQgbmV3CisJICogdGhyb3VnaCB0aGUgZW5kIG9mIG5hbWVzIGFyZSByZW5hbWVzCisJICovCisJaWYgKG9sZCAhPSBwLT5vbGRfbmFtZSkKKwkJcHJpbnRmKCIgJXMgJS4qc3slcyA9PiAlc30gKCVkJSUpXG4iLCByZW5hbWVjb3B5LAorCQkgICAgICAgKGludCkob2xkIC0gcC0+b2xkX25hbWUpLCBwLT5vbGRfbmFtZSwKKwkJICAgICAgIG9sZCwgbmV3LCBwLT5zY29yZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlcyA9PiAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICBwLT5vbGRfbmFtZSwgcC0+bmV3X25hbWUsIHAtPnNjb3JlKTsKKwlzaG93X21vZGVfY2hhbmdlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBzdW1tYXJ5X3BhdGNoX2xpc3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgcGF0Y2ggKnA7CisKKwlmb3IgKHAgPSBwYXRjaDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmlzX25ldykKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImNyZWF0ZSIsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UgaWYgKHAtPmlzX2RlbGV0ZSkKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImRlbGV0ZSIsIHAtPm9sZF9tb2RlLCBwLT5vbGRfbmFtZSk7CisJCWVsc2UgeworCQkJaWYgKHAtPmlzX3JlbmFtZSB8fCBwLT5pc19jb3B5KQorCQkJCXNob3dfcmVuYW1lX2NvcHkocCk7CisJCQllbHNlIHsKKwkJCQlpZiAocC0+c2NvcmUpIHsKKwkJCQkJcHJpbnRmKCIgcmV3cml0ZSAlcyAoJWQlJSlcbiIsCisJCQkJCSAgICAgICBwLT5uZXdfbmFtZSwgcC0+c2NvcmUpOworCQkJCQlzaG93X21vZGVfY2hhbmdlKHAsIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXNob3dfbW9kZV9jaGFuZ2UocCwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX3N0YXRzKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGxpbmVzID0gcGF0Y2gtPmxpbmVzX2FkZGVkICsgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQ7CisKKwlpZiAobGluZXMgPiBtYXhfY2hhbmdlKQorCQltYXhfY2hhbmdlID0gbGluZXM7CisJaWYgKHBhdGNoLT5vbGRfbmFtZSkgeworCQlpbnQgbGVuID0gcXVvdGVfY19zdHlsZShwYXRjaC0+b2xkX25hbWUsIE5VTEwsIE5VTEwsIDApOworCQlpZiAoIWxlbikKKwkJCWxlbiA9IHN0cmxlbihwYXRjaC0+b2xkX25hbWUpOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCW1heF9sZW4gPSBsZW47CisJfQorCWlmIChwYXRjaC0+bmV3X25hbWUpIHsKKwkJaW50IGxlbiA9IHF1b3RlX2Nfc3R5bGUocGF0Y2gtPm5ld19uYW1lLCBOVUxMLCBOVUxMLCAwKTsKKwkJaWYgKCFsZW4pCisJCQlsZW4gPSBzdHJsZW4ocGF0Y2gtPm5ld19uYW1lKTsKKwkJaWYgKGxlbiA+IG1heF9sZW4pCisJCQltYXhfbGVuID0gbGVuOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbGUoc3RydWN0IHBhdGNoICpwYXRjaCwgaW50IHJtZGlyX2VtcHR5KQoreworCWlmICh1cGRhdGVfaW5kZXgpIHsKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0Y2gtPm9sZF9uYW1lKSA8IDApCisJCQlkaWUoInVuYWJsZSB0byByZW1vdmUgJXMgZnJvbSBpbmRleCIsIHBhdGNoLT5vbGRfbmFtZSk7CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRjaC0+b2xkX25hbWUpOworCX0KKwlpZiAoIWNhY2hlZCkgeworCQlpZiAoIXVubGluayhwYXRjaC0+b2xkX25hbWUpICYmIHJtZGlyX2VtcHR5KSB7CisJCQljaGFyICpuYW1lID0geHN0cmR1cChwYXRjaC0+b2xkX25hbWUpOworCQkJY2hhciAqZW5kID0gc3RycmNocihuYW1lLCAnLycpOworCQkJd2hpbGUgKGVuZCkgeworCQkJCSplbmQgPSAwOworCQkJCWlmIChybWRpcihuYW1lKSkKKwkJCQkJYnJlYWs7CisJCQkJZW5kID0gc3RycmNocihuYW1lLCAnLycpOworCQkJfQorCQkJZnJlZShuYW1lKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWRkX2luZGV4X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbW9kZSwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwl1bnNpZ25lZCBjZV9zaXplID0gY2FjaGVfZW50cnlfc2l6ZShuYW1lbGVuKTsKKworCWlmICghdXBkYXRlX2luZGV4KQorCQlyZXR1cm47CisKKwljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBuYW1lbGVuKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWNlLT5jZV9mbGFncyA9IGh0b25zKG5hbWVsZW4pOworCWlmICghY2FjaGVkKSB7CisJCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIHN0YXQgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJCWZpbGxfc3RhdF9jYWNoZV9pbmZvKGNlLCAmc3QpOworCX0KKwlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgYmxvYl90eXBlLCBjZS0+c2hhMSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgYmFja2luZyBzdG9yZSBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBhZGQgY2FjaGUgZW50cnkgZm9yICVzIiwgcGF0aCk7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZmQ7CisJY2hhciAqbmJ1ZjsKKworCWlmIChoYXNfc3ltbGlua3MgJiYgU19JU0xOSyhtb2RlKSkKKwkJLyogQWx0aG91Z2ggYnVmOnNpemUgaXMgY291bnRlZCBzdHJpbmcsIGl0IGFsc28gaXMgTlVMCisJCSAqIHRlcm1pbmF0ZWQuCisJCSAqLworCQlyZXR1cm4gc3ltbGluayhidWYsIHBhdGgpOworCisJZmQgPSBvcGVuKHBhdGgsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgKG1vZGUgJiAwMTAwKSA/IDA3NzcgOiAwNjY2KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwluYnVmID0gY29udmVydF90b193b3JraW5nX3RyZWUocGF0aCwgYnVmLCAmc2l6ZSk7CisJaWYgKG5idWYpCisJCWJ1ZiA9IG5idWY7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgd3JpdHRlbiA9IHh3cml0ZShmZCwgYnVmLCBzaXplKTsKKwkJaWYgKHdyaXR0ZW4gPCAwKQorCQkJZGllKCJ3cml0aW5nIGZpbGUgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKCF3cml0dGVuKQorCQkJZGllKCJvdXQgb2Ygc3BhY2Ugd3JpdGluZyBmaWxlICVzIiwgcGF0aCk7CisJCWJ1ZiArPSB3cml0dGVuOworCQlzaXplIC09IHdyaXR0ZW47CisJfQorCWlmIChjbG9zZShmZCkgPCAwKQorCQlkaWUoImNsb3NpbmcgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCWlmIChuYnVmKQorCQlmcmVlKG5idWYpOworCXJldHVybiAwOworfQorCisvKgorICogV2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yaWVzIGV4aXN0LAorICogd2hpY2ggaXMgdHJ1ZSA5OSUgb2YgdGhlIHRpbWUgYW55d2F5LiBJZiB0aGV5IGRvbid0LAorICogd2UgY3JlYXRlIHRoZW0gYW5kIHRyeSBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX29uZV9maWxlKGNoYXIgKnBhdGgsIHVuc2lnbmVkIG1vZGUsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChjYWNoZWQpCisJCXJldHVybjsKKwlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQlyZXR1cm47CisKKwlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKHBhdGgpKQorCQkJcmV0dXJuOworCQlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQkJcmV0dXJuOworCX0KKworCWlmIChlcnJubyA9PSBFRVhJU1QgfHwgZXJybm8gPT0gRUFDQ0VTKSB7CisJCS8qIFdlIG1heSBiZSB0cnlpbmcgdG8gY3JlYXRlIGEgZmlsZSB3aGVyZSBhIGRpcmVjdG9yeQorCQkgKiB1c2VkIHRvIGJlLgorCQkgKi8KKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICghbHN0YXQocGF0aCwgJnN0KSAmJiAoIVNfSVNESVIoc3Quc3RfbW9kZSkgfHwgIXJtZGlyKHBhdGgpKSkKKwkJCWVycm5vID0gRUVYSVNUOworCX0KKworCWlmIChlcnJubyA9PSBFRVhJU1QpIHsKKwkJdW5zaWduZWQgaW50IG5yID0gZ2V0cGlkKCk7CisKKwkJZm9yICg7OykgeworCQkJY29uc3QgY2hhciAqbmV3cGF0aDsKKwkJCW5ld3BhdGggPSBta3BhdGgoIiVzfiV1IiwgcGF0aCwgbnIpOworCQkJaWYgKCF0cnlfY3JlYXRlX2ZpbGUobmV3cGF0aCwgbW9kZSwgYnVmLCBzaXplKSkgeworCQkJCWlmICghcmVuYW1lKG5ld3BhdGgsIHBhdGgpKQorCQkJCQlyZXR1cm47CisJCQkJdW5saW5rKG5ld3BhdGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVycm5vICE9IEVFWElTVCkKKwkJCQlicmVhazsKKwkJCSsrbnI7CisJCX0KKwl9CisJZGllKCJ1bmFibGUgdG8gd3JpdGUgZmlsZSAlcyBtb2RlICVvIiwgcGF0aCwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9maWxlKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY2hhciAqcGF0aCA9IHBhdGNoLT5uZXdfbmFtZTsKKwl1bnNpZ25lZCBtb2RlID0gcGF0Y2gtPm5ld19tb2RlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBhdGNoLT5yZXN1bHRzaXplOworCWNoYXIgKmJ1ZiA9IHBhdGNoLT5yZXN1bHQ7CisKKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwljcmVhdGVfb25lX2ZpbGUocGF0aCwgbW9kZSwgYnVmLCBzaXplKTsKKwlhZGRfaW5kZXhfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpOworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKK30KKworLyogcGhhc2UgemVybyBpcyB0byByZW1vdmUsIHBoYXNlIG9uZSBpcyB0byBjcmVhdGUgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX291dF9vbmVfcmVzdWx0KHN0cnVjdCBwYXRjaCAqcGF0Y2gsIGludCBwaGFzZSkKK3sKKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSA+IDApIHsKKwkJaWYgKHBoYXNlID09IDApCisJCQlyZW1vdmVfZmlsZShwYXRjaCwgMSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBhdGNoLT5pc19uZXcgPiAwIHx8IHBhdGNoLT5pc19jb3B5KSB7CisJCWlmIChwaGFzZSA9PSAxKQorCQkJY3JlYXRlX2ZpbGUocGF0Y2gpOworCQlyZXR1cm47CisJfQorCS8qCisJICogUmVuYW1lIG9yIG1vZGlmaWNhdGlvbiBib2lscyBkb3duIHRvIHRoZSBzYW1lCisJICogdGhpbmc6IHJlbW92ZSB0aGUgb2xkLCB3cml0ZSB0aGUgbmV3CisJICovCisJaWYgKHBoYXNlID09IDApCisJCXJlbW92ZV9maWxlKHBhdGNoLCAwKTsKKwlpZiAocGhhc2UgPT0gMSkKKwkJY3JlYXRlX2ZpbGUocGF0Y2gpOworfQorCitzdGF0aWMgaW50IHdyaXRlX291dF9vbmVfcmVqZWN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJRklMRSAqcmVqOworCWNoYXIgbmFtZWJ1ZltQQVRIX01BWF07CisJc3RydWN0IGZyYWdtZW50ICpmcmFnOworCWludCBjbnQgPSAwOworCisJZm9yIChjbnQgPSAwLCBmcmFnID0gcGF0Y2gtPmZyYWdtZW50czsgZnJhZzsgZnJhZyA9IGZyYWctPm5leHQpIHsKKwkJaWYgKCFmcmFnLT5yZWplY3RlZCkKKwkJCWNvbnRpbnVlOworCQljbnQrKzsKKwl9CisKKwlpZiAoIWNudCkgeworCQlpZiAoYXBwbHlfdmVyYm9zZWx5KQorCQkJc2F5X3BhdGNoX25hbWUoc3RkZXJyLAorCQkJCSAgICAgICAiQXBwbGllZCBwYXRjaCAiLCBwYXRjaCwgIiBjbGVhbmx5LlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJlY2F1c2UgYSByZW1vdmFsIHBhdGNoIHRoYXQgbGVhdmVzCisJICogY29udGVudHMgYXJlIG1hcmtlZCAicmVqZWN0ZWQiIGF0IHRoZSBwYXRjaCBsZXZlbC4KKwkgKi8KKwlpZiAoIXBhdGNoLT5uZXdfbmFtZSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvciIpOworCisJLyogU2F5IHRoaXMgZXZlbiB3aXRob3V0IC0tdmVyYm9zZSAqLworCXNheV9wYXRjaF9uYW1lKHN0ZGVyciwgIkFwcGx5aW5nIHBhdGNoICIsIHBhdGNoLCAiIHdpdGgiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAlZCByZWplY3RzLi4uXG4iLCBjbnQpOworCisJY250ID0gc3RybGVuKHBhdGNoLT5uZXdfbmFtZSk7CisJaWYgKEFSUkFZX1NJWkUobmFtZWJ1ZikgPD0gY250ICsgNSkgeworCQljbnQgPSBBUlJBWV9TSVpFKG5hbWVidWYpIC0gNTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkid2FybmluZzogdHJ1bmNhdGluZyAucmVqIGZpbGVuYW1lIHRvICUuKnMucmVqIiwKKwkJCWNudCAtIDEsIHBhdGNoLT5uZXdfbmFtZSk7CisJfQorCW1lbWNweShuYW1lYnVmLCBwYXRjaC0+bmV3X25hbWUsIGNudCk7CisJbWVtY3B5KG5hbWVidWYgKyBjbnQsICIucmVqIiwgNSk7CisKKwlyZWogPSBmb3BlbihuYW1lYnVmLCAidyIpOworCWlmICghcmVqKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBvcGVuICVzOiAlcyIsIG5hbWVidWYsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBOb3JtYWwgZ2l0IHRvb2xzIG5ldmVyIGRlYWwgd2l0aCAucmVqLCBzbyBkbyBub3QgcHJldGVuZAorCSAqIHRoaXMgaXMgYSBnaXQgcGF0Y2ggYnkgc2F5aW5nIC0tZ2l0IG5vciBnaXZlIGV4dGVuZGVkCisJICogaGVhZGVycy4gIFdoaWxlIGF0IGl0LCBtYXliZSBwbGVhc2UgImtvbXBhcmUiIHRoYXQgd2FudHMKKwkgKiB0aGUgdHJhaWxpbmcgVEFCIGFuZCBzb21lIGdhcmJhZ2UgYXQgdGhlIGVuZCBvZiBsaW5lIDstKS4KKwkgKi8KKwlmcHJpbnRmKHJlaiwgImRpZmYgYS8lcyBiLyVzXHQocmVqZWN0ZWQgaHVua3MpXG4iLAorCQlwYXRjaC0+bmV3X25hbWUsIHBhdGNoLT5uZXdfbmFtZSk7CisJZm9yIChjbnQgPSAxLCBmcmFnID0gcGF0Y2gtPmZyYWdtZW50czsKKwkgICAgIGZyYWc7CisJICAgICBjbnQrKywgZnJhZyA9IGZyYWctPm5leHQpIHsKKwkJaWYgKCFmcmFnLT5yZWplY3RlZCkgeworCQkJZnByaW50ZihzdGRlcnIsICJIdW5rICMlZCBhcHBsaWVkIGNsZWFubHkuXG4iLCBjbnQpOworCQkJY29udGludWU7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJSZWplY3RlZCBodW5rICMlZC5cbiIsIGNudCk7CisJCWZwcmludGYocmVqLCAiJS4qcyIsIGZyYWctPnNpemUsIGZyYWctPnBhdGNoKTsKKwkJaWYgKGZyYWctPnBhdGNoW2ZyYWctPnNpemUtMV0gIT0gJ1xuJykKKwkJCWZwdXRjKCdcbicsIHJlaik7CisJfQorCWZjbG9zZShyZWopOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB3cml0ZV9vdXRfcmVzdWx0cyhzdHJ1Y3QgcGF0Y2ggKmxpc3QsIGludCBza2lwcGVkX3BhdGNoKQoreworCWludCBwaGFzZTsKKwlpbnQgZXJycyA9IDA7CisJc3RydWN0IHBhdGNoICpsOworCisJaWYgKCFsaXN0ICYmICFza2lwcGVkX3BhdGNoKQorCQlyZXR1cm4gZXJyb3IoIk5vIGNoYW5nZXMiKTsKKworCWZvciAocGhhc2UgPSAwOyBwaGFzZSA8IDI7IHBoYXNlKyspIHsKKwkJbCA9IGxpc3Q7CisJCXdoaWxlIChsKSB7CisJCQlpZiAobC0+cmVqZWN0ZWQpCisJCQkJZXJycyA9IDE7CisJCQllbHNlIHsKKwkJCQl3cml0ZV9vdXRfb25lX3Jlc3VsdChsLCBwaGFzZSk7CisJCQkJaWYgKHBoYXNlID09IDEgJiYgd3JpdGVfb3V0X29uZV9yZWplY3QobCkpCisJCQkJCWVycnMgPSAxOworCQkJfQorCQkJbCA9IGwtPm5leHQ7CisJCX0KKwl9CisJcmV0dXJuIGVycnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2tfZmlsZTsKKworc3RhdGljIHN0cnVjdCBleGNsdWRlcyB7CisJc3RydWN0IGV4Y2x1ZGVzICpuZXh0OworCWNvbnN0IGNoYXIgKnBhdGg7Cit9ICpleGNsdWRlczsKKworc3RhdGljIGludCB1c2VfcGF0Y2goc3RydWN0IHBhdGNoICpwKQoreworCWNvbnN0IGNoYXIgKnBhdGhuYW1lID0gcC0+bmV3X25hbWUgPyBwLT5uZXdfbmFtZSA6IHAtPm9sZF9uYW1lOworCXN0cnVjdCBleGNsdWRlcyAqeCA9IGV4Y2x1ZGVzOworCXdoaWxlICh4KSB7CisJCWlmIChmbm1hdGNoKHgtPnBhdGgsIHBhdGhuYW1lLCAwKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCXggPSB4LT5uZXh0OworCX0KKwlpZiAoMCA8IHByZWZpeF9sZW5ndGgpIHsKKwkJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCQlpZiAocGF0aGxlbiA8PSBwcmVmaXhfbGVuZ3RoIHx8CisJCSAgICBtZW1jbXAocHJlZml4LCBwYXRobmFtZSwgcHJlZml4X2xlbmd0aCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByZWZpeF9vbmUoY2hhciAqKm5hbWUpCit7CisJY2hhciAqb2xkX25hbWUgPSAqbmFtZTsKKwlpZiAoIW9sZF9uYW1lKQorCQlyZXR1cm47CisJKm5hbWUgPSB4c3RyZHVwKHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHByZWZpeF9sZW5ndGgsICpuYW1lKSk7CisJZnJlZShvbGRfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZWZpeF9wYXRjaGVzKHN0cnVjdCBwYXRjaCAqcCkKK3sKKwlpZiAoIXByZWZpeCB8fCBwLT5pc190b3BsZXZlbF9yZWxhdGl2ZSkKKwkJcmV0dXJuOworCWZvciAoIDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPm5ld19uYW1lID09IHAtPm9sZF9uYW1lKSB7CisJCQljaGFyICpwcmVmaXhlZCA9IHAtPm5ld19uYW1lOworCQkJcHJlZml4X29uZSgmcHJlZml4ZWQpOworCQkJcC0+bmV3X25hbWUgPSBwLT5vbGRfbmFtZSA9IHByZWZpeGVkOworCQl9CisJCWVsc2UgeworCQkJcHJlZml4X29uZSgmcC0+bmV3X25hbWUpOworCQkJcHJlZml4X29uZSgmcC0+b2xkX25hbWUpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGFwcGx5X3BhdGNoKGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpbmFjY3VyYXRlX2VvZikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKKwljaGFyICpidWZmZXIgPSByZWFkX3BhdGNoX2ZpbGUoZmQsICZzaXplKTsKKwlzdHJ1Y3QgcGF0Y2ggKmxpc3QgPSBOVUxMLCAqKmxpc3RwID0gJmxpc3Q7CisJaW50IHNraXBwZWRfcGF0Y2ggPSAwOworCisJcGF0Y2hfaW5wdXRfZmlsZSA9IGZpbGVuYW1lOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLTE7CisJb2Zmc2V0ID0gMDsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJc3RydWN0IHBhdGNoICpwYXRjaDsKKwkJaW50IG5yOworCisJCXBhdGNoID0geGNhbGxvYygxLCBzaXplb2YoKnBhdGNoKSk7CisJCXBhdGNoLT5pbmFjY3VyYXRlX2VvZiA9IGluYWNjdXJhdGVfZW9mOworCQluciA9IHBhcnNlX2NodW5rKGJ1ZmZlciArIG9mZnNldCwgc2l6ZSwgcGF0Y2gpOworCQlpZiAobnIgPCAwKQorCQkJYnJlYWs7CisJCWlmIChhcHBseV9pbl9yZXZlcnNlKQorCQkJcmV2ZXJzZV9wYXRjaGVzKHBhdGNoKTsKKwkJaWYgKHByZWZpeCkKKwkJCXByZWZpeF9wYXRjaGVzKHBhdGNoKTsKKwkJaWYgKHVzZV9wYXRjaChwYXRjaCkpIHsKKwkJCXBhdGNoX3N0YXRzKHBhdGNoKTsKKwkJCSpsaXN0cCA9IHBhdGNoOworCQkJbGlzdHAgPSAmcGF0Y2gtPm5leHQ7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBwZXJoYXBzIGZyZWUgaXQgYSBiaXQgYmV0dGVyPyAqLworCQkJZnJlZShwYXRjaCk7CisJCQlza2lwcGVkX3BhdGNoKys7CisJCX0KKwkJb2Zmc2V0ICs9IG5yOworCQlzaXplIC09IG5yOworCX0KKworCWlmICh3aGl0ZXNwYWNlX2Vycm9yICYmIChuZXdfd2hpdGVzcGFjZSA9PSBlcnJvcl9vbl93aGl0ZXNwYWNlKSkKKwkJYXBwbHkgPSAwOworCisJdXBkYXRlX2luZGV4ID0gY2hlY2tfaW5kZXggJiYgYXBwbHk7CisJaWYgKHVwZGF0ZV9pbmRleCAmJiBuZXdmZCA8IDApCisJCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSwgMSk7CisKKwlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCQlkaWUoInVuYWJsZSB0byByZWFkIGluZGV4IGZpbGUiKTsKKwl9CisKKwlpZiAoKGNoZWNrIHx8IGFwcGx5KSAmJgorCSAgICBjaGVja19wYXRjaF9saXN0KGxpc3QpIDwgMCAmJgorCSAgICAhYXBwbHlfd2l0aF9yZWplY3QpCisJCWV4aXQoMSk7CisKKwlpZiAoYXBwbHkgJiYgd3JpdGVfb3V0X3Jlc3VsdHMobGlzdCwgc2tpcHBlZF9wYXRjaCkpCisJCWV4aXQoMSk7CisKKwlpZiAoc2hvd19pbmRleF9pbmZvKQorCQlzaG93X2luZGV4X2xpc3QobGlzdCk7CisKKwlpZiAoZGlmZnN0YXQpCisJCXN0YXRfcGF0Y2hfbGlzdChsaXN0KTsKKworCWlmIChudW1zdGF0KQorCQludW1zdGF0X3BhdGNoX2xpc3QobGlzdCk7CisKKwlpZiAoc3VtbWFyeSkKKwkJc3VtbWFyeV9wYXRjaF9saXN0KGxpc3QpOworCisJZnJlZShidWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdF9hcHBseV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJhcHBseS53aGl0ZXNwYWNlIikpIHsKKwkJYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlID0geHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCisKK2ludCBjbWRfYXBwbHkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICp1bnVzZWRfcHJlZml4KQoreworCWludCBpOworCWludCByZWFkX3N0ZGluID0gMTsKKwlpbnQgaW5hY2N1cmF0ZV9lb2YgPSAwOworCWludCBlcnJzID0gMDsKKwlpbnQgaXNfbm90X2dpdGRpciA9IDA7CisKKwljb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbiA9IE5VTEw7CisKKwlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmaXNfbm90X2dpdGRpcik7CisJcHJlZml4X2xlbmd0aCA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwlnaXRfY29uZmlnKGdpdF9hcHBseV9jb25maWcpOworCWlmIChhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpCisJCXBhcnNlX3doaXRlc3BhY2Vfb3B0aW9uKGFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNoYXIgKmVuZDsKKwkJaW50IGZkOworCisJCWlmICghc3RyY21wKGFyZywgIi0iKSkgeworCQkJZXJycyB8PSBhcHBseV9wYXRjaCgwLCAiPHN0ZGluPiIsIGluYWNjdXJhdGVfZW9mKTsKKwkJCXJlYWRfc3RkaW4gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlPSIpKSB7CisJCQlzdHJ1Y3QgZXhjbHVkZXMgKnggPSB4bWFsbG9jKHNpemVvZigqeCkpOworCQkJeC0+cGF0aCA9IGFyZyArIDEwOworCQkJeC0+bmV4dCA9IGV4Y2x1ZGVzOworCQkJZXhjbHVkZXMgPSB4OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLXAiKSkgeworCQkJcF92YWx1ZSA9IGF0b2koYXJnICsgMik7CisJCQlwX3ZhbHVlX2tub3duID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tYWRkIikpIHsKKwkJCW5vX2FkZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0YXQiKSkgeworCQkJYXBwbHkgPSAwOworCQkJZGlmZnN0YXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQiKSB8fAorCQkgICAgIXN0cmNtcChhcmcsICItLWJpbmFyeSIpKSB7CisJCQljb250aW51ZTsgLyogbm93IG5vLW9wICovCisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1udW1zdGF0IikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCW51bXN0YXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdW1tYXJ5IikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCXN1bW1hcnkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jaGVjayIpKSB7CisJCQlhcHBseSA9IDA7CisJCQljaGVjayA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWluZGV4IikpIHsKKwkJCWlmIChpc19ub3RfZ2l0ZGlyKQorCQkJCWRpZSgiLS1pbmRleCBvdXRzaWRlIGEgcmVwb3NpdG9yeSIpOworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJaWYgKGlzX25vdF9naXRkaXIpCisJCQkJZGllKCItLWNhY2hlZCBvdXRzaWRlIGEgcmVwb3NpdG9yeSIpOworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYXBwbHkiKSkgeworCQkJYXBwbHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pbmRleC1pbmZvIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCXNob3dfaW5kZXhfaW5mbyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi1DIikpIHsKKwkJCXBfY29udGV4dCA9IHN0cnRvdWwoYXJnICsgMiwgJmVuZCwgMCk7CisJCQlpZiAoKmVuZCAhPSAnXDAnKQorCQkJCWRpZSgidW5yZWNvZ25pemVkIGNvbnRleHQgY291bnQgJyVzJyIsIGFyZyArIDIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS13aGl0ZXNwYWNlPSIpKSB7CisJCQl3aGl0ZXNwYWNlX29wdGlvbiA9IGFyZyArIDEzOworCQkJcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oYXJnICsgMTMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLVIiKSB8fCAhc3RyY21wKGFyZywgIi0tcmV2ZXJzZSIpKSB7CisJCQlhcHBseV9pbl9yZXZlcnNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdW5pZGlmZi16ZXJvIikpIHsKKwkJCXVuaWRpZmZfemVybyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXJlamVjdCIpKSB7CisJCQlhcHBseSA9IGFwcGx5X3dpdGhfcmVqZWN0ID0gYXBwbHlfdmVyYm9zZWx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi12IikgfHwgIXN0cmNtcChhcmcsICItLXZlcmJvc2UiKSkgeworCQkJYXBwbHlfdmVyYm9zZWx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5hY2N1cmF0ZS1lb2YiKSkgeworCQkJaW5hY2N1cmF0ZV9lb2YgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKDAgPCBwcmVmaXhfbGVuZ3RoKQorCQkJYXJnID0gcHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgYXJnKTsKKworCQlmZCA9IG9wZW4oYXJnLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQl1c2FnZShhcHBseV91c2FnZSk7CisJCXJlYWRfc3RkaW4gPSAwOworCQlzZXRfZGVmYXVsdF93aGl0ZXNwYWNlX21vZGUod2hpdGVzcGFjZV9vcHRpb24pOworCQllcnJzIHw9IGFwcGx5X3BhdGNoKGZkLCBhcmcsIGluYWNjdXJhdGVfZW9mKTsKKwkJY2xvc2UoZmQpOworCX0KKwlzZXRfZGVmYXVsdF93aGl0ZXNwYWNlX21vZGUod2hpdGVzcGFjZV9vcHRpb24pOworCWlmIChyZWFkX3N0ZGluKQorCQllcnJzIHw9IGFwcGx5X3BhdGNoKDAsICI8c3RkaW4+IiwgaW5hY2N1cmF0ZV9lb2YpOworCWlmICh3aGl0ZXNwYWNlX2Vycm9yKSB7CisJCWlmIChzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzICYmCisJCSAgICBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzIDwgd2hpdGVzcGFjZV9lcnJvcikgeworCQkJaW50IHNxdWVsY2hlZCA9CisJCQkJd2hpdGVzcGFjZV9lcnJvciAtIHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnM7CisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IHNxdWVsY2hlZCAlZCAiCisJCQkJIndoaXRlc3BhY2UgZXJyb3Ilc1xuIiwKKwkJCQlzcXVlbGNoZWQsCisJCQkJc3F1ZWxjaGVkID09IDEgPyAiIiA6ICJzIik7CisJCX0KKwkJaWYgKG5ld193aGl0ZXNwYWNlID09IGVycm9yX29uX3doaXRlc3BhY2UpCisJCQlkaWUoIiVkIGxpbmUlcyBhZGQlcyB0cmFpbGluZyB3aGl0ZXNwYWNlcy4iLAorCQkJICAgIHdoaXRlc3BhY2VfZXJyb3IsCisJCQkgICAgd2hpdGVzcGFjZV9lcnJvciA9PSAxID8gIiIgOiAicyIsCisJCQkgICAgd2hpdGVzcGFjZV9lcnJvciA9PSAxID8gInMiIDogIiIpOworCQlpZiAoYXBwbGllZF9hZnRlcl9zdHJpcHBpbmcpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVkIGxpbmUlcyBhcHBsaWVkIGFmdGVyIgorCQkJCSIgc3RyaXBwaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2VzLlxuIiwKKwkJCQlhcHBsaWVkX2FmdGVyX3N0cmlwcGluZywKKwkJCQlhcHBsaWVkX2FmdGVyX3N0cmlwcGluZyA9PSAxID8gIiIgOiAicyIpOworCQllbHNlIGlmICh3aGl0ZXNwYWNlX2Vycm9yKQorCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlZCBsaW5lJXMgYWRkJXMgdHJhaWxpbmciCisJCQkJIiB3aGl0ZXNwYWNlcy5cbiIsCisJCQkJd2hpdGVzcGFjZV9lcnJvciwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAiIiA6ICJzIiwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAicyIgOiAiIik7CisJfQorCisJaWYgKHVwZGF0ZV9pbmRleCkgeworCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJldHVybiAhIWVycnM7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWFyY2hpdmUuYyBiL2J1aWx0aW4tYXJjaGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGU0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWFyY2hpdmUuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGcmFuY2sgQnVpLUh1dQorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlbmUgU2NoYXJmZQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBhcmNoaXZlX3VzYWdlW10gPSBcCisiZ2l0LWFyY2hpdmUgLS1mb3JtYXQ9PGZtdD4gWy0tcHJlZml4PTxwcmVmaXg+L10gWy0tdmVyYm9zZV0gWzxleHRyYT5dIDx0cmVlLWlzaD4gW3BhdGguLi5dIjsKKworc3RhdGljIHN0cnVjdCBhcmNoaXZlcl9kZXNjCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwl3cml0ZV9hcmNoaXZlX2ZuX3Qgd3JpdGVfYXJjaGl2ZTsKKwlwYXJzZV9leHRyYV9hcmdzX2ZuX3QgcGFyc2VfZXh0cmE7Cit9IGFyY2hpdmVyc1tdID0geworCXsgInRhciIsIHdyaXRlX3Rhcl9hcmNoaXZlLCBOVUxMIH0sCisJeyAiemlwIiwgd3JpdGVfemlwX2FyY2hpdmUsIHBhcnNlX2V4dHJhX3ppcF9hcmdzIH0sCit9OworCitzdGF0aWMgaW50IHJ1bl9yZW1vdGVfYXJjaGl2ZXIoY29uc3QgY2hhciAqcmVtb3RlLCBpbnQgYXJnYywKKwkJCSAgICAgICBjb25zdCBjaGFyICoqYXJndikKK3sKKwljaGFyICp1cmwsIGJ1ZltMQVJHRV9QQUNLRVRfTUFYXTsKKwlpbnQgZmRbMl0sIGksIGxlbiwgcnY7CisJcGlkX3QgcGlkOworCWNvbnN0IGNoYXIgKmV4ZWMgPSAiZ2l0LXVwbG9hZC1hcmNoaXZlIjsKKwlpbnQgZXhlY19hdCA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhlYz0iKSkgeworCQkJaWYgKGV4ZWNfYXQpCisJCQkJZGllKCJtdWx0aXBsZSAtLWV4ZWMgc3BlY2lmaWVkIik7CisJCQlleGVjID0gYXJnICsgNzsKKwkJCWV4ZWNfYXQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cmwgPSB4c3RyZHVwKHJlbW90ZSk7CisJcGlkID0gZ2l0X2Nvbm5lY3QoZmQsIHVybCwgZXhlYyk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBwaWQ7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChpID09IGV4ZWNfYXQpCisJCQljb250aW51ZTsKKwkJcGFja2V0X3dyaXRlKGZkWzFdLCAiYXJndW1lbnQgJXNcbiIsIGFyZ3ZbaV0pOworCX0KKwlwYWNrZXRfZmx1c2goZmRbMV0pOworCisJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKCFsZW4pCisJCWRpZSgiZ2l0LWFyY2hpdmU6IGV4cGVjdGVkIEFDSy9OQUssIGdvdCBFT0YiKTsKKwlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQlidWZbLS1sZW5dID0gMDsKKwlpZiAoc3RyY21wKGJ1ZiwgIkFDSyIpKSB7CisJCWlmIChsZW4gPiA1ICYmICFwcmVmaXhjbXAoYnVmLCAiTkFDSyAiKSkKKwkJCWRpZSgiZ2l0LWFyY2hpdmU6IE5BQ0sgJXMiLCBidWYgKyA1KTsKKwkJZGllKCJnaXQtYXJjaGl2ZTogcHJvdG9jb2wgZXJyb3IiKTsKKwl9CisKKwlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGZkWzBdLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAobGVuKQorCQlkaWUoImdpdC1hcmNoaXZlOiBleHBlY3RlZCBhIGZsdXNoIik7CisKKwkvKiBOb3csIHN0YXJ0IHJlYWRpbmcgZnJvbSBmZFswXSBhbmQgc3BpdCBpdCBvdXQgdG8gc3Rkb3V0ICovCisJcnYgPSByZWN2X3NpZGViYW5kKCJhcmNoaXZlIiwgZmRbMF0sIDEsIDIpOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJcnYgfD0gZmluaXNoX2Nvbm5lY3QocGlkKTsKKworCXJldHVybiAhIXJ2OworfQorCitzdGF0aWMgaW50IGluaXRfYXJjaGl2ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFyY2hpdmVyICphcikKK3sKKwlpbnQgcnYgPSAtMSwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyY2hpdmVycyk7IGkrKykgeworCQlpZiAoIXN0cmNtcChuYW1lLCBhcmNoaXZlcnNbaV0ubmFtZSkpIHsKKwkJCW1lbXNldChhciwgMCwgc2l6ZW9mKCphcikpOworCQkJYXItPm5hbWUgPSBhcmNoaXZlcnNbaV0ubmFtZTsKKwkJCWFyLT53cml0ZV9hcmNoaXZlID0gYXJjaGl2ZXJzW2ldLndyaXRlX2FyY2hpdmU7CisJCQlhci0+cGFyc2VfZXh0cmEgPSBhcmNoaXZlcnNbaV0ucGFyc2VfZXh0cmE7CisJCQlydiA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgcGFyc2VfcGF0aHNwZWNfYXJnKGNvbnN0IGNoYXIgKipwYXRoc3BlYywgc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyX2FyZ3MpCit7CisJYXJfYXJncy0+cGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMoYXJfYXJncy0+YmFzZSwgcGF0aHNwZWMpOworfQorCit2b2lkIHBhcnNlX3RyZWVpc2hfYXJnKGNvbnN0IGNoYXIgKiphcmd2LCBzdHJ1Y3QgYXJjaGl2ZXJfYXJncyAqYXJfYXJncywKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjb21taXRfc2hhMTsKKwl0aW1lX3QgYXJjaGl2ZV90aW1lOworCXN0cnVjdCB0cmVlICp0cmVlOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGdldF9zaGExKG5hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lIik7CisKKwljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKGNvbW1pdCkgeworCQljb21taXRfc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisJCWFyY2hpdmVfdGltZSA9IGNvbW1pdC0+ZGF0ZTsKKwl9IGVsc2UgeworCQljb21taXRfc2hhMSA9IE5VTEw7CisJCWFyY2hpdmVfdGltZSA9IHRpbWUoTlVMTCk7CisJfQorCisJdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3Qoc2hhMSk7CisJaWYgKHRyZWUgPT0gTlVMTCkKKwkJZGllKCJub3QgYSB0cmVlIG9iamVjdCIpOworCisJaWYgKHByZWZpeCkgeworCQl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisJCXVuc2lnbmVkIGludCBtb2RlOworCQlpbnQgZXJyOworCisJCWVyciA9IGdldF90cmVlX2VudHJ5KHRyZWUtPm9iamVjdC5zaGExLCBwcmVmaXgsCisJCQkJICAgICB0cmVlX3NoYTEsICZtb2RlKTsKKwkJaWYgKGVyciB8fCAhU19JU0RJUihtb2RlKSkKKwkJCWRpZSgiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1bnRyYWNrZWQiKTsKKworCQl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdCh0cmVlX3NoYTEpOworCX0KKwlhcl9hcmdzLT50cmVlID0gdHJlZTsKKwlhcl9hcmdzLT5jb21taXRfc2hhMSA9IGNvbW1pdF9zaGExOworCWFyX2FyZ3MtPnRpbWUgPSBhcmNoaXZlX3RpbWU7Cit9CisKK2ludCBwYXJzZV9hcmNoaXZlX2FyZ3MoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBzdHJ1Y3QgYXJjaGl2ZXIgKmFyKQoreworCWNvbnN0IGNoYXIgKmV4dHJhX2FyZ3ZbTUFYX0VYVFJBX0FSR1NdOworCWludCBleHRyYV9hcmdjID0gMDsKKwljb25zdCBjaGFyICpmb3JtYXQgPSAidGFyIjsKKwljb25zdCBjaGFyICpiYXNlID0gIiI7CisJaW50IHZlcmJvc2UgPSAwOworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICghc3RyY21wKGFyZywgIi0tbGlzdCIpIHx8ICFzdHJjbXAoYXJnLCAiLWwiKSkgeworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXJjaGl2ZXJzKTsgaSsrKQorCQkJCXByaW50ZigiJXNcbiIsIGFyY2hpdmVyc1tpXS5uYW1lKTsKKwkJCWV4aXQoMCk7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikgfHwgIXN0cmNtcChhcmcsICItdiIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZm9ybWF0PSIpKSB7CisJCQlmb3JtYXQgPSBhcmcgKyA5OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wcmVmaXg9IikpIHsKKwkJCWJhc2UgPSBhcmcgKyA5OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFyZ1swXSA9PSAnLScpIHsKKwkJCWlmIChleHRyYV9hcmdjID4gTUFYX0VYVFJBX0FSR1MgLSAxKQorCQkJCWRpZSgiVG9vIG1hbnkgZXh0cmEgb3B0aW9ucyIpOworCQkJZXh0cmFfYXJndltleHRyYV9hcmdjKytdID0gYXJnOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIC0tIHRyZWUtaXNoICovCisJaWYgKGFyZ2MgLSAxIDwgaSkKKwkJdXNhZ2UoYXJjaGl2ZV91c2FnZSk7CisJaWYgKGluaXRfYXJjaGl2ZXIoZm9ybWF0LCBhcikgPCAwKQorCQlkaWUoIlVua25vd24gYXJjaGl2ZSBmb3JtYXQgJyVzJyIsIGZvcm1hdCk7CisKKwlpZiAoZXh0cmFfYXJnYykgeworCQlpZiAoIWFyLT5wYXJzZV9leHRyYSkKKwkJCWRpZSgiJyVzJyBmb3JtYXQgZG9lcyBub3QgaGFuZGxlICVzIiwKKwkJCSAgICBhci0+bmFtZSwgZXh0cmFfYXJndlswXSk7CisJCWFyLT5hcmdzLmV4dHJhID0gYXItPnBhcnNlX2V4dHJhKGV4dHJhX2FyZ2MsIGV4dHJhX2FyZ3YpOworCX0KKwlhci0+YXJncy52ZXJib3NlID0gdmVyYm9zZTsKKwlhci0+YXJncy5iYXNlID0gYmFzZTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0cmFjdF9yZW1vdGVfYXJnKGludCAqYWMsIGNvbnN0IGNoYXIgKiphdikKK3sKKwlpbnQgaXgsIGl5LCBjbnQgPSAqYWM7CisJaW50IG5vX21vcmVfb3B0aW9ucyA9IDA7CisJY29uc3QgY2hhciAqcmVtb3RlID0gTlVMTDsKKworCWZvciAoaXggPSBpeSA9IDE7IGl4IDwgY250OyBpeCsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2W2l4XTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkKKwkJCW5vX21vcmVfb3B0aW9ucyA9IDE7CisJCWlmICghbm9fbW9yZV9vcHRpb25zKSB7CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXJlbW90ZT0iKSkgeworCQkJCWlmIChyZW1vdGUpCisJCQkJCWRpZSgiTXVsdGlwbGUgLS1yZW1vdGUgc3BlY2lmaWVkIik7CisJCQkJcmVtb3RlID0gYXJnICsgOTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJCW5vX21vcmVfb3B0aW9ucyA9IDE7CisJCX0KKwkJaWYgKGl4ICE9IGl5KQorCQkJYXZbaXldID0gYXJnOworCQlpeSsrOworCX0KKwlpZiAocmVtb3RlKSB7CisJCWF2Wy0tY250XSA9IE5VTEw7CisJCSphYyA9IGNudDsKKwl9CisJcmV0dXJuIHJlbW90ZTsKK30KKworaW50IGNtZF9hcmNoaXZlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBhcmNoaXZlciBhcjsKKwlpbnQgdHJlZV9pZHg7CisJY29uc3QgY2hhciAqcmVtb3RlID0gTlVMTDsKKworCXJlbW90ZSA9IGV4dHJhY3RfcmVtb3RlX2FyZygmYXJnYywgYXJndik7CisJaWYgKHJlbW90ZSkKKwkJcmV0dXJuIHJ1bl9yZW1vdGVfYXJjaGl2ZXIocmVtb3RlLCBhcmdjLCBhcmd2KTsKKworCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9MQkYsIEJVRlNJWik7CisKKwltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKKwl0cmVlX2lkeCA9IHBhcnNlX2FyY2hpdmVfYXJncyhhcmdjLCBhcmd2LCAmYXIpOworCWlmIChwcmVmaXggPT0gTlVMTCkKKwkJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJYXJndiArPSB0cmVlX2lkeDsKKwlwYXJzZV90cmVlaXNoX2FyZyhhcmd2LCAmYXIuYXJncywgcHJlZml4KTsKKwlwYXJzZV9wYXRoc3BlY19hcmcoYXJndiArIDEsICZhci5hcmdzKTsKKworCXJldHVybiBhci53cml0ZV9hcmNoaXZlKCZhci5hcmdzKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tYmxhbWUuYyBiL2J1aWx0aW4tYmxhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ3MWZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1ibGFtZS5jCkBAIC0wLDAgKzEsMjQzOCBAQAorLyoKKyAqIFBpY2theGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEp1bmlvIEMgSGFtYW5vCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgIm1haWxtYXAuaCIKKworc3RhdGljIGNoYXIgYmxhbWVfdXNhZ2VbXSA9CisiZ2l0LWJsYW1lIFstY10gWy1iXSBbLWxdIFstLXJvb3RdIFstdF0gWy1mXSBbLW5dIFstc10gWy1wXSBbLUwgbixtXSBbLVMgPHJldnMtZmlsZT5dIFstTV0gWy1DXSBbLUNdIFstLWNvbnRlbnRzIDxmaWxlbmFtZT5dIFstLWluY3JlbWVudGFsXSBbY29tbWl0XSBbLS1dIGZpbGVcbiIKKyIgIC1jICAgICAgICAgICAgICAgICAgVXNlIHRoZSBzYW1lIG91dHB1dCBtb2RlIGFzIGdpdC1hbm5vdGF0ZSAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLWIgICAgICAgICAgICAgICAgICBTaG93IGJsYW5rIFNIQS0xIGZvciBib3VuZGFyeSBjb21taXRzIChEZWZhdWx0OiBvZmYpXG4iCisiICAtbCAgICAgICAgICAgICAgICAgIFNob3cgbG9uZyBjb21taXQgU0hBMSAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLS1yb290ICAgICAgICAgICAgICBEbyBub3QgdHJlYXQgcm9vdCBjb21taXRzIGFzIGJvdW5kYXJpZXMgKERlZmF1bHQ6IG9mZilcbiIKKyIgIC10ICAgICAgICAgICAgICAgICAgU2hvdyByYXcgdGltZXN0YW1wIChEZWZhdWx0OiBvZmYpXG4iCisiICAtZiwgLS1zaG93LW5hbWUgICAgIFNob3cgb3JpZ2luYWwgZmlsZW5hbWUgKERlZmF1bHQ6IGF1dG8pXG4iCisiICAtbiwgLS1zaG93LW51bWJlciAgIFNob3cgb3JpZ2luYWwgbGluZW51bWJlciAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLXMgICAgICAgICAgICAgICAgICBTdXBwcmVzcyBhdXRob3IgbmFtZSBhbmQgdGltZXN0YW1wIChEZWZhdWx0OiBvZmYpXG4iCisiICAtcCwgLS1wb3JjZWxhaW4gICAgIFNob3cgaW4gYSBmb3JtYXQgZGVzaWduZWQgZm9yIG1hY2hpbmUgY29uc3VtcHRpb25cbiIKKyIgIC1MIG4sbSAgICAgICAgICAgICAgUHJvY2VzcyBvbmx5IGxpbmUgcmFuZ2UgbixtLCBjb3VudGluZyBmcm9tIDFcbiIKKyIgIC1NLCAtQyAgICAgICAgICAgICAgRmluZCBsaW5lIG1vdmVtZW50cyB3aXRoaW4gYW5kIGFjcm9zcyBmaWxlc1xuIgorIiAgLS1pbmNyZW1lbnRhbCAgICAgICBTaG93IGJsYW1lIGVudHJpZXMgYXMgd2UgZmluZCB0aGVtLCBpbmNyZW1lbnRhbGx5XG4iCisiICAtLWNvbnRlbnRzIGZpbGUgICAgIFVzZSA8ZmlsZT4ncyBjb250ZW50cyBhcyB0aGUgZmluYWwgaW1hZ2VcbiIKKyIgIC1TIHJldnMtZmlsZSAgICAgICAgVXNlIHJldmlzaW9ucyBmcm9tIHJldnMtZmlsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2l0LXJldi1saXN0XG4iOworCitzdGF0aWMgaW50IGxvbmdlc3RfZmlsZTsKK3N0YXRpYyBpbnQgbG9uZ2VzdF9hdXRob3I7CitzdGF0aWMgaW50IG1heF9vcmlnX2RpZ2l0czsKK3N0YXRpYyBpbnQgbWF4X2RpZ2l0czsKK3N0YXRpYyBpbnQgbWF4X3Njb3JlX2RpZ2l0czsKK3N0YXRpYyBpbnQgc2hvd19yb290Oworc3RhdGljIGludCBibGFua19ib3VuZGFyeTsKK3N0YXRpYyBpbnQgaW5jcmVtZW50YWw7CitzdGF0aWMgaW50IGNtZF9pc19hbm5vdGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgcGF0aF9saXN0IG1haWxtYXA7CisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcgMAorI2VuZGlmCisKKy8qIHN0YXRzICovCitzdGF0aWMgaW50IG51bV9yZWFkX2Jsb2I7CitzdGF0aWMgaW50IG51bV9nZXRfcGF0Y2g7CitzdGF0aWMgaW50IG51bV9jb21taXRzOworCisjZGVmaW5lIFBJQ0tBWEVfQkxBTUVfTU9WRQkJMDEKKyNkZWZpbmUgUElDS0FYRV9CTEFNRV9DT1BZCQkwMgorI2RlZmluZSBQSUNLQVhFX0JMQU1FX0NPUFlfSEFSREVSCTA0CisjZGVmaW5lIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVNUCTAxMAorCisvKgorICogYmxhbWUgZm9yIGEgYmxhbWVfZW50cnkgd2l0aCBzY29yZSBsb3dlciB0aGFuIHRoZXNlIHRocmVzaG9sZHMKKyAqIGlzIG5vdCBwYXNzZWQgdG8gdGhlIHBhcmVudCB1c2luZyBtb3ZlL2NvcHkgbG9naWMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBibGFtZV9tb3ZlX3Njb3JlOworc3RhdGljIHVuc2lnbmVkIGJsYW1lX2NvcHlfc2NvcmU7CisjZGVmaW5lIEJMQU1FX0RFRkFVTFRfTU9WRV9TQ09SRQkyMAorI2RlZmluZSBCTEFNRV9ERUZBVUxUX0NPUFlfU0NPUkUJNDAKKworLyogYml0cyAjMC4uNyBpbiByZXZpc2lvbi5oLCAjOC4uMTEgdXNlZCBmb3IgbWVyZ2VfYmFzZXMoKSBpbiBjb21taXQuYyAqLworI2RlZmluZSBNRVRBSU5GT19TSE9XTgkJKDF1PDwxMikKKyNkZWZpbmUgTU9SRV9USEFOX09ORV9QQVRICSgxdTw8MTMpCisKKy8qCisgKiBPbmUgYmxvYiBpbiBhIGNvbW1pdCB0aGF0IGlzIGJlaW5nIHN1c3BlY3RlZAorICovCitzdHJ1Y3Qgb3JpZ2luIHsKKwlpbnQgcmVmY250OworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwltbWZpbGVfdCBmaWxlOworCXVuc2lnbmVkIGNoYXIgYmxvYl9zaGExWzIwXTsKKwljaGFyIHBhdGhbRkxFWF9BUlJBWV07Cit9OworCisvKgorICogR2l2ZW4gYW4gb3JpZ2luLCBwcmVwYXJlIG1tZmlsZV90IHN0cnVjdHVyZSB0byBiZSB1c2VkIGJ5IHRoZQorICogZGlmZiBtYWNoaW5lcnkKKyAqLworc3RhdGljIGNoYXIgKmZpbGxfb3JpZ2luX2Jsb2Ioc3RydWN0IG9yaWdpbiAqbywgbW1maWxlX3QgKmZpbGUpCit7CisJaWYgKCFvLT5maWxlLnB0cikgeworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCW51bV9yZWFkX2Jsb2IrKzsKKwkJZmlsZS0+cHRyID0gcmVhZF9zaGExX2ZpbGUoby0+YmxvYl9zaGExLCAmdHlwZSwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgKikoJihmaWxlLT5zaXplKSkpOworCQlvLT5maWxlID0gKmZpbGU7CisJfQorCWVsc2UKKwkJKmZpbGUgPSBvLT5maWxlOworCXJldHVybiBmaWxlLT5wdHI7Cit9CisKKy8qCisgKiBPcmlnaW4gaXMgcmVmY291bnRlZCBhbmQgdXN1YWxseSB3ZSBrZWVwIHRoZSBibG9iIGNvbnRlbnRzIHRvIGJlCisgKiByZXVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9yaWdpbiAqb3JpZ2luX2luY3JlZihzdHJ1Y3Qgb3JpZ2luICpvKQoreworCWlmIChvKQorCQlvLT5yZWZjbnQrKzsKKwlyZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgb3JpZ2luX2RlY3JlZihzdHJ1Y3Qgb3JpZ2luICpvKQoreworCWlmIChvICYmIC0tby0+cmVmY250IDw9IDApIHsKKwkJaWYgKG8tPmZpbGUucHRyKQorCQkJZnJlZShvLT5maWxlLnB0cik7CisJCW1lbXNldChvLCAwLCBzaXplb2YoKm8pKTsKKwkJZnJlZShvKTsKKwl9Cit9CisKKy8qCisgKiBFYWNoIGdyb3VwIG9mIGxpbmVzIGlzIGRlc2NyaWJlZCBieSBhIGJsYW1lX2VudHJ5OyBpdCBjYW4gYmUgc3BsaXQKKyAqIGFzIHdlIHBhc3MgYmxhbWUgdG8gdGhlIHBhcmVudHMuICBUaGV5IGZvcm0gYSBsaW5rZWQgbGlzdCBpbiB0aGUKKyAqIHNjb3JlYm9hcmQgc3RydWN0dXJlLCBzb3J0ZWQgYnkgdGhlIHRhcmdldCBsaW5lIG51bWJlci4KKyAqLworc3RydWN0IGJsYW1lX2VudHJ5IHsKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKnByZXY7CisJc3RydWN0IGJsYW1lX2VudHJ5ICpuZXh0OworCisJLyogdGhlIGZpcnN0IGxpbmUgb2YgdGhpcyBncm91cCBpbiB0aGUgZmluYWwgaW1hZ2U7CisJICogaW50ZXJuYWxseSBhbGwgbGluZSBudW1iZXJzIGFyZSAwIGJhc2VkLgorCSAqLworCWludCBsbm87CisKKwkvKiBob3cgbWFueSBsaW5lcyB0aGlzIGdyb3VwIGhhcyAqLworCWludCBudW1fbGluZXM7CisKKwkvKiB0aGUgY29tbWl0IHRoYXQgaW50cm9kdWNlZCB0aGlzIGdyb3VwIGludG8gdGhlIGZpbmFsIGltYWdlICovCisJc3RydWN0IG9yaWdpbiAqc3VzcGVjdDsKKworCS8qIHRydWUgaWYgdGhlIHN1c3BlY3QgaXMgdHJ1bHkgZ3VpbHR5OyBmYWxzZSB3aGlsZSB3ZSBoYXZlIG5vdAorCSAqIGNoZWNrZWQgaWYgdGhlIGdyb3VwIGNhbWUgZnJvbSBvbmUgb2YgaXRzIHBhcmVudHMuCisJICovCisJY2hhciBndWlsdHk7CisKKwkvKiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGZpcnN0IGxpbmUgb2YgdGhpcyBncm91cCBpbiB0aGUKKwkgKiBzdXNwZWN0J3MgZmlsZTsgaW50ZXJuYWxseSBhbGwgbGluZSBudW1iZXJzIGFyZSAwIGJhc2VkLgorCSAqLworCWludCBzX2xubzsKKworCS8qIGhvdyBzaWduaWZpY2FudCB0aGlzIGVudHJ5IGlzIC0tIGNhY2hlZCB0byBhdm9pZAorCSAqIHNjYW5uaW5nIHRoZSBsaW5lcyBvdmVyIGFuZCBvdmVyLgorCSAqLworCXVuc2lnbmVkIHNjb3JlOworfTsKKworLyoKKyAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBibGFtZSBhc3NpZ25tZW50LgorICovCitzdHJ1Y3Qgc2NvcmVib2FyZCB7CisJLyogdGhlIGZpbmFsIGNvbW1pdCAoaS5lLiB3aGVyZSB3ZSBzdGFydGVkIGRpZ2dpbmcgZnJvbSkgKi8KKwlzdHJ1Y3QgY29tbWl0ICpmaW5hbDsKKworCWNvbnN0IGNoYXIgKnBhdGg7CisKKwkvKgorCSAqIFRoZSBjb250ZW50cyBpbiB0aGUgZmluYWwgaW1hZ2UuCisJICogVXNlZCBieSBtYW55IGZ1bmN0aW9ucyB0byBvYnRhaW4gY29udGVudHMgb2YgdGhlIG50aCBsaW5lLAorCSAqIGluZGV4ZWQgd2l0aCBzY29yZWJvYXJkLmxpbmVub1tibGFtZV9lbnRyeS5sbm9dLgorCSAqLworCWNvbnN0IGNoYXIgKmZpbmFsX2J1ZjsKKwl1bnNpZ25lZCBsb25nIGZpbmFsX2J1Zl9zaXplOworCisJLyogbGlua2VkIGxpc3Qgb2YgYmxhbWVzICovCisJc3RydWN0IGJsYW1lX2VudHJ5ICplbnQ7CisKKwkvKiBsb29rLXVwIGEgbGluZSBpbiB0aGUgZmluYWwgYnVmZmVyICovCisJaW50IG51bV9saW5lczsKKwlpbnQgKmxpbmVubzsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHNhbWVfc3VzcGVjdChzdHJ1Y3Qgb3JpZ2luICphLCBzdHJ1Y3Qgb3JpZ2luICpiKQoreworCWlmIChhID09IGIpCisJCXJldHVybiAxOworCWlmIChhLT5jb21taXQgIT0gYi0+Y29tbWl0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIXN0cmNtcChhLT5wYXRoLCBiLT5wYXRoKTsKK30KKworc3RhdGljIHZvaWQgc2FuaXR5X2NoZWNrX3JlZmNudChzdHJ1Y3Qgc2NvcmVib2FyZCAqKTsKKworLyoKKyAqIElmIHR3byBibGFtZSBlbnRyaWVzIHRoYXQgYXJlIG5leHQgdG8gZWFjaCBvdGhlciBjYW1lIGZyb20KKyAqIGNvbnRpZ3VvdXMgbGluZXMgaW4gdGhlIHNhbWUgb3JpZ2luIChpLmUuIDxjb21taXQsIHBhdGg+IHBhaXIpLAorICogbWVyZ2UgdGhlbSB0b2dldGhlci4KKyAqLworc3RhdGljIHZvaWQgY29hbGVzY2Uoc3RydWN0IHNjb3JlYm9hcmQgKnNiKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50LCAqbmV4dDsKKworCWZvciAoZW50ID0gc2ItPmVudDsgZW50ICYmIChuZXh0ID0gZW50LT5uZXh0KTsgZW50ID0gbmV4dCkgeworCQlpZiAoc2FtZV9zdXNwZWN0KGVudC0+c3VzcGVjdCwgbmV4dC0+c3VzcGVjdCkgJiYKKwkJICAgIGVudC0+Z3VpbHR5ID09IG5leHQtPmd1aWx0eSAmJgorCQkgICAgZW50LT5zX2xubyArIGVudC0+bnVtX2xpbmVzID09IG5leHQtPnNfbG5vKSB7CisJCQllbnQtPm51bV9saW5lcyArPSBuZXh0LT5udW1fbGluZXM7CisJCQllbnQtPm5leHQgPSBuZXh0LT5uZXh0OworCQkJaWYgKGVudC0+bmV4dCkKKwkJCQllbnQtPm5leHQtPnByZXYgPSBlbnQ7CisJCQlvcmlnaW5fZGVjcmVmKG5leHQtPnN1c3BlY3QpOworCQkJZnJlZShuZXh0KTsKKwkJCWVudC0+c2NvcmUgPSAwOworCQkJbmV4dCA9IGVudDsgLyogYWdhaW4gKi8KKwkJfQorCX0KKworCWlmIChERUJVRykgLyogc2FuaXR5ICovCisJCXNhbml0eV9jaGVja19yZWZjbnQoc2IpOworfQorCisvKgorICogR2l2ZW4gYSBjb21taXQgYW5kIGEgcGF0aCBpbiBpdCwgY3JlYXRlIGEgbmV3IG9yaWdpbiBzdHJ1Y3R1cmUuCisgKiBUaGUgY2FsbGVycyB0aGF0IGFkZCBibGFtZSB0byB0aGUgc2NvcmVib2FyZCBzaG91bGQgdXNlCisgKiBnZXRfb3JpZ2luKCkgdG8gb2J0YWluIHNoYXJlZCwgcmVmY291bnRlZCBjb3B5IGluc3RlYWQgb2YgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAqLworc3RhdGljIHN0cnVjdCBvcmlnaW4gKm1ha2Vfb3JpZ2luKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgb3JpZ2luICpvOworCW8gPSB4Y2FsbG9jKDEsIHNpemVvZigqbykgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlvLT5jb21taXQgPSBjb21taXQ7CisJby0+cmVmY250ID0gMTsKKwlzdHJjcHkoby0+cGF0aCwgcGF0aCk7CisJcmV0dXJuIG87Cit9CisKKy8qCisgKiBMb2NhdGUgYW4gZXhpc3Rpbmcgb3JpZ2luIG9yIGNyZWF0ZSBhIG5ldyBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ2luICpnZXRfb3JpZ2luKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCQkgc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJCSBjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKworCWZvciAoZSA9IHNiLT5lbnQ7IGU7IGUgPSBlLT5uZXh0KSB7CisJCWlmIChlLT5zdXNwZWN0LT5jb21taXQgPT0gY29tbWl0ICYmCisJCSAgICAhc3RyY21wKGUtPnN1c3BlY3QtPnBhdGgsIHBhdGgpKQorCQkJcmV0dXJuIG9yaWdpbl9pbmNyZWYoZS0+c3VzcGVjdCk7CisJfQorCXJldHVybiBtYWtlX29yaWdpbihjb21taXQsIHBhdGgpOworfQorCisvKgorICogRmlsbCB0aGUgYmxvYl9zaGExIGZpZWxkIG9mIGFuIG9yaWdpbiBpZiBpdCBoYXNuJ3QsIHNvIHRoYXQgbGF0ZXIKKyAqIGNhbGwgdG8gZmlsbF9vcmlnaW5fYmxvYigpIGNhbiB1c2UgaXQgdG8gbG9jYXRlIHRoZSBkYXRhLiAgYmxvYl9zaGExCisgKiBmb3IgYW4gb3JpZ2luIGlzIGFsc28gdXNlZCB0byBwYXNzIHRoZSBibGFtZSBmb3IgdGhlIGVudGlyZSBmaWxlIHRvCisgKiB0aGUgcGFyZW50IHRvIGRldGVjdCB0aGUgY2FzZSB3aGVyZSBhIGNoaWxkJ3MgYmxvYiBpcyBpZGVudGljYWwgdG8KKyAqIHRoYXQgb2YgaXRzIHBhcmVudCdzLgorICovCitzdGF0aWMgaW50IGZpbGxfYmxvYl9zaGExKHN0cnVjdCBvcmlnaW4gKm9yaWdpbikKK3sKKwl1bnNpZ25lZCBtb2RlOworCisJaWYgKCFpc19udWxsX3NoYTEob3JpZ2luLT5ibG9iX3NoYTEpKQorCQlyZXR1cm4gMDsKKwlpZiAoZ2V0X3RyZWVfZW50cnkob3JpZ2luLT5jb21taXQtPm9iamVjdC5zaGExLAorCQkJICAgb3JpZ2luLT5wYXRoLAorCQkJICAgb3JpZ2luLT5ibG9iX3NoYTEsICZtb2RlKSkKKwkJZ290byBlcnJvcl9vdXQ7CisJaWYgKHNoYTFfb2JqZWN0X2luZm8ob3JpZ2luLT5ibG9iX3NoYTEsIE5VTEwpICE9IE9CSl9CTE9CKQorCQlnb3RvIGVycm9yX291dDsKKwlyZXR1cm4gMDsKKyBlcnJvcl9vdXQ6CisJaGFzaGNscihvcmlnaW4tPmJsb2Jfc2hhMSk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogV2UgaGF2ZSBhbiBvcmlnaW4gLS0gY2hlY2sgaWYgdGhlIHNhbWUgcGF0aCBleGlzdHMgaW4gdGhlCisgKiBwYXJlbnQgYW5kIHJldHVybiBhbiBvcmlnaW4gc3RydWN0dXJlIHRvIHJlcHJlc2VudCBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBvcmlnaW4gKmZpbmRfb3JpZ2luKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCQkgIHN0cnVjdCBjb21taXQgKnBhcmVudCwKKwkJCQkgIHN0cnVjdCBvcmlnaW4gKm9yaWdpbikKK3sKKwlzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luID0gTlVMTDsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZfb3B0czsKKwljb25zdCBjaGFyICpwYXRoc1syXTsKKworCWlmIChwYXJlbnQtPnV0aWwpIHsKKwkJLyoKKwkJICogRWFjaCBjb21taXQgb2JqZWN0IGNhbiBjYWNoZSBvbmUgb3JpZ2luIGluIHRoYXQKKwkJICogY29tbWl0LiAgVGhpcyBpcyBhIGZyZWVzdGFuZGluZyBjb3B5IG9mIG9yaWdpbiBhbmQKKwkJICogbm90IHJlZmNvdW50ZWQuCisJCSAqLworCQlzdHJ1Y3Qgb3JpZ2luICpjYWNoZWQgPSBwYXJlbnQtPnV0aWw7CisJCWlmICghc3RyY21wKGNhY2hlZC0+cGF0aCwgb3JpZ2luLT5wYXRoKSkgeworCQkJLyoKKwkJCSAqIFRoZSBzYW1lIHBhdGggYmV0d2VlbiBvcmlnaW4gYW5kIGl0cyBwYXJlbnQKKwkJCSAqIHdpdGhvdXQgcmVuYW1pbmcgLS0gdGhlIG1vc3QgY29tbW9uIGNhc2UuCisJCQkgKi8KKwkJCXBvcmlnaW4gPSBnZXRfb3JpZ2luKHNiLCBwYXJlbnQsIGNhY2hlZC0+cGF0aCk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgb3JpZ2luIHdhcyBuZXdseSBjcmVhdGVkIChpLmUuIGdldF9vcmlnaW4KKwkJCSAqIHdvdWxkIGNhbGwgbWFrZV9vcmlnaW4gaWYgbm9uZSBpcyBmb3VuZCBpbiB0aGUKKwkJCSAqIHNjb3JlYm9hcmQpLCBpdCBkb2VzIG5vdCBrbm93IHRoZSBibG9iX3NoYTEsCisJCQkgKiBzbyBjb3B5IGl0LiAgT3RoZXJ3aXNlIHBvcmlnaW4gd2FzIGluIHRoZQorCQkJICogc2NvcmVib2FyZCBhbmQgYWxyZWFkeSBrbm93cyBibG9iX3NoYTEuCisJCQkgKi8KKwkJCWlmIChwb3JpZ2luLT5yZWZjbnQgPT0gMSkKKwkJCQloYXNoY3B5KHBvcmlnaW4tPmJsb2Jfc2hhMSwgY2FjaGVkLT5ibG9iX3NoYTEpOworCQkJcmV0dXJuIHBvcmlnaW47CisJCX0KKwkJLyogb3RoZXJ3aXNlIGl0IHdhcyBub3QgdmVyeSB1c2VmdWw7IGZyZWUgaXQgKi8KKwkJZnJlZShwYXJlbnQtPnV0aWwpOworCQlwYXJlbnQtPnV0aWwgPSBOVUxMOworCX0KKworCS8qIFNlZSBpZiB0aGUgb3JpZ2luLT5wYXRoIGlzIGRpZmZlcmVudCBiZXR3ZWVuIHBhcmVudAorCSAqIGFuZCBvcmlnaW4gZmlyc3QuICBNb3N0IG9mIHRoZSB0aW1lIHRoZXkgYXJlIHRoZQorCSAqIHNhbWUgYW5kIGRpZmYtdHJlZSBpcyBmYWlybHkgZWZmaWNpZW50IGFib3V0IHRoaXMuCisJICovCisJZGlmZl9zZXR1cCgmZGlmZl9vcHRzKTsKKwlkaWZmX29wdHMucmVjdXJzaXZlID0gMTsKKwlkaWZmX29wdHMuZGV0ZWN0X3JlbmFtZSA9IDA7CisJZGlmZl9vcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJcGF0aHNbMF0gPSBvcmlnaW4tPnBhdGg7CisJcGF0aHNbMV0gPSBOVUxMOworCisJZGlmZl90cmVlX3NldHVwX3BhdGhzKHBhdGhzLCAmZGlmZl9vcHRzKTsKKwlpZiAoZGlmZl9zZXR1cF9kb25lKCZkaWZmX29wdHMpIDwgMCkKKwkJZGllKCJkaWZmLXNldHVwIik7CisKKwlpZiAoaXNfbnVsbF9zaGExKG9yaWdpbi0+Y29tbWl0LT5vYmplY3Quc2hhMSkpCisJCWRvX2RpZmZfY2FjaGUocGFyZW50LT50cmVlLT5vYmplY3Quc2hhMSwgJmRpZmZfb3B0cyk7CisJZWxzZQorCQlkaWZmX3RyZWVfc2hhMShwYXJlbnQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkJICAgICAgIG9yaWdpbi0+Y29tbWl0LT50cmVlLT5vYmplY3Quc2hhMSwKKwkJCSAgICAgICAiIiwgJmRpZmZfb3B0cyk7CisJZGlmZmNvcmVfc3RkKCZkaWZmX29wdHMpOworCisJLyogSXQgaXMgZWl0aGVyIG9uZSBlbnRyeSB0aGF0IHNheXMgIm1vZGlmaWVkIiwgb3IgImNyZWF0ZWQiLAorCSAqIG9yIG5vdGhpbmcuCisJICovCisJaWYgKCFkaWZmX3F1ZXVlZF9kaWZmLm5yKSB7CisJCS8qIFRoZSBwYXRoIGlzIHRoZSBzYW1lIGFzIHBhcmVudCAqLworCQlwb3JpZ2luID0gZ2V0X29yaWdpbihzYiwgcGFyZW50LCBvcmlnaW4tPnBhdGgpOworCQloYXNoY3B5KHBvcmlnaW4tPmJsb2Jfc2hhMSwgb3JpZ2luLT5ibG9iX3NoYTEpOworCX0KKwllbHNlIGlmIChkaWZmX3F1ZXVlZF9kaWZmLm5yICE9IDEpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gYmxhbWU6OmZpbmRfb3JpZ2luIik7CisJZWxzZSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gZGlmZl9xdWV1ZWRfZGlmZi5xdWV1ZVswXTsKKwkJc3dpdGNoIChwLT5zdGF0dXMpIHsKKwkJZGVmYXVsdDoKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gYmxhbWU6OmZpbmRfb3JpZ2luICglYykiLAorCQkJICAgIHAtPnN0YXR1cyk7CisJCWNhc2UgJ00nOgorCQkJcG9yaWdpbiA9IGdldF9vcmlnaW4oc2IsIHBhcmVudCwgb3JpZ2luLT5wYXRoKTsKKwkJCWhhc2hjcHkocG9yaWdpbi0+YmxvYl9zaGExLCBwLT5vbmUtPnNoYTEpOworCQkJYnJlYWs7CisJCWNhc2UgJ0EnOgorCQljYXNlICdUJzoKKwkJCS8qIERpZCBub3QgZXhpc3QgaW4gcGFyZW50LCBvciB0eXBlIGNoYW5nZWQgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCWRpZmZfZmx1c2goJmRpZmZfb3B0cyk7CisJaWYgKHBvcmlnaW4pIHsKKwkJLyoKKwkJICogQ3JlYXRlIGEgZnJlZXN0YW5kaW5nIGNvcHkgdGhhdCBpcyBub3QgcGFydCBvZgorCQkgKiB0aGUgcmVmY291bnRlZCBvcmlnaW4gZm91bmQgaW4gdGhlIHNjb3JlYm9hcmQsIGFuZAorCQkgKiBjYWNoZSBpdCBpbiB0aGUgY29tbWl0LgorCQkgKi8KKwkJc3RydWN0IG9yaWdpbiAqY2FjaGVkOworCisJCWNhY2hlZCA9IG1ha2Vfb3JpZ2luKHBvcmlnaW4tPmNvbW1pdCwgcG9yaWdpbi0+cGF0aCk7CisJCWhhc2hjcHkoY2FjaGVkLT5ibG9iX3NoYTEsIHBvcmlnaW4tPmJsb2Jfc2hhMSk7CisJCXBhcmVudC0+dXRpbCA9IGNhY2hlZDsKKwl9CisJcmV0dXJuIHBvcmlnaW47Cit9CisKKy8qCisgKiBXZSBoYXZlIGFuIG9yaWdpbiAtLSBmaW5kIHRoZSBwYXRoIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQgaW4gaXRzCisgKiBwYXJlbnQgYW5kIHJldHVybiBhbiBvcmlnaW4gc3RydWN0dXJlIHRvIHJlcHJlc2VudCBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBvcmlnaW4gKmZpbmRfcmVuYW1lKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCQkgIHN0cnVjdCBjb21taXQgKnBhcmVudCwKKwkJCQkgIHN0cnVjdCBvcmlnaW4gKm9yaWdpbikKK3sKKwlzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luID0gTlVMTDsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZfb3B0czsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpwYXRoc1syXTsKKworCWRpZmZfc2V0dXAoJmRpZmZfb3B0cyk7CisJZGlmZl9vcHRzLnJlY3Vyc2l2ZSA9IDE7CisJZGlmZl9vcHRzLmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJZGlmZl9vcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJZGlmZl9vcHRzLnNpbmdsZV9mb2xsb3cgPSBvcmlnaW4tPnBhdGg7CisJcGF0aHNbMF0gPSBOVUxMOworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhwYXRocywgJmRpZmZfb3B0cyk7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRzKSA8IDApCisJCWRpZSgiZGlmZi1zZXR1cCIpOworCisJaWYgKGlzX251bGxfc2hhMShvcmlnaW4tPmNvbW1pdC0+b2JqZWN0LnNoYTEpKQorCQlkb19kaWZmX2NhY2hlKHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsICZkaWZmX29wdHMpOworCWVsc2UKKwkJZGlmZl90cmVlX3NoYTEocGFyZW50LT50cmVlLT5vYmplY3Quc2hhMSwKKwkJCSAgICAgICBvcmlnaW4tPmNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkgICAgICAgIiIsICZkaWZmX29wdHMpOworCWRpZmZjb3JlX3N0ZCgmZGlmZl9vcHRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBkaWZmX3F1ZXVlZF9kaWZmLm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBkaWZmX3F1ZXVlZF9kaWZmLnF1ZXVlW2ldOworCQlpZiAoKHAtPnN0YXR1cyA9PSAnUicgfHwgcC0+c3RhdHVzID09ICdDJykgJiYKKwkJICAgICFzdHJjbXAocC0+dHdvLT5wYXRoLCBvcmlnaW4tPnBhdGgpKSB7CisJCQlwb3JpZ2luID0gZ2V0X29yaWdpbihzYiwgcGFyZW50LCBwLT5vbmUtPnBhdGgpOworCQkJaGFzaGNweShwb3JpZ2luLT5ibG9iX3NoYTEsIHAtPm9uZS0+c2hhMSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlkaWZmX2ZsdXNoKCZkaWZmX29wdHMpOworCXJldHVybiBwb3JpZ2luOworfQorCisvKgorICogUGFyc2luZyBvZiBwYXRjaCBjaHVua3MuLi4KKyAqLworc3RydWN0IGNodW5rIHsKKwkvKiBsaW5lIG51bWJlciBpbiBwb3N0aW1hZ2U7IHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoaXMKKwkgKiBsaW5lIGlzIHRoZSBzYW1lIGFzIHByZWltYWdlCisJICovCisJaW50IHNhbWU7CisKKwkvKiBwcmVpbWFnZSBsaW5lIG51bWJlciBhZnRlciB0aGlzIGNodW5rICovCisJaW50IHBfbmV4dDsKKworCS8qIHBvc3RpbWFnZSBsaW5lIG51bWJlciBhZnRlciB0aGlzIGNodW5rICovCisJaW50IHRfbmV4dDsKK307CisKK3N0cnVjdCBwYXRjaCB7CisJc3RydWN0IGNodW5rICpjaHVua3M7CisJaW50IG51bTsKK307CisKK3N0cnVjdCBibGFtZV9kaWZmX3N0YXRlIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKwlzdHJ1Y3QgcGF0Y2ggKnJldDsKKwl1bnNpZ25lZCBodW5rX3Bvc3RfY29udGV4dDsKKwl1bnNpZ25lZCBodW5rX2luX3ByZV9jb250ZXh0IDogMTsKK307CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdV9kaWZmKHZvaWQgKnN0YXRlXywgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGJsYW1lX2RpZmZfc3RhdGUgKnN0YXRlID0gc3RhdGVfOworCXN0cnVjdCBjaHVuayAqY2h1bms7CisJaW50IG9mZjEsIG9mZjIsIGxlbjEsIGxlbjIsIG51bTsKKworCW51bSA9IHN0YXRlLT5yZXQtPm51bTsKKwlpZiAobGVuIDwgNCB8fCBsaW5lWzBdICE9ICdAJyB8fCBsaW5lWzFdICE9ICdAJykgeworCQlpZiAoc3RhdGUtPmh1bmtfaW5fcHJlX2NvbnRleHQgJiYgbGluZVswXSA9PSAnICcpCisJCQlzdGF0ZS0+cmV0LT5jaHVua3NbbnVtIC0gMV0uc2FtZSsrOworCQllbHNlIHsKKwkJCXN0YXRlLT5odW5rX2luX3ByZV9jb250ZXh0ID0gMDsKKwkJCWlmIChsaW5lWzBdID09ICcgJykKKwkJCQlzdGF0ZS0+aHVua19wb3N0X2NvbnRleHQrKzsKKwkJCWVsc2UKKwkJCQlzdGF0ZS0+aHVua19wb3N0X2NvbnRleHQgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtICYmIHN0YXRlLT5odW5rX3Bvc3RfY29udGV4dCkgeworCQljaHVuayA9ICZzdGF0ZS0+cmV0LT5jaHVua3NbbnVtIC0gMV07CisJCWNodW5rLT5wX25leHQgLT0gc3RhdGUtPmh1bmtfcG9zdF9jb250ZXh0OworCQljaHVuay0+dF9uZXh0IC09IHN0YXRlLT5odW5rX3Bvc3RfY29udGV4dDsKKwl9CisJc3RhdGUtPnJldC0+bnVtID0gKytudW07CisJc3RhdGUtPnJldC0+Y2h1bmtzID0geHJlYWxsb2Moc3RhdGUtPnJldC0+Y2h1bmtzLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY2h1bmspICogbnVtKTsKKwljaHVuayA9ICZzdGF0ZS0+cmV0LT5jaHVua3NbbnVtIC0gMV07CisJaWYgKHBhcnNlX2h1bmtfaGVhZGVyKGxpbmUsIGxlbiwgJm9mZjEsICZsZW4xLCAmb2ZmMiwgJmxlbjIpKSB7CisJCXN0YXRlLT5yZXQtPm51bS0tOworCQlyZXR1cm47CisJfQorCisJLyogTGluZSBudW1iZXJzIGluIHBhdGNoIG91dHB1dCBhcmUgb25lIGJhc2VkLiAqLworCW9mZjEtLTsKKwlvZmYyLS07CisKKwljaHVuay0+c2FtZSA9IGxlbjIgPyBvZmYyIDogKG9mZjIgKyAxKTsKKworCWNodW5rLT5wX25leHQgPSBvZmYxICsgKGxlbjEgPyBsZW4xIDogMSk7CisJY2h1bmstPnRfbmV4dCA9IGNodW5rLT5zYW1lICsgbGVuMjsKKwlzdGF0ZS0+aHVua19pbl9wcmVfY29udGV4dCA9IDE7CisJc3RhdGUtPmh1bmtfcG9zdF9jb250ZXh0ID0gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYXRjaCAqY29tcGFyZV9idWZmZXIobW1maWxlX3QgKmZpbGVfcCwgbW1maWxlX3QgKmZpbGVfbywKKwkJCQkgICAgaW50IGNvbnRleHQpCit7CisJc3RydWN0IGJsYW1lX2RpZmZfc3RhdGUgc3RhdGU7CisJeHBwYXJhbV90IHhwcDsKKwl4ZGVtaXRjb25mX3QgeGVjZmc7CisJeGRlbWl0Y2JfdCBlY2I7CisKKwl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCXhlY2ZnLmN0eGxlbiA9IGNvbnRleHQ7CisJeGVjZmcuZmxhZ3MgPSAwOworCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwllY2IucHJpdiA9ICZzdGF0ZTsKKwltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZS54bS5jb25zdW1lID0gcHJvY2Vzc191X2RpZmY7CisJc3RhdGUucmV0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhdGNoKSk7CisJc3RhdGUucmV0LT5jaHVua3MgPSBOVUxMOworCXN0YXRlLnJldC0+bnVtID0gMDsKKworCXhkbF9kaWZmKGZpbGVfcCwgZmlsZV9vLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCisJaWYgKHN0YXRlLnJldC0+bnVtKSB7CisJCXN0cnVjdCBjaHVuayAqY2h1bms7CisJCWNodW5rID0gJnN0YXRlLnJldC0+Y2h1bmtzW3N0YXRlLnJldC0+bnVtIC0gMV07CisJCWNodW5rLT5wX25leHQgLT0gc3RhdGUuaHVua19wb3N0X2NvbnRleHQ7CisJCWNodW5rLT50X25leHQgLT0gc3RhdGUuaHVua19wb3N0X2NvbnRleHQ7CisJfQorCXJldHVybiBzdGF0ZS5yZXQ7Cit9CisKKy8qCisgKiBSdW4gZGlmZiBiZXR3ZWVuIHR3byBvcmlnaW5zIGFuZCBncmFiIHRoZSBwYXRjaCBvdXRwdXQsIHNvIHRoYXQKKyAqIHdlIGNhbiBwYXNzIGJsYW1lIGZvciBsaW5lcyBvcmlnaW4gaXMgY3VycmVudGx5IHN1c3BlY3RlZCBmb3IKKyAqIHRvIGl0cyBwYXJlbnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGF0Y2ggKmdldF9wYXRjaChzdHJ1Y3Qgb3JpZ2luICpwYXJlbnQsIHN0cnVjdCBvcmlnaW4gKm9yaWdpbikKK3sKKwltbWZpbGVfdCBmaWxlX3AsIGZpbGVfbzsKKwlzdHJ1Y3QgcGF0Y2ggKnBhdGNoOworCisJZmlsbF9vcmlnaW5fYmxvYihwYXJlbnQsICZmaWxlX3ApOworCWZpbGxfb3JpZ2luX2Jsb2Iob3JpZ2luLCAmZmlsZV9vKTsKKwlpZiAoIWZpbGVfcC5wdHIgfHwgIWZpbGVfby5wdHIpCisJCXJldHVybiBOVUxMOworCXBhdGNoID0gY29tcGFyZV9idWZmZXIoJmZpbGVfcCwgJmZpbGVfbywgMCk7CisJbnVtX2dldF9wYXRjaCsrOworCXJldHVybiBwYXRjaDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJZnJlZShwLT5jaHVua3MpOworCWZyZWUocCk7Cit9CisKKy8qCisgKiBMaW5rIGluIGEgbmV3IGJsYW1lIGVudHJ5IHRvIHRoZSBzY29yZWJvYXJkLiAgRW50cmllcyB0aGF0IGNvdmVyIHRoZQorICogc2FtZSBsaW5lIHJhbmdlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNjb3JlYm9hcmQgcHJldmlvdXNseS4KKyAqLworc3RhdGljIHZvaWQgYWRkX2JsYW1lX2VudHJ5KHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IGJsYW1lX2VudHJ5ICplKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50LCAqcHJldiA9IE5VTEw7CisKKwlvcmlnaW5faW5jcmVmKGUtPnN1c3BlY3QpOworCisJZm9yIChlbnQgPSBzYi0+ZW50OyBlbnQgJiYgZW50LT5sbm8gPCBlLT5sbm87IGVudCA9IGVudC0+bmV4dCkKKwkJcHJldiA9IGVudDsKKworCS8qIHByZXYsIGlmIG5vdCBOVUxMLCBpcyB0aGUgbGFzdCBvbmUgdGhhdCBpcyBiZWxvdyBlICovCisJZS0+cHJldiA9IHByZXY7CisJaWYgKHByZXYpIHsKKwkJZS0+bmV4dCA9IHByZXYtPm5leHQ7CisJCXByZXYtPm5leHQgPSBlOworCX0KKwllbHNlIHsKKwkJZS0+bmV4dCA9IHNiLT5lbnQ7CisJCXNiLT5lbnQgPSBlOworCX0KKwlpZiAoZS0+bmV4dCkKKwkJZS0+bmV4dC0+cHJldiA9IGU7Cit9CisKKy8qCisgKiBzcmMgdHlwaWNhbGx5IGlzIG9uLXN0YWNrOyB3ZSB3YW50IHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIGluIGl0IHRvCisgKiBhbiBtYWxsb2NlZCBibGFtZV9lbnRyeSB0aGF0IGlzIGFscmVhZHkgb24gdGhlIGxpbmtlZCBsaXN0IG9mIHRoZQorICogc2NvcmVib2FyZC4gIFRoZSBvcmlnaW4gb2YgZHN0IGxvc2VzIGEgcmVmY250IHdoaWxlIHRoZSBvcmlnaW4gb2Ygc3JjCisgKiBnYWlucyBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIGR1cF9lbnRyeShzdHJ1Y3QgYmxhbWVfZW50cnkgKmRzdCwgc3RydWN0IGJsYW1lX2VudHJ5ICpzcmMpCit7CisJc3RydWN0IGJsYW1lX2VudHJ5ICpwLCAqbjsKKworCXAgPSBkc3QtPnByZXY7CisJbiA9IGRzdC0+bmV4dDsKKwlvcmlnaW5faW5jcmVmKHNyYy0+c3VzcGVjdCk7CisJb3JpZ2luX2RlY3JlZihkc3QtPnN1c3BlY3QpOworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKCpzcmMpKTsKKwlkc3QtPnByZXYgPSBwOworCWRzdC0+bmV4dCA9IG47CisJZHN0LT5zY29yZSA9IDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpudGhfbGluZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIGludCBsbm8pCit7CisJcmV0dXJuIHNiLT5maW5hbF9idWYgKyBzYi0+bGluZW5vW2xub107Cit9CisKKy8qCisgKiBJdCBpcyBrbm93biB0aGF0IGxpbmVzIGJldHdlZW4gdGxubyB0byBzYW1lIGNhbWUgZnJvbSBwYXJlbnQsIGFuZCBlCisgKiBoYXMgYW4gb3ZlcmxhcCB3aXRoIHRoYXQgcmFuZ2UuICBpdCBhbHNvIGlzIGtub3duIHRoYXQgcGFyZW50J3MKKyAqIGxpbmUgcGxubyBjb3JyZXNwb25kcyB0byBlJ3MgbGluZSB0bG5vLgorICoKKyAqICAgICAgICAgICAgICAgIDwtLS0tIGUgLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICA8LS0tLS0tPgorICogICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLT4KKyAqICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICA8LS0tLS0tLS0tLS0tLS0tLS0tPgorICoKKyAqIFNwbGl0IGUgaW50byBwb3RlbnRpYWxseSB0aHJlZSBwYXJ0czsgYmVmb3JlIHRoaXMgY2h1bmssIHRoZSBjaHVuaworICogdG8gYmUgYmxhbWVkIGZvciB0aGUgcGFyZW50LCBhbmQgYWZ0ZXIgdGhhdCBwb3J0aW9uLgorICovCitzdGF0aWMgdm9pZCBzcGxpdF9vdmVybGFwKHN0cnVjdCBibGFtZV9lbnRyeSAqc3BsaXQsCisJCQkgIHN0cnVjdCBibGFtZV9lbnRyeSAqZSwKKwkJCSAgaW50IHRsbm8sIGludCBwbG5vLCBpbnQgc2FtZSwKKwkJCSAgc3RydWN0IG9yaWdpbiAqcGFyZW50KQoreworCWludCBjaHVua19lbmRfbG5vOworCW1lbXNldChzcGxpdCwgMCwgc2l6ZW9mKHN0cnVjdCBibGFtZV9lbnRyeSBbM10pKTsKKworCWlmIChlLT5zX2xubyA8IHRsbm8pIHsKKwkJLyogdGhlcmUgaXMgYSBwcmUtY2h1bmsgcGFydCBub3QgYmxhbWVkIG9uIHBhcmVudCAqLworCQlzcGxpdFswXS5zdXNwZWN0ID0gb3JpZ2luX2luY3JlZihlLT5zdXNwZWN0KTsKKwkJc3BsaXRbMF0ubG5vID0gZS0+bG5vOworCQlzcGxpdFswXS5zX2xubyA9IGUtPnNfbG5vOworCQlzcGxpdFswXS5udW1fbGluZXMgPSB0bG5vIC0gZS0+c19sbm87CisJCXNwbGl0WzFdLmxubyA9IGUtPmxubyArIHRsbm8gLSBlLT5zX2xubzsKKwkJc3BsaXRbMV0uc19sbm8gPSBwbG5vOworCX0KKwllbHNlIHsKKwkJc3BsaXRbMV0ubG5vID0gZS0+bG5vOworCQlzcGxpdFsxXS5zX2xubyA9IHBsbm8gKyAoZS0+c19sbm8gLSB0bG5vKTsKKwl9CisKKwlpZiAoc2FtZSA8IGUtPnNfbG5vICsgZS0+bnVtX2xpbmVzKSB7CisJCS8qIHRoZXJlIGlzIGEgcG9zdC1jaHVuayBwYXJ0IG5vdCBibGFtZWQgb24gcGFyZW50ICovCisJCXNwbGl0WzJdLnN1c3BlY3QgPSBvcmlnaW5faW5jcmVmKGUtPnN1c3BlY3QpOworCQlzcGxpdFsyXS5sbm8gPSBlLT5sbm8gKyAoc2FtZSAtIGUtPnNfbG5vKTsKKwkJc3BsaXRbMl0uc19sbm8gPSBlLT5zX2xubyArIChzYW1lIC0gZS0+c19sbm8pOworCQlzcGxpdFsyXS5udW1fbGluZXMgPSBlLT5zX2xubyArIGUtPm51bV9saW5lcyAtIHNhbWU7CisJCWNodW5rX2VuZF9sbm8gPSBzcGxpdFsyXS5sbm87CisJfQorCWVsc2UKKwkJY2h1bmtfZW5kX2xubyA9IGUtPmxubyArIGUtPm51bV9saW5lczsKKwlzcGxpdFsxXS5udW1fbGluZXMgPSBjaHVua19lbmRfbG5vIC0gc3BsaXRbMV0ubG5vOworCisJLyoKKwkgKiBpZiBpdCB0dXJucyBvdXQgdGhlcmUgaXMgbm90aGluZyB0byBibGFtZSB0aGUgcGFyZW50IGZvciwKKwkgKiBmb3JnZXQgYWJvdXQgdGhlIHNwbGl0dGluZy4gICFzcGxpdFsxXS5zdXNwZWN0IHNpZ25hbHMgdGhpcy4KKwkgKi8KKwlpZiAoc3BsaXRbMV0ubnVtX2xpbmVzIDwgMSkKKwkJcmV0dXJuOworCXNwbGl0WzFdLnN1c3BlY3QgPSBvcmlnaW5faW5jcmVmKHBhcmVudCk7Cit9CisKKy8qCisgKiBzcGxpdF9vdmVybGFwKCkgZGl2aWRlZCBhbiBleGlzdGluZyBibGFtZSBlIGludG8gdXAgdG8gdGhyZWUgcGFydHMKKyAqIGluIHNwbGl0LiAgQWRqdXN0IHRoZSBsaW5rZWQgbGlzdCBvZiBibGFtZXMgaW4gdGhlIHNjb3JlYm9hcmQgdG8KKyAqIHJlZmxlY3QgdGhlIHNwbGl0LgorICovCitzdGF0aWMgdm9pZCBzcGxpdF9ibGFtZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQlzdHJ1Y3QgYmxhbWVfZW50cnkgKnNwbGl0LAorCQkJc3RydWN0IGJsYW1lX2VudHJ5ICplKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqbmV3X2VudHJ5OworCisJaWYgKHNwbGl0WzBdLnN1c3BlY3QgJiYgc3BsaXRbMl0uc3VzcGVjdCkgeworCQkvKiBUaGUgZmlyc3QgcGFydCAocmV1c2Ugc3RvcmFnZSBmb3IgdGhlIGV4aXN0aW5nIGVudHJ5IGUpICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMF0pOworCisJCS8qIFRoZSBsYXN0IHBhcnQgLS0gbWUgKi8KKwkJbmV3X2VudHJ5ID0geG1hbGxvYyhzaXplb2YoKm5ld19lbnRyeSkpOworCQltZW1jcHkobmV3X2VudHJ5LCAmKHNwbGl0WzJdKSwgc2l6ZW9mKHN0cnVjdCBibGFtZV9lbnRyeSkpOworCQlhZGRfYmxhbWVfZW50cnkoc2IsIG5ld19lbnRyeSk7CisKKwkJLyogLi4uIGFuZCB0aGUgbWlkZGxlIHBhcnQgLS0gcGFyZW50ICovCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsxXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKwllbHNlIGlmICghc3BsaXRbMF0uc3VzcGVjdCAmJiAhc3BsaXRbMl0uc3VzcGVjdCkKKwkJLyoKKwkJICogVGhlIHBhcmVudCBjb3ZlcnMgdGhlIGVudGlyZSBhcmVhOyByZXVzZSBzdG9yYWdlIGZvcgorCQkgKiBlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHBhcmVudC4KKwkJICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMV0pOworCWVsc2UgaWYgKHNwbGl0WzBdLnN1c3BlY3QpIHsKKwkJLyogbWUgYW5kIHRoZW4gcGFyZW50ICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMF0pOworCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsxXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKwllbHNlIHsKKwkJLyogcGFyZW50IGFuZCB0aGVuIG1lICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMV0pOworCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsyXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKworCWlmIChERUJVRykgeyAvKiBzYW5pdHkgKi8KKwkJc3RydWN0IGJsYW1lX2VudHJ5ICplbnQ7CisJCWludCBsbm8gPSBzYi0+ZW50LT5sbm8sIGNvcnJ1cHQgPSAwOworCisJCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCWlmIChsbm8gIT0gZW50LT5sbm8pCisJCQkJY29ycnVwdCA9IDE7CisJCQlpZiAoZW50LT5zX2xubyA8IDApCisJCQkJY29ycnVwdCA9IDE7CisJCQlsbm8gKz0gZW50LT5udW1fbGluZXM7CisJCX0KKwkJaWYgKGNvcnJ1cHQpIHsKKwkJCWxubyA9IHNiLT5lbnQtPmxubzsKKwkJCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCQlwcmludGYoIkwgJThkIGwgJThkIG4gJThkXG4iLAorCQkJCSAgICAgICBsbm8sIGVudC0+bG5vLCBlbnQtPm51bV9saW5lcyk7CisJCQkJbG5vID0gZW50LT5sbm8gKyBlbnQtPm51bV9saW5lczsKKwkJCX0KKwkJCWRpZSgib29wcyIpOworCQl9CisJfQorfQorCisvKgorICogQWZ0ZXIgc3BsaXR0aW5nIHRoZSBibGFtZSwgdGhlIG9yaWdpbnMgdXNlZCBieSB0aGUKKyAqIG9uLXN0YWNrIGJsYW1lX2VudHJ5IHNob3VsZCBsb3NlIG9uZSByZWZjbnQgZWFjaC4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVmX3NwbGl0KHN0cnVjdCBibGFtZV9lbnRyeSAqc3BsaXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlvcmlnaW5fZGVjcmVmKHNwbGl0W2ldLnN1c3BlY3QpOworfQorCisvKgorICogSGVscGVyIGZvciBibGFtZV9jaHVuaygpLiAgYmxhbWVfZW50cnkgZSBpcyBrbm93biB0byBvdmVybGFwIHdpdGgKKyAqIHRoZSBwYXRjaCBodW5rOyBzcGxpdCBpdCBhbmQgcGFzcyBibGFtZSB0byB0aGUgcGFyZW50LgorICovCitzdGF0aWMgdm9pZCBibGFtZV9vdmVybGFwKHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IGJsYW1lX2VudHJ5ICplLAorCQkJICBpbnQgdGxubywgaW50IHBsbm8sIGludCBzYW1lLAorCQkJICBzdHJ1Y3Qgb3JpZ2luICpwYXJlbnQpCit7CisJc3RydWN0IGJsYW1lX2VudHJ5IHNwbGl0WzNdOworCisJc3BsaXRfb3ZlcmxhcChzcGxpdCwgZSwgdGxubywgcGxubywgc2FtZSwgcGFyZW50KTsKKwlpZiAoc3BsaXRbMV0uc3VzcGVjdCkKKwkJc3BsaXRfYmxhbWUoc2IsIHNwbGl0LCBlKTsKKwlkZWNyZWZfc3BsaXQoc3BsaXQpOworfQorCisvKgorICogRmluZCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGxhc3QgbGluZSB0aGUgdGFyZ2V0IGlzIHN1c3BlY3RlZCBmb3IuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9sYXN0X2luX3RhcmdldChzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCBvcmlnaW4gKnRhcmdldCkKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmU7CisJaW50IGxhc3RfaW5fdGFyZ2V0ID0gLTE7CisKKwlmb3IgKGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQlpZiAoZS0+Z3VpbHR5IHx8ICFzYW1lX3N1c3BlY3QoZS0+c3VzcGVjdCwgdGFyZ2V0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobGFzdF9pbl90YXJnZXQgPCBlLT5zX2xubyArIGUtPm51bV9saW5lcykKKwkJCWxhc3RfaW5fdGFyZ2V0ID0gZS0+c19sbm8gKyBlLT5udW1fbGluZXM7CisJfQorCXJldHVybiBsYXN0X2luX3RhcmdldDsKK30KKworLyoKKyAqIFByb2Nlc3Mgb25lIGh1bmsgZnJvbSB0aGUgcGF0Y2ggYmV0d2VlbiB0aGUgY3VycmVudCBzdXNwZWN0IGZvcgorICogYmxhbWVfZW50cnkgZSBhbmQgaXRzIHBhcmVudC4gIEZpbmQgYW5kIHNwbGl0IHRoZSBvdmVybGFwLCBhbmQKKyAqIHBhc3MgYmxhbWUgdG8gdGhlIG92ZXJsYXBwaW5nIHBhcnQgdG8gdGhlIHBhcmVudC4KKyAqLworc3RhdGljIHZvaWQgYmxhbWVfY2h1bmsoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJaW50IHRsbm8sIGludCBwbG5vLCBpbnQgc2FtZSwKKwkJCXN0cnVjdCBvcmlnaW4gKnRhcmdldCwgc3RydWN0IG9yaWdpbiAqcGFyZW50KQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKworCWZvciAoZSA9IHNiLT5lbnQ7IGU7IGUgPSBlLT5uZXh0KSB7CisJCWlmIChlLT5ndWlsdHkgfHwgIXNhbWVfc3VzcGVjdChlLT5zdXNwZWN0LCB0YXJnZXQpKQorCQkJY29udGludWU7CisJCWlmIChzYW1lIDw9IGUtPnNfbG5vKQorCQkJY29udGludWU7CisJCWlmICh0bG5vIDwgZS0+c19sbm8gKyBlLT5udW1fbGluZXMpCisJCQlibGFtZV9vdmVybGFwKHNiLCBlLCB0bG5vLCBwbG5vLCBzYW1lLCBwYXJlbnQpOworCX0KK30KKworLyoKKyAqIFdlIGFyZSBsb29raW5nIGF0IHRoZSBvcmlnaW4gJ3RhcmdldCcgYW5kIGFpbWluZyB0byBwYXNzIGJsYW1lCisgKiBmb3IgdGhlIGxpbmVzIGl0IGlzIHN1c3BlY3RlZCB0byBpdHMgcGFyZW50LiAgUnVuIGRpZmYgdG8gZmluZAorICogd2hpY2ggbGluZXMgY2FtZSBmcm9tIHBhcmVudCBhbmQgcGFzcyBibGFtZSBmb3IgdGhlbS4KKyAqLworc3RhdGljIGludCBwYXNzX2JsYW1lX3RvX3BhcmVudChzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJc3RydWN0IG9yaWdpbiAqdGFyZ2V0LAorCQkJCXN0cnVjdCBvcmlnaW4gKnBhcmVudCkKK3sKKwlpbnQgaSwgbGFzdF9pbl90YXJnZXQsIHBsbm8sIHRsbm87CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKworCWxhc3RfaW5fdGFyZ2V0ID0gZmluZF9sYXN0X2luX3RhcmdldChzYiwgdGFyZ2V0KTsKKwlpZiAobGFzdF9pbl90YXJnZXQgPCAwKQorCQlyZXR1cm4gMTsgLyogbm90aGluZyByZW1haW5zIGZvciB0aGlzIHRhcmdldCAqLworCisJcGF0Y2ggPSBnZXRfcGF0Y2gocGFyZW50LCB0YXJnZXQpOworCXBsbm8gPSB0bG5vID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcGF0Y2gtPm51bTsgaSsrKSB7CisJCXN0cnVjdCBjaHVuayAqY2h1bmsgPSAmcGF0Y2gtPmNodW5rc1tpXTsKKworCQlibGFtZV9jaHVuayhzYiwgdGxubywgcGxubywgY2h1bmstPnNhbWUsIHRhcmdldCwgcGFyZW50KTsKKwkJcGxubyA9IGNodW5rLT5wX25leHQ7CisJCXRsbm8gPSBjaHVuay0+dF9uZXh0OworCX0KKwkvKiBUaGUgcmVzdCAoaS5lLiBhbnl0aGluZyBhZnRlciB0bG5vKSBhcmUgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCAqLworCWJsYW1lX2NodW5rKHNiLCB0bG5vLCBwbG5vLCBsYXN0X2luX3RhcmdldCwgdGFyZ2V0LCBwYXJlbnQpOworCisJZnJlZV9wYXRjaChwYXRjaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgbGluZXMgaW4gYmxhbWVfZW50cnkgYWZ0ZXIgc3BsaXR0aW5nIGJsYW1lcyBtYW55IHRpbWVzIGNhbiBiZWNvbWUKKyAqIHZlcnkgc21hbGwgYW5kIHRyaXZpYWwsIGFuZCBhdCBzb21lIHBvaW50IGl0IGJlY29tZXMgcG9pbnRsZXNzIHRvCisgKiBibGFtZSB0aGUgcGFyZW50cy4gIEUuZy4gIlx0XHR9XG5cdH1cblxuIiBhcHBlYXJzIGV2ZXJ5d2hlcmUgaW4gYW55CisgKiBvcmRpbmFyeSBDIHByb2dyYW0sIGFuZCBpdCBpcyBub3Qgd29ydGggdG8gc2F5IGl0IHdhcyBjb3BpZWQgZnJvbQorICogdG90YWxseSB1bnJlbGF0ZWQgZmlsZSBpbiB0aGUgcGFyZW50LgorICoKKyAqIENvbXB1dGUgaG93IHRyaXZpYWwgdGhlIGxpbmVzIGluIHRoZSBibGFtZV9lbnRyeSBhcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBlbnRfc2NvcmUoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBzdHJ1Y3QgYmxhbWVfZW50cnkgKmUpCit7CisJdW5zaWduZWQgc2NvcmU7CisJY29uc3QgY2hhciAqY3AsICplcDsKKworCWlmIChlLT5zY29yZSkKKwkJcmV0dXJuIGUtPnNjb3JlOworCisJc2NvcmUgPSAxOworCWNwID0gbnRoX2xpbmUoc2IsIGUtPmxubyk7CisJZXAgPSBudGhfbGluZShzYiwgZS0+bG5vICsgZS0+bnVtX2xpbmVzKTsKKwl3aGlsZSAoY3AgPCBlcCkgeworCQl1bnNpZ25lZCBjaCA9ICooKHVuc2lnbmVkIGNoYXIgKiljcCk7CisJCWlmIChpc2FsbnVtKGNoKSkKKwkJCXNjb3JlKys7CisJCWNwKys7CisJfQorCWUtPnNjb3JlID0gc2NvcmU7CisJcmV0dXJuIHNjb3JlOworfQorCisvKgorICogYmVzdF9zb19mYXJbXSBhbmQgdGhpc1tdIGFyZSBib3RoIGEgc3BsaXQgb2YgYW4gZXhpc3RpbmcgYmxhbWVfZW50cnkKKyAqIHRoYXQgcGFzc2VzIGJsYW1lIHRvIHRoZSBwYXJlbnQuICBNYWludGFpbiBiZXN0X3NvX2ZhciB0aGUgYmVzdCBzcGxpdAorICogc28gZmFyLCBieSBjb21wYXJpbmcgdGhpcyBhbmQgYmVzdF9zb19mYXIgYW5kIGNvcHlpbmcgdGhpcyBpbnRvCisgKiBic3Rfc29fZmFyIGFzIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgY29weV9zcGxpdF9pZl9iZXR0ZXIoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKmJlc3Rfc29fZmFyLAorCQkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKnRoaXMpCit7CisJaW50IGk7CisKKwlpZiAoIXRoaXNbMV0uc3VzcGVjdCkKKwkJcmV0dXJuOworCWlmIChiZXN0X3NvX2ZhclsxXS5zdXNwZWN0KSB7CisJCWlmIChlbnRfc2NvcmUoc2IsICZ0aGlzWzFdKSA8IGVudF9zY29yZShzYiwgJmJlc3Rfc29fZmFyWzFdKSkKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlvcmlnaW5faW5jcmVmKHRoaXNbaV0uc3VzcGVjdCk7CisJZGVjcmVmX3NwbGl0KGJlc3Rfc29fZmFyKTsKKwltZW1jcHkoYmVzdF9zb19mYXIsIHRoaXMsIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkgWzNdKSk7Cit9CisKKy8qCisgKiBXZSBhcmUgbG9va2luZyBhdCBhIHBhcnQgb2YgdGhlIGZpbmFsIGltYWdlIHJlcHJlc2VudGVkIGJ5CisgKiBlbnQgKHRsbm8gYW5kIHNhbWUgYXJlIG9mZnNldCBieSBlbnQtPnNfbG5vKS4KKyAqIHRsbm8gaXMgd2hlcmUgd2UgYXJlIGxvb2tpbmcgYXQgaW4gdGhlIGZpbmFsIGltYWdlLgorICogdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSBzYW1lIG1hdGNoIHByZWltYWdlLgorICogcGxubyBpcyB3aGVyZSB3ZSBhcmUgbG9va2luZyBhdCBpbiB0aGUgcHJlaW1hZ2UuCisgKgorICogPC0tLS0tLS0tLS0tLS0tIGZpbmFsIGltYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgKiAgICAgICA8LS0tLS0tZW50LS0tLS0tPgorICogICAgICAgICBedGxubyBec2FtZQorICogICAgPC0tLS0tLS0tLXByZWltYWdlLS0tLS0+CisgKiAgICAgICAgIF5wbG5vCisgKgorICogQWxsIGxpbmUgbnVtYmVycyBhcmUgMC1iYXNlZC4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX3NwbGl0KHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudCwKKwkJCSBpbnQgdGxubywgaW50IHBsbm8sIGludCBzYW1lLAorCQkJIHN0cnVjdCBvcmlnaW4gKnBhcmVudCwKKwkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKnNwbGl0KQoreworCWlmIChlbnQtPm51bV9saW5lcyA8PSB0bG5vKQorCQlyZXR1cm47CisJaWYgKHRsbm8gPCBzYW1lKSB7CisJCXN0cnVjdCBibGFtZV9lbnRyeSB0aGlzWzNdOworCQl0bG5vICs9IGVudC0+c19sbm87CisJCXNhbWUgKz0gZW50LT5zX2xubzsKKwkJc3BsaXRfb3ZlcmxhcCh0aGlzLCBlbnQsIHRsbm8sIHBsbm8sIHNhbWUsIHBhcmVudCk7CisJCWNvcHlfc3BsaXRfaWZfYmV0dGVyKHNiLCBzcGxpdCwgdGhpcyk7CisJCWRlY3JlZl9zcGxpdCh0aGlzKTsKKwl9Cit9CisKKy8qCisgKiBGaW5kIHRoZSBsaW5lcyBmcm9tIHBhcmVudCB0aGF0IGFyZSB0aGUgc2FtZSBhcyBlbnQgc28gdGhhdAorICogd2UgY2FuIHBhc3MgYmxhbWVzIHRvIGl0LiAgZmlsZV9wIGhhcyB0aGUgYmxvYiBjb250ZW50cyBmb3IKKyAqIHRoZSBwYXJlbnQuCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfY29weV9pbl9ibG9iKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCSAgICAgIHN0cnVjdCBibGFtZV9lbnRyeSAqZW50LAorCQkJICAgICAgc3RydWN0IG9yaWdpbiAqcGFyZW50LAorCQkJICAgICAgc3RydWN0IGJsYW1lX2VudHJ5ICpzcGxpdCwKKwkJCSAgICAgIG1tZmlsZV90ICpmaWxlX3ApCit7CisJY29uc3QgY2hhciAqY3A7CisJaW50IGNudDsKKwltbWZpbGVfdCBmaWxlX287CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKwlpbnQgaSwgcGxubywgdGxubzsKKworCS8qCisJICogUHJlcGFyZSBtbWZpbGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBsaW5lcyBpbiBlbnQuCisJICovCisJY3AgPSBudGhfbGluZShzYiwgZW50LT5sbm8pOworCWZpbGVfby5wdHIgPSAoY2hhciopIGNwOworCWNudCA9IGVudC0+bnVtX2xpbmVzOworCisJd2hpbGUgKGNudCAmJiBjcCA8IHNiLT5maW5hbF9idWYgKyBzYi0+ZmluYWxfYnVmX3NpemUpIHsKKwkJaWYgKCpjcCsrID09ICdcbicpCisJCQljbnQtLTsKKwl9CisJZmlsZV9vLnNpemUgPSBjcCAtIGZpbGVfby5wdHI7CisKKwlwYXRjaCA9IGNvbXBhcmVfYnVmZmVyKGZpbGVfcCwgJmZpbGVfbywgMSk7CisKKwkvKgorCSAqIGZpbGVfbyBpcyBhIHBhcnQgb2YgZmluYWwgaW1hZ2Ugd2UgYXJlIGFubm90YXRpbmcuCisJICogZmlsZV9wIHBhcnRpYWxseSBtYXkgbWF0Y2ggdGhhdCBpbWFnZS4KKwkgKi8KKwltZW1zZXQoc3BsaXQsIDAsIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkgWzNdKSk7CisJcGxubyA9IHRsbm8gPSAwOworCWZvciAoaSA9IDA7IGkgPCBwYXRjaC0+bnVtOyBpKyspIHsKKwkJc3RydWN0IGNodW5rICpjaHVuayA9ICZwYXRjaC0+Y2h1bmtzW2ldOworCisJCWhhbmRsZV9zcGxpdChzYiwgZW50LCB0bG5vLCBwbG5vLCBjaHVuay0+c2FtZSwgcGFyZW50LCBzcGxpdCk7CisJCXBsbm8gPSBjaHVuay0+cF9uZXh0OworCQl0bG5vID0gY2h1bmstPnRfbmV4dDsKKwl9CisJLyogcmVtYWluZGVyLCBpZiBhbnksIGFsbCBtYXRjaCB0aGUgcHJlaW1hZ2UgKi8KKwloYW5kbGVfc3BsaXQoc2IsIGVudCwgdGxubywgcGxubywgZW50LT5udW1fbGluZXMsIHBhcmVudCwgc3BsaXQpOworCWZyZWVfcGF0Y2gocGF0Y2gpOworfQorCisvKgorICogU2VlIGlmIGxpbmVzIGN1cnJlbnRseSB0YXJnZXQgaXMgc3VzcGVjdGVkIGZvciBjYW4gYmUgYXR0cmlidXRlZCB0bworICogcGFyZW50LgorICovCitzdGF0aWMgaW50IGZpbmRfbW92ZV9pbl9wYXJlbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJICAgICAgIHN0cnVjdCBvcmlnaW4gKnRhcmdldCwKKwkJCSAgICAgICBzdHJ1Y3Qgb3JpZ2luICpwYXJlbnQpCit7CisJaW50IGxhc3RfaW5fdGFyZ2V0LCBtYWRlX3Byb2dyZXNzOworCXN0cnVjdCBibGFtZV9lbnRyeSAqZSwgc3BsaXRbM107CisJbW1maWxlX3QgZmlsZV9wOworCisJbGFzdF9pbl90YXJnZXQgPSBmaW5kX2xhc3RfaW5fdGFyZ2V0KHNiLCB0YXJnZXQpOworCWlmIChsYXN0X2luX3RhcmdldCA8IDApCisJCXJldHVybiAxOyAvKiBub3RoaW5nIHJlbWFpbnMgZm9yIHRoaXMgdGFyZ2V0ICovCisKKwlmaWxsX29yaWdpbl9ibG9iKHBhcmVudCwgJmZpbGVfcCk7CisJaWYgKCFmaWxlX3AucHRyKQorCQlyZXR1cm4gMDsKKworCW1hZGVfcHJvZ3Jlc3MgPSAxOworCXdoaWxlIChtYWRlX3Byb2dyZXNzKSB7CisJCW1hZGVfcHJvZ3Jlc3MgPSAwOworCQlmb3IgKGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQkJaWYgKGUtPmd1aWx0eSB8fCAhc2FtZV9zdXNwZWN0KGUtPnN1c3BlY3QsIHRhcmdldCkpCisJCQkJY29udGludWU7CisJCQlmaW5kX2NvcHlfaW5fYmxvYihzYiwgZSwgcGFyZW50LCBzcGxpdCwgJmZpbGVfcCk7CisJCQlpZiAoc3BsaXRbMV0uc3VzcGVjdCAmJgorCQkJICAgIGJsYW1lX21vdmVfc2NvcmUgPCBlbnRfc2NvcmUoc2IsICZzcGxpdFsxXSkpIHsKKwkJCQlzcGxpdF9ibGFtZShzYiwgc3BsaXQsIGUpOworCQkJCW1hZGVfcHJvZ3Jlc3MgPSAxOworCQkJfQorCQkJZGVjcmVmX3NwbGl0KHNwbGl0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJsYW1lX2xpc3QgeworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50OworCXN0cnVjdCBibGFtZV9lbnRyeSBzcGxpdFszXTsKK307CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdGhlIHRhcmdldCBpcyBzdXNwZWN0ZWQgZm9yLAorICogYW5kIHByZXBhcmUgYSBsaXN0IG9mIGVudHJ5IGFuZCB0aGUgYmVzdCBzcGxpdC4KKyAqLworc3RhdGljIHN0cnVjdCBibGFtZV9saXN0ICpzZXR1cF9ibGFtZV9saXN0KHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCQkJICAgc3RydWN0IG9yaWdpbiAqdGFyZ2V0LAorCQkJCQkgICBpbnQgKm51bV9lbnRzX3ApCit7CisJc3RydWN0IGJsYW1lX2VudHJ5ICplOworCWludCBudW1fZW50cywgaTsKKwlzdHJ1Y3QgYmxhbWVfbGlzdCAqYmxhbWVfbGlzdCA9IE5VTEw7CisKKwlmb3IgKGUgPSBzYi0+ZW50LCBudW1fZW50cyA9IDA7IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoIWUtPmd1aWx0eSAmJiBzYW1lX3N1c3BlY3QoZS0+c3VzcGVjdCwgdGFyZ2V0KSkKKwkJCW51bV9lbnRzKys7CisJaWYgKG51bV9lbnRzKSB7CisJCWJsYW1lX2xpc3QgPSB4Y2FsbG9jKG51bV9lbnRzLCBzaXplb2Yoc3RydWN0IGJsYW1lX2xpc3QpKTsKKwkJZm9yIChlID0gc2ItPmVudCwgaSA9IDA7IGU7IGUgPSBlLT5uZXh0KQorCQkJaWYgKCFlLT5ndWlsdHkgJiYgc2FtZV9zdXNwZWN0KGUtPnN1c3BlY3QsIHRhcmdldCkpCisJCQkJYmxhbWVfbGlzdFtpKytdLmVudCA9IGU7CisJfQorCSpudW1fZW50c19wID0gbnVtX2VudHM7CisJcmV0dXJuIGJsYW1lX2xpc3Q7Cit9CisKKy8qCisgKiBGb3IgbGluZXMgdGFyZ2V0IGlzIHN1c3BlY3RlZCBmb3IsIHNlZSBpZiB3ZSBjYW4gZmluZCBjb2RlIG1vdmVtZW50CisgKiBhY3Jvc3MgZmlsZSBib3VuZGFyeSBmcm9tIHRoZSBwYXJlbnQgY29tbWl0LiAgcG9yaWdpbiBpcyB0aGUgcGF0aAorICogaW4gdGhlIHBhcmVudCB3ZSBhbHJlYWR5IHRyaWVkLgorICovCitzdGF0aWMgaW50IGZpbmRfY29weV9pbl9wYXJlbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJICAgICAgIHN0cnVjdCBvcmlnaW4gKnRhcmdldCwKKwkJCSAgICAgICBzdHJ1Y3QgY29tbWl0ICpwYXJlbnQsCisJCQkgICAgICAgc3RydWN0IG9yaWdpbiAqcG9yaWdpbiwKKwkJCSAgICAgICBpbnQgb3B0KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRzOworCWNvbnN0IGNoYXIgKnBhdGhzWzFdOworCWludCBpLCBqOworCWludCByZXR2YWw7CisJc3RydWN0IGJsYW1lX2xpc3QgKmJsYW1lX2xpc3Q7CisJaW50IG51bV9lbnRzOworCisJYmxhbWVfbGlzdCA9IHNldHVwX2JsYW1lX2xpc3Qoc2IsIHRhcmdldCwgJm51bV9lbnRzKTsKKwlpZiAoIWJsYW1lX2xpc3QpCisJCXJldHVybiAxOyAvKiBub3RoaW5nIHJlbWFpbnMgZm9yIHRoaXMgdGFyZ2V0ICovCisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCWRpZmZfb3B0cy5yZWN1cnNpdmUgPSAxOworCWRpZmZfb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCisJcGF0aHNbMF0gPSBOVUxMOworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhwYXRocywgJmRpZmZfb3B0cyk7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRzKSA8IDApCisJCWRpZSgiZGlmZi1zZXR1cCIpOworCisJLyogVHJ5ICJmaW5kIGNvcGllcyBoYXJkZXIiIG9uIG5ldyBwYXRoIGlmIHJlcXVlc3RlZDsKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byB1c2UgZGlmZmNvcmVfcmVuYW1lKCkgYWN0dWFsbHkgdG8KKwkgKiBtYXRjaCB0aGluZ3MgdXA7IGZpbmRfY29waWVzX2hhcmRlciBpcyBzZXQgb25seSB0bworCSAqIGZvcmNlIGRpZmZfdHJlZV9zaGExKCkgdG8gZmVlZCBhbGwgZmlsZXBhaXJzIHRvIGRpZmZfcXVldWUsCisJICogYW5kIHRoaXMgY29kZSBuZWVkcyB0byBiZSBhZnRlciBkaWZmX3NldHVwX2RvbmUoKSwgd2hpY2gKKwkgKiB1c3VhbGx5IG1ha2VzIGZpbmQtY29waWVzLWhhcmRlciBpbXBseSBjb3B5IGRldGVjdGlvbi4KKwkgKi8KKwlpZiAoKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVNUKQorCSAgICB8fCAoKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVIpCisJCSYmICghcG9yaWdpbiB8fCBzdHJjbXAodGFyZ2V0LT5wYXRoLCBwb3JpZ2luLT5wYXRoKSkpKQorCQlkaWZmX29wdHMuZmluZF9jb3BpZXNfaGFyZGVyID0gMTsKKworCWlmIChpc19udWxsX3NoYTEodGFyZ2V0LT5jb21taXQtPm9iamVjdC5zaGExKSkKKwkJZG9fZGlmZl9jYWNoZShwYXJlbnQtPnRyZWUtPm9iamVjdC5zaGExLCAmZGlmZl9vcHRzKTsKKwllbHNlCisJCWRpZmZfdHJlZV9zaGExKHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkgICAgICAgdGFyZ2V0LT5jb21taXQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkJICAgICAgICIiLCAmZGlmZl9vcHRzKTsKKworCWlmICghZGlmZl9vcHRzLmZpbmRfY29waWVzX2hhcmRlcikKKwkJZGlmZmNvcmVfc3RkKCZkaWZmX29wdHMpOworCisJcmV0dmFsID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgbWFkZV9wcm9ncmVzcyA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGRpZmZfcXVldWVkX2RpZmYubnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBkaWZmX3F1ZXVlZF9kaWZmLnF1ZXVlW2ldOworCQkJc3RydWN0IG9yaWdpbiAqbm9yaWdpbjsKKwkJCW1tZmlsZV90IGZpbGVfcDsKKwkJCXN0cnVjdCBibGFtZV9lbnRyeSB0aGlzWzNdOworCisJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpKQorCQkJCWNvbnRpbnVlOyAvKiBkb2VzIG5vdCBleGlzdCBpbiBwYXJlbnQgKi8KKwkJCWlmIChwb3JpZ2luICYmICFzdHJjbXAocC0+b25lLT5wYXRoLCBwb3JpZ2luLT5wYXRoKSkKKwkJCQkvKiBmaW5kX21vdmUgYWxyZWFkeSBkZWFsdCB3aXRoIHRoaXMgcGF0aCAqLworCQkJCWNvbnRpbnVlOworCisJCQlub3JpZ2luID0gZ2V0X29yaWdpbihzYiwgcGFyZW50LCBwLT5vbmUtPnBhdGgpOworCQkJaGFzaGNweShub3JpZ2luLT5ibG9iX3NoYTEsIHAtPm9uZS0+c2hhMSk7CisJCQlmaWxsX29yaWdpbl9ibG9iKG5vcmlnaW4sICZmaWxlX3ApOworCQkJaWYgKCFmaWxlX3AucHRyKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBqIDwgbnVtX2VudHM7IGorKykgeworCQkJCWZpbmRfY29weV9pbl9ibG9iKHNiLCBibGFtZV9saXN0W2pdLmVudCwKKwkJCQkJCSAgbm9yaWdpbiwgdGhpcywgJmZpbGVfcCk7CisJCQkJY29weV9zcGxpdF9pZl9iZXR0ZXIoc2IsIGJsYW1lX2xpc3Rbal0uc3BsaXQsCisJCQkJCQkgICAgIHRoaXMpOworCQkJCWRlY3JlZl9zcGxpdCh0aGlzKTsKKwkJCX0KKwkJCW9yaWdpbl9kZWNyZWYobm9yaWdpbik7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2VudHM7IGorKykgeworCQkJc3RydWN0IGJsYW1lX2VudHJ5ICpzcGxpdCA9IGJsYW1lX2xpc3Rbal0uc3BsaXQ7CisJCQlpZiAoc3BsaXRbMV0uc3VzcGVjdCAmJgorCQkJICAgIGJsYW1lX2NvcHlfc2NvcmUgPCBlbnRfc2NvcmUoc2IsICZzcGxpdFsxXSkpIHsKKwkJCQlzcGxpdF9ibGFtZShzYiwgc3BsaXQsIGJsYW1lX2xpc3Rbal0uZW50KTsKKwkJCQltYWRlX3Byb2dyZXNzID0gMTsKKwkJCX0KKwkJCWRlY3JlZl9zcGxpdChzcGxpdCk7CisJCX0KKwkJZnJlZShibGFtZV9saXN0KTsKKworCQlpZiAoIW1hZGVfcHJvZ3Jlc3MpCisJCQlicmVhazsKKwkJYmxhbWVfbGlzdCA9IHNldHVwX2JsYW1lX2xpc3Qoc2IsIHRhcmdldCwgJm51bV9lbnRzKTsKKwkJaWYgKCFibGFtZV9saXN0KSB7CisJCQlyZXR2YWwgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZGlmZl9mbHVzaCgmZGlmZl9vcHRzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGUgYmxvYnMgb2Ygb3JpZ2luIGFuZCBwb3JpZ2luIGV4YWN0bHkgbWF0Y2gsIHNvIGV2ZXJ5dGhpbmcKKyAqIG9yaWdpbiBpcyBzdXNwZWN0ZWQgZm9yIGNhbiBiZSBibGFtZWQgb24gdGhlIHBhcmVudC4KKyAqLworc3RhdGljIHZvaWQgcGFzc193aG9sZV9ibGFtZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkgICAgIHN0cnVjdCBvcmlnaW4gKm9yaWdpbiwgc3RydWN0IG9yaWdpbiAqcG9yaWdpbikKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmU7CisKKwlpZiAoIXBvcmlnaW4tPmZpbGUucHRyICYmIG9yaWdpbi0+ZmlsZS5wdHIpIHsKKwkJLyogU3RlYWwgaXRzIGZpbGUgKi8KKwkJcG9yaWdpbi0+ZmlsZSA9IG9yaWdpbi0+ZmlsZTsKKwkJb3JpZ2luLT5maWxlLnB0ciA9IE5VTEw7CisJfQorCWZvciAoZSA9IHNiLT5lbnQ7IGU7IGUgPSBlLT5uZXh0KSB7CisJCWlmICghc2FtZV9zdXNwZWN0KGUtPnN1c3BlY3QsIG9yaWdpbikpCisJCQljb250aW51ZTsKKwkJb3JpZ2luX2luY3JlZihwb3JpZ2luKTsKKwkJb3JpZ2luX2RlY3JlZihlLT5zdXNwZWN0KTsKKwkJZS0+c3VzcGVjdCA9IHBvcmlnaW47CisJfQorfQorCisjZGVmaW5lIE1BWFBBUkVOVCAxNgorCitzdGF0aWMgdm9pZCBwYXNzX2JsYW1lKHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IG9yaWdpbiAqb3JpZ2luLCBpbnQgb3B0KQoreworCWludCBpLCBwYXNzOworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IG9yaWdpbi0+Y29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50OworCXN0cnVjdCBvcmlnaW4gKnBhcmVudF9vcmlnaW5bTUFYUEFSRU5UXSwgKnBvcmlnaW47CisKKwltZW1zZXQocGFyZW50X29yaWdpbiwgMCwgc2l6ZW9mKHBhcmVudF9vcmlnaW4pKTsKKworCS8qIFRoZSBmaXJzdCBwYXNzIGxvb2tzIGZvciB1bnJlbmFtZWQgcGF0aCB0byBvcHRpbWl6ZSBmb3IKKwkgKiBjb21tb24gY2FzZXMsIHRoZW4gd2UgbG9vayBmb3IgcmVuYW1lcyBpbiB0aGUgc2Vjb25kIHBhc3MuCisJICovCisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQlzdHJ1Y3Qgb3JpZ2luICooKmZpbmQpKHN0cnVjdCBzY29yZWJvYXJkICosCisJCQkJICAgICAgIHN0cnVjdCBjb21taXQgKiwgc3RydWN0IG9yaWdpbiAqKTsKKwkJZmluZCA9IHBhc3MgPyBmaW5kX3JlbmFtZSA6IGZpbmRfb3JpZ2luOworCisJCWZvciAoaSA9IDAsIHBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBpIDwgTUFYUEFSRU5UICYmIHBhcmVudDsKKwkJICAgICBwYXJlbnQgPSBwYXJlbnQtPm5leHQsIGkrKykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKwkJCWludCBqLCBzYW1lOworCisJCQlpZiAocGFyZW50X29yaWdpbltpXSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwYXJzZV9jb21taXQocCkpCisJCQkJY29udGludWU7CisJCQlwb3JpZ2luID0gZmluZChzYiwgcCwgb3JpZ2luKTsKKwkJCWlmICghcG9yaWdpbikKKwkJCQljb250aW51ZTsKKwkJCWlmICghaGFzaGNtcChwb3JpZ2luLT5ibG9iX3NoYTEsIG9yaWdpbi0+YmxvYl9zaGExKSkgeworCQkJCXBhc3Nfd2hvbGVfYmxhbWUoc2IsIG9yaWdpbiwgcG9yaWdpbik7CisJCQkJb3JpZ2luX2RlY3JlZihwb3JpZ2luKTsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJCWZvciAoaiA9IHNhbWUgPSAwOyBqIDwgaTsgaisrKQorCQkJCWlmIChwYXJlbnRfb3JpZ2luW2pdICYmCisJCQkJICAgICFoYXNoY21wKHBhcmVudF9vcmlnaW5bal0tPmJsb2Jfc2hhMSwKKwkJCQkJICAgICBwb3JpZ2luLT5ibG9iX3NoYTEpKSB7CisJCQkJCXNhbWUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoIXNhbWUpCisJCQkJcGFyZW50X29yaWdpbltpXSA9IHBvcmlnaW47CisJCQllbHNlCisJCQkJb3JpZ2luX2RlY3JlZihwb3JpZ2luKTsKKwkJfQorCX0KKworCW51bV9jb21taXRzKys7CisJZm9yIChpID0gMCwgcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCSAgICAgaSA8IE1BWFBBUkVOVCAmJiBwYXJlbnQ7CisJICAgICBwYXJlbnQgPSBwYXJlbnQtPm5leHQsIGkrKykgeworCQlzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luID0gcGFyZW50X29yaWdpbltpXTsKKwkJaWYgKCFwb3JpZ2luKQorCQkJY29udGludWU7CisJCWlmIChwYXNzX2JsYW1lX3RvX3BhcmVudChzYiwgb3JpZ2luLCBwb3JpZ2luKSkKKwkJCWdvdG8gZmluaXNoOworCX0KKworCS8qCisJICogT3B0aW9uYWxseSBmaW5kIG1vdmVzIGluIHBhcmVudHMnIGZpbGVzLgorCSAqLworCWlmIChvcHQgJiBQSUNLQVhFX0JMQU1FX01PVkUpCisJCWZvciAoaSA9IDAsIHBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBpIDwgTUFYUEFSRU5UICYmIHBhcmVudDsKKwkJICAgICBwYXJlbnQgPSBwYXJlbnQtPm5leHQsIGkrKykgeworCQkJc3RydWN0IG9yaWdpbiAqcG9yaWdpbiA9IHBhcmVudF9vcmlnaW5baV07CisJCQlpZiAoIXBvcmlnaW4pCisJCQkJY29udGludWU7CisJCQlpZiAoZmluZF9tb3ZlX2luX3BhcmVudChzYiwgb3JpZ2luLCBwb3JpZ2luKSkKKwkJCQlnb3RvIGZpbmlzaDsKKwkJfQorCisJLyoKKwkgKiBPcHRpb25hbGx5IGZpbmQgY29waWVzIGZyb20gcGFyZW50cycgZmlsZXMuCisJICovCisJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWSkKKwkJZm9yIChpID0gMCwgcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIGkgPCBNQVhQQVJFTlQgJiYgcGFyZW50OworCQkgICAgIHBhcmVudCA9IHBhcmVudC0+bmV4dCwgaSsrKSB7CisJCQlzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luID0gcGFyZW50X29yaWdpbltpXTsKKwkJCWlmIChmaW5kX2NvcHlfaW5fcGFyZW50KHNiLCBvcmlnaW4sIHBhcmVudC0+aXRlbSwKKwkJCQkJCXBvcmlnaW4sIG9wdCkpCisJCQkJZ290byBmaW5pc2g7CisJCX0KKworIGZpbmlzaDoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUEFSRU5UOyBpKyspCisJCW9yaWdpbl9kZWNyZWYocGFyZW50X29yaWdpbltpXSk7Cit9CisKKy8qCisgKiBJbmZvcm1hdGlvbiBvbiBjb21taXRzLCB1c2VkIGZvciBvdXRwdXQuCisgKi8KK3N0cnVjdCBjb21taXRfaW5mbworeworCWNvbnN0IGNoYXIgKmF1dGhvcjsKKwljb25zdCBjaGFyICphdXRob3JfbWFpbDsKKwl1bnNpZ25lZCBsb25nIGF1dGhvcl90aW1lOworCWNvbnN0IGNoYXIgKmF1dGhvcl90ejsKKworCS8qIGZpbGxlZCBvbmx5IHdoZW4gYXNrZWQgZm9yIGRldGFpbHMgKi8KKwljb25zdCBjaGFyICpjb21taXR0ZXI7CisJY29uc3QgY2hhciAqY29tbWl0dGVyX21haWw7CisJdW5zaWduZWQgbG9uZyBjb21taXR0ZXJfdGltZTsKKwljb25zdCBjaGFyICpjb21taXR0ZXJfdHo7CisKKwljb25zdCBjaGFyICpzdW1tYXJ5OworfTsKKworLyoKKyAqIFBhcnNlIGF1dGhvci9jb21taXR0ZXIgbGluZSBpbiB0aGUgY29tbWl0IG9iamVjdCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZ2V0X2FjX2xpbmUoY29uc3QgY2hhciAqaW5idWYsIGNvbnN0IGNoYXIgKndoYXQsCisJCQlpbnQgYnVmc3osIGNoYXIgKnBlcnNvbiwgY29uc3QgY2hhciAqKm1haWwsCisJCQl1bnNpZ25lZCBsb25nICp0aW1lLCBjb25zdCBjaGFyICoqdHopCit7CisJaW50IGxlbiwgdHpsZW4sIG1haWxsZW47CisJY2hhciAqdG1wLCAqZW5kcCwgKnRpbWVwb3M7CisKKwl0bXAgPSBzdHJzdHIoaW5idWYsIHdoYXQpOworCWlmICghdG1wKQorCQlnb3RvIGVycm9yX291dDsKKwl0bXAgKz0gc3RybGVuKHdoYXQpOworCWVuZHAgPSBzdHJjaHIodG1wLCAnXG4nKTsKKwlpZiAoIWVuZHApCisJCWxlbiA9IHN0cmxlbih0bXApOworCWVsc2UKKwkJbGVuID0gZW5kcCAtIHRtcDsKKwlpZiAoYnVmc3ogPD0gbGVuKSB7CisJZXJyb3Jfb3V0OgorCQkvKiBVZ2ggKi8KKwkJKm1haWwgPSAqdHogPSAiKHVua25vd24pIjsKKwkJKnRpbWUgPSAwOworCQlyZXR1cm47CisJfQorCW1lbWNweShwZXJzb24sIHRtcCwgbGVuKTsKKworCXRtcCA9IHBlcnNvbjsKKwl0bXAgKz0gbGVuOworCSp0bXAgPSAwOworCXdoaWxlICgqdG1wICE9ICcgJykKKwkJdG1wLS07CisJKnR6ID0gdG1wKzE7CisJdHpsZW4gPSAocGVyc29uK2xlbiktKHRtcCsxKTsKKworCSp0bXAgPSAwOworCXdoaWxlICgqdG1wICE9ICcgJykKKwkJdG1wLS07CisJKnRpbWUgPSBzdHJ0b3VsKHRtcCwgTlVMTCwgMTApOworCXRpbWVwb3MgPSB0bXA7CisKKwkqdG1wID0gMDsKKwl3aGlsZSAoKnRtcCAhPSAnICcpCisJCXRtcC0tOworCSptYWlsID0gdG1wICsgMTsKKwkqdG1wID0gMDsKKwltYWlsbGVuID0gdGltZXBvcyAtIHRtcDsKKworCWlmICghbWFpbG1hcC5ucikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBtYWlsbWFwIGV4cGFuc2lvbiBtYXkgbWFrZSB0aGUgbmFtZSBsb25nZXIuCisJICogbWFrZSByb29tIGJ5IHB1c2hpbmcgc3R1ZmYgZG93bi4KKwkgKi8KKwl0bXAgPSBwZXJzb24gKyBidWZzeiAtICh0emxlbiArIDEpOworCW1lbW1vdmUodG1wLCAqdHosIHR6bGVuKTsKKwl0bXBbdHpsZW5dID0gMDsKKwkqdHogPSB0bXA7CisKKwl0bXAgPSB0bXAgLSAobWFpbGxlbiArIDEpOworCW1lbW1vdmUodG1wLCAqbWFpbCwgbWFpbGxlbik7CisJdG1wW21haWxsZW5dID0gMDsKKwkqbWFpbCA9IHRtcDsKKworCS8qCisJICogTm93LCBjb252ZXJ0IGUtbWFpbCB1c2luZyBtYWlsbWFwCisJICovCisJbWFwX2VtYWlsKCZtYWlsbWFwLCB0bXAgKyAxLCBwZXJzb24sIHRtcC1wZXJzb24tMSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jb21taXRfaW5mbyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkgICAgc3RydWN0IGNvbW1pdF9pbmZvICpyZXQsCisJCQkgICAgaW50IGRldGFpbGVkKQoreworCWludCBsZW47CisJY2hhciAqdG1wLCAqZW5kcDsKKwlzdGF0aWMgY2hhciBhdXRob3JfYnVmWzEwMjRdOworCXN0YXRpYyBjaGFyIGNvbW1pdHRlcl9idWZbMTAyNF07CisJc3RhdGljIGNoYXIgc3VtbWFyeV9idWZbMTAyNF07CisKKwkvKgorCSAqIFdlJ3ZlIG9wZXJhdGVkIHdpdGhvdXQgc2F2ZV9jb21taXRfYnVmZmVyLCBzbworCSAqIHdlIG5vdyBuZWVkIHRvIHBvcHVsYXRlIHRoZW0gZm9yIG91dHB1dC4KKwkgKi8KKwlpZiAoIWNvbW1pdC0+YnVmZmVyKSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljb21taXQtPmJ1ZmZlciA9CisJCQlyZWFkX3NoYTFfZmlsZShjb21taXQtPm9iamVjdC5zaGExLCAmdHlwZSwgJnNpemUpOworCX0KKwlyZXQtPmF1dGhvciA9IGF1dGhvcl9idWY7CisJZ2V0X2FjX2xpbmUoY29tbWl0LT5idWZmZXIsICJcbmF1dGhvciAiLAorCQkgICAgc2l6ZW9mKGF1dGhvcl9idWYpLCBhdXRob3JfYnVmLCAmcmV0LT5hdXRob3JfbWFpbCwKKwkJICAgICZyZXQtPmF1dGhvcl90aW1lLCAmcmV0LT5hdXRob3JfdHopOworCisJaWYgKCFkZXRhaWxlZCkKKwkJcmV0dXJuOworCisJcmV0LT5jb21taXR0ZXIgPSBjb21taXR0ZXJfYnVmOworCWdldF9hY19saW5lKGNvbW1pdC0+YnVmZmVyLCAiXG5jb21taXR0ZXIgIiwKKwkJICAgIHNpemVvZihjb21taXR0ZXJfYnVmKSwgY29tbWl0dGVyX2J1ZiwgJnJldC0+Y29tbWl0dGVyX21haWwsCisJCSAgICAmcmV0LT5jb21taXR0ZXJfdGltZSwgJnJldC0+Y29tbWl0dGVyX3R6KTsKKworCXJldC0+c3VtbWFyeSA9IHN1bW1hcnlfYnVmOworCXRtcCA9IHN0cnN0cihjb21taXQtPmJ1ZmZlciwgIlxuXG4iKTsKKwlpZiAoIXRtcCkgeworCWVycm9yX291dDoKKwkJc3ByaW50ZihzdW1tYXJ5X2J1ZiwgIiglcykiLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCXJldHVybjsKKwl9CisJdG1wICs9IDI7CisJZW5kcCA9IHN0cmNocih0bXAsICdcbicpOworCWlmICghZW5kcCkKKwkJZW5kcCA9IHRtcCArIHN0cmxlbih0bXApOworCWxlbiA9IGVuZHAgLSB0bXA7CisJaWYgKGxlbiA+PSBzaXplb2Yoc3VtbWFyeV9idWYpIHx8IGxlbiA9PSAwKQorCQlnb3RvIGVycm9yX291dDsKKwltZW1jcHkoc3VtbWFyeV9idWYsIHRtcCwgbGVuKTsKKwlzdW1tYXJ5X2J1ZltsZW5dID0gMDsKK30KKworLyoKKyAqIFRvIGFsbG93IExGIGFuZCBvdGhlciBub25wb3J0YWJsZSBjaGFyYWN0ZXJzIGluIHBhdGhuYW1lcywKKyAqIHRoZXkgYXJlIGMtc3R5bGUgcXVvdGVkIGFzIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfZmlsZW5hbWVfaW5mbyhjb25zdCBjaGFyICpwYXRoKQoreworCXByaW50ZigiZmlsZW5hbWUgIik7CisJd3JpdGVfbmFtZV9xdW90ZWQoTlVMTCwgMCwgcGF0aCwgMSwgc3Rkb3V0KTsKKwlwdXRjaGFyKCdcbicpOworfQorCisvKgorICogVGhlIGJsYW1lX2VudHJ5IGlzIGZvdW5kIHRvIGJlIGd1aWx0eSBmb3IgdGhlIHJhbmdlLiAgTWFyayBpdAorICogYXMgc3VjaCwgYW5kIHNob3cgaXQgaW4gaW5jcmVtZW50YWwgb3V0cHV0LgorICovCitzdGF0aWMgdm9pZCBmb3VuZF9ndWlsdHlfZW50cnkoc3RydWN0IGJsYW1lX2VudHJ5ICplbnQpCit7CisJaWYgKGVudC0+Z3VpbHR5KQorCQlyZXR1cm47CisJZW50LT5ndWlsdHkgPSAxOworCWlmIChpbmNyZW1lbnRhbCkgeworCQlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gZW50LT5zdXNwZWN0OworCisJCXByaW50ZigiJXMgJWQgJWQgJWRcbiIsCisJCSAgICAgICBzaGExX3RvX2hleChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5zaGExKSwKKwkJICAgICAgIGVudC0+c19sbm8gKyAxLCBlbnQtPmxubyArIDEsIGVudC0+bnVtX2xpbmVzKTsKKwkJaWYgKCEoc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgJiBNRVRBSU5GT19TSE9XTikpIHsKKwkJCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwkJCXN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IE1FVEFJTkZPX1NIT1dOOworCQkJZ2V0X2NvbW1pdF9pbmZvKHN1c3BlY3QtPmNvbW1pdCwgJmNpLCAxKTsKKwkJCXByaW50ZigiYXV0aG9yICVzXG4iLCBjaS5hdXRob3IpOworCQkJcHJpbnRmKCJhdXRob3ItbWFpbCAlc1xuIiwgY2kuYXV0aG9yX21haWwpOworCQkJcHJpbnRmKCJhdXRob3ItdGltZSAlbHVcbiIsIGNpLmF1dGhvcl90aW1lKTsKKwkJCXByaW50ZigiYXV0aG9yLXR6ICVzXG4iLCBjaS5hdXRob3JfdHopOworCQkJcHJpbnRmKCJjb21taXR0ZXIgJXNcbiIsIGNpLmNvbW1pdHRlcik7CisJCQlwcmludGYoImNvbW1pdHRlci1tYWlsICVzXG4iLCBjaS5jb21taXR0ZXJfbWFpbCk7CisJCQlwcmludGYoImNvbW1pdHRlci10aW1lICVsdVxuIiwgY2kuY29tbWl0dGVyX3RpbWUpOworCQkJcHJpbnRmKCJjb21taXR0ZXItdHogJXNcbiIsIGNpLmNvbW1pdHRlcl90eik7CisJCQlwcmludGYoInN1bW1hcnkgJXNcbiIsIGNpLnN1bW1hcnkpOworCQkJaWYgKHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQlwcmludGYoImJvdW5kYXJ5XG4iKTsKKwkJfQorCQl3cml0ZV9maWxlbmFtZV9pbmZvKHN1c3BlY3QtPnBhdGgpOworCX0KK30KKworLyoKKyAqIFRoZSBtYWluIGxvb3AgLS0gd2hpbGUgdGhlIHNjb3JlYm9hcmQgaGFzIGxpbmVzIHdob3NlIHRydWUgb3JpZ2luCisgKiBpcyBzdGlsbCB1bmtub3duLCBwaWNrIG9uZSBibGFtZV9lbnRyeSwgYW5kIGFsbG93IGl0cyBjdXJyZW50CisgKiBzdXNwZWN0IHRvIHBhc3MgYmxhbWVzIHRvIGl0cyBwYXJlbnRzLgorICovCitzdGF0aWMgdm9pZCBhc3NpZ25fYmxhbWUoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBvcHQpCit7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGJsYW1lX2VudHJ5ICplbnQ7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IE5VTEw7CisKKwkJLyogZmluZCBvbmUgc3VzcGVjdCB0byBicmVhayBkb3duICovCisJCWZvciAoZW50ID0gc2ItPmVudDsgIXN1c3BlY3QgJiYgZW50OyBlbnQgPSBlbnQtPm5leHQpCisJCQlpZiAoIWVudC0+Z3VpbHR5KQorCQkJCXN1c3BlY3QgPSBlbnQtPnN1c3BlY3Q7CisJCWlmICghc3VzcGVjdCkKKwkJCXJldHVybjsgLyogYWxsIGRvbmUgKi8KKworCQkvKgorCQkgKiBXZSB3aWxsIHVzZSB0aGlzIHN1c3BlY3QgbGF0ZXIgaW4gdGhlIGxvb3AsCisJCSAqIHNvIGhvbGQgb250byBpdCBpbiB0aGUgbWVhbnRpbWUuCisJCSAqLworCQlvcmlnaW5faW5jcmVmKHN1c3BlY3QpOworCQljb21taXQgPSBzdXNwZWN0LT5jb21taXQ7CisJCWlmICghY29tbWl0LT5vYmplY3QucGFyc2VkKQorCQkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgJiYKKwkJICAgICEocmV2cy0+bWF4X2FnZSAhPSAtMSAmJiBjb21taXQtPmRhdGUgPCByZXZzLT5tYXhfYWdlKSkKKwkJCXBhc3NfYmxhbWUoc2IsIHN1c3BlY3QsIG9wdCk7CisJCWVsc2UgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCWlmIChjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCQkJbWFya19wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0KTsKKwkJfQorCQkvKiB0cmVhdCByb290IGNvbW1pdCBhcyBib3VuZGFyeSAqLworCQlpZiAoIWNvbW1pdC0+cGFyZW50cyAmJiAhc2hvd19yb290KQorCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKworCQkvKiBUYWtlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgcmVtYWluaW5nIGVudHJpZXMgKi8KKwkJZm9yIChlbnQgPSBzYi0+ZW50OyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKKwkJCWlmIChzYW1lX3N1c3BlY3QoZW50LT5zdXNwZWN0LCBzdXNwZWN0KSkKKwkJCQlmb3VuZF9ndWlsdHlfZW50cnkoZW50KTsKKwkJb3JpZ2luX2RlY3JlZihzdXNwZWN0KTsKKworCQlpZiAoREVCVUcpIC8qIHNhbml0eSAqLworCQkJc2FuaXR5X2NoZWNrX3JlZmNudChzYik7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZm9ybWF0X3RpbWUodW5zaWduZWQgbG9uZyB0aW1lLCBjb25zdCBjaGFyICp0el9zdHIsCisJCQkgICAgICAgaW50IHNob3dfcmF3X3RpbWUpCit7CisJc3RhdGljIGNoYXIgdGltZV9idWZbMTI4XTsKKwl0aW1lX3QgdCA9IHRpbWU7CisJaW50IG1pbnV0ZXMsIHR6OworCXN0cnVjdCB0bSAqdG07CisKKwlpZiAoc2hvd19yYXdfdGltZSkgeworCQlzcHJpbnRmKHRpbWVfYnVmLCAiJWx1ICVzIiwgdGltZSwgdHpfc3RyKTsKKwkJcmV0dXJuIHRpbWVfYnVmOworCX0KKworCXR6ID0gYXRvaSh0el9zdHIpOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtdHogOiB0ejsKKwltaW51dGVzID0gKG1pbnV0ZXMgLyAxMDApKjYwICsgKG1pbnV0ZXMgJSAxMDApOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtbWludXRlcyA6IG1pbnV0ZXM7CisJdCA9IHRpbWUgKyBtaW51dGVzICogNjA7CisJdG0gPSBnbXRpbWUoJnQpOworCisJc3RyZnRpbWUodGltZV9idWYsIHNpemVvZih0aW1lX2J1ZiksICIlWS0lbS0lZCAlSDolTTolUyAiLCB0bSk7CisJc3RyY2F0KHRpbWVfYnVmLCB0el9zdHIpOworCXJldHVybiB0aW1lX2J1ZjsKK30KKworI2RlZmluZSBPVVRQVVRfQU5OT1RBVEVfQ09NUEFUCTAwMQorI2RlZmluZSBPVVRQVVRfTE9OR19PQkpFQ1RfTkFNRQkwMDIKKyNkZWZpbmUgT1VUUFVUX1JBV19USU1FU1RBTVAJMDA0CisjZGVmaW5lIE9VVFBVVF9QT1JDRUxBSU4JMDEwCisjZGVmaW5lIE9VVFBVVF9TSE9XX05BTUUJMDIwCisjZGVmaW5lIE9VVFBVVF9TSE9XX05VTUJFUgkwNDAKKyNkZWZpbmUgT1VUUFVUX1NIT1dfU0NPUkUgICAgICAwMTAwCisjZGVmaW5lIE9VVFBVVF9OT19BVVRIT1IgICAgICAgMDIwMAorCitzdGF0aWMgdm9pZCBlbWl0X3BvcmNlbGFpbihzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCBibGFtZV9lbnRyeSAqZW50KQoreworCWludCBjbnQ7CisJY29uc3QgY2hhciAqY3A7CisJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKwljaGFyIGhleFs0MV07CisKKwlzdHJjcHkoaGV4LCBzaGExX3RvX2hleChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5zaGExKSk7CisJcHJpbnRmKCIlcyVjJWQgJWQgJWRcbiIsCisJICAgICAgIGhleCwKKwkgICAgICAgZW50LT5ndWlsdHkgPyAnICcgOiAnKicsIC8vIHB1cmVseSBmb3IgZGVidWdnaW5nCisJICAgICAgIGVudC0+c19sbm8gKyAxLAorCSAgICAgICBlbnQtPmxubyArIDEsCisJICAgICAgIGVudC0+bnVtX2xpbmVzKTsKKwlpZiAoIShzdXNwZWN0LT5jb21taXQtPm9iamVjdC5mbGFncyAmIE1FVEFJTkZPX1NIT1dOKSkgeworCQlzdHJ1Y3QgY29tbWl0X2luZm8gY2k7CisJCXN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IE1FVEFJTkZPX1NIT1dOOworCQlnZXRfY29tbWl0X2luZm8oc3VzcGVjdC0+Y29tbWl0LCAmY2ksIDEpOworCQlwcmludGYoImF1dGhvciAlc1xuIiwgY2kuYXV0aG9yKTsKKwkJcHJpbnRmKCJhdXRob3ItbWFpbCAlc1xuIiwgY2kuYXV0aG9yX21haWwpOworCQlwcmludGYoImF1dGhvci10aW1lICVsdVxuIiwgY2kuYXV0aG9yX3RpbWUpOworCQlwcmludGYoImF1dGhvci10eiAlc1xuIiwgY2kuYXV0aG9yX3R6KTsKKwkJcHJpbnRmKCJjb21taXR0ZXIgJXNcbiIsIGNpLmNvbW1pdHRlcik7CisJCXByaW50ZigiY29tbWl0dGVyLW1haWwgJXNcbiIsIGNpLmNvbW1pdHRlcl9tYWlsKTsKKwkJcHJpbnRmKCJjb21taXR0ZXItdGltZSAlbHVcbiIsIGNpLmNvbW1pdHRlcl90aW1lKTsKKwkJcHJpbnRmKCJjb21taXR0ZXItdHogJXNcbiIsIGNpLmNvbW1pdHRlcl90eik7CisJCXdyaXRlX2ZpbGVuYW1lX2luZm8oc3VzcGVjdC0+cGF0aCk7CisJCXByaW50Zigic3VtbWFyeSAlc1xuIiwgY2kuc3VtbWFyeSk7CisJCWlmIChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQlwcmludGYoImJvdW5kYXJ5XG4iKTsKKwl9CisJZWxzZSBpZiAoc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgJiBNT1JFX1RIQU5fT05FX1BBVEgpCisJCXdyaXRlX2ZpbGVuYW1lX2luZm8oc3VzcGVjdC0+cGF0aCk7CisKKwljcCA9IG50aF9saW5lKHNiLCBlbnQtPmxubyk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBlbnQtPm51bV9saW5lczsgY250KyspIHsKKwkJY2hhciBjaDsKKwkJaWYgKGNudCkKKwkJCXByaW50ZigiJXMgJWQgJWRcbiIsIGhleCwKKwkJCSAgICAgICBlbnQtPnNfbG5vICsgMSArIGNudCwKKwkJCSAgICAgICBlbnQtPmxubyArIDEgKyBjbnQpOworCQlwdXRjaGFyKCdcdCcpOworCQlkbyB7CisJCQljaCA9ICpjcCsrOworCQkJcHV0Y2hhcihjaCk7CisJCX0gd2hpbGUgKGNoICE9ICdcbicgJiYKKwkJCSBjcCA8IHNiLT5maW5hbF9idWYgKyBzYi0+ZmluYWxfYnVmX3NpemUpOworCX0KK30KKworc3RhdGljIHZvaWQgZW1pdF9vdGhlcihzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCBibGFtZV9lbnRyeSAqZW50LCBpbnQgb3B0KQoreworCWludCBjbnQ7CisJY29uc3QgY2hhciAqY3A7CisJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKwlzdHJ1Y3QgY29tbWl0X2luZm8gY2k7CisJY2hhciBoZXhbNDFdOworCWludCBzaG93X3Jhd190aW1lID0gISEob3B0ICYgT1VUUFVUX1JBV19USU1FU1RBTVApOworCisJZ2V0X2NvbW1pdF9pbmZvKHN1c3BlY3QtPmNvbW1pdCwgJmNpLCAxKTsKKwlzdHJjcHkoaGV4LCBzaGExX3RvX2hleChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5zaGExKSk7CisKKwljcCA9IG50aF9saW5lKHNiLCBlbnQtPmxubyk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBlbnQtPm51bV9saW5lczsgY250KyspIHsKKwkJY2hhciBjaDsKKwkJaW50IGxlbmd0aCA9IChvcHQgJiBPVVRQVVRfTE9OR19PQkpFQ1RfTkFNRSkgPyA0MCA6IDg7CisKKwkJaWYgKHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJaWYgKGJsYW5rX2JvdW5kYXJ5KQorCQkJCW1lbXNldChoZXgsICcgJywgbGVuZ3RoKTsKKwkJCWVsc2UgaWYgKCFjbWRfaXNfYW5ub3RhdGUpIHsKKwkJCQlsZW5ndGgtLTsKKwkJCQlwdXRjaGFyKCdeJyk7CisJCQl9CisJCX0KKworCQlwcmludGYoIiUuKnMiLCBsZW5ndGgsIGhleCk7CisJCWlmIChvcHQgJiBPVVRQVVRfQU5OT1RBVEVfQ09NUEFUKQorCQkJcHJpbnRmKCJcdCglMTBzXHQlMTBzXHQlZCkiLCBjaS5hdXRob3IsCisJCQkgICAgICAgZm9ybWF0X3RpbWUoY2kuYXV0aG9yX3RpbWUsIGNpLmF1dGhvcl90eiwKKwkJCQkJICAgc2hvd19yYXdfdGltZSksCisJCQkgICAgICAgZW50LT5sbm8gKyAxICsgY250KTsKKwkJZWxzZSB7CisJCQlpZiAob3B0ICYgT1VUUFVUX1NIT1dfU0NPUkUpCisJCQkJcHJpbnRmKCIgJSpkICUwMmQiLAorCQkJCSAgICAgICBtYXhfc2NvcmVfZGlnaXRzLCBlbnQtPnNjb3JlLAorCQkJCSAgICAgICBlbnQtPnN1c3BlY3QtPnJlZmNudCk7CisJCQlpZiAob3B0ICYgT1VUUFVUX1NIT1dfTkFNRSkKKwkJCQlwcmludGYoIiAlLSouKnMiLCBsb25nZXN0X2ZpbGUsIGxvbmdlc3RfZmlsZSwKKwkJCQkgICAgICAgc3VzcGVjdC0+cGF0aCk7CisJCQlpZiAob3B0ICYgT1VUUFVUX1NIT1dfTlVNQkVSKQorCQkJCXByaW50ZigiICUqZCIsIG1heF9vcmlnX2RpZ2l0cywKKwkJCQkgICAgICAgZW50LT5zX2xubyArIDEgKyBjbnQpOworCisJCQlpZiAoIShvcHQgJiBPVVRQVVRfTk9fQVVUSE9SKSkKKwkJCQlwcmludGYoIiAoJS0qLipzICUxMHMiLAorCQkJCSAgICAgICBsb25nZXN0X2F1dGhvciwgbG9uZ2VzdF9hdXRob3IsCisJCQkJICAgICAgIGNpLmF1dGhvciwKKwkJCQkgICAgICAgZm9ybWF0X3RpbWUoY2kuYXV0aG9yX3RpbWUsCisJCQkJCQkgICBjaS5hdXRob3JfdHosCisJCQkJCQkgICBzaG93X3Jhd190aW1lKSk7CisJCQlwcmludGYoIiAlKmQpICIsCisJCQkgICAgICAgbWF4X2RpZ2l0cywgZW50LT5sbm8gKyAxICsgY250KTsKKwkJfQorCQlkbyB7CisJCQljaCA9ICpjcCsrOworCQkJcHV0Y2hhcihjaCk7CisJCX0gd2hpbGUgKGNoICE9ICdcbicgJiYKKwkJCSBjcCA8IHNiLT5maW5hbF9idWYgKyBzYi0+ZmluYWxfYnVmX3NpemUpOworCX0KK30KKworc3RhdGljIHZvaWQgb3V0cHV0KHN0cnVjdCBzY29yZWJvYXJkICpzYiwgaW50IG9wdGlvbikKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudDsKKworCWlmIChvcHRpb24gJiBPVVRQVVRfUE9SQ0VMQUlOKSB7CisJCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCXN0cnVjdCBibGFtZV9lbnRyeSAqb3RoOworCQkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKwkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHN1c3BlY3QtPmNvbW1pdDsKKwkJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIE1PUkVfVEhBTl9PTkVfUEFUSCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAob3RoID0gZW50LT5uZXh0OyBvdGg7IG90aCA9IG90aC0+bmV4dCkgeworCQkJCWlmICgob3RoLT5zdXNwZWN0LT5jb21taXQgIT0gY29tbWl0KSB8fAorCQkJCSAgICAhc3RyY21wKG90aC0+c3VzcGVjdC0+cGF0aCwgc3VzcGVjdC0+cGF0aCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IE1PUkVfVEhBTl9PTkVfUEFUSDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJaWYgKG9wdGlvbiAmIE9VVFBVVF9QT1JDRUxBSU4pCisJCQllbWl0X3BvcmNlbGFpbihzYiwgZW50KTsKKwkJZWxzZSB7CisJCQllbWl0X290aGVyKHNiLCBlbnQsIG9wdGlvbik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUbyBhbGxvdyBxdWljayBhY2Nlc3MgdG8gdGhlIGNvbnRlbnRzIG9mIG50aCBsaW5lIGluIHRoZQorICogZmluYWwgaW1hZ2UsIHByZXBhcmUgYW4gaW5kZXggaW4gdGhlIHNjb3JlYm9hcmQuCisgKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9saW5lcyhzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IpCit7CisJY29uc3QgY2hhciAqYnVmID0gc2ItPmZpbmFsX2J1ZjsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IHNiLT5maW5hbF9idWZfc2l6ZTsKKwlpbnQgbnVtID0gMCwgaW5jb21wbGV0ZSA9IDAsIGJvbCA9IDE7CisKKwlpZiAobGVuICYmIGJ1ZltsZW4tMV0gIT0gJ1xuJykKKwkJaW5jb21wbGV0ZSsrOyAvKiBpbmNvbXBsZXRlIGxpbmUgYXQgdGhlIGVuZCAqLworCXdoaWxlIChsZW4tLSkgeworCQlpZiAoYm9sKSB7CisJCQlzYi0+bGluZW5vID0geHJlYWxsb2Moc2ItPmxpbmVubywKKwkJCQkJICAgICAgc2l6ZW9mKGludCogKSAqIChudW0gKyAxKSk7CisJCQlzYi0+bGluZW5vW251bV0gPSBidWYgLSBzYi0+ZmluYWxfYnVmOworCQkJYm9sID0gMDsKKwkJfQorCQlpZiAoKmJ1ZisrID09ICdcbicpIHsKKwkJCW51bSsrOworCQkJYm9sID0gMTsKKwkJfQorCX0KKwlzYi0+bGluZW5vID0geHJlYWxsb2Moc2ItPmxpbmVubywKKwkJCSAgICAgIHNpemVvZihpbnQqICkgKiAobnVtICsgaW5jb21wbGV0ZSArIDEpKTsKKwlzYi0+bGluZW5vW251bSArIGluY29tcGxldGVdID0gYnVmIC0gc2ItPmZpbmFsX2J1ZjsKKwlzYi0+bnVtX2xpbmVzID0gbnVtICsgaW5jb21wbGV0ZTsKKwlyZXR1cm4gc2ItPm51bV9saW5lczsKK30KKworLyoKKyAqIEFkZCBwaG9ueSBncmFmdHMgZm9yIHVzZSB3aXRoIC1TOyB0aGlzIGlzIHByaW1hcmlseSB0bworICogc3VwcG9ydCBnaXQtY3Zzc2VydmVyIHRoYXQgd2FudHMgdG8gZ2l2ZSBhIGxpbmVhciBoaXN0b3J5CisgKiB0byBpdHMgY2xpZW50cy4KKyAqLworc3RhdGljIGludCByZWFkX2FuY2VzdHJ5KGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihncmFmdF9maWxlLCAiciIpOworCWNoYXIgYnVmWzEwMjRdOworCWlmICghZnApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCS8qIFRoZSBmb3JtYXQgaXMganVzdCAiQ29tbWl0IFBhcmVudDEgUGFyZW50MiAuLi5cbiIgKi8KKwkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCQlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCA9IHJlYWRfZ3JhZnRfbGluZShidWYsIGxlbik7CisJCWlmIChncmFmdCkKKwkJCXJlZ2lzdGVyX2NvbW1pdF9ncmFmdChncmFmdCwgMCk7CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIb3cgbWFueSBjb2x1bW5zIGRvIHdlIG5lZWQgdG8gc2hvdyBsaW5lIG51bWJlcnMgaW4gZGVjaW1hbD8KKyAqLworc3RhdGljIGludCBsaW5lbm9fd2lkdGgoaW50IGxpbmVzKQoreworICAgICAgICBpbnQgaSwgd2lkdGg7CisKKyAgICAgICAgZm9yICh3aWR0aCA9IDEsIGkgPSAxMDsgaSA8PSBsaW5lcyArIDE7IHdpZHRoKyspCisgICAgICAgICAgICAgICAgaSAqPSAxMDsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworfQorCisvKgorICogSG93IG1hbnkgY29sdW1ucyBkbyB3ZSBuZWVkIHRvIHNob3cgbGluZSBudW1iZXJzLCBhdXRob3JzLAorICogYW5kIGZpbGVuYW1lcz8KKyAqLworc3RhdGljIHZvaWQgZmluZF9hbGlnbm1lbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBpbnQgKm9wdGlvbikKK3sKKwlpbnQgbG9uZ2VzdF9zcmNfbGluZXMgPSAwOworCWludCBsb25nZXN0X2RzdF9saW5lcyA9IDA7CisJdW5zaWduZWQgbGFyZ2VzdF9zY29yZSA9IDA7CisJc3RydWN0IGJsYW1lX2VudHJ5ICplOworCisJZm9yIChlID0gc2ItPmVudDsgZTsgZSA9IGUtPm5leHQpIHsKKwkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGUtPnN1c3BlY3Q7CisJCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwkJaW50IG51bTsKKworCQlpZiAoc3RyY21wKHN1c3BlY3QtPnBhdGgsIHNiLT5wYXRoKSkKKwkJCSpvcHRpb24gfD0gT1VUUFVUX1NIT1dfTkFNRTsKKwkJbnVtID0gc3RybGVuKHN1c3BlY3QtPnBhdGgpOworCQlpZiAobG9uZ2VzdF9maWxlIDwgbnVtKQorCQkJbG9uZ2VzdF9maWxlID0gbnVtOworCQlpZiAoIShzdXNwZWN0LT5jb21taXQtPm9iamVjdC5mbGFncyAmIE1FVEFJTkZPX1NIT1dOKSkgeworCQkJc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gTUVUQUlORk9fU0hPV047CisJCQlnZXRfY29tbWl0X2luZm8oc3VzcGVjdC0+Y29tbWl0LCAmY2ksIDEpOworCQkJbnVtID0gc3RybGVuKGNpLmF1dGhvcik7CisJCQlpZiAobG9uZ2VzdF9hdXRob3IgPCBudW0pCisJCQkJbG9uZ2VzdF9hdXRob3IgPSBudW07CisJCX0KKwkJbnVtID0gZS0+c19sbm8gKyBlLT5udW1fbGluZXM7CisJCWlmIChsb25nZXN0X3NyY19saW5lcyA8IG51bSkKKwkJCWxvbmdlc3Rfc3JjX2xpbmVzID0gbnVtOworCQludW0gPSBlLT5sbm8gKyBlLT5udW1fbGluZXM7CisJCWlmIChsb25nZXN0X2RzdF9saW5lcyA8IG51bSkKKwkJCWxvbmdlc3RfZHN0X2xpbmVzID0gbnVtOworCQlpZiAobGFyZ2VzdF9zY29yZSA8IGVudF9zY29yZShzYiwgZSkpCisJCQlsYXJnZXN0X3Njb3JlID0gZW50X3Njb3JlKHNiLCBlKTsKKwl9CisJbWF4X29yaWdfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxvbmdlc3Rfc3JjX2xpbmVzKTsKKwltYXhfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxvbmdlc3RfZHN0X2xpbmVzKTsKKwltYXhfc2NvcmVfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxhcmdlc3Rfc2NvcmUpOworfQorCisvKgorICogRm9yIGRlYnVnZ2luZyAtLSBvcmlnaW4gaXMgcmVmY291bnRlZCwgYW5kIHRoaXMgYXNzZXJ0cyB0aGF0CisgKiB3ZSBkbyBub3QgdW5kZXJmbG93LgorICovCitzdGF0aWMgdm9pZCBzYW5pdHlfY2hlY2tfcmVmY250KHN0cnVjdCBzY29yZWJvYXJkICpzYikKK3sKKwlpbnQgYmFhID0gMDsKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudDsKKworCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJLyogTm9ib2R5IHNob3VsZCBoYXZlIHplcm8gb3IgbmVnYXRpdmUgcmVmY250ICovCisJCWlmIChlbnQtPnN1c3BlY3QtPnJlZmNudCA8PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGluICVzIGhhcyBuZWdhdGl2ZSByZWZjbnQgJWRcbiIsCisJCQkJZW50LT5zdXNwZWN0LT5wYXRoLAorCQkJCXNoYTFfdG9faGV4KGVudC0+c3VzcGVjdC0+Y29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQpOworCQkJYmFhID0gMTsKKwkJfQorCX0KKwlmb3IgKGVudCA9IHNiLT5lbnQ7IGVudDsgZW50ID0gZW50LT5uZXh0KSB7CisJCS8qIE1hcmsgdGhlIG9uZXMgdGhhdCBoYXZlbid0IGJlZW4gY2hlY2tlZCAqLworCQlpZiAoMCA8IGVudC0+c3VzcGVjdC0+cmVmY250KQorCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQgPSAtZW50LT5zdXNwZWN0LT5yZWZjbnQ7CisJfQorCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJLyoKKwkJICogLi4uIHRoZW4gcGljayBlYWNoIGFuZCBzZWUgaWYgdGhleSBoYXZlIHRoZSB0aGUKKwkJICogY29ycmVjdCByZWZjbnQuCisJCSAqLworCQlpbnQgZm91bmQ7CisJCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKwkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKworCQlpZiAoMCA8IHN1c3BlY3QtPnJlZmNudCkKKwkJCWNvbnRpbnVlOworCQlzdXNwZWN0LT5yZWZjbnQgPSAtc3VzcGVjdC0+cmVmY250OyAvKiBVbm1hcmsgKi8KKwkJZm9yIChmb3VuZCA9IDAsIGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQkJaWYgKGUtPnN1c3BlY3QgIT0gc3VzcGVjdCkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kKys7CisJCX0KKwkJaWYgKHN1c3BlY3QtPnJlZmNudCAhPSBmb3VuZCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlcyBpbiAlcyBoYXMgcmVmY250ICVkLCBub3QgJWRcbiIsCisJCQkJZW50LT5zdXNwZWN0LT5wYXRoLAorCQkJCXNoYTFfdG9faGV4KGVudC0+c3VzcGVjdC0+Y29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQsIGZvdW5kKTsKKwkJCWJhYSA9IDI7CisJCX0KKwl9CisJaWYgKGJhYSkgeworCQlpbnQgb3B0ID0gMDE2MDsKKwkJZmluZF9hbGlnbm1lbnQoc2IsICZvcHQpOworCQlvdXRwdXQoc2IsIG9wdCk7CisJCWRpZSgiQmFhICVkISIsIGJhYSk7CisJfQorfQorCisvKgorICogVXNlZCBmb3IgdGhlIGNvbW1hbmQgbGluZSBwYXJzaW5nOyBjaGVjayBpZiB0aGUgcGF0aCBleGlzdHMKKyAqIGluIHRoZSB3b3JraW5nIHRyZWUuCisgKi8KK3N0YXRpYyBpbnQgaGFzX3BhdGhfaW5fd29ya190cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJcmV0dXJuICFsc3RhdChwYXRoLCAmc3QpOworfQorCitzdGF0aWMgdW5zaWduZWQgcGFyc2Vfc2NvcmUoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHNjb3JlID0gc3RydG91bChhcmcsICZlbmQsIDEwKTsKKwlpZiAoKmVuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNjb3JlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWRkX3ByZWZpeChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKCFwcmVmaXggfHwgIXByZWZpeFswXSkKKwkJcmV0dXJuIHBhdGg7CisJcmV0dXJuIHByZWZpeF9wYXRoKHByZWZpeCwgc3RybGVuKHByZWZpeCksIHBhdGgpOworfQorCisvKgorICogUGFyc2luZyBvZiAoY29tbWEgc2VwYXJhdGVkKSBvbmUgaXRlbSBpbiB0aGUgLUwgb3B0aW9uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9sb2MoY29uc3QgY2hhciAqc3BlYywKKwkJCSAgICAgc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBsb25nIGxubywKKwkJCSAgICAgbG9uZyBiZWdpbiwgbG9uZyAqcmV0KQoreworCWNoYXIgKnRlcm07CisJY29uc3QgY2hhciAqbGluZTsKKwlsb25nIG51bTsKKwlpbnQgcmVnX2Vycm9yOworCXJlZ2V4X3QgcmVnZXhwOworCXJlZ21hdGNoX3QgbWF0Y2hbMV07CisKKwkvKiBBbGxvdyAiLUwgPHNvbWV0aGluZz4sKzIwIiB0byBtZWFuIHN0YXJ0aW5nIGF0IDxzb21ldGhpbmc+CisJICogZm9yIDIwIGxpbmVzLCBvciAiLUwgPHNvbWV0aGluZz4sLTUiIGZvciA1IGxpbmVzIGVuZGluZyBhdAorCSAqIDxzb21ldGhpbmc+LgorCSAqLworCWlmICgxIDwgYmVnaW4gJiYgKHNwZWNbMF0gPT0gJysnIHx8IHNwZWNbMF0gPT0gJy0nKSkgeworCQludW0gPSBzdHJ0b2woc3BlYyArIDEsICZ0ZXJtLCAxMCk7CisJCWlmICh0ZXJtICE9IHNwZWMgKyAxKSB7CisJCQlpZiAoc3BlY1swXSA9PSAnLScpCisJCQkJbnVtID0gMCAtIG51bTsKKwkJCWlmICgwIDwgbnVtKQorCQkJCSpyZXQgPSBiZWdpbiArIG51bSAtIDI7CisJCQllbHNlIGlmICghbnVtKQorCQkJCSpyZXQgPSBiZWdpbjsKKwkJCWVsc2UKKwkJCQkqcmV0ID0gYmVnaW4gKyBudW07CisJCQlyZXR1cm4gdGVybTsKKwkJfQorCQlyZXR1cm4gc3BlYzsKKwl9CisJbnVtID0gc3RydG9sKHNwZWMsICZ0ZXJtLCAxMCk7CisJaWYgKHRlcm0gIT0gc3BlYykgeworCQkqcmV0ID0gbnVtOworCQlyZXR1cm4gdGVybTsKKwl9CisJaWYgKHNwZWNbMF0gIT0gJy8nKQorCQlyZXR1cm4gc3BlYzsKKworCS8qIGl0IGNvdWxkIGJlIGEgcmVnZXhwIG9mIGZvcm0gLy4uLi8gKi8KKwlmb3IgKHRlcm0gPSAoY2hhciopIHNwZWMgKyAxOyAqdGVybSAmJiAqdGVybSAhPSAnLyc7IHRlcm0rKykgeworCQlpZiAoKnRlcm0gPT0gJ1xcJykKKwkJCXRlcm0rKzsKKwl9CisJaWYgKCp0ZXJtICE9ICcvJykKKwkJcmV0dXJuIHNwZWM7CisKKwkvKiB0cnkgW3NwZWMrMSAuLiB0ZXJtLTFdIGFzIHJlZ2V4cCAqLworCSp0ZXJtID0gMDsKKwliZWdpbi0tOyAvKiBpbnB1dCBpcyBpbiBodW1hbiB0ZXJtcyAqLworCWxpbmUgPSBudGhfbGluZShzYiwgYmVnaW4pOworCisJaWYgKCEocmVnX2Vycm9yID0gcmVnY29tcCgmcmVnZXhwLCBzcGVjICsgMSwgUkVHX05FV0xJTkUpKSAmJgorCSAgICAhKHJlZ19lcnJvciA9IHJlZ2V4ZWMoJnJlZ2V4cCwgbGluZSwgMSwgbWF0Y2gsIDApKSkgeworCQljb25zdCBjaGFyICpjcCA9IGxpbmUgKyBtYXRjaFswXS5ybV9zbzsKKwkJY29uc3QgY2hhciAqbmxpbmU7CisKKwkJd2hpbGUgKGJlZ2luKysgPCBsbm8pIHsKKwkJCW5saW5lID0gbnRoX2xpbmUoc2IsIGJlZ2luKTsKKwkJCWlmIChsaW5lIDw9IGNwICYmIGNwIDwgbmxpbmUpCisJCQkJYnJlYWs7CisJCQlsaW5lID0gbmxpbmU7CisJCX0KKwkJKnJldCA9IGJlZ2luOworCQlyZWdmcmVlKCZyZWdleHApOworCQkqdGVybSsrID0gJy8nOworCQlyZXR1cm4gdGVybTsKKwl9CisJZWxzZSB7CisJCWNoYXIgZXJyYnVmWzEwMjRdOworCQlyZWdlcnJvcihyZWdfZXJyb3IsICZyZWdleHAsIGVycmJ1ZiwgMTAyNCk7CisJCWRpZSgiLUwgcGFyYW1ldGVyICclcyc6ICVzIiwgc3BlYyArIDEsIGVycmJ1Zik7CisJfQorfQorCisvKgorICogUGFyc2luZyBvZiAtTCBvcHRpb24KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV9ibGFtZV9yYW5nZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJY29uc3QgY2hhciAqYm90dG9tdG9wLAorCQkJCWxvbmcgbG5vLAorCQkJCWxvbmcgKmJvdHRvbSwgbG9uZyAqdG9wKQoreworCWNvbnN0IGNoYXIgKnRlcm07CisKKwl0ZXJtID0gcGFyc2VfbG9jKGJvdHRvbXRvcCwgc2IsIGxubywgMSwgYm90dG9tKTsKKwlpZiAoKnRlcm0gPT0gJywnKSB7CisJCXRlcm0gPSBwYXJzZV9sb2ModGVybSArIDEsIHNiLCBsbm8sICpib3R0b20gKyAxLCB0b3ApOworCQlpZiAoKnRlcm0pCisJCQl1c2FnZShibGFtZV91c2FnZSk7CisJfQorCWlmICgqdGVybSkKKwkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworfQorCitzdGF0aWMgaW50IGdpdF9ibGFtZV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJibGFtZS5zaG93cm9vdCIpKSB7CisJCXNob3dfcm9vdCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImJsYW1lLmJsYW5rYm91bmRhcnkiKSkgeworCQlibGFua19ib3VuZGFyeSA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpmYWtlX3dvcmtpbmdfdHJlZV9jb21taXQoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY29udGVudHNfZnJvbSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9yaWdpbiAqb3JpZ2luOworCXVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqaWRlbnQ7CisJaW50IGZkOworCXRpbWVfdCBub3c7CisJdW5zaWduZWQgbG9uZyBmaW5fc2l6ZTsKKwlpbnQgc2l6ZSwgbGVuOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJdW5zaWduZWQgbW9kZTsKKworCWlmIChnZXRfc2hhMSgiSEVBRCIsIGhlYWRfc2hhMSkpCisJCWRpZSgiTm8gc3VjaCByZWY6IEhFQUQiKTsKKworCXRpbWUoJm5vdyk7CisJY29tbWl0ID0geGNhbGxvYygxLCBzaXplb2YoKmNvbW1pdCkpOworCWNvbW1pdC0+cGFyZW50cyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpjb21taXQtPnBhcmVudHMpKTsKKwljb21taXQtPnBhcmVudHMtPml0ZW0gPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShoZWFkX3NoYTEpOworCWNvbW1pdC0+b2JqZWN0LnBhcnNlZCA9IDE7CisJY29tbWl0LT5kYXRlID0gbm93OworCWNvbW1pdC0+b2JqZWN0LnR5cGUgPSBPQkpfQ09NTUlUOworCisJb3JpZ2luID0gbWFrZV9vcmlnaW4oY29tbWl0LCBwYXRoKTsKKworCWlmICghY29udGVudHNfZnJvbSB8fCBzdHJjbXAoIi0iLCBjb250ZW50c19mcm9tKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY29uc3QgY2hhciAqcmVhZF9mcm9tOworCisJCWlmIChjb250ZW50c19mcm9tKSB7CisJCQlpZiAoc3RhdChjb250ZW50c19mcm9tLCAmc3QpIDwgMCkKKwkJCQlkaWUoIkNhbm5vdCBzdGF0ICVzIiwgY29udGVudHNfZnJvbSk7CisJCQlyZWFkX2Zyb20gPSBjb250ZW50c19mcm9tOworCQl9CisJCWVsc2UgeworCQkJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJCWRpZSgiQ2Fubm90IGxzdGF0ICVzIiwgcGF0aCk7CisJCQlyZWFkX2Zyb20gPSBwYXRoOworCQl9CisJCWZpbl9zaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJYnVmID0geG1hbGxvYyhmaW5fc2l6ZSsxKTsKKwkJbW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisJCXN3aXRjaCAoc3Quc3RfbW9kZSAmIFNfSUZNVCkgeworCQljYXNlIFNfSUZSRUc6CisJCQlmZCA9IG9wZW4ocmVhZF9mcm9tLCBPX1JET05MWSk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWRpZSgiY2Fubm90IG9wZW4gJXMiLCByZWFkX2Zyb20pOworCQkJaWYgKHJlYWRfaW5fZnVsbChmZCwgYnVmLCBmaW5fc2l6ZSkgIT0gZmluX3NpemUpCisJCQkJZGllKCJjYW5ub3QgcmVhZCAlcyIsIHJlYWRfZnJvbSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGTE5LOgorCQkJaWYgKHJlYWRsaW5rKHJlYWRfZnJvbSwgYnVmLCBmaW5fc2l6ZSsxKSAhPSBmaW5fc2l6ZSkKKwkJCQlkaWUoImNhbm5vdCByZWFkbGluayAlcyIsIHJlYWRfZnJvbSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRpZSgidW5zdXBwb3J0ZWQgZmlsZSB0eXBlICVzIiwgcmVhZF9mcm9tKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogUmVhZGluZyBmcm9tIHN0ZGluICovCisJCWNvbnRlbnRzX2Zyb20gPSAic3RhbmRhcmQgaW5wdXQiOworCQlidWYgPSBOVUxMOworCQlmaW5fc2l6ZSA9IDA7CisJCW1vZGUgPSAwOworCQl3aGlsZSAoMSkgeworCQkJc3NpemVfdCBjbnQgPSA4MTkyOworCQkJYnVmID0geHJlYWxsb2MoYnVmLCBmaW5fc2l6ZSArIGNudCk7CisJCQljbnQgPSB4cmVhZCgwLCBidWYgKyBmaW5fc2l6ZSwgY250KTsKKwkJCWlmIChjbnQgPCAwKQorCQkJCWRpZSgicmVhZCBlcnJvciAlcyBmcm9tIHN0ZGluIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmICghY250KQorCQkJCWJyZWFrOworCQkJZmluX3NpemUgKz0gY250OworCQl9CisJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgZmluX3NpemUgKyAxKTsKKwl9CisJYnVmW2Zpbl9zaXplXSA9IDA7CisJb3JpZ2luLT5maWxlLnB0ciA9IGJ1ZjsKKwlvcmlnaW4tPmZpbGUuc2l6ZSA9IGZpbl9zaXplOworCXByZXRlbmRfc2hhMV9maWxlKGJ1ZiwgZmluX3NpemUsIE9CSl9CTE9CLCBvcmlnaW4tPmJsb2Jfc2hhMSk7CisJY29tbWl0LT51dGlsID0gb3JpZ2luOworCisJLyoKKwkgKiBSZWFkIHRoZSBjdXJyZW50IGluZGV4LCByZXBsYWNlIHRoZSBwYXRoIGVudHJ5IHdpdGgKKwkgKiBvcmlnaW4tPmJsb2Jfc2hhMSB3aXRob3V0IG11Y2tpbmcgd2l0aCBpdHMgbW9kZSBvciB0eXBlCisJICogYml0czsgd2UgYXJlIG5vdCBnb2luZyB0byB3cml0ZSB0aGlzIGluZGV4IG91dCAtLSB3ZSBqdXN0CisJICogd2FudCB0byBydW4gImRpZmYtaW5kZXggLS1jYWNoZWQiLgorCSAqLworCWRpc2NhcmRfY2FjaGUoKTsKKwlyZWFkX2NhY2hlKCk7CisKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKCFtb2RlKSB7CisJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBsZW4pOworCQlpZiAoMCA8PSBwb3MpCisJCQltb2RlID0gbnRvaGwoYWN0aXZlX2NhY2hlW3Bvc10tPmNlX21vZGUpOworCQllbHNlCisJCQkvKiBMZXQncyBub3QgYm90aGVyIHJlYWRpbmcgZnJvbSBIRUFEIHRyZWUgKi8KKwkJCW1vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwl9CisJc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisJaGFzaGNweShjZS0+c2hhMSwgb3JpZ2luLT5ibG9iX3NoYTEpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbGVuKTsKKwljZS0+Y2VfZmxhZ3MgPSBjcmVhdGVfY2VfZmxhZ3MobGVuLCAwKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSk7CisKKwkvKgorCSAqIFdlIGFyZSBub3QgZ29pbmcgdG8gd3JpdGUgdGhpcyBvdXQsIHNvIHRoaXMgZG9lcyBub3QgbWF0dGVyCisJICogcmlnaHQgbm93LCBidXQgc29tZWRheSB3ZSBtaWdodCBvcHRpbWl6ZSBkaWZmLWluZGV4IC0tY2FjaGVkCisJICogd2l0aCBjYWNoZS10cmVlIGluZm9ybWF0aW9uLgorCSAqLworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKworCWNvbW1pdC0+YnVmZmVyID0geG1hbGxvYyg0MDApOworCWlkZW50ID0gZm10X2lkZW50KCJOb3QgQ29tbWl0dGVkIFlldCIsICJub3QuY29tbWl0dGVkLnlldCIsIE5VTEwsIDApOworCXNucHJpbnRmKGNvbW1pdC0+YnVmZmVyLCA0MDAsCisJCSJ0cmVlIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcbiIKKwkJInBhcmVudCAlc1xuIgorCQkiYXV0aG9yICVzXG4iCisJCSJjb21taXR0ZXIgJXNcblxuIgorCQkiVmVyc2lvbiBvZiAlcyBmcm9tICVzXG4iLAorCQlzaGExX3RvX2hleChoZWFkX3NoYTEpLAorCQlpZGVudCwgaWRlbnQsIHBhdGgsIGNvbnRlbnRzX2Zyb20gPyBjb250ZW50c19mcm9tIDogcGF0aCk7CisJcmV0dXJuIGNvbW1pdDsKK30KKworaW50IGNtZF9ibGFtZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwljb25zdCBjaGFyICpwYXRoOworCXN0cnVjdCBzY29yZWJvYXJkIHNiOworCXN0cnVjdCBvcmlnaW4gKm87CisJc3RydWN0IGJsYW1lX2VudHJ5ICplbnQ7CisJaW50IGksIHNlZW5fZGFzaGRhc2gsIHVuaywgb3B0OworCWxvbmcgYm90dG9tLCB0b3AsIGxubzsKKwlpbnQgb3V0cHV0X29wdGlvbiA9IDA7CisJaW50IHNob3dfc3RhdHMgPSAwOworCWNvbnN0IGNoYXIgKnJldnNfZmlsZSA9IE5VTEw7CisJY29uc3QgY2hhciAqZmluYWxfY29tbWl0X25hbWUgPSBOVUxMOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpib3R0b210b3AgPSBOVUxMOworCWNvbnN0IGNoYXIgKmNvbnRlbnRzX2Zyb20gPSBOVUxMOworCisJY21kX2lzX2Fubm90YXRlID0gIXN0cmNtcChhcmd2WzBdLCAiYW5ub3RhdGUiKTsKKworCWdpdF9jb25maWcoZ2l0X2JsYW1lX2NvbmZpZyk7CisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKworCW9wdCA9IDA7CisJc2Vlbl9kYXNoZGFzaCA9IDA7CisJZm9yICh1bmsgPSBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLWIiLCBhcmcpKQorCQkJYmxhbmtfYm91bmRhcnkgPSAxOworCQllbHNlIGlmICghc3RyY21wKCItLXJvb3QiLCBhcmcpKQorCQkJc2hvd19yb290ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXNob3ctc3RhdHMiKSkKKwkJCXNob3dfc3RhdHMgPSAxOworCQllbHNlIGlmICghc3RyY21wKCItYyIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9BTk5PVEFURV9DT01QQVQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi10IiwgYXJnKSkKKwkJCW91dHB1dF9vcHRpb24gfD0gT1VUUFVUX1JBV19USU1FU1RBTVA7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1sIiwgYXJnKSkKKwkJCW91dHB1dF9vcHRpb24gfD0gT1VUUFVUX0xPTkdfT0JKRUNUX05BTUU7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgYXJnKSkKKwkJCW91dHB1dF9vcHRpb24gfD0gT1VUUFVUX05PX0FVVEhPUjsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLVMiLCBhcmcpICYmICsraSA8IGFyZ2MpCisJCQlyZXZzX2ZpbGUgPSBhcmd2W2ldOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1NIikpIHsKKwkJCW9wdCB8PSBQSUNLQVhFX0JMQU1FX01PVkU7CisJCQlibGFtZV9tb3ZlX3Njb3JlID0gcGFyc2Vfc2NvcmUoYXJnKzIpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUMiKSkgeworCQkJLyoKKwkJCSAqIC1DIGVuYWJsZXMgY29weSBmcm9tIHJlbW92ZWQgZmlsZXM7CisJCQkgKiAtQyAtQyBlbmFibGVzIGNvcHkgZnJvbSBleGlzdGluZyBmaWxlcywgYnV0IG9ubHkKKwkJCSAqICAgICAgIHdoZW4gYmxhbWluZyBhIG5ldyBmaWxlOworCQkJICogLUMgLUMgLUMgZW5hYmxlcyBjb3B5IGZyb20gZXhpc3RpbmcgZmlsZXMgZm9yCisJCQkgKiAgICAgICAgICBldmVyeWJvZHkKKwkJCSAqLworCQkJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVIpCisJCQkJb3B0IHw9IFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVNUOworCQkJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWSkKKwkJCQlvcHQgfD0gUElDS0FYRV9CTEFNRV9DT1BZX0hBUkRFUjsKKwkJCW9wdCB8PSBQSUNLQVhFX0JMQU1FX0NPUFkgfCBQSUNLQVhFX0JMQU1FX01PVkU7CisJCQlibGFtZV9jb3B5X3Njb3JlID0gcGFyc2Vfc2NvcmUoYXJnKzIpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUwiKSkgeworCQkJaWYgKCFhcmdbMl0pIHsKKwkJCQlpZiAoKytpID49IGFyZ2MpCisJCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCQlhcmcgPSBhcmd2W2ldOworCQkJfQorCQkJZWxzZQorCQkJCWFyZyArPSAyOworCQkJaWYgKGJvdHRvbXRvcCkKKwkJCQlkaWUoIk1vcmUgdGhhbiBvbmUgJy1MIG4sbScgb3B0aW9uIGdpdmVuIik7CisJCQlib3R0b210b3AgPSBhcmc7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS1jb250ZW50cyIsIGFyZykpIHsKKwkJCWlmICgrK2kgPj0gYXJnYykKKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQljb250ZW50c19mcm9tID0gYXJndltpXTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKCItLWluY3JlbWVudGFsIiwgYXJnKSkKKwkJCWluY3JlbWVudGFsID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS1zY29yZS1kZWJ1ZyIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9TSE9XX1NDT1JFOworCQllbHNlIGlmICghc3RyY21wKCItZiIsIGFyZykgfHwKKwkJCSAhc3RyY21wKCItLXNob3ctbmFtZSIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9TSE9XX05BTUU7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1uIiwgYXJnKSB8fAorCQkJICFzdHJjbXAoIi0tc2hvdy1udW1iZXIiLCBhcmcpKQorCQkJb3V0cHV0X29wdGlvbiB8PSBPVVRQVVRfU0hPV19OVU1CRVI7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1wIiwgYXJnKSB8fAorCQkJICFzdHJjbXAoIi0tcG9yY2VsYWluIiwgYXJnKSkKKwkJCW91dHB1dF9vcHRpb24gfD0gT1VUUFVUX1BPUkNFTEFJTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhcmcpKSB7CisJCQlzZWVuX2Rhc2hkYXNoID0gMTsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCWFyZ3ZbdW5rKytdID0gYXJnOworCX0KKworCWlmICghaW5jcmVtZW50YWwpCisJCXNldHVwX3BhZ2VyKCk7CisKKwlpZiAoIWJsYW1lX21vdmVfc2NvcmUpCisJCWJsYW1lX21vdmVfc2NvcmUgPSBCTEFNRV9ERUZBVUxUX01PVkVfU0NPUkU7CisJaWYgKCFibGFtZV9jb3B5X3Njb3JlKQorCQlibGFtZV9jb3B5X3Njb3JlID0gQkxBTUVfREVGQVVMVF9DT1BZX1NDT1JFOworCisJLyoKKwkgKiBXZSBoYXZlIGNvbGxlY3RlZCBvcHRpb25zIHVua25vd24gdG8gdXMgaW4gYXJndlsxLi51bmtdCisJICogd2hpY2ggYXJlIHRvIGJlIHBhc3NlZCB0byByZXZpc2lvbiBtYWNoaW5lcnkgaWYgd2UgYXJlCisJICogZ29pbmcgdG8gZG8gdGhlICJib3R0b20iIHByb2Nlc3NpbmcuCisJICoKKwkgKiBUaGUgcmVtYWluaW5nIGFyZToKKwkgKgorCSAqICgxKSBpZiBzZWVuX2Rhc2hkYXNoLCBpdHMgZWl0aGVyCisJICogICAgICItb3B0aW9ucyAtLSA8cGF0aD4iIG9yCisJICogICAgICItb3B0aW9ucyAtLSA8cGF0aD4gPHJldj4iLgorCSAqICAgICBidXQgdGhlIGxhdHRlciBpcyBhbGxvd2VkIG9ubHkgaWYgdGhlcmUgaXMgbm8KKwkgKiAgICAgb3B0aW9ucyB0aGF0IHdlIHBhc3NlZCB0byByZXZpc2lvbiBtYWNoaW5lcnkuCisJICoKKwkgKiAoMikgb3RoZXJ3aXNlLCB3ZSBtYXkgaGF2ZSAiLS0iIHNvbWV3aGVyZSBsYXRlciBhbmQKKwkgKiAgICAgbWlnaHQgYmUgbG9va2luZyBhdCB0aGUgZmlyc3Qgb25lIG9mIG11bHRpcGxlICdyZXYnCisJICogICAgIHBhcmFtZXRlcnMgKGUuZy4gIiBtYXN0ZXIgXm5leHQgXm1haW50IC0tIHBhdGgiKS4KKwkgKiAgICAgU2VlIGlmIHRoZXJlIGlzIGEgZGFzaGRhc2ggZmlyc3QsIGFuZCBnaXZlIHRoZQorCSAqICAgICBhcmd1bWVudHMgYmVmb3JlIHRoYXQgdG8gcmV2aXNpb24gbWFjaGluZXJ5LgorCSAqICAgICBBZnRlciB0aGF0IHRoZXJlIG11c3QgYmUgb25lICdwYXRoJy4KKwkgKgorCSAqICgzKSBvdGhlcndpc2UsIGl0cyBvbmUgb2YgdGhlIHRocmVlOgorCSAqICAgICAiLW9wdGlvbnMgPHBhdGg+IDxyZXY+IgorCSAqICAgICAiLW9wdGlvbnMgPHJldj4gPHBhdGg+IgorCSAqICAgICAiLW9wdGlvbnMgPHBhdGg+IgorCSAqICAgICBidXQgYWdhaW4gdGhlIGZpcnN0IG9uZSBpcyBhbGxvd2VkIG9ubHkgaWYKKwkgKiAgICAgdGhlcmUgaXMgbm8gb3B0aW9ucyB0aGF0IHdlIHBhc3NlZCB0byByZXZpc2lvbgorCSAqICAgICBtYWNoaW5lcnkuCisJICovCisKKwlpZiAoc2Vlbl9kYXNoZGFzaCkgeworCQkvKiAoMSkgKi8KKwkJaWYgKGFyZ2MgPD0gaSkKKwkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJcGF0aCA9IGFkZF9wcmVmaXgocHJlZml4LCBhcmd2W2ldKTsKKwkJaWYgKGkgKyAxID09IGFyZ2MgLSAxKSB7CisJCQlpZiAodW5rICE9IDEpCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQkJYXJndlt1bmsrK10gPSBhcmd2W2kgKyAxXTsKKwkJfQorCQllbHNlIGlmIChpICsgMSAhPSBhcmdjKQorCQkJLyogZ2FyYmFnZSBhdCBlbmQgKi8KKwkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwl9CisJZWxzZSB7CisJCWludCBqOworCQlmb3IgKGogPSBpOyAhc2Vlbl9kYXNoZGFzaCAmJiBqIDwgYXJnYzsgaisrKQorCQkJaWYgKCFzdHJjbXAoYXJndltqXSwgIi0tIikpCisJCQkJc2Vlbl9kYXNoZGFzaCA9IGo7CisJCWlmIChzZWVuX2Rhc2hkYXNoKSB7CisJCQkvKiAoMikgKi8KKwkJCWlmIChzZWVuX2Rhc2hkYXNoICsgMSAhPSBhcmdjIC0gMSkKKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQlwYXRoID0gYWRkX3ByZWZpeChwcmVmaXgsIGFyZ3Zbc2Vlbl9kYXNoZGFzaCArIDFdKTsKKwkJCWZvciAoaiA9IGk7IGogPCBzZWVuX2Rhc2hkYXNoOyBqKyspCisJCQkJYXJndlt1bmsrK10gPSBhcmd2W2pdOworCQl9CisJCWVsc2UgeworCQkJLyogKDMpICovCisJCQlpZiAoYXJnYyA8PSBpKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCXBhdGggPSBhZGRfcHJlZml4KHByZWZpeCwgYXJndltpXSk7CisJCQlpZiAoaSArIDEgPT0gYXJnYyAtIDEpIHsKKwkJCQlmaW5hbF9jb21taXRfbmFtZSA9IGFyZ3ZbaSArIDFdOworCisJCQkJLyogaWYgKHVuayA9PSAxKSB3ZSBjb3VsZCBiZSBnZXR0aW5nCisJCQkJICogb2xkLXN0eWxlCisJCQkJICovCisJCQkJaWYgKHVuayA9PSAxICYmICFoYXNfcGF0aF9pbl93b3JrX3RyZWUocGF0aCkpIHsKKwkJCQkJcGF0aCA9IGFkZF9wcmVmaXgocHJlZml4LCBhcmd2W2kgKyAxXSk7CisJCQkJCWZpbmFsX2NvbW1pdF9uYW1lID0gYXJndltpXTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChpICE9IGFyZ2MgLSAxKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsgLyogZ2FyYmFnZSBhdCBlbmQgKi8KKworCQkJaWYgKCFoYXNfcGF0aF9pbl93b3JrX3RyZWUocGF0aCkpCisJCQkJZGllKCJjYW5ub3Qgc3RhdCBwYXRoICVzOiAlcyIsCisJCQkJICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9CisKKwlpZiAoZmluYWxfY29tbWl0X25hbWUpCisJCWFyZ3ZbdW5rKytdID0gZmluYWxfY29tbWl0X25hbWU7CisKKwkvKgorCSAqIE5vdyB3ZSBnb3QgcmV2IGFuZCBwYXRoLiAgV2UgZG8gbm90IHdhbnQgdGhlIHBhdGggcHJ1bmluZworCSAqIGJ1dCB3ZSBtYXkgd2FudCAiYm90dG9tIiBwcm9jZXNzaW5nLgorCSAqLworCWFyZ3ZbdW5rKytdID0gIi0tIjsgLyogdGVybWluYXRlIHRoZSByZXYgbmFtZSAqLworCWFyZ3ZbdW5rXSA9IE5VTEw7CisKKwlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJc2V0dXBfcmV2aXNpb25zKHVuaywgYXJndiwgJnJldnMsIE5VTEwpOworCW1lbXNldCgmc2IsIDAsIHNpemVvZihzYikpOworCisJLyoKKwkgKiBUaGVyZSBtdXN0IGJlIG9uZSBhbmQgb25seSBvbmUgcG9zaXRpdmUgY29tbWl0IGluIHRoZQorCSAqIHJldnMtPnBlbmRpbmcgYXJyYXkuCisJICovCisJZm9yIChpID0gMDsgaSA8IHJldnMucGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHJldnMucGVuZGluZy5vYmplY3RzW2ldLml0ZW07CisJCWlmIChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAob2JqLT50eXBlID09IE9CSl9UQUcpCisJCQlvYmogPSBkZXJlZl90YWcob2JqLCBOVUxMLCAwKTsKKwkJaWYgKG9iai0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQkJZGllKCJOb24gY29tbWl0ICVzPyIsCisJCQkgICAgcmV2cy5wZW5kaW5nLm9iamVjdHNbaV0ubmFtZSk7CisJCWlmIChzYi5maW5hbCkKKwkJCWRpZSgiTW9yZSB0aGFuIG9uZSBjb21taXQgdG8gZGlnIGZyb20gJXMgYW5kICVzPyIsCisJCQkgICAgcmV2cy5wZW5kaW5nLm9iamVjdHNbaV0ubmFtZSwKKwkJCSAgICBmaW5hbF9jb21taXRfbmFtZSk7CisJCXNiLmZpbmFsID0gKHN0cnVjdCBjb21taXQgKikgb2JqOworCQlmaW5hbF9jb21taXRfbmFtZSA9IHJldnMucGVuZGluZy5vYmplY3RzW2ldLm5hbWU7CisJfQorCisJaWYgKCFzYi5maW5hbCkgeworCQkvKgorCQkgKiAiLS1ub3QgQSBCIC0tIHBhdGgiIHdpdGhvdXQgYW55dGhpbmcgcG9zaXRpdmU7CisJCSAqIGRvIG5vdCBkZWZhdWx0IHRvIEhFQUQsIGJ1dCB1c2UgdGhlIHdvcmtpbmcgdHJlZQorCQkgKiBvciAiLS1jb250ZW50cyIuCisJCSAqLworCQlzYi5maW5hbCA9IGZha2Vfd29ya2luZ190cmVlX2NvbW1pdChwYXRoLCBjb250ZW50c19mcm9tKTsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCAmKHNiLmZpbmFsLT5vYmplY3QpLCAiOiIpOworCX0KKwllbHNlIGlmIChjb250ZW50c19mcm9tKQorCQlkaWUoIkNhbm5vdCB1c2UgLS1jb250ZW50cyB3aXRoIGZpbmFsIGNvbW1pdCBvYmplY3QgbmFtZSIpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGJvdHRvbSwgdGhpcyB3aWxsIG1hcmsgdGhlIGFuY2VzdG9ycyBvZiB0aGUKKwkgKiBib3R0b20gY29tbWl0cyB3ZSB3b3VsZCByZWFjaCB3aGlsZSB0cmF2ZXJzaW5nIGFzCisJICogdW5pbnRlcmVzdGluZy4KKwkgKi8KKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpOworCisJaWYgKGlzX251bGxfc2hhMShzYi5maW5hbC0+b2JqZWN0LnNoYTEpKSB7CisJCWNoYXIgKmJ1ZjsKKwkJbyA9IHNiLmZpbmFsLT51dGlsOworCQlidWYgPSB4bWFsbG9jKG8tPmZpbGUuc2l6ZSArIDEpOworCQltZW1jcHkoYnVmLCBvLT5maWxlLnB0ciwgby0+ZmlsZS5zaXplICsgMSk7CisJCXNiLmZpbmFsX2J1ZiA9IGJ1ZjsKKwkJc2IuZmluYWxfYnVmX3NpemUgPSBvLT5maWxlLnNpemU7CisJfQorCWVsc2UgeworCQlvID0gZ2V0X29yaWdpbigmc2IsIHNiLmZpbmFsLCBwYXRoKTsKKwkJaWYgKGZpbGxfYmxvYl9zaGExKG8pKQorCQkJZGllKCJubyBzdWNoIHBhdGggJXMgaW4gJXMiLCBwYXRoLCBmaW5hbF9jb21taXRfbmFtZSk7CisKKwkJc2IuZmluYWxfYnVmID0gcmVhZF9zaGExX2ZpbGUoby0+YmxvYl9zaGExLCAmdHlwZSwKKwkJCQkJICAgICAgJnNiLmZpbmFsX2J1Zl9zaXplKTsKKwl9CisJbnVtX3JlYWRfYmxvYisrOworCWxubyA9IHByZXBhcmVfbGluZXMoJnNiKTsKKworCWJvdHRvbSA9IHRvcCA9IDA7CisJaWYgKGJvdHRvbXRvcCkKKwkJcHJlcGFyZV9ibGFtZV9yYW5nZSgmc2IsIGJvdHRvbXRvcCwgbG5vLCAmYm90dG9tLCAmdG9wKTsKKwlpZiAoYm90dG9tICYmIHRvcCAmJiB0b3AgPCBib3R0b20pIHsKKwkJbG9uZyB0bXA7CisJCXRtcCA9IHRvcDsgdG9wID0gYm90dG9tOyBib3R0b20gPSB0bXA7CisJfQorCWlmIChib3R0b20gPCAxKQorCQlib3R0b20gPSAxOworCWlmICh0b3AgPCAxKQorCQl0b3AgPSBsbm87CisJYm90dG9tLS07CisJaWYgKGxubyA8IHRvcCkKKwkJZGllKCJmaWxlICVzIGhhcyBvbmx5ICVsdSBsaW5lcyIsIHBhdGgsIGxubyk7CisKKwllbnQgPSB4Y2FsbG9jKDEsIHNpemVvZigqZW50KSk7CisJZW50LT5sbm8gPSBib3R0b207CisJZW50LT5udW1fbGluZXMgPSB0b3AgLSBib3R0b207CisJZW50LT5zdXNwZWN0ID0gbzsKKwllbnQtPnNfbG5vID0gYm90dG9tOworCisJc2IuZW50ID0gZW50OworCXNiLnBhdGggPSBwYXRoOworCisJaWYgKHJldnNfZmlsZSAmJiByZWFkX2FuY2VzdHJ5KHJldnNfZmlsZSkpCisJCWRpZSgicmVhZGluZyBncmFmdCBmaWxlICVzIGZhaWxlZDogJXMiLAorCQkgICAgcmV2c19maWxlLCBzdHJlcnJvcihlcnJubykpOworCisJcmVhZF9tYWlsbWFwKCZtYWlsbWFwLCAiLm1haWxtYXAiLCBOVUxMKTsKKworCWFzc2lnbl9ibGFtZSgmc2IsICZyZXZzLCBvcHQpOworCisJaWYgKGluY3JlbWVudGFsKQorCQlyZXR1cm4gMDsKKworCWNvYWxlc2NlKCZzYik7CisKKwlpZiAoIShvdXRwdXRfb3B0aW9uICYgT1VUUFVUX1BPUkNFTEFJTikpCisJCWZpbmRfYWxpZ25tZW50KCZzYiwgJm91dHB1dF9vcHRpb24pOworCisJb3V0cHV0KCZzYiwgb3V0cHV0X29wdGlvbik7CisJZnJlZSgodm9pZCAqKXNiLmZpbmFsX2J1Zik7CisJZm9yIChlbnQgPSBzYi5lbnQ7IGVudDsgKSB7CisJCXN0cnVjdCBibGFtZV9lbnRyeSAqZSA9IGVudC0+bmV4dDsKKwkJZnJlZShlbnQpOworCQllbnQgPSBlOworCX0KKworCWlmIChzaG93X3N0YXRzKSB7CisJCXByaW50ZigibnVtIHJlYWQgYmxvYjogJWRcbiIsIG51bV9yZWFkX2Jsb2IpOworCQlwcmludGYoIm51bSBnZXQgcGF0Y2g6ICVkXG4iLCBudW1fZ2V0X3BhdGNoKTsKKwkJcHJpbnRmKCJudW0gY29tbWl0czogJWRcbiIsIG51bV9jb21taXRzKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWJyYW5jaC5jIGIvYnVpbHRpbi1icmFuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRiYTZlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1icmFuY2guYwpAQCAtMCwwICsxLDY2OSBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBicmFuY2giCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEtyaXN0aWFuIEj4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KKyAqIEJhc2VkIG9uIGdpdC1icmFuY2guc2ggYnkgSnVuaW8gQyBIYW1hbm8uCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBidWlsdGluX2JyYW5jaF91c2FnZVtdID0KKyAgImdpdC1icmFuY2ggWy1yXSAoLWQgfCAtRCkgPGJyYW5jaG5hbWU+IHwgWy0tdHJhY2sgfCAtLW5vLXRyYWNrXSBbLWxdIFstZl0gPGJyYW5jaG5hbWU+IFs8c3RhcnQtcG9pbnQ+XSB8ICgtbSB8IC1NKSBbPG9sZGJyYW5jaD5dIDxuZXdicmFuY2g+IHwgWy0tY29sb3IgfCAtLW5vLWNvbG9yXSBbLXIgfCAtYV0gWy12IFstLWFiYnJldj08bGVuZ3RoPiB8IC0tbm8tYWJicmV2XV0iOworCisjZGVmaW5lIFJFRl9VTktOT1dOX1RZUEUgICAgMHgwMAorI2RlZmluZSBSRUZfTE9DQUxfQlJBTkNIICAgIDB4MDEKKyNkZWZpbmUgUkVGX1JFTU9URV9CUkFOQ0ggICAweDAyCisjZGVmaW5lIFJFRl9UQUcgICAgICAgICAgICAgMHgwNAorCitzdGF0aWMgY29uc3QgY2hhciAqaGVhZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisKK3N0YXRpYyBpbnQgYnJhbmNoX3RyYWNrX3JlbW90ZXM7CisKK3N0YXRpYyBpbnQgYnJhbmNoX3VzZV9jb2xvcjsKK3N0YXRpYyBjaGFyIGJyYW5jaF9jb2xvcnNbXVtDT0xPUl9NQVhMRU5dID0geworCSJcMDMzW20iLAkvKiByZXNldCAqLworCSIiLAkJLyogUExBSU4gKG5vcm1hbCkgKi8KKwkiXDAzM1szMW0iLAkvKiBSRU1PVEUgKHJlZCkgKi8KKwkiIiwJCS8qIExPQ0FMIChub3JtYWwpICovCisJIlwwMzNbMzJtIiwJLyogQ1VSUkVOVCAoZ3JlZW4pICovCit9OworZW51bSBjb2xvcl9icmFuY2ggeworCUNPTE9SX0JSQU5DSF9SRVNFVCA9IDAsCisJQ09MT1JfQlJBTkNIX1BMQUlOID0gMSwKKwlDT0xPUl9CUkFOQ0hfUkVNT1RFID0gMiwKKwlDT0xPUl9CUkFOQ0hfTE9DQUwgPSAzLAorCUNPTE9SX0JSQU5DSF9DVVJSRU5UID0gNCwKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfYnJhbmNoX2NvbG9yX3Nsb3QoY29uc3QgY2hhciAqdmFyLCBpbnQgb2ZzKQoreworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAicGxhaW4iKSkKKwkJcmV0dXJuIENPTE9SX0JSQU5DSF9QTEFJTjsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgInJlc2V0IikpCisJCXJldHVybiBDT0xPUl9CUkFOQ0hfUkVTRVQ7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJyZW1vdGUiKSkKKwkJcmV0dXJuIENPTE9SX0JSQU5DSF9SRU1PVEU7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJsb2NhbCIpKQorCQlyZXR1cm4gQ09MT1JfQlJBTkNIX0xPQ0FMOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAiY3VycmVudCIpKQorCQlyZXR1cm4gQ09MT1JfQlJBTkNIX0NVUlJFTlQ7CisJZGllKCJiYWQgY29uZmlnIHZhcmlhYmxlICclcyciLCB2YXIpOworfQorCitpbnQgZ2l0X2JyYW5jaF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJjb2xvci5icmFuY2giKSkgeworCQlicmFuY2hfdXNlX2NvbG9yID0gZ2l0X2NvbmZpZ19jb2xvcmJvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJjb2xvci5icmFuY2guIikpIHsKKwkJaW50IHNsb3QgPSBwYXJzZV9icmFuY2hfY29sb3Jfc2xvdCh2YXIsIDEzKTsKKwkJY29sb3JfcGFyc2UodmFsdWUsIHZhciwgYnJhbmNoX2NvbG9yc1tzbG90XSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJicmFuY2guYXV0b3NldHVwbWVyZ2UiKSkKKwkJYnJhbmNoX3RyYWNrX3JlbW90ZXMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitjb25zdCBjaGFyICpicmFuY2hfZ2V0X2NvbG9yKGVudW0gY29sb3JfYnJhbmNoIGl4KQoreworCWlmIChicmFuY2hfdXNlX2NvbG9yKQorCQlyZXR1cm4gYnJhbmNoX2NvbG9yc1tpeF07CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50IGRlbGV0ZV9icmFuY2hlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBmb3JjZSwgaW50IGtpbmRzKQoreworCXN0cnVjdCBjb21taXQgKnJldiwgKmhlYWRfcmV2ID0gaGVhZF9yZXY7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpuYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpmbXQsICpyZW1vdGU7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGtpbmRzKSB7CisJY2FzZSBSRUZfUkVNT1RFX0JSQU5DSDoKKwkJZm10ID0gInJlZnMvcmVtb3Rlcy8lcyI7CisJCXJlbW90ZSA9ICJyZW1vdGUgIjsKKwkJZm9yY2UgPSAxOworCQlicmVhazsKKwljYXNlIFJFRl9MT0NBTF9CUkFOQ0g6CisJCWZtdCA9ICJyZWZzL2hlYWRzLyVzIjsKKwkJcmVtb3RlID0gIiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiY2Fubm90IHVzZSAtYSB3aXRoIC1kIik7CisJfQorCisJaWYgKCFmb3JjZSkgeworCQloZWFkX3JldiA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGhlYWRfc2hhMSk7CisJCWlmICghaGVhZF9yZXYpCisJCQlkaWUoIkNvdWxkbid0IGxvb2sgdXAgY29tbWl0IG9iamVjdCBmb3IgSEVBRCIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChraW5kcyA9PSBSRUZfTE9DQUxfQlJBTkNIICYmICFzdHJjbXAoaGVhZCwgYXJndltpXSkpIHsKKwkJCWVycm9yKCJDYW5ub3QgZGVsZXRlIHRoZSBicmFuY2ggJyVzJyAiCisJCQkJIndoaWNoIHlvdSBhcmUgY3VycmVudGx5IG9uLiIsIGFyZ3ZbaV0pOworCQkJcmV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG5hbWUpCisJCQlmcmVlKG5hbWUpOworCisJCW5hbWUgPSB4c3RyZHVwKG1rcGF0aChmbXQsIGFyZ3ZbaV0pKTsKKwkJaWYgKCFyZXNvbHZlX3JlZihuYW1lLCBzaGExLCAxLCBOVUxMKSkgeworCQkJZXJyb3IoIiVzYnJhbmNoICclcycgbm90IGZvdW5kLiIsCisJCQkJCXJlbW90ZSwgYXJndltpXSk7CisJCQlyZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlyZXYgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwkJaWYgKCFyZXYpIHsKKwkJCWVycm9yKCJDb3VsZG4ndCBsb29rIHVwIGNvbW1pdCBvYmplY3QgZm9yICclcyciLCBuYW1lKTsKKwkJCXJldCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgY2hlY2tzIHdoZXRoZXIgdGhlIG1lcmdlIGJhc2VzIG9mIGJyYW5jaCBhbmQKKwkJICogSEVBRCBjb250YWlucyBicmFuY2ggLS0gd2hpY2ggbWVhbnMgdGhhdCB0aGUgSEVBRAorCQkgKiBjb250YWlucyBldmVyeXRoaW5nIGluIGJvdGguCisJCSAqLworCisJCWlmICghZm9yY2UgJiYKKwkJICAgICFpbl9tZXJnZV9iYXNlcyhyZXYsICZoZWFkX3JldiwgMSkpIHsKKwkJCWVycm9yKCJUaGUgYnJhbmNoICclcycgaXMgbm90IGEgc3RyaWN0IHN1YnNldCBvZiAiCisJCQkJInlvdXIgY3VycmVudCBIRUFELlxuIgorCQkJCSJJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGl0LCAiCisJCQkJInJ1biAnZ2l0IGJyYW5jaCAtRCAlcycuIiwgYXJndltpXSwgYXJndltpXSk7CisJCQlyZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZGVsZXRlX3JlZihuYW1lLCBzaGExKSkgeworCQkJZXJyb3IoIkVycm9yIGRlbGV0aW5nICVzYnJhbmNoICclcyciLCByZW1vdGUsCisJCQkgICAgICAgYXJndltpXSk7CisJCQlyZXQgPSAxOworCQl9IGVsc2UKKwkJCXByaW50ZigiRGVsZXRlZCAlc2JyYW5jaCAlcy5cbiIsIHJlbW90ZSwgYXJndltpXSk7CisKKwl9CisKKwlpZiAobmFtZSkKKwkJZnJlZShuYW1lKTsKKworCXJldHVybihyZXQpOworfQorCitzdHJ1Y3QgcmVmX2l0ZW0geworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGtpbmQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3N0cnVjdCByZWZfbGlzdCB7CisJaW50IGluZGV4LCBhbGxvYywgbWF4d2lkdGg7CisJc3RydWN0IHJlZl9pdGVtICpsaXN0OworCWludCBraW5kczsKK307CisKK3N0YXRpYyBpbnQgYXBwZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZ3MsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IHJlZl9saXN0ICpyZWZfbGlzdCA9IChzdHJ1Y3QgcmVmX2xpc3QqKShjYl9kYXRhKTsKKwlzdHJ1Y3QgcmVmX2l0ZW0gKm5ld2l0ZW07CisJaW50IGtpbmQgPSBSRUZfVU5LTk9XTl9UWVBFOworCWludCBsZW47CisKKwkvKiBEZXRlY3Qga2luZCAqLworCWlmICghcHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpKSB7CisJCWtpbmQgPSBSRUZfTE9DQUxfQlJBTkNIOworCQlyZWZuYW1lICs9IDExOworCX0gZWxzZSBpZiAoIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy9yZW1vdGVzLyIpKSB7CisJCWtpbmQgPSBSRUZfUkVNT1RFX0JSQU5DSDsKKwkJcmVmbmFtZSArPSAxMzsKKwl9IGVsc2UgaWYgKCFwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvdGFncy8iKSkgeworCQlraW5kID0gUkVGX1RBRzsKKwkJcmVmbmFtZSArPSAxMDsKKwl9CisKKwkvKiBEb24ndCBhZGQgdHlwZXMgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgKi8KKwlpZiAoKGtpbmQgJiByZWZfbGlzdC0+a2luZHMpID09IDApCisJCXJldHVybiAwOworCisJLyogUmVzaXplIGJ1ZmZlciAqLworCWlmIChyZWZfbGlzdC0+aW5kZXggPj0gcmVmX2xpc3QtPmFsbG9jKSB7CisJCXJlZl9saXN0LT5hbGxvYyA9IGFsbG9jX25yKHJlZl9saXN0LT5hbGxvYyk7CisJCXJlZl9saXN0LT5saXN0ID0geHJlYWxsb2MocmVmX2xpc3QtPmxpc3QsCisJCQkJcmVmX2xpc3QtPmFsbG9jICogc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSkpOworCX0KKworCS8qIFJlY29yZCB0aGUgbmV3IGl0ZW0gKi8KKwluZXdpdGVtID0gJihyZWZfbGlzdC0+bGlzdFtyZWZfbGlzdC0+aW5kZXgrK10pOworCW5ld2l0ZW0tPm5hbWUgPSB4c3RyZHVwKHJlZm5hbWUpOworCW5ld2l0ZW0tPmtpbmQgPSBraW5kOworCWhhc2hjcHkobmV3aXRlbS0+c2hhMSwgc2hhMSk7CisJbGVuID0gc3RybGVuKG5ld2l0ZW0tPm5hbWUpOworCWlmIChsZW4gPiByZWZfbGlzdC0+bWF4d2lkdGgpCisJCXJlZl9saXN0LT5tYXh3aWR0aCA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3JlZl9saXN0KHN0cnVjdCByZWZfbGlzdCAqcmVmX2xpc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVmX2xpc3QtPmluZGV4OyBpKyspCisJCWZyZWUocmVmX2xpc3QtPmxpc3RbaV0ubmFtZSk7CisJZnJlZShyZWZfbGlzdC0+bGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVmX2NtcChjb25zdCB2b2lkICpyMSwgY29uc3Qgdm9pZCAqcjIpCit7CisJc3RydWN0IHJlZl9pdGVtICpjMSA9IChzdHJ1Y3QgcmVmX2l0ZW0gKikocjEpOworCXN0cnVjdCByZWZfaXRlbSAqYzIgPSAoc3RydWN0IHJlZl9pdGVtICopKHIyKTsKKworCWlmIChjMS0+a2luZCAhPSBjMi0+a2luZCkKKwkJcmV0dXJuIGMxLT5raW5kIC0gYzItPmtpbmQ7CisJcmV0dXJuIHN0cmNtcChjMS0+bmFtZSwgYzItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yZWZfaXRlbShzdHJ1Y3QgcmVmX2l0ZW0gKml0ZW0sIGludCBtYXh3aWR0aCwgaW50IHZlcmJvc2UsCisJCQkgICBpbnQgYWJicmV2LCBpbnQgY3VycmVudCkKK3sKKwljaGFyIGM7CisJaW50IGNvbG9yOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwljaGFyIHN1YmplY3RbMjU2XTsKKworCXN3aXRjaCAoaXRlbS0+a2luZCkgeworCWNhc2UgUkVGX0xPQ0FMX0JSQU5DSDoKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfTE9DQUw7CisJCWJyZWFrOworCWNhc2UgUkVGX1JFTU9URV9CUkFOQ0g6CisJCWNvbG9yID0gQ09MT1JfQlJBTkNIX1JFTU9URTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfUExBSU47CisJCWJyZWFrOworCX0KKworCWMgPSAnICc7CisJaWYgKGN1cnJlbnQpIHsKKwkJYyA9ICcqJzsKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfQ1VSUkVOVDsKKwl9CisKKwlpZiAodmVyYm9zZSkgeworCQljb21taXQgPSBsb29rdXBfY29tbWl0KGl0ZW0tPnNoYTEpOworCQlpZiAoY29tbWl0ICYmICFwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJCXByZXR0eV9wcmludF9jb21taXQoQ01JVF9GTVRfT05FTElORSwgY29tbWl0LCB+MCwKKwkJCQkJICAgIHN1YmplY3QsIHNpemVvZihzdWJqZWN0KSwgMCwKKwkJCQkJICAgIE5VTEwsIE5VTEwsIDApOworCQllbHNlCisJCQlzdHJjcHkoc3ViamVjdCwgIiAqKioqIGludmFsaWQgcmVmICoqKioiKTsKKwkJcHJpbnRmKCIlYyAlcyUtKnMlcyAlcyAlc1xuIiwgYywgYnJhbmNoX2dldF9jb2xvcihjb2xvciksCisJCSAgICAgICBtYXh3aWR0aCwgaXRlbS0+bmFtZSwKKwkJICAgICAgIGJyYW5jaF9nZXRfY29sb3IoQ09MT1JfQlJBTkNIX1JFU0VUKSwKKwkJICAgICAgIGZpbmRfdW5pcXVlX2FiYnJldihpdGVtLT5zaGExLCBhYmJyZXYpLCBzdWJqZWN0KTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVjICVzJXMlc1xuIiwgYywgYnJhbmNoX2dldF9jb2xvcihjb2xvciksIGl0ZW0tPm5hbWUsCisJCSAgICAgICBicmFuY2hfZ2V0X2NvbG9yKENPTE9SX0JSQU5DSF9SRVNFVCkpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmVmX2xpc3QoaW50IGtpbmRzLCBpbnQgZGV0YWNoZWQsIGludCB2ZXJib3NlLCBpbnQgYWJicmV2KQoreworCWludCBpOworCXN0cnVjdCByZWZfbGlzdCByZWZfbGlzdDsKKworCW1lbXNldCgmcmVmX2xpc3QsIDAsIHNpemVvZihyZWZfbGlzdCkpOworCXJlZl9saXN0LmtpbmRzID0ga2luZHM7CisJZm9yX2VhY2hfcmVmKGFwcGVuZF9yZWYsICZyZWZfbGlzdCk7CisKKwlxc29ydChyZWZfbGlzdC5saXN0LCByZWZfbGlzdC5pbmRleCwgc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSksIHJlZl9jbXApOworCisJZGV0YWNoZWQgPSAoZGV0YWNoZWQgJiYgKGtpbmRzICYgUkVGX0xPQ0FMX0JSQU5DSCkpOworCWlmIChkZXRhY2hlZCkgeworCQlzdHJ1Y3QgcmVmX2l0ZW0gaXRlbTsKKwkJaXRlbS5uYW1lID0geHN0cmR1cCgiKG5vIGJyYW5jaCkiKTsKKwkJaXRlbS5raW5kID0gUkVGX0xPQ0FMX0JSQU5DSDsKKwkJaGFzaGNweShpdGVtLnNoYTEsIGhlYWRfc2hhMSk7CisJCWlmIChzdHJsZW4oaXRlbS5uYW1lKSA+IHJlZl9saXN0Lm1heHdpZHRoKQorCQkJICAgICAgcmVmX2xpc3QubWF4d2lkdGggPSBzdHJsZW4oaXRlbS5uYW1lKTsKKwkJcHJpbnRfcmVmX2l0ZW0oJml0ZW0sIHJlZl9saXN0Lm1heHdpZHRoLCB2ZXJib3NlLCBhYmJyZXYsIDEpOworCQlmcmVlKGl0ZW0ubmFtZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJlZl9saXN0LmluZGV4OyBpKyspIHsKKwkJaW50IGN1cnJlbnQgPSAhZGV0YWNoZWQgJiYKKwkJCShyZWZfbGlzdC5saXN0W2ldLmtpbmQgPT0gUkVGX0xPQ0FMX0JSQU5DSCkgJiYKKwkJCSFzdHJjbXAocmVmX2xpc3QubGlzdFtpXS5uYW1lLCBoZWFkKTsKKwkJcHJpbnRfcmVmX2l0ZW0oJnJlZl9saXN0Lmxpc3RbaV0sIHJlZl9saXN0Lm1heHdpZHRoLCB2ZXJib3NlLAorCQkJICAgICAgIGFiYnJldiwgY3VycmVudCk7CisJfQorCisJZnJlZV9yZWZfbGlzdCgmcmVmX2xpc3QpOworfQorCitzdGF0aWMgY2hhciAqY29uZmlnX3JlcG87CitzdGF0aWMgY2hhciAqY29uZmlnX3JlbW90ZTsKK3N0YXRpYyBjb25zdCBjaGFyICpzdGFydF9yZWY7CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZV9icmFuY2hfbmFtZShjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljb25zdCBjaGFyICpjb2xvbjsKKwljb25zdCBjaGFyICplbmQ7CisKKwlpZiAoKnZhbHVlID09ICcrJykKKwkJdmFsdWUrKzsKKworCWNvbG9uID0gc3RyY2hyKHZhbHVlLCAnOicpOworCWlmICghY29sb24pCisJCXJldHVybiAwOworCisJZW5kID0gdmFsdWUgKyBzdHJsZW4odmFsdWUpOworCisJLyoKKwkgKiBUcnkgYW4gZXhhY3QgbWF0Y2ggZmlyc3QuICBJLmUuIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUKKwkgKiB2YWx1ZSBpcyAiJGFueXRoaW5nOnJlZnMvZm9vL2Jhci9iYXoiIGFuZCBzdGFydF9yZWYgaXMgZXhhY3RseQorCSAqICJyZWZzL2Zvby9iYXIvYmF6Ii4gVGhlbiB0aGUgbmFtZSBhdCB0aGUgcmVtb3RlIGlzICRhbnl0aGluZy4KKwkgKi8KKwlpZiAoIXN0cmNtcChjb2xvbiArIDEsIHN0YXJ0X3JlZikpIHsKKwkJLyogVHJ1bmNhdGUgdGhlIHZhbHVlIGJlZm9yZSB0aGUgY29sb24uICovCisJCW5mYXNwcmludGYoJmNvbmZpZ19yZXBvLCAiJS4qcyIsIGNvbG9uIC0gdmFsdWUsIHZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBJcyB0aGlzIGEgd2lsZGNhcmQgbWF0Y2g/CisJICovCisJaWYgKChlbmQgLSAyIDw9IHZhbHVlKSB8fCBlbmRbLTJdICE9ICcvJyB8fCBlbmRbLTFdICE9ICcqJyB8fAorCSAgICAoY29sb24gLSAyIDw9IHZhbHVlKSB8fCBjb2xvblstMl0gIT0gJy8nIHx8IGNvbG9uWy0xXSAhPSAnKicpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBWYWx1ZSBpcyAicmVmcy9mb28vYmFyLzxhc3Rlcmlzaz46cmVmcy9iYXovYm9hLzxhc3Rlcmlzaz4iCisJICogYW5kIHN0YXJ0X3JlZiBiZWdpbnMgd2l0aCAicmVmcy9iYXovYm9hLyI7IHRoZSBuYW1lIGF0IHRoZQorCSAqIHJlbW90ZSBpcyByZWZzL2Zvby9iYXIvIHdpdGggdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZQorCSAqIHN0YXJ0X3JlZi4gIFRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBvbiB0aGUgUkhTIGlzIChlbmQgLQorCSAqIGNvbG9uIC0gMiksIGluY2x1ZGluZyB0aGUgc2xhc2ggaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQorCSAqIGFzdGVyaXNrLgorCSAqLworCWlmICgoc3RybGVuKHN0YXJ0X3JlZikgPCBlbmQgLSBjb2xvbiAtIDIpIHx8CisJICAgIG1lbWNtcChzdGFydF9yZWYsIGNvbG9uICsgMSwgZW5kIC0gY29sb24gLSAyKSkKKwkJcmV0dXJuIDA7IC8qIGRvZXMgbm90IG1hdGNoIHByZWZpeCAqLworCisJLyogUmVwbGFjZSB0aGUgYXN0ZXJpc2sgd2l0aCB0aGUgcmVtb3RlIGJyYW5jaCBuYW1lLiAgKi8KKwluZmFzcHJpbnRmKCZjb25maWdfcmVwbywgIiUuKnMlcyIsCisJCSAgIChjb2xvbiAtIDEpIC0gdmFsdWUsIHZhbHVlLAorCQkgICBzdGFydF9yZWYgKyAoZW5kIC0gY29sb24gLSAyKSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZV9jb25maWcoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljb25zdCBjaGFyICp2YXI7CisJaWYgKHByZWZpeGNtcChrZXksICJyZW1vdGUuIikpCisJCXJldHVybiAwOworCisJdmFyID0gc3RycmNocihrZXksICcuJyk7CisJaWYgKHZhciA9PSBrZXkgKyA2IHx8IHN0cmNtcCh2YXIsICIuZmV0Y2giKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBPaywgd2UgYXJlIGxvb2tpbmcgYXQga2V5ID09ICJyZW1vdGUuJGZvby5mZXRjaCI7CisJICovCisJaWYgKGdldF9yZW1vdGVfYnJhbmNoX25hbWUodmFsdWUpKQorCQluZmFzcHJpbnRmKCZjb25maWdfcmVtb3RlLCAiJS4qcyIsIHZhciAtIChrZXkgKyA3KSwga2V5ICsgNyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2JyYW5jaF9tZXJnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpjb25maWdfcmVtb3RlLAorCQkJICAgICBjb25zdCBjaGFyICpjb25maWdfcmVwbykKK3sKKwljaGFyIGtleVsxMDI0XTsKKwlpZiAoc2l6ZW9mKGtleSkgPD0KKwkgICAgc25wcmludGYoa2V5LCBzaXplb2Yoa2V5KSwgImJyYW5jaC4lcy5yZW1vdGUiLCBuYW1lKSkKKwkJZGllKCJ3aGF0IGEgbG9uZyBicmFuY2ggbmFtZSB5b3UgaGF2ZSEiKTsKKwlnaXRfY29uZmlnX3NldChrZXksIGNvbmZpZ19yZW1vdGUpOworCisJLyoKKwkgKiBXZSBkbyBub3QgaGF2ZSB0byBjaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IKKwkgKiB0aGUgJ21lcmdlJyBrZXksIHNpbmNlIGl0J3Mgc2hvcnRlciB0aGFuIHRoZQorCSAqIHByZXZpb3VzICdyZW1vdGUnIGtleSwgd2hpY2ggd2UgYWxyZWFkeSBjaGVja2VkLgorCSAqLworCXNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICJicmFuY2guJXMubWVyZ2UiLCBuYW1lKTsKKwlnaXRfY29uZmlnX3NldChrZXksIGNvbmZpZ19yZXBvKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2JyYW5jaF9kZWZhdWx0cyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyZWFsX3JlZikKK3sKKwkvKgorCSAqIG5hbWUgaXMgdGhlIG5hbWUgb2YgbmV3IGJyYW5jaCB1bmRlciByZWZzL2hlYWRzOworCSAqIHJlYWxfcmVmIGlzIHR5cGljYWxseSByZWZzL3JlbW90ZXMvJGZvby8kYmFyLCB3aGVyZQorCSAqICRmb28gaXMgdGhlIHJlbW90ZSBuYW1lICh0aGVyZSB0eXBpY2FsbHkgYXJlIG5vIHNsYXNoZXMpCisJICogYW5kICRiYXIgaXMgdGhlIGJyYW5jaCBuYW1lIHdlIG1hcCBmcm9tIHRoZSByZW1vdGUKKwkgKiAoaXQgY291bGQgaGF2ZSBzbGFzaGVzKS4KKwkgKi8KKwlzdGFydF9yZWYgPSByZWFsX3JlZjsKKwlnaXRfY29uZmlnKGdldF9yZW1vdGVfY29uZmlnKTsKKwlpZiAoIWNvbmZpZ19yZXBvICYmICFjb25maWdfcmVtb3RlICYmCisJICAgICFwcmVmaXhjbXAocmVhbF9yZWYsICJyZWZzL2hlYWRzLyIpKSB7CisJCXNldF9icmFuY2hfbWVyZ2UobmFtZSwgIi4iLCByZWFsX3JlZik7CisJCXByaW50ZigiQnJhbmNoICVzIHNldCB1cCB0byB0cmFjayBsb2NhbCBicmFuY2ggJXMuXG4iLAorCQkgICAgICAgbmFtZSwgcmVhbF9yZWYpOworCX0KKworCWlmIChjb25maWdfcmVwbyAmJiBjb25maWdfcmVtb3RlKSB7CisJCXNldF9icmFuY2hfbWVyZ2UobmFtZSwgY29uZmlnX3JlbW90ZSwgY29uZmlnX3JlcG8pOworCQlwcmludGYoIkJyYW5jaCAlcyBzZXQgdXAgdG8gdHJhY2sgcmVtb3RlIGJyYW5jaCAlcy5cbiIsCisJCSAgICAgICBuYW1lLCByZWFsX3JlZik7CisJfQorCisJaWYgKGNvbmZpZ19yZXBvKQorCQlmcmVlKGNvbmZpZ19yZXBvKTsKKwlpZiAoY29uZmlnX3JlbW90ZSkKKwkJZnJlZShjb25maWdfcmVtb3RlKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2JyYW5jaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdGFydF9uYW1lLAorCQkJICBpbnQgZm9yY2UsIGludCByZWZsb2csIGludCB0cmFjaykKK3sKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqcmVhbF9yZWYsIHJlZltQQVRIX01BWF0sIG1zZ1tQQVRIX01BWCArIDIwXTsKKwlpbnQgZm9yY2luZyA9IDA7CisKKwlzbnByaW50ZihyZWYsIHNpemVvZiByZWYsICJyZWZzL2hlYWRzLyVzIiwgbmFtZSk7CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJZGllKCInJXMnIGlzIG5vdCBhIHZhbGlkIGJyYW5jaCBuYW1lLiIsIG5hbWUpOworCisJaWYgKHJlc29sdmVfcmVmKHJlZiwgc2hhMSwgMSwgTlVMTCkpIHsKKwkJaWYgKCFmb3JjZSkKKwkJCWRpZSgiQSBicmFuY2ggbmFtZWQgJyVzJyBhbHJlYWR5IGV4aXN0cy4iLCBuYW1lKTsKKwkJZWxzZSBpZiAoIWlzX2JhcmVfcmVwb3NpdG9yeSgpICYmICFzdHJjbXAoaGVhZCwgbmFtZSkpCisJCQlkaWUoIkNhbm5vdCBmb3JjZSB1cGRhdGUgdGhlIGN1cnJlbnQgYnJhbmNoLiIpOworCQlmb3JjaW5nID0gMTsKKwl9CisKKwlyZWFsX3JlZiA9IE5VTEw7CisJaWYgKGdldF9zaGExKHN0YXJ0X25hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lOiAnJXMnLiIsIHN0YXJ0X25hbWUpOworCisJc3dpdGNoIChkd2ltX3JlZihzdGFydF9uYW1lLCBzdHJsZW4oc3RhcnRfbmFtZSksIHNoYTEsICZyZWFsX3JlZikpIHsKKwljYXNlIDA6CisJCS8qIE5vdCBicmFuY2hpbmcgZnJvbSBhbnkgZXhpc3RpbmcgYnJhbmNoICovCisJCXJlYWxfcmVmID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBVbmlxdWUgY29tcGxldGlvbiAtLSBnb29kICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiQW1iaWd1b3VzIG9iamVjdCBuYW1lOiAnJXMnLiIsIHN0YXJ0X25hbWUpOworCQlicmVhazsKKwl9CisKKwlpZiAoKGNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpKSA9PSBOVUxMKQorCQlkaWUoIk5vdCBhIHZhbGlkIGJyYW5jaCBwb2ludDogJyVzJy4iLCBzdGFydF9uYW1lKTsKKwloYXNoY3B5KHNoYTEsIGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCisJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKHJlZiwgTlVMTCk7CisJaWYgKCFsb2NrKQorCQlkaWUoIkZhaWxlZCB0byBsb2NrIHJlZiBmb3IgdXBkYXRlOiAlcy4iLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKHJlZmxvZykKKwkJbG9nX2FsbF9yZWZfdXBkYXRlcyA9IDE7CisKKwlpZiAoZm9yY2luZykKKwkJc25wcmludGYobXNnLCBzaXplb2YgbXNnLCAiYnJhbmNoOiBSZXNldCBmcm9tICVzIiwKKwkJCSBzdGFydF9uYW1lKTsKKwllbHNlCisJCXNucHJpbnRmKG1zZywgc2l6ZW9mIG1zZywgImJyYW5jaDogQ3JlYXRlZCBmcm9tICVzIiwKKwkJCSBzdGFydF9uYW1lKTsKKworCS8qIFdoZW4gYnJhbmNoaW5nIG9mZiBhIHJlbW90ZSBicmFuY2gsIHNldCB1cCBzbyB0aGF0IGdpdC1wdWxsCisJICAgYXV0b21hdGljYWxseSBtZXJnZXMgZnJvbSB0aGVyZS4gIFNvIGZhciwgdGhpcyBpcyBvbmx5IGRvbmUgZm9yCisJICAgcmVtb3RlcyByZWdpc3RlcmVkIHZpYSAuZ2l0L2NvbmZpZy4gICovCisJaWYgKHJlYWxfcmVmICYmIHRyYWNrKQorCQlzZXRfYnJhbmNoX2RlZmF1bHRzKG5hbWUsIHJlYWxfcmVmKTsKKworCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCBzaGExLCBtc2cpIDwgMCkKKwkJZGllKCJGYWlsZWQgdG8gd3JpdGUgcmVmOiAlcy4iLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKHJlYWxfcmVmKQorCQlmcmVlKHJlYWxfcmVmKTsKK30KKworc3RhdGljIHZvaWQgcmVuYW1lX2JyYW5jaChjb25zdCBjaGFyICpvbGRuYW1lLCBjb25zdCBjaGFyICpuZXduYW1lLCBpbnQgZm9yY2UpCit7CisJY2hhciBvbGRyZWZbUEFUSF9NQVhdLCBuZXdyZWZbUEFUSF9NQVhdLCBsb2dtc2dbUEFUSF9NQVgqMiArIDEwMF07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIG9sZHNlY3Rpb25bUEFUSF9NQVhdLCBuZXdzZWN0aW9uW1BBVEhfTUFYXTsKKworCWlmICghb2xkbmFtZSkKKwkJZGllKCJjYW5ub3QgcmVuYW1lIHRoZSBjdXJyZW50IGJyYW5jaCB3aGlsZSBub3Qgb24gYW55LiIpOworCisJaWYgKHNucHJpbnRmKG9sZHJlZiwgc2l6ZW9mKG9sZHJlZiksICJyZWZzL2hlYWRzLyVzIiwgb2xkbmFtZSkgPiBzaXplb2Yob2xkcmVmKSkKKwkJZGllKCJPbGQgYnJhbmNobmFtZSB0b28gbG9uZyIpOworCisJaWYgKGNoZWNrX3JlZl9mb3JtYXQob2xkcmVmKSkKKwkJZGllKCJJbnZhbGlkIGJyYW5jaCBuYW1lOiAlcyIsIG9sZHJlZik7CisKKwlpZiAoc25wcmludGYobmV3cmVmLCBzaXplb2YobmV3cmVmKSwgInJlZnMvaGVhZHMvJXMiLCBuZXduYW1lKSA+IHNpemVvZihuZXdyZWYpKQorCQlkaWUoIk5ldyBicmFuY2huYW1lIHRvbyBsb25nIik7CisKKwlpZiAoY2hlY2tfcmVmX2Zvcm1hdChuZXdyZWYpKQorCQlkaWUoIkludmFsaWQgYnJhbmNoIG5hbWU6ICVzIiwgbmV3cmVmKTsKKworCWlmIChyZXNvbHZlX3JlZihuZXdyZWYsIHNoYTEsIDEsIE5VTEwpICYmICFmb3JjZSkKKwkJZGllKCJBIGJyYW5jaCBuYW1lZCAnJXMnIGFscmVhZHkgZXhpc3RzLiIsIG5ld25hbWUpOworCisJc25wcmludGYobG9nbXNnLCBzaXplb2YobG9nbXNnKSwgIkJyYW5jaDogcmVuYW1lZCAlcyB0byAlcyIsCisJCSBvbGRyZWYsIG5ld3JlZik7CisKKwlpZiAocmVuYW1lX3JlZihvbGRyZWYsIG5ld3JlZiwgbG9nbXNnKSkKKwkJZGllKCJCcmFuY2ggcmVuYW1lIGZhaWxlZCIpOworCisJLyogbm8gbmVlZCB0byBwYXNzIGxvZ21zZyBoZXJlIGFzIEhFQUQgZGlkbid0IHJlYWxseSBtb3ZlICovCisJaWYgKCFzdHJjbXAob2xkbmFtZSwgaGVhZCkgJiYgY3JlYXRlX3N5bXJlZigiSEVBRCIsIG5ld3JlZiwgTlVMTCkpCisJCWRpZSgiQnJhbmNoIHJlbmFtZWQgdG8gJXMsIGJ1dCBIRUFEIGlzIG5vdCB1cGRhdGVkISIsIG5ld25hbWUpOworCisJc25wcmludGYob2xkc2VjdGlvbiwgc2l6ZW9mKG9sZHNlY3Rpb24pLCAiYnJhbmNoLiVzIiwgb2xkcmVmICsgMTEpOworCXNucHJpbnRmKG5ld3NlY3Rpb24sIHNpemVvZihuZXdzZWN0aW9uKSwgImJyYW5jaC4lcyIsIG5ld3JlZiArIDExKTsKKwlpZiAoZ2l0X2NvbmZpZ19yZW5hbWVfc2VjdGlvbihvbGRzZWN0aW9uLCBuZXdzZWN0aW9uKSA8IDApCisJCWRpZSgiQnJhbmNoIGlzIHJlbmFtZWQsIGJ1dCB1cGRhdGUgb2YgY29uZmlnLWZpbGUgZmFpbGVkIik7Cit9CisKK2ludCBjbWRfYnJhbmNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBkZWxldGUgPSAwLCBmb3JjZV9kZWxldGUgPSAwLCBmb3JjZV9jcmVhdGUgPSAwOworCWludCByZW5hbWUgPSAwLCBmb3JjZV9yZW5hbWUgPSAwOworCWludCB2ZXJib3NlID0gMCwgYWJicmV2ID0gREVGQVVMVF9BQkJSRVYsIGRldGFjaGVkID0gMDsKKwlpbnQgcmVmbG9nID0gMCwgdHJhY2s7CisJaW50IGtpbmRzID0gUkVGX0xPQ0FMX0JSQU5DSDsKKwlpbnQgaTsKKworCWdpdF9jb25maWcoZ2l0X2JyYW5jaF9jb25maWcpOworCXRyYWNrID0gYnJhbmNoX3RyYWNrX3JlbW90ZXM7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10cmFjayIpKSB7CisJCQl0cmFjayA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLXRyYWNrIikpIHsKKwkJCXRyYWNrID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1kIikpIHsKKwkJCWRlbGV0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItRCIpKSB7CisJCQlkZWxldGUgPSAxOworCQkJZm9yY2VfZGVsZXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1mIikpIHsKKwkJCWZvcmNlX2NyZWF0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbSIpKSB7CisJCQlyZW5hbWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLU0iKSkgeworCQkJcmVuYW1lID0gMTsKKwkJCWZvcmNlX3JlbmFtZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItciIpKSB7CisJCQlraW5kcyA9IFJFRl9SRU1PVEVfQlJBTkNIOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWEiKSkgeworCQkJa2luZHMgPSBSRUZfUkVNT1RFX0JSQU5DSCB8IFJFRl9MT0NBTF9CUkFOQ0g7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbCIpKSB7CisJCQlyZWZsb2cgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1uby1hYmJyZXYiKSkgeworCQkJYWJicmV2ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2PSIpKSB7CisJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZyArIDksIE5VTEwsIDEwKTsKKwkJCWlmIChhYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCWVsc2UgaWYgKGFiYnJldiA+IDQwKQorCQkJCWFiYnJldiA9IDQwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdmVyYm9zZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWNvbG9yIikpIHsKKwkJCWJyYW5jaF91c2VfY29sb3IgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1jb2xvciIpKSB7CisJCQlicmFuY2hfdXNlX2NvbG9yID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKGJ1aWx0aW5fYnJhbmNoX3VzYWdlKTsKKwl9CisKKwlpZiAoKGRlbGV0ZSAmJiByZW5hbWUpIHx8IChkZWxldGUgJiYgZm9yY2VfY3JlYXRlKSB8fAorCSAgICAocmVuYW1lICYmIGZvcmNlX2NyZWF0ZSkpCisJCXVzYWdlKGJ1aWx0aW5fYnJhbmNoX3VzYWdlKTsKKworCWhlYWQgPSByZXNvbHZlX3JlZigiSEVBRCIsIGhlYWRfc2hhMSwgMCwgTlVMTCk7CisJaWYgKCFoZWFkKQorCQlkaWUoIkZhaWxlZCB0byByZXNvbHZlIEhFQUQgYXMgYSB2YWxpZCByZWYuIik7CisJaGVhZCA9IHhzdHJkdXAoaGVhZCk7CisJaWYgKCFzdHJjbXAoaGVhZCwgIkhFQUQiKSkgeworCQlkZXRhY2hlZCA9IDE7CisJfQorCWVsc2UgeworCQlpZiAocHJlZml4Y21wKGhlYWQsICJyZWZzL2hlYWRzLyIpKQorCQkJZGllKCJIRUFEIG5vdCBmb3VuZCBiZWxvdyByZWZzL2hlYWRzISIpOworCQloZWFkICs9IDExOworCX0KKworCWlmIChkZWxldGUpCisJCXJldHVybiBkZWxldGVfYnJhbmNoZXMoYXJnYyAtIGksIGFyZ3YgKyBpLCBmb3JjZV9kZWxldGUsIGtpbmRzKTsKKwllbHNlIGlmIChpID09IGFyZ2MpCisJCXByaW50X3JlZl9saXN0KGtpbmRzLCBkZXRhY2hlZCwgdmVyYm9zZSwgYWJicmV2KTsKKwllbHNlIGlmIChyZW5hbWUgJiYgKGkgPT0gYXJnYyAtIDEpKQorCQlyZW5hbWVfYnJhbmNoKGhlYWQsIGFyZ3ZbaV0sIGZvcmNlX3JlbmFtZSk7CisJZWxzZSBpZiAocmVuYW1lICYmIChpID09IGFyZ2MgLSAyKSkKKwkJcmVuYW1lX2JyYW5jaChhcmd2W2ldLCBhcmd2W2kgKyAxXSwgZm9yY2VfcmVuYW1lKTsKKwllbHNlIGlmIChpID09IGFyZ2MgLSAxIHx8IGkgPT0gYXJnYyAtIDIpCisJCWNyZWF0ZV9icmFuY2goYXJndltpXSwgKGkgPT0gYXJnYyAtIDIpID8gYXJndltpKzFdIDogaGVhZCwKKwkJCSAgICAgIGZvcmNlX2NyZWF0ZSwgcmVmbG9nLCB0cmFjayk7CisJZWxzZQorCQl1c2FnZShidWlsdGluX2JyYW5jaF91c2FnZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tYnVuZGxlLmMgYi9idWlsdGluLWJ1bmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmFkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWJ1bmRsZS5jCkBAIC0wLDAgKzEsMzgwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsaXN0LW9iamVjdHMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCisvKgorICogQmFzaWMgaGFuZGxlciBmb3IgYnVuZGxlIGZpbGVzIHRvIGNvbm5lY3QgcmVwb3NpdG9yaWVzIHZpYSBzbmVha2VybmV0LgorICogSW52b2NhdGlvbiBtdXN0IGluY2x1ZGUgYWN0aW9uLgorICogVGhpcyBmdW5jdGlvbiBjYW4gY3JlYXRlIGEgYnVuZGxlIG9yIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gYW4gZXhpc3RpbmcKKyAqIGJ1bmRsZSBzdXBwb3J0aW5nIGdpdC1mZXRjaCwgZ2l0LXB1bGwsIGFuZCBnaXQtbHMtcmVtb3RlCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmJ1bmRsZV91c2FnZT0iZ2l0LWJ1bmRsZSAoY3JlYXRlIDxidW5kbGU+IDxnaXQtcmV2LWxpc3QgYXJncz4gfCB2ZXJpZnkgPGJ1bmRsZT4gfCBsaXN0LWhlYWRzIDxidW5kbGU+IFtyZWZuYW1lXS4uLiB8IHVuYnVuZGxlIDxidW5kbGU+IFtyZWZuYW1lXS4uLiApIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYnVuZGxlX3NpZ25hdHVyZVtdID0gIiMgdjIgZ2l0IGJ1bmRsZVxuIjsKKworc3RydWN0IHJlZl9saXN0IHsKKwl1bnNpZ25lZCBpbnQgbnIsIGFsbG9jOworCXN0cnVjdCByZWZfbGlzdF9lbnRyeSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgKm5hbWU7CisJfSAqbGlzdDsKK307CisKK3N0YXRpYyB2b2lkIGFkZF90b19yZWZfbGlzdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QpCit7CisJaWYgKGxpc3QtPm5yICsgMSA+PSBsaXN0LT5hbGxvYykgeworCQlsaXN0LT5hbGxvYyA9IGFsbG9jX25yKGxpc3QtPm5yICsgMSk7CisJCWxpc3QtPmxpc3QgPSB4cmVhbGxvYyhsaXN0LT5saXN0LAorCQkJCWxpc3QtPmFsbG9jICogc2l6ZW9mKGxpc3QtPmxpc3RbMF0pKTsKKwl9CisJbWVtY3B5KGxpc3QtPmxpc3RbbGlzdC0+bnJdLnNoYTEsIHNoYTEsIDIwKTsKKwlsaXN0LT5saXN0W2xpc3QtPm5yXS5uYW1lID0geHN0cmR1cChuYW1lKTsKKwlsaXN0LT5ucisrOworfQorCitzdHJ1Y3QgYnVuZGxlX2hlYWRlciB7CisJc3RydWN0IHJlZl9saXN0IHByZXJlcXVpc2l0ZXM7CisJc3RydWN0IHJlZl9saXN0IHJlZmVyZW5jZXM7Cit9OworCisvKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCitzdGF0aWMgaW50IHJlYWRfc3RyaW5nKGludCBmZCwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgeworCQlzc2l6ZV90IGNvdW50ID0geHJlYWQoZmQsIGJ1ZmZlciArIGksIDEpOworCQlpZiAoY291bnQgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJSZWFkIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmZmVyW2ldID09ICdcbicpCisJCQlicmVhazsKKwl9CisJYnVmZmVyW2kgKyAxXSA9ICdcMCc7CisJcmV0dXJuIGkgKyAxOworfQorCisvKiByZXR1cm5zIGFuIGZkICovCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBidW5kbGVfaGVhZGVyICpoZWFkZXIpIHsKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiBlcnJvcigiY291bGQgbm90IG9wZW4gJyVzJyIsIHBhdGgpOworCWlmIChyZWFkX3N0cmluZyhmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPCAwIHx8CisJCQlzdHJjbXAoYnVmZmVyLCBidW5kbGVfc2lnbmF0dXJlKSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiBlcnJvcigiJyVzJyBkb2VzIG5vdCBsb29rIGxpa2UgYSB2MiBidW5kbGUgZmlsZSIsIHBhdGgpOworCX0KKwl3aGlsZSAocmVhZF9zdHJpbmcoZmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID4gMAorCQkJJiYgYnVmZmVyWzBdICE9ICdcbicpIHsKKwkJaW50IGlzX3ByZXJlcSA9IGJ1ZmZlclswXSA9PSAnLSc7CisJCWludCBvZmZzZXQgPSBpc19wcmVyZXEgPyAxIDogMDsKKwkJaW50IGxlbiA9IHN0cmxlbihidWZmZXIpOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QgPSBpc19wcmVyZXEgPyAmaGVhZGVyLT5wcmVyZXF1aXNpdGVzCisJCQk6ICZoZWFkZXItPnJlZmVyZW5jZXM7CisJCWNoYXIgZGVsaW07CisKKwkJaWYgKGJ1ZmZlcltsZW4gLSAxXSA9PSAnXG4nKQorCQkJYnVmZmVyW2xlbiAtIDFdID0gJ1wwJzsKKwkJaWYgKGdldF9zaGExX2hleChidWZmZXIgKyBvZmZzZXQsIHNoYTEpKSB7CisJCQl3YXJuaW5nKCJ1bnJlY29nbml6ZWQgaGVhZGVyOiAlcyIsIGJ1ZmZlcik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZWxpbSA9IGJ1ZmZlcls0MCArIG9mZnNldF07CisJCWlmICghaXNzcGFjZShkZWxpbSkgJiYgKGRlbGltICE9ICdcMCcgfHwgIWlzX3ByZXJlcSkpCisJCQlkaWUgKCJpbnZhbGlkIGhlYWRlcjogJXMiLCBidWZmZXIpOworCQlhZGRfdG9fcmVmX2xpc3Qoc2hhMSwgaXNzcGFjZShkZWxpbSkgPworCQkJCWJ1ZmZlciArIDQxICsgb2Zmc2V0IDogIiIsIGxpc3QpOworCX0KKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgbGlzdF9yZWZzKHN0cnVjdCByZWZfbGlzdCAqciwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHItPm5yOyBpKyspIHsKKwkJaWYgKGFyZ2MgPiAxKSB7CisJCQlpbnQgajsKKwkJCWZvciAoaiA9IDE7IGogPCBhcmdjOyBqKyspCisJCQkJaWYgKCFzdHJjbXAoci0+bGlzdFtpXS5uYW1lLCBhcmd2W2pdKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBhcmdjKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZigiJXMgJXNcbiIsIHNoYTFfdG9faGV4KHItPmxpc3RbaV0uc2hhMSksCisJCQkJci0+bGlzdFtpXS5uYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFJFUkVRX01BUksgKDF1PDwxNikKKworc3RhdGljIGludCB2ZXJpZnlfYnVuZGxlKHN0cnVjdCBidW5kbGVfaGVhZGVyICpoZWFkZXIsIGludCB2ZXJib3NlKQoreworCS8qCisJICogRG8gZmFzdCBjaGVjaywgdGhlbiBpZiBhbnkgcHJlcmVxcyBhcmUgbWlzc2luZyB0aGVuIGdvIGxpbmUgYnkgbGluZQorCSAqIHRvIGJlIHZlcmJvc2UgYWJvdXQgdGhlIGVycm9ycworCSAqLworCXN0cnVjdCByZWZfbGlzdCAqcCA9ICZoZWFkZXItPnByZXJlcXVpc2l0ZXM7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJY29uc3QgY2hhciAqYXJndltdID0ge05VTEwsICItLWFsbCJ9OworCXN0cnVjdCBvYmplY3RfYXJyYXkgcmVmczsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJaW50IGksIHJldCA9IDAsIHJlcV9ucjsKKwljb25zdCBjaGFyICptZXNzYWdlID0gIlJlcG9zaXRvcnkgbGFja3MgdGhlc2UgcHJlcmVxdWlzaXRlIGNvbW1pdHM6IjsKKworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnI7IGkrKykgeworCQlzdHJ1Y3QgcmVmX2xpc3RfZW50cnkgKmUgPSBwLT5saXN0ICsgaTsKKwkJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChlLT5zaGExKTsKKwkJaWYgKG8pIHsKKwkJCW8tPmZsYWdzIHw9IFBSRVJFUV9NQVJLOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCBvLCBlLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgrK3JldCA9PSAxKQorCQkJZXJyb3IobWVzc2FnZSk7CisJCWVycm9yKCIlcyAlcyIsIHNoYTFfdG9faGV4KGUtPnNoYTEpLCBlLT5uYW1lKTsKKwl9CisJaWYgKHJldnMucGVuZGluZy5uciAhPSBwLT5ucikKKwkJcmV0dXJuIHJldDsKKwlyZXFfbnIgPSByZXZzLnBlbmRpbmcubnI7CisJc2V0dXBfcmV2aXNpb25zKDIsIGFyZ3YsICZyZXZzLCBOVUxMKTsKKworCW1lbXNldCgmcmVmcywgMCwgc2l6ZW9mKHN0cnVjdCBvYmplY3RfYXJyYXkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZSA9IHJldnMucGVuZGluZy5vYmplY3RzICsgaTsKKwkJYWRkX29iamVjdF9hcnJheShlLT5pdGVtLCBlLT5uYW1lLCAmcmVmcyk7CisJfQorCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKTsKKworCWkgPSByZXFfbnI7CisJd2hpbGUgKGkgJiYgKGNvbW1pdCA9IGdldF9yZXZpc2lvbigmcmV2cykpKQorCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBQUkVSRVFfTUFSSykKKwkJCWktLTsKKworCWZvciAoaSA9IDA7IGkgPCByZXFfbnI7IGkrKykKKwkJaWYgKCEocmVmcy5vYmplY3RzW2ldLml0ZW0tPmZsYWdzICYgU0hPV04pKSB7CisJCQlpZiAoKytyZXQgPT0gMSkKKwkJCQllcnJvcihtZXNzYWdlKTsKKwkJCWVycm9yKCIlcyAlcyIsIHNoYTFfdG9faGV4KHJlZnMub2JqZWN0c1tpXS5pdGVtLT5zaGExKSwKKwkJCQlyZWZzLm9iamVjdHNbaV0ubmFtZSk7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCByZWZzLm5yOyBpKyspCisJCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKXJlZnMub2JqZWN0c1tpXS5pdGVtLCAtMSk7CisKKwlpZiAodmVyYm9zZSkgeworCQlzdHJ1Y3QgcmVmX2xpc3QgKnI7CisKKwkJciA9ICZoZWFkZXItPnJlZmVyZW5jZXM7CisJCXByaW50ZigiVGhlIGJ1bmRsZSBjb250YWlucyAlZCByZWYlc1xuIiwKKwkJICAgICAgIHItPm5yLCAoMSA8IHItPm5yKSA/ICJzIiA6ICIiKTsKKwkJbGlzdF9yZWZzKHIsIDAsIE5VTEwpOworCQlyID0gJmhlYWRlci0+cHJlcmVxdWlzaXRlczsKKwkJcHJpbnRmKCJUaGUgYnVuZGxlIHJlcXVpcmVzIHRoZXNlICVkIHJlZiVzXG4iLAorCQkgICAgICAgci0+bnIsICgxIDwgci0+bnIpID8gInMiIDogIiIpOworCQlsaXN0X3JlZnMociwgMCwgTlVMTCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGlzdF9oZWFkcyhzdHJ1Y3QgYnVuZGxlX2hlYWRlciAqaGVhZGVyLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGxpc3RfcmVmcygmaGVhZGVyLT5yZWZlcmVuY2VzLCBhcmdjLCBhcmd2KTsKK30KKworc3RhdGljIGludCBjcmVhdGVfYnVuZGxlKHN0cnVjdCBidW5kbGVfaGVhZGVyICpoZWFkZXIsIGNvbnN0IGNoYXIgKnBhdGgsCisJCWludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgYnVuZGxlX2ZkID0gLTE7CisJY29uc3QgY2hhciAqKmFyZ3ZfYm91bmRhcnkgPSB4bWFsbG9jKChhcmdjICsgNCkgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJY29uc3QgY2hhciAqKmFyZ3ZfcGFjayA9IHhtYWxsb2MoNSAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKwlpbnQgaSwgcmVmX2NvdW50ID0gMDsKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBybHM7CisKKwlidW5kbGVfZmQgPSAoIXN0cmNtcChwYXRoLCAiLSIpID8gMSA6CisJCQlvcGVuKHBhdGgsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2NikpOworCWlmIChidW5kbGVfZmQgPCAwKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgJyVzJzogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCisJLyogd3JpdGUgc2lnbmF0dXJlICovCisJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgYnVuZGxlX3NpZ25hdHVyZSwgc3RybGVuKGJ1bmRsZV9zaWduYXR1cmUpKTsKKworCS8qIGluaXQgcmV2cyB0byBsaXN0IG9iamVjdHMgZm9yIHBhY2stb2JqZWN0cyBsYXRlciAqLworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIE5VTEwpOworCisJLyogd3JpdGUgcHJlcmVxdWlzaXRlcyAqLworCW1lbWNweShhcmd2X2JvdW5kYXJ5ICsgMywgYXJndiArIDEsIGFyZ2MgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJYXJndl9ib3VuZGFyeVswXSA9ICJyZXYtbGlzdCI7CisJYXJndl9ib3VuZGFyeVsxXSA9ICItLWJvdW5kYXJ5IjsKKwlhcmd2X2JvdW5kYXJ5WzJdID0gIi0tcHJldHR5PW9uZWxpbmUiOworCWFyZ3ZfYm91bmRhcnlbYXJnYyArIDJdID0gTlVMTDsKKwltZW1zZXQoJnJscywgMCwgc2l6ZW9mKHJscykpOworCXJscy5hcmd2ID0gYXJndl9ib3VuZGFyeTsKKwlybHMub3V0ID0gLTE7CisJcmxzLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKChpID0gcmVhZF9zdHJpbmcocmxzLm91dCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpID4gMCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoYnVmZmVyWzBdID09ICctJykgeworCQkJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgYnVmZmVyLCBpKTsKKwkJCWlmICghZ2V0X3NoYTFfaGV4KGJ1ZmZlciArIDEsIHNoYTEpKSB7CisJCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJCW9iamVjdC0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCQlhZGRfcGVuZGluZ19vYmplY3QoJnJldnMsIG9iamVjdCwgYnVmZmVyKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJCW9iamVjdC0+ZmxhZ3MgfD0gU0hPV047CisJCX0KKwl9CisJaWYgKGZpbmlzaF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gZXJyb3IoInJldi1saXN0IGRpZWQiKTsKKworCS8qIHdyaXRlIHJlZmVyZW5jZXMgKi8KKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXZzLCBOVUxMKTsKKwlpZiAoYXJnYyA+IDEpCisJCXJldHVybiBlcnJvcigidW5yZWNvZ25pemVkIGFyZ3VtZW50OiAlcyciLCBhcmd2WzFdKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXZzLnBlbmRpbmcubnI7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICplID0gcmV2cy5wZW5kaW5nLm9iamVjdHMgKyBpOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljaGFyICpyZWY7CisKKwkJaWYgKGUtPml0ZW0tPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQlpZiAoZHdpbV9yZWYoZS0+bmFtZSwgc3RybGVuKGUtPm5hbWUpLCBzaGExLCAmcmVmKSAhPSAxKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgcmVmcyB3ZSB3cm90ZSBvdXQgaXMgY29ycmVjdDsgLS1tYXgtY291bnQgYW5kCisJCSAqIG90aGVyIGxpbWl0aW5nIG9wdGlvbnMgY291bGQgaGF2ZSBwcmV2ZW50ZWQgYWxsIHRoZSB0aXBzCisJCSAqIGZyb20gZ2V0dGluZyBvdXRwdXQuCisJCSAqLworCQlpZiAoIShlLT5pdGVtLT5mbGFncyAmIFNIT1dOKSkgeworCQkJd2FybmluZygicmVmICclcycgaXMgZXhjbHVkZWQgYnkgdGhlIHJldi1saXN0IG9wdGlvbnMiLAorCQkJCWUtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJcmVmX2NvdW50Kys7CisJCXdyaXRlX29yX2RpZShidW5kbGVfZmQsIHNoYTFfdG9faGV4KGUtPml0ZW0tPnNoYTEpLCA0MCk7CisJCXdyaXRlX29yX2RpZShidW5kbGVfZmQsICIgIiwgMSk7CisJCXdyaXRlX29yX2RpZShidW5kbGVfZmQsIHJlZiwgc3RybGVuKHJlZikpOworCQl3cml0ZV9vcl9kaWUoYnVuZGxlX2ZkLCAiXG4iLCAxKTsKKwkJZnJlZShyZWYpOworCX0KKwlpZiAoIXJlZl9jb3VudCkKKwkJZGllICgiUmVmdXNpbmcgdG8gY3JlYXRlIGVtcHR5IGJ1bmRsZS4iKTsKKworCS8qIGVuZCBoZWFkZXIgKi8KKwl3cml0ZV9vcl9kaWUoYnVuZGxlX2ZkLCAiXG4iLCAxKTsKKworCS8qIHdyaXRlIHBhY2sgKi8KKwlhcmd2X3BhY2tbMF0gPSAicGFjay1vYmplY3RzIjsKKwlhcmd2X3BhY2tbMV0gPSAiLS1hbGwtcHJvZ3Jlc3MiOworCWFyZ3ZfcGFja1syXSA9ICItLXN0ZG91dCI7CisJYXJndl9wYWNrWzNdID0gIi0tdGhpbiI7CisJYXJndl9wYWNrWzRdID0gTlVMTDsKKwltZW1zZXQoJnJscywgMCwgc2l6ZW9mKHJscykpOworCXJscy5hcmd2ID0gYXJndl9wYWNrOworCXJscy5pbiA9IC0xOworCXJscy5vdXQgPSBidW5kbGVfZmQ7CisJcmxzLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBzcGF3biBwYWNrLW9iamVjdHMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcmV2cy5wZW5kaW5nLm9iamVjdHNbaV0uaXRlbTsKKwkJaWYgKG9iamVjdC0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJd3JpdGUocmxzLmluLCAiXiIsIDEpOworCQl3cml0ZShybHMuaW4sIHNoYTFfdG9faGV4KG9iamVjdC0+c2hhMSksIDQwKTsKKwkJd3JpdGUocmxzLmluLCAiXG4iLCAxKTsKKwl9CisJaWYgKGZpbmlzaF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gZXJyb3IgKCJwYWNrLW9iamVjdHMgZGllZCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuYnVuZGxlKHN0cnVjdCBidW5kbGVfaGVhZGVyICpoZWFkZXIsIGludCBidW5kbGVfZmQsCisJCWludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICphcmd2X2luZGV4X3BhY2tbXSA9IHsiaW5kZXgtcGFjayIsCisJCSItLWZpeC10aGluIiwgIi0tc3RkaW4iLCBOVUxMfTsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBpcDsKKworCWlmICh2ZXJpZnlfYnVuZGxlKGhlYWRlciwgMCkpCisJCXJldHVybiAtMTsKKwltZW1zZXQoJmlwLCAwLCBzaXplb2YoaXApKTsKKwlpcC5hcmd2ID0gYXJndl9pbmRleF9wYWNrOworCWlwLmluID0gYnVuZGxlX2ZkOworCWlwLm5vX3N0ZG91dCA9IDE7CisJaXAuZ2l0X2NtZCA9IDE7CisJaWYgKHJ1bl9jb21tYW5kKCZpcCkpCisJCXJldHVybiBlcnJvcigiaW5kZXgtcGFjayBkaWVkIik7CisJcmV0dXJuIGxpc3RfaGVhZHMoaGVhZGVyLCBhcmdjLCBhcmd2KTsKK30KKworaW50IGNtZF9idW5kbGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGJ1bmRsZV9oZWFkZXIgaGVhZGVyOworCWludCBub25naXQgPSAwOworCWNvbnN0IGNoYXIgKmNtZCwgKmJ1bmRsZV9maWxlOworCWludCBidW5kbGVfZmQgPSAtMTsKKwljaGFyIGJ1ZmZlcltQQVRIX01BWF07CisKKwlpZiAoYXJnYyA8IDMpCisJCXVzYWdlKGJ1bmRsZV91c2FnZSk7CisKKwljbWQgPSBhcmd2WzFdOworCWJ1bmRsZV9maWxlID0gYXJndlsyXTsKKwlhcmdjIC09IDI7CisJYXJndiArPSAyOworCisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisJaWYgKHByZWZpeCAmJiBidW5kbGVfZmlsZVswXSAhPSAnLycpIHsKKwkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzLyVzIiwgcHJlZml4LCBidW5kbGVfZmlsZSk7CisJCWJ1bmRsZV9maWxlID0gYnVmZmVyOworCX0KKworCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaWYgKHN0cmNtcChjbWQsICJjcmVhdGUiKSAmJgorCQkJKGJ1bmRsZV9mZCA9IHJlYWRfaGVhZGVyKGJ1bmRsZV9maWxlLCAmaGVhZGVyKSkgPCAwKQorCQlyZXR1cm4gMTsKKworCWlmICghc3RyY21wKGNtZCwgInZlcmlmeSIpKSB7CisJCWNsb3NlKGJ1bmRsZV9mZCk7CisJCWlmICh2ZXJpZnlfYnVuZGxlKCZoZWFkZXIsIDEpKQorCQkJcmV0dXJuIDE7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgaXMgb2theVxuIiwgYnVuZGxlX2ZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoY21kLCAibGlzdC1oZWFkcyIpKSB7CisJCWNsb3NlKGJ1bmRsZV9mZCk7CisJCXJldHVybiAhIWxpc3RfaGVhZHMoJmhlYWRlciwgYXJnYywgYXJndik7CisJfQorCWlmICghc3RyY21wKGNtZCwgImNyZWF0ZSIpKSB7CisJCWlmIChub25naXQpCisJCQlkaWUoIk5lZWQgYSByZXBvc2l0b3J5IHRvIGNyZWF0ZSBhIGJ1bmRsZS4iKTsKKwkJcmV0dXJuICEhY3JlYXRlX2J1bmRsZSgmaGVhZGVyLCBidW5kbGVfZmlsZSwgYXJnYywgYXJndik7CisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInVuYnVuZGxlIikpIHsKKwkJaWYgKG5vbmdpdCkKKwkJCWRpZSgiTmVlZCBhIHJlcG9zaXRvcnkgdG8gdW5idW5kbGUuIik7CisJCXJldHVybiAhIXVuYnVuZGxlKCZoZWFkZXIsIGJ1bmRsZV9mZCwgYXJnYywgYXJndik7CisJfSBlbHNlCisJCXVzYWdlKGJ1bmRsZV91c2FnZSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNhdC1maWxlLmMgYi9idWlsdGluLWNhdC1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMmQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2F0LWZpbGUuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgdm9pZCBwcHJpbnRfdGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qIHRoZSBwYXJzZXIgaW4gdGFnLmMgaXMgdXNlbGVzcyBoZXJlLiAqLworCWNvbnN0IGNoYXIgKmVuZHAgPSBidWYgKyBzaXplOworCWNvbnN0IGNoYXIgKmNwID0gYnVmOworCisJd2hpbGUgKGNwIDwgZW5kcCkgeworCQljaGFyIGMgPSAqY3ArKzsKKwkJaWYgKGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoNyA8PSBlbmRwIC0gY3AgJiYgIW1lbWNtcCgidGFnZ2VyICIsIGNwLCA3KSkgeworCQkJY29uc3QgY2hhciAqdGFnZ2VyID0gY3A7CisKKwkJCS8qIEZvdW5kIHRoZSB0YWdnZXIgbGluZS4gIENvcHkgb3V0IHRoZSBjb250ZW50cworCQkJICogb2YgdGhlIGJ1ZmZlciBzbyBmYXIuCisJCQkgKi8KKwkJCXdyaXRlX29yX2RpZSgxLCBidWYsIGNwIC0gYnVmKTsKKworCQkJLyoKKwkJCSAqIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCwgbGlrZSBwcmV0dHktcHJpbnRpbmcKKwkJCSAqIHRoZSBkYXRlLgorCQkJICovCisJCQl3aGlsZSAoY3AgPCBlbmRwKSB7CisJCQkJaWYgKCpjcCsrID09ICdcbicpIHsKKwkJCQkJLyogdGFnZ2VyIHRvIGNwIGlzIGEgbGluZQorCQkJCQkgKiB0aGF0IGhhcyBpZGVudCBhbmQgdGltZS4KKwkJCQkJICovCisJCQkJCWNvbnN0IGNoYXIgKnNwID0gdGFnZ2VyOworCQkJCQljaGFyICplcDsKKwkJCQkJdW5zaWduZWQgbG9uZyBkYXRlOworCQkJCQlsb25nIHR6OworCQkJCQl3aGlsZSAoc3AgPCBjcCAmJiAqc3AgIT0gJz4nKQorCQkJCQkJc3ArKzsKKwkJCQkJaWYgKHNwID09IGNwKSB7CisJCQkJCQkvKiBnaXZlIHVwICovCisJCQkJCQl3cml0ZV9vcl9kaWUoMSwgdGFnZ2VyLAorCQkJCQkJCSAgICAgY3AgLSB0YWdnZXIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJd2hpbGUgKHNwIDwgY3AgJiYKKwkJCQkJICAgICAgICEoJzAnIDw9ICpzcCAmJiAqc3AgPD0gJzknKSkKKwkJCQkJCXNwKys7CisJCQkJCXdyaXRlX29yX2RpZSgxLCB0YWdnZXIsIHNwIC0gdGFnZ2VyKTsKKwkJCQkJZGF0ZSA9IHN0cnRvdWwoc3AsICZlcCwgMTApOworCQkJCQl0eiA9IHN0cnRvbChlcCwgTlVMTCwgMTApOworCQkJCQlzcCA9IHNob3dfZGF0ZShkYXRlLCB0eiwgMCk7CisJCQkJCXdyaXRlX29yX2RpZSgxLCBzcCwgc3RybGVuKHNwKSk7CisJCQkJCXh3cml0ZSgxLCAiXG4iLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIDwgZW5kcCAmJiAqY3AgPT0gJ1xuJykKKwkJCS8qIGVuZCBvZiBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNvcGllZCBvdXQgdGhlIGhlYWRlciB1cCB0byB0aGUgZW5kIG9mCisJICogdGhlIHRhZ2dlciBsaW5lIGFuZCBjcCBwb2ludHMgYXQgb25lIHBhc3QgXG4uICBJdCBjb3VsZCBiZSB0aGUKKwkgKiBuZXh0IGhlYWRlciBsaW5lIGFmdGVyIHRoZSB0YWdnZXIgbGluZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlcgorCSAqIFxuIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgaGVhZGVycy4gIFdlIG5lZWQgdG8gY29weSBvdXQgdGhlCisJICogcmVtYWluZGVyIGFzIGlzLgorCSAqLworCWlmIChjcCA8IGVuZHApCisJCXdyaXRlX29yX2RpZSgxLCBjcCwgZW5kcCAtIGNwKTsKK30KKworaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBvcHQ7CisJY29uc3QgY2hhciAqZXhwX3R5cGUsICpvYmpfbmFtZTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZSgiZ2l0LWNhdC1maWxlIFstdHwtc3wtZXwtcHw8dHlwZT5dIDxzaGExPiIpOworCWV4cF90eXBlID0gYXJndlsxXTsKKwlvYmpfbmFtZSA9IGFyZ3ZbMl07CisKKwlpZiAoZ2V0X3NoYTEob2JqX25hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgb2JqX25hbWUpOworCisJb3B0ID0gMDsKKwlpZiAoIGV4cF90eXBlWzBdID09ICctJyApIHsKKwkJb3B0ID0gZXhwX3R5cGVbMV07CisJCWlmICggIW9wdCB8fCBleHBfdHlwZVsyXSApCisJCQlvcHQgPSAtMTsgLyogTm90IGEgc2luZ2xlIGNoYXJhY3RlciBvcHRpb24gKi8KKwl9CisKKwlidWYgPSBOVUxMOworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAndCc6CisJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsIE5VTEwpOworCQlpZiAodHlwZSA+IDApIHsKKwkJCXByaW50ZigiJXNcbiIsIHR5cGVuYW1lKHR5cGUpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsICZzaXplKTsKKwkJaWYgKHR5cGUgPiAwKSB7CisJCQlwcmludGYoIiVsdVxuIiwgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgJ2UnOgorCQlyZXR1cm4gIWhhc19zaGExX2ZpbGUoc2hhMSk7CisKKwljYXNlICdwJzoKKwkJdHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgTlVMTCk7CisJCWlmICh0eXBlIDwgMCkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBvYmpfbmFtZSk7CisKKwkJLyogY3VzdG9tIHByZXR0eS1wcmludCBoZXJlICovCisJCWlmICh0eXBlID09IE9CSl9UUkVFKSB7CisJCQljb25zdCBjaGFyICpsc19hcmdzWzNdID0geyJscy10cmVlIiwgb2JqX25hbWUsIE5VTEx9OworCQkJcmV0dXJuIGNtZF9sc190cmVlKDIsIGxzX2FyZ3MsIE5VTEwpOworCQl9CisKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFidWYpCisJCQlkaWUoIkNhbm5vdCByZWFkIG9iamVjdCAlcyIsIG9ial9uYW1lKTsKKwkJaWYgKHR5cGUgPT0gT0JKX1RBRykgeworCQkJcHByaW50X3RhZyhzaGExLCBidWYsIHNpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBvdGhlcndpc2UganVzdCBzcGl0IG91dCB0aGUgZGF0YSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIGV4cF90eXBlLCAmc2l6ZSwgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGllKCJnaXQtY2F0LWZpbGU6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgZXhwX3R5cGUpOworCX0KKworCWlmICghYnVmKQorCQlkaWUoImdpdC1jYXQtZmlsZSAlczogYmFkIGZpbGUiLCBvYmpfbmFtZSk7CisKKwl3cml0ZV9vcl9kaWUoMSwgYnVmLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY2hlY2stYXR0ci5jIGIvYnVpbHRpbi1jaGVjay1hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3N2Y3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2hlY2stYXR0ci5jCkBAIC0wLDAgKzEsNTkgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiYXR0ci5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGNoZWNrX2F0dHJfdXNhZ2VbXSA9CisiZ2l0LWNoZWNrLWF0dHIgYXR0ci4uLiBbLS1dIHBhdGhuYW1lLi4uIjsKKworaW50IGNtZF9jaGVja19hdHRyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2s7CisJaW50IGNudCwgaSwgZG91YmxlZGFzaDsKKworCWRvdWJsZWRhc2ggPSAtMTsKKwlmb3IgKGkgPSAxOyBkb3VibGVkYXNoIDwgMCAmJiBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKQorCQkJZG91YmxlZGFzaCA9IGk7CisJfQorCisJLyogSWYgdGhlcmUgaXMgbm8gZG91YmxlIGRhc2gsIHdlIGhhbmRsZSBvbmx5IG9uZSBhdHRyaWJ1dGUgKi8KKwlpZiAoZG91YmxlZGFzaCA8IDApIHsKKwkJY250ID0gMTsKKwkJZG91YmxlZGFzaCA9IDE7CisJfSBlbHNlCisJCWNudCA9IGRvdWJsZWRhc2ggLSAxOworCWRvdWJsZWRhc2grKzsKKworCWlmIChjbnQgPD0gMCB8fCBhcmdjIDwgZG91YmxlZGFzaCkKKwkJdXNhZ2UoY2hlY2tfYXR0cl91c2FnZSk7CisJY2hlY2sgPSB4Y2FsbG9jKGNudCwgc2l6ZW9mKCpjaGVjaykpOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQljb25zdCBjaGFyICpuYW1lOworCQlzdHJ1Y3QgZ2l0X2F0dHIgKmE7CisJCW5hbWUgPSBhcmd2W2kgKyAxXTsKKwkJYSA9IGdpdF9hdHRyKG5hbWUsIHN0cmxlbihuYW1lKSk7CisJCWlmICghYSkKKwkJCXJldHVybiBlcnJvcigiJXM6IG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBuYW1lIiwgbmFtZSk7CisJCWNoZWNrW2ldLmF0dHIgPSBhOworCX0KKworCWZvciAoaSA9IGRvdWJsZWRhc2g7IGkgPCBhcmdjOyBpKyspIHsKKwkJaW50IGo7CisJCWlmIChnaXRfY2hlY2thdHRyKGFyZ3ZbaV0sIGNudCwgY2hlY2spKQorCQkJZGllKCJnaXRfY2hlY2thdHRyIGRpZWQiKTsKKwkJZm9yIChqID0gMDsgaiA8IGNudDsgaisrKSB7CisJCQljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrW2pdLnZhbHVlOworCisJCQlpZiAoQVRUUl9UUlVFKHZhbHVlKSkKKwkJCQl2YWx1ZSA9ICJzZXQiOworCQkJZWxzZSBpZiAoQVRUUl9GQUxTRSh2YWx1ZSkpCisJCQkJdmFsdWUgPSAidW5zZXQiOworCQkJZWxzZSBpZiAoQVRUUl9VTlNFVCh2YWx1ZSkpCisJCQkJdmFsdWUgPSAidW5zcGVjaWZpZWQiOworCisJCQl3cml0ZV9uYW1lX3F1b3RlZCgiIiwgMCwgYXJndltpXSwgMSwgc3Rkb3V0KTsKKwkJCXByaW50ZigiOiAlczogJXNcbiIsIGFyZ3ZbaisxXSwgdmFsdWUpOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0LmMgYi9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA0YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK2ludCBjbWRfY2hlY2tfcmVmX2Zvcm1hdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoYXJnYyAhPSAyKQorCQl1c2FnZSgiZ2l0LWNoZWNrLXJlZi1mb3JtYXQgcmVmbmFtZSIpOworCXJldHVybiAhIWNoZWNrX3JlZl9mb3JtYXQoYXJndlsxXSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNoZWNrb3V0LWluZGV4LmMgYi9idWlsdGluLWNoZWNrb3V0LWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MGY5NwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2hlY2tvdXQtaW5kZXguYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENoZWNrLW91dCBmaWxlcyBmcm9tIHRoZSAiY3VycmVudCBjYWNoZSBkaXJlY3RvcnkiCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKgorICogQ2FyZWZ1bDogb3JkZXIgb2YgYXJndW1lbnQgZmxhZ3MgZG9lcyBtYXR0ZXIuIEZvciBleGFtcGxlLAorICoKKyAqCWdpdC1jaGVja291dC1pbmRleCAtYSAtZiBmaWxlLmMKKyAqCisgKiBXaWxsIGZpcnN0IGNoZWNrIG91dCBhbGwgZmlsZXMgbGlzdGVkIGluIHRoZSBjYWNoZSAoYnV0IG5vdAorICogb3ZlcndyaXRlIGFueSBvbGQgb25lcyksIGFuZCB0aGVuIGZvcmNlLWNoZWNrb3V0ICJmaWxlLmMiIGEKKyAqIHNlY29uZCB0aW1lIChpZSB0aGF0IG9uZSBfd2lsbF8gb3ZlcndyaXRlIGFueSBvbGQgY29udGVudHMKKyAqIHdpdGggdGhlIHNhbWUgZmlsZW5hbWUpLgorICoKKyAqIEFsc28sIGp1c3QgZG9pbmcgImdpdC1jaGVja291dC1pbmRleCIgZG9lcyBub3RoaW5nLiBZb3UgcHJvYmFibHkKKyAqIG1lYW50ICJnaXQtY2hlY2tvdXQtaW5kZXggLWEiLiBBbmQgaWYgeW91IHdhbnQgdG8gZm9yY2UgaXQsIHlvdQorICogd2FudCAiZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hIi4KKyAqCisgKiBJbnR1aXRpdmVuZXNzIGlzIG5vdCB0aGUgZ29hbCBoZXJlLiBSZXBlYXRhYmlsaXR5IGlzLiBUaGUKKyAqIHJlYXNvbiBmb3IgdGhlICJubyBhcmd1bWVudHMgbWVhbnMgbm8gd29yayIgdGhpbmcgaXMgdGhhdAorICogZnJvbSBzY3JpcHRzIHlvdSBhcmUgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBkbyB0aGluZ3MgbGlrZQorICoKKyAqCWZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgeGFyZ3MgLTAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tCisgKgorICogb3I6CisgKgorICoJZmluZCAuIC1uYW1lICcqLmgnIC1wcmludDAgfCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXogLS1zdGRpbgorICoKKyAqIHdoaWNoIHdpbGwgZm9yY2UgYWxsIGV4aXN0aW5nICouaCBmaWxlcyB0byBiZSByZXBsYWNlZCB3aXRoCisgKiB0aGVpciBjYWNoZWQgY29waWVzLiBJZiBhbiBlbXB0eSBjb21tYW5kIGxpbmUgaW1wbGllZCAiYWxsIiwKKyAqIHRoZW4gdGhpcyB3b3VsZCBmb3JjZS1yZWZyZXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhY2hlLCB3aGljaAorICogd2FzIG5vdCB0aGUgcG9pbnQuCisgKgorICogT2gsIGFuZCB0aGUgIi0tIiBpcyBqdXN0IGEgZ29vZCBpZGVhIHdoZW4geW91IGtub3cgdGhlIHJlc3QKKyAqIHdpbGwgYmUgZmlsZW5hbWVzLiBKdXN0IHNvIHRoYXQgeW91IHdvdWxkbid0IGhhdmUgYSBmaWxlbmFtZQorICogb2YgIi1hIiBjYXVzaW5nIHByb2JsZW1zIChub3QgcG9zc2libGUgaW4gdGhlIGFib3ZlIGV4YW1wbGUsCisgKiBidXQgZ2V0IHVzZWQgdG8gaXQgaW4gc2NyaXB0aW5nISkuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisjZGVmaW5lIENIRUNLT1VUX0FMTCA0CitzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworc3RhdGljIGludCBjaGVja291dF9zdGFnZTsgLyogZGVmYXVsdCB0byBjaGVja291dCBzdGFnZTAgKi8KK3N0YXRpYyBpbnQgdG9fdGVtcGZpbGU7CitzdGF0aWMgY2hhciB0b3BhdGhbNF1bUEFUSF9NQVggKyAxXTsKKworc3RhdGljIHN0cnVjdCBjaGVja291dCBzdGF0ZTsKKworc3RhdGljIHZvaWQgd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWludCBpOworCisJaWYgKENIRUNLT1VUX0FMTCA9PSBjaGVja291dF9zdGFnZSkgeworCQlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisJCQlpZiAoaSA+IDEpCisJCQkJcHV0Y2hhcignICcpOworCQkJaWYgKHRvcGF0aFtpXVswXSkKKwkJCQlmcHV0cyh0b3BhdGhbaV0sIHN0ZG91dCk7CisJCQllbHNlCisJCQkJcHV0Y2hhcignLicpOworCQl9CisJfSBlbHNlCisJCWZwdXRzKHRvcGF0aFtjaGVja291dF9zdGFnZV0sIHN0ZG91dCk7CisKKwlwdXRjaGFyKCdcdCcpOworCXdyaXRlX25hbWVfcXVvdGVkKCIiLCAwLCBuYW1lICsgcHJlZml4X2xlbmd0aCwKKwkJbGluZV90ZXJtaW5hdGlvbiwgc3Rkb3V0KTsKKwlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl0b3BhdGhbaV1bMF0gPSAwOworCX0KK30KKworc3RhdGljIGludCBjaGVja291dF9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhuYW1lLCBuYW1lbGVuKTsKKwlpbnQgaGFzX3NhbWVfbmFtZSA9IDA7CisJaW50IGRpZF9jaGVja291dCA9IDA7CisJaW50IGVycnMgPSAwOworCisJaWYgKHBvcyA8IDApCisJCXBvcyA9IC1wb3MgLSAxOworCisJd2hpbGUgKHBvcyA8IGFjdGl2ZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCWlmIChjZV9uYW1lbGVuKGNlKSAhPSBuYW1lbGVuIHx8CisJCSAgICBtZW1jbXAoY2UtPm5hbWUsIG5hbWUsIG5hbWVsZW4pKQorCQkJYnJlYWs7CisJCWhhc19zYW1lX25hbWUgPSAxOworCQlwb3MrKzsKKwkJaWYgKGNlX3N0YWdlKGNlKSAhPSBjaGVja291dF9zdGFnZQorCQkgICAgJiYgKENIRUNLT1VUX0FMTCAhPSBjaGVja291dF9zdGFnZSB8fCAhY2Vfc3RhZ2UoY2UpKSkKKwkJCWNvbnRpbnVlOworCQlkaWRfY2hlY2tvdXQgPSAxOworCQlpZiAoY2hlY2tvdXRfZW50cnkoY2UsICZzdGF0ZSwKKwkJICAgIHRvX3RlbXBmaWxlID8gdG9wYXRoW2NlX3N0YWdlKGNlKV0gOiBOVUxMKSA8IDApCisJCQllcnJzKys7CisJfQorCisJaWYgKGRpZF9jaGVja291dCkgeworCQlpZiAodG9fdGVtcGZpbGUpCisJCQl3cml0ZV90ZW1wZmlsZV9yZWNvcmQobmFtZSwgcHJlZml4X2xlbmd0aCk7CisJCXJldHVybiBlcnJzID4gMCA/IC0xIDogMDsKKwl9CisKKwlpZiAoIXN0YXRlLnF1aWV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0LWNoZWNrb3V0LWluZGV4OiAlcyAiLCBuYW1lKTsKKwkJaWYgKCFoYXNfc2FtZV9uYW1lKQorCQkJZnByaW50ZihzdGRlcnIsICJpcyBub3QgaW4gdGhlIGNhY2hlIik7CisJCWVsc2UgaWYgKGNoZWNrb3V0X3N0YWdlKQorCQkJZnByaW50ZihzdGRlcnIsICJkb2VzIG5vdCBleGlzdCBhdCBzdGFnZSAlZCIsCisJCQkJY2hlY2tvdXRfc3RhZ2UpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgImlzIHVubWVyZ2VkIik7CisJCWZwdXRjKCdcbicsIHN0ZGVycik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tvdXRfYWxsKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHByZWZpeF9sZW5ndGgpCit7CisJaW50IGksIGVycnMgPSAwOworCXN0cnVjdCBjYWNoZV9lbnRyeSogbGFzdF9jZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yIDsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHByZWZpeCAmJiAqcHJlZml4ICYmCisJCSAgICAoY2VfbmFtZWxlbihjZSkgPD0gcHJlZml4X2xlbmd0aCB8fAorCQkgICAgIG1lbWNtcChwcmVmaXgsIGNlLT5uYW1lLCBwcmVmaXhfbGVuZ3RoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKGxhc3RfY2UgJiYgdG9fdGVtcGZpbGUpIHsKKwkJCWlmIChjZV9uYW1lbGVuKGxhc3RfY2UpICE9IGNlX25hbWVsZW4oY2UpCisJCQkgICAgfHwgbWVtY21wKGxhc3RfY2UtPm5hbWUsIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSkpCisJCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUsIHByZWZpeF9sZW5ndGgpOworCQl9CisJCWlmIChjaGVja291dF9lbnRyeShjZSwgJnN0YXRlLAorCQkgICAgdG9fdGVtcGZpbGUgPyB0b3BhdGhbY2Vfc3RhZ2UoY2UpXSA6IE5VTEwpIDwgMCkKKwkJCWVycnMrKzsKKwkJbGFzdF9jZSA9IGNlOworCX0KKwlpZiAobGFzdF9jZSAmJiB0b190ZW1wZmlsZSkKKwkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUsIHByZWZpeF9sZW5ndGgpOworCWlmIChlcnJzKQorCQkvKiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBvdXIgZXJyb3IgcmVwb3J0aW5nLgorCQkgKiBleGl0IHdpdGggdGhlIHNhbWUgY29kZSBhcyBkaWUoKS4KKwkJICovCisJCWV4aXQoMTI4KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY2hlY2tvdXRfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWNoZWNrb3V0LWluZGV4IFstdV0gWy1xXSBbLWFdIFstZl0gWy1uXSBbLS1zdGFnZT1bMTIzXXxhbGxdIFstLXByZWZpeD08c3RyaW5nPl0gWy0tdGVtcF0gWy0tXSA8ZmlsZT4uLi4iOworCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfY2hlY2tvdXRfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJaW50IG5ld2ZkID0gLTE7CisJaW50IGFsbCA9IDA7CisJaW50IHJlYWRfZnJvbV9zdGRpbiA9IDA7CisJaW50IHByZWZpeF9sZW5ndGg7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJc3RhdGUuYmFzZV9kaXIgPSAiIjsKKwlwcmVmaXhfbGVuZ3RoID0gcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApIHsKKwkJZGllKCJpbnZhbGlkIGNhY2hlIik7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1hIikgfHwgIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQlhbGwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSB8fCAhc3RyY21wKGFyZywgIi0tZm9yY2UiKSkgeworCQkJc3RhdGUuZm9yY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXEiKSB8fCAhc3RyY21wKGFyZywgIi0tcXVpZXQiKSkgeworCQkJc3RhdGUucXVpZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSB8fCAhc3RyY21wKGFyZywgIi0tbm8tY3JlYXRlIikpIHsKKwkJCXN0YXRlLm5vdF9uZXcgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXUiKSB8fCAhc3RyY21wKGFyZywgIi0taW5kZXgiKSkgeworCQkJc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQlpZiAobmV3ZmQgPCAwKQorCQkJCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSwgMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RkaW4iKSkgeworCQkJaWYgKGkgIT0gYXJnYyAtIDEpCisJCQkJZGllKCItLXN0ZGluIG11c3QgYmUgYXQgdGhlIGVuZCIpOworCQkJcmVhZF9mcm9tX3N0ZGluID0gMTsKKwkJCWkrKzsgLyogZG8gbm90IGNvbnNpZGVyIGFyZyBhcyBhIGZpbGUgbmFtZSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10ZW1wIikpIHsKKwkJCXRvX3RlbXBmaWxlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcHJlZml4PSIpKSB7CisJCQlzdGF0ZS5iYXNlX2RpciA9IGFyZys5OworCQkJc3RhdGUuYmFzZV9kaXJfbGVuID0gc3RybGVuKHN0YXRlLmJhc2VfZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tc3RhZ2U9IikpIHsKKwkJCWlmICghc3RyY21wKGFyZyArIDgsICJhbGwiKSkgeworCQkJCXRvX3RlbXBmaWxlID0gMTsKKwkJCQljaGVja291dF9zdGFnZSA9IENIRUNLT1VUX0FMTDsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGNoID0gYXJnWzhdOworCQkJCWlmICgnMScgPD0gY2ggJiYgY2ggPD0gJzMnKQorCQkJCQljaGVja291dF9zdGFnZSA9IGFyZ1s4XSAtICcwJzsKKwkJCQllbHNlCisJCQkJCWRpZSgic3RhZ2Ugc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMyBvciBhbGwiKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhcmdbMF0gPT0gJy0nKQorCQkJdXNhZ2UoY2hlY2tvdXRfY2FjaGVfdXNhZ2UpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdGUuYmFzZV9kaXJfbGVuIHx8IHRvX3RlbXBmaWxlKSB7CisJCS8qIHdoZW4gLS1wcmVmaXggaXMgc3BlY2lmaWVkIHdlIGRvIG5vdAorCQkgKiB3YW50IHRvIHVwZGF0ZSBjYWNoZS4KKwkJICovCisJCWlmIChzdGF0ZS5yZWZyZXNoX2NhY2hlKSB7CisJCQljbG9zZShuZXdmZCk7IG5ld2ZkID0gLTE7CisJCQlyb2xsYmFja19sb2NrX2ZpbGUoJmxvY2tfZmlsZSk7CisJCX0KKwkJc3RhdGUucmVmcmVzaF9jYWNoZSA9IDA7CisJfQorCisJLyogQ2hlY2sgb3V0IG5hbWVkIGZpbGVzIGZpcnN0ICovCisJZm9yICggOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNvbnN0IGNoYXIgKnA7CisKKwkJaWYgKGFsbCkKKwkJCWRpZSgiZ2l0LWNoZWNrb3V0LWluZGV4OiBkb24ndCBtaXggJy0tYWxsJyBhbmQgZXhwbGljaXQgZmlsZW5hbWVzIik7CisJCWlmIChyZWFkX2Zyb21fc3RkaW4pCisJCQlkaWUoImdpdC1jaGVja291dC1pbmRleDogZG9uJ3QgbWl4ICctLXN0ZGluJyBhbmQgZXhwbGljaXQgZmlsZW5hbWVzIik7CisJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGFyZyk7CisJCWNoZWNrb3V0X2ZpbGUocCwgcHJlZml4X2xlbmd0aCk7CisJCWlmIChwIDwgYXJnIHx8IHAgPiBhcmcgKyBzdHJsZW4oYXJnKSkKKwkJCWZyZWUoKGNoYXIqKXApOworCX0KKworCWlmIChyZWFkX2Zyb21fc3RkaW4pIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCWlmIChhbGwpCisJCQlkaWUoImdpdC1jaGVja291dC1pbmRleDogZG9uJ3QgbWl4ICctLWFsbCcgYW5kICctLXN0ZGluJyIpOworCQlzdHJidWZfaW5pdCgmYnVmKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnBhdGhfbmFtZTsKKwkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCXJlYWRfbGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCQlpZiAoYnVmLmVvZikKKwkJCQlicmVhazsKKwkJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIGJ1Zi5idWZbMF0gPT0gJyInKQorCQkJCXBhdGhfbmFtZSA9IHVucXVvdGVfY19zdHlsZShidWYuYnVmLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlwYXRoX25hbWUgPSBidWYuYnVmOworCQkJcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgcGF0aF9uYW1lKTsKKwkJCWNoZWNrb3V0X2ZpbGUocCwgcHJlZml4X2xlbmd0aCk7CisJCQlpZiAocCA8IHBhdGhfbmFtZSB8fCBwID4gcGF0aF9uYW1lICsgc3RybGVuKHBhdGhfbmFtZSkpCisJCQkJZnJlZSgoY2hhciAqKXApOworCQkJaWYgKHBhdGhfbmFtZSAhPSBidWYuYnVmKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJfQorCX0KKworCWlmIChhbGwpCisJCWNoZWNrb3V0X2FsbChwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCisJaWYgKDAgPD0gbmV3ZmQgJiYKKwkgICAgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgIGNsb3NlKG5ld2ZkKSB8fCBjb21taXRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUpKSkKKwkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY29tbWl0LXRyZWUuYyBiL2J1aWx0aW4tY29tbWl0LXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JjYmUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jb21taXQtdHJlZS5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInV0ZjguaCIKKworI2RlZmluZSBCTE9DS0lORyAoMXVsIDw8IDE0KQorCisvKgorICogRklYTUUhIFNoYXJlIHRoZSBjb2RlIHdpdGggIndyaXRlLXRyZWUuYyIKKyAqLworc3RhdGljIHZvaWQgaW5pdF9idWZmZXIoY2hhciAqKmJ1ZnAsIHVuc2lnbmVkIGludCAqc2l6ZXApCit7CisJKmJ1ZnAgPSB4bWFsbG9jKEJMT0NLSU5HKTsKKwkqc2l6ZXAgPSAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfYnVmZmVyKGNoYXIgKipidWZwLCB1bnNpZ25lZCBpbnQgKnNpemVwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIG9uZV9saW5lWzIwNDhdOworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgYWxsb2MsIHNpemUsIG5ld3NpemU7CisJY2hhciAqYnVmOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c25wcmludGYob25lX2xpbmUsIHNpemVvZihvbmVfbGluZSksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXNpemUgPSAqc2l6ZXA7CisJbmV3c2l6ZSA9IHNpemUgKyBsZW4gKyAxOworCWFsbG9jID0gKHNpemUgKyAzMjc2NykgJiB+MzI3Njc7CisJYnVmID0gKmJ1ZnA7CisJaWYgKG5ld3NpemUgPiBhbGxvYykgeworCQlhbGxvYyA9IChuZXdzaXplICsgMzI3NjcpICYgfjMyNzY3OworCQlidWYgPSB4cmVhbGxvYyhidWYsIGFsbG9jKTsKKwkJKmJ1ZnAgPSBidWY7CisJfQorCSpzaXplcCA9IG5ld3NpemUgLSAxOworCW1lbWNweShidWYgKyBzaXplLCBvbmVfbGluZSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfdmFsaWQodW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSBleHBlY3QpCit7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwlpZiAodHlwZSA8IDApCisJCWRpZSgiJXMgaXMgbm90IGEgdmFsaWQgb2JqZWN0Iiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmICh0eXBlICE9IGV4cGVjdCkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCAnJXMnIG9iamVjdCIsIHNoYTFfdG9faGV4KHNoYTEpLAorCQkgICAgdHlwZW5hbWUoZXhwZWN0KSk7Cit9CisKKy8qCisgKiBIYXZpbmcgbW9yZSB0aGFuIHR3byBwYXJlbnRzIGlzIG5vdCBzdHJhbmdlIGF0IGFsbCwgYW5kIHRoaXMgaXMKKyAqIGhvdyBtdWx0aS13YXkgbWVyZ2VzIGFyZSByZXByZXNlbnRlZC4KKyAqLworI2RlZmluZSBNQVhQQVJFTlQgKDE2KQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFyZW50X3NoYTFbTUFYUEFSRU5UXVsyMF07CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbW1pdF90cmVlX3VzYWdlW10gPSAiZ2l0LWNvbW1pdC10cmVlIDxzaGExPiBbLXAgPHNoYTE+XSogPCBjaGFuZ2Vsb2ciOworCitzdGF0aWMgaW50IG5ld19wYXJlbnQoaW50IGlkeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzaGExID0gcGFyZW50X3NoYTFbaWR4XTsKKwlmb3IgKGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKwkJaWYgKCFoYXNoY21wKHBhcmVudF9zaGExW2ldLCBzaGExKSkgeworCQkJZXJyb3IoImR1cGxpY2F0ZSBwYXJlbnQgJXMgaWdub3JlZCIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciBjb21taXRfdXRmOF93YXJuW10gPQorIldhcm5pbmc6IGNvbW1pdCBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gVVRGLTguXG4iCisiWW91IG1heSB3YW50IHRvIGFtZW5kIGl0IGFmdGVyIGZpeGluZyB0aGUgbWVzc2FnZSwgb3Igc2V0IHRoZSBjb25maWdcbiIKKyJ2YXJpYWJsZSBpMThuLmNvbW1pdGVuY29kaW5nIHRvIHRoZSBlbmNvZGluZyB5b3VyIHByb2plY3QgdXNlcy5cbiI7CisKK2ludCBjbWRfY29tbWl0X3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJaW50IHBhcmVudHMgPSAwOworCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyIGNvbW1pdF9zaGExWzIwXTsKKwljaGFyIGNvbW1lbnRbMTAwMF07CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGludCBzaXplOworCWludCBlbmNvZGluZ19pc191dGY4OworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShjb21taXRfdHJlZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHRyZWVfc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCWNoZWNrX3ZhbGlkKHRyZWVfc2hhMSwgT0JKX1RSRUUpOworCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpICs9IDIpIHsKKwkJY29uc3QgY2hhciAqYSwgKmI7CisJCWEgPSBhcmd2W2ldOyBiID0gYXJndltpKzFdOworCQlpZiAoIWIgfHwgc3RyY21wKGEsICItcCIpKQorCQkJdXNhZ2UoY29tbWl0X3RyZWVfdXNhZ2UpOworCisJCWlmIChwYXJlbnRzID49IE1BWFBBUkVOVCkKKwkJCWRpZSgiVG9vIG1hbnkgcGFyZW50cyAoJWQgbWF4KSIsIE1BWFBBUkVOVCk7CisJCWlmIChnZXRfc2hhMShiLCBwYXJlbnRfc2hhMVtwYXJlbnRzXSkpCisJCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYik7CisJCWNoZWNrX3ZhbGlkKHBhcmVudF9zaGExW3BhcmVudHNdLCBPQkpfQ09NTUlUKTsKKwkJaWYgKG5ld19wYXJlbnQocGFyZW50cykpCisJCQlwYXJlbnRzKys7CisJfQorCisJLyogTm90IGhhdmluZyBpMThuLmNvbW1pdGVuY29kaW5nIGlzIHRoZSBzYW1lIGFzIGhhdmluZyB1dGYtOCAqLworCWVuY29kaW5nX2lzX3V0ZjggPSBpc19lbmNvZGluZ191dGY4KGdpdF9jb21taXRfZW5jb2RpbmcpOworCisJaW5pdF9idWZmZXIoJmJ1ZmZlciwgJnNpemUpOworCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJ0cmVlICVzXG4iLCBzaGExX3RvX2hleCh0cmVlX3NoYTEpKTsKKworCS8qCisJICogTk9URSEgVGhpcyBvcmRlcmluZyBtZWFucyB0aGF0IHRoZSBzYW1lIGV4YWN0IHRyZWUgbWVyZ2VkIHdpdGggYQorCSAqIGRpZmZlcmVudCBvcmRlciBvZiBwYXJlbnRzIHdpbGwgYmUgYSBfZGlmZmVyZW50XyBjaGFuZ2VzZXQgZXZlbgorCSAqIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGF5cyB0aGUgc2FtZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFyZW50czsgaSsrKQorCQlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLCAicGFyZW50ICVzXG4iLCBzaGExX3RvX2hleChwYXJlbnRfc2hhMVtpXSkpOworCisJLyogUGVyc29uL2RhdGUgaW5mb3JtYXRpb24gKi8KKwlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLCAiYXV0aG9yICVzXG4iLCBnaXRfYXV0aG9yX2luZm8oMSkpOworCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJjb21taXR0ZXIgJXNcbiIsIGdpdF9jb21taXR0ZXJfaW5mbygxKSk7CisJaWYgKCFlbmNvZGluZ19pc191dGY4KQorCQlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLAorCQkJCSJlbmNvZGluZyAlc1xuIiwgZ2l0X2NvbW1pdF9lbmNvZGluZyk7CisJYWRkX2J1ZmZlcigmYnVmZmVyLCAmc2l6ZSwgIlxuIik7CisKKwkvKiBBbmQgYWRkIHRoZSBjb21tZW50ICovCisJd2hpbGUgKGZnZXRzKGNvbW1lbnQsIHNpemVvZihjb21tZW50KSwgc3RkaW4pICE9IE5VTEwpCisJCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICIlcyIsIGNvbW1lbnQpOworCisJLyogQW5kIGNoZWNrIHRoZSBlbmNvZGluZyAqLworCWJ1ZmZlcltzaXplXSA9ICdcMCc7CisJaWYgKGVuY29kaW5nX2lzX3V0ZjggJiYgIWlzX3V0ZjgoYnVmZmVyKSkKKwkJZnByaW50ZihzdGRlcnIsIGNvbW1pdF91dGY4X3dhcm4pOworCisJaWYgKCF3cml0ZV9zaGExX2ZpbGUoYnVmZmVyLCBzaXplLCBjb21taXRfdHlwZSwgY29tbWl0X3NoYTEpKSB7CisJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdF9zaGExKSk7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jb25maWcuYyBiL2J1aWx0aW4tY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMjMzOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY29uZmlnLmMKQEAgLTAsMCArMSwyNDYgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X2NvbmZpZ19zZXRfdXNhZ2VbXSA9CisiZ2l0LWNvbmZpZyBbIC0tZ2xvYmFsIHwgLS1zeXN0ZW0gXSBbIC0tYm9vbCB8IC0taW50IF0gWy0tZ2V0IHwgLS1nZXQtYWxsIHwgLS1nZXQtcmVnZXhwIHwgLS1yZXBsYWNlLWFsbCB8IC0tYWRkIHwgLS11bnNldCB8IC0tdW5zZXQtYWxsXSBuYW1lIFt2YWx1ZSBbdmFsdWVfcmVnZXhdXSB8IC0tcmVuYW1lLXNlY3Rpb24gb2xkX25hbWUgbmV3X25hbWUgfCAtLXJlbW92ZS1zZWN0aW9uIG5hbWUgfCAtLWxpc3QiOworCitzdGF0aWMgY2hhciAqa2V5Oworc3RhdGljIHJlZ2V4X3QgKmtleV9yZWdleHA7CitzdGF0aWMgcmVnZXhfdCAqcmVnZXhwOworc3RhdGljIGludCBzaG93X2tleXM7CitzdGF0aWMgaW50IHVzZV9rZXlfcmVnZXhwOworc3RhdGljIGludCBkb19hbGw7CitzdGF0aWMgaW50IGRvX25vdF9tYXRjaDsKK3N0YXRpYyBpbnQgc2VlbjsKK3N0YXRpYyBlbnVtIHsgVF9SQVcsIFRfSU5ULCBUX0JPT0wgfSB0eXBlID0gVF9SQVc7CisKK3N0YXRpYyBpbnQgc2hvd19hbGxfY29uZmlnKGNvbnN0IGNoYXIgKmtleV8sIGNvbnN0IGNoYXIgKnZhbHVlXykKK3sKKwlpZiAodmFsdWVfKQorCQlwcmludGYoIiVzPSVzXG4iLCBrZXlfLCB2YWx1ZV8pOworCWVsc2UKKwkJcHJpbnRmKCIlc1xuIiwga2V5Xyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19jb25maWcoY29uc3QgY2hhcioga2V5XywgY29uc3QgY2hhciogdmFsdWVfKQoreworCWNoYXIgdmFsdWVbMjU2XTsKKwljb25zdCBjaGFyICp2cHRyID0gdmFsdWU7CisJaW50IGR1cF9lcnJvciA9IDA7CisKKwlpZiAoIXVzZV9rZXlfcmVnZXhwICYmIHN0cmNtcChrZXlfLCBrZXkpKQorCQlyZXR1cm4gMDsKKwlpZiAodXNlX2tleV9yZWdleHAgJiYgcmVnZXhlYyhrZXlfcmVnZXhwLCBrZXlfLCAwLCBOVUxMLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKHJlZ2V4cCAhPSBOVUxMICYmCisJCQkgKGRvX25vdF9tYXRjaCBeCisJCQkgIHJlZ2V4ZWMocmVnZXhwLCAodmFsdWVfP3ZhbHVlXzoiIiksIDAsIE5VTEwsIDApKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2hvd19rZXlzKSB7CisJCWlmICh2YWx1ZV8pCisJCQlwcmludGYoIiVzICIsIGtleV8pOworCQllbHNlCisJCQlwcmludGYoIiVzIiwga2V5Xyk7CisJfQorCWlmIChzZWVuICYmICFkb19hbGwpCisJCWR1cF9lcnJvciA9IDE7CisJaWYgKHR5cGUgPT0gVF9JTlQpCisJCXNwcmludGYodmFsdWUsICIlZCIsIGdpdF9jb25maWdfaW50KGtleV8sIHZhbHVlXz92YWx1ZV86IiIpKTsKKwllbHNlIGlmICh0eXBlID09IFRfQk9PTCkKKwkJdnB0ciA9IGdpdF9jb25maWdfYm9vbChrZXlfLCB2YWx1ZV8pID8gInRydWUiIDogImZhbHNlIjsKKwllbHNlCisJCXZwdHIgPSB2YWx1ZV8/dmFsdWVfOiIiOworCXNlZW4rKzsKKwlpZiAoZHVwX2Vycm9yKSB7CisJCWVycm9yKCJNb3JlIHRoYW4gb25lIHZhbHVlIGZvciB0aGUga2V5ICVzOiAlcyIsCisJCQkJa2V5XywgdnB0cik7CisJfQorCWVsc2UKKwkJcHJpbnRmKCIlc1xuIiwgdnB0cik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmFsdWUoY29uc3QgY2hhcioga2V5XywgY29uc3QgY2hhciogcmVnZXhfKQoreworCWludCByZXQgPSAtMTsKKwljaGFyICp0bDsKKwljaGFyICpnbG9iYWwgPSBOVUxMLCAqcmVwb19jb25maWcgPSBOVUxMOworCWNvbnN0IGNoYXIgKnN5c3RlbV93aWRlID0gTlVMTCwgKmxvY2FsOworCisJbG9jYWwgPSBnZXRlbnYoQ09ORklHX0VOVklST05NRU5UKTsKKwlpZiAoIWxvY2FsKSB7CisJCWNvbnN0IGNoYXIgKmhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwkJbG9jYWwgPSBnZXRlbnYoQ09ORklHX0xPQ0FMX0VOVklST05NRU5UKTsKKwkJaWYgKCFsb2NhbCkKKwkJCWxvY2FsID0gcmVwb19jb25maWcgPSB4c3RyZHVwKGdpdF9wYXRoKCJjb25maWciKSk7CisJCWlmIChob21lKQorCQkJZ2xvYmFsID0geHN0cmR1cChta3BhdGgoIiVzLy5naXRjb25maWciLCBob21lKSk7CisJCXN5c3RlbV93aWRlID0gRVRDX0dJVENPTkZJRzsKKwl9CisKKwlrZXkgPSB4c3RyZHVwKGtleV8pOworCWZvciAodGw9a2V5K3N0cmxlbihrZXkpLTE7IHRsID49IGtleSAmJiAqdGwgIT0gJy4nOyAtLXRsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisJZm9yICh0bD1rZXk7ICp0bCAmJiAqdGwgIT0gJy4nOyArK3RsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisKKwlpZiAodXNlX2tleV9yZWdleHApIHsKKwkJa2V5X3JlZ2V4cCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCWlmIChyZWdjb21wKGtleV9yZWdleHAsIGtleSwgUkVHX0VYVEVOREVEKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGtleSBwYXR0ZXJuOiAlc1xuIiwga2V5Xyk7CisJCQlnb3RvIGZyZWVfc3RyaW5nczsKKwkJfQorCX0KKworCWlmIChyZWdleF8pIHsKKwkJaWYgKHJlZ2V4X1swXSA9PSAnIScpIHsKKwkJCWRvX25vdF9tYXRjaCA9IDE7CisJCQlyZWdleF8rKzsKKwkJfQorCisJCXJlZ2V4cCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCWlmIChyZWdjb21wKHJlZ2V4cCwgcmVnZXhfLCBSRUdfRVhURU5ERUQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0dGVybjogJXNcbiIsIHJlZ2V4Xyk7CisJCQlnb3RvIGZyZWVfc3RyaW5nczsKKwkJfQorCX0KKworCWlmIChkb19hbGwgJiYgc3lzdGVtX3dpZGUpCisJCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBzeXN0ZW1fd2lkZSk7CisJaWYgKGRvX2FsbCAmJiBnbG9iYWwpCisJCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBnbG9iYWwpOworCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBsb2NhbCk7CisJaWYgKCFkb19hbGwgJiYgIXNlZW4gJiYgZ2xvYmFsKQorCQlnaXRfY29uZmlnX2Zyb21fZmlsZShzaG93X2NvbmZpZywgZ2xvYmFsKTsKKwlpZiAoIWRvX2FsbCAmJiAhc2VlbiAmJiBzeXN0ZW1fd2lkZSkKKwkJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc2hvd19jb25maWcsIHN5c3RlbV93aWRlKTsKKworCWZyZWUoa2V5KTsKKwlpZiAocmVnZXhwKSB7CisJCXJlZ2ZyZWUocmVnZXhwKTsKKwkJZnJlZShyZWdleHApOworCX0KKworCWlmIChkb19hbGwpCisJCXJldCA9ICFzZWVuOworCWVsc2UKKwkJcmV0ID0gKHNlZW4gPT0gMSkgPyAwIDogc2VlbiA+IDEgPyAyIDogMTsKKworZnJlZV9zdHJpbmdzOgorCWZyZWUocmVwb19jb25maWcpOworCWZyZWUoZ2xvYmFsKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY21kX2NvbmZpZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbm9uZ2l0ID0gMDsKKwlzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKworCXdoaWxlICgxIDwgYXJnYykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1pbnQiKSkKKwkJCXR5cGUgPSBUX0lOVDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1ib29sIikpCisJCQl0eXBlID0gVF9CT09MOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWxpc3QiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWcoc2hvd19hbGxfY29uZmlnKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nbG9iYWwiKSkgeworCQkJY2hhciAqaG9tZSA9IGdldGVudigiSE9NRSIpOworCQkJaWYgKGhvbWUpIHsKKwkJCQljaGFyICp1c2VyX2NvbmZpZyA9IHhzdHJkdXAobWtwYXRoKCIlcy8uZ2l0Y29uZmlnIiwgaG9tZSkpOworCQkJCXNldGVudigiR0lUX0NPTkZJRyIsIHVzZXJfY29uZmlnLCAxKTsKKwkJCQlmcmVlKHVzZXJfY29uZmlnKTsKKwkJCX0gZWxzZSB7CisJCQkJZGllKCIkSE9NRSBub3Qgc2V0Iik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1zeXN0ZW0iKSkKKwkJCXNldGVudigiR0lUX0NPTkZJRyIsIEVUQ19HSVRDT05GSUcsIDEpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXJlbmFtZS1zZWN0aW9uIikpIHsKKwkJCWludCByZXQ7CisJCQlpZiAoYXJnYyAhPSA0KQorCQkJCXVzYWdlKGdpdF9jb25maWdfc2V0X3VzYWdlKTsKKwkJCXJldCA9IGdpdF9jb25maWdfcmVuYW1lX3NlY3Rpb24oYXJndlsyXSwgYXJndlszXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBzdWNoIHNlY3Rpb24hXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tcmVtb3ZlLXNlY3Rpb24iKSkgeworCQkJaW50IHJldDsKKwkJCWlmIChhcmdjICE9IDMpCisJCQkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCQkJcmV0ID0gZ2l0X2NvbmZpZ19yZW5hbWVfc2VjdGlvbihhcmd2WzJdLCBOVUxMKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHN1Y2ggc2VjdGlvbiFcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMjoKKwkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzFdLCBOVUxMKTsKKwljYXNlIDM6CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0IikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXQoYXJndlsyXSwgTlVMTCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdW5zZXQtYWxsIikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgTlVMTCwgMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0IikpCisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIE5VTEwpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldC1hbGwiKSkgeworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtcmVnZXhwIikpIHsKKwkJCXNob3dfa2V5cyA9IDE7CisJCQl1c2Vfa2V5X3JlZ2V4cCA9IDE7CisJCQlkb19hbGwgPSAxOworCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBOVUxMKTsKKwkJfSBlbHNlCisKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldChhcmd2WzFdLCBhcmd2WzJdKTsKKwljYXNlIDQ6CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0IikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgYXJndlszXSwgMCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdW5zZXQtYWxsIikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgYXJndlszXSwgMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0IikpCisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIGFyZ3ZbM10pOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldC1hbGwiKSkgeworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtcmVnZXhwIikpIHsKKwkJCXNob3dfa2V5cyA9IDE7CisJCQl1c2Vfa2V5X3JlZ2V4cCA9IDE7CisJCQlkb19hbGwgPSAxOworCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBhcmd2WzNdKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWFkZCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIGFyZ3ZbM10sICJeJCIsIDApOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXJlcGxhY2UtYWxsIikpCisKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihhcmd2WzJdLCBhcmd2WzNdLCBOVUxMLCAxKTsKKwkJZWxzZQorCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSwgMCk7CisJY2FzZSA1OgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1yZXBsYWNlLWFsbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIGFyZ3ZbM10sIGFyZ3ZbNF0sIDEpOworCWNhc2UgMToKKwlkZWZhdWx0OgorCQl1c2FnZShnaXRfY29uZmlnX3NldF91c2FnZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jb3VudC1vYmplY3RzLmMgYi9idWlsdGluLWNvdW50LW9iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjkwZWJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jb3VudC1vYmplY3RzLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBCdWlsdGluICJnaXQgY291bnQtb2JqZWN0cyIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBjb3VudF9vYmplY3RzX3VzYWdlW10gPSAiZ2l0LWNvdW50LW9iamVjdHMgWy12XSI7CisKK3N0YXRpYyB2b2lkIGNvdW50X29iamVjdHMoRElSICpkLCBjaGFyICpwYXRoLCBpbnQgbGVuLCBpbnQgdmVyYm9zZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqbG9vc2UsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmxvb3NlX3NpemUsCisJCQkgIHVuc2lnbmVkIGxvbmcgKnBhY2tlZF9sb29zZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqZ2FyYmFnZSkKK3sKKwlzdHJ1Y3QgZGlyZW50ICplbnQ7CisJd2hpbGUgKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCWNoYXIgaGV4WzQxXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY29uc3QgY2hhciAqY3A7CisJCWludCBiYWQgPSAwOworCisJCWlmICgoZW50LT5kX25hbWVbMF0gPT0gJy4nKSAmJgorCQkgICAgKGVudC0+ZF9uYW1lWzFdID09IDAgfHwKKwkJICAgICAoKGVudC0+ZF9uYW1lWzFdID09ICcuJykgJiYgKGVudC0+ZF9uYW1lWzJdID09IDApKSkpCisJCQljb250aW51ZTsKKwkJZm9yIChjcCA9IGVudC0+ZF9uYW1lOyAqY3A7IGNwKyspIHsKKwkJCWludCBjaCA9ICpjcDsKKwkJCWlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwKKwkJCSAgICAoJ2EnIDw9IGNoICYmIGNoIDw9ICdmJykpCisJCQkJY29udGludWU7CisJCQliYWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIC0gZW50LT5kX25hbWUgIT0gMzgpCisJCQliYWQgPSAxOworCQllbHNlIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJbWVtY3B5KHBhdGggKyBsZW4gKyAzLCBlbnQtPmRfbmFtZSwgMzgpOworCQkJcGF0aFtsZW4gKyAyXSA9ICcvJzsKKwkJCXBhdGhbbGVuICsgNDFdID0gMDsKKwkJCWlmIChsc3RhdChwYXRoLCAmc3QpIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQkJCWJhZCA9IDE7CisJCQllbHNlCisJCQkJKCpsb29zZV9zaXplKSArPSB4c2l6ZV90KHN0LnN0X2Jsb2Nrcyk7CisJCX0KKwkJaWYgKGJhZCkgeworCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQllcnJvcigiZ2FyYmFnZSBmb3VuZDogJS4qcy8lcyIsCisJCQkJICAgICAgbGVuICsgMiwgcGF0aCwgZW50LT5kX25hbWUpOworCQkJCSgqZ2FyYmFnZSkrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCSgqbG9vc2UpKys7CisJCWlmICghdmVyYm9zZSkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkoaGV4LCBwYXRoK2xlbiwgMik7CisJCW1lbWNweShoZXgrMiwgZW50LT5kX25hbWUsIDM4KTsKKwkJaGV4WzQwXSA9IDA7CisJCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKKwkJaWYgKGhhc19zaGExX3BhY2soc2hhMSwgTlVMTCkpCisJCQkoKnBhY2tlZF9sb29zZSkrKzsKKwl9Cit9CisKK2ludCBjbWRfY291bnRfb2JqZWN0cyhpbnQgYWMsIGNvbnN0IGNoYXIgKiphdiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCWludCB2ZXJib3NlID0gMDsKKwljb25zdCBjaGFyICpvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCWludCBsZW4gPSBzdHJsZW4ob2JqZGlyKTsKKwljaGFyICpwYXRoID0geG1hbGxvYyhsZW4gKyA1MCk7CisJdW5zaWduZWQgbG9uZyBsb29zZSA9IDAsIHBhY2tlZCA9IDAsIHBhY2tlZF9sb29zZSA9IDAsIGdhcmJhZ2UgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9vc2Vfc2l6ZSA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgYWM7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhdltpXTsKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkKKwkJCXZlcmJvc2UgPSAxOworCQllbHNlCisJCQl1c2FnZShjb3VudF9vYmplY3RzX3VzYWdlKTsKKwl9CisKKwkvKiB3ZSBkbyBub3QgdGFrZSBhcmd1bWVudHMgb3RoZXIgdGhhbiBmbGFncyBmb3Igbm93ICovCisJaWYgKGkgPCBhYykKKwkJdXNhZ2UoY291bnRfb2JqZWN0c191c2FnZSk7CisJbWVtY3B5KHBhdGgsIG9iamRpciwgbGVuKTsKKwlpZiAobGVuICYmIG9iamRpcltsZW4tMV0gIT0gJy8nKQorCQlwYXRoW2xlbisrXSA9ICcvJzsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJRElSICpkOworCQlzcHJpbnRmKHBhdGggKyBsZW4sICIlMDJ4IiwgaSk7CisJCWQgPSBvcGVuZGlyKHBhdGgpOworCQlpZiAoIWQpCisJCQljb250aW51ZTsKKwkJY291bnRfb2JqZWN0cyhkLCBwYXRoLCBsZW4sIHZlcmJvc2UsCisJCQkgICAgICAmbG9vc2UsICZsb29zZV9zaXplLCAmcGFja2VkX2xvb3NlLCAmZ2FyYmFnZSk7CisJCWNsb3NlZGlyKGQpOworCX0KKwlpZiAodmVyYm9zZSkgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwkJdW5zaWduZWQgbG9uZyBudW1fcGFjayA9IDA7CisJCWlmICghcGFja2VkX2dpdCkKKwkJCXByZXBhcmVfcGFja2VkX2dpdCgpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKCFwLT5wYWNrX2xvY2FsKQorCQkJCWNvbnRpbnVlOworCQkJcGFja2VkICs9IHAtPm51bV9vYmplY3RzOworCQkJbnVtX3BhY2srKzsKKwkJfQorCQlwcmludGYoImNvdW50OiAlbHVcbiIsIGxvb3NlKTsKKwkJcHJpbnRmKCJzaXplOiAlbHVcbiIsIGxvb3NlX3NpemUgLyAyKTsKKwkJcHJpbnRmKCJpbi1wYWNrOiAlbHVcbiIsIHBhY2tlZCk7CisJCXByaW50ZigicGFja3M6ICVsdVxuIiwgbnVtX3BhY2spOworCQlwcmludGYoInBydW5lLXBhY2thYmxlOiAlbHVcbiIsIHBhY2tlZF9sb29zZSk7CisJCXByaW50ZigiZ2FyYmFnZTogJWx1XG4iLCBnYXJiYWdlKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVsdSBvYmplY3RzLCAlbHUga2lsb2J5dGVzXG4iLAorCQkgICAgICAgbG9vc2UsIGxvb3NlX3NpemUgLyAyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGVzY3JpYmUuYyBiL2J1aWx0aW4tZGVzY3JpYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU5MTdlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kZXNjcmliZS5jCkBAIC0wLDAgKzEsMjg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjZGVmaW5lIFNFRU4JCSgxdTw8MCkKKyNkZWZpbmUgTUFYX1RBR1MJKEZMQUdfQklUUyAtIDEpCisKK3N0YXRpYyBjb25zdCBjaGFyIGRlc2NyaWJlX3VzYWdlW10gPQorImdpdC1kZXNjcmliZSBbLS1hbGxdIFstLXRhZ3NdIFstLWFiYnJldj08bj5dIDxjb21taXR0aXNoPioiOworCitzdGF0aWMgaW50IGRlYnVnOwkvKiBEaXNwbGF5IGxvdHMgb2YgdmVyYm9zZSBpbmZvICovCitzdGF0aWMgaW50IGFsbDsJLyogRGVmYXVsdCB0byBhbm5vdGF0ZWQgdGFncyBvbmx5ICovCitzdGF0aWMgaW50IHRhZ3M7CS8qIEJ1dCBhbGxvdyBhbnkgdGFncyBpZiAtLXRhZ3MgaXMgc3BlY2lmaWVkICovCitzdGF0aWMgaW50IGFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworc3RhdGljIGludCBtYXhfY2FuZGlkYXRlcyA9IDEwOworCitzdHJ1Y3QgY29tbWl0X25hbWUgeworCWludCBwcmlvOyAvKiBhbm5vdGF0ZWQgdGFnID0gMiwgdGFnID0gMSwgaGVhZCA9IDAgKi8KKwljaGFyIHBhdGhbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CitzdGF0aWMgY29uc3QgY2hhciAqcHJpb19uYW1lc1tdID0geworCSJoZWFkIiwgImxpZ2h0d2VpZ2h0IiwgImFubm90YXRlZCIsCit9OworCitzdGF0aWMgdm9pZCBhZGRfdG9fa25vd25fbmFtZXMoY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgICAgICBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkgICAgICAgaW50IHByaW8pCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICplID0gY29tbWl0LT51dGlsOworCWlmICghZSB8fCBlLT5wcmlvIDwgcHJpbykgeworCQlzaXplX3QgbGVuID0gc3RybGVuKHBhdGgpKzE7CisJCWZyZWUoZSk7CisJCWUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X25hbWUpICsgbGVuKTsKKwkJZS0+cHJpbyA9IHByaW87CisJCW1lbWNweShlLT5wYXRoLCBwYXRoLCBsZW4pOworCQljb21taXQtPnV0aWwgPSBlOworCX0KK30KKworc3RhdGljIGludCBnZXRfbmFtZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0OworCWludCBwcmlvOworCisJaWYgKCFjb21taXQpCisJCXJldHVybiAwOworCW9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwkvKiBJZiAtLWFsbCwgdGhlbiBhbnkgcmVmcyBhcmUgdXNlZC4KKwkgKiBJZiAtLXRhZ3MsIHRoZW4gYW55IHRhZ3MgYXJlIHVzZWQuCisJICogT3RoZXJ3aXNlIG9ubHkgYW5ub3RhdGVkIHRhZ3MgYXJlIHVzZWQuCisJICovCisJaWYgKCFwcmVmaXhjbXAocGF0aCwgInJlZnMvdGFncy8iKSkgeworCQlpZiAob2JqZWN0LT50eXBlID09IE9CSl9UQUcpCisJCQlwcmlvID0gMjsKKwkJZWxzZQorCQkJcHJpbyA9IDE7CisJfQorCWVsc2UKKwkJcHJpbyA9IDA7CisKKwlpZiAoIWFsbCkgeworCQlpZiAoIXByaW8pCisJCQlyZXR1cm4gMDsKKwkJaWYgKCF0YWdzICYmIHByaW8gPCAyKQorCQkJcmV0dXJuIDA7CisJfQorCWFkZF90b19rbm93bl9uYW1lcyhhbGwgPyBwYXRoICsgNSA6IHBhdGggKyAxMCwgY29tbWl0LCBwcmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBvc3NpYmxlX3RhZyB7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lOworCWludCBkZXB0aDsKKwlpbnQgZm91bmRfb3JkZXI7CisJdW5zaWduZWQgZmxhZ193aXRoaW47Cit9OworCitzdGF0aWMgaW50IGNvbXBhcmVfcHQoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBwb3NzaWJsZV90YWcgKmEgPSAoc3RydWN0IHBvc3NpYmxlX3RhZyAqKWFfOworCXN0cnVjdCBwb3NzaWJsZV90YWcgKmIgPSAoc3RydWN0IHBvc3NpYmxlX3RhZyAqKWJfOworCWlmIChhLT5uYW1lLT5wcmlvICE9IGItPm5hbWUtPnByaW8pCisJCXJldHVybiBiLT5uYW1lLT5wcmlvIC0gYS0+bmFtZS0+cHJpbzsKKwlpZiAoYS0+ZGVwdGggIT0gYi0+ZGVwdGgpCisJCXJldHVybiBhLT5kZXB0aCAtIGItPmRlcHRoOworCWlmIChhLT5mb3VuZF9vcmRlciAhPSBiLT5mb3VuZF9vcmRlcikKKwkJcmV0dXJuIGEtPmZvdW5kX29yZGVyIC0gYi0+Zm91bmRfb3JkZXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmlzaF9kZXB0aF9jb21wdXRhdGlvbigKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0LAorCXN0cnVjdCBwb3NzaWJsZV90YWcgKmJlc3QpCit7CisJdW5zaWduZWQgbG9uZyBzZWVuX2NvbW1pdHMgPSAwOworCXdoaWxlICgqbGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjID0gcG9wX2NvbW1pdChsaXN0KTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJc2Vlbl9jb21taXRzKys7CisJCWlmIChjLT5vYmplY3QuZmxhZ3MgJiBiZXN0LT5mbGFnX3dpdGhpbikgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICphID0gKmxpc3Q7CisJCQl3aGlsZSAoYSkgeworCQkJCXN0cnVjdCBjb21taXQgKmkgPSBhLT5pdGVtOworCQkJCWlmICghKGktPm9iamVjdC5mbGFncyAmIGJlc3QtPmZsYWdfd2l0aGluKSkKKwkJCQkJYnJlYWs7CisJCQkJYSA9IGEtPm5leHQ7CisJCQl9CisJCQlpZiAoIWEpCisJCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJYmVzdC0+ZGVwdGgrKzsKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJcGFyc2VfY29tbWl0KHApOworCQkJaWYgKCEocC0+b2JqZWN0LmZsYWdzICYgU0VFTikpCisJCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdCk7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gYy0+b2JqZWN0LmZsYWdzOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCX0KKwl9CisJcmV0dXJuIHNlZW5fY29tbWl0czsKK30KKworc3RhdGljIHZvaWQgZGVzY3JpYmUoY29uc3QgY2hhciAqYXJnLCBpbnQgbGFzdF9vbmUpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpjbWl0LCAqZ2F2ZV91cF9vbiA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0OworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCXN0cnVjdCBjb21taXRfbmFtZSAqbjsKKwlzdHJ1Y3QgcG9zc2libGVfdGFnIGFsbF9tYXRjaGVzW01BWF9UQUdTXTsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hfY250ID0gMCwgYW5ub3RhdGVkX2NudCA9IDAsIGN1cl9tYXRjaDsKKwl1bnNpZ25lZCBsb25nIHNlZW5fY29tbWl0cyA9IDA7CisKKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZyk7CisJY21pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCWlmICghY21pdCkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCAnJXMnIG9iamVjdCIsIGFyZywgY29tbWl0X3R5cGUpOworCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlpbml0aWFsaXplZCA9IDE7CisJCWZvcl9lYWNoX3JlZihnZXRfbmFtZSwgTlVMTCk7CisJfQorCisJbiA9IGNtaXQtPnV0aWw7CisJaWYgKG4pIHsKKwkJcHJpbnRmKCIlc1xuIiwgbi0+cGF0aCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGVidWcpCisJCWZwcmludGYoc3RkZXJyLCAic2VhcmNoaW5nIHRvIGRlc2NyaWJlICVzXG4iLCBhcmcpOworCisJbGlzdCA9IE5VTEw7CisJY21pdC0+b2JqZWN0LmZsYWdzID0gU0VFTjsKKwljb21taXRfbGlzdF9pbnNlcnQoY21pdCwgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBwb3BfY29tbWl0KCZsaXN0KTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJc2Vlbl9jb21taXRzKys7CisJCW4gPSBjLT51dGlsOworCQlpZiAobikgeworCQkJaWYgKG1hdGNoX2NudCA8IG1heF9jYW5kaWRhdGVzKSB7CisJCQkJc3RydWN0IHBvc3NpYmxlX3RhZyAqdCA9ICZhbGxfbWF0Y2hlc1ttYXRjaF9jbnQrK107CisJCQkJdC0+bmFtZSA9IG47CisJCQkJdC0+ZGVwdGggPSBzZWVuX2NvbW1pdHMgLSAxOworCQkJCXQtPmZsYWdfd2l0aGluID0gMXUgPDwgbWF0Y2hfY250OworCQkJCXQtPmZvdW5kX29yZGVyID0gbWF0Y2hfY250OworCQkJCWMtPm9iamVjdC5mbGFncyB8PSB0LT5mbGFnX3dpdGhpbjsKKwkJCQlpZiAobi0+cHJpbyA9PSAyKQorCQkJCQlhbm5vdGF0ZWRfY250Kys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlnYXZlX3VwX29uID0gYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmb3IgKGN1cl9tYXRjaCA9IDA7IGN1cl9tYXRjaCA8IG1hdGNoX2NudDsgY3VyX21hdGNoKyspIHsKKwkJCXN0cnVjdCBwb3NzaWJsZV90YWcgKnQgPSAmYWxsX21hdGNoZXNbY3VyX21hdGNoXTsKKwkJCWlmICghKGMtPm9iamVjdC5mbGFncyAmIHQtPmZsYWdfd2l0aGluKSkKKwkJCQl0LT5kZXB0aCsrOworCQl9CisJCWlmIChhbm5vdGF0ZWRfY250ICYmICFsaXN0KSB7CisJCQlpZiAoZGVidWcpCisJCQkJZnByaW50ZihzdGRlcnIsICJmaW5pc2hlZCBzZWFyY2ggYXQgJXNcbiIsCisJCQkJCXNoYTFfdG9faGV4KGMtPm9iamVjdC5zaGExKSk7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJzZV9jb21taXQocCk7CisJCQlpZiAoIShwLT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkKKwkJCQlpbnNlcnRfYnlfZGF0ZShwLCAmbGlzdCk7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gYy0+b2JqZWN0LmZsYWdzOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCX0KKwl9CisKKwlpZiAoIW1hdGNoX2NudCkKKwkJZGllKCJjYW5ub3QgZGVzY3JpYmUgJyVzJyIsIHNoYTFfdG9faGV4KGNtaXQtPm9iamVjdC5zaGExKSk7CisKKwlxc29ydChhbGxfbWF0Y2hlcywgbWF0Y2hfY250LCBzaXplb2YoYWxsX21hdGNoZXNbMF0pLCBjb21wYXJlX3B0KTsKKworCWlmIChnYXZlX3VwX29uKSB7CisJCWluc2VydF9ieV9kYXRlKGdhdmVfdXBfb24sICZsaXN0KTsKKwkJc2Vlbl9jb21taXRzLS07CisJfQorCXNlZW5fY29tbWl0cyArPSBmaW5pc2hfZGVwdGhfY29tcHV0YXRpb24oJmxpc3QsICZhbGxfbWF0Y2hlc1swXSk7CisJZnJlZV9jb21taXRfbGlzdChsaXN0KTsKKworCWlmIChkZWJ1ZykgeworCQlmb3IgKGN1cl9tYXRjaCA9IDA7IGN1cl9tYXRjaCA8IG1hdGNoX2NudDsgY3VyX21hdGNoKyspIHsKKwkJCXN0cnVjdCBwb3NzaWJsZV90YWcgKnQgPSAmYWxsX21hdGNoZXNbY3VyX21hdGNoXTsKKwkJCWZwcmludGYoc3RkZXJyLCAiICUtMTFzICU4ZCAlc1xuIiwKKwkJCQlwcmlvX25hbWVzW3QtPm5hbWUtPnByaW9dLAorCQkJCXQtPmRlcHRoLCB0LT5uYW1lLT5wYXRoKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgInRyYXZlcnNlZCAlbHUgY29tbWl0c1xuIiwgc2Vlbl9jb21taXRzKTsKKwkJaWYgKGdhdmVfdXBfb24pIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJtb3JlIHRoYW4gJWkgdGFncyBmb3VuZDsgbGlzdGVkICVpIG1vc3QgcmVjZW50XG4iCisJCQkJImdhdmUgdXAgc2VhcmNoIGF0ICVzXG4iLAorCQkJCW1heF9jYW5kaWRhdGVzLCBtYXhfY2FuZGlkYXRlcywKKwkJCQlzaGExX3RvX2hleChnYXZlX3VwX29uLT5vYmplY3Quc2hhMSkpOworCQl9CisJfQorCWlmIChhYmJyZXYgPT0gMCkKKwkJcHJpbnRmKCIlc1xuIiwgYWxsX21hdGNoZXNbMF0ubmFtZS0+cGF0aCApOworCWVsc2UKKwkJcHJpbnRmKCIlcy0lZC1nJXNcbiIsIGFsbF9tYXRjaGVzWzBdLm5hbWUtPnBhdGgsCisJCSAgICAgICBhbGxfbWF0Y2hlc1swXS5kZXB0aCwKKwkJICAgICAgIGZpbmRfdW5pcXVlX2FiYnJldihjbWl0LT5vYmplY3Quc2hhMSwgYWJicmV2KSk7CisKKwlpZiAoIWxhc3Rfb25lKQorCQljbGVhcl9jb21taXRfbWFya3MoY21pdCwgLTEpOworfQorCitpbnQgY21kX2Rlc2NyaWJlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZGVidWciKSkKKwkJCWRlYnVnID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKQorCQkJYWxsID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRhZ3MiKSkKKwkJCXRhZ3MgPSAxOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2PSIpKSB7CisJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZyArIDksIE5VTEwsIDEwKTsKKwkJCWlmIChhYmJyZXYgIT0gMCAmJiAoYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYgfHwgNDAgPCBhYmJyZXYpKQorCQkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1jYW5kaWRhdGVzPSIpKSB7CisJCQltYXhfY2FuZGlkYXRlcyA9IHN0cnRvdWwoYXJnICsgMTMsIE5VTEwsIDEwKTsKKwkJCWlmIChtYXhfY2FuZGlkYXRlcyA8IDEpCisJCQkJbWF4X2NhbmRpZGF0ZXMgPSAxOworCQkJZWxzZSBpZiAobWF4X2NhbmRpZGF0ZXMgPiBNQVhfVEFHUykKKwkJCQltYXhfY2FuZGlkYXRlcyA9IE1BWF9UQUdTOworCQl9CisJCWVsc2UKKwkJCXVzYWdlKGRlc2NyaWJlX3VzYWdlKTsKKwl9CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCisJaWYgKGFyZ2MgPD0gaSkKKwkJZGVzY3JpYmUoIkhFQUQiLCAxKTsKKwllbHNlCisJCXdoaWxlIChpIDwgYXJnYykgeworCQkJZGVzY3JpYmUoYXJndltpXSwgKGkgPT0gYXJnYyAtIDEpKTsKKwkJCWkrKzsKKwkJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtZmlsZXMuYyBiL2J1aWx0aW4tZGlmZi1maWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjMwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYtZmlsZXMuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfZmlsZXNfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtZmlsZXMgWy1xXSBbLTAvLTEvMi8zIHwtY3wtLWNjfC0tbm8taW5kZXhdIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfZmlsZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgbm9uZ2l0ID0gMDsKKwlpbnQgcmVzdWx0OworCisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJcmV2LmFiYnJldiA9IDA7CisKKwlpZiAoIXNldHVwX2RpZmZfbm9faW5kZXgoJnJldiwgYXJnYywgYXJndiwgbm9uZ2l0LCBwcmVmaXgpKQorCQlhcmdjID0gMDsKKwllbHNlCisJCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldiwgTlVMTCk7CisJaWYgKCFyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0KQorCQlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCXJlc3VsdCA9IHJ1bl9kaWZmX2ZpbGVzX2NtZCgmcmV2LCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gcmV2LmRpZmZvcHQuZXhpdF93aXRoX3N0YXR1cyA/IHJldi5kaWZmb3B0Lmhhc19jaGFuZ2VzOiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtaW5kZXguYyBiL2J1aWx0aW4tZGlmZi1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MGViYTkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYtaW5kZXguYwpAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtaW5kZXggWy1tXSBbLS1jYWNoZWRdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgY2FjaGVkID0gMDsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJcmV2LmFiYnJldiA9IDA7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJCQorCQlpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKQorCQkJY2FjaGVkID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoZGlmZl9jYWNoZV91c2FnZSk7CisJfQorCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSByZXZpc2lvbiAoaS5lLiBwZW5kaW5nIG9iamVjdCksCisJICogYW5kIHRoZXJlIGlzIG5vIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChyZXYucGVuZGluZy5uciAhPSAxIHx8CisJICAgIHJldi5tYXhfY291bnQgIT0gLTEgfHwgcmV2Lm1pbl9hZ2UgIT0gLTEgfHwgcmV2Lm1heF9hZ2UgIT0gLTEpCisJCXVzYWdlKGRpZmZfY2FjaGVfdXNhZ2UpOworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCXBlcnJvcigicmVhZF9jYWNoZSIpOworCQlyZXR1cm4gLTE7CisJfQorCXJlc3VsdCA9IHJ1bl9kaWZmX2luZGV4KCZyZXYsIGNhY2hlZCk7CisJcmV0dXJuIHJldi5kaWZmb3B0LmV4aXRfd2l0aF9zdGF0dXMgPyByZXYuZGlmZm9wdC5oYXNfY2hhbmdlczogcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLXRyZWUuYyBiL2J1aWx0aW4tZGlmZi10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OTFjOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZGlmZi10cmVlLmMKQEAgLTAsMCArMSwxMzggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIHN0cnVjdCByZXZfaW5mbyBsb2dfdHJlZV9vcHQ7CisKK3N0YXRpYyBpbnQgZGlmZl90cmVlX2NvbW1pdF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gbG9nX3RyZWVfY29tbWl0KCZsb2dfdHJlZV9vcHQsIGNvbW1pdCk7Cit9CisKK3N0YXRpYyBpbnQgZGlmZl90cmVlX3N0ZGluKGNoYXIgKmxpbmUpCit7CisJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtMTsKKwlsaW5lW2xlbi0xXSA9IDA7CisJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKKwkJcmV0dXJuIC0xOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXQoc2hhMSk7CisJaWYgKCFjb21taXQgfHwgcGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKwlpZiAoaXNzcGFjZShsaW5lWzQwXSkgJiYgIWdldF9zaGExX2hleChsaW5lKzQxLCBzaGExKSkgeworCQkvKiBHcmFmdCB0aGUgZmFrZSBwYXJlbnRzIGxvY2FsbHkgdG8gdGhlIGNvbW1pdCAqLworCQlpbnQgcG9zID0gNDE7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqKnBwdHIsICpwYXJlbnRzOworCisJCS8qIEZyZWUgdGhlIHJlYWwgcGFyZW50IGxpc3QgKi8KKwkJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyApIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqdG1wID0gcGFyZW50cy0+bmV4dDsKKwkJCWZyZWUocGFyZW50cyk7CisJCQlwYXJlbnRzID0gdG1wOworCQl9CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXBwdHIgPSAmKGNvbW1pdC0+cGFyZW50cyk7CisJCXdoaWxlIChsaW5lW3Bvc10gJiYgIWdldF9zaGExX2hleChsaW5lICsgcG9zLCBzaGExKSkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwkJCWlmIChwYXJlbnQpIHsKKwkJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChwYXJlbnQsIHBwdHIpLT5uZXh0OworCQkJfQorCQkJcG9zICs9IDQxOworCQl9CisJfQorCXJldHVybiBsb2dfdHJlZV9jb21taXQoJmxvZ190cmVlX29wdCwgY29tbWl0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgZGlmZl90cmVlX3VzYWdlW10gPQorImdpdC1kaWZmLXRyZWUgWy0tc3RkaW5dIFstbV0gWy1jXSBbLS1jY10gWy1zXSBbLXZdIFstLXByZXR0eV0gWy10XSBbLXJdIFstLXJvb3RdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8dHJlZS1pc2g+XSBbPHBhdGg+Li4uXVxuIgorIiAgLXIgICAgICAgICAgICBkaWZmIHJlY3Vyc2l2ZWx5XG4iCisiICAtLXJvb3QgICAgICAgIGluY2x1ZGUgdGhlIGluaXRpYWwgY29tbWl0IGFzIGRpZmYgYWdhaW5zdCAvZGV2L251bGxcbiIKK0NPTU1PTl9ESUZGX09QVElPTlNfSEVMUDsKKworaW50IGNtZF9kaWZmX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IG5yX3NoYTE7CisJY2hhciBsaW5lWzEwMDBdOworCXN0cnVjdCBvYmplY3QgKnRyZWUxLCAqdHJlZTI7CisJc3RhdGljIHN0cnVjdCByZXZfaW5mbyAqb3B0ID0gJmxvZ190cmVlX29wdDsKKwlpbnQgcmVhZF9zdGRpbiA9IDA7CisKKwlpbml0X3JldmlzaW9ucyhvcHQsIHByZWZpeCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOyAvKiBubyAiZGlmZiIgVUkgb3B0aW9ucyAqLworCW5yX3NoYTEgPSAwOworCW9wdC0+YWJicmV2ID0gMDsKKwlvcHQtPmRpZmYgPSAxOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgb3B0LCBOVUxMKTsKKworCXdoaWxlICgtLWFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9ICorK2FyZ3Y7CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGRpbiIpKSB7CisJCQlyZWFkX3N0ZGluID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJfQorCisJaWYgKCFvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisKKwkvKgorCSAqIE5PVEUhIFdlIGV4cGVjdCAiYSBeYiIgdG8gYmUgZXF1YWwgdG8gImEuLmIiLCBzbyB3ZQorCSAqIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBvYmplY3RzIGlmIHRoZSBzZWNvbmQgb25lCisJICogaXMgbWFya2VkIFVOSU5URVJFU1RJTkcuCisJICovCisJbnJfc2hhMSA9IG9wdC0+cGVuZGluZy5ucjsKKwlzd2l0Y2ggKG5yX3NoYTEpIHsKKwljYXNlIDA6CisJCWlmICghcmVhZF9zdGRpbikKKwkJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHJlZTEgPSBvcHQtPnBlbmRpbmcub2JqZWN0c1swXS5pdGVtOworCQlkaWZmX3RyZWVfY29tbWl0X3NoYTEodHJlZTEtPnNoYTEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRyZWUxID0gb3B0LT5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbTsKKwkJdHJlZTIgPSBvcHQtPnBlbmRpbmcub2JqZWN0c1sxXS5pdGVtOworCQlpZiAodHJlZTItPmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJc3RydWN0IG9iamVjdCAqdG1wID0gdHJlZTI7CisJCQl0cmVlMiA9IHRyZWUxOworCQkJdHJlZTEgPSB0bXA7CisJCX0KKwkJZGlmZl90cmVlX3NoYTEodHJlZTEtPnNoYTEsCisJCQkgICAgICAgdHJlZTItPnNoYTEsCisJCQkgICAgICAgIiIsICZvcHQtPmRpZmZvcHQpOworCQlsb2dfdHJlZV9kaWZmX2ZsdXNoKG9wdCk7CisJCWJyZWFrOworCX0KKworCWlmICghcmVhZF9zdGRpbikKKwkJcmV0dXJuIG9wdC0+ZGlmZm9wdC5leGl0X3dpdGhfc3RhdHVzID8KKwkJICAgIG9wdC0+ZGlmZm9wdC5oYXNfY2hhbmdlczogMDsKKworCWlmIChvcHQtPmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSkKKwkJb3B0LT5kaWZmb3B0LnNldHVwIHw9IChESUZGX1NFVFVQX1VTRV9TSVpFX0NBQ0hFIHwKKwkJCQkgICAgICAgRElGRl9TRVRVUF9VU0VfQ0FDSEUpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgc2hhMSkpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCQllbHNlCisJCQlkaWZmX3RyZWVfc3RkaW4obGluZSk7CisJfQorCXJldHVybiBvcHQtPmRpZmZvcHQuZXhpdF93aXRoX3N0YXR1cyA/IG9wdC0+ZGlmZm9wdC5oYXNfY2hhbmdlczogMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGlmZi5jIGIvYnVpbHRpbi1kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNjdiNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZGlmZi5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQnVpbHRpbiAiZ2l0IGRpZmYiCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdHJ1Y3QgYmxvYmluZm8geworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBtb2RlOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9kaWZmX3VzYWdlW10gPQorImdpdC1kaWZmIDxvcHRpb25zPiA8cmV2PnswLDJ9IC0tIDxwYXRoPioiOworCitzdGF0aWMgdm9pZCBzdHVmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LAorCQkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJCSBjb25zdCBjaGFyICpvbGRfbmFtZSwKKwkJCSBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKCFpc19udWxsX3NoYTEob2xkX3NoYTEpICYmICFpc19udWxsX3NoYTEobmV3X3NoYTEpICYmCisJICAgICFoYXNoY21wKG9sZF9zaGExLCBuZXdfc2hhMSkgJiYgKG9sZF9tb2RlID09IG5ld19tb2RlKSkKKwkJcmV0dXJuOworCisJaWYgKG9wdC0+cmV2ZXJzZV9kaWZmKSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqdG1wX3U7CisJCWNvbnN0IGNoYXIgKnRtcF9jOworCQl0bXAgPSBvbGRfbW9kZTsgb2xkX21vZGUgPSBuZXdfbW9kZTsgbmV3X21vZGUgPSB0bXA7CisJCXRtcF91ID0gb2xkX3NoYTE7IG9sZF9zaGExID0gbmV3X3NoYTE7IG5ld19zaGExID0gdG1wX3U7CisJCXRtcF9jID0gb2xkX25hbWU7IG9sZF9uYW1lID0gbmV3X25hbWU7IG5ld19uYW1lID0gdG1wX2M7CisJfQorCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKG9sZF9uYW1lKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhuZXdfbmFtZSk7CisJZmlsbF9maWxlc3BlYyhvbmUsIG9sZF9zaGExLCBvbGRfbW9kZSk7CisJZmlsbF9maWxlc3BlYyh0d28sIG5ld19zaGExLCBuZXdfbW9kZSk7CisKKwkvKiBORUVEU1dPUks6IHNob3VsZG4ndCB0aGlzIHBhcnQgb2YgZGlmZm9wdD8/PyAqLworCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIG9uZSwgdHdvKTsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfYl9mKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgc3RydWN0IGJsb2JpbmZvICpibG9iLAorCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJLyogQmxvYiB2cyBmaWxlIGluIHRoZSB3b3JraW5nIHRyZWUqLworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGFyZ2MgPiAxKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkpCisJCWRpZSgiJyVzJzogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCWlmICghKFNfSVNSRUcoc3Quc3RfbW9kZSkgfHwgU19JU0xOSyhzdC5zdF9tb2RlKSkpCisJCWRpZSgiJyVzJzogbm90IGEgcmVndWxhciBmaWxlIG9yIHN5bWxpbmsiLCBwYXRoKTsKKworCWlmIChibG9iWzBdLm1vZGUgPT0gU19JRklOVkFMSUQpCisJCWJsb2JbMF0ubW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisKKwlzdHVmZl9jaGFuZ2UoJnJldnMtPmRpZmZvcHQsCisJCSAgICAgYmxvYlswXS5tb2RlLCBjYW5vbl9tb2RlKHN0LnN0X21vZGUpLAorCQkgICAgIGJsb2JbMF0uc2hhMSwgbnVsbF9zaGExLAorCQkgICAgIHBhdGgsIHBhdGgpOworCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2Jsb2JzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICAgIHN0cnVjdCBibG9iaW5mbyAqYmxvYikKK3sKKwl1bnNpZ25lZCBtb2RlID0gY2Fub25fbW9kZShTX0lGUkVHIHwgMDY0NCk7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwlpZiAoYmxvYlswXS5tb2RlID09IFNfSUZJTlZBTElEKQorCQlibG9iWzBdLm1vZGUgPSBtb2RlOworCisJaWYgKGJsb2JbMV0ubW9kZSA9PSBTX0lGSU5WQUxJRCkKKwkJYmxvYlsxXS5tb2RlID0gbW9kZTsKKworCXN0dWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwKKwkJICAgICBibG9iWzBdLm1vZGUsIGJsb2JbMV0ubW9kZSwKKwkJICAgICBibG9iWzBdLnNoYTEsIGJsb2JbMV0uc2hhMSwKKwkJICAgICBibG9iWzBdLm5hbWUsIGJsb2JbMV0ubmFtZSk7CisJZGlmZmNvcmVfc3RkKCZyZXZzLT5kaWZmb3B0KTsKKwlkaWZmX2ZsdXNoKCZyZXZzLT5kaWZmb3B0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfaW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBjYWNoZWQgPSAwOworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKQorCQkJY2FjaGVkID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwkJYXJndisrOyBhcmdjLS07CisJfQorCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSByZXZpc2lvbiAoaS5lLiBwZW5kaW5nIG9iamVjdCksCisJICogYW5kIHRoZXJlIGlzIG5vIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChyZXZzLT5wZW5kaW5nLm5yICE9IDEgfHwKKwkgICAgcmV2cy0+bWF4X2NvdW50ICE9IC0xIHx8IHJldnMtPm1pbl9hZ2UgIT0gLTEgfHwKKwkgICAgcmV2cy0+bWF4X2FnZSAhPSAtMSkKKwkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkgeworCQlwZXJyb3IoInJlYWRfY2FjaGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcnVuX2RpZmZfaW5kZXgocmV2cywgY2FjaGVkKTsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICAgc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKihzaGExWzJdKTsKKwlpbnQgc3dhcCA9IDA7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwkvKiBXZSBzYXcgdHdvIHRyZWVzLCBlbnRbMF0gYW5kIGVudFsxXS4KKwkgKiBpZiBlbnRbMV0gaXMgdW5pbnRlcmVzdGluZywgdGhleSBhcmUgc3dhcHBlZAorCSAqLworCWlmIChlbnRbMV0uaXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlzd2FwID0gMTsKKwlzaGExW3N3YXBdID0gZW50WzBdLml0ZW0tPnNoYTE7CisJc2hhMVsxLXN3YXBdID0gZW50WzFdLml0ZW0tPnNoYTE7CisJZGlmZl90cmVlX3NoYTEoc2hhMVswXSwgc2hhMVsxXSwgIiIsICZyZXZzLT5kaWZmb3B0KTsKKwlsb2dfdHJlZV9kaWZmX2ZsdXNoKHJldnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl9jb21iaW5lZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkJIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCQkgc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZW50LAorCQkJCSBpbnQgZW50cykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICgqcGFyZW50KVsyMF07CisJaW50IGk7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwlpZiAoIXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyAmJiAhcmV2cy0+Y29tYmluZV9tZXJnZXMpCisJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IHJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwlwYXJlbnQgPSB4bWFsbG9jKGVudHMgKiBzaXplb2YoKnBhcmVudCkpOworCS8qIEFnYWluLCB0aGUgcmV2cyBhcmUgYWxsIHJldmVyc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50czsgaSsrKQorCQloYXNoY3B5KCh1bnNpZ25lZCBjaGFyICopKHBhcmVudCArIGkpLAorCQkJZW50W2VudHMgLSAxIC0gaV0uaXRlbS0+c2hhMSk7CisJZGlmZl90cmVlX2NvbWJpbmVkKHBhcmVudFswXSwgcGFyZW50ICsgMSwgZW50cyAtIDEsCisJCQkgICByZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMsIHJldnMpOworCXJldHVybiAwOworfQorCit2b2lkIGFkZF9oZWFkKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBzaGExKSkKKwkJcmV0dXJuOworCW9iaiA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmosICJIRUFEIik7Cit9CisKK2ludCBjbWRfZGlmZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgZW50WzEwMF07CisJaW50IGVudHMgPSAwLCBibG9icyA9IDAsIHBhdGhzID0gMDsKKwljb25zdCBjaGFyICpwYXRoID0gTlVMTDsKKwlzdHJ1Y3QgYmxvYmluZm8gYmxvYlsyXTsKKwlpbnQgbm9uZ2l0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qCisJICogV2UgY291bGQgZ2V0IE4gdHJlZS1pc2ggaW4gdGhlIHJldi5wZW5kaW5nX29iamVjdHMgbGlzdC4KKwkgKiBBbHNvIHRoZXJlIGNvdWxkIGJlIE0gYmxvYnMgdGhlcmUsIGFuZCBQIHBhdGhzcGVjcy4KKwkgKgorCSAqIE49MCwgTT0wOgorCSAqCWNhY2hlIHZzIGZpbGVzIChkaWZmLWZpbGVzKQorCSAqIE49MCwgTT0yOgorCSAqICAgICAgY29tcGFyZSB0d28gcmFuZG9tIGJsb2JzLiAgUCBtdXN0IGJlIHplcm8uCisJICogTj0wLCBNPTEsIFA9MToKKwkgKgljb21wYXJlIGEgYmxvYiB3aXRoIGEgd29ya2luZyB0cmVlIGZpbGUuCisJICoKKwkgKiBOPTEsIE09MDoKKwkgKiAgICAgIHRyZWUgdnMgY2FjaGUgKGRpZmYtaW5kZXggLS1jYWNoZWQpCisJICoKKwkgKiBOPTIsIE09MDoKKwkgKiAgICAgIHRyZWUgdnMgdHJlZSAoZGlmZi10cmVlKQorCSAqCisJICogT3RoZXIgY2FzZXMgYXJlIGVycm9ycy4KKwkgKi8KKworCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCWdpdF9jb25maWcoZ2l0X2RpZmZfdWlfY29uZmlnKTsKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCisJaWYgKCFzZXR1cF9kaWZmX25vX2luZGV4KCZyZXYsIGFyZ2MsIGFyZ3YsIG5vbmdpdCwgcHJlZml4KSkKKwkJYXJnYyA9IDA7CisJZWxzZQorCQlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkgeworCQlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUEFUQ0g7CisJCWlmIChkaWZmX3NldHVwX2RvbmUoJnJldi5kaWZmb3B0KSA8IDApCisJCQlkaWUoImRpZmZfc2V0dXBfZG9uZSBmYWlsZWQiKTsKKwl9CisJcmV2LmRpZmZvcHQuYWxsb3dfZXh0ZXJuYWwgPSAxOworCisJLyogRG8gd2UgaGF2ZSAtLWNhY2hlZCBhbmQgbm90IGhhdmUgYSBwZW5kaW5nIG9iamVjdCwgdGhlbgorCSAqIGRlZmF1bHQgdG8gSEVBRCBieSBoYW5kLiAgRWVrLgorCSAqLworCWlmICghcmV2LnBlbmRpbmcubnIpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKSB7CisJCQkJYWRkX2hlYWQoJnJldik7CisJCQkJaWYgKCFyZXYucGVuZGluZy5ucikKKwkJCQkJZGllKCJObyBIRUFEIGNvbW1pdCB0byBjb21wYXJlIHdpdGggKHlldCkiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXYucGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmxpc3QgPSByZXYucGVuZGluZy5vYmplY3RzK2k7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxpc3QtPml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBsaXN0LT5uYW1lOworCQlpbnQgZmxhZ3MgPSAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpOworCQlpZiAoIW9iai0+cGFyc2VkKQorCQkJb2JqID0gcGFyc2Vfb2JqZWN0KG9iai0+c2hhMSk7CisJCW9iaiA9IGRlcmVmX3RhZyhvYmosIE5VTEwsIDApOworCQlpZiAoIW9iaikKKwkJCWRpZSgiaW52YWxpZCBvYmplY3QgJyVzJyBnaXZlbi4iLCBuYW1lKTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQkJb2JqID0gJigoc3RydWN0IGNvbW1pdCAqKW9iaiktPnRyZWUtPm9iamVjdDsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQkJaWYgKEFSUkFZX1NJWkUoZW50KSA8PSBlbnRzKQorCQkJCWRpZSgibW9yZSB0aGFuICVkIHRyZWVzIGdpdmVuOiAnJXMnIiwKKwkJCQkgICAgKGludCkgQVJSQVlfU0laRShlbnQpLCBuYW1lKTsKKwkJCW9iai0+ZmxhZ3MgfD0gZmxhZ3M7CisJCQllbnRbZW50c10uaXRlbSA9IG9iajsKKwkJCWVudFtlbnRzXS5uYW1lID0gbmFtZTsKKwkJCWVudHMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCWlmICgyIDw9IGJsb2JzKQorCQkJCWRpZSgibW9yZSB0aGFuIHR3byBibG9icyBnaXZlbjogJyVzJyIsIG5hbWUpOworCQkJaGFzaGNweShibG9iW2Jsb2JzXS5zaGExLCBvYmotPnNoYTEpOworCQkJYmxvYltibG9ic10ubmFtZSA9IG5hbWU7CisJCQlibG9iW2Jsb2JzXS5tb2RlID0gbGlzdC0+bW9kZTsKKwkJCWJsb2JzKys7CisJCQljb250aW51ZTsKKworCQl9CisJCWRpZSgidW5oYW5kbGVkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCX0KKwlpZiAocmV2LnBydW5lX2RhdGEpIHsKKwkJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gcmV2LnBydW5lX2RhdGE7CisJCXdoaWxlICgqcGF0aHNwZWMpIHsKKwkJCWlmICghcGF0aCkKKwkJCQlwYXRoID0gKnBhdGhzcGVjOworCQkJcGF0aHMrKzsKKwkJCXBhdGhzcGVjKys7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdywgZG8gdGhlIGFyZ3VtZW50cyBsb29rIHJlYXNvbmFibGU/CisJICovCisJaWYgKCFlbnRzKSB7CisJCXN3aXRjaCAoYmxvYnMpIHsKKwkJY2FzZSAwOgorCQkJcmVzdWx0ID0gcnVuX2RpZmZfZmlsZXNfY21kKCZyZXYsIGFyZ2MsIGFyZ3YpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChwYXRocyAhPSAxKQorCQkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfYl9mKCZyZXYsIGFyZ2MsIGFyZ3YsIGJsb2IsIHBhdGgpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChwYXRocykKKwkJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQkJcmVzdWx0ID0gYnVpbHRpbl9kaWZmX2Jsb2JzKCZyZXYsIGFyZ2MsIGFyZ3YsIGJsb2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQl9CisJfQorCWVsc2UgaWYgKGJsb2JzKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCWVsc2UgaWYgKGVudHMgPT0gMSkKKwkJcmVzdWx0ID0gYnVpbHRpbl9kaWZmX2luZGV4KCZyZXYsIGFyZ2MsIGFyZ3YpOworCWVsc2UgaWYgKGVudHMgPT0gMikKKwkJcmVzdWx0ID0gYnVpbHRpbl9kaWZmX3RyZWUoJnJldiwgYXJnYywgYXJndiwgZW50KTsKKwllbHNlIGlmICgoZW50cyA9PSAzKSAmJiAoZW50WzBdLml0ZW0tPmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJLyogZGlmZiBBLi4uQiB3aGVyZSB0aGVyZSBpcyBvbmUgc2FuZSBtZXJnZSBiYXNlIGJldHdlZW4KKwkJICogQSBhbmQgQi4gIFdlIGhhdmUgZW50WzBdID09IG1lcmdlLWJhc2UsIGVudFsxXSA9PSBBLAorCQkgKiBhbmQgZW50WzJdID09IEIuICBTaG93IGRpZmYgYmV0d2VlbiB0aGUgYmFzZSBhbmQgQi4KKwkJICovCisJCWVudFsxXSA9IGVudFsyXTsKKwkJcmVzdWx0ID0gYnVpbHRpbl9kaWZmX3RyZWUoJnJldiwgYXJnYywgYXJndiwgZW50KTsKKwl9CisJZWxzZQorCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfY29tYmluZWQoJnJldiwgYXJnYywgYXJndiwKKwkJCQkJICAgICBlbnQsIGVudHMpOworCWlmIChyZXYuZGlmZm9wdC5leGl0X3dpdGhfc3RhdHVzKQorCQlyZXN1bHQgPSByZXYuZGlmZm9wdC5oYXNfY2hhbmdlczsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1mZXRjaC0tdG9vbC5jIGIvYnVpbHRpbi1mZXRjaC0tdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWRiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWZldGNoLS10b29sLmMKQEAgLTAsMCArMSw1OTAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKworI2RlZmluZSBDSFVOS19TSVpFIDEwMjQKKworc3RhdGljIGNoYXIgKmdldF9zdGRpbih2b2lkKQoreworCXNpemVfdCBvZmZzZXQgPSAwOworCWNoYXIgKmRhdGEgPSB4bWFsbG9jKENIVU5LX1NJWkUpOworCisJd2hpbGUgKDEpIHsKKwkJc3NpemVfdCBjbnQgPSB4cmVhZCgwLCBkYXRhICsgb2Zmc2V0LCBDSFVOS19TSVpFKTsKKwkJaWYgKGNudCA8IDApCisJCQlkaWUoImVycm9yIHJlYWRpbmcgc3RhbmRhcmQgaW5wdXQ6ICVzIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY250ID09IDApIHsKKwkJCWRhdGFbb2Zmc2V0XSA9IDA7CisJCQlicmVhazsKKwkJfQorCQlvZmZzZXQgKz0gY250OworCQlkYXRhID0geHJlYWxsb2MoZGF0YSwgb2Zmc2V0ICsgQ0hVTktfU0laRSk7CisJfQorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBzaG93X25ldyhlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGNoYXIgKnNoYTFfbmV3KQoreworCWZwcmludGYoc3RkZXJyLCAiICAlczogJXNcbiIsIHR5cGVuYW1lKHR5cGUpLAorCQlmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMV9uZXcsIERFRkFVTFRfQUJCUkVWKSk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3JlZihjb25zdCBjaGFyICphY3Rpb24sCisJCSAgICAgIGNvbnN0IGNoYXIgKnJlZm5hbWUsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm9sZHZhbCkKK3sKKwljaGFyIG1zZ1sxMDI0XTsKKwljaGFyICpybGEgPSBnZXRlbnYoIkdJVF9SRUZMT0dfQUNUSU9OIik7CisJc3RhdGljIHN0cnVjdCByZWZfbG9jayAqbG9jazsKKworCWlmICghcmxhKQorCQlybGEgPSAiKHJlZmxvZyB1cGRhdGUpIjsKKwlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiJXM6ICVzIiwgcmxhLCBhY3Rpb24pOworCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShyZWZuYW1lLCBvbGR2YWwpOworCWlmICghbG9jaykKKwkJcmV0dXJuIDE7CisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIHNoYTEsIG1zZykgPCAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfbG9jYWxfcmVmKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgY29uc3QgY2hhciAqbmV3X2hlYWQsCisJCQkgICAgY29uc3QgY2hhciAqbm90ZSwKKwkJCSAgICBpbnQgdmVyYm9zZSwgaW50IGZvcmNlKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMV9vbGRbMjBdLCBzaGExX25ld1syMF07CisJY2hhciBvbGRoWzQxXSwgbmV3aFs0MV07CisJc3RydWN0IGNvbW1pdCAqY3VycmVudCwgKnVwZGF0ZWQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJaWYgKGdldF9zaGExX2hleChuZXdfaGVhZCwgc2hhMV9uZXcpKQorCQlkaWUoIm1hbGZvcm1lZCBvYmplY3QgbmFtZSAlcyIsIG5ld19oZWFkKTsKKworCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTFfbmV3LCBOVUxMKTsKKwlpZiAodHlwZSA8IDApCisJCWRpZSgib2JqZWN0ICVzIG5vdCBmb3VuZCIsIG5ld19oZWFkKTsKKworCWlmICghKm5hbWUpIHsKKwkJLyogTm90IHN0b3JpbmcgKi8KKwkJaWYgKHZlcmJvc2UpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiKiBmZXRjaGVkICVzXG4iLCBub3RlKTsKKwkJCXNob3dfbmV3KHR5cGUsIHNoYTFfbmV3KTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ2V0X3NoYTEobmFtZSwgc2hhMV9vbGQpKSB7CisJCWNoYXIgKm1zZzsKKwlqdXN0X3N0b3JlOgorCQkvKiBuZXcgcmVmICovCisJCWlmICghc3RybmNtcChuYW1lLCAicmVmcy90YWdzLyIsIDEwKSkKKwkJCW1zZyA9ICJzdG9yaW5nIHRhZyI7CisJCWVsc2UKKwkJCW1zZyA9ICJzdG9yaW5nIGhlYWQiOworCQlmcHJpbnRmKHN0ZGVyciwgIiogJXM6IHN0b3JpbmcgJXNcbiIsCisJCQluYW1lLCBub3RlKTsKKwkJc2hvd19uZXcodHlwZSwgc2hhMV9uZXcpOworCQlyZXR1cm4gdXBkYXRlX3JlZihtc2csIG5hbWUsIHNoYTFfbmV3LCBOVUxMKTsKKwl9CisKKwlpZiAoIWhhc2hjbXAoc2hhMV9vbGQsIHNoYTFfbmV3KSkgeworCQlpZiAodmVyYm9zZSkgeworCQkJZnByaW50ZihzdGRlcnIsICIqICVzOiBzYW1lIGFzICVzXG4iLCBuYW1lLCBub3RlKTsKKwkJCXNob3dfbmV3KHR5cGUsIHNoYTFfbmV3KTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cm5jbXAobmFtZSwgInJlZnMvdGFncy8iLCAxMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIqICVzOiB1cGRhdGluZyB3aXRoICVzXG4iLCBuYW1lLCBub3RlKTsKKwkJc2hvd19uZXcodHlwZSwgc2hhMV9uZXcpOworCQlyZXR1cm4gdXBkYXRlX3JlZigidXBkYXRpbmcgdGFnIiwgbmFtZSwgc2hhMV9uZXcsIE5VTEwpOworCX0KKworCWN1cnJlbnQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExX29sZCk7CisJdXBkYXRlZCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTFfbmV3KTsKKwlpZiAoIWN1cnJlbnQgfHwgIXVwZGF0ZWQpCisJCWdvdG8ganVzdF9zdG9yZTsKKworCXN0cmNweShvbGRoLCBmaW5kX3VuaXF1ZV9hYmJyZXYoY3VycmVudC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKSk7CisJc3RyY3B5KG5ld2gsIGZpbmRfdW5pcXVlX2FiYnJldihzaGExX25ldywgREVGQVVMVF9BQkJSRVYpKTsKKworCWlmIChpbl9tZXJnZV9iYXNlcyhjdXJyZW50LCAmdXBkYXRlZCwgMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIqICVzOiBmYXN0IGZvcndhcmQgdG8gJXNcbiIsCisJCQluYW1lLCBub3RlKTsKKwkJZnByaW50ZihzdGRlcnIsICIgIG9sZC4ubmV3OiAlcy4uJXNcbiIsIG9sZGgsIG5ld2gpOworCQlyZXR1cm4gdXBkYXRlX3JlZigiZmFzdCBmb3J3YXJkIiwgbmFtZSwgc2hhMV9uZXcsIHNoYTFfb2xkKTsKKwl9CisJaWYgKCFmb3JjZSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIqICVzOiBub3QgdXBkYXRpbmcgdG8gbm9uLWZhc3QgZm9yd2FyZCAlc1xuIiwKKwkJCW5hbWUsIG5vdGUpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIgIG9sZC4uLm5ldzogJXMuLi4lc1xuIiwgb2xkaCwgbmV3aCk7CisJCXJldHVybiAxOworCX0KKwlmcHJpbnRmKHN0ZGVyciwKKwkJIiogJXM6IGZvcmNpbmcgdXBkYXRlIHRvIG5vbi1mYXN0IGZvcndhcmQgJXNcbiIsCisJCW5hbWUsIG5vdGUpOworCWZwcmludGYoc3RkZXJyLCAiICBvbGQuLi5uZXc6ICVzLi4uJXNcbiIsIG9sZGgsIG5ld2gpOworCXJldHVybiB1cGRhdGVfcmVmKCJmb3JjZWQtdXBkYXRlIiwgbmFtZSwgc2hhMV9uZXcsIHNoYTFfb2xkKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfZmV0Y2hfaGVhZChGSUxFICpmcCwKKwkJCSAgICAgY29uc3QgY2hhciAqaGVhZCwgY29uc3QgY2hhciAqcmVtb3RlLAorCQkJICAgICBjb25zdCBjaGFyICpyZW1vdGVfbmFtZSwgY29uc3QgY2hhciAqcmVtb3RlX25pY2ssCisJCQkgICAgIGNvbnN0IGNoYXIgKmxvY2FsX25hbWUsIGludCBub3RfZm9yX21lcmdlLAorCQkJICAgICBpbnQgdmVyYm9zZSwgaW50IGZvcmNlKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlpbnQgcmVtb3RlX2xlbiwgaSwgbm90ZV9sZW47CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIG5vdGVbMTAyNF07CisJY29uc3QgY2hhciAqd2hhdCwgKmtpbmQ7CisKKwlpZiAoZ2V0X3NoYTEoaGVhZCwgc2hhMSkpCisJCXJldHVybiBlcnJvcigiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWU6ICVzIiwgaGVhZCk7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCW5vdF9mb3JfbWVyZ2UgPSAxOworCisJaWYgKCFzdHJjbXAocmVtb3RlX25hbWUsICJIRUFEIikpIHsKKwkJa2luZCA9ICIiOworCQl3aGF0ID0gIiI7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKHJlbW90ZV9uYW1lLCAicmVmcy9oZWFkcy8iLCAxMSkpIHsKKwkJa2luZCA9ICJicmFuY2giOworCQl3aGF0ID0gcmVtb3RlX25hbWUgKyAxMTsKKwl9CisJZWxzZSBpZiAoIXN0cm5jbXAocmVtb3RlX25hbWUsICJyZWZzL3RhZ3MvIiwgMTApKSB7CisJCWtpbmQgPSAidGFnIjsKKwkJd2hhdCA9IHJlbW90ZV9uYW1lICsgMTA7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKHJlbW90ZV9uYW1lLCAicmVmcy9yZW1vdGVzLyIsIDEzKSkgeworCQlraW5kID0gInJlbW90ZSBicmFuY2giOworCQl3aGF0ID0gcmVtb3RlX25hbWUgKyAxMzsKKwl9CisJZWxzZSB7CisJCWtpbmQgPSAiIjsKKwkJd2hhdCA9IHJlbW90ZV9uYW1lOworCX0KKworCXJlbW90ZV9sZW4gPSBzdHJsZW4ocmVtb3RlKTsKKwlmb3IgKGkgPSByZW1vdGVfbGVuIC0gMTsgcmVtb3RlW2ldID09ICcvJyAmJiAwIDw9IGk7IGktLSkKKwkJOworCXJlbW90ZV9sZW4gPSBpICsgMTsKKwlpZiAoNCA8IGkgJiYgIXN0cm5jbXAoIi5naXQiLCByZW1vdGUgKyBpIC0gMywgNCkpCisJCXJlbW90ZV9sZW4gPSBpIC0gMzsKKworCW5vdGVfbGVuID0gMDsKKwlpZiAoKndoYXQpIHsKKwkJaWYgKCpraW5kKQorCQkJbm90ZV9sZW4gKz0gc3ByaW50Zihub3RlICsgbm90ZV9sZW4sICIlcyAiLCBraW5kKTsKKwkJbm90ZV9sZW4gKz0gc3ByaW50Zihub3RlICsgbm90ZV9sZW4sICInJXMnIG9mICIsIHdoYXQpOworCX0KKwlub3RlX2xlbiArPSBzcHJpbnRmKG5vdGUgKyBub3RlX2xlbiwgIiUuKnMiLCByZW1vdGVfbGVuLCByZW1vdGUpOworCWZwcmludGYoZnAsICIlc1x0JXNcdCVzXG4iLAorCQlzaGExX3RvX2hleChjb21taXQgPyBjb21taXQtPm9iamVjdC5zaGExIDogc2hhMSksCisJCW5vdF9mb3JfbWVyZ2UgPyAibm90LWZvci1tZXJnZSIgOiAiIiwKKwkJbm90ZSk7CisJcmV0dXJuIHVwZGF0ZV9sb2NhbF9yZWYobG9jYWxfbmFtZSwgaGVhZCwgbm90ZSwgdmVyYm9zZSwgZm9yY2UpOworfQorCitzdGF0aWMgY2hhciAqa2VlcDsKK3N0YXRpYyB2b2lkIHJlbW92ZV9rZWVwKHZvaWQpCit7CisJaWYgKGtlZXAgJiYgKmtlZXApCisJCXVubGluayhrZWVwKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2tlZXBfb25fc2lnbmFsKGludCBzaWdubykKK3sKKwlyZW1vdmVfa2VlcCgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworc3RhdGljIGNoYXIgKmZpbmRfbG9jYWxfbmFtZShjb25zdCBjaGFyICpyZW1vdGVfbmFtZSwgY29uc3QgY2hhciAqcmVmcywKKwkJCSAgICAgaW50ICpmb3JjZV9wLCBpbnQgKm5vdF9mb3JfbWVyZ2VfcCkKK3sKKwljb25zdCBjaGFyICpyZWYgPSByZWZzOworCWludCBsZW4gPSBzdHJsZW4ocmVtb3RlX25hbWUpOworCisJd2hpbGUgKHJlZikgeworCQljb25zdCBjaGFyICpuZXh0OworCQlpbnQgc2luZ2xlX2ZvcmNlLCBub3RfZm9yX21lcmdlOworCisJCXdoaWxlICgqcmVmID09ICdcbicpCisJCQlyZWYrKzsKKwkJaWYgKCEqcmVmKQorCQkJYnJlYWs7CisJCW5leHQgPSBzdHJjaHIocmVmLCAnXG4nKTsKKworCQlzaW5nbGVfZm9yY2UgPSBub3RfZm9yX21lcmdlID0gMDsKKwkJaWYgKCpyZWYgPT0gJysnKSB7CisJCQlzaW5nbGVfZm9yY2UgPSAxOworCQkJcmVmKys7CisJCX0KKwkJaWYgKCpyZWYgPT0gJy4nKSB7CisJCQlub3RfZm9yX21lcmdlID0gMTsKKwkJCXJlZisrOworCQkJaWYgKCpyZWYgPT0gJysnKSB7CisJCQkJc2luZ2xlX2ZvcmNlID0gMTsKKwkJCQlyZWYrKzsKKwkJCX0KKwkJfQorCQlpZiAoIXN0cm5jbXAocmVtb3RlX25hbWUsIHJlZiwgbGVuKSAmJiByZWZbbGVuXSA9PSAnOicpIHsKKwkJCWNvbnN0IGNoYXIgKmxvY2FsX3BhcnQgPSByZWYgKyBsZW4gKyAxOworCQkJY2hhciAqcmV0OworCQkJaW50IHJldGxlbjsKKworCQkJaWYgKCFuZXh0KQorCQkJCXJldGxlbiA9IHN0cmxlbihsb2NhbF9wYXJ0KTsKKwkJCWVsc2UKKwkJCQlyZXRsZW4gPSBuZXh0IC0gbG9jYWxfcGFydDsKKwkJCXJldCA9IHhtYWxsb2MocmV0bGVuICsgMSk7CisJCQltZW1jcHkocmV0LCBsb2NhbF9wYXJ0LCByZXRsZW4pOworCQkJcmV0W3JldGxlbl0gPSAwOworCQkJKmZvcmNlX3AgPSBzaW5nbGVfZm9yY2U7CisJCQkqbm90X2Zvcl9tZXJnZV9wID0gbm90X2Zvcl9tZXJnZTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmVmID0gbmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfbmF0aXZlX3N0b3JlKEZJTEUgKmZwLAorCQkJICAgICAgY29uc3QgY2hhciAqcmVtb3RlLAorCQkJICAgICAgY29uc3QgY2hhciAqcmVtb3RlX25pY2ssCisJCQkgICAgICBjb25zdCBjaGFyICpyZWZzLAorCQkJICAgICAgaW50IHZlcmJvc2UsIGludCBmb3JjZSkKK3sKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlpbnQgZXJyID0gMDsKKworCXNpZ25hbChTSUdJTlQsIHJlbW92ZV9rZWVwX29uX3NpZ25hbCk7CisJYXRleGl0KHJlbW92ZV9rZWVwKTsKKworCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbikpIHsKKwkJaW50IGxlbjsKKwkJY2hhciAqY3A7CisJCWNoYXIgKmxvY2FsX25hbWU7CisJCWludCBzaW5nbGVfZm9yY2UsIG5vdF9mb3JfbWVyZ2U7CisKKwkJZm9yIChjcCA9IGJ1ZmZlcjsgKmNwICYmICFpc3NwYWNlKCpjcCk7IGNwKyspCisJCQk7CisJCWlmICgqY3ApCisJCQkqY3ArKyA9IDA7CisJCWxlbiA9IHN0cmxlbihjcCk7CisJCWlmIChsZW4gJiYgY3BbbGVuLTFdID09ICdcbicpCisJCQljcFstLWxlbl0gPSAwOworCQlpZiAoIXN0cmNtcChidWZmZXIsICJmYWlsZWQiKSkKKwkJCWRpZSgiRmV0Y2ggZmFpbHVyZTogJXMiLCByZW1vdGUpOworCQlpZiAoIXN0cmNtcChidWZmZXIsICJwYWNrIikpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoYnVmZmVyLCAia2VlcCIpKSB7CisJCQljaGFyICpvZCA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJCQlpbnQgbGVuID0gc3RybGVuKG9kKSArIHN0cmxlbihjcCkgKyA1MDsKKwkJCWtlZXAgPSB4bWFsbG9jKGxlbik7CisJCQlzcHJpbnRmKGtlZXAsICIlcy9wYWNrL3BhY2stJXMua2VlcCIsIG9kLCBjcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWxvY2FsX25hbWUgPSBmaW5kX2xvY2FsX25hbWUoY3AsIHJlZnMsCisJCQkJCSAgICAgJnNpbmdsZV9mb3JjZSwgJm5vdF9mb3JfbWVyZ2UpOworCQlpZiAoIWxvY2FsX25hbWUpCisJCQljb250aW51ZTsKKwkJZXJyIHw9IGFwcGVuZF9mZXRjaF9oZWFkKGZwLAorCQkJCQkgYnVmZmVyLCByZW1vdGUsIGNwLCByZW1vdGVfbmljaywKKwkJCQkJIGxvY2FsX25hbWUsIG5vdF9mb3JfbWVyZ2UsCisJCQkJCSB2ZXJib3NlLCBmb3JjZSB8fCBzaW5nbGVfZm9yY2UpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBhcnNlX3JlZmxpc3QoY29uc3QgY2hhciAqcmVmbGlzdCkKK3sKKwljb25zdCBjaGFyICpyZWY7CisKKwlwcmludGYoInJlZnM9JyIpOworCWZvciAocmVmID0gcmVmbGlzdDsgcmVmOyApIHsKKwkJY29uc3QgY2hhciAqbmV4dDsKKwkJd2hpbGUgKCpyZWYgJiYgaXNzcGFjZSgqcmVmKSkKKwkJCXJlZisrOworCQlpZiAoISpyZWYpCisJCQlicmVhazsKKwkJZm9yIChuZXh0ID0gcmVmOyAqbmV4dCAmJiAhaXNzcGFjZSgqbmV4dCk7IG5leHQrKykKKwkJCTsKKwkJcHJpbnRmKCJcbiUuKnMiLCAoaW50KShuZXh0IC0gcmVmKSwgcmVmKTsKKwkJcmVmID0gbmV4dDsKKwl9CisJcHJpbnRmKCInXG4iKTsKKworCXByaW50ZigicnJlZj0nIik7CisJZm9yIChyZWYgPSByZWZsaXN0OyByZWY7ICkgeworCQljb25zdCBjaGFyICpuZXh0LCAqY29sb247CisJCXdoaWxlICgqcmVmICYmIGlzc3BhY2UoKnJlZikpCisJCQlyZWYrKzsKKwkJaWYgKCEqcmVmKQorCQkJYnJlYWs7CisJCWZvciAobmV4dCA9IHJlZjsgKm5leHQgJiYgIWlzc3BhY2UoKm5leHQpOyBuZXh0KyspCisJCQk7CisJCWlmICgqcmVmID09ICcuJykKKwkJCXJlZisrOworCQlpZiAoKnJlZiA9PSAnKycpCisJCQlyZWYrKzsKKwkJY29sb24gPSBzdHJjaHIocmVmLCAnOicpOworCQlwdXRjaGFyKCdcbicpOworCQlwcmludGYoIiUuKnMiLCAoaW50KSgoY29sb24gPyBjb2xvbiA6IG5leHQpIC0gcmVmKSwgcmVmKTsKKwkJcmVmID0gbmV4dDsKKwl9CisJcHJpbnRmKCInXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHBhbmRfcmVmc193aWxkY2FyZChjb25zdCBjaGFyICpsc19yZW1vdGVfcmVzdWx0LCBpbnQgbnVtcmVmcywKKwkJCQljb25zdCBjaGFyICoqcmVmcykKK3sKKwlpbnQgaSwgbWF0Y2hsZW4sIHJlcGxhY2VsZW47CisJaW50IGZvdW5kX29uZSA9IDA7CisJY29uc3QgY2hhciAqcmVtb3RlID0gKnJlZnMrKzsKKwludW1yZWZzLS07CisKKwlpZiAobnVtcmVmcyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90aGluZyBzcGVjaWZpZWQgZm9yIGZldGNoaW5nIHdpdGggcmVtb3RlLiVzLmZldGNoXG4iLAorCQkJcmVtb3RlKTsKKwkJcHJpbnRmKCJlbXB0eVxuIik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bXJlZnM7IGkrKykgeworCQljb25zdCBjaGFyICpyZWYgPSByZWZzW2ldOworCQljb25zdCBjaGFyICpscmVmID0gcmVmOworCQljb25zdCBjaGFyICpjb2xvbjsKKwkJY29uc3QgY2hhciAqdGFpbDsKKwkJY29uc3QgY2hhciAqbHM7CisJCWNvbnN0IGNoYXIgKm5leHQ7CisKKwkJaWYgKCpscmVmID09ICcrJykKKwkJCWxyZWYrKzsKKwkJY29sb24gPSBzdHJjaHIobHJlZiwgJzonKTsKKwkJdGFpbCA9IGxyZWYgKyBzdHJsZW4obHJlZik7CisJCWlmICghKGNvbG9uICYmCisJCSAgICAgIDIgPCBjb2xvbiAtIGxyZWYgJiYKKwkJICAgICAgY29sb25bLTFdID09ICcqJyAmJgorCQkgICAgICBjb2xvblstMl0gPT0gJy8nICYmCisJCSAgICAgIDIgPCB0YWlsIC0gKGNvbG9uICsgMSkgJiYKKwkJICAgICAgdGFpbFstMV0gPT0gJyonICYmCisJCSAgICAgIHRhaWxbLTJdID09ICcvJykpIHsKKwkJCS8qIG5vdCBhIGdsb2IgKi8KKwkJCWlmICghZm91bmRfb25lKyspCisJCQkJcHJpbnRmKCJleHBsaWNpdFxuIik7CisJCQlwcmludGYoIiVzXG4iLCByZWYpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBnbG9iICovCisJCWlmICghZm91bmRfb25lKyspCisJCQlwcmludGYoImdsb2JcbiIpOworCisJCS8qIGxyZWYgdG8gY29sb24tMiBpcyByZW1vdGUgaGllcmFyY2h5IG5hbWU7CisJCSAqIGNvbG9uKzEgdG8gdGFpbC0yIGlzIGxvY2FsLgorCQkgKi8KKwkJbWF0Y2hsZW4gPSAoY29sb24tMSkgLSBscmVmOworCQlyZXBsYWNlbGVuID0gKHRhaWwtMSkgLSAoY29sb24rMSk7CisJCWZvciAobHMgPSBsc19yZW1vdGVfcmVzdWx0OyBsczsgbHMgPSBuZXh0KSB7CisJCQljb25zdCBjaGFyICplb2w7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJaW50IG5hbWVsZW47CisKKwkJCXdoaWxlICgqbHMgJiYgaXNzcGFjZSgqbHMpKQorCQkJCWxzKys7CisJCQluZXh0ID0gc3RyY2hyKGxzLCAnXG4nKTsKKwkJCWVvbCA9ICFuZXh0ID8gKGxzICsgc3RybGVuKGxzKSkgOiBuZXh0OworCQkJaWYgKCFtZW1jbXAoIl57fSIsIGVvbC0zLCAzKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChlb2wgLSBscyA8IDQwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGdldF9zaGExX2hleChscywgc2hhMSkpCisJCQkJY29udGludWU7CisJCQlscyArPSA0MDsKKwkJCXdoaWxlIChscyA8IGVvbCAmJiBpc3NwYWNlKCpscykpCisJCQkJbHMrKzsKKwkJCS8qIGxzIHRvIG5leHQgKG9yIGVvbCkgaXMgdGhlIG5hbWUuCisJCQkgKiBpcyBpdCBpZGVudGljYWwgdG8gbHJlZiB0byBjb2xvbi0yPworCQkJICovCisJCQlpZiAoKGVvbCAtIGxzKSA8PSBtYXRjaGxlbiB8fAorCQkJICAgIHN0cm5jbXAobHMsIGxyZWYsIG1hdGNobGVuKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogWWVzLCBpdCBpcyBhIG1hdGNoICovCisJCQluYW1lbGVuID0gZW9sIC0gbHM7CisJCQlpZiAobHJlZiAhPSByZWYpCisJCQkJcHV0Y2hhcignKycpOworCQkJcHJpbnRmKCIlLipzOiUuKnMlLipzXG4iLAorCQkJICAgICAgIG5hbWVsZW4sIGxzLAorCQkJICAgICAgIHJlcGxhY2VsZW4sIGNvbG9uICsgMSwKKwkJCSAgICAgICBuYW1lbGVuIC0gbWF0Y2hsZW4sIGxzICsgbWF0Y2hsZW4pOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpY2tfcnJlZihpbnQgc2hhMV9vbmx5LCBjb25zdCBjaGFyICpycmVmLCBjb25zdCBjaGFyICpsc19yZW1vdGVfcmVzdWx0KQoreworCWludCBlcnIgPSAwOworCWludCBscnJfY291bnQgPSBscnJfY291bnQsIGksIHBhc3M7CisJY29uc3QgY2hhciAqY3A7CisJc3RydWN0IGxyciB7CisJCWNvbnN0IGNoYXIgKmxpbmU7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBuYW1lbGVuOworCQlpbnQgc2hvd247CisJfSAqbHJyX2xpc3QgPSBscnJfbGlzdDsKKworCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKwkJLyogcGFzcyAwIGNvdW50cyBhbmQgYWxsb2NhdGVzLCBwYXNzIDEgZmlsbHMuLi4gKi8KKwkJY3AgPSBsc19yZW1vdGVfcmVzdWx0OworCQlpID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWNvbnN0IGNoYXIgKm5wOworCQkJd2hpbGUgKCpjcCAmJiBpc3NwYWNlKCpjcCkpCisJCQkJY3ArKzsKKwkJCWlmICghKmNwKQorCQkJCWJyZWFrOworCQkJbnAgPSBzdHJjaHIoY3AsICdcbicpOworCQkJaWYgKCFucCkKKwkJCQlucCA9IGNwICsgc3RybGVuKGNwKTsKKwkJCWlmIChwYXNzKSB7CisJCQkJbHJyX2xpc3RbaV0ubGluZSA9IGNwOworCQkJCWxycl9saXN0W2ldLm5hbWUgPSBjcCArIDQxOworCQkJCWxycl9saXN0W2ldLm5hbWVsZW4gPSBucCAtIChjcCArIDQxKTsKKwkJCX0KKwkJCWkrKzsKKwkJCWNwID0gbnA7CisJCX0KKwkJaWYgKCFwYXNzKSB7CisJCQlscnJfY291bnQgPSBpOworCQkJbHJyX2xpc3QgPSB4Y2FsbG9jKGxycl9jb3VudCwgc2l6ZW9mKCpscnJfbGlzdCkpOworCQl9CisJfQorCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqbmV4dDsKKwkJaW50IHJyZWZsZW47CisJCWludCBpOworCisJCXdoaWxlICgqcnJlZiAmJiBpc3NwYWNlKCpycmVmKSkKKwkJCXJyZWYrKzsKKwkJaWYgKCEqcnJlZikKKwkJCWJyZWFrOworCQluZXh0ID0gc3RyY2hyKHJyZWYsICdcbicpOworCQlpZiAoIW5leHQpCisJCQluZXh0ID0gcnJlZiArIHN0cmxlbihycmVmKTsKKwkJcnJlZmxlbiA9IG5leHQgLSBycmVmOworCisJCWZvciAoaSA9IDA7IGkgPCBscnJfY291bnQ7IGkrKykgeworCQkJc3RydWN0IGxyciAqbHJyID0gJihscnJfbGlzdFtpXSk7CisKKwkJCWlmIChycmVmbGVuID09IGxyci0+bmFtZWxlbiAmJgorCQkJICAgICFtZW1jbXAobHJyLT5uYW1lLCBycmVmLCBycmVmbGVuKSkgeworCQkJCWlmICghbHJyLT5zaG93bikKKwkJCQkJcHJpbnRmKCIlLipzXG4iLAorCQkJCQkgICAgICAgc2hhMV9vbmx5ID8gNDAgOiBscnItPm5hbWVsZW4gKyA0MSwKKwkJCQkJICAgICAgIGxyci0+bGluZSk7CisJCQkJbHJyLT5zaG93biA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGxycl9jb3VudCA8PSBpKSB7CisJCQllcnJvcigicGljay1ycmVmOiAlLipzIG5vdCBmb3VuZCIsIHJyZWZsZW4sIHJyZWYpOworCQkJZXJyID0gMTsKKwkJfQorCQlycmVmID0gbmV4dDsKKwl9CisJZnJlZShscnJfbGlzdCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGNtZF9mZXRjaF9fdG9vbChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgdmVyYm9zZSA9IDA7CisJaW50IGZvcmNlID0gMDsKKwlpbnQgc29wdCA9IDA7CisKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSkKKwkJCXZlcmJvc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKCItZiIsIGFyZykpCisJCQlmb3JjZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgYXJnKSkKKwkJCXNvcHQgPSAxOworCQllbHNlCisJCQlicmVhazsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgPD0gMSkKKwkJcmV0dXJuIGVycm9yKCJNaXNzaW5nIHN1YmNvbW1hbmQiKTsKKworCWlmICghc3RyY21wKCJhcHBlbmQtZmV0Y2gtaGVhZCIsIGFyZ3ZbMV0pKSB7CisJCWludCByZXN1bHQ7CisJCUZJTEUgKmZwOworCisJCWlmIChhcmdjICE9IDgpCisJCQlyZXR1cm4gZXJyb3IoImFwcGVuZC1mZXRjaC1oZWFkIHRha2VzIDYgYXJncyIpOworCQlmcCA9IGZvcGVuKGdpdF9wYXRoKCJGRVRDSF9IRUFEIiksICJhIik7CisJCXJlc3VsdCA9IGFwcGVuZF9mZXRjaF9oZWFkKGZwLCBhcmd2WzJdLCBhcmd2WzNdLAorCQkJCQkgICBhcmd2WzRdLCBhcmd2WzVdLAorCQkJCQkgICBhcmd2WzZdLCAhIWFyZ3ZbN11bMF0sCisJCQkJCSAgIHZlcmJvc2UsIGZvcmNlKTsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKCFzdHJjbXAoIm5hdGl2ZS1zdG9yZSIsIGFyZ3ZbMV0pKSB7CisJCWludCByZXN1bHQ7CisJCUZJTEUgKmZwOworCisJCWlmIChhcmdjICE9IDUpCisJCQlyZXR1cm4gZXJyb3IoImZldGNoLW5hdGl2ZS1zdG9yZSB0YWtlcyAzIGFyZ3MiKTsKKwkJZnAgPSBmb3BlbihnaXRfcGF0aCgiRkVUQ0hfSEVBRCIpLCAiYSIpOworCQlyZXN1bHQgPSBmZXRjaF9uYXRpdmVfc3RvcmUoZnAsIGFyZ3ZbMl0sIGFyZ3ZbM10sIGFyZ3ZbNF0sCisJCQkJCSAgICB2ZXJib3NlLCBmb3JjZSk7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmICghc3RyY21wKCJwYXJzZS1yZWZsaXN0IiwgYXJndlsxXSkpIHsKKwkJY29uc3QgY2hhciAqcmVmbGlzdDsKKwkJaWYgKGFyZ2MgIT0gMykKKwkJCXJldHVybiBlcnJvcigicGFyc2UtcmVmbGlzdCB0YWtlcyAxIGFyZyIpOworCQlyZWZsaXN0ID0gYXJndlsyXTsKKwkJaWYgKCFzdHJjbXAocmVmbGlzdCwgIi0iKSkKKwkJCXJlZmxpc3QgPSBnZXRfc3RkaW4oKTsKKwkJcmV0dXJuIHBhcnNlX3JlZmxpc3QocmVmbGlzdCk7CisJfQorCWlmICghc3RyY21wKCJwaWNrLXJyZWYiLCBhcmd2WzFdKSkgeworCQljb25zdCBjaGFyICpsc19yZW1vdGVfcmVzdWx0OworCQlpZiAoYXJnYyAhPSA0KQorCQkJcmV0dXJuIGVycm9yKCJwaWNrLXJyZWYgdGFrZXMgMiBhcmdzIik7CisJCWxzX3JlbW90ZV9yZXN1bHQgPSBhcmd2WzNdOworCQlpZiAoIXN0cmNtcChsc19yZW1vdGVfcmVzdWx0LCAiLSIpKQorCQkJbHNfcmVtb3RlX3Jlc3VsdCA9IGdldF9zdGRpbigpOworCQlyZXR1cm4gcGlja19ycmVmKHNvcHQsIGFyZ3ZbMl0sIGxzX3JlbW90ZV9yZXN1bHQpOworCX0KKwlpZiAoIXN0cmNtcCgiZXhwYW5kLXJlZnMtd2lsZGNhcmQiLCBhcmd2WzFdKSkgeworCQljb25zdCBjaGFyICpyZWZsaXN0OworCQlpZiAoYXJnYyA8IDQpCisJCQlyZXR1cm4gZXJyb3IoImV4cGFuZC1yZWZzLXdpbGRjYXJkIHRha2VzIGF0IGxlYXN0IDIgYXJncyIpOworCQlyZWZsaXN0ID0gYXJndlsyXTsKKwkJaWYgKCFzdHJjbXAocmVmbGlzdCwgIi0iKSkKKwkJCXJlZmxpc3QgPSBnZXRfc3RkaW4oKTsKKwkJcmV0dXJuIGV4cGFuZF9yZWZzX3dpbGRjYXJkKHJlZmxpc3QsIGFyZ2MgLSAzLCBhcmd2ICsgMyk7CisJfQorCisJcmV0dXJuIGVycm9yKCJVbmtub3duIHN1YmNvbW1hbmQ6ICVzIiwgYXJndlsxXSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWZtdC1tZXJnZS1tc2cuYyBiL2J1aWx0aW4tZm10LW1lcmdlLW1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTQ1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWZtdC1tZXJnZS1tc2cuYwpAQCAtMCwwICsxLDM2MCBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInRhZy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZm10X21lcmdlX21zZ191c2FnZSA9CisJImdpdC1mbXQtbWVyZ2UtbXNnIFstLXN1bW1hcnldIFstLW5vLXN1bW1hcnldIFstLWZpbGUgPGZpbGU+XSI7CisKK3N0YXRpYyBpbnQgbWVyZ2Vfc3VtbWFyeTsKKworc3RhdGljIGludCBmbXRfbWVyZ2VfbXNnX2NvbmZpZyhjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKCJtZXJnZS5zdW1tYXJ5Iiwga2V5KSkKKwkJbWVyZ2Vfc3VtbWFyeSA9IGdpdF9jb25maWdfYm9vbChrZXksIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxpc3QgeworCWNoYXIgKipsaXN0OworCXZvaWQgKipwYXlsb2FkOworCXVuc2lnbmVkIG5yLCBhbGxvYzsKK307CisKK3N0YXRpYyB2b2lkIGFwcGVuZF90b19saXN0KHN0cnVjdCBsaXN0ICpsaXN0LCBjaGFyICp2YWx1ZSwgdm9pZCAqcGF5bG9hZCkKK3sKKwlpZiAobGlzdC0+bnIgPT0gbGlzdC0+YWxsb2MpIHsKKwkJbGlzdC0+YWxsb2MgKz0gMzI7CisJCWxpc3QtPmxpc3QgPSB4cmVhbGxvYyhsaXN0LT5saXN0LCBzaXplb2YoY2hhciAqKSAqIGxpc3QtPmFsbG9jKTsKKwkJbGlzdC0+cGF5bG9hZCA9IHhyZWFsbG9jKGxpc3QtPnBheWxvYWQsCisJCQkJc2l6ZW9mKGNoYXIgKikgKiBsaXN0LT5hbGxvYyk7CisJfQorCWxpc3QtPnBheWxvYWRbbGlzdC0+bnJdID0gcGF5bG9hZDsKKwlsaXN0LT5saXN0W2xpc3QtPm5yKytdID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9pbl9saXN0KHN0cnVjdCBsaXN0ICpsaXN0LCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQlpZiAoIXN0cmNtcChsaXN0LT5saXN0W2ldLCB2YWx1ZSkpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9saXN0KHN0cnVjdCBsaXN0ICpsaXN0KQoreworCWludCBpOworCisJaWYgKGxpc3QtPmFsbG9jID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKSB7CisJCWZyZWUobGlzdC0+bGlzdFtpXSk7CisJCWZyZWUobGlzdC0+cGF5bG9hZFtpXSk7CisJfQorCWZyZWUobGlzdC0+bGlzdCk7CisJZnJlZShsaXN0LT5wYXlsb2FkKTsKKwlsaXN0LT5uciA9IGxpc3QtPmFsbG9jID0gMDsKK30KKworc3RydWN0IHNyY19kYXRhIHsKKwlzdHJ1Y3QgbGlzdCBicmFuY2gsIHRhZywgcl9icmFuY2gsIGdlbmVyaWM7CisJaW50IGhlYWRfc3RhdHVzOworfTsKKworc3RhdGljIHN0cnVjdCBsaXN0IHNyY3MgPSB7IE5VTEwsIE5VTEwsIDAsIDB9Oworc3RhdGljIHN0cnVjdCBsaXN0IG9yaWdpbnMgPSB7IE5VTEwsIE5VTEwsIDAsIDB9OworCitzdGF0aWMgaW50IGhhbmRsZV9saW5lKGNoYXIgKmxpbmUpCit7CisJaW50IGksIGxlbiA9IHN0cmxlbihsaW5lKTsKKwl1bnNpZ25lZCBjaGFyICpzaGExOworCWNoYXIgKnNyYywgKm9yaWdpbjsKKwlzdHJ1Y3Qgc3JjX2RhdGEgKnNyY19kYXRhOworCWludCBwdWxsaW5nX2hlYWQgPSAwOworCisJaWYgKGxlbiA8IDQzIHx8IGxpbmVbNDBdICE9ICdcdCcpCisJCXJldHVybiAxOworCisJaWYgKCFwcmVmaXhjbXAobGluZSArIDQxLCAibm90LWZvci1tZXJnZSIpKQorCQlyZXR1cm4gMDsKKworCWlmIChsaW5lWzQxXSAhPSAnXHQnKQorCQlyZXR1cm4gMjsKKworCWxpbmVbNDBdID0gMDsKKwlzaGExID0geG1hbGxvYygyMCk7CisJaSA9IGdldF9zaGExKGxpbmUsIHNoYTEpOworCWxpbmVbNDBdID0gJ1x0JzsKKwlpZiAoaSkKKwkJcmV0dXJuIDM7CisKKwlpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKQorCQlsaW5lW2xlbiAtIDFdID0gMDsKKwlsaW5lICs9IDQyOworCisJc3JjID0gc3Ryc3RyKGxpbmUsICIgb2YgIik7CisJaWYgKHNyYykgeworCQkqc3JjID0gMDsKKwkJc3JjICs9IDQ7CisJCXB1bGxpbmdfaGVhZCA9IDA7CisJfSBlbHNlIHsKKwkJc3JjID0gbGluZTsKKwkJcHVsbGluZ19oZWFkID0gMTsKKwl9CisKKwlpID0gZmluZF9pbl9saXN0KCZzcmNzLCBzcmMpOworCWlmIChpIDwgMCkgeworCQlpID0gc3Jjcy5ucjsKKwkJYXBwZW5kX3RvX2xpc3QoJnNyY3MsIHhzdHJkdXAoc3JjKSwKKwkJCQl4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3JjX2RhdGEpKSk7CisJfQorCXNyY19kYXRhID0gc3Jjcy5wYXlsb2FkW2ldOworCisJaWYgKHB1bGxpbmdfaGVhZCkgeworCQlvcmlnaW4gPSB4c3RyZHVwKHNyYyk7CisJCXNyY19kYXRhLT5oZWFkX3N0YXR1cyB8PSAxOworCX0gZWxzZSBpZiAoIXByZWZpeGNtcChsaW5lLCAiYnJhbmNoICIpKSB7CisJCW9yaWdpbiA9IHhzdHJkdXAobGluZSArIDcpOworCQlhcHBlbmRfdG9fbGlzdCgmc3JjX2RhdGEtPmJyYW5jaCwgb3JpZ2luLCBOVUxMKTsKKwkJc3JjX2RhdGEtPmhlYWRfc3RhdHVzIHw9IDI7CisJfSBlbHNlIGlmICghcHJlZml4Y21wKGxpbmUsICJ0YWcgIikpIHsKKwkJb3JpZ2luID0gbGluZTsKKwkJYXBwZW5kX3RvX2xpc3QoJnNyY19kYXRhLT50YWcsIHhzdHJkdXAob3JpZ2luICsgNCksIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9IGVsc2UgaWYgKCFwcmVmaXhjbXAobGluZSwgInJlbW90ZSBicmFuY2ggIikpIHsKKwkJb3JpZ2luID0geHN0cmR1cChsaW5lICsgMTQpOworCQlhcHBlbmRfdG9fbGlzdCgmc3JjX2RhdGEtPnJfYnJhbmNoLCBvcmlnaW4sIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9IGVsc2UgeworCQlvcmlnaW4gPSB4c3RyZHVwKHNyYyk7CisJCWFwcGVuZF90b19saXN0KCZzcmNfZGF0YS0+Z2VuZXJpYywgeHN0cmR1cChsaW5lKSwgTlVMTCk7CisJCXNyY19kYXRhLT5oZWFkX3N0YXR1cyB8PSAyOworCX0KKworCWlmICghc3RyY21wKCIuIiwgc3JjKSB8fCAhc3RyY21wKHNyYywgb3JpZ2luKSkgeworCQlpbnQgbGVuID0gc3RybGVuKG9yaWdpbik7CisJCWlmIChvcmlnaW5bMF0gPT0gJ1wnJyAmJiBvcmlnaW5bbGVuIC0gMV0gPT0gJ1wnJykgeworCQkJY2hhciAqbmV3X29yaWdpbiA9IHhtYWxsb2MobGVuIC0gMSk7CisJCQltZW1jcHkobmV3X29yaWdpbiwgb3JpZ2luICsgMSwgbGVuIC0gMik7CisJCQluZXdfb3JpZ2luW2xlbiAtIDJdID0gMDsKKwkJCW9yaWdpbiA9IG5ld19vcmlnaW47CisJCX0gZWxzZQorCQkJb3JpZ2luID0geHN0cmR1cChvcmlnaW4pOworCX0gZWxzZSB7CisJCWNoYXIgKm5ld19vcmlnaW4gPSB4bWFsbG9jKHN0cmxlbihvcmlnaW4pICsgc3RybGVuKHNyYykgKyA1KTsKKwkJc3ByaW50ZihuZXdfb3JpZ2luLCAiJXMgb2YgJXMiLCBvcmlnaW4sIHNyYyk7CisJCW9yaWdpbiA9IG5ld19vcmlnaW47CisJfQorCWFwcGVuZF90b19saXN0KCZvcmlnaW5zLCBvcmlnaW4sIHNoYTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9qb2luZWQoY29uc3QgY2hhciAqc2luZ3VsYXIsIGNvbnN0IGNoYXIgKnBsdXJhbCwKKwkJc3RydWN0IGxpc3QgKmxpc3QpCit7CisJaWYgKGxpc3QtPm5yID09IDApCisJCXJldHVybjsKKwlpZiAobGlzdC0+bnIgPT0gMSkgeworCQlwcmludGYoIiVzJXMiLCBzaW5ndWxhciwgbGlzdC0+bGlzdFswXSk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXByaW50ZigiJXMiLCBwbHVyYWwpOworCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnIgLSAxOyBpKyspCisJCQlwcmludGYoIiVzJXMiLCBpID4gMCA/ICIsICIgOiAiIiwgbGlzdC0+bGlzdFtpXSk7CisJCXByaW50ZigiIGFuZCAlcyIsIGxpc3QtPmxpc3RbbGlzdC0+bnIgLSAxXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG9ydGxvZyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQlzdHJ1Y3QgY29tbWl0ICpoZWFkLCBzdHJ1Y3QgcmV2X2luZm8gKnJldiwgaW50IGxpbWl0KQoreworCWludCBpLCBjb3VudCA9IDA7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvYmplY3QgKmJyYW5jaDsKKwlzdHJ1Y3QgbGlzdCBzdWJqZWN0cyA9IHsgTlVMTCwgTlVMTCwgMCwgMCB9OworCWludCBmbGFncyA9IFVOSU5URVJFU1RJTkcgfCBUUkVFQ0hBTkdFIHwgU0VFTiB8IFNIT1dOIHwgQURERUQ7CisKKwlicmFuY2ggPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCBzaGExX3RvX2hleChzaGExKSwgNDApOworCWlmICghYnJhbmNoIHx8IGJyYW5jaC0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm47CisKKwlzZXR1cF9yZXZpc2lvbnMoMCwgTlVMTCwgcmV2LCBOVUxMKTsKKwlyZXYtPmlnbm9yZV9tZXJnZXMgPSAxOworCWFkZF9wZW5kaW5nX29iamVjdChyZXYsIGJyYW5jaCwgbmFtZSk7CisJYWRkX3BlbmRpbmdfb2JqZWN0KHJldiwgJmhlYWQtPm9iamVjdCwgIl5IRUFEIik7CisJaGVhZC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldik7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2KSkgIT0gTlVMTCkgeworCQljaGFyICpvbmVsaW5lLCAqYm9sLCAqZW9sOworCisJCS8qIGlnbm9yZSBtZXJnZXMgKi8KKwkJaWYgKGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCQljb250aW51ZTsKKworCQljb3VudCsrOworCQlpZiAoc3ViamVjdHMubnIgPiBsaW1pdCkKKwkJCWNvbnRpbnVlOworCisJCWJvbCA9IHN0cnN0cihjb21taXQtPmJ1ZmZlciwgIlxuXG4iKTsKKwkJaWYgKCFib2wpIHsKKwkJCWFwcGVuZF90b19saXN0KCZzdWJqZWN0cywgeHN0cmR1cChzaGExX3RvX2hleCgKKwkJCQkJCQljb21taXQtPm9iamVjdC5zaGExKSksCisJCQkJCU5VTEwpOworCQkJY29udGludWU7CisJCX0KKworCQlib2wgKz0gMjsKKwkJZW9sID0gc3RyY2hyKGJvbCwgJ1xuJyk7CisKKwkJaWYgKGVvbCkgeworCQkJaW50IGxlbiA9IGVvbCAtIGJvbDsKKwkJCW9uZWxpbmUgPSB4bWFsbG9jKGxlbiArIDEpOworCQkJbWVtY3B5KG9uZWxpbmUsIGJvbCwgbGVuKTsKKwkJCW9uZWxpbmVbbGVuXSA9IDA7CisJCX0gZWxzZQorCQkJb25lbGluZSA9IHhzdHJkdXAoYm9sKTsKKwkJYXBwZW5kX3RvX2xpc3QoJnN1YmplY3RzLCBvbmVsaW5lLCBOVUxMKTsKKwl9CisKKwlpZiAoY291bnQgPiBsaW1pdCkKKwkJcHJpbnRmKCJcbiogJXM6ICglZCBjb21taXRzKVxuIiwgbmFtZSwgY291bnQpOworCWVsc2UKKwkJcHJpbnRmKCJcbiogJXM6XG4iLCBuYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdWJqZWN0cy5ucjsgaSsrKQorCQlpZiAoaSA+PSBsaW1pdCkKKwkJCXByaW50ZigiICAuLi5cbiIpOworCQllbHNlCisJCQlwcmludGYoIiAgJXNcbiIsIHN1YmplY3RzLmxpc3RbaV0pOworCisJY2xlYXJfY29tbWl0X21hcmtzKChzdHJ1Y3QgY29tbWl0ICopYnJhbmNoLCBmbGFncyk7CisJY2xlYXJfY29tbWl0X21hcmtzKGhlYWQsIGZsYWdzKTsKKwlmcmVlX2NvbW1pdF9saXN0KHJldi0+Y29tbWl0cyk7CisJcmV2LT5jb21taXRzID0gTlVMTDsKKwlyZXYtPnBlbmRpbmcubnIgPSAwOworCisJZnJlZV9saXN0KCZzdWJqZWN0cyk7Cit9CisKK2ludCBjbWRfZm10X21lcmdlX21zZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbGltaXQgPSAyMCwgaSA9IDA7CisJY2hhciBsaW5lWzEwMjRdOworCUZJTEUgKmluID0gc3RkaW47CisJY29uc3QgY2hhciAqc2VwID0gIiI7CisJdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworCWNvbnN0IGNoYXIgKmN1cnJlbnRfYnJhbmNoOworCisJZ2l0X2NvbmZpZyhmbXRfbWVyZ2VfbXNnX2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnYyA+IDEpIHsKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tc3VtbWFyeSIpKQorCQkJbWVyZ2Vfc3VtbWFyeSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tbm8tc3VtbWFyeSIpKQorCQkJbWVyZ2Vfc3VtbWFyeSA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1GIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS1maWxlIikpIHsKKwkJCWlmIChhcmdjIDwgMykKKwkJCQlkaWUgKCJXaGljaCBmaWxlPyIpOworCQkJaWYgKCFzdHJjbXAoYXJndlsyXSwgIi0iKSkKKwkJCQlpbiA9IHN0ZGluOworCQkJZWxzZSB7CisJCQkJZmNsb3NlKGluKTsKKwkJCQlpbiA9IGZvcGVuKGFyZ3ZbMl0sICJyIik7CisJCQkJaWYgKCFpbikKKwkJCQkJZGllKCJjYW5ub3Qgb3BlbiAlcyIsIGFyZ3ZbMl0pOworCQkJfQorCQkJYXJnYy0tOyBhcmd2Kys7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChhcmdjID4gMSkKKwkJdXNhZ2UoZm10X21lcmdlX21zZ191c2FnZSk7CisKKwkvKiBnZXQgY3VycmVudCBicmFuY2ggKi8KKwljdXJyZW50X2JyYW5jaCA9IHJlc29sdmVfcmVmKCJIRUFEIiwgaGVhZF9zaGExLCAxLCBOVUxMKTsKKwlpZiAoIWN1cnJlbnRfYnJhbmNoKQorCQlkaWUoIk5vIGN1cnJlbnQgYnJhbmNoIik7CisJaWYgKCFwcmVmaXhjbXAoY3VycmVudF9icmFuY2gsICJyZWZzL2hlYWRzLyIpKQorCQljdXJyZW50X2JyYW5jaCArPSAxMTsKKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgeworCQlpKys7CisJCWlmIChsaW5lWzBdID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGhhbmRsZV9saW5lKGxpbmUpKQorCQkJZGllICgiRXJyb3IgaW4gbGluZSAlZDogJXMiLCBpLCBsaW5lKTsKKwl9CisKKwlwcmludGYoIk1lcmdlICIpOworCWZvciAoaSA9IDA7IGkgPCBzcmNzLm5yOyBpKyspIHsKKwkJc3RydWN0IHNyY19kYXRhICpzcmNfZGF0YSA9IHNyY3MucGF5bG9hZFtpXTsKKwkJY29uc3QgY2hhciAqc3Vic2VwID0gIiI7CisKKwkJcHJpbnRmKHNlcCk7CisJCXNlcCA9ICI7ICI7CisKKwkJaWYgKHNyY19kYXRhLT5oZWFkX3N0YXR1cyA9PSAxKSB7CisJCQlwcmludGYoc3Jjcy5saXN0W2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzcmNfZGF0YS0+aGVhZF9zdGF0dXMgPT0gMykgeworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50ZigiSEVBRCIpOworCQl9CisJCWlmIChzcmNfZGF0YS0+YnJhbmNoLm5yKSB7CisJCQlwcmludGYoc3Vic2VwKTsKKwkJCXN1YnNlcCA9ICIsICI7CisJCQlwcmludF9qb2luZWQoImJyYW5jaCAiLCAiYnJhbmNoZXMgIiwgJnNyY19kYXRhLT5icmFuY2gpOworCQl9CisJCWlmIChzcmNfZGF0YS0+cl9icmFuY2gubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50X2pvaW5lZCgicmVtb3RlIGJyYW5jaCAiLCAicmVtb3RlIGJyYW5jaGVzICIsCisJCQkJCSZzcmNfZGF0YS0+cl9icmFuY2gpOworCQl9CisJCWlmIChzcmNfZGF0YS0+dGFnLm5yKSB7CisJCQlwcmludGYoc3Vic2VwKTsKKwkJCXN1YnNlcCA9ICIsICI7CisJCQlwcmludF9qb2luZWQoInRhZyAiLCAidGFncyAiLCAmc3JjX2RhdGEtPnRhZyk7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5nZW5lcmljLm5yKSB7CisJCQlwcmludGYoc3Vic2VwKTsKKwkJCXByaW50X2pvaW5lZCgiY29tbWl0ICIsICJjb21taXRzICIsICZzcmNfZGF0YS0+Z2VuZXJpYyk7CisJCX0KKwkJaWYgKHN0cmNtcCgiLiIsIHNyY3MubGlzdFtpXSkpCisJCQlwcmludGYoIiBvZiAlcyIsIHNyY3MubGlzdFtpXSk7CisJfQorCisJaWYgKCFzdHJjbXAoIm1hc3RlciIsIGN1cnJlbnRfYnJhbmNoKSkKKwkJcHV0Y2hhcignXG4nKTsKKwllbHNlCisJCXByaW50ZigiIGludG8gJXNcbiIsIGN1cnJlbnRfYnJhbmNoKTsKKworCWlmIChtZXJnZV9zdW1tYXJ5KSB7CisJCXN0cnVjdCBjb21taXQgKmhlYWQ7CisJCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwkJaGVhZCA9IGxvb2t1cF9jb21taXQoaGVhZF9zaGExKTsKKwkJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwkJcmV2LmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9PTkVMSU5FOworCQlyZXYuaWdub3JlX21lcmdlcyA9IDE7CisJCXJldi5saW1pdGVkID0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgb3JpZ2lucy5ucjsgaSsrKQorCQkJc2hvcnRsb2cob3JpZ2lucy5saXN0W2ldLCBvcmlnaW5zLnBheWxvYWRbaV0sCisJCQkJCWhlYWQsICZyZXYsIGxpbWl0KTsKKwl9CisKKwkvKiBObyBjbGVhbnVwIHlldDsgaXMgc3RhbmRhbG9uZSBhbnl3YXkgKi8KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9idWlsdGluLWZvci1lYWNoLXJlZi5jIGIvYnVpbHRpbi1mb3ItZWFjaC1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIxODQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mb3ItZWFjaC1yZWYuYwpAQCAtMCwwICsxLDkwNSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworLyogUXVvdGluZyBzdHlsZXMgKi8KKyNkZWZpbmUgUVVPVEVfTk9ORSAwCisjZGVmaW5lIFFVT1RFX1NIRUxMIDEKKyNkZWZpbmUgUVVPVEVfUEVSTCAyCisjZGVmaW5lIFFVT1RFX1BZVEhPTiAzCisjZGVmaW5lIFFVT1RFX1RDTCA0CisKK3R5cGVkZWYgZW51bSB7IEZJRUxEX1NUUiwgRklFTERfVUxPTkcsIEZJRUxEX1RJTUUgfSBjbXBfdHlwZTsKKworc3RydWN0IGF0b21fdmFsdWUgeworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyB1bDsgLyogdXNlZCBmb3Igc29ydGluZyB3aGVuIG5vdCBGSUVMRF9TVFIgKi8KK307CisKK3N0cnVjdCByZWZfc29ydCB7CisJc3RydWN0IHJlZl9zb3J0ICpuZXh0OworCWludCBhdG9tOyAvKiBpbmRleCBpbnRvIHVzZWRfYXRvbSBhcnJheSAqLworCXVuc2lnbmVkIHJldmVyc2UgOiAxOworfTsKKworc3RydWN0IHJlZmluZm8geworCWNoYXIgKnJlZm5hbWU7CisJdW5zaWduZWQgY2hhciBvYmplY3RuYW1lWzIwXTsKKwlzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNtcF90eXBlIGNtcF90eXBlOworfSB2YWxpZF9hdG9tW10gPSB7CisJeyAicmVmbmFtZSIgfSwKKwl7ICJvYmplY3R0eXBlIiB9LAorCXsgIm9iamVjdHNpemUiLCBGSUVMRF9VTE9ORyB9LAorCXsgIm9iamVjdG5hbWUiIH0sCisJeyAidHJlZSIgfSwKKwl7ICJwYXJlbnQiIH0sIC8qIE5FRURTV09SSzogaG93IHRvIGFkZHJlc3MgMm5kIGFuZCBsYXRlciBwYXJlbnRzPyAqLworCXsgIm51bXBhcmVudCIsIEZJRUxEX1VMT05HIH0sCisJeyAib2JqZWN0IiB9LAorCXsgInR5cGUiIH0sCisJeyAidGFnIiB9LAorCXsgImF1dGhvciIgfSwKKwl7ICJhdXRob3JuYW1lIiB9LAorCXsgImF1dGhvcmVtYWlsIiB9LAorCXsgImF1dGhvcmRhdGUiLCBGSUVMRF9USU1FIH0sCisJeyAiY29tbWl0dGVyIiB9LAorCXsgImNvbW1pdHRlcm5hbWUiIH0sCisJeyAiY29tbWl0dGVyZW1haWwiIH0sCisJeyAiY29tbWl0dGVyZGF0ZSIsIEZJRUxEX1RJTUUgfSwKKwl7ICJ0YWdnZXIiIH0sCisJeyAidGFnZ2VybmFtZSIgfSwKKwl7ICJ0YWdnZXJlbWFpbCIgfSwKKwl7ICJ0YWdnZXJkYXRlIiwgRklFTERfVElNRSB9LAorCXsgImNyZWF0b3IiIH0sCisJeyAiY3JlYXRvcmRhdGUiLCBGSUVMRF9USU1FIH0sCisJeyAic3ViamVjdCIgfSwKKwl7ICJib2R5IiB9LAorCXsgImNvbnRlbnRzIiB9LAorfTsKKworLyoKKyAqIEFuIGF0b20gaXMgYSB2YWxpZCBmaWVsZCBhdG9tIGxpc3RlZCBhYm92ZSwgcG9zc2libHkgcHJlZml4ZWQgd2l0aAorICogYSAiKiIgdG8gZGVub3RlIGRlcmVmX3RhZygpLgorICoKKyAqIFdlIHBhcnNlIGdpdmVuIGZvcm1hdCBzdHJpbmcgYW5kIHNvcnQgc3BlY2lmaWVycywgYW5kIG1ha2UgYSBsaXN0CisgKiBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgbmVlZCB0byBleHRyYWN0IG91dCBvZiBvYmplY3RzLiAgcmVmaW5mbworICogc3RydWN0dXJlIHdpbGwgaG9sZCBhbiBhcnJheSBvZiB2YWx1ZXMgZXh0cmFjdGVkIHRoYXQgY2FuIGJlCisgKiBpbmRleGVkIHdpdGggdGhlICJhdG9tIG51bWJlciIsIHdoaWNoIGlzIGFuIGluZGV4IGludG8gdGhpcworICogYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoqdXNlZF9hdG9tOworc3RhdGljIGNtcF90eXBlICp1c2VkX2F0b21fdHlwZTsKK3N0YXRpYyBpbnQgdXNlZF9hdG9tX2NudCwgc29ydF9hdG9tX2xpbWl0LCBuZWVkX3RhZ2dlZDsKKworLyoKKyAqIFVzZWQgdG8gcGFyc2UgZm9ybWF0IHN0cmluZyBhbmQgc29ydCBzcGVjaWZpZXJzCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfYXRvbShjb25zdCBjaGFyICphdG9tLCBjb25zdCBjaGFyICplcCkKK3sKKwljb25zdCBjaGFyICpzcDsKKwljaGFyICpuOworCWludCBpLCBhdDsKKworCXNwID0gYXRvbTsKKwlpZiAoKnNwID09ICcqJyAmJiBzcCA8IGVwKQorCQlzcCsrOyAvKiBkZXJlZiAqLworCWlmIChlcCA8PSBzcCkKKwkJZGllKCJtYWxmb3JtZWQgZmllbGQgbmFtZTogJS4qcyIsIChpbnQpKGVwLWF0b20pLCBhdG9tKTsKKworCS8qIERvIHdlIGhhdmUgdGhlIGF0b20gYWxyZWFkeSB1c2VkIGVsc2V3aGVyZT8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4odXNlZF9hdG9tW2ldKTsKKwkJaWYgKGxlbiA9PSBlcCAtIGF0b20gJiYgIW1lbWNtcCh1c2VkX2F0b21baV0sIGF0b20sIGxlbikpCisJCQlyZXR1cm4gaTsKKwl9CisKKwkvKiBJcyB0aGUgYXRvbSBhIHZhbGlkIG9uZT8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxpZF9hdG9tKTsgaSsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4odmFsaWRfYXRvbVtpXS5uYW1lKTsKKwkJaWYgKGxlbiA9PSBlcCAtIHNwICYmICFtZW1jbXAodmFsaWRfYXRvbVtpXS5uYW1lLCBzcCwgbGVuKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChBUlJBWV9TSVpFKHZhbGlkX2F0b20pIDw9IGkpCisJCWRpZSgidW5rbm93biBmaWVsZCBuYW1lOiAlLipzIiwgKGludCkoZXAtYXRvbSksIGF0b20pOworCisJLyogQWRkIGl0IGluLCBpbmNsdWRpbmcgdGhlIGRlcmVmIHByZWZpeCAqLworCWF0ID0gdXNlZF9hdG9tX2NudDsKKwl1c2VkX2F0b21fY250Kys7CisJdXNlZF9hdG9tID0geHJlYWxsb2ModXNlZF9hdG9tLAorCQkJICAgICAoc2l6ZW9mICp1c2VkX2F0b20pICogdXNlZF9hdG9tX2NudCk7CisJdXNlZF9hdG9tX3R5cGUgPSB4cmVhbGxvYyh1c2VkX2F0b21fdHlwZSwKKwkJCQkgIChzaXplb2YoKnVzZWRfYXRvbV90eXBlKSAqIHVzZWRfYXRvbV9jbnQpKTsKKwluID0geG1hbGxvYyhlcCAtIGF0b20gKyAxKTsKKwltZW1jcHkobiwgYXRvbSwgZXAgLSBhdG9tKTsKKwluW2VwLWF0b21dID0gMDsKKwl1c2VkX2F0b21bYXRdID0gbjsKKwl1c2VkX2F0b21fdHlwZVthdF0gPSB2YWxpZF9hdG9tW2ldLmNtcF90eXBlOworCXJldHVybiBhdDsKK30KKworLyoKKyAqIEluIGEgZm9ybWF0IHN0cmluZywgZmluZCB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mICUoYXRvbSkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX25leHQoY29uc3QgY2hhciAqY3ApCit7CisJd2hpbGUgKCpjcCkgeworCQlpZiAoKmNwID09ICclJykgeworCQkJLyogJSggaXMgdGhlIHN0YXJ0IG9mIGFuIGF0b207CisJCQkgKiAlJSBpcyBhIHF1b3RlZCBwZXItY2VudC4KKwkJCSAqLworCQkJaWYgKGNwWzFdID09ICcoJykKKwkJCQlyZXR1cm4gY3A7CisJCQllbHNlIGlmIChjcFsxXSA9PSAnJScpCisJCQkJY3ArKzsgLyogc2tpcCBvdmVyIHR3byAlICovCisJCQkvKiBvdGhlcndpc2UgdGhpcyBpcyBhIHNpbmdsZXRvbiwgbGl0ZXJhbCAlICovCisJCX0KKwkJY3ArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhlIGZvcm1hdCBzdHJpbmcgaXMgd2VsbCBmb3JtZWQsIGFuZCBwYXJzZSBvdXQKKyAqIHRoZSB1c2VkIGF0b21zLgorICovCitzdGF0aWMgdm9pZCB2ZXJpZnlfZm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKwljb25zdCBjaGFyICpjcCwgKnNwOworCWZvciAoY3AgPSBmb3JtYXQ7ICpjcCAmJiAoc3AgPSBmaW5kX25leHQoY3ApKTsgKSB7CisJCWNvbnN0IGNoYXIgKmVwID0gc3RyY2hyKHNwLCAnKScpOworCQlpZiAoIWVwKQorCQkJZGllKCJtYWxmb3JtYXR0ZWQgZm9ybWF0IHN0cmluZyAlcyIsIHNwKTsKKwkJLyogc3AgcG9pbnRzIGF0ICIlKCIgYW5kIGVwIHBvaW50cyBhdCB0aGUgY2xvc2luZyAiKSIgKi8KKwkJcGFyc2VfYXRvbShzcCArIDIsIGVwKTsKKwkJY3AgPSBlcCArIDE7CisJfQorfQorCisvKgorICogR2l2ZW4gYW4gb2JqZWN0IG5hbWUsIHJlYWQgdGhlIG9iamVjdCBkYXRhIGFuZCBzaXplLCBhbmQgcmV0dXJuIGEKKyAqICJzdHJ1Y3Qgb2JqZWN0Ii4gIElmIHRoZSBvYmplY3QgZGF0YSB3ZSBhcmUgcmV0dXJuaW5nIGlzIGFsc28gYm9ycm93ZWQKKyAqIGJ5IHRoZSAic3RydWN0IG9iamVjdCIgcmVwcmVzZW50YXRpb24sIHNldCAqZWF0ZW4gYXMgd2VsbC0tLWl0IGlzIGEKKyAqIHNpZ25hbCBmcm9tIHBhcnNlX29iamVjdF9idWZmZXIgdG8gdXMgbm90IHRvIGZyZWUgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgKmdldF9vYmooY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IG9iamVjdCAqKm9iaiwgdW5zaWduZWQgbG9uZyAqc3osIGludCAqZWF0ZW4pCit7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCBzeik7CisKKwlpZiAoYnVmKQorCQkqb2JqID0gcGFyc2Vfb2JqZWN0X2J1ZmZlcihzaGExLCB0eXBlLCAqc3osIGJ1ZiwgZWF0ZW4pOworCWVsc2UKKwkJKm9iaiA9IE5VTEw7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogU2VlIGdyYWJfdmFsdWVzICovCitzdGF0aWMgdm9pZCBncmFiX2NvbW1vbl92YWx1ZXMoc3RydWN0IGF0b21fdmFsdWUgKnZhbCwgaW50IGRlcmVmLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHVzZWRfYXRvbVtpXTsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmdmFsW2ldOworCQlpZiAoISFkZXJlZiAhPSAoKm5hbWUgPT0gJyonKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVyZWYpCisJCQluYW1lKys7CisJCWlmICghc3RyY21wKG5hbWUsICJvYmplY3R0eXBlIikpCisJCQl2LT5zID0gdHlwZW5hbWUob2JqLT50eXBlKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAib2JqZWN0c2l6ZSIpKSB7CisJCQljaGFyICpzID0geG1hbGxvYyg0MCk7CisJCQlzcHJpbnRmKHMsICIlbHUiLCBzeik7CisJCQl2LT51bCA9IHN6OworCQkJdi0+cyA9IHM7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAib2JqZWN0bmFtZSIpKSB7CisJCQljaGFyICpzID0geG1hbGxvYyg0MSk7CisJCQlzdHJjcHkocywgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQl2LT5zID0gczsKKwkJfQorCX0KK30KKworLyogU2VlIGdyYWJfdmFsdWVzICovCitzdGF0aWMgdm9pZCBncmFiX3RhZ192YWx1ZXMoc3RydWN0IGF0b21fdmFsdWUgKnZhbCwgaW50IGRlcmVmLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGFnICp0YWcgPSAoc3RydWN0IHRhZyAqKSBvYmo7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnZhbFtpXTsKKwkJaWYgKCEhZGVyZWYgIT0gKCpuYW1lID09ICcqJykpCisJCQljb250aW51ZTsKKwkJaWYgKGRlcmVmKQorCQkJbmFtZSsrOworCQlpZiAoIXN0cmNtcChuYW1lLCAidGFnIikpCisJCQl2LT5zID0gdGFnLT50YWc7CisJfQorfQorCitzdGF0aWMgaW50IG51bV9wYXJlbnRzKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwLCBwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KQorCQlpKys7CisJcmV0dXJuIGk7Cit9CisKKy8qIFNlZSBncmFiX3ZhbHVlcyAqLworc3RhdGljIHZvaWQgZ3JhYl9jb21taXRfdmFsdWVzKHN0cnVjdCBhdG9tX3ZhbHVlICp2YWwsIGludCBkZXJlZiwgc3RydWN0IG9iamVjdCAqb2JqLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJaW50IGk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKikgb2JqOworCisJZm9yIChpID0gMDsgaSA8IHVzZWRfYXRvbV9jbnQ7IGkrKykgeworCQljb25zdCBjaGFyICpuYW1lID0gdXNlZF9hdG9tW2ldOworCQlzdHJ1Y3QgYXRvbV92YWx1ZSAqdiA9ICZ2YWxbaV07CisJCWlmICghIWRlcmVmICE9ICgqbmFtZSA9PSAnKicpKQorCQkJY29udGludWU7CisJCWlmIChkZXJlZikKKwkJCW5hbWUrKzsKKwkJaWYgKCFzdHJjbXAobmFtZSwgInRyZWUiKSkgeworCQkJY2hhciAqcyA9IHhtYWxsb2MoNDEpOworCQkJc3RyY3B5KHMsIHNoYTFfdG9faGV4KGNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEpKTsKKwkJCXYtPnMgPSBzOworCQl9CisJCWlmICghc3RyY21wKG5hbWUsICJudW1wYXJlbnQiKSkgeworCQkJY2hhciAqcyA9IHhtYWxsb2MoNDApOworCQkJc3ByaW50ZihzLCAiJWx1Iiwgdi0+dWwpOworCQkJdi0+cyA9IHM7CisJCQl2LT51bCA9IG51bV9wYXJlbnRzKGNvbW1pdCk7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicGFyZW50IikpIHsKKwkJCWludCBudW0gPSBudW1fcGFyZW50cyhjb21taXQpOworCQkJaW50IGk7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCQljaGFyICpzID0geG1hbGxvYyg0MiAqIG51bSk7CisJCQl2LT5zID0gczsKKwkJCWZvciAoaSA9IDAsIHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCQkgICAgIHBhcmVudHM7CisJCQkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBpID0gaSArIDQyKSB7CisJCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKwkJCQlzdHJjcHkocytpLCBzaGExX3RvX2hleChwYXJlbnQtPm9iamVjdC5zaGExKSk7CisJCQkJaWYgKHBhcmVudHMtPm5leHQpCisJCQkJCXNbaSs0MF0gPSAnICc7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX3dob2xpbmUoY29uc3QgY2hhciAqd2hvLCBpbnQgd2hvbGVuLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJY29uc3QgY2hhciAqZW9sOworCXdoaWxlICgqYnVmKSB7CisJCWlmICghc3RybmNtcChidWYsIHdobywgd2hvbGVuKSAmJgorCQkgICAgYnVmW3dob2xlbl0gPT0gJyAnKQorCQkJcmV0dXJuIGJ1ZiArIHdob2xlbiArIDE7CisJCWVvbCA9IHN0cmNocihidWYsICdcbicpOworCQlpZiAoIWVvbCkKKwkJCXJldHVybiAiIjsKKwkJZW9sKys7CisJCWlmIChlb2xbMV0gPT0gJ1xuJykKKwkJCXJldHVybiAiIjsgLyogZW5kIG9mIGhlYWRlciAqLworCQlidWYgPSBlb2w7CisJfQorCXJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfbGluZShjb25zdCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqZW9sID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisJY2hhciAqbGluZTsKKwlpbnQgbGVuOworCWlmICghZW9sKQorCQlyZXR1cm4gIiI7CisJbGVuID0gZW9sIC0gYnVmOworCWxpbmUgPSB4bWFsbG9jKGxlbiArIDEpOworCW1lbWNweShsaW5lLCBidWYsIGxlbik7CisJbGluZVtsZW5dID0gMDsKKwlyZXR1cm4gbGluZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfbmFtZShjb25zdCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqZW9sID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisJY29uc3QgY2hhciAqZW9uYW1lID0gc3Ryc3RyKGJ1ZiwgIiA8Iik7CisJY2hhciAqbGluZTsKKwlpbnQgbGVuOworCWlmICghKGVvbmFtZSAmJiBlb2wgJiYgZW9uYW1lIDwgZW9sKSkKKwkJcmV0dXJuICIiOworCWxlbiA9IGVvbmFtZSAtIGJ1ZjsKKwlsaW5lID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkobGluZSwgYnVmLCBsZW4pOworCWxpbmVbbGVuXSA9IDA7CisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb3B5X2VtYWlsKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwljb25zdCBjaGFyICplbWFpbCA9IHN0cmNocihidWYsICc8Jyk7CisJY29uc3QgY2hhciAqZW9lbWFpbCA9IHN0cmNocihlbWFpbCwgJz4nKTsKKwljaGFyICpsaW5lOworCWludCBsZW47CisJaWYgKCFlbWFpbCB8fCAhZW9lbWFpbCkKKwkJcmV0dXJuICIiOworCWVvZW1haWwrKzsKKwlsZW4gPSBlb2VtYWlsIC0gZW1haWw7CisJbGluZSA9IHhtYWxsb2MobGVuICsgMSk7CisJbWVtY3B5KGxpbmUsIGVtYWlsLCBsZW4pOworCWxpbmVbbGVuXSA9IDA7CisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyB2b2lkIGdyYWJfZGF0ZShjb25zdCBjaGFyICpidWYsIHN0cnVjdCBhdG9tX3ZhbHVlICp2KQoreworCWNvbnN0IGNoYXIgKmVvZW1haWwgPSBzdHJzdHIoYnVmLCAiPiAiKTsKKwljaGFyICp6b25lOworCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOworCWxvbmcgdHo7CisKKwlpZiAoIWVvZW1haWwpCisJCWdvdG8gYmFkOworCXRpbWVzdGFtcCA9IHN0cnRvdWwoZW9lbWFpbCArIDIsICZ6b25lLCAxMCk7CisJaWYgKHRpbWVzdGFtcCA9PSBVTE9OR19NQVgpCisJCWdvdG8gYmFkOworCXR6ID0gc3RydG9sKHpvbmUsIE5VTEwsIDEwKTsKKwlpZiAoKHR6ID09IExPTkdfTUlOIHx8IHR6ID09IExPTkdfTUFYKSAmJiBlcnJubyA9PSBFUkFOR0UpCisJCWdvdG8gYmFkOworCXYtPnMgPSB4c3RyZHVwKHNob3dfZGF0ZSh0aW1lc3RhbXAsIHR6LCAwKSk7CisJdi0+dWwgPSB0aW1lc3RhbXA7CisJcmV0dXJuOworIGJhZDoKKwl2LT5zID0gIiI7CisJdi0+dWwgPSAwOworfQorCisvKiBTZWUgZ3JhYl92YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIGdyYWJfcGVyc29uKGNvbnN0IGNoYXIgKndobywgc3RydWN0IGF0b21fdmFsdWUgKnZhbCwgaW50IGRlcmVmLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlpbnQgaTsKKwlpbnQgd2hvbGVuID0gc3RybGVuKHdobyk7CisJY29uc3QgY2hhciAqd2hvbGluZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnZhbFtpXTsKKwkJaWYgKCEhZGVyZWYgIT0gKCpuYW1lID09ICcqJykpCisJCQljb250aW51ZTsKKwkJaWYgKGRlcmVmKQorCQkJbmFtZSsrOworCQlpZiAoc3RybmNtcCh3aG8sIG5hbWUsIHdob2xlbikpCisJCQljb250aW51ZTsKKwkJaWYgKG5hbWVbd2hvbGVuXSAhPSAwICYmCisJCSAgICBzdHJjbXAobmFtZSArIHdob2xlbiwgIm5hbWUiKSAmJgorCQkgICAgc3RyY21wKG5hbWUgKyB3aG9sZW4sICJlbWFpbCIpICYmCisJCSAgICBzdHJjbXAobmFtZSArIHdob2xlbiwgImRhdGUiKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXdob2xpbmUpCisJCQl3aG9saW5lID0gZmluZF93aG9saW5lKHdobywgd2hvbGVuLCBidWYsIHN6KTsKKwkJaWYgKCF3aG9saW5lKQorCQkJcmV0dXJuOyAvKiBubyBwb2ludCBsb29raW5nIGZvciBpdCAqLworCQlpZiAobmFtZVt3aG9sZW5dID09IDApCisJCQl2LT5zID0gY29weV9saW5lKHdob2xpbmUpOworCQllbHNlIGlmICghc3RyY21wKG5hbWUgKyB3aG9sZW4sICJuYW1lIikpCisJCQl2LT5zID0gY29weV9uYW1lKHdob2xpbmUpOworCQllbHNlIGlmICghc3RyY21wKG5hbWUgKyB3aG9sZW4sICJlbWFpbCIpKQorCQkJdi0+cyA9IGNvcHlfZW1haWwod2hvbGluZSk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSArIHdob2xlbiwgImRhdGUiKSkKKwkJCWdyYWJfZGF0ZSh3aG9saW5lLCB2KTsKKwl9CisKKwkvKiBGb3IgYSB0YWcgb3IgYSBjb21taXQgb2JqZWN0LCBpZiAiY3JlYXRvciIgb3IgImNyZWF0b3JkYXRlIiBpcworCSAqIHJlcXVlc3RlZCwgZG8gc29tZXRoaW5nIHNwZWNpYWwuCisJICovCisJaWYgKHN0cmNtcCh3aG8sICJ0YWdnZXIiKSAmJiBzdHJjbXAod2hvLCAiY29tbWl0dGVyIikpCisJCXJldHVybjsgLyogImF1dGhvciIgZm9yIGNvbW1pdCBvYmplY3QgaXMgbm90IHdhbnRlZCAqLworCWlmICghd2hvbGluZSkKKwkJd2hvbGluZSA9IGZpbmRfd2hvbGluZSh3aG8sIHdob2xlbiwgYnVmLCBzeik7CisJaWYgKCF3aG9saW5lKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHVzZWRfYXRvbV9jbnQ7IGkrKykgeworCQljb25zdCBjaGFyICpuYW1lID0gdXNlZF9hdG9tW2ldOworCQlzdHJ1Y3QgYXRvbV92YWx1ZSAqdiA9ICZ2YWxbaV07CisJCWlmICghIWRlcmVmICE9ICgqbmFtZSA9PSAnKicpKQorCQkJY29udGludWU7CisJCWlmIChkZXJlZikKKwkJCW5hbWUrKzsKKworCQlpZiAoIXN0cmNtcChuYW1lLCAiY3JlYXRvcmRhdGUiKSkKKwkJCWdyYWJfZGF0ZSh3aG9saW5lLCB2KTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiY3JlYXRvciIpKQorCQkJdi0+cyA9IGNvcHlfbGluZSh3aG9saW5lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfc3VicG9zKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzeiwgY29uc3QgY2hhciAqKnN1YiwgY29uc3QgY2hhciAqKmJvZHkpCit7CisJd2hpbGUgKCpidWYpIHsKKwkJY29uc3QgY2hhciAqZW9sID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisJCWlmICghZW9sKQorCQkJcmV0dXJuOworCQlpZiAoZW9sWzFdID09ICdcbicpIHsKKwkJCWJ1ZiA9IGVvbCArIDE7CisJCQlicmVhazsgLyogZm91bmQgZW5kIG9mIGhlYWRlciAqLworCQl9CisJCWJ1ZiA9IGVvbCArIDE7CisJfQorCXdoaWxlICgqYnVmID09ICdcbicpCisJCWJ1ZisrOworCWlmICghKmJ1ZikKKwkJcmV0dXJuOworCSpzdWIgPSBidWY7IC8qIGZpcnN0IG5vbi1lbXB0eSBsaW5lICovCisJYnVmID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisJaWYgKCFidWYpCisJCXJldHVybjsgLyogbm8gYm9keSAqLworCXdoaWxlICgqYnVmID09ICdcbicpCisJCWJ1ZisrOyAvKiBza2lwIGJsYW5rIGJldHdlZW4gc3ViamVjdCBhbmQgYm9keSAqLworCSpib2R5ID0gYnVmOworfQorCisvKiBTZWUgZ3JhYl92YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIGdyYWJfc3ViX2JvZHlfY29udGVudHMoc3RydWN0IGF0b21fdmFsdWUgKnZhbCwgaW50IGRlcmVmLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpzdWJwb3MgPSBOVUxMLCAqYm9keXBvcyA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnZhbFtpXTsKKwkJaWYgKCEhZGVyZWYgIT0gKCpuYW1lID09ICcqJykpCisJCQljb250aW51ZTsKKwkJaWYgKGRlcmVmKQorCQkJbmFtZSsrOworCQlpZiAoc3RyY21wKG5hbWUsICJzdWJqZWN0IikgJiYKKwkJICAgIHN0cmNtcChuYW1lLCAiYm9keSIpICYmCisJCSAgICBzdHJjbXAobmFtZSwgImNvbnRlbnRzIikpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdWJwb3MpCisJCQlmaW5kX3N1YnBvcyhidWYsIHN6LCAmc3VicG9zLCAmYm9keXBvcyk7CisJCWlmICghc3VicG9zKQorCQkJcmV0dXJuOworCisJCWlmICghc3RyY21wKG5hbWUsICJzdWJqZWN0IikpCisJCQl2LT5zID0gY29weV9saW5lKHN1YnBvcyk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImJvZHkiKSkKKwkJCXYtPnMgPSB4c3RyZHVwKGJvZHlwb3MpOworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJjb250ZW50cyIpKQorCQkJdi0+cyA9IHhzdHJkdXAoc3VicG9zKTsKKwl9Cit9CisKKy8qIFdlIHdhbnQgdG8gaGF2ZSBlbXB0eSBwcmludC1zdHJpbmcgZm9yIGZpZWxkIHJlcXVlc3RzCisgKiB0aGF0IGRvIG5vdCBhcHBseSAoZS5nLiAiYXV0aG9yZGF0ZSIgZm9yIGEgdGFnIG9iamVjdCkKKyAqLworc3RhdGljIHZvaWQgZmlsbF9taXNzaW5nX3ZhbHVlcyhzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmdmFsW2ldOworCQlpZiAodi0+cyA9PSBOVUxMKQorCQkJdi0+cyA9ICIiOworCX0KK30KKworLyoKKyAqIHZhbCBpcyBhIGxpc3Qgb2YgYXRvbV92YWx1ZSB0byBob2xkIHJldHVybmVkIHZhbHVlcy4gIEV4dHJhY3QKKyAqIHRoZSB2YWx1ZXMgZm9yIGF0b21zIGluIHVzZWRfYXRvbSBhcnJheSBvdXQgb2YgKG9iaiwgYnVmLCBzeikuCisgKiB3aGVuIGRlcmVmIGlzIGZhbHNlLCAob2JqLCBidWYsIHN6KSBpcyB0aGUgb2JqZWN0IHRoYXQgaXMKKyAqIHBvaW50ZWQgYXQgYnkgdGhlIHJlZiBpdHNlbGY7IG90aGVyd2lzZSBpdCBpcyB0aGUgb2JqZWN0IHRoZQorICogcmVmICh3aGljaCBpcyBhIHRhZykgcmVmZXJzIHRvLgorICovCitzdGF0aWMgdm9pZCBncmFiX3ZhbHVlcyhzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsLCBpbnQgZGVyZWYsIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHN6KQoreworCWdyYWJfY29tbW9uX3ZhbHVlcyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCXN3aXRjaCAob2JqLT50eXBlKSB7CisJY2FzZSBPQkpfVEFHOgorCQlncmFiX3RhZ192YWx1ZXModmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJZ3JhYl9zdWJfYm9keV9jb250ZW50cyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlncmFiX3BlcnNvbigidGFnZ2VyIiwgdmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfQ09NTUlUOgorCQlncmFiX2NvbW1pdF92YWx1ZXModmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJZ3JhYl9zdWJfYm9keV9jb250ZW50cyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlncmFiX3BlcnNvbigiYXV0aG9yIiwgdmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJZ3JhYl9wZXJzb24oImNvbW1pdHRlciIsIHZhbCwgZGVyZWYsIG9iaiwgYnVmLCBzeik7CisJCWJyZWFrOworCWNhc2UgT0JKX1RSRUU6CisJCS8vIGdyYWJfdHJlZV92YWx1ZXModmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfQkxPQjoKKwkJLy8gZ3JhYl9ibG9iX3ZhbHVlcyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoIkVoPyAgT2JqZWN0IG9mIHR5cGUgJWQ/Iiwgb2JqLT50eXBlKTsKKwl9Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgb2JqZWN0IHJlZmVycmVkIGJ5IHJlZiwgYW5kIGdyYWIgbmVlZGVkIHZhbHVlLgorICovCitzdGF0aWMgdm9pZCBwb3B1bGF0ZV92YWx1ZShzdHJ1Y3QgcmVmaW5mbyAqcmVmKQoreworCXZvaWQgKmJ1ZjsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaW50IGVhdGVuLCBpOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp0YWdnZWQ7CisKKwlyZWYtPnZhbHVlID0geGNhbGxvYyhzaXplb2Yoc3RydWN0IGF0b21fdmFsdWUpLCB1c2VkX2F0b21fY250KTsKKworCWJ1ZiA9IGdldF9vYmoocmVmLT5vYmplY3RuYW1lLCAmb2JqLCAmc2l6ZSwgJmVhdGVuKTsKKwlpZiAoIWJ1ZikKKwkJZGllKCJtaXNzaW5nIG9iamVjdCAlcyBmb3IgJXMiLAorCQkgICAgc2hhMV90b19oZXgocmVmLT5vYmplY3RuYW1lKSwgcmVmLT5yZWZuYW1lKTsKKwlpZiAoIW9iaikKKwkJZGllKCJwYXJzZV9vYmplY3RfYnVmZmVyIGZhaWxlZCBvbiAlcyBmb3IgJXMiLAorCQkgICAgc2hhMV90b19oZXgocmVmLT5vYmplY3RuYW1lKSwgcmVmLT5yZWZuYW1lKTsKKworCS8qIEZpbGwgaW4gc3BlY2lhbHMgZmlyc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnJlZi0+dmFsdWVbaV07CisJCWlmICghc3RyY21wKG5hbWUsICJyZWZuYW1lIikpCisJCQl2LT5zID0gcmVmLT5yZWZuYW1lOworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICIqcmVmbmFtZSIpKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKHJlZi0+cmVmbmFtZSk7CisJCQljaGFyICpzID0geG1hbGxvYyhsZW4gKyA0KTsKKwkJCXNwcmludGYocywgIiVzXnt9IiwgcmVmLT5yZWZuYW1lKTsKKwkJCXYtPnMgPSBzOworCQl9CisJfQorCisJZ3JhYl92YWx1ZXMocmVmLT52YWx1ZSwgMCwgb2JqLCBidWYsIHNpemUpOworCWlmICghZWF0ZW4pCisJCWZyZWUoYnVmKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGF0b20gdGhhdCB3YW50cyB0byBrbm93IGFib3V0IHRhZ2dlZAorCSAqIG9iamVjdCwgd2UgYXJlIGRvbmUuCisJICovCisJaWYgKCFuZWVkX3RhZ2dlZCB8fCAob2JqLT50eXBlICE9IE9CSl9UQUcpKQorCQlyZXR1cm47CisKKwkvKiBJZiBpdCBpcyBhIHRhZyBvYmplY3QsIHNlZSBpZiB3ZSB1c2UgYSB2YWx1ZSB0aGF0IGRlcmVmcworCSAqIHRoZSBvYmplY3QsIGFuZCBpZiB3ZSBkbyBncmFiIHRoZSBvYmplY3QgaXQgcmVmZXJzIHRvLgorCSAqLworCXRhZ2dlZCA9ICgoc3RydWN0IHRhZyAqKW9iaiktPnRhZ2dlZC0+c2hhMTsKKworCS8qIE5FRURTV09SSzogVGhpcyBkZXJlZnMgdGFnIG9ubHkgb25jZSwgd2hpY2gKKwkgKiBpcyBnb29kIHRvIGRlYWwgd2l0aCBjaGFpbnMgb2YgdHJ1c3QsIGJ1dAorCSAqIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggd2hhdCBkZXJlZl90YWcoKSBkb2VzCisJICogd2hpY2ggcGVlbHMgdGhlIG9uaW9uIHRvIHRoZSBjb3JlLgorCSAqLworCWJ1ZiA9IGdldF9vYmoodGFnZ2VkLCAmb2JqLCAmc2l6ZSwgJmVhdGVuKTsKKwlpZiAoIWJ1ZikKKwkJZGllKCJtaXNzaW5nIG9iamVjdCAlcyBmb3IgJXMiLAorCQkgICAgc2hhMV90b19oZXgodGFnZ2VkKSwgcmVmLT5yZWZuYW1lKTsKKwlpZiAoIW9iaikKKwkJZGllKCJwYXJzZV9vYmplY3RfYnVmZmVyIGZhaWxlZCBvbiAlcyBmb3IgJXMiLAorCQkgICAgc2hhMV90b19oZXgodGFnZ2VkKSwgcmVmLT5yZWZuYW1lKTsKKwlncmFiX3ZhbHVlcyhyZWYtPnZhbHVlLCAxLCBvYmosIGJ1Ziwgc2l6ZSk7CisJaWYgKCFlYXRlbikKKwkJZnJlZShidWYpOworfQorCisvKgorICogR2l2ZW4gYSByZWYsIHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhdG9tLiAgVGhpcyBsYXppbHkgZ2V0cyB2YWx1ZQorICogb3V0IG9mIHRoZSBvYmplY3QgYnkgY2FsbGluZyBwb3B1bGF0ZSB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3ZhbHVlKHN0cnVjdCByZWZpbmZvICpyZWYsIGludCBhdG9tLCBzdHJ1Y3QgYXRvbV92YWx1ZSAqKnYpCit7CisJaWYgKCFyZWYtPnZhbHVlKSB7CisJCXBvcHVsYXRlX3ZhbHVlKHJlZik7CisJCWZpbGxfbWlzc2luZ192YWx1ZXMocmVmLT52YWx1ZSk7CisJfQorCSp2ID0gJnJlZi0+dmFsdWVbYXRvbV07Cit9CisKK3N0cnVjdCBncmFiX3JlZl9jYmRhdGEgeworCXN0cnVjdCByZWZpbmZvICoqZ3JhYl9hcnJheTsKKwljb25zdCBjaGFyICoqZ3JhYl9wYXR0ZXJuOworCWludCBncmFiX2NudDsKK307CisKKy8qCisgKiBBIGNhbGwtYmFjayBnaXZlbiB0byBmb3JfZWFjaF9yZWYoKS4gIEl0IGlzIHVuZm9ydHVuYXRlIHRoYXQgd2UKKyAqIG5lZWQgdG8gdXNlIGdsb2JhbCB2YXJpYWJsZXMgdG8gcGFzcyBleHRyYSBpbmZvcm1hdGlvbiB0byB0aGlzCisgKiBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBncmFiX3NpbmdsZV9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGdyYWJfcmVmX2NiZGF0YSAqY2IgPSBjYl9kYXRhOworCXN0cnVjdCByZWZpbmZvICpyZWY7CisJaW50IGNudDsKKworCWlmICgqY2ItPmdyYWJfcGF0dGVybikgeworCQljb25zdCBjaGFyICoqcGF0dGVybjsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJCWZvciAocGF0dGVybiA9IGNiLT5ncmFiX3BhdHRlcm47ICpwYXR0ZXJuOyBwYXR0ZXJuKyspIHsKKwkJCWNvbnN0IGNoYXIgKnAgPSAqcGF0dGVybjsKKwkJCWludCBwbGVuID0gc3RybGVuKHApOworCisJCQlpZiAoKHBsZW4gPD0gbmFtZWxlbikgJiYKKwkJCSAgICAhc3RybmNtcChyZWZuYW1lLCBwLCBwbGVuKSAmJgorCQkJICAgIChyZWZuYW1lW3BsZW5dID09ICdcMCcgfHwKKwkJCSAgICAgcmVmbmFtZVtwbGVuXSA9PSAnLycpKQorCQkJCWJyZWFrOworCQkJaWYgKCFmbm1hdGNoKHAsIHJlZm5hbWUsIEZOTV9QQVRITkFNRSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEqcGF0dGVybikKKwkJCXJldHVybiAwOworCX0KKworCS8qIFdlIGRvIG5vdCBvcGVuIHRoZSBvYmplY3QgeWV0OyBzb3J0IG1heSBvbmx5IG5lZWQgcmVmbmFtZQorCSAqIHRvIGRvIGl0cyBqb2IgYW5kIHRoZSByZXN1bHRpbmcgbGlzdCBtYXkgeWV0IHRvIGJlIHBydW5lZAorCSAqIGJ5IG1heGNvdW50IGxvZ2ljLgorCSAqLworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpKTsKKwlyZWYtPnJlZm5hbWUgPSB4c3RyZHVwKHJlZm5hbWUpOworCWhhc2hjcHkocmVmLT5vYmplY3RuYW1lLCBzaGExKTsKKworCWNudCA9IGNiLT5ncmFiX2NudDsKKwljYi0+Z3JhYl9hcnJheSA9IHhyZWFsbG9jKGNiLT5ncmFiX2FycmF5LAorCQkJCSAgc2l6ZW9mKCpjYi0+Z3JhYl9hcnJheSkgKiAoY250ICsgMSkpOworCWNiLT5ncmFiX2FycmF5W2NudCsrXSA9IHJlZjsKKwljYi0+Z3JhYl9jbnQgPSBjbnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21wX3JlZl9zb3J0KHN0cnVjdCByZWZfc29ydCAqcywgc3RydWN0IHJlZmluZm8gKmEsIHN0cnVjdCByZWZpbmZvICpiKQoreworCXN0cnVjdCBhdG9tX3ZhbHVlICp2YSwgKnZiOworCWludCBjbXA7CisJY21wX3R5cGUgY21wX3R5cGUgPSB1c2VkX2F0b21fdHlwZVtzLT5hdG9tXTsKKworCWdldF92YWx1ZShhLCBzLT5hdG9tLCAmdmEpOworCWdldF92YWx1ZShiLCBzLT5hdG9tLCAmdmIpOworCXN3aXRjaCAoY21wX3R5cGUpIHsKKwljYXNlIEZJRUxEX1NUUjoKKwkJY21wID0gc3RyY21wKHZhLT5zLCB2Yi0+cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICh2YS0+dWwgPCB2Yi0+dWwpCisJCQljbXAgPSAtMTsKKwkJZWxzZSBpZiAodmEtPnVsID09IHZiLT51bCkKKwkJCWNtcCA9IDA7CisJCWVsc2UKKwkJCWNtcCA9IDE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKHMtPnJldmVyc2UpID8gLWNtcCA6IGNtcDsKK30KKworc3RhdGljIHN0cnVjdCByZWZfc29ydCAqcmVmX3NvcnQ7CitzdGF0aWMgaW50IGNvbXBhcmVfcmVmcyhjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHJlZmluZm8gKmEgPSAqKChzdHJ1Y3QgcmVmaW5mbyAqKilhXyk7CisJc3RydWN0IHJlZmluZm8gKmIgPSAqKChzdHJ1Y3QgcmVmaW5mbyAqKiliXyk7CisJc3RydWN0IHJlZl9zb3J0ICpzOworCisJZm9yIChzID0gcmVmX3NvcnQ7IHM7IHMgPSBzLT5uZXh0KSB7CisJCWludCBjbXAgPSBjbXBfcmVmX3NvcnQocywgYSwgYik7CisJCWlmIChjbXApCisJCQlyZXR1cm4gY21wOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29ydF9yZWZzKHN0cnVjdCByZWZfc29ydCAqc29ydCwgc3RydWN0IHJlZmluZm8gKipyZWZzLCBpbnQgbnVtX3JlZnMpCit7CisJcmVmX3NvcnQgPSBzb3J0OworCXFzb3J0KHJlZnMsIG51bV9yZWZzLCBzaXplb2Yoc3RydWN0IHJlZmluZm8gKiksIGNvbXBhcmVfcmVmcyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZhbHVlKHN0cnVjdCByZWZpbmZvICpyZWYsIGludCBhdG9tLCBpbnQgcXVvdGVfc3R5bGUpCit7CisJc3RydWN0IGF0b21fdmFsdWUgKnY7CisJZ2V0X3ZhbHVlKHJlZiwgYXRvbSwgJnYpOworCXN3aXRjaCAocXVvdGVfc3R5bGUpIHsKKwljYXNlIFFVT1RFX05PTkU6CisJCWZwdXRzKHYtPnMsIHN0ZG91dCk7CisJCWJyZWFrOworCWNhc2UgUVVPVEVfU0hFTEw6CisJCXNxX3F1b3RlX3ByaW50KHN0ZG91dCwgdi0+cyk7CisJCWJyZWFrOworCWNhc2UgUVVPVEVfUEVSTDoKKwkJcGVybF9xdW90ZV9wcmludChzdGRvdXQsIHYtPnMpOworCQlicmVhazsKKwljYXNlIFFVT1RFX1BZVEhPTjoKKwkJcHl0aG9uX3F1b3RlX3ByaW50KHN0ZG91dCwgdi0+cyk7CisJCWJyZWFrOworCWNhc2UgUVVPVEVfVENMOgorCQl0Y2xfcXVvdGVfcHJpbnQoc3Rkb3V0LCB2LT5zKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGhleDEoY2hhciBjaCkKK3sKKwlpZiAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKKwkJcmV0dXJuIGNoIC0gJzAnOworCWVsc2UgaWYgKCdhJyA8PSBjaCAmJiBjaCA8PSAnZicpCisJCXJldHVybiBjaCAtICdhJyArIDEwOworCWVsc2UgaWYgKCdBJyA8PSBjaCAmJiBjaCA8PSAnRicpCisJCXJldHVybiBjaCAtICdBJyArIDEwOworCXJldHVybiAtMTsKK30KK3N0YXRpYyBpbnQgaGV4Mihjb25zdCBjaGFyICpjcCkKK3sKKwlpZiAoY3BbMF0gJiYgY3BbMV0pCisJCXJldHVybiAoaGV4MShjcFswXSkgPDwgNCkgfCBoZXgxKGNwWzFdKTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZW1pdChjb25zdCBjaGFyICpjcCwgY29uc3QgY2hhciAqZXApCit7CisJd2hpbGUgKCpjcCAmJiAoIWVwIHx8IGNwIDwgZXApKSB7CisJCWlmICgqY3AgPT0gJyUnKSB7CisJCQlpZiAoY3BbMV0gPT0gJyUnKQorCQkJCWNwKys7CisJCQllbHNlIHsKKwkJCQlpbnQgY2ggPSBoZXgyKGNwICsgMSk7CisJCQkJaWYgKDAgPD0gY2gpIHsKKwkJCQkJcHV0Y2hhcihjaCk7CisJCQkJCWNwICs9IDM7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlwdXRjaGFyKCpjcCk7CisJCWNwKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3JlZihzdHJ1Y3QgcmVmaW5mbyAqaW5mbywgY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgcXVvdGVfc3R5bGUpCit7CisJY29uc3QgY2hhciAqY3AsICpzcCwgKmVwOworCisJZm9yIChjcCA9IGZvcm1hdDsgKmNwICYmIChzcCA9IGZpbmRfbmV4dChjcCkpOyBjcCA9IGVwICsgMSkgeworCQllcCA9IHN0cmNocihzcCwgJyknKTsKKwkJaWYgKGNwIDwgc3ApCisJCQllbWl0KGNwLCBzcCk7CisJCXByaW50X3ZhbHVlKGluZm8sIHBhcnNlX2F0b20oc3AgKyAyLCBlcCksIHF1b3RlX3N0eWxlKTsKKwl9CisJaWYgKCpjcCkgeworCQlzcCA9IGNwICsgc3RybGVuKGNwKTsKKwkJZW1pdChjcCwgc3ApOworCX0KKwlwdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9zb3J0ICpkZWZhdWx0X3NvcnQodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjc3RyX25hbWVbXSA9ICJyZWZuYW1lIjsKKworCXN0cnVjdCByZWZfc29ydCAqc29ydCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpzb3J0KSk7CisKKwlzb3J0LT5uZXh0ID0gTlVMTDsKKwlzb3J0LT5hdG9tID0gcGFyc2VfYXRvbShjc3RyX25hbWUsIGNzdHJfbmFtZSArIHN0cmxlbihjc3RyX25hbWUpKTsKKwlyZXR1cm4gc29ydDsKK30KKworaW50IGNtZF9mb3JfZWFjaF9yZWYoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbnVtX3JlZnM7CisJY29uc3QgY2hhciAqZm9ybWF0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmX3NvcnQgKnNvcnQgPSBOVUxMLCAqKnNvcnRfdGFpbCA9ICZzb3J0OworCWludCBtYXhjb3VudCA9IDA7CisJaW50IHF1b3RlX3N0eWxlID0gLTE7IC8qIHVuc3BlY2lmaWVkIHlldCAqLworCXN0cnVjdCByZWZpbmZvICoqcmVmczsKKwlzdHJ1Y3QgZ3JhYl9yZWZfY2JkYXRhIGNiZGF0YTsKKworCWZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2W2ldOworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWZvcm1hdD0iKSkgeworCQkJaWYgKGZvcm1hdCkKKwkJCQlkaWUoIm1vcmUgdGhhbiBvbmUgLS1mb3JtYXQ/Iik7CisJCQlmb3JtYXQgPSBhcmcgKyA5OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXMiKSB8fCAhc3RyY21wKGFyZywgIi0tc2hlbGwiKSApIHsKKwkJCWlmICgwIDw9IHF1b3RlX3N0eWxlKQorCQkJCWRpZSgibW9yZSB0aGFuIG9uZSBxdW90aW5nIHN0eWxlPyIpOworCQkJcXVvdGVfc3R5bGUgPSBRVU9URV9TSEVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1wIikgfHwgIXN0cmNtcChhcmcsICItLXBlcmwiKSApIHsKKwkJCWlmICgwIDw9IHF1b3RlX3N0eWxlKQorCQkJCWRpZSgibW9yZSB0aGFuIG9uZSBxdW90aW5nIHN0eWxlPyIpOworCQkJcXVvdGVfc3R5bGUgPSBRVU9URV9QRVJMOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1weXRob24iKSApIHsKKwkJCWlmICgwIDw9IHF1b3RlX3N0eWxlKQorCQkJCWRpZSgibW9yZSB0aGFuIG9uZSBxdW90aW5nIHN0eWxlPyIpOworCQkJcXVvdGVfc3R5bGUgPSBRVU9URV9QWVRIT047CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRjbCIpICkgeworCQkJaWYgKDAgPD0gcXVvdGVfc3R5bGUpCisJCQkJZGllKCJtb3JlIHRoYW4gb25lIHF1b3Rpbmcgc3R5bGU/Iik7CisJCQlxdW90ZV9zdHlsZSA9IFFVT1RFX1RDTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tY291bnQ9IikpIHsKKwkJCWlmIChtYXhjb3VudCkKKwkJCQlkaWUoIm1vcmUgdGhhbiBvbmUgLS1jb3VudD8iKTsKKwkJCW1heGNvdW50ID0gYXRvaShhcmcgKyA4KTsKKwkJCWlmIChtYXhjb3VudCA8PSAwKQorCQkJCWRpZSgiVGhlIG51bWJlciAlcyBkaWQgbm90IHBhcnNlIiwgYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tc29ydD0iKSkgeworCQkJc3RydWN0IHJlZl9zb3J0ICpzID0geGNhbGxvYygxLCBzaXplb2YoKnMpKTsKKwkJCWludCBsZW47CisKKwkJCXMtPm5leHQgPSBOVUxMOworCQkJKnNvcnRfdGFpbCA9IHM7CisJCQlzb3J0X3RhaWwgPSAmcy0+bmV4dDsKKworCQkJYXJnICs9IDc7CisJCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCQlzLT5yZXZlcnNlID0gMTsKKwkJCQlhcmcrKzsKKwkJCX0KKwkJCWxlbiA9IHN0cmxlbihhcmcpOworCQkJc29ydC0+YXRvbSA9IHBhcnNlX2F0b20oYXJnLCBhcmcrbGVuKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAocXVvdGVfc3R5bGUgPCAwKQorCQlxdW90ZV9zdHlsZSA9IFFVT1RFX05PTkU7CisKKwlpZiAoIXNvcnQpCisJCXNvcnQgPSBkZWZhdWx0X3NvcnQoKTsKKwlzb3J0X2F0b21fbGltaXQgPSB1c2VkX2F0b21fY250OworCWlmICghZm9ybWF0KQorCQlmb3JtYXQgPSAiJShvYmplY3RuYW1lKSAlKG9iamVjdHR5cGUpXHQlKHJlZm5hbWUpIjsKKworCXZlcmlmeV9mb3JtYXQoZm9ybWF0KTsKKworCW1lbXNldCgmY2JkYXRhLCAwLCBzaXplb2YoY2JkYXRhKSk7CisJY2JkYXRhLmdyYWJfcGF0dGVybiA9IGF2ICsgaTsKKwlmb3JfZWFjaF9yZWYoZ3JhYl9zaW5nbGVfcmVmLCAmY2JkYXRhKTsKKwlyZWZzID0gY2JkYXRhLmdyYWJfYXJyYXk7CisJbnVtX3JlZnMgPSBjYmRhdGEuZ3JhYl9jbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWlmICh1c2VkX2F0b21baV1bMF0gPT0gJyonKSB7CisJCQluZWVkX3RhZ2dlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNvcnRfcmVmcyhzb3J0LCByZWZzLCBudW1fcmVmcyk7CisKKwlpZiAoIW1heGNvdW50IHx8IG51bV9yZWZzIDwgbWF4Y291bnQpCisJCW1heGNvdW50ID0gbnVtX3JlZnM7CisJZm9yIChpID0gMDsgaSA8IG1heGNvdW50OyBpKyspCisJCXNob3dfcmVmKHJlZnNbaV0sIGZvcm1hdCwgcXVvdGVfc3R5bGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1mc2NrLmMgYi9idWlsdGluLWZzY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNlNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mc2NrLmMKQEAgLTAsMCArMSw3MzMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKKyNkZWZpbmUgUkVBQ0hBQkxFIDB4MDAwMQorI2RlZmluZSBTRUVOICAgICAgMHgwMDAyCisKK3N0YXRpYyBpbnQgc2hvd19yb290Oworc3RhdGljIGludCBzaG93X3RhZ3M7CitzdGF0aWMgaW50IHNob3dfdW5yZWFjaGFibGU7CitzdGF0aWMgaW50IGluY2x1ZGVfcmVmbG9ncyA9IDE7CitzdGF0aWMgaW50IGNoZWNrX2Z1bGw7CitzdGF0aWMgaW50IGNoZWNrX3N0cmljdDsKK3N0YXRpYyBpbnQga2VlcF9jYWNoZV9vYmplY3RzOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKK3N0YXRpYyBpbnQgZXJyb3JzX2ZvdW5kOworI2RlZmluZSBFUlJPUl9PQkpFQ1QgMDEKKyNkZWZpbmUgRVJST1JfUkVBQ0hBQkxFIDAyCisKKyNpZmRlZiBOT19EX0lOT19JTl9ESVJFTlQKKyNkZWZpbmUgU09SVF9ESVJFTlQgMAorI2RlZmluZSBESVJFTlRfU09SVF9ISU5UKGRlKSAwCisjZWxzZQorI2RlZmluZSBTT1JUX0RJUkVOVCAxCisjZGVmaW5lIERJUkVOVF9TT1JUX0hJTlQoZGUpICgoZGUpLT5kX2lubykKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvYmpyZXBvcnQoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWZwcmludGYoc3RkZXJyLCAiJXMgaW4gJXMgJXM6ICIsCisJICAgICAgICBzZXZlcml0eSwgdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIHBhcmFtcyk7CisJZnB1dHMoIlxuIiwgc3RkZXJyKTsKK30KKworc3RhdGljIGludCBvYmplcnJvcihzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwllcnJvcnNfZm91bmQgfD0gRVJST1JfT0JKRUNUOworCW9ianJlcG9ydChvYmosICJlcnJvciIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgb2Jqd2FybmluZyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlvYmpyZXBvcnQob2JqLCAid2FybmluZyIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBDaGVjayBhIHNpbmdsZSByZWFjaGFibGUgb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3JlYWNoYWJsZV9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmczsKKworCS8qCisJICogV2Ugb2J2aW91c2x5IHdhbnQgdGhlIG9iamVjdCB0byBiZSBwYXJzZWQsCisJICogZXhjZXB0IGlmIGl0IHdhcyBpbiBhIHBhY2stZmlsZSBhbmQgd2UgZGlkbid0CisJICogZG8gYSBmdWxsIGZzY2sKKwkgKi8KKwlpZiAoIW9iai0+cGFyc2VkKSB7CisJCWlmIChoYXNfc2hhMV9wYWNrKG9iai0+c2hhMSwgTlVMTCkpCisJCQlyZXR1cm47IC8qIGl0IGlzIGluIHBhY2sgLSBmb3JnZXQgYWJvdXQgaXQgKi8KKwkJcHJpbnRmKCJtaXNzaW5nICVzICVzXG4iLCB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJZXJyb3JzX2ZvdW5kIHw9IEVSUk9SX1JFQUNIQUJMRTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCBldmVyeXRoaW5nIHRoYXQgd2UgdHJ5IHRvIHJlZmVyZW5jZSBpcyBhbHNvIGdvb2QuCisJICovCisJcmVmcyA9IGxvb2t1cF9vYmplY3RfcmVmcyhvYmopOworCWlmIChyZWZzKSB7CisJCXVuc2lnbmVkIGo7CisJCWZvciAoaiA9IDA7IGogPCByZWZzLT5jb3VudDsgaisrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpyZWYgPSByZWZzLT5yZWZbal07CisJCQlpZiAocmVmLT5wYXJzZWQgfHwKKwkJCSAgICAoaGFzX3NoYTFfZmlsZShyZWYtPnNoYTEpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiYnJva2VuIGxpbmsgZnJvbSAlN3MgJXNcbiIsCisJCQkgICAgICAgdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQlwcmludGYoIiAgICAgICAgICAgICAgdG8gJTdzICVzXG4iLAorCQkJICAgICAgIHR5cGVuYW1lKHJlZi0+dHlwZSksIHNoYTFfdG9faGV4KHJlZi0+c2hhMSkpOworCQkJZXJyb3JzX2ZvdW5kIHw9IEVSUk9SX1JFQUNIQUJMRTsKKwkJfQorCX0KK30KKworLyoKKyAqIENoZWNrIGEgc2luZ2xlIHVucmVhY2hhYmxlIG9iamVjdAorICovCitzdGF0aWMgdm9pZCBjaGVja191bnJlYWNoYWJsZV9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqKQoreworCS8qCisJICogTWlzc2luZyB1bnJlYWNoYWJsZSBvYmplY3Q/IElnbm9yZSBpdC4gSXQncyBub3QgbGlrZQorCSAqIHdlIG1pc3MgaXQgKHNpbmNlIGl0IGNhbid0IGJlIHJlYWNoZWQpLCBub3IgZG8gd2Ugd2FudAorCSAqIHRvIGNvbXBsYWluIGFib3V0IGl0IGJlaW5nIHVucmVhY2hhYmxlIChzaW5jZSBpdCBkb2VzCisJICogbm90IGV4aXN0KS4KKwkgKi8KKwlpZiAoIW9iai0+cGFyc2VkKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFVucmVhY2hhYmxlIG9iamVjdCB0aGF0IGV4aXN0cz8gU2hvdyBpdCBpZiBhc2tlZCB0bywKKwkgKiBzaW5jZSB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IGlzIHBydW5hYmxlLgorCSAqLworCWlmIChzaG93X3VucmVhY2hhYmxlKSB7CisJCXByaW50ZigidW5yZWFjaGFibGUgJXMgJXNcbiIsIHR5cGVuYW1lKG9iai0+dHlwZSksIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAiIXVzZWQiIG1lYW5zIHRoYXQgbm90aGluZyBhdCBhbGwgcG9pbnRzIHRvIGl0LCBpbmNsdWRpbmcKKwkgKiBvdGhlciB1bnJlYWNoYWJsZSBvYmplY3RzLiBJbiBvdGhlciB3b3JkcywgaXQncyB0aGUgInRpcCIKKwkgKiBvZiBzb21lIHNldCBvZiB1bnJlYWNoYWJsZSBvYmplY3RzLCB1c3VhbGx5IGEgY29tbWl0IHRoYXQKKwkgKiBnb3QgZHJvcHBlZC4KKwkgKgorCSAqIFN1Y2ggc3RhcnRpbmcgcG9pbnRzIGFyZSBtb3JlIGludGVyZXN0aW5nIHRoYW4gc29tZSByYW5kb20KKwkgKiBzZXQgb2YgdW5yZWFjaGFibGUgb2JqZWN0cywgc28gd2Ugc2hvdyB0aGVtIGV2ZW4gaWYgdGhlIHVzZXIKKwkgKiBoYXNuJ3QgYXNrZWQgZm9yIF9hbGxfIHVucmVhY2hhYmxlIG9iamVjdHMuIElmIHlvdSBoYXZlCisJICogZGVsZXRlZCBhIGJyYW5jaCBieSBtaXN0YWtlLCB0aGlzIGlzIGEgcHJpbWUgY2FuZGlkYXRlIHRvCisJICogc3RhcnQgbG9va2luZyBhdCwgZm9yIGV4YW1wbGUuCisJICovCisJaWYgKCFvYmotPnVzZWQpIHsKKwkJcHJpbnRmKCJkYW5nbGluZyAlcyAlc1xuIiwgdHlwZW5hbWUob2JqLT50eXBlKSwKKwkJICAgICAgIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBPdGhlcndpc2U/IEl0J3MgdGhlcmUsIGl0J3MgdW5yZWFjaGFibGUsIGFuZCBzb21lIG90aGVyIHVucmVhY2hhYmxlCisJICogb2JqZWN0IHBvaW50cyB0byBpdC4gSWdub3JlIGl0IC0gaXQncyBub3QgaW50ZXJlc3RpbmcsIGFuZCB3ZSBzaG93ZWQKKwkgKiBhbGwgdGhlIGludGVyZXN0aW5nIGNhc2VzIGFib3ZlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBjaGVja19vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqKQoreworCWlmIChvYmotPmZsYWdzICYgUkVBQ0hBQkxFKQorCQljaGVja19yZWFjaGFibGVfb2JqZWN0KG9iaik7CisJZWxzZQorCQljaGVja191bnJlYWNoYWJsZV9vYmplY3Qob2JqKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29ubmVjdGl2aXR5KHZvaWQpCit7CisJaW50IGksIG1heDsKKworCS8qIExvb2sgdXAgYWxsIHRoZSByZXF1aXJlbWVudHMsIHdhcm4gYWJvdXQgbWlzc2luZyBvYmplY3RzLi4gKi8KKwltYXggPSBnZXRfbWF4X29iamVjdF9pbmRleCgpOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBnZXRfaW5kZXhlZF9vYmplY3QoaSk7CisKKwkJaWYgKG9iaikKKwkJCWNoZWNrX29iamVjdChvYmopOworCX0KK30KKworLyoKKyAqIFRoZSBlbnRyaWVzIGluIGEgdHJlZSBhcmUgb3JkZXJlZCBpbiB0aGUgX3BhdGhfIG9yZGVyLAorICogd2hpY2ggbWVhbnMgdGhhdCBhIGRpcmVjdG9yeSBlbnRyeSBpcyBvcmRlcmVkIGJ5IGFkZGluZworICogYSBzbGFzaCB0byB0aGUgZW5kIG9mIGl0LgorICoKKyAqIFNvIGEgZGlyZWN0b3J5IGNhbGxlZCAiYSIgaXMgb3JkZXJlZCBfYWZ0ZXJfIGEgZmlsZQorICogY2FsbGVkICJhLmMiLCBiZWNhdXNlICJhLyIgc29ydHMgYWZ0ZXIgImEuYyIuCisgKi8KKyNkZWZpbmUgVFJFRV9VTk9SREVSRUQgKC0xKQorI2RlZmluZSBUUkVFX0hBU19EVVBTICAoLTIpCisKK3N0YXRpYyBpbnQgdmVyaWZ5X29yZGVyZWQodW5zaWduZWQgbW9kZTEsIGNvbnN0IGNoYXIgKm5hbWUxLCB1bnNpZ25lZCBtb2RlMiwgY29uc3QgY2hhciAqbmFtZTIpCit7CisJaW50IGxlbjEgPSBzdHJsZW4obmFtZTEpOworCWludCBsZW4yID0gc3RybGVuKG5hbWUyKTsKKwlpbnQgbGVuID0gbGVuMSA8IGxlbjIgPyBsZW4xIDogbGVuMjsKKwl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKwlpbnQgY21wOworCisJY21wID0gbWVtY21wKG5hbWUxLCBuYW1lMiwgbGVuKTsKKwlpZiAoY21wIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNtcCA+IDApCisJCXJldHVybiBUUkVFX1VOT1JERVJFRDsKKworCS8qCisJICogT2ssIHRoZSBmaXJzdCA8bGVuPiBjaGFyYWN0ZXJzIGFyZSB0aGUgc2FtZS4KKwkgKiBOb3cgd2UgbmVlZCB0byBvcmRlciB0aGUgbmV4dCBvbmUsIGJ1dCB0dXJuCisJICogYSAnXDAnIGludG8gYSAnLycgZm9yIGEgZGlyZWN0b3J5IGVudHJ5LgorCSAqLworCWMxID0gbmFtZTFbbGVuXTsKKwljMiA9IG5hbWUyW2xlbl07CisJaWYgKCFjMSAmJiAhYzIpCisJCS8qCisJCSAqIGdpdC13cml0ZS10cmVlIHVzZWQgdG8gd3JpdGUgb3V0IGEgbm9uc2Vuc2UgdHJlZSB0aGF0IGhhcworCQkgKiBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbmFtZSwgb25lIGJsb2IgYW5kIG9uZSB0cmVlLiAgTWFrZQorCQkgKiBzdXJlIHdlIGRvIG5vdCBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzLgorCQkgKi8KKwkJcmV0dXJuIFRSRUVfSEFTX0RVUFM7CisJaWYgKCFjMSAmJiBTX0lTRElSKG1vZGUxKSkKKwkJYzEgPSAnLyc7CisJaWYgKCFjMiAmJiBTX0lTRElSKG1vZGUyKSkKKwkJYzIgPSAnLyc7CisJcmV0dXJuIGMxIDwgYzIgPyAwIDogVFJFRV9VTk9SREVSRUQ7Cit9CisKK3N0YXRpYyBpbnQgZnNja190cmVlKHN0cnVjdCB0cmVlICppdGVtKQoreworCWludCByZXR2YWw7CisJaW50IGhhc19mdWxsX3BhdGggPSAwOworCWludCBoYXNfZW1wdHlfbmFtZSA9IDA7CisJaW50IGhhc196ZXJvX3BhZCA9IDA7CisJaW50IGhhc19iYWRfbW9kZXMgPSAwOworCWludCBoYXNfZHVwX2VudHJpZXMgPSAwOworCWludCBub3RfcHJvcGVybHlfc29ydGVkID0gMDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJdW5zaWduZWQgb19tb2RlOworCWNvbnN0IGNoYXIgKm9fbmFtZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvX3NoYTE7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgaXRlbS0+YnVmZmVyLCBpdGVtLT5zaXplKTsKKworCW9fbW9kZSA9IDA7CisJb19uYW1lID0gTlVMTDsKKwlvX3NoYTEgPSBOVUxMOworCXdoaWxlIChkZXNjLnNpemUpIHsKKwkJdW5zaWduZWQgbW9kZTsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKworCQlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KCZkZXNjLCAmbmFtZSwgJm1vZGUpOworCisJCWlmIChzdHJjaHIobmFtZSwgJy8nKSkKKwkJCWhhc19mdWxsX3BhdGggPSAxOworCQlpZiAoISpuYW1lKQorCQkJaGFzX2VtcHR5X25hbWUgPSAxOworCQloYXNfemVyb19wYWQgfD0gKihjaGFyICopZGVzYy5idWZmZXIgPT0gJzAnOworCQl1cGRhdGVfdHJlZV9lbnRyeSgmZGVzYyk7CisKKwkJc3dpdGNoIChtb2RlKSB7CisJCS8qCisJCSAqIFN0YW5kYXJkIG1vZGVzLi4KKwkJICovCisJCWNhc2UgU19JRlJFRyB8IDA3NTU6CisJCWNhc2UgU19JRlJFRyB8IDA2NDQ6CisJCWNhc2UgU19JRkxOSzoKKwkJY2FzZSBTX0lGRElSOgorCQljYXNlIFNfSUZESVJMTks6CisJCQlicmVhazsKKwkJLyoKKwkJICogVGhpcyBpcyBub25zdGFuZGFyZCwgYnV0IHdlIGhhZCBhIGZldyBvZiB0aGVzZQorCQkgKiBlYXJseSBvbiB3aGVuIHdlIGhvbm9yZWQgdGhlIGZ1bGwgc2V0IG9mIG1vZGUKKwkJICogYml0cy4uCisJCSAqLworCQljYXNlIFNfSUZSRUcgfCAwNjY0OgorCQkJaWYgKCFjaGVja19zdHJpY3QpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloYXNfYmFkX21vZGVzID0gMTsKKwkJfQorCisJCWlmIChvX25hbWUpIHsKKwkJCXN3aXRjaCAodmVyaWZ5X29yZGVyZWQob19tb2RlLCBvX25hbWUsIG1vZGUsIG5hbWUpKSB7CisJCQljYXNlIFRSRUVfVU5PUkRFUkVEOgorCQkJCW5vdF9wcm9wZXJseV9zb3J0ZWQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBUUkVFX0hBU19EVVBTOgorCQkJCWhhc19kdXBfZW50cmllcyA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJb19tb2RlID0gbW9kZTsKKwkJb19uYW1lID0gbmFtZTsKKwkJb19zaGExID0gc2hhMTsKKwl9CisJZnJlZShpdGVtLT5idWZmZXIpOworCWl0ZW0tPmJ1ZmZlciA9IE5VTEw7CisKKwlyZXR2YWwgPSAwOworCWlmIChoYXNfZnVsbF9wYXRoKSB7CisJCW9iandhcm5pbmcoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIGZ1bGwgcGF0aG5hbWVzIik7CisJfQorCWlmIChoYXNfZW1wdHlfbmFtZSkgeworCQlvYmp3YXJuaW5nKCZpdGVtLT5vYmplY3QsICJjb250YWlucyBlbXB0eSBwYXRobmFtZSIpOworCX0KKwlpZiAoaGFzX3plcm9fcGFkKSB7CisJCW9iandhcm5pbmcoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIHplcm8tcGFkZGVkIGZpbGUgbW9kZXMiKTsKKwl9CisJaWYgKGhhc19iYWRfbW9kZXMpIHsKKwkJb2Jqd2FybmluZygmaXRlbS0+b2JqZWN0LCAiY29udGFpbnMgYmFkIGZpbGUgbW9kZXMiKTsKKwl9CisJaWYgKGhhc19kdXBfZW50cmllcykgeworCQlyZXR2YWwgPSBvYmplcnJvcigmaXRlbS0+b2JqZWN0LCAiY29udGFpbnMgZHVwbGljYXRlIGZpbGUgZW50cmllcyIpOworCX0KKwlpZiAobm90X3Byb3Blcmx5X3NvcnRlZCkgeworCQlyZXR2YWwgPSBvYmplcnJvcigmaXRlbS0+b2JqZWN0LCAibm90IHByb3Blcmx5IHNvcnRlZCIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGZzY2tfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwljaGFyICpidWZmZXIgPSBjb21taXQtPmJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF0sIHNoYTFbMjBdOworCisJaWYgKG1lbWNtcChidWZmZXIsICJ0cmVlICIsIDUpKQorCQlyZXR1cm4gb2JqZXJyb3IoJmNvbW1pdC0+b2JqZWN0LCAiaW52YWxpZCBmb3JtYXQgLSBleHBlY3RlZCAndHJlZScgbGluZSIpOworCWlmIChnZXRfc2hhMV9oZXgoYnVmZmVyKzUsIHRyZWVfc2hhMSkgfHwgYnVmZmVyWzQ1XSAhPSAnXG4nKQorCQlyZXR1cm4gb2JqZXJyb3IoJmNvbW1pdC0+b2JqZWN0LCAiaW52YWxpZCAndHJlZScgbGluZSBmb3JtYXQgLSBiYWQgc2hhMSIpOworCWJ1ZmZlciArPSA0NjsKKwl3aGlsZSAoIW1lbWNtcChidWZmZXIsICJwYXJlbnQgIiwgNykpIHsKKwkJaWYgKGdldF9zaGExX2hleChidWZmZXIrNywgc2hhMSkgfHwgYnVmZmVyWzQ3XSAhPSAnXG4nKQorCQkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgJ3BhcmVudCcgbGluZSBmb3JtYXQgLSBiYWQgc2hhMSIpOworCQlidWZmZXIgKz0gNDg7CisJfQorCWlmIChtZW1jbXAoYnVmZmVyLCAiYXV0aG9yICIsIDcpKQorCQlyZXR1cm4gb2JqZXJyb3IoJmNvbW1pdC0+b2JqZWN0LCAiaW52YWxpZCBmb3JtYXQgLSBleHBlY3RlZCAnYXV0aG9yJyBsaW5lIik7CisJZnJlZShjb21taXQtPmJ1ZmZlcik7CisJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCWlmICghY29tbWl0LT50cmVlKQorCQlyZXR1cm4gb2JqZXJyb3IoJmNvbW1pdC0+b2JqZWN0LCAiY291bGQgbm90IGxvYWQgY29tbWl0J3MgdHJlZSAlcyIsIHRyZWVfc2hhMSk7CisJaWYgKCFjb21taXQtPnBhcmVudHMgJiYgc2hvd19yb290KQorCQlwcmludGYoInJvb3QgJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwlpZiAoIWNvbW1pdC0+ZGF0ZSkKKwkJcHJpbnRmKCJiYWQgY29tbWl0IGRhdGUgaW4gJXNcbiIsIAorCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzY2tfdGFnKHN0cnVjdCB0YWcgKnRhZykKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICp0YWdnZWQgPSB0YWctPnRhZ2dlZDsKKworCWlmICghdGFnZ2VkKSB7CisJCXJldHVybiBvYmplcnJvcigmdGFnLT5vYmplY3QsICJjb3VsZCBub3QgbG9hZCB0YWdnZWQgb2JqZWN0Iik7CisJfQorCWlmICghc2hvd190YWdzKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigidGFnZ2VkICVzICVzIiwgdHlwZW5hbWUodGFnZ2VkLT50eXBlKSwgc2hhMV90b19oZXgodGFnZ2VkLT5zaGExKSk7CisJcHJpbnRmKCIgKCVzKSBpbiAlc1xuIiwgdGFnLT50YWcsIHNoYTFfdG9faGV4KHRhZy0+b2JqZWN0LnNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2NrX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJZXJyb3JzX2ZvdW5kIHw9IEVSUk9SX09CSkVDVDsKKwkJcmV0dXJuIGVycm9yKCIlczogb2JqZWN0IGNvcnJ1cHQgb3IgbWlzc2luZyIsCisJCQkgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm4gMDsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikKKwkJcmV0dXJuIDA7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkKKwkJcmV0dXJuIGZzY2tfdHJlZSgoc3RydWN0IHRyZWUgKikgb2JqKTsKKwlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQpCisJCXJldHVybiBmc2NrX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKSBvYmopOworCWlmIChvYmotPnR5cGUgPT0gT0JKX1RBRykKKwkJcmV0dXJuIGZzY2tfdGFnKChzdHJ1Y3QgdGFnICopIG9iaik7CisKKwkvKiBCeSBub3csIHBhcnNlX29iamVjdCgpIHdvdWxkJ3ZlIHJldHVybmVkIE5VTEwgaW5zdGVhZC4gKi8KKwlyZXR1cm4gb2JqZXJyb3Iob2JqLCAidW5rbm93biB0eXBlICclZCcgKGludGVybmFsIGZzY2sgZXJyb3IpIiwKKwkJCW9iai0+dHlwZSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzb3J0aW5nIGNodW5rIHNpemU6IG1ha2UgaXQgcmVhc29uYWJseQorICogYmlnIHNvIHRoYXQgd2UgY2FuIHNvcnQgd2VsbC4uCisgKi8KKyNkZWZpbmUgTUFYX1NIQTFfRU5UUklFUyAoMTAyNCkKKworc3RydWN0IHNoYTFfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgaW5vOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG5yOworCXN0cnVjdCBzaGExX2VudHJ5ICplbnRyeVtNQVhfU0hBMV9FTlRSSUVTXTsKK30gc2hhMV9saXN0OworCitzdGF0aWMgaW50IGlub19jb21wYXJlKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwljb25zdCBzdHJ1Y3Qgc2hhMV9lbnRyeSAqYSA9IF9hLCAqYiA9IF9iOworCXVuc2lnbmVkIGxvbmcgaW5vMSA9IGEtPmlubywgaW5vMiA9IGItPmlubzsKKwlyZXR1cm4gaW5vMSA8IGlubzIgPyAtMSA6IGlubzEgPiBpbm8yID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzY2tfc2hhMV9saXN0KHZvaWQpCit7CisJaW50IGksIG5yID0gc2hhMV9saXN0Lm5yOworCisJaWYgKFNPUlRfRElSRU5UKQorCQlxc29ydChzaGExX2xpc3QuZW50cnksIG5yLAorCQkgICAgICBzaXplb2Yoc3RydWN0IHNoYTFfZW50cnkgKiksIGlub19jb21wYXJlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnkgPSBzaGExX2xpc3QuZW50cnlbaV07CisJCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBlbnRyeS0+c2hhMTsKKworCQlzaGExX2xpc3QuZW50cnlbaV0gPSBOVUxMOworCQlmc2NrX3NoYTEoc2hhMSk7CisJCWZyZWUoZW50cnkpOworCX0KKwlzaGExX2xpc3QubnIgPSAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfc2hhMV9saXN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBzaGExX2VudHJ5ICplbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworCWludCBucjsKKworCWVudHJ5LT5pbm8gPSBpbm87CisJaGFzaGNweShlbnRyeS0+c2hhMSwgc2hhMSk7CisJbnIgPSBzaGExX2xpc3QubnI7CisJaWYgKG5yID09IE1BWF9TSEExX0VOVFJJRVMpIHsKKwkJZnNja19zaGExX2xpc3QoKTsKKwkJbnIgPSAwOworCX0KKwlzaGExX2xpc3QuZW50cnlbbnJdID0gZW50cnk7CisJc2hhMV9saXN0Lm5yID0gKytucjsKK30KKworc3RhdGljIHZvaWQgZnNja19kaXIoaW50IGksIGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciBuYW1lWzEwMF07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWludCBsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisKKwkJc3dpdGNoIChsZW4pIHsKKwkJY2FzZSAyOgorCQkJaWYgKGRlLT5kX25hbWVbMV0gIT0gJy4nKQorCQkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoZGUtPmRfbmFtZVswXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAzODoKKwkJCXNwcmludGYobmFtZSwgIiUwMngiLCBpKTsKKwkJCW1lbWNweShuYW1lKzIsIGRlLT5kX25hbWUsIGxlbisxKTsKKwkJCWlmIChnZXRfc2hhMV9oZXgobmFtZSwgc2hhMSkgPCAwKQorCQkJCWJyZWFrOworCQkJYWRkX3NoYTFfbGlzdChzaGExLCBESVJFTlRfU09SVF9ISU5UKGRlKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBzaGExIGZpbGU6ICVzLyVzXG4iLCBwYXRoLCBkZS0+ZF9uYW1lKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3JlZnM7CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmbG9nX2VudCh1bnNpZ25lZCBjaGFyICpvc2hhMSwgdW5zaWduZWQgY2hhciAqbnNoYTEsCisJCWNvbnN0IGNoYXIgKmVtYWlsLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCwgaW50IHR6LAorCQljb25zdCBjaGFyICptZXNzYWdlLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKworCWlmICghaXNfbnVsbF9zaGExKG9zaGExKSkgeworCQlvYmogPSBsb29rdXBfb2JqZWN0KG9zaGExKTsKKwkJaWYgKG9iaikgeworCQkJb2JqLT51c2VkID0gMTsKKwkJCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwkJfQorCX0KKwlvYmogPSBsb29rdXBfb2JqZWN0KG5zaGExKTsKKwlpZiAob2JqKSB7CisJCW9iai0+dXNlZCA9IDE7CisJCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmbG9nKGNvbnN0IGNoYXIgKmxvZ25hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCWZvcl9lYWNoX3JlZmxvZ19lbnQobG9nbmFtZSwgZnNja19oYW5kbGVfcmVmbG9nX2VudCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKworCW9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpIHsKKwkJCWRlZmF1bHRfcmVmcysrOworCQkJcmV0dXJuIDA7IC8qIGl0IGlzIGluIGEgcGFjayAqLworCQl9CisJCWVycm9yKCIlczogaW52YWxpZCBzaGExIHBvaW50ZXIgJXMiLCByZWZuYW1lLCBzaGExX3RvX2hleChzaGExKSk7CisJCS8qIFdlJ2xsIGNvbnRpbnVlIHdpdGggdGhlIHJlc3QgZGVzcGl0ZSB0aGUgZXJyb3IuLiAqLworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdF9yZWZzKys7CisJb2JqLT51c2VkID0gMTsKKwltYXJrX3JlYWNoYWJsZShvYmosIFJFQUNIQUJMRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RlZmF1bHRfaGVhZHModm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoZnNja19oYW5kbGVfcmVmLCBOVUxMKTsKKwlpZiAoaW5jbHVkZV9yZWZsb2dzKQorCQlmb3JfZWFjaF9yZWZsb2coZnNja19oYW5kbGVfcmVmbG9nLCBOVUxMKTsKKworCS8qCisJICogTm90IGhhdmluZyBhbnkgZGVmYXVsdCBoZWFkcyBpc24ndCByZWFsbHkgZmF0YWwsIGJ1dAorCSAqIGl0IGRvZXMgbWVhbiB0aGF0ICItLXVucmVhY2hhYmxlIiBubyBsb25nZXIgbWFrZXMgYW55CisJICogc2Vuc2UgKHNpbmNlIGluIHRoaXMgY2FzZSBldmVyeXRoaW5nIHdpbGwgb2J2aW91c2x5CisJICogYmUgdW5yZWFjaGFibGUgYnkgZGVmaW5pdGlvbi4KKwkgKgorCSAqIFNob3dpbmcgZGFuZ2xpbmcgb2JqZWN0cyBpcyB2YWxpZCwgdGhvdWdoIChhcyB0aG9zZQorCSAqIGRhbmdsaW5nIG9iamVjdHMgYXJlIGxpa2VseSBsb3N0IGhlYWRzKS4KKwkgKgorCSAqIFNvIHdlIGp1c3QgcHJpbnQgYSB3YXJuaW5nIGFib3V0IGl0LCBhbmQgY2xlYXIgdGhlCisJICogInNob3dfdW5yZWFjaGFibGUiIGZsYWcuCisJICovCisJaWYgKCFkZWZhdWx0X3JlZnMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJub3RpY2U6IE5vIGRlZmF1bHQgcmVmZXJlbmNlc1xuIik7CisJCXNob3dfdW5yZWFjaGFibGUgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgZnNja19vYmplY3RfZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGRpcls0MDk2XTsKKwkJc3ByaW50ZihkaXIsICIlcy8lMDJ4IiwgcGF0aCwgaSk7CisJCWZzY2tfZGlyKGksIGRpcik7CisJfQorCWZzY2tfc2hhMV9saXN0KCk7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oZWFkX2xpbmsodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBmbGFnOworCWludCBudWxsX2lzX2Vycm9yID0gMDsKKwljb25zdCBjaGFyICpoZWFkX3BvaW50c19hdCA9IHJlc29sdmVfcmVmKCJIRUFEIiwgc2hhMSwgMCwgJmZsYWcpOworCisJaWYgKCFoZWFkX3BvaW50c19hdCkKKwkJcmV0dXJuIGVycm9yKCJJbnZhbGlkIEhFQUQiKTsKKwlpZiAoIXN0cmNtcChoZWFkX3BvaW50c19hdCwgIkhFQUQiKSkKKwkJLyogZGV0YWNoZWQgSEVBRCAqLworCQludWxsX2lzX2Vycm9yID0gMTsKKwllbHNlIGlmIChwcmVmaXhjbXAoaGVhZF9wb2ludHNfYXQsICJyZWZzL2hlYWRzLyIpKQorCQlyZXR1cm4gZXJyb3IoIkhFQUQgcG9pbnRzIHRvIHNvbWV0aGluZyBzdHJhbmdlICglcykiLAorCQkJICAgICBoZWFkX3BvaW50c19hdCk7CisJaWYgKGlzX251bGxfc2hhMShzaGExKSkgeworCQlpZiAobnVsbF9pc19lcnJvcikKKwkJCXJldHVybiBlcnJvcigiSEVBRDogZGV0YWNoZWQgSEVBRCBwb2ludHMgYXQgbm90aGluZyIpOworCQlmcHJpbnRmKHN0ZGVyciwgIm5vdGljZTogSEVBRCBwb2ludHMgdG8gYW4gdW5ib3JuIGJyYW5jaCAoJXMpXG4iLAorCQkJaGVhZF9wb2ludHNfYXQgKyAxMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzY2tfY2FjaGVfdHJlZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gcGFyc2Vfb2JqZWN0KGl0LT5zaGExKTsKKwkJaWYgKCFvYmopIHsKKwkJCWVycm9yKCIlczogaW52YWxpZCBzaGExIHBvaW50ZXIgaW4gY2FjaGUtdHJlZSIsCisJCQkgICAgICBzaGExX3RvX2hleChpdC0+c2hhMSkpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbWFya19yZWFjaGFibGUob2JqLCBSRUFDSEFCTEUpOworCQlvYmotPnVzZWQgPSAxOworCQlpZiAob2JqLT50eXBlICE9IE9CSl9UUkVFKQorCQkJZXJyIHw9IG9iamVycm9yKG9iaiwgIm5vbi10cmVlIGluIGNhY2hlLXRyZWUiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWVyciB8PSBmc2NrX2NhY2hlX3RyZWUoaXQtPmRvd25baV0tPmNhY2hlX3RyZWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGZzY2tfdXNhZ2VbXSA9CisiZ2l0LWZzY2sgWy0tdGFnc10gWy0tcm9vdF0gW1stLXVucmVhY2hhYmxlXSBbLS1jYWNoZV0gWy0tZnVsbF0gIgorIlstLXN0cmljdF0gPGhlYWQtc2hhMT4qXSI7CisKK2ludCBjbWRfZnNjayhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgaGVhZHM7CisKKwl0cmFja19vYmplY3RfcmVmcyA9IDE7CisJZXJyb3JzX2ZvdW5kID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLXVucmVhY2hhYmxlIikpIHsKKwkJCXNob3dfdW5yZWFjaGFibGUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCXNob3dfdGFncyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXJvb3QiKSkgeworCQkJc2hvd19yb290ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tY2FjaGUiKSkgeworCQkJa2VlcF9jYWNoZV9vYmplY3RzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tcmVmbG9ncyIpKSB7CisJCQlpbmNsdWRlX3JlZmxvZ3MgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsIikpIHsKKwkJCWNoZWNrX2Z1bGwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdHJpY3QiKSkgeworCQkJY2hlY2tfc3RyaWN0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKGZzY2tfdXNhZ2UpOworCX0KKworCWZzY2tfaGVhZF9saW5rKCk7CisJZnNja19vYmplY3RfZGlyKGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCWlmIChjaGVja19mdWxsKSB7CisJCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHQ7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCQlwcmVwYXJlX2FsdF9vZGIoKTsKKwkJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCQljaGFyIG5hbWVidWZbUEFUSF9NQVhdOworCQkJaW50IG5hbWVsZW4gPSBhbHQtPm5hbWUgLSBhbHQtPmJhc2U7CisJCQltZW1jcHkobmFtZWJ1ZiwgYWx0LT5iYXNlLCBuYW1lbGVuKTsKKwkJCW5hbWVidWZbbmFtZWxlbiAtIDFdID0gMDsKKwkJCWZzY2tfb2JqZWN0X2RpcihuYW1lYnVmKTsKKwkJfQorCQlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpCisJCQkvKiB2ZXJpZnkgZ2l2ZXMgZXJyb3IgbWVzc2FnZXMgaXRzZWxmICovCisJCQl2ZXJpZnlfcGFjayhwLCAwKTsKKworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJdWludDMyX3QgaSwgbnVtID0gcC0+bnVtX29iamVjdHM7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCQkJZnNja19zaGExKG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSkpOworCQl9CisJfQorCisJaGVhZHMgPSAwOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsgCisKKwkJaWYgKCphcmcgPT0gJy0nKQorCQkJY29udGludWU7CisKKwkJaWYgKCFnZXRfc2hhMShhcmcsIGhlYWRfc2hhMSkpIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3QoaGVhZF9zaGExKTsKKworCQkJLyogRXJyb3IgaXMgcHJpbnRlZCBieSBsb29rdXBfb2JqZWN0KCkuICovCisJCQlpZiAoIW9iaikKKwkJCQljb250aW51ZTsKKworCQkJb2JqLT51c2VkID0gMTsKKwkJCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwkJCWhlYWRzKys7CisJCQljb250aW51ZTsKKwkJfQorCQllcnJvcigiaW52YWxpZCBwYXJhbWV0ZXI6IGV4cGVjdGVkIHNoYTEsIGdvdCAnJXMnIiwgYXJnKTsKKwl9CisKKwkvKgorCSAqIElmIHdlJ3ZlIG5vdCBiZWVuIGdpdmVuIGFueSBleHBsaWNpdCBoZWFkIGluZm9ybWF0aW9uLCBkbyB0aGUKKwkgKiBkZWZhdWx0IG9uZXMgZnJvbSAuZ2l0L3JlZnMuIFdlIGFsc28gY29uc2lkZXIgdGhlIGluZGV4IGZpbGUKKwkgKiBpbiB0aGlzIGNhc2UgKGllIHRoaXMgaW1wbGllcyAtLWNhY2hlKS4KKwkgKi8KKwlpZiAoIWhlYWRzKSB7CisJCWdldF9kZWZhdWx0X2hlYWRzKCk7CisJCWtlZXBfY2FjaGVfb2JqZWN0cyA9IDE7CisJfQorCisJaWYgKGtlZXBfY2FjaGVfb2JqZWN0cykgeworCQlpbnQgaTsKKwkJcmVhZF9jYWNoZSgpOworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBtb2RlOworCQkJc3RydWN0IGJsb2IgKmJsb2I7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwkJCW1vZGUgPSBudG9obChhY3RpdmVfY2FjaGVbaV0tPmNlX21vZGUpOworCQkJaWYgKFNfSVNESVJMTksobW9kZSkpCisJCQkJY29udGludWU7CisJCQlibG9iID0gbG9va3VwX2Jsb2IoYWN0aXZlX2NhY2hlW2ldLT5zaGExKTsKKwkJCWlmICghYmxvYikKKwkJCQljb250aW51ZTsKKwkJCW9iaiA9ICZibG9iLT5vYmplY3Q7CisJCQlvYmotPnVzZWQgPSAxOworCQkJbWFya19yZWFjaGFibGUob2JqLCBSRUFDSEFCTEUpOworCQl9CisJCWlmIChhY3RpdmVfY2FjaGVfdHJlZSkKKwkJCWZzY2tfY2FjaGVfdHJlZShhY3RpdmVfY2FjaGVfdHJlZSk7CisJfQorCisJY2hlY2tfY29ubmVjdGl2aXR5KCk7CisJcmV0dXJuIGVycm9yc19mb3VuZDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZ2MuYyBiL2J1aWx0aW4tZ2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjFmOGMyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1nYy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBnaXQgZ2MgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ2xlYW51cCB1bnJlYWNoYWJsZSBmaWxlcyBhbmQgb3B0aW1pemUgdGhlIHJlcG9zaXRvcnkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEphbWVzIEJvd2VzCisgKgorICogQmFzZWQgb24gZ2l0LWdjLnNoLCB3aGljaCBpcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBPLiBQZWFyY2UKKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCisjZGVmaW5lIEZBSUxFRF9SVU4gImZhaWxlZCB0byBydW4gJXMiCisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fZ2NfdXNhZ2VbXSA9ICJnaXQtZ2MgWy0tcHJ1bmVdIjsKKworc3RhdGljIGludCBwYWNrX3JlZnMgPSAtMTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfcGFja19yZWZzW10gPSB7InBhY2stcmVmcyIsICItLXBydW5lIiwgTlVMTH07CitzdGF0aWMgY29uc3QgY2hhciAqYXJndl9yZWZsb2dbXSA9IHsicmVmbG9nIiwgImV4cGlyZSIsICItLWFsbCIsIE5VTEx9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfcmVwYWNrW10gPSB7InJlcGFjayIsICItYSIsICItZCIsICItbCIsIE5VTEx9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfcHJ1bmVbXSA9IHsicHJ1bmUiLCBOVUxMfTsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2X3JlcmVyZVtdID0geyJyZXJlcmUiLCAiZ2MiLCBOVUxMfTsKKworc3RhdGljIGludCBnY19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJnYy5wYWNrcmVmcyIpKSB7CisJCWlmICghc3RyY21wKHZhbHVlLCAibm90YmFyZSIpKQorCQkJcGFja19yZWZzID0gLTE7CisJCWVsc2UKKwkJCXBhY2tfcmVmcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBjbWRfZ2MoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJaW50IHBydW5lID0gMDsKKworCWdpdF9jb25maWcoZ2NfY29uZmlnKTsKKworCWlmIChwYWNrX3JlZnMgPCAwKQorCQlwYWNrX3JlZnMgPSAhaXNfYmFyZV9yZXBvc2l0b3J5KCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghc3RyY21wKGFyZywgIi0tcHJ1bmUiKSkgeworCQkJcHJ1bmUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJLyogcGVyaGFwcyBvdGhlciBwYXJhbWV0ZXJzIGxhdGVyLi4uICovCisJCWJyZWFrOworCX0KKwlpZiAoaSAhPSBhcmdjKQorCQl1c2FnZShidWlsdGluX2djX3VzYWdlKTsKKworCWlmIChwYWNrX3JlZnMgJiYgcnVuX2NvbW1hbmRfdl9vcHQoYXJndl9wYWNrX3JlZnMsIFJVTl9HSVRfQ01EKSkKKwkJcmV0dXJuIGVycm9yKEZBSUxFRF9SVU4sIGFyZ3ZfcGFja19yZWZzWzBdKTsKKworCWlmIChydW5fY29tbWFuZF92X29wdChhcmd2X3JlZmxvZywgUlVOX0dJVF9DTUQpKQorCQlyZXR1cm4gZXJyb3IoRkFJTEVEX1JVTiwgYXJndl9yZWZsb2dbMF0pOworCisJaWYgKHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3ZfcmVwYWNrLCBSVU5fR0lUX0NNRCkpCisJCXJldHVybiBlcnJvcihGQUlMRURfUlVOLCBhcmd2X3JlcGFja1swXSk7CisKKwlpZiAocHJ1bmUgJiYgcnVuX2NvbW1hbmRfdl9vcHQoYXJndl9wcnVuZSwgUlVOX0dJVF9DTUQpKQorCQlyZXR1cm4gZXJyb3IoRkFJTEVEX1JVTiwgYXJndl9wcnVuZVswXSk7CisKKwlpZiAocnVuX2NvbW1hbmRfdl9vcHQoYXJndl9yZXJlcmUsIFJVTl9HSVRfQ01EKSkKKwkJcmV0dXJuIGVycm9yKEZBSUxFRF9SVU4sIGFyZ3ZfcmVyZXJlWzBdKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1ncmVwLmMgYi9idWlsdGluLWdyZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTNjYjMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1ncmVwLmMKQEAgLTAsMCArMSw3MjYgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgZ3JlcCIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiZ3JlcC5oIgorCisvKgorICogZ2l0IGdyZXAgcGF0aHNwZWNzIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQgZnJvbSBkaWZmLXRyZWUgcGF0aHNwZWNzOworICogcGF0aG5hbWUgd2lsZGNhcmRzIGFyZSBhbGxvd2VkLgorICovCitzdGF0aWMgaW50IHBhdGhzcGVjX21hdGNoZXMoY29uc3QgY2hhciAqKnBhdGhzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBuYW1lbGVuLCBpOworCWlmICghcGF0aHMgfHwgISpwYXRocykKKwkJcmV0dXJuIDE7CisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlmb3IgKGkgPSAwOyBwYXRoc1tpXTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoID0gcGF0aHNbaV07CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtYXRjaCk7CisJCWNvbnN0IGNoYXIgKmNwLCAqbWV0YTsKKworCQlpZiAoIW1hdGNobGVuIHx8CisJCSAgICAoKG1hdGNobGVuIDw9IG5hbWVsZW4pICYmCisJCSAgICAgIXN0cm5jbXAobmFtZSwgbWF0Y2gsIG1hdGNobGVuKSAmJgorCQkgICAgIChtYXRjaFttYXRjaGxlbi0xXSA9PSAnLycgfHwKKwkJICAgICAgbmFtZVttYXRjaGxlbl0gPT0gJ1wwJyB8fCBuYW1lW21hdGNobGVuXSA9PSAnLycpKSkKKwkJCXJldHVybiAxOworCQlpZiAoIWZubWF0Y2gobWF0Y2gsIG5hbWUsIDApKQorCQkJcmV0dXJuIDE7CisJCWlmIChuYW1lW25hbWVsZW4tMV0gIT0gJy8nKQorCQkJY29udGludWU7CisKKwkJLyogV2UgYXJlIGJlaW5nIGFza2VkIGlmIHRoZSBkaXJlY3RvcnkgKCJuYW1lIikgaXMgd29ydGgKKwkJICogZGVzY2VuZGluZyBpbnRvLgorCQkgKgorCQkgKiBGaW5kIHRoZSBsb25nZXN0IGxlYWRpbmcgZGlyZWN0b3J5IG5hbWUgdGhhdCBkb2VzCisJCSAqIG5vdCBoYXZlIG1ldGFjaGFyYWN0ZXIgaW4gdGhlIHBhdGhzcGVjOyB0aGUgbmFtZQorCQkgKiB3ZSBhcmUgbG9va2luZyBhdCBtdXN0IG92ZXJsYXAgd2l0aCB0aGF0IGRpcmVjdG9yeS4KKwkJICovCisJCWZvciAoY3AgPSBtYXRjaCwgbWV0YSA9IE5VTEw7IGNwIC0gbWF0Y2ggPCBtYXRjaGxlbjsgY3ArKykgeworCQkJY2hhciBjaCA9ICpjcDsKKwkJCWlmIChjaCA9PSAnKicgfHwgY2ggPT0gJ1snIHx8IGNoID09ICc/JykgeworCQkJCW1ldGEgPSBjcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIW1ldGEpCisJCQltZXRhID0gY3A7IC8qIGZ1bGx5IGxpdGVyYWwgKi8KKworCQlpZiAobmFtZWxlbiA8PSBtZXRhIC0gbWF0Y2gpIHsKKwkJCS8qIExvb2tpbmcgYXQgIkRvY3VtZW50YXRpb24vIiBhbmQKKwkJCSAqIHRoZSBwYXR0ZXJuIHNheXMgIkRvY3VtZW50YXRpb24vaG93dG8vIiwgb3IKKwkJCSAqICJEb2N1bWVudGF0aW9uL2RpZmYqLnR4dCIuICBUaGUgbmFtZSB3ZQorCQkJICogaGF2ZSBzaG91bGQgbWF0Y2ggcHJlZml4LgorCQkJICovCisJCQlpZiAoIW1lbWNtcChtYXRjaCwgbmFtZSwgbmFtZWxlbikpCisJCQkJcmV0dXJuIDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtZXRhIC0gbWF0Y2ggPCBuYW1lbGVuKSB7CisJCQkvKiBMb29raW5nIGF0ICJEb2N1bWVudGF0aW9uL2hvd3RvLyIgYW5kCisJCQkgKiB0aGUgcGF0dGVybiBzYXlzICJEb2N1bWVudGF0aW9uL2gqIjsKKwkJCSAqIG1hdGNoIHVwIHRvICJEby4uLi9oIjsgdGhpcyBhdm9pZHMgZGVzY2VuZGluZworCQkJICogaW50byAiRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvIi4KKwkJCSAqLworCQkJaWYgKCFtZW1jbXAobWF0Y2gsIG5hbWUsIG1ldGEgLSBtYXRjaCkpCisJCQkJcmV0dXJuIDE7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncmVwX3NoYTEoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB0cmVlX25hbWVfbGVuKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyICpkYXRhOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyICp0b19mcmVlID0gTlVMTDsKKwlpbnQgaGl0OworCisJZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKSB7CisJCWVycm9yKCInJXMnOiB1bmFibGUgdG8gcmVhZCAlcyIsIG5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvcHQtPnJlbGF0aXZlICYmIG9wdC0+cHJlZml4X2xlbmd0aCkgeworCQlzdGF0aWMgY2hhciBuYW1lX2J1ZltQQVRIX01BWF07CisJCWNoYXIgKmNwOworCQlpbnQgbmFtZV9sZW4gPSBzdHJsZW4obmFtZSkgLSBvcHQtPnByZWZpeF9sZW5ndGggKyAxOworCisJCWlmICghdHJlZV9uYW1lX2xlbikKKwkJCW5hbWUgKz0gb3B0LT5wcmVmaXhfbGVuZ3RoOworCQllbHNlIHsKKwkJCWlmIChBUlJBWV9TSVpFKG5hbWVfYnVmKSA8PSBuYW1lX2xlbikKKwkJCQljcCA9IHRvX2ZyZWUgPSB4bWFsbG9jKG5hbWVfbGVuKTsKKwkJCWVsc2UKKwkJCQljcCA9IG5hbWVfYnVmOworCQkJbWVtY3B5KGNwLCBuYW1lLCB0cmVlX25hbWVfbGVuKTsKKwkJCXN0cmNweShjcCArIHRyZWVfbmFtZV9sZW4sCisJCQkgICAgICAgbmFtZSArIHRyZWVfbmFtZV9sZW4gKyBvcHQtPnByZWZpeF9sZW5ndGgpOworCQkJbmFtZSA9IGNwOworCQl9CisJfQorCWhpdCA9IGdyZXBfYnVmZmVyKG9wdCwgbmFtZSwgZGF0YSwgc2l6ZSk7CisJZnJlZShkYXRhKTsKKwlmcmVlKHRvX2ZyZWUpOworCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9maWxlKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgaTsKKwljaGFyICpkYXRhOworCXNpemVfdCBzejsKKworCWlmIChsc3RhdChmaWxlbmFtZSwgJnN0KSA8IDApIHsKKwllcnJfcmV0OgorCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZXJyb3IoIiclcyc6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0LnN0X3NpemUpCisJCXJldHVybiAwOyAvKiBlbXB0eSBmaWxlIC0tIG5vIGdyZXAgaGl0ICovCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKwlzeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJaSA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoaSA8IDApCisJCWdvdG8gZXJyX3JldDsKKwlkYXRhID0geG1hbGxvYyhzeiArIDEpOworCWlmIChzdC5zdF9zaXplICE9IHJlYWRfaW5fZnVsbChpLCBkYXRhLCBzeikpIHsKKwkJZXJyb3IoIiclcyc6IHNob3J0IHJlYWQgJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoaSk7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiAwOworCX0KKwljbG9zZShpKTsKKwlpZiAob3B0LT5yZWxhdGl2ZSAmJiBvcHQtPnByZWZpeF9sZW5ndGgpCisJCWZpbGVuYW1lICs9IG9wdC0+cHJlZml4X2xlbmd0aDsKKwlpID0gZ3JlcF9idWZmZXIob3B0LCBmaWxlbmFtZSwgZGF0YSwgc3opOworCWZyZWUoZGF0YSk7CisJcmV0dXJuIGk7Cit9CisKKyNpZmRlZiBfX3VuaXhfXworc3RhdGljIGludCBleGVjX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCisJYXJndlthcmdjXSA9IE5VTEw7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gcGlkOworCWlmICghcGlkKSB7CisJCWV4ZWN2cCgiZ3JlcCIsIChjaGFyICoqKSBhcmd2KTsKKwkJZXhpdCgyNTUpOworCX0KKwl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJaWYgKCFXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgTUFYQVJHUyAxMDAwCisjZGVmaW5lIEFSR0JVRiA0MDk2CisjZGVmaW5lIHB1c2hfYXJnKGEpIGRvIHsgXAorCWlmIChuciA8IE1BWEFSR1MpIGFyZ3ZbbnIrK10gPSAoYSk7IFwKKwllbHNlIGRpZSgibWF4aW11bSBudW1iZXIgb2YgYXJncyBleGNlZWRlZCIpOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBleHRlcm5hbF9ncmVwKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICoqcGF0aHMsIGludCBjYWNoZWQpCit7CisJaW50IGksIG5yLCBhcmdjLCBoaXQsIGxlbiwgc3RhdHVzOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYQVJHUysxXTsKKwljaGFyIHJhbmRhcmdbQVJHQlVGXTsKKwljaGFyICphcmdwdHIgPSByYW5kYXJnOworCXN0cnVjdCBncmVwX3BhdCAqcDsKKworCWlmIChvcHQtPmV4dGVuZGVkIHx8IChvcHQtPnJlbGF0aXZlICYmIG9wdC0+cHJlZml4X2xlbmd0aCkpCisJCXJldHVybiAtMTsKKwlsZW4gPSBuciA9IDA7CisJcHVzaF9hcmcoImdyZXAiKTsKKwlpZiAob3B0LT5maXhlZCkKKwkJcHVzaF9hcmcoIi1GIik7CisJaWYgKG9wdC0+bGluZW51bSkKKwkJcHVzaF9hcmcoIi1uIik7CisJaWYgKCFvcHQtPnBhdGhuYW1lKQorCQlwdXNoX2FyZygiLWgiKTsKKwlpZiAob3B0LT5yZWdmbGFncyAmIFJFR19FWFRFTkRFRCkKKwkJcHVzaF9hcmcoIi1FIik7CisJaWYgKG9wdC0+cmVnZmxhZ3MgJiBSRUdfSUNBU0UpCisJCXB1c2hfYXJnKCItaSIpOworCWlmIChvcHQtPndvcmRfcmVnZXhwKQorCQlwdXNoX2FyZygiLXciKTsKKwlpZiAob3B0LT5uYW1lX29ubHkpCisJCXB1c2hfYXJnKCItbCIpOworCWlmIChvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KQorCQlwdXNoX2FyZygiLUwiKTsKKwlpZiAob3B0LT5jb3VudCkKKwkJcHVzaF9hcmcoIi1jIik7CisJaWYgKG9wdC0+cG9zdF9jb250ZXh0IHx8IG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJaWYgKG9wdC0+cG9zdF9jb250ZXh0ICE9IG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCWlmIChvcHQtPnByZV9jb250ZXh0KSB7CisJCQkJcHVzaF9hcmcoIi1CIik7CisJCQkJbGVuICs9IHNucHJpbnRmKGFyZ3B0ciwgc2l6ZW9mKHJhbmRhcmcpLWxlbiwKKwkJCQkJCSIldSIsIG9wdC0+cHJlX2NvbnRleHQpOworCQkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCQlkaWUoIm1heGltdW0gbGVuZ3RoIG9mIGFyZ3MgZXhjZWVkZWQiKTsKKwkJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJCWFyZ3B0ciArPSBsZW47CisJCQl9CisJCQlpZiAob3B0LT5wb3N0X2NvbnRleHQpIHsKKwkJCQlwdXNoX2FyZygiLUEiKTsKKwkJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkJIiV1Iiwgb3B0LT5wb3N0X2NvbnRleHQpOworCQkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCQlkaWUoIm1heGltdW0gbGVuZ3RoIG9mIGFyZ3MgZXhjZWVkZWQiKTsKKwkJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJCWFyZ3B0ciArPSBsZW47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlwdXNoX2FyZygiLUMiKTsKKwkJCWxlbiArPSBzbnByaW50ZihhcmdwdHIsIHNpemVvZihyYW5kYXJnKS1sZW4sCisJCQkJCSIldSIsIG9wdC0+cG9zdF9jb250ZXh0KTsKKwkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCWRpZSgibWF4aW11bSBsZW5ndGggb2YgYXJncyBleGNlZWRlZCIpOworCQkJcHVzaF9hcmcoYXJncHRyKTsKKwkJCWFyZ3B0ciArPSBsZW47CisJCX0KKwl9CisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXB1c2hfYXJnKCItZSIpOworCQlwdXNoX2FyZyhwLT5wYXR0ZXJuKTsKKwl9CisKKwkvKgorCSAqIFRvIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIGhlYWRlciBwcmludGVkIG91dCB3aGVuIHdlIHdhbnQgaXQsCisJICogYWRkIC9kZXYvbnVsbCB0byB0aGUgcGF0aHMgdG8gZ3JlcC4gIFRoaXMgaXMgdW5uZWNlc3NhcnkKKwkgKiAoYW5kIHdyb25nKSB3aXRoICItbCIgb3IgIi1MIiwgd2hpY2ggYWx3YXlzIHByaW50IG91dCB0aGUKKwkgKiBuYW1lIGFueXdheS4KKwkgKgorCSAqIEdOVSBncmVwIGhhcyAiLUgiLCBidXQgdGhpcyBpcyBwb3J0YWJsZS4KKwkgKi8KKwlpZiAoIW9wdC0+bmFtZV9vbmx5ICYmICFvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KQorCQlwdXNoX2FyZygiL2Rldi9udWxsIik7CisKKwloaXQgPSAwOworCWFyZ2MgPSBucjsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJY2hhciAqbmFtZTsKKwkJaWYgKCFTX0lTUkVHKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXRoc3BlY19tYXRjaGVzKHBhdGhzLCBjZS0+bmFtZSkpCisJCQljb250aW51ZTsKKwkJbmFtZSA9IGNlLT5uYW1lOworCQlpZiAobmFtZVswXSA9PSAnLScpIHsKKwkJCWludCBsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJCW5hbWUgPSB4bWFsbG9jKGxlbiArIDMpOworCQkJbWVtY3B5KG5hbWUsICIuLyIsIDIpOworCQkJbWVtY3B5KG5hbWUgKyAyLCBjZS0+bmFtZSwgbGVuICsgMSk7CisJCX0KKwkJYXJndlthcmdjKytdID0gbmFtZTsKKwkJaWYgKGFyZ2MgPCBNQVhBUkdTICYmICFjZV9zdGFnZShjZSkpCisJCQljb250aW51ZTsKKwkJc3RhdHVzID0gZXhlY19ncmVwKGFyZ2MsIGFyZ3YpOworCQlpZiAoMCA8IHN0YXR1cykKKwkJCWhpdCA9IDE7CisJCWFyZ2MgPSBucjsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJZG8geworCQkJCWkrKzsKKwkJCX0gd2hpbGUgKGkgPCBhY3RpdmVfbnIgJiYKKwkJCQkgIXN0cmNtcChjZS0+bmFtZSwgYWN0aXZlX2NhY2hlW2ldLT5uYW1lKSk7CisJCQlpLS07IC8qIGNvbXBlbnNhdGUgZm9yIGxvb3AgY29udHJvbCAqLworCQl9CisJfQorCWlmIChhcmdjID4gbnIpIHsKKwkJc3RhdHVzID0gZXhlY19ncmVwKGFyZ2MsIGFyZ3YpOworCQlpZiAoMCA8IHN0YXR1cykKKwkJCWhpdCA9IDE7CisJfQorCXJldHVybiBoaXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBncmVwX2NhY2hlKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICoqcGF0aHMsIGludCBjYWNoZWQpCit7CisJaW50IGhpdCA9IDA7CisJaW50IG5yOworCXJlYWRfY2FjaGUoKTsKKworI2lmZGVmIF9fdW5peF9fCisJLyoKKwkgKiBVc2UgdGhlIGV4dGVybmFsICJncmVwIiBjb21tYW5kIGZvciB0aGUgY2FzZSB3aGVyZQorCSAqIHdlIGdyZXAgdGhyb3VnaCB0aGUgY2hlY2tlZC1vdXQgZmlsZXMuIEl0IHRlbmRzIHRvCisJICogYmUgYSBsb3QgbW9yZSBvcHRpbWl6ZWQKKwkgKi8KKwlpZiAoIWNhY2hlZCkgeworCQloaXQgPSBleHRlcm5hbF9ncmVwKG9wdCwgcGF0aHMsIGNhY2hlZCk7CisJCWlmIChoaXQgPj0gMCkKKwkJCXJldHVybiBoaXQ7CisJfQorI2VuZGlmCisKKwlmb3IgKG5yID0gMDsgbnIgPCBhY3RpdmVfbnI7IG5yKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtucl07CisJCWlmICghU19JU1JFRyhudG9obChjZS0+Y2VfbW9kZSkpKQorCQkJY29udGludWU7CisJCWlmICghcGF0aHNwZWNfbWF0Y2hlcyhwYXRocywgY2UtPm5hbWUpKQorCQkJY29udGludWU7CisJCWlmIChjYWNoZWQpIHsKKwkJCWlmIChjZV9zdGFnZShjZSkpCisJCQkJY29udGludWU7CisJCQloaXQgfD0gZ3JlcF9zaGExKG9wdCwgY2UtPnNoYTEsIGNlLT5uYW1lLCAwKTsKKwkJfQorCQllbHNlCisJCQloaXQgfD0gZ3JlcF9maWxlKG9wdCwgY2UtPm5hbWUpOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlkbyB7CisJCQkJbnIrKzsKKwkJCX0gd2hpbGUgKG5yIDwgYWN0aXZlX25yICYmCisJCQkJICFzdHJjbXAoY2UtPm5hbWUsIGFjdGl2ZV9jYWNoZVtucl0tPm5hbWUpKTsKKwkJCW5yLS07IC8qIGNvbXBlbnNhdGUgZm9yIGxvb3AgY29udHJvbCAqLworCQl9CisJfQorCWZyZWVfZ3JlcF9wYXR0ZXJucyhvcHQpOworCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF90cmVlKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICoqcGF0aHMsCisJCSAgICAgc3RydWN0IHRyZWVfZGVzYyAqdHJlZSwKKwkJICAgICBjb25zdCBjaGFyICp0cmVlX25hbWUsIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJaW50IGxlbjsKKwlpbnQgaGl0ID0gMDsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwljaGFyICpkb3duOworCWludCB0bl9sZW4gPSBzdHJsZW4odHJlZV9uYW1lKTsKKwljaGFyICpwYXRoX2J1ZiA9IHhtYWxsb2MoUEFUSF9NQVggKyB0bl9sZW4gKyAxMDApOworCisJaWYgKHRuX2xlbikgeworCQl0bl9sZW4gPSBzcHJpbnRmKHBhdGhfYnVmLCAiJXM6IiwgdHJlZV9uYW1lKTsKKwkJZG93biA9IHBhdGhfYnVmICsgdG5fbGVuOworCQlzdHJjYXQoZG93biwgYmFzZSk7CisJfQorCWVsc2UgeworCQlkb3duID0gcGF0aF9idWY7CisJCXN0cmNweShkb3duLCBiYXNlKTsKKwl9CisJbGVuID0gc3RybGVuKHBhdGhfYnVmKTsKKworCXdoaWxlICh0cmVlX2VudHJ5KHRyZWUsICZlbnRyeSkpIHsKKwkJc3RyY3B5KHBhdGhfYnVmICsgbGVuLCBlbnRyeS5wYXRoKTsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCS8qIE1hdGNoICJhYmMvIiBhZ2FpbnN0IHBhdGhzcGVjIHRvCisJCQkgKiBkZWNpZGUgaWYgd2Ugd2FudCB0byBkZXNjZW5kIGludG8gImFiYyIKKwkJCSAqIGRpcmVjdG9yeS4KKwkJCSAqLworCQkJc3RyY3B5KHBhdGhfYnVmICsgbGVuICsgdHJlZV9lbnRyeV9sZW4oZW50cnkucGF0aCwgZW50cnkuc2hhMSksICIvIik7CisKKwkJaWYgKCFwYXRoc3BlY19tYXRjaGVzKHBhdGhzLCBkb3duKSkKKwkJCTsKKwkJZWxzZSBpZiAoU19JU1JFRyhlbnRyeS5tb2RlKSkKKwkJCWhpdCB8PSBncmVwX3NoYTEob3B0LCBlbnRyeS5zaGExLCBwYXRoX2J1ZiwgdG5fbGVuKTsKKwkJZWxzZSBpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQkJc3RydWN0IHRyZWVfZGVzYyBzdWI7CisJCQl2b2lkICpkYXRhOworCQkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCQlkYXRhID0gcmVhZF9zaGExX2ZpbGUoZW50cnkuc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJCWlmICghZGF0YSkKKwkJCQlkaWUoInVuYWJsZSB0byByZWFkIHRyZWUgKCVzKSIsCisJCQkJICAgIHNoYTFfdG9faGV4KGVudHJ5LnNoYTEpKTsKKwkJCWluaXRfdHJlZV9kZXNjKCZzdWIsIGRhdGEsIHNpemUpOworCQkJaGl0IHw9IGdyZXBfdHJlZShvcHQsIHBhdGhzLCAmc3ViLCB0cmVlX25hbWUsIGRvd24pOworCQkJZnJlZShkYXRhKTsKKwkJfQorCX0KKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfb2JqZWN0KHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICoqcGF0aHMsCisJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikKKwkJcmV0dXJuIGdyZXBfc2hhMShvcHQsIG9iai0+c2hhMSwgbmFtZSwgMCk7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUIHx8IG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQlzdHJ1Y3QgdHJlZV9kZXNjIHRyZWU7CisJCXZvaWQgKmRhdGE7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJaW50IGhpdDsKKwkJZGF0YSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG9iai0+c2hhMSwgdHJlZV90eXBlLAorCQkJCQkJICAmc2l6ZSwgTlVMTCk7CisJCWlmICghZGF0YSkKKwkJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCWluaXRfdHJlZV9kZXNjKCZ0cmVlLCBkYXRhLCBzaXplKTsKKwkJaGl0ID0gZ3JlcF90cmVlKG9wdCwgcGF0aHMsICZ0cmVlLCBuYW1lLCAiIik7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBoaXQ7CisJfQorCWRpZSgidW5hYmxlIHRvIGdyZXAgZnJvbSBvYmplY3Qgb2YgdHlwZSAlcyIsIHR5cGVuYW1lKG9iai0+dHlwZSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBidWlsdGluX2dyZXBfdXNhZ2VbXSA9CisiZ2l0LWdyZXAgPG9wdGlvbj4qIDxyZXY+KiBbLWVdIDxwYXR0ZXJuPiBbPHBhdGg+Li4uXSI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGVtc2dfaW52YWxpZF9jb250ZXh0X2xlbltdID0KKyIlczogaW52YWxpZCBjb250ZXh0IGxlbmd0aCBhcmd1bWVudCI7CitzdGF0aWMgY29uc3QgY2hhciBlbXNnX21pc3NpbmdfY29udGV4dF9sZW5bXSA9CisibWlzc2luZyBjb250ZXh0IGxlbmd0aCBhcmd1bWVudCI7CitzdGF0aWMgY29uc3QgY2hhciBlbXNnX21pc3NpbmdfYXJndW1lbnRbXSA9Cisib3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0lcyI7CisKK2ludCBjbWRfZ3JlcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaGl0ID0gMDsKKwlpbnQgY2FjaGVkID0gMDsKKwlpbnQgc2Vlbl9kYXNoZGFzaCA9IDA7CisJc3RydWN0IGdyZXBfb3B0IG9wdDsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IGxpc3QgPSB7IDAsIDAsIE5VTEwgfTsKKwljb25zdCBjaGFyICoqcGF0aHMgPSBOVUxMOworCWludCBpOworCisJbWVtc2V0KCZvcHQsIDAsIHNpemVvZihvcHQpKTsKKwlvcHQucHJlZml4X2xlbmd0aCA9IChwcmVmaXggJiYgKnByZWZpeCkgPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJb3B0LnJlbGF0aXZlID0gMTsKKwlvcHQucGF0aG5hbWUgPSAxOworCW9wdC5wYXR0ZXJuX3RhaWwgPSAmb3B0LnBhdHRlcm5fbGlzdDsKKwlvcHQucmVnZmxhZ3MgPSBSRUdfTkVXTElORTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gLS0gdGhlbiB0aGUgcGF0aHMgbXVzdCBleGlzdCBpbiB0aGUgd29ya2luZworCSAqIHRyZWUuICBJZiB0aGVyZSBpcyBubyBleHBsaWNpdCBwYXR0ZXJuIHNwZWNpZmllZCB3aXRoIC1lIG9yCisJICogLWYsIHdlIHRha2UgdGhlIGZpcnN0IHVucmVjb2duaXplZCBub24gb3B0aW9uIHRvIGJlIHRoZQorCSAqIHBhdHRlcm4sIGJ1dCB0aGVuIHdoYXQgZm9sbG93cyBpdCBtdXN0IGJlIHplcm8gb3IgbW9yZQorCSAqIHZhbGlkIHJlZnMgdXAgdG8gdGhlIC0tIChpZiBleGlzdHMpLCBhbmQgdGhlbiBleGlzdGluZworCSAqIHBhdGhzLiAgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcGF0dGVybiwgdGhlbiB0aGUgZmlyc3QKKwkgKiB1bnJlY29nbml6ZWQgbm9uIG9wdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWZzIGxpc3QKKwkgKiB0aGF0IGNvbnRpbnVlcyB1cCB0byB0aGUgLS0gKGlmIGV4aXN0cyksIGFuZCB0aGVuIHBhdGhzLgorCSAqLworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWFyZ2MtLTsgYXJndisrOworCQlpZiAoIXN0cmNtcCgiLS1jYWNoZWQiLCBhcmcpKSB7CisJCQljYWNoZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1hIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS10ZXh0IiwgYXJnKSkgeworCQkJb3B0LmJpbmFyeSA9IEdSRVBfQklOQVJZX1RFWFQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWkiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWlnbm9yZS1jYXNlIiwgYXJnKSkgeworCQkJb3B0LnJlZ2ZsYWdzIHw9IFJFR19JQ0FTRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItSSIsIGFyZykpIHsKKwkJCW9wdC5iaW5hcnkgPSBHUkVQX0JJTkFSWV9OT01BVENIOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1pbnZlcnQtbWF0Y2giLCBhcmcpKSB7CisJCQlvcHQuaW52ZXJ0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItRSIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tZXh0ZW5kZWQtcmVnZXhwIiwgYXJnKSkgeworCQkJb3B0LnJlZ2ZsYWdzIHw9IFJFR19FWFRFTkRFRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItRiIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tZml4ZWQtc3RyaW5ncyIsIGFyZykpIHsKKwkJCW9wdC5maXhlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUciLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWJhc2ljLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyAmPSB+UkVHX0VYVEVOREVEOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1uIiwgYXJnKSkgeworCQkJb3B0LmxpbmVudW0gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1oIiwgYXJnKSkgeworCQkJb3B0LnBhdGhuYW1lID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItSCIsIGFyZykpIHsKKwkJCW9wdC5wYXRobmFtZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWwiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpbGVzLXdpdGgtbWF0Y2hlcyIsIGFyZykpIHsKKwkJCW9wdC5uYW1lX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1MIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1maWxlcy13aXRob3V0LW1hdGNoIiwgYXJnKSkgeworCQkJb3B0LnVubWF0Y2hfbmFtZV9vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItYyIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tY291bnQiLCBhcmcpKSB7CisJCQlvcHQuY291bnQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi13IiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS13b3JkLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC53b3JkX3JlZ2V4cCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItQSIpIHx8CisJCSAgICAhcHJlZml4Y21wKGFyZywgIi1CIikgfHwKKwkJICAgICFwcmVmaXhjbXAoYXJnLCAiLUMiKSB8fAorCQkgICAgKGFyZ1swXSA9PSAnLScgJiYgJzEnIDw9IGFyZ1sxXSAmJiBhcmdbMV0gPD0gJzknKSkgeworCQkJdW5zaWduZWQgbnVtOworCQkJY29uc3QgY2hhciAqc2NhbjsKKwkJCXN3aXRjaCAoYXJnWzFdKSB7CisJCQljYXNlICdBJzogY2FzZSAnQic6IGNhc2UgJ0MnOgorCQkJCWlmICghYXJnWzJdKSB7CisJCQkJCWlmIChhcmdjIDw9IDEpCisJCQkJCQlkaWUoZW1zZ19taXNzaW5nX2NvbnRleHRfbGVuKTsKKwkJCQkJc2NhbiA9ICorK2FyZ3Y7CisJCQkJCWFyZ2MtLTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlzY2FuID0gYXJnICsgMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2NhbiA9IGFyZyArIDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RydG91bF91aShzY2FuLCAxMCwgJm51bSkpCisJCQkJZGllKGVtc2dfaW52YWxpZF9jb250ZXh0X2xlbiwgc2Nhbik7CisJCQlzd2l0Y2ggKGFyZ1sxXSkgeworCQkJY2FzZSAnQSc6CisJCQkJb3B0LnBvc3RfY29udGV4dCA9IG51bTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQljYXNlICdDJzoKKwkJCQlvcHQucG9zdF9jb250ZXh0ID0gbnVtOworCQkJY2FzZSAnQic6CisJCQkJb3B0LnByZV9jb250ZXh0ID0gbnVtOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1mIiwgYXJnKSkgeworCQkJRklMRSAqcGF0dGVybnM7CisJCQlpbnQgbG5vID0gMDsKKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQlkaWUoZW1zZ19taXNzaW5nX2FyZ3VtZW50LCBhcmcpOworCQkJcGF0dGVybnMgPSBmb3Blbihhcmd2WzFdLCAiciIpOworCQkJaWYgKCFwYXR0ZXJucykKKwkJCQlkaWUoIiclcyc6ICVzIiwgYXJndlsxXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBwYXR0ZXJucykpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQkJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJCQkJYnVmW2xlbi0xXSA9IDA7CisJCQkJLyogaWdub3JlIGVtcHR5IGxpbmUgbGlrZSBncmVwIGRvZXMgKi8KKwkJCQlpZiAoIWJ1ZlswXSkKKwkJCQkJY29udGludWU7CisJCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCB4c3RyZHVwKGJ1ZiksCisJCQkJCQkgICAgYXJndlsxXSwgKytsbm8sCisJCQkJCQkgICAgR1JFUF9QQVRURVJOKTsKKwkJCX0KKwkJCWZjbG9zZShwYXR0ZXJucyk7CisJCQlhcmd2Kys7CisJCQlhcmdjLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1ub3QiLCBhcmcpKSB7CisJCQlhcHBlbmRfZ3JlcF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsCisJCQkJCSAgICBHUkVQX05PVCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1hbmQiLCBhcmcpKSB7CisJCQlhcHBlbmRfZ3JlcF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsCisJCQkJCSAgICBHUkVQX0FORCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1vciIsIGFyZykpCisJCQljb250aW51ZTsgLyogbm8tb3AgKi8KKwkJaWYgKCFzdHJjbXAoIigiLCBhcmcpKSB7CisJCQlhcHBlbmRfZ3JlcF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsCisJCQkJCSAgICBHUkVQX09QRU5fUEFSRU4pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIikiLCBhcmcpKSB7CisJCQlhcHBlbmRfZ3JlcF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsCisJCQkJCSAgICBHUkVQX0NMT1NFX1BBUkVOKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWFsbC1tYXRjaCIsIGFyZykpIHsKKwkJCW9wdC5hbGxfbWF0Y2ggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1lIiwgYXJnKSkgeworCQkJaWYgKDEgPCBhcmdjKSB7CisJCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmd2WzFdLAorCQkJCQkJICAgICItZSBvcHRpb24iLCAwLAorCQkJCQkJICAgIEdSRVBfUEFUVEVSTik7CisJCQkJYXJndisrOworCQkJCWFyZ2MtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRpZShlbXNnX21pc3NpbmdfYXJndW1lbnQsIGFyZyk7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tZnVsbC1uYW1lIiwgYXJnKSkgeworCQkJb3B0LnJlbGF0aXZlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLSIsIGFyZykpIHsKKwkJCS8qIGxhdGVyIHByb2Nlc3Npbmcgd2FudHMgdG8gaGF2ZSB0aGlzIGF0IGFyZ3ZbMV0gKi8KKwkJCWFyZ3YtLTsKKwkJCWFyZ2MrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKGJ1aWx0aW5fZ3JlcF91c2FnZSk7CisKKwkJLyogRmlyc3QgdW5yZWNvZ25pemVkIG5vbi1vcHRpb24gdG9rZW4gKi8KKwkJaWYgKCFvcHQucGF0dGVybl9saXN0KSB7CisJCQlhcHBlbmRfZ3JlcF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsCisJCQkJCSAgICBHUkVQX1BBVFRFUk4pOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBhcmUgbG9va2luZyBhdCB0aGUgZmlyc3QgcGF0aCBvciByZXY7CisJCQkgKiBpdCBpcyBmb3VuZCBhdCBhcmd2WzFdIGFmdGVyIGxlYXZpbmcgdGhlCisJCQkgKiBsb29wLgorCQkJICovCisJCQlhcmdjKys7IGFyZ3YtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcHQucGF0dGVybl9saXN0KQorCQlkaWUoIm5vIHBhdHRlcm4gZ2l2ZW4uIik7CisJaWYgKChvcHQucmVnZmxhZ3MgIT0gUkVHX05FV0xJTkUpICYmIG9wdC5maXhlZCkKKwkJZGllKCJjYW5ub3QgbWl4IC0tZml4ZWQtc3RyaW5ncyBhbmQgcmVnZXhwIik7CisJY29tcGlsZV9ncmVwX3BhdHRlcm5zKCZvcHQpOworCisJLyogQ2hlY2sgcmV2cyBhbmQgdGhlbiBwYXRocyAqLworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJLyogSXMgaXQgYSByZXY/ICovCisJCWlmICghZ2V0X3NoYTEoYXJnLCBzaGExKSkgeworCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJaWYgKCFvYmplY3QpCisJCQkJZGllKCJiYWQgb2JqZWN0ICVzIiwgYXJnKTsKKwkJCWFkZF9vYmplY3RfYXJyYXkob2JqZWN0LCBhcmcsICZsaXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCXNlZW5fZGFzaGRhc2ggPSAxOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFRoZSByZXN0IGFyZSBwYXRocyAqLworCWlmICghc2Vlbl9kYXNoZGFzaCkgeworCQlpbnQgajsKKwkJZm9yIChqID0gaTsgaiA8IGFyZ2M7IGorKykKKwkJCXZlcmlmeV9maWxlbmFtZShwcmVmaXgsIGFyZ3Zbal0pOworCX0KKworCWlmIChpIDwgYXJnYykgeworCQlwYXRocyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKwkJaWYgKG9wdC5wcmVmaXhfbGVuZ3RoICYmIG9wdC5yZWxhdGl2ZSkgeworCQkJLyogTWFrZSBzdXJlIHdlIGRvIG5vdCBnZXQgb3V0c2lkZSBvZiBwYXRocyAqLworCQkJZm9yIChpID0gMDsgcGF0aHNbaV07IGkrKykKKwkJCQlpZiAoc3RybmNtcChwcmVmaXgsIHBhdGhzW2ldLCBvcHQucHJlZml4X2xlbmd0aCkpCisJCQkJCWRpZSgiZ2l0LWdyZXA6IGNhbm5vdCBnZW5lcmF0ZSByZWxhdGl2ZSBmaWxlbmFtZXMgY29udGFpbmluZyAnLi4nIik7CisJCX0KKwl9CisJZWxzZSBpZiAocHJlZml4KSB7CisJCXBhdGhzID0geGNhbGxvYygyLCBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJCXBhdGhzWzBdID0gcHJlZml4OworCQlwYXRoc1sxXSA9IE5VTEw7CisJfQorCisJaWYgKCFsaXN0Lm5yKQorCQlyZXR1cm4gIWdyZXBfY2FjaGUoJm9wdCwgcGF0aHMsIGNhY2hlZCk7CisKKwlpZiAoY2FjaGVkKQorCQlkaWUoImJvdGggLS1jYWNoZWQgYW5kIHRyZWVzIGFyZSBnaXZlbi4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdCAqcmVhbF9vYmo7CisJCXJlYWxfb2JqID0gZGVyZWZfdGFnKGxpc3Qub2JqZWN0c1tpXS5pdGVtLCBOVUxMLCAwKTsKKwkJaWYgKGdyZXBfb2JqZWN0KCZvcHQsIHBhdGhzLCByZWFsX29iaiwgbGlzdC5vYmplY3RzW2ldLm5hbWUpKQorCQkJaGl0ID0gMTsKKwl9CisJZnJlZV9ncmVwX3BhdHRlcm5zKCZvcHQpOworCXJldHVybiAhaGl0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1pbml0LWRiLmMgYi9idWlsdGluLWluaXQtZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGY5ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1pbml0LWRiLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworI2lmbmRlZiBERUZBVUxUX0dJVF9URU1QTEFURV9ESVIKKyNkZWZpbmUgREVGQVVMVF9HSVRfVEVNUExBVEVfRElSICIvdXNyL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlcy8iCisjZW5kaWYKKworI2lmZGVmIE5PX1RSVVNUQUJMRV9GSUxFTU9ERQorI2RlZmluZSBURVNUX0ZJTEVNT0RFIDAKKyNlbHNlCisjZGVmaW5lIFRFU1RfRklMRU1PREUgMQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNhZmVfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpkaXIsIGludCBzaGFyZSkKK3sKKwlpZiAobWtkaXIoZGlyLCAwNzc3KSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVFWElTVCkgeworCQkJcGVycm9yKGRpcik7CisJCQlleGl0KDEpOworCQl9CisJfQorCWVsc2UgaWYgKHNoYXJlICYmIGFkanVzdF9zaGFyZWRfcGVybShkaXIpKQorCQlkaWUoIkNvdWxkIG5vdCBtYWtlICVzIHdyaXRhYmxlIGJ5IGdyb3VwXG4iLCBkaXIpOworfQorCitzdGF0aWMgaW50IGNvcHlfZmlsZShjb25zdCBjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IG1vZGUpCit7CisJaW50IGZkaSwgZmRvLCBzdGF0dXM7CisKKwltb2RlID0gKG1vZGUgJiAwMTExKSA/IDA3NzcgOiAwNjY2OworCWlmICgoZmRpID0gb3BlbihzcmMsIE9fUkRPTkxZKSkgPCAwKQorCQlyZXR1cm4gZmRpOworCWlmICgoZmRvID0gb3Blbihkc3QsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgbW9kZSkpIDwgMCkgeworCQljbG9zZShmZGkpOworCQlyZXR1cm4gZmRvOworCX0KKwlzdGF0dXMgPSBjb3B5X2ZkKGZkaSwgZmRvKTsKKwljbG9zZShmZG8pOworCisJaWYgKCFzdGF0dXMgJiYgYWRqdXN0X3NoYXJlZF9wZXJtKGRzdCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfdGVtcGxhdGVzXzEoY2hhciAqcGF0aCwgaW50IGJhc2VsZW4sCisJCQkgICAgIGNoYXIgKnRlbXBsYXRlLCBpbnQgdGVtcGxhdGVfYmFzZWxlbiwKKwkJCSAgICAgRElSICpkaXIpCit7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwkvKiBOb3RlOiBpZiAiLmdpdC9ob29rcyIgZmlsZSBleGlzdHMgaW4gdGhlIHJlcG9zaXRvcnkgYmVpbmcKKwkgKiByZS1pbml0aWFsaXplZCwgL2V0Yy9jb3JlLWdpdC90ZW1wbGF0ZXMvaG9va3MvdXBkYXRlIHdvdWxkCisJICogY2F1c2UgZ2l0LWluaXQgdG8gZmFpbCBoZXJlLiAgSSB0aGluayB0aGlzIGlzIHNhbmUgYnV0CisJICogaXQgbWVhbnMgdGhhdCB0aGUgc2V0IG9mIHRlbXBsYXRlcyB3ZSBzaGlwIGJ5IGRlZmF1bHQsIGFsb25nCisJICogd2l0aCB0aGUgd2F5IHRoZSBuYW1lc3BhY2UgdW5kZXIgLmdpdC8gaXMgb3JnYW5pemVkLCBzaG91bGQKKwkgKiBiZSByZWFsbHkgY2FyZWZ1bGx5IGNob3Nlbi4KKwkgKi8KKwlzYWZlX2NyZWF0ZV9kaXIocGF0aCwgMSk7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3RhdCBzdF9naXQsIHN0X3RlbXBsYXRlOworCQlpbnQgbmFtZWxlbjsKKwkJaW50IGV4aXN0cyA9IDA7CisKKwkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisJCW5hbWVsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCWlmICgoUEFUSF9NQVggPD0gYmFzZWxlbiArIG5hbWVsZW4pIHx8CisJCSAgICAoUEFUSF9NQVggPD0gdGVtcGxhdGVfYmFzZWxlbiArIG5hbWVsZW4pKQorCQkJZGllKCJpbnNhbmVseSBsb25nIHRlbXBsYXRlIG5hbWUgJXMiLCBkZS0+ZF9uYW1lKTsKKwkJbWVtY3B5KHBhdGggKyBiYXNlbGVuLCBkZS0+ZF9uYW1lLCBuYW1lbGVuKzEpOworCQltZW1jcHkodGVtcGxhdGUgKyB0ZW1wbGF0ZV9iYXNlbGVuLCBkZS0+ZF9uYW1lLCBuYW1lbGVuKzEpOworCQlpZiAobHN0YXQocGF0aCwgJnN0X2dpdCkpIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkJZGllKCJjYW5ub3Qgc3RhdCAlcyIsIHBhdGgpOworCQl9CisJCWVsc2UKKwkJCWV4aXN0cyA9IDE7CisKKwkJaWYgKGxzdGF0KHRlbXBsYXRlLCAmc3RfdGVtcGxhdGUpKQorCQkJZGllKCJjYW5ub3Qgc3RhdCB0ZW1wbGF0ZSAlcyIsIHRlbXBsYXRlKTsKKworCQlpZiAoU19JU0RJUihzdF90ZW1wbGF0ZS5zdF9tb2RlKSkgeworCQkJRElSICpzdWJkaXIgPSBvcGVuZGlyKHRlbXBsYXRlKTsKKwkJCWludCBiYXNlbGVuX3N1YiA9IGJhc2VsZW4gKyBuYW1lbGVuOworCQkJaW50IHRlbXBsYXRlX2Jhc2VsZW5fc3ViID0gdGVtcGxhdGVfYmFzZWxlbiArIG5hbWVsZW47CisJCQlpZiAoIXN1YmRpcikKKwkJCQlkaWUoImNhbm5vdCBvcGVuZGlyICVzIiwgdGVtcGxhdGUpOworCQkJcGF0aFtiYXNlbGVuX3N1YisrXSA9CisJCQkJdGVtcGxhdGVbdGVtcGxhdGVfYmFzZWxlbl9zdWIrK10gPSAnLyc7CisJCQlwYXRoW2Jhc2VsZW5fc3ViXSA9CisJCQkJdGVtcGxhdGVbdGVtcGxhdGVfYmFzZWxlbl9zdWJdID0gMDsKKwkJCWNvcHlfdGVtcGxhdGVzXzEocGF0aCwgYmFzZWxlbl9zdWIsCisJCQkJCSB0ZW1wbGF0ZSwgdGVtcGxhdGVfYmFzZWxlbl9zdWIsCisJCQkJCSBzdWJkaXIpOworCQkJY2xvc2VkaXIoc3ViZGlyKTsKKwkJfQorCQllbHNlIGlmIChleGlzdHMpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoU19JU0xOSyhzdF90ZW1wbGF0ZS5zdF9tb2RlKSkgeworCQkJY2hhciBsbmtbMjU2XTsKKwkJCWludCBsZW47CisJCQlsZW4gPSByZWFkbGluayh0ZW1wbGF0ZSwgbG5rLCBzaXplb2YobG5rKSk7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlkaWUoImNhbm5vdCByZWFkbGluayAlcyIsIHRlbXBsYXRlKTsKKwkJCWlmIChzaXplb2YobG5rKSA8PSBsZW4pCisJCQkJZGllKCJpbnNhbmVseSBsb25nIHN5bWxpbmsgJXMiLCB0ZW1wbGF0ZSk7CisJCQlsbmtbbGVuXSA9IDA7CisJCQlpZiAoc3ltbGluayhsbmssIHBhdGgpKQorCQkJCWRpZSgiY2Fubm90IHN5bWxpbmsgJXMgJXMiLCBsbmssIHBhdGgpOworCQl9CisJCWVsc2UgaWYgKFNfSVNSRUcoc3RfdGVtcGxhdGUuc3RfbW9kZSkpIHsKKwkJCWlmIChjb3B5X2ZpbGUocGF0aCwgdGVtcGxhdGUsIHN0X3RlbXBsYXRlLnN0X21vZGUpKQorCQkJCWRpZSgiY2Fubm90IGNvcHkgJXMgdG8gJXMiLCB0ZW1wbGF0ZSwgcGF0aCk7CisJCX0KKwkJZWxzZQorCQkJZXJyb3IoImlnbm9yaW5nIHRlbXBsYXRlICVzIiwgdGVtcGxhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV90ZW1wbGF0ZXMoY29uc3QgY2hhciAqZ2l0X2RpciwgaW50IGxlbiwgY29uc3QgY2hhciAqdGVtcGxhdGVfZGlyKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY2hhciB0ZW1wbGF0ZV9wYXRoW1BBVEhfTUFYXTsKKwlpbnQgdGVtcGxhdGVfbGVuOworCURJUiAqZGlyOworCisJaWYgKCF0ZW1wbGF0ZV9kaXIpIHsKKwkJdGVtcGxhdGVfZGlyID0gZ2V0ZW52KFRFTVBMQVRFX0RJUl9FTlZJUk9OTUVOVCk7CisJCWlmICghdGVtcGxhdGVfZGlyKQorCQkJdGVtcGxhdGVfZGlyID0gREVGQVVMVF9HSVRfVEVNUExBVEVfRElSOworCX0KKwlzdHJjcHkodGVtcGxhdGVfcGF0aCwgdGVtcGxhdGVfZGlyKTsKKwl0ZW1wbGF0ZV9sZW4gPSBzdHJsZW4odGVtcGxhdGVfcGF0aCk7CisJaWYgKHRlbXBsYXRlX3BhdGhbdGVtcGxhdGVfbGVuLTFdICE9ICcvJykgeworCQl0ZW1wbGF0ZV9wYXRoW3RlbXBsYXRlX2xlbisrXSA9ICcvJzsKKwkJdGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW5dID0gMDsKKwl9CisJZGlyID0gb3BlbmRpcih0ZW1wbGF0ZV9wYXRoKTsKKwlpZiAoIWRpcikgeworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IHRlbXBsYXRlcyBub3QgZm91bmQgJXNcbiIsCisJCQl0ZW1wbGF0ZV9kaXIpOworCQlyZXR1cm47CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgdGVtcGxhdGUgaXMgZnJvbSB0aGUgY29ycmVjdCB2aW50YWdlICovCisJc3RyY3B5KHRlbXBsYXRlX3BhdGggKyB0ZW1wbGF0ZV9sZW4sICJjb25maWciKTsKKwlyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uID0gMDsKKwlnaXRfY29uZmlnX2Zyb21fZmlsZShjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uLAorCQkJICAgICB0ZW1wbGF0ZV9wYXRoKTsKKwl0ZW1wbGF0ZV9wYXRoW3RlbXBsYXRlX2xlbl0gPSAwOworCisJaWYgKHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24gJiYKKwkgICAgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiAhPSBHSVRfUkVQT19WRVJTSU9OKSB7CisJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogbm90IGNvcHlpbmcgdGVtcGxhdGVzIG9mICIKKwkJCSJhIHdyb25nIGZvcm1hdCB2ZXJzaW9uICVkIGZyb20gJyVzJ1xuIiwKKwkJCXJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24sCisJCQl0ZW1wbGF0ZV9kaXIpOworCQljbG9zZWRpcihkaXIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHBhdGgsIGdpdF9kaXIsIGxlbik7CisJcGF0aFtsZW5dID0gMDsKKwljb3B5X3RlbXBsYXRlc18xKHBhdGgsIGxlbiwKKwkJCSB0ZW1wbGF0ZV9wYXRoLCB0ZW1wbGF0ZV9sZW4sCisJCQkgZGlyKTsKKwljbG9zZWRpcihkaXIpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9kZWZhdWx0X2ZpbGVzKGNvbnN0IGNoYXIgKmdpdF9kaXIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlX3BhdGgpCit7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGdpdF9kaXIpOworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IHN0YXQgc3QxOworCWNoYXIgcmVwb192ZXJzaW9uX3N0cmluZ1sxMF07CisJaW50IHJlaW5pdDsKKwlpbnQgZmlsZW1vZGU7CisKKwlpZiAobGVuID4gc2l6ZW9mKHBhdGgpLTUwKQorCQlkaWUoImluc2FuZSBnaXQgZGlyZWN0b3J5ICVzIiwgZ2l0X2Rpcik7CisJbWVtY3B5KHBhdGgsIGdpdF9kaXIsIGxlbik7CisKKwlpZiAobGVuICYmIHBhdGhbbGVuLTFdICE9ICcvJykKKwkJcGF0aFtsZW4rK10gPSAnLyc7CisKKwkvKgorCSAqIENyZWF0ZSAuZ2l0L3JlZnMve2hlYWRzLHRhZ3N9CisJICovCisJc3RyY3B5KHBhdGggKyBsZW4sICJyZWZzIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy9oZWFkcyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKworCS8qIEZpcnN0IGNvcHkgdGhlIHRlbXBsYXRlcyAtLSB3ZSBtaWdodCBoYXZlIHRoZSBkZWZhdWx0CisJICogY29uZmlnIGZpbGUgdGhlcmUsIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgd2FudCB0byByZWFkCisJICogZnJvbSBpdCBhZnRlciBpbnN0YWxsaW5nLgorCSAqLworCXBhdGhbbGVuXSA9IDA7CisJY29weV90ZW1wbGF0ZXMocGF0aCwgbGVuLCB0ZW1wbGF0ZV9wYXRoKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCS8qCisJICogV2Ugd291bGQgaGF2ZSBjcmVhdGVkIHRoZSBhYm92ZSB1bmRlciB1c2VyJ3MgdW1hc2sgLS0gdW5kZXIKKwkgKiBzaGFyZWQtcmVwb3NpdG9yeSBzZXR0aW5ncywgd2Ugd291bGQgbmVlZCB0byBmaXggdGhlbSB1cC4KKwkgKi8KKwlpZiAoc2hhcmVkX3JlcG9zaXRvcnkpIHsKKwkJcGF0aFtsZW5dID0gMDsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvaGVhZHMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRlZmF1bHQgc3ltbGluayBmcm9tICIuZ2l0L0hFQUQiIHRvIHRoZSAibWFzdGVyIgorCSAqIGJyYW5jaCwgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgorCSAqLworCXN0cmNweShwYXRoICsgbGVuLCAiSEVBRCIpOworCXJlaW5pdCA9ICFyZWFkX3JlZigiSEVBRCIsIHNoYTEpOworCWlmICghcmVpbml0KSB7CisJCWlmIChjcmVhdGVfc3ltcmVmKCJIRUFEIiwgInJlZnMvaGVhZHMvbWFzdGVyIiwgTlVMTCkgPCAwKQorCQkJZXhpdCgxKTsKKwl9CisKKwkvKiBUaGlzIGZvcmNlcyBjcmVhdGlvbiBvZiBuZXcgY29uZmlnIGZpbGUgKi8KKwlzcHJpbnRmKHJlcG9fdmVyc2lvbl9zdHJpbmcsICIlZCIsIEdJVF9SRVBPX1ZFUlNJT04pOworCWdpdF9jb25maWdfc2V0KCJjb3JlLnJlcG9zaXRvcnlmb3JtYXR2ZXJzaW9uIiwgcmVwb192ZXJzaW9uX3N0cmluZyk7CisKKwlwYXRoW2xlbl0gPSAwOworCXN0cmNweShwYXRoICsgbGVuLCAiY29uZmlnIik7CisKKwkvKiBDaGVjayBmaWxlbW9kZSB0cnVzdGFiaWxpdHkgKi8KKwlmaWxlbW9kZSA9IFRFU1RfRklMRU1PREU7CisJaWYgKFRFU1RfRklMRU1PREUgJiYgIWxzdGF0KHBhdGgsICZzdDEpKSB7CisJCXN0cnVjdCBzdGF0IHN0MjsKKwkJZmlsZW1vZGUgPSAoIWNobW9kKHBhdGgsIHN0MS5zdF9tb2RlIF4gU19JWFVTUikgJiYKKwkJCQkhbHN0YXQocGF0aCwgJnN0MikgJiYKKwkJCQlzdDEuc3RfbW9kZSAhPSBzdDIuc3RfbW9kZSk7CisJfQorCWdpdF9jb25maWdfc2V0KCJjb3JlLmZpbGVtb2RlIiwgZmlsZW1vZGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworCWlmIChpc19iYXJlX3JlcG9zaXRvcnkoKSkgeworCQlnaXRfY29uZmlnX3NldCgiY29yZS5iYXJlIiwgInRydWUiKTsKKwl9CisJZWxzZSB7CisJCWdpdF9jb25maWdfc2V0KCJjb3JlLmJhcmUiLCAiZmFsc2UiKTsKKwkJLyogYWxsb3cgdGVtcGxhdGUgY29uZmlnIGZpbGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgKi8KKwkJaWYgKGxvZ19hbGxfcmVmX3VwZGF0ZXMgPT0gLTEpCisJCSAgICBnaXRfY29uZmlnX3NldCgiY29yZS5sb2dhbGxyZWZ1cGRhdGVzIiwgInRydWUiKTsKKwl9CisJcmV0dXJuIHJlaW5pdDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgaW5pdF9kYl91c2FnZVtdID0KKyJnaXQtaW5pdCBbLS10ZW1wbGF0ZT08dGVtcGxhdGUtZGlyZWN0b3J5Pl0gWy0tc2hhcmVkXSI7CisKKy8qCisgKiBJZiB5b3Ugd2FudCB0bywgeW91IGNhbiBzaGFyZSB0aGUgREIgYXJlYSB3aXRoIGFueSBudW1iZXIgb2YgYnJhbmNoZXMuCisgKiBUaGF0IGhhcyBhZHZhbnRhZ2VzOiB5b3UgY2FuIHNhdmUgc3BhY2UgYnkgc2hhcmluZyBhbGwgdGhlIFNIQTEgb2JqZWN0cy4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCBqdXN0IG1ha2UgbG9va3VwIHNsb3dlciBhbmQgbWVzc2llci4gWW91CisgKiBiZSB0aGUganVkZ2UuICBUaGUgZGVmYXVsdCBjYXNlIGlzIHRvIGhhdmUgb25lIERCIHBlciBtYW5hZ2VkIGRpcmVjdG9yeS4KKyAqLworaW50IGNtZF9pbml0X2RiKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmdpdF9kaXI7CisJY29uc3QgY2hhciAqc2hhMV9kaXI7CisJY29uc3QgY2hhciAqdGVtcGxhdGVfZGlyID0gTlVMTDsKKwljaGFyICpwYXRoOworCWludCBsZW4sIGksIHJlaW5pdDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyssIGFyZ3YrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXRlbXBsYXRlPSIpKQorCQkJdGVtcGxhdGVfZGlyID0gYXJnKzExOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc2hhcmVkIikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IFBFUk1fR1JPVVA7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1zaGFyZWQ9IikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IGdpdF9jb25maWdfcGVybSgiYXJnIiwgYXJnKzkpOworCQllbHNlCisJCQl1c2FnZShpbml0X2RiX3VzYWdlKTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgZGVmYXVsdCAuZ2l0IGRpcmVjdG9yeSBjb250ZW50cworCSAqLworCWdpdF9kaXIgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZGlyKQorCQlnaXRfZGlyID0gREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UOworCXNhZmVfY3JlYXRlX2RpcihnaXRfZGlyLCAwKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVwb3NpdG9yeSB2ZXJzaW9uIGlzIHJpZ2h0LgorCSAqIE5vdGUgdGhhdCBhIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlCisJICogY29uZmlnIGZpbGUsIHNvIHRoaXMgd2lsbCBub3QgZmFpbC4gIFdoYXQgd2UgYXJlIGNhdGNoaW5nCisJICogaXMgYW4gYXR0ZW1wdCB0byByZWluaXRpYWxpemUgbmV3IHJlcG9zaXRvcnkgd2l0aCBhbiBvbGQgdG9vbC4KKwkgKi8KKwljaGVja19yZXBvc2l0b3J5X2Zvcm1hdCgpOworCisJcmVpbml0ID0gY3JlYXRlX2RlZmF1bHRfZmlsZXMoZ2l0X2RpciwgdGVtcGxhdGVfZGlyKTsKKworCS8qCisJICogQW5kIHNldCB1cCB0aGUgb2JqZWN0IHN0b3JlLgorCSAqLworCXNoYTFfZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlsZW4gPSBzdHJsZW4oc2hhMV9kaXIpOworCXBhdGggPSB4bWFsbG9jKGxlbiArIDQwKTsKKwltZW1jcHkocGF0aCwgc2hhMV9kaXIsIGxlbik7CisKKwlzYWZlX2NyZWF0ZV9kaXIoc2hhMV9kaXIsIDEpOworCXN0cmNweShwYXRoK2xlbiwgIi9wYWNrIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoK2xlbiwgIi9pbmZvIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCisJaWYgKHNoYXJlZF9yZXBvc2l0b3J5KSB7CisJCWNoYXIgYnVmWzEwXTsKKwkJLyogV2UgZG8gbm90IHNwZWxsICJncm91cCIgYW5kIHN1Y2gsIHNvIHRoYXQKKwkJICogdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlYWQgYnkgb2xkZXIgdmVyc2lvbgorCQkgKiBvZiBnaXQuCisJCSAqLworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgc2hhcmVkX3JlcG9zaXRvcnkpOworCQlnaXRfY29uZmlnX3NldCgiY29yZS5zaGFyZWRyZXBvc2l0b3J5IiwgYnVmKTsKKwkJZ2l0X2NvbmZpZ19zZXQoInJlY2VpdmUuZGVueU5vbkZhc3Rmb3J3YXJkcyIsICJ0cnVlIik7CisJfQorCisJcHJpbnRmKCIlcyVzIEdpdCByZXBvc2l0b3J5IGluICVzL1xuIiwKKwkJcmVpbml0ID8gIlJlaW5pdGlhbGl6ZWQgZXhpc3RpbmciIDogIkluaXRpYWxpemVkIGVtcHR5IiwKKwkJc2hhcmVkX3JlcG9zaXRvcnkgPyAiIHNoYXJlZCIgOiAiIiwKKwkJZ2l0X2Rpcik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbG9nLmMgYi9idWlsdGluLWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDQ3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxvZy5jCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQnVpbHRpbiAiZ2l0IGxvZyIgYW5kIHJlbGF0ZWQgY29tbWFuZHMgKHNob3csIHdoYXRjaGFuZ2VkKQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBMaW51cyBUb3J2YWxkcworICoJCSAyMDA2IEp1bmlvIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZsb2ctd2Fsay5oIgorI2luY2x1ZGUgInBhdGNoLWlkcy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworc3RhdGljIGludCBkZWZhdWx0X3Nob3dfcm9vdCA9IDE7CisKKy8qIHRoaXMgaXMgaW4gYnVpbHRpbi1kaWZmLmMgKi8KK3ZvaWQgYWRkX2hlYWQoc3RydWN0IHJldl9pbmZvICpyZXZzKTsKKworc3RhdGljIHZvaWQgYWRkX25hbWVfZGVjb3JhdGlvbihjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpbnQgcGxlbiA9IHN0cmxlbihwcmVmaXgpOworCWludCBubGVuID0gc3RybGVuKG5hbWUpOworCXN0cnVjdCBuYW1lX2RlY29yYXRpb24gKnJlcyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW1lX2RlY29yYXRpb24pICsgcGxlbiArIG5sZW4pOworCW1lbWNweShyZXMtPm5hbWUsIHByZWZpeCwgcGxlbik7CisJbWVtY3B5KHJlcy0+bmFtZSArIHBsZW4sIG5hbWUsIG5sZW4gKyAxKTsKKwlyZXMtPm5leHQgPSBhZGRfZGVjb3JhdGlvbigmbmFtZV9kZWNvcmF0aW9uLCBvYmosIHJlcyk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JlZl9kZWNvcmF0aW9uKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFncywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybiAwOworCWFkZF9uYW1lX2RlY29yYXRpb24oIiIsIHJlZm5hbWUsIG9iaik7CisJd2hpbGUgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCW9iaiA9ICgoc3RydWN0IHRhZyAqKW9iaiktPnRhZ2dlZDsKKwkJaWYgKCFvYmopCisJCQlicmVhazsKKwkJYWRkX25hbWVfZGVjb3JhdGlvbigidGFnOiAiLCByZWZuYW1lLCBvYmopOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX2xvZ19pbml0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4LAorCQkgICAgICBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlpbnQgaTsKKwlpbnQgZGVjb3JhdGUgPSAwOworCisJcmV2LT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwlyZXYtPmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9ERUZBVUxUOworCXJldi0+dmVyYm9zZV9oZWFkZXIgPSAxOworCXJldi0+c2hvd19yb290X2RpZmYgPSBkZWZhdWx0X3Nob3dfcm9vdDsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsIHJldiwgIkhFQUQiKTsKKwlpZiAocmV2LT5kaWZmb3B0LnBpY2theGUgfHwgcmV2LT5kaWZmb3B0LmZpbHRlcikKKwkJcmV2LT5hbHdheXNfc2hvd19oZWFkZXIgPSAwOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1lbmNvZGluZz0iKSkgeworCQkJYXJnICs9IDExOworCQkJaWYgKHN0cmNtcChhcmcsICJub25lIikpCisJCQkJZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcgPSB4c3RyZHVwKGFyZyk7CisJCQllbHNlCisJCQkJZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcgPSAiIjsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi0tZGVjb3JhdGUiKSkgeworCQkJaWYgKCFkZWNvcmF0ZSkKKwkJCQlmb3JfZWFjaF9yZWYoYWRkX3JlZl9kZWNvcmF0aW9uLCBOVUxMKTsKKwkJCWRlY29yYXRlID0gMTsKKwkJfSBlbHNlCisJCQlkaWUoInVucmVjb2duaXplZCBhcmd1bWVudDogJXMiLCBhcmcpOworCX0KK30KKworc3RhdGljIGludCBjbWRfbG9nX3dhbGsoc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldik7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2KSkgIT0gTlVMTCkgeworCQlsb2dfdHJlZV9jb21taXQocmV2LCBjb21taXQpOworCQlpZiAoIXJldi0+cmVmbG9nX2luZm8pIHsKKwkJCS8qIHdlIGFsbG93IGN5Y2xlcyBpbiByZWZsb2cgYW5jZXN0cnkgKi8KKwkJCWZyZWUoY29tbWl0LT5idWZmZXIpOworCQkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCQl9CisJCWZyZWVfY29tbWl0X2xpc3QoY29tbWl0LT5wYXJlbnRzKTsKKwkJY29tbWl0LT5wYXJlbnRzID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X2xvZ19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJsb2cuc2hvd3Jvb3QiKSkgeworCQlkZWZhdWx0X3Nob3dfcm9vdCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGlmZl91aV9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBjbWRfd2hhdGNoYW5nZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCWdpdF9jb25maWcoZ2l0X2xvZ19jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJcmV2LmRpZmYgPSAxOworCXJldi5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisJcmV2LnNpbXBsaWZ5X2hpc3RvcnkgPSAwOworCWNtZF9sb2dfaW5pdChhcmdjLCBhcmd2LCBwcmVmaXgsICZyZXYpOworCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKwlyZXR1cm4gY21kX2xvZ193YWxrKCZyZXYpOworfQorCitzdGF0aWMgaW50IHNob3dfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBzdXBwcmVzc19oZWFkZXIpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyICpidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCWludCBvZmZzZXQgPSAwOworCisJaWYgKCFidWYpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJaWYgKHN1cHByZXNzX2hlYWRlcikKKwkJd2hpbGUgKG9mZnNldCA8IHNpemUgJiYgYnVmW29mZnNldCsrXSAhPSAnXG4nKSB7CisJCQlpbnQgbmV3X29mZnNldCA9IG9mZnNldDsKKwkJCXdoaWxlIChuZXdfb2Zmc2V0IDwgc2l6ZSAmJiBidWZbbmV3X29mZnNldCsrXSAhPSAnXG4nKQorCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJb2Zmc2V0ID0gbmV3X29mZnNldDsKKwkJfQorCisJaWYgKG9mZnNldCA8IHNpemUpCisJCWZ3cml0ZShidWYgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQsIDEsIHN0ZG91dCk7CisJZnJlZShidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfdHJlZV9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sCisJCWNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJcHJpbnRmKCIlcyVzXG4iLCBwYXRobmFtZSwgU19JU0RJUihtb2RlKSA/ICIvIiA6ICIiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF9zaG93KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqb2JqZWN0czsKKwlpbnQgaSwgY291bnQsIHJldCA9IDA7CisKKwlnaXRfY29uZmlnKGdpdF9sb2dfY29uZmlnKTsKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCXJldi5kaWZmID0gMTsKKwlyZXYuZGlmZm9wdC5yZWN1cnNpdmUgPSAxOworCXJldi5jb21iaW5lX21lcmdlcyA9IDE7CisJcmV2LmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IDE7CisJcmV2LmFsd2F5c19zaG93X2hlYWRlciA9IDE7CisJcmV2Lmlnbm9yZV9tZXJnZXMgPSAwOworCXJldi5ub193YWxrID0gMTsKKwljbWRfbG9nX2luaXQoYXJnYywgYXJndiwgcHJlZml4LCAmcmV2KTsKKworCWNvdW50ID0gcmV2LnBlbmRpbmcubnI7CisJb2JqZWN0cyA9IHJldi5wZW5kaW5nLm9iamVjdHM7CisJZm9yIChpID0gMDsgaSA8IGNvdW50ICYmICFyZXQ7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gb2JqZWN0c1tpXS5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gb2JqZWN0c1tpXS5uYW1lOworCQlzd2l0Y2ggKG8tPnR5cGUpIHsKKwkJY2FzZSBPQkpfQkxPQjoKKwkJCXJldCA9IHNob3dfb2JqZWN0KG8tPnNoYTEsIDApOworCQkJYnJlYWs7CisJCWNhc2UgT0JKX1RBRzogeworCQkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopbzsKKworCQkJcHJpbnRmKCIlc3RhZyAlcyVzXG5cbiIsCisJCQkJCWRpZmZfZ2V0X2NvbG9yKHJldi5kaWZmb3B0LmNvbG9yX2RpZmYsCisJCQkJCQlESUZGX0NPTU1JVCksCisJCQkJCXQtPnRhZywKKwkJCQkJZGlmZl9nZXRfY29sb3IocmV2LmRpZmZvcHQuY29sb3JfZGlmZiwKKwkJCQkJCURJRkZfUkVTRVQpKTsKKwkJCXJldCA9IHNob3dfb2JqZWN0KG8tPnNoYTEsIDEpOworCQkJb2JqZWN0c1tpXS5pdGVtID0gKHN0cnVjdCBvYmplY3QgKil0LT50YWdnZWQ7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9CSl9UUkVFOgorCQkJcHJpbnRmKCIlc3RyZWUgJXMlc1xuXG4iLAorCQkJCQlkaWZmX2dldF9jb2xvcihyZXYuZGlmZm9wdC5jb2xvcl9kaWZmLAorCQkJCQkJRElGRl9DT01NSVQpLAorCQkJCQluYW1lLAorCQkJCQlkaWZmX2dldF9jb2xvcihyZXYuZGlmZm9wdC5jb2xvcl9kaWZmLAorCQkJCQkJRElGRl9SRVNFVCkpOworCQkJcmVhZF90cmVlX3JlY3Vyc2l2ZSgoc3RydWN0IHRyZWUgKilvLCAiIiwgMCwgMCwgTlVMTCwKKwkJCQkJc2hvd190cmVlX29iamVjdCk7CisJCQlicmVhazsKKwkJY2FzZSBPQkpfQ09NTUlUOgorCQkJcmV2LnBlbmRpbmcubnIgPSByZXYucGVuZGluZy5hbGxvYyA9IDA7CisJCQlyZXYucGVuZGluZy5vYmplY3RzID0gTlVMTDsKKwkJCWFkZF9vYmplY3RfYXJyYXkobywgbmFtZSwgJnJldi5wZW5kaW5nKTsKKwkJCXJldCA9IGNtZF9sb2dfd2FsaygmcmV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gZXJyb3IoIlVua25vd24gdHlwZTogJWQiLCBvLT50eXBlKTsKKwkJfQorCX0KKwlmcmVlKG9iamVjdHMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gImdpdCBsb2cgLWcgLS1hYmJyZXYtY29tbWl0IC0tcHJldHR5PW9uZWxpbmUiCisgKi8KK2ludCBjbWRfbG9nX3JlZmxvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCisJZ2l0X2NvbmZpZyhnaXRfbG9nX2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlpbml0X3JlZmxvZ193YWxrKCZyZXYucmVmbG9nX2luZm8pOworCXJldi5hYmJyZXZfY29tbWl0ID0gMTsKKwlyZXYudmVyYm9zZV9oZWFkZXIgPSAxOworCWNtZF9sb2dfaW5pdChhcmdjLCBhcmd2LCBwcmVmaXgsICZyZXYpOworCisJLyoKKwkgKiBUaGlzIG1lYW5zIHRoYXQgd2Ugb3ZlcnJpZGUgd2hhdGV2ZXIgY29tbWl0IGZvcm1hdCB0aGUgdXNlciBnYXZlCisJICogb24gdGhlIGNtZCBsaW5lLiAgU2FkLCBidXQgY21kX2xvZ19pbml0KCkgY3VycmVudGx5IGRvZXNuJ3QKKwkgKiBhbGxvdyB1cyB0byBzZXQgYSBkaWZmZXJlbnQgZGVmYXVsdC4KKwkgKi8KKwlyZXYuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX09ORUxJTkU7CisJcmV2LmFsd2F5c19zaG93X2hlYWRlciA9IDE7CisKKwkvKgorCSAqIFdlIGdldCBjYWxsZWQgdGhyb3VnaCAiZ2l0IHJlZmxvZyIsIHNvIHVubGlrZSB0aGUgb3RoZXIgbG9nCisJICogcm91dGluZXMsIHdlIG5lZWQgdG8gc2V0IHVwIG91ciBwYWdlciBtYW51YWxseS4uCisJICovCisJc2V0dXBfcGFnZXIoKTsKKworCXJldHVybiBjbWRfbG9nX3dhbGsoJnJldik7Cit9CisKK2ludCBjbWRfbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwlnaXRfY29uZmlnKGdpdF9sb2dfY29uZmlnKTsKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCXJldi5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCWNtZF9sb2dfaW5pdChhcmdjLCBhcmd2LCBwcmVmaXgsICZyZXYpOworCXJldHVybiBjbWRfbG9nX3dhbGsoJnJldik7Cit9CisKKy8qIGZvcm1hdC1wYXRjaCAqLworI2RlZmluZSBGT1JNQVRfUEFUQ0hfTkFNRV9NQVggNjQKKworc3RhdGljIGludCBpc3RpdGxlY2hhcihjaGFyIGMpCit7CisJcmV0dXJuIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fAorCQkoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ18nOworfQorCitzdGF0aWMgY2hhciAqZXh0cmFfaGVhZGVycyA9IE5VTEw7CitzdGF0aWMgaW50IGV4dHJhX2hlYWRlcnNfc2l6ZSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqZm10X3BhdGNoX3N1ZmZpeCA9ICIucGF0Y2giOworCitzdGF0aWMgaW50IGdpdF9mb3JtYXRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiZm9ybWF0LmhlYWRlcnMiKSkgeworCQlpbnQgbGVuOworCisJCWlmICghdmFsdWUpCisJCQlkaWUoImZvcm1hdC5oZWFkZXJzIHdpdGhvdXQgdmFsdWUiKTsKKwkJbGVuID0gc3RybGVuKHZhbHVlKTsKKwkJZXh0cmFfaGVhZGVyc19zaXplICs9IGxlbiArIDE7CisJCWV4dHJhX2hlYWRlcnMgPSB4cmVhbGxvYyhleHRyYV9oZWFkZXJzLCBleHRyYV9oZWFkZXJzX3NpemUpOworCQlleHRyYV9oZWFkZXJzW2V4dHJhX2hlYWRlcnNfc2l6ZSAtIGxlbiAtIDFdID0gMDsKKwkJc3RyY2F0KGV4dHJhX2hlYWRlcnMsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImZvcm1hdC5zdWZmaXgiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJZGllKCJmb3JtYXQuc3VmZml4IHdpdGhvdXQgdmFsdWUiKTsKKwkJZm10X3BhdGNoX3N1ZmZpeCA9IHhzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZGlmZi5jb2xvciIpIHx8ICFzdHJjbXAodmFyLCAiY29sb3IuZGlmZiIpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2xvZ19jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKKworc3RhdGljIEZJTEUgKnJlYWxzdGRvdXQgPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dF9kaXJlY3RvcnkgPSBOVUxMOworCitzdGF0aWMgaW50IHJlb3Blbl9zdGRvdXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbnIsIGludCBrZWVwX3N1YmplY3QpCit7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJY2hhciAqc29sOworCWludCBsZW4gPSAwOworCWludCBzdWZmaXhfbGVuID0gc3RybGVuKGZtdF9wYXRjaF9zdWZmaXgpICsgMTsKKworCWlmIChvdXRwdXRfZGlyZWN0b3J5KSB7CisJCWlmIChzdHJsZW4ob3V0cHV0X2RpcmVjdG9yeSkgPj0KKwkJICAgIHNpemVvZihmaWxlbmFtZSkgLSBGT1JNQVRfUEFUQ0hfTkFNRV9NQVggLSBzdWZmaXhfbGVuKQorCQkJcmV0dXJuIGVycm9yKCJuYW1lIG9mIG91dHB1dCBkaXJlY3RvcnkgaXMgdG9vIGxvbmciKTsKKwkJc3RybGNweShmaWxlbmFtZSwgb3V0cHV0X2RpcmVjdG9yeSwgc2l6ZW9mKGZpbGVuYW1lKSAtIHN1ZmZpeF9sZW4pOworCQlsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCQlpZiAoZmlsZW5hbWVbbGVuIC0gMV0gIT0gJy8nKQorCQkJZmlsZW5hbWVbbGVuKytdID0gJy8nOworCX0KKworCXNwcmludGYoZmlsZW5hbWUgKyBsZW4sICIlMDRkIiwgbnIpOworCWxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisKKwlzb2wgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcblxuIik7CisJaWYgKHNvbCkgeworCQlpbnQgaiwgc3BhY2UgPSAxOworCisJCXNvbCArPSAyOworCQkvKiBzdHJpcCBbUEFUQ0hdIG9yIFtQQVRDSCBibGFibGFdICovCisJCWlmICgha2VlcF9zdWJqZWN0ICYmICFwcmVmaXhjbXAoc29sLCAiW1BBVENIIikpIHsKKwkJCWNoYXIgKmVvcyA9IHN0cmNocihzb2wgKyA2LCAnXScpOworCQkJaWYgKGVvcykgeworCQkJCXdoaWxlIChpc3NwYWNlKCplb3MpKQorCQkJCQllb3MrKzsKKwkJCQlzb2wgPSBlb3M7CisJCQl9CisJCX0KKworCQlmb3IgKGogPSAwOworCQkgICAgIGogPCBGT1JNQVRfUEFUQ0hfTkFNRV9NQVggLSBzdWZmaXhfbGVuIC0gNSAmJgorCQkJICAgICBsZW4gPCBzaXplb2YoZmlsZW5hbWUpIC0gc3VmZml4X2xlbiAmJgorCQkJICAgICBzb2xbal0gJiYgc29sW2pdICE9ICdcbic7CisJCSAgICAgaisrKSB7CisJCQlpZiAoaXN0aXRsZWNoYXIoc29sW2pdKSkgeworCQkJCWlmIChzcGFjZSkgeworCQkJCQlmaWxlbmFtZVtsZW4rK10gPSAnLSc7CisJCQkJCXNwYWNlID0gMDsKKwkJCQl9CisJCQkJZmlsZW5hbWVbbGVuKytdID0gc29sW2pdOworCQkJCWlmIChzb2xbal0gPT0gJy4nKQorCQkJCQl3aGlsZSAoc29sW2ogKyAxXSA9PSAnLicpCisJCQkJCQlqKys7CisJCQl9IGVsc2UKKwkJCQlzcGFjZSA9IDE7CisJCX0KKwkJd2hpbGUgKGZpbGVuYW1lW2xlbiAtIDFdID09ICcuJyB8fCBmaWxlbmFtZVtsZW4gLSAxXSA9PSAnLScpCisJCQlsZW4tLTsKKwkJZmlsZW5hbWVbbGVuXSA9IDA7CisJfQorCWlmIChsZW4gKyBzdWZmaXhfbGVuID49IHNpemVvZihmaWxlbmFtZSkpCisJCXJldHVybiBlcnJvcigiUGF0Y2ggcGF0aG5hbWUgdG9vIGxvbmciKTsKKwlzdHJjcHkoZmlsZW5hbWUgKyBsZW4sIGZtdF9wYXRjaF9zdWZmaXgpOworCWZwcmludGYocmVhbHN0ZG91dCwgIiVzXG4iLCBmaWxlbmFtZSk7CisJaWYgKGZyZW9wZW4oZmlsZW5hbWUsICJ3Iiwgc3Rkb3V0KSA9PSBOVUxMKQorCQlyZXR1cm4gZXJyb3IoIkNhbm5vdCBvcGVuIHBhdGNoIGZpbGUgJXMiLGZpbGVuYW1lKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBnZXRfcGF0Y2hfaWRzKHN0cnVjdCByZXZfaW5mbyAqcmV2LCBzdHJ1Y3QgcGF0Y2hfaWRzICppZHMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gY2hlY2tfcmV2OworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvMSwgKm8yOworCXVuc2lnbmVkIGZsYWdzMSwgZmxhZ3MyOworCisJaWYgKHJldi0+cGVuZGluZy5uciAhPSAyKQorCQlkaWUoIk5lZWQgZXhhY3RseSBvbmUgcmFuZ2UuIik7CisKKwlvMSA9IHJldi0+cGVuZGluZy5vYmplY3RzWzBdLml0ZW07CisJZmxhZ3MxID0gbzEtPmZsYWdzOworCW8yID0gcmV2LT5wZW5kaW5nLm9iamVjdHNbMV0uaXRlbTsKKwlmbGFnczIgPSBvMi0+ZmxhZ3M7CisKKwlpZiAoKGZsYWdzMSAmIFVOSU5URVJFU1RJTkcpID09IChmbGFnczIgJiBVTklOVEVSRVNUSU5HKSkKKwkJZGllKCJOb3QgYSByYW5nZS4iKTsKKworCWluaXRfcGF0Y2hfaWRzKGlkcyk7CisKKwkvKiBnaXZlbiBhIHJhbmdlIGEuLmIgZ2V0IGFsbCBwYXRjaCBpZHMgZm9yIGIuLmEgKi8KKwlpbml0X3JldmlzaW9ucygmY2hlY2tfcmV2LCBwcmVmaXgpOworCW8xLT5mbGFncyBePSBVTklOVEVSRVNUSU5HOworCW8yLT5mbGFncyBePSBVTklOVEVSRVNUSU5HOworCWFkZF9wZW5kaW5nX29iamVjdCgmY2hlY2tfcmV2LCBvMSwgIm8xIik7CisJYWRkX3BlbmRpbmdfb2JqZWN0KCZjaGVja19yZXYsIG8yLCAibzIiKTsKKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJmNoZWNrX3Jldik7CisKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbigmY2hlY2tfcmV2KSkgIT0gTlVMTCkgeworCQkvKiBpZ25vcmUgbWVyZ2VzICovCisJCWlmIChjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisKKwkJYWRkX2NvbW1pdF9wYXRjaF9pZChjb21taXQsIGlkcyk7CisJfQorCisJLyogcmVzZXQgZm9yIG5leHQgcmV2aXNpb24gd2FsayAqLworCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKW8xLAorCQkJU0VFTiB8IFVOSU5URVJFU1RJTkcgfCBTSE9XTiB8IEFEREVEKTsKKwljbGVhcl9jb21taXRfbWFya3MoKHN0cnVjdCBjb21taXQgKilvMiwKKwkJCVNFRU4gfCBVTklOVEVSRVNUSU5HIHwgU0hPV04gfCBBRERFRCk7CisJbzEtPmZsYWdzID0gZmxhZ3MxOworCW8yLT5mbGFncyA9IGZsYWdzMjsKK30KKworc3RhdGljIHZvaWQgZ2VuX21lc3NhZ2VfaWQoY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IGxlbmd0aCwgY2hhciAqYmFzZSkKK3sKKwljb25zdCBjaGFyICpjb21taXR0ZXIgPSBnaXRfY29tbWl0dGVyX2luZm8oLTEpOworCWNvbnN0IGNoYXIgKmVtYWlsX3N0YXJ0ID0gc3RycmNocihjb21taXR0ZXIsICc8Jyk7CisJY29uc3QgY2hhciAqZW1haWxfZW5kID0gc3RycmNocihjb21taXR0ZXIsICc+Jyk7CisJaWYoIWVtYWlsX3N0YXJ0IHx8ICFlbWFpbF9lbmQgfHwgZW1haWxfc3RhcnQgPiBlbWFpbF9lbmQgLSAxKQorCQlkaWUoIkNvdWxkIG5vdCBleHRyYWN0IGVtYWlsIGZyb20gY29tbWl0dGVyIGlkZW50aXR5LiIpOworCXNucHJpbnRmKGRlc3QsIGxlbmd0aCwgIiVzLiVsdS5naXQuJS4qcyIsIGJhc2UsCisJCSAodW5zaWduZWQgbG9uZykgdGltZShOVUxMKSwKKwkJIChpbnQpKGVtYWlsX2VuZCAtIGVtYWlsX3N0YXJ0IC0gMSksIGVtYWlsX3N0YXJ0ICsgMSk7Cit9CisKK2ludCBjbWRfZm9ybWF0X3BhdGNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0ICoqbGlzdCA9IE5VTEw7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgbnIgPSAwLCB0b3RhbCwgaSwgajsKKwlpbnQgdXNlX3N0ZG91dCA9IDA7CisJaW50IG51bWJlcmVkID0gMDsKKwlpbnQgc3RhcnRfbnVtYmVyID0gLTE7CisJaW50IGtlZXBfc3ViamVjdCA9IDA7CisJaW50IHN1YmplY3RfcHJlZml4ID0gMDsKKwlpbnQgaWdub3JlX2lmX2luX3Vwc3RyZWFtID0gMDsKKwlpbnQgdGhyZWFkID0gMDsKKwljb25zdCBjaGFyICppbl9yZXBseV90byA9IE5VTEw7CisJc3RydWN0IHBhdGNoX2lkcyBpZHM7CisJY2hhciAqYWRkX3NpZ25vZmYgPSBOVUxMOworCWNoYXIgbWVzc2FnZV9pZFsxMDI0XTsKKwljaGFyIHJlZl9tZXNzYWdlX2lkWzEwMjRdOworCisJZ2l0X2NvbmZpZyhnaXRfZm9ybWF0X2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlyZXYuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX0VNQUlMOworCXJldi52ZXJib3NlX2hlYWRlciA9IDE7CisJcmV2LmRpZmYgPSAxOworCXJldi5jb21iaW5lX21lcmdlcyA9IDA7CisJcmV2Lmlnbm9yZV9tZXJnZXMgPSAxOworCXJldi5kaWZmb3B0Lm1zZ19zZXAgPSAiIjsKKwlyZXYuZGlmZm9wdC5yZWN1cnNpdmUgPSAxOworCisJcmV2LmV4dHJhX2hlYWRlcnMgPSBleHRyYV9oZWFkZXJzOworCisJLyoKKwkgKiBQYXJzZSB0aGUgYXJndW1lbnRzIGJlZm9yZSBzZXR1cF9yZXZpc2lvbnMoKSwgb3Igc29tZXRoaW5nCisJICogbGlrZSAiZ2l0IGZvcm1hdC1wYXRjaCAtbyBhMTIzIEhFQUReLi4iIG1heSBmYWlsOyBhMTIzIGlzCisJICogcG9zc2libHkgYSB2YWxpZCBTSEExLgorCSAqLworCWZvciAoaSA9IDEsIGogPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLXN0ZG91dCIpKQorCQkJdXNlX3N0ZG91dCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1uIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbaV0sICItLW51bWJlcmVkIikpCisJCQludW1iZXJlZCA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJndltpXSwgIi0tc3RhcnQtbnVtYmVyPSIpKQorCQkJc3RhcnRfbnVtYmVyID0gc3RydG9sKGFyZ3ZbaV0gKyAxNSwgTlVMTCwgMTApOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLXN0YXJ0LW51bWJlciIpKSB7CisJCQlpKys7CisJCQlpZiAoaSA9PSBhcmdjKQorCQkJCWRpZSgiTmVlZCBhIG51bWJlciBmb3IgLS1zdGFydC1udW1iZXIiKTsKKwkJCXN0YXJ0X251bWJlciA9IHN0cnRvbChhcmd2W2ldLCBOVUxMLCAxMCk7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWsiKSB8fAorCQkJCSFzdHJjbXAoYXJndltpXSwgIi0ta2VlcC1zdWJqZWN0IikpIHsKKwkJCWtlZXBfc3ViamVjdCA9IDE7CisJCQlyZXYudG90YWwgPSAtMTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLW91dHB1dC1kaXJlY3RvcnkiKSB8fAorCQkJICFzdHJjbXAoYXJndltpXSwgIi1vIikpIHsKKwkJCWkrKzsKKwkJCWlmIChhcmdjIDw9IGkpCisJCQkJZGllKCJXaGljaCBkaXJlY3Rvcnk/Iik7CisJCQlpZiAob3V0cHV0X2RpcmVjdG9yeSkKKwkJCQlkaWUoIlR3byBvdXRwdXQgZGlyZWN0b3JpZXM/Iik7CisJCQlvdXRwdXRfZGlyZWN0b3J5ID0gYXJndltpXTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLXNpZ25vZmYiKSB8fAorCQkJICFzdHJjbXAoYXJndltpXSwgIi1zIikpIHsKKwkJCWNvbnN0IGNoYXIgKmNvbW1pdHRlcjsKKwkJCWNvbnN0IGNoYXIgKmVuZHBvczsKKwkJCWNvbW1pdHRlciA9IGdpdF9jb21taXR0ZXJfaW5mbygxKTsKKwkJCWVuZHBvcyA9IHN0cmNocihjb21taXR0ZXIsICc+Jyk7CisJCQlpZiAoIWVuZHBvcykKKwkJCQlkaWUoImJvZ29zIGNvbW1pdHRlciBpbmZvICVzXG4iLCBjb21taXR0ZXIpOworCQkJYWRkX3NpZ25vZmYgPSB4bWFsbG9jKGVuZHBvcyAtIGNvbW1pdHRlciArIDIpOworCQkJbWVtY3B5KGFkZF9zaWdub2ZmLCBjb21taXR0ZXIsIGVuZHBvcyAtIGNvbW1pdHRlciArIDEpOworCQkJYWRkX3NpZ25vZmZbZW5kcG9zIC0gY29tbWl0dGVyICsgMV0gPSAwOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tYXR0YWNoIikpIHsKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gZ2l0X3ZlcnNpb25fc3RyaW5nOworCQkJcmV2Lm5vX2lubGluZSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2W2ldLCAiLS1hdHRhY2g9IikpIHsKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gYXJndltpXSArIDk7CisJCQlyZXYubm9faW5saW5lID0gMTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLWlubGluZSIpKSB7CisJCQlyZXYubWltZV9ib3VuZGFyeSA9IGdpdF92ZXJzaW9uX3N0cmluZzsKKwkJCXJldi5ub19pbmxpbmUgPSAwOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJndltpXSwgIi0taW5saW5lPSIpKSB7CisJCQlyZXYubWltZV9ib3VuZGFyeSA9IGFyZ3ZbaV0gKyA5OworCQkJcmV2Lm5vX2lubGluZSA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW0iKSkKKwkJCWlnbm9yZV9pZl9pbl91cHN0cmVhbSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tdGhyZWFkIikpCisJCQl0aHJlYWQgPSAxOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZ3ZbaV0sICItLWluLXJlcGx5LXRvPSIpKQorCQkJaW5fcmVwbHlfdG8gPSBhcmd2W2ldICsgMTQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taW4tcmVwbHktdG8iKSkgeworCQkJaSsrOworCQkJaWYgKGkgPT0gYXJnYykKKwkJCQlkaWUoIk5lZWQgYSBNZXNzYWdlLUlkIGZvciAtLWluLXJlcGx5LXRvIik7CisJCQlpbl9yZXBseV90byA9IGFyZ3ZbaV07CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2W2ldLCAiLS1zdWJqZWN0LXByZWZpeD0iKSkgeworCQkJc3ViamVjdF9wcmVmaXggPSAxOworCQkJcmV2LnN1YmplY3RfcHJlZml4ID0gYXJndltpXSArIDE3OworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoYXJndltpXSwgIi0tc3VmZml4PSIpKQorCQkJZm10X3BhdGNoX3N1ZmZpeCA9IGFyZ3ZbaV0gKyA5OworCQllbHNlCisJCQlhcmd2W2orK10gPSBhcmd2W2ldOworCX0KKwlhcmdjID0gajsKKworCWlmIChzdGFydF9udW1iZXIgPCAwKQorCQlzdGFydF9udW1iZXIgPSAxOworCWlmIChudW1iZXJlZCAmJiBrZWVwX3N1YmplY3QpCisJCWRpZSAoIi1uIGFuZCAtayBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIpOworCWlmIChrZWVwX3N1YmplY3QgJiYgc3ViamVjdF9wcmVmaXgpCisJCWRpZSAoIi0tc3ViamVjdC1wcmVmaXggYW5kIC1rIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIik7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsICJIRUFEIik7CisJaWYgKGFyZ2MgPiAxKQorCQlkaWUgKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzIiwgYXJndlsxXSk7CisKKwlpZiAoIXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8IERJRkZfRk9STUFUX1NVTU1BUlkgfCBESUZGX0ZPUk1BVF9QQVRDSDsKKworCWlmICghcmV2LmRpZmZvcHQudGV4dCkKKwkJcmV2LmRpZmZvcHQuYmluYXJ5ID0gMTsKKworCWlmICghb3V0cHV0X2RpcmVjdG9yeSAmJiAhdXNlX3N0ZG91dCkKKwkJb3V0cHV0X2RpcmVjdG9yeSA9IHByZWZpeDsKKworCWlmIChvdXRwdXRfZGlyZWN0b3J5KSB7CisJCWlmICh1c2Vfc3Rkb3V0KQorCQkJZGllKCJzdGFuZGFyZCBvdXRwdXQsIG9yIGRpcmVjdG9yeSwgd2hpY2ggb25lPyIpOworCQlpZiAobWtkaXIob3V0cHV0X2RpcmVjdG9yeSwgMDc3NykgPCAwICYmIGVycm5vICE9IEVFWElTVCkKKwkJCWRpZSgiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgJXMiLAorCQkJICAgIG91dHB1dF9kaXJlY3RvcnkpOworCX0KKworCWlmIChyZXYucGVuZGluZy5uciA9PSAxKSB7CisJCWlmIChyZXYubWF4X2NvdW50IDwgMCkgeworCQkJcmV2LnBlbmRpbmcub2JqZWN0c1swXS5pdGVtLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJYWRkX2hlYWQoJnJldik7CisJCX0KKwkJLyogT3RoZXJ3aXNlLCBpdCBpcyAiZm9ybWF0LXBhdGNoIC0yMiBIRUFEIiwgYW5kCisJCSAqIGdldF9yZXZpc2lvbigpIHdvdWxkIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgY291bnQuCisJCSAqLworCX0KKworCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0pCisJCWdldF9wYXRjaF9pZHMoJnJldiwgJmlkcywgcHJlZml4KTsKKworCWlmICghdXNlX3N0ZG91dCkKKwkJcmVhbHN0ZG91dCA9IGZkb3BlbihkdXAoMSksICJ3Iik7CisKKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldik7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24oJnJldikpICE9IE5VTEwpIHsKKwkJLyogaWdub3JlIG1lcmdlcyAqLworCQlpZiAoY29tbWl0LT5wYXJlbnRzICYmIGNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0gJiYKKwkJCQloYXNfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcykpCisJCQljb250aW51ZTsKKworCQlucisrOworCQlsaXN0ID0geHJlYWxsb2MobGlzdCwgbnIgKiBzaXplb2YobGlzdFswXSkpOworCQlsaXN0W25yIC0gMV0gPSBjb21taXQ7CisJfQorCXRvdGFsID0gbnI7CisJaWYgKG51bWJlcmVkKQorCQlyZXYudG90YWwgPSB0b3RhbCArIHN0YXJ0X251bWJlciAtIDE7CisJcmV2LmFkZF9zaWdub2ZmID0gYWRkX3NpZ25vZmY7CisJcmV2LnJlZl9tZXNzYWdlX2lkID0gaW5fcmVwbHlfdG87CisJd2hpbGUgKDAgPD0gLS1ucikgeworCQlpbnQgc2hvd247CisJCWNvbW1pdCA9IGxpc3RbbnJdOworCQlyZXYubnIgPSB0b3RhbCAtIG5yICsgKHN0YXJ0X251bWJlciAtIDEpOworCQkvKiBNYWtlIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbWFpbHMgcmVwbGllcyB0byB0aGUgZmlyc3QgKi8KKwkJaWYgKHRocmVhZCkgeworCQkJaWYgKG5yID09ICh0b3RhbCAtIDIpKSB7CisJCQkJc3RybmNweShyZWZfbWVzc2FnZV9pZCwgbWVzc2FnZV9pZCwKKwkJCQkJc2l6ZW9mKHJlZl9tZXNzYWdlX2lkKSk7CisJCQkJcmVmX21lc3NhZ2VfaWRbc2l6ZW9mKHJlZl9tZXNzYWdlX2lkKS0xXT0nXDAnOworCQkJCXJldi5yZWZfbWVzc2FnZV9pZCA9IHJlZl9tZXNzYWdlX2lkOworCQkJfQorCQkJZ2VuX21lc3NhZ2VfaWQobWVzc2FnZV9pZCwgc2l6ZW9mKG1lc3NhZ2VfaWQpLAorCQkJCSAgICAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCQlyZXYubWVzc2FnZV9pZCA9IG1lc3NhZ2VfaWQ7CisJCX0KKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJaWYgKHJlb3Blbl9zdGRvdXQoY29tbWl0LCByZXYubnIsIGtlZXBfc3ViamVjdCkpCisJCQkJZGllKCJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBmaWxlcyIpOworCQlzaG93biA9IGxvZ190cmVlX2NvbW1pdCgmcmV2LCBjb21taXQpOworCQlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCisJCS8qIFdlIHB1dCBvbmUgZXh0cmEgYmxhbmsgbGluZSBiZXR3ZWVuIGZvcm1hdHRlZAorCQkgKiBwYXRjaGVzIGFuZCB0aGlzIGZsYWcgaXMgdXNlZCBieSBsb2ctdHJlZSBjb2RlCisJCSAqIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBlbWl0IGEgTEYgYmVmb3JlIHNob3dpbmcKKwkJICogdGhlIGxvZzsgd2hlbiB1c2luZyBvbmUgZmlsZSBwZXIgcGF0Y2gsIHdlIGRvCisJCSAqIG5vdCB3YW50IHRoZSBleHRyYSBibGFuayBsaW5lLgorCQkgKi8KKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJcmV2LnNob3duX29uZSA9IDA7CisJCWlmIChzaG93bikgeworCQkJaWYgKHJldi5taW1lX2JvdW5kYXJ5KQorCQkJCXByaW50ZigiXG4tLSVzJXMtLVxuXG5cbiIsCisJCQkJICAgICAgIG1pbWVfYm91bmRhcnlfbGVhZGVyLAorCQkJCSAgICAgICByZXYubWltZV9ib3VuZGFyeSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCItLSBcbiVzXG5cbiIsIGdpdF92ZXJzaW9uX3N0cmluZyk7CisJCX0KKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJZmNsb3NlKHN0ZG91dCk7CisJfQorCWZyZWUobGlzdCk7CisJaWYgKGlnbm9yZV9pZl9pbl91cHN0cmVhbSkKKwkJZnJlZV9wYXRjaF9pZHMoJmlkcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BlbmRpbmdfY29tbWl0KGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSA9PSAwKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCQlpZiAoY29tbWl0KSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBmbGFnczsKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmY29tbWl0LT5vYmplY3QsIGFyZyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNoZXJyeV91c2FnZVtdID0KKyJnaXQtY2hlcnJ5IFstdl0gPHVwc3RyZWFtPiBbPGhlYWQ+XSBbPGxpbWl0Pl0iOworaW50IGNtZF9jaGVycnkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJc3RydWN0IHBhdGNoX2lkcyBpZHM7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEw7CisJY29uc3QgY2hhciAqdXBzdHJlYW07CisJY29uc3QgY2hhciAqaGVhZCA9ICJIRUFEIjsKKwljb25zdCBjaGFyICpsaW1pdCA9IE5VTEw7CisJaW50IHZlcmJvc2UgPSAwOworCisJaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgIi12IikpIHsKKwkJdmVyYm9zZSA9IDE7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgNDoKKwkJbGltaXQgPSBhcmd2WzNdOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMzoKKwkJaGVhZCA9IGFyZ3ZbMl07CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAyOgorCQl1cHN0cmVhbSA9IGFyZ3ZbMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYWdlKGNoZXJyeV91c2FnZSk7CisJfQorCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIHByZWZpeCk7CisJcmV2cy5kaWZmID0gMTsKKwlyZXZzLmNvbWJpbmVfbWVyZ2VzID0gMDsKKwlyZXZzLmlnbm9yZV9tZXJnZXMgPSAxOworCXJldnMuZGlmZm9wdC5yZWN1cnNpdmUgPSAxOworCisJaWYgKGFkZF9wZW5kaW5nX2NvbW1pdChoZWFkLCAmcmV2cywgMCkpCisJCWRpZSgiVW5rbm93biBjb21taXQgJXMiLCBoZWFkKTsKKwlpZiAoYWRkX3BlbmRpbmdfY29tbWl0KHVwc3RyZWFtLCAmcmV2cywgVU5JTlRFUkVTVElORykpCisJCWRpZSgiVW5rbm93biBjb21taXQgJXMiLCB1cHN0cmVhbSk7CisKKwkvKiBEb24ndCBzYXkgYW55dGhpbmcgaWYgaGVhZCBhbmQgdXBzdHJlYW0gYXJlIHRoZSBzYW1lLiAqLworCWlmIChyZXZzLnBlbmRpbmcubnIgPT0gMikgeworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvID0gcmV2cy5wZW5kaW5nLm9iamVjdHM7CisJCWlmIChoYXNoY21wKG9bMF0uaXRlbS0+c2hhMSwgb1sxXS5pdGVtLT5zaGExKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3BhdGNoX2lkcygmcmV2cywgJmlkcywgcHJlZml4KTsKKworCWlmIChsaW1pdCAmJiBhZGRfcGVuZGluZ19jb21taXQobGltaXQsICZyZXZzLCBVTklOVEVSRVNUSU5HKSkKKwkJZGllKCJVbmtub3duIGNvbW1pdCAlcyIsIGxpbWl0KTsKKworCS8qIHJldmVyc2UgdGhlIGxpc3Qgb2YgY29tbWl0cyAqLworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cyk7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24oJnJldnMpKSAhPSBOVUxMKSB7CisJCS8qIGlnbm9yZSBtZXJnZXMgKi8KKwkJaWYgKGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCQljb250aW51ZTsKKworCQljb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCAmbGlzdCk7CisJfQorCisJd2hpbGUgKGxpc3QpIHsKKwkJY2hhciBzaWduID0gJysnOworCisJCWNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWlmIChoYXNfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcykpCisJCQlzaWduID0gJy0nOworCisJCWlmICh2ZXJib3NlKSB7CisJCQlzdGF0aWMgY2hhciBidWZbMTYzODRdOworCQkJcHJldHR5X3ByaW50X2NvbW1pdChDTUlUX0ZNVF9PTkVMSU5FLCBjb21taXQsIH4wLAorCQkJICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMLCAwKTsKKwkJCXByaW50ZigiJWMgJXMgJXNcbiIsIHNpZ24sCisJCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksIGJ1Zik7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGYoIiVjICVzXG4iLCBzaWduLAorCQkJICAgICAgIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJfQorCisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKworCWZyZWVfcGF0Y2hfaWRzKCZpZHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1scy1maWxlcy5jIGIvYnVpbHRpbi1scy1maWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzA2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLWZpbGVzLmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKiBUaGlzIG1lcmdlcyB0aGUgZmlsZSBsaXN0aW5nIGluIHRoZSBkaXJlY3RvcnkgY2FjaGUgaW5kZXgKKyAqIHdpdGggdGhlIGFjdHVhbCB3b3JraW5nIGRpcmVjdG9yeSBsaXN0LCBhbmQgc2hvd3MgZGlmZmVyZW50CisgKiBjb21iaW5hdGlvbnMgb2YgdGhlIHR3by4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgaW50IGFiYnJldjsKK3N0YXRpYyBpbnQgc2hvd19kZWxldGVkOworc3RhdGljIGludCBzaG93X2NhY2hlZDsKK3N0YXRpYyBpbnQgc2hvd19vdGhlcnM7CitzdGF0aWMgaW50IHNob3dfc3RhZ2U7CitzdGF0aWMgaW50IHNob3dfdW5tZXJnZWQ7CitzdGF0aWMgaW50IHNob3dfbW9kaWZpZWQ7CitzdGF0aWMgaW50IHNob3dfa2lsbGVkOworc3RhdGljIGludCBzaG93X3ZhbGlkX2JpdDsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdG9yID0gJ1xuJzsKKworc3RhdGljIGludCBwcmVmaXhfbGVuOworc3RhdGljIGludCBwcmVmaXhfb2Zmc2V0Oworc3RhdGljIGNvbnN0IGNoYXIgKipwYXRoc3BlYzsKK3N0YXRpYyBpbnQgZXJyb3JfdW5tYXRjaDsKK3N0YXRpYyBjaGFyICpwc19tYXRjaGVkOworCitzdGF0aWMgY29uc3QgY2hhciAqdGFnX2NhY2hlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ191bm1lcmdlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19yZW1vdmVkID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX290aGVyID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX2tpbGxlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19tb2RpZmllZCA9ICIiOworCisKKy8qCisgKiBNYXRjaCBhIHBhdGhzcGVjIGFnYWluc3QgYSBmaWxlbmFtZS4gVGhlIGZpcnN0ICJsZW4iIGNoYXJhY3RlcnMKKyAqIGFyZSB0aGUgY29tbW9uIHByZWZpeAorICovCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IGNoYXIgKipzcGVjLCBjaGFyICpwc19tYXRjaGVkLAorCQkgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqbTsKKworCXdoaWxlICgobSA9ICpzcGVjKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG0gKyBsZW4pOworCisJCWlmICghbWF0Y2hsZW4pCisJCQlnb3RvIG1hdGNoZWQ7CisJCWlmICghc3RybmNtcChtICsgbGVuLCBmaWxlbmFtZSArIGxlbiwgbWF0Y2hsZW4pKSB7CisJCQlpZiAobVtsZW4gKyBtYXRjaGxlbiAtIDFdID09ICcvJykKKwkJCQlnb3RvIG1hdGNoZWQ7CisJCQlzd2l0Y2ggKGZpbGVuYW1lW2xlbiArIG1hdGNobGVuXSkgeworCQkJY2FzZSAnLyc6IGNhc2UgJ1wwJzoKKwkJCQlnb3RvIG1hdGNoZWQ7CisJCQl9CisJCX0KKwkJaWYgKCFmbm1hdGNoKG0gKyBsZW4sIGZpbGVuYW1lICsgbGVuLCAwKSkKKwkJCWdvdG8gbWF0Y2hlZDsKKwkJaWYgKHBzX21hdGNoZWQpCisJCQlwc19tYXRjaGVkKys7CisJCWNvbnRpbnVlOworCW1hdGNoZWQ6CisJCWlmIChwc19tYXRjaGVkKQorCQkJKnBzX21hdGNoZWQgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IGRpcl9lbnRyeSAqZW50KQoreworCWludCBsZW4gPSBwcmVmaXhfbGVuOworCWludCBvZmZzZXQgPSBwcmVmaXhfb2Zmc2V0OworCisJaWYgKGxlbiA+PSBlbnQtPmxlbikKKwkJZGllKCJnaXQtbHMtZmlsZXM6IGludGVybmFsIGVycm9yIC0gZGlyZWN0b3J5IGVudHJ5IG5vdCBzdXBlcnNldCBvZiBwcmVmaXgiKTsKKworCWlmIChwYXRoc3BlYyAmJiAhbWF0Y2gocGF0aHNwZWMsIHBzX21hdGNoZWQsIGVudC0+bmFtZSwgbGVuKSkKKwkJcmV0dXJuOworCisJZnB1dHModGFnLCBzdGRvdXQpOworCXdyaXRlX25hbWVfcXVvdGVkKCIiLCAwLCBlbnQtPm5hbWUgKyBvZmZzZXQsIGxpbmVfdGVybWluYXRvciwgc3Rkb3V0KTsKKwlwdXRjaGFyKGxpbmVfdGVybWluYXRvcik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb3RoZXJfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcikKK3sKKwlpbnQgaTsKKworCisJLyoKKwkgKiBTa2lwIG1hdGNoaW5nIGFuZCB1bm1lcmdlZCBlbnRyaWVzIGZvciB0aGUgcGF0aHMsCisJICogc2luY2Ugd2Ugd2FudCBqdXN0ICJvdGhlcnMiLgorCSAqCisJICogKE1hdGNoaW5nIGVudHJpZXMgYXJlIG5vcm1hbGx5IHBydW5lZCBkdXJpbmcKKwkgKiB0aGUgZGlyZWN0b3J5IHRyZWUgd2FsaywgYnV0IHdpbGwgc2hvdyB1cCBmb3IKKwkgKiBnaXRsaW5rcyBiZWNhdXNlIHdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUKKwkgKiBkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgc2V0IHRvIHN1cHByZXNzCisJICogdGhlbSkuCisJICovCisJZm9yIChpID0gMDsgaSA8IGRpci0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnQgPSBkaXItPmVudHJpZXNbaV07CisJCWludCBsZW4sIHBvczsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlICcvJyBhdCB0aGUgZW5kIHRoYXQgZGlyZWN0b3J5CisJCSAqIHdhbGtpbmcgYWRkcyBmb3IgZGlyZWN0b3J5IGVudHJpZXMuCisJCSAqLworCQlsZW4gPSBlbnQtPmxlbjsKKwkJaWYgKGxlbiAmJiBlbnQtPm5hbWVbbGVuLTFdID09ICcvJykKKwkJCWxlbi0tOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIGxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCWNvbnRpbnVlOwkvKiBleGFjdCBtYXRjaCAqLworCQlwb3MgPSAtcG9zIC0gMTsKKwkJaWYgKHBvcyA8IGFjdGl2ZV9ucikgeyAKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgPT0gbGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgZW50LT5uYW1lLCBsZW4pKQorCQkJCWNvbnRpbnVlOyAvKiBZdXAsIHRoaXMgb25lIGV4aXN0cyB1bm1lcmdlZCAqLworCQl9CisJCXNob3dfZGlyX2VudHJ5KHRhZ19vdGhlciwgZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfa2lsbGVkX2ZpbGVzKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRpci0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnQgPSBkaXItPmVudHJpZXNbaV07CisJCWNoYXIgKmNwLCAqc3A7CisJCWludCBwb3MsIGxlbiwga2lsbGVkID0gMDsKKworCQlmb3IgKGNwID0gZW50LT5uYW1lOyBjcCAtIGVudC0+bmFtZSA8IGVudC0+bGVuOyBjcCA9IHNwICsgMSkgeworCQkJc3AgPSBzdHJjaHIoY3AsICcvJyk7CisJCQlpZiAoIXNwKSB7CisJCQkJLyogSWYgZW50LT5uYW1lIGlzIHByZWZpeCBvZiBhbiBlbnRyeSBpbiB0aGUKKwkJCQkgKiBjYWNoZSwgaXQgd2lsbCBiZSBraWxsZWQuCisJCQkJICovCisJCQkJcG9zID0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBlbnQtPmxlbik7CisJCQkJaWYgKDAgPD0gcG9zKQorCQkJCQlkaWUoImJ1ZyBpbiBzaG93LWtpbGxlZC1maWxlcyIpOworCQkJCXBvcyA9IC1wb3MgLSAxOworCQkJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIgJiYKKwkJCQkgICAgICAgY2Vfc3RhZ2UoYWN0aXZlX2NhY2hlW3Bvc10pKQorCQkJCQlwb3MrKzsgLyogc2tpcCB1bm1lcmdlZCAqLworCQkJCWlmIChhY3RpdmVfbnIgPD0gcG9zKQorCQkJCQlicmVhazsKKwkJCQkvKiBwb3MgcG9pbnRzIGF0IGEgbmFtZSBpbW1lZGlhdGVseSBhZnRlcgorCQkJCSAqIGVudC0+bmFtZSBpbiB0aGUgY2FjaGUuICBEb2VzIGl0IGV4cGVjdAorCQkJCSAqIGVudC0+bmFtZSB0byBiZSBhIGRpcmVjdG9yeT8KKwkJCQkgKi8KKwkJCQlsZW4gPSBjZV9uYW1lbGVuKGFjdGl2ZV9jYWNoZVtwb3NdKTsKKwkJCQlpZiAoKGVudC0+bGVuIDwgbGVuKSAmJgorCQkJCSAgICAhc3RybmNtcChhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZSwKKwkJCQkJICAgICBlbnQtPm5hbWUsIGVudC0+bGVuKSAmJgorCQkJCSAgICBhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZVtlbnQtPmxlbl0gPT0gJy8nKQorCQkJCQlraWxsZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKDAgPD0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBzcCAtIGVudC0+bmFtZSkpIHsKKwkJCQkvKiBJZiBhbnkgb2YgdGhlIGxlYWRpbmcgZGlyZWN0b3JpZXMgaW4KKwkJCQkgKiBlbnQtPm5hbWUgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgY2FjaGUsCisJCQkJICogZW50LT5uYW1lIHdpbGwgYmUga2lsbGVkLgorCQkJCSAqLworCQkJCWtpbGxlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGtpbGxlZCkKKwkJCXNob3dfZGlyX2VudHJ5KHRhZ19raWxsZWQsIGRpci0+ZW50cmllc1tpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2NlX2VudHJ5KGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlpbnQgbGVuID0gcHJlZml4X2xlbjsKKwlpbnQgb2Zmc2V0ID0gcHJlZml4X29mZnNldDsKKworCWlmIChsZW4gPj0gY2VfbmFtZWxlbihjZSkpCisJCWRpZSgiZ2l0LWxzLWZpbGVzOiBpbnRlcm5hbCBlcnJvciAtIGNhY2hlIGVudHJ5IG5vdCBzdXBlcnNldCBvZiBwcmVmaXgiKTsKKworCWlmIChwYXRoc3BlYyAmJiAhbWF0Y2gocGF0aHNwZWMsIHBzX21hdGNoZWQsIGNlLT5uYW1lLCBsZW4pKQorCQlyZXR1cm47CisKKwlpZiAodGFnICYmICp0YWcgJiYgc2hvd192YWxpZF9iaXQgJiYKKwkgICAgKGNlLT5jZV9mbGFncyAmIGh0b25zKENFX1ZBTElEKSkpIHsKKwkJc3RhdGljIGNoYXIgYWx0dGFnWzRdOworCQltZW1jcHkoYWx0dGFnLCB0YWcsIDMpOworCQlpZiAoaXNhbHBoYSh0YWdbMF0pKQorCQkJYWx0dGFnWzBdID0gdG9sb3dlcih0YWdbMF0pOworCQllbHNlIGlmICh0YWdbMF0gPT0gJz8nKQorCQkJYWx0dGFnWzBdID0gJyEnOworCQllbHNlIHsKKwkJCWFsdHRhZ1swXSA9ICd2JzsKKwkJCWFsdHRhZ1sxXSA9IHRhZ1swXTsKKwkJCWFsdHRhZ1syXSA9ICcgJzsKKwkJCWFsdHRhZ1szXSA9IDA7CisJCX0KKwkJdGFnID0gYWx0dGFnOworCX0KKworCWlmICghc2hvd19zdGFnZSkgeworCQlmcHV0cyh0YWcsIHN0ZG91dCk7CisJCXdyaXRlX25hbWVfcXVvdGVkKCIiLCAwLCBjZS0+bmFtZSArIG9mZnNldCwKKwkJCQkgIGxpbmVfdGVybWluYXRvciwgc3Rkb3V0KTsKKwkJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0b3IpOworCX0KKwllbHNlIHsKKwkJcHJpbnRmKCIlcyUwNm8gJXMgJWRcdCIsCisJCSAgICAgICB0YWcsCisJCSAgICAgICBudG9obChjZS0+Y2VfbW9kZSksCisJCSAgICAgICBhYmJyZXYgPyBmaW5kX3VuaXF1ZV9hYmJyZXYoY2UtPnNoYTEsYWJicmV2KQorCQkJCTogc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkgICAgICAgY2Vfc3RhZ2UoY2UpKTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIGNlLT5uYW1lICsgb2Zmc2V0LAorCQkJCSAgbGluZV90ZXJtaW5hdG9yLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2ZpbGVzKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKworCS8qIEZvciBjYWNoZWQvZGVsZXRlZCBmaWxlcyB3ZSBkb24ndCBuZWVkIHRvIGV2ZW4gZG8gdGhlIHJlYWRkaXIgKi8KKwlpZiAoc2hvd19vdGhlcnMgfHwgc2hvd19raWxsZWQpIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9ICIuIiwgKmJhc2UgPSAiIjsKKwkJaW50IGJhc2VsZW4gPSBwcmVmaXhfbGVuOworCisJCWlmIChiYXNlbGVuKQorCQkJcGF0aCA9IGJhc2UgPSBwcmVmaXg7CisJCXJlYWRfZGlyZWN0b3J5KGRpciwgcGF0aCwgYmFzZSwgYmFzZWxlbiwgcGF0aHNwZWMpOworCQlpZiAoc2hvd19vdGhlcnMpCisJCQlzaG93X290aGVyX2ZpbGVzKGRpcik7CisJCWlmIChzaG93X2tpbGxlZCkKKwkJCXNob3dfa2lsbGVkX2ZpbGVzKGRpcik7CisJfQorCWlmIChzaG93X2NhY2hlZCB8IHNob3dfc3RhZ2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQkJaWYgKGV4Y2x1ZGVkKGRpciwgY2UtPm5hbWUpICE9IGRpci0+c2hvd19pZ25vcmVkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNob3dfdW5tZXJnZWQgJiYgIWNlX3N0YWdlKGNlKSkKKwkJCQljb250aW51ZTsKKwkJCXNob3dfY2VfZW50cnkoY2Vfc3RhZ2UoY2UpID8gdGFnX3VubWVyZ2VkIDogdGFnX2NhY2hlZCwgY2UpOworCQl9CisJfQorCWlmIChzaG93X2RlbGV0ZWQgfCBzaG93X21vZGlmaWVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IGVycjsKKwkJCWlmIChleGNsdWRlZChkaXIsIGNlLT5uYW1lKSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWVyciA9IGxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQkJaWYgKHNob3dfZGVsZXRlZCAmJiBlcnIpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfcmVtb3ZlZCwgY2UpOworCQkJaWYgKHNob3dfbW9kaWZpZWQgJiYgY2VfbW9kaWZpZWQoY2UsICZzdCwgMCkpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfbW9kaWZpZWQsIGNlKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFBydW5lIHRoZSBpbmRleCB0byBvbmx5IGNvbnRhaW4gc3R1ZmYgc3RhcnRpbmcgd2l0aCAicHJlZml4IgorICovCitzdGF0aWMgdm9pZCBwcnVuZV9jYWNoZShjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHByZWZpeCwgcHJlZml4X2xlbik7CisJdW5zaWduZWQgaW50IGZpcnN0LCBsYXN0OworCisJaWYgKHBvcyA8IDApCisJCXBvcyA9IC1wb3MtMTsKKwlhY3RpdmVfY2FjaGUgKz0gcG9zOworCWFjdGl2ZV9uciAtPSBwb3M7CisJZmlyc3QgPSAwOworCWxhc3QgPSBhY3RpdmVfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbbmV4dF07CisJCWlmICghc3RybmNtcChjZS0+bmFtZSwgcHJlZml4LCBwcmVmaXhfbGVuKSkgeworCQkJZmlyc3QgPSBuZXh0KzE7CisJCQljb250aW51ZTsKKwkJfQorCQlsYXN0ID0gbmV4dDsKKwl9CisJYWN0aXZlX25yID0gbGFzdDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcmlmeV9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY29uc3QgY2hhciAqKnAsICpuLCAqcHJldjsKKwljaGFyICpyZWFsX3ByZWZpeDsKKwl1bnNpZ25lZCBsb25nIG1heDsKKworCXByZXYgPSBOVUxMOworCW1heCA9IFBBVEhfTUFYOworCWZvciAocCA9IHBhdGhzcGVjOyAobiA9ICpwKSAhPSBOVUxMOyBwKyspIHsKKwkJaW50IGksIGxlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhciBjID0gbltpXTsKKwkJCWlmIChwcmV2ICYmIHByZXZbaV0gIT0gYykKKwkJCQlicmVhazsKKwkJCWlmICghYyB8fCBjID09ICcqJyB8fCBjID09ICc/JykKKwkJCQlicmVhazsKKwkJCWlmIChjID09ICcvJykKKwkJCQlsZW4gPSBpKzE7CisJCX0KKwkJcHJldiA9IG47CisJCWlmIChsZW4gPCBtYXgpIHsKKwkJCW1heCA9IGxlbjsKKwkJCWlmICghbWF4KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHByZWZpeF9vZmZzZXQgPiBtYXggfHwgbWVtY21wKHByZXYsIHByZWZpeCwgcHJlZml4X29mZnNldCkpCisJCWRpZSgiZ2l0LWxzLWZpbGVzOiBjYW5ub3QgZ2VuZXJhdGUgcmVsYXRpdmUgZmlsZW5hbWVzIGNvbnRhaW5pbmcgJy4uJyIpOworCisJcmVhbF9wcmVmaXggPSBOVUxMOworCXByZWZpeF9sZW4gPSBtYXg7CisJaWYgKG1heCkgeworCQlyZWFsX3ByZWZpeCA9IHhtYWxsb2MobWF4ICsgMSk7CisJCW1lbWNweShyZWFsX3ByZWZpeCwgcHJldiwgbWF4KTsKKwkJcmVhbF9wcmVmaXhbbWF4XSA9IDA7CisJfQorCXJldHVybiByZWFsX3ByZWZpeDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbHNfZmlsZXNfdXNhZ2VbXSA9CisJImdpdC1scy1maWxlcyBbLXpdIFstdF0gWy12XSAoLS1bY2FjaGVkfGRlbGV0ZWR8b3RoZXJzfHN0YWdlfHVubWVyZ2VkfGtpbGxlZHxtb2RpZmllZF0pKiAiCisJIlsgLS1pZ25vcmVkIF0gWy0tZXhjbHVkZT08cGF0dGVybj5dIFstLWV4Y2x1ZGUtZnJvbT08ZmlsZT5dICIKKwkiWyAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08ZmlsZW5hbWU+IF0gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXZdICIKKwkiWy0tXSBbPGZpbGU+XSoiOworCitpbnQgY21kX2xzX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCWludCBleGNfZ2l2ZW4gPSAwLCByZXF1aXJlX3dvcmtfdHJlZSA9IDA7CisJc3RydWN0IGRpcl9zdHJ1Y3QgZGlyOworCisJbWVtc2V0KCZkaXIsIDAsIHNpemVvZihkaXIpKTsKKwlpZiAocHJlZml4KQorCQlwcmVmaXhfb2Zmc2V0ID0gc3RybGVuKHByZWZpeCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi16IikpIHsKKwkJCWxpbmVfdGVybWluYXRvciA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItdCIpIHx8ICFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdGFnX2NhY2hlZCA9ICJIICI7CisJCQl0YWdfdW5tZXJnZWQgPSAiTSAiOworCQkJdGFnX3JlbW92ZWQgPSAiUiAiOworCQkJdGFnX21vZGlmaWVkID0gIkMgIjsKKwkJCXRhZ19vdGhlciA9ICI/ICI7CisJCQl0YWdfa2lsbGVkID0gIksgIjsKKwkJCWlmIChhcmdbMV0gPT0gJ3YnKQorCQkJCXNob3dfdmFsaWRfYml0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1jIikgfHwgIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKSB7CisJCQlzaG93X2NhY2hlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItZCIpIHx8ICFzdHJjbXAoYXJnLCAiLS1kZWxldGVkIikpIHsKKwkJCXNob3dfZGVsZXRlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1tb2RpZmllZCIpKSB7CisJCQlzaG93X21vZGlmaWVkID0gMTsKKwkJCXJlcXVpcmVfd29ya190cmVlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1vIikgfHwgIXN0cmNtcChhcmcsICItLW90aGVycyIpKSB7CisJCQlzaG93X290aGVycyA9IDE7CisJCQlyZXF1aXJlX3dvcmtfdHJlZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItaSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1pZ25vcmVkIikpIHsKKwkJCWRpci5zaG93X2lnbm9yZWQgPSAxOworCQkJcmVxdWlyZV93b3JrX3RyZWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXMiKSB8fCAhc3RyY21wKGFyZywgIi0tc3RhZ2UiKSkgeworCQkJc2hvd19zdGFnZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItayIpIHx8ICFzdHJjbXAoYXJnLCAiLS1raWxsZWQiKSkgeworCQkJc2hvd19raWxsZWQgPSAxOworCQkJcmVxdWlyZV93b3JrX3RyZWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kaXJlY3RvcnkiKSkgeworCQkJZGlyLnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1lbXB0eS1kaXJlY3RvcnkiKSkgeworCQkJZGlyLmhpZGVfZW1wdHlfZGlyZWN0b3JpZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXUiKSB8fCAhc3RyY21wKGFyZywgIi0tdW5tZXJnZWQiKSkgeworCQkJLyogVGhlcmUncyBubyBwb2ludCBpbiBzaG93aW5nIHVubWVyZ2VkIHVubGVzcworCQkJICogeW91IGFsc28gc2hvdyB0aGUgc3RhZ2UgaW5mb3JtYXRpb24uCisJCQkgKi8KKwkJCXNob3dfc3RhZ2UgPSAxOworCQkJc2hvd191bm1lcmdlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteCIpICYmIGkrMSA8IGFyZ2MpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlhZGRfZXhjbHVkZShhcmd2WysraV0sICIiLCAwLCAmZGlyLmV4Y2x1ZGVfbGlzdFtFWENfQ01ETF0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlPSIpKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGUoYXJnKzEwLCAiIiwgMCwgJmRpci5leGNsdWRlX2xpc3RbRVhDX0NNRExdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1YIikgJiYgaSsxIDwgYXJnYykgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlc19mcm9tX2ZpbGUoJmRpciwgYXJndlsrK2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhjbHVkZS1mcm9tPSIpKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZSgmZGlyLCBhcmcrMTUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IikpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlkaXIuZXhjbHVkZV9wZXJfZGlyID0gYXJnICsgMjQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwtbmFtZSIpKSB7CisJCQlwcmVmaXhfb2Zmc2V0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZXJyb3ItdW5tYXRjaCIpKSB7CisJCQllcnJvcl91bm1hdGNoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2PSIpKSB7CisJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZys5LCBOVUxMLCAxMCk7CisJCQlpZiAoYWJicmV2ICYmIGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCWFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJZWxzZSBpZiAoYWJicmV2ID4gNDApCisJCQkJYWJicmV2ID0gNDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWFiYnJldiIpKSB7CisJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKGxzX2ZpbGVzX3VzYWdlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlcXVpcmVfd29ya190cmVlICYmCisJCQkoaXNfYmFyZV9yZXBvc2l0b3J5KCkgfHwgaXNfaW5zaWRlX2dpdF9kaXIoKSkpCisJCWRpZSgiVGhpcyBvcGVyYXRpb24gbXVzdCBiZSBydW4gaW4gYSB3b3JrIHRyZWUiKTsKKworCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIGkpOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIHBhdGhzcGVjIG1hdGNoZXMgdGhlIHByZWZpeCAqLworCWlmIChwYXRoc3BlYykKKwkJcHJlZml4ID0gdmVyaWZ5X3BhdGhzcGVjKHByZWZpeCk7CisKKwkvKiBUcmVhdCB1bm1hdGNoaW5nIHBhdGhzcGVjIGVsZW1lbnRzIGFzIGVycm9ycyAqLworCWlmIChwYXRoc3BlYyAmJiBlcnJvcl91bm1hdGNoKSB7CisJCWludCBudW07CisJCWZvciAobnVtID0gMDsgcGF0aHNwZWNbbnVtXTsgbnVtKyspCisJCQk7CisJCXBzX21hdGNoZWQgPSB4Y2FsbG9jKDEsIG51bSk7CisJfQorCisJaWYgKGRpci5zaG93X2lnbm9yZWQgJiYgIWV4Y19naXZlbikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAtLWlnbm9yZWQgbmVlZHMgc29tZSBleGNsdWRlIHBhdHRlcm5cbiIsCisJCQlhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBXaXRoIG5vIGZsYWdzLCB3ZSBkZWZhdWx0IHRvIHNob3dpbmcgdGhlIGNhY2hlZCBmaWxlcyAqLworCWlmICghKHNob3dfc3RhZ2UgfCBzaG93X2RlbGV0ZWQgfCBzaG93X290aGVycyB8IHNob3dfdW5tZXJnZWQgfAorCSAgICAgIHNob3dfa2lsbGVkIHwgc2hvd19tb2RpZmllZCkpCisJCXNob3dfY2FjaGVkID0gMTsKKworCXJlYWRfY2FjaGUoKTsKKwlpZiAocHJlZml4KQorCQlwcnVuZV9jYWNoZShwcmVmaXgpOworCXNob3dfZmlsZXMoJmRpciwgcHJlZml4KTsKKworCWlmIChwc19tYXRjaGVkKSB7CisJCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBwYXRoc3BlYyBtYXRjaGVkIG90aGVyd2lzZQorCQkgKiBpdCBpcyBhbiBlcnJvci4KKwkJICovCisJCWludCBudW0sIGVycm9ycyA9IDA7CisJCWZvciAobnVtID0gMDsgcGF0aHNwZWNbbnVtXTsgbnVtKyspIHsKKwkJCWlmIChwc19tYXRjaGVkW251bV0pCisJCQkJY29udGludWU7CisJCQllcnJvcigicGF0aHNwZWMgJyVzJyBkaWQgbm90IG1hdGNoIGFueSBmaWxlKHMpIGtub3duIHRvIGdpdC4iLAorCQkJICAgICAgcGF0aHNwZWNbbnVtXSArIHByZWZpeF9vZmZzZXQpOworCQkJZXJyb3JzKys7CisJCX0KKworCQlpZiAoZXJyb3JzKQorCQkJZnByaW50ZihzdGRlcnIsICJEaWQgeW91IGZvcmdldCB0byAnZ2l0IGFkZCc/XG4iKTsKKworCQlyZXR1cm4gZXJyb3JzID8gMSA6IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWxzLXRyZWUuYyBiL2J1aWx0aW4tbHMtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYjRkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLXRyZWUuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKyNkZWZpbmUgTFNfU0hPV19UUkVFUyA0CisjZGVmaW5lIExTX05BTUVfT05MWSA4CitzdGF0aWMgaW50IGFiYnJldjsKK3N0YXRpYyBpbnQgbHNfb3B0aW9uczsKK3N0YXRpYyBjb25zdCBjaGFyICoqcGF0aHNwZWM7CitzdGF0aWMgaW50IGNob21wX3ByZWZpeDsKK3N0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3ByZWZpeDsKKworc3RhdGljIGNvbnN0IGNoYXIgbHNfdHJlZV91c2FnZVtdID0KKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstdF0gWy16XSBbLS1uYW1lLW9ubHldIFstLW5hbWUtc3RhdHVzXSBbLS1mdWxsLW5hbWVdIFstLWFiYnJldls9PG4+XV0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworCitzdGF0aWMgaW50IHNob3dfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwljb25zdCBjaGFyICoqczsKKworCWlmIChsc19vcHRpb25zICYgTFNfUkVDVVJTSVZFKQorCQlyZXR1cm4gMTsKKworCXMgPSBwYXRoc3BlYzsKKwlpZiAoIXMpCisJCXJldHVybiAwOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICpzcGVjID0gKnMrKzsKKwkJaW50IGxlbiwgc3BlY2xlbjsKKworCQlpZiAoIXNwZWMpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHN0cm5jbXAoYmFzZSwgc3BlYywgYmFzZWxlbikpCisJCQljb250aW51ZTsKKwkJbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwkJc3BlYyArPSBiYXNlbGVuOworCQlzcGVjbGVuID0gc3RybGVuKHNwZWMpOworCQlpZiAoc3BlY2xlbiA8PSBsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChwYXRobmFtZSwgc3BlYywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hvd190cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJY29uc3QgY2hhciAqdHlwZSA9IGJsb2JfdHlwZTsKKworCWlmIChTX0lTRElSTE5LKG1vZGUpKSB7CisJCS8qCisJCSAqIE1heWJlIHdlIHdhbnQgdG8gaGF2ZSBzb21lIHJlY3Vyc2l2ZSB2ZXJzaW9uIGhlcmU/CisJCSAqCisJCSAqIFNvbWV0aGluZyBsaWtlOgorCQkgKgorCQlpZiAoc2hvd19zdWJwcm9qZWN0cyhiYXNlLCBiYXNlbGVuLCBwYXRobmFtZSkpIHsKKwkJCWlmIChmb3JrKCkpIHsKKwkJCQljaGRpcihiYXNlKTsKKwkJCQlleGVjIGxzLXRyZWU7CisJCQl9CisJCQl3YWl0cGlkKCk7CisJCX0KKwkJICoKKwkJICogLi5vciBzaW1pbGFyLi4KKwkJICovCisJCXR5cGUgPSBjb21taXRfdHlwZTsKKwl9IGVsc2UgaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJaWYgKHNob3dfcmVjdXJzaXZlKGJhc2UsIGJhc2VsZW4sIHBhdGhuYW1lKSkgeworCQkJcmV0dmFsID0gUkVBRF9UUkVFX1JFQ1VSU0lWRTsKKwkJCWlmICghKGxzX29wdGlvbnMgJiBMU19TSE9XX1RSRUVTKSkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXR5cGUgPSB0cmVlX3R5cGU7CisJfQorCWVsc2UgaWYgKGxzX29wdGlvbnMgJiBMU19UUkVFX09OTFkpCisJCXJldHVybiAwOworCisJaWYgKGNob21wX3ByZWZpeCAmJgorCSAgICAoYmFzZWxlbiA8IGNob21wX3ByZWZpeCB8fCBtZW1jbXAobHNfdHJlZV9wcmVmaXgsIGJhc2UsIGNob21wX3ByZWZpeCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghKGxzX29wdGlvbnMgJiBMU19OQU1FX09OTFkpKQorCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsIHR5cGUsCisJCQkJYWJicmV2ID8gZmluZF91bmlxdWVfYWJicmV2KHNoYTEsYWJicmV2KQorCQkJCQk6IHNoYTFfdG9faGV4KHNoYTEpKTsKKwl3cml0ZV9uYW1lX3F1b3RlZChiYXNlICsgY2hvbXBfcHJlZml4LCBiYXNlbGVuIC0gY2hvbXBfcHJlZml4LAorCQkJICBwYXRobmFtZSwKKwkJCSAgbGluZV90ZXJtaW5hdGlvbiwgc3Rkb3V0KTsKKwlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBjbWRfbHNfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCB0cmVlICp0cmVlOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWxzX3RyZWVfcHJlZml4ID0gcHJlZml4OworCWlmIChwcmVmaXggJiYgKnByZWZpeCkKKwkJY2hvbXBfcHJlZml4ID0gc3RybGVuKHByZWZpeCk7CisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworCQljYXNlICd6JzoKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19UUkVFUzsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCWlmICghc3RyY21wKGFyZ3ZbMV0rMiwgIm5hbWUtb25seSIpIHx8CisJCQkgICAgIXN0cmNtcChhcmd2WzFdKzIsICJuYW1lLXN0YXR1cyIpKSB7CisJCQkJbHNfb3B0aW9ucyB8PSBMU19OQU1FX09OTFk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmd2WzFdKzIsICJmdWxsLW5hbWUiKSkgeworCQkJCWNob21wX3ByZWZpeCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmd2WzFdKzIsICJhYmJyZXY9IikpIHsKKwkJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZ3ZbMV0rOSwgTlVMTCwgMTApOworCQkJCWlmIChhYmJyZXYgJiYgYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCWFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJCWVsc2UgaWYgKGFiYnJldiA+IDQwKQorCQkJCQlhYmJyZXYgPSA0MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZ3ZbMV0rMiwgImFiYnJldiIpKSB7CisJCQkJYWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBvdGhlcndpc2UgZmFsbHRocnUgKi8KKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwkvKiAtZCAtciBzaG91bGQgaW1wbHkgLXQsIGJ1dCAtZCBieSBpdHNlbGYgc2hvdWxkIG5vdCBoYXZlIHRvLiAqLworCWlmICggKExTX1RSRUVfT05MWXxMU19SRUNVUlNJVkUpID09CisJICAgICgoTFNfVFJFRV9PTkxZfExTX1JFQ1VSU0lWRSkgJiBsc19vcHRpb25zKSkKKwkJbHNfb3B0aW9ucyB8PSBMU19TSE9XX1RSRUVTOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIDIpOworCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHNoYTEpOworCWlmICghdHJlZSkKKwkJZGllKCJub3QgYSB0cmVlIG9iamVjdCIpOworCXJlYWRfdHJlZV9yZWN1cnNpdmUodHJlZSwgIiIsIDAsIDAsIHBhdGhzcGVjLCBzaG93X3RyZWUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW1haWxpbmZvLmMgYi9idWlsdGluLW1haWxpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZTQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbWFpbGluZm8uYwpAQCAtMCwwICsxLDkyMCBAQAorLyoKKyAqIEFub3RoZXIgc3R1cGlkIHByb2dyYW0sIHRoaXMgb25lIHBhcnNpbmcgdGhlIGhlYWRlcnMgb2YgYW4KKyAqIGVtYWlsIHRvIGZpZ3VyZSBvdXQgYXV0aG9yc2hpcCBhbmQgc3ViamVjdAorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAidXRmOC5oIgorCitzdGF0aWMgRklMRSAqY21pdG1zZywgKnBhdGNoZmlsZSwgKmZpbiwgKmZvdXQ7CisKK3N0YXRpYyBpbnQga2VlcF9zdWJqZWN0Oworc3RhdGljIGNvbnN0IGNoYXIgKm1ldGFpbmZvX2NoYXJzZXQ7CitzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworc3RhdGljIGNoYXIgbmFtZVsxMDAwXTsKK3N0YXRpYyBjaGFyIGVtYWlsWzEwMDBdOworCitzdGF0aWMgZW51bSAgeworCVRFX0RPTlRDQVJFLCBURV9RUCwgVEVfQkFTRTY0LAorfSB0cmFuc2Zlcl9lbmNvZGluZzsKK3N0YXRpYyBlbnVtICB7CisJVFlQRV9URVhULCBUWVBFX09USEVSLAorfSBtZXNzYWdlX3R5cGU7CisKK3N0YXRpYyBjaGFyIGNoYXJzZXRbMjU2XTsKK3N0YXRpYyBpbnQgcGF0Y2hfbGluZXM7CitzdGF0aWMgY2hhciAqKnBfaGRyX2RhdGEsICoqc19oZHJfZGF0YTsKKworI2RlZmluZSBNQVhfSERSX1BBUlNFRCAxMAorI2RlZmluZSBNQVhfQk9VTkRBUklFUyA1CisKK3N0YXRpYyBjaGFyICpzYW5pdHlfY2hlY2soY2hhciAqbmFtZSwgY2hhciAqZW1haWwpCit7CisJaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobGVuIDwgMyB8fCBsZW4gPiA2MCkKKwkJcmV0dXJuIGVtYWlsOworCWlmIChzdHJjaHIobmFtZSwgJ0AnKSB8fCBzdHJjaHIobmFtZSwgJzwnKSB8fCBzdHJjaHIobmFtZSwgJz4nKSkKKwkJcmV0dXJuIGVtYWlsOworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgaW50IGJvZ3VzX2Zyb20oY2hhciAqbGluZSkKK3sKKwkvKiBKb2huIERvZSA8am9obmRvZT4gKi8KKwljaGFyICpicmEsICprZXQsICpkc3QsICpjcDsKKworCS8qIFRoaXMgaXMgZmFsbGJhY2ssIHNvIGRvIG5vdCBib3RoZXIgaWYgd2UgYWxyZWFkeSBoYXZlIGFuCisJICogZS1tYWlsIGFkZHJlc3MuCisJICovCisJaWYgKCplbWFpbCkKKwkJcmV0dXJuIDA7CisKKwlicmEgPSBzdHJjaHIobGluZSwgJzwnKTsKKwlpZiAoIWJyYSkKKwkJcmV0dXJuIDA7CisJa2V0ID0gc3RyY2hyKGJyYSwgJz4nKTsKKwlpZiAoIWtldCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGRzdCA9IGVtYWlsLCBjcCA9IGJyYSsxOyBjcCA8IGtldDsgKQorCQkqZHN0KysgPSAqY3ArKzsKKwkqZHN0ID0gMDsKKwlmb3IgKGNwID0gbGluZTsgaXNzcGFjZSgqY3ApOyBjcCsrKQorCQk7CisJZm9yIChicmEtLTsgaXNzcGFjZSgqYnJhKTsgYnJhLS0pCisJCSpicmEgPSAwOworCWNwID0gc2FuaXR5X2NoZWNrKGNwLCBlbWFpbCk7CisJc3RyY3B5KG5hbWUsIGNwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfZnJvbShjaGFyICppbl9saW5lKQoreworCWNoYXIgbGluZVsxMDAwXTsKKwljaGFyICphdDsKKwljaGFyICpkc3Q7CisKKwlzdHJjcHkobGluZSwgaW5fbGluZSk7CisJYXQgPSBzdHJjaHIobGluZSwgJ0AnKTsKKwlpZiAoIWF0KQorCQlyZXR1cm4gYm9ndXNfZnJvbShsaW5lKTsKKworCS8qCisJICogSWYgd2UgYWxyZWFkeSBoYXZlIG9uZSBlbWFpbCwgZG9uJ3QgdGFrZSBhbnkgY29uZnVzaW5nIGxpbmVzCisJICovCisJaWYgKCplbWFpbCAmJiBzdHJjaHIoYXQrMSwgJ0AnKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBQaWNrIHVwIHRoZSBzdHJpbmcgYXJvdW5kICdAJywgcG9zc2libHkgZGVsaW1pdGVkIHdpdGggPD4KKwkgKiBwYWlyOyB0aGF0IGlzIHRoZSBlbWFpbCBwYXJ0LiAgV2hpdGUgdGhlbSBvdXQgd2hpbGUgY29weWluZy4KKwkgKi8KKwl3aGlsZSAoYXQgPiBsaW5lKSB7CisJCWNoYXIgYyA9IGF0Wy0xXTsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gJzwnKSB7CisJCQlhdFstMV0gPSAnICc7CisJCQlicmVhazsKKwkJfQorCQlhdC0tOworCX0KKwlkc3QgPSBlbWFpbDsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICphdDsKKwkJaWYgKCFjIHx8IGMgPT0gJz4nIHx8IGlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICc+JykKKwkJCQkqYXQgPSAnICc7CisJCQlicmVhazsKKwkJfQorCQkqYXQrKyA9ICcgJzsKKwkJKmRzdCsrID0gYzsKKwl9CisJKmRzdCsrID0gMDsKKworCS8qIFRoZSByZW1haW5kZXIgaXMgbmFtZS4gIEl0IGNvdWxkIGJlICJKb2huIERvZSA8am9obi5kb2VAeHo+IgorCSAqIG9yICJqb2huLmRvZUB4eiAoSm9obiBEb2UpIiwgYnV0IHdlIGhhdmUgd2hpdGVkIG91dCB0aGUKKwkgKiBlbWFpbCBwYXJ0LCBzbyB0cmltIGZyb20gYm90aCBlbmRzLCBwb3NzaWJseSByZW1vdmluZworCSAqIHRoZSAoKSBwYWlyIGF0IHRoZSBlbmQuCisJICovCisJYXQgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCXdoaWxlIChhdCA+IGxpbmUpIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKi0tYXQ7CisJCWlmICghaXNzcGFjZShjKSkgeworCQkJYXRbKGMgPT0gJyknKSA/IDAgOiAxXSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWF0ID0gbGluZTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICphdDsKKwkJaWYgKCFjIHx8ICFpc3NwYWNlKGMpKSB7CisJCQlpZiAoYyA9PSAnKCcpCisJCQkJYXQrKzsKKwkJCWJyZWFrOworCQl9CisJCWF0Kys7CisJfQorCWF0ID0gc2FuaXR5X2NoZWNrKGF0LCBlbWFpbCk7CisJc3RyY3B5KG5hbWUsIGF0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfaGVhZGVyKGNoYXIgKmxpbmUsIGNoYXIgKmRhdGEsIGludCBvZnMpCit7CisJaWYgKCFsaW5lIHx8ICFkYXRhKQorCQlyZXR1cm4gMTsKKworCXN0cmNweShkYXRhLCBsaW5lK29mcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTk9URSBOT1RFIE5PVEUuICBXZSBkbyBub3QgY2xhaW0gd2UgZG8gZnVsbCBNSU1FLiAgV2UganVzdCBhdHRlbXB0CisgKiB0byBoYXZlIGVub3VnaCBoZXVyaXN0aWNzIHRvIGdyb2sgTUlNRSBlbmNvZGVkIHBhdGNoZXMgb2Z0ZW4gZm91bmQKKyAqIG9uIG91ciBtYWlsaW5nIGxpc3RzLiAgRm9yIGV4YW1wbGUsIHdlIGRvIG5vdCBldmVuIHRyZWF0IGhlYWRlciBsaW5lcworICogY2FzZSBpbnNlbnNpdGl2ZWx5LgorICovCisKK3N0YXRpYyBpbnQgc2x1cnBfYXR0cihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICphdHRyKQoreworCWNvbnN0IGNoYXIgKmVuZHMsICphcCA9IHN0cmNhc2VzdHIobGluZSwgbmFtZSk7CisJc2l6ZV90IHN6OworCisJaWYgKCFhcCkgeworCQkqYXR0ciA9IDA7CisJCXJldHVybiAwOworCX0KKwlhcCArPSBzdHJsZW4obmFtZSk7CisJaWYgKCphcCA9PSAnIicpIHsKKwkJYXArKzsKKwkJZW5kcyA9ICJcIiI7CisJfQorCWVsc2UKKwkJZW5kcyA9ICI7IFx0IjsKKwlzeiA9IHN0cmNzcG4oYXAsIGVuZHMpOworCW1lbWNweShhdHRyLCBhcCwgc3opOworCWF0dHJbc3pdID0gMDsKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGNvbnRlbnRfdHlwZSB7CisJY2hhciAqYm91bmRhcnk7CisJaW50IGJvdW5kYXJ5X2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29udGVudF90eXBlIGNvbnRlbnRbTUFYX0JPVU5EQVJJRVNdOworCitzdGF0aWMgc3RydWN0IGNvbnRlbnRfdHlwZSAqY29udGVudF90b3AgPSBjb250ZW50OworCitzdGF0aWMgaW50IGhhbmRsZV9jb250ZW50X3R5cGUoY2hhciAqbGluZSkKK3sKKwljaGFyIGJvdW5kYXJ5WzI1Nl07CisKKwlpZiAoc3RyY2FzZXN0cihsaW5lLCAidGV4dC8iKSA9PSBOVUxMKQorCQkgbWVzc2FnZV90eXBlID0gVFlQRV9PVEhFUjsKKwlpZiAoc2x1cnBfYXR0cihsaW5lLCAiYm91bmRhcnk9IiwgYm91bmRhcnkgKyAyKSkgeworCQltZW1jcHkoYm91bmRhcnksICItLSIsIDIpOworCQlpZiAoY29udGVudF90b3ArKyA+PSAmY29udGVudFtNQVhfQk9VTkRBUklFU10pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgYm91bmRhcmllcyB0byBoYW5kbGVcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQljb250ZW50X3RvcC0+Ym91bmRhcnlfbGVuID0gc3RybGVuKGJvdW5kYXJ5KTsKKwkJY29udGVudF90b3AtPmJvdW5kYXJ5ID0geG1hbGxvYyhjb250ZW50X3RvcC0+Ym91bmRhcnlfbGVuKzEpOworCQlzdHJjcHkoY29udGVudF90b3AtPmJvdW5kYXJ5LCBib3VuZGFyeSk7CisJfQorCWlmIChzbHVycF9hdHRyKGxpbmUsICJjaGFyc2V0PSIsIGNoYXJzZXQpKSB7CisJCWludCBpLCBjOworCQlmb3IgKGkgPSAwOyAoYyA9IGNoYXJzZXRbaV0pICE9IDA7IGkrKykKKwkJCWNoYXJzZXRbaV0gPSB0b2xvd2VyKGMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfY29udGVudF90cmFuc2Zlcl9lbmNvZGluZyhjaGFyICpsaW5lKQoreworCWlmIChzdHJjYXNlc3RyKGxpbmUsICJiYXNlNjQiKSkKKwkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9CQVNFNjQ7CisJZWxzZSBpZiAoc3RyY2FzZXN0cihsaW5lLCAicXVvdGVkLXByaW50YWJsZSIpKQorCQl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX1FQOworCWVsc2UKKwkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9ET05UQ0FSRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19tdWx0aXBhcnRfYm91bmRhcnkoY29uc3QgY2hhciAqbGluZSkKK3sKKwlyZXR1cm4gKCFtZW1jbXAobGluZSwgY29udGVudF90b3AtPmJvdW5kYXJ5LCBjb250ZW50X3RvcC0+Ym91bmRhcnlfbGVuKSk7Cit9CisKK3N0YXRpYyBpbnQgZWF0c3BhY2UoY2hhciAqbGluZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCXdoaWxlIChsZW4gPiAwICYmIGlzc3BhY2UobGluZVtsZW4tMV0pKQorCQlsaW5lWy0tbGVuXSA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGNoYXIgKmNsZWFudXBfc3ViamVjdChjaGFyICpzdWJqZWN0KQoreworCWlmIChrZWVwX3N1YmplY3QpCisJCXJldHVybiBzdWJqZWN0OworCWZvciAoOzspIHsKKwkJY2hhciAqcDsKKwkJaW50IGxlbiwgcmVtb3ZlOworCQlzd2l0Y2ggKCpzdWJqZWN0KSB7CisJCWNhc2UgJ3InOiBjYXNlICdSJzoKKwkJCWlmICghbWVtY21wKCJlOiIsIHN1YmplY3QrMSwgMikpIHsKKwkJCQlzdWJqZWN0ICs9IDM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnICc6IGNhc2UgJ1x0JzogY2FzZSAnOic6CisJCQlzdWJqZWN0Kys7CisJCQljb250aW51ZTsKKworCQljYXNlICdbJzoKKwkJCXAgPSBzdHJjaHIoc3ViamVjdCwgJ10nKTsKKwkJCWlmICghcCkgeworCQkJCXN1YmplY3QrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxlbiA9IHN0cmxlbihwKTsKKwkJCXJlbW92ZSA9IHAgLSBzdWJqZWN0OworCQkJaWYgKHJlbW92ZSA8PSBsZW4gKjIpIHsKKwkJCQlzdWJqZWN0ID0gcCsxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJZWF0c3BhY2Uoc3ViamVjdCk7CisJCXJldHVybiBzdWJqZWN0OworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9zcGFjZShjaGFyICpidWYpCit7CisJdW5zaWduZWQgY2hhciBjOworCXdoaWxlICgoYyA9ICpidWYpICE9IDApIHsKKwkJYnVmKys7CisJCWlmIChpc3NwYWNlKGMpKSB7CisJCQlidWZbLTFdID0gJyAnOworCQkJYyA9ICpidWY7CisJCQl3aGlsZSAoaXNzcGFjZShjKSkgeworCQkJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJCQltZW1tb3ZlKGJ1ZiwgYnVmKzEsIGxlbik7CisJCQkJYyA9ICpidWY7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9oZWFkZXIoY2hhciAqaXQpOworc3RhdGljIGNoYXIgKmhlYWRlcltNQVhfSERSX1BBUlNFRF0gPSB7CisJIkZyb20iLCJTdWJqZWN0IiwiRGF0ZSIsCit9OworCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcihjaGFyICpsaW5lLCBjaGFyICoqaGRyX2RhdGEsIGludCBvdmVyd3JpdGUpCit7CisJaW50IGk7CisKKwkvKiBzZWFyY2ggZm9yIHRoZSBpbnRlcmVzdGluZyBwYXJ0cyAqLworCWZvciAoaSA9IDA7IGhlYWRlcltpXTsgaSsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4oaGVhZGVyW2ldKTsKKwkJaWYgKCghaGRyX2RhdGFbaV0gfHwgb3ZlcndyaXRlKSAmJgorCQkgICAgIXN0cm5jYXNlY21wKGxpbmUsIGhlYWRlcltpXSwgbGVuKSAmJgorCQkgICAgbGluZVtsZW5dID09ICc6JyAmJiBpc3NwYWNlKGxpbmVbbGVuICsgMV0pKSB7CisJCQkvKiBVbndyYXAgaW5saW5lIEIgYW5kIFEgZW5jb2RpbmcsIGFuZCBvcHRpb25hbGx5CisJCQkgKiBub3JtYWxpemUgdGhlIG1ldGEgaW5mb3JtYXRpb24gdG8gdXRmOC4KKwkJCSAqLworCQkJZGVjb2RlX2hlYWRlcihsaW5lICsgbGVuICsgMik7CisJCQloZHJfZGF0YVtpXSA9IHhtYWxsb2MoMTAwMCAqIHNpemVvZihjaGFyKSk7CisJCQlpZiAoISBoYW5kbGVfaGVhZGVyKGxpbmUsIGhkcl9kYXRhW2ldLCBsZW4gKyAyKSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJLyogQ29udGVudCBzdHVmZiAqLworCWlmICghc3RybmNhc2VjbXAobGluZSwgIkNvbnRlbnQtVHlwZSIsIDEyKSAmJgorCQlsaW5lWzEyXSA9PSAnOicgJiYgaXNzcGFjZShsaW5lWzEyICsgMV0pKSB7CisJCWRlY29kZV9oZWFkZXIobGluZSArIDEyICsgMik7CisJCWlmICghIGhhbmRsZV9jb250ZW50X3R5cGUobGluZSkpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWlmICghc3RybmNhc2VjbXAobGluZSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciLCAyNSkgJiYKKwkJbGluZVsyNV0gPT0gJzonICYmIGlzc3BhY2UobGluZVsyNSArIDFdKSkgeworCQlkZWNvZGVfaGVhZGVyKGxpbmUgKyAyNSArIDIpOworCQlpZiAoISBoYW5kbGVfY29udGVudF90cmFuc2Zlcl9lbmNvZGluZyhsaW5lKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBmb3IgaW5ib2R5IHN0dWZmICovCisJaWYgKCFtZW1jbXAoIj5Gcm9tIiwgbGluZSwgNSkgJiYgaXNzcGFjZShsaW5lWzVdKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFtZW1jbXAoIltQQVRDSF0iLCBsaW5lLCA3KSAmJiBpc3NwYWNlKGxpbmVbN10pKSB7CisJCWZvciAoaSA9IDA7IGhlYWRlcltpXTsgaSsrKSB7CisJCQlpZiAoIW1lbWNtcCgiU3ViamVjdDogIiwgaGVhZGVyW2ldLCA5KSkgeworCQkJCWlmICghIGhhbmRsZV9oZWFkZXIobGluZSwgaGRyX2RhdGFbaV0sIDApKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIG5vIG1hdGNoICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmZjMjgyMl9oZWFkZXIoY2hhciAqbGluZSkKK3sKKwkvKgorCSAqIFRoZSBzZWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbG9vc2VzdCBwb3NzaWJsZQorCSAqIGZpZWxkIG5hbWUgaXMgIjMuNi44IE9wdGlvbmFsIGZpZWxkcyIuCisJICoKKwkgKiBvcHRpb25hbC1maWVsZCA9IGZpZWxkLW5hbWUgIjoiIHVuc3RydWN0dXJlZCBDUkxGCisJICogZmllbGQtbmFtZSA9IDEqZnRleHQKKwkgKiBmdGV4dCA9ICVkMzMtNTcgLyAlNTktMTI2CisJICovCisJaW50IGNoOworCWNoYXIgKmNwID0gbGluZTsKKworCS8qIENvdW50IG1ib3ggRnJvbSBoZWFkZXJzIGFzIGhlYWRlcnMgKi8KKwlpZiAoIW1lbWNtcChsaW5lLCAiRnJvbSAiLCA1KSB8fCAhbWVtY21wKGxpbmUsICI+RnJvbSAiLCA2KSkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKGNoID0gKmNwKyspKSB7CisJCWlmIChjaCA9PSAnOicpCisJCQlyZXR1cm4gY3AgIT0gbGluZTsKKwkJaWYgKCgzMyA8PSBjaCAmJiBjaCA8PSA1NykgfHwKKwkJICAgICg1OSA8PSBjaCAmJiBjaCA8PSAxMjYpKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN6IGlzIHNpemUgb2YgJ2xpbmUnIGJ1ZmZlciBpbiBieXRlcy4gIE11c3QgYmUgcmVhc29uYWJseQorICogbG9uZyBlbm91Z2ggdG8gaG9sZCBvbmUgcGh5c2ljYWwgcmVhbC13b3JsZCBlLW1haWwgbGluZS4KKyAqLworc3RhdGljIGludCByZWFkX29uZV9oZWFkZXJfbGluZShjaGFyICpsaW5lLCBpbnQgc3osIEZJTEUgKmluKQoreworCWludCBsZW47CisKKwkvKgorCSAqIFdlIHdpbGwgcmVhZCBhdCBtb3N0IChzei0xKSBieXRlcyBhbmQgdGhlbiBwb3RlbnRpYWxseQorCSAqIHJlLWFkZCBOVUwgYWZ0ZXIgaXQuICBBY2Nlc3NpbmcgbGluZVtzel0gYWZ0ZXIgdGhpcyBpcyBzYWZlCisJICogYW5kIHdlIGNhbiBhbGxvdyBsZW4gdG8gZ3JvdyB1cCB0byBhbmQgaW5jbHVkaW5nIHN6LgorCSAqLworCXN6LS07CisKKwkvKiBHZXQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGxpbmUuICovCisJaWYgKCFmZ2V0cyhsaW5lLCBzeiwgaW4pKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSXMgaXQgYW4gZW1wdHkgbGluZSBvciBub3QgYSB2YWxpZCByZmMyODIyIGhlYWRlcj8KKwkgKiBJZiBzbywgc3RvcCBoZXJlLCBhbmQgcmV0dXJuIGZhbHNlICgibm90IGEgaGVhZGVyIikKKwkgKi8KKwlsZW4gPSBlYXRzcGFjZShsaW5lKTsKKwlpZiAoIWxlbiB8fCAhaXNfcmZjMjgyMl9oZWFkZXIobGluZSkpIHsKKwkJLyogUmUtYWRkIHRoZSBuZXdsaW5lICovCisJCWxpbmVbbGVuXSA9ICdcbic7CisJCWxpbmVbbGVuICsgMV0gPSAnXDAnOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBuZWVkIHRvIGVhdCBhbGwgdGhlIGNvbnRpbnVhdGlvbiBsaW5lcy4uCisJICogWXVjaywgMjgyMiBoZWFkZXIgImZvbGRpbmciCisJICovCisJZm9yICg7OykgeworCQlpbnQgcGVlaywgYWRkbGVuOworCQlzdGF0aWMgY2hhciBjb250aW51YXRpb25bMTAwMF07CisKKwkJcGVlayA9IGZnZXRjKGluKTsgdW5nZXRjKHBlZWssIGluKTsKKwkJaWYgKHBlZWsgIT0gJyAnICYmIHBlZWsgIT0gJ1x0JykKKwkJCWJyZWFrOworCQlpZiAoIWZnZXRzKGNvbnRpbnVhdGlvbiwgc2l6ZW9mKGNvbnRpbnVhdGlvbiksIGluKSkKKwkJCWJyZWFrOworCQlhZGRsZW4gPSBlYXRzcGFjZShjb250aW51YXRpb24pOworCQlpZiAobGVuIDwgc3ogLSAxKSB7CisJCQlpZiAoYWRkbGVuID49IHN6IC0gbGVuKQorCQkJCWFkZGxlbiA9IHN6IC0gbGVuIC0gMTsKKwkJCW1lbWNweShsaW5lICsgbGVuLCBjb250aW51YXRpb24sIGFkZGxlbik7CisJCQlsZW4gKz0gYWRkbGVuOworCQl9CisJfQorCWxpbmVbbGVuXSA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZWNvZGVfcV9zZWdtZW50KGNoYXIgKmluLCBjaGFyICpvdCwgY2hhciAqZXAsIGludCByZmMyMDQ3KQoreworCWludCBjOworCXdoaWxlICgoYyA9ICppbisrKSAhPSAwICYmIChpbiA8PSBlcCkpIHsKKwkJaWYgKGMgPT0gJz0nKSB7CisJCQlpbnQgZCA9ICppbisrOworCQkJaWYgKGQgPT0gJ1xuJyB8fCAhZCkKKwkJCQlicmVhazsgLyogZHJvcCB0cmFpbGluZyBuZXdsaW5lICovCisJCQkqb3QrKyA9ICgoaGV4dmFsKGQpIDw8IDQpIHwgaGV4dmFsKCppbisrKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmZjMjA0NyAmJiBjID09ICdfJykgLyogcmZjMjA0NyA0LjIgKDIpICovCisJCQljID0gMHgyMDsKKwkJKm90KysgPSBjOworCX0KKwkqb3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9iX3NlZ21lbnQoY2hhciAqaW4sIGNoYXIgKm90LCBjaGFyICplcCkKK3sKKwkvKiBEZWNvZGUgaW4uLmVwLCBwb3NzaWJseSBpbi1wbGFjZSB0byBvdCAqLworCWludCBjLCBwb3MgPSAwLCBhY2MgPSAwOworCisJd2hpbGUgKChjID0gKmluKyspICE9IDAgJiYgKGluIDw9IGVwKSkgeworCQlpZiAoYyA9PSAnKycpCisJCQljID0gNjI7CisJCWVsc2UgaWYgKGMgPT0gJy8nKQorCQkJYyA9IDYzOworCQllbHNlIGlmICgnQScgPD0gYyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnOworCQllbHNlIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykKKwkJCWMgLT0gJ2EnIC0gMjY7CisJCWVsc2UgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCcgLSA1MjsKKwkJZWxzZSBpZiAoYyA9PSAnPScpIHsKKwkJCS8qIHBhZGRpbmcgaXMgYWxtb3N0IGxpa2UgKGMgPT0gMCksIGV4Y2VwdCB3ZSBkbworCQkJICogbm90IG91dHB1dCBOVUwgcmVzdWx0aW5nIG9ubHkgZnJvbSBpdDsKKwkJCSAqIGZvciBub3cgd2UganVzdCB0cnVzdCB0aGUgZGF0YS4KKwkJCSAqLworCQkJYyA9IDA7CisJCX0KKwkJZWxzZQorCQkJY29udGludWU7IC8qIGdhcmJhZ2UgKi8KKwkJc3dpdGNoIChwb3MrKykgeworCQljYXNlIDA6CisJCQlhY2MgPSAoYyA8PCAyKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqb3QrKyA9IChhY2MgfCAoYyA+PiA0KSk7CisJCQlhY2MgPSAoYyAmIDE1KSA8PCA0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCSpvdCsrID0gKGFjYyB8IChjID4+IDIpKTsKKwkJCWFjYyA9IChjICYgMykgPDwgNjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqb3QrKyA9IChhY2MgfCBjKTsKKwkJCWFjYyA9IHBvcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwkqb3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3RvX3V0ZjgoY2hhciAqbGluZSwgY29uc3QgY2hhciAqY2hhcnNldCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBsYXRpbl9vbmVbXSA9ICJsYXRpbjEiOworCWNvbnN0IGNoYXIgKmlucHV0X2NoYXJzZXQgPSAqY2hhcnNldCA/IGNoYXJzZXQgOiBsYXRpbl9vbmU7CisJY2hhciAqb3V0ID0gcmVlbmNvZGVfc3RyaW5nKGxpbmUsIG1ldGFpbmZvX2NoYXJzZXQsIGlucHV0X2NoYXJzZXQpOworCisJaWYgKCFvdXQpCisJCWRpZSgiY2Fubm90IGNvbnZlcnQgZnJvbSAlcyB0byAlc1xuIiwKKwkJICAgIGlucHV0X2NoYXJzZXQsIG1ldGFpbmZvX2NoYXJzZXQpOworCXN0cmNweShsaW5lLCBvdXQpOworCWZyZWUob3V0KTsKK30KKworc3RhdGljIGludCBkZWNvZGVfaGVhZGVyX2JxKGNoYXIgKml0KQoreworCWNoYXIgKmluLCAqb3V0LCAqZXAsICpjcCwgKnNwOworCWNoYXIgb3V0YnVmWzEwMDBdOworCWludCByZmMyMDQ3ID0gMDsKKworCWluID0gaXQ7CisJb3V0ID0gb3V0YnVmOworCXdoaWxlICgoZXAgPSBzdHJzdHIoaW4sICI9PyIpKSAhPSBOVUxMKSB7CisJCWludCBzeiwgZW5jb2Rpbmc7CisJCWNoYXIgY2hhcnNldF9xWzI1Nl0sIHBpZWNlYnVmWzI1Nl07CisJCXJmYzIwNDcgPSAxOworCisJCWlmIChpbiAhPSBlcCkgeworCQkJc3ogPSBlcCAtIGluOworCQkJbWVtY3B5KG91dCwgaW4sIHN6KTsKKwkJCW91dCArPSBzejsKKwkJCWluICs9IHN6OworCQl9CisJCS8qIEUuZy4KKwkJICogZXAgOiAiPT9pc28tMjAyMi1qcD9CP0d5Ui4uLj89IGZvbyIKKwkJICogZXAgOiAiPT9JU08tODg1OS0xP1E/Rm9vPUZDYmFyPz0gYmF6IgorCQkgKi8KKwkJZXAgKz0gMjsKKwkJY3AgPSBzdHJjaHIoZXAsICc/Jyk7CisJCWlmICghY3ApCisJCQlyZXR1cm4gcmZjMjA0NzsgLyogbm8gbXVuZ2luZyAqLworCQlmb3IgKHNwID0gZXA7IHNwIDwgY3A7IHNwKyspCisJCQljaGFyc2V0X3Fbc3AgLSBlcF0gPSB0b2xvd2VyKCpzcCk7CisJCWNoYXJzZXRfcVtjcCAtIGVwXSA9IDA7CisJCWVuY29kaW5nID0gY3BbMV07CisJCWlmICghZW5jb2RpbmcgfHwgY3BbMl0gIT0gJz8nKQorCQkJcmV0dXJuIHJmYzIwNDc7IC8qIG5vIG11bmdpbmcgKi8KKwkJZXAgPSBzdHJzdHIoY3AgKyAzLCAiPz0iKTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiByZmMyMDQ3OyAvKiBubyBtdW5naW5nICovCisJCXN3aXRjaCAodG9sb3dlcihlbmNvZGluZykpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiByZmMyMDQ3OyAvKiBubyBtdW5naW5nICovCisJCWNhc2UgJ2InOgorCQkJc3ogPSBkZWNvZGVfYl9zZWdtZW50KGNwICsgMywgcGllY2VidWYsIGVwKTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXN6ID0gZGVjb2RlX3Ffc2VnbWVudChjcCArIDMsIHBpZWNlYnVmLCBlcCwgMSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3ogPCAwKQorCQkJcmV0dXJuIHJmYzIwNDc7CisJCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQkJY29udmVydF90b191dGY4KHBpZWNlYnVmLCBjaGFyc2V0X3EpOworCQlzdHJjcHkob3V0LCBwaWVjZWJ1Zik7CisJCW91dCArPSBzdHJsZW4ob3V0KTsKKwkJaW4gPSBlcCArIDI7CisJfQorCXN0cmNweShvdXQsIGluKTsKKwlzdHJjcHkoaXQsIG91dGJ1Zik7CisJcmV0dXJuIHJmYzIwNDc7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9oZWFkZXIoY2hhciAqaXQpCit7CisKKwlpZiAoZGVjb2RlX2hlYWRlcl9icShpdCkpCisJCXJldHVybjsKKwkvKiBvdGhlcndpc2UgIml0IiBpcyBhIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0LgorCSAqIFRoaXMgY2FuIGJlIGJpbmFyeSBndWNrIGJ1dCB0aGVyZSBpcyBubyBjaGFyc2V0IHNwZWNpZmllZC4KKwkgKi8KKwlpZiAobWV0YWluZm9fY2hhcnNldCkKKwkJY29udmVydF90b191dGY4KGl0LCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV90cmFuc2Zlcl9lbmNvZGluZyhjaGFyICpsaW5lKQoreworCWNoYXIgKmVwOworCisJc3dpdGNoICh0cmFuc2Zlcl9lbmNvZGluZykgeworCWNhc2UgVEVfUVA6CisJCWVwID0gbGluZSArIHN0cmxlbihsaW5lKTsKKwkJZGVjb2RlX3Ffc2VnbWVudChsaW5lLCBsaW5lLCBlcCwgMCk7CisJCWJyZWFrOworCWNhc2UgVEVfQkFTRTY0OgorCQllcCA9IGxpbmUgKyBzdHJsZW4obGluZSk7CisJCWRlY29kZV9iX3NlZ21lbnQobGluZSwgbGluZSwgZXApOworCQlicmVhazsKKwljYXNlIFRFX0RPTlRDQVJFOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ZpbHRlcihjaGFyICpsaW5lKTsKKworc3RhdGljIGludCBmaW5kX2JvdW5kYXJ5KHZvaWQpCit7CisJd2hpbGUoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmaW4pICE9IE5VTEwpIHsKKwkJaWYgKGlzX211bHRpcGFydF9ib3VuZGFyeShsaW5lKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfYm91bmRhcnkodm9pZCkKK3sKKwljaGFyIG5ld2xpbmVbXT0iXG4iOworYWdhaW46CisJaWYgKCFtZW1jbXAobGluZStjb250ZW50X3RvcC0+Ym91bmRhcnlfbGVuLCAiLS0iLCAyKSkgeworCQkvKiB3ZSBoaXQgYW4gZW5kIGJvdW5kYXJ5ICovCisJCS8qIHBvcCB0aGUgY3VycmVudCBib3VuZGFyeSBvZmYgdGhlIHN0YWNrICovCisJCWZyZWUoY29udGVudF90b3AtPmJvdW5kYXJ5KTsKKworCQkvKiB0ZWNobmljYWxseSB3b24ndCBoYXBwZW4gYXMgaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KCkKKwkJICAgd2lsbCBmYWlsIGZpcnN0LiAgQnV0IGp1c3QgaW4gY2FzZS4uCisJCSAqLworCQlpZiAoY29udGVudF90b3AtLSA8IGNvbnRlbnQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRGV0ZWN0ZWQgbWlzbWF0Y2hlZCBib3VuZGFyaWVzLCAiCisJCQkJCSJjYW4ndCByZWNvdmVyXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaGFuZGxlX2ZpbHRlcihuZXdsaW5lKTsKKworCQkvKiBza2lwIHRvIHRoZSBuZXh0IGJvdW5kYXJ5ICovCisJCWlmICghZmluZF9ib3VuZGFyeSgpKQorCQkJcmV0dXJuIDA7CisJCWdvdG8gYWdhaW47CisJfQorCisJLyogc2V0IHNvbWUgZGVmYXVsdHMgKi8KKwl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX0RPTlRDQVJFOworCWNoYXJzZXRbMF0gPSAwOworCW1lc3NhZ2VfdHlwZSA9IFRZUEVfVEVYVDsKKworCS8qIHNsdXJwIGluIHRoaXMgc2VjdGlvbidzIGluZm8gKi8KKwl3aGlsZSAocmVhZF9vbmVfaGVhZGVyX2xpbmUobGluZSwgc2l6ZW9mKGxpbmUpLCBmaW4pKQorCQljaGVja19oZWFkZXIobGluZSwgcF9oZHJfZGF0YSwgMCk7CisKKwkvKiBlYXQgdGhlIGJsYW5rIGxpbmUgYWZ0ZXIgc2VjdGlvbiBpbmZvICovCisJcmV0dXJuIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhdGNoYnJlYWsoY29uc3QgY2hhciAqbGluZSkKK3sKKwkvKiBCZWdpbm5pbmcgb2YgYSAiZGlmZiAtIiBoZWFkZXI/ICovCisJaWYgKCFtZW1jbXAoImRpZmYgLSIsIGxpbmUsIDYpKQorCQlyZXR1cm4gMTsKKworCS8qIENWUyAiSW5kZXg6ICIgbGluZT8gKi8KKwlpZiAoIW1lbWNtcCgiSW5kZXg6ICIsIGxpbmUsIDcpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogIi0tLSA8ZmlsZW5hbWU+IiBzdGFydHMgcGF0Y2hlcyB3aXRob3V0IGhlYWRlcnMKKwkgKiAiLS0tPHNwPioiIGlzIGEgbWFudWFsIHNlcGFyYXRvcgorCSAqLworCWlmICghbWVtY21wKCItLS0iLCBsaW5lLCAzKSkgeworCQlsaW5lICs9IDM7CisJCS8qIHNwYWNlIGZvbGxvd2VkIGJ5IGEgZmlsZW5hbWU/ICovCisJCWlmIChsaW5lWzBdID09ICcgJyAmJiAhaXNzcGFjZShsaW5lWzFdKSkKKwkJCXJldHVybiAxOworCQkvKiBKdXN0IHdoaXRlc3BhY2U/ICovCisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpsaW5lKys7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCXJldHVybiAxOworCQkJaWYgKCFpc3NwYWNlKGMpKQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9jb21taXRfbXNnKGNoYXIgKmxpbmUpCit7CisJc3RhdGljIGludCBzdGlsbF9sb29raW5nID0gMTsKKworCWlmICghY21pdG1zZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RpbGxfbG9va2luZykgeworCQljaGFyICpjcCA9IGxpbmU7CisJCWlmIChpc3NwYWNlKCpsaW5lKSkgeworCQkJZm9yIChjcCA9IGxpbmUgKyAxOyAqY3A7IGNwKyspIHsKKwkJCQlpZiAoIWlzc3BhY2UoKmNwKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoISpjcCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKHN0aWxsX2xvb2tpbmcgPSBjaGVja19oZWFkZXIoY3AsIHNfaGRyX2RhdGEsIDApKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogbm9ybWFsaXplIHRoZSBsb2cgbWVzc2FnZSB0byBVVEYtOC4gKi8KKwlpZiAobWV0YWluZm9fY2hhcnNldCkKKwkJY29udmVydF90b191dGY4KGxpbmUsIGNoYXJzZXQpOworCisJaWYgKHBhdGNoYnJlYWsobGluZSkpIHsKKwkJZmNsb3NlKGNtaXRtc2cpOworCQljbWl0bXNnID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCisJZnB1dHMobGluZSwgY21pdG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3BhdGNoKGNoYXIgKmxpbmUpCit7CisJZnB1dHMobGluZSwgcGF0Y2hmaWxlKTsKKwlwYXRjaF9saW5lcysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9maWx0ZXIoY2hhciAqbGluZSkKK3sKKwlzdGF0aWMgaW50IGZpbHRlciA9IDA7CisKKwkvKiBmaWx0ZXIgdGVsbHMgdXMgd2hpY2ggcGFydCB3ZSBsZWZ0IG9mZiBvbgorCSAqIGEgbm9uLXplcm8gcmV0dXJuIGluZGljYXRlcyB3ZSBoaXQgYSBmaWx0ZXIgcG9pbnQKKwkgKi8KKwlzd2l0Y2ggKGZpbHRlcikgeworCWNhc2UgMDoKKwkJaWYgKCFoYW5kbGVfY29tbWl0X21zZyhsaW5lKSkKKwkJCWJyZWFrOworCQlmaWx0ZXIrKzsKKwljYXNlIDE6CisJCWlmICghaGFuZGxlX3BhdGNoKGxpbmUpKQorCQkJYnJlYWs7CisJCWZpbHRlcisrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfYm9keSh2b2lkKQoreworCWludCByYyA9IDA7CisJc3RhdGljIGNoYXIgbmV3bGluZVsyMDAwXTsKKwlzdGF0aWMgY2hhciAqbnAgPSBuZXdsaW5lOworCisJLyogU2tpcCB1cCB0byB0aGUgZmlyc3QgYm91bmRhcnkgKi8KKwlpZiAoY29udGVudF90b3AtPmJvdW5kYXJ5KSB7CisJCWlmICghZmluZF9ib3VuZGFyeSgpKQorCQkJcmV0dXJuOworCX0KKworCWRvIHsKKwkJLyogcHJvY2VzcyBhbnkgYm91bmRhcnkgbGluZXMgKi8KKwkJaWYgKGNvbnRlbnRfdG9wLT5ib3VuZGFyeSAmJiBpc19tdWx0aXBhcnRfYm91bmRhcnkobGluZSkpIHsKKwkJCS8qIGZsdXNoIGFueSBsZWZ0b3ZlciAqLworCQkJaWYgKCh0cmFuc2Zlcl9lbmNvZGluZyA9PSBURV9CQVNFNjQpICAmJgorCQkJICAgIChucCAhPSBuZXdsaW5lKSkgeworCQkJCWhhbmRsZV9maWx0ZXIobmV3bGluZSk7CisJCQl9CisJCQlpZiAoIWhhbmRsZV9ib3VuZGFyeSgpKQorCQkJCXJldHVybjsKKwkJfQorCisJCS8qIFVud3JhcCB0cmFuc2ZlciBlbmNvZGluZyAqLworCQlkZWNvZGVfdHJhbnNmZXJfZW5jb2RpbmcobGluZSk7CisKKwkJc3dpdGNoICh0cmFuc2Zlcl9lbmNvZGluZykgeworCQljYXNlIFRFX0JBU0U2NDoKKwkJeworCQkJY2hhciAqb3AgPSBsaW5lOworCisJCQkvKiBiaW5hcnkgZGF0YSBtb3N0IGxpa2VseSBkb2Vzbid0IGhhdmUgbmV3bGluZXMgKi8KKwkJCWlmIChtZXNzYWdlX3R5cGUgIT0gVFlQRV9URVhUKSB7CisJCQkJcmMgPSBoYW5kbGVfZmlsdGVyKGxpbmUpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiB0aGlzIGlzIGEgZGVjb2RlZCBsaW5lIHRoYXQgbWF5IGNvbnRhaW4KKwkJCSAqIG11bHRpcGxlIG5ldyBsaW5lcy4gIFBhc3Mgb25seSBvbmUgY2h1bmsKKwkJCSAqIGF0IGEgdGltZSB0byBoYW5kbGVfZmlsdGVyKCkKKwkJCSAqLworCisJCQlkbyB7CisJCQkJd2hpbGUgKCpvcCAhPSAnXG4nICYmICpvcCAhPSAwKQorCQkJCQkqbnArKyA9ICpvcCsrOworCQkJCSpucCA9ICpvcDsKKwkJCQlpZiAoKm5wICE9IDApIHsKKwkJCQkJLyogc2hvdWxkIGJlIHNpdHRpbmcgb24gYSBuZXcgbGluZSAqLworCQkJCQkqKCsrbnApID0gMDsKKwkJCQkJb3ArKzsKKwkJCQkJcmMgPSBoYW5kbGVfZmlsdGVyKG5ld2xpbmUpOworCQkJCQlucCA9IG5ld2xpbmU7CisJCQkJfQorCQkJfSB3aGlsZSAoKm9wICE9IDApOworCQkJLyogdGhlIHBhcnRpYWwgY2h1bmsgaXMgc2F2ZWQgaW4gbmV3bGluZSBhbmQKKwkJCSAqIHdpbGwgYmUgYXBwZW5kZWQgYnkgdGhlIG5leHQgaXRlcmF0aW9uIG9mIGZnZXRzCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlyYyA9IGhhbmRsZV9maWx0ZXIobGluZSk7CisJCX0KKwkJaWYgKHJjKQorCQkJLyogbm90aGluZyBsZWZ0IHRvIGZpbHRlciAqLworCQkJYnJlYWs7CisJfSB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmaW4pKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2luZm8odm9pZCkKK3sKKwljaGFyICpzdWI7CisJY2hhciAqaGRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaGVhZGVyW2ldOyBpKyspIHsKKworCQkvKiBvbmx5IHByaW50IGluYm9keSBoZWFkZXJzIGlmIHdlIG91dHB1dCBhIHBhdGNoIGZpbGUgKi8KKwkJaWYgKHBhdGNoX2xpbmVzICYmIHNfaGRyX2RhdGFbaV0pCisJCQloZHIgPSBzX2hkcl9kYXRhW2ldOworCQllbHNlIGlmIChwX2hkcl9kYXRhW2ldKQorCQkJaGRyID0gcF9oZHJfZGF0YVtpXTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJaWYgKCFtZW1jbXAoaGVhZGVyW2ldLCAiU3ViamVjdCIsIDcpKSB7CisJCQlzdWIgPSBjbGVhbnVwX3N1YmplY3QoaGRyKTsKKwkJCWNsZWFudXBfc3BhY2Uoc3ViKTsKKwkJCWZwcmludGYoZm91dCwgIlN1YmplY3Q6ICVzXG4iLCBzdWIpOworCQl9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyW2ldLCAiRnJvbSIsIDQpKSB7CisJCQloYW5kbGVfZnJvbShoZHIpOworCQkJZnByaW50Zihmb3V0LCAiQXV0aG9yOiAlc1xuIiwgbmFtZSk7CisJCQlmcHJpbnRmKGZvdXQsICJFbWFpbDogJXNcbiIsIGVtYWlsKTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFudXBfc3BhY2UoaGRyKTsKKwkJCWZwcmludGYoZm91dCwgIiVzOiAlc1xuIiwgaGVhZGVyW2ldLCBoZHIpOworCQl9CisJfQorCWZwcmludGYoZm91dCwgIlxuIik7Cit9CisKK2ludCBtYWlsaW5mbyhGSUxFICppbiwgRklMRSAqb3V0LCBpbnQga3MsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorCSAgICAgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpwYXRjaCkKK3sKKwlrZWVwX3N1YmplY3QgPSBrczsKKwltZXRhaW5mb19jaGFyc2V0ID0gZW5jb2Rpbmc7CisJZmluID0gaW47CisJZm91dCA9IG91dDsKKworCWNtaXRtc2cgPSBmb3Blbihtc2csICJ3Iik7CisJaWYgKCFjbWl0bXNnKSB7CisJCXBlcnJvcihtc2cpOworCQlyZXR1cm4gLTE7CisJfQorCXBhdGNoZmlsZSA9IGZvcGVuKHBhdGNoLCAidyIpOworCWlmICghcGF0Y2hmaWxlKSB7CisJCXBlcnJvcihwYXRjaCk7CisJCWZjbG9zZShjbWl0bXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBfaGRyX2RhdGEgPSB4Y2FsbG9jKE1BWF9IRFJfUEFSU0VELCBzaXplb2YoY2hhciAqKSk7CisJc19oZHJfZGF0YSA9IHhjYWxsb2MoTUFYX0hEUl9QQVJTRUQsIHNpemVvZihjaGFyICopKTsKKworCS8qIHByb2Nlc3MgdGhlIGVtYWlsIGhlYWRlciAqLworCXdoaWxlIChyZWFkX29uZV9oZWFkZXJfbGluZShsaW5lLCBzaXplb2YobGluZSksIGZpbikpCisJCWNoZWNrX2hlYWRlcihsaW5lLCBwX2hkcl9kYXRhLCAxKTsKKworCWhhbmRsZV9ib2R5KCk7CisJaGFuZGxlX2luZm8oKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBtYWlsaW5mb191c2FnZVtdID0KKwkiZ2l0LW1haWxpbmZvIFsta10gWy11IHwgLS1lbmNvZGluZz08ZW5jb2Rpbmc+XSBtc2cgcGF0Y2ggPG1haWwgPmluZm8iOworCitpbnQgY21kX21haWxpbmZvKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmRlZl9jaGFyc2V0OworCisJLyogTkVFRFNXT1JLOiBtaWdodCB3YW50IHRvIGRvIHRoZSBvcHRpb25hbCAuZ2l0LyBkaXJlY3RvcnkKKwkgKiBkaXNjb3ZlcnkKKwkgKi8KKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlkZWZfY2hhcnNldCA9IChnaXRfY29tbWl0X2VuY29kaW5nID8gZ2l0X2NvbW1pdF9lbmNvZGluZyA6ICJ1dGYtOCIpOworCW1ldGFpbmZvX2NoYXJzZXQgPSBkZWZfY2hhcnNldDsKKworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWsiKSkKKwkJCWtlZXBfc3ViamVjdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi11IikpCisJCQltZXRhaW5mb19jaGFyc2V0ID0gZGVmX2NoYXJzZXQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1uIikpCisJCQltZXRhaW5mb19jaGFyc2V0ID0gTlVMTDsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2WzFdLCAiLS1lbmNvZGluZz0iKSkKKwkJCW1ldGFpbmZvX2NoYXJzZXQgPSBhcmd2WzFdICsgMTE7CisJCWVsc2UKKwkJCXVzYWdlKG1haWxpbmZvX3VzYWdlKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgIT0gMykKKwkJdXNhZ2UobWFpbGluZm9fdXNhZ2UpOworCisJcmV0dXJuICEhbWFpbGluZm8oc3RkaW4sIHN0ZG91dCwga2VlcF9zdWJqZWN0LCBtZXRhaW5mb19jaGFyc2V0LCBhcmd2WzFdLCBhcmd2WzJdKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbWFpbHNwbGl0LmMgYi9idWlsdGluLW1haWxzcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiY2E4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW1haWxzcGxpdC5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogVG90YWxseSBicmFpbmRhbWFnZWQgbWJveCBzcGxpdHRlciBwcm9ncmFtLgorICoKKyAqIEl0IGp1c3Qgc3BsaXRzIGEgbWJveCBpbnRvIGEgbGlzdCBvZiBmaWxlczogIjAwMDEiICIwMDAyIiAuLgorICogc28geW91IGNhbiBwcm9jZXNzIHRoZW0gZnVydGhlciBmcm9tIHRoZXJlLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9tYWlsc3BsaXRfdXNhZ2VbXSA9CisiZ2l0LW1haWxzcGxpdCBbLWQ8cHJlYz5dIFstZjxuPl0gWy1iXSAtbzxkaXJlY3Rvcnk+IDxtYm94Pi4uLiI7CisKK3N0YXRpYyBpbnQgaXNfZnJvbV9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqY29sb247CisKKwlpZiAobGVuIDwgMjAgfHwgbWVtY21wKCJGcm9tICIsIGxpbmUsIDUpKQorCQlyZXR1cm4gMDsKKworCWNvbG9uID0gbGluZSArIGxlbiAtIDI7CisJbGluZSArPSA1OworCWZvciAoOzspIHsKKwkJaWYgKGNvbG9uIDwgbGluZSkKKwkJCXJldHVybiAwOworCQlpZiAoKi0tY29sb24gPT0gJzonKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc2RpZ2l0KGNvbG9uWy00XSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bLTJdKSB8fAorCSAgICAhaXNkaWdpdChjb2xvblstMV0pIHx8CisJICAgICFpc2RpZ2l0KGNvbG9uWyAxXSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bIDJdKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB5ZWFyICovCisJaWYgKHN0cnRvbChjb2xvbiszLCBOVUxMLCAxMCkgPD0gOTApCisJCXJldHVybiAwOworCisJLyogT2ssIGNsb3NlIGVub3VnaCAqLworCXJldHVybiAxOworfQorCisvKiBDb3VsZCBiZSBhcyBzbWFsbCBhcyA2NCwgZW5vdWdoIHRvIGhvbGQgYSBVbml4ICJGcm9tICIgbGluZS4gKi8KK3N0YXRpYyBjaGFyIGJ1Zls0MDk2XTsKKworLyogQ2FsbGVkIHdpdGggdGhlIGZpcnN0IGxpbmUgKHBvdGVudGlhbGx5IHBhcnRpYWwpCisgKiBhbHJlYWR5IGluIGJ1ZltdIC0tIG5vcm1hbGx5IHRoYXQgc2hvdWxkIGJlZ2luIHdpdGgKKyAqIHRoZSBVbml4ICJGcm9tICIgbGluZS4gIFdyaXRlIGl0IGludG8gdGhlIHNwZWNpZmllZAorICogZmlsZS4KKyAqLworc3RhdGljIGludCBzcGxpdF9vbmUoRklMRSAqbWJveCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGFsbG93X2JhcmUpCit7CisJRklMRSAqb3V0cHV0ID0gTlVMTDsKKwlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJaW50IGZkOworCWludCBzdGF0dXMgPSAwOworCWludCBpc19iYXJlID0gIWlzX2Zyb21fbGluZShidWYsIGxlbik7CisKKwlpZiAoaXNfYmFyZSAmJiAhYWxsb3dfYmFyZSkKKwkJZ290byBjb3JydXB0OworCisJZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG5hbWUpOworCW91dHB1dCA9IGZkb3BlbihmZCwgInciKTsKKworCS8qIENvcHkgaXQgb3V0LCB3aGlsZSBzZWFyY2hpbmcgZm9yIGEgbGluZSB0aGF0IGJlZ2lucyB3aXRoCisJICogIkZyb20gIiBhbmQgaGF2aW5nIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBkYXRlIGZvcm1hdC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWludCBpc19wYXJ0aWFsID0gKGJ1ZltsZW4tMV0gIT0gJ1xuJyk7CisKKwkJaWYgKGZwdXRzKGJ1Ziwgb3V0cHV0KSA9PSBFT0YpCisJCQlkaWUoImNhbm5vdCB3cml0ZSBvdXRwdXQiKTsKKworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgbWJveCkgPT0gTlVMTCkgeworCQkJaWYgKGZlb2YobWJveCkpIHsKKwkJCQlzdGF0dXMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZGllKCJjYW5ub3QgcmVhZCBtYm94Iik7CisJCX0KKwkJbGVuID0gc3RybGVuKGJ1Zik7CisJCWlmICghaXNfcGFydGlhbCAmJiAhaXNfYmFyZSAmJiBpc19mcm9tX2xpbmUoYnVmLCBsZW4pKQorCQkJYnJlYWs7IC8qIGRvbmUgd2l0aCBvbmUgbWVzc2FnZSAqLworCX0KKwlmY2xvc2Uob3V0cHV0KTsKKwlyZXR1cm4gc3RhdHVzOworCisgY29ycnVwdDoKKwlpZiAob3V0cHV0KQorCQlmY2xvc2Uob3V0cHV0KTsKKwl1bmxpbmsobmFtZSk7CisJZnByaW50ZihzdGRlcnIsICJjb3JydXB0IG1haWxib3hcbiIpOworCWV4aXQoMSk7Cit9CisKK2ludCBzcGxpdF9tYm94KGNvbnN0IGNoYXIgKiptYm94LCBjb25zdCBjaGFyICpkaXIsIGludCBhbGxvd19iYXJlLCBpbnQgbnJfcHJlYywgaW50IHNraXApCit7CisJY2hhciAqbmFtZSA9IHhtYWxsb2Moc3RybGVuKGRpcikgKyAyICsgMyAqIHNpemVvZihza2lwKSk7CisJaW50IHJldCA9IC0xOworCisJd2hpbGUgKCptYm94KSB7CisJCWNvbnN0IGNoYXIgKmZpbGUgPSAqbWJveCsrOworCQlGSUxFICpmID0gIXN0cmNtcChmaWxlLCAiLSIpID8gc3RkaW4gOiBmb3BlbihmaWxlLCAiciIpOworCQlpbnQgZmlsZV9kb25lID0gMDsKKworCQlpZiAoICFmICkgeworCQkJZXJyb3IoImNhbm5vdCBvcGVuIG1ib3ggJXMiLCBmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpID09IE5VTEwpIHsKKwkJCWlmIChmID09IHN0ZGluKQorCQkJCWJyZWFrOyAvKiBlbXB0eSBzdGRpbiBpcyBPSyAqLworCQkJZXJyb3IoImNhbm5vdCByZWFkIG1ib3ggJXMiLCBmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd2hpbGUgKCFmaWxlX2RvbmUpIHsKKwkJCXNwcmludGYobmFtZSwgIiVzLyUwKmQiLCBkaXIsIG5yX3ByZWMsICsrc2tpcCk7CisJCQlmaWxlX2RvbmUgPSBzcGxpdF9vbmUoZiwgbmFtZSwgYWxsb3dfYmFyZSk7CisJCX0KKworCQlpZiAoZiAhPSBzdGRpbikKKwkJCWZjbG9zZShmKTsKKwl9CisJcmV0ID0gc2tpcDsKK291dDoKKwlmcmVlKG5hbWUpOworCXJldHVybiByZXQ7Cit9CitpbnQgY21kX21haWxzcGxpdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbnIgPSAwLCBucl9wcmVjID0gNCwgcmV0OworCWludCBhbGxvd19iYXJlID0gMDsKKwljb25zdCBjaGFyICpkaXIgPSBOVUxMOworCWNvbnN0IGNoYXIgKiphcmdwOworCXN0YXRpYyBjb25zdCBjaGFyICpzdGRpbl9vbmx5W10gPSB7ICItIiwgTlVMTCB9OworCisJZm9yIChhcmdwID0gYXJndisxOyAqYXJncDsgYXJncCsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9ICphcmdwOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCS8qIGRvIGZsYWdzIGhlcmUgKi8KKwkJaWYgKCBhcmdbMV0gPT0gJ2QnICkgeworCQkJbnJfcHJlYyA9IHN0cnRvbChhcmcrMiwgTlVMTCwgMTApOworCQkJaWYgKG5yX3ByZWMgPCAzIHx8IDEwIDw9IG5yX3ByZWMpCisJCQkJdXNhZ2UoZ2l0X21haWxzcGxpdF91c2FnZSk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICggYXJnWzFdID09ICdmJyApIHsKKwkJCW5yID0gc3RydG9sKGFyZysyLCBOVUxMLCAxMCk7CisJCX0gZWxzZSBpZiAoIGFyZ1sxXSA9PSAnYicgJiYgIWFyZ1syXSApIHsKKwkJCWFsbG93X2JhcmUgPSAxOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSApIHsKKwkJCWRpciA9IGFyZysyOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJy0nICYmICFhcmdbMl0gKSB7CisJCQlhcmdwKys7CS8qIC0tIG1hcmtzIGVuZCBvZiBvcHRpb25zICovCisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRpZSgidW5rbm93biBvcHRpb246ICVzIiwgYXJnKTsKKwkJfQorCX0KKworCWlmICggIWRpciApIHsKKwkJLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IGlmIG5vIC1vIHNwZWNpZmllZCwgYWNjZXB0CisJCSAgIDxtYm94PiA8ZGlyPiBvciBqdXN0IDxkaXI+ICovCisJCXN3aXRjaCAoYXJnYyAtIChhcmdwLWFyZ3YpKSB7CisJCWNhc2UgMToKKwkJCWRpciA9IGFyZ3BbMF07CisJCQlhcmdwID0gc3RkaW5fb25seTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdGRpbl9vbmx5WzBdID0gYXJncFswXTsKKwkJCWRpciA9IGFyZ3BbMV07CisJCQlhcmdwID0gc3RkaW5fb25seTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoZ2l0X21haWxzcGxpdF91c2FnZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBOZXcgdXNhZ2U6IGlmIG5vIG1vcmUgYXJndW1lbnQsIHBhcnNlIHN0ZGluICovCisJCWlmICggISphcmdwICkKKwkJCWFyZ3AgPSBzdGRpbl9vbmx5OworCX0KKworCXJldCA9IHNwbGl0X21ib3goYXJncCwgZGlyLCBhbGxvd19iYXJlLCBucl9wcmVjLCBucik7CisJaWYgKHJldCAhPSAtMSkKKwkJcHJpbnRmKCIlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQgPT0gLTE7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW1lcmdlLWJhc2UuYyBiL2J1aWx0aW4tbWVyZ2UtYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWQzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW1lcmdlLWJhc2UuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKworc3RhdGljIGludCBzaG93X21lcmdlX2Jhc2Uoc3RydWN0IGNvbW1pdCAqcmV2MSwgc3RydWN0IGNvbW1pdCAqcmV2MiwgaW50IHNob3dfYWxsKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcmVzdWx0ID0gZ2V0X21lcmdlX2Jhc2VzKHJldjEsIHJldjIsIDApOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAxOworCisJd2hpbGUgKHJlc3VsdCkgeworCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChyZXN1bHQtPml0ZW0tPm9iamVjdC5zaGExKSk7CisJCWlmICghc2hvd19hbGwpCisJCQlyZXR1cm4gMDsKKwkJcmVzdWx0ID0gcmVzdWx0LT5uZXh0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV9iYXNlX3VzYWdlW10gPQorImdpdC1tZXJnZS1iYXNlIFstLWFsbF0gPGNvbW1pdC1pZD4gPGNvbW1pdC1pZD4iOworCitpbnQgY21kX21lcmdlX2Jhc2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGNvbW1pdCAqcmV2MSwgKnJldjI7CisJdW5zaWduZWQgY2hhciByZXYxa2V5WzIwXSwgcmV2MmtleVsyMF07CisJaW50IHNob3dfYWxsID0gMDsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCXNob3dfYWxsID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UobWVyZ2VfYmFzZV91c2FnZSk7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZShtZXJnZV9iYXNlX3VzYWdlKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgcmV2MWtleSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsyXSwgcmV2MmtleSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKwlyZXYxID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2MWtleSk7CisJcmV2MiA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHJldjJrZXkpOworCWlmICghcmV2MSB8fCAhcmV2MikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIHNob3dfbWVyZ2VfYmFzZShyZXYxLCByZXYyLCBzaG93X2FsbCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW1lcmdlLWZpbGUuYyBiL2J1aWx0aW4tbWVyZ2UtZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzU3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW1lcmdlLWZpbGUuYwpAQCAtMCwwICsxLDYzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZGlmZi94ZGlmZi5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV9maWxlX3VzYWdlW10gPQorImdpdCBtZXJnZS1maWxlIFstcCB8IC0tc3Rkb3V0XSBbLXEgfCAtLXF1aWV0XSBbLUwgbmFtZTEgWy1MIG9yaWcgWy1MIG5hbWUyXV1dIGZpbGUxIG9yaWdfZmlsZSBmaWxlMiI7CisKK2ludCBjbWRfbWVyZ2VfZmlsZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWNoYXIgKm5hbWVzWzNdOworCW1tZmlsZV90IG1tZnNbM107CisJbW1idWZmZXJfdCByZXN1bHQgPSB7TlVMTCwgMH07CisJeHBwYXJhbV90IHhwcCA9IHtYREZfTkVFRF9NSU5JTUFMfTsKKwlpbnQgcmV0ID0gMCwgaSA9IDAsIHRvX3N0ZG91dCA9IDA7CisKKwl3aGlsZSAoYXJnYyA+IDQpIHsKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1MIikgJiYgaSA8IDMpIHsKKwkJCW5hbWVzW2krK10gPSBhcmd2WzJdOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1wIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbMV0sICItLXN0ZG91dCIpKQorCQkJdG9fc3Rkb3V0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLXEiKSB8fAorCQkJCSFzdHJjbXAoYXJndlsxXSwgIi0tcXVpZXQiKSkKKwkJCWZyZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3RkZXJyKTsKKwkJZWxzZQorCQkJdXNhZ2UobWVyZ2VfZmlsZV91c2FnZSk7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCWlmIChhcmdjICE9IDQpCisJCXVzYWdlKG1lcmdlX2ZpbGVfdXNhZ2UpOworCisJZm9yICg7IGkgPCAzOyBpKyspCisJCW5hbWVzW2ldID0gYXJndltpICsgMV07CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpZiAocmVhZF9tbWZpbGUobW1mcyArIGksIGFyZ3ZbaSArIDFdKSkKKwkJCXJldHVybiAtMTsKKworCXJldCA9IHhkbF9tZXJnZShtbWZzICsgMSwgbW1mcyArIDAsIG5hbWVzWzBdLCBtbWZzICsgMiwgbmFtZXNbMl0sCisJCQkmeHBwLCBYRExfTUVSR0VfWkVBTE9VUywgJnJlc3VsdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlmcmVlKG1tZnNbaV0ucHRyKTsKKworCWlmIChyZXQgPj0gMCkgeworCQljaGFyICpmaWxlbmFtZSA9IGFyZ3ZbMV07CisJCUZJTEUgKmYgPSB0b19zdGRvdXQgPyBzdGRvdXQgOiBmb3BlbihmaWxlbmFtZSwgIndiIik7CisKKwkJaWYgKCFmKQorCQkJcmV0ID0gZXJyb3IoIkNvdWxkIG5vdCBvcGVuICVzIGZvciB3cml0aW5nIiwgZmlsZW5hbWUpOworCQllbHNlIGlmIChmd3JpdGUocmVzdWx0LnB0ciwgcmVzdWx0LnNpemUsIDEsIGYpICE9IDEpCisJCQlyZXQgPSBlcnJvcigiQ291bGQgbm90IHdyaXRlIHRvICVzIiwgZmlsZW5hbWUpOworCQllbHNlIGlmIChmY2xvc2UoZikpCisJCQlyZXQgPSBlcnJvcigiQ291bGQgbm90IGNsb3NlICVzIiwgZmlsZW5hbWUpOworCQlmcmVlKHJlc3VsdC5wdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW12LmMgYi9idWlsdGluLW12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MzIxNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbXYuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqICJnaXQgbXYiIGJ1aWx0aW4gY29tbWFuZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKb2hhbm5lcyBTY2hpbmRlbGluCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fbXZfdXNhZ2VbXSA9CisiZ2l0LW12IFstbl0gWy1mXSAoPHNvdXJjZT4gPGRlc3RpbmF0aW9uPiB8IFsta10gPHNvdXJjZT4uLi4gPGRlc3RpbmF0aW9uPikiOworCitzdGF0aWMgY29uc3QgY2hhciAqKmNvcHlfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCQkJICBpbnQgY291bnQsIGludCBiYXNlX25hbWUpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqKnJlc3VsdCA9IHhtYWxsb2MoKGNvdW50ICsgMSkgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJbWVtY3B5KHJlc3VsdCwgcGF0aHNwZWMsIGNvdW50ICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCXJlc3VsdFtjb3VudF0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWludCBsZW5ndGggPSBzdHJsZW4ocmVzdWx0W2ldKTsKKwkJaWYgKGxlbmd0aCA+IDAgJiYgcmVzdWx0W2ldW2xlbmd0aCAtIDFdID09ICcvJykgeworCQkJY2hhciAqd2l0aG91dF9zbGFzaCA9IHhtYWxsb2MobGVuZ3RoKTsKKwkJCW1lbWNweSh3aXRob3V0X3NsYXNoLCByZXN1bHRbaV0sIGxlbmd0aCAtIDEpOworCQkJd2l0aG91dF9zbGFzaFtsZW5ndGggLSAxXSA9ICdcMCc7CisJCQlyZXN1bHRbaV0gPSB3aXRob3V0X3NsYXNoOworCQl9CisJCWlmIChiYXNlX25hbWUpIHsKKwkJCWNvbnN0IGNoYXIgKmxhc3Rfc2xhc2ggPSBzdHJyY2hyKHJlc3VsdFtpXSwgJy8nKTsKKwkJCWlmIChsYXN0X3NsYXNoKQorCQkJCXJlc3VsdFtpXSA9IGxhc3Rfc2xhc2ggKyAxOworCQl9CisJfQorCXJldHVybiBnZXRfcGF0aHNwZWMocHJlZml4LCByZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2xpc3QoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJaWYgKGxpc3QtPm5yID4gMCkgeworCQlpbnQgaTsKKwkJcHJpbnRmKCIlcyIsIGxhYmVsKTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQlwcmludGYoIiVzJXMiLCBpID4gMCA/ICIsICIgOiAiIiwgbGlzdC0+aXRlbXNbaV0ucGF0aCk7CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWRkX3NsYXNoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwlpZiAocGF0aFtsZW4gLSAxXSAhPSAnLycpIHsKKwkJY2hhciAqd2l0aF9zbGFzaCA9IHhtYWxsb2MobGVuICsgMik7CisJCW1lbWNweSh3aXRoX3NsYXNoLCBwYXRoLCBsZW4pOworCQl3aXRoX3NsYXNoW2xlbisrXSA9ICcvJzsKKwkJd2l0aF9zbGFzaFtsZW5dID0gMDsKKwkJcmV0dXJuIHdpdGhfc2xhc2g7CisJfQorCXJldHVybiBwYXRoOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfbXYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5ld2ZkLCBjb3VudDsKKwlpbnQgdmVyYm9zZSA9IDAsIHNob3dfb25seSA9IDAsIGZvcmNlID0gMCwgaWdub3JlX2Vycm9ycyA9IDA7CisJY29uc3QgY2hhciAqKnNvdXJjZSwgKipkZXN0aW5hdGlvbiwgKipkZXN0X3BhdGg7CisJZW51bSB1cGRhdGVfbW9kZSB7IEJPVEggPSAwLCBXT1JLSU5HX0RJUkVDVE9SWSwgSU5ERVggfSAqbW9kZXM7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhdGhfbGlzdCBvdmVyd3JpdHRlbiA9IHtOVUxMLCAwLCAwLCAwfTsKKwlzdHJ1Y3QgcGF0aF9saXN0IHNyY19mb3JfZHN0ID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgYWRkZWQgPSB7TlVMTCwgMCwgMCwgMH07CisJc3RydWN0IHBhdGhfbGlzdCBkZWxldGVkID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgY2hhbmdlZCA9IHtOVUxMLCAwLCAwLCAwfTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSwgMSk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJc2hvd19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1mIikpIHsKKwkJCWZvcmNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1rIikpIHsKKwkJCWlnbm9yZV9lcnJvcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UoYnVpbHRpbl9tdl91c2FnZSk7CisJfQorCWNvdW50ID0gYXJnYyAtIGkgLSAxOworCWlmIChjb3VudCA8IDEpCisJCXVzYWdlKGJ1aWx0aW5fbXZfdXNhZ2UpOworCisJc291cmNlID0gY29weV9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpLCBjb3VudCwgMCk7CisJbW9kZXMgPSB4Y2FsbG9jKGNvdW50LCBzaXplb2YoZW51bSB1cGRhdGVfbW9kZSkpOworCWRlc3RfcGF0aCA9IGNvcHlfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgYXJnYyAtIDEsIDEsIDApOworCisJaWYgKGRlc3RfcGF0aFswXVswXSA9PSAnXDAnKQorCQkvKiBzcGVjaWFsIGNhc2U6ICIuIiB3YXMgbm9ybWFsaXplZCB0byAiIiAqLworCQlkZXN0aW5hdGlvbiA9IGNvcHlfcGF0aHNwZWMoZGVzdF9wYXRoWzBdLCBhcmd2ICsgaSwgY291bnQsIDEpOworCWVsc2UgaWYgKCFsc3RhdChkZXN0X3BhdGhbMF0sICZzdCkgJiYKKwkJCVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZGVzdF9wYXRoWzBdID0gYWRkX3NsYXNoKGRlc3RfcGF0aFswXSk7CisJCWRlc3RpbmF0aW9uID0gY29weV9wYXRoc3BlYyhkZXN0X3BhdGhbMF0sIGFyZ3YgKyBpLCBjb3VudCwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50ICE9IDEpCisJCQl1c2FnZShidWlsdGluX212X3VzYWdlKTsKKwkJZGVzdGluYXRpb24gPSBkZXN0X3BhdGg7CisJfQorCisJLyogQ2hlY2tpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljb25zdCBjaGFyICpzcmMgPSBzb3VyY2VbaV0sICpkc3QgPSBkZXN0aW5hdGlvbltpXTsKKwkJaW50IGxlbmd0aCwgc3JjX2lzX2RpcjsKKwkJY29uc3QgY2hhciAqYmFkID0gTlVMTDsKKworCQlpZiAoc2hvd19vbmx5KQorCQkJcHJpbnRmKCJDaGVja2luZyByZW5hbWUgb2YgJyVzJyB0byAnJXMnXG4iLCBzcmMsIGRzdCk7CisKKwkJbGVuZ3RoID0gc3RybGVuKHNyYyk7CisJCWlmIChsc3RhdChzcmMsICZzdCkgPCAwKQorCQkJYmFkID0gImJhZCBzb3VyY2UiOworCQllbHNlIGlmICghc3RybmNtcChzcmMsIGRzdCwgbGVuZ3RoKSAmJgorCQkJCShkc3RbbGVuZ3RoXSA9PSAwIHx8IGRzdFtsZW5ndGhdID09ICcvJykpIHsKKwkJCWJhZCA9ICJjYW4gbm90IG1vdmUgZGlyZWN0b3J5IGludG8gaXRzZWxmIjsKKwkJfSBlbHNlIGlmICgoc3JjX2lzX2RpciA9IFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQkJJiYgbHN0YXQoZHN0LCAmc3QpID09IDApCisJCQliYWQgPSAiY2Fubm90IG1vdmUgZGlyZWN0b3J5IG92ZXIgZmlsZSI7CisJCWVsc2UgaWYgKHNyY19pc19kaXIpIHsKKwkJCWNvbnN0IGNoYXIgKnNyY193X3NsYXNoID0gYWRkX3NsYXNoKHNyYyk7CisJCQlpbnQgbGVuX3dfc2xhc2ggPSBsZW5ndGggKyAxOworCQkJaW50IGZpcnN0LCBsYXN0OworCisJCQltb2Rlc1tpXSA9IFdPUktJTkdfRElSRUNUT1JZOworCisJCQlmaXJzdCA9IGNhY2hlX25hbWVfcG9zKHNyY193X3NsYXNoLCBsZW5fd19zbGFzaCk7CisJCQlpZiAoZmlyc3QgPj0gMCkKKwkJCQlkaWUgKCJIdWg/ICUuKnMgaXMgaW4gaW5kZXg/IiwKKwkJCQkJCWxlbl93X3NsYXNoLCBzcmNfd19zbGFzaCk7CisKKwkJCWZpcnN0ID0gLTEgLSBmaXJzdDsKKwkJCWZvciAobGFzdCA9IGZpcnN0OyBsYXN0IDwgYWN0aXZlX25yOyBsYXN0KyspIHsKKwkJCQljb25zdCBjaGFyICpwYXRoID0gYWN0aXZlX2NhY2hlW2xhc3RdLT5uYW1lOworCQkJCWlmIChzdHJuY21wKHBhdGgsIHNyY193X3NsYXNoLCBsZW5fd19zbGFzaCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZSgoY2hhciAqKXNyY193X3NsYXNoKTsKKworCQkJaWYgKGxhc3QgLSBmaXJzdCA8IDEpCisJCQkJYmFkID0gInNvdXJjZSBkaXJlY3RvcnkgaXMgZW1wdHkiOworCQkJZWxzZSB7CisJCQkJaW50IGosIGRzdF9sZW47CisKKwkJCQlpZiAobGFzdCAtIGZpcnN0ID4gMCkgeworCQkJCQlzb3VyY2UgPSB4cmVhbGxvYyhzb3VyY2UsCisJCQkJCQkJKGNvdW50ICsgbGFzdCAtIGZpcnN0KQorCQkJCQkJCSogc2l6ZW9mKGNoYXIgKikpOworCQkJCQlkZXN0aW5hdGlvbiA9IHhyZWFsbG9jKGRlc3RpbmF0aW9uLAorCQkJCQkJCShjb3VudCArIGxhc3QgLSBmaXJzdCkKKwkJCQkJCQkqIHNpemVvZihjaGFyICopKTsKKwkJCQkJbW9kZXMgPSB4cmVhbGxvYyhtb2RlcywKKwkJCQkJCQkoY291bnQgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoZW51bSB1cGRhdGVfbW9kZSkpOworCQkJCX0KKworCQkJCWRzdCA9IGFkZF9zbGFzaChkc3QpOworCQkJCWRzdF9sZW4gPSBzdHJsZW4oZHN0KSAtIDE7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgbGFzdCAtIGZpcnN0OyBqKyspIHsKKwkJCQkJY29uc3QgY2hhciAqcGF0aCA9CisJCQkJCQlhY3RpdmVfY2FjaGVbZmlyc3QgKyBqXS0+bmFtZTsKKwkJCQkJc291cmNlW2NvdW50ICsgal0gPSBwYXRoOworCQkJCQlkZXN0aW5hdGlvbltjb3VudCArIGpdID0KKwkJCQkJCXByZWZpeF9wYXRoKGRzdCwgZHN0X2xlbiwKKwkJCQkJCQlwYXRoICsgbGVuZ3RoKTsKKwkJCQkJbW9kZXNbY291bnQgKyBqXSA9IElOREVYOworCQkJCX0KKwkJCQljb3VudCArPSBsYXN0IC0gZmlyc3Q7CisJCQl9CisJCX0gZWxzZSBpZiAobHN0YXQoZHN0LCAmc3QpID09IDApIHsKKwkJCWJhZCA9ICJkZXN0aW5hdGlvbiBleGlzdHMiOworCQkJaWYgKGZvcmNlKSB7CisJCQkJLyoKKwkJCQkgKiBvbmx5IGZpbGVzIGNhbiBvdmVyd3JpdGUgZWFjaCBvdGhlcjoKKwkJCQkgKiBjaGVjayBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKwkJCQkgKi8KKwkJCQlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6ICVzOyIKKwkJCQkJCQkiIHdpbGwgb3ZlcndyaXRlIVxuIiwKKwkJCQkJCQliYWQpOworCQkJCQliYWQgPSBOVUxMOworCQkJCQlwYXRoX2xpc3RfaW5zZXJ0KGRzdCwgJm92ZXJ3cml0dGVuKTsKKwkJCQl9IGVsc2UKKwkJCQkJYmFkID0gIkNhbm5vdCBvdmVyd3JpdGUiOworCQkJfQorCQl9IGVsc2UgaWYgKGNhY2hlX25hbWVfcG9zKHNyYywgbGVuZ3RoKSA8IDApCisJCQliYWQgPSAibm90IHVuZGVyIHZlcnNpb24gY29udHJvbCI7CisJCWVsc2UgaWYgKHBhdGhfbGlzdF9oYXNfcGF0aCgmc3JjX2Zvcl9kc3QsIGRzdCkpCisJCQliYWQgPSAibXVsdGlwbGUgc291cmNlcyBmb3IgdGhlIHNhbWUgdGFyZ2V0IjsKKwkJZWxzZQorCQkJcGF0aF9saXN0X2luc2VydChkc3QsICZzcmNfZm9yX2RzdCk7CisKKwkJaWYgKGJhZCkgeworCQkJaWYgKGlnbm9yZV9lcnJvcnMpIHsKKwkJCQlpZiAoLS1jb3VudCA+IDApIHsKKwkJCQkJbWVtbW92ZShzb3VyY2UgKyBpLCBzb3VyY2UgKyBpICsgMSwKKwkJCQkJCShjb3VudCAtIGkpICogc2l6ZW9mKGNoYXIgKikpOworCQkJCQltZW1tb3ZlKGRlc3RpbmF0aW9uICsgaSwKKwkJCQkJCWRlc3RpbmF0aW9uICsgaSArIDEsCisJCQkJCQkoY291bnQgLSBpKSAqIHNpemVvZihjaGFyICopKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlkaWUgKCIlcywgc291cmNlPSVzLCBkZXN0aW5hdGlvbj0lcyIsCisJCQkJICAgICBiYWQsIHNyYywgZHN0KTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnNyYyA9IHNvdXJjZVtpXSwgKmRzdCA9IGRlc3RpbmF0aW9uW2ldOworCQllbnVtIHVwZGF0ZV9tb2RlIG1vZGUgPSBtb2Rlc1tpXTsKKwkJaWYgKHNob3dfb25seSB8fCB2ZXJib3NlKQorCQkJcHJpbnRmKCJSZW5hbWluZyAlcyB0byAlc1xuIiwgc3JjLCBkc3QpOworCQlpZiAoIXNob3dfb25seSAmJiBtb2RlICE9IElOREVYICYmCisJCQkJcmVuYW1lKHNyYywgZHN0KSA8IDAgJiYgIWlnbm9yZV9lcnJvcnMpCisJCQlkaWUgKCJyZW5hbWluZyAlcyBmYWlsZWQ6ICVzIiwgc3JjLCBzdHJlcnJvcihlcnJubykpOworCisJCWlmIChtb2RlID09IFdPUktJTkdfRElSRUNUT1JZKQorCQkJY29udGludWU7CisKKwkJaWYgKGNhY2hlX25hbWVfcG9zKHNyYywgc3RybGVuKHNyYykpID49IDApIHsKKwkJCXBhdGhfbGlzdF9pbnNlcnQoc3JjLCAmZGVsZXRlZCk7CisKKwkJCS8qIGRlc3RpbmF0aW9uIGNhbiBiZSBhIGRpcmVjdG9yeSB3aXRoIDEgZmlsZSBpbnNpZGUgKi8KKwkJCWlmIChwYXRoX2xpc3RfaGFzX3BhdGgoJm92ZXJ3cml0dGVuLCBkc3QpKQorCQkJCXBhdGhfbGlzdF9pbnNlcnQoZHN0LCAmY2hhbmdlZCk7CisJCQllbHNlCisJCQkJcGF0aF9saXN0X2luc2VydChkc3QsICZhZGRlZCk7CisJCX0gZWxzZQorCQkJcGF0aF9saXN0X2luc2VydChkc3QsICZhZGRlZCk7CisJfQorCisgICAgICAgIGlmIChzaG93X29ubHkpIHsKKwkJc2hvd19saXN0KCJDaGFuZ2VkICA6ICIsICZjaGFuZ2VkKTsKKwkJc2hvd19saXN0KCJBZGRpbmcgICA6ICIsICZhZGRlZCk7CisJCXNob3dfbGlzdCgiRGVsZXRpbmcgOiAiLCAmZGVsZXRlZCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoYW5nZWQubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGNoYW5nZWQuaXRlbXNbaV0ucGF0aDsKKwkJCWludCBqID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbal07CisKKwkJCWlmIChqIDwgMCkKKwkJCQlkaWUgKCJIdWg/IENhY2hlIGVudHJ5IGZvciAlcyB1bmtub3duPyIsIHBhdGgpOworCQkJcmVmcmVzaF9jYWNoZV9lbnRyeShjZSwgMCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgYWRkZWQubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGFkZGVkLml0ZW1zW2ldLnBhdGg7CisJCQlhZGRfZmlsZV90b19jYWNoZShwYXRoLCB2ZXJib3NlKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkZWxldGVkLm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGggPSBkZWxldGVkLml0ZW1zW2ldLnBhdGg7CisJCQlyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGgpOworCQkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCQl9CisKKwkJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkJICAgIGNsb3NlKG5ld2ZkKSB8fAorCQkJICAgIGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1uYW1lLXJldi5jIGIvYnVpbHRpbi1uYW1lLXJldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTRlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW5hbWUtcmV2LmMKQEAgLTAsMCArMSwyODIgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKKyNkZWZpbmUgQ1VUT0ZGX0RBVEVfU0xPUCA4NjQwMCAvKiBvbmUgZGF5ICovCisKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfcmV2X3VzYWdlW10gPQorCSJnaXQtbmFtZS1yZXYgWy0tdGFncyB8IC0tcmVmcz08cGF0dGVybj5dICggLS1hbGwgfCAtLXN0ZGluIHwgY29tbWl0dGlzaCBbY29tbWl0dGlzaC4uLl0gKVxuIjsKKwordHlwZWRlZiBzdHJ1Y3QgcmV2X25hbWUgeworCWNvbnN0IGNoYXIgKnRpcF9uYW1lOworCWludCBtZXJnZV90cmF2ZXJzYWxzOworCWludCBnZW5lcmF0aW9uOworfSByZXZfbmFtZTsKKworc3RhdGljIGxvbmcgY3V0b2ZmID0gTE9OR19NQVg7CisKK3N0YXRpYyB2b2lkIG5hbWVfcmV2KHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJY29uc3QgY2hhciAqdGlwX25hbWUsIGludCBtZXJnZV90cmF2ZXJzYWxzLCBpbnQgZ2VuZXJhdGlvbiwKKwkJaW50IGRlcmVmKQoreworCXN0cnVjdCByZXZfbmFtZSAqbmFtZSA9IChzdHJ1Y3QgcmV2X25hbWUgKiljb21taXQtPnV0aWw7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCWludCBwYXJlbnRfbnVtYmVyID0gMTsKKworCWlmICghY29tbWl0LT5vYmplY3QucGFyc2VkKQorCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKworCWlmIChjb21taXQtPmRhdGUgPCBjdXRvZmYpCisJCXJldHVybjsKKworCWlmIChkZXJlZikgeworCQljaGFyICpuZXdfbmFtZSA9IHhtYWxsb2Moc3RybGVuKHRpcF9uYW1lKSszKTsKKwkJc3RyY3B5KG5ld19uYW1lLCB0aXBfbmFtZSk7CisJCXN0cmNhdChuZXdfbmFtZSwgIl4wIik7CisJCXRpcF9uYW1lID0gbmV3X25hbWU7CisKKwkJaWYgKGdlbmVyYXRpb24pCisJCQlkaWUoImdlbmVyYXRpb246ICVkLCBidXQgZGVyZWY/IiwgZ2VuZXJhdGlvbik7CisJfQorCisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQluYW1lID0geG1hbGxvYyhzaXplb2YocmV2X25hbWUpKTsKKwkJY29tbWl0LT51dGlsID0gbmFtZTsKKwkJZ290byBjb3B5X2RhdGE7CisJfSBlbHNlIGlmIChuYW1lLT5tZXJnZV90cmF2ZXJzYWxzID4gbWVyZ2VfdHJhdmVyc2FscyB8fAorCQkJKG5hbWUtPm1lcmdlX3RyYXZlcnNhbHMgPT0gbWVyZ2VfdHJhdmVyc2FscyAmJgorCQkJIG5hbWUtPmdlbmVyYXRpb24gPiBnZW5lcmF0aW9uKSkgeworY29weV9kYXRhOgorCQluYW1lLT50aXBfbmFtZSA9IHRpcF9uYW1lOworCQluYW1lLT5tZXJnZV90cmF2ZXJzYWxzID0gbWVyZ2VfdHJhdmVyc2FsczsKKwkJbmFtZS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJfSBlbHNlCisJCXJldHVybjsKKworCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCXBhcmVudHM7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dCwgcGFyZW50X251bWJlcisrKSB7CisJCWlmIChwYXJlbnRfbnVtYmVyID4gMSkgeworCQkJaW50IGxlbiA9IHN0cmxlbih0aXBfbmFtZSk7CisJCQljaGFyICpuZXdfbmFtZSA9IHhtYWxsb2MobGVuICsKKwkJCQkxICsgZGVjaW1hbF9sZW5ndGgoZ2VuZXJhdGlvbikgKyAgLyogfjxuPiAqLworCQkJCTEgKyAyICsJCQkJICAvKiBeTk4gKi8KKwkJCQkxKTsKKworCQkJaWYgKGxlbiA+IDIgJiYgIXN0cmNtcCh0aXBfbmFtZSArIGxlbiAtIDIsICJeMCIpKQorCQkJCWxlbiAtPSAyOworCQkJaWYgKGdlbmVyYXRpb24gPiAwKQorCQkJCXNwcmludGYobmV3X25hbWUsICIlLipzfiVkXiVkIiwgbGVuLCB0aXBfbmFtZSwKKwkJCQkJCWdlbmVyYXRpb24sIHBhcmVudF9udW1iZXIpOworCQkJZWxzZQorCQkJCXNwcmludGYobmV3X25hbWUsICIlLipzXiVkIiwgbGVuLCB0aXBfbmFtZSwKKwkJCQkJCXBhcmVudF9udW1iZXIpOworCisJCQluYW1lX3JldihwYXJlbnRzLT5pdGVtLCBuZXdfbmFtZSwKKwkJCQltZXJnZV90cmF2ZXJzYWxzICsgMSAsIDAsIDApOworCQl9IGVsc2UgeworCQkJbmFtZV9yZXYocGFyZW50cy0+aXRlbSwgdGlwX25hbWUsIG1lcmdlX3RyYXZlcnNhbHMsCisJCQkJZ2VuZXJhdGlvbiArIDEsIDApOworCQl9CisJfQorfQorCitzdHJ1Y3QgbmFtZV9yZWZfZGF0YSB7CisJaW50IHRhZ3Nfb25seTsKKwljb25zdCBjaGFyICpyZWZfZmlsdGVyOworfTsKKworc3RhdGljIGludCBuYW1lX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZ3MsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwlzdHJ1Y3QgbmFtZV9yZWZfZGF0YSAqZGF0YSA9IGNiX2RhdGE7CisJaW50IGRlcmVmID0gMDsKKworCWlmIChkYXRhLT50YWdzX29ubHkgJiYgcHJlZml4Y21wKHBhdGgsICJyZWZzL3RhZ3MvIikpCisJCXJldHVybiAwOworCisJaWYgKGRhdGEtPnJlZl9maWx0ZXIgJiYgZm5tYXRjaChkYXRhLT5yZWZfZmlsdGVyLCBwYXRoLCAwKSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobyAmJiBvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopIG87CisJCWlmICghdC0+dGFnZ2VkKQorCQkJYnJlYWs7IC8qIGJyb2tlbiByZXBvc2l0b3J5ICovCisJCW8gPSBwYXJzZV9vYmplY3QodC0+dGFnZ2VkLT5zaGExKTsKKwkJZGVyZWYgPSAxOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCisJCWlmICghcHJlZml4Y21wKHBhdGgsICJyZWZzL2hlYWRzLyIpKQorCQkJcGF0aCA9IHBhdGggKyAxMTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChwYXRoLCAicmVmcy8iKSkKKwkJCXBhdGggPSBwYXRoICsgNTsKKworCQluYW1lX3Jldihjb21taXQsIHhzdHJkdXAocGF0aCksIDAsIDAsIGRlcmVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgYSBzdGF0aWMgYnVmZmVyICovCitzdGF0aWMgY29uc3QgY2hhciogZ2V0X3Jldl9uYW1lKHN0cnVjdCBvYmplY3QgKm8pCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworCXN0cnVjdCByZXZfbmFtZSAqbjsKKwlzdHJ1Y3QgY29tbWl0ICpjOworCisJaWYgKG8tPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCWMgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCW4gPSBjLT51dGlsOworCWlmICghbikKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCisJaWYgKCFuLT5nZW5lcmF0aW9uKQorCQlyZXR1cm4gbi0+dGlwX25hbWU7CisJZWxzZSB7CisJCWludCBsZW4gPSBzdHJsZW4obi0+dGlwX25hbWUpOworCQlpZiAobGVuID4gMiAmJiAhc3RyY21wKG4tPnRpcF9uYW1lICsgbGVuIC0gMiwgIl4wIikpCisJCQlsZW4gLT0gMjsKKwkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiUuKnN+JWQiLCBsZW4sIG4tPnRpcF9uYW1lLAorCQkJCW4tPmdlbmVyYXRpb24pOworCisJCXJldHVybiBidWZmZXI7CisJfQorfQorCitpbnQgY21kX25hbWVfcmV2KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBvYmplY3RfYXJyYXkgcmV2cyA9IHsgMCwgMCwgTlVMTCB9OworCWludCBhc19pcyA9IDAsIGFsbCA9IDAsIHRyYW5zZm9ybV9zdGRpbiA9IDA7CisJc3RydWN0IG5hbWVfcmVmX2RhdGEgZGF0YSA9IHsgMCwgTlVMTCB9OworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShuYW1lX3Jldl91c2FnZSk7CisKKwlmb3IgKC0tYXJnYywgKythcmd2OyBhcmdjOyAtLWFyZ2MsICsrYXJndikgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwkJaWYgKCFhc19pcyAmJiAoKmFyZ3YpWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoKmFyZ3YsICItLSIpKSB7CisJCQkJYXNfaXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiLS10YWdzIikpIHsKKwkJCQlkYXRhLnRhZ3Nfb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgIGlmICghcHJlZml4Y21wKCphcmd2LCAiLS1yZWZzPSIpKSB7CisJCQkJZGF0YS5yZWZfZmlsdGVyID0gKmFyZ3YgKyA3OworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiLS1hbGwiKSkgeworCQkJCWlmIChhcmdjID4gMSkKKwkJCQkJZGllKCJTcGVjaWZ5IGVpdGhlciBhIGxpc3QsIG9yIC0tYWxsLCBub3QgYm90aCEiKTsKKwkJCQlhbGwgPSAxOworCQkJCWN1dG9mZiA9IDA7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItLXN0ZGluIikpIHsKKwkJCQlpZiAoYXJnYyA+IDEpCisJCQkJCWRpZSgiU3BlY2lmeSBlaXRoZXIgYSBsaXN0LCBvciAtLXN0ZGluLCBub3QgYm90aCEiKTsKKwkJCQl0cmFuc2Zvcm1fc3RkaW4gPSAxOworCQkJCWN1dG9mZiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZShuYW1lX3Jldl91c2FnZSk7CisJCX0KKworCQlpZiAoZ2V0X3NoYTEoKmFyZ3YsIHNoYTEpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgc2hhMSBmb3IgJXMuIFNraXBwaW5nLlxuIiwKKwkJCQkJKmFyZ3YpOworCQkJY29udGludWU7CisJCX0KKworCQlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgKmFyZ3YsIDApOworCQlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgY29tbWl0IGZvciAlcy4gU2tpcHBpbmcuXG4iLAorCQkJCQkqYXJndik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKworCQlpZiAoY3V0b2ZmID4gY29tbWl0LT5kYXRlKQorCQkJY3V0b2ZmID0gY29tbWl0LT5kYXRlOworCisJCWFkZF9vYmplY3RfYXJyYXkoKHN0cnVjdCBvYmplY3QgKiljb21taXQsICphcmd2LCAmcmV2cyk7CisJfQorCisJaWYgKGN1dG9mZikKKwkJY3V0b2ZmID0gY3V0b2ZmIC0gQ1VUT0ZGX0RBVEVfU0xPUDsKKwlmb3JfZWFjaF9yZWYobmFtZV9yZWYsICZkYXRhKTsKKworCWlmICh0cmFuc2Zvcm1fc3RkaW4pIHsKKwkJY2hhciBidWZmZXJbMjA0OF07CisJCWNoYXIgKnAsICpwX3N0YXJ0OworCisJCXdoaWxlICghZmVvZihzdGRpbikpIHsKKwkJCWludCBmb3J0eSA9IDA7CisJCQlwID0gZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RkaW4pOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCisJCQlmb3IgKHBfc3RhcnQgPSBwOyAqcDsgcCsrKSB7CisjZGVmaW5lIGlzaGV4KHgpIChpc2RpZ2l0KCh4KSkgfHwgKCh4KSA+PSAnYScgJiYgKHgpIDw9ICdmJykpCisJCQkJaWYgKCFpc2hleCgqcCkpCisJCQkJCWZvcnR5ID0gMDsKKwkJCQllbHNlIGlmICgrK2ZvcnR5ID09IDQwICYmCisJCQkJCQkhaXNoZXgoKihwKzEpKSkgeworCQkJCQl1bnNpZ25lZCBjaGFyIHNoYTFbNDBdOworCQkJCQljb25zdCBjaGFyICpuYW1lID0gInVuZGVmaW5lZCI7CisJCQkJCWNoYXIgYyA9ICoocCsxKTsKKworCQkJCQlmb3J0eSA9IDA7CisKKwkJCQkJKihwKzEpID0gMDsKKwkJCQkJaWYgKCFnZXRfc2hhMShwIC0gMzksIHNoYTEpKSB7CisJCQkJCQlzdHJ1Y3Qgb2JqZWN0ICpvID0KKwkJCQkJCQlsb29rdXBfb2JqZWN0KHNoYTEpOworCQkJCQkJaWYgKG8pCisJCQkJCQkJbmFtZSA9IGdldF9yZXZfbmFtZShvKTsKKwkJCQkJfQorCQkJCQkqKHArMSkgPSBjOworCisJCQkJCWlmICghc3RyY21wKG5hbWUsICJ1bmRlZmluZWQiKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWZ3cml0ZShwX3N0YXJ0LCBwIC0gcF9zdGFydCArIDEsIDEsCisJCQkJCSAgICAgICBzdGRvdXQpOworCQkJCQlwcmludGYoIiAoJXMpIiwgbmFtZSk7CisJCQkJCXBfc3RhcnQgPSBwICsgMTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGZsdXNoICovCisJCQlpZiAocF9zdGFydCAhPSBwKQorCQkJCWZ3cml0ZShwX3N0YXJ0LCBwIC0gcF9zdGFydCwgMSwgc3Rkb3V0KTsKKwkJfQorCX0gZWxzZSBpZiAoYWxsKSB7CisJCWludCBpLCBtYXg7CisKKwkJbWF4ID0gZ2V0X21heF9vYmplY3RfaW5kZXgoKTsKKwkJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICogb2JqID0gZ2V0X2luZGV4ZWRfb2JqZWN0KGkpOworCQkJaWYgKCFvYmopCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzICVzXG4iLCBzaGExX3RvX2hleChvYmotPnNoYTEpLCBnZXRfcmV2X25hbWUob2JqKSk7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHJldnMubnI7IGkrKykKKwkJCXByaW50ZigiJXMgJXNcbiIsCisJCQkJcmV2cy5vYmplY3RzW2ldLm5hbWUsCisJCQkJZ2V0X3Jldl9uYW1lKHJldnMub2JqZWN0c1tpXS5pdGVtKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2J1aWx0aW4tcGFjay1vYmplY3RzLmMgYi9idWlsdGluLXBhY2stb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmY4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXBhY2stb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTc3OCBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibGlzdC1vYmplY3RzLmgiCisjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgcGFja191c2FnZVtdID0gIlwKK2dpdC1wYWNrLW9iamVjdHMgW3sgLXEgfCAtLXByb2dyZXNzIHwgLS1hbGwtcHJvZ3Jlc3MgfV0gXG5cCisJWy0tbG9jYWxdIFstLWluY3JlbWVudGFsXSBbLS13aW5kb3c9Tl0gWy0tZGVwdGg9Tl0gXG5cCisJWy0tbm8tcmV1c2UtZGVsdGFdIFstLWRlbHRhLWJhc2Utb2Zmc2V0XSBbLS1ub24tZW1wdHldIFxuXAorCVstLXJldnMgWy0tdW5wYWNrZWQgfCAtLWFsbF0qXSBbLS1yZWZsb2ddIFstLXN0ZG91dCB8IGJhc2UtbmFtZV0gXG5cCisJWzxyZWYtbGlzdCB8IDxvYmplY3QtbGlzdF0iOworCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5IHsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVpbnQzMl90IGNyYzMyOwkJLyogY3JjIG9mIHJhdyBwYWNrIGRhdGEgZm9yIHRoaXMgb2JqZWN0ICovCisJb2ZmX3Qgb2Zmc2V0OwkJLyogb2Zmc2V0IGludG8gdGhlIGZpbmFsIHBhY2sgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyogdW5jb21wcmVzc2VkIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgaGFzaDsJLyogbmFtZSBoaW50IGhhc2ggKi8KKwl1bnNpZ25lZCBpbnQgZGVwdGg7CS8qIGRlbHRhIGRlcHRoICovCisJc3RydWN0IHBhY2tlZF9naXQgKmluX3BhY2s7IAkvKiBhbHJlYWR5IGluIHBhY2sgKi8KKwlvZmZfdCBpbl9wYWNrX29mZnNldDsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpkZWx0YTsJLyogZGVsdGEgYmFzZSBvYmplY3QgKi8KKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpkZWx0YV9jaGlsZDsgLyogZGVsdGlmaWVkIG9iamVjdHMgd2hvIGJhc2VzIG1lICovCisJc3RydWN0IG9iamVjdF9lbnRyeSAqZGVsdGFfc2libGluZzsgLyogb3RoZXIgZGVsdGlmaWVkIG9iamVjdHMgd2hvCisJCQkJCSAgICAgKiB1c2VzIHRoZSBzYW1lIGJhc2UgYXMgbWUKKwkJCQkJICAgICAqLworCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZTsJLyogZGVsdGEgZGF0YSBzaXplICh1bmNvbXByZXNzZWQpICovCisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWVudW0gb2JqZWN0X3R5cGUgaW5fcGFja190eXBlOwkvKiBjb3VsZCBiZSBkZWx0YSAqLworCXVuc2lnbmVkIGNoYXIgaW5fcGFja19oZWFkZXJfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHByZWZlcnJlZF9iYXNlOyAvKiB3ZSBkbyBub3QgcGFjayB0aGlzLCBidXQgaXMgYXZhaWxhYmxlCisJCQkJICAgICAgICogdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBvYmplY3R0byBkZWx0YQorCQkJCSAgICAgICAqIG9iamVjdHMgYWdhaW5zdC4KKwkJCQkgICAgICAgKi8KK307CisKKy8qCisgKiBPYmplY3RzIHdlIGFyZSBnb2luZyB0byBwYWNrIGFyZSBjb2xsZWN0ZWQgaW4gb2JqZWN0cyBhcnJheSAoZHluYW1pY2FsbHkKKyAqIGV4cGFuZGVkKS4gIG5yX29iamVjdHMgJiBucl9hbGxvYyBjb250cm9scyB0aGlzIGFycmF5LiAgVGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgb3JkZXIgd2Ugc2VlIC0tIHR5cGljYWxseSByZXYtbGlzdCAtLW9iamVjdHMgb3JkZXIgdGhhdCBnaXZlcyB1cworICogbmljZSAibWluaW11bSBzZWVrIiBvcmRlci4KKyAqLworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKm9iamVjdHM7CitzdGF0aWMgdWludDMyX3QgbnJfb2JqZWN0cywgbnJfYWxsb2MsIG5yX3Jlc3VsdDsKKworc3RhdGljIGludCBub25fZW1wdHk7CitzdGF0aWMgaW50IG5vX3JldXNlX2RlbHRhOworc3RhdGljIGludCBsb2NhbDsKK3N0YXRpYyBpbnQgaW5jcmVtZW50YWw7CitzdGF0aWMgaW50IGFsbG93X29mc19kZWx0YTsKK3N0YXRpYyBjb25zdCBjaGFyICpwYWNrX3RtcF9uYW1lLCAqaWR4X3RtcF9uYW1lOworc3RhdGljIGNoYXIgdG1wbmFtZVtQQVRIX01BWF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWNrX2ZpbGVfc2hhMVsyMF07CitzdGF0aWMgaW50IHByb2dyZXNzID0gMTsKK3N0YXRpYyBpbnQgd2luZG93ID0gMTA7CitzdGF0aWMgaW50IGRlcHRoID0gNTA7CitzdGF0aWMgaW50IHBhY2tfdG9fc3Rkb3V0Oworc3RhdGljIGludCBudW1fcHJlZmVycmVkX2Jhc2U7CitzdGF0aWMgc3RydWN0IHByb2dyZXNzIHByb2dyZXNzX3N0YXRlOworCisvKgorICogVGhlIG9iamVjdCBuYW1lcyBpbiBvYmplY3RzIGFycmF5IGFyZSBoYXNoZWQgd2l0aCB0aGlzIGhhc2h0YWJsZSwKKyAqIHRvIGhlbHAgbG9va2luZyB1cCB0aGUgZW50cnkgYnkgb2JqZWN0IG5hbWUuCisgKiBUaGlzIGhhc2h0YWJsZSBpcyBidWlsdCBhZnRlciBhbGwgdGhlIG9iamVjdHMgYXJlIHNlZW4uCisgKi8KK3N0YXRpYyBpbnQgKm9iamVjdF9peDsKK3N0YXRpYyBpbnQgb2JqZWN0X2l4X2hhc2hzejsKKworLyoKKyAqIFBhY2sgaW5kZXggZm9yIGV4aXN0aW5nIHBhY2tzIGdpdmUgdXMgZWFzeSBhY2Nlc3MgdG8gdGhlIG9mZnNldHMgaW50bworICogY29ycmVzcG9uZGluZyBwYWNrIGZpbGUgd2hlcmUgZWFjaCBvYmplY3QncyBkYXRhIHN0YXJ0cywgYnV0IHRoZSBlbnRyaWVzCisgKiBkbyBub3Qgc3RvcmUgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gKHVuY29tcHJlc3NlZAorICogc2l6ZSBpcyBlYXNpbHkgYXZhaWxhYmxlIGJ5IGV4YW1pbmluZyB0aGUgcGFjayBlbnRyeSBoZWFkZXIpLiAgSXQgaXMKKyAqIGFsc28gcmF0aGVyIGV4cGVuc2l2ZSB0byBmaW5kIHRoZSBzaGExIGZvciBhbiBvYmplY3QgZ2l2ZW4gaXRzIG9mZnNldC4KKyAqCisgKiBXZSBidWlsZCBhIGhhc2h0YWJsZSBvZiBleGlzdGluZyBwYWNrcyAocGFja19yZXZpbmRleCksIGFuZCBrZWVwIHJldmVyc2UKKyAqIGluZGV4IGhlcmUgLS0gcGFjayBpbmRleCBmaWxlIGlzIHNvcnRlZCBieSBvYmplY3QgbmFtZSBtYXBwaW5nIHRvIG9mZnNldDsKKyAqIHRoaXMgcGFja19yZXZpbmRleFtdLnJldmluZGV4IGFycmF5IGlzIGEgbGlzdCBvZiBvZmZzZXQvaW5kZXhfbnIgcGFpcnMKKyAqIG9yZGVyZWQgYnkgb2Zmc2V0LCBzbyBpZiB5b3Uga25vdyB0aGUgb2Zmc2V0IG9mIGFuIG9iamVjdCwgbmV4dCBvZmZzZXQKKyAqIGlzIHdoZXJlIGl0cyBwYWNrZWQgcmVwcmVzZW50YXRpb24gZW5kcyBhbmQgdGhlIGluZGV4X25yIGNhbiBiZSB1c2VkIHRvCisgKiBnZXQgdGhlIG9iamVjdCBzaGExIGZyb20gdGhlIG1haW4gaW5kZXguCisgKi8KK3N0cnVjdCByZXZpbmRleF9lbnRyeSB7CisJb2ZmX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGludCBucjsKK307CitzdHJ1Y3QgcGFja19yZXZpbmRleCB7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJc3RydWN0IHJldmluZGV4X2VudHJ5ICpyZXZpbmRleDsKK307CitzdGF0aWMgc3RydWN0ICBwYWNrX3JldmluZGV4ICpwYWNrX3JldmluZGV4Oworc3RhdGljIGludCBwYWNrX3JldmluZGV4X2hhc2hzejsKKworLyoKKyAqIHN0YXRzCisgKi8KK3N0YXRpYyB1aW50MzJfdCB3cml0dGVuLCB3cml0dGVuX2RlbHRhOworc3RhdGljIHVpbnQzMl90IHJldXNlZCwgcmV1c2VkX2RlbHRhOworCitzdGF0aWMgaW50IHBhY2tfcmV2aW5kZXhfaXgoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJdW5zaWduZWQgbG9uZyB1aSA9ICh1bnNpZ25lZCBsb25nKXA7CisJaW50IGk7CisKKwl1aSA9IHVpIF4gKHVpID4+IDE2KTsgLyogZGVmZWF0IHN0cnVjdHVyZSBhbGlnbm1lbnQgKi8KKwlpID0gKGludCkodWkgJSBwYWNrX3JldmluZGV4X2hhc2hzeik7CisJd2hpbGUgKHBhY2tfcmV2aW5kZXhbaV0ucCkgeworCQlpZiAocGFja19yZXZpbmRleFtpXS5wID09IHApCisJCQlyZXR1cm4gaTsKKwkJaWYgKCsraSA9PSBwYWNrX3JldmluZGV4X2hhc2hzeikKKwkJCWkgPSAwOworCX0KKwlyZXR1cm4gLTEgLSBpOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3BhY2tfaXgodm9pZCkKK3sKKwlpbnQgbnVtOworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCWZvciAobnVtID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KQorCQludW0rKzsKKwlpZiAoIW51bSkKKwkJcmV0dXJuOworCXBhY2tfcmV2aW5kZXhfaGFzaHN6ID0gbnVtICogMTE7CisJcGFja19yZXZpbmRleCA9IHhjYWxsb2Moc2l6ZW9mKCpwYWNrX3JldmluZGV4KSwgcGFja19yZXZpbmRleF9oYXNoc3opOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCW51bSA9IHBhY2tfcmV2aW5kZXhfaXgocCk7CisJCW51bSA9IC0gMSAtIG51bTsKKwkJcGFja19yZXZpbmRleFtudW1dLnAgPSBwOworCX0KKwkvKiByZXZpbmRleCBlbGVtZW50cyBhcmUgbGF6aWx5IGluaXRpYWxpemVkICovCit9CisKK3N0YXRpYyBpbnQgY21wX29mZnNldChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJY29uc3Qgc3RydWN0IHJldmluZGV4X2VudHJ5ICphID0gYV87CisJY29uc3Qgc3RydWN0IHJldmluZGV4X2VudHJ5ICpiID0gYl87CisJcmV0dXJuIChhLT5vZmZzZXQgPCBiLT5vZmZzZXQpID8gLTEgOiAoYS0+b2Zmc2V0ID4gYi0+b2Zmc2V0KSA/IDEgOiAwOworfQorCisvKgorICogT3JkZXJlZCBsaXN0IG9mIG9mZnNldHMgb2Ygb2JqZWN0cyBpbiB0aGUgcGFjay4KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrX3JldmluZGV4KHN0cnVjdCBwYWNrX3JldmluZGV4ICpyaXgpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSByaXgtPnA7CisJaW50IG51bV9lbnQgPSBwLT5udW1fb2JqZWN0czsKKwlpbnQgaTsKKwljb25zdCBjaGFyICppbmRleCA9IHAtPmluZGV4X2RhdGE7CisKKwlyaXgtPnJldmluZGV4ID0geG1hbGxvYyhzaXplb2YoKnJpeC0+cmV2aW5kZXgpICogKG51bV9lbnQgKyAxKSk7CisJaW5kZXggKz0gNCAqIDI1NjsKKworCWlmIChwLT5pbmRleF92ZXJzaW9uID4gMSkgeworCQljb25zdCB1aW50MzJfdCAqb2ZmXzMyID0KKwkJCSh1aW50MzJfdCAqKShpbmRleCArIDggKyBwLT5udW1fb2JqZWN0cyAqICgyMCArIDQpKTsKKwkJY29uc3QgdWludDMyX3QgKm9mZl82NCA9IG9mZl8zMiArIHAtPm51bV9vYmplY3RzOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudDsgaSsrKSB7CisJCQl1aW50MzJfdCBvZmYgPSBudG9obCgqb2ZmXzMyKyspOworCQkJaWYgKCEob2ZmICYgMHg4MDAwMDAwMCkpIHsKKwkJCQlyaXgtPnJldmluZGV4W2ldLm9mZnNldCA9IG9mZjsKKwkJCX0gZWxzZSB7CisJCQkJcml4LT5yZXZpbmRleFtpXS5vZmZzZXQgPQorCQkJCQkoKHVpbnQ2NF90KW50b2hsKCpvZmZfNjQrKykpIDw8IDMyOworCQkJCXJpeC0+cmV2aW5kZXhbaV0ub2Zmc2V0IHw9CisJCQkJCW50b2hsKCpvZmZfNjQrKyk7CisJCQl9CisJCQlyaXgtPnJldmluZGV4W2ldLm5yID0gaTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fZW50OyBpKyspIHsKKwkJCXVpbnQzMl90IGhsID0gKigodWludDMyX3QgKikoaW5kZXggKyAyNCAqIGkpKTsKKwkJCXJpeC0+cmV2aW5kZXhbaV0ub2Zmc2V0ID0gbnRvaGwoaGwpOworCQkJcml4LT5yZXZpbmRleFtpXS5uciA9IGk7CisJCX0KKwl9CisKKwkvKiBUaGlzIGtub3dzIHRoZSBwYWNrIGZvcm1hdCAtLSB0aGUgMjAtYnl0ZSB0cmFpbGVyCisJICogZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBvYmplY3QgZGF0YS4KKwkgKi8KKwlyaXgtPnJldmluZGV4W251bV9lbnRdLm9mZnNldCA9IHAtPnBhY2tfc2l6ZSAtIDIwOworCXJpeC0+cmV2aW5kZXhbbnVtX2VudF0ubnIgPSAtMTsKKwlxc29ydChyaXgtPnJldmluZGV4LCBudW1fZW50LCBzaXplb2YoKnJpeC0+cmV2aW5kZXgpLCBjbXBfb2Zmc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCByZXZpbmRleF9lbnRyeSAqIGZpbmRfcGFja2VkX29iamVjdChzdHJ1Y3QgcGFja2VkX2dpdCAqcCwKKwkJCQkJCSAgb2ZmX3Qgb2ZzKQoreworCWludCBudW07CisJaW50IGxvLCBoaTsKKwlzdHJ1Y3QgcGFja19yZXZpbmRleCAqcml4OworCXN0cnVjdCByZXZpbmRleF9lbnRyeSAqcmV2aW5kZXg7CisJbnVtID0gcGFja19yZXZpbmRleF9peChwKTsKKwlpZiAobnVtIDwgMCkKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogcGFjayByZXZpbmRleCB1bmluaXRpYWxpemVkIik7CisJcml4ID0gJnBhY2tfcmV2aW5kZXhbbnVtXTsKKwlpZiAoIXJpeC0+cmV2aW5kZXgpCisJCXByZXBhcmVfcGFja19yZXZpbmRleChyaXgpOworCXJldmluZGV4ID0gcml4LT5yZXZpbmRleDsKKwlsbyA9IDA7CisJaGkgPSBwLT5udW1fb2JqZWN0cyArIDE7CisJZG8geworCQlpbnQgbWkgPSAobG8gKyBoaSkgLyAyOworCQlpZiAocmV2aW5kZXhbbWldLm9mZnNldCA9PSBvZnMpIHsKKwkJCXJldHVybiByZXZpbmRleCArIG1pOworCQl9CisJCWVsc2UgaWYgKG9mcyA8IHJldmluZGV4W21pXS5vZmZzZXQpCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlkaWUoImludGVybmFsIGVycm9yOiBwYWNrIHJldmluZGV4IGNvcnJ1cHQiKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZpbmRfcGFja2VkX29iamVjdF9uYW1lKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCQkJICAgIG9mZl90IG9mcykKK3sKKwlzdHJ1Y3QgcmV2aW5kZXhfZW50cnkgKmVudHJ5ID0gZmluZF9wYWNrZWRfb2JqZWN0KHAsIG9mcyk7CisJcmV0dXJuIG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgZW50cnktPm5yKTsKK30KKworc3RhdGljIHZvaWQgKmRlbHRhX2FnYWluc3Qodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgb3RoZXJzaXplLCBkZWx0YV9zaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpvdGhlcmJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LT5kZWx0YS0+c2hhMSwgJnR5cGUsICZvdGhlcnNpemUpOworCXZvaWQgKmRlbHRhX2J1ZjsKKworCWlmICghb3RoZXJidWYpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+ZGVsdGEtPnNoYTEpKTsKKyAgICAgICAgZGVsdGFfYnVmID0gZGlmZl9kZWx0YShvdGhlcmJ1Ziwgb3RoZXJzaXplLAorCQkJICAgICAgIGJ1Ziwgc2l6ZSwgJmRlbHRhX3NpemUsIDApOworICAgICAgICBpZiAoIWRlbHRhX2J1ZiB8fCBkZWx0YV9zaXplICE9IGVudHJ5LT5kZWx0YV9zaXplKQorICAgICAgICAJZGllKCJkZWx0YSBzaXplIGNoYW5nZWQiKTsKKyAgICAgICAgZnJlZShidWYpOworICAgICAgICBmcmVlKG90aGVyYnVmKTsKKwlyZXR1cm4gZGVsdGFfYnVmOworfQorCisvKgorICogVGhlIHBlci1vYmplY3QgaGVhZGVyIGlzIGEgcHJldHR5IGRlbnNlIHRoaW5nLCB3aGljaCBpcworICogIC0gZmlyc3QgYnl0ZTogbG93IGZvdXIgYml0cyBhcmUgInNpemUiLCB0aGVuIHRocmVlIGJpdHMgb2YgInR5cGUiLAorICogICAgYW5kIHRoZSBoaWdoIGJpdCBpcyAic2l6ZSBjb250aW51ZXMiLgorICogIC0gZWFjaCBieXRlIGFmdGVyd2FyZHM6IGxvdyBzZXZlbiBiaXRzIGFyZSBzaXplIGNvbnRpbnVhdGlvbiwKKyAqICAgIHdpdGggdGhlIGhpZ2ggYml0IGJlaW5nICJzaXplIGNvbnRpbnVlcyIKKyAqLworc3RhdGljIGludCBlbmNvZGVfaGVhZGVyKGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBjaGFyICpoZHIpCit7CisJaW50IG4gPSAxOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICh0eXBlIDwgT0JKX0NPTU1JVCB8fCB0eXBlID4gT0JKX1JFRl9ERUxUQSkKKwkJZGllKCJiYWQgdHlwZSAlZCIsIHR5cGUpOworCisJYyA9ICh0eXBlIDw8IDQpIHwgKHNpemUgJiAxNSk7CisJc2l6ZSA+Pj0gNDsKKwl3aGlsZSAoc2l6ZSkgeworCQkqaGRyKysgPSBjIHwgMHg4MDsKKwkJYyA9IHNpemUgJiAweDdmOworCQlzaXplID4+PSA3OworCQluKys7CisJfQorCSpoZHIgPSBjOworCXJldHVybiBuOworfQorCisvKgorICogd2UgYXJlIGdvaW5nIHRvIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZGF0YSBhcyBpcy4gIG1ha2UKKyAqIHN1cmUgaXQgaXMgbm90IGNvcnJ1cHQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcGFja19pbmZsYXRlKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQlzdHJ1Y3QgcGFja193aW5kb3cgKip3X2N1cnMsCisJCW9mZl90IG9mZnNldCwKKwkJb2ZmX3QgbGVuLAorCQl1bnNpZ25lZCBsb25nIGV4cGVjdCkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciBmYWtlYnVmWzQwOTZdLCAqaW47CisJaW50IHN0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlkbyB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBvZmZzZXQsICZzdHJlYW0uYXZhaWxfaW4pOworCQlzdHJlYW0ubmV4dF9pbiA9IGluOworCQlzdHJlYW0ubmV4dF9vdXQgPSBmYWtlYnVmOworCQlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGZha2VidWYpOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQlvZmZzZXQgKz0gc3RyZWFtLm5leHRfaW4gLSBpbjsKKwl9IHdoaWxlIChzdCA9PSBaX09LIHx8IHN0ID09IFpfQlVGX0VSUk9SKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCXJldHVybiAoc3QgPT0gWl9TVFJFQU1fRU5EICYmCisJCXN0cmVhbS50b3RhbF9vdXQgPT0gZXhwZWN0ICYmCisJCXN0cmVhbS50b3RhbF9pbiA9PSBsZW4pID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhY2tfY3JjKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBzdHJ1Y3QgcGFja193aW5kb3cgKip3X2N1cnMsCisJCQkgIG9mZl90IG9mZnNldCwgb2ZmX3QgbGVuLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJY29uc3QgdWludDMyX3QgKmluZGV4X2NyYzsKKwl1aW50MzJfdCBkYXRhX2NyYyA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7CisKKwlkbyB7CisJCXVuc2lnbmVkIGludCBhdmFpbDsKKwkJdm9pZCAqZGF0YSA9IHVzZV9wYWNrKHAsIHdfY3Vycywgb2Zmc2V0LCAmYXZhaWwpOworCQlpZiAoYXZhaWwgPiBsZW4pCisJCQlhdmFpbCA9IGxlbjsKKwkJZGF0YV9jcmMgPSBjcmMzMihkYXRhX2NyYywgZGF0YSwgYXZhaWwpOworCQlvZmZzZXQgKz0gYXZhaWw7CisJCWxlbiAtPSBhdmFpbDsKKwl9IHdoaWxlIChsZW4pOworCisJaW5kZXhfY3JjID0gcC0+aW5kZXhfZGF0YTsKKwlpbmRleF9jcmMgKz0gMiArIDI1NiArIHAtPm51bV9vYmplY3RzICogKDIwLzQpICsgbnI7CisKKwlyZXR1cm4gZGF0YV9jcmMgIT0gbnRvaGwoKmluZGV4X2NyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcGFja19kYXRhKHN0cnVjdCBzaGExZmlsZSAqZiwKKwkJc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJb2ZmX3Qgb2Zmc2V0LAorCQlvZmZfdCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqaW47CisJdW5zaWduZWQgaW50IGF2YWlsOworCisJd2hpbGUgKGxlbikgeworCQlpbiA9IHVzZV9wYWNrKHAsIHdfY3Vycywgb2Zmc2V0LCAmYXZhaWwpOworCQlpZiAoYXZhaWwgPiBsZW4pCisJCQlhdmFpbCA9ICh1bnNpZ25lZCBpbnQpbGVuOworCQlzaGExd3JpdGUoZiwgaW4sIGF2YWlsKTsKKwkJb2Zmc2V0ICs9IGF2YWlsOworCQlsZW4gLT0gYXZhaWw7CisJfQorfQorCitzdGF0aWMgaW50IGNoZWNrX2xvb3NlX2luZmxhdGUodW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZXhwZWN0KQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyIGZha2VidWZbNDA5Nl07CisJaW50IHN0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9pbiA9IGRhdGE7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCXN0cmVhbS5uZXh0X291dCA9IGZha2VidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihmYWtlYnVmKTsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCXdoaWxlICgxKSB7CisJCXN0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJCWlmIChzdCA9PSBaX1NUUkVBTV9FTkQgfHwgc3QgPT0gWl9PSykgeworCQkJc3QgPSAoc3RyZWFtLnRvdGFsX291dCA9PSBleHBlY3QgJiYKKwkJCSAgICAgIHN0cmVhbS50b3RhbF9pbiA9PSBsZW4pID8gMCA6IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0ICE9IFpfQlVGX0VSUk9SKSB7CisJCQlzdCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJc3RyZWFtLm5leHRfb3V0ID0gZmFrZWJ1ZjsKKwkJc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihmYWtlYnVmKTsKKwl9CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlyZXR1cm4gc3Q7Cit9CisKK3N0YXRpYyBpbnQgcmV2YWxpZGF0ZV9sb29zZV9vYmplY3Qoc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnksCisJCQkJICAgdW5zaWduZWQgY2hhciAqbWFwLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSkKK3sKKwkvKiB3ZSBhbHJlYWR5IGtub3cgdGhpcyBpcyBhIGxvb3NlIG9iamVjdCB3aXRoIG5ldyB0eXBlIGhlYWRlci4gKi8KKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplLCB1c2VkOworCisJaWYgKHBhY2tfdG9fc3Rkb3V0KQorCQlyZXR1cm4gMDsKKworCXVzZWQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcl9nZW50bHkobWFwLCBtYXBzaXplLCAmdHlwZSwgJnNpemUpOworCWlmICghdXNlZCkKKwkJcmV0dXJuIC0xOworCW1hcCArPSB1c2VkOworCW1hcHNpemUgLT0gdXNlZDsKKwlyZXR1cm4gY2hlY2tfbG9vc2VfaW5mbGF0ZShtYXAsIG1hcHNpemUsIHNpemUpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9vYmplY3Qoc3RydWN0IHNoYTFmaWxlICpmLAorCQkJCSAgc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOworCXVuc2lnbmVkIGhkcmxlbjsKKwlvZmZfdCBkYXRhbGVuOworCWVudW0gb2JqZWN0X3R5cGUgb2JqX3R5cGU7CisJaW50IHRvX3JldXNlID0gMDsKKworCWlmICghcGFja190b19zdGRvdXQpCisJCWNyYzMyX2JlZ2luKGYpOworCisJb2JqX3R5cGUgPSBlbnRyeS0+dHlwZTsKKwlpZiAoISBlbnRyeS0+aW5fcGFjaykKKwkJdG9fcmV1c2UgPSAwOwkvKiBjYW4ndCByZXVzZSB3aGF0IHdlIGRvbid0IGhhdmUgKi8KKwllbHNlIGlmIChvYmpfdHlwZSA9PSBPQkpfUkVGX0RFTFRBIHx8IG9ial90eXBlID09IE9CSl9PRlNfREVMVEEpCisJCXRvX3JldXNlID0gMTsJLyogY2hlY2tfb2JqZWN0KCkgZGVjaWRlZCBpdCBmb3IgdXMgKi8KKwllbHNlIGlmIChvYmpfdHlwZSAhPSBlbnRyeS0+aW5fcGFja190eXBlKQorCQl0b19yZXVzZSA9IDA7CS8qIHBhY2sgaGFzIGRlbHRhIHdoaWNoIGlzIHVudXNhYmxlICovCisJZWxzZSBpZiAoZW50cnktPmRlbHRhKQorCQl0b19yZXVzZSA9IDA7CS8qIHdlIHdhbnQgdG8gcGFjayBhZnJlc2ggKi8KKwllbHNlCisJCXRvX3JldXNlID0gMTsJLyogd2UgaGF2ZSBpdCBpbi1wYWNrIHVuZGVsdGlmaWVkLAorCQkJCSAqIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBkZWx0aWZ5IGl0LgorCQkJCSAqLworCisJaWYgKCFlbnRyeS0+aW5fcGFjayAmJiAhZW50cnktPmRlbHRhKSB7CisJCXVuc2lnbmVkIGNoYXIgKm1hcDsKKwkJdW5zaWduZWQgbG9uZyBtYXBzaXplOworCQltYXAgPSBtYXBfc2hhMV9maWxlKGVudHJ5LT5zaGExLCAmbWFwc2l6ZSk7CisJCWlmIChtYXAgJiYgIWxlZ2FjeV9sb29zZV9vYmplY3QobWFwKSkgeworCQkJLyogV2UgY2FuIGNvcHkgc3RyYWlnaHQgaW50byB0aGUgcGFjayBmaWxlICovCisJCQlpZiAocmV2YWxpZGF0ZV9sb29zZV9vYmplY3QoZW50cnksIG1hcCwgbWFwc2l6ZSkpCisJCQkJZGllKCJjb3JydXB0IGxvb3NlIG9iamVjdCAlcyIsCisJCQkJICAgIHNoYTFfdG9faGV4KGVudHJ5LT5zaGExKSk7CisJCQlzaGExd3JpdGUoZiwgbWFwLCBtYXBzaXplKTsKKwkJCW11bm1hcChtYXAsIG1hcHNpemUpOworCQkJd3JpdHRlbisrOworCQkJcmV1c2VkKys7CisJCQlyZXR1cm4gbWFwc2l6ZTsKKwkJfQorCQlpZiAobWFwKQorCQkJbXVubWFwKG1hcCwgbWFwc2l6ZSk7CisJfQorCisJaWYgKCF0b19yZXVzZSkgeworCQlidWYgPSByZWFkX3NoYTFfZmlsZShlbnRyeS0+c2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFidWYpCisJCQlkaWUoInVuYWJsZSB0byByZWFkICVzIiwgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKKwkJaWYgKHNpemUgIT0gZW50cnktPnNpemUpCisJCQlkaWUoIm9iamVjdCAlcyBzaXplIGluY29uc2lzdGVuY3kgKCVsdSB2cyAlbHUpIiwKKwkJCSAgICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSksIHNpemUsIGVudHJ5LT5zaXplKTsKKwkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQkJYnVmID0gZGVsdGFfYWdhaW5zdChidWYsIHNpemUsIGVudHJ5KTsKKwkJCXNpemUgPSBlbnRyeS0+ZGVsdGFfc2l6ZTsKKwkJCW9ial90eXBlID0gKGFsbG93X29mc19kZWx0YSAmJiBlbnRyeS0+ZGVsdGEtPm9mZnNldCkgPworCQkJCU9CSl9PRlNfREVMVEEgOiBPQkpfUkVGX0RFTFRBOworCQl9CisJCS8qCisJCSAqIFRoZSBvYmplY3QgaGVhZGVyIGlzIGEgYnl0ZSBvZiAndHlwZScgZm9sbG93ZWQgYnkgemVybyBvcgorCQkgKiBtb3JlIGJ5dGVzIG9mIGxlbmd0aC4KKwkJICovCisJCWhkcmxlbiA9IGVuY29kZV9oZWFkZXIob2JqX3R5cGUsIHNpemUsIGhlYWRlcik7CisJCXNoYTF3cml0ZShmLCBoZWFkZXIsIGhkcmxlbik7CisKKwkJaWYgKG9ial90eXBlID09IE9CSl9PRlNfREVMVEEpIHsKKwkJCS8qCisJCQkgKiBEZWx0YXMgd2l0aCByZWxhdGl2ZSBiYXNlIGNvbnRhaW4gYW4gYWRkaXRpb25hbAorCQkJICogZW5jb2Rpbmcgb2YgdGhlIHJlbGF0aXZlIG9mZnNldCBmb3IgdGhlIGRlbHRhCisJCQkgKiBiYXNlIGZyb20gdGhpcyBvYmplY3QncyBwb3NpdGlvbiBpbiB0aGUgcGFjay4KKwkJCSAqLworCQkJb2ZmX3Qgb2ZzID0gZW50cnktPm9mZnNldCAtIGVudHJ5LT5kZWx0YS0+b2Zmc2V0OworCQkJdW5zaWduZWQgcG9zID0gc2l6ZW9mKGhlYWRlcikgLSAxOworCQkJaGVhZGVyW3Bvc10gPSBvZnMgJiAxMjc7CisJCQl3aGlsZSAob2ZzID4+PSA3KQorCQkJCWhlYWRlclstLXBvc10gPSAxMjggfCAoLS1vZnMgJiAxMjcpOworCQkJc2hhMXdyaXRlKGYsIGhlYWRlciArIHBvcywgc2l6ZW9mKGhlYWRlcikgLSBwb3MpOworCQkJaGRybGVuICs9IHNpemVvZihoZWFkZXIpIC0gcG9zOworCQl9IGVsc2UgaWYgKG9ial90eXBlID09IE9CSl9SRUZfREVMVEEpIHsKKwkJCS8qCisJCQkgKiBEZWx0YXMgd2l0aCBhIGJhc2UgcmVmZXJlbmNlIGNvbnRhaW4KKwkJCSAqIGFuIGFkZGl0aW9uYWwgMjAgYnl0ZXMgZm9yIHRoZSBiYXNlIHNoYTEuCisJCQkgKi8KKwkJCXNoYTF3cml0ZShmLCBlbnRyeS0+ZGVsdGEtPnNoYTEsIDIwKTsKKwkJCWhkcmxlbiArPSAyMDsKKwkJfQorCQlkYXRhbGVuID0gc2hhMXdyaXRlX2NvbXByZXNzZWQoZiwgYnVmLCBzaXplKTsKKwkJZnJlZShidWYpOworCX0KKwllbHNlIHsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBlbnRyeS0+aW5fcGFjazsKKwkJc3RydWN0IHBhY2tfd2luZG93ICp3X2N1cnMgPSBOVUxMOworCQlzdHJ1Y3QgcmV2aW5kZXhfZW50cnkgKnJldmlkeDsKKwkJb2ZmX3Qgb2Zmc2V0OworCisJCWlmIChlbnRyeS0+ZGVsdGEpIHsKKwkJCW9ial90eXBlID0gKGFsbG93X29mc19kZWx0YSAmJiBlbnRyeS0+ZGVsdGEtPm9mZnNldCkgPworCQkJCU9CSl9PRlNfREVMVEEgOiBPQkpfUkVGX0RFTFRBOworCQkJcmV1c2VkX2RlbHRhKys7CisJCX0KKwkJaGRybGVuID0gZW5jb2RlX2hlYWRlcihvYmpfdHlwZSwgZW50cnktPnNpemUsIGhlYWRlcik7CisJCXNoYTF3cml0ZShmLCBoZWFkZXIsIGhkcmxlbik7CisJCWlmIChvYmpfdHlwZSA9PSBPQkpfT0ZTX0RFTFRBKSB7CisJCQlvZmZfdCBvZnMgPSBlbnRyeS0+b2Zmc2V0IC0gZW50cnktPmRlbHRhLT5vZmZzZXQ7CisJCQl1bnNpZ25lZCBwb3MgPSBzaXplb2YoaGVhZGVyKSAtIDE7CisJCQloZWFkZXJbcG9zXSA9IG9mcyAmIDEyNzsKKwkJCXdoaWxlIChvZnMgPj49IDcpCisJCQkJaGVhZGVyWy0tcG9zXSA9IDEyOCB8ICgtLW9mcyAmIDEyNyk7CisJCQlzaGExd3JpdGUoZiwgaGVhZGVyICsgcG9zLCBzaXplb2YoaGVhZGVyKSAtIHBvcyk7CisJCQloZHJsZW4gKz0gc2l6ZW9mKGhlYWRlcikgLSBwb3M7CisJCX0gZWxzZSBpZiAob2JqX3R5cGUgPT0gT0JKX1JFRl9ERUxUQSkgeworCQkJc2hhMXdyaXRlKGYsIGVudHJ5LT5kZWx0YS0+c2hhMSwgMjApOworCQkJaGRybGVuICs9IDIwOworCQl9CisKKwkJb2Zmc2V0ID0gZW50cnktPmluX3BhY2tfb2Zmc2V0OworCQlyZXZpZHggPSBmaW5kX3BhY2tlZF9vYmplY3QocCwgb2Zmc2V0KTsKKwkJZGF0YWxlbiA9IHJldmlkeFsxXS5vZmZzZXQgLSBvZmZzZXQ7CisJCWlmICghcGFja190b19zdGRvdXQgJiYgcC0+aW5kZXhfdmVyc2lvbiA+IDEgJiYKKwkJICAgIGNoZWNrX3BhY2tfY3JjKHAsICZ3X2N1cnMsIG9mZnNldCwgZGF0YWxlbiwgcmV2aWR4LT5ucikpCisJCQlkaWUoImJhZCBwYWNrZWQgb2JqZWN0IENSQyBmb3IgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+c2hhMSkpOworCQlvZmZzZXQgKz0gZW50cnktPmluX3BhY2tfaGVhZGVyX3NpemU7CisJCWRhdGFsZW4gLT0gZW50cnktPmluX3BhY2tfaGVhZGVyX3NpemU7CisJCWlmICghcGFja190b19zdGRvdXQgJiYgcC0+aW5kZXhfdmVyc2lvbiA9PSAxICYmCisJCSAgICBjaGVja19wYWNrX2luZmxhdGUocCwgJndfY3Vycywgb2Zmc2V0LCBkYXRhbGVuLCBlbnRyeS0+c2l6ZSkpCisJCQlkaWUoImNvcnJ1cHQgcGFja2VkIG9iamVjdCBmb3IgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+c2hhMSkpOworCQljb3B5X3BhY2tfZGF0YShmLCBwLCAmd19jdXJzLCBvZmZzZXQsIGRhdGFsZW4pOworCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCQlyZXVzZWQrKzsKKwl9CisJaWYgKGVudHJ5LT5kZWx0YSkKKwkJd3JpdHRlbl9kZWx0YSsrOworCXdyaXR0ZW4rKzsKKwlpZiAoIXBhY2tfdG9fc3Rkb3V0KQorCQllbnRyeS0+Y3JjMzIgPSBjcmMzMl9lbmQoZik7CisJcmV0dXJuIGhkcmxlbiArIGRhdGFsZW47Cit9CisKK3N0YXRpYyBvZmZfdCB3cml0ZV9vbmUoc3RydWN0IHNoYTFmaWxlICpmLAorCQkJICAgICAgIHN0cnVjdCBvYmplY3RfZW50cnkgKmUsCisJCQkgICAgICAgb2ZmX3Qgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCS8qIG9mZnNldCBpcyBub24gemVybyBpZiBvYmplY3QgaXMgd3JpdHRlbiBhbHJlYWR5LiAqLworCWlmIChlLT5vZmZzZXQgfHwgZS0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiBvZmZzZXQ7CisKKwkvKiBpZiB3ZSBhcmUgZGVsdGlmaWVkLCB3cml0ZSBvdXQgYmFzZSBvYmplY3QgZmlyc3QuICovCisJaWYgKGUtPmRlbHRhKQorCQlvZmZzZXQgPSB3cml0ZV9vbmUoZiwgZS0+ZGVsdGEsIG9mZnNldCk7CisKKwllLT5vZmZzZXQgPSBvZmZzZXQ7CisJc2l6ZSA9IHdyaXRlX29iamVjdChmLCBlKTsKKworCS8qIG1ha2Ugc3VyZSBvZmZfdCBpcyBzdWZmaWNpZW50bHkgbGFyZ2Ugbm90IHRvIHdyYXAgKi8KKwlpZiAob2Zmc2V0ID4gb2Zmc2V0ICsgc2l6ZSkKKwkJZGllKCJwYWNrIHRvbyBsYXJnZSBmb3IgY3VycmVudCBkZWZpbml0aW9uIG9mIG9mZl90Iik7CisJcmV0dXJuIG9mZnNldCArIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9vYmplY3RfZGlyX3RtcChjb25zdCBjaGFyICpwYXRoKQoreworICAgIHNucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIiVzLyVzIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgcGF0aCk7CisgICAgcmV0dXJuIG1rc3RlbXAodG1wbmFtZSk7Cit9CisKK3N0YXRpYyBvZmZfdCB3cml0ZV9wYWNrX2ZpbGUodm9pZCkKK3sKKwl1aW50MzJfdCBpOworCXN0cnVjdCBzaGExZmlsZSAqZjsKKwlvZmZfdCBvZmZzZXQsIGxhc3Rfb2JqX29mZnNldCA9IDA7CisJc3RydWN0IHBhY2tfaGVhZGVyIGhkcjsKKwlpbnQgZG9fcHJvZ3Jlc3MgPSBwcm9ncmVzczsKKworCWlmIChwYWNrX3RvX3N0ZG91dCkgeworCQlmID0gc2hhMWZkKDEsICI8c3Rkb3V0PiIpOworCQlkb19wcm9ncmVzcyA+Pj0gMTsKKwl9IGVsc2UgeworCQlpbnQgZmQgPSBvcGVuX29iamVjdF9kaXJfdG1wKCJ0bXBfcGFja19YWFhYWFgiKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSAlczogJXNcbiIsIHRtcG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXBhY2tfdG1wX25hbWUgPSB4c3RyZHVwKHRtcG5hbWUpOworCQlmID0gc2hhMWZkKGZkLCBwYWNrX3RtcF9uYW1lKTsKKwl9CisKKwlpZiAoZG9fcHJvZ3Jlc3MpCisJCXN0YXJ0X3Byb2dyZXNzKCZwcm9ncmVzc19zdGF0ZSwgIldyaXRpbmcgJXUgb2JqZWN0cy4uLiIsICIiLCBucl9yZXN1bHQpOworCisJaGRyLmhkcl9zaWduYXR1cmUgPSBodG9ubChQQUNLX1NJR05BVFVSRSk7CisJaGRyLmhkcl92ZXJzaW9uID0gaHRvbmwoUEFDS19WRVJTSU9OKTsKKwloZHIuaGRyX2VudHJpZXMgPSBodG9ubChucl9yZXN1bHQpOworCXNoYTF3cml0ZShmLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJb2Zmc2V0ID0gc2l6ZW9mKGhkcik7CisJaWYgKCFucl9yZXN1bHQpCisJCWdvdG8gZG9uZTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCWxhc3Rfb2JqX29mZnNldCA9IG9mZnNldDsKKwkJb2Zmc2V0ID0gd3JpdGVfb25lKGYsIG9iamVjdHMgKyBpLCBvZmZzZXQpOworCQlpZiAoZG9fcHJvZ3Jlc3MpCisJCQlkaXNwbGF5X3Byb2dyZXNzKCZwcm9ncmVzc19zdGF0ZSwgd3JpdHRlbik7CisJfQorCWlmIChkb19wcm9ncmVzcykKKwkJc3RvcF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUpOworIGRvbmU6CisJaWYgKHdyaXR0ZW4gIT0gbnJfcmVzdWx0KQorCQlkaWUoIndyb3RlICV1IG9iamVjdHMgd2hpbGUgZXhwZWN0aW5nICV1Iiwgd3JpdHRlbiwgbnJfcmVzdWx0KTsKKwlzaGExY2xvc2UoZiwgcGFja19maWxlX3NoYTEsIDEpOworCisJcmV0dXJuIGxhc3Rfb2JqX29mZnNldDsKK30KKworc3RhdGljIGludCBzaGExX3NvcnQoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKmEgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2E7CisJY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYiA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYjsKKwlyZXR1cm4gaGFzaGNtcChhLT5zaGExLCBiLT5zaGExKTsKK30KKworc3RhdGljIHVpbnQzMl90IGluZGV4X2RlZmF1bHRfdmVyc2lvbiA9IDE7CitzdGF0aWMgdWludDMyX3QgaW5kZXhfb2ZmMzJfbGltaXQgPSAweDdmZmZmZmZmOworCitzdGF0aWMgdm9pZCB3cml0ZV9pbmRleF9maWxlKG9mZl90IGxhc3Rfb2JqX29mZnNldCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmY7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqbGlzdCwgKipsYXN0OworCXVpbnQzMl90IGFycmF5WzI1Nl07CisJdWludDMyX3QgaSwgaW5kZXhfdmVyc2lvbjsKKwlTSEFfQ1RYIGN0eDsKKworCWludCBmZCA9IG9wZW5fb2JqZWN0X2Rpcl90bXAoInRtcF9pZHhfWFhYWFhYIik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlICVzOiAlc1xuIiwgdG1wbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZHhfdG1wX25hbWUgPSB4c3RyZHVwKHRtcG5hbWUpOworCWYgPSBzaGExZmQoZmQsIGlkeF90bXBfbmFtZSk7CisKKwlpZiAobnJfcmVzdWx0KSB7CisJCXVpbnQzMl90IGogPSAwOworCQlzb3J0ZWRfYnlfc2hhID0KKwkJCXhjYWxsb2MobnJfcmVzdWx0LCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspCisJCQlpZiAoIW9iamVjdHNbaV0ucHJlZmVycmVkX2Jhc2UpCisJCQkJc29ydGVkX2J5X3NoYVtqKytdID0gb2JqZWN0cyArIGk7CisJCWlmIChqICE9IG5yX3Jlc3VsdCkKKwkJCWRpZSgibGlzdGVkICV1IG9iamVjdHMgd2hpbGUgZXhwZWN0aW5nICV1IiwgaiwgbnJfcmVzdWx0KTsKKwkJcXNvcnQoc29ydGVkX2J5X3NoYSwgbnJfcmVzdWx0LCBzaXplb2YoKnNvcnRlZF9ieV9zaGEpLCBzaGExX3NvcnQpOworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJbGFzdCA9IHNvcnRlZF9ieV9zaGEgKyBucl9yZXN1bHQ7CisJfSBlbHNlCisJCXNvcnRlZF9ieV9zaGEgPSBsaXN0ID0gbGFzdCA9IE5VTEw7CisKKwkvKiBpZiBsYXN0IG9iamVjdCdzIG9mZnNldCBpcyA+PSAyXjMxIHdlIHNob3VsZCB1c2UgaW5kZXggVjIgKi8KKwlpbmRleF92ZXJzaW9uID0gKGxhc3Rfb2JqX29mZnNldCA+PiAzMSkgPyAyIDogaW5kZXhfZGVmYXVsdF92ZXJzaW9uOworCisJLyogaW5kZXggdmVyc2lvbnMgMiBhbmQgYWJvdmUgbmVlZCBhIGhlYWRlciAqLworCWlmIChpbmRleF92ZXJzaW9uID49IDIpIHsKKwkJc3RydWN0IHBhY2tfaWR4X2hlYWRlciBoZHI7CisJCWhkci5pZHhfc2lnbmF0dXJlID0gaHRvbmwoUEFDS19JRFhfU0lHTkFUVVJFKTsKKwkJaGRyLmlkeF92ZXJzaW9uID0gaHRvbmwoaW5kZXhfdmVyc2lvbik7CisJCXNoYTF3cml0ZShmLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJfQorCisJLyoKKwkgKiBXcml0ZSB0aGUgZmlyc3QtbGV2ZWwgdGFibGUgKHRoZSBsaXN0IGlzIHNvcnRlZCwKKwkgKiBidXQgd2UgdXNlIGEgMjU2LWVudHJ5IGxvb2t1cCB0byBiZSBhYmxlIHRvIGF2b2lkCisJICogaGF2aW5nIHRvIGRvIGVpZ2h0IGV4dHJhIGJpbmFyeSBzZWFyY2ggaXRlcmF0aW9ucykuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKipuZXh0ID0gbGlzdDsKKwkJd2hpbGUgKG5leHQgPCBsYXN0KSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpuZXh0OworCQkJaWYgKGVudHJ5LT5zaGExWzBdICE9IGkpCisJCQkJYnJlYWs7CisJCQluZXh0Kys7CisJCX0KKwkJYXJyYXlbaV0gPSBodG9ubChuZXh0IC0gc29ydGVkX2J5X3NoYSk7CisJCWxpc3QgPSBuZXh0OworCX0KKwlzaGExd3JpdGUoZiwgYXJyYXksIDI1NiAqIDQpOworCisJLyogQ29tcHV0ZSB0aGUgU0hBMSBoYXNoIG9mIHNvcnRlZCBvYmplY3QgbmFtZXMuICovCisJU0hBMV9Jbml0KCZjdHgpOworCisJLyogV3JpdGUgdGhlIGFjdHVhbCBTSEExIGVudHJpZXMuICovCisJbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJZm9yIChpID0gMDsgaSA8IG5yX3Jlc3VsdDsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5ID0gKmxpc3QrKzsKKwkJaWYgKGluZGV4X3ZlcnNpb24gPCAyKSB7CisJCQl1aW50MzJfdCBvZmZzZXQgPSBodG9ubChlbnRyeS0+b2Zmc2V0KTsKKwkJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJfQorCQlzaGExd3JpdGUoZiwgZW50cnktPnNoYTEsIDIwKTsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgZW50cnktPnNoYTEsIDIwKTsKKwl9CisKKwlpZiAoaW5kZXhfdmVyc2lvbiA+PSAyKSB7CisJCXVuc2lnbmVkIGludCBucl9sYXJnZV9vZmZzZXQgPSAwOworCisJCS8qIHdyaXRlIHRoZSBjcmMzMiB0YWJsZSAqLworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSAqbGlzdCsrOworCQkJdWludDMyX3QgY3JjMzJfdmFsID0gaHRvbmwoZW50cnktPmNyYzMyKTsKKwkJCXNoYTF3cml0ZShmLCAmY3JjMzJfdmFsLCA0KTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSAzMi1iaXQgb2Zmc2V0IHRhYmxlICovCisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpsaXN0Kys7CisJCQl1aW50MzJfdCBvZmZzZXQgPSAoZW50cnktPm9mZnNldCA8PSBpbmRleF9vZmYzMl9saW1pdCkgPworCQkJCWVudHJ5LT5vZmZzZXQgOiAoMHg4MDAwMDAwMCB8IG5yX2xhcmdlX29mZnNldCsrKTsKKwkJCW9mZnNldCA9IGh0b25sKG9mZnNldCk7CisJCQlzaGExd3JpdGUoZiwgJm9mZnNldCwgNCk7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgbGFyZ2Ugb2Zmc2V0IHRhYmxlICovCisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQl3aGlsZSAobnJfbGFyZ2Vfb2Zmc2V0KSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpsaXN0Kys7CisJCQl1aW50NjRfdCBvZmZzZXQgPSBlbnRyeS0+b2Zmc2V0OworCQkJaWYgKG9mZnNldCA+IGluZGV4X29mZjMyX2xpbWl0KSB7CisJCQkJdWludDMyX3Qgc3BsaXRbMl07CisJCQkJc3BsaXRbMF0gICAgICAgID0gaHRvbmwob2Zmc2V0ID4+IDMyKTsKKwkJCQlzcGxpdFsxXSA9IGh0b25sKG9mZnNldCAmIDB4ZmZmZmZmZmYpOworCQkJCXNoYTF3cml0ZShmLCBzcGxpdCwgOCk7CisJCQkJbnJfbGFyZ2Vfb2Zmc2V0LS07CisJCQl9CisJCX0KKwl9CisKKwlzaGExd3JpdGUoZiwgcGFja19maWxlX3NoYTEsIDIwKTsKKwlzaGExY2xvc2UoZiwgTlVMTCwgMSk7CisJZnJlZShzb3J0ZWRfYnlfc2hhKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworfQorCitzdGF0aWMgaW50IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB1aTsKKwltZW1jcHkoJnVpLCBzaGExLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisJaSA9IHVpICUgb2JqZWN0X2l4X2hhc2hzejsKKwl3aGlsZSAoMCA8IG9iamVjdF9peFtpXSkgeworCQlpZiAoIWhhc2hjbXAoc2hhMSwgb2JqZWN0c1tvYmplY3RfaXhbaV0gLSAxXS5zaGExKSkKKwkJCXJldHVybiBpOworCQlpZiAoKytpID09IG9iamVjdF9peF9oYXNoc3opCisJCQlpID0gMDsKKwl9CisJcmV0dXJuIC0xIC0gaTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKmxvY2F0ZV9vYmplY3RfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKworCWlmICghb2JqZWN0X2l4X2hhc2hzeikKKwkJcmV0dXJuIE5VTEw7CisKKwlpID0gbG9jYXRlX29iamVjdF9lbnRyeV9oYXNoKHNoYTEpOworCWlmICgwIDw9IGkpCisJCXJldHVybiAmb2JqZWN0c1tvYmplY3RfaXhbaV0tMV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlaGFzaF9vYmplY3RzKHZvaWQpCit7CisJdWludDMyX3QgaTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZTsKKworCW9iamVjdF9peF9oYXNoc3ogPSBucl9vYmplY3RzICogMzsKKwlpZiAob2JqZWN0X2l4X2hhc2hzeiA8IDEwMjQpCisJCW9iamVjdF9peF9oYXNoc3ogPSAxMDI0OworCW9iamVjdF9peCA9IHhyZWFsbG9jKG9iamVjdF9peCwgc2l6ZW9mKGludCkgKiBvYmplY3RfaXhfaGFzaHN6KTsKKwltZW1zZXQob2JqZWN0X2l4LCAwLCBzaXplb2YoaW50KSAqIG9iamVjdF9peF9oYXNoc3opOworCWZvciAoaSA9IDAsIG9lID0gb2JqZWN0czsgaSA8IG5yX29iamVjdHM7IGkrKywgb2UrKykgeworCQlpbnQgaXggPSBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2gob2UtPnNoYTEpOworCQlpZiAoMCA8PSBpeCkKKwkJCWNvbnRpbnVlOworCQlpeCA9IC0xIC0gaXg7CisJCW9iamVjdF9peFtpeF0gPSBpICsgMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgaGFzaCA9IDA7CisKKwkvKgorCSAqIFRoaXMgZWZmZWN0aXZlbHkganVzdCBjcmVhdGVzIGEgc29ydGFibGUgbnVtYmVyIGZyb20gdGhlCisJICogbGFzdCBzaXh0ZWVuIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuIExhc3QgY2hhcmFjdGVycworCSAqIGNvdW50ICJtb3N0Iiwgc28gdGhpbmdzIHRoYXQgZW5kIGluICIuYyIgc29ydCB0b2dldGhlci4KKwkgKi8KKwl3aGlsZSAoKGMgPSAqbmFtZSsrKSAhPSAwKSB7CisJCWlmIChpc3NwYWNlKGMpKQorCQkJY29udGludWU7CisJCWhhc2ggPSAoaGFzaCA+PiAyKSArIChjIDw8IDI0KTsKKwl9CisJcmV0dXJuIGhhc2g7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29iamVjdF9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCQkgICAgdW5zaWduZWQgaGFzaCwgaW50IGV4Y2x1ZGUpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnk7CisJc3RydWN0IHBhY2tlZF9naXQgKnAsICpmb3VuZF9wYWNrID0gTlVMTDsKKwlvZmZfdCBmb3VuZF9vZmZzZXQgPSAwOworCWludCBpeDsKKworCWl4ID0gbnJfb2JqZWN0cyA/IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChzaGExKSA6IC0xOworCWlmIChpeCA+PSAwKSB7CisJCWlmIChleGNsdWRlKSB7CisJCQllbnRyeSA9IG9iamVjdHMgKyBvYmplY3RfaXhbaXhdIC0gMTsKKwkJCWlmICghZW50cnktPnByZWZlcnJlZF9iYXNlKQorCQkJCW5yX3Jlc3VsdC0tOworCQkJZW50cnktPnByZWZlcnJlZF9iYXNlID0gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQlvZmZfdCBvZmZzZXQgPSBmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsIHApOworCQlpZiAob2Zmc2V0KSB7CisJCQlpZiAoIWZvdW5kX3BhY2spIHsKKwkJCQlmb3VuZF9vZmZzZXQgPSBvZmZzZXQ7CisJCQkJZm91bmRfcGFjayA9IHA7CisJCQl9CisJCQlpZiAoZXhjbHVkZSkKKwkJCQlicmVhazsKKwkJCWlmIChpbmNyZW1lbnRhbCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChsb2NhbCAmJiAhcC0+cGFja19sb2NhbCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChucl9vYmplY3RzID49IG5yX2FsbG9jKSB7CisJCW5yX2FsbG9jID0gKG5yX2FsbG9jICArIDEwMjQpICogMyAvIDI7CisJCW9iamVjdHMgPSB4cmVhbGxvYyhvYmplY3RzLCBucl9hbGxvYyAqIHNpemVvZigqZW50cnkpKTsKKwl9CisKKwllbnRyeSA9IG9iamVjdHMgKyBucl9vYmplY3RzKys7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisJaGFzaGNweShlbnRyeS0+c2hhMSwgc2hhMSk7CisJZW50cnktPmhhc2ggPSBoYXNoOworCWlmICh0eXBlKQorCQllbnRyeS0+dHlwZSA9IHR5cGU7CisJaWYgKGV4Y2x1ZGUpCisJCWVudHJ5LT5wcmVmZXJyZWRfYmFzZSA9IDE7CisJZWxzZQorCQlucl9yZXN1bHQrKzsKKwlpZiAoZm91bmRfcGFjaykgeworCQllbnRyeS0+aW5fcGFjayA9IGZvdW5kX3BhY2s7CisJCWVudHJ5LT5pbl9wYWNrX29mZnNldCA9IGZvdW5kX29mZnNldDsKKwl9CisKKwlpZiAob2JqZWN0X2l4X2hhc2hzeiAqIDMgPD0gbnJfb2JqZWN0cyAqIDQpCisJCXJlaGFzaF9vYmplY3RzKCk7CisJZWxzZQorCQlvYmplY3RfaXhbLTEgLSBpeF0gPSBucl9vYmplY3RzOworCisJaWYgKHByb2dyZXNzKQorCQlkaXNwbGF5X3Byb2dyZXNzKCZwcm9ncmVzc19zdGF0ZSwgbnJfb2JqZWN0cyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHJlZjsKKwlpbnQgdGVtcG9yYXJ5OworCXZvaWQgKnRyZWVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRyZWVfc2l6ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSAqKHBiYXNlX3RyZWVfY2FjaGVbMjU2XSk7CitzdGF0aWMgaW50IHBiYXNlX3RyZWVfY2FjaGVfaXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gc2hhMVswXSAlIEFSUkFZX1NJWkUocGJhc2VfdHJlZV9jYWNoZSk7Cit9CitzdGF0aWMgaW50IHBiYXNlX3RyZWVfY2FjaGVfaXhfaW5jcihpbnQgaXgpCit7CisJcmV0dXJuIChpeCsxKSAlIEFSUkFZX1NJWkUocGJhc2VfdHJlZV9jYWNoZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGJhc2VfdHJlZSB7CisJc3RydWN0IHBiYXNlX3RyZWUgKm5leHQ7CisJLyogVGhpcyBpcyBhIHBob255ICJjYWNoZSIgZW50cnk7IHdlIGFyZSBub3QKKwkgKiBnb2luZyB0byBldmljdCBpdCBub3IgZmluZCBpdCB0aHJvdWdoIF9nZXQoKQorCSAqIG1lY2hhbmlzbSAtLSB0aGlzIGlzIGZvciB0aGUgdG9wbGV2ZWwgbm9kZSB0aGF0CisJICogd291bGQgYWxtb3N0IGFsd2F5cyBjaGFuZ2Ugd2l0aCBhbnkgY29tbWl0LgorCSAqLworCXN0cnVjdCBwYmFzZV90cmVlX2NhY2hlIHBjYWNoZTsKK30gKnBiYXNlX3RyZWU7CisKK3N0YXRpYyBzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSAqcGJhc2VfdHJlZV9nZXQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSAqZW50LCAqbmVudDsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJaW50IG5laWdoOworCWludCBteV9peCA9IHBiYXNlX3RyZWVfY2FjaGVfaXgoc2hhMSk7CisJaW50IGF2YWlsYWJsZV9peCA9IC0xOworCisJLyogcGJhc2UtdHJlZS1jYWNoZSBhY3RzIGFzIGEgbGltaXRlZCBoYXNodGFibGUuCisJICogeW91ciBvYmplY3Qgd2lsbCBiZSBmb3VuZCBhdCB5b3VyIGluZGV4IG9yIHdpdGhpbiBhIGZldworCSAqIHNsb3RzIGFmdGVyIHRoYXQgc2xvdCBpZiBpdCBpcyBjYWNoZWQuCisJICovCisJZm9yIChuZWlnaCA9IDA7IG5laWdoIDwgODsgbmVpZ2grKykgeworCQllbnQgPSBwYmFzZV90cmVlX2NhY2hlW215X2l4XTsKKwkJaWYgKGVudCAmJiAhaGFzaGNtcChlbnQtPnNoYTEsIHNoYTEpKSB7CisJCQllbnQtPnJlZisrOworCQkJcmV0dXJuIGVudDsKKwkJfQorCQllbHNlIGlmICgoKGF2YWlsYWJsZV9peCA8IDApICYmICghZW50IHx8ICFlbnQtPnJlZikpIHx8CisJCQkgKCgwIDw9IGF2YWlsYWJsZV9peCkgJiYKKwkJCSAgKCFlbnQgJiYgcGJhc2VfdHJlZV9jYWNoZVthdmFpbGFibGVfaXhdKSkpCisJCQlhdmFpbGFibGVfaXggPSBteV9peDsKKwkJaWYgKCFlbnQpCisJCQlicmVhazsKKwkJbXlfaXggPSBwYmFzZV90cmVlX2NhY2hlX2l4X2luY3IobXlfaXgpOworCX0KKworCS8qIERpZCBub3QgZmluZCBvbmUuICBFaXRoZXIgd2UgZ290IGEgYm9ndXMgcmVxdWVzdCBvcgorCSAqIHdlIG5lZWQgdG8gcmVhZCBhbmQgcGVyaGFwcyBjYWNoZS4KKwkgKi8KKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBOVUxMOworCWlmICh0eXBlICE9IE9CSl9UUkVFKSB7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFdlIG5lZWQgdG8gZWl0aGVyIGNhY2hlIG9yIHJldHVybiBhIHRocm93YXdheSBjb3B5ICovCisKKwlpZiAoYXZhaWxhYmxlX2l4IDwgMCkKKwkJZW50ID0gTlVMTDsKKwllbHNlIHsKKwkJZW50ID0gcGJhc2VfdHJlZV9jYWNoZVthdmFpbGFibGVfaXhdOworCQlteV9peCA9IGF2YWlsYWJsZV9peDsKKwl9CisKKwlpZiAoIWVudCkgeworCQluZW50ID0geG1hbGxvYyhzaXplb2YoKm5lbnQpKTsKKwkJbmVudC0+dGVtcG9yYXJ5ID0gKGF2YWlsYWJsZV9peCA8IDApOworCX0KKwllbHNlIHsKKwkJLyogZXZpY3QgYW5kIHJldXNlICovCisJCWZyZWUoZW50LT50cmVlX2RhdGEpOworCQluZW50ID0gZW50OworCX0KKwloYXNoY3B5KG5lbnQtPnNoYTEsIHNoYTEpOworCW5lbnQtPnRyZWVfZGF0YSA9IGRhdGE7CisJbmVudC0+dHJlZV9zaXplID0gc2l6ZTsKKwluZW50LT5yZWYgPSAxOworCWlmICghbmVudC0+dGVtcG9yYXJ5KQorCQlwYmFzZV90cmVlX2NhY2hlW215X2l4XSA9IG5lbnQ7CisJcmV0dXJuIG5lbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHBiYXNlX3RyZWVfcHV0KHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICpjYWNoZSkKK3sKKwlpZiAoIWNhY2hlLT50ZW1wb3JhcnkpIHsKKwkJY2FjaGUtPnJlZi0tOworCQlyZXR1cm47CisJfQorCWZyZWUoY2FjaGUtPnRyZWVfZGF0YSk7CisJZnJlZShjYWNoZSk7Cit9CisKK3N0YXRpYyBpbnQgbmFtZV9jbXBfbGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgbmFtZVtpXSAmJiBuYW1lW2ldICE9ICdcbicgJiYgbmFtZVtpXSAhPSAnLyc7IGkrKykKKwkJOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGJhc2Vfb2JqZWN0KHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGludCBjbXBsZW4sCisJCQkgICAgIGNvbnN0IGNoYXIgKmZ1bGxuYW1lKQoreworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCWludCBjbXA7CisKKwl3aGlsZSAodHJlZV9lbnRyeSh0cmVlLCZlbnRyeSkpIHsKKwkJY21wID0gdHJlZV9lbnRyeV9sZW4oZW50cnkucGF0aCwgZW50cnkuc2hhMSkgIT0gY21wbGVuID8gMSA6CisJCSAgICAgIG1lbWNtcChuYW1lLCBlbnRyeS5wYXRoLCBjbXBsZW4pOworCQlpZiAoY21wID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY21wIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKG5hbWVbY21wbGVuXSAhPSAnLycpIHsKKwkJCXVuc2lnbmVkIGhhc2ggPSBuYW1lX2hhc2goZnVsbG5hbWUpOworCQkJYWRkX29iamVjdF9lbnRyeShlbnRyeS5zaGExLAorCQkJCQkgU19JU0RJUihlbnRyeS5tb2RlKSA/IE9CSl9UUkVFIDogT0JKX0JMT0IsCisJCQkJCSBoYXNoLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJc3RydWN0IHRyZWVfZGVzYyBzdWI7CisJCQlzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSAqdHJlZTsKKwkJCWNvbnN0IGNoYXIgKmRvd24gPSBuYW1lK2NtcGxlbisxOworCQkJaW50IGRvd25sZW4gPSBuYW1lX2NtcF9sZW4oZG93bik7CisKKwkJCXRyZWUgPSBwYmFzZV90cmVlX2dldChlbnRyeS5zaGExKTsKKwkJCWlmICghdHJlZSkKKwkJCQlyZXR1cm47CisJCQlpbml0X3RyZWVfZGVzYygmc3ViLCB0cmVlLT50cmVlX2RhdGEsIHRyZWUtPnRyZWVfc2l6ZSk7CisKKwkJCWFkZF9wYmFzZV9vYmplY3QoJnN1YiwgZG93biwgZG93bmxlbiwgZnVsbG5hbWUpOworCQkJcGJhc2VfdHJlZV9wdXQodHJlZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCAqZG9uZV9wYmFzZV9wYXRoczsKK3N0YXRpYyBpbnQgZG9uZV9wYmFzZV9wYXRoc19udW07CitzdGF0aWMgaW50IGRvbmVfcGJhc2VfcGF0aHNfYWxsb2M7CitzdGF0aWMgaW50IGRvbmVfcGJhc2VfcGF0aF9wb3ModW5zaWduZWQgaGFzaCkKK3sKKwlpbnQgbG8gPSAwOworCWludCBoaSA9IGRvbmVfcGJhc2VfcGF0aHNfbnVtOworCXdoaWxlIChsbyA8IGhpKSB7CisJCWludCBtaSA9IChoaSArIGxvKSAvIDI7CisJCWlmIChkb25lX3BiYXNlX3BhdGhzW21pXSA9PSBoYXNoKQorCQkJcmV0dXJuIG1pOworCQlpZiAoZG9uZV9wYmFzZV9wYXRoc1ttaV0gPCBoYXNoKQorCQkJaGkgPSBtaTsKKwkJZWxzZQorCQkJbG8gPSBtaSArIDE7CisJfQorCXJldHVybiAtbG8tMTsKK30KKworc3RhdGljIGludCBjaGVja19wYmFzZV9wYXRoKHVuc2lnbmVkIGhhc2gpCit7CisJaW50IHBvcyA9ICghZG9uZV9wYmFzZV9wYXRocykgPyAtMSA6IGRvbmVfcGJhc2VfcGF0aF9wb3MoaGFzaCk7CisJaWYgKDAgPD0gcG9zKQorCQlyZXR1cm4gMTsKKwlwb3MgPSAtcG9zIC0gMTsKKwlpZiAoZG9uZV9wYmFzZV9wYXRoc19hbGxvYyA8PSBkb25lX3BiYXNlX3BhdGhzX251bSkgeworCQlkb25lX3BiYXNlX3BhdGhzX2FsbG9jID0gYWxsb2NfbnIoZG9uZV9wYmFzZV9wYXRoc19hbGxvYyk7CisJCWRvbmVfcGJhc2VfcGF0aHMgPSB4cmVhbGxvYyhkb25lX3BiYXNlX3BhdGhzLAorCQkJCQkgICAgZG9uZV9wYmFzZV9wYXRoc19hbGxvYyAqCisJCQkJCSAgICBzaXplb2YodW5zaWduZWQpKTsKKwl9CisJZG9uZV9wYmFzZV9wYXRoc19udW0rKzsKKwlpZiAocG9zIDwgZG9uZV9wYmFzZV9wYXRoc19udW0pCisJCW1lbW1vdmUoZG9uZV9wYmFzZV9wYXRocyArIHBvcyArIDEsCisJCQlkb25lX3BiYXNlX3BhdGhzICsgcG9zLAorCQkJKGRvbmVfcGJhc2VfcGF0aHNfbnVtIC0gcG9zIC0gMSkgKiBzaXplb2YodW5zaWduZWQpKTsKKwlkb25lX3BiYXNlX3BhdGhzW3Bvc10gPSBoYXNoOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfcHJlZmVycmVkX2Jhc2Vfb2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGhhc2gpCit7CisJc3RydWN0IHBiYXNlX3RyZWUgKml0OworCWludCBjbXBsZW47CisKKwlpZiAoIW51bV9wcmVmZXJyZWRfYmFzZSB8fCBjaGVja19wYmFzZV9wYXRoKGhhc2gpKQorCQlyZXR1cm47CisKKwljbXBsZW4gPSBuYW1lX2NtcF9sZW4obmFtZSk7CisJZm9yIChpdCA9IHBiYXNlX3RyZWU7IGl0OyBpdCA9IGl0LT5uZXh0KSB7CisJCWlmIChjbXBsZW4gPT0gMCkgeworCQkJYWRkX29iamVjdF9lbnRyeShpdC0+cGNhY2hlLnNoYTEsIE9CSl9UUkVFLCAwLCAxKTsKKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCB0cmVlX2Rlc2MgdHJlZTsKKwkJCWluaXRfdHJlZV9kZXNjKCZ0cmVlLCBpdC0+cGNhY2hlLnRyZWVfZGF0YSwgaXQtPnBjYWNoZS50cmVlX3NpemUpOworCQkJYWRkX3BiYXNlX29iamVjdCgmdHJlZSwgbmFtZSwgY21wbGVuLCBuYW1lKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWRkX3ByZWZlcnJlZF9iYXNlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBiYXNlX3RyZWUgKml0OworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXTsKKworCWlmICh3aW5kb3cgPD0gbnVtX3ByZWZlcnJlZF9iYXNlKyspCisJCXJldHVybjsKKworCWRhdGEgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCB0cmVlX3R5cGUsICZzaXplLCB0cmVlX3NoYTEpOworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJZm9yIChpdCA9IHBiYXNlX3RyZWU7IGl0OyBpdCA9IGl0LT5uZXh0KSB7CisJCWlmICghaGFzaGNtcChpdC0+cGNhY2hlLnNoYTEsIHRyZWVfc2hhMSkpIHsKKwkJCWZyZWUoZGF0YSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCppdCkpOworCWl0LT5uZXh0ID0gcGJhc2VfdHJlZTsKKwlwYmFzZV90cmVlID0gaXQ7CisKKwloYXNoY3B5KGl0LT5wY2FjaGUuc2hhMSwgdHJlZV9zaGExKTsKKwlpdC0+cGNhY2hlLnRyZWVfZGF0YSA9IGRhdGE7CisJaXQtPnBjYWNoZS50cmVlX3NpemUgPSBzaXplOworfQorCitzdGF0aWMgdm9pZCBjaGVja19vYmplY3Qoc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkpCit7CisJaWYgKGVudHJ5LT5pbl9wYWNrKSB7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gZW50cnktPmluX3BhY2s7CisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqd19jdXJzID0gTlVMTDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYmFzZV9yZWYgPSBOVUxMOworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiYXNlX2VudHJ5OworCQl1bnNpZ25lZCBsb25nIHVzZWQsIHVzZWRfMDsKKwkJdW5zaWduZWQgaW50IGF2YWlsOworCQlvZmZfdCBvZnM7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgYzsKKworCQlidWYgPSB1c2VfcGFjayhwLCAmd19jdXJzLCBlbnRyeS0+aW5fcGFja19vZmZzZXQsICZhdmFpbCk7CisKKwkJLyoKKwkJICogV2Ugd2FudCBpbl9wYWNrX3R5cGUgZXZlbiBpZiB3ZSBkbyBub3QgcmV1c2UgZGVsdGEuCisJCSAqIFRoZXJlIGlzIG5vIHBvaW50IG5vdCByZXVzaW5nIG5vbi1kZWx0YSByZXByZXNlbnRhdGlvbnMuCisJCSAqLworCQl1c2VkID0gdW5wYWNrX29iamVjdF9oZWFkZXJfZ2VudGx5KGJ1ZiwgYXZhaWwsCisJCQkJCQkgICAmZW50cnktPmluX3BhY2tfdHlwZSwKKwkJCQkJCSAgICZlbnRyeS0+c2l6ZSk7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBkZWx0YSBhbmQgaWYgc28gd2hldGhlciB3ZSBjYW4KKwkJICogcmV1c2UgaXQgb3Igbm90LiAgT3RoZXJ3aXNlIGxldCdzIGZpbmQgb3V0IGFzIGNoZWFwbHkgYXMKKwkJICogcG9zc2libGUgd2hhdCB0aGUgYWN0dWFsIHR5cGUgYW5kIHNpemUgZm9yIHRoaXMgb2JqZWN0IGlzLgorCQkgKi8KKwkJc3dpdGNoIChlbnRyeS0+aW5fcGFja190eXBlKSB7CisJCWRlZmF1bHQ6CisJCQkvKiBOb3QgYSBkZWx0YSBoZW5jZSB3ZSd2ZSBhbHJlYWR5IGdvdCBhbGwgd2UgbmVlZC4gKi8KKwkJCWVudHJ5LT50eXBlID0gZW50cnktPmluX3BhY2tfdHlwZTsKKwkJCWVudHJ5LT5pbl9wYWNrX2hlYWRlcl9zaXplID0gdXNlZDsKKwkJCXVudXNlX3BhY2soJndfY3Vycyk7CisJCQlyZXR1cm47CisJCWNhc2UgT0JKX1JFRl9ERUxUQToKKwkJCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJCQliYXNlX3JlZiA9IHVzZV9wYWNrKHAsICZ3X2N1cnMsCisJCQkJCQllbnRyeS0+aW5fcGFja19vZmZzZXQgKyB1c2VkLCBOVUxMKTsKKwkJCWVudHJ5LT5pbl9wYWNrX2hlYWRlcl9zaXplID0gdXNlZCArIDIwOworCQkJYnJlYWs7CisJCWNhc2UgT0JKX09GU19ERUxUQToKKwkJCWJ1ZiA9IHVzZV9wYWNrKHAsICZ3X2N1cnMsCisJCQkJICAgICAgIGVudHJ5LT5pbl9wYWNrX29mZnNldCArIHVzZWQsIE5VTEwpOworCQkJdXNlZF8wID0gMDsKKwkJCWMgPSBidWZbdXNlZF8wKytdOworCQkJb2ZzID0gYyAmIDEyNzsKKwkJCXdoaWxlIChjICYgMTI4KSB7CisJCQkJb2ZzICs9IDE7CisJCQkJaWYgKCFvZnMgfHwgTVNCKG9mcywgNykpCisJCQkJCWRpZSgiZGVsdGEgYmFzZSBvZmZzZXQgb3ZlcmZsb3cgaW4gcGFjayBmb3IgJXMiLAorCQkJCQkgICAgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKKwkJCQljID0gYnVmW3VzZWRfMCsrXTsKKwkJCQlvZnMgPSAob2ZzIDw8IDcpICsgKGMgJiAxMjcpOworCQkJfQorCQkJaWYgKG9mcyA+PSBlbnRyeS0+aW5fcGFja19vZmZzZXQpCisJCQkJZGllKCJkZWx0YSBiYXNlIG9mZnNldCBvdXQgb2YgYm91bmQgZm9yICVzIiwKKwkJCQkgICAgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKKwkJCW9mcyA9IGVudHJ5LT5pbl9wYWNrX29mZnNldCAtIG9mczsKKwkJCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJCQliYXNlX3JlZiA9IGZpbmRfcGFja2VkX29iamVjdF9uYW1lKHAsIG9mcyk7CisJCQllbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZSA9IHVzZWQgKyB1c2VkXzA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChiYXNlX3JlZiAmJiAoYmFzZV9lbnRyeSA9IGxvY2F0ZV9vYmplY3RfZW50cnkoYmFzZV9yZWYpKSkgeworCQkJLyoKKwkJCSAqIElmIGJhc2VfcmVmIHdhcyBzZXQgYWJvdmUgdGhhdCBtZWFucyB3ZSB3aXNoIHRvCisJCQkgKiByZXVzZSBkZWx0YSBkYXRhLCBhbmQgd2UgZXZlbiBmb3VuZCB0aGF0IGJhc2UKKwkJCSAqIGluIHRoZSBsaXN0IG9mIG9iamVjdHMgd2Ugd2FudCB0byBwYWNrLiBHb29kaWUhCisJCQkgKgorCQkJICogRGVwdGggdmFsdWUgZG9lcyBub3QgbWF0dGVyIC0gZmluZF9kZWx0YXMoKSB3aWxsCisJCQkgKiBuZXZlciBjb25zaWRlciByZXVzZWQgZGVsdGEgYXMgdGhlIGJhc2Ugb2JqZWN0IHRvCisJCQkgKiBkZWx0aWZ5IG90aGVyIG9iamVjdHMgYWdhaW5zdCwgaW4gb3JkZXIgdG8gYXZvaWQKKwkJCSAqIGNpcmN1bGFyIGRlbHRhcy4KKwkJCSAqLworCQkJZW50cnktPnR5cGUgPSBlbnRyeS0+aW5fcGFja190eXBlOworCQkJZW50cnktPmRlbHRhID0gYmFzZV9lbnRyeTsKKwkJCWVudHJ5LT5kZWx0YV9zaWJsaW5nID0gYmFzZV9lbnRyeS0+ZGVsdGFfY2hpbGQ7CisJCQliYXNlX2VudHJ5LT5kZWx0YV9jaGlsZCA9IGVudHJ5OworCQkJdW51c2VfcGFjaygmd19jdXJzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChlbnRyeS0+dHlwZSkgeworCQkJLyoKKwkJCSAqIFRoaXMgbXVzdCBiZSBhIGRlbHRhIGFuZCB3ZSBhbHJlYWR5IGtub3cgd2hhdCB0aGUKKwkJCSAqIGZpbmFsIG9iamVjdCB0eXBlIGlzLiAgTGV0J3MgZXh0cmFjdCB0aGUgYWN0dWFsCisJCQkgKiBvYmplY3Qgc2l6ZSBmcm9tIHRoZSBkZWx0YSBoZWFkZXIuCisJCQkgKi8KKwkJCWVudHJ5LT5zaXplID0gZ2V0X3NpemVfZnJvbV9kZWx0YShwLCAmd19jdXJzLAorCQkJCQllbnRyeS0+aW5fcGFja19vZmZzZXQgKyBlbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZSk7CisJCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogTm8gY2hvaWNlIGJ1dCB0byBmYWxsIGJhY2sgdG8gdGhlIHJlY3Vyc2l2ZSBkZWx0YSB3YWxrCisJCSAqIHdpdGggc2hhMV9vYmplY3RfaW5mbygpIHRvIGZpbmQgYWJvdXQgdGhlIG9iamVjdCB0eXBlCisJCSAqIGF0IHRoaXMgcG9pbnQuLi4KKwkJICovCisJCXVudXNlX3BhY2soJndfY3Vycyk7CisJfQorCisJZW50cnktPnR5cGUgPSBzaGExX29iamVjdF9pbmZvKGVudHJ5LT5zaGExLCAmZW50cnktPnNpemUpOworCWlmIChlbnRyeS0+dHlwZSA8IDApCisJCWRpZSgidW5hYmxlIHRvIGdldCB0eXBlIG9mIG9iamVjdCAlcyIsCisJCSAgICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSkpOworfQorCitzdGF0aWMgaW50IHBhY2tfb2Zmc2V0X3NvcnQoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKmEgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2E7CisJY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYiA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYjsKKworCS8qIGF2b2lkIGZpbGVzeXN0ZW0gdHJhc2hpbmcgd2l0aCBsb29zZSBvYmplY3RzICovCisJaWYgKCFhLT5pbl9wYWNrICYmICFiLT5pbl9wYWNrKQorCQlyZXR1cm4gaGFzaGNtcChhLT5zaGExLCBiLT5zaGExKTsKKworCWlmIChhLT5pbl9wYWNrIDwgYi0+aW5fcGFjaykKKwkJcmV0dXJuIC0xOworCWlmIChhLT5pbl9wYWNrID4gYi0+aW5fcGFjaykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGEtPmluX3BhY2tfb2Zmc2V0IDwgYi0+aW5fcGFja19vZmZzZXQgPyAtMSA6CisJCQkoYS0+aW5fcGFja19vZmZzZXQgPiBiLT5pbl9wYWNrX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9vYmplY3RfZGV0YWlscyh2b2lkKQoreworCXVpbnQzMl90IGk7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9vZmZzZXQ7CisKKwlzb3J0ZWRfYnlfb2Zmc2V0ID0geGNhbGxvYyhucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJc29ydGVkX2J5X29mZnNldFtpXSA9IG9iamVjdHMgKyBpOworCXFzb3J0KHNvcnRlZF9ieV9vZmZzZXQsIG5yX29iamVjdHMsIHNpemVvZigqc29ydGVkX2J5X29mZnNldCksIHBhY2tfb2Zmc2V0X3NvcnQpOworCisJcHJlcGFyZV9wYWNrX2l4KCk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJY2hlY2tfb2JqZWN0KHNvcnRlZF9ieV9vZmZzZXRbaV0pOworCWZyZWUoc29ydGVkX2J5X29mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgdHlwZV9zaXplX3NvcnQoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKmEgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2E7CisJY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYiA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYjsKKworCWlmIChhLT50eXBlIDwgYi0+dHlwZSkKKwkJcmV0dXJuIC0xOworCWlmIChhLT50eXBlID4gYi0+dHlwZSkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPmhhc2ggPCBiLT5oYXNoKQorCQlyZXR1cm4gLTE7CisJaWYgKGEtPmhhc2ggPiBiLT5oYXNoKQorCQlyZXR1cm4gMTsKKwlpZiAoYS0+cHJlZmVycmVkX2Jhc2UgPCBiLT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIC0xOworCWlmIChhLT5wcmVmZXJyZWRfYmFzZSA+IGItPnByZWZlcnJlZF9iYXNlKQorCQlyZXR1cm4gMTsKKwlpZiAoYS0+c2l6ZSA8IGItPnNpemUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+c2l6ZSA+IGItPnNpemUpCisJCXJldHVybiAxOworCXJldHVybiBhID4gYiA/IC0xIDogKGEgPCBiKTsgIC8qIG5ld2VzdCBsYXN0ICovCit9CisKK3N0cnVjdCB1bnBhY2tlZCB7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnk7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4OworfTsKKworLyoKKyAqIFdlIHNlYXJjaCBmb3IgZGVsdGFzIF9iYWNrd2FyZHNfIGluIGEgbGlzdCBzb3J0ZWQgYnkgdHlwZSBhbmQKKyAqIGJ5IHNpemUsIHNvIHRoYXQgd2Ugc2VlIHByb2dyZXNzaXZlbHkgc21hbGxlciBhbmQgc21hbGxlciBmaWxlcy4KKyAqIFRoYXQncyBiZWNhdXNlIHdlIHByZWZlciBkZWx0YXMgdG8gYmUgZnJvbSB0aGUgYmlnZ2VyIGZpbGUKKyAqIHRvIHRoZSBzbWFsbGVyIC0gZGVsZXRlcyBhcmUgcG90ZW50aWFsbHkgY2hlYXBlciwgYnV0IHBlcmhhcHMKKyAqIG1vcmUgaW1wb3J0YW50bHksIHRoZSBiaWdnZXIgZmlsZSBpcyBsaWtlbHkgdGhlIG1vcmUgcmVjZW50CisgKiBvbmUuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X2RlbHRhKHN0cnVjdCB1bnBhY2tlZCAqdHJnLCBzdHJ1Y3QgdW5wYWNrZWQgKnNyYywKKwkJICAgICB1bnNpZ25lZCBtYXhfZGVwdGgpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqdHJnX2VudHJ5ID0gdHJnLT5lbnRyeTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpzcmNfZW50cnkgPSBzcmMtPmVudHJ5OworCXVuc2lnbmVkIGxvbmcgdHJnX3NpemUsIHNyY19zaXplLCBkZWx0YV9zaXplLCBzaXplZGlmZiwgbWF4X3NpemUsIHN6OworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpkZWx0YV9idWY7CisKKwkvKiBEb24ndCBib3RoZXIgZG9pbmcgZGlmZnMgYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgKi8KKwlpZiAodHJnX2VudHJ5LT50eXBlICE9IHNyY19lbnRyeS0+dHlwZSkKKwkJcmV0dXJuIC0xOworCisJLyogV2UgZG8gbm90IGNvbXB1dGUgZGVsdGEgdG8gKmNyZWF0ZSogb2JqZWN0cyB3ZSBhcmUgbm90CisJICogZ29pbmcgdG8gcGFjay4KKwkgKi8KKwlpZiAodHJnX2VudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBXZSBkbyBub3QgYm90aGVyIHRvIHRyeSBhIGRlbHRhIHRoYXQgd2UgZGlzY2FyZGVkCisJICogb24gYW4gZWFybGllciB0cnksIGJ1dCBvbmx5IHdoZW4gcmV1c2luZyBkZWx0YSBkYXRhLgorCSAqLworCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgdHJnX2VudHJ5LT5pbl9wYWNrICYmCisJICAgIHRyZ19lbnRyeS0+aW5fcGFjayA9PSBzcmNfZW50cnktPmluX3BhY2sgJiYKKwkgICAgdHJnX2VudHJ5LT5pbl9wYWNrX3R5cGUgIT0gT0JKX1JFRl9ERUxUQSAmJgorCSAgICB0cmdfZW50cnktPmluX3BhY2tfdHlwZSAhPSBPQkpfT0ZTX0RFTFRBKQorCQlyZXR1cm4gMDsKKworCS8qIExldCdzIG5vdCBidXN0IHRoZSBhbGxvd2VkIGRlcHRoLiAqLworCWlmIChzcmNfZW50cnktPmRlcHRoID49IG1heF9kZXB0aCkKKwkJcmV0dXJuIDA7CisKKwkvKiBOb3cgc29tZSBzaXplIGZpbHRlcmluZyBoZXVyaXN0aWNzLiAqLworCXRyZ19zaXplID0gdHJnX2VudHJ5LT5zaXplOworCW1heF9zaXplID0gdHJnX3NpemUvMiAtIDIwOworCW1heF9zaXplID0gbWF4X3NpemUgKiAobWF4X2RlcHRoIC0gc3JjX2VudHJ5LT5kZXB0aCkgLyBtYXhfZGVwdGg7CisJaWYgKG1heF9zaXplID09IDApCisJCXJldHVybiAwOworCWlmICh0cmdfZW50cnktPmRlbHRhICYmIHRyZ19lbnRyeS0+ZGVsdGFfc2l6ZSA8PSBtYXhfc2l6ZSkKKwkJbWF4X3NpemUgPSB0cmdfZW50cnktPmRlbHRhX3NpemUtMTsKKwlzcmNfc2l6ZSA9IHNyY19lbnRyeS0+c2l6ZTsKKwlzaXplZGlmZiA9IHNyY19zaXplIDwgdHJnX3NpemUgPyB0cmdfc2l6ZSAtIHNyY19zaXplIDogMDsKKwlpZiAoc2l6ZWRpZmYgPj0gbWF4X3NpemUpCisJCXJldHVybiAwOworCisJLyogTG9hZCBkYXRhIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwlpZiAoIXRyZy0+ZGF0YSkgeworCQl0cmctPmRhdGEgPSByZWFkX3NoYTFfZmlsZSh0cmdfZW50cnktPnNoYTEsICZ0eXBlLCAmc3opOworCQlpZiAoc3ogIT0gdHJnX3NpemUpCisJCQlkaWUoIm9iamVjdCAlcyBpbmNvbnNpc3RlbnQgb2JqZWN0IGxlbmd0aCAoJWx1IHZzICVsdSkiLAorCQkJICAgIHNoYTFfdG9faGV4KHRyZ19lbnRyeS0+c2hhMSksIHN6LCB0cmdfc2l6ZSk7CisJfQorCWlmICghc3JjLT5kYXRhKSB7CisJCXNyYy0+ZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNyY19lbnRyeS0+c2hhMSwgJnR5cGUsICZzeik7CisJCWlmIChzeiAhPSBzcmNfc2l6ZSkKKwkJCWRpZSgib2JqZWN0ICVzIGluY29uc2lzdGVudCBvYmplY3QgbGVuZ3RoICglbHUgdnMgJWx1KSIsCisJCQkgICAgc2hhMV90b19oZXgoc3JjX2VudHJ5LT5zaGExKSwgc3osIHNyY19zaXplKTsKKwl9CisJaWYgKCFzcmMtPmluZGV4KSB7CisJCXNyYy0+aW5kZXggPSBjcmVhdGVfZGVsdGFfaW5kZXgoc3JjLT5kYXRhLCBzcmNfc2l6ZSk7CisJCWlmICghc3JjLT5pbmRleCkKKwkJCWRpZSgib3V0IG9mIG1lbW9yeSIpOworCX0KKworCWRlbHRhX2J1ZiA9IGNyZWF0ZV9kZWx0YShzcmMtPmluZGV4LCB0cmctPmRhdGEsIHRyZ19zaXplLCAmZGVsdGFfc2l6ZSwgbWF4X3NpemUpOworCWlmICghZGVsdGFfYnVmKQorCQlyZXR1cm4gMDsKKworCXRyZ19lbnRyeS0+ZGVsdGEgPSBzcmNfZW50cnk7CisJdHJnX2VudHJ5LT5kZWx0YV9zaXplID0gZGVsdGFfc2l6ZTsKKwl0cmdfZW50cnktPmRlcHRoID0gc3JjX2VudHJ5LT5kZXB0aCArIDE7CisJZnJlZShkZWx0YV9idWYpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX2RlbHRhX2xpbWl0KHN0cnVjdCBvYmplY3RfZW50cnkgKm1lLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG1lLT5kZWx0YV9jaGlsZDsKKwl1bnNpZ25lZCBpbnQgbSA9IG47CisJd2hpbGUgKGNoaWxkKSB7CisJCXVuc2lnbmVkIGludCBjID0gY2hlY2tfZGVsdGFfbGltaXQoY2hpbGQsIG4gKyAxKTsKKwkJaWYgKG0gPCBjKQorCQkJbSA9IGM7CisJCWNoaWxkID0gY2hpbGQtPmRlbHRhX3NpYmxpbmc7CisJfQorCXJldHVybiBtOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2RlbHRhcyhzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdCwgaW50IHdpbmRvdywgaW50IGRlcHRoKQoreworCXVpbnQzMl90IGkgPSBucl9vYmplY3RzLCBpZHggPSAwLCBwcm9jZXNzZWQgPSAwOworCXVuc2lnbmVkIGludCBhcnJheV9zaXplID0gd2luZG93ICogc2l6ZW9mKHN0cnVjdCB1bnBhY2tlZCk7CisJc3RydWN0IHVucGFja2VkICphcnJheTsKKwlpbnQgbWF4X2RlcHRoOworCisJaWYgKCFucl9vYmplY3RzKQorCQlyZXR1cm47CisJYXJyYXkgPSB4bWFsbG9jKGFycmF5X3NpemUpOworCW1lbXNldChhcnJheSwgMCwgYXJyYXlfc2l6ZSk7CisJaWYgKHByb2dyZXNzKQorCQlzdGFydF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUsICJEZWx0aWZ5aW5nICV1IG9iamVjdHMuLi4iLCAiIiwgbnJfcmVzdWx0KTsKKworCWRvIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSBsaXN0Wy0taV07CisJCXN0cnVjdCB1bnBhY2tlZCAqbiA9IGFycmF5ICsgaWR4OworCQlpbnQgajsKKworCQlpZiAoIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJCXByb2Nlc3NlZCsrOworCisJCWlmIChwcm9ncmVzcykKKwkJCWRpc3BsYXlfcHJvZ3Jlc3MoJnByb2dyZXNzX3N0YXRlLCBwcm9jZXNzZWQpOworCisJCWlmIChlbnRyeS0+ZGVsdGEpCisJCQkvKiBUaGlzIGhhcHBlbnMgaWYgd2UgZGVjaWRlZCB0byByZXVzZSBleGlzdGluZworCQkJICogZGVsdGEgZnJvbSBhIHBhY2suICAiIW5vX3JldXNlX2RlbHRhICYmIiBpcyBpbXBsaWVkLgorCQkJICovCisJCQljb250aW51ZTsKKworCQlpZiAoZW50cnktPnNpemUgPCA1MCkKKwkJCWNvbnRpbnVlOworCQlmcmVlX2RlbHRhX2luZGV4KG4tPmluZGV4KTsKKwkJbi0+aW5kZXggPSBOVUxMOworCQlmcmVlKG4tPmRhdGEpOworCQluLT5kYXRhID0gTlVMTDsKKwkJbi0+ZW50cnkgPSBlbnRyeTsKKworCQkvKgorCQkgKiBJZiB0aGUgY3VycmVudCBvYmplY3QgaXMgYXQgcGFjayBlZGdlLCB0YWtlIHRoZSBkZXB0aCB0aGUKKwkJICogb2JqZWN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY3VycmVudCBvYmplY3QgaW50byBhY2NvdW50CisJCSAqIG90aGVyd2lzZSB0aGV5IHdvdWxkIGJlY29tZSB0b28gZGVlcC4KKwkJICovCisJCW1heF9kZXB0aCA9IGRlcHRoOworCQlpZiAoZW50cnktPmRlbHRhX2NoaWxkKSB7CisJCQltYXhfZGVwdGggLT0gY2hlY2tfZGVsdGFfbGltaXQoZW50cnksIDApOworCQkJaWYgKG1heF9kZXB0aCA8PSAwKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWogPSB3aW5kb3c7CisJCXdoaWxlICgtLWogPiAwKSB7CisJCQl1aW50MzJfdCBvdGhlcl9pZHggPSBpZHggKyBqOworCQkJc3RydWN0IHVucGFja2VkICptOworCQkJaWYgKG90aGVyX2lkeCA+PSB3aW5kb3cpCisJCQkJb3RoZXJfaWR4IC09IHdpbmRvdzsKKwkJCW0gPSBhcnJheSArIG90aGVyX2lkeDsKKwkJCWlmICghbS0+ZW50cnkpCisJCQkJYnJlYWs7CisJCQlpZiAodHJ5X2RlbHRhKG4sIG0sIG1heF9kZXB0aCkgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogaWYgd2UgbWFkZSBuIGEgZGVsdGEsIGFuZCBpZiBuIGlzIGFscmVhZHkgYXQgbWF4CisJCSAqIGRlcHRoLCBsZWF2aW5nIGl0IGluIHRoZSB3aW5kb3cgaXMgcG9pbnRsZXNzLiAgd2UKKwkJICogc2hvdWxkIGV2aWN0IGl0IGZpcnN0LgorCQkgKi8KKwkJaWYgKGVudHJ5LT5kZWx0YSAmJiBkZXB0aCA8PSBlbnRyeS0+ZGVwdGgpCisJCQljb250aW51ZTsKKworCQluZXh0OgorCQlpZHgrKzsKKwkJaWYgKGlkeCA+PSB3aW5kb3cpCisJCQlpZHggPSAwOworCX0gd2hpbGUgKGkgPiAwKTsKKworCWlmIChwcm9ncmVzcykKKwkJc3RvcF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUpOworCisJZm9yIChpID0gMDsgaSA8IHdpbmRvdzsgKytpKSB7CisJCWZyZWVfZGVsdGFfaW5kZXgoYXJyYXlbaV0uaW5kZXgpOworCQlmcmVlKGFycmF5W2ldLmRhdGEpOworCX0KKwlmcmVlKGFycmF5KTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrKGludCB3aW5kb3csIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqZGVsdGFfbGlzdDsKKwl1aW50MzJfdCBpOworCisJZ2V0X29iamVjdF9kZXRhaWxzKCk7CisKKwlpZiAoIXdpbmRvdyB8fCAhZGVwdGgpCisJCXJldHVybjsKKworCWRlbHRhX2xpc3QgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2YoKmRlbHRhX2xpc3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKQorCQlkZWx0YV9saXN0W2ldID0gb2JqZWN0cyArIGk7CisJcXNvcnQoZGVsdGFfbGlzdCwgbnJfb2JqZWN0cywgc2l6ZW9mKCpkZWx0YV9saXN0KSwgdHlwZV9zaXplX3NvcnQpOworCWZpbmRfZGVsdGFzKGRlbHRhX2xpc3QsIHdpbmRvdysxLCBkZXB0aCk7CisJZnJlZShkZWx0YV9saXN0KTsKK30KKworc3RhdGljIGludCBnaXRfcGFja19jb25maWcoY29uc3QgY2hhciAqaywgY29uc3QgY2hhciAqdikKK3sKKwlpZighc3RyY21wKGssICJwYWNrLndpbmRvdyIpKSB7CisJCXdpbmRvdyA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYoIXN0cmNtcChrLCAicGFjay5kZXB0aCIpKSB7CisJCWRlcHRoID0gZ2l0X2NvbmZpZ19pbnQoaywgdik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKGssIHYpOworfQorCitzdGF0aWMgdm9pZCByZWFkX29iamVjdF9saXN0X2Zyb21fc3RkaW4odm9pZCkKK3sKKwljaGFyIGxpbmVbNDAgKyAxICsgUEFUSF9NQVggKyAyXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGhhc2g7CisKKwlmb3IgKDs7KSB7CisJCWlmICghZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikpIHsKKwkJCWlmIChmZW9mKHN0ZGluKSkKKwkJCQlicmVhazsKKwkJCWlmICghZmVycm9yKHN0ZGluKSkKKwkJCQlkaWUoImZnZXRzIHJldHVybmVkIE5VTEwsIG5vdCBFT0YsIG5vdCBlcnJvciEiKTsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQlkaWUoImZnZXRzOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbGVhcmVycihzdGRpbik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGluZVswXSA9PSAnLScpIHsKKwkJCWlmIChnZXRfc2hhMV9oZXgobGluZSsxLCBzaGExKSkKKwkJCQlkaWUoImV4cGVjdGVkIGVkZ2Ugc2hhMSwgZ290IGdhcmJhZ2U6XG4gJXMiLAorCQkJCSAgICBsaW5lKTsKKwkJCWFkZF9wcmVmZXJyZWRfYmFzZShzaGExKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgc2hhMSkpCisJCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCBnYXJiYWdlOlxuICVzIiwgbGluZSk7CisKKwkJaGFzaCA9IG5hbWVfaGFzaChsaW5lKzQxKTsKKwkJYWRkX3ByZWZlcnJlZF9iYXNlX29iamVjdChsaW5lKzQxLCBoYXNoKTsKKwkJYWRkX29iamVjdF9lbnRyeShzaGExLCAwLCBoYXNoLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlhZGRfb2JqZWN0X2VudHJ5KGNvbW1pdC0+b2JqZWN0LnNoYTEsIE9CSl9DT01NSVQsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBzaG93X29iamVjdChzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpwKQoreworCXVuc2lnbmVkIGhhc2ggPSBuYW1lX2hhc2gocC0+bmFtZSk7CisJYWRkX3ByZWZlcnJlZF9iYXNlX29iamVjdChwLT5uYW1lLCBoYXNoKTsKKwlhZGRfb2JqZWN0X2VudHJ5KHAtPml0ZW0tPnNoYTEsIHAtPml0ZW0tPnR5cGUsIGhhc2gsIDApOworfQorCitzdGF0aWMgdm9pZCBzaG93X2VkZ2Uoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWFkZF9wcmVmZXJyZWRfYmFzZShjb21taXQtPm9iamVjdC5zaGExKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X29iamVjdF9saXN0KGludCBhYywgY29uc3QgY2hhciAqKmF2KQoreworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCWNoYXIgbGluZVsxMDAwXTsKKwlpbnQgZmxhZ3MgPSAwOworCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIE5VTEwpOworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCXNldHVwX3JldmlzaW9ucyhhYywgYXYsICZyZXZzLCBOVUxMKTsKKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7CisJCWludCBsZW4gPSBzdHJsZW4obGluZSk7CisJCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsaW5lWy0tbGVuXSA9IDA7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmICgqbGluZSA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGxpbmUsICItLW5vdCIpKSB7CisJCQkJZmxhZ3MgXj0gVU5JTlRFUkVTVElORzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRpZSgibm90IGEgcmV2ICclcyciLCBsaW5lKTsKKwkJfQorCQlpZiAoaGFuZGxlX3JldmlzaW9uX2FyZyhsaW5lLCAmcmV2cywgZmxhZ3MsIDEpKQorCQkJZGllKCJiYWQgcmV2aXNpb24gJyVzJyIsIGxpbmUpOworCX0KKworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cyk7CisJbWFya19lZGdlc191bmludGVyZXN0aW5nKHJldnMuY29tbWl0cywgJnJldnMsIHNob3dfZWRnZSk7CisJdHJhdmVyc2VfY29tbWl0X2xpc3QoJnJldnMsIHNob3dfY29tbWl0LCBzaG93X29iamVjdCk7Cit9CisKK3N0YXRpYyBpbnQgYWRqdXN0X3Blcm0oY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpCit7CisJaWYgKGNobW9kKHBhdGgsIG1vZGUpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGFkanVzdF9zaGFyZWRfcGVybShwYXRoKTsKK30KKworaW50IGNtZF9wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHVzZV9pbnRlcm5hbF9yZXZfbGlzdCA9IDA7CisJaW50IHRoaW4gPSAwOworCXVpbnQzMl90IGk7CisJb2ZmX3QgbGFzdF9vYmpfb2Zmc2V0OworCWNvbnN0IGNoYXIgKmJhc2VfbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqKnJwX2F2OworCWludCBycF9hY19hbGxvYyA9IDY0OworCWludCBycF9hYzsKKworCXJwX2F2ID0geGNhbGxvYyhycF9hY19hbGxvYywgc2l6ZW9mKCpycF9hdikpOworCisJcnBfYXZbMF0gPSAicGFjay1vYmplY3RzIjsKKwlycF9hdlsxXSA9ICItLW9iamVjdHMiOyAvKiAtLXRoaW4gd2lsbCBtYWtlIGl0IC0tb2JqZWN0cy1lZGdlICovCisJcnBfYWMgPSAyOworCisJZ2l0X2NvbmZpZyhnaXRfcGFja19jb25maWcpOworCisJcHJvZ3Jlc3MgPSBpc2F0dHkoMik7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCisJCWlmICghc3RyY21wKCItLW5vbi1lbXB0eSIsIGFyZykpIHsKKwkJCW5vbl9lbXB0eSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1sb2NhbCIsIGFyZykpIHsKKwkJCWxvY2FsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWluY3JlbWVudGFsIiwgYXJnKSkgeworCQkJaW5jcmVtZW50YWwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS13aW5kb3c9IikpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCXdpbmRvdyA9IHN0cnRvdWwoYXJnKzksICZlbmQsIDApOworCQkJaWYgKCFhcmdbOV0gfHwgKmVuZCkKKwkJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZGVwdGg9IikpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCWRlcHRoID0gc3RydG91bChhcmcrOCwgJmVuZCwgMCk7CisJCQlpZiAoIWFyZ1s4XSB8fCAqZW5kKQorCQkJCXVzYWdlKHBhY2tfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tcHJvZ3Jlc3MiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1hbGwtcHJvZ3Jlc3MiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLXEiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1uby1yZXVzZS1kZWx0YSIsIGFyZykpIHsKKwkJCW5vX3JldXNlX2RlbHRhID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWRlbHRhLWJhc2Utb2Zmc2V0IiwgYXJnKSkgeworCQkJYWxsb3dfb2ZzX2RlbHRhID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLXN0ZG91dCIsIGFyZykpIHsKKwkJCXBhY2tfdG9fc3Rkb3V0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLXJldnMiLCBhcmcpKSB7CisJCQl1c2VfaW50ZXJuYWxfcmV2X2xpc3QgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tdW5wYWNrZWQiLCBhcmcpIHx8CisJCSAgICAhcHJlZml4Y21wKGFyZywgIi0tdW5wYWNrZWQ9IikgfHwKKwkJICAgICFzdHJjbXAoIi0tcmVmbG9nIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1hbGwiLCBhcmcpKSB7CisJCQl1c2VfaW50ZXJuYWxfcmV2X2xpc3QgPSAxOworCQkJaWYgKHJwX2FjID49IHJwX2FjX2FsbG9jIC0gMSkgeworCQkJCXJwX2FjX2FsbG9jID0gYWxsb2NfbnIocnBfYWNfYWxsb2MpOworCQkJCXJwX2F2ID0geHJlYWxsb2MocnBfYXYsCisJCQkJCQkgcnBfYWNfYWxsb2MgKiBzaXplb2YoKnJwX2F2KSk7CisJCQl9CisJCQlycF9hdltycF9hYysrXSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLXRoaW4iLCBhcmcpKSB7CisJCQl1c2VfaW50ZXJuYWxfcmV2X2xpc3QgPSAxOworCQkJdGhpbiA9IDE7CisJCQlycF9hdlsxXSA9ICItLW9iamVjdHMtZWRnZSI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWluZGV4LXZlcnNpb249IikpIHsKKwkJCWNoYXIgKmM7CisJCQlpbmRleF9kZWZhdWx0X3ZlcnNpb24gPSBzdHJ0b3VsKGFyZyArIDE2LCAmYywgMTApOworCQkJaWYgKGluZGV4X2RlZmF1bHRfdmVyc2lvbiA+IDIpCisJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJaWYgKCpjID09ICcsJykKKwkJCQlpbmRleF9vZmYzMl9saW1pdCA9IHN0cnRvdWwoYysxLCAmYywgMCk7CisJCQlpZiAoKmMgfHwgaW5kZXhfb2ZmMzJfbGltaXQgJiAweDgwMDAwMDAwKQorCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKHBhY2tfdXNhZ2UpOworCX0KKworCS8qIFRyYWRpdGlvbmFsbHkgInBhY2stb2JqZWN0cyBbb3B0aW9uc10gYmFzZSBleHRyYSIgZmFpbGVkOworCSAqIHdlIHdvdWxkIGhvd2V2ZXIgd2FudCB0byB0YWtlIHJlZnMgcGFyYW1ldGVyIHRoYXQgd291bGQKKwkgKiBoYXZlIGJlZW4gZ2l2ZW4gdG8gdXBzdHJlYW0gcmV2LWxpc3Qgb3Vyc2VsdmVzLCB3aGljaCBtZWFucworCSAqIHdlIHNvbWVob3cgd2FudCB0byBzYXkgd2hhdCB0aGUgYmFzZSBuYW1lIGlzLiAgU28gdGhlCisJICogc3ludGF4IHdvdWxkIGJlOgorCSAqCisJICogcGFjay1vYmplY3RzIFtvcHRpb25zXSBiYXNlIDxyZWZzLi4uPgorCSAqCisJICogaW4gb3RoZXIgd29yZHMsIHdlIHdvdWxkIHRyZWF0IHRoZSBmaXJzdCBub24tb3B0aW9uIGFzIHRoZQorCSAqIGJhc2VfbmFtZSBhbmQgc2VuZCBldmVyeXRoaW5nIGVsc2UgdG8gdGhlIGludGVybmFsIHJldmlzaW9uCisJICogd2Fsa2VyLgorCSAqLworCisJaWYgKCFwYWNrX3RvX3N0ZG91dCkKKwkJYmFzZV9uYW1lID0gYXJndltpKytdOworCisJaWYgKHBhY2tfdG9fc3Rkb3V0ICE9ICFiYXNlX25hbWUpCisJCXVzYWdlKHBhY2tfdXNhZ2UpOworCisJaWYgKCFwYWNrX3RvX3N0ZG91dCAmJiB0aGluKQorCQlkaWUoIi0tdGhpbiBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBhbiBpbmRleGFibGUgcGFjay4iKTsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJaWYgKHByb2dyZXNzKQorCQlzdGFydF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUsICJHZW5lcmF0aW5nIHBhY2suLi4iLAorCQkJICAgICAgICJDb3VudGluZyBvYmplY3RzOiAiLCAwKTsKKwlpZiAoIXVzZV9pbnRlcm5hbF9yZXZfbGlzdCkKKwkJcmVhZF9vYmplY3RfbGlzdF9mcm9tX3N0ZGluKCk7CisJZWxzZSB7CisJCXJwX2F2W3JwX2FjXSA9IE5VTEw7CisJCWdldF9vYmplY3RfbGlzdChycF9hYywgcnBfYXYpOworCX0KKwlpZiAocHJvZ3Jlc3MpIHsKKwkJc3RvcF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkRvbmUgY291bnRpbmcgJXUgb2JqZWN0cy5cbiIsIG5yX29iamVjdHMpOworCX0KKworCWlmIChub25fZW1wdHkgJiYgIW5yX3Jlc3VsdCkKKwkJcmV0dXJuIDA7CisJaWYgKHByb2dyZXNzICYmIChucl9vYmplY3RzICE9IG5yX3Jlc3VsdCkpCisJCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGhhcyAldSBvYmplY3RzLlxuIiwgbnJfcmVzdWx0KTsKKwlpZiAobnJfcmVzdWx0KQorCQlwcmVwYXJlX3BhY2sod2luZG93LCBkZXB0aCk7CisJbGFzdF9vYmpfb2Zmc2V0ID0gd3JpdGVfcGFja19maWxlKCk7CisJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQl1bnNpZ25lZCBjaGFyIG9iamVjdF9saXN0X3NoYTFbMjBdOworCQltb2RlX3QgbW9kZSA9IHVtYXNrKDApOworCisJCXVtYXNrKG1vZGUpOworCQltb2RlID0gMDQ0NCAmIH5tb2RlOworCisJCXdyaXRlX2luZGV4X2ZpbGUobGFzdF9vYmpfb2Zmc2V0LCBvYmplY3RfbGlzdF9zaGExKTsKKwkJc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiJXMtJXMucGFjayIsCisJCQkgYmFzZV9uYW1lLCBzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSk7CisJCWlmIChhZGp1c3RfcGVybShwYWNrX3RtcF9uYW1lLCBtb2RlKSkKKwkJCWRpZSgidW5hYmxlIHRvIG1ha2UgdGVtcG9yYXJ5IHBhY2sgZmlsZSByZWFkYWJsZTogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChyZW5hbWUocGFja190bXBfbmFtZSwgdG1wbmFtZSkpCisJCQlkaWUoInVuYWJsZSB0byByZW5hbWUgdGVtcG9yYXJ5IHBhY2sgZmlsZTogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXNucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIiVzLSVzLmlkeCIsCisJCQkgYmFzZV9uYW1lLCBzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSk7CisJCWlmIChhZGp1c3RfcGVybShpZHhfdG1wX25hbWUsIG1vZGUpKQorCQkJZGllKCJ1bmFibGUgdG8gbWFrZSB0ZW1wb3JhcnkgaW5kZXggZmlsZSByZWFkYWJsZTogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChyZW5hbWUoaWR4X3RtcF9uYW1lLCB0bXBuYW1lKSkKKwkJCWRpZSgidW5hYmxlIHRvIHJlbmFtZSB0ZW1wb3JhcnkgaW5kZXggZmlsZTogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXB1dHMoc2hhMV90b19oZXgob2JqZWN0X2xpc3Rfc2hhMSkpOworCX0KKwlpZiAocHJvZ3Jlc3MpCisJCWZwcmludGYoc3RkZXJyLCAiVG90YWwgJXUgKGRlbHRhICV1KSwgcmV1c2VkICV1IChkZWx0YSAldSlcbiIsCisJCQl3cml0dGVuLCB3cml0dGVuX2RlbHRhLCByZXVzZWQsIHJldXNlZF9kZWx0YSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXBhY2stcmVmcy5jIGIvYnVpbHRpbi1wYWNrLXJlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgwZTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wYWNrLXJlZnMuYwpAQCAtMCwwICsxLDEzNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRhZy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBidWlsdGluX3BhY2tfcmVmc191c2FnZVtdID0KKyJnaXQtcGFjay1yZWZzIFstLWFsbF0gWy0tcHJ1bmUgfCAtLW5vLXBydW5lXSI7CisKK3N0cnVjdCByZWZfdG9fcHJ1bmUgeworCXN0cnVjdCByZWZfdG9fcHJ1bmUgKm5leHQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9OworCitzdHJ1Y3QgcGFja19yZWZzX2NiX2RhdGEgeworCWludCBwcnVuZTsKKwlpbnQgYWxsOworCXN0cnVjdCByZWZfdG9fcHJ1bmUgKnJlZl90b19wcnVuZTsKKwlGSUxFICpyZWZzX2ZpbGU7Cit9OworCitzdGF0aWMgaW50IGRvX25vdF9wcnVuZShpbnQgZmxhZ3MpCit7CisJLyogSWYgaXQgaXMgYWxyZWFkeSBwYWNrZWQgb3IgaWYgaXQgaXMgYSBzeW1yZWYsCisJICogZG8gbm90IHBydW5lIGl0LgorCSAqLworCXJldHVybiAoZmxhZ3MgJiAoUkVGX0lTU1lNUkVGfFJFRl9JU1BBQ0tFRCkpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgIGludCBmbGFncywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgcGFja19yZWZzX2NiX2RhdGEgKmNiID0gY2JfZGF0YTsKKwlpbnQgaXNfdGFnX3JlZjsKKworCS8qIERvIG5vdCBwYWNrIHRoZSBzeW1ib2xpYyByZWZzICovCisJaWYgKChmbGFncyAmIFJFRl9JU1NZTVJFRikpCisJCXJldHVybiAwOworCWlzX3RhZ19yZWYgPSAhcHJlZml4Y21wKHBhdGgsICJyZWZzL3RhZ3MvIik7CisKKwkvKiBBTFdBWVMgcGFjayByZWZzIHRoYXQgd2VyZSBhbHJlYWR5IHBhY2tlZCBvciBhcmUgdGFncyAqLworCWlmICghY2ItPmFsbCAmJiAhaXNfdGFnX3JlZiAmJiAhKGZsYWdzICYgUkVGX0lTUEFDS0VEKSkKKwkJcmV0dXJuIDA7CisKKwlmcHJpbnRmKGNiLT5yZWZzX2ZpbGUsICIlcyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHBhdGgpOworCWlmIChpc190YWdfcmVmKSB7CisJCXN0cnVjdCBvYmplY3QgKm8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJCW8gPSBkZXJlZl90YWcobywgcGF0aCwgMCk7CisJCQlpZiAobykKKwkJCQlmcHJpbnRmKGNiLT5yZWZzX2ZpbGUsICJeJXNcbiIsCisJCQkJCXNoYTFfdG9faGV4KG8tPnNoYTEpKTsKKwkJfQorCX0KKworCWlmIChjYi0+cHJ1bmUgJiYgIWRvX25vdF9wcnVuZShmbGFncykpIHsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCkgKyAxOworCQlzdHJ1Y3QgcmVmX3RvX3BydW5lICpuID0geGNhbGxvYygxLCBzaXplb2YoKm4pICsgbmFtZWxlbik7CisJCWhhc2hjcHkobi0+c2hhMSwgc2hhMSk7CisJCXN0cmNweShuLT5uYW1lLCBwYXRoKTsKKwkJbi0+bmV4dCA9IGNiLT5yZWZfdG9fcHJ1bmU7CisJCWNiLT5yZWZfdG9fcHJ1bmUgPSBuOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbWFrZSBzdXJlIG5vYm9keSB0b3VjaGVkIHRoZSByZWYsIGFuZCB1bmxpbmsgKi8KK3N0YXRpYyB2b2lkIHBydW5lX3JlZihzdHJ1Y3QgcmVmX3RvX3BydW5lICpyKQoreworCXN0cnVjdCByZWZfbG9jayAqbG9jayA9IGxvY2tfcmVmX3NoYTEoci0+bmFtZSArIDUsIHItPnNoYTEpOworCisJaWYgKGxvY2spIHsKKwkJdW5saW5rKGdpdF9wYXRoKCIlcyIsIHItPm5hbWUpKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBydW5lX3JlZnMoc3RydWN0IHJlZl90b19wcnVuZSAqcikKK3sKKwl3aGlsZSAocikgeworCQlwcnVuZV9yZWYocik7CisJCXIgPSByLT5uZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgcGFja2VkOworCitpbnQgY21kX3BhY2tfcmVmcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgZmQsIGk7CisJc3RydWN0IHBhY2tfcmVmc19jYl9kYXRhIGNiZGF0YTsKKworCW1lbXNldCgmY2JkYXRhLCAwLCBzaXplb2YoY2JkYXRhKSk7CisKKwljYmRhdGEucHJ1bmUgPSAxOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1wcnVuZSIpKSB7CisJCQljYmRhdGEucHJ1bmUgPSAxOyAvKiBub3cgdGhlIGRlZmF1bHQgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tcHJ1bmUiKSkgeworCQkJY2JkYXRhLnBydW5lID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYWxsIikpIHsKKwkJCWNiZGF0YS5hbGwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJLyogcGVyaGFwcyBvdGhlciBwYXJhbWV0ZXJzIGxhdGVyLi4uICovCisJCWJyZWFrOworCX0KKwlpZiAoaSAhPSBhcmdjKQorCQl1c2FnZShidWlsdGluX3BhY2tfcmVmc191c2FnZSk7CisKKwlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJnBhY2tlZCwgZ2l0X3BhdGgoInBhY2tlZC1yZWZzIiksIDEpOworCWNiZGF0YS5yZWZzX2ZpbGUgPSBmZG9wZW4oZmQsICJ3Iik7CisJaWYgKCFjYmRhdGEucmVmc19maWxlKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcmVmLXBhY2sgZmlsZSBzdHJ1Y3R1cmUgKCVzKSIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCisJLyogcGVyaGFwcyBvdGhlciB0cmFpdHMgbGF0ZXIgYXMgd2VsbCAqLworCWZwcmludGYoY2JkYXRhLnJlZnNfZmlsZSwgIiMgcGFjay1yZWZzIHdpdGg6IHBlZWxlZCBcbiIpOworCisJZm9yX2VhY2hfcmVmKGhhbmRsZV9vbmVfcmVmLCAmY2JkYXRhKTsKKwlmZmx1c2goY2JkYXRhLnJlZnNfZmlsZSk7CisJZnN5bmMoZmQpOworCWZjbG9zZShjYmRhdGEucmVmc19maWxlKTsKKwlpZiAoY29tbWl0X2xvY2tfZmlsZSgmcGFja2VkKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIG92ZXJ3cml0ZSBvbGQgcmVmLXBhY2sgZmlsZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoY2JkYXRhLnBydW5lKQorCQlwcnVuZV9yZWZzKGNiZGF0YS5yZWZfdG9fcHJ1bmUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wcnVuZS1wYWNrZWQuYyBiL2J1aWx0aW4tcHJ1bmUtcGFja2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3NzMwMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcHJ1bmUtcGFja2VkLmMKQEAgLTAsMCArMSw4NyBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBwcnVuZV9wYWNrZWRfdXNhZ2VbXSA9CisiZ2l0LXBydW5lLXBhY2tlZCBbLW5dIFstcV0iOworCisjZGVmaW5lIERSWV9SVU4gMDEKKyNkZWZpbmUgVkVSQk9TRSAwMgorCitzdGF0aWMgdm9pZCBwcnVuZV9kaXIoaW50IGksIERJUiAqZGlyLCBjaGFyICpwYXRobmFtZSwgaW50IGxlbiwgaW50IG9wdHMpCit7CisJc3RydWN0IGRpcmVudCAqZGU7CisJY2hhciBoZXhbNDBdOworCisJc3ByaW50ZihoZXgsICIlMDJ4IiwgaSk7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoc3RybGVuKGRlLT5kX25hbWUpICE9IDM4KQorCQkJY29udGludWU7CisJCW1lbWNweShoZXgrMiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFoYXNfc2hhMV9wYWNrKHNoYTEsIE5VTEwpKQorCQkJY29udGludWU7CisJCW1lbWNweShwYXRobmFtZSArIGxlbiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAob3B0cyAmIERSWV9SVU4pCisJCQlwcmludGYoInJtIC1mICVzXG4iLCBwYXRobmFtZSk7CisJCWVsc2UgaWYgKHVubGluayhwYXRobmFtZSkgPCAwKQorCQkJZXJyb3IoInVuYWJsZSB0byB1bmxpbmsgJXMiLCBwYXRobmFtZSk7CisJfQorCXBhdGhuYW1lW2xlbl0gPSAwOworCXJtZGlyKHBhdGhuYW1lKTsKK30KKwordm9pZCBwcnVuZV9wYWNrZWRfb2JqZWN0cyhpbnQgb3B0cykKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY2hhciBwYXRobmFtZVtQQVRIX01BWF07CisJY29uc3QgY2hhciAqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlpbnQgbGVuID0gc3RybGVuKGRpcik7CisKKwlpZiAobGVuID4gUEFUSF9NQVggLSA0MikKKwkJZGllKCJpbXBvc3NpYmxlIG9iamVjdCBkaXJlY3RvcnkiKTsKKwltZW1jcHkocGF0aG5hbWUsIGRpciwgbGVuKTsKKwlpZiAobGVuICYmIHBhdGhuYW1lW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJRElSICpkOworCisJCXNwcmludGYocGF0aG5hbWUgKyBsZW4sICIlMDJ4LyIsIGkpOworCQlkID0gb3BlbmRpcihwYXRobmFtZSk7CisJCWlmIChvcHRzID09IFZFUkJPU0UgJiYgKGQgfHwgaSA9PSAyNTUpKQorCQkJZnByaW50ZihzdGRlcnIsICJSZW1vdmluZyB1bnVzZWQgb2JqZWN0cyAlZCUlLi4uXDAxNSIsCisJCQkJKChpKzEpICogMTAwKSAvIDI1Nik7CisJCWlmICghZCkKKwkJCWNvbnRpbnVlOworCQlwcnVuZV9kaXIoaSwgZCwgcGF0aG5hbWUsIGxlbiArIDMsIG9wdHMpOworCQljbG9zZWRpcihkKTsKKwl9CisJaWYgKG9wdHMgPT0gVkVSQk9TRSkKKwkJZnByaW50ZihzdGRlcnIsICJcbkRvbmUuXG4iKTsKK30KKworaW50IGNtZF9wcnVuZV9wYWNrZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJaW50IG9wdHMgPSBWRVJCT1NFOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkKKwkJCQlvcHRzIHw9IERSWV9SVU47CisJCQllbHNlIGlmICghc3RyY21wKGFyZywgIi1xIikpCisJCQkJb3B0cyAmPSB+VkVSQk9TRTsKKwkJCWVsc2UKKwkJCQl1c2FnZShwcnVuZV9wYWNrZWRfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJLyogSGFuZGxlIGFyZ3VtZW50cyBoZXJlIC4uICovCisJCXVzYWdlKHBydW5lX3BhY2tlZF91c2FnZSk7CisJfQorCXN5bmMoKTsKKwlwcnVuZV9wYWNrZWRfb2JqZWN0cyhvcHRzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcHJ1bmUuYyBiL2J1aWx0aW4tcHJ1bmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRmNTllCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wcnVuZS5jCkBAIC0wLDAgKzEsMTAwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVhY2hhYmxlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHBydW5lX3VzYWdlW10gPSAiZ2l0LXBydW5lIFstbl0iOworc3RhdGljIGludCBzaG93X29ubHk7CisKK3N0YXRpYyBpbnQgcHJ1bmVfb2JqZWN0KGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChzaG93X29ubHkpIHsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksCisJCSAgICAgICAodHlwZSA+IDApID8gdHlwZW5hbWUodHlwZSkgOiAidW5rbm93biIpOworCX0gZWxzZQorCQl1bmxpbmsobWtwYXRoKCIlcy8lcyIsIHBhdGgsIGZpbGVuYW1lKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJ1bmVfZGlyKGludCBpLCBjaGFyICpwYXRoKQoreworCURJUiAqZGlyID0gb3BlbmRpcihwYXRoKTsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCWlmICghZGlyKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciBuYW1lWzEwMF07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWludCBsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisKKwkJc3dpdGNoIChsZW4pIHsKKwkJY2FzZSAyOgorCQkJaWYgKGRlLT5kX25hbWVbMV0gIT0gJy4nKQorCQkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoZGUtPmRfbmFtZVswXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAzODoKKwkJCXNwcmludGYobmFtZSwgIiUwMngiLCBpKTsKKwkJCW1lbWNweShuYW1lKzIsIGRlLT5kX25hbWUsIGxlbisxKTsKKwkJCWlmIChnZXRfc2hhMV9oZXgobmFtZSwgc2hhMSkgPCAwKQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogRG8gd2Uga25vdyBhYm91dCB0aGlzIG9iamVjdD8KKwkJCSAqIEl0IG11c3QgaGF2ZSBiZWVuIHJlYWNoYWJsZQorCQkJICovCisJCQlpZiAobG9va3VwX29iamVjdChzaGExKSkKKwkJCQljb250aW51ZTsKKworCQkJcHJ1bmVfb2JqZWN0KHBhdGgsIGRlLT5kX25hbWUsIHNoYTEpOworCQkJY29udGludWU7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJiYWQgc2hhMSBmaWxlOiAlcy8lc1xuIiwgcGF0aCwgZGUtPmRfbmFtZSk7CisJfQorCWlmICghc2hvd19vbmx5KQorCQlybWRpcihwYXRoKTsKKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcnVuZV9vYmplY3RfZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGRpcls0MDk2XTsKKwkJc3ByaW50ZihkaXIsICIlcy8lMDJ4IiwgcGF0aCwgaSk7CisJCXBydW5lX2RpcihpLCBkaXIpOworCX0KK30KKworaW50IGNtZF9wcnVuZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJc2hvd19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKHBydW5lX3VzYWdlKTsKKwl9CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBwcmVmaXgpOworCW1hcmtfcmVhY2hhYmxlX29iamVjdHMoJnJldnMsIDEpOworCisJcHJ1bmVfb2JqZWN0X2RpcihnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCXN5bmMoKTsKKwlwcnVuZV9wYWNrZWRfb2JqZWN0cyhzaG93X29ubHkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wdXNoLmMgYi9idWlsdGluLXB1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjc4NDAxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wdXNoLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiAiZ2l0IHB1c2giCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworI2RlZmluZSBNQVhfVVJJICgxNikKKworc3RhdGljIGNvbnN0IGNoYXIgcHVzaF91c2FnZVtdID0gImdpdC1wdXNoIFstLWFsbF0gWy0tdGFnc10gWy0tcmVjZWl2ZS1wYWNrPTxnaXQtcmVjZWl2ZS1wYWNrPl0gWy0tcmVwbz1hbGxdIFstZiB8IC0tZm9yY2VdIFstdl0gWzxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi5dIjsKKworc3RhdGljIGludCBhbGwsIHRhZ3MsIGZvcmNlLCB0aGluID0gMSwgdmVyYm9zZTsKK3N0YXRpYyBjb25zdCBjaGFyICpyZWNlaXZlcGFjazsKKworI2RlZmluZSBCVUZfU0laRSAoMjA4NCkKK3N0YXRpYyBjaGFyIGJ1ZmZlcltCVUZfU0laRV07CisKK3N0YXRpYyBjb25zdCBjaGFyICoqcmVmc3BlYzsKK3N0YXRpYyBpbnQgcmVmc3BlY19ucjsKKworc3RhdGljIHZvaWQgYWRkX3JlZnNwZWMoY29uc3QgY2hhciAqcmVmKQoreworCWludCBuciA9IHJlZnNwZWNfbnIgKyAxOworCXJlZnNwZWMgPSB4cmVhbGxvYyhyZWZzcGVjLCBuciAqIHNpemVvZihjaGFyICopKTsKKwlyZWZzcGVjW25yLTFdID0gcmVmOworCXJlZnNwZWNfbnIgPSBucjsKK30KKworc3RhdGljIGludCBleHBhbmRfb25lX3JlZihjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCS8qIElnbm9yZSB0aGUgInJlZnMvIiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWZuYW1lICovCisJcmVmICs9IDU7CisKKwlpZiAoIXByZWZpeGNtcChyZWYsICJ0YWdzLyIpKQorCQlhZGRfcmVmc3BlYyh4c3RyZHVwKHJlZikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHBhbmRfcmVmc3BlY3Modm9pZCkKK3sKKwlpZiAoYWxsKSB7CisJCWlmIChyZWZzcGVjX25yKQorCQkJZGllKCJjYW5ub3QgbWl4ICctLWFsbCcgYW5kIGEgcmVmc3BlYyIpOworCisJCS8qCisJCSAqIE5vIG5lZWQgdG8gZXhwYW5kICItLWFsbCIgLSB3ZSdsbCBqdXN0IHVzZQorCQkgKiB0aGUgIi0tYWxsIiBmbGFnIHRvIHNlbmQtcGFjaworCQkgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoIXRhZ3MpCisJCXJldHVybjsKKwlmb3JfZWFjaF9yZWYoZXhwYW5kX29uZV9yZWYsIE5VTEwpOworfQorCitzdHJ1Y3Qgd2lsZGNhcmRfY2IgeworCWNvbnN0IGNoYXIgKmZyb21fcHJlZml4OworCWludCBmcm9tX3ByZWZpeF9sZW47CisJY29uc3QgY2hhciAqdG9fcHJlZml4OworCWludCB0b19wcmVmaXhfbGVuOworCWludCBmb3JjZTsKK307CisKK3N0YXRpYyBpbnQgZXhwYW5kX3dpbGRjYXJkX3JlZihjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCB3aWxkY2FyZF9jYiAqY2IgPSBjYl9kYXRhOworCWludCBsZW4gPSBzdHJsZW4ocmVmKTsKKwljaGFyICpleHBhbmRlZCwgKm5ld3JlZjsKKworCWlmIChsZW4gPCBjYi0+ZnJvbV9wcmVmaXhfbGVuIHx8CisJICAgIG1lbWNtcChjYi0+ZnJvbV9wcmVmaXgsIHJlZiwgY2ItPmZyb21fcHJlZml4X2xlbikpCisJCXJldHVybiAwOworCWV4cGFuZGVkID0geG1hbGxvYyhsZW4gKiAyICsgY2ItPmZvcmNlICsKKwkJCSAgIChjYi0+dG9fcHJlZml4X2xlbiAtIGNiLT5mcm9tX3ByZWZpeF9sZW4pICsgMik7CisJbmV3cmVmID0gZXhwYW5kZWQgKyBjYi0+Zm9yY2U7CisJaWYgKGNiLT5mb3JjZSkKKwkJZXhwYW5kZWRbMF0gPSAnKyc7CisJbWVtY3B5KG5ld3JlZiwgcmVmLCBsZW4pOworCW5ld3JlZltsZW5dID0gJzonOworCW1lbWNweShuZXdyZWYgKyBsZW4gKyAxLCBjYi0+dG9fcHJlZml4LCBjYi0+dG9fcHJlZml4X2xlbik7CisJc3RyY3B5KG5ld3JlZiArIGxlbiArIDEgKyBjYi0+dG9fcHJlZml4X2xlbiwKKwkgICAgICAgcmVmICsgY2ItPmZyb21fcHJlZml4X2xlbik7CisJYWRkX3JlZnNwZWMoZXhwYW5kZWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdpbGRjYXJkX3JlZihjb25zdCBjaGFyICpyZWYpCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpjb2xvbjsKKwlzdHJ1Y3Qgd2lsZGNhcmRfY2IgY2I7CisKKwltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKKwlpZiAocmVmWzBdID09ICcrJykgeworCQljYi5mb3JjZSA9IDE7CisJCXJlZisrOworCX0KKwlsZW4gPSBzdHJsZW4ocmVmKTsKKwljb2xvbiA9IHN0cmNocihyZWYsICc6Jyk7CisJaWYgKCEgKGNvbG9uICYmIHJlZiA8IGNvbG9uICYmCisJICAgICAgIGNvbG9uWy0yXSA9PSAnLycgJiYgY29sb25bLTFdID09ICcqJyAmJgorCSAgICAgICAvKiAiPG1pbmU+Lzxhc3Rlcmlzaz46PHlvdXJzPi88YXN0ZXJpc2s+IiBpcyBhdCBsZWFzdCA3IGJ5dGVzICovCisJICAgICAgIDcgPD0gbGVuICYmCisJICAgICAgIHJlZltsZW4tMl0gPT0gJy8nICYmIHJlZltsZW4tMV0gPT0gJyonKSApCisJCXJldHVybiAwIDsKKwljYi5mcm9tX3ByZWZpeCA9IHJlZjsKKwljYi5mcm9tX3ByZWZpeF9sZW4gPSBjb2xvbiAtIHJlZiAtIDE7CisJY2IudG9fcHJlZml4ID0gY29sb24gKyAxOworCWNiLnRvX3ByZWZpeF9sZW4gPSBsZW4gLSAoY29sb24gLSByZWYpIC0gMjsKKwlmb3JfZWFjaF9yZWYoZXhwYW5kX3dpbGRjYXJkX3JlZiwgJmNiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2V0X3JlZnNwZWNzKGNvbnN0IGNoYXIgKipyZWZzLCBpbnQgbnIpCit7CisJaWYgKG5yKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcmVmID0gcmVmc1tpXTsKKwkJCWlmICghc3RyY21wKCJ0YWciLCByZWYpKSB7CisJCQkJY2hhciAqdGFnOworCQkJCWludCBsZW47CisJCQkJaWYgKG5yIDw9ICsraSkKKwkJCQkJZGllKCJ0YWcgc2hvcnRoYW5kIHdpdGhvdXQgPHRhZz4iKTsKKwkJCQlsZW4gPSBzdHJsZW4ocmVmc1tpXSkgKyAxMTsKKwkJCQl0YWcgPSB4bWFsbG9jKGxlbik7CisJCQkJc3RyY3B5KHRhZywgInJlZnMvdGFncy8iKTsKKwkJCQlzdHJjYXQodGFnLCByZWZzW2ldKTsKKwkJCQlyZWYgPSB0YWc7CisJCQl9CisJCQllbHNlIGlmICh3aWxkY2FyZF9yZWYocmVmKSkKKwkJCQljb250aW51ZTsKKwkJCWFkZF9yZWZzcGVjKHJlZik7CisJCX0KKwl9CisJZXhwYW5kX3JlZnNwZWNzKCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwlpbnQgbiA9IDA7CisJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJyZW1vdGVzLyVzIiwgcmVwbyksICJyIik7CisJaW50IGhhc19leHBsaWNpdF9yZWZzcGVjID0gcmVmc3BlY19uciB8fCBhbGwgfHwgdGFnczsKKworCWlmICghZikKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKSkgeworCQlpbnQgaXNfcmVmc3BlYzsKKwkJY2hhciAqcywgKnA7CisKKwkJaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAiVVJMOiIpKSB7CisJCQlpc19yZWZzcGVjID0gMDsKKwkJCXMgPSBidWZmZXIgKyA0OworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAiUHVzaDoiKSkgeworCQkJaXNfcmVmc3BlYyA9IDE7CisJCQlzID0gYnVmZmVyICsgNTsKKwkJfSBlbHNlCisJCQljb250aW51ZTsKKworCQkvKiBSZW1vdmUgd2hpdGVzcGFjZSBhdCB0aGUgaGVhZC4uICovCisJCXdoaWxlIChpc3NwYWNlKCpzKSkKKwkJCXMrKzsKKwkJaWYgKCEqcykKKwkJCWNvbnRpbnVlOworCisJCS8qIC4uYW5kIGF0IHRoZSBlbmQgKi8KKwkJcCA9IHMgKyBzdHJsZW4ocyk7CisJCXdoaWxlIChpc3NwYWNlKHBbLTFdKSkKKwkJCSotLXAgPSAwOworCisJCWlmICghaXNfcmVmc3BlYykgeworCQkJaWYgKG4gPCBNQVhfVVJJKQorCQkJCXVyaVtuKytdID0geHN0cmR1cChzKTsKKwkJCWVsc2UKKwkJCQllcnJvcigibW9yZSB0aGFuICVkIFVSTCdzIHNwZWNpZmllZCwgaWdub3JpbmcgdGhlIHJlc3QiLCBNQVhfVVJJKTsKKwkJfQorCQllbHNlIGlmIChpc19yZWZzcGVjICYmICFoYXNfZXhwbGljaXRfcmVmc3BlYykgeworCQkJaWYgKCF3aWxkY2FyZF9yZWYocykpCisJCQkJYWRkX3JlZnNwZWMoeHN0cmR1cChzKSk7CisJCX0KKwl9CisJZmNsb3NlKGYpOworCWlmICghbikKKwkJZGllKCJyZW1vdGUgJyVzJyBoYXMgbm8gVVJMIiwgcmVwbyk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoqY29uZmlnX3VyaTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfcmVwbzsKK3N0YXRpYyBpbnQgY29uZmlnX3JlcG9fbGVuOworc3RhdGljIGludCBjb25maWdfY3VycmVudF91cmk7CitzdGF0aWMgaW50IGNvbmZpZ19nZXRfcmVmc3BlY3M7CitzdGF0aWMgaW50IGNvbmZpZ19nZXRfcmVjZWl2ZXBhY2s7CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZV9jb25maWcoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlpZiAoIXByZWZpeGNtcChrZXksICJyZW1vdGUuIikgJiYKKwkgICAgIXN0cm5jbXAoa2V5ICsgNywgY29uZmlnX3JlcG8sIGNvbmZpZ19yZXBvX2xlbikpIHsKKwkJaWYgKCFzdHJjbXAoa2V5ICsgNyArIGNvbmZpZ19yZXBvX2xlbiwgIi51cmwiKSkgeworCQkJaWYgKGNvbmZpZ19jdXJyZW50X3VyaSA8IE1BWF9VUkkpCisJCQkJY29uZmlnX3VyaVtjb25maWdfY3VycmVudF91cmkrK10gPSB4c3RyZHVwKHZhbHVlKTsKKwkJCWVsc2UKKwkJCQllcnJvcigibW9yZSB0aGFuICVkIFVSTCdzIHNwZWNpZmllZCwgaWdub3JpbmcgdGhlIHJlc3QiLCBNQVhfVVJJKTsKKwkJfQorCQllbHNlIGlmIChjb25maWdfZ2V0X3JlZnNwZWNzICYmCisJCQkgIXN0cmNtcChrZXkgKyA3ICsgY29uZmlnX3JlcG9fbGVuLCAiLnB1c2giKSkgeworCQkJaWYgKCF3aWxkY2FyZF9yZWYodmFsdWUpKQorCQkJCWFkZF9yZWZzcGVjKHhzdHJkdXAodmFsdWUpKTsKKwkJfQorCQllbHNlIGlmIChjb25maWdfZ2V0X3JlY2VpdmVwYWNrICYmCisJCQkgIXN0cmNtcChrZXkgKyA3ICsgY29uZmlnX3JlcG9fbGVuLCAiLnJlY2VpdmVwYWNrIikpIHsKKwkJCWlmICghcmVjZWl2ZXBhY2spIHsKKwkJCQljaGFyICpycCA9IHhtYWxsb2Moc3RybGVuKHZhbHVlKSArIDE2KTsKKwkJCQlzcHJpbnRmKHJwLCAiLS1yZWNlaXZlLXBhY2s9JXMiLCB2YWx1ZSk7CisJCQkJcmVjZWl2ZXBhY2sgPSBycDsKKwkJCX0gZWxzZQorCQkJCWVycm9yKCJtb3JlIHRoYW4gb25lIHJlY2VpdmVwYWNrIGdpdmVuLCB1c2luZyB0aGUgZmlyc3QiKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfY29uZmlnX3JlbW90ZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwljb25maWdfcmVwb19sZW4gPSBzdHJsZW4ocmVwbyk7CisJY29uZmlnX3JlcG8gPSByZXBvOworCWNvbmZpZ19jdXJyZW50X3VyaSA9IDA7CisJY29uZmlnX3VyaSA9IHVyaTsKKwljb25maWdfZ2V0X3JlZnNwZWNzID0gIShyZWZzcGVjX25yIHx8IGFsbCB8fCB0YWdzKTsKKwljb25maWdfZ2V0X3JlY2VpdmVwYWNrID0gKHJlY2VpdmVwYWNrID09IE5VTEwpOworCisJZ2l0X2NvbmZpZyhnZXRfcmVtb3RlX2NvbmZpZyk7CisJcmV0dXJuIGNvbmZpZ19jdXJyZW50X3VyaTsKK30KKworc3RhdGljIGludCBnZXRfYnJhbmNoZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwljb25zdCBjaGFyICpzbGFzaCA9IHN0cmNocihyZXBvLCAnLycpOworCWludCBuID0gc2xhc2ggPyBzbGFzaCAtIHJlcG8gOiAxMDAwOworCUZJTEUgKmYgPSBmb3BlbihnaXRfcGF0aCgiYnJhbmNoZXMvJS4qcyIsIG4sIHJlcG8pLCAiciIpOworCWNoYXIgKnMsICpwOworCWludCBsZW47CisKKwlpZiAoIWYpCisJCXJldHVybiAwOworCXMgPSBmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKTsKKwlmY2xvc2UoZik7CisJaWYgKCFzKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoaXNzcGFjZSgqcykpCisJCXMrKzsKKwlpZiAoISpzKQorCQlyZXR1cm4gMDsKKwlwID0gcyArIHN0cmxlbihzKTsKKwl3aGlsZSAoaXNzcGFjZShwWy0xXSkpCisJCSotLXAgPSAwOworCWxlbiA9IHAgLSBzOworCWlmIChzbGFzaCkKKwkJbGVuICs9IHN0cmxlbihzbGFzaCk7CisJcCA9IHhtYWxsb2MobGVuICsgMSk7CisJc3RyY3B5KHAsIHMpOworCWlmIChzbGFzaCkKKwkJc3RyY2F0KHAsIHNsYXNoKTsKKwl1cmlbMF0gPSBwOworCXJldHVybiAxOworfQorCisvKgorICogUmVhZCByZW1vdGVzIGFuZCBicmFuY2hlcyBmaWxlLCBmaWxsIHRoZSBwdXNoIHRhcmdldCBVUkkKKyAqIGxpc3QuICBJZiB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUgcmVmc3BlY3MsIHJlYWQgUHVzaDogbGluZXMKKyAqIHRvIHNldCB1cCB0aGUgKnJlZnNwZWMgbGlzdCBhcyB3ZWxsLgorICogcmV0dXJuIHRoZSBudW1iZXIgb2YgcHVzaCB0YXJnZXQgVVJJcworICovCitzdGF0aWMgaW50IHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwlpbnQgbjsKKworCWlmICgqcmVwbyAhPSAnLycpIHsKKwkJbiA9IGdldF9yZW1vdGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKworCQluID0gZ2V0X2NvbmZpZ19yZW1vdGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKworCQluID0gZ2V0X2JyYW5jaGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKwl9CisKKwl1cmlbMF0gPSByZXBvOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRvX3B1c2goY29uc3QgY2hhciAqcmVwbykKK3sKKwljb25zdCBjaGFyICp1cmlbTUFYX1VSSV07CisJaW50IGksIG4sIGVycnM7CisJaW50IGNvbW1vbl9hcmdjOworCWNvbnN0IGNoYXIgKiphcmd2OworCWludCBhcmdjOworCisJbiA9IHJlYWRfY29uZmlnKHJlcG8sIHVyaSk7CisJaWYgKG4gPD0gMCkKKwkJZGllKCJiYWQgcmVwb3NpdG9yeSAnJXMnIiwgcmVwbyk7CisKKwlhcmd2ID0geG1hbGxvYygocmVmc3BlY19uciArIDEwKSAqIHNpemVvZihjaGFyICopKTsKKwlhcmd2WzBdID0gImR1bW15LXNlbmQtcGFjayI7CisJYXJnYyA9IDE7CisJaWYgKGFsbCkKKwkJYXJndlthcmdjKytdID0gIi0tYWxsIjsKKwlpZiAoZm9yY2UpCisJCWFyZ3ZbYXJnYysrXSA9ICItLWZvcmNlIjsKKwlpZiAocmVjZWl2ZXBhY2spCisJCWFyZ3ZbYXJnYysrXSA9IHJlY2VpdmVwYWNrOworCWNvbW1vbl9hcmdjID0gYXJnYzsKKworCWVycnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaW50IGVycjsKKwkJaW50IGRlc3RfYXJnYyA9IGNvbW1vbl9hcmdjOworCQlpbnQgZGVzdF9yZWZzcGVjX25yID0gcmVmc3BlY19ucjsKKwkJY29uc3QgY2hhciAqKmRlc3RfcmVmc3BlYyA9IHJlZnNwZWM7CisJCWNvbnN0IGNoYXIgKmRlc3QgPSB1cmlbaV07CisJCWNvbnN0IGNoYXIgKnNlbmRlciA9ICJzZW5kLXBhY2siOworCQlpZiAoIXByZWZpeGNtcChkZXN0LCAiaHR0cDovLyIpIHx8CisJCSAgICAhcHJlZml4Y21wKGRlc3QsICJodHRwczovLyIpKQorCQkJc2VuZGVyID0gImh0dHAtcHVzaCI7CisJCWVsc2UgaWYgKHRoaW4pCisJCQlhcmd2W2Rlc3RfYXJnYysrXSA9ICItLXRoaW4iOworCQlhcmd2WzBdID0gc2VuZGVyOworCQlhcmd2W2Rlc3RfYXJnYysrXSA9IGRlc3Q7CisJCXdoaWxlIChkZXN0X3JlZnNwZWNfbnItLSkKKwkJCWFyZ3ZbZGVzdF9hcmdjKytdID0gKmRlc3RfcmVmc3BlYysrOworCQlhcmd2W2Rlc3RfYXJnY10gPSBOVUxMOworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiUHVzaGluZyB0byAlc1xuIiwgZGVzdCk7CisJCWVyciA9IHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3YsIFJVTl9HSVRfQ01EKTsKKwkJaWYgKCFlcnIpCisJCQljb250aW51ZTsKKworCQllcnJvcigiZmFpbGVkIHRvIHB1c2ggdG8gJyVzJyIsIHVyaVtpXSk7CisJCXN3aXRjaCAoZXJyKSB7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9GT1JLOgorCQkJZXJyb3IoInVuYWJsZSB0byBmb3JrIGZvciAlcyIsIHNlbmRlcik7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9FWEVDOgorCQkJZXJyb3IoInVuYWJsZSB0byBleGVjICVzIiwgc2VuZGVyKTsKKwkJCWJyZWFrOworCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDoKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUw6CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX05PRVhJVDoKKwkJCWVycm9yKCIlcyBkaWVkIHdpdGggc3RyYW5nZSBlcnJvciIsIHNlbmRlcik7CisJCX0KKwkJZXJycysrOworCX0KKwlyZXR1cm4gISFlcnJzOworfQorCitpbnQgY21kX3B1c2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqcmVwbyA9ICJvcmlnaW4iOwkvKiBkZWZhdWx0IHJlcG9zaXRvcnkgKi8KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXJnWzBdICE9ICctJykgeworCQkJcmVwbyA9IGFyZzsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXZlcmJvc2U9MTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcmVwbz0iKSkgeworCQkJcmVwbyA9IGFyZys3OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKSB7CisJCQl0YWdzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZm9yY2UiKSB8fCAhc3RyY21wKGFyZywgIi1mIikpIHsKKwkJCWZvcmNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGhpbiIpKSB7CisJCQl0aGluID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tdGhpbiIpKSB7CisJCQl0aGluID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcmVjZWl2ZS1wYWNrPSIpKSB7CisJCQlyZWNlaXZlcGFjayA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhlYz0iKSkgeworCQkJcmVjZWl2ZXBhY2sgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShwdXNoX3VzYWdlKTsKKwl9CisJc2V0X3JlZnNwZWNzKGFyZ3YgKyBpLCBhcmdjIC0gaSk7CisJcmV0dXJuIGRvX3B1c2gocmVwbyk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlYWQtdHJlZS5jIGIvYnVpbHRpbi1yZWFkLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTZmYjBmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZWFkLXRyZWUuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInVucGFjay10cmVlcy5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqdHJlZXM7CisKK3N0YXRpYyBpbnQgbGlzdF90cmVlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHRyZWUgKnRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHNoYTEpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIC0xOworCW9iamVjdF9saXN0X2FwcGVuZCgmdHJlZS0+b2JqZWN0LCAmdHJlZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2FjaGVfdW5tZXJnZWQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKipkc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpsYXN0ID0gTlVMTDsKKworCXJlYWRfY2FjaGUoKTsKKwlkc3QgPSBhY3RpdmVfY2FjaGU7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCWlmIChsYXN0ICYmICFzdHJjbXAoY2UtPm5hbWUsIGxhc3QtPm5hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIGNlLT5uYW1lKTsKKwkJCWxhc3QgPSBjZTsKKwkJCWNlLT5jZV9tb2RlID0gMDsKKwkJCWNlLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfU1RBR0VNQVNLKTsKKwkJfQorCQkqZHN0KysgPSBjZTsKKwl9CisJYWN0aXZlX25yID0gZHN0IC0gYWN0aXZlX2NhY2hlOworCXJldHVybiAhIWxhc3Q7Cit9CisKK3N0YXRpYyB2b2lkIHByaW1lX2NhY2hlX3RyZWVfcmVjKHN0cnVjdCBjYWNoZV90cmVlICppdCwgc3RydWN0IHRyZWUgKnRyZWUpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCWludCBjbnQ7CisKKwloYXNoY3B5KGl0LT5zaGExLCB0cmVlLT5vYmplY3Quc2hhMSk7CisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisJY250ID0gMDsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoIVNfSVNESVIoZW50cnkubW9kZSkpCisJCQljbnQrKzsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKwkJCXN0cnVjdCB0cmVlICpzdWJ0cmVlID0gbG9va3VwX3RyZWUoZW50cnkuc2hhMSk7CisJCQlpZiAoIXN1YnRyZWUtPm9iamVjdC5wYXJzZWQpCisJCQkJcGFyc2VfdHJlZShzdWJ0cmVlKTsKKwkJCXN1YiA9IGNhY2hlX3RyZWVfc3ViKGl0LCBlbnRyeS5wYXRoKTsKKwkJCXN1Yi0+Y2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwkJCXByaW1lX2NhY2hlX3RyZWVfcmVjKHN1Yi0+Y2FjaGVfdHJlZSwgc3VidHJlZSk7CisJCQljbnQgKz0gc3ViLT5jYWNoZV90cmVlLT5lbnRyeV9jb3VudDsKKwkJfQorCX0KKwlpdC0+ZW50cnlfY291bnQgPSBjbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW1lX2NhY2hlX3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZSA9IChzdHJ1Y3QgdHJlZSAqKXRyZWVzLT5pdGVtOworCWlmICghdHJlZSkKKwkJcmV0dXJuOworCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCXByaW1lX2NhY2hlX3RyZWVfcmVjKGFjdGl2ZV9jYWNoZV90cmVlLCB0cmVlKTsKKworfQorCitzdGF0aWMgY29uc3QgY2hhciByZWFkX3RyZWVfdXNhZ2VbXSA9ICJnaXQtcmVhZC10cmVlICg8c2hhPiB8IFtbLW0gWy0tYWdncmVzc2l2ZV0gfCAtLXJlc2V0IHwgLS1wcmVmaXg9PHByZWZpeD5dIFstdSB8IC1pXV0gWy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxnaXRpZ25vcmU+XSBbLS1pbmRleC1vdXRwdXQ9PGZpbGU+XSA8c2hhMT4gWzxzaGEyPiBbPHNoYTM+XV0pIjsKKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitpbnQgY21kX3JlYWRfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnVudXNlZF9wcmVmaXgpCit7CisJaW50IGksIG5ld2ZkLCBzdGFnZSA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLmhlYWRfaWR4ID0gLTE7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleCgmbG9ja19maWxlLCAxKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQkvKiAiLXUiIG1lYW5zICJ1cGRhdGUiLCBtZWFuaW5nIHRoYXQgYSBtZXJnZSB3aWxsIHVwZGF0ZQorCQkgKiB0aGUgd29ya2luZyB0cmVlLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXUiKSkgeworCQkJb3B0cy51cGRhdGUgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcChhcmcsICItdiIpKSB7CisJCQlvcHRzLnZlcmJvc2VfdXBkYXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIi1pIiBtZWFucyAiaW5kZXggb25seSIsIG1lYW5pbmcgdGhhdCBhIG1lcmdlIHdpbGwKKwkJICogbm90IGV2ZW4gbG9vayBhdCB0aGUgd29ya2luZyB0cmVlLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWkiKSkgeworCQkJb3B0cy5pbmRleF9vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1pbmRleC1vdXRwdXQ9IikpIHsKKwkJCXNldF9hbHRlcm5hdGVfaW5kZXhfb3V0cHV0KGFyZyArIDE1KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIi0tcHJlZml4PTxzdWJkaXJlY3Rvcnk+LyIgbWVhbnMga2VlcCB0aGUgY3VycmVudCBpbmRleAorCQkgKiAgZW50cmllcyBhbmQgcHV0IHRoZSBlbnRyaWVzIGZyb20gdGhlIHRyZWUgdW5kZXIgdGhlCisJCSAqIGdpdmVuIHN1YmRpcmVjdG9yeS4KKwkJICovCisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcHJlZml4PSIpKSB7CisJCQlpZiAoc3RhZ2UgfHwgb3B0cy5tZXJnZSB8fCBvcHRzLnByZWZpeCkKKwkJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCQkJb3B0cy5wcmVmaXggPSBhcmcgKyA5OworCQkJb3B0cy5tZXJnZSA9IDE7CisJCQlzdGFnZSA9IDE7CisJCQlpZiAocmVhZF9jYWNoZV91bm1lcmdlZCgpKQorCQkJCWRpZSgieW91IG5lZWQgdG8gcmVzb2x2ZSB5b3VyIGN1cnJlbnQgaW5kZXggZmlyc3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhpcyBkaWZmZXJzIGZyb20gIi1tIiBpbiB0aGF0IHdlJ2xsIHNpbGVudGx5IGlnbm9yZQorCQkgKiB1bm1lcmdlZCBlbnRyaWVzIGFuZCBvdmVyd3JpdGUgd29ya2luZyB0cmVlIGZpbGVzIHRoYXQKKwkJICogY29ycmVzcG9uZCB0byB0aGVtLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZXNldCIpKSB7CisJCQlpZiAoc3RhZ2UgfHwgb3B0cy5tZXJnZSB8fCBvcHRzLnByZWZpeCkKKwkJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCQkJb3B0cy5yZXNldCA9IDE7CisJCQlvcHRzLm1lcmdlID0gMTsKKwkJCXN0YWdlID0gMTsKKwkJCXJlYWRfY2FjaGVfdW5tZXJnZWQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10cml2aWFsIikpIHsKKwkJCW9wdHMudHJpdmlhbF9tZXJnZXNfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi0tYWdncmVzc2l2ZSIpKSB7CisJCQlvcHRzLmFnZ3Jlc3NpdmUgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiAiLW0iIHN0YW5kcyBmb3IgIm1lcmdlIiwgbWVhbmluZyB3ZSBzdGFydCBpbiBzdGFnZSAxICovCisJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCWlmIChzdGFnZSB8fCBvcHRzLm1lcmdlIHx8IG9wdHMucHJlZml4KQorCQkJCXVzYWdlKHJlYWRfdHJlZV91c2FnZSk7CisJCQlpZiAocmVhZF9jYWNoZV91bm1lcmdlZCgpKQorCQkJCWRpZSgieW91IG5lZWQgdG8gcmVzb2x2ZSB5b3VyIGN1cnJlbnQgaW5kZXggZmlyc3QiKTsKKwkJCXN0YWdlID0gMTsKKwkJCW9wdHMubWVyZ2UgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0iKSkgeworCQkJc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcjsKKworCQkJaWYgKG9wdHMuZGlyKQorCQkJCWRpZSgibW9yZSB0aGFuIG9uZSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSBhcmUgZ2l2ZW4uIik7CisKKwkJCWRpciA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpvcHRzLmRpcikpOworCQkJZGlyLT5zaG93X2lnbm9yZWQgPSAxOworCQkJZGlyLT5leGNsdWRlX3Blcl9kaXIgPSBhcmcgKyAyNDsKKwkJCW9wdHMuZGlyID0gZGlyOworCQkJLyogV2UgZG8gbm90IG5lZWQgdG8gbm9yIHdhbnQgdG8gZG8gcmVhZC1kaXJlY3RvcnkKKwkJCSAqIGhlcmU7IHdlIGFyZSBtZXJlbHkgaW50ZXJlc3RlZCBpbiByZXVzaW5nIHRoZQorCQkJICogcGVyIGRpcmVjdG9yeSBpZ25vcmUgc3RhY2sgbWVjaGFuaXNtLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHVzaW5nIC11IGFuZCAtaSBhdCB0aGUgc2FtZSB0aW1lIG1ha2VzIG5vIHNlbnNlICovCisJCWlmICgxIDwgb3B0cy5pbmRleF9vbmx5ICsgb3B0cy51cGRhdGUpCisJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCisJCWlmIChnZXRfc2hhMShhcmcsIHNoYTEpKQorCQkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZyk7CisJCWlmIChsaXN0X3RyZWUoc2hhMSkgPCAwKQorCQkJZGllKCJmYWlsZWQgdG8gdW5wYWNrIHRyZWUgb2JqZWN0ICVzIiwgYXJnKTsKKwkJc3RhZ2UrKzsKKwl9CisJaWYgKChvcHRzLnVwZGF0ZXx8b3B0cy5pbmRleF9vbmx5KSAmJiAhb3B0cy5tZXJnZSkKKwkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKwlpZiAoKG9wdHMuZGlyICYmICFvcHRzLnVwZGF0ZSkpCisJCWRpZSgiLS1leGNsdWRlLXBlci1kaXJlY3RvcnkgaXMgbWVhbmluZ2xlc3MgdW5sZXNzIC11Iik7CisKKwlpZiAob3B0cy5wcmVmaXgpIHsKKwkJaW50IHBmeGxlbiA9IHN0cmxlbihvcHRzLnByZWZpeCk7CisJCWludCBwb3M7CisJCWlmIChvcHRzLnByZWZpeFtwZnhsZW4tMV0gIT0gJy8nKQorCQkJZGllKCJwcmVmaXggbXVzdCBlbmQgd2l0aCAvIik7CisJCWlmIChzdGFnZSAhPSAyKQorCQkJZGllKCJiaW5kaW5nIG1lcmdlIHRha2VzIG9ubHkgb25lIHRyZWUiKTsKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3Mob3B0cy5wcmVmaXgsIHBmeGxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiY29ycnVwdCBpbmRleCBmaWxlIik7CisJCXBvcyA9IC1wb3MtMTsKKwkJaWYgKHBvcyA8IGFjdGl2ZV9uciAmJgorCQkgICAgIXN0cm5jbXAoYWN0aXZlX2NhY2hlW3Bvc10tPm5hbWUsIG9wdHMucHJlZml4LCBwZnhsZW4pKQorCQkJZGllKCJzdWJkaXJlY3RvcnkgJyVzJyBhbHJlYWR5IGV4aXN0cy4iLCBvcHRzLnByZWZpeCk7CisJCXBvcyA9IGNhY2hlX25hbWVfcG9zKG9wdHMucHJlZml4LCBwZnhsZW4tMSk7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiZmlsZSAnJS4qcycgYWxyZWFkeSBleGlzdHMuIiwKKwkJCQkJcGZ4bGVuLTEsIG9wdHMucHJlZml4KTsKKwkJb3B0cy5wb3MgPSAtMSAtIHBvczsKKwl9CisKKwlpZiAob3B0cy5tZXJnZSkgeworCQlpZiAoc3RhZ2UgPCAyKQorCQkJZGllKCJqdXN0IGhvdyBkbyB5b3UgZXhwZWN0IG1lIHRvIG1lcmdlICVkIHRyZWVzPyIsIHN0YWdlLTEpOworCQlzd2l0Y2ggKHN0YWdlIC0gMSkgeworCQljYXNlIDE6CisJCQlvcHRzLmZuID0gb3B0cy5wcmVmaXggPyBiaW5kX21lcmdlIDogb25ld2F5X21lcmdlOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW9wdHMuZm4gPSB0d293YXlfbWVyZ2U7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQlkZWZhdWx0OgorCQkJb3B0cy5mbiA9IHRocmVld2F5X21lcmdlOworCQkJY2FjaGVfdHJlZV9mcmVlKCZhY3RpdmVfY2FjaGVfdHJlZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGFnZSAtIDEgPj0gMykKKwkJCW9wdHMuaGVhZF9pZHggPSBzdGFnZSAtIDI7CisJCWVsc2UKKwkJCW9wdHMuaGVhZF9pZHggPSAxOworCX0KKworCXVucGFja190cmVlcyh0cmVlcywgJm9wdHMpOworCisJLyoKKwkgKiBXaGVuIHJlYWRpbmcgb25seSBvbmUgdHJlZSAoZWl0aGVyIHRoZSBtb3N0IGJhc2ljIGZvcm0sCisJICogIi1tIGVudCIgb3IgIi0tcmVzZXQgZW50IiBmb3JtKSwgd2UgY2FuIG9idGFpbiBhIGZ1bGx5CisJICogdmFsaWQgY2FjaGUtdHJlZSBiZWNhdXNlIHRoZSBpbmRleCBtdXN0IG1hdGNoIGV4YWN0bHkKKwkgKiB3aGF0IGNhbWUgZnJvbSB0aGUgdHJlZS4KKwkgKi8KKwlpZiAodHJlZXMgJiYgdHJlZXMtPml0ZW0gJiYgIW9wdHMucHJlZml4ICYmICghb3B0cy5tZXJnZSB8fCAoc3RhZ2UgPT0gMikpKSB7CisJCWNhY2hlX3RyZWVfZnJlZSgmYWN0aXZlX2NhY2hlX3RyZWUpOworCQlwcmltZV9jYWNoZV90cmVlKCk7CisJfQorCisJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlZmxvZy5jIGIvYnVpbHRpbi1yZWZsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM5ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZWZsb2cuYwpAQCAtMCwwICsxLDM4NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJyZWFjaGFibGUuaCIKKworLyoKKyAqIHJlZmxvZyBleHBpcmUKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciByZWZsb2dfZXhwaXJlX3VzYWdlW10gPQorImdpdC1yZWZsb2cgKHNob3d8ZXhwaXJlKSBbLS12ZXJib3NlXSBbLS1kcnktcnVuXSBbLS1zdGFsZS1maXhdIFstLWV4cGlyZT08dGltZT5dIFstLWV4cGlyZS11bnJlYWNoYWJsZT08dGltZT5dIFstLWFsbF0gPHJlZnM+Li4uIjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9yZWZsb2dfZXhwaXJlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9yZWZsb2dfZXhwaXJlX3VucmVhY2hhYmxlOworCitzdHJ1Y3QgY21kX3JlZmxvZ19leHBpcmVfY2IgeworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCWludCBkcnlfcnVuOworCWludCBzdGFsZWZpeDsKKwlpbnQgdmVyYm9zZTsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZV90b3RhbDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZV91bnJlYWNoYWJsZTsKK307CisKK3N0cnVjdCBleHBpcmVfcmVmbG9nX2NiIHsKKwlGSUxFICpuZXdsb2c7CisJY29uc3QgY2hhciAqcmVmOworCXN0cnVjdCBjb21taXQgKnJlZl9jb21taXQ7CisJc3RydWN0IGNtZF9yZWZsb2dfZXhwaXJlX2NiICpjbWQ7Cit9OworCisjZGVmaW5lIElOQ09NUExFVEUJKDF1PDwxMCkKKyNkZWZpbmUgU1RVRFlJTkcJKDF1PDwxMSkKKworc3RhdGljIGludCB0cmVlX2lzX2NvbXBsZXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCWludCBjb21wbGV0ZTsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKworCXRyZWUgPSBsb29rdXBfdHJlZShzaGExKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiAwOworCWlmICh0cmVlLT5vYmplY3QuZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm4gMTsKKwlpZiAodHJlZS0+b2JqZWN0LmZsYWdzICYgSU5DT01QTEVURSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXRyZWUtPmJ1ZmZlcikgeworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJdm9pZCAqZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJdHJlZS0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0cmVlLT5idWZmZXIgPSBkYXRhOworCQl0cmVlLT5zaXplID0gc2l6ZTsKKwl9CisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisJY29tcGxldGUgPSAxOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmICghaGFzX3NoYTFfZmlsZShlbnRyeS5zaGExKSB8fAorCQkgICAgKFNfSVNESVIoZW50cnkubW9kZSkgJiYgIXRyZWVfaXNfY29tcGxldGUoZW50cnkuc2hhMSkpKSB7CisJCQl0cmVlLT5vYmplY3QuZmxhZ3MgfD0gSU5DT01QTEVURTsKKwkJCWNvbXBsZXRlID0gMDsKKwkJfQorCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKworCWlmIChjb21wbGV0ZSkKKwkJdHJlZS0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJcmV0dXJuIGNvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGNvbW1pdF9pc19jb21wbGV0ZShzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IG9iamVjdF9hcnJheSBzdHVkeTsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IGZvdW5kOworCWludCBpc19pbmNvbXBsZXRlID0gMDsKKwlpbnQgaTsKKworCS8qIGVhcmx5IHJldHVybiAqLworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNFRU4pCisJCXJldHVybiAxOworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIElOQ09NUExFVEUpCisJCXJldHVybiAwOworCS8qCisJICogRmluZCBhbGwgY29tbWl0cyB0aGF0IGFyZSByZWFjaGFibGUgYW5kIGFyZSBub3QgbWFya2VkIGFzCisJICogU0VFTi4gIFRoZW4gbWFrZSBzdXJlIHRoZSB0cmVlcyBhbmQgYmxvYnMgY29udGFpbmVkIGFyZQorCSAqIGNvbXBsZXRlLiAgQWZ0ZXIgdGhhdCwgbWFyayB0aGVzZSBjb21taXRzIGFsc28gYXMgU0VFTi4KKwkgKiBJZiBzb21lIG9mIHRoZSBvYmplY3RzIHRoYXQgYXJlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGlzCisJICogY29tbWl0IGFyZSBtaXNzaW5nLCBtYXJrIHRoaXMgY29tbWl0IGFzIElOQ09NUExFVEUuCisJICovCisJbWVtc2V0KCZzdHVkeSwgMCwgc2l6ZW9mKHN0dWR5KSk7CisJbWVtc2V0KCZmb3VuZCwgMCwgc2l6ZW9mKGZvdW5kKSk7CisJYWRkX29iamVjdF9hcnJheSgmY29tbWl0LT5vYmplY3QsIE5VTEwsICZzdHVkeSk7CisJYWRkX29iamVjdF9hcnJheSgmY29tbWl0LT5vYmplY3QsIE5VTEwsICZmb3VuZCk7CisJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gU1RVRFlJTkc7CisJd2hpbGUgKHN0dWR5Lm5yKSB7CisJCXN0cnVjdCBjb21taXQgKmM7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50OworCisJCWMgPSAoc3RydWN0IGNvbW1pdCAqKXN0dWR5Lm9iamVjdHNbLS1zdHVkeS5ucl0uaXRlbTsKKwkJaWYgKCFjLT5vYmplY3QucGFyc2VkICYmICFwYXJzZV9vYmplY3QoYy0+b2JqZWN0LnNoYTEpKQorCQkJYy0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisKKwkJaWYgKGMtPm9iamVjdC5mbGFncyAmIElOQ09NUExFVEUpIHsKKwkJCWlzX2luY29tcGxldGUgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoYy0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCWNvbnRpbnVlOworCQlmb3IgKHBhcmVudCA9IGMtPnBhcmVudHM7IHBhcmVudDsgcGFyZW50ID0gcGFyZW50LT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFNUVURZSU5HKQorCQkJCWNvbnRpbnVlOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFNUVURZSU5HOworCQkJYWRkX29iamVjdF9hcnJheSgmcC0+b2JqZWN0LCBOVUxMLCAmc3R1ZHkpOworCQkJYWRkX29iamVjdF9hcnJheSgmcC0+b2JqZWN0LCBOVUxMLCAmZm91bmQpOworCQl9CisJfQorCWlmICghaXNfaW5jb21wbGV0ZSkgeworCQkvKgorCQkgKiBtYWtlIHN1cmUgYWxsIGNvbW1pdHMgaW4gImZvdW5kIiBhcnJheSBoYXZlIGFsbCB0aGUKKwkJICogbmVjZXNzYXJ5IG9iamVjdHMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZm91bmQubnI7IGkrKykgeworCQkJc3RydWN0IGNvbW1pdCAqYyA9CisJCQkJKHN0cnVjdCBjb21taXQgKilmb3VuZC5vYmplY3RzW2ldLml0ZW07CisJCQlpZiAoIXRyZWVfaXNfY29tcGxldGUoYy0+dHJlZS0+b2JqZWN0LnNoYTEpKSB7CisJCQkJaXNfaW5jb21wbGV0ZSA9IDE7CisJCQkJYy0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisJCQl9CisJCX0KKwkJaWYgKCFpc19pbmNvbXBsZXRlKSB7CisJCQkvKiBtYXJrIGFsbCBmb3VuZCBjb21taXRzIGFzIGNvbXBsZXRlLCBpb3cgU0VFTiAqLworCQkJZm9yIChpID0gMDsgaSA8IGZvdW5kLm5yOyBpKyspCisJCQkJZm91bmQub2JqZWN0c1tpXS5pdGVtLT5mbGFncyB8PSBTRUVOOworCQl9CisJfQorCS8qIGNsZWFyIGZsYWdzIGZyb20gdGhlIG9iamVjdHMgd2UgdHJhdmVyc2VkICovCisJZm9yIChpID0gMDsgaSA8IGZvdW5kLm5yOyBpKyspCisJCWZvdW5kLm9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgJj0gflNUVURZSU5HOworCWlmIChpc19pbmNvbXBsZXRlKQorCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBJTkNPTVBMRVRFOworCWVsc2UgeworCQkvKgorCQkgKiBJZiB3ZSBjb21lIGhlcmUsIHdlIGhhdmUgKDEpIHRyYXZlcnNlZCB0aGUgYW5jZXN0cnkgY2hhaW4KKwkJICogZnJvbSB0aGUgImNvbW1pdCIgdW50aWwgd2UgcmVhY2ggU0VFTiBjb21taXRzICh3aGljaCBhcmUKKwkJICoga25vd24gdG8gYmUgY29tcGxldGUpLCBhbmQgKDIpIG1hZGUgc3VyZSB0aGF0IHRoZSBjb21taXRzCisJCSAqIGVuY291bnRlcmVkIGR1cmluZyB0aGUgYWJvdmUgdHJhdmVyc2FsIHJlZmVyIHRvIHRyZWVzIHRoYXQKKwkJICogYXJlIGNvbXBsZXRlLiAgV2hpY2ggbWVhbnMgdGhhdCB3ZSBrbm93ICphbGwqIHRoZSBjb21taXRzCisJCSAqIHdlIGhhdmUgc2VlbiBkdXJpbmcgdGhpcyBwcm9jZXNzIGFyZSBjb21wbGV0ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBmb3VuZC5ucjsgaSsrKQorCQkJZm91bmQub2JqZWN0c1tpXS5pdGVtLT5mbGFncyB8PSBTRUVOOworCX0KKwkvKiBmcmVlIG9iamVjdCBhcnJheXMgKi8KKwlmcmVlKHN0dWR5Lm9iamVjdHMpOworCWZyZWUoZm91bmQub2JqZWN0cyk7CisJcmV0dXJuICFpc19pbmNvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGtlZXBfZW50cnkoc3RydWN0IGNvbW1pdCAqKml0LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCWlmIChpc19udWxsX3NoYTEoc2hhMSkpCisJCXJldHVybiAxOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGluIHRoaXMgY29tbWl0IGV4aXN0cy4KKwkgKgorCSAqIFdlIGhhdmUgd2Fsa2VkIGFsbCB0aGUgb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgcmVmcworCSAqIGFuZCBjYWNoZSBlYXJsaWVyLiAgVGhlIGNvbW1pdHMgcmVhY2hhYmxlIGJ5IHRoaXMgY29tbWl0CisJICogbXVzdCBtZWV0IFNFRU4gY29tbWl0cyAtLSBhbmQgdGhlbiB3ZSBzaG91bGQgbWFyayB0aGVtIGFzCisJICogU0VFTiBhcyB3ZWxsLgorCSAqLworCWlmICghY29tbWl0X2lzX2NvbXBsZXRlKGNvbW1pdCkpCisJCXJldHVybiAwOworCSppdCA9IGNvbW1pdDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHBpcmVfcmVmbG9nX2VudCh1bnNpZ25lZCBjaGFyICpvc2hhMSwgdW5zaWduZWQgY2hhciAqbnNoYTEsCisJCWNvbnN0IGNoYXIgKmVtYWlsLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCwgaW50IHR6LAorCQljb25zdCBjaGFyICptZXNzYWdlLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBleHBpcmVfcmVmbG9nX2NiICpjYiA9IGNiX2RhdGE7CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCisJaWYgKHRpbWVzdGFtcCA8IGNiLT5jbWQtPmV4cGlyZV90b3RhbCkKKwkJZ290byBwcnVuZTsKKworCW9sZCA9IG5ldyA9IE5VTEw7CisJaWYgKGNiLT5jbWQtPnN0YWxlZml4ICYmCisJICAgICgha2VlcF9lbnRyeSgmb2xkLCBvc2hhMSkgfHwgIWtlZXBfZW50cnkoJm5ldywgbnNoYTEpKSkKKwkJZ290byBwcnVuZTsKKworCWlmICh0aW1lc3RhbXAgPCBjYi0+Y21kLT5leHBpcmVfdW5yZWFjaGFibGUpIHsKKwkJaWYgKCFjYi0+cmVmX2NvbW1pdCkKKwkJCWdvdG8gcHJ1bmU7CisJCWlmICghb2xkICYmICFpc19udWxsX3NoYTEob3NoYTEpKQorCQkJb2xkID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KG9zaGExLCAxKTsKKwkJaWYgKCFuZXcgJiYgIWlzX251bGxfc2hhMShuc2hhMSkpCisJCQluZXcgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkobnNoYTEsIDEpOworCQlpZiAoKG9sZCAmJiAhaW5fbWVyZ2VfYmFzZXMob2xkLCAmY2ItPnJlZl9jb21taXQsIDEpKSB8fAorCQkgICAgKG5ldyAmJiAhaW5fbWVyZ2VfYmFzZXMobmV3LCAmY2ItPnJlZl9jb21taXQsIDEpKSkKKwkJCWdvdG8gcHJ1bmU7CisJfQorCisJaWYgKGNiLT5uZXdsb2cpIHsKKwkJY2hhciBzaWduID0gKHR6IDwgMCkgPyAnLScgOiAnKyc7CisJCWludCB6b25lID0gKHR6IDwgMCkgPyAoLXR6KSA6IHR6OworCQlmcHJpbnRmKGNiLT5uZXdsb2csICIlcyAlcyAlcyAlbHUgJWMlMDRkXHQlcyIsCisJCQlzaGExX3RvX2hleChvc2hhMSksIHNoYTFfdG9faGV4KG5zaGExKSwKKwkJCWVtYWlsLCB0aW1lc3RhbXAsIHNpZ24sIHpvbmUsCisJCQltZXNzYWdlKTsKKwl9CisJaWYgKGNiLT5jbWQtPnZlcmJvc2UpCisJCXByaW50Zigia2VlcCAlcyIsIG1lc3NhZ2UpOworCXJldHVybiAwOworIHBydW5lOgorCWlmICghY2ItPm5ld2xvZyB8fCBjYi0+Y21kLT52ZXJib3NlKQorCQlwcmludGYoIiVzcHJ1bmUgJXMiLCBjYi0+bmV3bG9nID8gIiIgOiAid291bGQgIiwgbWVzc2FnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXhwaXJlX3JlZmxvZyhjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCB1bnVzZWQsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGNtZF9yZWZsb2dfZXhwaXJlX2NiICpjbWQgPSBjYl9kYXRhOworCXN0cnVjdCBleHBpcmVfcmVmbG9nX2NiIGNiOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwljaGFyICpsb2dfZmlsZSwgKm5ld2xvZ19wYXRoID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKworCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOworCS8qIHdlIHRha2UgdGhlIGxvY2sgZm9yIHRoZSByZWYgaXRzZWxmIHRvIHByZXZlbnQgaXQgZnJvbQorCSAqIGdldHRpbmcgdXBkYXRlZC4KKwkgKi8KKwlsb2NrID0gbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUocmVmLCBzaGExKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiBlcnJvcigiY2Fubm90IGxvY2sgcmVmICclcyciLCByZWYpOworCWxvZ19maWxlID0geHN0cmR1cChnaXRfcGF0aCgibG9ncy8lcyIsIHJlZikpOworCWlmICghZmlsZV9leGlzdHMobG9nX2ZpbGUpKQorCQlnb3RvIGZpbmlzaDsKKwlpZiAoIWNtZC0+ZHJ5X3J1bikgeworCQluZXdsb2dfcGF0aCA9IHhzdHJkdXAoZ2l0X3BhdGgoImxvZ3MvJXMubG9jayIsIHJlZikpOworCQljYi5uZXdsb2cgPSBmb3BlbihuZXdsb2dfcGF0aCwgInciKTsKKwl9CisKKwljYi5yZWZfY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDEpOworCWNiLnJlZiA9IHJlZjsKKwljYi5jbWQgPSBjbWQ7CisJZm9yX2VhY2hfcmVmbG9nX2VudChyZWYsIGV4cGlyZV9yZWZsb2dfZW50LCAmY2IpOworIGZpbmlzaDoKKwlpZiAoY2IubmV3bG9nKSB7CisJCWlmIChmY2xvc2UoY2IubmV3bG9nKSkKKwkJCXN0YXR1cyB8PSBlcnJvcigiJXM6ICVzIiwgc3RyZXJyb3IoZXJybm8pLAorCQkJCQluZXdsb2dfcGF0aCk7CisJCWlmIChyZW5hbWUobmV3bG9nX3BhdGgsIGxvZ19maWxlKSkgeworCQkJc3RhdHVzIHw9IGVycm9yKCJjYW5ub3QgcmVuYW1lICVzIHRvICVzIiwKKwkJCQkJbmV3bG9nX3BhdGgsIGxvZ19maWxlKTsKKwkJCXVubGluayhuZXdsb2dfcGF0aCk7CisJCX0KKwl9CisJZnJlZShuZXdsb2dfcGF0aCk7CisJZnJlZShsb2dfZmlsZSk7CisJdW5sb2NrX3JlZihsb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHJlZmxvZ19leHBpcmVfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiZ2MucmVmbG9nZXhwaXJlIikpCisJCWRlZmF1bHRfcmVmbG9nX2V4cGlyZSA9IGFwcHJveGlkYXRlKHZhbHVlKTsKKwllbHNlIGlmICghc3RyY21wKHZhciwgImdjLnJlZmxvZ2V4cGlyZXVucmVhY2hhYmxlIikpCisJCWRlZmF1bHRfcmVmbG9nX2V4cGlyZV91bnJlYWNoYWJsZSA9IGFwcHJveGlkYXRlKHZhbHVlKTsKKwllbHNlCisJCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3JlZmxvZ19leHBpcmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGNtZF9yZWZsb2dfZXhwaXJlX2NiIGNiOworCXVuc2lnbmVkIGxvbmcgbm93ID0gdGltZShOVUxMKTsKKwlpbnQgaSwgc3RhdHVzLCBkb19hbGw7CisKKwlnaXRfY29uZmlnKHJlZmxvZ19leHBpcmVfY29uZmlnKTsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJZG9fYWxsID0gc3RhdHVzID0gMDsKKwltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKKworCWlmICghZGVmYXVsdF9yZWZsb2dfZXhwaXJlX3VucmVhY2hhYmxlKQorCQlkZWZhdWx0X3JlZmxvZ19leHBpcmVfdW5yZWFjaGFibGUgPSBub3cgLSAzMCAqIDI0ICogMzYwMDsKKwlpZiAoIWRlZmF1bHRfcmVmbG9nX2V4cGlyZSkKKwkJZGVmYXVsdF9yZWZsb2dfZXhwaXJlID0gbm93IC0gOTAgKiAyNCAqIDM2MDA7CisJY2IuZXhwaXJlX3RvdGFsID0gZGVmYXVsdF9yZWZsb2dfZXhwaXJlOworCWNiLmV4cGlyZV91bnJlYWNoYWJsZSA9IGRlZmF1bHRfcmVmbG9nX2V4cGlyZV91bnJlYWNoYWJsZTsKKworCS8qCisJICogV2UgY2FuIHRydXN0IHRoZSBjb21taXRzIGFuZCBvYmplY3RzIHJlYWNoYWJsZSBmcm9tIHJlZnMKKwkgKiBldmVuIGluIG9sZGVyIHJlcG9zaXRvcnkuICBXZSBjYW5ub3QgdHJ1c3Qgd2hhdCdzIHJlYWNoYWJsZQorCSAqIGZyb20gcmVmbG9nIGlmIHRoZSByZXBvc2l0b3J5IHdhcyBwcnVuZWQgd2l0aCBvbGRlciBnaXQuCisJICovCisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghc3RyY21wKGFyZywgIi0tZHJ5LXJ1biIpIHx8ICFzdHJjbXAoYXJnLCAiLW4iKSkKKwkJCWNiLmRyeV9ydW4gPSAxOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tZXhwaXJlPSIpKQorCQkJY2IuZXhwaXJlX3RvdGFsID0gYXBwcm94aWRhdGUoYXJnICsgOSk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leHBpcmUtdW5yZWFjaGFibGU9IikpCisJCQljYi5leHBpcmVfdW5yZWFjaGFibGUgPSBhcHByb3hpZGF0ZShhcmcgKyAyMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGFsZS1maXgiKSkKKwkJCWNiLnN0YWxlZml4ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKQorCQkJZG9fYWxsID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXZlcmJvc2UiKSkKKwkJCWNiLnZlcmJvc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKGFyZ1swXSA9PSAnLScpCisJCQl1c2FnZShyZWZsb2dfZXhwaXJlX3VzYWdlKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChjYi5zdGFsZWZpeCkgeworCQlpbml0X3JldmlzaW9ucygmY2IucmV2cywgcHJlZml4KTsKKwkJaWYgKGNiLnZlcmJvc2UpCisJCQlwcmludGYoIk1hcmtpbmcgcmVhY2hhYmxlIG9iamVjdHMuLi4iKTsKKwkJbWFya19yZWFjaGFibGVfb2JqZWN0cygmY2IucmV2cywgMCk7CisJCWlmIChjYi52ZXJib3NlKQorCQkJcHV0Y2hhcignXG4nKTsKKwl9CisKKwlpZiAoZG9fYWxsKQorCQlzdGF0dXMgfD0gZm9yX2VhY2hfcmVmbG9nKGV4cGlyZV9yZWZsb2csICZjYik7CisJd2hpbGUgKGkgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKnJlZiA9IGFyZ3ZbaSsrXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaWYgKCFyZXNvbHZlX3JlZihyZWYsIHNoYTEsIDEsIE5VTEwpKSB7CisJCQlzdGF0dXMgfD0gZXJyb3IoIiVzIHBvaW50cyBub3doZXJlISIsIHJlZik7CisJCQljb250aW51ZTsKKwkJfQorCQlzdGF0dXMgfD0gZXhwaXJlX3JlZmxvZyhyZWYsIHNoYTEsIDAsICZjYik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBtYWluICJyZWZsb2ciCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgcmVmbG9nX3VzYWdlW10gPQorImdpdC1yZWZsb2cgKGV4cGlyZSB8IC4uLikiOworCitpbnQgY21kX3JlZmxvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwkvKiBXaXRoIG5vIGNvbW1hbmQsIHdlIGRlZmF1bHQgdG8gc2hvd2luZyBpdC4gKi8KKwlpZiAoYXJnYyA8IDIgfHwgKmFyZ3ZbMV0gPT0gJy0nKQorCQlyZXR1cm4gY21kX2xvZ19yZWZsb2coYXJnYywgYXJndiwgcHJlZml4KTsKKworCWlmICghc3RyY21wKGFyZ3ZbMV0sICJzaG93IikpCisJCXJldHVybiBjbWRfbG9nX3JlZmxvZyhhcmdjIC0gMSwgYXJndiArIDEsIHByZWZpeCk7CisKKwlpZiAoIXN0cmNtcChhcmd2WzFdLCAiZXhwaXJlIikpCisJCXJldHVybiBjbWRfcmVmbG9nX2V4cGlyZShhcmdjIC0gMSwgYXJndiArIDEsIHByZWZpeCk7CisKKwkvKiBOb3QgYSByZWNvZ25pemVkIHJlZmxvZyBjb21tYW5kLi4qLworCXVzYWdlKHJlZmxvZ191c2FnZSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlcmVyZS5jIGIvYnVpbHRpbi1yZXJlcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJjOGJkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXJlcmUuYwpAQCAtMCwwICsxLDQzNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAieGRpZmYveGRpZmYuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X3JlcmVyZV91c2FnZVtdID0KKyJnaXQtcmVyZXJlIFtjbGVhciB8IHN0YXR1cyB8IGRpZmYgfCBnY10iOworCisvKiB0aGVzZSB2YWx1ZXMgYXJlIGRheXMgKi8KK3N0YXRpYyBpbnQgY3V0b2ZmX25vcmVzb2x2ZSA9IDE1Oworc3RhdGljIGludCBjdXRvZmZfcmVzb2x2ZSA9IDYwOworCitzdGF0aWMgY2hhciAqbWVyZ2VfcnJfcGF0aDsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJyX3BhdGgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZSkKK3sKKwlyZXR1cm4gZ2l0X3BhdGgoInJyLWNhY2hlLyVzLyVzIiwgbmFtZSwgZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfcnIoc3RydWN0IHBhdGhfbGlzdCAqcnIpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJRklMRSAqaW4gPSBmb3BlbihtZXJnZV9ycl9wYXRoLCAiciIpOworCWlmICghaW4pCisJCXJldHVybjsKKwl3aGlsZSAoZnJlYWQoYnVmLCA0MCwgMSwgaW4pID09IDEpIHsKKwkJaW50IGk7CisJCWNoYXIgKm5hbWU7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBzaGExKSkKKwkJCWRpZSgiY29ycnVwdCBNRVJHRV9SUiIpOworCQlidWZbNDBdID0gJ1wwJzsKKwkJbmFtZSA9IHhzdHJkdXAoYnVmKTsKKwkJaWYgKGZnZXRjKGluKSAhPSAnXHQnKQorCQkJZGllKCJjb3JydXB0IE1FUkdFX1JSIik7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSAmJiAoYnVmW2ldID0gZmdldGMoaW4pKTsgaSsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisJCWlmIChpID09IHNpemVvZihidWYpKQorCQkJZGllKCJmaWxlbmFtZSB0b28gbG9uZyIpOworCQlwYXRoX2xpc3RfaW5zZXJ0KGJ1ZiwgcnIpLT51dGlsID0geHN0cmR1cChuYW1lKTsKKwl9CisJZmNsb3NlKGluKTsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgd3JpdGVfbG9jazsKKworc3RhdGljIGludCB3cml0ZV9ycihzdHJ1Y3QgcGF0aF9saXN0ICpyciwgaW50IG91dF9mZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcnItPm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IHJyLT5pdGVtc1tpXS5wYXRoOworCQlpbnQgbGVuZ3RoID0gc3RybGVuKHBhdGgpICsgMTsKKwkJaWYgKHdyaXRlX2luX2Z1bGwob3V0X2ZkLCByci0+aXRlbXNbaV0udXRpbCwgNDApICE9IDQwIHx8CisJCSAgICB3cml0ZV9pbl9mdWxsKG91dF9mZCwgIlx0IiwgMSkgIT0gMSB8fAorCQkgICAgd3JpdGVfaW5fZnVsbChvdXRfZmQsIHBhdGgsIGxlbmd0aCkgIT0gbGVuZ3RoKQorCQkJZGllKCJ1bmFibGUgdG8gd3JpdGUgcmVyZXJlIHJlY29yZCIpOworCX0KKwljbG9zZShvdXRfZmQpOworCXJldHVybiBjb21taXRfbG9ja19maWxlKCZ3cml0ZV9sb2NrKTsKK30KKworc3RydWN0IGJ1ZmZlciB7CisJY2hhciAqcHRyOworCWludCBuciwgYWxsb2M7Cit9OworCitzdGF0aWMgdm9pZCBhcHBlbmRfbGluZShzdHJ1Y3QgYnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKworCWlmIChidWZmZXItPm5yICsgbGVuID4gYnVmZmVyLT5hbGxvYykgeworCQlidWZmZXItPmFsbG9jID0gYWxsb2NfbnIoYnVmZmVyLT5uciArIGxlbik7CisJCWJ1ZmZlci0+cHRyID0geHJlYWxsb2MoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+YWxsb2MpOworCX0KKwltZW1jcHkoYnVmZmVyLT5wdHIgKyBidWZmZXItPm5yLCBsaW5lLCBsZW4pOworCWJ1ZmZlci0+bnIgKz0gbGVuOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9idWZmZXIoc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworCWZyZWUoYnVmZmVyLT5wdHIpOworCWJ1ZmZlci0+cHRyID0gTlVMTDsKKwlidWZmZXItPm5yID0gYnVmZmVyLT5hbGxvYyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwKKwkgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqb3V0cHV0KQoreworCVNIQV9DVFggY3R4OworCWNoYXIgYnVmWzEwMjRdOworCWludCBodW5rID0gMCwgaHVua19ubyA9IDA7CisJc3RydWN0IGJ1ZmZlciBtaW51cyA9IHsgTlVMTCwgMCwgMCB9LCBwbHVzID0geyBOVUxMLCAwLCAwIH07CisJc3RydWN0IGJ1ZmZlciAqb25lID0gJm1pbnVzLCAqdHdvID0gJnBsdXM7CisJRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyIik7CisJRklMRSAqb3V0OworCisJaWYgKCFmKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBvcGVuICVzIiwgcGF0aCk7CisKKwlpZiAob3V0cHV0KSB7CisJCW91dCA9IGZvcGVuKG91dHB1dCwgInciKTsKKwkJaWYgKCFvdXQpIHsKKwkJCWZjbG9zZShmKTsKKwkJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHdyaXRlICVzIiwgb3V0cHV0KTsKKwkJfQorCX0gZWxzZQorCQlvdXQgPSBOVUxMOworCisJaWYgKHNoYTEpCisJCVNIQTFfSW5pdCgmY3R4KTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQlpZiAoIXByZWZpeGNtcChidWYsICI8PDw8PDw8ICIpKQorCQkJaHVuayA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmLCAiPT09PT09PSIpKQorCQkJaHVuayA9IDI7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmLCAiPj4+Pj4+PiAiKSkgeworCQkJaW50IG9uZV9pc19sb25nZXIgPSAob25lLT5uciA+IHR3by0+bnIpOworCQkJaW50IGNvbW1vbl9sZW4gPSBvbmVfaXNfbG9uZ2VyID8gdHdvLT5uciA6IG9uZS0+bnI7CisJCQlpbnQgY21wID0gbWVtY21wKG9uZS0+cHRyLCB0d28tPnB0ciwgY29tbW9uX2xlbik7CisKKwkJCWh1bmtfbm8rKzsKKwkJCWh1bmsgPSAwOworCQkJaWYgKChjbXAgPiAwKSB8fCAoKGNtcCA9PSAwKSAmJiBvbmVfaXNfbG9uZ2VyKSkgeworCQkJCXN0cnVjdCBidWZmZXIgKnN3YXAgPSBvbmU7CisJCQkJb25lID0gdHdvOworCQkJCXR3byA9IHN3YXA7CisJCQl9CisJCQlpZiAob3V0KSB7CisJCQkJZnB1dHMoIjw8PDw8PDxcbiIsIG91dCk7CisJCQkJZndyaXRlKG9uZS0+cHRyLCBvbmUtPm5yLCAxLCBvdXQpOworCQkJCWZwdXRzKCI9PT09PT09XG4iLCBvdXQpOworCQkJCWZ3cml0ZSh0d28tPnB0ciwgdHdvLT5uciwgMSwgb3V0KTsKKwkJCQlmcHV0cygiPj4+Pj4+PlxuIiwgb3V0KTsKKwkJCX0KKwkJCWlmIChzaGExKSB7CisJCQkJU0hBMV9VcGRhdGUoJmN0eCwgb25lLT5wdHIsIG9uZS0+bnIpOworCQkJCVNIQTFfVXBkYXRlKCZjdHgsICJcMCIsIDEpOworCQkJCVNIQTFfVXBkYXRlKCZjdHgsIHR3by0+cHRyLCB0d28tPm5yKTsKKwkJCQlTSEExX1VwZGF0ZSgmY3R4LCAiXDAiLCAxKTsKKwkJCX0KKwkJCWNsZWFyX2J1ZmZlcihvbmUpOworCQkJY2xlYXJfYnVmZmVyKHR3byk7CisJCX0gZWxzZSBpZiAoaHVuayA9PSAxKQorCQkJYXBwZW5kX2xpbmUob25lLCBidWYpOworCQllbHNlIGlmIChodW5rID09IDIpCisJCQlhcHBlbmRfbGluZSh0d28sIGJ1Zik7CisJCWVsc2UgaWYgKG91dCkKKwkJCWZwdXRzKGJ1Ziwgb3V0KTsKKwl9CisKKwlmY2xvc2UoZik7CisJaWYgKG91dCkKKwkJZmNsb3NlKG91dCk7CisJaWYgKHNoYTEpCisJCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJcmV0dXJuIGh1bmtfbm87Cit9CisKK3N0YXRpYyBpbnQgZmluZF9jb25mbGljdChzdHJ1Y3QgcGF0aF9saXN0ICpjb25mbGljdCkKK3sKKwlpbnQgaTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCBpbmRleCIpOworCWZvciAoaSA9IDA7IGkgKyAyIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICplMSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICplMiA9IGFjdGl2ZV9jYWNoZVtpKzFdOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmUzID0gYWN0aXZlX2NhY2hlW2krMl07CisJCWlmIChjZV9zdGFnZShlMSkgPT0gMSAmJgorCQkgICAgY2Vfc3RhZ2UoZTIpID09IDIgJiYKKwkJICAgIGNlX3N0YWdlKGUzKSA9PSAzICYmCisJCSAgICBjZV9zYW1lX25hbWUoZTEsIGUyKSAmJiBjZV9zYW1lX25hbWUoZTEsIGUzKSAmJgorCQkgICAgU19JU1JFRyhudG9obChlMS0+Y2VfbW9kZSkpICYmCisJCSAgICBTX0lTUkVHKG50b2hsKGUyLT5jZV9tb2RlKSkgJiYKKwkJICAgIFNfSVNSRUcobnRvaGwoZTMtPmNlX21vZGUpKSkgeworCQkJcGF0aF9saXN0X2luc2VydCgoY29uc3QgY2hhciAqKWUxLT5uYW1lLCBjb25mbGljdCk7CisJCQlpICs9IDI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcmV0OworCW1tZmlsZV90IGN1ciwgYmFzZSwgb3RoZXI7CisJbW1idWZmZXJfdCByZXN1bHQgPSB7TlVMTCwgMH07CisJeHBwYXJhbV90IHhwcCA9IHtYREZfTkVFRF9NSU5JTUFMfTsKKworCWlmIChoYW5kbGVfZmlsZShwYXRoLCBOVUxMLCBycl9wYXRoKG5hbWUsICJ0aGlzaW1hZ2UiKSkgPCAwKQorCQlyZXR1cm4gMTsKKworCWlmIChyZWFkX21tZmlsZSgmY3VyLCBycl9wYXRoKG5hbWUsICJ0aGlzaW1hZ2UiKSkgfHwKKwkJCXJlYWRfbW1maWxlKCZiYXNlLCBycl9wYXRoKG5hbWUsICJwcmVpbWFnZSIpKSB8fAorCQkJcmVhZF9tbWZpbGUoJm90aGVyLCBycl9wYXRoKG5hbWUsICJwb3N0aW1hZ2UiKSkpCisJCXJldHVybiAxOworCXJldCA9IHhkbF9tZXJnZSgmYmFzZSwgJmN1ciwgIiIsICZvdGhlciwgIiIsCisJCQkmeHBwLCBYRExfTUVSR0VfWkVBTE9VUywgJnJlc3VsdCk7CisJaWYgKCFyZXQpIHsKKwkJRklMRSAqZiA9IGZvcGVuKHBhdGgsICJ3Iik7CisJCWlmICghZikKKwkJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHdyaXRlIHRvICVzIiwgcGF0aCk7CisJCWZ3cml0ZShyZXN1bHQucHRyLCByZXN1bHQuc2l6ZSwgMSwgZik7CisJCWZjbG9zZShmKTsKKwl9CisKKwlmcmVlKGN1ci5wdHIpOworCWZyZWUoYmFzZS5wdHIpOworCWZyZWUob3RoZXIucHRyKTsKKwlmcmVlKHJlc3VsdC5wdHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdW5saW5rX3JyX2l0ZW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bmxpbmsocnJfcGF0aChuYW1lLCAidGhpc2ltYWdlIikpOworCXVubGluayhycl9wYXRoKG5hbWUsICJwcmVpbWFnZSIpKTsKKwl1bmxpbmsocnJfcGF0aChuYW1lLCAicG9zdGltYWdlIikpOworCXJtZGlyKGdpdF9wYXRoKCJyci1jYWNoZS8lcyIsIG5hbWUpKTsKK30KKworc3RhdGljIHZvaWQgZ2FyYmFnZV9jb2xsZWN0KHN0cnVjdCBwYXRoX2xpc3QgKnJyKQoreworCXN0cnVjdCBwYXRoX2xpc3QgdG9fcmVtb3ZlID0geyBOVUxMLCAwLCAwLCAxIH07CisJY2hhciBidWZbMTAyNF07CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZTsKKwlpbnQgbGVuLCBpLCBjdXRvZmY7CisJdGltZV90IG5vdyA9IHRpbWUoTlVMTCksIHRoZW47CisKKwlzdHJsY3B5KGJ1ZiwgZ2l0X3BhdGgoInJyLWNhY2hlIiksIHNpemVvZihidWYpKTsKKwlsZW4gPSBzdHJsZW4oYnVmKTsKKwlkaXIgPSBvcGVuZGlyKGJ1Zik7CisJc3RyY3B5KGJ1ZiArIGxlbisrLCAiLyIpOworCXdoaWxlICgoZSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGUtPmRfbmFtZTsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnXDAnIHx8CisJCQkJCShuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdcMCcpKSkKKwkJCWNvbnRpbnVlOworCQlpID0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiVzIiwgbmFtZSk7CisJCXN0cmxjcHkoYnVmICsgbGVuICsgaSwgIi9wcmVpbWFnZSIsIHNpemVvZihidWYpIC0gbGVuIC0gaSk7CisJCWlmIChzdGF0KGJ1ZiwgJnN0KSkKKwkJCWNvbnRpbnVlOworCQl0aGVuID0gc3Quc3RfbXRpbWU7CisJCXN0cmxjcHkoYnVmICsgbGVuICsgaSwgIi9wb3N0aW1hZ2UiLCBzaXplb2YoYnVmKSAtIGxlbiAtIGkpOworCQljdXRvZmYgPSBzdGF0KGJ1ZiwgJnN0KSA/IGN1dG9mZl9ub3Jlc29sdmUgOiBjdXRvZmZfcmVzb2x2ZTsKKwkJaWYgKHRoZW4gPCBub3cgLSBjdXRvZmYgKiA4NjQwMCkgeworCQkJYnVmW2xlbiArIGldID0gJ1wwJzsKKwkJCXBhdGhfbGlzdF9pbnNlcnQoeHN0cmR1cChuYW1lKSwgJnRvX3JlbW92ZSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IHRvX3JlbW92ZS5ucjsgaSsrKQorCQl1bmxpbmtfcnJfaXRlbSh0b19yZW1vdmUuaXRlbXNbaV0ucGF0aCk7CisJcGF0aF9saXN0X2NsZWFyKCZ0b19yZW1vdmUsIDApOworfQorCitzdGF0aWMgaW50IG91dGYodm9pZCAqZHVtbXksIG1tYnVmZmVyX3QgKnB0ciwgaW50IG5idWYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykKKwkJaWYgKHdyaXRlX2luX2Z1bGwoMSwgcHRyW2ldLnB0ciwgcHRyW2ldLnNpemUpICE9IHB0cltpXS5zaXplKQorCQkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpZmZfdHdvKGNvbnN0IGNoYXIgKmZpbGUxLCBjb25zdCBjaGFyICpsYWJlbDEsCisJCWNvbnN0IGNoYXIgKmZpbGUyLCBjb25zdCBjaGFyICpsYWJlbDIpCit7CisJeHBwYXJhbV90IHhwcDsKKwl4ZGVtaXRjb25mX3QgeGVjZmc7CisJeGRlbWl0Y2JfdCBlY2I7CisJbW1maWxlX3QgbWludXMsIHBsdXM7CisKKwlpZiAocmVhZF9tbWZpbGUoJm1pbnVzLCBmaWxlMSkgfHwgcmVhZF9tbWZpbGUoJnBsdXMsIGZpbGUyKSkKKwkJcmV0dXJuIDE7CisKKwlwcmludGYoIi0tLSBhLyVzXG4rKysgYi8lc1xuIiwgbGFiZWwxLCBsYWJlbDIpOworCWZmbHVzaChzdGRvdXQpOworCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJeGVjZmcuY3R4bGVuID0gMzsKKwl4ZWNmZy5mbGFncyA9IDA7CisJZWNiLm91dGYgPSBvdXRmOworCXhkbF9kaWZmKCZtaW51cywgJnBsdXMsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisKKwlmcmVlKG1pbnVzLnB0cik7CisJZnJlZShwbHVzLnB0cik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZGVzdCkKK3sKKwlGSUxFICppbiwgKm91dDsKKwljaGFyIGJ1ZmZlclszMjc2OF07CisJaW50IGNvdW50OworCisJaWYgKCEoaW4gPSBmb3BlbihzcmMsICJyIikpKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBvcGVuICVzIiwgc3JjKTsKKwlpZiAoIShvdXQgPSBmb3BlbihkZXN0LCAidyIpKSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgb3BlbiAlcyIsIGRlc3QpOworCXdoaWxlICgoY291bnQgPSBmcmVhZChidWZmZXIsIDEsIHNpemVvZihidWZmZXIpLCBpbikpKQorCQlmd3JpdGUoYnVmZmVyLCAxLCBjb3VudCwgb3V0KTsKKwlmY2xvc2UoaW4pOworCWZjbG9zZShvdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3BsYWluX3JlcmVyZShzdHJ1Y3QgcGF0aF9saXN0ICpyciwgaW50IGZkKQoreworCXN0cnVjdCBwYXRoX2xpc3QgY29uZmxpY3QgPSB7IE5VTEwsIDAsIDAsIDEgfTsKKwlpbnQgaTsKKworCWZpbmRfY29uZmxpY3QoJmNvbmZsaWN0KTsKKworCS8qCisJICogTUVSR0VfUlIgcmVjb3JkcyBwYXRocyB3aXRoIGNvbmZsaWN0cyBpbW1lZGlhdGVseSBhZnRlciBtZXJnZQorCSAqIGZhaWxlZC4gIFNvbWUgb2YgdGhlIGNvbmZsaWN0ZWQgcGF0aHMgbWlnaHQgaGF2ZSBiZWVuIGhhbmQgcmVzb2x2ZWQKKwkgKiBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHRoZW4sIGJ1dCB0aGUgaW5pdGlhbCBydW4gd291bGQgY2F0Y2ggYWxsCisJICogYW5kIHJlZ2lzdGVyIHRoZWlyIHByZWltYWdlcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBjb25mbGljdC5ucjsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBjb25mbGljdC5pdGVtc1tpXS5wYXRoOworCQlpZiAoIXBhdGhfbGlzdF9oYXNfcGF0aChyciwgcGF0aCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQljaGFyICpoZXg7CisJCQlpbnQgcmV0OworCQkJcmV0ID0gaGFuZGxlX2ZpbGUocGF0aCwgc2hhMSwgTlVMTCk7CisJCQlpZiAocmV0IDwgMSkKKwkJCQljb250aW51ZTsKKwkJCWhleCA9IHhzdHJkdXAoc2hhMV90b19oZXgoc2hhMSkpOworCQkJcGF0aF9saXN0X2luc2VydChwYXRoLCByciktPnV0aWwgPSBoZXg7CisJCQlpZiAobWtkaXIoZ2l0X3BhdGgoInJyLWNhY2hlLyVzIiwgaGV4KSwgMDc1NSkpCisJCQkJY29udGludWU7OworCQkJaGFuZGxlX2ZpbGUocGF0aCwgTlVMTCwgcnJfcGF0aChoZXgsICJwcmVpbWFnZSIpKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiUmVjb3JkZWQgcHJlaW1hZ2UgZm9yICclcydcbiIsIHBhdGgpOworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgc29tZSBvZiB0aGUgcGF0aHMgdGhhdCBoYWQgY29uZmxpY3RzIGVhcmxpZXIgbWlnaHQgaGF2ZSBiZWVuCisJICogaGFuZCByZXNvbHZlZC4gIE90aGVycyBtYXkgYmUgc2ltaWxhciB0byBhIGNvbmZsaWN0IGFscmVhZHkgdGhhdAorCSAqIHdhcyByZXNvbHZlZCBiZWZvcmUuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgcnItPm5yOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCByZXQ7CisJCWNvbnN0IGNoYXIgKnBhdGggPSByci0+aXRlbXNbaV0ucGF0aDsKKwkJY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopcnItPml0ZW1zW2ldLnV0aWw7CisKKwkJaWYgKCFzdGF0KHJyX3BhdGgobmFtZSwgInByZWltYWdlIiksICZzdCkgJiYKKwkJCQkhc3RhdChycl9wYXRoKG5hbWUsICJwb3N0aW1hZ2UiKSwgJnN0KSkgeworCQkJaWYgKCFtZXJnZShuYW1lLCBwYXRoKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiUmVzb2x2ZWQgJyVzJyB1c2luZyAiCisJCQkJCQkicHJldmlvdXMgcmVzb2x1dGlvbi5cbiIsIHBhdGgpOworCQkJCWdvdG8gdGFpbF9vcHRpbWl6YXRpb247CisJCQl9CisJCX0KKworCQkvKiBMZXQncyBzZWUgaWYgd2UgaGF2ZSByZXNvbHZlZCBpdC4gKi8KKwkJcmV0ID0gaGFuZGxlX2ZpbGUocGF0aCwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQljb250aW51ZTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIlJlY29yZGVkIHJlc29sdXRpb24gZm9yICclcycuXG4iLCBwYXRoKTsKKwkJY29weV9maWxlKHBhdGgsIHJyX3BhdGgobmFtZSwgInBvc3RpbWFnZSIpKTsKK3RhaWxfb3B0aW1pemF0aW9uOgorCQlpZiAoaSA8IHJyLT5uciAtIDEpCisJCQltZW1tb3ZlKHJyLT5pdGVtcyArIGksCisJCQkJcnItPml0ZW1zICsgaSArIDEsCisJCQkJc2l6ZW9mKHJyLT5pdGVtc1swXSkgKiAocnItPm5yIC0gaSAtIDEpKTsKKwkJcnItPm5yLS07CisJCWktLTsKKwl9CisKKwlyZXR1cm4gd3JpdGVfcnIocnIsIGZkKTsKK30KKworc3RhdGljIGludCBnaXRfcmVyZXJlX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImdjLnJlcmVyZXJlc29sdmVkIikpCisJCWN1dG9mZl9yZXNvbHZlID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJZWxzZSBpZiAoIXN0cmNtcCh2YXIsICJnYy5yZXJlcmV1bnJlc29sdmVkIikpCisJCWN1dG9mZl9ub3Jlc29sdmUgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwllbHNlCisJCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmVyZXJlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBwYXRoX2xpc3QgbWVyZ2VfcnIgPSB7IE5VTEwsIDAsIDAsIDEgfTsKKwlpbnQgaSwgZmQgPSAtMTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KGdpdF9wYXRoKCJyci1jYWNoZSIpLCAmc3QpIHx8ICFTX0lTRElSKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworCWdpdF9jb25maWcoZ2l0X3JlcmVyZV9jb25maWcpOworCisJbWVyZ2VfcnJfcGF0aCA9IHhzdHJkdXAoZ2l0X3BhdGgoInJyLWNhY2hlL01FUkdFX1JSIikpOworCWZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmd3JpdGVfbG9jaywgbWVyZ2VfcnJfcGF0aCwgMSk7CisJcmVhZF9ycigmbWVyZ2VfcnIpOworCisJaWYgKGFyZ2MgPCAyKQorCQlyZXR1cm4gZG9fcGxhaW5fcmVyZXJlKCZtZXJnZV9yciwgZmQpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImNsZWFyIikpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1lcmdlX3JyLm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKm5hbWUgPSAoY29uc3QgY2hhciAqKW1lcmdlX3JyLml0ZW1zW2ldLnV0aWw7CisJCQlpZiAoIXN0YXQoZ2l0X3BhdGgoInJyLWNhY2hlLyVzIiwgbmFtZSksICZzdCkgJiYKKwkJCQkJU19JU0RJUihzdC5zdF9tb2RlKSAmJgorCQkJCQlzdGF0KHJyX3BhdGgobmFtZSwgInBvc3RpbWFnZSIpLCAmc3QpKQorCQkJCXVubGlua19ycl9pdGVtKG5hbWUpOworCQl9CisJCXVubGluayhtZXJnZV9ycl9wYXRoKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImdjIikpCisJCWdhcmJhZ2VfY29sbGVjdCgmbWVyZ2VfcnIpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgInN0YXR1cyIpKQorCQlmb3IgKGkgPSAwOyBpIDwgbWVyZ2VfcnIubnI7IGkrKykKKwkJCXByaW50ZigiJXNcbiIsIG1lcmdlX3JyLml0ZW1zW2ldLnBhdGgpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImRpZmYiKSkKKwkJZm9yIChpID0gMDsgaSA8IG1lcmdlX3JyLm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGggPSBtZXJnZV9yci5pdGVtc1tpXS5wYXRoOworCQkJY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopbWVyZ2VfcnIuaXRlbXNbaV0udXRpbDsKKwkJCWRpZmZfdHdvKHJyX3BhdGgobmFtZSwgInByZWltYWdlIiksIHBhdGgsIHBhdGgsIHBhdGgpOworCQl9CisJZWxzZQorCQl1c2FnZShnaXRfcmVyZXJlX3VzYWdlKTsKKworCXBhdGhfbGlzdF9jbGVhcigmbWVyZ2VfcnIsIDEpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9idWlsdGluLXJldi1saXN0LmMgYi9idWlsdGluLXJldi1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmNTNmNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmV2LWxpc3QuYwpAQCAtMCwwICsxLDU3MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibGlzdC1vYmplY3RzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisvKiBiaXRzICMwLTE1IGluIHJldmlzaW9uLmggKi8KKworI2RlZmluZSBDT1VOVEVECQkoMXU8PDE2KQorCitzdGF0aWMgY29uc3QgY2hhciByZXZfbGlzdF91c2FnZVtdID0KKyJnaXQtcmV2LWxpc3QgW09QVElPTl0gPGNvbW1pdC1pZD4uLi4gWyAtLSBwYXRocy4uLiBdXG4iCisiICBsaW1pdGluZyBvdXRwdXQ6XG4iCisiICAgIC0tbWF4LWNvdW50PW5yXG4iCisiICAgIC0tbWF4LWFnZT1lcG9jaFxuIgorIiAgICAtLW1pbi1hZ2U9ZXBvY2hcbiIKKyIgICAgLS1zcGFyc2VcbiIKKyIgICAgLS1uby1tZXJnZXNcbiIKKyIgICAgLS1yZW1vdmUtZW1wdHlcbiIKKyIgICAgLS1hbGxcbiIKKyIgICAgLS1zdGRpblxuIgorIiAgb3JkZXJpbmcgb3V0cHV0OlxuIgorIiAgICAtLXRvcG8tb3JkZXJcbiIKKyIgICAgLS1kYXRlLW9yZGVyXG4iCisiICBmb3JtYXR0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1wYXJlbnRzXG4iCisiICAgIC0tb2JqZWN0cyB8IC0tb2JqZWN0cy1lZGdlXG4iCisiICAgIC0tdW5wYWNrZWRcbiIKKyIgICAgLS1oZWFkZXIgfCAtLXByZXR0eVxuIgorIiAgICAtLWFiYnJldj1uciB8IC0tbm8tYWJicmV2XG4iCisiICAgIC0tYWJicmV2LWNvbW1pdFxuIgorIiAgICAtLWxlZnQtcmlnaHRcbiIKKyIgIHNwZWNpYWwgcHVycG9zZTpcbiIKKyIgICAgLS1iaXNlY3RcbiIKKyIgICAgLS1iaXNlY3QtdmFycyIKKzsKKworc3RhdGljIHN0cnVjdCByZXZfaW5mbyByZXZzOworCitzdGF0aWMgaW50IGJpc2VjdF9saXN0Oworc3RhdGljIGludCBzaG93X3RpbWVzdGFtcDsKK3N0YXRpYyBpbnQgaGRyX3Rlcm1pbmF0aW9uOworc3RhdGljIGNvbnN0IGNoYXIgKmhlYWRlcl9wcmVmaXg7CisKK3N0YXRpYyB2b2lkIHNob3dfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpZiAoc2hvd190aW1lc3RhbXApCisJCXByaW50ZigiJWx1ICIsIGNvbW1pdC0+ZGF0ZSk7CisJaWYgKGhlYWRlcl9wcmVmaXgpCisJCWZwdXRzKGhlYWRlcl9wcmVmaXgsIHN0ZG91dCk7CisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCXB1dGNoYXIoJy0nKTsKKwllbHNlIGlmIChyZXZzLmxlZnRfcmlnaHQpIHsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU1lNTUVUUklDX0xFRlQpCisJCQlwdXRjaGFyKCc8Jyk7CisJCWVsc2UKKwkJCXB1dGNoYXIoJz4nKTsKKwl9CisJaWYgKHJldnMuYWJicmV2X2NvbW1pdCAmJiByZXZzLmFiYnJldikKKwkJZnB1dHMoZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIHJldnMuYWJicmV2KSwKKwkJICAgICAgc3Rkb3V0KTsKKwllbHNlCisJCWZwdXRzKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpLCBzdGRvdXQpOworCWlmIChyZXZzLnBhcmVudHMpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IG9iamVjdCAqbyA9ICYocGFyZW50cy0+aXRlbS0+b2JqZWN0KTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKG8tPmZsYWdzICYgVE1QX01BUkspCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiAlcyIsIHNoYTFfdG9faGV4KG8tPnNoYTEpKTsKKwkJCW8tPmZsYWdzIHw9IFRNUF9NQVJLOworCQl9CisJCS8qIFRNUF9NQVJLIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGZsYWcgdGhhdCBjYW4KKwkJICogYmUgdXNlZCBsb2NhbGx5LCBidXQgdGhlIHVzZXIgc2hvdWxkIGNsZWFuCisJCSAqIHRoaW5ncyB1cCBhZnRlciBpdCBpcyBkb25lIHdpdGggdGhlbS4KKwkJICovCisJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBwYXJlbnRzOworCQkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KQorCQkJcGFyZW50cy0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5UTVBfTUFSSzsKKwl9CisJaWYgKHJldnMuY29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlwdXRjaGFyKCcgJyk7CisJZWxzZQorCQlwdXRjaGFyKCdcbicpOworCisJaWYgKHJldnMudmVyYm9zZV9oZWFkZXIpIHsKKwkJc3RhdGljIGNoYXIgcHJldHR5X2hlYWRlclsxNjM4NF07CisJCXByZXR0eV9wcmludF9jb21taXQocmV2cy5jb21taXRfZm9ybWF0LCBjb21taXQsIH4wLAorCQkJCSAgICBwcmV0dHlfaGVhZGVyLCBzaXplb2YocHJldHR5X2hlYWRlciksCisJCQkJICAgIHJldnMuYWJicmV2LCBOVUxMLCBOVUxMLCByZXZzLmRhdGVfbW9kZSk7CisJCXByaW50ZigiJXMlYyIsIHByZXR0eV9oZWFkZXIsIGhkcl90ZXJtaW5hdGlvbik7CisJfQorCWZmbHVzaChzdGRvdXQpOworCWlmIChjb21taXQtPnBhcmVudHMpIHsKKwkJZnJlZV9jb21taXRfbGlzdChjb21taXQtPnBhcmVudHMpOworCQljb21taXQtPnBhcmVudHMgPSBOVUxMOworCX0KKwlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwljb21taXQtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb2JqZWN0KHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnApCit7CisJLyogQW4gb2JqZWN0IHdpdGggbmFtZSAiZm9vXG4wMDAwMDAwLi4uIiBjYW4gYmUgdXNlZCB0bworCSAqIGNvbmZ1c2UgZG93bnN0cmVhbSBnaXQtcGFjay1vYmplY3RzIHZlcnkgYmFkbHkuCisJICovCisJY29uc3QgY2hhciAqZXAgPSBzdHJjaHIocC0+bmFtZSwgJ1xuJyk7CisKKwlpZiAocC0+aXRlbS0+dHlwZSA9PSBPQkpfQkxPQiAmJiAhaGFzX3NoYTFfZmlsZShwLT5pdGVtLT5zaGExKSkKKwkJZGllKCJtaXNzaW5nIGJsb2Igb2JqZWN0ICclcyciLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSk7CisKKwlpZiAoZXApIHsKKwkJcHJpbnRmKCIlcyAlLipzXG4iLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSwKKwkJICAgICAgIChpbnQpIChlcCAtIHAtPm5hbWUpLAorCQkgICAgICAgcC0+bmFtZSk7CisJfQorCWVsc2UKKwkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgocC0+aXRlbS0+c2hhMSksIHAtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2VkZ2Uoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXByaW50ZigiLSVzXG4iLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgdHJ1bHkgc3R1cGlkIGFsZ29yaXRobSwgYnV0IGl0J3Mgb25seQorICogdXNlZCBmb3IgYmlzZWN0aW9uLCBhbmQgd2UganVzdCBkb24ndCBjYXJlIGVub3VnaC4KKyAqCisgKiBXZSBjYXJlIGp1c3QgYmFyZWx5IGVub3VnaCB0byBhdm9pZCByZWN1cnNpbmcgZm9yCisgKiBub24tbWVyZ2UgZW50cmllcy4KKyAqLworc3RhdGljIGludCBjb3VudF9kaXN0YW5jZShzdHJ1Y3QgY29tbWl0X2xpc3QgKmVudHJ5KQoreworCWludCBuciA9IDA7CisKKwl3aGlsZSAoZW50cnkpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gZW50cnktPml0ZW07CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IENPVU5URUQpKQorCQkJYnJlYWs7CisJCWlmICghcmV2cy5wcnVuZV9mbiB8fCAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBUUkVFQ0hBTkdFKSkKKwkJCW5yKys7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IENPVU5URUQ7CisJCXAgPSBjb21taXQtPnBhcmVudHM7CisJCWVudHJ5ID0gcDsKKwkJaWYgKHApIHsKKwkJCXAgPSBwLT5uZXh0OworCQkJd2hpbGUgKHApIHsKKwkJCQluciArPSBjb3VudF9kaXN0YW5jZShwKTsKKwkJCQlwID0gcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBucjsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZGlzdGFuY2Uoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH5DT1VOVEVEOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9Cit9CisKKyNkZWZpbmUgREVCVUdfQklTRUNUIDAKKworc3RhdGljIGlubGluZSBpbnQgd2VpZ2h0KHN0cnVjdCBjb21taXRfbGlzdCAqZWxlbSkKK3sKKwlyZXR1cm4gKigoaW50KikoZWxlbS0+aXRlbS0+dXRpbCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2VpZ2h0X3NldChzdHJ1Y3QgY29tbWl0X2xpc3QgKmVsZW0sIGludCB3ZWlnaHQpCit7CisJKigoaW50KikoZWxlbS0+aXRlbS0+dXRpbCkpID0gd2VpZ2h0OworfQorCitzdGF0aWMgaW50IGNvdW50X2ludGVyZXN0aW5nX3BhcmVudHMoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMCwgcCA9IGNvbW1pdC0+cGFyZW50czsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPml0ZW0tPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIGludCBoYWxmd2F5KHN0cnVjdCBjb21taXRfbGlzdCAqcCwgaW50IGRpc3RhbmNlLCBpbnQgbnIpCit7CisJLyoKKwkgKiBEb24ndCBzaG9ydC1jdXQgc29tZXRoaW5nIHdlIGFyZSBub3QgZ29pbmcgdG8gcmV0dXJuIQorCSAqLworCWlmIChyZXZzLnBydW5lX2ZuICYmICEocC0+aXRlbS0+b2JqZWN0LmZsYWdzICYgVFJFRUNIQU5HRSkpCisJCXJldHVybiAwOworCWlmIChERUJVR19CSVNFQ1QpCisJCXJldHVybiAwOworCS8qCisJICogMiBhbmQgMyBhcmUgaGFsZndheSBvZiA1LgorCSAqIDMgaXMgaGFsZndheSBvZiA2IGJ1dCAyIGFuZCA0IGFyZSBub3QuCisJICovCisJZGlzdGFuY2UgKj0gMjsKKwlzd2l0Y2ggKGRpc3RhbmNlIC0gbnIpIHsKKwljYXNlIC0xOiBjYXNlIDA6IGNhc2UgMToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisjaWYgIURFQlVHX0JJU0VDVAorI2RlZmluZSBzaG93X2xpc3QoYSxiLGMsZCkgZG8geyA7IH0gd2hpbGUgKDApCisjZWxzZQorc3RhdGljIHZvaWQgc2hvd19saXN0KGNvbnN0IGNoYXIgKmRlYnVnLCBpbnQgY291bnRlZCwgaW50IG5yLAorCQkgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCisJZnByaW50ZihzdGRlcnIsICIlcyAoJWQvJWQpXG4iLCBkZWJ1ZywgY291bnRlZCwgbnIpOworCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwcDsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJdW5zaWduZWQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWNoYXIgKmJ1ZiA9IHJlYWRfc2hhMV9maWxlKGNvbW1pdC0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCWNoYXIgKmVwLCAqc3A7CisKKwkJZnByaW50ZihzdGRlcnIsICIlYyVjJWMgIiwKKwkJCShmbGFncyAmIFRSRUVDSEFOR0UpID8gJ1QnIDogJyAnLAorCQkJKGZsYWdzICYgVU5JTlRFUkVTVElORykgPyAnVScgOiAnICcsCisJCQkoZmxhZ3MgJiBDT1VOVEVEKSA/ICdDJyA6ICcgJyk7CisJCWlmIChjb21taXQtPnV0aWwpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiUzZCIsIHdlaWdodChwKSk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiLS0tIik7CisJCWZwcmludGYoc3RkZXJyLCAiICUuKnMiLCA4LCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCWZvciAocHAgPSBjb21taXQtPnBhcmVudHM7IHBwOyBwcCA9IHBwLT5uZXh0KQorCQkJZnByaW50ZihzdGRlcnIsICIgJS4qcyIsIDgsCisJCQkJc2hhMV90b19oZXgocHAtPml0ZW0tPm9iamVjdC5zaGExKSk7CisKKwkJc3AgPSBzdHJzdHIoYnVmLCAiXG5cbiIpOworCQlpZiAoc3ApIHsKKwkJCXNwICs9IDI7CisJCQlmb3IgKGVwID0gc3A7ICplcCAmJiAqZXAgIT0gJ1xuJzsgZXArKykKKwkJCQk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiAlLipzIiwgKGludCkoZXAgLSBzcCksIHNwKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJfQorfQorI2VuZGlmIC8qIERFQlVHX0JJU0VDVCAqLworCisvKgorICogemVybyBvciBwb3NpdGl2ZSB3ZWlnaHQgaXMgdGhlIG51bWJlciBvZiBpbnRlcmVzdGluZyBjb21taXRzIGl0IGNhbgorICogcmVhY2gsIGluY2x1ZGluZyBpdHNlbGYuICBFc3BlY2lhbGx5LCB3ZWlnaHQgPSAwIG1lYW5zIGl0IGRvZXMgbm90CisgKiByZWFjaCBhbnkgdHJlZS1jaGFuZ2luZyBjb21taXRzIChlLmcuIGp1c3QgYWJvdmUgdW5pbnRlcmVzdGluZyBvbmUKKyAqIGJ1dCB0cmF2ZXJzYWwgaXMgd2l0aCBwYXRoc3BlYykuCisgKgorICogd2VpZ2h0ID0gLTEgbWVhbnMgaXQgaGFzIG9uZSBwYXJlbnQgYW5kIGl0cyBkaXN0YW5jZSBpcyB5ZXQgdG8KKyAqIGJlIGNvbXB1dGVkLgorICoKKyAqIHdlaWdodCA9IC0yIG1lYW5zIGl0IGhhcyBtb3JlIHRoYW4gb25lIHBhcmVudCBhbmQgaXRzIGRpc3RhbmNlIGlzCisgKiB1bmtub3duLiAgQWZ0ZXIgcnVubmluZyBjb3VudF9kaXN0YW5jZSgpIGZpcnN0LCB0aGV5IHdpbGwgZ2V0IHplcm8KKyAqIG9yIHBvc2l0aXZlIGRpc3RhbmNlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKmZpbmRfYmlzZWN0aW9uKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwKKwkJCQkJICBpbnQgKnJlYWNoZXMsIGludCAqYWxsKQoreworCWludCBuLCBuciwgb25fbGlzdCwgY291bnRlZCwgZGlzdGFuY2U7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwLCAqYmVzdCwgKm5leHQsICpsYXN0OworCWludCAqd2VpZ2h0czsKKworCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgZW50cnkiLCAwLCAwLCBsaXN0KTsKKworCS8qCisJICogQ291bnQgdGhlIG51bWJlciBvZiB0b3RhbCBhbmQgdHJlZS1jaGFuZ2luZyBpdGVtcyBvbiB0aGUKKwkgKiBsaXN0LCB3aGlsZSByZXZlcnNpbmcgdGhlIGxpc3QuCisJICovCisJZm9yIChuciA9IG9uX2xpc3QgPSAwLCBsYXN0ID0gTlVMTCwgcCA9IGxpc3Q7CisJICAgICBwOworCSAgICAgcCA9IG5leHQpIHsKKwkJdW5zaWduZWQgZmxhZ3MgPSBwLT5pdGVtLT5vYmplY3QuZmxhZ3M7CisKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWlmIChmbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJcC0+bmV4dCA9IGxhc3Q7CisJCWxhc3QgPSBwOworCQlpZiAoIXJldnMucHJ1bmVfZm4gfHwgKGZsYWdzICYgVFJFRUNIQU5HRSkpCisJCQlucisrOworCQlvbl9saXN0Kys7CisJfQorCWxpc3QgPSBsYXN0OworCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgc29ydGVkIiwgMCwgbnIsIGxpc3QpOworCisJKmFsbCA9IG5yOworCXdlaWdodHMgPSB4Y2FsbG9jKG9uX2xpc3QsIHNpemVvZihpbnQqKSk7CisJY291bnRlZCA9IDA7CisKKwlmb3IgKG4gPSAwLCBwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJdW5zaWduZWQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKworCQlwLT5pdGVtLT51dGlsID0gJndlaWdodHNbbisrXTsKKwkJc3dpdGNoIChjb3VudF9pbnRlcmVzdGluZ19wYXJlbnRzKGNvbW1pdCkpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFyZXZzLnBydW5lX2ZuIHx8IChmbGFncyAmIFRSRUVDSEFOR0UpKSB7CisJCQkJd2VpZ2h0X3NldChwLCAxKTsKKwkJCQljb3VudGVkKys7CisJCQkJc2hvd19saXN0KCJiaXNlY3Rpb24gMiBjb3VudCBvbmUiLAorCQkJCQkgIGNvdW50ZWQsIG5yLCBsaXN0KTsKKwkJCX0KKwkJCS8qCisJCQkgKiBvdGhlcndpc2UsIGl0IGlzIGtub3duIG5vdCB0byByZWFjaCBhbnkKKwkJCSAqIHRyZWUtY2hhbmdpbmcgY29tbWl0IGFuZCBnZXRzIHdlaWdodCAwLgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJd2VpZ2h0X3NldChwLCAtMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXdlaWdodF9zZXQocCwgLTIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzaG93X2xpc3QoImJpc2VjdGlvbiAyIGluaXRpYWxpemUiLCBjb3VudGVkLCBuciwgbGlzdCk7CisKKwkvKgorCSAqIElmIHlvdSBoYXZlIG9ubHkgb25lIHBhcmVudCBpbiB0aGUgcmVzdWx0aW5nIHNldAorCSAqIHRoZW4geW91IGNhbiByZWFjaCBvbmUgY29tbWl0IG1vcmUgdGhhbiB0aGF0IHBhcmVudAorCSAqIGNhbiByZWFjaC4gIFNvIHdlIGRvIG5vdCBoYXZlIHRvIHJ1biB0aGUgZXhwZW5zaXZlCisJICogY291bnRfZGlzdGFuY2UoKSBmb3Igc2luZ2xlIHN0cmFuZCBvZiBwZWFybHMuCisJICoKKwkgKiBIb3dldmVyLCBpZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHBhcmVudHMsIHlvdSBjYW5ub3QKKwkgKiBqdXN0IGFkZCB0aGVpciBkaXN0YW5jZSBhbmQgb25lIGZvciB5b3Vyc2VsZiwgc2luY2UKKwkgKiB0aGV5IHVzdWFsbHkgcmVhY2ggdGhlIHNhbWUgYW5jZXN0b3IgYW5kIHlvdSB3b3VsZAorCSAqIGVuZCB1cCBjb3VudGluZyB0aGVtIHR3aWNlIHRoYXQgd2F5LgorCSAqCisJICogU28gd2Ugd2lsbCBmaXJzdCBjb3VudCBkaXN0YW5jZSBvZiBtZXJnZXMgdGhlIHVzdWFsCisJICogd2F5LCBhbmQgdGhlbiBmaWxsIHRoZSBibGFua3MgdXNpbmcgY2hlYXBlciBhbGdvcml0aG0uCisJICovCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPml0ZW0tPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJbiA9IHdlaWdodChwKTsKKwkJaWYgKG4gIT0gLTIpCisJCQljb250aW51ZTsKKwkJZGlzdGFuY2UgPSBjb3VudF9kaXN0YW5jZShwKTsKKwkJY2xlYXJfZGlzdGFuY2UobGlzdCk7CisJCXdlaWdodF9zZXQocCwgZGlzdGFuY2UpOworCisJCS8qIERvZXMgaXQgaGFwcGVuIHRvIGJlIGF0IGV4YWN0bHkgaGFsZi13YXk/ICovCisJCWlmIChoYWxmd2F5KHAsIGRpc3RhbmNlLCBucikpIHsKKwkJCXAtPm5leHQgPSBOVUxMOworCQkJKnJlYWNoZXMgPSBkaXN0YW5jZTsKKwkJCWZyZWUod2VpZ2h0cyk7CisJCQlyZXR1cm4gcDsKKwkJfQorCQljb3VudGVkKys7CisJfQorCisJc2hvd19saXN0KCJiaXNlY3Rpb24gMiBjb3VudF9kaXN0YW5jZSIsIGNvdW50ZWQsIG5yLCBsaXN0KTsKKworCXdoaWxlIChjb3VudGVkIDwgbnIpIHsKKwkJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcTsKKwkJCXVuc2lnbmVkIGZsYWdzID0gcC0+aXRlbS0+b2JqZWN0LmZsYWdzOworCisJCQlpZiAoMCA8PSB3ZWlnaHQocCkpCisJCQkJY29udGludWU7CisJCQlmb3IgKHEgPSBwLT5pdGVtLT5wYXJlbnRzOyBxOyBxID0gcS0+bmV4dCkgeworCQkJCWlmIChxLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoMCA8PSB3ZWlnaHQocSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFxKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogd2VpZ2h0IGZvciBwIGlzIHVua25vd24gYnV0IHEgaXMga25vd24uCisJCQkgKiBhZGQgb25lIGZvciBwIGl0c2VsZiBpZiBwIGlzIHRvIGJlIGNvdW50ZWQsCisJCQkgKiBvdGhlcndpc2UgaW5oZXJpdCBpdCBmcm9tIHEgZGlyZWN0bHkuCisJCQkgKi8KKwkJCWlmICghcmV2cy5wcnVuZV9mbiB8fCAoZmxhZ3MgJiBUUkVFQ0hBTkdFKSkgeworCQkJCXdlaWdodF9zZXQocCwgd2VpZ2h0KHEpKzEpOworCQkJCWNvdW50ZWQrKzsKKwkJCQlzaG93X2xpc3QoImJpc2VjdGlvbiAyIGNvdW50IG9uZSIsCisJCQkJCSAgY291bnRlZCwgbnIsIGxpc3QpOworCQkJfQorCQkJZWxzZQorCQkJCXdlaWdodF9zZXQocCwgd2VpZ2h0KHEpKTsKKworCQkJLyogRG9lcyBpdCBoYXBwZW4gdG8gYmUgYXQgZXhhY3RseSBoYWxmLXdheT8gKi8KKwkJCWRpc3RhbmNlID0gd2VpZ2h0KHApOworCQkJaWYgKGhhbGZ3YXkocCwgZGlzdGFuY2UsIG5yKSkgeworCQkJCXAtPm5leHQgPSBOVUxMOworCQkJCSpyZWFjaGVzID0gZGlzdGFuY2U7CisJCQkJZnJlZSh3ZWlnaHRzKTsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfQorCX0KKworCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgY291bnRlZCBhbGwiLCBjb3VudGVkLCBuciwgbGlzdCk7CisKKwkvKiBUaGVuIGZpbmQgdGhlIGJlc3Qgb25lICovCisJY291bnRlZCA9IC0xOworCWJlc3QgPSBsaXN0OworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXVuc2lnbmVkIGZsYWdzID0gcC0+aXRlbS0+b2JqZWN0LmZsYWdzOworCisJCWlmIChyZXZzLnBydW5lX2ZuICYmICEoZmxhZ3MgJiBUUkVFQ0hBTkdFKSkKKwkJCWNvbnRpbnVlOworCQlkaXN0YW5jZSA9IHdlaWdodChwKTsKKwkJaWYgKG5yIC0gZGlzdGFuY2UgPCBkaXN0YW5jZSkKKwkJCWRpc3RhbmNlID0gbnIgLSBkaXN0YW5jZTsKKwkJaWYgKGRpc3RhbmNlID4gY291bnRlZCkgeworCQkJYmVzdCA9IHA7CisJCQljb3VudGVkID0gZGlzdGFuY2U7CisJCQkqcmVhY2hlcyA9IHdlaWdodChwKTsKKwkJfQorCX0KKwlpZiAoYmVzdCkKKwkJYmVzdC0+bmV4dCA9IE5VTEw7CisJZnJlZSh3ZWlnaHRzKTsKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9yZXZpc2lvbnNfZnJvbV9zdGRpbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJY2hhciBsaW5lWzEwMDBdOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pICE9IE5VTEwpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKwkJaWYgKGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKGxpbmVbMF0gPT0gJy0nKQorCQkJZGllKCJvcHRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gLS1zdGRpbiBtb2RlIik7CisJCWlmIChoYW5kbGVfcmV2aXNpb25fYXJnKGxpbmUsIHJldnMsIDAsIDEpKQorCQkJZGllKCJiYWQgcmV2aXNpb24gJyVzJyIsIGxpbmUpOworCX0KK30KKworaW50IGNtZF9yZXZfbGlzdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJaW50IGk7CisJaW50IHJlYWRfZnJvbV9zdGRpbiA9IDA7CisJaW50IGJpc2VjdF9zaG93X3ZhcnMgPSAwOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBwcmVmaXgpOworCXJldnMuYWJicmV2ID0gMDsKKwlyZXZzLmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9VTlNQRUNJRklFRDsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXZzLCBOVUxMKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1oZWFkZXIiKSkgeworCQkJcmV2cy52ZXJib3NlX2hlYWRlciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRpbWVzdGFtcCIpKSB7CisJCQlzaG93X3RpbWVzdGFtcCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWJpc2VjdCIpKSB7CisJCQliaXNlY3RfbGlzdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWJpc2VjdC12YXJzIikpIHsKKwkJCWJpc2VjdF9saXN0ID0gMTsKKwkJCWJpc2VjdF9zaG93X3ZhcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGRpbiIpKSB7CisJCQlpZiAocmVhZF9mcm9tX3N0ZGluKyspCisJCQkJZGllKCItLXN0ZGluIGdpdmVuIHR3aWNlPyIpOworCQkJcmVhZF9yZXZpc2lvbnNfZnJvbV9zdGRpbigmcmV2cyk7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShyZXZfbGlzdF91c2FnZSk7CisKKwl9CisJaWYgKHJldnMuY29tbWl0X2Zvcm1hdCAhPSBDTUlUX0ZNVF9VTlNQRUNJRklFRCkgeworCQkvKiBUaGUgY29tbWFuZCBsaW5lIGhhcyBhIC0tcHJldHR5ICAqLworCQloZHJfdGVybWluYXRpb24gPSAnXG4nOworCQlpZiAocmV2cy5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCQloZWFkZXJfcHJlZml4ID0gIiI7CisJCWVsc2UKKwkJCWhlYWRlcl9wcmVmaXggPSAiY29tbWl0ICI7CisJfQorCWVsc2UgaWYgKHJldnMudmVyYm9zZV9oZWFkZXIpCisJCS8qIE9ubHkgLS1oZWFkZXIgd2FzIHNwZWNpZmllZCAqLworCQlyZXZzLmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9SQVc7CisKKwlsaXN0ID0gcmV2cy5jb21taXRzOworCisJaWYgKCghbGlzdCAmJgorCSAgICAgKCEocmV2cy50YWdfb2JqZWN0c3x8cmV2cy50cmVlX29iamVjdHN8fHJldnMuYmxvYl9vYmplY3RzKSAmJgorCSAgICAgICFyZXZzLnBlbmRpbmcubnIpKSB8fAorCSAgICByZXZzLmRpZmYpCisJCXVzYWdlKHJldl9saXN0X3VzYWdlKTsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IHJldnMudmVyYm9zZV9oZWFkZXIgfHwgcmV2cy5ncmVwX2ZpbHRlcjsKKwl0cmFja19vYmplY3RfcmVmcyA9IDA7CisJaWYgKGJpc2VjdF9saXN0KQorCQlyZXZzLmxpbWl0ZWQgPSAxOworCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKTsKKwlpZiAocmV2cy50cmVlX29iamVjdHMpCisJCW1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhyZXZzLmNvbW1pdHMsICZyZXZzLCBzaG93X2VkZ2UpOworCisJaWYgKGJpc2VjdF9saXN0KSB7CisJCWludCByZWFjaGVzID0gcmVhY2hlcywgYWxsID0gYWxsOworCisJCXJldnMuY29tbWl0cyA9IGZpbmRfYmlzZWN0aW9uKHJldnMuY29tbWl0cywgJnJlYWNoZXMsICZhbGwpOworCQlpZiAoYmlzZWN0X3Nob3dfdmFycykgeworCQkJaW50IGNudDsKKwkJCWlmICghcmV2cy5jb21taXRzKQorCQkJCXJldHVybiAxOworCQkJLyoKKwkJCSAqIHJldnMuY29tbWl0cyBjYW4gcmVhY2ggInJlYWNoZXMiIGNvbW1pdHMgYW1vbmcKKwkJCSAqICJhbGwiIGNvbW1pdHMuICBJZiBpdCBpcyBnb29kLCB0aGVuIHRoZXJlIGFyZQorCQkJICogKGFsbC1yZWFjaGVzKSBjb21taXRzIGxlZnQgdG8gYmUgYmlzZWN0ZWQuCisJCQkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgaXQgaXMgYmFkLCB0aGVuIHRoZSBzZXQKKwkJCSAqIHRvIGJpc2VjdCBpcyAicmVhY2hlcyIuCisJCQkgKiBBIGJpc2VjdCBzZXQgb2Ygc2l6ZSBOIGhhcyAoTi0xKSBjb21taXRzIGZ1cnRoZXIKKwkJCSAqIHRvIHRlc3QsIGFzIHdlIGFscmVhZHkga25vdyBvbmUgYmFkIG9uZS4KKwkJCSAqLworCQkJY250ID0gYWxsLXJlYWNoZXM7CisJCQlpZiAoY250IDwgcmVhY2hlcykKKwkJCQljbnQgPSByZWFjaGVzOworCQkJcHJpbnRmKCJiaXNlY3RfcmV2PSVzXG4iCisJCQkgICAgICAgImJpc2VjdF9ucj0lZFxuIgorCQkJICAgICAgICJiaXNlY3RfZ29vZD0lZFxuIgorCQkJICAgICAgICJiaXNlY3RfYmFkPSVkXG4iCisJCQkgICAgICAgImJpc2VjdF9hbGw9JWRcbiIsCisJCQkgICAgICAgc2hhMV90b19oZXgocmV2cy5jb21taXRzLT5pdGVtLT5vYmplY3Quc2hhMSksCisJCQkgICAgICAgY250IC0gMSwKKwkJCSAgICAgICBhbGwgLSByZWFjaGVzIC0gMSwKKwkJCSAgICAgICByZWFjaGVzIC0gMSwKKwkJCSAgICAgICBhbGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl0cmF2ZXJzZV9jb21taXRfbGlzdCgmcmV2cywgc2hvd19jb21taXQsIHNob3dfb2JqZWN0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1yZXYtcGFyc2UuYyBiL2J1aWx0aW4tcmV2LXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhZGRiMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmV2LXBhcnNlLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiByZXYtcGFyc2UuYworICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjZGVmaW5lIERPX1JFVlMJCTEKKyNkZWZpbmUgRE9fTk9SRVYJMgorI2RlZmluZSBET19GTEFHUwk0CisjZGVmaW5lIERPX05PTkZMQUdTCTgKK3N0YXRpYyBpbnQgZmlsdGVyID0gfjA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZWY7CisKKyNkZWZpbmUgTk9STUFMIDAKKyNkZWZpbmUgUkVWRVJTRUQgMQorc3RhdGljIGludCBzaG93X3R5cGUgPSBOT1JNQUw7CitzdGF0aWMgaW50IHN5bWJvbGljOworc3RhdGljIGludCBhYmJyZXY7CitzdGF0aWMgaW50IG91dHB1dF9zcTsKKworc3RhdGljIGludCByZXZzX2NvdW50OworCisvKgorICogU29tZSBhcmd1bWVudHMgYXJlIHJlbGV2YW50ICJyZXZpc2lvbiIgYXJndW1lbnRzLAorICogb3RoZXJzIGFyZSBhYm91dCBvdXRwdXQgZm9ybWF0IG9yIG90aGVyIGRldGFpbHMuCisgKiBUaGlzIHNvcnRzIGl0IGFsbCBvdXQuCisgKi8KK3N0YXRpYyBpbnQgaXNfcmV2X2FyZ3VtZW50KGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcmV2X2FyZ3NbXSA9IHsKKwkJIi0tYWxsIiwKKwkJIi0tYmlzZWN0IiwKKwkJIi0tZGVuc2UiLAorCQkiLS1icmFuY2hlcyIsCisJCSItLWhlYWRlciIsCisJCSItLW1heC1hZ2U9IiwKKwkJIi0tbWF4LWNvdW50PSIsCisJCSItLW1pbi1hZ2U9IiwKKwkJIi0tbm8tbWVyZ2VzIiwKKwkJIi0tb2JqZWN0cyIsCisJCSItLW9iamVjdHMtZWRnZSIsCisJCSItLXBhcmVudHMiLAorCQkiLS1wcmV0dHkiLAorCQkiLS1yZW1vdGVzIiwKKwkJIi0tc3BhcnNlIiwKKwkJIi0tdGFncyIsCisJCSItLXRvcG8tb3JkZXIiLAorCQkiLS1kYXRlLW9yZGVyIiwKKwkJIi0tdW5wYWNrZWQiLAorCQlOVUxMCisJfTsKKwljb25zdCBjaGFyICoqcCA9IHJldl9hcmdzOworCisJLyogYWNjZXB0IC08ZGlnaXQ+LCBsaWtlIHRyYWRpdGlvbmFsICJoZWFkIiAqLworCWlmICgoKmFyZyA9PSAnLScpICYmIGlzZGlnaXQoYXJnWzFdKSkKKwkJcmV0dXJuIDE7CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKnN0ciA9ICpwKys7CisJCWludCBsZW47CisJCWlmICghc3RyKQorCQkJcmV0dXJuIDA7CisJCWxlbiA9IHN0cmxlbihzdHIpOworCQlpZiAoIXN0cmNtcChhcmcsIHN0cikgfHwKKwkJICAgIChzdHJbbGVuLTFdID09ICc9JyAmJiAhc3RybmNtcChhcmcsIHN0ciwgbGVuKSkpCisJCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIE91dHB1dCBhcmd1bWVudCBhcyBhIHN0cmluZywgZWl0aGVyIFNRIG9yIG5vcm1hbCAqLworc3RhdGljIHZvaWQgc2hvdyhjb25zdCBjaGFyICphcmcpCit7CisJaWYgKG91dHB1dF9zcSkgeworCQlpbnQgc3EgPSAnXCcnLCBjaDsKKworCQlwdXRjaGFyKHNxKTsKKwkJd2hpbGUgKChjaCA9ICphcmcrKykpIHsKKwkJCWlmIChjaCA9PSBzcSkKKwkJCQlmcHV0cygiJ1xcJyIsIHN0ZG91dCk7CisJCQlwdXRjaGFyKGNoKTsKKwkJfQorCQlwdXRjaGFyKHNxKTsKKwkJcHV0Y2hhcignICcpOworCX0KKwllbHNlCisJCXB1dHMoYXJnKTsKK30KKworLyogT3V0cHV0IGEgcmV2aXNpb24sIG9ubHkgaWYgZmlsdGVyIGFsbG93cyBpdCAqLworc3RhdGljIHZvaWQgc2hvd19yZXYoaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCEoZmlsdGVyICYgRE9fUkVWUykpCisJCXJldHVybjsKKwlkZWYgPSBOVUxMOworCXJldnNfY291bnQrKzsKKworCWlmICh0eXBlICE9IHNob3dfdHlwZSkKKwkJcHV0Y2hhcignXicpOworCWlmIChzeW1ib2xpYyAmJiBuYW1lKQorCQlzaG93KG5hbWUpOworCWVsc2UgaWYgKGFiYnJldikKKwkJc2hvdyhmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgYWJicmV2KSk7CisJZWxzZQorCQlzaG93KHNoYTFfdG9faGV4KHNoYTEpKTsKK30KKworLyogT3V0cHV0IGEgZmxhZywgb25seSBpZiBmaWx0ZXIgYWxsb3dzIGl0LiAqLworc3RhdGljIGludCBzaG93X2ZsYWcoY29uc3QgY2hhciAqYXJnKQoreworCWlmICghKGZpbHRlciAmIERPX0ZMQUdTKSkKKwkJcmV0dXJuIDA7CisJaWYgKGZpbHRlciAmIChpc19yZXZfYXJndW1lbnQoYXJnKSA/IERPX1JFVlMgOiBET19OT1JFVikpIHsKKwkJc2hvdyhhcmcpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGVmYXVsdCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnMgPSBkZWY7CisKKwlpZiAocykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJCWRlZiA9IE5VTEw7CisJCWlmICghZ2V0X3NoYTEocywgc2hhMSkpIHsKKwkJCXNob3dfcmV2KE5PUk1BTCwgc2hhMSwgcyk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hvd19yZWZlcmVuY2UoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc2hvd19yZXYoTk9STUFMLCBzaGExLCByZWZuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kYXRlc3RyaW5nKGNvbnN0IGNoYXIgKmZsYWcsIGNvbnN0IGNoYXIgKmRhdGVzdHIpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMF07CisKKwkvKiBkYXRlIGhhbmRsaW5nIHJlcXVpcmVzIGJvdGggZmxhZ3MgYW5kIHJldnMgKi8KKwlpZiAoKGZpbHRlciAmIChET19GTEFHUyB8IERPX1JFVlMpKSAhPSAoRE9fRkxBR1MgfCBET19SRVZTKSkKKwkJcmV0dXJuOworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVsdSIsIGZsYWcsIGFwcHJveGlkYXRlKGRhdGVzdHIpKTsKKwlzaG93KGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzaG93X2RlZmF1bHQoKTsKKwlpZiAoKGZpbHRlciAmIChET19OT05GTEFHU3xET19OT1JFVikpID09IChET19OT05GTEFHU3xET19OT1JFVikpIHsKKwkJc2hvdyhhcmcpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2RpZmZlcmVuY2UoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmRvdGRvdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgZW5kWzIwXTsKKwljb25zdCBjaGFyICpuZXh0OworCWNvbnN0IGNoYXIgKnRoaXM7CisJaW50IHN5bW1ldHJpYzsKKworCWlmICghKGRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpKSkKKwkJcmV0dXJuIDA7CisJbmV4dCA9IGRvdGRvdCArIDI7CisJdGhpcyA9IGFyZzsKKwlzeW1tZXRyaWMgPSAoKm5leHQgPT0gJy4nKTsKKworCSpkb3Rkb3QgPSAwOworCW5leHQgKz0gc3ltbWV0cmljOworCisJaWYgKCEqbmV4dCkKKwkJbmV4dCA9ICJIRUFEIjsKKwlpZiAoZG90ZG90ID09IGFyZykKKwkJdGhpcyA9ICJIRUFEIjsKKwlpZiAoIWdldF9zaGExKHRoaXMsIHNoYTEpICYmICFnZXRfc2hhMShuZXh0LCBlbmQpKSB7CisJCXNob3dfcmV2KE5PUk1BTCwgZW5kLCBuZXh0KTsKKwkJc2hvd19yZXYoc3ltbWV0cmljID8gTk9STUFMIDogUkVWRVJTRUQsIHNoYTEsIHRoaXMpOworCQlpZiAoc3ltbWV0cmljKSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKmV4Y2x1ZGU7CisJCQlzdHJ1Y3QgY29tbWl0ICphLCAqYjsKKwkJCWEgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwkJCWIgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShlbmQpOworCQkJZXhjbHVkZSA9IGdldF9tZXJnZV9iYXNlcyhhLCBiLCAxKTsKKwkJCXdoaWxlIChleGNsdWRlKSB7CisJCQkJc3RydWN0IGNvbW1pdF9saXN0ICpuID0gZXhjbHVkZS0+bmV4dDsKKwkJCQlzaG93X3JldihSRVZFUlNFRCwKKwkJCQkJIGV4Y2x1ZGUtPml0ZW0tPm9iamVjdC5zaGExLE5VTEwpOworCQkJCWZyZWUoZXhjbHVkZSk7CisJCQkJZXhjbHVkZSA9IG47CisJCQl9CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCSpkb3Rkb3QgPSAnLic7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2X3BhcnNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCBhc19pcyA9IDAsIHZlcmlmeSA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXNfaXMpIHsKKwkJCWlmIChzaG93X2ZpbGUoYXJnKSAmJiBhc19pcyA8IDIpCisJCQkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywiLW4iKSkgeworCQkJaWYgKCsraSA+PSBhcmdjKQorCQkJCWRpZSgiLW4gcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKwkJCWlmICgoZmlsdGVyICYgRE9fRkxBR1MpICYmIChmaWx0ZXIgJiBET19SRVZTKSkgeworCQkJCXNob3coYXJnKTsKKwkJCQlzaG93KGFyZ3ZbaV0pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLW4iKSkgeworCQkJaWYgKChmaWx0ZXIgJiBET19GTEFHUykgJiYgKGZpbHRlciAmIERPX1JFVlMpKQorCQkJCXNob3coYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQkJYXNfaXMgPSAyOworCQkJCS8qIFBhc3Mgb24gdGhlICItLSIgaWYgd2Ugc2hvdyBhbnl0aGluZyBidXQgZmlsZXMuLiAqLworCQkJCWlmIChmaWx0ZXIgJiAoRE9fRkxBR1MgfCBET19SRVZTKSkKKwkJCQkJc2hvd19maWxlKGFyZyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWRlZmF1bHQiKSkgeworCQkJCWRlZiA9IGFyZ3ZbaSsxXTsKKwkJCQlpKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJldnMtb25seSIpKSB7CisJCQkJZmlsdGVyICY9IH5ET19OT1JFVjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tcmV2cyIpKSB7CisJCQkJZmlsdGVyICY9IH5ET19SRVZTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mbGFncyIpKSB7CisJCQkJZmlsdGVyICY9IH5ET19OT05GTEFHUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tZmxhZ3MiKSkgeworCQkJCWZpbHRlciAmPSB+RE9fRkxBR1M7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXZlcmlmeSIpKSB7CisJCQkJZmlsdGVyICY9IH4oRE9fRkxBR1N8RE9fTk9SRVYpOworCQkJCXZlcmlmeSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3J0IikgfHwKKwkJCSAgICAhcHJlZml4Y21wKGFyZywgIi0tc2hvcnQ9IikpIHsKKwkJCQlmaWx0ZXIgJj0gfihET19GTEFHU3xET19OT1JFVik7CisJCQkJdmVyaWZ5ID0gMTsKKwkJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCQlpZiAoYXJnWzddID09ICc9JykKKwkJCQkJYWJicmV2ID0gc3RydG91bChhcmcgKyA4LCBOVUxMLCAxMCk7CisJCQkJaWYgKGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCQllbHNlIGlmICg0MCA8PSBhYmJyZXYpCisJCQkJCWFiYnJldiA9IDQwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zcSIpKSB7CisJCQkJb3V0cHV0X3NxID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm90IikpIHsKKwkJCQlzaG93X3R5cGUgXj0gUkVWRVJTRUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXN5bWJvbGljIikpIHsKKwkJCQlzeW1ib2xpYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJZm9yX2VhY2hfcmVmKHNob3dfcmVmZXJlbmNlLCBOVUxMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYnJhbmNoZXMiKSkgeworCQkJCWZvcl9lYWNoX2JyYW5jaF9yZWYoc2hvd19yZWZlcmVuY2UsIE5VTEwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCQlmb3JfZWFjaF90YWdfcmVmKHNob3dfcmVmZXJlbmNlLCBOVUxMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3RlcyIpKSB7CisJCQkJZm9yX2VhY2hfcmVtb3RlX3JlZihzaG93X3JlZmVyZW5jZSwgTlVMTCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctcHJlZml4IikpIHsKKwkJCQlpZiAocHJlZml4KQorCQkJCQlwdXRzKHByZWZpeCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctY2R1cCIpKSB7CisJCQkJY29uc3QgY2hhciAqcGZ4ID0gcHJlZml4OworCQkJCXdoaWxlIChwZngpIHsKKwkJCQkJcGZ4ID0gc3RyY2hyKHBmeCwgJy8nKTsKKwkJCQkJaWYgKHBmeCkgeworCQkJCQkJcGZ4Kys7CisJCQkJCQlwcmludGYoIi4uLyIpOworCQkJCQl9CisJCQkJfQorCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWdpdC1kaXIiKSkgeworCQkJCWNvbnN0IGNoYXIgKmdpdGRpciA9IGdldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwkJCQlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVhdOworCQkJCWlmIChnaXRkaXIpIHsKKwkJCQkJcHV0cyhnaXRkaXIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFwcmVmaXgpIHsKKwkJCQkJcHV0cygiLmdpdCIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFnZXRjd2QoY3dkLCBQQVRIX01BWCkpCisJCQkJCWRpZSgidW5hYmxlIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQkJcHJpbnRmKCIlcy8uZ2l0XG4iLCBjd2QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pcy1pbnNpZGUtZ2l0LWRpciIpKSB7CisJCQkJcHJpbnRmKCIlc1xuIiwgaXNfaW5zaWRlX2dpdF9kaXIoKSA/ICJ0cnVlIgorCQkJCQkJOiAiZmFsc2UiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tc2luY2U9IikpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWF4LWFnZT0iLCBhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWFmdGVyPSIpKSB7CisJCQkJc2hvd19kYXRlc3RyaW5nKCItLW1heC1hZ2U9IiwgYXJnKzgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1iZWZvcmU9IikpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWluLWFnZT0iLCBhcmcrOSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVudGlsPSIpKSB7CisJCQkJc2hvd19kYXRlc3RyaW5nKCItLW1pbi1hZ2U9IiwgYXJnKzgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNob3dfZmxhZyhhcmcpICYmIHZlcmlmeSkKKwkJCQlkaWUoIk5lZWRlZCBhIHNpbmdsZSByZXZpc2lvbiIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3QgYSBmbGFnIGFyZ3VtZW50ICovCisJCWlmICh0cnlfZGlmZmVyZW5jZShhcmcpKQorCQkJY29udGludWU7CisJCWlmICghZ2V0X3NoYTEoYXJnLCBzaGExKSkgeworCQkJc2hvd19yZXYoTk9STUFMLCBzaGExLCBhcmcpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCphcmcgPT0gJ14nICYmICFnZXRfc2hhMShhcmcrMSwgc2hhMSkpIHsKKwkJCXNob3dfcmV2KFJFVkVSU0VELCBzaGExLCBhcmcrMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlhc19pcyA9IDE7CisJCWlmICghc2hvd19maWxlKGFyZykpCisJCQljb250aW51ZTsKKwkJaWYgKHZlcmlmeSkKKwkJCWRpZSgiTmVlZGVkIGEgc2luZ2xlIHJldmlzaW9uIik7CisJCXZlcmlmeV9maWxlbmFtZShwcmVmaXgsIGFyZyk7CisJfQorCXNob3dfZGVmYXVsdCgpOworCWlmICh2ZXJpZnkgJiYgcmV2c19jb3VudCAhPSAxKQorCQlkaWUoIk5lZWRlZCBhIHNpbmdsZSByZXZpc2lvbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1yZXZlcnQuYyBiL2J1aWx0aW4tcmV2ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyZjE1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmV2ZXJ0LmMKQEAgLTAsMCArMSwzOTkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ3dC1zdGF0dXMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAidXRmOC5oIgorCisvKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSBidWlsdGlucyByZXZlcnQgYW5kIGNoZXJyeS1waWNrLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisgKgorICogQmFzZWQgb24gZ2l0LXJldmVydC5zaCwgd2hpY2ggaXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyAqIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpyZXZlcnRfdXNhZ2UgPSAiZ2l0LXJldmVydCBbLS1lZGl0IHwgLS1uby1lZGl0XSBbLW5dIDxjb21taXQtaXNoPiI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjaGVycnlfcGlja191c2FnZSA9ICJnaXQtY2hlcnJ5LXBpY2sgWy0tZWRpdF0gWy1uXSBbLXJdIFsteF0gPGNvbW1pdC1pc2g+IjsKKworc3RhdGljIGludCBlZGl0Oworc3RhdGljIGludCByZXBsYXk7CitlbnVtIHsgUkVWRVJULCBDSEVSUllfUElDSyB9IGFjdGlvbjsKK3N0YXRpYyBpbnQgbm9fY29tbWl0Oworc3RhdGljIHN0cnVjdCBjb21taXQgKmNvbW1pdDsKK3N0YXRpYyBpbnQgbmVlZGVkX2RlcmVmOworCitzdGF0aWMgY29uc3QgY2hhciAqbWU7CisKKyNkZWZpbmUgR0lUX1JFRkxPR19BQ1RJT04gIkdJVF9SRUZMT0dfQUNUSU9OIgorCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICp1c2FnZV9zdHIgPSBhY3Rpb24gPT0gUkVWRVJUID8KKwkJcmV2ZXJ0X3VzYWdlIDogY2hlcnJ5X3BpY2tfdXNhZ2U7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICphcmc7CisJaW50IGk7CisKKwlpZiAoYXJnYyA8IDIpCisJCXVzYWdlKHVzYWdlX3N0cik7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworCQlhcmcgPSBhcmd2W2ldOworCQlpZiAoIXN0cmNtcChhcmcsICItbiIpIHx8ICFzdHJjbXAoYXJnLCAiLS1uby1jb21taXQiKSkKKwkJCW5vX2NvbW1pdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLWUiKSB8fCAhc3RyY21wKGFyZywgIi0tZWRpdCIpKQorCQkJZWRpdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1lZGl0IikpCisJCQllZGl0ID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICIteCIpIHx8ICFzdHJjbXAoYXJnLCAiLS1pLXJlYWxseS13YW50LSIKKwkJCQkidG8tZXhwb3NlLW15LXByaXZhdGUtY29tbWl0LW9iamVjdC1uYW1lIikpCisJCQlyZXBsYXkgPSAwOworCQllbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSkKKwkJCXVzYWdlKHVzYWdlX3N0cik7CisJfQorCisJYXJnID0gYXJndlthcmdjIC0gMV07CisJaWYgKGdldF9zaGExKGFyZywgc2hhMSkpCisJCWRpZSAoIkNhbm5vdCBmaW5kICclcyciLCBhcmcpOworCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghY29tbWl0KQorCQlkaWUgKCJDb3VsZCBub3QgZmluZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAoY29tbWl0LT5vYmplY3QudHlwZSA9PSBPQkpfVEFHKSB7CisJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopCisJCQlkZXJlZl90YWcoKHN0cnVjdCBvYmplY3QgKiljb21taXQsIGFyZywgc3RybGVuKGFyZykpOworCQluZWVkZWRfZGVyZWYgPSAxOworCX0KKwlpZiAoY29tbWl0LT5vYmplY3QudHlwZSAhPSBPQkpfQ09NTUlUKQorCQlkaWUgKCInJXMnIGRvZXMgbm90IHBvaW50IHRvIGEgY29tbWl0IiwgYXJnKTsKK30KKworc3RhdGljIGNoYXIgKmdldF9vbmVsaW5lKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJY2hhciAqcmVzdWx0OworCWNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlLCAqYWJicmV2LCAqZW9sOworCWludCBhYmJyZXZfbGVuLCBvbmVsaW5lX2xlbjsKKworCWlmICghcCkKKwkJZGllICgiQ291bGQgbm90IHJlYWQgY29tbWl0IG1lc3NhZ2Ugb2YgJXMiLAorCQkJCXNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwl3aGlsZSAoKnAgJiYgKCpwICE9ICdcbicgfHwgcFsxXSAhPSAnXG4nKSkKKwkJcCsrOworCisJaWYgKCpwKSB7CisJCXAgKz0gMjsKKwkJZm9yIChlb2wgPSBwICsgMTsgKmVvbCAmJiAqZW9sICE9ICdcbic7IGVvbCsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisJfSBlbHNlCisJCWVvbCA9IHA7CisJYWJicmV2ID0gZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKTsKKwlhYmJyZXZfbGVuID0gc3RybGVuKGFiYnJldik7CisJb25lbGluZV9sZW4gPSBlb2wgLSBwOworCXJlc3VsdCA9IHhtYWxsb2MoYWJicmV2X2xlbiArIDUgKyBvbmVsaW5lX2xlbik7CisJbWVtY3B5KHJlc3VsdCwgYWJicmV2LCBhYmJyZXZfbGVuKTsKKwltZW1jcHkocmVzdWx0ICsgYWJicmV2X2xlbiwgIi4uLiAiLCA0KTsKKwltZW1jcHkocmVzdWx0ICsgYWJicmV2X2xlbiArIDQsIHAsIG9uZWxpbmVfbGVuKTsKKwlyZXN1bHRbYWJicmV2X2xlbiArIDQgKyBvbmVsaW5lX2xlbl0gPSAnXDAnOworCXJldHVybiByZXN1bHQ7Cit9CisKK2NoYXIgKmdldF9lbmNvZGluZyhjb25zdCBjaGFyICptZXNzYWdlKQoreworCWNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlLCAqZW9sOworCisJaWYgKCFwKQorCQlkaWUgKCJDb3VsZCBub3QgcmVhZCBjb21taXQgbWVzc2FnZSBvZiAlcyIsCisJCQkJc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCXdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKSB7CisJCWZvciAoZW9sID0gcCArIDE7ICplb2wgJiYgKmVvbCAhPSAnXG4nOyBlb2wrKykKKwkJCTsgLyogZG8gbm90aGluZyAqLworCQlpZiAoIXByZWZpeGNtcChwLCAiZW5jb2RpbmcgIikpIHsKKwkJCWNoYXIgKnJlc3VsdCA9IHhtYWxsb2MoZW9sIC0gOCAtIHApOworCQkJc3RybGNweShyZXN1bHQsIHAgKyA5LCBlb2wgLSA4IC0gcCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXAgPSBlb2w7CisJCWlmICgqcCA9PSAnXG4nKQorCQkJcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGxvY2tfZmlsZSBtc2dfZmlsZTsKK3N0YXRpYyBpbnQgbXNnX2ZkOworCitzdGF0aWMgdm9pZCBhZGRfdG9fbXNnKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cmluZyk7CisJaWYgKHdyaXRlX2luX2Z1bGwobXNnX2ZkLCBzdHJpbmcsIGxlbikgPCAwKQorCQlkaWUgKCJDb3VsZCBub3Qgd3JpdGUgdG8gTUVSR0VfTVNHIik7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tZXNzYWdlX3RvX21zZyhjb25zdCBjaGFyICptZXNzYWdlKQoreworCWNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlOworCXdoaWxlICgqcCAmJiAoKnAgIT0gJ1xuJyB8fCBwWzFdICE9ICdcbicpKQorCQlwKys7CisKKwlpZiAoISpwKQorCQlhZGRfdG9fbXNnKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKworCXAgKz0gMjsKKwlhZGRfdG9fbXNnKHApOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2V0X2F1dGhvcl9pZGVudF9lbnYoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwljb25zdCBjaGFyICpwID0gbWVzc2FnZTsKKwlpZiAoIXApCisJCWRpZSAoIkNvdWxkIG5vdCByZWFkIGNvbW1pdCBtZXNzYWdlIG9mICVzIiwKKwkJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJd2hpbGUgKCpwICYmICpwICE9ICdcbicpIHsKKwkJY29uc3QgY2hhciAqZW9sOworCisJCWZvciAoZW9sID0gcDsgKmVvbCAmJiAqZW9sICE9ICdcbic7IGVvbCsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisJCWlmICghcHJlZml4Y21wKHAsICJhdXRob3IgIikpIHsKKwkJCWNoYXIgKmxpbmUsICpwZW5kLCAqZW1haWwsICp0aW1lc3RhbXA7CisKKwkJCXAgKz0gNzsKKwkJCWxpbmUgPSB4bWFsbG9jKGVvbCArIDEgLSBwKTsKKwkJCW1lbWNweShsaW5lLCBwLCBlb2wgLSBwKTsKKwkJCWxpbmVbZW9sIC0gcF0gPSAnXDAnOworCQkJZW1haWwgPSBzdHJjaHIobGluZSwgJzwnKTsKKwkJCWlmICghZW1haWwpCisJCQkJZGllICgiQ291bGQgbm90IGV4dHJhY3QgYXV0aG9yIGVtYWlsIGZyb20gJXMiLAorCQkJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCQlpZiAoZW1haWwgPT0gbGluZSkKKwkJCQlwZW5kID0gbGluZTsKKwkJCWVsc2UKKwkJCQlmb3IgKHBlbmQgPSBlbWFpbDsgcGVuZCAhPSBsaW5lICsgMSAmJgorCQkJCQkJaXNzcGFjZShwZW5kWy0xXSk7IHBlbmQtLSk7CisJCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJKnBlbmQgPSAnXDAnOworCQkJZW1haWwrKzsKKwkJCXRpbWVzdGFtcCA9IHN0cmNocihlbWFpbCwgJz4nKTsKKwkJCWlmICghdGltZXN0YW1wKQorCQkJCWRpZSAoIkNvdWxkIG5vdCBleHRyYWN0IGF1dGhvciBlbWFpbCBmcm9tICVzIiwKKwkJCQkJc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQkJKnRpbWVzdGFtcCA9ICdcMCc7CisJCQlmb3IgKHRpbWVzdGFtcCsrOyAqdGltZXN0YW1wICYmIGlzc3BhY2UoKnRpbWVzdGFtcCk7CisJCQkJCXRpbWVzdGFtcCsrKQorCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJc2V0ZW52KCJHSVRfQVVUSE9SX05BTUUiLCBsaW5lLCAxKTsKKwkJCXNldGVudigiR0lUX0FVVEhPUl9FTUFJTCIsIGVtYWlsLCAxKTsKKwkJCXNldGVudigiR0lUX0FVVEhPUl9EQVRFIiwgdGltZXN0YW1wLCAxKTsKKwkJCWZyZWUobGluZSk7CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IGVvbDsKKwkJaWYgKCpwID09ICdcbicpCisJCQlwKys7CisJfQorCWRpZSAoIk5vIGF1dGhvciBpbmZvcm1hdGlvbiBmb3VuZCBpbiAlcyIsCisJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKmJhc2Vfc2hhMSwKKwkJY29uc3QgY2hhciAqaGVhZF9zaGExLCBjb25zdCBjaGFyICpoZWFkX25hbWUsCisJCWNvbnN0IGNoYXIgKm5leHRfc2hhMSwgY29uc3QgY2hhciAqbmV4dF9uYW1lKQoreworCWNoYXIgYnVmZmVyWzI1Nl07CisJY29uc3QgY2hhciAqYXJndls2XTsKKworCXNwcmludGYoYnVmZmVyLCAiR0lUSEVBRF8lcyIsIGhlYWRfc2hhMSk7CisJc2V0ZW52KGJ1ZmZlciwgaGVhZF9uYW1lLCAxKTsKKwlzcHJpbnRmKGJ1ZmZlciwgIkdJVEhFQURfJXMiLCBuZXh0X3NoYTEpOworCXNldGVudihidWZmZXIsIG5leHRfbmFtZSwgMSk7CisKKwkvKgorCSAqIFRoaXMgdGhyZWUgd2F5IG1lcmdlIGlzIGFuIGludGVyZXN0aW5nIG9uZS4gIFdlIGFyZSBhdAorCSAqICRoZWFkLCBhbmQgd291bGQgd2FudCB0byBhcHBseSB0aGUgY2hhbmdlIGJldHdlZW4gJGNvbW1pdAorCSAqIGFuZCAkcHJldiBvbiB0b3Agb2YgdXMgKHdoZW4gcmV2ZXJ0aW5nKSwgb3IgdGhlIGNoYW5nZSBiZXR3ZWVuCisJICogJHByZXYgYW5kICRjb21taXQgb24gdG9wIG9mIHVzICh3aGVuIGNoZXJyeS1waWNraW5nIG9yIHJlcGxheWluZykuCisJICovCisJYXJndlswXSA9ICJtZXJnZS1yZWN1cnNpdmUiOworCWFyZ3ZbMV0gPSBiYXNlX3NoYTE7CisJYXJndlsyXSA9ICItLSI7CisJYXJndlszXSA9IGhlYWRfc2hhMTsKKwlhcmd2WzRdID0gbmV4dF9zaGExOworCWFyZ3ZbNV0gPSBOVUxMOworCisJcmV0dXJuIHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3YsIFJVTl9DT01NQU5EX05PX1NURElOIHwgUlVOX0dJVF9DTUQpOworfQorCitzdGF0aWMgaW50IHJldmVydF9vcl9jaGVycnlfcGljayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY2hhciBoZWFkWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpiYXNlLCAqbmV4dDsKKwlpbnQgaTsKKwljaGFyICpvbmVsaW5lLCAqcmVlbmNvZGVkX21lc3NhZ2UgPSBOVUxMOworCWNvbnN0IGNoYXIgKm1lc3NhZ2UsICplbmNvZGluZzsKKwljb25zdCBjaGFyICpkZWZtc2cgPSB4c3RyZHVwKGdpdF9wYXRoKCJNRVJHRV9NU0ciKSk7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJbWUgPSBhY3Rpb24gPT0gUkVWRVJUID8gInJldmVydCIgOiAiY2hlcnJ5LXBpY2siOworCXNldGVudihHSVRfUkVGTE9HX0FDVElPTiwgbWUsIDApOworCXBhcnNlX29wdGlvbnMoYXJnYywgYXJndik7CisKKwkvKiB0aGlzIGlzIGNvcGllZCBmcm9tIHRoZSBzaGVsbCBzY3JpcHQsIGJ1dCBpdCdzIG5ldmVyIHRyaWdnZXJlZC4uLiAqLworCWlmIChhY3Rpb24gPT0gUkVWRVJUICYmIHJlcGxheSkKKwkJZGllKCJyZXZlcnQgaXMgaW5jb21wYXRpYmxlIHdpdGggcmVwbGF5Iik7CisKKwlpZiAobm9fY29tbWl0KSB7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBpbnRlbmQgdG8gY29tbWl0IGltbWVkaWF0ZWx5LiAgV2UganVzdCB3YW50IHRvCisJCSAqIG1lcmdlIHRoZSBkaWZmZXJlbmNlcyBpbi4KKwkJICovCisJCWlmICh3cml0ZV90cmVlKGhlYWQsIDAsIE5VTEwpKQorCQkJZGllICgiWW91ciBpbmRleCBmaWxlIGlzIHVubWVyZ2VkLiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCB3dF9zdGF0dXMgczsKKworCQlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBoZWFkKSkKKwkJCWRpZSAoIllvdSBkbyBub3QgaGF2ZSBhIHZhbGlkIEhFQUQiKTsKKwkJd3Rfc3RhdHVzX3ByZXBhcmUoJnMpOworCQlpZiAocy5jb21taXRhYmxlIHx8IHMud29ya2Rpcl9kaXJ0eSkKKwkJCWRpZSAoIkRpcnR5IGluZGV4OiBjYW5ub3QgJXMiLCBtZSk7CisJCWRpc2NhcmRfY2FjaGUoKTsKKwl9CisKKwlpZiAoIWNvbW1pdC0+cGFyZW50cykKKwkJZGllICgiQ2Fubm90ICVzIGEgcm9vdCBjb21taXQiLCBtZSk7CisJaWYgKGNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJZGllICgiQ2Fubm90ICVzIGEgbXVsdGktcGFyZW50IGNvbW1pdC4iLCBtZSk7CisJaWYgKCEobWVzc2FnZSA9IGNvbW1pdC0+YnVmZmVyKSkKKwkJZGllICgiQ2Fubm90IGdldCBjb21taXQgbWVzc2FnZSBmb3IgJXMiLAorCQkJCXNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKworCS8qCisJICogImNvbW1pdCIgaXMgYW4gZXhpc3RpbmcgY29tbWl0LiAgV2Ugd291bGQgd2FudCB0byBhcHBseQorCSAqIHRoZSBkaWZmZXJlbmNlIGl0IGludHJvZHVjZXMgc2luY2UgaXRzIGZpcnN0IHBhcmVudCAicHJldiIKKwkgKiBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgSEVBRCBpZiB3ZSBhcmUgY2hlcnJ5LXBpY2suICBPciB0aGUKKwkgKiByZXZlcnNlIG9mIGl0IGlmIHdlIGFyZSByZXZlcnQuCisJICovCisKKwltc2dfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZtc2dfZmlsZSwgZGVmbXNnLCAxKTsKKworCWVuY29kaW5nID0gZ2V0X2VuY29kaW5nKG1lc3NhZ2UpOworCWlmICghZW5jb2RpbmcpCisJCWVuY29kaW5nID0gInV0Zi04IjsKKwlpZiAoIWdpdF9jb21taXRfZW5jb2RpbmcpCisJCWdpdF9jb21taXRfZW5jb2RpbmcgPSAidXRmLTgiOworCWlmICgocmVlbmNvZGVkX21lc3NhZ2UgPSByZWVuY29kZV9zdHJpbmcobWVzc2FnZSwKKwkJCQkJZ2l0X2NvbW1pdF9lbmNvZGluZywgZW5jb2RpbmcpKSkKKwkJbWVzc2FnZSA9IHJlZW5jb2RlZF9tZXNzYWdlOworCisJb25lbGluZSA9IGdldF9vbmVsaW5lKG1lc3NhZ2UpOworCisJaWYgKGFjdGlvbiA9PSBSRVZFUlQpIHsKKwkJY2hhciAqb25lbGluZV9ib2R5ID0gc3RyY2hyKG9uZWxpbmUsICcgJyk7CisKKwkJYmFzZSA9IGNvbW1pdDsKKwkJbmV4dCA9IGNvbW1pdC0+cGFyZW50cy0+aXRlbTsKKwkJYWRkX3RvX21zZygiUmV2ZXJ0IFwiIik7CisJCWFkZF90b19tc2cob25lbGluZV9ib2R5ICsgMSk7CisJCWFkZF90b19tc2coIlwiXG5cblRoaXMgcmV2ZXJ0cyBjb21taXQgIik7CisJCWFkZF90b19tc2coc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQlhZGRfdG9fbXNnKCIuXG4iKTsKKwl9IGVsc2UgeworCQliYXNlID0gY29tbWl0LT5wYXJlbnRzLT5pdGVtOworCQluZXh0ID0gY29tbWl0OworCQlzZXRfYXV0aG9yX2lkZW50X2VudihtZXNzYWdlKTsKKwkJYWRkX21lc3NhZ2VfdG9fbXNnKG1lc3NhZ2UpOworCQlpZiAoIXJlcGxheSkgeworCQkJYWRkX3RvX21zZygiKGNoZXJyeSBwaWNrZWQgZnJvbSBjb21taXQgIik7CisJCQlhZGRfdG9fbXNnKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJCWFkZF90b19tc2coIilcbiIpOworCQl9CisJfQorCWlmIChuZWVkZWRfZGVyZWYpIHsKKwkJYWRkX3RvX21zZygiKG9yaWdpbmFsICdnaXQgIik7CisJCWFkZF90b19tc2cobWUpOworCQlhZGRfdG9fbXNnKCInIGFyZ3VtZW50czogIik7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJCWlmIChpKQorCQkJCWFkZF90b19tc2coIiAiKTsKKwkJCWFkZF90b19tc2coYXJndltpXSk7CisJCX0KKwkJYWRkX3RvX21zZygiKVxuIik7CisJfQorCisJaWYgKG1lcmdlX3JlY3Vyc2l2ZShzaGExX3RvX2hleChiYXNlLT5vYmplY3Quc2hhMSksCisJCQkJc2hhMV90b19oZXgoaGVhZCksICJIRUFEIiwKKwkJCQlzaGExX3RvX2hleChuZXh0LT5vYmplY3Quc2hhMSksIG9uZWxpbmUpIHx8CisJCQl3cml0ZV90cmVlKGhlYWQsIDAsIE5VTEwpKSB7CisJCWFkZF90b19tc2coIlxuQ29uZmxpY3RzOlxuXG4iKTsKKwkJcmVhZF9jYWNoZSgpOworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpKytdOworCQkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJCWFkZF90b19tc2coIlx0Iik7CisJCQkJYWRkX3RvX21zZyhjZS0+bmFtZSk7CisJCQkJYWRkX3RvX21zZygiXG4iKTsKKwkJCQl3aGlsZSAoaSA8IGFjdGl2ZV9uciAmJiAhc3RyY21wKGNlLT5uYW1lLAorCQkJCQkJYWN0aXZlX2NhY2hlW2ldLT5uYW1lKSkKKwkJCQkJaSsrOworCQkJfQorCQl9CisJCWlmIChjbG9zZShtc2dfZmQpIHx8IGNvbW1pdF9sb2NrX2ZpbGUoJm1zZ19maWxlKSA8IDApCisJCQlkaWUgKCJFcnJvciB3cmFwcGluZyB1cCAlcyIsIGRlZm1zZyk7CisJCWZwcmludGYoc3RkZXJyLCAiQXV0b21hdGljICVzIGZhaWxlZC4gICIKKwkJCSJBZnRlciByZXNvbHZpbmcgdGhlIGNvbmZsaWN0cyxcbiIKKwkJCSJtYXJrIHRoZSBjb3JyZWN0ZWQgcGF0aHMgd2l0aCAnZ2l0LWFkZCA8cGF0aHM+J1xuIgorCQkJImFuZCBjb21taXQgdGhlIHJlc3VsdC5cbiIsIG1lKTsKKwkJaWYgKGFjdGlvbiA9PSBDSEVSUllfUElDSykgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGVuIGNvbW1pdGluZywgdXNlIHRoZSBvcHRpb24gIgorCQkJCSInLWMgJXMnIHRvIHJldGFpbiBhdXRob3JzaGlwIGFuZCBtZXNzYWdlLlxuIiwKKwkJCQlmaW5kX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwKKwkJCQkJREVGQVVMVF9BQkJSRVYpKTsKKwkJfQorCQlleGl0KDEpOworCX0KKwlpZiAoY2xvc2UobXNnX2ZkKSB8fCBjb21taXRfbG9ja19maWxlKCZtc2dfZmlsZSkgPCAwKQorCQlkaWUgKCJFcnJvciB3cmFwcGluZyB1cCAlcyIsIGRlZm1zZyk7CisJZnByaW50ZihzdGRlcnIsICJGaW5pc2hlZCBvbmUgJXMuXG4iLCBtZSk7CisKKwkvKgorCSAqCisJICogSWYgd2UgYXJlIGNoZXJyeS1waWNrLCBhbmQgaWYgdGhlIG1lcmdlIGRpZCBub3QgcmVzdWx0IGluCisJICogaGFuZC1lZGl0aW5nLCB3ZSB3aWxsIGhpdCB0aGlzIGNvbW1pdCBhbmQgaW5oZXJpdCB0aGUgb3JpZ2luYWwKKwkgKiBhdXRob3IgZGF0ZSBhbmQgbmFtZS4KKwkgKiBJZiB3ZSBhcmUgcmV2ZXJ0LCBvciBpZiBvdXIgY2hlcnJ5LXBpY2sgcmVzdWx0cyBpbiBhIGhhbmQgbWVyZ2UsCisJICogd2UgaGFkIGJldHRlciBzYXkgdGhhdCB0aGUgY3VycmVudCB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0LgorCSAqLworCisJaWYgKCFub19jb21taXQpIHsKKwkJaWYgKGVkaXQpCisJCQlyZXR1cm4gZXhlY2xfZ2l0X2NtZCgiY29tbWl0IiwgIi1uIiwgTlVMTCk7CisJCWVsc2UKKwkJCXJldHVybiBleGVjbF9naXRfY21kKCJjb21taXQiLCAiLW4iLCAiLUYiLCBkZWZtc2csIE5VTEwpOworCX0KKwlpZiAocmVlbmNvZGVkX21lc3NhZ2UpCisJCWZyZWUocmVlbmNvZGVkX21lc3NhZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2ZXJ0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmIChpc2F0dHkoMCkpCisJCWVkaXQgPSAxOworCWFjdGlvbiA9IFJFVkVSVDsKKwlyZXR1cm4gcmV2ZXJ0X29yX2NoZXJyeV9waWNrKGFyZ2MsIGFyZ3YpOworfQorCitpbnQgY21kX2NoZXJyeV9waWNrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXJlcGxheSA9IDE7CisJYWN0aW9uID0gQ0hFUlJZX1BJQ0s7CisJcmV0dXJuIHJldmVydF9vcl9jaGVycnlfcGljayhhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcm0uYyBiL2J1aWx0aW4tcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBiZDkzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1ybS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogImdpdCBybSIgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcyAyMDA2CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fcm1fdXNhZ2VbXSA9CisiZ2l0LXJtIFstZl0gWy1uXSBbLXJdIFstLWNhY2hlZF0gWy0taWdub3JlLXVubWF0Y2hdIFstLXF1aWV0XSBbLS1dIDxmaWxlPi4uLiI7CisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBuciwgYWxsb2M7CisJY29uc3QgY2hhciAqKm5hbWU7Cit9IGxpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9saXN0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKGxpc3QubnIgPj0gbGlzdC5hbGxvYykgeworCQlsaXN0LmFsbG9jID0gYWxsb2NfbnIobGlzdC5hbGxvYyk7CisJCWxpc3QubmFtZSA9IHhyZWFsbG9jKGxpc3QubmFtZSwgbGlzdC5hbGxvYyAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKwl9CisJbGlzdC5uYW1lW2xpc3QubnIrK10gPSBuYW1lOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJldDsKKwljaGFyICpzbGFzaDsKKworCXJldCA9IHVubGluayhuYW1lKTsKKwlpZiAocmV0ICYmIGVycm5vID09IEVOT0VOVCkKKwkJLyogVGhlIHVzZXIgaGFzIHJlbW92ZWQgaXQgZnJvbSB0aGUgZmlsZXN5c3RlbSBieSBoYW5kICovCisJCXJldCA9IGVycm5vID0gMDsKKworCWlmICghcmV0ICYmIChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJY2hhciAqbiA9IHhzdHJkdXAobmFtZSk7CisJCWRvIHsKKwkJCW5bc2xhc2ggLSBuYW1lXSA9IDA7CisJCQluYW1lID0gbjsKKwkJfSB3aGlsZSAoIXJtZGlyKG5hbWUpICYmIChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoZWNrX2xvY2FsX21vZCh1bnNpZ25lZCBjaGFyICpoZWFkKQoreworCS8qIGl0ZW1zIGluIGxpc3QgYXJlIGFscmVhZHkgc29ydGVkIGluIHRoZSBjYWNoZSBvcmRlciwKKwkgKiBzbyB3ZSBjb3VsZCBkbyB0aGlzIGEgbG90IG1vcmUgZWZmaWNpZW50bHkgYnkgdXNpbmcKKwkgKiB0cmVlX2Rlc2MgYmFzZWQgdHJhdmVyc2FsIGlmIHdlIHdhbnRlZCB0bywgYnV0IEkgYW0KKwkgKiBsYXp5LCBhbmQgd2hvIGNhcmVzIGlmIHJlbW92YWwgb2YgZmlsZXMgaXMgYSB0YWQKKwkgKiBzbG93ZXIgdGhhbiB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBzcGVlZD8KKwkgKi8KKwlpbnQgaSwgbm9faGVhZDsKKwlpbnQgZXJycyA9IDA7CisKKwlub19oZWFkID0gaXNfbnVsbF9zaGExKGhlYWQpOworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCBwb3M7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBsaXN0Lm5hbWVbaV07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCXVuc2lnbmVkIG1vZGU7CisKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgc3RybGVuKG5hbWUpKTsKKwkJaWYgKHBvcyA8IDApCisJCQljb250aW51ZTsgLyogcmVtb3ZpbmcgdW5tZXJnZWQgZW50cnkgKi8KKwkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKworCQlpZiAobHN0YXQoY2UtPm5hbWUsICZzdCkgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogJyVzJzogJXMiLAorCQkJCQljZS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCS8qIEl0IGFscmVhZHkgdmFuaXNoZWQgZnJvbSB0aGUgd29ya2luZyB0cmVlICovCisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQkvKiBpZiBhIGZpbGUgd2FzIHJlbW92ZWQgYW5kIGl0IGlzIG5vdyBhCisJCQkgKiBkaXJlY3RvcnksIHRoYXQgaXMgdGhlIHNhbWUgYXMgRU5PRU5UIGFzCisJCQkgKiBmYXIgYXMgZ2l0IGlzIGNvbmNlcm5lZDsgd2UgZG8gbm90IHRyYWNrCisJCQkgKiBkaXJlY3Rvcmllcy4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMCkpCisJCQllcnJzID0gZXJyb3IoIiclcycgaGFzIGxvY2FsIG1vZGlmaWNhdGlvbnMgIgorCQkJCSAgICAgIihoaW50OiB0cnkgLWYpIiwgY2UtPm5hbWUpOworCQlpZiAobm9faGVhZAorCQkgICAgIHx8IGdldF90cmVlX2VudHJ5KGhlYWQsIG5hbWUsIHNoYTEsICZtb2RlKQorCQkgICAgIHx8IGNlLT5jZV9tb2RlICE9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpCisJCSAgICAgfHwgaGFzaGNtcChjZS0+c2hhMSwgc2hhMSkpCisJCQllcnJzID0gZXJyb3IoIiclcycgaGFzIGNoYW5nZXMgc3RhZ2VkIGluIHRoZSBpbmRleCAiCisJCQkJICAgICAiKGhpbnQ6IHRyeSAtZikiLCBuYW1lKTsKKwl9CisJcmV0dXJuIGVycnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2tfZmlsZTsKKworaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQ7CisJaW50IHNob3dfb25seSA9IDAsIGZvcmNlID0gMCwgaW5kZXhfb25seSA9IDAsIHJlY3Vyc2l2ZSA9IDAsIHF1aWV0ID0gMDsKKwlpbnQgaWdub3JlX3VubWF0Y2ggPSAwOworCWNvbnN0IGNoYXIgKipwYXRoc3BlYzsKKwljaGFyICpzZWVuOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleCgmbG9ja19maWxlLCAxKTsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjIDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItbiIpKQorCQkJc2hvd19vbmx5ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKQorCQkJaW5kZXhfb25seSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSkKKwkJCWZvcmNlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItciIpKQorCQkJcmVjdXJzaXZlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXF1aWV0IikpCisJCQlxdWlldCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1pZ25vcmUtdW5tYXRjaCIpKQorCQkJaWdub3JlX3VubWF0Y2ggPSAxOworCQllbHNlCisJCQl1c2FnZShidWlsdGluX3JtX3VzYWdlKTsKKwl9CisJaWYgKGFyZ2MgPD0gaSkKKwkJdXNhZ2UoYnVpbHRpbl9ybV91c2FnZSk7CisKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKwlzZWVuID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBwYXRoc3BlY1tpXSA7IGkrKykKKwkJLyogbm90aGluZyAqLzsKKwlzZWVuID0geGNhbGxvYyhpLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIW1hdGNoX3BhdGhzcGVjKHBhdGhzcGVjLCBjZS0+bmFtZSwgY2VfbmFtZWxlbihjZSksIDAsIHNlZW4pKQorCQkJY29udGludWU7CisJCWFkZF9saXN0KGNlLT5uYW1lKTsKKwl9CisKKwlpZiAocGF0aHNwZWMpIHsKKwkJY29uc3QgY2hhciAqbWF0Y2g7CisJCWludCBzZWVuX2FueSA9IDA7CisJCWZvciAoaSA9IDA7IChtYXRjaCA9IHBhdGhzcGVjW2ldKSAhPSBOVUxMIDsgaSsrKSB7CisJCQlpZiAoIXNlZW5baV0pIHsKKwkJCQlpZiAoIWlnbm9yZV91bm1hdGNoKSB7CisJCQkJCWRpZSgicGF0aHNwZWMgJyVzJyBkaWQgbm90IG1hdGNoIGFueSBmaWxlcyIsCisJCQkJCSAgICBtYXRjaCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc2Vlbl9hbnkgPSAxOworCQkJfQorCQkJaWYgKCFyZWN1cnNpdmUgJiYgc2VlbltpXSA9PSBNQVRDSEVEX1JFQ1VSU0lWRUxZKQorCQkJCWRpZSgibm90IHJlbW92aW5nICclcycgcmVjdXJzaXZlbHkgd2l0aG91dCAtciIsCisJCQkJICAgICptYXRjaCA/IG1hdGNoIDogIi4iKTsKKwkJfQorCisJCWlmICghIHNlZW5fYW55KQorCQkJZXhpdCgwKTsKKwl9CisKKwkvKgorCSAqIElmIG5vdCBmb3JjZWQsIHRoZSBmaWxlLCB0aGUgaW5kZXggYW5kIHRoZSBIRUFEIChpZiBleGlzdHMpCisJICogbXVzdCBtYXRjaDsgYnV0IHRoZSBmaWxlIGNhbiBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgc2luY2UKKwkgKiB0aGlzIHNlcXVlbmNlIGlzIGEgbmF0dXJhbCAibm92aWNlIiB3YXk6CisJICoKKwkgKglybSBGOyBnaXQgcm0gRgorCSAqCisJICogRnVydGhlciwgaWYgSEVBRCBjb21taXQgZXhpc3RzLCAiZGlmZi1pbmRleCAtLWNhY2hlZCIgbXVzdAorCSAqIHJlcG9ydCBubyBjaGFuZ2VzIHVubGVzcyBmb3JjZWQuCisJICovCisJaWYgKCFmb3JjZSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBzaGExKSkKKwkJCWhhc2hjbHIoc2hhMSk7CisJCWlmIChjaGVja19sb2NhbF9tb2Qoc2hhMSkpCisJCQlleGl0KDEpOworCX0KKworCS8qCisJICogRmlyc3QgcmVtb3ZlIHRoZSBuYW1lcyBmcm9tIHRoZSBpbmRleDogd2Ugd29uJ3QgY29tbWl0CisJICogdGhlIGluZGV4IHVubGVzcyBhbGwgb2YgdGhlbSBzdWNjZWVkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IGxpc3QubmFtZVtpXTsKKwkJaWYgKCFxdWlldCkKKwkJCXByaW50Zigicm0gJyVzJ1xuIiwgcGF0aCk7CisKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCQlkaWUoImdpdC1ybTogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCQljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJfQorCisJaWYgKHNob3dfb25seSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZW4sIHVubGVzcyB3ZSB1c2VkICItLWNhY2hlZCIsIHJlbW92ZSB0aGUgZmlsZW5hbWVzIGZyb20KKwkgKiB0aGUgd29ya3NwYWNlLiBJZiB3ZSBmYWlsIHRvIHJlbW92ZSB0aGUgZmlyc3Qgb25lLCB3ZQorCSAqIGFib3J0IHRoZSAiZ2l0IHJtIiAoYnV0IG9uY2Ugd2UndmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQKKwkgKiBhbnkgZmlsZSBhdCBhbGwsIHdlJ2xsIGdvIGFoZWFkIGFuZCBjb21taXQgdG8gaXQgYWxsOgorCSAqIGJ5IHRoZW4gd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb3Vyc2VsdmVzIGFuZCBjYW4ndCBmYWlsCisJICogaW4gdGhlIG1pZGRsZSkKKwkgKi8KKwlpZiAoIWluZGV4X29ubHkpIHsKKwkJaW50IHJlbW92ZWQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC5ucjsgaSsrKSB7CisJCQljb25zdCBjaGFyICpwYXRoID0gbGlzdC5uYW1lW2ldOworCQkJaWYgKCFyZW1vdmVfZmlsZShwYXRoKSkgeworCQkJCXJlbW92ZWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFyZW1vdmVkKQorCQkJCWRpZSgiZ2l0LXJtOiAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJfQorCisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjbG9zZShuZXdmZCkgfHwgY29tbWl0X2xvY2tlZF9pbmRleCgmbG9ja19maWxlKSkKKwkJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJ1bnN0YXR1cy5jIGIvYnVpbHRpbi1ydW5zdGF0dXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ4OWIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1ydW5zdGF0dXMuYwpAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ3dC1zdGF0dXMuaCIKKworZXh0ZXJuIGludCB3dF9zdGF0dXNfdXNlX2NvbG9yOworCitzdGF0aWMgY29uc3QgY2hhciBydW5zdGF0dXNfdXNhZ2VbXSA9CisiZ2l0LXJ1bnN0YXR1cyBbLS1jb2xvcnwtLW5vY29sb3JdIFstLWFtZW5kXSBbLS12ZXJib3NlXSBbLS11bnRyYWNrZWRdIjsKKworaW50IGNtZF9ydW5zdGF0dXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHd0X3N0YXR1cyBzOworCWludCBpOworCisJZ2l0X2NvbmZpZyhnaXRfc3RhdHVzX2NvbmZpZyk7CisJd3Rfc3RhdHVzX3ByZXBhcmUoJnMpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1jb2xvciIpKQorCQkJd3Rfc3RhdHVzX3VzZV9jb2xvciA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tbm9jb2xvciIpKQorCQkJd3Rfc3RhdHVzX3VzZV9jb2xvciA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tYW1lbmQiKSkgeworCQkJcy5hbWVuZCA9IDE7CisJCQlzLnJlZmVyZW5jZSA9ICJIRUFEXjEiOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tdmVyYm9zZSIpKQorCQkJcy52ZXJib3NlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS11bnRyYWNrZWQiKSkKKwkJCXMudW50cmFja2VkID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UocnVuc3RhdHVzX3VzYWdlKTsKKwl9CisKKwl3dF9zdGF0dXNfcHJpbnQoJnMpOworCXJldHVybiBzLmNvbW1pdGFibGUgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tc2hvcnRsb2cuYyBiL2J1aWx0aW4tc2hvcnRsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNmNzQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zaG9ydGxvZy5jCkBAIC0wLDAgKzEsMzM0IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAidXRmOC5oIgorI2luY2x1ZGUgIm1haWxtYXAuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRsb2dfdXNhZ2VbXSA9CisiZ2l0LXNob3J0bG9nIFstbl0gWy1zXSBbPGNvbW1pdC1pZD4uLi4gXSI7CisKK3N0YXRpYyBjaGFyICpjb21tb25fcmVwb19wcmVmaXg7CisKK3N0YXRpYyBpbnQgY29tcGFyZV9ieV9udW1iZXIoY29uc3Qgdm9pZCAqYTEsIGNvbnN0IHZvaWQgKmEyKQoreworCWNvbnN0IHN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaTEgPSBhMSwgKmkyID0gYTI7CisJY29uc3Qgc3RydWN0IHBhdGhfbGlzdCAqbDEgPSBpMS0+dXRpbCwgKmwyID0gaTItPnV0aWw7CisKKwlpZiAobDEtPm5yIDwgbDItPm5yKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChsMS0+bnIgPT0gbDItPm5yKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBwYXRoX2xpc3QgbWFpbG1hcCA9IHtOVUxMLCAwLCAwLCAwfTsKKworc3RhdGljIHZvaWQgaW5zZXJ0X2F1dGhvcl9vbmVsaW5lKHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsCisJCWNvbnN0IGNoYXIgKmF1dGhvciwgaW50IGF1dGhvcmxlbiwKKwkJY29uc3QgY2hhciAqb25lbGluZSwgaW50IG9uZWxpbmVsZW4pCit7CisJY29uc3QgY2hhciAqZG90MyA9IGNvbW1vbl9yZXBvX3ByZWZpeDsKKwljaGFyICpidWZmZXIsICpwOworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgcGF0aF9saXN0ICpvbmVsaW5lczsKKworCXdoaWxlIChhdXRob3JsZW4gPiAwICYmIGlzc3BhY2UoYXV0aG9yW2F1dGhvcmxlbiAtIDFdKSkKKwkJYXV0aG9ybGVuLS07CisKKwlidWZmZXIgPSB4bWFsbG9jKGF1dGhvcmxlbiArIDEpOworCW1lbWNweShidWZmZXIsIGF1dGhvciwgYXV0aG9ybGVuKTsKKwlidWZmZXJbYXV0aG9ybGVuXSA9ICdcMCc7CisKKwlpdGVtID0gcGF0aF9saXN0X2luc2VydChidWZmZXIsIGxpc3QpOworCWlmIChpdGVtLT51dGlsID09IE5VTEwpCisJCWl0ZW0tPnV0aWwgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0KSk7CisJZWxzZQorCQlmcmVlKGJ1ZmZlcik7CisKKwlpZiAoIXByZWZpeGNtcChvbmVsaW5lLCAiW1BBVENIIikpIHsKKwkJY2hhciAqZW9iID0gc3RyY2hyKG9uZWxpbmUsICddJyk7CisKKwkJaWYgKGVvYikgeworCQkJd2hpbGUgKGlzc3BhY2UoZW9iWzFdKSAmJiBlb2JbMV0gIT0gJ1xuJykKKwkJCQllb2IrKzsKKwkJCWlmIChlb2IgLSBvbmVsaW5lIDwgb25lbGluZWxlbikgeworCQkJCW9uZWxpbmVsZW4gLT0gZW9iIC0gb25lbGluZTsKKwkJCQlvbmVsaW5lID0gZW9iOworCQkJfQorCQl9CisJfQorCisJd2hpbGUgKG9uZWxpbmVsZW4gPiAwICYmIGlzc3BhY2Uob25lbGluZVswXSkpIHsKKwkJb25lbGluZSsrOworCQlvbmVsaW5lbGVuLS07CisJfQorCisJd2hpbGUgKG9uZWxpbmVsZW4gPiAwICYmIGlzc3BhY2Uob25lbGluZVtvbmVsaW5lbGVuIC0gMV0pKQorCQlvbmVsaW5lbGVuLS07CisKKwlidWZmZXIgPSB4bWFsbG9jKG9uZWxpbmVsZW4gKyAxKTsKKwltZW1jcHkoYnVmZmVyLCBvbmVsaW5lLCBvbmVsaW5lbGVuKTsKKwlidWZmZXJbb25lbGluZWxlbl0gPSAnXDAnOworCisJaWYgKGRvdDMpIHsKKwkJaW50IGRvdDNsZW4gPSBzdHJsZW4oZG90Myk7CisJCWlmIChkb3QzbGVuID4gNSkgeworCQkJd2hpbGUgKChwID0gc3Ryc3RyKGJ1ZmZlciwgZG90MykpICE9IE5VTEwpIHsKKwkJCQlpbnQgdGFpbGxlbiA9IHN0cmxlbihwKSAtIGRvdDNsZW47CisJCQkJbWVtY3B5KHAsICIvLi4uLyIsIDUpOworCQkJCW1lbW1vdmUocCArIDUsIHAgKyBkb3QzbGVuLCB0YWlsbGVuICsgMSk7CisJCQl9CisJCX0KKwl9CisKKwlvbmVsaW5lcyA9IGl0ZW0tPnV0aWw7CisJaWYgKG9uZWxpbmVzLT5uciA+PSBvbmVsaW5lcy0+YWxsb2MpIHsKKwkJb25lbGluZXMtPmFsbG9jID0gYWxsb2NfbnIob25lbGluZXMtPm5yKTsKKwkJb25lbGluZXMtPml0ZW1zID0geHJlYWxsb2Mob25lbGluZXMtPml0ZW1zLAorCQkJCW9uZWxpbmVzLT5hbGxvYworCQkJCSogc2l6ZW9mKHN0cnVjdCBwYXRoX2xpc3RfaXRlbSkpOworCX0KKworCW9uZWxpbmVzLT5pdGVtc1tvbmVsaW5lcy0+bnJdLnV0aWwgPSBOVUxMOworCW9uZWxpbmVzLT5pdGVtc1tvbmVsaW5lcy0+bnIrK10ucGF0aCA9IGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgcmVhZF9mcm9tX3N0ZGluKHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJY2hhciBidWZmZXJbMTAyNF07CisKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RkaW4pICE9IE5VTEwpIHsKKwkJY2hhciAqYm9iOworCQlpZiAoKGJ1ZmZlclswXSA9PSAnQScgfHwgYnVmZmVyWzBdID09ICdhJykgJiYKKwkJCQkhcHJlZml4Y21wKGJ1ZmZlciArIDEsICJ1dGhvcjogIikgJiYKKwkJCQkoYm9iID0gc3RyY2hyKGJ1ZmZlciArIDcsICc8JykpICE9IE5VTEwpIHsKKwkJCWNoYXIgYnVmZmVyMlsxMDI0XSwgb2Zmc2V0ID0gMDsKKworCQkJaWYgKG1hcF9lbWFpbCgmbWFpbG1hcCwgYm9iICsgMSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisJCQkJYm9iID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CisJCQllbHNlIHsKKwkJCQlvZmZzZXQgPSA4OworCQkJCXdoaWxlIChidWZmZXIgKyBvZmZzZXQgPCBib2IgJiYKKwkJCQkgICAgICAgaXNzcGFjZShib2JbLTFdKSkKKwkJCQkJYm9iLS07CisJCQl9CisKKwkJCXdoaWxlIChmZ2V0cyhidWZmZXIyLCBzaXplb2YoYnVmZmVyMiksIHN0ZGluKSAmJgorCQkJCQlidWZmZXIyWzBdICE9ICdcbicpCisJCQkJOyAvKiBjaG9tcCBpbnB1dCAqLworCQkJaWYgKGZnZXRzKGJ1ZmZlcjIsIHNpemVvZihidWZmZXIyKSwgc3RkaW4pKSB7CisJCQkJaW50IGwyID0gc3RybGVuKGJ1ZmZlcjIpOworCQkJCWludCBpOworCQkJCWZvciAoaSA9IDA7IGkgPCBsMjsgaSsrKQorCQkJCQlpZiAoIWlzc3BhY2UoYnVmZmVyMltpXSkpCisJCQkJCQlicmVhazsKKwkJCQlpbnNlcnRfYXV0aG9yX29uZWxpbmUobGlzdCwKKwkJCQkJCWJ1ZmZlciArIG9mZnNldCwKKwkJCQkJCWJvYiAtIGJ1ZmZlciAtIG9mZnNldCwKKwkJCQkJCWJ1ZmZlcjIgKyBpLCBsMiAtIGkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfZnJvbV9yZXYoc3RydWN0IHJldl9pbmZvICpyZXYsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJY2hhciBzY3JhdGNoWzEwMjRdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCXByZXBhcmVfcmV2aXNpb25fd2FsayhyZXYpOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldikpICE9IE5VTEwpIHsKKwkJY29uc3QgY2hhciAqYXV0aG9yID0gTlVMTCwgKm9uZWxpbmUsICpidWZmZXI7CisJCWludCBhdXRob3JsZW4gPSBhdXRob3JsZW4sIG9uZWxpbmVsZW47CisKKwkJLyogZ2V0IGF1dGhvciBhbmQgb25lbGluZSAqLworCQlmb3IgKGJ1ZmZlciA9IGNvbW1pdC0+YnVmZmVyOyBidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXDAnICYmCisJCQkJKmJ1ZmZlciAhPSAnXG4nOyApIHsKKwkJCWNvbnN0IGNoYXIgKmVvbCA9IHN0cmNocihidWZmZXIsICdcbicpOworCisJCQlpZiAoZW9sID09IE5VTEwpCisJCQkJZW9sID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CisJCQllbHNlCisJCQkJZW9sKys7CisKKwkJCWlmICghcHJlZml4Y21wKGJ1ZmZlciwgImF1dGhvciAiKSkgeworCQkJCWNoYXIgKmJyYWNrZXQgPSBzdHJjaHIoYnVmZmVyLCAnPCcpOworCisJCQkJaWYgKGJyYWNrZXQgPT0gTlVMTCB8fCBicmFja2V0ID4gZW9sKQorCQkJCQlkaWUoIkludmFsaWQgY29tbWl0IGJ1ZmZlcjogJXMiLAorCQkJCQkgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJCQkJaWYgKG1hcF9lbWFpbCgmbWFpbG1hcCwgYnJhY2tldCArIDEsIHNjcmF0Y2gsCisJCQkJCQkJc2l6ZW9mKHNjcmF0Y2gpKSkgeworCQkJCQlhdXRob3IgPSBzY3JhdGNoOworCQkJCQlhdXRob3JsZW4gPSBzdHJsZW4oc2NyYXRjaCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGJyYWNrZXRbLTFdID09ICcgJykKKwkJCQkJCWJyYWNrZXQtLTsKKworCQkJCQlhdXRob3IgPSBidWZmZXIgKyA3OworCQkJCQlhdXRob3JsZW4gPSBicmFja2V0IC0gYnVmZmVyIC0gNzsKKwkJCQl9CisJCQl9CisJCQlidWZmZXIgPSBlb2w7CisJCX0KKworCQlpZiAoYXV0aG9yID09IE5VTEwpCisJCQlkaWUgKCJNaXNzaW5nIGF1dGhvcjogJXMiLAorCQkJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisKKwkJaWYgKGJ1ZmZlciA9PSBOVUxMIHx8ICpidWZmZXIgPT0gJ1wwJykgeworCQkJb25lbGluZSA9ICI8bm9uZT4iOworCQkJb25lbGluZWxlbiA9IHNpemVvZihvbmVsaW5lKSArIDE7CisJCX0gZWxzZSB7CisJCQljaGFyICplb2w7CisKKwkJCW9uZWxpbmUgPSBidWZmZXIgKyAxOworCQkJZW9sID0gc3RyY2hyKG9uZWxpbmUsICdcbicpOworCQkJaWYgKGVvbCA9PSBOVUxMKQorCQkJCW9uZWxpbmVsZW4gPSBzdHJsZW4ob25lbGluZSk7CisJCQllbHNlCisJCQkJb25lbGluZWxlbiA9IGVvbCAtIG9uZWxpbmU7CisJCX0KKworCQlpbnNlcnRfYXV0aG9yX29uZWxpbmUobGlzdCwKKwkJCQlhdXRob3IsIGF1dGhvcmxlbiwgb25lbGluZSwgb25lbGluZWxlbik7CisJfQorCit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdWludChjaGFyIGNvbnN0ICoqYXJnLCBpbnQgY29tbWEpCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwlpbnQgcmV0OworCWNoYXIgKmVuZHA7CisKKwl1bCA9IHN0cnRvdWwoKmFyZywgJmVuZHAsIDEwKTsKKwlpZiAoZW5kcCAhPSAqYXJnICYmICplbmRwICYmICplbmRwICE9IGNvbW1hKQorCQlyZXR1cm4gLTE7CisJcmV0ID0gKGludCkgdWw7CisJaWYgKHJldCAhPSB1bCkKKwkJcmV0dXJuIC0xOworCSphcmcgPSBlbmRwOworCWlmICgqKmFyZykKKwkJKCphcmcpKys7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgd3JhcF9hcmdfdXNhZ2VbXSA9ICItd1s8d2lkdGg+Wyw8aW5kZW50MT5bLDxpbmRlbnQyPl1dXSI7CisjZGVmaW5lIERFRkFVTFRfV1JBUExFTiA3NgorI2RlZmluZSBERUZBVUxUX0lOREVOVDEgNgorI2RlZmluZSBERUZBVUxUX0lOREVOVDIgOQorCitzdGF0aWMgdm9pZCBwYXJzZV93cmFwX2FyZ3MoY29uc3QgY2hhciAqYXJnLCBpbnQgKmluMSwgaW50ICppbjIsIGludCAqd3JhcCkKK3sKKwlhcmcgKz0gMjsgLyogc2tpcCAtdyAqLworCisJKndyYXAgPSBwYXJzZV91aW50KCZhcmcsICcsJyk7CisJaWYgKCp3cmFwIDwgMCkKKwkJZGllKHdyYXBfYXJnX3VzYWdlKTsKKwkqaW4xID0gcGFyc2VfdWludCgmYXJnLCAnLCcpOworCWlmICgqaW4xIDwgMCkKKwkJZGllKHdyYXBfYXJnX3VzYWdlKTsKKwkqaW4yID0gcGFyc2VfdWludCgmYXJnLCAnXDAnKTsKKwlpZiAoKmluMiA8IDApCisJCWRpZSh3cmFwX2FyZ191c2FnZSk7CisKKwlpZiAoISp3cmFwKQorCQkqd3JhcCA9IERFRkFVTFRfV1JBUExFTjsKKwlpZiAoISppbjEpCisJCSppbjEgPSBERUZBVUxUX0lOREVOVDE7CisJaWYgKCEqaW4yKQorCQkqaW4yID0gREVGQVVMVF9JTkRFTlQyOworCWlmICgqd3JhcCAmJgorCSAgICAoKCppbjEgJiYgKndyYXAgPD0gKmluMSkgfHwKKwkgICAgICgqaW4yICYmICp3cmFwIDw9ICppbjIpKSkKKwkJZGllKHdyYXBfYXJnX3VzYWdlKTsKK30KKworaW50IGNtZF9zaG9ydGxvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCXN0cnVjdCBwYXRoX2xpc3QgbGlzdCA9IHsgTlVMTCwgMCwgMCwgMSB9OworCWludCBpLCBqLCBzb3J0X2J5X251bWJlciA9IDAsIHN1bW1hcnkgPSAwOworCWludCB3cmFwX2xpbmVzID0gMDsKKwlpbnQgd3JhcCA9IERFRkFVTFRfV1JBUExFTjsKKwlpbnQgaW4xID0gREVGQVVMVF9JTkRFTlQxOworCWludCBpbjIgPSBERUZBVUxUX0lOREVOVDI7CisKKwkvKiBzaW5jZSAtbiBpcyBhIHNoYWRvd2VkIHJldiBhcmd1bWVudCwgcGFyc2Ugb3VyIGFyZ3MgZmlyc3QgKi8KKwl3aGlsZSAoYXJnYyA+IDEpIHsKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1uIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS1udW1iZXJlZCIpKQorCQkJc29ydF9ieV9udW1iZXIgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItcyIpIHx8CisJCQkJIXN0cmNtcChhcmd2WzFdLCAiLS1zdW1tYXJ5IikpCisJCQlzdW1tYXJ5ID0gMTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2WzFdLCAiLXciKSkgeworCQkJd3JhcF9saW5lcyA9IDE7CisJCQlwYXJzZV93cmFwX2FyZ3MoYXJndlsxXSwgJmluMSwgJmluMiwgJndyYXApOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpCisJCQl1c2FnZShzaG9ydGxvZ191c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwl9CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWlmIChhcmdjID4gMSkKKwkJZGllICgidW5yZWNvZ25pemVkIGFyZ3VtZW50OiAlcyIsIGFyZ3ZbMV0pOworCisJcmVhZF9tYWlsbWFwKCZtYWlsbWFwLCAiLm1haWxtYXAiLCAmY29tbW9uX3JlcG9fcHJlZml4KTsKKworCWlmIChyZXYucGVuZGluZy5uciA9PSAwKSB7CisJCWlmIChpc2F0dHkoMCkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIihyZWFkaW5nIGxvZyB0byBzdW1tYXJpemUgZnJvbSBzdGFuZGFyZCBpbnB1dClcbiIpOworCQlyZWFkX2Zyb21fc3RkaW4oJmxpc3QpOworCX0KKwllbHNlCisJCWdldF9mcm9tX3JldigmcmV2LCAmbGlzdCk7CisKKwlpZiAoc29ydF9ieV9udW1iZXIpCisJCXFzb3J0KGxpc3QuaXRlbXMsIGxpc3QubnIsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0pLAorCQkJY29tcGFyZV9ieV9udW1iZXIpOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0ICpvbmVsaW5lcyA9IGxpc3QuaXRlbXNbaV0udXRpbDsKKworCQlpZiAoc3VtbWFyeSkgeworCQkJcHJpbnRmKCIlczogJWRcbiIsIGxpc3QuaXRlbXNbaV0ucGF0aCwgb25lbGluZXMtPm5yKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXMgKCVkKTpcbiIsIGxpc3QuaXRlbXNbaV0ucGF0aCwgb25lbGluZXMtPm5yKTsKKwkJCWZvciAoaiA9IG9uZWxpbmVzLT5uciAtIDE7IGogPj0gMDsgai0tKSB7CisJCQkJY29uc3QgY2hhciAqbXNnID0gb25lbGluZXMtPml0ZW1zW2pdLnBhdGg7CisKKwkJCQlpZiAod3JhcF9saW5lcykgeworCQkJCQlpbnQgY29sID0gcHJpbnRfd3JhcHBlZF90ZXh0KG1zZywgaW4xLCBpbjIsIHdyYXApOworCQkJCQlpZiAoY29sICE9IHdyYXApCisJCQkJCQlwdXRjaGFyKCdcbicpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXByaW50ZigiICAgICAgJXNcbiIsIG1zZyk7CisJCQl9CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisKKwkJb25lbGluZXMtPnN0cmR1cF9wYXRocyA9IDE7CisJCXBhdGhfbGlzdF9jbGVhcihvbmVsaW5lcywgMSk7CisJCWZyZWUob25lbGluZXMpOworCQlsaXN0Lml0ZW1zW2ldLnV0aWwgPSBOVUxMOworCX0KKworCWxpc3Quc3RyZHVwX3BhdGhzID0gMTsKKwlwYXRoX2xpc3RfY2xlYXIoJmxpc3QsIDEpOworCW1haWxtYXAuc3RyZHVwX3BhdGhzID0gMTsKKwlwYXRoX2xpc3RfY2xlYXIoJm1haWxtYXAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2J1aWx0aW4tc2hvdy1icmFuY2guYyBiL2J1aWx0aW4tc2hvdy1icmFuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODkyZjFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zaG93LWJyYW5jaC5jCkBAIC0wLDAgKzEsOTE0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBzaG93X2JyYW5jaF91c2FnZVtdID0KKyJnaXQtc2hvdy1icmFuY2ggWy0tc3BhcnNlXSBbLS1jdXJyZW50XSBbLS1hbGxdIFstLXJlbW90ZXNdIFstLXRvcG8tb3JkZXJdIFstLW1vcmU9Y291bnQgfCAtLWxpc3QgfCAtLWluZGVwZW5kZW50IHwgLS1tZXJnZS1iYXNlIF0gWy0tdG9waWNzXSBbPHJlZnM+Li4uXSB8IC0tcmVmbG9nWz1uWyxiXV0gPGJyYW5jaD4iOworc3RhdGljIGNvbnN0IGNoYXIgc2hvd19icmFuY2hfdXNhZ2VfcmVmbG9nW10gPQorIi0tcmVmbG9nIGlzIGluY29tcGF0aWJsZSB3aXRoIC0tYWxsLCAtLXJlbW90ZXMsIC0taW5kZXBlbmRlbnQgb3IgLS1tZXJnZS1iYXNlIjsKKworc3RhdGljIGludCBkZWZhdWx0X251bTsKK3N0YXRpYyBpbnQgZGVmYXVsdF9hbGxvYzsKK3N0YXRpYyBjb25zdCBjaGFyICoqZGVmYXVsdF9hcmc7CisKKyNkZWZpbmUgVU5JTlRFUkVTVElORwkwMQorCisjZGVmaW5lIFJFVl9TSElGVAkgMgorI2RlZmluZSBNQVhfUkVWUwkoRkxBR19CSVRTIC0gUkVWX1NISUZUKSAvKiBzaG91bGQgbm90IGV4Y2VlZCBiaXRzX3Blcl9pbnQgLSBSRVZfU0hJRlQgKi8KKworI2RlZmluZSBERUZBVUxUX1JFRkxPRwk0CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICppbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpwb3Bfb25lX2NvbW1pdChzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlsaXN0ID0gKmxpc3RfcDsKKwljb21taXQgPSBsaXN0LT5pdGVtOworCSpsaXN0X3AgPSBsaXN0LT5uZXh0OworCWZyZWUobGlzdCk7CisJcmV0dXJuIGNvbW1pdDsKK30KKworc3RydWN0IGNvbW1pdF9uYW1lIHsKKwljb25zdCBjaGFyICpoZWFkX25hbWU7IC8qIHdoaWNoIGhlYWQncyBhbmNlc3Rvcj8gKi8KKwlpbnQgZ2VuZXJhdGlvbjsgLyogaG93IG1hbnkgcGFyZW50cyBhd2F5IGZyb20gaGVhZF9uYW1lICovCit9OworCisvKiBOYW1lIHRoZSBjb21taXQgYXMgbnRoIGdlbmVyYXRpb24gYW5jZXN0b3Igb2YgaGVhZF9uYW1lOworICogd2UgY291bnQgb25seSB0aGUgZmlyc3QtcGFyZW50IHJlbGF0aW9uc2hpcCBmb3IgbmFtaW5nIHB1cnBvc2VzLgorICovCitzdGF0aWMgdm9pZCBuYW1lX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGNvbnN0IGNoYXIgKmhlYWRfbmFtZSwgaW50IG50aCkKK3sKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKm5hbWU7CisJaWYgKCFjb21taXQtPnV0aWwpCisJCWNvbW1pdC0+dXRpbCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfbmFtZSkpOworCW5hbWUgPSBjb21taXQtPnV0aWw7CisJbmFtZS0+aGVhZF9uYW1lID0gaGVhZF9uYW1lOworCW5hbWUtPmdlbmVyYXRpb24gPSBudGg7Cit9CisKKy8qIFBhcmVudCBpcyB0aGUgZmlyc3QgcGFyZW50IG9mIHRoZSBjb21taXQuICBXZSBtYXkgbmFtZSBpdAorICogYXMgKG4rMSl0aCBnZW5lcmF0aW9uIGFuY2VzdG9yIG9mIHRoZSBzYW1lIGhlYWRfbmFtZSBhcworICogY29tbWl0IGlzIG50aCBnZW5lcmF0aW9uIGFuY2VzdG9yIG9mLCBpZiB0aGF0IGdlbmVyYXRpb24KKyAqIG51bWJlciBpcyBiZXR0ZXIgdGhhbiB0aGUgbmFtZSBpdCBhbHJlYWR5IGhhcy4KKyAqLworc3RhdGljIHZvaWQgbmFtZV9wYXJlbnQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgY29tbWl0ICpwYXJlbnQpCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICpjb21taXRfbmFtZSA9IGNvbW1pdC0+dXRpbDsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKnBhcmVudF9uYW1lID0gcGFyZW50LT51dGlsOworCWlmICghY29tbWl0X25hbWUpCisJCXJldHVybjsKKwlpZiAoIXBhcmVudF9uYW1lIHx8CisJICAgIGNvbW1pdF9uYW1lLT5nZW5lcmF0aW9uICsgMSA8IHBhcmVudF9uYW1lLT5nZW5lcmF0aW9uKQorCQluYW1lX2NvbW1pdChwYXJlbnQsIGNvbW1pdF9uYW1lLT5oZWFkX25hbWUsCisJCQkgICAgY29tbWl0X25hbWUtPmdlbmVyYXRpb24gKyAxKTsKK30KKworc3RhdGljIGludCBuYW1lX2ZpcnN0X3BhcmVudF9jaGFpbihzdHJ1Y3QgY29tbWl0ICpjKQoreworCWludCBpID0gMDsKKwl3aGlsZSAoYykgeworCQlzdHJ1Y3QgY29tbWl0ICpwOworCQlpZiAoIWMtPnV0aWwpCisJCQlicmVhazsKKwkJaWYgKCFjLT5wYXJlbnRzKQorCQkJYnJlYWs7CisJCXAgPSBjLT5wYXJlbnRzLT5pdGVtOworCQlpZiAoIXAtPnV0aWwpIHsKKwkJCW5hbWVfcGFyZW50KGMsIHApOworCQkJaSsrOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCQljID0gcDsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIG5hbWVfY29tbWl0cyhzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsCisJCQkgc3RydWN0IGNvbW1pdCAqKnJldiwKKwkJCSBjaGFyICoqcmVmX25hbWUsCisJCQkgaW50IG51bV9yZXYpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpjbDsKKwlzdHJ1Y3QgY29tbWl0ICpjOworCWludCBpOworCisJLyogRmlyc3QgZ2l2ZSBuYW1lcyB0byB0aGUgZ2l2ZW4gaGVhZHMgKi8KKwlmb3IgKGNsID0gbGlzdDsgY2w7IGNsID0gY2wtPm5leHQpIHsKKwkJYyA9IGNsLT5pdGVtOworCQlpZiAoYy0+dXRpbCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCQlpZiAocmV2W2ldID09IGMpIHsKKwkJCQluYW1lX2NvbW1pdChjLCByZWZfbmFtZVtpXSwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBUaGVuIGNvbW1pdHMgb24gdGhlIGZpcnN0IHBhcmVudCBhbmNlc3RyeSBjaGFpbiAqLworCWRvIHsKKwkJaSA9IDA7CisJCWZvciAoY2wgPSBsaXN0OyBjbDsgY2wgPSBjbC0+bmV4dCkgeworCQkJaSArPSBuYW1lX2ZpcnN0X3BhcmVudF9jaGFpbihjbC0+aXRlbSk7CisJCX0KKwl9IHdoaWxlIChpKTsKKworCS8qIEZpbmFsbHksIGFueSB1bm5hbWVkIGNvbW1pdHMgKi8KKwlkbyB7CisJCWkgPSAwOworCQlmb3IgKGNsID0gbGlzdDsgY2w7IGNsID0gY2wtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJCXN0cnVjdCBjb21taXRfbmFtZSAqbjsKKwkJCWludCBudGg7CisJCQljID0gY2wtPml0ZW07CisJCQlpZiAoIWMtPnV0aWwpCisJCQkJY29udGludWU7CisJCQluID0gYy0+dXRpbDsKKwkJCXBhcmVudHMgPSBjLT5wYXJlbnRzOworCQkJbnRoID0gMDsKKwkJCXdoaWxlIChwYXJlbnRzKSB7CisJCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQkJY2hhciBuZXduYW1lWzEwMDBdLCAqZW47CisJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQkJbnRoKys7CisJCQkJaWYgKHAtPnV0aWwpCisJCQkJCWNvbnRpbnVlOworCQkJCWVuID0gbmV3bmFtZTsKKwkJCQlzd2l0Y2ggKG4tPmdlbmVyYXRpb24pIHsKKwkJCQljYXNlIDA6CisJCQkJCWVuICs9IHNwcmludGYoZW4sICIlcyIsIG4tPmhlYWRfbmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIiVzXiIsIG4tPmhlYWRfbmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVuICs9IHNwcmludGYoZW4sICIlc34lZCIsCisJCQkJCQluLT5oZWFkX25hbWUsIG4tPmdlbmVyYXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG50aCA9PSAxKQorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiXiIpOworCQkJCWVsc2UKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIl4lZCIsIG50aCk7CisJCQkJbmFtZV9jb21taXQocCwgeHN0cmR1cChuZXduYW1lKSwgMCk7CisJCQkJaSsrOworCQkJCW5hbWVfZmlyc3RfcGFyZW50X2NoYWluKHApOworCQkJfQorCQl9CisJfSB3aGlsZSAoaSk7Cit9CisKK3N0YXRpYyBpbnQgbWFya19zZWVuKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdF9saXN0ICoqc2Vlbl9wKQoreworCWlmICghY29tbWl0LT5vYmplY3QuZmxhZ3MpIHsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgc2Vlbl9wKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqb2luX3JldnMoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wLAorCQkgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKipzZWVuX3AsCisJCSAgICAgIGludCBudW1fcmV2LCBpbnQgZXh0cmEpCit7CisJaW50IGFsbF9tYXNrID0gKCgxdSA8PCAoUkVWX1NISUZUICsgbnVtX3JldikpIC0gMSk7CisJaW50IGFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisKKwl3aGlsZSAoKmxpc3RfcCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBzdGlsbF9pbnRlcmVzdGluZyA9ICEhaW50ZXJlc3RpbmcoKmxpc3RfcCk7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBvcF9vbmVfY29tbWl0KGxpc3RfcCk7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgYWxsX21hc2s7CisKKwkJaWYgKCFzdGlsbF9pbnRlcmVzdGluZyAmJiBleHRyYSA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWFya19zZWVuKGNvbW1pdCwgc2Vlbl9wKTsKKwkJaWYgKChmbGFncyAmIGFsbF9yZXZzKSA9PSBhbGxfcmV2cykKKwkJCWZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJaW50IHRoaXNfZmxhZyA9IHAtPm9iamVjdC5mbGFnczsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKCh0aGlzX2ZsYWcgJiBmbGFncykgPT0gZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlpZiAoIXAtPm9iamVjdC5wYXJzZWQpCisJCQkJcGFyc2VfY29tbWl0KHApOworCQkJaWYgKG1hcmtfc2VlbihwLCBzZWVuX3ApICYmICFzdGlsbF9pbnRlcmVzdGluZykKKwkJCQlleHRyYS0tOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdF9wKTsKKwkJfQorCX0KKworCS8qCisJICogUG9zdHByb2Nlc3MgdG8gY29tcGxldGUgd2VsbC1wb2lzb25pbmcuCisJICoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWxsIHRoZSBjb21taXRzIHdlIGhhdmUgc2VlbiBpbgorCSAqIHNlZW5fcCBsaXN0LiAgTWFyayBhbnl0aGluZyB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20KKwkgKiB1bmludGVyZXN0aW5nIGNvbW1pdHMgbm90IGludGVyZXN0aW5nLgorCSAqLworCWZvciAoOzspIHsKKwkJaW50IGNoYW5nZWQgPSAwOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnM7CisJCWZvciAocyA9ICpzZWVuX3A7IHM7IHMgPSBzLT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjID0gcy0+aXRlbTsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCQkJaWYgKCgoYy0+b2JqZWN0LmZsYWdzICYgYWxsX3JldnMpICE9IGFsbF9yZXZzKSAmJgorCQkJICAgICEoYy0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRoZSBjdXJyZW50IGNvbW1pdCBpcyBlaXRoZXIgYSBtZXJnZSBiYXNlIG9yCisJCQkgKiBhbHJlYWR5IHVuaW50ZXJlc3Rpbmcgb25lLiAgTWFyayBpdHMgcGFyZW50cworCQkJICogYXMgdW5pbnRlcmVzdGluZyBjb21taXRzIF9vbmx5XyBpZiB0aGV5IGFyZQorCQkJICogYWxyZWFkeSBwYXJzZWQuICBObyByZWFzb24gdG8gZmluZCBuZXcgb25lcworCQkJICogaGVyZS4KKwkJCSAqLworCQkJcGFyZW50cyA9IGMtPnBhcmVudHM7CisJCQl3aGlsZSAocGFyZW50cykgeworCQkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJCWlmICghKHAtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKSB7CisJCQkJCXAtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJCQljaGFuZ2VkID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFjaGFuZ2VkKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X29uZV9jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbm9fbmFtZSkKK3sKKwljaGFyIHByZXR0eVsyNTZdLCAqY3A7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lID0gY29tbWl0LT51dGlsOworCWlmIChjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCXByZXR0eV9wcmludF9jb21taXQoQ01JVF9GTVRfT05FTElORSwgY29tbWl0LCB+MCwKKwkJCQkgICAgcHJldHR5LCBzaXplb2YocHJldHR5KSwgMCwgTlVMTCwgTlVMTCwgMCk7CisJZWxzZQorCQlzdHJjcHkocHJldHR5LCAiKHVuYXZhaWxhYmxlKSIpOworCWlmICghcHJlZml4Y21wKHByZXR0eSwgIltQQVRDSF0gIikpCisJCWNwID0gcHJldHR5ICsgODsKKwllbHNlCisJCWNwID0gcHJldHR5OworCisJaWYgKCFub19uYW1lKSB7CisJCWlmIChuYW1lICYmIG5hbWUtPmhlYWRfbmFtZSkgeworCQkJcHJpbnRmKCJbJXMiLCBuYW1lLT5oZWFkX25hbWUpOworCQkJaWYgKG5hbWUtPmdlbmVyYXRpb24pIHsKKwkJCQlpZiAobmFtZS0+Z2VuZXJhdGlvbiA9PSAxKQorCQkJCQlwcmludGYoIl4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigifiVkIiwgbmFtZS0+Z2VuZXJhdGlvbik7CisJCQl9CisJCQlwcmludGYoIl0gIik7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCJbJXNdICIsCisJCQkgICAgICAgZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIDcpKTsKKwl9CisJcHV0cyhjcCk7Cit9CisKK3N0YXRpYyBjaGFyICpyZWZfbmFtZVtNQVhfUkVWUyArIDFdOworc3RhdGljIGludCByZWZfbmFtZV9jbnQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2RpZ2l0X3ByZWZpeChjb25zdCBjaGFyICpzLCBpbnQgKnYpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgdmVyOworCWNoYXIgY2g7CisKKwlmb3IgKHAgPSBzLCB2ZXIgPSAwOworCSAgICAgJzAnIDw9IChjaCA9ICpwKSAmJiBjaCA8PSAnOSc7CisJICAgICBwKyspCisJCXZlciA9IHZlciAqIDEwICsgY2ggLSAnMCc7CisJKnYgPSB2ZXI7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGludCB2ZXJzaW9uX2NtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCXdoaWxlICgxKSB7CisJCWludCB2YSwgdmI7CisKKwkJYSA9IGZpbmRfZGlnaXRfcHJlZml4KGEsICZ2YSk7CisJCWIgPSBmaW5kX2RpZ2l0X3ByZWZpeChiLCAmdmIpOworCQlpZiAodmEgIT0gdmIpCisJCQlyZXR1cm4gdmEgLSB2YjsKKworCQl3aGlsZSAoMSkgeworCQkJaW50IGNhID0gKmE7CisJCQlpbnQgY2IgPSAqYjsKKwkJCWlmICgnMCcgPD0gY2EgJiYgY2EgPD0gJzknKQorCQkJCWNhID0gMDsKKwkJCWlmICgnMCcgPD0gY2IgJiYgY2IgPD0gJzknKQorCQkJCWNiID0gMDsKKwkJCWlmIChjYSAhPSBjYikKKwkJCQlyZXR1cm4gY2EgLSBjYjsKKwkJCWlmICghY2EpCisJCQkJYnJlYWs7CisJCQlhKys7CisJCQliKys7CisJCX0KKwkJaWYgKCEqYSAmJiAhKmIpCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9yZWZfbmFtZShjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJY29uc3QgY2hhciAqIGNvbnN0KmEgPSBhXywgKiBjb25zdCpiID0gYl87CisJcmV0dXJuIHZlcnNpb25fY21wKCphLCAqYik7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcmVmX3JhbmdlKGludCBib3R0b20sIGludCB0b3ApCit7CisJcXNvcnQocmVmX25hbWUgKyBib3R0b20sIHRvcCAtIGJvdHRvbSwgc2l6ZW9mKHJlZl9uYW1lWzBdKSwKKwkgICAgICBjb21wYXJlX3JlZl9uYW1lKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICAgIGludCBhbGxvd19kdXBzKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpbnQgaTsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKworCWlmICghYWxsb3dfZHVwcykgeworCQkvKiBBdm9pZCBhZGRpbmcgdGhlIHNhbWUgdGhpbmcgdHdpY2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IHJlZl9uYW1lX2NudDsgaSsrKQorCQkJaWYgKCFzdHJjbXAocmVmbmFtZSwgcmVmX25hbWVbaV0pKQorCQkJCXJldHVybiAwOworCX0KKwlpZiAoTUFYX1JFVlMgPD0gcmVmX25hbWVfY250KSB7CisJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogaWdub3JpbmcgJXM7ICIKKwkJCSJjYW5ub3QgaGFuZGxlIG1vcmUgdGhhbiAlZCByZWZzXG4iLAorCQkJcmVmbmFtZSwgTUFYX1JFVlMpOworCQlyZXR1cm4gMDsKKwl9CisJcmVmX25hbWVbcmVmX25hbWVfY250KytdID0geHN0cmR1cChyZWZuYW1lKTsKKwlyZWZfbmFtZVtyZWZfbmFtZV9jbnRdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBlbmRfaGVhZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJdW5zaWduZWQgY2hhciB0bXBbMjBdOworCWludCBvZnMgPSAxMTsKKwlpZiAocHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpKQorCQlyZXR1cm4gMDsKKwkvKiBJZiBib3RoIGhlYWRzL2ZvbyBhbmQgdGFncy9mb28gZXhpc3RzLCBnZXRfc2hhMSB3b3VsZAorCSAqIGdldCBjb25mdXNlZC4KKwkgKi8KKwlpZiAoZ2V0X3NoYTEocmVmbmFtZSArIG9mcywgdG1wKSB8fCBoYXNoY21wKHRtcCwgc2hhMSkpCisJCW9mcyA9IDU7CisJcmV0dXJuIGFwcGVuZF9yZWYocmVmbmFtZSArIG9mcywgc2hhMSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3JlbW90ZV9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJdW5zaWduZWQgY2hhciB0bXBbMjBdOworCWludCBvZnMgPSAxMzsKKwlpZiAocHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL3JlbW90ZXMvIikpCisJCXJldHVybiAwOworCS8qIElmIGJvdGggaGVhZHMvZm9vIGFuZCB0YWdzL2ZvbyBleGlzdHMsIGdldF9zaGExIHdvdWxkCisJICogZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmIChnZXRfc2hhMShyZWZuYW1lICsgb2ZzLCB0bXApIHx8IGhhc2hjbXAodG1wLCBzaGExKSkKKwkJb2ZzID0gNTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgb2ZzLCBzaGExLCAwKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfdGFnX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlpZiAocHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL3RhZ3MvIikpCisJCXJldHVybiAwOworCXJldHVybiBhcHBlbmRfcmVmKHJlZm5hbWUgKyA1LCBzaGExLCAwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1hdGNoX3JlZl9wYXR0ZXJuID0gTlVMTDsKK3N0YXRpYyBpbnQgbWF0Y2hfcmVmX3NsYXNoID0gMDsKK3N0YXRpYyBpbnQgY291bnRfc2xhc2goY29uc3QgY2hhciAqcykKK3sKKwlpbnQgY250ID0gMDsKKwl3aGlsZSAoKnMpCisJCWlmICgqcysrID09ICcvJykKKwkJCWNudCsrOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX21hdGNoaW5nX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwkvKiB3ZSB3YW50IHRvIGFsbG93IHBhdHRlcm4gaG9sZC88YXN0ZXJpc2s+IHRvIHNob3cgYWxsCisJICogYnJhbmNoZXMgdW5kZXIgcmVmcy9oZWFkcy9ob2xkLywgYW5kIHYwLjk5Ljk/IHRvIHNob3cKKwkgKiByZWZzL3RhZ3MvdjAuOTkuOWEgYW5kIGZyaWVuZHMuCisJICovCisJY29uc3QgY2hhciAqdGFpbDsKKwlpbnQgc2xhc2ggPSBjb3VudF9zbGFzaChyZWZuYW1lKTsKKwlmb3IgKHRhaWwgPSByZWZuYW1lOyAqdGFpbCAmJiBtYXRjaF9yZWZfc2xhc2ggPCBzbGFzaDsgKQorCQlpZiAoKnRhaWwrKyA9PSAnLycpCisJCQlzbGFzaC0tOworCWlmICghKnRhaWwpCisJCXJldHVybiAwOworCWlmIChmbm1hdGNoKG1hdGNoX3JlZl9wYXR0ZXJuLCB0YWlsLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvaGVhZHMvIikpCisJCXJldHVybiBhcHBlbmRfaGVhZF9yZWYocmVmbmFtZSwgc2hhMSwgZmxhZywgY2JfZGF0YSk7CisJaWYgKCFwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvdGFncy8iKSkKKwkJcmV0dXJuIGFwcGVuZF90YWdfcmVmKHJlZm5hbWUsIHNoYTEsIGZsYWcsIGNiX2RhdGEpOworCXJldHVybiBhcHBlbmRfcmVmKHJlZm5hbWUsIHNoYTEsIDApOworfQorCitzdGF0aWMgdm9pZCBzbmFyZl9yZWZzKGludCBoZWFkLCBpbnQgcmVtb3RlcykKK3sKKwlpZiAoaGVhZCkgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfaGVhZF9yZWYsIE5VTEwpOworCQlzb3J0X3JlZl9yYW5nZShvcmlnX2NudCwgcmVmX25hbWVfY250KTsKKwl9CisJaWYgKHJlbW90ZXMpIHsKKwkJaW50IG9yaWdfY250ID0gcmVmX25hbWVfY250OworCQlmb3JfZWFjaF9yZWYoYXBwZW5kX3JlbW90ZV9yZWYsIE5VTEwpOworCQlzb3J0X3JlZl9yYW5nZShvcmlnX2NudCwgcmVmX25hbWVfY250KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmV2X2lzX2hlYWQoY2hhciAqaGVhZCwgaW50IGhlYWRsZW4sIGNoYXIgKm5hbWUsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpoZWFkX3NoYTEsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKCghaGVhZFswXSkgfHwKKwkgICAgKGhlYWRfc2hhMSAmJiBzaGExICYmIGhhc2hjbXAoaGVhZF9zaGExLCBzaGExKSkpCisJCXJldHVybiAwOworCWlmICghcHJlZml4Y21wKGhlYWQsICJyZWZzL2hlYWRzLyIpKQorCQloZWFkICs9IDExOworCWlmICghcHJlZml4Y21wKG5hbWUsICJyZWZzL2hlYWRzLyIpKQorCQluYW1lICs9IDExOworCWVsc2UgaWYgKCFwcmVmaXhjbXAobmFtZSwgImhlYWRzLyIpKQorCQluYW1lICs9IDY7CisJcmV0dXJuICFzdHJjbXAoaGVhZCwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19tZXJnZV9iYXNlKHN0cnVjdCBjb21taXRfbGlzdCAqc2VlbiwgaW50IG51bV9yZXYpCit7CisJaW50IGFsbF9tYXNrID0gKCgxdSA8PCAoUkVWX1NISUZUICsgbnVtX3JldikpIC0gMSk7CisJaW50IGFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisJaW50IGV4aXRfc3RhdHVzID0gMTsKKworCXdoaWxlIChzZWVuKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBvcF9vbmVfY29tbWl0KCZzZWVuKTsKKwkJaW50IGZsYWdzID0gY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBhbGxfbWFzazsKKwkJaWYgKCEoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSAmJgorCQkgICAgKChmbGFncyAmIGFsbF9yZXZzKSA9PSBhbGxfcmV2cykpIHsKKwkJCXB1dHMoc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQkJZXhpdF9zdGF0dXMgPSAwOworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJfQorCX0KKwlyZXR1cm4gZXhpdF9zdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19pbmRlcGVuZGVudChzdHJ1Y3QgY29tbWl0ICoqcmV2LAorCQkJICAgIGludCBudW1fcmV2LAorCQkJICAgIGNoYXIgKipyZWZfbmFtZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnJldl9tYXNrKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSByZXZbaV07CisJCXVuc2lnbmVkIGludCBmbGFnID0gcmV2X21hc2tbaV07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzID09IGZsYWcpCisJCQlwdXRzKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9vbmVfcmV2KGNvbnN0IGNoYXIgKmF2KQoreworCXVuc2lnbmVkIGNoYXIgcmV2a2V5WzIwXTsKKwlpZiAoIWdldF9zaGExKGF2LCByZXZrZXkpKSB7CisJCWFwcGVuZF9yZWYoYXYsIHJldmtleSwgMCk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0cmNocihhdiwgJyonKSB8fCBzdHJjaHIoYXYsICc/JykgfHwgc3RyY2hyKGF2LCAnWycpKSB7CisJCS8qIGdsb2Igc3R5bGUgbWF0Y2ggKi8KKwkJaW50IHNhdmVkX21hdGNoZXMgPSByZWZfbmFtZV9jbnQ7CisJCW1hdGNoX3JlZl9wYXR0ZXJuID0gYXY7CisJCW1hdGNoX3JlZl9zbGFzaCA9IGNvdW50X3NsYXNoKGF2KTsKKwkJZm9yX2VhY2hfcmVmKGFwcGVuZF9tYXRjaGluZ19yZWYsIE5VTEwpOworCQlpZiAoc2F2ZWRfbWF0Y2hlcyA9PSByZWZfbmFtZV9jbnQgJiYKKwkJICAgIHJlZl9uYW1lX2NudCA8IE1BWF9SRVZTKQorCQkJZXJyb3IoIm5vIG1hdGNoaW5nIHJlZnMgd2l0aCAlcyIsIGF2KTsKKwkJaWYgKHNhdmVkX21hdGNoZXMgKyAxIDwgcmVmX25hbWVfY250KQorCQkJc29ydF9yZWZfcmFuZ2Uoc2F2ZWRfbWF0Y2hlcywgcmVmX25hbWVfY250KTsKKwkJcmV0dXJuOworCX0KKwlkaWUoImJhZCBzaGExIHJlZmVyZW5jZSAlcyIsIGF2KTsKK30KKworc3RhdGljIGludCBnaXRfc2hvd19icmFuY2hfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAic2hvd2JyYW5jaC5kZWZhdWx0IikpIHsKKwkJaWYgKGRlZmF1bHRfYWxsb2MgPD0gZGVmYXVsdF9udW0gKyAxKSB7CisJCQlkZWZhdWx0X2FsbG9jID0gZGVmYXVsdF9hbGxvYyAqIDMgLyAyICsgMjA7CisJCQlkZWZhdWx0X2FyZyA9IHhyZWFsbG9jKGRlZmF1bHRfYXJnLCBzaXplb2YgKmRlZmF1bHRfYXJnICogZGVmYXVsdF9hbGxvYyk7CisJCX0KKwkJZGVmYXVsdF9hcmdbZGVmYXVsdF9udW0rK10gPSB4c3RyZHVwKHZhbHVlKTsKKwkJZGVmYXVsdF9hcmdbZGVmYXVsdF9udW1dID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBvbWl0X2luX2RlbnNlKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqKnJldiwgaW50IG4pCit7CisJLyogSWYgdGhlIGNvbW1pdCBpcyB0aXAgb2YgdGhlIG5hbWVkIGJyYW5jaGVzLCBkbyBub3QKKwkgKiBvbWl0IGl0LgorCSAqIE90aGVyd2lzZSwgaWYgaXQgaXMgYSBtZXJnZSB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIG9ubHkgb25lCisJICogdGlwLCBpdCBpcyBub3QgdGhhdCBpbnRlcmVzdGluZy4KKwkgKi8KKwlpbnQgaSwgZmxhZywgY291bnQ7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJldltpXSA9PSBjb21taXQpCisJCQlyZXR1cm4gMDsKKwlmbGFnID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisJZm9yIChpID0gY291bnQgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWlmIChmbGFnICYgKDF1IDw8IChpICsgUkVWX1NISUZUKSkpCisJCQljb3VudCsrOworCX0KKwlpZiAoY291bnQgPT0gMSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3JlZmxvZ19wYXJhbShjb25zdCBjaGFyICphcmcsIGludCAqY250LCBjb25zdCBjaGFyICoqYmFzZSkKK3sKKwljaGFyICplcDsKKwkqY250ID0gc3RydG91bChhcmcsICZlcCwgMTApOworCWlmICgqZXAgPT0gJywnKQorCQkqYmFzZSA9IGVwICsgMTsKKwllbHNlIGlmICgqZXApCisJCWRpZSgidW5yZWNvZ25pemVkIHJlZmxvZyBwYXJhbSAnJXMnIiwgYXJnICsgOSk7CisJZWxzZQorCQkqYmFzZSA9IE5VTEw7CisJaWYgKCpjbnQgPD0gMCkKKwkJKmNudCA9IERFRkFVTFRfUkVGTE9HOworfQorCitpbnQgY21kX3Nob3dfYnJhbmNoKGludCBhYywgY29uc3QgY2hhciAqKmF2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGNvbW1pdCAqcmV2W01BWF9SRVZTXSwgKmNvbW1pdDsKKwljaGFyICpyZWZsb2dfbXNnW01BWF9SRVZTXTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSBOVUxMLCAqc2VlbiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHJldl9tYXNrW01BWF9SRVZTXTsKKwlpbnQgbnVtX3JldiwgaSwgZXh0cmEgPSAwOworCWludCBhbGxfaGVhZHMgPSAwLCBhbGxfcmVtb3RlcyA9IDA7CisJaW50IGFsbF9tYXNrLCBhbGxfcmV2czsKKwlpbnQgbGlmbyA9IDE7CisJY2hhciBoZWFkWzEyOF07CisJY29uc3QgY2hhciAqaGVhZF9wOworCWludCBoZWFkX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisJaW50IG1lcmdlX2Jhc2UgPSAwOworCWludCBpbmRlcGVuZGVudCA9IDA7CisJaW50IG5vX25hbWUgPSAwOworCWludCBzaGExX25hbWUgPSAwOworCWludCBzaG93bl9tZXJnZV9wb2ludCA9IDA7CisJaW50IHdpdGhfY3VycmVudF9icmFuY2ggPSAwOworCWludCBoZWFkX2F0ID0gLTE7CisJaW50IHRvcGljcyA9IDA7CisJaW50IGRlbnNlID0gMTsKKwlpbnQgcmVmbG9nID0gMDsKKwljb25zdCBjaGFyICpyZWZsb2dfYmFzZSA9IE5VTEw7CisKKwlnaXRfY29uZmlnKGdpdF9zaG93X2JyYW5jaF9jb25maWcpOworCisJLyogSWYgbm90aGluZyBpcyBzcGVjaWZpZWQsIHRyeSB0aGUgZGVmYXVsdCBmaXJzdCAqLworCWlmIChhYyA9PSAxICYmIGRlZmF1bHRfbnVtKSB7CisJCWFjID0gZGVmYXVsdF9udW0gKyAxOworCQlhdiA9IGRlZmF1bHRfYXJnIC0gMTsgLyogaWNrOyB3ZSB3b3VsZCBub3QgYWRkcmVzcyBhdlswXSAqLworCX0KKworCXdoaWxlICgxIDwgYWMgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlhYy0tOyBhdisrOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpIHx8ICFzdHJjbXAoYXJnLCAiLWEiKSkKKwkJCWFsbF9oZWFkcyA9IGFsbF9yZW1vdGVzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXJlbW90ZXMiKSB8fCAhc3RyY21wKGFyZywgIi1yIikpCisJCQlhbGxfcmVtb3RlcyA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1tb3JlIikpCisJCQlleHRyYSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1saXN0IikpCisJCQlleHRyYSA9IC0xOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbm8tbmFtZSIpKQorCQkJbm9fbmFtZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1jdXJyZW50IikpCisJCQl3aXRoX2N1cnJlbnRfYnJhbmNoID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXNoYTEtbmFtZSIpKQorCQkJc2hhMV9uYW1lID0gMTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLW1vcmU9IikpCisJCQlleHRyYSA9IGF0b2koYXJnICsgNyk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1tZXJnZS1iYXNlIikpCisJCQltZXJnZV9iYXNlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWluZGVwZW5kZW50IikpCisJCQlpbmRlcGVuZGVudCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS10b3BvLW9yZGVyIikpCisJCQlsaWZvID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRvcGljcyIpKQorCQkJdG9waWNzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXNwYXJzZSIpKQorCQkJZGVuc2UgPSAwOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZGF0ZS1vcmRlciIpKQorCQkJbGlmbyA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yZWZsb2ciKSB8fCAhc3RyY21wKGFyZywgIi1nIikpIHsKKwkJCXJlZmxvZyA9IERFRkFVTFRfUkVGTE9HOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1yZWZsb2c9IikpCisJCQlwYXJzZV9yZWZsb2dfcGFyYW0oYXJnICsgOSwgJnJlZmxvZywgJnJlZmxvZ19iYXNlKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItZz0iKSkKKwkJCXBhcnNlX3JlZmxvZ19wYXJhbShhcmcgKyAzLCAmcmVmbG9nLCAmcmVmbG9nX2Jhc2UpOworCQllbHNlCisJCQl1c2FnZShzaG93X2JyYW5jaF91c2FnZSk7CisJCWFjLS07IGF2Kys7CisJfQorCWFjLS07IGF2Kys7CisKKwlpZiAoZXh0cmEgfHwgcmVmbG9nKSB7CisJCS8qICJsaXN0aW5nIiBtb2RlIGlzIGluY29tcGF0aWJsZSB3aXRoCisJCSAqIGluZGVwZW5kZW50IG5vciBtZXJnZS1iYXNlIG1vZGVzLgorCQkgKi8KKwkJaWYgKGluZGVwZW5kZW50IHx8IG1lcmdlX2Jhc2UpCisJCQl1c2FnZShzaG93X2JyYW5jaF91c2FnZSk7CisJCWlmIChyZWZsb2cgJiYgKCgwIDwgZXh0cmEpIHx8IGFsbF9oZWFkcyB8fCBhbGxfcmVtb3RlcykpCisJCQkvKgorCQkJICogQXNraW5nIGZvciAtLW1vcmUgaW4gcmVmbG9nIG1vZGUgZG9lcyBub3QKKwkJCSAqIG1ha2Ugc2Vuc2UuICAtLWxpc3QgaXMgT2suCisJCQkgKgorCQkJICogQWxzbyAtLWFsbCBhbmQgLS1yZW1vdGVzIGRvIG5vdCBtYWtlIHNlbnNlIGVpdGhlci4KKwkJCSAqLworCQkJdXNhZ2Uoc2hvd19icmFuY2hfdXNhZ2VfcmVmbG9nKTsKKwl9CisKKwkvKiBJZiBub3RoaW5nIGlzIHNwZWNpZmllZCwgc2hvdyBhbGwgYnJhbmNoZXMgYnkgZGVmYXVsdCAqLworCWlmIChhYyArIGFsbF9oZWFkcyArIGFsbF9yZW1vdGVzID09IDApCisJCWFsbF9oZWFkcyA9IDE7CisKKwlpZiAocmVmbG9nKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgbnRoX2Rlc2NbMjU2XTsKKwkJY2hhciAqcmVmOworCQlpbnQgYmFzZSA9IDA7CisKKwkJaWYgKGFjID09IDApIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpmYWtlX2F2WzJdOworCQkJY29uc3QgY2hhciAqcmVmbmFtZTsKKworCQkJcmVmbmFtZSA9IHJlc29sdmVfcmVmKCJIRUFEIiwgc2hhMSwgMSwgTlVMTCk7CisJCQlmYWtlX2F2WzBdID0geHN0cmR1cChyZWZuYW1lKTsKKwkJCWZha2VfYXZbMV0gPSBOVUxMOworCQkJYXYgPSBmYWtlX2F2OworCQkJYWMgPSAxOworCQl9CisJCWlmIChhYyAhPSAxKQorCQkJZGllKCItLXJlZmxvZyBvcHRpb24gbmVlZHMgb25lIGJyYW5jaCBuYW1lIik7CisKKwkJaWYgKE1BWF9SRVZTIDwgcmVmbG9nKQorCQkJZGllKCJPbmx5ICVkIGVudHJpZXMgY2FuIGJlIHNob3duIGF0IG9uZSB0aW1lLiIsCisJCQkgICAgTUFYX1JFVlMpOworCQlpZiAoIWR3aW1fcmVmKCphdiwgc3RybGVuKCphdiksIHNoYTEsICZyZWYpKQorCQkJZGllKCJObyBzdWNoIHJlZiAlcyIsICphdik7CisKKwkJLyogSGFzIHRoZSBiYXNlIGJlZW4gc3BlY2lmaWVkPyAqLworCQlpZiAocmVmbG9nX2Jhc2UpIHsKKwkJCWNoYXIgKmVwOworCQkJYmFzZSA9IHN0cnRvdWwocmVmbG9nX2Jhc2UsICZlcCwgMTApOworCQkJaWYgKCplcCkgeworCQkJCS8qIEFoLCB0aGF0IGlzIGEgZGF0ZSBzcGVjLi4uICovCisJCQkJdW5zaWduZWQgbG9uZyBhdDsKKwkJCQlhdCA9IGFwcHJveGlkYXRlKHJlZmxvZ19iYXNlKTsKKwkJCQlyZWFkX3JlZl9hdChyZWYsIGF0LCAtMSwgc2hhMSwgTlVMTCwKKwkJCQkJICAgIE5VTEwsIE5VTEwsICZiYXNlKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCByZWZsb2c7IGkrKykgeworCQkJY2hhciAqbG9nbXNnLCAqbTsKKwkJCWNvbnN0IGNoYXIgKm1zZzsKKwkJCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOworCQkJaW50IHR6OworCisJCQlpZiAocmVhZF9yZWZfYXQocmVmLCAwLCBiYXNlK2ksIHNoYTEsICZsb2dtc2csCisJCQkJCSZ0aW1lc3RhbXAsICZ0eiwgTlVMTCkpIHsKKwkJCQlyZWZsb2cgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJbXNnID0gc3RyY2hyKGxvZ21zZywgJ1x0Jyk7CisJCQlpZiAoIW1zZykKKwkJCQltc2cgPSAiKG5vbmUpIjsKKwkJCWVsc2UKKwkJCQltc2crKzsKKwkJCW0gPSB4bWFsbG9jKHN0cmxlbihtc2cpICsgMjAwKTsKKwkJCXNwcmludGYobSwgIiglcykgJXMiLAorCQkJCXNob3dfZGF0ZSh0aW1lc3RhbXAsIHR6LCAxKSwKKwkJCQltc2cpOworCQkJcmVmbG9nX21zZ1tpXSA9IG07CisJCQlmcmVlKGxvZ21zZyk7CisJCQlzcHJpbnRmKG50aF9kZXNjLCAiJXNAeyVkfSIsICphdiwgYmFzZStpKTsKKwkJCWFwcGVuZF9yZWYobnRoX2Rlc2MsIHNoYTEsIDEpOworCQl9CisJfQorCWVsc2UgaWYgKGFsbF9oZWFkcyArIGFsbF9yZW1vdGVzKQorCQlzbmFyZl9yZWZzKGFsbF9oZWFkcywgYWxsX3JlbW90ZXMpOworCWVsc2UgeworCQl3aGlsZSAoMCA8IGFjKSB7CisJCQlhcHBlbmRfb25lX3JldigqYXYpOworCQkJYWMtLTsgYXYrKzsKKwkJfQorCX0KKworCWhlYWRfcCA9IHJlc29sdmVfcmVmKCJIRUFEIiwgaGVhZF9zaGExLCAxLCBOVUxMKTsKKwlpZiAoaGVhZF9wKSB7CisJCWhlYWRfbGVuID0gc3RybGVuKGhlYWRfcCk7CisJCW1lbWNweShoZWFkLCBoZWFkX3AsIGhlYWRfbGVuICsgMSk7CisJfQorCWVsc2UgeworCQloZWFkX2xlbiA9IDA7CisJCWhlYWRbMF0gPSAwOworCX0KKworCWlmICh3aXRoX2N1cnJlbnRfYnJhbmNoICYmIGhlYWRfcCkgeworCQlpbnQgaGFzX2hlYWQgPSAwOworCQlmb3IgKGkgPSAwOyAhaGFzX2hlYWQgJiYgaSA8IHJlZl9uYW1lX2NudDsgaSsrKSB7CisJCQkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGFkZGluZyB0aGUgYnJhbmNoCisJCQkgKiBIRUFEIHBvaW50cyBhdC4KKwkJCSAqLworCQkJaWYgKHJldl9pc19oZWFkKGhlYWQsCisJCQkJCWhlYWRfbGVuLAorCQkJCQlyZWZfbmFtZVtpXSwKKwkJCQkJaGVhZF9zaGExLCBOVUxMKSkKKwkJCQloYXNfaGVhZCsrOworCQl9CisJCWlmICghaGFzX2hlYWQpIHsKKwkJCWludCBwZnhsZW4gPSBzdHJsZW4oInJlZnMvaGVhZHMvIik7CisJCQlhcHBlbmRfb25lX3JldihoZWFkICsgcGZ4bGVuKTsKKwkJfQorCX0KKworCWlmICghcmVmX25hbWVfY250KSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcmV2cyB0byBiZSBzaG93bi5cbiIpOworCQlleGl0KDApOworCX0KKworCWZvciAobnVtX3JldiA9IDA7IHJlZl9uYW1lW251bV9yZXZdOyBudW1fcmV2KyspIHsKKwkJdW5zaWduZWQgY2hhciByZXZrZXlbMjBdOworCQl1bnNpZ25lZCBpbnQgZmxhZyA9IDF1IDw8IChudW1fcmV2ICsgUkVWX1NISUZUKTsKKworCQlpZiAoTUFYX1JFVlMgPD0gbnVtX3JldikKKwkJCWRpZSgiY2Fubm90IGhhbmRsZSBtb3JlIHRoYW4gJWQgcmV2cy4iLCBNQVhfUkVWUyk7CisJCWlmIChnZXRfc2hhMShyZWZfbmFtZVtudW1fcmV2XSwgcmV2a2V5KSkKKwkJCWRpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCByZWYuIiwgcmVmX25hbWVbbnVtX3Jldl0pOworCQljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShyZXZrZXkpOworCQlpZiAoIWNvbW1pdCkKKwkJCWRpZSgiY2Fubm90IGZpbmQgY29tbWl0ICVzICglcykiLAorCQkJICAgIHJlZl9uYW1lW251bV9yZXZdLCByZXZrZXkpOworCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJbWFya19zZWVuKGNvbW1pdCwgJnNlZW4pOworCisJCS8qIHJldiMwIHVzZXMgYml0IFJFVl9TSElGVCwgcmV2IzEgdXNlcyBiaXQgUkVWX1NISUZUKzEsCisJCSAqIGFuZCBzbyBvbi4gIFJFVl9TSElGVCBiaXRzIGZyb20gYml0IDAgYXJlIHVzZWQgZm9yCisJCSAqIGludGVybmFsIGJvb2trZWVwaW5nLgorCQkgKi8KKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gZmxhZzsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzID09IGZsYWcpCisJCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZsaXN0KTsKKwkJcmV2W251bV9yZXZdID0gY29tbWl0OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKQorCQlyZXZfbWFza1tpXSA9IHJldltpXS0+b2JqZWN0LmZsYWdzOworCisJaWYgKDAgPD0gZXh0cmEpCisJCWpvaW5fcmV2cygmbGlzdCwgJnNlZW4sIG51bV9yZXYsIGV4dHJhKTsKKworCXNvcnRfYnlfZGF0ZSgmc2Vlbik7CisKKwlpZiAobWVyZ2VfYmFzZSkKKwkJcmV0dXJuIHNob3dfbWVyZ2VfYmFzZShzZWVuLCBudW1fcmV2KTsKKworCWlmIChpbmRlcGVuZGVudCkKKwkJcmV0dXJuIHNob3dfaW5kZXBlbmRlbnQocmV2LCBudW1fcmV2LCByZWZfbmFtZSwgcmV2X21hc2spOworCisJLyogU2hvdyBsaXN0OyAtLW1vcmU9LTEgbWVhbnMgbGlzdC1vbmx5ICovCisJaWYgKDEgPCBudW1fcmV2IHx8IGV4dHJhIDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCQlpbnQgajsKKwkJCWludCBpc19oZWFkID0gcmV2X2lzX2hlYWQoaGVhZCwKKwkJCQkJCSAgaGVhZF9sZW4sCisJCQkJCQkgIHJlZl9uYW1lW2ldLAorCQkJCQkJICBoZWFkX3NoYTEsCisJCQkJCQkgIHJldltpXS0+b2JqZWN0LnNoYTEpOworCQkJaWYgKGV4dHJhIDwgMCkKKwkJCQlwcmludGYoIiVjIFslc10gIiwKKwkJCQkgICAgICAgaXNfaGVhZCA/ICcqJyA6ICcgJywgcmVmX25hbWVbaV0pOworCQkJZWxzZSB7CisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJcHV0Y2hhcignICcpOworCQkJCXByaW50ZigiJWMgWyVzXSAiLAorCQkJCSAgICAgICBpc19oZWFkID8gJyonIDogJyEnLCByZWZfbmFtZVtpXSk7CisJCQl9CisKKwkJCWlmICghcmVmbG9nKSB7CisJCQkJLyogaGVhZGVyIGxpbmVzIG5ldmVyIG5lZWQgbmFtZSAqLworCQkJCXNob3dfb25lX2NvbW1pdChyZXZbaV0sIDEpOworCQkJfQorCQkJZWxzZQorCQkJCXB1dHMocmVmbG9nX21zZ1tpXSk7CisKKwkJCWlmIChpc19oZWFkKQorCQkJCWhlYWRfYXQgPSBpOworCQl9CisJCWlmICgwIDw9IGV4dHJhKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKQorCQkJCXB1dGNoYXIoJy0nKTsKKwkJCXB1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisJaWYgKGV4dHJhIDwgMCkKKwkJZXhpdCgwKTsKKworCS8qIFNvcnQgdG9wb2xvZ2ljYWxseSAqLworCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoJnNlZW4sIGxpZm8pOworCisJLyogR2l2ZSBuYW1lcyB0byBjb21taXRzICovCisJaWYgKCFzaGExX25hbWUgJiYgIW5vX25hbWUpCisJCW5hbWVfY29tbWl0cyhzZWVuLCByZXYsIHJlZl9uYW1lLCBudW1fcmV2KTsKKworCWFsbF9tYXNrID0gKCgxdSA8PCAoUkVWX1NISUZUICsgbnVtX3JldikpIC0gMSk7CisJYWxsX3JldnMgPSBhbGxfbWFzayAmIH4oKDF1IDw8IFJFVl9TSElGVCkgLSAxKTsKKworCXdoaWxlIChzZWVuKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBvcF9vbmVfY29tbWl0KCZzZWVuKTsKKwkJaW50IHRoaXNfZmxhZyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCQlpbnQgaXNfbWVyZ2VfcG9pbnQgPSAoKHRoaXNfZmxhZyAmIGFsbF9yZXZzKSA9PSBhbGxfcmV2cyk7CisKKwkJc2hvd25fbWVyZ2VfcG9pbnQgfD0gaXNfbWVyZ2VfcG9pbnQ7CisKKwkJaWYgKDEgPCBudW1fcmV2KSB7CisJCQlpbnQgaXNfbWVyZ2UgPSAhIShjb21taXQtPnBhcmVudHMgJiYKKwkJCQkJICBjb21taXQtPnBhcmVudHMtPm5leHQpOworCQkJaWYgKHRvcGljcyAmJgorCQkJICAgICFpc19tZXJnZV9wb2ludCAmJgorCQkJICAgICh0aGlzX2ZsYWcgJiAoMXUgPDwgUkVWX1NISUZUKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoZGVuc2UgJiYgaXNfbWVyZ2UgJiYKKwkJCSAgICBvbWl0X2luX2RlbnNlKGNvbW1pdCwgcmV2LCBudW1fcmV2KSkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspIHsKKwkJCQlpbnQgbWFyazsKKwkJCQlpZiAoISh0aGlzX2ZsYWcgJiAoMXUgPDwgKGkgKyBSRVZfU0hJRlQpKSkpCisJCQkJCW1hcmsgPSAnICc7CisJCQkJZWxzZSBpZiAoaXNfbWVyZ2UpCisJCQkJCW1hcmsgPSAnLSc7CisJCQkJZWxzZSBpZiAoaSA9PSBoZWFkX2F0KQorCQkJCQltYXJrID0gJyonOworCQkJCWVsc2UKKwkJCQkJbWFyayA9ICcrJzsKKwkJCQlwdXRjaGFyKG1hcmspOworCQkJfQorCQkJcHV0Y2hhcignICcpOworCQl9CisJCXNob3dfb25lX2NvbW1pdChjb21taXQsIG5vX25hbWUpOworCisJCWlmIChzaG93bl9tZXJnZV9wb2ludCAmJiAtLWV4dHJhIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tc2hvdy1yZWYuYyBiL2J1aWx0aW4tc2hvdy1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDYzZmYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zaG93LXJlZi5jCkBAIC0wLDAgKzEsMjUyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHNob3dfcmVmX3VzYWdlW10gPSAiZ2l0IHNob3ctcmVmIFstcXwtLXF1aWV0XSBbLS12ZXJpZnldIFstaHwtLWhlYWRdIFstZHwtLWRlcmVmZXJlbmNlXSBbLXN8LS1oYXNoWz08bGVuZ3RoPl1dIFstLWFiYnJldls9PGxlbmd0aD5dXSBbLS10YWdzXSBbLS1oZWFkc10gWy0tXSBbcGF0dGVybipdIDwgcmVmLWxpc3QiOworCitzdGF0aWMgaW50IGRlcmVmX3RhZ3MgPSAwLCBzaG93X2hlYWQgPSAwLCB0YWdzX29ubHkgPSAwLCBoZWFkc19vbmx5ID0gMCwKKwlmb3VuZF9tYXRjaCA9IDAsIHZlcmlmeSA9IDAsIHF1aWV0ID0gMCwgaGFzaF9vbmx5ID0gMCwgYWJicmV2ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICoqcGF0dGVybjsKKworc3RhdGljIHZvaWQgc2hvd19vbmUoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljb25zdCBjaGFyICpoZXggPSBmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgYWJicmV2KTsKKwlpZiAoaGFzaF9vbmx5KQorCQlwcmludGYoIiVzXG4iLCBoZXgpOworCWVsc2UKKwkJcHJpbnRmKCIlcyAlc1xuIiwgaGV4LCByZWZuYW1lKTsKK30KKworc3RhdGljIGludCBzaG93X3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JkYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKwljb25zdCBjaGFyICpoZXg7CisJdW5zaWduZWQgY2hhciBwZWVsZWRbMjBdOworCisJaWYgKHRhZ3Nfb25seSB8fCBoZWFkc19vbmx5KSB7CisJCWludCBtYXRjaDsKKworCQltYXRjaCA9IGhlYWRzX29ubHkgJiYgIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy9oZWFkcy8iKTsKKwkJbWF0Y2ggfD0gdGFnc19vbmx5ICYmICFwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvdGFncy8iKTsKKwkJaWYgKCFtYXRjaCkKKwkJCXJldHVybiAwOworCX0KKwlpZiAocGF0dGVybikgeworCQlpbnQgcmVmbGVuID0gc3RybGVuKHJlZm5hbWUpOworCQljb25zdCBjaGFyICoqcCA9IHBhdHRlcm4sICptOworCQl3aGlsZSAoKG0gPSAqcCsrKSAhPSBOVUxMKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKG0pOworCQkJaWYgKGxlbiA+IHJlZmxlbikKKwkJCQljb250aW51ZTsKKwkJCWlmIChtZW1jbXAobSwgcmVmbmFtZSArIHJlZmxlbiAtIGxlbiwgbGVuKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZW4gPT0gcmVmbGVuKQorCQkJCWdvdG8gbWF0Y2g7CisJCQkvKiAiLS12ZXJpZnkiIHJlcXVpcmVzIGFuIGV4YWN0IG1hdGNoICovCisJCQlpZiAodmVyaWZ5KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlZm5hbWVbcmVmbGVuIC0gbGVuIC0gMV0gPT0gJy8nKQorCQkJCWdvdG8gbWF0Y2g7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCittYXRjaDoKKwlmb3VuZF9tYXRjaCsrOworCisJLyogVGhpcyBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgc2xpZ2h0bHkgdGhhdCBldmVuIHVuZGVyIHF1aWV0IHdlCisJICogZGV0ZWN0IGFuZCByZXR1cm4gZXJyb3IgaWYgdGhlIHJlcG9zaXRvcnkgaXMgY29ycnVwdCBhbmQKKwkgKiByZWYgcG9pbnRzIGF0IGEgbm9uZXhpc3RlbnQgb2JqZWN0LgorCSAqLworCWlmICghaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJZGllKCJnaXQtc2hvdy1yZWY6IGJhZCByZWYgJXMgKCVzKSIsIHJlZm5hbWUsCisJCSAgICBzaGExX3RvX2hleChzaGExKSk7CisKKwlpZiAocXVpZXQpCisJCXJldHVybiAwOworCisJc2hvd19vbmUocmVmbmFtZSwgc2hhMSk7CisKKwlpZiAoIWRlcmVmX3RhZ3MpCisJCXJldHVybiAwOworCisJaWYgKChmbGFnICYgUkVGX0lTUEFDS0VEKSAmJiAhcGVlbF9yZWYocmVmbmFtZSwgcGVlbGVkKSkgeworCQlpZiAoIWlzX251bGxfc2hhMShwZWVsZWQpKSB7CisJCQloZXggPSBmaW5kX3VuaXF1ZV9hYmJyZXYocGVlbGVkLCBhYmJyZXYpOworCQkJcHJpbnRmKCIlcyAlc157fVxuIiwgaGV4LCByZWZuYW1lKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQlpZiAoIW9iaikKKwkJCWRpZSgiZ2l0LXNob3ctcmVmOiBiYWQgcmVmICVzICglcykiLCByZWZuYW1lLAorCQkJICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlvYmogPSBkZXJlZl90YWcob2JqLCByZWZuYW1lLCAwKTsKKwkJCWhleCA9IGZpbmRfdW5pcXVlX2FiYnJldihvYmotPnNoYTEsIGFiYnJldik7CisJCQlwcmludGYoIiVzICVzXnt9XG4iLCBoZXgsIHJlZm5hbWUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9leGlzdGluZyhjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JkYXRhKQoreworCXN0cnVjdCBwYXRoX2xpc3QgKmxpc3QgPSAoc3RydWN0IHBhdGhfbGlzdCAqKWNiZGF0YTsKKwlwYXRoX2xpc3RfaW5zZXJ0KHJlZm5hbWUsIGxpc3QpOworCXJldHVybiAwOworfQorCisvKgorICogcmVhZCAiXig/Ojxhbnl0aGluZz5ccyk/PHJlZm5hbWU+KD86XF5ce1x9KT8kIiBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKKyAqIGFuZAorICogKDEpIHN0cmlwICJee30iIGF0IHRoZSBlbmQgb2YgbGluZSBpZiBhbnk7CisgKiAoMikgaWdub3JlIGlmIG1hdGNoIGlzIHByb3ZpZGVkIGFuZCBkb2VzIG5vdCBoZWFkLW1hdGNoIHJlZm5hbWU7CisgKiAoMykgd2FybiBpZiByZWZuYW1lIGlzIG5vdCBhIHdlbGwtZm9ybWVkIHJlZm5hbWUgYW5kIHNraXA7CisgKiAoNCkgaWdub3JlIGlmIHJlZm5hbWUgaXMgYSByZWYgdGhhdCBleGlzdHMgaW4gdGhlIGxvY2FsIHJlcG9zaXRvcnk7CisgKiAoNSkgb3RoZXJ3aXNlIG91dHB1dCB0aGUgbGluZS4KKyAqLworc3RhdGljIGludCBleGNsdWRlX2V4aXN0aW5nKGNvbnN0IGNoYXIgKm1hdGNoKQoreworCXN0YXRpYyBzdHJ1Y3QgcGF0aF9saXN0IGV4aXN0aW5nX3JlZnMgPSB7IE5VTEwsIDAsIDAsIDAgfTsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgbWF0Y2hsZW4gPSBtYXRjaCA/IHN0cmxlbihtYXRjaCkgOiAwOworCisJZm9yX2VhY2hfcmVmKGFkZF9leGlzdGluZywgJmV4aXN0aW5nX3JlZnMpOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBzdGRpbikpIHsKKwkJY2hhciAqcmVmOworCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisKKwkJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbiAtIDFdID09ICdcbicpCisJCQlidWZbLS1sZW5dID0gJ1wwJzsKKwkJaWYgKDMgPD0gbGVuICYmICFzdHJjbXAoYnVmICsgbGVuIC0gMywgIl57fSIpKSB7CisJCQlsZW4gLT0gMzsKKwkJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJfQorCQlmb3IgKHJlZiA9IGJ1ZiArIGxlbjsgYnVmIDwgcmVmOyByZWYtLSkKKwkJCWlmIChpc3NwYWNlKHJlZlstMV0pKQorCQkJCWJyZWFrOworCQlpZiAobWF0Y2gpIHsKKwkJCWludCByZWZsZW4gPSBidWYgKyBsZW4gLSByZWY7CisJCQlpZiAocmVmbGVuIDwgbWF0Y2hsZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoc3RybmNtcChyZWYsIG1hdGNoLCBtYXRjaGxlbikpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiByZWYgJyVzJyBpZ25vcmVkXG4iLCByZWYpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwYXRoX2xpc3RfaGFzX3BhdGgoJmV4aXN0aW5nX3JlZnMsIHJlZikpIHsKKwkJCXByaW50ZigiJXNcbiIsIGJ1Zik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfc2hvd19yZWYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICgqYXJnICE9ICctJykgeworCQkJcGF0dGVybiA9IGFyZ3YgKyBpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJcGF0dGVybiA9IGFyZ3YgKyBpICsgMTsKKwkJCWlmICghKnBhdHRlcm4pCisJCQkJcGF0dGVybiA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItcSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1xdWlldCIpKSB7CisJCQlxdWlldCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItaCIpIHx8ICFzdHJjbXAoYXJnLCAiLS1oZWFkIikpIHsKKwkJCXNob3dfaGVhZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItZCIpIHx8ICFzdHJjbXAoYXJnLCAiLS1kZXJlZmVyZW5jZSIpKSB7CisJCQlkZXJlZl90YWdzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1zIikgfHwgIXN0cmNtcChhcmcsICItLWhhc2giKSkgeworCQkJaGFzaF9vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0taGFzaD0iKSB8fAorCQkgICAgKCFwcmVmaXhjbXAoYXJnLCAiLS1hYmJyZXYiKSAmJgorCQkgICAgIChhcmdbOF0gPT0gJz0nIHx8IGFyZ1s4XSA9PSAnXDAnKSkpIHsKKwkJCWlmIChhcmdbMl0gIT0gJ2gnICYmICFhcmdbOF0pCisJCQkJLyogLS1hYmJyZXYgb25seSAqLworCQkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJZWxzZSB7CisJCQkJLyogLS1oYXNoPSBvciAtLWFiYnJldj0gKi8KKwkJCQljaGFyICplbmQ7CisJCQkJaWYgKGFyZ1syXSA9PSAnaCcpIHsKKwkJCQkJaGFzaF9vbmx5ID0gMTsKKwkJCQkJYXJnICs9IDc7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJYXJnICs9IDk7CisJCQkJYWJicmV2ID0gc3RydG91bChhcmcsICZlbmQsIDEwKTsKKwkJCQlpZiAoKmVuZCB8fCBhYmJyZXYgPiA0MCkKKwkJCQkJdXNhZ2Uoc2hvd19yZWZfdXNhZ2UpOworCQkJCWlmIChhYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCQkJYWJicmV2ID0gTUlOSU1VTV9BQkJSRVY7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXZlcmlmeSIpKSB7CisJCQl2ZXJpZnkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCXRhZ3Nfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWhlYWRzIikpIHsKKwkJCWhlYWRzX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1leGNsdWRlLWV4aXN0aW5nIikpCisJCQlyZXR1cm4gZXhjbHVkZV9leGlzdGluZyhOVUxMKTsKKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlLWV4aXN0aW5nPSIpKQorCQkJcmV0dXJuIGV4Y2x1ZGVfZXhpc3RpbmcoYXJnICsgMTkpOworCQl1c2FnZShzaG93X3JlZl91c2FnZSk7CisJfQorCisJaWYgKHZlcmlmeSkgeworCQlpZiAoIXBhdHRlcm4pCisJCQlkaWUoIi0tdmVyaWZ5IHJlcXVpcmVzIGEgcmVmZXJlbmNlIik7CisJCXdoaWxlICgqcGF0dGVybikgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCQkJaWYgKCFwcmVmaXhjbXAoKnBhdHRlcm4sICJyZWZzLyIpICYmCisJCQkgICAgcmVzb2x2ZV9yZWYoKnBhdHRlcm4sIHNoYTEsIDEsIE5VTEwpKSB7CisJCQkJaWYgKCFxdWlldCkKKwkJCQkJc2hvd19vbmUoKnBhdHRlcm4sIHNoYTEpOworCQkJfQorCQkJZWxzZSBpZiAoIXF1aWV0KQorCQkJCWRpZSgiJyVzJyAtIG5vdCBhIHZhbGlkIHJlZiIsICpwYXR0ZXJuKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJCXBhdHRlcm4rKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2hvd19oZWFkKQorCQloZWFkX3JlZihzaG93X3JlZiwgTlVMTCk7CisJZm9yX2VhY2hfcmVmKHNob3dfcmVmLCBOVUxMKTsKKwlpZiAoIWZvdW5kX21hdGNoKSB7CisJCWlmICh2ZXJpZnkgJiYgIXF1aWV0KQorCQkJZGllKCJObyBtYXRjaCIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXN0cmlwc3BhY2UuYyBiL2J1aWx0aW4tc3RyaXBzcGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDRkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXN0cmlwc3BhY2UuYwpAQCAtMCwwICsxLDU4IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisvKgorICogUmVtb3ZlIGVtcHR5IGxpbmVzIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kLgorICoKKyAqIFR1cm4gbXVsdGlwbGUgY29uc2VjdXRpdmUgZW1wdHkgbGluZXMgaW50byBqdXN0IG9uZQorICogZW1wdHkgbGluZS4gIFJldHVybiB0cnVlIGlmIGl0IGlzIGFuIGluY29tcGxldGUgbGluZS4KKyAqLworc3RhdGljIGludCBjbGVhbnVwKGNoYXIgKmxpbmUpCit7CisJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKworCWlmIChsZW4gJiYgbGluZVtsZW4tMV0gPT0gJ1xuJykgeworCQlpZiAobGVuID09IDEpCisJCQlyZXR1cm4gMDsKKwkJZG8geworCQkJdW5zaWduZWQgY2hhciBjID0gbGluZVtsZW4tMl07CisJCQlpZiAoIWlzc3BhY2UoYykpCisJCQkJYnJlYWs7CisJCQlsaW5lW2xlbi0yXSA9ICdcbic7CisJCQlsZW4tLTsKKwkJCWxpbmVbbGVuXSA9IDA7CisJCX0gd2hpbGUgKGxlbiA+IDEpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgc3RyaXBzcGFjZShGSUxFICppbiwgRklMRSAqb3V0KQoreworCWludCBlbXB0aWVzID0gLTE7CisJaW50IGluY29tcGxldGUgPSAwOworCWNoYXIgbGluZVsxMDI0XTsKKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgeworCQlpbmNvbXBsZXRlID0gY2xlYW51cChsaW5lKTsKKworCQkvKiBOb3QganVzdCBhbiBlbXB0eSBsaW5lPyAqLworCQlpZiAobGluZVswXSAhPSAnXG4nKSB7CisJCQlpZiAoZW1wdGllcyA+IDApCisJCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWVtcHRpZXMgPSAwOworCQkJZnB1dHMobGluZSwgb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChlbXB0aWVzIDwgMCkKKwkJCWNvbnRpbnVlOworCQllbXB0aWVzKys7CisJfQorCWlmIChpbmNvbXBsZXRlKQorCQlmcHV0YygnXG4nLCBvdXQpOworfQorCitpbnQgY21kX3N0cmlwc3BhY2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RyaXBzcGFjZShzdGRpbiwgc3Rkb3V0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tc3ltYm9saWMtcmVmLmMgYi9idWlsdGluLXN5bWJvbGljLXJlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWI0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXN5bWJvbGljLXJlZi5jCkBAIC0wLDAgKzEsNzEgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9zeW1ib2xpY19yZWZfdXNhZ2VbXSA9CisiZ2l0LXN5bWJvbGljLXJlZiBbLXFdIFstbSA8cmVhc29uPl0gbmFtZSBbcmVmXSI7CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N5bXJlZihjb25zdCBjaGFyICpIRUFELCBpbnQgcXVpZXQpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgZmxhZzsKKwljb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3RlciA9IHJlc29sdmVfcmVmKEhFQUQsIHNoYTEsIDAsICZmbGFnKTsKKworCWlmICghcmVmc19oZWFkc19tYXN0ZXIpCisJCWRpZSgiTm8gc3VjaCByZWY6ICVzIiwgSEVBRCk7CisJZWxzZSBpZiAoIShmbGFnICYgUkVGX0lTU1lNUkVGKSkgeworCQlpZiAoIXF1aWV0KQorCQkJZGllKCJyZWYgJXMgaXMgbm90IGEgc3ltYm9saWMgcmVmIiwgSEVBRCk7CisJCWVsc2UKKwkJCWV4aXQoMSk7CisJfQorCXB1dHMocmVmc19oZWFkc19tYXN0ZXIpOworfQorCitpbnQgY21kX3N5bWJvbGljX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgcXVpZXQgPSAwOworCWNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLXEiLCBhcmcpKQorCQkJcXVpZXQgPSAxOworCQllbHNlIGlmICghc3RyY21wKCItbSIsIGFyZykpIHsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCWlmIChhcmdjIDw9IDEpCisJCQkJYnJlYWs7CisJCQltc2cgPSBhcmd2WzFdOworCQkJaWYgKCEqbXNnKQorCQkJCWRpZSgiUmVmdXNpbmcgdG8gcGVyZm9ybSB1cGRhdGUgd2l0aCBlbXB0eSBtZXNzYWdlIik7CisJCQlpZiAoc3RyY2hyKG1zZywgJ1xuJykpCisJCQkJZGllKCJSZWZ1c2luZyB0byBwZXJmb3JtIHVwZGF0ZSB3aXRoIFxcbiBpbiBtZXNzYWdlIik7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhcmcpKSB7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlkaWUoInVua25vd24gb3B0aW9uICVzIiwgYXJnKTsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAyOgorCQljaGVja19zeW1yZWYoYXJndlsxXSwgcXVpZXQpOworCQlicmVhazsKKwljYXNlIDM6CisJCWNyZWF0ZV9zeW1yZWYoYXJndlsxXSwgYXJndlsyXSwgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNhZ2UoZ2l0X3N5bWJvbGljX3JlZl91c2FnZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi10YXItdHJlZS5jIGIvYnVpbHRpbi10YXItdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDcxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXRhci10cmVlLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBSZW5lIFNjaGFyZmUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFyLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHRhcl90cmVlX3VzYWdlW10gPQorImdpdC10YXItdHJlZSBbLS1yZW1vdGU9PHJlcG8+XSA8dHJlZS1pc2g+IFtiYXNlZGlyXVxuIgorIioqKiBOb3RlIHRoYXQgdGhpcyBjb21tYW5kIGlzIG5vdyBkZXByZWNhdGVkOyB1c2UgZ2l0LWFyY2hpdmUgaW5zdGVhZC4iOworCitpbnQgY21kX3Rhcl90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCS8qCisJICogZ2l0LXRhci10cmVlIGlzIG5vdyBhIHdyYXBwZXIgYXJvdW5kIGdpdC1hcmNoaXZlIC0tZm9ybWF0PXRhcgorCSAqCisJICogJDAgLS1yZW1vdGU9PHJlcG8+IGFyZy4uLiA9PT4KKwkgKglnaXQtYXJjaGl2ZSAtLWZvcm1hdD10YXIgLS1yZW1vdGU9PHJlcG8+IGFyZy4uLgorCSAqICQwIHRyZWUtaXNoID09PgorCSAqCWdpdC1hcmNoaXZlIC0tZm9ybWF0PXRhciB0cmVlLWlzaAorCSAqICQwIHRyZWUtaXNoIGJhc2VkaXIgPT0+CisJICogCWdpdC1hcmNoaXZlIC0tZm9ybWF0LXRhciAtLXByZWZpeD1iYXNlZGlyIHRyZWUtaXNoCisJICovCisJaW50IGk7CisJY29uc3QgY2hhciAqKm5hcmd2ID0geGNhbGxvYyhzaXplb2YoKm5hcmd2KSwgYXJnYyArIDIpOworCWNoYXIgKmJhc2VkaXJfYXJnOworCWludCBuYXJnYyA9IDA7CisKKwluYXJndltuYXJnYysrXSA9ICJnaXQtYXJjaGl2ZSI7CisJbmFyZ3ZbbmFyZ2MrK10gPSAiLS1mb3JtYXQ9dGFyIjsKKworCWlmICgyIDw9IGFyZ2MgJiYgIXByZWZpeGNtcChhcmd2WzFdLCAiLS1yZW1vdGU9IikpIHsKKwkJbmFyZ3ZbbmFyZ2MrK10gPSBhcmd2WzFdOworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwl9CisJc3dpdGNoIChhcmdjKSB7CisJZGVmYXVsdDoKKwkJdXNhZ2UodGFyX3RyZWVfdXNhZ2UpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qIGJhc2UtcGF0aCAqLworCQliYXNlZGlyX2FyZyA9IHhtYWxsb2Moc3RybGVuKGFyZ3ZbMl0pICsgMTEpOworCQlzcHJpbnRmKGJhc2VkaXJfYXJnLCAiLS1wcmVmaXg9JXMvIiwgYXJndlsyXSk7CisJCW5hcmd2W25hcmdjKytdID0gYmFzZWRpcl9hcmc7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSAyOgorCQkvKiB0cmVlLWlzaCAqLworCQluYXJndltuYXJnYysrXSA9IGFyZ3ZbMV07CisJfQorCW5hcmd2W25hcmdjXSA9IE5VTEw7CisKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIioqKiBnaXQtdGFyLXRyZWUgaXMgbm93IGRlcHJlY2F0ZWQuXG4iCisJCSIqKiogUnVubmluZyBnaXQtYXJjaGl2ZSBpbnN0ZWFkLlxuKioqIik7CisJZm9yIChpID0gMDsgaSA8IG5hcmdjOyBpKyspIHsKKwkJZnB1dGMoJyAnLCBzdGRlcnIpOworCQlzcV9xdW90ZV9wcmludChzdGRlcnIsIG5hcmd2W2ldKTsKKwl9CisJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwlyZXR1cm4gY21kX2FyY2hpdmUobmFyZ2MsIG5hcmd2LCBwcmVmaXgpOworfQorCisvKiB1c3RhciBoZWFkZXIgKyBleHRlbmRlZCBnbG9iYWwgaGVhZGVyIGNvbnRlbnQgKi8KKyNkZWZpbmUgUkVDT1JEU0laRQkoNTEyKQorI2RlZmluZSBIRUFERVJTSVpFICgyICogUkVDT1JEU0laRSkKKworaW50IGNtZF9nZXRfdGFyX2NvbW1pdF9pZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljaGFyIGJ1ZmZlcltIRUFERVJTSVpFXTsKKwlzdHJ1Y3QgdXN0YXJfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IHVzdGFyX2hlYWRlciAqKWJ1ZmZlcjsKKwljaGFyICpjb250ZW50ID0gYnVmZmVyICsgUkVDT1JEU0laRTsKKwlzc2l6ZV90IG47CisKKwluID0gcmVhZF9pbl9mdWxsKDAsIGJ1ZmZlciwgSEVBREVSU0laRSk7CisJaWYgKG4gPCBIRUFERVJTSVpFKQorCQlkaWUoImdpdC1nZXQtdGFyLWNvbW1pdC1pZDogcmVhZCBlcnJvciIpOworCWlmIChoZWFkZXItPnR5cGVmbGFnWzBdICE9ICdnJykKKwkJcmV0dXJuIDE7CisJaWYgKG1lbWNtcChjb250ZW50LCAiNTIgY29tbWVudD0iLCAxMSkpCisJCXJldHVybiAxOworCisJbiA9IHdyaXRlX2luX2Z1bGwoMSwgY29udGVudCArIDExLCA0MSk7CisJaWYgKG4gPCA0MSkKKwkJZGllKCJnaXQtZ2V0LXRhci1jb21taXQtaWQ6IHdyaXRlIGVycm9yIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdW5wYWNrLW9iamVjdHMuYyBiL2J1aWx0aW4tdW5wYWNrLW9iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmZmNjJmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi11bnBhY2stb2JqZWN0cy5jCkBAIC0wLDAgKzEsNDA0IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJwcm9ncmVzcy5oIgorCitzdGF0aWMgaW50IGRyeV9ydW4sIHF1aWV0LCByZWNvdmVyLCBoYXNfZXJyb3JzOworc3RhdGljIGNvbnN0IGNoYXIgdW5wYWNrX3VzYWdlW10gPSAiZ2l0LXVucGFjay1vYmplY3RzIFstbl0gWy1xXSBbLXJdIDwgcGFjay1maWxlIjsKKworLyogV2UgYWx3YXlzIHJlYWQgaW4gNGtCIGNodW5rcy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MDk2XTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW47CitzdGF0aWMgb2ZmX3QgY29uc3VtZWRfYnl0ZXM7CitzdGF0aWMgU0hBX0NUWCBjdHg7CisKKy8qCisgKiBNYWtlIHN1cmUgYXQgbGVhc3QgIm1pbiIgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLCBhbmQKKyAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCAqZmlsbChpbnQgbWluKQoreworCWlmIChtaW4gPD0gbGVuKQorCQlyZXR1cm4gYnVmZmVyICsgb2Zmc2V0OworCWlmIChtaW4gPiBzaXplb2YoYnVmZmVyKSkKKwkJZGllKCJjYW5ub3QgZmlsbCAlZCBieXRlcyIsIG1pbik7CisJaWYgKG9mZnNldCkgeworCQlTSEExX1VwZGF0ZSgmY3R4LCBidWZmZXIsIG9mZnNldCk7CisJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyBvZmZzZXQsIGxlbik7CisJCW9mZnNldCA9IDA7CisJfQorCWRvIHsKKwkJc3NpemVfdCByZXQgPSB4cmVhZCgwLCBidWZmZXIgKyBsZW4sIHNpemVvZihidWZmZXIpIC0gbGVuKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlpZiAoIXJldCkKKwkJCQlkaWUoImVhcmx5IEVPRiIpOworCQkJZGllKCJyZWFkIGVycm9yIG9uIGlucHV0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJbGVuICs9IHJldDsKKwl9IHdoaWxlIChsZW4gPCBtaW4pOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkIHVzZShpbnQgYnl0ZXMpCit7CisJaWYgKGJ5dGVzID4gbGVuKQorCQlkaWUoInVzZWQgbW9yZSBieXRlcyB0aGFuIHdlcmUgYXZhaWxhYmxlIik7CisJbGVuIC09IGJ5dGVzOworCW9mZnNldCArPSBieXRlczsKKworCS8qIG1ha2Ugc3VyZSBvZmZfdCBpcyBzdWZmaWNpZW50bHkgbGFyZ2Ugbm90IHRvIHdyYXAgKi8KKwlpZiAoY29uc3VtZWRfYnl0ZXMgPiBjb25zdW1lZF9ieXRlcyArIGJ5dGVzKQorCQlkaWUoInBhY2sgdG9vIGxhcmdlIGZvciBjdXJyZW50IGRlZmluaXRpb24gb2Ygb2ZmX3QiKTsKKwljb25zdW1lZF9ieXRlcyArPSBieXRlczsKK30KKworc3RhdGljIHZvaWQgKmdldF9kYXRhKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdm9pZCAqYnVmID0geG1hbGxvYyhzaXplKTsKKworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IGluZmxhdGUoJnN0cmVhbSwgMCk7CisJCXVzZShsZW4gLSBzdHJlYW0uYXZhaWxfaW4pOworCQlpZiAoc3RyZWFtLnRvdGFsX291dCA9PSBzaXplICYmIHJldCA9PSBaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJldCAhPSBaX09LKSB7CisJCQllcnJvcigiaW5mbGF0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJCWZyZWUoYnVmKTsKKwkJCWJ1ZiA9IE5VTEw7CisJCQlpZiAoIXJlY292ZXIpCisJCQkJZXhpdCgxKTsKKwkJCWhhc19lcnJvcnMgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCQlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJfQorCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IGRlbHRhX2luZm8geworCXVuc2lnbmVkIGNoYXIgYmFzZV9zaGExWzIwXTsKKwl1bnNpZ25lZCBucjsKKwlvZmZfdCBiYXNlX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqZGVsdGE7CisJc3RydWN0IGRlbHRhX2luZm8gKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGRlbHRhX2luZm8gKmRlbHRhX2xpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9kZWx0YV90b19saXN0KHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBjb25zdCBjaGFyICpiYXNlX3NoYTEsCisJCQkgICAgICBvZmZfdCBiYXNlX29mZnNldCwKKwkJCSAgICAgIHZvaWQgKmRlbHRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGRlbHRhX2luZm8gKmluZm8gPSB4bWFsbG9jKHNpemVvZigqaW5mbykpOworCisJaGFzaGNweShpbmZvLT5iYXNlX3NoYTEsIGJhc2Vfc2hhMSk7CisJaW5mby0+YmFzZV9vZmZzZXQgPSBiYXNlX29mZnNldDsKKwlpbmZvLT5zaXplID0gc2l6ZTsKKwlpbmZvLT5kZWx0YSA9IGRlbHRhOworCWluZm8tPm5yID0gbnI7CisJaW5mby0+bmV4dCA9IGRlbHRhX2xpc3Q7CisJZGVsdGFfbGlzdCA9IGluZm87Cit9CisKK3N0cnVjdCBvYmpfaW5mbyB7CisJb2ZmX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdGF0aWMgc3RydWN0IG9ial9pbmZvICpvYmpfbGlzdDsKKworc3RhdGljIHZvaWQgYWRkZWRfb2JqZWN0KHVuc2lnbmVkIG5yLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCQkgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgd3JpdGVfb2JqZWN0KHVuc2lnbmVkIG5yLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCQkgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGVuYW1lKHR5cGUpLCBvYmpfbGlzdFtucl0uc2hhMSkgPCAwKQorCQlkaWUoImZhaWxlZCB0byB3cml0ZSBvYmplY3QiKTsKKwlhZGRlZF9vYmplY3QobnIsIHR5cGUsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmVfZGVsdGEodW5zaWduZWQgbnIsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSAgdm9pZCAqYmFzZSwgdW5zaWduZWQgbG9uZyBiYXNlX3NpemUsCisJCQkgIHZvaWQgKmRlbHRhLCB1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUpCit7CisJdm9pZCAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcmVzdWx0X3NpemU7CisKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlLCBiYXNlX3NpemUsCisJCQkgICAgIGRlbHRhLCBkZWx0YV9zaXplLAorCQkJICAgICAmcmVzdWx0X3NpemUpOworCWlmICghcmVzdWx0KQorCQlkaWUoImZhaWxlZCB0byBhcHBseSBkZWx0YSIpOworCWZyZWUoZGVsdGEpOworCXdyaXRlX29iamVjdChuciwgdHlwZSwgcmVzdWx0LCByZXN1bHRfc2l6ZSk7CisJZnJlZShyZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBhZGRlZF9vYmplY3QodW5zaWduZWQgbnIsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGRlbHRhX2luZm8gKipwID0gJmRlbHRhX2xpc3Q7CisJc3RydWN0IGRlbHRhX2luZm8gKmluZm87CisKKwl3aGlsZSAoKGluZm8gPSAqcCkgIT0gTlVMTCkgeworCQlpZiAoIWhhc2hjbXAoaW5mby0+YmFzZV9zaGExLCBvYmpfbGlzdFtucl0uc2hhMSkgfHwKKwkJICAgIGluZm8tPmJhc2Vfb2Zmc2V0ID09IG9ial9saXN0W25yXS5vZmZzZXQpIHsKKwkJCSpwID0gaW5mby0+bmV4dDsKKwkJCXAgPSAmZGVsdGFfbGlzdDsKKwkJCXJlc29sdmVfZGVsdGEoaW5mby0+bnIsIHR5cGUsIGRhdGEsIHNpemUsCisJCQkJICAgICAgaW5mby0+ZGVsdGEsIGluZm8tPnNpemUpOworCQkJZnJlZShpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXAgPSAmaW5mby0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVucGFja19ub25fZGVsdGFfZW50cnkoZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgdW5zaWduZWQgbnIpCit7CisJdm9pZCAqYnVmID0gZ2V0X2RhdGEoc2l6ZSk7CisKKwlpZiAoIWRyeV9ydW4gJiYgYnVmKQorCQl3cml0ZV9vYmplY3QobnIsIHR5cGUsIGJ1Ziwgc2l6ZSk7CisJZnJlZShidWYpOworfQorCitzdGF0aWMgdm9pZCB1bnBhY2tfZGVsdGFfZW50cnkoZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsCisJCQkgICAgICAgdW5zaWduZWQgbnIpCit7CisJdm9pZCAqZGVsdGFfZGF0YSwgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBiYXNlX3NpemU7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCisJaWYgKHR5cGUgPT0gT0JKX1JFRl9ERUxUQSkgeworCQloYXNoY3B5KGJhc2Vfc2hhMSwgZmlsbCgyMCkpOworCQl1c2UoMjApOworCQlkZWx0YV9kYXRhID0gZ2V0X2RhdGEoZGVsdGFfc2l6ZSk7CisJCWlmIChkcnlfcnVuIHx8ICFkZWx0YV9kYXRhKSB7CisJCQlmcmVlKGRlbHRhX2RhdGEpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaGFzX3NoYTFfZmlsZShiYXNlX3NoYTEpKSB7CisJCQloYXNoY3B5KG9ial9saXN0W25yXS5zaGExLCBudWxsX3NoYTEpOworCQkJYWRkX2RlbHRhX3RvX2xpc3QobnIsIGJhc2Vfc2hhMSwgMCwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBiYXNlX2ZvdW5kID0gMDsKKwkJdW5zaWduZWQgY2hhciAqcGFjaywgYzsKKwkJb2ZmX3QgYmFzZV9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvLCBtaWQsIGhpOworCisJCXBhY2sgPSBmaWxsKDEpOworCQljID0gKnBhY2s7CisJCXVzZSgxKTsKKwkJYmFzZV9vZmZzZXQgPSBjICYgMTI3OworCQl3aGlsZSAoYyAmIDEyOCkgeworCQkJYmFzZV9vZmZzZXQgKz0gMTsKKwkJCWlmICghYmFzZV9vZmZzZXQgfHwgTVNCKGJhc2Vfb2Zmc2V0LCA3KSkKKwkJCQlkaWUoIm9mZnNldCB2YWx1ZSBvdmVyZmxvdyBmb3IgZGVsdGEgYmFzZSBvYmplY3QiKTsKKwkJCXBhY2sgPSBmaWxsKDEpOworCQkJYyA9ICpwYWNrOworCQkJdXNlKDEpOworCQkJYmFzZV9vZmZzZXQgPSAoYmFzZV9vZmZzZXQgPDwgNykgKyAoYyAmIDEyNyk7CisJCX0KKwkJYmFzZV9vZmZzZXQgPSBvYmpfbGlzdFtucl0ub2Zmc2V0IC0gYmFzZV9vZmZzZXQ7CisKKwkJZGVsdGFfZGF0YSA9IGdldF9kYXRhKGRlbHRhX3NpemUpOworCQlpZiAoZHJ5X3J1biB8fCAhZGVsdGFfZGF0YSkgeworCQkJZnJlZShkZWx0YV9kYXRhKTsKKwkJCXJldHVybjsKKwkJfQorCQlsbyA9IDA7CisJCWhpID0gbnI7CisJCXdoaWxlIChsbyA8IGhpKSB7CisJCQltaWQgPSAobG8gKyBoaSkvMjsKKwkJCWlmIChiYXNlX29mZnNldCA8IG9ial9saXN0W21pZF0ub2Zmc2V0KSB7CisJCQkJaGkgPSBtaWQ7CisJCQl9IGVsc2UgaWYgKGJhc2Vfb2Zmc2V0ID4gb2JqX2xpc3RbbWlkXS5vZmZzZXQpIHsKKwkJCQlsbyA9IG1pZCArIDE7CisJCQl9IGVsc2UgeworCQkJCWhhc2hjcHkoYmFzZV9zaGExLCBvYmpfbGlzdFttaWRdLnNoYTEpOworCQkJCWJhc2VfZm91bmQgPSAhaXNfbnVsbF9zaGExKGJhc2Vfc2hhMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFiYXNlX2ZvdW5kKSB7CisJCQkvKiBUaGUgZGVsdGEgYmFzZSBvYmplY3QgaXMgaXRzZWxmIGEgZGVsdGEgdGhhdAorCQkJICAgaGFzIG5vdCBiZWVuCXJlc29sdmVkIHlldC4gKi8KKwkJCWhhc2hjcHkob2JqX2xpc3RbbnJdLnNoYTEsIG51bGxfc2hhMSk7CisJCQlhZGRfZGVsdGFfdG9fbGlzdChuciwgbnVsbF9zaGExLCBiYXNlX29mZnNldCwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwliYXNlID0gcmVhZF9zaGExX2ZpbGUoYmFzZV9zaGExLCAmdHlwZSwgJmJhc2Vfc2l6ZSk7CisJaWYgKCFiYXNlKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gcmVhZCBkZWx0YS1wYWNrIGJhc2Ugb2JqZWN0ICVzIiwKKwkJICAgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJCWlmICghcmVjb3ZlcikKKwkJCWV4aXQoMSk7CisJCWhhc19lcnJvcnMgPSAxOworCQlyZXR1cm47CisJfQorCXJlc29sdmVfZGVsdGEobnIsIHR5cGUsIGJhc2UsIGJhc2Vfc2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJZnJlZShiYXNlKTsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX29uZSh1bnNpZ25lZCBucikKK3sKKwl1bnNpZ25lZCBzaGlmdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrLCBjOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisKKwlvYmpfbGlzdFtucl0ub2Zmc2V0ID0gY29uc3VtZWRfYnl0ZXM7CisKKwlwYWNrID0gZmlsbCgxKTsKKwljID0gKnBhY2s7CisJdXNlKDEpOworCXR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IChjICYgMTUpOworCXNoaWZ0ID0gNDsKKwl3aGlsZSAoYyAmIDB4ODApIHsKKwkJcGFjayA9IGZpbGwoMSk7CisJCWMgPSAqcGFjazsKKwkJdXNlKDEpOworCQlzaXplICs9IChjICYgMHg3ZikgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IDc7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPQkpfQ09NTUlUOgorCWNhc2UgT0JKX1RSRUU6CisJY2FzZSBPQkpfQkxPQjoKKwljYXNlIE9CSl9UQUc6CisJCXVucGFja19ub25fZGVsdGFfZW50cnkodHlwZSwgc2l6ZSwgbnIpOworCQlyZXR1cm47CisJY2FzZSBPQkpfUkVGX0RFTFRBOgorCWNhc2UgT0JKX09GU19ERUxUQToKKwkJdW5wYWNrX2RlbHRhX2VudHJ5KHR5cGUsIHNpemUsIG5yKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWVycm9yKCJiYWQgb2JqZWN0IHR5cGUgJWQiLCB0eXBlKTsKKwkJaGFzX2Vycm9ycyA9IDE7CisJCWlmIChyZWNvdmVyKQorCQkJcmV0dXJuOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5wYWNrX2FsbCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwcm9ncmVzcyBwcm9ncmVzczsKKwlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkciA9IGZpbGwoc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcikpOworCXVuc2lnbmVkIG5yX29iamVjdHMgPSBudG9obChoZHItPmhkcl9lbnRyaWVzKTsKKworCWlmIChudG9obChoZHItPmhkcl9zaWduYXR1cmUpICE9IFBBQ0tfU0lHTkFUVVJFKQorCQlkaWUoImJhZCBwYWNrIGZpbGUiKTsKKwlpZiAoIXBhY2tfdmVyc2lvbl9vayhoZHItPmhkcl92ZXJzaW9uKSkKKwkJZGllKCJ1bmtub3duIHBhY2sgZmlsZSB2ZXJzaW9uICVkIiwgbnRvaGwoaGRyLT5oZHJfdmVyc2lvbikpOworCXVzZShzaXplb2Yoc3RydWN0IHBhY2tfaGVhZGVyKSk7CisKKwlpZiAoIXF1aWV0KQorCQlzdGFydF9wcm9ncmVzcygmcHJvZ3Jlc3MsICJVbnBhY2tpbmcgJXUgb2JqZWN0cy4uLiIsICIiLCBucl9vYmplY3RzKTsKKwlvYmpfbGlzdCA9IHhtYWxsb2MobnJfb2JqZWN0cyAqIHNpemVvZigqb2JqX2xpc3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCXVucGFja19vbmUoaSk7CisJCWlmICghcXVpZXQpCisJCQlkaXNwbGF5X3Byb2dyZXNzKCZwcm9ncmVzcywgaSArIDEpOworCX0KKwlpZiAoIXF1aWV0KQorCQlzdG9wX3Byb2dyZXNzKCZwcm9ncmVzcyk7CisKKwlpZiAoZGVsdGFfbGlzdCkKKwkJZGllKCJ1bnJlc29sdmVkIGRlbHRhcyBsZWZ0IGFmdGVyIHVucGFja2luZyIpOworfQorCitpbnQgY21kX3VucGFja19vYmplY3RzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlxdWlldCA9ICFpc2F0dHkoMik7CisKKwlmb3IgKGkgPSAxIDsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJCWRyeV9ydW4gPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXEiKSkgeworCQkJCXF1aWV0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1yIikpIHsKKwkJCQlyZWNvdmVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcGFja19oZWFkZXI9IikpIHsKKwkJCQlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcjsKKwkJCQljaGFyICpjOworCisJCQkJaGRyID0gKHN0cnVjdCBwYWNrX2hlYWRlciAqKWJ1ZmZlcjsKKwkJCQloZHItPmhkcl9zaWduYXR1cmUgPSBodG9ubChQQUNLX1NJR05BVFVSRSk7CisJCQkJaGRyLT5oZHJfdmVyc2lvbiA9IGh0b25sKHN0cnRvdWwoYXJnICsgMTQsICZjLCAxMCkpOworCQkJCWlmICgqYyAhPSAnLCcpCisJCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCQloZHItPmhkcl9lbnRyaWVzID0gaHRvbmwoc3RydG91bChjICsgMSwgJmMsIDEwKSk7CisJCQkJaWYgKCpjKQorCQkJCQlkaWUoImJhZCAlcyIsIGFyZyk7CisJCQkJbGVuID0gc2l6ZW9mKCpoZHIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UodW5wYWNrX3VzYWdlKTsKKwkJfQorCisJCS8qIFdlIGRvbid0IHRha2UgYW55IG5vbi1mbGFnIGFyZ3VtZW50cyBub3cuLiBNYXliZSBzb21lIGRheSAqLworCQl1c2FnZSh1bnBhY2tfdXNhZ2UpOworCX0KKwlTSEExX0luaXQoJmN0eCk7CisJdW5wYWNrX2FsbCgpOworCVNIQTFfVXBkYXRlKCZjdHgsIGJ1ZmZlciwgb2Zmc2V0KTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChoYXNoY21wKGZpbGwoMjApLCBzaGExKSkKKwkJZGllKCJmaW5hbCBzaGExIGRpZCBub3QgbWF0Y2giKTsKKwl1c2UoMjApOworCisJLyogV3JpdGUgdGhlIGxhc3QgcGFydCBvZiB0aGUgYnVmZmVyIHRvIHN0ZG91dCAqLworCXdoaWxlIChsZW4pIHsKKwkJaW50IHJldCA9IHh3cml0ZSgxLCBidWZmZXIgKyBvZmZzZXQsIGxlbik7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlsZW4gLT0gcmV0OworCQlvZmZzZXQgKz0gcmV0OworCX0KKworCS8qIEFsbCBkb25lICovCisJcmV0dXJuIGhhc19lcnJvcnM7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXVwZGF0ZS1pbmRleC5jIGIvYnVpbHRpbi11cGRhdGUtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk4OTkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi11cGRhdGUtaW5kZXguYwpAQCAtMCwwICsxLDc1MSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworLyoKKyAqIERlZmF1bHQgdG8gbm90IGFsbG93aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZmlsZXMuIFRoZQorICogdG9vbCBkb2Vzbid0IGFjdHVhbGx5IGNhcmUsIGJ1dCB0aGlzIG1ha2VzIGl0IGhhcmRlciB0byBhZGQKKyAqIGZpbGVzIHRvIHRoZSByZXZpc2lvbiBjb250cm9sIGJ5IG1pc3Rha2UgYnkgZG9pbmcgc29tZXRoaW5nCisgKiBsaWtlICJnaXQtdXBkYXRlLWluZGV4ICoiIGFuZCBzdWRkZW5seSBoYXZpbmcgYWxsIHRoZSBvYmplY3QKKyAqIGZpbGVzIGJlIHJldmlzaW9uIGNvbnRyb2xsZWQuCisgKi8KK3N0YXRpYyBpbnQgYWxsb3dfYWRkOworc3RhdGljIGludCBhbGxvd19yZW1vdmU7CitzdGF0aWMgaW50IGFsbG93X3JlcGxhY2U7CitzdGF0aWMgaW50IGluZm9fb25seTsKK3N0YXRpYyBpbnQgZm9yY2VfcmVtb3ZlOworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBtYXJrX3ZhbGlkX29ubHk7CisjZGVmaW5lIE1BUktfVkFMSUQgMQorI2RlZmluZSBVTk1BUktfVkFMSUQgMgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2cDsKKworCWlmICghdmVyYm9zZSkKKwkJcmV0dXJuOworCisJdmFfc3RhcnQodnAsIGZtdCk7CisJdnByaW50ZihmbXQsIHZwKTsKKwlwdXRjaGFyKCdcbicpOworCXZhX2VuZCh2cCk7Cit9CisKK3N0YXRpYyBpbnQgbWFya192YWxpZChjb25zdCBjaGFyICpwYXRoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBuYW1lbGVuKTsKKwlpZiAoMCA8PSBwb3MpIHsKKwkJc3dpdGNoIChtYXJrX3ZhbGlkX29ubHkpIHsKKwkJY2FzZSBNQVJLX1ZBTElEOgorCQkJYWN0aXZlX2NhY2hlW3Bvc10tPmNlX2ZsYWdzIHw9IGh0b25zKENFX1ZBTElEKTsKKwkJCWJyZWFrOworCQljYXNlIFVOTUFSS19WQUxJRDoKKwkJCWFjdGl2ZV9jYWNoZVtwb3NdLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfVkFMSUQpOworCQkJYnJlYWs7CisJCX0KKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX29uZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKCFhbGxvd19yZW1vdmUpCisJCXJldHVybiBlcnJvcigiJXM6IGRvZXMgbm90IGV4aXN0IGFuZCAtLXJlbW92ZSBub3QgcGFzc2VkIiwgcGF0aCk7CisJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCByZW1vdmUgZnJvbSB0aGUgaW5kZXgiLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBhIHBhdGggdGhhdCBjb3VsZG4ndCBiZSBsc3RhdCdlZC4gSXQncyBlaXRoZXI6CisgKiAgLSBtaXNzaW5nIGZpbGUgKEVOT0VOVCBvciBFTk9URElSKS4gVGhhdCdzIG9rIGlmIHdlJ3JlCisgKiAgICBzdXBwb3NlZCB0byBiZSByZW1vdmluZyBpdCBhbmQgdGhlIHJlbW92YWwgYWN0dWFsbHkKKyAqICAgIHN1Y2NlZWRzLgorICogIC0gcGVybWlzc2lvbiBlcnJvci4gVGhhdCdzIG5ldmVyIG9rLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfbHN0YXRfZXJyb3IoY29uc3QgY2hhciAqcGF0aCwgaW50IGVycikKK3sKKwlpZiAoZXJyID09IEVOT0VOVCB8fCBlcnIgPT0gRU5PVERJUikKKwkJcmV0dXJuIHJlbW92ZV9vbmVfcGF0aChwYXRoKTsKKwlyZXR1cm4gZXJyb3IoImxzdGF0KFwiJXNcIik6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIGludCBhZGRfb25lX3BhdGgoc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4sIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbnQgb3B0aW9uLCBzaXplID0gY2FjaGVfZW50cnlfc2l6ZShsZW4pOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBsZW4pOworCWNlLT5jZV9mbGFncyA9IGh0b25zKGxlbik7CisJZmlsbF9zdGF0X2NhY2hlX2luZm8oY2UsIHN0KTsKKwljZS0+Y2VfbW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KG9sZCwgc3QtPnN0X21vZGUpOworCisJaWYgKGluZGV4X3BhdGgoY2UtPnNoYTEsIHBhdGgsIHN0LCAhaW5mb19vbmx5KSkKKwkJcmV0dXJuIC0xOworCW9wdGlvbiA9IGFsbG93X2FkZCA/IEFERF9DQUNIRV9PS19UT19BREQgOiAwOworCW9wdGlvbiB8PSBhbGxvd19yZXBsYWNlID8gQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgOiAwOworCWlmIChhZGRfY2FjaGVfZW50cnkoY2UsIG9wdGlvbikpCisJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCBhZGQgdG8gdGhlIGluZGV4IC0gbWlzc2luZyAtLWFkZCBvcHRpb24/IiwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBwYXRoIHRoYXQgd2FzIGEgZGlyZWN0b3J5LiBGb3VyIGNhc2VzOgorICoKKyAqICAtIGl0J3MgYWxyZWFkeSBhIGdpdGxpbmsgaW4gdGhlIGluZGV4LCBhbmQgd2Uga2VlcCBpdCB0aGF0CisgKiAgICB3YXksIGFuZCB1cGRhdGUgaXQgaWYgd2UgY2FuIChpZiB3ZSBjYW5ub3QgZmluZCB0aGUgSEVBRCwKKyAqICAgIHdlJ3JlIGdvaW5nIHRvIGtlZXAgaXQgdW5jaGFuZ2VkIGluIHRoZSBpbmRleCEpCisgKgorICogIC0gaXQncyBhICpmaWxlKiBpbiB0aGUgaW5kZXgsIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIGJlCisgKiAgICByZW1vdmVkIGFzIGEgZmlsZSBpZiByZW1vdmFsIGlzIGFsbG93ZWQsIHNpbmNlIGl0IGRvZXNuJ3QKKyAqICAgIGV4aXN0IGFzIHN1Y2ggYW55IG1vcmUuIElmIHJlbW92YWwgaXNuJ3QgYWxsb3dlZCwgaXQncworICogICAgYW4gZXJyb3IuCisgKgorICogICAgKE5PVEUhIFRoaXMgaXMgb2xkIGFuZCBhcmd1YWJseSBmYWlybHkgc3RyYW5nZSBiZWhhdmlvdXIuCisgKiAgICBXZSBtaWdodCB3YW50IHRvIG1ha2UgdGhpcyBhbiBlcnJvciB1bmNvbmRpdGlvbmFsbHksIGFuZAorICogICAgdXNlICItLWZvcmNlLXJlbW92ZSIgaWYgeW91IGFjdHVhbGx5IHdhbnQgdG8gZm9yY2UgcmVtb3ZhbCkuCisgKgorICogIC0gaXQgdXNlZCB0byBleGlzdCBhcyBhIHN1YmRpcmVjdG9yeSAoaWUgbXVsdGlwbGUgZmlsZXMgd2l0aAorICogICAgdGhpcyBwYXJ0aWN1bGFyIHByZWZpeCkgaW4gdGhlIGluZGV4LCBpbiB3aGljaCBjYXNlIGl0J3Mgd3JvbmcKKyAqICAgIHRvIHRyeSB0byB1cGRhdGUgaXQgYXMgYSBkaXJlY3RvcnkuCisgKgorICogIC0gaXQgZG9lc24ndCBleGlzdCBhdCBhbGwgaW4gdGhlIGluZGV4LCBidXQgaXQgaXMgYSB2YWxpZAorICogICAgZ2l0IGRpcmVjdG9yeSwgYW5kIGl0IHNob3VsZCBiZSAqYWRkZWQqIGFzIGEgZ2l0bGluay4KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2RpcmVjdG9yeShjb25zdCBjaGFyICpwYXRoLCBpbnQgbGVuLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbGVuKTsKKworCS8qIEV4YWN0IG1hdGNoOiBmaWxlIG9yIGV4aXN0aW5nIGdpdGxpbmsgKi8KKwlpZiAocG9zID49IDApIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlpZiAoU19JU0RJUkxOSyhudG9obChjZS0+Y2VfbW9kZSkpKSB7CisKKwkJCS8qIERvIG5vdGhpbmcgdG8gdGhlIGluZGV4IGlmIHRoZXJlIGlzIG5vIEhFQUQhICovCisJCQlpZiAocmVzb2x2ZV9naXRsaW5rX3JlZihwYXRoLCAiSEVBRCIsIHNoYTEpIDwgMCkKKwkJCQlyZXR1cm4gMDsKKworCQkJcmV0dXJuIGFkZF9vbmVfcGF0aChjZSwgcGF0aCwgbGVuLCBzdCk7CisJCX0KKwkJLyogU2hvdWxkIHRoaXMgYmUgYW4gdW5jb25kaXRpb25hbCBlcnJvcj8gKi8KKwkJcmV0dXJuIHJlbW92ZV9vbmVfcGF0aChwYXRoKTsKKwl9CisKKwkvKiBJbmV4YWN0IG1hdGNoOiBpcyB0aGVyZSBwZXJoYXBzIGEgc3ViZGlyZWN0b3J5IG1hdGNoPyAqLworCXBvcyA9IC1wb3MtMTsKKwl3aGlsZSAocG9zIDwgYWN0aXZlX25yKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zKytdOworCisJCWlmIChzdHJuY21wKGNlLT5uYW1lLCBwYXRoLCBsZW4pKQorCQkJYnJlYWs7CisJCWlmIChjZS0+bmFtZVtsZW5dID4gJy8nKQorCQkJYnJlYWs7CisJCWlmIChjZS0+bmFtZVtsZW5dIDwgJy8nKQorCQkJY29udGludWU7CisKKwkJLyogU3ViZGlyZWN0b3J5IG1hdGNoIC0gZXJyb3Igb3V0ICovCisJCXJldHVybiBlcnJvcigiJXM6IGlzIGEgZGlyZWN0b3J5IC0gYWRkIGluZGl2aWR1YWwgZmlsZXMgaW5zdGVhZCIsIHBhdGgpOworCX0KKworCS8qIE5vIG1hdGNoIC0gc2hvdWxkIHdlIGFkZCBpdCBhcyBhIGdpdGxpbms/ICovCisJaWYgKCFyZXNvbHZlX2dpdGxpbmtfcmVmKHBhdGgsICJIRUFEIiwgc2hhMSkpCisJCXJldHVybiBhZGRfb25lX3BhdGgoTlVMTCwgcGF0aCwgbGVuLCBzdCk7CisKKwkvKiBFcnJvciBvdXQuICovCisJcmV0dXJuIGVycm9yKCIlczogaXMgYSBkaXJlY3RvcnkgLSBhZGQgZmlsZXMgaW5zaWRlIGluc3RlYWQiLCBwYXRoKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSByZWd1bGFyIGZpbGUKKyAqLworc3RhdGljIGludCBwcm9jZXNzX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbiwgc3RydWN0IHN0YXQgKnN0KQoreworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBsZW4pOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBwb3MgPCAwID8gTlVMTCA6IGFjdGl2ZV9jYWNoZVtwb3NdOworCisJaWYgKGNlICYmIFNfSVNESVJMTksobnRvaGwoY2UtPmNlX21vZGUpKSkKKwkJcmV0dXJuIGVycm9yKCIlcyBpcyBhbHJlYWR5IGEgZ2l0bGluaywgbm90IHJlcGxhY2luZyIsIHBhdGgpOworCisJcmV0dXJuIGFkZF9vbmVfcGF0aChjZSwgcGF0aCwgbGVuLCBzdCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qIFdlIHByb2JhYmx5IHdhbnQgdG8gZG8gdGhpcyBpbiByZW1vdmVfZmlsZV9mcm9tX2NhY2hlKCkgYW5kCisJICogYWRkX2NhY2hlX2VudHJ5KCkgaW5zdGVhZC4uLgorCSAqLworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKworCS8qCisJICogRmlyc3QgdGhpbmdzIGZpcnN0OiBnZXQgdGhlIHN0YXQgaW5mb3JtYXRpb24sIHRvIGRlY2lkZQorCSAqIHdoYXQgdG8gZG8gYWJvdXQgdGhlIHBhdGhuYW1lIQorCSAqLworCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIHByb2Nlc3NfbHN0YXRfZXJyb3IocGF0aCwgZXJybm8pOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gcHJvY2Vzc19kaXJlY3RvcnkocGF0aCwgbGVuLCAmc3QpOworCisJcmV0dXJuIHByb2Nlc3NfZmlsZShwYXRoLCBsZW4sICZzdCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2NhY2hlaW5mbyh1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSBjb25zdCBjaGFyICpwYXRoLCBpbnQgc3RhZ2UpCit7CisJaW50IHNpemUsIGxlbiwgb3B0aW9uOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoIXZlcmlmeV9wYXRoKHBhdGgpKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisKKwloYXNoY3B5KGNlLT5zaGExLCBzaGExKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIGxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpOworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUobW9kZSk7CisJaWYgKGFzc3VtZV91bmNoYW5nZWQpCisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9WQUxJRCk7CisJb3B0aW9uID0gYWxsb3dfYWRkID8gQUREX0NBQ0hFX09LX1RPX0FERCA6IDA7CisJb3B0aW9uIHw9IGFsbG93X3JlcGxhY2UgPyBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSA6IDA7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgb3B0aW9uKSkKKwkJcmV0dXJuIGVycm9yKCIlczogY2Fubm90IGFkZCB0byB0aGUgaW5kZXggLSBtaXNzaW5nIC0tYWRkIG9wdGlvbj8iLAorCQkJICAgICBwYXRoKTsKKwlyZXBvcnQoImFkZCAnJXMnIiwgcGF0aCk7CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaG1vZF9wYXRoKGludCBmbGlwLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwb3M7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCXBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIHN0cmxlbihwYXRoKSk7CisJaWYgKHBvcyA8IDApCisJCWdvdG8gZmFpbDsKKwljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCW1vZGUgPSBudG9obChjZS0+Y2VfbW9kZSk7CisJaWYgKCFTX0lTUkVHKG1vZGUpKQorCQlnb3RvIGZhaWw7CisJc3dpdGNoIChmbGlwKSB7CisJY2FzZSAnKyc6CisJCWNlLT5jZV9tb2RlIHw9IGh0b25sKDAxMTEpOyBicmVhazsKKwljYXNlICctJzoKKwkJY2UtPmNlX21vZGUgJj0gaHRvbmwofjAxMTEpOyBicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisJfQorCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJcmVwb3J0KCJjaG1vZCAlY3ggJyVzJyIsIGZsaXAsIHBhdGgpOworCXJldHVybjsKKyBmYWlsOgorCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogY2Fubm90IGNobW9kICVjeCAnJXMnIiwgZmxpcCwgcGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwljb25zdCBjaGFyICpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBwYXRoKTsKKwlpZiAoIXZlcmlmeV9wYXRoKHApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChtYXJrX3ZhbGlkX29ubHkpIHsKKwkJaWYgKG1hcmtfdmFsaWQocCkpCisJCQlkaWUoIlVuYWJsZSB0byBtYXJrIGZpbGUgJXMiLCBwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCisJaWYgKGZvcmNlX3JlbW92ZSkgeworCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwKSkKKwkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCQlyZXBvcnQoInJlbW92ZSAnJXMnIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChwcm9jZXNzX3BhdGgocCkpCisJCWRpZSgiVW5hYmxlIHRvIHByb2Nlc3MgcGF0aCAlcyIsIHBhdGgpOworCXJlcG9ydCgiYWRkICclcyciLCBwYXRoKTsKKyBmcmVlX3JldHVybjoKKwlpZiAocCA8IHBhdGggfHwgcCA+IHBhdGggKyBzdHJsZW4ocGF0aCkpCisJCWZyZWUoKGNoYXIqKXApOworfQorCitzdGF0aWMgdm9pZCByZWFkX2luZGV4X2luZm8oaW50IGxpbmVfdGVybWluYXRpb24pCit7CisJc3RydWN0IHN0cmJ1ZiBidWY7CisJc3RyYnVmX2luaXQoJmJ1Zik7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqcHRyLCAqdGFiOworCQljaGFyICpwYXRoX25hbWU7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCXVuc2lnbmVkIGludCBtb2RlOworCQl1bnNpZ25lZCBsb25nIHVsOworCQlpbnQgc3RhZ2U7CisKKwkJLyogVGhpcyByZWFkcyBsaW5lcyBmb3JtYXR0ZWQgaW4gb25lIG9mIHRocmVlIGZvcm1hdHM6CisJCSAqCisJCSAqICgxKSBtb2RlICAgICAgICAgU1Agc2hhMSAgICAgICAgICBUQUIgcGF0aAorCQkgKiBUaGUgZmlyc3QgZm9ybWF0IGlzIHdoYXQgImdpdC1hcHBseSAtLWluZGV4LWluZm8iCisJCSAqIHJlcG9ydHMsIGFuZCB1c2VkIHRvIHJlY29uc3RydWN0IGEgcGFydGlhbCB0cmVlCisJCSAqIHRoYXQgaXMgdXNlZCBmb3IgcGhvbnkgbWVyZ2UgYmFzZSB0cmVlIHdoZW4gZmFsbGluZworCQkgKiBiYWNrIG9uIDMtd2F5IG1lcmdlLgorCQkgKgorCQkgKiAoMikgbW9kZSBTUCB0eXBlIFNQIHNoYTEgICAgICAgICAgVEFCIHBhdGgKKwkJICogVGhlIHNlY29uZCBmb3JtYXQgaXMgdG8gc3R1ZmYgZ2l0LWxzLXRyZWUgb3V0cHV0CisJCSAqIGludG8gdGhlIGluZGV4IGZpbGUuCisJCSAqCisJCSAqICgzKSBtb2RlICAgICAgICAgU1Agc2hhMSBTUCBzdGFnZSBUQUIgcGF0aAorCQkgKiBUaGlzIGZvcm1hdCBpcyB0byBwdXQgaGlnaGVyIG9yZGVyIHN0YWdlcyBpbnRvIHRoZQorCQkgKiBpbmRleCBmaWxlIGFuZCBtYXRjaGVzIGdpdC1scy1maWxlcyAtLXN0YWdlIG91dHB1dC4KKwkJICovCisJCXJlYWRfbGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCWlmIChidWYuZW9mKQorCQkJYnJlYWs7CisKKwkJZXJybm8gPSAwOworCQl1bCA9IHN0cnRvdWwoYnVmLmJ1ZiwgJnB0ciwgOCk7CisJCWlmIChwdHIgPT0gYnVmLmJ1ZiB8fCAqcHRyICE9ICcgJworCQkgICAgfHwgZXJybm8gfHwgKHVuc2lnbmVkIGludCkgdWwgIT0gdWwpCisJCQlnb3RvIGJhZF9saW5lOworCQltb2RlID0gdWw7CisKKwkJdGFiID0gc3RyY2hyKHB0ciwgJ1x0Jyk7CisJCWlmICghdGFiIHx8IHRhYiAtIHB0ciA8IDQxKQorCQkJZ290byBiYWRfbGluZTsKKworCQlpZiAodGFiWy0yXSA9PSAnICcgJiYgJzAnIDw9IHRhYlstMV0gJiYgdGFiWy0xXSA8PSAnMycpIHsKKwkJCXN0YWdlID0gdGFiWy0xXSAtICcwJzsKKwkJCXB0ciA9IHRhYiArIDE7IC8qIHBvaW50IGF0IHRoZSBoZWFkIG9mIHBhdGggKi8KKwkJCXRhYiA9IHRhYiAtIDI7IC8qIHBvaW50IGF0IHRhaWwgb2Ygc2hhMSAqLworCQl9CisJCWVsc2UgeworCQkJc3RhZ2UgPSAwOworCQkJcHRyID0gdGFiICsgMTsgLyogcG9pbnQgYXQgdGhlIGhlYWQgb2YgcGF0aCAqLworCQl9CisKKwkJaWYgKGdldF9zaGExX2hleCh0YWIgLSA0MCwgc2hhMSkgfHwgdGFiWy00MV0gIT0gJyAnKQorCQkJZ290byBiYWRfbGluZTsKKworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBwdHJbMF0gPT0gJyInKQorCQkJcGF0aF9uYW1lID0gdW5xdW90ZV9jX3N0eWxlKHB0ciwgTlVMTCk7CisJCWVsc2UKKwkJCXBhdGhfbmFtZSA9IHB0cjsKKworCQlpZiAoIXZlcmlmeV9wYXRoKHBhdGhfbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aF9uYW1lKTsKKwkJCWlmIChwYXRoX25hbWUgIT0gcHRyKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoX25hbWUpOworCisJCWlmICghbW9kZSkgeworCQkJLyogbW9kZSA9PSAwIG1lYW5zIHRoZXJlIGlzIG5vIHN1Y2ggcGF0aCAtLSByZW1vdmUgKi8KKwkJCWlmIChyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGhfbmFtZSkpCisJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiB1bmFibGUgdG8gcmVtb3ZlICVzIiwKKwkJCQkgICAgcHRyKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIG1vZGUgJyAnIHNoYTEgJ1x0JyBuYW1lCisJCQkgKiBwdHJbLTFdIHBvaW50cyBhdCB0YWIsCisJCQkgKiBwdHJbLTQxXSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHNoYTEKKwkJCSAqLworCQkJcHRyWy00Ml0gPSBwdHJbLTFdID0gMDsKKwkJCWlmIChhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYTEsIHBhdGhfbmFtZSwgc3RhZ2UpKQorCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogdW5hYmxlIHRvIHVwZGF0ZSAlcyIsCisJCQkJICAgIHBhdGhfbmFtZSk7CisJCX0KKwkJaWYgKHBhdGhfbmFtZSAhPSBwdHIpCisJCQlmcmVlKHBhdGhfbmFtZSk7CisJCWNvbnRpbnVlOworCisJYmFkX2xpbmU6CisJCWRpZSgibWFsZm9ybWVkIGluZGV4IGluZm8gJXMiLCBidWYuYnVmKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHVwZGF0ZV9pbmRleF91c2FnZVtdID0KKyJnaXQtdXBkYXRlLWluZGV4IFstcV0gWy0tYWRkXSBbLS1yZXBsYWNlXSBbLS1yZW1vdmVdIFstLXVubWVyZ2VkXSBbLS1yZWZyZXNoXSBbLS1yZWFsbHktcmVmcmVzaF0gWy0tY2FjaGVpbmZvXSBbLS1jaG1vZD0oK3wtKXhdIFstLWFzc3VtZS11bmNoYW5nZWRdIFstLWluZm8tb25seV0gWy0tZm9yY2UtcmVtb3ZlXSBbLS1zdGRpbl0gWy0taW5kZXgtaW5mb10gWy0tdW5yZXNvbHZlXSBbLS1hZ2FpbiB8IC1nXSBbLS1pZ25vcmUtbWlzc2luZ10gWy16XSBbLS12ZXJib3NlXSBbLS1dIDxmaWxlPi4uLiI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtZXJnZV9oZWFkX3NoYTFbMjBdOworCitzdGF0aWMgc3RydWN0IGNhY2hlX2VudHJ5ICpyZWFkX29uZV9lbnQoY29uc3QgY2hhciAqd2hpY2gsCisJCQkJCXVuc2lnbmVkIGNoYXIgKmVudCwgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJaW50IG5hbWVsZW4sIGludCBzdGFnZSkKK3sKKwl1bnNpZ25lZCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHNpemU7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmIChnZXRfdHJlZV9lbnRyeShlbnQsIHBhdGgsIHNoYTEsICZtb2RlKSkgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBpbiAlcyBicmFuY2guIiwgcGF0aCwgd2hpY2gpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1vZGUgPT0gU19JRkRJUikgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBhIGJsb2IgaW4gJXMgYnJhbmNoLiIsIHBhdGgsIHdoaWNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCWhhc2hjcHkoY2UtPnNoYTEsIHNoYTEpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKG5hbWVsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCXJldHVybiBjZTsKK30KKworc3RhdGljIGludCB1bnJlc29sdmVfb25lKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaW50IHBvczsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlXzIgPSBOVUxMLCAqY2VfMyA9IE5VTEw7CisKKwkvKiBTZWUgaWYgdGhlcmUgaXMgc3VjaCBlbnRyeSBpbiB0aGUgaW5kZXguICovCisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJaWYgKHBvcyA8IDApIHsKKwkJLyogSWYgdGhlcmUgaXNuJ3QsIGVpdGhlciBpdCBpcyB1bm1lcmdlZCwgb3IKKwkJICogcmVzb2x2ZWQgYXMgInJlbW92ZWQiIGJ5IG1pc3Rha2UuICBXZSBkbyBub3QKKwkJICogd2FudCB0byBkbyBhbnl0aGluZyBpbiB0aGUgZm9ybWVyIGNhc2UuCisJCSAqLworCQlwb3MgPSAtcG9zLTE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChjZV9uYW1lbGVuKGNlKSA9PSBuYW1lbGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBza2lwcGluZyBzdGlsbCB1bm1lcmdlZCBwYXRoLlxuIiwKKwkJCQkJcGF0aCk7CisJCQkJZ290byBmcmVlX3JldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qIEdyYWIgYmxvYnMgZnJvbSBnaXZlbiBwYXRoIGZyb20gSEVBRCBhbmQgTUVSR0VfSEVBRCwKKwkgKiBzdHVmZiBIRUFEIHZlcnNpb24gaW4gc3RhZ2UgIzIsCisJICogc3R1ZmYgTUVSR0VfSEVBRCB2ZXJzaW9uIGluIHN0YWdlICMzLgorCSAqLworCWNlXzIgPSByZWFkX29uZV9lbnQoIm91ciIsIGhlYWRfc2hhMSwgcGF0aCwgbmFtZWxlbiwgMik7CisJY2VfMyA9IHJlYWRfb25lX2VudCgidGhlaXIiLCBtZXJnZV9oZWFkX3NoYTEsIHBhdGgsIG5hbWVsZW4sIDMpOworCisJaWYgKCFjZV8yIHx8ICFjZV8zKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAoIWhhc2hjbXAoY2VfMi0+c2hhMSwgY2VfMy0+c2hhMSkgJiYKKwkgICAgY2VfMi0+Y2VfbW9kZSA9PSBjZV8zLT5jZV9tb2RlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGlkZW50aWNhbCBpbiBib3RoLCBza2lwcGluZy5cbiIsCisJCQlwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisKKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKTsKKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlXzIsIEFERF9DQUNIRV9PS19UT19BREQpKSB7CisJCWVycm9yKCIlczogY2Fubm90IGFkZCBvdXIgdmVyc2lvbiB0byB0aGUgaW5kZXguIiwgcGF0aCk7CisJCXJldCA9IC0xOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAoIWFkZF9jYWNoZV9lbnRyeShjZV8zLCBBRERfQ0FDSEVfT0tfVE9fQUREKSkKKwkJcmV0dXJuIDA7CisJZXJyb3IoIiVzOiBjYW5ub3QgYWRkIHRoZWlyIHZlcnNpb24gdG8gdGhlIGluZGV4LiIsIHBhdGgpOworCXJldCA9IC0xOworIGZyZWVfcmV0dXJuOgorCWZyZWUoY2VfMik7CisJZnJlZShjZV8zKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWFkX2hlYWRfcG9pbnRlcnModm9pZCkKK3sKKwlpZiAocmVhZF9yZWYoIkhFQUQiLCBoZWFkX3NoYTEpKQorCQlkaWUoIk5vIEhFQUQgLS0gbm8gaW5pdGlhbCBjb21taXQgeWV0P1xuIik7CisJaWYgKHJlYWRfcmVmKCJNRVJHRV9IRUFEIiwgbWVyZ2VfaGVhZF9zaGExKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UuXG4iKTsKKwkJZXhpdCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fdW5yZXNvbHZlKGludCBhYywgY29uc3QgY2hhciAqKmF2LAorCQkJY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFJlYWQgSEVBRCBhbmQgTUVSR0VfSEVBRDsgaWYgTUVSR0VfSEVBRCBkb2VzIG5vdCBleGlzdCwgd2UKKwkgKiBhcmUgbm90IGRvaW5nIGEgbWVyZ2UsIHNvIGV4aXQgd2l0aCBzdWNjZXNzIHN0YXR1cy4KKwkgKi8KKwlyZWFkX2hlYWRfcG9pbnRlcnMoKTsKKworCWZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2W2ldOworCQljb25zdCBjaGFyICpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBhcmcpOworCQllcnIgfD0gdW5yZXNvbHZlX29uZShwKTsKKwkJaWYgKHAgPCBhcmcgfHwgcCA+IGFyZyArIHN0cmxlbihhcmcpKQorCQkJZnJlZSgoY2hhciopcCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmV1cGRhdGUoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsCisJCSAgICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCS8qIFJlYWQgSEVBRCBhbmQgcnVuIHVwZGF0ZS1pbmRleCBvbiBwYXRocyB0aGF0IGFyZQorCSAqIG1lcmdlZCBhbmQgYWxyZWFkeSBkaWZmZXJlbnQgYmV0d2VlbiBpbmRleCBhbmQgSEVBRC4KKwkgKi8KKwlpbnQgcG9zOworCWludCBoYXNfaGVhZCA9IDE7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXYgKyAxKTsKKworCWlmIChyZWFkX3JlZigiSEVBRCIsIGhlYWRfc2hhMSkpCisJCS8qIElmIHRoZXJlIGlzIG5vIEhFQUQsIHRoYXQgbWVhbnMgaXQgaXMgYW4gaW5pdGlhbAorCQkgKiBjb21taXQuICBVcGRhdGUgZXZlcnl0aGluZyBpbiB0aGUgaW5kZXguCisJCSAqLworCQloYXNfaGVhZCA9IDA7CisgcmVkbzoKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGFjdGl2ZV9ucjsgcG9zKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCA9IE5VTEw7CisJCWludCBzYXZlX25yOworCisJCWlmIChjZV9zdGFnZShjZSkgfHwgIWNlX3BhdGhfbWF0Y2goY2UsIHBhdGhzcGVjKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaGFzX2hlYWQpCisJCQlvbGQgPSByZWFkX29uZV9lbnQoTlVMTCwgaGVhZF9zaGExLAorCQkJCQkgICBjZS0+bmFtZSwgY2VfbmFtZWxlbihjZSksIDApOworCQlpZiAob2xkICYmIGNlLT5jZV9tb2RlID09IG9sZC0+Y2VfbW9kZSAmJgorCQkgICAgIWhhc2hjbXAoY2UtPnNoYTEsIG9sZC0+c2hhMSkpIHsKKwkJCWZyZWUob2xkKTsKKwkJCWNvbnRpbnVlOyAvKiB1bmNoYW5nZWQgKi8KKwkJfQorCQkvKiBCZSBjYXJlZnVsLiAgVGhlIHdvcmtpbmcgdHJlZSBtYXkgbm90IGhhdmUgdGhlCisJCSAqIHBhdGggYW55bW9yZSwgaW4gd2hpY2ggY2FzZSwgdW5kZXIgJ2FsbG93X3JlbW92ZScsCisJCSAqIG9yIHdvcnNlIHlldCAnYWxsb3dfcmVwbGFjZScsIGFjdGl2ZV9uciBtYXkgZGVjcmVhc2UuCisJCSAqLworCQlzYXZlX25yID0gYWN0aXZlX25yOworCQl1cGRhdGVfb25lKGNlLT5uYW1lICsgcHJlZml4X2xlbmd0aCwgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJaWYgKHNhdmVfbnIgIT0gYWN0aXZlX25yKQorCQkJZ290byByZWRvOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF91cGRhdGVfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5ld2ZkLCBlbnRyaWVzLCBoYXNfZXJyb3JzID0gMCwgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CisJaW50IGFsbG93X29wdGlvbnMgPSAxOworCWludCByZWFkX2Zyb21fc3RkaW4gPSAwOworCWludCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCWNoYXIgc2V0X2V4ZWN1dGFibGVfYml0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF9mbGFncyA9IDA7CisJaW50IGxvY2tfZXJyb3IgPSAwOworCXN0cnVjdCBsb2NrX2ZpbGUgKmxvY2tfZmlsZTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCS8qIFdlIGNhbid0IGZyZWUgdGhpcyBtZW1vcnksIGl0IGJlY29tZXMgcGFydCBvZiBhIGxpbmtlZCBsaXN0IHBhcnNlZCBhdGV4aXQoKSAqLworCWxvY2tfZmlsZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgobG9ja19maWxlLCAwKTsKKwlpZiAobmV3ZmQgPCAwKQorCQlsb2NrX2Vycm9yID0gZXJybm87CisKKwllbnRyaWVzID0gcmVhZF9jYWNoZSgpOworCWlmIChlbnRyaWVzIDwgMCkKKwkJZGllKCJjYWNoZSBjb3JydXB0ZWQiKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBhcmd2W2ldOworCQljb25zdCBjaGFyICpwOworCisJCWlmIChhbGxvd19vcHRpb25zICYmICpwYXRoID09ICctJykgeworCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tIikpIHsKKwkJCQlhbGxvd19vcHRpb25zID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItcSIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1FVSUVUOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWRkIikpIHsKKwkJCQlhbGxvd19hZGQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVwbGFjZSIpKSB7CisJCQkJYWxsb3dfcmVwbGFjZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZW1vdmUiKSkgeworCQkJCWFsbG93X3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bm1lcmdlZCIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1VOTUVSR0VEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVmcmVzaCIpKSB7CisJCQkJaGFzX2Vycm9ycyB8PSByZWZyZXNoX2NhY2hlKHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVhbGx5LXJlZnJlc2giKSkgeworCQkJCWhhc19lcnJvcnMgfD0gcmVmcmVzaF9jYWNoZShSRUZSRVNIX1JFQUxMWSB8IHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tY2FjaGVpbmZvIikpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJCXVuc2lnbmVkIGludCBtb2RlOworCisJCQkJaWYgKGkrMyA+PSBhcmdjKQorCQkJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IC0tY2FjaGVpbmZvIDxtb2RlPiA8c2hhMT4gPHBhdGg+Iik7CisKKwkJCQlpZiAoc3RydG91bF91aShhcmd2W2krMV0sIDgsICZtb2RlKSB8fAorCQkJCSAgICBnZXRfc2hhMV9oZXgoYXJndltpKzJdLCBzaGExKSB8fAorCQkJCSAgICBhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYTEsIGFyZ3ZbaSszXSwgMCkpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogLS1jYWNoZWluZm8iCisJCQkJCSAgICAiIGNhbm5vdCBhZGQgJXMiLCBhcmd2W2krM10pOworCQkJCWkgKz0gMzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWNobW9kPS14IikgfHwKKwkJCSAgICAhc3RyY21wKHBhdGgsICItLWNobW9kPSt4IikpIHsKKwkJCQlpZiAoYXJnYyA8PSBpKzEpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogJXMgPHBhdGg+IiwgcGF0aCk7CisJCQkJc2V0X2V4ZWN1dGFibGVfYml0ID0gcGF0aFs4XTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWFzc3VtZS11bmNoYW5nZWQiKSkgeworCQkJCW1hcmtfdmFsaWRfb25seSA9IE1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1uby1hc3N1bWUtdW5jaGFuZ2VkIikpIHsKKwkJCQltYXJrX3ZhbGlkX29ubHkgPSBVTk1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1pbmZvLW9ubHkiKSkgeworCQkJCWluZm9fb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1mb3JjZS1yZW1vdmUiKSkgeworCQkJCWZvcmNlX3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLXoiKSkgeworCQkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tc3RkaW4iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0tc3RkaW4gbXVzdCBiZSBhdCB0aGUgZW5kIik7CisJCQkJcmVhZF9mcm9tX3N0ZGluID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWluZGV4LWluZm8iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0taW5kZXgtaW5mbyBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCQlhbGxvd19hZGQgPSBhbGxvd19yZXBsYWNlID0gYWxsb3dfcmVtb3ZlID0gMTsKKwkJCQlyZWFkX2luZGV4X2luZm8obGluZV90ZXJtaW5hdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bnJlc29sdmUiKSkgeworCQkJCWhhc19lcnJvcnMgPSBkb191bnJlc29sdmUoYXJnYyAtIGksIGFyZ3YgKyBpLAorCQkJCQkJCSAgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJCQlpZiAoaGFzX2Vycm9ycykKKwkJCQkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAwOworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWdhaW4iKSB8fCAhc3RyY21wKHBhdGgsICItZyIpKSB7CisJCQkJaGFzX2Vycm9ycyA9IGRvX3JldXBkYXRlKGFyZ2MgLSBpLCBhcmd2ICsgaSwKKwkJCQkJCQkgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJCQlpZiAoaGFzX2Vycm9ycykKKwkJCQkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAwOworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0taWdub3JlLW1pc3NpbmciKSkgeworCQkJCXJlZnJlc2hfZmxhZ3MgfD0gUkVGUkVTSF9JR05PUkVfTUlTU0lORzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLXZlcmJvc2UiKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi1oIikgfHwgIXN0cmNtcChwYXRoLCAiLS1oZWxwIikpCisJCQkJdXNhZ2UodXBkYXRlX2luZGV4X3VzYWdlKTsKKwkJCWRpZSgidW5rbm93biBvcHRpb24gJXMiLCBwYXRoKTsKKwkJfQorCQlwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBwYXRoKTsKKwkJdXBkYXRlX29uZShwLCBOVUxMLCAwKTsKKwkJaWYgKHNldF9leGVjdXRhYmxlX2JpdCkKKwkJCWNobW9kX3BhdGgoc2V0X2V4ZWN1dGFibGVfYml0LCBwKTsKKwkJaWYgKHAgPCBwYXRoIHx8IHAgPiBwYXRoICsgc3RybGVuKHBhdGgpKQorCQkJZnJlZSgoY2hhciopcCk7CisJfQorCWlmIChyZWFkX2Zyb21fc3RkaW4pIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCXN0cmJ1Zl9pbml0KCZidWYpOworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqcGF0aF9uYW1lOworCQkJY29uc3QgY2hhciAqcDsKKwkJCXJlYWRfbGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCQlpZiAoYnVmLmVvZikKKwkJCQlicmVhazsKKwkJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIGJ1Zi5idWZbMF0gPT0gJyInKQorCQkJCXBhdGhfbmFtZSA9IHVucXVvdGVfY19zdHlsZShidWYuYnVmLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlwYXRoX25hbWUgPSBidWYuYnVmOworCQkJcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgcGF0aF9uYW1lKTsKKwkJCXVwZGF0ZV9vbmUocCwgTlVMTCwgMCk7CisJCQlpZiAoc2V0X2V4ZWN1dGFibGVfYml0KQorCQkJCWNobW9kX3BhdGgoc2V0X2V4ZWN1dGFibGVfYml0LCBwKTsKKwkJCWlmIChwIDwgcGF0aF9uYW1lIHx8IHAgPiBwYXRoX25hbWUgKyBzdHJsZW4ocGF0aF9uYW1lKSkKKwkJCQlmcmVlKChjaGFyKikgcCk7CisJCQlpZiAocGF0aF9uYW1lICE9IGJ1Zi5idWYpCisJCQkJZnJlZShwYXRoX25hbWUpOworCQl9CisJfQorCisgZmluaXNoOgorCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCkgeworCQlpZiAobmV3ZmQgPCAwKSB7CisJCQlpZiAocmVmcmVzaF9mbGFncyAmIFJFRlJFU0hfUVVJRVQpCisJCQkJZXhpdCgxMjgpOworCQkJZGllKCJ1bmFibGUgdG8gY3JlYXRlICclcy5sb2NrJzogJXMiLAorCQkJICAgIGdldF9pbmRleF9maWxlKCksIHN0cmVycm9yKGxvY2tfZXJyb3IpKTsKKwkJfQorCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrZWRfaW5kZXgobG9ja19maWxlKSkKKwkJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJfQorCisJcm9sbGJhY2tfbG9ja19maWxlKGxvY2tfZmlsZSk7CisKKwlyZXR1cm4gaGFzX2Vycm9ycyA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi11cGRhdGUtcmVmLmMgYi9idWlsdGluLXVwZGF0ZS1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWU5NjBiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi11cGRhdGUtcmVmLmMKQEAgLTAsMCArMSw2OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X3VwZGF0ZV9yZWZfdXNhZ2VbXSA9CisiZ2l0LXVwZGF0ZS1yZWYgWy1tIDxyZWFzb24+XSAoLWQgPHJlZm5hbWU+IDx2YWx1ZT4gfCA8cmVmbmFtZT4gPHZhbHVlPiBbPG9sZHZhbD5dKSI7CisKK2ludCBjbWRfdXBkYXRlX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpyZWZuYW1lPU5VTEwsICp2YWx1ZT1OVUxMLCAqb2xkdmFsPU5VTEwsICptc2c9TlVMTDsKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgb2xkc2hhMVsyMF07CisJaW50IGksIGRlbGV0ZTsKKworCWRlbGV0ZSA9IDA7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcCgiLW0iLCBhcmd2W2ldKSkgeworCQkJaWYgKGkrMSA+PSBhcmdjKQorCQkJCXVzYWdlKGdpdF91cGRhdGVfcmVmX3VzYWdlKTsKKwkJCW1zZyA9IGFyZ3ZbKytpXTsKKwkJCWlmICghKm1zZykKKwkJCQlkaWUoIlJlZnVzaW5nIHRvIHBlcmZvcm0gdXBkYXRlIHdpdGggZW1wdHkgbWVzc2FnZS4iKTsKKwkJCWlmIChzdHJjaHIobXNnLCAnXG4nKSkKKwkJCQlkaWUoIlJlZnVzaW5nIHRvIHBlcmZvcm0gdXBkYXRlIHdpdGggXFxuIGluIG1lc3NhZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWQiLCBhcmd2W2ldKSkgeworCQkJZGVsZXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcmVmbmFtZSkgeworCQkJcmVmbmFtZSA9IGFyZ3ZbaV07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXZhbHVlKSB7CisJCQl2YWx1ZSA9IGFyZ3ZbaV07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW9sZHZhbCkgeworCQkJb2xkdmFsID0gYXJndltpXTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCWlmICghcmVmbmFtZSB8fCAhdmFsdWUpCisJCXVzYWdlKGdpdF91cGRhdGVfcmVmX3VzYWdlKTsKKworCWlmIChnZXRfc2hhMSh2YWx1ZSwgc2hhMSkpCisJCWRpZSgiJXM6IG5vdCBhIHZhbGlkIFNIQTEiLCB2YWx1ZSk7CisKKwlpZiAoZGVsZXRlKSB7CisJCWlmIChvbGR2YWwpCisJCQl1c2FnZShnaXRfdXBkYXRlX3JlZl91c2FnZSk7CisJCXJldHVybiBkZWxldGVfcmVmKHJlZm5hbWUsIHNoYTEpOworCX0KKworCWhhc2hjbHIob2xkc2hhMSk7CisJaWYgKG9sZHZhbCAmJiAqb2xkdmFsICYmIGdldF9zaGExKG9sZHZhbCwgb2xkc2hhMSkpCisJCWRpZSgiJXM6IG5vdCBhIHZhbGlkIG9sZCBTSEExIiwgb2xkdmFsKTsKKworCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShyZWZuYW1lLCBvbGR2YWwgPyBvbGRzaGExIDogTlVMTCk7CisJaWYgKCFsb2NrKQorCQlkaWUoIiVzOiBjYW5ub3QgbG9jayB0aGUgcmVmIiwgcmVmbmFtZSk7CisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIHNoYTEsIG1zZykgPCAwKQorCQlkaWUoIiVzOiBjYW5ub3QgdXBkYXRlIHRoZSByZWYiLCByZWZuYW1lKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBsb2FkLWFyY2hpdmUuYyBiL2J1aWx0aW4tdXBsb2FkLWFyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFlMDllCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi11cGxvYWQtYXJjaGl2ZS5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEZyYW5jayBCdWktSHV1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1cGxvYWRfYXJjaGl2ZV91c2FnZVtdID0KKwkiZ2l0LXVwbG9hZC1hcmNoaXZlIDxyZXBvPiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRlYWRjaGlsZFtdID0KKyJnaXQtdXBsb2FkLWFyY2hpdmU6IGFyY2hpdmVyIGRpZWQgd2l0aCBlcnJvciI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGxvc3RjaGlsZFtdID0KKyJnaXQtdXBsb2FkLWFyY2hpdmU6IGFyY2hpdmVyIHByb2Nlc3Mgd2FzIGxvc3QiOworCisKK3N0YXRpYyBpbnQgcnVuX3VwbG9hZF9hcmNoaXZlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBhcmNoaXZlciBhcjsKKwljb25zdCBjaGFyICpzZW50X2FyZ3ZbTUFYX0FSR1NdOworCWNvbnN0IGNoYXIgKmFyZ19jbWQgPSAiYXJndW1lbnQgIjsKKwljaGFyICpwLCBidWZbNDA5Nl07CisJaW50IHRyZWVpc2hfaWR4OworCWludCBzZW50X2FyZ2M7CisJaW50IGxlbjsKKworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKHVwbG9hZF9hcmNoaXZlX3VzYWdlKTsKKworCWlmIChzdHJsZW4oYXJndlsxXSkgPiBzaXplb2YoYnVmKSkKKwkJZGllKCJpbnNhbmVseSBsb25nIHJlcG9zaXRvcnkgbmFtZSIpOworCisJc3RyY3B5KGJ1ZiwgYXJndlsxXSk7IC8qIGVudGVyLXJlcG8gc211ZGdlcyBpdHMgYXJndW1lbnQgKi8KKworCWlmICghZW50ZXJfcmVwbyhidWYsIDApKQorCQlkaWUoIm5vdCBhIGdpdCBhcmNoaXZlIik7CisKKwkvKiBwdXQgcmVjZWl2ZWQgb3B0aW9ucyBpbiBzZW50X2FyZ3ZbXSAqLworCXNlbnRfYXJnYyA9IDE7CisJc2VudF9hcmd2WzBdID0gImdpdC11cGxvYWQtYXJjaGl2ZSI7CisJZm9yIChwID0gYnVmOzspIHsKKwkJLyogVGhpcyB3aWxsIGRpZSBpZiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgaW4gYnVmICovCisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgcCwgKGJ1ZiArIHNpemVvZiBidWYpIC0gcCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCWJyZWFrOwkvKiBnb3QgYSBmbHVzaCAqLworCQlpZiAoc2VudF9hcmdjID4gTUFYX0FSR1MgLSAyKQorCQkJZGllKCJUb28gbWFueSBvcHRpb25zICg+MjkpIik7CisKKwkJaWYgKHBbbGVuLTFdID09ICdcbicpIHsKKwkJCXBbLS1sZW5dID0gMDsKKwkJfQorCQlpZiAobGVuIDwgc3RybGVuKGFyZ19jbWQpIHx8CisJCSAgICBzdHJuY21wKGFyZ19jbWQsIHAsIHN0cmxlbihhcmdfY21kKSkpCisJCQlkaWUoIidhcmd1bWVudCcgdG9rZW4gb3IgZmx1c2ggZXhwZWN0ZWQiKTsKKworCQlsZW4gLT0gc3RybGVuKGFyZ19jbWQpOworCQltZW1tb3ZlKHAsIHAgKyBzdHJsZW4oYXJnX2NtZCksIGxlbik7CisJCXNlbnRfYXJndltzZW50X2FyZ2MrK10gPSBwOworCQlwICs9IGxlbjsKKwkJKnArKyA9IDA7CisJfQorCXNlbnRfYXJndltzZW50X2FyZ2NdID0gTlVMTDsKKworCS8qIHBhcnNlIGFsbCBvcHRpb25zIHNlbnQgYnkgdGhlIGNsaWVudCAqLworCXRyZWVpc2hfaWR4ID0gcGFyc2VfYXJjaGl2ZV9hcmdzKHNlbnRfYXJnYywgc2VudF9hcmd2LCAmYXIpOworCisJcGFyc2VfdHJlZWlzaF9hcmcoc2VudF9hcmd2ICsgdHJlZWlzaF9pZHgsICZhci5hcmdzLCBwcmVmaXgpOworCXBhcnNlX3BhdGhzcGVjX2FyZyhzZW50X2FyZ3YgKyB0cmVlaXNoX2lkeCArIDEsICZhci5hcmdzKTsKKworCXJldHVybiBhci53cml0ZV9hcmNoaXZlKCZhci5hcmdzKTsKK30KKworc3RhdGljIHZvaWQgZXJyb3JfY2xudChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwl2YV9saXN0IHBhcmFtczsKKwlpbnQgbGVuOworCisJdmFfc3RhcnQocGFyYW1zLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworCXNlbmRfc2lkZWJhbmQoMSwgMywgYnVmLCBsZW4sIExBUkdFX1BBQ0tFVF9NQVgpOworCWRpZSgic2VudCBlcnJvciB0byB0aGUgY2xpZW50OiAlcyIsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW5wdXQoaW50IGNoaWxkX2ZkLCBpbnQgYmFuZCkKK3sKKwljaGFyIGJ1ZlsxNjM4NF07CisJc3NpemVfdCBzeiA9IHJlYWQoY2hpbGRfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChzeiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5UUikKKwkJCWVycm9yX2NsbnQoInJlYWQgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCXNlbmRfc2lkZWJhbmQoMSwgYmFuZCwgYnVmLCBzeiwgTEFSR0VfUEFDS0VUX01BWCk7Cit9CisKK2ludCBjbWRfdXBsb2FkX2FyY2hpdmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcGlkX3Qgd3JpdGVyOworCWludCBmZDFbMl0sIGZkMlsyXTsKKwkvKgorCSAqIFNldCB1cCBzaWRlYmFuZCBzdWJwcm9jZXNzLgorCSAqCisJICogV2UgKHBhcmVudCkgbW9uaXRvciBhbmQgcmVhZCBmcm9tIGNoaWxkLCBzZW5kaW5nIGl0cyBmZCMxIGFuZCBmZCMyCisJICogbXVsdGlwbGV4ZWQgb3V0IHRvIG91ciBmZCMxLiAgSWYgdGhlIGNoaWxkIGRpZXMsIHdlIHRlbGwgdGhlIG90aGVyCisJICogZW5kIG92ZXIgY2hhbm5lbCAjMy4KKwkgKi8KKwlpZiAocGlwZShmZDEpIDwgMCB8fCBwaXBlKGZkMikgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJcGFja2V0X3dyaXRlKDEsICJOQUNLIHBpcGUgZmFpbGVkIG9uIHRoZSByZW1vdGUgc2lkZVxuIik7CisJCWRpZSgidXBsb2FkLWFyY2hpdmU6ICVzIiwgc3RyZXJyb3IoZXJyKSk7CisJfQorCXdyaXRlciA9IGZvcmsoKTsKKwlpZiAod3JpdGVyIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisJCXBhY2tldF93cml0ZSgxLCAiTkFDSyBmb3JrIGZhaWxlZCBvbiB0aGUgcmVtb3RlIHNpZGVcbiIpOworCQlkaWUoInVwbG9hZC1hcmNoaXZlOiAlcyIsIHN0cmVycm9yKGVycikpOworCX0KKwlpZiAoIXdyaXRlcikgeworCQkvKiBjaGlsZCAtIGNvbm5lY3QgZmQjMSBhbmQgZmQjMiB0byB0aGUgcGlwZSAqLworCQlkdXAyKGZkMVsxXSwgMSk7CisJCWR1cDIoZmQyWzFdLCAyKTsKKwkJY2xvc2UoZmQxWzFdKTsgY2xvc2UoZmQyWzFdKTsKKwkJY2xvc2UoZmQxWzBdKTsgY2xvc2UoZmQyWzBdKTsgLyogd2UgZG8gbm90IHJlYWQgZnJvbSBwaXBlICovCisKKwkJZXhpdChydW5fdXBsb2FkX2FyY2hpdmUoYXJnYywgYXJndiwgcHJlZml4KSk7CisJfQorCisJLyogcGFyZW50IC0gcmVhZCBmcm9tIGNoaWxkLCBtdWx0aXBsZXggYW5kIHNlbmQgb3V0IHRvIGZkIzEgKi8KKwljbG9zZShmZDFbMV0pOyBjbG9zZShmZDJbMV0pOyAvKiB3ZSBkbyBub3Qgd3JpdGUgdG8gcGlwZSAqLworCXBhY2tldF93cml0ZSgxLCAiQUNLXG4iKTsKKwlwYWNrZXRfZmx1c2goMSk7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcG9sbGZkIHBmZFsyXTsKKwkJaW50IHN0YXR1czsKKworCQlwZmRbMF0uZmQgPSBmZDFbMF07CisJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCXBmZFsxXS5mZCA9IGZkMlswXTsKKwkJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKwkJaWYgKHBvbGwocGZkLCAyLCAtMSkgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQllcnJvcigicG9sbCBmYWlsZWQgcmVzdW1pbmc6ICVzIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBmZFswXS5yZXZlbnRzICYgUE9MTElOKQorCQkJLyogRGF0YSBzdHJlYW0gcmVhZHkgKi8KKwkJCXByb2Nlc3NfaW5wdXQocGZkWzBdLmZkLCAxKTsKKwkJaWYgKHBmZFsxXS5yZXZlbnRzICYgUE9MTElOKQorCQkJLyogU3RhdHVzIHN0cmVhbSByZWFkeSAqLworCQkJcHJvY2Vzc19pbnB1dChwZmRbMV0uZmQsIDIpOworCQkvKiBBbHdheXMgZmluaXNoIHRvIHJlYWQgZGF0YSB3aGVuIGF2YWlsYWJsZSAqLworCQlpZiAoKHBmZFswXS5yZXZlbnRzIHwgcGZkWzFdLnJldmVudHMpICYgUE9MTElOKQorCQkJY29udGludWU7CisKKwkJaWYgKHdhaXRwaWQod3JpdGVyLCAmc3RhdHVzLCAwKSA8IDApCisJCQllcnJvcl9jbG50KCIlcyIsIGxvc3RjaGlsZCk7CisJCWVsc2UgaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpID4gMCkKKwkJCWVycm9yX2NsbnQoIiVzIiwgZGVhZGNoaWxkKTsKKwkJcGFja2V0X2ZsdXNoKDEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXZlcmlmeS1wYWNrLmMgYi9idWlsdGluLXZlcmlmeS1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzMWMyNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdmVyaWZ5LXBhY2suYwpAQCAtMCwwICsxLDgwIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCitzdGF0aWMgaW50IHZlcmlmeV9vbmVfcGFjayhjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSkKK3sKKwljaGFyIGFyZ1tQQVRIX01BWF07CisJaW50IGxlbjsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjazsKKwlpbnQgZXJyOworCisJbGVuID0gc3RybGNweShhcmcsIHBhdGgsIFBBVEhfTUFYKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gZXJyb3IoIm5hbWUgdG9vIGxvbmc6ICVzIiwgcGF0aCk7CisKKwkvKgorCSAqIEluIGFkZGl0aW9uIHRvICJmb28uaWR4IiB3ZSBhY2NlcHQgImZvby5wYWNrIiBhbmQgImZvbyI7CisJICogbm9ybWFsaXplIHRoZXNlIGZvcm1zIHRvICJmb28uaWR4IiBmb3IgYWRkX3BhY2tlZF9naXQoKS4KKwkgKi8KKwlpZiAoaGFzX2V4dGVuc2lvbihhcmcsICIucGFjayIpKSB7CisJCXN0cmNweShhcmcgKyBsZW4gLSA1LCAiLmlkeCIpOworCQlsZW4tLTsKKwl9IGVsc2UgaWYgKCFoYXNfZXh0ZW5zaW9uKGFyZywgIi5pZHgiKSkgeworCQlpZiAobGVuICsgNCA+PSBQQVRIX01BWCkKKwkJCXJldHVybiBlcnJvcigibmFtZSB0b28gbG9uZzogJXMuaWR4IiwgYXJnKTsKKwkJc3RyY3B5KGFyZyArIGxlbiwgIi5pZHgiKTsKKwkJbGVuICs9IDQ7CisJfQorCisJLyoKKwkgKiBhZGRfcGFja2VkX2dpdCgpIHVzZXMgb3VyIGJ1ZmZlciAoY29udGFpbmluZyAiZm9vLmlkeCIpIHRvCisJICogYnVpbGQgdGhlIHBhY2sgZmlsZW5hbWUgKCJmb28ucGFjayIpLiAgTWFrZSBzdXJlIGl0IGZpdHMuCisJICovCisJaWYgKGxlbiArIDEgPj0gUEFUSF9NQVgpIHsKKwkJYXJnW2xlbiAtIDRdID0gJ1wwJzsKKwkJcmV0dXJuIGVycm9yKCJuYW1lIHRvbyBsb25nOiAlcy5wYWNrIiwgYXJnKTsKKwl9CisKKwlwYWNrID0gYWRkX3BhY2tlZF9naXQoYXJnLCBsZW4sIDEpOworCWlmICghcGFjaykKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBub3QgZm91bmQuIiwgYXJnKTsKKworCWVyciA9IHZlcmlmeV9wYWNrKHBhY2ssIHZlcmJvc2UpOworCWZyZWUocGFjayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3QgY2hhciB2ZXJpZnlfcGFja191c2FnZVtdID0gImdpdC12ZXJpZnktcGFjayBbLXZdIDxwYWNrPi4uLiI7CisKK2ludCBjbWRfdmVyaWZ5X3BhY2soaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGVyciA9IDA7CisJaW50IHZlcmJvc2UgPSAwOworCWludCBub19tb3JlX29wdGlvbnMgPSAwOworCWludCBub3RoaW5nX2RvbmUgPSAxOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCXdoaWxlICgxIDwgYXJnYykgeworCQlpZiAoIW5vX21vcmVfb3B0aW9ucyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoIi12IiwgYXJndlsxXSkpCisJCQkJdmVyYm9zZSA9IDE7CisJCQllbHNlIGlmICghc3RyY21wKCItLSIsIGFyZ3ZbMV0pKQorCQkJCW5vX21vcmVfb3B0aW9ucyA9IDE7CisJCQllbHNlCisJCQkJdXNhZ2UodmVyaWZ5X3BhY2tfdXNhZ2UpOworCQl9CisJCWVsc2UgeworCQkJaWYgKHZlcmlmeV9vbmVfcGFjayhhcmd2WzFdLCB2ZXJib3NlKSkKKwkJCQllcnIgPSAxOworCQkJbm90aGluZ19kb25lID0gMDsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAobm90aGluZ19kb25lKQorCQl1c2FnZSh2ZXJpZnlfcGFja191c2FnZSk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi13cml0ZS10cmVlLmMgYi9idWlsdGluLXdyaXRlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFkZTUzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi13cml0ZS10cmVlLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHdyaXRlX3RyZWVfdXNhZ2VbXSA9CisiZ2l0LXdyaXRlLXRyZWUgWy0tbWlzc2luZy1va10gWy0tcHJlZml4PTxwcmVmaXg+L10iOworCitpbnQgd3JpdGVfdHJlZSh1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbWlzc2luZ19vaywgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBlbnRyaWVzLCB3YXNfdmFsaWQsIG5ld2ZkOworCisJLyogV2UgY2FuJ3QgZnJlZSB0aGlzIG1lbW9yeSwgaXQgYmVjb21lcyBwYXJ0IG9mIGEgbGlua2VkIGxpc3QgcGFyc2VkIGF0ZXhpdCgpICovCisJc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCisJbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleChsb2NrX2ZpbGUsIDEpOworCisJZW50cmllcyA9IHJlYWRfY2FjaGUoKTsKKwlpZiAoZW50cmllcyA8IDApCisJCWRpZSgiZ2l0LXdyaXRlLXRyZWU6IGVycm9yIHJlYWRpbmcgY2FjaGUiKTsKKworCWlmICghYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCisJd2FzX3ZhbGlkID0gY2FjaGVfdHJlZV9mdWxseV92YWxpZChhY3RpdmVfY2FjaGVfdHJlZSk7CisKKwlpZiAoIXdhc192YWxpZCkgeworCQlpZiAoY2FjaGVfdHJlZV91cGRhdGUoYWN0aXZlX2NhY2hlX3RyZWUsCisJCQkJICAgICAgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsCisJCQkJICAgICAgbWlzc2luZ19vaywgMCkgPCAwKQorCQkJZGllKCJnaXQtd3JpdGUtdHJlZTogZXJyb3IgYnVpbGRpbmcgdHJlZXMiKTsKKwkJaWYgKDAgPD0gbmV3ZmQpIHsKKwkJCWlmICghd3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKQorCQkJCQkmJiAhY2xvc2UobmV3ZmQpKSB7CisJCQkJY29tbWl0X2xvY2tfZmlsZShsb2NrX2ZpbGUpOworCQkJCW5ld2ZkID0gLTE7CisJCQl9CisJCX0KKwkJLyogTm90IGJlaW5nIGFibGUgdG8gd3JpdGUgaXMgZmluZSAtLSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkCisJCSAqIGluIHVwZGF0aW5nIHRoZSBjYWNoZS10cmVlIHBhcnQsIGFuZCBpZiB0aGUgbmV4dCBjYWxsZXIKKwkJICogZW5kcyB1cCB1c2luZyB0aGUgb2xkIGluZGV4IHdpdGggdW51cGRhdGVkIGNhY2hlLXRyZWUgcGFydAorCQkgKiBpdCBtaXNzZXMgdGhlIHdvcmsgd2UgZGlkIGhlcmUsIGJ1dCB0aGF0IGlzIGp1c3QgYQorCQkgKiBwZXJmb3JtYW5jZSBwZW5hbHR5IGFuZCBub3QgYSBiaWcgZGVhbC4KKwkJICovCisJfQorCisJaWYgKHByZWZpeCkgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZSAqc3VidHJlZSA9CisJCQljYWNoZV90cmVlX2ZpbmQoYWN0aXZlX2NhY2hlX3RyZWUsIHByZWZpeCk7CisJCWhhc2hjcHkoc2hhMSwgc3VidHJlZS0+c2hhMSk7CisJfQorCWVsc2UKKwkJaGFzaGNweShzaGExLCBhY3RpdmVfY2FjaGVfdHJlZS0+c2hhMSk7CisKKwlpZiAoMCA8PSBuZXdmZCkKKwkJY2xvc2UobmV3ZmQpOworCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrX2ZpbGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfd3JpdGVfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnVudXNlZF9wcmVmaXgpCit7CisJaW50IG1pc3Npbmdfb2sgPSAwLCByZXQ7CisJY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tbWlzc2luZy1vayIpKQorCQkJbWlzc2luZ19vayA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wcmVmaXg9IikpCisJCQlwcmVmaXggPSBhcmcgKyA5OworCQllbHNlCisJCQl1c2FnZSh3cml0ZV90cmVlX3VzYWdlKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgPiAyKQorCQlkaWUoInRvbyBtYW55IG9wdGlvbnMiKTsKKworCXJldCA9IHdyaXRlX3RyZWUoc2hhMSwgbWlzc2luZ19vaywgcHJlZml4KTsKKwlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi5oIGIvYnVpbHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjNhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLmgKQEAgLTAsMCArMSw4OCBAQAorI2lmbmRlZiBCVUlMVElOX0gKKyNkZWZpbmUgQlVJTFRJTl9ICisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgZ2l0X3ZlcnNpb25fc3RyaW5nW107CitleHRlcm4gY29uc3QgY2hhciBnaXRfdXNhZ2Vfc3RyaW5nW107CisKK2V4dGVybiB2b2lkIGhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKTsKK2V4dGVybiBpbnQgbWFpbGluZm8oRklMRSAqaW4sIEZJTEUgKm91dCwgaW50IGtzLCBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpwYXRjaCk7CitleHRlcm4gaW50IHNwbGl0X21ib3goY29uc3QgY2hhciAqKm1ib3gsIGNvbnN0IGNoYXIgKmRpciwgaW50IGFsbG93X2JhcmUsIGludCBucl9wcmVjLCBpbnQgc2tpcCk7CitleHRlcm4gdm9pZCBzdHJpcHNwYWNlKEZJTEUgKmluLCBGSUxFICpvdXQpOworZXh0ZXJuIGludCB3cml0ZV90cmVlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBtaXNzaW5nX29rLCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIHZvaWQgcHJ1bmVfcGFja2VkX29iamVjdHMoaW50KTsKKworZXh0ZXJuIGludCBjbWRfYWRkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2FwcGx5KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2FyY2hpdmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfYmxhbWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfYnJhbmNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2J1bmRsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jaGVja291dF9pbmRleChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jaGVja19hdHRyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NoZWNrX3JlZl9mb3JtYXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2hlcnJ5KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NoZXJyeV9waWNrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NvbW1pdF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NvdW50X29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGVzY3JpYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGlmZl9maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9kaWZmX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2RpZmYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGlmZl90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2ZldGNoX190b29sKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2ZtdF9tZXJnZV9tc2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZm9yX2VhY2hfcmVmKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2Zvcm1hdF9wYXRjaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9mc2NrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2djKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2dldF90YXJfY29tbWl0X2lkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfaGVscChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9pbml0X2RiKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9sb2dfcmVmbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xzX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xzX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbWFpbGluZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbWFpbHNwbGl0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX21lcmdlX2Jhc2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbWVyZ2VfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9tdihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9uYW1lX3JldihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcGlja2F4ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9wcnVuZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9wcnVuZV9wYWNrZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcHVzaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZWFkX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmVmbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NvbmZpZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXJlcmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmV2X2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmV2X3BhcnNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JldmVydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9ydW5zdGF0dXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfc2hvcnRsb2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfc2hvdyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zaG93X2JyYW5jaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zdHJpcHNwYWNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3N5bWJvbGljX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF90YXJfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF91bnBhY2tfb2JqZWN0cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF91cGRhdGVfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdXBkYXRlX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF91cGxvYWRfYXJjaGl2ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF91cGxvYWRfdGFyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3ZlcnNpb24oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfd2hhdGNoYW5nZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfd3JpdGVfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJpZnlfcGFjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zaG93X3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9wYWNrX3JlZnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhY2hlLXRyZWUuYyBiL2NhY2hlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY5Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FjaGUtdHJlZS5jCkBAIC0wLDAgKzEsNTU3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHIDAKKyNlbmRpZgorCitzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZSh2b2lkKQoreworCXN0cnVjdCBjYWNoZV90cmVlICppdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjYWNoZV90cmVlKSk7CisJaXQtPmVudHJ5X2NvdW50ID0gLTE7CisJcmV0dXJuIGl0OworfQorCit2b2lkIGNhY2hlX3RyZWVfZnJlZShzdHJ1Y3QgY2FjaGVfdHJlZSAqKml0X3ApCit7CisJaW50IGk7CisJc3RydWN0IGNhY2hlX3RyZWUgKml0ID0gKml0X3A7CisKKwlpZiAoIWl0KQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWlmIChpdC0+ZG93bltpXSkKKwkJCWNhY2hlX3RyZWVfZnJlZSgmaXQtPmRvd25baV0tPmNhY2hlX3RyZWUpOworCWZyZWUoaXQtPmRvd24pOworCWZyZWUoaXQpOworCSppdF9wID0gTlVMTDsKK30KKworc3RhdGljIGludCBzdWJ0cmVlX25hbWVfY21wKGNvbnN0IGNoYXIgKm9uZSwgaW50IG9uZWxlbiwKKwkJCSAgICBjb25zdCBjaGFyICp0d28sIGludCB0d29sZW4pCit7CisJaWYgKG9uZWxlbiA8IHR3b2xlbikKKwkJcmV0dXJuIC0xOworCWlmICh0d29sZW4gPCBvbmVsZW4pCisJCXJldHVybiAxOworCXJldHVybiBtZW1jbXAob25lLCB0d28sIG9uZWxlbik7Cit9CisKK3N0YXRpYyBpbnQgc3VidHJlZV9wb3Moc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgcGF0aGxlbikKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKipkb3duID0gaXQtPmRvd247CisJaW50IGxvLCBoaTsKKwlsbyA9IDA7CisJaGkgPSBpdC0+c3VidHJlZV9ucjsKKwl3aGlsZSAobG8gPCBoaSkgeworCQlpbnQgbWkgPSAobG8gKyBoaSkgLyAyOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKm1kbCA9IGRvd25bbWldOworCQlpbnQgY21wID0gc3VidHJlZV9uYW1lX2NtcChwYXRoLCBwYXRobGVuLAorCQkJCQkgICBtZGwtPm5hbWUsIG1kbC0+bmFtZWxlbik7CisJCWlmICghY21wKQorCQkJcmV0dXJuIG1pOworCQlpZiAoY21wIDwgMCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0KKwlyZXR1cm4gLWxvLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmZpbmRfc3VidHJlZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJCSAgIGludCBwYXRobGVuLAorCQkJCQkgICBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqZG93bjsKKwlpbnQgcG9zID0gc3VidHJlZV9wb3MoaXQsIHBhdGgsIHBhdGhsZW4pOworCWlmICgwIDw9IHBvcykKKwkJcmV0dXJuIGl0LT5kb3duW3Bvc107CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCisJcG9zID0gLXBvcy0xOworCWlmIChpdC0+c3VidHJlZV9hbGxvYyA8PSBpdC0+c3VidHJlZV9ucikgeworCQlpdC0+c3VidHJlZV9hbGxvYyA9IGFsbG9jX25yKGl0LT5zdWJ0cmVlX2FsbG9jKTsKKwkJaXQtPmRvd24gPSB4cmVhbGxvYyhpdC0+ZG93biwgaXQtPnN1YnRyZWVfYWxsb2MgKgorCQkJCSAgICBzaXplb2YoKml0LT5kb3duKSk7CisJfQorCWl0LT5zdWJ0cmVlX25yKys7CisKKwlkb3duID0geG1hbGxvYyhzaXplb2YoKmRvd24pICsgcGF0aGxlbiArIDEpOworCWRvd24tPmNhY2hlX3RyZWUgPSBOVUxMOworCWRvd24tPm5hbWVsZW4gPSBwYXRobGVuOworCW1lbWNweShkb3duLT5uYW1lLCBwYXRoLCBwYXRobGVuKTsKKwlkb3duLT5uYW1lW3BhdGhsZW5dID0gMDsKKworCWlmIChwb3MgPCBpdC0+c3VidHJlZV9ucikKKwkJbWVtbW92ZShpdC0+ZG93biArIHBvcyArIDEsCisJCQlpdC0+ZG93biArIHBvcywKKwkJCXNpemVvZihkb3duKSAqIChpdC0+c3VidHJlZV9uciAtIHBvcyAtIDEpKTsKKwlpdC0+ZG93bltwb3NdID0gZG93bjsKKwlyZXR1cm4gZG93bjsKK30KKworc3RydWN0IGNhY2hlX3RyZWVfc3ViICpjYWNoZV90cmVlX3N1YihzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisJcmV0dXJuIGZpbmRfc3VidHJlZShpdCwgcGF0aCwgcGF0aGxlbiwgMSk7Cit9CisKK3ZvaWQgY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoKQoreworCS8qIGEvYi9jCisJICogPT0+IGludmFsaWRhdGUgc2VsZgorCSAqID09PiBmaW5kICJhIiwgaGF2ZSBpdCBpbnZhbGlkYXRlICJiL2MiCisJICogYQorCSAqID09PiBpbnZhbGlkYXRlIHNlbGYKKwkgKiA9PT4gaWYgImEiIGV4aXN0cyBhcyBhIHN1YnRyZWUsIHJlbW92ZSBpdC4KKwkgKi8KKwljb25zdCBjaGFyICpzbGFzaDsKKwlpbnQgbmFtZWxlbjsKKwlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd247CisKKyNpZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSBpbnZhbGlkYXRlIDwlcz5cbiIsIHBhdGgpOworI2VuZGlmCisKKwlpZiAoIWl0KQorCQlyZXR1cm47CisJc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKKwlpdC0+ZW50cnlfY291bnQgPSAtMTsKKwlpZiAoIXNsYXNoKSB7CisJCWludCBwb3M7CisJCW5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJCXBvcyA9IHN1YnRyZWVfcG9zKGl0LCBwYXRoLCBuYW1lbGVuKTsKKwkJaWYgKDAgPD0gcG9zKSB7CisJCQljYWNoZV90cmVlX2ZyZWUoJml0LT5kb3duW3Bvc10tPmNhY2hlX3RyZWUpOworCQkJZnJlZShpdC0+ZG93bltwb3NdKTsKKwkJCS8qIDAgMSAyIDMgNCA1CisJCQkgKiAgICAgICBeICAgICBec3VidHJlZV9uciA9IDYKKwkJCSAqICAgICAgIHBvcworCQkJICogbW92ZSA0IGFuZCA1IHVwIG9uZSBwbGFjZSAoMiBlbnRyaWVzKQorCQkJICogMiA9IDYgLSAzIC0gMSA9IHN1YnRyZWVfbnIgLSBwb3MgLSAxCisJCQkgKi8KKwkJCW1lbW1vdmUoaXQtPmRvd24rcG9zLCBpdC0+ZG93bitwb3MrMSwKKwkJCQlzaXplb2Yoc3RydWN0IGNhY2hlX3RyZWVfc3ViICopICoKKwkJCQkoaXQtPnN1YnRyZWVfbnIgLSBwb3MgLSAxKSk7CisJCQlpdC0+c3VidHJlZV9uci0tOworCQl9CisJCXJldHVybjsKKwl9CisJbmFtZWxlbiA9IHNsYXNoIC0gcGF0aDsKKwlkb3duID0gZmluZF9zdWJ0cmVlKGl0LCBwYXRoLCBuYW1lbGVuLCAwKTsKKwlpZiAoZG93bikKKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoZG93bi0+Y2FjaGVfdHJlZSwgc2xhc2ggKyAxKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2FjaGUoc3RydWN0IGNhY2hlX2VudHJ5ICoqY2FjaGUsCisJCQlpbnQgZW50cmllcykKK3sKKwlpbnQgaSwgZnVubnk7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgdHJlZSBpcyBtZXJnZWQgKi8KKwlmdW5ueSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCWlmICgxMCA8ICsrZnVubnkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIi4uLlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bm1lcmdlZCAoJXMpXG4iLAorCQkJCWNlLT5uYW1lLCBzaGExX3RvX2hleChjZS0+c2hhMSkpOworCQl9CisJfQorCWlmIChmdW5ueSkKKwkJcmV0dXJuIC0xOworCisJLyogQWxzbyB2ZXJpZnkgdGhhdCB0aGUgY2FjaGUgZG9lcyBub3QgaGF2ZSBwYXRoIGFuZCBwYXRoL2ZpbGUKKwkgKiBhdCB0aGUgc2FtZSB0aW1lLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSBjYWNoZSBoYXMgb25seQorCSAqIHN0YWdlIDAgZW50cmllcy4KKwkgKi8KKwlmdW5ueSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXMgLSAxOyBpKyspIHsKKwkJLyogcGF0aC9maWxlIGFsd2F5cyBjb21lcyBhZnRlciBwYXRoIGJlY2F1c2Ugb2YgdGhlIHdheQorCQkgKiB0aGUgY2FjaGUgaXMgc29ydGVkLiAgQWxzbyBwYXRoIGNhbiBhcHBlYXIgb25seSBvbmNlLAorCQkgKiB3aGljaCBtZWFucyBjb25mbGljdGluZyBvbmUgd291bGQgaW1tZWRpYXRlbHkgZm9sbG93LgorCQkgKi8KKwkJY29uc3QgY2hhciAqdGhpc19uYW1lID0gY2FjaGVbaV0tPm5hbWU7CisJCWNvbnN0IGNoYXIgKm5leHRfbmFtZSA9IGNhY2hlW2krMV0tPm5hbWU7CisJCWludCB0aGlzX2xlbiA9IHN0cmxlbih0aGlzX25hbWUpOworCQlpZiAodGhpc19sZW4gPCBzdHJsZW4obmV4dF9uYW1lKSAmJgorCQkgICAgc3RybmNtcCh0aGlzX25hbWUsIG5leHRfbmFtZSwgdGhpc19sZW4pID09IDAgJiYKKwkJICAgIG5leHRfbmFtZVt0aGlzX2xlbl0gPT0gJy8nKSB7CisJCQlpZiAoMTAgPCArK2Z1bm55KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIuLi5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnByaW50ZihzdGRlcnIsICJZb3UgaGF2ZSBib3RoICVzIGFuZCAlc1xuIiwKKwkJCQl0aGlzX25hbWUsIG5leHRfbmFtZSk7CisJCX0KKwl9CisJaWYgKGZ1bm55KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2NhcmRfdW51c2VkX3N1YnRyZWVzKHN0cnVjdCBjYWNoZV90cmVlICppdCkKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKipkb3duID0gaXQtPmRvd247CisJaW50IG5yID0gaXQtPnN1YnRyZWVfbnI7CisJaW50IGRzdCwgc3JjOworCWZvciAoZHN0ID0gc3JjID0gMDsgc3JjIDwgbnI7IHNyYysrKSB7CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqcyA9IGRvd25bc3JjXTsKKwkJaWYgKHMtPnVzZWQpCisJCQlkb3duW2RzdCsrXSA9IHM7CisJCWVsc2UgeworCQkJY2FjaGVfdHJlZV9mcmVlKCZzLT5jYWNoZV90cmVlKTsKKwkJCWZyZWUocyk7CisJCQlpdC0+c3VidHJlZV9uci0tOworCQl9CisJfQorfQorCitpbnQgY2FjaGVfdHJlZV9mdWxseV92YWxpZChzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQpCit7CisJaW50IGk7CisJaWYgKCFpdCkKKwkJcmV0dXJuIDA7CisJaWYgKGl0LT5lbnRyeV9jb3VudCA8IDAgfHwgIWhhc19zaGExX2ZpbGUoaXQtPnNoYTEpKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQlpZiAoIWNhY2hlX3RyZWVfZnVsbHlfdmFsaWQoaXQtPmRvd25baV0tPmNhY2hlX3RyZWUpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9vbmUoc3RydWN0IGNhY2hlX3RyZWUgKml0LAorCQkgICAgICBzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZSwKKwkJICAgICAgaW50IGVudHJpZXMsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCSAgICAgIGludCBiYXNlbGVuLAorCQkgICAgICBpbnQgbWlzc2luZ19vaywKKwkJICAgICAgaW50IGRyeXJ1bikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9mZnNldDsKKwljaGFyICpidWZmZXI7CisJaW50IGk7CisKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQgJiYgaGFzX3NoYTFfZmlsZShpdC0+c2hhMSkpCisJCXJldHVybiBpdC0+ZW50cnlfY291bnQ7CisKKwkvKgorCSAqIFdlIGZpcnN0IHNjYW4gZm9yIHN1YnRyZWVzIGFuZCB1cGRhdGUgdGhlbTsgd2Ugc3RhcnQgYnkKKwkgKiBtYXJraW5nIGV4aXN0aW5nIHN1YnRyZWVzIC0tIHRoZSBvbmVzIHRoYXQgYXJlIHVubWFya2VkCisJICogc2hvdWxkIG5vdCBiZSBpbiB0aGUgcmVzdWx0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKQorCQlpdC0+ZG93bltpXS0+dXNlZCA9IDA7CisKKwkvKgorCSAqIEZpbmQgdGhlIHN1YnRyZWVzIGFuZCB1cGRhdGUgdGhlbS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisJCWNvbnN0IGNoYXIgKnBhdGgsICpzbGFzaDsKKwkJaW50IHBhdGhsZW4sIHN1Ymxlbiwgc3ViY250OworCisJCXBhdGggPSBjZS0+bmFtZTsKKwkJcGF0aGxlbiA9IGNlX25hbWVsZW4oY2UpOworCQlpZiAocGF0aGxlbiA8PSBiYXNlbGVuIHx8IG1lbWNtcChiYXNlLCBwYXRoLCBiYXNlbGVuKSkKKwkJCWJyZWFrOyAvKiBhdCB0aGUgZW5kIG9mIHRoaXMgbGV2ZWwgKi8KKworCQlzbGFzaCA9IHN0cmNocihwYXRoICsgYmFzZWxlbiwgJy8nKTsKKwkJaWYgKCFzbGFzaCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBhL2JiYi9jIChiYXNlID0gYS8sIHNsYXNoID0gL2MpCisJCSAqID09PgorCQkgKiBwYXRoK2Jhc2VsZW4gPSBiYmIvYywgc3VibGVuID0gMworCQkgKi8KKwkJc3VibGVuID0gc2xhc2ggLSAocGF0aCArIGJhc2VsZW4pOworCQlzdWIgPSBmaW5kX3N1YnRyZWUoaXQsIHBhdGggKyBiYXNlbGVuLCBzdWJsZW4sIDEpOworCQlpZiAoIXN1Yi0+Y2FjaGVfdHJlZSkKKwkJCXN1Yi0+Y2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwkJc3ViY250ID0gdXBkYXRlX29uZShzdWItPmNhY2hlX3RyZWUsCisJCQkJICAgIGNhY2hlICsgaSwgZW50cmllcyAtIGksCisJCQkJICAgIHBhdGgsCisJCQkJICAgIGJhc2VsZW4gKyBzdWJsZW4gKyAxLAorCQkJCSAgICBtaXNzaW5nX29rLAorCQkJCSAgICBkcnlydW4pOworCQlpZiAoc3ViY250IDwgMCkKKwkJCXJldHVybiBzdWJjbnQ7CisJCWkgKz0gc3ViY250IC0gMTsKKwkJc3ViLT51c2VkID0gMTsKKwl9CisKKwlkaXNjYXJkX3VudXNlZF9zdWJ0cmVlcyhpdCk7CisKKwkvKgorCSAqIFRoZW4gd3JpdGUgb3V0IHRoZSB0cmVlIG9iamVjdCBmb3IgdGhpcyBsZXZlbC4KKwkgKi8KKwlzaXplID0gODE5MjsKKwlidWZmZXIgPSB4bWFsbG9jKHNpemUpOworCW9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisJCWNvbnN0IGNoYXIgKnBhdGgsICpzbGFzaDsKKwkJaW50IHBhdGhsZW4sIGVudGxlbjsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgbW9kZTsKKworCQlwYXRoID0gY2UtPm5hbWU7CisJCXBhdGhsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJaWYgKHBhdGhsZW4gPD0gYmFzZWxlbiB8fCBtZW1jbXAoYmFzZSwgcGF0aCwgYmFzZWxlbikpCisJCQlicmVhazsgLyogYXQgdGhlIGVuZCBvZiB0aGlzIGxldmVsICovCisKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCArIGJhc2VsZW4sICcvJyk7CisJCWlmIChzbGFzaCkgeworCQkJZW50bGVuID0gc2xhc2ggLSAocGF0aCArIGJhc2VsZW4pOworCQkJc3ViID0gZmluZF9zdWJ0cmVlKGl0LCBwYXRoICsgYmFzZWxlbiwgZW50bGVuLCAwKTsKKwkJCWlmICghc3ViKQorCQkJCWRpZSgiY2FjaGUtdHJlZS5jOiAnJS4qcycgaW4gJyVzJyBub3QgZm91bmQiLAorCQkJCSAgICBlbnRsZW4sIHBhdGggKyBiYXNlbGVuLCBwYXRoKTsKKwkJCWkgKz0gc3ViLT5jYWNoZV90cmVlLT5lbnRyeV9jb3VudCAtIDE7CisJCQlzaGExID0gc3ViLT5jYWNoZV90cmVlLT5zaGExOworCQkJbW9kZSA9IFNfSUZESVI7CisJCX0KKwkJZWxzZSB7CisJCQlzaGExID0gY2UtPnNoYTE7CisJCQltb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQkJZW50bGVuID0gcGF0aGxlbiAtIGJhc2VsZW47CisJCX0KKwkJaWYgKG1vZGUgIT0gU19JRkRJUkxOSyAmJiAhbWlzc2luZ19vayAmJiAhaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJCXJldHVybiBlcnJvcigiaW52YWxpZCBvYmplY3QgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwkJaWYgKCFjZS0+Y2VfbW9kZSkKKwkJCWNvbnRpbnVlOyAvKiBlbnRyeSBiZWluZyByZW1vdmVkICovCisKKwkJaWYgKHNpemUgPCBvZmZzZXQgKyBlbnRsZW4gKyAxMDApIHsKKwkJCXNpemUgPSBhbGxvY19ucihvZmZzZXQgKyBlbnRsZW4gKyAxMDApOworCQkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBzaXplKTsKKwkJfQorCQlvZmZzZXQgKz0gc3ByaW50ZihidWZmZXIgKyBvZmZzZXQsCisJCQkJICAiJW8gJS4qcyIsIG1vZGUsIGVudGxlbiwgcGF0aCArIGJhc2VsZW4pOworCQlidWZmZXJbb2Zmc2V0KytdID0gMDsKKwkJaGFzaGNweSgodW5zaWduZWQgY2hhciopYnVmZmVyICsgb2Zmc2V0LCBzaGExKTsKKwkJb2Zmc2V0ICs9IDIwOworCisjaWYgREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIHVwZGF0ZS1vbmUgJW8gJS4qc1xuIiwKKwkJCW1vZGUsIGVudGxlbiwgcGF0aCArIGJhc2VsZW4pOworI2VuZGlmCisJfQorCisJaWYgKGRyeXJ1bikKKwkJaGFzaF9zaGExX2ZpbGUoYnVmZmVyLCBvZmZzZXQsIHRyZWVfdHlwZSwgaXQtPnNoYTEpOworCWVsc2UKKwkJd3JpdGVfc2hhMV9maWxlKGJ1ZmZlciwgb2Zmc2V0LCB0cmVlX3R5cGUsIGl0LT5zaGExKTsKKwlmcmVlKGJ1ZmZlcik7CisJaXQtPmVudHJ5X2NvdW50ID0gaTsKKyNpZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSB1cGRhdGUtb25lICglZCBlbnQsICVkIHN1YnRyZWUpICVzXG4iLAorCQlpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yLAorCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworI2VuZGlmCisJcmV0dXJuIGk7Cit9CisKK2ludCBjYWNoZV90cmVlX3VwZGF0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkgICAgICBpbnQgZW50cmllcywKKwkJICAgICAgaW50IG1pc3Npbmdfb2ssCisJCSAgICAgIGludCBkcnlydW4pCit7CisJaW50IGk7CisJaSA9IHZlcmlmeV9jYWNoZShjYWNoZSwgZW50cmllcyk7CisJaWYgKGkpCisJCXJldHVybiBpOworCWkgPSB1cGRhdGVfb25lKGl0LCBjYWNoZSwgZW50cmllcywgIiIsIDAsIG1pc3Npbmdfb2ssIGRyeXJ1bik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKndyaXRlX29uZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgICBjaGFyICpwYXRoLAorCQkgICAgICAgaW50IHBhdGhsZW4sCisJCSAgICAgICBjaGFyICpidWZmZXIsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0KQoreworCWludCBpOworCisJLyogT25lICJjYWNoZS10cmVlIiBlbnRyeSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorCSAqIHBhdGggKE5VTCB0ZXJtaW5hdGVkKQorCSAqIGVudHJ5X2NvdW50LCBzdWJ0cmVlX25yICgiJWQgJWRcbiIpCisJICogdHJlZS1zaGExIChtaXNzaW5nIGlmIGludmFsaWQpCisJICogc3VidHJlZV9uciAiY2FjaGUtdHJlZSIgZW50cmllcyBmb3Igc3VidHJlZXMuCisJICovCisJaWYgKCpzaXplIDwgKm9mZnNldCArIHBhdGhsZW4gKyAxMDApIHsKKwkJKnNpemUgPSBhbGxvY19ucigqb2Zmc2V0ICsgcGF0aGxlbiArIDEwMCk7CisJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgKnNpemUpOworCX0KKwkqb2Zmc2V0ICs9IHNwcmludGYoYnVmZmVyICsgKm9mZnNldCwgIiUuKnMlYyVkICVkXG4iLAorCQkJICAgcGF0aGxlbiwgcGF0aCwgMCwKKwkJCSAgIGl0LT5lbnRyeV9jb3VudCwgaXQtPnN1YnRyZWVfbnIpOworCisjaWYgREVCVUcKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JS4qcz4gKCVkIGVudCwgJWQgc3VidHJlZSkgJXNcbiIsCisJCQlwYXRobGVuLCBwYXRoLCBpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yLAorCQkJc2hhMV90b19oZXgoaXQtPnNoYTEpKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JS4qcz4gKCVkIHN1YnRyZWUpIGludmFsaWRcbiIsCisJCQlwYXRobGVuLCBwYXRoLCBpdC0+c3VidHJlZV9ucik7CisjZW5kaWYKKworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQloYXNoY3B5KCh1bnNpZ25lZCBjaGFyKilidWZmZXIgKyAqb2Zmc2V0LCBpdC0+c2hhMSk7CisJCSpvZmZzZXQgKz0gMjA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqZG93biA9IGl0LT5kb3duW2ldOworCQlpZiAoaSkgeworCQkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpwcmV2ID0gaXQtPmRvd25baS0xXTsKKwkJCWlmIChzdWJ0cmVlX25hbWVfY21wKGRvd24tPm5hbWUsIGRvd24tPm5hbWVsZW4sCisJCQkJCSAgICAgcHJldi0+bmFtZSwgcHJldi0+bmFtZWxlbikgPD0gMCkKKwkJCQlkaWUoImZhdGFsIC0gdW5zb3J0ZWQgY2FjaGUgc3VidHJlZSIpOworCQl9CisJCWJ1ZmZlciA9IHdyaXRlX29uZShkb3duLT5jYWNoZV90cmVlLCBkb3duLT5uYW1lLCBkb3duLT5uYW1lbGVuLAorCQkJCSAgIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKwl9CisJcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCAqY2FjaGVfdHJlZV93cml0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqcm9vdCwgdW5zaWduZWQgbG9uZyAqc2l6ZV9wKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJdW5zaWduZWQgbG9uZyBzaXplID0gODE5MjsKKwljaGFyICpidWZmZXIgPSB4bWFsbG9jKHNpemUpOworCisJKnNpemVfcCA9IDA7CisJcGF0aFswXSA9IDA7CisJcmV0dXJuIHdyaXRlX29uZShyb290LCBwYXRoLCAwLCBidWZmZXIsICZzaXplLCBzaXplX3ApOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX3RyZWUgKnJlYWRfb25lKGNvbnN0IGNoYXIgKipidWZmZXIsIHVuc2lnbmVkIGxvbmcgKnNpemVfcCkKK3sKKwljb25zdCBjaGFyICpidWYgPSAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpzaXplX3A7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZXA7CisJc3RydWN0IGNhY2hlX3RyZWUgKml0OworCWludCBpLCBzdWJ0cmVlX25yOworCisJaXQgPSBOVUxMOworCS8qIHNraXAgbmFtZSwgYnV0IG1ha2Ugc3VyZSBuYW1lIGV4aXN0cyAqLworCXdoaWxlIChzaXplICYmICpidWYpIHsKKwkJc2l6ZS0tOworCQlidWYrKzsKKwl9CisJaWYgKCFzaXplKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCWJ1ZisrOyBzaXplLS07CisJaXQgPSBjYWNoZV90cmVlKCk7CisKKwljcCA9IGJ1ZjsKKwlpdC0+ZW50cnlfY291bnQgPSBzdHJ0b2woY3AsICZlcCwgMTApOworCWlmIChjcCA9PSBlcCkKKwkJZ290byBmcmVlX3JldHVybjsKKwljcCA9IGVwOworCXN1YnRyZWVfbnIgPSBzdHJ0b2woY3AsICZlcCwgMTApOworCWlmIChjcCA9PSBlcCkKKwkJZ290byBmcmVlX3JldHVybjsKKwl3aGlsZSAoc2l6ZSAmJiAqYnVmICYmICpidWYgIT0gJ1xuJykgeworCQlzaXplLS07CisJCWJ1ZisrOworCX0KKwlpZiAoIXNpemUpCisJCWdvdG8gZnJlZV9yZXR1cm47CisJYnVmKys7IHNpemUtLTsKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpIHsKKwkJaWYgKHNpemUgPCAyMCkKKwkJCWdvdG8gZnJlZV9yZXR1cm47CisJCWhhc2hjcHkoaXQtPnNoYTEsICh1bnNpZ25lZCBjaGFyKilidWYpOworCQlidWYgKz0gMjA7CisJCXNpemUgLT0gMjA7CisJfQorCisjaWYgREVCVUcKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JXM+ICglZCBlbnQsICVkIHN1YnRyZWUpICVzXG4iLAorCQkJKmJ1ZmZlciwgaXQtPmVudHJ5X2NvdW50LCBzdWJ0cmVlX25yLAorCQkJc2hhMV90b19oZXgoaXQtPnNoYTEpKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JXM+ICglZCBzdWJ0cmVlcykgaW52YWxpZFxuIiwKKwkJCSpidWZmZXIsIHN1YnRyZWVfbnIpOworI2VuZGlmCisKKwkvKgorCSAqIEp1c3QgYSBoZXVyaXN0aWMgLS0gd2UgZG8gbm90IGFkZCBkaXJlY3RvcmllcyB0aGF0IG9mdGVuIGJ1dAorCSAqIHdlIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gZXh0ZW5kIGl0IGltbWVkaWF0ZWx5IHdoZW4gd2UgZG8sCisJICogaGVuY2UgKzIuCisJICovCisJaXQtPnN1YnRyZWVfYWxsb2MgPSBzdWJ0cmVlX25yICsgMjsKKwlpdC0+ZG93biA9IHhjYWxsb2MoaXQtPnN1YnRyZWVfYWxsb2MsIHNpemVvZihzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKikpOworCWZvciAoaSA9IDA7IGkgPCBzdWJ0cmVlX25yOyBpKyspIHsKKwkJLyogcmVhZCBlYWNoIHN1YnRyZWUgKi8KKwkJc3RydWN0IGNhY2hlX3RyZWUgKnN1YjsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWJ0cmVlOworCQljb25zdCBjaGFyICpuYW1lID0gYnVmOworCisJCXN1YiA9IHJlYWRfb25lKCZidWYsICZzaXplKTsKKwkJaWYgKCFzdWIpCisJCQlnb3RvIGZyZWVfcmV0dXJuOworCQlzdWJ0cmVlID0gY2FjaGVfdHJlZV9zdWIoaXQsIG5hbWUpOworCQlzdWJ0cmVlLT5jYWNoZV90cmVlID0gc3ViOworCX0KKwlpZiAoc3VidHJlZV9uciAhPSBpdC0+c3VidHJlZV9ucikKKwkJZGllKCJjYWNoZS10cmVlOiBpbnRlcm5hbCBlcnJvciIpOworCSpidWZmZXIgPSBidWY7CisJKnNpemVfcCA9IHNpemU7CisJcmV0dXJuIGl0OworCisgZnJlZV9yZXR1cm46CisJY2FjaGVfdHJlZV9mcmVlKCZpdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX3JlYWQoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGJ1ZmZlclswXSkKKwkJcmV0dXJuIE5VTEw7IC8qIG5vdCB0aGUgd2hvbGUgdHJlZSAqLworCXJldHVybiByZWFkX29uZSgmYnVmZmVyLCAmc2l6ZSk7Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX2ZpbmQoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoKQoreworCXdoaWxlICgqcGF0aCkgeworCQljb25zdCBjaGFyICpzbGFzaDsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKKwkJaWYgKCFzbGFzaCkKKwkJCXNsYXNoID0gcGF0aCArIHN0cmxlbihwYXRoKTsKKwkJLyogYmV0d2VlbiBwYXRoIGFuZCBzbGFzaCBpcyB0aGUgbmFtZSBvZiB0aGUKKwkJICogc3VidHJlZSB0byBsb29rIGZvci4KKwkJICovCisJCXN1YiA9IGZpbmRfc3VidHJlZShpdCwgcGF0aCwgc2xhc2ggLSBwYXRoLCAwKTsKKwkJaWYgKCFzdWIpCisJCQlyZXR1cm4gTlVMTDsKKwkJaXQgPSBzdWItPmNhY2hlX3RyZWU7CisJCWlmIChzbGFzaCkKKwkJCXdoaWxlICgqc2xhc2ggJiYgKnNsYXNoID09ICcvJykKKwkJCQlzbGFzaCsrOworCQlpZiAoIXNsYXNoIHx8ICEqc2xhc2gpCisJCQlyZXR1cm4gaXQ7IC8qIHByZWZpeCBlbmRlZCB3aXRoIHNsYXNoZXMgKi8KKwkJcGF0aCA9IHNsYXNoOworCX0KKwlyZXR1cm4gaXQ7Cit9CmRpZmYgLS1naXQgYS9jYWNoZS10cmVlLmggYi9jYWNoZS10cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5NDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhY2hlLXRyZWUuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIENBQ0hFX1RSRUVfSAorI2RlZmluZSBDQUNIRV9UUkVFX0gKKworc3RydWN0IGNhY2hlX3RyZWU7CitzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgeworCXN0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlOworCWludCBuYW1lbGVuOworCWludCB1c2VkOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK307CisKK3N0cnVjdCBjYWNoZV90cmVlIHsKKwlpbnQgZW50cnlfY291bnQ7IC8qIG5lZ2F0aXZlIG1lYW5zICJpbnZhbGlkIiAqLworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHN1YnRyZWVfbnI7CisJaW50IHN1YnRyZWVfYWxsb2M7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93bjsKK307CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlKHZvaWQpOwordm9pZCBjYWNoZV90cmVlX2ZyZWUoc3RydWN0IGNhY2hlX3RyZWUgKiopOwordm9pZCBjYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChzdHJ1Y3QgY2FjaGVfdHJlZSAqLCBjb25zdCBjaGFyICopOworc3RydWN0IGNhY2hlX3RyZWVfc3ViICpjYWNoZV90cmVlX3N1YihzdHJ1Y3QgY2FjaGVfdHJlZSAqLCBjb25zdCBjaGFyICopOworCit2b2lkICpjYWNoZV90cmVlX3dyaXRlKHN0cnVjdCBjYWNoZV90cmVlICpyb290LCB1bnNpZ25lZCBsb25nICpzaXplX3ApOworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWVfcmVhZChjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKHN0cnVjdCBjYWNoZV90cmVlICopOworaW50IGNhY2hlX3RyZWVfdXBkYXRlKHN0cnVjdCBjYWNoZV90cmVlICosIHN0cnVjdCBjYWNoZV9lbnRyeSAqKiwgaW50LCBpbnQsIGludCk7CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX2ZpbmQoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jYWNoZS5oIGIvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGZmMmYxCi0tLSAvZGV2L251bGwKKysrIGIvY2FjaGUuaApAQCAtMCwwICsxLDU1NiBAQAorI2lmbmRlZiBDQUNIRV9ICisjZGVmaW5lIENBQ0hFX0gKKworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorCisjaW5jbHVkZSBTSEExX0hFQURFUgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2lmIFpMSUJfVkVSTlVNIDwgMHgxMjAwCisjZGVmaW5lIGRlZmxhdGVCb3VuZChjLHMpICAoKHMpICsgKCgocykgKyA3KSA+PiAzKSArICgoKHMpICsgNjMpID4+IDYpICsgMTEpCisjZW5kaWYKKworI2lmIGRlZmluZWQoRFRfVU5LTk9XTikgJiYgIWRlZmluZWQoTk9fRF9UWVBFX0lOX0RJUkVOVCkKKyNkZWZpbmUgRFRZUEUoZGUpCSgoZGUpLT5kX3R5cGUpCisjZWxzZQorI3VuZGVmIERUX1VOS05PV04KKyN1bmRlZiBEVF9ESVIKKyN1bmRlZiBEVF9SRUcKKyN1bmRlZiBEVF9MTksKKyNkZWZpbmUgRFRfVU5LTk9XTgkwCisjZGVmaW5lIERUX0RJUgkJMQorI2RlZmluZSBEVF9SRUcJCTIKKyNkZWZpbmUgRFRfTE5LCQkzCisjZGVmaW5lIERUWVBFKGRlKQlEVF9VTktOT1dOCisjZW5kaWYKKworLyogdW5rbm93biBtb2RlIChpbXBvc3NpYmxlIGNvbWJpbmF0aW9uIFNfSUZJRk98U19JRkNIUikgKi8KKyNkZWZpbmUgU19JRklOVkFMSUQgICAgIDAwMzAwMDAKKworLyoKKyAqIEEgImRpcmVjdG9yeSBsaW5rIiBpcyBhIGxpbmsgdG8gYW5vdGhlciBnaXQgZGlyZWN0b3J5LgorICoKKyAqIFRoZSB2YWx1ZSAwMTYwMDAwIGlzIG5vdCBub3JtYWxseSBhIHZhbGlkIG1vZGUsIGFuZAorICogYWxzbyBqdXN0IGhhcHBlbnMgdG8gYmUgU19JRkRJUiArIFNfSUZMTksKKyAqCisgKiBOT1RFISBXZSAqcmVhbGx5KiBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoZSBTX0lGeHh4IG1hY3JvcworICogYWx3YXlzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZXMgZXZlcnl3aGVyZS4gV2Ugc2hvdWxkIHVzZQorICogb3VyIGludGVybmFsIGdpdCB2YWx1ZXMgZm9yIHRoZXNlIHRoaW5ncywgYW5kIHRoZW4gd2UgY2FuCisgKiB0cmFuc2xhdGUgdGhhdCB0byB0aGUgT1Mtc3BlY2lmaWMgdmFsdWUuIEl0IGp1c3Qgc28KKyAqIGhhcHBlbnMgdGhhdCBldmVyeWJvZHkgc2hhcmVzIHRoZSBzYW1lIGJpdCByZXByZXNlbnRhdGlvbgorICogaW4gdGhlIFVOSVggd29ybGQgKGFuZCBhcHBhcmVudGx5IHdpZGVyIHRvby4uKQorICovCisjZGVmaW5lIFNfSUZESVJMTksJMDE2MDAwMAorI2RlZmluZSBTX0lTRElSTE5LKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSTE5LKQorCisvKgorICogSW50ZW5zaXZlIHJlc2VhcmNoIG92ZXIgdGhlIGNvdXJzZSBvZiBtYW55IHllYXJzIGhhcyBzaG93biB0aGF0CisgKiBwb3J0IDk0MTggaXMgdG90YWxseSB1bnVzZWQgYnkgYW55dGhpbmcgZWxzZS4gT3IKKyAqCisgKglZb3VyIHNlYXJjaCAtICJwb3J0IDk0MTgiIC0gZGlkIG5vdCBtYXRjaCBhbnkgZG9jdW1lbnRzLgorICoKKyAqIGFzIHd3dy5nb29nbGUuY29tIHB1dHMgaXQuCisgKgorICogVGhpcyBwb3J0IGhhcyBiZWVuIHByb3Blcmx5IGFzc2lnbmVkIGZvciBnaXQgdXNlIGJ5IElBTkE6CisgKiBnaXQgKEFzc2lnbmVkLTk0MTgpIFtJMDYtMDUwNzI4LTAwMDFdLgorICoKKyAqCWdpdCAgOTQxOC90Y3AgICBnaXQgcGFjayB0cmFuc2ZlciBzZXJ2aWNlCisgKglnaXQgIDk0MTgvdWRwICAgZ2l0IHBhY2sgdHJhbnNmZXIgc2VydmljZQorICoKKyAqIHdpdGggTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhcyB0aGUgcG9pbnQgb2YKKyAqIGNvbnRhY3QuIFNlcHRlbWJlciAyMDA1LgorICoKKyAqIFNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3BvcnQtbnVtYmVycworICovCisjZGVmaW5lIERFRkFVTFRfR0lUX1BPUlQgOTQxOAorCisvKgorICogQmFzaWMgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZGlyZWN0b3J5IGNhY2hlCisgKi8KKworI2RlZmluZSBDQUNIRV9TSUdOQVRVUkUgMHg0NDQ5NTI0MwkvKiAiRElSQyIgKi8KK3N0cnVjdCBjYWNoZV9oZWFkZXIgeworCXVuc2lnbmVkIGludCBoZHJfc2lnbmF0dXJlOworCXVuc2lnbmVkIGludCBoZHJfdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgaGRyX2VudHJpZXM7Cit9OworCisvKgorICogVGhlICJjYWNoZV90aW1lIiBpcyBqdXN0IHRoZSBsb3cgMzIgYml0cyBvZiB0aGUKKyAqIHRpbWUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGl0IG92ZXJmbG93cyAtIHdlIG9ubHkKKyAqIGNoZWNrIGl0IGZvciBlcXVhbGl0eSBpbiB0aGUgMzIgYml0cyB3ZSBzYXZlLgorICovCitzdHJ1Y3QgY2FjaGVfdGltZSB7CisJdW5zaWduZWQgaW50IHNlYzsKKwl1bnNpZ25lZCBpbnQgbnNlYzsKK307CisKKy8qCisgKiBkZXYvaW5vL3VpZC9naWQvc2l6ZSBhcmUgYWxzbyBqdXN0IHRyYWNrZWQgdG8gdGhlIGxvdyAzMiBiaXRzCisgKiBBZ2FpbiAtIHRoaXMgaXMganVzdCBhICh2ZXJ5IHN0cm9uZyBpbiBwcmFjdGljZSkgaGV1cmlzdGljIHRoYXQKKyAqIHRoZSBpbm9kZSBoYXNuJ3QgY2hhbmdlZC4KKyAqCisgKiBXZSBzYXZlIHRoZSBmaWVsZHMgaW4gYmlnLWVuZGlhbiBvcmRlciB0byBhbGxvdyB1c2luZyB0aGUKKyAqIGluZGV4IGZpbGUgb3ZlciBORlMgdHJhbnNwYXJlbnRseS4KKyAqLworc3RydWN0IGNhY2hlX2VudHJ5IHsKKwlzdHJ1Y3QgY2FjaGVfdGltZSBjZV9jdGltZTsKKwlzdHJ1Y3QgY2FjaGVfdGltZSBjZV9tdGltZTsKKwl1bnNpZ25lZCBpbnQgY2VfZGV2OworCXVuc2lnbmVkIGludCBjZV9pbm87CisJdW5zaWduZWQgaW50IGNlX21vZGU7CisJdW5zaWduZWQgaW50IGNlX3VpZDsKKwl1bnNpZ25lZCBpbnQgY2VfZ2lkOworCXVuc2lnbmVkIGludCBjZV9zaXplOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgc2hvcnQgY2VfZmxhZ3M7CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCisjZGVmaW5lIENFX05BTUVNQVNLICAoMHgwZmZmKQorI2RlZmluZSBDRV9TVEFHRU1BU0sgKDB4MzAwMCkKKyNkZWZpbmUgQ0VfVVBEQVRFICAgICgweDQwMDApCisjZGVmaW5lIENFX1ZBTElEICAgICAoMHg4MDAwKQorI2RlZmluZSBDRV9TVEFHRVNISUZUIDEyCisKKyNkZWZpbmUgY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpIGh0b25zKChsZW4pIHwgKChzdGFnZSkgPDwgQ0VfU1RBR0VTSElGVCkpCisjZGVmaW5lIGNlX25hbWVsZW4oY2UpIChDRV9OQU1FTUFTSyAmIG50b2hzKChjZSktPmNlX2ZsYWdzKSkKKyNkZWZpbmUgY2Vfc2l6ZShjZSkgY2FjaGVfZW50cnlfc2l6ZShjZV9uYW1lbGVuKGNlKSkKKyNkZWZpbmUgY2Vfc3RhZ2UoY2UpICgoQ0VfU1RBR0VNQVNLICYgbnRvaHMoKGNlKS0+Y2VfZmxhZ3MpKSA+PiBDRV9TVEFHRVNISUZUKQorCisjZGVmaW5lIGNlX3Blcm1pc3Npb25zKG1vZGUpICgoKG1vZGUpICYgMDEwMCkgPyAwNzU1IDogMDY0NCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyZWF0ZV9jZV9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCWlmIChTX0lTTE5LKG1vZGUpKQorCQlyZXR1cm4gaHRvbmwoU19JRkxOSyk7CisJaWYgKFNfSVNESVIobW9kZSkgfHwgU19JU0RJUkxOSyhtb2RlKSkKKwkJcmV0dXJuIGh0b25sKFNfSUZESVJMTkspOworCXJldHVybiBodG9ubChTX0lGUkVHIHwgY2VfcGVybWlzc2lvbnMobW9kZSkpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2VfbW9kZV9mcm9tX3N0YXQoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJZXh0ZXJuIGludCB0cnVzdF9leGVjdXRhYmxlX2JpdCwgaGFzX3N5bWxpbmtzOworCWlmICghaGFzX3N5bWxpbmtzICYmIFNfSVNSRUcobW9kZSkgJiYKKwkgICAgY2UgJiYgU19JU0xOSyhudG9obChjZS0+Y2VfbW9kZSkpKQorCQlyZXR1cm4gY2UtPmNlX21vZGU7CisJaWYgKCF0cnVzdF9leGVjdXRhYmxlX2JpdCAmJiBTX0lTUkVHKG1vZGUpKSB7CisJCWlmIChjZSAmJiBTX0lTUkVHKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQlyZXR1cm4gY2UtPmNlX21vZGU7CisJCXJldHVybiBjcmVhdGVfY2VfbW9kZSgwNjY2KTsKKwl9CisJcmV0dXJuIGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworfQorI2RlZmluZSBjYW5vbl9tb2RlKG1vZGUpIFwKKwkoU19JU1JFRyhtb2RlKSA/IChTX0lGUkVHIHwgY2VfcGVybWlzc2lvbnMobW9kZSkpIDogXAorCVNfSVNMTksobW9kZSkgPyBTX0lGTE5LIDogU19JU0RJUihtb2RlKSA/IFNfSUZESVIgOiBTX0lGRElSTE5LKQorCisjZGVmaW5lIGNhY2hlX2VudHJ5X3NpemUobGVuKSAoKG9mZnNldG9mKHN0cnVjdCBjYWNoZV9lbnRyeSxuYW1lKSArIChsZW4pICsgOCkgJiB+NykKKworc3RydWN0IGluZGV4X3N0YXRlIHsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZTsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfbnIsIGNhY2hlX2FsbG9jLCBjYWNoZV9jaGFuZ2VkOworCXN0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlOworCXRpbWVfdCB0aW1lc3RhbXA7CisJdm9pZCAqbW1hcDsKKwlzaXplX3QgbW1hcF9zaXplOworfTsKKworZXh0ZXJuIHN0cnVjdCBpbmRleF9zdGF0ZSB0aGVfaW5kZXg7CisKKyNpZm5kZWYgTk9fVEhFX0lOREVYX0NPTVBBVElCSUxJVFlfTUFDUk9TCisjZGVmaW5lIGFjdGl2ZV9jYWNoZSAodGhlX2luZGV4LmNhY2hlKQorI2RlZmluZSBhY3RpdmVfbnIgKHRoZV9pbmRleC5jYWNoZV9ucikKKyNkZWZpbmUgYWN0aXZlX2FsbG9jICh0aGVfaW5kZXguY2FjaGVfYWxsb2MpCisjZGVmaW5lIGFjdGl2ZV9jYWNoZV9jaGFuZ2VkICh0aGVfaW5kZXguY2FjaGVfY2hhbmdlZCkKKyNkZWZpbmUgYWN0aXZlX2NhY2hlX3RyZWUgKHRoZV9pbmRleC5jYWNoZV90cmVlKQorCisjZGVmaW5lIHJlYWRfY2FjaGUoKSByZWFkX2luZGV4KCZ0aGVfaW5kZXgpCisjZGVmaW5lIHJlYWRfY2FjaGVfZnJvbShwYXRoKSByZWFkX2luZGV4X2Zyb20oJnRoZV9pbmRleCwgKHBhdGgpKQorI2RlZmluZSB3cml0ZV9jYWNoZShuZXdmZCwgY2FjaGUsIGVudHJpZXMpIHdyaXRlX2luZGV4KCZ0aGVfaW5kZXgsIChuZXdmZCkpCisjZGVmaW5lIGRpc2NhcmRfY2FjaGUoKSBkaXNjYXJkX2luZGV4KCZ0aGVfaW5kZXgpCisjZGVmaW5lIGNhY2hlX25hbWVfcG9zKG5hbWUsIG5hbWVsZW4pIGluZGV4X25hbWVfcG9zKCZ0aGVfaW5kZXgsKG5hbWUpLChuYW1lbGVuKSkKKyNkZWZpbmUgYWRkX2NhY2hlX2VudHJ5KGNlLCBvcHRpb24pIGFkZF9pbmRleF9lbnRyeSgmdGhlX2luZGV4LCAoY2UpLCAob3B0aW9uKSkKKyNkZWZpbmUgcmVtb3ZlX2NhY2hlX2VudHJ5X2F0KHBvcykgcmVtb3ZlX2luZGV4X2VudHJ5X2F0KCZ0aGVfaW5kZXgsIChwb3MpKQorI2RlZmluZSByZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGgpIHJlbW92ZV9maWxlX2Zyb21faW5kZXgoJnRoZV9pbmRleCwgKHBhdGgpKQorI2RlZmluZSBhZGRfZmlsZV90b19jYWNoZShwYXRoLCB2ZXJib3NlKSBhZGRfZmlsZV90b19pbmRleCgmdGhlX2luZGV4LCAocGF0aCksICh2ZXJib3NlKSkKKyNkZWZpbmUgcmVmcmVzaF9jYWNoZShmbGFncykgcmVmcmVzaF9pbmRleCgmdGhlX2luZGV4LCBmbGFncykKKyNkZWZpbmUgY2VfbWF0Y2hfc3RhdChjZSwgc3QsIHJlYWxseSkgaWVfbWF0Y2hfc3RhdCgmdGhlX2luZGV4LCAoY2UpLCAoc3QpLCAocmVhbGx5KSkKKyNkZWZpbmUgY2VfbW9kaWZpZWQoY2UsIHN0LCByZWFsbHkpIGllX21vZGlmaWVkKCZ0aGVfaW5kZXgsIChjZSksIChzdCksIChyZWFsbHkpKQorI2VuZGlmCisKK2VudW0gb2JqZWN0X3R5cGUgeworCU9CSl9CQUQgPSAtMSwKKwlPQkpfTk9ORSA9IDAsCisJT0JKX0NPTU1JVCA9IDEsCisJT0JKX1RSRUUgPSAyLAorCU9CSl9CTE9CID0gMywKKwlPQkpfVEFHID0gNCwKKwkvKiA1IGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisJT0JKX09GU19ERUxUQSA9IDYsCisJT0JKX1JFRl9ERUxUQSA9IDcsCisJT0JKX01BWCwKK307CisKKyNkZWZpbmUgR0lUX0RJUl9FTlZJUk9OTUVOVCAiR0lUX0RJUiIKKyNkZWZpbmUgREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UICIuZ2l0IgorI2RlZmluZSBEQl9FTlZJUk9OTUVOVCAiR0lUX09CSkVDVF9ESVJFQ1RPUlkiCisjZGVmaW5lIElOREVYX0VOVklST05NRU5UICJHSVRfSU5ERVhfRklMRSIKKyNkZWZpbmUgR1JBRlRfRU5WSVJPTk1FTlQgIkdJVF9HUkFGVF9GSUxFIgorI2RlZmluZSBURU1QTEFURV9ESVJfRU5WSVJPTk1FTlQgIkdJVF9URU1QTEFURV9ESVIiCisjZGVmaW5lIENPTkZJR19FTlZJUk9OTUVOVCAiR0lUX0NPTkZJRyIKKyNkZWZpbmUgQ09ORklHX0xPQ0FMX0VOVklST05NRU5UICJHSVRfQ09ORklHX0xPQ0FMIgorI2RlZmluZSBFWEVDX1BBVEhfRU5WSVJPTk1FTlQgIkdJVF9FWEVDX1BBVEgiCisjZGVmaW5lIEdJVEFUVFJJQlVURVNfRklMRSAiLmdpdGF0dHJpYnV0ZXMiCisjZGVmaW5lIElORk9BVFRSSUJVVEVTX0ZJTEUgImluZm8vYXR0cmlidXRlcyIKKyNkZWZpbmUgQVRUUklCVVRFX01BQ1JPX1BSRUZJWCAiW2F0dHJdIgorCitleHRlcm4gaW50IGlzX2JhcmVfcmVwb3NpdG9yeV9jZmc7CitleHRlcm4gaW50IGlzX2JhcmVfcmVwb3NpdG9yeSh2b2lkKTsKK2V4dGVybiBpbnQgaXNfaW5zaWRlX2dpdF9kaXIodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqZ2V0X2dpdF9kaXIodm9pZCk7CitleHRlcm4gY2hhciAqZ2V0X29iamVjdF9kaXJlY3Rvcnkodm9pZCk7CitleHRlcm4gY2hhciAqZ2V0X3JlZnNfZGlyZWN0b3J5KHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9pbmRleF9maWxlKHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9ncmFmdF9maWxlKHZvaWQpOworCisjZGVmaW5lIEFMVEVSTkFURV9EQl9FTlZJUk9OTUVOVCAiR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMiCisKK2V4dGVybiBjb25zdCBjaGFyICoqZ2V0X3BhdGhzcGVjKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKK2V4dGVybiBjb25zdCBjaGFyICpzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseShpbnQgKik7CitleHRlcm4gY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeSh2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXhfcGF0aChjb25zdCBjaGFyICpwcmVmaXgsIGludCBsZW4sIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeF9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGludCBsZW4sIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIHZvaWQgdmVyaWZ5X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCB2ZXJpZnlfbm9uX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNkZWZpbmUgYWxsb2NfbnIoeCkgKCgoeCkrMTYpKjMvMikKKworLyogSW5pdGlhbGl6ZSBhbmQgdXNlIHRoZSBjYWNoZSBpbmZvcm1hdGlvbiAqLworZXh0ZXJuIGludCByZWFkX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqKTsKK2V4dGVybiBpbnQgcmVhZF9pbmRleF9mcm9tKHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBpbnQgd3JpdGVfaW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICosIGludCBuZXdmZCk7CitleHRlcm4gaW50IGRpc2NhcmRfaW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICopOworZXh0ZXJuIGludCB2ZXJpZnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBpbnQgaW5kZXhfbmFtZV9wb3Moc3RydWN0IGluZGV4X3N0YXRlICosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX0FERCAxCQkvKiBPayB0byBhZGQgKi8KKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgMgkvKiBPayB0byByZXBsYWNlIGZpbGUvZGlyZWN0b3J5ICovCisjZGVmaW5lIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0sgNAkvKiBPayB0byBza2lwIERGIGNvbmZsaWN0IGNoZWNrcyAqLworZXh0ZXJuIGludCBhZGRfaW5kZXhfZW50cnkoc3RydWN0IGluZGV4X3N0YXRlICosIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGludCBvcHRpb24pOworZXh0ZXJuIHN0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9jYWNoZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcmVhbGx5KTsKK2V4dGVybiBpbnQgcmVtb3ZlX2luZGV4X2VudHJ5X2F0KHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBpbnQgcG9zKTsKK2V4dGVybiBpbnQgcmVtb3ZlX2ZpbGVfZnJvbV9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gaW50IGFkZF9maWxlX3RvX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSk7CitleHRlcm4gaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYik7CitleHRlcm4gaW50IGllX21hdGNoX3N0YXQoc3RydWN0IGluZGV4X3N0YXRlICosIHN0cnVjdCBjYWNoZV9lbnRyeSAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworZXh0ZXJuIGludCBpZV9tb2RpZmllZChzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgc3RydWN0IGNhY2hlX2VudHJ5ICosIHN0cnVjdCBzdGF0ICosIGludCk7CitleHRlcm4gaW50IGNlX3BhdGhfbWF0Y2goY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKK2V4dGVybiBpbnQgaW5kZXhfZmQodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gaW50IHJlYWRfcGlwZShpbnQgZmQsIGNoYXIqKiByZXR1cm5fYnVmLCB1bnNpZ25lZCBsb25nKiByZXR1cm5fc2l6ZSk7CitleHRlcm4gaW50IGluZGV4X3BpcGUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KTsKK2V4dGVybiBpbnQgaW5kZXhfcGF0aCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QpOworZXh0ZXJuIHZvaWQgZmlsbF9zdGF0X2NhY2hlX2luZm8oc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KTsKKworI2RlZmluZSBSRUZSRVNIX1JFQUxMWQkJMHgwMDAxCS8qIGlnbm9yZV92YWxpZCAqLworI2RlZmluZSBSRUZSRVNIX1VOTUVSR0VECTB4MDAwMgkvKiBhbGxvdyB1bm1lcmdlZCAqLworI2RlZmluZSBSRUZSRVNIX1FVSUVUCQkweDAwMDQJLyogYmUgcXVpZXQgYWJvdXQgaXQgKi8KKyNkZWZpbmUgUkVGUkVTSF9JR05PUkVfTUlTU0lORwkweDAwMDgJLyogaWdub3JlIG5vbi1leGlzdGVudCAqLworZXh0ZXJuIGludCByZWZyZXNoX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCitzdHJ1Y3QgbG9ja19maWxlIHsKKwlzdHJ1Y3QgbG9ja19maWxlICpuZXh0OworCXBpZF90IG93bmVyOworCWNoYXIgb25fbGlzdDsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKK307CitleHRlcm4gaW50IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoc3RydWN0IGxvY2tfZmlsZSAqLCBjb25zdCBjaGFyICpwYXRoLCBpbnQpOworZXh0ZXJuIGludCBjb21taXRfbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKik7CisKK2V4dGVybiBpbnQgaG9sZF9sb2NrZWRfaW5kZXgoc3RydWN0IGxvY2tfZmlsZSAqLCBpbnQpOworZXh0ZXJuIGludCBjb21taXRfbG9ja2VkX2luZGV4KHN0cnVjdCBsb2NrX2ZpbGUgKik7CitleHRlcm4gdm9pZCBzZXRfYWx0ZXJuYXRlX2luZGV4X291dHB1dChjb25zdCBjaGFyICopOworCitleHRlcm4gdm9pZCByb2xsYmFja19sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqKTsKK2V4dGVybiBpbnQgZGVsZXRlX3JlZihjb25zdCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiBFbnZpcm9ubWVudCBiaXRzIGZyb20gY29uZmlndXJhdGlvbiBtZWNoYW5pc20gKi8KK2V4dGVybiBpbnQgdXNlX2xlZ2FjeV9oZWFkZXJzOworZXh0ZXJuIGludCB0cnVzdF9leGVjdXRhYmxlX2JpdDsKK2V4dGVybiBpbnQgaGFzX3N5bWxpbmtzOworZXh0ZXJuIGludCBhc3N1bWVfdW5jaGFuZ2VkOworZXh0ZXJuIGludCBwcmVmZXJfc3ltbGlua19yZWZzOworZXh0ZXJuIGludCBsb2dfYWxsX3JlZl91cGRhdGVzOworZXh0ZXJuIGludCB3YXJuX2FtYmlndW91c19yZWZzOworZXh0ZXJuIGludCBzaGFyZWRfcmVwb3NpdG9yeTsKK2V4dGVybiBjb25zdCBjaGFyICphcHBseV9kZWZhdWx0X3doaXRlc3BhY2U7CitleHRlcm4gaW50IHpsaWJfY29tcHJlc3Npb25fbGV2ZWw7CitleHRlcm4gc2l6ZV90IHBhY2tlZF9naXRfd2luZG93X3NpemU7CitleHRlcm4gc2l6ZV90IHBhY2tlZF9naXRfbGltaXQ7CitleHRlcm4gc2l6ZV90IGRlbHRhX2Jhc2VfY2FjaGVfbGltaXQ7CitleHRlcm4gaW50IGF1dG9fY3JsZjsKKworI2RlZmluZSBHSVRfUkVQT19WRVJTSU9OIDAKK2V4dGVybiBpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbjsKK2V4dGVybiBpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQodm9pZCk7CisKKyNkZWZpbmUgTVRJTUVfQ0hBTkdFRAkweDAwMDEKKyNkZWZpbmUgQ1RJTUVfQ0hBTkdFRAkweDAwMDIKKyNkZWZpbmUgT1dORVJfQ0hBTkdFRAkweDAwMDQKKyNkZWZpbmUgTU9ERV9DSEFOR0VEICAgIDB4MDAwOAorI2RlZmluZSBJTk9ERV9DSEFOR0VEICAgMHgwMDEwCisjZGVmaW5lIERBVEFfQ0hBTkdFRCAgICAweDAwMjAKKyNkZWZpbmUgVFlQRV9DSEFOR0VEICAgIDB4MDA0MAorCisvKiBSZXR1cm4gYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaWxlbmFtZSBtYXRjaGluZyB0aGUgc2hhMSBzaWduYXR1cmUgKi8KK2V4dGVybiBjaGFyICpta3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGNoYXIgKmdpdF9wYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBjaGFyICpzaGExX2ZpbGVfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjb25zdCBjaGFyICpmaW5kX3VuaXF1ZV9hYmJyZXYoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50KTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG51bGxfc2hhMVsyMF07CitzdGF0aWMgaW5saW5lIGludCBpc19udWxsX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gIW1lbWNtcChzaGExLCBudWxsX3NoYTEsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hjbXAoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMikKK3sKKwlyZXR1cm4gbWVtY21wKHNoYTEsIHNoYTIsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoY3B5KHVuc2lnbmVkIGNoYXIgKnNoYV9kc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYV9zcmMpCit7CisJbWVtY3B5KHNoYV9kc3QsIHNoYV9zcmMsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoY2xyKHVuc2lnbmVkIGNoYXIgKmhhc2gpCit7CisJbWVtc2V0KGhhc2gsIDAsIDIwKTsKK30KKworaW50IGdpdF9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSk7CisKK2VudW0gc2hhcmVkcmVwbyB7CisJUEVSTV9VTUFTSyA9IDAsCisJUEVSTV9HUk9VUCwKKwlQRVJNX0VWRVJZQk9EWQorfTsKK2ludCBnaXRfY29uZmlnX3Blcm0oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CitpbnQgYWRqdXN0X3NoYXJlZF9wZXJtKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoY2hhciAqcGF0aCk7CitjaGFyICplbnRlcl9yZXBvKGNoYXIgKnBhdGgsIGludCBzdHJpY3QpOworCisvKiBSZWFkIGFuZCB1bnBhY2sgYSBzaGExIGZpbGUgaW50byBtZW1vcnksIHdyaXRlIG1lbW9yeSB0byBhIHNoYTEgZmlsZSAqLworZXh0ZXJuIGludCBzaGExX29iamVjdF9pbmZvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiB2b2lkICogcmVhZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitleHRlcm4gaW50IGhhc2hfc2hhMV9maWxlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCB3cml0ZV9zaGExX2ZpbGUodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqcmV0dXJuX3NoYTEpOworZXh0ZXJuIGludCBwcmV0ZW5kX3NoYTFfZmlsZSh2b2lkICosIHVuc2lnbmVkIGxvbmcsIGVudW0gb2JqZWN0X3R5cGUsIHVuc2lnbmVkIGNoYXIgKik7CisKK2V4dGVybiBpbnQgY2hlY2tfc2hhMV9zaWduYXR1cmUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnR5cGUpOworCitleHRlcm4gaW50IHdyaXRlX3NoYTFfZnJvbV9mZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmQsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBidWZzaXplLCBzaXplX3QgKmJ1ZnBvc24pOworZXh0ZXJuIGludCB3cml0ZV9zaGExX3RvX2ZkKGludCBmZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IG1vdmVfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworZXh0ZXJuIGludCBoYXNfc2hhMV9wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKippZ25vcmUpOworZXh0ZXJuIGludCBoYXNfc2hhMV9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIHZvaWQgKm1hcF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiBpbnQgbGVnYWN5X2xvb3NlX29iamVjdCh1bnNpZ25lZCBjaGFyICopOworCitleHRlcm4gaW50IGhhc19wYWNrX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IGhhc19wYWNrX2luZGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitleHRlcm4gY29uc3Qgc2lnbmVkIGNoYXIgaGV4dmFsX3RhYmxlWzI1Nl07CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoZXh2YWwodW5zaWduZWQgY2hhciBjKQoreworCXJldHVybiBoZXh2YWxfdGFibGVbY107Cit9CisKKy8qIENvbnZlcnQgdG8vZnJvbSBoZXgvc2hhMSByZXByZXNlbnRhdGlvbiAqLworI2RlZmluZSBNSU5JTVVNX0FCQlJFViA0CisjZGVmaW5lIERFRkFVTFRfQUJCUkVWIDcKKworZXh0ZXJuIGludCBnZXRfc2hhMShjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBnZXRfc2hhMV93aXRoX21vZGUoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCAqbW9kZSk7CitleHRlcm4gaW50IGdldF9zaGExX2hleChjb25zdCBjaGFyICpoZXgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNoYXIgKnNoYTFfdG9faGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOwkvKiBzdGF0aWMgYnVmZmVyIHJlc3VsdCEgKi8KK2V4dGVybiBpbnQgcmVhZF9yZWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnJlc29sdmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCwgaW50ICopOworZXh0ZXJuIGludCBkd2ltX3JlZihjb25zdCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKipyZWYpOworZXh0ZXJuIGludCBkd2ltX2xvZyhjb25zdCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKipyZWYpOworCitleHRlcm4gaW50IGNyZWF0ZV9zeW1yZWYoY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3RlciwgY29uc3QgY2hhciAqbG9nbXNnKTsKK2V4dGVybiBpbnQgdmFsaWRhdGVfaGVhZHJlZihjb25zdCBjaGFyICpyZWYpOworCitleHRlcm4gaW50IGJhc2VfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMSwgaW50IG1vZGUxLCBjb25zdCBjaGFyICpuYW1lMiwgaW50IGxlbjIsIGludCBtb2RlMik7CitleHRlcm4gaW50IGNhY2hlX25hbWVfY29tcGFyZShjb25zdCBjaGFyICpuYW1lMSwgaW50IGxlbjEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgbGVuMik7CisKK2V4dGVybiB2b2lkICpyZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQljb25zdCBjaGFyICpyZXF1aXJlZF90eXBlLAorCQkJCQl1bnNpZ25lZCBsb25nICpzaXplLAorCQkJCQl1bnNpZ25lZCBjaGFyICpzaGExX3JldCk7CisKK2VudW0gZGF0ZV9tb2RlIHsgREFURV9OT1JNQUwgPSAwLCBEQVRFX1JFTEFUSVZFLCBEQVRFX1NIT1JULCBEQVRFX0xPQ0FMIH07Citjb25zdCBjaGFyICpzaG93X2RhdGUodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdGltZXpvbmUsIGVudW0gZGF0ZV9tb2RlIG1vZGUpOworY29uc3QgY2hhciAqc2hvd19yZmMyODIyX2RhdGUodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdGltZXpvbmUpOworaW50IHBhcnNlX2RhdGUoY29uc3QgY2hhciAqZGF0ZSwgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSk7Cit2b2lkIGRhdGVzdGFtcChjaGFyICpidWYsIGludCBidWZzaXplKTsKK3Vuc2lnbmVkIGxvbmcgYXBwcm94aWRhdGUoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmdpdF9hdXRob3JfaW5mbyhpbnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmdpdF9jb21taXR0ZXJfaW5mbyhpbnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmZtdF9pZGVudChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICplbWFpbCwgY29uc3QgY2hhciAqZGF0ZV9zdHIsIGludCk7CisKK3N0cnVjdCBjaGVja291dCB7CisJY29uc3QgY2hhciAqYmFzZV9kaXI7CisJaW50IGJhc2VfZGlyX2xlbjsKKwl1bnNpZ25lZCBmb3JjZToxLAorCQkgcXVpZXQ6MSwKKwkJIG5vdF9uZXc6MSwKKwkJIHJlZnJlc2hfY2FjaGU6MTsKK307CisKK2V4dGVybiBpbnQgY2hlY2tvdXRfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3Qgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSwgY2hhciAqdG9wYXRoKTsKK2V4dGVybiBpbnQgaGFzX3N5bWxpbmtfbGVhZGluZ19wYXRoKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmxhc3Rfc3ltbGluayk7CisKK2V4dGVybiBzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSB7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKm5leHQ7CisJY2hhciAqbmFtZTsKKwljaGFyIGJhc2VbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK30gKmFsdF9vZGJfbGlzdDsKK2V4dGVybiB2b2lkIHByZXBhcmVfYWx0X29kYih2b2lkKTsKKworc3RydWN0IHBhY2tfd2luZG93IHsKKwlzdHJ1Y3QgcGFja193aW5kb3cgKm5leHQ7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwlvZmZfdCBvZmZzZXQ7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBpbnQgbGFzdF91c2VkOworCXVuc2lnbmVkIGludCBpbnVzZV9jbnQ7Cit9OworCitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgeworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXh0OworCXN0cnVjdCBwYWNrX3dpbmRvdyAqd2luZG93czsKKwlvZmZfdCBwYWNrX3NpemU7CisJY29uc3Qgdm9pZCAqaW5kZXhfZGF0YTsKKwlzaXplX3QgaW5kZXhfc2l6ZTsKKwl1aW50MzJfdCBudW1fb2JqZWN0czsKKwlpbnQgaW5kZXhfdmVyc2lvbjsKKwl0aW1lX3QgbXRpbWU7CisJaW50IHBhY2tfZmQ7CisJaW50IHBhY2tfbG9jYWw7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkvKiBzb21ldGhpbmcgbGlrZSAiLmdpdC9vYmplY3RzL3BhY2sveHh4eHgucGFjayIgKi8KKwljaGFyIHBhY2tfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfSAqcGFja2VkX2dpdDsKKworc3RydWN0IHBhY2tfZW50cnkgeworCW9mZl90IG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworfTsKKworc3RydWN0IHJlZiB7CisJc3RydWN0IHJlZiAqbmV4dDsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyIG5ld19zaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyIGZvcmNlOworCXN0cnVjdCByZWYgKnBlZXJfcmVmOyAvKiB3aGVuIHJlbmFtaW5nICovCisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCisjZGVmaW5lIFJFRl9OT1JNQUwJKDF1IDw8IDApCisjZGVmaW5lIFJFRl9IRUFEUwkoMXUgPDwgMSkKKyNkZWZpbmUgUkVGX1RBR1MJKDF1IDw8IDIpCisKK2V4dGVybiBwaWRfdCBnaXRfY29ubmVjdChpbnQgZmRbMl0sIGNoYXIgKnVybCwgY29uc3QgY2hhciAqcHJvZyk7CitleHRlcm4gaW50IGZpbmlzaF9jb25uZWN0KHBpZF90IHBpZCk7CitleHRlcm4gaW50IHBhdGhfbWF0Y2goY29uc3QgY2hhciAqcGF0aCwgaW50IG5yLCBjaGFyICoqbWF0Y2gpOworZXh0ZXJuIGludCBtYXRjaF9yZWZzKHN0cnVjdCByZWYgKnNyYywgc3RydWN0IHJlZiAqZHN0LCBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLAorCQkgICAgICBpbnQgbnJfcmVmc3BlYywgY2hhciAqKnJlZnNwZWMsIGludCBhbGwpOworZXh0ZXJuIGludCBnZXRfYWNrKGludCBmZCwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpOworZXh0ZXJuIHN0cnVjdCByZWYgKipnZXRfcmVtb3RlX2hlYWRzKGludCBpbiwgc3RydWN0IHJlZiAqKmxpc3QsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBzZXJ2ZXJfc3VwcG9ydHMoY29uc3QgY2hhciAqZmVhdHVyZSk7CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCQljb25zdCBjaGFyICppZHhfcGF0aCk7CisKK2V4dGVybiB2b2lkIHByZXBhcmVfcGFja2VkX2dpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJlcHJlcGFyZV9wYWNrZWRfZ2l0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5zdGFsbF9wYWNrZWRfZ2l0KHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrKTsKKworZXh0ZXJuIHN0cnVjdCBwYWNrZWRfZ2l0ICpmaW5kX3NoYTFfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCAKKwkJCQkJIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrcyk7CisKK2V4dGVybiB2b2lkIHBhY2tfcmVwb3J0KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIqIHVzZV9wYWNrKHN0cnVjdCBwYWNrZWRfZ2l0ICosIHN0cnVjdCBwYWNrX3dpbmRvdyAqKiwgb2ZmX3QsIHVuc2lnbmVkIGludCAqKTsKK2V4dGVybiB2b2lkIHVudXNlX3BhY2soc3RydWN0IHBhY2tfd2luZG93ICoqKTsKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqYWRkX3BhY2tlZF9naXQoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciAqbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShjb25zdCBzdHJ1Y3QgcGFja2VkX2dpdCAqLCB1aW50MzJfdCk7CitleHRlcm4gb2ZmX3QgZmluZF9wYWNrX2VudHJ5X29uZShjb25zdCB1bnNpZ25lZCBjaGFyICosIHN0cnVjdCBwYWNrZWRfZ2l0ICopOworZXh0ZXJuIHZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja2VkX2dpdCAqLCBvZmZfdCwgZW51bSBvYmplY3RfdHlwZSAqLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW5wYWNrX29iamVjdF9oZWFkZXJfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF9zaXplX2Zyb21fZGVsdGEoc3RydWN0IHBhY2tlZF9naXQgKiwgc3RydWN0IHBhY2tfd2luZG93ICoqLCBvZmZfdCk7CitleHRlcm4gY29uc3QgY2hhciAqcGFja2VkX29iamVjdF9pbmZvX2RldGFpbChzdHJ1Y3QgcGFja2VkX2dpdCAqLCBvZmZfdCwgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBjaGFyICopOworCisvKiBEdW1iIHNlcnZlcnMgc3VwcG9ydCAqLworZXh0ZXJuIGludCB1cGRhdGVfc2VydmVyX2luZm8oaW50KTsKKwordHlwZWRlZiBpbnQgKCpjb25maWdfZm5fdCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX2Zyb21fZmlsZShjb25maWdfZm5fdCBmbiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZyhjb25maWdfZm5fdCBmbik7CitleHRlcm4gaW50IGdpdF9jb25maWdfaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19ib29sKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCBnaXRfY29uZmlnX3JlbmFtZV9zZWN0aW9uKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworI2RlZmluZSBNQVhfR0lUTkFNRSAoMTAwMCkKK2V4dGVybiBjaGFyIGdpdF9kZWZhdWx0X2VtYWlsW01BWF9HSVROQU1FXTsKK2V4dGVybiBjaGFyIGdpdF9kZWZhdWx0X25hbWVbTUFYX0dJVE5BTUVdOworCitleHRlcm4gY29uc3QgY2hhciAqZ2l0X2NvbW1pdF9lbmNvZGluZzsKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfbG9nX291dHB1dF9lbmNvZGluZzsKKworZXh0ZXJuIGludCBjb3B5X2ZkKGludCBpZmQsIGludCBvZmQpOworZXh0ZXJuIGludCByZWFkX2luX2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitleHRlcm4gaW50IHdyaXRlX2luX2Z1bGwoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitleHRlcm4gdm9pZCB3cml0ZV9vcl9kaWUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitleHRlcm4gaW50IHdyaXRlX29yX3doaW5lKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKm1zZyk7CitleHRlcm4gaW50IHdyaXRlX29yX3doaW5lX3BpcGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqbXNnKTsKKworLyogcGFnZXIuYyAqLworZXh0ZXJuIHZvaWQgc2V0dXBfcGFnZXIodm9pZCk7CitleHRlcm4gaW50IHBhZ2VyX2luX3VzZTsKK2V4dGVybiBpbnQgcGFnZXJfdXNlX2NvbG9yOworCisvKiBiYXNlODUgKi8KK2ludCBkZWNvZGVfODUoY2hhciAqZHN0LCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGluZWxlbik7Cit2b2lkIGVuY29kZV84NShjaGFyICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBieXRlcyk7CisKKy8qIGFsbG9jLmMgKi8KK2V4dGVybiB2b2lkICphbGxvY19ibG9iX25vZGUodm9pZCk7CitleHRlcm4gdm9pZCAqYWxsb2NfdHJlZV9ub2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgKmFsbG9jX2NvbW1pdF9ub2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgKmFsbG9jX3RhZ19ub2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgKmFsbG9jX29iamVjdF9ub2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgYWxsb2NfcmVwb3J0KHZvaWQpOworCisvKiB0cmFjZS5jICovCitleHRlcm4gaW50IG5mYXNwcmludGYoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIGludCBuZnZhc3ByaW50ZihjaGFyICoqc3RyLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpOworZXh0ZXJuIHZvaWQgdHJhY2VfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB2b2lkIHRyYWNlX2FyZ3ZfcHJpbnRmKGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworLyogY29udmVydC5jICovCitleHRlcm4gY2hhciAqY29udmVydF90b19naXQoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nICpzaXplcCk7CitleHRlcm4gY2hhciAqY29udmVydF90b193b3JraW5nX3RyZWUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nICpzaXplcCk7CitleHRlcm4gdm9pZCAqY29udmVydF9zaGExX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgaW50IG1vZGUsIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCisvKiBtYXRjaC10cmVlcy5jICovCit2b2lkIHNoaWZ0X3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIENBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2NoZWNrLWJ1aWx0aW5zLnNoIGIvY2hlY2stYnVpbHRpbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDZmZTZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NoZWNrLWJ1aWx0aW5zLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorCit7CisJY2F0IDw8XEVPRgorc2F5SXQ6CisJJChmb3JlYWNoIGIsJChCVUlMVF9JTlMpLGVjaG8gWFhYICRiIFlZWTspCitFT0YKKwljYXQgTWFrZWZpbGUKK30gfAorbWFrZSAtZiAtIHNheUl0IDI+L2Rldi9udWxsIHwKK3NlZCAtbiAtZSAncy8uKlhYWCBcKC4qXCkgWVlZLiovXDEvcCcgfAorc29ydCB8Cit7CisgICAgYmFkPTAKKyAgICB3aGlsZSByZWFkIGJ1aWx0aW4KKyAgICBkbworCWJhc2U9YGV4cHIgIiRidWlsdGluIiA6ICdnaXQtXCguKlwpJ2AKKwl4PWBzZWQgLW5lICdzLy4qeyAiJyRiYXNlJyIsIFwoY21kX1teLCBdKlwpLiovJyRiYXNlJwlcMS9wJyBnaXQuY2AKKwlpZiB0ZXN0IC16ICIkeCIKKwl0aGVuCisJCWVjaG8gIiRiYXNlIGlzIGJ1aWx0aW4gYnV0IG5vdCBsaXN0ZWQgaW4gZ2l0LmMgY29tbWFuZCBsaXN0IgorCQliYWQ9MQorCWZpCisJZm9yIHNmeCBpbiBzaCBwZXJsIHB5CisJZG8KKwkJaWYgdGVzdCAtZiAiJGJ1aWx0aW4uJHNmeCIKKwkJdGhlbgorCQkJZWNobyAiJGJhc2UgaXMgYnVpbHRpbiBidXQgJGJ1aWx0aW4uJHNmeCBzdGlsbCBleGlzdHMiCisJCQliYWQ9MQorCQlmaQorCWRvbmUKKyAgICBkb25lCisgICAgZXhpdCAkYmFkCit9CmRpZmYgLS1naXQgYS9jaGVjay1yYWN5LmMgYi9jaGVjay1yYWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMDhiNAotLS0gL2Rldi9udWxsCisrKyBiL2NoZWNrLXJhY3kuYwpAQCAtMCwwICsxLDI4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJaW50IGk7CisJaW50IGRpcnR5LCBjbGVhbiwgcmFjeTsKKworCWRpcnR5ID0gY2xlYW4gPSByYWN5ID0gMDsKKwlyZWFkX2NhY2hlKCk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCXN0cnVjdCBzdGF0IHN0OworCisJCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSkgeworCQkJZXJyb3IoImxzdGF0KCVzKTogJXMiLCBjZS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMCkpCisJCQlkaXJ0eSsrOworCQllbHNlIGlmIChjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDIpKQorCQkJcmFjeSsrOworCQllbHNlCisJCQljbGVhbisrOworCX0KKwlwcmludGYoImRpcnR5ICVkLCBjbGVhbiAlZCwgcmFjeSAlZFxuIiwgZGlydHksIGNsZWFuLCByYWN5KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbG9yLmMgYi9jb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDgyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xvci5jCkBAIC0wLDAgKzEsMTczIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorCisjZGVmaW5lIENPTE9SX1JFU0VUICJcMDMzW20iCisKK3N0YXRpYyBpbnQgcGFyc2VfY29sb3IoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX25hbWVzW10gPSB7CisJCSJub3JtYWwiLCAiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsCisJCSJibHVlIiwgIm1hZ2VudGEiLCAiY3lhbiIsICJ3aGl0ZSIKKwl9OworCWNoYXIgKmVuZDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2xvcl9uYW1lcyk7IGkrKykgeworCQljb25zdCBjaGFyICpzdHIgPSBjb2xvcl9uYW1lc1tpXTsKKwkJaWYgKCFzdHJuY2FzZWNtcChuYW1lLCBzdHIsIGxlbikgJiYgIXN0cltsZW5dKQorCQkJcmV0dXJuIGkgLSAxOworCX0KKwlpID0gc3RydG9sKG5hbWUsICZlbmQsIDEwKTsKKwlpZiAoKm5hbWUgJiYgISplbmQgJiYgaSA+PSAtMSAmJiBpIDw9IDI1NSkKKwkJcmV0dXJuIGk7CisJcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50IHBhcnNlX2F0dHIoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdGF0aWMgY29uc3QgaW50IGF0dHJfdmFsdWVzW10gPSB7IDEsIDIsIDQsIDUsIDcgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dHJfbmFtZXNbXSA9IHsKKwkJImJvbGQiLCAiZGltIiwgInVsIiwgImJsaW5rIiwgInJldmVyc2UiCisJfTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdHRyX25hbWVzKTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnN0ciA9IGF0dHJfbmFtZXNbaV07CisJCWlmICghc3RybmNhc2VjbXAobmFtZSwgc3RyLCBsZW4pICYmICFzdHJbbGVuXSkKKwkJCXJldHVybiBhdHRyX3ZhbHVlc1tpXTsKKwl9CisJcmV0dXJuIC0xOworfQorCit2b2lkIGNvbG9yX3BhcnNlKGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICp2YXIsIGNoYXIgKmRzdCkKK3sKKwljb25zdCBjaGFyICpwdHIgPSB2YWx1ZTsKKwlpbnQgYXR0ciA9IC0xOworCWludCBmZyA9IC0yOworCWludCBiZyA9IC0yOworCisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAicmVzZXQiKSkgeworCQlzdHJjcHkoZHN0LCAiXDAzM1ttIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBbZmcgW2JnXV0gW2F0dHJdICovCisJd2hpbGUgKCpwdHIpIHsKKwkJY29uc3QgY2hhciAqd29yZCA9IHB0cjsKKwkJaW50IHZhbCwgbGVuID0gMDsKKworCQl3aGlsZSAod29yZFtsZW5dICYmICFpc3NwYWNlKHdvcmRbbGVuXSkpCisJCQlsZW4rKzsKKworCQlwdHIgPSB3b3JkICsgbGVuOworCQl3aGlsZSAoKnB0ciAmJiBpc3NwYWNlKCpwdHIpKQorCQkJcHRyKys7CisKKwkJdmFsID0gcGFyc2VfY29sb3Iod29yZCwgbGVuKTsKKwkJaWYgKHZhbCA+PSAtMSkgeworCQkJaWYgKGZnID09IC0yKSB7CisJCQkJZmcgPSB2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYmcgPT0gLTIpIHsKKwkJCQliZyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdvdG8gYmFkOworCQl9CisJCXZhbCA9IHBhcnNlX2F0dHIod29yZCwgbGVuKTsKKwkJaWYgKHZhbCA8IDAgfHwgYXR0ciAhPSAtMSkKKwkJCWdvdG8gYmFkOworCQlhdHRyID0gdmFsOworCX0KKworCWlmIChhdHRyID49IDAgfHwgZmcgPj0gMCB8fCBiZyA+PSAwKSB7CisJCWludCBzZXAgPSAwOworCisJCSpkc3QrKyA9ICdcMDMzJzsKKwkJKmRzdCsrID0gJ1snOworCQlpZiAoYXR0ciA+PSAwKSB7CisJCQkqZHN0KysgPSAnMCcgKyBhdHRyOworCQkJc2VwKys7CisJCX0KKwkJaWYgKGZnID49IDApIHsKKwkJCWlmIChzZXArKykKKwkJCQkqZHN0KysgPSAnOyc7CisJCQlpZiAoZmcgPCA4KSB7CisJCQkJKmRzdCsrID0gJzMnOworCQkJCSpkc3QrKyA9ICcwJyArIGZnOworCQkJfSBlbHNlIHsKKwkJCQlkc3QgKz0gc3ByaW50Zihkc3QsICIzODs1OyVkIiwgZmcpOworCQkJfQorCQl9CisJCWlmIChiZyA+PSAwKSB7CisJCQlpZiAoc2VwKyspCisJCQkJKmRzdCsrID0gJzsnOworCQkJaWYgKGJnIDwgOCkgeworCQkJCSpkc3QrKyA9ICc0JzsKKwkJCQkqZHN0KysgPSAnMCcgKyBiZzsKKwkJCX0gZWxzZSB7CisJCQkJZHN0ICs9IHNwcmludGYoZHN0LCAiNDg7NTslZCIsIGJnKTsKKwkJCX0KKwkJfQorCQkqZHN0KysgPSAnbSc7CisJfQorCSpkc3QgPSAwOworCXJldHVybjsKK2JhZDoKKwlkaWUoImJhZCBjb25maWcgdmFsdWUgJyVzJyBmb3IgdmFyaWFibGUgJyVzJyIsIHZhbHVlLCB2YXIpOworfQorCitpbnQgZ2l0X2NvbmZpZ19jb2xvcmJvb2woY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gMTsKKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJhdXRvIikpIHsKKwkJaWYgKGlzYXR0eSgxKSB8fCAocGFnZXJfaW5fdXNlICYmIHBhZ2VyX3VzZV9jb2xvcikpIHsKKwkJCWNoYXIgKnRlcm0gPSBnZXRlbnYoIlRFUk0iKTsKKwkJCWlmICh0ZXJtICYmIHN0cmNtcCh0ZXJtLCAiZHVtYiIpKQorCQkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJuZXZlciIpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJhbHdheXMiKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBjb2xvcl92cHJpbnRmKGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsCisJCXZhX2xpc3QgYXJncywgY29uc3QgY2hhciAqdHJhaWwpCit7CisJaW50IHIgPSAwOworCisJaWYgKCpjb2xvcikKKwkJciArPSBwcmludGYoIiVzIiwgY29sb3IpOworCXIgKz0gdnByaW50ZihmbXQsIGFyZ3MpOworCWlmICgqY29sb3IpCisJCXIgKz0gcHJpbnRmKCIlcyIsIENPTE9SX1JFU0VUKTsKKwlpZiAodHJhaWwpCisJCXIgKz0gcHJpbnRmKCIlcyIsIHRyYWlsKTsKKwlyZXR1cm4gcjsKK30KKworCisKK2ludCBjb2xvcl9wcmludGYoY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSBjb2xvcl92cHJpbnRmKGNvbG9yLCBmbXQsIGFyZ3MsIE5VTEwpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGNvbG9yX3ByaW50Zl9sbihjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCByOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJciA9IGNvbG9yX3ZwcmludGYoY29sb3IsIGZtdCwgYXJncywgIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvY29sb3IuaCBiL2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiYjhmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbG9yLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBDT0xPUl9ICisjZGVmaW5lIENPTE9SX0gKKworLyogIlwwMzNbMTszODs1OzJ4eDs0ODs1OzJ4eG1cMCIgaXMgMjMgYnl0ZXMgKi8KKyNkZWZpbmUgQ09MT1JfTUFYTEVOIDI0CisKK2ludCBnaXRfY29uZmlnX2NvbG9yYm9vbChjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3ZvaWQgY29sb3JfcGFyc2UoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgY2hhciAqZHN0KTsKK2ludCBjb2xvcl9wcmludGYoY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBjb2xvcl9wcmludGZfbG4oY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworI2VuZGlmIC8qIENPTE9SX0ggKi8KZGlmZiAtLWdpdCBhL2NvbWJpbmUtZGlmZi5jIGIvY29tYmluZS1kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzY2E1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbWJpbmUtZGlmZi5jCkBAIC0wLDAgKzEsMTAzMSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibG9nLXRyZWUuaCIKKworc3RhdGljIHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqaW50ZXJzZWN0X3BhdGhzKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqY3VyciwgaW50IG4sIGludCBudW1fcGFyZW50KQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcDsKKwlpbnQgaTsKKworCWlmICghbikgeworCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmxpc3QgPSBOVUxMLCAqKnRhaWwgPSAmbGlzdDsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCWludCBsZW47CisJCQljb25zdCBjaGFyICpwYXRoOworCQkJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHEtPnF1ZXVlW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCXBhdGggPSBxLT5xdWV1ZVtpXS0+dHdvLT5wYXRoOworCQkJbGVuID0gc3RybGVuKHBhdGgpOworCQkJcCA9IHhtYWxsb2MoY29tYmluZV9kaWZmX3BhdGhfc2l6ZShudW1fcGFyZW50LCBsZW4pKTsKKwkJCXAtPnBhdGggPSAoY2hhciopICYocC0+cGFyZW50W251bV9wYXJlbnRdKTsKKwkJCW1lbWNweShwLT5wYXRoLCBwYXRoLCBsZW4pOworCQkJcC0+cGF0aFtsZW5dID0gMDsKKwkJCXAtPmxlbiA9IGxlbjsKKwkJCXAtPm5leHQgPSBOVUxMOworCQkJbWVtc2V0KHAtPnBhcmVudCwgMCwKKwkJCSAgICAgICBzaXplb2YocC0+cGFyZW50WzBdKSAqIG51bV9wYXJlbnQpOworCisJCQloYXNoY3B5KHAtPnNoYTEsIHEtPnF1ZXVlW2ldLT50d28tPnNoYTEpOworCQkJcC0+bW9kZSA9IHEtPnF1ZXVlW2ldLT50d28tPm1vZGU7CisJCQloYXNoY3B5KHAtPnBhcmVudFtuXS5zaGExLCBxLT5xdWV1ZVtpXS0+b25lLT5zaGExKTsKKwkJCXAtPnBhcmVudFtuXS5tb2RlID0gcS0+cXVldWVbaV0tPm9uZS0+bW9kZTsKKwkJCXAtPnBhcmVudFtuXS5zdGF0dXMgPSBxLT5xdWV1ZVtpXS0+c3RhdHVzOworCQkJKnRhaWwgPSBwOworCQkJdGFpbCA9ICZwLT5uZXh0OworCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCWZvciAocCA9IGN1cnI7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBmb3VuZCA9IDA7CisJCWlmICghcC0+bGVuKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQljb25zdCBjaGFyICpwYXRoOworCQkJaW50IGxlbjsKKworCQkJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHEtPnF1ZXVlW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCXBhdGggPSBxLT5xdWV1ZVtpXS0+dHdvLT5wYXRoOworCQkJbGVuID0gc3RybGVuKHBhdGgpOworCQkJaWYgKGxlbiA9PSBwLT5sZW4gJiYgIW1lbWNtcChwYXRoLCBwLT5wYXRoLCBsZW4pKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWhhc2hjcHkocC0+cGFyZW50W25dLnNoYTEsIHEtPnF1ZXVlW2ldLT5vbmUtPnNoYTEpOworCQkJCXAtPnBhcmVudFtuXS5tb2RlID0gcS0+cXVldWVbaV0tPm9uZS0+bW9kZTsKKwkJCQlwLT5wYXJlbnRbbl0uc3RhdHVzID0gcS0+cXVldWVbaV0tPnN0YXR1czsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJcC0+bGVuID0gMDsKKwl9CisJcmV0dXJuIGN1cnI7Cit9CisKKy8qIExpbmVzIGxvc3QgZnJvbSBwYXJlbnQgKi8KK3N0cnVjdCBsbGluZSB7CisJc3RydWN0IGxsaW5lICpuZXh0OworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfbWFwOworCWNoYXIgbGluZVtGTEVYX0FSUkFZXTsKK307CisKKy8qIExpbmVzIHN1cnZpdmluZyBpbiB0aGUgbWVyZ2UgcmVzdWx0ICovCitzdHJ1Y3Qgc2xpbmUgeworCXN0cnVjdCBsbGluZSAqbG9zdF9oZWFkLCAqKmxvc3RfdGFpbDsKKwljaGFyICpib2w7CisJaW50IGxlbjsKKwkvKiBiaXQgMCB1cCB0byAoTi0xKSBhcmUgb24gaWYgdGhlIHBhcmVudCBoYXMgdGhpcyBsaW5lIChpLmUuCisJICogd2UgZGlkIG5vdCBjaGFuZ2UgaXQpLgorCSAqIGJpdCBOIGlzIHVzZWQgZm9yICJpbnRlcmVzdGluZyIgbGluZXMsIGluY2x1ZGluZyBjb250ZXh0LgorCSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwl1bnNpZ25lZCBsb25nICpwX2xubzsKK307CisKK3N0YXRpYyBjaGFyICpncmFiX2Jsb2IoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwljaGFyICpibG9iOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlpZiAoaXNfbnVsbF9zaGExKHNoYTEpKSB7CisJCS8qIGRlbGV0ZWQgYmxvYiAqLworCQkqc2l6ZSA9IDA7CisJCXJldHVybiB4Y2FsbG9jKDEsIDEpOworCX0KKwlibG9iID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsIHNpemUpOworCWlmICh0eXBlICE9IE9CSl9CTE9CKQorCQlkaWUoIm9iamVjdCAnJXMnIGlzIG5vdCBhIGJsb2IhIiwgc2hhMV90b19oZXgoc2hhMSkpOworCXJldHVybiBibG9iOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfbG9zdChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCBpbnQgbiwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbGxpbmUgKmxsaW5lOworCXVuc2lnbmVkIGxvbmcgdGhpc19tYXNrID0gKDFVTDw8bik7CisJaWYgKGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxlbi0tOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzcXVhc2ggdGhpbmdzICovCisJaWYgKHNsaW5lLT5sb3N0X2hlYWQpIHsKKwkJc3RydWN0IGxsaW5lICpsYXN0X29uZSA9IE5VTEw7CisJCS8qIFdlIGNhbm5vdCBzcXVhc2ggaXQgd2l0aCBlYXJsaWVyIG9uZSAqLworCQlmb3IgKGxsaW5lID0gc2xpbmUtPmxvc3RfaGVhZDsKKwkJICAgICBsbGluZTsKKwkJICAgICBsbGluZSA9IGxsaW5lLT5uZXh0KQorCQkJaWYgKGxsaW5lLT5wYXJlbnRfbWFwICYgdGhpc19tYXNrKQorCQkJCWxhc3Rfb25lID0gbGxpbmU7CisJCWxsaW5lID0gbGFzdF9vbmUgPyBsYXN0X29uZS0+bmV4dCA6IHNsaW5lLT5sb3N0X2hlYWQ7CisJCXdoaWxlIChsbGluZSkgeworCQkJaWYgKGxsaW5lLT5sZW4gPT0gbGVuICYmCisJCQkgICAgIW1lbWNtcChsbGluZS0+bGluZSwgbGluZSwgbGVuKSkgeworCQkJCWxsaW5lLT5wYXJlbnRfbWFwIHw9IHRoaXNfbWFzazsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlsbGluZSA9IGxsaW5lLT5uZXh0OworCQl9CisJfQorCisJbGxpbmUgPSB4bWFsbG9jKHNpemVvZigqbGxpbmUpICsgbGVuICsgMSk7CisJbGxpbmUtPmxlbiA9IGxlbjsKKwlsbGluZS0+bmV4dCA9IE5VTEw7CisJbGxpbmUtPnBhcmVudF9tYXAgPSB0aGlzX21hc2s7CisJbWVtY3B5KGxsaW5lLT5saW5lLCBsaW5lLCBsZW4pOworCWxsaW5lLT5saW5lW2xlbl0gPSAwOworCSpzbGluZS0+bG9zdF90YWlsID0gbGxpbmU7CisJc2xpbmUtPmxvc3RfdGFpbCA9ICZsbGluZS0+bmV4dDsKK30KKworc3RydWN0IGNvbWJpbmVfZGlmZl9zdGF0ZSB7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeG07CisKKwl1bnNpZ25lZCBpbnQgbG5vOworCWludCBvYiwgb24sIG5iLCBubjsKKwl1bnNpZ25lZCBsb25nIG5tYXNrOworCWludCBudW1fcGFyZW50OworCWludCBuOworCXN0cnVjdCBzbGluZSAqc2xpbmU7CisJc3RydWN0IHNsaW5lICpsb3N0X2J1Y2tldDsKK307CisKK3N0YXRpYyB2b2lkIGNvbnN1bWVfbGluZSh2b2lkICpzdGF0ZV8sIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBjb21iaW5lX2RpZmZfc3RhdGUgKnN0YXRlID0gc3RhdGVfOworCWlmICg1IDwgbGVuICYmICFtZW1jbXAoIkBAIC0iLCBsaW5lLCA0KSkgeworCQlpZiAocGFyc2VfaHVua19oZWFkZXIobGluZSwgbGVuLAorCQkJCSAgICAgICZzdGF0ZS0+b2IsICZzdGF0ZS0+b24sCisJCQkJICAgICAgJnN0YXRlLT5uYiwgJnN0YXRlLT5ubikpCisJCQlyZXR1cm47CisJCXN0YXRlLT5sbm8gPSBzdGF0ZS0+bmI7CisJCWlmICghc3RhdGUtPm5iKQorCQkJLyogQEAgLTEsMiArMCwwIEBAIHRvIHJlbW92ZSB0aGUKKwkJCSAqIGZpcnN0IHR3byBsaW5lcy4uLgorCQkJICovCisJCQlzdGF0ZS0+bmIgPSAxOworCQlpZiAoc3RhdGUtPm5uID09IDApCisJCQkvKiBAQCAtWCxZICtOLDAgQEAgcmVtb3ZlZCBZIGxpbmVzCisJCQkgKiB0aGF0IHdvdWxkIGhhdmUgY29tZSAqYWZ0ZXIqIGxpbmUgTgorCQkJICogaW4gdGhlIHJlc3VsdC4gIE91ciBsb3N0IGJ1Y2tldHMgaGFuZworCQkJICogdG8gdGhlIGxpbmUgYWZ0ZXIgdGhlIHJlbW92ZWQgbGluZXMsCisJCQkgKi8KKwkJCXN0YXRlLT5sb3N0X2J1Y2tldCA9ICZzdGF0ZS0+c2xpbmVbc3RhdGUtPm5iXTsKKwkJZWxzZQorCQkJc3RhdGUtPmxvc3RfYnVja2V0ID0gJnN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV07CisJCWlmICghc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xubykKKwkJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV0ucF9sbm8gPQorCQkJCXhjYWxsb2Moc3RhdGUtPm51bV9wYXJlbnQsCisJCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV0ucF9sbm9bc3RhdGUtPm5dID0gc3RhdGUtPm9iOworCQlyZXR1cm47CisJfQorCWlmICghc3RhdGUtPmxvc3RfYnVja2V0KQorCQlyZXR1cm47IC8qIG5vdCBpbiBhbnkgaHVuayB5ZXQgKi8KKwlzd2l0Y2ggKGxpbmVbMF0pIHsKKwljYXNlICctJzoKKwkJYXBwZW5kX2xvc3Qoc3RhdGUtPmxvc3RfYnVja2V0LCBzdGF0ZS0+biwgbGluZSsxLCBsZW4tMSk7CisJCWJyZWFrOworCWNhc2UgJysnOgorCQlzdGF0ZS0+c2xpbmVbc3RhdGUtPmxuby0xXS5mbGFnIHw9IHN0YXRlLT5ubWFzazsKKwkJc3RhdGUtPmxubysrOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbWJpbmVfZGlmZihjb25zdCB1bnNpZ25lZCBjaGFyICpwYXJlbnQsIG1tZmlsZV90ICpyZXN1bHRfZmlsZSwKKwkJCSBzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBpbnQgY250LCBpbnQgbiwKKwkJCSBpbnQgbnVtX3BhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgcF9sbm8sIGxubzsKKwl1bnNpZ25lZCBsb25nIG5tYXNrID0gKDFVTCA8PCBuKTsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwltbWZpbGVfdCBwYXJlbnRfZmlsZTsKKwl4ZGVtaXRjYl90IGVjYjsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgc3o7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuOyAvKiByZXN1bHQgZGVsZXRlZCAqLworCisJcGFyZW50X2ZpbGUucHRyID0gZ3JhYl9ibG9iKHBhcmVudCwgJnN6KTsKKwlwYXJlbnRfZmlsZS5zaXplID0gc3o7CisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAwOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IGNvbnN1bWVfbGluZTsKKwlzdGF0ZS5ubWFzayA9IG5tYXNrOworCXN0YXRlLnNsaW5lID0gc2xpbmU7CisJc3RhdGUubG5vID0gMTsKKwlzdGF0ZS5udW1fcGFyZW50ID0gbnVtX3BhcmVudDsKKwlzdGF0ZS5uID0gbjsKKworCXhkbF9kaWZmKCZwYXJlbnRfZmlsZSwgcmVzdWx0X2ZpbGUsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJZnJlZShwYXJlbnRfZmlsZS5wdHIpOworCisJLyogQXNzaWduIGxpbmUgbnVtYmVycyBmb3IgdGhpcyBwYXJlbnQuCisJICoKKwkgKiBzbGluZVtsbm9dLnBfbG5vW25dIHJlY29yZHMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyCisJICogKGNvdW50aW5nIGZyb20gMSkgZm9yIHBhcmVudCBOIGlmIHRoZSBmaW5hbCBodW5rIGRpc3BsYXkKKwkgKiBzdGFydGVkIGJ5IHNob3dpbmcgc2xpbmVbbG5vXSAocG9zc2libHkgc2hvd2luZyB0aGUgbG9zdAorCSAqIGxpbmVzIGF0dGFjaGVkIHRvIGl0IGZpcnN0KS4KKwkgKi8KKwlmb3IgKGxubyA9IDAsICBwX2xubyA9IDE7IGxubyA8PSBjbnQ7IGxubysrKSB7CisJCXN0cnVjdCBsbGluZSAqbGw7CisJCXNsaW5lW2xub10ucF9sbm9bbl0gPSBwX2xubzsKKworCQkvKiBIb3cgbWFueSBsaW5lcyB3b3VsZCB0aGlzIHNsaW5lIGFkdmFuY2UgdGhlIHBfbG5vPyAqLworCQlsbCA9IHNsaW5lW2xub10ubG9zdF9oZWFkOworCQl3aGlsZSAobGwpIHsKKwkJCWlmIChsbC0+cGFyZW50X21hcCAmIG5tYXNrKQorCQkJCXBfbG5vKys7IC8qICctJyBtZWFucyBwYXJlbnQgaGFkIGl0ICovCisJCQlsbCA9IGxsLT5uZXh0OworCQl9CisJCWlmIChsbm8gPCBjbnQgJiYgIShzbGluZVtsbm9dLmZsYWcgJiBubWFzaykpCisJCQlwX2xubysrOyAvKiBubyAnKycgbWVhbnMgcGFyZW50IGhhZCBpdCAqLworCX0KKwlzbGluZVtsbm9dLnBfbG5vW25dID0gcF9sbm87IC8qIHRyYWlsZXIgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udGV4dCA9IDM7CitzdGF0aWMgY2hhciBjb21iaW5lX21hcmtlciA9ICdAJzsKKworc3RhdGljIGludCBpbnRlcmVzdGluZyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGFsbF9tYXNrKQoreworCS8qIElmIHNvbWUgcGFyZW50cyBsb3N0IGxpbmVzIGhlcmUsIG9yIGlmIHdlIGhhdmUgYWRkZWQgdG8KKwkgKiBzb21lIHBhcmVudCwgaXQgaXMgaW50ZXJlc3RpbmcuCisJICovCisJcmV0dXJuICgoc2xpbmUtPmZsYWcgJiBhbGxfbWFzaykgfHwgc2xpbmUtPmxvc3RfaGVhZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkanVzdF9odW5rX3RhaWwoc3RydWN0IHNsaW5lICpzbGluZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsbF9tYXNrLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaHVua19iZWdpbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCit7CisJLyogaSBwb2ludHMgYXQgdGhlIGZpcnN0IHVuaW50ZXJlc3RpbmcgbGluZS4gIElmIHRoZSBsYXN0IGxpbmUKKwkgKiBvZiB0aGUgaHVuayB3YXMgaW50ZXJlc3Rpbmcgb25seSBiZWNhdXNlIGl0IGhhcyBzb21lCisJICogZGVsZXRpb24sIHRoZW4gaXQgaXMgbm90IGFsbCB0aGF0IGludGVyZXN0aW5nIGZvciB0aGUKKwkgKiBwdXJwb3NlIG9mIGdpdmluZyB0cmFpbGluZyBjb250ZXh0IGxpbmVzLiAgVGhpcyBpcyBiZWNhdXNlCisJICogd2Ugb3V0cHV0ICctJyBsaW5lIGFuZCB0aGVuIHVubW9kaWZpZWQgc2xpbmVbaS0xXSBpdHNlbGYgaW4KKwkgKiB0aGF0IGNhc2Ugd2hpY2ggZ2l2ZXMgdXMgb25lIGV4dHJhIGNvbnRleHQgbGluZS4KKwkgKi8KKwlpZiAoKGh1bmtfYmVnaW4gKyAxIDw9IGkpICYmICEoc2xpbmVbaS0xXS5mbGFnICYgYWxsX21hc2spKQorCQlpLS07CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfbmV4dChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFyaywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGksCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjbnQsCisJCQkgICAgICAgaW50IGxvb2tfZm9yX3VuaW50ZXJlc3RpbmcpCit7CisJLyogV2UgaGF2ZSBleGFtaW5lZCB1cCB0byBpLTEgYW5kIGFyZSBhYm91dCB0byBsb29rIGF0IGkuCisJICogRmluZCBuZXh0IGludGVyZXN0aW5nIG9yIHVuaW50ZXJlc3RpbmcgbGluZS4gIEhlcmUsCisJICogImludGVyZXN0aW5nIiBkb2VzIG5vdCBtZWFuIGludGVyZXN0aW5nKCksIGJ1dCBtYXJrZWQgYnkKKwkgKiB0aGUgZ2l2ZV9jb250ZXh0KCkgZnVuY3Rpb24gYmVsb3cgKGkuZS4gaXQgaW5jbHVkZXMgY29udGV4dAorCSAqIGxpbmVzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGluZyB0byBpbnRlcmVzdGluZygpIGZ1bmN0aW9uCisJICogdGhhdCBhcmUgc3Vycm91bmRlZCBieSBpbnRlcmVzdGluZygpIG9uZXMuCisJICovCisJd2hpbGUgKGkgPD0gY250KQorCQlpZiAobG9va19mb3JfdW5pbnRlcmVzdGluZworCQkgICAgPyAhKHNsaW5lW2ldLmZsYWcgJiBtYXJrKQorCQkgICAgOiAoc2xpbmVbaV0uZmxhZyAmIG1hcmspKQorCQkJcmV0dXJuIGk7CisJCWVsc2UKKwkJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBnaXZlX2NvbnRleHQoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsIGludCBudW1fcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgYWxsX21hc2sgPSAoMVVMPDxudW1fcGFyZW50KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJdW5zaWduZWQgbG9uZyBpOworCisJLyogVHdvIGdyb3VwcyBvZiBpbnRlcmVzdGluZyBsaW5lcyBtYXkgaGF2ZSBhIHNob3J0IGdhcCBvZgorCSAqIHVuaW50ZXJlc3RpbmcgbGluZXMuICBDb25uZWN0IHN1Y2ggZ3JvdXBzIHRvIGdpdmUgdGhlbSBhCisJICogYml0IG9mIGNvbnRleHQuCisJICoKKwkgKiBXZSBmaXJzdCBzdGFydCBmcm9tIHdoYXQgdGhlIGludGVyZXN0aW5nKCkgZnVuY3Rpb24gc2F5cywKKwkgKiBhbmQgbWFyayB0aGVtIHdpdGggIm1hcmsiLCBhbmQgcGFpbnQgY29udGV4dCBsaW5lcyB3aXRoIHRoZQorCSAqIG1hcmsuICBTbyBpbnRlcmVzdGluZygpIHdvdWxkIHN0aWxsIHNheSBmYWxzZSBmb3Igc3VjaCBjb250ZXh0CisJICogbGluZXMgYnV0IHRoZXkgYXJlIHRyZWF0ZWQgYXMgImludGVyZXN0aW5nIiBpbiB0aGUgZW5kLgorCSAqLworCWkgPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIDAsIGNudCwgMCk7CisJaWYgKGNudCA8IGkpCisJCXJldHVybiAwOworCisJd2hpbGUgKGkgPD0gY250KSB7CisJCXVuc2lnbmVkIGxvbmcgaiA9IChjb250ZXh0IDwgaSkgPyAoaSAtIGNvbnRleHQpIDogMDsKKwkJdW5zaWduZWQgbG9uZyBrOworCisJCS8qIFBhaW50IGEgZmV3IGxpbmVzIGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgbGluZS4gKi8KKwkJd2hpbGUgKGogPCBpKQorCQkJc2xpbmVbaisrXS5mbGFnIHw9IG1hcms7CisKKwlhZ2FpbjoKKwkJLyogd2Uga25vdyB1cCB0byBpIGlzIHRvIGJlIGluY2x1ZGVkLiAgd2hlcmUgZG9lcyB0aGUKKwkJICogbmV4dCB1bmludGVyZXN0aW5nIG9uZSBzdGFydD8KKwkJICovCisJCWogPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIGksIGNudCwgMSk7CisJCWlmIChjbnQgPCBqKQorCQkJYnJlYWs7IC8qIHRoZSByZXN0IGFyZSBhbGwgaW50ZXJlc3RpbmcgKi8KKworCQkvKiBsb29rYWhlYWQgY29udGV4dCBsaW5lcyAqLworCQlrID0gZmluZF9uZXh0KHNsaW5lLCBtYXJrLCBqLCBjbnQsIDApOworCQlqID0gYWRqdXN0X2h1bmtfdGFpbChzbGluZSwgYWxsX21hc2ssIGksIGopOworCisJCWlmIChrIDwgaiArIGNvbnRleHQpIHsKKwkJCS8qIGsgaXMgaW50ZXJlc3RpbmcgYW5kIFtqLGspIGFyZSBub3QsIGJ1dAorCQkJICogcGFpbnQgdGhlbSBpbnRlcmVzdGluZyBiZWNhdXNlIHRoZSBnYXAgaXMgc21hbGwuCisJCQkgKi8KKwkJCXdoaWxlIChqIDwgaykKKwkJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKwkJCWkgPSBrOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCS8qIGogaXMgdGhlIGZpcnN0IHVuaW50ZXJlc3RpbmcgbGluZSBhbmQgdGhlcmUgaXMKKwkJICogbm8gb3ZlcmxhcCBiZXlvbmQgaXQgd2l0aGluIGNvbnRleHQgbGluZXMuICBQYWludAorCQkgKiB0aGUgdHJhaWxpbmcgZWRnZSBhIGJpdC4KKwkJICovCisJCWkgPSBrOworCQlrID0gKGogKyBjb250ZXh0IDwgY250KzEpID8gaiArIGNvbnRleHQgOiBjbnQrMTsKKwkJd2hpbGUgKGogPCBrKQorCQkJc2xpbmVbaisrXS5mbGFnIHw9IG1hcms7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1ha2VfaHVua3Moc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsCisJCSAgICAgICBpbnQgbnVtX3BhcmVudCwgaW50IGRlbnNlKQoreworCXVuc2lnbmVkIGxvbmcgYWxsX21hc2sgPSAoMVVMPDxudW1fcGFyZW50KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBoYXNfaW50ZXJlc3RpbmcgPSAwOworCisJZm9yIChpID0gMDsgaSA8PSBjbnQ7IGkrKykgeworCQlpZiAoaW50ZXJlc3RpbmcoJnNsaW5lW2ldLCBhbGxfbWFzaykpCisJCQlzbGluZVtpXS5mbGFnIHw9IG1hcms7CisJCWVsc2UKKwkJCXNsaW5lW2ldLmZsYWcgJj0gfm1hcms7CisJfQorCWlmICghZGVuc2UpCisJCXJldHVybiBnaXZlX2NvbnRleHQoc2xpbmUsIGNudCwgbnVtX3BhcmVudCk7CisKKwkvKiBMb29rIGF0IGVhY2ggaHVuaywgYW5kIGlmIHdlIGhhdmUgY2hhbmdlcyBmcm9tIG9ubHkgb25lCisJICogcGFyZW50LCBvciB0aGUgY2hhbmdlcyBhcmUgdGhlIHNhbWUgZnJvbSBhbGwgYnV0IG9uZQorCSAqIHBhcmVudCwgbWFyayB0aGF0IHVuaW50ZXJlc3RpbmcuCisJICovCisJaSA9IDA7CisJd2hpbGUgKGkgPD0gY250KSB7CisJCXVuc2lnbmVkIGxvbmcgaiwgaHVua19iZWdpbiwgaHVua19lbmQ7CisJCXVuc2lnbmVkIGxvbmcgc2FtZV9kaWZmOworCQl3aGlsZSAoaSA8PSBjbnQgJiYgIShzbGluZVtpXS5mbGFnICYgbWFyaykpCisJCQlpKys7CisJCWlmIChjbnQgPCBpKQorCQkJYnJlYWs7IC8qIE5vIG1vcmUgaW50ZXJlc3RpbmcgaHVua3MgKi8KKwkJaHVua19iZWdpbiA9IGk7CisJCWZvciAoaiA9IGkgKyAxOyBqIDw9IGNudDsgaisrKSB7CisJCQlpZiAoIShzbGluZVtqXS5mbGFnICYgbWFyaykpIHsKKwkJCQkvKiBMb29rIGJleW9uZCB0aGUgZW5kIHRvIHNlZSBpZiB0aGVyZQorCQkJCSAqIGlzIGFuIGludGVyZXN0aW5nIGxpbmUgYWZ0ZXIgdGhpcworCQkJCSAqIGh1bmsgd2l0aGluIGNvbnRleHQgc3Bhbi4KKwkJCQkgKi8KKwkJCQl1bnNpZ25lZCBsb25nIGxhOyAvKiBsb29rYWhlYWQgKi8KKwkJCQlpbnQgY29udGluID0gMDsKKwkJCQlsYSA9IGFkanVzdF9odW5rX3RhaWwoc2xpbmUsIGFsbF9tYXNrLAorCQkJCQkJICAgICBodW5rX2JlZ2luLCBqKTsKKwkJCQlsYSA9IChsYSArIGNvbnRleHQgPCBjbnQgKyAxKSA/CisJCQkJCShsYSArIGNvbnRleHQpIDogY250ICsgMTsKKwkJCQl3aGlsZSAoaiA8PSAtLWxhKSB7CisJCQkJCWlmIChzbGluZVtsYV0uZmxhZyAmIG1hcmspIHsKKwkJCQkJCWNvbnRpbiA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWNvbnRpbikKKwkJCQkJYnJlYWs7CisJCQkJaiA9IGxhOworCQkJfQorCQl9CisJCWh1bmtfZW5kID0gajsKKworCQkvKiBbaS4uaHVua19lbmQpIGFyZSBpbnRlcmVzdGluZy4gIE5vdyBpcyBpdCByZWFsbHkKKwkJICogaW50ZXJlc3Rpbmc/ICBXZSBjaGVjayBpZiB0aGVyZSBhcmUgb25seSB0d28gdmVyc2lvbnMKKwkJICogYW5kIHRoZSByZXN1bHQgbWF0Y2hlcyBvbmUgb2YgdGhlbS4gIFRoYXQgaXMsIHdlIGxvb2sKKwkJICogYXQ6CisJCSAqICAgKCspIGxpbmUsIHdoaWNoIHJlY29yZHMgbGluZXMgYWRkZWQgdG8gd2hpY2ggcGFyZW50czsKKwkJICogICAgICAgdGhpcyBsaW5lIGFwcGVhcnMgaW4gdGhlIHJlc3VsdC4KKwkJICogICAoLSkgbGluZSwgd2hpY2ggcmVjb3JkcyBmcm9tIHdoYXQgcGFyZW50cyB0aGUgbGluZQorCQkgKiAgICAgICB3YXMgcmVtb3ZlZDsgdGhpcyBsaW5lIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcmVzdWx0LgorCQkgKiB0aGVuIGNoZWNrIHRoZSBzZXQgb2YgcGFyZW50cyB0aGUgcmVzdWx0IGhhcyBkaWZmZXJlbmNlCisJCSAqIGZyb20sIGZyb20gYWxsIGxpbmVzLiAgSWYgdGhlcmUgYXJlIGxpbmVzIHRoYXQgaGFzCisJCSAqIGRpZmZlcmVudCBzZXQgb2YgcGFyZW50cyB0aGF0IHRoZSByZXN1bHQgaGFzIGRpZmZlcmVuY2VzCisJCSAqIGZyb20sIHRoYXQgbWVhbnMgd2UgaGF2ZSBtb3JlIHRoYW4gdHdvIHZlcnNpb25zLgorCQkgKgorCQkgKiBFdmVuIHdoZW4gd2UgaGF2ZSBvbmx5IHR3byB2ZXJzaW9ucywgaWYgdGhlIHJlc3VsdCBkb2VzCisJCSAqIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHBhcmVudHMsIHRoZSBpdCBzaG91bGQgYmUgY29uc2lkZXJlZAorCQkgKiBpbnRlcmVzdGluZy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSB3b3VsZCBoYXZlIGFsbCAnKycgbGluZS4KKwkJICogQWZ0ZXIgcGFzc2luZyB0aGUgYWJvdmUgInR3byB2ZXJzaW9ucyIgdGVzdCwgdGhhdCB3b3VsZAorCQkgKiBhcHBlYXIgYXMgInRoZSBzYW1lIHNldCBvZiBwYXJlbnRzIiB0byBiZSAiYWxsIHBhcmVudHMiLgorCQkgKi8KKwkJc2FtZV9kaWZmID0gMDsKKwkJaGFzX2ludGVyZXN0aW5nID0gMDsKKwkJZm9yIChqID0gaTsgaiA8IGh1bmtfZW5kICYmICFoYXNfaW50ZXJlc3Rpbmc7IGorKykgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzX2RpZmYgPSBzbGluZVtqXS5mbGFnICYgYWxsX21hc2s7CisJCQlzdHJ1Y3QgbGxpbmUgKmxsID0gc2xpbmVbal0ubG9zdF9oZWFkOworCQkJaWYgKHRoaXNfZGlmZikgeworCQkJCS8qIFRoaXMgaGFzIHNvbWUgY2hhbmdlcy4gIElzIGl0IHRoZQorCQkJCSAqIHNhbWUgYXMgb3RoZXJzPworCQkJCSAqLworCQkJCWlmICghc2FtZV9kaWZmKQorCQkJCQlzYW1lX2RpZmYgPSB0aGlzX2RpZmY7CisJCQkJZWxzZSBpZiAoc2FtZV9kaWZmICE9IHRoaXNfZGlmZikgeworCQkJCQloYXNfaW50ZXJlc3RpbmcgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl3aGlsZSAobGwgJiYgIWhhc19pbnRlcmVzdGluZykgeworCQkJCS8qIExvc3QgdGhpcyBsaW5lIGZyb20gdGhlc2UgcGFyZW50czsKKwkJCQkgKiB3aG8gYXJlIHRoZXk/ICBBcmUgdGhleSB0aGUgc2FtZT8KKwkJCQkgKi8KKwkJCQl0aGlzX2RpZmYgPSBsbC0+cGFyZW50X21hcDsKKwkJCQlpZiAoIXNhbWVfZGlmZikKKwkJCQkJc2FtZV9kaWZmID0gdGhpc19kaWZmOworCQkJCWVsc2UgaWYgKHNhbWVfZGlmZiAhPSB0aGlzX2RpZmYpIHsKKwkJCQkJaGFzX2ludGVyZXN0aW5nID0gMTsKKwkJCQl9CisJCQkJbGwgPSBsbC0+bmV4dDsKKwkJCX0KKwkJfQorCisJCWlmICghaGFzX2ludGVyZXN0aW5nICYmIHNhbWVfZGlmZiAhPSBhbGxfbWFzaykgeworCQkJLyogVGhpcyBodW5rIGlzIG5vdCB0aGF0IGludGVyZXN0aW5nIGFmdGVyIGFsbCAqLworCQkJZm9yIChqID0gaHVua19iZWdpbjsgaiA8IGh1bmtfZW5kOyBqKyspCisJCQkJc2xpbmVbal0uZmxhZyAmPSB+bWFyazsKKwkJfQorCQlpID0gaHVua19lbmQ7CisJfQorCisJaGFzX2ludGVyZXN0aW5nID0gZ2l2ZV9jb250ZXh0KHNsaW5lLCBjbnQsIG51bV9wYXJlbnQpOworCXJldHVybiBoYXNfaW50ZXJlc3Rpbmc7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGFyZW50X2xubyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGwwLCB1bnNpZ25lZCBsb25nIGwxLCBpbnQgbiwgdW5zaWduZWQgbG9uZyBudWxsX2NvbnRleHQpCit7CisJbDAgPSBzbGluZVtsMF0ucF9sbm9bbl07CisJbDEgPSBzbGluZVtsMV0ucF9sbm9bbl07CisJcHJpbnRmKCIgLSVsdSwlbHUiLCBsMCwgbDEtbDAtbnVsbF9jb250ZXh0KTsKK30KKworc3RhdGljIGludCBodW5rX2NvbW1lbnRfbGluZShjb25zdCBjaGFyICpib2wpCit7CisJaW50IGNoOworCisJaWYgKCFib2wpCisJCXJldHVybiAwOworCWNoID0gKmJvbCAmIDB4ZmY7CisJcmV0dXJuIChpc2FscGhhKGNoKSB8fCBjaCA9PSAnXycgfHwgY2ggPT0gJyQnKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zbGluZShzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGNudCwgaW50IG51bV9wYXJlbnQsCisJCSAgICAgICBpbnQgdXNlX2NvbG9yKQoreworCXVuc2lnbmVkIGxvbmcgbWFyayA9ICgxVUw8PG51bV9wYXJlbnQpOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG5vID0gMDsKKwljb25zdCBjaGFyICpjX2ZyYWcgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfRlJBR0lORk8pOworCWNvbnN0IGNoYXIgKmNfbmV3ID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX0ZJTEVfTkVXKTsKKwljb25zdCBjaGFyICpjX29sZCA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9GSUxFX09MRCk7CisJY29uc3QgY2hhciAqY19wbGFpbiA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9QTEFJTik7CisJY29uc3QgY2hhciAqY19yZXNldCA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9SRVNFVCk7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuOyAvKiByZXN1bHQgZGVsZXRlZCAqLworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHNsaW5lICpzbCA9ICZzbGluZVtsbm9dOworCQl1bnNpZ25lZCBsb25nIGh1bmtfZW5kOworCQl1bnNpZ25lZCBsb25nIHJsaW5lczsKKwkJY29uc3QgY2hhciAqaHVua19jb21tZW50ID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyBudWxsX2NvbnRleHQgPSAwOworCisJCXdoaWxlIChsbm8gPD0gY250ICYmICEoc2xpbmVbbG5vXS5mbGFnICYgbWFyaykpIHsKKwkJCWlmIChodW5rX2NvbW1lbnRfbGluZShzbGluZVtsbm9dLmJvbCkpCisJCQkJaHVua19jb21tZW50ID0gc2xpbmVbbG5vXS5ib2w7CisJCQlsbm8rKzsKKwkJfQorCQlpZiAoY250IDwgbG5vKQorCQkJYnJlYWs7CisJCWVsc2UgeworCQkJZm9yIChodW5rX2VuZCA9IGxubyArIDE7IGh1bmtfZW5kIDw9IGNudDsgaHVua19lbmQrKykKKwkJCQlpZiAoIShzbGluZVtodW5rX2VuZF0uZmxhZyAmIG1hcmspKQorCQkJCQlicmVhazsKKwkJfQorCQlybGluZXMgPSBodW5rX2VuZCAtIGxubzsKKwkJaWYgKGNudCA8IGh1bmtfZW5kKQorCQkJcmxpbmVzLS07IC8qIHBvaW50aW5nIGF0IHRoZSBsYXN0IGRlbGV0ZSBodW5rICovCisKKwkJaWYgKCFjb250ZXh0KSB7CisJCQkvKgorCQkJICogRXZlbiB3aGVuIHJ1bm5pbmcgd2l0aCAtLXVuaWZpZWQ9MCwgYWxsCisJCQkgKiBsaW5lcyBpbiB0aGUgaHVuayBuZWVkcyB0byBiZSBwcm9jZXNzZWQgaW4KKwkJCSAqIHRoZSBsb29wIGJlbG93IGluIG9yZGVyIHRvIHNob3cgdGhlCisJCQkgKiBkZWxldGlvbiByZWNvcmRlZCBpbiBsb3N0X2hlYWQuICBIb3dldmVyLAorCQkJICogd2UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgcmVzdWx0aW5nIGxpbmUKKwkJCSAqIHdpdGggYWxsIGJsYW5rIGNvbnRleHQgbWFya2VycyBpbiBzdWNoIGEKKwkJCSAqIGNhc2UuICBDb21wZW5zYXRlLgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIGo7CisJCQlmb3IgKGogPSBsbm87IGogPCBodW5rX2VuZDsgaisrKQorCQkJCWlmICghKHNsaW5lW2pdLmZsYWcgJiAobWFyay0xKSkpCisJCQkJCW51bGxfY29udGV4dCsrOworCQkJcmxpbmVzIC09IG51bGxfY29udGV4dDsKKwkJfQorCisJCWZwdXRzKGNfZnJhZywgc3Rkb3V0KTsKKwkJZm9yIChpID0gMDsgaSA8PSBudW1fcGFyZW50OyBpKyspIHB1dGNoYXIoY29tYmluZV9tYXJrZXIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJc2hvd19wYXJlbnRfbG5vKHNsaW5lLCBsbm8sIGh1bmtfZW5kLCBpLCBudWxsX2NvbnRleHQpOworCQlwcmludGYoIiArJWx1LCVsdSAiLCBsbm8rMSwgcmxpbmVzKTsKKwkJZm9yIChpID0gMDsgaSA8PSBudW1fcGFyZW50OyBpKyspIHB1dGNoYXIoY29tYmluZV9tYXJrZXIpOworCisJCWlmIChodW5rX2NvbW1lbnQpIHsKKwkJCWludCBjb21tZW50X2VuZCA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQkJCWludCBjaCA9IGh1bmtfY29tbWVudFtpXSAmIDB4ZmY7CisJCQkJaWYgKCFjaCB8fCBjaCA9PSAnXG4nKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWlzc3BhY2UoY2gpKQorCQkJCSAgICBjb21tZW50X2VuZCA9IGk7CisJCQl9CisJCQlpZiAoY29tbWVudF9lbmQpCisJCQkJcHV0Y2hhcignICcpOworCQkJZm9yIChpID0gMDsgaSA8IGNvbW1lbnRfZW5kOyBpKyspCisJCQkJcHV0Y2hhcihodW5rX2NvbW1lbnRbaV0pOworCQl9CisKKwkJcHJpbnRmKCIlc1xuIiwgY19yZXNldCk7CisJCXdoaWxlIChsbm8gPCBodW5rX2VuZCkgeworCQkJc3RydWN0IGxsaW5lICpsbDsKKwkJCWludCBqOworCQkJdW5zaWduZWQgbG9uZyBwX21hc2s7CisJCQlzbCA9ICZzbGluZVtsbm8rK107CisJCQlsbCA9IHNsLT5sb3N0X2hlYWQ7CisJCQl3aGlsZSAobGwpIHsKKwkJCQlmcHV0cyhjX29sZCwgc3Rkb3V0KTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVtX3BhcmVudDsgaisrKSB7CisJCQkJCWlmIChsbC0+cGFyZW50X21hcCAmICgxVUw8PGopKQorCQkJCQkJcHV0Y2hhcignLScpOworCQkJCQllbHNlCisJCQkJCQlwdXRjaGFyKCcgJyk7CisJCQkJfQorCQkJCXByaW50ZigiJXMlc1xuIiwgbGwtPmxpbmUsIGNfcmVzZXQpOworCQkJCWxsID0gbGwtPm5leHQ7CisJCQl9CisJCQlpZiAoY250IDwgbG5vKQorCQkJCWJyZWFrOworCQkJcF9tYXNrID0gMTsKKwkJCWlmICghKHNsLT5mbGFnICYgKG1hcmstMSkpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIHNsaW5lIHdhcyBoZXJlIHRvIGhhbmcgdGhlCisJCQkJICogbG9zdCBsaW5lcyBpbiBmcm9udCBvZiBpdC4KKwkJCQkgKi8KKwkJCQlpZiAoIWNvbnRleHQpCisJCQkJCWNvbnRpbnVlOworCQkJCWZwdXRzKGNfcGxhaW4sIHN0ZG91dCk7CisJCQl9CisJCQllbHNlCisJCQkJZnB1dHMoY19uZXcsIHN0ZG91dCk7CisJCQlmb3IgKGogPSAwOyBqIDwgbnVtX3BhcmVudDsgaisrKSB7CisJCQkJaWYgKHBfbWFzayAmIHNsLT5mbGFnKQorCQkJCQlwdXRjaGFyKCcrJyk7CisJCQkJZWxzZQorCQkJCQlwdXRjaGFyKCcgJyk7CisJCQkJcF9tYXNrIDw8PSAxOworCQkJfQorCQkJcHJpbnRmKCIlLipzJXNcbiIsIHNsLT5sZW4sIHNsLT5ib2wsIGNfcmVzZXQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZXVzZV9jb21iaW5lX2RpZmYoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsCisJCQkgICAgICAgaW50IGksIGludCBqKQoreworCS8qIFdlIGhhdmUgYWxyZWFkeSBleGFtaW5lZCBwYXJlbnQgaiBhbmQgd2Uga25vdyBwYXJlbnQgaQorCSAqIGFuZCBwYXJlbnQgaiBhcmUgdGhlIHNhbWUsIHNvIHJldXNlIHRoZSBjb21iaW5lZCByZXN1bHQKKwkgKiBvZiBwYXJlbnQgaiBmb3IgcGFyZW50IGkuCisJICovCisJdW5zaWduZWQgbG9uZyBsbm8sIGltYXNrLCBqbWFzazsKKwlpbWFzayA9ICgxVUw8PGkpOworCWptYXNrID0gKDFVTDw8aik7CisKKwlmb3IgKGxubyA9IDA7IGxubyA8PSBjbnQ7IGxubysrKSB7CisJCXN0cnVjdCBsbGluZSAqbGwgPSBzbGluZS0+bG9zdF9oZWFkOworCQlzbGluZS0+cF9sbm9baV0gPSBzbGluZS0+cF9sbm9bal07CisJCXdoaWxlIChsbCkgeworCQkJaWYgKGxsLT5wYXJlbnRfbWFwICYgam1hc2spCisJCQkJbGwtPnBhcmVudF9tYXAgfD0gaW1hc2s7CisJCQlsbCA9IGxsLT5uZXh0OworCQl9CisJCWlmIChzbGluZS0+ZmxhZyAmIGptYXNrKQorCQkJc2xpbmUtPmZsYWcgfD0gaW1hc2s7CisJCXNsaW5lKys7CisJfQorCS8qIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIGZpbGUgKHNsaW5lW2NudF0pICovCisJc2xpbmUtPnBfbG5vW2ldID0gc2xpbmUtPnBfbG5vW2pdOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3F1b3RlZF9wYXRoKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgICAgY29uc3QgY2hhciAqY19tZXRhLCBjb25zdCBjaGFyICpjX3Jlc2V0KQoreworCXByaW50ZigiJXMlcyIsIGNfbWV0YSwgcHJlZml4KTsKKwlpZiAocXVvdGVfY19zdHlsZShwYXRoLCBOVUxMLCBOVUxMLCAwKSkKKwkJcXVvdGVfY19zdHlsZShwYXRoLCBOVUxMLCBzdGRvdXQsIDApOworCWVsc2UKKwkJcHJpbnRmKCIlcyIsIHBhdGgpOworCXByaW50ZigiJXNcbiIsIGNfcmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3BhdGNoX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICplbGVtLCBpbnQgbnVtX3BhcmVudCwKKwkJCSAgICBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZSwgY250LCBsbm87CisJY2hhciAqcmVzdWx0LCAqY3A7CisJc3RydWN0IHNsaW5lICpzbGluZTsgLyogc3Vydml2ZWQgbGluZXMgKi8KKwlpbnQgbW9kZV9kaWZmZXJzID0gMDsKKwlpbnQgaSwgc2hvd19odW5rczsKKwlpbnQgd29ya2luZ190cmVlX2ZpbGUgPSBpc19udWxsX3NoYTEoZWxlbS0+c2hhMSk7CisJaW50IGFiYnJldiA9IG9wdC0+ZnVsbF9pbmRleCA/IDQwIDogREVGQVVMVF9BQkJSRVY7CisJbW1maWxlX3QgcmVzdWx0X2ZpbGU7CisKKwljb250ZXh0ID0gb3B0LT5jb250ZXh0OworCS8qIFJlYWQgdGhlIHJlc3VsdCBvZiBtZXJnZSBmaXJzdCAqLworCWlmICghd29ya2luZ190cmVlX2ZpbGUpCisJCXJlc3VsdCA9IGdyYWJfYmxvYihlbGVtLT5zaGExLCAmcmVzdWx0X3NpemUpOworCWVsc2UgeworCQkvKiBVc2VkIGJ5IGRpZmYtdHJlZSB0byByZWFkIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkID0gLTE7CisKKwkJaWYgKGxzdGF0KGVsZW0tPnBhdGgsICZzdCkgPCAwKQorCQkJZ290byBkZWxldGVkX2ZpbGU7CisKKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCXNpemVfdCBsZW4gPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCQkJcmVzdWx0X3NpemUgPSBsZW47CisJCQlyZXN1bHQgPSB4bWFsbG9jKGxlbiArIDEpOworCQkJaWYgKHJlc3VsdF9zaXplICE9IHJlYWRsaW5rKGVsZW0tPnBhdGgsIHJlc3VsdCwgbGVuKSkgeworCQkJCWVycm9yKCJyZWFkbGluayglcyk6ICVzIiwgZWxlbS0+cGF0aCwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXJlc3VsdFtsZW5dID0gMDsKKwkJCWVsZW0tPm1vZGUgPSBjYW5vbl9tb2RlKHN0LnN0X21vZGUpOworCQl9CisJCWVsc2UgaWYgKDAgPD0gKGZkID0gb3BlbihlbGVtLT5wYXRoLCBPX1JET05MWSkpICYmCisJCQkgIWZzdGF0KGZkLCAmc3QpKSB7CisJCQlzaXplX3QgbGVuID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJCXNpemVfdCBzeiA9IDA7CisJCQlpbnQgaXNfZmlsZSwgaTsKKworCQkJZWxlbS0+bW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisJCQkvKiBpZiBzeW1saW5rcyBkb24ndCB3b3JrLCBhc3N1bWUgc3ltbGluayBpZiBhbGwgcGFyZW50cworCQkJICogYXJlIHN5bWxpbmtzCisJCQkgKi8KKwkJCWlzX2ZpbGUgPSBoYXNfc3ltbGlua3M7CisJCQlmb3IgKGkgPSAwOyAhaXNfZmlsZSAmJiBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJCWlzX2ZpbGUgPSAhU19JU0xOSyhlbGVtLT5wYXJlbnRbaV0ubW9kZSk7CisJCQlpZiAoIWlzX2ZpbGUpCisJCQkJZWxlbS0+bW9kZSA9IGNhbm9uX21vZGUoU19JRkxOSyk7CisKKwkJCXJlc3VsdF9zaXplID0gbGVuOworCQkJcmVzdWx0ID0geG1hbGxvYyhsZW4gKyAxKTsKKwkJCXdoaWxlIChzeiA8IGxlbikgeworCQkJCXNzaXplX3QgZG9uZSA9IHhyZWFkKGZkLCByZXN1bHQrc3osIGxlbi1zeik7CisJCQkJaWYgKGRvbmUgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGRvbmUgPCAwKQorCQkJCQlkaWUoInJlYWQgZXJyb3IgJyVzJyIsIGVsZW0tPnBhdGgpOworCQkJCXN6ICs9IGRvbmU7CisJCQl9CisJCQlyZXN1bHRbbGVuXSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCWRlbGV0ZWRfZmlsZToKKwkJCXJlc3VsdF9zaXplID0gMDsKKwkJCWVsZW0tPm1vZGUgPSAwOworCQkJcmVzdWx0ID0geGNhbGxvYygxLCAxKTsKKwkJfQorCisJCWlmICgwIDw9IGZkKQorCQkJY2xvc2UoZmQpOworCX0KKworCWZvciAoY250ID0gMCwgY3AgPSByZXN1bHQ7IGNwIDwgcmVzdWx0ICsgcmVzdWx0X3NpemU7IGNwKyspIHsKKwkJaWYgKCpjcCA9PSAnXG4nKQorCQkJY250Kys7CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJY250Kys7IC8qIGluY29tcGxldGUgbGluZSAqLworCisJc2xpbmUgPSB4Y2FsbG9jKGNudCsyLCBzaXplb2YoKnNsaW5lKSk7CisJc2xpbmVbMF0uYm9sID0gcmVzdWx0OworCWZvciAobG5vID0gMDsgbG5vIDw9IGNudCArIDE7IGxubysrKSB7CisJCXNsaW5lW2xub10ubG9zdF90YWlsID0gJnNsaW5lW2xub10ubG9zdF9oZWFkOworCQlzbGluZVtsbm9dLmZsYWcgPSAwOworCX0KKwlmb3IgKGxubyA9IDAsIGNwID0gcmVzdWx0OyBjcCA8IHJlc3VsdCArIHJlc3VsdF9zaXplOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJ1xuJykgeworCQkJc2xpbmVbbG5vXS5sZW4gPSBjcCAtIHNsaW5lW2xub10uYm9sOworCQkJbG5vKys7CisJCQlpZiAobG5vIDwgY250KQorCQkJCXNsaW5lW2xub10uYm9sID0gY3AgKyAxOworCQl9CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJc2xpbmVbY250LTFdLmxlbiA9IHJlc3VsdF9zaXplIC0gKHNsaW5lW2NudC0xXS5ib2wgLSByZXN1bHQpOworCisJcmVzdWx0X2ZpbGUucHRyID0gcmVzdWx0OworCXJlc3VsdF9maWxlLnNpemUgPSByZXN1bHRfc2l6ZTsKKworCS8qIEV2ZW4gcF9sbm9bY250KzFdIGlzIHZhbGlkIC0tIHRoYXQgaXMgZm9yIHRoZSBlbmQgbGluZSBudW1iZXIKKwkgKiBmb3IgZGVsZXRpb24gaHVuayBhdCB0aGUgZW5kLgorCSAqLworCXNsaW5lWzBdLnBfbG5vID0geGNhbGxvYygoY250KzIpICogbnVtX3BhcmVudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlmb3IgKGxubyA9IDA7IGxubyA8PSBjbnQ7IGxubysrKQorCQlzbGluZVtsbm8rMV0ucF9sbm8gPSBzbGluZVtsbm9dLnBfbG5vICsgbnVtX3BhcmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCWlmICghaGFzaGNtcChlbGVtLT5wYXJlbnRbaV0uc2hhMSwKKwkJCQkgICAgIGVsZW0tPnBhcmVudFtqXS5zaGExKSkgeworCQkJCXJldXNlX2NvbWJpbmVfZGlmZihzbGluZSwgY250LCBpLCBqKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA8PSBqKQorCQkJY29tYmluZV9kaWZmKGVsZW0tPnBhcmVudFtpXS5zaGExLCAmcmVzdWx0X2ZpbGUsIHNsaW5lLAorCQkJCSAgICAgY250LCBpLCBudW1fcGFyZW50KTsKKwkJaWYgKGVsZW0tPnBhcmVudFtpXS5tb2RlICE9IGVsZW0tPm1vZGUpCisJCQltb2RlX2RpZmZlcnMgPSAxOworCX0KKworCXNob3dfaHVua3MgPSBtYWtlX2h1bmtzKHNsaW5lLCBjbnQsIG51bV9wYXJlbnQsIGRlbnNlKTsKKworCWlmIChzaG93X2h1bmtzIHx8IG1vZGVfZGlmZmVycyB8fCB3b3JraW5nX3RyZWVfZmlsZSkgeworCQljb25zdCBjaGFyICphYmI7CisJCWludCB1c2VfY29sb3IgPSBvcHQtPmNvbG9yX2RpZmY7CisJCWNvbnN0IGNoYXIgKmNfbWV0YSA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9NRVRBSU5GTyk7CisJCWNvbnN0IGNoYXIgKmNfcmVzZXQgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfUkVTRVQpOworCQlpbnQgYWRkZWQgPSAwOworCQlpbnQgZGVsZXRlZCA9IDA7CisKKwkJaWYgKHJldi0+bG9naW5mbyAmJiAhcmV2LT5ub19jb21taXRfaWQpCisJCQlzaG93X2xvZyhyZXYsIG9wdC0+bXNnX3NlcCk7CisJCWR1bXBfcXVvdGVkX3BhdGgoZGVuc2UgPyAiZGlmZiAtLWNjICIgOiAiZGlmZiAtLWNvbWJpbmVkICIsCisJCQkJIGVsZW0tPnBhdGgsIGNfbWV0YSwgY19yZXNldCk7CisJCXByaW50ZigiJXNpbmRleCAiLCBjX21ldGEpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKSB7CisJCQlhYmIgPSBmaW5kX3VuaXF1ZV9hYmJyZXYoZWxlbS0+cGFyZW50W2ldLnNoYTEsCisJCQkJCQkgYWJicmV2KTsKKwkJCXByaW50ZigiJXMlcyIsIGkgPyAiLCIgOiAiIiwgYWJiKTsKKwkJfQorCQlhYmIgPSBmaW5kX3VuaXF1ZV9hYmJyZXYoZWxlbS0+c2hhMSwgYWJicmV2KTsKKwkJcHJpbnRmKCIuLiVzJXNcbiIsIGFiYiwgY19yZXNldCk7CisKKwkJaWYgKG1vZGVfZGlmZmVycykgeworCQkJZGVsZXRlZCA9ICFlbGVtLT5tb2RlOworCisJCQkvKiBXZSBzYXkgaXQgd2FzIGFkZGVkIGlmIG5vYm9keSBoYWQgaXQgKi8KKwkJCWFkZGVkID0gIWRlbGV0ZWQ7CisJCQlmb3IgKGkgPSAwOyBhZGRlZCAmJiBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJCWlmIChlbGVtLT5wYXJlbnRbaV0uc3RhdHVzICE9CisJCQkJICAgIERJRkZfU1RBVFVTX0FEREVEKQorCQkJCQlhZGRlZCA9IDA7CisJCQlpZiAoYWRkZWQpCisJCQkJcHJpbnRmKCIlc25ldyBmaWxlIG1vZGUgJTA2byIsCisJCQkJICAgICAgIGNfbWV0YSwgZWxlbS0+bW9kZSk7CisJCQllbHNlIHsKKwkJCQlpZiAoZGVsZXRlZCkKKwkJCQkJcHJpbnRmKCIlc2RlbGV0ZWQgZmlsZSAiLCBjX21ldGEpOworCQkJCXByaW50ZigibW9kZSAiKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKSB7CisJCQkJCXByaW50ZigiJXMlMDZvIiwgaSA/ICIsIiA6ICIiLAorCQkJCQkgICAgICAgZWxlbS0+cGFyZW50W2ldLm1vZGUpOworCQkJCX0KKwkJCQlpZiAoZWxlbS0+bW9kZSkKKwkJCQkJcHJpbnRmKCIuLiUwNm8iLCBlbGVtLT5tb2RlKTsKKwkJCX0KKwkJCXByaW50ZigiJXNcbiIsIGNfcmVzZXQpOworCQl9CisJCWlmIChhZGRlZCkKKwkJCWR1bXBfcXVvdGVkX3BhdGgoIi0tLSAvZGV2LyIsICJudWxsIiwgY19tZXRhLCBjX3Jlc2V0KTsKKwkJZWxzZQorCQkJZHVtcF9xdW90ZWRfcGF0aCgiLS0tIGEvIiwgZWxlbS0+cGF0aCwgY19tZXRhLCBjX3Jlc2V0KTsKKwkJaWYgKGRlbGV0ZWQpCisJCQlkdW1wX3F1b3RlZF9wYXRoKCIrKysgL2Rldi8iLCAibnVsbCIsIGNfbWV0YSwgY19yZXNldCk7CisJCWVsc2UKKwkJCWR1bXBfcXVvdGVkX3BhdGgoIisrKyBiLyIsIGVsZW0tPnBhdGgsIGNfbWV0YSwgY19yZXNldCk7CisJCWR1bXBfc2xpbmUoc2xpbmUsIGNudCwgbnVtX3BhcmVudCwgb3B0LT5jb2xvcl9kaWZmKTsKKwl9CisJZnJlZShyZXN1bHQpOworCisJZm9yIChsbm8gPSAwOyBsbm8gPCBjbnQ7IGxubysrKSB7CisJCWlmIChzbGluZVtsbm9dLmxvc3RfaGVhZCkgeworCQkJc3RydWN0IGxsaW5lICpsbCA9IHNsaW5lW2xub10ubG9zdF9oZWFkOworCQkJd2hpbGUgKGxsKSB7CisJCQkJc3RydWN0IGxsaW5lICp0bXAgPSBsbDsKKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJCWZyZWUodG1wKTsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKHNsaW5lWzBdLnBfbG5vKTsKKwlmcmVlKHNsaW5lKTsKK30KKworI2RlZmluZSBDT0xPTlMgIjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IgorCitzdGF0aWMgdm9pZCBzaG93X3Jhd19kaWZmKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcCwgaW50IG51bV9wYXJlbnQsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJaW50IGksIG9mZnNldDsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJaW50IGxpbmVfdGVybWluYXRpb24sIGludGVyX25hbWVfdGVybWluYXRpb247CisKKwlsaW5lX3Rlcm1pbmF0aW9uID0gb3B0LT5saW5lX3Rlcm1pbmF0aW9uOworCWludGVyX25hbWVfdGVybWluYXRpb24gPSAnXHQnOworCWlmICghbGluZV90ZXJtaW5hdGlvbikKKwkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9IDA7CisKKwlpZiAocmV2LT5sb2dpbmZvICYmICFyZXYtPm5vX2NvbW1pdF9pZCkKKwkJc2hvd19sb2cocmV2LCBvcHQtPm1zZ19zZXApOworCisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1JBVykgeworCQlvZmZzZXQgPSBzdHJsZW4oQ09MT05TKSAtIG51bV9wYXJlbnQ7CisJCWlmIChvZmZzZXQgPCAwKQorCQkJb2Zmc2V0ID0gMDsKKwkJcHJlZml4ID0gQ09MT05TICsgb2Zmc2V0OworCisJCS8qIFNob3cgdGhlIG1vZGVzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJCXByaW50ZigiJXMlMDZvIiwgcHJlZml4LCBwLT5wYXJlbnRbaV0ubW9kZSk7CisJCQlwcmVmaXggPSAiICI7CisJCX0KKwkJcHJpbnRmKCIlcyUwNm8iLCBwcmVmaXgsIHAtPm1vZGUpOworCisJCS8qIFNob3cgc2hhMSdzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspCisJCQlwcmludGYoIiAlcyIsIGRpZmZfdW5pcXVlX2FiYnJldihwLT5wYXJlbnRbaV0uc2hhMSwKKwkJCQkJCQkgb3B0LT5hYmJyZXYpKTsKKwkJcHJpbnRmKCIgJXMgIiwgZGlmZl91bmlxdWVfYWJicmV2KHAtPnNoYTEsIG9wdC0+YWJicmV2KSk7CisJfQorCisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfCBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXB1dGNoYXIocC0+cGFyZW50W2ldLnN0YXR1cyk7CisJCXB1dGNoYXIoaW50ZXJfbmFtZV90ZXJtaW5hdGlvbik7CisJfQorCisJaWYgKGxpbmVfdGVybWluYXRpb24pIHsKKwkJaWYgKHF1b3RlX2Nfc3R5bGUocC0+cGF0aCwgTlVMTCwgTlVMTCwgMCkpCisJCQlxdW90ZV9jX3N0eWxlKHAtPnBhdGgsIE5VTEwsIHN0ZG91dCwgMCk7CisJCWVsc2UKKwkJCXByaW50ZigiJXMiLCBwLT5wYXRoKTsKKwkJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0aW9uKTsKKwl9CisJZWxzZSB7CisJCXByaW50ZigiJXMlYyIsIHAtPnBhdGgsIGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKwordm9pZCBzaG93X2NvbWJpbmVkX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwLAorCQkgICAgICAgaW50IG51bV9wYXJlbnQsCisJCSAgICAgICBpbnQgZGVuc2UsCisJCSAgICAgICBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQgPSAmcmV2LT5kaWZmb3B0OworCWlmICghcC0+bGVuKQorCQlyZXR1cm47CisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfAorCQkJCSAgRElGRl9GT1JNQVRfTkFNRSB8CisJCQkJICBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpCisJCXNob3dfcmF3X2RpZmYocCwgbnVtX3BhcmVudCwgcmV2KTsKKwllbHNlIGlmIChvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkKKwkJc2hvd19wYXRjaF9kaWZmKHAsIG51bV9wYXJlbnQsIGRlbnNlLCByZXYpOworfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciBwYXJlbnRbXVsyMF0sCisJCQlpbnQgbnVtX3BhcmVudCwKKwkJCWludCBkZW5zZSwKKwkJCXN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmb3B0czsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnAsICpwYXRocyA9IE5VTEw7CisJaW50IGksIG51bV9wYXRocywgbmVlZHNlcCwgc2hvd19sb2dfZmlyc3Q7CisKKwlkaWZmb3B0cyA9ICpvcHQ7CisJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwlkaWZmb3B0cy5yZWN1cnNpdmUgPSAxOworCWRpZmZvcHRzLmFsbG93X2V4dGVybmFsID0gMDsKKworCXNob3dfbG9nX2ZpcnN0ID0gISFyZXYtPmxvZ2luZm8gJiYgIXJldi0+bm9fY29tbWl0X2lkOworCW5lZWRzZXAgPSAwOworCS8qIGZpbmQgc2V0IG9mIHBhdGhzIHRoYXQgZXZlcnlib2R5IHRvdWNoZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKSB7CisJCS8qIHNob3cgc3RhdCBhZ2FpbnN0IHRoZSBmaXJzdCBwYXJlbnQgZXZlbgorCQkgKiB3aGVuIGRvaW5nIGNvbWJpbmVkIGRpZmYuCisJCSAqLworCQlpbnQgc3RhdF9vcHQgPSAob3B0LT5vdXRwdXRfZm9ybWF0ICYKKwkJCQkoRElGRl9GT1JNQVRfTlVNU1RBVHxESUZGX0ZPUk1BVF9ESUZGU1RBVCkpOworCQlpZiAoaSA9PSAwICYmIHN0YXRfb3B0KQorCQkJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IHN0YXRfb3B0OworCQllbHNlCisJCQlkaWZmb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCQlkaWZmX3RyZWVfc2hhMShwYXJlbnRbaV0sIHNoYTEsICIiLCAmZGlmZm9wdHMpOworCQlkaWZmY29yZV9zdGQoJmRpZmZvcHRzKTsKKwkJcGF0aHMgPSBpbnRlcnNlY3RfcGF0aHMocGF0aHMsIGksIG51bV9wYXJlbnQpOworCisJCWlmIChzaG93X2xvZ19maXJzdCAmJiBpID09IDApIHsKKwkJCXNob3dfbG9nKHJldiwgb3B0LT5tc2dfc2VwKTsKKwkJCWlmIChyZXYtPnZlcmJvc2VfaGVhZGVyICYmIG9wdC0+b3V0cHV0X2Zvcm1hdCkKKwkJCQlwdXRjaGFyKG9wdC0+bGluZV90ZXJtaW5hdGlvbik7CisJCX0KKwkJZGlmZl9mbHVzaCgmZGlmZm9wdHMpOworCX0KKworCS8qIGZpbmQgb3V0IHN1cnZpdmluZyBwYXRocyAqLworCWZvciAobnVtX3BhdGhzID0gMCwgcCA9IHBhdGhzOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+bGVuKQorCQkJbnVtX3BhdGhzKys7CisJfQorCWlmIChudW1fcGF0aHMpIHsKKwkJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfAorCQkJCQkgIERJRkZfRk9STUFUX05BTUUgfAorCQkJCQkgIERJRkZfRk9STUFUX05BTUVfU1RBVFVTKSkgeworCQkJZm9yIChwID0gcGF0aHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQkJaWYgKHAtPmxlbikKKwkJCQkJc2hvd19yYXdfZGlmZihwLCBudW1fcGFyZW50LCByZXYpOworCQkJfQorCQkJbmVlZHNlcCA9IDE7CisJCX0KKwkJZWxzZSBpZiAob3B0LT5vdXRwdXRfZm9ybWF0ICYKKwkJCSAoRElGRl9GT1JNQVRfTlVNU1RBVHxESUZGX0ZPUk1BVF9ESUZGU1RBVCkpCisJCQluZWVkc2VwID0gMTsKKwkJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1BBVENIKSB7CisJCQlpZiAobmVlZHNlcCkKKwkJCQlwdXRjaGFyKG9wdC0+bGluZV90ZXJtaW5hdGlvbik7CisJCQlmb3IgKHAgPSBwYXRoczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCQlpZiAocC0+bGVuKQorCQkJCQlzaG93X3BhdGNoX2RpZmYocCwgbnVtX3BhcmVudCwgZGVuc2UsCisJCQkJCQkJcmV2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENsZWFuIHRoaW5ncyB1cCAqLworCXdoaWxlIChwYXRocykgeworCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnRtcCA9IHBhdGhzOworCQlwYXRocyA9IHBhdGhzLT5uZXh0OworCQlmcmVlKHRtcCk7CisJfQorfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZF9tZXJnZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICAgICBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCWludCBudW1fcGFyZW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKCpwYXJlbnQpWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCS8qIGNvdW50IHBhcmVudHMgKi8KKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCTsgLyogbm90aGluZyAqLworCisJcGFyZW50ID0geG1hbGxvYyhudW1fcGFyZW50ICogc2l6ZW9mKCpwYXJlbnQpKTsKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCWhhc2hjcHkoKHVuc2lnbmVkIGNoYXIqKShwYXJlbnQgKyBudW1fcGFyZW50KSwKKwkJCXBhcmVudHMtPml0ZW0tPm9iamVjdC5zaGExKTsKKwlkaWZmX3RyZWVfY29tYmluZWQoc2hhMSwgcGFyZW50LCBudW1fcGFyZW50LCBkZW5zZSwgcmV2KTsKK30KZGlmZiAtLWdpdCBhL2NvbW1pdC5jIGIvY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMmUzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1pdC5jCkBAIC0wLDAgKzEsMTQxMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJ1dGY4LmgiCisjaW5jbHVkZSAiaW50ZXJwb2xhdGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworaW50IHNhdmVfY29tbWl0X2J1ZmZlciA9IDE7CisKK3N0cnVjdCBzb3J0X25vZGUKK3sKKwkvKgorCSAqIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhlIGFzc29jaWF0ZWQgY29tbWl0CisJICogdGhhdCBhbHNvIG9jY3VyIGluIHRoZSBsaXN0IGJlaW5nIHNvcnRlZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaW5kZWdyZWU7CisKKwkvKgorCSAqIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBsaXN0IGl0ZW0gdGhhdCB3ZSB3aWxsIHJlLXVzZQorCSAqIG9uIG91dHB1dC4KKwkgKi8KKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKiBsaXN0X2l0ZW07CisKK307CisKK2NvbnN0IGNoYXIgKmNvbW1pdF90eXBlID0gImNvbW1pdCI7CisKK3N0cnVjdCBjbXRfZm10X21hcCB7CisJY29uc3QgY2hhciAqbjsKKwlzaXplX3QgY21wX2xlbjsKKwllbnVtIGNtaXRfZm10IHY7Cit9IGNtdF9mbXRzW10gPSB7CisJeyAicmF3IiwJMSwJQ01JVF9GTVRfUkFXIH0sCisJeyAibWVkaXVtIiwJMSwJQ01JVF9GTVRfTUVESVVNIH0sCisJeyAic2hvcnQiLAkxLAlDTUlUX0ZNVF9TSE9SVCB9LAorCXsgImVtYWlsIiwJMSwJQ01JVF9GTVRfRU1BSUwgfSwKKwl7ICJmdWxsIiwJNSwJQ01JVF9GTVRfRlVMTCB9LAorCXsgImZ1bGxlciIsCTUsCUNNSVRfRk1UX0ZVTExFUiB9LAorCXsgIm9uZWxpbmUiLAkxLAlDTUlUX0ZNVF9PTkVMSU5FIH0sCisJeyAiZm9ybWF0OiIsCTcsCUNNSVRfRk1UX1VTRVJGT1JNQVR9LAorfTsKKworc3RhdGljIGNoYXIgKnVzZXJfZm9ybWF0OworCitlbnVtIGNtaXRfZm10IGdldF9jb21taXRfZm9ybWF0KGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpbnQgaTsKKworCWlmICghYXJnIHx8ICEqYXJnKQorCQlyZXR1cm4gQ01JVF9GTVRfREVGQVVMVDsKKwlpZiAoKmFyZyA9PSAnPScpCisJCWFyZysrOworCWlmICghcHJlZml4Y21wKGFyZywgImZvcm1hdDoiKSkgeworCQlpZiAodXNlcl9mb3JtYXQpCisJCQlmcmVlKHVzZXJfZm9ybWF0KTsKKwkJdXNlcl9mb3JtYXQgPSB4c3RyZHVwKGFyZyArIDcpOworCQlyZXR1cm4gQ01JVF9GTVRfVVNFUkZPUk1BVDsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY210X2ZtdHMpOyBpKyspIHsKKwkJaWYgKCFzdHJuY21wKGFyZywgY210X2ZtdHNbaV0ubiwgY210X2ZtdHNbaV0uY21wX2xlbikgJiYKKwkJICAgICFzdHJuY21wKGFyZywgY210X2ZtdHNbaV0ubiwgc3RybGVuKGFyZykpKQorCQkJcmV0dXJuIGNtdF9mbXRzW2ldLnY7CisJfQorCisJZGllKCJpbnZhbGlkIC0tcHJldHR5IGZvcm1hdDogJXMiLCBhcmcpOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqY2hlY2tfY29tbWl0KHN0cnVjdCBvYmplY3QgKm9iaiwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCSAgIGludCBxdWlldCkKK3sKKwlpZiAob2JqLT50eXBlICE9IE9CSl9DT01NSVQpIHsKKwkJaWYgKCFxdWlldCkKKwkJCWVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgY29tbWl0IiwKKwkJCSAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoc3RydWN0IGNvbW1pdCAqKSBvYmo7Cit9CisKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQkgICAgICBpbnQgcXVpZXQpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgTlVMTCwgMCk7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNoZWNrX2NvbW1pdChvYmosIHNoYTEsIHF1aWV0KTsKK30KKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDApOworfQorCitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX0NPTU1JVCwgYWxsb2NfY29tbWl0X25vZGUoKSk7CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9DT01NSVQ7CisJcmV0dXJuIGNoZWNrX2NvbW1pdChvYmosIHNoYTEsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9jb21taXRfZGF0ZShjb25zdCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCisJaWYgKG1lbWNtcChidWYsICJhdXRob3IiLCA2KSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCpidWYrKyAhPSAnXG4nKQorCQkvKiBuYWRhICovOworCWlmIChtZW1jbXAoYnVmLCAiY29tbWl0dGVyIiwgOSkpCisJCXJldHVybiAwOworCXdoaWxlICgqYnVmKysgIT0gJz4nKQorCQkvKiBuYWRhICovOworCWRhdGUgPSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWlmIChkYXRlID09IFVMT05HX01BWCkKKwkJZGF0ZSA9IDA7CisJcmV0dXJuIGRhdGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2dyYWZ0ICoqY29tbWl0X2dyYWZ0Oworc3RhdGljIGludCBjb21taXRfZ3JhZnRfYWxsb2MsIGNvbW1pdF9ncmFmdF9ucjsKKworc3RhdGljIGludCBjb21taXRfZ3JhZnRfcG9zKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGxvLCBoaTsKKwlsbyA9IDA7CisJaGkgPSBjb21taXRfZ3JhZnRfbnI7CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGxvICsgaGkpIC8gMjsKKwkJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSBjb21taXRfZ3JhZnRbbWldOworCQlpbnQgY21wID0gaGFzaGNtcChzaGExLCBncmFmdC0+c2hhMSk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIG1pOworCQlpZiAoY21wIDwgMCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0KKwlyZXR1cm4gLWxvIC0gMTsKK30KKworaW50IHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCwgaW50IGlnbm9yZV9kdXBzKQoreworCWludCBwb3MgPSBjb21taXRfZ3JhZnRfcG9zKGdyYWZ0LT5zaGExKTsKKwkKKwlpZiAoMCA8PSBwb3MpIHsKKwkJaWYgKGlnbm9yZV9kdXBzKQorCQkJZnJlZShncmFmdCk7CisJCWVsc2UgeworCQkJZnJlZShjb21taXRfZ3JhZnRbcG9zXSk7CisJCQljb21taXRfZ3JhZnRbcG9zXSA9IGdyYWZ0OworCQl9CisJCXJldHVybiAxOworCX0KKwlwb3MgPSAtcG9zIC0gMTsKKwlpZiAoY29tbWl0X2dyYWZ0X2FsbG9jIDw9ICsrY29tbWl0X2dyYWZ0X25yKSB7CisJCWNvbW1pdF9ncmFmdF9hbGxvYyA9IGFsbG9jX25yKGNvbW1pdF9ncmFmdF9hbGxvYyk7CisJCWNvbW1pdF9ncmFmdCA9IHhyZWFsbG9jKGNvbW1pdF9ncmFmdCwKKwkJCQkJc2l6ZW9mKCpjb21taXRfZ3JhZnQpICoKKwkJCQkJY29tbWl0X2dyYWZ0X2FsbG9jKTsKKwl9CisJaWYgKHBvcyA8IGNvbW1pdF9ncmFmdF9ucikKKwkJbWVtbW92ZShjb21taXRfZ3JhZnQgKyBwb3MgKyAxLAorCQkJY29tbWl0X2dyYWZ0ICsgcG9zLAorCQkJKGNvbW1pdF9ncmFmdF9uciAtIHBvcyAtIDEpICoKKwkJCXNpemVvZigqY29tbWl0X2dyYWZ0KSk7CisJY29tbWl0X2dyYWZ0W3Bvc10gPSBncmFmdDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbW1pdF9ncmFmdCAqcmVhZF9ncmFmdF9saW5lKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwkvKiBUaGUgZm9ybWF0IGlzIGp1c3QgIkNvbW1pdCBQYXJlbnQxIFBhcmVudDIgLi4uXG4iICovCisJaW50IGk7CisJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSBOVUxMOworCisJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9IDA7CisJaWYgKGJ1ZlswXSA9PSAnIycgfHwgYnVmWzBdID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCWlmICgobGVuICsgMSkgJSA0MSkgeworCWJhZF9ncmFmdF9kYXRhOgorCQllcnJvcigiYmFkIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwkJZnJlZShncmFmdCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpID0gKGxlbiArIDEpIC8gNDEgLSAxOworCWdyYWZ0ID0geG1hbGxvYyhzaXplb2YoKmdyYWZ0KSArIDIwICogaSk7CisJZ3JhZnQtPm5yX3BhcmVudCA9IGk7CisJaWYgKGdldF9zaGExX2hleChidWYsIGdyYWZ0LT5zaGExKSkKKwkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwlmb3IgKGkgPSA0MDsgaSA8IGxlbjsgaSArPSA0MSkgeworCQlpZiAoYnVmW2ldICE9ICcgJykKKwkJCWdvdG8gYmFkX2dyYWZ0X2RhdGE7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmICsgaSArIDEsIGdyYWZ0LT5wYXJlbnRbaS80MV0pKQorCQkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwl9CisJcmV0dXJuIGdyYWZ0OworfQorCitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihncmFmdF9maWxlLCAiciIpOworCWNoYXIgYnVmWzEwMjRdOworCWlmICghZnApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCS8qIFRoZSBmb3JtYXQgaXMganVzdCAiQ29tbWl0IFBhcmVudDEgUGFyZW50MiAuLi5cbiIgKi8KKwkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCQlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCA9IHJlYWRfZ3JhZnRfbGluZShidWYsIGxlbik7CisJCWlmICghZ3JhZnQpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChncmFmdCwgMSkpCisJCQllcnJvcigiZHVwbGljYXRlIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9jb21taXRfZ3JhZnQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGNvbW1pdF9ncmFmdF9wcmVwYXJlZDsKKwljaGFyICpncmFmdF9maWxlOworCisJaWYgKGNvbW1pdF9ncmFmdF9wcmVwYXJlZCkKKwkJcmV0dXJuOworCWdyYWZ0X2ZpbGUgPSBnZXRfZ3JhZnRfZmlsZSgpOworCXJlYWRfZ3JhZnRfZmlsZShncmFmdF9maWxlKTsKKwkvKiBtYWtlIHN1cmUgc2hhbGxvd3MgYXJlIHJlYWQgKi8KKwlpc19yZXBvc2l0b3J5X3NoYWxsb3coKTsKKwljb21taXRfZ3JhZnRfcHJlcGFyZWQgPSAxOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9ncmFmdCAqbG9va3VwX2NvbW1pdF9ncmFmdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBwb3M7CisJcHJlcGFyZV9jb21taXRfZ3JhZnQoKTsKKwlwb3MgPSBjb21taXRfZ3JhZnRfcG9zKHNoYTEpOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29tbWl0X2dyYWZ0W3Bvc107Cit9CisKK2ludCB3cml0ZV9zaGFsbG93X2NvbW1pdHMoaW50IGZkLCBpbnQgdXNlX3BhY2tfcHJvdG9jb2wpCit7CisJaW50IGksIGNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY29tbWl0X2dyYWZ0X25yOyBpKyspCisJCWlmIChjb21taXRfZ3JhZnRbaV0tPm5yX3BhcmVudCA8IDApIHsKKwkJCWNvbnN0IGNoYXIgKmhleCA9CisJCQkJc2hhMV90b19oZXgoY29tbWl0X2dyYWZ0W2ldLT5zaGExKTsKKwkJCWNvdW50Kys7CisJCQlpZiAodXNlX3BhY2tfcHJvdG9jb2wpCisJCQkJcGFja2V0X3dyaXRlKGZkLCAic2hhbGxvdyAlcyIsIGhleCk7CisJCQllbHNlIHsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgaGV4LCAgNDApICE9IDQwKQorCQkJCQlicmVhazsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgIlxuIiwgMSkgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCB1bnJlZ2lzdGVyX3NoYWxsb3coY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcG9zID0gY29tbWl0X2dyYWZ0X3BvcyhzaGExKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChwb3MgKyAxIDwgY29tbWl0X2dyYWZ0X25yKQorCQltZW1jcHkoY29tbWl0X2dyYWZ0ICsgcG9zLCBjb21taXRfZ3JhZnQgKyBwb3MgKyAxLAorCQkJCXNpemVvZihzdHJ1Y3QgY29tbWl0X2dyYWZ0ICopCisJCQkJKiAoY29tbWl0X2dyYWZ0X25yIC0gcG9zIC0gMSkpOworCWNvbW1pdF9ncmFmdF9uci0tOworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfY29tbWl0X2J1ZmZlcihzdHJ1Y3QgY29tbWl0ICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljaGFyICp0YWlsID0gYnVmZmVyOworCWNoYXIgKmJ1ZnB0ciA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHBhcmVudFsyMF07CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHB0cjsKKwlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdDsKKwl1bnNpZ25lZCBuX3JlZnMgPSAwOworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCXRhaWwgKz0gc2l6ZTsKKwlpZiAodGFpbCA8PSBidWZwdHIgKyA1IHx8IG1lbWNtcChidWZwdHIsICJ0cmVlICIsIDUpKQorCQlyZXR1cm4gZXJyb3IoImJvZ3VzIGNvbW1pdCBvYmplY3QgJXMiLCBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmICh0YWlsIDw9IGJ1ZnB0ciArIDQ1IHx8IGdldF9zaGExX2hleChidWZwdHIgKyA1LCBwYXJlbnQpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJiYWQgdHJlZSBwb2ludGVyIGluIGNvbW1pdCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaXRlbS0+dHJlZSA9IGxvb2t1cF90cmVlKHBhcmVudCk7CisJaWYgKGl0ZW0tPnRyZWUpCisJCW5fcmVmcysrOworCWJ1ZnB0ciArPSA0NjsgLyogInRyZWUgIiArICJoZXggc2hhMSIgKyAiXG4iICovCisJcHB0ciA9ICZpdGVtLT5wYXJlbnRzOworCisJZ3JhZnQgPSBsb29rdXBfY29tbWl0X2dyYWZ0KGl0ZW0tPm9iamVjdC5zaGExKTsKKwl3aGlsZSAoYnVmcHRyICsgNDggPCB0YWlsICYmICFtZW1jbXAoYnVmcHRyLCAicGFyZW50ICIsIDcpKSB7CisJCXN0cnVjdCBjb21taXQgKm5ld19wYXJlbnQ7CisKKwkJaWYgKHRhaWwgPD0gYnVmcHRyICsgNDggfHwKKwkJICAgIGdldF9zaGExX2hleChidWZwdHIgKyA3LCBwYXJlbnQpIHx8CisJCSAgICBidWZwdHJbNDddICE9ICdcbicpCisJCQlyZXR1cm4gZXJyb3IoImJhZCBwYXJlbnRzIGluIGNvbW1pdCAlcyIsIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJCWJ1ZnB0ciArPSA0ODsKKwkJaWYgKGdyYWZ0KQorCQkJY29udGludWU7CisJCW5ld19wYXJlbnQgPSBsb29rdXBfY29tbWl0KHBhcmVudCk7CisJCWlmIChuZXdfcGFyZW50KSB7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWlmIChncmFmdCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNvbW1pdCAqbmV3X3BhcmVudDsKKwkJZm9yIChpID0gMDsgaSA8IGdyYWZ0LT5ucl9wYXJlbnQ7IGkrKykgeworCQkJbmV3X3BhcmVudCA9IGxvb2t1cF9jb21taXQoZ3JhZnQtPnBhcmVudFtpXSk7CisJCQlpZiAoIW5ld19wYXJlbnQpCisJCQkJY29udGludWU7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWl0ZW0tPmRhdGUgPSBwYXJzZV9jb21taXRfZGF0ZShidWZwdHIpOworCisJaWYgKHRyYWNrX29iamVjdF9yZWZzKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IGFsbG9jX29iamVjdF9yZWZzKG5fcmVmcyk7CisJCWlmIChpdGVtLT50cmVlKQorCQkJcmVmcy0+cmVmW2krK10gPSAmaXRlbS0+dHJlZS0+b2JqZWN0OworCQlmb3IgKHAgPSBpdGVtLT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkKKwkJCXJlZnMtPnJlZltpKytdID0gJnAtPml0ZW0tPm9iamVjdDsKKwkJc2V0X29iamVjdF9yZWZzKCZpdGVtLT5vYmplY3QsIHJlZnMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfY29tbWl0KHN0cnVjdCBjb21taXQgKml0ZW0pCit7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlidWZmZXIgPSByZWFkX3NoYTFfZmlsZShpdGVtLT5vYmplY3Quc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaWYgKHR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiBlcnJvcigiT2JqZWN0ICVzIG5vdCBhIGNvbW1pdCIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJfQorCXJldCA9IHBhcnNlX2NvbW1pdF9idWZmZXIoaXRlbSwgYnVmZmVyLCBzaXplKTsKKwlpZiAoc2F2ZV9jb21taXRfYnVmZmVyICYmICFyZXQpIHsKKwkJaXRlbS0+YnVmZmVyID0gYnVmZmVyOworCQlyZXR1cm4gMDsKKwl9CisJZnJlZShidWZmZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBjb21taXRfbGlzdCAqY29tbWl0X2xpc3RfaW5zZXJ0KHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3RfcCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm5ld19saXN0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdF9saXN0KSk7CisJbmV3X2xpc3QtPml0ZW0gPSBpdGVtOworCW5ld19saXN0LT5uZXh0ID0gKmxpc3RfcDsKKwkqbGlzdF9wID0gbmV3X2xpc3Q7CisJcmV0dXJuIG5ld19saXN0OworfQorCit2b2lkIGZyZWVfY29tbWl0X2xpc3Qoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqdGVtcCA9IGxpc3Q7CisJCWxpc3QgPSB0ZW1wLT5uZXh0OworCQlmcmVlKHRlbXApOworCX0KK30KKworc3RydWN0IGNvbW1pdF9saXN0ICogaW5zZXJ0X2J5X2RhdGUoc3RydWN0IGNvbW1pdCAqaXRlbSwgc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcCA9IGxpc3Q7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCXdoaWxlICgocCA9ICpwcCkgIT0gTlVMTCkgeworCQlpZiAocC0+aXRlbS0+ZGF0ZSA8IGl0ZW0tPmRhdGUpIHsKKwkJCWJyZWFrOworCQl9CisJCXBwID0gJnAtPm5leHQ7CisJfQorCXJldHVybiBjb21taXRfbGlzdF9pbnNlcnQoaXRlbSwgcHApOworfQorCisJCit2b2lkIHNvcnRfYnlfZGF0ZShzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcmV0ID0gTlVMTDsKKwl3aGlsZSAoKmxpc3QpIHsKKwkJaW5zZXJ0X2J5X2RhdGUoKCpsaXN0KS0+aXRlbSwgJnJldCk7CisJCSpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKwl9CisJKmxpc3QgPSByZXQ7Cit9CisKK3N0cnVjdCBjb21taXQgKnBvcF9tb3N0X3JlY2VudF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXQgPSAoKmxpc3QpLT5pdGVtOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IHJldC0+cGFyZW50czsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm9sZCA9ICpsaXN0OworCisJKmxpc3QgPSAoKmxpc3QpLT5uZXh0OworCWZyZWUob2xkKTsKKworCXdoaWxlIChwYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBhcmVudHMtPml0ZW07CisJCXBhcnNlX2NvbW1pdChjb21taXQpOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIG1hcmspKSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBtYXJrOworCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCBsaXN0KTsKKwkJfQorCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjbGVhcl9jb21taXRfbWFya3Moc3RydWN0IGNvbW1pdCAqY29tbWl0LCB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwljb21taXQtPm9iamVjdC5mbGFncyAmPSB+bWFyazsKKwlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisKKwkJLyogSGF2ZSB3ZSBhbHJlYWR5IGNsZWFyZWQgdGhpcz8gKi8KKwkJaWYgKG1hcmsgJiBwYXJlbnQtPm9iamVjdC5mbGFncykKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyhwYXJlbnQsIG1hcmspOworCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwl9Cit9CisKKy8qCisgKiBHZW5lcmljIHN1cHBvcnQgZm9yIHByZXR0eS1wcmludGluZyB0aGUgaGVhZGVyCisgKi8KK3N0YXRpYyBpbnQgZ2V0X29uZV9saW5lKGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJY2hhciBjID0gKm1zZysrOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJcmV0Kys7CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogSGlnaCBiaXQgc2V0LCBvciBJU08tMjAyMi1JTlQgKi8KK3N0YXRpYyBpbnQgbm9uX2FzY2lpKGludCBjaCkKK3sKKwljaCA9IChjaCAmIDB4ZmYpOworCXJldHVybiAoKGNoICYgMHg4MCkgfHwgKGNoID09IDB4MWIpKTsKK30KKworc3RhdGljIGludCBpc19yZmMyMDQ3X3NwZWNpYWwoY2hhciBjaCkKK3sKKwlyZXR1cm4gKG5vbl9hc2NpaShjaCkgfHwgKGNoID09ICc9JykgfHwgKGNoID09ICc/JykgfHwgKGNoID09ICdfJykpOworfQorCitzdGF0aWMgaW50IGFkZF9yZmMyMDQ3KGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nKQoreworCWNoYXIgKmJwID0gYnVmOworCWludCBpLCBuZWVkcXVvdGU7CisJY2hhciBxX2VuY29kaW5nWzEyOF07CisJY29uc3QgY2hhciAqcV9lbmNvZGluZ19mbXQgPSAiPT8lcz9xPyI7CisKKwlmb3IgKGkgPSBuZWVkcXVvdGUgPSAwOyAhbmVlZHF1b3RlICYmIGkgPCBsZW47IGkrKykgeworCQlpbnQgY2ggPSBsaW5lW2ldOworCQlpZiAobm9uX2FzY2lpKGNoKSkKKwkJCW5lZWRxdW90ZSsrOworCQlpZiAoKGkgKyAxIDwgbGVuKSAmJgorCQkgICAgKGNoID09ICc9JyAmJiBsaW5lW2krMV0gPT0gJz8nKSkKKwkJCW5lZWRxdW90ZSsrOworCX0KKwlpZiAoIW5lZWRxdW90ZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJS4qcyIsIGxlbiwgbGluZSk7CisKKwlpID0gc25wcmludGYocV9lbmNvZGluZywgc2l6ZW9mKHFfZW5jb2RpbmcpLCBxX2VuY29kaW5nX2ZtdCwgZW5jb2RpbmcpOworCWlmIChzaXplb2YocV9lbmNvZGluZykgPCBpKQorCQlkaWUoIkluc2FuZWx5IGxvbmcgZW5jb2RpbmcgbmFtZSAlcyIsIGVuY29kaW5nKTsKKwltZW1jcHkoYnAsIHFfZW5jb2RpbmcsIGkpOworCWJwICs9IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoID0gbGluZVtpXSAmIDB4RkY7CisJCS8qCisJCSAqIFdlIGVuY29kZSAnICcgdXNpbmcgJz0yMCcgZXZlbiB0aG91Z2ggcmZjMjA0NworCQkgKiBhbGxvd3MgdXNpbmcgJ18nIGZvciByZWFkYWJpbGl0eS4gIFVuZm9ydHVuYXRlbHksCisJCSAqIG1hbnkgcHJvZ3JhbXMgZG8gbm90IHVuZGVyc3RhbmQgdGhpcyBhbmQganVzdAorCQkgKiBsZWF2ZSB0aGUgdW5kZXJzY29yZSBpbiBwbGFjZS4KKwkJICovCisJCWlmIChpc19yZmMyMDQ3X3NwZWNpYWwoY2gpIHx8IGNoID09ICcgJykgeworCQkJc3ByaW50ZihicCwgIj0lMDJYIiwgY2gpOworCQkJYnAgKz0gMzsKKwkJfQorCQllbHNlCisJCQkqYnArKyA9IGNoOworCX0KKwltZW1jcHkoYnAsICI/PSIsIDIpOworCWJwICs9IDI7CisJcmV0dXJuIGJwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGFkZF91c2VyX2luZm8oY29uc3QgY2hhciAqd2hhdCwgZW51bSBjbWl0X2ZtdCBmbXQsIGNoYXIgKmJ1ZiwKKwkJCSBjb25zdCBjaGFyICpsaW5lLCBlbnVtIGRhdGVfbW9kZSBkbW9kZSwKKwkJCSBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKwljaGFyICpkYXRlOworCWludCBuYW1lbGVuOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlpbnQgdHosIHJldDsKKwljb25zdCBjaGFyICpmaWxsZXIgPSAiICAgICI7CisKKwlpZiAoZm10ID09IENNSVRfRk1UX09ORUxJTkUpCisJCXJldHVybiAwOworCWRhdGUgPSBzdHJjaHIobGluZSwgJz4nKTsKKwlpZiAoIWRhdGUpCisJCXJldHVybiAwOworCW5hbWVsZW4gPSArK2RhdGUgLSBsaW5lOworCXRpbWUgPSBzdHJ0b3VsKGRhdGUsICZkYXRlLCAxMCk7CisJdHogPSBzdHJ0b2woZGF0ZSwgTlVMTCwgMTApOworCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQljaGFyICpuYW1lX3RhaWwgPSBzdHJjaHIobGluZSwgJzwnKTsKKwkJaW50IGRpc3BsYXlfbmFtZV9sZW5ndGg7CisJCWlmICghbmFtZV90YWlsKQorCQkJcmV0dXJuIDA7CisJCXdoaWxlIChsaW5lIDwgbmFtZV90YWlsICYmIGlzc3BhY2UobmFtZV90YWlsWy0xXSkpCisJCQluYW1lX3RhaWwtLTsKKwkJZGlzcGxheV9uYW1lX2xlbmd0aCA9IG5hbWVfdGFpbCAtIGxpbmU7CisJCWZpbGxlciA9ICIiOworCQlzdHJjcHkoYnVmLCAiRnJvbTogIik7CisJCXJldCA9IHN0cmxlbihidWYpOworCQlyZXQgKz0gYWRkX3JmYzIwNDcoYnVmICsgcmV0LCBsaW5lLCBkaXNwbGF5X25hbWVfbGVuZ3RoLAorCQkJCSAgIGVuY29kaW5nKTsKKwkJbWVtY3B5KGJ1ZiArIHJldCwgbmFtZV90YWlsLCBuYW1lbGVuIC0gZGlzcGxheV9uYW1lX2xlbmd0aCk7CisJCXJldCArPSBuYW1lbGVuIC0gZGlzcGxheV9uYW1lX2xlbmd0aDsKKwkJYnVmW3JldCsrXSA9ICdcbic7CisJfQorCWVsc2UgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzOiAlLipzJS4qc1xuIiwgd2hhdCwKKwkJCSAgICAgIChmbXQgPT0gQ01JVF9GTVRfRlVMTEVSKSA/IDQgOiAwLAorCQkJICAgICAgZmlsbGVyLCBuYW1lbGVuLCBsaW5lKTsKKwl9CisJc3dpdGNoIChmbXQpIHsKKwljYXNlIENNSVRfRk1UX01FRElVTToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiRGF0ZTogICAlc1xuIiwKKwkJCSAgICAgICBzaG93X2RhdGUodGltZSwgdHosIGRtb2RlKSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRU1BSUw6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkRhdGU6ICVzXG4iLAorCQkJICAgICAgIHNob3dfcmZjMjgyMl9kYXRlKHRpbWUsIHR6KSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRlVMTEVSOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICIlc0RhdGU6ICVzXG4iLCB3aGF0LAorCQkJICAgICAgIHNob3dfZGF0ZSh0aW1lLCB0eiwgZG1vZGUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90aW4nICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzX2VtcHR5X2xpbmUoY29uc3QgY2hhciAqbGluZSwgaW50ICpsZW5fcCkKK3sKKwlpbnQgbGVuID0gKmxlbl9wOworCXdoaWxlIChsZW4gJiYgaXNzcGFjZShsaW5lW2xlbi0xXSkpCisJCWxlbi0tOworCSpsZW5fcCA9IGxlbjsKKwlyZXR1cm4gIWxlbjsKK30KKworc3RhdGljIGludCBhZGRfbWVyZ2VfaW5mbyhlbnVtIGNtaXRfZm10IGZtdCwgY2hhciAqYnVmLCBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBhYmJyZXYpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQgPSBjb21taXQtPnBhcmVudHM7CisJaW50IG9mZnNldDsKKworCWlmICgoZm10ID09IENNSVRfRk1UX09ORUxJTkUpIHx8IChmbXQgPT0gQ01JVF9GTVRfRU1BSUwpIHx8CisJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bmV4dCkKKwkJcmV0dXJuIDA7CisKKwlvZmZzZXQgPSBzcHJpbnRmKGJ1ZiwgIk1lcmdlOiIpOworCisJd2hpbGUgKHBhcmVudCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQljb25zdCBjaGFyICpoZXggPSBOVUxMOworCQljb25zdCBjaGFyICpkb3RzOworCQlpZiAoYWJicmV2KQorCQkJaGV4ID0gZmluZF91bmlxdWVfYWJicmV2KHAtPm9iamVjdC5zaGExLCBhYmJyZXYpOworCQlpZiAoIWhleCkKKwkJCWhleCA9IHNoYTFfdG9faGV4KHAtPm9iamVjdC5zaGExKTsKKwkJZG90cyA9IChhYmJyZXYgJiYgc3RybGVuKGhleCkgIT0gNDApID8gICIuLi4iIDogIiI7CisJCXBhcmVudCA9IHBhcmVudC0+bmV4dDsKKworCQlvZmZzZXQgKz0gc3ByaW50ZihidWYgKyBvZmZzZXQsICIgJXMlcyIsIGhleCwgZG90cyk7CisJfQorCWJ1ZltvZmZzZXQrK10gPSAnXG4nOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfaGVhZGVyKGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBrZXlfbGVuID0gc3RybGVuKGtleSk7CisJY29uc3QgY2hhciAqbGluZSA9IGNvbW1pdC0+YnVmZmVyOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICplb2wgPSBzdHJjaHIobGluZSwgJ1xuJyksICpuZXh0OworCisJCWlmIChsaW5lID09IGVvbCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoIWVvbCkgeworCQkJZW9sID0gbGluZSArIHN0cmxlbihsaW5lKTsKKwkJCW5leHQgPSBOVUxMOworCQl9IGVsc2UKKwkJCW5leHQgPSBlb2wgKyAxOworCQlpZiAoZW9sIC0gbGluZSA+IGtleV9sZW4gJiYKKwkJICAgICFzdHJuY21wKGxpbmUsIGtleSwga2V5X2xlbikgJiYKKwkJICAgIGxpbmVba2V5X2xlbl0gPT0gJyAnKSB7CisJCQlpbnQgbGVuID0gZW9sIC0gbGluZSAtIGtleV9sZW47CisJCQljaGFyICpyZXQgPSB4bWFsbG9jKGxlbik7CisJCQltZW1jcHkocmV0LCBsaW5lICsga2V5X2xlbiArIDEsIGxlbiAtIDEpOworCQkJcmV0W2xlbiAtIDFdID0gJ1wwJzsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbGluZSA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgY2hhciAqcmVwbGFjZV9lbmNvZGluZ19oZWFkZXIoY2hhciAqYnVmLCBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKwljaGFyICplbmNvZGluZ19oZWFkZXIgPSBzdHJzdHIoYnVmLCAiXG5lbmNvZGluZyAiKTsKKwljaGFyICpoZWFkZXJfZW5kID0gc3Ryc3RyKGJ1ZiwgIlxuXG4iKTsKKwljaGFyICplbmRfb2ZfZW5jb2RpbmdfaGVhZGVyOworCWludCBlbmNvZGluZ19oZWFkZXJfcG9zOworCWludCBlbmNvZGluZ19oZWFkZXJfbGVuOworCWludCBuZXdfbGVuOworCWludCBuZWVkX2xlbjsKKwlpbnQgYnVmbGVuID0gc3RybGVuKGJ1ZikgKyAxOworCisJaWYgKCFoZWFkZXJfZW5kKQorCQloZWFkZXJfZW5kID0gYnVmICsgYnVmbGVuOworCWlmICghZW5jb2RpbmdfaGVhZGVyIHx8IGVuY29kaW5nX2hlYWRlciA+PSBoZWFkZXJfZW5kKQorCQlyZXR1cm4gYnVmOworCWVuY29kaW5nX2hlYWRlcisrOworCWVuZF9vZl9lbmNvZGluZ19oZWFkZXIgPSBzdHJjaHIoZW5jb2RpbmdfaGVhZGVyLCAnXG4nKTsKKwlpZiAoIWVuZF9vZl9lbmNvZGluZ19oZWFkZXIpCisJCXJldHVybiBidWY7IC8qIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBiZSBkZWZlbnNpdmUgKi8KKwllbmRfb2ZfZW5jb2RpbmdfaGVhZGVyKys7CisKKwllbmNvZGluZ19oZWFkZXJfbGVuID0gZW5kX29mX2VuY29kaW5nX2hlYWRlciAtIGVuY29kaW5nX2hlYWRlcjsKKwllbmNvZGluZ19oZWFkZXJfcG9zID0gZW5jb2RpbmdfaGVhZGVyIC0gYnVmOworCisJaWYgKGlzX2VuY29kaW5nX3V0ZjgoZW5jb2RpbmcpKSB7CisJCS8qIHdlIGhhdmUgcmUtY29kZWQgdG8gVVRGLTg7IGRyb3AgdGhlIGhlYWRlciAqLworCQltZW1tb3ZlKGVuY29kaW5nX2hlYWRlciwgZW5kX29mX2VuY29kaW5nX2hlYWRlciwKKwkJCWJ1ZmxlbiAtIChlbmNvZGluZ19oZWFkZXJfcG9zICsgZW5jb2RpbmdfaGVhZGVyX2xlbikpOworCQlyZXR1cm4gYnVmOworCX0KKwluZXdfbGVuID0gc3RybGVuKGVuY29kaW5nKTsKKwluZWVkX2xlbiA9IG5ld19sZW4gKyBzdHJsZW4oImVuY29kaW5nIFxuIik7CisJaWYgKGVuY29kaW5nX2hlYWRlcl9sZW4gPCBuZWVkX2xlbikgeworCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZmxlbiArIChuZWVkX2xlbiAtIGVuY29kaW5nX2hlYWRlcl9sZW4pKTsKKwkJZW5jb2RpbmdfaGVhZGVyID0gYnVmICsgZW5jb2RpbmdfaGVhZGVyX3BvczsKKwkJZW5kX29mX2VuY29kaW5nX2hlYWRlciA9IGVuY29kaW5nX2hlYWRlciArIGVuY29kaW5nX2hlYWRlcl9sZW47CisJfQorCW1lbW1vdmUoZW5kX29mX2VuY29kaW5nX2hlYWRlciArIChuZWVkX2xlbiAtIGVuY29kaW5nX2hlYWRlcl9sZW4pLAorCQllbmRfb2ZfZW5jb2RpbmdfaGVhZGVyLAorCQlidWZsZW4gLSAoZW5jb2RpbmdfaGVhZGVyX3BvcyArIGVuY29kaW5nX2hlYWRlcl9sZW4pKTsKKwltZW1jcHkoZW5jb2RpbmdfaGVhZGVyICsgOSwgZW5jb2RpbmcsIHN0cmxlbihlbmNvZGluZykpOworCWVuY29kaW5nX2hlYWRlcls5ICsgbmV3X2xlbl0gPSAnXG4nOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpsb2dtc2dfcmVlbmNvZGUoY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJICAgICBjb25zdCBjaGFyICpvdXRwdXRfZW5jb2RpbmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnV0ZjggPSAidXRmLTgiOworCWNvbnN0IGNoYXIgKnVzZV9lbmNvZGluZzsKKwljaGFyICplbmNvZGluZzsKKwljaGFyICpvdXQ7CisKKwlpZiAoISpvdXRwdXRfZW5jb2RpbmcpCisJCXJldHVybiBOVUxMOworCWVuY29kaW5nID0gZ2V0X2hlYWRlcihjb21taXQsICJlbmNvZGluZyIpOworCXVzZV9lbmNvZGluZyA9IGVuY29kaW5nID8gZW5jb2RpbmcgOiB1dGY4OworCWlmICghc3RyY21wKHVzZV9lbmNvZGluZywgb3V0cHV0X2VuY29kaW5nKSkKKwkJb3V0ID0geHN0cmR1cChjb21taXQtPmJ1ZmZlcik7CisJZWxzZQorCQlvdXQgPSByZWVuY29kZV9zdHJpbmcoY29tbWl0LT5idWZmZXIsCisJCQkJICAgICAgb3V0cHV0X2VuY29kaW5nLCB1c2VfZW5jb2RpbmcpOworCWlmIChvdXQpCisJCW91dCA9IHJlcGxhY2VfZW5jb2RpbmdfaGVhZGVyKG91dCwgb3V0cHV0X2VuY29kaW5nKTsKKworCWZyZWUoZW5jb2RpbmcpOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcGVyc29uKHN0cnVjdCBpbnRlcnAgKnRhYmxlLCBjb25zdCBjaGFyICptc2csIGludCBsZW4pCit7CisJaW50IHN0YXJ0LCBlbmQsIHR6ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRhdGU7CisJY2hhciAqZXA7CisKKwkvKiBwYXJzZSBuYW1lICovCisJZm9yIChlbmQgPSAwOyBlbmQgPCBsZW4gJiYgbXNnW2VuZF0gIT0gJzwnOyBlbmQrKykKKwkJOyAvKiBkbyBub3RoaW5nICovCisJc3RhcnQgPSBlbmQgKyAxOworCXdoaWxlIChlbmQgPiAwICYmIGlzc3BhY2UobXNnW2VuZCAtIDFdKSkKKwkJZW5kLS07CisJdGFibGVbMF0udmFsdWUgPSB4c3RybmR1cChtc2csIGVuZCk7CisKKwlpZiAoc3RhcnQgPj0gbGVuKQorCQlyZXR1cm47CisKKwkvKiBwYXJzZSBlbWFpbCAqLworCWZvciAoZW5kID0gc3RhcnQgKyAxOyBlbmQgPCBsZW4gJiYgbXNnW2VuZF0gIT0gJz4nOyBlbmQrKykKKwkJOyAvKiBkbyBub3RoaW5nICovCisKKwlpZiAoZW5kID49IGxlbikKKwkJcmV0dXJuOworCisJdGFibGVbMV0udmFsdWUgPSB4c3RybmR1cChtc2cgKyBzdGFydCwgZW5kIC0gc3RhcnQpOworCisJLyogcGFyc2UgZGF0ZSAqLworCWZvciAoc3RhcnQgPSBlbmQgKyAxOyBzdGFydCA8IGxlbiAmJiBpc3NwYWNlKG1zZ1tzdGFydF0pOyBzdGFydCsrKQorCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwlpZiAoc3RhcnQgPj0gbGVuKQorCQlyZXR1cm47CisJZGF0ZSA9IHN0cnRvdWwobXNnICsgc3RhcnQsICZlcCwgMTApOworCWlmIChtc2cgKyBzdGFydCA9PSBlcCkKKwkJcmV0dXJuOworCisJdGFibGVbNV0udmFsdWUgPSB4c3RybmR1cChtc2cgKyBzdGFydCwgZXAgLSAobXNnICsgc3RhcnQpKTsKKworCS8qIHBhcnNlIHR6ICovCisJZm9yIChzdGFydCA9IGVwIC0gbXNnICsgMTsgc3RhcnQgPCBsZW4gJiYgaXNzcGFjZShtc2dbc3RhcnRdKTsgc3RhcnQrKykKKwkJOyAvKiBkbyBub3RoaW5nICovCisJaWYgKHN0YXJ0ICsgMSA8IGxlbikgeworCQl0eiA9IHN0cnRvdWwobXNnICsgc3RhcnQgKyAxLCBOVUxMLCAxMCk7CisJCWlmIChtc2dbc3RhcnRdID09ICctJykKKwkJCXR6ID0gLXR6OworCX0KKworCWludGVycF9zZXRfZW50cnkodGFibGUsIDIsIHNob3dfZGF0ZShkYXRlLCB0eiwgMCkpOworCWludGVycF9zZXRfZW50cnkodGFibGUsIDMsIHNob3dfcmZjMjgyMl9kYXRlKGRhdGUsIHR6KSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgNCwgc2hvd19kYXRlKGRhdGUsIHR6LCAxKSk7Cit9CisKK3N0YXRpYyBsb25nIGZvcm1hdF9jb21taXRfbWVzc2FnZShjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWNvbnN0IGNoYXIgKm1zZywgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNwYWNlKQoreworCXN0cnVjdCBpbnRlcnAgdGFibGVbXSA9IHsKKwkJeyAiJUgiIH0sCS8qIGNvbW1pdCBoYXNoICovCisJCXsgIiVoIiB9LAkvKiBhYmJyZXZpYXRlZCBjb21taXQgaGFzaCAqLworCQl7ICIlVCIgfSwJLyogdHJlZSBoYXNoICovCisJCXsgIiV0IiB9LAkvKiBhYmJyZXZpYXRlZCB0cmVlIGhhc2ggKi8KKwkJeyAiJVAiIH0sCS8qIHBhcmVudCBoYXNoZXMgKi8KKwkJeyAiJXAiIH0sCS8qIGFiYnJldmlhdGVkIHBhcmVudCBoYXNoZXMgKi8KKwkJeyAiJWFuIiB9LAkvKiBhdXRob3IgbmFtZSAqLworCQl7ICIlYWUiIH0sCS8qIGF1dGhvciBlbWFpbCAqLworCQl7ICIlYWQiIH0sCS8qIGF1dGhvciBkYXRlICovCisJCXsgIiVhRCIgfSwJLyogYXV0aG9yIGRhdGUsIFJGQzI4MjIgc3R5bGUgKi8KKwkJeyAiJWFyIiB9LAkvKiBhdXRob3IgZGF0ZSwgcmVsYXRpdmUgKi8KKwkJeyAiJWF0IiB9LAkvKiBhdXRob3IgZGF0ZSwgVU5JWCB0aW1lc3RhbXAgKi8KKwkJeyAiJWNuIiB9LAkvKiBjb21taXR0ZXIgbmFtZSAqLworCQl7ICIlY2UiIH0sCS8qIGNvbW1pdHRlciBlbWFpbCAqLworCQl7ICIlY2QiIH0sCS8qIGNvbW1pdHRlciBkYXRlICovCisJCXsgIiVjRCIgfSwJLyogY29tbWl0dGVyIGRhdGUsIFJGQzI4MjIgc3R5bGUgKi8KKwkJeyAiJWNyIiB9LAkvKiBjb21taXR0ZXIgZGF0ZSwgcmVsYXRpdmUgKi8KKwkJeyAiJWN0IiB9LAkvKiBjb21taXR0ZXIgZGF0ZSwgVU5JWCB0aW1lc3RhbXAgKi8KKwkJeyAiJWUiIH0sCS8qIGVuY29kaW5nICovCisJCXsgIiVzIiB9LAkvKiBzdWJqZWN0ICovCisJCXsgIiViIiB9LAkvKiBib2R5ICovCisJCXsgIiVDcmVkIiB9LAkvKiByZWQgKi8KKwkJeyAiJUNncmVlbiIgfSwJLyogZ3JlZW4gKi8KKwkJeyAiJUNibHVlIiB9LAkvKiBibHVlICovCisJCXsgIiVDcmVzZXQiIH0sCS8qIHJlc2V0IGNvbG9yICovCisJCXsgIiVuIiB9LAkvKiBuZXdsaW5lICovCisJCXsgIiVtIiB9LAkvKiBsZWZ0L3JpZ2h0L2JvdHRvbSAqLworCX07CisJZW51bSBpbnRlcnBfaW5kZXggeworCQlJSEFTSCA9IDAsIElIQVNIX0FCQlJFViwKKwkJSVRSRUUsIElUUkVFX0FCQlJFViwKKwkJSVBBUkVOVFMsIElQQVJFTlRTX0FCQlJFViwKKwkJSUFVVEhPUl9OQU1FLCBJQVVUSE9SX0VNQUlMLAorCQlJQVVUSE9SX0RBVEUsIElBVVRIT1JfREFURV9SRkMyODIyLCBJQVVUSE9SX0RBVEVfUkVMQVRJVkUsCisJCUlBVVRIT1JfVElNRVNUQU1QLAorCQlJQ09NTUlUVEVSX05BTUUsIElDT01NSVRURVJfRU1BSUwsCisJCUlDT01NSVRURVJfREFURSwgSUNPTU1JVFRFUl9EQVRFX1JGQzI4MjIsCisJCUlDT01NSVRURVJfREFURV9SRUxBVElWRSwgSUNPTU1JVFRFUl9USU1FU1RBTVAsCisJCUlFTkNPRElORywKKwkJSVNVQkpFQ1QsCisJCUlCT0RZLAorCQlJUkVELCBJR1JFRU4sIElCTFVFLCBJUkVTRVRfQ09MT1IsCisJCUlORVdMSU5FLAorCQlJTEVGVF9SSUdIVCwKKwl9OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwljaGFyIHBhcmVudHNbMTAyNF07CisJaW50IGk7CisJZW51bSB7IEhFQURFUiwgU1VCSkVDVCwgQk9EWSB9IHN0YXRlOworCisJaWYgKElMRUZUX1JJR0hUICsgMSAhPSBBUlJBWV9TSVpFKHRhYmxlKSkKKwkJZGllKCJpbnZhbGlkIGludGVycCB0YWJsZSEiKTsKKworCS8qIHRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29tbWl0ICovCisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSVJFRCwgIlwwMzNbMzFtIik7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSUdSRUVOLCAiXDAzM1szMm0iKTsKKwlpbnRlcnBfc2V0X2VudHJ5KHRhYmxlLCBJQkxVRSwgIlwwMzNbMzRtIik7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSVJFU0VUX0NPTE9SLCAiXDAzM1ttIik7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSU5FV0xJTkUsICJcbiIpOworCisJLyogdGhlc2UgZGVwZW5kIG9uIHRoZSBjb21taXQgKi8KKwlpZiAoIWNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJcGFyc2Vfb2JqZWN0KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCWludGVycF9zZXRfZW50cnkodGFibGUsIElIQVNILCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSUhBU0hfQUJCUkVWLAorCQkJZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsCisJCQkJREVGQVVMVF9BQkJSRVYpKTsKKwlpbnRlcnBfc2V0X2VudHJ5KHRhYmxlLCBJVFJFRSwgc2hhMV90b19oZXgoY29tbWl0LT50cmVlLT5vYmplY3Quc2hhMSkpOworCWludGVycF9zZXRfZW50cnkodGFibGUsIElUUkVFX0FCQlJFViwKKwkJCWZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkJCURFRkFVTFRfQUJCUkVWKSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSUxFRlRfUklHSFQsCisJCQkgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCQkgPyAiLSIKKwkJCSA6IChjb21taXQtPm9iamVjdC5mbGFncyAmIFNZTU1FVFJJQ19MRUZUKQorCQkJID8gIjwiCisJCQkgOiAiPiIpOworCisJcGFyZW50c1sxXSA9IDA7CisJZm9yIChpID0gMCwgcCA9IGNvbW1pdC0+cGFyZW50czsKKwkJCXAgJiYgaSA8IHNpemVvZihwYXJlbnRzKSAtIDE7CisJCQlwID0gcC0+bmV4dCkKKwkJaSArPSBzbnByaW50ZihwYXJlbnRzICsgaSwgc2l6ZW9mKHBhcmVudHMpIC0gaSAtIDEsICIgJXMiLAorCQkJc2hhMV90b19oZXgocC0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpbnRlcnBfc2V0X2VudHJ5KHRhYmxlLCBJUEFSRU5UUywgcGFyZW50cyArIDEpOworCisJcGFyZW50c1sxXSA9IDA7CisJZm9yIChpID0gMCwgcCA9IGNvbW1pdC0+cGFyZW50czsKKwkJCXAgJiYgaSA8IHNpemVvZihwYXJlbnRzKSAtIDE7CisJCQlwID0gcC0+bmV4dCkKKwkJaSArPSBzbnByaW50ZihwYXJlbnRzICsgaSwgc2l6ZW9mKHBhcmVudHMpIC0gaSAtIDEsICIgJXMiLAorCQkJZmluZF91bmlxdWVfYWJicmV2KHAtPml0ZW0tPm9iamVjdC5zaGExLAorCQkJCURFRkFVTFRfQUJCUkVWKSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSVBBUkVOVFNfQUJCUkVWLCBwYXJlbnRzICsgMSk7CisKKwlmb3IgKGkgPSAwLCBzdGF0ZSA9IEhFQURFUjsgbXNnW2ldICYmIHN0YXRlIDwgQk9EWTsgaSsrKSB7CisJCWludCBlb2w7CisJCWZvciAoZW9sID0gaTsgbXNnW2VvbF0gJiYgbXNnW2VvbF0gIT0gJ1xuJzsgZW9sKyspCisJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKworCQlpZiAoc3RhdGUgPT0gU1VCSkVDVCkgeworCQkJdGFibGVbSVNVQkpFQ1RdLnZhbHVlID0geHN0cm5kdXAobXNnICsgaSwgZW9sIC0gaSk7CisJCQlpID0gZW9sOworCQl9CisJCWlmIChpID09IGVvbCkgeworCQkJc3RhdGUrKzsKKwkJCS8qIHN0cmlwIGVtcHR5IGxpbmVzICovCisJCQl3aGlsZSAobXNnW2VvbCArIDFdID09ICdcbicpCisJCQkJZW9sKys7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChtc2cgKyBpLCAiYXV0aG9yICIpKQorCQkJZmlsbF9wZXJzb24odGFibGUgKyBJQVVUSE9SX05BTUUsCisJCQkJCW1zZyArIGkgKyA3LCBlb2wgLSBpIC0gNyk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAobXNnICsgaSwgImNvbW1pdHRlciAiKSkKKwkJCWZpbGxfcGVyc29uKHRhYmxlICsgSUNPTU1JVFRFUl9OQU1FLAorCQkJCQltc2cgKyBpICsgMTAsIGVvbCAtIGkgLSAxMCk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAobXNnICsgaSwgImVuY29kaW5nICIpKQorCQkJdGFibGVbSUVOQ09ESU5HXS52YWx1ZSA9CisJCQkJeHN0cm5kdXAobXNnICsgaSArIDksIGVvbCAtIGkgLSA5KTsKKwkJaSA9IGVvbDsKKwl9CisJaWYgKG1zZ1tpXSkKKwkJdGFibGVbSUJPRFldLnZhbHVlID0geHN0cmR1cChtc2cgKyBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YWJsZSk7IGkrKykKKwkJaWYgKCF0YWJsZVtpXS52YWx1ZSkKKwkJCWludGVycF9zZXRfZW50cnkodGFibGUsIGksICI8dW5rbm93bj4iKTsKKworCWludGVycG9sYXRlKGJ1Ziwgc3BhY2UsIHVzZXJfZm9ybWF0LCB0YWJsZSwgQVJSQVlfU0laRSh0YWJsZSkpOworCWludGVycF9jbGVhcl90YWJsZSh0YWJsZSwgQVJSQVlfU0laRSh0YWJsZSkpOworCisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCit1bnNpZ25lZCBsb25nIHByZXR0eV9wcmludF9jb21taXQoZW51bSBjbWl0X2ZtdCBmbXQsCisJCQkJICBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkJICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzcGFjZSwKKwkJCQkgIGludCBhYmJyZXYsIGNvbnN0IGNoYXIgKnN1YmplY3QsCisJCQkJICBjb25zdCBjaGFyICphZnRlcl9zdWJqZWN0LAorCQkJCSAgZW51bSBkYXRlX21vZGUgZG1vZGUpCit7CisJaW50IGhkciA9IDEsIGJvZHkgPSAwLCBzZWVuX3RpdGxlID0gMDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJaW50IGluZGVudCA9IDQ7CisJaW50IHBhcmVudHNfc2hvd24gPSAwOworCWNvbnN0IGNoYXIgKm1zZyA9IGNvbW1pdC0+YnVmZmVyOworCWludCBwbGFpbl9ub25fYXNjaWkgPSAwOworCWNoYXIgKnJlZW5jb2RlZDsKKwljb25zdCBjaGFyICplbmNvZGluZzsKKworCWlmIChmbXQgPT0gQ01JVF9GTVRfVVNFUkZPUk1BVCkKKwkJcmV0dXJuIGZvcm1hdF9jb21taXRfbWVzc2FnZShjb21taXQsIG1zZywgYnVmLCBzcGFjZSk7CisKKwllbmNvZGluZyA9IChnaXRfbG9nX291dHB1dF9lbmNvZGluZworCQkgICAgPyBnaXRfbG9nX291dHB1dF9lbmNvZGluZworCQkgICAgOiBnaXRfY29tbWl0X2VuY29kaW5nKTsKKwlpZiAoIWVuY29kaW5nKQorCQllbmNvZGluZyA9ICJ1dGYtOCI7CisJcmVlbmNvZGVkID0gbG9nbXNnX3JlZW5jb2RlKGNvbW1pdCwgZW5jb2RpbmcpOworCWlmIChyZWVuY29kZWQpCisJCW1zZyA9IHJlZW5jb2RlZDsKKworCWlmIChmbXQgPT0gQ01JVF9GTVRfT05FTElORSB8fCBmbXQgPT0gQ01JVF9GTVRfRU1BSUwpCisJCWluZGVudCA9IDA7CisKKwkvKiBBZnRlci1zdWJqZWN0IGlzIHVzZWQgdG8gcGFzcyBpbiBDb250ZW50LVR5cGU6IG11bHRpcGFydAorCSAqIE1JTUUgaGVhZGVyOyBpbiB0aGF0IGNhc2Ugd2UgZG8gbm90IGhhdmUgdG8gZG8gdGhlCisJICogcGxhaW50ZXh0IGNvbnRlbnQgdHlwZSBldmVuIGlmIHRoZSBjb21taXQgbWVzc2FnZSBoYXMKKwkgKiBub24gNy1iaXQgQVNDSUkgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLCBjaGVjayBpZiB3ZSBuZWVkCisJICogdG8gc2F5IHRoaXMgaXMgbm90IGEgNy1iaXQgQVNDSUkuCisJICovCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCAmJiAhYWZ0ZXJfc3ViamVjdCkgeworCQlpbnQgaSwgY2gsIGluX2JvZHk7CisKKwkJZm9yIChpbl9ib2R5ID0gaSA9IDA7IChjaCA9IG1zZ1tpXSkgJiYgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoIWluX2JvZHkpIHsKKwkJCQkvKiBhdXRob3IgY291bGQgYmUgbm9uIDctYml0IEFTQ0lJIGJ1dAorCQkJCSAqIHRoZSBsb2cgbWF5IGJlIHNvOyBza2lwIG92ZXIgdGhlCisJCQkJICogaGVhZGVyIHBhcnQgZmlyc3QuCisJCQkJICovCisJCQkJaWYgKGNoID09ICdcbicgJiYKKwkJCQkgICAgaSArIDEgPCBsZW4gJiYgbXNnW2krMV0gPT0gJ1xuJykKKwkJCQkJaW5fYm9keSA9IDE7CisJCQl9CisJCQllbHNlIGlmIChub25fYXNjaWkoY2gpKSB7CisJCQkJcGxhaW5fbm9uX2FzY2lpID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqbGluZSA9IG1zZzsKKwkJaW50IGxpbmVsZW4gPSBnZXRfb25lX2xpbmUobXNnLCBsZW4pOworCisJCWlmICghbGluZWxlbikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIHdhbnQgc29tZSBzbG9wIGZvciBpbmRlbnRhdGlvbiBhbmQgYSBwb3NzaWJsZQorCQkgKiBmaW5hbCAiLi4uIi4gVGh1cyB0aGUgIisgMjAiLgorCQkgKi8KKwkJaWYgKG9mZnNldCArIGxpbmVsZW4gKyAyMCA+IHNwYWNlKSB7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCAiICAgIC4uLlxuIiwgOCk7CisJCQlvZmZzZXQgKz0gODsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNnICs9IGxpbmVsZW47CisJCWxlbiAtPSBsaW5lbGVuOworCQlpZiAoaGRyKSB7CisJCQlpZiAobGluZWxlbiA9PSAxKSB7CisJCQkJaGRyID0gMDsKKwkJCQlpZiAoKGZtdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKSAmJiAhc3ViamVjdCkKKwkJCQkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZm10ID09IENNSVRfRk1UX1JBVykgeworCQkJCW1lbWNweShidWYgKyBvZmZzZXQsIGxpbmUsIGxpbmVsZW4pOworCQkJCW9mZnNldCArPSBsaW5lbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFtZW1jbXAobGluZSwgInBhcmVudCAiLCA3KSkgeworCQkJCWlmIChsaW5lbGVuICE9IDQ4KQorCQkJCQlkaWUoImJhZCBwYXJlbnQgbGluZSBpbiBjb21taXQiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFwYXJlbnRzX3Nob3duKSB7CisJCQkJb2Zmc2V0ICs9IGFkZF9tZXJnZV9pbmZvKGZtdCwgYnVmICsgb2Zmc2V0LAorCQkJCQkJCSBjb21taXQsIGFiYnJldik7CisJCQkJcGFyZW50c19zaG93biA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogTUVESVVNID09IERFRkFVTFQgc2hvd3Mgb25seSBhdXRob3Igd2l0aCBkYXRlcy4KKwkJCSAqIEZVTEwgc2hvd3MgYm90aCBhdXRob3JzIGJ1dCBub3QgZGF0ZXMuCisJCQkgKiBGVUxMRVIgc2hvd3MgYm90aCBhdXRob3JzIGFuZCBkYXRlcy4KKwkJCSAqLworCQkJaWYgKCFtZW1jbXAobGluZSwgImF1dGhvciAiLCA3KSkKKwkJCQlvZmZzZXQgKz0gYWRkX3VzZXJfaW5mbygiQXV0aG9yIiwgZm10LAorCQkJCQkJCWJ1ZiArIG9mZnNldCwKKwkJCQkJCQlsaW5lICsgNywKKwkJCQkJCQlkbW9kZSwKKwkJCQkJCQllbmNvZGluZyk7CisJCQlpZiAoIW1lbWNtcChsaW5lLCAiY29tbWl0dGVyICIsIDEwKSAmJgorCQkJICAgIChmbXQgPT0gQ01JVF9GTVRfRlVMTCB8fCBmbXQgPT0gQ01JVF9GTVRfRlVMTEVSKSkKKwkJCQlvZmZzZXQgKz0gYWRkX3VzZXJfaW5mbygiQ29tbWl0IiwgZm10LAorCQkJCQkJCWJ1ZiArIG9mZnNldCwKKwkJCQkJCQlsaW5lICsgMTAsCisJCQkJCQkJZG1vZGUsCisJCQkJCQkJZW5jb2RpbmcpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN1YmplY3QpCisJCQlib2R5ID0gMTsKKworCQlpZiAoaXNfZW1wdHlfbGluZShsaW5lLCAmbGluZWxlbikpIHsKKwkJCWlmICghc2Vlbl90aXRsZSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghYm9keSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdWJqZWN0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZtdCA9PSBDTUlUX0ZNVF9TSE9SVCkKKwkJCQlicmVhazsKKwkJfQorCisJCXNlZW5fdGl0bGUgPSAxOworCQlpZiAoc3ViamVjdCkgeworCQkJaW50IHNsZW4gPSBzdHJsZW4oc3ViamVjdCk7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBzdWJqZWN0LCBzbGVuKTsKKwkJCW9mZnNldCArPSBzbGVuOworCQkJb2Zmc2V0ICs9IGFkZF9yZmMyMDQ3KGJ1ZiArIG9mZnNldCwgbGluZSwgbGluZWxlbiwKKwkJCQkJICAgICAgZW5jb2RpbmcpOworCQl9CisJCWVsc2UgeworCQkJbWVtc2V0KGJ1ZiArIG9mZnNldCwgJyAnLCBpbmRlbnQpOworCQkJbWVtY3B5KGJ1ZiArIG9mZnNldCArIGluZGVudCwgbGluZSwgbGluZWxlbik7CisJCQlvZmZzZXQgKz0gbGluZWxlbiArIGluZGVudDsKKwkJfQorCQlidWZbb2Zmc2V0KytdID0gJ1xuJzsKKwkJaWYgKGZtdCA9PSBDTUlUX0ZNVF9PTkVMSU5FKQorCQkJYnJlYWs7CisJCWlmIChzdWJqZWN0ICYmIHBsYWluX25vbl9hc2NpaSkgeworCQkJaW50IHN6OworCQkJY2hhciBoZWFkZXJbNTEyXTsKKwkJCWNvbnN0IGNoYXIgKmhlYWRlcl9mbXQgPQorCQkJCSJNSU1FLVZlcnNpb246IDEuMFxuIgorCQkJCSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9JXNcbiIKKwkJCQkiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIjsKKwkJCXN6ID0gc25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgaGVhZGVyX2ZtdCwKKwkJCQkgICAgICBlbmNvZGluZyk7CisJCQlpZiAoc2l6ZW9mKGhlYWRlcikgPCBzeikKKwkJCQlkaWUoIkVuY29kaW5nIG5hbWUgJXMgdG9vIGxvbmciLCBlbmNvZGluZyk7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBoZWFkZXIsIHN6KTsKKwkJCW9mZnNldCArPSBzejsKKwkJfQorCQlpZiAoYWZ0ZXJfc3ViamVjdCkgeworCQkJaW50IHNsZW4gPSBzdHJsZW4oYWZ0ZXJfc3ViamVjdCk7CisJCQlpZiAoc2xlbiA+IHNwYWNlIC0gb2Zmc2V0IC0gMSkKKwkJCQlzbGVuID0gc3BhY2UgLSBvZmZzZXQgLSAxOworCQkJbWVtY3B5KGJ1ZiArIG9mZnNldCwgYWZ0ZXJfc3ViamVjdCwgc2xlbik7CisJCQlvZmZzZXQgKz0gc2xlbjsKKwkJCWFmdGVyX3N1YmplY3QgPSBOVUxMOworCQl9CisJCXN1YmplY3QgPSBOVUxMOworCX0KKwl3aGlsZSAob2Zmc2V0ICYmIGlzc3BhY2UoYnVmW29mZnNldC0xXSkpCisJCW9mZnNldC0tOworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhbiBFT0xOIGZvciB0aGUgbm9uLW9uZWxpbmUgY2FzZSAqLworCWlmIChmbXQgIT0gQ01JVF9GTVRfT05FTElORSkKKwkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJLyoKKwkgKiBtYWtlIHN1cmUgdGhlcmUgaXMgYW5vdGhlciBFT0xOIHRvIHNlcGFyYXRlIHRoZSBoZWFkZXJzIGZyb20gd2hhdGV2ZXIKKwkgKiBib2R5IHRoZSBjYWxsZXIgYXBwZW5kcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgd3JpdHRlbiBhIGJvZHkKKwkgKi8KKwlpZiAoZm10ID09IENNSVRfRk1UX0VNQUlMICYmICFib2R5KQorCQlidWZbb2Zmc2V0KytdID0gJ1xuJzsKKwlidWZbb2Zmc2V0XSA9ICdcMCc7CisKKwlmcmVlKHJlZW5jb2RlZCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RydWN0IGNvbW1pdCAqcG9wX2NvbW1pdChzdHJ1Y3QgY29tbWl0X2xpc3QgKipzdGFjaykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRvcCA9ICpzdGFjazsKKwlzdHJ1Y3QgY29tbWl0ICppdGVtID0gdG9wID8gdG9wLT5pdGVtIDogTlVMTDsKKworCWlmICh0b3ApIHsKKwkJKnN0YWNrID0gdG9wLT5uZXh0OworCQlmcmVlKHRvcCk7CisJfQorCXJldHVybiBpdGVtOworfQorCitpbnQgY291bnRfcGFyZW50cyhzdHJ1Y3QgY29tbWl0ICogY29tbWl0KQoreworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHN0cnVjdCBjb21taXRfbGlzdCAqIHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisgICAgICAgIGZvciAoY291bnQgPSAwOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCxjb3VudCsrKQorCQk7CisgICAgICAgIHJldHVybiBjb3VudDsKK30KKwordm9pZCB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXIoc3RydWN0IGNvbW1pdCAqYywgdm9pZCAqZGF0YSkKK3sKKwljLT51dGlsID0gZGF0YTsKK30KKwordm9pZCAqdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyKHN0cnVjdCBjb21taXQgKmMpCit7CisJcmV0dXJuIGMtPnV0aWw7Cit9CisKKy8qCisgKiBQZXJmb3JtcyBhbiBpbi1wbGFjZSB0b3BvbG9naWNhbCBzb3J0IG9uIHRoZSBsaXN0IHN1cHBsaWVkLgorICovCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKQoreworCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4obGlzdCwgbGlmbywgdG9wb19zb3J0X2RlZmF1bHRfc2V0dGVyLAorCQkJCSAgICAgdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyKTsKK30KKwordm9pZCBzb3J0X2luX3RvcG9sb2dpY2FsX29yZGVyX2ZuKHN0cnVjdCBjb21taXRfbGlzdCAqKiBsaXN0LCBpbnQgbGlmbywKKwkJCQkgIHRvcG9fc29ydF9zZXRfZm5fdCBzZXR0ZXIsCisJCQkJICB0b3BvX3NvcnRfZ2V0X2ZuX3QgZ2V0dGVyKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqIG5leHQgPSAqbGlzdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKiB3b3JrID0gTlVMTCwgKippbnNlcnQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqIHBwdHIgPSBsaXN0OworCXN0cnVjdCBzb3J0X25vZGUgKiBub2RlczsKKwlzdHJ1Y3Qgc29ydF9ub2RlICogbmV4dF9ub2RlczsKKwlpbnQgY291bnQgPSAwOworCisJLyogZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBsaXN0ICovCisJd2hpbGUgKG5leHQpIHsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJCWNvdW50Kys7CisJfQorCQorCWlmICghY291bnQpCisJCXJldHVybjsKKwkvKiBhbGxvY2F0ZSBhbiBhcnJheSB0byBoZWxwIHNvcnQgdGhlIGxpc3QgKi8KKwlub2RlcyA9IHhjYWxsb2MoY291bnQsIHNpemVvZigqbm9kZXMpKTsKKwkvKiBsaW5rIHRoZSBsaXN0IHRvIHRoZSBhcnJheSAqLworCW5leHRfbm9kZXMgPSBub2RlczsKKwluZXh0PSpsaXN0OworCXdoaWxlIChuZXh0KSB7CisJCW5leHRfbm9kZXMtPmxpc3RfaXRlbSA9IG5leHQ7CisJCXNldHRlcihuZXh0LT5pdGVtLCBuZXh0X25vZGVzKTsKKwkJbmV4dF9ub2RlcysrOworCQluZXh0ID0gbmV4dC0+bmV4dDsKKwl9CisJLyogdXBkYXRlIHRoZSBpbmRlZ3JlZSAqLworCW5leHQ9Kmxpc3Q7CisJd2hpbGUgKG5leHQpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICogcGFyZW50cyA9IG5leHQtPml0ZW0tPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICogcGFyZW50PXBhcmVudHMtPml0ZW07CisJCQlzdHJ1Y3Qgc29ydF9ub2RlICogcG4gPSAoc3RydWN0IHNvcnRfbm9kZSAqKSBnZXR0ZXIocGFyZW50KTsKKworCQkJaWYgKHBuKQorCQkJCXBuLT5pbmRlZ3JlZSsrOworCQkJcGFyZW50cz1wYXJlbnRzLT5uZXh0OworCQl9CisJCW5leHQ9bmV4dC0+bmV4dDsKKwl9CisJLyogCisgICAgICAgICAqIGZpbmQgdGhlIHRpcHMKKyAgICAgICAgICoKKyAgICAgICAgICogdGlwcyBhcmUgbm9kZXMgbm90IHJlYWNoYWJsZSBmcm9tIGFueSBvdGhlciBub2RlIGluIHRoZSBsaXN0IAorICAgICAgICAgKiAKKyAgICAgICAgICogdGhlIHRpcHMgc2VydmUgYXMgYSBzdGFydGluZyBzZXQgZm9yIHRoZSB3b3JrIHF1ZXVlLgorICAgICAgICAgKi8KKwluZXh0PSpsaXN0OworCWluc2VydCA9ICZ3b3JrOworCXdoaWxlIChuZXh0KSB7CisJCXN0cnVjdCBzb3J0X25vZGUgKiBub2RlID0gKHN0cnVjdCBzb3J0X25vZGUgKikgZ2V0dGVyKG5leHQtPml0ZW0pOworCisJCWlmIChub2RlLT5pbmRlZ3JlZSA9PSAwKSB7CisJCQlpbnNlcnQgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KG5leHQtPml0ZW0sIGluc2VydCktPm5leHQ7CisJCX0KKwkJbmV4dD1uZXh0LT5uZXh0OworCX0KKworCS8qIHByb2Nlc3MgdGhlIGxpc3QgaW4gdG9wb2xvZ2ljYWwgb3JkZXIgKi8KKwlpZiAoIWxpZm8pCisJCXNvcnRfYnlfZGF0ZSgmd29yayk7CisJd2hpbGUgKHdvcmspIHsKKwkJc3RydWN0IGNvbW1pdCAqIHdvcmtfaXRlbSA9IHBvcF9jb21taXQoJndvcmspOworCQlzdHJ1Y3Qgc29ydF9ub2RlICogd29ya19ub2RlID0gKHN0cnVjdCBzb3J0X25vZGUgKikgZ2V0dGVyKHdvcmtfaXRlbSk7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqIHBhcmVudHMgPSB3b3JrX2l0ZW0tPnBhcmVudHM7CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKiBwYXJlbnQ9cGFyZW50cy0+aXRlbTsKKwkJCXN0cnVjdCBzb3J0X25vZGUgKiBwbiA9IChzdHJ1Y3Qgc29ydF9ub2RlICopIGdldHRlcihwYXJlbnQpOworCisJCQlpZiAocG4pIHsKKwkJCQkvKgorCQkJCSAqIHBhcmVudHMgYXJlIG9ubHkgZW5xdWV1ZWQgZm9yIGVtaXNzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGVuIGFsbCB0aGVpciBjaGlsZHJlbiBoYXZlIGJlZW4gZW1pdHRlZCB0aGVyZWJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGd1YXJhbnRlZWluZyB0b3BvbG9naWNhbCBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQkJcG4tPmluZGVncmVlLS07CisJCQkJaWYgKCFwbi0+aW5kZWdyZWUpIHsKKwkJCQkJaWYgKCFsaWZvKQorCQkJCQkJaW5zZXJ0X2J5X2RhdGUocGFyZW50LCAmd29yayk7CisJCQkJCWVsc2UKKwkJCQkJCWNvbW1pdF9saXN0X2luc2VydChwYXJlbnQsICZ3b3JrKTsKKwkJCQl9CisJCQl9CisJCQlwYXJlbnRzPXBhcmVudHMtPm5leHQ7CisJCX0KKwkJLyoKKyAgICAgICAgICAgICAgICAgKiB3b3JrX2l0ZW0gaXMgYSBjb21taXQgYWxsIG9mIHdob3NlIGNoaWxkcmVuCisgICAgICAgICAgICAgICAgICogaGF2ZSBhbHJlYWR5IGJlZW4gZW1pdHRlZC4gd2UgY2FuIGVtaXQgaXQgbm93LgorICAgICAgICAgICAgICAgICAqLworCQkqcHB0ciA9IHdvcmtfbm9kZS0+bGlzdF9pdGVtOworCQlwcHRyID0gJigqcHB0ciktPm5leHQ7CisJCSpwcHRyID0gTlVMTDsKKwkJc2V0dGVyKHdvcmtfaXRlbSwgTlVMTCk7CisJfQorCWZyZWUobm9kZXMpOworfQorCisvKiBtZXJnZS1iYXNlIHN0dWZmICovCisKKy8qIGJpdHMgIzAuLjE1IGluIHJldmlzaW9uLmggKi8KKyNkZWZpbmUgUEFSRU5UMQkJKDF1PDwxNikKKyNkZWZpbmUgUEFSRU5UMgkJKDF1PDwxNykKKyNkZWZpbmUgU1RBTEUJCSgxdTw8MTgpCisjZGVmaW5lIFJFU1VMVAkJKDF1PDwxOSkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGFsbF9mbGFncyA9IChQQVJFTlQxIHwgUEFSRU5UMiB8IFNUQUxFIHwgUkVTVUxUKTsKKworc3RhdGljIHN0cnVjdCBjb21taXQgKmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU1RBTEUpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKm1lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKm9uZSwgc3RydWN0IGNvbW1pdCAqdHdvKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQgPSBOVUxMOworCisJaWYgKG9uZSA9PSB0d28pCisJCS8qIFdlIGRvIG5vdCBtYXJrIHRoaXMgZXZlbiB3aXRoIFJFU1VMVCBzbyB3ZSBkbyBub3QKKwkJICogaGF2ZSB0byBjbGVhbiBpdCB1cC4KKwkJICovCisJCXJldHVybiBjb21taXRfbGlzdF9pbnNlcnQob25lLCAmcmVzdWx0KTsKKworCXBhcnNlX2NvbW1pdChvbmUpOworCXBhcnNlX2NvbW1pdCh0d28pOworCisJb25lLT5vYmplY3QuZmxhZ3MgfD0gUEFSRU5UMTsKKwl0d28tPm9iamVjdC5mbGFncyB8PSBQQVJFTlQyOworCWluc2VydF9ieV9kYXRlKG9uZSwgJmxpc3QpOworCWluc2VydF9ieV9kYXRlKHR3bywgJmxpc3QpOworCisJd2hpbGUgKGludGVyZXN0aW5nKGxpc3QpKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKm47CisJCWludCBmbGFnczsKKworCQljb21taXQgPSBsaXN0LT5pdGVtOworCQluID0gbGlzdC0+bmV4dDsKKwkJZnJlZShsaXN0KTsKKwkJbGlzdCA9IG47CisKKwkJZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFncyAmIChQQVJFTlQxIHwgUEFSRU5UMiB8IFNUQUxFKTsKKwkJaWYgKGZsYWdzID09IChQQVJFTlQxIHwgUEFSRU5UMikpIHsKKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgUkVTVUxUKSkgeworCQkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFJFU1VMVDsKKwkJCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZyZXN1bHQpOworCQkJfQorCQkJLyogTWFyayBwYXJlbnRzIG9mIGEgZm91bmQgbWVyZ2Ugc3RhbGUgKi8KKwkJCWZsYWdzIHw9IFNUQUxFOworCQl9CisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50cy0+aXRlbTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKChwLT5vYmplY3QuZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlwYXJzZV9jb21taXQocCk7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3M7CisJCQlpbnNlcnRfYnlfZGF0ZShwLCAmbGlzdCk7CisJCX0KKwl9CisKKwkvKiBDbGVhbiB1cCB0aGUgcmVzdWx0IHRvIHJlbW92ZSBzdGFsZSBvbmVzICovCisJZnJlZV9jb21taXRfbGlzdChsaXN0KTsKKwlsaXN0ID0gcmVzdWx0OyByZXN1bHQgPSBOVUxMOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqbiA9IGxpc3QtPm5leHQ7CisJCWlmICghKGxpc3QtPml0ZW0tPm9iamVjdC5mbGFncyAmIFNUQUxFKSkKKwkJCWluc2VydF9ieV9kYXRlKGxpc3QtPml0ZW0sICZyZXN1bHQpOworCQlmcmVlKGxpc3QpOworCQlsaXN0ID0gbjsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGNvbW1pdF9saXN0ICpnZXRfbWVyZ2VfYmFzZXMoc3RydWN0IGNvbW1pdCAqb25lLAorCQkJCSAgICBzdHJ1Y3QgY29tbWl0ICp0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xlYW51cCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJc3RydWN0IGNvbW1pdCAqKnJzbHQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQ7CisJaW50IGNudCwgaSwgajsKKworCXJlc3VsdCA9IG1lcmdlX2Jhc2VzKG9uZSwgdHdvKTsKKwlpZiAob25lID09IHR3bykKKwkJcmV0dXJuIHJlc3VsdDsKKwlpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LT5uZXh0KSB7CisJCWlmIChjbGVhbnVwKSB7CisJCQljbGVhcl9jb21taXRfbWFya3Mob25lLCBhbGxfZmxhZ3MpOworCQkJY2xlYXJfY29tbWl0X21hcmtzKHR3bywgYWxsX2ZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIFRoZXJlIGFyZSBtb3JlIHRoYW4gb25lICovCisJY250ID0gMDsKKwlsaXN0ID0gcmVzdWx0OworCXdoaWxlIChsaXN0KSB7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQljbnQrKzsKKwl9CisJcnNsdCA9IHhjYWxsb2MoY250LCBzaXplb2YoKnJzbHQpKTsKKwlmb3IgKGxpc3QgPSByZXN1bHQsIGkgPSAwOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJcnNsdFtpKytdID0gbGlzdC0+aXRlbTsKKwlmcmVlX2NvbW1pdF9saXN0KHJlc3VsdCk7CisKKwljbGVhcl9jb21taXRfbWFya3Mob25lLCBhbGxfZmxhZ3MpOworCWNsZWFyX2NvbW1pdF9tYXJrcyh0d28sIGFsbF9mbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGNudCAtIDE7IGkrKykgeworCQlmb3IgKGogPSBpKzE7IGogPCBjbnQ7IGorKykgeworCQkJaWYgKCFyc2x0W2ldIHx8ICFyc2x0W2pdKQorCQkJCWNvbnRpbnVlOworCQkJcmVzdWx0ID0gbWVyZ2VfYmFzZXMocnNsdFtpXSwgcnNsdFtqXSk7CisJCQljbGVhcl9jb21taXRfbWFya3MocnNsdFtpXSwgYWxsX2ZsYWdzKTsKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyhyc2x0W2pdLCBhbGxfZmxhZ3MpOworCQkJZm9yIChsaXN0ID0gcmVzdWx0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJCWlmIChyc2x0W2ldID09IGxpc3QtPml0ZW0pCisJCQkJCXJzbHRbaV0gPSBOVUxMOworCQkJCWlmIChyc2x0W2pdID09IGxpc3QtPml0ZW0pCisJCQkJCXJzbHRbal0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyogU3Vydml2aW5nIG9uZXMgaW4gcnNsdFtdIGFyZSB0aGUgaW5kZXBlbmRlbnQgcmVzdWx0cyAqLworCXJlc3VsdCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlmIChyc2x0W2ldKQorCQkJaW5zZXJ0X2J5X2RhdGUocnNsdFtpXSwgJnJlc3VsdCk7CisJfQorCWZyZWUocnNsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGluX21lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqKnJlZmVyZW5jZSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmJhc2VzLCAqYjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChudW0gPT0gMSkKKwkJYmFzZXMgPSBnZXRfbWVyZ2VfYmFzZXMoY29tbWl0LCAqcmVmZXJlbmNlLCAxKTsKKwllbHNlCisJCWRpZSgibm90IHlldCIpOworCWZvciAoYiA9IGJhc2VzOyBiOyBiID0gYi0+bmV4dCkgeworCQlpZiAoIWhhc2hjbXAoY29tbWl0LT5vYmplY3Quc2hhMSwgYi0+aXRlbS0+b2JqZWN0LnNoYTEpKSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlX2NvbW1pdF9saXN0KGJhc2VzKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29tbWl0LmggYi9jb21taXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU4ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbWl0LmgKQEAgLTAsMCArMSwxMjcgQEAKKyNpZm5kZWYgQ09NTUlUX0gKKyNkZWZpbmUgQ09NTUlUX0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJkZWNvcmF0ZS5oIgorCitzdHJ1Y3QgY29tbWl0X2xpc3QgeworCXN0cnVjdCBjb21taXQgKml0ZW07CisJc3RydWN0IGNvbW1pdF9saXN0ICpuZXh0OworfTsKKworc3RydWN0IGNvbW1pdCB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJdm9pZCAqdXRpbDsKKwl1bnNpZ25lZCBsb25nIGRhdGU7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCXN0cnVjdCB0cmVlICp0cmVlOworCWNoYXIgKmJ1ZmZlcjsKK307CisKK2V4dGVybiBpbnQgc2F2ZV9jb21taXRfYnVmZmVyOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbW1pdF90eXBlOworCisvKiBXaGlsZSB3ZSBjYW4gZGVjb3JhdGUgYW55IG9iamVjdCB3aXRoIGEgbmFtZSwgaXQncyBvbmx5IHVzZWQgZm9yIGNvbW1pdHMuLiAqLworZXh0ZXJuIHN0cnVjdCBkZWNvcmF0aW9uIG5hbWVfZGVjb3JhdGlvbjsKK3N0cnVjdCBuYW1lX2RlY29yYXRpb24geworCXN0cnVjdCBuYW1lX2RlY29yYXRpb24gKm5leHQ7CisJY2hhciBuYW1lWzFdOworfTsKKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCSAgICAgIGludCBxdWlldCk7CisKK2ludCBwYXJzZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICppdGVtKTsKKworc3RydWN0IGNvbW1pdF9saXN0ICogY29tbWl0X2xpc3RfaW5zZXJ0KHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3RfcCk7CitzdHJ1Y3QgY29tbWl0X2xpc3QgKiBpbnNlcnRfYnlfZGF0ZShzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KTsKKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCk7CisKK3ZvaWQgc29ydF9ieV9kYXRlKHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpOworCisvKiBDb21taXQgZm9ybWF0cyAqLworZW51bSBjbWl0X2ZtdCB7CisJQ01JVF9GTVRfUkFXLAorCUNNSVRfRk1UX01FRElVTSwKKwlDTUlUX0ZNVF9ERUZBVUxUID0gQ01JVF9GTVRfTUVESVVNLAorCUNNSVRfRk1UX1NIT1JULAorCUNNSVRfRk1UX0ZVTEwsCisJQ01JVF9GTVRfRlVMTEVSLAorCUNNSVRfRk1UX09ORUxJTkUsCisJQ01JVF9GTVRfRU1BSUwsCisJQ01JVF9GTVRfVVNFUkZPUk1BVCwKKworCUNNSVRfRk1UX1VOU1BFQ0lGSUVELAorfTsKKworZXh0ZXJuIGVudW0gY21pdF9mbXQgZ2V0X2NvbW1pdF9mb3JtYXQoY29uc3QgY2hhciAqYXJnKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHByZXR0eV9wcmludF9jb21taXQoZW51bSBjbWl0X2ZtdCBmbXQsIGNvbnN0IHN0cnVjdCBjb21taXQgKiwgdW5zaWduZWQgbG9uZyBsZW4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzcGFjZSwgaW50IGFiYnJldiwgY29uc3QgY2hhciAqc3ViamVjdCwgY29uc3QgY2hhciAqYWZ0ZXJfc3ViamVjdCwgZW51bSBkYXRlX21vZGUgZG1vZGUpOworCisvKiogUmVtb3ZlcyB0aGUgZmlyc3QgY29tbWl0IGZyb20gYSBsaXN0IHNvcnRlZCBieSBkYXRlLCBhbmQgYWRkcyBhbGwKKyAqIG9mIGl0cyBwYXJlbnRzLgorICoqLworc3RydWN0IGNvbW1pdCAqcG9wX21vc3RfcmVjZW50X2NvbW1pdChzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0LCAKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyayk7CisKK3N0cnVjdCBjb21taXQgKnBvcF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqc3RhY2spOworCit2b2lkIGNsZWFyX2NvbW1pdF9tYXJrcyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHVuc2lnbmVkIGludCBtYXJrKTsKKworaW50IGNvdW50X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqIGNvbW1pdCk7CisKKy8qCisgKiBQZXJmb3JtcyBhbiBpbi1wbGFjZSB0b3BvbG9naWNhbCBzb3J0IG9mIGxpc3Qgc3VwcGxpZWQuCisgKgorICogUHJlLWNvbmRpdGlvbnMgZm9yIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXI6CisgKiAgIGFsbCBjb21taXRzIGluIGlucHV0IGxpc3QgYW5kIGFsbCBwYXJlbnRzIG9mIHRob3NlCisgKiAgIGNvbW1pdHMgbXVzdCBoYXZlIG9iamVjdC51dGlsID09IE5VTEwKKyAqCisgKiBQcmUtY29uZGl0aW9ucyBmb3Igc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbjoKKyAqICAgYWxsIGNvbW1pdHMgaW4gaW5wdXQgbGlzdCBhbmQgYWxsIHBhcmVudHMgb2YgdGhvc2UKKyAqICAgY29tbWl0cyBtdXN0IGhhdmUgZ2V0dGVyKGNvbW1pdCkgPT0gTlVMTAorICoKKyAqIFBvc3QtY29uZGl0aW9uczoKKyAqICAgaW52YXJpYW50IG9mIHJlc3VsdGluZyBsaXN0IGlzOgorICogICAgICBhIHJlYWNoYWJsZSBmcm9tIGIgPT4gb3JkKGIpIDwgb3JkKGEpCisgKiAgIGluIGFkZGl0aW9uLCB3aGVuIGxpZm8gPT0gMCwgY29tbWl0cyBvbiBwYXJhbGxlbCB0cmFja3MgYXJlCisgKiAgIHNvcnRlZCBpbiB0aGUgZGF0ZXMgb3JkZXIuCisgKi8KKwordHlwZWRlZiB2b2lkICgqdG9wb19zb3J0X3NldF9mbl90KShzdHJ1Y3QgY29tbWl0Kiwgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQqICgqdG9wb19zb3J0X2dldF9mbl90KShzdHJ1Y3QgY29tbWl0Kik7CisKK3ZvaWQgdG9wb19zb3J0X2RlZmF1bHRfc2V0dGVyKHN0cnVjdCBjb21taXQgKmMsIHZvaWQgKmRhdGEpOwordm9pZCAqdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyKHN0cnVjdCBjb21taXQgKmMpOworCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKTsKK3ZvaWQgc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbihzdHJ1Y3QgY29tbWl0X2xpc3QgKiogbGlzdCwgaW50IGxpZm8sCisJCQkJICB0b3BvX3NvcnRfc2V0X2ZuX3Qgc2V0dGVyLAorCQkJCSAgdG9wb19zb3J0X2dldF9mbl90IGdldHRlcik7CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IG5yX3BhcmVudDsgLyogPCAwIGlmIHNoYWxsb3cgY29tbWl0ICovCisJdW5zaWduZWQgY2hhciBwYXJlbnRbRkxFWF9BUlJBWV1bMjBdOyAvKiBtb3JlICovCit9OworCitzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpyZWFkX2dyYWZ0X2xpbmUoY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCByZWdpc3Rlcl9jb21taXRfZ3JhZnQoc3RydWN0IGNvbW1pdF9ncmFmdCAqLCBpbnQpOworaW50IHJlYWRfZ3JhZnRfZmlsZShjb25zdCBjaGFyICpncmFmdF9maWxlKTsKKworZXh0ZXJuIHN0cnVjdCBjb21taXRfbGlzdCAqZ2V0X21lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKnJldjEsIHN0cnVjdCBjb21taXQgKnJldjIsIGludCBjbGVhbnVwKTsKKworZXh0ZXJuIGludCByZWdpc3Rlcl9zaGFsbG93KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3NoYWxsb3coY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IHdyaXRlX3NoYWxsb3dfY29tbWl0cyhpbnQgZmQsIGludCB1c2VfcGFja19wcm90b2NvbCk7CitleHRlcm4gaW50IGlzX3JlcG9zaXRvcnlfc2hhbGxvdyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgY29tbWl0X2xpc3QgKmdldF9zaGFsbG93X2NvbW1pdHMoc3RydWN0IG9iamVjdF9hcnJheSAqaGVhZHMsCisJCWludCBkZXB0aCwgaW50IHNoYWxsb3dfZmxhZywgaW50IG5vdF9zaGFsbG93X2ZsYWcpOworCitpbnQgaW5fbWVyZ2VfYmFzZXMoc3RydWN0IGNvbW1pdCAqLCBzdHJ1Y3QgY29tbWl0ICoqLCBpbnQpOworI2VuZGlmIC8qIENPTU1JVF9IICovCmRpZmYgLS1naXQgYS9jb21wYXQvaHN0cmVycm9yLmMgYi9jb21wYXQvaHN0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YzU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9oc3RyZXJyb3IuYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCitjb25zdCBjaGFyICpnaXRoc3RyZXJyb3IoaW50IGVycikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNDhdOworCXN3aXRjaCAoZXJyKQorCXsKKwljYXNlIEhPU1RfTk9UX0ZPVU5EOgorCQlyZXR1cm4gIkF1dGhvcml0YXRpdmUgYW5zd2VyOiBob3N0IG5vdCBmb3VuZCI7CisJY2FzZSBOT19EQVRBOgorCQlyZXR1cm4gIlZhbGlkIG5hbWUsIG5vIGRhdGEgcmVjb3JkIG9mIHJlcXVlc3RlZCB0eXBlIjsKKwljYXNlIE5PX1JFQ09WRVJZOgorCQlyZXR1cm4gIk5vbiByZWNvdmVyYWJsZSBlcnJvcnMsIEZPUk1FUlIsIFJFRlVTRUQsIE5PVElNUCI7CisJY2FzZSBUUllfQUdBSU46CisJCXJldHVybiAiTm9uLWF1dGhvcml0YXRpdmUgXCJob3N0IG5vdCBmb3VuZFwiLCBvciBTRVJWRVJGQUlMIjsKKwl9CisJc3ByaW50ZihidWZmZXIsICJOYW1lIHJlc29sdXRpb24gZXJyb3IgJWQiLCBlcnIpOworCXJldHVybiBidWZmZXI7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvaW5ldF9udG9wLmMgYi9jb21wYXQvaW5ldF9udG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3YWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9pbmV0X250b3AuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUworICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQorICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgTlNfSU5BRERSU1oKKyNkZWZpbmUgTlNfSU5BRERSU1oJNAorI2VuZGlmCisjaWZuZGVmIE5TX0lONkFERFJTWgorI2RlZmluZSBOU19JTjZBRERSU1oJMTYKKyNlbmRpZgorI2lmbmRlZiBOU19JTlQxNlNaCisjZGVmaW5lIE5TX0lOVDE2U1oJMgorI2VuZGlmCisKKy8qCisgKiBXQVJOSU5HOiBEb24ndCBldmVuIGNvbnNpZGVyIHRyeWluZyB0byBjb21waWxlIHRoaXMgb24gYSBzeXN0ZW0gd2hlcmUKKyAqIHNpemVvZihpbnQpIDwgNC4gIHNpemVvZihpbnQpID4gNCBpcyBmaW5lOyBhbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorICovCisKKy8qIGNvbnN0IGNoYXIgKgorICogaW5ldF9udG9wNChzcmMsIGRzdCwgc2l6ZSkKKyAqCWZvcm1hdCBhbiBJUHY0IGFkZHJlc3MKKyAqIHJldHVybjoKKyAqCWBkc3QnIChhcyBhIGNvbnN0KQorICogbm90ZXM6CisgKgkoMSkgdXNlcyBubyBzdGF0aWNzCisgKgkoMikgdGFrZXMgYSB1X2NoYXIqIG5vdCBhbiBpbl9hZGRyIGFzIGlucHV0CisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKQorCWNvbnN0IHVfY2hhciAqc3JjOworCWNoYXIgKmRzdDsKKwlzaXplX3Qgc2l6ZTsKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICIldS4ldS4ldS4ldSI7CisJY2hhciB0bXBbc2l6ZW9mICIyNTUuMjU1LjI1NS4yNTUiXTsKKwlpbnQgbnByaW50ZWQ7CisKKwlucHJpbnRlZCA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIGZtdCwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKTsKKwlpZiAobnByaW50ZWQgPCAwKQorCQlyZXR1cm4gKE5VTEwpOwkvKiB3ZSBhc3N1bWUgImVycm5vIiB3YXMgc2V0IGJ5ICJzbnByaW50ZigpIiAqLworCWlmICgoc2l6ZV90KW5wcmludGVkID4gc2l6ZSkgeworCQllcnJubyA9IEVOT1NQQzsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJc3RyY3B5KGRzdCwgdG1wKTsKKwlyZXR1cm4gKGRzdCk7Cit9CisKKyNpZm5kZWYgTk9fSVBWNgorLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorICoJY29udmVydCBJUHY2IGJpbmFyeSBhZGRyZXNzIGludG8gcHJlc2VudGF0aW9uIChwcmludGFibGUpIGZvcm1hdAorICogYXV0aG9yOgorICoJUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW5ldF9udG9wNihzcmMsIGRzdCwgc2l6ZSkKKwljb25zdCB1X2NoYXIgKnNyYzsKKwljaGFyICpkc3Q7CisJc2l6ZV90IHNpemU7Cit7CisJLyoKKwkgKiBOb3RlIHRoYXQgaW50MzJfdCBhbmQgaW50MTZfdCBuZWVkIG9ubHkgYmUgImF0IGxlYXN0IiBsYXJnZSBlbm91Z2gKKwkgKiB0byBjb250YWluIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzaXplLiAgT24gc29tZSBzeXN0ZW1zLCBsaWtlCisJICogQ3JheXMsIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYW4gaW50ZWdlciB2YXJpYWJsZSB3aXRoIDE2IGJpdHMuCisJICogS2VlcCB0aGlzIGluIG1pbmQgaWYgeW91IHRoaW5rIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiBjb2RlZAorCSAqIHRvIHVzZSBwb2ludGVyIG92ZXJsYXlzLiAgQWxsIHRoZSB3b3JsZCdzIG5vdCBhIFZBWC4KKwkgKi8KKwljaGFyIHRtcFtzaXplb2YgImZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOjI1NS4yNTUuMjU1LjI1NSJdLCAqdHA7CisJc3RydWN0IHsgaW50IGJhc2UsIGxlbjsgfSBiZXN0LCBjdXI7CisJdW5zaWduZWQgaW50IHdvcmRzW05TX0lONkFERFJTWiAvIE5TX0lOVDE2U1pdOworCWludCBpOworCisJLyoKKwkgKiBQcmVwcm9jZXNzOgorCSAqCUNvcHkgdGhlIGlucHV0IChieXRld2lzZSkgYXJyYXkgaW50byBhIHdvcmR3aXNlIGFycmF5LgorCSAqCUZpbmQgdGhlIGxvbmdlc3QgcnVuIG9mIDB4MDAncyBpbiBzcmNbXSBmb3IgOjogc2hvcnRoYW5kaW5nLgorCSAqLworCW1lbXNldCh3b3JkcywgJ1wwJywgc2l6ZW9mIHdvcmRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlNfSU42QUREUlNaOyBpKyspCisJCXdvcmRzW2kgLyAyXSB8PSAoc3JjW2ldIDw8ICgoMSAtIChpICUgMikpIDw8IDMpKTsKKwliZXN0LmJhc2UgPSAtMTsKKwljdXIuYmFzZSA9IC0xOworCWZvciAoaSA9IDA7IGkgPCAoTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWik7IGkrKykgeworCQlpZiAod29yZHNbaV0gPT0gMCkgeworCQkJaWYgKGN1ci5iYXNlID09IC0xKQorCQkJCWN1ci5iYXNlID0gaSwgY3VyLmxlbiA9IDE7CisJCQllbHNlCisJCQkJY3VyLmxlbisrOworCQl9IGVsc2UgeworCQkJaWYgKGN1ci5iYXNlICE9IC0xKSB7CisJCQkJaWYgKGJlc3QuYmFzZSA9PSAtMSB8fCBjdXIubGVuID4gYmVzdC5sZW4pCisJCQkJCWJlc3QgPSBjdXI7CisJCQkJY3VyLmJhc2UgPSAtMTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY3VyLmJhc2UgIT0gLTEpIHsKKwkJaWYgKGJlc3QuYmFzZSA9PSAtMSB8fCBjdXIubGVuID4gYmVzdC5sZW4pCisJCQliZXN0ID0gY3VyOworCX0KKwlpZiAoYmVzdC5iYXNlICE9IC0xICYmIGJlc3QubGVuIDwgMikKKwkJYmVzdC5iYXNlID0gLTE7CisKKwkvKgorCSAqIEZvcm1hdCB0aGUgcmVzdWx0LgorCSAqLworCXRwID0gdG1wOworCWZvciAoaSA9IDA7IGkgPCAoTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWik7IGkrKykgeworCQkvKiBBcmUgd2UgaW5zaWRlIHRoZSBiZXN0IHJ1biBvZiAweDAwJ3M/ICovCisJCWlmIChiZXN0LmJhc2UgIT0gLTEgJiYgaSA+PSBiZXN0LmJhc2UgJiYKKwkJICAgIGkgPCAoYmVzdC5iYXNlICsgYmVzdC5sZW4pKSB7CisJCQlpZiAoaSA9PSBiZXN0LmJhc2UpCisJCQkJKnRwKysgPSAnOic7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBBcmUgd2UgZm9sbG93aW5nIGFuIGluaXRpYWwgcnVuIG9mIDB4MDBzIG9yIGFueSByZWFsIGhleD8gKi8KKwkJaWYgKGkgIT0gMCkKKwkJCSp0cCsrID0gJzonOworCQkvKiBJcyB0aGlzIGFkZHJlc3MgYW4gZW5jYXBzdWxhdGVkIElQdjQ/ICovCisJCWlmIChpID09IDYgJiYgYmVzdC5iYXNlID09IDAgJiYKKwkJICAgIChiZXN0LmxlbiA9PSA2IHx8IChiZXN0LmxlbiA9PSA1ICYmIHdvcmRzWzVdID09IDB4ZmZmZikpKSB7CisJCQlpZiAoIWluZXRfbnRvcDQoc3JjKzEyLCB0cCwgc2l6ZW9mIHRtcCAtICh0cCAtIHRtcCkpKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQl0cCArPSBzdHJsZW4odHApOworCQkJYnJlYWs7CisJCX0KKwkJdHAgKz0gc25wcmludGYodHAsIHNpemVvZiB0bXAgLSAodHAgLSB0bXApLCAiJXgiLCB3b3Jkc1tpXSk7CisJfQorCS8qIFdhcyBpdCBhIHRyYWlsaW5nIHJ1biBvZiAweDAwJ3M/ICovCisJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiAoYmVzdC5iYXNlICsgYmVzdC5sZW4pID09CisJICAgIChOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaKSkKKwkJKnRwKysgPSAnOic7CisJKnRwKysgPSAnXDAnOworCisJLyoKKwkgKiBDaGVjayBmb3Igb3ZlcmZsb3csIGNvcHksIGFuZCB3ZSdyZSBkb25lLgorCSAqLworCWlmICgoc2l6ZV90KSh0cCAtIHRtcCkgPiBzaXplKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzdHJjcHkoZHN0LCB0bXApOworCXJldHVybiAoZHN0KTsKK30KKyNlbmRpZgorCisvKiBjaGFyICoKKyAqIGluZXRfbnRvcChhZiwgc3JjLCBkc3QsIHNpemUpCisgKgljb252ZXJ0IGEgbmV0d29yayBmb3JtYXQgYWRkcmVzcyB0byBwcmVzZW50YXRpb24gZm9ybWF0LgorICogcmV0dXJuOgorICoJcG9pbnRlciB0byBwcmVzZW50YXRpb24gZm9ybWF0IGFkZHJlc3MgKGBkc3QnKSwgb3IgTlVMTCAoc2VlIGVycm5vKS4KKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK2NvbnN0IGNoYXIgKgoraW5ldF9udG9wKGFmLCBzcmMsIGRzdCwgc2l6ZSkKKwlpbnQgYWY7CisJY29uc3Qgdm9pZCAqc3JjOworCWNoYXIgKmRzdDsKKwlzaXplX3Qgc2l6ZTsKK3sKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gKGluZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpKTsKKyNpZm5kZWYgTk9fSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiAoaW5ldF9udG9wNihzcmMsIGRzdCwgc2l6ZSkpOworI2VuZGlmCisJZGVmYXVsdDoKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiAoTlVMTCk7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9pbmV0X3B0b24uYyBiL2NvbXBhdC9pbmV0X3B0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA0ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2luZXRfcHRvbi5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgIEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNCisgKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorICogSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCisgKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCisgKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgTlNfSU5UMTZTWgorI2RlZmluZSBOU19JTlQxNlNaICAgICAgIDIKKyNlbmRpZgorCisjaWZuZGVmIE5TX0lOQUREUlNaCisjZGVmaW5lIE5TX0lOQUREUlNaICAgICAgNAorI2VuZGlmCisKKyNpZm5kZWYgTlNfSU42QUREUlNaCisjZGVmaW5lIE5TX0lONkFERFJTWiAgICAxNgorI2VuZGlmCisKKy8qCisgKiBXQVJOSU5HOiBEb24ndCBldmVuIGNvbnNpZGVyIHRyeWluZyB0byBjb21waWxlIHRoaXMgb24gYSBzeXN0ZW0gd2hlcmUKKyAqIHNpemVvZihpbnQpIDwgNC4gIHNpemVvZihpbnQpID4gNCBpcyBmaW5lOyBhbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorICovCisKK3N0YXRpYyBpbnQgaW5ldF9wdG9uNChjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCk7CitzdGF0aWMgaW50IGluZXRfcHRvbjYoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpOworCisvKiBpbnQKKyAqIGluZXRfcHRvbjQoc3JjLCBkc3QpCisgKiAgICAgIGxpa2UgaW5ldF9hdG9uKCkgYnV0IHdpdGhvdXQgYWxsIHRoZSBoZXhhZGVjaW1hbCBhbmQgc2hvcnRoYW5kLgorICogcmV0dXJuOgorICogICAgICAxIGlmIGBzcmMnIGlzIGEgdmFsaWQgZG90dGVkIHF1YWQsIGVsc2UgMC4KKyAqIG5vdGljZToKKyAqICAgICAgZG9lcyBub3QgdG91Y2ggYGRzdCcgdW5sZXNzIGl0J3MgcmV0dXJuaW5nIDEuCisgKiBhdXRob3I6CisgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCisgKi8KK3N0YXRpYyBpbnQKK2luZXRfcHRvbjQoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpCit7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRpZ2l0c1tdID0gIjAxMjM0NTY3ODkiOworICAgICAgICBpbnQgc2F3X2RpZ2l0LCBvY3RldHMsIGNoOworICAgICAgICB1bnNpZ25lZCBjaGFyIHRtcFtOU19JTkFERFJTWl0sICp0cDsKKworICAgICAgICBzYXdfZGlnaXQgPSAwOworICAgICAgICBvY3RldHMgPSAwOworICAgICAgICAqKHRwID0gdG1wKSA9IDA7CisgICAgICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwY2g7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBjaCA9IHN0cmNocihkaWdpdHMsIGNoKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ldyA9ICp0cCAqIDEwICsgKHBjaCAtIGRpZ2l0cyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgPiAyNTUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqdHAgPSBuZXc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBzYXdfZGlnaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrb2N0ZXRzID4gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXdfZGlnaXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy4nICYmIHNhd19kaWdpdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9jdGV0cyA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgKisrdHAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2F3X2RpZ2l0ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9jdGV0cyA8IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgbWVtY3B5KGRzdCwgdG1wLCBOU19JTkFERFJTWik7CisgICAgICAgIHJldHVybiAoMSk7Cit9CisKKy8qIGludAorICogaW5ldF9wdG9uNihzcmMsIGRzdCkKKyAqICAgICAgY29udmVydCBwcmVzZW50YXRpb24gbGV2ZWwgYWRkcmVzcyB0byBuZXR3b3JrIG9yZGVyIGJpbmFyeSBmb3JtLgorICogcmV0dXJuOgorICogICAgICAxIGlmIGBzcmMnIGlzIGEgdmFsaWQgW1JGQzE4ODQgMi4yXSBhZGRyZXNzLCBlbHNlIDAuCisgKiBub3RpY2U6CisgKiAgICAgICgxKSBkb2VzIG5vdCB0b3VjaCBgZHN0JyB1bmxlc3MgaXQncyByZXR1cm5pbmcgMS4KKyAqICAgICAgKDIpIDo6IGluIGEgZnVsbCBhZGRyZXNzIGlzIHNpbGVudGx5IGlnbm9yZWQuCisgKiBjcmVkaXQ6CisgKiAgICAgIGluc3BpcmVkIGJ5IE1hcmsgQW5kcmV3cy4KKyAqIGF1dGhvcjoKKyAqICAgICAgUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworCisjaWZuZGVmIE5PX0lQVjYKK3N0YXRpYyBpbnQKK2luZXRfcHRvbjYoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpCit7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHhkaWdpdHNfbFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4ZGlnaXRzX3VbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0bXBbTlNfSU42QUREUlNaXSwgKnRwLCAqZW5kcCwgKmNvbG9ucDsKKyAgICAgICAgY29uc3QgY2hhciAqeGRpZ2l0cywgKmN1cnRvazsKKyAgICAgICAgaW50IGNoLCBzYXdfeGRpZ2l0OworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworCisgICAgICAgIG1lbXNldCgodHAgPSB0bXApLCAnXDAnLCBOU19JTjZBRERSU1opOworICAgICAgICBlbmRwID0gdHAgKyBOU19JTjZBRERSU1o7CisgICAgICAgIGNvbG9ucCA9IE5VTEw7CisgICAgICAgIC8qIExlYWRpbmcgOjogcmVxdWlyZXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nLiAqLworICAgICAgICBpZiAoKnNyYyA9PSAnOicpCisgICAgICAgICAgICAgICAgaWYgKCorK3NyYyAhPSAnOicpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBjdXJ0b2sgPSBzcmM7CisgICAgICAgIHNhd194ZGlnaXQgPSAwOworICAgICAgICB2YWwgPSAwOworICAgICAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGNoOworCisgICAgICAgICAgICAgICAgaWYgKChwY2ggPSBzdHJjaHIoKHhkaWdpdHMgPSB4ZGlnaXRzX2wpLCBjaCkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2ggPSBzdHJjaHIoKHhkaWdpdHMgPSB4ZGlnaXRzX3UpLCBjaCk7CisgICAgICAgICAgICAgICAgaWYgKHBjaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPDw9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgfD0gKHBjaCAtIHhkaWdpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhd194ZGlnaXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnRvayA9IHNyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2F3X3hkaWdpdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb25wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ucCA9IHRwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cCArIE5TX0lOVDE2U1ogPiBlbmRwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAqdHArKyA9ICh1bnNpZ25lZCBjaGFyKSB2YWwgJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgc2F3X3hkaWdpdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLicgJiYgKCh0cCArIE5TX0lOQUREUlNaKSA8PSBlbmRwKSAmJgorICAgICAgICAgICAgICAgICAgICBpbmV0X3B0b240KGN1cnRvaywgdHApID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHAgKz0gTlNfSU5BRERSU1o7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXdfeGRpZ2l0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLyogJ1wwJyB3YXMgc2VlbiBieSBpbmV0X3B0b240KCkuICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhd194ZGlnaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHAgKyBOU19JTlQxNlNaID4gZW5kcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgdmFsICYgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29sb25wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNpbmNlIHNvbWUgbWVtbW92ZSgpJ3MgZXJyb25lb3VzbHkgZmFpbCB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgKiBvdmVybGFwcGluZyByZWdpb25zLCB3ZSdsbCBkbyB0aGUgc2hpZnQgYnkgaGFuZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbiA9IHRwIC0gY29sb25wOworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBbLSBpXSA9IGNvbG9ucFtuIC0gaV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvbnBbbiAtIGldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHAgPSBlbmRwOworICAgICAgICB9CisgICAgICAgIGlmICh0cCAhPSBlbmRwKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIG1lbWNweShkc3QsIHRtcCwgTlNfSU42QUREUlNaKTsKKyAgICAgICAgcmV0dXJuICgxKTsKK30KKyNlbmRpZgorCisvKiBpbnQKKyAqIGlzY19uZXRfcHRvbihhZiwgc3JjLCBkc3QpCisgKiAgICAgIGNvbnZlcnQgZnJvbSBwcmVzZW50YXRpb24gZm9ybWF0ICh3aGljaCB1c3VhbGx5IG1lYW5zIEFTQ0lJIHByaW50YWJsZSkKKyAqICAgICAgdG8gbmV0d29yayBmb3JtYXQgKHdoaWNoIGlzIHVzdWFsbHkgc29tZSBraW5kIG9mIGJpbmFyeSBmb3JtYXQpLgorICogcmV0dXJuOgorICogICAgICAxIGlmIHRoZSBhZGRyZXNzIHdhcyB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGZhbWlseQorICogICAgICAwIGlmIHRoZSBhZGRyZXNzIHdhc24ndCB2YWxpZCAoYGRzdCcgaXMgdW50b3VjaGVkIGluIHRoaXMgY2FzZSkKKyAqICAgICAgLTEgaWYgc29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCAoYGRzdCcgaXMgdW50b3VjaGVkIGluIHRoaXMgY2FzZSwgdG9vKQorICogYXV0aG9yOgorICogICAgICBQYXVsIFZpeGllLCAxOTk2LgorICovCitpbnQKK2luZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqZHN0KQoreworICAgICAgICBzd2l0Y2ggKGFmKSB7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKGluZXRfcHRvbjQoc3JjLCBkc3QpKTsKKyNpZm5kZWYgTk9fSVBWNgorICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgICAgIHJldHVybiAoaW5ldF9wdG9uNihzcmMsIGRzdCkpOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICAgICAgLyogTk9UUkVBQ0hFRCAqLworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L21tYXAuYyBiL2NvbXBhdC9tbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmYWVlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9tbWFwLmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCit2b2lkICpnaXRfbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisJc2l6ZV90IG4gPSAwOworCisJaWYgKHN0YXJ0ICE9IE5VTEwgfHwgIShmbGFncyAmIE1BUF9QUklWQVRFKSkKKwkJZGllKCJJbnZhbGlkIHVzYWdlIG9mIG1tYXAgd2hlbiBidWlsdCB3aXRoIE5PX01NQVAiKTsKKworCXN0YXJ0ID0geG1hbGxvYyhsZW5ndGgpOworCWlmIChzdGFydCA9PSBOVUxMKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlyZXR1cm4gTUFQX0ZBSUxFRDsKKwl9CisKKwl3aGlsZSAobiA8IGxlbmd0aCkgeworCQlzc2l6ZV90IGNvdW50ID0gcHJlYWQoZmQsIChjaGFyICopc3RhcnQgKyBuLCBsZW5ndGggLSBuLCBvZmZzZXQgKyBuKTsKKworCQlpZiAoY291bnQgPT0gMCkgeworCQkJbWVtc2V0KChjaGFyICopc3RhcnQrbiwgMCwgbGVuZ3RoLW4pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY291bnQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZnJlZShzdGFydCk7CisJCQllcnJubyA9IEVBQ0NFUzsKKwkJCXJldHVybiBNQVBfRkFJTEVEOworCQl9CisKKwkJbiArPSBjb3VudDsKKwl9CisKKwlyZXR1cm4gc3RhcnQ7Cit9CisKK2ludCBnaXRfbXVubWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKQoreworCWZyZWUoc3RhcnQpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9jb21wYXQvcHJlYWQuYyBiL2NvbXBhdC9wcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGNhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvcHJlYWQuYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK3NzaXplX3QgZ2l0X3ByZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkKK3sKKyAgICAgICAgb2ZmX3QgY3VycmVudF9vZmZzZXQ7CisgICAgICAgIHNzaXplX3QgcmM7CisKKyAgICAgICAgY3VycmVudF9vZmZzZXQgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOworCisgICAgICAgIGlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByYyA9IHJlYWRfaW5fZnVsbChmZCwgYnVmLCBjb3VudCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnRfb2Zmc2V0ICE9IGxzZWVrKGZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3NldGVudi5jIGIvY29tcGF0L3NldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjJlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc2V0ZW52LmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCitpbnQgZ2l0c2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgcmVwbGFjZSkKK3sKKwlpbnQgb3V0OworCXNpemVfdCBuYW1lbGVuLCB2YWx1ZWxlbjsKKwljaGFyICplbnZzdHI7CisKKwlpZiAoIW5hbWUgfHwgIXZhbHVlKSByZXR1cm4gLTE7CisJaWYgKCFyZXBsYWNlKSB7CisJCWNoYXIgKm9sZHZhbCA9IE5VTEw7CisJCW9sZHZhbCA9IGdldGVudihuYW1lKTsKKwkJaWYgKG9sZHZhbCkgcmV0dXJuIDA7CisJfQorCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwl2YWx1ZWxlbiA9IHN0cmxlbih2YWx1ZSk7CisJZW52c3RyID0gbWFsbG9jKChuYW1lbGVuICsgdmFsdWVsZW4gKyAyKSk7CisJaWYgKCFlbnZzdHIpIHJldHVybiAtMTsKKworCW1lbWNweShlbnZzdHIsIG5hbWUsIG5hbWVsZW4pOworCWVudnN0cltuYW1lbGVuXSA9ICc9JzsKKwltZW1jcHkoZW52c3RyICsgbmFtZWxlbiArIDEsIHZhbHVlLCB2YWx1ZWxlbik7CisJZW52c3RyW25hbWVsZW4gKyB2YWx1ZWxlbiArIDFdID0gMDsKKworCW91dCA9IHB1dGVudihlbnZzdHIpOworCS8qIHB1dGVudigzKSBtYWtlcyB0aGUgYXJndW1lbnQgc3RyaW5nIHBhcnQgb2YgdGhlIGVudmlyb25tZW50LAorCSAqIGFuZCBjaGFuZ2luZyB0aGF0IHN0cmluZyBtb2RpZmllcyB0aGUgZW52aXJvbm1lbnQgLS0tIHdoaWNoCisJICogbWVhbnMgd2UgZG8gbm90IG93biB0aGF0IHN0b3JhZ2UgYW55bW9yZS4gIERvIG5vdCBmcmVlCisJICogZW52c3RyLgorCSAqLworCisJcmV0dXJuIG91dDsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9zdHJjYXNlc3RyLmMgYi9jb21wYXQvc3RyY2FzZXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODk2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RyY2FzZXN0ci5jCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworY2hhciAqZ2l0c3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQoreworCWludCBubGVuID0gc3RybGVuKG5lZWRsZSk7CisJaW50IGhsZW4gPSBzdHJsZW4oaGF5c3RhY2spIC0gbmxlbiArIDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGxlbjsgaSsrKSB7CisJCWludCBqOworCQlmb3IgKGogPSAwOyBqIDwgbmxlbjsgaisrKSB7CisJCQl1bnNpZ25lZCBjaGFyIGMxID0gaGF5c3RhY2tbaStqXTsKKwkJCXVuc2lnbmVkIGNoYXIgYzIgPSBuZWVkbGVbal07CisJCQlpZiAodG91cHBlcihjMSkgIT0gdG91cHBlcihjMikpCisJCQkJZ290byBuZXh0OworCQl9CisJCXJldHVybiAoY2hhciAqKSBoYXlzdGFjayArIGk7CisJbmV4dDoKKwkJOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9zdHJsY3B5LmMgYi9jb21wYXQvc3RybGNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RybGNweS5jCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworc2l6ZV90IGdpdHN0cmxjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgcmV0ID0gc3RybGVuKHNyYyk7CisKKwlpZiAoc2l6ZSkgeworCQlzaXplX3QgbGVuID0gKHJldCA+PSBzaXplKSA/IHNpemUgLSAxIDogcmV0OworCQltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworCQlkZXN0W2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3N0cnRvdW1heC5jIGIvY29tcGF0L3N0cnRvdW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDEzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RydG91bWF4LmMKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCit1aW50bWF4X3QgZ2l0c3RydG91bWF4IChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKK3sKKyNpZiBkZWZpbmVkKE5PX1NUUlRPVUxMKQorCXJldHVybiBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisjZWxzZQorCXJldHVybiBzdHJ0b3VsbChucHRyLCBlbmRwdHIsIGJhc2UpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb21wYXQvdW5zZXRlbnYuYyBiL2NvbXBhdC91bnNldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjlmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvdW5zZXRlbnYuYwpAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK3ZvaWQgZ2l0dW5zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgICAgaW50IHNyYywgZHN0OworICAgICBzaXplX3Qgbm1sbjsKKworICAgICBubWxuID0gc3RybGVuKG5hbWUpOworCisgICAgIGZvciAoc3JjID0gZHN0ID0gMDsgZW52aXJvbltzcmNdOyArK3NyYykgeworCSAgc2l6ZV90IGVubG47CisJICBlbmxuID0gc3RybGVuKGVudmlyb25bc3JjXSk7CisJICBpZiAoZW5sbiA+IG5tbG4pIHsKKyAgICAgICAgICAgICAgIC8qIG1pZ2h0IG1hdGNoLCBhbmQgY2FuIHRlc3QgZm9yICc9JyBzYWZlbHkgKi8KKwkgICAgICAgaWYgKDAgPT0gc3RybmNtcCAoZW52aXJvbltzcmNdLCBuYW1lLCBubWxuKQorCQkgICAmJiAnPScgPT0gZW52aXJvbltzcmNdW25tbG5dKQorCQkgICAgLyogbWF0Y2hlcywgc28gc2tpcCAqLworCQkgICAgY29udGludWU7CisJICB9CisJICBlbnZpcm9uW2RzdF0gPSBlbnZpcm9uW3NyY107CisJICArK2RzdDsKKyAgICAgfQorICAgICBlbnZpcm9uW2RzdF0gPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29uZmlnLmMgYi9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY1NWZkCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmMKQEAgLTAsMCArMSw5ODEgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEpvaGFubmVzIFNjaGluZGVsaW4sIDIwMDUKKyAqCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIE1BWE5BTUUgKDI1NikKKworc3RhdGljIEZJTEUgKmNvbmZpZ19maWxlOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlX25hbWU7CitzdGF0aWMgaW50IGNvbmZpZ19saW5lbnI7CitzdGF0aWMgaW50IGdldF9uZXh0X2NoYXIodm9pZCkKK3sKKwlpbnQgYzsKKwlGSUxFICpmOworCisJYyA9ICdcbic7CisJaWYgKChmID0gY29uZmlnX2ZpbGUpICE9IE5VTEwpIHsKKwkJYyA9IGZnZXRjKGYpOworCQlpZiAoYyA9PSAnXHInKSB7CisJCQkvKiBET1MgbGlrZSBzeXN0ZW1zICovCisJCQljID0gZmdldGMoZik7CisJCQlpZiAoYyAhPSAnXG4nKSB7CisJCQkJdW5nZXRjKGMsIGYpOworCQkJCWMgPSAnXHInOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpCisJCQljb25maWdfbGluZW5yKys7CisJCWlmIChjID09IEVPRikgeworCQkJY29uZmlnX2ZpbGUgPSBOVUxMOworCQkJYyA9ICdcbic7CisJCX0KKwl9CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBjaGFyICpwYXJzZV92YWx1ZSh2b2lkKQoreworCXN0YXRpYyBjaGFyIHZhbHVlWzEwMjRdOworCWludCBxdW90ZSA9IDAsIGNvbW1lbnQgPSAwLCBsZW4gPSAwLCBzcGFjZSA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWludCBjID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAobGVuID49IHNpemVvZih2YWx1ZSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGMgPT0gJ1xuJykgeworCQkJaWYgKHF1b3RlKQorCQkJCXJldHVybiBOVUxMOworCQkJdmFsdWVbbGVuXSA9IDA7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwkJaWYgKGNvbW1lbnQpCisJCQljb250aW51ZTsKKwkJaWYgKGlzc3BhY2UoYykgJiYgIXF1b3RlKSB7CisJCQlzcGFjZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXF1b3RlKSB7CisJCQlpZiAoYyA9PSAnOycgfHwgYyA9PSAnIycpIHsKKwkJCQljb21tZW50ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoc3BhY2UpIHsKKwkJCWlmIChsZW4pCisJCQkJdmFsdWVbbGVuKytdID0gJyAnOworCQkJc3BhY2UgPSAwOworCQl9CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ1xuJzoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJ3QnOgorCQkJCWMgPSAnXHQnOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6CisJCQkJYyA9ICdcYic7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQljID0gJ1xuJzsKKwkJCQlicmVhazsKKwkJCS8qIFNvbWUgY2hhcmFjdGVycyBlc2NhcGUgYXMgdGhlbXNlbHZlcyAqLworCQkJY2FzZSAnXFwnOiBjYXNlICciJzoKKwkJCQlicmVhazsKKwkJCS8qIFJlamVjdCB1bmtub3duIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQl2YWx1ZVtsZW4rK10gPSBjOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJyInKSB7CisJCQlxdW90ZSA9IDEtcXVvdGU7CisJCQljb250aW51ZTsKKwkJfQorCQl2YWx1ZVtsZW4rK10gPSBjOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaXNrZXljaGFyKGludCBjKQoreworCXJldHVybiBpc2FsbnVtKGMpIHx8IGMgPT0gJy0nOworfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25maWdfZm5fdCBmbiwgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgYzsKKwljaGFyICp2YWx1ZTsKKworCS8qIEdldCB0aGUgZnVsbCBuYW1lICovCisJZm9yICg7OykgeworCQljID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKCFpc2tleWNoYXIoYykpCisJCQlicmVhazsKKwkJbmFtZVtsZW4rK10gPSB0b2xvd2VyKGMpOworCQlpZiAobGVuID49IE1BWE5BTUUpCisJCQlyZXR1cm4gLTE7CisJfQorCW5hbWVbbGVuXSA9IDA7CisJd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKworCXZhbHVlID0gTlVMTDsKKwlpZiAoYyAhPSAnXG4nKSB7CisJCWlmIChjICE9ICc9JykKKwkJCXJldHVybiAtMTsKKwkJdmFsdWUgPSBwYXJzZV92YWx1ZSgpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gZm4obmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdldF9leHRlbmRlZF9iYXNlX3ZhcihjaGFyICpuYW1lLCBpbnQgYmFzZWxlbiwgaW50IGMpCit7CisJZG8geworCQlpZiAoYyA9PSAnXG4nKQorCQkJcmV0dXJuIC0xOworCQljID0gZ2V0X25leHRfY2hhcigpOworCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCisJLyogV2UgcmVxdWlyZSB0aGUgZm9ybWF0IHRvIGJlICdbYmFzZSAiZXh0ZW5zaW9uIl0nICovCisJaWYgKGMgIT0gJyInKQorCQlyZXR1cm4gLTE7CisJbmFtZVtiYXNlbGVuKytdID0gJy4nOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJyInKQorCQkJYnJlYWs7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQluYW1lW2Jhc2VsZW4rK10gPSBjOworCQlpZiAoYmFzZWxlbiA+IE1BWE5BTUUgLyAyKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIEZpbmFsICddJyAqLworCWlmIChnZXRfbmV4dF9jaGFyKCkgIT0gJ10nKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGJhc2VsZW47Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jhc2VfdmFyKGNoYXIgKm5hbWUpCit7CisJaW50IGJhc2VsZW4gPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYyA9PSAnXScpCisJCQlyZXR1cm4gYmFzZWxlbjsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQlyZXR1cm4gZ2V0X2V4dGVuZGVkX2Jhc2VfdmFyKG5hbWUsIGJhc2VsZW4sIGMpOworCQlpZiAoIWlza2V5Y2hhcihjKSAmJiBjICE9ICcuJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGJhc2VsZW4gPiBNQVhOQU1FIC8gMikKKwkJCXJldHVybiAtMTsKKwkJbmFtZVtiYXNlbGVuKytdID0gdG9sb3dlcihjKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3BhcnNlX2ZpbGUoY29uZmlnX2ZuX3QgZm4pCit7CisJaW50IGNvbW1lbnQgPSAwOworCWludCBiYXNlbGVuID0gMDsKKwlzdGF0aWMgY2hhciB2YXJbTUFYTkFNRV07CisKKwlmb3IgKDs7KSB7CisJCWludCBjID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkvKiBFT0Y/ICovCisJCQlpZiAoIWNvbmZpZ19maWxlKQorCQkJCXJldHVybiAwOworCQkJY29tbWVudCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29tbWVudCB8fCBpc3NwYWNlKGMpKQorCQkJY29udGludWU7CisJCWlmIChjID09ICcjJyB8fCBjID09ICc7JykgeworCQkJY29tbWVudCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnWycpIHsKKwkJCWJhc2VsZW4gPSBnZXRfYmFzZV92YXIodmFyKTsKKwkJCWlmIChiYXNlbGVuIDw9IDApCisJCQkJYnJlYWs7CisJCQl2YXJbYmFzZWxlbisrXSA9ICcuJzsKKwkJCXZhcltiYXNlbGVuXSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWlzYWxwaGEoYykpCisJCQlicmVhazsKKwkJdmFyW2Jhc2VsZW5dID0gdG9sb3dlcihjKTsKKwkJaWYgKGdldF92YWx1ZShmbiwgdmFyLCBiYXNlbGVuKzEpIDwgMCkKKwkJCWJyZWFrOworCX0KKwlkaWUoImJhZCBjb25maWcgZmlsZSBsaW5lICVkIGluICVzIiwgY29uZmlnX2xpbmVuciwgY29uZmlnX2ZpbGVfbmFtZSk7Cit9CisKK2ludCBnaXRfY29uZmlnX2ludChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCWNoYXIgKmVuZDsKKwkJaW50IHZhbCA9IHN0cnRvbCh2YWx1ZSwgJmVuZCwgMCk7CisJCWlmICghKmVuZCkKKwkJCXJldHVybiB2YWw7CisJCWlmICghc3RyY2FzZWNtcChlbmQsICJrIikpCisJCQlyZXR1cm4gdmFsICogMTAyNDsKKwkJaWYgKCFzdHJjYXNlY21wKGVuZCwgIm0iKSkKKwkJCXJldHVybiB2YWwgKiAxMDI0ICogMTAyNDsKKwkJaWYgKCFzdHJjYXNlY21wKGVuZCwgImciKSkKKwkJCXJldHVybiB2YWwgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CisJfQorCWRpZSgiYmFkIGNvbmZpZyB2YWx1ZSBmb3IgJyVzJyBpbiAlcyIsIG5hbWUsIGNvbmZpZ19maWxlX25hbWUpOworfQorCitpbnQgZ2l0X2NvbmZpZ19ib29sKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghdmFsdWUpCisJCXJldHVybiAxOworCWlmICghKnZhbHVlKQorCQlyZXR1cm4gMDsKKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ5ZXMiKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiZmFsc2UiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIm5vIikpCisJCXJldHVybiAwOworCXJldHVybiBnaXRfY29uZmlnX2ludChuYW1lLCB2YWx1ZSkgIT0gMDsKK30KKworaW50IGdpdF9kZWZhdWx0X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCS8qIFRoaXMgbmVlZHMgYSBiZXR0ZXIgbmFtZSAqLworCWlmICghc3RyY21wKHZhciwgImNvcmUuZmlsZW1vZGUiKSkgeworCQl0cnVzdF9leGVjdXRhYmxlX2JpdCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5zeW1saW5rcyIpKSB7CisJCWhhc19zeW1saW5rcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5iYXJlIikpIHsKKwkJaXNfYmFyZV9yZXBvc2l0b3J5X2NmZyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5pZ25vcmVzdGF0IikpIHsKKwkJYXNzdW1lX3VuY2hhbmdlZCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5wcmVmZXJzeW1saW5rcmVmcyIpKSB7CisJCXByZWZlcl9zeW1saW5rX3JlZnMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUubG9nYWxscmVmdXBkYXRlcyIpKSB7CisJCWxvZ19hbGxfcmVmX3VwZGF0ZXMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUud2FybmFtYmlndW91c3JlZnMiKSkgeworCQl3YXJuX2FtYmlndW91c19yZWZzID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmxlZ2FjeWhlYWRlcnMiKSkgeworCQl1c2VfbGVnYWN5X2hlYWRlcnMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUuY29tcHJlc3Npb24iKSkgeworCQlpbnQgbGV2ZWwgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJaWYgKGxldmVsID09IC0xKQorCQkJbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CisJCWVsc2UgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IFpfQkVTVF9DT01QUkVTU0lPTikKKwkJCWRpZSgiYmFkIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgJWQiLCBsZXZlbCk7CisJCXpsaWJfY29tcHJlc3Npb25fbGV2ZWwgPSBsZXZlbDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5wYWNrZWRnaXR3aW5kb3dzaXplIikpIHsKKwkJaW50IHBnc3pfeDIgPSBnZXRwYWdlc2l6ZSgpICogMjsKKwkJcGFja2VkX2dpdF93aW5kb3dfc2l6ZSA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCisJCS8qIFRoaXMgdmFsdWUgbXVzdCBiZSBtdWx0aXBsZSBvZiAocGFnZXNpemUgKiAyKSAqLworCQlwYWNrZWRfZ2l0X3dpbmRvd19zaXplIC89IHBnc3pfeDI7CisJCWlmIChwYWNrZWRfZ2l0X3dpbmRvd19zaXplIDwgMSkKKwkJCXBhY2tlZF9naXRfd2luZG93X3NpemUgPSAxOworCQlwYWNrZWRfZ2l0X3dpbmRvd19zaXplICo9IHBnc3pfeDI7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUucGFja2VkZ2l0bGltaXQiKSkgeworCQlwYWNrZWRfZ2l0X2xpbWl0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUuZGVsdGFiYXNlY2FjaGVsaW1pdCIpKSB7CisJCWRlbHRhX2Jhc2VfY2FjaGVfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5hdXRvY3JsZiIpKSB7CisJCWlmICh2YWx1ZSAmJiAhc3RyY2FzZWNtcCh2YWx1ZSwgImlucHV0IikpIHsKKwkJCWF1dG9fY3JsZiA9IC0xOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYXV0b19jcmxmID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLm5hbWUiKSkgeworCQlzdHJsY3B5KGdpdF9kZWZhdWx0X25hbWUsIHZhbHVlLCBzaXplb2YoZ2l0X2RlZmF1bHRfbmFtZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLmVtYWlsIikpIHsKKwkJc3RybGNweShnaXRfZGVmYXVsdF9lbWFpbCwgdmFsdWUsIHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJpMThuLmNvbW1pdGVuY29kaW5nIikpIHsKKwkJZ2l0X2NvbW1pdF9lbmNvZGluZyA9IHhzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJpMThuLmxvZ291dHB1dGVuY29kaW5nIikpIHsKKwkJZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcgPSB4c3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlpZiAoIXN0cmNtcCh2YXIsICJwYWdlci5jb2xvciIpIHx8ICFzdHJjbXAodmFyLCAiY29sb3IucGFnZXIiKSkgeworCQlwYWdlcl91c2VfY29sb3IgPSBnaXRfY29uZmlnX2Jvb2wodmFyLHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQWRkIG90aGVyIGNvbmZpZyB2YXJpYWJsZXMgaGVyZSBhbmQgdG8gRG9jdW1lbnRhdGlvbi9jb25maWcudHh0LiAqLworCXJldHVybiAwOworfQorCitpbnQgZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJcmV0ID0gLTE7CisJaWYgKGYpIHsKKwkJY29uZmlnX2ZpbGUgPSBmOworCQljb25maWdfZmlsZV9uYW1lID0gZmlsZW5hbWU7CisJCWNvbmZpZ19saW5lbnIgPSAxOworCQlyZXQgPSBnaXRfcGFyc2VfZmlsZShmbik7CisJCWZjbG9zZShmKTsKKwkJY29uZmlnX2ZpbGVfbmFtZSA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnKGNvbmZpZ19mbl90IGZuKQoreworCWludCByZXQgPSAwOworCWNoYXIgKnJlcG9fY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyICpob21lID0gTlVMTCwgKmZpbGVuYW1lOworCisJLyogJEdJVF9DT05GSUcgbWFrZXMgZ2l0IHJlYWQgX29ubHlfIHRoZSBnaXZlbiBjb25maWcgZmlsZSwKKwkgKiAkR0lUX0NPTkZJR19MT0NBTCB3aWxsIG1ha2UgaXQgcHJvY2VzcyBpdCBpbiBhZGRpdGlvbiB0byB0aGUKKwkgKiBnbG9iYWwgY29uZmlnIGZpbGUsIHRoZSBzYW1lIHdheSBpdCB3b3VsZCB0aGUgcGVyLXJlcG9zaXRvcnkKKwkgKiBjb25maWcgZmlsZSBvdGhlcndpc2UuICovCisJZmlsZW5hbWUgPSBnZXRlbnYoQ09ORklHX0VOVklST05NRU5UKTsKKwlpZiAoIWZpbGVuYW1lKSB7CisJCWlmICghYWNjZXNzKEVUQ19HSVRDT05GSUcsIFJfT0spKQorCQkJcmV0ICs9IGdpdF9jb25maWdfZnJvbV9maWxlKGZuLCBFVENfR0lUQ09ORklHKTsKKwkJaG9tZSA9IGdldGVudigiSE9NRSIpOworCQlmaWxlbmFtZSA9IGdldGVudihDT05GSUdfTE9DQUxfRU5WSVJPTk1FTlQpOworCQlpZiAoIWZpbGVuYW1lKQorCQkJZmlsZW5hbWUgPSByZXBvX2NvbmZpZyA9IHhzdHJkdXAoZ2l0X3BhdGgoImNvbmZpZyIpKTsKKwl9CisKKwlpZiAoaG9tZSkgeworCQljaGFyICp1c2VyX2NvbmZpZyA9IHhzdHJkdXAobWtwYXRoKCIlcy8uZ2l0Y29uZmlnIiwgaG9tZSkpOworCQlpZiAoIWFjY2Vzcyh1c2VyX2NvbmZpZywgUl9PSykpCisJCQlyZXQgPSBnaXRfY29uZmlnX2Zyb21fZmlsZShmbiwgdXNlcl9jb25maWcpOworCQlmcmVlKHVzZXJfY29uZmlnKTsKKwl9CisKKwlyZXQgKz0gZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoZm4sIGZpbGVuYW1lKTsKKwlmcmVlKHJlcG9fY29uZmlnKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRmluZCBhbGwgdGhlIHN0dWZmIGZvciBnaXRfY29uZmlnX3NldCgpIGJlbG93LgorICovCisKKyNkZWZpbmUgTUFYX01BVENIRVMgNTEyCisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBiYXNlbGVuOworCWNoYXIqIGtleTsKKwlpbnQgZG9fbm90X21hdGNoOworCXJlZ2V4X3QqIHZhbHVlX3JlZ2V4OworCWludCBtdWx0aV9yZXBsYWNlOworCXNpemVfdCBvZmZzZXRbTUFYX01BVENIRVNdOworCWVudW0geyBTVEFSVCwgU0VDVElPTl9TRUVOLCBTRUNUSU9OX0VORF9TRUVOLCBLRVlfU0VFTiB9IHN0YXRlOworCWludCBzZWVuOworfSBzdG9yZTsKKworc3RhdGljIGludCBtYXRjaGVzKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJcmV0dXJuICFzdHJjbXAoa2V5LCBzdG9yZS5rZXkpICYmCisJCShzdG9yZS52YWx1ZV9yZWdleCA9PSBOVUxMIHx8CisJCSAoc3RvcmUuZG9fbm90X21hdGNoIF4KKwkJICAhcmVnZXhlYyhzdG9yZS52YWx1ZV9yZWdleCwgdmFsdWUsIDAsIE5VTEwsIDApKSk7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfYXV4KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJY29uc3QgY2hhciAqZXA7CisJc2l6ZV90IHNlY3Rpb25fbGVuOworCisJc3dpdGNoIChzdG9yZS5zdGF0ZSkgeworCWNhc2UgS0VZX1NFRU46CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlpZiAoc3RvcmUuc2VlbiA9PSAxICYmIHN0b3JlLm11bHRpX3JlcGxhY2UgPT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiV2FybmluZzogJXMgaGFzIG11bHRpcGxlIHZhbHVlc1xuIiwKKwkJCQkJa2V5KTsKKwkJCX0gZWxzZSBpZiAoc3RvcmUuc2VlbiA+PSBNQVhfTUFUQ0hFUykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgbWF0Y2hlc1xuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCXN0b3JlLnNlZW4rKzsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFQ1RJT05fU0VFTjoKKwkJLyoKKwkJICogV2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXMgaW4gc3RvcmUua2V5IChib3RoCisJCSAqIHNlY3Rpb24gYW5kIHZhciksIGFuZCBpdHMgc2VjdGlvbiBwYXJ0IGlzIGJhc2VsZW4KKwkJICogbG9uZy4gIFdlIGZvdW5kIGtleSAoYWdhaW4sIGJvdGggc2VjdGlvbiBhbmQgdmFyKS4KKwkJICogV2Ugd291bGQgd2FudCB0byBrbm93IGlmIHRoaXMga2V5IGlzIGluIHRoZSBzYW1lCisJCSAqIHNlY3Rpb24gYXMgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IuICBXZSBhbHJlYWR5CisJCSAqIGtub3cgd2UgYXJlIGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgd2hhdCBzaG91bGQKKwkJICogaG9sZCBzdG9yZS5rZXkuCisJCSAqLworCQllcCA9IHN0cnJjaHIoa2V5LCAnLicpOworCQlzZWN0aW9uX2xlbiA9IGVwIC0ga2V5OworCisJCWlmICgoc2VjdGlvbl9sZW4gIT0gc3RvcmUuYmFzZWxlbikgfHwKKwkJICAgIG1lbWNtcChrZXksIHN0b3JlLmtleSwgc2VjdGlvbl9sZW4rMSkpIHsKKwkJCXN0b3JlLnN0YXRlID0gU0VDVElPTl9FTkRfU0VFTjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogRG8gbm90IGluY3JlbWVudCBtYXRjaGVzOiB0aGlzIGlzIG5vIG1hdGNoLCBidXQgd2UKKwkJICoganVzdCBtYWRlIHN1cmUgd2UgYXJlIGluIHRoZSBkZXNpcmVkIHNlY3Rpb24uCisJCSAqLworCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBTRUNUSU9OX0VORF9TRUVOOgorCWNhc2UgU1RBUlQ6CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCQlzdG9yZS5zdGF0ZSA9IEtFWV9TRUVOOworCQkJc3RvcmUuc2VlbisrOworCQl9IGVsc2UgeworCQkJaWYgKHN0cnJjaHIoa2V5LCAnLicpIC0ga2V5ID09IHN0b3JlLmJhc2VsZW4gJiYKKwkJCSAgICAgICFzdHJuY21wKGtleSwgc3RvcmUua2V5LCBzdG9yZS5iYXNlbGVuKSkgeworCQkJCQlzdG9yZS5zdGF0ZSA9IFNFQ1RJT05fU0VFTjsKKwkJCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2Vycm9yKCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlXG4iKTsKKworCS8qIFNhbWUgZXJyb3IgY29kZSBhcyAiZmFpbGVkIHRvIHJlbmFtZSIuICovCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfd3JpdGVfc2VjdGlvbihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSkKK3sKKwljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIoa2V5LCAnLicpOworCWludCBsZW4xID0gc3RvcmUuYmFzZWxlbiwgbGVuMiA9IC0xOworCisJZG90ID0gc3RyY2hyKGtleSwgJy4nKTsKKwlpZiAoZG90KSB7CisJCWludCBkb3RsZW4gPSBkb3QgLSBrZXk7CisJCWlmIChkb3RsZW4gPCBsZW4xKSB7CisJCQlsZW4yID0gbGVuMSAtIGRvdGxlbiAtIDE7CisJCQlsZW4xID0gZG90bGVuOworCQl9CisJfQorCisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsICJbIiwgMSkgIT0gMSB8fAorCSAgICB3cml0ZV9pbl9mdWxsKGZkLCBrZXksIGxlbjEpICE9IGxlbjEpCisJCXJldHVybiAwOworCWlmIChsZW4yID49IDApIHsKKwkJaWYgKHdyaXRlX2luX2Z1bGwoZmQsICIgXCIiLCAyKSAhPSAyKQorCQkJcmV0dXJuIDA7CisJCXdoaWxlICgtLWxlbjIgPj0gMCkgeworCQkJdW5zaWduZWQgY2hhciBjID0gKisrZG90OworCQkJaWYgKGMgPT0gJyInKQorCQkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCAiXFwiLCAxKSAhPSAxKQorCQkJCQlyZXR1cm4gMDsKKwkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCAmYywgMSkgIT0gMSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgIlwiIiwgMSkgIT0gMSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgIl1cbiIsIDIpICE9IDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfd3JpdGVfcGFpcihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJaW50IGk7CisJaW50IGxlbmd0aCA9IHN0cmxlbihrZXkrc3RvcmUuYmFzZWxlbisxKTsKKwlpbnQgcXVvdGUgPSAwOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBxdW90ZWQuICovCisJaWYgKHZhbHVlWzBdID09ICcgJykKKwkJcXVvdGUgPSAxOworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCWlmICh2YWx1ZVtpXSA9PSAnOycgfHwgdmFsdWVbaV0gPT0gJyMnKQorCQkJcXVvdGUgPSAxOworCWlmICh2YWx1ZVtpLTFdID09ICcgJykKKwkJcXVvdGUgPSAxOworCisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsICJcdCIsIDEpICE9IDEgfHwKKwkgICAgd3JpdGVfaW5fZnVsbChmZCwga2V5K3N0b3JlLmJhc2VsZW4rMSwgbGVuZ3RoKSAhPSBsZW5ndGggfHwKKwkgICAgd3JpdGVfaW5fZnVsbChmZCwgIiA9ICIsIDMpICE9IDMpCisJCXJldHVybiAwOworCWlmIChxdW90ZSAmJiB3cml0ZV9pbl9mdWxsKGZkLCAiXCIiLCAxKSAhPSAxKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyB2YWx1ZVtpXTsgaSsrKQorCQlzd2l0Y2ggKHZhbHVlW2ldKSB7CisJCWNhc2UgJ1xuJzoKKwkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCAiXFxuIiwgMikgIT0gMikKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgIlxcdCIsIDIpICE9IDIpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSAnIic6CisJCWNhc2UgJ1xcJzoKKwkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCAiXFwiLCAxKSAhPSAxKQorCQkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJaWYgKHdyaXRlX2luX2Z1bGwoZmQsIHZhbHVlK2ksIDEpICE9IDEpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCWlmIChxdW90ZSAmJiB3cml0ZV9pbl9mdWxsKGZkLCAiXCIiLCAxKSAhPSAxKQorCQlyZXR1cm4gMDsKKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgIlxuIiwgMSkgIT0gMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZpbmRfYmVnaW5uaW5nX29mX2xpbmUoY29uc3QgY2hhciogY29udGVudHMsIHNpemVfdCBzaXplLAorCXNpemVfdCBvZmZzZXRfLCBpbnQqIGZvdW5kX2JyYWNrZXQpCit7CisJc2l6ZV90IGVxdWFsX29mZnNldCA9IHNpemUsIGJyYWNrZXRfb2Zmc2V0ID0gc2l6ZTsKKwlzc2l6ZV90IG9mZnNldDsKKworCWZvciAob2Zmc2V0ID0gb2Zmc2V0Xy0yOyBvZmZzZXQgPiAwIAorCQkJJiYgY29udGVudHNbb2Zmc2V0XSAhPSAnXG4nOyBvZmZzZXQtLSkKKwkJc3dpdGNoIChjb250ZW50c1tvZmZzZXRdKSB7CisJCQljYXNlICc9JzogZXF1YWxfb2Zmc2V0ID0gb2Zmc2V0OyBicmVhazsKKwkJCWNhc2UgJ10nOiBicmFja2V0X29mZnNldCA9IG9mZnNldDsgYnJlYWs7CisJCX0KKwlpZiAoYnJhY2tldF9vZmZzZXQgPCBlcXVhbF9vZmZzZXQpIHsKKwkJKmZvdW5kX2JyYWNrZXQgPSAxOworCQlvZmZzZXQgPSBicmFja2V0X29mZnNldCsxOworCX0gZWxzZQorCQlvZmZzZXQrKzsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnX3NldChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihrZXksIHZhbHVlLCBOVUxMLCAwKTsKK30KKworLyoKKyAqIElmIHZhbHVlPT1OVUxMLCB1bnNldCBpbiAocmVtb3ZlIGZyb20pIGNvbmZpZywKKyAqIGlmIHZhbHVlX3JlZ2V4IT1OVUxMLCBkaXNyZWdhcmQga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIHZhbHVlIGRvZXMgbm90IG1hdGNoLgorICogaWYgbXVsdGlfcmVwbGFjZT09MCwgbm90aGluZywgb3Igb25seSBvbmUgbWF0Y2hpbmcga2V5L3ZhbHVlIGlzIHJlcGxhY2VkLAorICogICAgIGVsc2UgYWxsIG1hdGNoaW5nIGtleS92YWx1ZXMgKHJlZ2FyZGxlc3MgaG93IG1hbnkpIGFyZSByZW1vdmVkLAorICogICAgIGJlZm9yZSB0aGUgbmV3IHBhaXIgaXMgd3JpdHRlbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhpczoKKyAqCisgKiAtIGl0IGxvY2tzIHRoZSBjb25maWcgZmlsZSBieSBjcmVhdGluZyAiLmdpdC9jb25maWcubG9jayIKKyAqCisgKiAtIGl0IHRoZW4gcGFyc2VzIHRoZSBjb25maWcgdXNpbmcgc3RvcmVfYXV4KCkgYXMgdmFsaWRhdG9yIHRvIGZpbmQKKyAqICAgdGhlIHBvc2l0aW9uIG9uIHRoZSBrZXkvdmFsdWUgcGFpciB0byByZXBsYWNlLiBJZiBpdCBpcyB0byBiZSB1bnNldCwKKyAqICAgaXQgbXVzdCBiZSBmb3VuZCBleGFjdGx5IG9uY2UuCisgKgorICogLSB0aGUgY29uZmlnIGZpbGUgaXMgbW1hcCgpZWQgYW5kIHRoZSBwYXJ0IGJlZm9yZSB0aGUgbWF0Y2ggKGlmIGFueSkgaXMKKyAqICAgd3JpdHRlbiB0byB0aGUgbG9jayBmaWxlLCB0aGVuIHRoZSBjaGFuZ2VkIHBhcnQgYW5kIHRoZSByZXN0LgorICoKKyAqIC0gdGhlIGNvbmZpZyBmaWxlIGlzIHJlbW92ZWQgYW5kIHRoZSBsb2NrIGZpbGUgcmVuYW1lKClkIHRvIGl0LgorICoKKyAqLworaW50IGdpdF9jb25maWdfc2V0X211bHRpdmFyKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUsCisJY29uc3QgY2hhciogdmFsdWVfcmVnZXgsIGludCBtdWx0aV9yZXBsYWNlKQoreworCWludCBpLCBkb3Q7CisJaW50IGZkID0gLTEsIGluX2ZkOworCWludCByZXQ7CisJY2hhciogY29uZmlnX2ZpbGVuYW1lOworCWNoYXIqIGxvY2tfZmlsZTsKKwljb25zdCBjaGFyKiBsYXN0X2RvdCA9IHN0cnJjaHIoa2V5LCAnLicpOworCisJY29uZmlnX2ZpbGVuYW1lID0gZ2V0ZW52KENPTkZJR19FTlZJUk9OTUVOVCk7CisJaWYgKCFjb25maWdfZmlsZW5hbWUpIHsKKwkJY29uZmlnX2ZpbGVuYW1lID0gZ2V0ZW52KENPTkZJR19MT0NBTF9FTlZJUk9OTUVOVCk7CisJCWlmICghY29uZmlnX2ZpbGVuYW1lKQorCQkJY29uZmlnX2ZpbGVuYW1lICA9IGdpdF9wYXRoKCJjb25maWciKTsKKwl9CisJY29uZmlnX2ZpbGVuYW1lID0geHN0cmR1cChjb25maWdfZmlsZW5hbWUpOworCWxvY2tfZmlsZSA9IHhzdHJkdXAobWtwYXRoKCIlcy5sb2NrIiwgY29uZmlnX2ZpbGVuYW1lKSk7CisKKwkvKgorCSAqIFNpbmNlICJrZXkiIGFjdHVhbGx5IGNvbnRhaW5zIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHRoZSByZWFsCisJICoga2V5IG5hbWUgc2VwYXJhdGVkIGJ5IGEgZG90LCB3ZSBoYXZlIHRvIGtub3cgd2hlcmUgdGhlIGRvdCBpcy4KKwkgKi8KKworCWlmIChsYXN0X2RvdCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAia2V5IGRvZXMgbm90IGNvbnRhaW4gYSBzZWN0aW9uOiAlc1xuIiwga2V5KTsKKwkJcmV0ID0gMjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJc3RvcmUuYmFzZWxlbiA9IGxhc3RfZG90IC0ga2V5OworCisJc3RvcmUubXVsdGlfcmVwbGFjZSA9IG11bHRpX3JlcGxhY2U7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBrZXkgYW5kIHdoaWxlIGF0IGl0LCBsb3dlciBjYXNlIGl0IGZvciBtYXRjaGluZy4KKwkgKi8KKwlzdG9yZS5rZXkgPSB4bWFsbG9jKHN0cmxlbihrZXkpICsgMSk7CisJZG90ID0gMDsKKwlmb3IgKGkgPSAwOyBrZXlbaV07IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBrZXlbaV07CisJCWlmIChjID09ICcuJykKKwkJCWRvdCA9IDE7CisJCS8qIExlYXZlIHRoZSBleHRlbmRlZCBiYXNlbmFtZSB1bnRvdWNoZWQuLiAqLworCQlpZiAoIWRvdCB8fCBpID4gc3RvcmUuYmFzZWxlbikgeworCQkJaWYgKCFpc2tleWNoYXIoYykgfHwgKGkgPT0gc3RvcmUuYmFzZWxlbisxICYmICFpc2FscGhhKGMpKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBrZXk6ICVzXG4iLCBrZXkpOworCQkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQljID0gdG9sb3dlcihjKTsKKwkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBrZXkgKG5ld2xpbmUpOiAlc1xuIiwga2V5KTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXN0b3JlLmtleVtpXSA9IGM7CisJfQorCXN0b3JlLmtleVtpXSA9IDA7CisKKwkvKgorCSAqIFRoZSBsb2NrX2ZpbGUgc2VydmVzIGEgcHVycG9zZSBpbiBhZGRpdGlvbiB0byBsb2NraW5nOiB0aGUgbmV3CisJICogY29udGVudHMgb2YgLmdpdC9jb25maWcgd2lsbCBiZSB3cml0dGVuIGludG8gaXQuCisJICovCisJZmQgPSBvcGVuKGxvY2tfZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwlpZiAoZmQgPCAwIHx8IGFkanVzdF9zaGFyZWRfcGVybShsb2NrX2ZpbGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGxvY2sgY29uZmlnIGZpbGVcbiIpOworCQlmcmVlKHN0b3JlLmtleSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qCisJICogSWYgLmdpdC9jb25maWcgZG9lcyBub3QgZXhpc3QgeWV0LCB3cml0ZSBhIG1pbmltYWwgdmVyc2lvbi4KKwkgKi8KKwlpbl9mZCA9IG9wZW4oY29uZmlnX2ZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCBpbl9mZCA8IDAgKSB7CisJCWZyZWUoc3RvcmUua2V5KTsKKworCQlpZiAoIEVOT0VOVCAhPSBlcnJubyApIHsKKwkJCWVycm9yKCJvcGVuaW5nICVzOiAlcyIsIGNvbmZpZ19maWxlbmFtZSwKKwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSAzOyAvKiBzYW1lIGFzICJpbnZhbGlkIGNvbmZpZyBmaWxlIiAqLworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQkvKiBpZiBub3RoaW5nIHRvIHVuc2V0LCBlcnJvciBvdXQgKi8KKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCXJldCA9IDU7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJc3RvcmUua2V5ID0gKGNoYXIqKWtleTsKKwkJaWYgKCFzdG9yZV93cml0ZV9zZWN0aW9uKGZkLCBrZXkpIHx8CisJCSAgICAhc3RvcmVfd3JpdGVfcGFpcihmZCwga2V5LCB2YWx1ZSkpCisJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIqIGNvbnRlbnRzOworCQlzaXplX3QgY29udGVudHNfc3osIGNvcHlfYmVnaW4sIGNvcHlfZW5kOworCQlpbnQgaSwgbmV3X2xpbmUgPSAwOworCisJCWlmICh2YWx1ZV9yZWdleCA9PSBOVUxMKQorCQkJc3RvcmUudmFsdWVfcmVnZXggPSBOVUxMOworCQllbHNlIHsKKwkJCWlmICh2YWx1ZV9yZWdleFswXSA9PSAnIScpIHsKKwkJCQlzdG9yZS5kb19ub3RfbWF0Y2ggPSAxOworCQkJCXZhbHVlX3JlZ2V4Kys7CisJCQl9IGVsc2UKKwkJCQlzdG9yZS5kb19ub3RfbWF0Y2ggPSAwOworCisJCQlzdG9yZS52YWx1ZV9yZWdleCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCQlpZiAocmVnY29tcChzdG9yZS52YWx1ZV9yZWdleCwgdmFsdWVfcmVnZXgsCisJCQkJCVJFR19FWFRFTkRFRCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0dGVybjogJXNcbiIsCisJCQkJCXZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlyZXQgPSA2OworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCX0KKworCQlzdG9yZS5vZmZzZXRbMF0gPSAwOworCQlzdG9yZS5zdGF0ZSA9IFNUQVJUOworCQlzdG9yZS5zZWVuID0gMDsKKworCQkvKgorCQkgKiBBZnRlciB0aGlzLCBzdG9yZS5vZmZzZXQgd2lsbCBjb250YWluIHRoZSAqZW5kKiBvZmZzZXQKKwkJICogb2YgdGhlIGxhc3QgbWF0Y2gsIG9yIHJlbWFpbiBhdCAwIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KKwkJICogQXMgYSBzaWRlIGVmZmVjdCwgd2UgbWFrZSBzdXJlIHRvIHRyYW5zZm9ybSBvbmx5IGEgdmFsaWQKKwkJICogZXhpc3RpbmcgY29uZmlnIGZpbGUuCisJCSAqLworCQlpZiAoZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc3RvcmVfYXV4LCBjb25maWdfZmlsZW5hbWUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgY29uZmlnIGZpbGVcbiIpOworCQkJZnJlZShzdG9yZS5rZXkpOworCQkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCQlyZWdmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCX0KKwkJCXJldCA9IDM7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJZnJlZShzdG9yZS5rZXkpOworCQlpZiAoc3RvcmUudmFsdWVfcmVnZXggIT0gTlVMTCkgeworCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJfQorCisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIG9yIHRvbyBtYW55IG1hdGNoZXMsIGVycm9yIG91dCAqLworCQlpZiAoKHN0b3JlLnNlZW4gPT0gMCAmJiB2YWx1ZSA9PSBOVUxMKSB8fAorCQkJCShzdG9yZS5zZWVuID4gMSAmJiBtdWx0aV9yZXBsYWNlID09IDApKSB7CisJCQlyZXQgPSA1OworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZzdGF0KGluX2ZkLCAmc3QpOworCQljb250ZW50c19zeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJCWNvbnRlbnRzID0geG1tYXAoTlVMTCwgY29udGVudHNfc3osIFBST1RfUkVBRCwKKwkJCU1BUF9QUklWQVRFLCBpbl9mZCwgMCk7CisJCWNsb3NlKGluX2ZkKTsKKworCQlpZiAoc3RvcmUuc2VlbiA9PSAwKQorCQkJc3RvcmUuc2VlbiA9IDE7CisKKwkJZm9yIChpID0gMCwgY29weV9iZWdpbiA9IDA7IGkgPCBzdG9yZS5zZWVuOyBpKyspIHsKKwkJCWlmIChzdG9yZS5vZmZzZXRbaV0gPT0gMCkgeworCQkJCXN0b3JlLm9mZnNldFtpXSA9IGNvcHlfZW5kID0gY29udGVudHNfc3o7CisJCQl9IGVsc2UgaWYgKHN0b3JlLnN0YXRlICE9IEtFWV9TRUVOKSB7CisJCQkJY29weV9lbmQgPSBzdG9yZS5vZmZzZXRbaV07CisJCQl9IGVsc2UKKwkJCQljb3B5X2VuZCA9IGZpbmRfYmVnaW5uaW5nX29mX2xpbmUoCisJCQkJCWNvbnRlbnRzLCBjb250ZW50c19zeiwKKwkJCQkJc3RvcmUub2Zmc2V0W2ldLTIsICZuZXdfbGluZSk7CisKKwkJCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb25maWcgKi8KKwkJCWlmIChjb3B5X2VuZCA+IGNvcHlfYmVnaW4pIHsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkJICBjb3B5X2VuZCAtIGNvcHlfYmVnaW4pIDwKKwkJCQkgICAgY29weV9lbmQgLSBjb3B5X2JlZ2luKQorCQkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCQkJaWYgKG5ld19saW5lICYmCisJCQkJICAgIHdyaXRlX2luX2Z1bGwoZmQsICJcbiIsIDEpICE9IDEpCisJCQkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwkJCX0KKwkJCWNvcHlfYmVnaW4gPSBzdG9yZS5vZmZzZXRbaV07CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcGFpciAodmFsdWUgPT0gTlVMTCBtZWFucyB1bnNldCkgKi8KKwkJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJCWlmIChzdG9yZS5zdGF0ZSA9PSBTVEFSVCkgeworCQkJCWlmICghc3RvcmVfd3JpdGVfc2VjdGlvbihmZCwga2V5KSkKKwkJCQkJZ290byB3cml0ZV9lcnJfb3V0OworCQkJfQorCQkJaWYgKCFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgY29uZmlnICovCisJCWlmIChjb3B5X2JlZ2luIDwgY29udGVudHNfc3opCisJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikgPAorCQkJICAgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisKKwkJbXVubWFwKGNvbnRlbnRzLCBjb250ZW50c19zeik7CisJCXVubGluayhjb25maWdfZmlsZW5hbWUpOworCX0KKworCWlmIChyZW5hbWUobG9ja19maWxlLCBjb25maWdfZmlsZW5hbWUpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZW5hbWUgdGhlIGxvY2sgZmlsZT9cbiIpOworCQlyZXQgPSA0OworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJldCA9IDA7CisKK291dF9mcmVlOgorCWlmICgwIDw9IGZkKQorCQljbG9zZShmZCk7CisJZnJlZShjb25maWdfZmlsZW5hbWUpOworCWlmIChsb2NrX2ZpbGUpIHsKKwkJdW5saW5rKGxvY2tfZmlsZSk7CisJCWZyZWUobG9ja19maWxlKTsKKwl9CisJcmV0dXJuIHJldDsKKword3JpdGVfZXJyX291dDoKKwlyZXQgPSB3cml0ZV9lcnJvcigpOworCWdvdG8gb3V0X2ZyZWU7CisKK30KKworc3RhdGljIGludCBzZWN0aW9uX25hbWVfbWF0Y2ggKGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSA9IDAsIGogPSAwLCBkb3QgPSAwOworCWZvciAoOyBidWZbaV0gJiYgYnVmW2ldICE9ICddJzsgaSsrKSB7CisJCWlmICghZG90ICYmIGlzc3BhY2UoYnVmW2ldKSkgeworCQkJZG90ID0gMTsKKwkJCWlmIChuYW1lW2orK10gIT0gJy4nKQorCQkJCWJyZWFrOworCQkJZm9yIChpKys7IGlzc3BhY2UoYnVmW2ldKTsgaSsrKQorCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJaWYgKGJ1ZltpXSAhPSAnIicpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYnVmW2ldID09ICdcXCcgJiYgZG90KQorCQkJaSsrOworCQllbHNlIGlmIChidWZbaV0gPT0gJyInICYmIGRvdCkgeworCQkJZm9yIChpKys7IGlzc3BhY2UoYnVmW2ldKTsgaSsrKQorCQkJCTsgLyogZG9fbm90aGluZyAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1ZltpXSAhPSBuYW1lW2orK10pCisJCQlicmVhazsKKwl9CisJcmV0dXJuIChidWZbaV0gPT0gJ10nICYmIG5hbWVbal0gPT0gMCk7Cit9CisKKy8qIGlmIG5ld19uYW1lID09IE5VTEwsIHRoZSBzZWN0aW9uIGlzIHJlbW92ZWQgaW5zdGVhZCAqLworaW50IGdpdF9jb25maWdfcmVuYW1lX3NlY3Rpb24oY29uc3QgY2hhciAqb2xkX25hbWUsIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCWludCByZXQgPSAwLCByZW1vdmUgPSAwOworCWNoYXIgKmNvbmZpZ19maWxlbmFtZTsKKwlzdHJ1Y3QgbG9ja19maWxlICpsb2NrID0geGNhbGxvYyhzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSksIDEpOworCWludCBvdXRfZmQ7CisJY2hhciBidWZbMTAyNF07CisKKwljb25maWdfZmlsZW5hbWUgPSBnZXRlbnYoQ09ORklHX0VOVklST05NRU5UKTsKKwlpZiAoIWNvbmZpZ19maWxlbmFtZSkgeworCQljb25maWdfZmlsZW5hbWUgPSBnZXRlbnYoQ09ORklHX0xPQ0FMX0VOVklST05NRU5UKTsKKwkJaWYgKCFjb25maWdfZmlsZW5hbWUpCisJCQljb25maWdfZmlsZW5hbWUgID0gZ2l0X3BhdGgoImNvbmZpZyIpOworCX0KKwljb25maWdfZmlsZW5hbWUgPSB4c3RyZHVwKGNvbmZpZ19maWxlbmFtZSk7CisJb3V0X2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShsb2NrLCBjb25maWdfZmlsZW5hbWUsIDApOworCWlmIChvdXRfZmQgPCAwKSB7CisJCXJldCA9IGVycm9yKCJDb3VsZCBub3QgbG9jayBjb25maWcgZmlsZSEiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEoY29uZmlnX2ZpbGUgPSBmb3Blbihjb25maWdfZmlsZW5hbWUsICJyYiIpKSkgeworCQkvKiBubyBjb25maWcgZmlsZSBtZWFucyBub3RoaW5nIHRvIHJlbmFtZSwgbm8gZXJyb3IgKi8KKwkJZ290byB1bmxvY2tfYW5kX291dDsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgY29uZmlnX2ZpbGUpKSB7CisJCWludCBpOworCQlpbnQgbGVuZ3RoOworCQlmb3IgKGkgPSAwOyBidWZbaV0gJiYgaXNzcGFjZShidWZbaV0pOyBpKyspCisJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJaWYgKGJ1ZltpXSA9PSAnWycpIHsKKwkJCS8qIGl0J3MgYSBzZWN0aW9uICovCisJCQlpZiAoc2VjdGlvbl9uYW1lX21hdGNoICgmYnVmW2krMV0sIG9sZF9uYW1lKSkgeworCQkJCXJldCsrOworCQkJCWlmIChuZXdfbmFtZSA9PSBOVUxMKSB7CisJCQkJCXJlbW92ZSA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzdG9yZS5iYXNlbGVuID0gc3RybGVuKG5ld19uYW1lKTsKKwkJCQlpZiAoIXN0b3JlX3dyaXRlX3NlY3Rpb24ob3V0X2ZkLCBuZXdfbmFtZSkpIHsKKwkJCQkJcmV0ID0gd3JpdGVfZXJyb3IoKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVtb3ZlID0gMDsKKwkJfQorCQlpZiAocmVtb3ZlKQorCQkJY29udGludWU7CisJCWxlbmd0aCA9IHN0cmxlbihidWYpOworCQlpZiAod3JpdGVfaW5fZnVsbChvdXRfZmQsIGJ1ZiwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKKwkJCXJldCA9IHdyaXRlX2Vycm9yKCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlmY2xvc2UoY29uZmlnX2ZpbGUpOworIHVubG9ja19hbmRfb3V0OgorCWlmIChjbG9zZShvdXRfZmQpIHx8IGNvbW1pdF9sb2NrX2ZpbGUobG9jaykgPCAwKQorCQkJcmV0ID0gZXJyb3IoIkNhbm5vdCBjb21taXQgY29uZmlnIGZpbGUhIik7Cisgb3V0OgorCWZyZWUoY29uZmlnX2ZpbGVuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9jb25maWcubWFrLmluIGIvY29uZmlnLm1hay5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjlkN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLm1hay5pbgpAQCAtMCwwICsxLDQxIEBACisjIGdpdCBNYWtlZmlsZSBjb25maWd1cmF0aW9uLCBpbmNsdWRlZCBpbiBtYWluIE1ha2VmaWxlCisjIEBjb25maWd1cmVfaW5wdXRACisKK0NDID0gQENDQAorQ0ZMQUdTID0gQENGTEFHU0AKK0FSID0gQEFSQAorVEFSID0gQFRBUkAKKyNJTlNUQUxMID0gQElOU1RBTExACQkjIG5lZWRzIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBzb3VyY2VzCitUQ0xUS19QQVRIID0gQFRDTFRLX1BBVEhACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2JpbmRpciA9IEBiaW5kaXJACisjZ2l0ZXhlY2RpciA9IEBsaWJleGVjZGlyQC9naXQtY29yZS8KK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAordGVtcGxhdGVfZGlyID0gQGRhdGFkaXJAL2dpdC1jb3JlL3RlbXBsYXRlcy8KKworbWFuZGlyPUBtYW5kaXJACisKK3NyY2RpciA9IEBzcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK2V4cG9ydCBleGVjX3ByZWZpeCBtYW5kaXIKK2V4cG9ydCBzcmNkaXIgVlBBVEgKKworTkVFRFNfU1NMX1dJVEhfQ1JZUFRPPUBORUVEU19TU0xfV0lUSF9DUllQVE9ACitOT19PUEVOU1NMPUBOT19PUEVOU1NMQAorTk9fQ1VSTD1ATk9fQ1VSTEAKK05PX0VYUEFUPUBOT19FWFBBVEAKK05FRURTX0xJQklDT05WPUBORUVEU19MSUJJQ09OVkAKK05FRURTX1NPQ0tFVD1ATkVFRFNfU09DS0VUQAorTk9fRF9JTk9fSU5fRElSRU5UPUBOT19EX0lOT19JTl9ESVJFTlRACitOT19EX1RZUEVfSU5fRElSRU5UPUBOT19EX1RZUEVfSU5fRElSRU5UQAorTk9fU09DS0FERFJfU1RPUkFHRT1ATk9fU09DS0FERFJfU1RPUkFHRUAKK05PX0lQVjY9QE5PX0lQVjZACitOT19DOTlfRk9STUFUPUBOT19DOTlfRk9STUFUQAorTk9fU1RSQ0FTRVNUUj1ATk9fU1RSQ0FTRVNUUkAKK05PX1NUUkxDUFk9QE5PX1NUUkxDUFlACitOT19TRVRFTlY9QE5PX1NFVEVOVkAKK05PX0lDT05WPUBOT19JQ09OVkAKKwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDJiODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwzNzUgQEAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNTkpCitBQ19JTklUKFtnaXRdLCBbQEBHSVRfVkVSU0lPTkBAXSwgW2dpdEB2Z2VyLmtlcm5lbC5vcmddKQorCitBQ19DT05GSUdfU1JDRElSKFtnaXQuY10pCisKK2NvbmZpZ19maWxlPWNvbmZpZy5tYWsuYXV0b2dlbgorY29uZmlnX2FwcGVuZD1jb25maWcubWFrLmFwcGVuZAorY29uZmlnX2luPWNvbmZpZy5tYWsuaW4KKworZWNobyAiIyAke2NvbmZpZ19hcHBlbmR9LiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4iID4gIiR7Y29uZmlnX2FwcGVuZH0iCisKKworIyMgRGVmaW5pdGlvbnMgb2YgbWFjcm9zCisjIEdJVF9DT05GX0FQUEVORF9MSU5FKExJTkUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCBMSU5FIHRvIGZpbGUgJHtjb25maWdfYXBwZW5kfQorQUNfREVGVU4oW0dJVF9DT05GX0FQUEVORF9MSU5FXSwKK1tlY2hvICIkMSIgPj4gIiR7Y29uZmlnX2FwcGVuZH0iXSkjIEdJVF9DT05GX0FQUEVORF9MSU5FCisjCisjIEdJVF9BUkdfU0VUX1BBVEgoUFJPR1JBTSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm92aWRlIC0td2l0aC1QUk9HUkFNPVBBVEggb3B0aW9uIHRvIHNldCBQQVRIIHRvIFBST0dSQU0KK0FDX0RFRlVOKFtHSVRfQVJHX1NFVF9QQVRIXSwKK1tBQ19BUkdfV0lUSChbJDFdLAorIFtBU19IRUxQX1NUUklORyhbLS13aXRoLSQxPVBBVEhdLAorICAgICAgICAgICAgICAgICBbcHJvdmlkZSBQQVRIIHRvICQxXSldLAorIFtHSVRfQ09ORl9BUFBFTkRfUEFUSCgkMSldLFtdKQorXSkjIEdJVF9BUkdfU0VUX1BBVEgKKyMKKyMgR0lUX0NPTkZfQVBQRU5EX1BBVEgoUFJPR1JBTSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlIC0td2l0aC1QUk9HUkFNPVBBVEggb3B0aW9uIHRvIHNldCBQUk9HUkFNX1BBVEg9UEFUSAorIyBVc2VkIGJ5IEdJVF9BUkdfU0VUX1BBVEgoUFJPR1JBTSkKK0FDX0RFRlVOKFtHSVRfQ09ORl9BUFBFTkRfUEFUSF0sCitbUFJPR1JBTT1tNF90b3VwcGVyKCQxKTsgXAoraWYgdGVzdCAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbiBcCisJQUNfTVNHX0VSUk9SKFtZb3UgY2Fubm90IHVzZSBnaXQgd2l0aG91dCAkMV0pOyBcCitlbHNlIFwKKwlpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbiBcCisJCUFDX01TR19XQVJOKFtZb3Ugc2hvdWxkIHByb3ZpZGUgcGF0aCBmb3IgLS13aXRoLSQxPVBBVEhdKTsgXAorCWVsc2UgXAorCQlHSVRfQ09ORl9BUFBFTkRfTElORSgke1BST0dSQU19X1BBVEg9JHdpdGh2YWwpOyBcCisJZmk7IFwKK2ZpOyBcCitdKSAjIEdJVF9DT05GX0FQUEVORF9QQVRICisjCisjIEdJVF9QQVJTRV9XSVRIKFBBQ0tBR0UpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvciB1c2UgaW4gQUNfQVJHX1dJVEggYWN0aW9uLWlmLWZvdW5kLCBmb3IgcGFja2FnZXMgZGVmYXVsdCBPTi4KKyMgKiBTZXQgTk9fUEFDS0FHRT1ZZXNQbGVhc2UgZm9yIC0td2l0aG91dC1QQUNLQUdFCisjICogU2V0IFBBQ0tBR0VESVI9UEFUSCBmb3IgLS13aXRoLVBBQ0tBR0U9UEFUSAorIyAqIFVuc2V0IE5PX1BBQ0tBR0UgZm9yIC0td2l0aC1QQUNLQUdFIHdpdGhvdXQgQVJHCitBQ19ERUZVTihbR0lUX1BBUlNFX1dJVEhdLAorW1BBQ0tBR0U9bTRfdG91cHBlcigkMSk7IFwKK2lmIHRlc3QgIiR3aXRodmFsIiA9ICJubyI7IHRoZW4gXAorCW00X3RvdXBwZXIoTk9fJDEpPVllc1BsZWFzZTsgXAorZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbiBcCisJbTRfdG91cHBlcihOT18kMSk9OyBcCitlbHNlIFwKKwltNF90b3VwcGVyKE5PXyQxKT07IFwKKwlHSVRfQ09ORl9BUFBFTkRfTElORSgke1BBQ0tBR0V9RElSPSR3aXRodmFsKTsgXAorZmkgXAorXSkjIEdJVF9QQVJTRV9XSVRICisKKworIyMgU2l0ZSBjb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gcHJvZ3JhbXMgKGJlZm9yZSB0ZXN0cykKKyMjIC0td2l0aC1QQUNLQUdFWz1BUkddIGFuZCAtLXdpdGhvdXQtUEFDS0FHRQorIworIyBEZWZpbmUgU0hFTExfUEFUSCB0byBwcm92aWRlIHBhdGggdG8gc2hlbGwuCitHSVRfQVJHX1NFVF9QQVRIKHNoZWxsKQorIworIyBEZWZpbmUgUEVSTF9QQVRIIHRvIHByb3ZpZGUgcGF0aCB0byBQZXJsLgorR0lUX0FSR19TRVRfUEFUSChwZXJsKQorIworIyBEZWNsYXJlIHRoZSB3aXRoLXRjbHRrL3dpdGhvdXQtdGNsdGsgb3B0aW9ucy4KK0FDX0FSR19XSVRIKHRjbHRrLAorQVNfSEVMUF9TVFJJTkcoWy0td2l0aC10Y2x0a10sW3VzZSBUY2wvVGsgR1VJIChkZWZhdWx0IGlzIFlFUyldKQorQVNfSEVMUF9TVFJJTkcoW10sW0FSRyBpcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBUY2wvVGsgaW50ZXJwcmV0ZXIuXSkKK0FTX0hFTFBfU1RSSU5HKFtdLFtCYXJlIC0td2l0aC10Y2x0ayB3aWxsIG1ha2UgdGhlIEdVSSBwYXJ0IG9ubHkgaWZdKQorQVNfSEVMUF9TVFJJTkcoW10sW1RjbC9UayBpbnRlcnByZXRlciB3aWxsIGJlIGZvdW5kIGluIGEgc3lzdGVtLl0pLFwKK0dJVF9QQVJTRV9XSVRIKHRjbHRrKSkKKyMKKworCisjIyBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciBwcm9ncmFtc10pCisjCitBQ19QUk9HX0NDKFtjYyBnY2NdKQorI0FDX1BST0dfSU5TVEFMTAkJIyBuZWVkcyBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gc291cmNlcworQUNfQ0hFQ0tfVE9PTChBUiwgYXIsIDopCitBQ19DSEVDS19QUk9HUyhUQVIsIFtndGFyIHRhcl0pCisjIFRDTFRLX1BBVEggd2lsbCBiZSBzZXQgdG8gc29tZSB2YWx1ZSBpZiB3ZSB3YW50IFRjbC9UaworIyBvciB3aWxsIGJlIGVtcHR5IG90aGVyd2lzZS4KK2lmIHRlc3QgLXogIiROT19UQ0xUSyI7IHRoZW4KKyAgaWYgdGVzdCAiJHdpdGhfdGNsdGsiID0gIiI7IHRoZW4KKyAgIyBObyBUY2wvVGsgc3dpdGNoZXMgZ2l2ZW4uIERvIG5vdCBjaGVjayBmb3IgVGNsL1RrLCB1c2UgYmFyZSAnd2lzaCcuCisgICAgVENMVEtfUEFUSD13aXNoCisgICAgQUNfU1VCU1QoVENMVEtfUEFUSCkKKyAgZWxpZiB0ZXN0ICIkd2l0aF90Y2x0ayIgPSAieWVzIjsgdGhlbgorICAjIFRjbC9UayBjaGVjayByZXF1ZXN0ZWQuCisgICAgQUNfQ0hFQ0tfUFJPR1MoVENMVEtfUEFUSCwgW3dpc2hdLCApCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtVc2luZyBUY2wvVGsgaW50ZXJwcmV0ZXIgJHdpdGhfdGNsdGtdKQorICAgIFRDTFRLX1BBVEg9IiR3aXRoX3RjbHRrIgorICAgIEFDX1NVQlNUKFRDTFRLX1BBVEgpCisgIGZpCitmaQorCisjIyBDaGVja3MgZm9yIGxpYnJhcmllcy4KK0FDX01TR19OT1RJQ0UoW0NIRUNLUyBmb3IgbGlicmFyaWVzXSkKKyMKKyMgRGVmaW5lIE5PX09QRU5TU0wgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91IGRvIG5vdCBoYXZlIE9wZW5TU0wuCisjIERlZmluZSBORUVEU19TU0xfV0lUSF9DUllQVE8gaWYgeW91IG5lZWQgLWxjcnlwdG8gd2l0aCAtbHNzbCAoRGFyd2luKS4KK0FDX0NIRUNLX0xJQihbY3J5cHRvXSwgW1NIQTFfSW5pdF0sCitbTkVFRFNfU1NMX1dJVEhfQ1JZUFRPPV0sCitbQUNfQ0hFQ0tfTElCKFtzc2xdLCBbU0hBMV9Jbml0XSwKKyBbTkVFRFNfU1NMX1dJVEhfQ1JZUFRPPVllc1BsZWFzZQorICBORUVEU19TU0xfV0lUSF9DUllQVE89XSwKKyBbTk9fT1BFTlNTTD1ZZXNQbGVhc2VdKV0pCitBQ19TVUJTVChORUVEU19TU0xfV0lUSF9DUllQVE8pCitBQ19TVUJTVChOT19PUEVOU1NMKQorIworIyBEZWZpbmUgTk9fQ1VSTCBpZiB5b3UgZG8gbm90IGhhdmUgY3VybCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdWxsIGFuZAorIyBnaXQtaHR0cC1wdXNoIGFyZSBub3QgYnVpbHQsIGFuZCB5b3UgY2Fubm90IHVzZSBodHRwOi8vIGFuZCBodHRwczovLworIyB0cmFuc3BvcnRzLgorQUNfQ0hFQ0tfTElCKFtjdXJsXSwgW2N1cmxfZ2xvYmFsX2luaXRdLAorW05PX0NVUkw9XSwKK1tOT19DVVJMPVllc1BsZWFzZV0pCitBQ19TVUJTVChOT19DVVJMKQorIworIyBEZWZpbmUgTk9fRVhQQVQgaWYgeW91IGRvIG5vdCBoYXZlIGV4cGF0IGluc3RhbGxlZC4gIGdpdC1odHRwLXB1c2ggaXMKKyMgbm90IGJ1aWx0LCBhbmQgeW91IGNhbm5vdCBwdXNoIHVzaW5nIGh0dHA6Ly8gYW5kIGh0dHBzOi8vIHRyYW5zcG9ydHMuCitBQ19DSEVDS19MSUIoW2V4cGF0XSwgW1hNTF9QYXJzZXJDcmVhdGVdLAorW05PX0VYUEFUPV0sCitbTk9fRVhQQVQ9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX0VYUEFUKQorIworIyBEZWZpbmUgTkVFRFNfTElCSUNPTlYgaWYgbGlua2luZyB3aXRoIGxpYmMgaXMgbm90IGVub3VnaCAoRGFyd2luIGFuZAorIyBzb21lIFNvbGFyaXMgaW5zdGFsbGF0aW9ucykuCisjIERlZmluZSBOT19JQ09OViBpZiBuZWl0aGVyIGxpYmMgbm9yIGxpYmljb252IHN1cHBvcnQgaWNvbnYuCitBQ19ERUZVTihbSUNPTlZURVNUX1NSQ10sIFsKKyNpbmNsdWRlIDxpY29udi5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWljb252X29wZW4oIiIsICIiKTsKKwlyZXR1cm4gMDsKK30KK10pCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpY29udiBpbiAtbGNdKQorQUNfTElOS19JRkVMU0UoSUNPTlZURVNUX1NSQywKKwlbQUNfTVNHX1JFU1VMVChbeWVzXSkKKwlORUVEU19MSUJJQ09OVj1dLAorCVtBQ19NU0dfUkVTVUxUKFtub10pCisJb2xkX0xJQlM9IiRMSUJTIgorCUxJQlM9IiRMSUJTIC1saWNvbnYiCisJQUNfTVNHX0NIRUNLSU5HKFtmb3IgaWNvbnYgaW4gLWxpY29udl0pCisJQUNfTElOS19JRkVMU0UoSUNPTlZURVNUX1NSQywKKwkJW0FDX01TR19SRVNVTFQoW3llc10pCisJCU5FRURTX0xJQklDT05WPVllc1BsZWFzZV0sCisJCVtBQ19NU0dfUkVTVUxUKFtub10pCisJCU5PX0lDT05WPVllc1BsZWFzZV0pCisJTElCUz0iJG9sZF9MSUJTIl0pCitBQ19TVUJTVChORUVEU19MSUJJQ09OVikKK0FDX1NVQlNUKE5PX0lDT05WKQordGVzdCAtbiAiJE5FRURTX0xJQklDT05WIiAmJiBMSUJTPSIkTElCUyAtbGljb252IgorIworIyBEZWZpbmUgTkVFRFNfU09DS0VUIGlmIGxpbmtpbmcgd2l0aCBsaWJjIGlzIG5vdCBlbm91Z2ggKFN1bk9TLAorIyBQYXRyaWNrIE1hdXJpdHopLgorQUNfQ0hFQ0tfTElCKFtjXSwgW3NvY2tldF0sCitbTkVFRFNfU09DS0VUPV0sCitbTkVFRFNfU09DS0VUPVllc1BsZWFzZV0pCitBQ19TVUJTVChORUVEU19TT0NLRVQpCit0ZXN0IC1uICIkTkVFRFNfU09DS0VUIiAmJiBMSUJTPSIkTElCUyAtbHNvY2tldCIKKworCisjIyBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KKworCisjIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljc10pCisjCisjIERlZmluZSBOT19EX0lOT19JTl9ESVJFTlQgaWYgeW91IGRvbid0IGhhdmUgZF9pbm8gaW4geW91ciBzdHJ1Y3QgZGlyZW50LgorQUNfQ0hFQ0tfTUVNQkVSKHN0cnVjdCBkaXJlbnQuZF9pbm8sCitbTk9fRF9JTk9fSU5fRElSRU5UPV0sCitbTk9fRF9JTk9fSU5fRElSRU5UPVllc1BsZWFzZV0sCitbI2luY2x1ZGUgPGRpcmVudC5oPl0pCitBQ19TVUJTVChOT19EX0lOT19JTl9ESVJFTlQpCisjCisjIERlZmluZSBOT19EX1RZUEVfSU5fRElSRU5UIGlmIHlvdXIgcGxhdGZvcm0gZGVmaW5lcyBEVF9VTktOT1dOIGJ1dCBsYWNrcworIyBkX3R5cGUgaW4gc3RydWN0IGRpcmVudCAobGF0ZXN0IEN5Z3dpbiAtLSB3aWxsIGJlIGZpeGVkIHNvb25pc2gpLgorQUNfQ0hFQ0tfTUVNQkVSKHN0cnVjdCBkaXJlbnQuZF90eXBlLAorW05PX0RfVFlQRV9JTl9ESVJFTlQ9XSwKK1tOT19EX1RZUEVfSU5fRElSRU5UPVllc1BsZWFzZV0sCitbI2luY2x1ZGUgPGRpcmVudC5oPl0pCitBQ19TVUJTVChOT19EX1RZUEVfSU5fRElSRU5UKQorIworIyBEZWZpbmUgTk9fU09DS0FERFJfU1RPUkFHRSBpZiB5b3VyIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgc3RydWN0CisjIHNvY2thZGRyX3N0b3JhZ2UuCitBQ19DSEVDS19UWVBFKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLAorW05PX1NPQ0tBRERSX1NUT1JBR0U9XSwKK1tOT19TT0NLQUREUl9TVE9SQUdFPVllc1BsZWFzZV0sWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK10pCitBQ19TVUJTVChOT19TT0NLQUREUl9TVE9SQUdFKQorIworIyBEZWZpbmUgTk9fSVBWNiBpZiB5b3UgbGFjayBJUHY2IHN1cHBvcnQgYW5kIGdldGFkZHJpbmZvKCkuCitBQ19DSEVDS19UWVBFKFtzdHJ1Y3QgYWRkcmluZm9dLFsKKyBBQ19DSEVDS19GVU5DKFtnZXRhZGRyaW5mb10sCisgIFtOT19JUFY2PV0sCisgIFtOT19JUFY2PVllc1BsZWFzZV0pCitdLFtOT19JUFY2PVllc1BsZWFzZV0sWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorXSkKK0FDX1NVQlNUKE5PX0lQVjYpCisjCisjIERlZmluZSBOT19DOTlfRk9STUFUIGlmIHlvdXIgZm9ybWF0dGVkIElPIGZ1bmN0aW9ucyAocHJpbnRmL3NjYW5mIGV0LmFsLikKKyMgZG8gbm90IHN1cHBvcnQgdGhlICdzaXplIHNwZWNpZmllcnMnIGludHJvZHVjZWQgYnkgQzk5LCBuYW1lbHkgbGwsIGhoLAorIyBqLCB6LCB0LiAocmVwcmVzZW50aW5nIGxvbmcgbG9uZyBpbnQsIGNoYXIsIGludG1heF90LCBzaXplX3QsIHB0cmRpZmZfdCkuCisjIHNvbWUgQyBjb21waWxlcnMgc3VwcG9ydGVkIHRoZXNlIHNwZWNpZmllcnMgcHJpb3IgdG8gQzk5IGFzIGFuIGV4dGVuc2lvbi4KK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGZvcm1hdHRlZCBJTyBmdW5jdGlvbnMgc3VwcG9ydCBDOTkgc2l6ZSBzcGVjaWZpZXJzXSwKKyBbYWNfY3ZfY19jOTlfZm9ybWF0XSwKK1sjIEFjdHVhbGx5IGdpdCB1c2VzIG9ubHkgJXogKCV6dSkgaW4gYWxsb2MuYywgYW5kICV0ICgldGQpIGluIG1rdGFnLmMKK0FDX1JVTl9JRkVMU0UoCisJW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCisJCVtbY2hhciBidWZbNjRdOworCQlpZiAoc3ByaW50ZihidWYsICIlbGxkJWhoZCVqZCV6ZCV0ZCIsIChsb25nIGxvbmcgaW50KTEsIChjaGFyKTIsIChpbnRtYXhfdCkzLCAoc2l6ZV90KTQsIChwdHJkaWZmX3QpNSkgIT0gNSkKKwkJICBleGl0KDEpOworCQllbHNlIGlmIChzdHJjbXAoYnVmLCAiMTIzNDUiKSkKKwkJICBleGl0KDIpO11dKV0sCisJW2FjX2N2X2NfYzk5X2Zvcm1hdD15ZXNdLAorCVthY19jdl9jX2M5OV9mb3JtYXQ9bm9dKQorXSkKK2lmIHRlc3QgJGFjX2N2X2NfYzk5X2Zvcm1hdCA9IG5vOyB0aGVuCisJTk9fQzk5X0ZPUk1BVD1ZZXNQbGVhc2UKK2Vsc2UKKwlOT19DOTlfRk9STUFUPQorZmkKK0FDX1NVQlNUKE5PX0M5OV9GT1JNQVQpCisKKworIyMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyMjIChpbiBkZWZhdWx0IEMgbGlicmFyeSBhbmQgbGlicmFyaWVzIGNoZWNrZWQgYnkgQUNfQ0hFQ0tfTElCKQorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciBsaWJyYXJ5IGZ1bmN0aW9uc10pCisjCisjIERlZmluZSBOT19TVFJDQVNFU1RSIGlmIHlvdSBkb24ndCBoYXZlIHN0cmNhc2VzdHIuCitBQ19DSEVDS19GVU5DKHN0cmNhc2VzdHIsCitbTk9fU1RSQ0FTRVNUUj1dLAorW05PX1NUUkNBU0VTVFI9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX1NUUkNBU0VTVFIpCisjCisjIERlZmluZSBOT19TVFJMQ1BZIGlmIHlvdSBkb24ndCBoYXZlIHN0cmxjcHkuCitBQ19DSEVDS19GVU5DKHN0cmxjcHksCitbTk9fU1RSTENQWT1dLAorW05PX1NUUkxDUFk9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX1NUUkxDUFkpCisjCisjIERlZmluZSBOT19TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCitBQ19DSEVDS19GVU5DKHNldGVudiwKK1tOT19TRVRFTlY9XSwKK1tOT19TRVRFTlY9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX1NFVEVOVikKKyMKKyMgRGVmaW5lIE5PX01NQVAgaWYgeW91IHdhbnQgdG8gYXZvaWQgbW1hcC4KKyMKKyMgRGVmaW5lIE5PX0lDT05WIGlmIHlvdXIgbGliYyBkb2VzIG5vdCBwcm9wZXJseSBzdXBwb3J0IGljb252LgorCisKKyMjIE90aGVyIGNoZWNrcy4KKyMgRGVmaW5lIFVTRV9QSUMgaWYgeW91IG5lZWQgdGhlIG1haW4gZ2l0IG9iamVjdHMgdG8gYmUgYnVpbHQgd2l0aCAtZlBJQworIyBpbiBvcmRlciB0byBidWlsZCBhbmQgbGluayBwZXJsL0dpdC5zby4gIHg4Ni02NCBzZWVtcyB0byBuZWVkIHRoaXMuCisjCisjIERlZmluZSBOT19TWU1MSU5LX0hFQUQgaWYgeW91IG5ldmVyIHdhbnQgLmdpdC9IRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKyMgRW5hYmxlIGl0IG9uIFdpbmRvd3MuICBCeSBkZWZhdWx0LCBzeW1yZWZzIGFyZSBzdGlsbCB1c2VkLgorCisjIyBTaXRlIGNvbmZpZ3VyYXRpb24gKG92ZXJyaWRlIGF1dG9kZXRlY3Rpb24pCisjIyAtLXdpdGgtUEFDS0FHRVs9QVJHXSBhbmQgLS13aXRob3V0LVBBQ0tBR0UKK0FDX01TR19OT1RJQ0UoW0NIRUNLUyBmb3Igc2l0ZSBjb25maWd1cmF0aW9uXSkKKyMKKyMgRGVmaW5lIE5PX1NWTl9URVNUUyBpZiB5b3Ugd2FudCB0byBza2lwIHRpbWUtY29uc3VtaW5nIFNWTiBpbnRlcm9wZXJhYmlsaXR5CisjIHRlc3RzLiAgVGhlc2UgdGVzdHMgdGFrZSB1cCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aGUgdG90YWwgdGVzdCB0aW1lCisjIGJ1dCBhcmUgbm90IG5lZWRlZCB1bmxlc3MgeW91IHBsYW4gdG8gdGFsayB0byBTVk4gcmVwb3MuCisjCisjIERlZmluZSBNT1pJTExBX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBjb21pbmcgZnJvbSBNb3ppbGxhLiBJdCBpcyBHUEwnZCBhbmQgc2hvdWxkIGJlIGZhc3QKKyMgb24gbm9uLXg4NiBhcmNoaXRlY3R1cmVzIChlLmcuIFBvd2VyUEMpLCB3aGlsZSB0aGUgT3BlblNTTCB2ZXJzaW9uIChkZWZhdWx0CisjIGNob2ljZSkgaGFzIHZlcnkgZmFzdCB2ZXJzaW9uIG9wdGltaXplZCBmb3IgaTU4Ni4KKyMKKyMgRGVmaW5lIFBQQ19TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBQb3dlclBDLgorIworIyBEZWZpbmUgQVJNX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIEFSTS4KKyMKKyMgRGVmaW5lIE5PX09QRU5TU0wgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91IGRvIG5vdCBoYXZlIE9wZW5TU0wuCisjIFRoaXMgYWxzbyBpbXBsaWVzIE1PWklMTEFfU0hBMS4KKyMKKyMgRGVmaW5lIE9QRU5TU0xESVI9L2Zvby9iYXIgaWYgeW91ciBvcGVuc3NsIGhlYWRlciBhbmQgbGlicmFyeSBmaWxlcyBhcmUgaW4KKyMgL2Zvby9iYXIvaW5jbHVkZSBhbmQgL2Zvby9iYXIvbGliIGRpcmVjdG9yaWVzLgorQUNfQVJHX1dJVEgob3BlbnNzbCwKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtb3BlbnNzbF0sW3VzZSBPcGVuU1NMIGxpYnJhcnkgKGRlZmF1bHQgaXMgWUVTKV0pCitBU19IRUxQX1NUUklORyhbXSwgICAgICAgICAgICAgIFtBUkcgY2FuIGJlIHByZWZpeCBmb3Igb3BlbnNzbCBsaWJyYXJ5IGFuZCBoZWFkZXJzXSksXAorR0lUX1BBUlNFX1dJVEgob3BlbnNzbCkpCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KK0FDX0FSR19XSVRIKGN1cmwsCitBU19IRUxQX1NUUklORyhbLS13aXRoLWN1cmxdLFtzdXBwb3J0IGh0dHAocyk6Ly8gdHJhbnNwb3J0cyAoZGVmYXVsdCBpcyBZRVMpXSkKK0FTX0hFTFBfU1RSSU5HKFtdLCAgICAgICAgICAgW0FSRyBjYW4gYmUgYWxzbyBwcmVmaXggZm9yIGN1cmwgbGlicmFyeSBhbmQgaGVhZGVyc10pLAorR0lUX1BBUlNFX1dJVEgoY3VybCkpCisjCisjIERlZmluZSBOT19FWFBBVCBpZiB5b3UgZG8gbm90IGhhdmUgZXhwYXQgaW5zdGFsbGVkLiAgZ2l0LWh0dHAtcHVzaCBpcworIyBub3QgYnVpbHQsIGFuZCB5b3UgY2Fubm90IHB1c2ggdXNpbmcgaHR0cDovLyBhbmQgaHR0cHM6Ly8gdHJhbnNwb3J0cy4KKyMKKyMgRGVmaW5lIEVYUEFURElSPS9mb28vYmFyIGlmIHlvdXIgZXhwYXQgaGVhZGVyIGFuZCBsaWJyYXJ5IGZpbGVzIGFyZSBpbgorIyAvZm9vL2Jhci9pbmNsdWRlIGFuZCAvZm9vL2Jhci9saWIgZGlyZWN0b3JpZXMuCitBQ19BUkdfV0lUSChleHBhdCwKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZXhwYXRdLAorW3N1cHBvcnQgZ2l0LXB1c2ggdXNpbmcgaHR0cDovLyBhbmQgaHR0cHM6Ly8gdHJhbnNwb3J0cyB2aWEgV2ViREFWIChkZWZhdWx0IGlzIFlFUyldKQorQVNfSEVMUF9TVFJJTkcoW10sICAgICAgICAgICAgW0FSRyBjYW4gYmUgYWxzbyBwcmVmaXggZm9yIGV4cGF0IGxpYnJhcnkgYW5kIGhlYWRlcnNdKSwKK0dJVF9QQVJTRV9XSVRIKGV4cGF0KSkKKyMKKyMgRGVmaW5lIE5PX0ZJTksgaWYgeW91IGFyZSBidWlsZGluZyBvbiBEYXJ3aW4vTWFjIE9TIFgsIGhhdmUgRmluaworIyBpbnN0YWxsZWQgaW4gL3N3LCBidXQgZG9uJ3Qgd2FudCBHSVQgdG8gbGluayBhZ2FpbnN0IGFueSBsaWJyYXJpZXMKKyMgaW5zdGFsbGVkIHRoZXJlLiAgSWYgZGVmaW5lZCB5b3UgbWF5IHNwZWNpZnkgeW91ciBvd24gKG9yIEZpbmsncykKKyMgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgbGlicmFyeSBkaXJlY3RvcmllcyBieSBkZWZpbmluZyBDRkxBR1MKKyMgYW5kIExERkxBR1MgYXBwcm9wcmlhdGVseS4KKyMKKyMgRGVmaW5lIE5PX0RBUldJTl9QT1JUUyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIERhcndpbi9NYWMgT1MgWCwKKyMgaGF2ZSBEYXJ3aW5Qb3J0cyBpbnN0YWxsZWQgaW4gL29wdC9sb2NhbCwgYnV0IGRvbid0IHdhbnQgR0lUIHRvCisjIGxpbmsgYWdhaW5zdCBhbnkgbGlicmFyaWVzIGluc3RhbGxlZCB0aGVyZS4gIElmIGRlZmluZWQgeW91IG1heQorIyBzcGVjaWZ5IHlvdXIgb3duIChvciBEYXJ3aW5Qb3J0J3MpIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kCisjIGxpYnJhcnkgZGlyZWN0b3JpZXMgYnkgZGVmaW5pbmcgQ0ZMQUdTIGFuZCBMREZMQUdTIGFwcHJvcHJpYXRlbHkuCisjCisjIERlZmluZSBOT19NTUFQIGlmIHlvdSB3YW50IHRvIGF2b2lkIG1tYXAuCisjCisjIERlZmluZSBOT19JQ09OViBpZiB5b3VyIGxpYmMgZG9lcyBub3QgcHJvcGVybHkgc3VwcG9ydCBpY29udi4KK0FDX0FSR19XSVRIKGljb252LAorQVNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1pY29udl0sCitbaWYgeW91ciBhcmNoaXRlY3R1cmUgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IGljb252XSkKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtaWNvbnY9UEFUSF0sCitbUEFUSCBpcyBwcmVmaXggZm9yIGxpYmljb252IGxpYnJhcnkgYW5kIGhlYWRlcnNdKQorQVNfSEVMUF9TVFJJTkcoW10sCitbdXNlZCBvbmx5IGlmIHlvdSBuZWVkIGxpbmtpbmcgd2l0aCBsaWJpY29udl0pLAorR0lUX1BBUlNFX1dJVEgoaWNvbnYpKQorCisjIyAtLWVuYWJsZS1GRUFUVVJFWz1BUkddIGFuZCAtLWRpc2FibGUtRkVBVFVSRQorIworIyBEZWZpbmUgVVNFX05TRUMgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgc3ViLXNlY29uZCBmaWxlIG10aW1lcworIyBhbmQgY3RpbWVzLiBOb3RlIHRoYXQgeW91IG5lZWQgcmVjZW50IGdsaWJjIChhdCBsZWFzdCAyLjIuNCkgZm9yIHRoaXMsIGFuZAorIyBpdCB3aWxsIEJSRUFLIFlPVVIgTE9DQUwgRElGRlMhIHNob3ctZGlmZiBhbmQgYW55dGhpbmcgdXNpbmcgaXQgd2lsbCBsaWtlbHkKKyMgcmFuZG9tbHkgYnJlYWsgdW5sZXNzIHlvdXIgdW5kZXJseWluZyBmaWxlc3lzdGVtIHN1cHBvcnRzIHRob3NlIHN1Yi1zZWNvbmQKKyMgdGltZXMgKG15IGV4dDMgZG9lc24ndCkuCisjCisjIERlZmluZSBVU0VfU1RERVYgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisjIGNoYW5nZSBiZWluZyBjb25zaWRlcmVkIGFuIGlub2RlIGNoYW5nZSBmcm9tIHRoZSB1cGRhdGUtY2FjaGUgcGVyc3BlY3RpdmUuCisKKworIyMgT3V0cHV0IGZpbGVzCitBQ19DT05GSUdfRklMRVMoWyIke2NvbmZpZ19maWxlfSI6IiR7Y29uZmlnX2lufSI6IiR7Y29uZmlnX2FwcGVuZH0iXSkKK0FDX09VVFBVVAorCisKKyMjIENsZWFudXAKK3JtIC1mICIke2NvbmZpZ19hcHBlbmR9IgpkaWZmIC0tZ2l0IGEvY29ubmVjdC5jIGIvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODljOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0LmMKQEAgLTAsMCArMSw4MDEgQEAKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKworc3RhdGljIGNoYXIgKnNlcnZlcl9jYXBhYmlsaXRpZXM7CisKK3N0YXRpYyBpbnQgY2hlY2tfcmVmKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoIWZsYWdzKQorCQlyZXR1cm4gMTsKKworCWlmIChsZW4gPCA1IHx8IG1lbWNtcChuYW1lLCAicmVmcy8iLCA1KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTa2lwIHRoZSAicmVmcy8iIHBhcnQgKi8KKwluYW1lICs9IDU7CisJbGVuIC09IDU7CisKKwkvKiBSRUZfTk9STUFMIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCB0aGUgbWFnaWMgZmFrZSB0YWcgcmVmcyAqLworCWlmICgoZmxhZ3MgJiBSRUZfTk9STUFMKSAmJiBjaGVja19yZWZfZm9ybWF0KG5hbWUpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSRUZfSEVBRFMgbWVhbnMgdGhhdCB3ZSB3YW50IHJlZ3VsYXIgYnJhbmNoIGhlYWRzICovCisJaWYgKChmbGFncyAmIFJFRl9IRUFEUykgJiYgIW1lbWNtcChuYW1lLCAiaGVhZHMvIiwgNikpCisJCXJldHVybiAxOworCisJLyogUkVGX1RBR1MgbWVhbnMgdGhhdCB3ZSB3YW50IHRhZ3MgKi8KKwlpZiAoKGZsYWdzICYgUkVGX1RBR1MpICYmICFtZW1jbXAobmFtZSwgInRhZ3MvIiwgNSkpCisJCXJldHVybiAxOworCisJLyogQWxsIHR5cGUgYml0cyBjbGVhciBtZWFucyB0aGF0IHdlIGFyZSBvayB3aXRoIGFueXRoaW5nICovCisJcmV0dXJuICEoZmxhZ3MgJiB+UkVGX05PUk1BTCk7Cit9CisKKy8qCisgKiBSZWFkIGFsbCB0aGUgcmVmcyBmcm9tIHRoZSBvdGhlciBlbmQKKyAqLworc3RydWN0IHJlZiAqKmdldF9yZW1vdGVfaGVhZHMoaW50IGluLCBzdHJ1Y3QgcmVmICoqbGlzdCwKKwkJCSAgICAgIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCSpsaXN0ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCByZWYgKnJlZjsKKwkJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwkJY2hhciAqbmFtZTsKKwkJaW50IGxlbiwgbmFtZV9sZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChidWZmZXJbbGVuLTFdID09ICdcbicpCisJCQlidWZmZXJbLS1sZW5dID0gMDsKKworCQlpZiAobGVuIDwgNDIgfHwgZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgb2xkX3NoYTEpIHx8IGJ1ZmZlcls0MF0gIT0gJyAnKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgc2hhL3JlZiwgZ290ICclcyciLCBidWZmZXIpOworCQluYW1lID0gYnVmZmVyICsgNDE7CisKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChsZW4gIT0gbmFtZV9sZW4gKyA0MSkgeworCQkJaWYgKHNlcnZlcl9jYXBhYmlsaXRpZXMpCisJCQkJZnJlZShzZXJ2ZXJfY2FwYWJpbGl0aWVzKTsKKwkJCXNlcnZlcl9jYXBhYmlsaXRpZXMgPSB4c3RyZHVwKG5hbWUgKyBuYW1lX2xlbiArIDEpOworCQl9CisKKwkJaWYgKCFjaGVja19yZWYobmFtZSwgbmFtZV9sZW4sIGZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobnJfbWF0Y2ggJiYgIXBhdGhfbWF0Y2gobmFtZSwgbnJfbWF0Y2gsIG1hdGNoKSkKKwkJCWNvbnRpbnVlOworCQlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbiAtIDQwKTsKKwkJaGFzaGNweShyZWYtPm9sZF9zaGExLCBvbGRfc2hhMSk7CisJCW1lbWNweShyZWYtPm5hbWUsIGJ1ZmZlciArIDQxLCBsZW4gLSA0MCk7CisJCSpsaXN0ID0gcmVmOworCQlsaXN0ID0gJnJlZi0+bmV4dDsKKwl9CisJcmV0dXJuIGxpc3Q7Cit9CisKK2ludCBzZXJ2ZXJfc3VwcG9ydHMoY29uc3QgY2hhciAqZmVhdHVyZSkKK3sKKwlyZXR1cm4gc2VydmVyX2NhcGFiaWxpdGllcyAmJgorCQlzdHJzdHIoc2VydmVyX2NhcGFiaWxpdGllcywgZmVhdHVyZSkgIT0gTlVMTDsKK30KKworaW50IGdldF9hY2soaW50IGZkLCB1bnNpZ25lZCBjaGFyICpyZXN1bHRfc2hhMSkKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCWludCBsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGZkLCBsaW5lLCBzaXplb2YobGluZSkpOworCisJaWYgKCFsZW4pCisJCWRpZSgiZ2l0LWZldGNoLXBhY2s6IGV4cGVjdGVkIEFDSy9OQUssIGdvdCBFT0YiKTsKKwlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJbGluZVstLWxlbl0gPSAwOworCWlmICghc3RyY21wKGxpbmUsICJOQUsiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFwcmVmaXhjbXAobGluZSwgIkFDSyAiKSkgeworCQlpZiAoIWdldF9zaGExX2hleChsaW5lKzQsIHJlc3VsdF9zaGExKSkgeworCQkJaWYgKHN0cnN0cihsaW5lKzQ1LCAiY29udGludWUiKSkKKwkJCQlyZXR1cm4gMjsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWRpZSgiZ2l0LWZldGNoX3BhY2s6IGV4cGVjdGVkIEFDSy9OQUssIGdvdCAnJXMnIiwgbGluZSk7Cit9CisKK2ludCBwYXRoX21hdGNoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBuciwgY2hhciAqKm1hdGNoKQoreworCWludCBpOworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJY2hhciAqcyA9IG1hdGNoW2ldOworCQlpbnQgbGVuID0gc3RybGVuKHMpOworCisJCWlmICghbGVuIHx8IGxlbiA+IHBhdGhsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChwYXRoICsgcGF0aGxlbiAtIGxlbiwgcywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGF0aGxlbiA+IGxlbiAmJiBwYXRoW3BhdGhsZW4gLSBsZW4gLSAxXSAhPSAnLycpCisJCQljb250aW51ZTsKKwkJKnMgPSAwOworCQlyZXR1cm4gKGkgKyAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCByZWZzcGVjIHsKKwljaGFyICpzcmM7CisJY2hhciAqZHN0OworCWNoYXIgZm9yY2U7Cit9OworCisvKgorICogQTpCIG1lYW5zIGZhc3QgZm9yd2FyZCByZW1vdGUgQiB3aXRoIGxvY2FsIEEuCisgKiArQTpCIG1lYW5zIG92ZXJ3cml0ZSByZW1vdGUgQiB3aXRoIGxvY2FsIEEuCisgKiArQSBpcyBhIHNob3J0aGFuZCBmb3IgK0E6QS4KKyAqIEEgaXMgYSBzaG9ydGhhbmQgZm9yIEE6QS4KKyAqIDpCIG1lYW5zIGRlbGV0ZSByZW1vdGUgQi4KKyAqLworc3RhdGljIHN0cnVjdCByZWZzcGVjICpwYXJzZV9yZWZfc3BlYyhpbnQgbnJfcmVmc3BlYywgY2hhciAqKnJlZnNwZWMpCit7CisJaW50IGk7CisJc3RydWN0IHJlZnNwZWMgKnJzID0geGNhbGxvYyhzaXplb2YoKnJzKSwgKG5yX3JlZnNwZWMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3JlZnNwZWM7IGkrKykgeworCQljaGFyICpzcCwgKmRwLCAqZXA7CisJCXNwID0gcmVmc3BlY1tpXTsKKwkJaWYgKCpzcCA9PSAnKycpIHsKKwkJCXJzW2ldLmZvcmNlID0gMTsKKwkJCXNwKys7CisJCX0KKwkJZXAgPSBzdHJjaHIoc3AsICc6Jyk7CisJCWlmIChlcCkgeworCQkJZHAgPSBlcCArIDE7CisJCQkqZXAgPSAwOworCQl9CisJCWVsc2UKKwkJCWRwID0gc3A7CisJCXJzW2ldLnNyYyA9IHNwOworCQlyc1tpXS5kc3QgPSBkcDsKKwl9CisJcnNbbnJfcmVmc3BlY10uc3JjID0gcnNbbnJfcmVmc3BlY10uZHN0ID0gTlVMTDsKKwlyZXR1cm4gcnM7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfcmVmc3BlY19tYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLAorCQkJICAgICAgIHN0cnVjdCByZWYgKnJlZnMsCisJCQkgICAgICAgc3RydWN0IHJlZiAqKm1hdGNoZWRfcmVmKQoreworCWludCBwYXRsZW4gPSBzdHJsZW4ocGF0dGVybik7CisJc3RydWN0IHJlZiAqbWF0Y2hlZF93ZWFrID0gTlVMTDsKKwlzdHJ1Y3QgcmVmICptYXRjaGVkID0gTlVMTDsKKwlpbnQgd2Vha19tYXRjaCA9IDA7CisJaW50IG1hdGNoID0gMDsKKworCWZvciAod2Vha19tYXRjaCA9IG1hdGNoID0gMDsgcmVmczsgcmVmcyA9IHJlZnMtPm5leHQpIHsKKwkJY2hhciAqbmFtZSA9IHJlZnMtPm5hbWU7CisJCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCQlpbnQgd2Vha19tYXRjaDsKKworCQlpZiAobmFtZWxlbiA8IHBhdGxlbiB8fAorCQkgICAgbWVtY21wKG5hbWUgKyBuYW1lbGVuIC0gcGF0bGVuLCBwYXR0ZXJuLCBwYXRsZW4pKQorCQkJY29udGludWU7CisJCWlmIChuYW1lbGVuICE9IHBhdGxlbiAmJiBuYW1lW25hbWVsZW4gLSBwYXRsZW4gLSAxXSAhPSAnLycpCisJCQljb250aW51ZTsKKworCQkvKiBBIG1hdGNoIGlzICJ3ZWFrIiBpZiBpdCBpcyB3aXRoIHJlZnMgb3V0c2lkZQorCQkgKiBoZWFkcyBvciB0YWdzLCBhbmQgZGlkIG5vdCBzcGVjaWZ5IHRoZSBwYXR0ZXJuCisJCSAqIGluIGZ1bGwgKGUuZy4gInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIikgb3IgYXQKKwkJICogbGVhc3QgZnJvbSB0aGUgdG9wbGV2ZWwgKGUuZy4gInJlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQkgKiBvdGhlcndpc2UgImdpdCBwdXNoICRVUkwgbWFzdGVyIiB3b3VsZCByZXN1bHQgaW4KKwkJICogYW1iaWd1aXR5IGJldHdlZW4gcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIGFuZCBoZWFkcy9tYXN0ZXIKKwkJICogYXQgdGhlIHJlbW90ZSBzaXRlLgorCQkgKi8KKwkJaWYgKG5hbWVsZW4gIT0gcGF0bGVuICYmCisJCSAgICBwYXRsZW4gIT0gbmFtZWxlbiAtIDUgJiYKKwkJICAgIHByZWZpeGNtcChuYW1lLCAicmVmcy9oZWFkcy8iKSAmJgorCQkgICAgcHJlZml4Y21wKG5hbWUsICJyZWZzL3RhZ3MvIikpIHsKKwkJCS8qIFdlIHdhbnQgdG8gY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgb25seSB3ZWFrCisJCQkgKiBtYXRjaGVzIGFyZSBmb3VuZCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlCisJCQkgKiBtYXRjaGVzLCBhbmQgd2hlcmUgbW9yZSB0aGFuIG9uZSBzdHJvbmcKKwkJCSAqIG1hdGNoZXMgYXJlIGZvdW5kLCBhcyBhbWJpZ3VvdXMuICBPbmUKKwkJCSAqIHN0cm9uZyBtYXRjaCB3aXRoIHplcm8gb3IgbW9yZSB3ZWFrIG1hdGNoZXMKKwkJCSAqIGFyZSBhY2NlcHRhYmxlIGFzIGEgdW5pcXVlIG1hdGNoLgorCQkJICovCisJCQltYXRjaGVkX3dlYWsgPSByZWZzOworCQkJd2Vha19tYXRjaCsrOworCQl9CisJCWVsc2UgeworCQkJbWF0Y2hlZCA9IHJlZnM7CisJCQltYXRjaCsrOworCQl9CisJfQorCWlmICghbWF0Y2hlZCkgeworCQkqbWF0Y2hlZF9yZWYgPSBtYXRjaGVkX3dlYWs7CisJCXJldHVybiB3ZWFrX21hdGNoOworCX0KKwllbHNlIHsKKwkJKm1hdGNoZWRfcmVmID0gbWF0Y2hlZDsKKwkJcmV0dXJuIG1hdGNoOworCX0KK30KKworc3RhdGljIHZvaWQgbGlua19kc3RfdGFpbChzdHJ1Y3QgcmVmICpyZWYsIHN0cnVjdCByZWYgKioqdGFpbCkKK3sKKwkqKnRhaWwgPSByZWY7CisJKnRhaWwgPSAmcmVmLT5uZXh0OworCSoqdGFpbCA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICp0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuOworCisJaWYgKCEqbmFtZSkgeworCQlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIDIwKTsKKwkJc3RyY3B5KHJlZi0+bmFtZSwgIihkZWxldGUpIik7CisJCWhhc2hjbHIocmVmLT5uZXdfc2hhMSk7CisJCXJldHVybiByZWY7CisJfQorCWlmIChnZXRfc2hhMShuYW1lLCBzaGExKSkKKwkJcmV0dXJuIE5VTEw7CisJbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJbWVtY3B5KHJlZi0+bmFtZSwgbmFtZSwgbGVuKTsKKwloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEpOworCXJldHVybiByZWY7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfZXhwbGljaXRfcmVmcyhzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLCBzdHJ1Y3QgcmVmc3BlYyAqcnMpCit7CisJaW50IGksIGVycnM7CisJZm9yIChpID0gZXJycyA9IDA7IHJzW2ldLnNyYzsgaSsrKSB7CisJCXN0cnVjdCByZWYgKm1hdGNoZWRfc3JjLCAqbWF0Y2hlZF9kc3Q7CisKKwkJbWF0Y2hlZF9zcmMgPSBtYXRjaGVkX2RzdCA9IE5VTEw7CisJCXN3aXRjaCAoY291bnRfcmVmc3BlY19tYXRjaChyc1tpXS5zcmMsIHNyYywgJm1hdGNoZWRfc3JjKSkgeworCQljYXNlIDE6CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJLyogVGhlIHNvdXJjZSBjb3VsZCBiZSBpbiB0aGUgZ2V0X3NoYTEoKSBmb3JtYXQKKwkJCSAqIG5vdCBhIHJlZmVyZW5jZSBuYW1lLiAgOnJlZnMvb3RoZXIgaXMgYQorCQkJICogd2F5IHRvIGRlbGV0ZSAnb3RoZXInIHJlZiBhdCB0aGUgcmVtb3RlIGVuZC4KKwkJCSAqLworCQkJbWF0Y2hlZF9zcmMgPSB0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUocnNbaV0uc3JjKTsKKwkJCWlmIChtYXRjaGVkX3NyYykKKwkJCQlicmVhazsKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoInNyYyByZWZzcGVjICVzIGRvZXMgbm90IG1hdGNoIGFueS4iLAorCQkJICAgICAgcnNbaV0uc3JjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJycyA9IDE7CisJCQllcnJvcigic3JjIHJlZnNwZWMgJXMgbWF0Y2hlcyBtb3JlIHRoYW4gb25lLiIsCisJCQkgICAgICByc1tpXS5zcmMpOworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChjb3VudF9yZWZzcGVjX21hdGNoKHJzW2ldLmRzdCwgZHN0LCAmbWF0Y2hlZF9kc3QpKSB7CisJCWNhc2UgMToKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoIW1lbWNtcChyc1tpXS5kc3QsICJyZWZzLyIsIDUpKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihyc1tpXS5kc3QpICsgMTsKKwkJCQltYXRjaGVkX2RzdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3QpICsgbGVuKTsKKwkJCQltZW1jcHkobWF0Y2hlZF9kc3QtPm5hbWUsIHJzW2ldLmRzdCwgbGVuKTsKKwkJCQlsaW5rX2RzdF90YWlsKG1hdGNoZWRfZHN0LCBkc3RfdGFpbCk7CisJCQl9CisJCQllbHNlIGlmICghc3RyY21wKHJzW2ldLnNyYywgcnNbaV0uZHN0KSAmJgorCQkJCSBtYXRjaGVkX3NyYykgeworCQkJCS8qIHB1c2hpbmcgIm1hc3RlcjptYXN0ZXIiIHdoZW4KKwkJCQkgKiByZW1vdGUgZG9lcyBub3QgaGF2ZSBtYXN0ZXIgeWV0LgorCQkJCSAqLworCQkJCWludCBsZW4gPSBzdHJsZW4obWF0Y2hlZF9zcmMtPm5hbWUpICsgMTsKKwkJCQltYXRjaGVkX2RzdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3QpICsgbGVuKTsKKwkJCQltZW1jcHkobWF0Y2hlZF9kc3QtPm5hbWUsIG1hdGNoZWRfc3JjLT5uYW1lLAorCQkJCSAgICAgICBsZW4pOworCQkJCWxpbmtfZHN0X3RhaWwobWF0Y2hlZF9kc3QsIGRzdF90YWlsKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWVycnMgPSAxOworCQkJCWVycm9yKCJkc3QgcmVmc3BlYyAlcyBkb2VzIG5vdCBtYXRjaCBhbnkgIgorCQkJCSAgICAgICJleGlzdGluZyByZWYgb24gdGhlIHJlbW90ZSBhbmQgZG9lcyAiCisJCQkJICAgICAgIm5vdCBzdGFydCB3aXRoIHJlZnMvLiIsIHJzW2ldLmRzdCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoImRzdCByZWZzcGVjICVzIG1hdGNoZXMgbW9yZSB0aGFuIG9uZS4iLAorCQkJICAgICAgcnNbaV0uZHN0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnJzKQorCQkJY29udGludWU7CisJCWlmIChtYXRjaGVkX2RzdC0+cGVlcl9yZWYpIHsKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoImRzdCByZWYgJXMgcmVjZWl2ZXMgZnJvbSBtb3JlIHRoYW4gb25lIHNyYy4iLAorCQkJICAgICAgbWF0Y2hlZF9kc3QtPm5hbWUpOworCQl9CisJCWVsc2UgeworCQkJbWF0Y2hlZF9kc3QtPnBlZXJfcmVmID0gbWF0Y2hlZF9zcmM7CisJCQltYXRjaGVkX2RzdC0+Zm9yY2UgPSByc1tpXS5mb3JjZTsKKwkJfQorCX0KKwlyZXR1cm4gLWVycnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpmaW5kX3JlZl9ieV9uYW1lKHN0cnVjdCByZWYgKmxpc3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJaWYgKCFzdHJjbXAobGlzdC0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gbGlzdDsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IG1hdGNoX3JlZnMoc3RydWN0IHJlZiAqc3JjLCBzdHJ1Y3QgcmVmICpkc3QsIHN0cnVjdCByZWYgKioqZHN0X3RhaWwsCisJICAgICAgIGludCBucl9yZWZzcGVjLCBjaGFyICoqcmVmc3BlYywgaW50IGFsbCkKK3sKKwlzdHJ1Y3QgcmVmc3BlYyAqcnMgPSBwYXJzZV9yZWZfc3BlYyhucl9yZWZzcGVjLCByZWZzcGVjKTsKKworCWlmIChucl9yZWZzcGVjKQorCQlyZXR1cm4gbWF0Y2hfZXhwbGljaXRfcmVmcyhzcmMsIGRzdCwgZHN0X3RhaWwsIHJzKTsKKworCS8qIHBpY2sgdGhlIHJlbWFpbmRlciAqLworCWZvciAoIDsgc3JjOyBzcmMgPSBzcmMtPm5leHQpIHsKKwkJc3RydWN0IHJlZiAqZHN0X3BlZXI7CisJCWlmIChzcmMtPnBlZXJfcmVmKQorCQkJY29udGludWU7CisJCWRzdF9wZWVyID0gZmluZF9yZWZfYnlfbmFtZShkc3QsIHNyYy0+bmFtZSk7CisJCWlmICgoZHN0X3BlZXIgJiYgZHN0X3BlZXItPnBlZXJfcmVmKSB8fCAoIWRzdF9wZWVyICYmICFhbGwpKQorCQkJY29udGludWU7CisJCWlmICghZHN0X3BlZXIpIHsKKwkJCS8qIENyZWF0ZSBhIG5ldyBvbmUgYW5kIGxpbmsgaXQgKi8KKwkJCWludCBsZW4gPSBzdHJsZW4oc3JjLT5uYW1lKSArIDE7CisJCQlkc3RfcGVlciA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3RfcGVlcikgKyBsZW4pOworCQkJbWVtY3B5KGRzdF9wZWVyLT5uYW1lLCBzcmMtPm5hbWUsIGxlbik7CisJCQloYXNoY3B5KGRzdF9wZWVyLT5uZXdfc2hhMSwgc3JjLT5uZXdfc2hhMSk7CisJCQlsaW5rX2RzdF90YWlsKGRzdF9wZWVyLCBkc3RfdGFpbCk7CisJCX0KKwkJZHN0X3BlZXItPnBlZXJfcmVmID0gc3JjOworCX0KKwlyZXR1cm4gMDsKK30KKworZW51bSBwcm90b2NvbCB7CisJUFJPVE9fTE9DQUwgPSAxLAorCVBST1RPX1NTSCwKKwlQUk9UT19HSVQsCit9OworCitzdGF0aWMgZW51bSBwcm90b2NvbCBnZXRfcHJvdG9jb2woY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNtcChuYW1lLCAic3NoIikpCisJCXJldHVybiBQUk9UT19TU0g7CisJaWYgKCFzdHJjbXAobmFtZSwgImdpdCIpKQorCQlyZXR1cm4gUFJPVE9fR0lUOworCWlmICghc3RyY21wKG5hbWUsICJnaXQrc3NoIikpCisJCXJldHVybiBQUk9UT19TU0g7CisJaWYgKCFzdHJjbXAobmFtZSwgInNzaCtnaXQiKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKK30KKworI2RlZmluZSBTVFJfKHMpCSMgcworI2RlZmluZSBTVFIocykJU1RSXyhzKQorCisjaWZuZGVmIE5PX0lQVjYKKworLyoKKyAqIFJldHVybnMgYSBjb25uZWN0ZWQgc29ja2V0KCkgZmQsIG9yIGVsc2UgZGllKClzLgorICovCitzdGF0aWMgaW50IGdpdF90Y3BfY29ubmVjdF9zb2NrKGNoYXIgKmhvc3QpCit7CisJaW50IHNvY2tmZCA9IC0xLCBzYXZlZF9lcnJubyA9IDA7CisJY2hhciAqY29sb24sICplbmQ7CisJY29uc3QgY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTAsICphaTsKKwlpbnQgZ2FpOworCisJaWYgKGhvc3RbMF0gPT0gJ1snKSB7CisJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKwkJaWYgKGVuZCkgeworCQkJKmVuZCA9IDA7CisJCQllbmQrKzsKKwkJCWhvc3QrKzsKKwkJfSBlbHNlCisJCQllbmQgPSBob3N0OworCX0gZWxzZQorCQllbmQgPSBob3N0OworCWNvbG9uID0gc3RyY2hyKGVuZCwgJzonKTsKKworCWlmIChjb2xvbikgeworCQkqY29sb24gPSAwOworCQlwb3J0ID0gY29sb24gKyAxOworCQlpZiAoISpwb3J0KQorCQkJcG9ydCA9ICI8bm9uZT4iOworCX0KKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKworCWdhaSA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKTsKKwlpZiAoZ2FpKQorCQlkaWUoIlVuYWJsZSB0byBsb29rIHVwICVzIChwb3J0ICVzKSAoJXMpIiwgaG9zdCwgcG9ydCwgZ2FpX3N0cmVycm9yKGdhaSkpOworCisJZm9yIChhaTAgPSBhaTsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksCisJCQkJYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29ja2ZkIDwgMCkgeworCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb25uZWN0KHNvY2tmZCwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKKwkJCXNhdmVkX2Vycm5vID0gZXJybm87CisJCQljbG9zZShzb2NrZmQpOworCQkJc29ja2ZkID0gLTE7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlmcmVlYWRkcmluZm8oYWkwKTsKKworCWlmIChzb2NrZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjb25uZWN0IGEgc29ja2V0ICglcykiLCBzdHJlcnJvcihzYXZlZF9lcnJubykpOworCisJcmV0dXJuIHNvY2tmZDsKK30KKworI2Vsc2UgLyogTk9fSVBWNiAqLworCisvKgorICogUmV0dXJucyBhIGNvbm5lY3RlZCBzb2NrZXQoKSBmZCwgb3IgZWxzZSBkaWUoKXMuCisgKi8KK3N0YXRpYyBpbnQgZ2l0X3RjcF9jb25uZWN0X3NvY2soY2hhciAqaG9zdCkKK3sKKwlpbnQgc29ja2ZkID0gLTEsIHNhdmVkX2Vycm5vID0gMDsKKwljaGFyICpjb2xvbiwgKmVuZDsKKwljaGFyICpwb3J0ID0gU1RSKERFRkFVTFRfR0lUX1BPUlQpLCAqZXA7CisJc3RydWN0IGhvc3RlbnQgKmhlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwljaGFyICoqYXA7CisJdW5zaWduZWQgaW50IG5wb3J0OworCisJaWYgKGhvc3RbMF0gPT0gJ1snKSB7CisJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKwkJaWYgKGVuZCkgeworCQkJKmVuZCA9IDA7CisJCQllbmQrKzsKKwkJCWhvc3QrKzsKKwkJfSBlbHNlCisJCQllbmQgPSBob3N0OworCX0gZWxzZQorCQllbmQgPSBob3N0OworCWNvbG9uID0gc3RyY2hyKGVuZCwgJzonKTsKKworCWlmIChjb2xvbikgeworCQkqY29sb24gPSAwOworCQlwb3J0ID0gY29sb24gKyAxOworCX0KKworCWhlID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKwlpZiAoIWhlKQorCQlkaWUoIlVuYWJsZSB0byBsb29rIHVwICVzICglcykiLCBob3N0LCBoc3RyZXJyb3IoaF9lcnJubykpOworCW5wb3J0ID0gc3RydG91bChwb3J0LCAmZXAsIDEwKTsKKwlpZiAoIGVwID09IHBvcnQgfHwgKmVwICkgeworCQkvKiBOb3QgbnVtZXJpYyAqLworCQlzdHJ1Y3Qgc2VydmVudCAqc2UgPSBnZXRzZXJ2YnluYW1lKHBvcnQsInRjcCIpOworCQlpZiAoICFzZSApCisJCQlkaWUoIlVua25vd24gcG9ydCAlc1xuIiwgcG9ydCk7CisJCW5wb3J0ID0gc2UtPnNfcG9ydDsKKwl9CisKKwlmb3IgKGFwID0gaGUtPmhfYWRkcl9saXN0OyAqYXA7IGFwKyspIHsKKwkJc29ja2ZkID0gc29ja2V0KGhlLT5oX2FkZHJ0eXBlLCBTT0NLX1NUUkVBTSwgMCk7CisJCWlmIChzb2NrZmQgPCAwKSB7CisJCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoJnNhLCAwLCBzaXplb2Ygc2EpOworCQlzYS5zaW5fZmFtaWx5ID0gaGUtPmhfYWRkcnR5cGU7CisJCXNhLnNpbl9wb3J0ID0gaHRvbnMobnBvcnQpOworCQltZW1jcHkoJnNhLnNpbl9hZGRyLCAqYXAsIGhlLT5oX2xlbmd0aCk7CisKKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Ygc2EpIDwgMCkgeworCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQlzb2NrZmQgPSAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCWlmIChzb2NrZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjb25uZWN0IGEgc29ja2V0ICglcykiLCBzdHJlcnJvcihzYXZlZF9lcnJubykpOworCisJcmV0dXJuIHNvY2tmZDsKK30KKworI2VuZGlmIC8qIE5PX0lQVjYgKi8KKworCitzdGF0aWMgdm9pZCBnaXRfdGNwX2Nvbm5lY3QoaW50IGZkWzJdLCBjaGFyICpob3N0KQoreworCWludCBzb2NrZmQgPSBnaXRfdGNwX2Nvbm5lY3Rfc29jayhob3N0KTsKKworCWZkWzBdID0gc29ja2ZkOworCWZkWzFdID0gZHVwKHNvY2tmZCk7Cit9CisKKworc3RhdGljIGNoYXIgKmdpdF9wcm94eV9jb21tYW5kOworc3RhdGljIGNvbnN0IGNoYXIgKnJob3N0X25hbWU7CitzdGF0aWMgaW50IHJob3N0X2xlbjsKKworc3RhdGljIGludCBnaXRfcHJveHlfY29tbWFuZF9vcHRpb25zKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5naXRwcm94eSIpKSB7CisJCWNvbnN0IGNoYXIgKmZvcl9wb3M7CisJCWludCBtYXRjaGxlbiA9IC0xOworCQlpbnQgaG9zdGxlbjsKKworCQlpZiAoZ2l0X3Byb3h5X2NvbW1hbmQpCisJCQlyZXR1cm4gMDsKKwkJLyogW2NvcmVdCisJCSAqIDsjIG1hdGNoZXMgd3d3Lmtlcm5lbC5vcmcgYXMgd2VsbAorCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci0xIGZvciBrZXJuZWwub3JnCisJCSAqIGdpdHByb3h5ID0gbmV0Y2F0dGVyLTIgZm9yIHNhbXBsZS54egorCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci1kZWZhdWx0CisJCSAqLworCQlmb3JfcG9zID0gc3Ryc3RyKHZhbHVlLCAiIGZvciAiKTsKKwkJaWYgKCFmb3JfcG9zKQorCQkJLyogbWF0Y2hlcyBldmVyeWJvZHkgKi8KKwkJCW1hdGNobGVuID0gc3RybGVuKHZhbHVlKTsKKwkJZWxzZSB7CisJCQlob3N0bGVuID0gc3RybGVuKGZvcl9wb3MgKyA1KTsKKwkJCWlmIChyaG9zdF9sZW4gPCBob3N0bGVuKQorCQkJCW1hdGNobGVuID0gLTE7CisJCQllbHNlIGlmICghc3RybmNtcChmb3JfcG9zICsgNSwKKwkJCQkJICByaG9zdF9uYW1lICsgcmhvc3RfbGVuIC0gaG9zdGxlbiwKKwkJCQkJICBob3N0bGVuKSAmJgorCQkJCSAoKHJob3N0X2xlbiA9PSBob3N0bGVuKSB8fAorCQkJCSAgcmhvc3RfbmFtZVtyaG9zdF9sZW4gLSBob3N0bGVuIC0xXSA9PSAnLicpKQorCQkJCW1hdGNobGVuID0gZm9yX3BvcyAtIHZhbHVlOworCQkJZWxzZQorCQkJCW1hdGNobGVuID0gLTE7CisJCX0KKwkJaWYgKDAgPD0gbWF0Y2hsZW4pIHsKKwkJCS8qIGNvcmUuZ2l0cHJveHkgPSBub25lIGZvciBrZXJuZWwub3JnICovCisJCQlpZiAobWF0Y2hsZW4gPT0gNCAmJiAKKwkJCSAgICAhbWVtY21wKHZhbHVlLCAibm9uZSIsIDQpKQorCQkJCW1hdGNobGVuID0gMDsKKwkJCWdpdF9wcm94eV9jb21tYW5kID0geG1hbGxvYyhtYXRjaGxlbiArIDEpOworCQkJbWVtY3B5KGdpdF9wcm94eV9jb21tYW5kLCB2YWx1ZSwgbWF0Y2hsZW4pOworCQkJZ2l0X3Byb3h5X2NvbW1hbmRbbWF0Y2hsZW5dID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdpdF91c2VfcHJveHkoY29uc3QgY2hhciAqaG9zdCkKK3sKKwlyaG9zdF9uYW1lID0gaG9zdDsKKwlyaG9zdF9sZW4gPSBzdHJsZW4oaG9zdCk7CisJZ2l0X3Byb3h5X2NvbW1hbmQgPSBnZXRlbnYoIkdJVF9QUk9YWV9DT01NQU5EIik7CisJZ2l0X2NvbmZpZyhnaXRfcHJveHlfY29tbWFuZF9vcHRpb25zKTsKKwlyaG9zdF9uYW1lID0gTlVMTDsKKwlyZXR1cm4gKGdpdF9wcm94eV9jb21tYW5kICYmICpnaXRfcHJveHlfY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdpdF9wcm94eV9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqaG9zdCkKK3sKKwljb25zdCBjaGFyICpwb3J0ID0gU1RSKERFRkFVTFRfR0lUX1BPUlQpOworCWNoYXIgKmNvbG9uLCAqZW5kOworCWNvbnN0IGNoYXIgKmFyZ3ZbNF07CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgcHJveHk7CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworCisJaWYgKGNvbG9uKSB7CisJCSpjb2xvbiA9IDA7CisJCXBvcnQgPSBjb2xvbiArIDE7CisJfQorCisJYXJndlswXSA9IGdpdF9wcm94eV9jb21tYW5kOworCWFyZ3ZbMV0gPSBob3N0OworCWFyZ3ZbMl0gPSBwb3J0OworCWFyZ3ZbM10gPSBOVUxMOworCW1lbXNldCgmcHJveHksIDAsIHNpemVvZihwcm94eSkpOworCXByb3h5LmFyZ3YgPSBhcmd2OworCXByb3h5LmluID0gLTE7CisJcHJveHkub3V0ID0gLTE7CisJaWYgKHN0YXJ0X2NvbW1hbmQoJnByb3h5KSkKKwkJZGllKCJjYW5ub3Qgc3RhcnQgcHJveHkgJXMiLCBhcmd2WzBdKTsKKwlmZFswXSA9IHByb3h5Lm91dDsgLyogcmVhZCBmcm9tIHByb3h5IHN0ZG91dCAqLworCWZkWzFdID0gcHJveHkuaW47ICAvKiB3cml0ZSB0byBwcm94eSBzdGRpbiAqLworfQorCisjZGVmaW5lIE1BWF9DTURfTEVOIDEwMjQKKworLyoKKyAqIFRoaXMgcmV0dXJucyAwIGlmIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wgZG9lcyBub3QgbmVlZCBmb3JrKDIpLAorICogb3IgYSBwcm9jZXNzIGlkIGlmIGl0IGRvZXMuICBPbmNlIGRvbmUsIGZpbmlzaCB0aGUgY29ubmVjdGlvbgorICogd2l0aCBmaW5pc2hfY29ubmVjdCgpIHdpdGggdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbgorICogKGl0IGlzIHNhZmUgdG8gY2FsbCBmaW5pc2hfY29ubmVjdCgpIHdpdGggMCB0byBzdXBwb3J0IHRoZSBmb3JtZXIKKyAqIGNhc2UpLgorICoKKyAqIERvZXMgbm90IHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yOyBpdCBqdXN0IGRpZXMuCisgKi8KK3BpZF90IGdpdF9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqdXJsLCBjb25zdCBjaGFyICpwcm9nKQoreworCWNoYXIgKmhvc3QsICpwYXRoID0gdXJsOworCWNoYXIgKmVuZDsKKwlpbnQgYzsKKwlpbnQgcGlwZWZkWzJdWzJdOworCXBpZF90IHBpZDsKKwllbnVtIHByb3RvY29sIHByb3RvY29sID0gUFJPVE9fTE9DQUw7CisJaW50IGZyZWVfcGF0aCA9IDA7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlob3N0ID0gc3Ryc3RyKHVybCwgIjovLyIpOworCWlmKGhvc3QpIHsKKwkJKmhvc3QgPSAnXDAnOworCQlwcm90b2NvbCA9IGdldF9wcm90b2NvbCh1cmwpOworCQlob3N0ICs9IDM7CisJCWMgPSAnLyc7CisJfSBlbHNlIHsKKwkJaG9zdCA9IHVybDsKKwkJYyA9ICc6JzsKKwl9CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisKKwlwYXRoID0gc3RyY2hyKGVuZCwgYyk7CisJaWYgKGMgPT0gJzonKSB7CisJCWlmIChwYXRoKSB7CisJCQlwcm90b2NvbCA9IFBST1RPX1NTSDsKKwkJCSpwYXRoKysgPSAnXDAnOworCQl9IGVsc2UKKwkJCXBhdGggPSBob3N0OworCX0KKworCWlmICghcGF0aCB8fCAhKnBhdGgpCisJCWRpZSgiTm8gcGF0aCBzcGVjaWZpZWQuIFNlZSAnbWFuIGdpdC1wdWxsJyBmb3IgdmFsaWQgdXJsIHN5bnRheCIpOworCisJLyoKKwkgKiBudWxsLXRlcm1pbmF0ZSBob3N0bmFtZSBhbmQgcG9pbnQgcGF0aCB0byB+IGZvciBVUkwncyBsaWtlIHRoaXM6CisJICogICAgc3NoOi8vaG9zdC54ei9+dXNlci9yZXBvCisJICovCisJaWYgKHByb3RvY29sICE9IFBST1RPX0xPQ0FMICYmIGhvc3QgIT0gdXJsKSB7CisJCWNoYXIgKnB0ciA9IHBhdGg7CisJCWlmIChwYXRoWzFdID09ICd+JykKKwkJCXBhdGgrKzsKKwkJZWxzZSB7CisJCQlwYXRoID0geHN0cmR1cChwdHIpOworCQkJZnJlZV9wYXRoID0gMTsKKwkJfQorCisJCSpwdHIgPSAnXDAnOworCX0KKworCWlmIChwcm90b2NvbCA9PSBQUk9UT19HSVQpIHsKKwkJLyogVGhlc2UgdW5kZXJseWluZyBjb25uZWN0aW9uIGNvbW1hbmRzIGRpZSgpIGlmIHRoZXkKKwkJICogY2Fubm90IGNvbm5lY3QuCisJCSAqLworCQljaGFyICp0YXJnZXRfaG9zdCA9IHhzdHJkdXAoaG9zdCk7CisJCWlmIChnaXRfdXNlX3Byb3h5KGhvc3QpKQorCQkJZ2l0X3Byb3h5X2Nvbm5lY3QoZmQsIGhvc3QpOworCQllbHNlCisJCQlnaXRfdGNwX2Nvbm5lY3QoZmQsIGhvc3QpOworCQkvKgorCQkgKiBTZXBhcmF0ZSBvcmlnaW5hbCBwcm90b2NvbCBjb21wb25lbnRzIHByb2cgYW5kIHBhdGgKKwkJICogZnJvbSBleHRlbmRlZCBjb21wb25lbnRzIHdpdGggYSBOVUwgYnl0ZS4KKwkJICovCisJCXBhY2tldF93cml0ZShmZFsxXSwKKwkJCSAgICAgIiVzICVzJWNob3N0PSVzJWMiLAorCQkJICAgICBwcm9nLCBwYXRoLCAwLAorCQkJICAgICB0YXJnZXRfaG9zdCwgMCk7CisJCWZyZWUodGFyZ2V0X2hvc3QpOworCQlpZiAoZnJlZV9wYXRoKQorCQkJZnJlZShwYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBpcGUocGlwZWZkWzBdKSA8IDAgfHwgcGlwZShwaXBlZmRbMV0pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHBpcGUgcGFpciBmb3IgY29tbXVuaWNhdGlvbiIpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gZm9yayIpOworCWlmICghcGlkKSB7CisJCWNoYXIgY29tbWFuZFtNQVhfQ01EX0xFTl07CisJCWNoYXIgKnBvc24gPSBjb21tYW5kOworCQlpbnQgc2l6ZSA9IE1BWF9DTURfTEVOOworCQlpbnQgb2YgPSAwOworCisJCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplLCBwcm9nLCAwKTsKKwkJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemUsICIgIiwgMCk7CisJCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplLCBwYXRoLCAxKTsKKworCQlpZiAob2YpCisJCQlkaWUoImNvbW1hbmQgbGluZSB0b28gbG9uZyIpOworCisJCWR1cDIocGlwZWZkWzFdWzBdLCAwKTsKKwkJZHVwMihwaXBlZmRbMF1bMV0sIDEpOworCQljbG9zZShwaXBlZmRbMF1bMF0pOworCQljbG9zZShwaXBlZmRbMF1bMV0pOworCQljbG9zZShwaXBlZmRbMV1bMF0pOworCQljbG9zZShwaXBlZmRbMV1bMV0pOworCQlpZiAocHJvdG9jb2wgPT0gUFJPVE9fU1NIKSB7CisJCQljb25zdCBjaGFyICpzc2gsICpzc2hfYmFzZW5hbWU7CisJCQlzc2ggPSBnZXRlbnYoIkdJVF9TU0giKTsKKwkJCWlmICghc3NoKSBzc2ggPSAic3NoIjsKKwkJCXNzaF9iYXNlbmFtZSA9IHN0cnJjaHIoc3NoLCAnLycpOworCQkJaWYgKCFzc2hfYmFzZW5hbWUpCisJCQkJc3NoX2Jhc2VuYW1lID0gc3NoOworCQkJZWxzZQorCQkJCXNzaF9iYXNlbmFtZSsrOworCQkJZXhlY2xwKHNzaCwgc3NoX2Jhc2VuYW1lLCBob3N0LCBjb21tYW5kLCBOVUxMKTsKKwkJfQorCQllbHNlIHsKKwkJCXVuc2V0ZW52KEFMVEVSTkFURV9EQl9FTlZJUk9OTUVOVCk7CisJCQl1bnNldGVudihEQl9FTlZJUk9OTUVOVCk7CisJCQl1bnNldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KEdSQUZUX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KElOREVYX0VOVklST05NRU5UKTsKKwkJCWV4ZWNscCgic2giLCAic2giLCAiLWMiLCBjb21tYW5kLCBOVUxMKTsKKwkJfQorCQlkaWUoImV4ZWMgZmFpbGVkIik7CisJfQorCWZkWzBdID0gcGlwZWZkWzBdWzBdOworCWZkWzFdID0gcGlwZWZkWzFdWzFdOworCWNsb3NlKHBpcGVmZFswXVsxXSk7CisJY2xvc2UocGlwZWZkWzFdWzBdKTsKKwlpZiAoZnJlZV9wYXRoKQorCQlmcmVlKHBhdGgpOworCXJldHVybiBwaWQ7Cit9CisKK2ludCBmaW5pc2hfY29ubmVjdChwaWRfdCBwaWQpCit7CisJaWYgKHBpZCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICh3YWl0cGlkKHBpZCwgTlVMTCwgMCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL1JFQURNRSBiL2NvbnRyaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzBhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JFQURNRQpAQCAtMCwwICsxLDQ0IEBACitDb250cmlidXRlZCBTb2Z0d2FyZQorCitBbHRob3VnaCB0aGVzZSBwaWVjZXMgYXJlIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBnaXQKK3NvdXJjZSB0cmVlLCB0aGV5IGFyZSBpbiBzb21ld2hhdCBkaWZmZXJlbnQgc3RhdHVzLiAgVGhlCitpbnRlbnRpb24gaXMgdG8ga2VlcCBpbnRlcmVzdGluZyB0b29scyBhcm91bmQgZ2l0IGhlcmUsIG1heWJlCitldmVuIGV4cGVyaW1lbnRhbCBvbmVzLCB0byBnaXZlIHVzZXJzIGFuIGVhc2llciBhY2Nlc3MgdG8gdGhlbSwKK2FuZCB0byBnaXZlIHRvb2xzIHdpZGVyIGV4cG9zdXJlLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGltcHJvdmVkCitmYXN0ZXIuCisKK0kgYW0gbm90IGV4cGVjdGluZyB0byB0b3VjaCB0aGVzZSBteXNlbGYgdGhhdCBtdWNoLiAgQXMgZmFyIGFzCitteSBkYXktdG8tZGF5IG9wZXJhdGlvbiBpcyBjb25jZXJuZWQsIHRoZXNlIHN1YmRpcmVjdG9yaWVzIGFyZQorb3duZWQgYnkgdGhlaXIgcmVzcGVjdGl2ZSBwcmltYXJ5IGF1dGhvcnMuICBJIGFtIHdpbGxpbmcgdG8gaGVscAoraWYgdXNlcnMgb2YgdGhlc2UgY29tcG9uZW50cyBhbmQgdGhlIGNvbnRyaWIvIHN1YnRyZWUgIm93bmVycyIKK2hhdmUgdGVjaG5pY2FsL2Rlc2lnbiBpc3N1ZXMgdG8gcmVzb2x2ZSwgYnV0IHRoZSBpbml0aWF0aXZlIHRvCitmaXggYW5kL29yIGVuaGFuY2UgdGhpbmdzIF9tdXN0XyBiZSBvbiB0aGUgc2lkZSBvZiB0aGUgc3VidHJlZQorb3duZXJzLiAgSU9XLCBJIHdvbid0IGJlIGFjdGl2ZWx5IGxvb2tpbmcgZm9yIGJ1Z3MgYW5kIHJvb21zIGZvcgorZW5oYW5jZW1lbnRzIGluIHRoZW0gYXMgdGhlIGdpdCBtYWludGFpbmVyIC0tIEkgbWF5IG9ubHkgZG8gc28KK2p1c3QgYXMgb25lIG9mIHRoZSB1c2VycyB3aGVuIEkgd2FudCB0byBzY3JhdGNoIG15IG93biBpdGNoLiAgSWYKK3lvdSBoYXZlIHBhdGNoZXMgdG8gdGhpbmdzIGluIGNvbnRyaWIvIGFyZWEsIHRoZSBwYXRjaCBzaG91bGQgYmUKK2ZpcnN0IHNlbnQgdG8gdGhlIHByaW1hcnkgYXV0aG9yLCBhbmQgdGhlbiB0aGUgcHJpbWFyeSBhdXRob3IKK3Nob3VsZCBhY2sgYW5kIGZvcndhcmQgaXQgdG8gbWUgKGdpdCBwdWxsIHJlcXVlc3QgaXMgbmljZXIpLgorVGhpcyBpcyB0aGUgc2FtZSB3YXkgYXMgaG93IEkgaGF2ZSBiZWVuIHRyZWF0aW5nIGdpdGssIGFuZCB0byBhCitsZXNzZXIgZGVncmVlIHZhcmlvdXMgZm9yZWlnbiBTQ00gaW50ZXJmYWNlcywgc28geW91IGtub3cgdGhlCitkcmlsbC4KKworSSBleHBlY3QgdGhhdCB0aGluZ3MgdGhhdCBzdGFydCB0aGVpciBsaWZlIGluIHRoZSBjb250cmliLyBhcmVhCit0byBncmFkdWF0ZSBvdXQgb2YgY29udHJpYi8gb25jZSB0aGV5IG1hdHVyZSwgZWl0aGVyIGJ5IGJlY29taW5nCitwcm9qZWN0cyBvbiB0aGVpciBvd24sIG9yIG1vdmluZyB0byB0aGUgdG9wbGV2ZWwgZGlyZWN0b3J5LiAgT24KK3RoZSBvdGhlciBoYW5kLCBJIGV4cGVjdCBJJ2xsIGJlIHByb3Bvc2luZyByZW1vdmFsIG9mIGRpc3VzZWQKK2FuZCBpbmFjdGl2ZSBvbmVzIGZyb20gdGltZSB0byB0aW1lLgorCitJZiB5b3UgaGF2ZSBuZXcgdGhpbmdzIHRvIGFkZCB0byB0aGlzIGFyZWEsIHBsZWFzZSBmaXJzdCBwcm9wb3NlCitpdCBvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdCwgYW5kIGFmdGVyIGEgbGlzdCBkaXNjdXNzaW9uIHByb3ZlcwordGhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBpbnRlcmVzdHMgKGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgYQorbGlzdC13aWRlIGNvbnNlbnN1cyBmb3IgYSB0b29sIHRhcmdldGVkIHRvIGEgcmVsYXRpdmVseSBuYXJyb3cKK2F1ZGllbmNlIC0tIGZvciBleGFtcGxlIEkgZG8gbm90IHdvcmsgd2l0aCBwcm9qZWN0cyB3aG9zZQordXBzdHJlYW0gaXMgc3ZuLCBzbyBJIGhhdmUgbm8gdXNlIGZvciBnaXQtc3ZuIG15c2VsZiwgYnV0IGl0IGlzCitvZiBnZW5lcmFsIGludGVyZXN0IGZvciBwZW9wbGUgd2hvIG5lZWQgdG8gaW50ZXJvcGVyYXRlIHdpdGggU1ZOCityZXBvc2l0b3JpZXMgaW4gYSB3YXkgZ2l0LXN2biB3b3JrcyBiZXR0ZXIgdGhhbiBnaXQtc3ZuaW1wb3J0KSwKK3N1Ym1pdCBhIHBhdGNoIHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBvZiBjb250cmliLyBhbmQgcHV0IHlvdXIKK3N0dWZmIHRoZXJlLgorCistamMKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9ibGFtZXZpZXcvUkVBRE1FIGIvY29udHJpYi9ibGFtZXZpZXcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTZmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2JsYW1ldmlldy9SRUFETUUKQEAgLTAsMCArMSwxMCBAQAorVGhpcyBpcyBhIHNhbXBsZSBwcm9ncmFtIHRvIHVzZSAnZ2l0LWJsYW1lIC0taW5jcmVtZW50YWwnLCBiYXNlZAorb24gdGhpcyBtZXNzYWdlLgorCitGcm9tOiBKZWZmIEtpbmcgPHBlZmZAcGVmZi5uZXQ+CitTdWJqZWN0OiBSZTogTW9yZSBwcmVjaXNlIHRhZyBmb2xsb3dpbmcKK1RvOiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAbGludXgtZm91bmRhdGlvbi5vcmc+CitDYzogZ2l0QHZnZXIua2VybmVsLm9yZworRGF0ZTogU2F0LCAyNyBKYW4gMjAwNyAxODo1MjozOCAtMDUwMAorTWVzc2FnZS1JRDogPDIwMDcwMTI3MjM1MjM4LkdBMjg3MDZAY29yZWR1bXAuaW50cmEucGVmZi5uZXQ+CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvYmxhbWV2aWV3L2JsYW1ldmlldy5wZXJsIGIvY29udHJpYi9ibGFtZXZpZXcvYmxhbWV2aWV3LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWRlYzAwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYmxhbWV2aWV3L2JsYW1ldmlldy5wZXJsCkBAIC0wLDAgKzEsMTU1IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIEd0azIgLWluaXQ7Cit1c2UgR3RrMjo6U2ltcGxlTGlzdDsKKworbXkgJGhhc2g7CitteSAkZm47CitpZiAoIEBBUkdWID09IDEgKSB7CisJJGhhc2ggPSAiSEVBRCI7CisJJGZuID0gc2hpZnQ7Cit9IGVsc2lmICggQEFSR1YgPT0gMiApIHsKKwkkaGFzaCA9IHNoaWZ0OworCSRmbiA9IHNoaWZ0OworfSBlbHNlIHsKKwlkaWUgIlVzYWdlIGJsYW1ldmlldyBbPHJldj5dIDxmaWxlbmFtZT4iOworfQorCitHdGsyOjpSYy0+cGFyc2Vfc3RyaW5nKDw8J0VPUycpOworc3R5bGUgInRyZWV2aWV3X3N0eWxlIgoreworICBHdGtUcmVlVmlldzo6dmVydGljYWwtc2VwYXJhdG9yID0gMAorfQorY2xhc3MgIkd0a1RyZWVWaWV3IiBzdHlsZSAidHJlZXZpZXdfc3R5bGUiCitFT1MKKworbXkgJHdpbmRvdyA9IEd0azI6OldpbmRvdy0+bmV3KCd0b3BsZXZlbCcpOworJHdpbmRvdy0+c2lnbmFsX2Nvbm5lY3QoZGVzdHJveSA9PiBzdWIgeyBHdGsyLT5tYWluX3F1aXQgfSk7CitteSAkdnBhbiA9IEd0azI6OlZQYW5lZC0+bmV3KCk7Ciskd2luZG93LT5hZGQoJHZwYW4pOworbXkgJHNjcm9sbGVkX3dpbmRvdyA9IEd0azI6OlNjcm9sbGVkV2luZG93LT5uZXc7CiskdnBhbi0+cGFjazEoJHNjcm9sbGVkX3dpbmRvdywgMSwgMSk7CitteSAkZmlsZXZpZXcgPSBHdGsyOjpTaW1wbGVMaXN0LT5uZXcoCisgICAgJ0NvbW1pdCcgPT4gJ3RleHQnLAorICAgICdGaWxlTGluZScgPT4gJ3RleHQnLAorICAgICdEYXRhJyA9PiAndGV4dCcKKyk7Ciskc2Nyb2xsZWRfd2luZG93LT5hZGQoJGZpbGV2aWV3KTsKKyRmaWxldmlldy0+Z2V0X2NvbHVtbigwKS0+c2V0X3NwYWNpbmcoMCk7CiskZmlsZXZpZXctPnNldF9zaXplX3JlcXVlc3QoMTAyNCwgNzY4KTsKKyRmaWxldmlldy0+c2V0X3J1bGVzX2hpbnQoMSk7CiskZmlsZXZpZXctPnNpZ25hbF9jb25uZWN0IChyb3dfYWN0aXZhdGVkID0+IHN1YiB7CisJCW15ICgkc2wsICRwYXRoLCAkY29sdW1uKSA9IEBfOworCQlteSAkcm93X3JlZiA9ICRzbC0+Z2V0X3Jvd19kYXRhX2Zyb21fcGF0aCAoJHBhdGgpOworCQlzeXN0ZW0oImJsYW1ldmlldyBAJHJvd19yZWZbMF1+MSAkZm4gJiIpOworCQl9KTsKKworbXkgJGNvbW1pdHdpbmRvdyA9IEd0azI6OlNjcm9sbGVkV2luZG93LT5uZXcoKTsKKyRjb21taXR3aW5kb3ctPnNldF9wb2xpY3kgKCdHVEtfUE9MSUNZX0FVVE9NQVRJQycsJ0dUS19QT0xJQ1lfQVVUT01BVElDJyk7CiskdnBhbi0+cGFjazIoJGNvbW1pdHdpbmRvdywgMSwgMSk7CitteSAkY29tbWl0X3RleHQgPSBHdGsyOjpUZXh0Vmlldy0+bmV3KCk7CitteSAkY29tbWl0X2J1ZmZlciA9IEd0azI6OlRleHRCdWZmZXItPm5ldygpOworJGNvbW1pdF90ZXh0LT5zZXRfYnVmZmVyKCRjb21taXRfYnVmZmVyKTsKKyRjb21taXR3aW5kb3ctPmFkZCgkY29tbWl0X3RleHQpOworCiskZmlsZXZpZXctPnNpZ25hbF9jb25uZWN0IChjdXJzb3JfY2hhbmdlZCA9PiBzdWIgeworCQlteSAoJHNsKSA9IEBfOworCQlteSAoJHBhdGgsICRmb2N1c19jb2x1bW4pID0gJHNsLT5nZXRfY3Vyc29yKCk7CisJCW15ICRyb3dfcmVmID0gJHNsLT5nZXRfcm93X2RhdGFfZnJvbV9wYXRoICgkcGF0aCk7CisJCW15ICRjX2ZoOworCQlvcGVuKCRjX2ZoLCAgJy18JywgImdpdCBjYXQtZmlsZSBjb21taXQgQCRyb3dfcmVmWzBdIikKKwkJCQkJb3IgZGllICJ1bmFibGUgdG8gZmluZCBjb21taXQgQCRyb3dfcmVmWzBdIjsKKwkJbXkgQGJ1ZmZlciA9IDwkY19maD47CisJCSRjb21taXRfYnVmZmVyLT5zZXRfdGV4dCgiQGJ1ZmZlciIpOworCQljbG9zZSgkY19maCk7CisJCX0pOworCitteSAkZmg7CitvcGVuKCRmaCwgJy18JywgImdpdCBjYXQtZmlsZSBibG9iICRoYXNoOiRmbiIpCisgIG9yIGRpZSAidW5hYmxlIHRvIG9wZW4gJGZuOiAkISI7CisKK3doaWxlKDwkZmg+KSB7CisgIGNob21wOworICAkZmlsZXZpZXctPntkYXRhfS0+WyQuXSA9IFsnSEVBRCcsICIkZm46JC4iLCAkX107Cit9CisKK215ICRibGFtZTsKK29wZW4oJGJsYW1lLCAnLXwnLCBxdyhnaXQgYmxhbWUgLS1pbmNyZW1lbnRhbCAtLSksICRmbiwgJGhhc2gpCisgICAgb3IgZGllICJjYW5ub3Qgc3RhcnQgZ2l0LWJsYW1lICRmbiI7CisKK0dsaWI6OklPLT5hZGRfd2F0Y2goZmlsZW5vKCRibGFtZSksICdpbicsIFwmcmVhZF9ibGFtZV9saW5lKTsKKworJHdpbmRvdy0+c2hvd19hbGw7CitHdGsyLT5tYWluOworZXhpdCAwOworCitteSAlY29tbWl0aW5mbyA9ICgpOworCitzdWIgZmx1c2hfYmxhbWVfbGluZSB7CisJbXkgKCRhdHRyKSA9IEBfOworCisJcmV0dXJuIHVubGVzcyBkZWZpbmVkICRhdHRyOworCisJbXkgKCRjb21taXQsICRzX2xubywgJGxubywgJGNudCkgPQorCSAgICBAeyRhdHRyfXtxdyhDT01NSVQgU19MTk8gTE5PIENOVCl9OworCisJbXkgKCRmaWxlbmFtZSwgJGF1dGhvciwgJGF1dGhvcl90aW1lLCAkYXV0aG9yX3R6KSA9CisJICAgIEB7JGNvbW1pdGluZm97JGNvbW1pdH19e3F3KEZJTEVOQU1FIEFVVEhPUiBBVVRIT1ItVElNRSBBVVRIT1ItVFopfTsKKwlteSAkaW5mbyA9ICRhdXRob3IgLiAnICcgLiBmb3JtYXRfdGltZSgkYXV0aG9yX3RpbWUsICRhdXRob3JfdHopOworCisJZm9yKG15ICRpID0gMDsgJGkgPCAkY250OyAkaSsrKSB7CisJCUB7JGZpbGV2aWV3LT57ZGF0YX0tPlskbG5vKyRpLTFdfVswLDEsMl0gPQorCQkoc3Vic3RyKCRjb21taXQsIDAsIDgpLCAkZmlsZW5hbWUgLiAnOicgLiAoJHNfbG5vKyRpKSk7CisJfQorfQorCitteSAkYnVmOworbXkgJGN1cnJlbnQ7CitzdWIgcmVhZF9ibGFtZV9saW5lIHsKKworCW15ICRyID0gc3lzcmVhZCgkYmxhbWUsICRidWYsIDEwMjQsIGxlbmd0aCgkYnVmKSk7CisJZGllICJJL08gZXJyb3IiIHVubGVzcyBkZWZpbmVkICRyOworCisJaWYgKCRyID09IDApIHsKKwkJZmx1c2hfYmxhbWVfbGluZSgkY3VycmVudCk7CisJCSRjdXJyZW50ID0gdW5kZWY7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgkYnVmID1+IHMvKFteXG5dKilcbi8vKSB7CisJCW15ICRsaW5lID0gJDE7CisKKwkJaWYgKCgkY29tbWl0LCAkc19sbm8sICRsbm8sICRjbnQpID0KKwkJICAgICgkbGluZSA9fiAvXihbMC05YS1mXXs0MH0pIChcZCspIChcZCspIChcZCspJC8pKSB7CisJCQlmbHVzaF9ibGFtZV9saW5lKCRjdXJyZW50KTsKKwkJCSRjdXJyZW50ID0gK3sKKwkJCQlDT01NSVQgPT4gJDEsCisJCQkJU19MTk8gPT4gJDIsCisJCQkJTE5PID0+ICQzLAorCQkJCUNOVCA9PiAkNCwKKwkJCX07CisJCQluZXh0OworCQl9CisKKwkJIyBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWVzCisJCWlmICgkbGluZSA9fiAvXihhdXRob3J8YXV0aG9yLW1haWx8YXV0aG9yLXRpbWV8YXV0aG9yLXR6fGNvbW1pdHRlcnxjb21taXR0ZXItbWFpbHxjb21taXR0ZXItdGltZXxjb21taXR0ZXItdHp8c3VtbWFyeXxmaWxlbmFtZSkgKC4qKSQvKSB7CisJCQlteSAkY29tbWl0ID0gJGN1cnJlbnQtPntDT01NSVR9OworCQkJJGNvbW1pdGluZm97JGNvbW1pdH17dWMoJDEpfSA9ICQyOworCQkJbmV4dDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3ViIGZvcm1hdF90aW1lIHsKKyAgbXkgJHRpbWUgPSBzaGlmdDsKKyAgbXkgJHR6ID0gc2hpZnQ7CisKKyAgbXkgJG1pbnV0ZXMgPSAkdHogPCAwID8gMC0kdHogOiAkdHo7CisgICRtaW51dGVzID0gKCRtaW51dGVzIC8gMTAwKSo2MCArICgkbWludXRlcyAlIDEwMCk7CisgICRtaW51dGVzID0gJHR6IDwgMCA/IDAtJG1pbnV0ZXMgOiAkbWludXRlczsKKyAgJHRpbWUgKz0gJG1pbnV0ZXMgKiA2MDsKKyAgbXkgQHQgPSBnbXRpbWUoJHRpbWUpOworICByZXR1cm4gc3ByaW50ZignJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgJXMnLAorCQkgJHRbNV0gKyAxOTAwLCBAdFs0LDMsMiwxLDBdLCAkdHopOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb21wbGV0aW9uL2dpdC1jb21wbGV0aW9uLmJhc2ggYi9jb250cmliL2NvbXBsZXRpb24vZ2l0LWNvbXBsZXRpb24uYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTcyZjBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb21wbGV0aW9uL2dpdC1jb21wbGV0aW9uLmJhc2gKQEAgLTAsMCArMSwxMDk4IEBACisjCisjIGJhc2ggY29tcGxldGlvbiBzdXBwb3J0IGZvciBjb3JlIEdpdC4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2LDIwMDcgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorIyBDb25jZXB0dWFsbHkgYmFzZWQgb24gZ2l0Y29tcGxldGlvbiAoaHR0cDovL2dpdHdlYi5oYXdhZ2Eub3JnLnVrLykuCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLjAuCisjCisjIFRoZSBjb250YWluZWQgY29tcGxldGlvbiByb3V0aW5lcyBwcm92aWRlIHN1cHBvcnQgZm9yIGNvbXBsZXRpbmc6CisjCisjICAgICopIGxvY2FsIGFuZCByZW1vdGUgYnJhbmNoIG5hbWVzCisjICAgICopIGxvY2FsIGFuZCByZW1vdGUgdGFnIG5hbWVzCisjICAgICopIC5naXQvcmVtb3RlcyBmaWxlIG5hbWVzCisjICAgICopIGdpdCAnc3ViY29tbWFuZHMnCisjICAgICopIHRyZWUgcGF0aHMgd2l0aGluICdyZWY6cGF0aC90by9maWxlJyBleHByZXNzaW9ucworIyAgICAqKSBjb21tb24gLS1sb25nLW9wdGlvbnMKKyMKKyMgVG8gdXNlIHRoZXNlIHJvdXRpbmVzOgorIworIyAgICAxKSBDb3B5IHRoaXMgZmlsZSB0byBzb21ld2hlcmUgKGUuZy4gfi8uZ2l0LWNvbXBsZXRpb24uc2gpLgorIyAgICAyKSBBZGRlZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8geW91ciAuYmFzaHJjOgorIyAgICAgICAgc291cmNlIH4vLmdpdC1jb21wbGV0aW9uLnNoCisjCisjICAgIDMpIFlvdSBtYXkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGdpdCBleGVjdXRhYmxlIGlzIGF2YWlsYWJsZQorIyAgICAgICBpbiB5b3VyIFBBVEggYmVmb3JlIHRoaXMgc2NyaXB0IGlzIHNvdXJjZWQsIGFzIHNvbWUgY2FjaGluZworIyAgICAgICBpcyBwZXJmb3JtZWQgd2hpbGUgdGhlIHNjcmlwdCBsb2Fkcy4gIElmIGdpdCBpc24ndCBmb3VuZAorIyAgICAgICBhdCBzb3VyY2UgdGltZSB0aGVuIGFsbCBsb29rdXBzIHdpbGwgYmUgZG9uZSBvbiBkZW1hbmQsCisjICAgICAgIHdoaWNoIG1heSBiZSBzbGlnaHRseSBzbG93ZXIuCisjCisjICAgIDQpIENvbnNpZGVyIGNoYW5naW5nIHlvdXIgUFMxIHRvIGFsc28gc2hvdyB0aGUgY3VycmVudCBicmFuY2g6CisjICAgICAgICBQUzE9J1tcdUBcaCBcVyQoX19naXRfcHMxICIgKCVzKSIpXVwkICcKKyMKKyMgICAgICAgVGhlIGFyZ3VtZW50IHRvIF9fZ2l0X3BzMSB3aWxsIGJlIGRpc3BsYXllZCBvbmx5IGlmIHlvdQorIyAgICAgICBhcmUgY3VycmVudGx5IGluIGEgZ2l0IHJlcG9zaXRvcnkuICBUaGUgJXMgdG9rZW4gd2lsbCBiZQorIyAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2guCisjCisjIFRvIHN1Ym1pdCBwYXRjaGVzOgorIworIyAgICAqKSBSZWFkIERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKKyMgICAgKikgU2VuZCBhbGwgcGF0Y2hlcyB0byB0aGUgY3VycmVudCBtYWludGFpbmVyOgorIworIyAgICAgICAiU2hhd24gTy4gUGVhcmNlIiA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KKyMKKyMgICAgKikgQWx3YXlzIENDIHRoZSBHaXQgbWFpbGluZyBsaXN0OgorIworIyAgICAgICBnaXRAdmdlci5rZXJuZWwub3JnCisjCisKK19fZ2l0ZGlyICgpCit7CisJaWYgWyAteiAiJDEiIF07IHRoZW4KKwkJaWYgWyAtbiAiJF9fZ2l0X2RpciIgXTsgdGhlbgorCQkJZWNobyAiJF9fZ2l0X2RpciIKKwkJZWxpZiBbIC1kIC5naXQgXTsgdGhlbgorCQkJZWNobyAuZ2l0CisJCWVsc2UKKwkJCWdpdCByZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsCisJCWZpCisJZWxpZiBbIC1kICIkMS8uZ2l0IiBdOyB0aGVuCisJCWVjaG8gIiQxLy5naXQiCisJZWxzZQorCQllY2hvICIkMSIKKwlmaQorfQorCitfX2dpdF9wczEgKCkKK3sKKwlsb2NhbCBiPSIkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPi9kZXYvbnVsbCkiCisJaWYgWyAtbiAiJGIiIF07IHRoZW4KKwkJaWYgWyAtbiAiJDEiIF07IHRoZW4KKwkJCXByaW50ZiAiJDEiICIke2IjI3JlZnMvaGVhZHMvfSIKKwkJZWxzZQorCQkJcHJpbnRmICIgKCVzKSIgIiR7YiMjcmVmcy9oZWFkcy99IgorCQlmaQorCWZpCit9CisKK19fZ2l0Y29tcCAoKQoreworCWxvY2FsIGFsbCBjIHM9JCdcbicgSUZTPScgJyQnXHQnJCdcbicKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJaWYgWyAkIyAtZ3QgMiBdOyB0aGVuCisJCWN1cj0iJDMiCisJZmkKKwlmb3IgYyBpbiAkMTsgZG8KKwkJY2FzZSAiJGMkNCIgaW4KKwkJLS0qPSopIGFsbD0iJGFsbCRjJDQkcyIgOzsKKwkJKi4pICAgIGFsbD0iJGFsbCRjJDQkcyIgOzsKKwkJKikgICAgIGFsbD0iJGFsbCRjJDQgJHMiIDs7CisJCWVzYWMKKwlkb25lCisJSUZTPSRzCisJQ09NUFJFUExZPSgkKGNvbXBnZW4gLVAgIiQyIiAtVyAiJGFsbCIgLS0gIiRjdXIiKSkKKwlyZXR1cm4KK30KKworX19naXRfaGVhZHMgKCkKK3sKKwlsb2NhbCBjbWQgaSBpc19oYXNoPXkgZGlyPSIkKF9fZ2l0ZGlyICIkMSIpIgorCWlmIFsgLWQgIiRkaXIiIF07IHRoZW4KKwkJZm9yIGkgaW4gJChnaXQgLS1naXQtZGlyPSIkZGlyIiBcCisJCQlmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSknIFwKKwkJCXJlZnMvaGVhZHMgKTsgZG8KKwkJCWVjaG8gIiR7aSNyZWZzL2hlYWRzL30iCisJCWRvbmUKKwkJcmV0dXJuCisJZmkKKwlmb3IgaSBpbiAkKGdpdC1scy1yZW1vdGUgIiQxIiAyPi9kZXYvbnVsbCk7IGRvCisJCWNhc2UgIiRpc19oYXNoLCRpIiBpbgorCQl5LCopIGlzX2hhc2g9biA7OworCQluLCpee30pIGlzX2hhc2g9eSA7OworCQluLHJlZnMvaGVhZHMvKikgaXNfaGFzaD15OyBlY2hvICIke2kjcmVmcy9oZWFkcy99IiA7OworCQluLCopIGlzX2hhc2g9eTsgZWNobyAiJGkiIDs7CisJCWVzYWMKKwlkb25lCit9CisKK19fZ2l0X3JlZnMgKCkKK3sKKwlsb2NhbCBjbWQgaSBpc19oYXNoPXkgZGlyPSIkKF9fZ2l0ZGlyICIkMSIpIgorCWlmIFsgLWQgIiRkaXIiIF07IHRoZW4KKwkJaWYgWyAtZSAiJGRpci9IRUFEIiBdOyB0aGVuIGVjaG8gSEVBRDsgZmkKKwkJZm9yIGkgaW4gJChnaXQgLS1naXQtZGlyPSIkZGlyIiBcCisJCQlmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSknIFwKKwkJCXJlZnMvdGFncyByZWZzL2hlYWRzIHJlZnMvcmVtb3Rlcyk7IGRvCisJCQljYXNlICIkaSIgaW4KKwkJCQlyZWZzL3RhZ3MvKikgICAgZWNobyAiJHtpI3JlZnMvdGFncy99IiA7OworCQkJCXJlZnMvaGVhZHMvKikgICBlY2hvICIke2kjcmVmcy9oZWFkcy99IiA7OworCQkJCXJlZnMvcmVtb3Rlcy8qKSBlY2hvICIke2kjcmVmcy9yZW1vdGVzL30iIDs7CisJCQkJKikgICAgICAgICAgICAgIGVjaG8gIiRpIiA7OworCQkJZXNhYworCQlkb25lCisJCXJldHVybgorCWZpCisJZm9yIGkgaW4gJChnaXQtbHMtcmVtb3RlICIkZGlyIiAyPi9kZXYvbnVsbCk7IGRvCisJCWNhc2UgIiRpc19oYXNoLCRpIiBpbgorCQl5LCopIGlzX2hhc2g9biA7OworCQluLCpee30pIGlzX2hhc2g9eSA7OworCQluLHJlZnMvdGFncy8qKSBpc19oYXNoPXk7IGVjaG8gIiR7aSNyZWZzL3RhZ3MvfSIgOzsKKwkJbixyZWZzL2hlYWRzLyopIGlzX2hhc2g9eTsgZWNobyAiJHtpI3JlZnMvaGVhZHMvfSIgOzsKKwkJbixyZWZzL3JlbW90ZXMvKikgaXNfaGFzaD15OyBlY2hvICIke2kjcmVmcy9yZW1vdGVzL30iIDs7CisJCW4sKikgaXNfaGFzaD15OyBlY2hvICIkaSIgOzsKKwkJZXNhYworCWRvbmUKK30KKworX19naXRfcmVmczIgKCkKK3sKKwlsb2NhbCBpCisJZm9yIGkgaW4gJChfX2dpdF9yZWZzICIkMSIpOyBkbworCQllY2hvICIkaTokaSIKKwlkb25lCit9CisKK19fZ2l0X3JlZnNfcmVtb3RlcyAoKQoreworCWxvY2FsIGNtZCBpIGlzX2hhc2g9eQorCWZvciBpIGluICQoZ2l0LWxzLXJlbW90ZSAiJDEiIDI+L2Rldi9udWxsKTsgZG8KKwkJY2FzZSAiJGlzX2hhc2gsJGkiIGluCisJCW4scmVmcy9oZWFkcy8qKQorCQkJaXNfaGFzaD15CisJCQllY2hvICIkaTpyZWZzL3JlbW90ZXMvJDEvJHtpI3JlZnMvaGVhZHMvfSIKKwkJCTs7CisJCXksKikgaXNfaGFzaD1uIDs7CisJCW4sKl57fSkgaXNfaGFzaD15IDs7CisJCW4scmVmcy90YWdzLyopIGlzX2hhc2g9eTs7CisJCW4sKikgaXNfaGFzaD15OyA7OworCQllc2FjCisJZG9uZQorfQorCitfX2dpdF9yZW1vdGVzICgpCit7CisJbG9jYWwgaSBuZ29mZiBJRlM9JCdcbicgZD0iJChfX2dpdGRpcikiCisJc2hvcHQgLXEgbnVsbGdsb2IgfHwgbmdvZmY9MQorCXNob3B0IC1zIG51bGxnbG9iCisJZm9yIGkgaW4gIiRkL3JlbW90ZXMiLyo7IGRvCisJCWVjaG8gJHtpIyRkL3JlbW90ZXMvfQorCWRvbmUKKwlbICIkbmdvZmYiIF0gJiYgc2hvcHQgLXUgbnVsbGdsb2IKKwlmb3IgaSBpbiAkKGdpdCAtLWdpdC1kaXI9IiRkIiBjb25maWcgLS1saXN0KTsgZG8KKwkJY2FzZSAiJGkiIGluCisJCXJlbW90ZS4qLnVybD0qKQorCQkJaT0iJHtpI3JlbW90ZS59IgorCQkJZWNobyAiJHtpLy51cmw9Ki99IgorCQkJOzsKKwkJZXNhYworCWRvbmUKK30KKworX19naXRfbWVyZ2Vfc3RyYXRlZ2llcyAoKQoreworCWlmIFsgLW4gIiRfX2dpdF9tZXJnZV9zdHJhdGVneWxpc3QiIF07IHRoZW4KKwkJZWNobyAiJF9fZ2l0X21lcmdlX3N0cmF0ZWd5bGlzdCIKKwkJcmV0dXJuCisJZmkKKwlzZWQgLW4gIi9eYWxsX3N0cmF0ZWdpZXM9Jy97CisJCXMvXmFsbF9zdHJhdGVnaWVzPScvLworCQlzLycvLworCQlwCisJCXEKKwkJfSIgIiQoZ2l0IC0tZXhlYy1wYXRoKS9naXQtbWVyZ2UiCit9CitfX2dpdF9tZXJnZV9zdHJhdGVneWxpc3Q9CitfX2dpdF9tZXJnZV9zdHJhdGVneWxpc3Q9IiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcyAyPi9kZXYvbnVsbCkiCisKK19fZ2l0X2NvbXBsZXRlX2ZpbGUgKCkKK3sKKwlsb2NhbCBwZnggbHMgcmVmIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCT8qOiopCisJCXJlZj0iJHtjdXIlJToqfSIKKwkJY3VyPSIke2N1ciMqOn0iCisJCWNhc2UgIiRjdXIiIGluCisJCT8qLyopCisJCQlwZng9IiR7Y3VyJS8qfSIKKwkJCWN1cj0iJHtjdXIjIyovfSIKKwkJCWxzPSIkcmVmOiRwZngiCisJCQlwZng9IiRwZngvIgorCQkJOzsKKwkJKikKKwkJCWxzPSIkcmVmIgorCQkJOzsKKwkgICAgZXNhYworCQlDT01QUkVQTFk9KCQoY29tcGdlbiAtUCAiJHBmeCIgXAorCQkJLVcgIiQoZ2l0IC0tZ2l0LWRpcj0iJChfX2dpdGRpcikiIGxzLXRyZWUgIiRscyIgXAorCQkJCXwgc2VkICcvXjEwMC4uLiBibG9iIC9zLF4uKgksLAorCQkJCSAgICAgICAvXjA0MDAwMCB0cmVlIC97CisJCQkJICAgICAgICAgICBzLF4uKgksLAorCQkJCSAgICAgICAgICAgcywkLC8sCisJCQkJICAgICAgIH0KKwkJCQkgICAgICAgcy9eLioJLy8nKSIgXAorCQkJLS0gIiRjdXIiKSkKKwkJOzsKKwkqKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCisJCTs7CisJZXNhYworfQorCitfX2dpdF9jb21wbGV0ZV9yZXZsaXN0ICgpCit7CisJbG9jYWwgcGZ4IGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCSouLi4qKQorCQlwZng9IiR7Y3VyJS4uLip9Li4uIgorCQljdXI9IiR7Y3VyIyouLi59IgorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiICIkcGZ4IiAiJGN1ciIKKwkJOzsKKwkqLi4qKQorCQlwZng9IiR7Y3VyJS4uKn0uLiIKKwkJY3VyPSIke2N1ciMqLi59IgorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiICIkcGZ4IiAiJGN1ciIKKwkJOzsKKwkqLikKKwkJX19naXRjb21wICIkY3VyLiIKKwkJOzsKKwkqKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCisJCTs7CisJZXNhYworfQorCitfX2dpdF9jb21tYW5kcyAoKQoreworCWlmIFsgLW4gIiRfX2dpdF9jb21tYW5kbGlzdCIgXTsgdGhlbgorCQllY2hvICIkX19naXRfY29tbWFuZGxpc3QiCisJCXJldHVybgorCWZpCisJbG9jYWwgaSBJRlM9IiAiJCdcbicKKwlmb3IgaSBpbiAkKGdpdCBoZWxwIC1hfGVncmVwICdeICcpCisJZG8KKwkJY2FzZSAkaSBpbgorCQlhZGQtLWludGVyYWN0aXZlKSA6IHBsdW1iaW5nOzsKKwkJYXBwbHltYm94KSAgICAgICAgOiBhc2sgZ2l0dHVzOzsKKwkJYXBwbHlwYXRjaCkgICAgICAgOiBhc2sgZ2l0dHVzOzsKKwkJYXJjaGltcG9ydCkgICAgICAgOiBpbXBvcnQ7OworCQljYXQtZmlsZSkgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJY2hlY2stYXR0cikgICAgICAgOiBwbHVtYmluZzs7CisJCWNoZWNrLXJlZi1mb3JtYXQpIDogcGx1bWJpbmc7OworCQljb21taXQtdHJlZSkgICAgICA6IHBsdW1iaW5nOzsKKwkJY29udmVydC1vYmplY3RzKSAgOiBwbHVtYmluZzs7CisJCWN2c2V4cG9ydGNvbW1pdCkgIDogZXhwb3J0OzsKKwkJY3ZzaW1wb3J0KSAgICAgICAgOiBpbXBvcnQ7OworCQljdnNzZXJ2ZXIpICAgICAgICA6IGRhZW1vbjs7CisJCWRhZW1vbikgICAgICAgICAgIDogZGFlbW9uOzsKKwkJZGlmZi1maWxlcykgICAgICAgOiBwbHVtYmluZzs7CisJCWRpZmYtaW5kZXgpICAgICAgIDogcGx1bWJpbmc7OworCQlkaWZmLXRyZWUpICAgICAgICA6IHBsdW1iaW5nOzsKKwkJZmFzdC1pbXBvcnQpICAgICAgOiBpbXBvcnQ7OworCQlmc2NrLW9iamVjdHMpICAgICA6IHBsdW1iaW5nOzsKKwkJZmV0Y2gtLXRvb2wpICAgICAgOiBwbHVtYmluZzs7CisJCWZldGNoLXBhY2spICAgICAgIDogcGx1bWJpbmc7OworCQlmbXQtbWVyZ2UtbXNnKSAgICA6IHBsdW1iaW5nOzsKKwkJZm9yLWVhY2gtcmVmKSAgICAgOiBwbHVtYmluZzs7CisJCWhhc2gtb2JqZWN0KSAgICAgIDogcGx1bWJpbmc7OworCQlodHRwLSopICAgICAgICAgICA6IHRyYW5zcG9ydDs7CisJCWluZGV4LXBhY2spICAgICAgIDogcGx1bWJpbmc7OworCQlpbml0LWRiKSAgICAgICAgICA6IGRlcHJlY2F0ZWQ7OworCQlsb2NhbC1mZXRjaCkgICAgICA6IHBsdW1iaW5nOzsKKwkJbWFpbGluZm8pICAgICAgICAgOiBwbHVtYmluZzs7CisJCW1haWxzcGxpdCkgICAgICAgIDogcGx1bWJpbmc7OworCQltZXJnZS0qKSAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJbWt0cmVlKSAgICAgICAgICAgOiBwbHVtYmluZzs7CisJCW1rdGFnKSAgICAgICAgICAgIDogcGx1bWJpbmc7OworCQlwYWNrLW9iamVjdHMpICAgICA6IHBsdW1iaW5nOzsKKwkJcGFjay1yZWR1bmRhbnQpICAgOiBwbHVtYmluZzs7CisJCXBhY2stcmVmcykgICAgICAgIDogcGx1bWJpbmc7OworCQlwYXJzZS1yZW1vdGUpICAgICA6IHBsdW1iaW5nOzsKKwkJcGF0Y2gtaWQpICAgICAgICAgOiBwbHVtYmluZzs7CisJCXBlZWstcmVtb3RlKSAgICAgIDogcGx1bWJpbmc7OworCQlwcnVuZSkgICAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcHJ1bmUtcGFja2VkKSAgICAgOiBwbHVtYmluZzs7CisJCXF1aWx0aW1wb3J0KSAgICAgIDogaW1wb3J0OzsKKwkJcmVhZC10cmVlKSAgICAgICAgOiBwbHVtYmluZzs7CisJCXJlY2VpdmUtcGFjaykgICAgIDogcGx1bWJpbmc7OworCQlyZWZsb2cpICAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcmVwby1jb25maWcpICAgICAgOiBwbHVtYmluZzs7CisJCXJlcmVyZSkgICAgICAgICAgIDogcGx1bWJpbmc7OworCQlyZXYtbGlzdCkgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcmV2LXBhcnNlKSAgICAgICAgOiBwbHVtYmluZzs7CisJCXJ1bnN0YXR1cykgICAgICAgIDogcGx1bWJpbmc7OworCQlzaC1zZXR1cCkgICAgICAgICA6IGludGVybmFsOzsKKwkJc2hlbGwpICAgICAgICAgICAgOiBkYWVtb247OworCQlzZW5kLXBhY2spICAgICAgICA6IHBsdW1iaW5nOzsKKwkJc2hvdy1pbmRleCkgICAgICAgOiBwbHVtYmluZzs7CisJCXNzaC0qKSAgICAgICAgICAgIDogdHJhbnNwb3J0OzsKKwkJc3RyaXBzcGFjZSkgICAgICAgOiBwbHVtYmluZzs7CisJCXN2bikgICAgICAgICAgICAgIDogaW1wb3J0IGV4cG9ydDs7CisJCXN2bmltcG9ydCkgICAgICAgIDogaW1wb3J0OzsKKwkJc3ltYm9saWMtcmVmKSAgICAgOiBwbHVtYmluZzs7CisJCXRhci10cmVlKSAgICAgICAgIDogZGVwcmVjYXRlZDs7CisJCXVucGFjay1maWxlKSAgICAgIDogcGx1bWJpbmc7OworCQl1bnBhY2stb2JqZWN0cykgICA6IHBsdW1iaW5nOzsKKwkJdXBkYXRlLWluZGV4KSAgICAgOiBwbHVtYmluZzs7CisJCXVwZGF0ZS1yZWYpICAgICAgIDogcGx1bWJpbmc7OworCQl1cGRhdGUtc2VydmVyLWluZm8pIDogZGFlbW9uOzsKKwkJdXBsb2FkLWFyY2hpdmUpICAgOiBwbHVtYmluZzs7CisJCXVwbG9hZC1wYWNrKSAgICAgIDogcGx1bWJpbmc7OworCQl3cml0ZS10cmVlKSAgICAgICA6IHBsdW1iaW5nOzsKKwkJdmVyaWZ5LXRhZykgICAgICAgOiBwbHVtYmluZzs7CisJCSopIGVjaG8gJGk7OworCQllc2FjCisJZG9uZQorfQorX19naXRfY29tbWFuZGxpc3Q9CitfX2dpdF9jb21tYW5kbGlzdD0iJChfX2dpdF9jb21tYW5kcyAyPi9kZXYvbnVsbCkiCisKK19fZ2l0X2FsaWFzZXMgKCkKK3sKKwlsb2NhbCBpIElGUz0kJ1xuJworCWZvciBpIGluICQoZ2l0IC0tZ2l0LWRpcj0iJChfX2dpdGRpcikiIGNvbmZpZyAtLWxpc3QpOyBkbworCQljYXNlICIkaSIgaW4KKwkJYWxpYXMuKikKKwkJCWk9IiR7aSNhbGlhcy59IgorCQkJZWNobyAiJHtpLz0qL30iCisJCQk7OworCQllc2FjCisJZG9uZQorfQorCitfX2dpdF9hbGlhc2VkX2NvbW1hbmQgKCkKK3sKKwlsb2NhbCB3b3JkIGNtZGxpbmU9JChnaXQgLS1naXQtZGlyPSIkKF9fZ2l0ZGlyKSIgXAorCQljb25maWcgLS1nZXQgImFsaWFzLiQxIikKKwlmb3Igd29yZCBpbiAkY21kbGluZTsgZG8KKwkJaWYgWyAiJHt3b3JkIyMtKn0iIF07IHRoZW4KKwkJCWVjaG8gJHdvcmQKKwkJCXJldHVybgorCQlmaQorCWRvbmUKK30KKworX19naXRfd2hpdGVzcGFjZWxpc3Q9Im5vd2FybiB3YXJuIGVycm9yIGVycm9yLWFsbCBzdHJpcCIKKworX2dpdF9hbSAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwlpZiBbIC1kIC5kb3Rlc3QgXTsgdGhlbgorCQlfX2dpdGNvbXAgIi0tc2tpcCAtLXJlc29sdmVkIgorCQlyZXR1cm4KKwlmaQorCWNhc2UgIiRjdXIiIGluCisJLS13aGl0ZXNwYWNlPSopCisJCV9fZ2l0Y29tcCAiJF9fZ2l0X3doaXRlc3BhY2VsaXN0IiAiIiAiJHtjdXIjIy0td2hpdGVzcGFjZT19IgorCQlyZXR1cm4KKwkJOzsKKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLXNpZ25vZmYgLS11dGY4IC0tYmluYXJ5IC0tM3dheSAtLWludGVyYWN0aXZlCisJCQktLXdoaXRlc3BhY2U9CisJCQkiCisJCXJldHVybgorCWVzYWMKKwlDT01QUkVQTFk9KCkKK30KKworX2dpdF9hcHBseSAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0td2hpdGVzcGFjZT0qKQorCQlfX2dpdGNvbXAgIiRfX2dpdF93aGl0ZXNwYWNlbGlzdCIgIiIgIiR7Y3VyIyMtLXdoaXRlc3BhY2U9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1zdGF0IC0tbnVtc3RhdCAtLXN1bW1hcnkgLS1jaGVjayAtLWluZGV4CisJCQktLWNhY2hlZCAtLWluZGV4LWluZm8gLS1yZXZlcnNlIC0tcmVqZWN0IC0tdW5pZGlmZi16ZXJvCisJCQktLWFwcGx5IC0tbm8tYWRkIC0tZXhjbHVkZT0KKwkJCS0td2hpdGVzcGFjZT0gLS1pbmFjY3VyYXRlLWVvZiAtLXZlcmJvc2UKKwkJCSIKKwkJcmV0dXJuCisJZXNhYworCUNPTVBSRVBMWT0oKQorfQorCitfZ2l0X2FkZCAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICItLWludGVyYWN0aXZlIgorCQlyZXR1cm4KKwllc2FjCisJQ09NUFJFUExZPSgpCit9CisKK19naXRfYmlzZWN0ICgpCit7CisJbG9jYWwgaSBjPTEgY29tbWFuZAorCXdoaWxlIFsgJGMgLWx0ICRDT01QX0NXT1JEIF07IGRvCisJCWk9IiR7Q09NUF9XT1JEU1tjXX0iCisJCWNhc2UgIiRpIiBpbgorCQlzdGFydHxiYWR8Z29vZHxyZXNldHx2aXN1YWxpemV8cmVwbGF5fGxvZykKKwkJCWNvbW1hbmQ9IiRpIgorCQkJYnJlYWsKKwkJCTs7CisJCWVzYWMKKwkJYz0kKCgrK2MpKQorCWRvbmUKKworCWlmIFsgJGMgLWVxICRDT01QX0NXT1JEIC1hIC16ICIkY29tbWFuZCIgXTsgdGhlbgorCQlfX2dpdGNvbXAgInN0YXJ0IGJhZCBnb29kIHJlc2V0IHZpc3VhbGl6ZSByZXBsYXkgbG9nIgorCQlyZXR1cm4KKwlmaQorCisJY2FzZSAiJGNvbW1hbmQiIGluCisJYmFkfGdvb2R8cmVzZXQpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJOzsKKwkqKQorCQlDT01QUkVQTFk9KCkKKwkJOzsKKwllc2FjCit9CisKK19naXRfYnJhbmNoICgpCit7CisJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorfQorCitfZ2l0X2NoZWNrb3V0ICgpCit7CisJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorfQorCitfZ2l0X2NoZXJyeSAoKQoreworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9jaGVycnlfcGljayAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICItLWVkaXQgLS1uby1jb21taXQiCisJCTs7CisJKikKKwkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorCQk7OworCWVzYWMKK30KKworX2dpdF9jb21taXQgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLWFsbCAtLWF1dGhvcj0gLS1zaWdub2ZmIC0tdmVyaWZ5IC0tbm8tdmVyaWZ5CisJCQktLWVkaXQgLS1hbWVuZCAtLWluY2x1ZGUgLS1vbmx5CisJCQkiCisJCXJldHVybgorCWVzYWMKKwlDT01QUkVQTFk9KCkKK30KKworX2dpdF9kaWZmICgpCit7CisJX19naXRfY29tcGxldGVfZmlsZQorfQorCitfZ2l0X2RpZmZfdHJlZSAoKQoreworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9mZXRjaCAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKworCWNhc2UgIiR7Q09NUF9XT1JEU1swXX0sJENPTVBfQ1dPUkQiIGluCisJZ2l0LWZldGNoKiwxKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJZ2l0LDIpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJOzsKKwkqKQorCQljYXNlICIkY3VyIiBpbgorCQkqOiopCisJCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiICIiICIke2N1ciMqOn0iCisJCQk7OworCQkqKQorCQkJbG9jYWwgcmVtb3RlCisJCQljYXNlICIke0NPTVBfV09SRFNbMF19IiBpbgorCQkJZ2l0LWZldGNoKSByZW1vdGU9IiR7Q09NUF9XT1JEU1sxXX0iIDs7CisJCQlnaXQpICAgICAgIHJlbW90ZT0iJHtDT01QX1dPUkRTWzJdfSIgOzsKKwkJCWVzYWMKKwkJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzMiAiJHJlbW90ZSIpIgorCQkJOzsKKwkJZXNhYworCQk7OworCWVzYWMKK30KKworX2dpdF9mb3JtYXRfcGF0Y2ggKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLXN0ZG91dCAtLWF0dGFjaCAtLXRocmVhZAorCQkJLS1vdXRwdXQtZGlyZWN0b3J5CisJCQktLW51bWJlcmVkIC0tc3RhcnQtbnVtYmVyCisJCQktLWtlZXAtc3ViamVjdAorCQkJLS1zaWdub2ZmCisJCQktLWluLXJlcGx5LXRvPQorCQkJLS1mdWxsLWluZGV4IC0tYmluYXJ5CisJCQktLW5vdCAtLWFsbAorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfcmV2bGlzdAorfQorCitfZ2l0X2djICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS0qKQorCQlfX2dpdGNvbXAgIi0tcHJ1bmUiCisJCXJldHVybgorCQk7OworCWVzYWMKKwlDT01QUkVQTFk9KCkKK30KKworX2dpdF9sc19yZW1vdGUgKCkKK3sKKwlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCit9CisKK19naXRfbHNfdHJlZSAoKQoreworCV9fZ2l0X2NvbXBsZXRlX2ZpbGUKK30KKworX2dpdF9sb2cgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLXByZXR0eT0qKQorCQlfX2dpdGNvbXAgIgorCQkJb25lbGluZSBzaG9ydCBtZWRpdW0gZnVsbCBmdWxsZXIgZW1haWwgcmF3CisJCQkiICIiICIke2N1ciMjLS1wcmV0dHk9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1tYXgtY291bnQ9IC0tbWF4LWFnZT0gLS1zaW5jZT0gLS1hZnRlcj0KKwkJCS0tbWluLWFnZT0gLS1iZWZvcmU9IC0tdW50aWw9CisJCQktLXJvb3QgLS10b3BvLW9yZGVyIC0tZGF0ZS1vcmRlciAtLXJldmVyc2UKKwkJCS0tbm8tbWVyZ2VzCisJCQktLWFiYnJldi1jb21taXQgLS1hYmJyZXY9CisJCQktLXJlbGF0aXZlLWRhdGUKKwkJCS0tYXV0aG9yPSAtLWNvbW1pdHRlcj0gLS1ncmVwPQorCQkJLS1hbGwtbWF0Y2gKKwkJCS0tcHJldHR5PSAtLW5hbWUtc3RhdHVzIC0tbmFtZS1vbmx5IC0tcmF3CisJCQktLW5vdCAtLWFsbAorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfcmV2bGlzdAorfQorCitfZ2l0X21lcmdlICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JELTFdfSIgaW4KKwktc3wtLXN0cmF0ZWd5KQorCQlfX2dpdGNvbXAgIiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcykiCisJCXJldHVybgorCWVzYWMKKwljYXNlICIkY3VyIiBpbgorCS0tc3RyYXRlZ3k9KikKKwkJX19naXRjb21wICIkKF9fZ2l0X21lcmdlX3N0cmF0ZWdpZXMpIiAiIiAiJHtjdXIjIy0tc3RyYXRlZ3k9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1uby1jb21taXQgLS1uby1zdW1tYXJ5IC0tc3F1YXNoIC0tc3RyYXRlZ3kKKwkJCSIKKwkJcmV0dXJuCisJZXNhYworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9tZXJnZV9iYXNlICgpCit7CisJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorfQorCitfZ2l0X25hbWVfcmV2ICgpCit7CisJX19naXRjb21wICItLXRhZ3MgLS1hbGwgLS1zdGRpbiIKK30KKworX2dpdF9wdWxsICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCisJY2FzZSAiJHtDT01QX1dPUkRTWzBdfSwkQ09NUF9DV09SRCIgaW4KKwlnaXQtcHVsbCosMSkKKwkJX19naXRjb21wICIkKF9fZ2l0X3JlbW90ZXMpIgorCQk7OworCWdpdCwyKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJKikKKwkJbG9jYWwgcmVtb3RlCisJCWNhc2UgIiR7Q09NUF9XT1JEU1swXX0iIGluCisJCWdpdC1wdWxsKSAgcmVtb3RlPSIke0NPTVBfV09SRFNbMV19IiA7OworCQlnaXQpICAgICAgIHJlbW90ZT0iJHtDT01QX1dPUkRTWzJdfSIgOzsKKwkJZXNhYworCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcyAiJHJlbW90ZSIpIgorCQk7OworCWVzYWMKK30KKworX2dpdF9wdXNoICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCisJY2FzZSAiJHtDT01QX1dPUkRTWzBdfSwkQ09NUF9DV09SRCIgaW4KKwlnaXQtcHVzaCosMSkKKwkJX19naXRjb21wICIkKF9fZ2l0X3JlbW90ZXMpIgorCQk7OworCWdpdCwyKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJKikKKwkJY2FzZSAiJGN1ciIgaW4KKwkJKjoqKQorCQkJbG9jYWwgcmVtb3RlCisJCQljYXNlICIke0NPTVBfV09SRFNbMF19IiBpbgorCQkJZ2l0LXB1c2gpICByZW1vdGU9IiR7Q09NUF9XT1JEU1sxXX0iIDs7CisJCQlnaXQpICAgICAgIHJlbW90ZT0iJHtDT01QX1dPUkRTWzJdfSIgOzsKKwkJCWVzYWMKKwkJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzICIkcmVtb3RlIikiICIiICIke2N1ciMqOn0iCisJCQk7OworCQkqKQorCQkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMyKSIKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwllc2FjCit9CisKK19naXRfcmViYXNlICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWlmIFsgLWQgLmRvdGVzdCBdIHx8IFsgLWQgLmdpdC8uZG90ZXN0LW1lcmdlIF07IHRoZW4KKwkJX19naXRjb21wICItLWNvbnRpbnVlIC0tc2tpcCAtLWFib3J0IgorCQlyZXR1cm4KKwlmaQorCWNhc2UgIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JELTFdfSIgaW4KKwktc3wtLXN0cmF0ZWd5KQorCQlfX2dpdGNvbXAgIiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcykiCisJCXJldHVybgorCWVzYWMKKwljYXNlICIkY3VyIiBpbgorCS0tc3RyYXRlZ3k9KikKKwkJX19naXRjb21wICIkKF9fZ2l0X21lcmdlX3N0cmF0ZWdpZXMpIiAiIiAiJHtjdXIjIy0tc3RyYXRlZ3k9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIi0tb250byAtLW1lcmdlIC0tc3RyYXRlZ3kiCisJCXJldHVybgorCWVzYWMKKwlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCit9CisKK19naXRfY29uZmlnICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWxvY2FsIHBydj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkQtMV19IgorCWNhc2UgIiRwcnYiIGluCisJYnJhbmNoLioucmVtb3RlKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCXJldHVybgorCQk7OworCWJyYW5jaC4qLm1lcmdlKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCisJCXJldHVybgorCQk7OworCXJlbW90ZS4qLmZldGNoKQorCQlsb2NhbCByZW1vdGU9IiR7cHJ2I3JlbW90ZS59IgorCQlyZW1vdGU9IiR7cmVtb3RlJS5mZXRjaH0iCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzX3JlbW90ZXMgIiRyZW1vdGUiKSIKKwkJcmV0dXJuCisJCTs7CisJcmVtb3RlLioucHVzaCkKKwkJbG9jYWwgcmVtb3RlPSIke3BydiNyZW1vdGUufSIKKwkJcmVtb3RlPSIke3JlbW90ZSUucHVzaH0iCisJCV9fZ2l0Y29tcCAiJChnaXQgLS1naXQtZGlyPSIkKF9fZ2l0ZGlyKSIgXAorCQkJZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSclKHJlZm5hbWUpOiUocmVmbmFtZSknIFwKKwkJCXJlZnMvaGVhZHMpIgorCQlyZXR1cm4KKwkJOzsKKwlwdWxsLnR3b2hlYWR8cHVsbC5vY3RvcHVzKQorCQlfX2dpdGNvbXAgIiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcykiCisJCXJldHVybgorCQk7OworCWNvbG9yLmJyYW5jaHxjb2xvci5kaWZmfGNvbG9yLnN0YXR1cykKKwkJX19naXRjb21wICJhbHdheXMgbmV2ZXIgYXV0byIKKwkJcmV0dXJuCisJCTs7CisJY29sb3IuKi4qKQorCQlfX2dpdGNvbXAgIgorCQkJYmxhY2sgcmVkIGdyZWVuIHllbGxvdyBibHVlIG1hZ2VudGEgY3lhbiB3aGl0ZQorCQkJYm9sZCBkaW0gdWwgYmxpbmsgcmV2ZXJzZQorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwkqLiopCisJCUNPTVBSRVBMWT0oKQorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLWdsb2JhbCAtLXN5c3RlbQorCQkJLS1saXN0IC0tcmVwbGFjZS1hbGwKKwkJCS0tZ2V0IC0tZ2V0LWFsbCAtLWdldC1yZWdleHAKKwkJCS0tYWRkIC0tdW5zZXQgLS11bnNldC1hbGwKKwkJCS0tcmVtb3ZlLXNlY3Rpb24gLS1yZW5hbWUtc2VjdGlvbgorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwlicmFuY2guKi4qKQorCQlsb2NhbCBwZng9IiR7Y3VyJS4qfS4iCisJCWN1cj0iJHtjdXIjIyoufSIKKwkJX19naXRjb21wICJyZW1vdGUgbWVyZ2UiICIkcGZ4IiAiJGN1ciIKKwkJcmV0dXJuCisJCTs7CisJYnJhbmNoLiopCisJCWxvY2FsIHBmeD0iJHtjdXIlLip9LiIKKwkJY3VyPSIke2N1ciMqLn0iCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9oZWFkcykiICIkcGZ4IiAiJGN1ciIgIi4iCisJCXJldHVybgorCQk7OworCXJlbW90ZS4qLiopCisJCWxvY2FsIHBmeD0iJHtjdXIlLip9LiIKKwkJY3VyPSIke2N1ciMjKi59IgorCQlfX2dpdGNvbXAgIgorCQkJdXJsIGZldGNoIHB1c2ggc2tpcERlZmF1bHRVcGRhdGUKKwkJCXJlY2VpdmVwYWNrIHVwbG9hZHBhY2sgdGFnb3B0CisJCQkiICIkcGZ4IiAiJGN1ciIKKwkJcmV0dXJuCisJCTs7CisJcmVtb3RlLiopCisJCWxvY2FsIHBmeD0iJHtjdXIlLip9LiIKKwkJY3VyPSIke2N1ciMqLn0iCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIgIiRwZngiICIkY3VyIiAiLiIKKwkJcmV0dXJuCisJCTs7CisJZXNhYworCV9fZ2l0Y29tcCAiCisJCWFwcGx5LndoaXRlc3BhY2UKKwkJY29yZS5maWxlTW9kZQorCQljb3JlLmdpdFByb3h5CisJCWNvcmUuaWdub3JlU3RhdAorCQljb3JlLnByZWZlclN5bWxpbmtSZWZzCisJCWNvcmUubG9nQWxsUmVmVXBkYXRlcworCQljb3JlLnJlcG9zaXRvcnlGb3JtYXRWZXJzaW9uCisJCWNvcmUuc2hhcmVkUmVwb3NpdG9yeQorCQljb3JlLndhcm5BbWJpZ3VvdXNSZWZzCisJCWNvcmUuY29tcHJlc3Npb24KKwkJY29yZS5sZWdhY3lIZWFkZXJzCisJCWNvcmUucGFja2VkR2l0V2luZG93U2l6ZQorCQljb3JlLnBhY2tlZEdpdExpbWl0CisJCWNsZWFuLnJlcXVpcmVGb3JjZQorCQljb2xvci5icmFuY2gKKwkJY29sb3IuYnJhbmNoLmN1cnJlbnQKKwkJY29sb3IuYnJhbmNoLmxvY2FsCisJCWNvbG9yLmJyYW5jaC5yZW1vdGUKKwkJY29sb3IuYnJhbmNoLnBsYWluCisJCWNvbG9yLmRpZmYKKwkJY29sb3IuZGlmZi5wbGFpbgorCQljb2xvci5kaWZmLm1ldGEKKwkJY29sb3IuZGlmZi5mcmFnCisJCWNvbG9yLmRpZmYub2xkCisJCWNvbG9yLmRpZmYubmV3CisJCWNvbG9yLmRpZmYuY29tbWl0CisJCWNvbG9yLmRpZmYud2hpdGVzcGFjZQorCQljb2xvci5wYWdlcgorCQljb2xvci5zdGF0dXMKKwkJY29sb3Iuc3RhdHVzLmhlYWRlcgorCQljb2xvci5zdGF0dXMuYWRkZWQKKwkJY29sb3Iuc3RhdHVzLmNoYW5nZWQKKwkJY29sb3Iuc3RhdHVzLnVudHJhY2tlZAorCQlkaWZmLnJlbmFtZUxpbWl0CisJCWRpZmYucmVuYW1lcworCQlmZXRjaC51bnBhY2tMaW1pdAorCQlmb3JtYXQuaGVhZGVycworCQlnaXRjdnMuZW5hYmxlZAorCQlnaXRjdnMubG9nZmlsZQorCQlnaXRjdnMuYWxsYmluYXJ5CisJCWdpdGN2cy5kYm5hbWUgZ2l0Y3ZzLmRiZHJpdmVyIGdpdGN2cy5kYnVzZXIgZ2l0Y3ZzLmR2cGFzcworCQlnYy5wYWNrcmVmcworCQlnYy5yZWZsb2dleHBpcmUKKwkJZ2MucmVmbG9nZXhwaXJldW5yZWFjaGFibGUKKwkJZ2MucmVyZXJlcmVzb2x2ZWQKKwkJZ2MucmVyZXJldW5yZXNvbHZlZAorCQlodHRwLnNzbFZlcmlmeQorCQlodHRwLnNzbENlcnQKKwkJaHR0cC5zc2xLZXkKKwkJaHR0cC5zc2xDQUluZm8KKwkJaHR0cC5zc2xDQVBhdGgKKwkJaHR0cC5tYXhSZXF1ZXN0cworCQlodHRwLmxvd1NwZWVkTGltaXQKKwkJaHR0cC5sb3dTcGVlZFRpbWUKKwkJaHR0cC5ub0VQU1YKKwkJaTE4bi5jb21taXRFbmNvZGluZworCQlpMThuLmxvZ091dHB1dEVuY29kaW5nCisJCWxvZy5zaG93cm9vdAorCQltZXJnZS50b29sCisJCW1lcmdlLnN1bW1hcnkKKwkJbWVyZ2UudmVyYm9zaXR5CisJCXBhY2sud2luZG93CisJCXBhY2suZGVwdGgKKwkJcHVsbC5vY3RvcHVzCisJCXB1bGwudHdvaGVhZAorCQlyZXBhY2sudXNlRGVsdGFCYXNlT2Zmc2V0CisJCXNob3cuZGlmZnRyZWUKKwkJc2hvd2JyYW5jaC5kZWZhdWx0CisJCXRhci51bWFzaworCQl0cmFuc2Zlci51bnBhY2tMaW1pdAorCQlyZWNlaXZlLnVucGFja0xpbWl0CisJCXJlY2VpdmUuZGVueU5vbkZhc3RGb3J3YXJkcworCQl1c2VyLm5hbWUKKwkJdXNlci5lbWFpbAorCQl1c2VyLnNpZ25pbmdrZXkKKwkJd2hhdGNoYW5nZWQuZGlmZnRyZWUKKwkJYnJhbmNoLiByZW1vdGUuCisJIgorfQorCitfZ2l0X3JlbW90ZSAoKQoreworCWxvY2FsIGkgYz0xIGNvbW1hbmQKKwl3aGlsZSBbICRjIC1sdCAkQ09NUF9DV09SRCBdOyBkbworCQlpPSIke0NPTVBfV09SRFNbY119IgorCQljYXNlICIkaSIgaW4KKwkJYWRkfHNob3d8cHJ1bmV8dXBkYXRlKSBjb21tYW5kPSIkaSI7IGJyZWFrIDs7CisJCWVzYWMKKwkJYz0kKCgrK2MpKQorCWRvbmUKKworCWlmIFsgJGMgLWVxICRDT01QX0NXT1JEIC1hIC16ICIkY29tbWFuZCIgXTsgdGhlbgorCQlfX2dpdGNvbXAgImFkZCBzaG93IHBydW5lIHVwZGF0ZSIKKwkJcmV0dXJuCisJZmkKKworCWNhc2UgIiRjb21tYW5kIiBpbgorCXNob3d8cHJ1bmUpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJOzsKKwl1cGRhdGUpCisJCWxvY2FsIGkgYz0nJyBJRlM9JCdcbicKKwkJZm9yIGkgaW4gJChnaXQgLS1naXQtZGlyPSIkKF9fZ2l0ZGlyKSIgY29uZmlnIC0tbGlzdCk7IGRvCisJCQljYXNlICIkaSIgaW4KKwkJCXJlbW90ZXMuKikKKwkJCQlpPSIke2kjcmVtb3Rlcy59IgorCQkJCWM9IiRjICR7aS89Ki99IgorCQkJCTs7CisJCQllc2FjCisJCWRvbmUKKwkJX19naXRjb21wICIkYyIKKwkJOzsKKwkqKQorCQlDT01QUkVQTFk9KCkKKwkJOzsKKwllc2FjCit9CisKK19naXRfcmVzZXQgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiLS1taXhlZCAtLWhhcmQgLS1zb2Z0IgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorfQorCitfZ2l0X3Nob3J0bG9nICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1tYXgtY291bnQ9IC0tbWF4LWFnZT0gLS1zaW5jZT0gLS1hZnRlcj0KKwkJCS0tbWluLWFnZT0gLS1iZWZvcmU9IC0tdW50aWw9CisJCQktLW5vLW1lcmdlcworCQkJLS1hdXRob3I9IC0tY29tbWl0dGVyPSAtLWdyZXA9CisJCQktLWFsbC1tYXRjaAorCQkJLS1ub3QgLS1hbGwKKwkJCS0tbnVtYmVyZWQgLS1zdW1tYXJ5CisJCQkiCisJCXJldHVybgorCQk7OworCWVzYWMKKwlfX2dpdF9jb21wbGV0ZV9yZXZsaXN0Cit9CisKK19naXRfc2hvdyAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tcHJldHR5PSopCisJCV9fZ2l0Y29tcCAiCisJCQlvbmVsaW5lIHNob3J0IG1lZGl1bSBmdWxsIGZ1bGxlciBlbWFpbCByYXcKKwkJCSIgIiIgIiR7Y3VyIyMtLXByZXR0eT19IgorCQlyZXR1cm4KKwkJOzsKKwktLSopCisJCV9fZ2l0Y29tcCAiLS1wcmV0dHk9IgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfZmlsZQorfQorCitfZ2l0ICgpCit7CisJbG9jYWwgaSBjPTEgY29tbWFuZCBfX2dpdF9kaXIKKworCXdoaWxlIFsgJGMgLWx0ICRDT01QX0NXT1JEIF07IGRvCisJCWk9IiR7Q09NUF9XT1JEU1tjXX0iCisJCWNhc2UgIiRpIiBpbgorCQktLWdpdC1kaXI9KikgX19naXRfZGlyPSIke2kjLS1naXQtZGlyPX0iIDs7CisJCS0tYmFyZSkgICAgICBfX2dpdF9kaXI9Ii4iIDs7CisJCS0tdmVyc2lvbnwtLWhlbHB8LXB8LS1wYWdpbmF0ZSkgOzsKKwkJKikgY29tbWFuZD0iJGkiOyBicmVhayA7OworCQllc2FjCisJCWM9JCgoKytjKSkKKwlkb25lCisKKwlpZiBbICRjIC1lcSAkQ09NUF9DV09SRCAtYSAteiAiJGNvbW1hbmQiIF07IHRoZW4KKwkJY2FzZSAiJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIgaW4KKwkJLS0qPSopIENPTVBSRVBMWT0oKSA7OworCQktLSopICAgX19naXRjb21wICItLWdpdC1kaXI9IC0tYmFyZSAtLXZlcnNpb24gLS1leGVjLXBhdGgiIDs7CisJCSopICAgICBfX2dpdGNvbXAgIiQoX19naXRfY29tbWFuZHMpICQoX19naXRfYWxpYXNlcykiIDs7CisJCWVzYWMKKwkJcmV0dXJuCisJZmkKKworCWxvY2FsIGV4cGFuc2lvbj0kKF9fZ2l0X2FsaWFzZWRfY29tbWFuZCAiJGNvbW1hbmQiKQorCVsgIiRleHBhbnNpb24iIF0gJiYgY29tbWFuZD0iJGV4cGFuc2lvbiIKKworCWNhc2UgIiRjb21tYW5kIiBpbgorCWFtKSAgICAgICAgICBfZ2l0X2FtIDs7CisJYWRkKSAgICAgICAgIF9naXRfYWRkIDs7CisJYXBwbHkpICAgICAgIF9naXRfYXBwbHkgOzsKKwliaXNlY3QpICAgICAgX2dpdF9iaXNlY3QgOzsKKwlicmFuY2gpICAgICAgX2dpdF9icmFuY2ggOzsKKwljaGVja291dCkgICAgX2dpdF9jaGVja291dCA7OworCWNoZXJyeSkgICAgICBfZ2l0X2NoZXJyeSA7OworCWNoZXJyeS1waWNrKSBfZ2l0X2NoZXJyeV9waWNrIDs7CisJY29tbWl0KSAgICAgIF9naXRfY29tbWl0IDs7CisJY29uZmlnKSAgICAgIF9naXRfY29uZmlnIDs7CisJZGlmZikgICAgICAgIF9naXRfZGlmZiA7OworCWZldGNoKSAgICAgICBfZ2l0X2ZldGNoIDs7CisJZm9ybWF0LXBhdGNoKSBfZ2l0X2Zvcm1hdF9wYXRjaCA7OworCWdjKSAgICAgICAgICBfZ2l0X2djIDs7CisJbG9nKSAgICAgICAgIF9naXRfbG9nIDs7CisJbHMtcmVtb3RlKSAgIF9naXRfbHNfcmVtb3RlIDs7CisJbHMtdHJlZSkgICAgIF9naXRfbHNfdHJlZSA7OworCW1lcmdlKSAgICAgICBfZ2l0X21lcmdlOzsKKwltZXJnZS1iYXNlKSAgX2dpdF9tZXJnZV9iYXNlIDs7CisJbmFtZS1yZXYpICAgIF9naXRfbmFtZV9yZXYgOzsKKwlwdWxsKSAgICAgICAgX2dpdF9wdWxsIDs7CisJcHVzaCkgICAgICAgIF9naXRfcHVzaCA7OworCXJlYmFzZSkgICAgICBfZ2l0X3JlYmFzZSA7OworCXJlbW90ZSkgICAgICBfZ2l0X3JlbW90ZSA7OworCXJlc2V0KSAgICAgICBfZ2l0X3Jlc2V0IDs7CisJc2hvcnRsb2cpICAgIF9naXRfc2hvcnRsb2cgOzsKKwlzaG93KSAgICAgICAgX2dpdF9zaG93IDs7CisJc2hvdy1icmFuY2gpIF9naXRfbG9nIDs7CisJd2hhdGNoYW5nZWQpIF9naXRfbG9nIDs7CisJKikgICAgICAgICAgIENPTVBSRVBMWT0oKSA7OworCWVzYWMKK30KKworX2dpdGsgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiLS1ub3QgLS1hbGwiCisJCXJldHVybgorCQk7OworCWVzYWMKKwlfX2dpdF9jb21wbGV0ZV9yZXZsaXN0Cit9CisKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0IGdpdAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRrIGdpdGsKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2FtIGdpdC1hbQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYXBwbHkgZ2l0LWFwcGx5Citjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9iaXNlY3QgZ2l0LWJpc2VjdAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYnJhbmNoIGdpdC1icmFuY2gKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2NoZWNrb3V0IGdpdC1jaGVja291dAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY2hlcnJ5IGdpdC1jaGVycnkKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2NoZXJyeV9waWNrIGdpdC1jaGVycnktcGljaworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY29tbWl0IGdpdC1jb21taXQKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2RpZmYgZ2l0LWRpZmYKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2ZldGNoIGdpdC1mZXRjaAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfZm9ybWF0X3BhdGNoIGdpdC1mb3JtYXQtcGF0Y2gKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2djIGdpdC1nYworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbG9nIGdpdC1sb2cKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xzX3JlbW90ZSBnaXQtbHMtcmVtb3RlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sc190cmVlIGdpdC1scy10cmVlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9tZXJnZSBnaXQtbWVyZ2UKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X21lcmdlX2Jhc2UgZ2l0LW1lcmdlLWJhc2UKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X25hbWVfcmV2IGdpdC1uYW1lLXJldgorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfcHVsbCBnaXQtcHVsbAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfcHVzaCBnaXQtcHVzaAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfcmViYXNlIGdpdC1yZWJhc2UKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2NvbmZpZyBnaXQtY29uZmlnCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9yZW1vdGUgZ2l0LXJlbW90ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfcmVzZXQgZ2l0LXJlc2V0Citjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9zaG9ydGxvZyBnaXQtc2hvcnRsb2cKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3cgZ2l0LXNob3cKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xvZyBnaXQtc2hvdy1icmFuY2gKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xvZyBnaXQtd2hhdGNoYW5nZWQKKworIyBUaGUgZm9sbG93aW5nIGFyZSBuZWNlc3Nhcnkgb25seSBmb3IgQ3lnd2luLCBhbmQgb25seSBhcmUgbmVlZGVkCisjIHdoZW4gdGhlIHVzZXIgaGFzIHRhYi1jb21wbGV0ZWQgdGhlIGV4ZWN1dGFibGUgbmFtZSBhbmQgY29uc2VxdWVudGx5CisjIGluY2x1ZGVkIHRoZSAnLmV4ZScgc3VmZml4LgorIworaWYgWyBDeWd3aW4gPSAiJCh1bmFtZSAtbyAyPi9kZXYvbnVsbCkiIF07IHRoZW4KK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2FkZCBnaXQtYWRkLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYXBwbHkgZ2l0LWFwcGx5LmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXQgZ2l0LmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYnJhbmNoIGdpdC1icmFuY2guZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9jaGVycnkgZ2l0LWNoZXJyeS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2RpZmYgZ2l0LWRpZmYuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9mb3JtYXRfcGF0Y2ggZ2l0LWZvcm1hdC1wYXRjaC5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xvZyBnaXQtbG9nLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbHNfdHJlZSBnaXQtbHMtdHJlZS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X21lcmdlX2Jhc2UgZ2l0LW1lcmdlLWJhc2UuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9uYW1lX3JldiBnaXQtbmFtZS1yZXYuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9wdXNoIGdpdC1wdXNoLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY29uZmlnIGdpdC1jb25maWcKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3J0bG9nIGdpdC1zaG9ydGxvZy5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3cgZ2l0LXNob3cuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sb2cgZ2l0LXNob3ctYnJhbmNoLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbG9nIGdpdC13aGF0Y2hhbmdlZC5leGUKK2ZpCmRpZmYgLS1naXQgYS9jb250cmliL2NvbnRpbnVvdXMvY2lkYWVtb24gYi9jb250cmliL2NvbnRpbnVvdXMvY2lkYWVtb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwOWExNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvY29udGludW91cy9jaWRhZW1vbgpAQCAtMCwwICsxLDUwMyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEEgZGFlbW9uIHRoYXQgd2FpdHMgZm9yIHVwZGF0ZSBldmVudHMgc2VudCBieSBpdHMgY29tcGFuaW9uCisjIHBvc3QtcmVjZWl2ZS1jaW5vdGlmeSBob29rLCBjaGVja3Mgb3V0IGEgbmV3IGNvcHkgb2Ygc291cmNlLAorIyBjb21waWxlcyBpdCwgYW5kIGVtYWlscyB0aGUgZ3VpbHR5IHBhcnRpZXMgaWYgdGhlIGNvbXBpbGUKKyMgKGFuZCBvcHRpb25hbGx5IHRlc3Qgc3VpdGUpIGZhaWxzLgorIworIyBUbyB1c2UgdGhpcyBkYWVtb24sIGNvbmZpZ3VyZSBpdCBhbmQgcnVuIGl0LiAgSXQgd2lsbCBkaXNjb25uZWN0CisjIGZyb20geW91ciB0ZXJtaW5hbCBhbmQgZm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIGRhZW1vbiBtdXN0CisjIGhhdmUgbG9jYWwgZmlsZXN5c3RlbSBhY2Nlc3MgdG8gdGhlIHNvdXJjZSByZXBvc2l0b3JpZXMsIGFzIGl0CisjIHVzZXMgb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgdG8gYXZvaWQgY29weWluZyBvYmplY3RzLgorIworIyBBZGQgaXRzIGNvbXBhbmlvbiBwb3N0LXJlY2VpdmUtY2lub3RpZnkgaG9vayBhcyB0aGUgcG9zdC1yZWNlaXZlCisjIGhvb2sgdG8gZWFjaCByZXBvc2l0b3J5IHRoYXQgdGhlIGRhZW1vbiBzaG91bGQgbW9uaXRvci4gIFllcywgYQorIyBzaW5nbGUgZGFlbW9uIGNhbiBtb25pdG9yIG1vcmUgdGhhbiBvbmUgcmVwb3NpdG9yeS4KKyMKKyMgVG8gdXNlIG11bHRpcGxlIGRhZW1vbnMgb24gdGhlIHNhbWUgc3lzdGVtLCBnaXZlIHRoZW0gZWFjaCBhCisjIHVuaXF1ZSBxdWV1ZSBmaWxlIGFuZCB0bXBkaXIuCisjCisjIEdsb2JhbCBDb25maWcKKyMgLS0tLS0tLS0tLS0tLQorIyBSZWFkcyBmcm9tIGEgR2l0IHN0eWxlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgd2lsbCBiZQorIyB+Ly5naXRjb25maWcgYnkgZGVmYXVsdCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZworIyB0aGUgR0lUX0NPTkZJR19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSBzdGFydGluZy4KKyMKKyMgY2lkYWVtb24uc210cEhvc3QKKyMgICBIb3N0bmFtZSBvZiB0aGUgU01UUCBzZXJ2ZXIgdGhlIGRhZW1vbiB3aWxsIHNlbmQgZW1haWwKKyMgICB0aHJvdWdoLiAgRGVmYXVsdHMgdG8gJ2xvY2FsaG9zdCcuCisjCisjIGNpZGFlbW9uLnNtdHBVc2VyCisjICAgVXNlcm5hbWUgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBTTVRQIHNlcnZlciBhcy4gIFRoaXMKKyMgICB2YXJpYWJsZSBpcyBvcHRpb25hbDsgaWYgaXQgaXMgbm90IHN1cHBsaWVkIHRoZW4gbm8KKyMgICBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4KKyMKKyMgY2lkYWVtb24uc210cFBhc3N3b3JkCisjICAgUGFzc3dvcmQgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBTTVRQIHNlcnZlciBhcy4gIFRoaXMKKyMgICB2YXJpYWJsZSBpcyBvcHRpb25hbC4gIElmIG5vdCBzdXBwbGllZCBidXQgc210cFVzZXIgd2FzLAorIyAgIHRoZSBkYWVtb24gcHJvbXB0cyBmb3IgdGhlIHBhc3N3b3JkIGJlZm9yZSBmb3JraW5nIGludG8KKyMgICB0aGUgYmFja2dyb3VuZC4KKyMKKyMgY2lkYWVtb24uc210cEF1dGgKKyMgICBUeXBlIG9mIGF1dGhlbnRpY2F0aW9uIHRvIHBlcmZvcm0gd2l0aCB0aGUgU01UUCBzZXJ2ZXIuCisjICAgSWYgc2V0IHRvICdsb2dpbicgYW5kIHNtdHBVc2VyIHdhcyBkZWZpbmVkLCB0aGlzIHdpbGwKKyMgICB1c2UgdGhlIEFVVEggTE9HSU4gY29tbWFuZCwgd2hpY2ggaXMgc3VpdGFibGUgZm9yIHVzZQorIyAgIHdpdGggYXQgbGVhc3Qgb25lIHZlcnNpb24gb2YgTWljcm9zb2Z0IEV4Y2hhbmdlIFNlcnZlci4KKyMgICBJZiBub3Qgc2V0IHRoZSBkYWVtb24gd2lsbCB1c2Ugd2hhdGV2ZXIgYXV0aCBtZXRob2RzCisjICAgYXJlIHN1cHBvcnRlZCBieSB5b3VyIHZlcnNpb24gb2YgTmV0OjpTTVRQLgorIworIyBjaWRhZW1vbi5lbWFpbAorIyAgIEVtYWlsIGFkZHJlc3MgdGhhdCBkYWVtb24gZ2VuZXJhdGVkIGVtYWlscyB3aWxsIGJlIHNlbnQKKyMgICBmcm9tLiAgVGhpcyBzaG91bGQgYmUgYSB1c2VmdWwgZW1haWwgYWRkcmVzcyB3aXRoaW4geW91cgorIyAgIG9yZ2FuaXphdGlvbi4gIFJlcXVpcmVkLgorIworIyBjaWRhZW1vbi5uYW1lCisjICAgSHVtYW4gZnJpZW5kbHkgbmFtZSB0aGF0IHRoZSBkYWVtb24gd2lsbCBzZW5kIGVtYWlscyBhcy4KKyMgICBEZWZhdWx0cyB0byAnY2lkYWVtb24nLgorIworIyBjaWRhZW1vbi5zY2FuRGVsYXkKKyMgICBOdW1iZXIgb2Ygc2Vjb25kcyB0byBzbGVlcCBiZXR3ZWVuIHBvbGxzIG9mIHRoZSBxdWV1ZSBmaWxlLgorIyAgIERlZmF1bHRzIHRvIDYwLgorIworIyBjaWRhZW1vbi5yZWNlbnRDYWNoZQorIyAgIE51bWJlciBvZiByZWNlbnQgY29tbWl0IFNIQS0xcyBwZXIgcmVwb3NpdG9yeSB0byBjYWNoZSBhbmQKKyMgICBza2lwIGJ1aWxkaW5nIGlmIHRoZXkgYXBwZWFyIGFnYWluLiAgVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQKKyMgICByZWJ1aWxkaW5nIHRoZSBzYW1lIGNvbW1pdCBtdWx0aXBsZSB0aW1lcyBqdXN0IGJlY2F1c2UgaXQgd2FzCisjICAgcHVzaGVkIGludG8gbW9yZSB0aGFuIG9uZSBicmFuY2guICBEZWZhdWx0cyB0byAxMDAuCisjCisjIGNpZGFlbW9uLnRtcGRpcgorIyAgIFNjcmF0Y2ggZGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgYnVpbGRzIHdpdGhpbi4gIFRoZSBkYWVtb24KKyMgICBtYWtlcyBhIG5ldyBzdWJkaXJlY3RvcnkgZm9yIGVhY2ggYnVpbGQsIHRoZW4gZGVsZXRlcyBpdCB3aGVuCisjICAgdGhlIGJ1aWxkIGhhcyBmaW5pc2hlZC4gIFRoZSBwaWQgZmlsZSBpcyBhbHNvIHBsYWNlZCBoZXJlLgorIyAgIERlZmF1bHRzIHRvICcvdG1wJy4KKyMKKyMgY2lkYWVtb24ucXVldWUKKyMgICBQYXRoIHRvIHRoZSBxdWV1ZSBmaWxlIHRoYXQgdGhlIHBvc3QtcmVjZWl2ZS1jaW5vdGlmeSBob29rCisjICAgYXBwZW5kcyBldmVudHMgdG8uICBUaGlzIGZpbGUgaXMgcG9sbGVkIGJ5IHRoZSBkYWVtb24uICBJdAorIyAgIG11c3Qgbm90IGJlIG9uIGFuIE5GUyBtb3VudCAodXNlcyBmbG9jaykuICBSZXF1aXJlZC4KKyMKKyMgY2lkYWVtb24ubm9jYworIyAgIFBlcmwgcmVnZXggcGF0dGVybnMgdG8gbWF0Y2ggYWdhaW5zdCBhdXRob3IgYW5kIGNvbW1pdHRlcgorIyAgIGxpbmVzLiAgSWYgYSBwYXR0ZXJuIG1hdGNoZXMsIHRoYXQgYXV0aG9yIG9yIGNvbW1pdHRlciB3aWxsCisjICAgbm90IGJlIG5vdGlmaWVkIG9mIGEgYnVpbGQgZmFpbHVyZS4KKyMKKyMgUGVyIFJlcG9zaXRvcnkgQ29uZmlnCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVhZCBmcm9tIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSdzIGNvbmZpZyBmaWxlLgorIworIyBidWlsZGVyLmNvbW1hbmQKKyMgICBTaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkLiAgVGhpcyBjb21tYW5kIG11c3QKKyMgICByZXR1cm4gMCBvbiAic3VjY2VzcyIgYW5kIG5vbi16ZXJvIG9uIGZhaWx1cmUuICBJZiB5b3UKKyMgICBhbHNvIHdhbnQgdG8gcnVuIGEgdGVzdCBzdWl0ZSwgbWFrZSBzdXJlIHlvdXIgY29tbWFuZAorIyAgIGRvZXMgdGhhdCB0b28uICBSZXF1aXJlZC4KKyMKKyMgYnVpbGRlci5xdWV1ZQorIyAgIFF1ZXVlIGZpbGUgdG8gbm90aWZ5IHRoZSBjaWRhZW1vbiB0aHJvdWdoLiAgU2hvdWxkIG1hdGNoCisjICAgY2lkYWVtb24ucXVldWUuICBJZiBub3Qgc2V0IHRoZSBob29rIHdpbGwgbm90IG5vdGlmeSB0aGUKKyMgICBjaWRhZW1vbi4KKyMKKyMgYnVpbGRlci5za2lwCisjICAgUGVybCByZWdleCBwYXR0ZXJucyBvZiByZWZzIHRoYXQgc2hvdWxkIG5vdCBiZSBzZW50IHRvCisjICAgY2lkYWVtb24uICBVcGRhdGVzIG9mIHRoZXNlIHJlZnMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBidWlsZGVyLm5ld0JyYW5jaEJhc2UKKyMgICBHbG9iIHBhdHRlcm5zIG9mIHJlZnMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBmb3JtIHRoZQorIyAgICdvbGQnIHJldmlvbnMgb2YgYSBuZXdseSBjcmVhdGVkIHJlZi4gIFRoaXMgc2hvdWxkIHNldAorIyAgIHRvIGJlIGdsb2JzIHRoYXQgbWF0Y2ggeW91ciAnbWFpbmxpbmUnIGJyYW5jaGVzLiAgVGhpcworIyAgIHdheSBhIGJ1aWxkIGZhaWx1cmUgb2YgYSBicmFuZCBuZXcgdG9waWMgYnJhbmNoIGRvZXMgbm90CisjICAgYXR0ZW1wdCB0byBlbWFpbCBldmVyeW9uZSBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRpbWU7CisjICAgaW5zdGVhZCBpdCBvbmx5IGVtYWlscyB0aG9zZSBhdXRob3JzIG9mIGNvbW1pdHMgbm90IGluCisjICAgdGhlc2UgJ21haW5saW5lJyBicmFuY2hlcy4KKworbG9jYWwgJEVOVntQQVRIfSA9IGpvaW4gJzonLCBxdygKKwkvb3B0L2dpdC9iaW4KKwkvdXNyL2JpbgorCS9iaW4KKwkpOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwordXNlIEZpbGU6OlNwZWM7Cit1c2UgbGliIEZpbGU6OlNwZWMtPmNhdGZpbGUoJFJlYWxCaW4sICcuLicsICdwZXJsNScpOwordXNlIFN0b3JhYmxlIHF3KHJldHJpZXZlIG5zdG9yZSk7Cit1c2UgRmNudGwgJzpmbG9jayc7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUpOwordXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2IGF1dG9faGVscCk7CisKK3N1YiBnaXRfY29uZmlnICgkOyQpCit7CisJbXkgJHZhciA9IHNoaWZ0OworCW15ICRyZXF1aXJlZCA9IHNoaWZ0IHx8IDA7CisJbG9jYWwgKkdJVDsKKwlvcGVuIEdJVCwgJy18JywnZ2l0JywnY29uZmlnJywnLS1nZXQnLCR2YXI7CisJbXkgJHIgPSA8R0lUPjsKKwljaG9wICRyIGlmICRyOworCWNsb3NlIEdJVDsKKwlkaWUgImVycm9yOiAkdmFyIG5vdCBzZXQuXG4iIGlmICgkcmVxdWlyZWQgJiYgISRyKTsKKwlyZXR1cm4gJHI7Cit9CisKK3BhY2thZ2UgRVhDSEFOR0VfTkVUX1NNVFA7CisKKyMgTWljcm9zb2Z0IEV4Y2hhbmdlIFNlcnZlciByZXF1aXJlcyBhbiAnQVVUSCBMT0dJTicKKyMgc3R5bGUgb2YgYXV0aGVudGljYXRpb24uICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCisjIHRoZSBkZWZhdWx0IHN1cHBvcnRlZCBieSBOZXQ6OlNNVFAgc28gd2Ugc3ViY2xhc3MKKyMgYW5kIG92ZXJyaWRlIHRoZSBhdXRoIG1ldGhvZCB0byBzdXBwb3J0IHRoYXQuCisKK3VzZSBOZXQ6OlNNVFA7Cit1c2UgTmV0OjpDbWQ7Cit1c2UgTUlNRTo6QmFzZTY0IHF3KGVuY29kZV9iYXNlNjQpOworb3VyIEBJU0EgPSBxdyhOZXQ6OlNNVFApOworb3VyICRhdXRoX3R5cGUgPSA6OmdpdF9jb25maWcgJ2NpZGFlbW9uLnNtdHBBdXRoJzsKKworc3ViIG5ldworeworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHR5cGUgPSByZWYoJHNlbGYpIHx8ICRzZWxmOworCSR0eXBlLT5TVVBFUjo6bmV3KEBfKTsKK30KKworc3ViIGF1dGgKK3sKKwlteSAkc2VsZiA9IHNoaWZ0OworCXJldHVybiAkc2VsZi0+U1VQRVI6OmF1dGgoQF8pIHVubGVzcyAkYXV0aF90eXBlIGVxICdsb2dpbic7CisKKwlteSAkdXNlciA9IGVuY29kZV9iYXNlNjQgc2hpZnQsICcnOworCW15ICRwYXNzID0gZW5jb2RlX2Jhc2U2NCBzaGlmdCwgJyc7CisJcmV0dXJuIDAgdW5sZXNzIENNRF9NT1JFID09ICRzZWxmLT5jb21tYW5kKCJBVVRIIExPR0lOIiktPnJlc3BvbnNlOworCXJldHVybiAwIHVubGVzcyBDTURfTU9SRSA9PSAkc2VsZi0+Y29tbWFuZCgkdXNlciktPnJlc3BvbnNlOworCUNNRF9PSyA9PSAkc2VsZi0+Y29tbWFuZCgkcGFzcyktPnJlc3BvbnNlOworfQorCitwYWNrYWdlIG1haW47CisKK215ICgkZGVidWdfZmxhZywgJXJlY2VudCk7CisKK215ICRleF9ob3N0ID0gZ2l0X2NvbmZpZygnY2lkYWVtb24uc210cEhvc3QnKSB8fCAnbG9jYWxob3N0JzsKK215ICRleF91c2VyID0gZ2l0X2NvbmZpZygnY2lkYWVtb24uc210cFVzZXInKTsKK215ICRleF9wYXNzID0gZ2l0X2NvbmZpZygnY2lkYWVtb24uc210cFBhc3N3b3JkJyk7CisKK215ICRleF9mcm9tX2FkZHIgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5lbWFpbCcsIDEpOworbXkgJGV4X2Zyb21fbmFtZSA9IGdpdF9jb25maWcoJ2NpZGFlbW9uLm5hbWUnKSB8fCAnY2lkYWVtb24nOworCitteSAkc2Nhbl9kZWxheSA9IGdpdF9jb25maWcoJ2NpZGFlbW9uLnNjYW5EZWxheScpIHx8IDYwOworbXkgJHJlY2VudF9zaXplID0gZ2l0X2NvbmZpZygnY2lkYWVtb24ucmVjZW50Q2FjaGUnKSB8fCAxMDA7CitteSAkdG1wZGlyID0gZ2l0X2NvbmZpZygnY2lkYWVtb24udG1wZGlyJykgfHwgJy90bXAnOworbXkgJHF1ZXVlX25hbWUgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5xdWV1ZScsIDEpOworbXkgJHF1ZXVlX2xvY2sgPSAiJHF1ZXVlX25hbWUubG9jayI7CisKK215IEBub2NjX2xpc3Q7CitvcGVuIEdJVCwnZ2l0IGNvbmZpZyAtLWdldC1hbGwgY2lkYWVtb24ubm9jY3wnOword2hpbGUgKDxHSVQ+KSB7CisJY2hvcDsKKwlwdXNoIEBub2NjX2xpc3QsICRfOworfQorY2xvc2UgR0lUOworCitzdWIgbm9jY19hdXRob3IgKCQpCit7CisJbG9jYWwgJF8gPSBzaGlmdDsKKwlmb3JlYWNoIG15ICRwYXQgKEBub2NjX2xpc3QpIHsKKwkJcmV0dXJuIDEgaWYgLyRwYXQvOworCX0KKwkwOworfQorCitzdWIgaW5wdXRfZWNobyAoJCkKK3sKKwlteSAkcHJvbXB0ID0gc2hpZnQ7CisKKwlsb2NhbCAkfCA9IDE7CisJcHJpbnQgJHByb21wdDsKKwlteSAkaW5wdXQgPSA8U1RESU4+OworCWNob3AgJGlucHV0OworCXJldHVybiAkaW5wdXQ7Cit9CisKK3N1YiBpbnB1dF9ub2VjaG8gKCQpCit7CisJbXkgJHByb21wdCA9IHNoaWZ0OworCisJbXkgJGVuZCA9IHN1YiB7c3lzdGVtKCdzdHR5JywnZWNobycpO3ByaW50ICJcbiI7ZXhpdH07CisJbG9jYWwgJFNJR3tURVJNfSA9ICRlbmQ7CisJbG9jYWwgJFNJR3tJTlR9ID0gJGVuZDsKKwlzeXN0ZW0oJ3N0dHknLCctZWNobycpOworCisJbG9jYWwgJHwgPSAxOworCXByaW50ICRwcm9tcHQ7CisJbXkgJGlucHV0ID0gPFNURElOPjsKKwlzeXN0ZW0oJ3N0dHknLCdlY2hvJyk7CisJcHJpbnQgIlxuIjsKKwljaG9wICRpbnB1dDsKKwlyZXR1cm4gJGlucHV0OworfQorCitzdWIgcmZjMjgyMl9kYXRlICgpCit7CisJIHN0cmZ0aW1lKCIlYSwgJWQgJWIgJVkgJUg6JU06JVMgJVoiLCBsb2NhbHRpbWUpOworfQorCitzdWIgc2VuZF9lbWFpbCAoJCQkKQoreworCW15ICgkc3ViaiwgJGJvZHksICR0bykgPSBAXzsKKwlteSAkbm93ID0gcmZjMjgyMl9kYXRlOworCW15ICR0b19zdHIgPSAnJzsKKwlteSBAcmNwdF90bzsKKwlmb3JlYWNoIChAJHRvKSB7CisJCW15ICRzID0gJF87CisJCSRzID1+IHMvXi8iLzsKKwkJJHMgPX4gcy8oXHMrPCkvIiQxLzsKKwkJJHRvX3N0ciAuPSAnLCAnIGlmICR0b19zdHI7CisJCSR0b19zdHIgLj0gJHM7CisJCXB1c2ggQHJjcHRfdG8sICQxIGlmICRzID1+IC88KC4qKT4vOworCX0KKwlkaWUgIk5vYm9keSB0byBzZW5kIHRvLlxuIiB1bmxlc3MgQHJjcHRfdG87CisJbXkgJG1zZyA9IDw8RU9GOworRnJvbTogIiRleF9mcm9tX25hbWUiIDwkZXhfZnJvbV9hZGRyPgorVG86ICR0b19zdHIKK0RhdGU6ICRub3cKK1N1YmplY3Q6ICRzdWJqCisKKyRib2R5CitFT0YKKworCW15ICRzbXRwID0gRVhDSEFOR0VfTkVUX1NNVFAtPm5ldyhIb3N0ID0+ICRleF9ob3N0KQorCQlvciBkaWUgIkNhbm5vdCBjb25uZWN0IHRvICRleF9ob3N0OiAkIVxuIjsKKwlpZiAoJGV4X3VzZXIgJiYgJGV4X3Bhc3MpIHsKKwkJJHNtdHAtPmF1dGgoJGV4X3VzZXIsJGV4X3Bhc3MpCisJCQlvciBkaWUgIiRleF9ob3N0IHJlamVjdGVkICRleF91c2VyXG4iOworCX0KKwkkc210cC0+bWFpbCgkZXhfZnJvbV9hZGRyKQorCQlvciBkaWUgIiRleF9ob3N0IHJlamVjdGVkICRleF9mcm9tX2FkZHJcbiI7CisJc2NhbGFyKCRzbXRwLT5yZWNpcGllbnQoQHJjcHRfdG8sIHsgU2tpcEJhZCA9PiAxIH0pKQorCQlvciBkaWUgIiRleF9ob3N0IGRpZCBub3QgYWNjZXB0IGFueSBhZGRyZXNzZXMuXG4iOworCSRzbXRwLT5kYXRhKCRtc2cpCisJCW9yIGRpZSAiJGV4X2hvc3QgcmVqZWN0ZWQgbWVzc2FnZSBkYXRhXG4iOworCSRzbXRwLT5xdWl0OworfQorCitzdWIgcG9wX3F1ZXVlICgpCit7CisJb3BlbiBMT0NLLCAiPiRxdWV1ZV9sb2NrIiBvciBkaWUgIkNhbid0IG9wZW4gJHF1ZXVlX2xvY2s6ICQhIjsKKwlmbG9jayBMT0NLLCBMT0NLX0VYOworCisJbXkgJHF1ZXVlID0gLWYgJHF1ZXVlX25hbWUgPyByZXRyaWV2ZSAkcXVldWVfbmFtZSA6IFtdOworCW15ICRlbnQgPSBzaGlmdCBAJHF1ZXVlOworCW5zdG9yZSAkcXVldWUsICRxdWV1ZV9uYW1lOworCisJZmxvY2sgTE9DSywgTE9DS19VTjsKKwljbG9zZSBMT0NLOworCSRlbnQ7Cit9CisKK3N1YiBnaXRfZXhlYyAoQCkKK3sKKwlzeXN0ZW0oJ2dpdCcsQF8pID09IDAgb3IgZGllICJDYW5ub3QgZ2l0ICIgLiBqb2luKCcgJywgQF8pIC4gIlxuIjsKK30KKworc3ViIGdpdF92YWwgKEApCit7CisJb3BlbihDLCAnLXwnLCdnaXQnLEBfKTsKKwlteSAkciA9IDxDPjsKKwljaG9wICRyIGlmICRyOworCWNsb3NlIEM7CisJJHI7Cit9CisKK3N1YiBkb19idWlsZCAoJCQpCit7CisJbXkgKCRnaXRfZGlyLCAkbmV3KSA9IEBfOworCisJbXkgJHRtcCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHRtcGRpciwgImJ1aWxkZXIkJCIpOworCXN5c3RlbSgncm0nLCctcmYnLCR0bXApID09IDAgb3IgZGllICJDYW5ub3QgY2xlYXIgJHRtcFxuIjsKKwlkaWUgIkNhbm5vdCBjbGVhciAkdG1wLlxuIiBpZiAtZSAkdG1wOworCisJbXkgJHJlc3VsdCA9IDE7CisJZXZhbCB7CisJCW15ICRjb21tYW5kOworCQl7CisJCQlsb2NhbCAkRU5We0dJVF9ESVJ9ID0gJGdpdF9kaXI7CisJCQkkY29tbWFuZCA9IGdpdF92YWwgJ2NvbmZpZycsJ2J1aWxkZXIuY29tbWFuZCc7CisJCX0KKwkJZGllICJObyBidWlsZGVyLmNvbW1hbmQgZm9yICRnaXRfZGlyLlxuIiB1bmxlc3MgJGNvbW1hbmQ7CisKKwkJZ2l0X2V4ZWMgJ2Nsb25lJywnLW4nLCctbCcsJy1zJywkZ2l0X2RpciwkdG1wOworCQljaG1vZCAwNzAwLCAkdG1wIG9yIGRpZSAiQ2Fubm90IGxvY2sgJHRtcFxuIjsKKwkJY2hkaXIgJHRtcCBvciBkaWUgIkNhbm5vdCBlbnRlciAkdG1wXG4iOworCisJCWdpdF9leGVjICd1cGRhdGUtcmVmJywnSEVBRCcsJG5ldzsKKwkJZ2l0X2V4ZWMgJ3JlYWQtdHJlZScsJy1tJywnLXUnLCdIRUFEJywnSEVBRCc7CisJCXN5c3RlbSAkY29tbWFuZDsKKwkJaWYgKCQ/ID09IC0xKSB7CisJCQlwcmludCBTVERFUlIgImZhaWxlZCB0byBleGVjdXRlICckY29tbWFuZCc6ICQhXG4iOworCQkJJHJlc3VsdCA9IDE7CisJCX0gZWxzaWYgKCQ/ICYgMTI3KSB7CisJCQlteSAkc2lnID0gJD8gJiAxMjc7CisJCQlwcmludCBTVERFUlIgIickY29tbWFuZCcgZGllZCBmcm9tIHNpZ25hbCAkc2lnXG4iOworCQkJJHJlc3VsdCA9IDE7CisJCX0gZWxzZSB7CisJCQlteSAkciA9ICQ/ID4+IDg7CisJCQlwcmludCBTVERFUlIgIickY29tbWFuZCcgZXhpdGVkIHdpdGggJHJcbiIgaWYgJHI7CisJCQkkcmVzdWx0ID0gJHI7CisJCX0KKwl9OworCWlmICgkQCkgeworCQkkcmVzdWx0ID0gMjsKKwkJcHJpbnQgU1RERVJSICIkQFxuIjsKKwl9CisKKwljaGRpciAnLyc7CisJc3lzdGVtKCdybScsJy1yZicsJHRtcCk7CisJcm1kaXIgJHRtcDsKKwkkcmVzdWx0OworfQorCitzdWIgYnVpbGRfZmFpbGVkICgkJCQkJCkKK3sKKwlteSAoJGdpdF9kaXIsICRyZWYsICRvbGQsICRuZXcsICRtc2cpID0gQF87CisKKwkkZ2l0X2RpciA9fiBtLC8oW14vXSspJCw7CisJbXkgJHJlcG9fbmFtZSA9ICQxOworCSRyZWYgPX4gcyxecmVmcy8oaGVhZHN8dGFncykvLCw7CisKKwlteSAlYXV0aG9yczsKKwlteSAkc2hvcnRsb2c7CisJbXkgJHJldnN0cjsKKwl7CisJCWxvY2FsICRFTlZ7R0lUX0RJUn0gPSAkZ2l0X2RpcjsKKwkJbXkgQHJldnMgPSAoJG5ldyk7CisJCXB1c2ggQHJldnMsICctLW5vdCcsIEAkb2xkIGlmIEAkb2xkOworCQlvcGVuIExPRywnLXwnLCdnaXQnLCdyZXYtbGlzdCcsJy0tcHJldHR5PXJhdycsQHJldnM7CisJCXdoaWxlICg8TE9HPikgeworCQkJaWYgKHMvXihhdXRob3J8Y29tbWl0dGVyKSAvLykgeworCQkJCWNob21wOworCQkJCXMvPi4qJC8+LzsKKwkJCQkkYXV0aG9yc3skX30gPSAxIHVubGVzcyBub2NjX2F1dGhvciAkXzsKKwkJCX0KKwkJfQorCQljbG9zZSBMT0c7CisJCW9wZW4gTE9HLCctfCcsJ2dpdCcsJ3Nob3J0bG9nJyxAcmV2czsKKwkJJHNob3J0bG9nIC49ICRfIHdoaWxlIDxMT0c+OworCQljbG9zZSBMT0c7CisJCSRyZXZzdHIgPSBqb2luKCcgJywgQHJldnMpOworCX0KKworCW15IEB0byA9IHNvcnQga2V5cyAlYXV0aG9yczsKKwl1bmxlc3MgKEB0bykgeworCQlwcmludCBTVERFUlIgImVycm9yOiBObyBhdXRob3JzIGluICRyZXZzdHJcbiI7CisJCXJldHVybjsKKwl9CisKKwlteSAkc3ViamVjdCA9ICJbJHJlcG9fbmFtZV0gJHJlZiA6IEJ1aWxkIEZhaWxlZCI7CisJbXkgJGJvZHkgPSA8PEVPRjsKK1Byb2plY3Q6ICRnaXRfZGlyCitCcmFuY2g6ICAkcmVmCitDb21taXRzOiAkcmV2c3RyCisKKyRzaG9ydGxvZworQnVpbGQgT3V0cHV0OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyRtc2cKK0VPRgorCXNlbmRfZW1haWwoJHN1YmplY3QsICRib2R5LCBcQHRvKTsKK30KKworc3ViIHJ1bl9idWlsZCAoJCQkJCkKK3sKKwlteSAoJGdpdF9kaXIsICRyZWYsICRvbGQsICRuZXcpID0gQF87CisKKwlpZiAoJGRlYnVnX2ZsYWcpIHsKKwkJbXkgQHJldnMgPSAoJG5ldyk7CisJCXB1c2ggQHJldnMsICctLW5vdCcsIEAkb2xkIGlmIEAkb2xkOworCQlwcmludCAiQlVJTERJTkcgJGdpdF9kaXJcbiI7CisJCXByaW50ICIgIEJSQU5DSDogJHJlZlxuIjsKKwkJcHJpbnQgIiAgQ09NTUlUUzogIiwgam9pbignICcsIEByZXZzKSwgIlxuIjsKKwl9CisKKwlsb2NhbCgqUiwgKlcpOworCXBpcGUgUiwgVyBvciBkaWUgImNhbm5vdCBwaXBlIGJ1aWxkZXI6ICQhIjsKKworCW15ICRidWlsZGVyID0gZm9yaygpOworCWlmICghZGVmaW5lZCAkYnVpbGRlcikgeworCQlkaWUgImNhbm5vdCBmb3JrIGJ1aWxkZXI6ICQhIjsKKwl9IGVsc2lmICgwID09ICRidWlsZGVyKSB7CisJCWNsb3NlIFI7CisJCWNsb3NlIFNURElOO29wZW4oU1RESU4sICcvZGV2L251bGwnKTsKKwkJb3BlbihTVERPVVQsICc+JlcnKTsKKwkJb3BlbihTVERFUlIsICc+JlcnKTsKKwkJZXhpdCBkb19idWlsZCAkZ2l0X2RpciwgJG5ldzsKKwl9IGVsc2UgeworCQljbG9zZSBXOworCQlteSAkb3V0ID0gJyc7CisJCSRvdXQgLj0gJF8gd2hpbGUgPFI+OworCQljbG9zZSBSOworCQl3YWl0cGlkICRidWlsZGVyLCAwOworCQlidWlsZF9mYWlsZWQgJGdpdF9kaXIsICRyZWYsICRvbGQsICRuZXcsICRvdXQgaWYgJD87CisJfQorCisJcHJpbnQgIkRPTkVcblxuIiBpZiAkZGVidWdfZmxhZzsKK30KKworc3ViIGRhZW1vbl9sb29wICgpCit7CisJbXkgJHJ1biA9IDE7CisJbXkgJHN0b3Bfc3ViID0gc3ViIHskcnVuID0gMH07CisJJFNJR3tIVVB9ID0gJHN0b3Bfc3ViOworCSRTSUd7SU5UfSA9ICRzdG9wX3N1YjsKKwkkU0lHe1RFUk19ID0gJHN0b3Bfc3ViOworCisJbWtkaXIgJHRtcGRpciwgMDc1NTsKKwlteSAkcGlkZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHRtcGRpciwgImNpZGFlbW9uLnBpZCIpOworCW9wZW4oTywgIj4kcGlkZmlsZSIpOyBwcmludCBPICIkJFxuIjsgY2xvc2UgTzsKKworCXdoaWxlICgkcnVuKSB7CisJCW15ICRlbnQgPSBwb3BfcXVldWU7CisJCWlmICgkZW50KSB7CisJCQlteSAoJGdpdF9kaXIsICRyZWYsICRvbGQsICRuZXcpID0gQCRlbnQ7CisKKwkJCSRlbnQgPSAkcmVjZW50eyRnaXRfZGlyfTsKKwkJCSRyZWNlbnR7JGdpdF9kaXJ9ID0gJGVudCA9IFtbXSwge31dIHVubGVzcyAkZW50OworCQkJbXkgKCRyZWNfYXJyLCAkcmVjX2hhc2gpID0gQCRlbnQ7CisJCQluZXh0IGlmICRyZWNfaGFzaC0+eyRuZXd9Kys7CisJCQl3aGlsZSAoQCRyZWNfYXJyID49ICRyZWNlbnRfc2l6ZSkgeworCQkJCW15ICR0b19raWxsID0gc2hpZnQgQCRyZWNfYXJyOworCQkJCWRlbGV0ZSAkcmVjX2hhc2gtPnskdG9fa2lsbH07CisJCQl9CisJCQlwdXNoIEAkcmVjX2FyciwgJG5ldzsKKworCQkJcnVuX2J1aWxkICRnaXRfZGlyLCAkcmVmLCAkb2xkLCAkbmV3OworCQl9IGVsc2UgeworCQkJc2xlZXAgJHNjYW5fZGVsYXk7CisJCX0KKwl9CisKKwl1bmxpbmsgJHBpZGZpbGU7Cit9CisKKyRkZWJ1Z19mbGFnID0gMDsKK0dldE9wdGlvbnMoCisJJ2RlYnVnfGQnID0+IFwkZGVidWdfZmxhZywKKwknc210cC11c2VyPXMnID0+IFwkZXhfdXNlciwKKykgb3IgZGllICJ1c2FnZTogJDAgWy0tZGVidWddIFstLXNtdHAtdXNlcj11c2VyXVxuIjsKKworJGV4X3Bhc3MgPSBpbnB1dF9ub2VjaG8oIiRleF91c2VyIFNNVFAgcGFzc3dvcmQ6ICIpCisJaWYgKCRleF91c2VyICYmICEkZXhfcGFzcyk7CisKK2lmICgkZGVidWdfZmxhZykgeworCWRhZW1vbl9sb29wOworCWV4aXQgMDsKK30KKworbXkgJGRhZW1vbiA9IGZvcmsoKTsKK2lmICghZGVmaW5lZCAkZGFlbW9uKSB7CisJZGllICJjYW5ub3QgZm9yayBkYWVtb246ICQhIjsKK30gZWxzaWYgKDAgPT0gJGRhZW1vbikgeworCWNsb3NlIFNURElOO29wZW4oU1RESU4sICcvZGV2L251bGwnKTsKKwljbG9zZSBTVERPVVQ7b3BlbihTVERPVVQsICc+L2Rldi9udWxsJyk7CisJY2xvc2UgU1RERVJSO29wZW4oU1RERVJSLCAnPi9kZXYvbnVsbCcpOworCWRhZW1vbl9sb29wOworCWV4aXQgMDsKK30gZWxzZSB7CisJcHJpbnQgIkRhZW1vbiAkZGFlbW9uIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQuXG4iOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb250aW51b3VzL3Bvc3QtcmVjZWl2ZS1jaW5vdGlmeSBiL2NvbnRyaWIvY29udGludW91cy9wb3N0LXJlY2VpdmUtY2lub3RpZnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmNWE2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvY29udGludW91cy9wb3N0LXJlY2VpdmUtY2lub3RpZnkKQEAgLTAsMCArMSwxMDQgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBBIGhvb2sgdGhhdCBub3RpZmllcyBpdHMgY29tcGFuaW9uIGNpZGFlbW9uIHRocm91Z2ggYSBzaW1wbGUKKyMgcXVldWUgZmlsZSB0aGF0IGEgcmVmIGhhcyBiZWVuIHVwZGF0ZWQgdmlhIGEgcHVzaCAoYWN0dWFsbHkKKyMgYnkgYSByZWNlaXZlLXBhY2sgcnVubmluZyBvbiB0aGUgc2VydmVyKS4KKyMKKyMgU2VlIGNpZGFlbW9uIGZvciBwZXItcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIGRldGFpbHMuCisjCisjIFRvIHVzZSB0aGlzIGhvb2ssIGFkZCBpdCBhcyB0aGUgcG9zdC1yZWNlaXZlIGhvb2ssIG1ha2UgaXQKKyMgZXhlY3V0YWJsZSwgYW5kIHNldCBpdHMgY29uZmlndXJhdGlvbiBvcHRpb25zLgorIworCitsb2NhbCAkRU5We1BBVEh9ID0gJy9vcHQvZ2l0L2Jpbic7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRmlsZTo6U3BlYzsKK3VzZSBTdG9yYWJsZSBxdyhyZXRyaWV2ZSBuc3RvcmUpOwordXNlIEZjbnRsICc6ZmxvY2snOworCitteSAkZ2l0X2RpciA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoJEVOVntHSVRfRElSfSk7CitteSAkcXVldWVfbmFtZSA9IGBnaXQgY29uZmlnIC0tZ2V0IGJ1aWxkZXIucXVldWVgO2Nob3AgJHF1ZXVlX25hbWU7CiskcXVldWVfbmFtZSA9fiBtLF4oW15cc10rKSQsOyAkcXVldWVfbmFtZSA9ICQxOyAjIHVudGFpbnQKK3VubGVzcyAoJHF1ZXVlX25hbWUpIHsKKwkxIHdoaWxlIDxTVERJTj47CisJcHJpbnQgU1RERVJSICJcbmVycm9yOiBidWlsZGVyLnF1ZXVlIG5vdCBzZXQuICBOb3QgZW5xdWVpbmcuXG5cbiI7CisJZXhpdDsKK30KK215ICRxdWV1ZV9sb2NrID0gIiRxdWV1ZV9uYW1lLmxvY2siOworCitteSBAc2tpcDsKK29wZW4gUywgImdpdCBjb25maWcgLS1nZXQtYWxsIGJ1aWxkZXIuc2tpcHwiOword2hpbGUgKDxTPikgeworCWNob3A7CisJcHVzaCBAc2tpcCwgJF87Cit9CitjbG9zZSBTOworCitteSBAbmV3X2JyYW5jaF9iYXNlOworb3BlbiBTLCAiZ2l0IGNvbmZpZyAtLWdldC1hbGwgYnVpbGRlci5uZXdCcmFuY2hCYXNlfCI7Cit3aGlsZSAoPFM+KSB7CisJY2hvcDsKKwlwdXNoIEBuZXdfYnJhbmNoX2Jhc2UsICRfOworfQorY2xvc2UgUzsKKworc3ViIHNraXAgKCQpCit7CisJbG9jYWwgJF8gPSBzaGlmdDsKKwlmb3JlYWNoIG15ICRwIChAc2tpcCkgeworCQlyZXR1cm4gMSBpZiAvXiRwLzsKKwl9CisJMDsKK30KKworb3BlbiBMT0NLLCAiPiRxdWV1ZV9sb2NrIiBvciBkaWUgIkNhbid0IG9wZW4gJHF1ZXVlX2xvY2s6ICQhIjsKK2Zsb2NrIExPQ0ssIExPQ0tfRVg7CisKK215ICRxdWV1ZSA9IC1mICRxdWV1ZV9uYW1lID8gcmV0cmlldmUgJHF1ZXVlX25hbWUgOiBbXTsKK215ICVleGlzdGluZzsKK2ZvcmVhY2ggbXkgJHIgKEAkcXVldWUpIHsKKwlteSAoJGdkLCAkcmVmKSA9IEAkcjsKKwkkZXhpc3Rpbmd7JGdkfXskcmVmfSA9ICRyOworfQorCitteSBAbmV3X2JyYW5jaF9jb21taXRzOworbXkgJGxvYWRlZF9uZXdfYnJhbmNoX2NvbW1pdHMgPSAwOworCit3aGlsZSAoPFNURElOPikgeworCWNob3A7CisJbXkgKCRvbGQsICRuZXcsICRyZWYpID0gc3BsaXQgLyAvLCAkXywgMzsKKworCW5leHQgaWYgJG9sZCBlcSAkbmV3OworCW5leHQgaWYgJG5ldyA9fiAvXjB7NDB9JC87CisJbmV4dCBpZiBza2lwICRyZWY7CisKKwlteSAkciA9ICRleGlzdGluZ3skZ2l0X2Rpcn17JHJlZn07CisJaWYgKCRyKSB7CisJCSRyLT5bM10gPSAkbmV3OworCX0gZWxzZSB7CisJCWlmICgkb2xkID1+IC9eMHs0MH0kLykgeworCQkJaWYgKCEkbG9hZGVkX25ld19icmFuY2hfY29tbWl0cyAmJiBAbmV3X2JyYW5jaF9iYXNlKSB7CisJCQkJb3BlbiBNLCctfCcsJ2dpdCcsJ3Nob3ctcmVmJyxAbmV3X2JyYW5jaF9iYXNlOworCQkJCXdoaWxlICg8TT4pIHsKKwkJCQkJKCRfKSA9IHNwbGl0IC8gLywgJF87CisJCQkJCXB1c2ggQG5ld19icmFuY2hfY29tbWl0cywgJF87CisJCQkJfQorCQkJCWNsb3NlIE07CisJCQkJJGxvYWRlZF9uZXdfYnJhbmNoX2NvbW1pdHMgPSAxOworCQkJfQorCQkJJG9sZCA9IFtAbmV3X2JyYW5jaF9jb21taXRzXTsKKwkJfSBlbHNlIHsKKwkJCSRvbGQgPSBbJG9sZF07CisJCX0KKworCQkkciA9IFskZ2l0X2RpciwgJHJlZiwgJG9sZCwgJG5ld107CisJCSRleGlzdGluZ3skZ2l0X2Rpcn17JHJlZn0gPSAkcjsKKwkJcHVzaCBAJHF1ZXVlLCAkcjsKKwl9Cit9Cituc3RvcmUgJHF1ZXVlLCAkcXVldWVfbmFtZTsKKworZmxvY2sgTE9DSywgTE9DS19VTjsKK2Nsb3NlIExPQ0s7CmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzLy5naXRpZ25vcmUgYi9jb250cmliL2VtYWNzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzMWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmVsYwpkaWZmIC0tZ2l0IGEvY29udHJpYi9lbWFjcy9NYWtlZmlsZSBiL2NvbnRyaWIvZW1hY3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhYTBhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyMgQnVpbGQgYW5kIGluc3RhbGwgc3R1ZmYKKworRU1BQ1MgPSBlbWFjcworCitFTEMgPSBnaXQuZWxjIHZjLWdpdC5lbGMgZ2l0LWJsYW1lLmVsYworSU5TVEFMTCA/PSBpbnN0YWxsCitJTlNUQUxMX0VMQyA9ICQoSU5TVEFMTCkgLW0gNjQ0CitwcmVmaXggPz0gJChIT01FKQorZW1hY3NkaXIgPSAkKHByZWZpeCkvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwCisKK2FsbDogJChFTEMpCisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoZW1hY3NkaXIpCisJJChJTlNUQUxMX0VMQykgJChFTEMpICQoREVTVERJUikkKGVtYWNzZGlyKQorCislLmVsYzogJS5lbAorCSQoRU1BQ1MpIC1iYXRjaCAtZiBiYXRjaC1ieXRlLWNvbXBpbGUgJDwKKworY2xlYW46OyBybSAtZiAkKEVMQykKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZW1hY3MvZ2l0LWJsYW1lLmVsIGIvY29udHJpYi9lbWFjcy9naXQtYmxhbWUuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2NzFkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvZ2l0LWJsYW1lLmVsCkBAIC0wLDAgKzEsNDI2IEBACis7OzsgZ2l0LWJsYW1lLmVsIC0tLSBNaW5vciBtb2RlIGZvciBpbmNyZW1lbnRhbCBibGFtZSBmb3IgR2l0ICAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKzs7Cis7OyBDb3B5cmlnaHQgKEMpIDIwMDcgIERhdmlkIEvDpWdlZGFsCis7OworOzsgQXV0aG9yczogICAgRGF2aWQgS8OlZ2VkYWwgPGRhdmlka0BseXNhdG9yLmxpdS5zZT4KKzs7IENyZWF0ZWQ6ICAgIDMxIEphbiAyMDA3Cis7OyBNZXNzYWdlLUlEOiA8ODdpcmVuMnZxeC5mc2ZAbW9ycGhldXMubG9jYWw+Cis7OyBMaWNlbnNlOiAgICBHUEwKKzs7IEtleXdvcmRzOiAgIGdpdCwgdmVyc2lvbiBjb250cm9sLCByZWxlYXNlIG1hbmFnZW1lbnQKKzs7Cis7OyBDb21wYXRpYmlsaXR5OiBFbWFjczIxLCBFbWFjczIyIGFuZCBFbWFjc0NWUworOzsgICAgICAgICAgICAgICAgR2l0IDEuNSBhbmQgdXAKKworOzsgVGhpcyBmaWxlIGlzICpOT1QqIHBhcnQgb2YgR05VIEVtYWNzLgorOzsgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIEdOVSBFbWFjcy4KKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKzs7IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCis7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorOzsgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorOzsgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorOzsgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCis7OyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCis7OyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorOzsgTUEgMDIxMTEtMTMwNyBVU0EKKworOzsgaHR0cDovL3d3dy5mc2Yub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisKKworOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOzsKKzs7OyBDb21tZW50YXJ5OgorOzsKKzs7IEhlcmUgaXMgYW4gRW1hY3MgaW1wbGVtZW50YXRpb24gb2YgaW5jcmVtZW50YWwgZ2l0LWJsYW1lLiAgV2hlbiB5b3UKKzs7IHR1cm4gaXQgb24gd2hpbGUgdmlld2luZyBhIGZpbGUsIHRoZSBlZGl0b3IgYnVmZmVyIHdpbGwgYmUgdXBkYXRlZCBieQorOzsgc2V0dGluZyB0aGUgYmFja2dyb3VuZCBvZiBpbmRpdmlkdWFsIGxpbmVzIHRvIGEgY29sb3IgdGhhdCByZWZsZWN0cworOzsgd2hpY2ggY29tbWl0IGl0IGNvbWVzIGZyb20uICBBbmQgd2hlbiB5b3UgbW92ZSBhcm91bmQgdGhlIGJ1ZmZlciwgYQorOzsgb25lLWxpbmUgc3VtbWFyeSB3aWxsIGJlIHNob3duIGluIHRoZSBlY2hvIGFyZWEuCisKKzs7OyBJbnN0YWxsYXRpb246Cis7OworOzsgVG8gdXNlIHRoaXMgcGFja2FnZSwgcHV0IGl0IHNvbWV3aGVyZSBpbiBgbG9hZC1wYXRoJyAob3IgYWRkCis7OyBkaXJlY3Rvcnkgd2l0aCBnaXQtYmxhbWUuZWwgdG8gYGxvYWQtcGF0aCcpLCBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKKzs7IGxpbmUgdG8geW91ciAuZW1hY3M6Cis7OworOzsgICAgKHJlcXVpcmUgJ2dpdC1ibGFtZSkKKzs7Cis7OyBJZiB5b3UgZG8gbm90IHdhbnQgdG8gbG9hZCB0aGlzIHBhY2thZ2UgYmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSwgeW91Cis7OyBjYW4gbWFrZSB1c2Ugb2YgdGhlIGBhdXRvbG9hZCcgZmVhdHVyZSwgZS5nLiBieSBhZGRpbmcgdG8geW91ciAuZW1hY3MKKzs7IHRoZSBmb2xsb3dpbmcgbGluZXMKKzs7Cis7OyAgICAoYXV0b2xvYWQgJ2dpdC1ibGFtZS1tb2RlICJnaXQtYmxhbWUiCis7OyAgICAgICAgICAgICAgIk1pbm9yIG1vZGUgZm9yIGluY3JlbWVudGFsIGJsYW1lIGZvciBHaXQuIiB0KQorOzsKKzs7IFRoZW4gZmlyc3QgdXNlIG9mIGBNLXggZ2l0LWJsYW1lLW1vZGUnIHdvdWxkIGxvYWQgdGhlIHBhY2thZ2UuCisKKzs7OyBDb21wYXRpYmlsaXR5OgorOzsKKzs7IEl0IHJlcXVpcmVzIEdOVSBFbWFjcyAyMSBvciBsYXRlciBhbmQgR2l0IDEuNS4wIGFuZCB1cAorOzsKKzs7IElmIHlvdSdhcmUgdXNpbmcgRW1hY3MgMjAsIHRyeSBjaGFuZ2luZyB0aGlzOgorOzsKKzs7ICAgICAgICAgICAgKG92ZXJsYXktcHV0IG92bCAnZmFjZSAobGlzdCA6YmFja2dyb3VuZAorOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgKGFzc3EgJ2NvbG9yIChjZGRkZHIgaW5mbykpKSkpCis7OworOzsgdG8KKzs7Cis7OyAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdmwgJ2ZhY2UgKGNvbnMgJ2JhY2tncm91bmQtY29sb3IKKzs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3NxICdjb2xvciAoY2RkZGRyIGluZm8pKSkpKQorCisKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzs7Cis7OzsgQ29kZToKKworKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdjbCkpCQkJICAgICAgOyB0byB1c2UgYHB1c2gnLCBgcG9wJworCisKKyhkZWZ1biBnaXQtYmxhbWUtY29sb3Itc2NhbGUgKCZyZXN0IGVsZW1lbnRzKQorICAiR2l2ZW4gYSBsaXN0LCByZXR1cm5zIGEgbGlzdCBvZiB0cmlwbGVzIGZvcm1lZCB3aXRoIGVhY2gKK2VsZW1lbnRzIG9mIHRoZSBsaXN0LgorCithIGIgPT4gYmJiIGJiYSBiYWIgYmFhIGFiYiBhYmEgYWFhIGFhYiIKKyAgKGxldCAocmVzdWx0KQorICAgIChkb2xpc3QgKGEgZWxlbWVudHMpCisgICAgICAoZG9saXN0IChiIGVsZW1lbnRzKQorICAgICAgICAoZG9saXN0IChjIGVsZW1lbnRzKQorICAgICAgICAgIChzZXRxIHJlc3VsdCAoY29ucyAoZm9ybWF0ICIjJXMlcyVzIiBhIGIgYykgcmVzdWx0KSkpKSkKKyAgICByZXN1bHQpKQorCis7OyAoZ2l0LWJsYW1lLWNvbG9yLXNjYWxlICIwYyIgIjA0IiAiMjQiICIxYyIgIjJjIiAiMzQiICIxNCIgIjNjIikgPT4KKzs7ICgiIzNjM2MzYyIgIiMzYzNjMTQiICIjM2MzYzM0IiAiIzNjM2MyYyIgIiMzYzNjMWMiICIjM2MzYzI0IgorOzsgIiMzYzNjMDQiICIjM2MzYzBjIiAiIzNjMTQzYyIgIiMzYzE0MTQiICIjM2MxNDM0IiAiIzNjMTQyYyIgLi4uKQorCisoZGVmbWFjcm8gZ2l0LWJsYW1lLXJhbmRvbS1wb3AgKGwpCisgICJTZWxlY3QgYSByYW5kb20gZWxlbWVudCBmcm9tIEwgYW5kIHJldHVybnMgaXQuIEFsc28gcmVtb3ZlCitzZWxlY3RlZCBlbGVtZW50IGZyb20gbC4iCisgIDs7IG9ubHkgd29ya3Mgb24gbGlzdHMgd2l0aCB1bmlxdWUgZWxlbWVudHMKKyAgYChsZXQgKChlIChlbHQgLGwgKHJhbmRvbSAobGVuZ3RoICxsKSkpKSkKKyAgICAgKHNldHEgLGwgKHJlbW92ZSBlICxsKSkKKyAgICAgZSkpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWRhcmstY29sb3JzCisgIChnaXQtYmxhbWUtY29sb3Itc2NhbGUgIjBjIiAiMDQiICIyNCIgIjFjIiAiMmMiICIzNCIgIjE0IiAiM2MiKQorICAiKkxpc3Qgb2YgY29sb3JzIChmb3JtYXQgI1JHQikgdG8gdXNlIGluIGEgZGFyayBlbnZpcm9ubWVudC4KKworVG8gY2hlY2sgb3V0IHRoZSBsaXN0LCBldmFsdWF0ZSAobGlzdC1jb2xvcnMtZGlzcGxheSBnaXQtYmxhbWUtZGFyay1jb2xvcnMpLiIpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWxpZ2h0LWNvbG9ycworICAoZ2l0LWJsYW1lLWNvbG9yLXNjYWxlICJjNCIgImQ0IiAiY2MiICJkYyIgImY0IiAiZTQiICJmYyIgImVjIikKKyAgIipMaXN0IG9mIGNvbG9ycyAoZm9ybWF0ICNSR0IpIHRvIHVzZSBpbiBhIGxpZ2h0IGVudmlyb25tZW50LgorCitUbyBjaGVjayBvdXQgdGhlIGxpc3QsIGV2YWx1YXRlIChsaXN0LWNvbG9ycy1kaXNwbGF5IGdpdC1ibGFtZS1saWdodC1jb2xvcnMpLiIpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWNvbG9ycyAnKCkKKyAgIkNvbG9ycyB1c2VkIGJ5IGdpdC1ibGFtZS4gVGhlIGxpc3QgaXMgYnVpbHQgb25jZSB3aGVuIGFjdGl2YXRpbmcgZ2l0LWJsYW1lCittaW5vciBtb2RlLiIpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWFuY2llbnQtY29sb3IgImRhcmsgZ3JlZW4iCisgICIqQ29sb3IgdG8gYmUgdXNlZCBmb3IgYW5jaWVudCBjb21taXQuIikKKworKGRlZnZhciBnaXQtYmxhbWUtYXV0b3VwZGF0ZSB0CisgICIqQXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGJsYW1lIGRpc3BsYXkgd2hpbGUgZWRpdGluZyIpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLXByb2MgbmlsCisgICJUaGUgcnVubmluZyBnaXQtYmxhbWUgcHJvY2VzcyIpCisobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dpdC1ibGFtZS1wcm9jKQorCisoZGVmdmFyIGdpdC1ibGFtZS1vdmVybGF5cyBuaWwKKyAgIlRoZSBnaXQtYmxhbWUgb3ZlcmxheXMgdXNlZCBpbiB0aGUgY3VycmVudCBidWZmZXIuIikKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLW92ZXJsYXlzKQorCisoZGVmdmFyIGdpdC1ibGFtZS1jYWNoZSBuaWwKKyAgIkEgY2FjaGUgb2YgZ2l0LWJsYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBidWZmZXIiKQorKG1ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsICdnaXQtYmxhbWUtY2FjaGUpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWlkbGUtdGltZXIgbmlsCisgICJBbiBpZGxlIHRpbWVyIHRoYXQgdXBkYXRlcyB0aGUgYmxhbWUiKQorKG1ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsICdnaXQtYmxhbWUtY2FjaGUpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLXVwZGF0ZS1xdWV1ZSBuaWwKKyAgIkEgcXVldWUgb2YgdXBkYXRlIHJlcXVlc3RzIikKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLXVwZGF0ZS1xdWV1ZSkKKworOzsgRklYTUU6IGRvY3N0cmluZ3MKKyhkZWZ2YXIgZ2l0LWJsYW1lLWZpbGUgbmlsKQorKGRlZnZhciBnaXQtYmxhbWUtY3VycmVudCBuaWwpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLW1vZGUgbmlsKQorKG1ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsICdnaXQtYmxhbWUtbW9kZSkKKworKGRlZnZhciBnaXQtYmxhbWUtbW9kZS1saW5lLXN0cmluZyAiIGJsYW1lIgorICAiU3RyaW5nIHRvIGRpc3BsYXkgb24gdGhlIG1vZGUgbGluZSB3aGVuIGdpdC1ibGFtZSBpcyBhY3RpdmUuIikKKworKG9yIChhc3NxICdnaXQtYmxhbWUtbW9kZSBtaW5vci1tb2RlLWFsaXN0KQorICAgIChzZXRxIG1pbm9yLW1vZGUtYWxpc3QKKwkgIChjb25zICcoZ2l0LWJsYW1lLW1vZGUgZ2l0LWJsYW1lLW1vZGUtbGluZS1zdHJpbmcpIG1pbm9yLW1vZGUtYWxpc3QpKSkKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBnaXQtYmxhbWUtbW9kZSAoJm9wdGlvbmFsIGFyZykKKyAgIlRvZ2dsZSBtaW5vciBtb2RlIGZvciBkaXNwbGF5aW5nIEdpdCBibGFtZQorCitXaXRoIHByZWZpeCBBUkcsIHR1cm4gdGhlIG1vZGUgb24gaWYgQVJHIGlzIHBvc2l0aXZlLiIKKyAgKGludGVyYWN0aXZlICJQIikKKyAgKGNvbmQKKyAgICgobnVsbCBhcmcpCisgICAgKGlmIGdpdC1ibGFtZS1tb2RlIChnaXQtYmxhbWUtbW9kZS1vZmYpIChnaXQtYmxhbWUtbW9kZS1vbikpKQorICAgKCg+IChwcmVmaXgtbnVtZXJpYy12YWx1ZSBhcmcpIDApIChnaXQtYmxhbWUtbW9kZS1vbikpCisgICAodCAoZ2l0LWJsYW1lLW1vZGUtb2ZmKSkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLW1vZGUtb24gKCkKKyAgIlR1cm4gb24gZ2l0LWJsYW1lIG1vZGUuCisKK1NlZSBhbHNvIGZ1bmN0aW9uIGBnaXQtYmxhbWUtbW9kZScuIgorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZ2l0LWJsYW1lLWNvbG9ycykKKyAgKGlmIGdpdC1ibGFtZS1hdXRvdXBkYXRlCisgICAgICAoYWRkLWhvb2sgJ2FmdGVyLWNoYW5nZS1mdW5jdGlvbnMgJ2dpdC1ibGFtZS1hZnRlci1jaGFuZ2UgbmlsIHQpCisgICAgKHJlbW92ZS1ob29rICdhZnRlci1jaGFuZ2UtZnVuY3Rpb25zICdnaXQtYmxhbWUtYWZ0ZXItY2hhbmdlIHQpKQorICAoZ2l0LWJsYW1lLWNsZWFudXApCisgIChsZXQgKChiZ21vZGUgKGNkciAoYXNzb2MgJ2JhY2tncm91bmQtbW9kZSAoZnJhbWUtcGFyYW1ldGVycykpKSkpCisgICAgKGlmIChlcSBiZ21vZGUgJ2RhcmspCisJKHNldHEgZ2l0LWJsYW1lLWNvbG9ycyBnaXQtYmxhbWUtZGFyay1jb2xvcnMpCisgICAgICAoc2V0cSBnaXQtYmxhbWUtY29sb3JzIGdpdC1ibGFtZS1saWdodC1jb2xvcnMpKSkKKyAgKHNldHEgZ2l0LWJsYW1lLWNhY2hlIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgJ2VxdWFsKSkKKyAgKHNldHEgZ2l0LWJsYW1lLW1vZGUgdCkKKyAgKGdpdC1ibGFtZS1ydW4pKQorCisoZGVmdW4gZ2l0LWJsYW1lLW1vZGUtb2ZmICgpCisgICJUdXJuIG9mZiBnaXQtYmxhbWUgbW9kZS4KKworU2VlIGFsc28gZnVuY3Rpb24gYGdpdC1ibGFtZS1tb2RlJy4iCisgIChnaXQtYmxhbWUtY2xlYW51cCkKKyAgKGlmIGdpdC1ibGFtZS1pZGxlLXRpbWVyIChjYW5jZWwtdGltZXIgZ2l0LWJsYW1lLWlkbGUtdGltZXIpKQorICAoc2V0cSBnaXQtYmxhbWUtbW9kZSBuaWwpKQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIGdpdC1yZWJsYW1lICgpCisgICJSZWNhbGN1bGF0ZSBhbGwgYmxhbWUgaW5mb3JtYXRpb24gaW4gdGhlIGN1cnJlbnQgYnVmZmVyIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LWJsYW1lLW1vZGUKKyAgICAoZXJyb3IgIkdpdC1ibGFtZSBpcyBub3QgYWN0aXZlIikpCisKKyAgKGdpdC1ibGFtZS1jbGVhbnVwKQorICAoZ2l0LWJsYW1lLXJ1bikpCisKKyhkZWZ1biBnaXQtYmxhbWUtcnVuICgmb3B0aW9uYWwgc3RhcnRsaW5lIGVuZGxpbmUpCisgIChpZiBnaXQtYmxhbWUtcHJvYworICAgICAgOzsgU2hvdWxkIG1heWJlIHF1ZXVlIHVwIGEgbmV3IHJ1biBoZXJlCisgICAgICAobWVzc2FnZSAiQWxyZWFkeSBydW5uaW5nIGdpdCBibGFtZSIpCisgICAgKGxldCAoKGRpc3BsYXktYnVmIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgICAgKGJsYW1lLWJ1ZiAoZ2V0LWJ1ZmZlci1jcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICIgZ2l0IGJsYW1lIGZvciAiIChidWZmZXItbmFtZSkpKSkKKyAgICAgICAgICAoYXJncyAnKCItLWluY3JlbWVudGFsIiAiLS1jb250ZW50cyIgIi0iKSkpCisgICAgICAoaWYgc3RhcnRsaW5lCisgICAgICAgICAgKHNldHEgYXJncyAoYXBwZW5kIGFyZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgIi1MIiAoZm9ybWF0ICIlZCwlZCIgc3RhcnRsaW5lIGVuZGxpbmUpKSkpKQorICAgICAgKHNldHEgYXJncyAoYXBwZW5kIGFyZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBidWZmZXItZmlsZS1uYW1lKSkpKQorICAgICAgKHNldHEgZ2l0LWJsYW1lLXByb2MKKyAgICAgICAgICAgIChhcHBseSAnc3RhcnQtcHJvY2VzcworICAgICAgICAgICAgICAgICAgICJnaXQtYmxhbWUiIGJsYW1lLWJ1ZgorICAgICAgICAgICAgICAgICAgICJnaXQiICJibGFtZSIKKyAgICAgICAgICAgICAgICAgICBhcmdzKSkKKyAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJsYW1lLWJ1ZgorICAgICAgICAoZXJhc2UtYnVmZmVyKQorICAgICAgICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZ2l0LWJsYW1lLWZpbGUpCisgICAgICAgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdnaXQtYmxhbWUtY3VycmVudCkKKyAgICAgICAgKHNldHEgZ2l0LWJsYW1lLWZpbGUgZGlzcGxheS1idWYpCisgICAgICAgIChzZXRxIGdpdC1ibGFtZS1jdXJyZW50IG5pbCkpCisgICAgICAoc2V0LXByb2Nlc3MtZmlsdGVyIGdpdC1ibGFtZS1wcm9jICdnaXQtYmxhbWUtZmlsdGVyKQorICAgICAgKHNldC1wcm9jZXNzLXNlbnRpbmVsIGdpdC1ibGFtZS1wcm9jICdnaXQtYmxhbWUtc2VudGluZWwpCisgICAgICAocHJvY2Vzcy1zZW5kLXJlZ2lvbiBnaXQtYmxhbWUtcHJvYyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkKKyAgICAgIChwcm9jZXNzLXNlbmQtZW9mIGdpdC1ibGFtZS1wcm9jKSkpKQorCisoZGVmdW4gcmVtb3ZlLWdpdC1ibGFtZS10ZXh0LXByb3BlcnRpZXMgKHN0YXJ0IGVuZCkKKyAgKGxldCAoKG1vZGlmaWVkIChidWZmZXItbW9kaWZpZWQtcCkpCisgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAgICAocmVtb3ZlLXRleHQtcHJvcGVydGllcyBzdGFydCBlbmQgJyhwb2ludC1lbnRlcmVkIG5pbCkpCisgICAgKHNldC1idWZmZXItbW9kaWZpZWQtcCBtb2RpZmllZCkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLWNsZWFudXAgKCkKKyAgIlJlbW92ZSBhbGwgYmxhbWUgcHJvcGVydGllcyIKKyAgICAobWFwY2FyICdkZWxldGUtb3ZlcmxheSBnaXQtYmxhbWUtb3ZlcmxheXMpCisgICAgKHNldHEgZ2l0LWJsYW1lLW92ZXJsYXlzIG5pbCkKKyAgICAocmVtb3ZlLWdpdC1ibGFtZS10ZXh0LXByb3BlcnRpZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLXVwZGF0ZS1yZWdpb24gKHN0YXJ0IGVuZCkKKyAgIlJlcnVuIGJsYW1lIHRvIGdldCB1cGRhdGVzIGJldHdlZW4gU1RBUlQgYW5kIEVORCIKKyAgKGxldCAoKG92ZXJsYXlzIChvdmVybGF5cy1pbiBzdGFydCBlbmQpKSkKKyAgICAod2hpbGUgb3ZlcmxheXMKKyAgICAgIChsZXQgKChvdmVybGF5IChwb3Agb3ZlcmxheXMpKSkKKyAgICAgICAgKGlmICg8IChvdmVybGF5LXN0YXJ0IG92ZXJsYXkpIHN0YXJ0KQorICAgICAgICAgICAgKHNldHEgc3RhcnQgKG92ZXJsYXktc3RhcnQgb3ZlcmxheSkpKQorICAgICAgICAoaWYgKD4gKG92ZXJsYXktZW5kIG92ZXJsYXkpIGVuZCkKKyAgICAgICAgICAgIChzZXRxIGVuZCAob3ZlcmxheS1lbmQgb3ZlcmxheSkpKQorICAgICAgICAoc2V0cSBnaXQtYmxhbWUtb3ZlcmxheXMgKGRlbGV0ZSBvdmVybGF5IGdpdC1ibGFtZS1vdmVybGF5cykpCisgICAgICAgIChkZWxldGUtb3ZlcmxheSBvdmVybGF5KSkpKQorICAocmVtb3ZlLWdpdC1ibGFtZS10ZXh0LXByb3BlcnRpZXMgc3RhcnQgZW5kKQorICA7OyBXZSBjYW4gYmUgc3VyZSB0aGF0IHN0YXJ0IGFuZCBlbmQgYXJlIGF0IGxpbmUgYnJlYWtzCisgIChnaXQtYmxhbWUtcnVuICgxKyAoY291bnQtbGluZXMgKHBvaW50LW1pbikgc3RhcnQpKQorICAgICAgICAgICAgICAgICAoY291bnQtbGluZXMgKHBvaW50LW1pbikgZW5kKSkpCisKKyhkZWZ1biBnaXQtYmxhbWUtc2VudGluZWwgKHByb2Mgc3RhdHVzKQorICAod2l0aC1jdXJyZW50LWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgcHJvYykKKyAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBnaXQtYmxhbWUtZmlsZQorICAgICAgKHNldHEgZ2l0LWJsYW1lLXByb2MgbmlsKQorICAgICAgKGlmIGdpdC1ibGFtZS11cGRhdGUtcXVldWUKKyAgICAgICAgICAoZ2l0LWJsYW1lLWRlbGF5ZWQtdXBkYXRlKSkpKQorICA7OyhraWxsLWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgcHJvYykpCisgIDs7KG1lc3NhZ2UgImdpdCBibGFtZSBmaW5pc2hlZCIpCisgICkKKworKGRlZnZhciBpbi1ibGFtZS1maWx0ZXIgbmlsKQorCisoZGVmdW4gZ2l0LWJsYW1lLWZpbHRlciAocHJvYyBzdHIpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIChwcm9jZXNzLWJ1ZmZlciBwcm9jKSkKKyAgICAoZ290by1jaGFyIChwcm9jZXNzLW1hcmsgcHJvYykpCisgICAgKGluc2VydC1iZWZvcmUtbWFya2VycyBzdHIpCisgICAgKGdvdG8tY2hhciAwKQorICAgICh1bmxlc3MgaW4tYmxhbWUtZmlsdGVyCisgICAgICAobGV0ICgobW9yZSB0KQorICAgICAgICAgICAgKGluLWJsYW1lLWZpbHRlciB0KSkKKyAgICAgICAgKHdoaWxlIG1vcmUKKyAgICAgICAgICAoc2V0cSBtb3JlIChnaXQtYmxhbWUtcGFyc2UpKSkpKSkpCisKKyhkZWZ1biBnaXQtYmxhbWUtcGFyc2UgKCkKKyAgKGNvbmQgKChsb29raW5nLWF0ICJcXChbMC05YS1mXVxcezQwXFx9XFwpIFxcKFswLTldK1xcKSBcXChbMC05XStcXCkgXFwoWzAtOV0rXFwpXG4iKQorICAgICAgICAgKGxldCAoKGhhc2ggKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgIChzcmMtbGluZSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDIpKSkKKyAgICAgICAgICAgICAgIChyZXMtbGluZSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDMpKSkKKyAgICAgICAgICAgICAgIChudW0tbGluZXMgKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyA0KSkpKQorICAgICAgICAgICAoc2V0cSBnaXQtYmxhbWUtY3VycmVudAorICAgICAgICAgICAgICAgICAoaWYgKHN0cmluZz0gaGFzaCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpCisgICAgICAgICAgICAgICAgICAgICBuaWwKKyAgICAgICAgICAgICAgICAgICAoZ2l0LWJsYW1lLW5ldy1jb21taXQKKyAgICAgICAgICAgICAgICAgICAgaGFzaCBzcmMtbGluZSByZXMtbGluZSBudW0tbGluZXMpKSkpCisgICAgICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChtYXRjaC1lbmQgMCkpCisgICAgICAgICB0KQorICAgICAgICAoKGxvb2tpbmctYXQgImZpbGVuYW1lIFxcKC4rXFwpXG4iKQorICAgICAgICAgKGxldCAoKGZpbGVuYW1lIChtYXRjaC1zdHJpbmcgMSkpKQorICAgICAgICAgICAoZ2l0LWJsYW1lLWFkZC1pbmZvICJmaWxlbmFtZSIgZmlsZW5hbWUpKQorICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAobWF0Y2gtZW5kIDApKQorICAgICAgICAgdCkKKyAgICAgICAgKChsb29raW5nLWF0ICJcXChbYS16LV0rXFwpIFxcKC4rXFwpXG4iKQorICAgICAgICAgKGxldCAoKGtleSAobWF0Y2gtc3RyaW5nIDEpKQorICAgICAgICAgICAgICAgKHZhbHVlIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAgICAoZ2l0LWJsYW1lLWFkZC1pbmZvIGtleSB2YWx1ZSkpCisgICAgICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChtYXRjaC1lbmQgMCkpCisgICAgICAgICB0KQorICAgICAgICAoKGxvb2tpbmctYXQgImJvdW5kYXJ5XG4iKQorICAgICAgICAgKHNldHEgZ2l0LWJsYW1lLWN1cnJlbnQgbmlsKQorICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAobWF0Y2gtZW5kIDApKQorICAgICAgICAgdCkKKyAgICAgICAgKHQKKyAgICAgICAgIG5pbCkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLW5ldy1jb21taXQgKGhhc2ggc3JjLWxpbmUgcmVzLWxpbmUgbnVtLWxpbmVzKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciBnaXQtYmxhbWUtZmlsZSkKKyAgICAobGV0ICgoaW5mbyAoZ2V0aGFzaCBoYXNoIGdpdC1ibGFtZS1jYWNoZSkpCisgICAgICAgICAgKGluaGliaXQtcG9pbnQtbW90aW9uLWhvb2tzIHQpCisgICAgICAgICAgKGluaGliaXQtbW9kaWZpY2F0aW9uLWhvb2tzIHQpKQorICAgICAgKHdoZW4gKG5vdCBpbmZvKQorCTs7IEFzc2lnbiBhIHJhbmRvbSBjb2xvciB0byBlYWNoIG5ldyBjb21taXQgaW5mbworCTs7IFRha2UgY2FyZSBub3QgdG8gc2VsZWN0IHRoZSBzYW1lIGNvbG9yIG11bHRpcGxlIHRpbWVzCisJKGxldCAoKGNvbG9yIChpZiBnaXQtYmxhbWUtY29sb3JzCisJCQkgKGdpdC1ibGFtZS1yYW5kb20tcG9wIGdpdC1ibGFtZS1jb2xvcnMpCisJCSAgICAgICBnaXQtYmxhbWUtYW5jaWVudC1jb2xvcikpKQorICAgICAgICAgIChzZXRxIGluZm8gKGxpc3QgaGFzaCBzcmMtbGluZSByZXMtbGluZSBudW0tbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtZGVzY3JpYmUtY29tbWl0IGhhc2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAnY29sb3IgY29sb3IpKSkpCisgICAgICAgIChwdXRoYXNoIGhhc2ggaW5mbyBnaXQtYmxhbWUtY2FjaGUpKQorICAgICAgKGdvdG8tbGluZSByZXMtbGluZSkKKyAgICAgICh3aGlsZSAoPiBudW0tbGluZXMgMCkKKyAgICAgICAgKGlmIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdnaXQtYmxhbWUpCisgICAgICAgICAgICAoZm9yd2FyZC1saW5lKQorICAgICAgICAgIChsZXQqICgoc3RhcnQgKHBvaW50KSkKKyAgICAgICAgICAgICAgICAgKGVuZCAocHJvZ24gKGZvcndhcmQtbGluZSAxKSAocG9pbnQpKSkKKyAgICAgICAgICAgICAgICAgKG92bCAobWFrZS1vdmVybGF5IHN0YXJ0IGVuZCkpKQorICAgICAgICAgICAgKHB1c2ggb3ZsIGdpdC1ibGFtZS1vdmVybGF5cykKKyAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdmwgJ2dpdC1ibGFtZSBpbmZvKQorICAgICAgICAgICAgKG92ZXJsYXktcHV0IG92bCAnaGVscC1lY2hvIGhhc2gpCisgICAgICAgICAgICAob3ZlcmxheS1wdXQgb3ZsICdmYWNlIChsaXN0IDpiYWNrZ3JvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgKGFzc3EgJ2NvbG9yIChudGhjZHIgNSBpbmZvKSkpKSkKKyAgICAgICAgICAgIDs7IHRoZSBwb2ludC1lbnRlcmVkIHByb3BlcnR5IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIG92ZXJsYXlzCisgICAgICAgICAgICA7OyhvdmVybGF5LXB1dCBvdmwgJ3BvaW50LWVudGVyZWQKKyAgICAgICAgICAgIDs7ICAgICAgICAgICAgIGAobGFtYmRhICh4IHkpIChnaXQtYmxhbWUtaWRlbnRpZnkgLGhhc2gpKSkKKyAgICAgICAgICAgIChsZXQgKChtb2RpZmllZCAoYnVmZmVyLW1vZGlmaWVkLXApKSkKKyAgICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IChpZiAoPSBzdGFydCAxKSBzdGFydCAoMS0gc3RhcnQpKSAoMS0gZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvaW50LWVudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAobGFtYmRhICh4IHkpIChnaXQtYmxhbWUtaWRlbnRpZnkgLGhhc2gpKSkKKyAgICAgICAgICAgICAgKHNldC1idWZmZXItbW9kaWZpZWQtcCBtb2RpZmllZCkpKSkKKyAgICAgICAgKHNldHEgbnVtLWxpbmVzICgxLSBudW0tbGluZXMpKSkpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1hZGQtaW5mbyAoa2V5IHZhbHVlKQorICAoaWYgZ2l0LWJsYW1lLWN1cnJlbnQKKyAgICAgIChuY29uYyBnaXQtYmxhbWUtY3VycmVudCAobGlzdCAoY29ucyAoaW50ZXJuIGtleSkgdmFsdWUpKSkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLWN1cnJlbnQtY29tbWl0ICgpCisgIChsZXQgKChpbmZvIChnZXQtY2hhci1wcm9wZXJ0eSAocG9pbnQpICdnaXQtYmxhbWUpKSkKKyAgICAoaWYgaW5mbworICAgICAgICAoY2FyIGluZm8pCisgICAgICAoZXJyb3IgIk5vIGNvbW1pdCBpbmZvIikpKSkKKworKGRlZnVuIGdpdC1kZXNjcmliZS1jb21taXQgKGhhc2gpCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgdCBuaWwKKyAgICAgICAgICAgICAgICAgICJsb2ciICItMSIgIi0tcHJldHR5PW9uZWxpbmUiCisgICAgICAgICAgICAgICAgICBoYXNoKQorICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4KSkpKSkKKworKGRlZnZhciBnaXQtYmxhbWUtbGFzdC1pZGVudGlmaWNhdGlvbiBuaWwpCisobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dpdC1ibGFtZS1sYXN0LWlkZW50aWZpY2F0aW9uKQorKGRlZnVuIGdpdC1ibGFtZS1pZGVudGlmeSAoJm9wdGlvbmFsIGhhc2gpCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGluZm8gKGdldGhhc2ggKG9yIGhhc2ggKGdpdC1ibGFtZS1jdXJyZW50LWNvbW1pdCkpIGdpdC1ibGFtZS1jYWNoZSkpKQorICAgICh3aGVuIChhbmQgaW5mbyAobm90IChlcSBpbmZvIGdpdC1ibGFtZS1sYXN0LWlkZW50aWZpY2F0aW9uKSkpCisgICAgICAobWVzc2FnZSAiJXMiIChudGggNCBpbmZvKSkKKyAgICAgIChzZXRxIGdpdC1ibGFtZS1sYXN0LWlkZW50aWZpY2F0aW9uIGluZm8pKSkpCisKKzs7IChkZWZ1biBnaXQtYmxhbWUtYWZ0ZXItc2F2ZSAoKQorOzsgICAod2hlbiBnaXQtYmxhbWUtbW9kZQorOzsgICAgIChnaXQtYmxhbWUtY2xlYW51cCkKKzs7ICAgICAoZ2l0LWJsYW1lLXJ1bikpKQorOzsgKGFkZC1ob29rICdhZnRlci1zYXZlLWhvb2sgJ2dpdC1ibGFtZS1hZnRlci1zYXZlKQorCisoZGVmdW4gZ2l0LWJsYW1lLWFmdGVyLWNoYW5nZSAoc3RhcnQgZW5kIGxlbmd0aCkKKyAgKHdoZW4gZ2l0LWJsYW1lLW1vZGUKKyAgICAoZ2l0LWJsYW1lLWVucS11cGRhdGUgc3RhcnQgZW5kKSkpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlIG5pbCkKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLWxhc3QtdXBkYXRlKQorKGRlZnVuIGdpdC1ibGFtZS1lbnEtdXBkYXRlIChzdGFydCBlbmQpCisgICJNYXJrIHRoZSByZWdpb24gYmV0d2VlbiBTVEFSVCBhbmQgRU5EIGFzIG5lZWRpbmcgYmxhbWUgdXBkYXRlIgorICA7OyBUcnkgdG8gYmUgc21hcnQgYW5kIGF2b2lkIG11bHRpcGxlIGNhbGxvdXRzIGZvciBzZXF1ZW50aWFsCisgIDs7IGVkaXRpbmcKKyAgKGNvbmQgKChhbmQgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlCisgICAgICAgICAgICAgICg9IHN0YXJ0IChjZHIgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlKSkpCisgICAgICAgICAoc2V0Y2RyIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSBlbmQpKQorICAgICAgICAoKGFuZCBnaXQtYmxhbWUtbGFzdC11cGRhdGUKKyAgICAgICAgICAgICAgKD0gZW5kIChjYXIgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlKSkpCisgICAgICAgICAoc2V0Y2FyIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSBzdGFydCkpCisgICAgICAgICh0CisgICAgICAgICAoc2V0cSBnaXQtYmxhbWUtbGFzdC11cGRhdGUgKGNvbnMgc3RhcnQgZW5kKSkKKyAgICAgICAgIChzZXRxIGdpdC1ibGFtZS11cGRhdGUtcXVldWUgKG5jb25jIGdpdC1ibGFtZS11cGRhdGUtcXVldWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSkpKSkpCisgICh1bmxlc3MgKG9yIGdpdC1ibGFtZS1wcm9jIGdpdC1ibGFtZS1pZGxlLXRpbWVyKQorICAgIChzZXRxIGdpdC1ibGFtZS1pZGxlLXRpbWVyCisgICAgICAgICAgKHJ1bi13aXRoLWlkbGUtdGltZXIgMC41IG5pbCAnZ2l0LWJsYW1lLWRlbGF5ZWQtdXBkYXRlKSkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLWRlbGF5ZWQtdXBkYXRlICgpCisgIChzZXRxIGdpdC1ibGFtZS1pZGxlLXRpbWVyIG5pbCkKKyAgKGlmIGdpdC1ibGFtZS11cGRhdGUtcXVldWUKKyAgICAgIChsZXQgKChmaXJzdCAocG9wIGdpdC1ibGFtZS11cGRhdGUtcXVldWUpKQorICAgICAgICAgICAgKGluaGliaXQtcG9pbnQtbW90aW9uLWhvb2tzIHQpKQorICAgICAgICAoZ2l0LWJsYW1lLXVwZGF0ZS1yZWdpb24gKGNhciBmaXJzdCkgKGNkciBmaXJzdCkpKSkpCisKKyhwcm92aWRlICdnaXQtYmxhbWUpCisKKzs7OyBnaXQtYmxhbWUuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL2dpdC5lbCBiL2NvbnRyaWIvZW1hY3MvZ2l0LmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDAxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL2dpdC5lbApAQCAtMCwwICsxLDEyMTcgQEAKKzs7OyBnaXQuZWwgLS0tIEEgdXNlciBpbnRlcmZhY2UgZm9yIGdpdAorCis7OyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgQWxleGFuZHJlIEp1bGxpYXJkIDxqdWxsaWFyZEB3aW5laHEub3JnPgorCis7OyBWZXJzaW9uOiAxLjAKKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKzs7IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCis7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCis7OyB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCis7OyB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCis7OyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOzsKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOzsgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKzs7IE1BIDAyMTExLTEzMDcgVVNBCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW50ZXJmYWNlIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbAorOzsgc3lzdGVtLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgZ2l0Cis7OyBjb21tYW5kcy4gVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZhciBhcyBwb3NzaWJsZSBpZGVudGljYWwgdG8KKzs7IHRoYXQgb2YgdGhlIFBDTC1DVlMgbW9kZS4KKzs7Cis7OyBUbyBpbnN0YWxsOiBwdXQgdGhpcyBmaWxlIG9uIHRoZSBsb2FkLXBhdGggYW5kIHBsYWNlIHRoZSBmb2xsb3dpbmcKKzs7IGluIHlvdXIgLmVtYWNzIGZpbGU6Cis7OworOzsgICAgKHJlcXVpcmUgJ2dpdCkKKzs7Cis7OyBUbyBzdGFydDogYE0teCBnaXQtc3RhdHVzJworOzsKKzs7IFRPRE8KKzs7ICAtIHBvcnRhYmlsaXR5IHRvIFhFbWFjcworOzsgIC0gYmV0dGVyIGhhbmRsaW5nIG9mIHN1YnByb2Nlc3MgZXJyb3JzCis7OyAgLSBob29rIGludG8gZmlsZSBzYXZlIChhZnRlci1zYXZlLWhvb2spCis7OyAgLSBkaWZmIGFnYWluc3Qgb3RoZXIgYnJhbmNoCis7OyAgLSByZW5hbWluZyBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgYnVmZmVyCis7OyAgLSBjcmVhdGluZyB0YWdzCis7OyAgLSBmZXRjaC9wdWxsCis7OyAgLSBzd2l0Y2hpbmcgYnJhbmNoZXMKKzs7ICAtIHJldmxpc3QgYnJvd3NlcgorOzsgIC0gZ2l0LXNob3ctYnJhbmNoIGJyb3dzZXIKKzs7ICAtIG1lbnVzCis7OworCisoZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2NsKSkKKyhyZXF1aXJlICdld29jKQorKHJlcXVpcmUgJ2xvZy1lZGl0KQorCisKKzs7OzsgQ3VzdG9taXphdGlvbnMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZncm91cCBnaXQgbmlsCisgICJBIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgZ2l0IHZlcnNpb25pbmcgc3lzdGVtLiIKKyAgOmdyb3VwICd0b29scykKKworKGRlZmN1c3RvbSBnaXQtY29tbWl0dGVyLW5hbWUgbmlsCisgICJVc2VyIG5hbWUgdG8gdXNlIGZvciBjb21taXRzLgorVGhlIGRlZmF1bHQgaXMgdG8gZmFsbCBiYWNrIHRvIHRoZSByZXBvc2l0b3J5IGNvbmZpZywKK3RoZW4gdG8gYGFkZC1sb2ctZnVsbC1uYW1lJyBhbmQgdGhlbiB0byBgdXNlci1mdWxsLW5hbWUnLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIkRlZmF1bHQiIG5pbCkKKyAgICAgICAgICAgICAgICAgKHN0cmluZyA6dGFnICJOYW1lIikpKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXR0ZXItZW1haWwgbmlsCisgICJFbWFpbCBhZGRyZXNzIHRvIHVzZSBmb3IgY29tbWl0cy4KK1RoZSBkZWZhdWx0IGlzIHRvIGZhbGwgYmFjayB0byB0aGUgZ2l0IHJlcG9zaXRvcnkgY29uZmlnLAordGhlbiB0byBgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MnIGFuZCB0aGVuIHRvIGB1c2VyLW1haWwtYWRkcmVzcycuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiRGVmYXVsdCIgbmlsKQorICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIkVtYWlsIikpKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0gbmlsCisgICJEZWZhdWx0IGNvZGluZyBzeXN0ZW0gZm9yIHRoZSBsb2cgbWVzc2FnZSBvZiBnaXQgY29tbWl0cy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJGcm9tIHJlcG9zaXRvcnkgY29uZmlnIiBuaWwpCisgICAgICAgICAgICAgICAgIChjb2Rpbmctc3lzdGVtKSkpCisKKyhkZWZjdXN0b20gZ2l0LWFwcGVuZC1zaWduZWQtb2ZmLWJ5IG5pbAorICAiV2hldGhlciB0byBhcHBlbmQgYSBTaWduZWQtb2ZmLWJ5IGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlIGJlZm9yZSBlZGl0aW5nLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJ2Jvb2xlYW4pCisKKyhkZWZjdXN0b20gZ2l0LXJldXNlLXN0YXR1cy1idWZmZXIgdAorICAiV2hldGhlciBgZ2l0LXN0YXR1cycgc2hvdWxkIHRyeSB0byByZXVzZSBhbiBleGlzdGluZyBidWZmZXIKK2lmIHRoZXJlIGlzIGFscmVhZHkgb25lIHRoYXQgZGlzcGxheXMgdGhlIHNhbWUgZGlyZWN0b3J5LiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJ2Jvb2xlYW4pCisKKyhkZWZjdXN0b20gZ2l0LXBlci1kaXItaWdub3JlLWZpbGUgIi5naXRpZ25vcmUiCisgICJOYW1lIG9mIHRoZSBwZXItZGlyZWN0b3J5IGlnbm9yZSBmaWxlLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJ3N0cmluZykKKworCisoZGVmZmFjZSBnaXQtc3RhdHVzLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgInB1cnBsZSIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgYWRkZWQgYW5kIG1vZGlmaWVkIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC11bm1lcmdlZC1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJyZWQiIDpib2xkIHQpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgdW5tZXJnZWQgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXVua25vd24tZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiZ29sZGVucm9kIiA6Ym9sZCB0KSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IHVua25vd24gZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXVwdG9kYXRlLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImdyZXk2MCIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgdXAtdG8tZGF0ZSBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtaWdub3JlZC1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJncmV5NjAiKSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IGlnbm9yZWQgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LW1hcmstZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAicmVkIiA6Ym9sZCB0KSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgZm9yIHRoZSBmaWxlIG1hcmtzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1oZWFkZXItZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiYmx1ZSIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgY29tbWl0IGhlYWRlcnMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXNlcGFyYXRvci1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJicm93biIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgY29tbWl0IHNlcGFyYXRvci4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtcGVybWlzc2lvbi1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJncmVlbiIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIGZvciBwZXJtaXNzaW9uIGNoYW5nZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworCis7Ozs7IFV0aWxpdGllcworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZmNvbnN0IGdpdC1sb2ctbXNnLXNlcGFyYXRvciAiLS0tIGxvZyBtZXNzYWdlIGZvbGxvd3MgdGhpcyBsaW5lIC0tLSIpCisKKyhkZWZ2YXIgZ2l0LWxvZy1lZGl0LWZvbnQtbG9jay1rZXl3b3JkcworICBgKCgiXlxcKEF1dGhvcjpcXHxEYXRlOlxcfFBhcmVudDpcXHxTaWduZWQtb2ZmLWJ5OlxcKVxcKC4qXFwpJCIKKyAgICAgKDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkKKyAgICAgKDIgZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpCisgICAgKCwoY29uY2F0ICJeXFwoIiAocmVnZXhwLXF1b3RlIGdpdC1sb2ctbXNnLXNlcGFyYXRvcikgIlxcKSQiKQorICAgICAoMSBmb250LWxvY2stY29tbWVudC1mYWNlKSkpKQorCisoZGVmdW4gZ2l0LWdldC1lbnYtc3RyaW5ncyAoZW52KQorICAiQnVpbGQgYSBsaXN0IG9mIE5BTUU9VkFMVUUgc3RyaW5ncyBmcm9tIGEgbGlzdCBvZiBlbnZpcm9ubWVudCBzdHJpbmdzLiIKKyAgKG1hcGNhciAobGFtYmRhIChlbnRyeSkgKGNvbmNhdCAoY2FyIGVudHJ5KSAiPSIgKGNkciBlbnRyeSkpKSBlbnYpKQorCisoZGVmdW4gZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgKGJ1ZmZlciBlbnYgJnJlc3QgYXJncykKKyAgIldyYXBwZXIgZm9yIGNhbGwtcHJvY2VzcyB0aGF0IHNldHMgZW52aXJvbm1lbnQgc3RyaW5ncy4iCisgIChpZiBlbnYKKyAgICAgIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZW52IiBuaWwgYnVmZmVyIG5pbAorICAgICAgICAgICAgIChhcHBlbmQgKGdpdC1nZXQtZW52LXN0cmluZ3MgZW52KSAobGlzdCAiZ2l0IikgYXJncykpCisgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBidWZmZXIgbmlsIGFyZ3MpKSkKKworKGRlZnVuIGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyAoZW52ICZyZXN0IGFyZ3MpCisgICJXcmFwcGVyIGZvciBjYWxsLXByb2Nlc3MgdGhhdCBzZXRzIGVudmlyb25tZW50IHN0cmluZ3MsCithbmQgcmV0dXJucyB0aGUgcHJvY2VzcyBvdXRwdXQgYXMgYSBzdHJpbmcuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChhbmQgKGVxIDAgKGFwcGx5ICMnIGdpdC1jYWxsLXByb2Nlc3MtZW52IHQgZW52IGFyZ3MpKQorICAgICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpCisKKyhkZWZ1biBnaXQtcnVuLXByb2Nlc3MtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIHByb2dyYW0gYXJncykKKyAgIlJ1biBhIGdpdCBwcm9jZXNzIHdpdGggYSBidWZmZXIgcmVnaW9uIGFzIGlucHV0LiIKKyAgKGxldCAoKG91dHB1dC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAoY2QgZGlyKQorICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzLXJlZ2lvbiBzdGFydCBlbmQgcHJvZ3JhbQorICAgICAgICAgICAgIG5pbCAobGlzdCBvdXRwdXQtYnVmZmVyIG5pbCkgbmlsIGFyZ3MpKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtYnVmZmVyIChidWZmZXItbmFtZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQsIHNlbmRpbmcgdGhlIG91dHB1dCB0byBhIGJ1ZmZlciBuYW1lZCBCVUZGRVItTkFNRS4iCisgIChsZXQgKChkaXIgZGVmYXVsdC1kaXJlY3RvcnkpCisgICAgICAgIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZmZlci1uYW1lKSkpCisgICAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uIiAoY2FyIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IGRpcikKKyAgICAgICAgICAgIChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBuaWwgYXJncykpKQorICAgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLmRvbmUiIChjYXIgYXJncykpCisgICAgYnVmZmVyKSkKKworKGRlZnVuIGdpdC1ydW4tY29tbWFuZCAoYnVmZmVyIGVudiAmcmVzdCBhcmdzKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi4iIChjYXIgYXJncykpCisgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBlbnYgYXJncykKKyAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uZG9uZSIgKGNhciBhcmdzKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIGVudiAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgd2l0aCBzcGVjaWZpZWQgYnVmZmVyIHJlZ2lvbiBhcyBpbnB1dC4iCisgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLiIgKGNhciBhcmdzKSkKKyAgKHVubGVzcyAoZXEgMCAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLXByb2Nlc3MtcmVnaW9uCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJlbnYiCisgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChnaXQtZ2V0LWVudi1zdHJpbmdzIGVudikgKGxpc3QgImdpdCIpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgKGdpdC1ydW4tcHJvY2Vzcy1yZWdpb24KKyAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJnaXQiIGFyZ3MpKSkKKyAgICAoZXJyb3IgIkZhaWxlZCB0byBydW4gXCJnaXQgJXNcIjpcbiVzIiAobWFwY29uY2F0IChsYW1iZGEgKHgpIHgpIGFyZ3MgIiAiKSAoYnVmZmVyLXN0cmluZykpKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi5kb25lIiAoY2FyIGFyZ3MpKSkKKworKGRlZnVuIGdpdC1ydW4taG9vayAoaG9vayBlbnYgJnJlc3QgYXJncykKKyAgIlJ1biBhIGdpdCBob29rIGFuZCBkaXNwbGF5IGl0cyBvdXRwdXQgaWYgYW55LiIKKyAgKGxldCAoKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgICAgICAgKGhvb2stbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoY29uY2F0ICIuZ2l0L2hvb2tzLyIgaG9vaykpKSkKKyAgICAob3IgKG5vdCAoZmlsZS1leGVjdXRhYmxlLXAgaG9vay1uYW1lKSkKKyAgICAgICAgKGxldCAoc3RhdHVzIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqR2l0IEhvb2sgT3V0cHV0KiIpKSkKKyAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgICAgICAoY2QgZGlyKQorICAgICAgICAgICAgKHNldHEgc3RhdHVzCisgICAgICAgICAgICAgICAgICAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJlbnYiIG5pbCAobGlzdCBidWZmZXIgdCkgbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgKGdpdC1nZXQtZW52LXN0cmluZ3MgZW52KSAobGlzdCBob29rLW5hbWUpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgIydjYWxsLXByb2Nlc3MgaG9vay1uYW1lIG5pbCAobGlzdCBidWZmZXIgdCkgbmlsIGFyZ3MpKSkpCisgICAgICAgICAgKGRpc3BsYXktbWVzc2FnZS1vci1idWZmZXIgYnVmZmVyKQorICAgICAgICAgIChlcSAwIHN0YXR1cykpKSkpCisKKyhkZWZ1biBnaXQtZ2V0LXN0cmluZy1zaGExIChzdHJpbmcpCisgICJSZWFkIGEgU0hBMSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiIKKyAgKGFuZCBzdHJpbmcKKyAgICAgICAoc3RyaW5nLW1hdGNoICJbMC05YS1mXVxcezQwXFx9IiBzdHJpbmcpCisgICAgICAgKG1hdGNoLXN0cmluZyAwIHN0cmluZykpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXR0ZXItbmFtZSAoKQorICAiUmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBhcyBHSVRfQ09NTUlUVEVSX05BTUUuIgorICA7IGNvcGllZCBmcm9tIGxvZy1lZGl0CisgIChvciBnaXQtY29tbWl0dGVyLW5hbWUKKyAgICAgIChnaXQtY29uZmlnICJ1c2VyLm5hbWUiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLWZ1bGwtbmFtZSkgYWRkLWxvZy1mdWxsLW5hbWUpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLWZ1bGwtbmFtZSkgKHVzZXItZnVsbC1uYW1lKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1mdWxsLW5hbWUpIHVzZXItZnVsbC1uYW1lKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCAoKQorICAiUmV0dXJuIHRoZSBlbWFpbCBhZGRyZXNzIHRvIHVzZSBhcyBHSVRfQ09NTUlUVEVSX0VNQUlMLiIKKyAgOyBjb3BpZWQgZnJvbSBsb2ctZWRpdAorICAob3IgZ2l0LWNvbW1pdHRlci1lbWFpbAorICAgICAgKGdpdC1jb25maWcgInVzZXIuZW1haWwiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLW1haWxpbmctYWRkcmVzcykgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLW1haWwtYWRkcmVzcykgKHVzZXItbWFpbC1hZGRyZXNzKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1tYWlsLWFkZHJlc3MpIHVzZXItbWFpbC1hZGRyZXNzKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSAoKQorICAiUmV0dXJuIHRoZSBjb2Rpbmcgc3lzdGVtIHRvIHVzZSBmb3IgY29tbWl0cy4iCisgIChsZXQgKChyZXBvLWNvbmZpZyAoZ2l0LWNvbmZpZyAiaTE4bi5jb21taXRlbmNvZGluZyIpKSkKKyAgICAob3IgZ2l0LWNvbW1pdHMtY29kaW5nLXN5c3RlbQorICAgICAgICAoYW5kIHJlcG8tY29uZmlnCisgICAgICAgICAgICAgKGZib3VuZHAgJ2xvY2FsZS1jaGFyc2V0LXRvLWNvZGluZy1zeXN0ZW0pCisgICAgICAgICAgICAgKGxvY2FsZS1jaGFyc2V0LXRvLWNvZGluZy1zeXN0ZW0gcmVwby1jb25maWcpKQorICAgICAgJ3V0Zi04KSkpCisKKyhkZWZ1biBnaXQtZ2V0LWxvZ291dHB1dC1jb2Rpbmctc3lzdGVtICgpCisgICJSZXR1cm4gdGhlIGNvZGluZyBzeXN0ZW0gdXNlZCBmb3IgZ2l0LWxvZyBvdXRwdXQuIgorICAobGV0ICgocmVwby1jb25maWcgKG9yIChnaXQtY29uZmlnICJpMThuLmxvZ291dHB1dGVuY29kaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWNvbmZpZyAiaTE4bi5jb21taXRlbmNvZGluZyIpKSkpCisgICAgKG9yIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0KKyAgICAgICAgKGFuZCByZXBvLWNvbmZpZworICAgICAgICAgICAgIChmYm91bmRwICdsb2NhbGUtY2hhcnNldC10by1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgICAgIChsb2NhbGUtY2hhcnNldC10by1jb2Rpbmctc3lzdGVtIHJlcG8tY29uZmlnKSkKKyAgICAgICd1dGYtOCkpKQorCisoZGVmdW4gZ2l0LWVzY2FwZS1maWxlLW5hbWUgKG5hbWUpCisgICJFc2NhcGUgYSBmaWxlIG5hbWUgaWYgbmVjZXNzYXJ5LiIKKyAgKGlmIChzdHJpbmctbWF0Y2ggIltcblx0XCJcXF0iIG5hbWUpCisgICAgICAoY29uY2F0ICJcIiIKKyAgICAgICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChjKQorICAgICAgICAgICAgICAgICAgIChjYXNlIGMKKyAgICAgICAgICAgICAgICAgICAgICg/XG4gIlxcbiIpCisgICAgICAgICAgICAgICAgICAgICAoP1x0ICJcXHQiKQorICAgICAgICAgICAgICAgICAgICAgKD9cXCAiXFxcXCIpCisgICAgICAgICAgICAgICAgICAgICAoP1wiICJcXFwiIikKKyAgICAgICAgICAgICAgICAgICAgICh0IChjaGFyLXRvLXN0cmluZyBjKSkpKQorICAgICAgICAgICAgICAgICBuYW1lICIiKQorICAgICAgICAgICAgICAiXCIiKQorICAgIG5hbWUpKQorCisoZGVmdW4gZ2l0LWdldC10b3AtZGlyIChkaXIpCisgICJSZXRyaWV2ZSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiBhIGdpdCB0cmVlLiIKKyAgKGxldCAoKGNkdXAgKHdpdGgtb3V0cHV0LXRvLXN0cmluZworICAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgICAgKGNkIGRpcikKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKGVxIDAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgdCBuaWwgInJldi1wYXJzZSIgIi0tc2hvdy1jZHVwIikpCisgICAgICAgICAgICAgICAgICAgIChlcnJvciAiY2Fubm90IGZpbmQgdG9wLWxldmVsIGdpdCB0cmVlIGZvciAlcy4iIGRpcikpKSkpKQorICAgIChleHBhbmQtZmlsZS1uYW1lIChjb25jYXQgKGZpbGUtbmFtZS1hcy1kaXJlY3RvcnkgZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciAoc3BsaXQtc3RyaW5nIGNkdXAgIlxuIikpKSkpKQorCis7c3RvbGVuIGZyb20gcGNsLWN2cworKGRlZnVuIGdpdC1hcHBlbmQtdG8taWdub3JlIChmaWxlKQorICAiQWRkIGEgZmlsZSBuYW1lIHRvIHRoZSBpZ25vcmUgZmlsZSBpbiBpdHMgZGlyZWN0b3J5LiIKKyAgKGxldCogKChmdWxsbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlKSkKKyAgICAgICAgIChkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZnVsbG5hbWUpKQorICAgICAgICAgKG5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZnVsbG5hbWUpKQorICAgICAgICAgKGlnbm9yZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIGdpdC1wZXItZGlyLWlnbm9yZS1maWxlIGRpcikpCisgICAgICAgICAoY3JlYXRlZCAobm90IChmaWxlLWV4aXN0cy1wIGlnbm9yZS1uYW1lKSkpKQorICAoc2F2ZS13aW5kb3ctZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIgKGZpbmQtZmlsZS1ub3NlbGVjdCBpZ25vcmUtbmFtZSkpCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAodW5sZXNzICh6ZXJvcCAoY3VycmVudC1jb2x1bW4pKSAoaW5zZXJ0ICJcbiIpKQorICAgIChpbnNlcnQgIi8iIG5hbWUgIlxuIikKKyAgICAoc29ydC1saW5lcyBuaWwgKHBvaW50LW1pbikgKHBvaW50LW1heCkpCisgICAgKHNhdmUtYnVmZmVyKSkKKyAgKHdoZW4gY3JlYXRlZAorICAgIChnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1pbmZvLW9ubHkiICItLWFkZCIgIi0tIiAoZmlsZS1yZWxhdGl2ZS1uYW1lIGlnbm9yZS1uYW1lKSkpCisgIChnaXQtYWRkLXN0YXR1cy1maWxlIChpZiBjcmVhdGVkICdhZGRlZCAnbW9kaWZpZWQpIChmaWxlLXJlbGF0aXZlLW5hbWUgaWdub3JlLW5hbWUpKSkpCisKKzsgcHJvcGVydGl6ZSBkZWZpbml0aW9uIGZvciBYRW1hY3MsIHN0b2xlbiBmcm9tIGVyYy1jb21wYXQKKyhldmFsLXdoZW4tY29tcGlsZQorICAodW5sZXNzIChmYm91bmRwICdwcm9wZXJ0aXplKQorICAgIChkZWZ1biBwcm9wZXJ0aXplIChzdHJpbmcgJnJlc3QgcHJvcHMpCisgICAgICAobGV0ICgoc3RyaW5nIChjb3B5LXNlcXVlbmNlIHN0cmluZykpKQorICAgICAgICAod2hpbGUgcHJvcHMKKyAgICAgICAgICAocHV0LXRleHQtcHJvcGVydHkgMCAobGVuZ3RoIHN0cmluZykgKG50aCAwIHByb3BzKSAobnRoIDEgcHJvcHMpIHN0cmluZykKKyAgICAgICAgICAoc2V0cSBwcm9wcyAoY2RkciBwcm9wcykpKQorICAgICAgICBzdHJpbmcpKSkpCisKKzs7OzsgV3JhcHBlcnMgZm9yIGJhc2ljIGdpdCBjb21tYW5kcworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1yZXYtcGFyc2UgKHJldikKKyAgIlBhcnNlIGEgcmV2aXNpb24gbmFtZSBhbmQgcmV0dXJuIGl0cyBTSEExLiIKKyAgKGdpdC1nZXQtc3RyaW5nLXNoYTEKKyAgIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJyZXYtcGFyc2UiIHJldikpKQorCisoZGVmdW4gZ2l0LWNvbmZpZyAoa2V5KQorICAiUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgdG8gS0VZIGluIHRoZSBnaXQgcmVwb3NpdG9yeSBjb25maWcgZmlsZS4iCisgIChsZXQgKChzdHIgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyBuaWwgImNvbmZpZyIga2V5KSkpCisgICAgKGFuZCBzdHIgKGNhciAoc3BsaXQtc3RyaW5nIHN0ciAiXG4iKSkpKSkKKworKGRlZnVuIGdpdC1zeW1ib2xpYy1yZWYgKHJlZikKKyAgIldyYXBwZXIgZm9yIHRoZSBnaXQtc3ltYm9saWMtcmVmIGNvbW1hbmQuIgorICAobGV0ICgoc3RyIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJzeW1ib2xpYy1yZWYiIHJlZikpKQorICAgIChhbmQgc3RyIChjYXIgKHNwbGl0LXN0cmluZyBzdHIgIlxuIikpKSkpCisKKyhkZWZ1biBnaXQtdXBkYXRlLXJlZiAocmVmIG5ld3ZhbCAmb3B0aW9uYWwgb2xkdmFsIHJlYXNvbikKKyAgIlVwZGF0ZSBhIHJlZmVyZW5jZSBieSBjYWxsaW5nIGdpdC11cGRhdGUtcmVmLiIKKyAgKGxldCAoKGFyZ3MgKGFuZCBvbGR2YWwgKGxpc3Qgb2xkdmFsKSkpKQorICAgIChwdXNoIG5ld3ZhbCBhcmdzKQorICAgIChwdXNoIHJlZiBhcmdzKQorICAgICh3aGVuIHJlYXNvbgorICAgICAocHVzaCByZWFzb24gYXJncykKKyAgICAgKHB1c2ggIi1tIiBhcmdzKSkKKyAgICAoZXEgMCAoYXBwbHkgIydnaXQtY2FsbC1wcm9jZXNzLWVudiBuaWwgbmlsICJ1cGRhdGUtcmVmIiBhcmdzKSkpKQorCisoZGVmdW4gZ2l0LXJlYWQtdHJlZSAodHJlZSAmb3B0aW9uYWwgaW5kZXgtZmlsZSkKKyAgIlJlYWQgYSB0cmVlIGludG8gdGhlIGluZGV4IGZpbGUuIgorICAoYXBwbHkgIydnaXQtY2FsbC1wcm9jZXNzLWVudiBuaWwKKyAgICAgICAgIChpZiBpbmRleC1maWxlIGAoKCJHSVRfSU5ERVhfRklMRSIgLiAsaW5kZXgtZmlsZSkpIG5pbCkKKyAgICAgICAgICJyZWFkLXRyZWUiIChpZiB0cmVlIChsaXN0IHRyZWUpKSkpCisKKyhkZWZ1biBnaXQtd3JpdGUtdHJlZSAoJm9wdGlvbmFsIGluZGV4LWZpbGUpCisgICJDYWxsIGdpdC13cml0ZS10cmVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyB0cmVlIFNIQTEgYXMgYSBzdHJpbmcuIgorICAoZ2l0LWdldC1zdHJpbmctc2hhMQorICAgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyAoYW5kIGluZGV4LWZpbGUgYCgoIkdJVF9JTkRFWF9GSUxFIiAuICxpbmRleC1maWxlKSkpICJ3cml0ZS10cmVlIikpKQorCisoZGVmdW4gZ2l0LWNvbW1pdC10cmVlIChidWZmZXIgdHJlZSBoZWFkKQorICAiQ2FsbCBnaXQtY29tbWl0LXRyZWUgd2l0aCBidWZmZXIgYXMgaW5wdXQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGNvbW1pdCBTSEExLiIKKyAgKGxldCAoKGF1dGhvci1uYW1lIChnaXQtZ2V0LWNvbW1pdHRlci1uYW1lKSkKKyAgICAgICAgKGF1dGhvci1lbWFpbCAoZ2l0LWdldC1jb21taXR0ZXItZW1haWwpKQorICAgICAgICAoc3ViamVjdCAiY29tbWl0IChpbml0aWFsKTogIikKKyAgICAgICAgYXV0aG9yLWRhdGUgbG9nLXN0YXJ0IGxvZy1lbmQgYXJncyBjb2Rpbmctc3lzdGVtLWZvci13cml0ZSkKKyAgICAod2hlbiBoZWFkCisgICAgICAoc2V0cSBzdWJqZWN0ICJjb21taXQ6ICIpCisgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAocHVzaCBoZWFkIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgIChpZgorICAgICAgICAgIChzZXRxIGxvZy1zdGFydCAocmUtc2VhcmNoLWZvcndhcmQgKGNvbmNhdCAiXiIgKHJlZ2V4cC1xdW90ZSBnaXQtbG9nLW1zZy1zZXBhcmF0b3IpICJcbiIpIG5pbCB0KSkKKyAgICAgICAgICAoc2F2ZS1yZXN0cmljdGlvbgorICAgICAgICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50LW1pbikgbG9nLXN0YXJ0KQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkF1dGhvcjogK1xcKC4qP1xcKSAqPFxcKC4qXFwpPiAqJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIGF1dGhvci1uYW1lIChtYXRjaC1zdHJpbmcgMSkKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yLWVtYWlsIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkRhdGU6ICtcXCguKlxcKSQiIG5pbCB0KQorICAgICAgICAgICAgICAoc2V0cSBhdXRob3ItZGF0ZSAobWF0Y2gtc3RyaW5nIDEpKSkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJeUGFyZW50OiArXFwoWzAtOWEtZl0rXFwpIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHVubGVzcyAoc3RyaW5nLWVxdWFsIGhlYWQgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgICAoc2V0cSBzdWJqZWN0ICJjb21taXQgKG1lcmdlKTogIikKKyAgICAgICAgICAgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAgICAgICAgICAgKHB1c2ggKG1hdGNoLXN0cmluZyAxKSBhcmdzKSkpKQorICAgICAgICAoc2V0cSBsb2ctc3RhcnQgKHBvaW50LW1pbikpKQorICAgICAgKHNldHEgbG9nLWVuZCAocG9pbnQtbWF4KSkKKyAgICAgIChnb3RvLWNoYXIgbG9nLXN0YXJ0KQorICAgICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICIuKiQiIG5pbCB0KQorICAgICAgICAoc2V0cSBzdWJqZWN0IChjb25jYXQgc3ViamVjdCAobWF0Y2gtc3RyaW5nIDApKSkpCisgICAgICAoc2V0cSBjb2Rpbmctc3lzdGVtLWZvci13cml0ZSBidWZmZXItZmlsZS1jb2Rpbmctc3lzdGVtKSkKKyAgICAobGV0ICgoY29tbWl0CisgICAgICAgICAgIChnaXQtZ2V0LXN0cmluZy1zaGExCisgICAgICAgICAgICAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgIChsZXQgKChlbnYgYCgoIkdJVF9BVVRIT1JfTkFNRSIgLiAsYXV0aG9yLW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiR0lUX0FVVEhPUl9FTUFJTCIgLiAsYXV0aG9yLWVtYWlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9DT01NSVRURVJfTkFNRSIgLiAsKGdpdC1nZXQtY29tbWl0dGVyLW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9DT01NSVRURVJfRU1BSUwiIC4gLChnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCkpKSkpCisgICAgICAgICAgICAgICAgICAod2hlbiBhdXRob3ItZGF0ZSAocHVzaCBgKCJHSVRfQVVUSE9SX0RBVEUiIC4gLGF1dGhvci1kYXRlKSBlbnYpKQorICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLXJlZ2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBsb2ctc3RhcnQgbG9nLWVuZCBlbnYKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWl0LXRyZWUiIHRyZWUgKG5yZXZlcnNlIGFyZ3MpKSkpKSkpKQorICAgICAgKGFuZCAoZ2l0LXVwZGF0ZS1yZWYgIkhFQUQiIGNvbW1pdCBoZWFkIHN1YmplY3QpCisgICAgICAgICAgIGNvbW1pdCkpKSkKKworKGRlZnVuIGdpdC1lbXB0eS1kYi1wICgpCisgICJDaGVjayBpZiB0aGUgZ2l0IGRiIGlzIGVtcHR5IChubyBjb21taXQgZG9uZSB5ZXQpLiIKKyAgKG5vdCAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBuaWwgbmlsICJyZXYtcGFyc2UiICItLXZlcmlmeSIgIkhFQUQiKSkpKQorCisoZGVmdW4gZ2l0LWdldC1tZXJnZS1oZWFkcyAoKQorICAiUmV0cmlldmUgdGhlIG1lcmdlIGhlYWRzIGZyb20gdGhlIE1FUkdFX0hFQUQgZmlsZSBpZiBwcmVzZW50LiIKKyAgKGxldCAoaGVhZHMpCisgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9NRVJHRV9IRUFEIikKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmdpdC9NRVJHRV9IRUFEIiBuaWwgbmlsIG5pbCB0KQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC05YS1mXVxcezQwXFx9IiBuaWwgdCkKKyAgICAgICAgICAocHVzaCAobWF0Y2gtc3RyaW5nIDApIGhlYWRzKSkpKQorICAgIChucmV2ZXJzZSBoZWFkcykpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXQtZGVzY3JpcHRpb24gKGNvbW1pdCkKKyAgIkdldCBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIENPTU1JVC4iCisgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIChnaXQtZ2V0LWxvZ291dHB1dC1jb2Rpbmctc3lzdGVtKSkpCisgICAgKGxldCAoKGRlc2NyIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJsb2ciICItLW1heC1jb3VudD0xIiAiLS1wcmV0dHk9b25lbGluZSIgY29tbWl0KSkpCisgICAgICAoaWYgKGFuZCBkZXNjciAoc3RyaW5nLW1hdGNoICJcXGBcXChbMC05YS1mXVxcezQwXFx9XFwpICpcXCguKlxcKSQiIGRlc2NyKSkKKyAgICAgICAgICAoY29uY2F0IChzdWJzdHJpbmcgKG1hdGNoLXN0cmluZyAxIGRlc2NyKSAwIDEwKSAiIC0gIiAobWF0Y2gtc3RyaW5nIDIgZGVzY3IpKQorICAgICAgICBkZXNjcikpKSkKKworOzs7OyBGaWxlIGluZm8gc3RydWN0dXJlCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IGZpbGVpbmZvIHN0cnVjdHVyZSBzdG9sZW4gZnJvbSBwY2wtY3ZzCisoZGVmc3RydWN0IChnaXQtZmlsZWluZm8KKyAgICAgICAgICAgICg6Y29waWVyIG5pbCkKKyAgICAgICAgICAgICg6Y29uc3RydWN0b3IgZ2l0LWNyZWF0ZS1maWxlaW5mbyAoc3RhdGUgbmFtZSAmb3B0aW9uYWwgb2xkLXBlcm0gbmV3LXBlcm0gcmVuYW1lLXN0YXRlIG9yaWctbmFtZSBtYXJrZWQpKQorICAgICAgICAgICAgKDpjb25jLW5hbWUgZ2l0LWZpbGVpbmZvLT4pKQorICBtYXJrZWQgICAgICAgICAgICAgIDs7IHQvbmlsCisgIHN0YXRlICAgICAgICAgICAgICAgOzsgY3VycmVudCBzdGF0ZQorICBuYW1lICAgICAgICAgICAgICAgIDs7IGZpbGUgbmFtZQorICBvbGQtcGVybSBuZXctcGVybSAgIDs7IHBlcm1pc3Npb24gZmxhZ3MKKyAgcmVuYW1lLXN0YXRlICAgICAgICA7OyByZW5hbWUgb3IgY29weSBzdGF0ZQorICBvcmlnLW5hbWUgICAgICAgICAgIDs7IG9yaWdpbmFsIG5hbWUgZm9yIHJlbmFtZXMgb3IgY29waWVzCisgIG5lZWRzLXJlZnJlc2gpICAgICAgOzsgd2hldGhlciBmaWxlIG5lZWRzIHRvIGJlIHJlZnJlc2hlZAorCisoZGVmdmFyIGdpdC1zdGF0dXMgbmlsKQorCisoZGVmdW4gZ2l0LWNsZWFyLXN0YXR1cyAoc3RhdHVzKQorICAiUmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhdHVzIGxpc3QuIgorICAoZXdvYy1maWx0ZXIgc3RhdHVzIChsYW1iZGEgKGluZm8pIG5pbCkpKQorCisoZGVmdW4gZ2l0LXNldC1maWxlcy1zdGF0ZSAoZmlsZXMgc3RhdGUpCisgICJTZXQgdGhlIHN0YXRlIG9mIGEgbGlzdCBvZiBmaWxlcy4iCisgIChkb2xpc3QgKGluZm8gZmlsZXMpCisgICAgKHVubGVzcyAoZXEgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykgc3RhdGUpCisgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSBzdGF0ZSkKKyAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPnJlbmFtZS1zdGF0ZSBpbmZvKSBuaWwpCisgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5vcmlnLW5hbWUgaW5mbykgbmlsKQorICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+bmVlZHMtcmVmcmVzaCBpbmZvKSB0KSkpKQorCisoZGVmdW4gZ2l0LXN0YXRlLWNvZGUgKGNvZGUpCisgICJDb252ZXJ0IGZyb20gYSBzdHJpbmcgdG8gYSBhZGRlZC9kZWxldGVkL21vZGlmaWVkIHN0YXRlLiIKKyAgKGNhc2UgKHN0cmluZy10by1jaGFyIGNvZGUpCisgICAgKD9NICdtb2RpZmllZCkKKyAgICAoPz8gJ3Vua25vd24pCisgICAgKD9BICdhZGRlZCkKKyAgICAoP0QgJ2RlbGV0ZWQpCisgICAgKD9VICd1bm1lcmdlZCkKKyAgICAodCBuaWwpKSkKKworKGRlZnVuIGdpdC1zdGF0dXMtY29kZS1hcy1zdHJpbmcgKGNvZGUpCisgICJGb3JtYXQgYSBnaXQgc3RhdHVzIGNvZGUgYXMgc3RyaW5nLiIKKyAgKGNhc2UgY29kZQorICAgICgnbW9kaWZpZWQgKHByb3BlcnRpemUgIk1vZGlmaWVkIiAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKSkKKyAgICAoJ3Vua25vd24gIChwcm9wZXJ0aXplICJVbmtub3duICIgJ2ZhY2UgJ2dpdC11bmtub3duLWZhY2UpKQorICAgICgnYWRkZWQgICAgKHByb3BlcnRpemUgIkFkZGVkICAgIiAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKSkKKyAgICAoJ2RlbGV0ZWQgIChwcm9wZXJ0aXplICJEZWxldGVkICIgJ2ZhY2UgJ2dpdC1zdGF0dXMtZmFjZSkpCisgICAgKCd1bm1lcmdlZCAocHJvcGVydGl6ZSAiVW5tZXJnZWQiICdmYWNlICdnaXQtdW5tZXJnZWQtZmFjZSkpCisgICAgKCd1cHRvZGF0ZSAocHJvcGVydGl6ZSAiVXB0b2RhdGUiICdmYWNlICdnaXQtdXB0b2RhdGUtZmFjZSkpCisgICAgKCdpZ25vcmVkICAocHJvcGVydGl6ZSAiSWdub3JlZCAiICdmYWNlICdnaXQtaWdub3JlZC1mYWNlKSkKKyAgICAodCAiPyAgICAgICAiKSkpCisKKyhkZWZ1biBnaXQtcmVuYW1lLWFzLXN0cmluZyAoaW5mbykKKyAgIlJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb3B5IG9yIHJlbmFtZSBhc3NvY2lhdGVkIHdpdGggSU5GTywgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUuIgorICAobGV0ICgoc3RhdGUgKGdpdC1maWxlaW5mby0+cmVuYW1lLXN0YXRlIGluZm8pKSkKKyAgICAoaWYgc3RhdGUKKyAgICAgICAgKHByb3BlcnRpemUKKyAgICAgICAgIChjb25jYXQgIiAgICgiCisgICAgICAgICAgICAgICAgIChpZiAoZXEgc3RhdGUgJ2NvcHkpICJjb3BpZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgKGlmIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAnYWRkZWQpICJyZW5hbWVkIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgInJlbmFtZWQgdG8gIikpCisgICAgICAgICAgICAgICAgIChnaXQtZXNjYXBlLWZpbGUtbmFtZSAoZ2l0LWZpbGVpbmZvLT5vcmlnLW5hbWUgaW5mbykpCisgICAgICAgICAgICAgICAgICIpIikgJ2ZhY2UgJ2dpdC1zdGF0dXMtZmFjZSkKKyAgICAgICIiKSkpCisKKyhkZWZ1biBnaXQtcGVybWlzc2lvbnMtYXMtc3RyaW5nIChvbGQtcGVybSBuZXctcGVybSkKKyAgIkZvcm1hdCBhIHBlcm1pc3Npb24gY2hhbmdlIGFzIHN0cmluZy4iCisgIChwcm9wZXJ0aXplCisgICAoaWYgKG9yIChub3Qgb2xkLXBlcm0pCisgICAgICAgICAgIChub3QgbmV3LXBlcm0pCisgICAgICAgICAgIChlcSAwIChsb2dhbmQgP1wxMTEgKGxvZ3hvciBvbGQtcGVybSBuZXctcGVybSkpKSkKKyAgICAgICAiICAiCisgICAgIChpZiAoZXEgMCAobG9nYW5kID9cMTExIG9sZC1wZXJtKSkgIit4IiAiLXgiKSkKKyAgJ2ZhY2UgJ2dpdC1wZXJtaXNzaW9uLWZhY2UpKQorCisoZGVmdW4gZ2l0LWZpbGVpbmZvLXByZXR0eXByaW50IChpbmZvKQorICAiUHJldHR5LXByaW50ZXIgZm9yIHRoZSBnaXQtZmlsZWluZm8gc3RydWN0dXJlLiIKKyAgKGluc2VydCAoY29uY2F0ICIgICAiIChpZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgKHByb3BlcnRpemUgIioiICdmYWNlICdnaXQtbWFyay1mYWNlKSAiICIpCisgICAgICAgICAgICAgICAgICAiICIgKGdpdC1zdGF0dXMtY29kZS1hcy1zdHJpbmcgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykpCisgICAgICAgICAgICAgICAgICAiICIgKGdpdC1wZXJtaXNzaW9ucy1hcy1zdHJpbmcgKGdpdC1maWxlaW5mby0+b2xkLXBlcm0gaW5mbykgKGdpdC1maWxlaW5mby0+bmV3LXBlcm0gaW5mbykpCisgICAgICAgICAgICAgICAgICAiICAiIChnaXQtZXNjYXBlLWZpbGUtbmFtZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKQorICAgICAgICAgICAgICAgICAgKGdpdC1yZW5hbWUtYXMtc3RyaW5nIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcGFyc2Utc3RhdHVzIChzdGF0dXMpCisgICJQYXJzZSB0aGUgb3V0cHV0IG9mIGdpdC1kaWZmLWluZGV4IGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQKKyAgICAgICAgICAiOlxcKFswLTddXFx7NlxcfVxcKSBcXChbMC03XVxcezZcXH1cXCkgWzAtOWEtZl1cXHs0MFxcfSBbMC05YS1mXVxcezQwXFx9IFxcKFxcKFtBRE1VXVxcKVwwXFwoW15cMF0rXFwpXFx8XFwoW0NSXVxcKVswLTldKlwwXFwoW15cMF0rXFwpXDBcXChbXlwwXStcXClcXClcMCIKKyAgICAgICAgICBuaWwgdCAxKQorICAgIChsZXQgKChvbGQtcGVybSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDEpIDgpKQorICAgICAgICAgIChuZXctcGVybSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDIpIDgpKQorICAgICAgICAgIChzdGF0ZSAob3IgKG1hdGNoLXN0cmluZyA0KSAobWF0Y2gtc3RyaW5nIDYpKSkKKyAgICAgICAgICAobmFtZSAob3IgKG1hdGNoLXN0cmluZyA1KSAobWF0Y2gtc3RyaW5nIDcpKSkKKyAgICAgICAgICAobmV3LW5hbWUgKG1hdGNoLXN0cmluZyA4KSkpCisgICAgICAoaWYgbmV3LW5hbWUgIDsgY29weSBvciByZW5hbWUKKyAgICAgICAgICAoaWYgKGVxID9DIChzdHJpbmctdG8tY2hhciBzdGF0ZSkpCisgICAgICAgICAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvICdhZGRlZCBuZXctbmFtZSBvbGQtcGVybSBuZXctcGVybSAnY29weSBuYW1lKSkKKyAgICAgICAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvICdkZWxldGVkIG5hbWUgMCAwICdyZW5hbWUgbmV3LW5hbWUpKQorICAgICAgICAgICAgKGV3b2MtZW50ZXItbGFzdCBzdGF0dXMgKGdpdC1jcmVhdGUtZmlsZWluZm8gJ2FkZGVkIG5ldy1uYW1lIG9sZC1wZXJtIG5ldy1wZXJtICdyZW5hbWUgbmFtZSkpKQorICAgICAgICAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyAoZ2l0LWNyZWF0ZS1maWxlaW5mbyAoZ2l0LXN0YXRlLWNvZGUgc3RhdGUpIG5hbWUgb2xkLXBlcm0gbmV3LXBlcm0pKSkpKSkKKworKGRlZnVuIGdpdC1maW5kLXN0YXR1cy1maWxlIChzdGF0dXMgZmlsZSkKKyAgIkZpbmQgYSBnaXZlbiBmaWxlIGluIHRoZSBzdGF0dXMgZXdvYyBhbmQgcmV0dXJuIGl0cyBub2RlLiIKKyAgKGxldCAoKG5vZGUgKGV3b2MtbnRoIHN0YXR1cyAwKSkpCisgICAgKHdoaWxlIChhbmQgbm9kZSAobm90IChzdHJpbmc9IGZpbGUgKGdpdC1maWxlaW5mby0+bmFtZSAoZXdvYy1kYXRhIG5vZGUpKSkpKQorICAgICAgKHNldHEgbm9kZSAoZXdvYy1uZXh0IHN0YXR1cyBub2RlKSkpCisgICAgbm9kZSkpCisKKyhkZWZ1biBnaXQtcGFyc2UtbHMtZmlsZXMgKHN0YXR1cyBkZWZhdWx0LXN0YXRlICZvcHRpb25hbCBza2lwLWV4aXN0aW5nKQorICAiUGFyc2UgdGhlIG91dHB1dCBvZiBnaXQtbHMtZmlsZXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKKyAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgKGxldCAoaW5mb2xpc3QpCisgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiXFwoW0hNUkNLP11cXCkgXFwoW15cMF0qXFwpXDAiIG5pbCB0IDEpCisgICAgICAobGV0ICgoc3RhdGUgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgIChuYW1lIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAodW5sZXNzIChhbmQgc2tpcC1leGlzdGluZyAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIG5hbWUpKQorICAgICAgICAgIChwdXNoIChnaXQtY3JlYXRlLWZpbGVpbmZvIChvciAoZ2l0LXN0YXRlLWNvZGUgc3RhdGUpIGRlZmF1bHQtc3RhdGUpIG5hbWUpIGluZm9saXN0KSkpKQorICAgIChkb2xpc3QgKGluZm8gKG5yZXZlcnNlIGluZm9saXN0KSkKKyAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcGFyc2UtbHMtdW5tZXJnZWQgKHN0YXR1cykKKyAgIlBhcnNlIHRoZSBvdXRwdXQgb2YgZ2l0LWxzLWZpbGVzIC11IGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgIChsZXQgKGZpbGVzKQorICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlswLTddXFx7NlxcfSBbMC05YS1mXVxcezQwXFx9IFsxMjNdXHRcXChbXlwwXStcXClcMCIgbmlsIHQpCisgICAgICAobGV0ICgobm9kZSAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIChtYXRjaC1zdHJpbmcgMSkpKSkKKyAgICAgICAgKHdoZW4gbm9kZSAocHVzaCAoZXdvYy1kYXRhIG5vZGUpIGZpbGVzKSkpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICd1bm1lcmdlZCkpKQorCisoZGVmdW4gZ2l0LWFkZC1zdGF0dXMtZmlsZSAoc3RhdGUgbmFtZSkKKyAgIkFkZCBhIG5ldyBmaWxlIHRvIHRoZSBzdGF0dXMgbGlzdCAoaWYgbm90IGV4aXN0aW5nIGFscmVhZHkpIGFuZCByZXR1cm4gaXRzIG5vZGUuIgorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChvciAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgZ2l0LXN0YXR1cyBuYW1lKQorICAgICAgKGV3b2MtZW50ZXItbGFzdCBnaXQtc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvIHN0YXRlIG5hbWUpKSkpCisKKyhkZWZ1biBnaXQtbWFya2VkLWZpbGVzICgpCisgICJSZXR1cm4gYSBsaXN0IG9mIGFsbCBtYXJrZWQgZmlsZXMsIG9yIGlmIG5vbmUgYSBsaXN0IGNvbnRhaW5pbmcganVzdCB0aGUgZmlsZSBhdCBjdXJzb3IgcG9zaXRpb24uIgorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChvciAoZXdvYy1jb2xsZWN0IGdpdC1zdGF0dXMgKGxhbWJkYSAoaW5mbykgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pKSkKKyAgICAgIChsaXN0IChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpKQorCisoZGVmdW4gZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAoJnJlc3Qgc3RhdGVzKQorICAiUmV0dXJuIG1hcmtlZCBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgc3BlY2lmaWVkIHN0YXRlcy4iCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgIHJlc3VsdCkKKyAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgKHdoZW4gKG1lbXEgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykgc3RhdGVzKQorICAgICAgICAocHVzaCBpbmZvIHJlc3VsdCkpKQorICAgIHJlc3VsdCkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1maWxlcyAoKQorICAiUmVmcmVzaCBhbGwgZmlsZXMgdGhhdCBuZWVkIGl0IGFuZCBjbGVhciB0aGUgbmVlZHMtcmVmcmVzaCBmbGFnLiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAKKyAgIChsYW1iZGEgKGluZm8pCisgICAgIChsZXQgKChyZWZyZXNoIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykpKQorICAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgbmlsKQorICAgICAgIHJlZnJlc2gpKQorICAgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4KKyAgKHdoZW4gZ29hbC1jb2x1bW4gKG1vdmUtdG8tY29sdW1uIGdvYWwtY29sdW1uKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1ld29jLWhmIChzdGF0dXMpCisgICJSZWZyZXNoIHRoZSBld29jIGhlYWRlciBhbmQgZm9vdGVyLiIKKyAgKGxldCAoKGJyYW5jaCAoZ2l0LXN5bWJvbGljLXJlZiAiSEVBRCIpKQorICAgICAgICAoaGVhZCAoaWYgKGdpdC1lbXB0eS1kYi1wKSAiTm90aGluZyBjb21taXR0ZWQgeWV0IgorICAgICAgICAgICAgICAgIChnaXQtZ2V0LWNvbW1pdC1kZXNjcmlwdGlvbiAiSEVBRCIpKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkpCisgICAgKGV3b2Mtc2V0LWhmIHN0YXR1cworICAgICAgICAgICAgICAgICAoZm9ybWF0ICJEaXJlY3Rvcnk6ICAlc1xuQnJhbmNoOiAgICAgJXNcbkhlYWQ6ICAgICAgICVzJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LWRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLW1hdGNoICJecmVmcy9oZWFkcy8iIGJyYW5jaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnN0cmluZyBicmFuY2ggKG1hdGNoLWVuZCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIG1lcmdlLWhlYWRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgIlxuTWVyZ2luZzogICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoc3RyKSAoZ2l0LWdldC1jb21taXQtZGVzY3JpcHRpb24gc3RyKSkgbWVyZ2UtaGVhZHMgIlxuICAgICAgICAgICAgIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIikpCisgICAgICAgICAgICAgICAgIChpZiAoZXdvYy1udGggc3RhdHVzIDApICIiICIgICAgTm8gY2hhbmdlcy4iKSkpKQorCisoZGVmdW4gZ2l0LWdldC1maWxlbmFtZXMgKGZpbGVzKQorICAobWFwY2FyIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpIGZpbGVzKSkKKworKGRlZnVuIGdpdC11cGRhdGUtaW5kZXggKGluZGV4LWZpbGUgZmlsZXMpCisgICJSdW4gZ2l0LXVwZGF0ZS1pbmRleCBvbiBhIGxpc3Qgb2YgZmlsZXMuIgorICAobGV0ICgoZW52IChhbmQgaW5kZXgtZmlsZSBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkpCisgICAgICAgIGFkZGVkIGRlbGV0ZWQgbW9kaWZpZWQpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgIChjYXNlIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pCisgICAgICAgICgnYWRkZWQgKHB1c2ggaW5mbyBhZGRlZCkpCisgICAgICAgICgnZGVsZXRlZCAocHVzaCBpbmZvIGRlbGV0ZWQpKQorICAgICAgICAoJ21vZGlmaWVkIChwdXNoIGluZm8gbW9kaWZpZWQpKSkpCisgICAgKHdoZW4gYWRkZWQKKyAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgZW52ICJ1cGRhdGUtaW5kZXgiICItLWFkZCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgYWRkZWQpKSkKKyAgICAod2hlbiBkZWxldGVkCisgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIGVudiAidXBkYXRlLWluZGV4IiAiLS1yZW1vdmUiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGRlbGV0ZWQpKSkKKyAgICAod2hlbiBtb2RpZmllZAorICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kIG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgbW9kaWZpZWQpKSkpKQorCisoZGVmdW4gZ2l0LXJ1bi1wcmUtY29tbWl0LWhvb2sgKCkKKyAgIlJ1biB0aGUgcHJlLWNvbW1pdCBob29rIGlmIGFueS4iCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICdhZGRlZCAnZGVsZXRlZCAnbW9kaWZpZWQpKSkKKyAgICAob3IgKG5vdCBmaWxlcykKKyAgICAgICAgKG5vdCAoZmlsZS1leGVjdXRhYmxlLXAgIi5naXQvaG9va3MvcHJlLWNvbW1pdCIpKQorICAgICAgICAobGV0ICgoaW5kZXgtZmlsZSAobWFrZS10ZW1wLWZpbGUgImdpdGlkeCIpKSkKKyAgICAgICAgICAodW53aW5kLXByb3RlY3QKKyAgICAgICAgICAgIChsZXQgKChoZWFkLXRyZWUgKHVubGVzcyAoZ2l0LWVtcHR5LWRiLXApIChnaXQtcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpKSkpCisgICAgICAgICAgICAgIChnaXQtcmVhZC10cmVlIGhlYWQtdHJlZSBpbmRleC1maWxlKQorICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1pbmRleCBpbmRleC1maWxlIGZpbGVzKQorICAgICAgICAgICAgICAoZ2l0LXJ1bi1ob29rICJwcmUtY29tbWl0IiBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkpCisgICAgICAgICAgKGRlbGV0ZS1maWxlIGluZGV4LWZpbGUpKSkpKSkKKworKGRlZnVuIGdpdC1kby1jb21taXQgKCkKKyAgIlBlcmZvcm0gdGhlIGFjdHVhbCBjb21taXQgdXNpbmcgdGhlIGN1cnJlbnQgYnVmZmVyIGFzIGxvZyBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgIChpbmRleC1maWxlIChtYWtlLXRlbXAtZmlsZSAiZ2l0aWR4IikpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAgIChpZiAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAndW5tZXJnZWQpCisgICAgICAgICAgKG1lc3NhZ2UgIllvdSBjYW5ub3QgY29tbWl0IHVubWVyZ2VkIGZpbGVzLCByZXNvbHZlIHRoZW0gZmlyc3QuIikKKyAgICAgICAgKHVud2luZC1wcm90ZWN0CisgICAgICAgICAgICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpCisgICAgICAgICAgICAgICAgICBoZWFkIGhlYWQtdHJlZSkKKyAgICAgICAgICAgICAgKHVubGVzcyAoZ2l0LWVtcHR5LWRiLXApCisgICAgICAgICAgICAgICAgKHNldHEgaGVhZCAoZ2l0LXJldi1wYXJzZSAiSEVBRCIpCisgICAgICAgICAgICAgICAgICAgICAgaGVhZC10cmVlIChnaXQtcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpKSkKKyAgICAgICAgICAgICAgKGlmIGZpbGVzCisgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgKGdpdC1yZWFkLXRyZWUgaGVhZC10cmVlIGluZGV4LWZpbGUpCisgICAgICAgICAgICAgICAgICAgIChnaXQtdXBkYXRlLWluZGV4IG5pbCBmaWxlcykgICAgICAgICA7dXBkYXRlIGJvdGggdGhlIGRlZmF1bHQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKGdpdC11cGRhdGUtaW5kZXggaW5kZXgtZmlsZSBmaWxlcykgIDthbmQgdGhlIHRlbXBvcmFyeSBvbmUKKyAgICAgICAgICAgICAgICAgICAgKGxldCAoKHRyZWUgKGdpdC13cml0ZS10cmVlIGluZGV4LWZpbGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAoaWYgKG9yIChub3QgKHN0cmluZy1lcXVhbCB0cmVlIGhlYWQtdHJlZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeWVzLW9yLW5vLXAgIlRoZSB0cmVlIHdhcyBub3QgbW9kaWZpZWQsIGRvIHlvdSByZWFsbHkgd2FudCB0byBwZXJmb3JtIGFuIGVtcHR5IGNvbW1pdD8gIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChjb21taXQgKGdpdC1jb21taXQtdHJlZSBidWZmZXIgdHJlZSBoZWFkKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbCAoZGVsZXRlLWZpbGUgIi5naXQvTUVSR0VfSEVBRCIpIChlcnJvciBuaWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kaXRpb24tY2FzZSBuaWwgKGRlbGV0ZS1maWxlICIuZ2l0L01FUkdFX01TRyIpIChlcnJvciBuaWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlciAoZXJhc2UtYnVmZmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBmaWxlcyAndXB0b2RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKGZpbGUtZGlyZWN0b3J5LXAgIi5naXQvcnItY2FjaGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJyZXJlcmUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgZ2l0LXN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZSAiQ29tbWl0dGVkICVzLiIgY29tbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLWhvb2sgInBvc3QtY29tbWl0IiBuaWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIkNvbW1pdCBhYm9ydGVkLiIpKSkpCisgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIk5vIGZpbGVzIHRvIGNvbW1pdC4iKSkpCisgICAgICAgICAgKGRlbGV0ZS1maWxlIGluZGV4LWZpbGUpKSkpKSkKKworCis7Ozs7IEludGVyYWN0aXZlIGZ1bmN0aW9ucworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1tYXJrLWZpbGUgKCkKKyAgIk1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSB0KQorICAgIChld29jLWludmFsaWRhdGUgZ2l0LXN0YXR1cyBwb3MpCisgICAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgMSkpKQorCisoZGVmdW4gZ2l0LXVubWFyay1maWxlICgpCisgICJVbm1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLW5leHQgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtdW5tYXJrLWZpbGUtdXAgKCkKKyAgIlVubWFyayB0aGUgZmlsZSB0aGF0IHRoZSBjdXJzb3IgaXMgb24gYW5kIG1vdmUgdG8gdGhlIHByZXZpb3VzIG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtbWFyay1hbGwgKCkKKyAgIk1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgdCkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC11bm1hcmstYWxsICgpCisgICJVbm1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgbmlsKSB0KSBnaXQtc3RhdHVzKQorICA7IG1vdmUgYmFjayB0byBnb2FsIGNvbHVtbiBhZnRlciBpbnZhbGlkYXRlCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LXRvZ2dsZS1hbGwtbWFya3MgKCkKKyAgIlRvZ2dsZSBhbGwgZmlsZSBtYXJrcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAgKGxhbWJkYSAoaW5mbykgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIChub3QgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pKSkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC1uZXh0LWZpbGUgKCZvcHRpb25hbCBuKQorICAiTW92ZSB0aGUgc2VsZWN0aW9uIGRvd24gTiBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgbikpCisKKyhkZWZ1biBnaXQtcHJldi1maWxlICgmb3B0aW9uYWwgbikKKyAgIk1vdmUgdGhlIHNlbGVjdGlvbiB1cCBOIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyBuKSkKKworKGRlZnVuIGdpdC1uZXh0LXVubWVyZ2VkLWZpbGUgKCZvcHRpb25hbCBuKQorICAiTW92ZSB0aGUgc2VsZWN0aW9uIGRvd24gTiB1bm1lcmdlZCBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCogKChsYXN0IChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkKKyAgICAgICAgIChub2RlIChld29jLW5leHQgZ2l0LXN0YXR1cyBsYXN0KSkpCisgICAgKHdoaWxlIChhbmQgbm9kZSAoPiBuIDApKQorICAgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSAoZXdvYy1kYXRhIG5vZGUpKSkKKyAgICAgICAgKHNldHEgbiAoMS0gbikpCisgICAgICAgIChzZXRxIGxhc3Qgbm9kZSkpCisgICAgICAoc2V0cSBub2RlIChld29jLW5leHQgZ2l0LXN0YXR1cyBub2RlKSkpCisgICAgKGV3b2MtZ290by1ub2RlIGdpdC1zdGF0dXMgbGFzdCkpKQorCisoZGVmdW4gZ2l0LXByZXYtdW5tZXJnZWQtZmlsZSAoJm9wdGlvbmFsIG4pCisgICJNb3ZlIHRoZSBzZWxlY3Rpb24gdXAgTiB1bm1lcmdlZCBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCogKChsYXN0IChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkKKyAgICAgICAgIChub2RlIChld29jLXByZXYgZ2l0LXN0YXR1cyBsYXN0KSkpCisgICAgKHdoaWxlIChhbmQgbm9kZSAoPiBuIDApKQorICAgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSAoZXdvYy1kYXRhIG5vZGUpKSkKKyAgICAgICAgKHNldHEgbiAoMS0gbikpCisgICAgICAgIChzZXRxIGxhc3Qgbm9kZSkpCisgICAgICAoc2V0cSBub2RlIChld29jLXByZXYgZ2l0LXN0YXR1cyBub2RlKSkpCisgICAgKGV3b2MtZ290by1ub2RlIGdpdC1zdGF0dXMgbGFzdCkpKQorCisoZGVmdW4gZ2l0LWFkZC1maWxlICgpCisgICJBZGQgbWFya2VkIGZpbGUocykgdG8gdGhlIGluZGV4IGNhY2hlLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3Vua25vd24pKSkKKyAgICAodW5sZXNzIGZpbGVzCisgICAgICAocHVzaCAoZXdvYy1kYXRhCisgICAgICAgICAgICAgKGdpdC1hZGQtc3RhdHVzLWZpbGUgJ2FkZGVkIChmaWxlLXJlbGF0aXZlLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkLWZpbGUtbmFtZSAiRmlsZSB0byBhZGQ6ICIgbmlsIG5pbCB0KSkpKQorICAgICAgICAgICAgZmlsZXMpKQorICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tYWRkIiAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpCisgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ2FkZGVkKQorICAgIChnaXQtcmVmcmVzaC1maWxlcykpKQorCisoZGVmdW4gZ2l0LWlnbm9yZS1maWxlICgpCisgICJBZGQgbWFya2VkIGZpbGUocykgdG8gdGhlIGlnbm9yZSBsaXN0LiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3Vua25vd24pKSkKKyAgICAodW5sZXNzIGZpbGVzCisgICAgICAocHVzaCAoZXdvYy1kYXRhCisgICAgICAgICAgICAgKGdpdC1hZGQtc3RhdHVzLWZpbGUgJ3Vua25vd24gKGZpbGUtcmVsYXRpdmUtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gaWdub3JlOiAiIG5pbCBuaWwgdCkpKSkKKyAgICAgICAgICAgIGZpbGVzKSkKKyAgICAoZG9saXN0IChpbmZvIGZpbGVzKSAoZ2l0LWFwcGVuZC10by1pZ25vcmUgKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSkpCisgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ2lnbm9yZWQpCisgICAgKGdpdC1yZWZyZXNoLWZpbGVzKSkpCisKKyhkZWZ1biBnaXQtcmVtb3ZlLWZpbGUgKCkKKyAgIlJlbW92ZSB0aGUgbWFya2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAnYWRkZWQgJ21vZGlmaWVkICd1bmtub3duICd1cHRvZGF0ZSkpKQorICAgICh1bmxlc3MgZmlsZXMKKyAgICAgIChwdXNoIChld29jLWRhdGEKKyAgICAgICAgICAgICAoZ2l0LWFkZC1zdGF0dXMtZmlsZSAndW5rbm93biAoZmlsZS1yZWxhdGl2ZS1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkLWZpbGUtbmFtZSAiRmlsZSB0byByZW1vdmU6ICIgbmlsIG5pbCB0KSkpKQorICAgICAgICAgICAgZmlsZXMpKQorICAgIChpZiAoeWVzLW9yLW5vLXAKKyAgICAgICAgIChmb3JtYXQgIlJlbW92ZSAlZCBmaWxlJXM/ICIgKGxlbmd0aCBmaWxlcykgKGlmICg+IChsZW5ndGggZmlsZXMpIDEpICJzIiAiIikpKQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgICAgICAgKGxldCAoKG5hbWUgKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSkpCisgICAgICAgICAgICAgICh3aGVuIChmaWxlLWV4aXN0cy1wIG5hbWUpIChkZWxldGUtZmlsZSBuYW1lKSkpKQorICAgICAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tcmVtb3ZlIiAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpCisgICAgICAgICAgOyByZW1vdmUgdW5rbm93biBmaWxlcyBmcm9tIHRoZSBsaXN0LCBzZXQgdGhlIG90aGVycyB0byBkZWxldGVkCisgICAgICAgICAgKGV3b2MtZmlsdGVyIGdpdC1zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoaW5mbyBmaWxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChhbmQgKG1lbXEgaW5mbyBmaWxlcykgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICd1bmtub3duKSkpKQorICAgICAgICAgICAgICAgICAgICAgICBmaWxlcykKKyAgICAgICAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBmaWxlcyAnZGVsZXRlZCkKKyAgICAgICAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgICAgICAgKHVubGVzcyAoZXdvYy1udGggZ2l0LXN0YXR1cyAwKSAgOyByZWZyZXNoIGhlYWRlciBpZiBsaXN0IGlzIGVtcHR5CisgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZXdvYy1oZiBnaXQtc3RhdHVzKSkpCisgICAgICAobWVzc2FnZSAiQWJvcnRpbmciKSkpKQorCisoZGVmdW4gZ2l0LXJldmVydC1maWxlICgpCisgICJSZXZlcnQgY2hhbmdlcyB0byB0aGUgbWFya2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgIGFkZGVkIG1vZGlmaWVkKQorICAgICh3aGVuIChhbmQgZmlsZXMKKyAgICAgICAgICAgICAgICh5ZXMtb3Itbm8tcAorICAgICAgICAgICAgICAgIChmb3JtYXQgIlJldmVydCAlZCBmaWxlJXM/ICIgKGxlbmd0aCBmaWxlcykgKGlmICg+IChsZW5ndGggZmlsZXMpIDEpICJzIiAiIikpKSkKKyAgICAgIChkb2xpc3QgKGluZm8gZmlsZXMpCisgICAgICAgIChjYXNlIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pCisgICAgICAgICAgKCdhZGRlZCAocHVzaCBpbmZvIGFkZGVkKSkKKyAgICAgICAgICAoJ2RlbGV0ZWQgKHB1c2ggaW5mbyBtb2RpZmllZCkpCisgICAgICAgICAgKCd1bm1lcmdlZCAocHVzaCBpbmZvIG1vZGlmaWVkKSkKKyAgICAgICAgICAoJ21vZGlmaWVkIChwdXNoIGluZm8gbW9kaWZpZWQpKSkpCisgICAgICAod2hlbiBhZGRlZAorICAgICAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWZvcmNlLXJlbW92ZSIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgYWRkZWQpKQorICAgICAgICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGFkZGVkICd1bmtub3duKSkKKyAgICAgICh3aGVuIG1vZGlmaWVkCisgICAgICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kIG5pbCBuaWwgImNoZWNrb3V0IiAiSEVBRCIgKGdpdC1nZXQtZmlsZW5hbWVzIG1vZGlmaWVkKSkKKyAgICAgICAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBtb2RpZmllZCAndXB0b2RhdGUpKQorICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKSkpKQorCisoZGVmdW4gZ2l0LXJlc29sdmUtZmlsZSAoKQorICAiUmVzb2x2ZSBjb25mbGljdHMgaW4gbWFya2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAndW5tZXJnZWQpKSkKKyAgICAod2hlbiBmaWxlcworICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kIG5pbCBuaWwgInVwZGF0ZS1pbmRleCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ21vZGlmaWVkKQorICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKSkpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1oYW5kbGVkICgpCisgICJSZW1vdmUgaGFuZGxlZCBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgbGlzdC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGV3b2MtZmlsdGVyIGdpdC1zdGF0dXMKKyAgICAgICAgICAgICAgIChsYW1iZGEgKGluZm8pCisgICAgICAgICAgICAgICAgIChub3QgKG9yIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAnaWdub3JlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICd1cHRvZGF0ZSkpKSkpCisgICh1bmxlc3MgKGV3b2MtbnRoIGdpdC1zdGF0dXMgMCkgIDsgcmVmcmVzaCBoZWFkZXIgaWYgbGlzdCBpcyBlbXB0eQorICAgIChnaXQtcmVmcmVzaC1ld29jLWhmIGdpdC1zdGF0dXMpKSkKKworKGRlZnVuIGdpdC1zZXR1cC1kaWZmLWJ1ZmZlciAoYnVmZmVyKQorICAiU2V0dXAgYSBidWZmZXIgZm9yIGRpc3BsYXlpbmcgYSBkaWZmLiIKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgKGRpZmYtbW9kZSkKKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkpCisgIChkaXNwbGF5LWJ1ZmZlciBidWZmZXIpCisgIChzaHJpbmstd2luZG93LWlmLWxhcmdlci10aGFuLWJ1ZmZlcikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IEhFQUQuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtaW5kZXgiICItcCIgIi1NIiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1tZXJnZS1oZWFkIChhcmcpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBmaXJzdCBtZXJnZSBoZWFkIChvciB0aGUgbnRoIG9uZSB3aXRoIGEgbnVtZXJpYyBwcmVmaXgpLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkpCisgICAgKHVubGVzcyBtZXJnZS1oZWFkcyAoZXJyb3IgIk5vIG1lcmdlIGluIHByb2dyZXNzIikpCisgICAgKGdpdC1zZXR1cC1kaWZmLWJ1ZmZlcgorICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWRpZmYqIiAiZGlmZi1pbmRleCIgIi1wIiAiLU0iCisgICAgICAgICAgICAob3IgKG50aCAoMS0gYXJnKSBtZXJnZS1oZWFkcykgIkhFQUQiKSAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpKSkpCisKKyhkZWZ1biBnaXQtZGlmZi11bm1lcmdlZC1maWxlIChzdGFnZSkKKyAgIkRpZmYgdGhlIG1hcmtlZCB1bm1lcmdlZCBmaWxlKHMpIGFnYWluc3QgdGhlIHNwZWNpZmllZCBzdGFnZS4iCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtZmlsZXMiICItcCIgc3RhZ2UgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1iYXNlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBjb21tb24gYmFzZSBmaWxlLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTEiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtbWluZSAoKQorICAiRGlmZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykgYWdhaW5zdCBteSBwcmUtbWVyZ2UgdmVyc2lvbi4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGdpdC1kaWZmLXVubWVyZ2VkLWZpbGUgIi0yIikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlLW90aGVyICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBvdGhlcidzIHByZS1tZXJnZSB2ZXJzaW9uLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTMiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtY29tYmluZWQgKCkKKyAgIkRvIGEgY29tYmluZWQgZGlmZiBvZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChnaXQtZGlmZi11bm1lcmdlZC1maWxlICItYyIpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1pZGlmZiAoKQorICAiUGVyZm9ybSBhbiBpbnRlcmFjdGl2ZSBkaWZmIG9uIHRoZSBjdXJyZW50IGZpbGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChlcnJvciAiSW50ZXJhY3RpdmUgZGlmZnMgbm90IGltcGxlbWVudGVkIHlldC4iKSkKKworKGRlZnVuIGdpdC1sb2ctZmlsZSAoKQorICAiRGlzcGxheSBhIGxvZyBvZiBjaGFuZ2VzIHRvIHRoZSBtYXJrZWQgZmlsZShzKS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCogKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgICAoY29kaW5nLXN5c3RlbS1mb3ItcmVhZCBnaXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgKGJ1ZmZlciAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWxvZyoiICJyZXYtbGlzdCIgIi0tcHJldHR5IiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICA7IChnaXQtbG9nLW1vZGUpICBGSVhNRTogaW1wbGVtZW50IGxvZyBtb2RlCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKHNldHEgYnVmZmVyLXJlYWQtb25seSB0KSkKKyAgICAoZGlzcGxheS1idWZmZXIgYnVmZmVyKSkpCisKKyhkZWZ1biBnaXQtbG9nLWVkaXQtZmlsZXMgKCkKKyAgIlJldHVybiBhIGxpc3Qgb2YgbWFya2VkIGZpbGVzIGZvciB1c2UgaW4gdGhlIGxvZy1lZGl0IGJ1ZmZlci4iCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpKSkKKworKGRlZnVuIGdpdC1hcHBlbmQtc2lnbi1vZmYgKG5hbWUgZW1haWwpCisgICJBcHBlbmQgYSBTaWduZWQtb2ZmLWJ5IGVudHJ5IHRvIHRoZSBjdXJyZW50IGJ1ZmZlciwgYXZvaWRpbmcgZHVwbGljYXRlcy4iCisgIChsZXQgKChzaWduLW9mZiAoZm9ybWF0ICJTaWduZWQtb2ZmLWJ5OiAlcyA8JXM+IiBuYW1lIGVtYWlsKSkKKyAgICAgICAgKGNhc2UtZm9sZC1zZWFyY2ggdCkpCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAodW5sZXNzIChyZS1zZWFyY2gtZm9yd2FyZCAoY29uY2F0ICJeIiAocmVnZXhwLXF1b3RlIHNpZ24tb2ZmKSkgbmlsIHQpCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKHVubGVzcyAocmUtc2VhcmNoLWZvcndhcmQgIl5TaWduZWQtb2ZmLWJ5OiAiIG5pbCB0KQorICAgICAgICAoc2V0cSBzaWduLW9mZiAoY29uY2F0ICJcbiIgc2lnbi1vZmYpKSkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisgICAgICAoaW5zZXJ0IHNpZ24tb2ZmICJcbiIpKSkpCisKKyhkZWZ1biBnaXQtc2V0dXAtbG9nLWJ1ZmZlciAoYnVmZmVyICZvcHRpb25hbCBhdXRob3ItbmFtZSBhdXRob3ItZW1haWwgc3ViamVjdCBkYXRlIG1zZykKKyAgIlNldHVwIHRoZSBsb2cgYnVmZmVyIGZvciBhIGNvbW1pdC4iCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgICAgICAgKGNvbW1pdHRlci1uYW1lIChnaXQtZ2V0LWNvbW1pdHRlci1uYW1lKSkKKyAgICAgICAgKGNvbW1pdHRlci1lbWFpbCAoZ2l0LWdldC1jb21taXR0ZXItZW1haWwpKQorICAgICAgICAoc2lnbi1vZmYgZ2l0LWFwcGVuZC1zaWduZWQtb2ZmLWJ5KSkKKyAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgIChjZCBkaXIpCisgICAgICAoZXJhc2UtYnVmZmVyKQorICAgICAgKGluc2VydAorICAgICAgIChwcm9wZXJ0aXplCisgICAgICAgIChmb3JtYXQgIkF1dGhvcjogJXMgPCVzPlxuJXMlcyIKKyAgICAgICAgICAgICAgICAob3IgYXV0aG9yLW5hbWUgY29tbWl0dGVyLW5hbWUpCisgICAgICAgICAgICAgICAgKG9yIGF1dGhvci1lbWFpbCBjb21taXR0ZXItZW1haWwpCisgICAgICAgICAgICAgICAgKGlmIGRhdGUgKGZvcm1hdCAiRGF0ZTogJXNcbiIgZGF0ZSkgIiIpCisgICAgICAgICAgICAgICAgKGlmIG1lcmdlLWhlYWRzCisgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIlBhcmVudDogJXNcbiVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpdC1yZXYtcGFyc2UgIkhFQUQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoc3RyKSAoY29uY2F0ICJQYXJlbnQ6ICIgc3RyKSkgbWVyZ2UtaGVhZHMgIlxuIikpCisgICAgICAgICAgICAgICAgICAiIikpCisgICAgICAgICdmYWNlICdnaXQtaGVhZGVyLWZhY2UpCisgICAgICAgKHByb3BlcnRpemUgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICdmYWNlICdnaXQtc2VwYXJhdG9yLWZhY2UpCisgICAgICAgIlxuIikKKyAgICAgICh3aGVuIHN1YmplY3QgKGluc2VydCBzdWJqZWN0ICJcblxuIikpCisgICAgICAoY29uZCAobXNnIChpbnNlcnQgbXNnICJcbiIpKQorICAgICAgICAgICAgKChmaWxlLXJlYWRhYmxlLXAgIi5kb3Rlc3QvbXNnIikKKyAgICAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgIi5kb3Rlc3QvbXNnIikpCisgICAgICAgICAgICAoKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9NRVJHRV9NU0ciKQorICAgICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmdpdC9NRVJHRV9NU0ciKSkpCisgICAgICA7IGRlbGV0ZSBlbXB0eSBsaW5lcyBhdCBlbmQKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIlxuK1xcJyIgbmlsIHQpCisgICAgICAgIChyZXBsYWNlLW1hdGNoICJcbiIgdCB0KSkKKyAgICAgICh3aGVuIHNpZ24tb2ZmIChnaXQtYXBwZW5kLXNpZ24tb2ZmIGNvbW1pdHRlci1uYW1lIGNvbW1pdHRlci1lbWFpbCkpKSkpCisKKyhkZWZ1biBnaXQtY29tbWl0LWZpbGUgKCkKKyAgIkNvbW1pdCB0aGUgbWFya2VkIGZpbGUocyksIGFza2luZyBmb3IgYSBjb21taXQgbWVzc2FnZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAod2hlbiAoZ2l0LXJ1bi1wcmUtY29tbWl0LWhvb2spCisgICAgKGxldCAoKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipnaXQtY29tbWl0KiIpKQorICAgICAgICAgIChjb2Rpbmctc3lzdGVtIChnaXQtZ2V0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSkpCisgICAgICAgICAgYXV0aG9yLW5hbWUgYXV0aG9yLWVtYWlsIHN1YmplY3QgZGF0ZSkKKyAgICAgICh3aGVuIChlcSAwIChidWZmZXItc2l6ZSBidWZmZXIpKQorICAgICAgICAod2hlbiAoZmlsZS1yZWFkYWJsZS1wICIuZG90ZXN0L2luZm8iKQorICAgICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgIi5kb3Rlc3QvaW5mbyIpCisgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAgICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICJeQXV0aG9yOiBcXCguKlxcKVxuRW1haWw6IFxcKC4qXFwpJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIGF1dGhvci1uYW1lIChtYXRjaC1zdHJpbmcgMSkpCisgICAgICAgICAgICAgIChzZXRxIGF1dGhvci1lbWFpbCAobWF0Y2gtc3RyaW5nIDIpKSkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIl5TdWJqZWN0OiBcXCguKlxcKSQiIG5pbCB0KQorICAgICAgICAgICAgICAoc2V0cSBzdWJqZWN0IChtYXRjaC1zdHJpbmcgMSkpKQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkRhdGU6IFxcKC4qXFwpJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIGRhdGUgKG1hdGNoLXN0cmluZyAxKSkpKSkKKyAgICAgICAgKGdpdC1zZXR1cC1sb2ctYnVmZmVyIGJ1ZmZlciBhdXRob3ItbmFtZSBhdXRob3ItZW1haWwgc3ViamVjdCBkYXRlKSkKKyAgICAgIChsb2ctZWRpdCAjJ2dpdC1kby1jb21taXQgbmlsICMnZ2l0LWxvZy1lZGl0LWZpbGVzIGJ1ZmZlcikKKyAgICAgIChzZXRxIGZvbnQtbG9jay1rZXl3b3JkcyAoZm9udC1sb2NrLWNvbXBpbGUta2V5d29yZHMgZ2l0LWxvZy1lZGl0LWZvbnQtbG9jay1rZXl3b3JkcykpCisgICAgICAoc2V0cSBidWZmZXItZmlsZS1jb2Rpbmctc3lzdGVtIGNvZGluZy1zeXN0ZW0pCisgICAgICAocmUtc2VhcmNoLWZvcndhcmQgKHJlZ2V4cC1xdW90ZSAoY29uY2F0IGdpdC1sb2ctbXNnLXNlcGFyYXRvciAiXG4iKSkgbmlsIHQpKSkpCisKKyhkZWZ1biBnaXQtZmluZC1maWxlICgpCisgICJWaXNpdCB0aGUgY3VycmVudCBmaWxlIGluIGl0cyBvd24gYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChpbmZvIChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpCisgICAgKGZpbmQtZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKQorICAgICh3aGVuIChlcSAndW5tZXJnZWQgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykpCisgICAgICAoc21lcmdlLW1vZGUpKSkpCisKKyhkZWZ1biBnaXQtZmluZC1maWxlLW90aGVyLXdpbmRvdyAoKQorICAiVmlzaXQgdGhlIGN1cnJlbnQgZmlsZSBpbiBpdHMgb3duIGJ1ZmZlciBpbiBhbm90aGVyIHdpbmRvdy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0ICgoaW5mbyAoZXdvYy1kYXRhIChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkpKQorICAgIChmaW5kLWZpbGUtb3RoZXItd2luZG93IChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSkKKyAgICAgIChzbWVyZ2UtbW9kZSkpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUtaW1lcmdlICgpCisgICJWaXNpdCB0aGUgY3VycmVudCBmaWxlIGluIGludGVyYWN0aXZlIG1lcmdlIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHNtZXJnZS1lZGlmZikpKQorCisoZGVmdW4gZ2l0LXZpZXctZmlsZSAoKQorICAiVmlldyB0aGUgY3VycmVudCBmaWxlIGluIGl0cyBvd24gYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChpbmZvIChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpCisgICAgKHZpZXctZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1zdGF0dXMgKCkKKyAgIlJlZnJlc2ggdGhlIGdpdCBzdGF0dXMgYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0KiAoKHN0YXR1cyBnaXQtc3RhdHVzKQorICAgICAgICAgKHBvcyAoZXdvYy1sb2NhdGUgc3RhdHVzKSkKKyAgICAgICAgIChjdXItbmFtZSAoYW5kIHBvcyAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgcG9zKSkpKSkKKyAgICAodW5sZXNzIHN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgICAoZ2l0LWNsZWFyLXN0YXR1cyBzdGF0dXMpCisgICAgKGdpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tcmVmcmVzaCIpCisgICAgKGlmIChnaXQtZW1wdHktZGItcCkKKyAgICAgICAgOyB3ZSBuZWVkIHNvbWUgc3BlY2lhbCBoYW5kbGluZyBmb3IgYW4gZW1wdHkgZGIKKyAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAoZ2l0LXJ1bi1jb21tYW5kIHQgbmlsICJscy1maWxlcyIgIi16IiAiLXQiICItYyIpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ2FkZGVkKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImRpZmYtaW5kZXgiICIteiIgIi1NIiAiSEVBRCIpCisgICAgICAgIChnaXQtcGFyc2Utc3RhdHVzIHN0YXR1cykpKQorICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgKGdpdC1ydW4tY29tbWFuZCB0IG5pbCAibHMtZmlsZXMiICIteiIgIi11IikKKyAgICAgICAgKGdpdC1wYXJzZS1scy11bm1lcmdlZCBzdGF0dXMpKQorICAgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9pbmZvL2V4Y2x1ZGUiKQorICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImxzLWZpbGVzIiAiLXoiICItdCIgIi1vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZXhjbHVkZS1mcm9tPS5naXQvaW5mby9leGNsdWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IiBnaXQtcGVyLWRpci1pZ25vcmUtZmlsZSkpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ3Vua25vd24pKSkKKyAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgc3RhdHVzKQorICAgIDsgbW92ZSBwb2ludCB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUgaWYgYW55CisgICAgKGxldCAoKG5vZGUgKGFuZCBjdXItbmFtZSAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIGN1ci1uYW1lKSkpKQorICAgICAgKHdoZW4gbm9kZSAoZXdvYy1nb3RvLW5vZGUgc3RhdHVzIG5vZGUpKSkpKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1xdWl0ICgpCisgICJRdWl0IGdpdC1zdGF0dXMgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGJ1cnktYnVmZmVyKSkKKworOzs7OyBNYWpvciBNb2RlCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoZGVmdmFyIGdpdC1zdGF0dXMtbW9kZS1ob29rIG5pbAorICAiUnVuIGFmdGVyIGBnaXQtc3RhdHVzLW1vZGUnIGlzIHNldHVwLiIpCisKKyhkZWZ2YXIgZ2l0LXN0YXR1cy1tb2RlLW1hcCBuaWwKKyAgIktleW1hcCBmb3IgZ2l0IG1ham9yIG1vZGUuIikKKworKGRlZnZhciBnaXQtc3RhdHVzIG5pbAorICAiTGlzdCBvZiBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGUgZ2l0LXN0YXR1cyBtb2RlLiIpCisKKyh1bmxlc3MgZ2l0LXN0YXR1cy1tb2RlLW1hcAorICAobGV0ICgobWFwIChtYWtlLWtleW1hcCkpCisgICAgICAgIChkaWZmLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkpCisgICAgKHN1cHByZXNzLWtleW1hcCBtYXApCisgICAgKGRlZmluZS1rZXkgbWFwICI/IiAgICdnaXQtaGVscCkKKyAgICAoZGVmaW5lLWtleSBtYXAgImgiICAgJ2dpdC1oZWxwKQorICAgIChkZWZpbmUta2V5IG1hcCAiICIgICAnZ2l0LW5leHQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImEiICAgJ2dpdC1hZGQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImMiICAgJ2dpdC1jb21taXQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImQiICAgIGRpZmYtbWFwKQorICAgIChkZWZpbmUta2V5IG1hcCAiPSIgICAnZ2l0LWRpZmYtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImYiICAgJ2dpdC1maW5kLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJcciIgICdnaXQtZmluZC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiZyIgICAnZ2l0LXJlZnJlc2gtc3RhdHVzKQorICAgIChkZWZpbmUta2V5IG1hcCAiaSIgICAnZ2l0LWlnbm9yZS1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAibCIgICAnZ2l0LWxvZy1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAibSIgICAnZ2l0LW1hcmstZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIk0iICAgJ2dpdC1tYXJrLWFsbCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIm4iICAgJ2dpdC1uZXh0LWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJOIiAgICdnaXQtbmV4dC11bm1lcmdlZC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAibyIgICAnZ2l0LWZpbmQtZmlsZS1vdGhlci13aW5kb3cpCisgICAgKGRlZmluZS1rZXkgbWFwICJwIiAgICdnaXQtcHJldi1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiUCIgICAnZ2l0LXByZXYtdW5tZXJnZWQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgInEiICAgJ2dpdC1zdGF0dXMtcXVpdCkKKyAgICAoZGVmaW5lLWtleSBtYXAgInIiICAgJ2dpdC1yZW1vdmUtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlIiICAgJ2dpdC1yZXNvbHZlLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJUIiAgICdnaXQtdG9nZ2xlLWFsbC1tYXJrcykKKyAgICAoZGVmaW5lLWtleSBtYXAgInUiICAgJ2dpdC11bm1hcmstZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlUiICAgJ2dpdC1yZXZlcnQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgInYiICAgJ2dpdC12aWV3LWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJ4IiAgICdnaXQtcmVtb3ZlLWhhbmRsZWQpCisgICAgKGRlZmluZS1rZXkgbWFwICJcQy0/IiAnZ2l0LXVubWFyay1maWxlLXVwKQorICAgIChkZWZpbmUta2V5IG1hcCAiXE0tXEMtPyIgJ2dpdC11bm1hcmstYWxsKQorICAgIDsgdGhlIGRpZmYgc3VibWFwCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImIiICdnaXQtZGlmZi1maWxlLWJhc2UpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImMiICdnaXQtZGlmZi1maWxlLWNvbWJpbmVkKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICI9IiAnZ2l0LWRpZmYtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiZSIgJ2dpdC1kaWZmLWZpbGUtaWRpZmYpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgIkUiICdnaXQtZmluZC1maWxlLWltZXJnZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiaCIgJ2dpdC1kaWZmLWZpbGUtbWVyZ2UtaGVhZCkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAibSIgJ2dpdC1kaWZmLWZpbGUtbWluZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAibyIgJ2dpdC1kaWZmLWZpbGUtb3RoZXIpCisgICAgKHNldHEgZ2l0LXN0YXR1cy1tb2RlLW1hcCBtYXApKSkKKworOzsgZ2l0IG1vZGUgc2hvdWxkIG9ubHkgcnVuIGluIHRoZSAqZ2l0IHN0YXR1cyogYnVmZmVyCisocHV0ICdnaXQtc3RhdHVzLW1vZGUgJ21vZGUtY2xhc3MgJ3NwZWNpYWwpCisKKyhkZWZ1biBnaXQtc3RhdHVzLW1vZGUgKCkKKyAgIk1ham9yIG1vZGUgZm9yIGludGVyYWN0aW5nIHdpdGggR2l0LgorQ29tbWFuZHM6CitcXHtnaXQtc3RhdHVzLW1vZGUtbWFwfSIKKyAgKGtpbGwtYWxsLWxvY2FsLXZhcmlhYmxlcykKKyAgKGJ1ZmZlci1kaXNhYmxlLXVuZG8pCisgIChzZXRxIG1vZGUtbmFtZSAiZ2l0IHN0YXR1cyIKKyAgICAgICAgbWFqb3ItbW9kZSAnZ2l0LXN0YXR1cy1tb2RlCisgICAgICAgIGdvYWwtY29sdW1uIDE3CisgICAgICAgIGJ1ZmZlci1yZWFkLW9ubHkgdCkKKyAgKHVzZS1sb2NhbC1tYXAgZ2l0LXN0YXR1cy1tb2RlLW1hcCkKKyAgKGxldCAoKGJ1ZmZlci1yZWFkLW9ubHkgbmlsKSkKKyAgICAoZXJhc2UtYnVmZmVyKQorICAobGV0ICgoc3RhdHVzIChld29jLWNyZWF0ZSAnZ2l0LWZpbGVpbmZvLXByZXR0eXByaW50ICIiICIiKSkpCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZ2l0LXN0YXR1cykgc3RhdHVzKSkKKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnbGlzdC1idWZmZXJzLWRpcmVjdG9yeSkgZGVmYXVsdC1kaXJlY3RvcnkpCisgIChydW4taG9va3MgJ2dpdC1zdGF0dXMtbW9kZS1ob29rKSkpCisKKyhkZWZ1biBnaXQtZmluZC1zdGF0dXMtYnVmZmVyIChkaXIpCisgICJGaW5kIHRoZSBnaXQgc3RhdHVzIGJ1ZmZlciBoYW5kbGluZyBhIHNwZWNpZmllZCBkaXJlY3RvcnkuIgorICAobGV0ICgobGlzdCAoYnVmZmVyLWxpc3QpKQorICAgICAgICAoZnVsbGRpciAoZXhwYW5kLWZpbGUtbmFtZSBkaXIpKQorICAgICAgICBmb3VuZCkKKyAgICAod2hpbGUgKGFuZCBsaXN0IChub3QgZm91bmQpKQorICAgICAgKGxldCAoKGJ1ZmZlciAoY2FyIGxpc3QpKSkKKyAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAgICAgKHdoZW4gKGFuZCBsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWVxdWFsIGZ1bGxkaXIgKGV4cGFuZC1maWxlLW5hbWUgbGlzdC1idWZmZXJzLWRpcmVjdG9yeSkpCisgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoICJcXCpnaXQtc3RhdHVzXFwqJCIgKGJ1ZmZlci1uYW1lIGJ1ZmZlcikpKQorICAgICAgICAgICAgKHNldHEgZm91bmQgYnVmZmVyKSkpKQorICAgICAgKHNldHEgbGlzdCAoY2RyIGxpc3QpKSkKKyAgICBmb3VuZCkpCisKKyhkZWZ1biBnaXQtc3RhdHVzIChkaXIpCisgICJFbnRyeSBwb2ludCBpbnRvIGdpdC1zdGF0dXMgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSAiRFNlbGVjdCBkaXJlY3Rvcnk6ICIpCisgIChzZXRxIGRpciAoZ2l0LWdldC10b3AtZGlyIGRpcikpCisgIChpZiAoZmlsZS1kaXJlY3RvcnktcCAoY29uY2F0IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IGRpcikgIi5naXQiKSkKKyAgICAgIChsZXQgKChidWZmZXIgKG9yIChhbmQgZ2l0LXJldXNlLXN0YXR1cy1idWZmZXIgKGdpdC1maW5kLXN0YXR1cy1idWZmZXIgZGlyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIChjcmVhdGUtZmlsZS1idWZmZXIgKGV4cGFuZC1maWxlLW5hbWUgIipnaXQtc3RhdHVzKiIgZGlyKSkpKSkKKyAgICAgICAgKHN3aXRjaC10by1idWZmZXIgYnVmZmVyKQorICAgICAgICAoY2QgZGlyKQorICAgICAgICAoZ2l0LXN0YXR1cy1tb2RlKQorICAgICAgICAoZ2l0LXJlZnJlc2gtc3RhdHVzKQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKSkKKyAgICAobWVzc2FnZSAiJXMgaXMgbm90IGEgZ2l0IHdvcmtpbmcgdHJlZS4iIGRpcikpKQorCisoZGVmdW4gZ2l0LWhlbHAgKCkKKyAgIkRpc3BsYXkgaGVscCBmb3IgR2l0IG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChkZXNjcmliZS1mdW5jdGlvbiAnZ2l0LXN0YXR1cy1tb2RlKSkKKworKHByb3ZpZGUgJ2dpdCkKKzs7OyBnaXQuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL3ZjLWdpdC5lbCBiL2NvbnRyaWIvZW1hY3MvdmMtZ2l0LmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTZhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL3ZjLWdpdC5lbApAQCAtMCwwICsxLDE1MSBAQAorOzs7IHZjLWdpdC5lbCAtLS0gVkMgYmFja2VuZCBmb3IgdGhlIGdpdCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtCisKKzs7IENvcHlyaWdodCAoQykgMjAwNiBBbGV4YW5kcmUgSnVsbGlhcmQKKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKzs7IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCis7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCis7OyB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCis7OyB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCis7OyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOzsKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOzsgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKzs7IE1BIDAyMTExLTEzMDcgVVNBCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGZpbGUgY29udGFpbnMgYSBWQyBiYWNrZW5kIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbAorOzsgc3lzdGVtLgorOzsKKzs7IFRvIGluc3RhbGw6IHB1dCB0aGlzIGZpbGUgb24gdGhlIGxvYWQtcGF0aCBhbmQgYWRkIEdJVCB0byB0aGUgbGlzdAorOzsgb2Ygc3VwcG9ydGVkIGJhY2tlbmRzIGluIGB2Yy1oYW5kbGVkLWJhY2tlbmRzJzsgdGhlIGZvbGxvd2luZyBsaW5lLAorOzsgcGxhY2VkIGluIHlvdXIgfi8uZW1hY3MsIHdpbGwgYWNjb21wbGlzaCB0aGlzOgorOzsKKzs7ICAgICAoYWRkLXRvLWxpc3QgJ3ZjLWhhbmRsZWQtYmFja2VuZHMgJ0dJVCkKKzs7Cis7OyBUT0RPCis7OyAgLSBjaGFuZ2Vsb2cgZ2VuZXJhdGlvbgorOzsgIC0gd29ya2luZyB3aXRoIHJldmlzaW9ucyBvdGhlciB0aGFuIEhFQUQKKzs7CisKKyhldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAnY2wpKQorCisoZGVmdmFyIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0gJ3V0Zi04CisgICJEZWZhdWx0IGNvZGluZyBzeXN0ZW0gZm9yIGdpdCBjb21taXRzLiIpCisKKyhkZWZ1biB2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyAoZmlsZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgb24gRklMRSBhbmQgcmV0dXJuIGl0cyBvdXRwdXQgYXMgc3RyaW5nLiIKKyAgKGxldCogKChvayB0KQorICAgICAgICAgKHN0ciAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CisgICAgICAgICAgICAgICAgICAodW5sZXNzIChlcSAwIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIGFyZ3MgKGxpc3QgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgKHNldHEgb2sgbmlsKSkpKSkpCisgICAgKGFuZCBvayBzdHIpKSkKKworKGRlZnVuIHZjLWdpdC0tcnVuLWNvbW1hbmQgKGZpbGUgJnJlc3QgYXJncykKKyAgIlJ1biBhIGdpdCBjb21tYW5kIG9uIEZJTEUsIGRpc2NhcmRpbmcgYW55IG91dHB1dC4iCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpKQorICAgIChlcSAwIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgKGdldC1idWZmZXIgIipNZXNzYWdlcyIpIG5pbCAoYXBwZW5kIGFyZ3MgKGxpc3QgbmFtZSkpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJlZ2lzdGVyZWQgKGZpbGUpCisgICJDaGVjayB3aGV0aGVyIEZJTEUgaXMgcmVnaXN0ZXJlZCB3aXRoIGdpdC4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGxldCogKChkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZSkpCisgICAgICAgICAgIChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSBkaXIpKSkKKyAgICAgIChhbmQgKGlnbm9yZS1lcnJvcnMKKyAgICAgICAgICAgICAod2hlbiBkaXIgKGNkIGRpcikpCisgICAgICAgICAgICAgKGVxIDAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsICJscy1maWxlcyIgIi1jIiAiLXoiICItLSIgbmFtZSkpKQorICAgICAgICAgICAobGV0ICgoc3RyIChidWZmZXItc3RyaW5nKSkpCisgICAgICAgICAgICAgKGFuZCAoPiAobGVuZ3RoIHN0cikgKGxlbmd0aCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgIChzdHJpbmc9IChzdWJzdHJpbmcgc3RyIDAgKDErIChsZW5ndGggbmFtZSkpKSAoY29uY2F0IG5hbWUgIlwwIikpKSkpKSkpCisKKyhkZWZ1biB2Yy1naXQtc3RhdGUgKGZpbGUpCisgICJnaXQtc3BlY2lmaWMgdmVyc2lvbiBvZiBgdmMtc3RhdGUnLiIKKyAgKGxldCAoKGRpZmYgKHZjLWdpdC0tcnVuLWNvbW1hbmQtc3RyaW5nIGZpbGUgImRpZmYtaW5kZXgiICIteiIgIkhFQUQiICItLSIpKSkKKyAgICAoaWYgKGFuZCBkaWZmIChzdHJpbmctbWF0Y2ggIjpbMC03XVxcezZcXH0gWzAtN11cXHs2XFx9IFswLTlhLWZdXFx7NDBcXH0gWzAtOWEtZl1cXHs0MFxcfSBbQURNVV1cMFteXDBdK1wwIiBkaWZmKSkKKyAgICAgICAgJ2VkaXRlZAorICAgICAgJ3VwLXRvLWRhdGUpKSkKKworKGRlZnVuIHZjLWdpdC13b3JrZmlsZS12ZXJzaW9uIChmaWxlKQorICAiZ2l0LXNwZWNpZmljIHZlcnNpb24gb2YgYHZjLXdvcmtmaWxlLXZlcnNpb24nLiIKKyAgKGxldCAoKHN0ciAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKKyAgICAgICAgICAgICAgICAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsICJzeW1ib2xpYy1yZWYiICJIRUFEIikpKSkpCisgICAgKGlmIChzdHJpbmctbWF0Y2ggIl5cXChyZWZzL2hlYWRzL1xcKT9cXCguK1xcKSQiIHN0cikKKyAgICAgICAgKG1hdGNoLXN0cmluZyAyIHN0cikKKyAgICAgIHN0cikpKQorCisoZGVmdW4gdmMtZ2l0LXJldmVydCAoZmlsZSAmb3B0aW9uYWwgY29udGVudHMtZG9uZSkKKyAgIlJldmVydCBGSUxFIHRvIHRoZSB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkuIgorICAoaWYgY29udGVudHMtZG9uZQorICAgICAgKHZjLWdpdC0tcnVuLWNvbW1hbmQgZmlsZSAidXBkYXRlLWluZGV4IiAiLS0iKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNoZWNrb3V0IiAiSEVBRCIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dC1tb2RlbCAoZmlsZSkKKyAgJ2ltcGxpY2l0KQorCisoZGVmdW4gdmMtZ2l0LXdvcmtmaWxlLXVuY2hhbmdlZC1wIChmaWxlKQorICAobGV0ICgoc2hhMSAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAiaGFzaC1vYmplY3QiICItLSIpKQorICAgICAgICAoaGVhZCAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAibHMtdHJlZSIgIi16IiAiSEVBRCIgIi0tIikpKQorICAgIChhbmQgaGVhZAorICAgICAgICAgKHN0cmluZy1tYXRjaCAiWzAtN11cXHs2XFx9IGJsb2IgXFwoWzAtOWEtZl1cXHs0MFxcfVxcKVx0W15cMF0rXDAiIGhlYWQpCisgICAgICAgICAoc3RyaW5nPSAoY2FyIChzcGxpdC1zdHJpbmcgc2hhMSAiXG4iKSkgKG1hdGNoLXN0cmluZyAxIGhlYWQpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJlZ2lzdGVyIChmaWxlICZvcHRpb25hbCByZXYgY29tbWVudCkKKyAgIlJlZ2lzdGVyIEZJTEUgaW50byB0aGUgZ2l0IHZlcnNpb24tY29udHJvbCBzeXN0ZW0uIgorICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJ1cGRhdGUtaW5kZXgiICItLWFkZCIgIi0tIikpCisKKyhkZWZ1biB2Yy1naXQtcHJpbnQtbG9nIChmaWxlICZvcHRpb25hbCBidWZmZXIpCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpCisgICAgICAgIChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1kby1jb21tYW5kIGJ1ZmZlciAnYXN5bmMgImdpdCIgbmFtZSAicmV2LWxpc3QiICItLXByZXR0eSIgIkhFQUQiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1kaWZmIChmaWxlICZvcHRpb25hbCByZXYxIHJldjIgYnVmZmVyKQorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKQorICAgICAgICAoYnVmIChvciBidWZmZXIgIip2Yy1kaWZmKiIpKSkKKyAgICAoaWYgKGFuZCByZXYxIHJldjIpCisgICAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtdHJlZSIgIi1wIiByZXYxIHJldjIgIi0tIikKKyAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtaW5kZXgiICItcCIgKG9yIHJldjEgIkhFQUQiKSAiLS0iKSkKKyAgICA7IGdpdC1kaWZmLWluZGV4IGRvZXNuJ3Qgc2V0IGV4aXQgc3RhdHVzIGxpa2UgZGlmZiBkb2VzCisgICAgKGlmICh2Yy1naXQtd29ya2ZpbGUtdW5jaGFuZ2VkLXAgZmlsZSkgMCAxKSkpCisKKyhkZWZ1biB2Yy1naXQtY2hlY2tpbiAoZmlsZSByZXYgY29tbWVudCkKKyAgKGxldCAoKGNvZGluZy1zeXN0ZW0tZm9yLXdyaXRlIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNvbW1pdCIgIi1tIiBjb21tZW50ICItLW9ubHkiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dCAoZmlsZSAmb3B0aW9uYWwgZWRpdGFibGUgcmV2IGRlc3RmaWxlKQorICAoaWYgZGVzdGZpbGUKKyAgICAgIChsZXQgKChmdWxsbmFtZSAoc3Vic3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyBmaWxlICJscy1maWxlcyIgIi16IiAiLS1mdWxsLW5hbWUiICItLSIpCisgICAgICAgICAgICAgICAgICAgICAgIDAgLTEpKQorICAgICAgICAgICAgKGNvZGluZy1zeXN0ZW0tZm9yLXJlYWQgJ25vLWNvbnZlcnNpb24pCisgICAgICAgICAgICAoY29kaW5nLXN5c3RlbS1mb3Itd3JpdGUgJ25vLWNvbnZlcnNpb24pKQorICAgICAgICAod2l0aC10ZW1wLWZpbGUgZGVzdGZpbGUKKyAgICAgICAgICAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCB0IG5pbCAiY2F0LWZpbGUiICJibG9iIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAob3IgcmV2ICJIRUFEIikgIjoiIGZ1bGxuYW1lKSkpKSkKKyAgICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJjaGVja291dCIgKG9yIHJldiAiSEVBRCIpKSkpCisKKyhkZWZ1biB2Yy1naXQtYW5ub3RhdGUtY29tbWFuZCAoZmlsZSBidWYgJm9wdGlvbmFsIHJldikKKyAgOyBGSVhNRTogcmV2IGlzIGlnbm9yZWQKKyAgKGxldCAoKG5hbWUgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlKSkpCisgICAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgYnVmIG5pbCAiYmxhbWUiIG5hbWUpKSkKKworKGRlZnVuIHZjLWdpdC1hbm5vdGF0ZS10aW1lICgpCisgIChhbmQgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC05YS1mXSsgKC4qIFxcKFswLTldK1xcKS1cXChbMC05XStcXCktXFwoWzAtOV0rXFwpIFxcKFswLTldK1xcKTpcXChbMC05XStcXCk6XFwoWzAtOV0rXFwpIFxcKFstKzAtOV0rXFwpICtbMC05XSspIiBuaWwgdCkKKyAgICAgICAodmMtYW5ub3RhdGUtY29udmVydC10aW1lCisgICAgICAgIChhcHBseSAjJ2VuY29kZS10aW1lIChtYXBjYXIgKGxhbWJkYSAobWF0Y2gpIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgbWF0Y2gpKSkgJyg2IDUgNCAzIDIgMSA3KSkpKSkpCisKKzs7IE5vdCByZWFsbHkgdXNlZnVsIHNpbmNlIHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGggdGhlIHJldmlzaW9uIHlldAorOzsoZGVmdW4gdmMtYW5ub3RhdGUtZXh0cmFjdC1yZXZpc2lvbi1hdC1saW5lICgpCis7OyAgKHNhdmUtZXhjdXJzaW9uCis7OyAgICAobW92ZS1iZWdpbm5pbmctb2YtbGluZSAxKQorOzsgICAgKGFuZCAobG9va2luZy1hdCAiWzAtOWEtZl0rIikKKzs7ICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAwKSAobWF0Y2gtZW5kIDApKSkpKQorCisocHJvdmlkZSAndmMtZ2l0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtZ2Muc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1nYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzZkN2NhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtZ2Muc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiwgU2hhd24gTy4gUGVhcmNlCisjCisjIENsZWFudXAgdW5yZWFjaGFibGUgZmlsZXMgYW5kIG9wdGltaXplIHRoZSByZXBvc2l0b3J5LgorCitVU0FHRT0nWy0tcHJ1bmVdJworU1VCRElSRUNUT1JZX09LPVllcworLiBnaXQtc2gtc2V0dXAKKworbm9fcHJ1bmU9Ogord2hpbGUgY2FzZSAkIyBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS0tcHJ1bmUpCisJCW5vX3BydW5lPQorCQk7OworCS0tKQorCQl1c2FnZQorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkKGdpdCBjb25maWcgLS1nZXQgZ2MucGFja3JlZnMpIiBpbgorbm90YmFyZXwiIikKKwl0ZXN0ICQoaXNfYmFyZV9yZXBvc2l0b3J5KSA9IHRydWUgfHwgcGFja19yZWZzPXRydWU7OworKikKKwlwYWNrX3JlZnM9JChnaXQgY29uZmlnIC0tYm9vbCAtLWdldCBnYy5wYWNrcmVmcykKK2VzYWMKKwordGVzdCAidHJ1ZSIgIT0gIiRwYWNrX3JlZnMiIHx8CitnaXQtcGFjay1yZWZzIC0tcHJ1bmUgJiYKK2dpdC1yZWZsb2cgZXhwaXJlIC0tYWxsICYmCitnaXQtcmVwYWNrIC1hIC1kIC1sICYmCiskbm9fcHJ1bmUgZ2l0LXBydW5lICYmCitnaXQtcmVyZXJlIGdjIHx8IGV4aXQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXJlc29sdmUuc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNvbHZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2YjkwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNvbHZlLnNoCkBAIC0wLDAgKzEsMTEyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisjCisjIFJlc29sdmUgdHdvIHRyZWVzLgorIworCitlY2hvICdXQVJOSU5HOiBUaGlzIGNvbW1hbmQgaXMgREVQUkVDQVRFRCBhbmQgd2lsbCBiZSByZW1vdmVkIHZlcnkgc29vbi4nID4mMgorZWNobyAnV0FSTklORzogUGxlYXNlIHVzZSBnaXQtbWVyZ2Ugb3IgZ2l0LXB1bGwgaW5zdGVhZC4nID4mMgorc2xlZXAgMgorCitVU0FHRT0nPGhlYWQ+IDxyZW1vdGU+IDxtZXJnZS1tZXNzYWdlPicKKy4gZ2l0LXNoLXNldHVwCisKK2Ryb3BoZWFkcygpIHsKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgXAorCQkiJEdJVF9ESVIvTEFTVF9NRVJHRSIgfHwgZXhpdCAxCit9CisKK2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMSJeMCkgJiYKK21lcmdlPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDIiXjApICYmCittZXJnZV9uYW1lPSIkMiIgJiYKK21lcmdlX21zZz0iJDMiIHx8IHVzYWdlCisKKyMKKyMgVGhlIHJlbW90ZSBuYW1lIGlzIGp1c3QgdXNlZCBmb3IgdGhlIG1lc3NhZ2UsCisjIGJ1dCB3ZSBkbyB3YW50IGl0LgorIworaWYgWyAteiAiJGhlYWQiIC1vIC16ICIkbWVyZ2UiIC1vIC16ICIkbWVyZ2VfbXNnIiBdOyB0aGVuCisJdXNhZ2UKK2ZpCisKK2Ryb3BoZWFkcworZWNobyAkaGVhZCA+ICIkR0lUX0RJUiIvT1JJR19IRUFECitlY2hvICRtZXJnZSA+ICIkR0lUX0RJUiIvTEFTVF9NRVJHRQorCitjb21tb249JChnaXQtbWVyZ2UtYmFzZSAkaGVhZCAkbWVyZ2UpCitpZiBbIC16ICIkY29tbW9uIiBdOyB0aGVuCisJZGllICJVbmFibGUgdG8gZmluZCBjb21tb24gY29tbWl0IGJldHdlZW4iICRtZXJnZSAkaGVhZAorZmkKKworY2FzZSAiJGNvbW1vbiIgaW4KKyIkbWVyZ2UiKQorCWVjaG8gIkFscmVhZHkgdXAtdG8tZGF0ZS4gWWVlYWghIgorCWRyb3BoZWFkcworCWV4aXQgMAorCTs7CisiJGhlYWQiKQorCWVjaG8gIlVwZGF0aW5nICQoZ2l0LXJldi1wYXJzZSAtLXNob3J0ICRoZWFkKS4uJChnaXQtcmV2LXBhcnNlIC0tc2hvcnQgJG1lcmdlKSIKKwlnaXQtcmVhZC10cmVlIC11IC1tICRoZWFkICRtZXJnZSB8fCBleGl0IDEKKwlnaXQtdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogRmFzdCBmb3J3YXJkIiBcCisJCUhFQUQgIiRtZXJnZSIgIiRoZWFkIgorCWdpdC1kaWZmLXRyZWUgLXAgJGhlYWQgJG1lcmdlIHwgZ2l0LWFwcGx5IC0tc3RhdAorCWRyb3BoZWFkcworCWV4aXQgMAorCTs7Citlc2FjCisKKyMgV2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBuZXcgY29tbWl0LgorZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisjIEZpbmQgYW4gb3B0aW11bSBtZXJnZSBiYXNlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNhbmRpZGF0ZXMuCitMRj0nCisnCitjb21tb249JChnaXQtbWVyZ2UtYmFzZSAtYSAkaGVhZCAkbWVyZ2UpCitjYXNlICIkY29tbW9uIiBpbgorPyoiJExGIj8qKQorCWVjaG8gIlRyeWluZyB0byBmaW5kIHRoZSBvcHRpbXVtIG1lcmdlIGJhc2UuIgorCUc9LnRtcC1pbmRleCQkCisJYmVzdD0KKwliZXN0X2NudD0tMQorCWZvciBjIGluICRjb21tb24KKwlkbworCQlybSAtZiAkRworCQlHSVRfSU5ERVhfRklMRT0kRyBnaXQtcmVhZC10cmVlIC1tICRjICRoZWFkICRtZXJnZSBcCisJCQkyPi9kZXYvbnVsbCB8fCBjb250aW51ZQorCQkjIENvdW50IHRoZSBwYXRocyB0aGF0IGFyZSB1bm1lcmdlZC4KKwkJY250PWBHSVRfSU5ERVhfRklMRT0kRyBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZCB8IHdjIC1sYAorCQlpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkJdGhlbgorCQkJYmVzdD0kYworCQkJYmVzdF9jbnQ9JGNudAorCQkJaWYgdGVzdCAiJGJlc3RfY250IiAtZXEgMAorCQkJdGhlbgorCQkJCSMgQ2Fubm90IGRvIGFueSBiZXR0ZXIgdGhhbiBhbGwgdHJpdmlhbCBtZXJnZS4KKwkJCQlicmVhaworCQkJZmkKKwkJZmkKKwlkb25lCisJcm0gLWYgJEcKKwljb21tb249IiRiZXN0IgorZXNhYworCitlY2hvICJUcnlpbmcgdG8gbWVyZ2UgJG1lcmdlIGludG8gJGhlYWQgdXNpbmcgJGNvbW1vbi4iCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0LXJlYWQtdHJlZSAtdSAtbSAkY29tbW9uICRoZWFkICRtZXJnZSB8fCBleGl0IDEKK3Jlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUgIDI+IC9kZXYvbnVsbCkKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWVjaG8gIlNpbXBsZSBtZXJnZSBmYWlsZWQsIHRyeWluZyBBdXRvbWF0aWMgbWVyZ2UiCisJZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQllY2hvICRtZXJnZSA+ICIkR0lUX0RJUiIvTUVSR0VfSEVBRAorCQlkaWUgIkF1dG9tYXRpYyBtZXJnZSBmYWlsZWQsIGZpeCB1cCBieSBoYW5kIgorCWZpCisJcmVzdWx0X3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgfHwgZXhpdCAxCitmaQorcmVzdWx0X2NvbW1pdD0kKGVjaG8gIiRtZXJnZV9tc2ciIHwgZ2l0LWNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAtcCAkaGVhZCAtcCAkbWVyZ2UpCitlY2hvICJDb21taXR0ZWQgbWVyZ2UgJHJlc3VsdF9jb21taXQiCitnaXQtdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogSW4taW5kZXggbWVyZ2UiIFwKKwlIRUFEICIkcmVzdWx0X2NvbW1pdCIgIiRoZWFkIgorZ2l0LWRpZmYtdHJlZSAtcCAkaGVhZCAkcmVzdWx0X2NvbW1pdCB8IGdpdC1hcHBseSAtLXN0YXQKK2Ryb3BoZWFkcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9pbXBvcnQtdGFycy5wZXJsIGIvY29udHJpYi9mYXN0LWltcG9ydC9pbXBvcnQtdGFycy5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzYWViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zhc3QtaW1wb3J0L2ltcG9ydC10YXJzLnBlcmwKQEAgLTAsMCArMSwxMzEgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIyB0YXIgYXJjaGl2ZSBmcm9udGVuZCBmb3IgZ2l0LWZhc3QtaW1wb3J0CisjIworIyMgRm9yIGV4YW1wbGU6CisjIworIyMgIG1rZGlyIHByb2plY3Q7IGNkIHByb2plY3Q7IGdpdCBpbml0CisjIyAgcGVybCBpbXBvcnQtdGFycy5wZXJsICoudGFyLmJ6MgorIyMgIGdpdCB3aGF0Y2hhbmdlZCBpbXBvcnQtdGFycworIyMKKwordXNlIHN0cmljdDsKK2RpZSAidXNhZ2U6IGltcG9ydC10YXJzICoudGFyLntneixiejIsWn1cbiIgdW5sZXNzIEBBUkdWOworCitteSAkYnJhbmNoX25hbWUgPSAnaW1wb3J0LXRhcnMnOworbXkgJGJyYW5jaF9yZWYgPSAicmVmcy9oZWFkcy8kYnJhbmNoX25hbWUiOworbXkgJGNvbW1pdHRlcl9uYW1lID0gJ1QgQXIgQ3JlYXRvcic7CitteSAkY29tbWl0dGVyX2VtYWlsID0gJ3RhckBleGFtcGxlLmNvbSc7CisKK29wZW4oRkksICd8LScsICdnaXQnLCAnZmFzdC1pbXBvcnQnLCAnLS1xdWlldCcpCisJb3IgZGllICJVbmFibGUgdG8gc3RhcnQgZ2l0IGZhc3QtaW1wb3J0OiAkIVxuIjsKK2ZvcmVhY2ggbXkgJHRhcl9maWxlIChAQVJHVikKK3sKKwkkdGFyX2ZpbGUgPX4gbSwoW14vXSspJCw7CisJbXkgJHRhcl9uYW1lID0gJDE7CisKKwlpZiAoJHRhcl9uYW1lID1+IHMvXC4odGFyXC5nenx0Z3opJC8vKSB7CisJCW9wZW4oSSwgJy18JywgJ2d1bnppcCcsICctYycsICR0YXJfZmlsZSkKKwkJCW9yIGRpZSAiVW5hYmxlIHRvIGd1bnppcCAtYyAkdGFyX2ZpbGU6ICQhXG4iOworCX0gZWxzaWYgKCR0YXJfbmFtZSA9fiBzL1wuKHRhclwuYnoyfHRiejIpJC8vKSB7CisJCW9wZW4oSSwgJy18JywgJ2J1bnppcDInLCAnLWMnLCAkdGFyX2ZpbGUpCisJCQlvciBkaWUgIlVuYWJsZSB0byBidW56aXAyIC1jICR0YXJfZmlsZTogJCFcbiI7CisJfSBlbHNpZiAoJHRhcl9uYW1lID1+IHMvXC50YXJcLlokLy8pIHsKKwkJb3BlbihJLCAnLXwnLCAndW5jb21wcmVzcycsICctYycsICR0YXJfZmlsZSkKKwkJCW9yIGRpZSAiVW5hYmxlIHRvIHVuY29tcHJlc3MgLWMgJHRhcl9maWxlOiAkIVxuIjsKKwl9IGVsc2lmICgkdGFyX25hbWUgPX4gcy9cLnRhciQvLykgeworCQlvcGVuKEksICR0YXJfZmlsZSkgb3IgZGllICJVbmFibGUgdG8gb3BlbiAkdGFyX2ZpbGU6ICQhXG4iOworCX0gZWxzZSB7CisJCWRpZSAiVW5yZWNvZ25pemVkIGNvbXByZXNzaW9uIGZvcm1hdDogJHRhcl9maWxlXG4iOworCX0KKworCW15ICRjb21taXRfdGltZSA9IDA7CisJbXkgJG5leHRfbWFyayA9IDE7CisJbXkgJGhhdmVfdG9wX2RpciA9IDE7CisJbXkgKCR0b3BfZGlyLCAlZmlsZXMpOworCisJd2hpbGUgKHJlYWQoSSwgJF8sIDUxMikgPT0gNTEyKSB7CisJCW15ICgkbmFtZSwgJG1vZGUsICR1aWQsICRnaWQsICRzaXplLCAkbXRpbWUsCisJCQkkY2hrc3VtLCAkdHlwZWZsYWcsICRsaW5rbmFtZSwgJG1hZ2ljLAorCQkJJHZlcnNpb24sICR1bmFtZSwgJGduYW1lLCAkZGV2bWFqb3IsICRkZXZtaW5vciwKKwkJCSRwcmVmaXgpID0gdW5wYWNrICdaMTAwIFo4IFo4IFo4IFoxMiBaMTIKKwkJCVo4IFoxIFoxMDAgWjYKKwkJCVoyIFozMiBaMzIgWjggWjggWionLCAkXzsKKwkJbGFzdCB1bmxlc3MgbGVuZ3RoKCRuYW1lKTsKKwkJaWYgKCRuYW1lIGVxICcuLy4vQExvbmdMaW5rJykgeworCQkJIyBHTlUgdGFyIGV4dGVuc2lvbgorCQkJaWYgKHJlYWQoSSwgJF8sIDUxMikgIT0gNTEyKSB7CisJCQkJZGllICgnU2hvcnQgYXJjaGl2ZScpOworCQkJfQorCQkJJG5hbWUgPSB1bnBhY2sgJ1oyNTcnLCAkXzsKKwkJCW5leHQgdW5sZXNzICRuYW1lOworCisJCQlteSAkZHVtbXk7CisJCQlpZiAocmVhZChJLCAkXywgNTEyKSAhPSA1MTIpIHsKKwkJCQlkaWUgKCdTaG9ydCBhcmNoaXZlJyk7CisJCQl9CisJCQkoJGR1bW15LCAkbW9kZSwgJHVpZCwgJGdpZCwgJHNpemUsICRtdGltZSwKKwkJCSRjaGtzdW0sICR0eXBlZmxhZywgJGxpbmtuYW1lLCAkbWFnaWMsCisJCQkkdmVyc2lvbiwgJHVuYW1lLCAkZ25hbWUsICRkZXZtYWpvciwgJGRldm1pbm9yLAorCQkJJHByZWZpeCkgPSB1bnBhY2sgJ1oxMDAgWjggWjggWjggWjEyIFoxMgorCQkJWjggWjEgWjEwMCBaNgorCQkJWjIgWjMyIFozMiBaOCBaOCBaKicsICRfOworCQl9CisJCW5leHQgaWYgJG5hbWUgPX4gbXsvXHp9OworCQkkbW9kZSA9IG9jdCAkbW9kZTsKKwkJJHNpemUgPSBvY3QgJHNpemU7CisJCSRtdGltZSA9IG9jdCAkbXRpbWU7CisJCW5leHQgaWYgJHR5cGVmbGFnID09IDU7ICMgZGlyZWN0b3J5CisKKwkJcHJpbnQgRkkgImJsb2JcbiIsICJtYXJrIDokbmV4dF9tYXJrXG4iLCAiZGF0YSAkc2l6ZVxuIjsKKwkJd2hpbGUgKCRzaXplID4gMCAmJiByZWFkKEksICRfLCA1MTIpID09IDUxMikgeworCQkJcHJpbnQgRkkgc3Vic3RyKCRfLCAwLCAkc2l6ZSk7CisJCQkkc2l6ZSAtPSA1MTI7CisJCX0KKwkJcHJpbnQgRkkgIlxuIjsKKworCQlteSAkcGF0aDsKKwkJaWYgKCRwcmVmaXgpIHsKKwkJCSRwYXRoID0gIiRwcmVmaXgvJG5hbWUiOworCQl9IGVsc2UgeworCQkJJHBhdGggPSAiJG5hbWUiOworCQl9CisJCSRmaWxlc3skcGF0aH0gPSBbJG5leHRfbWFyaysrLCAkbW9kZV07CisKKwkJJGNvbW1pdF90aW1lID0gJG10aW1lIGlmICRtdGltZSA+ICRjb21taXRfdGltZTsKKwkJJHBhdGggPX4gbSxeKFteL10rKS8sOworCQkkdG9wX2RpciA9ICQxIHVubGVzcyAkdG9wX2RpcjsKKwkJJGhhdmVfdG9wX2RpciA9IDAgaWYgJHRvcF9kaXIgbmUgJDE7CisJfQorCisJcHJpbnQgRkkgPDxFT0Y7Citjb21taXQgJGJyYW5jaF9yZWYKK2NvbW1pdHRlciAkY29tbWl0dGVyX25hbWUgPCRjb21taXR0ZXJfZW1haWw+ICRjb21taXRfdGltZSArMDAwMAorZGF0YSA8PEVORF9PRl9DT01NSVRfTUVTU0FHRQorSW1wb3J0ZWQgZnJvbSAkdGFyX2ZpbGUuCitFTkRfT0ZfQ09NTUlUX01FU1NBR0UKKworZGVsZXRlYWxsCitFT0YKKworCWZvcmVhY2ggbXkgJHBhdGggKGtleXMgJWZpbGVzKQorCXsKKwkJbXkgKCRtYXJrLCAkbW9kZSkgPSBAeyRmaWxlc3skcGF0aH19OworCQkkcGF0aCA9fiBzLF4oW14vXSspLywsIGlmICRoYXZlX3RvcF9kaXI7CisJCXByaW50ZiBGSSAiTSAlbyA6JWkgJXNcbiIsICRtb2RlICYgMDExMSA/IDA3NTUgOiAwNjQ0LCAkbWFyaywgJHBhdGg7CisJfQorCXByaW50IEZJICJcbiI7CisKKwlwcmludCBGSSA8PEVPRjsKK3RhZyAkdGFyX25hbWUKK2Zyb20gJGJyYW5jaF9yZWYKK3RhZ2dlciAkY29tbWl0dGVyX25hbWUgPCRjb21taXR0ZXJfZW1haWw+ICRjb21taXRfdGltZSArMDAwMAorZGF0YSA8PEVORF9PRl9UQUdfTUVTU0FHRQorUGFja2FnZSAkdGFyX25hbWUKK0VORF9PRl9UQUdfTUVTU0FHRQorCitFT0YKKworCWNsb3NlIEk7Cit9CitjbG9zZSBGSTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3IGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQ4MGUyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3CkBAIC0wLDAgKzEsMTI4MSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyIiIiBnaXR2aWV3CitHVUkgYnJvd3NlciBmb3IgZ2l0IHJlcG9zaXRvcnkKK1RoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBienJrIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CisiIiIKK19fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IChDKSAyMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuIgorX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgKEMpIDIwMDcgQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbSIKK19fYXV0aG9yX18gICAgPSAiQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbT4iCisKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZ3RrCitpbXBvcnQgcHlndGsKK2ltcG9ydCBwYW5nbworaW1wb3J0IHJlCitpbXBvcnQgdGltZQoraW1wb3J0IGdvYmplY3QKK2ltcG9ydCBjYWlybworaW1wb3J0IG1hdGgKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBmY250bAorCit0cnk6CisgICAgaW1wb3J0IGd0a3NvdXJjZXZpZXcKKyAgICBoYXZlX2d0a3NvdXJjZXZpZXcgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV9ndGtzb3VyY2V2aWV3ID0gRmFsc2UKKyAgICBwcmludCAiUnVubmluZyB3aXRob3V0IGd0a3NvdXJjZXZpZXcgbW9kdWxlIgorCityZV9pZGVudCA9IHJlLmNvbXBpbGUoJyhhdXRob3J8Y29tbWl0dGVyKSAoP1A8aWRlbnQ+LiopICg/UDxlcG9jaD5cZCspICg/UDx0ej5bKy1dXGR7NH0pJykKKworZGVmIGxpc3RfdG9fc3RyaW5nKGFyZ3MsIHNraXApOgorCWNvdW50ID0gbGVuKGFyZ3MpCisJaSA9IHNraXAKKwlzdHJfYXJnPSIgIgorCXdoaWxlIChpIDwgY291bnQgKToKKwkJc3RyX2FyZyA9IHN0cl9hcmcgKyBhcmdzW2ldCisJCXN0cl9hcmcgPSBzdHJfYXJnICsgIiAiCisJCWkgPSBpKzEKKworCXJldHVybiBzdHJfYXJnCisKK2RlZiBzaG93X2RhdGUoZXBvY2gsIHR6KToKKwlzZWNzID0gZmxvYXQoZXBvY2gpCisJdHpzZWNzID0gZmxvYXQodHpbMTozXSkgKiAzNjAwCisJdHpzZWNzICs9IGZsb2F0KHR6WzM6NV0pICogNjAKKwlpZiAodHpbMF0gPT0gIisiKToKKwkJc2VjcyArPSB0enNlY3MKKwllbHNlOgorCQlzZWNzIC09IHR6c2VjcworCisJcmV0dXJuIHRpbWUuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIiwgdGltZS5nbXRpbWUoc2VjcykpCisKKworY2xhc3MgQ2VsbFJlbmRlcmVyR3JhcGgoZ3RrLkdlbmVyaWNDZWxsUmVuZGVyZXIpOgorCSIiIkNlbGwgcmVuZGVyZXIgZm9yIGRpcmVjdGVkIGdyYXBoLgorCisJVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY3VzdG9tIEd0a0NlbGxSZW5kZXJlciB0aGF0CisJZHJhd3MgcGFydCBvZiB0aGUgZGlyZWN0ZWQgZ3JhcGggYmFzZWQgb24gdGhlIGxpbmVzIHN1Z2dlc3RlZCBieSB0aGUgY29kZQorCWluIGdyYXBoLnB5LgorCisJQmVjYXVzZSB3ZSdyZSBzaGlueSwgd2UgdXNlIENhaXJvIHRvIGRvIHRoaXMsIGFuZCBiZWNhdXNlIHdlJ3JlIG5hdWdodHkKKwl3ZSBjaGVhdCBhbmQgZHJhdyBvdmVyIHRoZSBiaXRzIG9mIHRoZSBUcmVlVmlld0NvbHVtbiB0aGF0IGFyZSBzdXBwb3NlZCB0bworCWp1c3QgYmUgZm9yIHRoZSBiYWNrZ3JvdW5kLgorCisJUHJvcGVydGllczoKKwlub2RlICAgICAgICAgICAgICAoY29sdW1uLCBjb2xvdXIsIFsgbmFtZXMgXSkgdHVwbGUgdG8gZHJhdyByZXZpc2lvbiBub2RlLAorCWluX2xpbmVzICAgICAgICAgIChzdGFydCwgZW5kLCBjb2xvdXIpIHR1cGxlIGxpc3QgdG8gZHJhdyBpbndhcmQgbGluZXMsCisJb3V0X2xpbmVzICAgICAgICAgKHN0YXJ0LCBlbmQsIGNvbG91cikgdHVwbGUgbGlzdCB0byBkcmF3IG91dHdhcmQgbGluZXMuCisJIiIiCisKKwlfX2dwcm9wZXJ0aWVzX18gPSB7CisJIm5vZGUiOiAgICAgICAgICggZ29iamVjdC5UWVBFX1BZT0JKRUNULCAibm9kZSIsCisJCQkgICJyZXZpc2lvbiBub2RlIGluc3RydWN0aW9uIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwkiaW4tbGluZXMiOiAgICAgKCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsICJpbi1saW5lcyIsCisJCQkgICJpbnN0cnVjdGlvbnMgdG8gZHJhdyBsaW5lcyBpbnRvIHRoZSBjZWxsIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwkib3V0LWxpbmVzIjogICAgKCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsICJvdXQtbGluZXMiLAorCQkJICAiaW5zdHJ1Y3Rpb25zIHRvIGRyYXcgbGluZXMgb3V0IG9mIHRoZSBjZWxsIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwl9CisKKwlkZWYgZG9fc2V0X3Byb3BlcnR5KHNlbGYsIHByb3BlcnR5LCB2YWx1ZSk6CisJCSIiIlNldCBwcm9wZXJ0aWVzIGZyb20gR09iamVjdCBwcm9wZXJ0aWVzLiIiIgorCQlpZiBwcm9wZXJ0eS5uYW1lID09ICJub2RlIjoKKwkJCXNlbGYubm9kZSA9IHZhbHVlCisJCWVsaWYgcHJvcGVydHkubmFtZSA9PSAiaW4tbGluZXMiOgorCQkJc2VsZi5pbl9saW5lcyA9IHZhbHVlCisJCWVsaWYgcHJvcGVydHkubmFtZSA9PSAib3V0LWxpbmVzIjoKKwkJCXNlbGYub3V0X2xpbmVzID0gdmFsdWUKKwkJZWxzZToKKwkJCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCAibm8gc3VjaCBwcm9wZXJ0eTogJyVzJyIgJSBwcm9wZXJ0eS5uYW1lCisKKwlkZWYgYm94X3NpemUoc2VsZiwgd2lkZ2V0KToKKwkJIiIiQ2FsY3VsYXRlIGJveCBzaXplIGJhc2VkIG9uIHdpZGdldCdzIGZvbnQuCisKKwkJQ2FjaGUgdGhpcyBhcyBpdCdzIHByb2JhYmx5IGV4cGVuc2l2ZSB0byBnZXQuICBJdCBlbnN1cmVzIHRoYXQgd2UKKwkJZHJhdyB0aGUgZ3JhcGggYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIHRleHQuCisJCSIiIgorCQl0cnk6CisJCQlyZXR1cm4gc2VsZi5fYm94X3NpemUKKwkJZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorCQkJcGFuZ29fY3R4ID0gd2lkZ2V0LmdldF9wYW5nb19jb250ZXh0KCkKKwkJCWZvbnRfZGVzYyA9IHdpZGdldC5nZXRfc3R5bGUoKS5mb250X2Rlc2MKKwkJCW1ldHJpY3MgPSBwYW5nb19jdHguZ2V0X21ldHJpY3MoZm9udF9kZXNjKQorCisJCQlhc2NlbnQgPSBwYW5nby5QSVhFTFMobWV0cmljcy5nZXRfYXNjZW50KCkpCisJCQlkZXNjZW50ID0gcGFuZ28uUElYRUxTKG1ldHJpY3MuZ2V0X2Rlc2NlbnQoKSkKKworCQkJc2VsZi5fYm94X3NpemUgPSBhc2NlbnQgKyBkZXNjZW50ICsgNgorCQkJcmV0dXJuIHNlbGYuX2JveF9zaXplCisKKwlkZWYgc2V0X2NvbG91cihzZWxmLCBjdHgsIGNvbG91ciwgYmcsIGZnKToKKwkJIiIiU2V0IHRoZSBjb250ZXh0IHNvdXJjZSBjb2xvdXIuCisKKwkJUGlja3MgYSBkaXN0aW5jdCBjb2xvdXIgYmFzZWQgb24gYW4gaW50ZXJuYWwgd2hlZWw7IHRoZSBiZworCQlwYXJhbWV0ZXIgcHJvdmlkZXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSAnemVybycKKwkJY29sb3VycyBhbmQgdGhlIGZnIHBhcmFtZXRlciBwcm92aWRlcyB0aGUgbXVsdGlwbGllciB0aGF0IHNob3VsZCBiZQorCQlhcHBsaWVkIHRvIHRoZSBmb3JlZ3JvdW5kIGNvbG91cnMuCisJCSIiIgorCQljb2xvdXJzID0gWworCQkgICAgKCAxLjAsIDAuMCwgMC4wICksCisJCSAgICAoIDEuMCwgMS4wLCAwLjAgKSwKKwkJICAgICggMC4wLCAxLjAsIDAuMCApLAorCQkgICAgKCAwLjAsIDEuMCwgMS4wICksCisJCSAgICAoIDAuMCwgMC4wLCAxLjAgKSwKKwkJICAgICggMS4wLCAwLjAsIDEuMCApLAorCQkgICAgXQorCisJCWNvbG91ciAlPSBsZW4oY29sb3VycykKKwkJcmVkICAgPSAoY29sb3Vyc1tjb2xvdXJdWzBdICogZmcpIG9yIGJnCisJCWdyZWVuID0gKGNvbG91cnNbY29sb3VyXVsxXSAqIGZnKSBvciBiZworCQlibHVlICA9IChjb2xvdXJzW2NvbG91cl1bMl0gKiBmZykgb3IgYmcKKworCQljdHguc2V0X3NvdXJjZV9yZ2IocmVkLCBncmVlbiwgYmx1ZSkKKworCWRlZiBvbl9nZXRfc2l6ZShzZWxmLCB3aWRnZXQsIGNlbGxfYXJlYSk6CisJCSIiIlJldHVybiB0aGUgc2l6ZSB3ZSBuZWVkIGZvciB0aGlzIGNlbGwuCisKKwkJRWFjaCBjZWxsIGlzIGRyYXduIGluZGl2aWR1YWxseSBhbmQgaXMgb25seSBhcyB3aWRlIGFzIGl0IG5lZWRzCisJCXRvIGJlLCB3ZSBsZXQgdGhlIFRyZWVWaWV3Q29sdW1uIHRha2UgY2FyZSBvZiBtYWtpbmcgdGhlbSBhbGwKKwkJbGluZSB1cC4KKwkJIiIiCisJCWJveF9zaXplID0gc2VsZi5ib3hfc2l6ZSh3aWRnZXQpCisKKwkJY29scyA9IHNlbGYubm9kZVswXQorCQlmb3Igc3RhcnQsIGVuZCwgY29sb3VyIGluIHNlbGYuaW5fbGluZXMgKyBzZWxmLm91dF9saW5lczoKKwkJCWNvbHMgPSBpbnQobWF4KGNvbHMsIHN0YXJ0LCBlbmQpKQorCisJCShjb2x1bW4sIGNvbG91ciwgbmFtZXMpID0gc2VsZi5ub2RlCisJCW5hbWVzX2xlbiA9IDAKKwkJaWYgKGxlbihuYW1lcykgIT0gMCk6CisJCQlmb3IgaXRlbSBpbiBuYW1lczoKKwkJCQluYW1lc19sZW4gKz0gbGVuKGl0ZW0pCisKKwkJd2lkdGggPSBib3hfc2l6ZSAqIChjb2xzICsgMSApICsgbmFtZXNfbGVuCisJCWhlaWdodCA9IGJveF9zaXplCisKKwkJIyBGSVhNRSBJIGhhdmUgbm8gaWRlYSBob3cgdG8gdXNlIGNlbGxfYXJlYSBwcm9wZXJseQorCQlyZXR1cm4gKDAsIDAsIHdpZHRoLCBoZWlnaHQpCisKKwlkZWYgb25fcmVuZGVyKHNlbGYsIHdpbmRvdywgd2lkZ2V0LCBiZ19hcmVhLCBjZWxsX2FyZWEsIGV4cF9hcmVhLCBmbGFncyk6CisJCSIiIlJlbmRlciBhbiBpbmRpdmlkdWFsIGNlbGwuCisKKwkJRHJhd3MgdGhlIGNlbGwgY29udGVudHMgdXNpbmcgY2Fpcm8sIHRha2luZyBjYXJlIHRvIGNsaXAgd2hhdCB3ZQorCQlkbyB0byB3aXRoaW4gdGhlIGJhY2tncm91bmQgYXJlYSBzbyB3ZSBkb24ndCBkcmF3IG92ZXIgb3RoZXIgY2VsbHMuCisJCU5vdGUgdGhhdCB3ZSdyZSBhIGJpdCBuYXVnaHR5IHRoZXJlIGFuZCBzaG91bGQgcmVhbGx5IGJlIGRyYXdpbmcKKwkJaW4gdGhlIGNlbGxfYXJlYSAob3IgZXZlbiB0aGUgZXhwb3NlZCBhcmVhKSwgYnV0IHdlIGV4cGxpY2l0bHkgZG9uJ3QKKwkJd2FudCBhbnkgZ3V0dGVyLgorCisJCVdlIHRyeSBhbmQgYmUgYSBsaXR0bGUgY2xldmVyLCBpZiB0aGUgbGluZSB3ZSBuZWVkIHRvIGRyYXcgaXMgZ29pbmcKKwkJdG8gY3Jvc3Mgb3RoZXIgY29sdW1ucyB3ZSBhY3R1YWxseSBkcmF3IGl0IGFzIGluIHRoZSAuLS0tJyBzdHlsZQorCQlpbnN0ZWFkIG9mIGEgcHVyZSBkaWFnb25hbCAuLi4gdGhpcyByZWR1Y2VzIGNvbmZ1c2lvbiBieSBhbgorCQlpbmNyZWRpYmxlIGFtb3VudC4KKwkJIiIiCisJCWN0eCA9IHdpbmRvdy5jYWlyb19jcmVhdGUoKQorCQljdHgucmVjdGFuZ2xlKGJnX2FyZWEueCwgYmdfYXJlYS55LCBiZ19hcmVhLndpZHRoLCBiZ19hcmVhLmhlaWdodCkKKwkJY3R4LmNsaXAoKQorCisJCWJveF9zaXplID0gc2VsZi5ib3hfc2l6ZSh3aWRnZXQpCisKKwkJY3R4LnNldF9saW5lX3dpZHRoKGJveF9zaXplIC8gOCkKKwkJY3R4LnNldF9saW5lX2NhcChjYWlyby5MSU5FX0NBUF9TUVVBUkUpCisKKwkJIyBEcmF3IGxpbmVzIGludG8gdGhlIGNlbGwKKwkJZm9yIHN0YXJ0LCBlbmQsIGNvbG91ciBpbiBzZWxmLmluX2xpbmVzOgorCQkJY3R4Lm1vdmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0ICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgLSBiZ19hcmVhLmhlaWdodCAvIDIpCisKKwkJCWlmIHN0YXJ0IC0gZW5kID4gMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQsIGJnX2FyZWEueSkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUsIGJnX2FyZWEueSkKKwkJCWVsaWYgc3RhcnQgLSBlbmQgPCAtMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSwKKwkJCQkJCWJnX2FyZWEueSkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kLCBiZ19hcmVhLnkpCisKKwkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0IC8gMikKKworCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNjUpCisJCQljdHguc3Ryb2tlKCkKKworCQkjIERyYXcgbGluZXMgb3V0IG9mIHRoZSBjZWxsCisJCWZvciBzdGFydCwgZW5kLCBjb2xvdXIgaW4gc2VsZi5vdXRfbGluZXM6CisJCQljdHgubW92ZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0IC8gMikKKworCQkJaWYgc3RhcnQgLSBlbmQgPiAxOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCQkJZWxpZiBzdGFydCAtIGVuZCA8IC0xOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCArIGJveF9zaXplLAorCQkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQpCisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCisJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCAvIDIgKyBiZ19hcmVhLmhlaWdodCkKKworCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNjUpCisJCQljdHguc3Ryb2tlKCkKKworCQkjIERyYXcgdGhlIHJldmlzaW9uIG5vZGUgaW4gdGhlIHJpZ2h0IGNvbHVtbgorCQkoY29sdW1uLCBjb2xvdXIsIG5hbWVzKSA9IHNlbGYubm9kZQorCQljdHguYXJjKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBjb2x1bW4gKyBib3hfc2l6ZSAvIDIsCisJCQkJY2VsbF9hcmVhLnkgKyBjZWxsX2FyZWEuaGVpZ2h0IC8gMiwKKwkJCQlib3hfc2l6ZSAvIDQsIDAsIDIgKiBtYXRoLnBpKQorCisKKwkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNSkKKwkJY3R4LnN0cm9rZV9wcmVzZXJ2ZSgpCisKKwkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjUsIDEuMCkKKwkJY3R4LmZpbGxfcHJlc2VydmUoKQorCisJCWlmIChsZW4obmFtZXMpICE9IDApOgorCQkJbmFtZSA9ICIgIgorCQkJZm9yIGl0ZW0gaW4gbmFtZXM6CisJCQkJbmFtZSA9IG5hbWUgKyBpdGVtICsgIiAiCisKKwkJCWN0eC5zZXRfZm9udF9zaXplKDEzKQorCQkJaWYgKGZsYWdzICYgMSk6CisJCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjUsIDEuMCkKKwkJCWVsc2U6CisJCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNSkKKwkJCWN0eC5zaG93X3RleHQobmFtZSkKKworY2xhc3MgQ29tbWl0OgorCSIiIiBUaGlzIHJlcHJlc2VudCBhIGNvbW1pdCBvYmplY3Qgb2J0YWluZWQgYWZ0ZXIgcGFyc2luZyB0aGUgZ2l0LXJldi1saXN0CisJb3V0cHV0ICIiIgorCisJY2hpbGRyZW5fc2hhMSA9IHt9CisKKwlkZWYgX19pbml0X18oc2VsZiwgY29tbWl0X2xpbmVzKToKKwkJc2VsZi5tZXNzYWdlCQk9ICIiCisJCXNlbGYuYXV0aG9yCQk9ICIiCisJCXNlbGYuZGF0ZQkJPSAiIgorCQlzZWxmLmNvbW1pdHRlcgkJPSAiIgorCQlzZWxmLmNvbW1pdF9kYXRlCT0gIiIKKwkJc2VsZi5jb21taXRfc2hhMQk9ICIiCisJCXNlbGYucGFyZW50X3NoYTEJPSBbIF0KKwkJc2VsZi5wYXJzZV9jb21taXQoY29tbWl0X2xpbmVzKQorCisKKwlkZWYgcGFyc2VfY29tbWl0KHNlbGYsIGNvbW1pdF9saW5lcyk6CisKKwkJIyBGaXJzdCBsaW5lIGlzIHRoZSBzaGExIGxpbmVzCisJCWxpbmUgPSBzdHJpbmcuc3RyaXAoY29tbWl0X2xpbmVzWzBdKQorCQlzaGExID0gcmUuc3BsaXQoIiAiLCBsaW5lKQorCQlzZWxmLmNvbW1pdF9zaGExID0gc2hhMVswXQorCQlzZWxmLnBhcmVudF9zaGExID0gc2hhMVsxOl0KKworCQkjYnVpbGQgdGhlIGNoaWxkIGxpc3QKKwkJZm9yIHBhcmVudF9pZCBpbiBzZWxmLnBhcmVudF9zaGExOgorCQkJdHJ5OgorCQkJCUNvbW1pdC5jaGlsZHJlbl9zaGExW3BhcmVudF9pZF0uYXBwZW5kKHNlbGYuY29tbWl0X3NoYTEpCisJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJQ29tbWl0LmNoaWxkcmVuX3NoYTFbcGFyZW50X2lkXSA9IFtzZWxmLmNvbW1pdF9zaGExXQorCisJCSMgSUYgd2UgZG9uJ3QgaGF2ZSBwYXJlbnQKKwkJaWYgKGxlbihzZWxmLnBhcmVudF9zaGExKSA9PSAwKToKKwkJCXNlbGYucGFyZW50X3NoYTEgPSBbMF0KKworCQlmb3IgbGluZSBpbiBjb21taXRfbGluZXNbMTpdOgorCQkJbSA9IHJlLm1hdGNoKCJeICIsIGxpbmUpCisJCQlpZiAobSAhPSBOb25lKToKKwkJCQkjIEZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHVzZWQgZm9yIHNob3J0IGxvZworCQkJCWlmIHNlbGYubWVzc2FnZSA9PSAiIjoKKwkJCQkJc2VsZi5tZXNzYWdlID0gc3RyaW5nLnN0cmlwKGxpbmUpCisJCQkJY29udGludWUKKworCQkJbSA9IHJlLm1hdGNoKCJ0cmVlIiwgbGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCWNvbnRpbnVlCisKKwkJCW0gPSByZS5tYXRjaCgicGFyZW50IiwgbGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCWNvbnRpbnVlCisKKwkJCW0gPSByZV9pZGVudC5tYXRjaChsaW5lKQorCQkJaWYgKG0gIT0gTm9uZSk6CisJCQkJZGF0ZSA9IHNob3dfZGF0ZShtLmdyb3VwKCdlcG9jaCcpLCBtLmdyb3VwKCd0eicpKQorCQkJCWlmIG0uZ3JvdXAoMSkgPT0gImF1dGhvciI6CisJCQkJCXNlbGYuYXV0aG9yID0gbS5ncm91cCgnaWRlbnQnKQorCQkJCQlzZWxmLmRhdGUgPSBkYXRlCisJCQkJZWxpZiBtLmdyb3VwKDEpID09ICJjb21taXR0ZXIiOgorCQkJCQlzZWxmLmNvbW1pdHRlciA9IG0uZ3JvdXAoJ2lkZW50JykKKwkJCQkJc2VsZi5jb21taXRfZGF0ZSA9IGRhdGUKKworCQkJCWNvbnRpbnVlCisKKwlkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwgd2l0aF9kaWZmPTApOgorCQlpZiAod2l0aF9kaWZmID09IDEpOgorCQkJbWVzc2FnZSA9IHNlbGYuZGlmZl90cmVlKCkKKwkJZWxzZToKKwkJCWZwID0gb3MucG9wZW4oImdpdCBjYXQtZmlsZSBjb21taXQgIiArIHNlbGYuY29tbWl0X3NoYTEpCisJCQltZXNzYWdlID0gZnAucmVhZCgpCisJCQlmcC5jbG9zZSgpCisKKwkJcmV0dXJuIG1lc3NhZ2UKKworCWRlZiBkaWZmX3RyZWUoc2VsZik6CisJCWZwID0gb3MucG9wZW4oImdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1jYyAgLXYgLXAgLS1hbHdheXMgIiArICBzZWxmLmNvbW1pdF9zaGExKQorCQlkaWZmID0gZnAucmVhZCgpCisJCWZwLmNsb3NlKCkKKwkJcmV0dXJuIGRpZmYKKworY2xhc3MgQW5ub3RhdGVXaW5kb3c6CisJIiIiQW5ub3RhdGUgd2luZG93LgorCVRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW5kIG1hbmFnZXMgYSBzaW5nbGUgd2luZG93IGNvbnRhaW5pbmcgdGhlCisJYW5ub3RhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUKKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi53aW5kb3cgPSBndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIGFubm90YXRpb24gd2luZG93IikKKworCQkjIFVzZSB0d28gdGhpcmRzIG9mIHRoZSBzY3JlZW4gYnkgZGVmYXVsdAorCQlzY3JlZW4gPSBzZWxmLndpbmRvdy5nZXRfc2NyZWVuKCkKKwkJbW9uaXRvciA9IHNjcmVlbi5nZXRfbW9uaXRvcl9nZW9tZXRyeSgwKQorCQl3aWR0aCA9IGludChtb25pdG9yLndpZHRoICogMC42NikKKwkJaGVpZ2h0ID0gaW50KG1vbml0b3IuaGVpZ2h0ICogMC42NikKKwkJc2VsZi53aW5kb3cuc2V0X2RlZmF1bHRfc2l6ZSh3aWR0aCwgaGVpZ2h0KQorCisJZGVmIGFkZF9maWxlX2RhdGEoc2VsZiwgZmlsZW5hbWUsIGNvbW1pdF9zaGExLCBsaW5lX251bSk6CisJCWZwID0gb3MucG9wZW4oImdpdCBjYXQtZmlsZSBibG9iICIgKyBjb21taXRfc2hhMSArIjoiK2ZpbGVuYW1lKQorCQlpID0gMTsKKwkJZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6CisJCQlsaW5lID0gc3RyaW5nLnJzdHJpcChsaW5lKQorCQkJc2VsZi5tb2RlbC5hcHBlbmQoTm9uZSwgWyJIRUFEIiwgZmlsZW5hbWUsIGxpbmUsIGldKQorCQkJaSA9IGkrMQorCQlmcC5jbG9zZSgpCisKKwkJIyBub3cgc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24KKwkJc2VsZi50cmVldmlldy5zZXRfY3Vyc29yKGxpbmVfbnVtLTEpCisJCXNlbGYudHJlZXZpZXcuZ3JhYl9mb2N1cygpCisKKwlkZWYgX3RyZWV2aWV3X2N1cnNvcl9jYihzZWxmLCAqYXJncyk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIHRoZSB0cmVldmlldyBjdXJzb3IgY2hhbmdlcy4iIiIKKwkJKHBhdGgsIGNvbCkgPSBzZWxmLnRyZWV2aWV3LmdldF9jdXJzb3IoKQorCQljb21taXRfc2hhMSA9IHNlbGYubW9kZWxbcGF0aF1bMF0KKwkJY29tbWl0X21zZyA9ICIiCisJCWZwID0gb3MucG9wZW4oImdpdCBjYXQtZmlsZSBjb21taXQgIiArIGNvbW1pdF9zaGExKQorCQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKKwkJCWNvbW1pdF9tc2cgPSAgY29tbWl0X21zZyArIGxpbmUKKwkJZnAuY2xvc2UoKQorCisJCXNlbGYuY29tbWl0X2J1ZmZlci5zZXRfdGV4dChjb21taXRfbXNnKQorCisJZGVmIF90cmVldmlld19yb3dfYWN0aXZhdGVkKHNlbGYsICphcmdzKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHRyZWV2aWV3IHJvdyBnZXRzIHNlbGVjdGVkLiIiIgorCQkocGF0aCwgY29sKSA9IHNlbGYudHJlZXZpZXcuZ2V0X2N1cnNvcigpCisJCWNvbW1pdF9zaGExID0gc2VsZi5tb2RlbFtwYXRoXVswXQorCQlmaWxlbmFtZSAgICA9IHNlbGYubW9kZWxbcGF0aF1bMV0KKwkJbGluZV9udW0gICAgPSBzZWxmLm1vZGVsW3BhdGhdWzNdCisKKwkJd2luZG93ID0gQW5ub3RhdGVXaW5kb3coKTsKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJldi1wYXJzZSAiKyBjb21taXRfc2hhMSArICJ+MSIpCisJCWNvbW1pdF9zaGExID0gc3RyaW5nLnN0cmlwKGZwLnJlYWRsaW5lKCkpCisJCWZwLmNsb3NlKCkKKwkJd2luZG93LmFubm90YXRlKGZpbGVuYW1lLCBjb21taXRfc2hhMSwgbGluZV9udW0pCisKKwlkZWYgZGF0YV9yZWFkeShzZWxmLCBzb3VyY2UsIGNvbmRpdGlvbik6CisJCXdoaWxlICgxKToKKwkJCXRyeSA6CisJCQkJYnVmZmVyID0gc291cmNlLnJlYWQoODE5MikKKwkJCWV4Y2VwdDoKKwkJCQkjIHJlc291cmNlIHRlbXBvcmFyeSBub3QgYXZhaWxhYmxlCisJCQkJcmV0dXJuIFRydWUKKworCQkJaWYgKGxlbihidWZmZXIpID09IDApOgorCQkJCWdvYmplY3Quc291cmNlX3JlbW92ZShzZWxmLmlvX3dhdGNoX3RhZykKKwkJCQlzb3VyY2UuY2xvc2UoKQorCQkJCXJldHVybiBGYWxzZQorCisJCQlmb3IgYnVmZiBpbiBidWZmZXIuc3BsaXQoIlxuIik6CisJCQkJYW5ub3RhdGVfbGluZSA9IHJlLmNvbXBpbGUoJ14oWzAtOWEtZl17NDB9KSAoLispICguKykgKC4rKSQnKQorCQkJCW0gPSBhbm5vdGF0ZV9saW5lLm1hdGNoKGJ1ZmYpCisJCQkJaWYgbm90IG06CisJCQkJCWFubm90YXRlX2xpbmUgPSByZS5jb21waWxlKCdeKGZpbGVuYW1lKSAoLispJCcpCisJCQkJCW0gPSBhbm5vdGF0ZV9saW5lLm1hdGNoKGJ1ZmYpCisJCQkJCWlmIG5vdCBtOgorCQkJCQkJY29udGludWUKKwkJCQkJZmlsZW5hbWUgPSBtLmdyb3VwKDIpCisJCQkJZWxzZToKKwkJCQkJc2VsZi5jb21taXRfc2hhMSA9IG0uZ3JvdXAoMSkKKwkJCQkJc2VsZi5zb3VyY2VfbGluZSA9IGludChtLmdyb3VwKDIpKQorCQkJCQlzZWxmLnJlc3VsdF9saW5lID0gaW50KG0uZ3JvdXAoMykpCisJCQkJCXNlbGYuY291bnQJICAgID0gaW50KG0uZ3JvdXAoNCkpCisJCQkJCSNzZXQgdGhlIGRldGFpbHMgb25seSB3aGVuIHdlIGhhdmUgdGhlIGZpbGUgbmFtZQorCQkJCQljb250aW51ZQorCisJCQkJd2hpbGUgKHNlbGYuY291bnQgPiAwKToKKwkJCQkJIyBzZXQgYXQgcmVzdWx0X2xpbmUgKyBjb3VudC0xIHRoZSBzaGExIGFzIGNvbW1pdF9zaGExCisJCQkJCXNlbGYuY291bnQgPSBzZWxmLmNvdW50IC0gMQorCQkJCQlpdGVyID0gc2VsZi5tb2RlbC5pdGVyX250aF9jaGlsZChOb25lLCBzZWxmLnJlc3VsdF9saW5lICsgc2VsZi5jb3VudC0xKQorCQkJCQlzZWxmLm1vZGVsLnNldChpdGVyLCAwLCBzZWxmLmNvbW1pdF9zaGExLCAxLCBmaWxlbmFtZSwgMywgc2VsZi5zb3VyY2VfbGluZSkKKworCisJZGVmIGFubm90YXRlKHNlbGYsIGZpbGVuYW1lLCBjb21taXRfc2hhMSwgbGluZV9udW0pOgorCQkjIHZlcmlmeSB0aGUgY29tbWl0X3NoYTEgc3BlY2lmaWVkIGhhcyB0aGlzIGZpbGVuYW1lCisKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGxzLXRyZWUgIisgY29tbWl0X3NoYTEgKyAiIC0tICIgKyBmaWxlbmFtZSkKKwkJbGluZSA9IHN0cmluZy5zdHJpcChmcC5yZWFkbGluZSgpKQorCQlpZiBsaW5lID09ICcnOgorCQkJIyBwb3AgdXAgdGhlIG1lc3NhZ2UgdGhlIGZpbGUgaXMgbm90IHRoZXJlIGFzIGEgcGFydCBvZiB0aGUgY29tbWl0CisJCQlmcC5jbG9zZSgpCisJCQlkaWFsb2cgPSBndGsuTWVzc2FnZURpYWxvZyhwYXJlbnQ9Tm9uZSwgZmxhZ3M9MCwKKwkJCQkJdHlwZT1ndGsuTUVTU0FHRV9XQVJOSU5HLCBidXR0b25zPWd0ay5CVVRUT05TX0NMT1NFLAorCQkJCQltZXNzYWdlX2Zvcm1hdD1Ob25lKQorCQkJZGlhbG9nLnNldF9tYXJrdXAoIlRoZSBmaWxlICVzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBwYXJlbnQgY29tbWl0ICVzIiAlIChmaWxlbmFtZSwgY29tbWl0X3NoYTEpKQorCQkJZGlhbG9nLnJ1bigpCisJCQlkaWFsb2cuZGVzdHJveSgpCisJCQlyZXR1cm4KKworCQlmcC5jbG9zZSgpCisKKwkJdnBhbiA9IGd0ay5WUGFuZWQoKTsKKwkJc2VsZi53aW5kb3cuYWRkKHZwYW4pOworCQl2cGFuLnNob3coKQorCisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2cGFuLnBhY2sxKHNjcm9sbHdpbiwgVHJ1ZSwgVHJ1ZSk7CisJCXNjcm9sbHdpbi5zaG93KCkKKworCQlzZWxmLm1vZGVsID0gZ3RrLlRyZWVTdG9yZShzdHIsIHN0ciwgc3RyLCBpbnQpCisJCXNlbGYudHJlZXZpZXcgPSBndGsuVHJlZVZpZXcoc2VsZi5tb2RlbCkKKwkJc2VsZi50cmVldmlldy5zZXRfcnVsZXNfaGludChUcnVlKQorCQlzZWxmLnRyZWV2aWV3LnNldF9zZWFyY2hfY29sdW1uKDApCisJCXNlbGYudHJlZXZpZXcuY29ubmVjdCgiY3Vyc29yLWNoYW5nZWQiLCBzZWxmLl90cmVldmlld19jdXJzb3JfY2IpCisJCXNlbGYudHJlZXZpZXcuY29ubmVjdCgicm93LWFjdGl2YXRlZCIsIHNlbGYuX3RyZWV2aWV3X3Jvd19hY3RpdmF0ZWQpCisJCXNjcm9sbHdpbi5hZGQoc2VsZi50cmVldmlldykKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCAxMCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiQ29tbWl0IikKKwkJY29sdW1uLnNldF9yZXNpemFibGUoVHJ1ZSkKKwkJY29sdW1uLnBhY2tfc3RhcnQoY2VsbCwgZXhwYW5kPVRydWUpCisJCWNvbHVtbi5hZGRfYXR0cmlidXRlKGNlbGwsICJ0ZXh0IiwgMCkKKwkJc2VsZi50cmVldmlldy5hcHBlbmRfY29sdW1uKGNvbHVtbikKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCAyMCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiRmlsZSBOYW1lIikKKwkJY29sdW1uLnNldF9yZXNpemFibGUoVHJ1ZSkKKwkJY29sdW1uLnBhY2tfc3RhcnQoY2VsbCwgZXhwYW5kPVRydWUpCisJCWNvbHVtbi5hZGRfYXR0cmlidXRlKGNlbGwsICJ0ZXh0IiwgMSkKKwkJc2VsZi50cmVldmlldy5hcHBlbmRfY29sdW1uKGNvbHVtbikKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCAyMCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiRGF0YSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDIpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJIyBUaGUgY29tbWl0IG1lc3NhZ2Ugd2luZG93CisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2cGFuLnBhY2syKHNjcm9sbHdpbiwgVHJ1ZSwgVHJ1ZSk7CisJCXNjcm9sbHdpbi5zaG93KCkKKworCQljb21taXRfdGV4dCA9IGd0ay5UZXh0VmlldygpCisJCXNlbGYuY29tbWl0X2J1ZmZlciA9IGd0ay5UZXh0QnVmZmVyKCkKKwkJY29tbWl0X3RleHQuc2V0X2J1ZmZlcihzZWxmLmNvbW1pdF9idWZmZXIpCisJCXNjcm9sbHdpbi5hZGQoY29tbWl0X3RleHQpCisJCWNvbW1pdF90ZXh0LnNob3coKQorCisJCXNlbGYud2luZG93LnNob3coKQorCisJCXNlbGYuYWRkX2ZpbGVfZGF0YShmaWxlbmFtZSwgY29tbWl0X3NoYTEsIGxpbmVfbnVtKQorCisJCWZwID0gb3MucG9wZW4oImdpdCBibGFtZSAtLWluY3JlbWVudGFsIC0tICIgKyBmaWxlbmFtZSArICIgIiArIGNvbW1pdF9zaGExKQorCQlmbGFncyA9IGZjbnRsLmZjbnRsKGZwLmZpbGVubygpLCBmY250bC5GX0dFVEZMKQorCQlmY250bC5mY250bChmcC5maWxlbm8oKSwgZmNudGwuRl9TRVRGTCwgZmxhZ3MgfCBvcy5PX05PTkJMT0NLKQorCQlzZWxmLmlvX3dhdGNoX3RhZyA9IGdvYmplY3QuaW9fYWRkX3dhdGNoKGZwLCBnb2JqZWN0LklPX0lOLCBzZWxmLmRhdGFfcmVhZHkpCisKKworY2xhc3MgRGlmZldpbmRvdzoKKwkiIiJEaWZmIHdpbmRvdy4KKwlUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuZCBtYW5hZ2VzIGEgc2luZ2xlIHdpbmRvdyBjb250YWluaW5nIHRoZQorCWRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHJldmlzaW9ucyBvbiBhIGJyYW5jaC4KKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi53aW5kb3cgPSBndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIGRpZmYgd2luZG93IikKKworCQkjIFVzZSB0d28gdGhpcmRzIG9mIHRoZSBzY3JlZW4gYnkgZGVmYXVsdAorCQlzY3JlZW4gPSBzZWxmLndpbmRvdy5nZXRfc2NyZWVuKCkKKwkJbW9uaXRvciA9IHNjcmVlbi5nZXRfbW9uaXRvcl9nZW9tZXRyeSgwKQorCQl3aWR0aCA9IGludChtb25pdG9yLndpZHRoICogMC42NikKKwkJaGVpZ2h0ID0gaW50KG1vbml0b3IuaGVpZ2h0ICogMC42NikKKwkJc2VsZi53aW5kb3cuc2V0X2RlZmF1bHRfc2l6ZSh3aWR0aCwgaGVpZ2h0KQorCisKKwkJc2VsZi5jb25zdHJ1Y3QoKQorCisJZGVmIGNvbnN0cnVjdChzZWxmKToKKwkJIiIiQ29uc3RydWN0IHRoZSB3aW5kb3cgY29udGVudHMuIiIiCisJCXZib3ggPSBndGsuVkJveCgpCisJCXNlbGYud2luZG93LmFkZCh2Ym94KQorCQl2Ym94LnNob3coKQorCisJCW1lbnVfYmFyID0gZ3RrLk1lbnVCYXIoKQorCQlzYXZlX21lbnUgPSBndGsuSW1hZ2VNZW51SXRlbShndGsuU1RPQ0tfU0FWRSkKKwkJc2F2ZV9tZW51LmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5zYXZlX21lbnVfcmVzcG9uc2UsICJzYXZlIikKKwkJc2F2ZV9tZW51LnNob3coKQorCQltZW51X2Jhci5hcHBlbmQoc2F2ZV9tZW51KQorCQl2Ym94LnBhY2tfc3RhcnQobWVudV9iYXIsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQltZW51X2Jhci5zaG93KCkKKworCQlocGFuID0gZ3RrLkhQYW5lZCgpCisKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCWhwYW4ucGFjazEoc2Nyb2xsd2luLCBUcnVlLCBUcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJaWYgaGF2ZV9ndGtzb3VyY2V2aWV3OgorCQkJc2VsZi5idWZmZXIgPSBndGtzb3VyY2V2aWV3LlNvdXJjZUJ1ZmZlcigpCisJCQlzbG0gPSBndGtzb3VyY2V2aWV3LlNvdXJjZUxhbmd1YWdlc01hbmFnZXIoKQorCQkJZ3NsID0gc2xtLmdldF9sYW5ndWFnZV9mcm9tX21pbWVfdHlwZSgidGV4dC94LXBhdGNoIikKKwkJCXNlbGYuYnVmZmVyLnNldF9oaWdobGlnaHQoVHJ1ZSkKKwkJCXNlbGYuYnVmZmVyLnNldF9sYW5ndWFnZShnc2wpCisJCQlzb3VyY2V2aWV3ID0gZ3Rrc291cmNldmlldy5Tb3VyY2VWaWV3KHNlbGYuYnVmZmVyKQorCQllbHNlOgorCQkJc2VsZi5idWZmZXIgPSBndGsuVGV4dEJ1ZmZlcigpCisJCQlzb3VyY2V2aWV3ID0gZ3RrLlRleHRWaWV3KHNlbGYuYnVmZmVyKQorCisKKwkJc291cmNldmlldy5zZXRfZWRpdGFibGUoRmFsc2UpCisJCXNvdXJjZXZpZXcubW9kaWZ5X2ZvbnQocGFuZ28uRm9udERlc2NyaXB0aW9uKCJNb25vc3BhY2UiKSkKKwkJc2Nyb2xsd2luLmFkZChzb3VyY2V2aWV3KQorCQlzb3VyY2V2aWV3LnNob3coKQorCisJCSMgVGhlIGZpbGUgaGllcmFyY2h5OiBhIHNjcm9sbGFibGUgdHJlZXZpZXcKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCXNjcm9sbHdpbi5zZXRfc2l6ZV9yZXF1ZXN0KDIwLCAtMSkKKwkJaHBhbi5wYWNrMihzY3JvbGx3aW4sIFRydWUsIFRydWUpCisJCXNjcm9sbHdpbi5zaG93KCkKKworCQlzZWxmLm1vZGVsID0gZ3RrLlRyZWVTdG9yZShzdHIsIHN0ciwgc3RyKQorCQlzZWxmLnRyZWV2aWV3ID0gZ3RrLlRyZWVWaWV3KHNlbGYubW9kZWwpCisJCXNlbGYudHJlZXZpZXcuc2V0X3NlYXJjaF9jb2x1bW4oMSkKKwkJc2VsZi50cmVldmlldy5jb25uZWN0KCJjdXJzb3ItY2hhbmdlZCIsIHNlbGYuX3RyZWV2aWV3X2NsaWNrZWQpCisJCXNjcm9sbHdpbi5hZGQoc2VsZi50cmVldmlldykKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCAyMCkKKwkJY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCJTZWxlY3QgdG8gYW5ub3RhdGUiKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCAwKQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCXZib3gucGFja19zdGFydChocGFuLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlocGFuLnNob3coKQorCisJZGVmIF90cmVldmlld19jbGlja2VkKHNlbGYsICphcmdzKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHRyZWV2aWV3IGN1cnNvciBjaGFuZ2VzLiIiIgorCQkocGF0aCwgY29sKSA9IHNlbGYudHJlZXZpZXcuZ2V0X2N1cnNvcigpCisJCXNwZWNpZmljX2ZpbGUgPSBzZWxmLm1vZGVsW3BhdGhdWzFdCisJCWNvbW1pdF9zaGExID0gIHNlbGYubW9kZWxbcGF0aF1bMl0KKwkJaWYgc3BlY2lmaWNfZmlsZSA9PSAgTm9uZSA6CisJCQlyZXR1cm4KKwkJZWxpZiBzcGVjaWZpY19maWxlID09ICAiIiA6CisJCQlzcGVjaWZpY19maWxlID0gIE5vbmUKKworCQl3aW5kb3cgPSBBbm5vdGF0ZVdpbmRvdygpOworCQl3aW5kb3cuYW5ub3RhdGUoc3BlY2lmaWNfZmlsZSwgY29tbWl0X3NoYTEsIDEpCisKKworCWRlZiBjb21taXRfZmlsZXMoc2VsZiwgY29tbWl0X3NoYTEsIHBhcmVudF9zaGExKToKKwkJc2VsZi5tb2RlbC5jbGVhcigpCisJCWFkZCAgPSBzZWxmLm1vZGVsLmFwcGVuZChOb25lLCBbICJBZGRlZCIsIE5vbmUsIE5vbmVdKQorCQlkZWxlID0gc2VsZi5tb2RlbC5hcHBlbmQoTm9uZSwgWyAiRGVsZXRlZCIsIE5vbmUsIE5vbmVdKQorCQltb2QgID0gc2VsZi5tb2RlbC5hcHBlbmQoTm9uZSwgWyAiTW9kaWZpZWQiLCBOb25lLCBOb25lXSkKKwkJZGlmZl90cmVlID0gcmUuY29tcGlsZSgnXig6Lns2fSkgKC57Nn0pICguezQwfSkgKC57NDB9KSAoQXxEfE0pXHMoLispJCcpCisJCWZwID0gb3MucG9wZW4oImdpdCBkaWZmLXRyZWUgLXIgLS1uby1jb21taXQtaWQgIiArIHBhcmVudF9zaGExICsgIiAiICsgY29tbWl0X3NoYTEpCisJCXdoaWxlIDE6CisJCQlsaW5lID0gc3RyaW5nLnN0cmlwKGZwLnJlYWRsaW5lKCkpCisJCQlpZiBsaW5lID09ICcnOgorCQkJCWJyZWFrCisJCQltID0gZGlmZl90cmVlLm1hdGNoKGxpbmUpCisJCQlpZiBub3QgbToKKwkJCQljb250aW51ZQorCisJCQlhdHRyID0gbS5ncm91cCg1KQorCQkJZmlsZW5hbWUgPSBtLmdyb3VwKDYpCisJCQlpZiBhdHRyID09ICJBIjoKKwkJCQlzZWxmLm1vZGVsLmFwcGVuZChhZGQsICBbZmlsZW5hbWUsIGZpbGVuYW1lLCBjb21taXRfc2hhMV0pCisJCQllbGlmIGF0dHIgPT0gIkQiOgorCQkJCXNlbGYubW9kZWwuYXBwZW5kKGRlbGUsIFtmaWxlbmFtZSwgZmlsZW5hbWUsIGNvbW1pdF9zaGExXSkKKwkJCWVsaWYgYXR0ciA9PSAiTSI6CisJCQkJc2VsZi5tb2RlbC5hcHBlbmQobW9kLCAgW2ZpbGVuYW1lLCBmaWxlbmFtZSwgY29tbWl0X3NoYTFdKQorCQlmcC5jbG9zZSgpCisKKwkJc2VsZi50cmVldmlldy5leHBhbmRfYWxsKCkKKworCWRlZiBzZXRfZGlmZihzZWxmLCBjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKToKKwkJIiIiU2V0IHRoZSBkaWZmZXJlbmNlcyBzaG93ZWQgYnkgdGhpcyB3aW5kb3cuCisJCUNvbXBhcmVzIHRoZSB0d28gdHJlZXMgYW5kIHBvcHVsYXRlcyB0aGUgd2luZG93IHdpdGggdGhlCisJCWRpZmZlcmVuY2VzLgorCQkiIiIKKwkJIyBEaWZmIHdpdGggdGhlIGZpcnN0IGNvbW1pdCBvciB0aGUgbGFzdCBjb21taXQgc2hvd3Mgbm90aGluZworCQlpZiAoY29tbWl0X3NoYTEgPT0gMCBvciBwYXJlbnRfc2hhMSA9PSAwICk6CisJCQlyZXR1cm4KKworCQlmcCA9IG9zLnBvcGVuKCJnaXQgZGlmZi10cmVlIC1wICIgKyBwYXJlbnRfc2hhMSArICIgIiArIGNvbW1pdF9zaGExKQorCQlzZWxmLmJ1ZmZlci5zZXRfdGV4dCh1bmljb2RlKGZwLnJlYWQoKSwgZW5jb2RpbmcpLmVuY29kZSgndXRmLTgnKSkKKwkJZnAuY2xvc2UoKQorCQlzZWxmLmNvbW1pdF9maWxlcyhjb21taXRfc2hhMSwgcGFyZW50X3NoYTEpCisJCXNlbGYud2luZG93LnNob3coKQorCisJZGVmIHNhdmVfbWVudV9yZXNwb25zZShzZWxmLCB3aWRnZXQsIHN0cmluZyk6CisJCWRpYWxvZyA9IGd0ay5GaWxlQ2hvb3NlckRpYWxvZygiU2F2ZS4uIiwgTm9uZSwgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fU0FWRSwKKwkJCQkoZ3RrLlNUT0NLX0NBTkNFTCwgZ3RrLlJFU1BPTlNFX0NBTkNFTCwKKwkJCQkJZ3RrLlNUT0NLX1NBVkUsIGd0ay5SRVNQT05TRV9PSykpCisJCWRpYWxvZy5zZXRfZGVmYXVsdF9yZXNwb25zZShndGsuUkVTUE9OU0VfT0spCisJCXJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisJCWlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9PSzoKKwkJCXBhdGNoX2J1ZmZlciA9IHNlbGYuYnVmZmVyLmdldF90ZXh0KHNlbGYuYnVmZmVyLmdldF9zdGFydF9pdGVyKCksCisJCQkJCXNlbGYuYnVmZmVyLmdldF9lbmRfaXRlcigpKQorCQkJZnAgPSBvcGVuKGRpYWxvZy5nZXRfZmlsZW5hbWUoKSwgInciKQorCQkJZnAud3JpdGUocGF0Y2hfYnVmZmVyKQorCQkJZnAuY2xvc2UoKQorCQlkaWFsb2cuZGVzdHJveSgpCisKK2NsYXNzIEdpdFZpZXc6CisJIiIiIFRoaXMgaXMgdGhlIG1haW4gY2xhc3MKKwkiIiIKKwl2ZXJzaW9uID0gIjAuOSIKKworCWRlZiBfX2luaXRfXyhzZWxmLCB3aXRoX2RpZmY9MCk6CisJCXNlbGYud2l0aF9kaWZmID0gd2l0aF9kaWZmCisJCXNlbGYud2luZG93ID0JZ3RrLldpbmRvdyhndGsuV0lORE9XX1RPUExFVkVMKQorCQlzZWxmLndpbmRvdy5zZXRfYm9yZGVyX3dpZHRoKDApCisJCXNlbGYud2luZG93LnNldF90aXRsZSgiR2l0IHJlcG9zaXRvcnkgYnJvd3NlciIpCisKKwkJc2VsZi5nZXRfZW5jb2RpbmcoKQorCQlzZWxmLmdldF9idF9zaGExKCkKKworCQkjIFVzZSB0aHJlZS1xdWFydGVycyBvZiB0aGUgc2NyZWVuIGJ5IGRlZmF1bHQKKwkJc2NyZWVuID0gc2VsZi53aW5kb3cuZ2V0X3NjcmVlbigpCisJCW1vbml0b3IgPSBzY3JlZW4uZ2V0X21vbml0b3JfZ2VvbWV0cnkoMCkKKwkJd2lkdGggPSBpbnQobW9uaXRvci53aWR0aCAqIDAuNzUpCisJCWhlaWdodCA9IGludChtb25pdG9yLmhlaWdodCAqIDAuNzUpCisJCXNlbGYud2luZG93LnNldF9kZWZhdWx0X3NpemUod2lkdGgsIGhlaWdodCkKKworCQkjIEZJWE1FIEFuZHlGaXR6IQorCQlpY29uID0gc2VsZi53aW5kb3cucmVuZGVyX2ljb24oZ3RrLlNUT0NLX0lOREVYLCBndGsuSUNPTl9TSVpFX0JVVFRPTikKKwkJc2VsZi53aW5kb3cuc2V0X2ljb24oaWNvbikKKworCQlzZWxmLmFjY2VsX2dyb3VwID0gZ3RrLkFjY2VsR3JvdXAoKQorCQlzZWxmLndpbmRvdy5hZGRfYWNjZWxfZ3JvdXAoc2VsZi5hY2NlbF9ncm91cCkKKwkJc2VsZi5hY2NlbF9ncm91cC5jb25uZWN0X2dyb3VwKDB4ZmZjMiwgMCwgZ3RrLkFDQ0VMX0xPQ0tFRCwgc2VsZi5yZWZyZXNoKTsKKwkJc2VsZi5hY2NlbF9ncm91cC5jb25uZWN0X2dyb3VwKDB4ZmZjMSwgMCwgZ3RrLkFDQ0VMX0xPQ0tFRCwgc2VsZi5tYXhpbWl6ZSk7CisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzgsIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYuZnVsbHNjcmVlbik7CisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzksIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYudW5mdWxsc2NyZWVuKTsKKworCQlzZWxmLndpbmRvdy5hZGQoc2VsZi5jb25zdHJ1Y3QoKSkKKworCWRlZiByZWZyZXNoKHNlbGYsIHdpZGdldCwgZXZlbnQ9Tm9uZSwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CisJCXNlbGYuZ2V0X2VuY29kaW5nKCkKKwkJc2VsZi5nZXRfYnRfc2hhMSgpCisJCUNvbW1pdC5jaGlsZHJlbl9zaGExID0ge30KKwkJc2VsZi5zZXRfYnJhbmNoKHN5cy5hcmd2W3dpdGhvdXRfZGlmZjpdKQorCQlzZWxmLndpbmRvdy5zaG93KCkKKwkJcmV0dXJuIFRydWUKKworCWRlZiBtYXhpbWl6ZShzZWxmLCB3aWRnZXQsIGV2ZW50PU5vbmUsICphcmd1bWVudHMsICoqa2V5d29yZHMpOgorCQlzZWxmLndpbmRvdy5tYXhpbWl6ZSgpCisJCXJldHVybiBUcnVlCisKKwlkZWYgZnVsbHNjcmVlbihzZWxmLCB3aWRnZXQsIGV2ZW50PU5vbmUsICphcmd1bWVudHMsICoqa2V5d29yZHMpOgorCQlzZWxmLndpbmRvdy5mdWxsc2NyZWVuKCkKKwkJcmV0dXJuIFRydWUKKworCWRlZiB1bmZ1bGxzY3JlZW4oc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi53aW5kb3cudW5mdWxsc2NyZWVuKCkKKwkJcmV0dXJuIFRydWUKKworCWRlZiBnZXRfYnRfc2hhMShzZWxmKToKKwkJIiIiIFVwZGF0ZSB0aGUgYnRfc2hhMSBkaWN0aW9uYXJ5IHdpdGggdGhlCisJCXJlc3BlY3RpdmUgc2hhMSBkZXRhaWxzICIiIgorCisJCXNlbGYuYnRfc2hhMSA9IHsgfQorCQlsc19yZW1vdGUgPSByZS5jb21waWxlKCdeKC57NDB9KVx0cmVmcy8oW15eXSspKD86XFxeKC4uKSk/JCcpOworCQlmcCA9IG9zLnBvcGVuKCdnaXQgbHMtcmVtb3RlICIke0dJVF9ESVItLmdpdH0iJykKKwkJd2hpbGUgMToKKwkJCWxpbmUgPSBzdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJCWlmIGxpbmUgPT0gJyc6CisJCQkJYnJlYWsKKwkJCW0gPSBsc19yZW1vdGUubWF0Y2gobGluZSkKKwkJCWlmIG5vdCBtOgorCQkJCWNvbnRpbnVlCisJCQkoc2hhMSwgbmFtZSkgPSAobS5ncm91cCgxKSwgbS5ncm91cCgyKSkKKwkJCWlmIG5vdCBzZWxmLmJ0X3NoYTEuaGFzX2tleShzaGExKToKKwkJCQlzZWxmLmJ0X3NoYTFbc2hhMV0gPSBbXQorCQkJc2VsZi5idF9zaGExW3NoYTFdLmFwcGVuZChuYW1lKQorCQlmcC5jbG9zZSgpCisKKwlkZWYgZ2V0X2VuY29kaW5nKHNlbGYpOgorCQlmcCA9IG9zLnBvcGVuKCJnaXQgY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmciKQorCQlzZWxmLmVuY29kaW5nPXN0cmluZy5zdHJpcChmcC5yZWFkbGluZSgpKQorCQlmcC5jbG9zZSgpCisJCWlmIChzZWxmLmVuY29kaW5nID09ICIiKToKKwkJCXNlbGYuZW5jb2RpbmcgPSAidXRmLTgiCisKKworCWRlZiBjb25zdHJ1Y3Qoc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgd2luZG93IGNvbnRlbnRzLiIiIgorCQl2Ym94ID0gZ3RrLlZCb3goKQorCQlwYW5lZCA9IGd0ay5WUGFuZWQoKQorCQlwYW5lZC5wYWNrMShzZWxmLmNvbnN0cnVjdF90b3AoKSwgcmVzaXplPUZhbHNlLCBzaHJpbms9VHJ1ZSkKKwkJcGFuZWQucGFjazIoc2VsZi5jb25zdHJ1Y3RfYm90dG9tKCksIHJlc2l6ZT1GYWxzZSwgc2hyaW5rPVRydWUpCisJCW1lbnVfYmFyID0gZ3RrLk1lbnVCYXIoKQorCQltZW51X2Jhci5zZXRfcGFja19kaXJlY3Rpb24oZ3RrLlBBQ0tfRElSRUNUSU9OX1JUTCkKKwkJaGVscF9tZW51ID0gZ3RrLk1lbnVJdGVtKCJIZWxwIikKKwkJbWVudSA9IGd0ay5NZW51KCkKKwkJYWJvdXRfbWVudSA9IGd0ay5NZW51SXRlbSgiQWJvdXQiKQorCQltZW51LmFwcGVuZChhYm91dF9tZW51KQorCQlhYm91dF9tZW51LmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5hYm91dF9tZW51X3Jlc3BvbnNlLCAiYWJvdXQiKQorCQlhYm91dF9tZW51LnNob3coKQorCQloZWxwX21lbnUuc2V0X3N1Ym1lbnUobWVudSkKKwkJaGVscF9tZW51LnNob3coKQorCQltZW51X2Jhci5hcHBlbmQoaGVscF9tZW51KQorCQltZW51X2Jhci5zaG93KCkKKwkJdmJveC5wYWNrX3N0YXJ0KG1lbnVfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJdmJveC5wYWNrX3N0YXJ0KHBhbmVkLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlwYW5lZC5zaG93KCkKKwkJdmJveC5zaG93KCkKKwkJcmV0dXJuIHZib3gKKworCisJZGVmIGNvbnN0cnVjdF90b3Aoc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgdG9wLWhhbGYgb2YgdGhlIHdpbmRvdy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KHNwYWNpbmc9NikKKwkJdmJveC5zZXRfYm9yZGVyX3dpZHRoKDEyKQorCQl2Ym94LnNob3coKQorCisKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCXZib3gucGFja19zdGFydChzY3JvbGx3aW4sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisJCXNjcm9sbHdpbi5zaG93KCkKKworCQlzZWxmLnRyZWV2aWV3ID0gZ3RrLlRyZWVWaWV3KCkKKwkJc2VsZi50cmVldmlldy5zZXRfcnVsZXNfaGludChUcnVlKQorCQlzZWxmLnRyZWV2aWV3LnNldF9zZWFyY2hfY29sdW1uKDQpCisJCXNlbGYudHJlZXZpZXcuY29ubmVjdCgiY3Vyc29yLWNoYW5nZWQiLCBzZWxmLl90cmVldmlld19jdXJzb3JfY2IpCisJCXNjcm9sbHdpbi5hZGQoc2VsZi50cmVldmlldykKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCQljZWxsID0gQ2VsbFJlbmRlcmVyR3JhcGgoKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgIm5vZGUiLCAxKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAiaW4tbGluZXMiLCAyKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAib3V0LWxpbmVzIiwgMykKKwkJc2VsZi50cmVldmlldy5hcHBlbmRfY29sdW1uKGNvbHVtbikKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCA2NSkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiTWVzc2FnZSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDQpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgNDApCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkF1dGhvciIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDUpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiRGF0ZSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDYpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJcmV0dXJuIHZib3gKKworCWRlZiBhYm91dF9tZW51X3Jlc3BvbnNlKHNlbGYsIHdpZGdldCwgc3RyaW5nKToKKwkJZGlhbG9nID0gZ3RrLkFib3V0RGlhbG9nKCkKKwkJZGlhbG9nLnNldF9uYW1lKCJHaXR2aWV3IikKKwkJZGlhbG9nLnNldF92ZXJzaW9uKEdpdFZpZXcudmVyc2lvbikKKwkJZGlhbG9nLnNldF9hdXRob3JzKFsiQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbT4iXSkKKwkJZGlhbG9nLnNldF93ZWJzaXRlKCJodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvIikKKwkJZGlhbG9nLnNldF9jb3B5cmlnaHQoIlVzZSBhbmQgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIikKKwkJZGlhbG9nLnNldF93cmFwX2xpY2Vuc2UoVHJ1ZSkKKwkJZGlhbG9nLnJ1bigpCisJCWRpYWxvZy5kZXN0cm95KCkKKworCisJZGVmIGNvbnN0cnVjdF9ib3R0b20oc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHdpbmRvdy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KEZhbHNlLCBzcGFjaW5nPTYpCisJCXZib3guc2V0X2JvcmRlcl93aWR0aCgxMikKKwkJKHdpZHRoLCBoZWlnaHQpID0gc2VsZi53aW5kb3cuZ2V0X3NpemUoKQorCQl2Ym94LnNldF9zaXplX3JlcXVlc3Qod2lkdGgsIGludChoZWlnaHQgLyAyLjUpKQorCQl2Ym94LnNob3coKQorCisJCXNlbGYudGFibGUgPSBndGsuVGFibGUocm93cz00LCBjb2x1bW5zPTQpCisJCXNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5ncyg2KQorCQlzZWxmLnRhYmxlLnNldF9jb2xfc3BhY2luZ3MoNikKKwkJdmJveC5wYWNrX3N0YXJ0KHNlbGYudGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQlzZWxmLnRhYmxlLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5SZXZpc2lvbjo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMCwgMSwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlzZWxmLnJldmlkX2xhYmVsID0gZ3RrLkxhYmVsKCkKKwkJc2VsZi5yZXZpZF9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi5yZXZpZF9sYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIDAsIDEsIGd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCXNlbGYucmV2aWRfbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5Db21taXR0ZXI6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDEsIDIsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwgPSBndGsuTGFiZWwoKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi5jb21taXR0ZXJfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAxLCAyLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPlRpbWVzdGFtcDo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMiwgMywgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbCA9IGd0ay5MYWJlbCgpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNldF9zZWxlY3RhYmxlKFRydWUpCisJCWFsaWduLmFkZChzZWxmLnRpbWVzdGFtcF9sYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIDIsIDMsIGd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+UGFyZW50czo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMywgNCwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisJCXNlbGYucGFyZW50c193aWRnZXRzID0gW10KKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+Q2hpbGRyZW46PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDIsIDMsIDMsIDQsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMgPSBbXQorCisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2Ym94LnBhY2tfc3RhcnQoc2Nyb2xsd2luLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJaWYgaGF2ZV9ndGtzb3VyY2V2aWV3OgorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlciA9IGd0a3NvdXJjZXZpZXcuU291cmNlQnVmZmVyKCkKKwkJCXNsbSA9IGd0a3NvdXJjZXZpZXcuU291cmNlTGFuZ3VhZ2VzTWFuYWdlcigpCisJCQlnc2wgPSBzbG0uZ2V0X2xhbmd1YWdlX2Zyb21fbWltZV90eXBlKCJ0ZXh0L3gtcGF0Y2giKQorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlci5zZXRfaGlnaGxpZ2h0KFRydWUpCisJCQlzZWxmLm1lc3NhZ2VfYnVmZmVyLnNldF9sYW5ndWFnZShnc2wpCisJCQlzb3VyY2V2aWV3ID0gZ3Rrc291cmNldmlldy5Tb3VyY2VWaWV3KHNlbGYubWVzc2FnZV9idWZmZXIpCisJCWVsc2U6CisJCQlzZWxmLm1lc3NhZ2VfYnVmZmVyID0gZ3RrLlRleHRCdWZmZXIoKQorCQkJc291cmNldmlldyA9IGd0ay5UZXh0VmlldyhzZWxmLm1lc3NhZ2VfYnVmZmVyKQorCisJCXNvdXJjZXZpZXcuc2V0X2VkaXRhYmxlKEZhbHNlKQorCQlzb3VyY2V2aWV3Lm1vZGlmeV9mb250KHBhbmdvLkZvbnREZXNjcmlwdGlvbigiTW9ub3NwYWNlIikpCisJCXNjcm9sbHdpbi5hZGQoc291cmNldmlldykKKwkJc291cmNldmlldy5zaG93KCkKKworCQlyZXR1cm4gdmJveAorCisJZGVmIF90cmVldmlld19jdXJzb3JfY2Ioc2VsZiwgKmFyZ3MpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiB0aGUgdHJlZXZpZXcgY3Vyc29yIGNoYW5nZXMuIiIiCisJCShwYXRoLCBjb2wpID0gc2VsZi50cmVldmlldy5nZXRfY3Vyc29yKCkKKwkJY29tbWl0ID0gc2VsZi5tb2RlbFtwYXRoXVswXQorCisJCWlmIGNvbW1pdC5jb21taXR0ZXIgaXMgbm90IE5vbmU6CisJCQljb21taXR0ZXIgPSBjb21taXQuY29tbWl0dGVyCisJCQl0aW1lc3RhbXAgPSBjb21taXQuY29tbWl0X2RhdGUKKwkJCW1lc3NhZ2UgICA9ICBjb21taXQuZ2V0X21lc3NhZ2Uoc2VsZi53aXRoX2RpZmYpCisJCQlyZXZpZF9sYWJlbCA9IGNvbW1pdC5jb21taXRfc2hhMQorCQllbHNlOgorCQkJY29tbWl0dGVyID0gIiIKKwkJCXRpbWVzdGFtcCA9ICIiCisJCQltZXNzYWdlID0gIiIKKwkJCXJldmlkX2xhYmVsID0gIiIKKworCQlzZWxmLnJldmlkX2xhYmVsLnNldF90ZXh0KHJldmlkX2xhYmVsKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zZXRfdGV4dChjb21taXR0ZXIpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNldF90ZXh0KHRpbWVzdGFtcCkKKwkJc2VsZi5tZXNzYWdlX2J1ZmZlci5zZXRfdGV4dCh1bmljb2RlKG1lc3NhZ2UsIHNlbGYuZW5jb2RpbmcpLmVuY29kZSgndXRmLTgnKSkKKworCQlmb3Igd2lkZ2V0IGluIHNlbGYucGFyZW50c193aWRnZXRzOgorCQkJc2VsZi50YWJsZS5yZW1vdmUod2lkZ2V0KQorCisJCXNlbGYucGFyZW50c193aWRnZXRzID0gW10KKwkJc2VsZi50YWJsZS5yZXNpemUoNCArIGxlbihjb21taXQucGFyZW50X3NoYTEpIC0gMSwgNCkKKwkJZm9yIGlkeCwgcGFyZW50X2lkIGluIGVudW1lcmF0ZShjb21taXQucGFyZW50X3NoYTEpOgorCQkJc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmcoaWR4ICsgMywgMCkKKworCQkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC4wKQorCQkJc2VsZi5wYXJlbnRzX3dpZGdldHMuYXBwZW5kKGFsaWduKQorCQkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIGlkeCArIDMsIGlkeCArIDQsCisJCQkJCWd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCQlhbGlnbi5zaG93KCkKKworCQkJaGJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorCQkJYWxpZ24uYWRkKGhib3gpCisJCQloYm94LnNob3coKQorCisJCQlsYWJlbCA9IGd0ay5MYWJlbChwYXJlbnRfaWQpCisJCQlsYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQkJaGJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWxhYmVsLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfSlVNUF9UTywgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fZ29fY2xpY2tlZF9jYiwgcGFyZW50X2lkKQorCQkJaGJveC5wYWNrX3N0YXJ0KGJ1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCQlidXR0b24uc2hvdygpCisKKwkJCWltYWdlID0gZ3RrLkltYWdlKCkKKwkJCWltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19GSU5ELCBndGsuSUNPTl9TSVpFX01FTlUpCisJCQlpbWFnZS5zaG93KCkKKworCQkJYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisJCQlidXR0b24uYWRkKGltYWdlKQorCQkJYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9OT05FKQorCQkJYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fc2hvd19jbGlja2VkX2NiLAorCQkJCQljb21taXQuY29tbWl0X3NoYTEsIHBhcmVudF9pZCwgc2VsZi5lbmNvZGluZykKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCSMgUG9wdWxhdGUgd2l0aCBjaGlsZCBkZXRhaWxzCisJCWZvciB3aWRnZXQgaW4gc2VsZi5jaGlsZHJlbl93aWRnZXRzOgorCQkJc2VsZi50YWJsZS5yZW1vdmUod2lkZ2V0KQorCisJCXNlbGYuY2hpbGRyZW5fd2lkZ2V0cyA9IFtdCisJCXRyeToKKwkJCWNoaWxkX3NoYTEgPSBDb21taXQuY2hpbGRyZW5fc2hhMVtjb21taXQuY29tbWl0X3NoYTFdCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCSMgV2UgZG9uJ3QgaGF2ZSBjaGlsZAorCQkJY2hpbGRfc2hhMSA9IFsgMCBdCisKKwkJaWYgKCBsZW4oY2hpbGRfc2hhMSkgPiBsZW4oY29tbWl0LnBhcmVudF9zaGExKSk6CisJCQlzZWxmLnRhYmxlLnJlc2l6ZSg0ICsgbGVuKGNoaWxkX3NoYTEpIC0gMSwgNCkKKworCQlmb3IgaWR4LCBjaGlsZF9pZCBpbiBlbnVtZXJhdGUoY2hpbGRfc2hhMSk6CisJCQlzZWxmLnRhYmxlLnNldF9yb3dfc3BhY2luZyhpZHggKyAzLCAwKQorCisJCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjApCisJCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMuYXBwZW5kKGFsaWduKQorCQkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDMsIDQsIGlkeCArIDMsIGlkeCArIDQsCisJCQkJCWd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCQlhbGlnbi5zaG93KCkKKworCQkJaGJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorCQkJYWxpZ24uYWRkKGhib3gpCisJCQloYm94LnNob3coKQorCisJCQlsYWJlbCA9IGd0ay5MYWJlbChjaGlsZF9pZCkKKwkJCWxhYmVsLnNldF9zZWxlY3RhYmxlKFRydWUpCisJCQloYm94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJbGFiZWwuc2hvdygpCisKKwkJCWltYWdlID0gZ3RrLkltYWdlKCkKKwkJCWltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19KVU1QX1RPLCBndGsuSUNPTl9TSVpFX01FTlUpCisJCQlpbWFnZS5zaG93KCkKKworCQkJYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisJCQlidXR0b24uYWRkKGltYWdlKQorCQkJYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9OT05FKQorCQkJYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLl9nb19jbGlja2VkX2NiLCBjaGlsZF9pZCkKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfRklORCwgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX3Nob3dfY2xpY2tlZF9jYiwKKwkJCQkJY2hpbGRfaWQsIGNvbW1pdC5jb21taXRfc2hhMSwgc2VsZi5lbmNvZGluZykKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJZGVmIF9kZXN0cm95X2NiKHNlbGYsIHdpZGdldCk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIGEgd2luZG93IHdlIG1hbmFnZSBpcyBkZXN0cm95ZWQuIiIiCisJCXNlbGYucXVpdCgpCisKKworCWRlZiBxdWl0KHNlbGYpOgorCQkiIiJTdG9wIHRoZSBHVEsrIG1haW4gbG9vcC4iIiIKKwkJZ3RrLm1haW5fcXVpdCgpCisKKwlkZWYgcnVuKHNlbGYsIGFyZ3MpOgorCQlzZWxmLnNldF9icmFuY2goYXJncykKKwkJc2VsZi53aW5kb3cuY29ubmVjdCgiZGVzdHJveSIsIHNlbGYuX2Rlc3Ryb3lfY2IpCisJCXNlbGYud2luZG93LnNob3coKQorCQlndGsubWFpbigpCisKKwlkZWYgc2V0X2JyYW5jaChzZWxmLCBhcmdzKToKKwkJIiIiRmlsbCBpbiBkaWZmZXJlbnQgd2luZG93cyB3aXRoIGluZm8gZnJvbSB0aGUgcmVwb3Npcm90eSIiIgorCQlmcCA9IG9zLnBvcGVuKCJnaXQgcmV2LXBhcnNlIC0tc3EgLS1kZWZhdWx0IEhFQUQgIiArIGxpc3RfdG9fc3RyaW5nKGFyZ3MsIDEpKQorCQlnaXRfcmV2X2xpc3RfY21kID0gZnAucmVhZCgpCisJCWZwLmNsb3NlKCkKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJldi1saXN0ICAtLWhlYWRlciAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzICIgKyBnaXRfcmV2X2xpc3RfY21kKQorCQlzZWxmLnVwZGF0ZV93aW5kb3coZnApCisKKwlkZWYgdXBkYXRlX3dpbmRvdyhzZWxmLCBmcCk6CisJCWNvbW1pdF9saW5lcyA9IFtdCisKKwkJc2VsZi5tb2RlbCA9IGd0ay5MaXN0U3RvcmUoZ29iamVjdC5UWVBFX1BZT0JKRUNULCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsCisJCQkJZ29iamVjdC5UWVBFX1BZT0JKRUNULCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsIHN0ciwgc3RyLCBzdHIpCisKKwkJIyB1c2VkIGZvciBjdXJzb3IgcG9zaXRpb25pbmcKKwkJc2VsZi5pbmRleCA9IHt9CisKKwkJc2VsZi5jb2xvdXJzID0ge30KKwkJc2VsZi5ub2RlcG9zID0ge30KKwkJc2VsZi5pbmNvbXBsZXRlX2xpbmUgPSB7fQorCQlzZWxmLmNvbW1pdHMgPSBbXQorCisJCWluZGV4ID0gMAorCQlsYXN0X2NvbG91ciA9IDAKKwkJbGFzdF9ub2RlcG9zID0gLTEKKwkJb3V0X2xpbmUgPSBbXQorCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCQl3aGlsZSAoaW5wdXRfbGluZSAhPSAiIik6CisJCQkjIFRoZSBjb21taXQgaGVhZGVyIGVuZHMgd2l0aCAnXDAnCisJCQkjIFRoaXMgTlVMTCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgc2hhMSBvZiB0aGUKKwkJCSMgbmV4dCBjb21taXQKKwkJCWlmIChpbnB1dF9saW5lWzBdICE9ICdcMCcpOgorCQkJCWNvbW1pdF9saW5lcy5hcHBlbmQoaW5wdXRfbGluZSkKKwkJCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCQkJCWNvbnRpbnVlOworCisJCQljb21taXQgPSBDb21taXQoY29tbWl0X2xpbmVzKQorCQkJaWYgKGNvbW1pdCAhPSBOb25lICk6CisJCQkJc2VsZi5jb21taXRzLmFwcGVuZChjb21taXQpCisKKwkJCSMgU2tpcCB0aGUgJ1wwCisJCQljb21taXRfbGluZXMgPSBbXQorCQkJY29tbWl0X2xpbmVzLmFwcGVuZChpbnB1dF9saW5lWzE6XSkKKwkJCWlucHV0X2xpbmUgPSBmcC5yZWFkbGluZSgpCisKKwkJZnAuY2xvc2UoKQorCisJCWZvciBjb21taXQgaW4gc2VsZi5jb21taXRzOgorCQkJKG91dF9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKSA9IHNlbGYuZHJhd19ncmFwaChjb21taXQsCisJCQkJCQkJCQkJaW5kZXgsIG91dF9saW5lLAorCQkJCQkJCQkJCWxhc3RfY29sb3VyLAorCQkJCQkJCQkJCWxhc3Rfbm9kZXBvcykKKwkJCXNlbGYuaW5kZXhbY29tbWl0LmNvbW1pdF9zaGExXSA9IGluZGV4CisJCQlpbmRleCArPSAxCisKKwkJc2VsZi50cmVldmlldy5zZXRfbW9kZWwoc2VsZi5tb2RlbCkKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCWRlZiBkcmF3X2dyYXBoKHNlbGYsIGNvbW1pdCwgaW5kZXgsIG91dF9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKToKKwkJaW5fbGluZT1bXQorCisJCSMgICB8ICAgLT4gb3V0bGluZQorCQkjICAgWAorCQkjICAgfFwgIDwtIGlubGluZQorCisJCSMgUmVzZXQgbm9kZXBvc3Rpb24KKwkJaWYgKGxhc3Rfbm9kZXBvcyA+IDUpOgorCQkJbGFzdF9ub2RlcG9zID0gLTEKKworCQkjIEFkZCB0aGUgaW5jb21wbGV0ZSBsaW5lcyBvZiB0aGUgbGFzdCBjZWxsIGluIHRoaXMKKwkJdHJ5OgorCQkJY29sb3VyID0gc2VsZi5jb2xvdXJzW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5jb2xvdXJzW2NvbW1pdC5jb21taXRfc2hhMV0gPSBsYXN0X2NvbG91cisxCisJCQlsYXN0X2NvbG91ciA9IHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisJCQljb2xvdXIgPSAgIHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisKKwkJdHJ5OgorCQkJbm9kZV9wb3MgPSBzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXSA9IGxhc3Rfbm9kZXBvcysxCisJCQlsYXN0X25vZGVwb3MgPSBzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXQorCQkJbm9kZV9wb3MgPSAgc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKworCQkjVGhlIGZpcnN0IHBhcmVudCBhbHdheXMgY29udGludWUgb24gdGhlIHNhbWUgbGluZQorCQl0cnk6CisJCQkjIGNoZWNrIHdlIGFscmVheSBoYXZlIHRoZSB2YWx1ZQorCQkJdG1wX25vZGVfcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5wYXJlbnRfc2hhMVswXV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5jb2xvdXJzW2NvbW1pdC5wYXJlbnRfc2hhMVswXV0gPSBjb2xvdXIKKwkJCXNlbGYubm9kZXBvc1tjb21taXQucGFyZW50X3NoYTFbMF1dID0gbm9kZV9wb3MKKworCQlmb3Igc2hhMSBpbiBzZWxmLmluY29tcGxldGVfbGluZS5rZXlzKCk6CisJCQlpZiAoc2hhMSAhPSBjb21taXQuY29tbWl0X3NoYTEpOgorCQkJCXNlbGYuZHJhd19pbmNvbXBsZXRlX2xpbmUoc2hhMSwgbm9kZV9wb3MsCisJCQkJCQlvdXRfbGluZSwgaW5fbGluZSwgaW5kZXgpCisJCQllbHNlOgorCQkJCWRlbCBzZWxmLmluY29tcGxldGVfbGluZVtzaGExXQorCisKKwkJZm9yIHBhcmVudF9pZCBpbiBjb21taXQucGFyZW50X3NoYTE6CisJCQl0cnk6CisJCQkJdG1wX25vZGVfcG9zID0gc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0KKwkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQlzZWxmLmNvbG91cnNbcGFyZW50X2lkXSA9IGxhc3RfY29sb3VyKzEKKwkJCQlsYXN0X2NvbG91ciA9IHNlbGYuY29sb3Vyc1twYXJlbnRfaWRdCisJCQkJc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0gPSBsYXN0X25vZGVwb3MrMQorCQkJCWxhc3Rfbm9kZXBvcyA9IHNlbGYubm9kZXBvc1twYXJlbnRfaWRdCisKKwkJCWluX2xpbmUuYXBwZW5kKChub2RlX3Bvcywgc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0sCisJCQkJCQlzZWxmLmNvbG91cnNbcGFyZW50X2lkXSkpCisJCQlzZWxmLmFkZF9pbmNvbXBsZXRlX2xpbmUocGFyZW50X2lkKQorCisJCXRyeToKKwkJCWJyYW5jaF90YWcgPSBzZWxmLmJ0X3NoYTFbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlicmFuY2hfdGFnID0gWyBdCisKKworCQlub2RlID0gKG5vZGVfcG9zLCBjb2xvdXIsIGJyYW5jaF90YWcpCisKKwkJc2VsZi5tb2RlbC5hcHBlbmQoW2NvbW1pdCwgbm9kZSwgb3V0X2xpbmUsIGluX2xpbmUsCisJCQkJY29tbWl0Lm1lc3NhZ2UsIGNvbW1pdC5hdXRob3IsIGNvbW1pdC5kYXRlXSkKKworCQlyZXR1cm4gKGluX2xpbmUsIGxhc3RfY29sb3VyLCBsYXN0X25vZGVwb3MpCisKKwlkZWYgYWRkX2luY29tcGxldGVfbGluZShzZWxmLCBzaGExKToKKwkJdHJ5OgorCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0uYXBwZW5kKHNlbGYubm9kZXBvc1tzaGExXSkKKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0gPSBbc2VsZi5ub2RlcG9zW3NoYTFdXQorCisJZGVmIGRyYXdfaW5jb21wbGV0ZV9saW5lKHNlbGYsIHNoYTEsIG5vZGVfcG9zLCBvdXRfbGluZSwgaW5fbGluZSwgaW5kZXgpOgorCQlmb3IgaWR4LCBwb3MgaW4gZW51bWVyYXRlKHNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdKToKKwkJCWlmKHBvcyA9PSBub2RlX3Bvcyk6CisJCQkJI3JlbW92ZSB0aGUgc3RyYWlnaHQgbGluZSBhbmQgYWRkIGEgc2xhc2gKKwkJCQlpZiAoKHBvcywgcG9zLCBzZWxmLmNvbG91cnNbc2hhMV0pIGluIG91dF9saW5lKToKKwkJCQkJb3V0X2xpbmUucmVtb3ZlKChwb3MsIHBvcywgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQlvdXRfbGluZS5hcHBlbmQoKHBvcywgcG9zKzAuNSwgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQlzZWxmLmluY29tcGxldGVfbGluZVtzaGExXVtpZHhdID0gcG9zID0gcG9zKzAuNQorCQkJdHJ5OgorCQkJCW5leHRfY29tbWl0ID0gc2VsZi5jb21taXRzW2luZGV4KzFdCisJCQkJaWYgKG5leHRfY29tbWl0LmNvbW1pdF9zaGExID09IHNoYTEgYW5kIHBvcyAhPSBpbnQocG9zKSk6CisJCQkJIyBqb2luIHRoZSBsaW5lIGJhY2sgdG8gdGhlIG5vZGUgcG9pbnQKKwkJCQkjIFRoaXMgbmVlZCB0byBiZSBkb25lIG9ubHkgaWYgd2UgbW9kaWZpZWQgaXQKKwkJCQkJaW5fbGluZS5hcHBlbmQoKHBvcywgcG9zLTAuNSwgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQkJY29udGludWU7CisJCQlleGNlcHQgSW5kZXhFcnJvcjoKKwkJCQlwYXNzCisJCQlpbl9saW5lLmFwcGVuZCgocG9zLCBwb3MsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisKKworCWRlZiBfZ29fY2xpY2tlZF9jYihzZWxmLCB3aWRnZXQsIHJldmlkKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGdvIGJ1dHRvbiBmb3IgYSBwYXJlbnQgaXMgY2xpY2tlZC4iIiIKKwkJdHJ5OgorCQkJc2VsZi50cmVldmlldy5zZXRfY3Vyc29yKHNlbGYuaW5kZXhbcmV2aWRdKQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlkaWFsb2cgPSBndGsuTWVzc2FnZURpYWxvZyhwYXJlbnQ9Tm9uZSwgZmxhZ3M9MCwKKwkJCQkJdHlwZT1ndGsuTUVTU0FHRV9XQVJOSU5HLCBidXR0b25zPWd0ay5CVVRUT05TX0NMT1NFLAorCQkJCQltZXNzYWdlX2Zvcm1hdD1Ob25lKQorCQkJZGlhbG9nLnNldF9tYXJrdXAoIlJldmlzaW9uIDxiPiVzPC9iPiBub3QgcHJlc2VudCBpbiB0aGUgbGlzdCIgJSByZXZpZCkKKwkJCSMgcmV2aWQgPT0gMCBpcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdCBjb21taXQKKwkJCWlmIChyZXZpZCAhPSAwICk6CisJCQkJZGlhbG9nLmZvcm1hdF9zZWNvbmRhcnlfdGV4dCgiVHJ5IHJ1bm5pbmcgZ2l0dmlldyB3aXRob3V0IGFueSBvcHRpb25zIikKKwkJCWRpYWxvZy5ydW4oKQorCQkJZGlhbG9nLmRlc3Ryb3koKQorCisJCXNlbGYudHJlZXZpZXcuZ3JhYl9mb2N1cygpCisKKwlkZWYgX3Nob3dfY2xpY2tlZF9jYihzZWxmLCB3aWRnZXQsICBjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHNob3cgYnV0dG9uIGZvciBhIHBhcmVudCBpcyBjbGlja2VkLiIiIgorCQl3aW5kb3cgPSBEaWZmV2luZG93KCkKKwkJd2luZG93LnNldF9kaWZmKGNvbW1pdF9zaGExLCBwYXJlbnRfc2hhMSwgZW5jb2RpbmcpCisJCXNlbGYudHJlZXZpZXcuZ3JhYl9mb2N1cygpCisKK3dpdGhvdXRfZGlmZiA9IDAKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisKKwlpZiAobGVuKHN5cy5hcmd2KSA+IDEgKToKKwkJaWYgKHN5cy5hcmd2WzFdID09ICItLXdpdGhvdXQtZGlmZiIpOgorCQkJd2l0aG91dF9kaWZmID0gMQorCisJdmlldyA9IEdpdFZpZXcoIHdpdGhvdXRfZGlmZiAhPSAxKQorCXZpZXcucnVuKHN5cy5hcmd2W3dpdGhvdXRfZGlmZjpdKQorCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dCBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2MyOWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcudHh0CkBAIC0wLDAgKzEsNTYgQEAKK2dpdHZpZXcoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0dmlldyAtIEEgR1RLIGJhc2VkIHJlcG9zaXRvcnkgYnJvd3NlciBmb3IgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdHZpZXcnIFtvcHRpb25zXSBbYXJnc10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLQorCitEZXBlbmRlbmNpZXM6CisKKyogUHl0aG9uIDIuNAorKiBQeUdUSyAyLjggb3IgbGF0ZXIKKyogUHlDYWlybyAxLjAgb3IgbGF0ZXIKKworT1BUSU9OUworLS0tLS0tLQorLS13aXRob3V0LWRpZmY6OgorCisJSWYgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGxpc3QgdGhlIGNvbW1pdCBkaWZmcyBpbiB0aGUgbWFpbiB3aW5kb3cuCisJVGhpcyBtYXkgc3BlZWQgdXAgdGhlIHJlcG9zaXRvcnkgYnJvd3NpbmcuCisKKzxhcmdzPjo6CisKKwlBbGwgdGhlIHZhbGlkIG9wdGlvbiBmb3IgZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0uCisKK0tleSBCaW5kaW5ncworLS0tLS0tLS0tLS0tCitGNDo6CisJVG8gbWF4aW1pemUgdGhlIHdpbmRvdworCitGNTo6CisJVG8gcmVyZWFkIHJlZmVyZW5jZXMuCisKK0YxMTo6CisJRnVsbCBzY3JlZW4KKworRjEyOjoKKwlMZWF2ZSBmdWxsIHNjcmVlbgorCitFWEFNUExFUworLS0tLS0tLS0KKworZ2l0dmlldyB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHRoZSBjaGFuZ2VzIHNpbmNlIHZlcnNpb24gdjIuNi4xMiB0aGF0IGNoYW5nZWQgYW55IGZpbGUgaW4gdGhlCisJaW5jbHVkZS9zY3NpIG9yIGRyaXZlcnMvc2NzaSBzdWJkaXJlY3RvcmllcworCitnaXR2aWV3IC0tc2luY2U9Mi53ZWVrcy5hZ286OgorCisJU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzCmRpZmYgLS1naXQgYS9jb250cmliL2hnLXRvLWdpdC9oZy10by1naXQucHkgYi9jb250cmliL2hnLXRvLWdpdC9oZy10by1naXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzczMzdmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC5weQpAQCAtMCwwICsxLDIzMyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisKKyIiIiBoZy10by1zdm4ucHkgLSBBIE1lcmN1cmlhbCB0byBHSVQgY29udmVydGVyCisKKyAgICBDb3B5cmlnaHQgKEMpMjAwNyBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisiIiIKKworaW1wb3J0IG9zLCBvcy5wYXRoLCBzeXMKK2ltcG9ydCB0ZW1wZmlsZSwgcG9wZW4yLCBwaWNrbGUsIGdldG9wdAoraW1wb3J0IHJlCisKKyMgTWFwcyBoZyB2ZXJzaW9uIC0+IGdpdCB2ZXJzaW9uCitoZ3ZlcnMgPSB7fQorIyBMaXN0IG9mIGNoaWxkcmVuIGZvciBlYWNoIGhnIHJldmlzaW9uCitoZ2NoaWxkcmVuID0ge30KKyMgQ3VycmVudCBicmFuY2ggZm9yIGVhY2ggaGcgcmV2aXNpb24KK2hnYnJhbmNoID0ge30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdXNhZ2UoKToKKworICAgICAgICBwcmludCAiIiJcCislczogW09QVElPTlNdIDxoZ3Byaj4KKworb3B0aW9uczoKKyAgICAtcywgLS1naXRzdGF0ZT1GSUxFOiBuYW1lIG9mIHRoZSBzdGF0ZSB0byBiZSBzYXZlZC9yZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGluY3JlbWVudGFscworCityZXF1aXJlZDoKKyAgICBoZ3ByajogIG5hbWUgb2YgdGhlIEhHIHByb2plY3QgdG8gaW1wb3J0IChkaXJlY3RvcnkpCisiIiIgJSBzeXMuYXJndlswXQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBnZXRnaXRlbnYodXNlciwgZGF0ZSk6CisgICAgZW52ID0gJycKKyAgICBlbGVtcyA9IHJlLmNvbXBpbGUoJyguKj8pXHMrPCguKik+JykubWF0Y2godXNlcikKKyAgICBpZiBlbGVtczoKKyAgICAgICAgZW52ICs9ICdleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIlcyIgOycgJSBlbGVtcy5ncm91cCgxKQorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQ09NTUlURVJfTkFNRT0iJXMiIDsnICUgZWxlbXMuZ3JvdXAoMSkKKyAgICAgICAgZW52ICs9ICdleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJXMiIDsnICUgZWxlbXMuZ3JvdXAoMikKKyAgICAgICAgZW52ICs9ICdleHBvcnQgR0lUX0NPTU1JVEVSX0VNQUlMPSIlcyIgOycgJSBlbGVtcy5ncm91cCgyKQorICAgIGVsc2U6CisgICAgICAgIGVudiArPSAnZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJXMiIDsnICUgdXNlcgorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQ09NTUlURVJfTkFNRT0iJXMiIDsnICUgdXNlcgorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSA7JworICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQ09NTUlURVJfRU1BSUw9IDsnCisKKyAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQVVUSE9SX0RBVEU9IiVzIiA7JyAlIGRhdGUKKyAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEU9IiVzIiA7JyAlIGRhdGUKKyAgICByZXR1cm4gZW52CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGUgPSAnJworCit0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnczp0OicsIFsnZ2l0c3RhdGU9JywgJ3RlbXBkaXI9J10pCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyBpbiAoJy1zJywgJy0tZ2l0c3RhdGUnKToKKyAgICAgICAgICAgIHN0YXRlID0gYQorICAgICAgICAgICAgc3RhdGUgPSBvcy5wYXRoLmFic3BhdGgoc3RhdGUpCisKKyAgICBpZiBsZW4oYXJncykgIT0gMToKKyAgICAgICAgcmFpc2UoJ3BhcmFtcycpCitleGNlcHQ6CisgICAgdXNhZ2UoKQorICAgIHN5cy5leGl0KDEpCisKK2hncHJqID0gYXJnc1swXQorb3MuY2hkaXIoaGdwcmopCisKK2lmIHN0YXRlOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0YXRlKToKKyAgICAgICAgcHJpbnQgJ1N0YXRlIGRvZXMgZXhpc3QsIHJlYWRpbmcnCisgICAgICAgIGYgPSBvcGVuKHN0YXRlLCAncicpCisgICAgICAgIGhndmVycyA9IHBpY2tsZS5sb2FkKGYpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgJ1N0YXRlIGRvZXMgbm90IGV4aXN0LCBmaXJzdCBydW4nCisKK3RpcCA9IG9zLnBvcGVuKCdoZyB0aXAgfCBoZWFkIC0xIHwgY3V0IC1mIDIgLWQgOicpLnJlYWQoKS5zdHJpcCgpCitwcmludCAndGlwIGlzJywgdGlwCisKKyMgQ2FsY3VsYXRlIHRoZSBicmFuY2hlcworcHJpbnQgJ2FuYWx5c2luZyB0aGUgYnJhbmNoZXMuLi4nCitoZ2NoaWxkcmVuWyIwIl0gPSAoKQoraGdicmFuY2hbIjAiXSA9ICJtYXN0ZXIiCitmb3IgY3NldCBpbiByYW5nZSgxLCBpbnQodGlwKSArIDEpOgorICAgIGhnY2hpbGRyZW5bc3RyKGNzZXQpXSA9ICgpCisgICAgcHJudHMgPSBvcy5wb3BlbignaGcgbG9nIC1yICVkIHwgZ3JlcCBecGFyZW50OiB8IGN1dCAtZiAyIC1kIDonICUgY3NldCkucmVhZGxpbmVzKCkKKyAgICBpZiBsZW4ocHJudHMpID4gMDoKKyAgICAgICAgcGFyZW50ID0gcHJudHNbMF0uc3RyaXAoKQorICAgIGVsc2U6CisgICAgICAgIHBhcmVudCA9IHN0cihjc2V0IC0gMSkKKyAgICBoZ2NoaWxkcmVuW3BhcmVudF0gKz0gKCBzdHIoY3NldCksICkKKyAgICBpZiBsZW4ocHJudHMpID4gMToKKyAgICAgICAgbXBhcmVudCA9IHBybnRzWzFdLnN0cmlwKCkKKyAgICAgICAgaGdjaGlsZHJlblttcGFyZW50XSArPSAoIHN0cihjc2V0KSwgKQorICAgIGVsc2U6CisgICAgICAgIG1wYXJlbnQgPSBOb25lCisKKyAgICBpZiBtcGFyZW50OgorICAgICAgICAjIEZvciBtZXJnZSBjaGFuZ2VzZXRzLCB0YWtlIGVpdGhlciBvbmUsIHByZWZlcmFibHkgdGhlICdtYXN0ZXInIGJyYW5jaAorICAgICAgICBpZiBoZ2JyYW5jaFttcGFyZW50XSA9PSAnbWFzdGVyJzoKKyAgICAgICAgICAgIGhnYnJhbmNoW3N0cihjc2V0KV0gPSAnbWFzdGVyJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGdicmFuY2hbc3RyKGNzZXQpXSA9IGhnYnJhbmNoW3BhcmVudF0KKyAgICBlbHNlOgorICAgICAgICAjIE5vcm1hbCBjaGFuZ2VzZXRzCisgICAgICAgICMgRm9yIGZpcnN0IGNoaWxkcmVuLCB0YWtlIHRoZSBwYXJlbnQgYnJhbmNoLCBmb3IgdGhlIG90aGVycyBjcmVhdGUgYSBuZXcgYnJhbmNoCisgICAgICAgIGlmIGhnY2hpbGRyZW5bcGFyZW50XVswXSA9PSBzdHIoY3NldCk6CisgICAgICAgICAgICBoZ2JyYW5jaFtzdHIoY3NldCldID0gaGdicmFuY2hbcGFyZW50XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGdicmFuY2hbc3RyKGNzZXQpXSA9ICJicmFuY2gtIiArIHN0cihjc2V0KQorCitpZiBub3QgaGd2ZXJzLmhhc19rZXkoIjAiKToKKyAgICBwcmludCAnY3JlYXRpbmcgcmVwb3NpdG9yeScKKyAgICBvcy5zeXN0ZW0oJ2dpdC1pbml0LWRiJykKKworIyBsb29wIHRocm91Z2ggZXZlcnkgaGcgY2hhbmdlc2V0Citmb3IgY3NldCBpbiByYW5nZShpbnQodGlwKSArIDEpOgorCisgICAgIyBpbmNyZW1lbnRhbCwgYWxyZWFkeSBzZWVuCisgICAgaWYgaGd2ZXJzLmhhc19rZXkoc3RyKGNzZXQpKToKKyAgICAgICAgY29udGludWUKKworICAgICMgZ2V0IGluZm8KKyAgICBwcm50cyA9IG9zLnBvcGVuKCdoZyBsb2cgLXIgJWQgfCBncmVwIF5wYXJlbnQ6IHwgY3V0IC1mIDIgLWQgOicgJSBjc2V0KS5yZWFkbGluZXMoKQorICAgIGlmIGxlbihwcm50cykgPiAwOgorICAgICAgICBwYXJlbnQgPSBwcm50c1swXS5zdHJpcCgpCisgICAgZWxzZToKKyAgICAgICAgcGFyZW50ID0gc3RyKGNzZXQgLSAxKQorICAgIGlmIGxlbihwcm50cykgPiAxOgorICAgICAgICBtcGFyZW50ID0gcHJudHNbMV0uc3RyaXAoKQorICAgIGVsc2U6CisgICAgICAgIG1wYXJlbnQgPSBOb25lCisKKyAgICAoZmRjb21tZW50LCBmaWxlY29tbWVudCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICBjc2V0Y29tbWVudCA9IG9zLnBvcGVuKCdoZyBsb2cgLXIgJWQgLXYgfCBncmVwIC12IF5jaGFuZ2VzZXQ6IHwgZ3JlcCAtdiBecGFyZW50OiB8IGdyZXAgLXYgXnVzZXI6IHwgZ3JlcCAtdiBeZGF0ZSB8IGdyZXAgLXYgXmZpbGVzOiB8IGdyZXAgLXYgXmRlc2NyaXB0aW9uOiB8IGdyZXAgLXYgXnRhZzonICUgY3NldCkucmVhZCgpLnN0cmlwKCkKKyAgICBvcy53cml0ZShmZGNvbW1lbnQsIGNzZXRjb21tZW50KQorICAgIG9zLmNsb3NlKGZkY29tbWVudCkKKworICAgIGRhdGUgPSBvcy5wb3BlbignaGcgbG9nIC1yICVkIHwgZ3JlcCBeZGF0ZTogfCBjdXQgLWYgMi0gLWQgOicgJSBjc2V0KS5yZWFkKCkuc3RyaXAoKQorCisgICAgdGFnID0gb3MucG9wZW4oJ2hnIGxvZyAtciAlZCB8IGdyZXAgXnRhZzogfCBjdXQgLWYgMi0gLWQgOicgJSBjc2V0KS5yZWFkKCkuc3RyaXAoKQorCisgICAgdXNlciA9IG9zLnBvcGVuKCdoZyBsb2cgLXIgJWQgfCBncmVwIF51c2VyOiB8IGN1dCAtZiAyLSAtZCA6JyAlIGNzZXQpLnJlYWQoKS5zdHJpcCgpCisKKyAgICBwcmludCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgcHJpbnQgJ2NzZXQ6JywgY3NldAorICAgIHByaW50ICdicmFuY2g6JywgaGdicmFuY2hbc3RyKGNzZXQpXQorICAgIHByaW50ICd1c2VyOicsIHVzZXIKKyAgICBwcmludCAnZGF0ZTonLCBkYXRlCisgICAgcHJpbnQgJ2NvbW1lbnQ6JywgY3NldGNvbW1lbnQKKyAgICBwcmludCAncGFyZW50OicsIHBhcmVudAorICAgIGlmIG1wYXJlbnQ6CisgICAgICAgIHByaW50ICdtcGFyZW50OicsIG1wYXJlbnQKKyAgICBpZiB0YWc6CisgICAgICAgIHByaW50ICd0YWc6JywgdGFnCisgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCisgICAgIyBjaGVja291dCB0aGUgcGFyZW50IGlmIG5lY2Vzc2FyeQorICAgIGlmIGNzZXQgIT0gMDoKKyAgICAgICAgaWYgaGdicmFuY2hbc3RyKGNzZXQpXSA9PSAiYnJhbmNoLSIgKyBzdHIoY3NldCk6CisgICAgICAgICAgICBwcmludCAnY3JlYXRpbmcgbmV3IGJyYW5jaCcsIGhnYnJhbmNoW3N0cihjc2V0KV0KKyAgICAgICAgICAgIG9zLnN5c3RlbSgnZ2l0LWNoZWNrb3V0IC1iICVzICVzJyAlIChoZ2JyYW5jaFtzdHIoY3NldCldLCBoZ3ZlcnNbcGFyZW50XSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnY2hlY2tpbmcgb3V0IGJyYW5jaCcsIGhnYnJhbmNoW3N0cihjc2V0KV0KKyAgICAgICAgICAgIG9zLnN5c3RlbSgnZ2l0LWNoZWNrb3V0ICVzJyAlIGhnYnJhbmNoW3N0cihjc2V0KV0pCisKKyAgICAjIG1lcmdlCisgICAgaWYgbXBhcmVudDoKKyAgICAgICAgaWYgaGdicmFuY2hbcGFyZW50XSA9PSBoZ2JyYW5jaFtzdHIoY3NldCldOgorICAgICAgICAgICAgb3RoZXJicmFuY2ggPSBoZ2JyYW5jaFttcGFyZW50XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RoZXJicmFuY2ggPSBoZ2JyYW5jaFtwYXJlbnRdCisgICAgICAgIHByaW50ICdtZXJnaW5nJywgb3RoZXJicmFuY2gsICdpbnRvJywgaGdicmFuY2hbc3RyKGNzZXQpXQorICAgICAgICBvcy5zeXN0ZW0oZ2V0Z2l0ZW52KHVzZXIsIGRhdGUpICsgJ2dpdC1tZXJnZSAtLW5vLWNvbW1pdCAtcyBvdXJzICIiICVzICVzJyAlIChoZ2JyYW5jaFtzdHIoY3NldCldLCBvdGhlcmJyYW5jaCkpCisKKyAgICAjIHJlbW92ZSBldmVyeXRoaW5nIGV4Y2VwdCAuZ2l0IGFuZCAuaGcgZGlyZWN0b3JpZXMKKyAgICBvcy5zeXN0ZW0oJ2ZpbmQgLiBcKCAtcGF0aCAiLi8uaGciIC1vIC1wYXRoICIuLy5naXQiIFwpIC1wcnVuZSAtbyAhIC1uYW1lICIuIiAtcHJpbnQgfCB4YXJncyBybSAtcmYnKQorCisgICAgIyByZXBvcHVsYXRlIHdpdGggY2hlY2tvdXRlZCBmaWxlcworICAgIG9zLnN5c3RlbSgnaGcgdXBkYXRlIC1DICVkJyAlIGNzZXQpCisKKyAgICAjIGFkZCBuZXcgZmlsZXMKKyAgICBvcy5zeXN0ZW0oJ2dpdC1scy1maWxlcyAteCAuaGcgLS1vdGhlcnMgfCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tc3RkaW4nKQorICAgICMgZGVsZXRlIHJlbW92ZWQgZmlsZXMKKyAgICBvcy5zeXN0ZW0oJ2dpdC1scy1maWxlcyAteCAuaGcgLS1kZWxldGVkIHwgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLXN0ZGluJykKKworICAgICMgY29tbWl0CisgICAgb3Muc3lzdGVtKGdldGdpdGVudih1c2VyLCBkYXRlKSArICdnaXQtY29tbWl0IC1hIC1GICVzJyAlIGZpbGVjb21tZW50KQorICAgIG9zLnVubGluayhmaWxlY29tbWVudCkKKworICAgICMgdGFnCisgICAgaWYgdGFnIGFuZCB0YWcgIT0gJ3RpcCc6CisgICAgICAgIG9zLnN5c3RlbShnZXRnaXRlbnYodXNlciwgZGF0ZSkgKyAnZ2l0LXRhZyAlcycgJSB0YWcpCisKKyAgICAjIGRlbGV0ZSBicmFuY2ggaWYgbm90IHVzZWQgYW55bW9yZS4uLgorICAgIGlmIG1wYXJlbnQgYW5kIGxlbihoZ2NoaWxkcmVuW3N0cihjc2V0KV0pOgorICAgICAgICBwcmludCAiRGVsZXRpbmcgdW51c2VkIGJyYW5jaDoiLCBvdGhlcmJyYW5jaAorICAgICAgICBvcy5zeXN0ZW0oJ2dpdC1icmFuY2ggLWQgJXMnICUgb3RoZXJicmFuY2gpCisKKyAgICAjIHJldHJpZXZlIGFuZCByZWNvcmQgdGhlIHZlcnNpb24KKyAgICB2dnYgPSBvcy5wb3BlbignZ2l0LXNob3cgfCBoZWFkIC0xJykucmVhZCgpCisgICAgdnZ2ID0gdnZ2W3Z2di5pbmRleCgnICcpICsgMSA6IF0uc3RyaXAoKQorICAgIHByaW50ICdyZWNvcmQnLCBjc2V0LCAnLT4nLCB2dnYKKyAgICBoZ3ZlcnNbc3RyKGNzZXQpXSA9IHZ2dgorCitvcy5zeXN0ZW0oJ2dpdC1yZXBhY2sgLWEgLWQnKQorCisjIHdyaXRlIHRoZSBzdGF0ZSBmb3IgaW5jcmVtZW50YWxzCitpZiBzdGF0ZToKKyAgICBwcmludCAnV3JpdGluZyBzdGF0ZScKKyAgICBmID0gb3BlbihzdGF0ZSwgJ3cnKQorICAgIHBpY2tsZS5kdW1wKGhndmVycywgZikKKworIyB2aW06IGV0IHRzPTggc3c9NCBzdHM9NApkaWZmIC0tZ2l0IGEvY29udHJpYi9oZy10by1naXQvaGctdG8tZ2l0LnR4dCBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmOGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC50eHQKQEAgLTAsMCArMSwyMSBAQAoraGctdG8tZ2l0LnB5IGlzIGFibGUgdG8gY29udmVydCBhIE1lcmN1cmlhbCByZXBvc2l0b3J5IGludG8gYSBnaXQgb25lLAorYW5kIHByZXNlcnZlcyB0aGUgYnJhbmNoZXMgaW4gdGhlIHByb2Nlc3MgKHVubGlrZSB0YWlsb3IpCisKK2hnLXRvLWdpdC5weSBjYW4gcHJvYmFibHkgYmUgZ3JlYXRseSBpbXByb3ZlZCAoaXQncyBhIHJhdGhlciBjcnVkZQorY29tYmluYXRpb24gb2Ygc2hlbGwgYW5kIHB5dGhvbikgYnV0IGl0IGRvZXMgYWxyZWFkeSB3b3JrIHF1aXRlIHdlbGwgZm9yCittZS4gRmVhdHVyZXM6CisJLSBzdXBwb3J0cyBpbmNyZW1lbnRhbCBjb252ZXJzaW9uCisJICAoZm9yIGtlZXBpbmcgYSBnaXQgcmVwbyBpbiBzeW5jIHdpdGggYSBoZyBvbmUpCisgICAgICAgIC0gc3VwcG9ydHMgaGcgYnJhbmNoZXMKKyAgICAgICAgLSBjb252ZXJ0cyBoZyB0YWdzCisKK05vdGUgdGhhdCB0aGUgZ2l0IHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkICdpbiBwbGFjZScgKGF0IHRoZSBzYW1lCitsb2NhdGlvbiBhcyB0aGUgc291cmNlIGhnIHJlcG8pLiBZb3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUKKycuaGcnIGRpcmVjdG9yeSBhZnRlciB0aGUgY29udmVyc2lvbi4KKworQWxzbyBub3RlIHRoYXQgdGhlIGluY3JlbWVudGFsIGNvbnZlcnNpb24gdXNlcyAnc2ltcGxlJyBoZyBjaGFuZ2VzZXRzCitpZGVudGlmaWVycyAob3JkaW5hbHMsIGFzIG9wcG9zZWQgdG8gU0hBLTEgaWRzKSwgYW5kIHNpbmNlIHRoZXNlIGlkcworYXJlIG5vdCBzdGFibGUgYWNyb3NzIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgdGhlIGhnLXRvLWdpdC5weSBzdGF0ZSBmaWxlCitpcyBmb3JldmVyIHRpZWQgdG8gb25lIGhnIHJlcG9zaXRvcnkuCisKK1N0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CmRpZmYgLS1naXQgYS9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbCBiL2NvbnRyaWIvaG9va3MvcG9zdC1yZWNlaXZlLWVtYWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmVmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbApAQCAtMCwwICsxLDYxOSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBBbmR5IFBhcmtpbnMKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBtYWlsIG91dCBjb21taXQgdXBkYXRlIGluZm9ybWF0aW9uLiAgVGhpcyBob29rIHNlbmRzIGVtYWlscworIyBsaXN0aW5nIG5ldyByZXZpc2lvbnMgdG8gdGhlIHJlcG9zaXRvcnkgaW50cm9kdWNlZCBieSB0aGUgY2hhbmdlIGJlaW5nIHJlcG9ydGVkLiAgVGhlCisjIHJ1bGUgaXMgdGhhdCAoZm9yIGJyYW5jaCB1cGRhdGVzKSBlYWNoIGNvbW1pdCB3aWxsIGFwcGVhciBvbiBvbmUgZW1haWwgYW5kIG9uZSBlbWFpbAorIyBvbmx5LgorIworIyBUaGlzIGhvb2sgaXMgc3RvcmVkIGluIHRoZSBjb250cmliL2hvb2tzIGRpcmVjdG9yeS4gIFlvdXIgZGlzdHJpYnV0aW9uIHdpbGwgaGF2ZSBwdXQKKyMgdGhpcyBzb21ld2hlcmUgc3RhbmRhcmQuICBZb3Ugc2hvdWxkIG1ha2UgdGhpcyBzY3JpcHQgZXhlY3V0YWJsZSB0aGVuIGxpbmsgdG8gaXQgaW4KKyMgdGhlIHJlcG9zaXRvcnkgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGl0IGluLiAgRm9yIGV4YW1wbGUsIG9uIGRlYmlhbiB0aGUgaG9vayBpcyBzdG9yZWQKKyMgaW4gL3Vzci9zaGFyZS9kb2MvZ2l0LWNvcmUvY29udHJpYi9ob29rcy9wb3N0LXJlY2VpdmUtZW1haWw6CisjCisjICBjaG1vZCBhK3ggcG9zdC1yZWNlaXZlLWVtYWlsCisjICBjZCAvcGF0aC90by95b3VyL3JlcG9zaXRvcnkuZ2l0CisjICBsbiAtc2YgL3Vzci9zaGFyZS9kb2MvZ2l0LWNvcmUvY29udHJpYi9ob29rcy9wb3N0LXJlY2VpdmUtZW1haWwgaG9va3MvcG9zdC1yZWNlaXZlCisjCisjIFRoaXMgaG9vayBzY3JpcHQgYXNzdW1lcyBpdCBpcyBlbmFibGVkIG9uIHRoZSBjZW50cmFsIHJlcG9zaXRvcnkgb2YgYSBwcm9qZWN0LCB3aXRoCisjIGFsbCB1c2VycyBwdXNoaW5nIG9ubHkgdG8gaXQgYW5kIG5vdCBiZXR3ZWVuIGVhY2ggb3RoZXIuICBJdCB3aWxsIHN0aWxsIHdvcmsgaWYgeW91CisjIGRvbid0IG9wZXJhdGUgaW4gdGhhdCBzdHlsZSwgYnV0IGl0IHdvdWxkIGJlY29tZSBwb3NzaWJsZSBmb3IgdGhlIGVtYWlsIHRvIGJlIGZyb20KKyMgc29tZW9uZSBvdGhlciB0aGFuIHRoZSBwZXJzb24gZG9pbmcgdGhlIHB1c2guCisjCisjIENvbmZpZworIyAtLS0tLS0KKyMgaG9va3MubWFpbGluZ2xpc3QKKyMgICBUaGlzIGlzIHRoZSBsaXN0IHRoYXQgYWxsIHB1c2hlcyB3aWxsIGdvIHRvOyBsZWF2ZSBpdCBibGFuayB0byBub3Qgc2VuZAorIyAgIGVtYWlscyBmb3IgZXZlcnkgcmVmIHVwZGF0ZS4KKyMgaG9va3MuYW5ub3VuY2VsaXN0CisjICAgVGhpcyBpcyB0aGUgbGlzdCB0aGF0IGFsbCBwdXNoZXMgb2YgYW5ub3RhdGVkIHRhZ3Mgd2lsbCBnbyB0by4gIExlYXZlIGl0CisjICAgYmxhbmsgdG8gZGVmYXVsdCB0byB0aGUgbWFpbGluZ2xpc3QgZmllbGQuICBUaGUgYW5ub3VuY2UgZW1haWxzIGxpc3RzIHRoZQorIyAgIHNob3J0IGxvZyBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IGFubm90YXRlZCB0YWcuCisjIGhvb2suZW52ZWxvcGVzZW5kZXIKKyMgICBJZiBzZXQgdGhlbiB0aGUgLWYgb3B0aW9uIGlzIHBhc3NlZCB0byBzZW5kbWFpbCB0byBhbGxvdyB0aGUgZW52ZWxvcGUgc2VuZGVyCisjICAgYWRkcmVzcyB0byBiZSBzZXQKKyMKKyMgTm90ZXMKKyMgLS0tLS0KKyMgQWxsIGVtYWlscyBoYXZlIHRoZWlyIHN1YmplY3RzIHByZWZpeGVkIHdpdGggIltTQ01dIiB0byBhaWQgZmlsdGVyaW5nLgorIyBBbGwgZW1haWxzIGluY2x1ZGUgdGhlIGhlYWRlcnMgIlgtR2l0LVJlZm5hbWUiLCAiWC1HaXQtT2xkcmV2IiwKKyMgIlgtR2l0LU5ld3JldiIsIGFuZCAiWC1HaXQtUmVmdHlwZSIgdG8gZW5hYmxlIGZpbmUgdHVuZWQgZmlsdGVyaW5nIGFuZAorIyBnaXZlIGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcuCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbnMKKworIworIyBUb3AgbGV2ZWwgZW1haWwgZ2VuZXJhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZGVjaWRlcyB3aGF0IHR5cGUgb2YgdXBkYXRlCisjIHRoaXMgaXMgYW5kIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBib2R5LWdlbmVyYXRpb24gcm91dGluZSBhZnRlciBvdXRwdXR0aW5nCisjIHRoZSBjb21tb24gaGVhZGVyCisjCisjIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IGdlbmVyYXRlIGFueSBlbWFpbCBvdXRwdXQsIHRoYXQgaXMgdGFrZW4KKyMgY2FyZSBvZiBieSB0aGUgZnVuY3Rpb25zIGl0IGNhbGxzOgorIyAgLSBnZW5lcmF0ZV9lbWFpbF9oZWFkZXIKKyMgIC0gZ2VuZXJhdGVfY3JlYXRlX1hYWFhfZW1haWwKKyMgIC0gZ2VuZXJhdGVfdXBkYXRlX1hYWFhfZW1haWwKKyMgIC0gZ2VuZXJhdGVfZGVsZXRlX1hYWFhfZW1haWwKKyMgIC0gZ2VuZXJhdGVfZW1haWxfZm9vdGVyCisjCitnZW5lcmF0ZV9lbWFpbCgpCit7CisJIyAtLS0gQXJndW1lbnRzCisJb2xkcmV2PSQoZ2l0IHJldi1wYXJzZSAkMSkKKwluZXdyZXY9JChnaXQgcmV2LXBhcnNlICQyKQorCXJlZm5hbWU9IiQzIgorCisJIyAtLS0gSW50ZXJwcmV0CisJIyAwMDAwLT4xMjM0IChjcmVhdGUpCisJIyAxMjM0LT4yMzQ1ICh1cGRhdGUpCisJIyAyMzQ1LT4wMDAwIChkZWxldGUpCisJaWYgZXhwciAiJG9sZHJldiIgOiAnMCokJyA+L2Rldi9udWxsCisJdGhlbgorCQljaGFuZ2VfdHlwZT0iY3JlYXRlIgorCWVsc2UKKwkJaWYgZXhwciAiJG5ld3JldiIgOiAnMCokJyA+L2Rldi9udWxsCisJCXRoZW4KKwkJCWNoYW5nZV90eXBlPSJkZWxldGUiCisJCWVsc2UKKwkJCWNoYW5nZV90eXBlPSJ1cGRhdGUiCisJCWZpCisJZmkKKworCSMgLS0tIEdldCB0aGUgcmV2aXNpb24gdHlwZXMKKwluZXdyZXZfdHlwZT0kKGdpdCBjYXQtZmlsZSAtdCAkbmV3cmV2IDI+IC9kZXYvbnVsbCkKKwlvbGRyZXZfdHlwZT0kKGdpdCBjYXQtZmlsZSAtdCAiJG9sZHJldiIgMj4gL2Rldi9udWxsKQorCWNhc2UgIiRjaGFuZ2VfdHlwZSIgaW4KKwljcmVhdGV8dXBkYXRlKQorCQlyZXY9IiRuZXdyZXYiCisJCXJldl90eXBlPSIkbmV3cmV2X3R5cGUiCisJCTs7CisJZGVsZXRlKQorCQlyZXY9IiRvbGRyZXYiCisJCXJldl90eXBlPSIkb2xkcmV2X3R5cGUiCisJCTs7CisJZXNhYworCisJIyBUaGUgcmV2aXNpb24gdHlwZSB0ZWxscyB1cyB3aGF0IHR5cGUgdGhlIGNvbW1pdCBpcywgY29tYmluZWQgd2l0aAorCSMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZWYgd2UgY2FuIGRlY2lkZSBiZXR3ZWVuCisJIyAgLSB3b3JraW5nIGJyYW5jaAorCSMgIC0gdHJhY2tpbmcgYnJhbmNoCisJIyAgLSB1bmFubm90ZWQgdGFnCisJIyAgLSBhbm5vdGF0ZWQgdGFnCisJY2FzZSAiJHJlZm5hbWUiLCIkcmV2X3R5cGUiIGluCisJCXJlZnMvdGFncy8qLGNvbW1pdCkKKwkJCSMgdW4tYW5ub3RhdGVkIHRhZworCQkJcmVmbmFtZV90eXBlPSJ0YWciCisJCQlzaG9ydF9yZWZuYW1lPSR7cmVmbmFtZSMjcmVmcy90YWdzL30KKwkJCTs7CisJCXJlZnMvdGFncy8qLHRhZykKKwkJCSMgYW5ub3RhdGVkIHRhZworCQkJcmVmbmFtZV90eXBlPSJhbm5vdGF0ZWQgdGFnIgorCQkJc2hvcnRfcmVmbmFtZT0ke3JlZm5hbWUjI3JlZnMvdGFncy99CisJCQkjIGNoYW5nZSByZWNpcGllbnRzCisJCQlpZiBbIC1uICIkYW5ub3VuY2VyZWNpcGllbnRzIiBdOyB0aGVuCisJCQkJcmVjaXBpZW50cz0iJGFubm91bmNlcmVjaXBpZW50cyIKKwkJCWZpCisJCQk7OworCQlyZWZzL2hlYWRzLyosY29tbWl0KQorCQkJIyBicmFuY2gKKwkJCXJlZm5hbWVfdHlwZT0iYnJhbmNoIgorCQkJc2hvcnRfcmVmbmFtZT0ke3JlZm5hbWUjI3JlZnMvaGVhZHMvfQorCQkJOzsKKwkJcmVmcy9yZW1vdGVzLyosY29tbWl0KQorCQkJIyB0cmFja2luZyBicmFuY2gKKwkJCXJlZm5hbWVfdHlwZT0idHJhY2tpbmcgYnJhbmNoIgorCQkJc2hvcnRfcmVmbmFtZT0ke3JlZm5hbWUjI3JlZnMvcmVtb3Rlcy99CisJCQllY2hvID4mMiAiKioqIFB1c2gtdXBkYXRlIG9mIHRyYWNraW5nIGJyYW5jaCwgJHJlZm5hbWUiCisJCQllY2hvID4mMiAiKioqICAtIG5vIGVtYWlsIGdlbmVyYXRlZC4iCisJCQlleGl0IDAKKwkJCTs7CisJCSopCisJCQkjIEFueXRoaW5nIGVsc2UgKGlzIHRoZXJlIGFueXRoaW5nIGVsc2U/KQorCQkJZWNobyA+JjIgIioqKiBVbmtub3duIHR5cGUgb2YgdXBkYXRlIHRvICRyZWZuYW1lICgkcmV2X3R5cGUpIgorCQkJZWNobyA+JjIgIioqKiAgLSBubyBlbWFpbCBnZW5lcmF0ZWQiCisJCQlleGl0IDEKKwkJCTs7CisJZXNhYworCisJIyBDaGVjayBpZiB3ZSd2ZSBnb3QgYW55b25lIHRvIHNlbmQgdG8KKwlpZiBbIC16ICIkcmVjaXBpZW50cyIgXTsgdGhlbgorCQllY2hvID4mMiAiKioqIGhvb2tzLnJlY2lwaWVudHMgaXMgbm90IHNldCBzbyBubyBlbWFpbCB3aWxsIGJlIHNlbnQiCisJCWVjaG8gPiYyICIqKiogZm9yICRyZWZuYW1lIHVwZGF0ZSAkb2xkcmV2LT4kbmV3cmV2IgorCQlleGl0IDAKKwlmaQorCisJIyBFbWFpbCBwYXJhbWV0ZXJzCisJIyBUaGUgY29tbWl0dGVyIHdpbGwgYmUgb2J0YWluZWQgZnJvbSB0aGUgbGF0ZXN0IGV4aXN0aW5nIHJldjsgc28KKwkjIGZvciBhIGRlbGV0aW9uIGl0IHdpbGwgYmUgdGhlIG9sZHJldiwgZm9yIHRoZSBvdGhlcnMsIHRoZW4gbmV3cmV2CisJY29tbWl0dGVyPSQoZ2l0IHNob3cgLS1wcmV0dHk9ZnVsbCAtcyAkcmV2IHwgc2VkIC1uZSAicy9eQ29tbWl0OiAvL3AiIHwKKwkJc2VkIC1uZSAncy9cKC4qXCkgPC8iXDEiIDwvcCcpCisJIyBUaGUgZW1haWwgc3ViamVjdCB3aWxsIGNvbnRhaW4gdGhlIGJlc3QgZGVzY3JpcHRpb24gb2YgdGhlIHJlZgorCSMgdGhhdCB3ZSBjYW4gYnVpbGQgZnJvbSB0aGUgcGFyYW1ldGVycworCWRlc2NyaWJlPSQoZ2l0IGRlc2NyaWJlICRyZXYgMj4vZGV2L251bGwpCisJaWYgWyAteiAiJGRlc2NyaWJlIiBdOyB0aGVuCisJCWRlc2NyaWJlPSRyZXYKKwlmaQorCisJZ2VuZXJhdGVfZW1haWxfaGVhZGVyCisKKwkjIENhbGwgdGhlIGNvcnJlY3QgYm9keSBnZW5lcmF0aW9uIGZ1bmN0aW9uCisJZm5fbmFtZT1nZW5lcmFsCisJY2FzZSAiJHJlZm5hbWVfdHlwZSIgaW4KKwkidHJhY2tpbmcgYnJhbmNoInxicmFuY2gpCisJCWZuX25hbWU9YnJhbmNoCisJCTs7CisJImFubm90YXRlZCB0YWciKQorCQlmbl9uYW1lPWF0YWcKKwkJOzsKKwllc2FjCisJZ2VuZXJhdGVfJHtjaGFuZ2VfdHlwZX1fJHtmbl9uYW1lfV9lbWFpbAorCisJZ2VuZXJhdGVfZW1haWxfZm9vdGVyCit9CisKK2dlbmVyYXRlX2VtYWlsX2hlYWRlcigpCit7CisJIyAtLS0gRW1haWwgKGFsbCBzdGRvdXQgd2lsbCBiZSB0aGUgZW1haWwpCisJIyBHZW5lcmF0ZSBoZWFkZXIKKwljYXQgPDwtRU9GCisJRnJvbTogJGNvbW1pdHRlcgorCVRvOiAkcmVjaXBpZW50cworCVN1YmplY3Q6ICR7RU1BSUxQUkVGSVh9JHByb2plY3RkZXNjICRyZWZuYW1lX3R5cGUsICRzaG9ydF9yZWZuYW1lLCAke2NoYW5nZV90eXBlfWQuICRkZXNjcmliZQorCVgtR2l0LVJlZm5hbWU6ICRyZWZuYW1lCisJWC1HaXQtUmVmdHlwZTogJHJlZm5hbWVfdHlwZQorCVgtR2l0LU9sZHJldjogJG9sZHJldgorCVgtR2l0LU5ld3JldjogJG5ld3JldgorCisJVGhpcyBpcyBhbiBhdXRvbWF0ZWQgZW1haWwgZnJvbSB0aGUgZ2l0IGhvb2tzL3Bvc3QtcmVjZWl2ZSBzY3JpcHQuIEl0IHdhcworCWdlbmVyYXRlZCBiZWNhdXNlIGEgcmVmIGNoYW5nZSB3YXMgcHVzaGVkIHRvIHRoZSByZXBvc2l0b3J5IGNvbnRhaW5pbmcKKwl0aGUgcHJvamVjdCAiJHByb2plY3RkZXNjIi4KKworCVRoZSAkcmVmbmFtZV90eXBlLCAkc2hvcnRfcmVmbmFtZSBoYXMgYmVlbiAke2NoYW5nZV90eXBlfWQKKwlFT0YKK30KKworZ2VuZXJhdGVfZW1haWxfZm9vdGVyKCkKK3sKKwljYXQgPDwtRU9GCisKKworCWhvb2tzL3Bvc3QtcmVjZWl2ZQorCS0tIAorCSRwcm9qZWN0ZGVzYworCUVPRgorfQorCisjIC0tLS0tLS0tLS0tLS0tLSBCcmFuY2hlcworCisjCisjIENhbGxlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgYnJhbmNoCisjCitnZW5lcmF0ZV9jcmVhdGVfYnJhbmNoX2VtYWlsKCkKK3sKKwkjIFRoaXMgaXMgYSBuZXcgYnJhbmNoIGFuZCBzbyBvbGRyZXYgaXMgbm90IHZhbGlkCisJZWNobyAiICAgICAgICBhdCAgJG5ld3JldiAoJG5ld3Jldl90eXBlKSIKKwllY2hvICIiCisKKwllY2hvICRMT0dCRUdJTgorCSMgVGhpcyBzaG93cyBhbGwgbG9nIGVudHJpZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgY292ZXJlZCBieQorCSMgYW5vdGhlciByZWYgLSBpLmUuIGNvbW1pdHMgdGhhdCBhcmUgbm93IGFjY2Vzc2libGUgZnJvbSB0aGlzCisJIyByZWYgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90IGFjY2Vzc2libGUgKHNlZSBnZW5lcmF0ZV91cGRhdGVfYnJhbmNoX2VtYWlsCisJIyBmb3IgdGhlIGV4cGxhbmF0aW9uIG9mIHRoaXMgY29tbWFuZCkKKwlnaXQgcmV2LXBhcnNlIC0tbm90IC0tYnJhbmNoZXMgfCBncmVwIC12ICQoZ2l0IHJldi1wYXJzZSAkcmVmbmFtZSkgfAorCWdpdCByZXYtbGlzdCAtLXByZXR0eSAtLXN0ZGluICRuZXdyZXYKKwllY2hvICRMT0dFTkQKK30KKworIworIyBDYWxsZWQgZm9yIHRoZSBjaGFuZ2Ugb2YgYSBwcmUtZXhpc3RpbmcgYnJhbmNoCisjCitnZW5lcmF0ZV91cGRhdGVfYnJhbmNoX2VtYWlsKCkKK3sKKwkjIENvbnNpZGVyIHRoaXM6CisJIyAgIDEgLS0tIDIgLS0tIE8gLS0tIFggLS0tIDMgLS0tIDQgLS0tIE4KKwkjCisJIyBPIGlzICRvbGRyZXYgZm9yICRyZWZuYW1lCisJIyBOIGlzICRuZXdyZXYgZm9yICRyZWZuYW1lCisJIyBYIGlzIGEgcmV2aXNpb24gcG9pbnRlZCB0byBieSBzb21lIG90aGVyIHJlZiwgZm9yIHdoaWNoIHdlIG1heQorCSMgICBhc3N1bWUgdGhhdCBhbiBlbWFpbCBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZC4KKwkjIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIGlzc3VlIGFuIGVtYWlsIGNvbnRhaW5pbmcgb25seSByZXZpc2lvbnMKKwkjIDMsIDQsIGFuZCBOLiAgR2l2ZW4gKGFsbW9zdCkgYnkKKwkjCisJIyAgZ2l0LXJldi1saXN0IE4gXk8gLS1ub3QgLS1hbGwKKwkjCisJIyBUaGUgcmVhc29uIGZvciB0aGUgImFsbW9zdCIsIGlzIHRoYXQgdGhlICItLW5vdCAtLWFsbCIgd2lsbCB0YWtlCisJIyBwcmVjZWRlbmNlIG92ZXIgdGhlICJOIiwgYW5kIGVmZmVjdGl2ZWx5IHdpbGwgdHJhbnNsYXRlIHRvCisJIworCSMgIGdpdC1yZXYtbGlzdCBOIF5PIF5YIF5OCisJIworCSMgU28sIHdlIG5lZWQgdG8gYnVpbGQgdXAgdGhlIGxpc3QgbW9yZSBjYXJlZnVsbHkuICBnaXQtcmV2LXBhcnNlIHdpbGwKKwkjIGdlbmVyYXRlIGEgbGlzdCBvZiByZXZzIHRoYXQgbWF5IGJlIGZlZCBpbnRvIGdpdC1yZXYtbGlzdC4gIFdlIGNhbiBnZXQKKwkjIGl0IHRvIG1ha2UgdGhlICItLW5vdCAtLWFsbCIgcGFydCBhbmQgdGhlbiBmaWx0ZXIgb3V0IHRoZSAiXk4iIHdpdGg6CisJIworCSMgIGdpdC1yZXYtcGFyc2UgLS1ub3QgLS1hbGwgfCBncmVwIC12IE4KKwkjCisJIyBUaGVuLCB1c2luZyB0aGUgLS1zdGRpbiBzd2l0Y2ggdG8gZ2l0LXJldi1saXN0IHdlIGhhdmUgZWZmZWN0aXZlbHkKKwkjIG1hbnVmYWN0dXJlZAorCSMKKwkjICBnaXQtcmV2LWxpc3QgTiBeTyBeWAorCSMKKwkjIFRoaXMgbGVhdmVzIGEgcHJvYmxlbSB3aGVuIHNvbWVvbmUgZWxzZSB1cGRhdGVzIHRoZSByZXBvc2l0b3J5CisJIyB3aGlsZSB0aGlzIHNjcmlwdCBpcyBydW5uaW5nLiAgVGhlaXIgbmV3IHZhbHVlIG9mIHRoZSByZWYgd2UncmUgd29ya2luZworCSMgb24gd291bGQgYmUgaW5jbHVkZWQgaW4gdGhlICItLW5vdCAtLWFsbCIgb3V0cHV0OyBhbmQgYXMgb3VyICRuZXdyZXYKKwkjIHdvdWxkIGJlIGFuIGFuY2VzdG9yIG9mIHRoYXQgY29tbWl0LCBpdCB3b3VsZCBleGNsdWRlIGFsbCBvZiBvdXIKKwkjIGNvbW1pdHMuICBXaGF0IHdlIHJlYWxseSB3YW50IGlzIHRvIGV4Y2x1ZGUgdGhlIGN1cnJlbnQgdmFsdWUgb2YKKwkjICRyZWZuYW1lIGZyb20gdGhlIC0tbm90IGxpc3QsIHJhdGhlciB0aGFuIE4gaXRzZWxmLiAgU286CisJIworCSMgIGdpdC1yZXYtcGFyc2UgLS1ub3QgLS1hbGwgfCBncmVwIC12ICQoZ2l0LXJldi1wYXJzZSAkcmVmbmFtZSkKKwkjCisJIyBHZXQncyB1cyB0byBzb21ldGhpbmcgcHJldHR5IHNhZmUgKGFwYXJ0IGZyb20gdGhlIHNtYWxsIHRpbWUgYmV0d2VlbgorCSMgcmVmbmFtZSBiZWluZyByZWFkLCBhbmQgZ2l0LXJldi1wYXJzZSBydW5uaW5nIC0gZm9yIHRoYXQsIEkgZ2l2ZSB1cCkKKwkjCisJIworCSMgTmV4dCBwcm9ibGVtLCBjb25zaWRlciB0aGlzOgorCSMgICAqIC0tLSBCIC0tLSAqIC0tLSBPICgkb2xkcmV2KQorCSMgICAgICAgICAgXAorCSMgICAgICAgICAgICogLS0tIFggLS0tICogLS0tIE4gKCRuZXdyZXYpCisJIworCSMgVGhhdCBpcyB0byBzYXksIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG9sZHJldiBpcyBhIHN0cmljdCBzdWJzZXQgb2YKKwkjIG5ld3JldiAoaXQgd291bGQgaGF2ZSByZXF1aXJlZCBhIC0tZm9yY2UsIGJ1dCB0aGF0J3MgYWxsb3dlZCkuICBTbywgd2UKKwkjIGNhbid0IHNpbXBseSBzYXkgcmV2LWxpc3QgJG9sZHJldi4uJG5ld3Jldi4gIEluc3RlYWQgd2UgZmluZCB0aGUgY29tbW9uCisJIyBiYXNlIG9mIHRoZSB0d28gcmV2cyBhbmQgbGlzdCBmcm9tIHRoZXJlLgorCSMKKwkjIEFzIGFib3ZlLCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBwcmVzZW5jZSBvZiBYOyBpZiBhbm90aGVyCisJIyBicmFuY2ggaXMgYWxyZWFkeSBpbiB0aGUgcmVwb3NpdG9yeSBhbmQgcG9pbnRzIGF0IHNvbWUgb2YgdGhlIHJldmlzaW9ucworCSMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gb3V0cHV0IC0gd2UgZG9uJ3Qgd2FudCB0aGVtLiAgVGhlIHNvbHV0aW9uIGlzIGFzCisJIyBiZWZvcmU6IGdpdC1yZXYtcGFyc2Ugb3V0cHV0IGZpbHRlcmVkLgorCSMKKwkjIEZpbmFsbHksIHRhZ3M6CisJIyAgIDEgLS0tIDIgLS0tIE8gLS0tIFQgLS0tIDMgLS0tIDQgLS0tIE4KKwkjCisJIyBUYWdzIHB1c2hlZCBpbnRvIHRoZSByZXBvc2l0b3J5IGdlbmVyYXRlIG5pY2Ugc2hvcnRsb2cgZW1haWxzIHRoYXQKKwkjIHN1bW1hcmlzZSB0aGUgY29tbWl0cyBiZXR3ZWVuIHRoZW0gYW5kIHRoZSBwcmV2aW91cyB0YWcuICBIb3dldmVyLAorCSMgdGhvc2UgZW1haWxzIGRvbid0IGluY2x1ZGUgdGhlIGZ1bGwgY29tbWl0IG1lc3NhZ2VzIHRoYXQgd2Ugb3V0cHV0CisJIyBmb3IgYSBicmFuY2ggdXBkYXRlLiAgVGhlcmVmb3JlIHdlIHN0aWxsIHdhbnQgdG8gb3V0cHV0IHJldmlzaW9ucworCSMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IG9uIGEgdGFnIGVtYWlsLgorCSMKKwkjIEx1Y2tpbHksIGdpdC1yZXYtcGFyc2UgaW5jbHVkZXMganVzdCB0aGUgdG9vbC4gIEluc3RlYWQgb2YgdXNpbmcgIi0tYWxsIgorCSMgd2UgdXNlICItLWJyYW5jaGVzIjsgdGhpcyBoYXMgdGhlIGFkZGVkIGJlbmVmaXQgdGhhdCAicmVtb3Rlcy8iIHdpbGwKKwkjIGJlIGlnbm9yZWQgYXMgd2VsbC4KKworCSMgTGlzdCBhbGwgb2YgdGhlIHJldmlzaW9ucyB0aGF0IHdlcmUgcmVtb3ZlZCBieSB0aGlzIHVwZGF0ZSwgaW4gYSBmYXN0IGZvcndhcmQKKwkjIHVwZGF0ZSwgdGhpcyBsaXN0IHdpbGwgYmUgZW1wdHksIGJlY2F1c2UgcmV2LWxpc3QgTyBeTiBpcyBlbXB0eS4gIEZvciBhIG5vbgorCSMgZmFzdCBmb3J3YXJkLCBPIF5OIGlzIHRoZSBsaXN0IG9mIHJlbW92ZWQgcmV2aXNpb25zCisJZmFzdF9mb3J3YXJkPSIiCisJcmV2PSIiCisJZm9yIHJldiBpbiAkKGdpdCByZXYtbGlzdCAkbmV3cmV2Li4kb2xkcmV2KQorCWRvCisJCXJldnR5cGU9JChnaXQgY2F0LWZpbGUgLXQgIiRyZXYiKQorCQllY2hvICIgIGRpc2NhcmRzICAkcmV2ICgkcmV2dHlwZSkiCisJZG9uZQorCWlmIFsgLXogIiRyZXYiIF07IHRoZW4KKwkJZmFzdF9mb3J3YXJkPTEKKwlmaQorCisJIyBMaXN0IGFsbCB0aGUgcmV2aXNpb25zIGZyb20gYmFzZXJldiB0byBuZXdyZXYgaW4gYSBraW5kIG9mCisJIyAidGFibGUtb2YtY29udGVudHMiOyBub3RlIHRoaXMgbGlzdCBjYW4gaW5jbHVkZSByZXZpc2lvbnMgdGhhdCBoYXZlCisJIyBhbHJlYWR5IGhhZCBub3RpZmljYXRpb24gZW1haWxzIGFuZCBpcyBwcmVzZW50IHRvIHNob3cgdGhlIGZ1bGwgZGV0YWlsCisJIyBvZiB0aGUgY2hhbmdlIGZyb20gcm9sbGluZyBiYWNrIHRoZSBvbGQgcmV2aXNpb24gdG8gdGhlIGJhc2UgcmV2aXNpb24gYW5kCisJIyB0aGVuIGZvcndhcmQgdG8gdGhlIG5ldyByZXZpc2lvbgorCWZvciByZXYgaW4gJChnaXQgcmV2LWxpc3QgJG9sZHJldi4uJG5ld3JldikKKwlkbworCQlyZXZ0eXBlPSQoZ2l0IGNhdC1maWxlIC10ICIkcmV2IikKKwkJZWNobyAiICAgICAgIHZpYSAgJHJldiAoJHJldnR5cGUpIgorCWRvbmUKKworCWlmIFsgLXogIiRmYXN0Zm9yd2FyZCIgXTsgdGhlbgorCQllY2hvICIgICAgICBmcm9tICAkb2xkcmV2ICgkb2xkcmV2X3R5cGUpIgorCWVsc2UKKwkJIyAgMS4gRXhpc3RpbmcgcmV2aXNpb25zIHdlcmUgcmVtb3ZlZC4gIEluIHRoaXMgY2FzZSBuZXdyZXYgaXMgYQorCQkjICAgICBzdWJzZXQgb2Ygb2xkcmV2IC0gdGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBhIGZhc3QtZm9yd2FyZCwKKwkJIyAgICAgYSByZXdpbmQKKwkJIyAgMi4gTmV3IHJldmlzaW9ucyB3ZXJlIGFkZGVkIG9uIHRvcCBvZiBhbiBvbGQgcmV2aXNpb24sIHRoaXMgaXMKKwkJIyAgICAgYSByZXdpbmQgYW5kIGFkZGl0aW9uLgorCisJCSMgKDEpIGNlcnRhaW5seSBoYXBwZW5lZCwgKDIpIHBvc3NpYmx5LiAgV2hlbiAoMikgaGFzbid0IGhhcHBlbmVkLAorCQkjIHdlIHNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBubyBsb2cgcHJpbnRvdXQgaXMgcmVxdWlyZWQuCisKKwkJZWNobyAiIgorCisJCSMgRmluZCB0aGUgY29tbW9uIGFuY2VzdG9yIG9mIHRoZSBvbGQgYW5kIG5ldyByZXZpc2lvbnMgYW5kIGNvbXBhcmUKKwkJIyBpdCB3aXRoIG5ld3JldgorCQliYXNlcmV2PSQoZ2l0IG1lcmdlLWJhc2UgJG9sZHJldiAkbmV3cmV2KQorCQlyZXdpbmRfb25seT0iIgorCQlpZiBbICIkYmFzZXJldiIgPSAiJG5ld3JldiIgXTsgdGhlbgorCQkJZWNobyAiVGhpcyB1cGRhdGUgZGlzY2FyZGVkIGV4aXN0aW5nIHJldmlzaW9ucyBhbmQgbGVmdCB0aGUgYnJhbmNoIHBvaW50aW5nIGF0IgorCQkJZWNobyAiYSBwcmV2aW91cyBwb2ludCBpbiB0aGUgcmVwb3NpdG9yeSBoaXN0b3J5LiIKKwkJCWVjaG8gIiIKKwkJCWVjaG8gIiAqIC0tICogLS0gTiAoJG5ld3JldikiCisJCQllY2hvICIgICAgICAgICAgICBcXCIKKwkJCWVjaG8gIiAgICAgICAgICAgICBPIC0tIE8gLS0gTyAoJG9sZHJldikiCisJCQllY2hvICIiCisJCQllY2hvICJUaGUgcmVtb3ZlZCByZXZpc2lvbnMgYXJlIG5vdCBuZWNlc3NhcmlsbHkgZ29uZSAtIGlmIGFub3RoZXIgcmVmZXJlbmNlIgorCQkJZWNobyAic3RpbGwgcmVmZXJzIHRvIHRoZW0gdGhleSB3aWxsIHN0YXkgaW4gdGhlIHJlcG9zaXRvcnkuIgorCQkJcmV3aW5kX29ubHk9MQorCQllbHNlCisJCQllY2hvICJUaGlzIHVwZGF0ZSBhZGRlZCBuZXcgcmV2aXNpb25zIGFmdGVyIHVuZG9pbmcgZXhpc3RpbmcgcmV2aXNpb25zLiAgVGhhdCBpcyIKKwkJCWVjaG8gInRvIHNheSwgdGhlIG9sZCByZXZpc2lvbiBpcyBub3QgYSBzdHJpY3Qgc3Vic2V0IG9mIHRoZSBuZXcgcmV2aXNpb24uICBUaGlzIgorCQkJZWNobyAic2l0dWF0aW9uIG9jY3VycyB3aGVuIHlvdSAtLWZvcmNlIHB1c2ggYSBjaGFuZ2UgYW5kIGdlbmVyYXRlIGEgcmVwb3NpdG9yeSIKKwkJCWVjaG8gImNvbnRhaW5pbmcgc29tZXRoaW5nIGxpa2UgdGhpczoiCisJCQllY2hvICIiCisJCQllY2hvICIgKiAtLSAqIC0tIEIgLS0gTyAtLSBPIC0tIE8gKCRvbGRyZXYpIgorCQkJZWNobyAiICAgICAgICAgICAgXFwiCisJCQllY2hvICIgICAgICAgICAgICAgTiAtLSBOIC0tIE4gKCRuZXdyZXYpIgorCQkJZWNobyAiIgorCQkJZWNobyAiV2hlbiB0aGlzIGhhcHBlbnMgd2UgYXNzdW1lIHRoYXQgeW91J3ZlIGFscmVhZHkgaGFkIGFsZXJ0IGVtYWlscyBmb3IgYWxsIgorCQkJZWNobyAib2YgdGhlIE8gcmV2aXNpb25zLCBhbmQgc28gd2UgaGVyZSByZXBvcnQgb25seSB0aGUgcmV2aXNpb25zIGluIHRoZSBOIgorCQkJZWNobyAiYnJhbmNoIGZyb20gdGhlIGNvbW1vbiBiYXNlLCBCLiIKKwkJZmkKKwlmaQorCisJZWNobyAiIgorCWlmIFsgLXogIiRyZXdpbmRfb25seSIgXTsgdGhlbgorCQllY2hvICJUaG9zZSByZXZpc2lvbnMgbGlzdGVkIGFib3ZlIHRoYXQgYXJlIG5ldyB0byB0aGlzIHJlcG9zaXRvcnkgaGF2ZSIKKwkJZWNobyAibm90IGFwcGVhcmVkIG9uIGFueSBvdGhlciBub3RpZmljYXRpb24gZW1haWw7IHNvIHdlIGxpc3QgdGhvc2UiCisJCWVjaG8gInJldmlzaW9ucyBpbiBmdWxsLCBiZWxvdy4iCisKKwkJZWNobyAiIgorCQllY2hvICRMT0dCRUdJTgorCQlnaXQgcmV2LXBhcnNlIC0tbm90IC0tYnJhbmNoZXMgfCBncmVwIC12ICQoZ2l0IHJldi1wYXJzZSAkcmVmbmFtZSkgfAorCQlnaXQgcmV2LWxpc3QgLS1wcmV0dHkgLS1zdGRpbiAkb2xkcmV2Li4kbmV3cmV2CisKKwkJIyBYWFg6IE5lZWQgYSB3YXkgb2YgZGV0ZWN0aW5nIHdoZXRoZXIgZ2l0IHJldi1saXN0IGFjdHVhbGx5IG91dHB1dHRlZAorCQkjIGFueXRoaW5nLCBzbyB0aGF0IHdlIGNhbiBpc3N1ZSBhICJubyBuZXcgcmV2aXNpb25zIGFkZGVkIGJ5IHRoaXMKKwkJIyB1cGRhdGUiIG1lc3NhZ2UKKworCQllY2hvICRMT0dFTkQKKwllbHNlCisJCWVjaG8gIk5vIG5ldyByZXZpc2lvbnMgd2VyZSBhZGRlZCBieSB0aGlzIHVwZGF0ZS4iCisJZmkKKworCSMgVGhlIGRpZmZzdGF0IGlzIHNob3duIGZyb20gdGhlIG9sZCByZXZpc2lvbiB0byB0aGUgbmV3IHJldmlzaW9uLiAgVGhpcworCSMgaXMgdG8gc2hvdyB0aGUgdHJ1dGggb2Ygd2hhdCBoYXBwZW5lZCBpbiB0aGlzIGNoYW5nZS4gIFRoZXJlJ3Mgbm8gcG9pbnQKKwkjIHNob3dpbmcgdGhlIHN0YXQgZnJvbSB0aGUgYmFzZSB0byB0aGUgbmV3IHJldmlzaW9uIGJlY2F1c2UgdGhlIGJhc2UKKwkjIGlzIGVmZmVjdGl2ZWx5IGEgcmFuZG9tIHJldmlzaW9uIGF0IHRoaXMgcG9pbnQgLSB0aGUgdXNlciB3aWxsIGJlCisJIyBpbnRlcmVzdGVkIGluIHdoYXQgdGhpcyByZXZpc2lvbiBjaGFuZ2VkIC0gaW5jbHVkaW5nIHRoZSB1bmRvaW5nIG9mCisJIyBwcmV2aW91cyByZXZpc2lvbnMgaW4gdGhlIGNhc2Ugb2Ygbm9uLWZhc3QgZm9yd2FyZCB1cGRhdGVzLgorCWVjaG8gIiIKKwllY2hvICJTdW1tYXJ5IG9mIGNoYW5nZXM6IgorCWdpdCBkaWZmLXRyZWUgLS1zdGF0IC0tc3VtbWFyeSAtLWZpbmQtY29waWVzLWhhcmRlciAkb2xkcmV2Li4kbmV3cmV2Cit9CisKKyMKKyMgQ2FsbGVkIGZvciB0aGUgZGVsZXRpb24gb2YgYSBicmFuY2gKKyMKK2dlbmVyYXRlX2RlbGV0ZV9icmFuY2hfZW1haWwoKQoreworCWVjaG8gIiAgICAgICB3YXMgICRvbGRyZXYiCisJZWNobyAiIgorCWVjaG8gJExPR0VORAorCWdpdCBzaG93IC1zIC0tcHJldHR5PW9uZWxpbmUgJG9sZHJldgorCWVjaG8gJExPR0VORAorfQorCisjIC0tLS0tLS0tLS0tLS0tLSBBbm5vdGF0ZWQgdGFncworCisjCisjIENhbGxlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGFuIGFubm90YXRlZCB0YWcKKyMKK2dlbmVyYXRlX2NyZWF0ZV9hdGFnX2VtYWlsKCkKK3sKKwllY2hvICIgICAgICAgIGF0ICAkbmV3cmV2ICgkbmV3cmV2X3R5cGUpIgorCisJZ2VuZXJhdGVfYXRhZ19lbWFpbAorfQorCisjCisjIENhbGxlZCBmb3IgdGhlIHVwZGF0ZSBvZiBhbiBhbm5vdGF0ZWQgdGFnICh0aGlzIGlzIHByb2JhYmx5IGEgcmFyZSBldmVudAorIyBhbmQgbWF5IG5vdCBldmVuIGJlIGFsbG93ZWQpCisjCitnZW5lcmF0ZV91cGRhdGVfYXRhZ19lbWFpbCgpCit7CisJZWNobyAiICAgICAgICB0byAgJG5ld3JldiAoJG5ld3Jldl90eXBlKSIKKwllY2hvICIgICAgICBmcm9tICAkb2xkcmV2ICh3aGljaCBpcyBub3cgb2Jzb2xldGUpIgorCisJZ2VuZXJhdGVfYXRhZ19lbWFpbAorfQorCisjCisjIENhbGxlZCB3aGVuIGFuIGFubm90YXRlZCB0YWcgaXMgY3JlYXRlZCBvciBjaGFuZ2VkCisjCitnZW5lcmF0ZV9hdGFnX2VtYWlsKCkKK3sKKwkjIFVzZSBnaXQtZm9yLWVhY2gtcmVmIHRvIHB1bGwgb3V0IHRoZSBpbmRpdmlkdWFsIGZpZWxkcyBmcm9tIHRoZSB0YWcKKwlldmFsICQoZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PScKKwl0YWdvYmplY3Q9JSgqb2JqZWN0bmFtZSkKKwl0YWd0eXBlPSUoKm9iamVjdHR5cGUpCisJdGFnZ2VyPSUodGFnZ2VybmFtZSkKKwl0YWdnZWQ9JSh0YWdnZXJkYXRlKScgJHJlZm5hbWUKKwkpCisKKwllY2hvICIgICB0YWdnaW5nICAkdGFnb2JqZWN0ICgkdGFndHlwZSkiCisJY2FzZSAiJHRhZ3R5cGUiIGluCisJY29tbWl0KQorCQkjIElmIHRoZSB0YWdnZWQgb2JqZWN0IGlzIGEgY29tbWl0LCB0aGVuIHdlIGFzc3VtZSB0aGlzIGlzIGEKKwkJIyByZWxlYXNlLCBhbmQgc28gd2UgY2FsY3VsYXRlIHdoaWNoIHRhZyB0aGlzIHRhZyBpcyByZXBsYWNpbmcKKwkJcHJldnRhZz0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj0wICRuZXdyZXZeIDI+L2Rldi9udWxsKQorCisJCWlmIFsgLW4gIiRwcmV2dGFnIiBdOyB0aGVuCisJCQllY2hvICIgIHJlcGxhY2VzICAkcHJldnRhZyIKKwkJZmkKKwkJOzsKKwkqKQorCQllY2hvICIgICAgbGVuZ3RoICAkKGdpdCBjYXQtZmlsZSAtcyAkdGFnb2JqZWN0KSBieXRlcyIKKwkJOzsKKwllc2FjCisJZWNobyAiIHRhZ2dlZCBieSAgJHRhZ2dlciIKKwllY2hvICIgICAgICAgIG9uICAkdGFnZ2VkIgorCisJZWNobyAiIgorCWVjaG8gJExPR0JFR0lOCisKKwkjIFNob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBtZXNzYWdlOyB0aGlzIG1pZ2h0IGNvbnRhaW4gYSBjaGFuZ2UgbG9nCisJIyBvciByZWxlYXNlIG5vdGVzIHNvIGlzIHdvcnRoIGRpc3BsYXlpbmcuCisJZ2l0IGNhdC1maWxlIHRhZyAkbmV3cmV2IHwgc2VkIC1lICcxLC9eJC9kJworCisJZWNobyAiIgorCWNhc2UgIiR0YWd0eXBlIiBpbgorCWNvbW1pdCkKKwkJIyBPbmx5IGNvbW1pdCB0YWdzIG1ha2Ugc2Vuc2UgdG8gaGF2ZSByZXYtbGlzdCBvcGVyYXRpb25zIHBlcmZvcm1lZAorCQkjIG9uIHRoZW0KKwkJaWYgWyAtbiAiJHByZXZ0YWciIF07IHRoZW4KKwkJCSMgU2hvdyBjaGFuZ2VzIHNpbmNlIHRoZSBwcmV2aW91cyByZWxlYXNlCisJCQlnaXQgcmV2LWxpc3QgLS1wcmV0dHk9c2hvcnQgIiRwcmV2dGFnLi4kbmV3cmV2IiB8IGdpdCBzaG9ydGxvZworCQllbHNlCisJCQkjIE5vIHByZXZpb3VzIHRhZywgc2hvdyBhbGwgdGhlIGNoYW5nZXMgc2luY2UgdGltZSBiZWdhbgorCQkJZ2l0IHJldi1saXN0IC0tcHJldHR5PXNob3J0ICRuZXdyZXYgfCBnaXQgc2hvcnRsb2cKKwkJZmkKKwkJOzsKKwkqKQorCQkjIFhYWDogSXMgdGhlcmUgYW55dGhpbmcgdXNlZnVsIHdlIGNhbiBkbyBmb3Igbm9uLWNvbW1pdCBvYmplY3RzPworCQk7OworCWVzYWMKKworCWVjaG8gJExPR0VORAorfQorCisjCisjIENhbGxlZCBmb3IgdGhlIGRlbGV0aW9uIG9mIGFuIGFubm90YXRlZCB0YWcKKyMKK2dlbmVyYXRlX2RlbGV0ZV9hdGFnX2VtYWlsKCkKK3sKKwllY2hvICIgICAgICAgd2FzICAkb2xkcmV2IgorCWVjaG8gIiIKKwllY2hvICRMT0dFTkQKKwlnaXQgc2hvdyAtcyAtLXByZXR0eT1vbmVsaW5lICRvbGRyZXYKKwllY2hvICRMT0dFTkQKK30KKworIyAtLS0tLS0tLS0tLS0tLS0gR2VuZXJhbCByZWZlcmVuY2VzCisKKyMKKyMgQ2FsbGVkIHdoZW4gYW55IG90aGVyIHR5cGUgb2YgcmVmZXJlbmNlIGlzIGNyZWF0ZWQgKG1vc3QgbGlrZWx5IGEKKyMgbm9uLWFubm90YXRlZCB0YWcpCisjCitnZW5lcmF0ZV9jcmVhdGVfZ2VuZXJhbF9lbWFpbCgpCit7CisJZWNobyAiICAgICAgICBhdCAgJG5ld3JldiAoJG5ld3Jldl90eXBlKSIKKworCWdlbmVyYXRlX2dlbmVyYWxfZW1haWwKK30KKworIworIyBDYWxsZWQgd2hlbiBhbnkgb3RoZXIgdHlwZSBvZiByZWZlcmVuY2UgaXMgdXBkYXRlZCAobW9zdCBsaWtlbHkgYQorIyBub24tYW5ub3RhdGVkIHRhZykKKyMKK2dlbmVyYXRlX3VwZGF0ZV9nZW5lcmFsX2VtYWlsKCkKK3sKKwllY2hvICIgICAgICAgIHRvICAkbmV3cmV2ICgkbmV3cmV2X3R5cGUpIgorCWVjaG8gIiAgICAgIGZyb20gICRvbGRyZXYiCisKKwlnZW5lcmF0ZV9nZW5lcmFsX2VtYWlsCit9CisKKyMKKyMgQ2FsbGVkIGZvciBjcmVhdGlvbiBvciB1cGRhdGUgb2YgYW55IG90aGVyIHR5cGUgb2YgcmVmZXJlbmNlCisjCitnZW5lcmF0ZV9nZW5lcmFsX2VtYWlsKCkKK3sKKwkjIFVuYW5ub3RhdGVkIHRhZ3MgYXJlIG1vcmUgYWJvdXQgbWFya2luZyBhIHBvaW50IHRoYW4gcmVsZWFzaW5nIGEgdmVyc2lvbjsKKwkjIHRoZXJlZm9yZSB3ZSBkb24ndCBkbyB0aGUgc2hvcnRsb2cgc3VtbWFyeSB0aGF0IHdlIGRvIGZvciBhbm5vdGF0ZWQgdGFncworCSMgYWJvdmUgLSB3ZSBzaW1wbHkgc2hvdyB0aGF0IHRoZSBwb2ludCBoYXMgYmVlbiBtYXJrZWQsIGFuZCBwcmludCB0aGUgbG9nCisJIyBtZXNzYWdlIGZvciB0aGUgbWFya2VkIHBvaW50IGZvciByZWZlcmVuY2UgcHVycG9zZXMKKwkjCisJIyBOb3RlIHRoaXMgc2VjdGlvbiBhbHNvIGNhdGNoZXMgYW55IG90aGVyIHJlZmVyZW5jZSB0eXBlIChhbHRob3VnaCB0aGVyZQorCSMgYXJlbid0IGFueSkgYW5kIGRlYWxzIHdpdGggdGhlbSBpbiB0aGUgc2FtZSB3YXkuCisKKwllY2hvICIiCisJaWYgWyAiJG5ld3Jldl90eXBlIiA9ICJjb21taXQiIF07IHRoZW4KKwkJZWNobyAkTE9HQkVHSU4KKwkJZ2l0IHNob3cgLS1uby1jb2xvciAtLXJvb3QgLXMgJG5ld3JldgorCQllY2hvICRMT0dFTkQKKwllbHNlCisJCSMgV2hhdCBjYW4gd2UgZG8gaGVyZT8gIFRoZSB0YWcgbWFya3MgYW4gb2JqZWN0IHRoYXQgaXMgbm90IGEgY29tbWl0LAorCQkjIHNvIHRoZXJlIGlzIG5vIGxvZyBmb3IgdXMgdG8gZGlzcGxheS4gIEl0J3MgcHJvYmFibHkgbm90IHdpc2UgdG8KKwkJIyBvdXRwdXQgZ2l0LWNhdC1maWxlIGFzIGl0IGNvdWxkIGJlIGEgYmluYXJ5IGJsb2IuICBXZSdsbCBqdXN0IHNheSBob3cKKwkJIyBiaWcgaXQgaXMKKwkJZWNobyAiJG5ld3JldiBpcyBhICRuZXdyZXZfdHlwZSwgYW5kIGlzICQoZ2l0IGNhdC1maWxlIC1zICRuZXdyZXYpIGJ5dGVzIGxvbmcuIgorCWZpCit9CisKKyMKKyMgQ2FsbGVkIGZvciB0aGUgZGVsZXRpb24gb2YgYW55IG90aGVyIHR5cGUgb2YgcmVmZXJlbmNlCisjCitnZW5lcmF0ZV9kZWxldGVfZ2VuZXJhbF9lbWFpbCgpCit7CisJZWNobyAiICAgICAgIHdhcyAgJG9sZHJldiIKKwllY2hvICIiCisJZWNobyAkTE9HRU5ECisJZ2l0IHNob3cgLXMgLS1wcmV0dHk9b25lbGluZSAkb2xkcmV2CisJZWNobyAkTE9HRU5ECit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYWluKCkKKworIyAtLS0gQ29uc3RhbnRzCitFTUFJTFBSRUZJWD0iW1NDTV0gIgorTE9HQkVHSU49Ii0gTG9nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorTE9HRU5EPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworIyAtLS0gQ29uZmlnCisjIFNldCBHSVRfRElSIGVpdGhlciBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgb3IgZnJvbSB0aGUgZW52aXJvbm1lbnQKKyMgdmFyaWFibGUuCitHSVRfRElSPSQoZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIgMj4vZGV2L251bGwpCitpZiBbIC16ICIkR0lUX0RJUiIgXTsgdGhlbgorCWVjaG8gPiYyICJmYXRhbDogcG9zdC1yZWNlaXZlOiBHSVRfRElSIG5vdCBzZXQiCisJZXhpdCAxCitmaQorCitwcm9qZWN0ZGVzYz0kKHNlZCAtbmUgJzFwJyAiJEdJVF9ESVIvZGVzY3JpcHRpb24iKQorIyBDaGVjayBpZiB0aGUgZGVzY3JpcHRpb24gaXMgdW5jaGFuZ2VkIGZyb20gaXQncyBkZWZhdWx0LCBhbmQgc2hvcnRlbiBpdCB0byBhCisjIG1vcmUgbWFuYWdlYWJsZSBsZW5ndGggaWYgaXQgaXMKK2lmIGV4cHIgIiRwcm9qZWN0ZGVzYyIgOiAiVW5uYW1lZCByZXBvc2l0b3J5LiokIiA+L2Rldi9udWxsCit0aGVuCisJcHJvamVjdGRlc2M9IlVOTkFNRUQgUFJPSkVDVCIKK2ZpCisKK3JlY2lwaWVudHM9JChnaXQgcmVwby1jb25maWcgaG9va3MubWFpbGluZ2xpc3QpCithbm5vdW5jZXJlY2lwaWVudHM9JChnaXQgcmVwby1jb25maWcgaG9va3MuYW5ub3VuY2VsaXN0KQorZW52ZWxvcGVzZW5kZXI9JChnaXQtcmVwby1jb25maWcgaG9va3MuZW52ZWxvcGVzZW5kZXIpCisKKyMgLS0tIE1haW4gbG9vcAorIyBBbGxvdyBkdWFsIG1vZGU6IHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUganVzdCBsaWtlIHRoZSB1cGRhdGUgaG9vaywgb3IgaWYKKyMgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiB0aGVuIHJ1biBhcyBhIGhvb2sgc2NyaXB0CitpZiBbIC1uICIkMSIgLWEgLW4gIiQyIiAtYSAtbiAiJDMiIF07IHRoZW4KKwkjIE91dHB1dCB0byB0aGUgdGVybWluYWwgaW4gY29tbWFuZCBsaW5lIG1vZGUgLSBpZiBzb21lb25lIHdhbnRlZCB0bworCSMgcmVzZW5kIGFuIGVtYWlsOyB0aGV5IGNvdWxkIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gc2VuZG1haWwgdGhlbXNlbHZlcworCVBBR0VSPSBnZW5lcmF0ZV9lbWFpbCAkMiAkMyAkMQorZWxzZQorCWlmIFsgLW4gIiRlbnZlbG9wZXNlbmRlciIgXTsgdGhlbgorCQllbnZlbG9wZXNlbmRlcj0iLWYgJyRlbnZlbG9wZXNlbmRlciciCisJZmkKKworCXdoaWxlIHJlYWQgb2xkcmV2IG5ld3JldiByZWZuYW1lCisJZG8KKwkJZ2VuZXJhdGVfZW1haWwgJG9sZHJldiAkbmV3cmV2ICRyZWZuYW1lIHwKKwkJL3Vzci9zYmluL3NlbmRtYWlsIC10ICRlbnZlbG9wZXNlbmRlcgorCWRvbmUKK2ZpCmRpZmYgLS1naXQgYS9jb250cmliL2hvb2tzL3VwZGF0ZS1wYXJhbm9pZCBiL2NvbnRyaWIvaG9va3MvdXBkYXRlLXBhcmFub2lkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTE4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2hvb2tzL3VwZGF0ZS1wYXJhbm9pZApAQCAtMCwwICsxLDI4NCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgRmlsZTo6U3BlYzsKKworJEVOVntQQVRIfSAgICAgPSAnL29wdC9naXQvYmluJzsKK215ICRhY2xfZ2l0ICAgID0gJy92Y3MvYWNscy5naXQnOworbXkgJGFjbF9icmFuY2ggPSAncmVmcy9oZWFkcy9tYXN0ZXInOworbXkgJGRlYnVnICAgICAgPSAwOworCis9ZG9jCitJbnZva2VkIGFzOiB1cGRhdGUgcmVmbmFtZSBvbGQtc2hhMSBuZXctc2hhMQorCitUaGlzIHNjcmlwdCBpcyBydW4gYnkgZ2l0LXJlY2VpdmUtcGFjayBvbmNlIGZvciBlYWNoIHJlZiB0aGF0IHRoZQorY2xpZW50IGlzIHRyeWluZyB0byBtb2RpZnkuICBJZiB3ZSBleGl0IHdpdGggYSBub24temVybyBleGl0IHZhbHVlCit0aGVuIHRoZSB1cGRhdGUgZm9yIHRoYXQgcGFydGljdWxhciByZWYgaXMgZGVuaWVkLCBidXQgdXBkYXRlcyBmb3IKK290aGVyIHJlZnMgaW4gdGhlIHNhbWUgcnVuIG9mIHJlY2VpdmUtcGFjayBtYXkgc3RpbGwgYmUgYWxsb3dlZC4KKworV2UgYXJlIHJ1biBhZnRlciB0aGUgb2JqZWN0cyBoYXZlIGJlZW4gdXBsb2FkZWQsIGJ1dCBiZWZvcmUgdGhlCityZWYgaXMgYWN0dWFsbHkgbW9kaWZpZWQuICBXZSB0YWtlIGFkdmFudGFnZSBvZiB0aGF0IGZhY3Qgd2hlbiB3ZQorbG9vayBmb3IgIm5ldyIgY29tbWl0cyBhbmQgdGFncyAodGhlIG5ldyBvYmplY3RzIHdvbid0IHNob3cgdXAgaW4KK2ByZXYtbGlzdCAtLWFsbGApLgorCitUaGlzIHNjcmlwdCBsb2FkcyBhbmQgcGFyc2VzIHRoZSBjb250ZW50IG9mIHRoZSBjb25maWcgZmlsZQorInVzZXJzLyR0aGlzX3VzZXIuYWNsIiBmcm9tIHRoZSAkYWNsX2JyYW5jaCBjb21taXQgb2YgJGFjbF9naXQgT0RCLgorVGhlIGFjbCBmaWxlIGlzIGEgZ2l0LWNvbmZpZyBzdHlsZSBmaWxlLCBidXQgdXNlcyBhIHNsaWdodGx5IG1vcmUKK3Jlc3RyaWN0ZWQgc3ludGF4IGFzIHRoZSBQZXJsIHBhcnNlciBjb250YWluZWQgd2l0aGluIHRoaXMgc2NyaXB0CitpcyBub3QgbmVhcmx5IGFzIHBlcm1pc3NpdmUgYXMgZ2l0LWNvbmZpZy4KKworRXhhbXBsZToKKworICBbdXNlcl0KKyAgICBjb21taXR0ZXIgPSBKb2huIERvZSA8am9obi5kb2VAZXhhbXBsZS5jb20+CisgICAgY29tbWl0dGVyID0gSm9obiBSLiBEb2UgPGpvaG4uZG9lQGV4YW1wbGUuY29tPgorCisgIFtyZXBvc2l0b3J5ICJhY2xzIl0KKyAgICBhbGxvdyA9IGhlYWRzL21hc3RlcgorICAgIGFsbG93ID0gQ0RVUiBmb3IgaGVhZHMvamQvCisgICAgYWxsb3cgPSBDICAgIGZvciBedGFncy92XFxkKyQKKworRm9yIGFsbCBuZXcgY29tbWl0IG9yIHRhZyBvYmplY3RzIHRoZSBjb21taXR0ZXIgKG9yIHRhZ2dlcikgbGluZQord2l0aGluIHRoZSBvYmplY3QgbXVzdCBleGFjdGx5IG1hdGNoIG9uZSBvZiB0aGUgdXNlci5jb21taXR0ZXIKK3ZhbHVlcyBsaXN0ZWQgaW4gdGhlIGFjbCBmaWxlICgiSEVBRDp1c2Vycy8kdGhpc191c2VyLmFjbCIpLgorCitGb3IgYSBicmFuY2ggdG8gYmUgbW9kaWZpZWQgYW4gYWxsb3cgbGluZSB3aXRoaW4gdGhlIG1hdGNoaW5nCityZXBvc2l0b3J5IHNlY3Rpb24gbXVzdCBiZSBtYXRjaGVkIGZvciBib3RoIHRoZSByZWZuYW1lIGFuZCB0aGUKK29wY29kZS4KKworUmVwb3NpdG9yeSBzZWN0aW9ucyBhcmUgbWF0Y2hlZCBvbiB0aGUgYmFzZW5hbWUgb2YgdGhlIHJlcG9zaXRvcnkKKyhhZnRlciByZW1vdmluZyB0aGUgLmdpdCBzdWZmaXgpLgorCitUaGUgb3Bjb2RlIGFiYnJldmF0aW9ucyBhcmU6CisKKyAgQzogY3JlYXRlIG5ldyByZWYKKyAgRDogZGVsZXRlIGV4aXN0aW5nIHJlZgorICBVOiBmYXN0LWZvcndhcmQgZXhpc3RpbmcgcmVmIChubyBjb21taXQgbG9zcykKKyAgUjogcmV3aW5kL3JlYmFzZSBleGlzdGluZyByZWYgKGNvbW1pdCBsb3NzKQorCitpZiBubyBvcGNvZGVzIGFyZSBsaXN0ZWQgYmVmb3JlIHRoZSAiZm9yIiBrZXl3b3JkIHRoZW4gIlUiIChmb3IKK2Zhc3QtZm9yd2FyZCB1cGRhdGUgb25seSkgaXMgYXNzdW1lZCBhcyB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbgordXNhZ2UuCisKK1JlZm5hbWVzIGFyZSBtYXRjaGVkIGJ5IGFsd2F5cyBhc3N1bWluZyBhIHByZWZpeCBvZiAicmVmcy8iLgorVGhpcyBob29rIGZvcmJpZHMgcHVzaGluZyBvciBkZWxldGluZyBhbnl0aGluZyBub3QgdW5kZXIgInJlZnMvIi4KKworUmVmbmFtZXMgdGhhdCBzdGFydCB3aXRoIF4gYXJlIFBlcmwgcmVndWxhciBleHByZXNzaW9ucywgYW5kIHRoZSBeCitpcyBrZXB0IGFzIHBhcnQgb2YgdGhlIHJlZ2V4cC4gIFxcIGlzIG5lZWRlZCB0byBnZXQganVzdCBvbmUgXCwgc28KK1xcZCBleHBhbmRzIHRvIFxkIGluIFBlcmwuICBUaGUgM3JkIGFsbG93IGxpbmUgYWJvdmUgaXMgYW4gZXhhbXBsZS4KKworUmVmbmFtZXMgdGhhdCBkb24ndCBzdGFydCB3aXRoIF4gYnV0IHRoYXQgZW5kIHdpdGggLyBhcmUgcHJlZml4CittYXRjaGVzICgybmQgYWxsb3cgbGluZSBhYm92ZSk7IGFsbCBvdGhlciByZWZuYW1lcyBhcmUgc3RyaWN0CitlcXVhbGl0eSBtYXRjaGVzICgxc3QgYWxsb3cgbGluZSkuCisKK0FueXRoaW5nIHB1c2hlZCB0byAiaGVhZHMvIiAob2ssIHJlYWxseSAicmVmcy9oZWFkcy8iKSBtdXN0IGJlCithIGNvbW1pdC4gIFRhZ3MgYXJlIG5vdCBwZXJtaXR0ZWQgaGVyZS4KKworQW55dGhpbmcgcHVzaGVkIHRvICJ0YWdzLyIgKGVyciwgcmVhbGx5ICJyZWZzL3RhZ3MvIikgbXVzdCBiZSBhbgorYW5ub3RhdGVkIHRhZy4gIENvbW1pdHMsIGJsb2JzLCB0cmVlcywgZXRjLiBhcmUgbm90IHBlcm1pdHRlZCBoZXJlLgorQW5ub3RhdGVkIHRhZyBzaWduYXR1cmVzIGFyZW4ndCBjaGVja2VkLCBub3IgYXJlIHRoZXkgcmVxdWlyZWQuCisKK1RoZSBzcGVjaWFsIHN1YnJlcG9zaXRvcnkgb2YgJ2luZm8vbmV3LWNvbW1pdC1jaGVjaycgY2FuCitiZSBjcmVhdGVkIGFuZCB1c2VkIHRvIGFsbG93IHVzZXJzIHRvIHB1c2ggbmV3IGNvbW1pdHMgYW5kCit0YWdzIGZyb20gYW5vdGhlciBsb2NhbCByZXBvc2l0b3J5IHRvIHRoaXMgb25lLCBldmVuIGlmIHRoZXkKK2FyZW4ndCB0aGUgY29tbWl0dGVyL3RhZ2dlciBvZiB0aG9zZSBvYmplY3RzLiAgSW4gYSBudXQgc2hlbGwKK3RoZSBpbmZvL25ldy1jb21taXQtY2hlY2sgZGlyZWN0b3J5IGlzIGEgR2l0IHJlcG9zaXRvcnkgd2hvc2UKK29iamVjdHMvaW5mby9hbHRlcm5hdGVzIGZpbGUgbGlzdHMgdGhpcyByZXBvc2l0b3J5IGFuZCBhbGwgb3RoZXIKK3Bvc3NpYmxlIHNvdXJjZXMsIGFuZCB3aG9zZSByZWZzIHN1YmRpcmVjdG9yeSBjb250YWlucyBzeW1saW5rcwordG8gdGhpcyByZXBvc2l0b3J5J3MgcmVmcyBzdWJkaXJlY3RvcnksIGFuZCB0byBhbGwgb3RoZXIgcG9zc2libGUKK3NvdXJjZXMgcmVmcyBzdWJkaXJlY3Rvcmllcy4gIFllcywgdGhpcyBtZWFucyB0aGF0IHlvdSBjYW5ub3QKK3VzZSBwYWNrZWQtcmVmcyBpbiB0aG9zZSByZXBvc2l0b3JpZXMgYXMgdGhleSB3b24ndCBiZSByZXNvbHZlZAorY29ycmVjdGx5LgorCis9Y3V0CisKK215ICRnaXRfZGlyID0gJEVOVntHSVRfRElSfTsKK215ICRuZXdfY29tbWl0X2NoZWNrID0gIiRnaXRfZGlyL2luZm8vbmV3LWNvbW1pdC1jaGVjayI7CitteSAkcmVmID0gJEFSR1ZbMF07CitteSAkb2xkID0gJEFSR1ZbMV07CitteSAkbmV3ID0gJEFSR1ZbMl07CitteSAkbmV3X3R5cGU7CitteSAoJHRoaXNfdXNlcikgPSBnZXRwd3VpZCAkPDsgIyBSRUFMX1VTRVJfSUQKK215ICRyZXBvc2l0b3J5X25hbWU7CitteSAldXNlcl9jb21taXR0ZXI7CitteSBAYWxsb3dfcnVsZXM7CisKK3N1YiBkZW55ICgkKSB7CisJcHJpbnQgU1RERVJSICItRGVueS0gICAgJF9bMF1cbiIgaWYgJGRlYnVnOworCXByaW50IFNUREVSUiAiXG5kZW5pZWQ6ICRfWzBdXG5cbiI7CisJZXhpdCAxOworfQorCitzdWIgZ3JhbnQgKCQpIHsKKwlwcmludCBTVERFUlIgIi1HcmFudC0gICAkX1swXVxuIiBpZiAkZGVidWc7CisJZXhpdCAwOworfQorCitzdWIgaW5mbyAoJCkgeworCXByaW50IFNUREVSUiAiLUluZm8tICAgICRfWzBdXG4iIGlmICRkZWJ1ZzsKK30KKworc3ViIHBhcnNlX2NvbmZpZyAoJCQpIHsKKwlteSAoJGRhdGEsICRmbikgPSBAXzsKKwlpbmZvICJMb2FkaW5nICRmbiI7CisJb3BlbihJLCctfCcsJ2dpdCcsIi0tZ2l0LWRpcj0kYWNsX2dpdCIsJ2NhdC1maWxlJywnYmxvYicsJGZuKTsKKwlteSAkc2VjdGlvbiA9ICcnOworCXdoaWxlICg8ST4pIHsKKwkJY2hvbXA7CisJCWlmICgvXlxzKiQvIHx8IC9eXHMqIy8pIHsKKwkJfSBlbHNpZiAoL15cWyhbYS16XSspXF0kL2kpIHsKKwkJCSRzZWN0aW9uID0gJDE7CisJCX0gZWxzaWYgKC9eXFsoW2Etel0rKVxzKyIoLiopIlxdJC9pKSB7CisJCQkkc2VjdGlvbiA9ICIkMS4kMiI7CisJCX0gZWxzaWYgKC9eXHMqKFthLXpdW2EtejAtOV0rKVxzKj1ccyooLio/KVxzKiQvaSkgeworCQkJcHVzaCBAeyRkYXRhLT57IiRzZWN0aW9uLiQxIn19LCAkMjsKKwkJfSBlbHNlIHsKKwkJCWRlbnkgImJhZCBjb25maWcgZmlsZSBsaW5lICQuIGluICRmbiI7CisJCX0KKwl9CisJY2xvc2UgSTsKK30KKworc3ViIGFsbF9uZXdfY29tbWl0dGVycyAoKSB7CisJbG9jYWwgJEVOVntHSVRfRElSfSA9ICRnaXRfZGlyOworCSRFTlZ7R0lUX0RJUn0gPSAkbmV3X2NvbW1pdF9jaGVjayBpZiAtZCAkbmV3X2NvbW1pdF9jaGVjazsKKworCWluZm8gIkdldHRpbmcgY29tbWl0dGVycyBvZiBuZXcgY29tbWl0cy4iOworCW15ICV1c2VkOworCW9wZW4oVCwnLXwnLCdnaXQnLCdyZXYtbGlzdCcsJy0tcHJldHR5PXJhdycsJG5ldywnLS1ub3QnLCctLWFsbCcpOworCXdoaWxlICg8VD4pIHsKKwkJbmV4dCB1bmxlc3Mgcy9eY29tbWl0dGVyIC8vOworCQljaG9wOworCQlzLz4uKiQvPi87CisJCWluZm8gIkZvdW5kICRfLiIgdW5sZXNzICR1c2VkeyRffSsrOworCX0KKwljbG9zZSBUOworCWluZm8gIk5vIG5ldyBjb21taXRzLiIgdW5sZXNzICV1c2VkOworCWtleXMgJXVzZWQ7Cit9CisKK3N1YiBhbGxfbmV3X3RhZ2dlcnMgKCkgeworCW15ICVleGlzdHM7CisJb3BlbihULCctfCcsJ2dpdCcsJ2Zvci1lYWNoLXJlZicsJy0tZm9ybWF0PSUob2JqZWN0bmFtZSknLCdyZWZzL3RhZ3MnKTsKKwl3aGlsZSAoPFQ+KSB7CisJCWNob3A7CisJCSRleGlzdHN7JF99ID0gMTsKKwl9CisJY2xvc2UgVDsKKworCWluZm8gIkdldHRpbmcgdGFnZ2VycyBvZiBuZXcgdGFncy4iOworCW15ICV1c2VkOworCW15ICRvYmogPSAkbmV3OworCW15ICRvYmpfdHlwZSA9ICRuZXdfdHlwZTsKKwl3aGlsZSAoJG9ial90eXBlIGVxICd0YWcnKSB7CisJCWxhc3QgaWYgJGV4aXN0c3skb2JqfTsKKwkJJG9ial90eXBlID0gJyc7CisJCW9wZW4oVCwnLXwnLCdnaXQnLCdjYXQtZmlsZScsJ3RhZycsJG9iaik7CisJCXdoaWxlICg8VD4pIHsKKwkJCWNob3A7CisJCQlpZiAoL15vYmplY3QgKFthLXowLTldezQwfSkkLykgeworCQkJCSRvYmogPSAkMTsKKwkJCX0gZWxzaWYgKC9edHlwZSAoLispJC8pIHsKKwkJCQkkb2JqX3R5cGUgPSAkMTsKKwkJCX0gZWxzaWYgKHMvXnRhZ2dlciAvLykgeworCQkJCXMvPi4qJC8+LzsKKwkJCQlpbmZvICJGb3VuZCAkXy4iIHVubGVzcyAkdXNlZHskX30rKzsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWNsb3NlIFQ7CisJfQorCWluZm8gIk5vIG5ldyB0YWdzLiIgdW5sZXNzICV1c2VkOworCWtleXMgJXVzZWQ7Cit9CisKK3N1YiBjaGVja19jb21taXR0ZXJzIChAKSB7CisJbXkgQGJhZDsKKwlmb3JlYWNoIChAXykgeyBwdXNoIEBiYWQsICRfIHVubGVzcyAkdXNlcl9jb21taXR0ZXJ7JF99OyB9CisJaWYgKEBiYWQpIHsKKwkJcHJpbnQgU1RERVJSICJcbiI7CisJCXByaW50IFNUREVSUiAiWW91IGFyZSBub3QgJF8uXG4iIGZvcmVhY2ggKHNvcnQgQGJhZCk7CisJCWRlbnkgIllvdSBjYW5ub3QgcHVzaCBjaGFuZ2VzIG5vdCBjb21taXR0ZWQgYnkgeW91LiI7CisJfQorfQorCitzdWIgZ2l0X3ZhbHVlIChAKSB7CisJb3BlbihULCctfCcsJ2dpdCcsQF8pOyBsb2NhbCAkXyA9IDxUPjsgY2hvcDsgY2xvc2UgVDsKKwkkXzsKK30KKworZGVueSAiTm8gR0lUX0RJUiBpbmhlcml0ZWQgZnJvbSBjYWxsZXIiIHVubGVzcyAkZ2l0X2RpcjsKK2RlbnkgIk5lZWQgYSByZWYgbmFtZSIgdW5sZXNzICRyZWY7CitkZW55ICJSZWZ1c2luZyBmdW5ueSByZWYgJHJlZiIgdW5sZXNzICRyZWYgPX4gcyxecmVmcy8sLDsKK2RlbnkgIkJhZCBvbGQgdmFsdWUgJG9sZCIgdW5sZXNzICRvbGQgPX4gL15bYS16MC05XXs0MH0kLzsKK2RlbnkgIkJhZCBuZXcgdmFsdWUgJG5ldyIgdW5sZXNzICRuZXcgPX4gL15bYS16MC05XXs0MH0kLzsKK2RlbnkgIkNhbm5vdCBkZXRlcm1pbmUgd2hvIHlvdSBhcmUuIiB1bmxlc3MgJHRoaXNfdXNlcjsKKworJHJlcG9zaXRvcnlfbmFtZSA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoJGdpdF9kaXIpOworJHJlcG9zaXRvcnlfbmFtZSA9fiBtLC8oW14vXSspKD86XC5naXR8L1wuZ2l0KSQsOworJHJlcG9zaXRvcnlfbmFtZSA9ICQxOworaW5mbyAiVXBkYXRpbmcgaW4gJyRyZXBvc2l0b3J5X25hbWUnLiI7CisKK215ICRvcDsKK2lmICAgICgkb2xkID1+IC9eMHs0MH0kLykgeyAkb3AgPSAnQyc7IH0KK2Vsc2lmICgkbmV3ID1+IC9eMHs0MH0kLykgeyAkb3AgPSAnRCc7IH0KK2Vsc2UgICAgICAgICAgICAgICAgICAgICAgeyAkb3AgPSAnUic7IH0KKworIyBUaGlzIGlzIHJlYWxseSBhbiB1cGRhdGUgKGZhc3QtZm9yd2FyZCkgaWYgdGhlCisjIG1lcmdlIGJhc2Ugb2YgJG9sZCBhbmQgJG5ldyBpcyAkb2xkLgorIworJG9wID0gJ1UnIGlmICgkb3AgZXEgJ1InCisJJiYgJHJlZiA9fiBtLF5oZWFkcy8sCisJJiYgJG9sZCBlcSBnaXRfdmFsdWUoJ21lcmdlLWJhc2UnLCRvbGQsJG5ldykpOworCisjIExvYWQgdGhlIHVzZXIncyBBQ0wgZmlsZS4KK3sKKwlteSAlZGF0YSA9ICgndXNlci5jb21taXR0ZXInID0+IFtdKTsKKwlwYXJzZV9jb25maWcoXCVkYXRhLCAiJGFjbF9icmFuY2g6dXNlcnMvJHRoaXNfdXNlci5hY2wiKTsKKwkldXNlcl9jb21taXR0ZXIgPSBtYXAgeyRfID0+ICRffSBAeyRkYXRheyd1c2VyLmNvbW1pdHRlcid9fTsKKwlteSAkcnVsZXMgPSAkZGF0YXsicmVwb3NpdG9yeS4kcmVwb3NpdG9yeV9uYW1lLmFsbG93In0gfHwgW107CisJZm9yZWFjaCAoQCRydWxlcykgeworCQlpZiAoL14oW0NEUlUgXSspXHMrZm9yXHMrKFteXHNdKykkLykgeworCQkJbXkgJG9wcyA9ICQxOworCQkJbXkgJHJlZiA9ICQyOworCQkJJG9wcyA9fiBzLyAvL2c7CisJCQkkcmVmID1+IHMvXFxcXC9cXC9nOworCQkJcHVzaCBAYWxsb3dfcnVsZXMsIFskb3BzLCAkcmVmXTsKKwkJfSBlbHNpZiAoL15mb3JccysoW15cc10rKSQvKSB7CisJCQkjIE1lbnRpb25lZCwgYnV0IG5vdGhpbmcgZ3JhbnRlZD8KKwkJfSBlbHNpZiAoL15bXlxzXSskLykgeworCQkJcy9cXFxcL1xcL2c7CisJCQlwdXNoIEBhbGxvd19ydWxlcywgWydVJywgJF9dOworCQl9CisJfQorfQorCitpZiAoJG9wIG5lICdEJykgeworCSRuZXdfdHlwZSA9IGdpdF92YWx1ZSgnY2F0LWZpbGUnLCctdCcsJG5ldyk7CisKKwlpZiAoJHJlZiA9fiBtLF5oZWFkcy8sKSB7CisJCWRlbnkgIiRyZWYgbXVzdCBiZSBhIGNvbW1pdC4iIHVubGVzcyAkbmV3X3R5cGUgZXEgJ2NvbW1pdCc7CisJfSBlbHNpZiAoJHJlZiA9fiBtLF50YWdzLywpIHsKKwkJZGVueSAiJHJlZiBtdXN0IGJlIGFuIGFubm90YXRlZCB0YWcuIiB1bmxlc3MgJG5ld190eXBlIGVxICd0YWcnOworCX0KKworCWNoZWNrX2NvbW1pdHRlcnMgKGFsbF9uZXdfY29tbWl0dGVycyk7CisJY2hlY2tfY29tbWl0dGVycyAoYWxsX25ld190YWdnZXJzKSBpZiAkbmV3X3R5cGUgZXEgJ3RhZyc7Cit9CisKK2luZm8gIiR0aGlzX3VzZXIgd2FudHMgJG9wIGZvciAkcmVmIjsKK2ZvcmVhY2ggbXkgJGFjbF9lbnRyeSAoQGFsbG93X3J1bGVzKSB7CisJbXkgKCRhY2xfb3BzLCAkYWNsX24pID0gQCRhY2xfZW50cnk7CisJbmV4dCB1bmxlc3MgJGFjbF9vcHMgPX4gL15bQ0RSVV0rJC87ICMgVWhoLi4uLiBzaG91bGRuJ3QgaGFwcGVuLgorCW5leHQgdW5sZXNzICRhY2xfbjsKKwluZXh0IHVubGVzcyAkb3AgPX4gL15bJGFjbF9vcHNdJC87CisKKwlncmFudCAiQWxsb3dlZCBieTogJGFjbF9vcHMgZm9yICRhY2xfbiIKKwlpZiAoCisJICAgKCRhY2xfbiBlcSAkcmVmKQorCXx8ICgkYWNsX24gPX4gbSwvJCwgJiYgc3Vic3RyKCRyZWYsMCxsZW5ndGggJGFjbF9uKSBlcSAkYWNsX24pCisJfHwgKCRhY2xfbiA9fiBtLF5cXiwgJiYgJHJlZiA9fiBtOiRhY2xfbjopCisJKTsKK30KK2Nsb3NlIEE7CitkZW55ICJZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gJG9wICRyZWYiOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9yZW1vdGVzMmNvbmZpZy5zaCBiL2NvbnRyaWIvcmVtb3RlczJjb25maWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwOWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcmVtb3RlczJjb25maWcuc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisKKyMgVXNlIHRoaXMgdG9vbCB0byByZXdyaXRlIHlvdXIgLmdpdC9yZW1vdGVzLyBmaWxlcyBpbnRvIHRoZSBjb25maWcuCisKKy4gZ2l0LXNoLXNldHVwCisKK2lmIFsgLWQgIiRHSVRfRElSIi9yZW1vdGVzIF07IHRoZW4KKwllY2hvICJSZXdyaXRpbmcgJEdJVF9ESVIvcmVtb3RlcyIgPiYyCisJZXJyb3I9MAorCSMgcmV3cml0ZSBpbnRvIGNvbmZpZworCXsKKwkJY2QgIiRHSVRfRElSIi9yZW1vdGVzCisJCWxzIHwgd2hpbGUgcmVhZCBmOyBkbworCQkJbmFtZT0kKHByaW50ZiAiJGYiIHwgdHIgLWMgIkEtWmEtejAtOSIgIi4iKQorCQkJc2VkIC1uIFwKKwkJCS1lICJzL15VUkw6IFwoLipcKSQvcmVtb3RlLiRuYW1lLnVybCBcMSAuL3AiIFwKKwkJCS1lICJzL15QdWxsOiBcKC4qXCkkL3JlbW90ZS4kbmFtZS5mZXRjaCBcMSBeJCAvcCIgXAorCQkJLWUgInMvXlB1c2g6IFwoLipcKSQvcmVtb3RlLiRuYW1lLnB1c2ggXDEgXiQgL3AiIFwKKwkJCTwgIiRmIgorCQlkb25lCisJCWVjaG8gZG9uZQorCX0gfCB3aGlsZSByZWFkIGtleSB2YWx1ZSByZWdleDsgZG8KKwkJY2FzZSAka2V5IGluCisJCWRvbmUpCisJCQlpZiBbICRlcnJvciA9IDAgXTsgdGhlbgorCQkJCW12ICIkR0lUX0RJUiIvcmVtb3RlcyAiJEdJVF9ESVIiL3JlbW90ZXMub2xkCisJCQlmaSA7OworCQkqKQorCQkJZWNobyAiZ2l0LWNvbmZpZyAka2V5ICIkdmFsdWUiICRyZWdleCIKKwkJCWdpdC1jb25maWcgJGtleSAiJHZhbHVlIiAkcmVnZXggfHwgZXJyb3I9MSA7OworCQllc2FjCisJZG9uZQorZmkKKworCmRpZmYgLS1naXQgYS9jb250cmliL3ZpbS9SRUFETUUgYi9jb250cmliL3ZpbS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3ODgxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmltL1JFQURNRQpAQCAtMCwwICsxLDggQEAKK1RvIHN5bnRheCBoaWdobGlnaHQgZ2l0J3MgY29tbWl0IG1lc3NhZ2VzLCB5b3UgbmVlZCB0bzoKKyAgMS4gQ29weSBzeW50YXgvZ2l0Y29tbWl0LnZpbSB0byB2aW0ncyBzeW50YXggZGlyZWN0b3J5OgorICAgICAkIG1rZGlyIC1wICRIT01FLy52aW0vc3ludGF4CisgICAgICQgY3Agc3ludGF4L2dpdGNvbW1pdC52aW0gJEhPTUUvLnZpbS9zeW50YXgKKyAgMi4gQXV0by1kZXRlY3QgdGhlIGVkaXRpbmcgb2YgZ2l0IGNvbW1pdCBmaWxlczoKKyAgICAgJCBjYXQgPj4kSE9NRS8udmltcmMgPDwnRU9GJworICAgICBhdXRvY21kIEJ1Zk5ld0ZpbGUsQnVmUmVhZCBDT01NSVRfRURJVE1TRyBzZXQgZmlsZXR5cGU9Z2l0Y29tbWl0CisgICAgIEVPRgpkaWZmIC0tZ2l0IGEvY29udHJpYi92aW0vc3ludGF4L2dpdGNvbW1pdC52aW0gYi9jb250cmliL3ZpbS9zeW50YXgvZ2l0Y29tbWl0LnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzIxMjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92aW0vc3ludGF4L2dpdGNvbW1pdC52aW0KQEAgLTAsMCArMSwxOCBAQAorc3luIHJlZ2lvbiBnaXRMaW5lIHN0YXJ0PS9eIy8gZW5kPS8kLworc3luIHJlZ2lvbiBnaXRDb21taXQgc3RhcnQ9L14jIENoYW5nZXMgdG8gYmUgY29tbWl0dGVkOiQvIGVuZD0vXiMkLyBjb250YWlucz1naXRIZWFkLGdpdENvbW1pdEZpbGUKK3N5biByZWdpb24gZ2l0SGVhZCBjb250YWluZWQgc3RhcnQ9L14jICAgKC4qKS8gZW5kPS9eIyQvCitzeW4gcmVnaW9uIGdpdENoYW5nZWQgc3RhcnQ9L14jIENoYW5nZWQgYnV0IG5vdCB1cGRhdGVkOi8gZW5kPS9eIyQvIGNvbnRhaW5zPWdpdEhlYWQsZ2l0Q2hhbmdlZEZpbGUKK3N5biByZWdpb24gZ2l0VW50cmFja2VkIHN0YXJ0PS9eIyBVbnRyYWNrZWQgZmlsZXM6LyBlbmQ9L14jJC8gY29udGFpbnM9Z2l0SGVhZCxnaXRVbnRyYWNrZWRGaWxlCisKK3N5biBtYXRjaCBnaXRDb21taXRGaWxlIGNvbnRhaW5lZCAvXiNcdC4qL2hzPXMrMgorc3luIG1hdGNoIGdpdENoYW5nZWRGaWxlIGNvbnRhaW5lZCAvXiNcdC4qL2hzPXMrMgorc3luIG1hdGNoIGdpdFVudHJhY2tlZEZpbGUgY29udGFpbmVkIC9eI1x0LiovaHM9cysyCisKK2hpIGRlZiBsaW5rIGdpdExpbmUgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0Q29tbWl0IENvbW1lbnQKK2hpIGRlZiBsaW5rIGdpdENoYW5nZWQgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0SGVhZCBDb21tZW50CitoaSBkZWYgbGluayBnaXRVbnRyYWNrZWQgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0Q29tbWl0RmlsZSBUeXBlCitoaSBkZWYgbGluayBnaXRDaGFuZ2VkRmlsZSBDb25zdGFudAoraGkgZGVmIGxpbmsgZ2l0VW50cmFja2VkRmlsZSBDb25zdGFudApkaWZmIC0tZ2l0IGEvY29udHJpYi93b3JrZGlyL2dpdC1uZXctd29ya2RpciBiL2NvbnRyaWIvd29ya2Rpci9naXQtbmV3LXdvcmtkaXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTg3N2I5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvd29ya2Rpci9naXQtbmV3LXdvcmtkaXIKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisKK3VzYWdlICgpIHsKKwllY2hvICJ1c2FnZToiICRACisJZXhpdCAxMjcKK30KKworZGllICgpIHsKKwllY2hvICRACisJZXhpdCAxMjgKK30KKworaWYgdGVzdCAkIyAtbHQgMiB8fCB0ZXN0ICQjIC1ndCAzCit0aGVuCisJdXNhZ2UgIiQwIDxyZXBvc2l0b3J5PiA8bmV3X3dvcmtkaXI+IFs8YnJhbmNoPl0iCitmaQorCitvcmlnX2dpdD0kMQorbmV3X3dvcmtkaXI9JDIKK2JyYW5jaD0kMworCisjIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdCBpcyBwb2ludGVkIHRvIGhhcyBhIC5naXQgZGlyZWN0b3J5IC4uLgordGVzdCAtZCAiJG9yaWdfZ2l0Ly5naXQiIHx8IGRpZSAiXCIkb3JpZ19naXRcIiBpcyBub3QgYSBnaXQgcmVwb3NpdG9yeSEiCisKKyMgZG9uJ3QgbGluayB0byBhIHdvcmtkaXIKK2lmIHRlc3QgLUwgIiRvcmlnX2dpdC8uZ2l0L2NvbmZpZyIKK3RoZW4KKwlkaWUgIlwiJG9yaWdfZ2l0XCIgaXMgYSB3b3JraW5nIGRpcmVjdG9yeSBvbmx5LCBwbGVhc2Ugc3BlY2lmeSIgXAorCQkiYSBjb21wbGV0ZSByZXBvc2l0b3J5LiIKK2ZpCisKKyMgbWFrZSBzdXJlIHRoZSB0aGUgbGlua3MgdXNlIGZ1bGwgcGF0aHMKK29yaWdfZ2l0PSQoY2QgIiRvcmlnX2dpdCI7IHB3ZCkKKworIyBjcmVhdGUgdGhlIHdvcmtkaXIKK21rZGlyIC1wICIkbmV3X3dvcmtkaXIvLmdpdCIgfHwgZGllICJ1bmFibGUgdG8gY3JlYXRlIFwiJG5ld193b3JrZGlyXCIhIgorCisjIGNyZWF0ZSB0aGUgbGlua3MgdG8gdGhlIG9yaWdpbmFsIHJlcG8uICBleHBsaWN0bHkgZXhjbHVkZSBpbmRleCwgSEVBRCBhbmQKKyMgbG9ncy9IRUFEIGZyb20gdGhlIGxpc3Qgc2luY2UgdGhleSBhcmUgcHVyZWx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgd29ya2luZworIyBkaXJlY3RvcnksIGFuZCBzaG91bGQgbm90IGJlIHNoYXJlZC4KK2ZvciB4IGluIGNvbmZpZyByZWZzIGxvZ3MvcmVmcyBvYmplY3RzIGluZm8gaG9va3MgcGFja2VkLXJlZnMgcmVtb3RlcyByci1jYWNoZQorZG8KKwljYXNlICR4IGluCisJKi8qKQorCQlta2RpciAtcCAiJChkaXJuYW1lICIkbmV3X3dvcmtkaXIvLmdpdC8keCIpIgorCQk7OworCWVzYWMKKwlsbiAtcyAiJG9yaWdfZ2l0Ly5naXQvJHgiICIkbmV3X3dvcmtkaXIvLmdpdC8keCIKK2RvbmUKKworIyBub3cgc2V0dXAgdGhlIHdvcmtkaXIKK2NkICIkbmV3X3dvcmtkaXIiCisjIGNvcHkgdGhlIEhFQUQgZnJvbSB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yeSBhcyBhIGRlZmF1bHQgYnJhbmNoCitjcCAiJG9yaWdfZ2l0Ly5naXQvSEVBRCIgLmdpdC9IRUFECisjIGNoZWNrb3V0IHRoZSBicmFuY2ggKGVpdGhlciB0aGUgc2FtZSBhcyBIRUFEIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9zaXRvcnksIG9yCisjIHRoZSBvbmUgdGhhdCB3YXMgYXNrZWQgZm9yKQorZ2l0IGNoZWNrb3V0IC1mICRicmFuY2gKZGlmZiAtLWdpdCBhL2NvbnZlcnQtb2JqZWN0cy5jIGIvY29udmVydC1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmYmNlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnZlcnQtb2JqZWN0cy5jCkBAIC0wLDAgKzEsMzI5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdHJ1Y3QgZW50cnkgeworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgbmV3X3NoYTFbMjBdOworCWludCBjb252ZXJ0ZWQ7Cit9OworCisjZGVmaW5lIE1BWE9CSkVDVFMgKDEwMDAwMDApCisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmNvbnZlcnRbTUFYT0JKRUNUU107CitzdGF0aWMgaW50IG5yX2NvbnZlcnQ7CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKiBjb252ZXJ0X2VudHJ5KHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitzdGF0aWMgc3RydWN0IGVudHJ5ICppbnNlcnRfbmV3KHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBwb3MpCit7CisJc3RydWN0IGVudHJ5ICpuZXcgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW50cnkpKTsKKwloYXNoY3B5KG5ldy0+b2xkX3NoYTEsIHNoYTEpOworCW1lbW1vdmUoY29udmVydCArIHBvcyArIDEsIGNvbnZlcnQgKyBwb3MsIChucl9jb252ZXJ0IC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgZW50cnkgKikpOworCWNvbnZlcnRbcG9zXSA9IG5ldzsKKwlucl9jb252ZXJ0Kys7CisJaWYgKG5yX2NvbnZlcnQgPT0gTUFYT0JKRUNUUykKKwkJZGllKCJ5b3UncmUga2lkZGluZyBtZSAtIGhpdCBtYXhpbXVtIG9iamVjdCBsaW1pdCIpOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmxvb2t1cF9lbnRyeSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBsb3cgPSAwLCBoaWdoID0gbnJfY29udmVydDsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCWludCBuZXh0ID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJc3RydWN0IGVudHJ5ICpuID0gY29udmVydFtuZXh0XTsKKwkJaW50IGNtcCA9IGhhc2hjbXAoc2hhMSwgbi0+b2xkX3NoYTEpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBuOworCQlpZiAoY21wIDwgMCkgeworCQkJaGlnaCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlsb3cgPSBuZXh0KzE7CisJfQorCXJldHVybiBpbnNlcnRfbmV3KHNoYTEsIGxvdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYmluYXJ5X3NoYTEodm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBlbnRyeSAqZW50cnkgPSBjb252ZXJ0X2VudHJ5KGJ1ZmZlcik7CisJaGFzaGNweShidWZmZXIsIGVudHJ5LT5uZXdfc2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYXNjaWlfc2hhMSh2b2lkICpidWZmZXIpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJaWYgKGdldF9zaGExX2hleChidWZmZXIsIHNoYTEpKQorCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCAnJXMnIiwgKGNoYXIqKSBidWZmZXIpOworCWVudHJ5ID0gY29udmVydF9lbnRyeShzaGExKTsKKwltZW1jcHkoYnVmZmVyLCBzaGExX3RvX2hleChlbnRyeS0+bmV3X3NoYTEpLCA0MCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udmVydF9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCBuZXdtb2RlOworCisJbmV3bW9kZSA9IG1vZGUgJiBTX0lGTVQ7CisJaWYgKFNfSVNSRUcobW9kZSkpCisJCW5ld21vZGUgfD0gKG1vZGUgJiAwMTAwKSA/IDA3NTUgOiAwNjQ0OworCXJldHVybiBuZXdtb2RlOworfQorCitzdGF0aWMgaW50IHdyaXRlX3N1YmRpcmVjdG9yeSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCWNoYXIgKm5ldyA9IHhtYWxsb2Moc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBuZXdsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdXNlZDsKKworCXVzZWQgPSAwOworCXdoaWxlIChzaXplKSB7CisJCWludCBsZW4gPSAyMSArIHN0cmxlbihidWZmZXIpOworCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKTsKKwkJdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCWNoYXIgKnNsYXNoLCAqb3JpZ3BhdGg7CisKKwkJaWYgKCFwYXRoIHx8IHN0cnRvdWxfdWkoYnVmZmVyLCA4LCAmbW9kZSkpCisJCQlkaWUoImJhZCB0cmVlIGNvbnZlcnNpb24iKTsKKwkJbW9kZSA9IGNvbnZlcnRfbW9kZShtb2RlKTsKKwkJcGF0aCsrOworCQlpZiAobWVtY21wKHBhdGgsIGJhc2UsIGJhc2VsZW4pKQorCQkJYnJlYWs7CisJCW9yaWdwYXRoID0gcGF0aDsKKwkJcGF0aCArPSBiYXNlbGVuOworCQlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCQlpZiAoIXNsYXNoKSB7CisJCQluZXdsZW4gKz0gc3ByaW50ZihuZXcgKyBuZXdsZW4sICIlbyAlcyIsIG1vZGUsIHBhdGgpOworCQkJbmV3W25ld2xlbisrXSA9ICdcMCc7CisJCQloYXNoY3B5KCh1bnNpZ25lZCBjaGFyKiluZXcgKyBuZXdsZW4sICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIGxlbiAtIDIwKTsKKwkJCW5ld2xlbiArPSAyMDsKKworCQkJdXNlZCArPSBsZW47CisJCQlzaXplIC09IGxlbjsKKwkJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbmV3bGVuICs9IHNwcmludGYobmV3ICsgbmV3bGVuLCAiJW8gJS4qcyIsIFNfSUZESVIsIChpbnQpKHNsYXNoIC0gcGF0aCksIHBhdGgpOworCQluZXdbbmV3bGVuKytdID0gMDsKKwkJc2hhMSA9ICh1bnNpZ25lZCBjaGFyICopKG5ldyArIG5ld2xlbik7CisJCW5ld2xlbiArPSAyMDsKKworCQlsZW4gPSB3cml0ZV9zdWJkaXJlY3RvcnkoYnVmZmVyLCBzaXplLCBvcmlncGF0aCwgc2xhc2gtb3JpZ3BhdGgrMSwgc2hhMSk7CisKKwkJdXNlZCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBsZW47CisJfQorCisJd3JpdGVfc2hhMV9maWxlKG5ldywgbmV3bGVuLCB0cmVlX3R5cGUsIHJlc3VsdF9zaGExKTsKKwlmcmVlKG5ldyk7CisJcmV0dXJuIHVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfdHJlZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJdm9pZCAqb3JpZ19idWZmZXIgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IGxlbiA9IDErc3RybGVuKGJ1ZmZlcik7CisKKwkJY29udmVydF9iaW5hcnlfc2hhMSgoY2hhciAqKSBidWZmZXIgKyBsZW4pOworCisJCWxlbiArPSAyMDsKKwkJaWYgKGxlbiA+IHNpemUpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBvYmplY3QiKTsKKwkJc2l6ZSAtPSBsZW47CisJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwl9CisKKwl3cml0ZV9zdWJkaXJlY3Rvcnkob3JpZ19idWZmZXIsIG9yaWdfc2l6ZSwgIiIsIDAsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFyc2Vfb2xkc3R5bGVfZGF0ZShjb25zdCBjaGFyICpidWYpCit7CisJY2hhciBjLCAqcDsKKwljaGFyIGJ1ZmZlclsxMDBdOworCXN0cnVjdCB0bSB0bTsKKwljb25zdCBjaGFyICpmb3JtYXRzW10gPSB7CisJCSIlYyIsCisJCSIlYSAlYiAlZCAlVCIsCisJCSIlWiIsCisJCSIlWSIsCisJCSIgJVkiLAorCQlOVUxMCisJfTsKKwkvKiBXZSBvbmx5IGV2ZXIgZGlkIHR3byB0aW1lem9uZXMgaW4gdGhlIGJhZCBvbGQgZm9ybWF0IC4uICovCisJY29uc3QgY2hhciAqdGltZXpvbmVzW10gPSB7CisJCSJQRFQiLCAiUFNUIiwgIkNFU1QiLCBOVUxMCisJfTsKKwljb25zdCBjaGFyICoqZm10ID0gZm9ybWF0czsKKworCXAgPSBidWZmZXI7CisJd2hpbGUgKGlzc3BhY2UoYyA9ICpidWYpKQorCQlidWYrKzsKKwl3aGlsZSAoKGMgPSAqYnVmKyspICE9ICdcbicpCisJCSpwKysgPSBjOworCSpwKysgPSAwOworCWJ1ZiA9IGJ1ZmZlcjsKKwltZW1zZXQoJnRtLCAwLCBzaXplb2YodG0pKTsKKwlkbyB7CisJCWNvbnN0IGNoYXIgKm5leHQgPSBzdHJwdGltZShidWYsICpmbXQsICZ0bSk7CisJCWlmIChuZXh0KSB7CisJCQlpZiAoISpuZXh0KQorCQkJCXJldHVybiBta3RpbWUoJnRtKTsKKwkJCWJ1ZiA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQljb25zdCBjaGFyICoqcCA9IHRpbWV6b25lczsKKwkJCXdoaWxlIChpc3NwYWNlKCpidWYpKQorCQkJCWJ1ZisrOworCQkJd2hpbGUgKCpwKSB7CisJCQkJaWYgKCFtZW1jbXAoYnVmLCAqcCwgc3RybGVuKCpwKSkpIHsKKwkJCQkJYnVmICs9IHN0cmxlbigqcCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwKys7CisJCQl9CisJCX0KKwkJZm10Kys7CisJfSB3aGlsZSAoKmJ1ZiAmJiAqZm10KTsKKwlwcmludGYoImxlZnQ6ICVzXG4iLCBidWYpOworCXJldHVybiBta3RpbWUoJnRtKTsJCQkJCit9CisKK3N0YXRpYyBpbnQgY29udmVydF9kYXRlX2xpbmUoY2hhciAqZHN0LCB2b2lkICoqYnVmLCB1bnNpZ25lZCBsb25nICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAqc3A7CisJY2hhciAqbGluZSA9ICpidWY7CisJY2hhciAqbmV4dCA9IHN0cmNocihsaW5lLCAnXG4nKTsKKwljaGFyICpkYXRlID0gc3RyY2hyKGxpbmUsICc+Jyk7CisJaW50IGxlbjsKKworCWlmICghbmV4dCB8fCAhZGF0ZSkKKwkJZGllKCJtaXNzaW5nIG9yIGJhZCBhdXRob3IvY29tbWl0dGVyIGxpbmUgJXMiLCBsaW5lKTsKKwluZXh0Kys7IGRhdGUgKz0gMjsKKworCSpidWYgPSBuZXh0OworCSpzcCA9IHNpemUgLSAobmV4dCAtIGxpbmUpOworCisJbGVuID0gZGF0ZSAtIGxpbmU7CisJbWVtY3B5KGRzdCwgbGluZSwgbGVuKTsKKwlkc3QgKz0gbGVuOworCisJLyogSXMgaXQgYWxyZWFkeSBpbiBuZXcgZm9ybWF0PyAqLworCWlmIChpc2RpZ2l0KCpkYXRlKSkgeworCQlpbnQgZGF0ZWxlbiA9IG5leHQgLSBkYXRlOworCQltZW1jcHkoZHN0LCBkYXRlLCBkYXRlbGVuKTsKKwkJcmV0dXJuIGxlbiArIGRhdGVsZW47CisJfQorCisJLyoKKwkgKiBIYWNreSBoYWNreTogb25lIG9mIHRoZSBzcGFyc2Ugb2xkLXN0eWxlIGNvbW1pdHMgZG9lcyBub3QgaGF2ZQorCSAqIGFueSBkYXRlIGF0IGFsbCwgYnV0IHdlIGNhbiBmYWtlIGl0IGJ5IHVzaW5nIHRoZSBjb21taXR0ZXIgZGF0ZS4KKwkgKi8KKwlpZiAoKmRhdGUgPT0gJ1xuJyAmJiBzdHJjaHIobmV4dCwgJz4nKSkKKwkJZGF0ZSA9IHN0cmNocihuZXh0LCAnPicpKzI7CisKKwlyZXR1cm4gbGVuICsgc3ByaW50Zihkc3QsICIlbHUgLTA3MDBcbiIsIHBhcnNlX29sZHN0eWxlX2RhdGUoZGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X2RhdGUodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCWNoYXIgKm5ldyA9IHhtYWxsb2Moc2l6ZSArIDEwMCk7CisJdW5zaWduZWQgbG9uZyBuZXdsZW4gPSAwOworCisJLyogInRyZWUgPHNoYTE+XG4iICovCisJbWVtY3B5KG5ldyArIG5ld2xlbiwgYnVmZmVyLCA0Nik7CisJbmV3bGVuICs9IDQ2OworCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ2OworCXNpemUgLT0gNDY7CisKKwkvKiAicGFyZW50IDxzaGExPlxuIiAqLworCXdoaWxlICghbWVtY21wKGJ1ZmZlciwgInBhcmVudCAiLCA3KSkgeworCQltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIsIDQ4KTsKKwkJbmV3bGVuICs9IDQ4OworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyA0ODsKKwkJc2l6ZSAtPSA0ODsKKwl9CisKKwkvKiAiYXV0aG9yIHh5eiA8eHl6PiBkYXRlIiAqLworCW5ld2xlbiArPSBjb252ZXJ0X2RhdGVfbGluZShuZXcgKyBuZXdsZW4sICZidWZmZXIsICZzaXplKTsKKwkvKiAiY29tbWl0dGVyIHh5eiA8eHl6PiBkYXRlIiAqLworCW5ld2xlbiArPSBjb252ZXJ0X2RhdGVfbGluZShuZXcgKyBuZXdsZW4sICZidWZmZXIsICZzaXplKTsKKworCS8qIFJlc3QgKi8KKwltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIsIHNpemUpOworCW5ld2xlbiArPSBzaXplOworCisJd3JpdGVfc2hhMV9maWxlKG5ldywgbmV3bGVuLCBjb21taXRfdHlwZSwgcmVzdWx0X3NoYTEpOworCWZyZWUobmV3KTsKK30KKworc3RhdGljIHZvaWQgY29udmVydF9jb21taXQodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCXZvaWQgKm9yaWdfYnVmZmVyID0gYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgb3JpZ19zaXplID0gc2l6ZTsKKworCWlmIChtZW1jbXAoYnVmZmVyLCAidHJlZSAiLCA1KSkKKwkJZGllKCJCYWQgY29tbWl0ICclcyciLCAoY2hhciopIGJ1ZmZlcik7CisJY29udmVydF9hc2NpaV9zaGExKChjaGFyICopIGJ1ZmZlciArIDUpOworCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ2OyAgICAvKiAidHJlZSAiICsgImhleCBzaGExIiArICJcbiIgKi8KKwl3aGlsZSAoIW1lbWNtcChidWZmZXIsICJwYXJlbnQgIiwgNykpIHsKKwkJY29udmVydF9hc2NpaV9zaGExKChjaGFyICopIGJ1ZmZlciArIDcpOworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyA0ODsKKwl9CisJY29udmVydF9kYXRlKG9yaWdfYnVmZmVyLCBvcmlnX3NpemUsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHN0cnVjdCBlbnRyeSAqIGNvbnZlcnRfZW50cnkodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5ID0gbG9va3VwX2VudHJ5KHNoYTEpOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWZmZXIsICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChlbnRyeS0+Y29udmVydGVkKQorCQlyZXR1cm4gZW50cnk7CisJZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlkaWUoInVuYWJsZSB0byByZWFkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisKKwlpZiAodHlwZSA9PSBPQkpfQkxPQikgeworCQl3cml0ZV9zaGExX2ZpbGUoYnVmZmVyLCBzaXplLCBibG9iX3R5cGUsIGVudHJ5LT5uZXdfc2hhMSk7CisJfSBlbHNlIGlmICh0eXBlID09IE9CSl9UUkVFKQorCQljb252ZXJ0X3RyZWUoYnVmZmVyLCBzaXplLCBlbnRyeS0+bmV3X3NoYTEpOworCWVsc2UgaWYgKHR5cGUgPT0gT0JKX0NPTU1JVCkKKwkJY29udmVydF9jb21taXQoYnVmZmVyLCBzaXplLCBlbnRyeS0+bmV3X3NoYTEpOworCWVsc2UKKwkJZGllKCJ1bmtub3duIG9iamVjdCB0eXBlICVkIGluICVzIiwgdHlwZSwgc2hhMV90b19oZXgoc2hhMSkpOworCWVudHJ5LT5jb252ZXJ0ZWQgPSAxOworCWZyZWUoYnVmZmVyKTsKKwlmcmVlKGRhdGEpOworCXJldHVybiBlbnRyeTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGVudHJ5ICplbnRyeTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKCJnaXQtY29udmVydC1vYmplY3RzIDxzaGExPiIpOworCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZ3ZbMV0pOworCisJZW50cnkgPSBjb252ZXJ0X2VudHJ5KHNoYTEpOworCXByaW50ZigibmV3IHNoYTE6ICVzXG4iLCBzaGExX3RvX2hleChlbnRyeS0+bmV3X3NoYTEpKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnZlcnQuYyBiL2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkwOGIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udmVydC5jCkBAIC0wLDAgKzEsNzA0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKworLyoKKyAqIGNvbnZlcnQuYyAtIGNvbnZlcnQgYSBmaWxlIHdoZW4gY2hlY2tpbmcgaXQgb3V0IGFuZCBjaGVja2luZyBpdCBpbi4KKyAqCisgKiBUaGlzIHNob3VsZCB1c2UgdGhlIHBhdGhuYW1lIHRvIGRlY2lkZSBvbiB3aGV0aGVyIGl0IHdhbnRzIHRvIGRvIHNvbWUKKyAqIG1vcmUgaW50ZXJlc3RpbmcgY29udmVyc2lvbnMgKGF1dG9tYXRpYyBnemlwL3VuemlwLCBnZW5lcmFsIGZvcm1hdAorICogY29udmVyc2lvbnMgZXRjIGV0YyksIGJ1dCBieSBkZWZhdWx0IGl0IGp1c3QgZG9lcyBhdXRvbWF0aWMgQ1JMRjwtPkxGCisgKiB0cmFuc2xhdGlvbiB3aGVuIHRoZSAiYXV0b19jcmxmIiBvcHRpb24gaXMgc2V0LgorICovCisKKyNkZWZpbmUgQ1JMRl9HVUVTUwkoLTEpCisjZGVmaW5lIENSTEZfQklOQVJZCTAKKyNkZWZpbmUgQ1JMRl9URVhUCTEKKyNkZWZpbmUgQ1JMRl9JTlBVVAkyCisKK3N0cnVjdCB0ZXh0X3N0YXQgeworCS8qIENSLCBMRiBhbmQgQ1JMRiBjb3VudHMgKi8KKwl1bnNpZ25lZCBjciwgbGYsIGNybGY7CisKKwkvKiBUaGVzZSBhcmUganVzdCBhcHByb3hpbWF0aW9ucyEgKi8KKwl1bnNpZ25lZCBwcmludGFibGUsIG5vbnByaW50YWJsZTsKK307CisKK3N0YXRpYyB2b2lkIGdhdGhlcl9zdGF0cyhjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHRleHRfc3RhdCAqc3RhdHMpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJ1ZltpXTsKKwkJaWYgKGMgPT0gJ1xyJykgeworCQkJc3RhdHMtPmNyKys7CisJCQlpZiAoaSsxIDwgc2l6ZSAmJiBidWZbaSsxXSA9PSAnXG4nKQorCQkJCXN0YXRzLT5jcmxmKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlzdGF0cy0+bGYrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09IDEyNykKKwkJCS8qIERFTCAqLworCQkJc3RhdHMtPm5vbnByaW50YWJsZSsrOworCQllbHNlIGlmIChjIDwgMzIpIHsKKwkJCXN3aXRjaCAoYykgeworCQkJCS8qIEJTLCBIVCwgRVNDIGFuZCBGRiAqLworCQkJY2FzZSAnXGInOiBjYXNlICdcdCc6IGNhc2UgJ1wwMzMnOiBjYXNlICdcMDE0JzoKKwkJCQlzdGF0cy0+cHJpbnRhYmxlKys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXRzLT5ub25wcmludGFibGUrKzsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlzdGF0cy0+cHJpbnRhYmxlKys7CisJfQorfQorCisvKgorICogVGhlIHNhbWUgaGV1cmlzdGljcyBhcyBkaWZmLmM6Om1tZmlsZV9pc19iaW5hcnkoKQorICovCitzdGF0aWMgaW50IGlzX2JpbmFyeSh1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCB0ZXh0X3N0YXQgKnN0YXRzKQoreworCisJaWYgKChzdGF0cy0+cHJpbnRhYmxlID4+IDcpIDwgc3RhdHMtPm5vbnByaW50YWJsZSkKKwkJcmV0dXJuIDE7CisJLyoKKwkgKiBPdGhlciBoZXVyaXN0aWNzPyBBdmVyYWdlIGxpbmUgbGVuZ3RoIG1pZ2h0IGJlIHJlbGV2YW50LAorCSAqIGFzIG1pZ2h0IExGIHZzIENSIHZzIENSTEYgY291bnRzLi4KKwkgKgorCSAqIE5PVEUhIEl0IG1pZ2h0IGJlIG5vcm1hbCB0byBoYXZlIGEgbG93IHJhdGlvIG9mIENSTEYgdG8gTEYKKwkgKiAoc29tZWJvZHkgc3RhcnRzIHdpdGggYSBMRi1vbmx5IGZpbGUgYW5kIGVkaXRzIGl0IHdpdGggYW4gZWRpdG9yCisJICogdGhhdCBhZGRzIENSTEYgb25seSB0byBsaW5lcyB0aGF0IGFyZSBhZGRlZC4uKS4gQnV0IGRvICB3ZQorCSAqIHdhbnQgdG8gc3VwcG9ydCBDUi1vbmx5PyBQcm9iYWJseSBub3QuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpjcmxmX3RvX2dpdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgKnNpemVwLCBpbnQgYWN0aW9uKQoreworCWNoYXIgKmJ1ZmZlciwgKmRzdDsKKwl1bnNpZ25lZCBsb25nIHNpemUsIG5zaXplOworCXN0cnVjdCB0ZXh0X3N0YXQgc3RhdHM7CisKKwlpZiAoKGFjdGlvbiA9PSBDUkxGX0JJTkFSWSkgfHwgIWF1dG9fY3JsZikKKwkJcmV0dXJuIE5VTEw7CisKKwlzaXplID0gKnNpemVwOworCWlmICghc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlnYXRoZXJfc3RhdHMoc3JjLCBzaXplLCAmc3RhdHMpOworCisJLyogTm8gQ1I/IE5vdGhpbmcgdG8gY29udmVydCwgcmVnYXJkbGVzcy4gKi8KKwlpZiAoIXN0YXRzLmNyKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChhY3Rpb24gPT0gQ1JMRl9HVUVTUykgeworCQkvKgorCQkgKiBXZSdyZSBjdXJyZW50bHkgbm90IGdvaW5nIHRvIGV2ZW4gdHJ5IHRvIGNvbnZlcnQgc3R1ZmYKKwkJICogdGhhdCBoYXMgYmFyZSBDUiBjaGFyYWN0ZXJzLiBEb2VzIGFueWJvZHkgZG8gdGhhdCBjcmF6eQorCQkgKiBzdHVmZj8KKwkJICovCisJCWlmIChzdGF0cy5jciAhPSBzdGF0cy5jcmxmKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyoKKwkJICogQW5kIGFkZCBzb21lIGhldXJpc3RpY3MgZm9yIGJpbmFyeSB2cyB0ZXh0LCBvZiBjb3Vyc2UuLi4KKwkJICovCisJCWlmIChpc19iaW5hcnkoc2l6ZSwgJnN0YXRzKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogT2ssIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciwgZmlsbCBpdCBpbiwgYW5kIHJldHVybiBpdAorCSAqIHRvIGxldCB0aGUgY2FsbGVyIGtub3cgdGhhdCB3ZSBzd2l0Y2hlZCBidWZmZXJzLgorCSAqLworCW5zaXplID0gc2l6ZSAtIHN0YXRzLmNybGY7CisJYnVmZmVyID0geG1hbGxvYyhuc2l6ZSk7CisJKnNpemVwID0gbnNpemU7CisKKwlkc3QgPSBidWZmZXI7CisJaWYgKGFjdGlvbiA9PSBDUkxGX0dVRVNTKSB7CisJCS8qCisJCSAqIElmIHdlIGd1ZXNzZWQsIHdlIGFscmVhZHkga25vdyB3ZSByZWplY3RlZCBhIGZpbGUgd2l0aAorCQkgKiBsb25lIENSLCBhbmQgd2UgY2FuIHN0cmlwIGEgQ1Igd2l0aG91dCBsb29raW5nIGF0IHdoYXQKKwkJICogZm9sbG93IGl0LgorCQkgKi8KKwkJZG8geworCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCQkJaWYgKGMgIT0gJ1xyJykKKwkJCQkqZHN0KysgPSBjOworCQl9IHdoaWxlICgtLXNpemUpOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpzcmMrKzsKKwkJCWlmICghIChjID09ICdccicgJiYgKDEgPCBzaXplICYmICpzcmMgPT0gJ1xuJykpKQorCQkJCSpkc3QrKyA9IGM7CisJCX0gd2hpbGUgKC0tc2l6ZSk7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgKmNybGZfdG9fd29ya3RyZWUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nICpzaXplcCwgaW50IGFjdGlvbikKK3sKKwljaGFyICpidWZmZXIsICpkc3Q7CisJdW5zaWduZWQgbG9uZyBzaXplLCBuc2l6ZTsKKwlzdHJ1Y3QgdGV4dF9zdGF0IHN0YXRzOworCXVuc2lnbmVkIGNoYXIgbGFzdDsKKworCWlmICgoYWN0aW9uID09IENSTEZfQklOQVJZKSB8fCAoYWN0aW9uID09IENSTEZfSU5QVVQpIHx8CisJICAgIGF1dG9fY3JsZiA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSAqc2l6ZXA7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCWdhdGhlcl9zdGF0cyhzcmMsIHNpemUsICZzdGF0cyk7CisKKwkvKiBObyBMRj8gTm90aGluZyB0byBjb252ZXJ0LCByZWdhcmRsZXNzLiAqLworCWlmICghc3RhdHMubGYpCisJCXJldHVybiBOVUxMOworCisJLyogV2FzIGl0IGFscmVhZHkgaW4gQ1JMRiBmb3JtYXQ/ICovCisJaWYgKHN0YXRzLmxmID09IHN0YXRzLmNybGYpCisJCXJldHVybiBOVUxMOworCisJaWYgKGFjdGlvbiA9PSBDUkxGX0dVRVNTKSB7CisJCS8qIElmIHdlIGhhdmUgYW55IGJhcmUgQ1IgY2hhcmFjdGVycywgd2UncmUgbm90IGdvaW5nIHRvIHRvdWNoIGl0ICovCisJCWlmIChzdGF0cy5jciAhPSBzdGF0cy5jcmxmKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKGlzX2JpbmFyeShzaXplLCAmc3RhdHMpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBPaywgYWxsb2NhdGUgYSBuZXcgYnVmZmVyLCBmaWxsIGl0IGluLCBhbmQgcmV0dXJuIGl0CisJICogdG8gbGV0IHRoZSBjYWxsZXIga25vdyB0aGF0IHdlIHN3aXRjaGVkIGJ1ZmZlcnMuCisJICovCisJbnNpemUgPSBzaXplICsgc3RhdHMubGYgLSBzdGF0cy5jcmxmOworCWJ1ZmZlciA9IHhtYWxsb2MobnNpemUpOworCSpzaXplcCA9IG5zaXplOworCWxhc3QgPSAwOworCisJZHN0ID0gYnVmZmVyOworCWRvIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCQlpZiAoYyA9PSAnXG4nICYmIGxhc3QgIT0gJ1xyJykKKwkJCSpkc3QrKyA9ICdccic7CisJCSpkc3QrKyA9IGM7CisJCWxhc3QgPSBjOworCX0gd2hpbGUgKC0tc2l6ZSk7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9idWZmZXIoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3JjLAorCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqY21kKQoreworCS8qCisJICogU3Bhd24gY21kIGFuZCBmZWVkIHRoZSBidWZmZXIgY29udGVudHMgdGhyb3VnaCBpdHMgc3RkaW4uCisJICovCisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY2hpbGRfcHJvY2VzczsKKwlpbnQgcGlwZV9mZWVkWzJdOworCWludCB3cml0ZV9lcnIsIHN0YXR1czsKKworCW1lbXNldCgmY2hpbGRfcHJvY2VzcywgMCwgc2l6ZW9mKGNoaWxkX3Byb2Nlc3MpKTsKKworCWlmIChwaXBlKHBpcGVfZmVlZCkgPCAwKSB7CisJCWVycm9yKCJjYW5ub3QgY3JlYXRlIHBpcGUgdG8gcnVuIGV4dGVybmFsIGZpbHRlciAlcyIsIGNtZCk7CisJCXJldHVybiAxOworCX0KKworCWNoaWxkX3Byb2Nlc3MucGlkID0gZm9yaygpOworCWlmIChjaGlsZF9wcm9jZXNzLnBpZCA8IDApIHsKKwkJZXJyb3IoImNhbm5vdCBmb3JrIHRvIHJ1biBleHRlcm5hbCBmaWx0ZXIgJXMiLCBjbWQpOworCQljbG9zZShwaXBlX2ZlZWRbMF0pOworCQljbG9zZShwaXBlX2ZlZWRbMV0pOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFjaGlsZF9wcm9jZXNzLnBpZCkgeworCQlkdXAyKHBpcGVfZmVlZFswXSwgMCk7CisJCWNsb3NlKHBpcGVfZmVlZFswXSk7CisJCWNsb3NlKHBpcGVfZmVlZFsxXSk7CisJCWV4ZWNscCgic2giLCAic2giLCAiLWMiLCBjbWQsIE5VTEwpOworCQlyZXR1cm4gMTsKKwl9CisJY2xvc2UocGlwZV9mZWVkWzBdKTsKKworCXdyaXRlX2VyciA9ICh3cml0ZV9pbl9mdWxsKHBpcGVfZmVlZFsxXSwgc3JjLCBzaXplKSA8IDApOworCWlmIChjbG9zZShwaXBlX2ZlZWRbMV0pKQorCQl3cml0ZV9lcnIgPSAxOworCWlmICh3cml0ZV9lcnIpCisJCWVycm9yKCJjYW5ub3QgZmVlZCB0aGUgaW5wdXQgdG8gZXh0ZXJuYWwgZmlsdGVyICVzIiwgY21kKTsKKworCXN0YXR1cyA9IGZpbmlzaF9jb21tYW5kKCZjaGlsZF9wcm9jZXNzKTsKKwlpZiAoc3RhdHVzKQorCQllcnJvcigiZXh0ZXJuYWwgZmlsdGVyICVzIGZhaWxlZCAlZCIsIGNtZCwgLXN0YXR1cyk7CisJcmV0dXJuICh3cml0ZV9lcnIgfHwgc3RhdHVzKTsKK30KKworc3RhdGljIGNoYXIgKmFwcGx5X2ZpbHRlcihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsCisJCQkgIHVuc2lnbmVkIGxvbmcgKnNpemVwLCBjb25zdCBjaGFyICpjbWQpCit7CisJLyoKKwkgKiBDcmVhdGUgYSBwaXBlbGluZSB0byBoYXZlIHRoZSBjb21tYW5kIGZpbHRlciB0aGUgYnVmZmVyJ3MKKwkgKiBjb250ZW50cy4KKwkgKgorCSAqIChjaGlsZCAtLT4gY21kKSAtLT4gdXMKKwkgKi8KKwljb25zdCBpbnQgU0xPUCA9IDQwOTY7CisJaW50IHBpcGVfZmVlZFsyXTsKKwlpbnQgc3RhdHVzOworCWNoYXIgKmRzdDsKKwl1bnNpZ25lZCBsb25nIGRzdHNpemUsIGRzdGFsbG9jOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGNoaWxkX3Byb2Nlc3M7CisKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoJmNoaWxkX3Byb2Nlc3MsIDAsIHNpemVvZihjaGlsZF9wcm9jZXNzKSk7CisKKwlpZiAocGlwZShwaXBlX2ZlZWQpIDwgMCkgeworCQllcnJvcigiY2Fubm90IGNyZWF0ZSBwaXBlIHRvIHJ1biBleHRlcm5hbCBmaWx0ZXIgJXMiLCBjbWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmZmx1c2goTlVMTCk7CisJY2hpbGRfcHJvY2Vzcy5waWQgPSBmb3JrKCk7CisJaWYgKGNoaWxkX3Byb2Nlc3MucGlkIDwgMCkgeworCQllcnJvcigiY2Fubm90IGZvcmsgdG8gcnVuIGV4dGVybmFsIGZpbHRlciAlcyIsIGNtZCk7CisJCWNsb3NlKHBpcGVfZmVlZFswXSk7CisJCWNsb3NlKHBpcGVfZmVlZFsxXSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWNoaWxkX3Byb2Nlc3MucGlkKSB7CisJCWR1cDIocGlwZV9mZWVkWzFdLCAxKTsKKwkJY2xvc2UocGlwZV9mZWVkWzBdKTsKKwkJY2xvc2UocGlwZV9mZWVkWzFdKTsKKwkJZXhpdChmaWx0ZXJfYnVmZmVyKHBhdGgsIHNyYywgKnNpemVwLCBjbWQpKTsKKwl9CisJY2xvc2UocGlwZV9mZWVkWzFdKTsKKworCWRzdGFsbG9jID0gKnNpemVwOworCWRzdCA9IHhtYWxsb2MoZHN0YWxsb2MpOworCWRzdHNpemUgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJc3NpemVfdCBudW1yZWFkID0geHJlYWQocGlwZV9mZWVkWzBdLCBkc3QgKyBkc3RzaXplLAorCQkJCQlkc3RhbGxvYyAtIGRzdHNpemUpOworCisJCWlmIChudW1yZWFkIDw9IDApIHsKKwkJCWlmICghbnVtcmVhZCkKKwkJCQlicmVhazsKKwkJCWVycm9yKCJyZWFkIGZyb20gZXh0ZXJuYWwgZmlsdGVyICVzIGZhaWxlZCIsIGNtZCk7CisJCQlmcmVlKGRzdCk7CisJCQlkc3QgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJZHN0c2l6ZSArPSBudW1yZWFkOworCQlpZiAoZHN0YWxsb2MgPD0gZHN0c2l6ZSArIFNMT1ApIHsKKwkJCWRzdGFsbG9jID0gZHN0c2l6ZSArIFNMT1A7CisJCQlkc3QgPSB4cmVhbGxvYyhkc3QsIGRzdGFsbG9jKTsKKwkJfQorCX0KKwlpZiAoY2xvc2UocGlwZV9mZWVkWzBdKSkgeworCQllcnJvcigicmVhZCBmcm9tIGV4dGVybmFsIGZpbHRlciAlcyBmYWlsZWQiLCBjbWQpOworCQlmcmVlKGRzdCk7CisJCWRzdCA9IE5VTEw7CisJfQorCisJc3RhdHVzID0gZmluaXNoX2NvbW1hbmQoJmNoaWxkX3Byb2Nlc3MpOworCWlmIChzdGF0dXMpIHsKKwkJZXJyb3IoImV4dGVybmFsIGZpbHRlciAlcyBmYWlsZWQgJWQiLCBjbWQsIC1zdGF0dXMpOworCQlmcmVlKGRzdCk7CisJCWRzdCA9IE5VTEw7CisJfQorCisJaWYgKGRzdCkKKwkJKnNpemVwID0gZHN0c2l6ZTsKKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgc3RydWN0IGNvbnZlcnRfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBjb252ZXJ0X2RyaXZlciAqbmV4dDsKKwljaGFyICpzbXVkZ2U7CisJY2hhciAqY2xlYW47Cit9ICp1c2VyX2NvbnZlcnQsICoqdXNlcl9jb252ZXJ0X3RhaWw7CisKK3N0YXRpYyBpbnQgcmVhZF9jb252ZXJ0X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWNvbnN0IGNoYXIgKmVwLCAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKwlzdHJ1Y3QgY29udmVydF9kcml2ZXIgKmRydjsKKworCS8qCisJICogRXh0ZXJuYWwgY29udmVyc2lvbiBkcml2ZXJzIGFyZSBjb25maWd1cmVkIHVzaW5nCisJICogImZpbHRlci48bmFtZT4udmFyaWFibGUiLgorCSAqLworCWlmIChwcmVmaXhjbXAodmFyLCAiZmlsdGVyLiIpIHx8IChlcCA9IHN0cnJjaHIodmFyLCAnLicpKSA9PSB2YXIgKyA2KQorCQlyZXR1cm4gMDsKKwluYW1lID0gdmFyICsgNzsKKwluYW1lbGVuID0gZXAgLSBuYW1lOworCWZvciAoZHJ2ID0gdXNlcl9jb252ZXJ0OyBkcnY7IGRydiA9IGRydi0+bmV4dCkKKwkJaWYgKCFzdHJuY21wKGRydi0+bmFtZSwgbmFtZSwgbmFtZWxlbikgJiYgIWRydi0+bmFtZVtuYW1lbGVuXSkKKwkJCWJyZWFrOworCWlmICghZHJ2KSB7CisJCWNoYXIgKm5hbWVidWY7CisJCWRydiA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb252ZXJ0X2RyaXZlcikpOworCQluYW1lYnVmID0geG1hbGxvYyhuYW1lbGVuICsgMSk7CisJCW1lbWNweShuYW1lYnVmLCBuYW1lLCBuYW1lbGVuKTsKKwkJbmFtZWJ1ZltuYW1lbGVuXSA9IDA7CisJCWRydi0+bmFtZSA9IG5hbWVidWY7CisJCWRydi0+bmV4dCA9IE5VTEw7CisJCSp1c2VyX2NvbnZlcnRfdGFpbCA9IGRydjsKKwkJdXNlcl9jb252ZXJ0X3RhaWwgPSAmKGRydi0+bmV4dCk7CisJfQorCisJZXArKzsKKworCS8qCisJICogZmlsdGVyLjxuYW1lPi5zbXVkZ2UgYW5kIGZpbHRlci48bmFtZT4uY2xlYW4gc3BlY2lmaWVzCisJICogdGhlIGNvbW1hbmQgbGluZToKKwkgKgorCSAqCWNvbW1hbmQtbGluZQorCSAqCisJICogVGhlIGNvbW1hbmQtbGluZSB3aWxsIG5vdCBiZSBpbnRlcnBvbGF0ZWQgaW4gYW55IHdheS4KKwkgKi8KKworCWlmICghc3RyY21wKCJzbXVkZ2UiLCBlcCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBlcnJvcigiJXM6IGxhY2tzIHZhbHVlIiwgdmFyKTsKKwkJZHJ2LT5zbXVkZ2UgPSBzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCgiY2xlYW4iLCBlcCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBlcnJvcigiJXM6IGxhY2tzIHZhbHVlIiwgdmFyKTsKKwkJZHJ2LT5jbGVhbiA9IHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfY29udmVydF9jaGVjayhzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfY3JsZjsKKwlzdGF0aWMgc3RydWN0IGdpdF9hdHRyICphdHRyX2lkZW50OworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfZmlsdGVyOworCisJaWYgKCFhdHRyX2NybGYpIHsKKwkJYXR0cl9jcmxmID0gZ2l0X2F0dHIoImNybGYiLCA0KTsKKwkJYXR0cl9pZGVudCA9IGdpdF9hdHRyKCJpZGVudCIsIDUpOworCQlhdHRyX2ZpbHRlciA9IGdpdF9hdHRyKCJmaWx0ZXIiLCA2KTsKKwkJdXNlcl9jb252ZXJ0X3RhaWwgPSAmdXNlcl9jb252ZXJ0OworCQlnaXRfY29uZmlnKHJlYWRfY29udmVydF9jb25maWcpOworCX0KKwljaGVja1swXS5hdHRyID0gYXR0cl9jcmxmOworCWNoZWNrWzFdLmF0dHIgPSBhdHRyX2lkZW50OworCWNoZWNrWzJdLmF0dHIgPSBhdHRyX2ZpbHRlcjsKK30KKworc3RhdGljIGludCBjb3VudF9pZGVudChjb25zdCBjaGFyICpjcCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qCisJICogIiRJZDogMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAkIiA8PT4gIiRJZCQiCisJICovCisJaW50IGNudCA9IDA7CisJY2hhciBjaDsKKworCXdoaWxlIChzaXplKSB7CisJCWNoID0gKmNwKys7CisJCXNpemUtLTsKKwkJaWYgKGNoICE9ICckJykKKwkJCWNvbnRpbnVlOworCQlpZiAoc2l6ZSA8IDMpCisJCQlicmVhazsKKwkJaWYgKG1lbWNtcCgiSWQiLCBjcCwgMikpCisJCQljb250aW51ZTsKKwkJY2ggPSBjcFsyXTsKKwkJY3AgKz0gMzsKKwkJc2l6ZSAtPSAzOworCQlpZiAoY2ggPT0gJyQnKQorCQkJY250Kys7IC8qICRJZCQgKi8KKwkJaWYgKGNoICE9ICc6JykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqICIkSWQ6IC4uLiAiOyBzY2FuIHVwIHRvIHRoZSBjbG9zaW5nIGRvbGxhciBzaWduIGFuZCBkaXNjYXJkLgorCQkgKi8KKwkJd2hpbGUgKHNpemUpIHsKKwkJCWNoID0gKmNwKys7CisJCQlzaXplLS07CisJCQlpZiAoY2ggPT0gJyQnKSB7CisJCQkJY250Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGNoYXIgKmlkZW50X3RvX2dpdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgKnNpemVwLCBpbnQgaWRlbnQpCit7CisJaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciAqZHN0LCAqYnVmOworCisJaWYgKCFpZGVudCkKKwkJcmV0dXJuIE5VTEw7CisJc2l6ZSA9ICpzaXplcDsKKwljbnQgPSBjb3VudF9pZGVudChzcmMsIHNpemUpOworCWlmICghY250KQorCQlyZXR1cm4gTlVMTDsKKwlidWYgPSB4bWFsbG9jKHNpemUpOworCisJZm9yIChkc3QgPSBidWY7IHNpemU7IHNpemUtLSkgeworCQljaGFyIGNoID0gKnNyYysrOworCQkqZHN0KysgPSBjaDsKKwkJaWYgKChjaCA9PSAnJCcpICYmICgzIDw9IHNpemUpICYmCisJCSAgICAhbWVtY21wKCJJZDoiLCBzcmMsIDMpKSB7CisJCQl1bnNpZ25lZCBsb25nIHJlbSA9IHNpemUgLSAzOworCQkJY29uc3QgY2hhciAqY3AgPSBzcmMgKyAzOworCQkJZG8geworCQkJCWNoID0gKmNwKys7CisJCQkJaWYgKGNoID09ICckJykKKwkJCQkJYnJlYWs7CisJCQkJcmVtLS07CisJCQl9IHdoaWxlIChyZW0pOworCQkJaWYgKCFyZW0pCisJCQkJY29udGludWU7CisJCQltZW1jcHkoZHN0LCAiSWQkIiwgMyk7CisJCQlkc3QgKz0gMzsKKwkJCXNpemUgLT0gKGNwIC0gc3JjKTsKKwkJCXNyYyA9IGNwOworCQl9CisJfQorCisJKnNpemVwID0gZHN0IC0gYnVmOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICppZGVudF90b193b3JrdHJlZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgKnNpemVwLCBpbnQgaWRlbnQpCit7CisJaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciAqZHN0LCAqYnVmOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoIWlkZW50KQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSAqc2l6ZXA7CisJY250ID0gY291bnRfaWRlbnQoc3JjLCBzaXplKTsKKwlpZiAoIWNudCkKKwkJcmV0dXJuIE5VTEw7CisKKwloYXNoX3NoYTFfZmlsZShzcmMsIHNpemUsICJibG9iIiwgc2hhMSk7CisJYnVmID0geG1hbGxvYyhzaXplICsgY250ICogNDMpOworCisJZm9yIChkc3QgPSBidWY7IHNpemU7IHNpemUtLSkgeworCQljb25zdCBjaGFyICpjcDsKKwkJLyogRmV0Y2ggbmV4dCBzb3VyY2UgY2hhcmFjdGVyLCBtb3ZlIHRoZSBwb2ludGVyIG9uICovCisJCWNoYXIgY2ggPSAqc3JjKys7CisJCS8qIENvcHkgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHRvIHRoZSBkZXN0aW5hdGlvbiAqLworCQkqZHN0KysgPSBjaDsKKwkJLyogSWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzICIkIiBvciB0aGVyZSBhcmUgbGVzcyB0aGFuIHRocmVlCisJCSAqIHJlbWFpbmluZyBieXRlcyBvciB0aGUgdHdvIGJ5dGVzIGZvbGxvd2luZyB0aGlzIG9uZSBhcmUgbm90CisJCSAqICJJZCIsIHRoZW4gc2ltcGx5IHJlYWQgdGhlIG5leHQgY2hhcmFjdGVyICovCisJCWlmICgoY2ggIT0gJyQnKSB8fCAoc2l6ZSA8IDMpIHx8IG1lbWNtcCgiSWQiLCBzcmMsIDIpKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIEhlcmUgd2hlbgorCQkgKiAgLSBUaGVyZSBhcmUgbW9yZSB0aGFuIDIgYnl0ZXMgcmVtYWluaW5nCisJCSAqICAtIFRoZSBjdXJyZW50IHRocmVlIGJ5dGVzIGFyZSAiJElkIgorCQkgKiB3aXRoCisJCSAqICAtIGNoID09ICIkIgorCQkgKiAgLSBzcmNbMF0gPT0gIkkiCisJCSAqLworCisJCS8qCisJCSAqIEl0J3MgcG9zc2libGUgdGhhdCBhbiBleHBhbmRlZCBJZCBoYXMgY3JlcHQgaXRzIHdheSBpbnRvIHRoZQorCQkgKiByZXBvc2l0b3J5LCB3ZSBjb3BlIHdpdGggdGhhdCBieSBzdHJpcHBpbmcgdGhlIGV4cGFuc2lvbiBvdXQKKwkJICovCisJCWlmIChzcmNbMl0gPT0gJzonKSB7CisJCQkvKiBFeHBhbmRlZCBrZXl3b3JkcyBoYXZlICIkSWQ6IiBhdCB0aGUgZnJvbnQgKi8KKworCQkJLyogZGlzY2FyZCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgY2xvc2luZyAkICovCisJCQl1bnNpZ25lZCBsb25nIHJlbSA9IHNpemUgLSAzOworCQkJLyogUG9pbnQgYXQgZmlyc3QgYnl0ZSBhZnRlciB0aGUgIjoiICovCisJCQljcCA9IHNyYyArIDM7CisJCQkvKgorCQkJICogVGhyb3cgYXdheSBjaGFyYWN0ZXJzIHVudGlsIGVpdGhlcgorCQkJICogIC0gd2UgcmVhY2ggYSAiJCIKKwkJCSAqICAtIHdlIHJ1biBvdXQgb2YgYnl0ZXMgKHJlbSA9PSAwKQorCQkJICovCisJCQlkbyB7CisJCQkJY2ggPSAqY3A7CisJCQkJaWYgKGNoID09ICckJykKKwkJCQkJYnJlYWs7CisJCQkJY3ArKzsKKwkJCQlyZW0tLTsKKwkJCX0gd2hpbGUgKHJlbSk7CisJCQkvKiBJZiB0aGUgYWJvdmUgZmluaXNoZWQgYmVjYXVzZSBpdCByYW4gb3V0IG9mIGNoYXJhY3RlcnMsIHRoZW4KKwkJCSAqIHRoaXMgaXMgYW4gaW5jb21wbGV0ZSBrZXl3b3JkLCBzbyBkb24ndCBydW4gdGhlIGV4cGFuc2lvbiAqLworCQkJaWYgKCFyZW0pCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3JjWzJdID09ICckJykKKwkJCWNwID0gc3JjICsgMjsKKwkJZWxzZQorCQkJLyogQW55dGhpbmcgb3RoZXIgdGhhbiAiJElkOlhYWCQiIG9yICRJZCQgYW5kIHdlIHNraXAgdGhlCisJCQkgKiBleHBhbnNpb24gKi8KKwkJCWNvbnRpbnVlOworCisJCS8qIGNwIGlzIG5vdyBwb2ludGluZyBhdCB0aGUgbGFzdCAkIG9mIHRoZSBrZXl3b3JkICovCisKKwkJbWVtY3B5KGRzdCwgIklkOiAiLCA0KTsKKwkJZHN0ICs9IDQ7CisJCW1lbWNweShkc3QsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7CisJCWRzdCArPSA0MDsKKwkJKmRzdCsrID0gJyAnOworCisJCS8qIEFkanVzdCBmb3IgdGhlIGNoYXJhY3RlcnMgd2UndmUgZGlzY2FyZGVkICovCisJCXNpemUgLT0gKGNwIC0gc3JjKTsKKwkJc3JjID0gY3A7CisKKwkJLyogQ29weSB0aGUgZmluYWwgIiQiICovCisJCSpkc3QrKyA9ICpzcmMrKzsKKwkJc2l6ZS0tOworCX0KKworCSpzaXplcCA9IGRzdCAtIGJ1ZjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGdpdF9wYXRoX2NoZWNrX2NybGYoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjaykKK3sKKwljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrLT52YWx1ZTsKKworCWlmIChBVFRSX1RSVUUodmFsdWUpKQorCQlyZXR1cm4gQ1JMRl9URVhUOworCWVsc2UgaWYgKEFUVFJfRkFMU0UodmFsdWUpKQorCQlyZXR1cm4gQ1JMRl9CSU5BUlk7CisJZWxzZSBpZiAoQVRUUl9VTlNFVCh2YWx1ZSkpCisJCTsKKwllbHNlIGlmICghc3RyY21wKHZhbHVlLCAiaW5wdXQiKSkKKwkJcmV0dXJuIENSTEZfSU5QVVQ7CisJcmV0dXJuIENSTEZfR1VFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29udmVydF9kcml2ZXIgKmdpdF9wYXRoX2NoZWNrX2NvbnZlcnQoY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJICAgICBzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCWNvbnN0IGNoYXIgKnZhbHVlID0gY2hlY2stPnZhbHVlOworCXN0cnVjdCBjb252ZXJ0X2RyaXZlciAqZHJ2OworCisJaWYgKEFUVFJfVFJVRSh2YWx1ZSkgfHwgQVRUUl9GQUxTRSh2YWx1ZSkgfHwgQVRUUl9VTlNFVCh2YWx1ZSkpCisJCXJldHVybiBOVUxMOworCWZvciAoZHJ2ID0gdXNlcl9jb252ZXJ0OyBkcnY7IGRydiA9IGRydi0+bmV4dCkKKwkJaWYgKCFzdHJjbXAodmFsdWUsIGRydi0+bmFtZSkpCisJCQlyZXR1cm4gZHJ2OworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdpdF9wYXRoX2NoZWNrX2lkZW50KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2spCit7CisJY29uc3QgY2hhciAqdmFsdWUgPSBjaGVjay0+dmFsdWU7CisKKwlyZXR1cm4gISFBVFRSX1RSVUUodmFsdWUpOworfQorCitjaGFyICpjb252ZXJ0X3RvX2dpdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayBjaGVja1szXTsKKwlpbnQgY3JsZiA9IENSTEZfR1VFU1M7CisJaW50IGlkZW50ID0gMDsKKwljaGFyICpmaWx0ZXIgPSBOVUxMOworCWNoYXIgKmJ1ZiwgKmJ1ZjI7CisKKwlzZXR1cF9jb252ZXJ0X2NoZWNrKGNoZWNrKTsKKwlpZiAoIWdpdF9jaGVja2F0dHIocGF0aCwgQVJSQVlfU0laRShjaGVjayksIGNoZWNrKSkgeworCQlzdHJ1Y3QgY29udmVydF9kcml2ZXIgKmRydjsKKwkJY3JsZiA9IGdpdF9wYXRoX2NoZWNrX2NybGYocGF0aCwgY2hlY2sgKyAwKTsKKwkJaWRlbnQgPSBnaXRfcGF0aF9jaGVja19pZGVudChwYXRoLCBjaGVjayArIDEpOworCQlkcnYgPSBnaXRfcGF0aF9jaGVja19jb252ZXJ0KHBhdGgsIGNoZWNrICsgMik7CisJCWlmIChkcnYgJiYgZHJ2LT5jbGVhbikKKwkJCWZpbHRlciA9IGRydi0+Y2xlYW47CisJfQorCisJYnVmID0gYXBwbHlfZmlsdGVyKHBhdGgsIHNyYywgc2l6ZXAsIGZpbHRlcik7CisKKwlidWYyID0gY3JsZl90b19naXQocGF0aCwgYnVmID8gYnVmIDogc3JjLCBzaXplcCwgY3JsZik7CisJaWYgKGJ1ZjIpIHsKKwkJZnJlZShidWYpOworCQlidWYgPSBidWYyOworCX0KKworCWJ1ZjIgPSBpZGVudF90b19naXQocGF0aCwgYnVmID8gYnVmIDogc3JjLCBzaXplcCwgaWRlbnQpOworCWlmIChidWYyKSB7CisJCWZyZWUoYnVmKTsKKwkJYnVmID0gYnVmMjsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitjaGFyICpjb252ZXJ0X3RvX3dvcmtpbmdfdHJlZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayBjaGVja1szXTsKKwlpbnQgY3JsZiA9IENSTEZfR1VFU1M7CisJaW50IGlkZW50ID0gMDsKKwljaGFyICpmaWx0ZXIgPSBOVUxMOworCWNoYXIgKmJ1ZiwgKmJ1ZjI7CisKKwlzZXR1cF9jb252ZXJ0X2NoZWNrKGNoZWNrKTsKKwlpZiAoIWdpdF9jaGVja2F0dHIocGF0aCwgQVJSQVlfU0laRShjaGVjayksIGNoZWNrKSkgeworCQlzdHJ1Y3QgY29udmVydF9kcml2ZXIgKmRydjsKKwkJY3JsZiA9IGdpdF9wYXRoX2NoZWNrX2NybGYocGF0aCwgY2hlY2sgKyAwKTsKKwkJaWRlbnQgPSBnaXRfcGF0aF9jaGVja19pZGVudChwYXRoLCBjaGVjayArIDEpOworCQlkcnYgPSBnaXRfcGF0aF9jaGVja19jb252ZXJ0KHBhdGgsIGNoZWNrICsgMik7CisJCWlmIChkcnYgJiYgZHJ2LT5zbXVkZ2UpCisJCQlmaWx0ZXIgPSBkcnYtPnNtdWRnZTsKKwl9CisKKwlidWYgPSBpZGVudF90b193b3JrdHJlZShwYXRoLCBzcmMsIHNpemVwLCBpZGVudCk7CisKKwlidWYyID0gY3JsZl90b193b3JrdHJlZShwYXRoLCBidWYgPyBidWYgOiBzcmMsIHNpemVwLCBjcmxmKTsKKwlpZiAoYnVmMikgeworCQlmcmVlKGJ1Zik7CisJCWJ1ZiA9IGJ1ZjI7CisJfQorCisJYnVmMiA9IGFwcGx5X2ZpbHRlcihwYXRoLCBidWYgPyBidWYgOiBzcmMsIHNpemVwLCBmaWx0ZXIpOworCWlmIChidWYyKSB7CisJCWZyZWUoYnVmKTsKKwkJYnVmID0gYnVmMjsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCit2b2lkICpjb252ZXJ0X3NoYTFfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUsIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXZvaWQgKmJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5cGUsIHNpemUpOworCWlmIChTX0lTUkVHKG1vZGUpICYmIGJ1ZmZlcikgeworCQl2b2lkICpjb252ZXJ0ZWQgPSBjb252ZXJ0X3RvX3dvcmtpbmdfdHJlZShwYXRoLCBidWZmZXIsIHNpemUpOworCQlpZiAoY29udmVydGVkKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlidWZmZXIgPSBjb252ZXJ0ZWQ7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZmZlcjsKK30KZGlmZiAtLWdpdCBhL2NvcHkuYyBiL2NvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQwYmIyCi0tLSAvZGV2L251bGwKKysrIGIvY29weS5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgY29weV9mZChpbnQgaWZkLCBpbnQgb2ZkKQoreworCXdoaWxlICgxKSB7CisJCWNoYXIgYnVmZmVyWzgxOTJdOworCQljaGFyICpidWYgPSBidWZmZXI7CisJCXNzaXplX3QgbGVuID0geHJlYWQoaWZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWludCByZWFkX2Vycm9yOworCQkJcmVhZF9lcnJvciA9IGVycm5vOworCQkJY2xvc2UoaWZkKTsKKwkJCXJldHVybiBlcnJvcigiY29weS1mZDogcmVhZCByZXR1cm5lZCAlcyIsCisJCQkJICAgICBzdHJlcnJvcihyZWFkX2Vycm9yKSk7CisJCX0KKwkJd2hpbGUgKGxlbikgeworCQkJaW50IHdyaXR0ZW4gPSB4d3JpdGUob2ZkLCBidWYsIGxlbik7CisJCQlpZiAod3JpdHRlbiA+IDApIHsKKwkJCQlidWYgKz0gd3JpdHRlbjsKKwkJCQlsZW4gLT0gd3JpdHRlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKCF3cml0dGVuKSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkIDAiKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkICVzIiwKKwkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfQorCWNsb3NlKGlmZCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NzdW0tZmlsZS5jIGIvY3N1bS1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MDZhZAotLS0gL2Rldi9udWxsCisrKyBiL2NzdW0tZmlsZS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogY3N1bS1maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyAqCisgKiBTaW1wbGUgZmlsZSB3cml0ZSBpbmZyYXN0cnVjdHVyZSBmb3Igd3JpdGluZyBTSEExLXN1bW1lZAorICogZmlsZXMuIFVzZWZ1bCB3aGVuIHlvdSB3cml0ZSBhIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBiZQorICogYWJsZSB0byB2ZXJpZnkgaGFzbid0IGJlZW4gbWVzc2VkIHdpdGggYWZ0ZXJ3YXJkcy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisKK3N0YXRpYyB2b2lkIHNoYTFmbHVzaChzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl2b2lkICpidWYgPSBmLT5idWZmZXI7CisKKwlmb3IgKDs7KSB7CisJCWludCByZXQgPSB4d3JpdGUoZi0+ZmQsIGJ1ZiwgY291bnQpOworCQlpZiAocmV0ID4gMCkgeworCQkJYnVmID0gKGNoYXIgKikgYnVmICsgcmV0OworCQkJY291bnQgLT0gcmV0OworCQkJaWYgKGNvdW50KQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuOworCQl9CisJCWlmICghcmV0KQorCQkJZGllKCJzaGExIGZpbGUgJyVzJyB3cml0ZSBlcnJvci4gT3V0IG9mIGRpc2tzcGFjZSIsIGYtPm5hbWUpOworCQlkaWUoInNoYTEgZmlsZSAnJXMnIHdyaXRlIGVycm9yICglcykiLCBmLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworaW50IHNoYTFjbG9zZShzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgaW50IHVwZGF0ZSkKK3sKKwl1bnNpZ25lZCBvZmZzZXQgPSBmLT5vZmZzZXQ7CisJaWYgKG9mZnNldCkgeworCQlTSEExX1VwZGF0ZSgmZi0+Y3R4LCBmLT5idWZmZXIsIG9mZnNldCk7CisJCXNoYTFmbHVzaChmLCBvZmZzZXQpOworCX0KKwlTSEExX0ZpbmFsKGYtPmJ1ZmZlciwgJmYtPmN0eCk7CisJaWYgKHJlc3VsdCkKKwkJaGFzaGNweShyZXN1bHQsIGYtPmJ1ZmZlcik7CisJaWYgKHVwZGF0ZSkKKwkJc2hhMWZsdXNoKGYsIDIwKTsKKwlpZiAoY2xvc2UoZi0+ZmQpKQorCQlkaWUoIiVzOiBzaGExIGZpbGUgZXJyb3Igb24gY2xvc2UgKCVzKSIsIGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZnJlZShmKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNoYTF3cml0ZShzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlmIChmLT5kb19jcmMpCisJCWYtPmNyYzMyID0gY3JjMzIoZi0+Y3JjMzIsIGJ1ZiwgY291bnQpOworCXdoaWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBvZmZzZXQgPSBmLT5vZmZzZXQ7CisJCXVuc2lnbmVkIGxlZnQgPSBzaXplb2YoZi0+YnVmZmVyKSAtIG9mZnNldDsKKwkJdW5zaWduZWQgbnIgPSBjb3VudCA+IGxlZnQgPyBsZWZ0IDogY291bnQ7CisKKwkJbWVtY3B5KGYtPmJ1ZmZlciArIG9mZnNldCwgYnVmLCBucik7CisJCWNvdW50IC09IG5yOworCQlvZmZzZXQgKz0gbnI7CisJCWJ1ZiA9IChjaGFyICopIGJ1ZiArIG5yOworCQlsZWZ0IC09IG5yOworCQlpZiAoIWxlZnQpIHsKKwkJCVNIQTFfVXBkYXRlKCZmLT5jdHgsIGYtPmJ1ZmZlciwgb2Zmc2V0KTsKKwkJCXNoYTFmbHVzaChmLCBvZmZzZXQpOworCQkJb2Zmc2V0ID0gMDsKKwkJfQorCQlmLT5vZmZzZXQgPSBvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFjcmVhdGUoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXVuc2lnbmVkIGxlbjsKKwl2YV9saXN0IGFyZzsKKwlpbnQgZmQ7CisKKwlmID0geG1hbGxvYyhzaXplb2YoKmYpKTsKKworCXZhX3N0YXJ0KGFyZywgZm10KTsKKwlsZW4gPSB2c25wcmludGYoZi0+bmFtZSwgc2l6ZW9mKGYtPm5hbWUpLCBmbXQsIGFyZyk7CisJdmFfZW5kKGFyZyk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJZGllKCJ5b3Ugd2FzY2FsbHkgd2FiYml0LCB5b3UiKTsKKwlmLT5uYW1lbGVuID0gbGVuOworCisJZmQgPSBvcGVuKGYtPm5hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gb3BlbiAlcyAoJXMpIiwgZi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlmLT5mZCA9IGZkOworCWYtPmVycm9yID0gMDsKKwlmLT5vZmZzZXQgPSAwOworCWYtPmRvX2NyYyA9IDA7CisJU0hBMV9Jbml0KCZmLT5jdHgpOworCXJldHVybiBmOworfQorCitzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFmZChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXVuc2lnbmVkIGxlbjsKKworCWYgPSB4bWFsbG9jKHNpemVvZigqZikpOworCisJbGVuID0gc3RybGVuKG5hbWUpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCWRpZSgieW91IHdhc2NhbGx5IHdhYmJpdCwgeW91Iik7CisJZi0+bmFtZWxlbiA9IGxlbjsKKwltZW1jcHkoZi0+bmFtZSwgbmFtZSwgbGVuKzEpOworCisJZi0+ZmQgPSBmZDsKKwlmLT5lcnJvciA9IDA7CisJZi0+b2Zmc2V0ID0gMDsKKwlmLT5kb19jcmMgPSAwOworCVNIQTFfSW5pdCgmZi0+Y3R4KTsKKwlyZXR1cm4gZjsKK30KKworaW50IHNoYTF3cml0ZV9jb21wcmVzc2VkKHN0cnVjdCBzaGExZmlsZSAqZiwgdm9pZCAqaW4sIHVuc2lnbmVkIGludCBzaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBsb25nIG1heHNpemU7CisJdm9pZCAqb3V0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwltYXhzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCW91dCA9IHhtYWxsb2MobWF4c2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X2luID0gaW47CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKworCXN0cmVhbS5uZXh0X291dCA9IG91dDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gbWF4c2l6ZTsKKworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSA9PSBaX09LKQorCQkvKiBub3RoaW5nICovOworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisKKwlzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlzaGExd3JpdGUoZiwgb3V0LCBzaXplKTsKKwlmcmVlKG91dCk7CisJcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgY3JjMzJfYmVnaW4oc3RydWN0IHNoYTFmaWxlICpmKQoreworCWYtPmNyYzMyID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKwlmLT5kb19jcmMgPSAxOworfQorCit1aW50MzJfdCBjcmMzMl9lbmQoc3RydWN0IHNoYTFmaWxlICpmKQoreworCWYtPmRvX2NyYyA9IDA7CisJcmV0dXJuIGYtPmNyYzMyOworfQpkaWZmIC0tZ2l0IGEvY3N1bS1maWxlLmggYi9jc3VtLWZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTEzMzkxCi0tLSAvZGV2L251bGwKKysrIGIvY3N1bS1maWxlLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBDU1VNX0ZJTEVfSAorI2RlZmluZSBDU1VNX0ZJTEVfSAorCisvKiBBIFNIQTEtcHJvdGVjdGVkIGZpbGUgKi8KK3N0cnVjdCBzaGExZmlsZSB7CisJaW50IGZkLCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBuYW1lbGVuOworCVNIQV9DVFggY3R4OworCWNoYXIgbmFtZVtQQVRIX01BWF07CisJaW50IGRvX2NyYzsKKwl1aW50MzJfdCBjcmMzMjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls4MTkyXTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFmZChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHN0cnVjdCBzaGExZmlsZSAqc2hhMWNyZWF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gaW50IHNoYTFjbG9zZShzdHJ1Y3Qgc2hhMWZpbGUgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCBzaGExd3JpdGUoc3RydWN0IHNoYTFmaWxlICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgc2hhMXdyaXRlX2NvbXByZXNzZWQoc3RydWN0IHNoYTFmaWxlICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGNyYzMyX2JlZ2luKHN0cnVjdCBzaGExZmlsZSAqKTsKK2V4dGVybiB1aW50MzJfdCBjcmMzMl9lbmQoc3RydWN0IHNoYTFmaWxlICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2N0eXBlLmMgYi9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmRmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jdHlwZS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBTYW5lIGxvY2FsZS1pbmRlcGVuZGVudCwgQVNDSUkgY3R5cGUuCisgKgorICogTm8gc3VycHJpc2VzLCBhbmQgd29ya3Mgd2l0aCBzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXJzLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBTUyBHSVRfU1BBQ0UKKyNkZWZpbmUgQUEgR0lUX0FMUEhBCisjZGVmaW5lIEREIEdJVF9ESUdJVAorCit1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XSA9IHsKKwkgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCBTUywgU1MsICAwLCAgMCwgU1MsICAwLCAgMCwJCS8qIDAtMTUgKi8KKwkgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDE2LTE1ICovCisJU1MsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiAzMi0xNSAqLworCURELCBERCwgREQsIERELCBERCwgREQsIERELCBERCwgREQsIERELCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogNDgtMTUgKi8KKwkgMCwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwJCS8qIDY0LTE1ICovCisJQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiA4MC0xNSAqLworCSAwLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLAkJLyogOTYtMTUgKi8KKwlBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDExMi0xNSAqLworCS8qIE5vdGhpbmcgaW4gdGhlIDEyOC4uIHJhbmdlICovCit9OworCmRpZmYgLS1naXQgYS9kYWVtb24uYyBiL2RhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NGUzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb24uYwpAQCAtMCwwICsxLDExODEgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJpbnRlcnBvbGF0ZS5oIgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZm5kZWYgSE9TVF9OQU1FX01BWAorI2RlZmluZSBIT1NUX05BTUVfTUFYIDI1NgorI2VuZGlmCisKK3N0YXRpYyBpbnQgbG9nX3N5c2xvZzsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgcmV1c2VhZGRyOworCitzdGF0aWMgY29uc3QgY2hhciBkYWVtb25fdXNhZ2VbXSA9CisiZ2l0LWRhZW1vbiBbLS12ZXJib3NlXSBbLS1zeXNsb2ddIFstLWV4cG9ydC1hbGxdXG4iCisiICAgICAgICAgICBbLS10aW1lb3V0PW5dIFstLWluaXQtdGltZW91dD1uXSBbLS1zdHJpY3QtcGF0aHNdXG4iCisiICAgICAgICAgICBbLS1iYXNlLXBhdGg9cGF0aF0gWy0tdXNlci1wYXRoIHwgLS11c2VyLXBhdGg9cGF0aF1cbiIKKyIgICAgICAgICAgIFstLWludGVycG9sYXRlZC1wYXRoPXBhdGhdXG4iCisiICAgICAgICAgICBbLS1yZXVzZWFkZHJdIFstLWRldGFjaF0gWy0tcGlkLWZpbGU9ZmlsZV1cbiIKKyIgICAgICAgICAgIFstLVtlbmFibGV8ZGlzYWJsZXxhbGxvdy1vdmVycmlkZXxmb3JiaWQtb3ZlcnJpZGVdPXNlcnZpY2VdXG4iCisiICAgICAgICAgICBbLS1pbmV0ZCB8IFstLWxpc3Rlbj1ob3N0X29yX2lwYWRkcl0gWy0tcG9ydD1uXVxuIgorIiAgICAgICAgICAgICAgICAgICAgICBbLS11c2VyPXVzZXIgWy0tZ3JvdXA9Z3JvdXBdXVxuIgorIiAgICAgICAgICAgW2RpcmVjdG9yeS4uLl0iOworCisvKiBMaXN0IG9mIGFjY2VwdGFibGUgcGF0aG5hbWUgcHJlZml4ZXMgKi8KK3N0YXRpYyBjaGFyICoqb2tfcGF0aHM7CitzdGF0aWMgaW50IHN0cmljdF9wYXRoczsKKworLyogSWYgdGhpcyBpcyBzZXQsIGdpdC1kYWVtb24tZXhwb3J0LW9rIGlzIG5vdCByZXF1aXJlZCAqLworc3RhdGljIGludCBleHBvcnRfYWxsX3RyZWVzOworCisvKiBUYWtlIGFsbCBwYXRocyByZWxhdGl2ZSB0byB0aGlzIG9uZSBpZiBub24tTlVMTCAqLworc3RhdGljIGNoYXIgKmJhc2VfcGF0aDsKK3N0YXRpYyBjaGFyICppbnRlcnBvbGF0ZWRfcGF0aDsKKworLyogRmxhZyBpbmRpY2F0aW5nIGNsaWVudCBzZW50IGV4dHJhIGFyZ3MuICovCitzdGF0aWMgaW50IHNhd19leHRlbmRlZF9hcmdzOworCisvKiBJZiBkZWZpbmVkLCB+dXNlciBub3RhdGlvbiBpcyBhbGxvd2VkIGFuZCB0aGUgc3RyaW5nIGlzIGluc2VydGVkCisgKiBhZnRlciB+dXNlci8uICBFLmcuIGEgcmVxdWVzdCB0byBnaXQ6Ly9ob3N0L35hbGljZS9mcm90eiB3b3VsZAorICogZ28gdG8gL2hvbWUvYWxpY2UvcHViX2dpdC9mcm90eiB3aXRoIC0tdXNlci1wYXRoPXB1Yl9naXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp1c2VyX3BhdGg7CisKKy8qIFRpbWVvdXQsIGFuZCBpbml0aWFsIHRpbWVvdXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF90aW1lb3V0OworCisvKgorICogU3RhdGljIHRhYmxlIGZvciBub3cuICBVZ2guCisgKiBGZWVsIGZyZWUgdG8gbWFrZSBkeW5hbWljIGFzIG5lZWRlZC4KKyAqLworI2RlZmluZSBJTlRFUlBfU0xPVF9IT1NUCSgwKQorI2RlZmluZSBJTlRFUlBfU0xPVF9DQU5PTl9IT1NUCSgxKQorI2RlZmluZSBJTlRFUlBfU0xPVF9JUAkJKDIpCisjZGVmaW5lIElOVEVSUF9TTE9UX1BPUlQJKDMpCisjZGVmaW5lIElOVEVSUF9TTE9UX0RJUgkJKDQpCisjZGVmaW5lIElOVEVSUF9TTE9UX1BFUkNFTlQJKDUpCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJwIGludGVycF90YWJsZVtdID0geworCXsgIiVIIiwgMH0sCisJeyAiJUNIIiwgMH0sCisJeyAiJUlQIiwgMH0sCisJeyAiJVAiLCAwfSwKKwl7ICIlRCIsIDB9LAorCXsgIiUlIiwgMH0sCit9OworCisKK3N0YXRpYyB2b2lkIGxvZ3JlcG9ydChpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJLyogV2Ugc2hvdWxkIGRvIGEgc2luZ2xlIHdyaXRlIHNvIHRoYXQgaXQgaXMgYXRvbWljIGFuZCBvdXRwdXQKKwkgKiBvZiBzZXZlcmFsIHByb2Nlc3NlcyBkbyBub3QgZ2V0IGludGVybWluZ2xlZC4gKi8KKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgYnVmbGVuOworCWludCBtYXhsZW4sIG1zZ2xlbjsKKworCS8qIHNpemVvZihidWYpIHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciAiW3BpZF0gXG4iICovCisJYnVmbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlslbGRdICIsIChsb25nKSBnZXRwaWQoKSk7CisKKwltYXhsZW4gPSBzaXplb2YoYnVmKSAtIGJ1ZmxlbiAtIDE7IC8qIC0xIGZvciBvdXIgb3duIExGICovCisJbXNnbGVuID0gdnNucHJpbnRmKGJ1ZiArIGJ1ZmxlbiwgbWF4bGVuLCBlcnIsIHBhcmFtcyk7CisKKwlpZiAobG9nX3N5c2xvZykgeworCQlzeXNsb2cocHJpb3JpdHksICIlcyIsIGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwkvKiBtYXhsZW4gY291bnRlZCBvdXIgb3duIExGIGJ1dCBhbHNvIGNvdW50cyBzcGFjZSBnaXZlbiB0bworCSAqIHZzbnByaW50ZiBmb3IgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQKKwkgKiB3ZSBoYXZlIHNwYWNlIGZvciBvdXIgb3duIExGIGFuZCBOVUwgYWZ0ZXIgdGhlICJtZWF0IiBvZiB0aGUKKwkgKiBtZXNzYWdlLCBzbyB0cnVuY2F0ZSBpdCBhdCBtYXhsZW4gLSAxLgorCSAqLworCWlmIChtc2dsZW4gPiBtYXhsZW4gLSAxKQorCQltc2dsZW4gPSBtYXhsZW4gLSAxOworCWVsc2UgaWYgKG1zZ2xlbiA8IDApCisJCW1zZ2xlbiA9IDA7IC8qIFByb3RlY3QgYWdhaW5zdCB3ZWlyZCByZXR1cm4gdmFsdWVzLiAqLworCWJ1ZmxlbiArPSBtc2dsZW47CisKKwlidWZbYnVmbGVuKytdID0gJ1xuJzsKKwlidWZbYnVmbGVuXSA9ICdcMCc7CisKKwl3cml0ZV9pbl9mdWxsKDIsIGJ1ZiwgYnVmbGVuKTsKK30KKworc3RhdGljIHZvaWQgbG9nZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWxvZ3JlcG9ydChMT0dfRVJSLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2luZm8oY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJaWYgKCF2ZXJib3NlKQorCQlyZXR1cm47CisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWxvZ3JlcG9ydChMT0dfSU5GTywgZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBOT1JFVFVSTiBkYWVtb25fZGllKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJbG9ncmVwb3J0KExPR19FUlIsIGVyciwgcGFyYW1zKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgaW50IGF2b2lkX2FsaWFzKGNoYXIgKnApCit7CisJaW50IHNsLCBuZG90OworCisJLyogCisJICogVGhpcyByZXN1cnJlY3RzIHRoZSBiZWx0cyBhbmQgc3VzcGVuZGVycyBwYXJhbm9pYSBjaGVjayBieSBIUEEKKwkgKiBkb25lIGluIDw0MzU1NjBGNy40MDgwMDA2QHp5dG9yLmNvbT4gdGhyZWFkLCBub3cgZW50ZXJfcmVwbygpCisJICogZG9lcyBub3QgZG8gZ2V0Y3dkKCkgYmFzZWQgcGF0aCBjYW5vbmljYWxpemF0aW9ucy4KKwkgKgorCSAqIHNsIGJlY29tZXMgdHJ1ZSBpbW1lZGlhdGVseSBhZnRlciBzZWVpbmcgJy8nIGFuZCBjb250aW51ZXMgdG8KKwkgKiBiZSB0cnVlIGFzIGxvbmcgYXMgZG90cyBjb250aW51ZSBhZnRlciB0aGF0IHdpdGhvdXQgaW50ZXJ2ZW5pbmcKKwkgKiBub24tZG90IGNoYXJhY3Rlci4KKwkgKi8KKwlpZiAoIXAgfHwgKCpwICE9ICcvJyAmJiAqcCAhPSAnficpKQorCQlyZXR1cm4gLTE7CisJc2wgPSAxOyBuZG90ID0gMDsKKwlwKys7CisKKwl3aGlsZSAoMSkgeworCQljaGFyIGNoID0gKnArKzsKKwkJaWYgKHNsKSB7CisJCQlpZiAoY2ggPT0gJy4nKQorCQkJCW5kb3QrKzsKKwkJCWVsc2UgaWYgKGNoID09ICcvJykgeworCQkJCWlmIChuZG90IDwgMykKKwkJCQkJLyogcmVqZWN0IC8vLCAvLi8gYW5kIC8uLi8gKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCW5kb3QgPSAwOworCQkJfQorCQkJZWxzZSBpZiAoY2ggPT0gMCkgeworCQkJCWlmICgwIDwgbmRvdCAmJiBuZG90IDwgMykKKwkJCQkJLyogcmVqZWN0IC8uJCBhbmQgLy4uJCAqLworCQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQllbHNlCisJCQkJc2wgPSBuZG90ID0gMDsKKwkJfQorCQllbHNlIGlmIChjaCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKGNoID09ICcvJykgeworCQkJc2wgPSAxOworCQkJbmRvdCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjaGFyICpwYXRoX29rKHN0cnVjdCBpbnRlcnAgKml0YWJsZSkKK3sKKwlzdGF0aWMgY2hhciBycGF0aFtQQVRIX01BWF07CisJc3RhdGljIGNoYXIgaW50ZXJwX3BhdGhbUEFUSF9NQVhdOworCWNoYXIgKnBhdGg7CisJY2hhciAqZGlyOworCisJZGlyID0gaXRhYmxlW0lOVEVSUF9TTE9UX0RJUl0udmFsdWU7CisKKwlpZiAoYXZvaWRfYWxpYXMoZGlyKSkgeworCQlsb2dlcnJvcigiJyVzJzogYWxpYXNlZCIsIGRpcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICgqZGlyID09ICd+JykgeworCQlpZiAoIXVzZXJfcGF0aCkgeworCQkJbG9nZXJyb3IoIiclcyc6IFVzZXItcGF0aCBub3QgYWxsb3dlZCIsIGRpcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKnVzZXJfcGF0aCkgeworCQkJLyogR290IGVpdGhlciAifmFsaWNlIiBvciAifmFsaWNlL2ZvbyI7CisJCQkgKiByZXdyaXRlIHRoZW0gdG8gIn5hbGljZS8lcyIgb3IKKwkJCSAqICJ+YWxpY2UvJXMvZm9vIi4KKwkJCSAqLworCQkJaW50IG5hbWxlbiwgcmVzdGxlbiA9IHN0cmxlbihkaXIpOworCQkJY2hhciAqc2xhc2ggPSBzdHJjaHIoZGlyLCAnLycpOworCQkJaWYgKCFzbGFzaCkKKwkJCQlzbGFzaCA9IGRpciArIHJlc3RsZW47CisJCQluYW1sZW4gPSBzbGFzaCAtIGRpcjsKKwkJCXJlc3RsZW4gLT0gbmFtbGVuOworCQkJbG9naW5mbygidXNlcnBhdGggPCVzPiwgcmVxdWVzdCA8JXM+LCBuYW1sZW4gJWQsIHJlc3RsZW4gJWQsIHNsYXNoIDwlcz4iLCB1c2VyX3BhdGgsIGRpciwgbmFtbGVuLCByZXN0bGVuLCBzbGFzaCk7CisJCQlzbnByaW50ZihycGF0aCwgUEFUSF9NQVgsICIlLipzLyVzJS4qcyIsCisJCQkJIG5hbWxlbiwgZGlyLCB1c2VyX3BhdGgsIHJlc3RsZW4sIHNsYXNoKTsKKwkJCWRpciA9IHJwYXRoOworCQl9CisJfQorCWVsc2UgaWYgKGludGVycG9sYXRlZF9wYXRoICYmIHNhd19leHRlbmRlZF9hcmdzKSB7CisJCWlmICgqZGlyICE9ICcvJykgeworCQkJLyogQWxsb3cgb25seSBhYnNvbHV0ZSAqLworCQkJbG9nZXJyb3IoIiclcyc6IE5vbi1hYnNvbHV0ZSBwYXRoIGRlbmllZCAoaW50ZXJwb2xhdGVkLXBhdGggYWN0aXZlKSIsIGRpcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWludGVycG9sYXRlKGludGVycF9wYXRoLCBQQVRIX01BWCwgaW50ZXJwb2xhdGVkX3BhdGgsCisJCQkgICAgaW50ZXJwX3RhYmxlLCBBUlJBWV9TSVpFKGludGVycF90YWJsZSkpOworCQlsb2dpbmZvKCJJbnRlcnBvbGF0ZWQgZGlyICclcyciLCBpbnRlcnBfcGF0aCk7CisKKwkJZGlyID0gaW50ZXJwX3BhdGg7CisJfQorCWVsc2UgaWYgKGJhc2VfcGF0aCkgeworCQlpZiAoKmRpciAhPSAnLycpIHsKKwkJCS8qIEFsbG93IG9ubHkgYWJzb2x1dGUgKi8KKwkJCWxvZ2Vycm9yKCInJXMnOiBOb24tYWJzb2x1dGUgcGF0aCBkZW5pZWQgKGJhc2UtcGF0aCBhY3RpdmUpIiwgZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNucHJpbnRmKHJwYXRoLCBQQVRIX01BWCwgIiVzJXMiLCBiYXNlX3BhdGgsIGRpcik7CisJCWRpciA9IHJwYXRoOworCX0KKworCXBhdGggPSBlbnRlcl9yZXBvKGRpciwgc3RyaWN0X3BhdGhzKTsKKworCWlmICghcGF0aCkgeworCQlsb2dlcnJvcigiJyVzJzogdW5hYmxlIHRvIGNoZGlyIG9yIG5vdCBhIGdpdCBhcmNoaXZlIiwgZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCBva19wYXRocyAmJiAqb2tfcGF0aHMgKSB7CisJCWNoYXIgKipwcDsKKwkJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisKKwkJLyogVGhlIHZhbGlkYXRpb24gaXMgZG9uZSBvbiB0aGUgcGF0aHMgYWZ0ZXIgZW50ZXJfcmVwbworCQkgKiBhcHBlbmRzIG9wdGlvbmFsIHsuZ2l0LC5naXQvLmdpdH0gYW5kIGZyaWVuZHMsIGJ1dCAKKwkJICogaXQgZG9lcyBub3QgdXNlIGdldGN3ZCgpLiAgU28gaWYgeW91ciAvcHViIGlzCisJCSAqIGEgc3ltbGluayB0byAvbW50L3B1YiwgeW91IGNhbiB3aGl0ZWxpc3QgL3B1YiBhbmQKKwkJICogZG8gbm90IGhhdmUgdG8gc2F5IC9tbnQvcHViLgorCQkgKiBEbyBub3Qgc2F5IC9wdWIvLgorCQkgKi8KKwkJZm9yICggcHAgPSBva19wYXRocyA7ICpwcCA7IHBwKysgKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKCpwcCk7CisJCQlpZiAobGVuIDw9IHBhdGhsZW4gJiYKKwkJCSAgICAhbWVtY21wKCpwcCwgcGF0aCwgbGVuKSAmJgorCQkJICAgIChwYXRoW2xlbl0gPT0gJ1wwJyB8fAorCQkJICAgICAoIXN0cmljdF9wYXRocyAmJiBwYXRoW2xlbl0gPT0gJy8nKSkpCisJCQkJcmV0dXJuIHBhdGg7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCisJCWlmICghc3RyaWN0X3BhdGhzKQorCQkJcmV0dXJuIHBhdGg7CisJfQorCisJbG9nZXJyb3IoIiclcyc6IG5vdCBpbiB3aGl0ZWxpc3QiLCBwYXRoKTsKKwlyZXR1cm4gTlVMTDsJCS8qIEZhbGx0aHJvdWdoLiBEZW55IGJ5IGRlZmF1bHQgKi8KK30KKwordHlwZWRlZiBpbnQgKCpkYWVtb25fc2VydmljZV9mbikodm9pZCk7CitzdHJ1Y3QgZGFlbW9uX3NlcnZpY2UgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqY29uZmlnX25hbWU7CisJZGFlbW9uX3NlcnZpY2VfZm4gZm47CisJaW50IGVuYWJsZWQ7CisJaW50IG92ZXJyaWRhYmxlOworfTsKKworc3RhdGljIHN0cnVjdCBkYWVtb25fc2VydmljZSAqc2VydmljZV9sb29raW5nX2F0Oworc3RhdGljIGludCBzZXJ2aWNlX2VuYWJsZWQ7CisKK3N0YXRpYyBpbnQgZ2l0X2RhZW1vbl9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXByZWZpeGNtcCh2YXIsICJkYWVtb24uIikgJiYKKwkgICAgIXN0cmNtcCh2YXIgKyA3LCBzZXJ2aWNlX2xvb2tpbmdfYXQtPmNvbmZpZ19uYW1lKSkgeworCQlzZXJ2aWNlX2VuYWJsZWQgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBwYXJzaW5nIGFueSBvdGhlciBjb25maWd1cmF0aW9uIGhlcmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydW5fc2VydmljZShzdHJ1Y3QgaW50ZXJwICppdGFibGUsIHN0cnVjdCBkYWVtb25fc2VydmljZSAqc2VydmljZSkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCWludCBlbmFibGVkID0gc2VydmljZS0+ZW5hYmxlZDsKKworCWxvZ2luZm8oIlJlcXVlc3QgJXMgZm9yICclcyciLAorCQlzZXJ2aWNlLT5uYW1lLAorCQlpdGFibGVbSU5URVJQX1NMT1RfRElSXS52YWx1ZSk7CisKKwlpZiAoIWVuYWJsZWQgJiYgIXNlcnZpY2UtPm92ZXJyaWRhYmxlKSB7CisJCWxvZ2Vycm9yKCInJXMnOiBzZXJ2aWNlIG5vdCBlbmFibGVkLiIsIHNlcnZpY2UtPm5hbWUpOworCQllcnJubyA9IEVBQ0NFUzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghKHBhdGggPSBwYXRoX29rKGl0YWJsZSkpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIFNlY3VyaXR5IG9uIHRoZSBjaGVhcC4KKwkgKgorCSAqIFdlIHdhbnQgYSByZWFkYWJsZSBIRUFELCB1c2FibGUgIm9iamVjdHMiIGRpcmVjdG9yeSwgYW5kCisJICogYSAiZ2l0LWRhZW1vbi1leHBvcnQtb2siIGZsYWcgdGhhdCBzYXlzIHRoYXQgdGhlIG90aGVyIHNpZGUKKwkgKiBpcyBvayB3aXRoIHVzIGRvaW5nIHRoaXMuCisJICoKKwkgKiBwYXRoX29rKCkgdXNlcyBlbnRlcl9yZXBvKCkgYW5kIGRvZXMgd2hpdGVsaXN0IGNoZWNraW5nLgorCSAqIFdlIG9ubHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHJlcG9zaXRvcnkgaXMgZXhwb3J0ZWQuCisJICovCisKKwlpZiAoIWV4cG9ydF9hbGxfdHJlZXMgJiYgYWNjZXNzKCJnaXQtZGFlbW9uLWV4cG9ydC1vayIsIEZfT0spKSB7CisJCWxvZ2Vycm9yKCInJXMnOiByZXBvc2l0b3J5IG5vdCBleHBvcnRlZC4iLCBwYXRoKTsKKwkJZXJybm8gPSBFQUNDRVM7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2VydmljZS0+b3ZlcnJpZGFibGUpIHsKKwkJc2VydmljZV9sb29raW5nX2F0ID0gc2VydmljZTsKKwkJc2VydmljZV9lbmFibGVkID0gLTE7CisJCWdpdF9jb25maWcoZ2l0X2RhZW1vbl9jb25maWcpOworCQlpZiAoMCA8PSBzZXJ2aWNlX2VuYWJsZWQpCisJCQllbmFibGVkID0gc2VydmljZV9lbmFibGVkOworCX0KKwlpZiAoIWVuYWJsZWQpIHsKKwkJbG9nZXJyb3IoIiclcyc6IHNlcnZpY2Ugbm90IGVuYWJsZWQgZm9yICclcyciLAorCQkJIHNlcnZpY2UtPm5hbWUsIHBhdGgpOworCQllcnJubyA9IEVBQ0NFUzsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogV2UnbGwgaWdub3JlIFNJR1RFUk0gZnJvbSBub3cgb24sIHdlIGhhdmUgYQorCSAqIGdvb2QgY2xpZW50LgorCSAqLworCXNpZ25hbChTSUdURVJNLCBTSUdfSUdOKTsKKworCXJldHVybiBzZXJ2aWNlLT5mbigpOworfQorCitzdGF0aWMgaW50IHVwbG9hZF9wYWNrKHZvaWQpCit7CisJLyogVGltZW91dCBhcyBzdHJpbmcgKi8KKwljaGFyIHRpbWVvdXRfYnVmWzY0XTsKKworCXNucHJpbnRmKHRpbWVvdXRfYnVmLCBzaXplb2YgdGltZW91dF9idWYsICItLXRpbWVvdXQ9JXUiLCB0aW1lb3V0KTsKKworCS8qIGdpdC11cGxvYWQtcGFjayBvbmx5IGV2ZXIgcmVhZHMgc3R1ZmYsIHNvIHRoaXMgaXMgc2FmZSAqLworCWV4ZWNsX2dpdF9jbWQoInVwbG9hZC1wYWNrIiwgIi0tc3RyaWN0IiwgdGltZW91dF9idWYsICIuIiwgTlVMTCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHVwbG9hZF9hcmNoaXZlKHZvaWQpCit7CisJZXhlY2xfZ2l0X2NtZCgidXBsb2FkLWFyY2hpdmUiLCAiLiIsIE5VTEwpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWNlaXZlX3BhY2sodm9pZCkKK3sKKwlleGVjbF9naXRfY21kKCJyZWNlaXZlLXBhY2siLCAiLiIsIE5VTEwpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBkYWVtb25fc2VydmljZSBkYWVtb25fc2VydmljZVtdID0geworCXsgInVwbG9hZC1hcmNoaXZlIiwgInVwbG9hZGFyY2giLCB1cGxvYWRfYXJjaGl2ZSwgMCwgMSB9LAorCXsgInVwbG9hZC1wYWNrIiwgInVwbG9hZHBhY2siLCB1cGxvYWRfcGFjaywgMSwgMSB9LAorCXsgInJlY2VpdmUtcGFjayIsICJyZWNlaXZlcGFjayIsIHJlY2VpdmVfcGFjaywgMCwgMSB9LAorfTsKKworc3RhdGljIHZvaWQgZW5hYmxlX3NlcnZpY2UoY29uc3QgY2hhciAqbmFtZSwgaW50IGVuYSkgeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhZW1vbl9zZXJ2aWNlKTsgaSsrKSB7CisJCWlmICghc3RyY21wKGRhZW1vbl9zZXJ2aWNlW2ldLm5hbWUsIG5hbWUpKSB7CisJCQlkYWVtb25fc2VydmljZVtpXS5lbmFibGVkID0gZW5hOworCQkJcmV0dXJuOworCQl9CisJfQorCWRpZSgiTm8gc3VjaCBzZXJ2aWNlICVzIiwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2Vfc2VydmljZV9vdmVycmlkYWJsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZW5hKSB7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGFlbW9uX3NlcnZpY2UpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoZGFlbW9uX3NlcnZpY2VbaV0ubmFtZSwgbmFtZSkpIHsKKwkJCWRhZW1vbl9zZXJ2aWNlW2ldLm92ZXJyaWRhYmxlID0gZW5hOworCQkJcmV0dXJuOworCQl9CisJfQorCWRpZSgiTm8gc3VjaCBzZXJ2aWNlICVzIiwgbmFtZSk7Cit9CisKKy8qCisgKiBTZXBhcmF0ZSB0aGUgImV4dHJhIGFyZ3MiIGluZm9ybWF0aW9uIGFzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgY29ubmVjdGlvbi4KKyAqIEFueSByZXN1bHRpbmcgZGF0YSBpcyBzcXVpcnJlbGVkIGF3YXkgaW4gdGhlIGdpdmVuIGludGVycG9sYXRpb24gdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2V4dHJhX2FyZ3Moc3RydWN0IGludGVycCAqdGFibGUsIGNoYXIgKmV4dHJhX2FyZ3MsIGludCBidWZsZW4pCit7CisJY2hhciAqdmFsOworCWludCB2YWxsZW47CisJY2hhciAqZW5kID0gZXh0cmFfYXJncyArIGJ1ZmxlbjsKKworCXdoaWxlIChleHRyYV9hcmdzIDwgZW5kICYmICpleHRyYV9hcmdzKSB7CisJCXNhd19leHRlbmRlZF9hcmdzID0gMTsKKwkJaWYgKHN0cm5jYXNlY21wKCJob3N0PSIsIGV4dHJhX2FyZ3MsIDUpID09IDApIHsKKwkJCXZhbCA9IGV4dHJhX2FyZ3MgKyA1OworCQkJdmFsbGVuID0gc3RybGVuKHZhbCkgKyAxOworCQkJaWYgKCp2YWwpIHsKKwkJCQkvKiBTcGxpdCA8aG9zdD46PHBvcnQ+IGF0IGNvbG9uLiAqLworCQkJCWNoYXIgKmhvc3QgPSB2YWw7CisJCQkJY2hhciAqcG9ydCA9IHN0cnJjaHIoaG9zdCwgJzonKTsKKwkJCQlpZiAocG9ydCkgeworCQkJCQkqcG9ydCA9IDA7CisJCQkJCXBvcnQrKzsKKwkJCQkJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgSU5URVJQX1NMT1RfUE9SVCwgcG9ydCk7CisJCQkJfQorCQkJCWludGVycF9zZXRfZW50cnkodGFibGUsIElOVEVSUF9TTE9UX0hPU1QsIGhvc3QpOworCQkJfQorCisJCQkvKiBPbiB0byB0aGUgbmV4dCBvbmUgKi8KKwkJCWV4dHJhX2FyZ3MgPSB2YWwgKyB2YWxsZW47CisJCX0KKwl9Cit9CisKK3ZvaWQgZmlsbF9pbl9leHRyYV90YWJsZV9lbnRyaWVzKHN0cnVjdCBpbnRlcnAgKml0YWJsZSkKK3sKKwljaGFyICpocDsKKworCS8qCisJICogUmVwbGFjZSBsaXRlcmFsIGhvc3Qgd2l0aCBsb3dlcmNhc2UtaXplZCBob3N0bmFtZS4KKwkgKi8KKwlocCA9IGludGVycF90YWJsZVtJTlRFUlBfU0xPVF9IT1NUXS52YWx1ZTsKKwlpZiAoIWhwKQorCQlyZXR1cm47CisJZm9yICggOyAqaHA7IGhwKyspCisJCSpocCA9IHRvbG93ZXIoKmhwKTsKKworCS8qCisJICogTG9jYXRlIGNhbm9uaWNhbCBob3N0bmFtZSBhbmQgaXRzIElQIGFkZHJlc3MuCisJICovCisjaWZuZGVmIE5PX0lQVjYKKwl7CisJCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKKwkJc3RydWN0IGFkZHJpbmZvICphaSwgKmFpMDsKKwkJaW50IGdhaTsKKwkJc3RhdGljIGNoYXIgYWRkcmJ1ZltIT1NUX05BTUVfTUFYICsgMV07CisKKwkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJCWhpbnRzLmFpX2ZsYWdzID0gQUlfQ0FOT05OQU1FOworCisJCWdhaSA9IGdldGFkZHJpbmZvKGludGVycF90YWJsZVtJTlRFUlBfU0xPVF9IT1NUXS52YWx1ZSwgMCwgJmhpbnRzLCAmYWkwKTsKKwkJaWYgKCFnYWkpIHsKKwkJCWZvciAoYWkgPSBhaTA7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCQkJc3RydWN0IHNvY2thZGRyX2luICpzaW5fYWRkciA9ICh2b2lkICopYWktPmFpX2FkZHI7CisKKwkJCQlpbmV0X250b3AoQUZfSU5FVCwgJnNpbl9hZGRyLT5zaW5fYWRkciwKKwkJCQkJICBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZikpOworCQkJCWludGVycF9zZXRfZW50cnkoaW50ZXJwX3RhYmxlLAorCQkJCQkJIElOVEVSUF9TTE9UX0NBTk9OX0hPU1QsIGFpLT5haV9jYW5vbm5hbWUpOworCQkJCWludGVycF9zZXRfZW50cnkoaW50ZXJwX3RhYmxlLAorCQkJCQkJIElOVEVSUF9TTE9UX0lQLCBhZGRyYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZyZWVhZGRyaW5mbyhhaTApOworCQl9CisJfQorI2Vsc2UKKwl7CisJCXN0cnVjdCBob3N0ZW50ICpoZW50OworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJCWNoYXIgKiphcDsKKwkJc3RhdGljIGNoYXIgYWRkcmJ1ZltIT1NUX05BTUVfTUFYICsgMV07CisKKwkJaGVudCA9IGdldGhvc3RieW5hbWUoaW50ZXJwX3RhYmxlW0lOVEVSUF9TTE9UX0hPU1RdLnZhbHVlKTsKKworCQlhcCA9IGhlbnQtPmhfYWRkcl9saXN0OworCQltZW1zZXQoJnNhLCAwLCBzaXplb2Ygc2EpOworCQlzYS5zaW5fZmFtaWx5ID0gaGVudC0+aF9hZGRydHlwZTsKKwkJc2Euc2luX3BvcnQgPSBodG9ucygwKTsKKwkJbWVtY3B5KCZzYS5zaW5fYWRkciwgKmFwLCBoZW50LT5oX2xlbmd0aCk7CisKKwkJaW5ldF9udG9wKGhlbnQtPmhfYWRkcnR5cGUsICZzYS5zaW5fYWRkciwKKwkJCSAgYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpKTsKKworCQlpbnRlcnBfc2V0X2VudHJ5KGludGVycF90YWJsZSwgSU5URVJQX1NMT1RfQ0FOT05fSE9TVCwgaGVudC0+aF9uYW1lKTsKKwkJaW50ZXJwX3NldF9lbnRyeShpbnRlcnBfdGFibGUsIElOVEVSUF9TTE9UX0lQLCBhZGRyYnVmKTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50IGV4ZWN1dGUoc3RydWN0IHNvY2thZGRyICphZGRyKQoreworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJaW50IHBrdGxlbiwgbGVuLCBpOworCisJaWYgKGFkZHIpIHsKKwkJY2hhciBhZGRyYnVmWzI1Nl0gPSAiIjsKKwkJaW50IHBvcnQgPSAtMTsKKworCQlpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luX2FkZHIgPSAodm9pZCAqKSBhZGRyOworCQkJaW5ldF9udG9wKGFkZHItPnNhX2ZhbWlseSwgJnNpbl9hZGRyLT5zaW5fYWRkciwgYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpKTsKKwkJCXBvcnQgPSBzaW5fYWRkci0+c2luX3BvcnQ7CisjaWZuZGVmIE5PX0lQVjYKKwkJfSBlbHNlIGlmIChhZGRyICYmIGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNl9hZGRyID0gKHZvaWQgKikgYWRkcjsKKworCQkJY2hhciAqYnVmID0gYWRkcmJ1ZjsKKwkJCSpidWYrKyA9ICdbJzsgKmJ1ZiA9ICdcMCc7IC8qIHN0cGNweSgpIGlzIGNvb2wgKi8KKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJnNpbjZfYWRkci0+c2luNl9hZGRyLCBidWYsIHNpemVvZihhZGRyYnVmKSAtIDEpOworCQkJc3RyY2F0KGJ1ZiwgIl0iKTsKKworCQkJcG9ydCA9IHNpbjZfYWRkci0+c2luNl9wb3J0OworI2VuZGlmCisJCX0KKwkJbG9naW5mbygiQ29ubmVjdGlvbiBmcm9tICVzOiVkIiwgYWRkcmJ1ZiwgcG9ydCk7CisJfQorCisJYWxhcm0oaW5pdF90aW1lb3V0ID8gaW5pdF90aW1lb3V0IDogdGltZW91dCk7CisJcGt0bGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCWFsYXJtKDApOworCisJbGVuID0gc3RybGVuKGxpbmUpOworCWlmIChwa3RsZW4gIT0gbGVuKQorCQlsb2dpbmZvKCJFeHRlbmRlZCBhdHRyaWJ1dGVzICglZCBieXRlcykgZXhpc3QgPCUuKnM+IiwKKwkJCShpbnQpIHBrdGxlbiAtIGxlbiwKKwkJCShpbnQpIHBrdGxlbiAtIGxlbiwgbGluZSArIGxlbiArIDEpOworCWlmIChsZW4gJiYgbGluZVtsZW4tMV0gPT0gJ1xuJykgeworCQlsaW5lWy0tbGVuXSA9IDA7CisJCXBrdGxlbi0tOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcGF0aCBpbnRlcnBvbGF0aW9uIHRhYmxlIGZvciB0aGlzIGNvbm5lY3Rpb24uCisJICovCisJaW50ZXJwX2NsZWFyX3RhYmxlKGludGVycF90YWJsZSwgQVJSQVlfU0laRShpbnRlcnBfdGFibGUpKTsKKwlpbnRlcnBfc2V0X2VudHJ5KGludGVycF90YWJsZSwgSU5URVJQX1NMT1RfUEVSQ0VOVCwgIiUiKTsKKworCWlmIChsZW4gIT0gcGt0bGVuKSB7CisJICAgIHBhcnNlX2V4dHJhX2FyZ3MoaW50ZXJwX3RhYmxlLCBsaW5lICsgbGVuICsgMSwgcGt0bGVuIC0gbGVuIC0gMSk7CisJICAgIGZpbGxfaW5fZXh0cmFfdGFibGVfZW50cmllcyhpbnRlcnBfdGFibGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhZW1vbl9zZXJ2aWNlKTsgaSsrKSB7CisJCXN0cnVjdCBkYWVtb25fc2VydmljZSAqcyA9ICYoZGFlbW9uX3NlcnZpY2VbaV0pOworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihzLT5uYW1lKTsKKwkJaWYgKCFwcmVmaXhjbXAobGluZSwgImdpdC0iKSAmJgorCQkgICAgIXN0cm5jbXAocy0+bmFtZSwgbGluZSArIDQsIG5hbWVsZW4pICYmCisJCSAgICBsaW5lW25hbWVsZW4gKyA0XSA9PSAnICcpIHsKKwkJCS8qCisJCQkgKiBOb3RlOiBUaGUgZGlyZWN0b3J5IGhlcmUgaXMgcHJvYmFibHkgY29udGV4dCBzZW5zaXRpdmUsCisJCQkgKiBhbmQgbWlnaHQgZGVwZW5kIG9uIHRoZSBhY3R1YWwgc2VydmljZSBiZWluZyBwZXJmb3JtZWQuCisJCQkgKi8KKwkJCWludGVycF9zZXRfZW50cnkoaW50ZXJwX3RhYmxlLAorCQkJCQkgSU5URVJQX1NMT1RfRElSLCBsaW5lICsgbmFtZWxlbiArIDUpOworCQkJcmV0dXJuIHJ1bl9zZXJ2aWNlKGludGVycF90YWJsZSwgcyk7CisJCX0KKwl9CisKKwlsb2dlcnJvcigiUHJvdG9jb2wgZXJyb3I6ICclcyciLCBsaW5lKTsKKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFdlIGNvdW50IHNwYXduZWQvcmVhcGVkIHNlcGFyYXRlbHksIGp1c3QgdG8gYXZvaWQgYW55CisgKiByYWNlcyB3aGVuIHVwZGF0aW5nIHRoZW0gZnJvbSBzaWduYWxzLiBUaGUgU0lHQ0hMRCBoYW5kbGVyCisgKiB3aWxsIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3JlYXBlZCwgYW5kIHRoZSBmb3JrIGxvZ2ljIHdpbGwKKyAqIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3NwYXduZWQuCisgKgorICogTUFYX0NISUxEUkVOIHNob3VsZCBiZSBhIHBvd2VyLW9mLXR3byB0byBtYWtlIHRoZSBtb2R1bHVzCisgKiBvcGVyYXRpb24gY2hlYXAuIEl0IHNob3VsZCBhbHNvIGJlIGF0IGxlYXN0IHR3aWNlCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2Ugd2lsbCBldmVyIGFsbG93LgorICovCisjZGVmaW5lIE1BWF9DSElMRFJFTiAxMjgKKworc3RhdGljIGludCBtYXhfY29ubmVjdGlvbnMgPSAyNTsKKworLyogVGhlc2UgYXJlIHVwZGF0ZWQgYnkgdGhlIHNpZ25hbCBoYW5kbGVyICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IGNoaWxkcmVuX3JlYXBlZDsKK3N0YXRpYyBwaWRfdCBkZWFkX2NoaWxkW01BWF9DSElMRFJFTl07CisKKy8qIFRoZXNlIGFyZSB1cGRhdGVkIGJ5IHRoZSBtYWluIGxvb3AgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hpbGRyZW5fc3Bhd25lZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hpbGRyZW5fZGVsZXRlZDsKKworc3RhdGljIHN0cnVjdCBjaGlsZCB7CisJcGlkX3QgcGlkOworCWludCBhZGRybGVuOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7Cit9IGxpdmVfY2hpbGRbTUFYX0NISUxEUkVOXTsKKworc3RhdGljIHZvaWQgYWRkX2NoaWxkKGludCBpZHgsIHBpZF90IHBpZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlsaXZlX2NoaWxkW2lkeF0ucGlkID0gcGlkOworCWxpdmVfY2hpbGRbaWR4XS5hZGRybGVuID0gYWRkcmxlbjsKKwltZW1jcHkoJmxpdmVfY2hpbGRbaWR4XS5hZGRyZXNzLCBhZGRyLCBhZGRybGVuKTsKK30KKworLyoKKyAqIFdhbGsgZnJvbSAiZGVsZXRlZCIgdG8gInNwYXduZWQiLCBhbmQgcmVtb3ZlIGNoaWxkICJwaWQiLgorICoKKyAqIFdlIG1vdmUgZXZlcnl0aGluZyB1cCBieSBvbmUsIHNpbmNlIHRoZSBuZXcgImRlbGV0ZWQiIHdpbGwKKyAqIGJlIG9uZSBoaWdoZXIuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9jaGlsZChwaWRfdCBwaWQsIHVuc2lnbmVkIGRlbGV0ZWQsIHVuc2lnbmVkIHNwYXduZWQpCit7CisJc3RydWN0IGNoaWxkIG47CisKKwlkZWxldGVkICU9IE1BWF9DSElMRFJFTjsKKwlzcGF3bmVkICU9IE1BWF9DSElMRFJFTjsKKwlpZiAobGl2ZV9jaGlsZFtkZWxldGVkXS5waWQgPT0gcGlkKSB7CisJCWxpdmVfY2hpbGRbZGVsZXRlZF0ucGlkID0gLTE7CisJCXJldHVybjsKKwl9CisJbiA9IGxpdmVfY2hpbGRbZGVsZXRlZF07CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY2hpbGQgbTsKKwkJZGVsZXRlZCA9IChkZWxldGVkICsgMSkgJSBNQVhfQ0hJTERSRU47CisJCWlmIChkZWxldGVkID09IHNwYXduZWQpCisJCQlkaWUoImNvdWxkIG5vdCBmaW5kIGRlYWQgY2hpbGQgJWRcbiIsIHBpZCk7CisJCW0gPSBsaXZlX2NoaWxkW2RlbGV0ZWRdOworCQlsaXZlX2NoaWxkW2RlbGV0ZWRdID0gbjsKKwkJaWYgKG0ucGlkID09IHBpZCkKKwkJCXJldHVybjsKKwkJbiA9IG07CisJfQorfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBpZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGdyb3dzCisgKiBwYXN0ICJtYXhfY29ubmVjdGlvbnMiLgorICoKKyAqIFdlIF9zaG91bGRfIHN0YXJ0IG9mZiBieSBzZWFyY2hpbmcgZm9yIGNvbm5lY3Rpb25zCisgKiBmcm9tIHRoZSBzYW1lIElQLCBhbmQgaWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzIHd0aAorICogbXVsdGlwbGUgY29ubmVjdGlvbnMsIHdlIHNob3VsZCBraWxsIHRoYXQgZmlyc3QuCisgKgorICogQXMgaXQgaXMsIHdlIGp1c3QgInJhbmRvbWx5IiBraWxsIDI1JSBvZiB0aGUgY29ubmVjdGlvbnMsCisgKiBhbmQgb3VyIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9yIHN1Y2tzIHRvby4gSSBoYXZlIG5vCisgKiBzaGFtZS4KKyAqCisgKiBSZWFsbHksIHRoaXMgaXMganVzdCBhIHBsYWNlLWhvbGRlciBmb3IgYSBfcmVhbF8gYWxnb3JpdGhtLgorICovCitzdGF0aWMgdm9pZCBraWxsX3NvbWVfY2hpbGRyZW4oaW50IHNpZ25vLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCkKK3sKKwlzdGFydCAlPSBNQVhfQ0hJTERSRU47CisJc3RvcCAlPSBNQVhfQ0hJTERSRU47CisJd2hpbGUgKHN0YXJ0ICE9IHN0b3ApIHsKKwkJaWYgKCEoc3RhcnQgJiAzKSkKKwkJCWtpbGwobGl2ZV9jaGlsZFtzdGFydF0ucGlkLCBzaWdubyk7CisJCXN0YXJ0ID0gKHN0YXJ0ICsgMSkgJSBNQVhfQ0hJTERSRU47CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19tYXhfY29ubmVjdGlvbnModm9pZCkKK3sKKwlmb3IgKDs7KSB7CisJCWludCBhY3RpdmU7CisJCXVuc2lnbmVkIHNwYXduZWQsIHJlYXBlZCwgZGVsZXRlZDsKKworCQlzcGF3bmVkID0gY2hpbGRyZW5fc3Bhd25lZDsKKwkJcmVhcGVkID0gY2hpbGRyZW5fcmVhcGVkOworCQlkZWxldGVkID0gY2hpbGRyZW5fZGVsZXRlZDsKKworCQl3aGlsZSAoZGVsZXRlZCA8IHJlYXBlZCkgeworCQkJcGlkX3QgcGlkID0gZGVhZF9jaGlsZFtkZWxldGVkICUgTUFYX0NISUxEUkVOXTsKKwkJCXJlbW92ZV9jaGlsZChwaWQsIGRlbGV0ZWQsIHNwYXduZWQpOworCQkJZGVsZXRlZCsrOworCQl9CisJCWNoaWxkcmVuX2RlbGV0ZWQgPSBkZWxldGVkOworCisJCWFjdGl2ZSA9IHNwYXduZWQgLSBkZWxldGVkOworCQlpZiAoYWN0aXZlIDw9IG1heF9jb25uZWN0aW9ucykKKwkJCWJyZWFrOworCisJCS8qIEtpbGwgc29tZSB1bnN0YXJ0ZWQgY29ubmVjdGlvbnMgd2l0aCBTSUdURVJNICovCisJCWtpbGxfc29tZV9jaGlsZHJlbihTSUdURVJNLCBkZWxldGVkLCBzcGF3bmVkKTsKKwkJaWYgKGFjdGl2ZSA8PSBtYXhfY29ubmVjdGlvbnMgPDwgMSkKKwkJCWJyZWFrOworCisJCS8qIElmIHRoZSBTSUdURVJNIHRoaW5nIGlzbid0IGhlbHBpbmcgdXNlIFNJR0tJTEwgKi8KKwkJa2lsbF9zb21lX2NoaWxkcmVuKFNJR0tJTEwsIGRlbGV0ZWQsIHNwYXduZWQpOworCQlzbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZShpbnQgaW5jb21pbmcsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pCit7CisJcGlkX3QgcGlkID0gZm9yaygpOworCisJaWYgKHBpZCkgeworCQl1bnNpZ25lZCBpZHg7CisKKwkJY2xvc2UoaW5jb21pbmcpOworCQlpZiAocGlkIDwgMCkKKwkJCXJldHVybjsKKworCQlpZHggPSBjaGlsZHJlbl9zcGF3bmVkICUgTUFYX0NISUxEUkVOOworCQljaGlsZHJlbl9zcGF3bmVkKys7CisJCWFkZF9jaGlsZChpZHgsIHBpZCwgYWRkciwgYWRkcmxlbik7CisKKwkJY2hlY2tfbWF4X2Nvbm5lY3Rpb25zKCk7CisJCXJldHVybjsKKwl9CisKKwlkdXAyKGluY29taW5nLCAwKTsKKwlkdXAyKGluY29taW5nLCAxKTsKKwljbG9zZShpbmNvbWluZyk7CisKKwlleGl0KGV4ZWN1dGUoYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBjaGlsZF9oYW5kbGVyKGludCBzaWdubykKK3sKKwlmb3IgKDs7KSB7CisJCWludCBzdGF0dXM7CisJCXBpZF90IHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpOworCisJCWlmIChwaWQgPiAwKSB7CisJCQl1bnNpZ25lZCByZWFwZWQgPSBjaGlsZHJlbl9yZWFwZWQ7CisJCQlkZWFkX2NoaWxkW3JlYXBlZCAlIE1BWF9DSElMRFJFTl0gPSBwaWQ7CisJCQljaGlsZHJlbl9yZWFwZWQgPSByZWFwZWQgKyAxOworCQkJLyogWFhYOiBDdXN0b20gbG9nZ2luZywgc2luY2Ugd2UgZG9uJ3Qgd2FubmEgZ2V0cGlkKCkgKi8KKwkJCWlmICh2ZXJib3NlKSB7CisJCQkJY29uc3QgY2hhciAqZGVhZCA9ICIiOworCQkJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSA+IDApCisJCQkJCWRlYWQgPSAiICh3aXRoIGVycm9yKSI7CisJCQkJaWYgKGxvZ19zeXNsb2cpCisJCQkJCXN5c2xvZyhMT0dfSU5GTywgIlslZF0gRGlzY29ubmVjdGVkJXMiLCBwaWQsIGRlYWQpOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihzdGRlcnIsICJbJWRdIERpc2Nvbm5lY3RlZCVzXG4iLCBwaWQsIGRlYWQpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNldF9yZXVzZV9hZGRyKGludCBzb2NrZmQpCit7CisJaW50IG9uID0gMTsKKworCWlmICghcmV1c2VhZGRyKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKwkJCSAgJm9uLCBzaXplb2Yob24pKTsKK30KKworI2lmbmRlZiBOT19JUFY2CisKK3N0YXRpYyBpbnQgc29ja3NldHVwKGNoYXIgKmxpc3Rlbl9hZGRyLCBpbnQgbGlzdGVuX3BvcnQsIGludCAqKnNvY2tsaXN0X3ApCit7CisJaW50IHNvY2tudW0gPSAwLCAqc29ja2xpc3QgPSBOVUxMOworCWludCBtYXhmZCA9IC0xOworCWNoYXIgcGJ1ZltOSV9NQVhTRVJWXTsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTAsICphaTsKKwlpbnQgZ2FpOworCWxvbmcgZmxhZ3M7CisKKwlzcHJpbnRmKHBidWYsICIlZCIsIGxpc3Rlbl9wb3J0KTsKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKworCWdhaSA9IGdldGFkZHJpbmZvKGxpc3Rlbl9hZGRyLCBwYnVmLCAmaGludHMsICZhaTApOworCWlmIChnYWkpCisJCWRpZSgiZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICVzXG4iLCBnYWlfc3RyZXJyb3IoZ2FpKSk7CisKKwlmb3IgKGFpID0gYWkwOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlpbnQgc29ja2ZkOworCisJCXNvY2tmZCA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChzb2NrZmQgPCAwKQorCQkJY29udGludWU7CisJCWlmIChzb2NrZmQgPj0gRkRfU0VUU0laRSkgeworCQkJZXJyb3IoInRvbyBsYXJnZSBzb2NrZXQgZGVzY3JpcHRvci4iKTsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQljb250aW51ZTsKKwkJfQorCisjaWZkZWYgSVBWNl9WNk9OTFkKKwkJaWYgKGFpLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCWludCBvbiA9IDE7CisJCQlzZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwKKwkJCQkgICAmb24sIHNpemVvZihvbikpOworCQkJLyogTm90ZTogZXJyb3IgaXMgbm90IGZhdGFsICovCisJCX0KKyNlbmRpZgorCisJCWlmIChzZXRfcmV1c2VfYWRkcihzb2NrZmQpKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYmluZChzb2NrZmQsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPCAwKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CS8qIG5vdCBmYXRhbCAqLworCQl9CisJCWlmIChsaXN0ZW4oc29ja2ZkLCA1KSA8IDApIHsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQljb250aW51ZTsJLyogbm90IGZhdGFsICovCisJCX0KKworCQlmbGFncyA9IGZjbnRsKHNvY2tmZCwgRl9HRVRGRCwgMCk7CisJCWlmIChmbGFncyA+PSAwKQorCQkJZmNudGwoc29ja2ZkLCBGX1NFVEZELCBmbGFncyB8IEZEX0NMT0VYRUMpOworCisJCXNvY2tsaXN0ID0geHJlYWxsb2Moc29ja2xpc3QsIHNpemVvZihpbnQpICogKHNvY2tudW0gKyAxKSk7CisJCXNvY2tsaXN0W3NvY2tudW0rK10gPSBzb2NrZmQ7CisKKwkJaWYgKG1heGZkIDwgc29ja2ZkKQorCQkJbWF4ZmQgPSBzb2NrZmQ7CisJfQorCisJZnJlZWFkZHJpbmZvKGFpMCk7CisKKwkqc29ja2xpc3RfcCA9IHNvY2tsaXN0OworCXJldHVybiBzb2NrbnVtOworfQorCisjZWxzZSAvKiBOT19JUFY2ICovCisKK3N0YXRpYyBpbnQgc29ja3NldHVwKGNoYXIgKmxpc3Rlbl9hZGRyLCBpbnQgbGlzdGVuX3BvcnQsIGludCAqKnNvY2tsaXN0X3ApCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgc29ja2ZkOworCWxvbmcgZmxhZ3M7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mIHNpbik7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fcG9ydCA9IGh0b25zKGxpc3Rlbl9wb3J0KTsKKworCWlmIChsaXN0ZW5fYWRkcikgeworCQkvKiBXZWxsLCBob3N0IGJldHRlciBiZSBhbiBJUCBhZGRyZXNzIGhlcmUuICovCisJCWlmIChpbmV0X3B0b24oQUZfSU5FVCwgbGlzdGVuX2FkZHIsICZzaW4uc2luX2FkZHIuc19hZGRyKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworCX0KKworCXNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2tmZCA8IDApCisJCXJldHVybiAwOworCisJaWYgKHNldF9yZXVzZV9hZGRyKHNvY2tmZCkpIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCBiaW5kKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZiBzaW4pIDwgMCApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpc3Rlbihzb2NrZmQsIDUpIDwgMCkgeworCQljbG9zZShzb2NrZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmbGFncyA9IGZjbnRsKHNvY2tmZCwgRl9HRVRGRCwgMCk7CisJaWYgKGZsYWdzID49IDApCisJCWZjbnRsKHNvY2tmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKTsKKworCSpzb2NrbGlzdF9wID0geG1hbGxvYyhzaXplb2YoaW50KSk7CisJKipzb2NrbGlzdF9wID0gc29ja2ZkOworCXJldHVybiAxOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBzZXJ2aWNlX2xvb3AoaW50IHNvY2tudW0sIGludCAqc29ja2xpc3QpCit7CisJc3RydWN0IHBvbGxmZCAqcGZkOworCWludCBpOworCisJcGZkID0geGNhbGxvYyhzb2NrbnVtLCBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCisJZm9yIChpID0gMDsgaSA8IHNvY2tudW07IGkrKykgeworCQlwZmRbaV0uZmQgPSBzb2NrbGlzdFtpXTsKKwkJcGZkW2ldLmV2ZW50cyA9IFBPTExJTjsKKwl9CisKKwlzaWduYWwoU0lHQ0hMRCwgY2hpbGRfaGFuZGxlcik7CisKKwlmb3IgKDs7KSB7CisJCWludCBpOworCisJCWlmIChwb2xsKHBmZCwgc29ja251bSwgLTEpIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKSB7CisJCQkJZXJyb3IoInBvbGwgZmFpbGVkLCByZXN1bWluZzogJXMiLAorCQkJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJc2xlZXAoMSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBzb2NrbnVtOyBpKyspIHsKKwkJCWlmIChwZmRbaV0ucmV2ZW50cyAmIFBPTExJTikgeworCQkJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCQkJCXVuc2lnbmVkIGludCBzc2xlbiA9IHNpemVvZihzcyk7CisJCQkJaW50IGluY29taW5nID0gYWNjZXB0KHBmZFtpXS5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzcywgJnNzbGVuKTsKKwkJCQlpZiAoaW5jb21pbmcgPCAwKSB7CisJCQkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQkJY2FzZSBFQUdBSU46CisJCQkJCWNhc2UgRUlOVFI6CisJCQkJCWNhc2UgRUNPTk5BQk9SVEVEOgorCQkJCQkJY29udGludWU7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlkaWUoImFjY2VwdCByZXR1cm5lZCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaGFuZGxlKGluY29taW5nLCAoc3RydWN0IHNvY2thZGRyICopJnNzLCBzc2xlbik7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIGlmIGFueSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3IgaXMgbWlzc2luZyBvcGVuIGl0IHRvIC9kZXYvbnVsbCAqLworc3RhdGljIHZvaWQgc2FuaXRpemVfc3RkZmRzKHZvaWQpCit7CisJaW50IGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19SRFdSLCAwKTsKKwl3aGlsZSAoZmQgIT0gLTEgJiYgZmQgPCAyKQorCQlmZCA9IGR1cChmZCk7CisJaWYgKGZkID09IC0xKQorCQlkaWUoIm9wZW4gL2Rldi9udWxsIG9yIGR1cCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZmQgPiAyKQorCQljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhZW1vbml6ZSh2b2lkKQoreworCXN3aXRjaCAoZm9yaygpKSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC0xOgorCQkJZGllKCJmb3JrIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlkZWZhdWx0OgorCQkJZXhpdCgwKTsKKwl9CisJaWYgKHNldHNpZCgpID09IC0xKQorCQlkaWUoInNldHNpZCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwljbG9zZSgwKTsKKwljbG9zZSgxKTsKKwljbG9zZSgyKTsKKwlzYW5pdGl6ZV9zdGRmZHMoKTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfcGlkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRklMRSAqZiA9IGZvcGVuKHBhdGgsICJ3Iik7CisJaWYgKCFmKQorCQlkaWUoImNhbm5vdCBvcGVuIHBpZCBmaWxlICVzOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZwcmludGYoZiwgIiVkXG4iLCBnZXRwaWQoKSkgPCAwIHx8IGZjbG9zZShmKSAhPSAwKQorCQlkaWUoImZhaWxlZCB0byB3cml0ZSBwaWQgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgaW50IHNlcnZlKGNoYXIgKmxpc3Rlbl9hZGRyLCBpbnQgbGlzdGVuX3BvcnQsIHN0cnVjdCBwYXNzd2QgKnBhc3MsIGdpZF90IGdpZCkKK3sKKwlpbnQgc29ja251bSwgKnNvY2tsaXN0OworCisJc29ja251bSA9IHNvY2tzZXR1cChsaXN0ZW5fYWRkciwgbGlzdGVuX3BvcnQsICZzb2NrbGlzdCk7CisJaWYgKHNvY2tudW0gPT0gMCkKKwkJZGllKCJ1bmFibGUgdG8gYWxsb2NhdGUgYW55IGxpc3RlbiBzb2NrZXRzIG9uIGhvc3QgJXMgcG9ydCAldSIsCisJCSAgICBsaXN0ZW5fYWRkciwgbGlzdGVuX3BvcnQpOworCisJaWYgKHBhc3MgJiYgZ2lkICYmCisJICAgIChpbml0Z3JvdXBzKHBhc3MtPnB3X25hbWUsIGdpZCkgfHwgc2V0Z2lkIChnaWQpIHx8CisJICAgICBzZXR1aWQocGFzcy0+cHdfdWlkKSkpCisJCWRpZSgiY2Fubm90IGRyb3AgcHJpdmlsZWdlcyIpOworCisJcmV0dXJuIHNlcnZpY2VfbG9vcChzb2NrbnVtLCBzb2NrbGlzdCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbGlzdGVuX3BvcnQgPSAwOworCWNoYXIgKmxpc3Rlbl9hZGRyID0gTlVMTDsKKwlpbnQgaW5ldGRfbW9kZSA9IDA7CisJY29uc3QgY2hhciAqcGlkX2ZpbGUgPSBOVUxMLCAqdXNlcl9uYW1lID0gTlVMTCwgKmdyb3VwX25hbWUgPSBOVUxMOworCWludCBkZXRhY2ggPSAwOworCXN0cnVjdCBwYXNzd2QgKnBhc3MgPSBOVUxMOworCXN0cnVjdCBncm91cCAqZ3JvdXA7CisJZ2lkX3QgZ2lkID0gMDsKKwlpbnQgaTsKKworCS8qIFdpdGhvdXQgdGhpcyB3ZSBjYW5ub3QgcmVseSBvbiB3YWl0cGlkKCkgdG8gdGVsbAorCSAqIHdoYXQgaGFwcGVuZWQgdG8gb3VyIGNoaWxkcmVuLgorCSAqLworCXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWxpc3Rlbj0iKSkgeworCQkgICAgY2hhciAqcCA9IGFyZyArIDk7CisJCSAgICBjaGFyICpwaCA9IGxpc3Rlbl9hZGRyID0geG1hbGxvYyhzdHJsZW4oYXJnICsgOSkgKyAxKTsKKwkJICAgIHdoaWxlICgqcCkKKwkJCSpwaCsrID0gdG9sb3dlcigqcCsrKTsKKwkJICAgICpwaCA9IDA7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXBvcnQ9IikpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCXVuc2lnbmVkIGxvbmcgbjsKKwkJCW4gPSBzdHJ0b3VsKGFyZys3LCAmZW5kLCAwKTsKKwkJCWlmIChhcmdbN10gJiYgISplbmQpIHsKKwkJCQlsaXN0ZW5fcG9ydCA9IG47CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pbmV0ZCIpKSB7CisJCQlpbmV0ZF9tb2RlID0gMTsKKwkJCWxvZ19zeXNsb2cgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpIHsKKwkJCXZlcmJvc2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zeXNsb2ciKSkgeworCQkJbG9nX3N5c2xvZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWV4cG9ydC1hbGwiKSkgeworCQkJZXhwb3J0X2FsbF90cmVlcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXRpbWVvdXQ9IikpIHsKKwkJCXRpbWVvdXQgPSBhdG9pKGFyZysxMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWluaXQtdGltZW91dD0iKSkgeworCQkJaW5pdF90aW1lb3V0ID0gYXRvaShhcmcrMTUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdHJpY3QtcGF0aHMiKSkgeworCQkJc3RyaWN0X3BhdGhzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYmFzZS1wYXRoPSIpKSB7CisJCQliYXNlX3BhdGggPSBhcmcrMTI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWludGVycG9sYXRlZC1wYXRoPSIpKSB7CisJCQlpbnRlcnBvbGF0ZWRfcGF0aCA9IGFyZysyMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tcmV1c2VhZGRyIikpIHsKKwkJCXJldXNlYWRkciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXVzZXItcGF0aCIpKSB7CisJCQl1c2VyX3BhdGggPSAiIjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdXNlci1wYXRoPSIpKSB7CisJCQl1c2VyX3BhdGggPSBhcmcgKyAxMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcGlkLWZpbGU9IikpIHsKKwkJCXBpZF9maWxlID0gYXJnICsgMTE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWRldGFjaCIpKSB7CisJCQlkZXRhY2ggPSAxOworCQkJbG9nX3N5c2xvZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVzZXI9IikpIHsKKwkJCXVzZXJfbmFtZSA9IGFyZyArIDc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWdyb3VwPSIpKSB7CisJCQlncm91cF9uYW1lID0gYXJnICsgODsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZW5hYmxlPSIpKSB7CisJCQllbmFibGVfc2VydmljZShhcmcgKyA5LCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZGlzYWJsZT0iKSkgeworCQkJZW5hYmxlX3NlcnZpY2UoYXJnICsgMTAsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hbGxvdy1vdmVycmlkZT0iKSkgeworCQkJbWFrZV9zZXJ2aWNlX292ZXJyaWRhYmxlKGFyZyArIDE3LCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZm9yYmlkLW92ZXJyaWRlPSIpKSB7CisJCQltYWtlX3NlcnZpY2Vfb3ZlcnJpZGFibGUoYXJnICsgMTgsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJb2tfcGF0aHMgPSAmYXJndltpKzFdOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYXJnWzBdICE9ICctJykgeworCQkJb2tfcGF0aHMgPSAmYXJndltpXTsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNhZ2UoZGFlbW9uX3VzYWdlKTsKKwl9CisKKwlpZiAoaW5ldGRfbW9kZSAmJiAoZ3JvdXBfbmFtZSB8fCB1c2VyX25hbWUpKQorCQlkaWUoIi0tdXNlciBhbmQgLS1ncm91cCBhcmUgaW5jb21wYXRpYmxlIHdpdGggLS1pbmV0ZCIpOworCisJaWYgKGluZXRkX21vZGUgJiYgKGxpc3Rlbl9wb3J0IHx8IGxpc3Rlbl9hZGRyKSkKKwkJZGllKCItLWxpc3Rlbj0gYW5kIC0tcG9ydD0gYXJlIGluY29tcGF0aWJsZSB3aXRoIC0taW5ldGQiKTsKKwllbHNlIGlmIChsaXN0ZW5fcG9ydCA9PSAwKQorCQlsaXN0ZW5fcG9ydCA9IERFRkFVTFRfR0lUX1BPUlQ7CisKKwlpZiAoZ3JvdXBfbmFtZSAmJiAhdXNlcl9uYW1lKQorCQlkaWUoIi0tZ3JvdXAgc3VwcGxpZWQgd2l0aG91dCAtLXVzZXIiKTsKKworCWlmICh1c2VyX25hbWUpIHsKKwkJcGFzcyA9IGdldHB3bmFtKHVzZXJfbmFtZSk7CisJCWlmICghcGFzcykKKwkJCWRpZSgidXNlciBub3QgZm91bmQgLSAlcyIsIHVzZXJfbmFtZSk7CisKKwkJaWYgKCFncm91cF9uYW1lKQorCQkJZ2lkID0gcGFzcy0+cHdfZ2lkOworCQllbHNlIHsKKwkJCWdyb3VwID0gZ2V0Z3JuYW0oZ3JvdXBfbmFtZSk7CisJCQlpZiAoIWdyb3VwKQorCQkJCWRpZSgiZ3JvdXAgbm90IGZvdW5kIC0gJXMiLCBncm91cF9uYW1lKTsKKworCQkJZ2lkID0gZ3JvdXAtPmdyX2dpZDsKKwkJfQorCX0KKworCWlmIChsb2dfc3lzbG9nKSB7CisJCW9wZW5sb2coImdpdC1kYWVtb24iLCAwLCBMT0dfREFFTU9OKTsKKwkJc2V0X2RpZV9yb3V0aW5lKGRhZW1vbl9kaWUpOworCX0KKworCWlmIChzdHJpY3RfcGF0aHMgJiYgKCFva19wYXRocyB8fCAhKm9rX3BhdGhzKSkKKwkJZGllKCJvcHRpb24gLS1zdHJpY3QtcGF0aHMgcmVxdWlyZXMgYSB3aGl0ZWxpc3QiKTsKKworCWlmIChpbmV0ZF9tb2RlKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCQlzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIgPSAoc3RydWN0IHNvY2thZGRyICopJnNzOworCQlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihzcyk7CisKKwkJZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRlcnIpOworCisJCWlmIChnZXRwZWVybmFtZSgwLCBwZWVyLCAmc2xlbikpCisJCQlwZWVyID0gTlVMTDsKKworCQlyZXR1cm4gZXhlY3V0ZShwZWVyKTsKKwl9CisKKwlpZiAoZGV0YWNoKQorCQlkYWVtb25pemUoKTsKKwllbHNlCisJCXNhbml0aXplX3N0ZGZkcygpOworCisJaWYgKHBpZF9maWxlKQorCQlzdG9yZV9waWQocGlkX2ZpbGUpOworCisJcmV0dXJuIHNlcnZlKGxpc3Rlbl9hZGRyLCBsaXN0ZW5fcG9ydCwgcGFzcywgZ2lkKTsKK30KZGlmZiAtLWdpdCBhL2RhdGUuYyBiL2RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjkwMzcxCi0tLSAvZGV2L251bGwKKysrIGIvZGF0ZS5jCkBAIC0wLDAgKzEsODMzIEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgdGltZV90IG15X21rdGltZShzdHJ1Y3QgdG0gKnRtKQoreworCXN0YXRpYyBjb25zdCBpbnQgbWRheXNbXSA9IHsKKwkgICAgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKKwl9OworCWludCB5ZWFyID0gdG0tPnRtX3llYXIgLSA3MDsKKwlpbnQgbW9udGggPSB0bS0+dG1fbW9uOworCWludCBkYXkgPSB0bS0+dG1fbWRheTsKKworCWlmICh5ZWFyIDwgMCB8fCB5ZWFyID4gMTI5KSAvKiBhbGdvIG9ubHkgd29ya3MgZm9yIDE5NzAtMjA5OSAqLworCQlyZXR1cm4gLTE7CisJaWYgKG1vbnRoIDwgMCB8fCBtb250aCA+IDExKSAvKiBhcnJheSBib3VuZHMgKi8KKwkJcmV0dXJuIC0xOworCWlmIChtb250aCA8IDIgfHwgKHllYXIgKyAyKSAlIDQpCisJCWRheS0tOworCXJldHVybiAoeWVhciAqIDM2NSArICh5ZWFyICsgMSkgLyA0ICsgbWRheXNbbW9udGhdICsgZGF5KSAqIDI0KjYwKjYwVUwgKworCQl0bS0+dG1faG91ciAqIDYwKjYwICsgdG0tPnRtX21pbiAqIDYwICsgdG0tPnRtX3NlYzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1vbnRoX25hbWVzW10gPSB7CisJIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLAorCSJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp3ZWVrZGF5X25hbWVzW10gPSB7CisJIlN1bmRheXMiLCAiTW9uZGF5cyIsICJUdWVzZGF5cyIsICJXZWRuZXNkYXlzIiwgIlRodXJzZGF5cyIsICJGcmlkYXlzIiwgIlNhdHVyZGF5cyIKK307CisKK3N0YXRpYyB0aW1lX3QgZ21fdGltZV90KHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCWludCBtaW51dGVzOworCisJbWludXRlcyA9IHR6IDwgMCA/IC10eiA6IHR6OworCW1pbnV0ZXMgPSAobWludXRlcyAvIDEwMCkqNjAgKyAobWludXRlcyAlIDEwMCk7CisJbWludXRlcyA9IHR6IDwgMCA/IC1taW51dGVzIDogbWludXRlczsKKwlyZXR1cm4gdGltZSArIG1pbnV0ZXMgKiA2MDsKK30KKworLyoKKyAqIFRoZSAidHoiIHRoaW5nIGlzIHBhc3NlZCBpbiBhcyB0aGlzIHN0cmFuZ2UgImRlY2ltYWwgcGFyc2Ugb2YgdHoiCisgKiB0aGluZywgd2hpY2ggbWVhbnMgdGhhdCB0eiAtMDEwMCBpcyBwYXNzZWQgaW4gYXMgdGhlIGludGVnZXIgLTEwMCwKKyAqIGV2ZW4gdGhvdWdoIGl0IG1lYW5zICJzaXh0eSBtaW51dGVzIG9mZiIKKyAqLworc3RhdGljIHN0cnVjdCB0bSAqdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIGludCB0eikKK3sKKwl0aW1lX3QgdCA9IGdtX3RpbWVfdCh0aW1lLCB0eik7CisJcmV0dXJuIGdtdGltZSgmdCk7Cit9CisKKy8qCisgKiBXaGF0IHZhbHVlIG9mICJ0eiIgd2FzIGluIGVmZmVjdCBiYWNrIHRoZW4gYXQgInRpbWUiIGluIHRoZQorICogbG9jYWwgdGltZXpvbmU/CisgKi8KK3N0YXRpYyBpbnQgbG9jYWxfdHpvZmZzZXQodW5zaWduZWQgbG9uZyB0aW1lKQoreworCXRpbWVfdCB0LCB0X2xvY2FsOworCXN0cnVjdCB0bSB0bTsKKwlpbnQgb2Zmc2V0LCBlYXN0d2VzdDsKKworCXQgPSB0aW1lOworCWxvY2FsdGltZV9yKCZ0LCAmdG0pOworCXRfbG9jYWwgPSBteV9ta3RpbWUoJnRtKTsKKworCWlmICh0X2xvY2FsIDwgdCkgeworCQllYXN0d2VzdCA9IC0xOworCQlvZmZzZXQgPSB0IC0gdF9sb2NhbDsKKwl9IGVsc2UgeworCQllYXN0d2VzdCA9IDE7CisJCW9mZnNldCA9IHRfbG9jYWwgLSB0OworCX0KKwlvZmZzZXQgLz0gNjA7IC8qIGluIG1pbnV0ZXMgKi8KKwlvZmZzZXQgPSAob2Zmc2V0ICUgNjApICsgKChvZmZzZXQgLyA2MCkgKiAxMDApOworCXJldHVybiBvZmZzZXQgKiBlYXN0d2VzdDsKK30KKworY29uc3QgY2hhciAqc2hvd19kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6LCBlbnVtIGRhdGVfbW9kZSBtb2RlKQoreworCXN0cnVjdCB0bSAqdG07CisJc3RhdGljIGNoYXIgdGltZWJ1ZlsyMDBdOworCisJaWYgKG1vZGUgPT0gREFURV9SRUxBVElWRSkgeworCQl1bnNpZ25lZCBsb25nIGRpZmY7CisJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCQlpZiAobm93LnR2X3NlYyA8IHRpbWUpCisJCQlyZXR1cm4gImluIHRoZSBmdXR1cmUiOworCQlkaWZmID0gbm93LnR2X3NlYyAtIHRpbWU7CisJCWlmIChkaWZmIDwgOTApIHsKKwkJCXNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwgIiVsdSBzZWNvbmRzIGFnbyIsIGRpZmYpOworCQkJcmV0dXJuIHRpbWVidWY7CisJCX0KKwkJLyogVHVybiBpdCBpbnRvIG1pbnV0ZXMgKi8KKwkJZGlmZiA9IChkaWZmICsgMzApIC8gNjA7CisJCWlmIChkaWZmIDwgOTApIHsKKwkJCXNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwgIiVsdSBtaW51dGVzIGFnbyIsIGRpZmYpOworCQkJcmV0dXJuIHRpbWVidWY7CisJCX0KKwkJLyogVHVybiBpdCBpbnRvIGhvdXJzICovCisJCWRpZmYgPSAoZGlmZiArIDMwKSAvIDYwOworCQlpZiAoZGlmZiA8IDM2KSB7CisJCQlzbnByaW50Zih0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlbHUgaG91cnMgYWdvIiwgZGlmZik7CisJCQlyZXR1cm4gdGltZWJ1ZjsKKwkJfQorCQkvKiBXZSBkZWFsIHdpdGggbnVtYmVyIG9mIGRheXMgZnJvbSBoZXJlIG9uICovCisJCWRpZmYgPSAoZGlmZiArIDEyKSAvIDI0OworCQlpZiAoZGlmZiA8IDE0KSB7CisJCQlzbnByaW50Zih0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlbHUgZGF5cyBhZ28iLCBkaWZmKTsKKwkJCXJldHVybiB0aW1lYnVmOworCQl9CisJCS8qIFNheSB3ZWVrcyBmb3IgdGhlIHBhc3QgMTAgd2Vla3Mgb3Igc28gKi8KKwkJaWYgKGRpZmYgPCA3MCkgeworCQkJc25wcmludGYodGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpLCAiJWx1IHdlZWtzIGFnbyIsIChkaWZmICsgMykgLyA3KTsKKwkJCXJldHVybiB0aW1lYnVmOworCQl9CisJCS8qIFNheSBtb250aHMgZm9yIHRoZSBwYXN0IDEyIG1vbnRocyBvciBzbyAqLworCQlpZiAoZGlmZiA8IDM2MCkgeworCQkJc25wcmludGYodGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpLCAiJWx1IG1vbnRocyBhZ28iLCAoZGlmZiArIDE1KSAvIDMwKTsKKwkJCXJldHVybiB0aW1lYnVmOworCQl9CisJCS8qIEVsc2UgZmFsbCBiYWNrIG9uIGFic29sdXRlIGZvcm1hdC4uICovCisJfQorCisJaWYgKG1vZGUgPT0gREFURV9MT0NBTCkKKwkJdHogPSBsb2NhbF90em9mZnNldCh0aW1lKTsKKworCXRtID0gdGltZV90b190bSh0aW1lLCB0eik7CisJaWYgKCF0bSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG1vZGUgPT0gREFURV9TSE9SVCkKKwkJc3ByaW50Zih0aW1lYnVmLCAiJTA0ZC0lMDJkLSUwMmQiLCB0bS0+dG1feWVhciArIDE5MDAsCisJCQkJdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5KTsKKwllbHNlCisJCXNwcmludGYodGltZWJ1ZiwgIiUuM3MgJS4zcyAlZCAlMDJkOiUwMmQ6JTAyZCAlZCVjJSswNWQiLAorCQkJCXdlZWtkYXlfbmFtZXNbdG0tPnRtX3dkYXldLAorCQkJCW1vbnRoX25hbWVzW3RtLT50bV9tb25dLAorCQkJCXRtLT50bV9tZGF5LAorCQkJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorCQkJCXRtLT50bV95ZWFyICsgMTkwMCwKKwkJCQkobW9kZSA9PSBEQVRFX0xPQ0FMKSA/IDAgOiAnICcsCisJCQkJdHopOworCXJldHVybiB0aW1lYnVmOworfQorCitjb25zdCBjaGFyICpzaG93X3JmYzI4MjJfZGF0ZSh1bnNpZ25lZCBsb25nIHRpbWUsIGludCB0eikKK3sKKwlzdHJ1Y3QgdG0gKnRtOworCXN0YXRpYyBjaGFyIHRpbWVidWZbMjAwXTsKKworCXRtID0gdGltZV90b190bSh0aW1lLCB0eik7CisJaWYgKCF0bSkKKwkJcmV0dXJuIE5VTEw7CisJc3ByaW50Zih0aW1lYnVmLCAiJS4zcywgJWQgJS4zcyAlZCAlMDJkOiUwMmQ6JTAyZCAlKzA1ZCIsCisJCXdlZWtkYXlfbmFtZXNbdG0tPnRtX3dkYXldLCB0bS0+dG1fbWRheSwKKwkJbW9udGhfbmFtZXNbdG0tPnRtX21vbl0sIHRtLT50bV95ZWFyICsgMTkwMCwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMsIHR6KTsKKwlyZXR1cm4gdGltZWJ1ZjsKK30KKworLyoKKyAqIENoZWNrIHRoZXNlLiBBbmQgbm90ZSBob3cgaXQgZG9lc24ndCBkbyB0aGUgc3VtbWVyLXRpbWUgY29udmVyc2lvbi4KKyAqCisgKiBJbiBteSB3b3JsZCwgaXQncyBhbHdheXMgc3VtbWVyLCBhbmQgdGhpbmdzIGFyZSBwcm9iYWJseSBhIGJpdCBvZmYKKyAqIGluIG90aGVyIHdheXMgdG9vLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBvZmZzZXQ7CisJaW50IGRzdDsKK30gdGltZXpvbmVfbmFtZXNbXSA9IHsKKwl7ICJJRExXIiwgLTEyLCAwLCB9LAkvKiBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBXZXN0ICovCisJeyAiTlQiLCAgIC0xMSwgMCwgfSwJLyogTm9tZSAqLworCXsgIkNBVCIsICAtMTAsIDAsIH0sCS8qIENlbnRyYWwgQWxhc2thICovCisJeyAiSFNUIiwgIC0xMCwgMCwgfSwJLyogSGF3YWlpIFN0YW5kYXJkICovCisJeyAiSERUIiwgIC0xMCwgMSwgfSwJLyogSGF3YWlpIERheWxpZ2h0ICovCisJeyAiWVNUIiwgICAtOSwgMCwgfSwJLyogWXVrb24gU3RhbmRhcmQgKi8KKwl7ICJZRFQiLCAgIC05LCAxLCB9LAkvKiBZdWtvbiBEYXlsaWdodCAqLworCXsgIlBTVCIsICAgLTgsIDAsIH0sCS8qIFBhY2lmaWMgU3RhbmRhcmQgKi8KKwl7ICJQRFQiLCAgIC04LCAxLCB9LAkvKiBQYWNpZmljIERheWxpZ2h0ICovCisJeyAiTVNUIiwgICAtNywgMCwgfSwJLyogTW91bnRhaW4gU3RhbmRhcmQgKi8KKwl7ICJNRFQiLCAgIC03LCAxLCB9LAkvKiBNb3VudGFpbiBEYXlsaWdodCAqLworCXsgIkNTVCIsICAgLTYsIDAsIH0sCS8qIENlbnRyYWwgU3RhbmRhcmQgKi8KKwl7ICJDRFQiLCAgIC02LCAxLCB9LAkvKiBDZW50cmFsIERheWxpZ2h0ICovCisJeyAiRVNUIiwgICAtNSwgMCwgfSwJLyogRWFzdGVybiBTdGFuZGFyZCAqLworCXsgIkVEVCIsICAgLTUsIDEsIH0sCS8qIEVhc3Rlcm4gRGF5bGlnaHQgKi8KKwl7ICJBU1QiLCAgIC0zLCAwLCB9LAkvKiBBdGxhbnRpYyBTdGFuZGFyZCAqLworCXsgIkFEVCIsICAgLTMsIDEsIH0sCS8qIEF0bGFudGljIERheWxpZ2h0ICovCisJeyAiV0FUIiwgICAtMSwgMCwgfSwJLyogV2VzdCBBZnJpY2EgKi8KKworCXsgIkdNVCIsICAgIDAsIDAsIH0sCS8qIEdyZWVud2ljaCBNZWFuICovCisJeyAiVVRDIiwgICAgMCwgMCwgfSwJLyogVW5pdmVyc2FsIChDb29yZGluYXRlZCkgKi8KKworCXsgIldFVCIsICAgIDAsIDAsIH0sCS8qIFdlc3Rlcm4gRXVyb3BlYW4gKi8KKwl7ICJCU1QiLCAgICAwLCAxLCB9LAkvKiBCcml0aXNoIFN1bW1lciAqLworCXsgIkNFVCIsICAgKzEsIDAsIH0sCS8qIENlbnRyYWwgRXVyb3BlYW4gKi8KKwl7ICJNRVQiLCAgICsxLCAwLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gKi8KKwl7ICJNRVdUIiwgICsxLCAwLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gV2ludGVyICovCisJeyAiTUVTVCIsICArMSwgMSwgfSwJLyogTWlkZGxlIEV1cm9wZWFuIFN1bW1lciAqLworCXsgIkNFU1QiLCAgKzEsIDEsIH0sCS8qIENlbnRyYWwgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiTUVTWiIsICArMSwgMSwgfSwJLyogTWlkZGxlIEV1cm9wZWFuIFN1bW1lciAqLworCXsgIkZXVCIsICAgKzEsIDAsIH0sCS8qIEZyZW5jaCBXaW50ZXIgKi8KKwl7ICJGU1QiLCAgICsxLCAxLCB9LAkvKiBGcmVuY2ggU3VtbWVyICovCisJeyAiRUVUIiwgICArMiwgMCwgfSwJLyogRWFzdGVybiBFdXJvcGUsIFVTU1IgWm9uZSAxICovCisJeyAiRUVTVCIsICArMiwgMSwgfSwJLyogRWFzdGVybiBFdXJvcGVhbiBEYXlsaWdodCAqLworCXsgIldBU1QiLCAgKzcsIDAsIH0sCS8qIFdlc3QgQXVzdHJhbGlhbiBTdGFuZGFyZCAqLworCXsgIldBRFQiLCAgKzcsIDEsIH0sCS8qIFdlc3QgQXVzdHJhbGlhbiBEYXlsaWdodCAqLworCXsgIkNDVCIsICAgKzgsIDAsIH0sCS8qIENoaW5hIENvYXN0LCBVU1NSIFpvbmUgNyAqLworCXsgIkpTVCIsICAgKzksIDAsIH0sCS8qIEphcGFuIFN0YW5kYXJkLCBVU1NSIFpvbmUgOCAqLworCXsgIkVBU1QiLCArMTAsIDAsIH0sCS8qIEVhc3Rlcm4gQXVzdHJhbGlhbiBTdGFuZGFyZCAqLworCXsgIkVBRFQiLCArMTAsIDEsIH0sCS8qIEVhc3Rlcm4gQXVzdHJhbGlhbiBEYXlsaWdodCAqLworCXsgIkdTVCIsICArMTAsIDAsIH0sCS8qIEd1YW0gU3RhbmRhcmQsIFVTU1IgWm9uZSA5ICovCisJeyAiTlpUIiwgICsxMSwgMCwgfSwJLyogTmV3IFplYWxhbmQgKi8KKwl7ICJOWlNUIiwgKzExLCAwLCB9LAkvKiBOZXcgWmVhbGFuZCBTdGFuZGFyZCAqLworCXsgIk5aRFQiLCArMTEsIDEsIH0sCS8qIE5ldyBaZWFsYW5kIERheWxpZ2h0ICovCisJeyAiSURMRSIsICsxMiwgMCwgfSwJLyogSW50ZXJuYXRpb25hbCBEYXRlIExpbmUgRWFzdCAqLworfTsKKworc3RhdGljIGludCBtYXRjaF9zdHJpbmcoY29uc3QgY2hhciAqZGF0ZSwgY29uc3QgY2hhciAqc3RyKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7ICpkYXRlOyBkYXRlKyssIHN0cisrLCBpKyspIHsKKwkJaWYgKCpkYXRlID09ICpzdHIpCisJCQljb250aW51ZTsKKwkJaWYgKHRvdXBwZXIoKmRhdGUpID09IHRvdXBwZXIoKnN0cikpCisJCQljb250aW51ZTsKKwkJaWYgKCFpc2FsbnVtKCpkYXRlKSkKKwkJCWJyZWFrOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9hbHBoYShjb25zdCBjaGFyICpkYXRlKQoreworCWludCBpID0gMDsKKwlkbyB7CisJCWkrKzsKKwl9IHdoaWxlIChpc2FscGhhKGRhdGVbaV0pKTsKKwlyZXR1cm4gaTsKK30KKworLyoKKyogUGFyc2UgbW9udGgsIHdlZWtkYXksIG9yIHRpbWV6b25lIG5hbWUKKyovCitzdGF0aWMgaW50IG1hdGNoX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqb2Zmc2V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJaW50IG1hdGNoID0gbWF0Y2hfc3RyaW5nKGRhdGUsIG1vbnRoX25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCXRtLT50bV9tb24gPSBpOworCQkJcmV0dXJuIG1hdGNoOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgd2Vla2RheV9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQl0bS0+dG1fd2RheSA9IGk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0aW1lem9uZV9uYW1lcyk7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgdGltZXpvbmVfbmFtZXNbaV0ubmFtZSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQlpbnQgb2ZmID0gdGltZXpvbmVfbmFtZXNbaV0ub2Zmc2V0OworCisJCQkvKiBUaGlzIGlzIGJvZ3VzLCBidXQgd2UgbGlrZSBzdW1tZXIgKi8KKwkJCW9mZiArPSB0aW1lem9uZV9uYW1lc1tpXS5kc3Q7CisKKwkJCS8qIE9ubHkgdXNlIHRoZSB0eiBuYW1lIG9mZnNldCBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIGJldHRlciAqLworCQkJaWYgKCpvZmZzZXQgPT0gLTEpCisJCQkJKm9mZnNldCA9IDYwKm9mZjsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9CisJfQorCisJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAiUE0iKSA9PSAyKSB7CisJCXRtLT50bV9ob3VyID0gKHRtLT50bV9ob3VyICUgMTIpICsgMTI7CisJCXJldHVybiAyOworCX0KKworCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgIkFNIikgPT0gMikgeworCQl0bS0+dG1faG91ciA9ICh0bS0+dG1faG91ciAlIDEyKSArIDA7CisJCXJldHVybiAyOworCX0KKworCS8qIEJBRCBDUkFQICovCisJcmV0dXJuIHNraXBfYWxwaGEoZGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBzdHJ1Y3QgdG0gKm5vd190bSwgdGltZV90IG5vdywgc3RydWN0IHRtICp0bSkKK3sKKwlpZiAobW9udGggPiAwICYmIG1vbnRoIDwgMTMgJiYgZGF5ID4gMCAmJiBkYXkgPCAzMikgeworCQlzdHJ1Y3QgdG0gY2hlY2sgPSAqdG07CisJCXN0cnVjdCB0bSAqciA9IChub3dfdG0gPyAmY2hlY2sgOiB0bSk7CisJCXRpbWVfdCBzcGVjaWZpZWQ7CisKKwkJci0+dG1fbW9uID0gbW9udGggLSAxOworCQlyLT50bV9tZGF5ID0gZGF5OworCQlpZiAoeWVhciA9PSAtMSkgeworCQkJaWYgKCFub3dfdG0pCisJCQkJcmV0dXJuIDE7CisJCQlyLT50bV95ZWFyID0gbm93X3RtLT50bV95ZWFyOworCQl9CisJCWVsc2UgaWYgKHllYXIgPj0gMTk3MCAmJiB5ZWFyIDwgMjEwMCkKKwkJCXItPnRtX3llYXIgPSB5ZWFyIC0gMTkwMDsKKwkJZWxzZSBpZiAoeWVhciA+IDcwICYmIHllYXIgPCAxMDApCisJCQlyLT50bV95ZWFyID0geWVhcjsKKwkJZWxzZSBpZiAoeWVhciA8IDM4KQorCQkJci0+dG1feWVhciA9IHllYXIgKyAxMDA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQlpZiAoIW5vd190bSkKKwkJCXJldHVybiAxOworCisJCXNwZWNpZmllZCA9IG15X21rdGltZShyKTsKKworCQkvKiBCZSBpdCBjb21taXQgdGltZSBvciBhdXRob3IgdGltZSwgaXQgZG9lcyBub3QgbWFrZQorCQkgKiBzZW5zZSB0byBzcGVjaWZ5IHRpbWVzdGFtcCB3YXkgaW50byB0aGUgZnV0dXJlLiAgTWFrZQorCQkgKiBzdXJlIGl0IGlzIG5vdCBsYXRlciB0aGFuIHRlbiBkYXlzIGZyb20gbm93Li4uCisJCSAqLworCQlpZiAobm93ICsgMTAqMjQqMzYwMCA8IHNwZWNpZmllZCkKKwkJCXJldHVybiAwOworCQl0bS0+dG1fbW9uID0gci0+dG1fbW9uOworCQl0bS0+dG1fbWRheSA9IHItPnRtX21kYXk7CisJCWlmICh5ZWFyICE9IC0xKQorCQkJdG0tPnRtX3llYXIgPSByLT50bV95ZWFyOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfbXVsdGlfbnVtYmVyKHVuc2lnbmVkIGxvbmcgbnVtLCBjaGFyIGMsIGNvbnN0IGNoYXIgKmRhdGUsIGNoYXIgKmVuZCwgc3RydWN0IHRtICp0bSkKK3sKKwl0aW1lX3Qgbm93OworCXN0cnVjdCB0bSBub3dfdG07CisJc3RydWN0IHRtICpyZWZ1c2VfZnV0dXJlOworCWxvbmcgbnVtMiwgbnVtMzsKKworCW51bTIgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKwludW0zID0gLTE7CisJaWYgKCplbmQgPT0gYyAmJiBpc2RpZ2l0KGVuZFsxXSkpCisJCW51bTMgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKworCS8qIFRpbWU/IERhdGU/ICovCisJc3dpdGNoIChjKSB7CisJY2FzZSAnOic6CisJCWlmIChudW0zIDwgMCkKKwkJCW51bTMgPSAwOworCQlpZiAobnVtIDwgMjUgJiYgbnVtMiA+PSAwICYmIG51bTIgPCA2MCAmJiBudW0zID49IDAgJiYgbnVtMyA8PSA2MCkgeworCQkJdG0tPnRtX2hvdXIgPSBudW07CisJCQl0bS0+dG1fbWluID0gbnVtMjsKKwkJCXRtLT50bV9zZWMgPSBudW0zOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlICctJzoKKwljYXNlICcvJzoKKwljYXNlICcuJzoKKwkJbm93ID0gdGltZShOVUxMKTsKKwkJcmVmdXNlX2Z1dHVyZSA9IE5VTEw7CisJCWlmIChnbXRpbWVfcigmbm93LCAmbm93X3RtKSkKKwkJCXJlZnVzZV9mdXR1cmUgPSAmbm93X3RtOworCisJCWlmIChudW0gPiA3MCkgeworCQkJLyogeXl5eS1tbS1kZD8gKi8KKwkJCWlmIChpc19kYXRlKG51bSwgbnVtMiwgbnVtMywgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQkJYnJlYWs7CisJCQkvKiB5eXl5LWRkLW1tPyAqLworCQkJaWYgKGlzX2RhdGUobnVtLCBudW0zLCBudW0yLCByZWZ1c2VfZnV0dXJlLCBub3csIHRtKSkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBPdXIgZWFzdGVybiBFdXJvcGVhbiBmcmllbmRzIHNheSBkZC5tbS55eVt5eV0KKwkJICogaXMgdGhlIG5vcm0gdGhlcmUsIHNvIGdpdmluZyBwcmVjZWRlbmNlIHRvCisJCSAqIG1tL2RkL3l5W3l5XSBmb3JtIG9ubHkgd2hlbiBzZXBhcmF0b3IgaXMgbm90ICcuJworCQkgKi8KKwkJaWYgKGMgIT0gJy4nICYmCisJCSAgICBpc19kYXRlKG51bTMsIG51bSwgbnVtMiwgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQlicmVhazsKKwkJLyogRXVyb3BlYW4gZGQubW0ueXlbeXldIG9yIGZ1bm55IFVTIGRkL21tL3l5W3l5XSAqLworCQlpZiAoaXNfZGF0ZShudW0zLCBudW0yLCBudW0sIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCS8qIEZ1bm55IEV1cm9wZWFuIG1tLmRkLnl5ICovCisJCWlmIChjID09ICcuJyAmJgorCQkgICAgaXNfZGF0ZShudW0zLCBudW0sIG51bTIsIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZW5kIC0gZGF0ZTsKK30KKworLyoKKyAqIFdlJ3ZlIHNlZW4gYSBkaWdpdC4gVGltZT8gWWVhcj8gRGF0ZT8gCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfZGlnaXQoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQsIGludCAqdG1fZ210KQoreworCWludCBuOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCW51bSA9IHN0cnRvdWwoZGF0ZSwgJmVuZCwgMTApOworCisJLyoKKwkgKiBTZWNvbmRzIHNpbmNlIDE5NzA/IFdlIHRyaWdnZXIgb24gdGhhdCBmb3IgYW55IG51bWJlcnMgd2l0aAorCSAqIG1vcmUgdGhhbiA4IGRpZ2l0cy4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcnVsZSBvdXQKKwkgKiBudW1iZXJzIGxpa2UgMjAwNzA2MDYgYXMgYSBZWVlZTU1ERCBkYXRlLgorCSAqLworCWlmIChudW0gPj0gMTAwMDAwMDAwKSB7CisJCXRpbWVfdCB0aW1lID0gbnVtOworCQlpZiAoZ210aW1lX3IoJnRpbWUsIHRtKSkgeworCQkJKnRtX2dtdCA9IDE7CisJCQlyZXR1cm4gZW5kIC0gZGF0ZTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHNwZWNpYWwgZm9ybWF0czogbnVtWy0uOi9dbnVtW3NhbWVdbnVtCisJICovCisJc3dpdGNoICgqZW5kKSB7CisJY2FzZSAnOic6CisJY2FzZSAnLic6CisJY2FzZSAnLyc6CisJY2FzZSAnLSc6CisJCWlmIChpc2RpZ2l0KGVuZFsxXSkpIHsKKwkJCWludCBtYXRjaCA9IG1hdGNoX211bHRpX251bWJlcihudW0sICplbmQsIGRhdGUsIGVuZCwgdG0pOworCQkJaWYgKG1hdGNoKQorCQkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCS8qCisJICogTm9uZSBvZiB0aGUgc3BlY2lhbCBmb3JtYXRzPyBUcnkgdG8gZ3Vlc3Mgd2hhdAorCSAqIHRoZSBudW1iZXIgbWVhbnQuIFdlIHVzZSB0aGUgbnVtYmVyIG9mIGRpZ2l0cworCSAqIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkIGd1ZXNzLi4KKwkgKi8KKwluID0gMDsKKwlkbyB7CisJCW4rKzsKKwl9IHdoaWxlIChpc2RpZ2l0KGRhdGVbbl0pKTsKKworCS8qIEZvdXItZGlnaXQgeWVhciBvciBhIHRpbWV6b25lPyAqLworCWlmIChuID09IDQpIHsKKwkJaWYgKG51bSA8PSAxNDAwICYmICpvZmZzZXQgPT0gLTEpIHsKKwkJCXVuc2lnbmVkIGludCBtaW51dGVzID0gbnVtICUgMTAwOworCQkJdW5zaWduZWQgaW50IGhvdXJzID0gbnVtIC8gMTAwOworCQkJKm9mZnNldCA9IGhvdXJzKjYwICsgbWludXRlczsKKwkJfSBlbHNlIGlmIChudW0gPiAxOTAwICYmIG51bSA8IDIxMDApCisJCQl0bS0+dG1feWVhciA9IG51bSAtIDE5MDA7CisJCXJldHVybiBuOworCX0KKworCS8qCisJICogTk9URSEgV2Ugd2lsbCBnaXZlIHByZWNlZGVuY2UgdG8gZGF5LW9mLW1vbnRoIG92ZXIgbW9udGggb3IKKwkgKiB5ZWFyIG51bWJlcnMgaW4gdGhlIDEtMTIgcmFuZ2UuIFNvIDA1IGlzIGFsd2F5cyAibWRheSA1IiwKKwkgKiB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIGEgbWRheS4uCisJICoKKwkgKiBJT1csIDAxIEFwciAwNSBwYXJzZXMgYXMgIkFwcmlsIDFzdCwgMjAwNSIuCisJICovCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIgJiYgdG0tPnRtX21kYXkgPCAwKSB7CisJCXRtLT50bV9tZGF5ID0gbnVtOworCQlyZXR1cm4gbjsKKwl9CisKKwkvKiBUd28tZGlnaXQgeWVhcj8gKi8KKwlpZiAobiA9PSAyICYmIHRtLT50bV95ZWFyIDwgMCkgeworCQlpZiAobnVtIDwgMTAgJiYgdG0tPnRtX21kYXkgPj0gMCkgeworCQkJdG0tPnRtX3llYXIgPSBudW0gKyAxMDA7CisJCQlyZXR1cm4gbjsKKwkJfQorCQlpZiAobnVtID49IDcwKSB7CisJCQl0bS0+dG1feWVhciA9IG51bTsKKwkJCXJldHVybiBuOworCQl9CisJfQorCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIpIHsKKwkJdG0tPnRtX21kYXkgPSBudW07CisJfSBlbHNlIGlmIChudW0gPiAxOTAwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtIC0gMTkwMDsKKwl9IGVsc2UgaWYgKG51bSA+IDcwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtOworCX0gZWxzZSBpZiAobnVtID4gMCAmJiBudW0gPCAxMykgeworCQl0bS0+dG1fbW9uID0gbnVtLTE7CisJfQorCQkKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBtYXRjaF90eihjb25zdCBjaGFyICpkYXRlLCBpbnQgKm9mZnApCit7CisJY2hhciAqZW5kOworCWludCBvZmZzZXQgPSBzdHJ0b3VsKGRhdGUrMSwgJmVuZCwgMTApOworCWludCBtaW4sIGhvdXI7CisJaW50IG4gPSBlbmQgLSBkYXRlIC0gMTsKKworCW1pbiA9IG9mZnNldCAlIDEwMDsKKwlob3VyID0gb2Zmc2V0IC8gMTAwOworCisJLyoKKwkgKiBEb24ndCBhY2NlcHQgYW55IHJhbmRvbSBjcmFwLi4gQXQgbGVhc3QgMyBkaWdpdHMsIGFuZAorCSAqIGEgdmFsaWQgbWludXRlLiBXZSBtaWdodCB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIG1pbnV0ZXMKKwkgKiBhcmUgZGl2aXNpYmxlIGJ5IDMwIG9yIHNvbWV0aGluZyB0b28uCisJICovCisJaWYgKG1pbiA8IDYwICYmIG4gPiAyKSB7CisJCW9mZnNldCA9IGhvdXIqNjArbWluOworCQlpZiAoKmRhdGUgPT0gJy0nKQorCQkJb2Zmc2V0ID0gLW9mZnNldDsKKworCQkqb2ZmcCA9IG9mZnNldDsKKwl9CisJcmV0dXJuIGVuZCAtIGRhdGU7Cit9CisKK3N0YXRpYyBpbnQgZGF0ZV9zdHJpbmcodW5zaWduZWQgbG9uZyBkYXRlLCBpbnQgb2Zmc2V0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHNpZ24gPSAnKyc7CisKKwlpZiAob2Zmc2V0IDwgMCkgeworCQlvZmZzZXQgPSAtb2Zmc2V0OworCQlzaWduID0gJy0nOworCX0KKwlyZXR1cm4gc25wcmludGYoYnVmLCBsZW4sICIlbHUgJWMlMDJkJTAyZCIsIGRhdGUsIHNpZ24sIG9mZnNldCAvIDYwLCBvZmZzZXQgJSA2MCk7Cit9CisKKy8qIEdyLiBzdHJwdGltZSBpcyBjcmFwIGZvciB0aGlzOyBpdCBkb2Vzbid0IGhhdmUgYSB3YXkgdG8gcmVxdWlyZSBSRkMyODIyCisgICAoaS5lLiBFbmdsaXNoKSBkYXkvbW9udGggbmFtZXMsIGFuZCBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IHdpdGggJXouICovCitpbnQgcGFyc2VfZGF0ZShjb25zdCBjaGFyICpkYXRlLCBjaGFyICpyZXN1bHQsIGludCBtYXhsZW4pCit7CisJc3RydWN0IHRtIHRtOworCWludCBvZmZzZXQsIHRtX2dtdDsKKwl0aW1lX3QgdGhlbjsKKworCW1lbXNldCgmdG0sIDAsIHNpemVvZih0bSkpOworCXRtLnRtX3llYXIgPSAtMTsKKwl0bS50bV9tb24gPSAtMTsKKwl0bS50bV9tZGF5ID0gLTE7CisJdG0udG1faXNkc3QgPSAtMTsKKwlvZmZzZXQgPSAtMTsKKwl0bV9nbXQgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgbWF0Y2ggPSAwOworCQl1bnNpZ25lZCBjaGFyIGMgPSAqZGF0ZTsKKworCQkvKiBTdG9wIGF0IGVuZCBvZiBzdHJpbmcgb3IgbmV3bGluZSAqLworCQlpZiAoIWMgfHwgYyA9PSAnXG4nKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzYWxwaGEoYykpCisJCQltYXRjaCA9IG1hdGNoX2FscGhhKGRhdGUsICZ0bSwgJm9mZnNldCk7CisJCWVsc2UgaWYgKGlzZGlnaXQoYykpCisJCQltYXRjaCA9IG1hdGNoX2RpZ2l0KGRhdGUsICZ0bSwgJm9mZnNldCwgJnRtX2dtdCk7CisJCWVsc2UgaWYgKChjID09ICctJyB8fCBjID09ICcrJykgJiYgaXNkaWdpdChkYXRlWzFdKSkKKwkJCW1hdGNoID0gbWF0Y2hfdHooZGF0ZSwgJm9mZnNldCk7CisKKwkJaWYgKCFtYXRjaCkgeworCQkJLyogQkFEIENSQVAgKi8KKwkJCW1hdGNoID0gMTsKKwkJfQkKKworCQlkYXRlICs9IG1hdGNoOworCX0KKworCS8qIG1rdGltZSB1c2VzIGxvY2FsIHRpbWV6b25lICovCisJdGhlbiA9IG15X21rdGltZSgmdG0pOyAKKwlpZiAob2Zmc2V0ID09IC0xKQorCQlvZmZzZXQgPSAodGhlbiAtIG1rdGltZSgmdG0pKSAvIDYwOworCisJaWYgKHRoZW4gPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmICghdG1fZ210KQorCQl0aGVuIC09IG9mZnNldCAqIDYwOworCXJldHVybiBkYXRlX3N0cmluZyh0aGVuLCBvZmZzZXQsIHJlc3VsdCwgbWF4bGVuKTsKK30KKwordm9pZCBkYXRlc3RhbXAoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKK3sKKwl0aW1lX3Qgbm93OworCWludCBvZmZzZXQ7CisKKwl0aW1lKCZub3cpOworCisJb2Zmc2V0ID0gbXlfbWt0aW1lKGxvY2FsdGltZSgmbm93KSkgLSBub3c7CisJb2Zmc2V0IC89IDYwOworCisJZGF0ZV9zdHJpbmcobm93LCBvZmZzZXQsIGJ1ZiwgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90bShzdHJ1Y3QgdG0gKnRtLCB1bnNpZ25lZCBsb25nIHNlYykKK3sKKwl0aW1lX3QgbiA9IG1rdGltZSh0bSkgLSBzZWM7CisJbG9jYWx0aW1lX3IoJm4sIHRtKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV95ZXN0ZXJkYXkoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJdXBkYXRlX3RtKHRtLCAyNCo2MCo2MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfdGltZShzdHJ1Y3QgdG0gKnRtLCBpbnQgaG91cikKK3sKKwlpZiAodG0tPnRtX2hvdXIgPCBob3VyKQorCQlkYXRlX3llc3RlcmRheSh0bSwgTlVMTCk7CisJdG0tPnRtX2hvdXIgPSBob3VyOworCXRtLT50bV9taW4gPSAwOworCXRtLT50bV9zZWMgPSAwOworfQorCitzdGF0aWMgdm9pZCBkYXRlX21pZG5pZ2h0KHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWRhdGVfdGltZSh0bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfbm9vbihzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlkYXRlX3RpbWUodG0sIDEyKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV90ZWEoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJZGF0ZV90aW1lKHRtLCAxNyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfcG0oc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJaW50IGhvdXIsIG4gPSAqbnVtOworCSpudW0gPSAwOworCisJaG91ciA9IHRtLT50bV9ob3VyOworCWlmIChuKSB7CisJCWhvdXIgPSBuOworCQl0bS0+dG1fbWluID0gMDsKKwkJdG0tPnRtX3NlYyA9IDA7CisJfQorCXRtLT50bV9ob3VyID0gKGhvdXIgJSAxMikgKyAxMjsKK30KKworc3RhdGljIHZvaWQgZGF0ZV9hbShzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlpbnQgaG91ciwgbiA9ICpudW07CisJKm51bSA9IDA7CisKKwlob3VyID0gdG0tPnRtX2hvdXI7CisJaWYgKG4pIHsKKwkJaG91ciA9IG47CisJCXRtLT50bV9taW4gPSAwOworCQl0bS0+dG1fc2VjID0gMDsKKwl9CisJdG0tPnRtX2hvdXIgPSAoaG91ciAlIDEyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGVjaWFsIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCpmbikoc3RydWN0IHRtICosIGludCAqKTsKK30gc3BlY2lhbFtdID0geworCXsgInllc3RlcmRheSIsIGRhdGVfeWVzdGVyZGF5IH0sCisJeyAibm9vbiIsIGRhdGVfbm9vbiB9LAorCXsgIm1pZG5pZ2h0IiwgZGF0ZV9taWRuaWdodCB9LAorCXsgInRlYSIsIGRhdGVfdGVhIH0sCisJeyAiUE0iLCBkYXRlX3BtIH0sCisJeyAiQU0iLCBkYXRlX2FtIH0sCisJeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpudW1iZXJfbmFtZVtdID0geworCSJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsCisJImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAidGVuIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHlwZWxlbiB7CisJY29uc3QgY2hhciAqdHlwZTsKKwlpbnQgbGVuZ3RoOworfSB0eXBlbGVuW10gPSB7CisJeyAic2Vjb25kcyIsIDEgfSwKKwl7ICJtaW51dGVzIiwgNjAgfSwKKwl7ICJob3VycyIsIDYwKjYwIH0sCisJeyAiZGF5cyIsIDI0KjYwKjYwIH0sCisJeyAid2Vla3MiLCA3KjI0KjYwKjYwIH0sCisJeyBOVUxMIH0KK307CQorCitzdGF0aWMgY29uc3QgY2hhciAqYXBwcm94aWRhdGVfYWxwaGEoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJY29uc3Qgc3RydWN0IHR5cGVsZW4gKnRsOworCWNvbnN0IHN0cnVjdCBzcGVjaWFsICpzOworCWNvbnN0IGNoYXIgKmVuZCA9IGRhdGU7CisJaW50IGk7CisKKwl3aGlsZSAoaXNhbHBoYSgqKytlbmQpKTsKKwkJOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJaW50IG1hdGNoID0gbWF0Y2hfc3RyaW5nKGRhdGUsIG1vbnRoX25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCXRtLT50bV9tb24gPSBpOworCQkJcmV0dXJuIGVuZDsKKwkJfQorCX0KKworCWZvciAocyA9IHNwZWNpYWw7IHMtPm5hbWU7IHMrKykgeworCQlpbnQgbGVuID0gc3RybGVuKHMtPm5hbWUpOworCQlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsIHMtPm5hbWUpID09IGxlbikgeworCQkJcy0+Zm4odG0sIG51bSk7CisJCQlyZXR1cm4gZW5kOworCQl9CisJfQorCisJaWYgKCEqbnVtKSB7CisJCWZvciAoaSA9IDE7IGkgPCAxMTsgaSsrKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKG51bWJlcl9uYW1lW2ldKTsKKwkJCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgbnVtYmVyX25hbWVbaV0pID09IGxlbikgeworCQkJCSpudW0gPSBpOworCQkJCXJldHVybiBlbmQ7CisJCQl9CisJCX0KKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAibGFzdCIpID09IDQpCisJCQkqbnVtID0gMTsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwl0bCA9IHR5cGVsZW47CisJd2hpbGUgKHRsLT50eXBlKSB7CisJCWludCBsZW4gPSBzdHJsZW4odGwtPnR5cGUpOworCQlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsIHRsLT50eXBlKSA+PSBsZW4tMSkgeworCQkJdXBkYXRlX3RtKHRtLCB0bC0+bGVuZ3RoICogKm51bSk7CisJCQkqbnVtID0gMDsKKwkJCXJldHVybiBlbmQ7CisJCX0KKwkJdGwrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB3ZWVrZGF5X25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCWludCBkaWZmLCBuID0gKm51bSAtMTsKKwkJCSpudW0gPSAwOworCisJCQlkaWZmID0gdG0tPnRtX3dkYXkgLSBpOworCQkJaWYgKGRpZmYgPD0gMCkKKwkJCQluKys7CisJCQlkaWZmICs9IDcqbjsKKworCQkJdXBkYXRlX3RtKHRtLCBkaWZmICogMjQgKiA2MCAqIDYwKTsKKwkJCXJldHVybiBlbmQ7CisJCX0KKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJtb250aHMiKSA+PSA1KSB7CisJCWludCBuID0gdG0tPnRtX21vbiAtICpudW07CisJCSpudW0gPSAwOworCQl3aGlsZSAobiA8IDApIHsKKwkJCW4gKz0gMTI7CisJCQl0bS0+dG1feWVhci0tOworCQl9CisJCXRtLT50bV9tb24gPSBuOworCQlyZXR1cm4gZW5kOworCX0KKworCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgInllYXJzIikgPj0gNCkgeworCQl0bS0+dG1feWVhciAtPSAqbnVtOworCQkqbnVtID0gMDsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwlyZXR1cm4gZW5kOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXBwcm94aWRhdGVfZGlnaXQoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJY2hhciAqZW5kOworCXVuc2lnbmVkIGxvbmcgbnVtYmVyID0gc3RydG91bChkYXRlLCAmZW5kLCAxMCk7CisKKwlzd2l0Y2ggKCplbmQpIHsKKwljYXNlICc6JzoKKwljYXNlICcuJzoKKwljYXNlICcvJzoKKwljYXNlICctJzoKKwkJaWYgKGlzZGlnaXQoZW5kWzFdKSkgeworCQkJaW50IG1hdGNoID0gbWF0Y2hfbXVsdGlfbnVtYmVyKG51bWJlciwgKmVuZCwgZGF0ZSwgZW5kLCB0bSk7CisJCQlpZiAobWF0Y2gpCisJCQkJcmV0dXJuIGRhdGUgKyBtYXRjaDsKKwkJfQorCX0KKworCSpudW0gPSBudW1iZXI7CisJcmV0dXJuIGVuZDsKK30KKwordW5zaWduZWQgbG9uZyBhcHByb3hpZGF0ZShjb25zdCBjaGFyICpkYXRlKQoreworCWludCBudW1iZXIgPSAwOworCXN0cnVjdCB0bSB0bSwgbm93OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNoYXIgYnVmZmVyWzUwXTsKKworCWlmIChwYXJzZV9kYXRlKGRhdGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID4gMCkKKwkJcmV0dXJuIHN0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworCW5vdyA9IHRtOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKmRhdGU7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlkYXRlKys7CisJCWlmIChpc2RpZ2l0KGMpKSB7CisJCQlkYXRlID0gYXBwcm94aWRhdGVfZGlnaXQoZGF0ZS0xLCAmdG0sICZudW1iZXIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlzYWxwaGEoYykpCisJCQlkYXRlID0gYXBwcm94aWRhdGVfYWxwaGEoZGF0ZS0xLCAmdG0sICZudW1iZXIpOworCX0KKwlpZiAobnVtYmVyID4gMCAmJiBudW1iZXIgPCAzMikKKwkJdG0udG1fbWRheSA9IG51bWJlcjsKKwlpZiAodG0udG1fbW9uID4gbm93LnRtX21vbiAmJiB0bS50bV95ZWFyID09IG5vdy50bV95ZWFyKQorCQl0bS50bV95ZWFyLS07CisJcmV0dXJuIG1rdGltZSgmdG0pOworfQpkaWZmIC0tZ2l0IGEvZGVjb3JhdGUuYyBiL2RlY29yYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmNmIwMAotLS0gL2Rldi9udWxsCisrKyBiL2RlY29yYXRlLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIGRlY29yYXRlLmMgLSBkZWNvcmF0ZSBhIGdpdCBvYmplY3Qgd2l0aCBzb21lIGFyYml0cmFyeQorICogZGF0YS4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiZGVjb3JhdGUuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX29iaihzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gKih1bnNpZ25lZCBpbnQgKilvYmotPnNoYTE7CisJcmV0dXJuIGhhc2ggJSBuOworfQorCitzdGF0aWMgdm9pZCAqaW5zZXJ0X2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4sIHN0cnVjdCBvYmplY3QgKmJhc2UsIHZvaWQgKmRlY29yYXRpb24pCit7CisJaW50IHNpemUgPSBuLT5zaXplOworCXN0cnVjdCBvYmplY3RfZGVjb3JhdGlvbiAqaGFzaCA9IG4tPmhhc2g7CisJaW50IGogPSBoYXNoX29iaihiYXNlLCBzaXplKTsKKworCXdoaWxlIChoYXNoW2pdLmJhc2UpIHsKKwkJaWYgKGhhc2hbal0uYmFzZSA9PSBiYXNlKSB7CisJCQl2b2lkICpvbGQgPSBoYXNoW2pdLmRlY29yYXRpb247CisJCQloYXNoW2pdLmRlY29yYXRpb24gPSBkZWNvcmF0aW9uOworCQkJcmV0dXJuIG9sZDsKKwkJfQorCQlpZiAoKytqID49IHNpemUpCisJCQlqID0gMDsKKwl9CisJaGFzaFtqXS5iYXNlID0gYmFzZTsKKwloYXNoW2pdLmRlY29yYXRpb24gPSBkZWNvcmF0aW9uOworCW4tPm5yKys7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdyb3dfZGVjb3JhdGlvbihzdHJ1Y3QgZGVjb3JhdGlvbiAqbikKK3sKKwlpbnQgaTsKKwlpbnQgb2xkX3NpemUgPSBuLT5zaXplOworCXN0cnVjdCBvYmplY3RfZGVjb3JhdGlvbiAqb2xkX2hhc2g7CisKKwlvbGRfc2l6ZSA9IG4tPnNpemU7CisJb2xkX2hhc2ggPSBuLT5oYXNoOworCisJbi0+c2l6ZSA9IChvbGRfc2l6ZSArIDEwMDApICogMyAvIDI7CisJbi0+aGFzaCA9IHhjYWxsb2Mobi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBvYmplY3RfZGVjb3JhdGlvbikpOworCW4tPm5yID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBvbGRfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKmJhc2UgPSBvbGRfaGFzaFtpXS5iYXNlOworCQl2b2lkICpkZWNvcmF0aW9uID0gb2xkX2hhc2hbaV0uZGVjb3JhdGlvbjsKKworCQlpZiAoIWJhc2UpCisJCQljb250aW51ZTsKKwkJaW5zZXJ0X2RlY29yYXRpb24obiwgYmFzZSwgZGVjb3JhdGlvbik7CisJfQorCWZyZWUob2xkX2hhc2gpOworfQorCisvKiBBZGQgYSBkZWNvcmF0aW9uIHBvaW50ZXIsIHJldHVybiBhbnkgb2xkIG9uZSAqLwordm9pZCAqYWRkX2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4sIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqZGVjb3JhdGlvbikKK3sKKwlpbnQgbnIgPSBuLT5uciArIDE7CisKKwlpZiAobnIgPiBuLT5zaXplICogMiAvIDMpCisJCWdyb3dfZGVjb3JhdGlvbihuKTsKKwlyZXR1cm4gaW5zZXJ0X2RlY29yYXRpb24obiwgb2JqLCBkZWNvcmF0aW9uKTsKK30KKworLyogTG9va3VwIGEgZGVjb3JhdGlvbiBwb2ludGVyICovCit2b2lkICpsb29rdXBfZGVjb3JhdGlvbihzdHJ1Y3QgZGVjb3JhdGlvbiAqbiwgc3RydWN0IG9iamVjdCAqb2JqKQoreworCWludCBqOworCisJLyogbm90aGluZyB0byBsb29rdXAgKi8KKwlpZiAoIW4tPnNpemUpCisJCXJldHVybiBOVUxMOworCWogPSBoYXNoX29iaihvYmosIG4tPnNpemUpOworCWZvciAoOzspIHsKKwkJc3RydWN0IG9iamVjdF9kZWNvcmF0aW9uICpyZWYgPSBuLT5oYXNoICsgajsKKwkJaWYgKHJlZi0+YmFzZSA9PSBvYmopCisJCQlyZXR1cm4gcmVmLT5kZWNvcmF0aW9uOworCQlpZiAoIXJlZi0+YmFzZSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoKytqID09IG4tPnNpemUpCisJCQlqID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kZWNvcmF0ZS5oIGIvZGVjb3JhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE0YWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVjb3JhdGUuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIERFQ09SQVRFX0gKKyNkZWZpbmUgREVDT1JBVEVfSAorCitzdHJ1Y3Qgb2JqZWN0X2RlY29yYXRpb24geworCXN0cnVjdCBvYmplY3QgKmJhc2U7CisJdm9pZCAqZGVjb3JhdGlvbjsKK307CisKK3N0cnVjdCBkZWNvcmF0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBzaXplLCBucjsKKwlzdHJ1Y3Qgb2JqZWN0X2RlY29yYXRpb24gKmhhc2g7Cit9OworCitleHRlcm4gdm9pZCAqYWRkX2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4sIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqZGVjb3JhdGlvbik7CitleHRlcm4gdm9pZCAqbG9va3VwX2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4sIHN0cnVjdCBvYmplY3QgKm9iaik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVsdGEuaCBiL2RlbHRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzZjg2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RlbHRhLmgKQEAgLTAsMCArMSw5OCBAQAorI2lmbmRlZiBERUxUQV9ICisjZGVmaW5lIERFTFRBX0gKKworLyogb3BhcXVlIG9iamVjdCBmb3IgZGVsdGEgaW5kZXggKi8KK3N0cnVjdCBkZWx0YV9pbmRleDsKKworLyoKKyAqIGNyZWF0ZV9kZWx0YV9pbmRleDogY29tcHV0ZSBpbmRleCBkYXRhIGZyb20gZ2l2ZW4gYnVmZmVyCisgKgorICogVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZWx0YV9pbmRleCB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8KKyAqIHN1YnNlcXVlbnQgY3JlYXRlX2RlbHRhKCkgY2FsbHMsIG9yIHRvIGZyZWVfZGVsdGFfaW5kZXgoKS4gIEEgTlVMTCBwb2ludGVyCisgKiBpcyByZXR1cm5lZCBvbiBmYWlsdXJlLiAgVGhlIGdpdmVuIGJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZCBub3IgYWx0ZXJlZAorICogYmVmb3JlIGZyZWVfZGVsdGFfaW5kZXgoKSBpcyBjYWxsZWQuICBUaGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlIGZyZWVkCisgKiB1c2luZyBmcmVlX2RlbHRhX2luZGV4KCkuCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGVsdGFfaW5kZXggKgorY3JlYXRlX2RlbHRhX2luZGV4KGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplKTsKKworLyoKKyAqIGZyZWVfZGVsdGFfaW5kZXg6IGZyZWUgdGhlIGluZGV4IGNyZWF0ZWQgYnkgY3JlYXRlX2RlbHRhX2luZGV4KCkKKyAqCisgKiBHaXZlbiBwb2ludGVyIG11c3QgYmUgd2hhdCBjcmVhdGVfZGVsdGFfaW5kZXgoKSByZXR1cm5lZCwgb3IgTlVMTC4KKyAqLworZXh0ZXJuIHZvaWQgZnJlZV9kZWx0YV9pbmRleChzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4KTsKKworLyoKKyAqIGNyZWF0ZV9kZWx0YTogY3JlYXRlIGEgZGVsdGEgZnJvbSBnaXZlbiBpbmRleCBmb3IgdGhlIGdpdmVuIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBidWZmZXJzIHVzaW5nCisgKiB0aGUgc2FtZSBkZWx0YV9pbmRleCBwb2ludGVyLiAgSWYgbWF4X2RlbHRhX3NpemUgaXMgbm9uLXplcm8gYW5kIHRoZQorICogcmVzdWx0aW5nIGRlbHRhIGlzIHRvIGJlIGxhcmdlciB0aGFuIG1heF9kZWx0YV9zaXplIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4KKyAqIE9uIHN1Y2Nlc3MsIGEgbm9uLU5VTEwgcG9pbnRlciB0byB0aGUgYnVmZmVyIHdpdGggdGhlIGRlbHRhIGRhdGEgaXMKKyAqIHJldHVybmVkIGFuZCAqZGVsdGFfc2l6ZSBpcyB1cGRhdGVkIHdpdGggaXRzIHNpemUuICBUaGUgcmV0dXJuZWQgYnVmZmVyCisgKiBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2V4dGVybiB2b2lkICoKK2NyZWF0ZV9kZWx0YShjb25zdCBzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4LAorCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGJ1ZnNpemUsCisJICAgICB1bnNpZ25lZCBsb25nICpkZWx0YV9zaXplLCB1bnNpZ25lZCBsb25nIG1heF9kZWx0YV9zaXplKTsKKworLyoKKyAqIGRpZmZfZGVsdGE6IGNyZWF0ZSBhIGRlbHRhIGZyb20gc291cmNlIGJ1ZmZlciB0byB0YXJnZXQgYnVmZmVyCisgKgorICogSWYgbWF4X2RlbHRhX3NpemUgaXMgbm9uLXplcm8gYW5kIHRoZSByZXN1bHRpbmcgZGVsdGEgaXMgdG8gYmUgbGFyZ2VyCisgKiB0aGFuIG1heF9kZWx0YV9zaXplIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4gIE9uIHN1Y2Nlc3MsIGEgbm9uLU5VTEwKKyAqIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWx0YSBkYXRhIGlzIHJldHVybmVkIGFuZCAqZGVsdGFfc2l6ZSBpcworICogdXBkYXRlZCB3aXRoIGl0cyBzaXplLiAgVGhlIHJldHVybmVkIGJ1ZmZlciBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitkaWZmX2RlbHRhKGNvbnN0IHZvaWQgKnNyY19idWYsIHVuc2lnbmVkIGxvbmcgc3JjX2J1ZnNpemUsCisJICAgY29uc3Qgdm9pZCAqdHJnX2J1ZiwgdW5zaWduZWQgbG9uZyB0cmdfYnVmc2l6ZSwKKwkgICB1bnNpZ25lZCBsb25nICpkZWx0YV9zaXplLCB1bnNpZ25lZCBsb25nIG1heF9kZWx0YV9zaXplKQoreworCXN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXggPSBjcmVhdGVfZGVsdGFfaW5kZXgoc3JjX2J1Ziwgc3JjX2J1ZnNpemUpOworCWlmIChpbmRleCkgeworCQl2b2lkICpkZWx0YSA9IGNyZWF0ZV9kZWx0YShpbmRleCwgdHJnX2J1ZiwgdHJnX2J1ZnNpemUsCisJCQkJCSAgIGRlbHRhX3NpemUsIG1heF9kZWx0YV9zaXplKTsKKwkJZnJlZV9kZWx0YV9pbmRleChpbmRleCk7CisJCXJldHVybiBkZWx0YTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBwYXRjaF9kZWx0YTogcmVjcmVhdGUgdGFyZ2V0IGJ1ZmZlciBnaXZlbiBzb3VyY2UgYnVmZmVyIGFuZCBkZWx0YSBkYXRhCisgKgorICogT24gc3VjY2VzcywgYSBub24tTlVMTCBwb2ludGVyIHRvIHRoZSB0YXJnZXQgYnVmZmVyIGlzIHJldHVybmVkIGFuZAorICogKnRyZ19idWZzaXplIGlzIHVwZGF0ZWQgd2l0aCBpdHMgc2l6ZS4gIE9uIGZhaWx1cmUgYSBOVUxMIHBvaW50ZXIgaXMKKyAqIHJldHVybmVkLiAgVGhlIHJldHVybmVkIGJ1ZmZlciBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2V4dGVybiB2b2lkICpwYXRjaF9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkJIGNvbnN0IHZvaWQgKmRlbHRhX2J1ZiwgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkJIHVuc2lnbmVkIGxvbmcgKmRzdF9zaXplKTsKKworLyogdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGRlbHRhIHNpemUgaXMgNCBieXRlcyAqLworI2RlZmluZSBERUxUQV9TSVpFX01JTgk0CisKKy8qCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHR3aWNlIG9uIHRoZSBkZWx0YSBkYXRhIGJ1ZmZlciwgZmlyc3QgdG8gZ2V0IHRoZQorICogZXhwZWN0ZWQgc291cmNlIGJ1ZmZlciBzaXplLCBhbmQgYWdhaW4gdG8gZ2V0IHRoZSB0YXJnZXQgYnVmZmVyIHNpemUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZGVsdGFfaGRyX3NpemUoY29uc3QgdW5zaWduZWQgY2hhciAqKmRhdGFwLAorCQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdG9wKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgPSAqZGF0YXA7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKwlpbnQgaSA9IDA7CisJZG8geworCQljbWQgPSAqZGF0YSsrOworCQlzaXplIHw9IChjbWQgJiB+MHg4MCkgPDwgaTsKKwkJaSArPSA3OworCX0gd2hpbGUgKGNtZCAmIDB4ODAgJiYgZGF0YSA8IHRvcCk7CisJKmRhdGFwID0gZGF0YTsKKwlyZXR1cm4gc2l6ZTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kaWZmLWRlbHRhLmMgYi9kaWZmLWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5OThkMAotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYtZGVsdGEuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIGRpZmYtZGVsdGEuYzogZ2VuZXJhdGUgYSBkZWx0YSBiZXR3ZWVuIHR3byBidWZmZXJzCisgKgorICogIE1hbnkgcGFydHMgb2YgdGhpcyBmaWxlIGhhdmUgYmVlbiBsaWZ0ZWQgZnJvbSBMaWJYRGlmZiB2ZXJzaW9uIDAuMTAuCisgKiAgaHR0cDovL3d3dy54bWFpbHNlcnZlci5vcmcveGRpZmYtbGliLmh0bWwKKyAqCisgKiAgTGliWERpZmYgd2FzIHdyaXR0ZW4gYnkgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMwlEYXZpZGUgTGliZW56aQorICoKKyAqICBNYW55IG1vZHMgZm9yIEdJVCB1c2FnZSBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+LCAoQykgMjAwNS4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVXNlIG9mIHRoaXMgd2l0aGluIGdpdCBhdXRvbWF0aWNhbGx5IG1lYW5zIHRoYXQgdGhlIExHUEwKKyAqICBsaWNlbnNpbmcgZ2V0cyB0dXJuZWQgaW50byBHUEx2MiB3aXRoaW4gdGhpcyBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorCisvKiBtYXhpbXVtIGhhc2ggZW50cnkgbGlzdCBmb3IgdGhlIHNhbWUgaGFzaCBidWNrZXQgKi8KKyNkZWZpbmUgSEFTSF9MSU1JVCA2NAorCisjZGVmaW5lIFJBQklOX1NISUZUIDIzCisjZGVmaW5lIFJBQklOX1dJTkRPVyAxNgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFRbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweGFiNTliNGQxLCAweDU2YjM2OWEyLCAweGZkZWFkZDczLCAweDA2M2Y2Nzk1LCAweGFkNjZkMzQ0LAorCTB4NTA4YzBlMzcsIDB4ZmJkNWJhZTYsIDB4MGM3ZWNmMmEsIDB4YTcyNzdiZmIsIDB4NWFjZGE2ODgsIDB4ZjE5NDEyNTksCisJMHgwYTQxYThiZiwgMHhhMTE4MWM2ZSwgMHg1Y2YyYzExZCwgMHhmN2FiNzVjYywgMHgxOGZkOWU1NCwgMHhiM2E0MmE4NSwKKwkweDRlNGVmN2Y2LCAweGU1MTc0MzI3LCAweDFlYzJmOWMxLCAweGI1OWI0ZDEwLCAweDQ4NzE5MDYzLCAweGUzMjgyNGIyLAorCTB4MTQ4MzUxN2UsIDB4YmZkYWU1YWYsIDB4NDIzMDM4ZGMsIDB4ZTk2OThjMGQsIDB4MTJiYzM2ZWIsIDB4YjllNTgyM2EsCisJMHg0NDBmNWY0OSwgMHhlZjU2ZWI5OCwgMHgzMWZiM2NhOCwgMHg5YWEyODg3OSwgMHg2NzQ4NTUwYSwgMHhjYzExZTFkYiwKKwkweDM3YzQ1YjNkLCAweDljOWRlZmVjLCAweDYxNzczMjlmLCAweGNhMmU4NjRlLCAweDNkODVmMzgyLCAweDk2ZGM0NzUzLAorCTB4NmIzNjlhMjAsIDB4YzA2ZjJlZjEsIDB4M2JiYTk0MTcsIDB4OTBlMzIwYzYsIDB4NmQwOWZkYjUsIDB4YzY1MDQ5NjQsCisJMHgyOTA2YTJmYywgMHg4MjVmMTYyZCwgMHg3ZmI1Y2I1ZSwgMHhkNGVjN2Y4ZiwgMHgyZjM5YzU2OSwgMHg4NDYwNzFiOCwKKwkweDc5OGFhY2NiLCAweGQyZDMxODFhLCAweDI1Nzg2ZGQ2LCAweDhlMjFkOTA3LCAweDczY2IwNDc0LCAweGQ4OTJiMGE1LAorCTB4MjM0NzBhNDMsIDB4ODgxZWJlOTIsIDB4NzVmNDYzZTEsIDB4ZGVhZGQ3MzAsIDB4NjNmNjc5NTAsIDB4YzhhZmNkODEsCisJMHgzNTQ1MTBmMiwgMHg5ZTFjYTQyMywgMHg2NWM5MWVjNSwgMHhjZTkwYWExNCwgMHgzMzdhNzc2NywgMHg5ODIzYzNiNiwKKwkweDZmODhiNjdhLCAweGM0ZDEwMmFiLCAweDM5M2JkZmQ4LCAweDkyNjI2YjA5LCAweDY5YjdkMWVmLCAweGMyZWU2NTNlLAorCTB4M2YwNGI4NGQsIDB4OTQ1ZDBjOWMsIDB4N2IwYmU3MDQsIDB4ZDA1MjUzZDUsIDB4MmRiODhlYTYsIDB4ODZlMTNhNzcsCisJMHg3ZDM0ODA5MSwgMHhkNjZkMzQ0MCwgMHgyYjg3ZTkzMywgMHg4MGRlNWRlMiwgMHg3Nzc1MjgyZSwgMHhkYzJjOWNmZiwKKwkweDIxYzY0MThjLCAweDhhOWZmNTVkLCAweDcxNGE0ZmJiLCAweGRhMTNmYjZhLCAweDI3ZjkyNjE5LCAweDhjYTA5MmM4LAorCTB4NTIwZDQ1ZjgsIDB4Zjk1NGYxMjksIDB4MDRiZTJjNWEsIDB4YWZlNzk4OGIsIDB4NTQzMjIyNmQsIDB4ZmY2Yjk2YmMsCisJMHgwMjgxNGJjZiwgMHhhOWQ4ZmYxZSwgMHg1ZTczOGFkMiwgMHhmNTJhM2UwMywgMHgwOGMwZTM3MCwgMHhhMzk5NTdhMSwKKwkweDU4NGNlZDQ3LCAweGYzMTU1OTk2LCAweDBlZmY4NGU1LCAweGE1YTYzMDM0LCAweDRhZjBkYmFjLCAweGUxYTk2ZjdkLAorCTB4MWM0M2IyMGUsIDB4YjcxYTA2ZGYsIDB4NGNjZmJjMzksIDB4ZTc5NjA4ZTgsIDB4MWE3Y2Q1OWIsIDB4YjEyNTYxNGEsCisJMHg0NjhlMTQ4NiwgMHhlZGQ3YTA1NywgMHgxMDNkN2QyNCwgMHhiYjY0YzlmNSwgMHg0MGIxNzMxMywgMHhlYmU4YzdjMiwKKwkweDE2MDIxYWIxLCAweGJkNWJhZTYwLCAweDZjYjU0NjcxLCAweGM3ZWNmMmEwLCAweDNhMDYyZmQzLCAweDkxNWY5YjAyLAorCTB4NmE4YTIxZTQsIDB4YzFkMzk1MzUsIDB4M2MzOTQ4NDYsIDB4OTc2MGZjOTcsIDB4NjBjYjg5NWIsIDB4Y2I5MjNkOGEsCisJMHgzNjc4ZTBmOSwgMHg5ZDIxNTQyOCwgMHg2NmY0ZWVjZSwgMHhjZGFkNWExZiwgMHgzMDQ3ODc2YywgMHg5YjFlMzNiZCwKKwkweDc0NDhkODI1LCAweGRmMTE2Y2Y0LCAweDIyZmJiMTg3LCAweDg5YTIwNTU2LCAweDcyNzdiZmIwLCAweGQ5MmUwYjYxLAorCTB4MjRjNGQ2MTIsIDB4OGY5ZDYyYzMsIDB4NzgzNjE3MGYsIDB4ZDM2ZmEzZGUsIDB4MmU4NTdlYWQsIDB4ODVkY2NhN2MsCisJMHg3ZTA5NzA5YSwgMHhkNTUwYzQ0YiwgMHgyOGJhMTkzOCwgMHg4M2UzYWRlOSwgMHg1ZDRlN2FkOSwgMHhmNjE3Y2UwOCwKKwkweDBiZmQxMzdiLCAweGEwYTRhN2FhLCAweDViNzExZDRjLCAweGYwMjhhOTlkLCAweDBkYzI3NGVlLCAweGE2OWJjMDNmLAorCTB4NTEzMGI1ZjMsIDB4ZmE2OTAxMjIsIDB4MDc4M2RjNTEsIDB4YWNkYTY4ODAsIDB4NTcwZmQyNjYsIDB4ZmM1NjY2YjcsCisJMHgwMWJjYmJjNCwgMHhhYWU1MGYxNSwgMHg0NWIzZTQ4ZCwgMHhlZWVhNTA1YywgMHgxMzAwOGQyZiwgMHhiODU5MzlmZSwKKwkweDQzOGM4MzE4LCAweGU4ZDUzN2M5LCAweDE1M2ZlYWJhLCAweGJlNjY1ZTZiLCAweDQ5Y2QyYmE3LCAweGUyOTQ5Zjc2LAorCTB4MWY3ZTQyMDUsIDB4YjQyN2Y2ZDQsIDB4NGZmMjRjMzIsIDB4ZTRhYmY4ZTMsIDB4MTk0MTI1OTAsIDB4YjIxODkxNDEsCisJMHgwZjQzM2YyMSwgMHhhNDFhOGJmMCwgMHg1OWYwNTY4MywgMHhmMmE5ZTI1MiwgMHgwOTdjNThiNCwgMHhhMjI1ZWM2NSwKKwkweDVmY2YzMTE2LCAweGY0OTY4NWM3LCAweDAzM2RmMDBiLCAweGE4NjQ0NGRhLCAweDU1OGU5OWE5LCAweGZlZDcyZDc4LAorCTB4MDUwMjk3OWUsIDB4YWU1YjIzNGYsIDB4NTNiMWZlM2MsIDB4ZjhlODRhZWQsIDB4MTdiZWExNzUsIDB4YmNlNzE1YTQsCisJMHg0MTBkYzhkNywgMHhlYTU0N2MwNiwgMHgxMTgxYzZlMCwgMHhiYWQ4NzIzMSwgMHg0NzMyYWY0MiwgMHhlYzZiMWI5MywKKwkweDFiYzA2ZTVmLCAweGIwOTlkYThlLCAweDRkNzMwN2ZkLCAweGU2MmFiMzJjLCAweDFkZmYwOWNhLCAweGI2YTZiZDFiLAorCTB4NGI0YzYwNjgsIDB4ZTAxNWQ0YjksIDB4M2ViODAzODksIDB4OTVlMWI3NTgsIDB4NjgwYjZhMmIsIDB4YzM1MmRlZmEsCisJMHgzODg3NjQxYywgMHg5M2RlZDBjZCwgMHg2ZTM0MGRiZSwgMHhjNTZkYjk2ZiwgMHgzMmM2Y2NhMywgMHg5OTlmNzg3MiwKKwkweDY0NzVhNTAxLCAweGNmMmMxMWQwLCAweDM0ZjlhYjM2LCAweDlmYTAxZmU3LCAweDYyNGFjMjk0LCAweGM5MTM3NjQ1LAorCTB4MjY0NTlkZGQsIDB4OGQxYzI5MGMsIDB4NzBmNmY0N2YsIDB4ZGJhZjQwYWUsIDB4MjA3YWZhNDgsIDB4OGIyMzRlOTksCisJMHg3NmM5OTNlYSwgMHhkZDkwMjczYiwgMHgyYTNiNTJmNywgMHg4MTYyZTYyNiwgMHg3Yzg4M2I1NSwgMHhkN2QxOGY4NCwKKwkweDJjMDQzNTYyLCAweDg3NWQ4MWIzLCAweDdhYjc1Y2MwLCAweGQxZWVlODExCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFVbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweDdlYjUyMDBkLCAweDU2MzNmNGNiLCAweDI4ODZkNGM2LCAweDA3M2U1ZDQ3LCAweDc5OGI3ZDRhLAorCTB4NTEwZGE5OGMsIDB4MmZiODg5ODEsIDB4MGU3Y2JhOGUsIDB4NzBjOTlhODMsIDB4NTg0ZjRlNDUsIDB4MjZmYTZlNDgsCisJMHgwOTQyZTdjOSwgMHg3N2Y3YzdjNCwgMHg1ZjcxMTMwMiwgMHgyMWM0MzMwZiwgMHgxY2Y5NzUxYywgMHg2MjRjNTUxMSwKKwkweDRhY2E4MWQ3LCAweDM0N2ZhMWRhLCAweDFiYzcyODViLCAweDY1NzIwODU2LCAweDRkZjRkYzkwLCAweDMzNDFmYzlkLAorCTB4MTI4NWNmOTIsIDB4NmMzMGVmOWYsIDB4NDRiNjNiNTksIDB4M2EwMzFiNTQsIDB4MTViYjkyZDUsIDB4NmIwZWIyZDgsCisJMHg0Mzg4NjYxZSwgMHgzZDNkNDYxMywgMHgzOWYyZWEzOCwgMHg0NzQ3Y2EzNSwgMHg2ZmMxMWVmMywgMHgxMTc0M2VmZSwKKwkweDNlY2NiNzdmLCAweDQwNzk5NzcyLCAweDY4ZmY0M2I0LCAweDE2NGE2M2I5LCAweDM3OGU1MGI2LCAweDQ5M2I3MGJiLAorCTB4NjFiZGE0N2QsIDB4MWYwODg0NzAsIDB4MzBiMDBkZjEsIDB4NGUwNTJkZmMsIDB4NjY4M2Y5M2EsIDB4MTgzNmQ5MzcsCisJMHgyNTBiOWYyNCwgMHg1YmJlYmYyOSwgMHg3MzM4NmJlZiwgMHgwZDhkNGJlMiwgMHgyMjM1YzI2MywgMHg1YzgwZTI2ZSwKKwkweDc0MDYzNmE4LCAweDBhYjMxNmE1LCAweDJiNzcyNWFhLCAweDU1YzIwNWE3LCAweDdkNDRkMTYxLCAweDAzZjFmMTZjLAorCTB4MmM0OTc4ZWQsIDB4NTJmYzU4ZTAsIDB4N2E3YThjMjYsIDB4MDRjZmFjMmIsIDB4NzNlNWQ0NzAsIDB4MGQ1MGY0N2QsCisJMHgyNWQ2MjBiYiwgMHg1YjYzMDBiNiwgMHg3NGRiODkzNywgMHgwYTZlYTkzYSwgMHgyMmU4N2RmYywgMHg1YzVkNWRmMSwKKwkweDdkOTk2ZWZlLCAweDAzMmM0ZWYzLCAweDJiYWE5YTM1LCAweDU1MWZiYTM4LCAweDdhYTczM2I5LCAweDA0MTIxM2I0LAorCTB4MmM5NGM3NzIsIDB4NTIyMWU3N2YsIDB4NmYxY2ExNmMsIDB4MTFhOTgxNjEsIDB4MzkyZjU1YTcsIDB4NDc5YTc1YWEsCisJMHg2ODIyZmMyYiwgMHgxNjk3ZGMyNiwgMHgzZTExMDhlMCwgMHg0MGE0MjhlZCwgMHg2MTYwMWJlMiwgMHgxZmQ1M2JlZiwKKwkweDM3NTNlZjI5LCAweDQ5ZTZjZjI0LCAweDY2NWU0NmE1LCAweDE4ZWI2NmE4LCAweDMwNmRiMjZlLCAweDRlZDg5MjYzLAorCTB4NGExNzNlNDgsIDB4MzRhMjFlNDUsIDB4MWMyNGNhODMsIDB4NjI5MWVhOGUsIDB4NGQyOTYzMGYsIDB4MzM5YzQzMDIsCisJMHgxYjFhOTdjNCwgMHg2NWFmYjdjOSwgMHg0NDZiODRjNiwgMHgzYWRlYTRjYiwgMHgxMjU4NzAwZCwgMHg2Y2VkNTAwMCwKKwkweDQzNTVkOTgxLCAweDNkZTBmOThjLCAweDE1NjYyZDRhLCAweDZiZDMwZDQ3LCAweDU2ZWU0YjU0LCAweDI4NWI2YjU5LAorCTB4MDBkZGJmOWYsIDB4N2U2ODlmOTIsIDB4NTFkMDE2MTMsIDB4MmY2NTM2MWUsIDB4MDdlM2UyZDgsIDB4Nzk1NmMyZDUsCisJMHg1ODkyZjFkYSwgMHgyNjI3ZDFkNywgMHgwZWExMDUxMSwgMHg3MDE0MjUxYywgMHg1ZmFjYWM5ZCwgMHgyMTE5OGM5MCwKKwkweDA5OWY1ODU2LCAweDc3MmE3ODViLCAweDRjOTIxYzMxLCAweDMyMjczYzNjLCAweDFhYTFlOGZhLCAweDY0MTRjOGY3LAorCTB4NGJhYzQxNzYsIDB4MzUxOTYxN2IsIDB4MWQ5ZmI1YmQsIDB4NjMyYTk1YjAsIDB4NDJlZWE2YmYsIDB4M2M1Yjg2YjIsCisJMHgxNGRkNTI3NCwgMHg2YTY4NzI3OSwgMHg0NWQwZmJmOCwgMHgzYjY1ZGJmNSwgMHgxM2UzMGYzMywgMHg2ZDU2MmYzZSwKKwkweDUwNmI2OTJkLCAweDJlZGU0OTIwLCAweDA2NTg5ZGU2LCAweDc4ZWRiZGViLCAweDU3NTUzNDZhLCAweDI5ZTAxNDY3LAorCTB4MDE2NmMwYTEsIDB4N2ZkM2UwYWMsIDB4NWUxN2QzYTMsIDB4MjBhMmYzYWUsIDB4MDgyNDI3NjgsIDB4NzY5MTA3NjUsCisJMHg1OTI5OGVlNCwgMHgyNzljYWVlOSwgMHgwZjFhN2EyZiwgMHg3MWFmNWEyMiwgMHg3NTYwZjYwOSwgMHgwYmQ1ZDYwNCwKKwkweDIzNTMwMmMyLCAweDVkZTYyMmNmLCAweDcyNWVhYjRlLCAweDBjZWI4YjQzLCAweDI0NmQ1Zjg1LCAweDVhZDg3Zjg4LAorCTB4N2IxYzRjODcsIDB4MDVhOTZjOGEsIDB4MmQyZmI4NGMsIDB4NTM5YTk4NDEsIDB4N2MyMjExYzAsIDB4MDI5NzMxY2QsCisJMHgyYTExZTUwYiwgMHg1NGE0YzUwNiwgMHg2OTk5ODMxNSwgMHgxNzJjYTMxOCwgMHgzZmFhNzdkZSwgMHg0MTFmNTdkMywKKwkweDZlYTdkZTUyLCAweDEwMTJmZTVmLCAweDM4OTQyYTk5LCAweDQ2MjEwYTk0LCAweDY3ZTUzOTliLCAweDE5NTAxOTk2LAorCTB4MzFkNmNkNTAsIDB4NGY2M2VkNWQsIDB4NjBkYjY0ZGMsIDB4MWU2ZTQ0ZDEsIDB4MzZlODkwMTcsIDB4NDg1ZGIwMWEsCisJMHgzZjc3Yzg0MSwgMHg0MWMyZTg0YywgMHg2OTQ0M2M4YSwgMHgxN2YxMWM4NywgMHgzODQ5OTUwNiwgMHg0NmZjYjUwYiwKKwkweDZlN2E2MWNkLCAweDEwY2Y0MWMwLCAweDMxMGI3MmNmLCAweDRmYmU1MmMyLCAweDY3Mzg4NjA0LCAweDE5OGRhNjA5LAorCTB4MzYzNTJmODgsIDB4NDg4MDBmODUsIDB4NjAwNmRiNDMsIDB4MWViM2ZiNGUsIDB4MjM4ZWJkNWQsIDB4NWQzYjlkNTAsCisJMHg3NWJkNDk5NiwgMHgwYjA4Njk5YiwgMHgyNGIwZTAxYSwgMHg1YTA1YzAxNywgMHg3MjgzMTRkMSwgMHgwYzM2MzRkYywKKwkweDJkZjIwN2QzLCAweDUzNDcyN2RlLCAweDdiYzFmMzE4LCAweDA1NzRkMzE1LCAweDJhY2M1YTk0LCAweDU0Nzk3YTk5LAorCTB4N2NmZmFlNWYsIDB4MDI0YThlNTIsIDB4MDY4NTIyNzksIDB4NzgzMDAyNzQsIDB4NTBiNmQ2YjIsIDB4MmUwM2Y2YmYsCisJMHgwMWJiN2YzZSwgMHg3ZjBlNWYzMywgMHg1Nzg4OGJmNSwgMHgyOTNkYWJmOCwgMHgwOGY5OThmNywgMHg3NjRjYjhmYSwKKwkweDVlY2E2YzNjLCAweDIwN2Y0YzMxLCAweDBmYzdjNWIwLCAweDcxNzJlNWJkLCAweDU5ZjQzMTdiLCAweDI3NDExMTc2LAorCTB4MWE3YzU3NjUsIDB4NjRjOTc3NjgsIDB4NGM0ZmEzYWUsIDB4MzJmYTgzYTMsIDB4MWQ0MjBhMjIsIDB4NjNmNzJhMmYsCisJMHg0YjcxZmVlOSwgMHgzNWM0ZGVlNCwgMHgxNDAwZWRlYiwgMHg2YWI1Y2RlNiwgMHg0MjMzMTkyMCwgMHgzYzg2MzkyZCwKKwkweDEzM2ViMGFjLCAweDZkOGI5MGExLCAweDQ1MGQ0NDY3LCAweDNiYjg2NDZhCit9OworCitzdHJ1Y3QgaW5kZXhfZW50cnkgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXN0cnVjdCBpbmRleF9lbnRyeSAqbmV4dDsKK307CisKK3N0cnVjdCBkZWx0YV9pbmRleCB7CisJY29uc3Qgdm9pZCAqc3JjX2J1ZjsKKwl1bnNpZ25lZCBsb25nIHNyY19zaXplOworCXVuc2lnbmVkIGludCBoYXNoX21hc2s7CisJc3RydWN0IGluZGV4X2VudHJ5ICpoYXNoW0ZMRVhfQVJSQVldOworfTsKKworc3RydWN0IGRlbHRhX2luZGV4ICogY3JlYXRlX2RlbHRhX2luZGV4KGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplKQoreworCXVuc2lnbmVkIGludCBpLCBoc2l6ZSwgaG1hc2ssIGVudHJpZXMsIHByZXZfdmFsLCAqaGFzaF9jb3VudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCAqYnVmZmVyID0gYnVmOworCXN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXg7CisJc3RydWN0IGluZGV4X2VudHJ5ICplbnRyeSwgKipoYXNoOworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIG1lbXNpemU7CisKKwlpZiAoIWJ1ZiB8fCAhYnVmc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBEZXRlcm1pbmUgaW5kZXggaGFzaCBzaXplLiAgTm90ZSB0aGF0IGluZGV4aW5nIHNraXBzIHRoZQorCSAgIGZpcnN0IGJ5dGUgdG8gYWxsb3cgZm9yIG9wdGltaXppbmcgdGhlIFJhYmluJ3MgcG9seW5vbWlhbAorCSAgIGluaXRpYWxpemF0aW9uIGluIGNyZWF0ZV9kZWx0YSgpLiAqLworCWVudHJpZXMgPSAoYnVmc2l6ZSAtIDEpICAvIFJBQklOX1dJTkRPVzsKKwloc2l6ZSA9IGVudHJpZXMgLyA0OworCWZvciAoaSA9IDQ7ICgxdSA8PCBpKSA8IGhzaXplICYmIGkgPCAzMTsgaSsrKTsKKwloc2l6ZSA9IDEgPDwgaTsKKwlobWFzayA9IGhzaXplIC0gMTsKKworCS8qIGFsbG9jYXRlIGxvb2t1cCBpbmRleCAqLworCW1lbXNpemUgPSBzaXplb2YoKmluZGV4KSArCisJCSAgc2l6ZW9mKCpoYXNoKSAqIGhzaXplICsKKwkJICBzaXplb2YoKmVudHJ5KSAqIGVudHJpZXM7CisJbWVtID0gbWFsbG9jKG1lbXNpemUpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwlpbmRleCA9IG1lbTsKKwltZW0gPSBpbmRleCArIDE7CisJaGFzaCA9IG1lbTsKKwltZW0gPSBoYXNoICsgaHNpemU7CisJZW50cnkgPSBtZW07CisKKwlpbmRleC0+c3JjX2J1ZiA9IGJ1ZjsKKwlpbmRleC0+c3JjX3NpemUgPSBidWZzaXplOworCWluZGV4LT5oYXNoX21hc2sgPSBobWFzazsKKwltZW1zZXQoaGFzaCwgMCwgaHNpemUgKiBzaXplb2YoKmhhc2gpKTsKKworCS8qIGFsbG9jYXRlIGFuIGFycmF5IHRvIGNvdW50IGhhc2ggZW50cmllcyAqLworCWhhc2hfY291bnQgPSBjYWxsb2MoaHNpemUsIHNpemVvZigqaGFzaF9jb3VudCkpOworCWlmICghaGFzaF9jb3VudCkgeworCQlmcmVlKGluZGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogdGhlbiBwb3B1bGF0ZSB0aGUgaW5kZXggKi8KKwlwcmV2X3ZhbCA9IH4wOworCWZvciAoZGF0YSA9IGJ1ZmZlciArIGVudHJpZXMgKiBSQUJJTl9XSU5ET1cgLSBSQUJJTl9XSU5ET1c7CisJICAgICBkYXRhID49IGJ1ZmZlcjsKKwkgICAgIGRhdGEgLT0gUkFCSU5fV0lORE9XKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAwOworCQlmb3IgKGkgPSAxOyBpIDw9IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJdmFsID0gKCh2YWwgPDwgOCkgfCBkYXRhW2ldKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJaWYgKHZhbCA9PSBwcmV2X3ZhbCkgeworCQkJLyoga2VlcCB0aGUgbG93ZXN0IG9mIGNvbnNlY3V0aXZlIGlkZW50aWNhbCBibG9ja3MgKi8KKwkJCWVudHJ5Wy0xXS5wdHIgPSBkYXRhICsgUkFCSU5fV0lORE9XOworCQl9IGVsc2UgeworCQkJcHJldl92YWwgPSB2YWw7CisJCQlpID0gdmFsICYgaG1hc2s7CisJCQllbnRyeS0+cHRyID0gZGF0YSArIFJBQklOX1dJTkRPVzsKKwkJCWVudHJ5LT52YWwgPSB2YWw7CisJCQllbnRyeS0+bmV4dCA9IGhhc2hbaV07CisJCQloYXNoW2ldID0gZW50cnkrKzsKKwkJCWhhc2hfY291bnRbaV0rKzsKKwkJfQorCX0KKworCS8qCisJICogRGV0ZXJtaW5lIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzYW1lIGhhc2gKKwkgKiBidWNrZXQuICBUaGlzIGd1YXJkcyB1cyBhZ2FpbnN0IHBhdGhvbG9naWNhbCBkYXRhIHNldHMgY2F1c2luZworCSAqIHJlYWxseSBiYWQgaGFzaCBkaXN0cmlidXRpb24gd2l0aCBtb3N0IGVudHJpZXMgaW4gdGhlIHNhbWUgaGFzaAorCSAqIGJ1Y2tldCB0aGF0IHdvdWxkIGJyaW5nIHVzIHRvIE8obSpuKSBjb21wdXRpbmcgY29zdHMgKG0gYW5kIG4KKwkgKiBjb3JyZXNwb25kaW5nIHRvIHJlZmVyZW5jZSBhbmQgdGFyZ2V0IGJ1ZmZlciBzaXplcykuCisJICoKKwkgKiBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgaGFzaCBidWNrZXRzIGhhcyBtb3JlIGVudHJpZXMgdGhhbgorCSAqIHdlJ3JlIHdpbGxpbmcgdG8gdGVzdC4gIE90aGVyd2lzZSB3ZSBjdWxsIHRoZSBlbnRyeSBsaXN0CisJICogdW5pZm9ybWx5IHRvIHN0aWxsIHByZXNlcnZlIGEgZ29vZCByZXBhcnRpdGlvbiBhY3Jvc3MKKwkgKiB0aGUgcmVmZXJlbmNlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQlpZiAoaGFzaF9jb3VudFtpXSA8IEhBU0hfTElNSVQpCisJCQljb250aW51ZTsKKwkJZW50cnkgPSBoYXNoW2ldOworCQlkbyB7CisJCQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmtlZXAgPSBlbnRyeTsKKwkJCWludCBza2lwID0gaGFzaF9jb3VudFtpXSAvIEhBU0hfTElNSVQgLyAyOworCQkJZG8geworCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQl9IHdoaWxlKC0tc2tpcCAmJiBlbnRyeSk7CisJCQlrZWVwLT5uZXh0ID0gZW50cnk7CisJCX0gd2hpbGUoZW50cnkpOworCX0KKwlmcmVlKGhhc2hfY291bnQpOworCisJcmV0dXJuIGluZGV4OworfQorCit2b2lkIGZyZWVfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCkKK3sKKwlmcmVlKGluZGV4KTsKK30KKworLyoKKyAqIFRoZSBtYXhpbXVtIHNpemUgZm9yIGFueSBvcGNvZGUgc2VxdWVuY2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBoZWFkZXIKKyAqIHBsdXMgUmFiaW4gd2luZG93IHBsdXMgYmlnZ2VzdCBjb3B5LgorICovCisjZGVmaW5lIE1BWF9PUF9TSVpFCSg1ICsgNSArIDEgKyBSQUJJTl9XSU5ET1cgKyA3KQorCit2b2lkICoKK2NyZWF0ZV9kZWx0YShjb25zdCBzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4LAorCSAgICAgY29uc3Qgdm9pZCAqdHJnX2J1ZiwgdW5zaWduZWQgbG9uZyB0cmdfc2l6ZSwKKwkgICAgIHVuc2lnbmVkIGxvbmcgKmRlbHRhX3NpemUsIHVuc2lnbmVkIGxvbmcgbWF4X3NpemUpCit7CisJdW5zaWduZWQgaW50IGksIG91dHBvcywgb3V0c2l6ZSwgdmFsOworCWludCBpbnNjbnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX2RhdGEsICpyZWZfdG9wLCAqZGF0YSwgKnRvcDsKKwl1bnNpZ25lZCBjaGFyICpvdXQ7CisKKwlpZiAoIXRyZ19idWYgfHwgIXRyZ19zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCW91dHBvcyA9IDA7CisJb3V0c2l6ZSA9IDgxOTI7CisJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCW91dHNpemUgPSBtYXhfc2l6ZSArIE1BWF9PUF9TSVpFICsgMTsKKwlvdXQgPSBtYWxsb2Mob3V0c2l6ZSk7CisJaWYgKCFvdXQpCisJCXJldHVybiBOVUxMOworCisJLyogc3RvcmUgcmVmZXJlbmNlIGJ1ZmZlciBzaXplICovCisJaSA9IGluZGV4LT5zcmNfc2l6ZTsKKwl3aGlsZSAoaSA+PSAweDgwKSB7CisJCW91dFtvdXRwb3MrK10gPSBpIHwgMHg4MDsKKwkJaSA+Pj0gNzsKKwl9CisJb3V0W291dHBvcysrXSA9IGk7CisKKwkvKiBzdG9yZSB0YXJnZXQgYnVmZmVyIHNpemUgKi8KKwlpID0gdHJnX3NpemU7CisJd2hpbGUgKGkgPj0gMHg4MCkgeworCQlvdXRbb3V0cG9zKytdID0gaSB8IDB4ODA7CisJCWkgPj49IDc7CisJfQorCW91dFtvdXRwb3MrK10gPSBpOworCisJcmVmX2RhdGEgPSBpbmRleC0+c3JjX2J1ZjsKKwlyZWZfdG9wID0gcmVmX2RhdGEgKyBpbmRleC0+c3JjX3NpemU7CisJZGF0YSA9IHRyZ19idWY7CisJdG9wID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdHJnX2J1ZiArIHRyZ19zaXplOworCisJb3V0cG9zKys7CisJdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUkFCSU5fV0lORE9XICYmIGRhdGEgPCB0b3A7IGkrKywgZGF0YSsrKSB7CisJCW91dFtvdXRwb3MrK10gPSAqZGF0YTsKKwkJdmFsID0gKCh2YWwgPDwgOCkgfCAqZGF0YSkgXiBUW3ZhbCA+PiBSQUJJTl9TSElGVF07CisJfQorCWluc2NudCA9IGk7CisKKwl3aGlsZSAoZGF0YSA8IHRvcCkgeworCQl1bnNpZ25lZCBpbnQgbW9mZiA9IDAsIG1zaXplID0gMDsKKwkJc3RydWN0IGluZGV4X2VudHJ5ICplbnRyeTsKKwkJdmFsIF49IFVbZGF0YVstUkFCSU5fV0lORE9XXV07CisJCXZhbCA9ICgodmFsIDw8IDgpIHwgKmRhdGEpIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQlpID0gdmFsICYgaW5kZXgtPmhhc2hfbWFzazsKKwkJZm9yIChlbnRyeSA9IGluZGV4LT5oYXNoW2ldOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmID0gZW50cnktPnB0cjsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IGRhdGE7CisJCQl1bnNpZ25lZCBpbnQgcmVmX3NpemUgPSByZWZfdG9wIC0gcmVmOworCQkJaWYgKGVudHJ5LT52YWwgIT0gdmFsKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlZl9zaXplID4gdG9wIC0gc3JjKQorCQkJCXJlZl9zaXplID0gdG9wIC0gc3JjOworCQkJaWYgKHJlZl9zaXplID4gMHgxMDAwMCkKKwkJCQlyZWZfc2l6ZSA9IDB4MTAwMDA7CisJCQlpZiAocmVmX3NpemUgPD0gbXNpemUpCisJCQkJYnJlYWs7CisJCQl3aGlsZSAocmVmX3NpemUtLSAmJiAqc3JjKysgPT0gKnJlZikKKwkJCQlyZWYrKzsKKwkJCWlmIChtc2l6ZSA8IHJlZiAtIGVudHJ5LT5wdHIpIHsKKwkJCQkvKiB0aGlzIGlzIG91ciBiZXN0IG1hdGNoIHNvIGZhciAqLworCQkJCW1zaXplID0gcmVmIC0gZW50cnktPnB0cjsKKwkJCQltb2ZmID0gZW50cnktPnB0ciAtIHJlZl9kYXRhOworCQkJfQorCQl9CisKKwkJaWYgKG1zaXplIDwgNCkgeworCQkJaWYgKCFpbnNjbnQpCisJCQkJb3V0cG9zKys7CisJCQlvdXRbb3V0cG9zKytdID0gKmRhdGErKzsKKwkJCWluc2NudCsrOworCQkJaWYgKGluc2NudCA9PSAweDdmKSB7CisJCQkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCQkJCWluc2NudCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyICpvcDsKKworCQkJaWYgKG1zaXplID49IFJBQklOX1dJTkRPVykgeworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNrOworCQkJCXNrID0gZGF0YSArIG1zaXplIC0gUkFCSU5fV0lORE9XOworCQkJCXZhbCA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJCQl2YWwgPSAoKHZhbCA8PCA4KSB8ICpzaysrKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJCX0gZWxzZSB7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2sgPSBkYXRhICsgMTsKKwkJCQlmb3IgKGkgPSAxOyBpIDwgbXNpemU7IGkrKykgeworCQkJCQl2YWwgXj0gVVtza1stUkFCSU5fV0lORE9XXV07CisJCQkJCXZhbCA9ICgodmFsIDw8IDgpIHwgKnNrKyspIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluc2NudCkgeworCQkJCXdoaWxlIChtb2ZmICYmIHJlZl9kYXRhW21vZmYtMV0gPT0gZGF0YVstMV0pIHsKKwkJCQkJaWYgKG1zaXplID09IDB4MTAwMDApCisJCQkJCQlicmVhazsKKwkJCQkJLyogd2UgY2FuIG1hdGNoIG9uZSBieXRlIGJhY2sgKi8KKwkJCQkJbXNpemUrKzsKKwkJCQkJbW9mZi0tOworCQkJCQlkYXRhLS07CisJCQkJCW91dHBvcy0tOworCQkJCQlpZiAoLS1pbnNjbnQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJb3V0cG9zLS07ICAvKiByZW1vdmUgY291bnQgc2xvdCAqLworCQkJCQlpbnNjbnQtLTsgIC8qIG1ha2UgaXQgLTEgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW91dFtvdXRwb3MgLSBpbnNjbnQgLSAxXSA9IGluc2NudDsKKwkJCQlpbnNjbnQgPSAwOworCQkJfQorCisJCQlkYXRhICs9IG1zaXplOworCQkJb3AgPSBvdXQgKyBvdXRwb3MrKzsKKwkJCWkgPSAweDgwOworCisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwMTsgfQorCQkJbW9mZiA+Pj0gODsKKwkJCWlmIChtb2ZmICYgMHhmZikgeyBvdXRbb3V0cG9zKytdID0gbW9mZjsgaSB8PSAweDAyOyB9CisJCQltb2ZmID4+PSA4OworCQkJaWYgKG1vZmYgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtb2ZmOyBpIHw9IDB4MDQ7IH0KKwkJCW1vZmYgPj49IDg7CisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwODsgfQorCisJCQlpZiAobXNpemUgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtc2l6ZTsgaSB8PSAweDEwOyB9CisJCQltc2l6ZSA+Pj0gODsKKwkJCWlmIChtc2l6ZSAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1zaXplOyBpIHw9IDB4MjA7IH0KKworCQkJKm9wID0gaTsKKwkJfQorCisJCWlmIChvdXRwb3MgPj0gb3V0c2l6ZSAtIE1BWF9PUF9TSVpFKSB7CisJCQl2b2lkICp0bXAgPSBvdXQ7CisJCQlvdXRzaXplID0gb3V0c2l6ZSAqIDMgLyAyOworCQkJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCQkJb3V0c2l6ZSA9IG1heF9zaXplICsgTUFYX09QX1NJWkUgKyAxOworCQkJaWYgKG1heF9zaXplICYmIG91dHBvcyA+IG1heF9zaXplKQorCQkJCWJyZWFrOworCQkJb3V0ID0geHJlYWxsb2Mob3V0LCBvdXRzaXplKTsKKwkJCWlmICghb3V0KSB7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJfQorCisJaWYgKGluc2NudCkKKwkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCisJaWYgKG1heF9zaXplICYmIG91dHBvcyA+IG1heF9zaXplKSB7CisJCWZyZWUob3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmRlbHRhX3NpemUgPSBvdXRwb3M7CisJcmV0dXJuIG91dDsKK30KZGlmZiAtLWdpdCBhL2RpZmYtbGliLmMgYi9kaWZmLWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjRlODEKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmLWxpYi5jCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKKy8qCisgKiBkaWZmLWZpbGVzCisgKi8KKworc3RhdGljIGludCByZWFkX2RpcmVjdG9yeShjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmU7CisKKwlpZiAoIShkaXIgPSBvcGVuZGlyKHBhdGgpKSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgb3BlbiBkaXJlY3RvcnkgJXMiLCBwYXRoKTsKKworCXdoaWxlICgoZSA9IHJlYWRkaXIoZGlyKSkpCisJCWlmIChzdHJjbXAoIi4iLCBlLT5kX25hbWUpICYmIHN0cmNtcCgiLi4iLCBlLT5kX25hbWUpKQorCQkJcGF0aF9saXN0X2luc2VydCh4c3RyZHVwKGUtPmRfbmFtZSksIGxpc3QpOworCisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbW9kZShjb25zdCBjaGFyICpwYXRoLCBpbnQgKm1vZGUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoIXBhdGggfHwgIXN0cmNtcChwYXRoLCAiL2Rldi9udWxsIikpCisJCSptb2RlID0gMDsKKwllbHNlIGlmICghc3RyY21wKHBhdGgsICItIikpCisJCSptb2RlID0gbnRvaGwoY3JlYXRlX2NlX21vZGUoMDY2NikpOworCWVsc2UgaWYgKHN0YXQocGF0aCwgJnN0KSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgYWNjZXNzICclcyciLCBwYXRoKTsKKwllbHNlCisJCSptb2RlID0gc3Quc3RfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWV1ZV9kaWZmKHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCWNvbnN0IGNoYXIgKm5hbWUxLCBjb25zdCBjaGFyICpuYW1lMikKK3sKKwlpbnQgbW9kZTEgPSAwLCBtb2RlMiA9IDA7CisKKwlpZiAoZ2V0X21vZGUobmFtZTEsICZtb2RlMSkgfHwgZ2V0X21vZGUobmFtZTIsICZtb2RlMikpCisJCXJldHVybiAtMTsKKworCWlmIChtb2RlMSAmJiBtb2RlMiAmJiBTX0lTRElSKG1vZGUxKSAhPSBTX0lTRElSKG1vZGUyKSkKKwkJcmV0dXJuIGVycm9yKCJmaWxlL2RpcmVjdG9yeSBjb25mbGljdDogJXMsICVzIiwgbmFtZTEsIG5hbWUyKTsKKworCWlmIChTX0lTRElSKG1vZGUxKSB8fCBTX0lTRElSKG1vZGUyKSkgeworCQljaGFyIGJ1ZmZlcjFbUEFUSF9NQVhdLCBidWZmZXIyW1BBVEhfTUFYXTsKKwkJc3RydWN0IHBhdGhfbGlzdCBwMSA9IHtOVUxMLCAwLCAwLCAxfSwgcDIgPSB7TlVMTCwgMCwgMCwgMX07CisJCWludCBsZW4xID0gMCwgbGVuMiA9IDAsIGkxLCBpMiwgcmV0ID0gMDsKKworCQlpZiAobmFtZTEgJiYgcmVhZF9kaXJlY3RvcnkobmFtZTEsICZwMSkpCisJCQlyZXR1cm4gLTE7CisJCWlmIChuYW1lMiAmJiByZWFkX2RpcmVjdG9yeShuYW1lMiwgJnAyKSkgeworCQkJcGF0aF9saXN0X2NsZWFyKCZwMSwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAobmFtZTEpIHsKKwkJCWxlbjEgPSBzdHJsZW4obmFtZTEpOworCQkJaWYgKGxlbjEgPiAwICYmIG5hbWUxW2xlbjEgLSAxXSA9PSAnLycpCisJCQkJbGVuMS0tOworCQkJbWVtY3B5KGJ1ZmZlcjEsIG5hbWUxLCBsZW4xKTsKKwkJCWJ1ZmZlcjFbbGVuMSsrXSA9ICcvJzsKKwkJfQorCisJCWlmIChuYW1lMikgeworCQkJbGVuMiA9IHN0cmxlbihuYW1lMik7CisJCQlpZiAobGVuMiA+IDAgJiYgbmFtZTJbbGVuMiAtIDFdID09ICcvJykKKwkJCQlsZW4yLS07CisJCQltZW1jcHkoYnVmZmVyMiwgbmFtZTIsIGxlbjIpOworCQkJYnVmZmVyMltsZW4yKytdID0gJy8nOworCQl9CisKKwkJZm9yIChpMSA9IGkyID0gMDsgIXJldCAmJiAoaTEgPCBwMS5uciB8fCBpMiA8IHAyLm5yKTsgKSB7CisJCQljb25zdCBjaGFyICpuMSwgKm4yOworCQkJaW50IGNvbXA7CisKKwkJCWlmIChpMSA9PSBwMS5ucikKKwkJCQljb21wID0gMTsKKwkJCWVsc2UgaWYgKGkyID09IHAyLm5yKQorCQkJCWNvbXAgPSAtMTsKKwkJCWVsc2UKKwkJCQljb21wID0gc3RyY21wKHAxLml0ZW1zW2kxXS5wYXRoLAorCQkJCQlwMi5pdGVtc1tpMl0ucGF0aCk7CisKKwkJCWlmIChjb21wID4gMCkKKwkJCQluMSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQluMSA9IGJ1ZmZlcjE7CisJCQkJc3RybmNweShidWZmZXIxICsgbGVuMSwgcDEuaXRlbXNbaTErK10ucGF0aCwKKwkJCQkJCVBBVEhfTUFYIC0gbGVuMSk7CisJCQl9CisKKwkJCWlmIChjb21wIDwgMCkKKwkJCQluMiA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQluMiA9IGJ1ZmZlcjI7CisJCQkJc3RybmNweShidWZmZXIyICsgbGVuMiwgcDIuaXRlbXNbaTIrK10ucGF0aCwKKwkJCQkJCVBBVEhfTUFYIC0gbGVuMik7CisJCQl9CisKKwkJCXJldCA9IHF1ZXVlX2RpZmYobywgbjEsIG4yKTsKKwkJfQorCQlwYXRoX2xpc3RfY2xlYXIoJnAxLCAwKTsKKwkJcGF0aF9saXN0X2NsZWFyKCZwMiwgMCk7CisKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZDEsICpkMjsKKworCQlpZiAoby0+cmV2ZXJzZV9kaWZmKSB7CisJCQl1bnNpZ25lZCB0bXA7CisJCQljb25zdCBjaGFyICp0bXBfYzsKKwkJCXRtcCA9IG1vZGUxOyBtb2RlMSA9IG1vZGUyOyBtb2RlMiA9IHRtcDsKKwkJCXRtcF9jID0gbmFtZTE7IG5hbWUxID0gbmFtZTI7IG5hbWUyID0gdG1wX2M7CisJCX0KKworCQlpZiAoIW5hbWUxKQorCQkJbmFtZTEgPSAiL2Rldi9udWxsIjsKKwkJaWYgKCFuYW1lMikKKwkJCW5hbWUyID0gIi9kZXYvbnVsbCI7CisJCWQxID0gYWxsb2NfZmlsZXNwZWMobmFtZTEpOworCQlkMiA9IGFsbG9jX2ZpbGVzcGVjKG5hbWUyKTsKKwkJZmlsbF9maWxlc3BlYyhkMSwgbnVsbF9zaGExLCBtb2RlMSk7CisJCWZpbGxfZmlsZXNwZWMoZDIsIG51bGxfc2hhMSwgbW9kZTIpOworCisJCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIGQxLCBkMik7CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIERvZXMgdGhlIHBhdGggbmFtZSBhIGJsb2IgaW4gdGhlIHdvcmtpbmcgdHJlZSwgb3IgYSBkaXJlY3RvcnkKKyAqIGluIHRoZSB3b3JraW5nIHRyZWU/CisgKi8KK3N0YXRpYyBpbnQgaXNfaW5faW5kZXgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgbGVuLCBwb3M7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWxlbiA9IHN0cmxlbihwYXRoKTsKKwl3aGlsZSAocGF0aFtsZW4tMV0gPT0gJy8nKQorCQlsZW4tLTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDE7IC8qICIuIiAqLworCXBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIGxlbik7CisJaWYgKDAgPD0gcG9zKQorCQlyZXR1cm4gMTsKKwlwb3MgPSAtMSAtIHBvczsKKwl3aGlsZSAocG9zIDwgYWN0aXZlX25yKSB7CisJCWNlID0gYWN0aXZlX2NhY2hlW3BvcysrXTsKKwkJaWYgKGNlX25hbWVsZW4oY2UpIDw9IGxlbiB8fAorCQkgICAgc3RybmNtcChjZS0+bmFtZSwgcGF0aCwgbGVuKSB8fAorCQkgICAgKGNlLT5uYW1lW2xlbl0gPiAnLycpKQorCQkJYnJlYWs7IC8qIHBhdGggY2Fubm90IGJlIGEgcHJlZml4ICovCisJCWlmIChjZS0+bmFtZVtsZW5dID09ICcvJykKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfZGlmZl9maWxlc19hcmdzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgKnNpbGVudCkKK3sKKwkqc2lsZW50ID0gMDsKKworCS8qIHJldnMtPm1heF9jb3VudCA9PSAtMiBtZWFucyAtLW5vLWluZGV4ICovCisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLWJhc2UiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tb3VycyIpKQorCQkJcmV2cy0+bWF4X2NvdW50ID0gMjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS10aGVpcnMiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDM7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1uIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbMV0sICItLW5vLWluZGV4IikpIHsKKwkJCXJldnMtPm1heF9jb3VudCA9IC0yOworCQkJcmV2cy0+ZGlmZm9wdC5leGl0X3dpdGhfc3RhdHVzID0gMTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItcSIpKQorCQkJKnNpbGVudCA9IDE7CisJCWVsc2UKKwkJCXJldHVybiBlcnJvcigiaW52YWxpZCBvcHRpb246ICVzIiwgYXJndlsxXSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKworCWlmIChyZXZzLT5tYXhfY291bnQgPT0gLTEgJiYgcmV2cy0+ZGlmZm9wdC5ucl9wYXRocyA9PSAyKSB7CisJCS8qCisJCSAqIElmIHR3byBmaWxlcyBhcmUgc3BlY2lmaWVkLCBhbmQgYXQgbGVhc3Qgb25lIGlzIHVudHJhY2tlZCwKKwkJICogZGVmYXVsdCB0byBuby1pbmRleC4KKwkJICovCisJCXJlYWRfY2FjaGUoKTsKKwkJaWYgKCFpc19pbl9pbmRleChyZXZzLT5kaWZmb3B0LnBhdGhzWzBdKSB8fAorCQkJCQkhaXNfaW5faW5kZXgocmV2cy0+ZGlmZm9wdC5wYXRoc1sxXSkpCisJCQlyZXZzLT5tYXhfY291bnQgPSAtMjsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgTk8gcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpIHBhcmFtZXRlciwKKwkgKiByZXYubWF4X2NvdW50IGlzIHJlYXNvbmFibGUgKDAgPD0gbiA8PSAzKSwKKwkgKiB0aGVyZSBpcyBubyBvdGhlciByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAocmV2cy0+cGVuZGluZy5uciB8fCByZXZzLT5tYXhfY291bnQgPiAzIHx8CisJICAgIHJldnMtPm1pbl9hZ2UgIT0gLTEgfHwgcmV2cy0+bWF4X2FnZSAhPSAtMSkKKwkJcmV0dXJuIGVycm9yKCJubyByZXZpc2lvbiBhbGxvd2VkIHdpdGggZGlmZi1maWxlcyIpOworCisJaWYgKHJldnMtPm1heF9jb3VudCA9PSAtMSAmJgorCSAgICAocmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfUEFUQ0gpKQorCQlyZXZzLT5jb21iaW5lX21lcmdlcyA9IHJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19vdXRzaWRlX3JlcG8oY29uc3QgY2hhciAqcGF0aCwgaW50IG5vbmdpdCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCWlmIChub25naXQgfHwgIXN0cmNtcChwYXRoLCAiLSIpIHx8IHBhdGhbMF0gPT0gJy8nKQorCQlyZXR1cm4gMTsKKwlpZiAocHJlZml4Y21wKHBhdGgsICIuLi8iKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFwcmVmaXgpCisJCXJldHVybiAxOworCWZvciAoaSA9IHN0cmxlbihwcmVmaXgpOyAhcHJlZml4Y21wKHBhdGgsICIuLi8iKTsgKSB7CisJCXdoaWxlIChpID4gMCAmJiBwcmVmaXhbaSAtIDFdICE9ICcvJykKKwkJCWktLTsKKwkJaWYgKC0taSA8IDApCisJCQlyZXR1cm4gMTsKKwkJcGF0aCArPSAzOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNldHVwX2RpZmZfbm9faW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQlpbnQgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2LCBpbnQgbm9uZ2l0LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nIHx8IGFyZ3ZbaV1bMV0gPT0gJ1wwJykKKwkJCWJyZWFrOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpIDwgYXJnYyAtIDMgJiYgIXN0cmNtcChhcmd2W2ldLCAiLS1uby1pbmRleCIpKSB7CisJCQlpID0gYXJnYyAtIDM7CisJCQlyZXZzLT5kaWZmb3B0LmV4aXRfd2l0aF9zdGF0dXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwlpZiAoYXJnYyAhPSBpICsgMiB8fCAoIWlzX291dHNpZGVfcmVwbyhhcmd2W2kgKyAxXSwgbm9uZ2l0LCBwcmVmaXgpICYmCisJCQkJIWlzX291dHNpZGVfcmVwbyhhcmd2W2ldLCBub25naXQsIHByZWZpeCkpKQorCQlyZXR1cm4gLTE7CisKKwlkaWZmX3NldHVwKCZyZXZzLT5kaWZmb3B0KTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDI7ICkKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tbm8taW5kZXgiKSkKKwkJCWkrKzsKKwkJZWxzZSB7CisJCQlpbnQgaiA9IGRpZmZfb3B0X3BhcnNlKCZyZXZzLT5kaWZmb3B0LAorCQkJCQlhcmd2ICsgaSwgYXJnYyAtIGkpOworCQkJaWYgKCFqKQorCQkJCWRpZSgiaW52YWxpZCBkaWZmIG9wdGlvbi92YWx1ZTogJXMiLCBhcmd2W2ldKTsKKwkJCWkgKz0gajsKKwkJfQorCisJaWYgKHByZWZpeCkgeworCQlpbnQgbGVuID0gc3RybGVuKHByZWZpeCk7CisKKwkJcmV2cy0+ZGlmZm9wdC5wYXRocyA9IHhjYWxsb2MoMiwgc2l6ZW9mKGNoYXIqKSk7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnAgPSBhcmd2W2FyZ2MgLSAyICsgaV07CisJCQkvKgorCQkJICogc3RkaW4gc2hvdWxkIGJlIHNwZWxsZWQgYXMgJy0nOyBpZiB5b3UgaGF2ZQorCQkJICogcGF0aCB0aGF0IGlzICctJywgc3BlbGwgaXQgYXMgLi8tLgorCQkJICovCisJCQlwID0gKHN0cmNtcChwLCAiLSIpCisJCQkgICAgID8geHN0cmR1cChwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBsZW4sIHApKQorCQkJICAgICA6IHApOworCQkJcmV2cy0+ZGlmZm9wdC5wYXRoc1tpXSA9IHA7CisJCX0KKwl9CisJZWxzZQorCQlyZXZzLT5kaWZmb3B0LnBhdGhzID0gYXJndiArIGFyZ2MgLSAyOworCXJldnMtPmRpZmZvcHQubnJfcGF0aHMgPSAyOworCXJldnMtPm1heF9jb3VudCA9IC0yOworCXJldHVybiAwOworfQorCitpbnQgcnVuX2RpZmZfZmlsZXNfY21kKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBzaWxlbnRfb25fcmVtb3ZlZDsKKworCWlmIChoYW5kbGVfZGlmZl9maWxlc19hcmdzKHJldnMsIGFyZ2MsIGFyZ3YsICZzaWxlbnRfb25fcmVtb3ZlZCkpCisJCXJldHVybiAtMTsKKworCWlmIChyZXZzLT5tYXhfY291bnQgPT0gLTIpIHsKKwkJaWYgKHJldnMtPmRpZmZvcHQubnJfcGF0aHMgIT0gMikKKwkJCXJldHVybiBlcnJvcigibmVlZCB0d28gZmlsZXMvZGlyZWN0b3JpZXMgd2l0aCAtLW5vLWluZGV4Iik7CisJCWlmIChxdWV1ZV9kaWZmKCZyZXZzLT5kaWZmb3B0LCByZXZzLT5kaWZmb3B0LnBhdGhzWzBdLAorCQkJCXJldnMtPmRpZmZvcHQucGF0aHNbMV0pKQorCQkJcmV0dXJuIC0xOworCQlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCQlkaWZmX2ZsdXNoKCZyZXZzLT5kaWZmb3B0KTsKKwkJLyoKKwkJICogVGhlIHJldHVybiBjb2RlIGZvciAtLW5vLWluZGV4IGltaXRhdGVzIGRpZmYoMSk6CisJCSAqIDAgPSBubyBjaGFuZ2VzLCAxID0gY2hhbmdlcywgZWxzZSBlcnJvcgorCQkgKi8KKwkJcmV0dXJuIHJldnMtPmRpZmZvcHQuZm91bmRfY2hhbmdlczsKKwl9CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkgeworCQlwZXJyb3IoInJlYWRfY2FjaGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcnVuX2RpZmZfZmlsZXMocmV2cywgc2lsZW50X29uX3JlbW92ZWQpOworfQorCitpbnQgcnVuX2RpZmZfZmlsZXMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgc2lsZW50X29uX3JlbW92ZWQpCit7CisJaW50IGVudHJpZXMsIGk7CisJaW50IGRpZmZfdW5tZXJnZWRfc3RhZ2UgPSByZXZzLT5tYXhfY291bnQ7CisKKwlpZiAoZGlmZl91bm1lcmdlZF9zdGFnZSA8IDApCisJCWRpZmZfdW5tZXJnZWRfc3RhZ2UgPSAyOworCWVudHJpZXMgPSBhY3RpdmVfbnI7CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJdW5zaWduZWQgaW50IG9sZG1vZGUsIG5ld21vZGU7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWludCBjaGFuZ2VkOworCisJCWlmIChyZXZzLT5kaWZmb3B0LnF1aWV0ICYmIHJldnMtPmRpZmZvcHQuaGFzX2NoYW5nZXMpCisJCQlicmVhazsKKworCQlpZiAoIWNlX3BhdGhfbWF0Y2goY2UsIHJldnMtPnBydW5lX2RhdGEpKQorCQkJY29udGludWU7CisKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpkcGF0aDsKKwkJCWludCBudW1fY29tcGFyZV9zdGFnZXMgPSAwOworCQkJc2l6ZV90IHBhdGhfbGVuOworCisJCQlwYXRoX2xlbiA9IGNlX25hbWVsZW4oY2UpOworCisJCQlkcGF0aCA9IHhtYWxsb2MoY29tYmluZV9kaWZmX3BhdGhfc2l6ZSg1LCBwYXRoX2xlbikpOworCQkJZHBhdGgtPnBhdGggPSAoY2hhciAqKSAmKGRwYXRoLT5wYXJlbnRbNV0pOworCisJCQlkcGF0aC0+bmV4dCA9IE5VTEw7CisJCQlkcGF0aC0+bGVuID0gcGF0aF9sZW47CisJCQltZW1jcHkoZHBhdGgtPnBhdGgsIGNlLT5uYW1lLCBwYXRoX2xlbik7CisJCQlkcGF0aC0+cGF0aFtwYXRoX2xlbl0gPSAnXDAnOworCQkJaGFzaGNscihkcGF0aC0+c2hhMSk7CisJCQltZW1zZXQoJihkcGF0aC0+cGFyZW50WzBdKSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXJlbnQpKjUpOworCisJCQlpZiAobHN0YXQoY2UtPm5hbWUsICZzdCkgPCAwKSB7CisJCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKSB7CisJCQkJCXBlcnJvcihjZS0+bmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoc2lsZW50X29uX3JlbW92ZWQpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZQorCQkJCWRwYXRoLT5tb2RlID0gbnRvaGwoY2VfbW9kZV9mcm9tX3N0YXQoY2UsIHN0LnN0X21vZGUpKTsKKworCQkJd2hpbGUgKGkgPCBlbnRyaWVzKSB7CisJCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpuY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCQkJaW50IHN0YWdlOworCisJCQkJaWYgKHN0cmNtcChjZS0+bmFtZSwgbmNlLT5uYW1lKSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBTdGFnZSAjMiAob3VycykgaXMgdGhlIGZpcnN0IHBhcmVudCwKKwkJCQkgKiBzdGFnZSAjMyAodGhlaXJzKSBpcyB0aGUgc2Vjb25kLgorCQkJCSAqLworCQkJCXN0YWdlID0gY2Vfc3RhZ2UobmNlKTsKKwkJCQlpZiAoMiA8PSBzdGFnZSkgeworCQkJCQlpbnQgbW9kZSA9IG50b2hsKG5jZS0+Y2VfbW9kZSk7CisJCQkJCW51bV9jb21wYXJlX3N0YWdlcysrOworCQkJCQloYXNoY3B5KGRwYXRoLT5wYXJlbnRbc3RhZ2UtMl0uc2hhMSwgbmNlLT5zaGExKTsKKwkJCQkJZHBhdGgtPnBhcmVudFtzdGFnZS0yXS5tb2RlID0gbnRvaGwoY2VfbW9kZV9mcm9tX3N0YXQobmNlLCBtb2RlKSk7CisJCQkJCWRwYXRoLT5wYXJlbnRbc3RhZ2UtMl0uc3RhdHVzID0KKwkJCQkJCURJRkZfU1RBVFVTX01PRElGSUVEOworCQkJCX0KKworCQkJCS8qIGRpZmYgYWdhaW5zdCB0aGUgcHJvcGVyIHVubWVyZ2VkIHN0YWdlICovCisJCQkJaWYgKHN0YWdlID09IGRpZmZfdW5tZXJnZWRfc3RhZ2UpCisJCQkJCWNlID0gbmNlOworCQkJCWkrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBDb21wZW5zYXRlIGZvciBsb29wIHVwZGF0ZQorCQkJICovCisJCQlpLS07CisKKwkJCWlmIChyZXZzLT5jb21iaW5lX21lcmdlcyAmJiBudW1fY29tcGFyZV9zdGFnZXMgPT0gMikgeworCQkJCXNob3dfY29tYmluZWRfZGlmZihkcGF0aCwgMiwKKwkJCQkJCSAgIHJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcywKKwkJCQkJCSAgIHJldnMpOworCQkJCWZyZWUoZHBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZShkcGF0aCk7CisJCQlkcGF0aCA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBTaG93IHRoZSBkaWZmIGZvciB0aGUgJ2NlJyBpZiB3ZSBmb3VuZCB0aGUgb25lCisJCQkgKiBmcm9tIHRoZSBkZXNpcmVkIHN0YWdlLgorCQkJICovCisJCQlkaWZmX3VubWVyZ2UoJnJldnMtPmRpZmZvcHQsIGNlLT5uYW1lLCAwLCBudWxsX3NoYTEpOworCQkJaWYgKGNlX3N0YWdlKGNlKSAhPSBkaWZmX3VubWVyZ2VkX3N0YWdlKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKSB7CisJCQkJcGVycm9yKGNlLT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChzaWxlbnRfb25fcmVtb3ZlZCkKKwkJCQljb250aW51ZTsKKwkJCWRpZmZfYWRkcmVtb3ZlKCZyZXZzLT5kaWZmb3B0LCAnLScsIG50b2hsKGNlLT5jZV9tb2RlKSwKKwkJCQkgICAgICAgY2UtPnNoYTEsIGNlLT5uYW1lLCBOVUxMKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApOworCQlpZiAoIWNoYW5nZWQgJiYgIXJldnMtPmRpZmZvcHQuZmluZF9jb3BpZXNfaGFyZGVyKQorCQkJY29udGludWU7CisJCW9sZG1vZGUgPSBudG9obChjZS0+Y2VfbW9kZSk7CisJCW5ld21vZGUgPSBudG9obChjZV9tb2RlX2Zyb21fc3RhdChjZSwgc3Quc3RfbW9kZSkpOworCQlkaWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwgb2xkbW9kZSwgbmV3bW9kZSwKKwkJCSAgICBjZS0+c2hhMSwgKGNoYW5nZWQgPyBudWxsX3NoYTEgOiBjZS0+c2hhMSksCisJCQkgICAgY2UtPm5hbWUsIE5VTEwpOworCisJfQorCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkaWZmLWluZGV4CisgKi8KKworLyogQSBmaWxlIGVudHJ5IHdlbnQgYXdheSBvciBhcHBlYXJlZCAqLworc3RhdGljIHZvaWQgZGlmZl9pbmRleF9zaG93X2ZpbGUoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJCSBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsCisJCQkJIHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGludCBtb2RlKQoreworCWRpZmZfYWRkcmVtb3ZlKCZyZXZzLT5kaWZmb3B0LCBwcmVmaXhbMF0sIG50b2hsKG1vZGUpLAorCQkgICAgICAgc2hhMSwgY2UtPm5hbWUsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGdldF9zdGF0X2RhdGEoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJCSB1bnNpZ25lZCBjaGFyICoqc2hhMXAsCisJCQkgdW5zaWduZWQgaW50ICptb2RlcCwKKwkJCSBpbnQgY2FjaGVkLCBpbnQgbWF0Y2hfbWlzc2luZykKK3sKKwl1bnNpZ25lZCBjaGFyICpzaGExID0gY2UtPnNoYTE7CisJdW5zaWduZWQgaW50IG1vZGUgPSBjZS0+Y2VfbW9kZTsKKworCWlmICghY2FjaGVkKSB7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG5vX3NoYTFbMjBdOworCQlpbnQgY2hhbmdlZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQgJiYgbWF0Y2hfbWlzc2luZykgeworCQkJCSpzaGExcCA9IHNoYTE7CisJCQkJKm1vZGVwID0gbW9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQljaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAwKTsKKwkJaWYgKGNoYW5nZWQpIHsKKwkJCW1vZGUgPSBjZV9tb2RlX2Zyb21fc3RhdChjZSwgc3Quc3RfbW9kZSk7CisJCQlzaGExID0gbm9fc2hhMTsKKwkJfQorCX0KKworCSpzaGExcCA9IHNoYTE7CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19uZXdfZmlsZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgIHN0cnVjdCBjYWNoZV9lbnRyeSAqbmV3LAorCQkJICBpbnQgY2FjaGVkLCBpbnQgbWF0Y2hfbWlzc2luZykKK3sKKwl1bnNpZ25lZCBjaGFyICpzaGExOworCXVuc2lnbmVkIGludCBtb2RlOworCisJLyogTmV3IGZpbGUgaW4gdGhlIGluZGV4OiBpdCBtaWdodCBhY3R1YWxseSBiZSBkaWZmZXJlbnQgaW4KKwkgKiB0aGUgd29ya2luZyBjb3B5LgorCSAqLworCWlmIChnZXRfc3RhdF9kYXRhKG5ldywgJnNoYTEsICZtb2RlLCBjYWNoZWQsIG1hdGNoX21pc3NpbmcpIDwgMCkKKwkJcmV0dXJuOworCisJZGlmZl9pbmRleF9zaG93X2ZpbGUocmV2cywgIisiLCBuZXcsIHNoYTEsIG1vZGUpOworfQorCitzdGF0aWMgaW50IHNob3dfbW9kaWZpZWQoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJIHN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkLAorCQkJIHN0cnVjdCBjYWNoZV9lbnRyeSAqbmV3LAorCQkJIGludCByZXBvcnRfbWlzc2luZywKKwkJCSBpbnQgY2FjaGVkLCBpbnQgbWF0Y2hfbWlzc2luZykKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZSwgb2xkbW9kZTsKKwl1bnNpZ25lZCBjaGFyICpzaGExOworCisJaWYgKGdldF9zdGF0X2RhdGEobmV3LCAmc2hhMSwgJm1vZGUsIGNhY2hlZCwgbWF0Y2hfbWlzc2luZykgPCAwKSB7CisJCWlmIChyZXBvcnRfbWlzc2luZykKKwkJCWRpZmZfaW5kZXhfc2hvd19maWxlKHJldnMsICItIiwgb2xkLAorCQkJCQkgICAgIG9sZC0+c2hhMSwgb2xkLT5jZV9tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZXZzLT5jb21iaW5lX21lcmdlcyAmJiAhY2FjaGVkICYmCisJICAgIChoYXNoY21wKHNoYTEsIG9sZC0+c2hhMSkgfHwgaGFzaGNtcChvbGQtPnNoYTEsIG5ldy0+c2hhMSkpKSB7CisJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcDsKKwkJaW50IHBhdGhsZW4gPSBjZV9uYW1lbGVuKG5ldyk7CisKKwkJcCA9IHhtYWxsb2MoY29tYmluZV9kaWZmX3BhdGhfc2l6ZSgyLCBwYXRobGVuKSk7CisJCXAtPnBhdGggPSAoY2hhciAqKSAmcC0+cGFyZW50WzJdOworCQlwLT5uZXh0ID0gTlVMTDsKKwkJcC0+bGVuID0gcGF0aGxlbjsKKwkJbWVtY3B5KHAtPnBhdGgsIG5ldy0+bmFtZSwgcGF0aGxlbik7CisJCXAtPnBhdGhbcGF0aGxlbl0gPSAwOworCQlwLT5tb2RlID0gbnRvaGwobW9kZSk7CisJCWhhc2hjbHIocC0+c2hhMSk7CisJCW1lbXNldChwLT5wYXJlbnQsIDAsIDIgKiBzaXplb2Yoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXJlbnQpKTsKKwkJcC0+cGFyZW50WzBdLnN0YXR1cyA9IERJRkZfU1RBVFVTX01PRElGSUVEOworCQlwLT5wYXJlbnRbMF0ubW9kZSA9IG50b2hsKG5ldy0+Y2VfbW9kZSk7CisJCWhhc2hjcHkocC0+cGFyZW50WzBdLnNoYTEsIG5ldy0+c2hhMSk7CisJCXAtPnBhcmVudFsxXS5zdGF0dXMgPSBESUZGX1NUQVRVU19NT0RJRklFRDsKKwkJcC0+cGFyZW50WzFdLm1vZGUgPSBudG9obChvbGQtPmNlX21vZGUpOworCQloYXNoY3B5KHAtPnBhcmVudFsxXS5zaGExLCBvbGQtPnNoYTEpOworCQlzaG93X2NvbWJpbmVkX2RpZmYocCwgMiwgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCByZXZzKTsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2xkbW9kZSA9IG9sZC0+Y2VfbW9kZTsKKwlpZiAobW9kZSA9PSBvbGRtb2RlICYmICFoYXNoY21wKHNoYTEsIG9sZC0+c2hhMSkgJiYKKwkgICAgIXJldnMtPmRpZmZvcHQuZmluZF9jb3BpZXNfaGFyZGVyKQorCQlyZXR1cm4gMDsKKworCW1vZGUgPSBudG9obChtb2RlKTsKKwlvbGRtb2RlID0gbnRvaGwob2xkbW9kZSk7CisKKwlkaWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwgb2xkbW9kZSwgbW9kZSwKKwkJICAgIG9sZC0+c2hhMSwgc2hhMSwgb2xkLT5uYW1lLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWZmX2NhY2hlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJICAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICoqYWMsIGludCBlbnRyaWVzLAorCQkgICAgICBjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCSAgICAgIGludCBjYWNoZWQsIGludCBtYXRjaF9taXNzaW5nKQoreworCXdoaWxlIChlbnRyaWVzKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSAqYWM7CisJCWludCBzYW1lID0gKGVudHJpZXMgPiAxKSAmJiBjZV9zYW1lX25hbWUoY2UsIGFjWzFdKTsKKworCQlpZiAocmV2cy0+ZGlmZm9wdC5xdWlldCAmJiByZXZzLT5kaWZmb3B0Lmhhc19jaGFuZ2VzKQorCQkJYnJlYWs7CisKKwkJaWYgKCFjZV9wYXRoX21hdGNoKGNlLCBwYXRoc3BlYykpCisJCQlnb3RvIHNraXBfZW50cnk7CisKKwkJc3dpdGNoIChjZV9zdGFnZShjZSkpIHsKKwkJY2FzZSAwOgorCQkJLyogTm8gc3RhZ2UgMSBlbnRyeT8gVGhhdCBtZWFucyBpdCdzIGEgbmV3IGZpbGUgKi8KKwkJCWlmICghc2FtZSkgeworCQkJCXNob3dfbmV3X2ZpbGUocmV2cywgY2UsIGNhY2hlZCwgbWF0Y2hfbWlzc2luZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBTaG93IGRpZmZlcmVuY2UgYmV0d2VlbiBvbGQgYW5kIG5ldyAqLworCQkJc2hvd19tb2RpZmllZChyZXZzLCBhY1sxXSwgY2UsIDEsCisJCQkJICAgICAgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiBObyBzdGFnZSAzIChtZXJnZSkgZW50cnk/CisJCQkgKiBUaGF0IG1lYW5zIGl0J3MgYmVlbiBkZWxldGVkLgorCQkJICovCisJCQlpZiAoIXNhbWUpIHsKKwkJCQlkaWZmX2luZGV4X3Nob3dfZmlsZShyZXZzLCAiLSIsIGNlLAorCQkJCQkJICAgICBjZS0+c2hhMSwgY2UtPmNlX21vZGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogV2UgY29tZSBoZXJlIHdpdGggY2UgcG9pbnRpbmcgYXQgc3RhZ2UgMQorCQkJICogKG9yaWdpbmFsIHRyZWUpIGFuZCBhY1sxXSBwb2ludGluZyBhdCBzdGFnZQorCQkJICogMyAodW5tZXJnZWQpLiAgc2hvdy1tb2RpZmllZCB3aXRoCisJCQkgKiByZXBvcnQtbWlzc2luZyBzZXQgdG8gZmFsc2UgZG9lcyBub3Qgc2F5IHRoZQorCQkJICogZmlsZSBpcyBkZWxldGVkIGJ1dCByZXBvcnRzIHRydWUgaWYgd29yaworCQkJICogdHJlZSBkb2VzIG5vdCBoYXZlIGl0LCBpbiB3aGljaCBjYXNlIHdlCisJCQkgKiBmYWxsIHRocm91Z2ggdG8gcmVwb3J0IHRoZSB1bm1lcmdlZCBzdGF0ZS4KKwkJCSAqIE90aGVyd2lzZSwgd2Ugc2hvdyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorCQkJICogdGhlIG9yaWdpbmFsIHRyZWUgYW5kIHRoZSB3b3JrIHRyZWUuCisJCQkgKi8KKwkJCWlmICghY2FjaGVkICYmCisJCQkgICAgIXNob3dfbW9kaWZpZWQocmV2cywgY2UsIGFjWzFdLCAwLAorCQkJCQkgICBjYWNoZWQsIG1hdGNoX21pc3NpbmcpKQorCQkJCWJyZWFrOworCQkJZGlmZl91bm1lcmdlKCZyZXZzLT5kaWZmb3B0LCBjZS0+bmFtZSwKKwkJCQkgICAgIG50b2hsKGNlLT5jZV9tb2RlKSwgY2UtPnNoYTEpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRpZmZfdW5tZXJnZSgmcmV2cy0+ZGlmZm9wdCwgY2UtPm5hbWUsCisJCQkJICAgICAwLCBudWxsX3NoYTEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRpZSgiaW1wb3NzaWJsZSBjYWNoZSBlbnRyeSBzdGFnZSIpOworCQl9CisKK3NraXBfZW50cnk6CisJCS8qCisJCSAqIElnbm9yZSBhbGwgdGhlIGRpZmZlcmVudCBzdGFnZXMgZm9yIHRoaXMgZmlsZSwKKwkJICogd2UndmUgaGFuZGxlZCB0aGUgcmVsZXZhbnQgY2FzZXMgbm93LgorCQkgKi8KKwkJZG8geworCQkJYWMrKzsKKwkJCWVudHJpZXMtLTsKKwkJfSB3aGlsZSAoZW50cmllcyAmJiBjZV9zYW1lX25hbWUoY2UsIGFjWzBdKSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyB0dXJucyBhbGwgbWVyZ2UgZW50cmllcyBpbnRvICJzdGFnZSAzIi4gVGhhdCBndWFyYW50ZWVzIHRoYXQKKyAqIHdoZW4gd2UgcmVhZCBpbiB0aGUgbmV3IHRyZWUgKGludG8gInN0YWdlIDEiKSwgd2Ugd29uJ3QgbG9zZSBzaWdodAorICogb2YgdGhlIGZhY3QgdGhhdCB3ZSBoYWQgdW5tZXJnZWQgZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgbWFya19tZXJnZV9lbnRyaWVzKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9TVEFHRU1BU0spOworCX0KK30KKworaW50IHJ1bl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGNhY2hlZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvYmplY3QgKmVudDsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwljb25zdCBjaGFyICp0cmVlX25hbWU7CisJaW50IG1hdGNoX21pc3NpbmcgPSAwOworCisJLyogCisJICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXJ0IC0gImRpZmYtaW5kZXggLW0iIGRvZXMKKwkgKiBub3QgbWVhbiAiZG8gbm90IGlnbm9yZSBtZXJnZXMiLCBidXQgdG90YWxseSBkaWZmZXJlbnQuCisJICovCisJaWYgKCFyZXZzLT5pZ25vcmVfbWVyZ2VzKQorCQltYXRjaF9taXNzaW5nID0gMTsKKworCW1hcmtfbWVyZ2VfZW50cmllcygpOworCisJZW50ID0gcmV2cy0+cGVuZGluZy5vYmplY3RzWzBdLml0ZW07CisJdHJlZV9uYW1lID0gcmV2cy0+cGVuZGluZy5vYmplY3RzWzBdLm5hbWU7CisJdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3QoZW50LT5zaGExKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBlcnJvcigiYmFkIHRyZWUgb2JqZWN0ICVzIiwgdHJlZV9uYW1lKTsKKwlpZiAocmVhZF90cmVlKHRyZWUsIDEsIHJldnMtPnBydW5lX2RhdGEpKQorCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byByZWFkIHRyZWUgb2JqZWN0ICVzIiwgdHJlZV9uYW1lKTsKKwlyZXQgPSBkaWZmX2NhY2hlKHJldnMsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCByZXZzLT5wcnVuZV9kYXRhLAorCQkJIGNhY2hlZCwgbWF0Y2hfbWlzc2luZyk7CisJZGlmZmNvcmVfc3RkKCZyZXZzLT5kaWZmb3B0KTsKKwlkaWZmX2ZsdXNoKCZyZXZzLT5kaWZmb3B0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZG9fZGlmZl9jYWNoZShjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX3NoYTEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKipkc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpsYXN0ID0gTlVMTDsKKworCS8qCisJICogVGhpcyBpcyB1c2VkIGJ5IGdpdC1ibGFtZSB0byBydW4gZGlmZi1jYWNoZSBpbnRlcm5hbGx5OworCSAqIGl0IHBvdGVudGlhbGx5IG5lZWRzIHRvIHJlcGVhdGVkbHkgcnVuIHRoaXMsIHNvIHdlIHdpbGwKKwkgKiBzdGFydCBieSByZW1vdmluZyB0aGUgaGlnaGVyIG9yZGVyIGVudHJpZXMgdGhlIGxhc3Qgcm91bmQKKwkgKiBsZWZ0IGJlaGluZC4KKwkgKi8KKwlkc3QgPSBhY3RpdmVfY2FjaGU7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCWlmIChsYXN0ICYmICFzdHJjbXAoY2UtPm5hbWUsIGxhc3QtPm5hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsCisJCQkJCQkgICBjZS0+bmFtZSk7CisJCQlsYXN0ID0gY2U7CisJCQljZS0+Y2VfbW9kZSA9IDA7CisJCQljZS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1NUQUdFTUFTSyk7CisJCX0KKwkJKmRzdCsrID0gY2U7CisJfQorCWFjdGl2ZV9uciA9IGRzdCAtIGFjdGl2ZV9jYWNoZTsKKworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBOVUxMKTsKKwlyZXZzLnBydW5lX2RhdGEgPSBvcHQtPnBhdGhzOworCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHRyZWVfc2hhMSk7CisJaWYgKCF0cmVlKQorCQlkaWUoImJhZCB0cmVlIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHRyZWVfc2hhMSkpOworCWlmIChyZWFkX3RyZWUodHJlZSwgMSwgb3B0LT5wYXRocykpCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlYWQgdHJlZSAlcyIsIHNoYTFfdG9faGV4KHRyZWVfc2hhMSkpOworCXJldHVybiBkaWZmX2NhY2hlKCZyZXZzLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9uciwgcmV2cy5wcnVuZV9kYXRhLAorCQkJICAxLCAwKTsKK30KZGlmZiAtLWdpdCBhL2RpZmYuYyBiL2RpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk5MmRkCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZi5jCkBAIC0wLDAgKzEsMzA5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisKKyNpZmRlZiBOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZCisjZGVmaW5lIEZBU1RfV09SS0lOR19ESVJFQ1RPUlkgMAorI2Vsc2UKKyNkZWZpbmUgRkFTVF9XT1JLSU5HX0RJUkVDVE9SWSAxCisjZW5kaWYKKworc3RhdGljIGludCBkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdDsKK3N0YXRpYyBpbnQgZGlmZl9yZW5hbWVfbGltaXRfZGVmYXVsdCA9IC0xOworc3RhdGljIGludCBkaWZmX3VzZV9jb2xvcl9kZWZhdWx0OworCitzdGF0aWMgY2hhciBkaWZmX2NvbG9yc1tdW0NPTE9SX01BWExFTl0gPSB7CisJIlwwMzNbbSIsCS8qIHJlc2V0ICovCisJIiIsCQkvKiBQTEFJTiAobm9ybWFsKSAqLworCSJcMDMzWzFtIiwJLyogTUVUQUlORk8gKGJvbGQpICovCisJIlwwMzNbMzZtIiwJLyogRlJBR0lORk8gKGN5YW4pICovCisJIlwwMzNbMzFtIiwJLyogT0xEIChyZWQpICovCisJIlwwMzNbMzJtIiwJLyogTkVXIChncmVlbikgKi8KKwkiXDAzM1szM20iLAkvKiBDT01NSVQgKHllbGxvdykgKi8KKwkiXDAzM1s0MW0iLAkvKiBXSElURVNQQUNFIChyZWQgYmFja2dyb3VuZCkgKi8KK307CisKK3N0YXRpYyBpbnQgcGFyc2VfZGlmZl9jb2xvcl9zbG90KGNvbnN0IGNoYXIgKnZhciwgaW50IG9mcykKK3sKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgInBsYWluIikpCisJCXJldHVybiBESUZGX1BMQUlOOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAibWV0YSIpKQorCQlyZXR1cm4gRElGRl9NRVRBSU5GTzsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgImZyYWciKSkKKwkJcmV0dXJuIERJRkZfRlJBR0lORk87CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJvbGQiKSkKKwkJcmV0dXJuIERJRkZfRklMRV9PTEQ7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJuZXciKSkKKwkJcmV0dXJuIERJRkZfRklMRV9ORVc7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJjb21taXQiKSkKKwkJcmV0dXJuIERJRkZfQ09NTUlUOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAid2hpdGVzcGFjZSIpKQorCQlyZXR1cm4gRElGRl9XSElURVNQQUNFOworCWRpZSgiYmFkIGNvbmZpZyB2YXJpYWJsZSAnJXMnIiwgdmFyKTsKK30KKworc3RhdGljIHN0cnVjdCBsbF9kaWZmX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGxfZGlmZl9kcml2ZXIgKm5leHQ7CisJY2hhciAqY21kOworfSAqdXNlcl9kaWZmLCAqKnVzZXJfZGlmZl90YWlsOworCisvKgorICogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgImRpZmYuPGRyaXZlcm5hbWU+LmNvbW1hbmQiIHZhcmlhYmxlOworICogYmVjYXVzZSB0aGVyZSBhcmUgImRpZmYuY29sb3IuPHNsb3Q+IiB2YXJpYWJsZXMsIHdlIGFyZSBwYXJzaW5nCisgKiB0aGlzIGluIGEgYml0IGNvbnZvbHV0ZWQgd2F5IHRvIGFsbG93IGxvdyBsZXZlbCBkaWZmIGRyaXZlcgorICogY2FsbGVkICJjb2xvciIuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbGxkaWZmX2NvbW1hbmQoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplcCwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKwlzdHJ1Y3QgbGxfZGlmZl9kcml2ZXIgKmRydjsKKworCW5hbWUgPSB2YXIgKyA1OworCW5hbWVsZW4gPSBlcCAtIG5hbWU7CisJZm9yIChkcnYgPSB1c2VyX2RpZmY7IGRydjsgZHJ2ID0gZHJ2LT5uZXh0KQorCQlpZiAoIXN0cm5jbXAoZHJ2LT5uYW1lLCBuYW1lLCBuYW1lbGVuKSAmJiAhZHJ2LT5uYW1lW25hbWVsZW5dKQorCQkJYnJlYWs7CisJaWYgKCFkcnYpIHsKKwkJY2hhciAqbmFtZWJ1ZjsKKwkJZHJ2ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxsX2RpZmZfZHJpdmVyKSk7CisJCW5hbWVidWYgPSB4bWFsbG9jKG5hbWVsZW4gKyAxKTsKKwkJbWVtY3B5KG5hbWVidWYsIG5hbWUsIG5hbWVsZW4pOworCQluYW1lYnVmW25hbWVsZW5dID0gMDsKKwkJZHJ2LT5uYW1lID0gbmFtZWJ1ZjsKKwkJZHJ2LT5uZXh0ID0gTlVMTDsKKwkJaWYgKCF1c2VyX2RpZmZfdGFpbCkKKwkJCXVzZXJfZGlmZl90YWlsID0gJnVzZXJfZGlmZjsKKwkJKnVzZXJfZGlmZl90YWlsID0gZHJ2OworCQl1c2VyX2RpZmZfdGFpbCA9ICYoZHJ2LT5uZXh0KTsKKwl9CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBsYWNrcyB2YWx1ZSIsIHZhcik7CisJZHJ2LT5jbWQgPSBzdHJkdXAodmFsdWUpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlc2UgYXJlIHRvIGdpdmUgVUkgbGF5ZXIgZGVmYXVsdHMuCisgKiBUaGUgY29yZS1sZXZlbCBjb21tYW5kcyBzdWNoIGFzIGdpdC1kaWZmLWZpbGVzIHNob3VsZAorICogbmV2ZXIgYmUgYWZmZWN0ZWQgYnkgdGhlIHNldHRpbmcgb2YgZGlmZi5yZW5hbWVzCisgKiB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqLworaW50IGdpdF9kaWZmX3VpX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImRpZmYucmVuYW1lbGltaXQiKSkgeworCQlkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLmNvbG9yIikgfHwgIXN0cmNtcCh2YXIsICJjb2xvci5kaWZmIikpIHsKKwkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IGdpdF9jb25maWdfY29sb3Jib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZGlmZi5yZW5hbWVzIikpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCWRpZmZfZGV0ZWN0X3JlbmFtZV9kZWZhdWx0ID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCQllbHNlIGlmICghc3RyY2FzZWNtcCh2YWx1ZSwgImNvcGllcyIpIHx8CisJCQkgIXN0cmNhc2VjbXAodmFsdWUsICJjb3B5IikpCisJCQlkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdCA9IERJRkZfREVURUNUX0NPUFk7CisJCWVsc2UgaWYgKGdpdF9jb25maWdfYm9vbCh2YXIsdmFsdWUpKQorCQkJZGlmZl9kZXRlY3RfcmVuYW1lX2RlZmF1bHQgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJkaWZmLiIpKSB7CisJCWNvbnN0IGNoYXIgKmVwID0gc3RycmNocih2YXIsICcuJyk7CisKKwkJaWYgKGVwICE9IHZhciArIDQgJiYgIXN0cmNtcChlcCwgIi5jb21tYW5kIikpCisJCQlyZXR1cm4gcGFyc2VfbGxkaWZmX2NvbW1hbmQodmFyLCBlcCwgdmFsdWUpOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJkaWZmLmNvbG9yLiIpIHx8ICFwcmVmaXhjbXAodmFyLCAiY29sb3IuZGlmZi4iKSkgeworCQlpbnQgc2xvdCA9IHBhcnNlX2RpZmZfY29sb3Jfc2xvdCh2YXIsIDExKTsKKwkJY29sb3JfcGFyc2UodmFsdWUsIHZhciwgZGlmZl9jb2xvcnNbc2xvdF0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfb25lKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbmVlZGxlbjsKKwljaGFyICp4cDsKKworCWlmICghc3RyKQorCQlyZXR1cm4gTlVMTDsKKwluZWVkbGVuID0gcXVvdGVfY19zdHlsZShzdHIsIE5VTEwsIE5VTEwsIDApOworCWlmICghbmVlZGxlbikKKwkJcmV0dXJuIHhzdHJkdXAoc3RyKTsKKwl4cCA9IHhtYWxsb2MobmVlZGxlbiArIDEpOworCXF1b3RlX2Nfc3R5bGUoc3RyLCB4cCwgTlVMTCwgMCk7CisJcmV0dXJuIHhwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfdHdvKGNvbnN0IGNoYXIgKm9uZSwgY29uc3QgY2hhciAqdHdvKQoreworCWludCBuZWVkX29uZSA9IHF1b3RlX2Nfc3R5bGUob25lLCBOVUxMLCBOVUxMLCAxKTsKKwlpbnQgbmVlZF90d28gPSBxdW90ZV9jX3N0eWxlKHR3bywgTlVMTCwgTlVMTCwgMSk7CisJY2hhciAqeHA7CisKKwlpZiAobmVlZF9vbmUgKyBuZWVkX3R3bykgeworCQlpZiAoIW5lZWRfb25lKSBuZWVkX29uZSA9IHN0cmxlbihvbmUpOworCQlpZiAoIW5lZWRfdHdvKSBuZWVkX29uZSA9IHN0cmxlbih0d28pOworCisJCXhwID0geG1hbGxvYyhuZWVkX29uZSArIG5lZWRfdHdvICsgMyk7CisJCXhwWzBdID0gJyInOworCQlxdW90ZV9jX3N0eWxlKG9uZSwgeHAgKyAxLCBOVUxMLCAxKTsKKwkJcXVvdGVfY19zdHlsZSh0d28sIHhwICsgbmVlZF9vbmUgKyAxLCBOVUxMLCAxKTsKKwkJc3RyY3B5KHhwICsgbmVlZF9vbmUgKyBuZWVkX3R3byArIDEsICJcIiIpOworCQlyZXR1cm4geHA7CisJfQorCW5lZWRfb25lID0gc3RybGVuKG9uZSk7CisJbmVlZF90d28gPSBzdHJsZW4odHdvKTsKKwl4cCA9IHhtYWxsb2MobmVlZF9vbmUgKyBuZWVkX3R3byArIDEpOworCXN0cmNweSh4cCwgb25lKTsKKwlzdHJjcHkoeHAgKyBuZWVkX29uZSwgdHdvKTsKKwlyZXR1cm4geHA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlcm5hbF9kaWZmKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVybmFsX2RpZmZfY21kID0gTlVMTDsKKwlzdGF0aWMgaW50IGRvbmVfcHJlcGFyaW5nID0gMDsKKworCWlmIChkb25lX3ByZXBhcmluZykKKwkJcmV0dXJuIGV4dGVybmFsX2RpZmZfY21kOworCWV4dGVybmFsX2RpZmZfY21kID0gZ2V0ZW52KCJHSVRfRVhURVJOQUxfRElGRiIpOworCWRvbmVfcHJlcGFyaW5nID0gMTsKKwlyZXR1cm4gZXh0ZXJuYWxfZGlmZl9jbWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlmZl90ZW1wZmlsZSB7CisJY29uc3QgY2hhciAqbmFtZTsgLyogZmlsZW5hbWUgZXh0ZXJuYWwgZGlmZiBzaG91bGQgcmVhZCBmcm9tICovCisJY2hhciBoZXhbNDFdOworCWNoYXIgbW9kZVsxMF07CisJY2hhciB0bXBfcGF0aFtQQVRIX01BWF07Cit9IGRpZmZfdGVtcFsyXTsKKworc3RhdGljIGludCBjb3VudF9saW5lcyhjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlpbnQgY291bnQsIGNoLCBjb21wbGV0ZWx5X2VtcHR5ID0gMSwgbmxfanVzdF9zZWVuID0gMDsKKwljb3VudCA9IDA7CisJd2hpbGUgKDAgPCBzaXplLS0pIHsKKwkJY2ggPSAqZGF0YSsrOworCQlpZiAoY2ggPT0gJ1xuJykgeworCQkJY291bnQrKzsKKwkJCW5sX2p1c3Rfc2VlbiA9IDE7CisJCQljb21wbGV0ZWx5X2VtcHR5ID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCW5sX2p1c3Rfc2VlbiA9IDA7CisJCQljb21wbGV0ZWx5X2VtcHR5ID0gMDsKKwkJfQorCX0KKwlpZiAoY29tcGxldGVseV9lbXB0eSkKKwkJcmV0dXJuIDA7CisJaWYgKCFubF9qdXN0X3NlZW4pCisJCWNvdW50Kys7IC8qIG5vIHRyYWlsaW5nIG5ld2xpbmUgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmVfY291bnQoaW50IGNvdW50KQoreworCXN3aXRjaCAoY291bnQpIHsKKwljYXNlIDA6CisJCXByaW50ZigiMCwwIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJpbnRmKCIxIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiMSwlZCIsIGNvdW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X2ZpbGUoaW50IHByZWZpeCwgY29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUsCisJCWNvbnN0IGNoYXIgKnNldCwgY29uc3QgY2hhciAqcmVzZXQpCit7CisJaW50IGNoLCBubF9qdXN0X3NlZW4gPSAxOworCXdoaWxlICgwIDwgc2l6ZS0tKSB7CisJCWNoID0gKmRhdGErKzsKKwkJaWYgKG5sX2p1c3Rfc2VlbikgeworCQkJZnB1dHMoc2V0LCBzdGRvdXQpOworCQkJcHV0Y2hhcihwcmVmaXgpOworCQl9CisJCWlmIChjaCA9PSAnXG4nKSB7CisJCQlubF9qdXN0X3NlZW4gPSAxOworCQkJZnB1dHMocmVzZXQsIHN0ZG91dCk7CisJCX0gZWxzZQorCQkJbmxfanVzdF9zZWVuID0gMDsKKwkJcHV0Y2hhcihjaCk7CisJfQorCWlmICghbmxfanVzdF9zZWVuKQorCQlwcmludGYoIiVzXG5cXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXG4iLCByZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcmV3cml0ZV9kaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWVfYiwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJICAgICAgaW50IGNvbG9yX2RpZmYpCit7CisJaW50IGxjX2EsIGxjX2I7CisJY29uc3QgY2hhciAqbmFtZV9hX3RhYiwgKm5hbWVfYl90YWI7CisJY29uc3QgY2hhciAqbWV0YWluZm8gPSBkaWZmX2dldF9jb2xvcihjb2xvcl9kaWZmLCBESUZGX01FVEFJTkZPKTsKKwljb25zdCBjaGFyICpmcmFnaW5mbyA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRlJBR0lORk8pOworCWNvbnN0IGNoYXIgKm9sZCA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRklMRV9PTEQpOworCWNvbnN0IGNoYXIgKm5ldyA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRklMRV9ORVcpOworCWNvbnN0IGNoYXIgKnJlc2V0ID0gZGlmZl9nZXRfY29sb3IoY29sb3JfZGlmZiwgRElGRl9SRVNFVCk7CisKKwluYW1lX2EgKz0gKCpuYW1lX2EgPT0gJy8nKTsKKwluYW1lX2IgKz0gKCpuYW1lX2IgPT0gJy8nKTsKKwluYW1lX2FfdGFiID0gc3RyY2hyKG5hbWVfYSwgJyAnKSA/ICJcdCIgOiAiIjsKKwluYW1lX2JfdGFiID0gc3RyY2hyKG5hbWVfYiwgJyAnKSA/ICJcdCIgOiAiIjsKKworCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKTsKKwlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHR3bywgMCk7CisJbGNfYSA9IGNvdW50X2xpbmVzKG9uZS0+ZGF0YSwgb25lLT5zaXplKTsKKwlsY19iID0gY291bnRfbGluZXModHdvLT5kYXRhLCB0d28tPnNpemUpOworCXByaW50ZigiJXMtLS0gYS8lcyVzJXNcbiVzKysrIGIvJXMlcyVzXG4lc0BAIC0iLAorCSAgICAgICBtZXRhaW5mbywgbmFtZV9hLCBuYW1lX2FfdGFiLCByZXNldCwKKwkgICAgICAgbWV0YWluZm8sIG5hbWVfYiwgbmFtZV9iX3RhYiwgcmVzZXQsIGZyYWdpbmZvKTsKKwlwcmludF9saW5lX2NvdW50KGxjX2EpOworCXByaW50ZigiICsiKTsKKwlwcmludF9saW5lX2NvdW50KGxjX2IpOworCXByaW50ZigiIEBAJXNcbiIsIHJlc2V0KTsKKwlpZiAobGNfYSkKKwkJY29weV9maWxlKCctJywgb25lLT5kYXRhLCBvbmUtPnNpemUsIG9sZCwgcmVzZXQpOworCWlmIChsY19iKQorCQljb3B5X2ZpbGUoJysnLCB0d28tPmRhdGEsIHR3by0+c2l6ZSwgbmV3LCByZXNldCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9tbWZpbGUobW1maWxlX3QgKm1mLCBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lKQoreworCWlmICghRElGRl9GSUxFX1ZBTElEKG9uZSkpIHsKKwkJbWYtPnB0ciA9IChjaGFyICopIiI7IC8qIGRvZXMgbm90IG1hdHRlciAqLworCQltZi0+c2l6ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwllbHNlIGlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCkpCisJCXJldHVybiAtMTsKKwltZi0+cHRyID0gb25lLT5kYXRhOworCW1mLT5zaXplID0gb25lLT5zaXplOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgeworCW1tZmlsZV90IHRleHQ7CisJbG9uZyBhbGxvYzsKKwlsb25nIGN1cnJlbnQ7IC8qIG91dHB1dCBwb2ludGVyICovCisJaW50IHN1cHByZXNzZWRfbmV3bGluZTsKK307CisKK3N0YXRpYyB2b2lkIGRpZmZfd29yZHNfYXBwZW5kKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQlzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgKmJ1ZmZlcikKK3sKKwlpZiAoYnVmZmVyLT50ZXh0LnNpemUgKyBsZW4gPiBidWZmZXItPmFsbG9jKSB7CisJCWJ1ZmZlci0+YWxsb2MgPSAoYnVmZmVyLT50ZXh0LnNpemUgKyBsZW4pICogMyAvIDI7CisJCWJ1ZmZlci0+dGV4dC5wdHIgPSB4cmVhbGxvYyhidWZmZXItPnRleHQucHRyLCBidWZmZXItPmFsbG9jKTsKKwl9CisJbGluZSsrOworCWxlbi0tOworCW1lbWNweShidWZmZXItPnRleHQucHRyICsgYnVmZmVyLT50ZXh0LnNpemUsIGxpbmUsIGxlbik7CisJYnVmZmVyLT50ZXh0LnNpemUgKz0gbGVuOworfQorCitzdHJ1Y3QgZGlmZl93b3Jkc19kYXRhIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKwlzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgbWludXMsIHBsdXM7Cit9OworCitzdGF0aWMgdm9pZCBwcmludF93b3JkKHN0cnVjdCBkaWZmX3dvcmRzX2J1ZmZlciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQgY29sb3IsCisJCWludCBzdXBwcmVzc19uZXdsaW5lKQoreworCWNvbnN0IGNoYXIgKnB0cjsKKwlpbnQgZW9sID0gMDsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuOworCisJcHRyICA9IGJ1ZmZlci0+dGV4dC5wdHIgKyBidWZmZXItPmN1cnJlbnQ7CisJYnVmZmVyLT5jdXJyZW50ICs9IGxlbjsKKworCWlmIChwdHJbbGVuIC0gMV0gPT0gJ1xuJykgeworCQllb2wgPSAxOworCQlsZW4tLTsKKwl9CisKKwlmcHV0cyhkaWZmX2dldF9jb2xvcigxLCBjb2xvciksIHN0ZG91dCk7CisJZndyaXRlKHB0ciwgbGVuLCAxLCBzdGRvdXQpOworCWZwdXRzKGRpZmZfZ2V0X2NvbG9yKDEsIERJRkZfUkVTRVQpLCBzdGRvdXQpOworCisJaWYgKGVvbCkgeworCQlpZiAoc3VwcHJlc3NfbmV3bGluZSkKKwkJCWJ1ZmZlci0+c3VwcHJlc3NlZF9uZXdsaW5lID0gMTsKKwkJZWxzZQorCQkJcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZuX291dF9kaWZmX3dvcmRzX2F1eCh2b2lkICpwcml2LCBjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgZGlmZl93b3Jkc19kYXRhICpkaWZmX3dvcmRzID0gcHJpdjsKKworCWlmIChkaWZmX3dvcmRzLT5taW51cy5zdXBwcmVzc2VkX25ld2xpbmUpIHsKKwkJaWYgKGxpbmVbMF0gIT0gJysnKQorCQkJcHV0Y2hhcignXG4nKTsKKwkJZGlmZl93b3Jkcy0+bWludXMuc3VwcHJlc3NlZF9uZXdsaW5lID0gMDsKKwl9CisKKwlsZW4tLTsKKwlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnLSc6CisJCQlwcmludF93b3JkKCZkaWZmX3dvcmRzLT5taW51cywgbGVuLCBESUZGX0ZJTEVfT0xELCAxKTsKKwkJCWJyZWFrOworCQljYXNlICcrJzoKKwkJCXByaW50X3dvcmQoJmRpZmZfd29yZHMtPnBsdXMsIGxlbiwgRElGRl9GSUxFX05FVywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCQlwcmludF93b3JkKCZkaWZmX3dvcmRzLT5wbHVzLCBsZW4sIERJRkZfUExBSU4sIDApOworCQkJZGlmZl93b3Jkcy0+bWludXMuY3VycmVudCArPSBsZW47CisJCQlicmVhazsKKwl9Cit9CisKKy8qIHRoaXMgZXhlY3V0ZXMgdGhlIHdvcmQgZGlmZiBvbiB0aGUgYWNjdW11bGF0ZWQgYnVmZmVycyAqLworc3RhdGljIHZvaWQgZGlmZl93b3Jkc19zaG93KHN0cnVjdCBkaWZmX3dvcmRzX2RhdGEgKmRpZmZfd29yZHMpCit7CisJeHBwYXJhbV90IHhwcDsKKwl4ZGVtaXRjb25mX3QgeGVjZmc7CisJeGRlbWl0Y2JfdCBlY2I7CisJbW1maWxlX3QgbWludXMsIHBsdXM7CisJaW50IGk7CisKKwltaW51cy5zaXplID0gZGlmZl93b3Jkcy0+bWludXMudGV4dC5zaXplOworCW1pbnVzLnB0ciA9IHhtYWxsb2MobWludXMuc2l6ZSk7CisJbWVtY3B5KG1pbnVzLnB0ciwgZGlmZl93b3Jkcy0+bWludXMudGV4dC5wdHIsIG1pbnVzLnNpemUpOworCWZvciAoaSA9IDA7IGkgPCBtaW51cy5zaXplOyBpKyspCisJCWlmIChpc3NwYWNlKG1pbnVzLnB0cltpXSkpCisJCQltaW51cy5wdHJbaV0gPSAnXG4nOworCWRpZmZfd29yZHMtPm1pbnVzLmN1cnJlbnQgPSAwOworCisJcGx1cy5zaXplID0gZGlmZl93b3Jkcy0+cGx1cy50ZXh0LnNpemU7CisJcGx1cy5wdHIgPSB4bWFsbG9jKHBsdXMuc2l6ZSk7CisJbWVtY3B5KHBsdXMucHRyLCBkaWZmX3dvcmRzLT5wbHVzLnRleHQucHRyLCBwbHVzLnNpemUpOworCWZvciAoaSA9IDA7IGkgPCBwbHVzLnNpemU7IGkrKykKKwkJaWYgKGlzc3BhY2UocGx1cy5wdHJbaV0pKQorCQkJcGx1cy5wdHJbaV0gPSAnXG4nOworCWRpZmZfd29yZHMtPnBsdXMuY3VycmVudCA9IDA7CisKKwl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCXhlY2ZnLmN0eGxlbiA9IGRpZmZfd29yZHMtPm1pbnVzLmFsbG9jICsgZGlmZl93b3Jkcy0+cGx1cy5hbGxvYzsKKwl4ZWNmZy5mbGFncyA9IDA7CisJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCWVjYi5wcml2ID0gZGlmZl93b3JkczsKKwlkaWZmX3dvcmRzLT54bS5jb25zdW1lID0gZm5fb3V0X2RpZmZfd29yZHNfYXV4OworCXhkbF9kaWZmKCZtaW51cywgJnBsdXMsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisKKwlmcmVlKG1pbnVzLnB0cik7CisJZnJlZShwbHVzLnB0cik7CisJZGlmZl93b3Jkcy0+bWludXMudGV4dC5zaXplID0gZGlmZl93b3Jkcy0+cGx1cy50ZXh0LnNpemUgPSAwOworCisJaWYgKGRpZmZfd29yZHMtPm1pbnVzLnN1cHByZXNzZWRfbmV3bGluZSkgeworCQlwdXRjaGFyKCdcbicpOworCQlkaWZmX3dvcmRzLT5taW51cy5zdXBwcmVzc2VkX25ld2xpbmUgPSAwOworCX0KK30KKworc3RydWN0IGVtaXRfY2FsbGJhY2sgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWludCBucGFyZW50cywgY29sb3JfZGlmZjsKKwljb25zdCBjaGFyICoqbGFiZWxfcGF0aDsKKwlzdHJ1Y3QgZGlmZl93b3Jkc19kYXRhICpkaWZmX3dvcmRzOworCWludCAqZm91bmRfY2hhbmdlc3A7Cit9OworCitzdGF0aWMgdm9pZCBmcmVlX2RpZmZfd29yZHNfZGF0YShzdHJ1Y3QgZW1pdF9jYWxsYmFjayAqZWNiZGF0YSkKK3sKKwlpZiAoZWNiZGF0YS0+ZGlmZl93b3JkcykgeworCQkvKiBmbHVzaCBidWZmZXJzICovCisJCWlmIChlY2JkYXRhLT5kaWZmX3dvcmRzLT5taW51cy50ZXh0LnNpemUgfHwKKwkJCQllY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzLnRleHQuc2l6ZSkKKwkJCWRpZmZfd29yZHNfc2hvdyhlY2JkYXRhLT5kaWZmX3dvcmRzKTsKKworCQlpZiAoZWNiZGF0YS0+ZGlmZl93b3Jkcy0+bWludXMudGV4dC5wdHIpCisJCQlmcmVlIChlY2JkYXRhLT5kaWZmX3dvcmRzLT5taW51cy50ZXh0LnB0cik7CisJCWlmIChlY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzLnRleHQucHRyKQorCQkJZnJlZSAoZWNiZGF0YS0+ZGlmZl93b3Jkcy0+cGx1cy50ZXh0LnB0cik7CisJCWZyZWUoZWNiZGF0YS0+ZGlmZl93b3Jkcyk7CisJCWVjYmRhdGEtPmRpZmZfd29yZHMgPSBOVUxMOworCX0KK30KKworY29uc3QgY2hhciAqZGlmZl9nZXRfY29sb3IoaW50IGRpZmZfdXNlX2NvbG9yLCBlbnVtIGNvbG9yX2RpZmYgaXgpCit7CisJaWYgKGRpZmZfdXNlX2NvbG9yKQorCQlyZXR1cm4gZGlmZl9jb2xvcnNbaXhdOworCXJldHVybiAiIjsKK30KKworc3RhdGljIHZvaWQgZW1pdF9saW5lKGNvbnN0IGNoYXIgKnNldCwgY29uc3QgY2hhciAqcmVzZXQsIGNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJaWYgKGxlbiA+IDAgJiYgbGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJbGVuLS07CisJZnB1dHMoc2V0LCBzdGRvdXQpOworCWZ3cml0ZShsaW5lLCBsZW4sIDEsIHN0ZG91dCk7CisJcHV0cyhyZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbGluZV93aXRoX3dzKGludCBucGFyZW50cywKKwkJY29uc3QgY2hhciAqc2V0LCBjb25zdCBjaGFyICpyZXNldCwgY29uc3QgY2hhciAqd3MsCisJCWNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJaW50IGNvbDAgPSBucGFyZW50czsKKwlpbnQgbGFzdF90YWJfaW5faW5kZW50ID0gLTE7CisJaW50IGxhc3Rfc3BhY2VfaW5faW5kZW50ID0gLTE7CisJaW50IGk7CisJaW50IHRhaWwgPSBsZW47CisJaW50IG5lZWRfaGlnaGxpZ2h0X2xlYWRpbmdfc3BhY2UgPSAwOworCS8qIFRoZSBsaW5lIGlzIGEgbmV3bHkgYWRkZWQgbGluZS4gIERvZXMgaXQgaGF2ZSBmdW5ueSBsZWFkaW5nCisJICogd2hpdGVzcGFjZXM/ICBJbiBpbmRlbnQsIFNQIHNob3VsZCBuZXZlciBwcmVjZWRlIGEgVEFCLgorCSAqLworCWZvciAoaSA9IGNvbDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobGluZVtpXSA9PSAnXHQnKSB7CisJCQlsYXN0X3RhYl9pbl9pbmRlbnQgPSBpOworCQkJaWYgKDAgPD0gbGFzdF9zcGFjZV9pbl9pbmRlbnQpCisJCQkJbmVlZF9oaWdobGlnaHRfbGVhZGluZ19zcGFjZSA9IDE7CisJCX0KKwkJZWxzZSBpZiAobGluZVtpXSA9PSAnICcpCisJCQlsYXN0X3NwYWNlX2luX2luZGVudCA9IGk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlmcHV0cyhzZXQsIHN0ZG91dCk7CisJZndyaXRlKGxpbmUsIGNvbDAsIDEsIHN0ZG91dCk7CisJZnB1dHMocmVzZXQsIHN0ZG91dCk7CisJaWYgKCgoaSA9PSBsZW4pIHx8IGxpbmVbaV0gPT0gJ1xuJykgJiYgaSAhPSBjb2wwKSB7CisJCS8qIFRoZSB3aG9sZSBsaW5lIHdhcyBpbmRlbnQgKi8KKwkJZW1pdF9saW5lKHdzLCByZXNldCwgbGluZSArIGNvbDAsIGxlbiAtIGNvbDApOworCQlyZXR1cm47CisJfQorCWkgPSBjb2wwOworCWlmIChuZWVkX2hpZ2hsaWdodF9sZWFkaW5nX3NwYWNlKSB7CisJCXdoaWxlIChpIDwgbGFzdF90YWJfaW5faW5kZW50KSB7CisJCQlpZiAobGluZVtpXSA9PSAnICcpIHsKKwkJCQlmcHV0cyh3cywgc3Rkb3V0KTsKKwkJCQlwdXRjaGFyKCcgJyk7CisJCQkJZnB1dHMocmVzZXQsIHN0ZG91dCk7CisJCQl9CisJCQllbHNlCisJCQkJcHV0Y2hhcihsaW5lW2ldKTsKKwkJCWkrKzsKKwkJfQorCX0KKwl0YWlsID0gbGVuIC0gMTsKKwlpZiAobGluZVt0YWlsXSA9PSAnXG4nICYmIGkgPCB0YWlsKQorCQl0YWlsLS07CisJd2hpbGUgKGkgPCB0YWlsKSB7CisJCWlmICghaXNzcGFjZShsaW5lW3RhaWxdKSkKKwkJCWJyZWFrOworCQl0YWlsLS07CisJfQorCWlmICgoaSA8IHRhaWwgJiYgbGluZVt0YWlsICsgMV0gIT0gJ1xuJykpIHsKKwkJLyogVGhpcyBoYXMgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhaWwrMS4ubGVuICovCisJCWZwdXRzKHNldCwgc3Rkb3V0KTsKKwkJZndyaXRlKGxpbmUgKyBpLCB0YWlsIC0gaSArIDEsIDEsIHN0ZG91dCk7CisJCWZwdXRzKHJlc2V0LCBzdGRvdXQpOworCQllbWl0X2xpbmUod3MsIHJlc2V0LCBsaW5lICsgdGFpbCArIDEsIGxlbiAtIHRhaWwgLSAxKTsKKwl9CisJZWxzZQorCQllbWl0X2xpbmUoc2V0LCByZXNldCwgbGluZSArIGksIGxlbiAtIGkpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2FkZF9saW5lKGNvbnN0IGNoYXIgKnJlc2V0LCBzdHJ1Y3QgZW1pdF9jYWxsYmFjayAqZWNiZGF0YSwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICp3cyA9IGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfV0hJVEVTUEFDRSk7CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GSUxFX05FVyk7CisKKwlpZiAoISp3cykKKwkJZW1pdF9saW5lKHNldCwgcmVzZXQsIGxpbmUsIGxlbik7CisJZWxzZQorCQllbWl0X2xpbmVfd2l0aF93cyhlY2JkYXRhLT5ucGFyZW50cywgc2V0LCByZXNldCwgd3MsCisJCQkJbGluZSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgZm5fb3V0X2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IGk7CisJaW50IGNvbG9yOworCXN0cnVjdCBlbWl0X2NhbGxiYWNrICplY2JkYXRhID0gcHJpdjsKKwljb25zdCBjaGFyICpzZXQgPSBkaWZmX2dldF9jb2xvcihlY2JkYXRhLT5jb2xvcl9kaWZmLCBESUZGX01FVEFJTkZPKTsKKwljb25zdCBjaGFyICpyZXNldCA9IGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfUkVTRVQpOworCisJKihlY2JkYXRhLT5mb3VuZF9jaGFuZ2VzcCkgPSAxOworCisJaWYgKGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0pIHsKKwkJY29uc3QgY2hhciAqbmFtZV9hX3RhYiwgKm5hbWVfYl90YWI7CisKKwkJbmFtZV9hX3RhYiA9IHN0cmNocihlY2JkYXRhLT5sYWJlbF9wYXRoWzBdLCAnICcpID8gIlx0IiA6ICIiOworCQluYW1lX2JfdGFiID0gc3RyY2hyKGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0sICcgJykgPyAiXHQiIDogIiI7CisKKwkJcHJpbnRmKCIlcy0tLSAlcyVzJXNcbiIsCisJCSAgICAgICBzZXQsIGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0sIHJlc2V0LCBuYW1lX2FfdGFiKTsKKwkJcHJpbnRmKCIlcysrKyAlcyVzJXNcbiIsCisJCSAgICAgICBzZXQsIGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0sIHJlc2V0LCBuYW1lX2JfdGFiKTsKKwkJZWNiZGF0YS0+bGFiZWxfcGF0aFswXSA9IGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0gPSBOVUxMOworCX0KKworCS8qIFRoaXMgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkgZm9yIG5vdyBiZWNhdXNlCisJICogdGhpcyBjb2RlcGF0aCBvbmx5IGRlYWxzIHdpdGggdHdvLXdheSBkaWZmcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIGxpbmVbaV0gPT0gJ0AnOyBpKyspCisJCTsKKwlpZiAoMiA8PSBpICYmIGkgPCBsZW4gJiYgbGluZVtpXSA9PSAnICcpIHsKKwkJZWNiZGF0YS0+bnBhcmVudHMgPSBpIC0gMTsKKwkJZW1pdF9saW5lKGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfRlJBR0lORk8pLAorCQkJICByZXNldCwgbGluZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsZW4gPCBlY2JkYXRhLT5ucGFyZW50cykgeworCQlzZXQgPSByZXNldDsKKwkJZW1pdF9saW5lKHJlc2V0LCByZXNldCwgbGluZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWNvbG9yID0gRElGRl9QTEFJTjsKKwlpZiAoZWNiZGF0YS0+ZGlmZl93b3JkcyAmJiBlY2JkYXRhLT5ucGFyZW50cyAhPSAxKQorCQkvKiBmYWxsIGJhY2sgdG8gbm9ybWFsIGRpZmYgKi8KKwkJZnJlZV9kaWZmX3dvcmRzX2RhdGEoZWNiZGF0YSk7CisJaWYgKGVjYmRhdGEtPmRpZmZfd29yZHMpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJy0nKSB7CisJCQlkaWZmX3dvcmRzX2FwcGVuZChsaW5lLCBsZW4sCisJCQkJCSAgJmVjYmRhdGEtPmRpZmZfd29yZHMtPm1pbnVzKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChsaW5lWzBdID09ICcrJykgeworCQkJZGlmZl93b3Jkc19hcHBlbmQobGluZSwgbGVuLAorCQkJCQkgICZlY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZWNiZGF0YS0+ZGlmZl93b3Jkcy0+bWludXMudGV4dC5zaXplIHx8CisJCSAgICBlY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzLnRleHQuc2l6ZSkKKwkJCWRpZmZfd29yZHNfc2hvdyhlY2JkYXRhLT5kaWZmX3dvcmRzKTsKKwkJbGluZSsrOworCQlsZW4tLTsKKwkJZW1pdF9saW5lKHNldCwgcmVzZXQsIGxpbmUsIGxlbik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVjYmRhdGEtPm5wYXJlbnRzICYmIGxlbjsgaSsrKSB7CisJCWlmIChsaW5lW2ldID09ICctJykKKwkJCWNvbG9yID0gRElGRl9GSUxFX09MRDsKKwkJZWxzZSBpZiAobGluZVtpXSA9PSAnKycpCisJCQljb2xvciA9IERJRkZfRklMRV9ORVc7CisJfQorCisJaWYgKGNvbG9yICE9IERJRkZfRklMRV9ORVcpIHsKKwkJZW1pdF9saW5lKGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIGNvbG9yKSwKKwkJCSAgcmVzZXQsIGxpbmUsIGxlbik7CisJCXJldHVybjsKKwl9CisJZW1pdF9hZGRfbGluZShyZXNldCwgZWNiZGF0YSwgbGluZSwgbGVuKTsKK30KKworc3RhdGljIGNoYXIgKnBwcmludF9yZW5hbWUoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwljb25zdCBjaGFyICpvbGQgPSBhOworCWNvbnN0IGNoYXIgKm5ldyA9IGI7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IHBmeF9sZW5ndGgsIHNmeF9sZW5ndGg7CisJaW50IGxlbl9hID0gc3RybGVuKGEpOworCWludCBsZW5fYiA9IHN0cmxlbihiKTsKKwlpbnQgcWxlbl9hID0gcXVvdGVfY19zdHlsZShhLCBOVUxMLCBOVUxMLCAwKTsKKwlpbnQgcWxlbl9iID0gcXVvdGVfY19zdHlsZShiLCBOVUxMLCBOVUxMLCAwKTsKKworCWlmIChxbGVuX2EgfHwgcWxlbl9iKSB7CisJCWlmIChxbGVuX2EpIGxlbl9hID0gcWxlbl9hOworCQlpZiAocWxlbl9iKSBsZW5fYiA9IHFsZW5fYjsKKwkJbmFtZSA9IHhtYWxsb2MoIGxlbl9hICsgbGVuX2IgKyA1ICk7CisJCWlmIChxbGVuX2EpCisJCQlxdW90ZV9jX3N0eWxlKGEsIG5hbWUsIE5VTEwsIDApOworCQllbHNlCisJCQltZW1jcHkobmFtZSwgYSwgbGVuX2EpOworCQltZW1jcHkobmFtZSArIGxlbl9hLCAiID0+ICIsIDQpOworCQlpZiAocWxlbl9iKQorCQkJcXVvdGVfY19zdHlsZShiLCBuYW1lICsgbGVuX2EgKyA0LCBOVUxMLCAwKTsKKwkJZWxzZQorCQkJbWVtY3B5KG5hbWUgKyBsZW5fYSArIDQsIGIsIGxlbl9iICsgMSk7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCXBmeF9sZW5ndGggPSAwOworCXdoaWxlICgqb2xkICYmICpuZXcgJiYgKm9sZCA9PSAqbmV3KSB7CisJCWlmICgqb2xkID09ICcvJykKKwkJCXBmeF9sZW5ndGggPSBvbGQgLSBhICsgMTsKKwkJb2xkKys7CisJCW5ldysrOworCX0KKworCS8qIEZpbmQgY29tbW9uIHN1ZmZpeCAqLworCW9sZCA9IGEgKyBsZW5fYTsKKwluZXcgPSBiICsgbGVuX2I7CisJc2Z4X2xlbmd0aCA9IDA7CisJd2hpbGUgKGEgPD0gb2xkICYmIGIgPD0gbmV3ICYmICpvbGQgPT0gKm5ldykgeworCQlpZiAoKm9sZCA9PSAnLycpCisJCQlzZnhfbGVuZ3RoID0gbGVuX2EgLSAob2xkIC0gYSk7CisJCW9sZC0tOworCQluZXctLTsKKwl9CisKKwkvKgorCSAqIHBmeHttaWQtYSA9PiBtaWQtYn1zZngKKwkgKiB7cGZ4LWEgPT4gcGZ4LWJ9c2Z4CisJICogcGZ4e3NmeC1hID0+IHNmeC1ifQorCSAqIG5hbWUtYSA9PiBuYW1lLWIKKwkgKi8KKwlpZiAocGZ4X2xlbmd0aCArIHNmeF9sZW5ndGgpIHsKKwkJaW50IGFfbWlkbGVuID0gbGVuX2EgLSBwZnhfbGVuZ3RoIC0gc2Z4X2xlbmd0aDsKKwkJaW50IGJfbWlkbGVuID0gbGVuX2IgLSBwZnhfbGVuZ3RoIC0gc2Z4X2xlbmd0aDsKKwkJaWYgKGFfbWlkbGVuIDwgMCkgYV9taWRsZW4gPSAwOworCQlpZiAoYl9taWRsZW4gPCAwKSBiX21pZGxlbiA9IDA7CisKKwkJbmFtZSA9IHhtYWxsb2MocGZ4X2xlbmd0aCArIGFfbWlkbGVuICsgYl9taWRsZW4gKyBzZnhfbGVuZ3RoICsgNyk7CisJCXNwcmludGYobmFtZSwgIiUuKnN7JS4qcyA9PiAlLipzfSVzIiwKKwkJCXBmeF9sZW5ndGgsIGEsCisJCQlhX21pZGxlbiwgYSArIHBmeF9sZW5ndGgsCisJCQliX21pZGxlbiwgYiArIHBmeF9sZW5ndGgsCisJCQlhICsgbGVuX2EgLSBzZnhfbGVuZ3RoKTsKKwl9CisJZWxzZSB7CisJCW5hbWUgPSB4bWFsbG9jKGxlbl9hICsgbGVuX2IgKyA1KTsKKwkJc3ByaW50ZihuYW1lLCAiJXMgPT4gJXMiLCBhLCBiKTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0cnVjdCBkaWZmc3RhdF90IHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKworCWludCBucjsKKwlpbnQgYWxsb2M7CisJc3RydWN0IGRpZmZzdGF0X2ZpbGUgeworCQljaGFyICpuYW1lOworCQl1bnNpZ25lZCBpc191bm1lcmdlZDoxOworCQl1bnNpZ25lZCBpc19iaW5hcnk6MTsKKwkJdW5zaWduZWQgaXNfcmVuYW1lZDoxOworCQl1bnNpZ25lZCBpbnQgYWRkZWQsIGRlbGV0ZWQ7CisJfSAqKmZpbGVzOworfTsKKworc3RhdGljIHN0cnVjdCBkaWZmc3RhdF9maWxlICpkaWZmc3RhdF9hZGQoc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0LAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWVfYSwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lX2IpCit7CisJc3RydWN0IGRpZmZzdGF0X2ZpbGUgKng7CisJeCA9IHhjYWxsb2Moc2l6ZW9mICgqeCksIDEpOworCWlmIChkaWZmc3RhdC0+bnIgPT0gZGlmZnN0YXQtPmFsbG9jKSB7CisJCWRpZmZzdGF0LT5hbGxvYyA9IGFsbG9jX25yKGRpZmZzdGF0LT5hbGxvYyk7CisJCWRpZmZzdGF0LT5maWxlcyA9IHhyZWFsbG9jKGRpZmZzdGF0LT5maWxlcywKKwkJCQlkaWZmc3RhdC0+YWxsb2MgKiBzaXplb2YoeCkpOworCX0KKwlkaWZmc3RhdC0+ZmlsZXNbZGlmZnN0YXQtPm5yKytdID0geDsKKwlpZiAobmFtZV9iKSB7CisJCXgtPm5hbWUgPSBwcHJpbnRfcmVuYW1lKG5hbWVfYSwgbmFtZV9iKTsKKwkJeC0+aXNfcmVuYW1lZCA9IDE7CisJfQorCWVsc2UKKwkJeC0+bmFtZSA9IHhzdHJkdXAobmFtZV9hKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQgZGlmZnN0YXRfY29uc3VtZSh2b2lkICpwcml2LCBjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQgPSBwcml2OworCXN0cnVjdCBkaWZmc3RhdF9maWxlICp4ID0gZGlmZnN0YXQtPmZpbGVzW2RpZmZzdGF0LT5uciAtIDFdOworCisJaWYgKGxpbmVbMF0gPT0gJysnKQorCQl4LT5hZGRlZCsrOworCWVsc2UgaWYgKGxpbmVbMF0gPT0gJy0nKQorCQl4LT5kZWxldGVkKys7Cit9CisKK2NvbnN0IGNoYXIgbWltZV9ib3VuZGFyeV9sZWFkZXJbXSA9ICItLS0tLS0tLS0tLS0iOworCitzdGF0aWMgaW50IHNjYWxlX2xpbmVhcihpbnQgaXQsIGludCB3aWR0aCwgaW50IG1heF9jaGFuZ2UpCit7CisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgJy0nIGlzIHByaW50ZWQgaWYgdGhlcmUgd2VyZSBkZWxldGlvbnMsCisJICogYW5kIGxpa2V3aXNlIGZvciAnKycuCisJICovCisJaWYgKG1heF9jaGFuZ2UgPCAyKQorCQlyZXR1cm4gaXQ7CisJcmV0dXJuICgoaXQgLSAxKSAqICh3aWR0aCAtIDEpICsgbWF4X2NoYW5nZSAtIDEpIC8gKG1heF9jaGFuZ2UgLSAxKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19uYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJICAgICAgY29uc3QgY2hhciAqcmVzZXQsIGNvbnN0IGNoYXIgKnNldCkKK3sKKwlwcmludGYoIiAlcyVzJS0qcyVzIHwiLCBzZXQsIHByZWZpeCwgbGVuLCBuYW1lLCByZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZ3JhcGgoY2hhciBjaCwgaW50IGNudCwgY29uc3QgY2hhciAqc2V0LCBjb25zdCBjaGFyICpyZXNldCkKK3sKKwlpZiAoY250IDw9IDApCisJCXJldHVybjsKKwlwcmludGYoIiVzIiwgc2V0KTsKKwl3aGlsZSAoY250LS0pCisJCXB1dGNoYXIoY2gpOworCXByaW50ZigiJXMiLCByZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGksIGxlbiwgYWRkLCBkZWwsIHRvdGFsLCBhZGRzID0gMCwgZGVscyA9IDA7CisJaW50IG1heF9jaGFuZ2UgPSAwLCBtYXhfbGVuID0gMDsKKwlpbnQgdG90YWxfZmlsZXMgPSBkYXRhLT5ucjsKKwlpbnQgd2lkdGgsIG5hbWVfd2lkdGg7CisJY29uc3QgY2hhciAqcmVzZXQsICpzZXQsICphZGRfYywgKmRlbF9jOworCisJaWYgKGRhdGEtPm5yID09IDApCisJCXJldHVybjsKKworCXdpZHRoID0gb3B0aW9ucy0+c3RhdF93aWR0aCA/IG9wdGlvbnMtPnN0YXRfd2lkdGggOiA4MDsKKwluYW1lX3dpZHRoID0gb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoID8gb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoIDogNTA7CisKKwkvKiBTYW5pdHk6IGdpdmUgYXQgbGVhc3QgNSBjb2x1bW5zIHRvIHRoZSBncmFwaCwKKwkgKiBidXQgbGVhdmUgYXQgbGVhc3QgMTAgY29sdW1ucyBmb3IgdGhlIG5hbWUuCisJICovCisJaWYgKHdpZHRoIDwgbmFtZV93aWR0aCArIDE1KSB7CisJCWlmIChuYW1lX3dpZHRoIDw9IDI1KQorCQkJd2lkdGggPSBuYW1lX3dpZHRoICsgMTU7CisJCWVsc2UKKwkJCW5hbWVfd2lkdGggPSB3aWR0aCAtIDE1OworCX0KKworCS8qIEZpbmQgdGhlIGxvbmdlc3QgZmlsZW5hbWUgYW5kIG1heCBudW1iZXIgb2YgY2hhbmdlcyAqLworCXJlc2V0ID0gZGlmZl9nZXRfY29sb3Iob3B0aW9ucy0+Y29sb3JfZGlmZiwgRElGRl9SRVNFVCk7CisJc2V0ID0gZGlmZl9nZXRfY29sb3Iob3B0aW9ucy0+Y29sb3JfZGlmZiwgRElGRl9QTEFJTik7CisJYWRkX2MgPSBkaWZmX2dldF9jb2xvcihvcHRpb25zLT5jb2xvcl9kaWZmLCBESUZGX0ZJTEVfTkVXKTsKKwlkZWxfYyA9IGRpZmZfZ2V0X2NvbG9yKG9wdGlvbnMtPmNvbG9yX2RpZmYsIERJRkZfRklMRV9PTEQpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmZpbGUgPSBkYXRhLT5maWxlc1tpXTsKKwkJaW50IGNoYW5nZSA9IGZpbGUtPmFkZGVkICsgZmlsZS0+ZGVsZXRlZDsKKworCQlpZiAoIWZpbGUtPmlzX3JlbmFtZWQpIHsgIC8qIHJlbmFtZXMgYXJlIGFscmVhZHkgcXVvdGVkIGJ5IHBwcmludF9yZW5hbWUgKi8KKwkJCWxlbiA9IHF1b3RlX2Nfc3R5bGUoZmlsZS0+bmFtZSwgTlVMTCwgTlVMTCwgMCk7CisJCQlpZiAobGVuKSB7CisJCQkJY2hhciAqcW5hbWUgPSB4bWFsbG9jKGxlbiArIDEpOworCQkJCXF1b3RlX2Nfc3R5bGUoZmlsZS0+bmFtZSwgcW5hbWUsIE5VTEwsIDApOworCQkJCWZyZWUoZmlsZS0+bmFtZSk7CisJCQkJZmlsZS0+bmFtZSA9IHFuYW1lOworCQkJfQorCQl9CisKKwkJbGVuID0gc3RybGVuKGZpbGUtPm5hbWUpOworCQlpZiAobWF4X2xlbiA8IGxlbikKKwkJCW1heF9sZW4gPSBsZW47CisKKwkJaWYgKGZpbGUtPmlzX2JpbmFyeSB8fCBmaWxlLT5pc191bm1lcmdlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF4X2NoYW5nZSA8IGNoYW5nZSkKKwkJCW1heF9jaGFuZ2UgPSBjaGFuZ2U7CisJfQorCisJLyogQ29tcHV0ZSB0aGUgd2lkdGggb2YgdGhlIGdyYXBoIHBhcnQ7CisJICogMTAgaXMgZm9yIG9uZSBibGFuayBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHBsdXMKKwkgKiAiIHwgY291bnQgIiBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgZ3JhcGguCisJICoKKwkgKiBGcm9tIGhlcmUgb24sIG5hbWVfd2lkdGggaXMgdGhlIHdpZHRoIG9mIHRoZSBuYW1lIGFyZWEsCisJICogYW5kIHdpZHRoIGlzIHRoZSB3aWR0aCBvZiB0aGUgZ3JhcGggYXJlYS4KKwkgKi8KKwluYW1lX3dpZHRoID0gKG5hbWVfd2lkdGggPCBtYXhfbGVuKSA/IG5hbWVfd2lkdGggOiBtYXhfbGVuOworCWlmICh3aWR0aCA8IChuYW1lX3dpZHRoICsgMTApICsgbWF4X2NoYW5nZSkKKwkJd2lkdGggPSB3aWR0aCAtIChuYW1lX3dpZHRoICsgMTApOworCWVsc2UKKwkJd2lkdGggPSBtYXhfY2hhbmdlOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcHJlZml4ID0gIiI7CisJCWNoYXIgKm5hbWUgPSBkYXRhLT5maWxlc1tpXS0+bmFtZTsKKwkJaW50IGFkZGVkID0gZGF0YS0+ZmlsZXNbaV0tPmFkZGVkOworCQlpbnQgZGVsZXRlZCA9IGRhdGEtPmZpbGVzW2ldLT5kZWxldGVkOworCQlpbnQgbmFtZV9sZW47CisKKwkJLyoKKwkJICogInNjYWxlIiB0aGUgZmlsZW5hbWUKKwkJICovCisJCWxlbiA9IG5hbWVfd2lkdGg7CisJCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCQlpZiAobmFtZV93aWR0aCA8IG5hbWVfbGVuKSB7CisJCQljaGFyICpzbGFzaDsKKwkJCXByZWZpeCA9ICIuLi4iOworCQkJbGVuIC09IDM7CisJCQluYW1lICs9IG5hbWVfbGVuIC0gbGVuOworCQkJc2xhc2ggPSBzdHJjaHIobmFtZSwgJy8nKTsKKwkJCWlmIChzbGFzaCkKKwkJCQluYW1lID0gc2xhc2g7CisJCX0KKworCQlpZiAoZGF0YS0+ZmlsZXNbaV0tPmlzX2JpbmFyeSkgeworCQkJc2hvd19uYW1lKHByZWZpeCwgbmFtZSwgbGVuLCByZXNldCwgc2V0KTsKKwkJCXByaW50ZigiICBCaW4gIik7CisJCQlwcmludGYoIiVzJWQlcyIsIGRlbF9jLCBkZWxldGVkLCByZXNldCk7CisJCQlwcmludGYoIiAtPiAiKTsKKwkJCXByaW50ZigiJXMlZCVzIiwgYWRkX2MsIGFkZGVkLCByZXNldCk7CisJCQlwcmludGYoIiBieXRlcyIpOworCQkJcHJpbnRmKCJcbiIpOworCQkJZ290byBmcmVlX2RpZmZzdGF0X2ZpbGU7CisJCX0KKwkJZWxzZSBpZiAoZGF0YS0+ZmlsZXNbaV0tPmlzX3VubWVyZ2VkKSB7CisJCQlzaG93X25hbWUocHJlZml4LCBuYW1lLCBsZW4sIHJlc2V0LCBzZXQpOworCQkJcHJpbnRmKCIgIFVubWVyZ2VkXG4iKTsKKwkJCWdvdG8gZnJlZV9kaWZmc3RhdF9maWxlOworCQl9CisJCWVsc2UgaWYgKCFkYXRhLT5maWxlc1tpXS0+aXNfcmVuYW1lZCAmJgorCQkJIChhZGRlZCArIGRlbGV0ZWQgPT0gMCkpIHsKKwkJCXRvdGFsX2ZpbGVzLS07CisJCQlnb3RvIGZyZWVfZGlmZnN0YXRfZmlsZTsKKwkJfQorCisJCS8qCisJCSAqIHNjYWxlIHRoZSBhZGQvZGVsZXRlCisJCSAqLworCQlhZGQgPSBhZGRlZDsKKwkJZGVsID0gZGVsZXRlZDsKKwkJdG90YWwgPSBhZGQgKyBkZWw7CisJCWFkZHMgKz0gYWRkOworCQlkZWxzICs9IGRlbDsKKworCQlpZiAod2lkdGggPD0gbWF4X2NoYW5nZSkgeworCQkJYWRkID0gc2NhbGVfbGluZWFyKGFkZCwgd2lkdGgsIG1heF9jaGFuZ2UpOworCQkJZGVsID0gc2NhbGVfbGluZWFyKGRlbCwgd2lkdGgsIG1heF9jaGFuZ2UpOworCQkJdG90YWwgPSBhZGQgKyBkZWw7CisJCX0KKwkJc2hvd19uYW1lKHByZWZpeCwgbmFtZSwgbGVuLCByZXNldCwgc2V0KTsKKwkJcHJpbnRmKCIlNWQgIiwgYWRkZWQgKyBkZWxldGVkKTsKKwkJc2hvd19ncmFwaCgnKycsIGFkZCwgYWRkX2MsIHJlc2V0KTsKKwkJc2hvd19ncmFwaCgnLScsIGRlbCwgZGVsX2MsIHJlc2V0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwlmcmVlX2RpZmZzdGF0X2ZpbGU6CisJCWZyZWUoZGF0YS0+ZmlsZXNbaV0tPm5hbWUpOworCQlmcmVlKGRhdGEtPmZpbGVzW2ldKTsKKwl9CisJZnJlZShkYXRhLT5maWxlcyk7CisJcHJpbnRmKCIlcyAlZCBmaWxlcyBjaGFuZ2VkLCAlZCBpbnNlcnRpb25zKCspLCAlZCBkZWxldGlvbnMoLSklc1xuIiwKKwkgICAgICAgc2V0LCB0b3RhbF9maWxlcywgYWRkcywgZGVscywgcmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Nob3J0c3RhdHMoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEpCit7CisJaW50IGksIGFkZHMgPSAwLCBkZWxzID0gMCwgdG90YWxfZmlsZXMgPSBkYXRhLT5ucjsKKworCWlmIChkYXRhLT5uciA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgeworCQlpZiAoIWRhdGEtPmZpbGVzW2ldLT5pc19iaW5hcnkgJiYKKwkJICAgICFkYXRhLT5maWxlc1tpXS0+aXNfdW5tZXJnZWQpIHsKKwkJCWludCBhZGRlZCA9IGRhdGEtPmZpbGVzW2ldLT5hZGRlZDsKKwkJCWludCBkZWxldGVkPSBkYXRhLT5maWxlc1tpXS0+ZGVsZXRlZDsKKwkJCWlmICghZGF0YS0+ZmlsZXNbaV0tPmlzX3JlbmFtZWQgJiYKKwkJCSAgICAoYWRkZWQgKyBkZWxldGVkID09IDApKSB7CisJCQkJdG90YWxfZmlsZXMtLTsKKwkJCX0gZWxzZSB7CisJCQkJYWRkcyArPSBhZGRlZDsKKwkJCQlkZWxzICs9IGRlbGV0ZWQ7CisJCQl9CisJCX0KKwkJZnJlZShkYXRhLT5maWxlc1tpXS0+bmFtZSk7CisJCWZyZWUoZGF0YS0+ZmlsZXNbaV0pOworCX0KKwlmcmVlKGRhdGEtPmZpbGVzKTsKKworCXByaW50ZigiICVkIGZpbGVzIGNoYW5nZWQsICVkIGluc2VydGlvbnMoKyksICVkIGRlbGV0aW9ucygtKVxuIiwKKwkgICAgICAgdG90YWxfZmlsZXMsIGFkZHMsIGRlbHMpOworfQorCitzdGF0aWMgdm9pZCBzaG93X251bXN0YXQoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZmlsZSA9IGRhdGEtPmZpbGVzW2ldOworCisJCWlmIChmaWxlLT5pc19iaW5hcnkpCisJCQlwcmludGYoIi1cdC1cdCIpOworCQllbHNlCisJCQlwcmludGYoIiVkXHQlZFx0IiwgZmlsZS0+YWRkZWQsIGZpbGUtPmRlbGV0ZWQpOworCQlpZiAob3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiAmJiAhZmlsZS0+aXNfcmVuYW1lZCAmJgorCQkgICAgcXVvdGVfY19zdHlsZShmaWxlLT5uYW1lLCBOVUxMLCBOVUxMLCAwKSkKKwkJCXF1b3RlX2Nfc3R5bGUoZmlsZS0+bmFtZSwgTlVMTCwgc3Rkb3V0LCAwKTsKKwkJZWxzZQorCQkJZnB1dHMoZmlsZS0+bmFtZSwgc3Rkb3V0KTsKKwkJcHV0Y2hhcihvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uKTsKKwl9Cit9CisKK3N0cnVjdCBjaGVja2RpZmZfdCB7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeG07CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJaW50IGxpbmVubywgY29sb3JfZGlmZjsKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrZGlmZl9jb25zdW1lKHZvaWQgKnByaXYsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBjaGVja2RpZmZfdCAqZGF0YSA9IHByaXY7CisJY29uc3QgY2hhciAqd3MgPSBkaWZmX2dldF9jb2xvcihkYXRhLT5jb2xvcl9kaWZmLCBESUZGX1dISVRFU1BBQ0UpOworCWNvbnN0IGNoYXIgKnJlc2V0ID0gZGlmZl9nZXRfY29sb3IoZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9SRVNFVCk7CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3IoZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GSUxFX05FVyk7CisKKwlpZiAobGluZVswXSA9PSAnKycpIHsKKwkJaW50IGksIHNwYWNlcyA9IDAsIHNwYWNlX2JlZm9yZV90YWIgPSAwLCB3aGl0ZV9zcGFjZV9hdF9lbmQgPSAwOworCisJCS8qIGNoZWNrIHNwYWNlIGJlZm9yZSB0YWIgKi8KKwkJZm9yIChpID0gMTsgaSA8IGxlbiAmJiAobGluZVtpXSA9PSAnICcgfHwgbGluZVtpXSA9PSAnXHQnKTsgaSsrKQorCQkJaWYgKGxpbmVbaV0gPT0gJyAnKQorCQkJCXNwYWNlcysrOworCQlpZiAobGluZVtpIC0gMV0gPT0gJ1x0JyAmJiBzcGFjZXMpCisJCQlzcGFjZV9iZWZvcmVfdGFiID0gMTsKKworCQkvKiBjaGVjayB3aGl0ZSBzcGFjZSBhdCBsaW5lIGVuZCAqLworCQlpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKQorCQkJbGVuLS07CisJCWlmIChpc3NwYWNlKGxpbmVbbGVuIC0gMV0pKQorCQkJd2hpdGVfc3BhY2VfYXRfZW5kID0gMTsKKworCQlpZiAoc3BhY2VfYmVmb3JlX3RhYiB8fCB3aGl0ZV9zcGFjZV9hdF9lbmQpIHsKKwkJCXByaW50ZigiJXM6JWQ6ICVzIiwgZGF0YS0+ZmlsZW5hbWUsIGRhdGEtPmxpbmVubywgd3MpOworCQkJaWYgKHNwYWNlX2JlZm9yZV90YWIpIHsKKwkJCQlwcmludGYoInNwYWNlIGJlZm9yZSB0YWIiKTsKKwkJCQlpZiAod2hpdGVfc3BhY2VfYXRfZW5kKQorCQkJCQlwdXRjaGFyKCcsJyk7CisJCQl9CisJCQlpZiAod2hpdGVfc3BhY2VfYXRfZW5kKQorCQkJCXByaW50Zigid2hpdGUgc3BhY2UgYXQgZW5kIik7CisJCQlwcmludGYoIjolcyAiLCByZXNldCk7CisJCQllbWl0X2xpbmVfd2l0aF93cygxLCBzZXQsIHJlc2V0LCB3cywgbGluZSwgbGVuKTsKKwkJfQorCisJCWRhdGEtPmxpbmVubysrOworCX0gZWxzZSBpZiAobGluZVswXSA9PSAnICcpCisJCWRhdGEtPmxpbmVubysrOworCWVsc2UgaWYgKGxpbmVbMF0gPT0gJ0AnKSB7CisJCWNoYXIgKnBsdXMgPSBzdHJjaHIobGluZSwgJysnKTsKKwkJaWYgKHBsdXMpCisJCQlkYXRhLT5saW5lbm8gPSBzdHJ0b2wocGx1cywgTlVMTCwgMTApOworCQllbHNlCisJCQlkaWUoImludmFsaWQgZGlmZiIpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRlZmxhdGVfaXQoY2hhciAqZGF0YSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSB1bnNpZ25lZCBsb25nICpyZXN1bHRfc2l6ZSkKK3sKKwlpbnQgYm91bmQ7CisJdW5zaWduZWQgY2hhciAqZGVmbGF0ZWQ7CisJel9zdHJlYW0gc3RyZWFtOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwlib3VuZCA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBzaXplKTsKKwlkZWZsYXRlZCA9IHhtYWxsb2MoYm91bmQpOworCXN0cmVhbS5uZXh0X291dCA9IGRlZmxhdGVkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBib3VuZDsKKworCXN0cmVhbS5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworCXN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCTsgLyogbm90aGluZyAqLworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisJKnJlc3VsdF9zaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlyZXR1cm4gZGVmbGF0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYmluYXJ5X2RpZmZfYm9keShtbWZpbGVfdCAqb25lLCBtbWZpbGVfdCAqdHdvKQoreworCXZvaWQgKmNwOworCXZvaWQgKmRlbHRhOworCXZvaWQgKmRlZmxhdGVkOworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemU7CisJdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgZGVmbGF0ZV9zaXplOworCXVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOworCisJLyogV2UgY291bGQgZG8gZGVmbGF0ZWQgZGVsdGEsIG9yIHdlIGNvdWxkIGRvIGp1c3QgZGVmbGF0ZWQgdHdvLAorCSAqIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorCSAqLworCWRlbHRhID0gTlVMTDsKKwlkZWZsYXRlZCA9IGRlZmxhdGVfaXQodHdvLT5wdHIsIHR3by0+c2l6ZSwgJmRlZmxhdGVfc2l6ZSk7CisJaWYgKG9uZS0+c2l6ZSAmJiB0d28tPnNpemUpIHsKKwkJZGVsdGEgPSBkaWZmX2RlbHRhKG9uZS0+cHRyLCBvbmUtPnNpemUsCisJCQkJICAgdHdvLT5wdHIsIHR3by0+c2l6ZSwKKwkJCQkgICAmZGVsdGFfc2l6ZSwgZGVmbGF0ZV9zaXplKTsKKwkJaWYgKGRlbHRhKSB7CisJCQl2b2lkICp0b19mcmVlID0gZGVsdGE7CisJCQlvcmlnX3NpemUgPSBkZWx0YV9zaXplOworCQkJZGVsdGEgPSBkZWZsYXRlX2l0KGRlbHRhLCBkZWx0YV9zaXplLCAmZGVsdGFfc2l6ZSk7CisJCQlmcmVlKHRvX2ZyZWUpOworCQl9CisJfQorCisJaWYgKGRlbHRhICYmIGRlbHRhX3NpemUgPCBkZWZsYXRlX3NpemUpIHsKKwkJcHJpbnRmKCJkZWx0YSAlbHVcbiIsIG9yaWdfc2l6ZSk7CisJCWZyZWUoZGVmbGF0ZWQpOworCQlkYXRhID0gZGVsdGE7CisJCWRhdGFfc2l6ZSA9IGRlbHRhX3NpemU7CisJfQorCWVsc2UgeworCQlwcmludGYoImxpdGVyYWwgJWx1XG4iLCB0d28tPnNpemUpOworCQlmcmVlKGRlbHRhKTsKKwkJZGF0YSA9IGRlZmxhdGVkOworCQlkYXRhX3NpemUgPSBkZWZsYXRlX3NpemU7CisJfQorCisJLyogZW1pdCBkYXRhIGVuY29kZWQgaW4gYmFzZTg1ICovCisJY3AgPSBkYXRhOworCXdoaWxlIChkYXRhX3NpemUpIHsKKwkJaW50IGJ5dGVzID0gKDUyIDwgZGF0YV9zaXplKSA/IDUyIDogZGF0YV9zaXplOworCQljaGFyIGxpbmVbNzBdOworCQlkYXRhX3NpemUgLT0gYnl0ZXM7CisJCWlmIChieXRlcyA8PSAyNikKKwkJCWxpbmVbMF0gPSBieXRlcyArICdBJyAtIDE7CisJCWVsc2UKKwkJCWxpbmVbMF0gPSBieXRlcyAtIDI2ICsgJ2EnIC0gMTsKKwkJZW5jb2RlXzg1KGxpbmUgKyAxLCBjcCwgYnl0ZXMpOworCQljcCA9IChjaGFyICopIGNwICsgYnl0ZXM7CisJCXB1dHMobGluZSk7CisJfQorCXByaW50ZigiXG4iKTsKKwlmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2JpbmFyeV9kaWZmKG1tZmlsZV90ICpvbmUsIG1tZmlsZV90ICp0d28pCit7CisJcHJpbnRmKCJHSVQgYmluYXJ5IHBhdGNoXG4iKTsKKwllbWl0X2JpbmFyeV9kaWZmX2JvZHkob25lLCB0d28pOworCWVtaXRfYmluYXJ5X2RpZmZfYm9keSh0d28sIG9uZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2RpZmZfYXR0cl9jaGVjayhzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfZGlmZjsKKworCWlmICghYXR0cl9kaWZmKQorCQlhdHRyX2RpZmYgPSBnaXRfYXR0cigiZGlmZiIsIDQpOworCWNoZWNrLT5hdHRyID0gYXR0cl9kaWZmOworfQorCitzdGF0aWMgaW50IGZpbGVfaXNfYmluYXJ5KHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrIGF0dHJfZGlmZl9jaGVjazsKKworCXNldHVwX2RpZmZfYXR0cl9jaGVjaygmYXR0cl9kaWZmX2NoZWNrKTsKKwlpZiAoIWdpdF9jaGVja2F0dHIob25lLT5wYXRoLCAxLCAmYXR0cl9kaWZmX2NoZWNrKSkgeworCQljb25zdCBjaGFyICp2YWx1ZSA9IGF0dHJfZGlmZl9jaGVjay52YWx1ZTsKKwkJaWYgKEFUVFJfVFJVRSh2YWx1ZSkpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoQVRUUl9GQUxTRSh2YWx1ZSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIW9uZS0+ZGF0YSkgeworCQlpZiAoIURJRkZfRklMRV9WQUxJRChvbmUpKQorCQkJcmV0dXJuIDA7CisJCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKTsKKwl9CisJcmV0dXJuIGJ1ZmZlcl9pc19iaW5hcnkob25lLT5kYXRhLCBvbmUtPnNpemUpOworfQorCitzdGF0aWMgdm9pZCBidWlsdGluX2RpZmYoY29uc3QgY2hhciAqbmFtZV9hLAorCQkJIGNvbnN0IGNoYXIgKm5hbWVfYiwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28sCisJCQkgY29uc3QgY2hhciAqeGZybV9tc2csCisJCQkgc3RydWN0IGRpZmZfb3B0aW9ucyAqbywKKwkJCSBpbnQgY29tcGxldGVfcmV3cml0ZSkKK3sKKwltbWZpbGVfdCBtZjEsIG1mMjsKKwljb25zdCBjaGFyICpsYmxbMl07CisJY2hhciAqYV9vbmUsICpiX3R3bzsKKwljb25zdCBjaGFyICpzZXQgPSBkaWZmX2dldF9jb2xvcihvLT5jb2xvcl9kaWZmLCBESUZGX01FVEFJTkZPKTsKKwljb25zdCBjaGFyICpyZXNldCA9IGRpZmZfZ2V0X2NvbG9yKG8tPmNvbG9yX2RpZmYsIERJRkZfUkVTRVQpOworCisJYV9vbmUgPSBxdW90ZV90d28oImEvIiwgbmFtZV9hICsgKCpuYW1lX2EgPT0gJy8nKSk7CisJYl90d28gPSBxdW90ZV90d28oImIvIiwgbmFtZV9iICsgKCpuYW1lX2IgPT0gJy8nKSk7CisJbGJsWzBdID0gRElGRl9GSUxFX1ZBTElEKG9uZSkgPyBhX29uZSA6ICIvZGV2L251bGwiOworCWxibFsxXSA9IERJRkZfRklMRV9WQUxJRCh0d28pID8gYl90d28gOiAiL2Rldi9udWxsIjsKKwlwcmludGYoIiVzZGlmZiAtLWdpdCAlcyAlcyVzXG4iLCBzZXQsIGFfb25lLCBiX3R3bywgcmVzZXQpOworCWlmIChsYmxbMF1bMF0gPT0gJy8nKSB7CisJCS8qIC9kZXYvbnVsbCAqLworCQlwcmludGYoIiVzbmV3IGZpbGUgbW9kZSAlMDZvJXNcbiIsIHNldCwgdHdvLT5tb2RlLCByZXNldCk7CisJCWlmICh4ZnJtX21zZyAmJiB4ZnJtX21zZ1swXSkKKwkJCXByaW50ZigiJXMlcyVzXG4iLCBzZXQsIHhmcm1fbXNnLCByZXNldCk7CisJfQorCWVsc2UgaWYgKGxibFsxXVswXSA9PSAnLycpIHsKKwkJcHJpbnRmKCIlc2RlbGV0ZWQgZmlsZSBtb2RlICUwNm8lc1xuIiwgc2V0LCBvbmUtPm1vZGUsIHJlc2V0KTsKKwkJaWYgKHhmcm1fbXNnICYmIHhmcm1fbXNnWzBdKQorCQkJcHJpbnRmKCIlcyVzJXNcbiIsIHNldCwgeGZybV9tc2csIHJlc2V0KTsKKwl9CisJZWxzZSB7CisJCWlmIChvbmUtPm1vZGUgIT0gdHdvLT5tb2RlKSB7CisJCQlwcmludGYoIiVzb2xkIG1vZGUgJTA2byVzXG4iLCBzZXQsIG9uZS0+bW9kZSwgcmVzZXQpOworCQkJcHJpbnRmKCIlc25ldyBtb2RlICUwNm8lc1xuIiwgc2V0LCB0d28tPm1vZGUsIHJlc2V0KTsKKwkJfQorCQlpZiAoeGZybV9tc2cgJiYgeGZybV9tc2dbMF0pCisJCQlwcmludGYoIiVzJXMlc1xuIiwgc2V0LCB4ZnJtX21zZywgcmVzZXQpOworCQkvKgorCQkgKiB3ZSBkbyBub3QgcnVuIGRpZmYgYmV0d2VlbiBkaWZmZXJlbnQga2luZAorCQkgKiBvZiBvYmplY3RzLgorCQkgKi8KKwkJaWYgKChvbmUtPm1vZGUgXiB0d28tPm1vZGUpICYgU19JRk1UKQorCQkJZ290byBmcmVlX2FiX2FuZF9yZXR1cm47CisJCWlmIChjb21wbGV0ZV9yZXdyaXRlKSB7CisJCQllbWl0X3Jld3JpdGVfZGlmZihuYW1lX2EsIG5hbWVfYiwgb25lLCB0d28sCisJCQkJCW8tPmNvbG9yX2RpZmYpOworCQkJby0+Zm91bmRfY2hhbmdlcyA9IDE7CisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJfQorCX0KKworCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAoIW8tPnRleHQgJiYgKGZpbGVfaXNfYmluYXJ5KG9uZSkgfHwgZmlsZV9pc19iaW5hcnkodHdvKSkpIHsKKwkJLyogUXVpdGUgY29tbW9uIGNvbmZ1c2luZyBjYXNlICovCisJCWlmIChtZjEuc2l6ZSA9PSBtZjIuc2l6ZSAmJgorCQkgICAgIW1lbWNtcChtZjEucHRyLCBtZjIucHRyLCBtZjEuc2l6ZSkpCisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJaWYgKG8tPmJpbmFyeSkKKwkJCWVtaXRfYmluYXJ5X2RpZmYoJm1mMSwgJm1mMik7CisJCWVsc2UKKwkJCXByaW50ZigiQmluYXJ5IGZpbGVzICVzIGFuZCAlcyBkaWZmZXJcbiIsCisJCQkgICAgICAgbGJsWzBdLCBsYmxbMV0pOworCQlvLT5mb3VuZF9jaGFuZ2VzID0gMTsKKwl9CisJZWxzZSB7CisJCS8qIENyYXp5IHhkbCBpbnRlcmZhY2VzLi4gKi8KKwkJY29uc3QgY2hhciAqZGlmZm9wdHMgPSBnZXRlbnYoIkdJVF9ESUZGX09QVFMiKTsKKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKwkJc3RydWN0IGVtaXRfY2FsbGJhY2sgZWNiZGF0YTsKKworCQltZW1zZXQoJmVjYmRhdGEsIDAsIHNpemVvZihlY2JkYXRhKSk7CisJCWVjYmRhdGEubGFiZWxfcGF0aCA9IGxibDsKKwkJZWNiZGF0YS5jb2xvcl9kaWZmID0gby0+Y29sb3JfZGlmZjsKKwkJZWNiZGF0YS5mb3VuZF9jaGFuZ2VzcCA9ICZvLT5mb3VuZF9jaGFuZ2VzOworCQl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMIHwgby0+eGRsX29wdHM7CisJCXhlY2ZnLmN0eGxlbiA9IG8tPmNvbnRleHQ7CisJCXhlY2ZnLmZsYWdzID0gWERMX0VNSVRfRlVOQ05BTUVTOworCQlpZiAoIWRpZmZvcHRzKQorCQkJOworCQllbHNlIGlmICghcHJlZml4Y21wKGRpZmZvcHRzLCAiLS11bmlmaWVkPSIpKQorCQkJeGVjZmcuY3R4bGVuID0gc3RydG91bChkaWZmb3B0cyArIDEwLCBOVUxMLCAxMCk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoZGlmZm9wdHMsICItdSIpKQorCQkJeGVjZmcuY3R4bGVuID0gc3RydG91bChkaWZmb3B0cyArIDIsIE5VTEwsIDEwKTsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9ICZlY2JkYXRhOworCQllY2JkYXRhLnhtLmNvbnN1bWUgPSBmbl9vdXRfY29uc3VtZTsKKwkJaWYgKG8tPmNvbG9yX2RpZmZfd29yZHMpCisJCQllY2JkYXRhLmRpZmZfd29yZHMgPQorCQkJCXhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkaWZmX3dvcmRzX2RhdGEpKTsKKwkJeGRsX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwkJaWYgKG8tPmNvbG9yX2RpZmZfd29yZHMpCisJCQlmcmVlX2RpZmZfd29yZHNfZGF0YSgmZWNiZGF0YSk7CisJfQorCisgZnJlZV9hYl9hbmRfcmV0dXJuOgorCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKG9uZSk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEodHdvKTsKKwlmcmVlKGFfb25lKTsKKwlmcmVlKGJfdHdvKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWx0aW5fZGlmZnN0YXQoY29uc3QgY2hhciAqbmFtZV9hLCBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28sCisJCQkgICAgIHN0cnVjdCBkaWZmc3RhdF90ICpkaWZmc3RhdCwKKwkJCSAgICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqbywKKwkJCSAgICAgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJbW1maWxlX3QgbWYxLCBtZjI7CisJc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmRhdGE7CisKKwlkYXRhID0gZGlmZnN0YXRfYWRkKGRpZmZzdGF0LCBuYW1lX2EsIG5hbWVfYik7CisKKwlpZiAoIW9uZSB8fCAhdHdvKSB7CisJCWRhdGEtPmlzX3VubWVyZ2VkID0gMTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY29tcGxldGVfcmV3cml0ZSkgeworCQlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCk7CisJCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWModHdvLCAwKTsKKwkJZGF0YS0+ZGVsZXRlZCA9IGNvdW50X2xpbmVzKG9uZS0+ZGF0YSwgb25lLT5zaXplKTsKKwkJZGF0YS0+YWRkZWQgPSBjb3VudF9saW5lcyh0d28tPmRhdGEsIHR3by0+c2l6ZSk7CisJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCX0KKwlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgb25lKSA8IDAgfHwgZmlsbF9tbWZpbGUoJm1mMiwgdHdvKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJaWYgKGZpbGVfaXNfYmluYXJ5KG9uZSkgfHwgZmlsZV9pc19iaW5hcnkodHdvKSkgeworCQlkYXRhLT5pc19iaW5hcnkgPSAxOworCQlkYXRhLT5hZGRlZCA9IG1mMi5zaXplOworCQlkYXRhLT5kZWxldGVkID0gbWYxLnNpemU7CisJfSBlbHNlIHsKKwkJLyogQ3JhenkgeGRsIGludGVyZmFjZXMuLiAqLworCQl4cHBhcmFtX3QgeHBwOworCQl4ZGVtaXRjb25mX3QgeGVjZmc7CisJCXhkZW1pdGNiX3QgZWNiOworCisJCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUwgfCBvLT54ZGxfb3B0czsKKwkJeGVjZmcuY3R4bGVuID0gMDsKKwkJeGVjZmcuZmxhZ3MgPSAwOworCQllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJCWVjYi5wcml2ID0gZGlmZnN0YXQ7CisJCXhkbF9kaWZmKCZtZjEsICZtZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJfQorCisgZnJlZV9hbmRfcmV0dXJuOgorCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKG9uZSk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEodHdvKTsKK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9jaGVja2RpZmYoY29uc3QgY2hhciAqbmFtZV9hLCBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28sIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJbW1maWxlX3QgbWYxLCBtZjI7CisJc3RydWN0IGNoZWNrZGlmZl90IGRhdGE7CisKKwlpZiAoIXR3bykKKwkJcmV0dXJuOworCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWRhdGEueG0uY29uc3VtZSA9IGNoZWNrZGlmZl9jb25zdW1lOworCWRhdGEuZmlsZW5hbWUgPSBuYW1lX2IgPyBuYW1lX2IgOiBuYW1lX2E7CisJZGF0YS5saW5lbm8gPSAwOworCWRhdGEuY29sb3JfZGlmZiA9IG8tPmNvbG9yX2RpZmY7CisKKwlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgb25lKSA8IDAgfHwgZmlsbF9tbWZpbGUoJm1mMiwgdHdvKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJaWYgKGZpbGVfaXNfYmluYXJ5KHR3bykpCisJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCWVsc2UgeworCQkvKiBDcmF6eSB4ZGwgaW50ZXJmYWNlcy4uICovCisJCXhwcGFyYW1fdCB4cHA7CisJCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwkJeGRlbWl0Y2JfdCBlY2I7CisKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwkJeGVjZmcuY3R4bGVuID0gMDsKKwkJeGVjZmcuZmxhZ3MgPSAwOworCQllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJCWVjYi5wcml2ID0gJmRhdGE7CisJCXhkbF9kaWZmKCZtZjEsICZtZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJfQorIGZyZWVfYW5kX3JldHVybjoKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShvbmUpOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHR3byk7Cit9CisKK3N0cnVjdCBkaWZmX2ZpbGVzcGVjICphbGxvY19maWxlc3BlYyhjb25zdCBjaGFyICpwYXRoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcGVjID0geG1hbGxvYyhzaXplb2YoKnNwZWMpICsgbmFtZWxlbiArIDEpOworCisJbWVtc2V0KHNwZWMsIDAsIHNpemVvZigqc3BlYykpOworCXNwZWMtPnBhdGggPSAoY2hhciAqKShzcGVjICsgMSk7CisJbWVtY3B5KHNwZWMtPnBhdGgsIHBhdGgsIG5hbWVsZW4rMSk7CisJcmV0dXJuIHNwZWM7Cit9CisKK3ZvaWQgZmlsbF9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3BlYywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJICAgdW5zaWduZWQgc2hvcnQgbW9kZSkKK3sKKwlpZiAobW9kZSkgeworCQlzcGVjLT5tb2RlID0gY2Fub25fbW9kZShtb2RlKTsKKwkJaGFzaGNweShzcGVjLT5zaGExLCBzaGExKTsKKwkJc3BlYy0+c2hhMV92YWxpZCA9ICFpc19udWxsX3NoYTEoc2hhMSk7CisJfQorfQorCisvKgorICogR2l2ZW4gYSBuYW1lIGFuZCBzaGExIHBhaXIsIGlmIHRoZSBpbmRleCB0ZWxscyB1cyB0aGUgZmlsZSBpbgorICogdGhlIHdvcmsgdHJlZSBoYXMgdGhhdCBvYmplY3QgY29udGVudHMsIHJldHVybiB0cnVlLCBzbyB0aGF0CisgKiBwcmVwYXJlX3RlbXBfZmlsZSgpIGRvZXMgbm90IGhhdmUgdG8gaW5mbGF0ZSBhbmQgZXh0cmFjdC4KKyAqLworc3RhdGljIGludCByZXVzZV93b3JrdHJlZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCB3YW50X2ZpbGUpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgcG9zLCBsZW47CisKKwkvKiBXZSBkbyBub3QgcmVhZCB0aGUgY2FjaGUgb3Vyc2VsdmVzIGhlcmUsIGJlY2F1c2UgdGhlCisJICogYmVuY2htYXJrIHdpdGggbXkgcHJldmlvdXMgdmVyc2lvbiB0aGF0IGFsd2F5cyByZWFkcyBjYWNoZQorCSAqIHNob3dzIHRoYXQgaXQgbWFrZXMgdGhpbmdzIHdvcnNlIGZvciBkaWZmLXRyZWUgY29tcGFyaW5nCisJICogdHdvIGxpbnV4LTIuNiBrZXJuZWwgdHJlZXMgaW4gYW4gYWxyZWFkeSBjaGVja2VkIG91dCB3b3JrCisJICogdHJlZS4gIFRoaXMgaXMgYmVjYXVzZSBtb3N0IGRpZmYtdHJlZSBjb21wYXJpc29ucyBkZWFsIHdpdGgKKwkgKiBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIGZpbGVzLCB3aGlsZSByZWFkaW5nIHRoZSBjYWNoZSBpcworCSAqIGV4cGVuc2l2ZSBmb3IgYSBsYXJnZSBwcm9qZWN0LCBhbmQgaXRzIGNvc3Qgb3V0d2VpZ2hzIHRoZQorCSAqIHNhdmluZ3Mgd2UgZ2V0IGJ5IG5vdCBpbmZsYXRpbmcgdGhlIG9iamVjdCB0byBhIHRlbXBvcmFyeQorCSAqIGZpbGUuICBQcmFjdGljYWxseSwgdGhpcyBjb2RlIG9ubHkgaGVscHMgd2hlbiB3ZSBhcmUgdXNlZAorCSAqIGJ5IGRpZmYtY2FjaGUgLS1jYWNoZWQsIHdoaWNoIGRvZXMgcmVhZCB0aGUgY2FjaGUgYmVmb3JlCisJICogY2FsbGluZyB1cy4KKwkgKi8KKwlpZiAoIWFjdGl2ZV9jYWNoZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSB3YW50IHRvIGF2b2lkIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpZiBvdXIgY2FsbGVyCisJICogZG9lc24ndCBuZWVkIHRoZSBkYXRhIGluIGEgbm9ybWFsIGZpbGUsIHRoaXMgc3lzdGVtCisJICogaXMgcmF0aGVyIHNsb3cgd2l0aCBpdHMgc3RhdC9vcGVuL21tYXAvY2xvc2Ugc3lzY2FsbHMsCisJICogYW5kIHRoZSBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgcGFjayBmaWxlLiAgVGhlIHBhY2sKKwkgKiBpcyBwcm9iYWJseSBhbHJlYWR5IG9wZW4gYW5kIHdpbGwgYmUgZmFzdGVyIHRvIG9idGFpbgorCSAqIHRoZSBkYXRhIHRocm91Z2ggdGhhbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuICBMb29zZQorCSAqIG9iamVjdHMgaG93ZXZlciB3b3VsZCB0ZW5kIHRvIGJlIHNsb3dlciBhcyB0aGV5IG5lZWQKKwkgKiB0byBiZSBpbmRpdmlkdWFsbHkgb3BlbmVkIGFuZCBpbmZsYXRlZC4KKwkgKi8KKwlpZiAoIUZBU1RfV09SS0lOR19ESVJFQ1RPUlkgJiYgIXdhbnRfZmlsZSAmJiBoYXNfc2hhMV9wYWNrKHNoYTEsIE5VTEwpKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlwb3MgPSBjYWNoZV9uYW1lX3BvcyhuYW1lLCBsZW4pOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gMDsKKwljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCWlmICgobHN0YXQobmFtZSwgJnN0KSA8IDApIHx8CisJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8IC8qIGNhcmVmdWwhICovCisJICAgIGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMCkgfHwKKwkgICAgaGFzaGNtcChzaGExLCBjZS0+c2hhMSkpCisJCXJldHVybiAwOworCS8qIHdlIHJldHVybiAxIG9ubHkgd2hlbiB3ZSBjYW4gc3RhdCwgaXQgaXMgYSByZWd1bGFyIGZpbGUsCisJICogc3RhdCBpbmZvcm1hdGlvbiBtYXRjaGVzLCBhbmQgc2hhMSByZWNvcmRlZCBpbiB0aGUgY2FjaGUKKwkgKiBtYXRjaGVzLiAgSS5lLiB3ZSBrbm93IHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgcmVhbGx5IGlzCisJICogdGhlIHNhbWUgYXMgdGhlIDxuYW1lLCBzaGExPiBwYWlyLgorCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBvcHVsYXRlX2Zyb21fc3RkaW4oc3RydWN0IGRpZmZfZmlsZXNwZWMgKnMpCit7CisjZGVmaW5lIElOQ1JFTUVOVCAxMDI0CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzc2l6ZV90IGdvdDsKKworCXNpemUgPSAwOworCWJ1ZiA9IE5VTEw7CisJd2hpbGUgKDEpIHsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCBzaXplICsgSU5DUkVNRU5UKTsKKwkJZ290ID0geHJlYWQoMCwgYnVmICsgc2l6ZSwgSU5DUkVNRU5UKTsKKwkJaWYgKCFnb3QpCisJCQlicmVhazsgLyogRU9GICovCisJCWlmIChnb3QgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gc3RkaW4gJXMiLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJc2l6ZSArPSBnb3Q7CisJfQorCXMtPnNob3VsZF9tdW5tYXAgPSAwOworCXMtPmRhdGEgPSBidWY7CisJcy0+c2l6ZSA9IHNpemU7CisJcy0+c2hvdWxkX2ZyZWUgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpZmZfcG9wdWxhdGVfZ2l0bGluayhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcywgaW50IHNpemVfb25seSkKK3sKKwlpbnQgbGVuOworCWNoYXIgKmRhdGEgPSB4bWFsbG9jKDEwMCk7CisJbGVuID0gc25wcmludGYoZGF0YSwgMTAwLAorCQkiU3VicHJvamVjdCBjb21taXQgJXNcbiIsIHNoYTFfdG9faGV4KHMtPnNoYTEpKTsKKwlzLT5kYXRhID0gZGF0YTsKKwlzLT5zaXplID0gbGVuOworCXMtPnNob3VsZF9mcmVlID0gMTsKKwlpZiAoc2l6ZV9vbmx5KSB7CisJCXMtPmRhdGEgPSBOVUxMOworCQlmcmVlKGRhdGEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoaWxlIGRvaW5nIHJlbmFtZSBkZXRlY3Rpb24gYW5kIHBpY2theGUgb3BlcmF0aW9uLCB3ZSBtYXkgbmVlZCB0bworICogZ3JhYiB0aGUgZGF0YSBmb3IgdGhlIGJsb2IgKG9yIGZpbGUpIGZvciBvdXIgb3duIGluLWNvcmUgY29tcGFyaXNvbi4KKyAqIGRpZmZfZmlsZXNwZWMgaGFzIGRhdGEgYW5kIHNpemUgZmllbGRzIGZvciB0aGlzIHB1cnBvc2UuCisgKi8KK2ludCBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzLCBpbnQgc2l6ZV9vbmx5KQoreworCWludCBlcnIgPSAwOworCWlmICghRElGRl9GSUxFX1ZBTElEKHMpKQorCQlkaWUoImludGVybmFsIGVycm9yOiBhc2tpbmcgdG8gcG9wdWxhdGUgaW52YWxpZCBmaWxlLiIpOworCWlmIChTX0lTRElSKHMtPm1vZGUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocy0+ZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2l6ZV9vbmx5ICYmIDAgPCBzLT5zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTRElSTE5LKHMtPm1vZGUpKQorCQlyZXR1cm4gZGlmZl9wb3B1bGF0ZV9naXRsaW5rKHMsIHNpemVfb25seSk7CisKKwlpZiAoIXMtPnNoYTFfdmFsaWQgfHwKKwkgICAgcmV1c2Vfd29ya3RyZWVfZmlsZShzLT5wYXRoLCBzLT5zaGExLCAwKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkOworCQljaGFyICpidWY7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQlpZiAoIXN0cmNtcChzLT5wYXRoLCAiLSIpKQorCQkJcmV0dXJuIHBvcHVsYXRlX2Zyb21fc3RkaW4ocyk7CisKKwkJaWYgKGxzdGF0KHMtPnBhdGgsICZzdCkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQllcnJfZW1wdHk6CisJCQkJZXJyID0gLTE7CisJCQllbXB0eToKKwkJCQlzLT5kYXRhID0gKGNoYXIgKikiIjsKKwkJCQlzLT5zaXplID0gMDsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJCXMtPnNpemUgPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCQlpZiAoIXMtPnNpemUpCisJCQlnb3RvIGVtcHR5OworCQlpZiAoc2l6ZV9vbmx5KQorCQkJcmV0dXJuIDA7CisJCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQlpbnQgcmV0OworCQkJcy0+ZGF0YSA9IHhtYWxsb2Mocy0+c2l6ZSk7CisJCQlzLT5zaG91bGRfZnJlZSA9IDE7CisJCQlyZXQgPSByZWFkbGluayhzLT5wYXRoLCBzLT5kYXRhLCBzLT5zaXplKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnJlZShzLT5kYXRhKTsKKwkJCQlnb3RvIGVycl9lbXB0eTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWZkID0gb3BlbihzLT5wYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlnb3RvIGVycl9lbXB0eTsKKwkJcy0+ZGF0YSA9IHhtbWFwKE5VTEwsIHMtPnNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwkJY2xvc2UoZmQpOworCQlzLT5zaG91bGRfbXVubWFwID0gMTsKKworCQkvKgorCQkgKiBDb252ZXJ0IGZyb20gd29ya2luZyB0cmVlIGZvcm1hdCB0byBjYW5vbmljYWwgZ2l0IGZvcm1hdAorCQkgKi8KKwkJc2l6ZSA9IHMtPnNpemU7CisJCWJ1ZiA9IGNvbnZlcnRfdG9fZ2l0KHMtPnBhdGgsIHMtPmRhdGEsICZzaXplKTsKKwkJaWYgKGJ1ZikgeworCQkJbXVubWFwKHMtPmRhdGEsIHMtPnNpemUpOworCQkJcy0+c2hvdWxkX211bm1hcCA9IDA7CisJCQlzLT5kYXRhID0gYnVmOworCQkJcy0+c2l6ZSA9IHNpemU7CisJCQlzLT5zaG91bGRfZnJlZSA9IDE7CisJCX0KKwl9CisJZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJaWYgKHNpemVfb25seSkKKwkJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHMtPnNoYTEsICZzLT5zaXplKTsKKwkJZWxzZSB7CisJCQlzLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUocy0+c2hhMSwgJnR5cGUsICZzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9mcmVlID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcykKK3sKKwlpZiAocy0+c2hvdWxkX2ZyZWUpCisJCWZyZWUocy0+ZGF0YSk7CisJZWxzZSBpZiAocy0+c2hvdWxkX211bm1hcCkKKwkJbXVubWFwKHMtPmRhdGEsIHMtPnNpemUpOworCisJaWYgKHMtPnNob3VsZF9mcmVlIHx8IHMtPnNob3VsZF9tdW5tYXApIHsKKwkJcy0+c2hvdWxkX2ZyZWUgPSBzLT5zaG91bGRfbXVubWFwID0gMDsKKwkJcy0+ZGF0YSA9IE5VTEw7CisJfQorCWZyZWUocy0+Y250X2RhdGEpOworCXMtPmNudF9kYXRhID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHJlcF90ZW1wX2Jsb2Ioc3RydWN0IGRpZmZfdGVtcGZpbGUgKnRlbXAsCisJCQkgICB2b2lkICpibG9iLAorCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgIGludCBtb2RlKQoreworCWludCBmZDsKKworCWZkID0gZ2l0X21rc3RlbXAodGVtcC0+dG1wX3BhdGgsIFBBVEhfTUFYLCAiLmRpZmZfWFhYWFhYIik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXAtZmlsZSIpOworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBibG9iLCBzaXplKSAhPSBzaXplKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0ZW1wLWZpbGUiKTsKKwljbG9zZShmZCk7CisJdGVtcC0+bmFtZSA9IHRlbXAtPnRtcF9wYXRoOworCXN0cmNweSh0ZW1wLT5oZXgsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl0ZW1wLT5oZXhbNDBdID0gMDsKKwlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfdGVtcF9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl90ZW1wZmlsZSAqdGVtcCwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaWYgKCFESUZGX0ZJTEVfVkFMSUQob25lKSkgeworCW5vdF9hX3ZhbGlkX2ZpbGU6CisJCS8qIEEgJy0nIGVudHJ5IHByb2R1Y2VzIHRoaXMgZm9yIGZpbGUtMiwgYW5kCisJCSAqIGEgJysnIGVudHJ5IHByb2R1Y2VzIHRoaXMgZm9yIGZpbGUtMS4KKwkJICovCisJCXRlbXAtPm5hbWUgPSAiL2Rldi9udWxsIjsKKwkJc3RyY3B5KHRlbXAtPmhleCwgIi4iKTsKKwkJc3RyY3B5KHRlbXAtPm1vZGUsICIuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW9uZS0+c2hhMV92YWxpZCB8fAorCSAgICByZXVzZV93b3JrdHJlZV9maWxlKG5hbWUsIG9uZS0+c2hhMSwgMSkpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChuYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlnb3RvIG5vdF9hX3ZhbGlkX2ZpbGU7CisJCQlkaWUoInN0YXQoJXMpOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQljaGFyIGJ1ZltQQVRIX01BWCArIDFdOyAvKiBvdWdodCB0byBiZSBTWU1MSU5LX01BWCAqLworCQkJc2l6ZV90IHN6ID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJCWlmIChzaXplb2YoYnVmKSA8PSBzdC5zdF9zaXplKQorCQkJCWRpZSgic3ltbGluayB0b28gbG9uZzogJXMiLCBuYW1lKTsKKwkJCXJldCA9IHJlYWRsaW5rKG5hbWUsIGJ1Ziwgc3opOworCQkJaWYgKHJldCA8IDApCisJCQkJZGllKCJyZWFkbGluayglcykiLCBuYW1lKTsKKwkJCXByZXBfdGVtcF9ibG9iKHRlbXAsIGJ1Ziwgc3osCisJCQkJICAgICAgIChvbmUtPnNoYTFfdmFsaWQgPworCQkJCQlvbmUtPnNoYTEgOiBudWxsX3NoYTEpLAorCQkJCSAgICAgICAob25lLT5zaGExX3ZhbGlkID8KKwkJCQkJb25lLT5tb2RlIDogU19JRkxOSykpOworCQl9CisJCWVsc2UgeworCQkJLyogd2UgY2FuIGJvcnJvdyBmcm9tIHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgKi8KKwkJCXRlbXAtPm5hbWUgPSBuYW1lOworCQkJaWYgKCFvbmUtPnNoYTFfdmFsaWQpCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgobnVsbF9zaGExKSk7CisJCQllbHNlCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgob25lLT5zaGExKSk7CisJCQkvKiBFdmVuIHRob3VnaCB3ZSBtYXkgc29tZXRpbWVzIGJvcnJvdyB0aGUKKwkJCSAqIGNvbnRlbnRzIGZyb20gdGhlIHdvcmsgdHJlZSwgd2UgYWx3YXlzIHdhbnQKKwkJCSAqIG9uZS0+bW9kZS4gIG1vZGUgaXMgdHJ1c3R3b3J0aHkgZXZlbiB3aGVuCisJCQkgKiAhKG9uZS0+c2hhMV92YWxpZCksIGFzIGxvbmcgYXMKKwkJCSAqIERJRkZfRklMRV9WQUxJRChvbmUpLgorCQkJICovCisJCQlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgb25lLT5tb2RlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UgeworCQlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQkJZGllKCJjYW5ub3QgcmVhZCBkYXRhIGJsb2IgZm9yICVzIiwgb25lLT5wYXRoKTsKKwkJcHJlcF90ZW1wX2Jsb2IodGVtcCwgb25lLT5kYXRhLCBvbmUtPnNpemUsCisJCQkgICAgICAgb25lLT5zaGExLCBvbmUtPm1vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3RlbXBmaWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAoZGlmZl90ZW1wW2ldLm5hbWUgPT0gZGlmZl90ZW1wW2ldLnRtcF9wYXRoKSB7CisJCQl1bmxpbmsoZGlmZl90ZW1wW2ldLm5hbWUpOworCQkJZGlmZl90ZW1wW2ldLm5hbWUgPSBOVUxMOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV90ZW1wZmlsZSgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworc3RhdGljIGludCBzcGF3bl9wcm9nKGNvbnN0IGNoYXIgKnBnbSwgY29uc3QgY2hhciAqKmFyZykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKworCWZmbHVzaChOVUxMKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGZvcmsiKTsKKwlpZiAoIXBpZCkgeworCQlleGVjdnAocGdtLCAoY2hhciAqY29uc3QqKSBhcmcpOworCQlleGl0KDI1NSk7CisJfQorCisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBFYXJsaWVyIHdlIGRpZCBub3QgY2hlY2sgdGhlIGV4aXQgc3RhdHVzIGJlY2F1c2UKKwkgKiBkaWZmIGV4aXRzIG5vbi16ZXJvIGlmIGZpbGVzIGFyZSBkaWZmZXJlbnQsIGFuZAorCSAqIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBrbm93aW5nIHRoYXQuICBJdCB3YXMgYQorCSAqIG1pc3Rha2Ugd2hpY2ggbWFkZSBpdCBoYXJkZXIgdG8gcXVpdCBhIGRpZmYtKgorCSAqIHNlc3Npb24gdGhhdCB1c2VzIHRoZSBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0IGFzCisJICogdGhlIEdJVF9FWFRFUk5BTF9ESUZGLiAgQSBjdXN0b20gR0lUX0VYVEVSTkFMX0RJRkYKKwkgKiBzaG91bGQgYWxzbyBleGl0IG5vbi16ZXJvIG9ubHkgd2hlbiBpdCB3YW50cyB0bworCSAqIGFib3J0IHRoZSBlbnRpcmUgZGlmZi0qIHNlc3Npb24uCisJICovCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmICFXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEFuIGV4dGVybmFsIGRpZmYgY29tbWFuZCB0YWtlczoKKyAqCisgKiBkaWZmLWNtZCBuYW1lIGluZmlsZTEgaW5maWxlMS1zaGExIGluZmlsZTEtbW9kZSBcCisgKiAgICAgICAgICAgICAgIGluZmlsZTIgaW5maWxlMi1zaGExIGluZmlsZTItbW9kZSBbIHJlbmFtZS10byBdCisgKgorICovCitzdGF0aWMgdm9pZCBydW5fZXh0ZXJuYWxfZGlmZihjb25zdCBjaGFyICpwZ20sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqb3RoZXIsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJICAgICAgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJY29uc3QgY2hhciAqc3Bhd25fYXJnWzEwXTsKKwlzdHJ1Y3QgZGlmZl90ZW1wZmlsZSAqdGVtcCA9IGRpZmZfdGVtcDsKKwlpbnQgcmV0dmFsOworCXN0YXRpYyBpbnQgYXRleGl0X2Fza2VkID0gMDsKKwljb25zdCBjaGFyICpvdGhlcm5hbWU7CisJY29uc3QgY2hhciAqKmFyZyA9ICZzcGF3bl9hcmdbMF07CisKKwlvdGhlcm5hbWUgPSAob3RoZXI/IG90aGVyIDogbmFtZSk7CisJaWYgKG9uZSAmJiB0d28pIHsKKwkJcHJlcGFyZV90ZW1wX2ZpbGUobmFtZSwgJnRlbXBbMF0sIG9uZSk7CisJCXByZXBhcmVfdGVtcF9maWxlKG90aGVybmFtZSwgJnRlbXBbMV0sIHR3byk7CisJCWlmICghIGF0ZXhpdF9hc2tlZCAmJgorCQkgICAgKHRlbXBbMF0ubmFtZSA9PSB0ZW1wWzBdLnRtcF9wYXRoIHx8CisJCSAgICAgdGVtcFsxXS5uYW1lID09IHRlbXBbMV0udG1wX3BhdGgpKSB7CisJCQlhdGV4aXRfYXNrZWQgPSAxOworCQkJYXRleGl0KHJlbW92ZV90ZW1wZmlsZSk7CisJCX0KKwkJc2lnbmFsKFNJR0lOVCwgcmVtb3ZlX3RlbXBmaWxlX29uX3NpZ25hbCk7CisJfQorCisJaWYgKG9uZSAmJiB0d28pIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCQkqYXJnKysgPSB0ZW1wWzBdLm5hbWU7CisJCSphcmcrKyA9IHRlbXBbMF0uaGV4OworCQkqYXJnKysgPSB0ZW1wWzBdLm1vZGU7CisJCSphcmcrKyA9IHRlbXBbMV0ubmFtZTsKKwkJKmFyZysrID0gdGVtcFsxXS5oZXg7CisJCSphcmcrKyA9IHRlbXBbMV0ubW9kZTsKKwkJaWYgKG90aGVyKSB7CisJCQkqYXJnKysgPSBvdGhlcjsKKwkJCSphcmcrKyA9IHhmcm1fbXNnOworCQl9CisJfSBlbHNlIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCX0KKwkqYXJnID0gTlVMTDsKKwlyZXR2YWwgPSBzcGF3bl9wcm9nKHBnbSwgc3Bhd25fYXJnKTsKKwlyZW1vdmVfdGVtcGZpbGUoKTsKKwlpZiAocmV0dmFsKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXh0ZXJuYWwgZGlmZiBkaWVkLCBzdG9wcGluZyBhdCAlcy5cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVybmFsX2RpZmZfYXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayBhdHRyX2RpZmZfY2hlY2s7CisKKwlzZXR1cF9kaWZmX2F0dHJfY2hlY2soJmF0dHJfZGlmZl9jaGVjayk7CisJaWYgKCFnaXRfY2hlY2thdHRyKG5hbWUsIDEsICZhdHRyX2RpZmZfY2hlY2spKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlID0gYXR0cl9kaWZmX2NoZWNrLnZhbHVlOworCQlpZiAoIUFUVFJfVFJVRSh2YWx1ZSkgJiYKKwkJICAgICFBVFRSX0ZBTFNFKHZhbHVlKSAmJgorCQkgICAgIUFUVFJfVU5TRVQodmFsdWUpKSB7CisJCQlzdHJ1Y3QgbGxfZGlmZl9kcml2ZXIgKmRydjsKKworCQkJaWYgKCF1c2VyX2RpZmZfdGFpbCkgeworCQkJCXVzZXJfZGlmZl90YWlsID0gJnVzZXJfZGlmZjsKKwkJCQlnaXRfY29uZmlnKGdpdF9kaWZmX3VpX2NvbmZpZyk7CisJCQl9CisJCQlmb3IgKGRydiA9IHVzZXJfZGlmZjsgZHJ2OyBkcnYgPSBkcnYtPm5leHQpCisJCQkJaWYgKCFzdHJjbXAoZHJ2LT5uYW1lLCB2YWx1ZSkpCisJCQkJCXJldHVybiBkcnYtPmNtZDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmZfY21kKGNvbnN0IGNoYXIgKnBnbSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKm90aGVyLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSBjb25zdCBjaGFyICp4ZnJtX21zZywKKwkJCSBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJIGludCBjb21wbGV0ZV9yZXdyaXRlKQoreworCWlmICghby0+YWxsb3dfZXh0ZXJuYWwpCisJCXBnbSA9IE5VTEw7CisJZWxzZSB7CisJCWNvbnN0IGNoYXIgKmNtZCA9IGV4dGVybmFsX2RpZmZfYXR0cihuYW1lKTsKKwkJaWYgKGNtZCkKKwkJCXBnbSA9IGNtZDsKKwl9CisKKwlpZiAocGdtKSB7CisJCXJ1bl9leHRlcm5hbF9kaWZmKHBnbSwgbmFtZSwgb3RoZXIsIG9uZSwgdHdvLCB4ZnJtX21zZywKKwkJCQkgIGNvbXBsZXRlX3Jld3JpdGUpOworCQlyZXR1cm47CisJfQorCWlmIChvbmUgJiYgdHdvKQorCQlidWlsdGluX2RpZmYobmFtZSwgb3RoZXIgPyBvdGhlciA6IG5hbWUsCisJCQkgICAgIG9uZSwgdHdvLCB4ZnJtX21zZywgbywgY29tcGxldGVfcmV3cml0ZSk7CisJZWxzZQorCQlwcmludGYoIiogVW5tZXJnZWQgcGF0aCAlc1xuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmlsbF9zaGExX2luZm8oc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwlpZiAoRElGRl9GSUxFX1ZBTElEKG9uZSkpIHsKKwkJaWYgKCFvbmUtPnNoYTFfdmFsaWQpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKCFzdHJjbXAob25lLT5wYXRoLCAiLSIpKSB7CisJCQkJaGFzaGNweShvbmUtPnNoYTEsIG51bGxfc2hhMSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGxzdGF0KG9uZS0+cGF0aCwgJnN0KSA8IDApCisJCQkJZGllKCJzdGF0ICVzIiwgb25lLT5wYXRoKTsKKwkJCWlmIChpbmRleF9wYXRoKG9uZS0+c2hhMSwgb25lLT5wYXRoLCAmc3QsIDApKQorCQkJCWRpZSgiY2Fubm90IGhhc2ggJXNcbiIsIG9uZS0+cGF0aCk7CisJCX0KKwl9CisJZWxzZQorCQloYXNoY2xyKG9uZS0+c2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9kaWZmKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvKQoreworCWNvbnN0IGNoYXIgKnBnbSA9IGV4dGVybmFsX2RpZmYoKTsKKwljaGFyIG1zZ1tQQVRIX01BWCoyKzMwMF0sICp4ZnJtX21zZzsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d287CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKwljaGFyICpuYW1lX211bmdlZCwgKm90aGVyX211bmdlZDsKKwlpbnQgY29tcGxldGVfcmV3cml0ZSA9IDA7CisJaW50IGxlbjsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpIHsKKwkJLyogdW5tZXJnZWQgKi8KKwkJcnVuX2RpZmZfY21kKHBnbSwgcC0+b25lLT5wYXRoLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBvLCAwKTsKKwkJcmV0dXJuOworCX0KKworCW5hbWUgPSBwLT5vbmUtPnBhdGg7CisJb3RoZXIgPSAoc3RyY21wKG5hbWUsIHAtPnR3by0+cGF0aCkgPyBwLT50d28tPnBhdGggOiBOVUxMKTsKKwluYW1lX211bmdlZCA9IHF1b3RlX29uZShuYW1lKTsKKwlvdGhlcl9tdW5nZWQgPSBxdW90ZV9vbmUob3RoZXIpOworCW9uZSA9IHAtPm9uZTsgdHdvID0gcC0+dHdvOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhvbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8odHdvKTsKKworCWxlbiA9IDA7CisJc3dpdGNoIChwLT5zdGF0dXMpIHsKKwljYXNlIERJRkZfU1RBVFVTX0NPUElFRDoKKwkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJInNpbWlsYXJpdHkgaW5kZXggJWQlJVxuIgorCQkJCSJjb3B5IGZyb20gJXNcbiIKKwkJCQkiY29weSB0byAlc1xuIiwKKwkJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSksCisJCQkJbmFtZV9tdW5nZWQsIG90aGVyX211bmdlZCk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfUkVOQU1FRDoKKwkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJInNpbWlsYXJpdHkgaW5kZXggJWQlJVxuIgorCQkJCSJyZW5hbWUgZnJvbSAlc1xuIgorCQkJCSJyZW5hbWUgdG8gJXNcbiIsCisJCQkJKGludCkoMC41ICsgcC0+c2NvcmUgKiAxMDAuMC9NQVhfU0NPUkUpLAorCQkJCW5hbWVfbXVuZ2VkLCBvdGhlcl9tdW5nZWQpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX01PRElGSUVEOgorCQlpZiAocC0+c2NvcmUpIHsKKwkJCWxlbiArPSBzbnByaW50Zihtc2cgKyBsZW4sIHNpemVvZihtc2cpIC0gbGVuLAorCQkJCQkiZGlzc2ltaWxhcml0eSBpbmRleCAlZCUlXG4iLAorCQkJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqCisJCQkJCSAgICAgIDEwMC4wL01BWF9TQ09SRSkpOworCQkJY29tcGxldGVfcmV3cml0ZSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsdGhydSAqLworCWRlZmF1bHQ6CisJCS8qIG5vdGhpbmcgKi8KKwkJOworCX0KKworCWlmIChoYXNoY21wKG9uZS0+c2hhMSwgdHdvLT5zaGExKSkgeworCQlpbnQgYWJicmV2ID0gby0+ZnVsbF9pbmRleCA/IDQwIDogREVGQVVMVF9BQkJSRVY7CisKKwkJaWYgKG8tPmJpbmFyeSkgeworCQkJbW1maWxlX3QgbWY7CisJCQlpZiAoKCFmaWxsX21tZmlsZSgmbWYsIG9uZSkgJiYgZmlsZV9pc19iaW5hcnkob25lKSkgfHwKKwkJCSAgICAoIWZpbGxfbW1maWxlKCZtZiwgdHdvKSAmJiBmaWxlX2lzX2JpbmFyeSh0d28pKSkKKwkJCQlhYmJyZXYgPSA0MDsKKwkJfQorCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkiaW5kZXggJS4qcy4uJS4qcyIsCisJCQkJYWJicmV2LCBzaGExX3RvX2hleChvbmUtPnNoYTEpLAorCQkJCWFiYnJldiwgc2hhMV90b19oZXgodHdvLT5zaGExKSk7CisJCWlmIChvbmUtPm1vZGUgPT0gdHdvLT5tb2RlKQorCQkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJCSIgJTA2byIsIG9uZS0+bW9kZSk7CisJCWxlbiArPSBzbnByaW50Zihtc2cgKyBsZW4sIHNpemVvZihtc2cpIC0gbGVuLCAiXG4iKTsKKwl9CisKKwlpZiAobGVuKQorCQltc2dbLS1sZW5dID0gMDsKKwl4ZnJtX21zZyA9IGxlbiA/IG1zZyA6IE5VTEw7CisKKwlpZiAoIXBnbSAmJgorCSAgICBESUZGX0ZJTEVfVkFMSUQob25lKSAmJiBESUZGX0ZJTEVfVkFMSUQodHdvKSAmJgorCSAgICAoU19JRk1UICYgb25lLT5tb2RlKSAhPSAoU19JRk1UICYgdHdvLT5tb2RlKSkgeworCQkvKiBhIGZpbGVwYWlyIHRoYXQgY2hhbmdlcyBiZXR3ZWVuIGZpbGUgYW5kIHN5bWxpbmsKKwkJICogbmVlZHMgdG8gYmUgc3BsaXQgaW50byBkZWxldGlvbiBhbmQgY3JlYXRpb24uCisJCSAqLworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbnVsbCA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJCXJ1bl9kaWZmX2NtZChOVUxMLCBuYW1lLCBvdGhlciwgb25lLCBudWxsLCB4ZnJtX21zZywgbywgMCk7CisJCWZyZWUobnVsbCk7CisJCW51bGwgPSBhbGxvY19maWxlc3BlYyhvbmUtPnBhdGgpOworCQlydW5fZGlmZl9jbWQoTlVMTCwgbmFtZSwgb3RoZXIsIG51bGwsIHR3bywgeGZybV9tc2csIG8sIDApOworCQlmcmVlKG51bGwpOworCX0KKwllbHNlCisJCXJ1bl9kaWZmX2NtZChwZ20sIG5hbWUsIG90aGVyLCBvbmUsIHR3bywgeGZybV9tc2csIG8sCisJCQkgICAgIGNvbXBsZXRlX3Jld3JpdGUpOworCisJZnJlZShuYW1lX211bmdlZCk7CisJZnJlZShvdGhlcl9tdW5nZWQpOworfQorCitzdGF0aWMgdm9pZCBydW5fZGlmZnN0YXQoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0KQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqb3RoZXI7CisJaW50IGNvbXBsZXRlX3Jld3JpdGUgPSAwOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkgeworCQkvKiB1bm1lcmdlZCAqLworCQlidWlsdGluX2RpZmZzdGF0KHAtPm9uZS0+cGF0aCwgTlVMTCwgTlVMTCwgTlVMTCwgZGlmZnN0YXQsIG8sIDApOworCQlyZXR1cm47CisJfQorCisJbmFtZSA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT5vbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKworCWlmIChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQgJiYgcC0+c2NvcmUpCisJCWNvbXBsZXRlX3Jld3JpdGUgPSAxOworCWJ1aWx0aW5fZGlmZnN0YXQobmFtZSwgb3RoZXIsIHAtPm9uZSwgcC0+dHdvLCBkaWZmc3RhdCwgbywgY29tcGxldGVfcmV3cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9jaGVja2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpIHsKKwkJLyogdW5tZXJnZWQgKi8KKwkJcmV0dXJuOworCX0KKworCW5hbWUgPSBwLT5vbmUtPnBhdGg7CisJb3RoZXIgPSAoc3RyY21wKG5hbWUsIHAtPnR3by0+cGF0aCkgPyBwLT50d28tPnBhdGggOiBOVUxMKTsKKworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+b25lKTsKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKHAtPnR3byk7CisKKwlidWlsdGluX2NoZWNrZGlmZihuYW1lLCBvdGhlciwgcC0+b25lLCBwLT50d28sIG8pOworfQorCit2b2lkIGRpZmZfc2V0dXAoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwltZW1zZXQob3B0aW9ucywgMCwgc2l6ZW9mKCpvcHRpb25zKSk7CisJb3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CisJb3B0aW9ucy0+YnJlYWtfb3B0ID0gLTE7CisJb3B0aW9ucy0+cmVuYW1lX2xpbWl0ID0gLTE7CisJb3B0aW9ucy0+Y29udGV4dCA9IDM7CisJb3B0aW9ucy0+bXNnX3NlcCA9ICIiOworCisJb3B0aW9ucy0+Y2hhbmdlID0gZGlmZl9jaGFuZ2U7CisJb3B0aW9ucy0+YWRkX3JlbW92ZSA9IGRpZmZfYWRkcmVtb3ZlOworCW9wdGlvbnMtPmNvbG9yX2RpZmYgPSBkaWZmX3VzZV9jb2xvcl9kZWZhdWx0OworCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdDsKK30KKworaW50IGRpZmZfc2V0dXBfZG9uZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWludCBjb3VudCA9IDA7CisKKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX05BTUUpCisJCWNvdW50Kys7CisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykKKwkJY291bnQrKzsKKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX0NIRUNLRElGRikKKwkJY291bnQrKzsKKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX05PX09VVFBVVCkKKwkJY291bnQrKzsKKwlpZiAoY291bnQgPiAxKQorCQlkaWUoIi0tbmFtZS1vbmx5LCAtLW5hbWUtc3RhdHVzLCAtLWNoZWNrIGFuZCAtcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIik7CisKKwlpZiAob3B0aW9ucy0+ZmluZF9jb3BpZXNfaGFyZGVyKQorCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfQ09QWTsKKworCWlmIChvcHRpb25zLT5vdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX05BTUUgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX05BTUVfU1RBVFVTIHwKKwkJCQkgICAgICBESUZGX0ZPUk1BVF9DSEVDS0RJRkYgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX05PX09VVFBVVCkpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJj0gfihESUZGX0ZPUk1BVF9SQVcgfAorCQkJCQkgICAgRElGRl9GT1JNQVRfTlVNU1RBVCB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9TSE9SVFNUQVQgfAorCQkJCQkgICAgRElGRl9GT1JNQVRfU1VNTUFSWSB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9QQVRDSCk7CisKKwkvKgorCSAqIFRoZXNlIGNhc2VzIGFsd2F5cyBuZWVkIHJlY3Vyc2l2ZTsgd2UgZG8gbm90IGRyb3AgY2FsbGVyLXN1cHBsaWVkCisJICogcmVjdXJzaXZlIGJpdHMgZm9yIG90aGVyIGZvcm1hdHMgaGVyZS4KKwkgKi8KKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9QQVRDSCB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfTlVNU1RBVCB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfRElGRlNUQVQgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX1NIT1JUU1RBVCB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfU1VNTUFSWSB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfQ0hFQ0tESUZGKSkKKwkJb3B0aW9ucy0+cmVjdXJzaXZlID0gMTsKKwkvKgorCSAqIEFsc28gcGlja2F4ZSB3b3VsZCBub3Qgd29yayB2ZXJ5IHdlbGwgaWYgeW91IGRvIG5vdCBzYXkgcmVjdXJzaXZlCisJICovCisJaWYgKG9wdGlvbnMtPnBpY2theGUpCisJCW9wdGlvbnMtPnJlY3Vyc2l2ZSA9IDE7CisKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSAmJiBvcHRpb25zLT5yZW5hbWVfbGltaXQgPCAwKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0OworCWlmIChvcHRpb25zLT5zZXR1cCAmIERJRkZfU0VUVVBfVVNFX0NBQ0hFKSB7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJLyogcmVhZC1jYWNoZSBkb2VzIG5vdCBkaWUgZXZlbiB3aGVuIGl0IGZhaWxzCisJCQkgKiBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byBkbyB0aGlzIGhlcmUuICBBbHNvCisJCQkgKiBpdCBkb2VzIG5vdCBzbXVkZ2UgYWN0aXZlX2NhY2hlIG9yIGFjdGl2ZV9ucgorCQkJICogd2hlbiBpdCBmYWlscywgc28gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQKKwkJCSAqIGNsZWFuaW5nIGl0IHVwIG91cnNlbHZlcyBlaXRoZXIuCisJCQkgKi8KKwkJCXJlYWRfY2FjaGUoKTsKKwl9CisJaWYgKG9wdGlvbnMtPmFiYnJldiA8PSAwIHx8IDQwIDwgb3B0aW9ucy0+YWJicmV2KQorCQlvcHRpb25zLT5hYmJyZXYgPSA0MDsgLyogZnVsbCAqLworCisJLyoKKwkgKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNob3cgdGhlIGZpcnN0IGhpdCB3ZSBoYXBwZW5lZAorCSAqIHRvIGhhdmUgZm91bmQuICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIG5vdCB0byByZXR1cm4gd2l0aAorCSAqIGV4aXQgY29kZSBpbiBzdWNoIGEgY2FzZSBlaXRoZXIuCisJICovCisJaWYgKG9wdGlvbnMtPnF1aWV0KSB7CisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJCW9wdGlvbnMtPmV4aXRfd2l0aF9zdGF0dXMgPSAxOworCX0KKworCS8qCisJICogSWYgd2UgcG9zdHByb2Nlc3MgaW4gZGlmZmNvcmUsIHdlIGNhbm5vdCBzaW1wbHkgcmV0dXJuCisJICogdXBvbiB0aGUgZmlyc3QgaGl0LiAgV2UgbmVlZCB0byBydW4gZGlmZiBhcyB1c3VhbC4KKwkgKi8KKwlpZiAob3B0aW9ucy0+cGlja2F4ZSB8fCBvcHRpb25zLT5maWx0ZXIpCisJCW9wdGlvbnMtPnF1aWV0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9hcmcoY29uc3QgY2hhciAqYXJnLCBpbnQgYXJnX3Nob3J0LCBjb25zdCBjaGFyICphcmdfbG9uZywgaW50ICp2YWwpCit7CisJY2hhciBjLCAqZXE7CisJaW50IGxlbjsKKworCWlmICgqYXJnICE9ICctJykKKwkJcmV0dXJuIDA7CisJYyA9ICorK2FyZzsKKwlpZiAoIWMpCisJCXJldHVybiAwOworCWlmIChjID09IGFyZ19zaG9ydCkgeworCQljID0gKisrYXJnOworCQlpZiAoIWMpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHZhbCAmJiBpc2RpZ2l0KGMpKSB7CisJCQljaGFyICplbmQ7CisJCQlpbnQgbiA9IHN0cnRvdWwoYXJnLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCkKKwkJCQlyZXR1cm4gMDsKKwkJCSp2YWwgPSBuOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChjICE9ICctJykKKwkJcmV0dXJuIDA7CisJYXJnKys7CisJZXEgPSBzdHJjaHIoYXJnLCAnPScpOworCWlmIChlcSkKKwkJbGVuID0gZXEgLSBhcmc7CisJZWxzZQorCQlsZW4gPSBzdHJsZW4oYXJnKTsKKwlpZiAoIWxlbiB8fCBzdHJuY21wKGFyZywgYXJnX2xvbmcsIGxlbikpCisJCXJldHVybiAwOworCWlmIChlcSkgeworCQlpbnQgbjsKKwkJY2hhciAqZW5kOworCQlpZiAoIWlzZGlnaXQoKisrZXEpKQorCQkJcmV0dXJuIDA7CisJCW4gPSBzdHJ0b3VsKGVxLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kKQorCQkJcmV0dXJuIDA7CisJCSp2YWwgPSBuOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IGRpZmZfb3B0X3BhcnNlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKiphdiwgaW50IGFjKQoreworCWNvbnN0IGNoYXIgKmFyZyA9IGF2WzBdOworCWlmICghc3RyY21wKGFyZywgIi1wIikgfHwgIXN0cmNtcChhcmcsICItdSIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIOworCWVsc2UgaWYgKG9wdF9hcmcoYXJnLCAnVScsICJ1bmlmaWVkIiwgJm9wdGlvbnMtPmNvbnRleHQpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yYXciKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9SQVc7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBhdGNoLXdpdGgtcmF3IikpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSCB8IERJRkZfRk9STUFUX1JBVzsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW51bXN0YXQiKSkgeworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX05VTVNUQVQ7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zaG9ydHN0YXQiKSkgeworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1NIT1JUU1RBVDsKKwl9CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLXN0YXQiKSkgeworCQljaGFyICplbmQ7CisJCWludCB3aWR0aCA9IG9wdGlvbnMtPnN0YXRfd2lkdGg7CisJCWludCBuYW1lX3dpZHRoID0gb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoOworCQlhcmcgKz0gNjsKKwkJZW5kID0gKGNoYXIgKilhcmc7CisKKwkJc3dpdGNoICgqYXJnKSB7CisJCWNhc2UgJy0nOgorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLXdpZHRoPSIpKQorCQkJCXdpZHRoID0gc3RydG91bChhcmcgKyA3LCAmZW5kLCAxMCk7CisJCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1uYW1lLXdpZHRoPSIpKQorCQkJCW5hbWVfd2lkdGggPSBzdHJ0b3VsKGFyZyArIDEyLCAmZW5kLCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQl3aWR0aCA9IHN0cnRvdWwoYXJnKzEsICZlbmQsIDEwKTsKKwkJCWlmICgqZW5kID09ICcsJykKKwkJCQluYW1lX3dpZHRoID0gc3RydG91bChlbmQrMSwgJmVuZCwgMTApOworCQl9CisKKwkJLyogSW1wb3J0YW50ISBUaGlzIGNoZWNrcyBhbGwgdGhlIGVycm9yIGNhc2VzISAqLworCQlpZiAoKmVuZCkKKwkJCXJldHVybiAwOworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX0RJRkZTVEFUOworCQlvcHRpb25zLT5zdGF0X25hbWVfd2lkdGggPSBuYW1lX3dpZHRoOworCQlvcHRpb25zLT5zdGF0X3dpZHRoID0gd2lkdGg7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1jaGVjayIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX0NIRUNLRElGRjsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc3VtbWFyeSIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1NVTU1BUlk7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBhdGNoLXdpdGgtc3RhdCIpKSB7CisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfUEFUQ0ggfCBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICIteiIpKQorCQlvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uID0gMDsKKwllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1sIikpCisJCW9wdGlvbnMtPnJlbmFtZV9saW1pdCA9IHN0cnRvdWwoYXJnKzIsIE5VTEwsIDEwKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZnVsbC1pbmRleCIpKQorCQlvcHRpb25zLT5mdWxsX2luZGV4ID0gMTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tYmluYXJ5IikpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJb3B0aW9ucy0+YmluYXJ5ID0gMTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS10ZXh0IikpIHsKKwkJb3B0aW9ucy0+dGV4dCA9IDE7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uYW1lLW9ubHkiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9OQU1FOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uYW1lLXN0YXR1cyIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX05BTUVfU1RBVFVTOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLVIiKSkKKwkJb3B0aW9ucy0+cmV2ZXJzZV9kaWZmID0gMTsKKwllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1TIikpCisJCW9wdGlvbnMtPnBpY2theGUgPSBhcmcgKyAyOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXMiKSkgeworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwl9CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItTyIpKQorCQlvcHRpb25zLT5vcmRlcmZpbGUgPSBhcmcgKyAyOworCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1kaWZmLWZpbHRlcj0iKSkKKwkJb3B0aW9ucy0+ZmlsdGVyID0gYXJnICsgMTQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBpY2theGUtYWxsIikpCisJCW9wdGlvbnMtPnBpY2theGVfb3B0cyA9IERJRkZfUElDS0FYRV9BTEw7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBpY2theGUtcmVnZXgiKSkKKwkJb3B0aW9ucy0+cGlja2F4ZV9vcHRzID0gRElGRl9QSUNLQVhFX1JFR0VYOworCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUIiKSkgeworCQlpZiAoKG9wdGlvbnMtPmJyZWFrX29wdCA9CisJCSAgICAgZGlmZl9zY29yZW9wdF9wYXJzZShhcmcpKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItTSIpKSB7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCX0KKwllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1DIikpIHsKKwkJaWYgKChvcHRpb25zLT5yZW5hbWVfc2NvcmUgPQorCQkgICAgIGRpZmZfc2NvcmVvcHRfcGFyc2UoYXJnKSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9DT1BZOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZmluZC1jb3BpZXMtaGFyZGVyIikpCisJCW9wdGlvbnMtPmZpbmRfY29waWVzX2hhcmRlciA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFiYnJldiIpKQorCQlvcHRpb25zLT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2PSIpKSB7CisJCW9wdGlvbnMtPmFiYnJldiA9IHN0cnRvdWwoYXJnICsgOSwgTlVMTCwgMTApOworCQlpZiAob3B0aW9ucy0+YWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQlvcHRpb25zLT5hYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJZWxzZSBpZiAoNDAgPCBvcHRpb25zLT5hYmJyZXYpCisJCQlvcHRpb25zLT5hYmJyZXYgPSA0MDsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNvbG9yIikpCisJCW9wdGlvbnMtPmNvbG9yX2RpZmYgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1jb2xvciIpKQorCQlvcHRpb25zLT5jb2xvcl9kaWZmID0gMDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi13IikgfHwgIXN0cmNtcChhcmcsICItLWlnbm9yZS1hbGwtc3BhY2UiKSkKKwkJb3B0aW9ucy0+eGRsX29wdHMgfD0gWERGX0lHTk9SRV9XSElURVNQQUNFOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLWIiKSB8fCAhc3RyY21wKGFyZywgIi0taWdub3JlLXNwYWNlLWNoYW5nZSIpKQorCQlvcHRpb25zLT54ZGxfb3B0cyB8PSBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQ0hBTkdFOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1pZ25vcmUtc3BhY2UtYXQtZW9sIikpCisJCW9wdGlvbnMtPnhkbF9vcHRzIHw9IFhERl9JR05PUkVfV0hJVEVTUEFDRV9BVF9FT0w7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNvbG9yLXdvcmRzIikpCisJCW9wdGlvbnMtPmNvbG9yX2RpZmYgPSBvcHRpb25zLT5jb2xvcl9kaWZmX3dvcmRzID0gMTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbm8tcmVuYW1lcyIpKQorCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gMDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZXhpdC1jb2RlIikpCisJCW9wdGlvbnMtPmV4aXRfd2l0aF9zdGF0dXMgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1xdWlldCIpKQorCQlvcHRpb25zLT5xdWlldCA9IDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9udW0oY29uc3QgY2hhciAqKmNwX3ApCit7CisJdW5zaWduZWQgbG9uZyBudW0sIHNjYWxlOworCWludCBjaCwgZG90OworCWNvbnN0IGNoYXIgKmNwID0gKmNwX3A7CisKKwludW0gPSAwOworCXNjYWxlID0gMTsKKwlkb3QgPSAwOworCWZvcig7OykgeworCQljaCA9ICpjcDsKKwkJaWYgKCAhZG90ICYmIGNoID09ICcuJyApIHsKKwkJCXNjYWxlID0gMTsKKwkJCWRvdCA9IDE7CisJCX0gZWxzZSBpZiAoIGNoID09ICclJyApIHsKKwkJCXNjYWxlID0gZG90ID8gc2NhbGUqMTAwIDogMTAwOworCQkJY3ArKzsJLyogJSBpcyBhbHdheXMgYXQgdGhlIGVuZCAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIGNoID49ICcwJyAmJiBjaCA8PSAnOScgKSB7CisJCQlpZiAoIHNjYWxlIDwgMTAwMDAwICkgeworCQkJCXNjYWxlICo9IDEwOworCQkJCW51bSA9IChudW0qMTApICsgKGNoLScwJyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQljcCsrOworCX0KKwkqY3BfcCA9IGNwOworCisJLyogdXNlciBzYXlzIG51bSBkaXZpZGVkIGJ5IHNjYWxlIGFuZCB3ZSBzYXkgaW50ZXJuYWxseSB0aGF0CisJICogaXMgTUFYX1NDT1JFICogbnVtIC8gc2NhbGUuCisJICovCisJcmV0dXJuIChpbnQpKChudW0gPj0gc2NhbGUpID8gTUFYX1NDT1JFIDogKE1BWF9TQ09SRSAqIG51bSAvIHNjYWxlKSk7Cit9CisKK2ludCBkaWZmX3Njb3Jlb3B0X3BhcnNlKGNvbnN0IGNoYXIgKm9wdCkKK3sKKwlpbnQgb3B0MSwgb3B0MiwgY21kOworCisJaWYgKCpvcHQrKyAhPSAnLScpCisJCXJldHVybiAtMTsKKwljbWQgPSAqb3B0Kys7CisJaWYgKGNtZCAhPSAnTScgJiYgY21kICE9ICdDJyAmJiBjbWQgIT0gJ0InKQorCQlyZXR1cm4gLTE7IC8qIHRoYXQgaXMgbm90IGEgLU0sIC1DIG5vciAtQiBvcHRpb24gKi8KKworCW9wdDEgPSBwYXJzZV9udW0oJm9wdCk7CisJaWYgKGNtZCAhPSAnQicpCisJCW9wdDIgPSAwOworCWVsc2UgeworCQlpZiAoKm9wdCA9PSAwKQorCQkJb3B0MiA9IDA7CisJCWVsc2UgaWYgKCpvcHQgIT0gJy8nKQorCQkJcmV0dXJuIC0xOyAvKiB3ZSBleHBlY3QgLUI4MC85OSBvciAtQjgwICovCisJCWVsc2UgeworCQkJb3B0Kys7CisJCQlvcHQyID0gcGFyc2VfbnVtKCZvcHQpOworCQl9CisJfQorCWlmICgqb3B0ICE9IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gb3B0MSB8IChvcHQyIDw8IDE2KTsKK30KKworc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IGRpZmZfcXVldWVkX2RpZmY7CisKK3ZvaWQgZGlmZl9xKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcXVldWUsIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcCkKK3sKKwlpZiAocXVldWUtPmFsbG9jIDw9IHF1ZXVlLT5ucikgeworCQlxdWV1ZS0+YWxsb2MgPSBhbGxvY19ucihxdWV1ZS0+YWxsb2MpOworCQlxdWV1ZS0+cXVldWUgPSB4cmVhbGxvYyhxdWV1ZS0+cXVldWUsCisJCQkJCXNpemVvZihkcCkgKiBxdWV1ZS0+YWxsb2MpOworCX0KKwlxdWV1ZS0+cXVldWVbcXVldWUtPm5yKytdID0gZHA7Cit9CisKK3N0cnVjdCBkaWZmX2ZpbGVwYWlyICpkaWZmX3F1ZXVlKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcXVldWUsCisJCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28pCit7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRwID0geGNhbGxvYygxLCBzaXplb2YoKmRwKSk7CisJZHAtPm9uZSA9IG9uZTsKKwlkcC0+dHdvID0gdHdvOworCWlmIChxdWV1ZSkKKwkJZGlmZl9xKHF1ZXVlLCBkcCk7CisJcmV0dXJuIGRwOworfQorCit2b2lkIGRpZmZfZnJlZV9maWxlcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShwLT5vbmUpOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHAtPnR3byk7CisJZnJlZShwLT5vbmUpOworCWZyZWUocC0+dHdvKTsKKwlmcmVlKHApOworfQorCisvKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGZpbmRfdW5pcXVlX2FiYnJldigpIGluIHRoYXQKKyAqIGl0IHN0dWZmcyB0aGUgcmVzdWx0IHdpdGggZG90cyBmb3IgYWxpZ25tZW50LgorICovCitjb25zdCBjaGFyICpkaWZmX3VuaXF1ZV9hYmJyZXYoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGxlbikKK3sKKwlpbnQgYWJibGVuOworCWNvbnN0IGNoYXIgKmFiYnJldjsKKwlpZiAobGVuID09IDQwKQorCQlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7CisKKwlhYmJyZXYgPSBmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgbGVuKTsKKwlpZiAoIWFiYnJldikKKwkJcmV0dXJuIHNoYTFfdG9faGV4KHNoYTEpOworCWFiYmxlbiA9IHN0cmxlbihhYmJyZXYpOworCWlmIChhYmJsZW4gPCAzNykgeworCQlzdGF0aWMgY2hhciBoZXhbNDFdOworCQlpZiAobGVuIDwgYWJibGVuICYmIGFiYmxlbiA8PSBsZW4gKyAyKQorCQkJc3ByaW50ZihoZXgsICIlcyUuKnMiLCBhYmJyZXYsIGxlbiszLWFiYmxlbiwgIi4uIik7CisJCWVsc2UKKwkJCXNwcmludGYoaGV4LCAiJXMuLi4iLCBhYmJyZXYpOworCQlyZXR1cm4gaGV4OworCX0KKwlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfcmF3KHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQkJICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpbnQgdHdvX3BhdGhzOworCWNoYXIgc3RhdHVzWzEwXTsKKwlpbnQgYWJicmV2ID0gb3B0aW9ucy0+YWJicmV2OworCWNvbnN0IGNoYXIgKnBhdGhfb25lLCAqcGF0aF90d287CisJaW50IGludGVyX25hbWVfdGVybWluYXRpb24gPSAnXHQnOworCWludCBsaW5lX3Rlcm1pbmF0aW9uID0gb3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbjsKKworCWlmICghbGluZV90ZXJtaW5hdGlvbikKKwkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9IDA7CisKKwlwYXRoX29uZSA9IHAtPm9uZS0+cGF0aDsKKwlwYXRoX3R3byA9IHAtPnR3by0+cGF0aDsKKwlpZiAobGluZV90ZXJtaW5hdGlvbikgeworCQlwYXRoX29uZSA9IHF1b3RlX29uZShwYXRoX29uZSk7CisJCXBhdGhfdHdvID0gcXVvdGVfb25lKHBhdGhfdHdvKTsKKwl9CisKKwlpZiAocC0+c2NvcmUpCisJCXNwcmludGYoc3RhdHVzLCAiJWMlMDNkIiwgcC0+c3RhdHVzLAorCQkJKGludCkoMC41ICsgcC0+c2NvcmUgKiAxMDAuMC9NQVhfU0NPUkUpKTsKKwllbHNlIHsKKwkJc3RhdHVzWzBdID0gcC0+c3RhdHVzOworCQlzdGF0dXNbMV0gPSAwOworCX0KKwlzd2l0Y2ggKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfQ09QSUVEOgorCWNhc2UgRElGRl9TVEFUVVNfUkVOQU1FRDoKKwkJdHdvX3BhdGhzID0gMTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19BRERFRDoKKwljYXNlIERJRkZfU1RBVFVTX0RFTEVURUQ6CisJCXR3b19wYXRocyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR3b19wYXRocyA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAoIShvcHRpb25zLT5vdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMpKSB7CisJCXByaW50ZigiOiUwNm8gJTA2byAlcyAiLAorCQkgICAgICAgcC0+b25lLT5tb2RlLCBwLT50d28tPm1vZGUsCisJCSAgICAgICBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+b25lLT5zaGExLCBhYmJyZXYpKTsKKwkJcHJpbnRmKCIlcyAiLAorCQkgICAgICAgZGlmZl91bmlxdWVfYWJicmV2KHAtPnR3by0+c2hhMSwgYWJicmV2KSk7CisJfQorCXByaW50ZigiJXMlYyVzIiwgc3RhdHVzLCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLAorCQkJdHdvX3BhdGhzIHx8IHAtPm9uZS0+bW9kZSA/ICBwYXRoX29uZSA6IHBhdGhfdHdvKTsKKwlpZiAodHdvX3BhdGhzKQorCQlwcmludGYoIiVjJXMiLCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLCBwYXRoX3R3byk7CisJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0aW9uKTsKKwlpZiAocGF0aF9vbmUgIT0gcC0+b25lLT5wYXRoKQorCQlmcmVlKCh2b2lkKilwYXRoX29uZSk7CisJaWYgKHBhdGhfdHdvICE9IHAtPnR3by0+cGF0aCkKKwkJZnJlZSgodm9pZCopcGF0aF90d28pOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZsdXNoX25hbWUoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwljaGFyICpwYXRoID0gcC0+dHdvLT5wYXRoOworCisJaWYgKG9wdC0+bGluZV90ZXJtaW5hdGlvbikKKwkJcGF0aCA9IHF1b3RlX29uZShwLT50d28tPnBhdGgpOworCXByaW50ZigiJXMlYyIsIHBhdGgsIG9wdC0+bGluZV90ZXJtaW5hdGlvbik7CisJaWYgKHAtPnR3by0+cGF0aCAhPSBwYXRoKQorCQlmcmVlKHBhdGgpOworfQorCitpbnQgZGlmZl91bm1vZGlmaWVkX3BhaXIoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJLyogVGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIHN0cmljdGVyIHRoYW4gbmVjZXNzYXJ5IHRvIHN1cHBvcnQKKwkgKiB0aGUgY3VycmVudGx5IGltcGxlbWVudGVkIHRyYW5zZm9ybWVycywgYnV0IHRoZSBpZGVhIGlzIHRvCisJICogbGV0IHRyYW5zZm9ybWVycyB0byBwcm9kdWNlIGRpZmZfZmlsZXBhaXJzIGFueSB3YXkgdGhleSB3YW50LAorCSAqIGFuZCBmaWx0ZXIgYW5kIGNsZWFuIHRoZW0gdXAgaGVyZSBiZWZvcmUgcHJvZHVjaW5nIHRoZSBvdXRwdXQuCisJICovCisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bzsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpCisJCXJldHVybiAwOyAvKiB1bm1lcmdlZCBpcyBpbnRlcmVzdGluZyAqLworCisJb25lID0gcC0+b25lOworCXR3byA9IHAtPnR3bzsKKworCS8qIGRlbGV0aW9uLCBhZGRpdGlvbiwgbW9kZSBvciB0eXBlIGNoYW5nZQorCSAqIGFuZCByZW5hbWUgYXJlIGFsbCBpbnRlcmVzdGluZy4KKwkgKi8KKwlpZiAoRElGRl9GSUxFX1ZBTElEKG9uZSkgIT0gRElGRl9GSUxFX1ZBTElEKHR3bykgfHwKKwkgICAgRElGRl9QQUlSX01PREVfQ0hBTkdFRChwKSB8fAorCSAgICBzdHJjbXAob25lLT5wYXRoLCB0d28tPnBhdGgpKQorCQlyZXR1cm4gMDsKKworCS8qIGJvdGggYXJlIHZhbGlkIGFuZCBwb2ludCBhdCB0aGUgc2FtZSBwYXRoLiAgdGhhdCBpcywgd2UgYXJlCisJICogZGVhbGluZyB3aXRoIGEgY2hhbmdlLgorCSAqLworCWlmIChvbmUtPnNoYTFfdmFsaWQgJiYgdHdvLT5zaGExX3ZhbGlkICYmCisJICAgICFoYXNoY21wKG9uZS0+c2hhMSwgdHdvLT5zaGExKSkKKwkJcmV0dXJuIDE7IC8qIG5vIGNoYW5nZSAqLworCWlmICghb25lLT5zaGExX3ZhbGlkICYmICF0d28tPnNoYTFfdmFsaWQpCisJCXJldHVybiAxOyAvKiBib3RoIGxvb2sgYXQgdGhlIHNhbWUgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9wYXRjaChzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqbykKK3sKKwlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocCkpCisJCXJldHVybjsKKworCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCSAgICAoRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYgU19JU0RJUihwLT50d28tPm1vZGUpKSkKKwkJcmV0dXJuOyAvKiBubyB0cmVlIGRpZmZzIGluIHBhdGNoIGZvcm1hdCAqLworCisJcnVuX2RpZmYocCwgbyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfc3RhdChzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqbywKKwkJCSAgICBzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQpCit7CisJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQlyZXR1cm47CisKKwlpZiAoKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIFNfSVNESVIocC0+b25lLT5tb2RlKSkgfHwKKwkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCXJldHVybjsgLyogbm8gdHJlZSBkaWZmcyBpbiBwYXRjaCBmb3JtYXQgKi8KKworCXJ1bl9kaWZmc3RhdChwLCBvLCBkaWZmc3RhdCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfY2hlY2tkaWZmKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvKQoreworCWlmIChkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJcmV0dXJuOworCisJaWYgKChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBTX0lTRElSKHAtPm9uZS0+bW9kZSkpIHx8CisJICAgIChESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJiBTX0lTRElSKHAtPnR3by0+bW9kZSkpKQorCQlyZXR1cm47IC8qIG5vIHRyZWUgZGlmZnMgaW4gcGF0Y2ggZm9ybWF0ICovCisKKwlydW5fY2hlY2tkaWZmKHAsIG8pOworfQorCitpbnQgZGlmZl9xdWV1ZV9pc19lbXB0eSh2b2lkKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQlpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHEtPnF1ZXVlW2ldKSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisjaWYgRElGRl9ERUJVRwordm9pZCBkaWZmX2RlYnVnX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzLCBpbnQgeCwgY29uc3QgY2hhciAqb25lKQoreworCWZwcmludGYoc3RkZXJyLCAicXVldWVbJWRdICVzICglcykgJXMgJTA2byAlc1xuIiwKKwkJeCwgb25lID8gb25lIDogIiIsCisJCXMtPnBhdGgsCisJCURJRkZfRklMRV9WQUxJRChzKSA/ICJ2YWxpZCIgOiAiaW52YWxpZCIsCisJCXMtPm1vZGUsCisJCXMtPnNoYTFfdmFsaWQgPyBzaGExX3RvX2hleChzLT5zaGExKSA6ICIiKTsKKwlmcHJpbnRmKHN0ZGVyciwgInF1ZXVlWyVkXSAlcyBzaXplICVsdSBmbGFncyAlZFxuIiwKKwkJeCwgb25lID8gb25lIDogIiIsCisJCXMtPnNpemUsIHMtPnhmcm1fZmxhZ3MpOworfQorCit2b2lkIGRpZmZfZGVidWdfZmlsZXBhaXIoY29uc3Qgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIGludCBpKQoreworCWRpZmZfZGVidWdfZmlsZXNwZWMocC0+b25lLCBpLCAib25lIik7CisJZGlmZl9kZWJ1Z19maWxlc3BlYyhwLT50d28sIGksICJ0d28iKTsKKwlmcHJpbnRmKHN0ZGVyciwgInNjb3JlICVkLCBzdGF0dXMgJWMgc3RheXMgJWQgYnJva2VuICVkXG4iLAorCQlwLT5zY29yZSwgcC0+c3RhdHVzID8gcC0+c3RhdHVzIDogJz8nLAorCQlwLT5zb3VyY2Vfc3RheXMsIHAtPmJyb2tlbl9wYWlyKTsKK30KKwordm9pZCBkaWZmX2RlYnVnX3F1ZXVlKGNvbnN0IGNoYXIgKm1zZywgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxKQoreworCWludCBpOworCWlmIChtc2cpCisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7CisJZnByaW50ZihzdGRlcnIsICJxLT5uciA9ICVkXG4iLCBxLT5ucik7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJZGlmZl9kZWJ1Z19maWxlcGFpcihwLCBpKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZGlmZl9yZXNvbHZlX3JlbmFtZV9jb3B5KHZvaWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsICpwcDsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKworCWRpZmZfZGVidWdfcXVldWUoInJlc29sdmUtcmVuYW1lLWNvcHkiLCBxKTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXAgPSBxLT5xdWV1ZVtpXTsKKwkJcC0+c3RhdHVzID0gMDsgLyogdW5kZWNpZGVkICovCisJCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpCisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19VTk1FUkdFRDsKKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfQURERUQ7CisJCWVsc2UgaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX0RFTEVURUQ7CisJCWVsc2UgaWYgKERJRkZfUEFJUl9UWVBFX0NIQU5HRUQocCkpCisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19UWVBFX0NIQU5HRUQ7CisKKwkJLyogZnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcGFpcgorCQkgKiB3aG9zZSBib3RoIHNpZGVzIGFyZSB2YWxpZCBhbmQgb2YgdGhlIHNhbWUgdHlwZSwgaS5lLgorCQkgKiBlaXRoZXIgaW4tcGxhY2UgZWRpdCBvciByZW5hbWUvY29weSBlZGl0LgorCQkgKi8KKwkJZWxzZSBpZiAoRElGRl9QQUlSX1JFTkFNRShwKSkgeworCQkJaWYgKHAtPnNvdXJjZV9zdGF5cykgeworCQkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX0NPUElFRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFNlZSBpZiB0aGVyZSBpcyBzb21lIG90aGVyIGZpbGVwYWlyIHRoYXQKKwkJCSAqIGNvcGllcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBhcyB1cy4gIElmIHNvCisJCQkgKiB3ZSBhcmUgYSBjb3B5LiAgT3RoZXJ3aXNlIHdlIGFyZSBlaXRoZXIgYQorCQkJICogY29weSBpZiB0aGUgcGF0aCBzdGF5cywgb3IgYSByZW5hbWUgaWYgaXQKKwkJCSAqIGRvZXMgbm90LCBidXQgd2UgYWxyZWFkeSBoYW5kbGVkICJzdGF5cyIgY2FzZS4KKwkJCSAqLworCQkJZm9yIChqID0gaSArIDE7IGogPCBxLT5ucjsgaisrKSB7CisJCQkJcHAgPSBxLT5xdWV1ZVtqXTsKKwkJCQlpZiAoc3RyY21wKHBwLT5vbmUtPnBhdGgsIHAtPm9uZS0+cGF0aCkpCisJCQkJCWNvbnRpbnVlOyAvKiBub3QgdXMgKi8KKwkJCQlpZiAoIURJRkZfUEFJUl9SRU5BTUUocHApKQorCQkJCQljb250aW51ZTsgLyogbm90IGEgcmVuYW1lL2NvcHkgKi8KKwkJCQkvKiBwcCBpcyBhIHJlbmFtZS9jb3B5IGZyb20gdGhlIHNhbWUgc291cmNlICovCisJCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfQ09QSUVEOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFwLT5zdGF0dXMpCisJCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfUkVOQU1FRDsKKwkJfQorCQllbHNlIGlmIChoYXNoY21wKHAtPm9uZS0+c2hhMSwgcC0+dHdvLT5zaGExKSB8fAorCQkJIHAtPm9uZS0+bW9kZSAhPSBwLT50d28tPm1vZGUgfHwKKwkJCSBpc19udWxsX3NoYTEocC0+b25lLT5zaGExKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX01PRElGSUVEOworCQllbHNlIHsKKwkJCS8qIFRoaXMgaXMgYSAibm8tY2hhbmdlIiBlbnRyeSBhbmQgc2hvdWxkIG5vdAorCQkJICogaGFwcGVuIGFueW1vcmUsIGJ1dCBwcmVwYXJlIGZvciBicm9rZW4gY2FsbGVycy4KKwkJCSAqLworCQkJZXJyb3IoImZlZWRpbmcgdW5tb2RpZmllZCAlcyB0byBkaWZmY29yZSIsCisJCQkgICAgICBwLT5vbmUtPnBhdGgpOworCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfVU5LTk9XTjsKKwkJfQorCX0KKwlkaWZmX2RlYnVnX3F1ZXVlKCJyZXNvbHZlLXJlbmFtZS1jb3B5IGRvbmUiLCBxKTsKK30KKworc3RhdGljIGludCBjaGVja19wYWlyX3N0YXR1cyhzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwlzd2l0Y2ggKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfVU5LTk9XTjoKKwkJcmV0dXJuIDA7CisJY2FzZSAwOgorCQlkaWUoImludGVybmFsIGVycm9yIGluIGRpZmYtcmVzb2x2ZS1yZW5hbWUtY29weSIpOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgZmx1c2hfb25lX3BhaXIoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlpbnQgZm10ID0gb3B0LT5vdXRwdXRfZm9ybWF0OworCisJaWYgKGZtdCAmIERJRkZfRk9STUFUX0NIRUNLRElGRikKKwkJZGlmZl9mbHVzaF9jaGVja2RpZmYocCwgb3B0KTsKKwllbHNlIGlmIChmbXQgJiAoRElGRl9GT1JNQVRfUkFXIHwgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMpKQorCQlkaWZmX2ZsdXNoX3JhdyhwLCBvcHQpOworCWVsc2UgaWYgKGZtdCAmIERJRkZfRk9STUFUX05BTUUpCisJCWRpZmZfZmx1c2hfbmFtZShwLCBvcHQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2ZpbGVfbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm5ld2RlbGV0ZSwgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmZzKQoreworCWNoYXIgKm5hbWUgPSBxdW90ZV9vbmUoZnMtPnBhdGgpOworCWlmIChmcy0+bW9kZSkKKwkJcHJpbnRmKCIgJXMgbW9kZSAlMDZvICVzXG4iLCBuZXdkZWxldGUsIGZzLT5tb2RlLCBuYW1lKTsKKwllbHNlCisJCXByaW50ZigiICVzICVzXG4iLCBuZXdkZWxldGUsIG5hbWUpOworCWZyZWUobmFtZSk7Cit9CisKKworc3RhdGljIHZvaWQgc2hvd19tb2RlX2NoYW5nZShzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgaW50IHNob3dfbmFtZSkKK3sKKwlpZiAocC0+b25lLT5tb2RlICYmIHAtPnR3by0+bW9kZSAmJiBwLT5vbmUtPm1vZGUgIT0gcC0+dHdvLT5tb2RlKSB7CisJCWlmIChzaG93X25hbWUpIHsKKwkJCWNoYXIgKm5hbWUgPSBxdW90ZV9vbmUocC0+dHdvLT5wYXRoKTsKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2byAlc1xuIiwKKwkJCSAgICAgICBwLT5vbmUtPm1vZGUsIHAtPnR3by0+bW9kZSwgbmFtZSk7CisJCQlmcmVlKG5hbWUpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2b1xuIiwKKwkJCSAgICAgICBwLT5vbmUtPm1vZGUsIHAtPnR3by0+bW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3JlbmFtZV9jb3B5KGNvbnN0IGNoYXIgKnJlbmFtZWNvcHksIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCWNoYXIgKm5hbWVzID0gcHByaW50X3JlbmFtZShwLT5vbmUtPnBhdGgsIHAtPnR3by0+cGF0aCk7CisKKwlwcmludGYoIiAlcyAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksIG5hbWVzLAorCSAgICAgICAoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSkpOworCWZyZWUobmFtZXMpOworCXNob3dfbW9kZV9jaGFuZ2UocCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfc3VtbWFyeShzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwlzd2l0Y2gocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19ERUxFVEVEOgorCQlzaG93X2ZpbGVfbW9kZV9uYW1lKCJkZWxldGUiLCBwLT5vbmUpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX0FEREVEOgorCQlzaG93X2ZpbGVfbW9kZV9uYW1lKCJjcmVhdGUiLCBwLT50d28pOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX0NPUElFRDoKKwkJc2hvd19yZW5hbWVfY29weSgiY29weSIsIHApOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX1JFTkFNRUQ6CisJCXNob3dfcmVuYW1lX2NvcHkoInJlbmFtZSIsIHApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocC0+c2NvcmUpIHsKKwkJCWNoYXIgKm5hbWUgPSBxdW90ZV9vbmUocC0+dHdvLT5wYXRoKTsKKwkJCXByaW50ZigiIHJld3JpdGUgJXMgKCVkJSUpXG4iLCBuYW1lLAorCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSk7CisJCQlmcmVlKG5hbWUpOworCQkJc2hvd19tb2RlX2NoYW5nZShwLCAwKTsKKwkJfSBlbHNlCXNob3dfbW9kZV9jaGFuZ2UocCwgMSk7CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IHBhdGNoX2lkX3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCVNIQV9DVFggKmN0eDsKKwlpbnQgcGF0Y2hsZW47Cit9OworCitzdGF0aWMgaW50IHJlbW92ZV9zcGFjZShjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWludCBpOworICAgICAgICBjaGFyICpkc3QgPSBsaW5lOworICAgICAgICB1bnNpZ25lZCBjaGFyIGM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghaXNzcGFjZSgoYyA9IGxpbmVbaV0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGM7CisKKyAgICAgICAgcmV0dXJuIGRzdCAtIGxpbmU7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX2lkX2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IHBhdGNoX2lkX3QgKmRhdGEgPSBwcml2OworCWludCBuZXdfbGVuOworCisJLyogSWdub3JlIGxpbmUgbnVtYmVycyB3aGVuIGNvbXB1dGluZyB0aGUgU0hBMSBvZiB0aGUgcGF0Y2ggKi8KKwlpZiAoIXByZWZpeGNtcChsaW5lLCAiQEAgLSIpKQorCQlyZXR1cm47CisKKwluZXdfbGVuID0gcmVtb3ZlX3NwYWNlKGxpbmUsIGxlbik7CisKKwlTSEExX1VwZGF0ZShkYXRhLT5jdHgsIGxpbmUsIG5ld19sZW4pOworCWRhdGEtPnBhdGNobGVuICs9IG5ld19sZW47Cit9CisKKy8qIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIGFuZCB3cml0ZXMgcmVzdWx0IGludG8gc2hhMSAqLworc3RhdGljIGludCBkaWZmX2dldF9wYXRjaF9pZChzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCWludCBpOworCVNIQV9DVFggY3R4OworCXN0cnVjdCBwYXRjaF9pZF90IGRhdGE7CisJY2hhciBidWZmZXJbUEFUSF9NQVggKiA0ICsgMjBdOworCisJU0hBMV9Jbml0KCZjdHgpOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYXRjaF9pZF90KSk7CisJZGF0YS5jdHggPSAmY3R4OworCWRhdGEueG0uY29uc3VtZSA9IHBhdGNoX2lkX2NvbnN1bWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQl4cHBhcmFtX3QgeHBwOworCQl4ZGVtaXRjb25mX3QgeGVjZmc7CisJCXhkZW1pdGNiX3QgZWNiOworCQltbWZpbGVfdCBtZjEsIG1mMjsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaW50IGxlbjEsIGxlbjI7CisKKwkJaWYgKHAtPnN0YXR1cyA9PSAwKQorCQkJcmV0dXJuIGVycm9yKCJpbnRlcm5hbCBkaWZmIHN0YXR1cyBlcnJvciIpOworCQlpZiAocC0+c3RhdHVzID09IERJRkZfU1RBVFVTX1VOS05PV04pCisJCQljb250aW51ZTsKKwkJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQkJY29udGludWU7CisJCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCQkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkKKwkJCWNvbnRpbnVlOworCisJCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+b25lKTsKKwkJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT50d28pOworCQlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgcC0+b25lKSA8IDAgfHwKKwkJCQlmaWxsX21tZmlsZSgmbWYyLCBwLT50d28pIDwgMCkKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJCS8qIE1heWJlIGhhc2ggcC0+dHdvPyBpbnRvIHRoZSBwYXRjaCBpZD8gKi8KKwkJaWYgKGZpbGVfaXNfYmluYXJ5KHAtPnR3bykpCisJCQljb250aW51ZTsKKworCQlsZW4xID0gcmVtb3ZlX3NwYWNlKHAtPm9uZS0+cGF0aCwgc3RybGVuKHAtPm9uZS0+cGF0aCkpOworCQlsZW4yID0gcmVtb3ZlX3NwYWNlKHAtPnR3by0+cGF0aCwgc3RybGVuKHAtPnR3by0+cGF0aCkpOworCQlpZiAocC0+b25lLT5tb2RlID09IDApCisJCQlsZW4xID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJImRpZmYtLWdpdGEvJS4qc2IvJS4qcyIKKwkJCQkJIm5ld2ZpbGVtb2RlJTA2byIKKwkJCQkJIi0tLS9kZXYvbnVsbCIKKwkJCQkJIisrK2IvJS4qcyIsCisJCQkJCWxlbjEsIHAtPm9uZS0+cGF0aCwKKwkJCQkJbGVuMiwgcC0+dHdvLT5wYXRoLAorCQkJCQlwLT50d28tPm1vZGUsCisJCQkJCWxlbjIsIHAtPnR3by0+cGF0aCk7CisJCWVsc2UgaWYgKHAtPnR3by0+bW9kZSA9PSAwKQorCQkJbGVuMSA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSJkaWZmLS1naXRhLyUuKnNiLyUuKnMiCisJCQkJCSJkZWxldGVkZmlsZW1vZGUlMDZvIgorCQkJCQkiLS0tYS8lLipzIgorCQkJCQkiKysrL2Rldi9udWxsIiwKKwkJCQkJbGVuMSwgcC0+b25lLT5wYXRoLAorCQkJCQlsZW4yLCBwLT50d28tPnBhdGgsCisJCQkJCXAtPm9uZS0+bW9kZSwKKwkJCQkJbGVuMSwgcC0+b25lLT5wYXRoKTsKKwkJZWxzZQorCQkJbGVuMSA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSJkaWZmLS1naXRhLyUuKnNiLyUuKnMiCisJCQkJCSItLS1hLyUuKnMiCisJCQkJCSIrKytiLyUuKnMiLAorCQkJCQlsZW4xLCBwLT5vbmUtPnBhdGgsCisJCQkJCWxlbjIsIHAtPnR3by0+cGF0aCwKKwkJCQkJbGVuMSwgcC0+b25lLT5wYXRoLAorCQkJCQlsZW4yLCBwLT50d28tPnBhdGgpOworCQlTSEExX1VwZGF0ZSgmY3R4LCBidWZmZXIsIGxlbjEpOworCisJCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJCXhlY2ZnLmN0eGxlbiA9IDM7CisJCXhlY2ZnLmZsYWdzID0gWERMX0VNSVRfRlVOQ05BTUVTOworCQllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJCWVjYi5wcml2ID0gJmRhdGE7CisJCXhkbF9kaWZmKCZtZjEsICZtZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJfQorCisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpZmZfZmx1c2hfcGF0Y2hfaWQoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0ID0gZGlmZl9nZXRfcGF0Y2hfaWQob3B0aW9ucywgc2hhMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKKworCWZyZWUocS0+cXVldWUpOworCXEtPnF1ZXVlID0gTlVMTDsKKwlxLT5uciA9IHEtPmFsbG9jID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfc3VtbWFyeV9lbXB0eShjb25zdCBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCisJCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJY2FzZSBESUZGX1NUQVRVU19BRERFRDoKKwkJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCWNhc2UgRElGRl9TVEFUVVNfUkVOQU1FRDoKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJaWYgKHAtPnNjb3JlKQorCQkJCXJldHVybiAwOworCQkJaWYgKHAtPm9uZS0+bW9kZSAmJiBwLT50d28tPm1vZGUgJiYKKwkJCSAgICBwLT5vbmUtPm1vZGUgIT0gcC0+dHdvLT5tb2RlKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZGlmZl9mbHVzaChzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCWludCBpLCBvdXRwdXRfZm9ybWF0ID0gb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdDsKKwlpbnQgc2VwYXJhdG9yID0gMDsKKworCS8qCisJICogT3JkZXI6IHJhdywgc3RhdCwgc3VtbWFyeSwgcGF0Y2gKKwkgKiBvcjogICAgbmFtZS9uYW1lLXN0YXR1cy9jaGVja2RpZmYgKG90aGVyIGJpdHMgY2xlYXIpCisJICovCisJaWYgKCFxLT5ucikKKwkJZ290byBmcmVlX3F1ZXVlOworCisJaWYgKG91dHB1dF9mb3JtYXQgJiAoRElGRl9GT1JNQVRfUkFXIHwKKwkJCSAgICAgRElGRl9GT1JNQVRfTkFNRSB8CisJCQkgICAgIERJRkZfRk9STUFUX05BTUVfU1RBVFVTIHwKKwkJCSAgICAgRElGRl9GT1JNQVRfQ0hFQ0tESUZGKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmIChjaGVja19wYWlyX3N0YXR1cyhwKSkKKwkJCQlmbHVzaF9vbmVfcGFpcihwLCBvcHRpb25zKTsKKwkJfQorCQlzZXBhcmF0b3IrKzsKKwl9CisKKwlpZiAob3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9ESUZGU1RBVHxESUZGX0ZPUk1BVF9TSE9SVFNUQVR8RElGRl9GT1JNQVRfTlVNU1RBVCkpIHsKKwkJc3RydWN0IGRpZmZzdGF0X3QgZGlmZnN0YXQ7CisKKwkJbWVtc2V0KCZkaWZmc3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBkaWZmc3RhdF90KSk7CisJCWRpZmZzdGF0LnhtLmNvbnN1bWUgPSBkaWZmc3RhdF9jb25zdW1lOworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmIChjaGVja19wYWlyX3N0YXR1cyhwKSkKKwkJCQlkaWZmX2ZsdXNoX3N0YXQocCwgb3B0aW9ucywgJmRpZmZzdGF0KTsKKwkJfQorCQlpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX05VTVNUQVQpCisJCQlzaG93X251bXN0YXQoJmRpZmZzdGF0LCBvcHRpb25zKTsKKwkJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9ESUZGU1RBVCkKKwkJCXNob3dfc3RhdHMoJmRpZmZzdGF0LCBvcHRpb25zKTsKKwkJZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1NIT1JUU1RBVCkKKwkJCXNob3dfc2hvcnRzdGF0cygmZGlmZnN0YXQpOworCQlzZXBhcmF0b3IrKzsKKwl9CisKKwlpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1NVTU1BUlkgJiYgIWlzX3N1bW1hcnlfZW1wdHkocSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspCisJCQlkaWZmX3N1bW1hcnkocS0+cXVldWVbaV0pOworCQlzZXBhcmF0b3IrKzsKKwl9CisKKwlpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1BBVENIKSB7CisJCWlmIChzZXBhcmF0b3IpIHsKKwkJCWlmIChvcHRpb25zLT5zdGF0X3NlcCkgeworCQkJCS8qIGF0dGFjaCBwYXRjaCBpbnN0ZWFkIG9mIGlubGluZSAqLworCQkJCWZwdXRzKG9wdGlvbnMtPnN0YXRfc2VwLCBzdGRvdXQpOworCQkJfSBlbHNlIHsKKwkJCQlwdXRjaGFyKG9wdGlvbnMtPmxpbmVfdGVybWluYXRpb24pOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQlpZiAoY2hlY2tfcGFpcl9zdGF0dXMocCkpCisJCQkJZGlmZl9mbHVzaF9wYXRjaChwLCBvcHRpb25zKTsKKwkJfQorCX0KKworCWlmIChvdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfQ0FMTEJBQ0spCisJCW9wdGlvbnMtPmZvcm1hdF9jYWxsYmFjayhxLCBvcHRpb25zLCBvcHRpb25zLT5mb3JtYXRfY2FsbGJhY2tfZGF0YSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKK2ZyZWVfcXVldWU6CisJZnJlZShxLT5xdWV1ZSk7CisJcS0+cXVldWUgPSBOVUxMOworCXEtPm5yID0gcS0+YWxsb2MgPSAwOworfQorCitzdGF0aWMgdm9pZCBkaWZmY29yZV9hcHBseV9maWx0ZXIoY29uc3QgY2hhciAqZmlsdGVyKQoreworCWludCBpOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKworCWlmICghZmlsdGVyKQorCQlyZXR1cm47CisKKwlpZiAoc3RyY2hyKGZpbHRlciwgRElGRl9TVEFUVVNfRklMVEVSX0FPTikpIHsKKwkJaW50IGZvdW5kOworCQlmb3IgKGkgPSBmb3VuZCA9IDA7ICFmb3VuZCAmJiBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmICgoKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgKChwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9CUk9LRU4pKSB8fAorCQkJICAgICAgKCFwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX01PRElGSUVEKSkpKSB8fAorCQkJICAgICgocC0+c3RhdHVzICE9IERJRkZfU1RBVFVTX01PRElGSUVEKSAmJgorCQkJICAgICBzdHJjaHIoZmlsdGVyLCBwLT5zdGF0dXMpKSkKKwkJCQlmb3VuZCsrOworCQl9CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKKworCQkvKiBvdGhlcndpc2Ugd2Ugd2lsbCBjbGVhciB0aGUgd2hvbGUgcXVldWUKKwkJICogYnkgY29weWluZyB0aGUgZW1wdHkgb3V0cSBhdCB0aGUgZW5kIG9mIHRoaXMKKwkJICogZnVuY3Rpb24sIGJ1dCBmaXJzdCBjbGVhciB0aGUgY3VycmVudCBlbnRyaWVzCisJCSAqIGluIHRoZSBxdWV1ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKKwl9CisJZWxzZSB7CisJCS8qIE9ubHkgdGhlIG1hdGNoaW5nIG9uZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisKKwkJCWlmICgoKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgKChwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9CUk9LRU4pKSB8fAorCQkJICAgICAgKCFwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX01PRElGSUVEKSkpKSB8fAorCQkJICAgICgocC0+c3RhdHVzICE9IERJRkZfU1RBVFVTX01PRElGSUVEKSAmJgorCQkJICAgICBzdHJjaHIoZmlsdGVyLCBwLT5zdGF0dXMpKSkKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQkJZWxzZQorCQkJCWRpZmZfZnJlZV9maWxlcGFpcihwKTsKKwkJfQorCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7Cit9CisKK3ZvaWQgZGlmZmNvcmVfc3RkKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaWYgKG9wdGlvbnMtPnF1aWV0KQorCQlyZXR1cm47CisJaWYgKG9wdGlvbnMtPmJyZWFrX29wdCAhPSAtMSkKKwkJZGlmZmNvcmVfYnJlYWsob3B0aW9ucy0+YnJlYWtfb3B0KTsKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSkKKwkJZGlmZmNvcmVfcmVuYW1lKG9wdGlvbnMpOworCWlmIChvcHRpb25zLT5icmVha19vcHQgIT0gLTEpCisJCWRpZmZjb3JlX21lcmdlX2Jyb2tlbigpOworCWlmIChvcHRpb25zLT5waWNrYXhlKQorCQlkaWZmY29yZV9waWNrYXhlKG9wdGlvbnMtPnBpY2theGUsIG9wdGlvbnMtPnBpY2theGVfb3B0cyk7CisJaWYgKG9wdGlvbnMtPm9yZGVyZmlsZSkKKwkJZGlmZmNvcmVfb3JkZXIob3B0aW9ucy0+b3JkZXJmaWxlKTsKKwlkaWZmX3Jlc29sdmVfcmVuYW1lX2NvcHkoKTsKKwlkaWZmY29yZV9hcHBseV9maWx0ZXIob3B0aW9ucy0+ZmlsdGVyKTsKKworCW9wdGlvbnMtPmhhc19jaGFuZ2VzID0gISFkaWZmX3F1ZXVlZF9kaWZmLm5yOworfQorCisKK3ZvaWQgZGlmZl9hZGRyZW1vdmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyIGNvbmNhdHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwkvKiBUaGlzIG1heSBsb29rIG9kZCwgYnV0IGl0IGlzIGEgcHJlcGFyYXRpb24gZm9yCisJICogZmVlZGluZyAidGhlcmUgYXJlIHVuY2hhbmdlZCBmaWxlcyB3aGljaCBzaG91bGQKKwkgKiBub3QgcHJvZHVjZSBkaWZmcywgYnV0IHdoZW4geW91IGFyZSBkb2luZyBjb3B5CisJICogZGV0ZWN0aW9uIHlvdSB3b3VsZCBuZWVkIHRoZW0sIHNvIGhlcmUgdGhleSBhcmUiCisJICogZW50cmllcyB0byB0aGUgZGlmZi1jb3JlLiAgVGhleSB3aWxsIGJlIHByZWZpeGVkCisJICogd2l0aCBzb21ldGhpbmcgbGlrZSAnPScgb3IgJyonIChJIGhhdmVuJ3QgZGVjaWRlZAorCSAqIHdoaWNoIGJ1dCBzaG91bGQgbm90IG1ha2UgYW55IGRpZmZlcmVuY2UpLgorCSAqIEZlZWRpbmcgdGhlIHNhbWUgbmV3IGFuZCBvbGQgdG8gZGlmZl9jaGFuZ2UoKSAKKwkgKiBhbHNvIGhhcyB0aGUgc2FtZSBlZmZlY3QuCisJICogQmVmb3JlIHRoZSBmaW5hbCBvdXRwdXQgaGFwcGVucywgdGhleSBhcmUgcHJ1bmVkIGFmdGVyCisJICogbWVyZ2VkIGludG8gcmVuYW1lL2NvcHkgcGFpcnMgYXMgYXBwcm9wcmlhdGUuCisJICovCisJaWYgKG9wdGlvbnMtPnJldmVyc2VfZGlmZikKKwkJYWRkcmVtb3ZlID0gKGFkZHJlbW92ZSA9PSAnKycgPyAnLScgOgorCQkJICAgICBhZGRyZW1vdmUgPT0gJy0nID8gJysnIDogYWRkcmVtb3ZlKTsKKworCWlmICghcGF0aCkgcGF0aCA9ICIiOworCXNwcmludGYoY29uY2F0cGF0aCwgIiVzJXMiLCBiYXNlLCBwYXRoKTsKKwlvbmUgPSBhbGxvY19maWxlc3BlYyhjb25jYXRwYXRoKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhjb25jYXRwYXRoKTsKKworCWlmIChhZGRyZW1vdmUgIT0gJysnKQorCQlmaWxsX2ZpbGVzcGVjKG9uZSwgc2hhMSwgbW9kZSk7CisJaWYgKGFkZHJlbW92ZSAhPSAnLScpCisJCWZpbGxfZmlsZXNwZWModHdvLCBzaGExLCBtb2RlKTsKKworCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIG9uZSwgdHdvKTsKKwlvcHRpb25zLT5oYXNfY2hhbmdlcyA9IDE7Cit9CisKK3ZvaWQgZGlmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKSAKK3sKKwljaGFyIGNvbmNhdHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwlpZiAob3B0aW9ucy0+cmV2ZXJzZV9kaWZmKSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqdG1wX2M7CisJCXRtcCA9IG9sZF9tb2RlOyBvbGRfbW9kZSA9IG5ld19tb2RlOyBuZXdfbW9kZSA9IHRtcDsKKwkJdG1wX2MgPSBvbGRfc2hhMTsgb2xkX3NoYTEgPSBuZXdfc2hhMTsgbmV3X3NoYTEgPSB0bXBfYzsKKwl9CisJaWYgKCFwYXRoKSBwYXRoID0gIiI7CisJc3ByaW50Zihjb25jYXRwYXRoLCAiJXMlcyIsIGJhc2UsIHBhdGgpOworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCXR3byA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCWZpbGxfZmlsZXNwZWMob25lLCBvbGRfc2hhMSwgb2xkX21vZGUpOworCWZpbGxfZmlsZXNwZWModHdvLCBuZXdfc2hhMSwgbmV3X21vZGUpOworCisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworCW9wdGlvbnMtPmhhc19jaGFuZ2VzID0gMTsKK30KKwordm9pZCBkaWZmX3VubWVyZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICpwYXRoLAorCQkgIHVuc2lnbmVkIG1vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bzsKKwlvbmUgPSBhbGxvY19maWxlc3BlYyhwYXRoKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhwYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKG9uZSwgc2hhMSwgbW9kZSk7CisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pLT5pc191bm1lcmdlZCA9IDE7Cit9CmRpZmYgLS1naXQgYS9kaWZmLmggYi9kaWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3MzhjMQotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaWZuZGVmIERJRkZfSAorI2RlZmluZSBESUZGX0gKKworI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCitzdHJ1Y3QgcmV2X2luZm87CitzdHJ1Y3QgZGlmZl9vcHRpb25zOworc3RydWN0IGRpZmZfcXVldWVfc3RydWN0OworCit0eXBlZGVmIHZvaWQgKCpjaGFuZ2VfZm5fdCkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKwordHlwZWRlZiB2b2lkICgqYWRkX3JlbW92ZV9mbl90KShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgICAgaW50IGFkZHJlbW92ZSwgdW5zaWduZWQgbW9kZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKwordHlwZWRlZiB2b2lkICgqZGlmZl9mb3JtYXRfZm5fdCkoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxLAorCQlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLCB2b2lkICpkYXRhKTsKKworI2RlZmluZSBESUZGX0ZPUk1BVF9SQVcJCTB4MDAwMQorI2RlZmluZSBESUZGX0ZPUk1BVF9ESUZGU1RBVAkweDAwMDIKKyNkZWZpbmUgRElGRl9GT1JNQVRfTlVNU1RBVAkweDAwMDQKKyNkZWZpbmUgRElGRl9GT1JNQVRfU1VNTUFSWQkweDAwMDgKKyNkZWZpbmUgRElGRl9GT1JNQVRfUEFUQ0gJMHgwMDEwCisjZGVmaW5lIERJRkZfRk9STUFUX1NIT1JUU1RBVAkweDAwMjAKKworLyogVGhlc2Ugb3ZlcnJpZGUgYWxsIGFib3ZlICovCisjZGVmaW5lIERJRkZfRk9STUFUX05BTUUJMHgwMTAwCisjZGVmaW5lIERJRkZfRk9STUFUX05BTUVfU1RBVFVTCTB4MDIwMAorI2RlZmluZSBESUZGX0ZPUk1BVF9DSEVDS0RJRkYJMHgwNDAwCisKKy8qIFNhbWUgYXMgb3V0cHV0X2Zvcm1hdCA9IDAgYnV0IHdlIGtub3cgdGhhdCAtcyBmbGFnIHdhcyBnaXZlbgorICogYW5kIHdlIHNob3VsZCBub3QgZ2l2ZSBkZWZhdWx0IHZhbHVlIHRvIG91dHB1dF9mb3JtYXQuCisgKi8KKyNkZWZpbmUgRElGRl9GT1JNQVRfTk9fT1VUUFVUCTB4MDgwMAorCisjZGVmaW5lIERJRkZfRk9STUFUX0NBTExCQUNLCTB4MTAwMAorCitzdHJ1Y3QgZGlmZl9vcHRpb25zIHsKKwljb25zdCBjaGFyICpmaWx0ZXI7CisJY29uc3QgY2hhciAqb3JkZXJmaWxlOworCWNvbnN0IGNoYXIgKnBpY2theGU7CisJY29uc3QgY2hhciAqc2luZ2xlX2ZvbGxvdzsKKwl1bnNpZ25lZCByZWN1cnNpdmU6MSwKKwkJIHRyZWVfaW5fcmVjdXJzaXZlOjEsCisJCSBiaW5hcnk6MSwKKwkJIHRleHQ6MSwKKwkJIGZ1bGxfaW5kZXg6MSwKKwkJIHNpbGVudF9vbl9yZW1vdmU6MSwKKwkJIGZpbmRfY29waWVzX2hhcmRlcjoxLAorCQkgY29sb3JfZGlmZjoxLAorCQkgY29sb3JfZGlmZl93b3JkczoxLAorCQkgaGFzX2NoYW5nZXM6MSwKKwkJIHF1aWV0OjEsCisJCSBhbGxvd19leHRlcm5hbDoxLAorCQkgZXhpdF93aXRoX3N0YXR1czoxOworCWludCBjb250ZXh0OworCWludCBicmVha19vcHQ7CisJaW50IGRldGVjdF9yZW5hbWU7CisJaW50IGxpbmVfdGVybWluYXRpb247CisJaW50IG91dHB1dF9mb3JtYXQ7CisJaW50IHBpY2theGVfb3B0czsKKwlpbnQgcmVuYW1lX3Njb3JlOworCWludCByZXZlcnNlX2RpZmY7CisJaW50IHJlbmFtZV9saW1pdDsKKwlpbnQgc2V0dXA7CisJaW50IGFiYnJldjsKKwljb25zdCBjaGFyICptc2dfc2VwOworCWNvbnN0IGNoYXIgKnN0YXRfc2VwOworCWxvbmcgeGRsX29wdHM7CisKKwlpbnQgc3RhdF93aWR0aDsKKwlpbnQgc3RhdF9uYW1lX3dpZHRoOworCisJLyogdGhpcyBpcyBzZXQgYnkgZGlmZmNvcmUgZm9yIERJRkZfRk9STUFUX1BBVENIICovCisJaW50IGZvdW5kX2NoYW5nZXM7CisKKwlpbnQgbnJfcGF0aHM7CisJY29uc3QgY2hhciAqKnBhdGhzOworCWludCAqcGF0aGxlbnM7CisJY2hhbmdlX2ZuX3QgY2hhbmdlOworCWFkZF9yZW1vdmVfZm5fdCBhZGRfcmVtb3ZlOworCWRpZmZfZm9ybWF0X2ZuX3QgZm9ybWF0X2NhbGxiYWNrOworCXZvaWQgKmZvcm1hdF9jYWxsYmFja19kYXRhOworfTsKKworZW51bSBjb2xvcl9kaWZmIHsKKwlESUZGX1JFU0VUID0gMCwKKwlESUZGX1BMQUlOID0gMSwKKwlESUZGX01FVEFJTkZPID0gMiwKKwlESUZGX0ZSQUdJTkZPID0gMywKKwlESUZGX0ZJTEVfT0xEID0gNCwKKwlESUZGX0ZJTEVfTkVXID0gNSwKKwlESUZGX0NPTU1JVCA9IDYsCisJRElGRl9XSElURVNQQUNFID0gNywKK307Citjb25zdCBjaGFyICpkaWZmX2dldF9jb2xvcihpbnQgZGlmZl91c2VfY29sb3IsIGVudW0gY29sb3JfZGlmZiBpeCk7CisKK2V4dGVybiBjb25zdCBjaGFyIG1pbWVfYm91bmRhcnlfbGVhZGVyW107CisKK2V4dGVybiB2b2lkIGRpZmZfdHJlZV9zZXR1cF9wYXRocyhjb25zdCBjaGFyICoqcGF0aHMsIHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CitleHRlcm4gdm9pZCBkaWZmX3RyZWVfcmVsZWFzZV9wYXRocyhzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIGludCBkaWZmX3RyZWUoc3RydWN0IHRyZWVfZGVzYyAqdDEsIHN0cnVjdCB0cmVlX2Rlc2MgKnQyLAorCQkgICAgIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCk7CitleHRlcm4gaW50IGRpZmZfdHJlZV9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3LAorCQkJICBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpOworZXh0ZXJuIGludCBkaWZmX3Jvb3RfdHJlZV9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywgY29uc3QgY2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpOworCitzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggeworCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqbmV4dDsKKwlpbnQgbGVuOworCWNoYXIgKnBhdGg7CisJdW5zaWduZWQgaW50IG1vZGU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCB7CisJCWNoYXIgc3RhdHVzOworCQl1bnNpZ25lZCBpbnQgbW9kZTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl9IHBhcmVudFtGTEVYX0FSUkFZXTsKK307CisjZGVmaW5lIGNvbWJpbmVfZGlmZl9wYXRoX3NpemUobiwgbCkgXAorCShzaXplb2Yoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoKSArIFwKKwkgc2l6ZW9mKHN0cnVjdCBjb21iaW5lX2RpZmZfcGFyZW50KSAqIChuKSArIChsKSArIDEpCisKK2V4dGVybiB2b2lkIHNob3dfY29tYmluZWRfZGlmZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmVsZW0sIGludCBudW1fcGFyZW50LAorCQkJICAgICAgaW50IGRlbnNlLCBzdHJ1Y3QgcmV2X2luZm8gKik7CisKK2V4dGVybiB2b2lkIGRpZmZfdHJlZV9jb21iaW5lZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCB1bnNpZ25lZCBjaGFyIHBhcmVudFtdWzIwXSwgaW50IG51bV9wYXJlbnQsIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICpyZXYpOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfY29tYmluZWRfbWVyZ2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50LCBzdHJ1Y3QgcmV2X2luZm8gKik7CisKK2V4dGVybiB2b2lkIGRpZmZfYWRkcmVtb3ZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCSAgIGludCBhZGRyZW1vdmUsCisJCQkgICB1bnNpZ25lZCBtb2RlLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkgICBjb25zdCBjaGFyICpwYXRoKTsKKworZXh0ZXJuIHZvaWQgZGlmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqLAorCQkJdW5zaWduZWQgbW9kZTEsIHVuc2lnbmVkIG1vZGUyLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTIsCisJCQljb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKworZXh0ZXJuIHZvaWQgZGlmZl91bm1lcmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCSBjb25zdCBjaGFyICpwYXRoLAorCQkJIHVuc2lnbmVkIG1vZGUsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK2V4dGVybiBpbnQgZGlmZl9zY29yZW9wdF9wYXJzZShjb25zdCBjaGFyICpvcHQpOworCisjZGVmaW5lIERJRkZfU0VUVVBfUkVWRVJTRSAgICAgIAkxCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX0NBQ0hFCQkyCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX1NJWkVfQ0FDSEUJNAorCitleHRlcm4gaW50IGdpdF9kaWZmX3VpX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGRpZmZfc2V0dXAoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKK2V4dGVybiBpbnQgZGlmZl9vcHRfcGFyc2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqLCBjb25zdCBjaGFyICoqLCBpbnQpOworZXh0ZXJuIGludCBkaWZmX3NldHVwX2RvbmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKKworI2RlZmluZSBESUZGX0RFVEVDVF9SRU5BTUUJMQorI2RlZmluZSBESUZGX0RFVEVDVF9DT1BZCTIKKworI2RlZmluZSBESUZGX1BJQ0tBWEVfQUxMCTEKKyNkZWZpbmUgRElGRl9QSUNLQVhFX1JFR0VYCTIKKworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfc3RkKHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CisKKyNkZWZpbmUgQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQIFwKKyJcbmNvbW1vbiBkaWZmIG9wdGlvbnM6XG4iIFwKKyIgIC16ICAgICAgICAgICAgb3V0cHV0IGRpZmYtcmF3IHdpdGggbGluZXMgdGVybWluYXRlZCB3aXRoIE5VTC5cbiIgXAorIiAgLXAgICAgICAgICAgICBvdXRwdXQgcGF0Y2ggZm9ybWF0LlxuIiBcCisiICAtdSAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1wLlxuIiBcCisiICAtLXBhdGNoLXdpdGgtcmF3XG4iIFwKKyIgICAgICAgICAgICAgICAgb3V0cHV0IGJvdGggYSBwYXRjaCBhbmQgdGhlIGRpZmYtcmF3IGZvcm1hdC5cbiIgXAorIiAgLS1zdGF0ICAgICAgICBzaG93IGRpZmZzdGF0IGluc3RlYWQgb2YgcGF0Y2guXG4iIFwKKyIgIC0tbnVtc3RhdCAgICAgc2hvdyBudW1lcmljIGRpZmZzdGF0IGluc3RlYWQgb2YgcGF0Y2guXG4iIFwKKyIgIC0tcGF0Y2gtd2l0aC1zdGF0XG4iIFwKKyIgICAgICAgICAgICAgICAgb3V0cHV0IGEgcGF0Y2ggYW5kIHByZXBlbmQgaXRzIGRpZmZzdGF0LlxuIiBcCisiICAtLW5hbWUtb25seSAgIHNob3cgb25seSBuYW1lcyBvZiBjaGFuZ2VkIGZpbGVzLlxuIiBcCisiICAtLW5hbWUtc3RhdHVzIHNob3cgbmFtZXMgYW5kIHN0YXR1cyBvZiBjaGFuZ2VkIGZpbGVzLlxuIiBcCisiICAtLWZ1bGwtaW5kZXggIHNob3cgZnVsbCBvYmplY3QgbmFtZSBvbiBpbmRleCBsaW5lcy5cbiIgXAorIiAgLS1hYmJyZXY9PG4+ICBhYmJyZXZpYXRlIG9iamVjdCBuYW1lcyBpbiBkaWZmLXRyZWUgaGVhZGVyIGFuZCBkaWZmLXJhdy5cbiIgXAorIiAgLVIgICAgICAgICAgICBzd2FwIGlucHV0IGZpbGUgcGFpcnMuXG4iIFwKKyIgIC1CICAgICAgICAgICAgZGV0ZWN0IGNvbXBsZXRlIHJld3JpdGVzLlxuIiBcCisiICAtTSAgICAgICAgICAgIGRldGVjdCByZW5hbWVzLlxuIiBcCisiICAtQyAgICAgICAgICAgIGRldGVjdCBjb3BpZXMuXG4iIFwKKyIgIC0tZmluZC1jb3BpZXMtaGFyZGVyXG4iIFwKKyIgICAgICAgICAgICAgICAgdHJ5IHVuY2hhbmdlZCBmaWxlcyBhcyBjYW5kaWRhdGUgZm9yIGNvcHkgZGV0ZWN0aW9uLlxuIiBcCisiICAtbDxuPiAgICAgICAgIGxpbWl0IHJlbmFtZSBhdHRlbXB0cyB1cCB0byA8bj4gcGF0aHMuXG4iIFwKKyIgIC1PPGZpbGU+ICAgICAgcmVvcmRlciBkaWZmcyBhY2NvcmRpbmcgdG8gdGhlIDxmaWxlPi5cbiIgXAorIiAgLVM8c3RyaW5nPiAgICBmaW5kIGZpbGVwYWlyIHdob3NlIG9ubHkgb25lIHNpZGUgY29udGFpbnMgdGhlIHN0cmluZy5cbiIgXAorIiAgLS1waWNrYXhlLWFsbFxuIiBcCisiICAgICAgICAgICAgICAgIHNob3cgYWxsIGZpbGVzIGRpZmYgd2hlbiAtUyBpcyB1c2VkIGFuZCBoaXQgaXMgZm91bmQuXG4iIFwKKyIgIC1hICAtLXRleHQgICAgdHJlYXQgYWxsIGZpbGVzIGFzIHRleHQuXG4iCisKK2V4dGVybiBpbnQgZGlmZl9xdWV1ZV9pc19lbXB0eSh2b2lkKTsKK2V4dGVybiB2b2lkIGRpZmZfZmx1c2goc3RydWN0IGRpZmZfb3B0aW9ucyopOworCisvKiBkaWZmLXJhdyBzdGF0dXMgbGV0dGVycyAqLworI2RlZmluZSBESUZGX1NUQVRVU19BRERFRAkJJ0EnCisjZGVmaW5lIERJRkZfU1RBVFVTX0NPUElFRAkJJ0MnCisjZGVmaW5lIERJRkZfU1RBVFVTX0RFTEVURUQJCSdEJworI2RlZmluZSBESUZGX1NUQVRVU19NT0RJRklFRAkJJ00nCisjZGVmaW5lIERJRkZfU1RBVFVTX1JFTkFNRUQJCSdSJworI2RlZmluZSBESUZGX1NUQVRVU19UWVBFX0NIQU5HRUQJJ1QnCisjZGVmaW5lIERJRkZfU1RBVFVTX1VOS05PV04JCSdYJworI2RlZmluZSBESUZGX1NUQVRVU19VTk1FUkdFRAkJJ1UnCisKKy8qIHRoZXNlIGFyZSBub3QgZGlmZi1yYXcgc3RhdHVzIGxldHRlcnMgcHJvcGVyLCBidXQgdXNlZCBieQorICogZGlmZmNvcmUtZmlsdGVyIGluc24gdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucy4KKyAqLworI2RlZmluZSBESUZGX1NUQVRVU19GSUxURVJfQU9OCQknKicKKyNkZWZpbmUgRElGRl9TVEFUVVNfRklMVEVSX0JST0tFTgknQicKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRpZmZfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK2V4dGVybiBpbnQgcnVuX2RpZmZfZmlsZXMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgc2lsZW50X29uX3JlbW92ZWQpOworZXh0ZXJuIGludCBzZXR1cF9kaWZmX25vX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiogYXJndiwgaW50IG5vbmdpdCwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgcnVuX2RpZmZfZmlsZXNfY21kKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKKworZXh0ZXJuIGludCBydW5fZGlmZl9pbmRleChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBjYWNoZWQpOworCitleHRlcm4gaW50IGRvX2RpZmZfY2FjaGUoY29uc3QgdW5zaWduZWQgY2hhciAqLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIGludCBkaWZmX2ZsdXNoX3BhdGNoX2lkKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwgdW5zaWduZWQgY2hhciAqKTsKKworI2VuZGlmIC8qIERJRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZGlmZmNvcmUtYnJlYWsuYyBiL2RpZmZjb3JlLWJyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOWI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RpZmZjb3JlLWJyZWFrLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKK3N0YXRpYyBpbnQgc2hvdWxkX2JyZWFrKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcmMsCisJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJaW50IGJyZWFrX3Njb3JlLAorCQkJaW50ICptZXJnZV9zY29yZV9wKQoreworCS8qIGRzdCBpcyByZWNvcmRlZCBhcyBhIG1vZGlmaWNhdGlvbiBvZiBzcmMuICBBcmUgdGhleSBzbworCSAqIGRpZmZlcmVudCB0aGF0IHdlIGFyZSBiZXR0ZXIgb2ZmIHJlY29yZGluZyB0aGlzIGFzIGEgcGFpcgorCSAqIG9mIGRlbGV0ZSBhbmQgY3JlYXRlPworCSAqCisJICogVGhlcmUgYXJlIHR3byBjcml0ZXJpYSB1c2VkIGluIHRoaXMgYWxnb3JpdGhtLiAgRm9yIHRoZQorCSAqIHB1cnBvc2VzIG9mIGhlbHBpbmcgbGF0ZXIgcmVuYW1lL2NvcHksIHdlIHRha2UgYm90aCBkZWxldGUKKwkgKiBhbmQgaW5zZXJ0IGludG8gYWNjb3VudCBhbmQgZXN0aW1hdGUgdGhlIGFtb3VudCBvZiAiZWRpdCIuCisJICogSWYgdGhlIGVkaXQgaXMgdmVyeSBsYXJnZSwgd2UgYnJlYWsgdGhpcyBwYWlyIHNvIHRoYXQKKwkgKiByZW5hbWUvY29weSBjYW4gcGljayB0aGUgcGllY2VzIHVwIHRvIG1hdGNoIHdpdGggb3RoZXIKKwkgKiBmaWxlcy4KKwkgKgorCSAqIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSB3b3VsZCB3YW50IHRvIGlnbm9yZSBpbnNlcnRzIGZvciB0aGUKKwkgKiBwdXJlICJjb21wbGV0ZSByZXdyaXRlIiBkZXRlY3Rpb24uICBBcyBsb25nIGFzIG1vc3Qgb2YgdGhlCisJICogZXhpc3RpbmcgY29udGVudHMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGZpbGUsIGl0IGlzIGEKKwkgKiBjb21wbGV0ZSByZXdyaXRlLCBhbmQgaWYgc2l6YWJsZSBjaHVuayBmcm9tIHRoZSBvcmlnaW5hbAorCSAqIHN0aWxsIHJlbWFpbnMgaW4gdGhlIHJlc3VsdCwgaXQgaXMgbm90IGEgcmV3cml0ZS4gIEl0IGRvZXMKKwkgKiBub3QgbWF0dGVyIGhvdyBtdWNoIG9yIGhvdyBsaXR0bGUgbmV3IG1hdGVyaWFsIGlzIGFkZGVkIHRvCisJICogdGhlIGZpbGUuCisJICoKKwkgKiBUaGUgc2NvcmUgd2UgbGVhdmUgZm9yIHN1Y2ggYSBicm9rZW4gZmlsZXBhaXIgdXNlcyB0aGUKKwkgKiBsYXR0ZXIgZGVmaW5pdGlvbiBzbyB0aGF0IGxhdGVyIGNsZWFuLXVwIHN0YWdlIGNhbiBmaW5kIHRoZQorCSAqIHBpZWNlcyB0aGF0IHNob3VsZCBub3QgaGF2ZSBiZWVuIGJyb2tlbiBhY2NvcmRpbmcgdG8gdGhlCisJICogbGF0dGVyIGRlZmluaXRpb24gYWZ0ZXIgcmVuYW1lL2NvcHkgcnVucywgYW5kIG1lcmdlIHRoZQorCSAqIGJyb2tlbiBwYWlyIHRoYXQgaGF2ZSBhIHNjb3JlIGxvd2VyIHRoYW4gZ2l2ZW4gY3JpdGVyaWEKKwkgKiBiYWNrIHRvZ2V0aGVyLiAgVGhlIGJyZWFrIG9wZXJhdGlvbiBpdHNlbGYgaGFwcGVucworCSAqIGFjY29yZGluZyB0byB0aGUgZm9ybWVyIGRlZmluaXRpb24uCisJICoKKwkgKiBUaGUgbWluaW11bV9lZGl0IHBhcmFtZXRlciB0ZWxscyB1cyB3aGVuIHRvIGJyZWFrICh0aGUKKwkgKiBhbW91bnQgb2YgImVkaXQiIHJlcXVpcmVkIGZvciB1cyB0byBjb25zaWRlciBicmVha2luZyB0aGUKKwkgKiBwYWlyKS4gIFdlIGxlYXZlIHRoZSBhbW91bnQgb2YgZGVsZXRpb24gaW4gKm1lcmdlX3Njb3JlX3AKKwkgKiB3aGVuIHdlIHJldHVybi4KKwkgKgorCSAqIFRoZSB2YWx1ZSB3ZSByZXR1cm4gaXMgMSBpZiB3ZSB3YW50IHRoZSBwYWlyIHRvIGJlIGJyb2tlbiwKKwkgKiBvciAwIGlmIHdlIGRvIG5vdC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsIGJhc2Vfc2l6ZSwgc3JjX2NvcGllZCwgbGl0ZXJhbF9hZGRlZCwKKwkJc3JjX3JlbW92ZWQ7CisKKwkqbWVyZ2Vfc2NvcmVfcCA9IDA7IC8qIGFzc3VtZSBubyBkZWxldGlvbiAtLS0gImRvIG5vdCBicmVhayIKKwkJCSAgICAgKiBpcyB0aGUgZGVmYXVsdC4KKwkJCSAgICAgKi8KKworCWlmICghU19JU1JFRyhzcmMtPm1vZGUpIHx8ICFTX0lTUkVHKGRzdC0+bW9kZSkpCisJCXJldHVybiAwOyAvKiBsZWF2ZSBzeW1saW5rIHJlbmFtZSBhbG9uZSAqLworCisJaWYgKHNyYy0+c2hhMV92YWxpZCAmJiBkc3QtPnNoYTFfdmFsaWQgJiYKKwkgICAgIWhhc2hjbXAoc3JjLT5zaGExLCBkc3QtPnNoYTEpKQorCQlyZXR1cm4gMDsgLyogdGhleSBhcmUgdGhlIHNhbWUgKi8KKworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMCkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDApKQorCQlyZXR1cm4gMDsgLyogZXJyb3IgYnV0IGNhdWdodCBkb3duc3RyZWFtICovCisKKwliYXNlX3NpemUgPSAoKHNyYy0+c2l6ZSA8IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCWlmIChiYXNlX3NpemUgPCBNSU5JTVVNX0JSRUFLX1NJWkUpCisJCXJldHVybiAwOyAvKiB3ZSBkbyBub3QgYnJlYWsgdG9vIHNtYWxsIGZpbGVwYWlyICovCisKKwlpZiAoZGlmZmNvcmVfY291bnRfY2hhbmdlcyhzcmMtPmRhdGEsIHNyYy0+c2l6ZSwKKwkJCQkgICBkc3QtPmRhdGEsIGRzdC0+c2l6ZSwKKwkJCQkgICBOVUxMLCBOVUxMLAorCQkJCSAgIDAsCisJCQkJICAgJnNyY19jb3BpZWQsICZsaXRlcmFsX2FkZGVkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzYW5pdHkgKi8KKwlpZiAoc3JjLT5zaXplIDwgc3JjX2NvcGllZCkKKwkJc3JjX2NvcGllZCA9IHNyYy0+c2l6ZTsKKwlpZiAoZHN0LT5zaXplIDwgbGl0ZXJhbF9hZGRlZCArIHNyY19jb3BpZWQpIHsKKwkJaWYgKHNyY19jb3BpZWQgPCBkc3QtPnNpemUpCisJCQlsaXRlcmFsX2FkZGVkID0gZHN0LT5zaXplIC0gc3JjX2NvcGllZDsKKwkJZWxzZQorCQkJbGl0ZXJhbF9hZGRlZCA9IDA7CisJfQorCXNyY19yZW1vdmVkID0gc3JjLT5zaXplIC0gc3JjX2NvcGllZDsKKworCS8qIENvbXB1dGUgbWVyZ2Utc2NvcmUsIHdoaWNoIGlzICJob3cgbXVjaCBpcyByZW1vdmVkCisJICogZnJvbSB0aGUgc291cmNlIG1hdGVyaWFsIi4gIFRoZSBjbGVhbi11cCBzdGFnZSB3aWxsCisJICogbWVyZ2UgdGhlIHN1cnZpdmluZyBwYWlyIHRvZ2V0aGVyIGlmIHRoZSBzY29yZSBpcworCSAqIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgYWZ0ZXIgcmVuYW1lL2NvcHkgcnVucy4KKwkgKi8KKwkqbWVyZ2Vfc2NvcmVfcCA9IChpbnQpKHNyY19yZW1vdmVkICogTUFYX1NDT1JFIC8gc3JjLT5zaXplKTsKKworCS8qIEV4dGVudCBvZiBkYW1hZ2UsIHdoaWNoIGNvdW50cyBib3RoIGluc2VydHMgYW5kCisJICogZGVsZXRlcy4KKwkgKi8KKwlkZWx0YV9zaXplID0gc3JjX3JlbW92ZWQgKyBsaXRlcmFsX2FkZGVkOworCWlmIChkZWx0YV9zaXplICogTUFYX1NDT1JFIC8gYmFzZV9zaXplIDwgYnJlYWtfc2NvcmUpCisJCXJldHVybiAwOworCisJLyogSWYgeW91IHJlbW92ZWQgYSBsb3Qgd2l0aG91dCBhZGRpbmcgbmV3IG1hdGVyaWFsLCB0aGF0IGlzCisJICogbm90IHJlYWxseSBhIHJld3JpdGUuCisJICovCisJaWYgKChzcmMtPnNpemUgKiBicmVha19zY29yZSA8IHNyY19yZW1vdmVkICogTUFYX1NDT1JFKSAmJgorCSAgICAobGl0ZXJhbF9hZGRlZCAqIDIwIDwgc3JjX3JlbW92ZWQpICYmCisJICAgIChsaXRlcmFsX2FkZGVkICogMjAgPCBzcmNfY29waWVkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkaWZmY29yZV9icmVhayhpbnQgYnJlYWtfc2NvcmUpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisKKwkvKiBXaGVuIHRoZSBmaWxlcGFpciBoYXMgdGhpcyBtdWNoIGVkaXQgKGluc2VydCBhbmQgZGVsZXRlKSwKKwkgKiBpdCBpcyBmaXJzdCBjb25zaWRlcmVkIHRvIGJlIGEgcmV3cml0ZSBhbmQgYnJva2VuIGludG8gYQorCSAqIGNyZWF0ZSBhbmQgZGVsZXRlIGZpbGVwYWlyLiAgVGhpcyBpcyB0byBoZWxwIGJyZWFraW5nIGEKKwkgKiBmaWxlIHRoYXQgaGFkIHRvbyBtdWNoIG5ldyBzdHVmZiBhZGRlZCwgcG9zc2libHkgZnJvbQorCSAqIG1vdmluZyBjb250ZW50cyBmcm9tIGFub3RoZXIgZmlsZSwgc28gdGhhdCByZW5hbWUvY29weSBjYW4KKwkgKiBtYXRjaCBpdCB3aXRoIHRoZSBvdGhlciBmaWxlLgorCSAqCisJICogaW50IGJyZWFrX3Njb3JlOyB3ZSByZXVzZSBpbmNvbWluZyBwYXJhbWV0ZXIgZm9yIHRoaXMuCisJICovCisKKwkvKiBBZnRlciBhIHBhaXIgaXMgYnJva2VuIGFjY29yZGluZyB0byBicmVha19zY29yZSBhbmQKKwkgKiBzdWJqZWN0ZWQgdG8gcmVuYW1lL2NvcHksIGJvdGggb2YgdGhlbSBtYXkgc3Vydml2ZSBpbnRhY3QsCisJICogZHVlIHRvIGxhY2sgb2Ygc3VpdGFibGUgcmVuYW1lL2NvcHkgcGVlci4gIE9yLCB0aGUgY2FsbGVyCisJICogbWF5IGJlIGNhbGxpbmcgdXMgd2l0aG91dCB1c2luZyByZW5hbWUvY29weS4gIFdoZW4gdGhhdAorCSAqIGhhcHBlbnMsIHdlIG1lcmdlIHRoZSBicm9rZW4gcGllY2VzIGJhY2sgaW50byBvbmUKKwkgKiBtb2RpZmljYXRpb24gdG9nZXRoZXIgaWYgdGhlIHBhaXIgZGlkIG5vdCBoYXZlIG1vcmUgdGhhbgorCSAqIHRoaXMgbXVjaCBkZWxldGUuICBGb3IgdGhpcyBjb21wdXRhdGlvbiwgd2UgZG8gbm90IHRha2UKKwkgKiBpbnNlcnQgaW50byBhY2NvdW50IGF0IGFsbC4gIElmIHlvdSBzdGFydCBmcm9tIGEgMTAwLWxpbmUKKwkgKiBmaWxlIGFuZCBkZWxldGUgOTcgbGluZXMgb2YgaXQsIGl0IGRvZXMgbm90IG1hdHRlciBpZiB5b3UKKwkgKiBhZGQgMjcgbGluZXMgdG8gaXQgdG8gbWFrZSBhIG5ldyAzMC1saW5lIGZpbGUgb3IgaWYgeW91IGFkZAorCSAqIDk5NyBsaW5lcyB0byBpdCB0byBtYWtlIGEgMTAwMC1saW5lIGZpbGUuICBFaXRoZXIgd2F5IHdoYXQKKwkgKiB5b3UgZGlkIHdhcyBhIHJld3JpdGUgb2YgOTclLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdQorCSAqIGRlbGV0ZSAzIGxpbmVzLCBrZWVwaW5nIDk3IGxpbmVzIGludGFjdCwgaXQgZG9lcyBub3QgbWF0dGVyCisJICogaWYgeW91IGFkZCAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwLWxpbmUgZmlsZSBvciBpZgorCSAqIHlvdSBhZGQgOTAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwMC1saW5lIGZpbGUuCisJICogRWl0aGVyIHdheSB5b3UgZGlkIGEgbG90IG9mIGFkZGl0aW9ucyBhbmQgbm90IGEgcmV3cml0ZS4KKwkgKiBUaGlzIG1lcmdlIGhhcHBlbnMgdG8gY2F0Y2ggdGhlIGxhdHRlciBjYXNlLiAgQSBtZXJnZV9zY29yZQorCSAqIG9mIDgwJSB3b3VsZCBiZSBhIGdvb2QgZGVmYXVsdCB2YWx1ZSAoYSBicm9rZW4gcGFpciB0aGF0CisJICogaGFzIHNjb3JlIGxvd2VyIHRoYW4gbWVyZ2Vfc2NvcmUgd2lsbCBiZSBtZXJnZWQgYmFjaworCSAqIHRvZ2V0aGVyKS4KKwkgKi8KKwlpbnQgbWVyZ2Vfc2NvcmU7CisJaW50IGk7CisKKwkvKiBTZWUgY29tbWVudCBvbiBERUZBVUxUX0JSRUFLX1NDT1JFIGFuZAorCSAqIERFRkFVTFRfTUVSR0VfU0NPUkUgaW4gZGlmZmNvcmUuaAorCSAqLworCW1lcmdlX3Njb3JlID0gKGJyZWFrX3Njb3JlID4+IDE2KSAmIDB4RkZGRjsKKwlicmVha19zY29yZSA9IChicmVha19zY29yZSAmIDB4RkZGRik7CisKKwlpZiAoIWJyZWFrX3Njb3JlKQorCQlicmVha19zY29yZSA9IERFRkFVTFRfQlJFQUtfU0NPUkU7CisJaWYgKCFtZXJnZV9zY29yZSkKKwkJbWVyZ2Vfc2NvcmUgPSBERUZBVUxUX01FUkdFX1NDT1JFOworCisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCW91dHEucXVldWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaW50IHNjb3JlOworCisJCS8qIFdlIGRlYWwgb25seSB3aXRoIGluLXBsYWNlIGVkaXQgb2Ygbm9uIGRpcmVjdG9yeS4KKwkJICogV2UgZG8gbm90IGJyZWFrIGFueXRoaW5nIGVsc2UuCisJCSAqLworCQlpZiAoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYKKwkJICAgICFTX0lTRElSKHAtPm9uZS0+bW9kZSkgJiYgIVNfSVNESVIocC0+dHdvLT5tb2RlKSAmJgorCQkgICAgIXN0cmNtcChwLT5vbmUtPnBhdGgsIHAtPnR3by0+cGF0aCkpIHsKKwkJCWlmIChzaG91bGRfYnJlYWsocC0+b25lLCBwLT50d28sCisJCQkJCSBicmVha19zY29yZSwgJnNjb3JlKSkgeworCQkJCS8qIFNwbGl0IHRoaXMgaW50byBkZWxldGUgYW5kIGNyZWF0ZSAqLworCQkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpudWxsX29uZSwgKm51bGxfdHdvOworCQkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcDsKKworCQkJCS8qIFNldCBzY29yZSB0byAwIGZvciB0aGUgcGFpciB0aGF0CisJCQkJICogbmVlZHMgdG8gYmUgbWVyZ2VkIGJhY2sgdG9nZXRoZXIKKwkJCQkgKiBzaG91bGQgdGhleSBzdXJ2aXZlIHJlbmFtZS9jb3B5LgorCQkJCSAqIEFsc28gd2UgZG8gbm90IHdhbnQgdG8gYnJlYWsgdmVyeQorCQkJCSAqIHNtYWxsIGZpbGVzLgorCQkJCSAqLworCQkJCWlmIChzY29yZSA8IG1lcmdlX3Njb3JlKQorCQkJCQlzY29yZSA9IDA7CisKKwkJCQkvKiBkZWxldGlvbiBvZiBvbmUgKi8KKwkJCQludWxsX29uZSA9IGFsbG9jX2ZpbGVzcGVjKHAtPm9uZS0+cGF0aCk7CisJCQkJZHAgPSBkaWZmX3F1ZXVlKCZvdXRxLCBwLT5vbmUsIG51bGxfb25lKTsKKwkJCQlkcC0+c2NvcmUgPSBzY29yZTsKKwkJCQlkcC0+YnJva2VuX3BhaXIgPSAxOworCisJCQkJLyogY3JlYXRpb24gb2YgdHdvICovCisJCQkJbnVsbF90d28gPSBhbGxvY19maWxlc3BlYyhwLT50d28tPnBhdGgpOworCQkJCWRwID0gZGlmZl9xdWV1ZSgmb3V0cSwgbnVsbF90d28sIHAtPnR3byk7CisJCQkJZHAtPnNjb3JlID0gc2NvcmU7CisJCQkJZHAtPmJyb2tlbl9wYWlyID0gMTsKKworCQkJCWZyZWUocCk7IC8qIG5vdCBkaWZmX2ZyZWVfZmlsZXBhaXIoKSwgd2UgYXJlCisJCQkJCSAgKiByZXVzaW5nIG9uZSBhbmQgdHdvIGhlcmUuCisJCQkJCSAgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlkaWZmX3EoJm91dHEsIHApOworCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX2Jyb2tlbihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcHAsCisJCQkgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpvdXRxKQoreworCS8qIHAgYW5kIHBwIGFyZSBicm9rZW4gcGFpcnMgd2Ugd2FudCB0byBtZXJnZSAqLworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpjID0gcCwgKmQgPSBwcCwgKmRwOworCWlmIChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkgeworCQkvKiB0aGlzIG11c3QgYmUgYSBkZWxldGUgaGFsZiAqLworCQlkID0gcDsgYyA9IHBwOworCX0KKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIURJRkZfRklMRV9WQUxJRChkLT5vbmUpKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMxIik7CisJaWYgKERJRkZfRklMRV9WQUxJRChkLT50d28pKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMyIik7CisJaWYgKERJRkZfRklMRV9WQUxJRChjLT5vbmUpKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMzIik7CisJaWYgKCFESUZGX0ZJTEVfVkFMSUQoYy0+dHdvKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvciBpbiBtZXJnZSAjNCIpOworCisJZHAgPSBkaWZmX3F1ZXVlKG91dHEsIGQtPm9uZSwgYy0+dHdvKTsKKwlkcC0+c2NvcmUgPSBwLT5zY29yZTsKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShkLT50d28pOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKGMtPm9uZSk7CisJZnJlZShkKTsKKwlmcmVlKGMpOworfQorCit2b2lkIGRpZmZjb3JlX21lcmdlX2Jyb2tlbih2b2lkKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCWludCBpLCBqOworCisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCW91dHEucXVldWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKCFwKQorCQkJLyogd2UgYWxyZWFkeSBtZXJnZWQgdGhpcyB3aXRoIGl0cyBwZWVyICovCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAocC0+YnJva2VuX3BhaXIgJiYKKwkJCSAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoKSkgeworCQkJLyogSWYgdGhlIHBlZXIgYWxzbyBzdXJ2aXZlZCByZW5hbWUvY29weSwgdGhlbgorCQkJICogd2UgbWVyZ2UgdGhlbSBiYWNrIHRvZ2V0aGVyLgorCQkJICovCisJCQlmb3IgKGogPSBpICsgMTsgaiA8IHEtPm5yOyBqKyspIHsKKwkJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcHAgPSBxLT5xdWV1ZVtqXTsKKwkJCQlpZiAocHAtPmJyb2tlbl9wYWlyICYmCisJCQkJICAgICFzdHJjbXAocHAtPm9uZS0+cGF0aCwgcHAtPnR3by0+cGF0aCkgJiYKKwkJCQkgICAgIXN0cmNtcChwLT5vbmUtPnBhdGgsIHBwLT50d28tPnBhdGgpKSB7CisJCQkJCS8qIFBlZXIgc3Vydml2ZWQuICBNZXJnZSB0aGVtICovCisJCQkJCW1lcmdlX2Jyb2tlbihwLCBwcCwgJm91dHEpOworCQkJCQlxLT5xdWV1ZVtqXSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChxLT5uciA8PSBqKQorCQkJCS8qIFRoZSBwZWVyIGRpZCBub3Qgc3Vydml2ZSwgc28gd2Uga2VlcAorCQkJCSAqIGl0IGluIHRoZSBvdXRwdXQuCisJCQkJICovCisJCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJfQorCQllbHNlCisJCQlkaWZmX3EoJm91dHEsIHApOworCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1kZWx0YS5jIGIvZGlmZmNvcmUtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM4YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtZGVsdGEuYwpAQCAtMCwwICsxLDIxMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKKy8qCisgKiBJZGVhIGhlcmUgaXMgdmVyeSBzaW1wbGUuCisgKgorICogV2UgaGF2ZSB0b3RhbCBvZiAoc3otTisxKSBOLWJ5dGUgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzIGluIGJ1ZiB3aG9zZQorICogc2l6ZSBpcyBzei4gIElmIHRoZSBzYW1lIE4tYnl0ZSBzZXF1ZW5jZSBhcHBlYXJzIGluIGJvdGggc291cmNlIGFuZAorICogZGVzdGluYXRpb24sIHdlIHNheSB0aGUgYnl0ZSB0aGF0IHN0YXJ0cyB0aGF0IHNlcXVlbmNlIGlzIHNoYXJlZAorICogYmV0d2VlbiB0aGVtIChpLmUuIGNvcGllZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbikuCisgKgorICogRm9yIGVhY2ggcG9zc2libGUgTi1ieXRlIHNlcXVlbmNlLCBpZiB0aGUgc291cmNlIGJ1ZmZlciBoYXMgbW9yZQorICogaW5zdGFuY2VzIG9mIGl0IHRoYW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgdGhhdCBtZWFucyB0aGUKKyAqIGRpZmZlcmVuY2UgYXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbm90IGNvcGllZCBmcm9tIHNvdXJjZSB0bworICogZGVzdGluYXRpb24uICBJZiB0aGUgY291bnRzIGFyZSB0aGUgc2FtZSwgZXZlcnl0aGluZyB3YXMgY29waWVkCisgKiBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4gIElmIHRoZSBkZXN0aW5hdGlvbiBoYXMgbW9yZSwKKyAqIGV2ZXJ5dGhpbmcgd2FzIGNvcGllZCwgYW5kIGRlc3RpbmF0aW9uIGFkZGVkIG1vcmUuCisgKgorICogV2UgYXJlIGRvaW5nIGFuIGFwcHJveGltYXRpb24gc28gd2UgZG8gbm90IHJlYWxseSBoYXZlIHRvIHdhc3RlCisgKiBtZW1vcnkgYnkgYWN0dWFsbHkgc3RvcmluZyB0aGUgc2VxdWVuY2UuICBXZSBqdXN0IGhhc2ggdGhlbSBpbnRvCisgKiBzb21ld2hlcmUgYXJvdW5kIDJeMTYgaGFzaGJ1Y2tldHMgYW5kIGNvdW50IHRoZSBvY2N1cnJlbmNlcy4KKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpcyBhcmJpdHJhcmlseSBzZXQgdG8gOCBmb3Igbm93LgorICovCisKKy8qIFdpbGQgZ3Vlc3MgYXQgdGhlIGluaXRpYWwgaGFzaCBzaXplICovCisjZGVmaW5lIElOSVRJQUxfSEFTSF9TSVpFIDkKKworLyogV2UgbGVhdmUgbW9yZSByb29tIGluIHNtYWxsZXIgaGFzaCBidXQgZG8gbm90IGxldCBpdAorICogZ3JvdyB0byBoYXZlIHVudXNlZCBob2xlIHRvbyBtdWNoLgorICovCisjZGVmaW5lIElOSVRJQUxfRlJFRShzel9sb2cyKSAoKDE8PChzel9sb2cyKSkqKHN6X2xvZzItMykvKHN6X2xvZzIpKQorCisvKiBBIHByaW1lIHJhdGhlciBjYXJlZnVsbHkgY2hvc2VuIGJldHdlZW4gMl4xNi4uMl4xNywgc28gdGhhdAorICogSEFTSEJBU0UgPCBJTklUSUFMX0ZSRUUoMTcpLiAgV2Ugd2FudCB0byBrZWVwIHRoZSBtYXhpbXVtIGhhc2h0YWJsZQorICogc2l6ZSB1bmRlciB0aGUgY3VycmVudCAyPDwxNyBtYXhpbXVtLCB3aGljaCBjYW4gaG9sZCB0aGlzIG1hbnkKKyAqIGRpZmZlcmVudCB2YWx1ZXMgYmVmb3JlIG92ZXJmbG93aW5nIHRvIGhhc2h0YWJsZSBvZiBzaXplIDI8PDE4LgorICovCisjZGVmaW5lIEhBU0hCQVNFIDEwNzkyNworCitzdHJ1Y3Qgc3Bhbmhhc2ggeworCXVuc2lnbmVkIGludCBoYXNodmFsOworCXVuc2lnbmVkIGludCBjbnQ7Cit9Oworc3RydWN0IHNwYW5oYXNoX3RvcCB7CisJaW50IGFsbG9jX2xvZzI7CisJaW50IGZyZWU7CisJc3RydWN0IHNwYW5oYXNoIGRhdGFbRkxFWF9BUlJBWV07Cit9OworCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoICpzcGFuaGFzaF9maW5kKHN0cnVjdCBzcGFuaGFzaF90b3AgKnRvcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFzaHZhbCkKK3sKKwlpbnQgc3ogPSAxIDw8IHRvcC0+YWxsb2NfbG9nMjsKKwlpbnQgYnVja2V0ID0gaGFzaHZhbCAmIChzeiAtIDEpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzcGFuaGFzaCAqaCA9ICYodG9wLT5kYXRhW2J1Y2tldCsrXSk7CisJCWlmICghaC0+Y250KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChoLT5oYXNodmFsID09IGhhc2h2YWwpCisJCQlyZXR1cm4gaDsKKwkJaWYgKHN6IDw9IGJ1Y2tldCkKKwkJCWJ1Y2tldCA9IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoX3RvcCAqc3Bhbmhhc2hfcmVoYXNoKHN0cnVjdCBzcGFuaGFzaF90b3AgKm9yaWcpCit7CisJc3RydWN0IHNwYW5oYXNoX3RvcCAqbmV3OworCWludCBpOworCWludCBvc3ogPSAxIDw8IG9yaWctPmFsbG9jX2xvZzI7CisJaW50IHN6ID0gb3N6IDw8IDE7CisKKwluZXcgPSB4bWFsbG9jKHNpemVvZigqb3JpZykgKyBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqIHN6KTsKKwluZXctPmFsbG9jX2xvZzIgPSBvcmlnLT5hbGxvY19sb2cyICsgMTsKKwluZXctPmZyZWUgPSBJTklUSUFMX0ZSRUUobmV3LT5hbGxvY19sb2cyKTsKKwltZW1zZXQobmV3LT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqIHN6KTsKKwlmb3IgKGkgPSAwOyBpIDwgb3N6OyBpKyspIHsKKwkJc3RydWN0IHNwYW5oYXNoICpvID0gJihvcmlnLT5kYXRhW2ldKTsKKwkJaW50IGJ1Y2tldDsKKwkJaWYgKCFvLT5jbnQpCisJCQljb250aW51ZTsKKwkJYnVja2V0ID0gby0+aGFzaHZhbCAmIChzeiAtIDEpOworCQl3aGlsZSAoMSkgeworCQkJc3RydWN0IHNwYW5oYXNoICpoID0gJihuZXctPmRhdGFbYnVja2V0KytdKTsKKwkJCWlmICghaC0+Y250KSB7CisJCQkJaC0+aGFzaHZhbCA9IG8tPmhhc2h2YWw7CisJCQkJaC0+Y250ID0gby0+Y250OworCQkJCW5ldy0+ZnJlZS0tOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN6IDw9IGJ1Y2tldCkKKwkJCQlidWNrZXQgPSAwOworCQl9CisJfQorCWZyZWUob3JpZyk7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIHN0cnVjdCBzcGFuaGFzaF90b3AgKmFkZF9zcGFuaGFzaChzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICp0b3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgaGFzaHZhbCwgaW50IGNudCkKK3sKKwlpbnQgYnVja2V0LCBsaW07CisJc3RydWN0IHNwYW5oYXNoICpoOworCisJbGltID0gKDEgPDwgdG9wLT5hbGxvY19sb2cyKTsKKwlidWNrZXQgPSBoYXNodmFsICYgKGxpbSAtIDEpOworCXdoaWxlICgxKSB7CisJCWggPSAmKHRvcC0+ZGF0YVtidWNrZXQrK10pOworCQlpZiAoIWgtPmNudCkgeworCQkJaC0+aGFzaHZhbCA9IGhhc2h2YWw7CisJCQloLT5jbnQgPSBjbnQ7CisJCQl0b3AtPmZyZWUtLTsKKwkJCWlmICh0b3AtPmZyZWUgPCAwKQorCQkJCXJldHVybiBzcGFuaGFzaF9yZWhhc2godG9wKTsKKwkJCXJldHVybiB0b3A7CisJCX0KKwkJaWYgKGgtPmhhc2h2YWwgPT0gaGFzaHZhbCkgeworCQkJaC0+Y250ICs9IGNudDsKKwkJCXJldHVybiB0b3A7CisJCX0KKwkJaWYgKGxpbSA8PSBidWNrZXQpCisJCQlidWNrZXQgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzcGFuaGFzaF90b3AgKmhhc2hfY2hhcnModW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgc3opCit7CisJaW50IGksIG47CisJdW5zaWduZWQgaW50IGFjY3VtMSwgYWNjdW0yLCBoYXNodmFsOworCXN0cnVjdCBzcGFuaGFzaF90b3AgKmhhc2g7CisKKwlpID0gSU5JVElBTF9IQVNIX1NJWkU7CisJaGFzaCA9IHhtYWxsb2Moc2l6ZW9mKCpoYXNoKSArIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogKDE8PGkpKTsKKwloYXNoLT5hbGxvY19sb2cyID0gaTsKKwloYXNoLT5mcmVlID0gSU5JVElBTF9GUkVFKGkpOworCW1lbXNldChoYXNoLT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqICgxPDxpKSk7CisKKwluID0gMDsKKwlhY2N1bTEgPSBhY2N1bTIgPSAwOworCXdoaWxlIChzeikgeworCQl1bnNpZ25lZCBpbnQgYyA9ICpidWYrKzsKKwkJdW5zaWduZWQgaW50IG9sZF8xID0gYWNjdW0xOworCQlzei0tOworCQlhY2N1bTEgPSAoYWNjdW0xIDw8IDcpIF4gKGFjY3VtMiA+PiAyNSk7CisJCWFjY3VtMiA9IChhY2N1bTIgPDwgNykgXiAob2xkXzEgPj4gMjUpOworCQlhY2N1bTEgKz0gYzsKKwkJaWYgKCsrbiA8IDY0ICYmIGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQloYXNodmFsID0gKGFjY3VtMSArIGFjY3VtMiAqIDB4NjEpICUgSEFTSEJBU0U7CisJCWhhc2ggPSBhZGRfc3Bhbmhhc2goaGFzaCwgaGFzaHZhbCwgbik7CisJCW4gPSAwOworCQlhY2N1bTEgPSBhY2N1bTIgPSAwOworCX0KKwlyZXR1cm4gaGFzaDsKK30KKworaW50IGRpZmZjb3JlX2NvdW50X2NoYW5nZXModm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkJICAgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGRzdF9zaXplLAorCQkJICAgdm9pZCAqKnNyY19jb3VudF9wLAorCQkJICAgdm9pZCAqKmRzdF9jb3VudF9wLAorCQkJICAgdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKnNyY19jb3BpZWQsCisJCQkgICB1bnNpZ25lZCBsb25nICpsaXRlcmFsX2FkZGVkKQoreworCWludCBpLCBzc3o7CisJc3RydWN0IHNwYW5oYXNoX3RvcCAqc3JjX2NvdW50LCAqZHN0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2MsIGxhOworCisJc3JjX2NvdW50ID0gZHN0X2NvdW50ID0gTlVMTDsKKwlpZiAoc3JjX2NvdW50X3ApCisJCXNyY19jb3VudCA9ICpzcmNfY291bnRfcDsKKwlpZiAoIXNyY19jb3VudCkgeworCQlzcmNfY291bnQgPSBoYXNoX2NoYXJzKHNyYywgc3JjX3NpemUpOworCQlpZiAoc3JjX2NvdW50X3ApCisJCQkqc3JjX2NvdW50X3AgPSBzcmNfY291bnQ7CisJfQorCWlmIChkc3RfY291bnRfcCkKKwkJZHN0X2NvdW50ID0gKmRzdF9jb3VudF9wOworCWlmICghZHN0X2NvdW50KSB7CisJCWRzdF9jb3VudCA9IGhhc2hfY2hhcnMoZHN0LCBkc3Rfc2l6ZSk7CisJCWlmIChkc3RfY291bnRfcCkKKwkJCSpkc3RfY291bnRfcCA9IGRzdF9jb3VudDsKKwl9CisJc2MgPSBsYSA9IDA7CisKKwlzc3ogPSAxIDw8IHNyY19jb3VudC0+YWxsb2NfbG9nMjsKKwlmb3IgKGkgPSAwOyBpIDwgc3N6OyBpKyspIHsKKwkJc3RydWN0IHNwYW5oYXNoICpzID0gJihzcmNfY291bnQtPmRhdGFbaV0pOworCQlzdHJ1Y3Qgc3Bhbmhhc2ggKmQ7CisJCXVuc2lnbmVkIGRzdF9jbnQsIHNyY19jbnQ7CisJCWlmICghcy0+Y250KQorCQkJY29udGludWU7CisJCXNyY19jbnQgPSBzLT5jbnQ7CisJCWQgPSBzcGFuaGFzaF9maW5kKGRzdF9jb3VudCwgcy0+aGFzaHZhbCk7CisJCWRzdF9jbnQgPSBkID8gZC0+Y250IDogMDsKKwkJaWYgKHNyY19jbnQgPCBkc3RfY250KSB7CisJCQlsYSArPSBkc3RfY250IC0gc3JjX2NudDsKKwkJCXNjICs9IHNyY19jbnQ7CisJCX0KKwkJZWxzZQorCQkJc2MgKz0gZHN0X2NudDsKKwl9CisKKwlpZiAoIXNyY19jb3VudF9wKQorCQlmcmVlKHNyY19jb3VudCk7CisJaWYgKCFkc3RfY291bnRfcCkKKwkJZnJlZShkc3RfY291bnQpOworCSpzcmNfY29waWVkID0gc2M7CisJKmxpdGVyYWxfYWRkZWQgPSBsYTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLW9yZGVyLmMgYi9kaWZmY29yZS1vcmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGJkODIKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1vcmRlci5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorCitzdGF0aWMgY2hhciAqKm9yZGVyOworc3RhdGljIGludCBvcmRlcl9jbnQ7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfb3JkZXIoY29uc3QgY2hhciAqb3JkZXJmaWxlKQoreworCWludCBmZCwgY250LCBwYXNzOworCXZvaWQgKm1hcDsKKwljaGFyICpjcCwgKmVuZHA7CisJc3RydWN0IHN0YXQgc3Q7CisJc2l6ZV90IHN6OworCisJaWYgKG9yZGVyKQorCQlyZXR1cm47CisKKwlmZCA9IG9wZW4ob3JkZXJmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCWlmIChmc3RhdChmZCwgJnN0KSkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCW1hcCA9IG1tYXAoTlVMTCwgc3osIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybjsKKwllbmRwID0gKGNoYXIgKikgbWFwICsgc3o7CisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQljbnQgPSAwOworCQljcCA9IG1hcDsKKwkJd2hpbGUgKGNwIDwgZW5kcCkgeworCQkJY2hhciAqZXA7CisJCQlmb3IgKGVwID0gY3A7IGVwIDwgZW5kcCAmJiAqZXAgIT0gJ1xuJzsgZXArKykKKwkJCQk7CisJCQkvKiBjcCB0byBlcCBoYXMgb25lIGxpbmUgKi8KKwkJCWlmICgqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKQorCQkJCTsgLyogY29tbWVudCAqLworCQkJZWxzZSBpZiAocGFzcyA9PSAwKQorCQkJCWNudCsrOworCQkJZWxzZSB7CisJCQkJaWYgKCplcCA9PSAnXG4nKSB7CisJCQkJCSplcCA9IDA7CisJCQkJCW9yZGVyW2NudF0gPSBjcDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW9yZGVyW2NudF0gPSB4bWFsbG9jKGVwLWNwKzEpOworCQkJCQltZW1jcHkob3JkZXJbY250XSwgY3AsIGVwLWNwKTsKKwkJCQkJb3JkZXJbY250XVtlcC1jcF0gPSAwOworCQkJCX0KKwkJCQljbnQrKzsKKwkJCX0KKwkJCWlmIChlcCA8IGVuZHApCisJCQkJZXArKzsKKwkJCWNwID0gZXA7CisJCX0KKwkJaWYgKHBhc3MgPT0gMCkgeworCQkJb3JkZXJfY250ID0gY250OworCQkJb3JkZXIgPSB4bWFsbG9jKHNpemVvZigqb3JkZXIpICogY250KTsKKwkJfQorCX0KK30KKworc3RydWN0IHBhaXJfb3JkZXIgeworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyOworCWludCBvcmlnX29yZGVyOworCWludCBvcmRlcjsKK307CisKK3N0YXRpYyBpbnQgbWF0Y2hfb3JkZXIoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgaTsKKwljaGFyIHBbUEFUSF9NQVhdOworCisJZm9yIChpID0gMDsgaSA8IG9yZGVyX2NudDsgaSsrKSB7CisJCXN0cmNweShwLCBwYXRoKTsKKwkJd2hpbGUgKHBbMF0pIHsKKwkJCWNoYXIgKmNwOworCQkJaWYgKCFmbm1hdGNoKG9yZGVyW2ldLCBwLCAwKSkKKwkJCQlyZXR1cm4gaTsKKwkJCWNwID0gc3RycmNocihwLCAnLycpOworCQkJaWYgKCFjcCkKKwkJCQlicmVhazsKKwkJCSpjcCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIG9yZGVyX2NudDsKK30KKworc3RhdGljIGludCBjb21wYXJlX3BhaXJfb3JkZXIoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBwYWlyX29yZGVyIGNvbnN0ICphLCAqYjsKKwlhID0gKHN0cnVjdCBwYWlyX29yZGVyIGNvbnN0ICopYV87CisJYiA9IChzdHJ1Y3QgcGFpcl9vcmRlciBjb25zdCAqKWJfOworCWlmIChhLT5vcmRlciAhPSBiLT5vcmRlcikKKwkJcmV0dXJuIGEtPm9yZGVyIC0gYi0+b3JkZXI7CisJcmV0dXJuIGEtPm9yaWdfb3JkZXIgLSBiLT5vcmlnX29yZGVyOworfQorCit2b2lkIGRpZmZjb3JlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgcGFpcl9vcmRlciAqbzsKKwlpbnQgaTsKKworCWlmICghcS0+bnIpCisJCXJldHVybjsKKworCW8gPSB4bWFsbG9jKHNpemVvZigqbykgKiBxLT5ucik7CisJcHJlcGFyZV9vcmRlcihvcmRlcmZpbGUpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCW9baV0ucGFpciA9IHEtPnF1ZXVlW2ldOworCQlvW2ldLm9yaWdfb3JkZXIgPSBpOworCQlvW2ldLm9yZGVyID0gbWF0Y2hfb3JkZXIob1tpXS5wYWlyLT50d28tPnBhdGgpOworCX0KKwlxc29ydChvLCBxLT5uciwgc2l6ZW9mKCpvKSwgY29tcGFyZV9wYWlyX29yZGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJcS0+cXVldWVbaV0gPSBvW2ldLnBhaXI7CisJZnJlZShvKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1waWNrYXhlLmMgYi9kaWZmY29yZS1waWNrYXhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNzdkNwotLS0gL2Rldi9udWxsCisrKyBiL2RpZmZjb3JlLXBpY2theGUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBjb250YWlucyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICBjb25zdCBjaGFyICpuZWVkbGUsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJICAgICByZWdleF90ICpyZWdleHApCit7CisJdW5zaWduZWQgaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc3o7CisJY29uc3QgY2hhciAqZGF0YTsKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlzeiA9IG9uZS0+c2l6ZTsKKwlkYXRhID0gb25lLT5kYXRhOworCWNudCA9IDA7CisKKwlpZiAocmVnZXhwKSB7CisJCXJlZ21hdGNoX3QgcmVnbWF0Y2g7CisJCWludCBmbGFncyA9IDA7CisKKwkJd2hpbGUgKCpkYXRhICYmICFyZWdleGVjKHJlZ2V4cCwgZGF0YSwgMSwgJnJlZ21hdGNoLCBmbGFncykpIHsKKwkJCWZsYWdzIHw9IFJFR19OT1RCT0w7CisJCQlkYXRhICs9IHJlZ21hdGNoLnJtX3NvOworCQkJaWYgKCpkYXRhKSBkYXRhKys7CisJCQljbnQrKzsKKwkJfQorCisJfSBlbHNlIHsgLyogQ2xhc3NpYyBleGFjdCBzdHJpbmcgbWF0Y2ggKi8KKwkJLyogWWVzLCBJJ3ZlIGhlYXJkIG9mIHN0cnN0cigpLCBidXQgdGhlIHRoaW5nIGlzICpkYXRhIG1heQorCQkgKiBub3QgYmUgTlVMIHRlcm1pbmF0ZWQuICBTdWUgbWUuCisJCSAqLworCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCArIGxlbiA8PSBzejsgb2Zmc2V0KyspIHsKKwkJCS8qIHdlIGNvdW50IG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBuZWVkbGUgKi8KKwkJCWlmICghbWVtY21wKG5lZWRsZSwgZGF0YSArIG9mZnNldCwgbGVuKSkgeworCQkJCW9mZnNldCArPSBsZW4gLSAxOworCQkJCWNudCsrOworCQkJfQorCQl9CisJfQorCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKG9uZSk7CisJcmV0dXJuIGNudDsKK30KKwordm9pZCBkaWZmY29yZV9waWNrYXhlKGNvbnN0IGNoYXIgKm5lZWRsZSwgaW50IG9wdHMpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBzdHJsZW4obmVlZGxlKTsKKwlpbnQgaSwgaGFzX2NoYW5nZXM7CisJcmVnZXhfdCByZWdleCwgKnJlZ2V4cCA9IE5VTEw7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisJb3V0cS5xdWV1ZSA9IE5VTEw7CisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfUkVHRVgpIHsKKwkJaW50IGVycjsKKwkJZXJyID0gcmVnY29tcCgmcmVnZXgsIG5lZWRsZSwgUkVHX0VYVEVOREVEIHwgUkVHX05FV0xJTkUpOworCQlpZiAoZXJyKSB7CisJCQkvKiBUaGUgUE9TSVguMiBwZW9wbGUgYXJlIHN1cmVseSBzaWNrICovCisJCQljaGFyIGVycmJ1ZlsxMDI0XTsKKwkJCXJlZ2Vycm9yKGVyciwgJnJlZ2V4LCBlcnJidWYsIDEwMjQpOworCQkJcmVnZnJlZSgmcmVnZXgpOworCQkJZGllKCJpbnZhbGlkIHBpY2theGUgcmVnZXg6ICVzIiwgZXJyYnVmKTsKKwkJfQorCQlyZWdleHAgPSAmcmVnZXg7CisJfQorCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfQUxMKSB7CisJCS8qIFNob3dpbmcgdGhlIHdob2xlIGNoYW5nZXNldCBpZiBuZWVkbGUgZXhpc3RzICovCisJCWZvciAoaSA9IGhhc19jaGFuZ2VzID0gMDsgIWhhc19jaGFuZ2VzICYmIGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkgeworCQkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQkJCWNvbnRpbnVlOyAvKiBpZ25vcmUgdW5tZXJnZWQgKi8KKwkJCQkvKiBjcmVhdGVkICovCisJCQkJaWYgKGNvbnRhaW5zKHAtPnR3bywgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJCWhhc19jaGFuZ2VzKys7CisJCQl9CisJCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpIHsKKwkJCQlpZiAoY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMrKzsKKwkJCX0KKwkJCWVsc2UgaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihwKSAmJgorCQkJCSBjb250YWlucyhwLT5vbmUsIG5lZWRsZSwgbGVuLCByZWdleHApICE9CisJCQkJIGNvbnRhaW5zKHAtPnR3bywgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJaGFzX2NoYW5nZXMrKzsKKwkJfQorCQlpZiAoaGFzX2NoYW5nZXMpCisJCQlyZXR1cm47IC8qIG5vdCBtdW5nZSB0aGUgcXVldWUgKi8KKworCQkvKiBvdGhlcndpc2Ugd2Ugd2lsbCBjbGVhciB0aGUgd2hvbGUgcXVldWUKKwkJICogYnkgY29weWluZyB0aGUgZW1wdHkgb3V0cSBhdCB0aGUgZW5kIG9mIHRoaXMKKwkJICogZnVuY3Rpb24sIGJ1dCBmaXJzdCBjbGVhciB0aGUgY3VycmVudCBlbnRyaWVzCisJCSAqIGluIHRoZSBxdWV1ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKKwl9CisJZWxzZSAKKwkJLyogU2hvd2luZyBvbmx5IHRoZSBmaWxlcGFpcnMgdGhhdCBoYXMgdGhlIG5lZWRsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWhhc19jaGFuZ2VzID0gMDsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCQk7IC8qIGlnbm9yZSB1bm1lcmdlZCAqLworCQkJCS8qIGNyZWF0ZWQgKi8KKwkJCQllbHNlIGlmIChjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCQloYXNfY2hhbmdlcyA9IDE7CisJCQl9CisJCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpIHsKKwkJCQlpZiAoY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHApICYmCisJCQkJIGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkgIT0KKwkJCQkgY29udGFpbnMocC0+dHdvLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQloYXNfY2hhbmdlcyA9IDE7CisKKwkJCWlmIChoYXNfY2hhbmdlcykKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQkJZWxzZQorCQkJCWRpZmZfZnJlZV9maWxlcGFpcihwKTsKKwkJfQorCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfUkVHRVgpIHsKKwkJcmVnZnJlZSgmcmVnZXgpOworCX0KKworCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1yZW5hbWUuYyBiL2RpZmZjb3JlLXJlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzQwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1yZW5hbWUuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworLyogVGFibGUgb2YgcmVuYW1lL2NvcHkgZGVzdGluYXRpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0IHsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvOworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyOworfSAqcmVuYW1lX2RzdDsKK3N0YXRpYyBpbnQgcmVuYW1lX2RzdF9uciwgcmVuYW1lX2RzdF9hbGxvYzsKKworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmxvY2F0ZV9yZW5hbWVfZHN0KHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28sCisJCQkJCQkgaW50IGluc2VydF9vaykKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IHJlbmFtZV9kc3RfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmRzdCA9ICYocmVuYW1lX2RzdFtuZXh0XSk7CisJCWludCBjbXAgPSBzdHJjbXAodHdvLT5wYXRoLCBkc3QtPnR3by0+cGF0aCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIGRzdDsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCS8qIG5vdCBmb3VuZCAqLworCWlmICghaW5zZXJ0X29rKQorCQlyZXR1cm4gTlVMTDsKKwkvKiBpbnNlcnQgdG8gbWFrZSBpdCBhdCAiZmlyc3QiICovCisJaWYgKHJlbmFtZV9kc3RfYWxsb2MgPD0gcmVuYW1lX2RzdF9ucikgeworCQlyZW5hbWVfZHN0X2FsbG9jID0gYWxsb2NfbnIocmVuYW1lX2RzdF9hbGxvYyk7CisJCXJlbmFtZV9kc3QgPSB4cmVhbGxvYyhyZW5hbWVfZHN0LAorCQkJCSAgICAgIHJlbmFtZV9kc3RfYWxsb2MgKiBzaXplb2YoKnJlbmFtZV9kc3QpKTsKKwl9CisJcmVuYW1lX2RzdF9ucisrOworCWlmIChmaXJzdCA8IHJlbmFtZV9kc3RfbnIpCisJCW1lbW1vdmUocmVuYW1lX2RzdCArIGZpcnN0ICsgMSwgcmVuYW1lX2RzdCArIGZpcnN0LAorCQkJKHJlbmFtZV9kc3RfbnIgLSBmaXJzdCAtIDEpICogc2l6ZW9mKCpyZW5hbWVfZHN0KSk7CisJcmVuYW1lX2RzdFtmaXJzdF0udHdvID0gYWxsb2NfZmlsZXNwZWModHdvLT5wYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKHJlbmFtZV9kc3RbZmlyc3RdLnR3bywgdHdvLT5zaGExLCB0d28tPm1vZGUpOworCXJlbmFtZV9kc3RbZmlyc3RdLnBhaXIgPSBOVUxMOworCXJldHVybiAmKHJlbmFtZV9kc3RbZmlyc3RdKTsKK30KKworLyogVGFibGUgb2YgcmVuYW1lL2NvcHkgc3JjIGZpbGVzICovCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX3NyYyB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZTsKKwl1bnNpZ25lZCBzaG9ydCBzY29yZTsgLyogdG8gcmVtZW1iZXIgdGhlIGJyZWFrIHNjb3JlICovCisJdW5zaWduZWQgc3JjX3BhdGhfbGVmdCA6IDE7Cit9ICpyZW5hbWVfc3JjOworc3RhdGljIGludCByZW5hbWVfc3JjX25yLCByZW5hbWVfc3JjX2FsbG9jOworCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX3NyYyAqcmVnaXN0ZXJfcmVuYW1lX3NyYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJCQkJICAgaW50IHNyY19wYXRoX2xlZnQsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBzY29yZSkKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IHJlbmFtZV9zcmNfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgKnNyYyA9ICYocmVuYW1lX3NyY1tuZXh0XSk7CisJCWludCBjbXAgPSBzdHJjbXAob25lLT5wYXRoLCBzcmMtPm9uZS0+cGF0aCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIHNyYzsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCisJLyogaW5zZXJ0IHRvIG1ha2UgaXQgYXQgImZpcnN0IiAqLworCWlmIChyZW5hbWVfc3JjX2FsbG9jIDw9IHJlbmFtZV9zcmNfbnIpIHsKKwkJcmVuYW1lX3NyY19hbGxvYyA9IGFsbG9jX25yKHJlbmFtZV9zcmNfYWxsb2MpOworCQlyZW5hbWVfc3JjID0geHJlYWxsb2MocmVuYW1lX3NyYywKKwkJCQkgICAgICByZW5hbWVfc3JjX2FsbG9jICogc2l6ZW9mKCpyZW5hbWVfc3JjKSk7CisJfQorCXJlbmFtZV9zcmNfbnIrKzsKKwlpZiAoZmlyc3QgPCByZW5hbWVfc3JjX25yKQorCQltZW1tb3ZlKHJlbmFtZV9zcmMgKyBmaXJzdCArIDEsIHJlbmFtZV9zcmMgKyBmaXJzdCwKKwkJCShyZW5hbWVfc3JjX25yIC0gZmlyc3QgLSAxKSAqIHNpemVvZigqcmVuYW1lX3NyYykpOworCXJlbmFtZV9zcmNbZmlyc3RdLm9uZSA9IG9uZTsKKwlyZW5hbWVfc3JjW2ZpcnN0XS5zY29yZSA9IHNjb3JlOworCXJlbmFtZV9zcmNbZmlyc3RdLnNyY19wYXRoX2xlZnQgPSBzcmNfcGF0aF9sZWZ0OworCXJldHVybiAmKHJlbmFtZV9zcmNbZmlyc3RdKTsKK30KKworc3RhdGljIGludCBpc19leGFjdF9tYXRjaChzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3JjLAorCQkJICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJICBpbnQgY29udGVudHNfdG9vKQoreworCWlmIChzcmMtPnNoYTFfdmFsaWQgJiYgZHN0LT5zaGExX3ZhbGlkICYmCisJICAgICFoYXNoY21wKHNyYy0+c2hhMSwgZHN0LT5zaGExKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFjb250ZW50c190b28pCisJCXJldHVybiAwOworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMSkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDEpKQorCQlyZXR1cm4gMDsKKwlpZiAoc3JjLT5zaXplICE9IGRzdC0+c2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKHNyYy0+c2hhMV92YWxpZCAmJiBkc3QtPnNoYTFfdmFsaWQpCisJICAgIHJldHVybiAhaGFzaGNtcChzcmMtPnNoYTEsIGRzdC0+c2hhMSk7CisJaWYgKGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3JjLCAwKSB8fCBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKGRzdCwgMCkpCisJCXJldHVybiAwOworCWlmIChzcmMtPnNpemUgPT0gZHN0LT5zaXplICYmCisJICAgICFtZW1jbXAoc3JjLT5kYXRhLCBkc3QtPmRhdGEsIHNyYy0+c2l6ZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlmZl9zY29yZSB7CisJaW50IHNyYzsgLyogaW5kZXggaW4gcmVuYW1lX3NyYyAqLworCWludCBkc3Q7IC8qIGluZGV4IGluIHJlbmFtZV9kc3QgKi8KKwlpbnQgc2NvcmU7Cit9OworCitzdGF0aWMgaW50IGVzdGltYXRlX3NpbWlsYXJpdHkoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywKKwkJCSAgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJICAgICAgIGludCBtaW5pbXVtX3Njb3JlKQoreworCS8qIHNyYyBwb2ludHMgYXQgYSBmaWxlIHRoYXQgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgdHJlZSAob3IKKwkgKiBvcHRpb25hbGx5IGEgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gdHJlZSkgYW5kIGRzdCBwb2ludHMKKwkgKiBhdCBhIG5ld2x5IGNyZWF0ZWQgZmlsZS4gIFRoZXkgbWF5IGJlIHF1aXRlIHNpbWlsYXIsIGluIHdoaWNoCisJICogY2FzZSB3ZSB3YW50IHRvIHNheSBzcmMgaXMgcmVuYW1lZCB0byBkc3Qgb3Igc3JjIGlzIGNvcGllZCBpbnRvCisJICogZHN0LCBhbmQgdGhlbiBzb21lIGVkaXQgaGFzIGJlZW4gYXBwbGllZCB0byBkc3QuCisJICoKKwkgKiBDb21wYXJlIHRoZW0gYW5kIHJldHVybiBob3cgc2ltaWxhciB0aGV5IGFyZSwgcmVwcmVzZW50aW5nCisJICogdGhlIHNjb3JlIGFzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCBNQVhfU0NPUkUuCisJICoKKwkgKiBXaGVuIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCBpdCBpcyBjb25zaWRlcmVkIGEgYmV0dGVyCisJICogbWF0Y2ggdGhhbiBhbnl0aGluZyBlbHNlOyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgZXZlbgorCSAqIGNhbGwgaW50byB0aGlzIGZ1bmN0aW9uIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG1heF9zaXplLCBkZWx0YV9zaXplLCBiYXNlX3NpemUsIHNyY19jb3BpZWQsIGxpdGVyYWxfYWRkZWQ7CisJdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdDsKKwlpbnQgc2NvcmU7CisKKwkvKiBXZSBkZWFsIG9ubHkgd2l0aCByZWd1bGFyIGZpbGVzLiAgU3ltbGluayByZW5hbWVzIGFyZSBoYW5kbGVkCisJICogb25seSB3aGVuIHRoZXkgYXJlIGV4YWN0IG1hdGNoZXMgLS0tIGluIG90aGVyIHdvcmRzLCBubyBlZGl0cworCSAqIGFmdGVyIHJlbmFtaW5nLgorCSAqLworCWlmICghU19JU1JFRyhzcmMtPm1vZGUpIHx8ICFTX0lTUkVHKGRzdC0+bW9kZSkpCisJCXJldHVybiAwOworCisJbWF4X3NpemUgPSAoKHNyYy0+c2l6ZSA+IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCWJhc2Vfc2l6ZSA9ICgoc3JjLT5zaXplIDwgZHN0LT5zaXplKSA/IHNyYy0+c2l6ZSA6IGRzdC0+c2l6ZSk7CisJZGVsdGFfc2l6ZSA9IG1heF9zaXplIC0gYmFzZV9zaXplOworCisJLyogV2Ugd291bGQgbm90IGNvbnNpZGVyIGVkaXRzIHRoYXQgY2hhbmdlIHRoZSBmaWxlIHNpemUgc28KKwkgKiBkcmFzdGljYWxseS4gIGRlbHRhX3NpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4KKwkgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpL01BWF9TQ09SRSAqIG1pbihzcmMtPnNpemUsIGRzdC0+c2l6ZSkuCisJICoKKwkgKiBOb3RlIHRoYXQgYmFzZV9zaXplID09IDAgY2FzZSBpcyBoYW5kbGVkIGhlcmUgYWxyZWFkeQorCSAqIGFuZCB0aGUgZmluYWwgc2NvcmUgY29tcHV0YXRpb24gYmVsb3cgd291bGQgbm90IGhhdmUgYQorCSAqIGRpdmlkZS1ieS16ZXJvIGlzc3VlLgorCSAqLworCWlmIChiYXNlX3NpemUgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpIDwgZGVsdGFfc2l6ZSAqIE1BWF9TQ09SRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzcmMsIDApIHx8IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoZHN0LCAwKSkKKwkJcmV0dXJuIDA7IC8qIGVycm9yIGJ1dCBjYXVnaHQgZG93bnN0cmVhbSAqLworCisKKwlkZWx0YV9saW1pdCA9ICh1bnNpZ25lZCBsb25nKQorCQkoYmFzZV9zaXplICogKE1BWF9TQ09SRS1taW5pbXVtX3Njb3JlKSAvIE1BWF9TQ09SRSk7CisJaWYgKGRpZmZjb3JlX2NvdW50X2NoYW5nZXMoc3JjLT5kYXRhLCBzcmMtPnNpemUsCisJCQkJICAgZHN0LT5kYXRhLCBkc3QtPnNpemUsCisJCQkJICAgJnNyYy0+Y250X2RhdGEsICZkc3QtPmNudF9kYXRhLAorCQkJCSAgIGRlbHRhX2xpbWl0LAorCQkJCSAgICZzcmNfY29waWVkLCAmbGl0ZXJhbF9hZGRlZCkpCisJCXJldHVybiAwOworCisJLyogSG93IHNpbWlsYXIgYXJlIHRoZXk/CisJICogd2hhdCBwZXJjZW50YWdlIG9mIG1hdGVyaWFsIGluIGRzdCBhcmUgZnJvbSBzb3VyY2U/CisJICovCisJaWYgKCFkc3QtPnNpemUpCisJCXNjb3JlID0gMDsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwllbHNlCisJCXNjb3JlID0gKGludCkoc3JjX2NvcGllZCAqIE1BWF9TQ09SRSAvIG1heF9zaXplKTsKKwlyZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyB2b2lkIHJlY29yZF9yZW5hbWVfcGFpcihpbnQgZHN0X2luZGV4LCBpbnQgc3JjX2luZGV4LCBpbnQgc2NvcmUpCit7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bywgKnNyYywgKmRzdDsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZHA7CisKKwlpZiAocmVuYW1lX2RzdFtkc3RfaW5kZXhdLnBhaXIpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGRzdCBhbHJlYWR5IG1hdGNoZWQuIik7CisKKwlzcmMgPSByZW5hbWVfc3JjW3NyY19pbmRleF0ub25lOworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKHNyYy0+cGF0aCk7CisJZmlsbF9maWxlc3BlYyhvbmUsIHNyYy0+c2hhMSwgc3JjLT5tb2RlKTsKKworCWRzdCA9IHJlbmFtZV9kc3RbZHN0X2luZGV4XS50d287CisJdHdvID0gYWxsb2NfZmlsZXNwZWMoZHN0LT5wYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKHR3bywgZHN0LT5zaGExLCBkc3QtPm1vZGUpOworCisJZHAgPSBkaWZmX3F1ZXVlKE5VTEwsIG9uZSwgdHdvKTsKKwlkcC0+cmVuYW1lZF9wYWlyID0gMTsKKwlpZiAoIXN0cmNtcChzcmMtPnBhdGgsIGRzdC0+cGF0aCkpCisJCWRwLT5zY29yZSA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5zY29yZTsKKwllbHNlCisJCWRwLT5zY29yZSA9IHNjb3JlOworCWRwLT5zb3VyY2Vfc3RheXMgPSByZW5hbWVfc3JjW3NyY19pbmRleF0uc3JjX3BhdGhfbGVmdDsKKwlyZW5hbWVfZHN0W2RzdF9pbmRleF0ucGFpciA9IGRwOworfQorCisvKgorICogV2Ugc29ydCB0aGUgcmVuYW1lIHNpbWlsYXJpdHkgbWF0cml4IHdpdGggdGhlIHNjb3JlLCBpbiBkZXNjZW5kaW5nCisgKiBvcmRlciAodGhlIG1vc3Qgc2ltaWxhciBmaXJzdCkuCisgKi8KK3N0YXRpYyBpbnQgc2NvcmVfY29tcGFyZShjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJY29uc3Qgc3RydWN0IGRpZmZfc2NvcmUgKmEgPSBhXywgKmIgPSBiXzsKKwlyZXR1cm4gYi0+c2NvcmUgLSBhLT5zY29yZTsKK30KKworc3RhdGljIGludCBjb21wdXRlX3N0YXlzKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmIChzdHJjbXAob25lLT5wYXRoLCBwLT50d28tPnBhdGgpKQorCQkJY29udGludWU7CisJCWlmIChESUZGX1BBSVJfUkVOQU1FKHApKSB7CisJCQlyZXR1cm4gMDsgLyogc29tZXRoaW5nIGVsc2UgaXMgcmVuYW1lZCBpbnRvIHRoaXMgKi8KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBkaWZmY29yZV9yZW5hbWUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpbnQgZGV0ZWN0X3JlbmFtZSA9IG9wdGlvbnMtPmRldGVjdF9yZW5hbWU7CisJaW50IG1pbmltdW1fc2NvcmUgPSBvcHRpb25zLT5yZW5hbWVfc2NvcmU7CisJaW50IHJlbmFtZV9saW1pdCA9IG9wdGlvbnMtPnJlbmFtZV9saW1pdDsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3Qgb3V0cTsKKwlzdHJ1Y3QgZGlmZl9zY29yZSAqbXg7CisJaW50IGksIGosIHJlbmFtZV9jb3VudCwgY29udGVudHNfdG9vOworCWludCBudW1fY3JlYXRlLCBudW1fc3JjLCBkc3RfY250OworCisJaWYgKCFtaW5pbXVtX3Njb3JlKQorCQltaW5pbXVtX3Njb3JlID0gREVGQVVMVF9SRU5BTUVfU0NPUkU7CisJcmVuYW1lX2NvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQkJY29udGludWU7IC8qIHVubWVyZ2VkICovCisJCQllbHNlIGlmIChvcHRpb25zLT5zaW5nbGVfZm9sbG93ICYmCisJCQkJIHN0cmNtcChvcHRpb25zLT5zaW5nbGVfZm9sbG93LCBwLT50d28tPnBhdGgpKQorCQkJCWNvbnRpbnVlOyAvKiBub3QgaW50ZXJlc3RlZCAqLworCQkJZWxzZQorCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPnR3bywgMSk7CisJCX0KKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKiBJZiB0aGUgc291cmNlIGlzIGEgYnJva2VuICJkZWxldGUiLCBhbmQKKwkJCSAqIHRoZXkgZGlkIG5vdCByZWFsbHkgd2FudCB0byBnZXQgYnJva2VuLAorCQkJICogdGhhdCBtZWFucyB0aGUgc291cmNlIGFjdHVhbGx5IHN0YXlzLgorCQkJICovCisJCQlpbnQgc3RheXMgPSAocC0+YnJva2VuX3BhaXIgJiYgIXAtPnNjb3JlKTsKKwkJCXJlZ2lzdGVyX3JlbmFtZV9zcmMocC0+b25lLCBzdGF5cywgcC0+c2NvcmUpOworCQl9CisJCWVsc2UgaWYgKGRldGVjdF9yZW5hbWUgPT0gRElGRl9ERVRFQ1RfQ09QWSkKKwkJCXJlZ2lzdGVyX3JlbmFtZV9zcmMocC0+b25lLCAxLCBwLT5zY29yZSk7CisJfQorCWlmIChyZW5hbWVfZHN0X25yID09IDAgfHwgcmVuYW1lX3NyY19uciA9PSAwIHx8CisJICAgICgwIDwgcmVuYW1lX2xpbWl0ICYmIHJlbmFtZV9saW1pdCA8IHJlbmFtZV9kc3RfbnIpKQorCQlnb3RvIGNsZWFudXA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworCS8qIFdlIHJlYWxseSB3YW50IHRvIGN1bGwgdGhlIGNhbmRpZGF0ZXMgbGlzdCBlYXJseQorCSAqIHdpdGggY2hlYXAgdGVzdHMgaW4gb3JkZXIgdG8gYXZvaWQgZG9pbmcgZGVsdGFzLgorCSAqIFRoZSBmaXJzdCByb3VuZCBtYXRjaGVzIHVwIHRoZSB1cC10by1kYXRlIGVudHJpZXMsCisJICogYW5kIHRoZW4gZHVyaW5nIHRoZSBzZWNvbmQgcm91bmQgd2UgdHJ5IHRvIG1hdGNoCisJICogY2FjaGUtZGlydHkgZW50cmllcyBhcyB3ZWxsLgorCSAqLworCWZvciAoY29udGVudHNfdG9vID0gMDsgY29udGVudHNfdG9vIDwgMjsgY29udGVudHNfdG9vKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHJlbmFtZV9kc3RfbnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3byA9IHJlbmFtZV9kc3RbaV0udHdvOworCQkJaWYgKHJlbmFtZV9kc3RbaV0ucGFpcikKKwkJCQljb250aW51ZTsgLyogZGVhbHQgd2l0aCBhbiBlYXJsaWVyIHJvdW5kICovCisJCQlmb3IgKGogPSAwOyBqIDwgcmVuYW1lX3NyY19ucjsgaisrKSB7CisJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSA9IHJlbmFtZV9zcmNbal0ub25lOworCQkJCWlmICghaXNfZXhhY3RfbWF0Y2gob25lLCB0d28sIGNvbnRlbnRzX3RvbykpCisJCQkJCWNvbnRpbnVlOworCQkJCXJlY29yZF9yZW5hbWVfcGFpcihpLCBqLCAoaW50KU1BWF9TQ09SRSk7CisJCQkJcmVuYW1lX2NvdW50Kys7CisJCQkJYnJlYWs7IC8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyBlbnRyeSAqLworCQkJfQorCQl9CisJfQorCisJLyogSGF2ZSB3ZSBydW4gb3V0IHRoZSBjcmVhdGVkIGZpbGUgcG9vbD8gIElmIHNvIHdlIGNhbiBhdm9pZAorCSAqIGRvaW5nIHRoZSBkZWx0YSBtYXRyaXggYWx0b2dldGhlci4KKwkgKi8KKwlpZiAocmVuYW1lX2NvdW50ID09IHJlbmFtZV9kc3RfbnIpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChtaW5pbXVtX3Njb3JlID09IE1BWF9TQ09SRSkKKwkJZ290byBjbGVhbnVwOworCisJbnVtX2NyZWF0ZSA9IChyZW5hbWVfZHN0X25yIC0gcmVuYW1lX2NvdW50KTsKKwludW1fc3JjID0gcmVuYW1lX3NyY19ucjsKKwlteCA9IHhtYWxsb2Moc2l6ZW9mKCpteCkgKiBudW1fY3JlYXRlICogbnVtX3NyYyk7CisJZm9yIChkc3RfY250ID0gaSA9IDA7IGkgPCByZW5hbWVfZHN0X25yOyBpKyspIHsKKwkJaW50IGJhc2UgPSBkc3RfY250ICogbnVtX3NyYzsKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3byA9IHJlbmFtZV9kc3RbaV0udHdvOworCQlpZiAocmVuYW1lX2RzdFtpXS5wYWlyKQorCQkJY29udGludWU7IC8qIGRlYWx0IHdpdGggZXhhY3QgbWF0Y2ggYWxyZWFkeS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IHJlbmFtZV9zcmNfbnI7IGorKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSA9IHJlbmFtZV9zcmNbal0ub25lOworCQkJc3RydWN0IGRpZmZfc2NvcmUgKm0gPSAmbXhbYmFzZStqXTsKKwkJCW0tPnNyYyA9IGo7CisJCQltLT5kc3QgPSBpOworCQkJbS0+c2NvcmUgPSBlc3RpbWF0ZV9zaW1pbGFyaXR5KG9uZSwgdHdvLAorCQkJCQkJICAgICAgIG1pbmltdW1fc2NvcmUpOworCQkJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEob25lKTsKKwkJfQorCQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgdGV4dCBhbnltb3JlICovCisJCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHR3byk7CisJCWRzdF9jbnQrKzsKKwl9CisJLyogY29zdCBtYXRyaXggc29ydGVkIGJ5IG1vc3QgdG8gbGVhc3Qgc2ltaWxhciBwYWlyICovCisJcXNvcnQobXgsIG51bV9jcmVhdGUgKiBudW1fc3JjLCBzaXplb2YoKm14KSwgc2NvcmVfY29tcGFyZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9jcmVhdGUgKiBudW1fc3JjOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfcmVuYW1lX2RzdCAqZHN0ID0gJnJlbmFtZV9kc3RbbXhbaV0uZHN0XTsKKwkJaWYgKGRzdC0+cGFpcikKKwkJCWNvbnRpbnVlOyAvKiBhbHJlYWR5IGRvbmUsIGVpdGhlciBleGFjdCBvciBmdXp6eS4gKi8KKwkJaWYgKG14W2ldLnNjb3JlIDwgbWluaW11bV9zY29yZSkKKwkJCWJyZWFrOyAvKiB0aGVyZSBpcyBubyBtb3JlIHVzYWJsZSBwYWlyLiAqLworCQlyZWNvcmRfcmVuYW1lX3BhaXIobXhbaV0uZHN0LCBteFtpXS5zcmMsIG14W2ldLnNjb3JlKTsKKwkJcmVuYW1lX2NvdW50Kys7CisJfQorCWZyZWUobXgpOworCisgY2xlYW51cDoKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGZvdW5kIHNvbWUgcmVuYW1lcyBhbmQgY29waWVzIGFuZCB0aGV5CisJICogYXJlIHJlY29yZGVkIGluIHJlbmFtZV9kc3QuICBUaGUgb3JpZ2luYWwgbGlzdCBpcyBzdGlsbCBpbiAqcS4KKwkgKi8KKwlvdXRxLnF1ZXVlID0gTlVMTDsKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnBhaXJfdG9fZnJlZSA9IE5VTEw7CisKKwkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkgeworCQkJLyoKKwkJCSAqIENyZWF0aW9uCisJCQkgKgorCQkJICogV2Ugd291bGQgb3V0cHV0IHRoaXMgY3JlYXRlIHJlY29yZCBpZiBpdCBoYXMKKwkJCSAqIG5vdCBiZWVuIHR1cm5lZCBpbnRvIGEgcmVuYW1lL2NvcHkgYWxyZWFkeS4KKwkJCSAqLworCQkJc3RydWN0IGRpZmZfcmVuYW1lX2RzdCAqZHN0ID0KKwkJCQlsb2NhdGVfcmVuYW1lX2RzdChwLT50d28sIDApOworCQkJaWYgKGRzdCAmJiBkc3QtPnBhaXIpIHsKKwkJCQlkaWZmX3EoJm91dHEsIGRzdC0+cGFpcik7CisJCQkJcGFpcl90b19mcmVlID0gcDsKKwkJCX0KKwkJCWVsc2UKKwkJCQkvKiBubyBtYXRjaGluZyByZW5hbWUvY29weSBzb3VyY2UsIHNvCisJCQkJICogcmVjb3JkIHRoaXMgYXMgYSBjcmVhdGlvbi4KKwkJCQkgKi8KKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UgaWYgKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmICFESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkgeworCQkJLyoKKwkJCSAqIERlbGV0aW9uCisJCQkgKgorCQkJICogV2Ugd291bGQgb3V0cHV0IHRoaXMgZGVsZXRlIHJlY29yZCBpZjoKKwkJCSAqCisJCQkgKiAoMSkgdGhpcyBpcyBhIGJyb2tlbiBkZWxldGUgYW5kIHRoZSBjb3VudGVycGFydAorCQkJICogICAgIGJyb2tlbiBjcmVhdGUgcmVtYWlucyBpbiB0aGUgb3V0cHV0OyBvcgorCQkJICogKDIpIHRoaXMgaXMgbm90IGEgYnJva2VuIGRlbGV0ZSwgYW5kIHJlbmFtZV9kc3QKKwkJCSAqICAgICBkb2VzIG5vdCBoYXZlIGEgcmVuYW1lL2NvcHkgdG8gbW92ZSBwLT5vbmUtPnBhdGgKKwkJCSAqICAgICBvdXQgb2YgZXhpc3RlbmNlLgorCQkJICoKKwkJCSAqIE90aGVyd2lzZSwgdGhlIGNvdW50ZXJwYXJ0IGJyb2tlbiBjcmVhdGUKKwkJCSAqIGhhcyBiZWVuIHR1cm5lZCBpbnRvIGEgcmVuYW1lLWVkaXQ7IG9yCisJCQkgKiBkZWxldGUgZGlkIG5vdCBoYXZlIGEgbWF0Y2hpbmcgY3JlYXRlIHRvCisJCQkgKiBiZWdpbiB3aXRoLgorCQkJICovCisJCQlpZiAoRElGRl9QQUlSX0JST0tFTihwKSkgeworCQkJCS8qIGJyb2tlbiBkZWxldGUgKi8KKwkJCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPQorCQkJCQlsb2NhdGVfcmVuYW1lX2RzdChwLT5vbmUsIDApOworCQkJCWlmIChkc3QgJiYgZHN0LT5wYWlyKQorCQkJCQkvKiBjb3VudGVycGFydCBpcyBub3cgcmVuYW1lL2NvcHkgKi8KKwkJCQkJcGFpcl90b19mcmVlID0gcDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWZvciAoaiA9IDA7IGogPCByZW5hbWVfZHN0X25yOyBqKyspIHsKKwkJCQkJaWYgKCFyZW5hbWVfZHN0W2pdLnBhaXIpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKHN0cmNtcChyZW5hbWVfZHN0W2pdLnBhaXItPgorCQkJCQkJICAgb25lLT5wYXRoLAorCQkJCQkJICAgcC0+b25lLT5wYXRoKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGogPCByZW5hbWVfZHN0X25yKQorCQkJCQkvKiB0aGlzIHBhdGggcmVtYWlucyAqLworCQkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCisJCQlpZiAocGFpcl90b19mcmVlKQorCQkJCTsKKwkJCWVsc2UKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UgaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJCS8qIGFsbCB0aGUgdXN1YWwgb25lcyBuZWVkIHRvIGJlIGtlcHQgKi8KKwkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCWVsc2UKKwkJCS8qIG5vIG5lZWQgdG8ga2VlcCB1bm1vZGlmaWVkIHBhaXJzICovCisJCQlwYWlyX3RvX2ZyZWUgPSBwOworCisJCWlmIChwYWlyX3RvX2ZyZWUpCisJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocGFpcl90b19mcmVlKTsKKwl9CisJZGlmZl9kZWJ1Z19xdWV1ZSgiZG9uZSBjb3B5aW5nIG9yaWdpbmFsIiwgJm91dHEpOworCisJZnJlZShxLT5xdWV1ZSk7CisJKnEgPSBvdXRxOworCWRpZmZfZGVidWdfcXVldWUoImRvbmUgY29sbGFwc2luZyIsIHEpOworCisJLyogV2UgbmVlZCB0byBzZWUgd2hpY2ggcmVuYW1lIHNvdXJjZSByZWFsbHkgc3RheXMgaGVyZTsKKwkgKiBlYXJsaWVyIHdlIG9ubHkgY2hlY2tlZCBpZiB0aGUgcGF0aCBpcyBsZWZ0IGluIHRoZSByZXN1bHQsCisJICogYnV0IGV2ZW4gaWYgYSBwYXRoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdCwgaWYgdGhhdCBpcyBjb21pbmcKKwkgKiBmcm9tIGNvcHlpbmcgc29tZXRoaW5nIGVsc2Ugb24gdG9wIG9mIGl0LCB0aGVuIHRoZSBvcmlnaW5hbAorCSAqIHNvdXJjZSBpcyBsb3N0IGFuZCBkb2VzIG5vdCBzdGF5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmIChESUZGX1BBSVJfUkVOQU1FKHApICYmIHAtPnNvdXJjZV9zdGF5cykgeworCQkJLyogSWYgb25lIGFwcGVhcnMgYXMgdGhlIHRhcmdldCBvZiBhIHJlbmFtZS1jb3B5LAorCQkJICogdGhlbiBtYXJrIHAtPnNvdXJjZV9zdGF5cyA9IDA7IG90aGVyd2lzZQorCQkJICogbGVhdmUgaXQgYXMgaXMuCisJCQkgKi8KKwkJCXAtPnNvdXJjZV9zdGF5cyA9IGNvbXB1dGVfc3RheXMocSwgcC0+b25lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCByZW5hbWVfZHN0X25yOyBpKyspIHsKKwkJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEocmVuYW1lX2RzdFtpXS50d28pOworCQlmcmVlKHJlbmFtZV9kc3RbaV0udHdvKTsKKwl9CisKKwlmcmVlKHJlbmFtZV9kc3QpOworCXJlbmFtZV9kc3QgPSBOVUxMOworCXJlbmFtZV9kc3RfbnIgPSByZW5hbWVfZHN0X2FsbG9jID0gMDsKKwlmcmVlKHJlbmFtZV9zcmMpOworCXJlbmFtZV9zcmMgPSBOVUxMOworCXJlbmFtZV9zcmNfbnIgPSByZW5hbWVfc3JjX2FsbG9jID0gMDsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS5oIGIvZGlmZmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjkyOTRlCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaWZuZGVmIERJRkZDT1JFX0gKKyNkZWZpbmUgRElGRkNPUkVfSAorCisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIGJldHdlZW4gZGlmZi5jIGFuZCBpdHMgZGlmZiB0cmFuc2Zvcm1lcnMKKyAqIChlLmcuIGRpZmZjb3JlLXJlbmFtZSwgZGlmZmNvcmUtcGlja2F4ZSkuICBOZXZlciBpbmNsdWRlIHRoaXMgaGVhZGVyCisgKiBpbiBhbnl0aGluZyBlbHNlLgorICovCisKKy8qIFdlIGludGVybmFsbHkgdXNlIHVuc2lnbmVkIHNob3J0IGFzIHRoZSBzY29yZSB2YWx1ZSwKKyAqIGFuZCByZWx5IG9uIGFuIGludCBjYXBhYmxlIHRvIGhvbGQgMzItYml0cy4gIC1CIGNhbiB0YWtlCisgKiAtQm1lcmdlX3Njb3JlL2JyZWFrX3Njb3JlIGZvcm1hdCBhbmQgdGhlIHR3byBzY29yZXMgYXJlCisgKiBwYXNzZWQgYXJvdW5kIGluIG9uZSBpbnQgKGhpZ2ggMTYtYml0IGZvciBtZXJnZSBhbmQgbG93IDE2LWJpdAorICogZm9yIGJyZWFrKS4KKyAqLworI2RlZmluZSBNQVhfU0NPUkUgNjAwMDAuMAorI2RlZmluZSBERUZBVUxUX1JFTkFNRV9TQ09SRSAzMDAwMCAvKiByZW5hbWUvY29weSBzaW1pbGFyaXR5IG1pbmltdW0gKDUwJSkgKi8KKyNkZWZpbmUgREVGQVVMVF9CUkVBS19TQ09SRSAgMzAwMDAgLyogbWluaW11bSBmb3IgYnJlYWsgdG8gaGFwcGVuICg1MCUpICovCisjZGVmaW5lIERFRkFVTFRfTUVSR0VfU0NPUkUgIDM2MDAwIC8qIG1heGltdW0gZm9yIGJyZWFrLW1lcmdlIHRvIGhhcHBlbiA2MCUpICovCisKKyNkZWZpbmUgTUlOSU1VTV9CUkVBS19TSVpFICAgICA0MDAgLyogZG8gbm90IGJyZWFrIGEgZmlsZSBzbWFsbGVyIHRoYW4gdGhpcyAqLworCitzdHJ1Y3QgZGlmZl9maWxlc3BlYyB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpwYXRoOworCXZvaWQgKmRhdGE7CisJdm9pZCAqY250X2RhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCB4ZnJtX2ZsYWdzOwkJIC8qIGZvciB1c2UgYnkgdGhlIHhmcm0gKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkgLyogZmlsZSBtb2RlICovCisJdW5zaWduZWQgc2hhMV92YWxpZCA6IDE7IC8qIGlmIHRydWUsIHVzZSBzaGExIGFuZCB0cnVzdCBtb2RlOworCQkJCSAgKiBpZiBmYWxzZSwgdXNlIHRoZSBuYW1lIGFuZCByZWFkIGZyb20KKwkJCQkgICogdGhlIGZpbGVzeXN0ZW0uCisJCQkJICAqLworI2RlZmluZSBESUZGX0ZJTEVfVkFMSUQoc3BlYykgKCgoc3BlYyktPm1vZGUpICE9IDApCisJdW5zaWduZWQgc2hvdWxkX2ZyZWUgOiAxOyAvKiBkYXRhIHNob3VsZCBiZSBmcmVlKCknZWQgKi8KKwl1bnNpZ25lZCBzaG91bGRfbXVubWFwIDogMTsgLyogZGF0YSBzaG91bGQgYmUgbXVubWFwKCknZWQgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYWxsb2NfZmlsZXNwZWMoY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGZpbGxfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJICB1bnNpZ25lZCBzaG9ydCk7CisKK2V4dGVybiBpbnQgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEoc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CisKK3N0cnVjdCBkaWZmX2ZpbGVwYWlyIHsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d287CisJdW5zaWduZWQgc2hvcnQgaW50IHNjb3JlOworCWNoYXIgc3RhdHVzOyAvKiBNIEMgUiBOIEQgVSAoc2VlIERvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0KSAqLworCXVuc2lnbmVkIHNvdXJjZV9zdGF5cyA6IDE7IC8qIGFsbCBvZiBSL0MgYXJlIGNvcGllcyAqLworCXVuc2lnbmVkIGJyb2tlbl9wYWlyIDogMTsKKwl1bnNpZ25lZCByZW5hbWVkX3BhaXIgOiAxOworCXVuc2lnbmVkIGlzX3VubWVyZ2VkIDogMTsKK307CisjZGVmaW5lIERJRkZfUEFJUl9VTk1FUkdFRChwKSAoKHApLT5pc191bm1lcmdlZCkKKworI2RlZmluZSBESUZGX1BBSVJfUkVOQU1FKHApICgocCktPnJlbmFtZWRfcGFpcikKKworI2RlZmluZSBESUZGX1BBSVJfQlJPS0VOKHApIFwKKwkoICghRElGRl9GSUxFX1ZBTElEKChwKS0+b25lKSAhPSAhRElGRl9GSUxFX1ZBTElEKChwKS0+dHdvKSkgJiYgXAorCSAgKChwKS0+YnJva2VuX3BhaXIgIT0gMCkgKQorCisjZGVmaW5lIERJRkZfUEFJUl9UWVBFX0NIQU5HRUQocCkgXAorCSgoU19JRk1UICYgKHApLT5vbmUtPm1vZGUpICE9IChTX0lGTVQgJiAocCktPnR3by0+bW9kZSkpCisKKyNkZWZpbmUgRElGRl9QQUlSX01PREVfQ0hBTkdFRChwKSAoKHApLT5vbmUtPm1vZGUgIT0gKHApLT50d28tPm1vZGUpCisKK2V4dGVybiB2b2lkIGRpZmZfZnJlZV9maWxlcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqKTsKKworZXh0ZXJuIGludCBkaWZmX3VubW9kaWZpZWRfcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqKTsKKworc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IHsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqKnF1ZXVlOworCWludCBhbGxvYzsKKwlpbnQgbnI7Cit9OworCitleHRlcm4gc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IGRpZmZfcXVldWVkX2RpZmY7CitleHRlcm4gc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRpZmZfcXVldWUoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICosCisJCQkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICosCisJCQkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICopOworZXh0ZXJuIHZvaWQgZGlmZl9xKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqLCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqKTsKKworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfcGF0aHNwZWMoY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX2JyZWFrKGludCk7CitleHRlcm4gdm9pZCBkaWZmY29yZV9yZW5hbWUoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX21lcmdlX2Jyb2tlbih2b2lkKTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX3BpY2theGUoY29uc3QgY2hhciAqbmVlZGxlLCBpbnQgb3B0cyk7CitleHRlcm4gdm9pZCBkaWZmY29yZV9vcmRlcihjb25zdCBjaGFyICpvcmRlcmZpbGUpOworCisjZGVmaW5lIERJRkZfREVCVUcgMAorI2lmIERJRkZfREVCVUcKK3ZvaWQgZGlmZl9kZWJ1Z19maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqLCBpbnQsIGNvbnN0IGNoYXIgKik7Cit2b2lkIGRpZmZfZGVidWdfZmlsZXBhaXIoY29uc3Qgc3RydWN0IGRpZmZfZmlsZXBhaXIgKiwgaW50KTsKK3ZvaWQgZGlmZl9kZWJ1Z19xdWV1ZShjb25zdCBjaGFyICosIHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqKTsKKyNlbHNlCisjZGVmaW5lIGRpZmZfZGVidWdfZmlsZXNwZWMoYSxiLGMpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGRpZmZfZGVidWdfZmlsZXBhaXIoYSxiKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBkaWZmX2RlYnVnX3F1ZXVlKGEsYikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCitleHRlcm4gaW50IGRpZmZjb3JlX2NvdW50X2NoYW5nZXModm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkJCSAgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGRzdF9zaXplLAorCQkJCSAgdm9pZCAqKnNyY19jb3VudF9wLAorCQkJCSAgdm9pZCAqKmRzdF9jb3VudF9wLAorCQkJCSAgdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnNyY19jb3BpZWQsCisJCQkJICB1bnNpZ25lZCBsb25nICpsaXRlcmFsX2FkZGVkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXIuYyBiL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuYwpAQCAtMCwwICsxLDYyMSBAQAorLyoKKyAqIFRoaXMgaGFuZGxlcyByZWN1cnNpdmUgZmlsZW5hbWUgZGV0ZWN0aW9uIHdpdGggZXhjbHVkZQorICogZmlsZXMsIGluZGV4IGtub3dsZWRnZSBldGMuLgorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUtMjAwNgorICoJCSBKdW5pbyBIYW1hbm8sIDIwMDUtMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0cnVjdCBwYXRoX3NpbXBsaWZ5IHsKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKnBhdGg7Cit9OworCitzdGF0aWMgaW50IHJlYWRfZGlyZWN0b3J5X3JlY3Vyc2l2ZShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLAorCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCWludCBjaGVja19vbmx5LCBjb25zdCBzdHJ1Y3QgcGF0aF9zaW1wbGlmeSAqc2ltcGxpZnkpOworCitpbnQgY29tbW9uX3ByZWZpeChjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoLCAqbmV4dDsKKwlpbnQgcHJlZml4OworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIDA7CisKKwlwYXRoID0gKnBhdGhzcGVjOworCXNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCWlmICghc2xhc2gpCisJCXJldHVybiAwOworCisJcHJlZml4ID0gc2xhc2ggLSBwYXRoICsgMTsKKwl3aGlsZSAoKG5leHQgPSAqKytwYXRoc3BlYykgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc3RybGVuKG5leHQpOworCQlpZiAobGVuID49IHByZWZpeCAmJiAhbWVtY21wKHBhdGgsIG5leHQsIHByZWZpeCkpCisJCQljb250aW51ZTsKKwkJbGVuID0gcHJlZml4IC0gMTsKKwkJZm9yICg7OykgeworCQkJaWYgKCFsZW4pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobmV4dFstLWxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChwYXRoLCBuZXh0LCBsZW4rMSkpCisJCQkJY29udGludWU7CisJCQlwcmVmaXggPSBsZW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHByZWZpeDsKK30KKworLyoKKyAqIERvZXMgJ21hdGNoJyBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lPworICogQSBtYXRjaCBpcyBmb3VuZCBpZgorICoKKyAqICgxKSB0aGUgJ21hdGNoJyBzdHJpbmcgaXMgbGVhZGluZyBkaXJlY3Rvcnkgb2YgJ25hbWUnLCBvcgorICogKDIpIHRoZSAnbWF0Y2gnIHN0cmluZyBpcyBhIHdpbGRjYXJkIGFuZCBtYXRjaGVzICduYW1lJywgb3IKKyAqICgzKSB0aGUgJ21hdGNoJyBzdHJpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyAnbmFtZScuCisgKgorICogYW5kIHRoZSByZXR1cm4gdmFsdWUgdGVsbHMgd2hpY2ggY2FzZSBpdCB3YXMuCisgKgorICogSXQgcmV0dXJucyAwIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfb25lKGNvbnN0IGNoYXIgKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlpbnQgbWF0Y2hsZW47CisKKwkvKiBJZiB0aGUgbWF0Y2ggd2FzIGp1c3QgdGhlIHByZWZpeCwgd2UgbWF0Y2hlZCAqLworCW1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwlpZiAoIW1hdGNobGVuKQorCQlyZXR1cm4gTUFUQ0hFRF9SRUNVUlNJVkVMWTsKKworCS8qCisJICogSWYgd2UgZG9uJ3QgbWF0Y2ggdGhlIG1hdGNoc3RyaW5nIGV4YWN0bHksCisJICogd2UgbmVlZCB0byBtYXRjaCBieSBmbm1hdGNoCisJICovCisJaWYgKHN0cm5jbXAobWF0Y2gsIG5hbWUsIG1hdGNobGVuKSkKKwkJcmV0dXJuICFmbm1hdGNoKG1hdGNoLCBuYW1lLCAwKSA/IE1BVENIRURfRk5NQVRDSCA6IDA7CisKKwlpZiAoIW5hbWVbbWF0Y2hsZW5dKQorCQlyZXR1cm4gTUFUQ0hFRF9FWEFDVExZOworCWlmIChtYXRjaFttYXRjaGxlbi0xXSA9PSAnLycgfHwgbmFtZVttYXRjaGxlbl0gPT0gJy8nKQorCQlyZXR1cm4gTUFUQ0hFRF9SRUNVUlNJVkVMWTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmVuIGEgbmFtZSBhbmQgYSBsaXN0IG9mIHBhdGhzcGVjcywgc2VlIGlmIHRoZSBuYW1lIG1hdGNoZXMKKyAqIGFueSBvZiB0aGUgcGF0aHNwZWNzLiAgVGhlIGNhbGxlciBpcyBhbHNvIGludGVyZXN0ZWQgaW4gc2VlaW5nCisgKiBhbGwgcGF0aHNwZWMgbWF0Y2hlcyBzb21lIG5hbWVzIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aAorICogKG90aGVyd2lzZSB0aGUgdXNlciBjb3VsZCBoYXZlIG1pc3R5cGVkIHRoZSB1bm1hdGNoZWQgcGF0aHNwZWMpLAorICogYW5kIGEgbWFyayBpcyBsZWZ0IGluIHNlZW5bXSBhcnJheSBmb3IgcGF0aHNwZWMgZWxlbWVudCB0aGF0CisgKiBhY3R1YWxseSBtYXRjaGVkIGFueXRoaW5nLgorICovCitpbnQgbWF0Y2hfcGF0aHNwZWMoY29uc3QgY2hhciAqKnBhdGhzcGVjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IHByZWZpeCwgY2hhciAqc2VlbikKK3sKKwlpbnQgcmV0dmFsOworCWNvbnN0IGNoYXIgKm1hdGNoOworCisJbmFtZSArPSBwcmVmaXg7CisJbmFtZWxlbiAtPSBwcmVmaXg7CisKKwlmb3IgKHJldHZhbCA9IDA7IChtYXRjaCA9ICpwYXRoc3BlYysrKSAhPSBOVUxMOyBzZWVuKyspIHsKKwkJaW50IGhvdzsKKwkJaWYgKHJldHZhbCAmJiAqc2VlbiA9PSBNQVRDSEVEX0VYQUNUTFkpCisJCQljb250aW51ZTsKKwkJbWF0Y2ggKz0gcHJlZml4OworCQlob3cgPSBtYXRjaF9vbmUobWF0Y2gsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAoaG93KSB7CisJCQlpZiAocmV0dmFsIDwgaG93KQorCQkJCXJldHZhbCA9IGhvdzsKKwkJCWlmICgqc2VlbiA8IGhvdykKKwkJCQkqc2VlbiA9IGhvdzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGFkZF9leGNsdWRlKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqYmFzZSwKKwkJIGludCBiYXNlbGVuLCBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlzdHJ1Y3QgZXhjbHVkZSAqeCA9IHhtYWxsb2Moc2l6ZW9mICgqeCkpOworCisJeC0+cGF0dGVybiA9IHN0cmluZzsKKwl4LT5iYXNlID0gYmFzZTsKKwl4LT5iYXNlbGVuID0gYmFzZWxlbjsKKwlpZiAod2hpY2gtPm5yID09IHdoaWNoLT5hbGxvYykgeworCQl3aGljaC0+YWxsb2MgPSBhbGxvY19ucih3aGljaC0+YWxsb2MpOworCQl3aGljaC0+ZXhjbHVkZXMgPSB4cmVhbGxvYyh3aGljaC0+ZXhjbHVkZXMsCisJCQkJCSAgIHdoaWNoLT5hbGxvYyAqIHNpemVvZih4KSk7CisJfQorCXdoaWNoLT5leGNsdWRlc1t3aGljaC0+bnIrK10gPSB4OworfQorCitzdGF0aWMgaW50IGFkZF9leGNsdWRlc19mcm9tX2ZpbGVfMShjb25zdCBjaGFyICpmbmFtZSwKKwkJCQkgICAgY29uc3QgY2hhciAqYmFzZSwKKwkJCQkgICAgaW50IGJhc2VsZW4sCisJCQkJICAgIHN0cnVjdCBleGNsdWRlX2xpc3QgKndoaWNoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZCwgaTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWYsICplbnRyeTsKKworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwgZnN0YXQoZmQsICZzdCkgPCAwKQorCQlnb3RvIGVycjsKKwlzaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCWJ1ZiA9IHhtYWxsb2Moc2l6ZSsxKTsKKwlpZiAocmVhZF9pbl9mdWxsKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJCWdvdG8gZXJyOworCWNsb3NlKGZkKTsKKworCWJ1ZltzaXplKytdID0gJ1xuJzsKKwllbnRyeSA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gJ1xuJykgeworCQkJaWYgKGVudHJ5ICE9IGJ1ZiArIGkgJiYgZW50cnlbMF0gIT0gJyMnKSB7CisJCQkJYnVmW2kgLSAoaSAmJiBidWZbaS0xXSA9PSAnXHInKV0gPSAwOworCQkJCWFkZF9leGNsdWRlKGVudHJ5LCBiYXNlLCBiYXNlbGVuLCB3aGljaCk7CisJCQl9CisJCQllbnRyeSA9IGJ1ZiArIGkgKyAxOworCQl9CisJfQorCXJldHVybiAwOworCisgZXJyOgorCWlmICgwIDw9IGZkKQorCQljbG9zZShmZCk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIGFkZF9leGNsdWRlc19mcm9tX2ZpbGUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqZm5hbWUpCit7CisJaWYgKGFkZF9leGNsdWRlc19mcm9tX2ZpbGVfMShmbmFtZSwgIiIsIDAsCisJCQkJICAgICAmZGlyLT5leGNsdWRlX2xpc3RbRVhDX0ZJTEVdKSA8IDApCisJCWRpZSgiY2Fubm90IHVzZSAlcyBhcyBhbiBleGNsdWRlIGZpbGUiLCBmbmFtZSk7Cit9CisKK2ludCBwdXNoX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwljaGFyIGV4Y2x1ZGVfZmlsZVtQQVRIX01BWF07CisJc3RydWN0IGV4Y2x1ZGVfbGlzdCAqZWwgPSAmZGlyLT5leGNsdWRlX2xpc3RbRVhDX0RJUlNdOworCWludCBjdXJyZW50X25yID0gZWwtPm5yOworCisJaWYgKGRpci0+ZXhjbHVkZV9wZXJfZGlyKSB7CisJCW1lbWNweShleGNsdWRlX2ZpbGUsIGJhc2UsIGJhc2VsZW4pOworCQlzdHJjcHkoZXhjbHVkZV9maWxlICsgYmFzZWxlbiwgZGlyLT5leGNsdWRlX3Blcl9kaXIpOworCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoZXhjbHVkZV9maWxlLCBiYXNlLCBiYXNlbGVuLCBlbCk7CisJfQorCXJldHVybiBjdXJyZW50X25yOworfQorCit2b2lkIHBvcF9leGNsdWRlX3Blcl9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgaW50IHN0aykKK3sKKwlzdHJ1Y3QgZXhjbHVkZV9saXN0ICplbCA9ICZkaXItPmV4Y2x1ZGVfbGlzdFtFWENfRElSU107CisKKwl3aGlsZSAoc3RrIDwgZWwtPm5yKQorCQlmcmVlKGVsLT5leGNsdWRlc1stLWVsLT5ucl0pOworfQorCisvKiBTY2FuIHRoZSBsaXN0IGFuZCBsZXQgdGhlIGxhc3QgbWF0Y2ggZGV0ZXJtaW5lcyB0aGUgZmF0ZS4KKyAqIFJldHVybiAxIGZvciBleGNsdWRlLCAwIGZvciBpbmNsdWRlIGFuZCAtMSBmb3IgdW5kZWNpZGVkLgorICovCitzdGF0aWMgaW50IGV4Y2x1ZGVkXzEoY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCSAgICAgIGludCBwYXRobGVuLAorCQkgICAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0ICplbCkKK3sKKwlpbnQgaTsKKworCWlmIChlbC0+bnIpIHsKKwkJZm9yIChpID0gZWwtPm5yIC0gMTsgMCA8PSBpOyBpLS0pIHsKKwkJCXN0cnVjdCBleGNsdWRlICp4ID0gZWwtPmV4Y2x1ZGVzW2ldOworCQkJY29uc3QgY2hhciAqZXhjbHVkZSA9IHgtPnBhdHRlcm47CisJCQlpbnQgdG9fZXhjbHVkZSA9IDE7CisKKwkJCWlmICgqZXhjbHVkZSA9PSAnIScpIHsKKwkJCQl0b19leGNsdWRlID0gMDsKKwkJCQlleGNsdWRlKys7CisJCQl9CisKKwkJCWlmICghc3RyY2hyKGV4Y2x1ZGUsICcvJykpIHsKKwkJCQkvKiBtYXRjaCBiYXNlbmFtZSAqLworCQkJCWNvbnN0IGNoYXIgKmJhc2VuYW1lID0gc3RycmNocihwYXRobmFtZSwgJy8nKTsKKwkJCQliYXNlbmFtZSA9IChiYXNlbmFtZSkgPyBiYXNlbmFtZSsxIDogcGF0aG5hbWU7CisJCQkJaWYgKGZubWF0Y2goZXhjbHVkZSwgYmFzZW5hbWUsIDApID09IDApCisJCQkJCXJldHVybiB0b19leGNsdWRlOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogbWF0Y2ggd2l0aCBGTk1fUEFUSE5BTUU6CisJCQkJICogZXhjbHVkZSBoYXMgYmFzZSAoYmFzZWxlbiBsb25nKSBpbXBsaWNpdGx5CisJCQkJICogaW4gZnJvbnQgb2YgaXQuCisJCQkJICovCisJCQkJaW50IGJhc2VsZW4gPSB4LT5iYXNlbGVuOworCQkJCWlmICgqZXhjbHVkZSA9PSAnLycpCisJCQkJCWV4Y2x1ZGUrKzsKKworCQkJCWlmIChwYXRobGVuIDwgYmFzZWxlbiB8fAorCQkJCSAgICAoYmFzZWxlbiAmJiBwYXRobmFtZVtiYXNlbGVuLTFdICE9ICcvJykgfHwKKwkJCQkgICAgc3RybmNtcChwYXRobmFtZSwgeC0+YmFzZSwgYmFzZWxlbikpCisJCQkJICAgIGNvbnRpbnVlOworCisJCQkJaWYgKGZubWF0Y2goZXhjbHVkZSwgcGF0aG5hbWUrYmFzZWxlbiwKKwkJCQkJICAgIEZOTV9QQVRITkFNRSkgPT0gMCkKKwkJCQkJcmV0dXJuIHRvX2V4Y2x1ZGU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC0xOyAvKiB1bmRlY2lkZWQgKi8KK30KKworaW50IGV4Y2x1ZGVkKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwlpbnQgc3Q7CisKKwlmb3IgKHN0ID0gRVhDX0NNREw7IHN0IDw9IEVYQ19GSUxFOyBzdCsrKSB7CisJCXN3aXRjaCAoZXhjbHVkZWRfMShwYXRobmFtZSwgcGF0aGxlbiwgJmRpci0+ZXhjbHVkZV9saXN0W3N0XSkpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIDA7CisJCWNhc2UgMToKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlyX2VudHJ5ICpkaXJfYWRkX25hbWUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBsZW4pCit7CisJc3RydWN0IGRpcl9lbnRyeSAqZW50OworCisJaWYgKGNhY2hlX25hbWVfcG9zKHBhdGhuYW1lLCBsZW4pID49IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKGRpci0+bnIgPT0gZGlyLT5hbGxvYykgeworCQlpbnQgYWxsb2MgPSBhbGxvY19ucihkaXItPmFsbG9jKTsKKwkJZGlyLT5hbGxvYyA9IGFsbG9jOworCQlkaXItPmVudHJpZXMgPSB4cmVhbGxvYyhkaXItPmVudHJpZXMsIGFsbG9jKnNpemVvZihlbnQpKTsKKwl9CisJZW50ID0geG1hbGxvYyhzaXplb2YoKmVudCkgKyBsZW4gKyAxKTsKKwllbnQtPmlnbm9yZWQgPSBlbnQtPmlnbm9yZWRfZGlyID0gMDsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5uYW1lLCBwYXRobmFtZSwgbGVuKTsKKwllbnQtPm5hbWVbbGVuXSA9IDA7CisJZGlyLT5lbnRyaWVzW2Rpci0+bnIrK10gPSBlbnQ7CisJcmV0dXJuIGVudDsKK30KKworZW51bSBleGlzdF9zdGF0dXMgeworCWluZGV4X25vbmV4aXN0ZW50ID0gMCwKKwlpbmRleF9kaXJlY3RvcnksCisJaW5kZXhfZ2l0ZGlyLAorfTsKKworLyoKKyAqIFRoZSBpbmRleCBzb3J0cyBhbHBoYWJldGljYWxseSBieSBlbnRyeSBuYW1lLCB3aGljaAorICogbWVhbnMgdGhhdCBhIGdpdGxpbmsgc29ydHMgYXMgJ1wwJyBhdCB0aGUgZW5kLCB3aGlsZQorICogYSBkaXJlY3RvcnkgKHdoaWNoIGlzIGRlZmluZWQgbm90IGFzIGFuIGVudHJ5LCBidXQgYXMKKyAqIHRoZSBmaWxlcyBpdCBjb250YWlucykgd2lsbCBzb3J0IHdpdGggdGhlICcvJyBhdCB0aGUKKyAqIGVuZC4KKyAqLworc3RhdGljIGVudW0gZXhpc3Rfc3RhdHVzIGRpcmVjdG9yeV9leGlzdHNfaW5faW5kZXgoY29uc3QgY2hhciAqZGlybmFtZSwgaW50IGxlbikKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MoZGlybmFtZSwgbGVuKTsKKwlpZiAocG9zIDwgMCkKKwkJcG9zID0gLXBvcy0xOworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3MrK107CisJCXVuc2lnbmVkIGNoYXIgZW5kY2hhcjsKKworCQlpZiAoc3RybmNtcChjZS0+bmFtZSwgZGlybmFtZSwgbGVuKSkKKwkJCWJyZWFrOworCQllbmRjaGFyID0gY2UtPm5hbWVbbGVuXTsKKwkJaWYgKGVuZGNoYXIgPiAnLycpCisJCQlicmVhazsKKwkJaWYgKGVuZGNoYXIgPT0gJy8nKQorCQkJcmV0dXJuIGluZGV4X2RpcmVjdG9yeTsKKwkJaWYgKCFlbmRjaGFyICYmIFNfSVNESVJMTksobnRvaGwoY2UtPmNlX21vZGUpKSkKKwkJCXJldHVybiBpbmRleF9naXRkaXI7CisJfQorCXJldHVybiBpbmRleF9ub25leGlzdGVudDsKK30KKworLyoKKyAqIFdoZW4gd2UgZmluZCBhIGRpcmVjdG9yeSB3aGVuIHRyYXZlcnNpbmcgdGhlIGZpbGVzeXN0ZW0sIHdlCisgKiBoYXZlIHRocmVlIGRpc3RpbmN0IGNhc2VzOgorICoKKyAqICAtIGlnbm9yZSBpdAorICogIC0gc2VlIGl0IGFzIGEgZGlyZWN0b3J5CisgKiAgLSByZWN1cnNlIGludG8gaXQKKyAqCisgKiBhbmQgd2hpY2ggb25lIHdlIGNob29zZSBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgZXhpc3RpbmcKKyAqIGdpdCBpbmRleCBjb250ZW50cyBhbmQgdGhlIGZsYWdzIHBhc3NlZCBpbnRvIHRoZSBkaXJlY3RvcnkKKyAqIHRyYXZlcnNhbCByb3V0aW5lLgorICoKKyAqIENhc2UgMTogSWYgd2UgKmFscmVhZHkqIGhhdmUgZW50cmllcyBpbiB0aGUgaW5kZXggdW5kZXIgdGhhdAorICogZGlyZWN0b3J5IG5hbWUsIHdlIGFsd2F5cyByZWN1cnNlIGludG8gdGhlIGRpcmVjdG9yeSB0byBzZWUKKyAqIGFsbCB0aGUgZmlsZXMuCisgKgorICogQ2FzZSAyOiBJZiB3ZSAqYWxyZWFkeSogaGF2ZSB0aGF0IGRpcmVjdG9yeSBuYW1lIGFzIGEgZ2l0bGluaywKKyAqIHdlIGFsd2F5cyBjb250aW51ZSB0byBzZWUgaXQgYXMgYSBnaXRsaW5rLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAqIHRoZXJlIGlzIGFuIGFjdHVhbCBnaXQgZGlyZWN0b3J5IHRoZXJlIG9yIG5vdCAoaXQgbWlnaHQgbm90CisgKiBiZSBjaGVja2VkIG91dCBhcyBhIHN1YnByb2plY3QhKQorICoKKyAqIENhc2UgMzogaWYgd2UgZGlkbid0IGhhdmUgaXQgaW4gdGhlIGluZGV4IHByZXZpb3VzbHksIHdlCisgKiBoYXZlIGEgZmV3IHN1Yi1jYXNlczoKKyAqCisgKiAgKGEpIGlmICJzaG93X290aGVyX2RpcmVjdG9yaWVzIiBpcyB0cnVlLCB3ZSBzaG93IGl0IGFzCisgKiAgICAgIGp1c3QgYSBkaXJlY3RvcnksIHVubGVzcyAiaGlkZV9lbXB0eV9kaXJlY3RvcmllcyIgaXMKKyAqICAgICAgYWxzbyB0cnVlIGFuZCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LCBpbiB3aGljaCBjYXNlCisgKiAgICAgIHdlIGp1c3QgaWdub3JlIGl0IGVudGlyZWx5LgorICogIChiKSBpZiBpdCBsb29rcyBsaWtlIGEgZ2l0IGRpcmVjdG9yeSwgYW5kIHdlIGRvbid0IGhhdmUKKyAqICAgICAgJ25vX2RpcmxpbmtzJyBzZXQgd2UgdHJlYXQgaXQgYXMgYSBnaXRsaW5rLCBhbmQgc2hvdyBpdAorICogICAgICBhcyBhIGRpcmVjdG9yeS4KKyAqICAoYykgb3RoZXJ3aXNlLCB3ZSByZWN1cnNlIGludG8gaXQuCisgKi8KK2VudW0gZGlyZWN0b3J5X3RyZWF0bWVudCB7CisJc2hvd19kaXJlY3RvcnksCisJaWdub3JlX2RpcmVjdG9yeSwKKwlyZWN1cnNlX2ludG9fZGlyZWN0b3J5LAorfTsKKworc3RhdGljIGVudW0gZGlyZWN0b3J5X3RyZWF0bWVudCB0cmVhdF9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwKKwljb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgbGVuLAorCWNvbnN0IHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSkKK3sKKwkvKiBUaGUgImxlbi0xIiBpcyB0byBzdHJpcCB0aGUgZmluYWwgJy8nICovCisJc3dpdGNoIChkaXJlY3RvcnlfZXhpc3RzX2luX2luZGV4KGRpcm5hbWUsIGxlbi0xKSkgeworCWNhc2UgaW5kZXhfZGlyZWN0b3J5OgorCQlyZXR1cm4gcmVjdXJzZV9pbnRvX2RpcmVjdG9yeTsKKworCWNhc2UgaW5kZXhfZ2l0ZGlyOgorCQlpZiAoZGlyLT5zaG93X290aGVyX2RpcmVjdG9yaWVzKQorCQkJcmV0dXJuIGlnbm9yZV9kaXJlY3Rvcnk7CisJCXJldHVybiBzaG93X2RpcmVjdG9yeTsKKworCWNhc2UgaW5kZXhfbm9uZXhpc3RlbnQ6CisJCWlmIChkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMpCisJCQlicmVhazsKKwkJaWYgKCFkaXItPm5vX2RpcmxpbmtzKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJaWYgKHJlc29sdmVfZ2l0bGlua19yZWYoZGlybmFtZSwgIkhFQUQiLCBzaGExKSA9PSAwKQorCQkJCXJldHVybiBzaG93X2RpcmVjdG9yeTsKKwkJfQorCQlyZXR1cm4gcmVjdXJzZV9pbnRvX2RpcmVjdG9yeTsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSAic2hvd19vdGhlcl9kaXJlY3RvcmllcyIgY2FzZSAqLworCWlmICghZGlyLT5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzKQorCQlyZXR1cm4gc2hvd19kaXJlY3Rvcnk7CisJaWYgKCFyZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoZGlyLCBkaXJuYW1lLCBkaXJuYW1lLCBsZW4sIDEsIHNpbXBsaWZ5KSkKKwkJcmV0dXJuIGlnbm9yZV9kaXJlY3Rvcnk7CisJcmV0dXJuIHNob3dfZGlyZWN0b3J5OworfQorCisvKgorICogVGhpcyBpcyBhbiBpbmV4YWN0IGVhcmx5IHBydW5pbmcgb2YgYW55IHJlY3Vyc2l2ZSBkaXJlY3RvcnkKKyAqIHJlYWRpbmcgLSBpZiB0aGUgcGF0aCBjYW5ub3QgcG9zc2libHkgYmUgaW4gdGhlIHBhdGhzcGVjLAorICogcmV0dXJuIHRydWUsIGFuZCB3ZSdsbCBza2lwIGl0IGVhcmx5LgorICovCitzdGF0aWMgaW50IHNpbXBsaWZ5X2F3YXkoY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4sIGNvbnN0IHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSkKK3sKKwlpZiAoc2ltcGxpZnkpIHsKKwkJZm9yICg7OykgeworCQkJY29uc3QgY2hhciAqbWF0Y2ggPSBzaW1wbGlmeS0+cGF0aDsKKwkJCWludCBsZW4gPSBzaW1wbGlmeS0+bGVuOworCisJCQlpZiAoIW1hdGNoKQorCQkJCWJyZWFrOworCQkJaWYgKGxlbiA+IHBhdGhsZW4pCisJCQkJbGVuID0gcGF0aGxlbjsKKwkJCWlmICghbWVtY21wKHBhdGgsIG1hdGNoLCBsZW4pKQorCQkJCXJldHVybiAwOworCQkJc2ltcGxpZnkrKzsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGEgZGlyZWN0b3J5IHRyZWUuIFdlIGN1cnJlbnRseSBpZ25vcmUgYW55dGhpbmcgYnV0CisgKiBkaXJlY3RvcmllcywgcmVndWxhciBmaWxlcyBhbmQgc3ltbGlua3MuIFRoYXQncyBiZWNhdXNlIGdpdAorICogZG9lc24ndCBoYW5kbGUgdGhlbSBhdCBhbGwgeWV0LiBNYXliZSB0aGF0IHdpbGwgY2hhbmdlIHNvbWUKKyAqIGRheS4KKyAqCisgKiBBbHNvLCB3ZSBpZ25vcmUgdGhlIG5hbWUgIi5naXQiIChldmVuIGlmIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSkuCisgKiBUaGF0IGxpa2VseSB3aWxsIG5vdCBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9kaXJlY3RvcnlfcmVjdXJzaXZlKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBpbnQgY2hlY2tfb25seSwgY29uc3Qgc3RydWN0IHBhdGhfc2ltcGxpZnkgKnNpbXBsaWZ5KQoreworCURJUiAqZmRpciA9IG9wZW5kaXIocGF0aCk7CisJaW50IGNvbnRlbnRzID0gMDsKKworCWlmIChmZGlyKSB7CisJCWludCBleGNsdWRlX3N0azsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWNoYXIgZnVsbG5hbWVbUEFUSF9NQVggKyAxXTsKKwkJbWVtY3B5KGZ1bGxuYW1lLCBiYXNlLCBiYXNlbGVuKTsKKworCQlleGNsdWRlX3N0ayA9IHB1c2hfZXhjbHVkZV9wZXJfZGlyZWN0b3J5KGRpciwgYmFzZSwgYmFzZWxlbik7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZmRpcikpICE9IE5VTEwpIHsKKwkJCWludCBsZW47CisJCQlpbnQgZXhjbHVkZTsKKworCQkJaWYgKChkZS0+ZF9uYW1lWzBdID09ICcuJykgJiYKKwkJCSAgICAoZGUtPmRfbmFtZVsxXSA9PSAwIHx8CisJCQkgICAgICFzdHJjbXAoZGUtPmRfbmFtZSArIDEsICIuIikgfHwKKwkJCSAgICAgIXN0cmNtcChkZS0+ZF9uYW1lICsgMSwgImdpdCIpKSkKKwkJCQljb250aW51ZTsKKwkJCWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJCS8qIElnbm9yZSBvdmVybHkgbG9uZyBwYXRobmFtZXMhICovCisJCQlpZiAobGVuICsgYmFzZWxlbiArIDggPiBzaXplb2YoZnVsbG5hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKHNpbXBsaWZ5X2F3YXkoZnVsbG5hbWUsIGJhc2VsZW4gKyBsZW4sIHNpbXBsaWZ5KSkKKwkJCQljb250aW51ZTsKKworCQkJZXhjbHVkZSA9IGV4Y2x1ZGVkKGRpciwgZnVsbG5hbWUpOworCQkJaWYgKGV4Y2x1ZGUgIT0gZGlyLT5zaG93X2lnbm9yZWQpIHsKKwkJCQlpZiAoIWRpci0+c2hvd19pZ25vcmVkIHx8IERUWVBFKGRlKSAhPSBEVF9ESVIpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlzd2l0Y2ggKERUWVBFKGRlKSkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBEVF9VTktOT1dOOgorCQkJCWlmIChsc3RhdChmdWxsbmFtZSwgJnN0KSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgfHwgU19JU0xOSyhzdC5zdF9tb2RlKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSBEVF9ESVI6CisJCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiArIGxlbiwgIi8iLCAyKTsKKwkJCQlsZW4rKzsKKwkJCQlzd2l0Y2ggKHRyZWF0X2RpcmVjdG9yeShkaXIsIGZ1bGxuYW1lLCBiYXNlbGVuICsgbGVuLCBzaW1wbGlmeSkpIHsKKwkJCQljYXNlIHNob3dfZGlyZWN0b3J5OgorCQkJCQlpZiAoZXhjbHVkZSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlIHJlY3Vyc2VfaW50b19kaXJlY3Rvcnk6CisJCQkJCWNvbnRlbnRzICs9IHJlYWRfZGlyZWN0b3J5X3JlY3Vyc2l2ZShkaXIsCisJCQkJCQlmdWxsbmFtZSwgZnVsbG5hbWUsIGJhc2VsZW4gKyBsZW4sIDAsIHNpbXBsaWZ5KTsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSBpZ25vcmVfZGlyZWN0b3J5OgorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERUX1JFRzoKKwkJCWNhc2UgRFRfTE5LOgorCQkJCWJyZWFrOworCQkJfQorCQkJY29udGVudHMrKzsKKwkJCWlmIChjaGVja19vbmx5KQorCQkJCWdvdG8gZXhpdF9lYXJseTsKKwkJCWVsc2UKKwkJCQlkaXJfYWRkX25hbWUoZGlyLCBmdWxsbmFtZSwgYmFzZWxlbiArIGxlbik7CisJCX0KK2V4aXRfZWFybHk6CisJCWNsb3NlZGlyKGZkaXIpOworCisJCXBvcF9leGNsdWRlX3Blcl9kaXJlY3RvcnkoZGlyLCBleGNsdWRlX3N0ayk7CisJfQorCisJcmV0dXJuIGNvbnRlbnRzOworfQorCitzdGF0aWMgaW50IGNtcF9uYW1lKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMSA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMTsKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMiA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMjsKKworCXJldHVybiBjYWNoZV9uYW1lX2NvbXBhcmUoZTEtPm5hbWUsIGUxLT5sZW4sCisJCQkJICBlMi0+bmFtZSwgZTItPmxlbik7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgInNpbXBsZSIgcGFydCBvZiBhIHBhdGggbWF0Y2ggbGltaXRlci4KKyAqLworc3RhdGljIGludCBzaW1wbGVfbGVuZ3RoKGNvbnN0IGNoYXIgKm1hdGNoKQoreworCWNvbnN0IGNoYXIgc3BlY2lhbFsyNTZdID0geworCQlbMF0gPSAxLCBbJz8nXSA9IDEsCisJCVsnXFwnXSA9IDEsIFsnKiddID0gMSwKKwkJWydbJ10gPSAxCisJfTsKKwlpbnQgbGVuID0gLTE7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICptYXRjaCsrOworCQlsZW4rKzsKKwkJaWYgKHNwZWNpYWxbY10pCisJCQlyZXR1cm4gbGVuOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpjcmVhdGVfc2ltcGxpZnkoY29uc3QgY2hhciAqKnBhdGhzcGVjKQoreworCWludCBuciwgYWxsb2MgPSAwOworCXN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSA9IE5VTEw7CisKKwlpZiAoIXBhdGhzcGVjKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAobnIgPSAwIDsgOyBucisrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoOworCQlpZiAobnIgPj0gYWxsb2MpIHsKKwkJCWFsbG9jID0gYWxsb2NfbnIoYWxsb2MpOworCQkJc2ltcGxpZnkgPSB4cmVhbGxvYyhzaW1wbGlmeSwgYWxsb2MgKiBzaXplb2YoKnNpbXBsaWZ5KSk7CisJCX0KKwkJbWF0Y2ggPSAqcGF0aHNwZWMrKzsKKwkJaWYgKCFtYXRjaCkKKwkJCWJyZWFrOworCQlzaW1wbGlmeVtucl0ucGF0aCA9IG1hdGNoOworCQlzaW1wbGlmeVtucl0ubGVuID0gc2ltcGxlX2xlbmd0aChtYXRjaCk7CisJfQorCXNpbXBsaWZ5W25yXS5wYXRoID0gTlVMTDsKKwlzaW1wbGlmeVtucl0ubGVuID0gMDsKKwlyZXR1cm4gc2ltcGxpZnk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfc2ltcGxpZnkoc3RydWN0IHBhdGhfc2ltcGxpZnkgKnNpbXBsaWZ5KQoreworCWlmIChzaW1wbGlmeSkKKwkJZnJlZShzaW1wbGlmeSk7Cit9CisKK2ludCByZWFkX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqKnBhdGhzcGVjKQoreworCXN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSA9IGNyZWF0ZV9zaW1wbGlmeShwYXRoc3BlYyk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBkbyB0aGUgcGVyLWRpcmVjdG9yeSBleGNsdWRlIGZvciBhbGwgdGhlCisJICogZGlyZWN0b3JpZXMgbGVhZGluZyB1cCB0byBvdXIgYmFzZS4KKwkgKi8KKwlpZiAoYmFzZWxlbikgeworCQlpZiAoZGlyLT5leGNsdWRlX3Blcl9kaXIpIHsKKwkJCWNoYXIgKnAsICpwcCA9IHhtYWxsb2MoYmFzZWxlbisxKTsKKwkJCW1lbWNweShwcCwgYmFzZSwgYmFzZWxlbisxKTsKKwkJCXAgPSBwcDsKKwkJCXdoaWxlICgxKSB7CisJCQkJY2hhciBzYXZlID0gKnA7CisJCQkJKnAgPSAwOworCQkJCXB1c2hfZXhjbHVkZV9wZXJfZGlyZWN0b3J5KGRpciwgcHAsIHAtcHApOworCQkJCSpwKysgPSBzYXZlOworCQkJCWlmICghc2F2ZSkKKwkJCQkJYnJlYWs7CisJCQkJcCA9IHN0cmNocihwLCAnLycpOworCQkJCWlmIChwKQorCQkJCQlwKys7CisJCQkJZWxzZQorCQkJCQlwID0gcHAgKyBiYXNlbGVuOworCQkJfQorCQkJZnJlZShwcCk7CisJCX0KKwl9CisKKwlyZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuLCAwLCBzaW1wbGlmeSk7CisJZnJlZV9zaW1wbGlmeShzaW1wbGlmeSk7CisJcXNvcnQoZGlyLT5lbnRyaWVzLCBkaXItPm5yLCBzaXplb2Yoc3RydWN0IGRpcl9lbnRyeSAqKSwgY21wX25hbWUpOworCXJldHVybiBkaXItPm5yOworfQorCitpbnQKK2ZpbGVfZXhpc3RzKGNvbnN0IGNoYXIgKmYpCit7CisgIHN0cnVjdCBzdGF0IHNiOworICByZXR1cm4gc3RhdChmLCAmc2IpID09IDA7Cit9CmRpZmYgLS1naXQgYS9kaXIuaCBiL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2M2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIERJUl9ICisjZGVmaW5lIERJUl9ICisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBleGNsdWRlIHBhdHRlcm4gbGlzdHM6CisgKiBFWENfQ01ETCBsaXN0cyBwYXR0ZXJucyBleHBsaWNpdGx5IGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKiBFWENfRElSUyBsaXN0cyBwYXR0ZXJucyBvYnRhaW5lZCBmcm9tIHBlci1kaXJlY3RvcnkgaWdub3JlIGZpbGVzLgorICogRVhDX0ZJTEUgbGlzdHMgcGF0dGVybnMgZnJvbSBmYWxsYmFjayBpZ25vcmUgZmlsZXMuCisgKi8KKyNkZWZpbmUgRVhDX0NNREwgMAorI2RlZmluZSBFWENfRElSUyAxCisjZGVmaW5lIEVYQ19GSUxFIDIKKworCitzdHJ1Y3QgZGlyX2VudHJ5IHsKKwl1bnNpZ25lZCBpbnQgaWdub3JlZCA6IDE7CisJdW5zaWduZWQgaW50IGlnbm9yZWRfZGlyIDogMTsKKwl1bnNpZ25lZCBpbnQgbGVuIDogMzA7CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCitzdHJ1Y3QgZXhjbHVkZV9saXN0IHsKKwlpbnQgbnI7CisJaW50IGFsbG9jOworCXN0cnVjdCBleGNsdWRlIHsKKwkJY29uc3QgY2hhciAqcGF0dGVybjsKKwkJY29uc3QgY2hhciAqYmFzZTsKKwkJaW50IGJhc2VsZW47CisJfSAqKmV4Y2x1ZGVzOworfTsKKworc3RydWN0IGRpcl9zdHJ1Y3QgeworCWludCBuciwgYWxsb2M7CisJdW5zaWduZWQgaW50IHNob3dfaWdub3JlZDoxLAorCQkgICAgIHNob3dfb3RoZXJfZGlyZWN0b3JpZXM6MSwKKwkJICAgICBoaWRlX2VtcHR5X2RpcmVjdG9yaWVzOjEsCisJCSAgICAgbm9fZGlybGlua3M6MTsKKwlzdHJ1Y3QgZGlyX2VudHJ5ICoqZW50cmllczsKKworCS8qIEV4Y2x1ZGUgaW5mbyAqLworCWNvbnN0IGNoYXIgKmV4Y2x1ZGVfcGVyX2RpcjsKKwlzdHJ1Y3QgZXhjbHVkZV9saXN0IGV4Y2x1ZGVfbGlzdFszXTsKK307CisKK2V4dGVybiBpbnQgY29tbW9uX3ByZWZpeChjb25zdCBjaGFyICoqcGF0aHNwZWMpOworCisjZGVmaW5lIE1BVENIRURfUkVDVVJTSVZFTFkgMQorI2RlZmluZSBNQVRDSEVEX0ZOTUFUQ0ggMgorI2RlZmluZSBNQVRDSEVEX0VYQUNUTFkgMworZXh0ZXJuIGludCBtYXRjaF9wYXRoc3BlYyhjb25zdCBjaGFyICoqcGF0aHNwZWMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBpbnQgcHJlZml4LCBjaGFyICpzZWVuKTsKKworZXh0ZXJuIGludCByZWFkX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKK2V4dGVybiBpbnQgcHVzaF9leGNsdWRlX3Blcl9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcG9wX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqLCBpbnQpOworCitleHRlcm4gaW50IGV4Y2x1ZGVkKHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBhZGRfZXhjbHVkZXNfZnJvbV9maWxlKHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKmZuYW1lKTsKK2V4dGVybiB2b2lkIGFkZF9leGNsdWRlKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqYmFzZSwKKwkJCWludCBiYXNlbGVuLCBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCk7CitleHRlcm4gaW50IGZpbGVfZXhpc3RzKGNvbnN0IGNoYXIgKik7CitleHRlcm4gc3RydWN0IGRpcl9lbnRyeSAqZGlyX2FkZF9uYW1lKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kdW1wLWNhY2hlLXRyZWUuYyBiL2R1bXAtY2FjaGUtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzNmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kdW1wLWNhY2hlLXRyZWUuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisKK3N0YXRpYyB2b2lkIGR1bXBfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGZ4LCBjb25zdCBjaGFyICp4KQoreworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKQorCQlwcmludGYoIiUtNDBzICVzJXMgKCVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgICJpbnZhbGlkIiwgeCwgcGZ4LCBpdC0+c3VidHJlZV9ucik7CisJZWxzZQorCQlwcmludGYoIiVzICVzJXMgKCVkIGVudHJpZXMsICVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgIHNoYTFfdG9faGV4KGl0LT5zaGExKSwgeCwgcGZ4LAorCQkgICAgICAgaXQtPmVudHJ5X2NvdW50LCBpdC0+c3VidHJlZV9ucik7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJCSAgIHN0cnVjdCBjYWNoZV90cmVlICpyZWYsCisJCQkgICBjb25zdCBjaGFyICpwZngpCit7CisJaW50IGk7CisJaW50IGVycnMgPSAwOworCisJaWYgKCFpdCB8fCAhcmVmKQorCQkvKiBtaXNzaW5nIGluIGVpdGhlciAqLworCQlyZXR1cm4gMDsKKworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJZHVtcF9vbmUocmVmLCBwZngsICIjKHJlZikgIik7CisJCWlmIChpdC0+c3VidHJlZV9uciAhPSByZWYtPnN1YnRyZWVfbnIpCisJCQllcnJzID0gMTsKKwl9CisJZWxzZSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJaWYgKGhhc2hjbXAoaXQtPnNoYTEsIHJlZi0+c2hhMSkgfHwKKwkJICAgIHJlZi0+ZW50cnlfY291bnQgIT0gaXQtPmVudHJ5X2NvdW50IHx8CisJCSAgICByZWYtPnN1YnRyZWVfbnIgIT0gaXQtPnN1YnRyZWVfbnIpIHsKKwkJCWR1bXBfb25lKHJlZiwgcGZ4LCAiIyhyZWYpICIpOworCQkJZXJycyA9IDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd24gPSBpdC0+ZG93bltpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpyZHduOworCisJCXJkd24gPSBjYWNoZV90cmVlX3N1YihyZWYsIGRvd24tPm5hbWUpOworCQlzcHJpbnRmKHBhdGgsICIlcyUuKnMvIiwgcGZ4LCBkb3duLT5uYW1lbGVuLCBkb3duLT5uYW1lKTsKKwkJaWYgKGR1bXBfY2FjaGVfdHJlZShkb3duLT5jYWNoZV90cmVlLCByZHduLT5jYWNoZV90cmVlLCBwYXRoKSkKKwkJCWVycnMgPSAxOworCX0KKwlyZXR1cm4gZXJyczsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IGNhY2hlX3RyZWUgKmFub3RoZXIgPSBjYWNoZV90cmVlKCk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgaW5kZXggZmlsZSIpOworCWNhY2hlX3RyZWVfdXBkYXRlKGFub3RoZXIsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCAwLCAxKTsKKwlyZXR1cm4gZHVtcF9jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlLCBhbm90aGVyLCAiIik7Cit9CmRpZmYgLS1naXQgYS9lbnRyeS5jIGIvZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJmNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZW50cnkuYwpAQCAtMCwwICsxLDIwNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgdm9pZCBjcmVhdGVfZGlyZWN0b3JpZXMoY29uc3QgY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MobGVuICsgMSk7CisJY29uc3QgY2hhciAqc2xhc2ggPSBwYXRoOworCisJd2hpbGUgKChzbGFzaCA9IHN0cmNocihzbGFzaCsxLCAnLycpKSAhPSBOVUxMKSB7CisJCWxlbiA9IHNsYXNoIC0gcGF0aDsKKwkJbWVtY3B5KGJ1ZiwgcGF0aCwgbGVuKTsKKwkJYnVmW2xlbl0gPSAwOworCQlpZiAobWtkaXIoYnVmLCAwNzc3KSkgeworCQkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmIChsZW4gPiBzdGF0ZS0+YmFzZV9kaXJfbGVuICYmIHN0YXRlLT5mb3JjZSAmJiAhdW5saW5rKGJ1ZikgJiYgIW1rZGlyKGJ1ZiwgMDc3NykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc3RhdChidWYsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCQkJY29udGludWU7IC8qIG9rICovCisJCQl9CisJCQlkaWUoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0ICVzIiwgYnVmKTsKKwkJfQorCX0KKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisJY2hhciAqbmFtZTsKKwkKKwlpZiAoIWRpcikKKwkJZGllKCJjYW5ub3Qgb3BlbmRpciAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwlzdHJjcHkocGF0aGJ1ZiwgcGF0aCk7CisJbmFtZSA9IHBhdGhidWYgKyBzdHJsZW4ocGF0aCk7CisJKm5hbWUrKyA9ICcvJzsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpZiAoKGRlLT5kX25hbWVbMF0gPT0gJy4nKSAmJgorCQkgICAgKChkZS0+ZF9uYW1lWzFdID09IDApIHx8CisJCSAgICAgKChkZS0+ZF9uYW1lWzFdID09ICcuJykgJiYgZGUtPmRfbmFtZVsyXSA9PSAwKSkpCisJCQljb250aW51ZTsKKwkJc3RyY3B5KG5hbWUsIGRlLT5kX25hbWUpOworCQlpZiAobHN0YXQocGF0aGJ1ZiwgJnN0KSkKKwkJCWRpZSgiY2Fubm90IGxzdGF0ICVzICglcykiLCBwYXRoYnVmLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCXJlbW92ZV9zdWJ0cmVlKHBhdGhidWYpOworCQllbHNlIGlmICh1bmxpbmsocGF0aGJ1ZikpCisJCQlkaWUoImNhbm5vdCB1bmxpbmsgJXMgKCVzKSIsIHBhdGhidWYsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWNsb3NlZGlyKGRpcik7CisJaWYgKHJtZGlyKHBhdGgpKQorCQlkaWUoImNhbm5vdCBybWRpciAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfZmlsZShjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwltb2RlID0gKG1vZGUgJiAwMTAwKSA/IDA3NzcgOiAwNjY2OworCXJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkICpyZWFkX2Jsb2JfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdm9pZCAqbmV3ID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsICZ0eXBlLCBzaXplKTsKKworCWlmIChuZXcpIHsKKwkJaWYgKHR5cGUgPT0gT0JKX0JMT0IpCisJCQlyZXR1cm4gbmV3OworCQlmcmVlKG5ldyk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHdyaXRlX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCBjaGVja291dCAqc3RhdGUsIGludCB0b190ZW1wZmlsZSkKK3sKKwlpbnQgZmQ7CisJbG9uZyB3cm90ZTsKKworCXN3aXRjaCAobnRvaGwoY2UtPmNlX21vZGUpICYgU19JRk1UKSB7CisJCWNoYXIgKmJ1ZiwgKm5ldzsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJY2FzZSBTX0lGUkVHOgorCQluZXcgPSByZWFkX2Jsb2JfZW50cnkoY2UsIHBhdGgsICZzaXplKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHJlYWQgc2hhMSBmaWxlIG9mICVzICglcykiLAorCQkJCXBhdGgsIHNoYTFfdG9faGV4KGNlLT5zaGExKSk7CisJCWlmICh0b190ZW1wZmlsZSkgeworCQkJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwkJCWZkID0gbWtzdGVtcChwYXRoKTsKKwkJfSBlbHNlCisJCQlmZCA9IGNyZWF0ZV9maWxlKHBhdGgsIG50b2hsKGNlLT5jZV9tb2RlKSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWZyZWUobmV3KTsKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlIGZpbGUgJXMgKCVzKSIsCisJCQkJcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCisJCS8qCisJCSAqIENvbnZlcnQgZnJvbSBnaXQgaW50ZXJuYWwgZm9ybWF0IHRvIHdvcmtpbmcgdHJlZSBmb3JtYXQKKwkJICovCisJCWJ1ZiA9IGNvbnZlcnRfdG9fd29ya2luZ190cmVlKGNlLT5uYW1lLCBuZXcsICZzaXplKTsKKwkJaWYgKGJ1ZikgeworCQkJZnJlZShuZXcpOworCQkJbmV3ID0gYnVmOworCQl9CisKKwkJd3JvdGUgPSB3cml0ZV9pbl9mdWxsKGZkLCBuZXcsIHNpemUpOworCQljbG9zZShmZCk7CisJCWZyZWUobmV3KTsKKwkJaWYgKHdyb3RlICE9IHNpemUpCisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMiLCBwYXRoKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQluZXcgPSByZWFkX2Jsb2JfZW50cnkoY2UsIHBhdGgsICZzaXplKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHJlYWQgc2hhMSBmaWxlIG9mICVzICglcykiLAorCQkJCXBhdGgsIHNoYTFfdG9faGV4KGNlLT5zaGExKSk7CisJCWlmICh0b190ZW1wZmlsZSB8fCAhaGFzX3N5bWxpbmtzKSB7CisJCQlpZiAodG9fdGVtcGZpbGUpIHsKKwkJCQlzdHJjcHkocGF0aCwgIi5tZXJnZV9saW5rX1hYWFhYWCIpOworCQkJCWZkID0gbWtzdGVtcChwYXRoKTsKKwkJCX0gZWxzZQorCQkJCWZkID0gY3JlYXRlX2ZpbGUocGF0aCwgMDY2Nik7CisJCQlpZiAoZmQgPCAwKSB7CisJCQkJZnJlZShuZXcpOworCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlICIKKwkJCQkJCSAiZmlsZSAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCXdyb3RlID0gd3JpdGVfaW5fZnVsbChmZCwgbmV3LCBzaXplKTsKKwkJCWNsb3NlKGZkKTsKKwkJCWZyZWUobmV3KTsKKwkJCWlmICh3cm90ZSAhPSBzaXplKQorCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gd3JpdGUgZmlsZSAlcyIsCisJCQkJCXBhdGgpOworCQl9IGVsc2UgeworCQkJd3JvdGUgPSBzeW1saW5rKG5ldywgcGF0aCk7CisJCQlmcmVlKG5ldyk7CisJCQlpZiAod3JvdGUpCisJCQkJcmV0dXJuIGVycm9yKCJnaXQtY2hlY2tvdXQtaW5kZXg6IHVuYWJsZSB0byBjcmVhdGUgIgorCQkJCQkJICJzeW1saW5rICVzICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWJyZWFrOworCWNhc2UgU19JRkRJUkxOSzoKKwkJaWYgKHRvX3RlbXBmaWxlKQorCQkJcmV0dXJuIGVycm9yKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IHN1YnByb2plY3QgJXMiLCBwYXRoKTsKKwkJaWYgKG1rZGlyKHBhdGgsIDA3NzcpIDwgMCkKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiBjYW5ub3QgY3JlYXRlIHN1YnByb2plY3QgZGlyZWN0b3J5ICVzIiwgcGF0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmtub3duIGZpbGUgbW9kZSBmb3IgJXMiLCBwYXRoKTsKKwl9CisKKwlpZiAoc3RhdGUtPnJlZnJlc2hfY2FjaGUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpCit7CisJc3RhdGljIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdOworCXN0cnVjdCBzdGF0IHN0OworCWludCBsZW4gPSBzdGF0ZS0+YmFzZV9kaXJfbGVuOworCisJaWYgKHRvcGF0aCkKKwkJcmV0dXJuIHdyaXRlX2VudHJ5KGNlLCB0b3BhdGgsIHN0YXRlLCAxKTsKKworCW1lbWNweShwYXRoLCBzdGF0ZS0+YmFzZV9kaXIsIGxlbik7CisJc3RyY3B5KHBhdGggKyBsZW4sIGNlLT5uYW1lKTsKKworCWlmICghbHN0YXQocGF0aCwgJnN0KSkgeworCQl1bnNpZ25lZCBjaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAxKTsKKwkJaWYgKCFjaGFuZ2VkKQorCQkJcmV0dXJuIDA7CisJCWlmICghc3RhdGUtPmZvcmNlKSB7CisJCQlpZiAoIXN0YXRlLT5xdWlldCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgYWxyZWFkeSBleGlzdHNcbiIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogV2UgdW5saW5rIHRoZSBvbGQgZmlsZSwgdG8gZ2V0IHRoZSBuZXcgb25lIHdpdGggdGhlCisJCSAqIHJpZ2h0IHBlcm1pc3Npb25zIChpbmNsdWRpbmcgdW1hc2ssIHdoaWNoIGlzIG5hc3R5CisJCSAqIHRvIGVtdWxhdGUgYnkgaGFuZCAtIG11Y2ggZWFzaWVyIHRvIGxldCB0aGUgc3lzdGVtCisJCSAqIGp1c3QgZG8gdGhlIHJpZ2h0IHRoaW5nKQorCQkgKi8KKwkJdW5saW5rKHBhdGgpOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJLyogSWYgaXQgaXMgYSBnaXRsaW5rLCBsZWF2ZSBpdCBhbG9uZSEgKi8KKwkJCWlmIChTX0lTRElSTE5LKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIXN0YXRlLT5mb3JjZSkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzIGlzIGEgZGlyZWN0b3J5IiwgcGF0aCk7CisJCQlyZW1vdmVfc3VidHJlZShwYXRoKTsKKwkJfQorCX0gZWxzZSBpZiAoc3RhdGUtPm5vdF9uZXcpCisJCXJldHVybiAwOworCWNyZWF0ZV9kaXJlY3RvcmllcyhwYXRoLCBzdGF0ZSk7CisJcmV0dXJuIHdyaXRlX2VudHJ5KGNlLCBwYXRoLCBzdGF0ZSwgMCk7Cit9CmRpZmYgLS1naXQgYS9lbnZpcm9ubWVudC5jIGIvZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjMxNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIFdlIHB1dCBhbGwgdGhlIGdpdCBjb25maWcgdmFyaWFibGVzIGluIHRoaXMgc2FtZSBvYmplY3QKKyAqIGZpbGUsIHNvIHRoYXQgcHJvZ3JhbXMgY2FuIGxpbmsgYWdhaW5zdCB0aGUgY29uZmlnIHBhcnNlcgorICogd2l0aG91dCBoYXZpbmcgdG8gbGluayBhZ2FpbnN0IGFsbCB0aGUgcmVzdCBvZiBnaXQuCisgKgorICogSW4gcGFydGljdWxhciwgbm8gbmVlZCB0byBicmluZyBpbiBsaWJ6IGV0YyB1bmxlc3MgbmVlZGVkLAorICogZXZlbiBpZiB5b3UgbWlnaHQgd2FudCB0byBrbm93IHdoZXJlIHRoZSBnaXQgZGlyZWN0b3J5IGV0YworICogYXJlLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworY2hhciBnaXRfZGVmYXVsdF9lbWFpbFtNQVhfR0lUTkFNRV07CitjaGFyIGdpdF9kZWZhdWx0X25hbWVbTUFYX0dJVE5BTUVdOworaW50IHVzZV9sZWdhY3lfaGVhZGVycyA9IDE7CitpbnQgdHJ1c3RfZXhlY3V0YWJsZV9iaXQgPSAxOworaW50IGhhc19zeW1saW5rcyA9IDE7CitpbnQgYXNzdW1lX3VuY2hhbmdlZDsKK2ludCBwcmVmZXJfc3ltbGlua19yZWZzOworaW50IGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgPSAtMTsgLyogdW5zcGVjaWZpZWQgKi8KK2ludCBsb2dfYWxsX3JlZl91cGRhdGVzID0gLTE7IC8qIHVuc3BlY2lmaWVkICovCitpbnQgd2Fybl9hbWJpZ3VvdXNfcmVmcyA9IDE7CitpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbjsKK2NvbnN0IGNoYXIgKmdpdF9jb21taXRfZW5jb2Rpbmc7Citjb25zdCBjaGFyICpnaXRfbG9nX291dHB1dF9lbmNvZGluZzsKK2ludCBzaGFyZWRfcmVwb3NpdG9yeSA9IFBFUk1fVU1BU0s7Citjb25zdCBjaGFyICphcHBseV9kZWZhdWx0X3doaXRlc3BhY2U7CitpbnQgemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKK3NpemVfdCBwYWNrZWRfZ2l0X3dpbmRvd19zaXplID0gREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFOworc2l6ZV90IHBhY2tlZF9naXRfbGltaXQgPSBERUZBVUxUX1BBQ0tFRF9HSVRfTElNSVQ7CitzaXplX3QgZGVsdGFfYmFzZV9jYWNoZV9saW1pdCA9IDE2ICogMTAyNCAqIDEwMjQ7CitpbnQgcGFnZXJfaW5fdXNlOworaW50IHBhZ2VyX3VzZV9jb2xvciA9IDE7CitpbnQgYXV0b19jcmxmID0gMDsJLyogMTogYm90aCB3YXlzLCAtMTogb25seSB3aGVuIGFkZGluZyBnaXQgb2JqZWN0cyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZ2l0X2RpcjsKK3N0YXRpYyBjaGFyICpnaXRfb2JqZWN0X2RpciwgKmdpdF9pbmRleF9maWxlLCAqZ2l0X3JlZnNfZGlyLCAqZ2l0X2dyYWZ0X2ZpbGU7CisKK3N0YXRpYyB2b2lkIHNldHVwX2dpdF9lbnYodm9pZCkKK3sKKwlnaXRfZGlyID0gZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCWlmICghZ2l0X2RpcikKKwkJZ2l0X2RpciA9IERFRkFVTFRfR0lUX0RJUl9FTlZJUk9OTUVOVDsKKwlnaXRfb2JqZWN0X2RpciA9IGdldGVudihEQl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfb2JqZWN0X2RpcikgeworCQlnaXRfb2JqZWN0X2RpciA9IHhtYWxsb2Moc3RybGVuKGdpdF9kaXIpICsgOSk7CisJCXNwcmludGYoZ2l0X29iamVjdF9kaXIsICIlcy9vYmplY3RzIiwgZ2l0X2Rpcik7CisJfQorCWdpdF9yZWZzX2RpciA9IHhtYWxsb2Moc3RybGVuKGdpdF9kaXIpICsgNik7CisJc3ByaW50ZihnaXRfcmVmc19kaXIsICIlcy9yZWZzIiwgZ2l0X2Rpcik7CisJZ2l0X2luZGV4X2ZpbGUgPSBnZXRlbnYoSU5ERVhfRU5WSVJPTk1FTlQpOworCWlmICghZ2l0X2luZGV4X2ZpbGUpIHsKKwkJZ2l0X2luZGV4X2ZpbGUgPSB4bWFsbG9jKHN0cmxlbihnaXRfZGlyKSArIDcpOworCQlzcHJpbnRmKGdpdF9pbmRleF9maWxlLCAiJXMvaW5kZXgiLCBnaXRfZGlyKTsKKwl9CisJZ2l0X2dyYWZ0X2ZpbGUgPSBnZXRlbnYoR1JBRlRfRU5WSVJPTk1FTlQpOworCWlmICghZ2l0X2dyYWZ0X2ZpbGUpCisJCWdpdF9ncmFmdF9maWxlID0geHN0cmR1cChnaXRfcGF0aCgiaW5mby9ncmFmdHMiKSk7Cit9CisKK2ludCBpc19iYXJlX3JlcG9zaXRvcnkodm9pZCkKK3sKKwljb25zdCBjaGFyICpkaXIsICpzOworCWlmICgwIDw9IGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcpCisJCXJldHVybiBpc19iYXJlX3JlcG9zaXRvcnlfY2ZnOworCisJZGlyID0gZ2V0X2dpdF9kaXIoKTsKKwlpZiAoIXN0cmNtcChkaXIsIERFRkFVTFRfR0lUX0RJUl9FTlZJUk9OTUVOVCkpCisJCXJldHVybiAwOworCXMgPSBzdHJyY2hyKGRpciwgJy8nKTsKKwlyZXR1cm4gIXMgfHwgc3RyY21wKHMgKyAxLCBERUZBVUxUX0dJVF9ESVJfRU5WSVJPTk1FTlQpOworfQorCitjb25zdCBjaGFyICpnZXRfZ2l0X2Rpcih2b2lkKQoreworCWlmICghZ2l0X2RpcikKKwkJc2V0dXBfZ2l0X2VudigpOworCXJldHVybiBnaXRfZGlyOworfQorCitjaGFyICpnZXRfb2JqZWN0X2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X29iamVjdF9kaXIpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X29iamVjdF9kaXI7Cit9CisKK2NoYXIgKmdldF9yZWZzX2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X3JlZnNfZGlyKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9yZWZzX2RpcjsKK30KKworY2hhciAqZ2V0X2luZGV4X2ZpbGUodm9pZCkKK3sKKwlpZiAoIWdpdF9pbmRleF9maWxlKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9pbmRleF9maWxlOworfQorCitjaGFyICpnZXRfZ3JhZnRfZmlsZSh2b2lkKQoreworCWlmICghZ2l0X2dyYWZ0X2ZpbGUpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X2dyYWZ0X2ZpbGU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZXhlY19jbWQuYyBiL2V4ZWNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3NGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4ZWNfY21kLmMKQEAgLTAsMCArMSwxMzUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNkZWZpbmUgTUFYX0FSR1MJMzIKKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworc3RhdGljIGNvbnN0IGNoYXIgKmJ1aWx0aW5fZXhlY19wYXRoID0gR0lUX0VYRUNfUEFUSDsKK3N0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2V4ZWNfcGF0aDsKKwordm9pZCBnaXRfc2V0X2V4ZWNfcGF0aChjb25zdCBjaGFyICpleGVjX3BhdGgpCit7CisJY3VycmVudF9leGVjX3BhdGggPSBleGVjX3BhdGg7Cit9CisKKworLyogUmV0dXJucyB0aGUgaGlnaGVzdC1wcmlvcml0eSwgbG9jYXRpb24gdG8gbG9vayBmb3IgZ2l0IHByb2dyYW1zLiAqLworY29uc3QgY2hhciAqZ2l0X2V4ZWNfcGF0aCh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChjdXJyZW50X2V4ZWNfcGF0aCkKKwkJcmV0dXJuIGN1cnJlbnRfZXhlY19wYXRoOworCisJZW52ID0gZ2V0ZW52KEVYRUNfUEFUSF9FTlZJUk9OTUVOVCk7CisJaWYgKGVudiAmJiAqZW52KSB7CisJCXJldHVybiBlbnY7CisJfQorCisJcmV0dXJuIGJ1aWx0aW5fZXhlY19wYXRoOworfQorCisKK2ludCBleGVjdl9naXRfY21kKGNvbnN0IGNoYXIgKiphcmd2KQoreworCWNoYXIgZ2l0X2NvbW1hbmRbUEFUSF9NQVggKyAxXTsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpwYXRoc1tdID0geyBjdXJyZW50X2V4ZWNfcGF0aCwKKwkJCQlnZXRlbnYoRVhFQ19QQVRIX0VOVklST05NRU5UKSwKKwkJCQlidWlsdGluX2V4ZWNfcGF0aCB9OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0aHMpOyArK2kpIHsKKwkJc2l6ZV90IGxlbjsKKwkJaW50IHJjOworCQljb25zdCBjaGFyICpleGVjX2RpciA9IHBhdGhzW2ldOworCQljb25zdCBjaGFyICp0bXA7CisKKwkJaWYgKCFleGVjX2RpciB8fCAhKmV4ZWNfZGlyKSBjb250aW51ZTsKKworCQlpZiAoKmV4ZWNfZGlyICE9ICcvJykgeworCQkJaWYgKCFnZXRjd2QoZ2l0X2NvbW1hbmQsIHNpemVvZihnaXRfY29tbWFuZCkpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJnaXQ6IGNhbm5vdCBkZXRlcm1pbmUgIgorCQkJCQkiY3VycmVudCBkaXJlY3Rvcnk6ICVzXG4iLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gc3RybGVuKGdpdF9jb21tYW5kKTsKKworCQkJLyogVHJpdmlhbCBjbGVhbnVwICovCisJCQl3aGlsZSAoIXByZWZpeGNtcChleGVjX2RpciwgIi4vIikpIHsKKwkJCQlleGVjX2RpciArPSAyOworCQkJCXdoaWxlICgqZXhlY19kaXIgPT0gJy8nKQorCQkJCQlleGVjX2RpcisrOworCQkJfQorCisJCQlyYyA9IHNucHJpbnRmKGdpdF9jb21tYW5kICsgbGVuLAorCQkJCSAgICAgIHNpemVvZihnaXRfY29tbWFuZCkgLSBsZW4sICIvJXMiLAorCQkJCSAgICAgIGV4ZWNfZGlyKTsKKwkJCWlmIChyYyA8IDAgfHwgcmMgPj0gc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBjb21tYW5kIG5hbWUgZ2l2ZW4gIgorCQkJCQkiaXMgdG9vIGxvbmcuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJsZW4oZXhlY19kaXIpICsgMSA+IHNpemVvZihnaXRfY29tbWFuZCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdDogY29tbWFuZCBuYW1lIGdpdmVuICIKKwkJCQkJImlzIHRvbyBsb25nLlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzdHJjcHkoZ2l0X2NvbW1hbmQsIGV4ZWNfZGlyKTsKKwkJfQorCisJCWxlbiA9IHN0cmxlbihnaXRfY29tbWFuZCk7CisJCXJjID0gc25wcmludGYoZ2l0X2NvbW1hbmQgKyBsZW4sIHNpemVvZihnaXRfY29tbWFuZCkgLSBsZW4sCisJCQkgICAgICAiL2dpdC0lcyIsIGFyZ3ZbMF0pOworCQlpZiAocmMgPCAwIHx8IHJjID49IHNpemVvZihnaXRfY29tbWFuZCkgLSBsZW4pIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJnaXQ6IGNvbW1hbmQgbmFtZSBnaXZlbiBpcyB0b28gbG9uZy5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBhcmd2WzBdIG11c3QgYmUgdGhlIGdpdCBjb21tYW5kLCBidXQgdGhlIGFyZ3YgYXJyYXkKKwkJICogYmVsb25ncyB0byB0aGUgY2FsbGVyLCBhbmQgbXkgYmUgcmV1c2VkIGluCisJCSAqIHN1YnNlcXVlbnQgbG9vcCBpdGVyYXRpb25zLiBTYXZlIGFyZ3ZbMF0gYW5kCisJCSAqIHJlc3RvcmUgaXQgb24gZXJyb3IuCisJCSAqLworCisJCXRtcCA9IGFyZ3ZbMF07CisJCWFyZ3ZbMF0gPSBnaXRfY29tbWFuZDsKKworCQl0cmFjZV9hcmd2X3ByaW50Zihhcmd2LCAtMSwgInRyYWNlOiBleGVjOiIpOworCisJCS8qIGV4ZWN2ZSgpIGNhbiBvbmx5IGV2ZXIgcmV0dXJuIGlmIGl0IGZhaWxzICovCisJCWV4ZWN2ZShnaXRfY29tbWFuZCwgKGNoYXIgKiopYXJndiwgZW52aXJvbik7CisKKwkJdHJhY2VfcHJpbnRmKCJ0cmFjZTogZXhlYyBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCisJCWFyZ3ZbMF0gPSB0bXA7CisJfQorCXJldHVybiAtMTsKKworfQorCisKK2ludCBleGVjbF9naXRfY21kKGNvbnN0IGNoYXIgKmNtZCwuLi4pCit7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltNQVhfQVJHUyArIDFdOworCWNvbnN0IGNoYXIgKmFyZzsKKwl2YV9saXN0IHBhcmFtOworCisJdmFfc3RhcnQocGFyYW0sIGNtZCk7CisJYXJndlswXSA9IGNtZDsKKwlhcmdjID0gMTsKKwl3aGlsZSAoYXJnYyA8IE1BWF9BUkdTKSB7CisJCWFyZyA9IGFyZ3ZbYXJnYysrXSA9IHZhX2FyZyhwYXJhbSwgY2hhciAqKTsKKwkJaWYgKCFhcmcpCisJCQlicmVhazsKKwl9CisJdmFfZW5kKHBhcmFtKTsKKwlpZiAoTUFYX0FSR1MgPD0gYXJnYykKKwkJcmV0dXJuIGVycm9yKCJ0b28gbWFueSBhcmdzIHRvIHJ1biAlcyIsIGNtZCk7CisKKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlyZXR1cm4gZXhlY3ZfZ2l0X2NtZChhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2V4ZWNfY21kLmggYi9leGVjX2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OWE4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9leGVjX2NtZC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgR0lUX0VYRUNfQ01EX0gKKyNkZWZpbmUgR0lUX0VYRUNfQ01EX0gKKworZXh0ZXJuIHZvaWQgZ2l0X3NldF9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKTsKK2V4dGVybiBjb25zdCBjaGFyKiBnaXRfZXhlY19wYXRoKHZvaWQpOworZXh0ZXJuIGludCBleGVjdl9naXRfY21kKGNvbnN0IGNoYXIgKiphcmd2KTsgLyogTlVMTCB0ZXJtaW5hdGVkICovCitleHRlcm4gaW50IGV4ZWNsX2dpdF9jbWQoY29uc3QgY2hhciAqY21kLCAuLi4pOworCisKKyNlbmRpZiAvKiBHSVRfRVhFQ19DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZmFzdC1pbXBvcnQuYyBiL2Zhc3QtaW1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1NTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2Zhc3QtaW1wb3J0LmMKQEAgLTAsMCArMSwyMTI4IEBACisvKgorRm9ybWF0IG9mIFNURElOIHN0cmVhbToKKworICBzdHJlYW0gOjo9IGNtZCo7CisKKyAgY21kIDo6PSBuZXdfYmxvYgorICAgICAgICB8IG5ld19jb21taXQKKyAgICAgICAgfCBuZXdfdGFnCisgICAgICAgIHwgcmVzZXRfYnJhbmNoCisgICAgICAgIHwgY2hlY2twb2ludAorICAgICAgICA7CisKKyAgbmV3X2Jsb2IgOjo9ICdibG9iJyBsZgorCW1hcms/CisgICAgZmlsZV9jb250ZW50OworICBmaWxlX2NvbnRlbnQgOjo9IGRhdGE7CisKKyAgbmV3X2NvbW1pdCA6Oj0gJ2NvbW1pdCcgc3AgcmVmX3N0ciBsZgorICAgIG1hcms/CisgICAgKCdhdXRob3InIHNwIG5hbWUgJzwnIGVtYWlsICc+JyB3aGVuIGxmKT8KKyAgICAnY29tbWl0dGVyJyBzcCBuYW1lICc8JyBlbWFpbCAnPicgd2hlbiBsZgorICAgIGNvbW1pdF9tc2cKKyAgICAoJ2Zyb20nIHNwIChyZWZfc3RyIHwgaGV4c2hhMSB8IHNoYTFleHBfc3RyIHwgaWRudW0pIGxmKT8KKyAgICAoJ21lcmdlJyBzcCAocmVmX3N0ciB8IGhleHNoYTEgfCBzaGExZXhwX3N0ciB8IGlkbnVtKSBsZikqCisgICAgZmlsZV9jaGFuZ2UqCisgICAgbGY7CisgIGNvbW1pdF9tc2cgOjo9IGRhdGE7CisKKyAgZmlsZV9jaGFuZ2UgOjo9IGZpbGVfY2xyIHwgZmlsZV9kZWwgfCBmaWxlX29ibSB8IGZpbGVfaW5tOworICBmaWxlX2NsciA6Oj0gJ2RlbGV0ZWFsbCcgbGY7CisgIGZpbGVfZGVsIDo6PSAnRCcgc3AgcGF0aF9zdHIgbGY7CisgIGZpbGVfb2JtIDo6PSAnTScgc3AgbW9kZSBzcCAoaGV4c2hhMSB8IGlkbnVtKSBzcCBwYXRoX3N0ciBsZjsKKyAgZmlsZV9pbm0gOjo9ICdNJyBzcCBtb2RlIHNwICdpbmxpbmUnIHNwIHBhdGhfc3RyIGxmCisgICAgZGF0YTsKKworICBuZXdfdGFnIDo6PSAndGFnJyBzcCB0YWdfc3RyIGxmCisgICAgJ2Zyb20nIHNwIChyZWZfc3RyIHwgaGV4c2hhMSB8IHNoYTFleHBfc3RyIHwgaWRudW0pIGxmCisJJ3RhZ2dlcicgc3AgbmFtZSAnPCcgZW1haWwgJz4nIHdoZW4gbGYKKyAgICB0YWdfbXNnOworICB0YWdfbXNnIDo6PSBkYXRhOworCisgIHJlc2V0X2JyYW5jaCA6Oj0gJ3Jlc2V0JyBzcCByZWZfc3RyIGxmCisgICAgKCdmcm9tJyBzcCAocmVmX3N0ciB8IGhleHNoYTEgfCBzaGExZXhwX3N0ciB8IGlkbnVtKSBsZik/CisgICAgbGY7CisKKyAgY2hlY2twb2ludCA6Oj0gJ2NoZWNrcG9pbnQnIGxmCisgICAgbGY7CisKKyAgICAgIyBub3RlOiB0aGUgZmlyc3QgaWRudW0gaW4gYSBzdHJlYW0gc2hvdWxkIGJlIDEgYW5kIHN1YnNlcXVlbnQKKyAgICAgIyBpZG51bXMgc2hvdWxkIG5vdCBoYXZlIGdhcHMgYmV0d2VlbiB2YWx1ZXMgYXMgdGhpcyB3aWxsIGNhdXNlCisgICAgICMgdGhlIHN0cmVhbSBwYXJzZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGdhcHBlZCB2YWx1ZXMuICBBbgorCSAjIGlkbnVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBmdXR1cmUgdG8gYSBuZXcgb2JqZWN0IGJ5IGlzc3VpbmcKKyAgICAgIyBhIG5ldyBtYXJrIGRpcmVjdGl2ZSB3aXRoIHRoZSBvbGQgaWRudW0uCisJICMKKyAgbWFyayA6Oj0gJ21hcmsnIHNwIGlkbnVtIGxmOworICBkYXRhIDo6PSAoZGVsaW1pdGVkX2RhdGEgfCBleGFjdF9kYXRhKQorICAgIGxmOworCisgICAgIyBub3RlOiBkZWxpbSBtYXkgYmUgYW55IHN0cmluZyBidXQgbXVzdCBub3QgY29udGFpbiBsZi4KKyAgICAjIGRhdGFfbGluZSBtYXkgY29udGFpbiBhbnkgZGF0YSBidXQgbXVzdCBub3QgYmUgZXhhY3RseQorICAgICMgZGVsaW0uCisgIGRlbGltaXRlZF9kYXRhIDo6PSAnZGF0YScgc3AgJzw8JyBkZWxpbSBsZgorICAgIChkYXRhX2xpbmUgbGYpKgorCWRlbGltIGxmOworCisgICAgICMgbm90ZTogZGVjbGVuIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIGJpbmFyeV9kYXRhIGluIGJ5dGVzLgorICAgICAjIGRlY2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsZiBwcmVjZWVkaW5nIHRoZSBiaW5hcnkgZGF0YS4KKyAgICAgIworICBleGFjdF9kYXRhIDo6PSAnZGF0YScgc3AgZGVjbGVuIGxmCisgICAgYmluYXJ5X2RhdGE7CisKKyAgICAgIyBub3RlOiBxdW90ZWQgc3RyaW5ncyBhcmUgQy1zdHlsZSBxdW90aW5nIHN1cHBvcnRpbmcgXGMgZm9yCisgICAgICMgY29tbW9uIGVzY2FwZXMgb2YgJ2MnIChlLi5nIFxuLCBcdCwgXFwsIFwiKSBvciBcbm5uIHdoZXJlIG5ubgorCSAjIGlzIHRoZSBzaWduZWQgYnl0ZSB2YWx1ZSBpbiBvY3RhbC4gIE5vdGUgdGhhdCB0aGUgb25seQorICAgICAjIGNoYXJhY3RlcnMgd2hpY2ggbXVzdCBhY3R1YWxseSBiZSBlc2NhcGVkIHRvIHByb3RlY3QgdGhlCisgICAgICMgc3RyZWFtIGZvcm1hdHRpbmcgaXM6IFwsICIgYW5kIExGLiAgT3RoZXJ3aXNlIHRoZXNlIHZhbHVlcworCSAjIGFyZSBVVEY4LgorICAgICAjCisgIHJlZl9zdHIgICAgIDo6PSByZWY7CisgIHNoYTFleHBfc3RyIDo6PSBzaGExZXhwOworICB0YWdfc3RyICAgICA6Oj0gdGFnOworICBwYXRoX3N0ciAgICA6Oj0gcGF0aCAgICB8ICciJyBxdW90ZWQocGF0aCkgICAgJyInIDsKKyAgbW9kZSAgICAgICAgOjo9ICcxMDA2NDQnIHwgJzY0NCcKKyAgICAgICAgICAgICAgICB8ICcxMDA3NTUnIHwgJzc1NScKKyAgICAgICAgICAgICAgICB8ICcxMjAwMDAnCisgICAgICAgICAgICAgICAgOworCisgIGRlY2xlbiA6Oj0gIyB1bnNpZ25lZCAzMiBiaXQgdmFsdWUsIGFzY2lpIGJhc2UxMCBub3RhdGlvbjsKKyAgYmlnaW50IDo6PSAjIHVuc2lnbmVkIGludGVnZXIgdmFsdWUsIGFzY2lpIGJhc2UxMCBub3RhdGlvbjsKKyAgYmluYXJ5X2RhdGEgOjo9ICMgZmlsZSBjb250ZW50LCBub3QgaW50ZXJwcmV0ZWQ7CisKKyAgd2hlbiAgICAgICAgIDo6PSByYXdfd2hlbiB8IHJmYzI4MjJfd2hlbjsKKyAgcmF3X3doZW4gICAgIDo6PSB0cyBzcCB0ejsKKyAgcmZjMjgyMl93aGVuIDo6PSAjIFZhbGlkIFJGQyAyODIyIGRhdGUgYW5kIHRpbWU7CisKKyAgc3AgOjo9ICMgQVNDSUkgc3BhY2UgY2hhcmFjdGVyOworICBsZiA6Oj0gIyBBU0NJSSBuZXdsaW5lIChMRikgY2hhcmFjdGVyOworCisgICAgICMgbm90ZTogYSBjb2xvbiAoJzonKSBtdXN0IHByZWNlZGUgdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NpZ25lZCB0bworCSAjIGFuIGlkbnVtLiAgVGhpcyBpcyB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGEgcmVmIG9yIHRhZyBuYW1lIGFzCisgICAgICMgR0lUIGRvZXMgbm90IHBlcm1pdCAnOicgaW4gcmVmIG9yIHRhZyBzdHJpbmdzLgorCSAjCisgIGlkbnVtICAgOjo9ICc6JyBiaWdpbnQ7CisgIHBhdGggICAgOjo9ICMgR0lUIHN0eWxlIGZpbGUgcGF0aCwgZS5nLiAiYS9iL2MiOworICByZWYgICAgIDo6PSAjIEdJVCByZWYgbmFtZSwgZS5nLiAicmVmcy9oZWFkcy9NT1pfR0VDS09fRVhQRVJJTUVOVCI7CisgIHRhZyAgICAgOjo9ICMgR0lUIHRhZyBuYW1lLCBlLmcuICJGSVJFRk9YXzFfNSI7CisgIHNoYTFleHAgOjo9ICMgQW55IHZhbGlkIEdJVCBTSEExIGV4cHJlc3Npb247CisgIGhleHNoYTEgOjo9ICMgU0hBMSBpbiBoZXhhZGVjaW1hbCBmb3JtYXQ7CisKKyAgICAgIyBub3RlOiBuYW1lIGFuZCBlbWFpbCBhcmUgVVRGOCBzdHJpbmdzLCBob3dldmVyIG5hbWUgbXVzdCBub3QKKwkgIyBjb250YWluICc8JyBvciBsZiBhbmQgZW1haWwgbXVzdCBub3QgY29udGFpbiBhbnkgb2YgdGhlCisgICAgICMgZm9sbG93aW5nOiAnPCcsICc+JywgbGYuCisJICMKKyAgbmFtZSAgOjo9ICMgdmFsaWQgR0lUIGF1dGhvci9jb21taXR0ZXIgbmFtZTsKKyAgZW1haWwgOjo9ICMgdmFsaWQgR0lUIGF1dGhvci9jb21taXR0ZXIgZW1haWw7CisgIHRzICAgIDo6PSAjIHRpbWUgc2luY2UgdGhlIGVwb2NoIGluIHNlY29uZHMsIGFzY2lpIGJhc2UxMCBub3RhdGlvbjsKKyAgdHogICAgOjo9ICMgR0lUIHN0eWxlIHRpbWV6b25lOworKi8KKworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImNzdW0tZmlsZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisKKyNkZWZpbmUgUEFDS19JRF9CSVRTIDE2CisjZGVmaW5lIE1BWF9QQUNLX0lEICgoMTw8UEFDS19JRF9CSVRTKS0xKQorCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5Cit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqbmV4dDsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdW5zaWduZWQgdHlwZSA6IFRZUEVfQklUUzsKKwl1bnNpZ25lZCBwYWNrX2lkIDogUEFDS19JRF9CSVRTOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKm5leHRfcG9vbDsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpuZXh0X2ZyZWU7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZW5kOworCXN0cnVjdCBvYmplY3RfZW50cnkgZW50cmllc1tGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IG1hcmtfc2V0Cit7CisJdW5pb24geworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICptYXJrZWRbMTAyNF07CisJCXN0cnVjdCBtYXJrX3NldCAqc2V0c1sxMDI0XTsKKwl9IGRhdGE7CisJdW5zaWduZWQgaW50IHNoaWZ0OworfTsKKworc3RydWN0IGxhc3Rfb2JqZWN0Cit7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoOworCXVuc2lnbmVkIG5vX2ZyZWU6MTsKK307CisKK3N0cnVjdCBtZW1fcG9vbAoreworCXN0cnVjdCBtZW1fcG9vbCAqbmV4dF9wb29sOworCWNoYXIgKm5leHRfZnJlZTsKKwljaGFyICplbmQ7CisJY2hhciBzcGFjZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IGF0b21fc3RyCit7CisJc3RydWN0IGF0b21fc3RyICpuZXh0X2F0b207CisJdW5zaWduZWQgc2hvcnQgc3RyX2xlbjsKKwljaGFyIHN0cl9kYXRbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCB0cmVlX2NvbnRlbnQ7CitzdHJ1Y3QgdHJlZV9lbnRyeQoreworCXN0cnVjdCB0cmVlX2NvbnRlbnQgKnRyZWU7CisJc3RydWN0IGF0b21fc3RyKiBuYW1lOworCXN0cnVjdCB0cmVlX2VudHJ5X21zCisJeworCQl1aW50MTZfdCBtb2RlOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCX0gdmVyc2lvbnNbMl07Cit9OworCitzdHJ1Y3QgdHJlZV9jb250ZW50Cit7CisJdW5zaWduZWQgaW50IGVudHJ5X2NhcGFjaXR5OyAvKiBtdXN0IG1hdGNoIGF2YWlsX3RyZWVfY29udGVudCAqLworCXVuc2lnbmVkIGludCBlbnRyeV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgZGVsdGFfZGVwdGg7CisJc3RydWN0IHRyZWVfZW50cnkgKmVudHJpZXNbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQKK3sKKwl1bnNpZ25lZCBpbnQgZW50cnlfY2FwYWNpdHk7IC8qIG11c3QgbWF0Y2ggdHJlZV9jb250ZW50ICovCisJc3RydWN0IGF2YWlsX3RyZWVfY29udGVudCAqbmV4dF9hdmFpbDsKK307CisKK3N0cnVjdCBicmFuY2gKK3sKKwlzdHJ1Y3QgYnJhbmNoICp0YWJsZV9uZXh0X2JyYW5jaDsKKwlzdHJ1Y3QgYnJhbmNoICphY3RpdmVfbmV4dF9icmFuY2g7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSBicmFuY2hfdHJlZTsKKwl1aW50bWF4X3QgbGFzdF9jb21taXQ7CisJdW5zaWduZWQgYWN0aXZlIDogMTsKKwl1bnNpZ25lZCBwYWNrX2lkIDogUEFDS19JRF9CSVRTOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdHJ1Y3QgdGFnCit7CisJc3RydWN0IHRhZyAqbmV4dF90YWc7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgcGFja19pZDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKworc3RydWN0IGRidWYKK3sKKwl2b2lkICpidWZmZXI7CisJc2l6ZV90IGNhcGFjaXR5OworfTsKKworc3RydWN0IGhhc2hfbGlzdAoreworCXN0cnVjdCBoYXNoX2xpc3QgKm5leHQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJV0hFTlNQRUNfUkFXID0gMSwKKwlXSEVOU1BFQ19SRkMyODIyLAorCVdIRU5TUEVDX05PVywKK30gd2hlbnNwZWNfdHlwZTsKKworLyogQ29uZmlndXJlZCBsaW1pdHMgb24gb3V0cHV0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZGVwdGggPSAxMDsKK3N0YXRpYyBvZmZfdCBtYXhfcGFja3NpemUgPSAoMUxMIDw8IDMyKSAtIDE7CitzdGF0aWMgaW50IGZvcmNlX3VwZGF0ZTsKKworLyogU3RhdHMgYW5kIG1pc2MuIGNvdW50ZXJzICovCitzdGF0aWMgdWludG1heF90IGFsbG9jX2NvdW50Oworc3RhdGljIHVpbnRtYXhfdCBtYXJrc19zZXRfY291bnQ7CitzdGF0aWMgdWludG1heF90IG9iamVjdF9jb3VudF9ieV90eXBlWzEgPDwgVFlQRV9CSVRTXTsKK3N0YXRpYyB1aW50bWF4X3QgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbMSA8PCBUWVBFX0JJVFNdOworc3RhdGljIHVpbnRtYXhfdCBkZWx0YV9jb3VudF9ieV90eXBlWzEgPDwgVFlQRV9CSVRTXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9iamVjdF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJyYW5jaF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJyYW5jaF9sb2FkX2NvdW50Oworc3RhdGljIGludCBmYWlsdXJlOworc3RhdGljIEZJTEUgKnBhY2tfZWRnZXM7CisKKy8qIE1lbW9yeSBwb29scyAqLworc3RhdGljIHNpemVfdCBtZW1fcG9vbF9hbGxvYyA9IDIqMTAyNCoxMDI0IC0gc2l6ZW9mKHN0cnVjdCBtZW1fcG9vbCk7CitzdGF0aWMgc2l6ZV90IHRvdGFsX2FsbG9jZDsKK3N0YXRpYyBzdHJ1Y3QgbWVtX3Bvb2wgKm1lbV9wb29sOworCisvKiBBdG9tIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRvbV90YWJsZV9zeiA9IDQ0NTE7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0b21fY250Oworc3RhdGljIHN0cnVjdCBhdG9tX3N0ciAqKmF0b21fdGFibGU7CisKKy8qIFRoZSAucGFjayBmaWxlIGJlaW5nIGdlbmVyYXRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrX2lkOworc3RhdGljIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrX2RhdGE7CitzdGF0aWMgc3RydWN0IHBhY2tlZF9naXQgKiphbGxfcGFja3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWNrX3NpemU7CisKKy8qIFRhYmxlIG9mIG9iamVjdHMgd2UndmUgd3JpdHRlbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2JqZWN0X2VudHJ5X2FsbG9jID0gNTAwMDsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKmJsb2NrczsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmplY3RfdGFibGVbMSA8PCAxNl07CitzdGF0aWMgc3RydWN0IG1hcmtfc2V0ICptYXJrczsKK3N0YXRpYyBjb25zdCBjaGFyKiBtYXJrX2ZpbGU7CisKKy8qIE91ciBsYXN0IGJsb2IgKi8KK3N0YXRpYyBzdHJ1Y3QgbGFzdF9vYmplY3QgbGFzdF9ibG9iOworCisvKiBUcmVlIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJlZV9lbnRyeV9hbGxvYyA9IDEwMDA7CitzdGF0aWMgdm9pZCAqYXZhaWxfdHJlZV9lbnRyeTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXZhaWxfdHJlZV90YWJsZV9zeiA9IDEwMDsKK3N0YXRpYyBzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50ICoqYXZhaWxfdHJlZV90YWJsZTsKK3N0YXRpYyBzdHJ1Y3QgZGJ1ZiBvbGRfdHJlZTsKK3N0YXRpYyBzdHJ1Y3QgZGJ1ZiBuZXdfdHJlZTsKKworLyogQnJhbmNoIGRhdGEgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9hY3RpdmVfYnJhbmNoZXMgPSA1Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX2FjdGl2ZV9icmFuY2hlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJyYW5jaF90YWJsZV9zeiA9IDEwMzk7CitzdGF0aWMgc3RydWN0IGJyYW5jaCAqKmJyYW5jaF90YWJsZTsKK3N0YXRpYyBzdHJ1Y3QgYnJhbmNoICphY3RpdmVfYnJhbmNoZXM7CisKKy8qIFRhZyBkYXRhICovCitzdGF0aWMgc3RydWN0IHRhZyAqZmlyc3RfdGFnOworc3RhdGljIHN0cnVjdCB0YWcgKmxhc3RfdGFnOworCisvKiBJbnB1dCBzdHJlYW0gcGFyc2luZyAqLworc3RhdGljIHdoZW5zcGVjX3R5cGUgd2hlbnNwZWMgPSBXSEVOU1BFQ19SQVc7CitzdGF0aWMgc3RydWN0IHN0cmJ1ZiBjb21tYW5kX2J1ZjsKK3N0YXRpYyB1aW50bWF4X3QgbmV4dF9tYXJrOworc3RhdGljIHN0cnVjdCBkYnVmIG5ld19kYXRhOworCisKK3N0YXRpYyB2b2lkIGFsbG9jX29iamVjdHModW5zaWduZWQgaW50IGNudCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKmI7CisKKwliID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeV9wb29sKQorCQkrIGNudCAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSk7CisJYi0+bmV4dF9wb29sID0gYmxvY2tzOworCWItPm5leHRfZnJlZSA9IGItPmVudHJpZXM7CisJYi0+ZW5kID0gYi0+ZW50cmllcyArIGNudDsKKwlibG9ja3MgPSBiOworCWFsbG9jX2NvdW50ICs9IGNudDsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKm5ld19vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplOworCisJaWYgKGJsb2Nrcy0+bmV4dF9mcmVlID09IGJsb2Nrcy0+ZW5kKQorCQlhbGxvY19vYmplY3RzKG9iamVjdF9lbnRyeV9hbGxvYyk7CisKKwllID0gYmxvY2tzLT5uZXh0X2ZyZWUrKzsKKwloYXNoY3B5KGUtPnNoYTEsIHNoYTEpOworCXJldHVybiBlOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqZmluZF9vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBpbnQgaCA9IHNoYTFbMF0gPDwgOCB8IHNoYTFbMV07CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZTsKKwlmb3IgKGUgPSBvYmplY3RfdGFibGVbaF07IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoIWhhc2hjbXAoc2hhMSwgZS0+c2hhMSkpCisJCQlyZXR1cm4gZTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKmluc2VydF9vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBpbnQgaCA9IHNoYTFbMF0gPDwgOCB8IHNoYTFbMV07CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZSA9IG9iamVjdF90YWJsZVtoXTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpwID0gTlVMTDsKKworCXdoaWxlIChlKSB7CisJCWlmICghaGFzaGNtcChzaGExLCBlLT5zaGExKSkKKwkJCXJldHVybiBlOworCQlwID0gZTsKKwkJZSA9IGUtPm5leHQ7CisJfQorCisJZSA9IG5ld19vYmplY3Qoc2hhMSk7CisJZS0+bmV4dCA9IE5VTEw7CisJZS0+b2Zmc2V0ID0gMDsKKwlpZiAocCkKKwkJcC0+bmV4dCA9IGU7CisJZWxzZQorCQlvYmplY3RfdGFibGVbaF0gPSBlOworCXJldHVybiBlOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhjX3N0cihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGludCByID0gMDsKKwl3aGlsZSAobGVuLS0gPiAwKQorCQlyID0gciAqIDMxICsgKnMrKzsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgKnBvb2xfYWxsb2Moc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbWVtX3Bvb2wgKnA7CisJdm9pZCAqcjsKKworCWZvciAocCA9IG1lbV9wb29sOyBwOyBwID0gcC0+bmV4dF9wb29sKQorCQlpZiAoKHAtPmVuZCAtIHAtPm5leHRfZnJlZSA+PSBsZW4pKQorCQkJYnJlYWs7CisKKwlpZiAoIXApIHsKKwkJaWYgKGxlbiA+PSAobWVtX3Bvb2xfYWxsb2MvMikpIHsKKwkJCXRvdGFsX2FsbG9jZCArPSBsZW47CisJCQlyZXR1cm4geG1hbGxvYyhsZW4pOworCQl9CisJCXRvdGFsX2FsbG9jZCArPSBzaXplb2Yoc3RydWN0IG1lbV9wb29sKSArIG1lbV9wb29sX2FsbG9jOworCQlwID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG1lbV9wb29sKSArIG1lbV9wb29sX2FsbG9jKTsKKwkJcC0+bmV4dF9wb29sID0gbWVtX3Bvb2w7CisJCXAtPm5leHRfZnJlZSA9IHAtPnNwYWNlOworCQlwLT5lbmQgPSBwLT5uZXh0X2ZyZWUgKyBtZW1fcG9vbF9hbGxvYzsKKwkJbWVtX3Bvb2wgPSBwOworCX0KKworCXIgPSBwLT5uZXh0X2ZyZWU7CisJLyogcm91bmQgb3V0IHRvIGEgcG9pbnRlciBhbGlnbm1lbnQgKi8KKwlpZiAobGVuICYgKHNpemVvZih2b2lkKikgLSAxKSkKKwkJbGVuICs9IHNpemVvZih2b2lkKikgLSAobGVuICYgKHNpemVvZih2b2lkKikgLSAxKSk7CisJcC0+bmV4dF9mcmVlICs9IGxlbjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgKnBvb2xfY2FsbG9jKHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGxlbiA9IGNvdW50ICogc2l6ZTsKKwl2b2lkICpyID0gcG9vbF9hbGxvYyhsZW4pOworCW1lbXNldChyLCAwLCBsZW4pOworCXJldHVybiByOworfQorCitzdGF0aWMgY2hhciAqcG9vbF9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpyID0gcG9vbF9hbGxvYyhzdHJsZW4ocykgKyAxKTsKKwlzdHJjcHkociwgcyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHNpemVfZGJ1ZihzdHJ1Y3QgZGJ1ZiAqYiwgc2l6ZV90IG1heGxlbikKK3sKKwlpZiAoYi0+YnVmZmVyKSB7CisJCWlmIChiLT5jYXBhY2l0eSA+PSBtYXhsZW4pCisJCQlyZXR1cm47CisJCWZyZWUoYi0+YnVmZmVyKTsKKwl9CisJYi0+Y2FwYWNpdHkgPSAoKG1heGxlbiAvIDEwMjQpICsgMSkgKiAxMDI0OworCWItPmJ1ZmZlciA9IHhtYWxsb2MoYi0+Y2FwYWNpdHkpOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfbWFyayh1aW50bWF4X3QgaWRudW0sIHN0cnVjdCBvYmplY3RfZW50cnkgKm9lKQoreworCXN0cnVjdCBtYXJrX3NldCAqcyA9IG1hcmtzOworCXdoaWxlICgoaWRudW0gPj4gcy0+c2hpZnQpID49IDEwMjQpIHsKKwkJcyA9IHBvb2xfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbWFya19zZXQpKTsKKwkJcy0+c2hpZnQgPSBtYXJrcy0+c2hpZnQgKyAxMDsKKwkJcy0+ZGF0YS5zZXRzWzBdID0gbWFya3M7CisJCW1hcmtzID0gczsKKwl9CisJd2hpbGUgKHMtPnNoaWZ0KSB7CisJCXVpbnRtYXhfdCBpID0gaWRudW0gPj4gcy0+c2hpZnQ7CisJCWlkbnVtIC09IGkgPDwgcy0+c2hpZnQ7CisJCWlmICghcy0+ZGF0YS5zZXRzW2ldKSB7CisJCQlzLT5kYXRhLnNldHNbaV0gPSBwb29sX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1hcmtfc2V0KSk7CisJCQlzLT5kYXRhLnNldHNbaV0tPnNoaWZ0ID0gcy0+c2hpZnQgLSAxMDsKKwkJfQorCQlzID0gcy0+ZGF0YS5zZXRzW2ldOworCX0KKwlpZiAoIXMtPmRhdGEubWFya2VkW2lkbnVtXSkKKwkJbWFya3Nfc2V0X2NvdW50Kys7CisJcy0+ZGF0YS5tYXJrZWRbaWRudW1dID0gb2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpmaW5kX21hcmsodWludG1heF90IGlkbnVtKQoreworCXVpbnRtYXhfdCBvcmlnX2lkbnVtID0gaWRudW07CisJc3RydWN0IG1hcmtfc2V0ICpzID0gbWFya3M7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqb2UgPSBOVUxMOworCWlmICgoaWRudW0gPj4gcy0+c2hpZnQpIDwgMTAyNCkgeworCQl3aGlsZSAocyAmJiBzLT5zaGlmdCkgeworCQkJdWludG1heF90IGkgPSBpZG51bSA+PiBzLT5zaGlmdDsKKwkJCWlkbnVtIC09IGkgPDwgcy0+c2hpZnQ7CisJCQlzID0gcy0+ZGF0YS5zZXRzW2ldOworCQl9CisJCWlmIChzKQorCQkJb2UgPSBzLT5kYXRhLm1hcmtlZFtpZG51bV07CisJfQorCWlmICghb2UpCisJCWRpZSgibWFyayA6JSIgUFJJdU1BWCAiIG5vdCBkZWNsYXJlZCIsIG9yaWdfaWRudW0pOworCXJldHVybiBvZTsKK30KKworc3RhdGljIHN0cnVjdCBhdG9tX3N0ciAqdG9fYXRvbShjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJdW5zaWduZWQgaW50IGhjID0gaGNfc3RyKHMsIGxlbikgJSBhdG9tX3RhYmxlX3N6OworCXN0cnVjdCBhdG9tX3N0ciAqYzsKKworCWZvciAoYyA9IGF0b21fdGFibGVbaGNdOyBjOyBjID0gYy0+bmV4dF9hdG9tKQorCQlpZiAoYy0+c3RyX2xlbiA9PSBsZW4gJiYgIXN0cm5jbXAocywgYy0+c3RyX2RhdCwgbGVuKSkKKwkJCXJldHVybiBjOworCisJYyA9IHBvb2xfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG9tX3N0cikgKyBsZW4gKyAxKTsKKwljLT5zdHJfbGVuID0gbGVuOworCXN0cm5jcHkoYy0+c3RyX2RhdCwgcywgbGVuKTsKKwljLT5zdHJfZGF0W2xlbl0gPSAwOworCWMtPm5leHRfYXRvbSA9IGF0b21fdGFibGVbaGNdOworCWF0b21fdGFibGVbaGNdID0gYzsKKwlhdG9tX2NudCsrOworCXJldHVybiBjOworfQorCitzdGF0aWMgc3RydWN0IGJyYW5jaCAqbG9va3VwX2JyYW5jaChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBoYyA9IGhjX3N0cihuYW1lLCBzdHJsZW4obmFtZSkpICUgYnJhbmNoX3RhYmxlX3N6OworCXN0cnVjdCBicmFuY2ggKmI7CisKKwlmb3IgKGIgPSBicmFuY2hfdGFibGVbaGNdOyBiOyBiID0gYi0+dGFibGVfbmV4dF9icmFuY2gpCisJCWlmICghc3RyY21wKG5hbWUsIGItPm5hbWUpKQorCQkJcmV0dXJuIGI7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJhbmNoICpuZXdfYnJhbmNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaW50IGhjID0gaGNfc3RyKG5hbWUsIHN0cmxlbihuYW1lKSkgJSBicmFuY2hfdGFibGVfc3o7CisJc3RydWN0IGJyYW5jaCogYiA9IGxvb2t1cF9icmFuY2gobmFtZSk7CisKKwlpZiAoYikKKwkJZGllKCJJbnZhbGlkIGF0dGVtcHQgdG8gY3JlYXRlIGR1cGxpY2F0ZSBicmFuY2g6ICVzIiwgbmFtZSk7CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQobmFtZSkpCisJCWRpZSgiQnJhbmNoIG5hbWUgZG9lc24ndCBjb25mb3JtIHRvIEdJVCBzdGFuZGFyZHM6ICVzIiwgbmFtZSk7CisKKwliID0gcG9vbF9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBicmFuY2gpKTsKKwliLT5uYW1lID0gcG9vbF9zdHJkdXAobmFtZSk7CisJYi0+dGFibGVfbmV4dF9icmFuY2ggPSBicmFuY2hfdGFibGVbaGNdOworCWItPmJyYW5jaF90cmVlLnZlcnNpb25zWzBdLm1vZGUgPSBTX0lGRElSOworCWItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLm1vZGUgPSBTX0lGRElSOworCWItPmFjdGl2ZSA9IDA7CisJYi0+cGFja19pZCA9IE1BWF9QQUNLX0lEOworCWJyYW5jaF90YWJsZVtoY10gPSBiOworCWJyYW5jaF9jb3VudCsrOworCXJldHVybiBiOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhjX2VudHJpZXModW5zaWduZWQgaW50IGNudCkKK3sKKwljbnQgPSBjbnQgJiA3ID8gKGNudCAvIDgpICsgMSA6IGNudCAvIDg7CisJcmV0dXJuIGNudCA8IGF2YWlsX3RyZWVfdGFibGVfc3ogPyBjbnQgOiBhdmFpbF90cmVlX3RhYmxlX3N6IC0gMTsKK30KKworc3RhdGljIHN0cnVjdCB0cmVlX2NvbnRlbnQgKm5ld190cmVlX2NvbnRlbnQodW5zaWduZWQgaW50IGNudCkKK3sKKwlzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50ICpmLCAqbCA9IE5VTEw7CisJc3RydWN0IHRyZWVfY29udGVudCAqdDsKKwl1bnNpZ25lZCBpbnQgaGMgPSBoY19lbnRyaWVzKGNudCk7CisKKwlmb3IgKGYgPSBhdmFpbF90cmVlX3RhYmxlW2hjXTsgZjsgbCA9IGYsIGYgPSBmLT5uZXh0X2F2YWlsKQorCQlpZiAoZi0+ZW50cnlfY2FwYWNpdHkgPj0gY250KQorCQkJYnJlYWs7CisKKwlpZiAoZikgeworCQlpZiAobCkKKwkJCWwtPm5leHRfYXZhaWwgPSBmLT5uZXh0X2F2YWlsOworCQllbHNlCisJCQlhdmFpbF90cmVlX3RhYmxlW2hjXSA9IGYtPm5leHRfYXZhaWw7CisJfSBlbHNlIHsKKwkJY250ID0gY250ICYgNyA/ICgoY250IC8gOCkgKyAxKSAqIDggOiBjbnQ7CisJCWYgPSBwb29sX2FsbG9jKHNpemVvZigqdCkgKyBzaXplb2YodC0+ZW50cmllc1swXSkgKiBjbnQpOworCQlmLT5lbnRyeV9jYXBhY2l0eSA9IGNudDsKKwl9CisKKwl0ID0gKHN0cnVjdCB0cmVlX2NvbnRlbnQqKWY7CisJdC0+ZW50cnlfY291bnQgPSAwOworCXQtPmRlbHRhX2RlcHRoID0gMDsKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV90cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5ICplKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9jb250ZW50KHN0cnVjdCB0cmVlX2NvbnRlbnQgKnQpCit7CisJc3RydWN0IGF2YWlsX3RyZWVfY29udGVudCAqZiA9IChzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50Kil0OworCXVuc2lnbmVkIGludCBoYyA9IGhjX2VudHJpZXMoZi0+ZW50cnlfY2FwYWNpdHkpOworCWYtPm5leHRfYXZhaWwgPSBhdmFpbF90cmVlX3RhYmxlW2hjXTsKKwlhdmFpbF90cmVlX3RhYmxlW2hjXSA9IGY7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9jb250ZW50X3JlY3Vyc2l2ZShzdHJ1Y3QgdHJlZV9jb250ZW50ICp0KQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCB0LT5lbnRyeV9jb3VudDsgaSsrKQorCQlyZWxlYXNlX3RyZWVfZW50cnkodC0+ZW50cmllc1tpXSk7CisJcmVsZWFzZV90cmVlX2NvbnRlbnQodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9jb250ZW50ICpncm93X3RyZWVfY29udGVudCgKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0LAorCWludCBhbXQpCit7CisJc3RydWN0IHRyZWVfY29udGVudCAqciA9IG5ld190cmVlX2NvbnRlbnQodC0+ZW50cnlfY291bnQgKyBhbXQpOworCXItPmVudHJ5X2NvdW50ID0gdC0+ZW50cnlfY291bnQ7CisJci0+ZGVsdGFfZGVwdGggPSB0LT5kZWx0YV9kZXB0aDsKKwltZW1jcHkoci0+ZW50cmllcyx0LT5lbnRyaWVzLHQtPmVudHJ5X2NvdW50KnNpemVvZih0LT5lbnRyaWVzWzBdKSk7CisJcmVsZWFzZV90cmVlX2NvbnRlbnQodCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeSAqbmV3X3RyZWVfZW50cnkodm9pZCkKK3sKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqZTsKKworCWlmICghYXZhaWxfdHJlZV9lbnRyeSkgeworCQl1bnNpZ25lZCBpbnQgbiA9IHRyZWVfZW50cnlfYWxsb2M7CisJCXRvdGFsX2FsbG9jZCArPSBuICogc2l6ZW9mKHN0cnVjdCB0cmVlX2VudHJ5KTsKKwkJYXZhaWxfdHJlZV9lbnRyeSA9IGUgPSB4bWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHRyZWVfZW50cnkpKTsKKwkJd2hpbGUgKG4tLSA+IDEpIHsKKwkJCSooKHZvaWQqKillKSA9IGUgKyAxOworCQkJZSsrOworCQl9CisJCSooKHZvaWQqKillKSA9IE5VTEw7CisJfQorCisJZSA9IGF2YWlsX3RyZWVfZW50cnk7CisJYXZhaWxfdHJlZV9lbnRyeSA9ICooKHZvaWQqKillKTsKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV90cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5ICplKQoreworCWlmIChlLT50cmVlKQorCQlyZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoZS0+dHJlZSk7CisJKigodm9pZCoqKWUpID0gYXZhaWxfdHJlZV9lbnRyeTsKKwlhdmFpbF90cmVlX2VudHJ5ID0gZTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcGFja2ZpbGUodm9pZCkKK3sKKwlzdGF0aWMgY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlzdHJ1Y3QgcGFja19oZWFkZXIgaGRyOworCWludCBwYWNrX2ZkOworCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkiJXMvdG1wX3BhY2tfWFhYWFhYIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJcGFja19mZCA9IG1rc3RlbXAodG1wZmlsZSk7CisJaWYgKHBhY2tfZmQgPCAwKQorCQlkaWUoIkNhbid0IGNyZWF0ZSAlczogJXMiLCB0bXBmaWxlLCBzdHJlcnJvcihlcnJubykpOworCXAgPSB4Y2FsbG9jKDEsIHNpemVvZigqcCkgKyBzdHJsZW4odG1wZmlsZSkgKyAyKTsKKwlzdHJjcHkocC0+cGFja19uYW1lLCB0bXBmaWxlKTsKKwlwLT5wYWNrX2ZkID0gcGFja19mZDsKKworCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoUEFDS19TSUdOQVRVUkUpOworCWhkci5oZHJfdmVyc2lvbiA9IGh0b25sKDIpOworCWhkci5oZHJfZW50cmllcyA9IDA7CisJd3JpdGVfb3JfZGllKHAtPnBhY2tfZmQsICZoZHIsIHNpemVvZihoZHIpKTsKKworCXBhY2tfZGF0YSA9IHA7CisJcGFja19zaXplID0gc2l6ZW9mKGhkcik7CisJb2JqZWN0X2NvdW50ID0gMDsKKworCWFsbF9wYWNrcyA9IHhyZWFsbG9jKGFsbF9wYWNrcywgc2l6ZW9mKCphbGxfcGFja3MpICogKHBhY2tfaWQgKyAxKSk7CisJYWxsX3BhY2tzW3BhY2tfaWRdID0gcDsKK30KKworc3RhdGljIGludCBvZWNtcCAoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKmEgPSAqKChzdHJ1Y3Qgb2JqZWN0X2VudHJ5KiopYV8pOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKChzdHJ1Y3Qgb2JqZWN0X2VudHJ5KiopYl8pOworCXJldHVybiBoYXNoY21wKGEtPnNoYTEsIGItPnNoYTEpOworfQorCitzdGF0aWMgY2hhciAqY3JlYXRlX2luZGV4KHZvaWQpCit7CisJc3RhdGljIGNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJU0hBX0NUWCBjdHg7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXN0cnVjdCBvYmplY3RfZW50cnkgKippZHgsICoqYywgKipsYXN0LCAqZTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKm87CisJdWludDMyX3QgYXJyYXlbMjU2XTsKKwlpbnQgaSwgaWR4X2ZkOworCisJLyogQnVpbGQgdGhlIHNvcnRlZCB0YWJsZSBvZiBvYmplY3QgSURzLiAqLworCWlkeCA9IHhtYWxsb2Mob2JqZWN0X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkqKSk7CisJYyA9IGlkeDsKKwlmb3IgKG8gPSBibG9ja3M7IG87IG8gPSBvLT5uZXh0X3Bvb2wpCisJCWZvciAoZSA9IG8tPm5leHRfZnJlZTsgZS0tICE9IG8tPmVudHJpZXM7KQorCQkJaWYgKHBhY2tfaWQgPT0gZS0+cGFja19pZCkKKwkJCQkqYysrID0gZTsKKwlsYXN0ID0gaWR4ICsgb2JqZWN0X2NvdW50OworCWlmIChjICE9IGxhc3QpCisJCWRpZSgiaW50ZXJuYWwgY29uc2lzdGVuY3kgZXJyb3IgY3JlYXRpbmcgdGhlIGluZGV4Iik7CisJcXNvcnQoaWR4LCBvYmplY3RfY291bnQsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KiksIG9lY21wKTsKKworCS8qIEdlbmVyYXRlIHRoZSBmYW4tb3V0IGFycmF5LiAqLworCWMgPSBpZHg7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKipuZXh0ID0gYzs7CisJCXdoaWxlIChuZXh0IDwgbGFzdCkgeworCQkJaWYgKCgqbmV4dCktPnNoYTFbMF0gIT0gaSkKKwkJCQlicmVhazsKKwkJCW5leHQrKzsKKwkJfQorCQlhcnJheVtpXSA9IGh0b25sKG5leHQgLSBpZHgpOworCQljID0gbmV4dDsKKwl9CisKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksCisJCSIlcy90bXBfaWR4X1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCWlkeF9mZCA9IG1rc3RlbXAodG1wZmlsZSk7CisJaWYgKGlkeF9mZCA8IDApCisJCWRpZSgiQ2FuJ3QgY3JlYXRlICVzOiAlcyIsIHRtcGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJZiA9IHNoYTFmZChpZHhfZmQsIHRtcGZpbGUpOworCXNoYTF3cml0ZShmLCBhcnJheSwgMjU2ICogc2l6ZW9mKGludCkpOworCVNIQTFfSW5pdCgmY3R4KTsKKwlmb3IgKGMgPSBpZHg7IGMgIT0gbGFzdDsgYysrKSB7CisJCXVpbnQzMl90IG9mZnNldCA9IGh0b25sKCgqYyktPm9mZnNldCk7CisJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJc2hhMXdyaXRlKGYsICgqYyktPnNoYTEsIHNpemVvZigoKmMpLT5zaGExKSk7CisJCVNIQTFfVXBkYXRlKCZjdHgsICgqYyktPnNoYTEsIDIwKTsKKwl9CisJc2hhMXdyaXRlKGYsIHBhY2tfZGF0YS0+c2hhMSwgc2l6ZW9mKHBhY2tfZGF0YS0+c2hhMSkpOworCXNoYTFjbG9zZShmLCBOVUxMLCAxKTsKKwlmcmVlKGlkeCk7CisJU0hBMV9GaW5hbChwYWNrX2RhdGEtPnNoYTEsICZjdHgpOworCXJldHVybiB0bXBmaWxlOworfQorCitzdGF0aWMgY2hhciAqa2VlcF9wYWNrKGNoYXIgKmN1cnJfaW5kZXhfbmFtZSkKK3sKKwlzdGF0aWMgY2hhciBuYW1lW1BBVEhfTUFYXTsKKwlzdGF0aWMgY29uc3QgY2hhciAqa2VlcF9tc2cgPSAiZmFzdC1pbXBvcnQiOworCWludCBrZWVwX2ZkOworCisJY2htb2QocGFja19kYXRhLT5wYWNrX25hbWUsIDA0NDQpOworCWNobW9kKGN1cnJfaW5kZXhfbmFtZSwgMDQ0NCk7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy9wYWNrL3BhY2stJXMua2VlcCIsCisJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBzaGExX3RvX2hleChwYWNrX2RhdGEtPnNoYTEpKTsKKwlrZWVwX2ZkID0gb3BlbihuYW1lLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOworCWlmIChrZWVwX2ZkIDwgMCkKKwkJZGllKCJjYW5ub3QgY3JlYXRlIGtlZXAgZmlsZSIpOworCXdyaXRlKGtlZXBfZmQsIGtlZXBfbXNnLCBzdHJsZW4oa2VlcF9tc2cpKTsKKwljbG9zZShrZWVwX2ZkKTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5wYWNrIiwKKwkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHNoYTFfdG9faGV4KHBhY2tfZGF0YS0+c2hhMSkpOworCWlmIChtb3ZlX3RlbXBfdG9fZmlsZShwYWNrX2RhdGEtPnBhY2tfbmFtZSwgbmFtZSkpCisJCWRpZSgiY2Fubm90IHN0b3JlIHBhY2sgZmlsZSIpOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvcGFjay9wYWNrLSVzLmlkeCIsCisJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBzaGExX3RvX2hleChwYWNrX2RhdGEtPnNoYTEpKTsKKwlpZiAobW92ZV90ZW1wX3RvX2ZpbGUoY3Vycl9pbmRleF9uYW1lLCBuYW1lKSkKKwkJZGllKCJjYW5ub3Qgc3RvcmUgaW5kZXggZmlsZSIpOworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgdm9pZCB1bmtlZXBfYWxsX3BhY2tzKHZvaWQpCit7CisJc3RhdGljIGNoYXIgbmFtZVtQQVRIX01BWF07CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgcGFja19pZDsgaysrKSB7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gYWxsX3BhY2tzW2tdOworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy9wYWNrL3BhY2stJXMua2VlcCIsCisJCQkgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgc2hhMV90b19oZXgocC0+c2hhMSkpOworCQl1bmxpbmsobmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmRfcGFja2ZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqb2xkX3AgPSBwYWNrX2RhdGEsICpuZXdfcDsKKworCWlmIChvYmplY3RfY291bnQpIHsKKwkJY2hhciAqaWR4X25hbWU7CisJCWludCBpOworCQlzdHJ1Y3QgYnJhbmNoICpiOworCQlzdHJ1Y3QgdGFnICp0OworCisJCWZpeHVwX3BhY2tfaGVhZGVyX2Zvb3RlcihwYWNrX2RhdGEtPnBhY2tfZmQsIHBhY2tfZGF0YS0+c2hhMSwKKwkJCQkgICAgcGFja19kYXRhLT5wYWNrX25hbWUsIG9iamVjdF9jb3VudCk7CisJCWNsb3NlKHBhY2tfZGF0YS0+cGFja19mZCk7CisJCWlkeF9uYW1lID0ga2VlcF9wYWNrKGNyZWF0ZV9pbmRleCgpKTsKKworCQkvKiBSZWdpc3RlciB0aGUgcGFja2ZpbGUgd2l0aCBjb3JlIGdpdCdzIG1hY2hpbmFyeS4gKi8KKwkJbmV3X3AgPSBhZGRfcGFja2VkX2dpdChpZHhfbmFtZSwgc3RybGVuKGlkeF9uYW1lKSwgMSk7CisJCWlmICghbmV3X3ApCisJCQlkaWUoImNvcmUgZ2l0IHJlamVjdGVkIGluZGV4ICVzIiwgaWR4X25hbWUpOworCQluZXdfcC0+d2luZG93cyA9IG9sZF9wLT53aW5kb3dzOworCQlhbGxfcGFja3NbcGFja19pZF0gPSBuZXdfcDsKKwkJaW5zdGFsbF9wYWNrZWRfZ2l0KG5ld19wKTsKKworCQkvKiBQcmludCB0aGUgYm91bmRhcnkgKi8KKwkJaWYgKHBhY2tfZWRnZXMpIHsKKwkJCWZwcmludGYocGFja19lZGdlcywgIiVzOiIsIG5ld19wLT5wYWNrX25hbWUpOworCQkJZm9yIChpID0gMDsgaSA8IGJyYW5jaF90YWJsZV9zejsgaSsrKSB7CisJCQkJZm9yIChiID0gYnJhbmNoX3RhYmxlW2ldOyBiOyBiID0gYi0+dGFibGVfbmV4dF9icmFuY2gpIHsKKwkJCQkJaWYgKGItPnBhY2tfaWQgPT0gcGFja19pZCkKKwkJCQkJCWZwcmludGYocGFja19lZGdlcywgIiAlcyIsIHNoYTFfdG9faGV4KGItPnNoYTEpKTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKHQgPSBmaXJzdF90YWc7IHQ7IHQgPSB0LT5uZXh0X3RhZykgeworCQkJCWlmICh0LT5wYWNrX2lkID09IHBhY2tfaWQpCisJCQkJCWZwcmludGYocGFja19lZGdlcywgIiAlcyIsIHNoYTFfdG9faGV4KHQtPnNoYTEpKTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIHBhY2tfZWRnZXMpOworCQkJZmZsdXNoKHBhY2tfZWRnZXMpOworCQl9CisKKwkJcGFja19pZCsrOworCX0KKwllbHNlCisJCXVubGluayhvbGRfcC0+cGFja19uYW1lKTsKKwlmcmVlKG9sZF9wKTsKKworCS8qIFdlIGNhbid0IGNhcnJ5IGEgZGVsdGEgYWNyb3NzIHBhY2tmaWxlcy4gKi8KKwlmcmVlKGxhc3RfYmxvYi5kYXRhKTsKKwlsYXN0X2Jsb2IuZGF0YSA9IE5VTEw7CisJbGFzdF9ibG9iLmxlbiA9IDA7CisJbGFzdF9ibG9iLm9mZnNldCA9IDA7CisJbGFzdF9ibG9iLmRlcHRoID0gMDsKK30KKworc3RhdGljIHZvaWQgY3ljbGVfcGFja2ZpbGUodm9pZCkKK3sKKwllbmRfcGFja2ZpbGUoKTsKKwlzdGFydF9wYWNrZmlsZSgpOworfQorCitzdGF0aWMgc2l6ZV90IGVuY29kZV9oZWFkZXIoCisJZW51bSBvYmplY3RfdHlwZSB0eXBlLAorCXNpemVfdCBzaXplLAorCXVuc2lnbmVkIGNoYXIgKmhkcikKK3sKKwlpbnQgbiA9IDE7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHR5cGUgPCBPQkpfQ09NTUlUIHx8IHR5cGUgPiBPQkpfUkVGX0RFTFRBKQorCQlkaWUoImJhZCB0eXBlICVkIiwgdHlwZSk7CisKKwljID0gKHR5cGUgPDwgNCkgfCAoc2l6ZSAmIDE1KTsKKwlzaXplID4+PSA0OworCXdoaWxlIChzaXplKSB7CisJCSpoZHIrKyA9IGMgfCAweDgwOworCQljID0gc2l6ZSAmIDB4N2Y7CisJCXNpemUgPj49IDc7CisJCW4rKzsKKwl9CisJKmhkciA9IGM7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfb2JqZWN0KAorCWVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwl2b2lkICpkYXQsCisJc2l6ZV90IGRhdGxlbiwKKwlzdHJ1Y3QgbGFzdF9vYmplY3QgKmxhc3QsCisJdW5zaWduZWQgY2hhciAqc2hhMW91dCwKKwl1aW50bWF4X3QgbWFyaykKK3sKKwl2b2lkICpvdXQsICpkZWx0YTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplOworCXVuc2lnbmVkIGNoYXIgaGRyWzk2XTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGxvbmcgaGRybGVuLCBkZWx0YWxlbjsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gczsKKworCWhkcmxlbiA9IHNwcmludGYoKGNoYXIqKWhkciwiJXMgJWx1IiwgdHlwZW5hbWUodHlwZSksCisJCSh1bnNpZ25lZCBsb25nKWRhdGxlbikgKyAxOworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhkciwgaGRybGVuKTsKKwlTSEExX1VwZGF0ZSgmYywgZGF0LCBkYXRsZW4pOworCVNIQTFfRmluYWwoc2hhMSwgJmMpOworCWlmIChzaGExb3V0KQorCQloYXNoY3B5KHNoYTFvdXQsIHNoYTEpOworCisJZSA9IGluc2VydF9vYmplY3Qoc2hhMSk7CisJaWYgKG1hcmspCisJCWluc2VydF9tYXJrKG1hcmssIGUpOworCWlmIChlLT5vZmZzZXQpIHsKKwkJZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbdHlwZV0rKzsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChmaW5kX3NoYTFfcGFjayhzaGExLCBwYWNrZWRfZ2l0KSkgeworCQllLT50eXBlID0gdHlwZTsKKwkJZS0+cGFja19pZCA9IE1BWF9QQUNLX0lEOworCQllLT5vZmZzZXQgPSAxOyAvKiBqdXN0IG5vdCB6ZXJvISAqLworCQlkdXBsaWNhdGVfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobGFzdCAmJiBsYXN0LT5kYXRhICYmIGxhc3QtPmRlcHRoIDwgbWF4X2RlcHRoKSB7CisJCWRlbHRhID0gZGlmZl9kZWx0YShsYXN0LT5kYXRhLCBsYXN0LT5sZW4sCisJCQlkYXQsIGRhdGxlbiwKKwkJCSZkZWx0YWxlbiwgMCk7CisJCWlmIChkZWx0YSAmJiBkZWx0YWxlbiA+PSBkYXRsZW4pIHsKKwkJCWZyZWUoZGVsdGEpOworCQkJZGVsdGEgPSBOVUxMOworCQl9CisJfSBlbHNlCisJCWRlbHRhID0gTlVMTDsKKworCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKwlkZWZsYXRlSW5pdCgmcywgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJaWYgKGRlbHRhKSB7CisJCXMubmV4dF9pbiA9IGRlbHRhOworCQlzLmF2YWlsX2luID0gZGVsdGFsZW47CisJfSBlbHNlIHsKKwkJcy5uZXh0X2luID0gZGF0OworCQlzLmF2YWlsX2luID0gZGF0bGVuOworCX0KKwlzLmF2YWlsX291dCA9IGRlZmxhdGVCb3VuZCgmcywgcy5hdmFpbF9pbik7CisJcy5uZXh0X291dCA9IG91dCA9IHhtYWxsb2Mocy5hdmFpbF9vdXQpOworCXdoaWxlIChkZWZsYXRlKCZzLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzKTsKKworCS8qIERldGVybWluZSBpZiB3ZSBzaG91bGQgYXV0by1jaGVja3BvaW50LiAqLworCWlmICgocGFja19zaXplICsgNjAgKyBzLnRvdGFsX291dCkgPiBtYXhfcGFja3NpemUKKwkJfHwgKHBhY2tfc2l6ZSArIDYwICsgcy50b3RhbF9vdXQpIDwgcGFja19zaXplKSB7CisKKwkJLyogVGhpcyBuZXcgb2JqZWN0IG5lZWRzIHRvICpub3QqIGhhdmUgdGhlIGN1cnJlbnQgcGFja19pZC4gKi8KKwkJZS0+cGFja19pZCA9IHBhY2tfaWQgKyAxOworCQljeWNsZV9wYWNrZmlsZSgpOworCisJCS8qIFdlIGNhbm5vdCBjYXJyeSBhIGRlbHRhIGludG8gdGhlIG5ldyBwYWNrLiAqLworCQlpZiAoZGVsdGEpIHsKKwkJCWZyZWUoZGVsdGEpOworCQkJZGVsdGEgPSBOVUxMOworCisJCQltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisJCQlkZWZsYXRlSW5pdCgmcywgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJCQlzLm5leHRfaW4gPSBkYXQ7CisJCQlzLmF2YWlsX2luID0gZGF0bGVuOworCQkJcy5hdmFpbF9vdXQgPSBkZWZsYXRlQm91bmQoJnMsIHMuYXZhaWxfaW4pOworCQkJcy5uZXh0X291dCA9IG91dCA9IHhyZWFsbG9jKG91dCwgcy5hdmFpbF9vdXQpOworCQkJd2hpbGUgKGRlZmxhdGUoJnMsIFpfRklOSVNIKSA9PSBaX09LKQorCQkJCS8qIG5vdGhpbmcgKi87CisJCQlkZWZsYXRlRW5kKCZzKTsKKwkJfQorCX0KKworCWUtPnR5cGUgPSB0eXBlOworCWUtPnBhY2tfaWQgPSBwYWNrX2lkOworCWUtPm9mZnNldCA9IHBhY2tfc2l6ZTsKKwlvYmplY3RfY291bnQrKzsKKwlvYmplY3RfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCisJaWYgKGRlbHRhKSB7CisJCXVuc2lnbmVkIGxvbmcgb2ZzID0gZS0+b2Zmc2V0IC0gbGFzdC0+b2Zmc2V0OworCQl1bnNpZ25lZCBwb3MgPSBzaXplb2YoaGRyKSAtIDE7CisKKwkJZGVsdGFfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCQlsYXN0LT5kZXB0aCsrOworCisJCWhkcmxlbiA9IGVuY29kZV9oZWFkZXIoT0JKX09GU19ERUxUQSwgZGVsdGFsZW4sIGhkcik7CisJCXdyaXRlX29yX2RpZShwYWNrX2RhdGEtPnBhY2tfZmQsIGhkciwgaGRybGVuKTsKKwkJcGFja19zaXplICs9IGhkcmxlbjsKKworCQloZHJbcG9zXSA9IG9mcyAmIDEyNzsKKwkJd2hpbGUgKG9mcyA+Pj0gNykKKwkJCWhkclstLXBvc10gPSAxMjggfCAoLS1vZnMgJiAxMjcpOworCQl3cml0ZV9vcl9kaWUocGFja19kYXRhLT5wYWNrX2ZkLCBoZHIgKyBwb3MsIHNpemVvZihoZHIpIC0gcG9zKTsKKwkJcGFja19zaXplICs9IHNpemVvZihoZHIpIC0gcG9zOworCX0gZWxzZSB7CisJCWlmIChsYXN0KQorCQkJbGFzdC0+ZGVwdGggPSAwOworCQloZHJsZW4gPSBlbmNvZGVfaGVhZGVyKHR5cGUsIGRhdGxlbiwgaGRyKTsKKwkJd3JpdGVfb3JfZGllKHBhY2tfZGF0YS0+cGFja19mZCwgaGRyLCBoZHJsZW4pOworCQlwYWNrX3NpemUgKz0gaGRybGVuOworCX0KKworCXdyaXRlX29yX2RpZShwYWNrX2RhdGEtPnBhY2tfZmQsIG91dCwgcy50b3RhbF9vdXQpOworCXBhY2tfc2l6ZSArPSBzLnRvdGFsX291dDsKKworCWZyZWUob3V0KTsKKwlmcmVlKGRlbHRhKTsKKwlpZiAobGFzdCkgeworCQlpZiAoIWxhc3QtPm5vX2ZyZWUpCisJCQlmcmVlKGxhc3QtPmRhdGEpOworCQlsYXN0LT5kYXRhID0gZGF0OworCQlsYXN0LT5vZmZzZXQgPSBlLT5vZmZzZXQ7CisJCWxhc3QtPmxlbiA9IGRhdGxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICpnZmlfdW5wYWNrX2VudHJ5KAorCXN0cnVjdCBvYmplY3RfZW50cnkgKm9lLAorCXVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGFsbF9wYWNrc1tvZS0+cGFja19pZF07CisJaWYgKHAgPT0gcGFja19kYXRhKQorCQlwLT5wYWNrX3NpemUgPSBwYWNrX3NpemUgKyAyMDsKKwlyZXR1cm4gdW5wYWNrX2VudHJ5KHAsIG9lLT5vZmZzZXQsICZ0eXBlLCBzaXplcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbW9kZShjb25zdCBjaGFyICpzdHIsIHVpbnQxNl90ICptb2RlcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdWludDE2X3QgbW9kZSA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJcmV0dXJuIE5VTEw7CisJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsKKwl9CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3RyZWUoc3RydWN0IHRyZWVfZW50cnkgKnJvb3QpCit7CisJdW5zaWduZWQgY2hhciogc2hhMSA9IHJvb3QtPnZlcnNpb25zWzFdLnNoYTE7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqbXlvZTsKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqYzsKKworCXJvb3QtPnRyZWUgPSB0ID0gbmV3X3RyZWVfY29udGVudCg4KTsKKwlpZiAoaXNfbnVsbF9zaGExKHNoYTEpKQorCQlyZXR1cm47CisKKwlteW9lID0gZmluZF9vYmplY3Qoc2hhMSk7CisJaWYgKG15b2UgJiYgbXlvZS0+cGFja19pZCAhPSBNQVhfUEFDS19JRCkgeworCQlpZiAobXlvZS0+dHlwZSAhPSBPQkpfVFJFRSkKKwkJCWRpZSgiTm90IGEgdHJlZTogJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJCXQtPmRlbHRhX2RlcHRoID0gMDsKKwkJYnVmID0gZ2ZpX3VucGFja19lbnRyeShteW9lLCAmc2l6ZSk7CisJfSBlbHNlIHsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQlidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCQlpZiAoIWJ1ZiB8fCB0eXBlICE9IE9CSl9UUkVFKQorCQkJZGllKCJDYW4ndCBsb2FkIHRyZWUgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCisJYyA9IGJ1ZjsKKwl3aGlsZSAoYyAhPSAoYnVmICsgc2l6ZSkpIHsKKwkJc3RydWN0IHRyZWVfZW50cnkgKmUgPSBuZXdfdHJlZV9lbnRyeSgpOworCisJCWlmICh0LT5lbnRyeV9jb3VudCA9PSB0LT5lbnRyeV9jYXBhY2l0eSkKKwkJCXJvb3QtPnRyZWUgPSB0ID0gZ3Jvd190cmVlX2NvbnRlbnQodCwgdC0+ZW50cnlfY291bnQpOworCQl0LT5lbnRyaWVzW3QtPmVudHJ5X2NvdW50KytdID0gZTsKKworCQllLT50cmVlID0gTlVMTDsKKwkJYyA9IGdldF9tb2RlKGMsICZlLT52ZXJzaW9uc1sxXS5tb2RlKTsKKwkJaWYgKCFjKQorCQkJZGllKCJDb3JydXB0IG1vZGUgaW4gJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWUtPnZlcnNpb25zWzBdLm1vZGUgPSBlLT52ZXJzaW9uc1sxXS5tb2RlOworCQllLT5uYW1lID0gdG9fYXRvbShjLCBzdHJsZW4oYykpOworCQljICs9IGUtPm5hbWUtPnN0cl9sZW4gKyAxOworCQloYXNoY3B5KGUtPnZlcnNpb25zWzBdLnNoYTEsICh1bnNpZ25lZCBjaGFyKiljKTsKKwkJaGFzaGNweShlLT52ZXJzaW9uc1sxXS5zaGExLCAodW5zaWduZWQgY2hhciopYyk7CisJCWMgKz0gMjA7CisJfQorCWZyZWUoYnVmKTsKK30KKworc3RhdGljIGludCB0ZWNtcDAgKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqYSA9ICooKHN0cnVjdCB0cmVlX2VudHJ5KiopX2EpOworCXN0cnVjdCB0cmVlX2VudHJ5ICpiID0gKigoc3RydWN0IHRyZWVfZW50cnkqKilfYik7CisJcmV0dXJuIGJhc2VfbmFtZV9jb21wYXJlKAorCQlhLT5uYW1lLT5zdHJfZGF0LCBhLT5uYW1lLT5zdHJfbGVuLCBhLT52ZXJzaW9uc1swXS5tb2RlLAorCQliLT5uYW1lLT5zdHJfZGF0LCBiLT5uYW1lLT5zdHJfbGVuLCBiLT52ZXJzaW9uc1swXS5tb2RlKTsKK30KKworc3RhdGljIGludCB0ZWNtcDEgKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqYSA9ICooKHN0cnVjdCB0cmVlX2VudHJ5KiopX2EpOworCXN0cnVjdCB0cmVlX2VudHJ5ICpiID0gKigoc3RydWN0IHRyZWVfZW50cnkqKilfYik7CisJcmV0dXJuIGJhc2VfbmFtZV9jb21wYXJlKAorCQlhLT5uYW1lLT5zdHJfZGF0LCBhLT5uYW1lLT5zdHJfbGVuLCBhLT52ZXJzaW9uc1sxXS5tb2RlLAorCQliLT5uYW1lLT5zdHJfZGF0LCBiLT5uYW1lLT5zdHJfbGVuLCBiLT52ZXJzaW9uc1sxXS5tb2RlKTsKK30KKworc3RhdGljIHZvaWQgbWt0cmVlKHN0cnVjdCB0cmVlX2NvbnRlbnQgKnQsCisJaW50IHYsCisJdW5zaWduZWQgbG9uZyAqc3pwLAorCXN0cnVjdCBkYnVmICpiKQoreworCXNpemVfdCBtYXhsZW4gPSAwOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKmM7CisKKwlpZiAoIXYpCisJCXFzb3J0KHQtPmVudHJpZXMsdC0+ZW50cnlfY291bnQsc2l6ZW9mKHQtPmVudHJpZXNbMF0pLHRlY21wMCk7CisJZWxzZQorCQlxc29ydCh0LT5lbnRyaWVzLHQtPmVudHJ5X2NvdW50LHNpemVvZih0LT5lbnRyaWVzWzBdKSx0ZWNtcDEpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJaWYgKHQtPmVudHJpZXNbaV0tPnZlcnNpb25zW3ZdLm1vZGUpCisJCQltYXhsZW4gKz0gdC0+ZW50cmllc1tpXS0+bmFtZS0+c3RyX2xlbiArIDM0OworCX0KKworCXNpemVfZGJ1ZihiLCBtYXhsZW4pOworCWMgPSBiLT5idWZmZXI7CisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHRyZWVfZW50cnkgKmUgPSB0LT5lbnRyaWVzW2ldOworCQlpZiAoIWUtPnZlcnNpb25zW3ZdLm1vZGUpCisJCQljb250aW51ZTsKKwkJYyArPSBzcHJpbnRmKGMsICIlbyIsICh1bnNpZ25lZCBpbnQpZS0+dmVyc2lvbnNbdl0ubW9kZSk7CisJCSpjKysgPSAnICc7CisJCXN0cmNweShjLCBlLT5uYW1lLT5zdHJfZGF0KTsKKwkJYyArPSBlLT5uYW1lLT5zdHJfbGVuICsgMTsKKwkJaGFzaGNweSgodW5zaWduZWQgY2hhciopYywgZS0+dmVyc2lvbnNbdl0uc2hhMSk7CisJCWMgKz0gMjA7CisJfQorCSpzenAgPSBjIC0gKGNoYXIqKWItPmJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfdHJlZShzdHJ1Y3QgdHJlZV9lbnRyeSAqcm9vdCkKK3sKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0ID0gcm9vdC0+dHJlZTsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgZGVsOworCXVuc2lnbmVkIGxvbmcgbmV3X2xlbjsKKwlzdHJ1Y3QgbGFzdF9vYmplY3QgbG87CisJc3RydWN0IG9iamVjdF9lbnRyeSAqbGU7CisKKwlpZiAoIWlzX251bGxfc2hhMShyb290LT52ZXJzaW9uc1sxXS5zaGExKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJaWYgKHQtPmVudHJpZXNbaV0tPnRyZWUpCisJCQlzdG9yZV90cmVlKHQtPmVudHJpZXNbaV0pOworCX0KKworCWxlID0gZmluZF9vYmplY3Qocm9vdC0+dmVyc2lvbnNbMF0uc2hhMSk7CisJaWYgKCFTX0lTRElSKHJvb3QtPnZlcnNpb25zWzBdLm1vZGUpCisJCXx8ICFsZQorCQl8fCBsZS0+cGFja19pZCAhPSBwYWNrX2lkKSB7CisJCWxvLmRhdGEgPSBOVUxMOworCQlsby5kZXB0aCA9IDA7CisJCWxvLm5vX2ZyZWUgPSAwOworCX0gZWxzZSB7CisJCW1rdHJlZSh0LCAwLCAmbG8ubGVuLCAmb2xkX3RyZWUpOworCQlsby5kYXRhID0gb2xkX3RyZWUuYnVmZmVyOworCQlsby5vZmZzZXQgPSBsZS0+b2Zmc2V0OworCQlsby5kZXB0aCA9IHQtPmRlbHRhX2RlcHRoOworCQlsby5ub19mcmVlID0gMTsKKwl9CisKKwlta3RyZWUodCwgMSwgJm5ld19sZW4sICZuZXdfdHJlZSk7CisJc3RvcmVfb2JqZWN0KE9CSl9UUkVFLCBuZXdfdHJlZS5idWZmZXIsIG5ld19sZW4sCisJCSZsbywgcm9vdC0+dmVyc2lvbnNbMV0uc2hhMSwgMCk7CisKKwl0LT5kZWx0YV9kZXB0aCA9IGxvLmRlcHRoOworCWZvciAoaSA9IDAsIGogPSAwLCBkZWwgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdHJlZV9lbnRyeSAqZSA9IHQtPmVudHJpZXNbaV07CisJCWlmIChlLT52ZXJzaW9uc1sxXS5tb2RlKSB7CisJCQllLT52ZXJzaW9uc1swXS5tb2RlID0gZS0+dmVyc2lvbnNbMV0ubW9kZTsKKwkJCWhhc2hjcHkoZS0+dmVyc2lvbnNbMF0uc2hhMSwgZS0+dmVyc2lvbnNbMV0uc2hhMSk7CisJCQl0LT5lbnRyaWVzW2orK10gPSBlOworCQl9IGVsc2UgeworCQkJcmVsZWFzZV90cmVlX2VudHJ5KGUpOworCQkJZGVsKys7CisJCX0KKwl9CisJdC0+ZW50cnlfY291bnQgLT0gZGVsOworfQorCitzdGF0aWMgaW50IHRyZWVfY29udGVudF9zZXQoCisJc3RydWN0IHRyZWVfZW50cnkgKnJvb3QsCisJY29uc3QgY2hhciAqcCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCWNvbnN0IHVpbnQxNl90IG1vZGUpCit7CisJc3RydWN0IHRyZWVfY29udGVudCAqdCA9IHJvb3QtPnRyZWU7CisJY29uc3QgY2hhciAqc2xhc2gxOworCXVuc2lnbmVkIGludCBpLCBuOworCXN0cnVjdCB0cmVlX2VudHJ5ICplOworCisJc2xhc2gxID0gc3RyY2hyKHAsICcvJyk7CisJaWYgKHNsYXNoMSkKKwkJbiA9IHNsYXNoMSAtIHA7CisJZWxzZQorCQluID0gc3RybGVuKHApOworCWlmICghbikKKwkJZGllKCJFbXB0eSBwYXRoIGNvbXBvbmVudCBmb3VuZCBpbiBpbnB1dCIpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJZSA9IHQtPmVudHJpZXNbaV07CisJCWlmIChlLT5uYW1lLT5zdHJfbGVuID09IG4gJiYgIXN0cm5jbXAocCwgZS0+bmFtZS0+c3RyX2RhdCwgbikpIHsKKwkJCWlmICghc2xhc2gxKSB7CisJCQkJaWYgKGUtPnZlcnNpb25zWzFdLm1vZGUgPT0gbW9kZQorCQkJCQkJJiYgIWhhc2hjbXAoZS0+dmVyc2lvbnNbMV0uc2hhMSwgc2hhMSkpCisJCQkJCXJldHVybiAwOworCQkJCWUtPnZlcnNpb25zWzFdLm1vZGUgPSBtb2RlOworCQkJCWhhc2hjcHkoZS0+dmVyc2lvbnNbMV0uc2hhMSwgc2hhMSk7CisJCQkJaWYgKGUtPnRyZWUpIHsKKwkJCQkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGUtPnRyZWUpOworCQkJCQllLT50cmVlID0gTlVMTDsKKwkJCQl9CisJCQkJaGFzaGNscihyb290LT52ZXJzaW9uc1sxXS5zaGExKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmICghU19JU0RJUihlLT52ZXJzaW9uc1sxXS5tb2RlKSkgeworCQkJCWUtPnRyZWUgPSBuZXdfdHJlZV9jb250ZW50KDgpOworCQkJCWUtPnZlcnNpb25zWzFdLm1vZGUgPSBTX0lGRElSOworCQkJfQorCQkJaWYgKCFlLT50cmVlKQorCQkJCWxvYWRfdHJlZShlKTsKKwkJCWlmICh0cmVlX2NvbnRlbnRfc2V0KGUsIHNsYXNoMSArIDEsIHNoYTEsIG1vZGUpKSB7CisJCQkJaGFzaGNscihyb290LT52ZXJzaW9uc1sxXS5zaGExKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHQtPmVudHJ5X2NvdW50ID09IHQtPmVudHJ5X2NhcGFjaXR5KQorCQlyb290LT50cmVlID0gdCA9IGdyb3dfdHJlZV9jb250ZW50KHQsIHQtPmVudHJ5X2NvdW50KTsKKwllID0gbmV3X3RyZWVfZW50cnkoKTsKKwllLT5uYW1lID0gdG9fYXRvbShwLCBuKTsKKwllLT52ZXJzaW9uc1swXS5tb2RlID0gMDsKKwloYXNoY2xyKGUtPnZlcnNpb25zWzBdLnNoYTEpOworCXQtPmVudHJpZXNbdC0+ZW50cnlfY291bnQrK10gPSBlOworCWlmIChzbGFzaDEpIHsKKwkJZS0+dHJlZSA9IG5ld190cmVlX2NvbnRlbnQoOCk7CisJCWUtPnZlcnNpb25zWzFdLm1vZGUgPSBTX0lGRElSOworCQl0cmVlX2NvbnRlbnRfc2V0KGUsIHNsYXNoMSArIDEsIHNoYTEsIG1vZGUpOworCX0gZWxzZSB7CisJCWUtPnRyZWUgPSBOVUxMOworCQllLT52ZXJzaW9uc1sxXS5tb2RlID0gbW9kZTsKKwkJaGFzaGNweShlLT52ZXJzaW9uc1sxXS5zaGExLCBzaGExKTsKKwl9CisJaGFzaGNscihyb290LT52ZXJzaW9uc1sxXS5zaGExKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0cmVlX2NvbnRlbnRfcmVtb3ZlKHN0cnVjdCB0cmVlX2VudHJ5ICpyb290LCBjb25zdCBjaGFyICpwKQoreworCXN0cnVjdCB0cmVlX2NvbnRlbnQgKnQgPSByb290LT50cmVlOworCWNvbnN0IGNoYXIgKnNsYXNoMTsKKwl1bnNpZ25lZCBpbnQgaSwgbjsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqZTsKKworCXNsYXNoMSA9IHN0cmNocihwLCAnLycpOworCWlmIChzbGFzaDEpCisJCW4gPSBzbGFzaDEgLSBwOworCWVsc2UKKwkJbiA9IHN0cmxlbihwKTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5lbnRyeV9jb3VudDsgaSsrKSB7CisJCWUgPSB0LT5lbnRyaWVzW2ldOworCQlpZiAoZS0+bmFtZS0+c3RyX2xlbiA9PSBuICYmICFzdHJuY21wKHAsIGUtPm5hbWUtPnN0cl9kYXQsIG4pKSB7CisJCQlpZiAoIXNsYXNoMSB8fCAhU19JU0RJUihlLT52ZXJzaW9uc1sxXS5tb2RlKSkKKwkJCQlnb3RvIGRlbF9lbnRyeTsKKwkJCWlmICghZS0+dHJlZSkKKwkJCQlsb2FkX3RyZWUoZSk7CisJCQlpZiAodHJlZV9jb250ZW50X3JlbW92ZShlLCBzbGFzaDEgKyAxKSkgeworCQkJCWZvciAobiA9IDA7IG4gPCBlLT50cmVlLT5lbnRyeV9jb3VudDsgbisrKSB7CisJCQkJCWlmIChlLT50cmVlLT5lbnRyaWVzW25dLT52ZXJzaW9uc1sxXS5tb2RlKSB7CisJCQkJCQloYXNoY2xyKHJvb3QtPnZlcnNpb25zWzFdLnNoYTEpOworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0KKwkJCQl9CisJCQkJZ290byBkZWxfZW50cnk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZGVsX2VudHJ5OgorCWlmIChlLT50cmVlKSB7CisJCXJlbGVhc2VfdHJlZV9jb250ZW50X3JlY3Vyc2l2ZShlLT50cmVlKTsKKwkJZS0+dHJlZSA9IE5VTEw7CisJfQorCWUtPnZlcnNpb25zWzFdLm1vZGUgPSAwOworCWhhc2hjbHIoZS0+dmVyc2lvbnNbMV0uc2hhMSk7CisJaGFzaGNscihyb290LT52ZXJzaW9uc1sxXS5zaGExKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1cGRhdGVfYnJhbmNoKHN0cnVjdCBicmFuY2ggKmIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9ICJmYXN0LWltcG9ydCI7CisJc3RydWN0IHJlZl9sb2NrICpsb2NrOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCisJaWYgKHJlYWRfcmVmKGItPm5hbWUsIG9sZF9zaGExKSkKKwkJaGFzaGNscihvbGRfc2hhMSk7CisJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKGItPm5hbWUsIG9sZF9zaGExKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGxvY2sgJXMiLCBiLT5uYW1lKTsKKwlpZiAoIWZvcmNlX3VwZGF0ZSAmJiAhaXNfbnVsbF9zaGExKG9sZF9zaGExKSkgeworCQlzdHJ1Y3QgY29tbWl0ICpvbGRfY21pdCwgKm5ld19jbWl0OworCisJCW9sZF9jbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KG9sZF9zaGExLCAwKTsKKwkJbmV3X2NtaXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoYi0+c2hhMSwgMCk7CisJCWlmICghb2xkX2NtaXQgfHwgIW5ld19jbWl0KSB7CisJCQl1bmxvY2tfcmVmKGxvY2spOworCQkJcmV0dXJuIGVycm9yKCJCcmFuY2ggJXMgaXMgbWlzc2luZyBjb21taXRzLiIsIGItPm5hbWUpOworCQl9CisKKwkJaWYgKCFpbl9tZXJnZV9iYXNlcyhvbGRfY21pdCwgJm5ld19jbWl0LCAxKSkgeworCQkJdW5sb2NrX3JlZihsb2NrKTsKKwkJCXdhcm5pbmcoIk5vdCB1cGRhdGluZyAlcyIKKwkJCQkiIChuZXcgdGlwICVzIGRvZXMgbm90IGNvbnRhaW4gJXMpIiwKKwkJCQliLT5uYW1lLCBzaGExX3RvX2hleChiLT5zaGExKSwgc2hhMV90b19oZXgob2xkX3NoYTEpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgYi0+c2hhMSwgbXNnKSA8IDApCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHVwZGF0ZSAlcyIsIGItPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2JyYW5jaGVzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJyYW5jaCAqYjsKKworCWZvciAoaSA9IDA7IGkgPCBicmFuY2hfdGFibGVfc3o7IGkrKykgeworCQlmb3IgKGIgPSBicmFuY2hfdGFibGVbaV07IGI7IGIgPSBiLT50YWJsZV9uZXh0X2JyYW5jaCkKKwkJCWZhaWx1cmUgfD0gdXBkYXRlX2JyYW5jaChiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfdGFncyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptc2cgPSAiZmFzdC1pbXBvcnQiOworCXN0cnVjdCB0YWcgKnQ7CisJc3RydWN0IHJlZl9sb2NrICpsb2NrOworCWNoYXIgcmVmX25hbWVbUEFUSF9NQVhdOworCisJZm9yICh0ID0gZmlyc3RfdGFnOyB0OyB0ID0gdC0+bmV4dF90YWcpIHsKKwkJc3ByaW50ZihyZWZfbmFtZSwgInRhZ3MvJXMiLCB0LT5uYW1lKTsKKwkJbG9jayA9IGxvY2tfcmVmX3NoYTEocmVmX25hbWUsIE5VTEwpOworCQlpZiAoIWxvY2sgfHwgd3JpdGVfcmVmX3NoYTEobG9jaywgdC0+c2hhMSwgbXNnKSA8IDApCisJCQlmYWlsdXJlIHw9IGVycm9yKCJVbmFibGUgdG8gdXBkYXRlICVzIiwgcmVmX25hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXJrc19oZWxwZXIoRklMRSAqZiwKKwl1aW50bWF4X3QgYmFzZSwKKwlzdHJ1Y3QgbWFya19zZXQgKm0pCit7CisJdWludG1heF90IGs7CisJaWYgKG0tPnNoaWZ0KSB7CisJCWZvciAoayA9IDA7IGsgPCAxMDI0OyBrKyspIHsKKwkJCWlmIChtLT5kYXRhLnNldHNba10pCisJCQkJZHVtcF9tYXJrc19oZWxwZXIoZiwgKGJhc2UgKyBrKSA8PCBtLT5zaGlmdCwKKwkJCQkJbS0+ZGF0YS5zZXRzW2tdKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoayA9IDA7IGsgPCAxMDI0OyBrKyspIHsKKwkJCWlmIChtLT5kYXRhLm1hcmtlZFtrXSkKKwkJCQlmcHJpbnRmKGYsICI6JSIgUFJJdU1BWCAiICVzXG4iLCBiYXNlICsgaywKKwkJCQkJc2hhMV90b19oZXgobS0+ZGF0YS5tYXJrZWRba10tPnNoYTEpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXJrcyh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIG1hcmtfbG9jazsKKwlpbnQgbWFya19mZDsKKwlGSUxFICpmOworCisJaWYgKCFtYXJrX2ZpbGUpCisJCXJldHVybjsKKworCW1hcmtfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZtYXJrX2xvY2ssIG1hcmtfZmlsZSwgMCk7CisJaWYgKG1hcmtfZmQgPCAwKSB7CisJCWZhaWx1cmUgfD0gZXJyb3IoIlVuYWJsZSB0byB3cml0ZSBtYXJrcyBmaWxlICVzOiAlcyIsCisJCQltYXJrX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlmID0gZmRvcGVuKG1hcmtfZmQsICJ3Iik7CisJaWYgKCFmKSB7CisJCXJvbGxiYWNrX2xvY2tfZmlsZSgmbWFya19sb2NrKTsKKwkJZmFpbHVyZSB8PSBlcnJvcigiVW5hYmxlIHRvIHdyaXRlIG1hcmtzIGZpbGUgJXM6ICVzIiwKKwkJCW1hcmtfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCWR1bXBfbWFya3NfaGVscGVyKGYsIDAsIG1hcmtzKTsKKwlmY2xvc2UoZik7CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUoJm1hcmtfbG9jaykpCisJCWZhaWx1cmUgfD0gZXJyb3IoIlVuYWJsZSB0byB3cml0ZSBtYXJrcyBmaWxlICVzOiAlcyIsCisJCQltYXJrX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfbmV4dF9jb21tYW5kKHZvaWQpCit7CisJcmVhZF9saW5lKCZjb21tYW5kX2J1Ziwgc3RkaW4sICdcbicpOworfQorCitzdGF0aWMgdm9pZCBjbWRfbWFyayh2b2lkKQoreworCWlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgIm1hcmsgOiIpKSB7CisJCW5leHRfbWFyayA9IHN0cnRvdW1heChjb21tYW5kX2J1Zi5idWYgKyA2LCBOVUxMLCAxMCk7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJfQorCWVsc2UKKwkJbmV4dF9tYXJrID0gMDsKK30KKworc3RhdGljIHZvaWQgKmNtZF9kYXRhIChzaXplX3QgKnNpemUpCit7CisJc2l6ZV90IGxlbmd0aDsKKwljaGFyICpidWZmZXI7CisKKwlpZiAocHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgImRhdGEgIikpCisJCWRpZSgiRXhwZWN0ZWQgJ2RhdGEgbicgY29tbWFuZCwgZm91bmQ6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKworCWlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiArIDUsICI8PCIpKSB7CisJCWNoYXIgKnRlcm0gPSB4c3RyZHVwKGNvbW1hbmRfYnVmLmJ1ZiArIDUgKyAyKTsKKwkJc2l6ZV90IHN6ID0gODE5MiwgdGVybV9sZW4gPSBjb21tYW5kX2J1Zi5sZW4gLSA1IC0gMjsKKwkJbGVuZ3RoID0gMDsKKwkJYnVmZmVyID0geG1hbGxvYyhzeik7CisJCWZvciAoOzspIHsKKwkJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJCQlpZiAoY29tbWFuZF9idWYuZW9mKQorCQkJCWRpZSgiRU9GIGluIGRhdGEgKHRlcm1pbmF0b3IgJyVzJyBub3QgZm91bmQpIiwgdGVybSk7CisJCQlpZiAodGVybV9sZW4gPT0gY29tbWFuZF9idWYubGVuCisJCQkJJiYgIXN0cmNtcCh0ZXJtLCBjb21tYW5kX2J1Zi5idWYpKQorCQkJCWJyZWFrOworCQkJaWYgKHN6IDwgKGxlbmd0aCArIGNvbW1hbmRfYnVmLmxlbikpIHsKKwkJCQlzeiA9IHN6ICogMyAvIDIgKyAxNjsKKwkJCQlpZiAoc3ogPCAobGVuZ3RoICsgY29tbWFuZF9idWYubGVuKSkKKwkJCQkJc3ogPSBsZW5ndGggKyBjb21tYW5kX2J1Zi5sZW47CisJCQkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBzeik7CisJCQl9CisJCQltZW1jcHkoYnVmZmVyICsgbGVuZ3RoLAorCQkJCWNvbW1hbmRfYnVmLmJ1ZiwKKwkJCQljb21tYW5kX2J1Zi5sZW4gLSAxKTsKKwkJCWxlbmd0aCArPSBjb21tYW5kX2J1Zi5sZW4gLSAxOworCQkJYnVmZmVyW2xlbmd0aCsrXSA9ICdcbic7CisJCX0KKwkJZnJlZSh0ZXJtKTsKKwl9CisJZWxzZSB7CisJCXNpemVfdCBuID0gMDsKKwkJbGVuZ3RoID0gc3RydG91bChjb21tYW5kX2J1Zi5idWYgKyA1LCBOVUxMLCAxMCk7CisJCWJ1ZmZlciA9IHhtYWxsb2MobGVuZ3RoKTsKKwkJd2hpbGUgKG4gPCBsZW5ndGgpIHsKKwkJCXNpemVfdCBzID0gZnJlYWQoYnVmZmVyICsgbiwgMSwgbGVuZ3RoIC0gbiwgc3RkaW4pOworCQkJaWYgKCFzICYmIGZlb2Yoc3RkaW4pKQorCQkJCWRpZSgiRU9GIGluIGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcpIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKGxlbmd0aCAtIG4pKTsKKwkJCW4gKz0gczsKKwkJfQorCX0KKworCWlmIChmZ2V0YyhzdGRpbikgIT0gJ1xuJykKKwkJZGllKCJBbiBsZiBkaWQgbm90IHRyYWlsIHRoZSBiaW5hcnkgZGF0YSBhcyBleHBlY3RlZC4iKTsKKworCSpzaXplID0gbGVuZ3RoOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfcmF3X2RhdGUoY29uc3QgY2hhciAqc3JjLCBjaGFyICpyZXN1bHQsIGludCBtYXhsZW4pCit7CisJY29uc3QgY2hhciAqb3JpZ19zcmMgPSBzcmM7CisJY2hhciAqZW5kcCwgc2lnbjsKKworCXN0cnRvdWwoc3JjLCAmZW5kcCwgMTApOworCWlmIChlbmRwID09IHNyYyB8fCAqZW5kcCAhPSAnICcpCisJCXJldHVybiAtMTsKKworCXNyYyA9IGVuZHAgKyAxOworCWlmICgqc3JjICE9ICctJyAmJiAqc3JjICE9ICcrJykKKwkJcmV0dXJuIC0xOworCXNpZ24gPSAqc3JjOworCisJc3RydG91bChzcmMgKyAxLCAmZW5kcCwgMTApOworCWlmIChlbmRwID09IHNyYyB8fCAqZW5kcCB8fCAoZW5kcCAtIG9yaWdfc3JjKSA+PSBtYXhsZW4pCisJCXJldHVybiAtMTsKKworCXN0cmNweShyZXN1bHQsIG9yaWdfc3JjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnBhcnNlX2lkZW50KGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwljb25zdCBjaGFyICpndDsKKwlzaXplX3QgbmFtZV9sZW47CisJY2hhciAqaWRlbnQ7CisKKwlndCA9IHN0cnJjaHIoYnVmLCAnPicpOworCWlmICghZ3QpCisJCWRpZSgiTWlzc2luZyA+IGluIGlkZW50IHN0cmluZzogJXMiLCBidWYpOworCWd0Kys7CisJaWYgKCpndCAhPSAnICcpCisJCWRpZSgiTWlzc2luZyBzcGFjZSBhZnRlciA+IGluIGlkZW50IHN0cmluZzogJXMiLCBidWYpOworCWd0Kys7CisJbmFtZV9sZW4gPSBndCAtIGJ1ZjsKKwlpZGVudCA9IHhtYWxsb2MobmFtZV9sZW4gKyAyNCk7CisJc3RybmNweShpZGVudCwgYnVmLCBuYW1lX2xlbik7CisKKwlzd2l0Y2ggKHdoZW5zcGVjKSB7CisJY2FzZSBXSEVOU1BFQ19SQVc6CisJCWlmICh2YWxpZGF0ZV9yYXdfZGF0ZShndCwgaWRlbnQgKyBuYW1lX2xlbiwgMjQpIDwgMCkKKwkJCWRpZSgiSW52YWxpZCByYXcgZGF0ZSBcIiVzXCIgaW4gaWRlbnQ6ICVzIiwgZ3QsIGJ1Zik7CisJCWJyZWFrOworCWNhc2UgV0hFTlNQRUNfUkZDMjgyMjoKKwkJaWYgKHBhcnNlX2RhdGUoZ3QsIGlkZW50ICsgbmFtZV9sZW4sIDI0KSA8IDApCisJCQlkaWUoIkludmFsaWQgcmZjMjgyMiBkYXRlIFwiJXNcIiBpbiBpZGVudDogJXMiLCBndCwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBXSEVOU1BFQ19OT1c6CisJCWlmIChzdHJjbXAoIm5vdyIsIGd0KSkKKwkJCWRpZSgiRGF0ZSBpbiBpZGVudCBtdXN0IGJlICdub3cnOiAlcyIsIGJ1Zik7CisJCWRhdGVzdGFtcChpZGVudCArIG5hbWVfbGVuLCAyNCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpZGVudDsKK30KKworc3RhdGljIHZvaWQgY21kX25ld19ibG9iKHZvaWQpCit7CisJc2l6ZV90IGw7CisJdm9pZCAqZDsKKworCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJY21kX21hcmsoKTsKKwlkID0gY21kX2RhdGEoJmwpOworCisJaWYgKHN0b3JlX29iamVjdChPQkpfQkxPQiwgZCwgbCwgJmxhc3RfYmxvYiwgTlVMTCwgbmV4dF9tYXJrKSkKKwkJZnJlZShkKTsKK30KKworc3RhdGljIHZvaWQgdW5sb2FkX29uZV9icmFuY2godm9pZCkKK3sKKwl3aGlsZSAoY3VyX2FjdGl2ZV9icmFuY2hlcworCQkmJiBjdXJfYWN0aXZlX2JyYW5jaGVzID49IG1heF9hY3RpdmVfYnJhbmNoZXMpIHsKKwkJdWludG1heF90IG1pbl9jb21taXQgPSBVTE9OR19NQVg7CisJCXN0cnVjdCBicmFuY2ggKmUsICpsID0gTlVMTCwgKnAgPSBOVUxMOworCisJCWZvciAoZSA9IGFjdGl2ZV9icmFuY2hlczsgZTsgZSA9IGUtPmFjdGl2ZV9uZXh0X2JyYW5jaCkgeworCQkJaWYgKGUtPmxhc3RfY29tbWl0IDwgbWluX2NvbW1pdCkgeworCQkJCXAgPSBsOworCQkJCW1pbl9jb21taXQgPSBlLT5sYXN0X2NvbW1pdDsKKwkJCX0KKwkJCWwgPSBlOworCQl9CisKKwkJaWYgKHApIHsKKwkJCWUgPSBwLT5hY3RpdmVfbmV4dF9icmFuY2g7CisJCQlwLT5hY3RpdmVfbmV4dF9icmFuY2ggPSBlLT5hY3RpdmVfbmV4dF9icmFuY2g7CisJCX0gZWxzZSB7CisJCQllID0gYWN0aXZlX2JyYW5jaGVzOworCQkJYWN0aXZlX2JyYW5jaGVzID0gZS0+YWN0aXZlX25leHRfYnJhbmNoOworCQl9CisJCWUtPmFjdGl2ZSA9IDA7CisJCWUtPmFjdGl2ZV9uZXh0X2JyYW5jaCA9IE5VTEw7CisJCWlmIChlLT5icmFuY2hfdHJlZS50cmVlKSB7CisJCQlyZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoZS0+YnJhbmNoX3RyZWUudHJlZSk7CisJCQllLT5icmFuY2hfdHJlZS50cmVlID0gTlVMTDsKKwkJfQorCQljdXJfYWN0aXZlX2JyYW5jaGVzLS07CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2FkX2JyYW5jaChzdHJ1Y3QgYnJhbmNoICpiKQoreworCWxvYWRfdHJlZSgmYi0+YnJhbmNoX3RyZWUpOworCWlmICghYi0+YWN0aXZlKSB7CisJCWItPmFjdGl2ZSA9IDE7CisJCWItPmFjdGl2ZV9uZXh0X2JyYW5jaCA9IGFjdGl2ZV9icmFuY2hlczsKKwkJYWN0aXZlX2JyYW5jaGVzID0gYjsKKwkJY3VyX2FjdGl2ZV9icmFuY2hlcysrOworCQlicmFuY2hfbG9hZF9jb3VudCsrOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsZV9jaGFuZ2VfbShzdHJ1Y3QgYnJhbmNoICpiKQoreworCWNvbnN0IGNoYXIgKnAgPSBjb21tYW5kX2J1Zi5idWYgKyAyOworCWNoYXIgKnBfdXE7CisJY29uc3QgY2hhciAqZW5kcDsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZSA9IG9lOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdWludDE2X3QgbW9kZSwgaW5saW5lX2RhdGEgPSAwOworCisJcCA9IGdldF9tb2RlKHAsICZtb2RlKTsKKwlpZiAoIXApCisJCWRpZSgiQ29ycnVwdCBtb2RlOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBTX0lGUkVHIHwgMDY0NDoKKwljYXNlIFNfSUZSRUcgfCAwNzU1OgorCWNhc2UgU19JRkxOSzoKKwljYXNlIDA2NDQ6CisJY2FzZSAwNzU1OgorCQkvKiBvayAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoIkNvcnJ1cHQgbW9kZTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCX0KKworCWlmICgqcCA9PSAnOicpIHsKKwkJY2hhciAqeDsKKwkJb2UgPSBmaW5kX21hcmsoc3RydG91bWF4KHAgKyAxLCAmeCwgMTApKTsKKwkJaGFzaGNweShzaGExLCBvZS0+c2hhMSk7CisJCXAgPSB4OworCX0gZWxzZSBpZiAoIXByZWZpeGNtcChwLCAiaW5saW5lIikpIHsKKwkJaW5saW5lX2RhdGEgPSAxOworCQlwICs9IDY7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9zaGExX2hleChwLCBzaGExKSkKKwkJCWRpZSgiSW52YWxpZCBTSEExOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJCW9lID0gZmluZF9vYmplY3Qoc2hhMSk7CisJCXAgKz0gNDA7CisJfQorCWlmICgqcCsrICE9ICcgJykKKwkJZGllKCJNaXNzaW5nIHNwYWNlIGFmdGVyIFNIQTE6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKworCXBfdXEgPSB1bnF1b3RlX2Nfc3R5bGUocCwgJmVuZHApOworCWlmIChwX3VxKSB7CisJCWlmICgqZW5kcCkKKwkJCWRpZSgiR2FyYmFnZSBhZnRlciBwYXRoIGluOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJCXAgPSBwX3VxOworCX0KKworCWlmIChpbmxpbmVfZGF0YSkgeworCQlzaXplX3QgbDsKKwkJdm9pZCAqZDsKKwkJaWYgKCFwX3VxKQorCQkJcCA9IHBfdXEgPSB4c3RyZHVwKHApOworCQlyZWFkX25leHRfY29tbWFuZCgpOworCQlkID0gY21kX2RhdGEoJmwpOworCQlpZiAoc3RvcmVfb2JqZWN0KE9CSl9CTE9CLCBkLCBsLCAmbGFzdF9ibG9iLCBzaGExLCAwKSkKKwkJCWZyZWUoZCk7CisJfSBlbHNlIGlmIChvZSkgeworCQlpZiAob2UtPnR5cGUgIT0gT0JKX0JMT0IpCisJCQlkaWUoIk5vdCBhIGJsb2IgKGFjdHVhbGx5IGEgJXMpOiAlcyIsCisJCQkJY29tbWFuZF9idWYuYnVmLCB0eXBlbmFtZShvZS0+dHlwZSkpOworCX0gZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgTlVMTCk7CisJCWlmICh0eXBlIDwgMCkKKwkJCWRpZSgiQmxvYiBub3QgZm91bmQ6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwkJaWYgKHR5cGUgIT0gT0JKX0JMT0IpCisJCQlkaWUoIk5vdCBhIGJsb2IgKGFjdHVhbGx5IGEgJXMpOiAlcyIsCisJCQkgICAgdHlwZW5hbWUodHlwZSksIGNvbW1hbmRfYnVmLmJ1Zik7CisJfQorCisJdHJlZV9jb250ZW50X3NldCgmYi0+YnJhbmNoX3RyZWUsIHAsIHNoYTEsIFNfSUZSRUcgfCBtb2RlKTsKKwlmcmVlKHBfdXEpOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZV9kKHN0cnVjdCBicmFuY2ggKmIpCit7CisJY29uc3QgY2hhciAqcCA9IGNvbW1hbmRfYnVmLmJ1ZiArIDI7CisJY2hhciAqcF91cTsKKwljb25zdCBjaGFyICplbmRwOworCisJcF91cSA9IHVucXVvdGVfY19zdHlsZShwLCAmZW5kcCk7CisJaWYgKHBfdXEpIHsKKwkJaWYgKCplbmRwKQorCQkJZGllKCJHYXJiYWdlIGFmdGVyIHBhdGggaW46ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwkJcCA9IHBfdXE7CisJfQorCXRyZWVfY29udGVudF9yZW1vdmUoJmItPmJyYW5jaF90cmVlLCBwKTsKKwlmcmVlKHBfdXEpOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZV9kZWxldGVhbGwoc3RydWN0IGJyYW5jaCAqYikKK3sKKwlyZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoYi0+YnJhbmNoX3RyZWUudHJlZSk7CisJaGFzaGNscihiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExKTsKKwloYXNoY2xyKGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTEpOworCWxvYWRfdHJlZSgmYi0+YnJhbmNoX3RyZWUpOworfQorCitzdGF0aWMgdm9pZCBjbWRfZnJvbV9jb21taXQoc3RydWN0IGJyYW5jaCAqYiwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKCFidWYgfHwgc2l6ZSA8IDQ2KQorCQlkaWUoIk5vdCBhIHZhbGlkIGNvbW1pdDogJXMiLCBzaGExX3RvX2hleChiLT5zaGExKSk7CisJaWYgKG1lbWNtcCgidHJlZSAiLCBidWYsIDUpCisJCXx8IGdldF9zaGExX2hleChidWYgKyA1LCBiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKSkKKwkJZGllKCJUaGUgY29tbWl0ICVzIGlzIGNvcnJ1cHQiLCBzaGExX3RvX2hleChiLT5zaGExKSk7CisJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExLAorCQliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKTsKK30KKworc3RhdGljIHZvaWQgY21kX2Zyb21fZXhpc3Rpbmcoc3RydWN0IGJyYW5jaCAqYikKK3sKKwlpZiAoaXNfbnVsbF9zaGExKGItPnNoYTEpKSB7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMF0uc2hhMSk7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMV0uc2hhMSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyICpidWY7CisKKwkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoYi0+c2hhMSwKKwkJCWNvbW1pdF90eXBlLCAmc2l6ZSwgYi0+c2hhMSk7CisJCWNtZF9mcm9tX2NvbW1pdChiLCBidWYsIHNpemUpOworCQlmcmVlKGJ1Zik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbWRfZnJvbShzdHJ1Y3QgYnJhbmNoICpiKQoreworCWNvbnN0IGNoYXIgKmZyb207CisJc3RydWN0IGJyYW5jaCAqczsKKworCWlmIChwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAiZnJvbSAiKSkKKwkJcmV0dXJuOworCisJaWYgKGItPmJyYW5jaF90cmVlLnRyZWUpIHsKKwkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGItPmJyYW5jaF90cmVlLnRyZWUpOworCQliLT5icmFuY2hfdHJlZS50cmVlID0gTlVMTDsKKwl9CisKKwlmcm9tID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJcyA9IGxvb2t1cF9icmFuY2goZnJvbSk7CisJaWYgKGIgPT0gcykKKwkJZGllKCJDYW4ndCBjcmVhdGUgYSBicmFuY2ggZnJvbSBpdHNlbGY6ICVzIiwgYi0+bmFtZSk7CisJZWxzZSBpZiAocykgeworCQl1bnNpZ25lZCBjaGFyICp0ID0gcy0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMV0uc2hhMTsKKwkJaGFzaGNweShiLT5zaGExLCBzLT5zaGExKTsKKwkJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExLCB0KTsKKwkJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExLCB0KTsKKwl9IGVsc2UgaWYgKCpmcm9tID09ICc6JykgeworCQl1aW50bWF4X3QgaWRudW0gPSBzdHJ0b3VtYXgoZnJvbSArIDEsIE5VTEwsIDEwKTsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2UgPSBmaW5kX21hcmsoaWRudW0pOworCQlpZiAob2UtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJCWRpZSgiTWFyayA6JSIgUFJJdU1BWCAiIG5vdCBhIGNvbW1pdCIsIGlkbnVtKTsKKwkJaGFzaGNweShiLT5zaGExLCBvZS0+c2hhMSk7CisJCWlmIChvZS0+cGFja19pZCAhPSBNQVhfUEFDS19JRCkgeworCQkJdW5zaWduZWQgbG9uZyBzaXplOworCQkJY2hhciAqYnVmID0gZ2ZpX3VucGFja19lbnRyeShvZSwgJnNpemUpOworCQkJY21kX2Zyb21fY29tbWl0KGIsIGJ1Ziwgc2l6ZSk7CisJCQlmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJY21kX2Zyb21fZXhpc3RpbmcoYik7CisJfSBlbHNlIGlmICghZ2V0X3NoYTEoZnJvbSwgYi0+c2hhMSkpCisJCWNtZF9mcm9tX2V4aXN0aW5nKGIpOworCWVsc2UKKwkJZGllKCJJbnZhbGlkIHJlZiBuYW1lIG9yIFNIQTEgZXhwcmVzc2lvbjogJXMiLCBmcm9tKTsKKworCXJlYWRfbmV4dF9jb21tYW5kKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9saXN0ICpjbWRfbWVyZ2UodW5zaWduZWQgaW50ICpjb3VudCkKK3sKKwlzdHJ1Y3QgaGFzaF9saXN0ICpsaXN0ID0gTlVMTCwgKm4sICplID0gZTsKKwljb25zdCBjaGFyICpmcm9tOworCXN0cnVjdCBicmFuY2ggKnM7CisKKwkqY291bnQgPSAwOworCXdoaWxlICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgIm1lcmdlICIpKSB7CisJCWZyb20gPSBzdHJjaHIoY29tbWFuZF9idWYuYnVmLCAnICcpICsgMTsKKwkJbiA9IHhtYWxsb2Moc2l6ZW9mKCpuKSk7CisJCXMgPSBsb29rdXBfYnJhbmNoKGZyb20pOworCQlpZiAocykKKwkJCWhhc2hjcHkobi0+c2hhMSwgcy0+c2hhMSk7CisJCWVsc2UgaWYgKCpmcm9tID09ICc6JykgeworCQkJdWludG1heF90IGlkbnVtID0gc3RydG91bWF4KGZyb20gKyAxLCBOVUxMLCAxMCk7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZSA9IGZpbmRfbWFyayhpZG51bSk7CisJCQlpZiAob2UtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJCQlkaWUoIk1hcmsgOiUiIFBSSXVNQVggIiBub3QgYSBjb21taXQiLCBpZG51bSk7CisJCQloYXNoY3B5KG4tPnNoYTEsIG9lLT5zaGExKTsKKwkJfSBlbHNlIGlmICghZ2V0X3NoYTEoZnJvbSwgbi0+c2hhMSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJCWNoYXIgKmJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG4tPnNoYTEsCisJCQkJY29tbWl0X3R5cGUsICZzaXplLCBuLT5zaGExKTsKKwkJCWlmICghYnVmIHx8IHNpemUgPCA0NikKKwkJCQlkaWUoIk5vdCBhIHZhbGlkIGNvbW1pdDogJXMiLCBmcm9tKTsKKwkJCWZyZWUoYnVmKTsKKwkJfSBlbHNlCisJCQlkaWUoIkludmFsaWQgcmVmIG5hbWUgb3IgU0hBMSBleHByZXNzaW9uOiAlcyIsIGZyb20pOworCisJCW4tPm5leHQgPSBOVUxMOworCQlpZiAobGlzdCkKKwkJCWUtPm5leHQgPSBuOworCQllbHNlCisJCQlsaXN0ID0gbjsKKwkJZSA9IG47CisJCSgqY291bnQpKys7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJfQorCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgdm9pZCBjbWRfbmV3X2NvbW1pdCh2b2lkKQoreworCXN0cnVjdCBicmFuY2ggKmI7CisJdm9pZCAqbXNnOworCXNpemVfdCBtc2dsZW47CisJY2hhciAqc3A7CisJY2hhciAqYXV0aG9yID0gTlVMTDsKKwljaGFyICpjb21taXR0ZXIgPSBOVUxMOworCXN0cnVjdCBoYXNoX2xpc3QgKm1lcmdlX2xpc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCBtZXJnZV9jb3VudDsKKworCS8qIE9idGFpbiB0aGUgYnJhbmNoIG5hbWUgZnJvbSB0aGUgcmVzdCBvZiBvdXIgY29tbWFuZCAqLworCXNwID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJYiA9IGxvb2t1cF9icmFuY2goc3ApOworCWlmICghYikKKwkJYiA9IG5ld19icmFuY2goc3ApOworCisJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKwljbWRfbWFyaygpOworCWlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgImF1dGhvciAiKSkgeworCQlhdXRob3IgPSBwYXJzZV9pZGVudChjb21tYW5kX2J1Zi5idWYgKyA3KTsKKwkJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKwl9CisJaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAiY29tbWl0dGVyICIpKSB7CisJCWNvbW1pdHRlciA9IHBhcnNlX2lkZW50KGNvbW1hbmRfYnVmLmJ1ZiArIDEwKTsKKwkJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKwl9CisJaWYgKCFjb21taXR0ZXIpCisJCWRpZSgiRXhwZWN0ZWQgY29tbWl0dGVyIGJ1dCBkaWRuJ3QgZ2V0IG9uZSIpOworCW1zZyA9IGNtZF9kYXRhKCZtc2dsZW4pOworCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJY21kX2Zyb20oYik7CisJbWVyZ2VfbGlzdCA9IGNtZF9tZXJnZSgmbWVyZ2VfY291bnQpOworCisJLyogZW5zdXJlIHRoZSBicmFuY2ggaXMgYWN0aXZlL2xvYWRlZCAqLworCWlmICghYi0+YnJhbmNoX3RyZWUudHJlZSB8fCAhbWF4X2FjdGl2ZV9icmFuY2hlcykgeworCQl1bmxvYWRfb25lX2JyYW5jaCgpOworCQlsb2FkX2JyYW5jaChiKTsKKwl9CisKKwkvKiBmaWxlX2NoYW5nZSogKi8KKwlmb3IgKDs7KSB7CisJCWlmICgxID09IGNvbW1hbmRfYnVmLmxlbikKKwkJCWJyZWFrOworCQllbHNlIGlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgIk0gIikpCisJCQlmaWxlX2NoYW5nZV9tKGIpOworCQllbHNlIGlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgIkQgIikpCisJCQlmaWxlX2NoYW5nZV9kKGIpOworCQllbHNlIGlmICghc3RyY21wKCJkZWxldGVhbGwiLCBjb21tYW5kX2J1Zi5idWYpKQorCQkJZmlsZV9jaGFuZ2VfZGVsZXRlYWxsKGIpOworCQllbHNlCisJCQlkaWUoIlVuc3VwcG9ydGVkIGZpbGVfY2hhbmdlOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJfQorCisJLyogYnVpbGQgdGhlIHRyZWUgYW5kIHRoZSBjb21taXQgKi8KKwlzdG9yZV90cmVlKCZiLT5icmFuY2hfdHJlZSk7CisJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExLAorCQliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKTsKKwlzaXplX2RidWYoJm5ld19kYXRhLCAxMTQgKyBtc2dsZW4KKwkJKyBtZXJnZV9jb3VudCAqIDQ5CisJCSsgKGF1dGhvcgorCQkJPyBzdHJsZW4oYXV0aG9yKSArIHN0cmxlbihjb21taXR0ZXIpCisJCQk6IDIgKiBzdHJsZW4oY29tbWl0dGVyKSkpOworCXNwID0gbmV3X2RhdGEuYnVmZmVyOworCXNwICs9IHNwcmludGYoc3AsICJ0cmVlICVzXG4iLAorCQlzaGExX3RvX2hleChiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKSk7CisJaWYgKCFpc19udWxsX3NoYTEoYi0+c2hhMSkpCisJCXNwICs9IHNwcmludGYoc3AsICJwYXJlbnQgJXNcbiIsIHNoYTFfdG9faGV4KGItPnNoYTEpKTsKKwl3aGlsZSAobWVyZ2VfbGlzdCkgeworCQlzdHJ1Y3QgaGFzaF9saXN0ICpuZXh0ID0gbWVyZ2VfbGlzdC0+bmV4dDsKKwkJc3AgKz0gc3ByaW50ZihzcCwgInBhcmVudCAlc1xuIiwgc2hhMV90b19oZXgobWVyZ2VfbGlzdC0+c2hhMSkpOworCQlmcmVlKG1lcmdlX2xpc3QpOworCQltZXJnZV9saXN0ID0gbmV4dDsKKwl9CisJc3AgKz0gc3ByaW50ZihzcCwgImF1dGhvciAlc1xuIiwgYXV0aG9yID8gYXV0aG9yIDogY29tbWl0dGVyKTsKKwlzcCArPSBzcHJpbnRmKHNwLCAiY29tbWl0dGVyICVzXG4iLCBjb21taXR0ZXIpOworCSpzcCsrID0gJ1xuJzsKKwltZW1jcHkoc3AsIG1zZywgbXNnbGVuKTsKKwlzcCArPSBtc2dsZW47CisJZnJlZShhdXRob3IpOworCWZyZWUoY29tbWl0dGVyKTsKKwlmcmVlKG1zZyk7CisKKwlpZiAoIXN0b3JlX29iamVjdChPQkpfQ09NTUlULAorCQluZXdfZGF0YS5idWZmZXIsIHNwIC0gKGNoYXIqKW5ld19kYXRhLmJ1ZmZlciwKKwkJTlVMTCwgYi0+c2hhMSwgbmV4dF9tYXJrKSkKKwkJYi0+cGFja19pZCA9IHBhY2tfaWQ7CisJYi0+bGFzdF9jb21taXQgPSBvYmplY3RfY291bnRfYnlfdHlwZVtPQkpfQ09NTUlUXTsKK30KKworc3RhdGljIHZvaWQgY21kX25ld190YWcodm9pZCkKK3sKKwljaGFyICpzcDsKKwljb25zdCBjaGFyICpmcm9tOworCWNoYXIgKnRhZ2dlcjsKKwlzdHJ1Y3QgYnJhbmNoICpzOworCXZvaWQgKm1zZzsKKwlzaXplX3QgbXNnbGVuOworCXN0cnVjdCB0YWcgKnQ7CisJdWludG1heF90IGZyb21fbWFyayA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCS8qIE9idGFpbiB0aGUgbmV3IHRhZyBuYW1lIGZyb20gdGhlIHJlc3Qgb2Ygb3VyIGNvbW1hbmQgKi8KKwlzcCA9IHN0cmNocihjb21tYW5kX2J1Zi5idWYsICcgJykgKyAxOworCXQgPSBwb29sX2FsbG9jKHNpemVvZihzdHJ1Y3QgdGFnKSk7CisJdC0+bmV4dF90YWcgPSBOVUxMOworCXQtPm5hbWUgPSBwb29sX3N0cmR1cChzcCk7CisJaWYgKGxhc3RfdGFnKQorCQlsYXN0X3RhZy0+bmV4dF90YWcgPSB0OworCWVsc2UKKwkJZmlyc3RfdGFnID0gdDsKKwlsYXN0X3RhZyA9IHQ7CisJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKworCS8qIGZyb20gLi4uICovCisJaWYgKHByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJmcm9tICIpKQorCQlkaWUoIkV4cGVjdGVkIGZyb20gY29tbWFuZCwgZ290ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwlmcm9tID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJcyA9IGxvb2t1cF9icmFuY2goZnJvbSk7CisJaWYgKHMpIHsKKwkJaGFzaGNweShzaGExLCBzLT5zaGExKTsKKwl9IGVsc2UgaWYgKCpmcm9tID09ICc6JykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZTsKKwkJZnJvbV9tYXJrID0gc3RydG91bWF4KGZyb20gKyAxLCBOVUxMLCAxMCk7CisJCW9lID0gZmluZF9tYXJrKGZyb21fbWFyayk7CisJCWlmIChvZS0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQkJZGllKCJNYXJrIDolIiBQUkl1TUFYICIgbm90IGEgY29tbWl0IiwgZnJvbV9tYXJrKTsKKwkJaGFzaGNweShzaGExLCBvZS0+c2hhMSk7CisJfSBlbHNlIGlmICghZ2V0X3NoYTEoZnJvbSwgc2hhMSkpIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyICpidWY7CisKKwkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwKKwkJCWNvbW1pdF90eXBlLCAmc2l6ZSwgc2hhMSk7CisJCWlmICghYnVmIHx8IHNpemUgPCA0NikKKwkJCWRpZSgiTm90IGEgdmFsaWQgY29tbWl0OiAlcyIsIGZyb20pOworCQlmcmVlKGJ1Zik7CisJfSBlbHNlCisJCWRpZSgiSW52YWxpZCByZWYgbmFtZSBvciBTSEExIGV4cHJlc3Npb246ICVzIiwgZnJvbSk7CisJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKworCS8qIHRhZ2dlciAuLi4gKi8KKwlpZiAocHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgInRhZ2dlciAiKSkKKwkJZGllKCJFeHBlY3RlZCB0YWdnZXIgY29tbWFuZCwgZ290ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwl0YWdnZXIgPSBwYXJzZV9pZGVudChjb21tYW5kX2J1Zi5idWYgKyA3KTsKKworCS8qIHRhZyBwYXlsb2FkL21lc3NhZ2UgKi8KKwlyZWFkX25leHRfY29tbWFuZCgpOworCW1zZyA9IGNtZF9kYXRhKCZtc2dsZW4pOworCisJLyogYnVpbGQgdGhlIHRhZyBvYmplY3QgKi8KKwlzaXplX2RidWYoJm5ld19kYXRhLCA2NytzdHJsZW4odC0+bmFtZSkrc3RybGVuKHRhZ2dlcikrbXNnbGVuKTsKKwlzcCA9IG5ld19kYXRhLmJ1ZmZlcjsKKwlzcCArPSBzcHJpbnRmKHNwLCAib2JqZWN0ICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJc3AgKz0gc3ByaW50ZihzcCwgInR5cGUgJXNcbiIsIGNvbW1pdF90eXBlKTsKKwlzcCArPSBzcHJpbnRmKHNwLCAidGFnICVzXG4iLCB0LT5uYW1lKTsKKwlzcCArPSBzcHJpbnRmKHNwLCAidGFnZ2VyICVzXG4iLCB0YWdnZXIpOworCSpzcCsrID0gJ1xuJzsKKwltZW1jcHkoc3AsIG1zZywgbXNnbGVuKTsKKwlzcCArPSBtc2dsZW47CisJZnJlZSh0YWdnZXIpOworCWZyZWUobXNnKTsKKworCWlmIChzdG9yZV9vYmplY3QoT0JKX1RBRywgbmV3X2RhdGEuYnVmZmVyLAorCQlzcCAtIChjaGFyKiluZXdfZGF0YS5idWZmZXIsCisJCU5VTEwsIHQtPnNoYTEsIDApKQorCQl0LT5wYWNrX2lkID0gTUFYX1BBQ0tfSUQ7CisJZWxzZQorCQl0LT5wYWNrX2lkID0gcGFja19pZDsKK30KKworc3RhdGljIHZvaWQgY21kX3Jlc2V0X2JyYW5jaCh2b2lkKQoreworCXN0cnVjdCBicmFuY2ggKmI7CisJY2hhciAqc3A7CisKKwkvKiBPYnRhaW4gdGhlIGJyYW5jaCBuYW1lIGZyb20gdGhlIHJlc3Qgb2Ygb3VyIGNvbW1hbmQgKi8KKwlzcCA9IHN0cmNocihjb21tYW5kX2J1Zi5idWYsICcgJykgKyAxOworCWIgPSBsb29rdXBfYnJhbmNoKHNwKTsKKwlpZiAoYikgeworCQloYXNoY2xyKGItPnNoYTEpOworCQloYXNoY2xyKGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzBdLnNoYTEpOworCQloYXNoY2xyKGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTEpOworCQlpZiAoYi0+YnJhbmNoX3RyZWUudHJlZSkgeworCQkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGItPmJyYW5jaF90cmVlLnRyZWUpOworCQkJYi0+YnJhbmNoX3RyZWUudHJlZSA9IE5VTEw7CisJCX0KKwl9CisJZWxzZQorCQliID0gbmV3X2JyYW5jaChzcCk7CisJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKwljbWRfZnJvbShiKTsKK30KKworc3RhdGljIHZvaWQgY21kX2NoZWNrcG9pbnQodm9pZCkKK3sKKwlpZiAob2JqZWN0X2NvdW50KSB7CisJCWN5Y2xlX3BhY2tmaWxlKCk7CisJCWR1bXBfYnJhbmNoZXMoKTsKKwkJZHVtcF90YWdzKCk7CisJCWR1bXBfbWFya3MoKTsKKwl9CisJcmVhZF9uZXh0X2NvbW1hbmQoKTsKK30KKworc3RhdGljIHZvaWQgaW1wb3J0X21hcmtzKGNvbnN0IGNoYXIgKmlucHV0X2ZpbGUpCit7CisJY2hhciBsaW5lWzUxMl07CisJRklMRSAqZiA9IGZvcGVuKGlucHV0X2ZpbGUsICJyIik7CisJaWYgKCFmKQorCQlkaWUoImNhbm5vdCByZWFkICVzOiAlcyIsIGlucHV0X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJdWludG1heF90IG1hcms7CisJCWNoYXIgKmVuZDsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZTsKKworCQllbmQgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJCWlmIChsaW5lWzBdICE9ICc6JyB8fCAhZW5kKQorCQkJZGllKCJjb3JydXB0IG1hcmsgbGluZTogJXMiLCBsaW5lKTsKKwkJKmVuZCA9IDA7CisJCW1hcmsgPSBzdHJ0b3VtYXgobGluZSArIDEsICZlbmQsIDEwKTsKKwkJaWYgKCFtYXJrIHx8IGVuZCA9PSBsaW5lICsgMQorCQkJfHwgKmVuZCAhPSAnICcgfHwgZ2V0X3NoYTEoZW5kICsgMSwgc2hhMSkpCisJCQlkaWUoImNvcnJ1cHQgbWFyayBsaW5lOiAlcyIsIGxpbmUpOworCQllID0gZmluZF9vYmplY3Qoc2hhMSk7CisJCWlmICghZSkgeworCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwkJCWlmICh0eXBlIDwgMCkKKwkJCQlkaWUoIm9iamVjdCBub3QgZm91bmQ6ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJZSA9IGluc2VydF9vYmplY3Qoc2hhMSk7CisJCQllLT50eXBlID0gdHlwZTsKKwkJCWUtPnBhY2tfaWQgPSBNQVhfUEFDS19JRDsKKwkJCWUtPm9mZnNldCA9IDE7IC8qIGp1c3Qgbm90IHplcm8hICovCisJCX0KKwkJaW5zZXJ0X21hcmsobWFyaywgZSk7CisJfQorCWZjbG9zZShmKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgZmFzdF9pbXBvcnRfdXNhZ2VbXSA9CisiZ2l0LWZhc3QtaW1wb3J0IFstLWRhdGUtZm9ybWF0PWZdIFstLW1heC1wYWNrLXNpemU9bl0gWy0tZGVwdGg9bl0gWy0tYWN0aXZlLWJyYW5jaGVzPW5dIFstLWV4cG9ydC1tYXJrcz1tYXJrcy5maWxlXSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgc2hvd19zdGF0cyA9IDE7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJYWxsb2Nfb2JqZWN0cyhvYmplY3RfZW50cnlfYWxsb2MpOworCXN0cmJ1Zl9pbml0KCZjb21tYW5kX2J1Zik7CisJYXRvbV90YWJsZSA9IHhjYWxsb2MoYXRvbV90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBhdG9tX3N0ciopKTsKKwlicmFuY2hfdGFibGUgPSB4Y2FsbG9jKGJyYW5jaF90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBicmFuY2gqKSk7CisJYXZhaWxfdHJlZV90YWJsZSA9IHhjYWxsb2MoYXZhaWxfdHJlZV90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQqKSk7CisJbWFya3MgPSBwb29sX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1hcmtfc2V0KSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmEgPSBhcmd2W2ldOworCisJCWlmICgqYSAhPSAnLScgfHwgIXN0cmNtcChhLCAiLS0iKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWRhdGUtZm9ybWF0PSIpKSB7CisJCQljb25zdCBjaGFyICpmbXQgPSBhICsgMTQ7CisJCQlpZiAoIXN0cmNtcChmbXQsICJyYXciKSkKKwkJCQl3aGVuc3BlYyA9IFdIRU5TUEVDX1JBVzsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoZm10LCAicmZjMjgyMiIpKQorCQkJCXdoZW5zcGVjID0gV0hFTlNQRUNfUkZDMjgyMjsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoZm10LCAibm93IikpCisJCQkJd2hlbnNwZWMgPSBXSEVOU1BFQ19OT1c7CisJCQllbHNlCisJCQkJZGllKCJ1bmtub3duIC0tZGF0ZS1mb3JtYXQgYXJndW1lbnQgJXMiLCBmbXQpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYSwgIi0tbWF4LXBhY2stc2l6ZT0iKSkKKwkJCW1heF9wYWNrc2l6ZSA9IHN0cnRvdW1heChhICsgMTYsIE5VTEwsIDApICogMTAyNCAqIDEwMjQ7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYSwgIi0tZGVwdGg9IikpCisJCQltYXhfZGVwdGggPSBzdHJ0b3VsKGEgKyA4LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhLCAiLS1hY3RpdmUtYnJhbmNoZXM9IikpCisJCQltYXhfYWN0aXZlX2JyYW5jaGVzID0gc3RydG91bChhICsgMTgsIE5VTEwsIDApOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWltcG9ydC1tYXJrcz0iKSkKKwkJCWltcG9ydF9tYXJrcyhhICsgMTUpOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWV4cG9ydC1tYXJrcz0iKSkKKwkJCW1hcmtfZmlsZSA9IGEgKyAxNTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhLCAiLS1leHBvcnQtcGFjay1lZGdlcz0iKSkgeworCQkJaWYgKHBhY2tfZWRnZXMpCisJCQkJZmNsb3NlKHBhY2tfZWRnZXMpOworCQkJcGFja19lZGdlcyA9IGZvcGVuKGEgKyAyMCwgImEiKTsKKwkJCWlmICghcGFja19lZGdlcykKKwkJCQlkaWUoIkNhbm5vdCBvcGVuICVzOiAlcyIsIGEgKyAyMCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGEsICItLWZvcmNlIikpCisJCQlmb3JjZV91cGRhdGUgPSAxOworCQllbHNlIGlmICghc3RyY21wKGEsICItLXF1aWV0IikpCisJCQlzaG93X3N0YXRzID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhLCAiLS1zdGF0cyIpKQorCQkJc2hvd19zdGF0cyA9IDE7CisJCWVsc2UKKwkJCWRpZSgidW5rbm93biBvcHRpb24gJXMiLCBhKTsKKwl9CisJaWYgKGkgIT0gYXJnYykKKwkJdXNhZ2UoZmFzdF9pbXBvcnRfdXNhZ2UpOworCisJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJc3RhcnRfcGFja2ZpbGUoKTsKKwlmb3IgKDs7KSB7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJCWlmIChjb21tYW5kX2J1Zi5lb2YpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiYmxvYiIsIGNvbW1hbmRfYnVmLmJ1ZikpCisJCQljbWRfbmV3X2Jsb2IoKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJjb21taXQgIikpCisJCQljbWRfbmV3X2NvbW1pdCgpOworCQllbHNlIGlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgInRhZyAiKSkKKwkJCWNtZF9uZXdfdGFnKCk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAicmVzZXQgIikpCisJCQljbWRfcmVzZXRfYnJhbmNoKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoImNoZWNrcG9pbnQiLCBjb21tYW5kX2J1Zi5idWYpKQorCQkJY21kX2NoZWNrcG9pbnQoKTsKKwkJZWxzZQorCQkJZGllKCJVbnN1cHBvcnRlZCBjb21tYW5kOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJfQorCWVuZF9wYWNrZmlsZSgpOworCisJZHVtcF9icmFuY2hlcygpOworCWR1bXBfdGFncygpOworCXVua2VlcF9hbGxfcGFja3MoKTsKKwlkdW1wX21hcmtzKCk7CisKKwlpZiAocGFja19lZGdlcykKKwkJZmNsb3NlKHBhY2tfZWRnZXMpOworCisJaWYgKHNob3dfc3RhdHMpIHsKKwkJdWludG1heF90IHRvdGFsX2NvdW50ID0gMCwgZHVwbGljYXRlX2NvdW50ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2JqZWN0X2NvdW50X2J5X3R5cGUpOyBpKyspCisJCQl0b3RhbF9jb3VudCArPSBvYmplY3RfY291bnRfYnlfdHlwZVtpXTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHVwbGljYXRlX2NvdW50X2J5X3R5cGUpOyBpKyspCisJCQlkdXBsaWNhdGVfY291bnQgKz0gZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbaV07CisKKwkJZnByaW50ZihzdGRlcnIsICIlcyBzdGF0aXN0aWNzOlxuIiwgYXJndlswXSk7CisJCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJBbGxvYydkIG9iamVjdHM6ICUxMCIgUFJJdU1BWCAiXG4iLCBhbGxvY19jb3VudCk7CisJCWZwcmludGYoc3RkZXJyLCAiVG90YWwgb2JqZWN0czogICAlMTAiIFBSSXVNQVggIiAoJTEwIiBQUkl1TUFYICIgZHVwbGljYXRlcyAgICAgICAgICAgICAgICAgIClcbiIsIHRvdGFsX2NvdW50LCBkdXBsaWNhdGVfY291bnQpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIGJsb2JzICA6ICAgJTEwIiBQUkl1TUFYICIgKCUxMCIgUFJJdU1BWCAiIGR1cGxpY2F0ZXMgJTEwIiBQUkl1TUFYICIgZGVsdGFzKVxuIiwgb2JqZWN0X2NvdW50X2J5X3R5cGVbT0JKX0JMT0JdLCBkdXBsaWNhdGVfY291bnRfYnlfdHlwZVtPQkpfQkxPQl0sIGRlbHRhX2NvdW50X2J5X3R5cGVbT0JKX0JMT0JdKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICB0cmVlcyAgOiAgICUxMCIgUFJJdU1BWCAiICglMTAiIFBSSXVNQVggIiBkdXBsaWNhdGVzICUxMCIgUFJJdU1BWCAiIGRlbHRhcylcbiIsIG9iamVjdF9jb3VudF9ieV90eXBlW09CSl9UUkVFXSwgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbT0JKX1RSRUVdLCBkZWx0YV9jb3VudF9ieV90eXBlW09CSl9UUkVFXSk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgY29tbWl0czogICAlMTAiIFBSSXVNQVggIiAoJTEwIiBQUkl1TUFYICIgZHVwbGljYXRlcyAlMTAiIFBSSXVNQVggIiBkZWx0YXMpXG4iLCBvYmplY3RfY291bnRfYnlfdHlwZVtPQkpfQ09NTUlUXSwgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbT0JKX0NPTU1JVF0sIGRlbHRhX2NvdW50X2J5X3R5cGVbT0JKX0NPTU1JVF0pOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIHRhZ3MgICA6ICAgJTEwIiBQUkl1TUFYICIgKCUxMCIgUFJJdU1BWCAiIGR1cGxpY2F0ZXMgJTEwIiBQUkl1TUFYICIgZGVsdGFzKVxuIiwgb2JqZWN0X2NvdW50X2J5X3R5cGVbT0JKX1RBR10sIGR1cGxpY2F0ZV9jb3VudF9ieV90eXBlW09CSl9UQUddLCBkZWx0YV9jb3VudF9ieV90eXBlW09CSl9UQUddKTsKKwkJZnByaW50ZihzdGRlcnIsICJUb3RhbCBicmFuY2hlczogICUxMGx1ICglMTBsdSBsb2FkcyAgICAgKVxuIiwgYnJhbmNoX2NvdW50LCBicmFuY2hfbG9hZF9jb3VudCk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgbWFya3M6ICAgICAlMTAiIFBSSXVNQVggIiAoJTEwIiBQUkl1TUFYICIgdW5pcXVlICAgIClcbiIsICgoKHVpbnRtYXhfdCkxKSA8PCBtYXJrcy0+c2hpZnQpICogMTAyNCwgbWFya3Nfc2V0X2NvdW50KTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICBhdG9tczogICAgICUxMHVcbiIsIGF0b21fY250KTsKKwkJZnByaW50ZihzdGRlcnIsICJNZW1vcnkgdG90YWw6ICAgICUxMCIgUFJJdU1BWCAiIEtpQlxuIiwgKHRvdGFsX2FsbG9jZCArIGFsbG9jX2NvdW50KnNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSkvMTAyNCk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgIHBvb2xzOiAgICAlMTBsdSBLaUJcbiIsICh1bnNpZ25lZCBsb25nKSh0b3RhbF9hbGxvY2QvMTAyNCkpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgb2JqZWN0czogICAgJTEwIiBQUkl1TUFYICIgS2lCXG4iLCAoYWxsb2NfY291bnQqc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkpKS8xMDI0KTsKKwkJZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwYWNrX3JlcG9ydCgpOworCQlmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl9CisKKwlyZXR1cm4gZmFpbHVyZSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvZmV0Y2gtcGFjay5jIGIvZmV0Y2gtcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjRhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZXRjaC1wYWNrLmMKQEAgLTAsMCArMSw3ODkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgInNpZGViYW5kLmgiCisKK3N0YXRpYyBpbnQga2VlcF9wYWNrOworc3RhdGljIGludCB0cmFuc2Zlcl91bnBhY2tfbGltaXQgPSAtMTsKK3N0YXRpYyBpbnQgZmV0Y2hfdW5wYWNrX2xpbWl0ID0gLTE7CitzdGF0aWMgaW50IHVucGFja19saW1pdCA9IDEwMDsKK3N0YXRpYyBpbnQgcXVpZXQ7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IGZldGNoX2FsbDsKK3N0YXRpYyBpbnQgZGVwdGg7CitzdGF0aWMgaW50IG5vX3Byb2dyZXNzOworc3RhdGljIGNvbnN0IGNoYXIgZmV0Y2hfcGFja191c2FnZVtdID0KKyJnaXQtZmV0Y2gtcGFjayBbLS1hbGxdIFstLXF1aWV0fC1xXSBbLS1rZWVwfC1rXSBbLS10aGluXSBbLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPl0gWy0tZGVwdGg9PG4+XSBbLS1uby1wcm9ncmVzc10gWy12XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZnM+Li4uXSI7CitzdGF0aWMgY29uc3QgY2hhciAqdXBsb2FkcGFjayA9ICJnaXQtdXBsb2FkLXBhY2siOworCisjZGVmaW5lIENPTVBMRVRFCSgxVSA8PCAwKQorI2RlZmluZSBDT01NT04JCSgxVSA8PCAxKQorI2RlZmluZSBDT01NT05fUkVGCSgxVSA8PCAyKQorI2RlZmluZSBTRUVOCQkoMVUgPDwgMykKKyNkZWZpbmUgUE9QUEVECQkoMVUgPDwgNCkKKworLyoKKyAqIEFmdGVyIHNlbmRpbmcgdGhpcyBtYW55ICJoYXZlInMgaWYgd2UgZG8gbm90IGdldCBhbnkgbmV3IEFDSyAsIHdlCisgKiBnaXZlIHVwIHRyYXZlcnNpbmcgb3VyIGhpc3RvcnkuCisgKi8KKyNkZWZpbmUgTUFYX0lOX1ZBSU4gMjU2CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKnJldl9saXN0Oworc3RhdGljIGludCBub25fY29tbW9uX3JldnMsIG11bHRpX2FjaywgdXNlX3RoaW5fcGFjaywgdXNlX3NpZGViYW5kOworCitzdGF0aWMgdm9pZCByZXZfbGlzdF9wdXNoKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IG1hcmspCit7CisJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBtYXJrKSkgeworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBtYXJrOworCisJCWlmICghKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkpCisJCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZyZXZfbGlzdCk7CisKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKQorCQkJbm9uX2NvbW1vbl9yZXZzKys7CisJfQorfQorCitzdGF0aWMgaW50IHJldl9saXN0X2luc2VydF9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qoc2hhMSksIHBhdGgsIDApOworCisJaWYgKG8gJiYgby0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQlyZXZfbGlzdF9wdXNoKChzdHJ1Y3QgY29tbWl0ICopbywgU0VFTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gbWFya3MgYSByZXYgYW5kIGl0cyBhbmNlc3RvcnMgYXMgY29tbW9uLgorICAgSW4gc29tZSBjYXNlcywgaXQgaXMgZGVzaXJhYmxlIHRvIG1hcmsgb25seSB0aGUgYW5jZXN0b3JzIChmb3IgZXhhbXBsZQorICAgd2hlbiBvbmx5IHRoZSBzZXJ2ZXIgZG9lcyBub3QgeWV0IGtub3cgdGhhdCB0aGV5IGFyZSBjb21tb24pLgorKi8KKworc3RhdGljIHZvaWQgbWFya19jb21tb24oc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQlpbnQgYW5jZXN0b3JzX29ubHksIGludCBkb250X3BhcnNlKQoreworCWlmIChjb21taXQgIT0gTlVMTCAmJiAhKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQ09NTU9OKSkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gKHN0cnVjdCBvYmplY3QgKiljb21taXQ7CisKKwkJaWYgKCFhbmNlc3RvcnNfb25seSkKKwkJCW8tPmZsYWdzIHw9IENPTU1PTjsKKworCQlpZiAoIShvLT5mbGFncyAmIFNFRU4pKQorCQkJcmV2X2xpc3RfcHVzaChjb21taXQsIFNFRU4pOworCQllbHNlIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCQkJaWYgKCFhbmNlc3RvcnNfb25seSAmJiAhKG8tPmZsYWdzICYgUE9QUEVEKSkKKwkJCQlub25fY29tbW9uX3JldnMtLTsKKwkJCWlmICghby0+cGFyc2VkICYmICFkb250X3BhcnNlKQorCQkJCXBhcnNlX2NvbW1pdChjb21taXQpOworCisJCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCQkJCXBhcmVudHM7CisJCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KQorCQkJCW1hcmtfY29tbW9uKHBhcmVudHMtPml0ZW0sIDAsIGRvbnRfcGFyc2UpOworCQl9CisJfQorfQorCisvKgorICBHZXQgdGhlIG5leHQgcmV2IHRvIHNlbmQsIGlnbm9yaW5nIHRoZSBjb21tb24uCisqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciogZ2V0X3Jldih2b2lkKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IE5VTEw7CisKKwl3aGlsZSAoY29tbWl0ID09IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IG1hcms7CisJCXN0cnVjdCBjb21taXRfbGlzdCogcGFyZW50czsKKworCQlpZiAocmV2X2xpc3QgPT0gTlVMTCB8fCBub25fY29tbW9uX3JldnMgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCisJCWNvbW1pdCA9IHJldl9saXN0LT5pdGVtOworCQlpZiAoIShjb21taXQtPm9iamVjdC5wYXJzZWQpKQorCQkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFBPUFBFRDsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKQorCQkJbm9uX2NvbW1vbl9yZXZzLS07CisJCisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQ09NTU9OKSB7CisJCQkvKiBkbyBub3Qgc2VuZCAiaGF2ZSIsIGFuZCBpZ25vcmUgYW5jZXN0b3JzICovCisJCQljb21taXQgPSBOVUxMOworCQkJbWFyayA9IENPTU1PTiB8IFNFRU47CisJCX0gZWxzZSBpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT05fUkVGKQorCQkJLyogc2VuZCAiaGF2ZSIsIGFuZCBpZ25vcmUgYW5jZXN0b3JzICovCisJCQltYXJrID0gQ09NTU9OIHwgU0VFTjsKKwkJZWxzZQorCQkJLyogc2VuZCAiaGF2ZSIsIGFsc28gZm9yIGl0cyBhbmNlc3RvcnMgKi8KKwkJCW1hcmsgPSBTRUVOOworCisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlpZiAoIShwYXJlbnRzLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkKKwkJCQlyZXZfbGlzdF9wdXNoKHBhcmVudHMtPml0ZW0sIG1hcmspOworCQkJaWYgKG1hcmsgJiBDT01NT04pCisJCQkJbWFya19jb21tb24ocGFyZW50cy0+aXRlbSwgMSwgMCk7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJfQorCisJCXJldl9saXN0ID0gcmV2X2xpc3QtPm5leHQ7CisJfQorCisJcmV0dXJuIGNvbW1pdC0+b2JqZWN0LnNoYTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9jb21tb24oaW50IGZkWzJdLCB1bnNpZ25lZCBjaGFyICpyZXN1bHRfc2hhMSwKKwkJICAgICAgIHN0cnVjdCByZWYgKnJlZnMpCit7CisJaW50IGZldGNoaW5nOworCWludCBjb3VudCA9IDAsIGZsdXNoZXMgPSAwLCByZXR2YWw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwl1bnNpZ25lZCBpbl92YWluID0gMDsKKwlpbnQgZ290X2NvbnRpbnVlID0gMDsKKworCWZvcl9lYWNoX3JlZihyZXZfbGlzdF9pbnNlcnRfcmVmLCBOVUxMKTsKKworCWZldGNoaW5nID0gMDsKKwlmb3IgKCA7IHJlZnMgOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQl1bnNpZ25lZCBjaGFyICpyZW1vdGUgPSByZWZzLT5vbGRfc2hhMTsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQkvKgorCQkgKiBJZiB0aGF0IG9iamVjdCBpcyBjb21wbGV0ZSAoaS5lLiBpdCBpcyBhbiBhbmNlc3RvciBvZiBhCisJCSAqIGxvY2FsIHJlZiksIHdlIHRlbGwgdGhlbSB3ZSBoYXZlIGl0IGJ1dCBkbyBub3QgaGF2ZSB0bworCQkgKiB0ZWxsIHRoZW0gYWJvdXQgaXRzIGFuY2VzdG9ycywgd2hpY2ggdGhleSBhbHJlYWR5IGtub3cKKwkJICogYWJvdXQuCisJCSAqCisJCSAqIFdlIHVzZSBsb29rdXBfb2JqZWN0IGhlcmUgYmVjYXVzZSB3ZSBhcmUgb25seQorCQkgKiBpbnRlcmVzdGVkIGluIHRoZSBjYXNlIHdlICprbm93KiB0aGUgb2JqZWN0IGlzCisJCSAqIHJlYWNoYWJsZSBhbmQgd2UgaGF2ZSBhbHJlYWR5IHNjYW5uZWQgaXQuCisJCSAqLworCQlpZiAoKChvID0gbG9va3VwX29iamVjdChyZW1vdGUpKSAhPSBOVUxMKSAmJgorCQkJCShvLT5mbGFncyAmIENPTVBMRVRFKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZldGNoaW5nKQorCQkJcGFja2V0X3dyaXRlKGZkWzFdLCAid2FudCAlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCQkgICAgIHNoYTFfdG9faGV4KHJlbW90ZSksCisJCQkJICAgICAobXVsdGlfYWNrID8gIiBtdWx0aV9hY2siIDogIiIpLAorCQkJCSAgICAgKHVzZV9zaWRlYmFuZCA9PSAyID8gIiBzaWRlLWJhbmQtNjRrIiA6ICIiKSwKKwkJCQkgICAgICh1c2Vfc2lkZWJhbmQgPT0gMSA/ICIgc2lkZS1iYW5kIiA6ICIiKSwKKwkJCQkgICAgICh1c2VfdGhpbl9wYWNrID8gIiB0aGluLXBhY2siIDogIiIpLAorCQkJCSAgICAgKG5vX3Byb2dyZXNzID8gIiBuby1wcm9ncmVzcyIgOiAiIiksCisJCQkJICAgICAiIG9mcy1kZWx0YSIpOworCQllbHNlCisJCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJ3YW50ICVzXG4iLCBzaGExX3RvX2hleChyZW1vdGUpKTsKKwkJZmV0Y2hpbmcrKzsKKwl9CisJaWYgKGlzX3JlcG9zaXRvcnlfc2hhbGxvdygpKQorCQl3cml0ZV9zaGFsbG93X2NvbW1pdHMoZmRbMV0sIDEpOworCWlmIChkZXB0aCA+IDApCisJCXBhY2tldF93cml0ZShmZFsxXSwgImRlZXBlbiAlZCIsIGRlcHRoKTsKKwlwYWNrZXRfZmx1c2goZmRbMV0pOworCWlmICghZmV0Y2hpbmcpCisJCXJldHVybiAxOworCisJaWYgKGRlcHRoID4gMCkgeworCQljaGFyIGxpbmVbMTAyNF07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWludCBsZW47CisKKwkJd2hpbGUgKChsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGZkWzBdLCBsaW5lLCBzaXplb2YobGluZSkpKSkgeworCQkJaWYgKCFwcmVmaXhjbXAobGluZSwgInNoYWxsb3cgIikpIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KGxpbmUgKyA4LCBzaGExKSkKKwkJCQkJZGllKCJpbnZhbGlkIHNoYWxsb3cgbGluZTogJXMiLCBsaW5lKTsKKwkJCQlyZWdpc3Rlcl9zaGFsbG93KHNoYTEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAobGluZSwgInVuc2hhbGxvdyAiKSkgeworCQkJCWlmIChnZXRfc2hhMV9oZXgobGluZSArIDEwLCBzaGExKSkKKwkJCQkJZGllKCJpbnZhbGlkIHVuc2hhbGxvdyBsaW5lOiAlcyIsIGxpbmUpOworCQkJCWlmICghbG9va3VwX29iamVjdChzaGExKSkKKwkJCQkJZGllKCJvYmplY3Qgbm90IGZvdW5kOiAlcyIsIGxpbmUpOworCQkJCS8qIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHBhcnNlZCBhcyBzaGFsbG93ICovCisJCQkJcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJCWlmICh1bnJlZ2lzdGVyX3NoYWxsb3coc2hhMSkpCisJCQkJCWRpZSgibm8gc2hhbGxvdyBmb3VuZDogJXMiLCBsaW5lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRpZSgiZXhwZWN0ZWQgc2hhbGxvdy91bnNoYWxsb3csIGdvdCAlcyIsIGxpbmUpOworCQl9CisJfQorCisJZmx1c2hlcyA9IDA7CisJcmV0dmFsID0gLTE7CisJd2hpbGUgKChzaGExID0gZ2V0X3JldigpKSkgeworCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJoYXZlICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJoYXZlICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJCWluX3ZhaW4rKzsKKwkJaWYgKCEoMzEgJiArK2NvdW50KSkgeworCQkJaW50IGFjazsKKworCQkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJCWZsdXNoZXMrKzsKKworCQkJLyoKKwkJCSAqIFdlIGtlZXAgb25lIHdpbmRvdyAiYWhlYWQiIG9mIHRoZSBvdGhlciBzaWRlLCBhbmQKKwkJCSAqIHdpbGwgd2FpdCBmb3IgYW4gQUNLIG9ubHkgb24gdGhlIG5leHQgb25lCisJCQkgKi8KKwkJCWlmIChjb3VudCA9PSAzMikKKwkJCQljb250aW51ZTsKKworCQkJZG8geworCQkJCWFjayA9IGdldF9hY2soZmRbMF0sIHJlc3VsdF9zaGExKTsKKwkJCQlpZiAodmVyYm9zZSAmJiBhY2spCisJCQkJCWZwcmludGYoc3RkZXJyLCAiZ290IGFjayAlZCAlc1xuIiwgYWNrLAorCQkJCQkJCXNoYTFfdG9faGV4KHJlc3VsdF9zaGExKSk7CisJCQkJaWYgKGFjayA9PSAxKSB7CisJCQkJCWZsdXNoZXMgPSAwOworCQkJCQltdWx0aV9hY2sgPSAwOworCQkJCQlyZXR2YWwgPSAwOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfSBlbHNlIGlmIChhY2sgPT0gMikgeworCQkJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPQorCQkJCQkJbG9va3VwX2NvbW1pdChyZXN1bHRfc2hhMSk7CisJCQkJCW1hcmtfY29tbW9uKGNvbW1pdCwgMCwgMSk7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJCWluX3ZhaW4gPSAwOworCQkJCQlnb3RfY29udGludWUgPSAxOworCQkJCX0KKwkJCX0gd2hpbGUgKGFjayk7CisJCQlmbHVzaGVzLS07CisJCQlpZiAoZ290X2NvbnRpbnVlICYmIE1BWF9JTl9WQUlOIDwgaW5fdmFpbikgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdmluZyB1cFxuIik7CisJCQkJYnJlYWs7IC8qIGdpdmUgdXAgKi8KKwkJCX0KKwkJfQorCX0KK2RvbmU6CisJcGFja2V0X3dyaXRlKGZkWzFdLCAiZG9uZVxuIik7CisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiZG9uZVxuIik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCW11bHRpX2FjayA9IDA7CisJCWZsdXNoZXMrKzsKKwl9CisJd2hpbGUgKGZsdXNoZXMgfHwgbXVsdGlfYWNrKSB7CisJCWludCBhY2sgPSBnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSk7CisJCWlmIChhY2spIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCWZwcmludGYoc3RkZXJyLCAiZ290IGFjayAoJWQpICVzXG4iLCBhY2ssCisJCQkJCXNoYTFfdG9faGV4KHJlc3VsdF9zaGExKSk7CisJCQlpZiAoYWNrID09IDEpCisJCQkJcmV0dXJuIDA7CisJCQltdWx0aV9hY2sgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZmx1c2hlcy0tOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpjb21wbGV0ZTsKKworc3RhdGljIGludCBtYXJrX2NvbXBsZXRlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisKKwl3aGlsZSAobyAmJiBvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopIG87CisJCWlmICghdC0+dGFnZ2VkKQorCQkJYnJlYWs7IC8qIGJyb2tlbiByZXBvc2l0b3J5ICovCisJCW8tPmZsYWdzIHw9IENPTVBMRVRFOworCQlvID0gcGFyc2Vfb2JqZWN0KHQtPnRhZ2dlZC0+c2hhMSk7CisJfQorCWlmIChvICYmIG8tPnR5cGUgPT0gT0JKX0NPTU1JVCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW87CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IENPTVBMRVRFOworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZjb21wbGV0ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXJrX3JlY2VudF9jb21wbGV0ZV9jb21taXRzKHVuc2lnbmVkIGxvbmcgY3V0b2ZmKQoreworCXdoaWxlIChjb21wbGV0ZSAmJiBjdXRvZmYgPD0gY29tcGxldGUtPml0ZW0tPmRhdGUpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIk1hcmtpbmcgJXMgYXMgY29tcGxldGVcbiIsCisJCQkJc2hhMV90b19oZXgoY29tcGxldGUtPml0ZW0tPm9iamVjdC5zaGExKSk7CisJCXBvcF9tb3N0X3JlY2VudF9jb21taXQoJmNvbXBsZXRlLCBDT01QTEVURSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfcmVmcyhzdHJ1Y3QgcmVmICoqcmVmcywgaW50IG5yX21hdGNoLCBjaGFyICoqbWF0Y2gpCit7CisJc3RydWN0IHJlZiAqKnJldHVybl9yZWZzOworCXN0cnVjdCByZWYgKm5ld2xpc3QgPSBOVUxMOworCXN0cnVjdCByZWYgKipuZXd0YWlsID0gJm5ld2xpc3Q7CisJc3RydWN0IHJlZiAqcmVmLCAqbmV4dDsKKwlzdHJ1Y3QgcmVmICpmYXN0YXJyYXlbMzJdOworCisJaWYgKG5yX21hdGNoICYmICFmZXRjaF9hbGwpIHsKKwkJaWYgKEFSUkFZX1NJWkUoZmFzdGFycmF5KSA8IG5yX21hdGNoKQorCQkJcmV0dXJuX3JlZnMgPSB4Y2FsbG9jKG5yX21hdGNoLCBzaXplb2Yoc3RydWN0IHJlZiAqKSk7CisJCWVsc2UgeworCQkJcmV0dXJuX3JlZnMgPSBmYXN0YXJyYXk7CisJCQltZW1zZXQocmV0dXJuX3JlZnMsIDAsIHNpemVvZihzdHJ1Y3QgcmVmICopICogbnJfbWF0Y2gpOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuX3JlZnMgPSBOVUxMOworCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSBuZXh0KSB7CisJCW5leHQgPSByZWYtPm5leHQ7CisJCWlmICghbWVtY21wKHJlZi0+bmFtZSwgInJlZnMvIiwgNSkgJiYKKwkJICAgIGNoZWNrX3JlZl9mb3JtYXQocmVmLT5uYW1lICsgNSkpCisJCQk7IC8qIHRyYXNoICovCisJCWVsc2UgaWYgKGZldGNoX2FsbCAmJgorCQkJICghZGVwdGggfHwgcHJlZml4Y21wKHJlZi0+bmFtZSwgInJlZnMvdGFncy8iKSApKSB7CisJCQkqbmV3dGFpbCA9IHJlZjsKKwkJCXJlZi0+bmV4dCA9IE5VTEw7CisJCQluZXd0YWlsID0gJnJlZi0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgeworCQkJaW50IG9yZGVyID0gcGF0aF9tYXRjaChyZWYtPm5hbWUsIG5yX21hdGNoLCBtYXRjaCk7CisJCQlpZiAob3JkZXIpIHsKKwkJCQlyZXR1cm5fcmVmc1tvcmRlci0xXSA9IHJlZjsKKwkJCQljb250aW51ZTsgLyogd2Ugd2lsbCBsaW5rIGl0IGxhdGVyICovCisJCQl9CisJCX0KKwkJZnJlZShyZWYpOworCX0KKworCWlmICghZmV0Y2hfYWxsKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfbWF0Y2g7IGkrKykgeworCQkJcmVmID0gcmV0dXJuX3JlZnNbaV07CisJCQlpZiAocmVmKSB7CisJCQkJKm5ld3RhaWwgPSByZWY7CisJCQkJcmVmLT5uZXh0ID0gTlVMTDsKKwkJCQluZXd0YWlsID0gJnJlZi0+bmV4dDsKKwkJCX0KKwkJfQorCQlpZiAocmV0dXJuX3JlZnMgIT0gZmFzdGFycmF5KQorCQkJZnJlZShyZXR1cm5fcmVmcyk7CisJfQorCSpyZWZzID0gbmV3bGlzdDsKK30KKworc3RhdGljIGludCBldmVyeXRoaW5nX2xvY2FsKHN0cnVjdCByZWYgKipyZWZzLCBpbnQgbnJfbWF0Y2gsIGNoYXIgKiptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGN1dG9mZiA9IDA7CisKKwl0cmFja19vYmplY3RfcmVmcyA9IDA7CisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKworCWZvciAocmVmID0gKnJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCXN0cnVjdCBvYmplY3QgKm87CisKKwkJbyA9IHBhcnNlX29iamVjdChyZWYtPm9sZF9zaGExKTsKKwkJaWYgKCFvKQorCQkJY29udGludWU7CisKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGl0IC0tIHdoaWNoIG1heSBtZWFuIHRoYXQgd2Ugd2VyZQorCQkgKiBpbiBzeW5jIHdpdGggdGhlIG90aGVyIHNpZGUgYXQgc29tZSB0aW1lIGFmdGVyCisJCSAqIHRoYXQgKGl0IGlzIE9LIGlmIHdlIGd1ZXNzIHdyb25nIGhlcmUpLgorCQkgKi8KKwkJaWYgKG8tPnR5cGUgPT0gT0JKX0NPTU1JVCkgeworCQkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCQkJaWYgKCFjdXRvZmYgfHwgY3V0b2ZmIDwgY29tbWl0LT5kYXRlKQorCQkJCWN1dG9mZiA9IGNvbW1pdC0+ZGF0ZTsKKwkJfQorCX0KKworCWlmICghZGVwdGgpIHsKKwkJZm9yX2VhY2hfcmVmKG1hcmtfY29tcGxldGUsIE5VTEwpOworCQlpZiAoY3V0b2ZmKQorCQkJbWFya19yZWNlbnRfY29tcGxldGVfY29tbWl0cyhjdXRvZmYpOworCX0KKworCS8qCisJICogTWFyayBhbGwgY29tcGxldGUgcmVtb3RlIHJlZnMgYXMgY29tbW9uIHJlZnMuCisJICogRG9uJ3QgbWFyayB0aGVtIGNvbW1vbiB5ZXQ7IHRoZSBzZXJ2ZXIgaGFzIHRvIGJlIHRvbGQgc28gZmlyc3QuCisJICovCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IGRlcmVmX3RhZyhsb29rdXBfb2JqZWN0KHJlZi0+b2xkX3NoYTEpLAorCQkJCQkgICAgIE5VTEwsIDApOworCisJCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQgfHwgIShvLT5mbGFncyAmIENPTVBMRVRFKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpIHsKKwkJCXJldl9saXN0X3B1c2goKHN0cnVjdCBjb21taXQgKilvLCBDT01NT05fUkVGIHwgU0VFTik7CisKKwkJCW1hcmtfY29tbW9uKChzdHJ1Y3QgY29tbWl0ICopbywgMSwgMSk7CisJCX0KKwl9CisKKwlmaWx0ZXJfcmVmcyhyZWZzLCBucl9tYXRjaCwgbWF0Y2gpOworCisJZm9yIChyZXR2YWwgPSAxLCByZWYgPSAqcmVmczsgcmVmIDsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlbW90ZSA9IHJlZi0+b2xkX3NoYTE7CisJCXVuc2lnbmVkIGNoYXIgbG9jYWxbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJCW8gPSBsb29rdXBfb2JqZWN0KHJlbW90ZSk7CisJCWlmICghbyB8fCAhKG8tPmZsYWdzICYgQ09NUExFVEUpKSB7CisJCQlyZXR2YWwgPSAwOworCQkJaWYgKCF2ZXJib3NlKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIndhbnQgJXMgKCVzKVxuIiwgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQlyZWYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIGxvY2FsKTsKKwkJaWYgKCF2ZXJib3NlKQorCQkJY29udGludWU7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImFscmVhZHkgaGF2ZSAlcyAoJXMpXG4iLCBzaGExX3RvX2hleChyZW1vdGUpLAorCQkJcmVmLT5uYW1lKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHBpZF90IHNldHVwX3NpZGViYW5kKGludCBmZFsyXSwgaW50IHhkWzJdKQoreworCXBpZF90IHNpZGVfcGlkOworCisJaWYgKCF1c2Vfc2lkZWJhbmQpIHsKKwkJZmRbMF0gPSB4ZFswXTsKKwkJZmRbMV0gPSB4ZFsxXTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHhkW10gaXMgdGFsa2luZyB3aXRoIHVwbG9hZC1wYWNrOyBzdWJwcm9jZXNzIHJlYWRzIGZyb20KKwkgKiB4ZFswXSwgc3BpdHMgb3V0IGJhbmQjMiB0byBzdGRlcnIsIGFuZCBmZWVkcyB1cyBiYW5kIzEKKwkgKiB0aHJvdWdoIG91ciBmZFswXS4KKwkgKi8KKwlpZiAocGlwZShmZCkgPCAwKQorCQlkaWUoImZldGNoLXBhY2s6IHVuYWJsZSB0byBzZXQgdXAgcGlwZSIpOworCXNpZGVfcGlkID0gZm9yaygpOworCWlmIChzaWRlX3BpZCA8IDApCisJCWRpZSgiZmV0Y2gtcGFjazogdW5hYmxlIHRvIGZvcmsgb2ZmIHNpZGViYW5kIGRlbXVsdGlwbGV4ZXIiKTsKKwlpZiAoIXNpZGVfcGlkKSB7CisJCS8qIHN1YnByb2Nlc3MgKi8KKwkJY2xvc2UoZmRbMF0pOworCQlpZiAoeGRbMF0gIT0geGRbMV0pCisJCQljbG9zZSh4ZFsxXSk7CisJCWlmIChyZWN2X3NpZGViYW5kKCJmZXRjaC1wYWNrIiwgeGRbMF0sIGZkWzFdLCAyKSkKKwkJCWV4aXQoMSk7CisJCWV4aXQoMCk7CisJfQorCWNsb3NlKHhkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJZmRbMV0gPSB4ZFsxXTsKKwlyZXR1cm4gc2lkZV9waWQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhY2soaW50IHhkWzJdKQoreworCWludCBzdGF0dXM7CisJcGlkX3QgcGlkLCBzaWRlX3BpZDsKKwlpbnQgZmRbMl07CisJY29uc3QgY2hhciAqYXJndlsyMF07CisJY2hhciBrZWVwX2FyZ1syNTZdOworCWNoYXIgaGRyX2FyZ1syNTZdOworCWNvbnN0IGNoYXIgKiphdjsKKwlpbnQgZG9fa2VlcCA9IGtlZXBfcGFjazsKKworCXNpZGVfcGlkID0gc2V0dXBfc2lkZWJhbmQoZmQsIHhkKTsKKworCWF2ID0gYXJndjsKKwkqaGRyX2FyZyA9IDA7CisJaWYgKHVucGFja19saW1pdCkgeworCQlzdHJ1Y3QgcGFja19oZWFkZXIgaGVhZGVyOworCisJCWlmIChyZWFkX3BhY2tfaGVhZGVyKGZkWzBdLCAmaGVhZGVyKSkKKwkJCWRpZSgicHJvdG9jb2wgZXJyb3I6IGJhZCBwYWNrIGhlYWRlciIpOworCQlzbnByaW50ZihoZHJfYXJnLCBzaXplb2YoaGRyX2FyZyksICItLXBhY2tfaGVhZGVyPSV1LCV1IiwKKwkJCSBudG9obChoZWFkZXIuaGRyX3ZlcnNpb24pLCBudG9obChoZWFkZXIuaGRyX2VudHJpZXMpKTsKKwkJaWYgKG50b2hsKGhlYWRlci5oZHJfZW50cmllcykgPCB1bnBhY2tfbGltaXQpCisJCQlkb19rZWVwID0gMDsKKwkJZWxzZQorCQkJZG9fa2VlcCA9IDE7CisJfQorCisJaWYgKGRvX2tlZXApIHsKKwkJKmF2KysgPSAiaW5kZXgtcGFjayI7CisJCSphdisrID0gIi0tc3RkaW4iOworCQlpZiAoIXF1aWV0ICYmICFub19wcm9ncmVzcykKKwkJCSphdisrID0gIi12IjsKKwkJaWYgKHVzZV90aGluX3BhY2spCisJCQkqYXYrKyA9ICItLWZpeC10aGluIjsKKwkJaWYgKGtlZXBfcGFjayA+IDEgfHwgdW5wYWNrX2xpbWl0KSB7CisJCQlpbnQgcyA9IHNwcmludGYoa2VlcF9hcmcsCisJCQkJCSItLWtlZXA9ZmV0Y2gtcGFjayAlZCBvbiAiLCBnZXRwaWQoKSk7CisJCQlpZiAoZ2V0aG9zdG5hbWUoa2VlcF9hcmcgKyBzLCBzaXplb2Yoa2VlcF9hcmcpIC0gcykpCisJCQkJc3RyY3B5KGtlZXBfYXJnICsgcywgImxvY2FsaG9zdCIpOworCQkJKmF2KysgPSBrZWVwX2FyZzsKKwkJfQorCX0KKwllbHNlIHsKKwkJKmF2KysgPSAidW5wYWNrLW9iamVjdHMiOworCQlpZiAocXVpZXQpCisJCQkqYXYrKyA9ICItcSI7CisJfQorCWlmICgqaGRyX2FyZykKKwkJKmF2KysgPSBoZHJfYXJnOworCSphdisrID0gTlVMTDsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJZGllKCJmZXRjaC1wYWNrOiB1bmFibGUgdG8gZm9yayBvZmYgJXMiLCBhcmd2WzBdKTsKKwlpZiAoIXBpZCkgeworCQlkdXAyKGZkWzBdLCAwKTsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCWV4ZWN2X2dpdF9jbWQoYXJndik7CisJCWRpZSgiJXMgZXhlYyBmYWlsZWQiLCBhcmd2WzBdKTsKKwl9CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQlkaWUoIndhaXRpbmcgZm9yICVzOiAlcyIsIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQlpbnQgY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWlmIChjb2RlKQorCQkJZGllKCIlcyBkaWVkIHdpdGggZXJyb3IgY29kZSAlZCIsIGFyZ3ZbMF0sIGNvZGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKwkJaW50IHNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CisJCWRpZSgiJXMgZGllZCBvZiBzaWduYWwgJWQiLCBhcmd2WzBdLCBzaWcpOworCX0KKwlkaWUoIiVzIGRpZWQgb2YgdW5uYXR1cmFsIGNhdXNlcyAlZCIsIGFyZ3ZbMF0sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfcGFjayhpbnQgZmRbMl0sIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJZ2V0X3JlbW90ZV9oZWFkcyhmZFswXSwgJnJlZiwgMCwgTlVMTCwgMCk7CisJaWYgKGlzX3JlcG9zaXRvcnlfc2hhbGxvdygpICYmICFzZXJ2ZXJfc3VwcG9ydHMoInNoYWxsb3ciKSkKKwkJZGllKCJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzaGFsbG93IGNsaWVudHMiKTsKKwlpZiAoc2VydmVyX3N1cHBvcnRzKCJtdWx0aV9hY2siKSkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VydmVyIHN1cHBvcnRzIG11bHRpX2Fja1xuIik7CisJCW11bHRpX2FjayA9IDE7CisJfQorCWlmIChzZXJ2ZXJfc3VwcG9ydHMoInNpZGUtYmFuZC02NGsiKSkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VydmVyIHN1cHBvcnRzIHNpZGUtYmFuZC02NGtcbiIpOworCQl1c2Vfc2lkZWJhbmQgPSAyOworCX0KKwllbHNlIGlmIChzZXJ2ZXJfc3VwcG9ydHMoInNpZGUtYmFuZCIpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgc3VwcG9ydHMgc2lkZS1iYW5kXG4iKTsKKwkJdXNlX3NpZGViYW5kID0gMTsKKwl9CisJaWYgKCFyZWYpIHsKKwkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJZGllKCJubyBtYXRjaGluZyByZW1vdGUgaGVhZCIpOworCX0KKwlpZiAoZXZlcnl0aGluZ19sb2NhbCgmcmVmLCBucl9tYXRjaCwgbWF0Y2gpKSB7CisJCXBhY2tldF9mbHVzaChmZFsxXSk7CisJCWdvdG8gYWxsX2RvbmU7CisJfQorCWlmIChmaW5kX2NvbW1vbihmZCwgc2hhMSwgcmVmKSA8IDApCisJCWlmIChrZWVwX3BhY2sgIT0gMSkKKwkJCS8qIFdoZW4gY2xvbmluZywgaXQgaXMgbm90IHVudXN1YWwgdG8gaGF2ZQorCQkJICogbm8gY29tbW9uIGNvbW1pdC4KKwkJCSAqLworCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBubyBjb21tb24gY29tbWl0c1xuIik7CisKKwlpZiAoZ2V0X3BhY2soZmQpKQorCQlkaWUoImdpdC1mZXRjaC1wYWNrOiBmZXRjaCBmYWlsZWQuIik7CisKKyBhbGxfZG9uZToKKwl3aGlsZSAocmVmKSB7CisJCXByaW50ZigiJXMgJXNcbiIsCisJCSAgICAgICBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSwgcmVmLT5uYW1lKTsKKwkJcmVmID0gcmVmLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfZHVwbGljYXRlcyhpbnQgbnJfaGVhZHMsIGNoYXIgKipoZWFkcykKK3sKKwlpbnQgc3JjLCBkc3Q7CisKKwlmb3IgKHNyYyA9IGRzdCA9IDA7IHNyYyA8IG5yX2hlYWRzOyBzcmMrKykgeworCQkvKiBJZiBoZWFkc1tzcmNdIGlzIGRpZmZlcmVudCBmcm9tIGFueSBvZgorCQkgKiBoZWFkc1swLi5kc3RdLCBwdXNoIGl0IGluLgorCQkgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBkc3Q7IGkrKykgeworCQkJaWYgKCFzdHJjbXAoaGVhZHNbaV0sIGhlYWRzW3NyY10pKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpIDwgZHN0KQorCQkJY29udGludWU7CisJCWlmIChzcmMgIT0gZHN0KQorCQkJaGVhZHNbZHN0XSA9IGhlYWRzW3NyY107CisJCWRzdCsrOworCX0KKwloZWFkc1tkc3RdID0gMDsKKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgaW50IGZldGNoX3BhY2tfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHN0cmNtcCh2YXIsICJmZXRjaC51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJZmV0Y2hfdW5wYWNrX2xpbWl0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodmFyLCAidHJhbnNmZXIudW5wYWNrbGltaXQiKSA9PSAwKSB7CisJCXRyYW5zZmVyX3VucGFja19saW1pdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIHJldCwgbnJfaGVhZHM7CisJY2hhciAqZGVzdCA9IE5VTEwsICoqaGVhZHM7CisJaW50IGZkWzJdOworCXBpZF90IHBpZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGZldGNoX3BhY2tfY29uZmlnKTsKKworCWlmICgwIDw9IHRyYW5zZmVyX3VucGFja19saW1pdCkKKwkJdW5wYWNrX2xpbWl0ID0gdHJhbnNmZXJfdW5wYWNrX2xpbWl0OworCWVsc2UgaWYgKDAgPD0gZmV0Y2hfdW5wYWNrX2xpbWl0KQorCQl1bnBhY2tfbGltaXQgPSBmZXRjaF91bnBhY2tfbGltaXQ7CisKKwlucl9oZWFkcyA9IDA7CisJaGVhZHMgPSBOVUxMOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdXBsb2FkLXBhY2s9IikpIHsKKwkJCQl1cGxvYWRwYWNrID0gYXJnICsgMTQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWV4ZWM9IikpIHsKKwkJCQl1cGxvYWRwYWNrID0gYXJnICsgNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXF1aWV0IiwgYXJnKSB8fCAhc3RyY21wKCItcSIsIGFyZykpIHsKKwkJCQlxdWlldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1rZWVwIiwgYXJnKSB8fCAhc3RyY21wKCItayIsIGFyZykpIHsKKwkJCQlrZWVwX3BhY2srKzsKKwkJCQl1bnBhY2tfbGltaXQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tdGhpbiIsIGFyZykpIHsKKwkJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWFsbCIsIGFyZykpIHsKKwkJCQlmZXRjaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1kZXB0aD0iKSkgeworCQkJCWRlcHRoID0gc3RydG9sKGFyZyArIDgsIE5VTEwsIDApOworCQkJCWlmIChzdGF0KGdpdF9wYXRoKCJzaGFsbG93IiksICZzdCkpCisJCQkJCXN0LnN0X210aW1lID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLW5vLXByb2dyZXNzIiwgYXJnKSkgeworCQkJCW5vX3Byb2dyZXNzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKGZldGNoX3BhY2tfdXNhZ2UpOworCQl9CisJCWRlc3QgPSBhcmc7CisJCWhlYWRzID0gYXJndiArIGkgKyAxOworCQlucl9oZWFkcyA9IGFyZ2MgLSBpIC0gMTsKKwkJYnJlYWs7CisJfQorCWlmICghZGVzdCkKKwkJdXNhZ2UoZmV0Y2hfcGFja191c2FnZSk7CisJcGlkID0gZ2l0X2Nvbm5lY3QoZmQsIGRlc3QsIHVwbG9hZHBhY2spOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKwlpZiAoaGVhZHMgJiYgbnJfaGVhZHMpCisJCW5yX2hlYWRzID0gcmVtb3ZlX2R1cGxpY2F0ZXMobnJfaGVhZHMsIGhlYWRzKTsKKwlyZXQgPSBmZXRjaF9wYWNrKGZkLCBucl9oZWFkcywgaGVhZHMpOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJcmV0IHw9IGZpbmlzaF9jb25uZWN0KHBpZCk7CisKKwlpZiAoIXJldCAmJiBucl9oZWFkcykgeworCQkvKiBJZiB0aGUgaGVhZHMgdG8gcHVsbCB3ZXJlIGdpdmVuLCB3ZSBzaG91bGQgaGF2ZQorCQkgKiBjb25zdW1lZCBhbGwgb2YgdGhlbSBieSBtYXRjaGluZyB0aGUgcmVtb3RlLgorCQkgKiBPdGhlcndpc2UsICdnaXQtZmV0Y2ggcmVtb3RlIG5vLXN1Y2gtcmVmJyB3b3VsZAorCQkgKiBzaWxlbnRseSBzdWNjZWVkIHdpdGhvdXQgaXNzdWluZyBhbiBlcnJvci4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBucl9oZWFkczsgaSsrKQorCQkJaWYgKGhlYWRzW2ldICYmIGhlYWRzW2ldWzBdKSB7CisJCQkJZXJyb3IoIm5vIHN1Y2ggcmVtb3RlIHJlZiAlcyIsIGhlYWRzW2ldKTsKKwkJCQlyZXQgPSAxOworCQkJfQorCX0KKworCWlmICghcmV0ICYmIGRlcHRoID4gMCkgeworCQlzdHJ1Y3QgY2FjaGVfdGltZSBtdGltZTsKKwkJY2hhciAqc2hhbGxvdyA9IGdpdF9wYXRoKCJzaGFsbG93Iik7CisJCWludCBmZDsKKworCQltdGltZS5zZWMgPSBzdC5zdF9tdGltZTsKKyNpZmRlZiBVU0VfTlNFQworCQltdGltZS51c2VjID0gc3Quc3RfbXRpbS51c2VjOworI2VuZGlmCisJCWlmIChzdGF0KHNoYWxsb3csICZzdCkpIHsKKwkJCWlmIChtdGltZS5zZWMpCisJCQkJZGllKCJzaGFsbG93IGZpbGUgd2FzIHJlbW92ZWQgZHVyaW5nIGZldGNoIik7CisJCX0gZWxzZSBpZiAoc3Quc3RfbXRpbWUgIT0gbXRpbWUuc2VjCisjaWZkZWYgVVNFX05TRUMKKwkJCQl8fCBzdC5zdF9tdGltLnVzZWMgIT0gbXRpbWUudXNlYworI2VuZGlmCisJCQkgICkKKwkJCWRpZSgic2hhbGxvdyBmaWxlIHdhcyBjaGFuZ2VkIGR1cmluZyBmZXRjaCIpOworCisJCWZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmbG9jaywgc2hhbGxvdywgMSk7CisJCWlmICghd3JpdGVfc2hhbGxvd19jb21taXRzKGZkLCAwKSkgeworCQkJdW5saW5rKHNoYWxsb3cpOworCQkJcm9sbGJhY2tfbG9ja19maWxlKCZsb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWNsb3NlKGZkKTsKKwkJCWNvbW1pdF9sb2NrX2ZpbGUoJmxvY2spOworCQl9CisJfQorCisJcmV0dXJuICEhcmV0OworfQpkaWZmIC0tZ2l0IGEvZmV0Y2guYyBiL2ZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLmMKQEAgLTAsMCArMSwzMTcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImZldGNoLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisKK2ludCBnZXRfdHJlZSA9IDA7CitpbnQgZ2V0X2hpc3RvcnkgPSAwOworaW50IGdldF9hbGwgPSAwOworaW50IGdldF92ZXJib3NlbHkgPSAwOworaW50IGdldF9yZWNvdmVyID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN1cnJlbnRfY29tbWl0X3NoYTFbMjBdOworCit2b2lkIHB1bGxfc2F5KGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqaGV4KSAKK3sKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsIGZtdCwgaGV4KTsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X21pc3NpbmcoY29uc3Qgc3RydWN0IG9iamVjdCAqb2JqKQoreworCWNoYXIgbWlzc2luZ19oZXhbNDFdOworCXN0cmNweShtaXNzaW5nX2hleCwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7OworCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9idGFpbiBuZWVkZWQgJXMgJXNcbiIsCisJCW9iai0+dHlwZSA/IHR5cGVuYW1lKG9iai0+dHlwZSk6ICJvYmplY3QiLCBtaXNzaW5nX2hleCk7CisJaWYgKCFpc19udWxsX3NoYTEoY3VycmVudF9jb21taXRfc2hhMSkpCisJCWZwcmludGYoc3RkZXJyLCAid2hpbGUgcHJvY2Vzc2luZyBjb21taXQgJXMuXG4iLAorCQkJc2hhMV90b19oZXgoY3VycmVudF9jb21taXRfc2hhMSkpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Moc3RydWN0IG9iamVjdCAqb2JqKTsKKworc3RhdGljIGludCBwcm9jZXNzX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCisJaWYgKHBhcnNlX3RyZWUodHJlZSkpCisJCXJldHVybiAtMTsKKworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IE5VTEw7CisKKwkJLyogc3VibW9kdWxlIGNvbW1pdHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cGVycHJvamVjdCAqLworCQlpZiAoU19JU0RJUkxOSyhlbnRyeS5tb2RlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJc3RydWN0IHRyZWUgKnRyZWUgPSBsb29rdXBfdHJlZShlbnRyeS5zaGExKTsKKwkJCWlmICh0cmVlKQorCQkJCW9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJCX0KKwkJZWxzZSB7CisJCQlzdHJ1Y3QgYmxvYiAqYmxvYiA9IGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpOworCQkJaWYgKGJsb2IpCisJCQkJb2JqID0gJmJsb2ItPm9iamVjdDsKKwkJfQorCQlpZiAoIW9iaiB8fCBwcm9jZXNzKG9iaikpCisJCQlyZXR1cm4gLTE7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworCXRyZWUtPnNpemUgPSAwOworCXJldHVybiAwOworfQorCisjZGVmaW5lIENPTVBMRVRFCSgxVSA8PCAwKQorI2RlZmluZSBTRUVOCQkoMVUgPDwgMSkKKyNkZWZpbmUgVE9fU0NBTgkJKDFVIDw8IDIpCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbXBsZXRlID0gTlVMTDsKKworc3RhdGljIGludCBwcm9jZXNzX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoY29tcGxldGUgJiYgY29tcGxldGUtPml0ZW0tPmRhdGUgPj0gY29tbWl0LT5kYXRlKSB7CisJCXBvcF9tb3N0X3JlY2VudF9jb21taXQoJmNvbXBsZXRlLCBDT01QTEVURSk7CisJfQorCisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQ09NUExFVEUpCisJCXJldHVybiAwOworCisJaGFzaGNweShjdXJyZW50X2NvbW1pdF9zaGExLCBjb21taXQtPm9iamVjdC5zaGExKTsKKworCXB1bGxfc2F5KCJ3YWxrICVzXG4iLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisKKwlpZiAoZ2V0X3RyZWUpIHsKKwkJaWYgKHByb2Nlc3MoJmNvbW1pdC0+dHJlZS0+b2JqZWN0KSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCFnZXRfYWxsKQorCQkJZ2V0X3RyZWUgPSAwOworCX0KKwlpZiAoZ2V0X2hpc3RvcnkpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQlmb3IgKDsgcGFyZW50czsgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpIHsKKwkJCWlmIChwcm9jZXNzKCZwYXJlbnRzLT5pdGVtLT5vYmplY3QpKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3RhZyhzdHJ1Y3QgdGFnICp0YWcpCit7CisJaWYgKHBhcnNlX3RhZyh0YWcpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHByb2Nlc3ModGFnLT50YWdnZWQpOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICpwcm9jZXNzX3F1ZXVlID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwcm9jZXNzX3F1ZXVlX2VuZCA9ICZwcm9jZXNzX3F1ZXVlOworCitzdGF0aWMgaW50IHByb2Nlc3Nfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJaWYgKHByb2Nlc3NfY29tbWl0KChzdHJ1Y3QgY29tbWl0ICopb2JqKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJaWYgKHByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmopKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCWlmIChwcm9jZXNzX3RhZygoc3RydWN0IHRhZyAqKW9iaikpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgcmVxdWlyZW1lbnRzICIKKwkJICAgICAib2YgdHlwZSAlcyBmb3IgJXMiLAorCQkgICAgIHR5cGVuYW1lKG9iai0+dHlwZSksIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Moc3RydWN0IG9iamVjdCAqb2JqKQoreworCWlmIChvYmotPmZsYWdzICYgU0VFTikKKwkJcmV0dXJuIDA7CisJb2JqLT5mbGFncyB8PSBTRUVOOworCisJaWYgKGhhc19zaGExX2ZpbGUob2JqLT5zaGExKSkgeworCQkvKiBXZSBhbHJlYWR5IGhhdmUgaXQsIHNvIHdlIHNob3VsZCBzY2FuIGl0IG5vdy4gKi8KKwkJb2JqLT5mbGFncyB8PSBUT19TQ0FOOworCX0KKwllbHNlIHsKKwkJaWYgKG9iai0+ZmxhZ3MgJiBDT01QTEVURSkKKwkJCXJldHVybiAwOworCQlwcmVmZXRjaChvYmotPnNoYTEpOworCX0KKwkJCisJb2JqZWN0X2xpc3RfaW5zZXJ0KG9iaiwgcHJvY2Vzc19xdWV1ZV9lbmQpOworCXByb2Nlc3NfcXVldWVfZW5kID0gJigqcHJvY2Vzc19xdWV1ZV9lbmQpLT5uZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvb3Aodm9pZCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVsZW07CisKKwl3aGlsZSAocHJvY2Vzc19xdWV1ZSkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwcm9jZXNzX3F1ZXVlLT5pdGVtOworCQllbGVtID0gcHJvY2Vzc19xdWV1ZTsKKwkJcHJvY2Vzc19xdWV1ZSA9IGVsZW0tPm5leHQ7CisJCWZyZWUoZWxlbSk7CisJCWlmICghcHJvY2Vzc19xdWV1ZSkKKwkJCXByb2Nlc3NfcXVldWVfZW5kID0gJnByb2Nlc3NfcXVldWU7CisKKwkJLyogSWYgd2UgYXJlIG5vdCBzY2FubmluZyB0aGlzIG9iamVjdCwgd2UgcGxhY2VkIGl0IGluCisJCSAqIHRoZSBxdWV1ZSBiZWNhdXNlIHdlIG5lZWRlZCB0byBmZXRjaCBpdCBmaXJzdC4KKwkJICovCisJCWlmICghIChvYmotPmZsYWdzICYgVE9fU0NBTikpIHsKKwkJCWlmIChmZXRjaChvYmotPnNoYTEpKSB7CisJCQkJcmVwb3J0X21pc3Npbmcob2JqKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKCFvYmotPnR5cGUpCisJCQlwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwkJaWYgKHByb2Nlc3Nfb2JqZWN0KG9iaikpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVycHJldF90YXJnZXQoY2hhciAqdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmICghZ2V0X3NoYTFfaGV4KHRhcmdldCwgc2hhMSkpCisJCXJldHVybiAwOworCWlmICghY2hlY2tfcmVmX2Zvcm1hdCh0YXJnZXQpKSB7CisJCWlmICghZmV0Y2hfcmVmKHRhcmdldCwgc2hhMSkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBtYXJrX2NvbXBsZXRlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoY29tbWl0KSB7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IENPTVBMRVRFOworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZjb21wbGV0ZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcHVsbF90YXJnZXRzX3N0ZGluKGNoYXIgKioqdGFyZ2V0LCBjb25zdCBjaGFyICoqKndyaXRlX3JlZikKK3sKKwlpbnQgdGFyZ2V0cyA9IDAsIHRhcmdldHNfYWxsb2MgPSAwOworCXN0cnVjdCBzdHJidWYgYnVmOworCSp0YXJnZXQgPSBOVUxMOyAqd3JpdGVfcmVmID0gTlVMTDsKKwlzdHJidWZfaW5pdCgmYnVmKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpyZl9vbmUgPSBOVUxMOworCQljaGFyICp0Z19vbmU7CisKKwkJcmVhZF9saW5lKCZidWYsIHN0ZGluLCAnXG4nKTsKKwkJaWYgKGJ1Zi5lb2YpCisJCQlicmVhazsKKwkJdGdfb25lID0gYnVmLmJ1ZjsKKwkJcmZfb25lID0gc3RyY2hyKHRnX29uZSwgJ1x0Jyk7CisJCWlmIChyZl9vbmUpCisJCQkqcmZfb25lKysgPSAwOworCisJCWlmICh0YXJnZXRzID49IHRhcmdldHNfYWxsb2MpIHsKKwkJCXRhcmdldHNfYWxsb2MgPSB0YXJnZXRzX2FsbG9jID8gdGFyZ2V0c19hbGxvYyAqIDIgOiA2NDsKKwkJCSp0YXJnZXQgPSB4cmVhbGxvYygqdGFyZ2V0LCB0YXJnZXRzX2FsbG9jICogc2l6ZW9mKCoqdGFyZ2V0KSk7CisJCQkqd3JpdGVfcmVmID0geHJlYWxsb2MoKndyaXRlX3JlZiwgdGFyZ2V0c19hbGxvYyAqIHNpemVvZigqKndyaXRlX3JlZikpOworCQl9CisJCSgqdGFyZ2V0KVt0YXJnZXRzXSA9IHhzdHJkdXAodGdfb25lKTsKKwkJKCp3cml0ZV9yZWYpW3RhcmdldHNdID0gcmZfb25lID8geHN0cmR1cChyZl9vbmUpIDogTlVMTDsKKwkJdGFyZ2V0cysrOworCX0KKwlyZXR1cm4gdGFyZ2V0czsKK30KKwordm9pZCBwdWxsX3RhcmdldHNfZnJlZShpbnQgdGFyZ2V0cywgY2hhciAqKnRhcmdldCwgY29uc3QgY2hhciAqKndyaXRlX3JlZikKK3sKKwl3aGlsZSAodGFyZ2V0cy0tKSB7CisJCWZyZWUodGFyZ2V0W3RhcmdldHNdKTsKKwkJaWYgKHdyaXRlX3JlZiAmJiB3cml0ZV9yZWZbdGFyZ2V0c10pCisJCQlmcmVlKChjaGFyICopIHdyaXRlX3JlZlt0YXJnZXRzXSk7CisJfQorfQorCitpbnQgcHVsbChpbnQgdGFyZ2V0cywgY2hhciAqKnRhcmdldCwgY29uc3QgY2hhciAqKndyaXRlX3JlZiwKKyAgICAgICAgIGNvbnN0IGNoYXIgKndyaXRlX3JlZl9sb2dfZGV0YWlscykKK3sKKwlzdHJ1Y3QgcmVmX2xvY2sgKipsb2NrID0geGNhbGxvYyh0YXJnZXRzLCBzaXplb2Yoc3RydWN0IHJlZl9sb2NrICopKTsKKwl1bnNpZ25lZCBjaGFyICpzaGExID0geG1hbGxvYyh0YXJnZXRzICogMjApOworCWNoYXIgKm1zZzsKKwlpbnQgcmV0OworCWludCBpOworCisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKwl0cmFja19vYmplY3RfcmVmcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKSB7CisJCWlmICghd3JpdGVfcmVmIHx8ICF3cml0ZV9yZWZbaV0pCisJCQljb250aW51ZTsKKworCQlsb2NrW2ldID0gbG9ja19yZWZfc2hhMSh3cml0ZV9yZWZbaV0sIE5VTEwpOworCQlpZiAoIWxvY2tbaV0pIHsKKwkJCWVycm9yKCJDYW4ndCBsb2NrIHJlZiAlcyIsIHdyaXRlX3JlZltpXSk7CisJCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKwkJfQorCX0KKworCWlmICghZ2V0X3JlY292ZXIpCisJCWZvcl9lYWNoX3JlZihtYXJrX2NvbXBsZXRlLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCB0YXJnZXRzOyBpKyspIHsKKwkJaWYgKGludGVycHJldF90YXJnZXQodGFyZ2V0W2ldLCAmc2hhMVsyMCAqIGldKSkgeworCQkJZXJyb3IoIkNvdWxkIG5vdCBpbnRlcnByZXQgJXMgYXMgc29tZXRoaW5nIHRvIHB1bGwiLCB0YXJnZXRbaV0pOworCQkJZ290byB1bmxvY2tfYW5kX2ZhaWw7CisJCX0KKwkJaWYgKHByb2Nlc3MobG9va3VwX3Vua25vd25fb2JqZWN0KCZzaGExWzIwICogaV0pKSkKKwkJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCX0KKworCWlmIChsb29wKCkpCisJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCisJaWYgKHdyaXRlX3JlZl9sb2dfZGV0YWlscykgeworCQltc2cgPSB4bWFsbG9jKHN0cmxlbih3cml0ZV9yZWZfbG9nX2RldGFpbHMpICsgMTIpOworCQlzcHJpbnRmKG1zZywgImZldGNoIGZyb20gJXMiLCB3cml0ZV9yZWZfbG9nX2RldGFpbHMpOworCX0gZWxzZSB7CisJCW1zZyA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCB0YXJnZXRzOyBpKyspIHsKKwkJaWYgKCF3cml0ZV9yZWYgfHwgIXdyaXRlX3JlZltpXSkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSB3cml0ZV9yZWZfc2hhMShsb2NrW2ldLCAmc2hhMVsyMCAqIGldLCBtc2cgPyBtc2cgOiAiZmV0Y2ggKHVua25vd24pIik7CisJCWxvY2tbaV0gPSBOVUxMOworCQlpZiAocmV0KQorCQkJZ290byB1bmxvY2tfYW5kX2ZhaWw7CisJfQorCWZyZWUobXNnKTsKKworCXJldHVybiAwOworCisKK3VubG9ja19hbmRfZmFpbDoKKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKQorCQlpZiAobG9ja1tpXSkKKwkJCXVubG9ja19yZWYobG9ja1tpXSk7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZmV0Y2guaCBiL2ZldGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0OGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBQVUxMX0gKKyNkZWZpbmUgUFVMTF9ICisKKy8qCisgKiBGZXRjaCBvYmplY3QgZ2l2ZW4gU0hBMSBmcm9tIHRoZSByZW1vdGUsIGFuZCBzdG9yZSBpdCBsb2NhbGx5IHVuZGVyCisgKiBHSVRfT0JKRUNUX0RJUkVDVE9SWS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuICBUbyBiZQorICogcHJvdmlkZWQgYnkgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCisgKi8KK2V4dGVybiBpbnQgZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qCisgKiBGZXRjaCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgc3RvcmUgaXQgbG9jYWxseTsgZmV0Y2goKSB3aWxsIGJlCisgKiBjYWxsZWQgbGF0ZXIgdG8gZGV0ZXJtaW5lIHN1Y2Nlc3MuIFRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBwYXJ0aWN1bGFyCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgcHJlZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qCisgKiBGZXRjaCByZWYgKHJlbGF0aXZlIHRvICRHSVRfRElSL3JlZnMpIGZyb20gdGhlIHJlbW90ZSwgYW5kIHN0b3JlCisgKiB0aGUgMjAtYnl0ZSBTSEExIGluIHNoYTEuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAgVG8KKyAqIGJlIHByb3ZpZGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgorICovCitleHRlcm4gaW50IGZldGNoX3JlZihjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiBTZXQgdG8gZmV0Y2ggdGhlIHRhcmdldCB0cmVlLiAqLworZXh0ZXJuIGludCBnZXRfdHJlZTsKKworLyogU2V0IHRvIGZldGNoIHRoZSBjb21taXQgaGlzdG9yeS4gKi8KK2V4dGVybiBpbnQgZ2V0X2hpc3Rvcnk7CisKKy8qIFNldCB0byBmZXRjaCB0aGUgdHJlZXMgaW4gdGhlIGNvbW1pdCBoaXN0b3J5LiAqLworZXh0ZXJuIGludCBnZXRfYWxsOworCisvKiBTZXQgdG8gYmUgdmVyYm9zZSAqLworZXh0ZXJuIGludCBnZXRfdmVyYm9zZWx5OworCisvKiBTZXQgdG8gY2hlY2sgb24gYWxsIHJlYWNoYWJsZSBvYmplY3RzLiAqLworZXh0ZXJuIGludCBnZXRfcmVjb3ZlcjsKKworLyogUmVwb3J0IHdoYXQgd2UgZ290IHVuZGVyIGdldF92ZXJib3NlbHkgKi8KK2V4dGVybiB2b2lkIHB1bGxfc2F5KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogTG9hZCBwdWxsIHRhcmdldHMgZnJvbSBzdGRpbiAqLworZXh0ZXJuIGludCBwdWxsX3RhcmdldHNfc3RkaW4oY2hhciAqKip0YXJnZXQsIGNvbnN0IGNoYXIgKioqd3JpdGVfcmVmKTsKKworLyogRnJlZSB1cCBsb2FkZWQgdGFyZ2V0cyAqLworZXh0ZXJuIHZvaWQgcHVsbF90YXJnZXRzX2ZyZWUoaW50IHRhcmdldHMsIGNoYXIgKip0YXJnZXQsIGNvbnN0IGNoYXIgKip3cml0ZV9yZWYpOworCisvKiBJZiB3cml0ZV9yZWYgaXMgc2V0LCB0aGUgcmVmIGZpbGVuYW1lIHRvIHdyaXRlIHRoZSB0YXJnZXQgdmFsdWUgdG8uICovCisvKiBJZiB3cml0ZV9yZWZfbG9nX2RldGFpbHMgaXMgc2V0LCBhZGRpdGlvbmFsIHRleHQgd2lsbCBhcHBlYXIgaW4gdGhlIHJlZiBsb2cuICovCitleHRlcm4gaW50IHB1bGwoaW50IHRhcmdldHMsIGNoYXIgKip0YXJnZXQsIGNvbnN0IGNoYXIgKip3cml0ZV9yZWYsCisJCWNvbnN0IGNoYXIgKndyaXRlX3JlZl9sb2dfZGV0YWlscyk7CisKKyNlbmRpZiAvKiBQVUxMX0ggKi8KZGlmZiAtLWdpdCBhL2dlbmVyYXRlLWNtZGxpc3Quc2ggYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3NTc3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCitlY2hvICIvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAkMCAqLworc3RydWN0IGNtZG5hbWVfaGVscAoreworICAgIGNoYXIgbmFtZVsxNl07CisgICAgY2hhciBoZWxwWzgwXTsKK307CisKK3N0cnVjdCBjbWRuYW1lX2hlbHAgY29tbW9uX2NtZHNbXSA9IHsiCisKK3NvcnQgPDxcRU9GIHwKK2FkZAorYXBwbHkKK2FyY2hpdmUKK2Jpc2VjdAorYnJhbmNoCitjaGVja291dAorY2hlcnJ5LXBpY2sKK2Nsb25lCitjb21taXQKK2RpZmYKK2ZldGNoCitncmVwCitpbml0Citsb2cKK21lcmdlCittdgorcHJ1bmUKK3B1bGwKK3B1c2gKK3JlYmFzZQorcmVzZXQKK3JldmVydAorcm0KK3Nob3cKK3Nob3ctYnJhbmNoCitzdGF0dXMKK3RhZworRU9GCit3aGlsZSByZWFkIGNtZAorZG8KKyAgICAgc2VkIC1uICcKKyAgICAgL05BTUUvLC9naXQtJyIkY21kIicvSAorICAgICAkeworICAgICAgICAgICAgeAorICAgICAgICAgICAgcy8uKmdpdC0nIiRjbWQiJyAtIFwoLipcKS8gIHsiJyIkY21kIiciLCAiXDEifSwvCisJICAgIHAKKyAgICAgfScgIkRvY3VtZW50YXRpb24vZ2l0LSRjbWQudHh0IgorZG9uZQorZWNobyAifTsiCmRpZmYgLS1naXQgYS9naXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsIGIvZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYzMwMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybApAQCAtMCwwICsxLDgwMyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7CisKK3N1YiBydW5fY21kX3BpcGUgeworCW15ICRmaCA9IHVuZGVmOworCW9wZW4oJGZoLCAnLXwnLCBAXykgb3IgZGllOworCXJldHVybiA8JGZoPjsKK30KKworbXkgKCRHSVRfRElSKSA9IHJ1bl9jbWRfcGlwZShxdyhnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpcikpOworCitpZiAoIWRlZmluZWQgJEdJVF9ESVIpIHsKKwlleGl0KDEpOyAjIHJldi1wYXJzZSB3b3VsZCBoYXZlIGFscmVhZHkgc2FpZCAibm90IGEgZ2l0IHJlcG8iCit9CitjaG9tcCgkR0lUX0RJUik7CisKK3N1YiByZWZyZXNoIHsKKwlteSAkZmg7CisJb3BlbiAkZmgsICctfCcsIHF3KGdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoKQorCSAgICBvciBkaWU7CisJd2hpbGUgKDwkZmg+KSB7CisJCTsjIGlnbm9yZSAnbmVlZHMgdXBkYXRlJworCX0KKwljbG9zZSAkZmg7Cit9CisKK3N1YiBsaXN0X3VudHJhY2tlZCB7CisJbWFwIHsKKwkJY2hvbXAgJF87CisJCSRfOworCX0KKwlydW5fY21kX3BpcGUocXcoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzCisJCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlKSwKKwkJICAgICAiLS1leGNsdWRlLWZyb209JEdJVF9ESVIvaW5mby9leGNsdWRlIiwKKwkJICAgICAnLS0nLCBAXyk7Cit9CisKK215ICRzdGF0dXNfZm10ID0gJyUxMnMgJTEycyAlcyc7CitteSAkc3RhdHVzX2hlYWQgPSBzcHJpbnRmKCRzdGF0dXNfZm10LCAnc3RhZ2VkJywgJ3Vuc3RhZ2VkJywgJ3BhdGgnKTsKKworIyBSZXR1cm5zIGxpc3Qgb2YgaGFzaGVzLCBjb250ZW50cyBvZiBlYWNoIG9mIHdoaWNoIGFyZToKKyMgUFJJTlQ6CXByaW50IG1lc3NhZ2UKKyMgVkFMVUU6CXBhdGhuYW1lCisjIEJJTkFSWToJaXMgYSBiaW5hcnkgcGF0aAorIyBJTkRFWDoJaXMgaW5kZXggZGlmZmVyZW50IGZyb20gSEVBRD8KKyMgRklMRToJCWlzIGZpbGUgZGlmZmVyZW50IGZyb20gaW5kZXg/CisjIElOREVYX0FERERFTDoJaXMgaXQgYWRkL2RlbGV0ZSBiZXR3ZWVuIEhFQUQgYW5kIGluZGV4PworIyBGSUxFX0FERERFTDoJaXMgaXQgYWRkL2RlbGV0ZSBiZXR3ZWVuIGluZGV4IGFuZCBmaWxlPworCitzdWIgbGlzdF9tb2RpZmllZCB7CisJbXkgKCRvbmx5KSA9IEBfOworCW15ICglZGF0YSwgQHJldHVybik7CisJbXkgKCRhZGQsICRkZWwsICRhZGRkZWwsICRmaWxlKTsKKworCWZvciAocnVuX2NtZF9waXBlKHF3KGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkCisJCQkgICAgIC0tbnVtc3RhdCAtLXN1bW1hcnkgSEVBRCkpKSB7CisJCWlmICgoJGFkZCwgJGRlbCwgJGZpbGUpID0KKwkJICAgIC9eKFstXGRdKykJKFstXGRdKykJKC4qKS8pIHsKKwkJCW15ICgkY2hhbmdlLCAkYmluKTsKKwkJCWlmICgkYWRkIGVxICctJyAmJiAkZGVsIGVxICctJykgeworCQkJCSRjaGFuZ2UgPSAnYmluYXJ5JzsKKwkJCQkkYmluID0gMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSRjaGFuZ2UgPSAiKyRhZGQvLSRkZWwiOworCQkJfQorCQkJJGRhdGF7JGZpbGV9ID0geworCQkJCUlOREVYID0+ICRjaGFuZ2UsCisJCQkJQklOQVJZID0+ICRiaW4sCisJCQkJRklMRSA9PiAnbm90aGluZycsCisJCQl9CisJCX0KKwkJZWxzaWYgKCgkYWRkZGVsLCAkZmlsZSkgPQorCQkgICAgICAgL14gKGNyZWF0ZXxkZWxldGUpIG1vZGUgWzAtN10rICguKikkLykgeworCQkJJGRhdGF7JGZpbGV9e0lOREVYX0FERERFTH0gPSAkYWRkZGVsOworCQl9CisJfQorCisJZm9yIChydW5fY21kX3BpcGUocXcoZ2l0IGRpZmYtZmlsZXMgLS1udW1zdGF0IC0tc3VtbWFyeSkpKSB7CisJCWlmICgoJGFkZCwgJGRlbCwgJGZpbGUpID0KKwkJICAgIC9eKFstXGRdKykJKFstXGRdKykJKC4qKS8pIHsKKwkJCWlmICghZXhpc3RzICRkYXRheyRmaWxlfSkgeworCQkJCSRkYXRheyRmaWxlfSA9ICt7CisJCQkJCUlOREVYID0+ICd1bmNoYW5nZWQnLAorCQkJCQlCSU5BUlkgPT4gMCwKKwkJCQl9OworCQkJfQorCQkJbXkgKCRjaGFuZ2UsICRiaW4pOworCQkJaWYgKCRhZGQgZXEgJy0nICYmICRkZWwgZXEgJy0nKSB7CisJCQkJJGNoYW5nZSA9ICdiaW5hcnknOworCQkJCSRiaW4gPSAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJJGNoYW5nZSA9ICIrJGFkZC8tJGRlbCI7CisJCQl9CisJCQkkZGF0YXskZmlsZX17RklMRX0gPSAkY2hhbmdlOworCQkJaWYgKCRiaW4pIHsKKwkJCQkkZGF0YXskZmlsZX17QklOQVJZfSA9IDE7CisJCQl9CisJCX0KKwkJZWxzaWYgKCgkYWRkZGVsLCAkZmlsZSkgPQorCQkgICAgICAgL14gKGNyZWF0ZXxkZWxldGUpIG1vZGUgWzAtN10rICguKikkLykgeworCQkJJGRhdGF7JGZpbGV9e0ZJTEVfQUREREVMfSA9ICRhZGRkZWw7CisJCX0KKwl9CisKKwlmb3IgKHNvcnQga2V5cyAlZGF0YSkgeworCQlteSAkaXQgPSAkZGF0YXskX307CisKKwkJaWYgKCRvbmx5KSB7CisJCQlpZiAoJG9ubHkgZXEgJ2luZGV4LW9ubHknKSB7CisJCQkJbmV4dCBpZiAoJGl0LT57SU5ERVh9IGVxICd1bmNoYW5nZWQnKTsKKwkJCX0KKwkJCWlmICgkb25seSBlcSAnZmlsZS1vbmx5JykgeworCQkJCW5leHQgaWYgKCRpdC0+e0ZJTEV9IGVxICdub3RoaW5nJyk7CisJCQl9CisJCX0KKwkJcHVzaCBAcmV0dXJuLCAreworCQkJVkFMVUUgPT4gJF8sCisJCQlQUklOVCA9PiAoc3ByaW50ZiAkc3RhdHVzX2ZtdCwKKwkJCQkgICRpdC0+e0lOREVYfSwgJGl0LT57RklMRX0sICRfKSwKKwkJCSUkaXQsCisJCX07CisJfQorCXJldHVybiBAcmV0dXJuOworfQorCitzdWIgZmluZF91bmlxdWUgeworCW15ICgkc3RyaW5nLCBAc3R1ZmYpID0gQF87CisJbXkgJGZvdW5kID0gdW5kZWY7CisJZm9yIChteSAkaSA9IDA7ICRpIDwgQHN0dWZmOyAkaSsrKSB7CisJCW15ICRpdCA9ICRzdHVmZlskaV07CisJCW15ICRoaXQgPSB1bmRlZjsKKwkJaWYgKHJlZiAkaXQpIHsKKwkJCWlmICgocmVmICRpdCkgZXEgJ0FSUkFZJykgeworCQkJCSRpdCA9ICRpdC0+WzBdOworCQkJfQorCQkJZWxzZSB7CisJCQkJJGl0ID0gJGl0LT57VkFMVUV9OworCQkJfQorCQl9CisJCWV2YWwgeworCQkJaWYgKCRpdCA9fiAvXiRzdHJpbmcvKSB7CisJCQkJJGhpdCA9IDE7CisJCQl9OworCQl9OworCQlpZiAoZGVmaW5lZCAkaGl0ICYmIGRlZmluZWQgJGZvdW5kKSB7CisJCQlyZXR1cm4gdW5kZWY7CisJCX0KKwkJaWYgKCRoaXQpIHsKKwkJCSRmb3VuZCA9ICRpICsgMTsKKwkJfQorCX0KKwlyZXR1cm4gJGZvdW5kOworfQorCitzdWIgbGlzdF9hbmRfY2hvb3NlIHsKKwlteSAoJG9wdHMsIEBzdHVmZikgPSBAXzsKKwlteSAoQGNob3NlbiwgQHJldHVybik7CisJbXkgJGk7CisKKyAgICAgIFRPUExPT1A6CisJd2hpbGUgKDEpIHsKKwkJbXkgJGxhc3RfbGYgPSAwOworCisJCWlmICgkb3B0cy0+e0hFQURFUn0pIHsKKwkJCWlmICghJG9wdHMtPntMSVNUX0ZMQVR9KSB7CisJCQkJcHJpbnQgIiAgICAgIjsKKwkJCX0KKwkJCXByaW50ICIkb3B0cy0+e0hFQURFUn1cbiI7CisJCX0KKwkJZm9yICgkaSA9IDA7ICRpIDwgQHN0dWZmOyAkaSsrKSB7CisJCQlteSAkY2hvc2VuID0gJGNob3NlblskaV0gPyAnKicgOiAnICc7CisJCQlteSAkcHJpbnQgPSAkc3R1ZmZbJGldOworCQkJaWYgKHJlZiAkcHJpbnQpIHsKKwkJCQlpZiAoKHJlZiAkcHJpbnQpIGVxICdBUlJBWScpIHsKKwkJCQkJJHByaW50ID0gJHByaW50LT5bMF07CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkkcHJpbnQgPSAkcHJpbnQtPntQUklOVH07CisJCQkJfQorCQkJfQorCQkJcHJpbnRmKCIlcyUyZDogJXMiLCAkY2hvc2VuLCAkaSsxLCAkcHJpbnQpOworCQkJaWYgKCgkb3B0cy0+e0xJU1RfRkxBVH0pICYmCisJCQkgICAgKCgkaSArIDEpICUgKCRvcHRzLT57TElTVF9GTEFUfSkpKSB7CisJCQkJcHJpbnQgIlx0IjsKKwkJCQkkbGFzdF9sZiA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludCAiXG4iOworCQkJCSRsYXN0X2xmID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoISRsYXN0X2xmKSB7CisJCQlwcmludCAiXG4iOworCQl9CisKKwkJcmV0dXJuIGlmICgkb3B0cy0+e0xJU1RfT05MWX0pOworCisJCXByaW50ICRvcHRzLT57UFJPTVBUfTsKKwkJaWYgKCRvcHRzLT57U0lOR0xFVE9OfSkgeworCQkJcHJpbnQgIj4gIjsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ICI+PiAiOworCQl9CisJCW15ICRsaW5lID0gPFNURElOPjsKKwkJbGFzdCBpZiAoISRsaW5lKTsKKwkJY2hvbXAgJGxpbmU7CisJCW15ICRkb25lc29tZXRoaW5nID0gMDsKKwkJZm9yIG15ICRjaG9pY2UgKHNwbGl0KC9bXHMsXSsvLCAkbGluZSkpIHsKKwkJCW15ICRjaG9vc2UgPSAxOworCQkJbXkgKCRib3R0b20sICR0b3ApOworCisJCQkjIElucHV0IHRoYXQgYmVnaW5zIHdpdGggJy0nOyB1bmNob29zZQorCQkJaWYgKCRjaG9pY2UgPX4gcy9eLS8vKSB7CisJCQkJJGNob29zZSA9IDA7CisJCQl9CisJCQkjIEEgcmFuZ2UgY2FuIGJlIHNwZWNpZmllZCBsaWtlIDUtNworCQkJaWYgKCRjaG9pY2UgPX4gL14oXGQrKS0oXGQrKSQvKSB7CisJCQkJKCRib3R0b20sICR0b3ApID0gKCQxLCAkMik7CisJCQl9CisJCQllbHNpZiAoJGNob2ljZSA9fiAvXlxkKyQvKSB7CisJCQkJJGJvdHRvbSA9ICR0b3AgPSAkY2hvaWNlOworCQkJfQorCQkJZWxzaWYgKCRjaG9pY2UgZXEgJyonKSB7CisJCQkJJGJvdHRvbSA9IDE7CisJCQkJJHRvcCA9IDEgKyBAc3R1ZmY7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkYm90dG9tID0gJHRvcCA9IGZpbmRfdW5pcXVlKCRjaG9pY2UsIEBzdHVmZik7CisJCQkJaWYgKCFkZWZpbmVkICRib3R0b20pIHsKKwkJCQkJcHJpbnQgIkh1aCAoJGNob2ljZSk/XG4iOworCQkJCQluZXh0IFRPUExPT1A7CisJCQkJfQorCQkJfQorCQkJaWYgKCRvcHRzLT57U0lOR0xFVE9OfSAmJiAkYm90dG9tICE9ICR0b3ApIHsKKwkJCQlwcmludCAiSHVoICgkY2hvaWNlKT9cbiI7CisJCQkJbmV4dCBUT1BMT09QOworCQkJfQorCQkJZm9yICgkaSA9ICRib3R0b20tMTsgJGkgPD0gJHRvcC0xOyAkaSsrKSB7CisJCQkJbmV4dCBpZiAoQHN0dWZmIDw9ICRpKTsKKwkJCQkkY2hvc2VuWyRpXSA9ICRjaG9vc2U7CisJCQkJJGRvbmVzb21ldGhpbmcrKzsKKwkJCX0KKwkJfQorCQlsYXN0IGlmICghJGRvbmVzb21ldGhpbmcgfHwgJG9wdHMtPntJTU1FRElBVEV9KTsKKwl9CisJZm9yICgkaSA9IDA7ICRpIDwgQHN0dWZmOyAkaSsrKSB7CisJCWlmICgkY2hvc2VuWyRpXSkgeworCQkJcHVzaCBAcmV0dXJuLCAkc3R1ZmZbJGldOworCQl9CisJfQorCXJldHVybiBAcmV0dXJuOworfQorCitzdWIgc3RhdHVzX2NtZCB7CisJbGlzdF9hbmRfY2hvb3NlKHsgTElTVF9PTkxZID0+IDEsIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQgfSwKKwkJCWxpc3RfbW9kaWZpZWQoKSk7CisJcHJpbnQgIlxuIjsKK30KKworc3ViIHNheV9uX3BhdGhzIHsKKwlteSAkZGlkID0gc2hpZnQgQF87CisJbXkgJGNudCA9IHNjYWxhciBAXzsKKwlwcmludCAiJGRpZCAiOworCWlmICgxIDwgJGNudCkgeworCQlwcmludCAiJGNudCBwYXRoc1xuIjsKKwl9CisJZWxzZSB7CisJCXByaW50ICJvbmUgcGF0aFxuIjsKKwl9Cit9CisKK3N1YiB1cGRhdGVfY21kIHsKKwlteSBAbW9kcyA9IGxpc3RfbW9kaWZpZWQoJ2ZpbGUtb25seScpOworCXJldHVybiBpZiAoIUBtb2RzKTsKKworCW15IEB1cGRhdGUgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ1VwZGF0ZScsCisJCQkJICAgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgICBAbW9kcyk7CisJaWYgKEB1cGRhdGUpIHsKKwkJc3lzdGVtKHF3KGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLS0pLAorCQkgICAgICAgbWFwIHsgJF8tPntWQUxVRX0gfSBAdXBkYXRlKTsKKwkJc2F5X25fcGF0aHMoJ3VwZGF0ZWQnLCBAdXBkYXRlKTsKKwl9CisJcHJpbnQgIlxuIjsKK30KKworc3ViIHJldmVydF9jbWQgeworCW15IEB1cGRhdGUgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ1JldmVydCcsCisJCQkJICAgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgICBsaXN0X21vZGlmaWVkKCkpOworCWlmIChAdXBkYXRlKSB7CisJCW15IEBsaW5lcyA9IHJ1bl9jbWRfcGlwZShxdyhnaXQgbHMtdHJlZSBIRUFEIC0tKSwKKwkJCQkJIG1hcCB7ICRfLT57VkFMVUV9IH0gQHVwZGF0ZSk7CisJCW15ICRmaDsKKwkJb3BlbiAkZmgsICd8LScsIHF3KGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvKQorCQkgICAgb3IgZGllOworCQlmb3IgKEBsaW5lcykgeworCQkJcHJpbnQgJGZoICRfOworCQl9CisJCWNsb3NlKCRmaCk7CisJCWZvciAoQHVwZGF0ZSkgeworCQkJaWYgKCRfLT57SU5ERVhfQUREREVMfSAmJgorCQkJICAgICRfLT57SU5ERVhfQUREREVMfSBlcSAnY3JlYXRlJykgeworCQkJCXN5c3RlbShxdyhnaXQgdXBkYXRlLWluZGV4IC0tZm9yY2UtcmVtb3ZlIC0tKSwKKwkJCQkgICAgICAgJF8tPntWQUxVRX0pOworCQkJCXByaW50ICJub3RlOiAkXy0+e1ZBTFVFfSBpcyB1bnRyYWNrZWQgbm93LlxuIjsKKwkJCX0KKwkJfQorCQlyZWZyZXNoKCk7CisJCXNheV9uX3BhdGhzKCdyZXZlcnRlZCcsIEB1cGRhdGUpOworCX0KKwlwcmludCAiXG4iOworfQorCitzdWIgYWRkX3VudHJhY2tlZF9jbWQgeworCW15IEBhZGQgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ0FkZCB1bnRyYWNrZWQnIH0sCisJCQkJICBsaXN0X3VudHJhY2tlZCgpKTsKKwlpZiAoQGFkZCkgeworCQlzeXN0ZW0ocXcoZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLSksIEBhZGQpOworCQlzYXlfbl9wYXRocygnYWRkZWQnLCBAYWRkKTsKKwl9CisJcHJpbnQgIlxuIjsKK30KKworc3ViIHBhcnNlX2RpZmYgeworCW15ICgkcGF0aCkgPSBAXzsKKwlteSBAZGlmZiA9IHJ1bl9jbWRfcGlwZShxdyhnaXQgZGlmZi1maWxlcyAtcCAtLSksICRwYXRoKTsKKwlteSAoQGh1bmspID0geyBURVhUID0+IFtdIH07CisKKwlmb3IgKEBkaWZmKSB7CisJCWlmICgvXkBAIC8pIHsKKwkJCXB1c2ggQGh1bmssIHsgVEVYVCA9PiBbXSB9OworCQl9CisJCXB1c2ggQHskaHVua1stMV17VEVYVH19LCAkXzsKKwl9CisJcmV0dXJuIEBodW5rOworfQorCitzdWIgaHVua19zcGxpdHRhYmxlIHsKKwlteSAoJHRleHQpID0gQF87CisKKwlteSBAcyA9IHNwbGl0X2h1bmsoJHRleHQpOworCXJldHVybiAoMSA8IEBzKTsKK30KKworc3ViIHBhcnNlX2h1bmtfaGVhZGVyIHsKKwlteSAoJGxpbmUpID0gQF87CisJbXkgKCRvX29mcywgJG9fY250LCAkbl9vZnMsICRuX2NudCkgPQorCSAgICAkbGluZSA9fiAvXkBAIC0oXGQrKSg/OiwoXGQrKSkgXCsoXGQrKSg/OiwoXGQrKSkgQEAvOworCXJldHVybiAoJG9fb2ZzLCAkb19jbnQsICRuX29mcywgJG5fY250KTsKK30KKworc3ViIHNwbGl0X2h1bmsgeworCW15ICgkdGV4dCkgPSBAXzsKKwlteSBAc3BsaXQgPSAoKTsKKworCSMgSWYgdGhlcmUgYXJlIGNvbnRleHQgbGluZXMgaW4gdGhlIG1pZGRsZSBvZiBhIGh1bmssCisJIyBpdCBjYW4gYmUgc3BsaXQsIGJ1dCB3ZSB3b3VsZCBuZWVkIHRvIHRha2UgY2FyZSBvZgorCSMgb3ZlcmxhcHMgbGF0ZXIuCisKKwlteSAoJG9fb2ZzLCAkb19jbnQsICRuX29mcywgJG5fY250KSA9IHBhcnNlX2h1bmtfaGVhZGVyKCR0ZXh0LT5bMF0pOworCW15ICRodW5rX3N0YXJ0ID0gMTsKKwlteSAkbmV4dF9odW5rX3N0YXJ0OworCisgICAgICBPVVRFUjoKKwl3aGlsZSAoMSkgeworCQlteSAkbmV4dF9odW5rX3N0YXJ0ID0gdW5kZWY7CisJCW15ICRpID0gJGh1bmtfc3RhcnQgLSAxOworCQlteSAkdGhpcyA9ICt7CisJCQlURVhUID0+IFtdLAorCQkJT0xEID0+ICRvX29mcywKKwkJCU5FVyA9PiAkbl9vZnMsCisJCQlPQ05UID0+IDAsCisJCQlOQ05UID0+IDAsCisJCQlBRERERUwgPT4gMCwKKwkJCVBPU1RDVFggPT4gMCwKKwkJfTsKKworCQl3aGlsZSAoKyskaSA8IEAkdGV4dCkgeworCQkJbXkgJGxpbmUgPSAkdGV4dC0+WyRpXTsKKwkJCWlmICgkbGluZSA9fiAvXiAvKSB7CisJCQkJaWYgKCR0aGlzLT57QUREREVMfSAmJgorCQkJCSAgICAhZGVmaW5lZCAkbmV4dF9odW5rX3N0YXJ0KSB7CisJCQkJCSMgV2UgaGF2ZSBzZWVuIGxlYWRpbmcgY29udGV4dCBhbmQKKwkJCQkJIyBhZGRzL2RlbHMgYW5kIHRoZW4gaGVyZSBpcyBhbm90aGVyCisJCQkJCSMgY29udGV4dCwgd2hpY2ggaXMgdHJhaWxpbmcgZm9yIHRoaXMKKwkJCQkJIyBzcGxpdCBodW5rIGFuZCBsZWFkaW5nIGZvciB0aGUgbmV4dAorCQkJCQkjIG9uZS4KKwkJCQkJJG5leHRfaHVua19zdGFydCA9ICRpOworCQkJCX0KKwkJCQlwdXNoIEB7JHRoaXMtPntURVhUfX0sICRsaW5lOworCQkJCSR0aGlzLT57T0NOVH0rKzsKKwkJCQkkdGhpcy0+e05DTlR9Kys7CisJCQkJaWYgKGRlZmluZWQgJG5leHRfaHVua19zdGFydCkgeworCQkJCQkkdGhpcy0+e1BPU1RDVFh9Kys7CisJCQkJfQorCQkJCW5leHQ7CisJCQl9CisKKwkJCSMgYWRkL2RlbAorCQkJaWYgKGRlZmluZWQgJG5leHRfaHVua19zdGFydCkgeworCQkJCSMgV2UgYXJlIGRvbmUgd2l0aCB0aGUgY3VycmVudCBodW5rIGFuZAorCQkJCSMgdGhpcyBpcyB0aGUgZmlyc3QgcmVhbCBjaGFuZ2UgZm9yIHRoZQorCQkJCSMgbmV4dCBzcGxpdCBvbmUuCisJCQkJJGh1bmtfc3RhcnQgPSAkbmV4dF9odW5rX3N0YXJ0OworCQkJCSRvX29mcyA9ICR0aGlzLT57T0xEfSArICR0aGlzLT57T0NOVH07CisJCQkJJG5fb2ZzID0gJHRoaXMtPntORVd9ICsgJHRoaXMtPntOQ05UfTsKKwkJCQkkb19vZnMgLT0gJHRoaXMtPntQT1NUQ1RYfTsKKwkJCQkkbl9vZnMgLT0gJHRoaXMtPntQT1NUQ1RYfTsKKwkJCQlwdXNoIEBzcGxpdCwgJHRoaXM7CisJCQkJcmVkbyBPVVRFUjsKKwkJCX0KKwkJCXB1c2ggQHskdGhpcy0+e1RFWFR9fSwgJGxpbmU7CisJCQkkdGhpcy0+e0FERERFTH0rKzsKKwkJCWlmICgkbGluZSA9fiAvXi0vKSB7CisJCQkJJHRoaXMtPntPQ05UfSsrOworCQkJfQorCQkJZWxzZSB7CisJCQkJJHRoaXMtPntOQ05UfSsrOworCQkJfQorCQl9CisKKwkJcHVzaCBAc3BsaXQsICR0aGlzOworCQlsYXN0OworCX0KKworCWZvciBteSAkaHVuayAoQHNwbGl0KSB7CisJCSRvX29mcyA9ICRodW5rLT57T0xEfTsKKwkJJG5fb2ZzID0gJGh1bmstPntORVd9OworCQkkb19jbnQgPSAkaHVuay0+e09DTlR9OworCQkkbl9jbnQgPSAkaHVuay0+e05DTlR9OworCisJCW15ICRoZWFkID0gKCJAQCAtJG9fb2ZzIiAuCisJCQkgICAgKCgkb19jbnQgIT0gMSkgPyAiLCRvX2NudCIgOiAnJykgLgorCQkJICAgICIgKyRuX29mcyIgLgorCQkJICAgICgoJG5fY250ICE9IDEpID8gIiwkbl9jbnQiIDogJycpIC4KKwkJCSAgICAiIEBAXG4iKTsKKwkJdW5zaGlmdCBAeyRodW5rLT57VEVYVH19LCAkaGVhZDsKKwl9CisJcmV0dXJuIG1hcCB7ICRfLT57VEVYVH0gfSBAc3BsaXQ7Cit9CisKK3N1YiBmaW5kX2xhc3Rfb19jdHggeworCW15ICgkaXQpID0gQF87CisJbXkgJHRleHQgPSAkaXQtPntURVhUfTsKKwlteSAoJG9fb2ZzLCAkb19jbnQsICRuX29mcywgJG5fY250KSA9IHBhcnNlX2h1bmtfaGVhZGVyKCR0ZXh0LT5bMF0pOworCW15ICRpID0gQHskdGV4dH07CisJbXkgJGxhc3Rfb19jdHggPSAkb19vZnMgKyAkb19jbnQ7CisJd2hpbGUgKDAgPCAtLSRpKSB7CisJCW15ICRsaW5lID0gJHRleHQtPlskaV07CisJCWlmICgkbGluZSA9fiAvXiAvKSB7CisJCQkkbGFzdF9vX2N0eC0tOworCQkJbmV4dDsKKwkJfQorCQlsYXN0OworCX0KKwlyZXR1cm4gJGxhc3Rfb19jdHg7Cit9CisKK3N1YiBtZXJnZV9odW5rIHsKKwlteSAoJHByZXYsICR0aGlzKSA9IEBfOworCW15ICgkbzBfb2ZzLCAkbzBfY250LCAkbjBfb2ZzLCAkbjBfY250KSA9CisJICAgIHBhcnNlX2h1bmtfaGVhZGVyKCRwcmV2LT57VEVYVH1bMF0pOworCW15ICgkbzFfb2ZzLCAkbzFfY250LCAkbjFfb2ZzLCAkbjFfY250KSA9CisJICAgIHBhcnNlX2h1bmtfaGVhZGVyKCR0aGlzLT57VEVYVH1bMF0pOworCisJbXkgKEBsaW5lLCAkaSwgJG9mcywgJG9fY250LCAkbl9jbnQpOworCSRvZnMgPSAkbzBfb2ZzOworCSRvX2NudCA9ICRuX2NudCA9IDA7CisJZm9yICgkaSA9IDE7ICRpIDwgQHskcHJldi0+e1RFWFR9fTsgJGkrKykgeworCQlteSAkbGluZSA9ICRwcmV2LT57VEVYVH1bJGldOworCQlpZiAoJGxpbmUgPX4gL15cKy8pIHsKKwkJCSRuX2NudCsrOworCQkJcHVzaCBAbGluZSwgJGxpbmU7CisJCQluZXh0OworCQl9CisKKwkJbGFzdCBpZiAoJG8xX29mcyA8PSAkb2ZzKTsKKworCQkkb19jbnQrKzsKKwkJJG9mcysrOworCQlpZiAoJGxpbmUgPX4gL14gLykgeworCQkJJG5fY250Kys7CisJCX0KKwkJcHVzaCBAbGluZSwgJGxpbmU7CisJfQorCisJZm9yICgkaSA9IDE7ICRpIDwgQHskdGhpcy0+e1RFWFR9fTsgJGkrKykgeworCQlteSAkbGluZSA9ICR0aGlzLT57VEVYVH1bJGldOworCQlpZiAoJGxpbmUgPX4gL15cKy8pIHsKKwkJCSRuX2NudCsrOworCQkJcHVzaCBAbGluZSwgJGxpbmU7CisJCQluZXh0OworCQl9CisJCSRvZnMrKzsKKwkJJG9fY250Kys7CisJCWlmICgkbGluZSA9fiAvXiAvKSB7CisJCQkkbl9jbnQrKzsKKwkJfQorCQlwdXNoIEBsaW5lLCAkbGluZTsKKwl9CisJbXkgJGhlYWQgPSAoIkBAIC0kbzBfb2ZzIiAuCisJCSAgICAoKCRvX2NudCAhPSAxKSA/ICIsJG9fY250IiA6ICcnKSAuCisJCSAgICAiICskbjBfb2ZzIiAuCisJCSAgICAoKCRuX2NudCAhPSAxKSA/ICIsJG5fY250IiA6ICcnKSAuCisJCSAgICAiIEBAXG4iKTsKKwlAeyRwcmV2LT57VEVYVH19ID0gKCRoZWFkLCBAbGluZSk7Cit9CisKK3N1YiBjb2FsZXNjZV9vdmVybGFwcGluZ19odW5rcyB7CisJbXkgKEBpbikgPSBAXzsKKwlteSBAb3V0ID0gKCk7CisKKwlteSAoJGxhc3Rfb19jdHgpOworCisJZm9yIChncmVwIHsgJF8tPntVU0V9IH0gQGluKSB7CisJCW15ICR0ZXh0ID0gJF8tPntURVhUfTsKKwkJbXkgKCRvX29mcywgJG9fY250LCAkbl9vZnMsICRuX2NudCkgPQorCQkgICAgcGFyc2VfaHVua19oZWFkZXIoJHRleHQtPlswXSk7CisJCWlmIChkZWZpbmVkICRsYXN0X29fY3R4ICYmCisJCSAgICAkb19vZnMgPD0gJGxhc3Rfb19jdHgpIHsKKwkJCW1lcmdlX2h1bmsoJG91dFstMV0sICRfKTsKKwkJfQorCQllbHNlIHsKKwkJCXB1c2ggQG91dCwgJF87CisJCX0KKwkJJGxhc3Rfb19jdHggPSBmaW5kX2xhc3Rfb19jdHgoJG91dFstMV0pOworCX0KKwlyZXR1cm4gQG91dDsKK30KKworc3ViIGhlbHBfcGF0Y2hfY21kIHsKKwlwcmludCA8PFxFT0YgOworeSAtIHN0YWdlIHRoaXMgaHVuaworbiAtIGRvIG5vdCBzdGFnZSB0aGlzIGh1bmsKK2EgLSBzdGFnZSB0aGlzIGFuZCBhbGwgdGhlIHJlbWFpbmluZyBodW5rcworZCAtIGRvIG5vdCBzdGFnZSB0aGlzIGh1bmsgbm9yIGFueSBvZiB0aGUgcmVtYWluaW5nIGh1bmtzCitqIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIG5leHQgdW5kZWNpZGVkIGh1bmsKK0ogLSBsZWF2ZSB0aGlzIGh1bmsgdW5kZWNpZGVkLCBzZWUgbmV4dCBodW5rCitrIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIHByZXZpb3VzIHVuZGVjaWRlZCBodW5rCitLIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIHByZXZpb3VzIGh1bmsKK3MgLSBzcGxpdCB0aGUgY3VycmVudCBodW5rIGludG8gc21hbGxlciBodW5rcworRU9GCit9CisKK3N1YiBwYXRjaF91cGRhdGVfY21kIHsKKwlteSBAbW9kcyA9IGxpc3RfbW9kaWZpZWQoJ2ZpbGUtb25seScpOworCUBtb2RzID0gZ3JlcCB7ICEoJF8tPntCSU5BUll9KSB9IEBtb2RzOworCXJldHVybiBpZiAoIUBtb2RzKTsKKworCW15ICgkaXQpID0gbGlzdF9hbmRfY2hvb3NlKHsgUFJPTVBUID0+ICdQYXRjaCB1cGRhdGUnLAorCQkJCSAgICAgU0lOR0xFVE9OID0+IDEsCisJCQkJICAgICBJTU1FRElBVEUgPT4gMSwKKwkJCQkgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgQG1vZHMpOworCXJldHVybiBpZiAoISRpdCk7CisKKwlteSAoJGl4LCAkbnVtKTsKKwlteSAkcGF0aCA9ICRpdC0+e1ZBTFVFfTsKKwlteSAoJGhlYWQsIEBodW5rKSA9IHBhcnNlX2RpZmYoJHBhdGgpOworCWZvciAoQHskaGVhZC0+e1RFWFR9fSkgeworCQlwcmludDsKKwl9CisJJG51bSA9IHNjYWxhciBAaHVuazsKKwkkaXggPSAwOworCisJd2hpbGUgKDEpIHsKKwkJbXkgKCRwcmV2LCAkbmV4dCwgJG90aGVyLCAkdW5kZWNpZGVkLCAkaSk7CisJCSRvdGhlciA9ICcnOworCisJCWlmICgkbnVtIDw9ICRpeCkgeworCQkJJGl4ID0gMDsKKwkJfQorCQlmb3IgKCRpID0gMDsgJGkgPCAkaXg7ICRpKyspIHsKKwkJCWlmICghZGVmaW5lZCAkaHVua1skaV17VVNFfSkgeworCQkJCSRwcmV2ID0gMTsKKwkJCQkkb3RoZXIgLj0gJy9rJzsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWlmICgkaXgpIHsKKwkJCSRvdGhlciAuPSAnL0snOworCQl9CisJCWZvciAoJGkgPSAkaXggKyAxOyAkaSA8ICRudW07ICRpKyspIHsKKwkJCWlmICghZGVmaW5lZCAkaHVua1skaV17VVNFfSkgeworCQkJCSRuZXh0ID0gMTsKKwkJCQkkb3RoZXIgLj0gJy9qJzsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWlmICgkaXggPCAkbnVtIC0gMSkgeworCQkJJG90aGVyIC49ICcvSic7CisJCX0KKwkJZm9yICgkaSA9IDA7ICRpIDwgJG51bTsgJGkrKykgeworCQkJaWYgKCFkZWZpbmVkICRodW5rWyRpXXtVU0V9KSB7CisJCQkJJHVuZGVjaWRlZCA9IDE7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQlsYXN0IGlmICghJHVuZGVjaWRlZCk7CisKKwkJaWYgKGh1bmtfc3BsaXR0YWJsZSgkaHVua1skaXhde1RFWFR9KSkgeworCQkJJG90aGVyIC49ICcvcyc7CisJCX0KKwkJZm9yIChAeyRodW5rWyRpeF17VEVYVH19KSB7CisJCQlwcmludDsKKwkJfQorCQlwcmludCAiU3RhZ2UgdGhpcyBodW5rIFt5L24vYS9kJG90aGVyLz9dPyAiOworCQlteSAkbGluZSA9IDxTVERJTj47CisJCWlmICgkbGluZSkgeworCQkJaWYgKCRsaW5lID1+IC9eeS9pKSB7CisJCQkJJGh1bmtbJGl4XXtVU0V9ID0gMTsKKwkJCX0KKwkJCWVsc2lmICgkbGluZSA9fiAvXm4vaSkgeworCQkJCSRodW5rWyRpeF17VVNFfSA9IDA7CisJCQl9CisJCQllbHNpZiAoJGxpbmUgPX4gL15hL2kpIHsKKwkJCQl3aGlsZSAoJGl4IDwgJG51bSkgeworCQkJCQlpZiAoIWRlZmluZWQgJGh1bmtbJGl4XXtVU0V9KSB7CisJCQkJCQkkaHVua1skaXhde1VTRX0gPSAxOworCQkJCQl9CisJCQkJCSRpeCsrOworCQkJCX0KKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRsaW5lID1+IC9eZC9pKSB7CisJCQkJd2hpbGUgKCRpeCA8ICRudW0pIHsKKwkJCQkJaWYgKCFkZWZpbmVkICRodW5rWyRpeF17VVNFfSkgeworCQkJCQkJJGh1bmtbJGl4XXtVU0V9ID0gMDsKKwkJCQkJfQorCQkJCQkkaXgrKzsKKwkJCQl9CisJCQkJbmV4dDsKKwkJCX0KKwkJCWVsc2lmICgkb3RoZXIgPX4gL0svICYmICRsaW5lID1+IC9eSy8pIHsKKwkJCQkkaXgtLTsKKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRvdGhlciA9fiAvSi8gJiYgJGxpbmUgPX4gL15KLykgeworCQkJCSRpeCsrOworCQkJCW5leHQ7CisJCQl9CisJCQllbHNpZiAoJG90aGVyID1+IC9rLyAmJiAkbGluZSA9fiAvXmsvKSB7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJJGl4LS07CisJCQkJCWxhc3QgaWYgKCEkaXggfHwKKwkJCQkJCSAhZGVmaW5lZCAkaHVua1skaXhde1VTRX0pOworCQkJCX0KKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRvdGhlciA9fiAvai8gJiYgJGxpbmUgPX4gL15qLykgeworCQkJCXdoaWxlICgxKSB7CisJCQkJCSRpeCsrOworCQkJCQlsYXN0IGlmICgkaXggPj0gJG51bSB8fAorCQkJCQkJICFkZWZpbmVkICRodW5rWyRpeF17VVNFfSk7CisJCQkJfQorCQkJCW5leHQ7CisJCQl9CisJCQllbHNpZiAoJG90aGVyID1+IC9zLyAmJiAkbGluZSA9fiAvXnMvKSB7CisJCQkJbXkgQHNwbGl0ID0gc3BsaXRfaHVuaygkaHVua1skaXhde1RFWFR9KTsKKwkJCQlpZiAoMSA8IEBzcGxpdCkgeworCQkJCQlwcmludCAiU3BsaXQgaW50byAiLAorCQkJCQlzY2FsYXIoQHNwbGl0KSwgIiBodW5rcy5cbiI7CisJCQkJfQorCQkJCXNwbGljZShAaHVuaywgJGl4LCAxLAorCQkJCSAgICAgICBtYXAgeyAreyBURVhUID0+ICRfLCBVU0UgPT4gdW5kZWYgfSB9CisJCQkJICAgICAgIEBzcGxpdCk7CisJCQkJJG51bSA9IHNjYWxhciBAaHVuazsKKwkJCQluZXh0OworCQkJfQorCQkJZWxzZSB7CisJCQkJaGVscF9wYXRjaF9jbWQoJG90aGVyKTsKKwkJCQluZXh0OworCQkJfQorCQkJIyBzb2Z0IGluY3JlbWVudAorCQkJd2hpbGUgKDEpIHsKKwkJCQkkaXgrKzsKKwkJCQlsYXN0IGlmICgkaXggPj0gJG51bSB8fAorCQkJCQkgIWRlZmluZWQgJGh1bmtbJGl4XXtVU0V9KTsKKwkJCX0KKwkJfQorCX0KKworCUBodW5rID0gY29hbGVzY2Vfb3ZlcmxhcHBpbmdfaHVua3MoQGh1bmspOworCisJbXkgKCRvX2xvZnMsICRuX2xvZnMpID0gKDAsIDApOworCW15IEByZXN1bHQgPSAoKTsKKwlmb3IgKEBodW5rKSB7CisJCW15ICR0ZXh0ID0gJF8tPntURVhUfTsKKwkJbXkgKCRvX29mcywgJG9fY250LCAkbl9vZnMsICRuX2NudCkgPQorCQkgICAgcGFyc2VfaHVua19oZWFkZXIoJHRleHQtPlswXSk7CisKKwkJaWYgKCEkXy0+e1VTRX0pIHsKKwkJCWlmICghZGVmaW5lZCAkb19jbnQpIHsgJG9fY250ID0gMTsgfQorCQkJaWYgKCFkZWZpbmVkICRuX2NudCkgeyAkbl9jbnQgPSAxOyB9CisKKwkJCSMgV2Ugd291bGQgaGF2ZSBhZGRlZCAoJG5fY250IC0gJG9fY250KSBsaW5lcworCQkJIyB0byB0aGUgcG9zdGltYWdlIGlmIHdlIHdlcmUgdG8gdXNlIHRoaXMgaHVuaywKKwkJCSMgYnV0IHdlIGRpZG4ndC4gIFNvIHRoZSBsaW5lIG51bWJlciB0aGF0IHRoZSBuZXh0CisJCQkjIGh1bmsgc3RhcnRzIGF0IHdvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhhdCBtdWNoLgorCQkJJG5fbG9mcyAtPSAoJG5fY250IC0gJG9fY250KTsKKwkJCW5leHQ7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoJG5fbG9mcykgeworCQkJCSRuX29mcyArPSAkbl9sb2ZzOworCQkJCSR0ZXh0LT5bMF0gPSAoIkBAIC0kb19vZnMiIC4KKwkJCQkJICAgICAgKChkZWZpbmVkICRvX2NudCkKKwkJCQkJICAgICAgID8gIiwkb19jbnQiIDogJycpIC4KKwkJCQkJICAgICAgIiArJG5fb2ZzIiAuCisJCQkJCSAgICAgICgoZGVmaW5lZCAkbl9jbnQpCisJCQkJCSAgICAgICA/ICIsJG5fY250IiA6ICcnKSAuCisJCQkJCSAgICAgICIgQEBcbiIpOworCQkJfQorCQkJZm9yIChAJHRleHQpIHsKKwkJCQlwdXNoIEByZXN1bHQsICRfOworCQkJfQorCQl9CisJfQorCisJaWYgKEByZXN1bHQpIHsKKwkJbXkgJGZoOworCisJCW9wZW4gJGZoLCAnfC0nLCBxdyhnaXQgYXBwbHkgLS1jYWNoZWQpOworCQlmb3IgKEB7JGhlYWQtPntURVhUfX0sIEByZXN1bHQpIHsKKwkJCXByaW50ICRmaCAkXzsKKwkJfQorCQlpZiAoIWNsb3NlICRmaCkgeworCQkJZm9yIChAeyRoZWFkLT57VEVYVH19LCBAcmVzdWx0KSB7CisJCQkJcHJpbnQgU1RERVJSICRfOworCQkJfQorCQl9CisJCXJlZnJlc2goKTsKKwl9CisKKwlwcmludCAiXG4iOworfQorCitzdWIgZGlmZl9jbWQgeworCW15IEBtb2RzID0gbGlzdF9tb2RpZmllZCgnaW5kZXgtb25seScpOworCUBtb2RzID0gZ3JlcCB7ICEoJF8tPntCSU5BUll9KSB9IEBtb2RzOworCXJldHVybiBpZiAoIUBtb2RzKTsKKwlteSAoQHRoZW0pID0gbGlzdF9hbmRfY2hvb3NlKHsgUFJPTVBUID0+ICdSZXZpZXcgZGlmZicsCisJCQkJICAgICBJTU1FRElBVEUgPT4gMSwKKwkJCQkgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgQG1vZHMpOworCXJldHVybiBpZiAoIUB0aGVtKTsKKwlzeXN0ZW0ocXcoZ2l0IGRpZmYtaW5kZXggLXAgLS1jYWNoZWQgSEVBRCAtLSksCisJICAgICAgIG1hcCB7ICRfLT57VkFMVUV9IH0gQHRoZW0pOworfQorCitzdWIgcXVpdF9jbWQgeworCXByaW50ICJCeWUuXG4iOworCWV4aXQoMCk7Cit9CisKK3N1YiBoZWxwX2NtZCB7CisJcHJpbnQgPDxcRU9GIDsKK3N0YXR1cyAgICAgICAgLSBzaG93IHBhdGhzIHdpdGggY2hhbmdlcwordXBkYXRlICAgICAgICAtIGFkZCB3b3JraW5nIHRyZWUgc3RhdGUgdG8gdGhlIHN0YWdlZCBzZXQgb2YgY2hhbmdlcworcmV2ZXJ0ICAgICAgICAtIHJldmVydCBzdGFnZWQgc2V0IG9mIGNoYW5nZXMgYmFjayB0byB0aGUgSEVBRCB2ZXJzaW9uCitwYXRjaCAgICAgICAgIC0gcGljayBodW5rcyBhbmQgdXBkYXRlIHNlbGVjdGl2ZWx5CitkaWZmCSAgICAgIC0gdmlldyBkaWZmIGJldHdlZW4gSEVBRCBhbmQgaW5kZXgKK2FkZCB1bnRyYWNrZWQgLSBhZGQgY29udGVudHMgb2YgdW50cmFja2VkIGZpbGVzIHRvIHRoZSBzdGFnZWQgc2V0IG9mIGNoYW5nZXMKK0VPRgorfQorCitzdWIgbWFpbl9sb29wIHsKKwlteSBAY21kID0gKFsgJ3N0YXR1cycsIFwmc3RhdHVzX2NtZCwgXSwKKwkJICAgWyAndXBkYXRlJywgXCZ1cGRhdGVfY21kLCBdLAorCQkgICBbICdyZXZlcnQnLCBcJnJldmVydF9jbWQsIF0sCisJCSAgIFsgJ2FkZCB1bnRyYWNrZWQnLCBcJmFkZF91bnRyYWNrZWRfY21kLCBdLAorCQkgICBbICdwYXRjaCcsIFwmcGF0Y2hfdXBkYXRlX2NtZCwgXSwKKwkJICAgWyAnZGlmZicsIFwmZGlmZl9jbWQsIF0sCisJCSAgIFsgJ3F1aXQnLCBcJnF1aXRfY21kLCBdLAorCQkgICBbICdoZWxwJywgXCZoZWxwX2NtZCwgXSwKKwkpOworCXdoaWxlICgxKSB7CisJCW15ICgkaXQpID0gbGlzdF9hbmRfY2hvb3NlKHsgUFJPTVBUID0+ICdXaGF0IG5vdycsCisJCQkJCSAgICAgU0lOR0xFVE9OID0+IDEsCisJCQkJCSAgICAgTElTVF9GTEFUID0+IDQsCisJCQkJCSAgICAgSEVBREVSID0+ICcqKiogQ29tbWFuZHMgKioqJywKKwkJCQkJICAgICBJTU1FRElBVEUgPT4gMSB9LCBAY21kKTsKKwkJaWYgKCRpdCkgeworCQkJZXZhbCB7CisJCQkJJGl0LT5bMV0tPigpOworCQkJfTsKKwkJCWlmICgkQCkgeworCQkJCXByaW50ICIkQCI7CisJCQl9CisJCX0KKwl9Cit9CisKK215IEB6OworCityZWZyZXNoKCk7CitzdGF0dXNfY21kKCk7CittYWluX2xvb3AoKTsKZGlmZiAtLWdpdCBhL2dpdC1hbS5zaCBiL2dpdC1hbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjU3MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFtLnNoCkBAIC0wLDAgKzEsNDcyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEp1bmlvIEMgSGFtYW5vCisKK1VTQUdFPSdbLS1zaWdub2ZmXSBbLS1kb3Rlc3Q9PGRpcj5dIFstLXV0ZjggfCAtLW5vLXV0ZjhdIFstLWJpbmFyeV0gWy0tM3dheV0KKyAgWy0taW50ZXJhY3RpdmVdIFstLXdoaXRlc3BhY2U9PG9wdGlvbj5dIFstQzxuPl0gWy1wPG4+XSA8bWJveD4uLi4KKyAgb3IsIHdoZW4gcmVzdW1pbmcgWy0tc2tpcCB8IC0tcmVzb2x2ZWRdJworLiBnaXQtc2gtc2V0dXAKK3NldF9yZWZsb2dfYWN0aW9uIGFtCityZXF1aXJlX3dvcmtfdHJlZQorCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKK3N0b3BfaGVyZSAoKSB7CisgICAgZWNobyAiJDEiID4iJGRvdGVzdC9uZXh0IgorICAgIGV4aXQgMQorfQorCitzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICgpIHsKKyAgICBpZiBbIC1uICIkcmVzb2x2ZW1zZyIgXTsgdGhlbgorCSAgICBwcmludGYgJyVzXG4nICIkcmVzb2x2ZW1zZyIKKwkgICAgc3RvcF9oZXJlICQxCisgICAgZmkKKyAgICBjbWRsaW5lPSQoYmFzZW5hbWUgJDApCisgICAgaWYgdGVzdCAnJyAhPSAiJGludGVyYWN0aXZlIgorICAgIHRoZW4KKyAgICAgICAgY21kbGluZT0iJGNtZGxpbmUgLWkiCisgICAgZmkKKyAgICBpZiB0ZXN0ICcnICE9ICIkdGhyZWV3YXkiCisgICAgdGhlbgorICAgICAgICBjbWRsaW5lPSIkY21kbGluZSAtMyIKKyAgICBmaQorICAgIGlmIHRlc3QgJy5kb3Rlc3QnICE9ICIkZG90ZXN0IgorICAgIHRoZW4KKyAgICAgICAgY21kbGluZT0iJGNtZGxpbmUgLWQ9JGRvdGVzdCIKKyAgICBmaQorICAgIGVjaG8gIldoZW4geW91IGhhdmUgcmVzb2x2ZWQgdGhpcyBwcm9ibGVtIHJ1biBcIiRjbWRsaW5lIC0tcmVzb2x2ZWRcIi4iCisgICAgZWNobyAiSWYgeW91IHdvdWxkIHByZWZlciB0byBza2lwIHRoaXMgcGF0Y2gsIGluc3RlYWQgcnVuIFwiJGNtZGxpbmUgLS1za2lwXCIuIgorCisgICAgc3RvcF9oZXJlICQxCit9CisKK2dvX25leHQgKCkgeworCXJtIC1mICIkZG90ZXN0LyRtc2dudW0iICIkZG90ZXN0L21zZyIgIiRkb3Rlc3QvbXNnLWNsZWFuIiBcCisJCSIkZG90ZXN0L3BhdGNoIiAiJGRvdGVzdC9pbmZvIgorCWVjaG8gIiRuZXh0IiA+IiRkb3Rlc3QvbmV4dCIKKwl0aGlzPSRuZXh0Cit9CisKK2Nhbm5vdF9mYWxsYmFjayAoKSB7CisJZWNobyAiJDEiCisJZWNobyAiQ2Fubm90IGZhbGwgYmFjayB0byB0aHJlZS13YXkgbWVyZ2UuIgorCWV4aXQgMQorfQorCitmYWxsX2JhY2tfM3dheSAoKSB7CisgICAgT19PQkpFQ1Q9YGNkICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiICYmIHB3ZGAKKworICAgIHJtIC1mciAiJGRvdGVzdCIvcGF0Y2gtbWVyZ2UtKgorICAgIG1rZGlyICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1kaXIiCisKKyAgICAjIEZpcnN0IHNlZSBpZiB0aGUgcGF0Y2ggcmVjb3JkcyB0aGUgaW5kZXggaW5mbyB0aGF0IHdlIGNhbiB1c2UuCisgICAgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJGRvdGVzdC9wYXRjaCIgXAorCT4iJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAmJgorICAgIEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorICAgIGdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwiJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAmJgorICAgIEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorICAgIGdpdC13cml0ZS10cmVlID4iJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlKyIgfHwKKyAgICBjYW5ub3RfZmFsbGJhY2sgIlJlcG9zaXRvcnkgbGFja3MgbmVjZXNzYXJ5IGJsb2JzIHRvIGZhbGwgYmFjayBvbiAzLXdheSBtZXJnZS4iCisKKyAgICBlY2hvIFVzaW5nIGluZGV4IGluZm8gdG8gcmVjb25zdHJ1Y3QgYSBiYXNlIHRyZWUuLi4KKyAgICBpZiBHSVRfSU5ERVhfRklMRT0iJGRvdGVzdC9wYXRjaC1tZXJnZS10bXAtaW5kZXgiIFwKKwlnaXQtYXBwbHkgJGJpbmFyeSAtLWNhY2hlZCA8IiRkb3Rlc3QvcGF0Y2giCisgICAgdGhlbgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLWJhc2UrIiAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlIgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiCisgICAgZWxzZQorICAgICAgICBjYW5ub3RfZmFsbGJhY2sgIkRpZCB5b3UgaGFuZCBlZGl0IHlvdXIgcGF0Y2g/CitJdCBkb2VzIG5vdCBhcHBseSB0byBibG9icyByZWNvcmRlZCBpbiBpdHMgaW5kZXguIgorICAgIGZpCisKKyAgICB0ZXN0IC1mICIkZG90ZXN0L3BhdGNoLW1lcmdlLWluZGV4IiAmJgorICAgIGhpc190cmVlPSQoR0lUX0lOREVYX0ZJTEU9IiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiIGdpdC13cml0ZS10cmVlKSAmJgorICAgIG9yaWdfdHJlZT0kKGNhdCAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlIikgJiYKKyAgICBybSAtZnIgIiRkb3Rlc3QiL3BhdGNoLW1lcmdlLSogfHwgZXhpdCAxCisKKyAgICBlY2hvIEZhbGxpbmcgYmFjayB0byBwYXRjaGluZyBiYXNlIGFuZCAzLXdheSBtZXJnZS4uLgorCisgICAgIyBUaGlzIGlzIG5vdCBzbyB3cm9uZy4gIERlcGVuZGluZyBvbiB3aGljaCBiYXNlIHdlIHBpY2tlZCwKKyAgICAjIG9yaWdfdHJlZSBtYXkgYmUgd2lsZGx5IGRpZmZlcmVudCBmcm9tIG91cnMsIGJ1dCBoaXNfdHJlZQorICAgICMgaGFzIHRoZSBzYW1lIHNldCBvZiB3aWxkbHkgZGlmZmVyZW50IGNoYW5nZXMgaW4gcGFydHMgdGhlCisgICAgIyBwYXRjaCBkaWQgbm90IHRvdWNoLCBzbyByZWN1cnNpdmUgZW5kcyB1cCBjYW5jZWxpbmcgdGhlbSwKKyAgICAjIHNheWluZyB0aGF0IHdlIHJldmVydGVkIGFsbCB0aG9zZSBjaGFuZ2VzLgorCisgICAgZXZhbCBHSVRIRUFEXyRoaXNfdHJlZT0nIiRTVUJKRUNUIicKKyAgICBleHBvcnQgR0lUSEVBRF8kaGlzX3RyZWUKKyAgICBnaXQtbWVyZ2UtcmVjdXJzaXZlICRvcmlnX3RyZWUgLS0gSEVBRCAkaGlzX3RyZWUgfHwgeworCSAgICBpZiB0ZXN0IC1kICIkR0lUX0RJUi9yci1jYWNoZSIKKwkgICAgdGhlbgorCQlnaXQtcmVyZXJlCisJICAgIGZpCisJICAgIGVjaG8gRmFpbGVkIHRvIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgorCSAgICBleGl0IDEKKyAgICB9CisgICAgdW5zZXQgR0lUSEVBRF8kaGlzX3RyZWUKK30KKworcHJlYz00Citkb3Rlc3Q9LmRvdGVzdCBzaWduPSB1dGY4PXQga2VlcD0gc2tpcD0gaW50ZXJhY3RpdmU9IHJlc29sdmVkPSBiaW5hcnk9IHJlc29sdmVtc2c9CitnaXRfYXBwbHlfb3B0PQorCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1kPSp8LS1kPSp8LS1kbz0qfC0tZG90PSp8LS1kb3RlPSp8LS1kb3Rlcz0qfC0tZG90ZXN0PSopCisJZG90ZXN0PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2A7IHNoaWZ0IDs7CisJLWR8LS1kfC0tZG98LS1kb3R8LS1kb3RlfC0tZG90ZXN8LS1kb3Rlc3QpCisJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWM7IHNoaWZ0CisJZG90ZXN0PSIkMSI7IHNoaWZ0OzsKKworCS1pfC0taXwtLWlufC0taW50fC0taW50ZXwtLWludGVyfC0taW50ZXJhfC0taW50ZXJhY3wtLWludGVyYWN0fFwKKwktLWludGVyYWN0aXwtLWludGVyYWN0aXZ8LS1pbnRlcmFjdGl2ZSkKKwlpbnRlcmFjdGl2ZT10OyBzaGlmdCA7OworCisJLWJ8LS1ifC0tYml8LS1iaW58LS1iaW5hfC0tYmluYXJ8LS1iaW5hcnkpCisJYmluYXJ5PXQ7IHNoaWZ0IDs7CisKKwktM3wtLTN8LS0zd3wtLTN3YXwtLTN3YXkpCisJdGhyZWV3YXk9dDsgc2hpZnQgOzsKKwktc3wtLXN8LS1zaXwtLXNpZ3wtLXNpZ258LS1zaWdub3wtLXNpZ25vZnwtLXNpZ25vZmYpCisJc2lnbj10OyBzaGlmdCA7OworCS11fC0tdXwtLXV0fC0tdXRmfC0tdXRmOCkKKwl1dGY4PXQ7IHNoaWZ0IDs7ICMgdGhpcyBpcyBub3cgZGVmYXVsdAorCS0tbm8tdXwtLW5vLXV0fC0tbm8tdXRmfC0tbm8tdXRmOCkKKwl1dGY4PTsgc2hpZnQgOzsKKwkta3wtLWt8LS1rZXwtLWtlZXwtLWtlZXApCisJa2VlcD10OyBzaGlmdCA7OworCisJLXJ8LS1yfC0tcmV8LS1yZXN8LS1yZXNvfC0tcmVzb2x8LS1yZXNvbHZ8LS1yZXNvbHZlfC0tcmVzb2x2ZWQpCisJcmVzb2x2ZWQ9dDsgc2hpZnQgOzsKKworCS0tc2t8LS1za2l8LS1za2lwKQorCXNraXA9dDsgc2hpZnQgOzsKKworCS0td2hpdGVzcGFjZT0qfC1DKnwtcCopCisJZ2l0X2FwcGx5X29wdD0iJGdpdF9hcHBseV9vcHQgJDEiOyBzaGlmdCA7OworCisJLS1yZXNvbHZlbXNnPSopCisJcmVzb2x2ZW1zZz0kezEjLS1yZXNvbHZlbXNnPX07IHNoaWZ0IDs7CisKKwktLSkKKwlzaGlmdDsgYnJlYWsgOzsKKwktKikKKwl1c2FnZSA7OworCSopCisJYnJlYWsgOzsKKwllc2FjCitkb25lCisKKyMgSWYgdGhlIGRvdGVzdCBkaXJlY3RvcnkgZXhpc3RzLCBidXQgd2UgaGF2ZSBmaW5pc2hlZCBhcHBseWluZyBhbGwgdGhlCisjIHBhdGNoZXMgaW4gdGhlbSwgY2xlYXIgaXQgb3V0LgoraWYgdGVzdCAtZCAiJGRvdGVzdCIgJiYKKyAgIGxhc3Q9JChjYXQgIiRkb3Rlc3QvbGFzdCIpICYmCisgICBuZXh0PSQoY2F0ICIkZG90ZXN0L25leHQiKSAmJgorICAgdGVzdCAkIyAhPSAwICYmCisgICB0ZXN0ICIkbmV4dCIgLWd0ICIkbGFzdCIKK3RoZW4KKyAgIHJtIC1mciAiJGRvdGVzdCIKK2ZpCisKK2lmIHRlc3QgLWQgIiRkb3Rlc3QiCit0aGVuCisJY2FzZSAiJCMsJHNraXAkcmVzb2x2ZWQiIGluCisJMCwqdCopCisJCSMgRXhwbGljaXQgcmVzdW1lIGNvbW1hbmQgYW5kIHdlIGRvIG5vdCBoYXZlIGZpbGUsIHNvCisJCSMgd2UgYXJlIGhhcHB5LgorCQk6IDs7CisJMCwpCisJCSMgTm8gZmlsZSBpbnB1dCBidXQgd2l0aG91dCByZXN1bWUgcGFyYW1ldGVyczsgY2F0Y2gKKwkJIyB1c2VyIGVycm9yIHRvIGZlZWQgdXMgYSBwYXRjaCBmcm9tIHN0YW5kYXJkIGlucHV0CisJCSMgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IC5kb3Rlc3QuICBUaGlzIGlzIHNvbWV3aGF0CisJCSMgdW5yZWxpYWJsZSAtLSBzdGRpbiBjb3VsZCBiZSAvZGV2L251bGwgZm9yIGV4YW1wbGUKKwkJIyBhbmQgdGhlIGNhbGxlciBkaWQgbm90IGludGVuZCB0byBmZWVkIHVzIGEgcGF0Y2ggYnV0CisJCSMgd2FudGVkIHRvIGNvbnRpbnVlIHVuYXR0ZW5kZWQuCisJCXR0eSAtcworCQk7OworCSopCisJCWZhbHNlCisJCTs7CisJZXNhYyB8fAorCWRpZSAicHJldmlvdXMgZG90ZXN0IGRpcmVjdG9yeSAkZG90ZXN0IHN0aWxsIGV4aXN0cyBidXQgbWJveCBnaXZlbi4iCisJcmVzdW1lPXllcworZWxzZQorCSMgTWFrZSBzdXJlIHdlIGFyZSBub3QgZ2l2ZW4gLS1za2lwIG5vciAtLXJlc29sdmVkCisJdGVzdCAiLCRza2lwLCRyZXNvbHZlZCwiID0gLCwsIHx8CisJCWRpZSAiUmVzb2x2ZSBvcGVyYXRpb24gbm90IGluIHByb2dyZXNzLCB3ZSBhcmUgbm90IHJlc3VtaW5nLiIKKworCSMgU3RhcnQgYWZyZXNoLgorCW1rZGlyIC1wICIkZG90ZXN0IiB8fCBleGl0CisKKwlnaXQtbWFpbHNwbGl0IC1kIiRwcmVjIiAtbyIkZG90ZXN0IiAtYiAtLSAiJEAiID4gIiRkb3Rlc3QvbGFzdCIgfHwgIHsKKwkJcm0gLWZyICIkZG90ZXN0IgorCQlleGl0IDEKKwl9CisKKwkjIC1iLCAtcywgLXUsIC1rIGFuZCAtLXdoaXRlc3BhY2UgZmxhZ3MgYXJlIGtlcHQgZm9yIHRoZQorCSMgcmVzdW1pbmcgc2Vzc2lvbiBhZnRlciBhIHBhdGNoIGZhaWx1cmUuCisJIyAtMyBhbmQgLWkgY2FuIGFuZCBtdXN0IGJlIGdpdmVuIHdoZW4gcmVzdW1pbmcuCisJZWNobyAiJGJpbmFyeSIgPiIkZG90ZXN0L2JpbmFyeSIKKwllY2hvICIgJHdzIiA+IiRkb3Rlc3Qvd2hpdGVzcGFjZSIKKwllY2hvICIkc2lnbiIgPiIkZG90ZXN0L3NpZ24iCisJZWNobyAiJHV0ZjgiID4iJGRvdGVzdC91dGY4IgorCWVjaG8gIiRrZWVwIiA+IiRkb3Rlc3Qva2VlcCIKKwllY2hvIDEgPiIkZG90ZXN0L25leHQiCitmaQorCitjYXNlICIkcmVzb2x2ZWQiIGluCisnJykKKwlmaWxlcz0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5IEhFQUQpIHx8IGV4aXQKKwlpZiBbICIkZmlsZXMiIF07IHRoZW4KKwkgICBlY2hvICJEaXJ0eSBpbmRleDogY2Fubm90IGFwcGx5IHBhdGNoZXMgKGRpcnR5OiAkZmlsZXMpIiA+JjIKKwkgICBleGl0IDEKKwlmaQorZXNhYworCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC9iaW5hcnkiKSIgPSB0Cit0aGVuCisJYmluYXJ5PS0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50CitmaQoraWYgdGVzdCAiJChjYXQgIiRkb3Rlc3QvdXRmOCIpIiA9IHQKK3RoZW4KKwl1dGY4PS11CitlbHNlCisJdXRmOD0tbgorZmkKK2lmIHRlc3QgIiQoY2F0ICIkZG90ZXN0L2tlZXAiKSIgPSB0Cit0aGVuCisJa2VlcD0taworZmkKK3dzPWBjYXQgIiRkb3Rlc3Qvd2hpdGVzcGFjZSJgCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC9zaWduIikiID0gdAordGhlbgorCVNJR05PRkY9YGdpdC12YXIgR0lUX0NPTU1JVFRFUl9JREVOVCB8IHNlZCAtZSAnCisJCQlzLz4uKi8+LworCQkJcy9eL1NpZ25lZC1vZmYtYnk6IC8nCisJCWAKK2Vsc2UKKwlTSUdOT0ZGPQorZmkKKworbGFzdD1gY2F0ICIkZG90ZXN0L2xhc3QiYAordGhpcz1gY2F0ICIkZG90ZXN0L25leHQiYAoraWYgdGVzdCAiJHNraXAiID0gdAordGhlbgorCWlmIHRlc3QgLWQgIiRHSVRfRElSL3JyLWNhY2hlIgorCXRoZW4KKwkJZ2l0LXJlcmVyZSBjbGVhcgorCWZpCisJdGhpcz1gZXhwciAiJHRoaXMiICsgMWAKKwlyZXN1bWU9CitmaQorCitpZiB0ZXN0ICIkdGhpcyIgLWd0ICIkbGFzdCIKK3RoZW4KKwllY2hvIE5vdGhpbmcgdG8gZG8uCisJcm0gLWZyICIkZG90ZXN0IgorCWV4aXQKK2ZpCisKK3doaWxlIHRlc3QgIiR0aGlzIiAtbGUgIiRsYXN0IgorZG8KKwltc2dudW09YHByaW50ZiAiJTAke3ByZWN9ZCIgJHRoaXNgCisJbmV4dD1gZXhwciAiJHRoaXMiICsgMWAKKwl0ZXN0IC1mICIkZG90ZXN0LyRtc2dudW0iIHx8IHsKKwkJcmVzdW1lPQorCQlnb19uZXh0CisJCWNvbnRpbnVlCisJfQorCisJIyBJZiB3ZSBhcmUgbm90IHJlc3VtaW5nLCBwYXJzZSBhbmQgZXh0cmFjdCB0aGUgcGF0Y2ggaW5mb3JtYXRpb24KKwkjIGludG8gc2VwYXJhdGUgZmlsZXM6CisJIyAgLSBpbmZvIHJlY29yZHMgdGhlIGF1dGhvcnNoaXAgYW5kIHRpdGxlCisJIyAgLSBtc2cgaXMgdGhlIHJlc3Qgb2YgY29tbWl0IGxvZyBtZXNzYWdlCisJIyAgLSBwYXRjaCBpcyB0aGUgcGF0Y2ggYm9keS4KKwkjCisJIyBXaGVuIHdlIGFyZSByZXN1bWluZywgdGhlc2UgZmlsZXMgYXJlIGVpdGhlciBhbHJlYWR5IHByZXBhcmVkCisJIyBieSB0aGUgdXNlciwgb3IgdGhlIHVzZXIgY2FuIHRlbGwgdXMgdG8gZG8gc28gYnkgLS1yZXNvbHZlZCBmbGFnLgorCWNhc2UgIiRyZXN1bWUiIGluCisJJycpCisJCWdpdC1tYWlsaW5mbyAka2VlcCAkdXRmOCAiJGRvdGVzdC9tc2ciICIkZG90ZXN0L3BhdGNoIiBcCisJCQk8IiRkb3Rlc3QvJG1zZ251bSIgPiIkZG90ZXN0L2luZm8iIHx8CisJCQlzdG9wX2hlcmUgJHRoaXMKKwkJdGVzdCAtcyAkZG90ZXN0L3BhdGNoIHx8IHsKKwkJCWVjaG8gIlBhdGNoIGlzIGVtcHR5LiAgV2FzIGl0IHNwbGl0IHdyb25nPyIKKwkJCXN0b3BfaGVyZSAkdGhpcworCQl9CisJCWdpdC1zdHJpcHNwYWNlIDwgIiRkb3Rlc3QvbXNnIiA+ICIkZG90ZXN0L21zZy1jbGVhbiIKKwkJOzsKKwllc2FjCisKKwlHSVRfQVVUSE9SX05BTUU9IiQoc2VkIC1uICcvXkF1dGhvci8gcy9BdXRob3I6IC8vcCcgIiRkb3Rlc3QvaW5mbyIpIgorCUdJVF9BVVRIT1JfRU1BSUw9IiQoc2VkIC1uICcvXkVtYWlsLyBzL0VtYWlsOiAvL3AnICIkZG90ZXN0L2luZm8iKSIKKwlHSVRfQVVUSE9SX0RBVEU9IiQoc2VkIC1uICcvXkRhdGUvIHMvRGF0ZTogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisKKwlpZiB0ZXN0IC16ICIkR0lUX0FVVEhPUl9FTUFJTCIKKwl0aGVuCisJCWVjaG8gIlBhdGNoIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy4iCisJCXN0b3BfaGVyZSAkdGhpcworCWZpCisKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FIEdJVF9BVVRIT1JfRU1BSUwgR0lUX0FVVEhPUl9EQVRFCisKKwlTVUJKRUNUPSIkKHNlZCAtbiAnL15TdWJqZWN0LyBzL1N1YmplY3Q6IC8vcCcgIiRkb3Rlc3QvaW5mbyIpIgorCWNhc2UgIiRrZWVwX3N1YmplY3QiIGluIC1rKSAgU1VCSkVDVD0iW1BBVENIXSAkU1VCSkVDVCIgOzsgZXNhYworCisJY2FzZSAiJHJlc3VtZSIgaW4KKwknJykKKwkgICAgaWYgdGVzdCAnJyAhPSAiJFNJR05PRkYiCisJICAgIHRoZW4KKwkJTEFTVF9TSUdORURfT0ZGX0JZPWAKKwkJICAgIHNlZCAtbmUgJy9eU2lnbmVkLW9mZi1ieTogL3AnIFwKKwkJICAgICIkZG90ZXN0L21zZy1jbGVhbiIgfAorCQkgICAgdGFpbCAtbiAxCisJCWAKKwkJQUREX1NJR05PRkY9YAorCQkgICAgdGVzdCAiJExBU1RfU0lHTkVEX09GRl9CWSIgPSAiJFNJR05PRkYiIHx8IHsKKwkJICAgIHRlc3QgJycgPSAiJExBU1RfU0lHTkVEX09GRl9CWSIgJiYgZWNobworCQkgICAgZWNobyAiJFNJR05PRkYiCisJCX1gCisJICAgIGVsc2UKKwkJQUREX1NJR05PRkY9CisJICAgIGZpCisJICAgIHsKKwkJcHJpbnRmICclc1xuJyAiJFNVQkpFQ1QiCisJCWlmIHRlc3QgLXMgIiRkb3Rlc3QvbXNnLWNsZWFuIgorCQl0aGVuCisJCQllY2hvCisJCQljYXQgIiRkb3Rlc3QvbXNnLWNsZWFuIgorCQlmaQorCQlpZiB0ZXN0ICcnICE9ICIkQUREX1NJR05PRkYiCisJCXRoZW4KKwkJCWVjaG8gIiRBRERfU0lHTk9GRiIKKwkJZmkKKwkgICAgfSA+IiRkb3Rlc3QvZmluYWwtY29tbWl0IgorCSAgICA7OworCSopCisJCWNhc2UgIiRyZXNvbHZlZCRpbnRlcmFjdGl2ZSIgaW4KKwkJdHQpCisJCQkjIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBpbnRlcmFjdGl2ZSB2aWV3IG9wdGlvbi4KKwkJCWdpdC1kaWZmLWluZGV4IC1wIC0tY2FjaGVkIEhFQUQgPiIkZG90ZXN0L3BhdGNoIgorCQkJOzsKKwkJZXNhYworCWVzYWMKKworCXJlc3VtZT0KKwlpZiB0ZXN0ICIkaW50ZXJhY3RpdmUiID0gdAorCXRoZW4KKwkgICAgdGVzdCAtdCAwIHx8CisJICAgIGRpZSAiY2Fubm90IGJlIGludGVyYWN0aXZlIHdpdGhvdXQgc3RkaW4gY29ubmVjdGVkIHRvIGEgdGVybWluYWwuIgorCSAgICBhY3Rpb249YWdhaW4KKwkgICAgd2hpbGUgdGVzdCAiJGFjdGlvbiIgPSBhZ2FpbgorCSAgICBkbworCQllY2hvICJDb21taXQgQm9keSBpczoiCisJCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQljYXQgIiRkb3Rlc3QvZmluYWwtY29tbWl0IgorCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJcHJpbnRmICJBcHBseT8gW3ldZXMvW25dby9bZV1kaXQvW3ZdaWV3IHBhdGNoL1thXWNjZXB0IGFsbCAiCisJCXJlYWQgcmVwbHkKKwkJY2FzZSAiJHJlcGx5IiBpbgorCQlbeVldKikgYWN0aW9uPXllcyA7OworCQlbYUFdKikgYWN0aW9uPXllcyBpbnRlcmFjdGl2ZT0gOzsKKwkJW25OXSopIGFjdGlvbj1za2lwIDs7CisJCVtlRV0qKSAiJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IiAiJGRvdGVzdC9maW5hbC1jb21taXQiCisJCSAgICAgICBhY3Rpb249YWdhaW4gOzsKKwkJW3ZWXSopIGFjdGlvbj1hZ2FpbgorCQkgICAgICAgTEVTUz0tUyAke1BBR0VSOi1sZXNzfSAiJGRvdGVzdC9wYXRjaCIgOzsKKwkJKikgICAgIGFjdGlvbj1hZ2FpbiA7OworCQllc2FjCisJICAgIGRvbmUKKwllbHNlCisJICAgIGFjdGlvbj15ZXMKKwlmaQorCisJaWYgdGVzdCAkYWN0aW9uID0gc2tpcAorCXRoZW4KKwkJZ29fbmV4dAorCQljb250aW51ZQorCWZpCisKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cKKwl0aGVuCisJCSIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cgIiRkb3Rlc3QvZmluYWwtY29tbWl0IiB8fAorCQlzdG9wX2hlcmUgJHRoaXMKKwlmaQorCisJZWNobworCXByaW50ZiAnQXBwbHlpbmcgJXNcbicgIiRTVUJKRUNUIgorCWVjaG8KKworCWNhc2UgIiRyZXNvbHZlZCIgaW4KKwknJykKKwkJZ2l0LWFwcGx5ICRnaXRfYXBwbHlfb3B0ICRiaW5hcnkgLS1pbmRleCAiJGRvdGVzdC9wYXRjaCIKKwkJYXBwbHlfc3RhdHVzPSQ/CisJCTs7CisJdCkKKwkJIyBSZXNvbHZlZCBtZWFucyB0aGUgdXNlciBkaWQgYWxsIHRoZSBoYXJkIHdvcmssIGFuZAorCQkjIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueSBwYXRjaCBhcHBsaWNhdGlvbi4gIEp1c3QKKwkJIyB0cnVzdCB3aGF0IHRoZSB1c2VyIGhhcyBpbiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlCisJCSMgd29ya2luZyB0cmVlLgorCQlyZXNvbHZlZD0KKwkJZ2l0LWRpZmYtaW5kZXggLS1xdWlldCAtLWNhY2hlZCBIRUFEICYmIHsKKwkJCWVjaG8gIk5vIGNoYW5nZXMgLSBkaWQgeW91IGZvcmdldCB0byB1c2UgJ2dpdCBhZGQnPyIKKwkJCXN0b3BfaGVyZV91c2VyX3Jlc29sdmUgJHRoaXMKKwkJfQorCQl1bm1lcmdlZD0kKGdpdC1scy1maWxlcyAtdSkKKwkJaWYgdGVzdCAtbiAiJHVubWVyZ2VkIgorCQl0aGVuCisJCQllY2hvICJZb3Ugc3RpbGwgaGF2ZSB1bm1lcmdlZCBwYXRocyBpbiB5b3VyIGluZGV4IgorCQkJZWNobyAiZGlkIHlvdSBmb3JnZXQgdG8gdXNlICdnaXQgYWRkJz8iCisJCQlzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICR0aGlzCisJCWZpCisJCWFwcGx5X3N0YXR1cz0wCisJCWlmIHRlc3QgLWQgIiRHSVRfRElSL3JyLWNhY2hlIgorCQl0aGVuCisJCQlnaXQgcmVyZXJlCisJCWZpCisJCTs7CisJZXNhYworCisJaWYgdGVzdCAkYXBwbHlfc3RhdHVzID0gMSAmJiB0ZXN0ICIkdGhyZWV3YXkiID0gdAorCXRoZW4KKwkJaWYgKGZhbGxfYmFja18zd2F5KQorCQl0aGVuCisJCSAgICAjIEFwcGx5aW5nIHRoZSBwYXRjaCB0byBhbiBlYXJsaWVyIHRyZWUgYW5kIG1lcmdpbmcgdGhlCisJCSAgICAjIHJlc3VsdCBtYXkgaGF2ZSBwcm9kdWNlZCB0aGUgc2FtZSB0cmVlIGFzIG91cnMuCisJCSAgICBnaXQtZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUQgJiYgeworCQkJZWNobyBObyBjaGFuZ2VzIC0tIFBhdGNoIGFscmVhZHkgYXBwbGllZC4KKwkJCWdvX25leHQKKwkJCWNvbnRpbnVlCisJCSAgICB9CisJCSAgICAjIGNsZWFyIGFwcGx5X3N0YXR1cyAtLSB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBtZXJnZWQuCisJCSAgICBhcHBseV9zdGF0dXM9MAorCQlmaQorCWZpCisJaWYgdGVzdCAkYXBwbHlfc3RhdHVzICE9IDAKKwl0aGVuCisJCWVjaG8gUGF0Y2ggZmFpbGVkIGF0ICRtc2dudW0uCisJCXN0b3BfaGVyZV91c2VyX3Jlc29sdmUgJHRoaXMKKwlmaQorCisJaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoIHx8IHN0b3BfaGVyZSAkdGhpcworCWZpCisKKwl0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisJZWNobyBXcm90ZSB0cmVlICR0cmVlICYmCisJcGFyZW50PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWNvbW1pdD0kKGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50IDwiJGRvdGVzdC9maW5hbC1jb21taXQiKSAmJgorCWVjaG8gQ29tbWl0dGVkOiAkY29tbWl0ICYmCisJZ2l0LXVwZGF0ZS1yZWYgLW0gIiRHSVRfUkVGTE9HX0FDVElPTjogJFNVQkpFQ1QiIEhFQUQgJGNvbW1pdCAkcGFyZW50IHx8CisJc3RvcF9oZXJlICR0aGlzCisKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1hcHBseXBhdGNoCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtYXBwbHlwYXRjaAorCWZpCisKKwlnb19uZXh0Citkb25lCisKK3JtIC1mciAiJGRvdGVzdCIKZGlmZiAtLWdpdCBhL2dpdC1hcHBseW1ib3guc2ggYi9naXQtYXBwbHltYm94LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxOGU4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXBwbHltYm94LnNoCkBAIC0wLDAgKzEsMTIxIEBACisjIS9iaW4vc2gKKyMjCisjIyAiZG90ZXN0IiBpcyBteSBzdHVwaWQgbmFtZSBmb3IgbXkgcGF0Y2gtYXBwbGljYXRpb24gc2NyaXB0LCB3aGljaAorIyMgSSBuZXZlciBnb3QgYXJvdW5kIHRvIHJlbmFtaW5nIGFmdGVyIEkgdGVzdGVkIGl0LiBXZSdyZSBub3cgb24gdGhlCisjIyBzZWNvbmQgZ2VuZXJhdGlvbiBvZiBzY3JpcHRzLCBzdGlsbCBjYWxsZWQgImRvdGVzdCIuCisjIworIyMgVXBkYXRlOiBSeWFuIEFuZGVyc29uIGZpbmFsbHkgc2hhbWVkIG1lIGludG8gbmFtaW5nIHRoaXMgImFwcGx5bWJveCIuCisjIworIyMgWW91IGdpdmUgaXQgYSBtYm94LWZvcm1hdCBjb2xsZWN0aW9uIG9mIGVtYWlscywgYW5kIGl0IHdpbGwgdHJ5IHRvCisjIyBhcHBseSB0aGVtIHRvIHRoZSBrZXJuZWwgdXNpbmcgImFwcGx5cGF0Y2giCisjIworIyMgVGhlIHBhdGNoIGFwcGxpY2F0aW9uIG1heSBmYWlsIGluIHRoZSBtaWRkbGUuICBJbiB3aGljaCBjYXNlOgorIyMgKDEpIGxvb2sgYXQgLmRvdGVzdC9wYXRjaCBhbmQgZml4IGl0IHVwIHRvIGFwcGx5CisjIyAoMikgcmUtcnVuIGFwcGx5bWJveCB3aXRoIC1jIC5kb3Rlc3QvbXNnLW51bWJlciBmb3IgdGhlIGN1cnJlbnQgb25lLgorIyMgUGF5IGEgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpZiB5b3UgZG8gdGhpcyBhbmQKKyMjIHVzZSBhIFNpZ25vZmZfZmlsZSwgYmVjYXVzZSBhcHBseXBhdGNoIHdhbnRzIHRvIGFwcGVuZCB0aGUgc2lnbi1vZmYKKyMjIG1lc3NhZ2UgdG8gbXNnLWNsZWFuIGV2ZXJ5IHRpbWUgaXQgaXMgcnVuLgorIyMKKyMjIGdpdC1hbSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgbmV3ZXIgYW5kIGJldHRlciB0b29sIGZvciB0aGlzIGpvYi4KKworVVNBR0U9J1stdV0gWy1rXSBbLXFdIFstbV0gKC1jIC5kb3Rlc3QvPG51bT4gfCBtYm94KSBbc2lnbm9mZl0nCisuIGdpdC1zaC1zZXR1cAorCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKK2tlZXBfc3ViamVjdD0gcXVlcnlfYXBwbHk9IGNvbnRpbnVlPSB1dGY4PS11IHJlc3VtZT10Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktdSkJdXRmOD0tdSA7OworCS1uKQl1dGY4PS1uIDs7CisJLWspCWtlZXBfc3ViamVjdD0tayA7OworCS1xKQlxdWVyeV9hcHBseT10IDs7CisJLWMpCWNvbnRpbnVlPSIkMiI7IHJlc3VtZT1mOyBzaGlmdCA7OworCS1tKQlmYWxsX2JhY2tfM3dheT10IDs7CisJLSopCXVzYWdlIDs7CisJKikJYnJlYWsgOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworY2FzZSAiJGNvbnRpbnVlIiBpbgorJycpCisJcm0gLXJmIC5kb3Rlc3QKKwlta2RpciAuZG90ZXN0CisJbnVtX21zZ3M9JChnaXQtbWFpbHNwbGl0ICIkMSIgLmRvdGVzdCkgfHwgZXhpdCAxCisJZWNobyAiJG51bV9tc2dzIHBhdGNoKGVzKSB0byBwcm9jZXNzLiIKKwlzaGlmdAorZXNhYworCitmaWxlcz0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5IEhFQUQpIHx8IGV4aXQKK2lmIFsgIiRmaWxlcyIgXTsgdGhlbgorICAgZWNobyAiRGlydHkgaW5kZXg6IGNhbm5vdCBhcHBseSBwYXRjaGVzIChkaXJ0eTogJGZpbGVzKSIgPiYyCisgICBleGl0IDEKK2ZpCisKK2Nhc2UgIiRxdWVyeV9hcHBseSIgaW4KK3QpCXRvdWNoIC5kb3Rlc3QvLnF1ZXJ5X2FwcGx5Citlc2FjCitjYXNlICIkZmFsbF9iYWNrXzN3YXkiIGluCit0KQk6ID4uZG90ZXN0Ly4zd2F5Citlc2FjCitjYXNlICIka2VlcF9zdWJqZWN0IiBpbgorLWspCTogPi5kb3Rlc3QvLmtlZXBfc3ViamVjdAorZXNhYworCitzaWdub2ZmPSIkMSIKK3NldCB4IC5kb3Rlc3QvMCoKK3NoaWZ0Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworICAgIGk9IiQxIiAKKyAgICBjYXNlICIkcmVzdW1lLCRjb250aW51ZSIgaW4KKyAgICBmLCRpKQlyZXN1bWU9dDs7CisgICAgZiwqKQlzaGlmdAorCQljb250aW51ZTs7CisgICAgKikKKwkgICAgZ2l0LW1haWxpbmZvICRrZWVwX3N1YmplY3QgJHV0ZjggXAorCQkuZG90ZXN0L21zZyAuZG90ZXN0L3BhdGNoIDwkaSA+LmRvdGVzdC9pbmZvIHx8IGV4aXQgMQorCSAgICB0ZXN0IC1zIC5kb3Rlc3QvcGF0Y2ggfHwgeworCQllY2hvICJQYXRjaCBpcyBlbXB0eS4gIFdhcyBpdCBzcGxpdCB3cm9uZz8iCisJCWV4aXQgMQorCSAgICB9CisJICAgIGdpdC1zdHJpcHNwYWNlIDwgLmRvdGVzdC9tc2cgPiAuZG90ZXN0L21zZy1jbGVhbgorCSAgICA7OworICAgIGVzYWMKKyAgICB3aGlsZSA6OyAjIGZvciBmaXhpbmcgdXAgYW5kIHJldHJ5CisgICAgZG8KKwlnaXQtYXBwbHlwYXRjaCAuZG90ZXN0L21zZy1jbGVhbiAuZG90ZXN0L3BhdGNoIC5kb3Rlc3QvaW5mbyAiJHNpZ25vZmYiCisJY2FzZSAiJD8iIGluCisJMCkKKwkJIyBSZW1vdmUgdGhlIGNsZWFubHkgYXBwbGllZCBvbmUgdG8gcmVkdWNlIGNsdXR0ZXIuCisJCXJtIC1mIC5kb3Rlc3QvJGkKKwkJOzsKKwkyKQorCQkjIDIgaXMgYSBzcGVjaWFsIGV4aXQgY29kZSBmcm9tIGFwcGx5cGF0Y2ggdG8gaW5kaWNhdGUgdGhhdAorCSAgICAJIyB0aGUgcGF0Y2ggd2Fzbid0IGFwcGxpZWQsIGJ1dCBjb250aW51ZSBhbnl3YXkgCisJCTs7CisJKikKKwkJcmV0PSQ/CisJCWlmIHRlc3QgLWYgLmRvdGVzdC8ucXVlcnlfYXBwbHkKKwkJdGhlbgorCQkJZWNobyA+JjIgIiogUGF0Y2ggZmFpbGVkLiIKKwkJCWVjaG8gPiYyICIqIFlvdSBjb3VsZCBmaXggaXQgdXAgaW4geW91ciBlZGl0b3IgYW5kIgorCQkJZWNobyA+JjIgIiAgcmV0cnkuICBJZiB5b3Ugd2FudCB0byBkbyBzbywgc2F5IHllcyBoZXJlIgorCQkJZWNobyA+JjIgIiAgQUZURVIgZml4aW5nIC5kb3Rlc3QvcGF0Y2ggdXAuIgorCQkJZWNobyA+JjIgLW4gIlJldHJ5IFt5L05dPyAiCisJCQlyZWFkIHllc25vCisJCQljYXNlICIkeWVzbm8iIGluCisJCQlbWXldKikKKwkJCQljb250aW51ZSA7OworCQkgICAgICAgIGVzYWMKKwkJZmkKKwkJZXhpdCAkcmV0CisJZXNhYworCWJyZWFrCisgICAgZG9uZQorICAgIHNoaWZ0Citkb25lCisjIHJldHVybiB0byBwcmlzdGluZQorcm0gLWZyIC5kb3Rlc3QKZGlmZiAtLWdpdCBhL2dpdC1hcHBseXBhdGNoLnNoIGIvZ2l0LWFwcGx5cGF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRmMmFlZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hcHBseXBhdGNoLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMjCisjIyBhcHBseXBhdGNoIHRha2VzIGZvdXIgZmlsZSBhcmd1bWVudHMsIGFuZCB1c2VzIHRob3NlIHRvCisjIyBhcHBseSB0aGUgdW5wYWNrZWQgcGF0Y2ggKHN1cnByaXNlIHN1cnByaXNlKSB0aGF0IHRoZXkKKyMjIHJlcHJlc2VudCB0byB0aGUgY3VycmVudCB0cmVlLgorIyMKKyMjIFRoZSBhcmd1bWVudHMgYXJlOgorIyMJJDEgLSBmaWxlIHdpdGggY29tbWl0IG1lc3NhZ2UKKyMjCSQyIC0gZmlsZSB3aXRoIHRoZSBhY3R1YWwgcGF0Y2gKKyMjCSQzIC0gImluZm8iIGZpbGUgd2l0aCBBdXRob3IsIGVtYWlsIGFuZCBzdWJqZWN0CisjIwkkNCAtIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBzaWdub2ZmIHRvIGFkZAorIyMKKworVVNBR0U9Jzxtc2c+IDxwYXRjaD4gPGluZm8+IFs8c2lnbm9mZj5dJworLiBnaXQtc2gtc2V0dXAKKworY2FzZSAiJCMiIGluIDN8NCkgOzsgKikgdXNhZ2UgOzsgZXNhYworCitmaW5hbD0uZG90ZXN0L2ZpbmFsLWNvbW1pdAorIyMKKyMjIElmIHRoaXMgZmlsZSBleGlzdHMsIHdlIGFzayBiZWZvcmUgYXBwbHlpbmcKKyMjCitxdWVyeV9hcHBseT0uZG90ZXN0Ly5xdWVyeV9hcHBseQorCisjIyBXZSBkbyBub3QgbXVuZ2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHRvbyBtdWNoCisjIyBpZiB0aGlzIGZpbGUgZXhpc3RzLgora2VlcF9zdWJqZWN0PS5kb3Rlc3QvLmtlZXBfc3ViamVjdAorCisjIyBXZSBkbyBub3QgYXR0ZW1wdCB0aGUgMy13YXkgbWVyZ2UgZmFsbGJhY2sgdW5sZXNzIHRoaXMgZmlsZSBleGlzdHMuCitmYWxsX2JhY2tfM3dheT0uZG90ZXN0Ly4zd2F5CisKK01TR0ZJTEU9JDEKK1BBVENIRklMRT0kMgorSU5GTz0kMworU0lHTk9GRj0kNAorRURJVD0ke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0KKworZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJChzZWQgLW4gJy9eQXV0aG9yLyBzL0F1dGhvcjogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkKHNlZCAtbiAnL15FbWFpbC8gcy9FbWFpbDogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0RBVEU9IiQoc2VkIC1uICcvXkRhdGUvIHMvRGF0ZTogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBTVUJKRUNUPSIkKHNlZCAtbiAnL15TdWJqZWN0LyBzL1N1YmplY3Q6IC8vcCcgIiRJTkZPIikiCisKK2lmIHRlc3QgJycgIT0gIiRTSUdOT0ZGIgordGhlbgorCWlmIHRlc3QgLWYgIiRTSUdOT0ZGIgorCXRoZW4KKwkJU0lHTk9GRj1gY2F0ICIkU0lHTk9GRiJgIHx8IGV4aXQKKwllbGlmIGNhc2UgIiRTSUdOT0ZGIiBpbiB5ZXMgfCB0cnVlIHwgbWUgfCBwbGVhc2UpIDogOzsgKikgZmFsc2UgOzsgZXNhYworCXRoZW4KKwkJU0lHTk9GRj1gZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCQlzLz4uKi8+LworCQkJCXMvXi9TaWduZWQtb2ZmLWJ5OiAvJworCQlgCisJZWxzZQorCQlTSUdOT0ZGPQorCWZpCisJaWYgdGVzdCAnJyAhPSAiJFNJR05PRkYiCisJdGhlbgorCQlMQVNUX1NJR05FRF9PRkZfQlk9YAorCQkJc2VkIC1uZSAnL15TaWduZWQtb2ZmLWJ5OiAvcCcgIiRNU0dGSUxFIiB8CisJCQl0YWlsIC1uIDEKKwkJYAorCQl0ZXN0ICIkTEFTVF9TSUdORURfT0ZGX0JZIiA9ICIkU0lHTk9GRiIgfHwgeworCQkgICAgdGVzdCAnJyA9ICIkTEFTVF9TSUdORURfT0ZGX0JZIiAmJiBlY2hvCisJCSAgICBlY2hvICIkU0lHTk9GRiIKKwkJfSA+PiIkTVNHRklMRSIKKwlmaQorZmkKKworcGF0Y2hfaGVhZGVyPQordGVzdCAtZiAiJGtlZXBfc3ViamVjdCIgfHwgcGF0Y2hfaGVhZGVyPSdbUEFUQ0hdICcKKworeworCWVjaG8gIiRwYXRjaF9oZWFkZXIkU1VCSkVDVCIKKwlpZiB0ZXN0IC1zICIkTVNHRklMRSIKKwl0aGVuCisJCWVjaG8KKwkJY2F0ICIkTVNHRklMRSIKKwlmaQorfSA+IiRmaW5hbCIKKworaW50ZXJhY3RpdmU9eWVzCit0ZXN0IC1mICIkcXVlcnlfYXBwbHkiIHx8IGludGVyYWN0aXZlPW5vCisKK3doaWxlIFsgIiRpbnRlcmFjdGl2ZSIgPSB5ZXMgXTsgZG8KKwllY2hvICJDb21taXQgQm9keSBpczoiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJY2F0ICIkZmluYWwiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJpbnRmICJBcHBseT8gW3ldZXMvW25dby9bZV1kaXQvW2FdY2NlcHQgYWxsICIKKwlyZWFkIHJlcGx5CisJY2FzZSAiJHJlcGx5IiBpbgorCQl5fFkpIGludGVyYWN0aXZlPW5vOzsKKwkJbnxOKSBleGl0IDI7OwkjIHNwZWNpYWwgdmFsdWUgdG8gdGVsbCBkb3Rlc3QgdG8ga2VlcCBnb2luZworCQllfEUpICIkRURJVCIgIiRmaW5hbCI7OworCQlhfEEpIHJtIC1mICIkcXVlcnlfYXBwbHkiCisJCSAgICAgaW50ZXJhY3RpdmU9bm8gOzsKKwllc2FjCitkb25lCisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9hcHBseXBhdGNoLW1zZwordGhlbgorCSIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cgIiRmaW5hbCIgfHwgZXhpdAorZmkKKworZWNobworZWNobyBBcHBseWluZyAiJyRTVUJKRUNUJyIKK2VjaG8KKworZ2l0LWFwcGx5IC0taW5kZXggIiRQQVRDSEZJTEUiIHx8IHsKKworCSMgZ2l0LWFwcGx5IGV4aXRzIHdpdGggc3RhdHVzIDEgd2hlbiB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHksCisJIyBidXQgaXQgZGllKClzIHdpdGggb3RoZXIgZmFpbHVyZXMsIG1vc3Qgbm90YWJseSB1cG9uIGNvcnJ1cHQKKwkjIHBhdGNoLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGVyZSBpcyBubyBwb2ludCB0byB0cnkgYXBwbHlpbmcKKwkjIGl0IHRvIGFub3RoZXIgdHJlZSBhbmQgZG8gMy13YXkgbWVyZ2UuCisJdGVzdCAkPyA9IDEgfHwgZXhpdCAxCisKKwl0ZXN0IC1mICIkZmFsbF9iYWNrXzN3YXkiIHx8IGV4aXQgMQorCisJIyBIZXJlIGlmIHdlIGtub3cgd2hpY2ggcmV2aXNpb24gdGhlIHBhdGNoIGFwcGxpZXMgdG8sCisJIyB3ZSBjcmVhdGUgYSB0ZW1wb3Jhcnkgd29ya2luZyB0cmVlIGFuZCBpbmRleCwgYXBwbHkgdGhlCisJIyBwYXRjaCwgYW5kIGF0dGVtcHQgMy13YXkgbWVyZ2Ugd2l0aCB0aGUgcmVzdWx0aW5nIHRyZWUuCisKKwlPX09CSkVDVD1gY2QgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIgJiYgcHdkYAorCXJtIC1mciAucGF0Y2gtbWVyZ2UtKgorCisJaWYgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJFBBVENIRklMRSIgXAorCQk+LnBhdGNoLW1lcmdlLWluZGV4LWluZm8gMj4vZGV2L251bGwgJiYKKwkJR0lUX0lOREVYX0ZJTEU9LnBhdGNoLW1lcmdlLXRtcC1pbmRleCBcCisJCWdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwucGF0Y2gtbWVyZ2UtaW5kZXgtaW5mbyAmJgorCQlHSVRfSU5ERVhfRklMRT0ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IFwKKwkJZ2l0LXdyaXRlLXRyZWUgPi5wYXRjaC1tZXJnZS10bXAtYmFzZSAmJgorCQkoCisJCQlta2RpciAucGF0Y2gtbWVyZ2UtdG1wLWRpciAmJgorCQkJY2QgLnBhdGNoLW1lcmdlLXRtcC1kaXIgJiYKKwkJCUdJVF9JTkRFWF9GSUxFPSIuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IiBcCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiBcCisJCQlnaXQtYXBwbHkgJGJpbmFyeSAtLWluZGV4CisJCSkgPCIkUEFUQ0hGSUxFIgorCXRoZW4KKwkJZWNobyBVc2luZyBpbmRleCBpbmZvIHRvIHJlY29uc3RydWN0IGEgYmFzZSB0cmVlLi4uCisJCW12IC5wYXRjaC1tZXJnZS10bXAtYmFzZSAucGF0Y2gtbWVyZ2UtYmFzZQorCQltdiAucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC5wYXRjaC1tZXJnZS1pbmRleAorCWVsc2UKKwkoCisJCU49MTAKKworCQkjIE90aGVyd2lzZSwgdHJ5IG5lYXJieSB0cmVlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHRoZQorCQkjIHBhdGNoLgorCQlnaXQtcmV2LWxpc3QgLS1tYXgtY291bnQ9JE4gSEVBRAorCisJCSMgb3IgaG9waW5nIHRoZSBwYXRjaCBpcyBhZ2FpbnN0IGtub3duIHRhZ3MuLi4KKwkJZ2l0LWxzLXJlbW90ZSAtLXRhZ3MgLgorCSkgfAorCSAgICB3aGlsZSByZWFkIGJhc2UganVuaworCSAgICBkbworCQkjIFRyeSBpdCBpZiB3ZSBoYXZlIGl0IGFzIGEgdHJlZS4KKwkJZ2l0LWNhdC1maWxlIHRyZWUgIiRiYXNlIiA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKworCQlybSAtZnIgLnBhdGNoLW1lcmdlLXRtcC0qICYmCisJCW1rZGlyIC5wYXRjaC1tZXJnZS10bXAtZGlyIHx8IGJyZWFrCisJCSgKKwkJCWNkIC5wYXRjaC1tZXJnZS10bXAtZGlyICYmCisJCQlHSVRfSU5ERVhfRklMRT0uLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4ICYmCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiAmJgorCQkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFIEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisJCQlnaXQtcmVhZC10cmVlICIkYmFzZSIgJiYKKwkJCWdpdC1hcHBseSAtLWluZGV4ICYmCisJCQltdiAuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC4uLy5wYXRjaC1tZXJnZS1pbmRleCAmJgorCQkJZWNobyAiJGJhc2UiID4uLi8ucGF0Y2gtbWVyZ2UtYmFzZQorCQkpIDwiJFBBVENIRklMRSIgIDI+L2Rldi9udWxsICYmIGJyZWFrCisJICAgIGRvbmUKKwlmaQorCisJdGVzdCAtZiAucGF0Y2gtbWVyZ2UtaW5kZXggJiYKKwloaXNfdHJlZT0kKEdJVF9JTkRFWF9GSUxFPS5wYXRjaC1tZXJnZS1pbmRleCBnaXQtd3JpdGUtdHJlZSkgJiYKKwlvcmlnX3RyZWU9JChjYXQgLnBhdGNoLW1lcmdlLWJhc2UpICYmCisJcm0gLWZyIC5wYXRjaC1tZXJnZS0qIHx8IGV4aXQgMQorCisJZWNobyBGYWxsaW5nIGJhY2sgdG8gcGF0Y2hpbmcgYmFzZSBhbmQgMy13YXkgbWVyZ2UgdXNpbmcgJG9yaWdfdHJlZS4uLgorCisJIyBUaGlzIGlzIG5vdCBzbyB3cm9uZy4gIERlcGVuZGluZyBvbiB3aGljaCBiYXNlIHdlIHBpY2tlZCwKKwkjIG9yaWdfdHJlZSBtYXkgYmUgd2lsZGx5IGRpZmZlcmVudCBmcm9tIG91cnMsIGJ1dCBoaXNfdHJlZQorCSMgaGFzIHRoZSBzYW1lIHNldCBvZiB3aWxkbHkgZGlmZmVyZW50IGNoYW5nZXMgaW4gcGFydHMgdGhlCisJIyBwYXRjaCBkaWQgbm90IHRvdWNoLCBzbyByZXNvbHZlIGVuZHMgdXAgY2FuY2VsaW5nIHRoZW0sCisJIyBzYXlpbmcgdGhhdCB3ZSByZXZlcnRlZCBhbGwgdGhvc2UgY2hhbmdlcy4KKworCWlmIGdpdC1tZXJnZS1yZXNvbHZlICRvcmlnX3RyZWUgLS0gSEVBRCAkaGlzX3RyZWUKKwl0aGVuCisJCWVjaG8gRG9uZS4KKwllbHNlCisJCWVjaG8gRmFpbGVkIHRvIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgorCQlleGl0IDEKKwlmaQorfQorCitpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcHJlLWFwcGx5cGF0Y2gKK3RoZW4KKwkiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoIHx8IGV4aXQKK2ZpCisKK3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgfHwgZXhpdCAxCitlY2hvIFdyb3RlIHRyZWUgJHRyZWUKK3BhcmVudD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKK2NvbW1pdD0kKGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50IDwiJGZpbmFsIikgfHwgZXhpdCAxCitlY2hvIENvbW1pdHRlZDogJGNvbW1pdAorZ2l0LXVwZGF0ZS1yZWYgLW0gImFwcGx5cGF0Y2g6ICRTVUJKRUNUIiBIRUFEICRjb21taXQgJHBhcmVudCB8fCBleGl0CisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wb3N0LWFwcGx5cGF0Y2gKK3RoZW4KKwkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtYXBwbHlwYXRjaAorZmkKZGlmZiAtLWdpdCBhL2dpdC1hcmNoaW1wb3J0LnBlcmwgYi9naXQtYXJjaGltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxZTdjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXJjaGltcG9ydC5wZXJsCkBAIC0wLDAgKzEsMTEzMCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hcnRpbiBMYW5naG9mZi4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBUaGUgYmFzaWMgaWRlYSBpcyB0byB3YWxrIHRoZSBvdXRwdXQgb2YgdGxhIGFicm93c2UsIAorIyBmZXRjaCB0aGUgY2hhbmdlc2V0cyBhbmQgYXBwbHkgdGhlbS4gCisjCisKKz1oZWFkMSBJbnZvY2F0aW9uCisKKyAgICBnaXQtYXJjaGltcG9ydCBbIC1oIF0gWyAtdiBdIFsgLW8gXSBbIC1hIF0gWyAtZiBdIFsgLVQgXSAKKyAgICAJWyAtRCBkZXB0aF0gWyAtdCB0ZW1wZGlyIF0gPGFyY2hpdmU+LzxicmFuY2g+IFsgPGFyY2hpdmU+LzxicmFuY2g+IF0KKworSW1wb3J0cyBhIHByb2plY3QgZnJvbSBvbmUgb3IgbW9yZSBBcmNoIHJlcG9zaXRvcmllcy4gSXQgd2lsbCBmb2xsb3cgYnJhbmNoZXMKK2FuZCByZXBvc2l0b3JpZXMgd2l0aGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgYnkgdGhlIDxhcmNoaXZlL2JyYW5jaD4KK3BhcmFtZXRlcnMgc3VwcGxpZWQuIElmIGl0IGNhbm5vdCBmaW5kIHRoZSByZW1vdGUgYnJhbmNoIGEgbWVyZ2UgY29tZXMgZnJvbQoraXQgd2lsbCBqdXN0IGltcG9ydCBpdCBhcyBhIHJlZ3VsYXIgY29tbWl0LiBJZiBpdCBjYW4gZmluZCBpdCwgaXQgd2lsbCBtYXJrIGl0IAorYXMgYSBtZXJnZSB3aGVuZXZlciBwb3NzaWJsZS4KKworU2VlIG1hbiAoMSkgZ2l0LWFyY2hpbXBvcnQgZm9yIG1vcmUgZGV0YWlscy4KKworPWhlYWQxIFRPRE8KKworIC0gY3JlYXRlIHRhZyBvYmplY3RzIGluc3RlYWQgb2YgcmVmIHRhZ3MKKyAtIGF1ZGl0IHNoZWxsLWVzY2FwaW5nIG9mIGZpbGVuYW1lcworIC0gaGlkZSBvdXIgcHJpdmF0ZSB0YWdzIHNvbWV3aGVyZSBzbWFydGVyCisgLSBmaW5kIGEgd2F5IHRvIG1ha2UgImNhdCAqcGF0Y2hlcyB8IHBhdGNoIiBzYWZlIGV2ZW4gd2hlbiBwYXRjaGZpbGVzIGFyZSBtaXNzaW5nIG5ld2xpbmVzICAKKyAtIHNvcnQgYW5kIGFwcGx5IHBhdGNoZXMgYnkgZ3JhcGhpbmcgYW5jZXN0cnkgcmVsYXRpb25zIGluc3RlYWQgb2YganVzdAorICAgcmVseWluZyBpbiBkYXRlcyBzdXBwbGllZCBpbiB0aGUgY2hhbmdlc2V0IGl0c2VsZi4KKyAgIHRsYSBhbmNlc3RyeS1ncmFwaCAtbSBjb3VsZCBiZSBoZWxwZnVsIGhlcmUuLi4KKworPWhlYWQxIERldmVsIHRyaWNrcworCitBZGQgcHJpbnQgaW4gZnJvbnQgb2YgdGhlIHNoZWxsIGNvbW1hbmRzIGludm9rZWQgdmlhIGJhY2t0aWNrcy4gCisKKz1oZWFkMSBEZXZlbCBOb3RlcworCitUaGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgd2hlcmUgQXJjaCBhbmQgZ2l0IHRlcm1pbm9sb2d5IGFyZSBpbnRlcm1peGVkCithbmQgcG90ZW50aWFsbHkgY29uZnVzZWQuCisKK1RoZSBub3Rpb24gb2YgYSAiYnJhbmNoIiBpbiBnaXQgaXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvCithICJhcmNoaXZlL2NhdGVnb3J5LS1icmFuY2gtLXZlcnNpb24iIGluIEFyY2guICBBbHNvLCBpdCBzaG91bGQgYmUgbm90ZWQKK3RoYXQgdGhlICItLWJyYW5jaCIgcG9ydGlvbiBvZiAiYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uIiBpcyByZWFsbHkKK29wdGlvbmFsIGluIEFyY2ggYWx0aG91Z2ggbm90IG1hbnkgcGVvcGxlIChub3IgdG9vbHMhKSBzZWVtIHRvIGtub3cgdGhpcy4KK1RoaXMgbWVhbnMgdGhhdCAiYXJjaGl2ZS9jYXRlZ29yeS0tdmVyc2lvbiIgaXMgYWxzbyBhIHZhbGlkICJicmFuY2giCitpbiBnaXQgdGVybXMuCisKK1dlIGFsd2F5cyByZWZlciB0byBBcmNoIG5hbWVzIGJ5IHRoZWlyIGZ1bGx5IHF1YWxpZmllZCB2YXJpYW50ICh3aGljaAorbWVhbnMgdGhlICJhcmNoaXZlIiBuYW1lIGlzIHByZWZpeGVkLgorCitGb3IgcGVvcGxlIHVuZmFtaWxpYXIgd2l0aCBBcmNoLCBhbiAiYXJjaGl2ZSIgaXMgdGhlIHRlcm0gZm9yICJyZXBvc2l0b3J5IiwKK2FuZCBjYW4gY29udGFpbiBtdWx0aXBsZSwgdW5yZWxhdGVkIGJyYW5jaGVzLgorCis9Y3V0CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZGlyKTsKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCBybXRyZWUpOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3KGJhc2VuYW1lIGRpcm5hbWUpOwordXNlIERhdGE6OkR1bXBlciBxdy8gRHVtcGVyIC87Cit1c2UgSVBDOjpPcGVuMjsKKworJFNJR3snUElQRSd9PSJJR05PUkUiOworJEVOVnsnVFonfT0iVVRDIjsKKworbXkgJGdpdF9kaXIgPSAkRU5WeyJHSVRfRElSIn0gfHwgIi5naXQiOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkcHRhZ19kaXIgPSAiJGdpdF9kaXIvYXJjaGltcG9ydC90YWdzIjsKKworb3VyKCRvcHRfaCwkb3B0X2YsJG9wdF92LCRvcHRfVCwkb3B0X3QsJG9wdF9ELCRvcHRfYSwkb3B0X28pOworCitzdWIgdXNhZ2UoKSB7CisgICAgcHJpbnQgU1RERVJSIDw8RU5EOworVXNhZ2U6ICR7XGJhc2VuYW1lICQwfSAgICAgIyBmZXRjaC91cGRhdGUgR0lUIGZyb20gQXJjaAorICAgICAgIFsgLWggXSBbIC12IF0gWyAtbyBdIFsgLWEgXSBbIC1mIF0gWyAtVCBdIFsgLUQgZGVwdGggXSBbIC10IHRlbXBkaXIgXQorICAgICAgIHJlcG9zaXRvcnkvYXJjaC1icmFuY2ggWyByZXBvc2l0b3J5L2FyY2gtYnJhbmNoXSAuLi4KK0VORAorICAgIGV4aXQoMSk7Cit9CisKK2dldG9wdHMoImZUaHZhdDpEOiIpIG9yIHVzYWdlKCk7Cit1c2FnZSBpZiAkb3B0X2g7CisKK0BBUkdWID49IDEgb3IgdXNhZ2UoKTsKKyMgJGFyY2hfYnJhbmNoZXM6CisjIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgga2V5czoKKyMgICA9MSAtIEFyY2ggdmVyc2lvbiAvIGdpdCAnYnJhbmNoJyBkZXRlY3RlZCB2aWEgYWJyb3dzZSBvbiBhIGxpbWl0CisjICAgPjEgLSBBcmNoIHZlcnNpb24gLyBnaXQgJ2JyYW5jaCcgb2YgYW4gYXV4aWxpYXJ5IGJyYW5jaCB3ZSd2ZSBtZXJnZWQKK215ICVhcmNoX2JyYW5jaGVzID0gbWFwIHsgbXkgJGJyYW5jaCA9ICRfOyAkYnJhbmNoID1+IHMvOlteOl0qJC8vOyAkYnJhbmNoID0+IDEgfSBAQVJHVjsKKworIyAkYnJhbmNoX25hbWVfbWFwOgorIyBtYXBzIGFyY2ggYnJhbmNoZXMgdG8gZ2l0IGJyYW5jaCBuYW1lcworbXkgJWJyYW5jaF9uYW1lX21hcCA9IG1hcCB7IG0vXiguKik6KFteOl0qKSQvOyAkMSA9PiAkMiB9IGdyZXAgeyBtLzovIH0gQEFSR1Y7CisKKyRFTlZ7J1RNUERJUid9ID0gJG9wdF90IGlmICRvcHRfdDsgIyAkRU5We1RNUERJUn0gd2lsbCBhZmZlY3QgdGVtcGRpcigpIGNhbGxzOgorbXkgJHRtcCA9IHRlbXBkaXIoJ2dpdC1hcmNoaW1wb3J0LVhYWFhYWCcsIFRNUERJUiA9PiAxLCBDTEVBTlVQID0+IDEpOworJG9wdF92ICYmIHByaW50ICIrIFVzaW5nICR0bXAgYXMgdGVtcG9yYXJ5IGRpcmVjdG9yeVxuIjsKKwordW5sZXNzICgtZCAkZ2l0X2RpcikgeyAjIGluaXRpYWwgaW1wb3J0IG5lZWRzIGVtcHR5IGRpcmVjdG9yeQorICAgIG9wZW5kaXIgRElSLCAnLicgb3IgZGllICJVbmFibGUgdG8gb3BlbiBjdXJyZW50IGRpcmVjdG9yeTogJCFcbiI7CisgICAgd2hpbGUgKG15ICRlbnRyeSA9IHJlYWRkaXIgRElSKSB7CisgICAgICAgICRlbnRyeSA9fiAvXlwuXC4/JC8gb3IKKyAgICAgICAgICAgIGRpZSAiSW5pdGlhbCBpbXBvcnQgbmVlZHMgYW4gZW1wdHkgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiIKKyAgICB9CisgICAgY2xvc2VkaXIgRElSCit9CisKK215ICRkZWZhdWx0X2FyY2hpdmU7CQkjIGRlZmF1bHQgQXJjaCBhcmNoaXZlCitteSAlcmVhY2hhYmxlID0gKCk7ICAgICAgICAgICAgICMgQXJjaCByZXBvc2l0b3JpZXMgd2UgY2FuIGFjY2VzcworbXkgJXVucmVhY2hhYmxlID0gKCk7ICAgICAgICAgICAjIEFyY2ggcmVwb3NpdG9yaWVzIHdlIGNhbid0IGFjY2VzcyA6PAorbXkgQHBzZXRzICA9ICgpOyAgICAgICAgICAgICAgICAjIHRoZSBjb2xsZWN0aW9uCitteSAlcHNldHMgID0gKCk7ICAgICAgICAgICAgICAgICMgdGhlIGNvbGxlY3Rpb24sIGJ5IG5hbWUKK215ICVzdGF0cyAgPSAoCQkJIyBUcmFjayB3aGljaCBzdHJhdGVneSB3ZSB1c2VkIHRvIGltcG9ydDoKKwlnZXRfdGFnID0+IDAsIHJlcGxheSA9PiAwLCBnZXRfbmV3ID0+IDAsIGdldF9kZWx0YSA9PiAwLAorICAgICAgICBzaW1wbGVfY2hhbmdlc2V0ID0+IDAsIGltcG9ydF9vcl90YWcgPT4gMAorKTsKKworbXkgJXJwdGFncyA9ICgpOyAgICAgICAgICAgICAgICAjIG15IHJldmVyc2UgcHJpdmF0ZSB0YWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gbWFwIGEgU0hBMSB0byBhIGNvbW1pdGlkCitteSAkVExBID0gJEVOVnsnQVJDSF9DTElFTlQnfSB8fCAndGxhJzsKKworc3ViIGRvX2Ficm93c2UgeworICAgIG15ICRzdGFnZSA9IHNoaWZ0OworICAgIHdoaWxlIChteSAoJGxpbWl0LCAkbGV2ZWwpID0gZWFjaCAlYXJjaF9icmFuY2hlcykgeworICAgICAgICBuZXh0IHVubGVzcyAkbGV2ZWwgPT0gJHN0YWdlOworICAgICAgICAKKwlvcGVuIEFCUk9XU0UsICIkVExBIGFicm93c2UgLWZrRCAtLW1lcmdlcyAkbGltaXQgfCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpZSAiUHJvYmxlbXMgd2l0aCB0bGEgYWJyb3dzZTogJCEiOworICAgIAorICAgICAgICBteSAlcHMgICAgICAgID0gKCk7ICAgICAgICAgIyB0aGUgY3VycmVudCBvbmUKKyAgICAgICAgbXkgJGxhc3RzZWVuICA9ICcnOworICAgIAorICAgICAgICB3aGlsZSAoPEFCUk9XU0U+KSB7CisgICAgICAgICAgICBjaG9tcDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBmaXJzdCByZWNvcmQgcGFkZGVkIHcgOCBzcGFjZXMKKyAgICAgICAgICAgIGlmIChzL15cc3s4fVxiLy8pIHsKKyAgICAgICAgICAgICAgICBteSAoJGlkLCAkdHlwZSkgPSBzcGxpdChtL1xzKy8sICRfLCAyKTsKKworICAgICAgICAgICAgICAgIG15ICVsYXN0X3BzOworICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlY29yZCB3ZSBqdXN0IGNhcHR1cmVkCisgICAgICAgICAgICAgICAgaWYgKCVwcyAmJiAhZXhpc3RzICRwc2V0c3sgJHBze2lkfSB9KSB7CisgICAgICAgICAgICAgICAgICAgICVsYXN0X3BzID0gJXBzOyAjIGJyZWFrIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgcHVzaCAoQHBzZXRzLCBcJWxhc3RfcHMpOworICAgICAgICAgICAgICAgICAgICAkcHNldHN7ICRsYXN0X3Bze2lkfSB9ID0gXCVsYXN0X3BzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBteSAkYnJhbmNoID0gZXh0cmFjdF92ZXJzaW9ubmFtZSgkaWQpOworICAgICAgICAgICAgICAgICVwcyA9ICggaWQgPT4gJGlkLCBicmFuY2ggPT4gJGJyYW5jaCApOworICAgICAgICAgICAgICAgIGlmICglbGFzdF9wcyAmJiAoJGxhc3RfcHN7YnJhbmNofSBlcSAkYnJhbmNoKSkgeworICAgICAgICAgICAgICAgICAgICAkcHN7cGFyZW50X2lkfSA9ICRsYXN0X3Bze2lkfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgJGFyY2hfYnJhbmNoZXN7JGJyYW5jaH0gPSAxOworICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdpZCc7CisKKyAgICAgICAgICAgICAgICAjIGRlYWwgd2l0aCB0eXBlcyAoc2hvdWxkIHdvcmsgd2l0aCBiYXogb3IgdGxhKToKKyAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPX4gbS9cKC4qY2hhbmdlc2V0XCkvKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3t0eXBlfSA9ICdzJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkdHlwZSA9fiAvXCguKmltcG9ydFwpLykgeworICAgICAgICAgICAgICAgICAgICAkcHN7dHlwZX0gPSAnaSc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJHR5cGUgPX4gbS9cKHRhZy4qPyhcUytcQFxTKykuKj9cKS8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze3R5cGV9ID0gJ3QnOworICAgICAgICAgICAgICAgICAgICAjIHJlYWQgd2hpY2ggcmV2aXNpb24gd2UndmUgdGFnZ2VkIHdoZW4gd2UgcGFyc2UgdGhlIGxvZworICAgICAgICAgICAgICAgICAgICAkcHN7dGFnfSAgPSAkMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICAgICAgd2FybiAiVW5rbm93biB0eXBlICR0eXBlIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAkYXJjaF9icmFuY2hlc3skYnJhbmNofSA9IDE7CisgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ2lkJzsKKyAgICAgICAgICAgIH0gZWxzaWYgKHMvXlxzezEwfS8vKSB7IAorICAgICAgICAgICAgICAgICMgMTAgbGVhZGluZyBzcGFjZXMgb3IgbW9yZSAKKyAgICAgICAgICAgICAgICAjIGluZGljYXRlIGNvbW1pdCBtZXRhZGF0YQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgZGF0ZQorICAgICAgICAgICAgICAgIGlmICgkbGFzdHNlZW4gZXEgJ2lkJyAmJiBtL14oXGR7NH0tXGRcZC1cZFxkIFxkXGQ6XGRcZDpcZFxkKS8peworICAgICAgICAgICAgICAgICAgICAkcHN7ZGF0ZX0gICA9ICQxOworICAgICAgICAgICAgICAgICAgICAkbGFzdHNlZW4gPSAnZGF0ZSc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJF8gZXEgJ21lcmdlcyBpbjonKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3ttZXJnZXN9ID0gW107CisgICAgICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdtZXJnZXMnOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCRsYXN0c2VlbiBlcSAnbWVyZ2VzJyAmJiBzL15cc3syfS8vKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRpZCA9ICRfOworICAgICAgICAgICAgICAgICAgICBwdXNoIChAeyRwc3ttZXJnZXN9fSwgJGlkKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIyBhZ2dyZXNzaXZlIGJyYW5jaCBmaW5kaW5nOgorICAgICAgICAgICAgICAgICAgICBpZiAoJG9wdF9EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkYnJhbmNoID0gZXh0cmFjdF92ZXJzaW9ubmFtZSgkaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHJlcG8gPSBleHRyYWN0X3JlcG9uYW1lKCRicmFuY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJjaGl2ZV9yZWFjaGFibGUoJHJlcG8pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRhcmNoX2JyYW5jaGVzeyRicmFuY2h9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyY2hfYnJhbmNoZXN7JGJyYW5jaH0gPSAkc3RhZ2UgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybiAibW9yZSBtZXRhZGF0YSBhZnRlciBtZXJnZXMhPzogJF9cbiIgdW5sZXNzIC9eXHMqJC87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCVwcyAmJiAhZXhpc3RzICRwc2V0c3sgJHBze2lkfSB9KSB7CisgICAgICAgICAgICBteSAldGVtcCA9ICVwczsgICAgICAgICAjIGJyZWFrIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIGlmIChAcHNldHMgJiYgJHBzZXRzWyQjcHNldHNde2JyYW5jaH0gZXEgJHBze2JyYW5jaH0pIHsKKyAgICAgICAgICAgICAgICAkdGVtcHtwYXJlbnRfaWR9ID0gJHBzZXRzWyQjcHNldHNde2lkfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2ggKEBwc2V0cywgXCV0ZW1wKTsgIAorICAgICAgICAgICAgJHBzZXRzeyAkdGVtcHtpZH0gfSA9IFwldGVtcDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgCisgICAgICAgIGNsb3NlIEFCUk9XU0Ugb3IgZGllICIkVExBIGFicm93c2UgZmFpbGVkIG9uICRsaW1pdFxuIjsKKyAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW5kIGZvcmVhY2ggJHJvb3QKKworZG9fYWJyb3dzZSgxKTsKK215ICRkZXB0aCA9IDI7Ciskb3B0X0QgfHw9IDA7Cit3aGlsZSAoJGRlcHRoIDw9ICRvcHRfRCkgeworICAgIGRvX2Ficm93c2UoJGRlcHRoKTsKKyAgICAkZGVwdGgrKzsKK30KKworIyMgT3JkZXIgcGF0Y2hlcyBieSB0aW1lCisjIEZJWE1FIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1vcmUgb3B0aW1hbCB3YXkgdG8gZG8gdGhpcyBieSBncmFwaGluZworIyB0aGUgYW5jZXN0cnkgZGF0YSBhbmQgd2Fsa2luZyBpdCwgdGhhdCB3YXkgd2Ugd29uJ3QgaGF2ZSB0byByZWx5IG9uCisjIGNsaWVudC1zdXBwbGllZCBkYXRlcworQHBzZXRzID0gc29ydCB7JGEtPntkYXRlfS4kYi0+e2lkfSBjbXAgJGItPntkYXRlfS4kYi0+e2lkfX0gQHBzZXRzOworCisjcHJpbnQgRHVtcGVyIFxAcHNldHM7CisKKyMjCisjIyBUT0RPIGNsZWFudXAgaXJyZWxldmFudCBwYXRjaGVzCisjIyAgICAgIGFuZCBwdXQgYW4gaW5pdGlhbCBpbXBvcnQKKyMjICAgICAgb3IgYSBmdWxsIHRhZworbXkgJGltcG9ydCA9IDA7Cit1bmxlc3MgKC1kICRnaXRfZGlyKSB7ICMgaW5pdGlhbCBpbXBvcnQKKyAgICBpZiAoJHBzZXRzWzBde3R5cGV9IGVxICdpJyB8fCAkcHNldHNbMF17dHlwZX0gZXEgJ3QnKSB7CisgICAgICAgIHByaW50ICJTdGFydGluZyBpbXBvcnQgZnJvbSAkcHNldHNbMF17aWR9XG4iOworCWBnaXQtaW5pdGA7CisJZGllICQhIGlmICQ/OworCSRpbXBvcnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiTmVlZCB0byBzdGFydCBmcm9tIGFuIGltcG9ydCBvciBhIHRhZyAtLSBjYW5ub3QgdXNlICRwc2V0c1swXXtpZH0iOworICAgIH0KK30gZWxzZSB7ICAgICMgcHJvZ3Jlc3NpbmcgYW4gaW1wb3J0CisgICAgIyBsb2FkIHRoZSBycHRhZ3MKKyAgICBvcGVuZGlyKERJUiwgJHB0YWdfZGlyKQorCXx8IGRpZSAiY2FuJ3Qgb3BlbmRpcjogJCEiOworICAgIHdoaWxlIChteSAkZmlsZSA9IHJlYWRkaXIoRElSKSkgeworICAgICAgICAjIHNraXAgbm9uLWludGVyZXN0aW5nLWZpbGVzCisgICAgICAgIG5leHQgdW5sZXNzIC1mICIkcHRhZ19kaXIvJGZpbGUiOworICAgCisgICAgICAgICMgY29udmVydCBmaXJzdCAnLS0nIHRvICcvJyBmcm9tIG9sZCBnaXQtYXJjaGltcG9ydCB0byB1c2UKKyAgICAgICAgIyBhcyBhbiBhcmNoaXZlbmFtZS9jLS1iLS12IHByaXZhdGUgdGFnCisgICAgICAgIGlmICgkZmlsZSAhfiBtISwhKSB7CisgICAgICAgICAgICBteSAkb2xkZmlsZSA9ICRmaWxlOworICAgICAgICAgICAgJGZpbGUgPX4gcyEtLSEsITsKKyAgICAgICAgICAgIHByaW50IFNUREVSUiAiY29udmVydGluZyBvbGQgdGFnICRvbGRmaWxlIHRvICRmaWxlXG4iOworICAgICAgICAgICAgcmVuYW1lKCIkcHRhZ19kaXIvJG9sZGZpbGUiLCAiJHB0YWdfZGlyLyRmaWxlIikgb3IgZGllICQhOworICAgICAgICB9CisJbXkgJHNoYSA9IHB0YWcoJGZpbGUpOworCWNob21wICRzaGE7CisJJHJwdGFnc3skc2hhfSA9ICRmaWxlOworICAgIH0KKyAgICBjbG9zZWRpciBESVI7Cit9CisKKyMgcHJvY2VzcyBwYXRjaHNldHMKKyMgZXh0cmFjdCB0aGUgQXJjaCByZXBvc2l0b3J5IG5hbWUgKEFyY2ggImFyY2hpdmUiIGluIEFyY2gtc3BlYWspCitzdWIgZXh0cmFjdF9yZXBvbmFtZSB7CisgICAgbXkgJGZxX2N2YnIgPSBzaGlmdDsgIyBhcmNoaXZlbmFtZS9bW1tbY2F0ZWdvcnldYnJhbmNoXXZlcnNpb25dcmV2aXNpb25dCisgICAgcmV0dXJuIChzcGxpdCgvXC8vLCAkZnFfY3ZicikpWzBdOworfQorIAorc3ViIGV4dHJhY3RfdmVyc2lvbm5hbWUgeworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgJG5hbWUgPX4gcy8tLSg/OnBhdGNofHZlcnNpb24oPzpmaXgpP3xiYXNlKS1cZCskLy87CisgICAgcmV0dXJuICRuYW1lOworfQorCisjIGNvbnZlcnQgYSBmdWxseS1xdWFsaWZpZWQgcmV2aXNpb24gb3IgdmVyc2lvbiB0byBhIHVuaXF1ZSBkaXJuYW1lOgorIyAgIG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldC0wNS9tcGQtLXVjbGludXgtLTEtLXBhdGNoLTIgCisjIGJlY29tZXM6IG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldC0wNSxtcGQtLXVjbGludXgtLTEKKyMKKyMgdGhlIGdpdCBub3Rpb24gb2YgYSBicmFuY2ggaXMgY2xvc2VyIHRvCisjIGFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaC0tdmVyc2lvbiB0aGFuIGFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaCwgc28gd2UKKyMgdXNlIHRoaXMgdG8gY29udmVydCB0byBnaXQgYnJhbmNoIG5hbWVzLgorIyBBbHNvLCBrZWVwIGFyY2hpdmUgbmFtZXMgYnV0IHJlcGxhY2UgJy8nIHdpdGggJywnIHNpbmNlIGl0IHdvbid0IHJlcXVpcmUKKyMgc3ViZGlyZWN0b3JpZXMsIGFuZCBpcyBzYWZlciB0aGFuIHN3YXBwaW5nICctLScgd2hpY2ggY291bGQgY29uZnVzZQorIyByZXZlcnNlLW1hcHBpbmcgd2hlbiBkZWFsaW5nIHdpdGggYmFzdGFyZCBicmFuY2hlcyB0aGF0CisjIGFyZSBqdXN0IGFyY2hpdmUvY2F0ZWdvcnktLXZlcnNpb24gIChubyAtLWJyYW5jaCkKK3N1YiB0cmVlX2Rpcm5hbWUgeworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gZXh0cmFjdF92ZXJzaW9ubmFtZSgkcmV2aXNpb24pOworICAgICRuYW1lID1+IHMjLyMsIzsKKyAgICByZXR1cm4gJG5hbWU7Cit9CisKKyMgb2xkIHZlcnNpb25zIG9mIGdpdC1hcmNoaW1wb3J0IGp1c3QgdXNlIHRoZSA8Y2F0ZWdvcnktLWJyYW5jaD4gcGFydDoKK3N1YiBvbGRfc3R5bGVfYnJhbmNobmFtZSB7CisgICAgbXkgJGlkID0gc2hpZnQ7CisgICAgbXkgJHJldCA9IHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ3BhcnNlLXBhY2thZ2UtbmFtZScsJy1wJywkaWQpOworICAgIGNob21wICRyZXQ7CisgICAgcmV0dXJuICRyZXQ7Cit9CisKKypnaXRfZGVmYXVsdF9icmFuY2huYW1lID0gJG9wdF9vID8gKm9sZF9zdHlsZV9icmFuY2huYW1lIDogKnRyZWVfZGlybmFtZTsKKworIyByZXRyaWV2ZSBkZWZhdWx0IGFyY2hpdmUsIHNpbmNlICRicmFuY2hfbmFtZV9tYXAga2V5cyBtaWdodCBub3QgaW5jbHVkZSBpdAorc3ViIGdldF9kZWZhdWx0X2FyY2hpdmUgeworICAgIGlmICghZGVmaW5lZCAkZGVmYXVsdF9hcmNoaXZlKSB7CisgICAgICAgICRkZWZhdWx0X2FyY2hpdmUgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdteS1kZWZhdWx0LWFyY2hpdmUnKTsKKyAgICAgICAgY2hvbXAgJGRlZmF1bHRfYXJjaGl2ZTsKKyAgICB9CisgICAgcmV0dXJuICRkZWZhdWx0X2FyY2hpdmU7Cit9CisKK3N1YiBnaXRfYnJhbmNobmFtZSB7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRyZXZpc2lvbik7CisKKyAgICBpZiAoZXhpc3RzICRicmFuY2hfbmFtZV9tYXB7JG5hbWV9KSB7CisJcmV0dXJuICRicmFuY2hfbmFtZV9tYXB7JG5hbWV9OworCisgICAgfSBlbHNpZiAoJG5hbWUgPX4gbSNeKFteL10qKS8oLiopJCMKKwkgICAgICYmICQxIGVxIGdldF9kZWZhdWx0X2FyY2hpdmUoKQorCSAgICAgJiYgZXhpc3RzICRicmFuY2hfbmFtZV9tYXB7JDJ9KSB7CisJIyB0aGUgbmFtZXMgZ2l2ZW4gaW4gdGhlIGNvbW1hbmQtbGluZSBsYWNrZWQgdGhlIGFyY2hpdmUuCisJcmV0dXJuICRicmFuY2hfbmFtZV9tYXB7JDJ9OworCisgICAgfSBlbHNlIHsKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfYnJhbmNobmFtZSgkcmV2aXNpb24pOworICAgIH0KK30KKworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGUgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgIAorICAgICMgc3dpdGNoIHRvIHRoYXQgYnJhbmNoIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIHRoYXQgYnJhbmNoOgorICAgIGlmICgtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0JywnLWYnLCRwcy0+e2JyYW5jaH0pID09IDAgb3IgZGllICIkISAkP1xuIjsKKworICAgICAgICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYgdGhhdCBnb3QgbGVmdG92ZXI6CisgICAgICAgbXkgJHJtID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1scy1maWxlcycsJy0tb3RoZXJzJywnLXonKTsKKyAgICAgICBybXRyZWUoc3BsaXQoL1wwLywkcm0pKSBpZiAkcm07CisgICAgfQorICAgIAorICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgbXkgJGRpciA9IHN5bmNfdG9fcHMoJHBzKTsKKyAgICAjIHJlYWQgdGhlIG5ldyBsb2cgZW50cnk6CisgICAgbXkgQGNvbW1pdGxvZyA9IHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2NhdC1sb2cnLCctZCcsJGRpciwkcHMtPntpZH0pOworICAgIGRpZSAiRXJyb3IgaW4gY2F0LWxvZzogJCEiIGlmICQ/OworICAgIGNob21wIEBjb21taXRsb2c7CisKKyAgICAjIGdyYWIgdmFyaWFibGVzIHdlIHdhbnQgZnJvbSB0aGUgbG9nLCBuZXcgZmllbGRzIGdldCBhZGRlZCB0byAkcHM6CisgICAgIyAoYXV0aG9yLCBkYXRlLCBlbWFpbCwgc3VtbWFyeSwgbWVzc2FnZSBib2R5IC4uLikKKyAgICBwYXJzZWxvZygkcHMsIFxAY29tbWl0bG9nKTsKKworICAgIGlmICgkcHMtPntpZH0gPX4gLy0tYmFzZS0wJC8gJiYgJHBzLT57aWR9IG5lICRwc2V0c1swXXtpZH0pIHsKKyAgICAgICAgIyB0aGlzIHNob3VsZCB3b3JrIHdoZW4gaW1wb3J0aW5nIGNvbnRpbnVhdGlvbnMgCisgICAgICAgIGlmICgkcHMtPnt0YWd9ICYmIChteSAkYnJhbmNocG9pbnQgPSBldmFsIHsgcHRhZygkcHMtPnt0YWd9KSB9KSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisJICAgIGlmICghIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisJCXN5c3RlbSgnZ2l0LWJyYW5jaCcsJHBzLT57YnJhbmNofSwkYnJhbmNocG9pbnQpID09IDAgb3IgZGllICIkISAkP1xuIjsKKworCQkjIFdlIHRydXN0IEFyY2ggd2l0aCB0aGUgZmFjdCB0aGF0IHRoaXMgaXMganVzdCBhIHRhZywKKwkJIyBhbmQgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSwgc28KKwkJIyB3ZSBqdXN0IHRhZyBhbmQgbW92ZSBvbi4gIElmIHRoZSB1c2VyIHJlYWxseSB3YW50cyB1cworCQkjIHRvIGNvbnNvbGlkYXRlIG1vcmUgYnJhbmNoZXMgaW50byBvbmUsIGRvbid0IHRhZyBiZWNhdXNlCisJCSMgdGhlIHRhZyBuYW1lIHdvdWxkIGJlIGFscmVhZHkgdGFrZW4uCisJCXRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisJCXB0YWcoJHBzLT57aWR9LCAkYnJhbmNocG9pbnQpOworCQlwcmludCAiICogVGFnZ2VkICRwcy0+e2lkfSBhdCAkYnJhbmNocG9pbnRcbiI7CisJICAgIH0KKwkgICAgc3lzdGVtKCdnaXQtY2hlY2tvdXQnLCctZicsJHBzLT57YnJhbmNofSkgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworCisgICAgICAgICAgICAjIHJlbW92ZSBhbnkgb2xkIHN0dWZmIHRoYXQgZ290IGxlZnRvdmVyOgorICAgICAgICAgICAgbXkgJHJtID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1scy1maWxlcycsJy0tb3RoZXJzJywnLXonKTsKKyAgICAgICAgICAgIHJtdHJlZShzcGxpdCgvXDAvLCRybSkpIGlmICRybTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FybiAiVGFnZ2luZyBmcm9tIHVua25vd24gaWQgdW5zdXBwb3J0ZWRcbiIgaWYgJHBzLT57dGFnfTsKKyAgICAgICAgfQorICAgICAgICAjIGFsbG93IG11bHRpcGxlIGJhc2VzL2ltcG9ydHMgaGVyZSBzaW5jZSBBcmNoIHN1cHBvcnRzIGNoZXJyeS1waWNrcworICAgICAgICAjIGZyb20gdW5yZWxhdGVkIHRyZWVzCisgICAgfSAKKyAgICAKKyAgICAjIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBhbGwgdGhlIGNoYW5nZXMgd2UgZ290CisgICAgc3lzdGVtKCdnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiB8ICcuCisgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgIHN5c3RlbSgnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC16IHwgJy4KKyAgICAgICAgICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC16IC0tc3RkaW4nKSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgcmV0dXJuIDE7Cit9CisKKyMgdGhlIG5hdGl2ZSBjaGFuZ2VzZXQgcHJvY2Vzc2luZyBzdHJhdGVneS4gIFRoaXMgaXMgdmVyeSBmYXN0LCBidXQKKyMgZG9lcyBub3QgaGFuZGxlIHBlcm1pc3Npb25zIG9yIGFueSByZW5hbWVzIGludm9sdmluZyBkaXJlY3Rvcmllcworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfZmFzdCB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgIyAKKyAgICAjIGNyZWF0ZSB0aGUgYnJhbmNoIGlmIG5lZWRlZAorICAgICMKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knICYmICEkaW1wb3J0KSB7CisgICAgICAgIGRpZSAiU2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgJ0luaXRpYWwgaW1wb3J0JyBwZXIgR0lUIGltcG9ydDogJHBzLT57aWR9IjsKKyAgICB9CisKKyAgICB1bmxlc3MgKCRpbXBvcnQpIHsgIyBza2lwIGZvciBpbXBvcnQKKyAgICAgICAgaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgIyB3ZSBrbm93IGFib3V0IHRoaXMgYnJhbmNoCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJHBzLT57YnJhbmNofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG5ldyBicmFuY2ghIHdlIG5lZWQgdG8gdmVyaWZ5IGEgZmV3IHRoaW5ncworICAgICAgICAgICAgZGllICJCcmFuY2ggb24gYSBub24tdGFnISIgdW5sZXNzICRwcy0+e3R5cGV9IGVxICd0JzsKKyAgICAgICAgICAgIG15ICRicmFuY2hwb2ludCA9IHB0YWcoJHBzLT57dGFnfSk7CisgICAgICAgICAgICBkaWUgIlRhZ2dpbmcgZnJvbSB1bmtub3duIGlkIHVuc3VwcG9ydGVkOiAkcHMtPnt0YWd9IiAKKyAgICAgICAgICAgICAgICB1bmxlc3MgJGJyYW5jaHBvaW50OworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisJICAgIGlmICghIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisJCXN5c3RlbSgnZ2l0LWJyYW5jaCcsJHBzLT57YnJhbmNofSwkYnJhbmNocG9pbnQpID09IDAgb3IgZGllICIkISAkP1xuIjsKKworCQkjIFdlIHRydXN0IEFyY2ggd2l0aCB0aGUgZmFjdCB0aGF0IHRoaXMgaXMganVzdCBhIHRhZywKKwkJIyBhbmQgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSwgc28KKwkJIyB3ZSBqdXN0IHRhZyBhbmQgbW92ZSBvbi4gIElmIHRoZSB1c2VyIHJlYWxseSB3YW50cyB1cworCQkjIHRvIGNvbnNvbGlkYXRlIG1vcmUgYnJhbmNoZXMgaW50byBvbmUsIGRvbid0IHRhZyBiZWNhdXNlCisJCSMgdGhlIHRhZyBuYW1lIHdvdWxkIGJlIGFscmVhZHkgdGFrZW4uCisJCXRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisJCXB0YWcoJHBzLT57aWR9LCAkYnJhbmNocG9pbnQpOworCQlwcmludCAiICogVGFnZ2VkICRwcy0+e2lkfSBhdCAkYnJhbmNocG9pbnRcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJHBzLT57YnJhbmNofSkgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gCisgICAgICAgIGRpZSAkISBpZiAkPzsKKyAgICB9IAorCisgICAgIworICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgIyAKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knIHx8ICRwcy0+e3R5cGV9IGVxICd0JykgeworICAgICAgICBhcHBseV9pbXBvcnQoJHBzKSBvciBkaWUgJCE7CisgICAgICAgICRzdGF0c3tpbXBvcnRfb3JfdGFnfSsrOworICAgICAgICAkaW1wb3J0PTA7CisgICAgfSBlbHNpZiAoJHBzLT57dHlwZX0gZXEgJ3MnKSB7CisgICAgICAgIGFwcGx5X2NzZXQoJHBzKTsKKyAgICAgICAgJHN0YXRze3NpbXBsZV9jaGFuZ2VzZXR9Kys7CisgICAgfQorCisgICAgIworICAgICMgcHJlcGFyZSB1cGRhdGUgZ2l0J3MgaW5kZXgsIGJhc2VkIG9uIHdoYXQgYXJjaCBrbm93cworICAgICMgYWJvdXQgdGhlIHBzZXQsIHJlc29sdmUgcGFyZW50cywgZXRjCisgICAgIworICAgIAorICAgIG15IEBjb21taXRsb2cgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdjYXQtYXJjaGl2ZS1sb2cnLCRwcy0+e2lkfSk7IAorICAgIGRpZSAiRXJyb3IgaW4gY2F0LWFyY2hpdmUtbG9nOiAkISIgaWYgJD87CisgICAgICAgIAorICAgIHBhcnNlbG9nKCRwcyxcQGNvbW1pdGxvZyk7CisKKyAgICAjIGltcG9ydHMgZG9uJ3QgZ2l2ZSB1cyBnb29kIGluZm8KKyAgICAjIG9uIGFkZGVkIGZpbGVzLiBTaGFtZSBvbiB0aGVtCisgICAgaWYgKCRwcy0+e3R5cGV9IGVxICdpJyB8fCAkcHMtPnt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgc3lzdGVtKCdnaXQtbHMtZmlsZXMgLS1kZWxldGVkIC16IHwgJy4KKyAgICAgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgICAgICBzeXN0ZW0oJ2dpdC1scy1maWxlcyAtLW90aGVycyAteiB8ICcuCisgICAgICAgICAgICAgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLXogLS1zdGRpbicpID09IDAgb3IgZGllICIkISAkP1xuIjsKKyAgICB9CisKKyAgICAjIFRPRE86IGhhbmRsZSByZW1vdmVkX2RpcmVjdG9yaWVzIGFuZCByZW5hbWVkX2RpcmVjdG9yaWVzOgorCisgICAgaWYgKG15ICRkZWwgPSAkcHMtPntyZW1vdmVkX2ZpbGVzfSkgeworICAgICAgICB1bmxpbmsgQCRkZWw7CisgICAgICAgIHdoaWxlIChAJGRlbCkgeworICAgICAgICAgICAgbXkgQHNsaWNlID0gc3BsaWNlKEAkZGVsLCAwLCAxMDApOworICAgICAgICAgICAgc3lzdGVtKCdnaXQtdXBkYXRlLWluZGV4JywnLS1yZW1vdmUnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChteSAkcmVuID0gJHBzLT57cmVuYW1lZF9maWxlc30pIHsgICAgICAgICAgICAgICAgIyByZW5hbWVkCisgICAgICAgIGlmIChAJHJlbiAlIDIpIHsKKyAgICAgICAgICAgIGRpZSAiT2RkIG51bWJlciBvZiBlbnRyaWVzIGluIHJlbmFtZSE/IjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKEAkcmVuKSB7CisgICAgICAgICAgICBteSAkZnJvbSA9IHNoaWZ0IEAkcmVuOworICAgICAgICAgICAgbXkgJHRvICAgPSBzaGlmdCBAJHJlbjsgICAgICAgICAgIAorCisgICAgICAgICAgICB1bmxlc3MgKC1kIGRpcm5hbWUoJHRvKSkgeworICAgICAgICAgICAgICAgIG1rcGF0aChkaXJuYW1lKCR0bykpOyAjIHdpbGwgZGllIG9uIGVycgorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBwcmludCAibW92aW5nICRmcm9tICR0byI7CisgICAgICAgICAgICByZW5hbWUoJGZyb20sICR0bykgb3IgZGllICJFcnJvciByZW5hbWluZyAnJGZyb20nICckdG8nOiAkIVxuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tcmVtb3ZlJywnLS0nLCRmcm9tKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tYWRkJywnLS0nLCR0bykgPT0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgaW4gZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZDogJCEgJD9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobXkgJGFkZCA9ICRwcy0+e25ld19maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkYWRkKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRhZGQsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLWFkZCcsJy0tJyxAc2xpY2UpID09IDAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVycm9yIGluIGdpdC11cGRhdGUtaW5kZXggLS1hZGQ6ICQhICQ/XG4iOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG15ICRtb2QgPSAkcHMtPnttb2RpZmllZF9maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkbW9kKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRtb2QsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4OiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgIyB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGUgY2hhbmdlc2V0Cit9CisKK2lmICgkb3B0X2YpIHsKKyAgICBwcmludCAiV2lsbCBpbXBvcnQgcGF0Y2hzZXRzIHVzaW5nIHRoZSBmYXN0IHN0cmF0ZWd5XG4iLAorICAgICAgICAgICAgIlJlbmFtZWQgZGlyZWN0b3JpZXMgYW5kIHBlcm1pc3Npb24gY2hhbmdlcyB3aWxsIGJlIG1pc3NlZFxuIjsKKyAgICAqcHJvY2Vzc19wYXRjaHNldCA9ICpwcm9jZXNzX3BhdGNoc2V0X2Zhc3Q7Cit9IGVsc2UgeworICAgIHByaW50ICJVc2luZyB0aGUgZGVmYXVsdCAoYWNjdXJhdGUpIGltcG9ydCBzdHJhdGVneS5cbiIsCisgICAgICAgICAgICAiVGhpbmdzIG1heSBiZSBhIGJpdCBzbG93XG4iOworICAgICpwcm9jZXNzX3BhdGNoc2V0ID0gKnByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGU7Cit9CisgICAgCitmb3JlYWNoIG15ICRwcyAoQHBzZXRzKSB7CisgICAgIyBwcm9jZXNzIHBhdGNoc2V0cworICAgICRwcy0+e2JyYW5jaH0gPSBnaXRfYnJhbmNobmFtZSgkcHMtPntpZH0pOworCisgICAgIworICAgICMgZW5zdXJlIHdlIGhhdmUgYSBjbGVhbiBzdGF0ZSAKKyAgICAjIAorICAgIGlmIChteSAkZGlydHkgPSBgZ2l0LWRpZmYtZmlsZXNgKSB7CisgICAgICAgIGRpZSAiVW5jbGVhbiB0cmVlIHdoZW4gYWJvdXQgdG8gcHJvY2VzcyAkcHMtPntpZH0gIiAuCisgICAgICAgICAgICAiIC0gZGlkIHdlIGZhaWwgdG8gY29tbWl0IGNsZWFubHkgYmVmb3JlP1xuJGRpcnR5IjsKKyAgICB9CisgICAgZGllICQhIGlmICQ/OworICAgIAorICAgICMKKyAgICAjIHNraXAgY29tbWl0cyBhbHJlYWR5IGluIHJlcG8KKyAgICAjCisgICAgaWYgKHB0YWcoJHBzLT57aWR9KSkgeworICAgICAgJG9wdF92ICYmIHByaW50ICIgKiBTa2lwcGluZyBhbHJlYWR5IGltcG9ydGVkOiAkcHMtPntpZH1cbiI7CisgICAgICBuZXh0OworICAgIH0KKworICAgIHByaW50ICIgKiBTdGFydGluZyB0byB3b3JrIG9uICRwcy0+e2lkfVxuIjsKKworICAgIHByb2Nlc3NfcGF0Y2hzZXQoJHBzKSBvciBuZXh0OworCisgICAgIyB3YXJuICJlcnJvcnMgd2hlbiBydW5uaW5nIGdpdC11cGRhdGUtaW5kZXghICQhIjsKKyAgICBteSAkdHJlZSA9IGBnaXQtd3JpdGUtdHJlZWA7CisgICAgZGllICJjYW5ub3Qgd3JpdGUgdHJlZSAkISIgaWYgJD87CisgICAgY2hvbXAgJHRyZWU7CisgICAgCisgICAgIworICAgICMgV2hvJ3MgeW91ciBkYWRkeT8KKyAgICAjCisgICAgbXkgQHBhcjsKKyAgICBpZiAoIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisgICAgICAgIGlmIChvcGVuIEhFQUQsICI8IiwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgbXkgJHAgPSA8SEVBRD47CisgICAgICAgICAgICBjbG9zZSBIRUFEOworICAgICAgICAgICAgY2hvbXAgJHA7CisgICAgICAgICAgICBwdXNoIEBwYXIsICctcCcsICRwOworICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAncycpIHsKKyAgICAgICAgICAgICAgICB3YXJuICJDb3VsZCBub3QgZmluZCB0aGUgcmlnaHQgaGVhZCBmb3IgdGhlIGJyYW5jaCAkcHMtPnticmFuY2h9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoJHBzLT57bWVyZ2VzfSkgeworICAgICAgICBwdXNoIEBwYXIsIGZpbmRfcGFyZW50cygkcHMpOworICAgIH0KKworICAgICMgICAgCisgICAgIyBDb21taXQsIHRhZyBhbmQgY2xlYW4gc3RhdGUKKyAgICAjCisgICAgJEVOVntUWn0gICAgICAgICAgICAgICAgICA9ICdHTVQnOworICAgICRFTlZ7R0lUX0FVVEhPUl9OQU1FfSAgICAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gICAgPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQVVUSE9SX0RBVEV9ICAgICA9ICRwcy0+e2RhdGV9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQ09NTUlUVEVSX0RBVEV9ICA9ICRwcy0+e2RhdGV9OworCisgICAgbXkgJHBpZCA9IG9wZW4yKCpSRUFERVIsICpXUklURVIsJ2dpdC1jb21taXQtdHJlZScsJHRyZWUsQHBhcikgCisgICAgICAgIG9yIGRpZSAkITsKKyAgICBwcmludCBXUklURVIgJHBzLT57c3VtbWFyeX0sIlxuXG4iOworICAgIHByaW50IFdSSVRFUiAkcHMtPnttZXNzYWdlfSwiXG4iOworICAgIAorICAgICMgbWFrZSBpdCBlYXN5IHRvIGJhY2t0cmFjayBhbmQgZmlndXJlIG91dCB3aGljaCBBcmNoIHJldmlzaW9uIHRoaXMgd2FzOgorICAgIHByaW50IFdSSVRFUiAnZ2l0LWFyY2hpbXBvcnQtaWQ6ICcsJHBzLT57aWR9LCJcbiI7CisgICAgCisgICAgY2xvc2UgV1JJVEVSOworICAgIG15ICRjb21taXRpZCA9IDxSRUFERVI+OyAgICAjIHJlYWQKKyAgICBjaG9tcCAkY29tbWl0aWQ7CisgICAgY2xvc2UgUkVBREVSOworICAgIHdhaXRwaWQgJHBpZCwwOyAgICAgICAgICAgICAjIGNsb3NlOworCisgICAgaWYgKGxlbmd0aCAkY29tbWl0aWQgIT0gNDApIHsKKyAgICAgICAgZGllICJTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBjb21taXQhICQhICRjb21taXRpZCI7CisgICAgfQorICAgICMKKyAgICAjIFVwZGF0ZSB0aGUgYnJhbmNoCisgICAgIyAKKyAgICBvcGVuICBIRUFELCAiPiIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvJHBzLT57YnJhbmNofSI7CisgICAgcHJpbnQgSEVBRCAkY29tbWl0aWQ7CisgICAgY2xvc2UgSEVBRDsKKyAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtcmVmJywgJ0hFQUQnLCAiJHBzLT57YnJhbmNofSIpOworCisgICAgIyB0YWcgYWNjb3JkaW5nbHkKKyAgICBwdGFnKCRwcy0+e2lkfSwgJGNvbW1pdGlkKTsgIyBwcml2YXRlIHRhZworICAgIGlmICgkb3B0X1QgfHwgJHBzLT57dHlwZX0gZXEgJ3QnIHx8ICRwcy0+e3R5cGV9IGVxICdpJykgeworICAgICAgICB0YWcoJHBzLT57aWR9LCAkY29tbWl0aWQpOworICAgIH0KKyAgICBwcmludCAiICogQ29tbWl0dGVkICRwcy0+e2lkfVxuIjsKKyAgICBwcmludCAiICAgKyB0cmVlICAgJHRyZWVcbiI7CisgICAgcHJpbnQgIiAgICsgY29tbWl0ICRjb21taXRpZFxuIjsKKyAgICAkb3B0X3YgJiYgcHJpbnQgIiAgICsgY29tbWl0IGRhdGUgaXMgICRwcy0+e2RhdGV9IFxuIjsKKyAgICAkb3B0X3YgJiYgcHJpbnQgIiAgICsgcGFyZW50czogICIsam9pbignICcsQHBhciksIlxuIjsKK30KKworaWYgKCRvcHRfdikgeworICAgIGZvcmVhY2ggKHNvcnQga2V5cyAlc3RhdHMpIHsKKyAgICAgICAgcHJpbnQiICRfOiAkc3RhdHN7JF99XG4iOworICAgIH0KK30KK2V4aXQgMDsKKworIyB1c2VkIGJ5IHRoZSBhY2N1cmF0ZSBzdHJhdGVneToKK3N1YiBzeW5jX3RvX3BzIHsKKyAgICBteSAkcHMgPSBzaGlmdDsKKyAgICBteSAkdHJlZV9kaXIgPSAkdG1wLicvJy50cmVlX2Rpcm5hbWUoJHBzLT57aWR9KTsKKyAgICAKKyAgICAkb3B0X3YgJiYgcHJpbnQgInN5bmNfdG9fcHMoJHBzLT57aWR9KSBtZXRob2Q6ICI7CisKKyAgICBpZiAoLWQgJHRyZWVfZGlyKSB7CisgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAndCcpIHsKKwkgICAgJG9wdF92ICYmIHByaW50ICJnZXQgKHRhZylcbiI7CisgICAgICAgICAgICAjIGxvb2tzIGxpa2UgYSB0YWctb25seSBvciAod29yc2UsKSBhIG1peGVkIHRhZ3MvY2hhbmdlc2V0IGJyYW5jaCwKKyAgICAgICAgICAgICMgY2FuJ3QgcmVseSBvbiByZXBsYXkgdG8gd29yayBjb3JyZWN0bHkgb24gdGhlc2UKKyAgICAgICAgICAgIHJtdHJlZSgkdHJlZV9kaXIpOworICAgICAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICAgICAkc3RhdHN7Z2V0X3RhZ30rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBteSAkdHJlZV9pZCA9IGFyY2hfdHJlZV9pZCgkdHJlZV9kaXIpOworICAgICAgICAgICAgICAgIGlmICgkcHMtPntwYXJlbnRfaWR9ICYmICgkcHMtPntwYXJlbnRfaWR9IGVxICR0cmVlX2lkKSkgeworICAgICAgICAgICAgICAgICAgICAjIHRoZSBjb21tb24gY2FzZSAoaG9wZWZ1bGx5KQorCQkgICAgJG9wdF92ICYmIHByaW50ICJyZXBsYXlcbiI7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ3JlcGxheScsJy1kJywkdHJlZV9kaXIsJHBzLT57aWR9KTsKKyAgICAgICAgICAgICAgICAgICAgJHN0YXRze3JlcGxheX0rKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAjIGdldHRpbmcgb25lIHRyZWUgaXMgdXN1YWxseSBmYXN0ZXIgdGhhbiBnZXR0aW5nIHR3byB0cmVlcworICAgICAgICAgICAgICAgICAgICAjIGFuZCBhcHBseWluZyB0aGUgZGVsdGEgLi4uCisgICAgICAgICAgICAgICAgICAgIHJtdHJlZSgkdHJlZV9kaXIpOworCQkgICAgJG9wdF92ICYmIHByaW50ICJhcHBseS1kZWx0YVxuIjsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICAgICAgICAgICAgICRzdGF0c3tnZXRfZGVsdGF9Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBuZXcgYnJhbmNoIHdvcmsKKyAgICAgICAgJG9wdF92ICYmIHByaW50ICJnZXQgKG5ldyB0cmVlKVxuIjsKKyAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICRzdGF0c3tnZXRfbmV3fSsrOworICAgIH0KKyAgIAorICAgICMgYWRkZWQgLUkgZmxhZyB0byByc3luYyBzaW5jZSB3ZSdyZSBnb2luZyB0byBmYXN0ISBBSUVFRUVFISEhIQorICAgIHN5c3RlbSgncnN5bmMnLCctYUknLCctLWRlbGV0ZScsJy0tZXhjbHVkZScsJGdpdF9kaXIsCisjICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJy5hcmNoLWludmVudG9yeScsCisgICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsJy0tZXhjbHVkZScsJ3thcmNofScsCisgICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJysqJywnLS1leGNsdWRlJywnLConLAorICAgICAgICAgICAgICAgICIkdHJlZV9kaXIvIiwnLi8nKSA9PSAwIG9yIGRpZSAiQ2Fubm90IHJzeW5jICR0cmVlX2RpcjogJCEgJD8iOworICAgIHJldHVybiAkdHJlZV9kaXI7Cit9CisKK3N1YiBhcHBseV9pbXBvcnQgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgIG15ICRibmFtZSA9IGdpdF9icmFuY2huYW1lKCRwcy0+e2lkfSk7CisKKyAgICBta3BhdGgoJHRtcCk7CisKKyAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdnZXQnLCctcycsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwiJHRtcC9pbXBvcnQiKTsKKyAgICBkaWUgIkNhbm5vdCBnZXQgaW1wb3J0OiAkISIgaWYgJD87ICAgIAorICAgIHN5c3RlbSgncnN5bmMnLCctYUknLCctLWRlbGV0ZScsICctLWV4Y2x1ZGUnLCRnaXRfZGlyLAorCQknLS1leGNsdWRlJywnLmFyY2gtaWRzJywnLS1leGNsdWRlJywne2FyY2h9JywKKwkJIiR0bXAvaW1wb3J0LyIsICcuLycpOworICAgIGRpZSAiQ2Fubm90IHJzeW5jIGltcG9ydDokISIgaWYgJD87CisgICAgCisgICAgcm10cmVlKCIkdG1wL2ltcG9ydCIpOworICAgIGRpZSAiQ2Fubm90IHJlbW92ZSB0ZW1wZGlyOiAkISIgaWYgJD87CisgICAgCisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGFwcGx5X2NzZXQgeworICAgIG15ICRwcyA9IHNoaWZ0OworCisgICAgbWtwYXRoKCR0bXApOworCisgICAgIyBnZXQgdGhlIGNoYW5nZXNldAorICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldC1jaGFuZ2VzZXQnLCRwcy0+e2lkfSwiJHRtcC9jaGFuZ2VzZXQiKTsKKyAgICBkaWUgIkNhbm5vdCBnZXQgY2hhbmdlc2V0OiAkISIgaWYgJD87CisgICAgCisgICAgIyBhcHBseSBwYXRjaGVzCisgICAgaWYgKGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5wYXRjaCdgKSB7CisgICAgICAgICMgdGhpcyBjYW4gYmUgc3BlZCB1cCBjb25zaWRlcmFibHkgYnkgZG9pbmcKKyAgICAgICAgIyAgICAoZmluZCB8IHhhcmdzIGNhdCkgfCBwYXRjaAorICAgICAgICAjIGJ1dCB0aGF0IGNhbiBnZXQgbXVja2VkIHVwIGJ5IHBhdGNoZXMKKyAgICAgICAgIyB3aXRoIG1pc3NpbmcgdHJhaWxpbmcgbmV3bGluZXMgb3IgdGhlIHN0YW5kYXJkIAorICAgICAgICAjICdtaXNzaW5nIG5ld2xpbmUnIGZsYWcgaW4gdGhlIHBhdGNoIC0gcG9zc2libHkKKyAgICAgICAgIyBwcm9kdWNlZCB3aXRoIGFuIG9sZC9idWdneSBkaWZmLgorICAgICAgICAjIHNsb3cgYW5kIHNhZmUsIHdlIGludm9rZSBwYXRjaCBvbmNlIHBlciBwYXRjaGZpbGUKKyAgICAgICAgYGZpbmQgJHRtcC9jaGFuZ2VzZXQvcGF0Y2hlcyAtdHlwZSBmIC1uYW1lICcqLnBhdGNoJyAtcHJpbnQwIHwgZ3JlcCAtenYgJ3thcmNofScgfCB4YXJncyAtaUZJTEUgLTAgLS1uby1ydW4taWYtZW1wdHkgcGF0Y2ggLXAxIC0tZm9yd2FyZCAtaUZJTEVgOworICAgICAgICBkaWUgIlByb2JsZW0gYXBwbHlpbmcgcGF0Y2hlcyEgJCEiIGlmICQ/OworICAgIH0KKworICAgICMgYXBwbHkgY2hhbmdlZCBiaW5hcnkgZmlsZXMKKyAgICBpZiAobXkgQG1vZGlmaWVkID0gYGZpbmQgJHRtcC9jaGFuZ2VzZXQvcGF0Y2hlcyAtdHlwZSBmIC1uYW1lICcqLm1vZGlmaWVkJ2ApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkbW9kIChAbW9kaWZpZWQpIHsKKyAgICAgICAgICAgIGNob21wICRtb2Q7CisgICAgICAgICAgICBteSAkb3JpZyA9ICRtb2Q7CisgICAgICAgICAgICAkb3JpZyA9fiBzL1wubW9kaWZpZWQkLy87ICMgbGF6eQorICAgICAgICAgICAgJG9yaWcgPX4gcyFeXFEkdG1wXEUvY2hhbmdlc2V0L3BhdGNoZXMvISE7CisgICAgICAgICAgICAjcHJpbnQgInJzeW5jIC1wICckbW9kJyAnJG9yaWcnIjsKKyAgICAgICAgICAgIHN5c3RlbSgncnN5bmMnLCctcCcsJG1vZCwiLi8kb3JpZyIpOworICAgICAgICAgICAgZGllICJQcm9ibGVtIGFwcGx5aW5nIGJpbmFyeSBjaGFuZ2VzISAkISIgaWYgJD87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIGJyaW5nIGluIG5ldyBmaWxlcworICAgIHN5c3RlbSgncnN5bmMnLCctYUknLCctLWV4Y2x1ZGUnLCRnaXRfZGlyLAorICAgIAkJJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsCisJCSctLWV4Y2x1ZGUnLCAne2FyY2h9JywKKwkJIiR0bXAvY2hhbmdlc2V0L25ldy1maWxlcy1hcmNoaXZlLyIsJy4vJyk7CisKKyAgICAjIGRlbGV0ZWQgZmlsZXMgYXJlIGhpbnRlZCBmcm9tIHRoZSBjb21taXRsb2cgcHJvY2Vzc2luZworCisgICAgcm10cmVlKCIkdG1wL2NoYW5nZXNldCIpOworfQorCisKKyMgPWZvciByZWZlcmVuY2UKKyMgbm90ZXM6ICotZmlsZXMvLWRpcmVjdG9yaWVzIGtleXMgY2Fubm90IGhhdmUgc3BhY2VzLCB0aGV5J3JlIGFsd2F5cworIyBwaWthLWVzY2FwZWQuICBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBuZXdsaW5lCisjIEEgbG9nIGVudHJ5IGxvb2tzIGxpa2U6CisjIFJldmlzaW9uOiBtb29kbGUtb3JnLS1tb29kbGUtLTEuMy4zLS1wYXRjaC0xNQorIyBBcmNoaXZlOiBhcmNoLWVkdWZvcmdlQGNhdGFseXN0Lm5ldC5uei0tMjAwNAorIyBDcmVhdG9yOiBQZW5ueSBMZWFjaCA8cGVubnlAY2F0YWx5c3QubmV0Lm56PgorIyBEYXRlOiBXZWQgTWF5IDI1IDE0OjE1OjM0IE5aU1QgMjAwNQorIyBTdGFuZGFyZC1kYXRlOiAyMDA1LTA1LTI1IDAyOjE1OjM0IEdNVAorIyBOZXctZmlsZXM6IGxhbmcvZGUvLmFyY2gtaWRzL2Jsb2NrX2dsb3NzYXJ5X3JhbmRvbS5waHAuaWQKKyMgICAgIGxhbmcvZGUvLmFyY2gtaWRzL2Jsb2NrX2h0bWwucGhwLmlkCisjIE5ldy1kaXJlY3RvcmllczogbGFuZy9kZS9oZWxwL3F1ZXN0aW9ubmFpcmUKKyMgICAgIGxhbmcvZGUvaGVscC9xdWVzdGlvbm5haXJlLy5hcmNoLWlkcworIyBSZW5hbWVkLWZpbGVzOiAuYXJjaC1pZHMvZGJfc2VhcnMuc3FsLmlkIGRiLy5hcmNoLWlkcy9kYl9zZWFycy5zcWwuaWQKKyMgICAgZGJfc2VhcnMuc3FsIGRiL2RiX3NlYXJzLnNxbAorIyBSZW1vdmVkLWZpbGVzOiBsYW5nL2JlL2RvY3MvLmFyY2gtaWRzL3JlbGVhc2UuaHRtbC5pZAorIyAgICAgbGFuZy9iZS9kb2NzLy5hcmNoLWlkcy9yZWxlYXNlb2xkLmh0bWwuaWQKKyMgTW9kaWZpZWQtZmlsZXM6IGFkbWluL2Nyb24ucGhwIGFkbWluL2RlbGV0ZS5waHAKKyMgICAgIGFkbWluL2VkaXRvci5odG1sIGJhY2t1cC9saWIucGhwIGJhY2t1cC9yZXN0b3JlLnBocAorIyBOZXctcGF0Y2hlczogYXJjaC1lZHVmb3JnZUBjYXRhbHlzdC5uZXQubnotLTIwMDQvbW9vZGxlLW9yZy0tbW9vZGxlLS0xLjMuMy0tcGF0Y2gtMTUKKyMgU3VtbWFyeTogVXBkYXRpbmcgdG8gbGF0ZXN0IGZyb20gTU9PRExFXzE0X1NUQUJMRSAoMS40LjUrKQorIyAgIHN1bW1hcnkgY2FuIGJlIG11bHRpbGluZSB3aXRoIGEgbGVhZGluZyBzcGFjZSBqdXN0IGxpa2UgdGhlIGFib3ZlIGZpZWxkcworIyBLZXl3b3JkczoKKyMKKyMgVXBkYXRpbmcgeWFkZGEgdGFkZGEgdGFkZGEgbWFkZGEKK3N1YiBwYXJzZWxvZyB7CisgICAgbXkgKCRwcywgJGxvZykgPSBAXzsKKyAgICBteSAka2V5ID0gdW5kZWY7CisKKyAgICAjIGhlYWRlcnMgd2Ugd2FudCB0aGF0IGNvbnRhaW4gZmlsZW5hbWVzOgorICAgIG15ICV3YW50X2hlYWRlcnMgPSAoCisgICAgICAgIG5ld19maWxlcyA9PiAxLAorICAgICAgICBtb2RpZmllZF9maWxlcyA9PiAxLAorICAgICAgICByZW5hbWVkX2ZpbGVzID0+IDEsCisgICAgICAgIHJlbmFtZWRfZGlyZWN0b3JpZXMgPT4gMSwKKyAgICAgICAgcmVtb3ZlZF9maWxlcyA9PiAxLAorICAgICAgICByZW1vdmVkX2RpcmVjdG9yaWVzID0+IDEsCisgICAgKTsKKyAgICAKKyAgICBjaG9tcCAoQCRsb2cpOworICAgIHdoaWxlICgkXyA9IHNoaWZ0IEAkbG9nKSB7CisgICAgICAgIGlmICgvXkNvbnRpbnVhdGlvbi1vZjpccyooLiopLykgeworICAgICAgICAgICAgJHBzLT57dGFnfSA9ICQxOworICAgICAgICAgICAgJGtleSA9IHVuZGVmOworICAgICAgICB9IGVsc2lmICgvXlN1bW1hcnk6XHMqKC4qKSQvICkgeworICAgICAgICAgICAgIyBzdW1tYXJ5IGNhbiBiZSBtdWx0aWxpbmUgYXMgbG9uZyBhcyBpdCBoYXMgYSBsZWFkaW5nIHNwYWNlLgorCSAgICAjIHdlIHNxdWVlemUgaXQgb250byBhIHNpbmdsZSBsaW5lLCB0aG91Z2guCisgICAgICAgICAgICAkcHMtPntzdW1tYXJ5fSA9IFsgJDEgXTsKKyAgICAgICAgICAgICRrZXkgPSAnc3VtbWFyeSc7CisgICAgICAgIH0gZWxzaWYgKC9eQ3JlYXRvcjogKC4qKVxzKjwoW15cPl0rKT4vKSB7CisgICAgICAgICAgICAkcHMtPnthdXRob3J9ID0gJDE7CisgICAgICAgICAgICAkcHMtPntlbWFpbH0gPSAkMjsKKyAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgIyBhbnkgKi1maWxlcyBvciAqLWRpcmVjdG9yaWVzIGNhbiBiZSByZWFkIGhlcmU6CisgICAgICAgIH0gZWxzaWYgKC9eKFtBLVpdW2EtelwtXSspOlxzKiguKikkLykgeworICAgICAgICAgICAgbXkgJHZhbCA9ICQyOworICAgICAgICAgICAgJGtleSA9IGxjICQxOworICAgICAgICAgICAgJGtleSA9fiB0ci8tL18vOyAjIHRvbyBsYXp5IHRvIHF1b3RlIDpQCisgICAgICAgICAgICBpZiAoJHdhbnRfaGVhZGVyc3ska2V5fSkgeworICAgICAgICAgICAgICAgIHB1c2ggQHskcHMtPnska2V5fX0sIHNwbGl0KC9ccysvLCAkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGtleSA9IHVuZGVmOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2lmICgvXiQvKSB7CisgICAgICAgICAgICBsYXN0OyAjIHJlbWFpbmRlciBvZiBAJGxvZyB0aGF0IGRpZG4ndCBnZXQgc2hpZnRlZCBvZmYgaXMgbWVzc2FnZQorICAgICAgICB9IGVsc2lmICgka2V5KSB7CisgICAgICAgICAgICBpZiAoL15ccysoLiopJC8pIHsKKyAgICAgICAgICAgICAgICBpZiAoJGtleSBlcSAnc3VtbWFyeScpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRwcy0+eyRrZXl9fSwgJDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgIyBmaWxlcy9kaXJlY3RvcmllczoKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRwcy0+eyRrZXl9fSwgc3BsaXQoL1xzKy8sICQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgIAorICAgICMgZHJvcCBsZWFkaW5nIGVtcHR5IGxpbmVzIGZyb20gdGhlIGxvZyBtZXNzYWdlCisgICAgd2hpbGUgKEAkbG9nICYmICRsb2ctPlswXSBlcSAnJykgeworCXNoaWZ0IEAkbG9nOworICAgIH0KKyAgICBpZiAoZXhpc3RzICRwcy0+e3N1bW1hcnl9ICYmIEB7JHBzLT57c3VtbWFyeX19KSB7CisJJHBzLT57c3VtbWFyeX0gPSBqb2luKCcgJywgQHskcHMtPntzdW1tYXJ5fX0pOworICAgIH0KKyAgICBlbHNpZiAoQCRsb2cgPT0gMCkgeworCSRwcy0+e3N1bW1hcnl9ID0gJ2VtcHR5IGNvbW1pdCBtZXNzYWdlJzsKKyAgICB9IGVsc2UgeworCSRwcy0+e3N1bW1hcnl9ID0gJGxvZy0+WzBdIC4gJy4uLic7CisgICAgfQorICAgICRwcy0+e21lc3NhZ2V9ID0gam9pbigiXG4iLEAkbG9nKTsKKyAgICAKKyAgICAjIHNraXAgQXJjaCBjb250cm9sIGZpbGVzLCB1bmVzY2FwZSBwaWthLWVzY2FwZWQgZmlsZXMKKyAgICBmb3JlYWNoIG15ICRrIChrZXlzICV3YW50X2hlYWRlcnMpIHsKKyAgICAgICAgbmV4dCB1bmxlc3MgKGRlZmluZWQgJHBzLT57JGt9KTsKKyAgICAgICAgbXkgQHRtcCA9ICgpOworICAgICAgICBmb3JlYWNoIG15ICR0IChAeyRwcy0+eyRrfX0pIHsKKyAgICAgICAgICAgbmV4dCB1bmxlc3MgbGVuZ3RoICgkdCk7CisgICAgICAgICAgIG5leHQgaWYgJHQgPX4gbSFce2FyY2hcfS8hOworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXC5hcmNoLWlkcy8hOworICAgICAgICAgICAjIHNob3VsZCB3ZSBza2lwIHRoaXM/CisgICAgICAgICAgIG5leHQgaWYgJHQgPX4gbSFcLmFyY2gtaW52ZW50b3J5JCE7CisgICAgICAgICAgICMgdGxhIGNhdC1hcmNoaXZlLWxvZyB3aWxsIGdpdmUgdXMgZmlsZW5hbWVzIHdpdGggc3BhY2VzIGFzIGZpbGVcKHNwKW5hbWUgLSB3aHk/CisgICAgICAgICAgICMgd2UgY2FuIGFzc3VtZSB0aGF0IGFueSBmaWxlbmFtZSB3aXRoIFwgaW5kaWNhdGVzIHNvbWUgcGlrYSBlc2NhcGluZyB0aGF0IHdlIHdhbnQgdG8gZ2V0IHJpZCBvZi4KKyAgICAgICAgICAgaWYgKCR0ID1+IC9cXC8gKXsKKyAgICAgICAgICAgICAgICR0ID0gKHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2VzY2FwZScsJy0tdW5lc2NhcGVkJywkdCkpWzBdOworICAgICAgICAgICB9CisgICAgICAgICAgIHB1c2ggQHRtcCwgJHQ7CisgICAgICAgIH0KKyAgICAgICAgJHBzLT57JGt9ID0gXEB0bXA7CisgICAgfQorfQorCisjIHdyaXRlL3JlYWQgYSB0YWcKK3N1YiB0YWcgeworICAgIG15ICgkdGFnLCAkY29tbWl0KSA9IEBfOworIAorICAgIGlmICgkb3B0X28pIHsKKyAgICAgICAgJHRhZyA9fiBzfC98LS18ZzsKKyAgICB9IGVsc2UgeworCW15ICRwYXRjaG5hbWUgPSAkdGFnOworCSRwYXRjaG5hbWUgPX4gcy8uKi0tLy87CisgICAgICAgICR0YWcgPSBnaXRfYnJhbmNobmFtZSAoJHRhZykgLiAnLS0nIC4gJHBhdGNobmFtZTsKKyAgICB9CisgICAgCisgICAgaWYgKCRjb21taXQpIHsKKyAgICAgICAgb3BlbihDLCI+IiwiJGdpdF9kaXIvcmVmcy90YWdzLyR0YWciKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyAkdGFnOiAkIVxuIjsKKyAgICAgICAgcHJpbnQgQyAiJGNvbW1pdFxuIgorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgd3JpdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBjbG9zZShDKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgd3JpdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCAiICogQ3JlYXRlZCB0YWcgJyR0YWcnIG9uICckY29tbWl0J1xuIiBpZiAkb3B0X3Y7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICMgcmVhZAorICAgICAgICBvcGVuKEMsIjwiLCIkZ2l0X2Rpci9yZWZzL3RhZ3MvJHRhZyIpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCByZWFkIHRhZyAkdGFnOiAkIVxuIjsKKyAgICAgICAgJGNvbW1pdCA9IDxDPjsKKyAgICAgICAgY2hvbXAgJGNvbW1pdDsKKyAgICAgICAgZGllICJFcnJvciByZWFkaW5nIHRhZyAkdGFnOiAkIVxuIiB1bmxlc3MgbGVuZ3RoICRjb21taXQgPT0gNDA7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCByZWFkIHRhZyAkdGFnOiAkIVxuIjsKKyAgICAgICAgcmV0dXJuICRjb21taXQ7CisgICAgfQorfQorCisjIHdyaXRlL3JlYWQgYSBwcml2YXRlIHRhZworIyByZWFkcyBmYWlsIHNvZnRseSBpZiB0aGUgdGFnIGlzbid0IHRoZXJlCitzdWIgcHRhZyB7CisgICAgbXkgKCR0YWcsICRjb21taXQpID0gQF87CisKKyAgICAjIGRvbid0IHVzZSBzdWJkaXJzIGZvciB0YWdzIHlldCwgaXQgY291bGQgc2NyZXcgdXAgb3RoZXIgcG9yY2VsYWlucworICAgICR0YWcgPX4gc3wvfCx8ZzsgCisgICAgCisgICAgbXkgJHRhZ19maWxlID0gIiRwdGFnX2Rpci8kdGFnIjsKKyAgICBteSAkdGFnX2JyYW5jaF9kaXIgPSBkaXJuYW1lKCR0YWdfZmlsZSk7CisgICAgbWtwYXRoKCR0YWdfYnJhbmNoX2RpcikgdW5sZXNzICgtZCAkdGFnX2JyYW5jaF9kaXIpOworCisgICAgaWYgKCRjb21taXQpIHsgICAgICAgICAgICAgICMgd3JpdGUKKyAgICAgICAgb3BlbihDLCI+IiwkdGFnX2ZpbGUpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCBDICIkY29tbWl0XG4iCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisJJHJwdGFnc3skY29tbWl0fSA9ICR0YWcgCisJICAgIHVubGVzcyAkdGFnID1+IG0vLS1iYXNlLTAkLzsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIyByZWFkCisgICAgICAgICMgaWYgdGhlIHRhZyBpc24ndCB0aGVyZSwgcmV0dXJuIDAKKyAgICAgICAgdW5sZXNzICggLXMgJHRhZ19maWxlKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBvcGVuKEMsIjwiLCR0YWdfZmlsZSkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICAkY29tbWl0ID0gPEM+OworICAgICAgICBjaG9tcCAkY29tbWl0OworICAgICAgICBkaWUgIkVycm9yIHJlYWRpbmcgdGFnICR0YWc6ICQhXG4iIHVubGVzcyBsZW5ndGggJGNvbW1pdCA9PSA0MDsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworCXVubGVzcyAoZGVmaW5lZCAkcnB0YWdzeyRjb21taXR9KSB7CisJICAgICRycHRhZ3N7JGNvbW1pdH0gPSAkdGFnOworCX0KKyAgICAgICAgcmV0dXJuICRjb21taXQ7CisgICAgfQorfQorCitzdWIgZmluZF9wYXJlbnRzIHsKKyAgICAjCisgICAgIyBJZGVudGlmeSB3aGF0IGJyYW5jaGVzIGFyZSBtZXJnaW5nIGludG8gbWUKKyAgICAjIGFuZCB3aGV0aGVyIHdlIGFyZSBmdWxseSBtZXJnZWQKKyAgICAjIGdpdC1tZXJnZS1iYXNlIDxoZWFkc2hhPiA8aGVhZHNoYT4gc2hvdWxkIHRlbGwKKyAgICAjIG1lIHdoYXQgdGhlIGJhc2Ugb2YgdGhlIG1lcmdlIHNob3VsZCBiZSAKKyAgICAjCisgICAgbXkgJHBzID0gc2hpZnQ7CisKKyAgICBteSAlYnJhbmNoZXM7ICMgaG9sZHMgYW4gYXJyYXlyZWYgcGVyIGJyYW5jaAorICAgICAgICAgICAgICAgICAgIyB0aGUgYXJyYXlyZWYgY29udGFpbnMgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAjIG1lcmdlZCBwYXRjaGVzIGJldHdlZW4gdGhlIGJhc2UKKyAgICAgICAgICAgICAgICAgICMgb2YgdGhlIG1lcmdlIGFuZCB0aGUgY3VycmVudCBoZWFkCisKKyAgICBteSBAcGFyZW50czsgICMgcGFyZW50cyBmb3VuZCBmb3IgdGhpcyBjb21taXQKKworICAgICMgc2ltcGxlIGxvb3AgdG8gc3BsaXQgdGhlIG1lcmdlcworICAgICMgcGVyIGJyYW5jaAorICAgIGZvcmVhY2ggbXkgJG1lcmdlIChAeyRwcy0+e21lcmdlc319KSB7CisJbXkgJGJyYW5jaCA9IGdpdF9icmFuY2huYW1lKCRtZXJnZSk7CisJdW5sZXNzIChkZWZpbmVkICRicmFuY2hlc3skYnJhbmNofSApeworCSAgICAkYnJhbmNoZXN7JGJyYW5jaH0gPSBbXTsKKwl9CisJcHVzaCBAeyRicmFuY2hlc3skYnJhbmNofX0sICRtZXJnZTsKKyAgICB9CisKKyAgICAjCisgICAgIyBmb3JlYWNoIGJyYW5jaCBmaW5kIGEgbWVyZ2UgYmFzZSBhbmQgd2FsayBpdCB0byB0aGUgCisgICAgIyBoZWFkIHdoZXJlIHdlIGFyZSwgY29sbGVjdGluZyB0aGUgbWVyZ2VkIHBhdGNoc2V0cyB0aGF0CisgICAgIyBBcmNoIGhhcyByZWNvcmRlZC4gS2VlcCB0aGF0IGluIEBoYXZlCisgICAgIyBDb21wYXJlIHRoYXQgd2l0aCB0aGUgY29tbWl0cyBvbiB0aGUgb3RoZXIgYnJhbmNoCisgICAgIyBiZXR3ZWVuIG1lcmdlLWJhc2UgYW5kIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCAoQG5lZWQpCisgICAgIyBhbmQgc2VlIGlmIHdlIGhhdmUgYSBzZXJpZXMgb2YgY29uc2VjdXRpdmUgcGF0Y2hlcworICAgICMgc3RhcnRpbmcgZnJvbSB0aGUgbWVyZ2UgYmFzZS4gVGhlIHRpcCBvZiB0aGUgc2VyaWVzCisgICAgIyBvZiBjb25zZWN1dGl2ZSBwYXRjaGVzIG1lcmdlZCBpcyBvdXIgbmV3IHBhcmVudCBmb3IgCisgICAgIyB0aGF0IGJyYW5jaC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkYnJhbmNoIChrZXlzICVicmFuY2hlcykgeworCisJIyBjaGVjayB0aGF0IHdlIGFjdHVhbGx5IGtub3cgYWJvdXQgdGhlIGJyYW5jaAorCW5leHQgdW5sZXNzIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRicmFuY2giOworCisJbXkgJG1lcmdlYmFzZSA9IGBnaXQtbWVyZ2UtYmFzZSAkYnJhbmNoICRwcy0+e2JyYW5jaH1gOworIAlpZiAoJD8pIHsgCisgCSAgICAjIERvbid0IGRpZSBoZXJlLCBBcmNoIHN1cHBvcnRzIG9uZS13YXkgY2hlcnJ5LXBpY2tpbmcKKyAJICAgICMgYmV0d2VlbiBicmFuY2hlcyB3aXRoIG5vIGNvbW1vbiBiYXNlIChvciBhbnkgcmVsYXRpb25zaGlwCisgCSAgICAjIGF0IGFsbCBiZWZvcmVoYW5kKQorIAkgICAgd2FybiAiQ2Fubm90IGZpbmQgbWVyZ2UgYmFzZSBmb3IgJGJyYW5jaCBhbmQgJHBzLT57YnJhbmNofSI7CisgCSAgICBuZXh0OworIAl9CisJY2hvbXAgJG1lcmdlYmFzZTsKKworCSMgbm93IHdhbGsgdXAgdG8gdGhlIG1lcmdlcG9pbnQgY29sbGVjdGluZyB3aGF0IHBhdGNoZXMgd2UgaGF2ZQorCW15ICRicmFuY2h0aXAgPSBnaXRfcmV2X3BhcnNlKCRwcy0+e2JyYW5jaH0pOworCW15IEBhbmNlc3RvcnMgPSBgZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAkYnJhbmNodGlwIF4kbWVyZ2ViYXNlYDsKKwlteSAlaGF2ZTsgIyBjb2xsZWN0ZWQgbWVyZ2VzIHRoaXMgYnJhbmNoIGhhcworCWZvcmVhY2ggbXkgJG1lcmdlIChAeyRwcy0+e21lcmdlc319KSB7CisJICAgICRoYXZleyRtZXJnZX0gPSAxOworCX0KKwlteSAlYW5jZXN0b3JzaGF2ZTsKKwlmb3JlYWNoIG15ICRwYXIgKEBhbmNlc3RvcnMpIHsKKwkgICAgJHBhciA9IGNvbW1pdGlkMnBzZXQoJHBhcik7CisJICAgIGlmIChkZWZpbmVkICRwYXItPnttZXJnZXN9KSB7CisJCWZvcmVhY2ggbXkgJG1lcmdlIChAeyRwYXItPnttZXJnZXN9fSkgeworCQkgICAgJGFuY2VzdG9yc2hhdmV7JG1lcmdlfT0xOworCQl9CisJICAgIH0KKwl9CisJIyBwcmludCAiKysrKyBNZXJnZXMgaW4gJHBzLT57aWR9IGFyZS4uLi5cbiI7CisJIyBteSBAaGF2ZSA9IHNvcnQga2V5cyAlaGF2ZTsJcHJpbnQgRHVtcGVyKFxAaGF2ZSk7CisKKwkjIG1lcmdlIHdoYXQgd2UgaGF2ZSB3aXRoIHdoYXQgYW5jZXN0b3JzIGhhdmUKKwklaGF2ZSA9ICglaGF2ZSwgJWFuY2VzdG9yc2hhdmUpOworCisJIyBzZWUgd2hhdCB0aGUgcmVtb3RlIGJyYW5jaCBoYXMgLSB0aGVzZSBhcmUgdGhlIG1lcmdlcyB3ZSAKKwkjIHdpbGwgd2FudCB0byBoYXZlIGluIGEgY29uc2VjdXRpdmUgc2VyaWVzIGZyb20gdGhlIG1lcmdlYmFzZQorCW15ICRvdGhlcmJyYW5jaHRpcCA9IGdpdF9yZXZfcGFyc2UoJGJyYW5jaCk7CisJbXkgQG5lZWRyYXcgPSBgZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAkb3RoZXJicmFuY2h0aXAgXiRtZXJnZWJhc2VgOworCW15IEBuZWVkOworCWZvcmVhY2ggbXkgJG5lZWRwcyAoQG5lZWRyYXcpIHsgCSMgZ2V0IHRoZSBwc2V0cworCSAgICAkbmVlZHBzID0gY29tbWl0aWQycHNldCgkbmVlZHBzKTsKKwkgICAgIyBnaXQtcmV2LWxpc3Qgd2lsbCBhbHNvCisJICAgICMgbGlzdCBjb21taXRzIG1lcmdlZCBpbiB2aWEgZWFybGllciAKKwkgICAgIyBtZXJnZXMuIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29tbWl0cworCSAgICAjIGZyb20gdGhlIGJyYW5jaCB3ZSdyZSBsb29raW5nIGF0CisJICAgIGlmICgkYnJhbmNoIGVxICRuZWVkcHMtPnticmFuY2h9KSB7CisJCXB1c2ggQG5lZWQsICRuZWVkcHMtPntpZH07CisJICAgIH0KKwl9CisKKwkjIHByaW50ICIrKysrIE1lcmdlcyBmcm9tICRicmFuY2ggd2Ugd2FudCBhcmUuLi4uXG4iOworCSMgcHJpbnQgRHVtcGVyKFxAbmVlZCk7CisKKwlteSAkbmV3cGFyZW50OworCXdoaWxlIChteSAkbmVlZGVkX2NvbW1pdCA9IHBvcCBAbmVlZCkgeworCSAgICBpZiAoJGhhdmV7JG5lZWRlZF9jb21taXR9KSB7CisJCSRuZXdwYXJlbnQgPSAkbmVlZGVkX2NvbW1pdDsKKwkgICAgfSBlbHNlIHsKKwkJbGFzdDsgIyBicmVhayBvdXQgb2YgdGhlIHdoaWxlCisJICAgIH0KKwl9CisJaWYgKCRuZXdwYXJlbnQpIHsKKwkgICAgcHVzaCBAcGFyZW50cywgJG5ld3BhcmVudDsKKwl9CisKKworICAgIH0gIyBlbmQgZm9yZWFjaCBicmFuY2gKKworICAgICMgcHJ1bmUgcmVkdW5kYW50IHBhcmVudHMKKyAgICBteSAlcGFyZW50czsKKyAgICBmb3JlYWNoIG15ICRwIChAcGFyZW50cykgeworCSRwYXJlbnRzeyRwfSA9IDE7CisgICAgfQorICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJlbnRzKSB7CisJbmV4dCB1bmxlc3MgZXhpc3RzICRwc2V0c3skcH17bWVyZ2VzfTsKKwluZXh0IHVubGVzcyByZWYgICAgJHBzZXRzeyRwfXttZXJnZXN9OworCW15IEBtZXJnZXMgPSBAeyRwc2V0c3skcH17bWVyZ2VzfX07CisJZm9yZWFjaCBteSAkbWVyZ2UgKEBtZXJnZXMpIHsKKwkgICAgaWYgKCRwYXJlbnRzeyRtZXJnZX0pIHsgCisJCWRlbGV0ZSAkcGFyZW50c3skbWVyZ2V9OworCSAgICB9CisJfQorICAgIH0KKworICAgIEBwYXJlbnRzID0gKCk7CisgICAgZm9yZWFjaCAoa2V5cyAlcGFyZW50cykgeworICAgICAgICBwdXNoIEBwYXJlbnRzLCAnLXAnLCBwdGFnKCRfKTsKKyAgICB9CisgICAgcmV0dXJuIEBwYXJlbnRzOworfQorCitzdWIgZ2l0X3Jldl9wYXJzZSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkdmFsICA9IGBnaXQtcmV2LXBhcnNlICRuYW1lYDsKKyAgICBkaWUgIkVycm9yOiBnaXQtcmV2LXBhcnNlICRuYW1lIiBpZiAkPzsKKyAgICBjaG9tcCAkdmFsOworICAgIHJldHVybiAkdmFsOworfQorCisjIHJlc29sdmUgYSBTSEExIHRvIGEga25vd24gcGF0Y2hzZXQKK3N1YiBjb21taXRpZDJwc2V0IHsKKyAgICBteSAkY29tbWl0aWQgPSBzaGlmdDsKKyAgICBjaG9tcCAkY29tbWl0aWQ7CisgICAgbXkgJG5hbWUgPSAkcnB0YWdzeyRjb21taXRpZH0gCisJfHwgZGllICJDYW5ub3QgZmluZCByZXZlcnNlIHRhZyBtYXBwaW5nIGZvciAkY29tbWl0aWQiOworICAgICRuYW1lID1+IHN8LHwvfDsKKyAgICBteSAkcHMgICA9ICRwc2V0c3skbmFtZX0gCisJfHwgKHByaW50IER1bXBlcihzb3J0IGtleXMgJXBzZXRzKSkgJiYgZGllICJDYW5ub3QgZmluZCBwYXRjaHNldCBmb3IgJG5hbWUiOworICAgIHJldHVybiAkcHM7Cit9CisKKworIyBhbiBhbHRlcm5hdGl2ZSB0byBgY29tbWFuZGAgdGhhdCBhbGxvd3MgaW5wdXQgdG8gYmUgcGFzc2VkIGFzIGFuIGFycmF5CisjIHRvIHdvcmsgYXJvdW5kIHNoZWxsIHByb2JsZW1zIHdpdGggd2VpcmQgY2hhcmFjdGVycyBpbiBhcmd1bWVudHMKK3N1YiBzYWZlX3BpcGVfY2FwdHVyZSB7CisgICAgbXkgQG91dHB1dDsKKyAgICBpZiAobXkgJHBpZCA9IG9wZW4gbXkgJGNoaWxkLCAnLXwnKSB7CisgICAgICAgIEBvdXRwdXQgPSAoPCRjaGlsZD4pOworICAgICAgICBjbG9zZSAkY2hpbGQgb3IgZGllIGpvaW4oJyAnLEBfKS4iOiAkISAkPyI7CisgICAgfSBlbHNlIHsKKwlleGVjKEBfKSBvciBkaWUgIiQhICQ/IjsgIyBleGVjKCkgY2FuIGZhaWwgdGhlIGV4ZWN1dGFibGUgY2FuJ3QgYmUgZm91bmQKKyAgICB9CisgICAgcmV0dXJuIHdhbnRhcnJheSA/IEBvdXRwdXQgOiBqb2luKCcnLEBvdXRwdXQpOworfQorCisjIGB0bGEgbG9ncyAtcmYgLWQgPGRpcj4gfCBoZWFkIC1uMWAgb3IgYGJheiB0cmVlLWlkIDxkaXI+YAorc3ViIGFyY2hfdHJlZV9pZCB7CisgICAgbXkgJGRpciA9IHNoaWZ0OworICAgIGNob21wKCBteSAkcmV0ID0gKHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2xvZ3MnLCctcmYnLCctZCcsJGRpcikpWzBdICk7CisgICAgcmV0dXJuICRyZXQ7Cit9CisKK3N1YiBhcmNoaXZlX3JlYWNoYWJsZSB7CisgICAgbXkgJGFyY2hpdmUgPSBzaGlmdDsKKyAgICByZXR1cm4gMSBpZiAkcmVhY2hhYmxleyRhcmNoaXZlfTsKKyAgICByZXR1cm4gMCBpZiAkdW5yZWFjaGFibGV7JGFyY2hpdmV9OworICAgIAorICAgIGlmIChzeXN0ZW0gIiRUTEEgd2hlcmVpcy1hcmNoaXZlICRhcmNoaXZlID4vZGV2L251bGwiKSB7CisgICAgICAgIGlmICgkb3B0X2EgJiYgKHN5c3RlbSgkVExBLCdyZWdpc3Rlci1hcmNoaXZlJywKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL21pcnJvcnMuc291cmNlY29udHJvbC5uZXQvJGFyY2hpdmUiKSA9PSAwKSkgeworICAgICAgICAgICAgJHJlYWNoYWJsZXskYXJjaGl2ZX0gPSAxOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgU1RERVJSICJBcmNoaXZlIGlzIHVucmVhY2hhYmxlOiAkYXJjaGl2ZVxuIjsKKyAgICAgICAgJHVucmVhY2hhYmxleyRhcmNoaXZlfSA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgICRyZWFjaGFibGV7JGFyY2hpdmV9ID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9naXQtYmlzZWN0LnNoIGIvZ2l0LWJpc2VjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xY2Q0NTYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWJpc2VjdC5zaApAQCAtMCwwICsxLDM4MiBAQAorIyEvYmluL3NoCisKK1VTQUdFPSdbc3RhcnR8YmFkfGdvb2R8bmV4dHxyZXNldHx2aXN1YWxpemV8cmVwbGF5fGxvZ3xydW5dJworTE9OR19VU0FHRT0nZ2l0IGJpc2VjdCBzdGFydCBbPGJhZD4gWzxnb29kPi4uLl1dIFstLV0gWzxwYXRoc3BlYz4uLi5dCisgICAgICAgIHJlc2V0IGJpc2VjdCBzdGF0ZSBhbmQgc3RhcnQgYmlzZWN0aW9uLgorZ2l0IGJpc2VjdCBiYWQgWzxyZXY+XQorICAgICAgICBtYXJrIDxyZXY+IGEga25vd24tYmFkIHJldmlzaW9uLgorZ2l0IGJpc2VjdCBnb29kIFs8cmV2Pi4uLl0KKyAgICAgICAgbWFyayA8cmV2Pi4uLiBrbm93bi1nb29kIHJldmlzaW9ucy4KK2dpdCBiaXNlY3QgbmV4dAorICAgICAgICBmaW5kIG5leHQgYmlzZWN0aW9uIHRvIHRlc3QgYW5kIGNoZWNrIGl0IG91dC4KK2dpdCBiaXNlY3QgcmVzZXQgWzxicmFuY2g+XQorICAgICAgICBmaW5pc2ggYmlzZWN0aW9uIHNlYXJjaCBhbmQgZ28gYmFjayB0byBicmFuY2guCitnaXQgYmlzZWN0IHZpc3VhbGl6ZQorICAgICAgICBzaG93IGJpc2VjdCBzdGF0dXMgaW4gZ2l0ay4KK2dpdCBiaXNlY3QgcmVwbGF5IDxsb2dmaWxlPgorICAgICAgICByZXBsYXkgYmlzZWN0aW9uIGxvZy4KK2dpdCBiaXNlY3QgbG9nCisgICAgICAgIHNob3cgYmlzZWN0IGxvZy4KK2dpdCBiaXNlY3QgcnVuIDxjbWQ+Li4uCisgICAgICAgIHVzZSA8Y21kPi4uLiB0byBhdXRvbWF0aWNhbGx5IGJpc2VjdC4nCisKKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorCitzcSgpIHsKKwlAQFBFUkxAQCAtZSAnCisJCWZvciAoQEFSR1YpIHsKKwkJCXMvJ1wnJy8nXCdcXFxcXCdcJycvZzsKKwkJCXByaW50ICIgJ1wnJyRfJ1wnJyI7CisJCX0KKwkJcHJpbnQgIlxuIjsKKwknICIkQCIKK30KKworYmlzZWN0X2F1dG9zdGFydCgpIHsKKwl0ZXN0IC1kICIkR0lUX0RJUi9yZWZzL2Jpc2VjdCIgfHwgeworCQllY2hvID4mMiAnWW91IG5lZWQgdG8gc3RhcnQgYnkgImdpdCBiaXNlY3Qgc3RhcnQiJworCQlpZiB0ZXN0IC10IDAKKwkJdGhlbgorCQkJZWNobyA+JjIgLW4gJ0RvIHlvdSB3YW50IG1lIHRvIGRvIGl0IGZvciB5b3UgW1kvbl0/ICcKKwkJCXJlYWQgeWVzbm8KKwkJCWNhc2UgIiR5ZXNubyIgaW4KKwkJCVtObl0qKQorCQkJCWV4aXQgOzsKKwkJCWVzYWMKKwkJCWJpc2VjdF9zdGFydAorCQllbHNlCisJCQlleGl0IDEKKwkJZmkKKwl9Cit9CisKK2Jpc2VjdF9zdGFydCgpIHsKKwkjCisJIyBWZXJpZnkgSEVBRC4gSWYgd2Ugd2VyZSBiaXNlY3RpbmcgYmVmb3JlIHRoaXMsIHJlc2V0IHRvIHRoZQorCSMgdG9wLW9mLWxpbmUgbWFzdGVyIGZpcnN0IQorCSMKKwloZWFkPSQoR0lUX0RJUj0iJEdJVF9ESVIiIGdpdC1zeW1ib2xpYy1yZWYgSEVBRCkgfHwKKwlkaWUgIkJhZCBIRUFEIC0gSSBuZWVkIGEgc3ltYm9saWMgcmVmIgorCWNhc2UgIiRoZWFkIiBpbgorCXJlZnMvaGVhZHMvYmlzZWN0KQorCQlpZiBbIC1zICIkR0lUX0RJUi9oZWFkLW5hbWUiIF07IHRoZW4KKwkJICAgIGJyYW5jaD1gY2F0ICIkR0lUX0RJUi9oZWFkLW5hbWUiYAorCQllbHNlCisJCSAgICBicmFuY2g9bWFzdGVyCisJICAgICAgICBmaQorCQlnaXQgY2hlY2tvdXQgJGJyYW5jaCB8fCBleGl0CisJCTs7CisJcmVmcy9oZWFkcy8qKQorCQlbIC1zICIkR0lUX0RJUi9oZWFkLW5hbWUiIF0gJiYgZGllICJ3b24ndCBiaXNlY3Qgb24gc2Vla2VkIHRyZWUiCisJCWVjaG8gIiRoZWFkIiB8IHNlZCAncyNecmVmcy9oZWFkcy8jIycgPiIkR0lUX0RJUi9oZWFkLW5hbWUiCisJCTs7CisJKikKKwkJZGllICJCYWQgSEVBRCAtIHN0cmFuZ2Ugc3ltYm9saWMgcmVmIgorCQk7OworCWVzYWMKKworCSMKKwkjIEdldCByaWQgb2YgYW55IG9sZCBiaXNlY3Qgc3RhdGUKKwkjCisJYmlzZWN0X2NsZWFuX3N0YXRlCisJbWtkaXIgIiRHSVRfRElSL3JlZnMvYmlzZWN0IgorCisJIworCSMgQ2hlY2sgZm9yIG9uZSBiYWQgYW5kIHRoZW4gc29tZSBnb29kIHJldmlzaW9ucy4KKwkjCisJaGFzX2RvdWJsZV9kYXNoPTAKKwlmb3IgYXJnOyBkbworCSAgICBjYXNlICIkYXJnIiBpbiAtLSkgaGFzX2RvdWJsZV9kYXNoPTE7IGJyZWFrIDs7IGVzYWMKKwlkb25lCisJb3JpZ19hcmdzPSQoc3EgIiRAIikKKwliYWRfc2Vlbj0wCisJd2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworCSAgICBhcmc9IiQxIgorCSAgICBjYXNlICIkYXJnIiBpbgorCSAgICAtLSkKKwkgICAgICAgIHNoaWZ0CisJCWJyZWFrCisJCTs7CisJICAgICopCisJICAgICAgICByZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkYXJnXntjb21taXR9IiAyPi9kZXYvbnVsbCkgfHwgeworCQkgICAgdGVzdCAkaGFzX2RvdWJsZV9kYXNoIC1lcSAxICYmCisJCSAgICAgICAgZGllICInJGFyZycgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgcmV2aXNpb24iCisJCSAgICBicmVhaworCQl9CisJCWlmIFsgJGJhZF9zZWVuIC1lcSAwIF07IHRoZW4KKwkJICAgIGJhZF9zZWVuPTEKKwkJICAgIGJpc2VjdF93cml0ZV9iYWQgIiRyZXYiCisJCWVsc2UKKwkJICAgIGJpc2VjdF93cml0ZV9nb29kICIkcmV2IgorCQlmaQorCSAgICAgICAgc2hpZnQKKwkJOzsKKwkgICAgZXNhYworICAgICAgICBkb25lCisKKwlzcSAiJEAiID4iJEdJVF9ESVIvQklTRUNUX05BTUVTIgorCWVjaG8gImdpdC1iaXNlY3Qgc3RhcnQkb3JpZ19hcmdzIiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCWJpc2VjdF9hdXRvX25leHQKK30KKworYmlzZWN0X2JhZCgpIHsKKwliaXNlY3RfYXV0b3N0YXJ0CisJY2FzZSAiJCMiIGluCisJMCkKKwkJcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSA7OworCTEpCisJCXJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxXntjb21taXR9IikgOzsKKwkqKQorCQl1c2FnZSA7OworCWVzYWMgfHwgZXhpdAorCWJpc2VjdF93cml0ZV9iYWQgIiRyZXYiCisJZWNobyAiZ2l0LWJpc2VjdCBiYWQgJHJldiIgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwliaXNlY3RfYXV0b19uZXh0Cit9CisKK2Jpc2VjdF93cml0ZV9iYWQoKSB7CisJcmV2PSIkMSIKKwllY2hvICIkcmV2IiA+IiRHSVRfRElSL3JlZnMvYmlzZWN0L2JhZCIKKwllY2hvICIjIGJhZDogIiQoZ2l0LXNob3ctYnJhbmNoICRyZXYpID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCit9CisKK2Jpc2VjdF9nb29kKCkgeworCWJpc2VjdF9hdXRvc3RhcnQKKyAgICAgICAgY2FzZSAiJCMiIGluCisJMCkgICAgcmV2cz0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgfHwgZXhpdCA7OworCSopICAgIHJldnM9JChnaXQtcmV2LXBhcnNlIC0tcmV2cy1vbmx5IC0tbm8tZmxhZ3MgIiRAIikgJiYKKwkJdGVzdCAnJyAhPSAiJHJldnMiIHx8IGRpZSAiQmFkIHJldiBpbnB1dDogJEAiIDs7CisJZXNhYworCWZvciByZXYgaW4gJHJldnMKKwlkbworCQlyZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmV2Xntjb21taXR9IikgfHwgZXhpdAorCQliaXNlY3Rfd3JpdGVfZ29vZCAiJHJldiIKKwkJZWNobyAiZ2l0LWJpc2VjdCBnb29kICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisKKwlkb25lCisJYmlzZWN0X2F1dG9fbmV4dAorfQorCitiaXNlY3Rfd3JpdGVfZ29vZCgpIHsKKwlyZXY9IiQxIgorCWVjaG8gIiRyZXYiID4iJEdJVF9ESVIvcmVmcy9iaXNlY3QvZ29vZC0kcmV2IgorCWVjaG8gIiMgZ29vZDogIiQoZ2l0LXNob3ctYnJhbmNoICRyZXYpID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCit9CisKK2Jpc2VjdF9uZXh0X2NoZWNrKCkgeworCW1pc3NpbmdfZ29vZD0gbWlzc2luZ19iYWQ9CisJZ2l0IHNob3ctcmVmIC1xIC0tdmVyaWZ5IHJlZnMvYmlzZWN0L2JhZCB8fCBtaXNzaW5nX2JhZD10CisJdGVzdCAtbiAiJChnaXQgZm9yLWVhY2gtcmVmICJyZWZzL2Jpc2VjdC9nb29kLSoiKSIgfHwgbWlzc2luZ19nb29kPXQKKworCWNhc2UgIiRtaXNzaW5nX2dvb2QsJG1pc3NpbmdfYmFkLCQxIiBpbgorCSwsKikKKwkJOiBoYXZlIGJvdGggZ29vZCBhbmQgYmFkIC0gb2sKKwkJOzsKKwkqLCkKKwkJIyBkbyBub3QgaGF2ZSBib3RoIGJ1dCBub3QgYXNrZWQgdG8gZmFpbCAtIGp1c3QgcmVwb3J0LgorCQlmYWxzZQorCQk7OworCXQsLGdvb2QpCisJCSMgaGF2ZSBiYWQgYnV0IG5vdCBnb29kLiAgd2UgY291bGQgYmlzZWN0IGFsdGhvdWdoCisJCSMgdGhpcyBpcyBsZXNzIG9wdGltdW0uCisJCWVjaG8gPiYyICdXYXJuaW5nOiBiaXNlY3Rpbmcgb25seSB3aXRoIGEgYmFkIGNvbW1pdC4nCisJCWlmIHRlc3QgLXQgMAorCQl0aGVuCisJCQlwcmludGYgPiYyICdBcmUgeW91IHN1cmUgW1kvbl0/ICcKKwkJCWNhc2UgIiQocmVhZCB5ZXNubykiIGluIFtObl0qKSBleGl0IDEgOzsgZXNhYworCQlmaQorCQk6IGJpc2VjdCB3aXRob3V0IGdvb2QuLi4KKwkJOzsKKwkqKQorCQlUSEVOPScnCisJCXRlc3QgLWQgIiRHSVRfRElSL3JlZnMvYmlzZWN0IiB8fCB7CisJCQllY2hvID4mMiAnWW91IG5lZWQgdG8gc3RhcnQgYnkgImdpdCBiaXNlY3Qgc3RhcnQiLicKKwkJCVRIRU49J3RoZW4gJworCQl9CisJCWVjaG8gPiYyICdZb3UgJyRUSEVOJ25lZWQgdG8gZ2l2ZSBtZSBhdCBsZWFzdCBvbmUgZ29vZCcgXAorCQkJJ2FuZCBvbmUgYmFkIHJldmlzaW9ucy4nCisJCWVjaG8gPiYyICcoWW91IGNhbiB1c2UgImdpdCBiaXNlY3QgYmFkIiBhbmQnIFwKKwkJCSciZ2l0IGJpc2VjdCBnb29kIiBmb3IgdGhhdC4pJworCQlleGl0IDEgOzsKKwllc2FjCit9CisKK2Jpc2VjdF9hdXRvX25leHQoKSB7CisJYmlzZWN0X25leHRfY2hlY2sgJiYgYmlzZWN0X25leHQgfHwgOgorfQorCitiaXNlY3RfbmV4dCgpIHsKKyAgICAgICAgY2FzZSAiJCMiIGluIDApIDs7ICopIHVzYWdlIDs7IGVzYWMKKwliaXNlY3RfYXV0b3N0YXJ0CisJYmlzZWN0X25leHRfY2hlY2sgZ29vZAorCisJYmFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL2Jpc2VjdC9iYWQpICYmCisJZ29vZD0kKGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9J14lKG9iamVjdG5hbWUpJyBcCisJCSJyZWZzL2Jpc2VjdC9nb29kLSoiIHwgdHIgJ1tcMDEyXScgJyAnKSAmJgorCWV2YWw9ImdpdC1yZXYtbGlzdCAtLWJpc2VjdC12YXJzICRnb29kICRiYWQgLS0iICYmCisJZXZhbD0iJGV2YWwgJChjYXQgIiRHSVRfRElSL0JJU0VDVF9OQU1FUyIpIiAmJgorCWV2YWw9JChldmFsICIkZXZhbCIpICYmCisJZXZhbCAiJGV2YWwiIHx8IGV4aXQKKworCWlmIFsgLXogIiRiaXNlY3RfcmV2IiBdOyB0aGVuCisJCWVjaG8gIiRiYWQgd2FzIGJvdGggZ29vZCBhbmQgYmFkIgorCQlleGl0IDEKKwlmaQorCWlmIFsgIiRiaXNlY3RfcmV2IiA9ICIkYmFkIiBdOyB0aGVuCisJCWVjaG8gIiRiaXNlY3RfcmV2IGlzIGZpcnN0IGJhZCBjb21taXQiCisJCWdpdC1kaWZmLXRyZWUgLS1wcmV0dHkgJGJpc2VjdF9yZXYKKwkJZXhpdCAwCisJZmkKKworCWVjaG8gIkJpc2VjdGluZzogJGJpc2VjdF9uciByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMiCisJZWNobyAiJGJpc2VjdF9yZXYiID4iJEdJVF9ESVIvcmVmcy9oZWFkcy9uZXctYmlzZWN0IgorCWdpdCBjaGVja291dCAtcSBuZXctYmlzZWN0IHx8IGV4aXQKKwltdiAiJEdJVF9ESVIvcmVmcy9oZWFkcy9uZXctYmlzZWN0IiAiJEdJVF9ESVIvcmVmcy9oZWFkcy9iaXNlY3QiICYmCisJR0lUX0RJUj0iJEdJVF9ESVIiIGdpdC1zeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL2Jpc2VjdAorCWdpdC1zaG93LWJyYW5jaCAiJGJpc2VjdF9yZXYiCit9CisKK2Jpc2VjdF92aXN1YWxpemUoKSB7CisJYmlzZWN0X25leHRfY2hlY2sgZmFpbAorCW5vdD1gY2QgIiRHSVRfRElSL3JlZnMiICYmIGVjaG8gYmlzZWN0L2dvb2QtKmAKKwlldmFsIGdpdGsgYmlzZWN0L2JhZCAtLW5vdCAkbm90IC0tICQoY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTkFNRVMiKQorfQorCitiaXNlY3RfcmVzZXQoKSB7CisJY2FzZSAiJCMiIGluCisJMCkgaWYgWyAtcyAiJEdJVF9ESVIvaGVhZC1uYW1lIiBdOyB0aGVuCisJICAgICAgIGJyYW5jaD1gY2F0ICIkR0lUX0RJUi9oZWFkLW5hbWUiYAorCSAgIGVsc2UKKwkgICAgICAgYnJhbmNoPW1hc3RlcgorCSAgIGZpIDs7CisJMSkgZ2l0LXNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgLS0gInJlZnMvaGVhZHMvJDEiIHx8IHsKKwkgICAgICAgZWNobyA+JjIgIiQxIGRvZXMgbm90IHNlZW0gdG8gYmUgYSB2YWxpZCBicmFuY2giCisJICAgICAgIGV4aXQgMQorCSAgIH0KKwkgICBicmFuY2g9IiQxIiA7OworICAgICAgICAqKQorCSAgICB1c2FnZSA7OworCWVzYWMKKwlpZiBnaXQgY2hlY2tvdXQgIiRicmFuY2giOyB0aGVuCisJCXJtIC1mICIkR0lUX0RJUi9oZWFkLW5hbWUiCisJCWJpc2VjdF9jbGVhbl9zdGF0ZQorCWZpCit9CisKK2Jpc2VjdF9jbGVhbl9zdGF0ZSgpIHsKKwlybSAtZnIgIiRHSVRfRElSL3JlZnMvYmlzZWN0IgorCXJtIC1mICIkR0lUX0RJUi9yZWZzL2hlYWRzL2Jpc2VjdCIKKwlybSAtZiAiJEdJVF9ESVIvQklTRUNUX0xPRyIKKwlybSAtZiAiJEdJVF9ESVIvQklTRUNUX05BTUVTIgorCXJtIC1mICIkR0lUX0RJUi9CSVNFQ1RfUlVOIgorfQorCitiaXNlY3RfcmVwbGF5ICgpIHsKKwl0ZXN0IC1yICIkMSIgfHwgeworCQllY2hvID4mMiAiY2Fubm90IHJlYWQgJDEgZm9yIHJlcGxheWluZyIKKwkJZXhpdCAxCisJfQorCWJpc2VjdF9yZXNldAorCXdoaWxlIHJlYWQgYmlzZWN0IGNvbW1hbmQgcmV2CisJZG8KKwkJdGVzdCAiJGJpc2VjdCIgPSAiZ2l0LWJpc2VjdCIgfHwgY29udGludWUKKwkJY2FzZSAiJGNvbW1hbmQiIGluCisJCXN0YXJ0KQorCQkJY21kPSJiaXNlY3Rfc3RhcnQgJHJldiIKKwkJCWV2YWwgIiRjbWQiCisJCQk7OworCQlnb29kKQorCQkJZWNobyAiJHJldiIgPiIkR0lUX0RJUi9yZWZzL2Jpc2VjdC9nb29kLSRyZXYiCisJCQllY2hvICIjIGdvb2Q6ICIkKGdpdC1zaG93LWJyYW5jaCAkcmV2KSA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCQkJZWNobyAiZ2l0LWJpc2VjdCBnb29kICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCQk7OworCQliYWQpCisJCQllY2hvICIkcmV2IiA+IiRHSVRfRElSL3JlZnMvYmlzZWN0L2JhZCIKKwkJCWVjaG8gIiMgYmFkOiAiJChnaXQtc2hvdy1icmFuY2ggJHJldikgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwkJCWVjaG8gImdpdC1iaXNlY3QgYmFkICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCQk7OworCQkqKQorCQkJZWNobyA+JjIgIj8/IHdoYXQgYXJlIHlvdSB0YWxraW5nIGFib3V0PyIKKwkJCWV4aXQgMSA7OworCQllc2FjCisJZG9uZSA8IiQxIgorCWJpc2VjdF9hdXRvX25leHQKK30KKworYmlzZWN0X3J1biAoKSB7CisgICAgYmlzZWN0X25leHRfY2hlY2sgZmFpbAorCisgICAgd2hpbGUgdHJ1ZQorICAgIGRvCisgICAgICBlY2hvICJydW5uaW5nICRAIgorICAgICAgIiRAIgorICAgICAgcmVzPSQ/CisKKyAgICAgICMgQ2hlY2sgZm9yIHJlYWxseSBiYWQgcnVuIGVycm9yLgorICAgICAgaWYgWyAkcmVzIC1sdCAwIC1vICRyZXMgLWdlIDEyOCBdOyB0aGVuCisJICBlY2hvID4mMiAiYmlzZWN0IHJ1biBmYWlsZWQ6IgorCSAgZWNobyA+JjIgImV4aXQgY29kZSAkcmVzIGZyb20gJyRAJyBpcyA8IDAgb3IgPj0gMTI4IgorCSAgZXhpdCAkcmVzCisgICAgICBmaQorCisgICAgICAjIFVzZSAiYmlzZWN0X2dvb2QiIG9yICJiaXNlY3RfYmFkIgorICAgICAgIyBkZXBlbmRpbmcgb24gcnVuIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAgICAgIGlmIFsgJHJlcyAtZ3QgMCBdOyB0aGVuCisJICBuZXh0X2Jpc2VjdD0nYmlzZWN0X2JhZCcKKyAgICAgIGVsc2UKKwkgIG5leHRfYmlzZWN0PSdiaXNlY3RfZ29vZCcKKyAgICAgIGZpCisKKyAgICAgICMgV2UgaGF2ZSB0byB1c2UgYSBzdWJzaGVsbCBiZWNhdXNlIGJpc2VjdF9nb29kIG9yCisgICAgICAjIGJpc2VjdF9iYWQgZnVuY3Rpb25zIGNhbiBleGl0LgorICAgICAgKCAkbmV4dF9iaXNlY3QgPiAiJEdJVF9ESVIvQklTRUNUX1JVTiIgKQorICAgICAgcmVzPSQ/CisKKyAgICAgIGNhdCAiJEdJVF9ESVIvQklTRUNUX1JVTiIKKworICAgICAgaWYgWyAkcmVzIC1uZSAwIF07IHRoZW4KKwkgIGVjaG8gPiYyICJiaXNlY3QgcnVuIGZhaWxlZDoiCisJICBlY2hvID4mMiAiJG5leHRfYmlzZWN0IGV4aXRlZCB3aXRoIGVycm9yIGNvZGUgJHJlcyIKKwkgIGV4aXQgJHJlcworICAgICAgZmkKKworICAgICAgaWYgZ3JlcCAiaXMgZmlyc3QgYmFkIGNvbW1pdCIgIiRHSVRfRElSL0JJU0VDVF9SVU4iID4gL2Rldi9udWxsOyB0aGVuCisJICBlY2hvICJiaXNlY3QgcnVuIHN1Y2Nlc3MiCisJICBleGl0IDA7CisgICAgICBmaQorCisgICAgZG9uZQorfQorCisKK2Nhc2UgIiQjIiBpbgorMCkKKyAgICB1c2FnZSA7OworKikKKyAgICBjbWQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAiJGNtZCIgaW4KKyAgICBzdGFydCkKKyAgICAgICAgYmlzZWN0X3N0YXJ0ICIkQCIgOzsKKyAgICBiYWQpCisgICAgICAgIGJpc2VjdF9iYWQgIiRAIiA7OworICAgIGdvb2QpCisgICAgICAgIGJpc2VjdF9nb29kICIkQCIgOzsKKyAgICBuZXh0KQorICAgICAgICAjIE5vdCBzdXJlIHdlIHdhbnQgIm5leHQiIGF0IHRoZSBVSSBsZXZlbCBhbnltb3JlLgorICAgICAgICBiaXNlY3RfbmV4dCAiJEAiIDs7CisgICAgdmlzdWFsaXplKQorCWJpc2VjdF92aXN1YWxpemUgIiRAIiA7OworICAgIHJlc2V0KQorICAgICAgICBiaXNlY3RfcmVzZXQgIiRAIiA7OworICAgIHJlcGxheSkKKwliaXNlY3RfcmVwbGF5ICIkQCIgOzsKKyAgICBsb2cpCisJY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTE9HIiA7OworICAgIHJ1bikKKyAgICAgICAgYmlzZWN0X3J1biAiJEAiIDs7CisgICAgKikKKyAgICAgICAgdXNhZ2UgOzsKKyAgICBlc2FjCitlc2FjCmRpZmYgLS1naXQgYS9naXQtY2hlY2tvdXQuc2ggYi9naXQtY2hlY2tvdXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M1Y2EzZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jaGVja291dC5zaApAQCAtMCwwICsxLDI5MyBAQAorIyEvYmluL3NoCisKK1VTQUdFPSdbLXFdIFstZl0gWy1iIDxuZXdfYnJhbmNoPl0gWy1tXSBbPGJyYW5jaD5dIFs8cGF0aHM+Li4uXScKK1NVQkRJUkVDVE9SWV9PSz1Tb21ldGltZXMKKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorCitvbGRfbmFtZT1IRUFECitvbGQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICRvbGRfbmFtZSAyPi9kZXYvbnVsbCkKK29sZGJyYW5jaD0kKGdpdC1zeW1ib2xpYy1yZWYgJG9sZF9uYW1lIDI+L2Rldi9udWxsKQorbmV3PQorbmV3X25hbWU9Citmb3JjZT0KK2JyYW5jaD0KK3RyYWNrPQorbmV3YnJhbmNoPQorbmV3YnJhbmNoX2xvZz0KK21lcmdlPQorcXVpZXQ9Cit2PS12CitMRj0nCisnCit3aGlsZSBbICIkIyIgIT0gIjAiIF07IGRvCisgICAgYXJnPSIkMSIKKyAgICBzaGlmdAorICAgIGNhc2UgIiRhcmciIGluCisJIi1iIikKKwkJbmV3YnJhbmNoPSIkMSIKKwkJc2hpZnQKKwkJWyAteiAiJG5ld2JyYW5jaCIgXSAmJgorCQkJZGllICJnaXQgY2hlY2tvdXQ6IC1iIG5lZWRzIGEgYnJhbmNoIG5hbWUiCisJCWdpdC1zaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL2hlYWRzLyRuZXdicmFuY2giICYmCisJCQlkaWUgImdpdCBjaGVja291dDogYnJhbmNoICRuZXdicmFuY2ggYWxyZWFkeSBleGlzdHMiCisJCWdpdC1jaGVjay1yZWYtZm9ybWF0ICJoZWFkcy8kbmV3YnJhbmNoIiB8fAorCQkJZGllICJnaXQgY2hlY2tvdXQ6IHdlIGRvIG5vdCBsaWtlICckbmV3YnJhbmNoJyBhcyBhIGJyYW5jaCBuYW1lLiIKKwkJOzsKKwkiLWwiKQorCQluZXdicmFuY2hfbG9nPS1sCisJCTs7CisJIi0tdHJhY2sifCItLW5vLXRyYWNrIikKKwkJdHJhY2s9IiRhcmciCisJCTs7CisJIi1mIikKKwkJZm9yY2U9MQorCQk7OworCS1tKQorCQltZXJnZT0xCisJCTs7CisJIi1xIikKKwkJcXVpZXQ9MQorCQl2PQorCQk7OworCS0tKQorCQlicmVhaworCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWlmIHJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRhcmdeMCIgMj4vZGV2L251bGwpCisJCXRoZW4KKwkJCWlmIFsgLXogIiRyZXYiIF07IHRoZW4KKwkJCQllY2hvICJ1bmtub3duIGZsYWcgJGFyZyIKKwkJCQlleGl0IDEKKwkJCWZpCisJCQluZXdfbmFtZT0iJGFyZyIKKwkJCWlmIGdpdC1zaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL2hlYWRzLyRhcmciCisJCQl0aGVuCisJCQkJcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAicmVmcy9oZWFkcy8kYXJnXjAiKQorCQkJCWJyYW5jaD0iJGFyZyIKKwkJCWZpCisJCQluZXc9IiRyZXYiCisJCWVsaWYgcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGFyZ157dHJlZX0iIDI+L2Rldi9udWxsKQorCQl0aGVuCisJCQkjIGNoZWNraW5nIG91dCBzZWxlY3RlZCBwYXRocyBmcm9tIGEgdHJlZS1pc2guCisJCQluZXc9IiRyZXYiCisJCQluZXdfbmFtZT0iJGFyZ157dHJlZX0iCisJCQlicmFuY2g9CisJCWVsc2UKKwkJCW5ldz0KKwkJCW5ld19uYW1lPQorCQkJYnJhbmNoPQorCQkJc2V0IHggIiRhcmciICIkQCIKKwkJCXNoaWZ0CisJCWZpCisJCWNhc2UgIiQxIiBpbgorCQktLSkKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJYnJlYWsKKwkJOzsKKyAgICBlc2FjCitkb25lCisKK2Nhc2UgIiRuZXdicmFuY2gsJHRyYWNrIiBpbgorLC0tKikKKwlkaWUgImdpdCBjaGVja291dDogLS10cmFjayBhbmQgLS1uby10cmFjayByZXF1aXJlIC1iIgorZXNhYworCitjYXNlICIkZm9yY2UkbWVyZ2UiIGluCisxMSkKKwlkaWUgImdpdCBjaGVja291dDogLWYgYW5kIC1tIGFyZSBpbmNvbXBhdGlibGUiCitlc2FjCisKKyMgVGhlIGJlaGF2aW91ciBvZiB0aGUgY29tbWFuZCB3aXRoIGFuZCB3aXRob3V0IGV4cGxpY2l0IHBhdGgKKyMgcGFyYW1ldGVycyBpcyBxdWl0ZSBkaWZmZXJlbnQuCisjCisjIFdpdGhvdXQgcGF0aHMsIHdlIGFyZSBjaGVja2luZyBvdXQgZXZlcnl0aGluZyBpbiB0aGUgd29yayB0cmVlLAorIyBwb3NzaWJseSBzd2l0Y2hpbmcgYnJhbmNoZXMuICBUaGlzIGlzIHRoZSB0cmFkaXRpb25hbCBiZWhhdmlvdXIuCisjCisjIFdpdGggcGF0aHMsIHdlIGFyZSBfbmV2ZXJfIHN3aXRjaGluZyBicmFuY2gsIGJ1dCBjaGVja2luZyBvdXQKKyMgdGhlIG5hbWVkIHBhdGhzIGZyb20gZWl0aGVyIGluZGV4ICh3aGVuIG5vIHJldiBpcyBnaXZlbiksCisjIG9yIHRoZSBuYW1lZCB0cmVlLWlzaCAod2hlbiByZXYgaXMgZ2l2ZW4pLgorCitpZiB0ZXN0ICIkIyIgLWdlIDEKK3RoZW4KKwloaW50PQorCWlmIHRlc3QgIiQjIiAtZXEgMQorCXRoZW4KKwkJaGludD0iCitEaWQgeW91IGludGVuZCB0byBjaGVja291dCAnJEAnIHdoaWNoIGNhbiBub3QgYmUgcmVzb2x2ZWQgYXMgY29tbWl0PyIKKwlmaQorCWlmIHRlc3QgJycgIT0gIiRuZXdicmFuY2gkZm9yY2UkbWVyZ2UiCisJdGhlbgorCQlkaWUgImdpdCBjaGVja291dDogdXBkYXRpbmcgcGF0aHMgaXMgaW5jb21wYXRpYmxlIHdpdGggc3dpdGNoaW5nIGJyYW5jaGVzL2ZvcmNpbmckaGludCIKKwlmaQorCWlmIHRlc3QgJycgIT0gIiRuZXciCisJdGhlbgorCQkjIGZyb20gYSBzcGVjaWZpYyB0cmVlLWlzaDsgbm90ZSB0aGF0IHRoaXMgaXMgZm9yCisJCSMgcmVzY3VpbmcgcGF0aHMgYW5kIGlzIG5ldmVyIG1lYW50IHRvIHJlbW92ZSB3aGF0CisJCSMgaXMgbm90IGluIHRoZSBuYW1lZCB0cmVlLWlzaC4KKwkJZ2l0LWxzLXRyZWUgLS1mdWxsLW5hbWUgLXIgIiRuZXciICIkQCIgfAorCQlnaXQtdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbyB8fCBleGl0ICQ/CisJZmkKKworCSMgTWFrZSBzdXJlIHRoZSByZXF1ZXN0IGlzIGFib3V0IGV4aXN0aW5nIHBhdGhzLgorCWdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gIiRAIiA+L2Rldi9udWxsIHx8IGV4aXQKKwlnaXQtbHMtZmlsZXMgLS0gIiRAIiB8CisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IC0tc3RkaW4KKwlleGl0ICQ/CitlbHNlCisJIyBNYWtlIHN1cmUgd2UgZGlkIG5vdCBmYWxsIGJhY2sgb24gJGFyZ157dHJlZX0gY29kZXBhdGgKKwkjIHNpbmNlIHdlIGFyZSBub3QgY2hlY2tpbmcgb3V0IGZyb20gYW4gYXJiaXRyYXJ5IHRyZWUtaXNoLAorCSMgYnV0IHN3aXRjaGluZyBicmFuY2hlcy4KKwlpZiB0ZXN0ICcnICE9ICIkbmV3IgorCXRoZW4KKwkJZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJG5ld157Y29tbWl0fSIgPi9kZXYvbnVsbCAyPiYxIHx8CisJCWRpZSAiQ2Fubm90IHN3aXRjaCBicmFuY2ggdG8gYSBub24tY29tbWl0LiIKKwlmaQorZmkKKworIyBXZSBhcmUgc3dpdGNoaW5nIGJyYW5jaGVzIGFuZCBjaGVja2luZyBvdXQgdHJlZXMsIHNvCisjIHdlICpORUVEKiB0byBiZSBhdCB0aGUgdG9wbGV2ZWwuCitjZF90b190b3BsZXZlbAorCitbIC16ICIkbmV3IiBdICYmIG5ldz0kb2xkICYmIG5ld19uYW1lPSIkb2xkX25hbWUiCisKKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhbiBleGlzdGluZyBicmFuY2ggdGhhdCB3ZSdyZSBzd2l0Y2hpbmcgdG8sCisjIGFuZCB3ZSBkb24ndCBoYXZlIGEgbmV3IGJyYW5jaCBuYW1lIGZvciB0aGUgdGFyZ2V0IHdlCisjIGFyZSBzd2l0Y2hpbmcgdG8sIHRoZW4gd2UgYXJlIGRldGFjaGluZyBvdXIgSEVBRCBmcm9tIGFueQorIyBicmFuY2guICBIb3dldmVyLCBpZiAiZ2l0IGNoZWNrb3V0IEhFQUQiIGRldGFjaGVzIHRoZSBIRUFECisjIGZyb20gdGhlIGN1cnJlbnQgYnJhbmNoLCBldmVuIHRob3VnaCB0aGF0IG1heSBiZSBsb2dpY2FsbHkKKyMgY29ycmVjdCwgaXQgZmVlbHMgc29tZXdoYXQgZnVubnkuICBNb3JlIGltcG9ydGFudGx5LCB3ZSBkbyBub3QKKyMgd2FudCAiZ2l0IGNoZWNrb3V0IiBub3IgImdpdCBjaGVja291dCAtZiIgdG8gZGV0YWNoIEhFQUQuCisKK2RldGFjaGVkPQorZGV0YWNoX3dhcm49CisKK2Rlc2NyaWJlX2RldGFjaGVkX2hlYWQgKCkgeworCXRlc3QgLW4gIiRxdWlldCIgfHwgeworCQlwcmludGYgPiYyICIkMSAiCisJCUdJVF9QQUdFUj0gZ2l0IGxvZyA+JjIgLTEgLS1wcmV0dHk9b25lbGluZSAtLWFiYnJldi1jb21taXQgIiQyIgorCX0KK30KKworaWYgdGVzdCAteiAiJGJyYW5jaCRuZXdicmFuY2giICYmIHRlc3QgIiRuZXdfbmFtZSIgIT0gIiRvbGRfbmFtZSIKK3RoZW4KKwlkZXRhY2hlZD0iJG5ldyIKKwlpZiB0ZXN0IC1uICIkb2xkYnJhbmNoIiAmJiB0ZXN0IC16ICIkcXVpZXQiCisJdGhlbgorCQlkZXRhY2hfd2Fybj0iTm90ZTogbW92aW5nIHRvIFwiJG5ld19uYW1lXCIgd2hpY2ggaXNuJ3QgYSBsb2NhbCBicmFuY2gKK0lmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBicmFuY2ggZnJvbSB0aGlzIGNoZWNrb3V0LCB5b3UgbWF5IGRvIHNvCisobm93IG9yIGxhdGVyKSBieSB1c2luZyAtYiB3aXRoIHRoZSBjaGVja291dCBjb21tYW5kIGFnYWluLiBFeGFtcGxlOgorICBnaXQgY2hlY2tvdXQgLWIgPG5ld19icmFuY2hfbmFtZT4iCisJZmkKK2VsaWYgdGVzdCAteiAiJG9sZGJyYW5jaCIgJiYgdGVzdCAiJG5ldyIgIT0gIiRvbGQiCit0aGVuCisJZGVzY3JpYmVfZGV0YWNoZWRfaGVhZCAnUHJldmlvdXMgSEVBRCBwb3NpdGlvbiB3YXMnICIkb2xkIgorZmkKKworaWYgWyAiWCRvbGQiID0gWCBdCit0aGVuCisJaWYgdGVzdCAteiAiJHF1aWV0IgorCXRoZW4KKwkJZWNobyA+JjIgIndhcm5pbmc6IFlvdSBhcHBlYXIgdG8gYmUgb24gYSBicmFuY2ggeWV0IHRvIGJlIGJvcm4uIgorCQllY2hvID4mMiAid2FybmluZzogRm9yY2luZyBjaGVja291dCBvZiAkbmV3X25hbWUuIgorCWZpCisJZm9yY2U9MQorZmkKKworaWYgWyAiJGZvcmNlIiBdCit0aGVuCisgICAgZ2l0LXJlYWQtdHJlZSAkdiAtLXJlc2V0IC11ICRuZXcKK2Vsc2UKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsCisgICAgbWVyZ2VfZXJyb3I9JChnaXQtcmVhZC10cmVlIC1tIC11IC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgJG9sZCAkbmV3IDI+JjEpIHx8ICgKKwljYXNlICIkbWVyZ2UiIGluCisJJycpCisJCWVjaG8gPiYyICIkbWVyZ2VfZXJyb3IiCisJCWV4aXQgMSA7OworCWVzYWMKKworCSMgTWF0Y2ggdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBkbyBhIHRocmVlLXdheS4KKyAgICAJZ2l0IGRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgfCBnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tc3RkaW4gJiYKKwl3b3JrPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwlnaXQgcmVhZC10cmVlICR2IC0tcmVzZXQgLXUgJG5ldyB8fCBleGl0CisKKwlldmFsIEdJVEhFQURfJG5ldz0nJHtuZXdfbmFtZTotJHticmFuY2g6LSRuZXd9fScgJiYKKwlldmFsIEdJVEhFQURfJHdvcms9bG9jYWwgJiYKKwlleHBvcnQgR0lUSEVBRF8kbmV3IEdJVEhFQURfJHdvcmsgJiYKKwlnaXQgbWVyZ2UtcmVjdXJzaXZlICRvbGQgLS0gJG5ldyAkd29yaworCisJIyBEbyBub3QgcmVnaXN0ZXIgdGhlIGNsZWFubHkgbWVyZ2VkIHBhdGhzIGluIHRoZSBpbmRleCB5ZXQuCisJIyB0aGlzIGlzIG5vdCBhIHJlYWwgbWVyZ2UgYmVmb3JlIGNvbW1pdHRpbmcsIGJ1dCBqdXN0IGNhcnJ5aW5nCisJIyB0aGUgd29ya2luZyB0cmVlIGNoYW5nZXMgYWxvbmcuCisJdW5tZXJnZWQ9YGdpdCBscy1maWxlcyAtdWAKKwlnaXQgcmVhZC10cmVlICR2IC0tcmVzZXQgJG5ldworCWNhc2UgIiR1bm1lcmdlZCIgaW4KKwknJykJOzsKKwkqKQorCQkoCisJCQl6NDA9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCQkJZWNobyAiJHVubWVyZ2VkIiB8CisJCQlzZWQgLWUgJ3MvXlswLTddKiBbMC05YS1mXSogLyciMCAkejQwIC8iCisJCQllY2hvICIkdW5tZXJnZWQiCisJCSkgfCBnaXQgdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbworCQk7OworCWVzYWMKKwlleGl0IDAKKyAgICApCisgICAgc2F2ZWRfZXJyPSQ/CisgICAgaWYgdGVzdCAiJHNhdmVkX2VyciIgPSAwICYmIHRlc3QgLXogIiRxdWlldCIKKyAgICB0aGVuCisJZ2l0IGRpZmYtaW5kZXggLS1uYW1lLXN0YXR1cyAiJG5ldyIKKyAgICBmaQorICAgIChleGl0ICRzYXZlZF9lcnIpCitmaQorCisjIAorIyBTd2l0Y2ggdGhlIEhFQUQgcG9pbnRlciB0byB0aGUgbmV3IGJyYW5jaCBpZiB3ZQorIyBjaGVja2VkIG91dCBhIGJyYW5jaCBoZWFkLCBhbmQgcmVtb3ZlIGFueSBwb3RlbnRpYWwKKyMgb2xkIE1FUkdFX0hFQUQncyAoc3Vic2VxdWVudCBjb21taXRzIHdpbGwgY2xlYXJseSBub3QKKyMgYmUgYmFzZWQgb24gdGhlbSwgc2luY2Ugd2UgcmUtc2V0IHRoZSBpbmRleCkKKyMKK2lmIFsgIiQ/IiAtZXEgMCBdOyB0aGVuCisJaWYgWyAiJG5ld2JyYW5jaCIgXTsgdGhlbgorCQlnaXQtYnJhbmNoICR0cmFjayAkbmV3YnJhbmNoX2xvZyAiJG5ld2JyYW5jaCIgIiRuZXdfbmFtZSIgfHwgZXhpdAorCQlicmFuY2g9IiRuZXdicmFuY2giCisJZmkKKwlpZiB0ZXN0IC1uICIkYnJhbmNoIgorCXRoZW4KKwkJR0lUX0RJUj0iJEdJVF9ESVIiIGdpdC1zeW1ib2xpYy1yZWYgLW0gImNoZWNrb3V0OiBtb3ZpbmcgdG8gJGJyYW5jaCIgSEVBRCAicmVmcy9oZWFkcy8kYnJhbmNoIgorCQlpZiB0ZXN0IC1uICIkcXVpZXQiCisJCXRoZW4KKwkJCXRydWUJIyBub3RoaW5nCisJCWVsaWYgdGVzdCAicmVmcy9oZWFkcy8kYnJhbmNoIiA9ICIkb2xkYnJhbmNoIgorCQl0aGVuCisJCQllY2hvID4mMiAiQWxyZWFkeSBvbiBicmFuY2ggXCIkYnJhbmNoXCIiCisJCWVsc2UKKwkJCWVjaG8gPiYyICJTd2l0Y2hlZCB0byR7bmV3YnJhbmNoOisgYSBuZXd9IGJyYW5jaCBcIiRicmFuY2hcIiIKKwkJZmkKKwllbGlmIHRlc3QgLW4gIiRkZXRhY2hlZCIKKwl0aGVuCisJCSMgTkVFRFNXT1JLOiB3ZSB3b3VsZCB3YW50IGEgY29tbWFuZCB0byBkZXRhY2ggdGhlIEhFQUQKKwkJIyBhdG9taWNhbGx5LCBpbnN0ZWFkIG9mIHRoaXMgaGFuZGNyYWZ0ZWQgY29tbWFuZCBzZXF1ZW5jZS4KKwkJIyBQZXJoYXBzOgorCQkjCWdpdCB1cGRhdGUtcmVmIC0tZGV0YWNoIEhFQUQgJG5ldworCQkjIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuLi4KKwkJIworCQlnaXQtcmV2LXBhcnNlIEhFQUQgPiIkR0lUX0RJUi9IRUFELm5ldyIgJiYKKwkJbXYgIiRHSVRfRElSL0hFQUQubmV3IiAiJEdJVF9ESVIvSEVBRCIgJiYKKwkJZ2l0LXVwZGF0ZS1yZWYgLW0gImNoZWNrb3V0OiBtb3ZpbmcgdG8gJGFyZyIgSEVBRCAiJGRldGFjaGVkIiB8fAorCQkJZGllICJDYW5ub3QgZGV0YWNoIEhFQUQiCisJCWlmIHRlc3QgLW4gIiRkZXRhY2hfd2FybiIKKwkJdGhlbgorCQkJZWNobyA+JjIgIiRkZXRhY2hfd2FybiIKKwkJZmkKKwkJZGVzY3JpYmVfZGV0YWNoZWRfaGVhZCAnSEVBRCBpcyBub3cgYXQnIEhFQUQKKwlmaQorCXJtIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIgorZWxzZQorCWV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL2dpdC1jbGVhbi5zaCBiL2dpdC1jbGVhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTkzMDlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNsZWFuLnNoCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBQYXZlbCBSb3NraW4KKyMKKworVVNBR0U9IlstZF0gWy1mXSBbLW5dIFstcV0gWy14IHwgLVhdIFstLV0gPHBhdGhzPi4uLiIKK0xPTkdfVVNBR0U9J0NsZWFuIHVudHJhY2tlZCBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCS1kCXJlbW92ZSBkaXJlY3RvcmllcyBhcyB3ZWxsCisJLWYJb3ZlcnJpZGUgY2xlYW4ucmVxdWlyZUZvcmNlIGFuZCBjbGVhbiBhbnl3YXkKKwktbiAJZG9uJ1wnJ3QgcmVtb3ZlIGFueXRoaW5nLCBqdXN0IHNob3cgd2hhdCB3b3VsZCBiZSBkb25lCisJLXEJYmUgcXVpZXQsIG9ubHkgcmVwb3J0IGVycm9ycworCS14CXJlbW92ZSBpZ25vcmVkIGZpbGVzIGFzIHdlbGwKKwktWAlyZW1vdmUgb25seSBpZ25vcmVkIGZpbGVzCitXaGVuIG9wdGlvbmFsIDxwYXRocz4uLi4gYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHBhdGhzCithZmZlY3RlZCBhcmUgZnVydGhlciBsaW1pdGVkIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlbS4nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKKworaWdub3JlZD0KK2lnbm9yZWRvbmx5PQorY2xlYW5kaXI9CitkaXNhYmxlZD0iYGdpdC1jb25maWcgLS1ib29sIGNsZWFuLnJlcXVpcmVGb3JjZWAiCitybWY9InJtIC1mIC0tIgorcm1yZj0icm0gLXJmIC0tIgorcm1fcmVmdXNlPSJlY2hvIE5vdCByZW1vdmluZyIKK2VjaG8xPSJlY2hvIgorCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktZCkKKwkJY2xlYW5kaXI9MQorCQk7OworCS1mKQorCQlkaXNhYmxlZD0KKwkJOzsKKwktbikKKwkJZGlzYWJsZWQ9CisJCXJtZj0iZWNobyBXb3VsZCByZW1vdmUiCisJCXJtcmY9ImVjaG8gV291bGQgcmVtb3ZlIgorCQlybV9yZWZ1c2U9ImVjaG8gV291bGQgbm90IHJlbW92ZSIKKwkJZWNobzE9IjoiCisJCTs7CisJLXEpCisJCWVjaG8xPSI6IgorCQk7OworCS14KQorCQlpZ25vcmVkPTEKKwkJOzsKKwktWCkKKwkJaWdub3JlZG9ubHk9MQorCQk7OworCS0tKQorCQlzaGlmdAorCQlicmVhaworCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJZXNhYworCXNoaWZ0Citkb25lCisKK2lmIFsgIiRkaXNhYmxlZCIgPSB0cnVlIF07IHRoZW4KKwllY2hvICJjbGVhbi5yZXF1aXJlRm9yY2Ugc2V0IGFuZCAtbiBvciAtZiBub3QgZ2l2ZW47IHJlZnVzaW5nIHRvIGNsZWFuIgorCWV4aXQgMQorZmkKKworY2FzZSAiJGlnbm9yZWQsJGlnbm9yZWRvbmx5IiBpbgorCTEsMSkgdXNhZ2U7OworZXNhYworCitpZiBbIC16ICIkaWdub3JlZCIgXTsgdGhlbgorCWV4Y2w9Ii0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUiCisJaWYgWyAtZiAiJEdJVF9ESVIvaW5mby9leGNsdWRlIiBdOyB0aGVuCisJCWV4Y2xfaW5mbz0iLS1leGNsdWRlLWZyb209JEdJVF9ESVIvaW5mby9leGNsdWRlIgorCWZpCisJaWYgWyAiJGlnbm9yZWRvbmx5IiBdOyB0aGVuCisJCWV4Y2w9IiRleGNsIC0taWdub3JlZCIKKwlmaQorZmkKKworZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5ICRleGNsICR7ZXhjbF9pbmZvOisiJGV4Y2xfaW5mbyJ9IC0tICIkQCIgfAord2hpbGUgcmVhZCAtciBmaWxlOyBkbworCWlmIFsgLWQgIiRmaWxlIiAtYSAhIC1MICIkZmlsZSIgXTsgdGhlbgorCQlpZiBbIC16ICIkY2xlYW5kaXIiIF07IHRoZW4KKwkJCSRybV9yZWZ1c2UgIiRmaWxlIgorCQkJY29udGludWUKKwkJZmkKKwkJJGVjaG8xICJSZW1vdmluZyAkZmlsZSIKKwkJJHJtcmYgIiRmaWxlIgorCWVsc2UKKwkJJGVjaG8xICJSZW1vdmluZyAkZmlsZSIKKwkJJHJtZiAiJGZpbGUiCisJZmkKK2RvbmUKZGlmZiAtLWdpdCBhL2dpdC1jbG9uZS5zaCBiL2dpdC1jbG9uZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDU2MThkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNsb25lLnNoCkBAIC0wLDAgKzEsNDEzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDUsIEp1bmlvIEMgSGFtYW5vCisjIAorIyBDbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3QuCisKKyMgU2VlIGdpdC1zaC1zZXR1cCB3aHkuCit1bnNldCBDRFBBVEgKKworZGllKCkgeworCWVjaG8gPiYyICIkQCIKKwlleGl0IDEKK30KKwordXNhZ2UoKSB7CisJZGllICJVc2FnZTogJDAgWy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT5dIFstLXJlZmVyZW5jZSA8cmVmZXJlbmNlLXJlcG8+XSBbLS1iYXJlXSBbLWwgWy1zXV0gWy1xXSBbLXUgPHVwbG9hZC1wYWNrPl0gWy0tb3JpZ2luIDxuYW1lPl0gWy0tZGVwdGggPG4+XSBbLW5dIDxyZXBvPiBbPGRpcj5dIgorfQorCitnZXRfcmVwb19iYXNlKCkgeworCSgKKwkJY2QgImAvYmluL3B3ZGAiICYmCisJCWNkICIkMSIgfHwgY2QgIiQxLmdpdCIgJiYKKwkJeworCQkJY2QgLmdpdAorCQkJcHdkCisJCX0KKwkpIDI+L2Rldi9udWxsCit9CisKK2lmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorICAgIGN1cmxfZXh0cmFfYXJncz0iLWsiCitmaQorCitodHRwX2ZldGNoICgpIHsKKwkjICQxID0gUmVtb3RlLCAkMiA9IExvY2FsCisJY3VybCAtbnNmTCAkY3VybF9leHRyYV9hcmdzICIkMSIgPiIkMiIKK30KKworY2xvbmVfZHVtYl9odHRwICgpIHsKKwkjICQxIC0gcmVtb3RlLCAkMiAtIGxvY2FsCisJY2QgIiQyIiAmJgorCWNsb25lX3RtcD0iJEdJVF9ESVIvY2xvbmUtdG1wIiAmJgorCW1rZGlyIC1wICIkY2xvbmVfdG1wIiB8fCBleGl0IDEKKwlpZiBbIC1uICIkR0lUX0NVUkxfRlRQX05PX0VQU1YiIC1vIFwKKwkJImBnaXQtY29uZmlnIC0tYm9vbCBodHRwLm5vRVBTVmAiID0gdHJ1ZSBdOyB0aGVuCisJCWN1cmxfZXh0cmFfYXJncz0iJHtjdXJsX2V4dHJhX2FyZ3N9IC0tZGlzYWJsZS1lcHN2IgorCWZpCisJaHR0cF9mZXRjaCAiJDEvaW5mby9yZWZzIiAiJGNsb25lX3RtcC9yZWZzIiB8fAorCQlkaWUgIkNhbm5vdCBnZXQgcmVtb3RlIHJlcG9zaXRvcnkgaW5mb3JtYXRpb24uCitQZXJoYXBzIGdpdC11cGRhdGUtc2VydmVyLWluZm8gbmVlZHMgdG8gYmUgcnVuIHRoZXJlPyIKKwl0ZXN0ICJ6JHF1aWV0IiA9IHogJiYgdj0tdiB8fCB2PQorCXdoaWxlIHJlYWQgc2hhMSByZWZuYW1lCisJZG8KKwkJbmFtZT1gZXhwciAieiRyZWZuYW1lIiA6ICd6cmVmcy9cKC4qXCknYCAmJgorCQljYXNlICIkbmFtZSIgaW4KKwkJKl4qKQljb250aW51ZTs7CisJCWVzYWMKKwkJY2FzZSAiJGJhcmUsJG5hbWUiIGluCisJCXllcywqIHwgLGhlYWRzLyogfCAsdGFncy8qKSA7OworCQkqKQljb250aW51ZSA7OworCQllc2FjCisJCWlmIHRlc3QgLW4gIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiAmJgorCQkgICBicmFuY2hfbmFtZT1gZXhwciAieiRuYW1lIiA6ICd6aGVhZHMvXCguKlwpJ2AKKwkJdGhlbgorCQkJdG5hbWU9InJlbW90ZXMvJG9yaWdpbi8kYnJhbmNoX25hbWUiCisJCWVsc2UKKwkJCXRuYW1lPSRuYW1lCisJCWZpCisJCWdpdC1odHRwLWZldGNoICR2IC1hIC13ICIkdG5hbWUiICIkc2hhMSIgIiQxIiB8fCBleGl0IDEKKwlkb25lIDwiJGNsb25lX3RtcC9yZWZzIgorCXJtIC1mciAiJGNsb25lX3RtcCIKKwlodHRwX2ZldGNoICIkMS9IRUFEIiAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiIHx8CisJcm0gLWYgIiRHSVRfRElSL1JFTU9URV9IRUFEIgorfQorCitxdWlldD0KK2xvY2FsPW5vCit1c2VfbG9jYWw9bm8KK2xvY2FsX3NoYXJlZD1ubwordW5zZXQgdGVtcGxhdGUKK25vX2NoZWNrb3V0PQordXBsb2FkX3BhY2s9CitiYXJlPQorcmVmZXJlbmNlPQorb3JpZ2luPQorb3JpZ2luX292ZXJyaWRlPQordXNlX3NlcGFyYXRlX3JlbW90ZT10CitkZXB0aD0KK25vX3Byb2dyZXNzPQordGVzdCAtdCAxIHx8IG5vX3Byb2dyZXNzPS0tbm8tcHJvZ3Jlc3MKK3doaWxlCisJY2FzZSAiJCMsJDEiIGluCisJMCwqKSBicmVhayA7OworCSosLW58KiwtLW5vfCosLS1uby18KiwtLW5vLWN8KiwtLW5vLWNofCosLS1uby1jaGV8KiwtLW5vLWNoZWN8XAorCSosLS1uby1jaGVja3wqLC0tbm8tY2hlY2tvfCosLS1uby1jaGVja291fCosLS1uby1jaGVja291dCkKKwkgIG5vX2NoZWNrb3V0PXllcyA7OworCSosLS1uYXwqLC0tbmFrfCosLS1uYWtlfCosLS1uYWtlZHxcCisJKiwtYnwqLC0tYnwqLC0tYmF8KiwtLWJhcnwqLC0tYmFyZSkgYmFyZT15ZXMgOzsKKwkqLC1sfCosLS1sfCosLS1sb3wqLC0tbG9jfCosLS1sb2NhfCosLS1sb2NhbCkgdXNlX2xvY2FsPXllcyA7OworICAgICAgICAqLC1zfCosLS1zfCosLS1zaHwqLC0tc2hhfCosLS1zaGFyfCosLS1zaGFyZXwqLC0tc2hhcmVkKSAKKyAgICAgICAgICBsb2NhbF9zaGFyZWQ9eWVzOyB1c2VfbG9jYWw9eWVzIDs7CisJMSwtLXRlbXBsYXRlKSB1c2FnZSA7OworCSosLS10ZW1wbGF0ZSkKKwkJc2hpZnQ7IHRlbXBsYXRlPSItLXRlbXBsYXRlPSQxIiA7OworCSosLS10ZW1wbGF0ZT0qKQorCSAgdGVtcGxhdGU9IiQxIiA7OworCSosLXF8KiwtLXF1aWV0KSBxdWlldD0tcSA7OworCSosLS11c2Utc2VwYXJhdGUtcmVtb3RlKSA7OworCSosLS1uby1zZXBhcmF0ZS1yZW1vdGUpCisJCWRpZSAiY2xvbmVzIGFyZSBhbHdheXMgbWFkZSB3aXRoIHNlcGFyYXRlLXJlbW90ZSBsYXlvdXQiIDs7CisJMSwtLXJlZmVyZW5jZSkgdXNhZ2UgOzsKKwkqLC0tcmVmZXJlbmNlKQorCQlzaGlmdDsgcmVmZXJlbmNlPSIkMSIgOzsKKwkqLC0tcmVmZXJlbmNlPSopCisJCXJlZmVyZW5jZT1gZXhwciAieiQxIiA6ICd6LS1yZWZlcmVuY2U9XCguKlwpJ2AgOzsKKwkqLC1vfCosLS1vcnwqLC0tb3JpfCosLS1vcmlnfCosLS1vcmlnaXwqLC0tb3JpZ2luKQorCQljYXNlICIkMiIgaW4KKwkJJycpCisJCSAgICB1c2FnZSA7OworCQkqLyopCisJCSAgICBkaWUgIickMicgaXMgbm90IHN1aXRhYmxlIGZvciBhbiBvcmlnaW4gbmFtZSIKKwkJZXNhYworCQlnaXQtY2hlY2stcmVmLWZvcm1hdCAiaGVhZHMvJDIiIHx8CisJCSAgICBkaWUgIickMicgaXMgbm90IHN1aXRhYmxlIGZvciBhIGJyYW5jaCBuYW1lIgorCQl0ZXN0IC16ICIkb3JpZ2luX292ZXJyaWRlIiB8fAorCQkgICAgZGllICJEbyBub3QgZ2l2ZSBtb3JlIHRoYW4gb25lIC0tb3JpZ2luIG9wdGlvbnMuIgorCQlvcmlnaW5fb3ZlcnJpZGU9eWVzCisJCW9yaWdpbj0iJDIiOyBzaGlmdAorCQk7OworCTEsLXV8MSwtLXVwbG9hZC1wYWNrKSB1c2FnZSA7OworCSosLXV8KiwtLXVwbG9hZC1wYWNrKQorCQlzaGlmdAorCQl1cGxvYWRfcGFjaz0iLS11cGxvYWQtcGFjaz0kMSIgOzsKKwkqLC0tdXBsb2FkLXBhY2s9KikKKwkJdXBsb2FkX3BhY2s9LS11cGxvYWQtcGFjaz0kKGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknKSA7OworCTEsLS1kZXB0aCkgdXNhZ2U7OworCSosLS1kZXB0aCkKKwkJc2hpZnQKKwkJZGVwdGg9Ii0tZGVwdGg9JDEiOzsKKwkqLC0qKSB1c2FnZSA7OworCSopIGJyZWFrIDs7CisJZXNhYworZG8KKwlzaGlmdAorZG9uZQorCityZXBvPSIkMSIKK3Rlc3QgLW4gIiRyZXBvIiB8fAorICAgIGRpZSAneW91IG11c3Qgc3BlY2lmeSBhIHJlcG9zaXRvcnkgdG8gY2xvbmUuJworCisjIC0tYmFyZSBpbXBsaWVzIC0tbm8tY2hlY2tvdXQgYW5kIC0tbm8tc2VwYXJhdGUtcmVtb3RlCitpZiB0ZXN0IHllcyA9ICIkYmFyZSIKK3RoZW4KKwlpZiB0ZXN0IHllcyA9ICIkb3JpZ2luX292ZXJyaWRlIgorCXRoZW4KKwkJZGllICctLWJhcmUgYW5kIC0tb3JpZ2luICRvcmlnaW4gb3B0aW9ucyBhcmUgaW5jb21wYXRpYmxlLicKKwlmaQorCW5vX2NoZWNrb3V0PXllcworCXVzZV9zZXBhcmF0ZV9yZW1vdGU9CitmaQorCitpZiB0ZXN0IC16ICIkb3JpZ2luIgordGhlbgorCW9yaWdpbj1vcmlnaW4KK2ZpCisKKyMgVHVybiB0aGUgc291cmNlIGludG8gYW4gYWJzb2x1dGUgcGF0aCBpZgorIyBpdCBpcyBsb2NhbAoraWYgYmFzZT0kKGdldF9yZXBvX2Jhc2UgIiRyZXBvIik7IHRoZW4KKwlyZXBvPSIkYmFzZSIKKwlsb2NhbD15ZXMKK2ZpCisKK2Rpcj0iJDIiCisjIFRyeSB1c2luZyAiaHVtYW5pc2giIHBhcnQgb2Ygc291cmNlIHJlcG8gaWYgdXNlciBkaWRuJ3Qgc3BlY2lmeSBvbmUKK1sgLXogIiRkaXIiIF0gJiYgZGlyPSQoZWNobyAiJHJlcG8iIHwgc2VkIC1lICdzfC8kfHwnIC1lICdzfDoqLypcLmdpdCR8fCcgLWUgJ3N8LipbLzpdfHxnJykKK1sgLWUgIiRkaXIiIF0gJiYgZGllICJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgJyRkaXInIGFscmVhZHkgZXhpc3RzLiIKK21rZGlyIC1wICIkZGlyIiAmJgorRD0kKGNkICIkZGlyIiAmJiBwd2QpICYmCit0cmFwICdlcnI9JD87IGNkIC4uOyBybSAtcmYgIiREIjsgZXhpdCAkZXJyJyAwCitjYXNlICIkYmFyZSIgaW4KK3llcykKKwlHSVRfRElSPSIkRCIgOzsKKyopCisJR0lUX0RJUj0iJEQvLmdpdCIgOzsKK2VzYWMgJiYgZXhwb3J0IEdJVF9ESVIgJiYgZ2l0LWluaXQgJHt0ZW1wbGF0ZSsiJHRlbXBsYXRlIn0gfHwgdXNhZ2UKKworaWYgdGVzdCAtbiAiJHJlZmVyZW5jZSIKK3RoZW4KKwlyZWZfZ2l0PQorCWlmIHRlc3QgLWQgIiRyZWZlcmVuY2UiCisJdGhlbgorCQlpZiB0ZXN0IC1kICIkcmVmZXJlbmNlLy5naXQvb2JqZWN0cyIKKwkJdGhlbgorCQkJcmVmX2dpdD0iJHJlZmVyZW5jZS8uZ2l0IgorCQllbGlmIHRlc3QgLWQgIiRyZWZlcmVuY2Uvb2JqZWN0cyIKKwkJdGhlbgorCQkJcmVmX2dpdD0iJHJlZmVyZW5jZSIKKwkJZmkKKwlmaQorCWlmIHRlc3QgLW4gIiRyZWZfZ2l0IgorCXRoZW4KKwkJcmVmX2dpdD0kKGNkICIkcmVmX2dpdCIgJiYgcHdkKQorCQllY2hvICIkcmVmX2dpdC9vYmplY3RzIiA+IiRHSVRfRElSL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIgorCQkoCisJCQlHSVRfRElSPSIkcmVmX2dpdCIgZ2l0IGZvci1lYWNoLXJlZiBcCisJCQkJLS1mb3JtYXQ9JyUob2JqZWN0bmFtZSkgJSgqb2JqZWN0bmFtZSknCisJCSkgfAorCQl3aGlsZSByZWFkIGEgYgorCQlkbworCQkJdGVzdCAteiAiJGEiIHx8CisJCQlnaXQgdXBkYXRlLXJlZiAicmVmcy9yZWZlcmVuY2UtdG1wLyRhIiAiJGEiCisJCQl0ZXN0IC16ICIkYiIgfHwKKwkJCWdpdCB1cGRhdGUtcmVmICJyZWZzL3JlZmVyZW5jZS10bXAvJGIiICIkYiIKKwkJZG9uZQorCWVsc2UKKwkJZGllICJyZWZlcmVuY2UgcmVwb3NpdG9yeSAnJHJlZmVyZW5jZScgaXMgbm90IGEgbG9jYWwgZGlyZWN0b3J5LiIKKwlmaQorZmkKKworcm0gLWYgIiRHSVRfRElSL0NMT05FX0hFQUQiCisKKyMgV2UgZG8gbG9jYWwgbWFnaWMgb25seSB3aGVuIHRoZSB1c2VyIHRlbGxzIHVzIHRvLgorY2FzZSAiJGxvY2FsLCR1c2VfbG9jYWwiIGluCit5ZXMseWVzKQorCSggY2QgIiRyZXBvL29iamVjdHMiICkgfHwKKwkJZGllICItbCBmbGFnIHNlZW4gYnV0IHJlcG9zaXRvcnkgJyRyZXBvJyBpcyBub3QgbG9jYWwuIgorCisJY2FzZSAiJGxvY2FsX3NoYXJlZCIgaW4KKwlubykKKwkgICAgIyBTZWUgaWYgd2UgY2FuIGhhcmRsaW5rIGFuZCBkcm9wICJsIiBpZiBub3QuCisJICAgIHNhbXBsZV9maWxlPSQoY2QgIiRyZXBvIiAmJiBcCisJCQkgIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCB8IHNlZCAtZSAxcSkKKworCSAgICAjIG9iamVjdHMgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgZW1wdHkgc2luY2Ugd2UgYXJlIGNsb25pbmchCisJICAgIHRlc3QgLWYgIiRyZXBvLyRzYW1wbGVfZmlsZSIgfHwgZXhpdAorCisJICAgIGw9CisJICAgIGlmIGxuICIkcmVwby8kc2FtcGxlX2ZpbGUiICIkR0lUX0RJUi9vYmplY3RzL3NhbXBsZSIgMj4vZGV2L251bGwKKwkgICAgdGhlbgorCQkgICAgbD1sCisJICAgIGZpICYmCisJICAgIHJtIC1mICIkR0lUX0RJUi9vYmplY3RzL3NhbXBsZSIgJiYKKwkgICAgY2QgIiRyZXBvIiAmJgorCSAgICBmaW5kIG9iamVjdHMgLWRlcHRoIC1wcmludCB8IGNwaW8gLXB1bWQkbCAiJEdJVF9ESVIvIiB8fCBleGl0IDEKKwkgICAgOzsKKwl5ZXMpCisJICAgIG1rZGlyIC1wICIkR0lUX0RJUi9vYmplY3RzL2luZm8iCisJICAgIGVjaG8gIiRyZXBvL29iamVjdHMiID4+ICIkR0lUX0RJUi9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIKKwkgICAgOzsKKwllc2FjCisJZ2l0LWxzLXJlbW90ZSAiJHJlcG8iID4iJEdJVF9ESVIvQ0xPTkVfSEVBRCIgfHwgZXhpdCAxCisJOzsKKyopCisJY2FzZSAiJHJlcG8iIGluCisJcnN5bmM6Ly8qKQorCQljYXNlICIkZGVwdGgiIGluCisJCSIiKSA7OworCQkqKSBkaWUgInNoYWxsb3cgb3ZlciByc3luYyBub3Qgc3VwcG9ydGVkIiA7OworCQllc2FjCisJCXJzeW5jICRxdWlldCAtYXYgLS1pZ25vcmUtZXhpc3RpbmcgIFwKKwkJCS0tZXhjbHVkZSBpbmZvICIkcmVwby9vYmplY3RzLyIgIiRHSVRfRElSL29iamVjdHMvIiB8fAorCQlleGl0CisJCSMgTG9vayBhdCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyBmb3IgcnN5bmMgLS0gaHR0cCB3aWxsCisJCSMgc3VwcG9ydCBpdCBuYXRpdmVseSBhbmQgZ2l0IG5hdGl2ZSBvbmVzIHdpbGwgZG8gaXQgb24gdGhlCisJCSMgcmVtb3RlIGVuZC4gIE5vdCBoYXZpbmcgdGhhdCBmaWxlIGlzIG5vdCBhIGNyaW1lLgorCQlyc3luYyAtcSAiJHJlcG8vb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMiIFwKKwkJCSIkR0lUX0RJUi9UTVBfQUxUIiAyPi9kZXYvbnVsbCB8fAorCQkJcm0gLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJCWlmIHRlc3QgLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJCXRoZW4KKwkJICAgICggY2QgIiREIiAmJgorCQkgICAgICAuIGdpdC1wYXJzZS1yZW1vdGUgJiYKKwkJICAgICAgcmVzb2x2ZV9hbHRlcm5hdGVzICIkcmVwbyIgPCIkR0lUX0RJUi9UTVBfQUxUIiApIHwKKwkJICAgIHdoaWxlIHJlYWQgYWx0CisJCSAgICBkbworCQkJY2FzZSAiJGFsdCIgaW4gJ2JhZCBhbHRlcm5hdGU6ICcqKSBkaWUgIiRhbHQiOzsgZXNhYworCQkJY2FzZSAiJHF1aWV0IiBpbgorCQkJJycpCWVjaG8gPiYyICJHZXR0aW5nIGFsdGVybmF0ZTogJGFsdCIgOzsKKwkJCWVzYWMKKwkJCXJzeW5jICRxdWlldCAtYXYgLS1pZ25vcmUtZXhpc3RpbmcgIFwKKwkJCSAgICAtLWV4Y2x1ZGUgaW5mbyAiJGFsdCIgIiRHSVRfRElSL29iamVjdHMiIHx8IGV4aXQKKwkJICAgIGRvbmUKKwkJICAgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCQlmaQorCQlnaXQtbHMtcmVtb3RlICIkcmVwbyIgPiIkR0lUX0RJUi9DTE9ORV9IRUFEIiB8fCBleGl0IDEKKwkJOzsKKwlodHRwczovLyp8aHR0cDovLyp8ZnRwOi8vKikKKwkJY2FzZSAiJGRlcHRoIiBpbgorCQkiIikgOzsKKwkJKikgZGllICJzaGFsbG93IG92ZXIgaHR0cCBvciBmdHAgbm90IHN1cHBvcnRlZCIgOzsKKwkJZXNhYworCQlpZiB0ZXN0IC16ICJAQE5PX0NVUkxAQCIKKwkJdGhlbgorCQkJY2xvbmVfZHVtYl9odHRwICIkcmVwbyIgIiREIgorCQllbHNlCisJCQlkaWUgImh0dHAgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQsIHJlYnVpbGQgR2l0IHdpdGggY3VybCBzdXBwb3J0IgorCQlmaQorCQk7OworCSopCisJCWNhc2UgIiR1cGxvYWRfcGFjayIgaW4KKwkJJycpIGdpdC1mZXRjaC1wYWNrIC0tYWxsIC1rICRxdWlldCAkZGVwdGggJG5vX3Byb2dyZXNzICIkcmVwbyI7OworCQkqKSBnaXQtZmV0Y2gtcGFjayAtLWFsbCAtayAkcXVpZXQgIiR1cGxvYWRfcGFjayIgJGRlcHRoICRub19wcm9ncmVzcyAiJHJlcG8iIDs7CisJCWVzYWMgPiIkR0lUX0RJUi9DTE9ORV9IRUFEIiB8fAorCQkJZGllICJmZXRjaC1wYWNrIGZyb20gJyRyZXBvJyBmYWlsZWQuIgorCQk7OworCWVzYWMKKwk7OworZXNhYwordGVzdCAtZCAiJEdJVF9ESVIvcmVmcy9yZWZlcmVuY2UtdG1wIiAmJiBybSAtZnIgIiRHSVRfRElSL3JlZnMvcmVmZXJlbmNlLXRtcCIKKworaWYgdGVzdCAtZiAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIKK3RoZW4KKwkjIFJlYWQgZ2l0LWZldGNoLXBhY2sgLWsgb3V0cHV0IGFuZCBzdG9yZSB0aGUgcmVtb3RlIGJyYW5jaGVzLgorCWlmIFsgLW4gIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiBdCisJdGhlbgorCQlicmFuY2hfdG9wPSJyZW1vdGVzLyRvcmlnaW4iCisJZWxzZQorCQlicmFuY2hfdG9wPSJoZWFkcyIKKwlmaQorCXRhZ190b3A9InRhZ3MiCisJd2hpbGUgcmVhZCBzaGExIG5hbWUKKwlkbworCQljYXNlICIkbmFtZSIgaW4KKwkJKidee30nKQorCQkJY29udGludWUgOzsKKwkJSEVBRCkKKwkJCWRlc3RuYW1lPSJSRU1PVEVfSEVBRCIgOzsKKwkJcmVmcy9oZWFkcy8qKQorCQkJZGVzdG5hbWU9InJlZnMvJGJyYW5jaF90b3AvJHtuYW1lI3JlZnMvaGVhZHMvfSIgOzsKKwkJcmVmcy90YWdzLyopCisJCQlkZXN0bmFtZT0icmVmcy8kdGFnX3RvcC8ke25hbWUjcmVmcy90YWdzL30iIDs7CisJCSopCisJCQljb250aW51ZSA7OworCQllc2FjCisJCWdpdC11cGRhdGUtcmVmIC1tICJjbG9uZTogZnJvbSAkcmVwbyIgIiRkZXN0bmFtZSIgIiRzaGExIiAiIgorCWRvbmUgPCAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIKK2ZpCisKK2NkICIkRCIgfHwgZXhpdAorCitpZiB0ZXN0IC16ICIkYmFyZSIgJiYgdGVzdCAtZiAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiCit0aGVuCisJIyBhIG5vbi1iYXJlIHJlcG9zaXRvcnkgaXMgYWx3YXlzIGluIHNlcGFyYXRlLXJlbW90ZSBsYXlvdXQKKwlyZW1vdGVfdG9wPSJyZWZzL3JlbW90ZXMvJG9yaWdpbiIKKwloZWFkX3NoYTE9YGNhdCAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiYAorCWNhc2UgIiRoZWFkX3NoYTEiIGluCisJJ3JlZjogcmVmcy8nKikKKwkJIyBVaC1vaCwgdGhlIHJlbW90ZSB0b2xkIHVzIChodHRwIHRyYW5zcG9ydCBkb25lIGFnYWluc3QKKwkJIyBuZXcgc3R5bGUgcmVwb3NpdG9yeSB3aXRoIGEgc3ltcmVmIEhFQUQpLgorCQkjIElkZWFsbHkgd2Ugc2hvdWxkIHNraXAgdGhlIGd1ZXNzd29yayBidXQgZm9yIG5vdworCQkjIG9wdCBmb3IgbWluaW11bSBjaGFuZ2UuCisJCWhlYWRfc2hhMT1gZXhwciAieiRoZWFkX3NoYTEiIDogJ3pyZWY6IHJlZnMvaGVhZHMvXCguKlwpJ2AKKwkJaGVhZF9zaGExPWBjYXQgIiRHSVRfRElSLyRyZW1vdGVfdG9wLyRoZWFkX3NoYTEiYAorCQk7OworCWVzYWMKKworCSMgVGhlIG5hbWUgdW5kZXIgJHJlbW90ZV90b3AgdGhlIHJlbW90ZSBIRUFEIHNlZW1zIHRvIHBvaW50IGF0LgorCWhlYWRfcG9pbnRzX2F0PSQoCisJCSgKKwkJCXRlc3QgLWYgIiRHSVRfRElSLyRyZW1vdGVfdG9wL21hc3RlciIgJiYgZWNobyAibWFzdGVyIgorCQkJY2QgIiRHSVRfRElSLyRyZW1vdGVfdG9wIiAmJgorCQkJZmluZCAuIC10eXBlIGYgLXByaW50IHwgc2VkIC1lICdzL15cLlwvLy8nCisJCSkgfCAoCisJCWRvbmU9ZgorCQl3aGlsZSByZWFkIG5hbWUKKwkJZG8KKwkJCXRlc3QgdCA9ICRkb25lICYmIGNvbnRpbnVlCisJCQlicmFuY2hfdGlwPWBjYXQgIiRHSVRfRElSLyRyZW1vdGVfdG9wLyRuYW1lImAKKwkJCWlmIHRlc3QgIiRoZWFkX3NoYTEiID0gIiRicmFuY2hfdGlwIgorCQkJdGhlbgorCQkJCWVjaG8gIiRuYW1lIgorCQkJCWRvbmU9dAorCQkJZmkKKwkJZG9uZQorCQkpCisJKQorCisJIyBXcml0ZSBvdXQgcmVtb3RlLiRvcmlnaW4gY29uZmlnLCBhbmQgdXBkYXRlIG91ciAiJGhlYWRfcG9pbnRzX2F0Ii4KKwljYXNlICIkaGVhZF9wb2ludHNfYXQiIGluCisJPyopCisJCSMgTG9jYWwgZGVmYXVsdCBicmFuY2gKKwkJZ2l0LXN5bWJvbGljLXJlZiBIRUFEICJyZWZzL2hlYWRzLyRoZWFkX3BvaW50c19hdCIgJiYKKworCQkjIFRyYWNraW5nIGJyYW5jaCBmb3IgdGhlIHByaW1hcnkgYnJhbmNoIGF0IHRoZSByZW1vdGUuCisJCW9yaWdpbl90cmFjaz0iJHJlbW90ZV90b3AvJGhlYWRfcG9pbnRzX2F0IiAmJgorCQlnaXQtdXBkYXRlLXJlZiBIRUFEICIkaGVhZF9zaGExIiAmJgorCisJCSMgVXBzdHJlYW0gVVJMCisJCWdpdC1jb25maWcgcmVtb3RlLiIkb3JpZ2luIi51cmwgIiRyZXBvIiAmJgorCisJCSMgU2V0IHVwIHRoZSBtYXBwaW5ncyB0byB0cmFjayB0aGUgcmVtb3RlIGJyYW5jaGVzLgorCQlnaXQtY29uZmlnIHJlbW90ZS4iJG9yaWdpbiIuZmV0Y2ggXAorCQkJIityZWZzL2hlYWRzLyo6JHJlbW90ZV90b3AvKiIgJ14kJyAmJgorCQlybSAtZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIKKwkJZ2l0LXN5bWJvbGljLXJlZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIgXAorCQkJInJlZnMvcmVtb3Rlcy8kb3JpZ2luLyRoZWFkX3BvaW50c19hdCIgJiYKKworCQlnaXQtY29uZmlnIGJyYW5jaC4iJGhlYWRfcG9pbnRzX2F0Ii5yZW1vdGUgIiRvcmlnaW4iICYmCisJCWdpdC1jb25maWcgYnJhbmNoLiIkaGVhZF9wb2ludHNfYXQiLm1lcmdlICJyZWZzL2hlYWRzLyRoZWFkX3BvaW50c19hdCIKKwllc2FjCisKKwljYXNlICIkbm9fY2hlY2tvdXQiIGluCisJJycpCisJCXRlc3QgInokcXVpZXQiID0geiAtYSAieiRub19wcm9ncmVzcyIgPSB6ICYmIHY9LXYgfHwgdj0KKwkJZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdiBIRUFEIEhFQUQKKwllc2FjCitmaQorcm0gLWYgIiRHSVRfRElSL0NMT05FX0hFQUQiICIkR0lUX0RJUi9SRU1PVEVfSEVBRCIKKwordHJhcCAtIDAKKwpkaWZmIC0tZ2l0IGEvZ2l0LWNvbW1pdC5zaCBiL2dpdC1jb21taXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZThiNjBmNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jb21taXQuc2gKQEAgLTAsMCArMSw2NTggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisKK1VTQUdFPSdbLWEgfCAtLWludGVyYWN0aXZlXSBbLXNdIFstdl0gWy0tbm8tdmVyaWZ5XSBbLW0gPG1lc3NhZ2U+IHwgLUYgPGxvZ2ZpbGU+IHwgKC1DfC1jKSA8Y29tbWl0PiB8IC0tYW1lbmRdIFstdV0gWy1lXSBbLS1hdXRob3IgPGF1dGhvcj5dIFtbLWkgfCAtb10gPHBhdGg+Li4uXScKK1NVQkRJUkVDVE9SWV9PSz1ZZXMKKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorCitnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxIHx8IGluaXRpYWxfY29tbWl0PXQKKworY2FzZSAiJDAiIGluCisqc3RhdHVzKQorCXN0YXR1c19vbmx5PXQKKwk7OworKmNvbW1pdCkKKwlzdGF0dXNfb25seT0KKwk7OworZXNhYworCityZWZ1c2VfcGFydGlhbCAoKSB7CisJZWNobyA+JjIgIiQxIgorCWVjaG8gPiYyICJZb3UgbWlnaHQgaGF2ZSBtZWFudCB0byBzYXkgJ2dpdCBjb21taXQgLWkgcGF0aHMuLi4nLCBwZXJoYXBzPyIKKwlleGl0IDEKK30KKworVEhJU19JTkRFWD0iJEdJVF9ESVIvaW5kZXgiCitORVhUX0lOREVYPSIkR0lUX0RJUi9uZXh0LWluZGV4JCQiCitybSAtZiAiJE5FWFRfSU5ERVgiCitzYXZlX2luZGV4ICgpIHsKKwljcCAtcCAiJFRISVNfSU5ERVgiICIkTkVYVF9JTkRFWCIKK30KKworcnVuX3N0YXR1cyAoKSB7CisJIyBJZiBUTVBfSU5ERVggaXMgZGVmaW5lZCwgdGhhdCBtZWFucyB3ZSBhcmUgZG9pbmcKKwkjICItLW9ubHkiIHBhcnRpYWwgY29tbWl0LCBhbmQgdGhhdCBpbmRleCBmaWxlIGlzIHVzZWQKKwkjIHRvIGJ1aWxkIHRoZSB0cmVlIGZvciB0aGUgY29tbWl0LiAgT3RoZXJ3aXNlLCBpZgorCSMgTkVYVF9JTkRFWCBleGlzdHMsIHRoYXQgaXMgdGhlIGluZGV4IGZpbGUgdXNlZCB0bworCSMgbWFrZSB0aGUgY29tbWl0LiAgT3RoZXJ3aXNlIHdlIGFyZSB1c2luZyBhcy1pcyBjb21taXQKKwkjIHNvIHRoZSByZWd1bGFyIGluZGV4IGZpbGUgaXMgd2hhdCB3ZSB1c2UgdG8gY29tcGFyZS4KKwlpZiB0ZXN0ICcnICE9ICIkVE1QX0lOREVYIgorCXRoZW4KKwkJR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiCisJCWV4cG9ydCBHSVRfSU5ERVhfRklMRQorCWVsaWYgdGVzdCAtZiAiJE5FWFRfSU5ERVgiCisJdGhlbgorCQlHSVRfSU5ERVhfRklMRT0iJE5FWFRfSU5ERVgiCisJCWV4cG9ydCBHSVRfSU5ERVhfRklMRQorCWZpCisKKwljYXNlICIkc3RhdHVzX29ubHkiIGluCisJdCkgY29sb3I9IDs7CisJKikgY29sb3I9LS1ub2NvbG9yIDs7CisJZXNhYworCWdpdC1ydW5zdGF0dXMgJHtjb2xvcn0gXAorCQkke3ZlcmJvc2U6Ky0tdmVyYm9zZX0gXAorCQkke2FtZW5kOistLWFtZW5kfSBcCisJCSR7dW50cmFja2VkX2ZpbGVzOistLXVudHJhY2tlZH0KK30KKwordHJhcCAnCisJdGVzdCAteiAiJFRNUF9JTkRFWCIgfHwgeworCQl0ZXN0IC1mICIkVE1QX0lOREVYIiAmJiBybSAtZiAiJFRNUF9JTkRFWCIKKwl9CisJcm0gLWYgIiRORVhUX0lOREVYIgorJyAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNpbmcgYW5kIHNhbml0eSBjaGVja2luZworCithbGw9CithbHNvPQoraW50ZXJhY3RpdmU9Citvbmx5PQorbG9nZmlsZT0KK3VzZV9jb21taXQ9CithbWVuZD0KK2VkaXRfZmxhZz0KK25vX2VkaXQ9Citsb2dfZ2l2ZW49Citsb2dfbWVzc2FnZT0KK3ZlcmlmeT10CitxdWlldD0KK3ZlcmJvc2U9CitzaWdub2ZmPQorZm9yY2VfYXV0aG9yPQorb25seV9pbmNsdWRlX2Fzc3VtZWQ9Cit1bnRyYWNrZWRfZmlsZXM9Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1GfC0tRnwtZnwtLWZ8LS1maXwtLWZpbHwtLWZpbGUpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCW5vX2VkaXQ9dAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJbG9nZmlsZT0iJDEiCisJCXNoaWZ0CisJCTs7CisJLUYqfC1mKikKKwkJbm9fZWRpdD10CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQlsb2dmaWxlPWBleHByICJ6JDEiIDogJ3otW0ZmXVwoLipcKSdgCisJCXNoaWZ0CisJCTs7CisJLS1GPSp8LS1mPSp8LS1maT0qfC0tZmlsPSp8LS1maWxlPSopCisJCW5vX2VkaXQ9dAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJbG9nZmlsZT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCXNoaWZ0CisJCTs7CisJLWF8LS1hfC0tYWx8LS1hbGwpCisJCWFsbD10CisJCXNoaWZ0CisJCTs7CisJLS1hdT0qfC0tYXV0PSp8LS1hdXRoPSp8LS1hdXRobz0qfC0tYXV0aG9yPSopCisJCWZvcmNlX2F1dGhvcj1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCXNoaWZ0CisJCTs7CisJLS1hdXwtLWF1dHwtLWF1dGh8LS1hdXRob3wtLWF1dGhvcikKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJZm9yY2VfYXV0aG9yPSIkMSIKKwkJc2hpZnQKKwkJOzsKKwktZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisJCWVkaXRfZmxhZz10CisJCXNoaWZ0CisJCTs7CisJLWl8LS1pfC0taW58LS1pbmN8LS1pbmNsfC0taW5jbHV8LS1pbmNsdWR8LS1pbmNsdWRlKQorCQlhbHNvPXQKKwkJc2hpZnQKKwkJOzsKKwktLWludHwtLWludGV8LS1pbnRlcnwtLWludGVyYXwtLWludGVyYWN8LS1pbnRlcmFjdHwtLWludGVyYWN0aXxcCisJLS1pbnRlcmFjdGl2fC0taW50ZXJhY3RpdmUpCisJCWludGVyYWN0aXZlPXQKKwkJc2hpZnQKKwkJOzsKKwktb3wtLW98LS1vbnwtLW9ubHwtLW9ubHkpCisJCW9ubHk9dAorCQlzaGlmdAorCQk7OworCS1tfC0tbXwtLW1lfC0tbWVzfC0tbWVzc3wtLW1lc3NhfC0tbWVzc2FnfC0tbWVzc2FnZSkKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisJCWlmIHRlc3QgIiRsb2dfbWVzc2FnZSIgPSAnJworCQl0aGVuCisJCSAgICBsb2dfbWVzc2FnZT0iJDEiCisJCWVsc2UKKwkJICAgIGxvZ19tZXNzYWdlPSIkbG9nX21lc3NhZ2UKKworJDEiCisJCWZpCisJCW5vX2VkaXQ9dAorCQlzaGlmdAorCQk7OworCS1tKikKKwkJbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisJCWlmIHRlc3QgIiRsb2dfbWVzc2FnZSIgPSAnJworCQl0aGVuCisJCSAgICBsb2dfbWVzc2FnZT1gZXhwciAieiQxIiA6ICd6LW1cKC4qXCknYAorCQllbHNlCisJCSAgICBsb2dfbWVzc2FnZT0iJGxvZ19tZXNzYWdlCisKK2BleHByICJ6JDEiIDogJ3otbVwoLipcKSdgIgorCQlmaQorCQlub19lZGl0PXQKKwkJc2hpZnQKKwkJOzsKKwktLW09KnwtLW1lPSp8LS1tZXM9KnwtLW1lc3M9KnwtLW1lc3NhPSp8LS1tZXNzYWc9KnwtLW1lc3NhZ2U9KikKKwkJbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisJCWlmIHRlc3QgIiRsb2dfbWVzc2FnZSIgPSAnJworCQl0aGVuCisJCSAgICBsb2dfbWVzc2FnZT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCWVsc2UKKwkJICAgIGxvZ19tZXNzYWdlPSIkbG9nX21lc3NhZ2UKKworYGV4cHIgInokMSIgOiAnenEtW149XSo9XCguKlwpJ2AiCisJCWZpCisJCW5vX2VkaXQ9dAorCQlzaGlmdAorCQk7OworCS1ufC0tbnwtLW5vfC0tbm8tfC0tbm8tdnwtLW5vLXZlfC0tbm8tdmVyfC0tbm8tdmVyaXwtLW5vLXZlcmlmfFwKKwktLW5vLXZlcmlmeSkKKwkJdmVyaWZ5PQorCQlzaGlmdAorCQk7OworCS0tYXwtLWFtfC0tYW1lfC0tYW1lbnwtLWFtZW5kKQorCQlhbWVuZD10CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQl1c2VfY29tbWl0PUhFQUQKKwkJc2hpZnQKKwkJOzsKKwktYykKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisJCXVzZV9jb21taXQ9IiQxIgorCQlub19lZGl0PQorCQlzaGlmdAorCQk7OworCS0tcmVlPSp8LS1yZWVkPSp8LS1yZWVkaT0qfC0tcmVlZGl0PSp8LS1yZWVkaXQtPSp8LS1yZWVkaXQtbT0qfFwKKwktLXJlZWRpdC1tZT0qfC0tcmVlZGl0LW1lcz0qfC0tcmVlZGl0LW1lc3M9KnwtLXJlZWRpdC1tZXNzYT0qfFwKKwktLXJlZWRpdC1tZXNzYWc9KnwtLXJlZWRpdC1tZXNzYWdlPSopCisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQl1c2VfY29tbWl0PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AKKwkJbm9fZWRpdD0KKwkJc2hpZnQKKwkJOzsKKwktLXJlZXwtLXJlZWR8LS1yZWVkaXwtLXJlZWRpdHwtLXJlZWRpdC18LS1yZWVkaXQtbXwtLXJlZWRpdC1tZXxcCisJLS1yZWVkaXQtbWVzfC0tcmVlZGl0LW1lc3N8LS1yZWVkaXQtbWVzc2F8LS1yZWVkaXQtbWVzc2FnfFwKKwktLXJlZWRpdC1tZXNzYWdlKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJdXNlX2NvbW1pdD0iJDEiCisJCW5vX2VkaXQ9CisJCXNoaWZ0CisJCTs7CisJLUMpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQl1c2VfY29tbWl0PSIkMSIKKwkJbm9fZWRpdD10CisJCXNoaWZ0CisJCTs7CisJLS1yZXU9KnwtLXJldXM9KnwtLXJldXNlPSp8LS1yZXVzZS09KnwtLXJldXNlLW09KnwtLXJldXNlLW1lPSp8XAorCS0tcmV1c2UtbWVzPSp8LS1yZXVzZS1tZXNzPSp8LS1yZXVzZS1tZXNzYT0qfC0tcmV1c2UtbWVzc2FnPSp8XAorCS0tcmV1c2UtbWVzc2FnZT0qKQorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJdXNlX2NvbW1pdD1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCW5vX2VkaXQ9dAorCQlzaGlmdAorCQk7OworCS0tcmV1fC0tcmV1c3wtLXJldXNlfC0tcmV1c2UtfC0tcmV1c2UtbXwtLXJldXNlLW1lfC0tcmV1c2UtbWVzfFwKKwktLXJldXNlLW1lc3N8LS1yZXVzZS1tZXNzYXwtLXJldXNlLW1lc3NhZ3wtLXJldXNlLW1lc3NhZ2UpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQl1c2VfY29tbWl0PSIkMSIKKwkJbm9fZWRpdD10CisJCXNoaWZ0CisJCTs7CisJLXN8LS1zfC0tc2l8LS1zaWd8LS1zaWdufC0tc2lnbm98LS1zaWdub2Z8LS1zaWdub2ZmKQorCQlzaWdub2ZmPXQKKwkJc2hpZnQKKwkJOzsKKwktcXwtLXF8LS1xdXwtLXF1aXwtLXF1aWV8LS1xdWlldCkKKwkJcXVpZXQ9dAorCQlzaGlmdAorCQk7OworCS12fC0tdnwtLXZlfC0tdmVyfC0tdmVyYnwtLXZlcmJvfC0tdmVyYm9zfC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10CisJCXNoaWZ0CisJCTs7CisJLXV8LS11fC0tdW58LS11bnR8LS11bnRyfC0tdW50cmF8LS11bnRyYWN8LS11bnRyYWNrfC0tdW50cmFja2V8XAorCS0tdW50cmFja2VkfC0tdW50cmFja2VkLXwtLXVudHJhY2tlZC1mfC0tdW50cmFja2VkLWZpfC0tdW50cmFja2VkLWZpbHxcCisJLS11bnRyYWNrZWQtZmlsZXwtLXVudHJhY2tlZC1maWxlcykKKwkJdW50cmFja2VkX2ZpbGVzPXQKKwkJc2hpZnQKKwkJOzsKKwktLSkKKwkJc2hpZnQKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlicmVhaworCQk7OworCWVzYWMKK2RvbmUKK2Nhc2UgIiRlZGl0X2ZsYWciIGluIHQpIG5vX2VkaXQ9IDs7IGVzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTYW5pdHkgY2hlY2sgb3B0aW9ucworCitjYXNlICIkYW1lbmQsJGluaXRpYWxfY29tbWl0IiBpbgordCx0KQorCWRpZSAiWW91IGRvIG5vdCBoYXZlIGFueXRoaW5nIHRvIGFtZW5kLiIgOzsKK3QsKQorCWlmIFsgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiIF07IHRoZW4KKwkJZGllICJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZSAtLSBjYW5ub3QgYW1lbmQuIgorCWZpIDs7Citlc2FjCisKK2Nhc2UgIiRsb2dfZ2l2ZW4iIGluCit0dCopCisJZGllICJPbmx5IG9uZSBvZiAtYy8tQy8tRi8tLWFtZW5kIGNhbiBiZSB1c2VkLiIgOzsKKyp0bSp8Km10KikKKwlkaWUgIk9wdGlvbiAtbSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtYy8tQy8tRi8tLWFtZW5kLiIgOzsKK2VzYWMKKworY2FzZSAiJCMsJGFsc28sJG9ubHksJGFtZW5kIiBpbgorKix0LHQsKikKKwlkaWUgIk9ubHkgb25lIG9mIC0taW5jbHVkZS8tLW9ubHkgY2FuIGJlIHVzZWQuIiA7OworMCx0LCwqIHwgMCwsdCwpCisJZGllICJObyBwYXRocyB3aXRoIC0taW5jbHVkZS8tLW9ubHkgZG9lcyBub3QgbWFrZSBzZW5zZS4iIDs7CiswLCx0LHQpCisJb25seV9pbmNsdWRlX2Fzc3VtZWQ9IiMgQ2xldmVyLi4uIGFtZW5kaW5nIHRoZSBsYXN0IG9uZSB3aXRoIGRpcnR5IGluZGV4LiIgOzsKKzAsLCwqKQorCTs7CisqLCwsKikKKwlvbmx5X2luY2x1ZGVfYXNzdW1lZD0iIyBFeHBsaWNpdCBwYXRocyBzcGVjaWZpZWQgd2l0aG91dCAtaSBub3IgLW87IGFzc3VtaW5nIC0tb25seSBwYXRocy4uLiIKKwlhbHNvPQorCTs7Citlc2FjCit1bnNldCBvbmx5CitjYXNlICIkYWxsLCRpbnRlcmFjdGl2ZSwkYWxzbywkIyIgaW4KKyp0LCp0LCopCisJZGllICJDYW5ub3QgdXNlIC1hLCAtLWludGVyYWN0aXZlIG9yIC1pIGF0IHRoZSBzYW1lIHRpbWUuIiA7OwordCwsWzEtOV0qKQorCWRpZSAiUGF0aHMgd2l0aCAtYSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKKyx0LFsxLTldKikKKwlkaWUgIlBhdGhzIHdpdGggLS1pbnRlcmFjdGl2ZSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKKywsdCwwKQorCWRpZSAiTm8gcGF0aHMgd2l0aCAtaSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmVwYXJlIGluZGV4IHRvIGhhdmUgYSB0cmVlIHRvIGJlIGNvbW1pdHRlZAorCitjYXNlICIkYWxsLCRhbHNvIiBpbgordCwpCisJaWYgdGVzdCAhIC1mICIkVEhJU19JTkRFWCIKKwl0aGVuCisJCWRpZSAnbm90aGluZyB0byBjb21taXQgKHVzZSAiZ2l0IGFkZCBmaWxlMSBmaWxlMiIgdG8gaW5jbHVkZSBmb3IgY29tbWl0KScKKwlmaQorCXNhdmVfaW5kZXggJiYKKwkoCisJCWNkX3RvX3RvcGxldmVsICYmCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIgJiYKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFICYmCisJCWdpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5IC16IHwKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluCisJKSB8fCBleGl0CisJOzsKKyx0KQorCXNhdmVfaW5kZXggJiYKKwlnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tICIkQCIgPi9kZXYvbnVsbCB8fCBleGl0CisKKwlnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiAtLSAiJEAiICB8CisJKAorCQljZF90b190b3BsZXZlbCAmJgorCQlHSVRfSU5ERVhfRklMRT0iJE5FWFRfSU5ERVgiICYmCisJCWV4cG9ydCBHSVRfSU5ERVhfRklMRSAmJgorCQlnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC16IC0tc3RkaW4KKwkpIHx8IGV4aXQKKwk7OworLCkKKwlpZiB0ZXN0ICIkaW50ZXJhY3RpdmUiID0gdDsgdGhlbgorCQlnaXQgYWRkIC0taW50ZXJhY3RpdmUgfHwgZXhpdAorCWZpCisJY2FzZSAiJCMiIGluCisJMCkKKwkJOzsgIyBjb21taXQgYXMtaXMKKwkqKQorCQlpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIgorCQl0aGVuCisJCQlyZWZ1c2VfcGFydGlhbCAiQ2Fubm90IGRvIGEgcGFydGlhbCBjb21taXQgZHVyaW5nIGEgbWVyZ2UuIgorCQlmaQorCQlUTVBfSU5ERVg9IiRHSVRfRElSL3RtcC1pbmRleCQkIgorCQljb21taXRfb25seT1gZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAiJEAiYCB8fCBleGl0CisKKwkJIyBCdWlsZCBhIHRlbXBvcmFyeSBpbmRleCBhbmQgdXBkYXRlIHRoZSByZWFsIGluZGV4CisJCSMgdGhlIHNhbWUgd2F5LgorCQlpZiB0ZXN0IC16ICIkaW5pdGlhbF9jb21taXQiCisJCXRoZW4KKwkJCUdJVF9JTkRFWF9GSUxFPSIkVEhJU19JTkRFWCIgXAorCQkJZ2l0LXJlYWQtdHJlZSAtLWluZGV4LW91dHB1dD0iJFRNUF9JTkRFWCIgLWkgLW0gSEVBRAorCQllbHNlCisJCQlybSAtZiAiJFRNUF9JTkRFWCIKKwkJZmkgfHwgZXhpdAorCisJCXByaW50ZiAnJXNcbicgIiRjb21taXRfb25seSIgfAorCQlHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIgXAorCQlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIC0tc3RkaW4gJiYKKworCQlzYXZlX2luZGV4ICYmCisJCXByaW50ZiAnJXNcbicgIiRjb21taXRfb25seSIgfAorCQkoCisJCQlHSVRfSU5ERVhfRklMRT0iJE5FWFRfSU5ERVgiCisJCQlleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwkJCWdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1zdGRpbgorCQkpIHx8IGV4aXQKKwkJOzsKKwllc2FjCisJOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJZiB3ZSBkbyBhcy1pcyBjb21taXQsIHRoZSBpbmRleCBmaWxlIHdpbGwgYmUgVEhJU19JTkRFWCwKKyMgb3RoZXJ3aXNlIE5FWFRfSU5ERVggYWZ0ZXIgd2UgbWFrZSB0aGlzIGNvbW1pdC4gIFdlIGxlYXZlCisjIHRoZSBpbmRleCBhcyBpcyBpZiB3ZSBhYm9ydC4KKworaWYgdGVzdCAtZiAiJE5FWFRfSU5ERVgiCit0aGVuCisJVVNFX0lOREVYPSIkTkVYVF9JTkRFWCIKK2Vsc2UKKwlVU0VfSU5ERVg9IiRUSElTX0lOREVYIgorZmkKKworY2FzZSAiJHN0YXR1c19vbmx5IiBpbgordCkKKwkjIFRoaXMgd2lsbCBzaWxlbnRseSBmYWlsIGluIGEgcmVhZC1vbmx5IHJlcG9zaXRvcnksIHdoaWNoIGlzCisJIyB3aGF0IHdlIHdhbnQuCisJR0lUX0lOREVYX0ZJTEU9IiRVU0VfSU5ERVgiIGdpdC11cGRhdGUtaW5kZXggLXEgLS11bm1lcmdlZCAtLXJlZnJlc2gKKwlydW5fc3RhdHVzCisJZXhpdCAkPworCTs7CisnJykKKwlHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgZ2l0LXVwZGF0ZS1pbmRleCAtcSAtLXJlZnJlc2ggfHwgZXhpdAorCTs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR3JhYiBjb21taXQgbWVzc2FnZSwgd3JpdGUgb3V0IHRyZWUgYW5kIG1ha2UgY29tbWl0LgorCitpZiB0ZXN0IHQgPSAiJHZlcmlmeSIgJiYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3ByZS1jb21taXQKK3RoZW4KKwlpZiB0ZXN0ICIkVE1QX0lOREVYIgorCXRoZW4KKwkJR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAorCWVsc2UKKwkJR0lUX0lOREVYX0ZJTEU9IiRVU0VfSU5ERVgiICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAorCWZpIHx8IGV4aXQKK2ZpCisKK2lmIHRlc3QgIiRsb2dfbWVzc2FnZSIgIT0gJycKK3RoZW4KKwlwcmludGYgJyVzXG4nICIkbG9nX21lc3NhZ2UiCitlbGlmIHRlc3QgIiRsb2dmaWxlIiAhPSAiIgordGhlbgorCWlmIHRlc3QgIiRsb2dmaWxlIiA9IC0KKwl0aGVuCisJCXRlc3QgLXQgMCAmJgorCQllY2hvID4mMiAiKHJlYWRpbmcgbG9nIG1lc3NhZ2UgZnJvbSBzdGFuZGFyZCBpbnB1dCkiCisJCWNhdAorCWVsc2UKKwkJY2F0IDwiJGxvZ2ZpbGUiCisJZmkKK2VsaWYgdGVzdCAiJHVzZV9jb21taXQiICE9ICIiCit0aGVuCisJZW5jb2Rpbmc9JChnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgfHwgZWNobyBVVEYtOCkKKwlnaXQgc2hvdyAtcyAtLXByZXR0eT1yYXcgLS1lbmNvZGluZz0iJGVuY29kaW5nIiAiJHVzZV9jb21taXQiIHwKKwlzZWQgLWUgJzEsL14kL2QnIC1lICdzL14gICAgLy8nCitlbGlmIHRlc3QgLWYgIiRHSVRfRElSL01FUkdFX01TRyIKK3RoZW4KKwljYXQgIiRHSVRfRElSL01FUkdFX01TRyIKK2VsaWYgdGVzdCAtZiAiJEdJVF9ESVIvU1FVQVNIX01TRyIKK3RoZW4KKwljYXQgIiRHSVRfRElSL1NRVUFTSF9NU0ciCitmaSB8IGdpdC1zdHJpcHNwYWNlID4iJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCisKK2Nhc2UgIiRzaWdub2ZmIiBpbgordCkKKwluZWVkX2JsYW5rX2JlZm9yZV9zaWdub2ZmPQorCXRhaWwgLW4gMSAiJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHIHwKKwlncmVwICdTaWduZWQtb2ZmLWJ5OicgPi9kZXYvbnVsbCB8fCBuZWVkX2JsYW5rX2JlZm9yZV9zaWdub2ZmPXllcworCXsKKwkJdGVzdCAteiAiJG5lZWRfYmxhbmtfYmVmb3JlX3NpZ25vZmYiIHx8IGVjaG8KKwkJZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCXMvPi4qLz4vCisJCQlzL14vU2lnbmVkLW9mZi1ieTogLworCQknCisJfSA+PiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKKwk7OworZXNhYworCitpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAmJiB0ZXN0IC16ICIkbm9fZWRpdCI7IHRoZW4KKwllY2hvICIjIgorCWVjaG8gIiMgSXQgbG9va3MgbGlrZSB5b3UgbWF5IGJlIGNvbW1pdHRpbmcgYSBNRVJHRS4iCisJZWNobyAiIyBJZiB0aGlzIGlzIG5vdCBjb3JyZWN0LCBwbGVhc2UgcmVtb3ZlIHRoZSBmaWxlIgorCXByaW50ZiAnJXNcbicgIiMJJEdJVF9ESVIvTUVSR0VfSEVBRCIKKwllY2hvICIjIGFuZCB0cnkgYWdhaW4iCisJZWNobyAiIyIKK2ZpID4+IiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworCisjIEF1dGhvcgoraWYgdGVzdCAnJyAhPSAiJHVzZV9jb21taXQiCit0aGVuCisJcGlja19hdXRob3Jfc2NyaXB0PScKKwkvXmF1dGhvciAveworCQlzLydcJycvJ1wnJ1xcJ1wnXCcnL2cKKwkJaAorCQlzL15hdXRob3IgXChbXjxdKlwpIDxbXj5dKj4gLiokL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfTkFNRT0nXCcnJidcJycvcAorCisJCWcKKwkJcy9eYXV0aG9yIFtePF0qIDxcKFtePl0qXCk+IC4qJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX0VNQUlMPSdcJycmJ1wnJy9wCisKKwkJZworCQlzL15hdXRob3IgW148XSogPFtePl0qPiBcKC4qXCkkL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfREFURT0nXCcnJidcJycvcAorCisJCXEKKwl9CisJJworCWVuY29kaW5nPSQoZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIHx8IGVjaG8gVVRGLTgpCisJc2V0X2F1dGhvcl9lbnY9YGdpdCBzaG93IC1zIC0tcHJldHR5PXJhdyAtLWVuY29kaW5nPSIkZW5jb2RpbmciICIkdXNlX2NvbW1pdCIgfAorCUxBTkc9QyBMQ19BTEw9QyBzZWQgLW5lICIkcGlja19hdXRob3Jfc2NyaXB0ImAKKwlldmFsICIkc2V0X2F1dGhvcl9lbnYiCisJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRQorCWV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURQorZmkKK2lmIHRlc3QgJycgIT0gIiRmb3JjZV9hdXRob3IiCit0aGVuCisJR0lUX0FVVEhPUl9OQU1FPWBleHByICJ6JGZvcmNlX2F1dGhvciIgOiAnelwoLipbXiBdXCkgKjwuKidgICYmCisJR0lUX0FVVEhPUl9FTUFJTD1gZXhwciAieiRmb3JjZV9hdXRob3IiIDogJy4qXCg8LipcKSdgICYmCisJdGVzdCAnJyAhPSAiJEdJVF9BVVRIT1JfTkFNRSIgJiYKKwl0ZXN0ICcnICE9ICIkR0lUX0FVVEhPUl9FTUFJTCIgfHwKKwlkaWUgIm1hbGZvcm1lZCAtLWF1dGhvciBwYXJhbWV0ZXIiCisJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSBHSVRfQVVUSE9SX0VNQUlMCitmaQorCitQQVJFTlRTPSItcCBIRUFEIgoraWYgdGVzdCAteiAiJGluaXRpYWxfY29tbWl0IgordGhlbgorCXJsb2dhPSdjb21taXQnCisJaWYgWyAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgXTsgdGhlbgorCQlybG9nYT0nY29tbWl0IChtZXJnZSknCisJCVBBUkVOVFM9Ii1wIEhFQUQgImBzZWQgLWUgJ3MvXi8tcCAvJyAiJEdJVF9ESVIvTUVSR0VfSEVBRCJgCisJZWxpZiB0ZXN0IC1uICIkYW1lbmQiOyB0aGVuCisJCXJsb2dhPSdjb21taXQgKGFtZW5kKScKKwkJUEFSRU5UUz0kKGdpdC1jYXQtZmlsZSBjb21taXQgSEVBRCB8CisJCQlzZWQgLW4gLWUgJy9eJC9xJyAtZSAncy9ecGFyZW50IC8tcCAvcCcpCisJZmkKKwljdXJyZW50PSIkKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkiCitlbHNlCisJaWYgWyAteiAiJChnaXQtbHMtZmlsZXMpIiBdOyB0aGVuCisJCWVjaG8gPiYyICdub3RoaW5nIHRvIGNvbW1pdCAodXNlICJnaXQgYWRkIGZpbGUxIGZpbGUyIiB0byBpbmNsdWRlIGZvciBjb21taXQpJworCQlleGl0IDEKKwlmaQorCVBBUkVOVFM9IiIKKwlybG9nYT0nY29tbWl0IChpbml0aWFsKScKKwljdXJyZW50PScnCitmaQorc2V0X3JlZmxvZ19hY3Rpb24gIiRybG9nYSIKKworaWYgdGVzdCAteiAiJG5vX2VkaXQiCit0aGVuCisJeworCQllY2hvICIiCisJCWVjaG8gIiMgUGxlYXNlIGVudGVyIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgeW91ciBjaGFuZ2VzLiIKKwkJZWNobyAiIyAoQ29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIG5vdCBiZSBpbmNsdWRlZCkiCisJCXRlc3QgLXogIiRvbmx5X2luY2x1ZGVfYXNzdW1lZCIgfHwgZWNobyAiJG9ubHlfaW5jbHVkZV9hc3N1bWVkIgorCQlydW5fc3RhdHVzCisJfSA+PiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKK2Vsc2UKKwkjIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29tbWl0CisJcnVuX3N0YXR1cyA+L2Rldi9udWxsIAorZmkKK2lmIFsgIiQ/IiAhPSAiMCIgLWEgISAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgLWEgLXogIiRhbWVuZCIgXQordGhlbgorCXJtIC1mICIkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIgIiRHSVRfRElSL1NRVUFTSF9NU0ciCisJcnVuX3N0YXR1cworCWV4aXQgMQorZmkKKworY2FzZSAiJG5vX2VkaXQiIGluCisnJykKKwljYXNlICIke1ZJU1VBTDotJEVESVRPUn0sJFRFUk0iIGluCisJLGR1bWIpCisJCWVjaG8gPiYyICJUZXJtaW5hbCBpcyBkdW1iIGJ1dCBubyBWSVNVQUwgbm9yIEVESVRPUiBkZWZpbmVkLiIKKwkJZWNobyA+JjIgIlBsZWFzZSBzdXBwbHkgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSB1c2luZyBlaXRoZXIiCisJCWVjaG8gPiYyICItbSBvciAtRiBvcHRpb24uICBBIGJvaWxlcnBsYXRlIGxvZyBtZXNzYWdlIGhhcyIKKwkJZWNobyA+JjIgImJlZW4gcHJlcGFyZWQgaW4gJEdJVF9ESVIvQ09NTUlUX0VESVRNU0ciCisJCWV4aXQgMQorCQk7OworCWVzYWMKKwlnaXQtdmFyIEdJVF9BVVRIT1JfSURFTlQgPiAvZGV2L251bGwgIHx8IGRpZQorCWdpdC12YXIgR0lUX0NPTU1JVFRFUl9JREVOVCA+IC9kZXYvbnVsbCAgfHwgZGllCisJJHtWSVNVQUw6LSR7RURJVE9SOi12aX19ICIkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIKKwk7OworZXNhYworCitjYXNlICIkdmVyaWZ5IiBpbgordCkKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvY29tbWl0LW1zZworCXRoZW4KKwkJIiRHSVRfRElSIi9ob29rcy9jb21taXQtbXNnICIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cgfHwgZXhpdAorCWZpCitlc2FjCisKK2lmIHRlc3QgLXogIiRub19lZGl0IgordGhlbgorICAgIHNlZCAtZSAnCisgICAgICAgIC9eZGlmZiAtLWdpdCBhXC8uKi97CisJICAgIHMvLy8KKwkgICAgcQorCX0KKwkvXiMvZAorICAgICcgIiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworZWxzZQorICAgIGNhdCAiJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCitmaSB8CitnaXQtc3RyaXBzcGFjZSA+IiRHSVRfRElSIi9DT01NSVRfTVNHCisKK2lmIGNudD1gZ3JlcCAtdiAtaSAnXlNpZ25lZC1vZmYtYnknICIkR0lUX0RJUiIvQ09NTUlUX01TRyB8CisJZ2l0LXN0cmlwc3BhY2UgfAorCXdjIC1sYCAmJgorICAgdGVzdCAwIC1sdCAkY250Cit0aGVuCisJaWYgdGVzdCAteiAiJFRNUF9JTkRFWCIKKwl0aGVuCisJCXRyZWU9JChHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgZ2l0LXdyaXRlLXRyZWUpCisJZWxzZQorCQl0cmVlPSQoR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiIGdpdC13cml0ZS10cmVlKSAmJgorCQlybSAtZiAiJFRNUF9JTkRFWCIKKwlmaSAmJgorCWNvbW1pdD0kKGNhdCAiJEdJVF9ESVIiL0NPTU1JVF9NU0cgfCBnaXQtY29tbWl0LXRyZWUgJHRyZWUgJFBBUkVOVFMpICYmCisJcmxvZ209JChzZWQgLWUgMXEgIiRHSVRfRElSIi9DT01NSVRfTVNHKSAmJgorCWdpdC11cGRhdGUtcmVmIC1tICIkR0lUX1JFRkxPR19BQ1RJT046ICRybG9nbSIgSEVBRCAkY29tbWl0ICIkY3VycmVudCIgJiYKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgIiRHSVRfRElSL01FUkdFX01TRyIgJiYKKwlpZiB0ZXN0IC1mICIkTkVYVF9JTkRFWCIKKwl0aGVuCisJCW12ICIkTkVYVF9JTkRFWCIgIiRUSElTX0lOREVYIgorCWVsc2UKKwkJOiA7IyBoYXBweQorCWZpCitlbHNlCisJZWNobyA+JjIgIiogbm8gY29tbWl0IG1lc3NhZ2U/ICBhYm9ydGluZyBjb21taXQuIgorCWZhbHNlCitmaQorcmV0PSIkPyIKK3JtIC1mICIkR0lUX0RJUi9DT01NSVRfTVNHIiAiJEdJVF9ESVIvQ09NTUlUX0VESVRNU0ciICIkR0lUX0RJUi9TUVVBU0hfTVNHIgorCitjZF90b190b3BsZXZlbAorCitpZiB0ZXN0IC1kICIkR0lUX0RJUi9yci1jYWNoZSIKK3RoZW4KKwlnaXQtcmVyZXJlCitmaQorCitpZiB0ZXN0ICIkcmV0IiA9IDAKK3RoZW4KKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1jb21taXQKKwl0aGVuCisJCSIkR0lUX0RJUiIvaG9va3MvcG9zdC1jb21taXQKKwlmaQorCWlmIHRlc3QgLXogIiRxdWlldCIKKwl0aGVuCisJCWNvbW1pdD1gZ2l0LWRpZmYtdHJlZSAtLWFsd2F5cyAtLXNob3J0c3RhdCAtLXByZXR0eT0iZm9ybWF0OiVoOiAlcyJcCisJCSAgICAgICAtLXN1bW1hcnkgLS1yb290IEhFQUQgLS1gCisJCWVjaG8gIkNyZWF0ZWQke2luaXRpYWxfY29tbWl0OisgaW5pdGlhbH0gY29tbWl0ICRjb21taXQiCisJZmkKK2ZpCisKK2V4aXQgIiRyZXQiCmRpZmYgLS1naXQgYS9naXQtY29tcGF0LXV0aWwuaCBiL2dpdC1jb21wYXQtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWIzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY29tcGF0LXV0aWwuaApAQCAtMCwwICsxLDM0NiBAQAorI2lmbmRlZiBHSVRfQ09NUEFUX1VUSUxfSAorI2RlZmluZSBHSVRfQ09NUEFUX1VUSUxfSAorCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKyNpZm5kZWYgRkxFWF9BUlJBWQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDMpCisjZGVmaW5lIEZMRVhfQVJSQVkgMAorI2Vsc2UKKyNkZWZpbmUgRkxFWF9BUlJBWSAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVFlQRU9GKHgpIChfX3R5cGVvZl9fKHgpKQorI2Vsc2UKKyNkZWZpbmUgVFlQRU9GKHgpCisjZW5kaWYKKworI2RlZmluZSBNU0IoeCwgYml0cykgKCh4KSAmIFRZUEVPRih4KSh+MFVMTCA8PCAoc2l6ZW9mKHgpICogOCAtIChiaXRzKSkpKQorCisvKiBBcHByb3hpbWF0aW9uIG9mIHRoZSBsZW5ndGggb2YgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0eXBlLiAqLworI2RlZmluZSBkZWNpbWFsX2xlbmd0aCh4KQkoKGludCkoc2l6ZW9mKHgpICogMi41NiArIDAuNSkgKyAxKQorCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAgLyogZ2xpYmMyIGFuZCBBSVggNS4zTCBuZWVkIDUwMCwgT3BlbkJTRCBuZWVkcyA2MDAgZm9yIFNfSVNMTksoKSAqLworI2RlZmluZSBfWE9QRU5fU09VUkNFX0VYVEVOREVEIDEgLyogQUlYIDUuM0wgbmVlZHMgdGhpcyAqLworI2VuZGlmCisjZGVmaW5lIF9BTExfU09VUkNFIDEKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQorI2RlZmluZSBfQlNEX1NPVVJDRSAxCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyN1bmRlZiBfWE9QRU5fU09VUkNFCisjaW5jbHVkZSA8Z3JwLmg+CisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNjAwCisjZWxzZQorI3VuZGVmIF9BTExfU09VUkNFIC8qIEFJWCA1LjNMIGRlZmluZXMgYSBzdHJ1Y3QgbGlzdCB3aXRoIF9BTExfU09VUkNFLiAqLworI2luY2x1ZGUgPGdycC5oPgorI2RlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKworI2lmbmRlZiBOT19JQ09OVgorI2luY2x1ZGUgPGljb252Lmg+CisjZW5kaWYKKworLyogT24gbW9zdCBzeXN0ZW1zIDxsaW1pdHMuaD4gd291bGQgaGF2ZSBnaXZlbiB1cyB0aGlzLCBidXQKKyAqIG5vdCBvbiBzb21lIHN5c3RlbXMgKGUuZy4gR05VL0h1cmQpLgorICovCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIDQwOTYKKyNlbmRpZgorCisjaWZuZGVmIFBSSXVNQVgKKyNkZWZpbmUgUFJJdU1BWCAibGx1IgorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2Vsc2UKKyNkZWZpbmUgTk9SRVRVUk4KKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYKKyNlbmRpZgorCisvKiBHZW5lcmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk47CitleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pIE5PUkVUVVJOIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGludCBlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gdm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKmVyciwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworZXh0ZXJuIHZvaWQgc2V0X3VzYWdlX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk4pOworZXh0ZXJuIHZvaWQgc2V0X2RpZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTik7CitleHRlcm4gdm9pZCBzZXRfZXJyb3Jfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykpOworZXh0ZXJuIHZvaWQgc2V0X3dhcm5fcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqd2FybiwgdmFfbGlzdCBwYXJhbXMpKTsKKworI2lmZGVmIE5PX01NQVAKKworI2lmbmRlZiBQUk9UX1JFQUQKKyNkZWZpbmUgUFJPVF9SRUFEIDEKKyNkZWZpbmUgUFJPVF9XUklURSAyCisjZGVmaW5lIE1BUF9QUklWQVRFIDEKKyNkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQqKS0xKQorI2VuZGlmCisKKyNkZWZpbmUgbW1hcCBnaXRfbW1hcAorI2RlZmluZSBtdW5tYXAgZ2l0X211bm1hcAorZXh0ZXJuIHZvaWQgKmdpdF9tbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCk7CitleHRlcm4gaW50IGdpdF9tdW5tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpOworCisvKiBUaGlzIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgKHBhZ2VzaXplICogMikgKi8KKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFICgxICogMTAyNCAqIDEwMjQpCisKKyNlbHNlIC8qIE5PX01NQVAgKi8KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgdmFsdWUgbXVzdCBiZSBtdWx0aXBsZSBvZiAocGFnZXNpemUgKiAyKSAqLworI2RlZmluZSBERUZBVUxUX1BBQ0tFRF9HSVRfV0lORE9XX1NJWkUgXAorCShzaXplb2Yodm9pZCopID49IDggXAorCQk/ICAxICogMTAyNCAqIDEwMjQgKiAxMDI0IFwKKwkJOiAzMiAqIDEwMjQgKiAxMDI0KQorCisjZW5kaWYgLyogTk9fTU1BUCAqLworCisjZGVmaW5lIERFRkFVTFRfUEFDS0VEX0dJVF9MSU1JVCBcCisJKCgxMDI0TCAqIDEwMjRMKSAqIChzaXplb2Yodm9pZCopID49IDggPyA4MTkyIDogMjU2KSkKKworI2lmZGVmIE5PX1BSRUFECisjZGVmaW5lIHByZWFkIGdpdF9wcmVhZAorZXh0ZXJuIHNzaXplX3QgZ2l0X3ByZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCk7CisjZW5kaWYKKworI2lmZGVmIE5PX1NFVEVOVgorI2RlZmluZSBzZXRlbnYgZ2l0c2V0ZW52CitleHRlcm4gaW50IGdpdHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZgorCisjaWZkZWYgTk9fVU5TRVRFTlYKKyNkZWZpbmUgdW5zZXRlbnYgZ2l0dW5zZXRlbnYKK2V4dGVybiB2b2lkIGdpdHVuc2V0ZW52KGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmZGVmIE5PX1NUUkNBU0VTVFIKKyNkZWZpbmUgc3RyY2FzZXN0ciBnaXRzdHJjYXNlc3RyCitleHRlcm4gY2hhciAqZ2l0c3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSTENQWQorI2RlZmluZSBzdHJsY3B5IGdpdHN0cmxjcHkKK2V4dGVybiBzaXplX3QgZ2l0c3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSVE9VTUFYCisjZGVmaW5lIHN0cnRvdW1heCBnaXRzdHJ0b3VtYXgKK2V4dGVybiB1aW50bWF4X3QgZ2l0c3RydG91bWF4KGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKyNlbmRpZgorCisjaWZkZWYgTk9fSFNUUkVSUk9SCisjZGVmaW5lIGhzdHJlcnJvciBnaXRoc3RyZXJyb3IKK2V4dGVybiBjb25zdCBjaGFyICpnaXRoc3RyZXJyb3IoaW50IGhlcnJvcik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgcmVsZWFzZV9wYWNrX21lbW9yeShzaXplX3QsIGludCk7CisKK3N0YXRpYyBpbmxpbmUgY2hhciogeHN0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcmV0ID0gc3RyZHVwKHN0cik7CisJaWYgKCFyZXQpIHsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShzdHJsZW4oc3RyKSArIDEsIC0xKTsKKwkJcmV0ID0gc3RyZHVwKHN0cik7CisJCWlmICghcmV0KQorCQkJZGllKCJPdXQgb2YgbWVtb3J5LCBzdHJkdXAgZmFpbGVkIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeG1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFyZXQgJiYgIXNpemUpCisJCXJldCA9IG1hbGxvYygxKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KHNpemUsIC0xKTsKKwkJcmV0ID0gbWFsbG9jKHNpemUpOworCQlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJCXJldCA9IG1hbGxvYygxKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIG1hbGxvYyBmYWlsZWQiKTsKKwl9CisjaWZkZWYgWE1BTExPQ19QT0lTT04KKwltZW1zZXQocmV0LCAweEE1LCBzaXplKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqeHN0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnA7CisKKwlwID0gbWVtY2hyKHN0ciwgJ1wwJywgbGVuKTsKKwlpZiAocCkKKwkJbGVuID0gcCAtIHN0cjsKKwlwID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkocCwgc3RyLCBsZW4pOworCXBbbGVuXSA9ICdcMCc7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisJaWYgKCFyZXQgJiYgIXNpemUpCisJCXJldCA9IHJlYWxsb2MocHRyLCAxKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KHNpemUsIC0xKTsKKwkJcmV0ID0gcmVhbGxvYyhwdHIsIHNpemUpOworCQlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJCXJldCA9IHJlYWxsb2MocHRyLCAxKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIHJlYWxsb2MgZmFpbGVkIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeGNhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IGNhbGxvYyhubWVtYiwgc2l6ZSk7CisJaWYgKCFyZXQgJiYgKCFubWVtYiB8fCAhc2l6ZSkpCisJCXJldCA9IGNhbGxvYygxLCAxKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KG5tZW1iICogc2l6ZSwgLTEpOworCQlyZXQgPSBjYWxsb2Mobm1lbWIsIHNpemUpOworCQlpZiAoIXJldCAmJiAoIW5tZW1iIHx8ICFzaXplKSkKKwkJCXJldCA9IGNhbGxvYygxLCAxKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIGNhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4bW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwKKwlpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCkKK3sKKwl2b2lkICpyZXQgPSBtbWFwKHN0YXJ0LCBsZW5ndGgsIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KTsKKwlpZiAocmV0ID09IE1BUF9GQUlMRUQpIHsKKwkJaWYgKCFsZW5ndGgpCisJCQlyZXR1cm4gTlVMTDsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShsZW5ndGgsIGZkKTsKKwkJcmV0ID0gbW1hcChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCk7CisJCWlmIChyZXQgPT0gTUFQX0ZBSUxFRCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeT8gbW1hcCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHhyZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXNzaXplX3QgbnI7CisJd2hpbGUgKDEpIHsKKwkJbnIgPSByZWFkKGZkLCBidWYsIGxlbik7CisJCWlmICgobnIgPCAwKSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbnI7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgeHdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXNzaXplX3QgbnI7CisJd2hpbGUgKDEpIHsKKwkJbnIgPSB3cml0ZShmZCwgYnVmLCBsZW4pOworCQlpZiAoKG5yIDwgMCkgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG5yOworCX0KK30KKworc3RhdGljIGlubGluZSBzaXplX3QgeHNpemVfdChvZmZfdCBsZW4pCit7CisJcmV0dXJuIChzaXplX3QpbGVuOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYXNfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHQpCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisJc2l6ZV90IGV4dGxlbiA9IHN0cmxlbihleHQpOworCXJldHVybiBsZW4gPiBleHRsZW4gJiYgIW1lbWNtcChmaWxlbmFtZSArIGxlbiAtIGV4dGxlbiwgZXh0LCBleHRsZW4pOworfQorCisvKiBTYW5lIGN0eXBlIC0gbm8gbG9jYWxlLCBhbmQgd29ya3Mgd2l0aCBzaWduZWQgY2hhcnMgKi8KKyN1bmRlZiBpc3NwYWNlCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzYWxwaGEKKyN1bmRlZiBpc2FsbnVtCisjdW5kZWYgdG9sb3dlcgorI3VuZGVmIHRvdXBwZXIKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XTsKKyNkZWZpbmUgR0lUX1NQQUNFIDB4MDEKKyNkZWZpbmUgR0lUX0RJR0lUIDB4MDIKKyNkZWZpbmUgR0lUX0FMUEhBIDB4MDQKKyNkZWZpbmUgc2FuZV9pc3Rlc3QoeCxtYXNrKSAoKHNhbmVfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIChtYXNrKSkgIT0gMCkKKyNkZWZpbmUgaXNzcGFjZSh4KSBzYW5lX2lzdGVzdCh4LEdJVF9TUEFDRSkKKyNkZWZpbmUgaXNkaWdpdCh4KSBzYW5lX2lzdGVzdCh4LEdJVF9ESUdJVCkKKyNkZWZpbmUgaXNhbHBoYSh4KSBzYW5lX2lzdGVzdCh4LEdJVF9BTFBIQSkKKyNkZWZpbmUgaXNhbG51bSh4KSBzYW5lX2lzdGVzdCh4LEdJVF9BTFBIQSB8IEdJVF9ESUdJVCkKKyNkZWZpbmUgdG9sb3dlcih4KSBzYW5lX2Nhc2UoKHVuc2lnbmVkIGNoYXIpKHgpLCAweDIwKQorI2RlZmluZSB0b3VwcGVyKHgpIHNhbmVfY2FzZSgodW5zaWduZWQgY2hhcikoeCksIDApCisKK3N0YXRpYyBpbmxpbmUgaW50IHNhbmVfY2FzZShpbnQgeCwgaW50IGhpZ2gpCit7CisJaWYgKHNhbmVfaXN0ZXN0KHgsIEdJVF9BTFBIQSkpCisJCXggPSAoeCAmIH4weDIwKSB8IGhpZ2g7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByZWZpeGNtcChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gc3RybmNtcChzdHIsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b3VsX3VpKGNoYXIgY29uc3QgKnMsIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKnA7CisKKwllcnJubyA9IDA7CisJdWwgPSBzdHJ0b3VsKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8ICh1bnNpZ25lZCBpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dpdC1jdnNleHBvcnRjb21taXQucGVybCBiL2dpdC1jdnNleHBvcnRjb21taXQucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmFlOTliCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsCkBAIC0wLDAgKzEsMzEyIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBLbm93biBsaW1pdGF0aW9uczoKKyMgLSBkb2VzIG5vdCBwcm9wYWdhdGUgcGVybWlzc2lvbnMKKyMgLSBlcnJvciBoYW5kbGluZyBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkCisjCisKK3VzZSBzdHJpY3Q7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZGlyKTsKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7CisKK3VubGVzcyAoJEVOVntHSVRfRElSfSAmJiAtciAkRU5We0dJVF9ESVJ9KXsKKyAgICBkaWUgIkdJVF9ESVIgaXMgbm90IGRlZmluZWQgb3IgaXMgdW5yZWFkYWJsZSI7Cit9CisKK291ciAoJG9wdF9oLCAkb3B0X1AsICRvcHRfcCwgJG9wdF92LCAkb3B0X2MsICRvcHRfZiwgJG9wdF9hLCAkb3B0X20sICRvcHRfZCk7CisKK2dldG9wdHMoJ2hQcHZjZmFtOmQ6Jyk7CisKKyRvcHRfaCAmJiB1c2FnZSgpOworCitkaWUgIk5lZWQgYXQgbGVhc3Qgb25lIGNvbW1pdCBpZGVudGlmaWVyISIgdW5sZXNzIEBBUkdWOworCitteSBAY3ZzOworaWYgKCRvcHRfZCkgeworCUBjdnMgPSAoJ2N2cycsICctZCcsICRvcHRfZCk7Cit9IGVsc2UgeworCUBjdnMgPSAoJ2N2cycpOworfQorCisjIHNldHVwIGEgdGVtcGRpcgorb3VyICgkdG1wZGlyLCAkdG1wZGlybmFtZSkgPSB0ZW1wZGlyKCdnaXQtY3ZzYXBwbHljb21taXQtWFhYWFhYJywKKwkJCQkgICAgIFRNUERJUiA9PiAxLAorCQkJCSAgICAgQ0xFQU5VUCA9PiAxKTsKKworIyByZXNvbHZlIHRhcmdldCBjb21taXQKK215ICRjb21taXQ7CiskY29tbWl0ID0gcG9wIEBBUkdWOworJGNvbW1pdCA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtcmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgIiRjb21taXReMCIpOworY2hvbXAgJGNvbW1pdDsKK2lmICgkPykgeworICAgIGRpZSAiVGhlIGNvbW1pdCByZWZlcmVuY2UgJGNvbW1pdCBkaWQgbm90IHJlc29sdmUhIjsKK30KKworIyByZXNvbHZlIHdoYXQgcGFyZW50IHdlIHdhbnQKK215ICRwYXJlbnQ7CitpZiAoQEFSR1YpIHsKKyAgICAkcGFyZW50ID0gcG9wIEBBUkdWOworICAgICRwYXJlbnQgPSAgc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1yZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAiJHBhcmVudF4wIik7CisgICAgY2hvbXAgJHBhcmVudDsKKyAgICBpZiAoJD8pIHsKKwlkaWUgIlRoZSBwYXJlbnQgcmVmZXJlbmNlIGRpZCBub3QgcmVzb2x2ZSEiOworICAgIH0KK30KKworIyBmaW5kIHBhcmVudHMgZnJvbSB0aGUgY29tbWl0IGl0c2VsZgorbXkgQGNvbW1pdCAgPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWNhdC1maWxlJywgJ2NvbW1pdCcsICRjb21taXQpOworbXkgQHBhcmVudHM7CitteSAkY29tbWl0dGVyOworbXkgJGF1dGhvcjsKK215ICRzdGFnZSA9ICdoZWFkZXJzJzsgIyBoZWFkZXJzLCBtc2cKK215ICR0aXRsZTsKK215ICRtc2cgPSAnJzsKKworZm9yZWFjaCBteSAkbGluZSAoQGNvbW1pdCkgeworICAgIGNob21wICRsaW5lOworICAgIGlmICgkc3RhZ2UgZXEgJ2hlYWRlcnMnICYmICRsaW5lIGVxICcnKSB7CisJJHN0YWdlID0gJ21zZyc7CisJbmV4dDsKKyAgICB9CisKKyAgICBpZiAoJHN0YWdlIGVxICdoZWFkZXJzJykgeworCWlmICgkbGluZSA9fiBtL15wYXJlbnQgKFx3ezQwfSkkLykgeyAjIGZvdW5kIGEgcGFyZW50CisJICAgIHB1c2ggQHBhcmVudHMsICQxOworCX0gZWxzaWYgKCRsaW5lID1+IG0vXmF1dGhvciAoLispIFxkKyBbLStdXGQrJC8pIHsKKwkgICAgJGF1dGhvciA9ICQxOworCX0gZWxzaWYgKCRsaW5lID1+IG0vXmNvbW1pdHRlciAoLispIFxkKyBbLStdXGQrJC8pIHsKKwkgICAgJGNvbW1pdHRlciA9ICQxOworCX0KKyAgICB9IGVsc2UgeworCSRtc2cgLj0gJGxpbmUgLiAiXG4iOworCXVubGVzcyAoJHRpdGxlKSB7CisJICAgICR0aXRsZSA9ICRsaW5lOworCX0KKyAgICB9Cit9CisKK2lmICgkcGFyZW50KSB7CisgICAgbXkgJGZvdW5kOworICAgICMgZG91YmxlIGNoZWNrIHRoYXQgaXQncyBhIHZhbGlkIHBhcmVudAorICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJlbnRzKSB7CisJaWYgKCRwIGVxICRwYXJlbnQpIHsKKwkgICAgJGZvdW5kID0gMTsKKwkgICAgbGFzdDsKKwl9OyAjIGZvdW5kIGl0CisgICAgfQorICAgIGRpZSAiRGlkIG5vdCBmaW5kICRwYXJlbnQgaW4gdGhlIHBhcmVudHMgZm9yIHRoaXMgY29tbWl0ISIgaWYgISRmb3VuZCBhbmQgISRvcHRfUDsKK30gZWxzZSB7ICMgd2UgZG9uJ3QgaGF2ZSBhIHBhcmVudCBmcm9tIHRoZSBjbWRsaW5lLi4uCisgICAgaWYgKEBwYXJlbnRzID09IDEpIHsgIyBpdCdzIHNhZmUgdG8gZ2V0IGl0IGZyb20gdGhlIGNvbW1pdAorCSRwYXJlbnQgPSAkcGFyZW50c1swXTsKKyAgICB9IGVsc2UgeyAjIG9yIHBlcmhhcHMgbm90IQorCWRpZSAiVGhpcyBjb21taXQgaGFzIG1vcmUgdGhhbiBvbmUgcGFyZW50IC0tIHBsZWFzZSBuYW1lIHRoZSBwYXJlbnQgeW91IHdhbnQgdG8gdXNlIGV4cGxpY2l0bHkiOworICAgIH0KK30KKworJG9wdF92ICYmIHByaW50ICJBcHBseWluZyB0byBDVlMgY29tbWl0ICRjb21taXQgZnJvbSBwYXJlbnQgJHBhcmVudFxuIjsKKworIyBncmFiIHRoZSBjb21taXQgbWVzc2FnZQorb3BlbihNU0csICI+Lm1zZyIpIG9yIGRpZSAiQ2Fubm90IG9wZW4gLm1zZyBmb3Igd3JpdGluZyI7CitpZiAoJG9wdF9tKSB7CisgICAgcHJpbnQgTVNHICRvcHRfbTsKK30KK3ByaW50IE1TRyAkbXNnOworaWYgKCRvcHRfYSkgeworICAgIHByaW50IE1TRyAiXG5cbkF1dGhvcjogJGF1dGhvclxuIjsKKyAgICBpZiAoJGF1dGhvciBuZSAkY29tbWl0dGVyKSB7CisJcHJpbnQgTVNHICJDb21taXR0ZXI6ICRjb21taXR0ZXJcbiI7CisgICAgfQorfQorY2xvc2UgTVNHOworCitgZ2l0LWRpZmYtdHJlZSAtLWJpbmFyeSAtcCAkcGFyZW50ICRjb21taXQgPi5jdnNleHBvcnRjb21taXQuZGlmZmA7IyB8fCBkaWUgIkNhbm5vdCBkaWZmIjsKKworIyMgYXBwbHkgbm9uLWJpbmFyeSBjaGFuZ2VzCisKKyMgSW4gcGVkYW50aWMgbW9kZSByZXF1aXJlIGFsbCBsaW5lcyBvZiBjb250ZXh0IHRvIG1hdGNoLiAgSW4gbm9ybWFsCisjIG1vZGUsIGJlIGNvbXBhdGlibGUgd2l0aCBkaWZmL3BhdGNoOiBhc3N1bWUgMyBsaW5lcyBvZiBjb250ZXh0IGFuZAorIyByZXF1aXJlIGF0IGxlYXN0IG9uZSBsaW5lIG1hdGNoLCBpLmUuIGlnbm9yZSBhdCBtb3N0IDIgbGluZXMgb2YKKyMgY29udGV4dCwgbGlrZSBkaWZmL3BhdGNoIGRvIGJ5IGRlZmF1bHQuCitteSAkY29udGV4dCA9ICRvcHRfcCA/ICcnIDogJy1DMSc7CisKK3ByaW50ICJDaGVja2luZyBpZiBwYXRjaCB3aWxsIGFwcGx5XG4iOworCitteSBAc3RhdDsKK29wZW4gQVBQTFksICJHSVRfRElSPSBnaXQtYXBwbHkgJGNvbnRleHQgLS1iaW5hcnkgLS1zdW1tYXJ5IC0tbnVtc3RhdDwuY3ZzZXhwb3J0Y29tbWl0LmRpZmZ8IiB8fCBkaWUgImNhbm5vdCBwYXRjaCI7CitAc3RhdD08QVBQTFk+OworY2xvc2UgQVBQTFkgfHwgZGllICJDYW5ub3QgcGF0Y2giOworbXkgKEBiZmlsZXMsQGZpbGVzLEBhZmlsZXMsQGRmaWxlcyk7CitjaG9tcCBAc3RhdDsKK2ZvcmVhY2ggKEBzdGF0KSB7CisJcHVzaCAoQGJmaWxlcywkMSkgaWYgbS9eLVx0LVx0KC4qKSQvOworCXB1c2ggKEBmaWxlcywgJDEpIGlmIG0vXi1cdC1cdCguKikkLzsKKwlwdXNoIChAZmlsZXMsICQxKSBpZiBtL15cZCtcdFxkK1x0KC4qKSQvOworCXB1c2ggKEBhZmlsZXMsJDEpIGlmIG0vXiBjcmVhdGUgbW9kZSBbMC03XSsgKC4qKSQvOworCXB1c2ggKEBkZmlsZXMsJDEpIGlmIG0vXiBkZWxldGUgbW9kZSBbMC03XSsgKC4qKSQvOworfQorbWFwIHsgcy9eIiguKikiJC8kMS9nIH0gQGJmaWxlcyxAZmlsZXM7CittYXAgeyBzL1xcKFswLTddezN9KS9zcHJpbnRmKCclYycsb2N0ICQxKS9lZyB9IEBiZmlsZXMsQGZpbGVzOworCisjIGNoZWNrIHRoYXQgdGhlIGZpbGVzIGFyZSBjbGVhbiBhbmQgdXAgdG8gZGF0ZSBhY2NvcmRpbmcgdG8gY3ZzCitteSAkZGlydHk7CitteSBAZGlyczsKK2ZvcmVhY2ggbXkgJHAgKEBhZmlsZXMpIHsKKyAgICBteSAkcGF0aCA9IGRpcm5hbWUgJHA7CisgICAgd2hpbGUgKCEtZCAkcGF0aCBhbmQgISBncmVwIHsgJF8gZXEgJHBhdGggfSBAZGlycykgeworCXVuc2hpZnQgQGRpcnMsICRwYXRoOworCSRwYXRoID0gZGlybmFtZSAkcGF0aDsKKyAgICB9Cit9CisKKyMgLi4uIGNoZWNrIGRpcnMsCitmb3JlYWNoIG15ICRkIChAZGlycykgeworICAgIGlmICgtZSAkZCkgeworCSRkaXJ0eSA9IDE7CisJd2FybiAiJGQgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnkhXG4iOworICAgIH0KK30KKworIyAuLi4gcXVlcnkgc3RhdHVzIG9mIGFsbCBmaWxlcyB0aGF0IHdlIGhhdmUgYSBkaXJlY3RvcnkgZm9yIGFuZCBwYXJzZSBvdXRwdXQgb2YgJ2N2cyBzdGF0dXMnIHRvICVjdnNzdGF0LgorbXkgQGNhbnN0YXR1c2ZpbGVzOworZm9yZWFjaCBteSAkZiAoQGZpbGVzKSB7CisgICAgbXkgJHBhdGggPSBkaXJuYW1lICRmOworICAgIG5leHQgaWYgKGdyZXAgeyAkXyBlcSAkcGF0aCB9IEBkaXJzKTsKKyAgICBwdXNoIEBjYW5zdGF0dXNmaWxlcywgJGY7Cit9CisKK215ICVjdnNzdGF0OworaWYgKEBjYW5zdGF0dXNmaWxlcykgeworICAgIG15IEBjdnNvdXRwdXQ7CisgICAgQGN2c291dHB1dD0gc2FmZV9waXBlX2NhcHR1cmUoQGN2cywgJ3N0YXR1cycsIEBjYW5zdGF0dXNmaWxlcyk7CisgICAgbXkgJG1hdGNoY291bnQgPSAwOworICAgIGZvcmVhY2ggbXkgJGwgKEBjdnNvdXRwdXQpIHsKKyAgICAgICAgY2hvbXAgJGw7CisgICAgICAgIGlmICggJGwgPX4gL15GaWxlOi8gYW5kICAkbCA9fiAvU3RhdHVzOiAoLiopJC8gKSB7CisgICAgICAgICAgICAkY3Zzc3RhdHskY2Fuc3RhdHVzZmlsZXNbJG1hdGNoY291bnRdfSA9ICQxOworICAgICAgICAgICAgJG1hdGNoY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworIyAuLi4gdmFsaWRhdGUgbmV3IGZpbGVzLAorZm9yZWFjaCBteSAkZiAoQGFmaWxlcykgeworICAgIGlmIChkZWZpbmVkICgkY3Zzc3RhdHskZn0pIGFuZCAkY3Zzc3RhdHskZn0gbmUgIlVua25vd24iKSB7CisgCSRkaXJ0eSA9IDE7CisJd2FybiAiRmlsZSAkZiBpcyBhbHJlYWR5IGtub3duIGluIHlvdXIgQ1ZTIGNoZWNrb3V0IC0tIHBlcmhhcHMgaXQgaGFzIGJlZW4gYWRkZWQgYnkgYW5vdGhlciB1c2VyLiBPciB0aGlzIG1heSBpbmRpY2F0ZSB0aGF0IGl0IGV4aXN0cyBvbiBhIGRpZmZlcmVudCBicmFuY2guIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSAtZiB0byBmb3JjZSB0aGUgbWVyZ2UuXG4iOworCXdhcm4gIlN0YXR1cyB3YXM6ICRjdnNzdGF0eyRmfVxuIjsKKyAgICB9Cit9CisjIC4uLiB2YWxpZGF0ZSBrbm93biBmaWxlcy4KK2ZvcmVhY2ggbXkgJGYgKEBmaWxlcykgeworICAgIG5leHQgaWYgZ3JlcCB7ICRfIGVxICRmIH0gQGFmaWxlczsKKyAgICAjIFRPRE86d2UgbmVlZCB0byBoYW5kbGUgcmVtb3ZlZCBpbiBjdnMKKyAgICB1bmxlc3MgKGRlZmluZWQgKCRjdnNzdGF0eyRmfSkgYW5kICRjdnNzdGF0eyRmfSBlcSAiVXAtdG8tZGF0ZSIpIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIkZpbGUgJGYgbm90IHVwIHRvIGRhdGUgYnV0IGhhcyBzdGF0dXMgJyRjdnNzdGF0eyRmfScgaW4geW91ciBDVlMgY2hlY2tvdXQhXG4iOworICAgIH0KK30KK2lmICgkZGlydHkpIHsKKyAgICBpZiAoJG9wdF9mKSB7CXdhcm4gIlRoZSB0cmVlIGlzIG5vdCBjbGVhbiAtLSBmb3JjZWQgbWVyZ2VcbiI7CisJJGRpcnR5ID0gMDsKKyAgICB9IGVsc2UgeworCWRpZSAiRXhpdGluZzogeW91ciBDVlMgdHJlZSBpcyBub3QgY2xlYW4gZm9yIHRoaXMgbWVyZ2UuIjsKKyAgICB9Cit9CisKK3ByaW50ICJBcHBseWluZ1xuIjsKK2BHSVRfRElSPSBnaXQtYXBwbHkgJGNvbnRleHQgLS1iaW5hcnkgLS1zdW1tYXJ5IC0tbnVtc3RhdCAtLWFwcGx5IDwuY3ZzZXhwb3J0Y29tbWl0LmRpZmZgIHx8IGRpZSAiY2Fubm90IHBhdGNoIjsKKworcHJpbnQgIlBhdGNoIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5LiBBZGRpbmcgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBDVlNcbiI7CitteSAkZGlydHlwYXRjaCA9IDA7Citmb3JlYWNoIG15ICRkIChAZGlycykgeworICAgIGlmIChzeXN0ZW0oQGN2cywnYWRkJywkZCkpIHsKKwkkZGlydHlwYXRjaCA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBhZGQgZGlyZWN0b3J5ICRkIC0tIHlvdSBtYXkgbmVlZCB0byBkbyBpdCBtYW51YWxseSI7CisgICAgfQorfQorCitmb3JlYWNoIG15ICRmIChAYWZpbGVzKSB7CisgICAgaWYgKGdyZXAgeyAkXyBlcSAkZiB9IEBiZmlsZXMpIHsKKyAgICAgIHN5c3RlbShAY3ZzLCAnYWRkJywnLWtiJywkZik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN5c3RlbShAY3ZzLCAnYWRkJywgJGYpOworICAgIH0KKyAgICBpZiAoJD8pIHsKKwkkZGlydHlwYXRjaCA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBhZGQgJGYgLS0geW91IG1heSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5IjsKKyAgICB9Cit9CisKK2ZvcmVhY2ggbXkgJGYgKEBkZmlsZXMpIHsKKyAgICBzeXN0ZW0oQGN2cywgJ3JtJywgJy1mJywgJGYpOworICAgIGlmICgkPykgeworCSRkaXJ0eXBhdGNoID0gMTsKKwl3YXJuICJGYWlsZWQgdG8gY3ZzIHJtIC1mICRmIC0tIHlvdSBtYXkgbmVlZCB0byBkbyBpdCBtYW51YWxseSI7CisgICAgfQorfQorCitwcmludCAiQ29tbWl0IHRvIENWU1xuIjsKK3ByaW50ICJQYXRjaCB0aXRsZSAoZmlyc3QgY29tbWVudCBsaW5lKTogJHRpdGxlXG4iOworbXkgQGNvbW1pdGZpbGVzID0gbWFwIHsgdW5sZXNzIChtL1xzLykgeyAnXCcnLiRfLidcJyc7IH0gZWxzZSB7ICRfOyB9OyB9IChAZmlsZXMpOworbXkgJGNtZCA9IGpvaW4oJyAnLCBAY3ZzKS4iIGNvbW1pdCAtRiAubXNnIEBjb21taXRmaWxlcyI7CisKK2lmICgkZGlydHlwYXRjaCkgeworICAgIHByaW50ICJOT1RFOiBPbmUgb3IgbW9yZSBodW5rcyBmYWlsZWQgdG8gYXBwbHkgY2xlYW5seS5cbiI7CisgICAgcHJpbnQgIllvdSdsbCBuZWVkIHRvIGFwcGx5IHRoZSBwYXRjaCBpbiAuY3ZzZXhwb3J0Y29tbWl0LmRpZmYgbWFudWFsbHlcbiI7CisgICAgcHJpbnQgInVzaW5nIGEgcGF0Y2ggcHJvZ3JhbS4gQWZ0ZXIgYXBwbHlpbmcgdGhlIHBhdGNoIGFuZCByZXNvbHZpbmcgdGhlXG4iOworICAgIHByaW50ICJwcm9ibGVtcyB5b3UgbWF5IGNvbW1pdCB1c2luZzoiOworICAgIHByaW50ICJcbiAgICAkY21kXG5cbiI7CisgICAgZXhpdCgxKTsKK30KKworaWYgKCRvcHRfYykgeworICAgIHByaW50ICJBdXRvY29tbWl0XG4gICRjbWRcbiI7CisgICAgcHJpbnQgc2FmZV9waXBlX2NhcHR1cmUoQGN2cywgJ2NvbW1pdCcsICctRicsICcubXNnJywgQGZpbGVzKTsKKyAgICBpZiAoJD8pIHsKKwlkaWUgIkV4aXRpbmc6IFRoZSBjb21taXQgZGlkIG5vdCBzdWNjZWVkIjsKKyAgICB9CisgICAgcHJpbnQgIkNvbW1pdHRlZCBzdWNjZXNzZnVsbHkgdG8gQ1ZTXG4iOworICAgICMgY2xlYW4gdXAKKyAgICB1bmxpbmsoIi5tc2ciKTsKK30gZWxzZSB7CisgICAgcHJpbnQgIlJlYWR5IGZvciB5b3UgdG8gY29tbWl0LCBqdXN0IHJ1bjpcblxuICAgJGNtZFxuIjsKK30KKworIyBjbGVhbiB1cAordW5saW5rKCIuY3ZzZXhwb3J0Y29tbWl0LmRpZmYiKTsKKworc3ViIHVzYWdlIHsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogR0lUX0RJUj0vcGF0aC90by8uZ2l0ICR7XGJhc2VuYW1lICQwfSBbLWhdIFstcF0gWy12XSBbLWNdIFstZl0gWy1tIG1zZ3ByZWZpeF0gWyBwYXJlbnQgXSBjb21taXQKK0VORAorCWV4aXQoMSk7Cit9CisKKyMgQW4gYWx0ZXJuYXRpdmUgdG8gYGNvbW1hbmRgIHRoYXQgYWxsb3dzIGlucHV0IHRvIGJlIHBhc3NlZCBhcyBhbiBhcnJheQorIyB0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCisjIGlmIHRoZSBleGVjIHJldHVybnMgbm9uLXplcm8gd2UgZGllCitzdWIgc2FmZV9waXBlX2NhcHR1cmUgeworICAgIG15IEBvdXRwdXQ7CisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworCUBvdXRwdXQgPSAoPCRjaGlsZD4pOworCWNsb3NlICRjaGlsZCBvciBkaWUgam9pbignICcsQF8pLiI6ICQhICQ/IjsKKyAgICB9IGVsc2UgeworCWV4ZWMoQF8pIG9yIGRpZSAiJCEgJD8iOyAjIGV4ZWMoKSBjYW4gZmFpbCB0aGUgZXhlY3V0YWJsZSBjYW4ndCBiZSBmb3VuZAorICAgIH0KKyAgICByZXR1cm4gd2FudGFycmF5ID8gQG91dHB1dCA6IGpvaW4oJycsQG91dHB1dCk7Cit9CisKK3N1YiBzYWZlX3BpcGVfY2FwdHVyZV9ibG9iIHsKKyAgICBteSAkb3V0cHV0OworICAgIGlmIChteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCcpIHsKKyAgICAgICAgbG9jYWwgJC87CisJdW5kZWYgJC87CisJJG91dHB1dCA9ICg8JGNoaWxkPik7CisJY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisJZXhlYyhAXykgb3IgZGllICIkISAkPyI7ICMgZXhlYygpIGNhbiBmYWlsIHRoZSBleGVjdXRhYmxlIGNhbid0IGJlIGZvdW5kCisgICAgfQorICAgIHJldHVybiAkb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvZ2l0LWN2c2ltcG9ydC5wZXJsIGIvZ2l0LWN2c2ltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlNmM5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3ZzaW1wb3J0LnBlcmwKQEAgLTAsMCArMSwxMDI2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBUaGlzIHRvb2wgaXMgY29weXJpZ2h0IChjKSAyMDA1LCBNYXR0aGlhcyBVcmxpY2hzLgorIyBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR251IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisjCisjIFRoZSBiYXNpYyBpZGVhIGlzIHRvIGFnZ3JlZ2F0ZSBDVlMgY2hlY2staW5zIGludG8gcmVsYXRlZCBjaGFuZ2VzLgorIyBGb3J0dW5hdGVseSwgImN2c3BzIiBkb2VzIHRoYXQgZm9yIHVzOyBhbGwgd2UgaGF2ZSB0byBkbyBpcyB0byBwYXJzZQorIyBpdHMgb3V0cHV0LgorIworIyBDaGVja2luZyBvdXQgdGhlIGZpbGVzIGlzIGRvbmUgYnkgYSBzaW5nbGUgbG9uZy1ydW5uaW5nIENWUyBjb25uZWN0aW9uCisjIC8gc2VydmVyIHByb2Nlc3MuCisjCisjIFRoZSBoZWFkIHJldmlzaW9uIGlzIG9uIGJyYW5jaCAib3JpZ2luIiBieSBkZWZhdWx0LgorIyBZb3UgY2FuIGNoYW5nZSB0aGF0IHdpdGggdGhlICctbycgb3B0aW9uLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6U3RkOwordXNlIEZpbGU6OlNwZWM7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZmlsZSB0bXBuYW0pOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBUaW1lOjpMb2NhbDsKK3VzZSBJTzo6U29ja2V0OwordXNlIElPOjpQaXBlOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIgRU5PRU5UKTsKK3VzZSBJUEM6Ok9wZW4yOworCiskU0lHeydQSVBFJ309IklHTk9SRSI7CiskRU5WeydUWid9PSJVVEMiOworCitvdXIgKCRvcHRfaCwkb3B0X28sJG9wdF92LCRvcHRfaywkb3B0X3UsJG9wdF9kLCRvcHRfcCwkb3B0X0MsJG9wdF96LCRvcHRfaSwkb3B0X1AsICRvcHRfcywkb3B0X20sJG9wdF9NLCRvcHRfQSwkb3B0X1MsJG9wdF9MLCAkb3B0X2EpOworbXkgKCVjb252X2F1dGhvcl9uYW1lLCAlY29udl9hdXRob3JfZW1haWwpOworCitzdWIgdXNhZ2UoOyQpIHsKKwlteSAkbXNnID0gc2hpZnQ7CisJcHJpbnQoU1RERVJSICJFcnJvcjogJG1zZ1xuIikgaWYgJG1zZzsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogJHtcYmFzZW5hbWUgJDB9ICAgICAjIGZldGNoL3VwZGF0ZSBHSVQgZnJvbSBDVlMKKyAgICAgICBbLW8gYnJhbmNoLWZvci1IRUFEXSBbLWhdIFstdl0gWy1kIENWU1JPT1RdIFstQSBhdXRob3ItY29udi1maWxlXQorICAgICAgIFstcCBvcHRzLWZvci1jdnNwc10gWy1QIGZpbGVdIFstQyBHSVRfcmVwb3NpdG9yeV0gWy16IGZ1enpdIFstaV0gWy1rXQorICAgICAgIFstdV0gWy1zIHN1YnN0XSBbLWFdIFstbV0gWy1NIHJlZ2V4XSBbLVMgcmVnZXhdIFstTCBjb21taXRsaW1pdF0KKyAgICAgICBbQ1ZTX21vZHVsZV0KK0VORAorCWV4aXQoMSk7Cit9CisKK3N1YiByZWFkX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJbXkgJHVzZXI7CisJb3BlbiBteSAkZiwgJzwnLCAiJGZpbGUiIG9yIGRpZSgiRmFpbGVkIHRvIG9wZW4gJGZpbGU6ICQhXG4iKTsKKworCXdoaWxlICg8JGY+KSB7CisJCSMgRXhwZWN0ZWQgZm9ybWF0IGlzIHRoaXM6CisJCSMgICBleG9uPUFuZHJlYXMgRXJpY3Nzb24gPGFlQG9wNS5zZT4KKwkJaWYgKG0vXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvKSB7CisJCQkkdXNlciA9ICQxOworCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDI7CisJCQkkY29udl9hdXRob3JfZW1haWx7JHVzZXJ9ID0gJDM7CisJCX0KKwkJIyBIb3dldmVyLCB3ZSBhbHNvIHJlYWQgZnJvbSBDVlNST09UL3VzZXJzIGZvcm1hdAorCQkjIHRvIGVhc2UgbWlncmF0aW9uLgorCQllbHNpZiAoL14oXHcrKTooWyciXT8pKC4rPylcMlxzKiQvKSB7CisJCQlteSAkbWFwcGVkOworCQkJKCR1c2VyLCAkbWFwcGVkKSA9ICgkMSwgJDMpOworCQkJaWYgKCRtYXBwZWQgPX4gL15ccyooLio/KVxzKjwoLiopPlxzKiQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDE7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQyOworCQkJfQorCQkJZWxzaWYgKCRtYXBwZWQgPX4gL148PyguKik+PyQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJHVzZXI7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQxOworCQkJfQorCQl9CisJCSMgTkVFRFNXT1JLOiBNYXliZSB3YXJuIG9uIHVucmVjb2duaXplZCBsaW5lcz8KKwl9CisJY2xvc2UgKCRmKTsKK30KKworc3ViIHdyaXRlX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJb3BlbiBteSAkZiwgJz4nLCAkZmlsZSBvcgorCSAgZGllKCJGYWlsZWQgdG8gb3BlbiAkZmlsZSBmb3Igd3JpdGluZzogJCEiKTsKKworCWZvcmVhY2ggKGtleXMgJWNvbnZfYXV0aG9yX25hbWUpIHsKKwkJcHJpbnQgJGYgIiRfPSRjb252X2F1dGhvcl9uYW1leyRffSA8JGNvbnZfYXV0aG9yX2VtYWlseyRffT5cbiI7CisJfQorCWNsb3NlICgkZik7Cit9CisKKyMgY29udmVydCBnZXRvcHRzIHNwZWNzIGZvciB1c2UgYnkgZ2l0LXJlcG8tY29uZmlnCitzdWIgcmVhZF9yZXBvX2NvbmZpZyB7CisgICAgIyBTcGxpdCB0aGUgc3RyaW5nIGJldHdlZW4gY2hhcmFjdGVycywgdW5sZXNzIHRoZXJlIGlzIGEgJzonCisgICAgIyBTbyAiYWJjOmRlIiBiZWNvbWVzIFsiYSIsICJiIiwgImM6IiwgImQiLCAiZSJdCisJbXkgQG9wdHMgPSBzcGxpdCgvICooPyE6KS8sIHNoaWZ0KTsKKwlmb3JlYWNoIG15ICRvIChAb3B0cykgeworCQlteSAka2V5ID0gJG87CisJCSRrZXkgPX4gcy86Ly9nOworCQlteSAkYXJnID0gJ2dpdC1yZXBvLWNvbmZpZyc7CisJCSRhcmcgLj0gJyAtLWJvb2wnIGlmICgkbyAhfiAvOiQvKTsKKworICAgICAgICBjaG9tcChteSAkdG1wID0gYCRhcmcgLS1nZXQgY3ZzaW1wb3J0LiRrZXlgKTsKKwkJaWYgKCR0bXAgJiYgISgkYXJnID1+IC8tLWJvb2wvICYmICR0bXAgZXEgJ2ZhbHNlJykpIHsKKyAgICAgICAgICAgIG5vIHN0cmljdCAncmVmcyc7CisgICAgICAgICAgICBteSAkb3B0X25hbWUgPSAib3B0XyIgLiAka2V5OworICAgICAgICAgICAgaWYgKCEkJG9wdF9uYW1lKSB7CisgICAgICAgICAgICAgICAgJCRvcHRfbmFtZSA9ICR0bXA7CisgICAgICAgICAgICB9CisJCX0KKwl9CisgICAgaWYgKEBBUkdWID09IDApIHsKKyAgICAgICAgY2hvbXAobXkgJG1vZHVsZSA9IGBnaXQtcmVwby1jb25maWcgLS1nZXQgY3ZzaW1wb3J0Lm1vZHVsZWApOworICAgICAgICBwdXNoKEBBUkdWLCAkbW9kdWxlKTsKKyAgICB9Cit9CisKK215ICRvcHRzID0gImhhaXZta3VvOmQ6cDpDOno6czpNOlA6QTpTOkw6IjsKK3JlYWRfcmVwb19jb25maWcoJG9wdHMpOworZ2V0b3B0cygkb3B0cykgb3IgdXNhZ2UoKTsKK3VzYWdlIGlmICRvcHRfaDsKKworQEFSR1YgPD0gMSBvciB1c2FnZSgiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBDVlMgbW9kdWxlIik7CisKK2lmICgkb3B0X2QpIHsKKwkkRU5WeyJDVlNST09UIn0gPSAkb3B0X2Q7Cit9IGVsc2lmICgtZiAnQ1ZTL1Jvb3QnKSB7CisJb3BlbiBteSAkZiwgJzwnLCAnQ1ZTL1Jvb3QnIG9yIGRpZSAnRmFpbGVkIHRvIG9wZW4gQ1ZTL1Jvb3QnOworCSRvcHRfZCA9IDwkZj47CisJY2hvbXAgJG9wdF9kOworCWNsb3NlICRmOworCSRFTlZ7IkNWU1JPT1QifSA9ICRvcHRfZDsKK30gZWxzaWYgKCRFTlZ7IkNWU1JPT1QifSkgeworCSRvcHRfZCA9ICRFTlZ7IkNWU1JPT1QifTsKK30gZWxzZSB7CisJdXNhZ2UoIkNWU1JPT1QgbmVlZHMgdG8gYmUgc2V0Iik7Cit9Ciskb3B0X28gfHw9ICJvcmlnaW4iOworJG9wdF9zIHx8PSAiLSI7Ciskb3B0X2EgfHw9IDA7CisKK215ICRnaXRfdHJlZSA9ICRvcHRfQzsKKyRnaXRfdHJlZSB8fD0gIi4iOworCitteSAkY3ZzX3RyZWU7CitpZiAoJCNBUkdWID09IDApIHsKKwkkY3ZzX3RyZWUgPSAkQVJHVlswXTsKK30gZWxzaWYgKC1mICdDVlMvUmVwb3NpdG9yeScpIHsKKwlvcGVuIG15ICRmLCAnPCcsICdDVlMvUmVwb3NpdG9yeScgb3IgCisJICAgIGRpZSAnRmFpbGVkIHRvIG9wZW4gQ1ZTL1JlcG9zaXRvcnknOworCSRjdnNfdHJlZSA9IDwkZj47CisJY2hvbXAgJGN2c190cmVlOworCWNsb3NlICRmOworfSBlbHNlIHsKKwl1c2FnZSgiQ1ZTIG1vZHVsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIik7Cit9CisKK291ciBAbWVyZ2VyeCA9ICgpOworaWYgKCRvcHRfbSkgeworCUBtZXJnZXJ4ID0gKCBxci9cVyg/OmZyb218b2Z8bWVyZ2V8bWVyZ2luZ3xtZXJnZWQpIChcdyspL2kgKTsKK30KK2lmICgkb3B0X00pIHsKKwlwdXNoIChAbWVyZ2VyeCwgcXIvJG9wdF9NLyk7Cit9CisKKyMgUmVtZW1iZXIgVVRDIG9mIG91ciBzdGFydGluZyB0aW1lCisjIHdlJ2xsIHdhbnQgdG8gYXZvaWQgaW1wb3J0aW5nIGNvbW1pdHMKKyMgdGhhdCBhcmUgdG9vIHJlY2VudAorb3VyICRzdGFydHRpbWUgPSB0aW1lKCk7CisKK3NlbGVjdChTVERFUlIpOyAkfD0xOyBzZWxlY3QoU1RET1VUKTsKKworCitwYWNrYWdlIENWU2Nvbm47CisjIEJhc2ljIENWUyBkaWFsb2cuCisjIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb25uZWN0aW5nIGFuZCBkb3dubG9hZGluZywgc28gLi4uCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIpOworCitzdWIgbmV3IHsKKwlteSAoJHdoYXQsJHJlcG8sJHN1YmRpcikgPSBAXzsKKwkkd2hhdD1yZWYoJHdoYXQpIGlmIHJlZigkd2hhdCk7CisKKwlteSAkc2VsZiA9IHt9OworCSRzZWxmLT57J2J1ZmZlcid9ID0gIiI7CisJYmxlc3MoJHNlbGYsJHdoYXQpOworCisJJHJlcG8gPX4gcyMvKyQjIzsKKwkkc2VsZi0+eydmdWxscmVwJ30gPSAkcmVwbzsKKwkkc2VsZi0+Y29ubigpOworCisJJHNlbGYtPnsnc3ViZGlyJ30gPSAkc3ViZGlyOworCSRzZWxmLT57J2xpbmVzJ30gPSB1bmRlZjsKKworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGNvbm4geworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHJlcG8gPSAkc2VsZi0+eydmdWxscmVwJ307CisJaWYgKCRyZXBvID1+IHMvXjpwc2VydmVyKD86KFteOl0qKSk6KD86KC4qPykoPzo6KC4qPykpP0ApPyhbXjpcL10qKSg/OjooXGQqKSk/Ly8pIHsKKwkJbXkgKCRwYXJhbSwkdXNlciwkcGFzcywkc2VydiwkcG9ydCkgPSAoJDEsJDIsJDMsJDQsJDUpOworCisJCW15ICgkcHJveHlob3N0LCRwcm94eXBvcnQpOworCQlpZiAoJHBhcmFtICYmICgkcGFyYW0gPX4gbS9wcm94eT0oW147XSspLykpIHsKKwkJCSRwcm94eWhvc3QgPSAkMTsKKwkJCSMgRGVmYXVsdCBwcm94eXBvcnQsIGlmIG5vdCBzcGVjaWZpZWQsIGlzIDgwODAuCisJCQkkcHJveHlwb3J0ID0gODA4MDsKKwkJCWlmICgkRU5WeyJDVlNfUFJPWFlfUE9SVCJ9KSB7CisJCQkJJHByb3h5cG9ydCA9ICRFTlZ7IkNWU19QUk9YWV9QT1JUIn07CisJCQl9CisJCQlpZiAoJHBhcmFtID1+IG0vcHJveHlwb3J0PShbXjtdKykvKSB7CisJCQkJJHByb3h5cG9ydCA9ICQxOworCQkJfQorCQl9CisKKwkJJHVzZXI9ImFub255bW91cyIgdW5sZXNzIGRlZmluZWQgJHVzZXI7CisJCW15ICRycjIgPSAiLSI7CisJCXVubGVzcyAoJHBvcnQpIHsKKwkJCSRycjIgPSAiOnBzZXJ2ZXI6JHVzZXJcQCRzZXJ2OiRyZXBvIjsKKwkJCSRwb3J0PTI0MDE7CisJCX0KKwkJbXkgJHJyID0gIjpwc2VydmVyOiR1c2VyXEAkc2VydjokcG9ydCRyZXBvIjsKKworCQl1bmxlc3MgKCRwYXNzKSB7CisJCQlvcGVuKEgsJEVOVnsnSE9NRSd9LiIvLmN2c3Bhc3MiKSBhbmQgZG8geworCQkJCSMgOnBzZXJ2ZXI6Y3ZzQG1lYS50bXQudGVsZS5maTovY3Zzcm9vdC96bWFpbGVyIEFoPFoKKwkJCQl3aGlsZSAoPEg+KSB7CisJCQkJCWNob21wOworCQkJCQlzL15cL1xkK1xzKy8vOworCQkJCQlteSAoJHcsJHApID0gc3BsaXQoL1xzLywkXywyKTsKKwkJCQkJaWYgKCR3IGVxICRyciBvciAkdyBlcSAkcnIyKSB7CisJCQkJCQkkcGFzcyA9ICRwOworCQkJCQkJbGFzdDsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCX0KKwkJJHBhc3M9IkEiIHVubGVzcyAkcGFzczsKKworCQlteSAoJHMsICRyZXApOworCQlpZiAoJHByb3h5aG9zdCkgeworCisJCQkjIFVzZSBhIEhUVFAgUHJveHkuIE9ubHkgd29ya3MgZm9yIEhUVFAgcHJveGllcyB0aGF0CisJCQkjIGRvbid0IHJlcXVpcmUgdXNlciBhdXRoZW50aWNhdGlvbgorCQkJIworCQkJIyBTZWU6IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI4MTcudHh0CisKKwkJCSRzID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJIb3N0ID0+ICRwcm94eWhvc3QsIFBlZXJQb3J0ID0+ICRwcm94eXBvcnQpOworCQkJZGllICJTb2NrZXQgdG8gJHByb3h5aG9zdDogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHM7CisJCQkkcy0+d3JpdGUoIkNPTk5FQ1QgJHNlcnY6JHBvcnQgSFRUUC8xLjFcclxuSG9zdDogJHNlcnY6JHBvcnRcclxuXHJcbiIpCisJICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGllICJXcml0ZSB0byAkcHJveHlob3N0OiAkIVxuIjsKKwkgICAgICAgICAgICAgICAgJHMtPmZsdXNoKCk7CisKKwkJCSRyZXAgPSA8JHM+OworCisJCQkjIFRoZSBhbnN3ZXIgc2hvdWxkIGxvb2sgbGlrZSAnSFRUUC8xLnggMnl5IC4uLi4nCisJCQlpZiAoISgkcmVwID1+IG0jXkhUVFAvMVwuLiAyWzAtOV1bMC05XSMpKSB7CisJCQkJZGllICJQcm94eSBjb25uZWN0OiAkcmVwXG4iOworCQkJfQorCQkJIyBTa2lwIHVwIHRvIHRoZSBlbXB0eSBsaW5lIG9mIHRoZSBwcm94eSBzZXJ2ZXIgb3V0cHV0CisJCQkjIGluY2x1ZGluZyB0aGUgcmVzcG9uc2UgaGVhZGVycy4KKwkJCXdoaWxlICgkcmVwID0gPCRzPikgeworCQkJCWxhc3QgaWYgKCFkZWZpbmVkICRyZXAgfHwKKwkJCQkJICRyZXAgZXEgIlxuIiB8fAorCQkJCQkgJHJlcCBlcSAiXHJcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJJHMgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckhvc3QgPT4gJHNlcnYsIFBlZXJQb3J0ID0+ICRwb3J0KTsKKwkJCWRpZSAiU29ja2V0IHRvICRzZXJ2OiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkczsKKwkJfQorCisJCSRzLT53cml0ZSgiQkVHSU4gQVVUSCBSRVFVRVNUXG4kcmVwb1xuJHVzZXJcbiRwYXNzXG5FTkQgQVVUSCBSRVFVRVNUXG4iKQorCQkJb3IgZGllICJXcml0ZSB0byAkc2VydjogJCFcbiI7CisJCSRzLT5mbHVzaCgpOworCisJCSRyZXAgPSA8JHM+OworCisJCWlmICgkcmVwIG5lICJJIExPVkUgWU9VXG4iKSB7CisJCQkkcmVwPSI8dW5rbm93bj4iIHVubGVzcyAkcmVwOworCQkJZGllICJBdXRoUmVwbHk6ICRyZXBcbiI7CisJCX0KKwkJJHNlbGYtPnsnc29ja2V0byd9ID0gJHM7CisJCSRzZWxmLT57J3NvY2tldGknfSA9ICRzOworCX0gZWxzZSB7ICMgbG9jYWwgb3IgZXh0OiBGb3JrIG9mZiBvdXIgb3duIGN2cyBzZXJ2ZXIuCisJCW15ICRwciA9IElPOjpQaXBlLT5uZXcoKTsKKwkJbXkgJHB3ID0gSU86OlBpcGUtPm5ldygpOworCQlteSAkcGlkID0gZm9yaygpOworCQlkaWUgIkZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCW15ICRjdnMgPSAnY3ZzJzsKKwkJJGN2cyA9ICRFTlZ7Q1ZTX1NFUlZFUn0gaWYgZXhpc3RzICRFTlZ7Q1ZTX1NFUlZFUn07CisJCW15ICRyc2ggPSAncnNoJzsKKwkJJHJzaCA9ICRFTlZ7Q1ZTX1JTSH0gaWYgZXhpc3RzICRFTlZ7Q1ZTX1JTSH07CisKKwkJbXkgQGN2cyA9ICgkY3ZzLCAnc2VydmVyJyk7CisJCW15ICgkbG9jYWwsICR1c2VyLCAkaG9zdCk7CisJCSRsb2NhbCA9ICRyZXBvID1+IHMvOmxvY2FsOi8vOworCQlpZiAoISRsb2NhbCkgeworCQkgICAgJHJlcG8gPX4gcy86ZXh0Oi8vOworCQkgICAgJGxvY2FsID0gISgkcmVwbyA9fiBzL14oPzooW15cQDpdKylcQCk/KFteOl0rKTovLyk7CisJCSAgICAoJHVzZXIsICRob3N0KSA9ICgkMSwgJDIpOworCQl9CisJCWlmICghJGxvY2FsKSB7CisJCSAgICBpZiAoJHVzZXIpIHsKKwkJCXVuc2hpZnQgQGN2cywgJHJzaCwgJy1sJywgJHVzZXIsICRob3N0OworCQkgICAgfSBlbHNlIHsKKwkJCXVuc2hpZnQgQGN2cywgJHJzaCwgJGhvc3Q7CisJCSAgICB9CisJCX0KKworCQl1bmxlc3MgKCRwaWQpIHsKKwkJCSRwci0+d3JpdGVyKCk7CisJCQkkcHctPnJlYWRlcigpOworCQkJZHVwMigkcHctPmZpbGVubygpLDApOworCQkJZHVwMigkcHItPmZpbGVubygpLDEpOworCQkJJHByLT5jbG9zZSgpOworCQkJJHB3LT5jbG9zZSgpOworCQkJZXhlYyhAY3ZzKTsKKwkJfQorCQkkcHctPndyaXRlcigpOworCQkkcHItPnJlYWRlcigpOworCQkkc2VsZi0+eydzb2NrZXRvJ30gPSAkcHc7CisJCSRzZWxmLT57J3NvY2tldGknfSA9ICRwcjsKKwl9CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiUm9vdCAkcmVwb1xuIik7CisKKwkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoYXQgdGhpcyBwcm9iYWJseSBpcyB0aGUgbWluaW11bSBzZXQKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW9kZSBNIE1iaW5hcnkgRSBDaGVja2VkLWluIENyZWF0ZWQgVXBkYXRlZCBNZXJnZWQgUmVtb3ZlZFxuIik7CisKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJ2YWxpZC1yZXF1ZXN0c1xuIik7CisJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpOworCisJY2hvbXAobXkgJHJlcD0kc2VsZi0+cmVhZGxpbmUoKSk7CisJaWYgKCRyZXAgIX4gcy9eVmFsaWQtcmVxdWVzdHNccyovLykgeworCQkkcmVwPSI8dW5rbm93bj4iIHVubGVzcyAkcmVwOworCQlkaWUgIkV4cGVjdGVkIFZhbGlkLXJlcXVlc3RzIGZyb20gc2VydmVyLCBidXQgZ290OiAkcmVwXG4iOworCX0KKwljaG9tcChteSAkcmVzPSRzZWxmLT5yZWFkbGluZSgpKTsKKwlkaWUgInZhbGlkUmVwbHk6ICRyZXNcbiIgaWYgJHJlcyBuZSAib2siOworCisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVXNlVW5jaGFuZ2VkXG4iKSBpZiAkcmVwID1+IC9cYlVzZVVuY2hhbmdlZFxiLzsKKwkkc2VsZi0+eydyZXBvJ30gPSAkcmVwbzsKK30KKworc3ViIHJlYWRsaW5lIHsKKwlteSAoJHNlbGYpID0gQF87CisJcmV0dXJuICRzZWxmLT57J3NvY2tldGknfS0+Z2V0bGluZSgpOworfQorCitzdWIgX2ZpbGUgeworCSMgUmVxdWVzdCBhIGZpbGUgd2l0aCBhIGdpdmVuIHJldmlzaW9uLgorCSMgVHJpYWwgYW5kIGVycm9yIHNheXMgdGhpcyBpcyBhIGdvb2Qgd2F5IHRvIGRvIGl0LiA6LS8KKwlteSAoJHNlbGYsJGZuLCRyZXYpID0gQF87CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLU5cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtUFxuIikgb3IgcmV0dXJuIHVuZGVmOworCSMgLWtrOiBMaW51cycgdmVyc2lvbiBkb2Vzbid0IHVzZSBpdCAtIGRlZmF1bHRzIHRvIG9mZgorCWlmICgkb3B0X2spIHsKKwkgICAgJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLWtrXG4iKSBvciByZXR1cm4gdW5kZWY7CisJfQorCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1yXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgJHJldlxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC0tXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgJHNlbGYtPnsnc3ViZGlyJ30vJGZuXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiRGlyZWN0b3J5IC5cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCIkc2VsZi0+eydyZXBvJ31cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkjICRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlN0aWNreSBUMS4wXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiY29cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPmZsdXNoKCkgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J2xpbmVzJ30gPSAwOworCXJldHVybiAxOworfQorc3ViIF9saW5lIHsKKwkjIFJlYWQgYSBsaW5lIGZyb20gdGhlIHNlcnZlci4KKwkjIC4uLiBleGNlcHQgdGhhdCAnbGluZScgbWF5IGJlIGFuIGVudGlyZSBmaWxlLiA7LSkKKwlteSAoJHNlbGYsICRmaCkgPSBAXzsKKwlkaWUgIk5vdCBpbiBsaW5lcyIgdW5sZXNzIGRlZmluZWQgJHNlbGYtPnsnbGluZXMnfTsKKworCW15ICRsaW5lOworCW15ICRyZXM9MDsKKwl3aGlsZSAoZGVmaW5lZCgkbGluZSA9ICRzZWxmLT5yZWFkbGluZSgpKSkgeworCQkjIE0gVSBnbnVwZy1jdnMtcmVwL0FVVEhPUlMKKwkJIyBVcGRhdGVkIGdudXBnLWN2cy1yZXAvCisJCSMgL2RhdGVuL3NyYy9yc3luYy9nbnVwZy1jdnMtcmVwL0FVVEhPUlMKKwkJIyAvQVVUSE9SUy8xLjEvLy9UMS4xCisJCSMgdT1ydyxnPXJ3LG89cncKKwkJIyAwCisJCSMgb2sKKworCQlpZiAoJGxpbmUgPX4gcy9eKD86Q3JlYXRlZHxVcGRhdGVkKSAvLykgeworCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBwYXRoCisJCQkkbGluZSA9ICRzZWxmLT5yZWFkbGluZSgpOyAjIEVudHJpZXMgbGluZQorCQkJbXkgJG1vZGUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgY2hvbXAgJG1vZGU7CisJCQkkc2VsZi0+eydtb2RlJ30gPSAkbW9kZTsKKwkJCWRlZmluZWQgKG15ICRjbnQgPSAkc2VsZi0+cmVhZGxpbmUoKSkKKwkJCQlvciBkaWUgIkVPRiBmcm9tIHNlcnZlciBhZnRlciAnQ2hhbmdlZCdcbiI7CisJCQljaG9tcCAkY250OworCQkJZGllICJEdWg6IEZpbGVzaXplICRjbnQiIGlmICRjbnQgIX4gL15cZCskLzsKKwkJCSRsaW5lPSIiOworCQkJJHJlcyA9ICRzZWxmLT5fZmV0Y2hmaWxlKCRmaCwgJGNudCk7CisJCX0gZWxzaWYgKCRsaW5lID1+IHMvXiAvLykgeworCQkJcHJpbnQgJGZoICRsaW5lOworCQkJJHJlcyArPSBsZW5ndGgoJGxpbmUpOworCQl9IGVsc2lmICgkbGluZSA9fiAvXk1cYi8pIHsKKwkJCSMgb3V0cHV0LCBkbyBub3RoaW5nCisJCX0gZWxzaWYgKCRsaW5lID1+IC9eTWJpbmFyeVxiLykgeworCQkJbXkgJGNudDsKKwkJCWRpZSAiRU9GIGZyb20gc2VydmVyIGFmdGVyICdNYmluYXJ5JyIgdW5sZXNzIGRlZmluZWQgKCRjbnQgPSAkc2VsZi0+cmVhZGxpbmUoKSk7CisJCQljaG9tcCAkY250OworCQkJZGllICJEdWg6IE1iaW5hcnkgJGNudCIgaWYgJGNudCAhfiAvXlxkKyQvIG9yICRjbnQ8MTsKKwkJCSRsaW5lPSIiOworCQkJJHJlcyArPSAkc2VsZi0+X2ZldGNoZmlsZSgkZmgsICRjbnQpOworCQl9IGVsc2UgeworCQkJY2hvbXAgJGxpbmU7CisJCQlpZiAoJGxpbmUgZXEgIm9rIikgeworCQkJCSMgcHJpbnQgU1RERVJSICJTOiBvayAoIi5sZW5ndGgoJHJlcykuIilcbiI7CisJCQkJcmV0dXJuICRyZXM7CisJCQl9IGVsc2lmICgkbGluZSA9fiBzL15FIC8vKSB7CisJCQkJIyBwcmludCBTVERFUlIgIlM6ICRsaW5lXG4iOworCQkJfSBlbHNpZiAoJGxpbmUgPX4gL14oUmVtb3ZlLWVudHJ5fFJlbW92ZWQpIC9pKSB7CisJCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBmaWxlbmFtZQorCQkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgT0sKKwkJCQljaG9tcCAkbGluZTsKKwkJCQlkaWUgIlVua25vd246ICRsaW5lIiBpZiAkbGluZSBuZSAib2siOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJZGllICJVbmtub3duOiAkbGluZVxuIjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdW5kZWY7Cit9CitzdWIgZmlsZSB7CisJbXkgKCRzZWxmLCRmbiwkcmV2KSA9IEBfOworCW15ICRyZXM7CisKKwlteSAoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0Y3ZzLlhYWFhYWCcsIAorCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLCBVTkxJTksgPT4gMSk7CisKKwkkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIGFuZCAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisKKwlpZiAoIWRlZmluZWQgJHJlcykgeworCSAgICBwcmludCBTVERFUlIgIlNlcnZlciBoYXMgZ29uZSBhd2F5IHdoaWxlIGZldGNoaW5nICRmbiAkcmV2LCByZXRyeWluZy4uLlxuIjsKKwkgICAgdHJ1bmNhdGUgJGZoLCAwOworCSAgICAkc2VsZi0+Y29ubigpOworCSAgICAkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIG9yIGRpZSAiTm8gZmlsZSBjb21tYW5kIHNlbmQiOworCSAgICAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisJICAgIGRpZSAiUmV0cnkgZmFpbGVkIiB1bmxlc3MgZGVmaW5lZCAkcmVzOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRyZXMpOworfQorc3ViIF9mZXRjaGZpbGUgeworCW15ICgkc2VsZiwgJGZoLCAkY250KSA9IEBfOworCW15ICRyZXMgPSAwOworCW15ICRidWZzaXplID0gMTAyNCAqIDEwMjQ7CisJd2hpbGUgKCRjbnQpIHsKKwkgICAgaWYgKCRidWZzaXplID4gJGNudCkgeworCQkkYnVmc2l6ZSA9ICRjbnQ7CisJICAgIH0KKwkgICAgbXkgJGJ1ZjsKKwkgICAgbXkgJG51bSA9ICRzZWxmLT57J3NvY2tldGknfS0+cmVhZCgkYnVmLCRidWZzaXplKTsKKwkgICAgZGllICJTZXJ2ZXI6IEZpbGVzaXplICRjbnQ6ICRudW06ICQhXG4iIGlmIG5vdCBkZWZpbmVkICRudW0gb3IgJG51bTw9MDsKKwkgICAgcHJpbnQgJGZoICRidWY7CisJICAgICRyZXMgKz0gJG51bTsKKwkgICAgJGNudCAtPSAkbnVtOworCX0KKwlyZXR1cm4gJHJlczsKK30KKworCitwYWNrYWdlIG1haW47CisKK215ICRjdnMgPSBDVlNjb25uLT5uZXcoJG9wdF9kLCAkY3ZzX3RyZWUpOworCisKK3N1YiBwZGF0ZSgkKSB7CisJbXkgKCRkKSA9IEBfOworCW0jKFxkezIsNH0pLyhcZFxkKS8oXGRcZClccyhcZFxkKTooXGRcZCkoPzo6KFxkXGQpKT8jCisJCW9yIGRpZSAiVW5wYXJzZWFibGUgZGF0ZTogJGRcbiI7CisJbXkgJHk9JDE7ICR5LT0xOTAwIGlmICR5PjE5MDA7CisJcmV0dXJuIHRpbWVnbSgkNnx8MCwkNSwkNCwkMywkMi0xLCR5KTsKK30KKworc3ViIHBtb2RlKCQpIHsKKwlteSAoJG1vZGUpID0gQF87CisJbXkgJG0gPSAwOworCW15ICRtbSA9IDA7CisJbXkgJHVtID0gMDsKKwlmb3IgbXkgJHgoc3BsaXQoLy8sJG1vZGUpKSB7CisJCWlmICgkeCBlcSAiLCIpIHsKKwkJCSRtIHw9ICRtbSYkdW07CisJCQkkbW0gPSAwOworCQkJJHVtID0gMDsKKwkJfSBlbHNpZiAoJHggZXEgInUiKSB7ICR1bSB8PSAwNzAwOworCQl9IGVsc2lmICgkeCBlcSAiZyIpIHsgJHVtIHw9IDAwNzA7CisJCX0gZWxzaWYgKCR4IGVxICJvIikgeyAkdW0gfD0gMDAwNzsKKwkJfSBlbHNpZiAoJHggZXEgInIiKSB7ICRtbSB8PSAwNDQ0OworCQl9IGVsc2lmICgkeCBlcSAidyIpIHsgJG1tIHw9IDAyMjI7CisJCX0gZWxzaWYgKCR4IGVxICJ4IikgeyAkbW0gfD0gMDExMTsKKwkJfSBlbHNpZiAoJHggZXEgIj0iKSB7ICMgZG8gbm90aGluZworCQl9IGVsc2UgeyBkaWUgIlVua25vd24gbW9kZTogJG1vZGVcbiI7CisJCX0KKwl9CisJJG0gfD0gJG1tJiR1bTsKKwlyZXR1cm4gJG07Cit9CisKK3N1YiBnZXR3ZCgpIHsKKwlteSAkcHdkID0gYHB3ZGA7CisJY2hvbXAgJHB3ZDsKKwlyZXR1cm4gJHB3ZDsKK30KKworc3ViIGlzX3NoYTEgeworCW15ICRzID0gc2hpZnQ7CisJcmV0dXJuICRzID1+IC9eW2EtZjAtOV17NDB9JC87Cit9CisKK3N1YiBnZXRfaGVhZHJlZiAoJCQpIHsKKyAgICBteSAkbmFtZSAgICA9IHNoaWZ0OworICAgIG15ICRnaXRfZGlyID0gc2hpZnQ7IAorICAgIAorICAgIG15ICRmID0gIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG5hbWUiOworICAgIGlmIChvcGVuKG15ICRmaCwgJGYpKSB7CisJICAgIGNob21wKG15ICRyID0gPCRmaD4pOworCSAgICBpc19zaGExKCRyKSBvciBkaWUgIkNhbm5vdCBnZXQgaGVhZCBpZCBmb3IgJG5hbWUgKCRyKTogJCEiOworCSAgICByZXR1cm4gJHI7CisgICAgfQorICAgIGRpZSAidW5hYmxlIHRvIG9wZW4gJGY6ICQhIiB1bmxlc3MgJCEgPT0gUE9TSVg6OkVOT0VOVDsKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKy1kICRnaXRfdHJlZQorCW9yIG1rZGlyKCRnaXRfdHJlZSwwNzc3KQorCW9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkZ2l0X3RyZWU6ICQhIjsKK2NoZGlyKCRnaXRfdHJlZSk7CisKK215ICRsYXN0X2JyYW5jaCA9ICIiOworbXkgJG9yaWdfYnJhbmNoID0gIiI7CitteSAlYnJhbmNoX2RhdGU7CitteSAkdGlwX2F0X3N0YXJ0ID0gdW5kZWY7CisKK215ICRnaXRfZGlyID0gJEVOVnsiR0lUX0RJUiJ9IHx8ICIuZ2l0IjsKKyRnaXRfZGlyID0gZ2V0d2QoKS4iLyIuJGdpdF9kaXIgdW5sZXNzICRnaXRfZGlyID1+IG0jXi8jOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkb3JpZ19naXRfaW5kZXg7Ciskb3JpZ19naXRfaW5kZXggPSAkRU5We0dJVF9JTkRFWF9GSUxFfSBpZiBleGlzdHMgJEVOVntHSVRfSU5ERVhfRklMRX07CisKK215ICVpbmRleDsgIyBob2xkcyBmaWxlbmFtZXMgb2Ygb25lIGluZGV4IHBlciBicmFuY2gKKwordW5sZXNzICgtZCAkZ2l0X2RpcikgeworCXN5c3RlbSgiZ2l0LWluaXQiKTsKKwlkaWUgIkNhbm5vdCBpbml0IHRoZSBHSVQgZGIgYXQgJGdpdF90cmVlOiAkP1xuIiBpZiAkPzsKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiKTsKKwlkaWUgIkNhbm5vdCBpbml0IGFuIGVtcHR5IHRyZWU6ICQ/XG4iIGlmICQ/OworCisJJGxhc3RfYnJhbmNoID0gJG9wdF9vOworCSRvcmlnX2JyYW5jaCA9ICIiOworfSBlbHNlIHsKKwlvcGVuKEYsICJnaXQtc3ltYm9saWMtcmVmIEhFQUQgfCIpIG9yCisJCWRpZSAiQ2Fubm90IHJ1biBnaXQtc3ltYm9saWMtcmVmOiAkIVxuIjsKKwljaG9tcCAoJGxhc3RfYnJhbmNoID0gPEY+KTsKKwkkbGFzdF9icmFuY2ggPSBiYXNlbmFtZSgkbGFzdF9icmFuY2gpOworCWNsb3NlKEYpOworCXVubGVzcyAoJGxhc3RfYnJhbmNoKSB7CisJCXdhcm4gIkNhbm5vdCByZWFkIHRoZSBsYXN0IGJyYW5jaCBuYW1lOiAkISAtLSBhc3N1bWluZyAnbWFzdGVyJ1xuIjsKKwkJJGxhc3RfYnJhbmNoID0gIm1hc3RlciI7CisJfQorCSRvcmlnX2JyYW5jaCA9ICRsYXN0X2JyYW5jaDsKKwkkdGlwX2F0X3N0YXJ0ID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGA7CisKKwkjIEdldCB0aGUgbGFzdCBpbXBvcnQgdGltZXN0YW1wcworCW15ICRmbXQgPSAnKCRyZWYsICRhdXRob3IpID0gKCUocmVmbmFtZSksICUoYXV0aG9yKSk7JzsKKwlvcGVuKEgsICJnaXQtZm9yLWVhY2gtcmVmIC0tcGVybCAtLWZvcm1hdD0nJGZtdCcgcmVmcy9oZWFkcyB8Iikgb3IKKwkJZGllICJDYW5ub3QgcnVuIGdpdC1mb3ItZWFjaC1yZWY6ICQhXG4iOworCXdoaWxlIChkZWZpbmVkKG15ICRlbnRyeSA9IDxIPikpIHsKKwkJbXkgKCRyZWYsICRhdXRob3IpOworCQlldmFsKCRlbnRyeSkgfHwgZGllICJjYW5ub3QgZXZhbCByZWZzIGxpc3Q6ICRAIjsKKwkJbXkgKCRoZWFkKSA9ICgkcmVmID1+IG18XnJlZnMvaGVhZHMvKC4qKXwpOworCQkkYXV0aG9yID1+IC9eLipccyhcZCspXHNbLStdXGR7NH0kLzsKKwkJJGJyYW5jaF9kYXRleyRoZWFkfSA9ICQxOworCX0KKwljbG9zZShIKTsKKyAgICAgICAgaWYgKCFleGlzdHMgJGJyYW5jaF9kYXRleyRvcHRfb30pIHsKKwkJZGllICJCcmFuY2ggJyRvcHRfbycgZG9lcyBub3QgZXhpc3QuXG4iLgorCQkgICAgICAgIkVpdGhlciB1c2UgdGhlIGNvcnJlY3QgJy1vIGJyYW5jaCcgb3B0aW9uLFxuIi4KKwkJICAgICAgICJvciBpbXBvcnQgdG8gYSBuZXcgcmVwb3NpdG9yeS5cbiI7CisgICAgICAgIH0KK30KKworLWQgJGdpdF9kaXIKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgZ2l0IHN1YmRpciAoJGdpdF9kaXIpLlxuIjsKKworIyBub3cgd2UgcmVhZCAoYW5kIHBvc3NpYmx5IHNhdmUpIGF1dGhvci1pbmZvIGFzIHdlbGwKKy1mICIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIgYW5kCisgIHJlYWRfYXV0aG9yX2luZm8oIiRnaXRfZGlyL2N2cy1hdXRob3JzIik7CitpZiAoJG9wdF9BKSB7CisJcmVhZF9hdXRob3JfaW5mbygkb3B0X0EpOworCXdyaXRlX2F1dGhvcl9pbmZvKCIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIpOworfQorCisKKyMKKyMgcnVuIGN2c3BzIGludG8gYSBmaWxlIHVubGVzcyB3ZSBhcmUgZ2V0dGluZworIyBpdCBwYXNzZWQgYXMgYSBmaWxlIHZpYSAkb3B0X1AKKyMKK215ICRjdnNwc2ZpbGU7Cit1bmxlc3MgKCRvcHRfUCkgeworCXByaW50ICJSdW5uaW5nIGN2c3BzLi4uXG4iIGlmICRvcHRfdjsKKwlteSAkcGlkID0gb3BlbihDVlNQUywiLXwiKTsKKwlteSAkY3ZzcHNmaDsKKwlkaWUgIkNhbm5vdCBmb3JrOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCXVubGVzcyAoJHBpZCkgeworCQlteSBAb3B0OworCQlAb3B0ID0gc3BsaXQoLywvLCRvcHRfcCkgaWYgZGVmaW5lZCAkb3B0X3A7CisJCXVuc2hpZnQgQG9wdCwgJy16JywgJG9wdF96IGlmIGRlZmluZWQgJG9wdF96OworCQl1bnNoaWZ0IEBvcHQsICctcScgICAgICAgICB1bmxlc3MgZGVmaW5lZCAkb3B0X3Y7CisJCXVubGVzcyAoZGVmaW5lZCgkb3B0X3ApICYmICRvcHRfcCA9fiBtLy0tbm8tY3ZzLWRpcmVjdC8pIHsKKwkJCXB1c2ggQG9wdCwgJy0tY3ZzLWRpcmVjdCc7CisJCX0KKwkJZXhlYygiY3ZzcHMiLCItLW5vcmMiLEBvcHQsIi11IiwiLUEiLCctLXJvb3QnLCRvcHRfZCwkY3ZzX3RyZWUpOworCQlkaWUgIkNvdWxkIG5vdCBzdGFydCBjdnNwczogJCFcbiI7CisJfQorCSgkY3ZzcHNmaCwgJGN2c3BzZmlsZSkgPSB0ZW1wZmlsZSgnZ2l0WFhYWFhYJywgU1VGRklYID0+ICcuY3ZzcHMnLAorCQkJCQkgIERJUiA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSk7CisJd2hpbGUgKDxDVlNQUz4pIHsKKwkgICAgcHJpbnQgJGN2c3BzZmggJF87CisJfQorCWNsb3NlIENWU1BTOworCWNsb3NlICRjdnNwc2ZoOworfSBlbHNlIHsKKwkkY3ZzcHNmaWxlID0gJG9wdF9QOworfQorCitvcGVuKENWUywgIjwkY3ZzcHNmaWxlIikgb3IgZGllICQhOworCisjIyBjdnNwcyBvdXRwdXQ6CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjUGF0Y2hTZXQgMzE0CisjRGF0ZTogMTk5OS8wOS8xOCAxMzowMzo1OQorI0F1dGhvcjogd2tvY2gKKyNCcmFuY2g6IFNUQUJMRS1CUkFOQ0gtMS0wCisjQW5jZXN0b3IgYnJhbmNoOiBIRUFECisjVGFnOiAobm9uZSkKKyNMb2c6CisjICAgIFNlZSBDaGFuZ2VMb2c6IFNhdCBTZXAgMTggMTM6MDM6MjggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaAorI01lbWJlcnM6CisjCVJFQURNRToxLjU3LT4xLjU3LjIuMQorIwlWRVJTSU9OOjEuOTYtPjEuOTYuMi4xCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215ICRzdGF0ZSA9IDA7CisKK3N1YiB1cGRhdGVfaW5kZXggKFxAXEApIHsKKwlteSAkb2xkID0gc2hpZnQ7CisJbXkgJG5ldyA9IHNoaWZ0OworCW9wZW4obXkgJGZoLCAnfC0nLCBxdyhnaXQtdXBkYXRlLWluZGV4IC16IC0taW5kZXgtaW5mbykpCisJCW9yIGRpZSAidW5hYmxlIHRvIG9wZW4gZ2l0LXVwZGF0ZS1pbmRleDogJCEiOworCXByaW50ICRmaAorCQkobWFwIHsgIjAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFx0JF9cMCIgfQorCQkJQCRvbGQpLAorCQkobWFwIHsgJzEwMCcgLiBzcHJpbnRmKCclbycsICRfLT5bMF0pIC4gIiAkXy0+WzFdXHQkXy0+WzJdXDAiIH0KKwkJCUAkbmV3KQorCQlvciBkaWUgInVuYWJsZSB0byB3cml0ZSB0byBnaXQtdXBkYXRlLWluZGV4OiAkISI7CisJY2xvc2UgJGZoCisJCW9yIGRpZSAidW5hYmxlIHRvIHdyaXRlIHRvIGdpdC11cGRhdGUtaW5kZXg6ICQhIjsKKwkkPyBhbmQgZGllICJnaXQtdXBkYXRlLWluZGV4IHJlcG9ydGVkIGVycm9yOiAkPyI7Cit9CisKK3N1YiB3cml0ZV90cmVlICgpIHsKKwlvcGVuKG15ICRmaCwgJy18JywgcXcoZ2l0LXdyaXRlLXRyZWUpKQorCQlvciBkaWUgInVuYWJsZSB0byBvcGVuIGdpdC13cml0ZS10cmVlOiAkISI7CisJY2hvbXAobXkgJHRyZWUgPSA8JGZoPik7CisJaXNfc2hhMSgkdHJlZSkKKwkJb3IgZGllICJDYW5ub3QgZ2V0IHRyZWUgaWQgKCR0cmVlKTogJCEiOworCWNsb3NlKCRmaCkKKwkJb3IgZGllICJFcnJvciBydW5uaW5nIGdpdC13cml0ZS10cmVlOiAkP1xuIjsKKwlwcmludCAiVHJlZSBJRCAkdHJlZVxuIiBpZiAkb3B0X3Y7CisJcmV0dXJuICR0cmVlOworfQorCitteSAoJHBhdGNoc2V0LCRkYXRlLCRhdXRob3JfbmFtZSwkYXV0aG9yX2VtYWlsLCRicmFuY2gsJGFuY2VzdG9yLCR0YWcsJGxvZ21zZyk7CitteSAoQG9sZCxAbmV3LEBza2lwcGVkLCVpZ25vcmVicmFuY2gpOworCisjIGNvbW1pdHMgdGhhdCBjdnNwcyBjYW5ub3QgcGxhY2UgYW55d2hlcmUuLi4KKyRpZ25vcmVicmFuY2h7JyNDVlNQU19OT19CUkFOQ0gnfSA9IDE7CisKK3N1YiBjb21taXQgeworCWlmICgkYnJhbmNoIGVxICRvcHRfbyAmJiAhJGluZGV4e2JyYW5jaH0gJiYgIWdldF9oZWFkcmVmKCRicmFuY2gsICRnaXRfZGlyKSkgeworCSAgICAjIGxvb2tzIGxpa2UgYW4gaW5pdGlhbCBjb21taXQKKwkgICAgIyB1c2UgdGhlIGluZGV4IHByaW1lZCBieSBnaXQtaW5pdAorCSAgICAkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICIkZ2l0X2Rpci9pbmRleCI7CisJICAgICRpbmRleHskYnJhbmNofSA9ICIkZ2l0X2Rpci9pbmRleCI7CisJfSBlbHNlIHsKKwkgICAgIyB1c2UgYW4gaW5kZXggcGVyIGJyYW5jaCB0byBzcGVlZCB1cAorCSAgICAjIGltcG9ydHMgb2YgcHJvamVjdHMgd2l0aCBtYW55IGJyYW5jaGVzCisJICAgIHVubGVzcyAoJGluZGV4eyRicmFuY2h9KSB7CisJCSRpbmRleHskYnJhbmNofSA9IHRtcG5hbSgpOworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRpbmRleHskYnJhbmNofTsKKwkJaWYgKCRhbmNlc3RvcikgeworCQkgICAgc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJGFuY2VzdG9yKTsKKwkJfSBlbHNlIHsKKwkJICAgIHN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRicmFuY2gpOworCQl9CisJCWRpZSAicmVhZC10cmVlIGZhaWxlZDogJD9cbiIgaWYgJD87CisJICAgIH0KKwl9CisgICAgICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGluZGV4eyRicmFuY2h9OworCisJdXBkYXRlX2luZGV4KEBvbGQsIEBuZXcpOworCUBvbGQgPSBAbmV3ID0gKCk7CisJbXkgJHRyZWUgPSB3cml0ZV90cmVlKCk7CisJbXkgJHBhcmVudCA9IGdldF9oZWFkcmVmKCRsYXN0X2JyYW5jaCwgJGdpdF9kaXIpOworCXByaW50ICJQYXJlbnQgSUQgIiAuICgkcGFyZW50ID8gJHBhcmVudCA6ICIoZW1wdHkpIikgLiAiXG4iIGlmICRvcHRfdjsKKworCW15IEBjb21taXRfYXJnczsKKwlwdXNoIEBjb21taXRfYXJncywgKCItcCIsICRwYXJlbnQpIGlmICRwYXJlbnQ7CisKKwkjIGxvb3NlIGRldGVjdGlvbiBvZiBtZXJnZXMKKwkjIGJhc2VkIG9uIHRoZSBjb21taXQgbXNnCisJZm9yZWFjaCBteSAkcnggKEBtZXJnZXJ4KSB7CisJCW5leHQgdW5sZXNzICRsb2dtc2cgPX4gJHJ4ICYmICQxOworCQlteSAkbXBhcmVudCA9ICQxIGVxICdIRUFEJyA/ICRvcHRfbyA6ICQxOworCQlpZiAobXkgJHNoYTEgPSBnZXRfaGVhZHJlZigkbXBhcmVudCwgJGdpdF9kaXIpKSB7CisJCQlwdXNoIEBjb21taXRfYXJncywgJy1wJywgJG1wYXJlbnQ7CisJCQlwcmludCAiTWVyZ2UgcGFyZW50IGJyYW5jaDogJG1wYXJlbnRcbiIgaWYgJG9wdF92OworCQl9CisJfQorCisJbXkgJGNvbW1pdF9kYXRlID0gc3RyZnRpbWUoIiswMDAwICVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKTsKKwkkRU5We0dJVF9BVVRIT1JfTkFNRX0gPSAkYXV0aG9yX25hbWU7CisJJEVOVntHSVRfQVVUSE9SX0VNQUlMfSA9ICRhdXRob3JfZW1haWw7CisJJEVOVntHSVRfQVVUSE9SX0RBVEV9ID0gJGNvbW1pdF9kYXRlOworCSRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSA9ICRhdXRob3JfbmFtZTsKKwkkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0gJGF1dGhvcl9lbWFpbDsKKwkkRU5We0dJVF9DT01NSVRURVJfREFURX0gPSAkY29tbWl0X2RhdGU7CisJbXkgJHBpZCA9IG9wZW4yKG15ICRjb21taXRfcmVhZCwgbXkgJGNvbW1pdF93cml0ZSwKKwkJJ2dpdC1jb21taXQtdHJlZScsICR0cmVlLCBAY29tbWl0X2FyZ3MpOworCisJIyBjb21wYXRpYmlsaXR5IHdpdGggZ2l0MmN2cworCXN1YnN0cigkbG9nbXNnLDMyNzY3KSA9ICIiIGlmIGxlbmd0aCgkbG9nbXNnKSA+IDMyNzY3OworCSRsb2dtc2cgPX4gcy9bXHNcbl0rXHovLzsKKworCWlmIChAc2tpcHBlZCkgeworCSAgICAkbG9nbXNnIC49ICJcblxuXG5TS0lQUEVEOlxuXHQiOworCSAgICAkbG9nbXNnIC49IGpvaW4oIlxuXHQiLCBAc2tpcHBlZCkgLiAiXG4iOworCSAgICBAc2tpcHBlZCA9ICgpOworCX0KKworCXByaW50KCRjb21taXRfd3JpdGUgIiRsb2dtc2dcbiIpICYmIGNsb3NlKCRjb21taXRfd3JpdGUpCisJCW9yIGRpZSAiRXJyb3Igd3JpdGluZyB0byBnaXQtY29tbWl0LXRyZWU6ICQhXG4iOworCisJcHJpbnQgIkNvbW1pdHRlZCBwYXRjaCAkcGF0Y2hzZXQgKCRicmFuY2ggJGNvbW1pdF9kYXRlKVxuIiBpZiAkb3B0X3Y7CisJY2hvbXAobXkgJGNpZCA9IDwkY29tbWl0X3JlYWQ+KTsKKwlpc19zaGExKCRjaWQpIG9yIGRpZSAiQ2Fubm90IGdldCBjb21taXQgaWQgKCRjaWQpOiAkIVxuIjsKKwlwcmludCAiQ29tbWl0IElEICRjaWRcbiIgaWYgJG9wdF92OworCWNsb3NlKCRjb21taXRfcmVhZCk7CisKKwl3YWl0cGlkKCRwaWQsMCk7CisJZGllICJFcnJvciBydW5uaW5nIGdpdC1jb21taXQtdHJlZTogJD9cbiIgaWYgJD87CisKKwlzeXN0ZW0oImdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvJGJyYW5jaCAkY2lkIikgPT0gMAorCQlvciBkaWUgIkNhbm5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaCBmb3IgdXBkYXRlOiAkIVxuIjsKKworCWlmICgkdGFnKSB7CisJCW15ICgkaW4sICRvdXQpID0gKCcnLCcnKTsKKwkgICAgICAgIG15ICgkeHRhZykgPSAkdGFnOworCQkkeHRhZyA9fiBzL1xzK1wqXCouKiQvLzsgIyBSZW1vdmUgc3R1ZmYgbGlrZSAqKiBJTlZBTElEICoqIGFuZCAqKiBGVU5LWSAqKgorCQkkeHRhZyA9fiB0ci9fL1wuLyBpZiAoICRvcHRfdSApOworCQkkeHRhZyA9fiBzL1tcL10vJG9wdF9zL2c7CisJCQorCQlteSAkcGlkID0gb3BlbjIoJGluLCAkb3V0LCAnZ2l0LW1rdGFnJyk7CisJCXByaW50ICRvdXQgIm9iamVjdCAkY2lkXG4iLgorCQkgICAgInR5cGUgY29tbWl0XG4iLgorCQkgICAgInRhZyAkeHRhZ1xuIi4KKwkJICAgICJ0YWdnZXIgJGF1dGhvcl9uYW1lIDwkYXV0aG9yX2VtYWlsPlxuIgorCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJHh0YWc6ICQhXG4iOworCQljbG9zZSgkb3V0KQorCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJHh0YWc6ICQhXG4iOworCisJCW15ICR0YWdvYmogPSA8JGluPjsKKwkJY2hvbXAgJHRhZ29iajsKKworCQlpZiAoICFjbG9zZSgkaW4pIG9yIHdhaXRwaWQoJHBpZCwgMCkgIT0gJHBpZCBvcgorCQkgICAgICQ/ICE9IDAgb3IgJHRhZ29iaiAhfiAvXlswMTIzNDU2Nzg5YWJjZGVmXXs0MH0kLyApIHsKKwkJICAgIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgb2JqZWN0ICR4dGFnOiAkIVxuIjsKKwkgICAgICAgIH0KKwkJCisKKwkJb3BlbihDLCI+JGdpdF9kaXIvcmVmcy90YWdzLyR4dGFnIikKKwkJCW9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgJHh0YWc6ICQhXG4iOworCQlwcmludCBDICIkdGFnb2JqXG4iCisJCQlvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHh0YWc6ICQhXG4iOworCQljbG9zZShDKQorCQkJb3IgZGllICJDYW5ub3Qgd3JpdGUgdGFnICR4dGFnOiAkIVxuIjsKKworCQlwcmludCAiQ3JlYXRlZCB0YWcgJyR4dGFnJyBvbiAnJGJyYW5jaCdcbiIgaWYgJG9wdF92OworCX0KK307CisKK215ICRjb21taXRjb3VudCA9IDE7Cit3aGlsZSAoPENWUz4pIHsKKwljaG9tcDsKKwlpZiAoJHN0YXRlID09IDAgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKCRzdGF0ZSA9PSAwKSB7CisJCSRzdGF0ZSA9IDE7CisJCXJlZG87CisJfSBlbHNpZiAoKCRzdGF0ZT09MCBvciAkc3RhdGU9PTEpIGFuZCBzL15QYXRjaFNldFxzKy8vKSB7CisJCSRwYXRjaHNldCA9IDArJF87CisJCSRzdGF0ZT0yOworCX0gZWxzaWYgKCRzdGF0ZSA9PSAyIGFuZCBzL15EYXRlOlxzKy8vKSB7CisJCSRkYXRlID0gcGRhdGUoJF8pOworCQl1bmxlc3MgKCRkYXRlKSB7CisJCQlwcmludCBTVERFUlIgIkNvdWxkIG5vdCBwYXJzZSBkYXRlOiAkX1xuIjsKKwkJCSRzdGF0ZT0wOworCQkJbmV4dDsKKwkJfQorCQkkc3RhdGU9MzsKKwl9IGVsc2lmICgkc3RhdGUgPT0gMyBhbmQgcy9eQXV0aG9yOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQlpZiAoL14oLio/KVxzKzwoLiopPi8pIHsKKwkJICAgICgkYXV0aG9yX25hbWUsICRhdXRob3JfZW1haWwpID0gKCQxLCAkMik7CisJCX0gZWxzaWYgKCRjb252X2F1dGhvcl9uYW1leyRffSkgeworCQkJJGF1dGhvcl9uYW1lID0gJGNvbnZfYXV0aG9yX25hbWV7JF99OworCQkJJGF1dGhvcl9lbWFpbCA9ICRjb252X2F1dGhvcl9lbWFpbHskX307CisJCX0gZWxzZSB7CisJCSAgICAkYXV0aG9yX25hbWUgPSAkYXV0aG9yX2VtYWlsID0gJF87CisJCX0KKwkJJHN0YXRlID0gNDsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNCBhbmQgcy9eQnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQlzL1tcL10vJG9wdF9zL2c7CisJCSRicmFuY2ggPSAkXzsKKwkJJHN0YXRlID0gNTsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNSBhbmQgcy9eQW5jZXN0b3IgYnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQkkYW5jZXN0b3IgPSAkXzsKKwkJJGFuY2VzdG9yID0gJG9wdF9vIGlmICRhbmNlc3RvciBlcSAiSEVBRCI7CisJCSRzdGF0ZSA9IDY7CisJfSBlbHNpZiAoJHN0YXRlID09IDUpIHsKKwkJJGFuY2VzdG9yID0gdW5kZWY7CisJCSRzdGF0ZSA9IDY7CisJCXJlZG87CisJfSBlbHNpZiAoJHN0YXRlID09IDYgYW5kIHMvXlRhZzpccysvLykgeworCQlzL1xzKyQvLzsKKwkJaWYgKCRfIGVxICIobm9uZSkiKSB7CisJCQkkdGFnID0gdW5kZWY7CisJCX0gZWxzZSB7CisJCQkkdGFnID0gJF87CisJCX0KKwkJJHN0YXRlID0gNzsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNyBhbmQgL15Mb2c6LykgeworCQkkbG9nbXNnID0gIiI7CisJCSRzdGF0ZSA9IDg7CisJfSBlbHNpZiAoJHN0YXRlID09IDggYW5kIC9eTWVtYmVyczovKSB7CisJCSRicmFuY2ggPSAkb3B0X28gaWYgJGJyYW5jaCBlcSAiSEVBRCI7CisJCWlmIChkZWZpbmVkICRicmFuY2hfZGF0ZXskYnJhbmNofSBhbmQgJGJyYW5jaF9kYXRleyRicmFuY2h9ID49ICRkYXRlKSB7CisJCQkjIHNraXAKKwkJCXByaW50ICJza2lwIHBhdGNoc2V0ICRwYXRjaHNldDogJGRhdGUgYmVmb3JlICRicmFuY2hfZGF0ZXskYnJhbmNofVxuIiBpZiAkb3B0X3Y7CisJCQkkc3RhdGUgPSAxMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCEkb3B0X2EgJiYgJHN0YXJ0dGltZSAtIDMwMCAtIChkZWZpbmVkICRvcHRfeiA/ICRvcHRfeiA6IDMwMCkgPD0gJGRhdGUpIHsKKwkJCSMgc2tpcCBpZiB0aGUgY29tbWl0IGlzIHRvbyByZWNlbnQKKwkJCSMgdGhhdCB0aGUgY3ZzcHMgZGVmYXVsdCBmdXp6IGlzIDMwMHMsIHdlIGdpdmUgb3Vyc2VsdmVzIGFub3RoZXIKKwkJCSMgMzAwcyBqdXN0IGluIGNhc2UgLS0gdGhpcyBhbHNvIHByZXZlbnRzIHNraXBwaW5nIGNvbW1pdHMKKwkJCSMgZHVlIHRvIHNlcnZlciBjbG9jayBkcmlmdAorCQkJcHJpbnQgInNraXAgcGF0Y2hzZXQgJHBhdGNoc2V0OiAkZGF0ZSB0b28gcmVjZW50XG4iIGlmICRvcHRfdjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZiAoZXhpc3RzICRpZ25vcmVicmFuY2h7JGJyYW5jaH0pIHsKKwkJCXByaW50IFNUREVSUiAiU2tpcHBpbmcgJGJyYW5jaFxuIjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGFuY2VzdG9yKSB7CisJCQlpZiAoJGFuY2VzdG9yIGVxICRicmFuY2gpIHsKKwkJCQlwcmludCBTVERFUlIgIkJyYW5jaCAkYnJhbmNoIGVycm9uZW91c2x5IHN0ZW1zIGZyb20gaXRzZWxmIC0tIGNoYW5nZWQgYW5jZXN0b3IgdG8gJG9wdF9vXG4iOworCQkJCSRhbmNlc3RvciA9ICRvcHRfbzsKKwkJCX0KKwkJCWlmICgtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRicmFuY2ggYWxyZWFkeSBleGlzdHMhXG4iOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJdW5sZXNzIChvcGVuKEgsIiRnaXRfZGlyL3JlZnMvaGVhZHMvJGFuY2VzdG9yIikpIHsKKwkJCQlwcmludCBTVERFUlIgIkJyYW5jaCAkYW5jZXN0b3IgZG9lcyBub3QgZXhpc3QhXG4iOworCQkJCSRpZ25vcmVicmFuY2h7JGJyYW5jaH0gPSAxOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJY2hvbXAobXkgJGlkID0gPEg+KTsKKwkJCWNsb3NlKEgpOworCQkJdW5sZXNzIChvcGVuKEgsIj4gJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikpIHsKKwkJCQlwcmludCBTVERFUlIgIkNvdWxkIG5vdCBjcmVhdGUgYnJhbmNoICRicmFuY2g6ICQhXG4iOworCQkJCSRpZ25vcmVicmFuY2h7JGJyYW5jaH0gPSAxOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJcHJpbnQgSCAiJGlkXG4iCisJCQkJb3IgZGllICJDb3VsZCBub3Qgd3JpdGUgYnJhbmNoICRicmFuY2g6ICQhIjsKKwkJCWNsb3NlKEgpCisJCQkJb3IgZGllICJDb3VsZCBub3Qgd3JpdGUgYnJhbmNoICRicmFuY2g6ICQhIjsKKwkJfQorCQkkbGFzdF9icmFuY2ggPSAkYnJhbmNoIGlmICRicmFuY2ggbmUgJGxhc3RfYnJhbmNoOworCQkkc3RhdGUgPSA5OworCX0gZWxzaWYgKCRzdGF0ZSA9PSA4KSB7CisJCSRsb2dtc2cgLj0gIiRfXG4iOworCX0gZWxzaWYgKCRzdGF0ZSA9PSA5IGFuZCAvXlxzKyguKz8pOihJTklUSUFMfFxkKyg/OlwuXGQrKSspLT4oXGQrKD86XC5cZCspKylccyokLykgeworIwlWRVJTSU9OOjEuOTYtPjEuOTYuMi4xCisJCW15ICRpbml0ID0gKCQyIGVxICJJTklUSUFMIik7CisJCW15ICRmbiA9ICQxOworCQlteSAkcmV2ID0gJDM7CisJCSRmbiA9fiBzI14vKyMjOworCQlpZiAoJG9wdF9TICYmICRmbiA9fiBtLyRvcHRfUy8pIHsKKwkJICAgIHByaW50ICJTS0lQUElORyAkZm4gdiAkcmV2XG4iOworCQkgICAgcHVzaChAc2tpcHBlZCwgJGZuKTsKKwkJICAgIG5leHQ7CisJCX0KKwkJcHJpbnQgIkZldGNoaW5nICRmbiAgIHYgJHJldlxuIiBpZiAkb3B0X3Y7CisJCW15ICgkdG1wbmFtZSwgJHNpemUpID0gJGN2cy0+ZmlsZSgkZm4sJHJldik7CisJCWlmICgkc2l6ZSA9PSAtMSkgeworCQkJcHVzaChAb2xkLCRmbik7CisJCQlwcmludCAiRHJvcCAkZm5cbiIgaWYgJG9wdF92OworCQl9IGVsc2UgeworCQkJcHJpbnQgIiIuKCRpbml0ID8gIk5ldyIgOiAiVXBkYXRlIikuIiAkZm46ICRzaXplIGJ5dGVzXG4iIGlmICRvcHRfdjsKKwkJCW15ICRwaWQgPSBvcGVuKG15ICRGLCAnLXwnKTsKKwkJCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQkJaWYgKCEkcGlkKSB7CisJCQkgICAgZXhlYygiZ2l0LWhhc2gtb2JqZWN0IiwgIi13IiwgJHRtcG5hbWUpCisJCQkJb3IgZGllICJDYW5ub3QgY3JlYXRlIG9iamVjdDogJCFcbiI7CisJCQl9CisJCQlteSAkc2hhID0gPCRGPjsKKwkJCWNob21wICRzaGE7CisJCQljbG9zZSAkRjsKKwkJCW15ICRtb2RlID0gcG1vZGUoJGN2cy0+eydtb2RlJ30pOworCQkJcHVzaChAbmV3LFskbW9kZSwgJHNoYSwgJGZuXSk7ICMgbWF5IGJlIHJlc3VycmVjdGVkIQorCQl9CisJCXVubGluaygkdG1wbmFtZSk7CisJfSBlbHNpZiAoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6XGQrKD86XC5cZCspKy0+KFxkKyg/OlwuXGQrKSspXChERUFEXClccyokLykgeworCQlteSAkZm4gPSAkMTsKKwkJJGZuID1+IHMjXi8rIyM7CisJCXB1c2goQG9sZCwkZm4pOworCQlwcmludCAiRGVsZXRlICRmblxuIiBpZiAkb3B0X3Y7CisJfSBlbHNpZiAoJHN0YXRlID09IDkgYW5kIC9eXHMqJC8pIHsKKwkJJHN0YXRlID0gMTA7CisJfSBlbHNpZiAoKCRzdGF0ZSA9PSA5IG9yICRzdGF0ZSA9PSAxMCkgYW5kIC9eLSskLykgeworCQkkY29tbWl0Y291bnQrKzsKKwkJaWYgKCRvcHRfTCAmJiAkY29tbWl0Y291bnQgPiAkb3B0X0wpIHsKKwkJCWxhc3Q7CisJCX0KKwkJY29tbWl0KCk7CisJCWlmICgoJGNvbW1pdGNvdW50ICYgMTAyMykgPT0gMCkgeworCQkJc3lzdGVtKCJnaXQgcmVwYWNrIC1hIC1kIik7CisJCX0KKwkJJHN0YXRlID0gMTsKKwl9IGVsc2lmICgkc3RhdGUgPT0gMTEgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKC9eLSskLykgeyAjIGVuZCBvZiB1bmtub3duLWxpbmUgcHJvY2Vzc2luZworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKCRzdGF0ZSAhPSAxMSkgeyAjIGlnbm9yZSBzdHVmZiB3aGVuIHNraXBwaW5nCisJCXByaW50ICIqIFVOS05PV04gTElORSAqICRfXG4iOworCX0KK30KK2NvbW1pdCgpIGlmICRicmFuY2ggYW5kICRzdGF0ZSAhPSAxMTsKKwordW5sZXNzICgkb3B0X1ApIHsKKwl1bmxpbmsoJGN2c3BzZmlsZSk7Cit9CisKKyMgVGhlIGhldXJpc3RpYyBvZiByZXBhY2tpbmcgZXZlcnkgMTAyNCBjb21taXRzIGNhbiBsZWF2ZSBhCisjIGxvdCBvZiB1bnBhY2tlZCBkYXRhLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDFNQiB3b3J0aCBvZgorIyBub3QtcGFja2VkIG9iamVjdHMsIHJlcGFjayBvbmNlIG1vcmUuCitteSAkbGluZSA9IGBnaXQtY291bnQtb2JqZWN0c2A7CitpZiAoJGxpbmUgPX4gL14oXGQrKSBvYmplY3RzLCAoXGQrKSBraWxvYnl0ZXMkLykgeworICBteSAoJG5fb2JqZWN0cywgJGtiKSA9ICgkMSwgJDIpOworICAxMDI0IDwgJGtiCisgICAgYW5kIHN5c3RlbSgiZ2l0IHJlcGFjayAtYSAtZCIpOworfQorCitmb3JlYWNoIG15ICRnaXRfaW5kZXggKHZhbHVlcyAlaW5kZXgpIHsKKyAgICBpZiAoJGdpdF9pbmRleCBuZSAiJGdpdF9kaXIvaW5kZXgiKSB7CisJdW5saW5rKCRnaXRfaW5kZXgpOworICAgIH0KK30KKworaWYgKGRlZmluZWQgJG9yaWdfZ2l0X2luZGV4KSB7CisJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkb3JpZ19naXRfaW5kZXg7Cit9IGVsc2UgeworCWRlbGV0ZSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK30KKworIyBOb3cgc3dpdGNoIGJhY2sgdG8gdGhlIGJyYW5jaCB3ZSB3ZXJlIGluIGJlZm9yZSBhbGwgb2YgdGhpcyBoYXBwZW5lZAoraWYgKCRvcmlnX2JyYW5jaCkgeworCXByaW50ICJET05FLlxuIiBpZiAkb3B0X3Y7CisJaWYgKCRvcHRfaSkgeworCQlleGl0IDA7CisJfQorCW15ICR0aXBfYXRfZW5kID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGA7CisJaWYgKCR0aXBfYXRfc3RhcnQgbmUgJHRpcF9hdF9lbmQpIHsKKwkJZm9yICgkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCkgeyBjaG9tcDsgfQorCQlwcmludCAiRmV0Y2hlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiIgaWYgJG9wdF92OworCQlzeXN0ZW0ocXcoZ2l0LXJlYWQtdHJlZSAtdSAtbSksCisJCSAgICAgICAkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCk7CisJCWRpZSAiRmFzdC1mb3J3YXJkIHVwZGF0ZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KKwllbHNlIHsKKwkJc3lzdGVtKHF3KGdpdC1tZXJnZSBjdnNpbXBvcnQgSEVBRCksICJyZWZzL2hlYWRzLyRvcHRfbyIpOworCQlkaWUgIkNvdWxkIG5vdCBtZXJnZSAkb3B0X28gaW50byB0aGUgY3VycmVudCBicmFuY2guXG4iIGlmICQ/OworCX0KK30gZWxzZSB7CisJJG9yaWdfYnJhbmNoID0gIm1hc3RlciI7CisJcHJpbnQgIkRPTkU7IGNyZWF0aW5nICRvcmlnX2JyYW5jaCBicmFuY2hcbiIgaWYgJG9wdF92OworCXN5c3RlbSgiZ2l0LXVwZGF0ZS1yZWYiLCAicmVmcy9oZWFkcy9tYXN0ZXIiLCAicmVmcy9oZWFkcy8kb3B0X28iKQorCQl1bmxlc3MgLWYgIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIjsKKwlzeXN0ZW0oJ2dpdC11cGRhdGUtcmVmJywgJ0hFQUQnLCAiJG9yaWdfYnJhbmNoIik7CisJdW5sZXNzICgkb3B0X2kpIHsKKwkJc3lzdGVtKCdnaXQgY2hlY2tvdXQnKTsKKwkJZGllICJjaGVja291dCBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1jdnNzZXJ2ZXIucGVybCBiL2dpdC1jdnNzZXJ2ZXIucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZGU1MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWN2c3NlcnZlci5wZXJsCkBAIC0wLDAgKzEsMjkzMCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMjIyMKKyMjIyMgVGhpcyBhcHBsaWNhdGlvbiBpcyBhIENWUyBlbXVsYXRpb24gbGF5ZXIgZm9yIGdpdC4KKyMjIyMgSXQgaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgdG8gY29ubmVjdCBvdmVyIFNTSC4KKyMjIyMgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisjIyMjIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMjIyMKKyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBieXRlczsKKwordXNlIEZjbnRsOwordXNlIEZpbGU6OlRlbXAgcXcvdGVtcGRpciB0ZW1wZmlsZS87Cit1c2UgRmlsZTo6QmFzZW5hbWU7CisKK215ICRsb2cgPSBHSVRDVlM6OmxvZy0+bmV3KCk7CitteSAkY2ZnOworCitteSAkREFURV9MSVNUID0geworICAgIEphbiA9PiAiMDEiLAorICAgIEZlYiA9PiAiMDIiLAorICAgIE1hciA9PiAiMDMiLAorICAgIEFwciA9PiAiMDQiLAorICAgIE1heSA9PiAiMDUiLAorICAgIEp1biA9PiAiMDYiLAorICAgIEp1bCA9PiAiMDciLAorICAgIEF1ZyA9PiAiMDgiLAorICAgIFNlcCA9PiAiMDkiLAorICAgIE9jdCA9PiAiMTAiLAorICAgIE5vdiA9PiAiMTEiLAorICAgIERlYyA9PiAiMTIiLAorfTsKKworIyBFbmFibGUgYXV0b2ZsdXNoIGZvciBTVERPVVQgKG90aGVyd2lzZSB0aGUgd2hvbGUgdGhpbmcgZmFsbHMgYXBhcnQpCiskfCA9IDE7CisKKyMjIyMgRGVmaW5pdGlvbiBhbmQgbWFwcGluZ3Mgb2YgZnVuY3Rpb25zICMjIyMKKworbXkgJG1ldGhvZHMgPSB7CisgICAgJ1Jvb3QnICAgICAgICAgICAgPT4gXCZyZXFfUm9vdCwKKyAgICAnVmFsaWQtcmVzcG9uc2VzJyA9PiBcJnJlcV9WYWxpZHJlc3BvbnNlcywKKyAgICAndmFsaWQtcmVxdWVzdHMnICA9PiBcJnJlcV92YWxpZHJlcXVlc3RzLAorICAgICdEaXJlY3RvcnknICAgICAgID0+IFwmcmVxX0RpcmVjdG9yeSwKKyAgICAnRW50cnknICAgICAgICAgICA9PiBcJnJlcV9FbnRyeSwKKyAgICAnTW9kaWZpZWQnICAgICAgICA9PiBcJnJlcV9Nb2RpZmllZCwKKyAgICAnVW5jaGFuZ2VkJyAgICAgICA9PiBcJnJlcV9VbmNoYW5nZWQsCisgICAgJ1F1ZXN0aW9uYWJsZScgICAgPT4gXCZyZXFfUXVlc3Rpb25hYmxlLAorICAgICdBcmd1bWVudCcgICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdBcmd1bWVudHgnICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdleHBhbmQtbW9kdWxlcycgID0+IFwmcmVxX2V4cGFuZG1vZHVsZXMsCisgICAgJ2FkZCcgICAgICAgICAgICAgPT4gXCZyZXFfYWRkLAorICAgICdyZW1vdmUnICAgICAgICAgID0+IFwmcmVxX3JlbW92ZSwKKyAgICAnY28nICAgICAgICAgICAgICA9PiBcJnJlcV9jbywKKyAgICAndXBkYXRlJyAgICAgICAgICA9PiBcJnJlcV91cGRhdGUsCisgICAgJ2NpJyAgICAgICAgICAgICAgPT4gXCZyZXFfY2ksCisgICAgJ2RpZmYnICAgICAgICAgICAgPT4gXCZyZXFfZGlmZiwKKyAgICAnbG9nJyAgICAgICAgICAgICA9PiBcJnJlcV9sb2csCisgICAgJ3Jsb2cnICAgICAgICAgICAgPT4gXCZyZXFfbG9nLAorICAgICd0YWcnICAgICAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdzdGF0dXMnICAgICAgICAgID0+IFwmcmVxX3N0YXR1cywKKyAgICAnYWRtaW4nICAgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnaGlzdG9yeScgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnd2F0Y2hlcnMnICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnZWRpdG9ycycgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnYW5ub3RhdGUnICAgICAgICA9PiBcJnJlcV9hbm5vdGF0ZSwKKyAgICAnR2xvYmFsX29wdGlvbicgICA9PiBcJnJlcV9HbG9iYWxvcHRpb24sCisgICAgIydhbm5vdGF0ZScgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgJHN0YXRlIGhvbGRzIGFsbCB0aGUgYml0cyBvZiBpbmZvcm1hdGlvbiB0aGUgY2xpZW50cyBzZW5kcyB1cyB0aGF0IGNvdWxkCisjIHBvdGVudGlhbGx5IGJlIHVzZWZ1bCB3aGVuIGl0IGNvbWVzIHRvIGFjdHVhbGx5IF9kb2luZ18gc29tZXRoaW5nLgorbXkgJHN0YXRlID0geyBwcmVwZW5kZGlyID0+ICcnIH07CiskbG9nLT5pbmZvKCItLS0tLS0tLS0tLS0tLS0gU1RBUlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworbXkgJFRFTVBfRElSID0gdGVtcGRpciggQ0xFQU5VUCA9PiAxICk7CiskbG9nLT5kZWJ1ZygiVGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyAnJFRFTVBfRElSJyIpOworCisjIGlmIHdlIGFyZSBjYWxsZWQgd2l0aCBhIHBzZXJ2ZXIgYXJndW1lbnQsCisjIGRlYWwgd2l0aCB0aGUgYXV0aGVudGljYXRpb24gY2F0IGJlZm9yZSBlbnRlcmluZyB0aGUKKyMgbWFpbiBsb29wCiskc3RhdGUtPnttZXRob2R9ID0gJ2V4dCc7CitpZiAoQEFSR1YgJiYgJEFSR1ZbMF0gZXEgJ3BzZXJ2ZXInKSB7CisgICAgJHN0YXRlLT57bWV0aG9kfSA9ICdwc2VydmVyJzsKKyAgICBteSAkbGluZSA9IDxTVERJTj47IGNob21wICRsaW5lOworICAgIHVubGVzcyggJGxpbmUgZXEgJ0JFR0lOIEFVVEggUkVRVUVTVCcpIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLSBleHBlY3RpbmcgQkVHSU4gQVVUSCBSRVFVRVNUXG4iOworICAgIH0KKyAgICAkbGluZSA9IDxTVERJTj47IGNob21wICRsaW5lOworICAgIHJlcV9Sb290KCdyb290JywgJGxpbmUpICMgcmV1c2UgUm9vdAorICAgICAgIG9yIGRpZSAiRSBJbnZhbGlkIHJvb3QgJGxpbmUgXG4iOworICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7CisgICAgdW5sZXNzICgkbGluZSBlcSAnYW5vbnltb3VzJykgeworICAgICAgIHByaW50ICJFIE9ubHkgYW5vbnltb3VzIHVzZXIgYWxsb3dlZCB2aWEgcHNlcnZlclxuIjsKKyAgICAgICBwcmludCAiSSBIQVRFIFlPVVxuIjsKKyAgICAgICBleGl0IDE7CisgICAgfQorICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7ICAgICMgdmFsaWRhdGUgdGhlIHBhc3N3b3JkPworICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7CisgICAgdW5sZXNzICgkbGluZSBlcSAnRU5EIEFVVEggUkVRVUVTVCcpIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLS0gZXhwZWN0aW5nIEVORCBBVVRIIFJFUVVFU1RcbiI7CisgICAgfQorICAgIHByaW50ICJJIExPVkUgWU9VXG4iOworICAgICMgYW5kIG5vdyBiYWNrIHRvIG91ciByZWd1bGFyIHByb2dyYW1tZS4uLgorfQorCisjIEtlZXAgZ29pbmcgdW50aWwgdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24KK3doaWxlICg8U1RESU4+KQoreworICAgIGNob21wOworCisgICAgIyBDaGVjayB0byBzZWUgaWYgd2UndmUgc2VlbiB0aGlzIG1ldGhvZCwgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24uCisgICAgaWYgKCAvXihbXHctXSspKD86XHMrKC4qKSk/JC8gYW5kIGRlZmluZWQoJG1ldGhvZHMtPnskMX0pICkKKyAgICB7CisgICAgICAgICMgdXNlIHRoZSAkbWV0aG9kcyBoYXNoIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHN1YiBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgICMkbG9nLT5pbmZvKCJNZXRob2QgOiAkMSIpOworICAgICAgICAmeyRtZXRob2RzLT57JDF9fSgkMSwkMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBsb2cgZmF0YWwgYmVjYXVzZSB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uIElmIHRoaXMgaGFwcGVucworICAgICAgICAjIHdlJ3JlIGZhaXJseSBzY3Jld2VkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgY2xpZW50IGlzIGV4cGVjdGluZworICAgICAgICAjIGEgcmVzcG9uc2UuIElmIGl0IGlzLCB0aGUgY2xpZW50IHdpbGwgaGFuZywgd2UnbGwgaGFuZywgYW5kIHRoZSB3aG9sZQorICAgICAgICAjIHRoaW5nIHdpbGwgYmUgY3VzdGFyZC4KKyAgICAgICAgJGxvZy0+ZmF0YWwoIkRvbid0IHVuZGVyc3RhbmQgY29tbWFuZCAkX1xuIik7CisgICAgICAgIGRpZSgiVW5rbm93biBjb21tYW5kICRfIik7CisgICAgfQorfQorCiskbG9nLT5kZWJ1ZygiUHJvY2Vzc2luZyB0aW1lIDogdXNlcj0iIC4gKHRpbWVzKVswXSAuICIgc3lzdGVtPSIgLiAodGltZXMpWzFdKTsKKyRsb2ctPmluZm8oIi0tLS0tLS0tLS0tLS0tLSBGSU5JU0ggLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworIyBNYWdpYyBjYXRjaGFsbCBtZXRob2QuCisjICAgIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHdpbGwgaGFuZGxlIGFsbCBjb21tYW5kcyB3ZSBoYXZlbid0IHlldAorIyAgICBpbXBsZW1lbnRlZC4gSXQgc2ltcGx5IHNlbmRzIGEgd2FybmluZyB0byB0aGUgbG9nIGZpbGUgaW5kaWNhdGluZyBhCisjICAgIGNvbW1hbmQgdGhhdCBoYXNuJ3QgYmVlbiBpbXBsZW1lbnRlZCBoYXMgYmVlbiBpbnZva2VkLgorc3ViIHJlcV9DQVRDSEFMTAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPndhcm4oIlVuaGFuZGxlZCBjb21tYW5kIDogcmVxXyRjbWQgOiAkZGF0YSIpOworfQorCisKKyMgUm9vdCBwYXRobmFtZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIgd2hpY2ggQ1ZTUk9PVCB0byB1c2UuIE5vdGUgdGhhdAorIyAgICAgcGF0aG5hbWUgaXMgYSBsb2NhbCBkaXJlY3RvcnkgYW5kIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBDVlNST09UIHZhcmlhYmxlLgorIyAgICAgcGF0aG5hbWUgbXVzdCBhbHJlYWR5IGV4aXN0OyBpZiBjcmVhdGluZyBhIG5ldyByb290LCB1c2UgdGhlIGluaXQKKyMgICAgIHJlcXVlc3QsIG5vdCBSb290LiBwYXRobmFtZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyLAorIyAgICAgaG93IHRvIGFjY2VzcyB0aGUgc2VydmVyLCBldGMuOyBieSB0aGUgdGltZSB0aGUgQ1ZTIHByb3RvY29sIGlzIGluIHVzZSwKKyMgICAgIGNvbm5lY3Rpb24sIGF1dGhlbnRpY2F0aW9uLCBldGMuLCBhcmUgYWxyZWFkeSB0YWtlbiBjYXJlIG9mLiBUaGUgUm9vdAorIyAgICAgcmVxdWVzdCBtdXN0IGJlIHNlbnQgb25seSBvbmNlLCBhbmQgaXQgbXVzdCBiZSBzZW50IGJlZm9yZSBhbnkgcmVxdWVzdHMKKyMgICAgIG90aGVyIHRoYW4gVmFsaWQtcmVzcG9uc2VzLCB2YWxpZC1yZXF1ZXN0cywgVXNlVW5jaGFuZ2VkLCBTZXQgb3IgaW5pdC4KK3N1YiByZXFfUm9vdAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfUm9vdCA6ICRkYXRhIik7CisKKyAgICAkc3RhdGUtPntDVlNST09UfSA9ICRkYXRhOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworICAgIHVubGVzcyAoLWQgJEVOVntHSVRfRElSfSAmJiAtZSAkRU5We0dJVF9ESVJ9LidIRUFEJykgeworICAgICAgIHByaW50ICJFICRFTlZ7R0lUX0RJUn0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIEdJVCByZXBvc2l0b3J5XG4iOworICAgICAgICBwcmludCAiRSBcbiI7CisgICAgICAgIHByaW50ICJlcnJvciAxICRFTlZ7R0lUX0RJUn0gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeVxuIjsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBteSBAZ2l0dmFycyA9IGBnaXQtY29uZmlnIC1sYDsKKyAgICBpZiAoJD8pIHsKKyAgICAgICBwcmludCAiRSBwcm9ibGVtcyBleGVjdXRpbmcgZ2l0LWNvbmZpZyBvbiB0aGUgc2VydmVyIC0tIHRoaXMgaXMgbm90IGEgZ2l0IHJlcG9zaXRvcnkgb3IgdGhlIFBBVEggaXMgbm90IHNldCBjb3JyZWN0bHkuXG4iOworICAgICAgICBwcmludCAiRSBcbiI7CisgICAgICAgIHByaW50ICJlcnJvciAxIC0gcHJvYmxlbSBleGVjdXRpbmcgZ2l0LWNvbmZpZ1xuIjsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBnaXR2YXJzICkKKyAgICB7CisgICAgICAgIG5leHQgdW5sZXNzICggJGxpbmUgPX4gL14oZ2l0Y3ZzKVwuKD86KGV4dHxwc2VydmVyKVwuKT8oW1x3LV0rKT0oLiopJC8gKTsKKyAgICAgICAgdW5sZXNzICgkMikgeworICAgICAgICAgICAgJGNmZy0+eyQxfXskM30gPSAkNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRjZmctPnskMX17JDJ9eyQzfSA9ICQ0OworICAgICAgICB9CisgICAgfQorCisgICAgbXkgJGVuYWJsZWQgPSAoJGNmZy0+e2dpdGN2c317JHN0YXRlLT57bWV0aG9kfX17ZW5hYmxlZH0KKwkJICAgfHwgJGNmZy0+e2dpdGN2c317ZW5hYmxlZH0pOworICAgIHVubGVzcyAoJGVuYWJsZWQgJiYgJGVuYWJsZWQgPX4gL15ccyooMXx0cnVlfHllcylccyokL2kpIHsKKyAgICAgICAgcHJpbnQgIkUgR0lUQ1ZTIGVtdWxhdGlvbiBuZWVkcyB0byBiZSBlbmFibGVkIG9uIHRoaXMgcmVwb1xuIjsKKyAgICAgICAgcHJpbnQgIkUgdGhlIHJlcG8gY29uZmlnIGZpbGUgbmVlZHMgYSBbZ2l0Y3ZzXSBzZWN0aW9uIGFkZGVkLCBhbmQgdGhlIHBhcmFtZXRlciAnZW5hYmxlZCcgc2V0IHRvIDFcbiI7CisgICAgICAgIHByaW50ICJFIFxuIjsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgR0lUQ1ZTIGVtdWxhdGlvbiBkaXNhYmxlZFxuIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbXkgJGxvZ2ZpbGUgPSAkY2ZnLT57Z2l0Y3ZzfXskc3RhdGUtPnttZXRob2R9fXtsb2dmaWxlfSB8fCAkY2ZnLT57Z2l0Y3ZzfXtsb2dmaWxlfTsKKyAgICBpZiAoICRsb2dmaWxlICkKKyAgICB7CisgICAgICAgICRsb2ctPnNldGZpbGUoJGxvZ2ZpbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgICRsb2ctPm5vZmlsZSgpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisjIEdsb2JhbF9vcHRpb24gb3B0aW9uIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRyYW5zbWl0IG9uZSBvZiB0aGUgZ2xvYmFsIG9wdGlvbnMgYC1xJywgYC1RJywKKyMgICAgIGAtbCcsIGAtdCcsIGAtcicsIG9yIGAtbicuIG9wdGlvbiBtdXN0IGJlIG9uZSBvZiB0aG9zZSBzdHJpbmdzLCBubworIyAgICAgdmFyaWF0aW9ucyAoc3VjaCBhcyBjb21iaW5pbmcgb2Ygb3B0aW9ucykgYXJlIGFsbG93ZWQuIEZvciBncmFjZWZ1bAorIyAgICAgaGFuZGxpbmcgb2YgdmFsaWQtcmVxdWVzdHMsIGl0IGlzIHByb2JhYmx5IGJldHRlciB0byBtYWtlIG5ldyBnbG9iYWwKKyMgICAgIG9wdGlvbnMgc2VwYXJhdGUgcmVxdWVzdHMsIHJhdGhlciB0aGFuIHRyeWluZyB0byBhZGQgdGhlbSB0byB0aGlzCisjICAgICByZXF1ZXN0Lgorc3ViIHJlcV9HbG9iYWxvcHRpb24KK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKyAgICAkbG9nLT5kZWJ1ZygicmVxX0dsb2JhbG9wdGlvbiA6ICRkYXRhIik7CisgICAgJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317JGRhdGF9ID0gMTsKK30KKworIyBWYWxpZC1yZXNwb25zZXMgcmVxdWVzdC1saXN0IFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB3aGF0IHJlc3BvbnNlcyB0aGUgY2xpZW50IHdpbGwKKyMgICAgIGFjY2VwdC4gcmVxdWVzdC1saXN0IGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zLgorc3ViIHJlcV9WYWxpZHJlc3BvbnNlcworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfVmFsaWRyZXNwb25zZXMgOiAkZGF0YSIpOworCisgICAgIyBUT0RPIDogcmUtZW5hYmxlIHRoaXMsIGN1cnJlbnRseSBpdCdzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsCisgICAgIyRzdGF0ZS0+e3ZhbGlkcmVzcG9uc2VzfSA9IFsgc3BsaXQgL1xzKy8sICRkYXRhIF07Cit9CisKKyMgdmFsaWQtcmVxdWVzdHMgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEFzayB0aGUgc2VydmVyIHRvIHNlbmQgYmFjayBhIFZhbGlkLXJlcXVlc3RzCisjICAgICByZXNwb25zZS4KK3N1YiByZXFfdmFsaWRyZXF1ZXN0cworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgJGxvZy0+ZGVidWcoInJlcV92YWxpZHJlcXVlc3RzIik7CisKKyAgICAkbG9nLT5kZWJ1ZygiU0VORCA6IFZhbGlkLXJlcXVlc3RzICIgLiBqb2luKCIgIixrZXlzICUkbWV0aG9kcykpOworICAgICRsb2ctPmRlYnVnKCJTRU5EIDogb2siKTsKKworICAgIHByaW50ICJWYWxpZC1yZXF1ZXN0cyAiIC4gam9pbigiICIsa2V5cyAlJG1ldGhvZHMpIC4gIlxuIjsKKyAgICBwcmludCAib2tcbiI7Cit9CisKKyMgRGlyZWN0b3J5IGxvY2FsLWRpcmVjdG9yeSBcbgorIyAgICAgQWRkaXRpb25hbCBkYXRhOiByZXBvc2l0b3J5IFxuLiBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlcgorIyAgICAgd2hhdCBkaXJlY3RvcnkgdG8gdXNlLiBUaGUgcmVwb3NpdG9yeSBzaG91bGQgYmUgYSBkaXJlY3RvcnkgbmFtZSBmcm9tIGEKKyMgICAgIHByZXZpb3VzIHNlcnZlciByZXNwb25zZS4gTm90ZSB0aGF0IHRoaXMgYm90aCBnaXZlcyBhIGRlZmF1bHQgZm9yIEVudHJ5CisjICAgICBhbmQgTW9kaWZpZWQgYW5kIGFsc28gZm9yIGNpIGFuZCB0aGUgb3RoZXIgY29tbWFuZHM7IG5vcm1hbCB1c2FnZSBpcyB0bworIyAgICAgc2VuZCBEaXJlY3RvcnkgZm9yIGVhY2ggZGlyZWN0b3J5IGluIHdoaWNoIHRoZXJlIHdpbGwgYmUgYW4gRW50cnkgb3IKKyMgICAgIE1vZGlmaWVkLCBhbmQgdGhlbiBhIGZpbmFsIERpcmVjdG9yeSBmb3IgdGhlIG9yaWdpbmFsIGRpcmVjdG9yeSwgdGhlbiB0aGUKKyMgICAgIGNvbW1hbmQuIFRoZSBsb2NhbC1kaXJlY3RvcnkgaXMgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBhdCB3aGljaCB0aGUKKyMgICAgIGNvbW1hbmQgaXMgb2NjdXJyaW5nIChpLmUuIHRoZSBsYXN0IERpcmVjdG9yeSB3aGljaCBpcyBzZW50IGJlZm9yZSB0aGUKKyMgICAgIGNvbW1hbmQpOyB0byBpbmRpY2F0ZSB0aGF0IHRvcCBsZXZlbCwgYC4nIHNob3VsZCBiZSBzZW50IGZvcgorIyAgICAgbG9jYWwtZGlyZWN0b3J5Lgorc3ViIHJlcV9EaXJlY3RvcnkKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIG15ICRyZXBvc2l0b3J5ID0gPFNURElOPjsKKyAgICBjaG9tcCAkcmVwb3NpdG9yeTsKKworCisgICAgJHN0YXRlLT57bG9jYWxkaXJ9ID0gJGRhdGE7CisgICAgJHN0YXRlLT57cmVwb3NpdG9yeX0gPSAkcmVwb3NpdG9yeTsKKyAgICAkc3RhdGUtPntwYXRofSA9ICRyZXBvc2l0b3J5OworICAgICRzdGF0ZS0+e3BhdGh9ID1+IHMvXiRzdGF0ZS0+e0NWU1JPT1R9XC8vLzsKKyAgICAkc3RhdGUtPnttb2R1bGV9ID0gJDEgaWYgKCRzdGF0ZS0+e3BhdGh9ID1+IHMvXiguKj8pKFwvfCQpLy8pOworICAgICRzdGF0ZS0+e3BhdGh9IC49ICIvIiBpZiAoICRzdGF0ZS0+e3BhdGh9ID1+IC9cUy8gKTsKKworICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gPSAkc3RhdGUtPntsb2NhbGRpcn07CisgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSA9ICIiIGlmICggJHN0YXRlLT57ZGlyZWN0b3J5fSBlcSAiLiIgKTsKKyAgICAkc3RhdGUtPntkaXJlY3Rvcnl9IC49ICIvIiBpZiAoICRzdGF0ZS0+e2RpcmVjdG9yeX0gPX4gL1xTLyApOworCisgICAgaWYgKCAobm90IGRlZmluZWQoJHN0YXRlLT57cHJlcGVuZGRpcn0pIG9yICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IGVxICcnKSBhbmQgJHN0YXRlLT57bG9jYWxkaXJ9IGVxICIuIiBhbmQgJHN0YXRlLT57cGF0aH0gPX4gL1xTLyApCisgICAgeworICAgICAgICAkbG9nLT5pbmZvKCJTZXR0aW5nIHByZXBlbmQgdG8gJyRzdGF0ZS0+e3BhdGh9JyIpOworICAgICAgICAkc3RhdGUtPntwcmVwZW5kZGlyfSA9ICRzdGF0ZS0+e3BhdGh9OworICAgICAgICBmb3JlYWNoIG15ICRlbnRyeSAoIGtleXMgJXskc3RhdGUtPntlbnRyaWVzfX0gKQorICAgICAgICB7CisgICAgICAgICAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntwcmVwZW5kZGlyfSAuICRlbnRyeX0gPSAkc3RhdGUtPntlbnRyaWVzfXskZW50cnl9OworICAgICAgICAgICAgZGVsZXRlICRzdGF0ZS0+e2VudHJpZXN9eyRlbnRyeX07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntwcmVwZW5kZGlyfSApICkKKyAgICB7CisgICAgICAgICRsb2ctPmRlYnVnKCJQcmVwZW5kaW5nICckc3RhdGUtPntwcmVwZW5kZGlyfScgdG8gc3RhdGV8ZGlyZWN0b3J5Iik7CisgICAgICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gPSAkc3RhdGUtPntwcmVwZW5kZGlyfSAuICRzdGF0ZS0+e2RpcmVjdG9yeX0KKyAgICB9CisgICAgJGxvZy0+ZGVidWcoInJlcV9EaXJlY3RvcnkgOiBsb2NhbGRpcj0kZGF0YSByZXBvc2l0b3J5PSRyZXBvc2l0b3J5IHBhdGg9JHN0YXRlLT57cGF0aH0gZGlyZWN0b3J5PSRzdGF0ZS0+e2RpcmVjdG9yeX0gbW9kdWxlPSRzdGF0ZS0+e21vZHVsZX0iKTsKK30KKworIyBFbnRyeSBlbnRyeS1saW5lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB3aGF0IHZlcnNpb24gb2YgYSBmaWxlIGlzIG9uIHRoZQorIyAgICAgbG9jYWwgbWFjaGluZS4gVGhlIG5hbWUgaW4gZW50cnktbGluZSBpcyBhIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQorIyAgICAgbW9zdCByZWNlbnRseSBzcGVjaWZpZWQgd2l0aCBEaXJlY3RvcnkuIElmIHRoZSB1c2VyIGlzIG9wZXJhdGluZyBvbiBvbmx5CisjICAgICBzb21lIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBFbnRyeSByZXF1ZXN0cyBmb3Igb25seSB0aG9zZSBmaWxlcyBuZWVkIGJlCisjICAgICBpbmNsdWRlZC4gSWYgYW4gRW50cnkgcmVxdWVzdCBpcyBzZW50IHdpdGhvdXQgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvcgorIyAgICAgVW5jaGFuZ2VkLCBpdCBtZWFucyB0aGUgZmlsZSBpcyBsb3N0IChkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2luZworIyAgICAgZGlyZWN0b3J5KS4gSWYgYm90aCBFbnRyeSBhbmQgb25lIG9mIE1vZGlmaWVkLCBJcy1tb2RpZmllZCwgb3IgVW5jaGFuZ2VkCisjICAgICBhcmUgc2VudCBmb3IgdGhlIHNhbWUgZmlsZSwgRW50cnkgbXVzdCBiZSBzZW50IGZpcnN0LiBGb3IgYSBnaXZlbiBmaWxlLAorIyAgICAgb25lIGNhbiBzZW5kIE1vZGlmaWVkLCBJcy1tb2RpZmllZCwgb3IgVW5jaGFuZ2VkLCBidXQgbm90IG1vcmUgdGhhbiBvbmUKKyMgICAgIG9mIHRoZXNlIHRocmVlLgorc3ViIHJlcV9FbnRyeQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgIyRsb2ctPmRlYnVnKCJyZXFfRW50cnkgOiAkZGF0YSIpOworCisgICAgbXkgQGRhdGEgPSBzcGxpdCgvXC8vLCAkZGF0YSk7CisKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhWzFdfSA9IHsKKyAgICAgICAgcmV2aXNpb24gICAgPT4gJGRhdGFbMl0sCisgICAgICAgIGNvbmZsaWN0ICAgID0+ICRkYXRhWzNdLAorICAgICAgICBvcHRpb25zICAgICA9PiAkZGF0YVs0XSwKKyAgICAgICAgdGFnX29yX2RhdGUgPT4gJGRhdGFbNV0sCisgICAgfTsKKworICAgICRsb2ctPmluZm8oIlJlY2VpdmVkIGVudHJ5IGxpbmUgJyRkYXRhJyA9PiAnIiAuICRzdGF0ZS0+e2RpcmVjdG9yeX0gLiAkZGF0YVsxXSAuICInIik7Cit9CisKKyMgUXVlc3Rpb25hYmxlIGZpbGVuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIEFkZGl0aW9uYWwgZGF0YTogbm8uIFRlbGwgdGhlIHNlcnZlciB0byBjaGVjaworIyAgICAgd2hldGhlciBmaWxlbmFtZSBzaG91bGQgYmUgaWdub3JlZCwgYW5kIGlmIG5vdCwgbmV4dCB0aW1lIHRoZSBzZXJ2ZXIKKyMgICAgIHNlbmRzIHJlc3BvbnNlcywgc2VuZCAoaW4gYSBNIHJlc3BvbnNlKSBgPycgZm9sbG93ZWQgYnkgdGhlIGRpcmVjdG9yeSBhbmQKKyMgICAgIGZpbGVuYW1lLiBmaWxlbmFtZSBtdXN0IG5vdCBjb250YWluIGAvJzsgaXQgbmVlZHMgdG8gYmUgYSBmaWxlIGluIHRoZQorIyAgICAgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBtb3N0IHJlY2VudCBEaXJlY3RvcnkgcmVxdWVzdC4KK3N1YiByZXFfUXVlc3Rpb25hYmxlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX1F1ZXN0aW9uYWJsZSA6ICRkYXRhIik7CisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17cXVlc3Rpb25hYmxlfSA9IDE7Cit9CisKKyMgYWRkIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBBZGQgYSBmaWxlIG9yIGRpcmVjdG9yeS4gVGhpcyB1c2VzIGFueSBwcmV2aW91cworIyAgICAgQXJndW1lbnQsIERpcmVjdG9yeSwgRW50cnksIG9yIE1vZGlmaWVkIHJlcXVlc3RzLCBpZiB0aGV5IGhhdmUgYmVlbiBzZW50LgorIyAgICAgVGhlIGxhc3QgRGlyZWN0b3J5IHNlbnQgc3BlY2lmaWVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhdCB0aGUgdGltZSBvZgorIyAgICAgdGhlIG9wZXJhdGlvbi4gVG8gYWRkIGEgZGlyZWN0b3J5LCBzZW5kIHRoZSBkaXJlY3RvcnkgdG8gYmUgYWRkZWQgdXNpbmcKKyMgICAgIERpcmVjdG9yeSBhbmQgQXJndW1lbnQgcmVxdWVzdHMuCitzdWIgcmVxX2FkZAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImFkZCIpOworCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgbXkgJGFkZGNvdW50ID0gMDsKKworICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICR3cmV2ID0gcmV2cGFyc2UoJGZpbGVuYW1lKTsKKworICAgICAgICBpZiAoJHdyZXYgJiYgJG1ldGEgJiYgKCR3cmV2IDwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgcHJldmlvdXNseSByZW1vdmVkIGZpbGUsIGFkZCBiYWNrCisgICAgICAgICAgICAkbG9nLT5pbmZvKCJhZGRlZCBmaWxlICRmaWxlbmFtZSB3YXMgcHJldmlvdXNseSByZW1vdmVkLCBzZW5kIDEuJG1ldGEtPntyZXZpc2lvbn0iKTsKKworICAgICAgICAgICAgcHJpbnQgIk1UICt1cGRhdGVkXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIHRleHQgVSBcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgZm5hbWUgJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIG5ld2xpbmVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgLXVwZGF0ZWRcbiI7CisKKyAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwxKTsKKworICAgICAgICAgICAgICAgIHByaW50ICJDcmVhdGVkICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZVxuIjsKKworICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhbiAiZW50cmllcyIgbGluZQorICAgICAgICAgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLyRrb3B0cy8iKTsKKyAgICAgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvXG4iOworICAgICAgICAgICAgICAgICMgcGVybWlzc2lvbnMKKyAgICAgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiU0VORCA6IHU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9Iik7CisgICAgICAgICAgICAgICAgcHJpbnQgInU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9XG4iOworICAgICAgICAgICAgICAgICMgdHJhbnNtaXQgZmlsZQorICAgICAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IG5vdGhpbmcga25vd24gYWJvdXQgYCRmaWxlbmFtZSdcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgICMgVE9ETyA6IGNoZWNrIHdlJ3JlIG5vdCBzcXVhc2hpbmcgYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlCisgICAgICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgYWRkOiBgJGZpbGVuYW1lJyBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWRcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwgMSk7CisKKyAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogc2NoZWR1bGluZyBmaWxlIGAkZmlsZW5hbWUnIGZvciBhZGRpdGlvblxuIjsKKworICAgICAgICBwcmludCAiQ2hlY2tlZC1pbiAkZGlycGFydFxuIjsKKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKyAgICAgICAgbXkgJGtvcHRzID0ga29wdHNfZnJvbV9wYXRoKCRmaWxlcGFydCk7CisgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzAvLyRrb3B0cy9cbiI7CisKKyAgICAgICAgJGFkZGNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCAkYWRkY291bnQgPT0gMSApCisgICAgeworICAgICAgICBwcmludCAiRSBjdnMgYWRkOiB1c2UgYGN2cyBjb21taXQnIHRvIGFkZCB0aGlzIGZpbGUgcGVybWFuZW50bHlcbiI7CisgICAgfQorICAgIGVsc2lmICggJGFkZGNvdW50ID4gMSApCisgICAgeworICAgICAgICBwcmludCAiRSBjdnMgYWRkOiB1c2UgYGN2cyBjb21taXQnIHRvIGFkZCB0aGVzZSBmaWxlcyBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKKyMgcmVtb3ZlIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBSZW1vdmUgYSBmaWxlLiBUaGlzIHVzZXMgYW55IHByZXZpb3VzIEFyZ3VtZW50LAorIyAgICAgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZSBiZWVuIHNlbnQuIFRoZSBsYXN0CisjICAgICBEaXJlY3Rvcnkgc2VudCBzcGVjaWZpZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIG9mIHRoZQorIyAgICAgb3BlcmF0aW9uLiBOb3RlIHRoYXQgdGhpcyByZXF1ZXN0IGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIHRvIHRoZQorIyAgICAgcmVwb3NpdG9yeTsgdGhlIG9ubHkgZWZmZWN0IG9mIGEgc3VjY2Vzc2Z1bCByZW1vdmUgcmVxdWVzdCBpcyB0byBzdXBwbHkKKyMgICAgIHRoZSBjbGllbnQgd2l0aCBhIG5ldyBlbnRyaWVzIGxpbmUgY29udGFpbmluZyBgLScgdG8gaW5kaWNhdGUgYSByZW1vdmVkCisjICAgICBmaWxlLiBJbiBmYWN0LCB0aGUgY2xpZW50IHByb2JhYmx5IGNvdWxkIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gd2l0aG91dAorIyAgICAgY29udGFjdGluZyB0aGUgc2VydmVyLCBhbHRob3VnaCB1c2luZyByZW1vdmUgbWF5IGNhdXNlIHRoZSBzZXJ2ZXIgdG8KKyMgICAgIHBlcmZvcm0gYSBmZXcgbW9yZSBjaGVja3MuIFRoZSBjbGllbnQgc2VuZHMgYSBzdWJzZXF1ZW50IGNpIHJlcXVlc3QgdG8KKyMgICAgIGFjdHVhbGx5IHJlY29yZCB0aGUgcmVtb3ZhbCBpbiB0aGUgcmVwb3NpdG9yeS4KK3N1YiByZXFfcmVtb3ZlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgicmVtb3ZlIik7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyRsb2ctPmRlYnVnKCJhZGQgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgbXkgJHJtY291bnQgPSAwOworCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfSApIG9yIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogZmlsZSBgJGZpbGVuYW1lJyBzdGlsbCBpbiB3b3JraW5nIGRpcmVjdG9yeVxuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICR3cmV2ID0gcmV2cGFyc2UoJGZpbGVuYW1lKTsKKworICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICggJHdyZXYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IG5vdGhpbmcga25vd24gYWJvdXQgYCRmaWxlbmFtZSdcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZWZpbmVkKCR3cmV2KSBhbmQgJHdyZXYgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogZmlsZSBgJGZpbGVuYW1lJyBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgcmVtb3ZhbFxuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICB1bmxlc3MgKCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgVE9ETyA6IG5vdCBzdXJlIGlmIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlIGlzIHF1aXRlIGNvcnJlY3QuCisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBVcCB0byBkYXRlIGNoZWNrIGZhaWxlZCBmb3IgYCRmaWxlbmFtZSdcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKworICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLCAxKTsKKworICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBzY2hlZHVsaW5nIGAkZmlsZW5hbWUnIGZvciByZW1vdmFsXG4iOworCisgICAgICAgIHByaW50ICJDaGVja2VkLWluICRkaXJwYXJ0XG4iOworICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworICAgICAgICBteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGZpbGVwYXJ0KTsKKyAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvLTEuJHdyZXYvLyRrb3B0cy9cbiI7CisKKyAgICAgICAgJHJtY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoICRybWNvdW50ID09IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogdXNlIGBjdnMgY29tbWl0JyB0byByZW1vdmUgdGhpcyBmaWxlIHBlcm1hbmVudGx5XG4iOworICAgIH0KKyAgICBlbHNpZiAoICRybWNvdW50ID4gMSApCisgICAgeworICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiB1c2UgYGN2cyBjb21taXQnIHRvIHJlbW92ZSB0aGVzZSBmaWxlcyBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKKyMgTW9kaWZpZWQgZmlsZW5hbWUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQWRkaXRpb25hbCBkYXRhOiBtb2RlLCBcbiwgZmlsZSB0cmFuc21pc3Npb24uIFNlbmQKKyMgICAgIHRoZSBzZXJ2ZXIgYSBjb3B5IG9mIG9uZSBsb2NhbGx5IG1vZGlmaWVkIGZpbGUuIGZpbGVuYW1lIGlzIGEgZmlsZSB3aXRoaW4KKyMgICAgIHRoZSBtb3N0IHJlY2VudCBkaXJlY3Rvcnkgc2VudCB3aXRoIERpcmVjdG9yeTsgaXQgbXVzdCBub3QgY29udGFpbiBgLycuCisjICAgICBJZiB0aGUgdXNlciBpcyBvcGVyYXRpbmcgb24gb25seSBzb21lIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBvbmx5IHRob3NlCisjICAgICBmaWxlcyBuZWVkIHRvIGJlIGluY2x1ZGVkLiBUaGlzIGNhbiBhbHNvIGJlIHNlbnQgd2l0aG91dCBFbnRyeSwgaWYgdGhlcmUKKyMgICAgIGlzIG5vIGVudHJ5IGZvciB0aGUgZmlsZS4KK3N1YiByZXFfTW9kaWZpZWQKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIG15ICRtb2RlID0gPFNURElOPjsKKyAgICBjaG9tcCAkbW9kZTsKKyAgICBteSAkc2l6ZSA9IDxTVERJTj47CisgICAgY2hvbXAgJHNpemU7CisKKyAgICAjIEdyYWIgY29uZmlnIGluZm9ybWF0aW9uCisgICAgbXkgJGJsb2Nrc2l6ZSA9IDgxOTI7CisgICAgbXkgJGJ5dGVzbGVmdCA9ICRzaXplOworICAgIG15ICR0bXA7CisKKyAgICAjIEdldCBhIGZpbGVoYW5kbGUvbmFtZSB0byB3cml0ZSBpdCB0bworICAgIG15ICggJGZoLCAkZmlsZW5hbWUgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSICk7CisKKyAgICAjIExvb3Agb3ZlciBmaWxlIGRhdGEgd3JpdGluZyBvdXQgdG8gdGVtcG9yYXJ5IGZpbGUuCisgICAgd2hpbGUgKCAkYnl0ZXNsZWZ0ICkKKyAgICB7CisgICAgICAgICRibG9ja3NpemUgPSAkYnl0ZXNsZWZ0IGlmICggJGJ5dGVzbGVmdCA8ICRibG9ja3NpemUgKTsKKyAgICAgICAgcmVhZCBTVERJTiwgJHRtcCwgJGJsb2Nrc2l6ZTsKKyAgICAgICAgcHJpbnQgJGZoICR0bXA7CisgICAgICAgICRieXRlc2xlZnQgLT0gJGJsb2Nrc2l6ZTsKKyAgICB9CisKKyAgICBjbG9zZSAkZmg7CisKKyAgICAjIEVuc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBzZW5zaWJsZSBmb3IgdGhlIGZpbGUgbW9kZQorICAgIGlmICggJG1vZGUgPX4gL3U9KFx3KykvICkKKyAgICB7CisgICAgICAgICRtb2RlID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG1vZGUgPSAicnciOworICAgIH0KKworICAgICMgU2F2ZSB0aGUgZmlsZSBkYXRhIGluICRzdGF0ZQorICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2ZpbGVuYW1lfSA9ICRmaWxlbmFtZTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXttb2RpZmllZF9tb2RlfSA9ICRtb2RlOworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2hhc2h9ID0gYGdpdC1oYXNoLW9iamVjdCAkZmlsZW5hbWVgOworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2hhc2h9ID1+IHMvXHMuKiQvL3M7CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9Nb2RpZmllZCA6IGZpbGU9JGRhdGEgbW9kZT0kbW9kZSBzaXplPSRzaXplIik7Cit9CisKKyMgVW5jaGFuZ2VkIGZpbGVuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB0aGF0IGZpbGVuYW1lIGhhcyBub3QgYmVlbgorIyAgICAgbW9kaWZpZWQgaW4gdGhlIGNoZWNrZWQgb3V0IGRpcmVjdG9yeS4gVGhlIGZpbGVuYW1lIGlzIGEgZmlsZSB3aXRoaW4gdGhlCisjICAgICBtb3N0IHJlY2VudCBkaXJlY3Rvcnkgc2VudCB3aXRoIERpcmVjdG9yeTsgaXQgbXVzdCBub3QgY29udGFpbiBgLycuCitzdWIgcmVxX1VuY2hhbmdlZAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17dW5jaGFuZ2VkfSA9IDE7CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9VbmNoYW5nZWQgOiAkZGF0YSIpOworfQorCisjIEFyZ3VtZW50IHRleHQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gU2F2ZSBhcmd1bWVudCBmb3IgdXNlIGluIGEgc3Vic2VxdWVudCBjb21tYW5kLgorIyAgICAgQXJndW1lbnRzIGFjY3VtdWxhdGUgdW50aWwgYW4gYXJndW1lbnQtdXNpbmcgY29tbWFuZCBpcyBnaXZlbiwgYXQgd2hpY2gKKyMgICAgIHBvaW50IHRoZXkgYXJlIGZvcmdvdHRlbi4KKyMgQXJndW1lbnR4IHRleHQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQXBwZW5kIFxuIGZvbGxvd2VkIGJ5IHRleHQgdG8gdGhlIGN1cnJlbnQgYXJndW1lbnQKKyMgICAgIGJlaW5nIHNhdmVkLgorc3ViIHJlcV9Bcmd1bWVudAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgIyBBcmd1bWVudHggbWVhbnM6IGFwcGVuZCB0byBsYXN0IEFyZ3VtZW50ICh3aXRoIGEgbmV3bGluZSBpbiBmcm9udCkKKworICAgICRsb2ctPmRlYnVnKCIkY21kIDogJGRhdGEiKTsKKworICAgIGlmICggJGNtZCBlcSAnQXJndW1lbnR4JykgeworICAgICAgICAkeyRzdGF0ZS0+e2FyZ3VtZW50c319WyQjeyRzdGF0ZS0+e2FyZ3VtZW50c319XSAuPSAiXG4iIC4gJGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319LCAkZGF0YTsKKyAgICB9Cit9CisKKyMgZXhwYW5kLW1vZHVsZXMgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEV4cGFuZCB0aGUgbW9kdWxlcyB3aGljaCBhcmUgc3BlY2lmaWVkIGluIHRoZQorIyAgICAgYXJndW1lbnRzLiBSZXR1cm5zIHRoZSBkYXRhIGluIE1vZHVsZS1leHBhbnNpb24gcmVzcG9uc2VzLiBOb3RlIHRoYXQgdGhlCisjICAgICBzZXJ2ZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgY2hlY2tvdXQgb3IgZXhwb3J0LCBub3QgcnRhZyBvciByZGlmZjsgdGhlCisjICAgICBsYXR0ZXIgZG8gbm90IGFjY2VzcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIHRodXMgaGF2ZSBubyBuZWVkIHRvCisjICAgICBleHBhbmQgbW9kdWxlcyBvbiB0aGUgY2xpZW50IHNpZGUuIEV4cGFuZCBtYXkgbm90IGJlIHRoZSBiZXN0IHdvcmQgZm9yCisjICAgICB3aGF0IHRoaXMgcmVxdWVzdCBkb2VzLiBJdCBkb2VzIG5vdCBuZWNlc3NhcmlseSB0ZWxsIHlvdSBhbGwgdGhlIGZpbGVzCisjICAgICBjb250YWluZWQgaW4gYSBtb2R1bGUsIGZvciBleGFtcGxlLiBCYXNpY2FsbHkgaXQgaXMgYSB3YXkgb2YgdGVsbGluZyB5b3UKKyMgICAgIHdoaWNoIHdvcmtpbmcgZGlyZWN0b3JpZXMgdGhlIHNlcnZlciBuZWVkcyB0byBrbm93IGFib3V0IGluIG9yZGVyIHRvCisjICAgICBoYW5kbGUgYSBjaGVja291dCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZXMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoYXQgdGhlCisjICAgICBzZXJ2ZXIgaGFzIGEgbW9kdWxlIGRlZmluZWQgYnkKKyMgICBhbGlhc21vZHVsZSAtYSAxZGlyCisjICAgICBUaGF0IGlzLCBvbmUgY2FuIGNoZWNrIG91dCBhbGlhc21vZHVsZSBhbmQgaXQgd2lsbCB0YWtlIDFkaXIgaW4gdGhlCisjICAgICByZXBvc2l0b3J5IGFuZCBjaGVjayBpdCBvdXQgdG8gMWRpciBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuIE5vdyBzdXBwb3NlCisjICAgICB0aGUgY2xpZW50IGFscmVhZHkgaGFzIHRoaXMgbW9kdWxlIGNoZWNrZWQgb3V0IGFuZCBpcyBwbGFubmluZyBvbiB1c2luZworIyAgICAgdGhlIGNvIHJlcXVlc3QgdG8gdXBkYXRlIGl0LiBXaXRob3V0IHVzaW5nIGV4cGFuZC1tb2R1bGVzLCB0aGUgY2xpZW50CisjICAgICB3b3VsZCBoYXZlIHR3byBiYWQgY2hvaWNlczogaXQgY291bGQgZWl0aGVyIHNlbmQgaW5mb3JtYXRpb24gYWJvdXQgYWxsCisjICAgICB3b3JraW5nIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggY291bGQgYmUKKyMgICAgIHVubmVjZXNzYXJpbHkgc2xvdywgb3IgaXQgY291bGQgYmUgaWdub3JhbnQgb2YgdGhlIGZhY3QgdGhhdCBhbGlhc21vZHVsZQorIyAgICAgc3RhbmRzIGZvciAxZGlyLCBhbmQgbmVnbGVjdCB0byBzZW5kIGluZm9ybWF0aW9uIGZvciAxZGlyLCB3aGljaCB3b3VsZAorIyAgICAgbGVhZCB0byBpbmNvcnJlY3Qgb3BlcmF0aW9uLiBXaXRoIGV4cGFuZC1tb2R1bGVzLCB0aGUgY2xpZW50IHdvdWxkIGZpcnN0CisjICAgICBhc2sgZm9yIHRoZSBtb2R1bGUgdG8gYmUgZXhwYW5kZWQ6CitzdWIgcmVxX2V4cGFuZG1vZHVsZXMKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCk7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2V4cGFuZG1vZHVsZXMgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSApOworCisgICAgdW5sZXNzICggcmVmICRzdGF0ZS0+e2FyZ3VtZW50c30gZXEgIkFSUkFZIiApCisgICAgeworICAgICAgICBwcmludCAib2tcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3JlYWNoIG15ICRtb2R1bGUgKCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319ICkKKyAgICB7CisgICAgICAgICRsb2ctPmRlYnVnKCJTRU5EIDogTW9kdWxlLWV4cGFuc2lvbiAkbW9kdWxlIik7CisgICAgICAgIHByaW50ICJNb2R1bGUtZXhwYW5zaW9uICRtb2R1bGVcbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworICAgIHN0YXRlY2xlYW51cCgpOworfQorCisjIGNvIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBHZXQgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4gVGhpcyB1c2VzIGFueQorIyAgICAgcHJldmlvdXMgQXJndW1lbnQsIERpcmVjdG9yeSwgRW50cnksIG9yIE1vZGlmaWVkIHJlcXVlc3RzLCBpZiB0aGV5IGhhdmUKKyMgICAgIGJlZW4gc2VudC4gQXJndW1lbnRzIHRvIHRoaXMgY29tbWFuZCBhcmUgbW9kdWxlIG5hbWVzOyB0aGUgY2xpZW50IGNhbm5vdAorIyAgICAga25vdyB3aGF0IGRpcmVjdG9yaWVzIHRoZXkgY29ycmVzcG9uZCB0byBleGNlcHQgYnkgKDEpIGp1c3Qgc2VuZGluZyB0aGUKKyMgICAgIGNvIHJlcXVlc3QsIGFuZCB0aGVuIHNlZWluZyB3aGF0IGRpcmVjdG9yeSBuYW1lcyB0aGUgc2VydmVyIHNlbmRzIGJhY2sgaW4KKyMgICAgIGl0cyByZXNwb25zZXMsIGFuZCAoMikgdGhlIGV4cGFuZC1tb2R1bGVzIHJlcXVlc3QuCitzdWIgcmVxX2NvCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiY28iKTsKKworICAgIG15ICRtb2R1bGUgPSAkc3RhdGUtPnthcmdzfVswXTsKKyAgICBteSAkY2hlY2tvdXRfcGF0aCA9ICRtb2R1bGU7CisKKyAgICAjIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgZGlyZWN0b3J5IGlmIHdlJ3JlIGdpdmVuIGl0CisgICAgJGNoZWNrb3V0X3BhdGggPSAkc3RhdGUtPntvcHR9e2R9IGlmICggZXhpc3RzICggJHN0YXRlLT57b3B0fXtkfSApICk7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2NvIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkgKTsKKworICAgICRsb2ctPmluZm8oIkNoZWNraW5nIG91dCBtb2R1bGUgJyRtb2R1bGUnICgkc3RhdGUtPntDVlNST09UfSkgdG8gJyRjaGVja291dF9wYXRoJyIpOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRtb2R1bGUsICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICRjaGVja291dF9wYXRoID1+IHN8LyR8fDsgIyBnZXQgcmlkIG9mIHRyYWlsaW5nIHNsYXNoZXMKKworICAgICMgRWNsaXBzZSBzZWVtcyB0byBuZWVkIHRoZSBDbGVhci1zdGlja3kgY29tbWFuZAorICAgICMgdG8gcHJlcGFyZSB0aGUgJ0VudHJpZXMnIGZpbGUgZm9yIHRoZSBuZXcgZGlyZWN0b3J5LgorICAgIHByaW50ICJDbGVhci1zdGlja3kgJGNoZWNrb3V0X3BhdGgvXG4iOworICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlL1xuIjsKKyAgICBwcmludCAiQ2xlYXItc3RhdGljLWRpcmVjdG9yeSAkY2hlY2tvdXRfcGF0aC9cbiI7CisgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvXG4iOworICAgIHByaW50ICJDbGVhci1zdGlja3kgJGNoZWNrb3V0X3BhdGgvXG4iOyAjIHllcywgdHdpY2UKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIlRlbXBsYXRlICRjaGVja291dF9wYXRoL1xuIjsKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIjBcbiI7CisKKyAgICAjIGluc3RydWN0IHRoZSBjbGllbnQgdGhhdCB3ZSdyZSBjaGVja2luZyBvdXQgdG8gJGNoZWNrb3V0X3BhdGgKKyAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRjaGVja291dF9wYXRoXG4iOworCisgICAgbXkgJXNlZW5kaXJzID0gKCk7CisgICAgbXkgJGxhc3RkaXIgPScnOworCisgICAgIyByZWN1cnNpdmUKKyAgICBzdWIgcHJlcGRpciB7CisgICAgICAgbXkgKCRkaXIsICRyZXBvZGlyLCAkcmVtb3RlZGlyLCAkc2VlbmRpcnMpID0gQF87CisgICAgICAgbXkgJHBhcmVudCA9IGRpcm5hbWUoJGRpcik7CisgICAgICAgJGRpciAgICAgICA9fiBzfC8rJHx8OworICAgICAgICRyZXBvZGlyICAgPX4gc3wvKyR8fDsKKyAgICAgICAkcmVtb3RlZGlyID1+IHN8LyskfHw7CisgICAgICAgJHBhcmVudCAgICA9fiBzfC8rJHx8OworICAgICAgICRsb2ctPmRlYnVnKCJhbm5vdW5jZWRpciAkZGlyLCAkcmVwb2RpciwgJHJlbW90ZWRpciIgKTsKKworICAgICAgIGlmICgkcGFyZW50IGVxICcuJyB8fCAkcGFyZW50IGVxICcuLycpIHsKKyAgICAgICAgICAgJHBhcmVudCA9ICcnOworICAgICAgIH0KKyAgICAgICAjIHJlY3Vyc2UgdG8gYW5ub3VuY2UgdW5zZWVuIHBhcmVudHMgZmlyc3QKKyAgICAgICBpZiAobGVuZ3RoKCRwYXJlbnQpICYmICFleGlzdHMoJHNlZW5kaXJzLT57JHBhcmVudH0pKSB7CisgICAgICAgICAgIHByZXBkaXIoJHBhcmVudCwgJHJlcG9kaXIsICRyZW1vdGVkaXIsICRzZWVuZGlycyk7CisgICAgICAgfQorICAgICAgICMgQW5ub3VuY2UgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IGF0IHRoZSBwYXJlbnQgbGV2ZWwKKyAgICAgICBpZiAoJHBhcmVudCkgeworICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRyZW1vdGVkaXIvJHBhcmVudFxuIjsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRyZW1vdGVkaXJcbiI7CisgICAgICAgfQorICAgICAgIHByaW50ICJDbGVhci1zdGlja3kgJHJlbW90ZWRpci8kcGFyZW50L1xuIjsKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJHBhcmVudC9cbiI7CisKKyAgICAgICBwcmludCAiQ2xlYXItc3RhdGljLWRpcmVjdG9yeSAkcmVtb3RlZGlyLyRkaXIvXG4iOworICAgICAgIHByaW50ICIkcmVwb2Rpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiQ2xlYXItc3RpY2t5ICRyZW1vdGVkaXIvJHBhcmVudC9cbiI7ICMgeWVzLCB0d2ljZQorICAgICAgIHByaW50ICIkcmVwb2Rpci8kcGFyZW50L1xuIjsKKyAgICAgICBwcmludCAiVGVtcGxhdGUgJHJlbW90ZWRpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJGRpci9cbiI7CisgICAgICAgcHJpbnQgIjBcbiI7CisKKyAgICAgICAkc2VlbmRpcnMtPnskZGlyfSA9IDE7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkZ2l0ICggQHskdXBkYXRlci0+Z2V0aGVhZH0gKQorICAgIHsKKyAgICAgICAgIyBEb24ndCB3YW50IHRvIGNoZWNrIG91dCBkZWxldGVkIGZpbGVzCisgICAgICAgIG5leHQgaWYgKCAkZ2l0LT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiApOworCisgICAgICAgICggJGdpdC0+e25hbWV9LCAkZ2l0LT57ZGlyfSApID0gZmlsZW5hbWVzcGxpdCgkZ2l0LT57bmFtZX0pOworCisgICAgICAgaWYgKGxlbmd0aCgkZ2l0LT57ZGlyfSkgJiYgJGdpdC0+e2Rpcn0gbmUgJy4vJworICAgICAgICAgICAmJiAkZ2l0LT57ZGlyfSBuZSAkbGFzdGRpciApIHsKKyAgICAgICAgICAgdW5sZXNzIChleGlzdHMoJHNlZW5kaXJzeyRnaXQtPntkaXJ9fSkpIHsKKyAgICAgICAgICAgICAgIHByZXBkaXIoJGdpdC0+e2Rpcn0sICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgICRjaGVja291dF9wYXRoLCBcJXNlZW5kaXJzKTsKKyAgICAgICAgICAgICAgICRsYXN0ZGlyID0gJGdpdC0+e2Rpcn07CisgICAgICAgICAgICAgICAkc2VlbmRpcnN7JGdpdC0+e2Rpcn19ID0gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nIC8kY2hlY2tvdXRfcGF0aC8kZ2l0LT57ZGlyfVxuIjsKKyAgICAgICB9CisKKyAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGlzIGZpbGUKKyAgICAgICAgcHJpbnQgIk1vZC10aW1lICRnaXQtPnttb2RpZmllZH1cbiI7CisKKyAgICAgICAgIyBwcmludCBzb21lIGluZm9ybWF0aW9uIHRvIHRoZSBjbGllbnQKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJGdpdC0+e2Rpcn0gKSBhbmQgJGdpdC0+e2Rpcn0gbmUgIi4vIiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFUgJGNoZWNrb3V0X3BhdGgvJGdpdC0+e2Rpcn0kZ2l0LT57bmFtZX1cbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiTSBVICRjaGVja291dF9wYXRoLyRnaXQtPntuYW1lfVxuIjsKKyAgICAgICAgfQorCisgICAgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aAorICAgICAgIHByaW50ICJDcmVhdGVkICRjaGVja291dF9wYXRoLyIgLiAoIGRlZmluZWQgKCAkZ2l0LT57ZGlyfSApIGFuZCAkZ2l0LT57ZGlyfSBuZSAiLi8iID8gJGdpdC0+e2Rpcn0gLiAiLyIgOiAiIiApIC4gIlxuIjsKKworICAgICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlLyIgLiAoIGRlZmluZWQgKCAkZ2l0LT57ZGlyfSApIGFuZCAkZ2l0LT57ZGlyfSBuZSAiLi8iID8gJGdpdC0+e2Rpcn0gLiAiLyIgOiAiIiApIC4gIiRnaXQtPntuYW1lfVxuIjsKKworICAgICAgICAjIHRoaXMgaXMgYW4gImVudHJpZXMiIGxpbmUKKyAgICAgICAgbXkgJGtvcHRzID0ga29wdHNfZnJvbV9wYXRoKCRnaXQtPntuYW1lfSk7CisgICAgICAgIHByaW50ICIvJGdpdC0+e25hbWV9LzEuJGdpdC0+e3JldmlzaW9ufS8vJGtvcHRzL1xuIjsKKyAgICAgICAgIyBwZXJtaXNzaW9ucworICAgICAgICBwcmludCAidT0kZ2l0LT57bW9kZX0sZz0kZ2l0LT57bW9kZX0sbz0kZ2l0LT57bW9kZX1cbiI7CisKKyAgICAgICAgIyB0cmFuc21pdCBmaWxlCisgICAgICAgIHRyYW5zbWl0ZmlsZSgkZ2l0LT57ZmlsZWhhc2h9KTsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7CisKKyAgICBzdGF0ZWNsZWFudXAoKTsKK30KKworIyB1cGRhdGUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEFjdHVhbGx5IGRvIGEgY3ZzIHVwZGF0ZSBjb21tYW5kLiBUaGlzIHVzZXMgYW55CisjICAgICBwcmV2aW91cyBBcmd1bWVudCwgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZQorIyAgICAgYmVlbiBzZW50LiBUaGUgbGFzdCBEaXJlY3Rvcnkgc2VudCBzcGVjaWZpZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZQorIyAgICAgdGltZSBvZiB0aGUgb3BlcmF0aW9uLiBUaGUgLUkgb3B0aW9uIGlzIG5vdCB1c2VkLS1maWxlcyB3aGljaCB0aGUgY2xpZW50CisjICAgICBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gaWdub3JlIGFyZSBub3QgbWVudGlvbmVkIGFuZCB0aGUgY2xpZW50IHNlbmRzIHRoZQorIyAgICAgUXVlc3Rpb25hYmxlIHJlcXVlc3QgZm9yIG90aGVycy4KK3N1YiByZXFfdXBkYXRlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX3VwZGF0ZSA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKworICAgIGFyZ3NwbGl0KCJ1cGRhdGUiKTsKKworICAgICMKKyAgICAjIEl0IG1heSBqdXN0IGJlIGEgY2xpZW50IGV4cGxvcmluZyB0aGUgYXZhaWxhYmxlIGhlYWRzL21vZHVsZXMKKyAgICAjIGluIHRoYXQgY2FzZSwgbGlzdCB0aGVtIGFzIHRvcCBsZXZlbCBkaXJlY3RvcmllcyBhbmQgbGVhdmUgaXQKKyAgICAjIGF0IHRoYXQuIEVjbGlwc2UgdXNlcyB0aGlzIHRlY2huaXF1ZSB0byBvZmZlciB5b3UgYSBsaXN0IG9mCisgICAgIyBwcm9qZWN0cyAoaGVhZHMgaW4gdGhpcyBjYXNlKSB0byBjaGVja291dC4KKyAgICAjCisgICAgaWYgKCRzdGF0ZS0+e21vZHVsZX0gZXEgJycpIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogVXBkYXRpbmcgLlxuIjsKKwlvcGVuZGlyIEhFQURTLCAkc3RhdGUtPntDVlNST09UfSAuICcvcmVmcy9oZWFkcyc7CisJd2hpbGUgKG15ICRoZWFkID0gcmVhZGRpcihIRUFEUykpIHsKKwkgICAgaWYgKC1mICRzdGF0ZS0+e0NWU1JPT1R9IC4gJy9yZWZzL2hlYWRzLycgLiAkaGVhZCkgeworCSAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogTmV3IGRpcmVjdG9yeSBgJGhlYWQnXG4iOworCSAgICB9CisJfQorCWNsb3NlZGlyIEhFQURTOworCXByaW50ICJva1xuIjsKKwlyZXR1cm4gMTsKKyAgICB9CisKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMkbG9nLT5kZWJ1ZygidXBkYXRlIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICAkbG9nLT5kZWJ1ZygiUHJvY2Vzc2luZyBmaWxlICRmaWxlbmFtZSIpOworCisgICAgICAgICMgaWYgd2UgaGF2ZSBhIC1DIHdlIHNob3VsZCBwcmV0ZW5kIHdlIG5ldmVyIHNhdyBtb2RpZmllZCBzdHVmZgorICAgICAgICBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17Q30gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGV0ZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9OworICAgICAgICAgICAgZGVsZXRlICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9OworICAgICAgICAgICAgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIG15ICRtZXRhOworICAgICAgICBpZiAoIGRlZmluZWQoJHN0YXRlLT57b3B0fXtyfSkgYW5kICRzdGF0ZS0+e29wdH17cn0gPX4gL14xXC4oXGQrKS8gKQorICAgICAgICB7CisgICAgICAgICAgICAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworICAgICAgICB9CisKKwlpZiAoICEgZGVmaW5lZCAkbWV0YSApCisJeworCSAgICAkbWV0YSA9IHsKKwkgICAgICAgIG5hbWUgPT4gJGZpbGVuYW1lLAorCSAgICAgICAgcmV2aXNpb24gPT4gMCwKKwkgICAgICAgIGZpbGVoYXNoID0+ICdhZGRlZCcKKwkgICAgfTsKKwl9CisKKyAgICAgICAgbXkgJG9sZG1ldGEgPSAkbWV0YTsKKworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgIyBJZiB0aGUgd29ya2luZyBjb3B5IGlzIGFuIG9sZCByZXZpc2lvbiwgbGV0cyBnZXQgdGhhdCB2ZXJzaW9uIHRvbyBmb3IgY29tcGFyaXNvbi4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCR3cmV2KSBhbmQgJHdyZXYgIT0gJG1ldGEtPntyZXZpc2lvbn0gKQorICAgICAgICB7CisgICAgICAgICAgICAkb2xkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHdyZXYpOworICAgICAgICB9CisKKyAgICAgICAgIyRsb2ctPmRlYnVnKCJUYXJnZXQgcmV2aXNpb24gaXMgJG1ldGEtPntyZXZpc2lvbn0sIGN1cnJlbnQgd29ya2luZyByZXZpc2lvbiBpcyAkd3JldiIpOworCisgICAgICAgICMgRmlsZXMgYXJlIHVwIHRvIGRhdGUgaWYgdGhlIHdvcmtpbmcgY29weSBhbmQgcmVwbyBjb3B5IGhhdmUgdGhlIHNhbWUgcmV2aXNpb24sCisgICAgICAgICMgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZCBfYW5kXyB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIC1DCisgICAgICAgIG5leHQgaWYgKCBkZWZpbmVkICggJHdyZXYgKQorICAgICAgICAgICAgICAgICAgYW5kIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pCisgICAgICAgICAgICAgICAgICBhbmQgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICAgICAgIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0KKyAgICAgICAgICAgICAgICAgIGFuZCBub3QgZXhpc3RzICggJHN0YXRlLT57b3B0fXtDfSApICk7CisKKyAgICAgICAgIyBJZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwKKyAgICAgICAgIyBidXQgdGhlIHdvcmtpbmcgY29weSBpcyBtb2RpZmllZCwgdGVsbCB0aGUgY2xpZW50IGl0J3MgbW9kaWZpZWQKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHdyZXYgKQorICAgICAgICAgICAgIGFuZCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KQorICAgICAgICAgICAgIGFuZCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufQorICAgICAgICAgICAgIGFuZCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0pCisgICAgICAgICAgICAgYW5kIG5vdCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJUZWxsIHRoZSBjbGllbnQgdGhlIGZpbGUgaXMgbW9kaWZpZWQiKTsKKyAgICAgICAgICAgIHByaW50ICJNVCB0ZXh0IE0gXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCBuZXdsaW5lXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggJG1ldGEtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwxKTsKKworICAgICAgICAgICAgJGxvZy0+aW5mbygiUmVtb3ZpbmcgJyRmaWxlbmFtZScgZnJvbSB3b3JraW5nIGNvcHkgKG5vIGxvbmdlciBpbiB0aGUgcmVwbykiKTsKKworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogYCRmaWxlbmFtZScgaXMgbm8gbG9uZ2VyIGluIHRoZSByZXBvc2l0b3J5XG4iOworICAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKyAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApIHsKKwkJcHJpbnQgIlJlbW92ZWQgJGRpcnBhcnRcbiI7CisJCXByaW50ICIkZmlsZXBhcnRcbiI7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSApCisJCW9yICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG9sZG1ldGEtPntmaWxlaGFzaH0KKwkJb3IgJG1ldGEtPntmaWxlaGFzaH0gZXEgJ2FkZGVkJyApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgbm9ybWFsIHVwZGF0ZSwganVzdCBzZW5kIHRoZSBuZXcgcmV2aXNpb24gKGVpdGhlciBVPVVwZGF0ZSwKKyAgICAgICAgICAgICMgb3IgQT1BZGQsIG9yIFI9UmVtb3ZlKQorCSAgICBpZiAoIGRlZmluZWQoJHdyZXYpICYmICR3cmV2IDwgMCApCisJICAgIHsKKwkgICAgICAgICRsb2ctPmluZm8oIlRlbGwgdGhlIGNsaWVudCB0aGUgZmlsZSBpcyBzY2hlZHVsZWQgZm9yIHJlbW92YWwiKTsKKwkJcHJpbnQgIk1UIHRleHQgUiBcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKwkJbmV4dDsKKwkgICAgfQorCSAgICBlbHNpZiAoICghZGVmaW5lZCgkd3JldikgfHwgJHdyZXYgPT0gMCkgJiYgKCFkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSB8fCAkbWV0YS0+e3JldmlzaW9ufSA9PSAwKSApCisJICAgIHsKKwkgICAgICAgICRsb2ctPmluZm8oIlRlbGwgdGhlIGNsaWVudCB0aGUgZmlsZSBpcyBzY2hlZHVsZWQgZm9yIGFkZGl0aW9uIik7CisJCXByaW50ICJNVCB0ZXh0IEEgXG4iOworICAgICAgICAgICAgICAgIHByaW50ICJNVCBmbmFtZSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIG5ld2xpbmVcbiI7CisJCW5leHQ7CisKKwkgICAgfQorCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbG9nLT5pbmZvKCJVcGRhdGluZyAnJGZpbGVuYW1lJyB0byAiLiRtZXRhLT57cmV2aXNpb259KTsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgK3VwZGF0ZWRcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIHRleHQgVSBcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKwkJcHJpbnQgIk1UIC11cGRhdGVkXG4iOworCSAgICB9CisKKyAgICAgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsMSk7CisKKwkgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKwkgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKwkgICAgeworCQlpZiAoIGRlZmluZWQgKCAkd3JldiApICkKKwkJeworCQkgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aCBhcyBhIHJlcGxhY2VtZW50CisJCSAgICBwcmludCAiVXBkYXRlLWV4aXN0aW5nICRkaXJwYXJ0XG4iOworCQkgICAgJGxvZy0+ZGVidWcoIlVwZGF0aW5nIGV4aXN0aW5nIGZpbGUgJ1VwZGF0ZS1leGlzdGluZyAkZGlycGFydCciKTsKKwkJfSBlbHNlIHsKKwkJICAgICMgaW5zdHJ1Y3QgY2xpZW50IHdlJ3JlIHNlbmRpbmcgYSBmaWxlIHRvIHB1dCBpbiB0aGlzIHBhdGggYXMgYSBuZXcgZmlsZQorCQkgICAgcHJpbnQgIkNsZWFyLXN0YXRpYy1kaXJlY3RvcnkgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKwkJICAgIHByaW50ICJDbGVhci1zdGlja3kgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKworCQkgICAgJGxvZy0+ZGVidWcoIkNyZWF0aW5nIG5ldyBmaWxlICdDcmVhdGVkICRkaXJwYXJ0JyIpOworCQkgICAgcHJpbnQgIkNyZWF0ZWQgJGRpcnBhcnRcbiI7CisJCX0KKwkJcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lXG4iOworCisJCSMgdGhpcyBpcyBhbiAiZW50cmllcyIgbGluZQorCQlteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGZpbGVwYXJ0KTsKKwkJJGxvZy0+ZGVidWcoIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vJGtvcHRzLyIpOworCQlwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvXG4iOworCisJCSMgcGVybWlzc2lvbnMKKwkJJGxvZy0+ZGVidWcoIlNFTkQgOiB1PSRtZXRhLT57bW9kZX0sZz0kbWV0YS0+e21vZGV9LG89JG1ldGEtPnttb2RlfSIpOworCQlwcmludCAidT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX1cbiI7CisKKwkJIyB0cmFuc21pdCBmaWxlCisJCXRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSk7CisJICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlVwZGF0aW5nICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJG1ldGEtPntuYW1lfSwxKTsKKworICAgICAgICAgICAgbXkgJGRpciA9IHRlbXBkaXIoIERJUiA9PiAkVEVNUF9ESVIsIENMRUFOVVAgPT4gMSApIC4gIi8iOworCisgICAgICAgICAgICBjaGRpciAkZGlyOworICAgICAgICAgICAgbXkgJGZpbGVfbG9jYWwgPSAkZmlsZXBhcnQgLiAiLm1pbmUiOworICAgICAgICAgICAgc3lzdGVtKCJsbiIsIi1zIiwkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSwgJGZpbGVfbG9jYWwpOworICAgICAgICAgICAgbXkgJGZpbGVfb2xkID0gJGZpbGVwYXJ0IC4gIi4iIC4gJG9sZG1ldGEtPntyZXZpc2lvbn07CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG9sZG1ldGEtPntmaWxlaGFzaH0sICRmaWxlX29sZCk7CisgICAgICAgICAgICBteSAkZmlsZV9uZXcgPSAkZmlsZXBhcnQgLiAiLiIgLiAkbWV0YS0+e3JldmlzaW9ufTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSwgJGZpbGVfbmV3KTsKKworICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIG1lcmdlIHdpdGggdGhlIGxvY2FsIGNoYW5nZXMgKCBNPXN1Y2Nlc3NmdWwgbWVyZ2UsIEM9Y29uZmxpY3QgbWVyZ2UgKQorICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2luZyAkZmlsZV9sb2NhbCwgJGZpbGVfb2xkLCAkZmlsZV9uZXciKTsKKyAgICAgICAgICAgIHByaW50ICJNIE1lcmdpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiAxLiRvbGRtZXRhLT57cmV2aXNpb259IGFuZCAxLiRtZXRhLT57cmV2aXNpb259IGludG8gJGZpbGVuYW1lXG4iOworCisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiVGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgbWVyZ2UgaXMgJGRpciIpOworCisgICAgICAgICAgICBteSAkcmV0dXJuID0gc3lzdGVtKCJnaXQiLCAibWVyZ2UtZmlsZSIsICRmaWxlX2xvY2FsLCAkZmlsZV9vbGQsICRmaWxlX25ldyk7CisgICAgICAgICAgICAkcmV0dXJuID4+PSA4OworCisgICAgICAgICAgICBpZiAoICRyZXR1cm4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2VkIHN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgICAgIHByaW50ICJNIE0gJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJNZXJnZWQgJGRpcnBhcnQiKTsKKworICAgICAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJNZXJnZWQgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZSIpOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICAgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLyRrb3B0cy9cbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcmV0dXJuID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRsb2ctPmluZm8oIk1lcmdlZCB3aXRoIGNvbmZsaWN0cyIpOworICAgICAgICAgICAgICAgIHByaW50ICJFIGN2cyB1cGRhdGU6IGNvbmZsaWN0cyBmb3VuZCBpbiAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk0gQyAkZmlsZW5hbWVcbiI7CisKKyAgICAgICAgICAgICAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludCAiTWVyZ2VkICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICAgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259LysvJGtvcHRzL1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiTWVyZ2UgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKyAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJTRU5EIDogdT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX0iKTsKKyAgICAgICAgICAgICAgICBwcmludCAidT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX1cbiI7CisKKyAgICAgICAgICAgICAgICAjIHRyYW5zbWl0IGZpbGUsIGZvcm1hdCBpcyBzaW5nbGUgaW50ZWdlciBvbiBhIGxpbmUgYnkgaXRzZWxmIChmaWxlCisgICAgICAgICAgICAgICAgIyBzaXplKSBmb2xsb3dlZCBieSB0aGUgZmlsZSBjb250ZW50cworICAgICAgICAgICAgICAgICMgVE9ETyA6IHdlIHNob3VsZCBjb3B5IGZpbGVzIGluIGJsb2NrcworICAgICAgICAgICAgICAgIG15ICRkYXRhID0gYGNhdCAkZmlsZV9sb2NhbGA7CisgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIkZpbGUgc2l6ZSA6ICIgLiBsZW5ndGgoJGRhdGEpKTsKKyAgICAgICAgICAgICAgICBwcmludCBsZW5ndGgoJGRhdGEpIC4gIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAkZGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hkaXIgIi8iOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKK3N1YiByZXFfY2kKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJjaSIpOworCisgICAgIyRsb2ctPmRlYnVnKCJTdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAkbG9nLT5pbmZvKCJyZXFfY2kgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisKKyAgICBpZiAoICRzdGF0ZS0+e21ldGhvZH0gZXEgJ3BzZXJ2ZXInKQorICAgIHsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgcHNlcnZlciBhY2Nlc3MgY2Fubm90IGNvbW1pdFxuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICBpZiAoIC1lICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi9pbmRleCIgKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiZmlsZSAnaW5kZXgnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBnaXQgcmVwb3NpdG9yeSIpOworICAgICAgICBwcmludCAiZXJyb3IgMSBJbmRleCBhbHJlYWR5IGV4aXN0cyBpbiBnaXQgcmVwb1xuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIgKCBESVIgPT4gJFRFTVBfRElSICk7CisgICAgbXkgKCB1bmRlZiwgJGZpbGVfaW5kZXggKSA9IHRlbXBmaWxlICggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgJGxvZy0+aW5mbygiTG9ja2xlc3MgY29tbWl0IHN0YXJ0LCBiYXNpbmcgY29tbWl0IG9uICckdG1wZGlyJywgaW5kZXggZmlsZSBpcyAnJGZpbGVfaW5kZXgnIik7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisgICAgJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkZmlsZV9pbmRleDsKKworICAgICMgUmVtZW1iZXIgd2hlcmUgdGhlIGhlYWQgd2FzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgbXkgJHBhcmVudGhhc2ggPSBgZ2l0IHNob3ctcmVmIC1zIHJlZnMvaGVhZHMvJHN0YXRlLT57bW9kdWxlfWA7CisgICAgY2hvbXAgJHBhcmVudGhhc2g7CisgICAgaWYgKCRwYXJlbnRoYXNoICF+IC9eWzAtOWEtZl17NDB9JC8pIHsKKwkgICAgcHJpbnQgImVycm9yIDEgcHNlcnZlciBjYW5ub3QgZmluZCB0aGUgY3VycmVudCBIRUFEIG9mIG1vZHVsZSI7CisJICAgIGV4aXQ7CisgICAgfQorCisgICAgY2hkaXIgJHRtcGRpcjsKKworICAgICMgcG9wdWxhdGUgdGhlIHRlbXBvcmFyeSBpbmRleCBiYXNlZAorICAgIHN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRwYXJlbnRoYXNoKTsKKyAgICB1bmxlc3MgKCQ/ID09IDApCisgICAgeworCWRpZSAiRXJyb3IgcnVubmluZyBnaXQtcmVhZC10cmVlICRzdGF0ZS0+e21vZHVsZX0gJGZpbGVfaW5kZXggJCEiOworICAgIH0KKyAgICAkbG9nLT5pbmZvKCJDcmVhdGVkIGluZGV4ICckZmlsZV9pbmRleCcgd2l0aCBmb3IgaGVhZCAkc3RhdGUtPnttb2R1bGV9IC0gZXhpdCBzdGF0dXMgJD8iKTsKKworICAgIG15IEBjb21taXR0ZWRmaWxlcyA9ICgpOworICAgIG15ICVvbGRtZXRhOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLi4uCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICBteSAkY29tbWl0dGVkZmlsZSA9ICRmaWxlbmFtZTsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBuZXh0IHVubGVzcyAoIGV4aXN0cyAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSBvciBub3QgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ICk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCSRvbGRtZXRheyRmaWxlbmFtZX0gPSAkbWV0YTsKKworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSk7CisKKyAgICAgICAgIyBkbyBhIGNoZWNrb3V0IG9mIHRoZSBmaWxlIGlmIGl0IHBhcnQgb2YgdGhpcyB0cmVlCisgICAgICAgIGlmICgkd3JldikgeworICAgICAgICAgICAgc3lzdGVtKCdnaXQtY2hlY2tvdXQtaW5kZXgnLCAnLWYnLCAnLXUnLCAkZmlsZW5hbWUpOworICAgICAgICAgICAgdW5sZXNzICgkPyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGllICJFcnJvciBydW5uaW5nIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAkZmlsZW5hbWUgOiAkISI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBteSAkYWRkZmxhZyA9IDA7CisgICAgICAgIG15ICRybWZsYWcgPSAwOworICAgICAgICAkcm1mbGFnID0gMSBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiA8IDAgKTsKKyAgICAgICAgJGFkZGZsYWcgPSAxIHVubGVzcyAoIC1lICRmaWxlbmFtZSApOworCisgICAgICAgICMgRG8gdXAgdG8gZGF0ZSBjaGVja2luZworICAgICAgICB1bmxlc3MgKCAkYWRkZmxhZyBvciAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSBvciAoICRybWZsYWcgYW5kIC0kd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSApICkKKyAgICAgICAgeworICAgICAgICAgICAgIyBmYWlsIGV2ZXJ5dGhpbmcgaWYgYW4gdXAgdG8gZGF0ZSBjaGVjayBmYWlscworICAgICAgICAgICAgcHJpbnQgImVycm9yIDEgVXAgdG8gZGF0ZSBjaGVjayBmYWlsZWQgZm9yICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgIGNoZGlyICIvIjsKKyAgICAgICAgICAgIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBwdXNoIEBjb21taXR0ZWRmaWxlcywgJGNvbW1pdHRlZGZpbGU7CisgICAgICAgICRsb2ctPmluZm8oIkNvbW1pdHRpbmcgJGZpbGVuYW1lIik7CisKKyAgICAgICAgc3lzdGVtKCJta2RpciIsIi1wIiwkZGlycGFydCkgdW5sZXNzICggLWQgJGRpcnBhcnQgKTsKKworICAgICAgICB1bmxlc3MgKCAkcm1mbGFnICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+ZGVidWcoInJlbmFtZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSAkZmlsZW5hbWUiKTsKKyAgICAgICAgICAgIHJlbmFtZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSwkZmlsZW5hbWU7CisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIG1vZGVzIHRvIHJlbW92ZQorICAgICAgICAgICAgbXkgJGludm1vZGUgPSAiIjsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBxdyAociB3IHgpICkgeyAkaW52bW9kZSAuPSAkXyB1bmxlc3MgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9ID1+IC8kXy8gKTsgfQorCisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiY2htb2QgdSsiIC4gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9tb2RlfSAuICItIiAuICRpbnZtb2RlIC4gIiAkZmlsZW5hbWUiKTsKKyAgICAgICAgICAgIHN5c3RlbSgiY2htb2QiLCJ1KyIgLiAgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9tb2RlfSAuICItIiAuICRpbnZtb2RlLCAkZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAkcm1mbGFnICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiUmVtb3ZpbmcgZmlsZSAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgdW5saW5rKCRmaWxlbmFtZSk7CisgICAgICAgICAgICBzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCAiLS1yZW1vdmUiLCAkZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGFkZGZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJBZGRpbmcgZmlsZSAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwgIi0tYWRkIiwgJGZpbGVuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlVwZGF0aW5nIGZpbGUgJyRmaWxlbmFtZSciKTsKKyAgICAgICAgICAgIHN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bmxlc3MgKCBzY2FsYXIoQGNvbW1pdHRlZGZpbGVzKSA+IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgTm8gZmlsZXMgdG8gY29tbWl0XG4iOworICAgICAgICBwcmludCAib2tcbiI7CisgICAgICAgIGNoZGlyICIvIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG15ICR0cmVlaGFzaCA9IGBnaXQtd3JpdGUtdHJlZWA7CisgICAgY2hvbXAgJHRyZWVoYXNoOworCisgICAgJGxvZy0+ZGVidWcoIlRyZWVoYXNoIDogJHRyZWVoYXNoLCBQYXJlbnRoYXNoIDogJHBhcmVudGhhc2giKTsKKworICAgICMgd3JpdGUgb3VyIGNvbW1pdCBtZXNzYWdlIG91dCBpZiB3ZSBoYXZlIG9uZSAuLi4KKyAgICBteSAoICRtc2dfZmgsICRtc2dfZmlsZW5hbWUgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSICk7CisgICAgcHJpbnQgJG1zZ19maCAkc3RhdGUtPntvcHR9e219OyMgaWYgKCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e219ICkgKTsKKyAgICBwcmludCAkbXNnX2ZoICJcblxudmlhIGdpdC1DVlMgZW11bGF0b3JcbiI7CisgICAgY2xvc2UgJG1zZ19maDsKKworICAgIG15ICRjb21taXRoYXNoID0gYGdpdC1jb21taXQtdHJlZSAkdHJlZWhhc2ggLXAgJHBhcmVudGhhc2ggPCAkbXNnX2ZpbGVuYW1lYDsKKyAgICBjaG9tcCgkY29tbWl0aGFzaCk7CisgICAgJGxvZy0+aW5mbygiQ29tbWl0IGhhc2ggOiAkY29tbWl0aGFzaCIpOworCisgICAgdW5sZXNzICggJGNvbW1pdGhhc2ggPX4gL1thLXpBLVowLTldezQwfS8gKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiQ29tbWl0IGZhaWxlZCAoSW52YWxpZCBjb21taXQgaGFzaCkiKTsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgQ29tbWl0IGZhaWxlZCAodW5rbm93biByZWFzb24pXG4iOworICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIGV4aXQ7CisgICAgfQorCisJIyBDaGVjayB0aGF0IHRoaXMgaXMgYWxsb3dlZCwganVzdCBhcyB3ZSB3b3VsZCB3aXRoIGEgcmVjZWl2ZS1wYWNrCisJbXkgQGNtZCA9ICggJEVOVntHSVRfRElSfS4naG9va3MvdXBkYXRlJywgInJlZnMvaGVhZHMvJHN0YXRlLT57bW9kdWxlfSIsCisJCQkkcGFyZW50aGFzaCwgJGNvbW1pdGhhc2ggKTsKKwlpZiggLXggJGNtZFswXSApIHsKKwkJdW5sZXNzKCBzeXN0ZW0oIEBjbWQgKSA9PSAwICkKKwkJeworCQkJJGxvZy0+d2FybigiQ29tbWl0IGZhaWxlZCAodXBkYXRlIGhvb2sgZGVjbGluZWQgdG8gdXBkYXRlIHJlZikiKTsKKwkJCXByaW50ICJlcnJvciAxIENvbW1pdCBmYWlsZWQgKHVwZGF0ZSBob29rIGRlY2xpbmVkKVxuIjsKKwkJCWNoZGlyICIvIjsKKwkJCWV4aXQ7CisJCX0KKwl9CisKKwlpZiAoc3lzdGVtKHF3KGdpdCB1cGRhdGUtcmVmIC1tKSwgImN2c3NlcnZlciBjaSIsCisJCQkicmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9IiwgJGNvbW1pdGhhc2gsICRwYXJlbnRoYXNoKSkgeworCQkkbG9nLT53YXJuKCJ1cGRhdGUtcmVmIGZvciAkc3RhdGUtPnttb2R1bGV9IGZhaWxlZC4iKTsKKwkJcHJpbnQgImVycm9yIDEgQ2Fubm90IGNvbW1pdCAtLSB1cGRhdGUgZmlyc3RcbiI7CisJCWV4aXQ7CisJfQorCisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLi4uCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAY29tbWl0dGVkZmlsZXMgKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisJdW5sZXNzIChkZWZpbmVkICRtZXRhLT57cmV2aXNpb259KSB7CisJICAkbWV0YS0+e3JldmlzaW9ufSA9IDE7CisJfQorCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsIDEpOworCisgICAgICAgICRsb2ctPmRlYnVnKCJDaGVja2VkLWluICRkaXJwYXJ0IDogJGZpbGVuYW1lIik7CisKKwlwcmludCAiTSAkc3RhdGUtPntDVlNST09UfS8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZSx2ICA8LS0gICRkaXJwYXJ0JGZpbGVwYXJ0XG4iOworICAgICAgICBpZiAoIGRlZmluZWQgJG1ldGEtPntmaWxlaGFzaH0gJiYgJG1ldGEtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gbmV3IHJldmlzaW9uOiBkZWxldGU7IHByZXZpb3VzIHJldmlzaW9uOiAxLiRvbGRtZXRheyRmaWxlbmFtZX17cmV2aXNpb259XG4iOworICAgICAgICAgICAgcHJpbnQgIlJlbW92ZS1lbnRyeSAkZGlycGFydFxuIjsKKyAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoJG1ldGEtPntyZXZpc2lvbn0gPT0gMSkgeworCSAgICAgICAgcHJpbnQgIk0gaW5pdGlhbCByZXZpc2lvbjogMS4xXG4iOworICAgICAgICAgICAgfSBlbHNlIHsKKwkgICAgICAgIHByaW50ICJNIG5ldyByZXZpc2lvbjogMS4kbWV0YS0+e3JldmlzaW9ufTsgcHJldmlvdXMgcmV2aXNpb246IDEuJG9sZG1ldGF7JGZpbGVuYW1lfXtyZXZpc2lvbn1cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludCAiQ2hlY2tlZC1pbiAkZGlycGFydFxuIjsKKyAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGZpbGVwYXJ0KTsKKyAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLyRrb3B0cy9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGRpciAiLyI7CisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX3N0YXR1cworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoInN0YXR1cyIpOworCisgICAgJGxvZy0+aW5mbygicmVxX3N0YXR1cyA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKyAgICAjJGxvZy0+ZGVidWcoInN0YXR1cyBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgc3RhdHVzIG9uIC4uLgorICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICRvbGRtZXRhID0gJG1ldGE7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgSWYgdGhlIHdvcmtpbmcgY29weSBpcyBhbiBvbGQgcmV2aXNpb24sIGxldHMgZ2V0IHRoYXQgdmVyc2lvbiB0b28gZm9yIGNvbXBhcmlzb24uCisgICAgICAgIGlmICggZGVmaW5lZCgkd3JldikgYW5kICR3cmV2ICE9ICRtZXRhLT57cmV2aXNpb259ICkKKyAgICAgICAgeworICAgICAgICAgICAgJG9sZG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgfQorCisgICAgICAgICMgVE9ETyA6IEFsbCBwb3NzaWJsZSBzdGF0dXNlcyBhcmVuJ3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgIG15ICRzdGF0dXM7CisgICAgICAgICMgRmlsZXMgYXJlIHVwIHRvIGRhdGUgaWYgdGhlIHdvcmtpbmcgY29weSBhbmQgcmVwbyBjb3B5IGhhdmUgdGhlIHNhbWUgcmV2aXNpb24sIGFuZCB0aGUgd29ya2luZyBjb3B5IGlzIHVubW9kaWZpZWQKKyAgICAgICAgJHN0YXR1cyA9ICJVcC10by1kYXRlIiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSBhbmQgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfSBhbmQgKCBub3QgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17Y29uZmxpY3R9ICkgb3IgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gIX4gL15cKz0vICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG1ldGEtPntmaWxlaGFzaH0gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgIyBOZWVkIGNoZWNrb3V0IGlmIHRoZSB3b3JraW5nIGNvcHkgaGFzIGFuIG9sZGVyIHJldmlzaW9uIHRoYW4gdGhlIHJlcG8gY29weSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZAorICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgQ2hlY2tvdXQiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQgKCAkbWV0YS0+e3JldmlzaW9ufSApIGFuZCAkbWV0YS0+e3JldmlzaW9ufSA+ICR3cmV2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICggZGVmaW5lZCgkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9KSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSBlcSAkb2xkbWV0YS0+e2ZpbGVoYXNofSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICMgTmVlZCBjaGVja291dCBpZiBpdCBleGlzdHMgaW4gdGhlIHJlcG8gYnV0IGRvZXNuJ3QgaGF2ZSBhIHdvcmtpbmcgY29weQorICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgQ2hlY2tvdXQiIGlmICggbm90IGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSApOworCisgICAgICAgICMgTG9jYWxseSBtb2RpZmllZCBpZiB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uIGJ1dCB0aGVyZSBhcmUgbG9jYWwgY2hhbmdlcworICAgICAgICAkc3RhdHVzIHx8PSAiTG9jYWxseSBNb2RpZmllZCIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259IGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApOworCisgICAgICAgICMgTmVlZHMgTWVyZ2UgaWYgd29ya2luZyBjb3B5IHJldmlzaW9uIGlzIGxlc3MgdGhhbiByZXBvIGNvcHkgYW5kIHRoZXJlIGFyZSBsb2NhbCBjaGFuZ2VzCisgICAgICAgICRzdGF0dXMgfHw9ICJOZWVkcyBNZXJnZSIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgYW5kICRtZXRhLT57cmV2aXNpb259ID4gJHdyZXYgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICk7CisKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgQWRkZWQiIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ICkgYW5kIG5vdCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSApOworICAgICAgICAkc3RhdHVzIHx8PSAiTG9jYWxseSBSZW1vdmVkIiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSBhbmQgLSR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259ICk7CisgICAgICAgICRzdGF0dXMgfHw9ICJVbnJlc29sdmVkIENvbmZsaWN0IiBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSApIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSA9fiAvXlwrPS8gKTsKKyAgICAgICAgJHN0YXR1cyB8fD0gIkZpbGUgaGFkIGNvbmZsaWN0cyBvbiBtZXJnZSIgaWYgKCAwICk7CisKKyAgICAgICAgJHN0YXR1cyB8fD0gIlVua25vd24iOworCisgICAgICAgIHByaW50ICJNID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgICAgICAgIHByaW50ICJNIEZpbGU6ICRmaWxlbmFtZVx0U3RhdHVzOiAkc3RhdHVzXG4iOworICAgICAgICBpZiAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0pICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gV29ya2luZyByZXZpc2lvbjpcdCIgLiAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSAuICJcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiTSBXb3JraW5nIHJldmlzaW9uOlx0Tm8gZW50cnkgZm9yICRmaWxlbmFtZVxuIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gUmVwb3NpdG9yeSByZXZpc2lvbjpcdDEuIiAuICRtZXRhLT57cmV2aXNpb259IC4gIlx0JHN0YXRlLT57Q1ZTUk9PVH0vJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWUsdlxuIjsKKyAgICAgICAgICAgIHByaW50ICJNIFN0aWNreSBUYWc6XHRcdChub25lKVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNIFN0aWNreSBEYXRlOlx0XHQobm9uZSlcbiI7CisgICAgICAgICAgICBwcmludCAiTSBTdGlja3kgT3B0aW9uczpcdFx0KG5vbmUpXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIk0gUmVwb3NpdG9yeSByZXZpc2lvbjpcdE5vIHJldmlzaW9uIGNvbnRyb2wgZmlsZVxuIjsKKyAgICAgICAgfQorICAgICAgICBwcmludCAiTVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKK3N1YiByZXFfZGlmZgoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImRpZmYiKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfZGlmZiA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKyAgICAjJGxvZy0+ZGVidWcoInN0YXR1cyBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICBteSAoJHJldmlzaW9uMSwgJHJldmlzaW9uMik7CisgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57b3B0fXtyfSApIGFuZCByZWYgJHN0YXRlLT57b3B0fXtyfSBlcSAiQVJSQVkiICkKKyAgICB7CisgICAgICAgICRyZXZpc2lvbjEgPSAkc3RhdGUtPntvcHR9e3J9WzBdOworICAgICAgICAkcmV2aXNpb24yID0gJHN0YXRlLT57b3B0fXtyfVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICAkcmV2aXNpb24xID0gJHN0YXRlLT57b3B0fXtyfTsKKyAgICB9CisKKyAgICAkcmV2aXNpb24xID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjEgKSApOworICAgICRyZXZpc2lvbjIgPX4gcy9eMVwuLy8gaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMiApICk7CisKKyAgICAkbG9nLT5kZWJ1ZygiRGlmZmluZyByZXZpc2lvbnMgIiAuICggZGVmaW5lZCgkcmV2aXNpb24xKSA/ICRyZXZpc2lvbjEgOiAiW05VTExdIiApIC4gIiBhbmQgIiAuICggZGVmaW5lZCgkcmV2aXNpb24yKSA/ICRyZXZpc2lvbjIgOiAiW05VTExdIiApICk7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgc3RhdHVzIG9uIC4uLgorICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAoICRmaCwgJGZpbGUxLCAkZmlsZTIsICRtZXRhMSwgJG1ldGEyLCAkZmlsZWRpZmYgKTsKKworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgIyBXZSBuZWVkIF9zb21ldGhpbmdfIHRvIGRpZmYgYWdhaW5zdAorICAgICAgICBuZXh0IHVubGVzcyAoIGRlZmluZWQgKCAkd3JldiApICk7CisKKyAgICAgICAgIyBpZiB3ZSBoYXZlIGEgLXIgc3dpdGNoLCB1c2UgaXQKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMSApICkKKyAgICAgICAgeworICAgICAgICAgICAgKCB1bmRlZiwgJGZpbGUxICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgICAgICAgICAkbWV0YTEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICRyZXZpc2lvbjEpOworICAgICAgICAgICAgdW5sZXNzICggZGVmaW5lZCAoICRtZXRhMSApIGFuZCAkbWV0YTEtPntmaWxlaGFzaH0gbmUgImRlbGV0ZWQiICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludCAiRSBGaWxlICRmaWxlbmFtZSBhdCByZXZpc2lvbiAxLiRyZXZpc2lvbjEgZG9lc24ndCBleGlzdFxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhMS0+e2ZpbGVoYXNofSwgJGZpbGUxKTsKKyAgICAgICAgfQorICAgICAgICAjIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgd29ya2luZyBjb3B5IHJldmlzaW9uCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKCB1bmRlZiwgJGZpbGUxICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgICAgICAgICAkbWV0YTEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTEtPntmaWxlaGFzaH0sICRmaWxlMSk7CisgICAgICAgIH0KKworICAgICAgICAjIGlmIHdlIGhhdmUgYSBzZWNvbmQgLXIgc3dpdGNoLCB1c2UgaXQgdG9vCisgICAgICAgIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMiApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGEyID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkcmV2aXNpb24yKTsKKworICAgICAgICAgICAgdW5sZXNzICggZGVmaW5lZCAoICRtZXRhMiApIGFuZCAkbWV0YTItPntmaWxlaGFzaH0gbmUgImRlbGV0ZWQiICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludCAiRSBGaWxlICRmaWxlbmFtZSBhdCByZXZpc2lvbiAxLiRyZXZpc2lvbjIgZG9lc24ndCBleGlzdFxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG1ldGEyLT57ZmlsZWhhc2h9LCAkZmlsZTIpOworICAgICAgICB9CisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGp1c3QgdXNlIHRoZSB3b3JraW5nIGNvcHkKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAkZmlsZTIgPSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfTsKKyAgICAgICAgfQorCisgICAgICAgICMgaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIC1yLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhICRmaWxlMiB5ZXQsIGxldHMgZ2V0IG9uZQorICAgICAgICBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24xICkgYW5kIG5vdCBkZWZpbmVkICggJGZpbGUyICkgKQorICAgICAgICB7CisgICAgICAgICAgICAoIHVuZGVmLCAkZmlsZTIgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSLCBPUEVOID0+IDAgKTsKKyAgICAgICAgICAgICRtZXRhMiA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHdyZXYpOworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhMi0+e2ZpbGVoYXNofSwgJGZpbGUyKTsKKyAgICAgICAgfQorCisgICAgICAgICMgV2UgbmVlZCB0byBoYXZlIHJldHJpZXZlZCBzb21ldGhpbmcgdXNlZnVsCisgICAgICAgIG5leHQgdW5sZXNzICggZGVmaW5lZCAoICRtZXRhMSApICk7CisKKyAgICAgICAgIyBGaWxlcyB0byBkYXRlIGlmIHRoZSB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uLCBhbmQgdGhlIHdvcmtpbmcgY29weSBpcyB1bm1vZGlmaWVkCisgICAgICAgIG5leHQgaWYgKCBub3QgZGVmaW5lZCAoICRtZXRhMiApIGFuZCAkd3JldiA9PSAkbWV0YTEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICggKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gYW5kICggbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSApIG9yICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17Y29uZmxpY3R9ICF+IC9eXCs9LyApICkKKyAgICAgICAgICAgICAgICAgICAgIG9yICggZGVmaW5lZCgkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9KSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSBlcSAkbWV0YTEtPntmaWxlaGFzaH0gKSApCisgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICMgQXBwYXJlbnRseSB3ZSBvbmx5IHNob3cgZGlmZnMgZm9yIGxvY2FsbHkgbW9kaWZpZWQgZmlsZXMKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBkZWZpbmVkKCRtZXRhMikgb3IgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICkgKTsKKworICAgICAgICBwcmludCAiTSBJbmRleDogJGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgICAgICBwcmludCAiTSBSQ1MgZmlsZTogJHN0YXRlLT57Q1ZTUk9PVH0vJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWUsdlxuIjsKKyAgICAgICAgcHJpbnQgIk0gcmV0cmlldmluZyByZXZpc2lvbiAxLiRtZXRhMS0+e3JldmlzaW9ufVxuIiBpZiAoIGRlZmluZWQgKCAkbWV0YTEgKSApOworICAgICAgICBwcmludCAiTSByZXRyaWV2aW5nIHJldmlzaW9uIDEuJG1ldGEyLT57cmV2aXNpb259XG4iIGlmICggZGVmaW5lZCAoICRtZXRhMiApICk7CisgICAgICAgIHByaW50ICJNIGRpZmYgIjsKKyAgICAgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyAleyRzdGF0ZS0+e29wdH19ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCByZWYgJHN0YXRlLT57b3B0fXskb3B0fSBlcSAiQVJSQVkiICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoIEB7JHN0YXRlLT57b3B0fXskb3B0fX0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIi0kb3B0ICR2YWx1ZSAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnQgIi0kb3B0ICI7CisgICAgICAgICAgICAgICAgcHJpbnQgIiRzdGF0ZS0+e29wdH17JG9wdH0gIiBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntvcHR9eyRvcHR9ICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworCisgICAgICAgICRsb2ctPmluZm8oIkRpZmZpbmcgJGZpbGVuYW1lIC1yICRtZXRhMS0+e3JldmlzaW9ufSAtciAiIC4gKCAkbWV0YTItPntyZXZpc2lvbn0gb3IgIndvcmtpbmdjb3B5IiApKTsKKworICAgICAgICAoICRmaCwgJGZpbGVkaWZmICkgPSB0ZW1wZmlsZSAoIERJUiA9PiAkVEVNUF9ESVIgKTsKKworICAgICAgICBpZiAoIGV4aXN0cyAkc3RhdGUtPntvcHR9e3V9ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3lzdGVtKCJkaWZmIC11IC1MICckZmlsZW5hbWUgcmV2aXNpb24gMS4kbWV0YTEtPntyZXZpc2lvbn0nIC1MICckZmlsZW5hbWUgIiAuICggZGVmaW5lZCgkbWV0YTItPntyZXZpc2lvbn0pID8gInJldmlzaW9uIDEuJG1ldGEyLT57cmV2aXNpb259IiA6ICJ3b3JraW5nIGNvcHkiICkgLiAiJyAkZmlsZTEgJGZpbGUyID4gJGZpbGVkaWZmIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzeXN0ZW0oImRpZmYgJGZpbGUxICRmaWxlMiA+ICRmaWxlZGlmZiIpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCA8JGZoPiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNICRfIjsKKyAgICAgICAgfQorICAgICAgICBjbG9zZSAkZmg7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2xvZworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImxvZyIpOworCisgICAgJGxvZy0+ZGVidWcoInJlcV9sb2cgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisgICAgIyRsb2ctPmRlYnVnKCJsb2cgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgbXkgKCAkbWlucmV2LCAkbWF4cmV2ICk7CisgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57b3B0fXtyfSApIGFuZCAkc3RhdGUtPntvcHR9e3J9ID1+IC8oW1xkLl0rKT8oOjo/KShbXGQuXSspPy8gKQorICAgIHsKKyAgICAgICAgbXkgJGNvbnRyb2wgPSAkMjsKKyAgICAgICAgJG1pbnJldiA9ICQxOworICAgICAgICAkbWF4cmV2ID0gJDM7CisgICAgICAgICRtaW5yZXYgPX4gcy9eMVwuLy8gaWYgKCBkZWZpbmVkICggJG1pbnJldiApICk7CisgICAgICAgICRtYXhyZXYgPX4gcy9eMVwuLy8gaWYgKCBkZWZpbmVkICggJG1heHJldiApICk7CisgICAgICAgICRtaW5yZXYrKyBpZiAoIGRlZmluZWQoJG1pbnJldikgYW5kICRjb250cm9sIGVxICI6OiIgKTsKKyAgICB9CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgc3RhdHVzIG9uIC4uLgorICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkaGVhZG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICRyZXZpc2lvbnMgPSAkdXBkYXRlci0+Z2V0bG9nKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICR0b3RhbHJldmlzaW9ucyA9IHNjYWxhcihAJHJldmlzaW9ucyk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJG1pbnJldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlJlbW92aW5nIHJldmlzaW9ucyBsZXNzIHRoYW4gJG1pbnJldiIpOworICAgICAgICAgICAgd2hpbGUgKCBzY2FsYXIoQCRyZXZpc2lvbnMpID4gMCBhbmQgJHJldmlzaW9ucy0+Wy0xXXtyZXZpc2lvbn0gPCAkbWlucmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3AgQCRyZXZpc2lvbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBkZWZpbmVkICggJG1heHJldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlJlbW92aW5nIHJldmlzaW9ucyBncmVhdGVyIHRoYW4gJG1heHJldiIpOworICAgICAgICAgICAgd2hpbGUgKCBzY2FsYXIoQCRyZXZpc2lvbnMpID4gMCBhbmQgJHJldmlzaW9ucy0+WzBde3JldmlzaW9ufSA+ICRtYXhyZXYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoaWZ0IEAkcmV2aXNpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBzY2FsYXIoQCRyZXZpc2lvbnMpICk7CisKKyAgICAgICAgcHJpbnQgIk0gXG4iOworICAgICAgICBwcmludCAiTSBSQ1MgZmlsZTogJHN0YXRlLT57Q1ZTUk9PVH0vJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWUsdlxuIjsKKyAgICAgICAgcHJpbnQgIk0gV29ya2luZyBmaWxlOiAkZmlsZW5hbWVcbiI7CisgICAgICAgIHByaW50ICJNIGhlYWQ6IDEuJGhlYWRtZXRhLT57cmV2aXNpb259XG4iOworICAgICAgICBwcmludCAiTSBicmFuY2g6XG4iOworICAgICAgICBwcmludCAiTSBsb2Nrczogc3RyaWN0XG4iOworICAgICAgICBwcmludCAiTSBhY2Nlc3MgbGlzdDpcbiI7CisgICAgICAgIHByaW50ICJNIHN5bWJvbGljIG5hbWVzOlxuIjsKKyAgICAgICAgcHJpbnQgIk0ga2V5d29yZCBzdWJzdGl0dXRpb246IGt2XG4iOworICAgICAgICBwcmludCAiTSB0b3RhbCByZXZpc2lvbnM6ICR0b3RhbHJldmlzaW9ucztcdHNlbGVjdGVkIHJldmlzaW9uczogIiAuIHNjYWxhcihAJHJldmlzaW9ucykgLiAiXG4iOworICAgICAgICBwcmludCAiTSBkZXNjcmlwdGlvbjpcbiI7CisKKyAgICAgICAgZm9yZWFjaCBteSAkcmV2aXNpb24gKCBAJHJldmlzaW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICAgICAgICBwcmludCAiTSByZXZpc2lvbiAxLiRyZXZpc2lvbi0+e3JldmlzaW9ufVxuIjsKKyAgICAgICAgICAgICMgcmVmb3JtYXQgdGhlIGRhdGUgZm9yIGxvZyBvdXRwdXQKKyAgICAgICAgICAgICRyZXZpc2lvbi0+e21vZGlmaWVkfSA9IHNwcmludGYoJyUwNGQvJTAyZC8lMDJkICVzJywgJDMsICREQVRFX0xJU1QtPnskMn0sICQxLCAkNCApIGlmICggJHJldmlzaW9uLT57bW9kaWZpZWR9ID1+IC8oXGQrKVxzKyhcdyspXHMrKFxkKylccysoXFMrKS8gYW5kIGRlZmluZWQoJERBVEVfTElTVC0+eyQyfSkgKTsKKyAgICAgICAgICAgICRyZXZpc2lvbi0+e2F1dGhvcn0gPX4gcy9ccysuKi8vOworICAgICAgICAgICAgJHJldmlzaW9uLT57YXV0aG9yfSA9fiBzL14oLns4fSkuKi8kMS87CisgICAgICAgICAgICBwcmludCAiTSBkYXRlOiAkcmV2aXNpb24tPnttb2RpZmllZH07ICBhdXRob3I6ICRyZXZpc2lvbi0+e2F1dGhvcn07ICBzdGF0ZTogIiAuICggJHJldmlzaW9uLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiA/ICJkZWFkIiA6ICJFeHAiICkgLiAiOyAgbGluZXM6ICsyIC0zXG4iOworICAgICAgICAgICAgbXkgJGNvbW1pdG1lc3NhZ2UgPSAkdXBkYXRlci0+Y29tbWl0bWVzc2FnZSgkcmV2aXNpb24tPntjb21taXRoYXNofSk7CisgICAgICAgICAgICAkY29tbWl0bWVzc2FnZSA9fiBzL14vTSAvbWc7CisgICAgICAgICAgICBwcmludCAkY29tbWl0bWVzc2FnZSAuICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIk0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2Fubm90YXRlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiYW5ub3RhdGUiKTsKKworICAgICRsb2ctPmluZm8oInJlcV9hbm5vdGF0ZSA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKyAgICAjJGxvZy0+ZGVidWcoInN0YXR1cyBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgYW5ub3RhdGUgb24gLi4uCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgIyB3ZSdsbCBuZWVkIGEgdGVtcG9yYXJ5IGNoZWNrb3V0IGRpcgorICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyICggRElSID0+ICRURU1QX0RJUiApOworICAgIG15ICggdW5kZWYsICRmaWxlX2luZGV4ICkgPSB0ZW1wZmlsZSAoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICRsb2ctPmluZm8oIlRlbXAgY2hlY2tvdXRkaXIgY3JlYXRpb24gc3VjY2Vzc2Z1bCwgYmFzaW5nIGFubm90YXRlIHNlc3Npb24gd29yayBvbiAnJHRtcGRpcicsIGluZGV4IGZpbGUgaXMgJyRmaWxlX2luZGV4JyIpOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGZpbGVfaW5kZXg7CisKKyAgICBjaGRpciAkdG1wZGlyOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLi4uCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKworICAgICAgICBuZXh0IHVubGVzcyAoICRtZXRhLT57cmV2aXNpb259ICk7CisKKwkjIGdldCBhbGwgdGhlIGNvbW1pdHMgdGhhdCB0aGlzIGZpbGUgd2FzIGluCisJIyBpbiBkZW5zZSBmb3JtYXQgLS0gYWthIHNraXAgZGVhZCByZXZpc2lvbnMKKyAgICAgICAgbXkgJHJldmlzaW9ucyAgID0gJHVwZGF0ZXItPmdldGhpc3RvcnlkZW5zZSgkZmlsZW5hbWUpOworCW15ICRsYXN0c2VlbmluICA9ICRyZXZpc2lvbnMtPlswXVsyXTsKKworCSMgcG9wdWxhdGUgdGhlIHRlbXBvcmFyeSBpbmRleCBiYXNlZCBvbiB0aGUgbGF0ZXN0IGNvbW1pdCB3ZXJlIHdlIHNhdworCSMgdGhlIGZpbGUgLS0gYnV0IGRvIGl0IGNoZWFwbHkgd2l0aG91dCBjaGVja2luZyBvdXQgYW55IGZpbGVzCisJIyBUT0RPOiBpZiB3ZSBnb3QgYSByZXZpc2lvbiBmcm9tIHRoZSBjbGllbnQsIHVzZSB0aGF0IGluc3RlYWQKKwkjIHRvIGxvb2sgdXAgdGhlIGNvbW1pdGhhc2ggaW4gc3FsaXRlIChzdGlsbCBnb29kIHRvIGRlZmF1bHQgdG8KKwkjIHRoZSBjdXJyZW50IGhlYWQgYXMgd2UgZG8gbm93KQorCXN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRsYXN0c2VlbmluKTsKKwl1bmxlc3MgKCQ/ID09IDApCisJeworCSAgICBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LXJlYWQtdHJlZSAkbGFzdHNlZW5pbiAkZmlsZV9pbmRleCAkISI7CisJfQorCSRsb2ctPmluZm8oIkNyZWF0ZWQgaW5kZXggJyRmaWxlX2luZGV4JyB3aXRoIGNvbW1pdCAkbGFzdHNlZW5pbiAtIGV4aXQgc3RhdHVzICQ/Iik7CisKKyAgICAgICAgIyBkbyBhIGNoZWNrb3V0IG9mIHRoZSBmaWxlCisgICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0LWluZGV4JywgJy1mJywgJy11JywgJGZpbGVuYW1lKTsKKyAgICAgICAgdW5sZXNzICgkPyA9PSAwKSB7CisgICAgICAgICAgICBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11ICRmaWxlbmFtZSA6ICQhIjsKKyAgICAgICAgfQorCisgICAgICAgICRsb2ctPmluZm8oIkFubm90YXRlICRmaWxlbmFtZSIpOworCisgICAgICAgICMgUHJlcGFyZSBhIGZpbGUgd2l0aCB0aGUgY29tbWl0cyBmcm9tIHRoZSBsaW5lYXJpemVkCisgICAgICAgICMgaGlzdG9yeSB0aGF0IGFubm90YXRlIHNob3VsZCBrbm93IGFib3V0LiBUaGlzIHByZXZlbnRzCisgICAgICAgICMgZ2l0LWpzYW5ub3RhdGUgdGVsbGluZyB1cyBhYm91dCBjb21taXRzIHdlIGFyZSBoaWRpbmcKKyAgICAgICAgIyBmcm9tIHRoZSBjbGllbnQuCisKKyAgICAgICAgb3BlbihBTk5PVEFURUhJTlRTLCAiPiR0bXBkaXIvLmFubm90YXRlX2hpbnRzIikgb3IgZGllICJFcnJvciBvcGVuaW5nID4gJHRtcGRpci8uYW5ub3RhdGVfaGludHMgJCEiOworICAgICAgICBmb3IgKG15ICRpPTA7ICRpIDwgQCRyZXZpc2lvbnM7ICRpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50IEFOTk9UQVRFSElOVFMgJHJldmlzaW9ucy0+WyRpXVsyXTsKKyAgICAgICAgICAgIGlmICgkaSsxIDwgQCRyZXZpc2lvbnMpIHsgIyBoYXZlIHdlIGdvdCBhIHBhcmVudD8KKyAgICAgICAgICAgICAgICBwcmludCBBTk5PVEFURUhJTlRTICcgJyAuICRyZXZpc2lvbnMtPlskaSsxXVsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50IEFOTk9UQVRFSElOVFMgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50IEFOTk9UQVRFSElOVFMgIlxuIjsKKyAgICAgICAgY2xvc2UgQU5OT1RBVEVISU5UUzsKKworICAgICAgICBteSAkYW5ub3RhdGVjbWQgPSAnZ2l0LWFubm90YXRlJzsKKyAgICAgICAgb3BlbihBTk5PVEFURSwgIi18IiwgJGFubm90YXRlY21kLCAnLWwnLCAnLVMnLCAiJHRtcGRpci8uYW5ub3RhdGVfaGludHMiLCAkZmlsZW5hbWUpCisJICAgIG9yIGRpZSAiRXJyb3IgaW52b2tpbmcgJGFubm90YXRlY21kIC1sIC1TICR0bXBkaXIvLmFubm90YXRlX2hpbnRzICRmaWxlbmFtZSA6ICQhIjsKKyAgICAgICAgbXkgJG1ldGFkYXRhID0ge307CisgICAgICAgIHByaW50ICJFIEFubm90YXRpb25zIGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgIHByaW50ICJFICoqKioqKioqKioqKioqKlxuIjsKKyAgICAgICAgd2hpbGUgKCA8QU5OT1RBVEU+ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG0vXihbYS16QS1aMC05XXs0MH0pXHRcKFteXCldKlwpKC4qKSQvaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteSAkY29tbWl0aGFzaCA9ICQxOworICAgICAgICAgICAgICAgIG15ICRkYXRhID0gJDI7CisgICAgICAgICAgICAgICAgdW5sZXNzICggZGVmaW5lZCAoICRtZXRhZGF0YS0+eyRjb21taXRoYXNofSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJGNvbW1pdGhhc2gpOworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17YXV0aG9yfSA9fiBzL1xzKy4qLy87CisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXthdXRob3J9ID1+IHMvXiguezh9KS4qLyQxLzsKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e21vZGlmaWVkfSA9IHNwcmludGYoIiUwMmQtJXMtJTAyZCIsICQxLCAkMiwgJDMpIGlmICggJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e21vZGlmaWVkfSA9fiAvXihcZCspXHMoXHcrKVxzXGRcZChcZFxkKS8gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCJNIDEuJS01ZCAgICAgICglLThzICUxMHMpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e3JldmlzaW9ufSwKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e2F1dGhvcn0sCisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXttb2RpZmllZH0sCisgICAgICAgICAgICAgICAgICAgICRkYXRhCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiRXJyb3IgaW4gYW5ub3RhdGUgb3V0cHV0ISBMSU5FOiAkXyIpOworICAgICAgICAgICAgICAgIHByaW50ICJFIEFubm90YXRlIGVycm9yIFxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlIEFOTk9UQVRFOworICAgIH0KKworICAgICMgZG9uZTsgZ2V0IG91dCBvZiB0aGUgdGVtcGRpcgorICAgIGNoZGlyICIvIjsKKworICAgIHByaW50ICJva1xuIjsKKworfQorCisjIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzdGF0ZS0+e2FyZ3VtZW50c30gYXJyYXkgYW5kIHByb2R1Y2VzIHR3byBuZXcgYXJyYXlzLgorIyBUaGUgZmlyc3QgaXMgJHN0YXRlLT57YXJnc30gd2hpY2ggaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhlICctLScgYXJndW1lbnQsIGFuZAorIyB0aGUgc2Vjb25kIGlzICRzdGF0ZS0+e2ZpbGVzfSB3aGljaCBpcyBldmVyeXRoaW5nIGFmdGVyIGl0Lgorc3ViIGFyZ3NwbGl0Cit7CisgICAgcmV0dXJuIHVubGVzcyggZGVmaW5lZCgkc3RhdGUtPnthcmd1bWVudHN9KSBhbmQgcmVmICRzdGF0ZS0+e2FyZ3VtZW50c30gZXEgIkFSUkFZIiApOworCisgICAgbXkgJHR5cGUgPSBzaGlmdDsKKworICAgICRzdGF0ZS0+e2FyZ3N9ID0gW107CisgICAgJHN0YXRlLT57ZmlsZXN9ID0gW107CisgICAgJHN0YXRlLT57b3B0fSA9IHt9OworCisgICAgaWYgKCBkZWZpbmVkKCR0eXBlKSApCisgICAgeworICAgICAgICBteSAkb3B0ID0ge307CisgICAgICAgICRvcHQgPSB7IEEgPT4gMCwgTiA9PiAwLCBQID0+IDAsIFIgPT4gMCwgYyA9PiAwLCBmID0+IDAsIGwgPT4gMCwgbiA9PiAwLCBwID0+IDAsIHMgPT4gMCwgciA9PiAxLCBEID0+IDEsIGQgPT4gMSwgayA9PiAxLCBqID0+IDEsIH0gaWYgKCAkdHlwZSBlcSAiY28iICk7CisgICAgICAgICRvcHQgPSB7IHYgPT4gMCwgbCA9PiAwLCBSID0+IDAgfSBpZiAoICR0eXBlIGVxICJzdGF0dXMiICk7CisgICAgICAgICRvcHQgPSB7IEEgPT4gMCwgUCA9PiAwLCBDID0+IDAsIGQgPT4gMCwgZiA9PiAwLCBsID0+IDAsIFIgPT4gMCwgcCA9PiAwLCBrID0+IDEsIHIgPT4gMSwgRCA9PiAxLCBqID0+IDEsIEkgPT4gMSwgVyA9PiAxIH0gaWYgKCAkdHlwZSBlcSAidXBkYXRlIiApOworICAgICAgICAkb3B0ID0geyBsID0+IDAsIFIgPT4gMCwgayA9PiAxLCBEID0+IDEsIEQgPT4gMSwgciA9PiAyIH0gaWYgKCAkdHlwZSBlcSAiZGlmZiIgKTsKKyAgICAgICAgJG9wdCA9IHsgYyA9PiAwLCBSID0+IDAsIGwgPT4gMCwgZiA9PiAwLCBGID0+IDEsIG0gPT4gMSwgciA9PiAxIH0gaWYgKCAkdHlwZSBlcSAiY2kiICk7CisgICAgICAgICRvcHQgPSB7IGsgPT4gMSwgbSA9PiAxIH0gaWYgKCAkdHlwZSBlcSAiYWRkIiApOworICAgICAgICAkb3B0ID0geyBmID0+IDAsIGwgPT4gMCwgUiA9PiAwIH0gaWYgKCAkdHlwZSBlcSAicmVtb3ZlIiApOworICAgICAgICAkb3B0ID0geyBsID0+IDAsIGIgPT4gMCwgaCA9PiAwLCBSID0+IDAsIHQgPT4gMCwgTiA9PiAwLCBTID0+IDAsIHIgPT4gMSwgZCA9PiAxLCBzID0+IDEsIHcgPT4gMSB9IGlmICggJHR5cGUgZXEgImxvZyIgKTsKKworCisgICAgICAgIHdoaWxlICggc2NhbGFyICggQHskc3RhdGUtPnthcmd1bWVudHN9fSApID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG15ICRhcmcgPSBzaGlmdCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319OworCisgICAgICAgICAgICBuZXh0IGlmICggJGFyZyBlcSAiLS0iICk7CisgICAgICAgICAgICBuZXh0IHVubGVzcyAoICRhcmcgPX4gL1xTLyApOworCisgICAgICAgICAgICAjIGlmIHRoZSBhcmd1bWVudCBsb29rcyBsaWtlIGEgc3dpdGNoCisgICAgICAgICAgICBpZiAoICRhcmcgPX4gL14tKFx3KSguKikvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYSBzd2l0Y2ggdGhhdCB0YWtlcyBhbiBhcmd1bWVudAorICAgICAgICAgICAgICAgIGlmICggJG9wdC0+eyQxfSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjIElmIHRoaXMgc3dpdGNoIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkb3B0LT57JDF9ID4gMSBhbmQgZXhpc3RzICggJHN0YXRlLT57b3B0fXskMX0gKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS0+e29wdH17JDF9ID0gWyAkc3RhdGUtPntvcHR9eyQxfSBdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW5ndGgoJDIpID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e29wdH17JDF9fSwkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e29wdH17JDF9fSwgc2hpZnQgQHskc3RhdGUtPnthcmd1bWVudHN9fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlcmUncyBleHRyYSBkYXRhIGluIHRoZSBhcmcsIHVzZSB0aGF0IGFzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW5ndGgoJDIpID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLT57b3B0fXskMX0gPSAkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLT57b3B0fXskMX0gPSBzaGlmdCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHN0YXRlLT57b3B0fXskMX0gPSB1bmRlZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2FyZ3N9fSwgJGFyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBteSAkbW9kZSA9IDA7CisKKyAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAkdmFsdWUgZXEgIi0tIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJG1vZGUrKzsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2FyZ3N9fSwgJHZhbHVlIGlmICggJG1vZGUgPT0gMCApOworICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2ZpbGVzfX0sICR2YWx1ZSBpZiAoICRtb2RlID09IDEgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworIyBUaGlzIG1ldGhvZCB1c2VzICRzdGF0ZS0+e2RpcmVjdG9yeX0gdG8gcG9wdWxhdGUgJHN0YXRlLT57YXJnc30gd2l0aCBhIGxpc3Qgb2YgZmlsZW5hbWVzCitzdWIgYXJnc2Zyb21kaXIKK3sKKyAgICBteSAkdXBkYXRlciA9IHNoaWZ0OworCisgICAgJHN0YXRlLT57YXJnc30gPSBbXSBpZiAoIHNjYWxhcihAeyRzdGF0ZS0+e2FyZ3N9fSkgPT0gMSBhbmQgJHN0YXRlLT57YXJnc31bMF0gZXEgIi4iICk7CisKKyAgICByZXR1cm4gaWYgKCBzY2FsYXIgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApID4gMSApOworCisgICAgbXkgQGdldGhlYWQgPSBAeyR1cGRhdGVyLT5nZXRoZWFkfTsKKworICAgICMgcHVzaCBhZGRlZCBmaWxlcworICAgIGZvcmVhY2ggbXkgJGZpbGUgKGtleXMgJXskc3RhdGUtPntlbnRyaWVzfX0pIHsKKwlpZiAoIGV4aXN0cyAkc3RhdGUtPntlbnRyaWVzfXskZmlsZX17cmV2aXNpb259ICYmCisJCSRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlfXtyZXZpc2lvbn0gPT0gMCApCisJeworCSAgICBwdXNoIEBnZXRoZWFkLCB7IG5hbWUgPT4gJGZpbGUsIGZpbGVoYXNoID0+ICdhZGRlZCcgfTsKKwl9CisgICAgfQorCisgICAgaWYgKCBzY2FsYXIoQHskc3RhdGUtPnthcmdzfX0pID09IDEgKQorICAgIHsKKyAgICAgICAgbXkgJGFyZyA9ICRzdGF0ZS0+e2FyZ3N9WzBdOworICAgICAgICAkYXJnIC49ICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e3ByZXBlbmRkaXJ9ICkgKTsKKworICAgICAgICAkbG9nLT5pbmZvKCJPbmx5IG9uZSBhcmcgc3BlY2lmaWVkLCBjaGVja2luZyBmb3IgZGlyZWN0b3J5IGV4cGFuc2lvbiBvbiAnJGFyZyciKTsKKworICAgICAgICBmb3JlYWNoIG15ICRmaWxlICggQGdldGhlYWQgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0IGlmICggJGZpbGUtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiIGFuZCBub3QgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlLT57bmFtZX19ICkgKTsKKyAgICAgICAgICAgIG5leHQgdW5sZXNzICggJGZpbGUtPntuYW1lfSA9fiAvXiRhcmdcLy8gb3IgJGZpbGUtPntuYW1lfSBlcSAkYXJnICApOworICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2FyZ3N9fSwgJGZpbGUtPntuYW1lfTsKKyAgICAgICAgfQorCisgICAgICAgIHNoaWZ0IEB7JHN0YXRlLT57YXJnc319IGlmICggc2NhbGFyKEB7JHN0YXRlLT57YXJnc319KSA+IDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbG9nLT5pbmZvKCJPbmx5IG9uZSBhcmcgc3BlY2lmaWVkLCBwb3B1bGF0aW5nIGZpbGUgbGlzdCBhdXRvbWF0aWNhbGx5Iik7CisKKyAgICAgICAgJHN0YXRlLT57YXJnc30gPSBbXTsKKworICAgICAgICBmb3JlYWNoIG15ICRmaWxlICggQGdldGhlYWQgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0IGlmICggJGZpbGUtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiIGFuZCBub3QgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlLT57bmFtZX19ICkgKTsKKyAgICAgICAgICAgIG5leHQgdW5sZXNzICggJGZpbGUtPntuYW1lfSA9fiBzL14kc3RhdGUtPntwcmVwZW5kZGlyfS8vICk7CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkZmlsZS0+e25hbWV9OworICAgICAgICB9CisgICAgfQorfQorCisjIFRoaXMgbWV0aG9kIGNsZWFucyB1cCB0aGUgJHN0YXRlIHZhcmlhYmxlIGFmdGVyIGEgY29tbWFuZCB0aGF0IHVzZXMgYXJndW1lbnRzIGhhcyBydW4KK3N1YiBzdGF0ZWNsZWFudXAKK3sKKyAgICAkc3RhdGUtPntmaWxlc30gPSBbXTsKKyAgICAkc3RhdGUtPnthcmdzfSA9IFtdOworICAgICRzdGF0ZS0+e2FyZ3VtZW50c30gPSBbXTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfSA9IHt9OworfQorCitzdWIgcmV2cGFyc2UKK3sKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gKSApOworCisgICAgcmV0dXJuICQxIGlmICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gPX4gL14xXC4oXGQrKS8gKTsKKyAgICByZXR1cm4gLSQxIGlmICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gPX4gL14tMVwuKFxkKykvICk7CisKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKyMgVGhpcyBtZXRob2QgdGFrZXMgYSBmaWxlIGhhc2ggYW5kIGRvZXMgYSBDVlMgImZpbGUgdHJhbnNmZXIiIHdoaWNoIHRyYW5zbWl0cyB0aGUKKyMgc2l6ZSBvZiB0aGUgZmlsZSwgYW5kIHRoZW4gdGhlIGZpbGUgY29udGVudHMuCisjIElmIGEgc2Vjb25kIGFyZ3VtZW50ICR0YXJnZXRmaWxlIGlzIGdpdmVuLCB0aGUgZmlsZSBpcyBpbnN0ZWFkIHdyaXR0ZW4gb3V0IHRvCisjIGEgZmlsZSBieSB0aGUgbmFtZSBvZiAkdGFyZ2V0ZmlsZQorc3ViIHRyYW5zbWl0ZmlsZQoreworICAgIG15ICRmaWxlaGFzaCA9IHNoaWZ0OworICAgIG15ICR0YXJnZXRmaWxlID0gc2hpZnQ7CisKKyAgICBpZiAoIGRlZmluZWQgKCAkZmlsZWhhc2ggKSBhbmQgJGZpbGVoYXNoIGVxICJkZWxldGVkIiApCisgICAgeworICAgICAgICAkbG9nLT53YXJuKCJmaWxlaGFzaCBpcyAnZGVsZXRlZCciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRpZSAiTmVlZCBmaWxlaGFzaCIgdW5sZXNzICggZGVmaW5lZCAoICRmaWxlaGFzaCApIGFuZCAkZmlsZWhhc2ggPX4gL15bYS16QS1aMC05XXs0MH0kLyApOworCisgICAgbXkgJHR5cGUgPSBgZ2l0LWNhdC1maWxlIC10ICRmaWxlaGFzaGA7CisgICAgY2hvbXAgJHR5cGU7CisKKyAgICBkaWUgKCAiSW52YWxpZCB0eXBlICckdHlwZScgKGV4cGVjdGVkICdibG9iJykiICkgdW5sZXNzICggZGVmaW5lZCAoICR0eXBlICkgYW5kICR0eXBlIGVxICJibG9iIiApOworCisgICAgbXkgJHNpemUgPSBgZ2l0LWNhdC1maWxlIC1zICRmaWxlaGFzaGA7CisgICAgY2hvbXAgJHNpemU7CisKKyAgICAkbG9nLT5kZWJ1ZygidHJhbnNtaXRmaWxlKCRmaWxlaGFzaCkgc2l6ZT0kc2l6ZSwgdHlwZT0kdHlwZSIpOworCisgICAgaWYgKCBvcGVuIG15ICRmaCwgJy18JywgImdpdC1jYXQtZmlsZSIsICJibG9iIiwgJGZpbGVoYXNoICkKKyAgICB7CisgICAgICAgIGlmICggZGVmaW5lZCAoICR0YXJnZXRmaWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICBvcGVuIE5FV0ZJTEUsICI+IiwgJHRhcmdldGZpbGUgb3IgZGllKCJDb3VsZG4ndCBvcGVuICckdGFyZ2V0ZmlsZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgICAgICAgICAgcHJpbnQgTkVXRklMRSAkXyB3aGlsZSAoIDwkZmg+ICk7CisgICAgICAgICAgICBjbG9zZSBORVdGSUxFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIiRzaXplXG4iOworICAgICAgICAgICAgcHJpbnQgd2hpbGUgKCA8JGZoPiApOworICAgICAgICB9CisgICAgICAgIGNsb3NlICRmaCBvciBkaWUgKCJDb3VsZG4ndCBjbG9zZSBmaWxlaGFuZGxlIGZvciB0cmFuc21pdGZpbGUoKSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSgiQ291bGRuJ3QgZXhlY3V0ZSBnaXQtY2F0LWZpbGUiKTsKKyAgICB9Cit9CisKKyMgVGhpcyBtZXRob2QgdGFrZXMgYSBmaWxlIG5hbWUsIGFuZCByZXR1cm5zICggJGRpcnBhcnQsICRmaWxlcGFydCApIHdoaWNoCisjIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHBvcnRpb24gYW5kIHRoZSBmaWxlIHBvcnRpb24gb2YgdGhlIGZpbGVuYW1lCisjIHJlc3BlY3RpdmVseQorc3ViIGZpbGVuYW1lc3BsaXQKK3sKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyAgICBteSAkZml4Zm9ybG9jYWxkaXIgPSBzaGlmdDsKKworICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gKCAkZmlsZW5hbWUsICIuIiApOworICAgICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gKCAkMiwgJDEgKSBpZiAoICRmaWxlbmFtZSA9fiAvKC4qKVwvKC4qKS8gKTsKKyAgICAkZGlycGFydCAuPSAiLyI7CisKKyAgICBpZiAoICRmaXhmb3Jsb2NhbGRpciApCisgICAgeworICAgICAgICAkZGlycGFydCA9fiBzL14kc3RhdGUtPntwcmVwZW5kZGlyfS8vOworICAgIH0KKworICAgIHJldHVybiAoICRmaWxlcGFydCwgJGRpcnBhcnQgKTsKK30KKworc3ViIGZpbGVjbGVhbnVwCit7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzKGRlZmluZWQoJGZpbGVuYW1lKSk7CisgICAgaWYgKCAkZmlsZW5hbWUgPX4gL15cLy8gKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgYWJzb2x1dGUgZmlsZW5hbWVzICckZmlsZW5hbWUnIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyXG4iOworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorCisgICAgJGZpbGVuYW1lID1+IHMvXlwuXC8vL2c7CisgICAgJGZpbGVuYW1lID0gJHN0YXRlLT57cHJlcGVuZGRpcn0gLiAkZmlsZW5hbWU7CisgICAgcmV0dXJuICRmaWxlbmFtZTsKK30KKworIyBHaXZlbiBhIHBhdGgsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBrb3B0cworIyB0aGF0IHNob3VsZCBnbyBpbnRvIHRoYXQgcGF0aCdzIEVudHJpZXMgbGluZS4gIEZvciBleGFtcGxlLCBhIGJpbmFyeQorIyBmaWxlIHNob3VsZCBnZXQgLWtiLgorc3ViIGtvcHRzX2Zyb21fcGF0aAoreworCW15ICgkcGF0aCkgPSBAXzsKKworCSMgT25jZSBpdCBleGlzdHMsIHRoZSBnaXQgYXR0cmlidXRlcyBzeXN0ZW0gc2hvdWxkIGJlIHVzZWQgdG8gbG9vayB1cAorCSMgd2hhdCBhdHRyaWJ1dGVzIGFwcGx5IHRvIHRoaXMgcGF0aC4KKworCSMgVW50aWwgdGhlbiwgdGFrZSB0aGUgc2V0dGluZyBmcm9tIHRoZSBjb25maWcgZmlsZQorICAgIHVubGVzcyAoIGRlZmluZWQgKCAkY2ZnLT57Z2l0Y3ZzfXthbGxiaW5hcnl9ICkgYW5kICRjZmctPntnaXRjdnN9e2FsbGJpbmFyeX0gPX4gL15ccyooMXx0cnVlfHllcylccyokL2kgKQorICAgIHsKKwkJIyBSZXR1cm4gIiIgdG8gZ2l2ZSBubyBzcGVjaWFsIHRyZWF0bWVudCB0byBhbnkgcGF0aAorCQlyZXR1cm4gIiI7CisgICAgfSBlbHNlIHsKKwkJIyBBbHRlcm5hdGl2ZWx5LCB0byBoYXZlIGFsbCBmaWxlcyB0cmVhdGVkIGFzIGlmIHRoZXkgYXJlIGJpbmFyeSAod2hpY2gKKwkJIyBpcyBtb3JlIGxpa2UgZ2l0IGl0c2VsZiksIGFsd2F5cyByZXR1cm4gdGhlICIta2IiIG9wdGlvbgorCQlyZXR1cm4gIi1rYiI7CisgICAgfQorfQorCitwYWNrYWdlIEdJVENWUzo6bG9nOworCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKKz1oZWFkMSBOQU1FCisKK0dJVENWUzo6bG9nCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyB2ZXJ5IGNydWRlIGxvZ2dpbmcgd2l0aCBhIHNpbWlsYXIgaW50ZXJmYWNlIHRvCitMb2c6OkxvZzRwZXJsCisKKz1oZWFkMSBNRVRIT0RTCisKKz1jdXQKKworPWhlYWQyIG5ldworCitDcmVhdGVzIGEgbmV3IGxvZyBvYmplY3QsIG9wdGlvbmFsbHkgeW91IGNhbiBzcGVjaWZ5IGEgZmlsZW5hbWUgaGVyZSB0bworaW5kaWNhdGUgdGhlIGZpbGUgdG8gbG9nIHRvLiBJZiBubyBsb2cgZmlsZSBpcyBzcGVjaWZpZWQsIHlvdSBjYW4gc3BlY2lmeSBvbmUKK2xhdGVyIHdpdGggbWV0aG9kIHNldGZpbGUsIG9yIGluZGljYXRlIHlvdSBubyBsb25nZXIgd2FudCBsb2dnaW5nIHdpdGggbWV0aG9kCitub2ZpbGUuCisKK1VudGlsIG9uZSBvZiB0aGVzZSBtZXRob2RzIGlzIGNhbGxlZCwgYWxsIGxvZyBjYWxscyB3aWxsIGJ1ZmZlciBtZXNzYWdlcyByZWFkeQordG8gd3JpdGUgb3V0LgorCis9Y3V0CitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9IHt9OworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworICAgIGlmICggZGVmaW5lZCAoICRmaWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIG9wZW4gJHNlbGYtPntmaH0sICI+PiIsICRmaWxlbmFtZSBvciBkaWUoIkNvdWxkbid0IG9wZW4gJyRmaWxlbmFtZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgIH0KKworICAgIHJldHVybiAkc2VsZjsKK30KKworPWhlYWQyIHNldGZpbGUKKworVGhpcyBtZXRob2RzIHRha2VzIGEgZmlsZW5hbWUsIGFuZCBhdHRlbXB0cyB0byBvcGVuIHRoYXQgZmlsZSBhcyB0aGUgbG9nIGZpbGUuCitJZiBzdWNjZXNzZnVsLCBhbGwgYnVmZmVyZWQgZGF0YSBpcyB3cml0dGVuIG91dCB0byB0aGUgZmlsZSwgYW5kIGFueSBmdXJ0aGVyCitsb2dnaW5nIGlzIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIGZpbGUuCisKKz1jdXQKK3N1YiBzZXRmaWxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIGlmICggZGVmaW5lZCAoICRmaWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIG9wZW4gJHNlbGYtPntmaH0sICI+PiIsICRmaWxlbmFtZSBvciBkaWUoIkNvdWxkbid0IG9wZW4gJyRmaWxlbmFtZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgIH0KKworICAgIHJldHVybiB1bmxlc3MgKCBkZWZpbmVkICggJHNlbGYtPntidWZmZXJ9ICkgYW5kIHJlZiAkc2VsZi0+e2J1ZmZlcn0gZXEgIkFSUkFZIiApOworCisgICAgd2hpbGUgKCBteSAkbGluZSA9IHNoaWZ0IEB7JHNlbGYtPntidWZmZXJ9fSApCisgICAgeworICAgICAgICBwcmludCB7JHNlbGYtPntmaH19ICRsaW5lOworICAgIH0KK30KKworPWhlYWQyIG5vZmlsZQorCitUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgbm8gbG9nZ2luZyBpcyBnb2luZyB0byBiZSB1c2VkLiBJdCBmbHVzaGVzIGFueSBlbnRyaWVzIGluCit0aGUgaW50ZXJuYWwgYnVmZmVyLCBhbmQgc2V0cyBhIGZsYWcgdG8gZW5zdXJlIG5vIGZ1cnRoZXIgZGF0YSBpcyBwdXQgdGhlcmUuCisKKz1jdXQKK3N1YiBub2ZpbGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntub2xvZ30gPSAxOworCisgICAgcmV0dXJuIHVubGVzcyAoIGRlZmluZWQgKCAkc2VsZi0+e2J1ZmZlcn0gKSBhbmQgcmVmICRzZWxmLT57YnVmZmVyfSBlcSAiQVJSQVkiICk7CisKKyAgICAkc2VsZi0+e2J1ZmZlcn0gPSBbXTsKK30KKworPWhlYWQyIF9sb2dvcGVuCisKK0ludGVybmFsIG1ldGhvZC4gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2cgZmlsZSBpcyBvcGVuLCBmYWxzZSBvdGhlcndpc2UuCisKKz1jdXQKK3N1YiBfbG9nb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gMSBpZiAoIGRlZmluZWQgKCAkc2VsZi0+e2ZofSApIGFuZCByZWYgJHNlbGYtPntmaH0gZXEgIkdMT0IiICk7CisgICAgcmV0dXJuIDA7Cit9CisKKz1oZWFkMiBkZWJ1ZyBpbmZvIHdhcm4gZmF0YWwKKworVGhlc2UgZm91ciBtZXRob2RzIGFyZSB3cmFwcGVycyB0byBfbG9nLiBUaGV5IHByb3ZpZGUgdGhlIGFjdHVhbCBpbnRlcmZhY2UgZm9yCitsb2dnaW5nIGRhdGEuCisKKz1jdXQKK3N1YiBkZWJ1ZyB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJkZWJ1ZyIsIEBfKTsgfQorc3ViIGluZm8gIHsgbXkgJHNlbGYgPSBzaGlmdDsgJHNlbGYtPl9sb2coImluZm8iICwgQF8pOyB9CitzdWIgd2FybiAgeyBteSAkc2VsZiA9IHNoaWZ0OyAkc2VsZi0+X2xvZygid2FybiIgLCBAXyk7IH0KK3N1YiBmYXRhbCB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJmYXRhbCIsIEBfKTsgfQorCis9aGVhZDIgX2xvZworCitUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCBjYWxsZWQgYnkgdGhlIGxvZ2dpbmcgZnVuY3Rpb25zLiBJdCBnZW5lcmF0ZXMgYQordGltZXN0YW1wIGFuZCBwdXNoZXMgdGhlIGxvZ2dlZCBsaW5lIGVpdGhlciB0byBmaWxlLCBvciBpbnRlcm5hbCBidWZmZXIuCisKKz1jdXQKK3N1YiBfbG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbGV2ZWwgPSBzaGlmdDsKKworICAgIHJldHVybiBpZiAoICRzZWxmLT57bm9sb2d9ICk7CisKKyAgICBteSBAdGltZSA9IGxvY2FsdGltZTsKKyAgICBteSAkdGltZXN0cmluZyA9IHNwcmludGYoIiU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgOiAlLTVzIiwKKyAgICAgICAgJHRpbWVbNV0gKyAxOTAwLAorICAgICAgICAkdGltZVs0XSArIDEsCisgICAgICAgICR0aW1lWzNdLAorICAgICAgICAkdGltZVsyXSwKKyAgICAgICAgJHRpbWVbMV0sCisgICAgICAgICR0aW1lWzBdLAorICAgICAgICB1YyAkbGV2ZWwsCisgICAgKTsKKworICAgIGlmICggJHNlbGYtPl9sb2dvcGVuICkKKyAgICB7CisgICAgICAgIHByaW50IHskc2VsZi0+e2ZofX0gJHRpbWVzdHJpbmcgLiAiIC0gIiAuIGpvaW4oIiAiLEBfKSAuICJcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAeyRzZWxmLT57YnVmZmVyfX0sICR0aW1lc3RyaW5nIC4gIiAtICIgLiBqb2luKCIgIixAXykgLiAiXG4iOworICAgIH0KK30KKworPWhlYWQyIERFU1RST1kKKworVGhpcyBtZXRob2Qgc2ltcGx5IGNsb3NlcyB0aGUgZmlsZSBoYW5kbGUgaWYgb25lIGlzIG9wZW4KKworPWN1dAorc3ViIERFU1RST1kKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCAkc2VsZi0+X2xvZ29wZW4gKQorICAgIHsKKyAgICAgICAgY2xvc2UgJHNlbGYtPntmaH07CisgICAgfQorfQorCitwYWNrYWdlIEdJVENWUzo6dXBkYXRlcjsKKworIyMjIworIyMjIyBDb3B5cmlnaHQgVGhlIE9wZW4gVW5pdmVyc2l0eSBVSyAtIDIwMDYuCisjIyMjCisjIyMjIEF1dGhvcnM6IE1hcnR5biBTbWl0aCAgICA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMgICAgICAgICAgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIworIyMjIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIERCSTsKKworPWhlYWQxIE1FVEhPRFMKKworPWN1dAorCis9aGVhZDIgbmV3CisKKz1jdXQKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkY29uZmlnID0gc2hpZnQ7CisgICAgbXkgJG1vZHVsZSA9IHNoaWZ0OworICAgIG15ICRsb2cgPSBzaGlmdDsKKworICAgIGRpZSAiTmVlZCB0byBzcGVjaWZ5IGEgZ2l0IHJlcG9zaXRvcnkiIHVubGVzcyAoIGRlZmluZWQoJGNvbmZpZykgYW5kIC1kICRjb25maWcgKTsKKyAgICBkaWUgIk5lZWQgdG8gc3BlY2lmeSBhIG1vZHVsZSIgdW5sZXNzICggZGVmaW5lZCgkbW9kdWxlKSApOworCisgICAgJGNsYXNzID0gcmVmKCRjbGFzcykgfHwgJGNsYXNzOworCisgICAgbXkgJHNlbGYgPSB7fTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAkc2VsZi0+e21vZHVsZX0gPSAkbW9kdWxlOworICAgICRzZWxmLT57Z2l0X3BhdGh9ID0gJGNvbmZpZyAuICIvIjsKKworICAgICRzZWxmLT57bG9nfSA9ICRsb2c7CisKKyAgICBkaWUgIkdpdCByZXBvICckc2VsZi0+e2dpdF9wYXRofScgZG9lc24ndCBleGlzdCIgdW5sZXNzICggLWQgJHNlbGYtPntnaXRfcGF0aH0gKTsKKworICAgICRzZWxmLT57ZGJkcml2ZXJ9ID0gJGNmZy0+e2dpdGN2c317JHN0YXRlLT57bWV0aG9kfX17ZGJkcml2ZXJ9IHx8CisgICAgICAgICRjZmctPntnaXRjdnN9e2RiZHJpdmVyfSB8fCAiU1FMaXRlIjsKKyAgICAkc2VsZi0+e2RibmFtZX0gPSAkY2ZnLT57Z2l0Y3ZzfXskc3RhdGUtPnttZXRob2R9fXtkYm5hbWV9IHx8CisgICAgICAgICRjZmctPntnaXRjdnN9e2RibmFtZX0gfHwgIiVHZ2l0Y3ZzLiVtLnNxbGl0ZSI7CisgICAgJHNlbGYtPntkYnVzZXJ9ID0gJGNmZy0+e2dpdGN2c317JHN0YXRlLT57bWV0aG9kfX17ZGJ1c2VyfSB8fAorICAgICAgICAkY2ZnLT57Z2l0Y3ZzfXtkYnVzZXJ9IHx8ICIiOworICAgICRzZWxmLT57ZGJwYXNzfSA9ICRjZmctPntnaXRjdnN9eyRzdGF0ZS0+e21ldGhvZH19e2RicGFzc30gfHwKKyAgICAgICAgJGNmZy0+e2dpdGN2c317ZGJwYXNzfSB8fCAiIjsKKyAgICBteSAlbWFwcGluZyA9ICggbSA9PiAkbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICBhID0+ICRzdGF0ZS0+e21ldGhvZH0sCisgICAgICAgICAgICAgICAgICAgIHUgPT4gZ2V0bG9naW4gfHwgZ2V0cHd1aWQoJDwpIHx8ICQ8LAorICAgICAgICAgICAgICAgICAgICBHID0+ICRzZWxmLT57Z2l0X3BhdGh9LAorICAgICAgICAgICAgICAgICAgICBnID0+IG1hbmdsZV9kaXJuYW1lKCRzZWxmLT57Z2l0X3BhdGh9KSwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAkc2VsZi0+e2RibmFtZX0gPX4gcy8lKFttYXVHZ10pLyRtYXBwaW5neyQxfS9lZzsKKyAgICAkc2VsZi0+e2RidXNlcn0gPX4gcy8lKFttYXVHZ10pLyRtYXBwaW5neyQxfS9lZzsKKworICAgIGRpZSAiSW52YWxpZCBjaGFyICc6JyBpbiBkYmRyaXZlciIgaWYgJHNlbGYtPntkYmRyaXZlcn0gPX4gLzovOworICAgIGRpZSAiSW52YWxpZCBjaGFyICc7JyBpbiBkYm5hbWUiIGlmICRzZWxmLT57ZGJuYW1lfSA9fiAvOy87CisgICAgJHNlbGYtPntkYmh9ID0gREJJLT5jb25uZWN0KCJkYmk6JHNlbGYtPntkYmRyaXZlcn06ZGJuYW1lPSRzZWxmLT57ZGJuYW1lfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57ZGJ1c2VyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntkYnBhc3N9KTsKKyAgICBkaWUgIkVycm9yIGNvbm5lY3RpbmcgdG8gZGF0YWJhc2VcbiIgdW5sZXNzIGRlZmluZWQgJHNlbGYtPntkYmh9OworCisgICAgJHNlbGYtPnt0YWJsZXN9ID0ge307CisgICAgZm9yZWFjaCBteSAkdGFibGUgKCBrZXlzICV7JHNlbGYtPntkYmh9LT50YWJsZV9pbmZvKHVuZGVmLHVuZGVmLHVuZGVmLCdUQUJMRScpLT5mZXRjaGFsbF9oYXNocmVmKCdUQUJMRV9OQU1FJyl9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57dGFibGVzfXskdGFibGV9ID0gMTsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCB0aGUgcmV2aXNpb24gdGFibGUgaWYgcmVxdWlyZWQKKyAgICB1bmxlc3MgKCAkc2VsZi0+e3RhYmxlc317cmV2aXNpb259ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIHJldmlzaW9uICgKKyAgICAgICAgICAgICAgICBuYW1lICAgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgcmV2aXNpb24gICBJTlRFR0VSIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGZpbGVoYXNoICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBjb21taXRoYXNoIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgYXV0aG9yICAgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGlmaWVkICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBtb2RlICAgICAgIFRFWFQgTk9UIE5VTEwKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIElOREVYIHJldmlzaW9uX2l4MQorICAgICAgICAgICAgT04gcmV2aXNpb24gKG5hbWUscmV2aXNpb24pCisgICAgICAgICIpOworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBJTkRFWCByZXZpc2lvbl9peDIKKyAgICAgICAgICAgIE9OIHJldmlzaW9uIChuYW1lLGNvbW1pdGhhc2gpCisgICAgICAgICIpOworICAgIH0KKworICAgICMgQ29uc3RydWN0IHRoZSBoZWFkIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9e2hlYWR9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIGhlYWQgKAorICAgICAgICAgICAgICAgIG5hbWUgICAgICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICByZXZpc2lvbiAgIElOVEVHRVIgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgZmlsZWhhc2ggICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBhdXRob3IgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGUgICAgICAgVEVYVCBOT1QgTlVMTAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgSU5ERVggaGVhZF9peDEKKyAgICAgICAgICAgIE9OIGhlYWQgKG5hbWUpCisgICAgICAgICIpOworICAgIH0KKworICAgICMgQ29uc3RydWN0IHRoZSBwcm9wZXJ0aWVzIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9e3Byb3BlcnRpZXN9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIHByb3BlcnRpZXMgKAorICAgICAgICAgICAgICAgIGtleSAgICAgICAgVEVYVCBOT1QgTlVMTCBQUklNQVJZIEtFWSwKKyAgICAgICAgICAgICAgICB2YWx1ZSAgICAgIFRFWFQKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIGNvbW1pdG1zZ3MgdGFibGUgaWYgcmVxdWlyZWQKKyAgICB1bmxlc3MgKCAkc2VsZi0+e3RhYmxlc317Y29tbWl0bXNnc30gKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgVEFCTEUgY29tbWl0bXNncyAoCisgICAgICAgICAgICAgICAga2V5ICAgICAgICBURVhUIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAorICAgICAgICAgICAgICAgIHZhbHVlICAgICAgVEVYVAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKz1oZWFkMiB1cGRhdGUKKworPWN1dAorc3ViIHVwZGF0ZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIGZpcnN0IGxldHMgZ2V0IHRoZSBjb21taXQgbGlzdAorICAgICRFTlZ7R0lUX0RJUn0gPSAkc2VsZi0+e2dpdF9wYXRofTsKKworICAgIG15ICRjb21taXRzaGExID0gYGdpdCByZXYtcGFyc2UgJHNlbGYtPnttb2R1bGV9YDsKKyAgICBjaG9tcCAkY29tbWl0c2hhMTsKKworICAgIG15ICRjb21taXRpbmZvID0gYGdpdCBjYXQtZmlsZSBjb21taXQgJHNlbGYtPnttb2R1bGV9IDI+JjFgOworICAgIHVubGVzcyAoICRjb21taXRpbmZvID1+IC90cmVlXHMrW2EtekEtWjAtOV17NDB9LyApCisgICAgeworICAgICAgICBkaWUoIkludmFsaWQgbW9kdWxlICckc2VsZi0+e21vZHVsZX0nIik7CisgICAgfQorCisKKyAgICBteSAkZ2l0X2xvZzsKKyAgICBteSAkbGFzdGNvbW1pdCA9ICRzZWxmLT5fZ2V0X3Byb3AoImxhc3RfY29tbWl0Iik7CisKKyAgICBpZiAoZGVmaW5lZCAkbGFzdGNvbW1pdCAmJiAkbGFzdGNvbW1pdCBlcSAkY29tbWl0c2hhMSkgeyAjIHVwLXRvLWRhdGUKKyAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgICMgU3RhcnQgZXhjbHVzaXZlIGxvY2sgaGVyZS4uLgorICAgICRzZWxmLT57ZGJofS0+YmVnaW5fd29yaygpIG9yIGRpZSAiQ2Fubm90IGxvY2sgZGF0YWJhc2UgZm9yIEJFR0lOIjsKKworICAgICMgVE9ETzogbG9nIHByb2Nlc3NpbmcgaXMgbWVtb3J5IGJvdW5kCisgICAgIyBpZiB3ZSBjYW4gcGFyc2UgaW50byBhIDJuZCBmaWxlIHRoYXQgaXMgaW4gcmV2ZXJzZSBvcmRlcgorICAgICMgd2UgY2FuIHByb2JhYmx5IGRvIHNvbWV0aGluZyByZWFsbHkgZWZmaWNpZW50CisgICAgbXkgQGdpdF9sb2dfcGFyYW1zID0gKCctLXByZXR0eScsICctLXBhcmVudHMnLCAnLS10b3BvLW9yZGVyJyk7CisKKyAgICBpZiAoZGVmaW5lZCAkbGFzdGNvbW1pdCkgeworICAgICAgICBwdXNoIEBnaXRfbG9nX3BhcmFtcywgIiRsYXN0Y29tbWl0Li4kc2VsZi0+e21vZHVsZX0iOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1c2ggQGdpdF9sb2dfcGFyYW1zLCAkc2VsZi0+e21vZHVsZX07CisgICAgfQorICAgICMgZ2l0LXJldi1saXN0IGlzIHRoZSBiYWNrZW5kIC8gcGx1bWJpbmcgdmVyc2lvbiBvZiBnaXQtbG9nCisgICAgb3BlbihHSVRMT0csICctfCcsICdnaXQtcmV2LWxpc3QnLCBAZ2l0X2xvZ19wYXJhbXMpIG9yIGRpZSAiQ2Fubm90IGNhbGwgZ2l0LXJldi1saXN0OiAkISI7CisKKyAgICBteSBAY29tbWl0czsKKworICAgIG15ICVjb21taXQgPSAoKTsKKworICAgIHdoaWxlICggPEdJVExPRz4gKQorICAgIHsKKyAgICAgICAgY2hvbXA7CisgICAgICAgIGlmIChtL15jb21taXRccysoLiopJC8pIHsKKyAgICAgICAgICAgICMgb24gXmNvbW1pdCBsaW5lcyBwdXQgdGhlIGp1c3Qgc2VlbiBjb21taXQgaW4gdGhlIHN0YWNrCisgICAgICAgICAgICAjIGFuZCBwcmltZSB0aGluZ3MgZm9yIHRoZSBuZXh0IG9uZQorICAgICAgICAgICAgaWYgKGtleXMgJWNvbW1pdCkgeworICAgICAgICAgICAgICAgIG15ICVjb3B5ID0gJWNvbW1pdDsKKyAgICAgICAgICAgICAgICB1bnNoaWZ0IEBjb21taXRzLCBcJWNvcHk7CisgICAgICAgICAgICAgICAgJWNvbW1pdCA9ICgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXkgQHBhcmVudHMgPSBzcGxpdChtL1xzKy8sICQxKTsKKyAgICAgICAgICAgICRjb21taXR7aGFzaH0gPSBzaGlmdCBAcGFyZW50czsKKyAgICAgICAgICAgICRjb21taXR7cGFyZW50c30gPSBcQHBhcmVudHM7CisgICAgICAgIH0gZWxzaWYgKG0vXihcdys/KTpccysoLiopJC8gJiYgIWV4aXN0cygkY29tbWl0e21lc3NhZ2V9KSkgeworICAgICAgICAgICAgIyBvbiByZmM4MjItbGlrZSBsaW5lcyBzZWVuIGJlZm9yZSB3ZSBzZWUgYW55IG1lc3NhZ2UsCisgICAgICAgICAgICAjIGxvd2VyY2FzZSB0aGUgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgaGFzaCBhcyBrZXktdmFsdWUKKyAgICAgICAgICAgICRjb21taXR7bGMoJDEpfSA9ICQyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBtZXNzYWdlIGxpbmVzIC0gc2tpcCBpbml0aWFsIGVtcHR5IGxpbmUKKyAgICAgICAgICAgICMgYW5kIHRyaW0gd2hpdGVzcGFjZQorICAgICAgICAgICAgaWYgKCFleGlzdHMoJGNvbW1pdHttZXNzYWdlfSkgJiYgbS9eXHMqJC8pIHsKKyAgICAgICAgICAgICAgICAjIGRlZmluZSBpdCB0byBtYXJrIHRoZSBlbmQgb2YgaGVhZGVycworICAgICAgICAgICAgICAgICRjb21taXR7bWVzc2FnZX0gPSAnJzsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy9eXHMrLy87IHMvXHMrJC8vOyAjIHRyaW0gd3MKKyAgICAgICAgICAgICRjb21taXR7bWVzc2FnZX0gLj0gJF8gLiAiXG4iOworICAgICAgICB9CisgICAgfQorICAgIGNsb3NlIEdJVExPRzsKKworICAgIHVuc2hpZnQgQGNvbW1pdHMsIFwlY29tbWl0IGlmICgga2V5cyAlY29tbWl0ICk7CisKKyAgICAjIE5vdyBhbGwgdGhlIGNvbW1pdHMgYXJlIGluIHRoZSBAY29tbWl0cyBidWNrZXQKKyAgICAjIG9yZGVyZWQgYnkgdGltZSBERVNDLiBmb3IgZWFjaCBjb21taXQgdGhhdCBuZWVkcyBwcm9jZXNzaW5nLAorICAgICMgZGV0ZXJtaW5lIHdoZXRoZXIgaXQncyBmb2xsb3dpbmcgdGhlIGxhc3QgaGVhZCB3ZSd2ZSBzZWVuIG9yIGlmCisgICAgIyBpdCdzIG9uIGl0cyBvd24gYnJhbmNoLCBncmFiIGEgZmlsZSBsaXN0LCBhbmQgYWRkIHdoYXRldmVyJ3MgY2hhbmdlZAorICAgICMgTk9URTogJGxhc3Rjb21taXQgcmVmZXJzIHRvIHRoZSBsYXN0IGNvbW1pdCBmcm9tIHByZXZpb3VzIHJ1bgorICAgICMgICAgICAgJGxhc3RwaWNrZWQgaXMgdGhlIGxhc3QgY29tbWl0IHdlIHBpY2tlZCBpbiB0aGlzIHJ1bgorICAgIG15ICRsYXN0cGlja2VkOworICAgIG15ICRoZWFkID0ge307CisgICAgaWYgKGRlZmluZWQgJGxhc3Rjb21taXQpIHsKKyAgICAgICAgJGxhc3RwaWNrZWQgPSAkbGFzdGNvbW1pdDsKKyAgICB9CisKKyAgICBteSAkY29tbWl0dG90YWwgPSBzY2FsYXIoQGNvbW1pdHMpOworICAgIG15ICRjb21taXRjb3VudCA9IDA7CisKKyAgICAjIExvYWQgdGhlIGhlYWQgdGFibGUgaW50byAkaGVhZCAoZm9yIGNhY2hlZCBsb29rdXBzIGR1cmluZyB0aGUgdXBkYXRlIHByb2Nlc3MpCisgICAgZm9yZWFjaCBteSAkZmlsZSAoIEB7JHNlbGYtPmdldGhlYWQoKX0gKQorICAgIHsKKyAgICAgICAgJGhlYWQtPnskZmlsZS0+e25hbWV9fSA9ICRmaWxlOworICAgIH0KKworICAgIGZvcmVhY2ggbXkgJGNvbW1pdCAoIEBjb21taXRzICkKKyAgICB7CisgICAgICAgICRzZWxmLT57bG9nfS0+ZGVidWcoIkdJVENWUzo6dXBkYXRlciAtIFByb2Nlc3NpbmcgY29tbWl0ICRjb21taXQtPntoYXNofSAoIiAuICgrKyRjb21taXRjb3VudCkgLiAiIG9mICRjb21taXR0b3RhbCkiKTsKKyAgICAgICAgaWYgKGRlZmluZWQgJGxhc3RwaWNrZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJGxhc3RwaWNrZWQsIEB7JGNvbW1pdC0+e3BhcmVudHN9fSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBza2lwLCB3ZSdsbCBzZWUgdGhpcyBkZWx0YQorICAgICAgICAgICAgICAgICMgYXMgcGFydCBvZiBhIG1lcmdlIGxhdGVyCisgICAgICAgICAgICAgICAgIyB3YXJuICJza2lwcGluZyBvZmYtdHJhY2sgICRjb21taXQtPntoYXNofVxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfSBlbHNpZiAoQHskY29tbWl0LT57cGFyZW50c319ID4gMSkgeworICAgICAgICAgICAgICAgICMgaXQgaXMgYSBtZXJnZSBjb21taXQsIGZvciBlYWNoIHBhcmVudCB0aGF0IGlzCisgICAgICAgICAgICAgICAgIyBub3QgJGxhc3RwaWNrZWQsIHNlZSBpZiB3ZSBjYW4gZ2V0IGEgbG9nCisgICAgICAgICAgICAgICAgIyBmcm9tIHRoZSBtZXJnZS1iYXNlIHRvIHRoYXQgcGFyZW50IHRvIHB1dCBpdAorICAgICAgICAgICAgICAgICMgaW4gdGhlIG1lc3NhZ2UgYXMgYSBtZXJnZSBzdW1tYXJ5LgorICAgICAgICAgICAgICAgIG15IEBwYXJlbnRzID0gQHskY29tbWl0LT57cGFyZW50c319OworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHBhcmVudCAoQHBhcmVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgIyBnaXQtbWVyZ2UtYmFzZSBjYW4gcG90ZW50aWFsbHkgKGJ1dCByYXJlbHkpIHRocm93CisgICAgICAgICAgICAgICAgICAgICMgc2V2ZXJhbCBjYW5kaWRhdGUgbWVyZ2UgYmFzZXMuIGxldCdzIGFzc3VtZQorICAgICAgICAgICAgICAgICAgICAjIHRoYXQgdGhlIGZpcnN0IG9uZSBpcyB0aGUgYmVzdCBvbmUuCisgICAgICAgICAgICAgICAgICAgIGlmICgkcGFyZW50IGVxICRsYXN0cGlja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9wZW4gbXkgJHAsICdnaXQtbWVyZ2UtYmFzZSAnLiAkbGFzdHBpY2tlZCAuICcgJworICAgICAgICAgICAgICAgICAgICAuICRwYXJlbnQgLiAnfCc7CisgICAgICAgICAgICAgICAgICAgIG15IEBvdXRwdXQgPSAoPCRwPik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlICRwOworICAgICAgICAgICAgICAgICAgICBteSAkYmFzZSA9IGpvaW4oJycsIEBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBjaG9tcCAkYmFzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRiYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSBAbWVyZ2VkOworICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCAid2FudCB0byBsb2cgYmV0d2VlbiAgJGJhc2UgJHBhcmVudCBcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKEdJVExPRywgJy18JywgJ2dpdC1sb2cnLCAiJGJhc2UuLiRwYXJlbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgY2FsbCBnaXQtbG9nOiAkISI7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkbWVyZ2VkaGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICg8R0lUTE9HPikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob21wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVmaW5lZCAkbWVyZ2VkaGFzaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS9eY29tbWl0XHMrKC4rKSQvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVyZ2VkaGFzaCA9ICQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ3JhYiB0aGUgZmlyc3QgbGluZSB0aGF0IGxvb2tzIG5vbi1yZmM4MjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBha2EgaGFzIGNvbnRlbnQgYWZ0ZXIgbGVhZGluZyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS9eXHMrKFxTLiopJC8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICR0aXRsZSA9ICQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gc3Vic3RyKCR0aXRsZSwwLDEwMCk7ICMgdHJ1bmNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hpZnQgQG1lcmdlZCwgIiRtZXJnZWRoYXNoICR0aXRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiAkbWVyZ2VkaGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlIEdJVExPRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAbWVyZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1pdC0+e21lcmdlbXNnfSA9ICRjb21taXQtPnttZXNzYWdlfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWl0LT57bWVyZ2Vtc2d9IC49ICJcblN1bW1hcnkgb2YgbWVyZ2VkIGNvbW1pdHM6XG5cbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkc3VtbWFyeSAoQG1lcmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWl0LT57bWVyZ2Vtc2d9IC49ICJcdCRzdW1tYXJ5XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWl0LT57bWVyZ2Vtc2d9IC49ICJcblxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50ICJNZXNzYWdlIGZvciAkY29tbWl0LT57aGFzaH0gXG4kY29tbWl0LT57bWVyZ2Vtc2d9IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgY29udmVydCB0aGUgZGF0ZSB0byBDVlMtaGFwcHkgZm9ybWF0CisgICAgICAgICRjb21taXQtPntkYXRlfSA9ICIkMiAkMSAkNCAkMyAkNSIgaWYgKCAkY29tbWl0LT57ZGF0ZX0gPX4gL15cdytccysoXHcrKVxzKyhcZCspXHMrKFxkKzpcZCs6XGQrKVxzKyhcZCspXHMrKFsrLV1cZCspJC8gKTsKKworICAgICAgICBpZiAoIGRlZmluZWQgKCAkbGFzdHBpY2tlZCApICkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgJGZpbGVwaXBlID0gb3BlbihGSUxFTElTVCwgJy18JywgJ2dpdC1kaWZmLXRyZWUnLCAnLXonLCAnLXInLCAkbGFzdHBpY2tlZCwgJGNvbW1pdC0+e2hhc2h9KSBvciBkaWUoIkNhbm5vdCBjYWxsIGdpdC1kaWZmLXRyZWUgOiAkISIpOworCSAgICBsb2NhbCAoJC8pID0gIlwwIjsKKyAgICAgICAgICAgIHdoaWxlICggPEZJTEVMSVNUPiApCisgICAgICAgICAgICB7CisJCWNob21wOworICAgICAgICAgICAgICAgIHVubGVzcyAoIC9eOlxkezZ9XHMrXGR7M30oXGQpXGR7Mn1ccytbYS16QS1aMC05XXs0MH1ccysoW2EtekEtWjAtOV17NDB9KVxzKyhcdykkL28gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGllKCJDb3VsZG4ndCBwcm9jZXNzIGdpdC1kaWZmLXRyZWUgbGluZSA6ICRfIik7CisgICAgICAgICAgICAgICAgfQorCQlteSAoJG1vZGUsICRoYXNoLCAkY2hhbmdlKSA9ICgkMSwgJDIsICQzKTsKKwkJbXkgJG5hbWUgPSA8RklMRUxJU1Q+OworCQljaG9tcCgkbmFtZSk7CisKKyAgICAgICAgICAgICAgICAjICRsb2ctPmRlYnVnKCJGaWxlIG1vZGU9JG1vZGUsIGhhc2g9JGhhc2gsIGNoYW5nZT0kY2hhbmdlLCBuYW1lPSRuYW1lIik7CisKKyAgICAgICAgICAgICAgICBteSAkZ2l0X3Blcm1zID0gIiI7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAiciIgaWYgKCAkbW9kZSAmIDQgKTsKKyAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICRtb2RlICYgMiApOworICAgICAgICAgICAgICAgICRnaXRfcGVybXMgLj0gIngiIGlmICggJG1vZGUgJiAxICk7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICJydyIgaWYgKCAkZ2l0X3Blcm1zIGVxICIiICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICRjaGFuZ2UgZXEgIkQiICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMkbG9nLT5kZWJ1ZygiREVMRVRFICAgJG5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskbmFtZX0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0+ICRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24gPT4gJGhlYWQtPnskbmFtZX17cmV2aXNpb259ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICJkZWxldGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+aW5zZXJ0X3JldigkbmFtZSwgJGhlYWQtPnskbmFtZX17cmV2aXNpb259LCAkaGFzaCwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkZ2l0X3Blcm1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkY2hhbmdlIGVxICJNIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIk1PRElGSUVEICRuYW1lIik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JG5hbWV9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAkaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+aW5zZXJ0X3JldigkbmFtZSwgJGhlYWQtPnskbmFtZX17cmV2aXNpb259LCAkaGFzaCwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkZ2l0X3Blcm1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkY2hhbmdlIGVxICJBIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkFEREVEICAgICRuYW1lIik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JG5hbWV9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSA/ICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSsxIDogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICRoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0aGFzaCA9PiAkY29tbWl0LT57aGFzaH0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9PiAkY29tbWl0LT57ZGF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IgPT4gJGNvbW1pdC0+e2F1dGhvcn0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0+ICRnaXRfcGVybXMsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfcmV2KCRuYW1lLCAkaGVhZC0+eyRuYW1lfXtyZXZpc2lvbn0sICRoYXNoLCAkY29tbWl0LT57aGFzaH0sICRjb21taXQtPntkYXRlfSwgJGNvbW1pdC0+e2F1dGhvcn0sICRnaXRfcGVybXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkbG9nLT53YXJuKCJVTktOT1dOIEZJTEUgQ0hBTkdFIG1vZGU9JG1vZGUsIGhhc2g9JGhhc2gsIGNoYW5nZT0kY2hhbmdlLCBuYW1lPSRuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIGRpZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9zZSBGSUxFTElTVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICMgdGhpcyBpcyB1c2VkIHRvIGRldGVjdCBmaWxlcyByZW1vdmVkIGZyb20gdGhlIHJlcG8KKyAgICAgICAgICAgIG15ICRzZWVuX2ZpbGVzID0ge307CisKKyAgICAgICAgICAgIG15ICRmaWxlcGlwZSA9IG9wZW4oRklMRUxJU1QsICctfCcsICdnaXQtbHMtdHJlZScsICcteicsICctcicsICRjb21taXQtPntoYXNofSkgb3IgZGllKCJDYW5ub3QgY2FsbCBnaXQtbHMtdHJlZSA6ICQhIik7CisJICAgIGxvY2FsICQvID0gIlwwIjsKKyAgICAgICAgICAgIHdoaWxlICggPEZJTEVMSVNUPiApCisgICAgICAgICAgICB7CisJCWNob21wOworICAgICAgICAgICAgICAgIHVubGVzcyAoIC9eKFxkKylccysoXHcrKVxzKyhbYS16QS1aMC05XSspXHQoLiopJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtbHMtdHJlZSBsaW5lIDogJF8iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteSAoICRnaXRfcGVybXMsICRnaXRfdHlwZSwgJGdpdF9oYXNoLCAkZ2l0X2ZpbGVuYW1lICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisKKyAgICAgICAgICAgICAgICAkc2Vlbl9maWxlcy0+eyRnaXRfZmlsZW5hbWV9ID0gMTsKKworICAgICAgICAgICAgICAgIG15ICggJG9sZGhhc2gsICRvbGRyZXZpc2lvbiwgJG9sZG1vZGUgKSA9ICgKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfXtmaWxlaGFzaH0sCisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGdpdF9maWxlbmFtZX17cmV2aXNpb259LAorICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRnaXRfZmlsZW5hbWV9e21vZGV9CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGlmICggJGdpdF9wZXJtcyA9fiAvXlxkXGRcZChcZClcZFxkL28gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICIiOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJyIiBpZiAoICQxICYgNCApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICQxICYgMiApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ4IiBpZiAoICQxICYgMSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRnaXRfcGVybXMgPSAicnciOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgdW5sZXNzIHRoZSBmaWxlIGV4aXN0cyB3aXRoIHRoZSBzYW1lIGhhc2gsIHdlIG5lZWQgdG8gdXBkYXRlIGl0IC4uLgorICAgICAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQoJG9sZGhhc2gpIGFuZCAkb2xkaGFzaCBlcSAkZ2l0X2hhc2ggYW5kIGRlZmluZWQoJG9sZG1vZGUpIGFuZCAkb2xkbW9kZSBlcSAkZ2l0X3Blcm1zICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG15ICRuZXdyZXZpc2lvbiA9ICggJG9sZHJldmlzaW9uIG9yIDAgKSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT4gJGdpdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRuZXdyZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICRnaXRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmluc2VydF9yZXYoJGdpdF9maWxlbmFtZSwgJG5ld3JldmlzaW9uLCAkZ2l0X2hhc2gsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2UgRklMRUxJU1Q7CisKKyAgICAgICAgICAgICMgRGV0ZWN0IGRlbGV0ZWQgZmlsZXMKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5sZXNzICggZXhpc3RzICRzZWVuX2ZpbGVzLT57JGZpbGV9IG9yICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17cmV2aXNpb259Kys7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSA9ICJkZWxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17Y29tbWl0aGFzaH0gPSAkY29tbWl0LT57aGFzaH07CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGlmaWVkfSA9ICRjb21taXQtPntkYXRlfTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSA9ICRjb21taXQtPnthdXRob3J9OworCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfcmV2KCRmaWxlLCAkaGVhZC0+eyRmaWxlfXtyZXZpc2lvbn0sICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkaGVhZC0+eyRmaWxlfXttb2RlfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBFTkQgOiAiRGV0ZWN0IGRlbGV0ZWQgZmlsZXMiCisgICAgICAgIH0KKworCisgICAgICAgIGlmIChleGlzdHMgJGNvbW1pdC0+e21lcmdlbXNnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJHNlbGYtPmluc2VydF9tZXJnZWxvZygkY29tbWl0LT57aGFzaH0sICRjb21taXQtPnttZXJnZW1zZ30pOworICAgICAgICB9CisKKyAgICAgICAgJGxhc3RwaWNrZWQgPSAkY29tbWl0LT57aGFzaH07CisKKyAgICAgICAgJHNlbGYtPl9zZXRfcHJvcCgibGFzdF9jb21taXQiLCAkY29tbWl0LT57aGFzaH0pOworICAgIH0KKworICAgICRzZWxmLT5kZWxldGVfaGVhZCgpOworICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgeworICAgICAgICAkc2VsZi0+aW5zZXJ0X2hlYWQoCisgICAgICAgICAgICAkZmlsZSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e3JldmlzaW9ufSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2NvbW1pdGhhc2h9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17bW9kaWZpZWR9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGV9LAorICAgICAgICApOworICAgIH0KKyAgICAjIGludmFsaWRhdGUgdGhlIGdldGhlYWQgY2FjaGUKKyAgICAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ID0gdW5kZWY7CisKKworICAgICMgRW5kaW5nIGV4Y2x1c2l2ZSBsb2NrIGhlcmUKKyAgICAkc2VsZi0+e2RiaH0tPmNvbW1pdCgpIG9yIGRpZSAiRmFpbGVkIHRvIGNvbW1pdCBjaGFuZ2VzIHRvIFNRTGl0ZSI7Cit9CisKK3N1YiBpbnNlcnRfcmV2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRmaWxlaGFzaCA9IHNoaWZ0OworICAgIG15ICRjb21taXRoYXNoID0gc2hpZnQ7CisgICAgbXkgJG1vZGlmaWVkID0gc2hpZnQ7CisgICAgbXkgJGF1dGhvciA9IHNoaWZ0OworICAgIG15ICRtb2RlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X3JldiA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIklOU0VSVCBJTlRPIHJldmlzaW9uIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfcmV2LT5leGVjdXRlKCRuYW1lLCAkcmV2aXNpb24sICRmaWxlaGFzaCwgJGNvbW1pdGhhc2gsICRtb2RpZmllZCwgJGF1dGhvciwgJG1vZGUpOworfQorCitzdWIgaW5zZXJ0X21lcmdlbG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X21lcmdlbG9nID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiSU5TRVJUIElOVE8gY29tbWl0bXNncyAoa2V5LCB2YWx1ZSkgVkFMVUVTICg/LD8pIix7fSwxKTsKKyAgICAkaW5zZXJ0X21lcmdlbG9nLT5leGVjdXRlKCRrZXksICR2YWx1ZSk7Cit9CisKK3N1YiBkZWxldGVfaGVhZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkZGVsZXRlX2hlYWQgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJERUxFVEUgRlJPTSBoZWFkIix7fSwxKTsKKyAgICAkZGVsZXRlX2hlYWQtPmV4ZWN1dGUoKTsKK30KKworc3ViIGluc2VydF9oZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRmaWxlaGFzaCA9IHNoaWZ0OworICAgIG15ICRjb21taXRoYXNoID0gc2hpZnQ7CisgICAgbXkgJG1vZGlmaWVkID0gc2hpZnQ7CisgICAgbXkgJGF1dGhvciA9IHNoaWZ0OworICAgIG15ICRtb2RlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X2hlYWQgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyBoZWFkIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfaGVhZC0+ZXhlY3V0ZSgkbmFtZSwgJHJldmlzaW9uLCAkZmlsZWhhc2gsICRjb21taXRoYXNoLCAkbW9kaWZpZWQsICRhdXRob3IsICRtb2RlKTsKK30KKworc3ViIF9oZWFkcmV2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCBmaWxlaGFzaCwgcmV2aXNpb24sIG1vZGUgRlJPTSBoZWFkIFdIRVJFIG5hbWU9PyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisgICAgbXkgKCAkaGFzaCwgJHJldmlzaW9uLCAkbW9kZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIHJldHVybiAoICRoYXNoLCAkcmV2aXNpb24sICRtb2RlICk7Cit9CisKK3N1YiBfZ2V0X3Byb3AKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRrZXkgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCB2YWx1ZSBGUk9NIHByb3BlcnRpZXMgV0hFUkUga2V5PT8iLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgka2V5KTsKKyAgICBteSAoICR2YWx1ZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIHJldHVybiAkdmFsdWU7Cit9CisKK3N1YiBfc2V0X3Byb3AKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRrZXkgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlVQREFURSBwcm9wZXJ0aWVzIFNFVCB2YWx1ZT0/IFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJHZhbHVlLCAka2V5KTsKKworICAgIHVubGVzcyAoICRkYl9xdWVyeS0+cm93cyApCisgICAgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyBwcm9wZXJ0aWVzIChrZXksIHZhbHVlKSBWQUxVRVMgKD8sPykiLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGtleSwgJHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHZhbHVlOworfQorCis9aGVhZDIgZ2V0aGVhZAorCis9Y3V0CisKK3N1YiBnZXRoZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2dldGhlYWRfY2FjaGV9IGlmICggZGVmaW5lZCAoICRzZWxmLT57Z2V0aGVhZF9jYWNoZX0gKSApOworCisgICAgbXkgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIG5hbWUsIGZpbGVoYXNoLCBtb2RlLCByZXZpc2lvbiwgbW9kaWZpZWQsIGNvbW1pdGhhc2gsIGF1dGhvciBGUk9NIGhlYWQgT1JERVIgQlkgbmFtZSBBU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgpOworCisgICAgbXkgJHRyZWUgPSBbXTsKKyAgICB3aGlsZSAoIG15ICRmaWxlID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmICkKKyAgICB7CisgICAgICAgIHB1c2ggQCR0cmVlLCAkZmlsZTsKKyAgICB9CisKKyAgICAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ID0gJHRyZWU7CisKKyAgICByZXR1cm4gJHRyZWU7Cit9CisKKz1oZWFkMiBnZXRsb2cKKworPWN1dAorCitzdWIgZ2V0bG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCBuYW1lLCBmaWxlaGFzaCwgYXV0aG9yLCBtb2RlLCByZXZpc2lvbiwgbW9kaWZpZWQsIGNvbW1pdGhhc2ggRlJPTSByZXZpc2lvbiBXSEVSRSBuYW1lPT8gT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICBteSAkdHJlZSA9IFtdOworICAgIHdoaWxlICggbXkgJGZpbGUgPSAkZGJfcXVlcnktPmZldGNocm93X2hhc2hyZWYgKQorICAgIHsKKyAgICAgICAgcHVzaCBAJHRyZWUsICRmaWxlOworICAgIH0KKworICAgIHJldHVybiAkdHJlZTsKK30KKworPWhlYWQyIGdldG1ldGEKKworVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGVuYW1lICh3aXRoIHBhdGgpIGFyZ3VtZW50IGFuZCByZXR1cm5zIGEgaGFzaHJlZiBvZgorbWV0YWRhdGEgZm9yIHRoYXQgZmlsZS4KKworPWN1dAorCitzdWIgZ2V0bWV0YQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlxkKyQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IEFORCByZXZpc2lvbj0/Iix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSwgJHJldmlzaW9uKTsKKyAgICB9CisgICAgZWxzaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlthLXpBLVowLTldezQwfSQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IEFORCBjb21taXRoYXNoPT8iLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lLCAkcmV2aXNpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gaGVhZCBXSEVSRSBuYW1lPT8iLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmOworfQorCis9aGVhZDIgY29tbWl0bWVzc2FnZQorCit0aGlzIGZ1bmN0aW9uIHRha2VzIGEgY29tbWl0aGFzaCBhbmQgcmV0dXJucyB0aGUgY29tbWl0IG1lc3NhZ2UgZm9yIHRoYXQgY29tbWl0CisKKz1jdXQKK3N1YiBjb21taXRtZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkY29tbWl0aGFzaCA9IHNoaWZ0OworCisgICAgZGllKCJOZWVkIGNvbW1pdGhhc2giKSB1bmxlc3MgKCBkZWZpbmVkKCRjb21taXRoYXNoKSBhbmQgJGNvbW1pdGhhc2ggPX4gL15bYS16QS1aMC05XXs0MH0kLyApOworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCB2YWx1ZSBGUk9NIGNvbW1pdG1zZ3MgV0hFUkUga2V5PT8iLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkY29tbWl0aGFzaCk7CisKKyAgICBteSAoICRtZXNzYWdlICkgPSAkZGJfcXVlcnktPmZldGNocm93X2FycmF5OworCisgICAgaWYgKCBkZWZpbmVkICggJG1lc3NhZ2UgKSApCisgICAgeworICAgICAgICAkbWVzc2FnZSAuPSAiICIgaWYgKCAkbWVzc2FnZSA9fiAvXG4kLyApOworICAgICAgICByZXR1cm4gJG1lc3NhZ2U7CisgICAgfQorCisgICAgbXkgQGxpbmVzID0gc2FmZV9waXBlX2NhcHR1cmUoImdpdC1jYXQtZmlsZSIsICJjb21taXQiLCAkY29tbWl0aGFzaCk7CisgICAgc2hpZnQgQGxpbmVzIHdoaWxlICggJGxpbmVzWzBdID1+IC9cUy8gKTsKKyAgICAkbWVzc2FnZSA9IGpvaW4oIiIsQGxpbmVzKTsKKyAgICAkbWVzc2FnZSAuPSAiICIgaWYgKCAkbWVzc2FnZSA9fiAvXG4kLyApOworICAgIHJldHVybiAkbWVzc2FnZTsKK30KKworPWhlYWQyIGdldGhpc3RvcnkKKworVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGVuYW1lICh3aXRoIHBhdGgpIGFyZ3VtZW50IGFuZCByZXR1cm5zIGFuIGFycmF5b2ZhcnJheXMKK2NvbnRhaW5pbmcgcmV2aXNpb24sZmlsZWhhc2gsY29tbWl0aGFzaCBvcmRlcmVkIGJ5IHJldmlzaW9uIGRlc2NlbmRpbmcKKworPWN1dAorc3ViIGdldGhpc3RvcnkKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2ggRlJPTSByZXZpc2lvbiBXSEVSRSBuYW1lPT8gT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaGFsbF9hcnJheXJlZjsKK30KKworPWhlYWQyIGdldGhpc3RvcnlkZW5zZQorCitUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZmlsZW5hbWUgKHdpdGggcGF0aCkgYXJndW1lbnQgYW5kIHJldHVybnMgYW4gYXJyYXlvZmFycmF5cworY29udGFpbmluZyByZXZpc2lvbixmaWxlaGFzaCxjb21taXRoYXNoIG9yZGVyZWQgYnkgcmV2aXNpb24gZGVzY2VuZGluZy4KKworVGhpcyB2ZXJzaW9uIG9mIGdldGhpc3Rvcnkgc2tpcHMgZGVsZXRlZCBlbnRyaWVzIC0tIHNvIGl0IGlzIHVzZWZ1bCBmb3IgYW5ub3RhdGUuCitUaGUgJ2RlbnNlJyBwYXJ0IGlzIGEgcmVmZXJlbmNlIHRvIGEgJy0tZGVuc2UnIG9wdGlvbiBhdmFpbGFibGUgZm9yIGdpdC1yZXYtbGlzdAorYW5kIG90aGVyIGdpdCB0b29scyB0aGF0IGRlcGVuZCBvbiBpdC4KKworPWN1dAorc3ViIGdldGhpc3RvcnlkZW5zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIHJldmlzaW9uLCBmaWxlaGFzaCwgY29tbWl0aGFzaCBGUk9NIHJldmlzaW9uIFdIRVJFIG5hbWU9PyBBTkQgZmlsZWhhc2ghPSdkZWxldGVkJyBPUkRFUiBCWSByZXZpc2lvbiBERVNDIix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lKTsKKworICAgIHJldHVybiAkZGJfcXVlcnktPmZldGNoYWxsX2FycmF5cmVmOworfQorCis9aGVhZDIgaW5fYXJyYXkoKQorCitmcm9tIEFycmF5OjpQQVQgLSBtaW1pY3MgdGhlIGluX2FycmF5KCkgZnVuY3Rpb24KK2ZvdW5kIGluIFBIUC4gWXVjayBidXQgd29ya3MgZm9yIHNtYWxsIGFycmF5cy4KKworPWN1dAorc3ViIGluX2FycmF5Cit7CisgICAgbXkgKCRjaGVjaywgQGFycmF5KSA9IEBfOworICAgIG15ICRyZXR2YWwgPSAwOworICAgIGZvcmVhY2ggbXkgJHRlc3QgKEBhcnJheSl7CisgICAgICAgIGlmKCRjaGVjayBlcSAkdGVzdCl7CisgICAgICAgICAgICAkcmV0dmFsID0gIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICRyZXR2YWw7Cit9CisKKz1oZWFkMiBzYWZlX3BpcGVfY2FwdHVyZQorCithbiBhbHRlcm5hdGl2ZSB0byBgY29tbWFuZGAgdGhhdCBhbGxvd3MgaW5wdXQgdG8gYmUgcGFzc2VkIGFzIGFuIGFycmF5Cit0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCisKKz1jdXQKK3N1YiBzYWZlX3BpcGVfY2FwdHVyZSB7CisKKyAgICBteSBAb3V0cHV0OworCisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworICAgICAgICBAb3V0cHV0ID0gKDwkY2hpbGQ+KTsKKyAgICAgICAgY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4ZWMoQF8pIG9yIGRpZSAiJCEgJD8iOyAjIGV4ZWMoKSBjYW4gZmFpbCB0aGUgZXhlY3V0YWJsZSBjYW4ndCBiZSBmb3VuZAorICAgIH0KKyAgICByZXR1cm4gd2FudGFycmF5ID8gQG91dHB1dCA6IGpvaW4oJycsQG91dHB1dCk7Cit9CisKKz1oZWFkMiBtYW5nbGVfZGlybmFtZQorCitjcmVhdGUgYSBzdHJpbmcgZnJvbSBhIGRpcmVjdG9yeSBuYW1lIHRoYXQgaXMgc3VpdGFibGUgdG8gdXNlIGFzCitwYXJ0IG9mIGEgZmlsZW5hbWUsIG1haW5seSBieSBjb252ZXJ0aW5nIGFsbCBjaGFycyBleGNlcHQgXHcuLSB0byBfCisKKz1jdXQKK3N1YiBtYW5nbGVfZGlybmFtZSB7CisgICAgbXkgJGRpcm5hbWUgPSBzaGlmdDsKKyAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGRpcm5hbWU7CisKKyAgICAkZGlybmFtZSA9fiBzL1teXHcuLV0vXy9nOworCisgICAgcmV0dXJuICRkaXJuYW1lOworfQorCisxOwpkaWZmIC0tZ2l0IGEvZ2l0LWZldGNoLnNoIGIvZ2l0LWZldGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlMDVjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZmV0Y2guc2gKQEAgLTAsMCArMSwzNzEgQEAKKyMhL2Jpbi9zaAorIworCitVU0FHRT0nPGZldGNoLW9wdGlvbnM+IDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi4nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorc2V0X3JlZmxvZ19hY3Rpb24gImZldGNoICQqIgorY2RfdG9fdG9wbGV2ZWwgOyMgcHJvYmFibHkgdW5uZWNlc3NhcnkuLi4KKworLiBnaXQtcGFyc2UtcmVtb3RlCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKKworTEY9JworJworSUZTPSIkTEYiCisKK25vX3RhZ3M9Cit0YWdzPQorYXBwZW5kPQorZm9yY2U9Cit2ZXJib3NlPQordXBkYXRlX2hlYWRfb2s9CitleGVjPQora2VlcD0KK3NoYWxsb3dfZGVwdGg9Citub19wcm9ncmVzcz0KK3Rlc3QgLXQgMSB8fCBub19wcm9ncmVzcz0tLW5vLXByb2dyZXNzCitxdWlldD0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1hfC0tYXwtLWFwfC0tYXBwfC0tYXBwZXwtLWFwcGVufC0tYXBwZW5kKQorCQlhcHBlbmQ9dAorCQk7OworCS0tdXBsfC0tdXBsb3wtLXVwbG9hfC0tdXBsb2FkfC0tdXBsb2FkLXwtLXVwbG9hZC1wfFwKKwktLXVwbG9hZC1wYXwtLXVwbG9hZC1wYWN8LS11cGxvYWQtcGFjaykKKwkJc2hpZnQKKwkJZXhlYz0iLS11cGxvYWQtcGFjaz0kMSIKKwkJOzsKKwktLXVwbD0qfC0tdXBsbz0qfC0tdXBsb2E9KnwtLXVwbG9hZD0qfFwKKwktLXVwbG9hZC09KnwtLXVwbG9hZC1wPSp8LS11cGxvYWQtcGE9KnwtLXVwbG9hZC1wYWM9KnwtLXVwbG9hZC1wYWNrPSopCisJCWV4ZWM9LS11cGxvYWQtcGFjaz0kKGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknKQorCQlzaGlmdAorCQk7OworCS1mfC0tZnwtLWZvfC0tZm9yfC0tZm9yY3wtLWZvcmNlKQorCQlmb3JjZT10CisJCTs7CisJLXR8LS10fC0tdGF8LS10YWd8LS10YWdzKQorCQl0YWdzPXQKKwkJOzsKKwktbnwtLW58LS1ub3wtLW5vLXwtLW5vLXR8LS1uby10YXwtLW5vLXRhZ3wtLW5vLXRhZ3MpCisJCW5vX3RhZ3M9dAorCQk7OworCS11fC0tdXwtLXVwfC0tdXBkfC0tdXBkYXwtLXVwZGF0fC0tdXBkYXRlfC0tdXBkYXRlLXwtLXVwZGF0ZS1ofFwKKwktLXVwZGF0ZS1oZXwtLXVwZGF0ZS1oZWF8LS11cGRhdGUtaGVhZHwtLXVwZGF0ZS1oZWFkLXxcCisJLS11cGRhdGUtaGVhZC1vfC0tdXBkYXRlLWhlYWQtb2spCisJCXVwZGF0ZV9oZWFkX29rPXQKKwkJOzsKKwktcXwtLXF8LS1xdXwtLXF1aXwtLXF1aWV8LS1xdWlldCkKKwkJcXVpZXQ9LS1xdWlldAorCQk7OworCS12fC0tdmVyYm9zZSkKKwkJdmVyYm9zZT1ZZXMKKwkJOzsKKwkta3wtLWt8LS1rZXwtLWtlZXwtLWtlZXApCisJCWtlZXA9Jy1rIC1rJworCQk7OworCS0tZGVwdGg9KikKKwkJc2hhbGxvd19kZXB0aD0iLS1kZXB0aD1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgIgorCQk7OworCS0tZGVwdGgpCisJCXNoaWZ0CisJCXNoYWxsb3dfZGVwdGg9Ii0tZGVwdGg9JDEiCisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworY2FzZSAiJCMiIGluCiswKQorCW9yaWdpbj0kKGdldF9kZWZhdWx0X3JlbW90ZSkKKwl0ZXN0IC1uICIkKGdldF9yZW1vdGVfdXJsICR7b3JpZ2lufSkiIHx8CisJCWRpZSAiV2hlcmUgZG8geW91IHdhbnQgdG8gZmV0Y2ggZnJvbSB0b2RheT8iCisJc2V0IHggJG9yaWdpbiA7IHNoaWZ0IDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRleGVjIgordGhlbgorCSMgTm8gY29tbWFuZCBsaW5lIG92ZXJyaWRlIGFuZCB3ZSBoYXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUuCisJZXhlYz0iLS11cGxvYWQtcGFjaz0kKGdldF91cGxvYWRwYWNrICQxKSIKK2ZpCisKK3JlbW90ZV9uaWNrPSIkMSIKK3JlbW90ZT0kKGdldF9yZW1vdGVfdXJsICIkQCIpCityZWZzPQorcnJlZj0KK3JzeW5jX3NsdXJwZWRfb2JqZWN0cz0KKworaWYgdGVzdCAiIiA9ICIkYXBwZW5kIgordGhlbgorCTogPiIkR0lUX0RJUi9GRVRDSF9IRUFEIgorZmkKKworIyBHbG9iYWwgdGhhdCBpcyByZXVzZWQgbGF0ZXIKK2xzX3JlbW90ZV9yZXN1bHQ9JChnaXQgbHMtcmVtb3RlICRleGVjICIkcmVtb3RlIikgfHwKKwlkaWUgIkNhbm5vdCBnZXQgdGhlIHJlcG9zaXRvcnkgc3RhdGUgZnJvbSAkcmVtb3RlIgorCithcHBlbmRfZmV0Y2hfaGVhZCAoKSB7CisJZmxhZ3M9CisJdGVzdCAtbiAiJHZlcmJvc2UiICYmIGZsYWdzPSIkZmxhZ3MkTEYtdiIKKwl0ZXN0IC1uICIkZm9yY2Ukc2luZ2xlX2ZvcmNlIiAmJiBmbGFncz0iJGZsYWdzJExGLWYiCisJR0lUX1JFRkxPR19BQ1RJT049IiRHSVRfUkVGTE9HX0FDVElPTiIgXAorCQlnaXQtZmV0Y2gtLXRvb2wgJGZsYWdzIGFwcGVuZC1mZXRjaC1oZWFkICIkQCIKK30KKworIyB1cGRhdGluZyB0aGUgY3VycmVudCBIRUFEIHdpdGggZ2l0LWZldGNoIGluIGEgYmFyZQorIyByZXBvc2l0b3J5IGlzIGFsd2F5cyBmaW5lLgoraWYgdGVzdCAteiAiJHVwZGF0ZV9oZWFkX29rIiAmJiB0ZXN0ICQoaXNfYmFyZV9yZXBvc2l0b3J5KSA9IGZhbHNlCit0aGVuCisJb3JpZ19oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQorZmkKKworIyBBbGxvdyAtLW5vdGFncyBmcm9tIHJlbW90ZS4kMS50YWdvcHQKK2Nhc2UgIiR0YWdzJG5vX3RhZ3MiIGluCisnJykKKwljYXNlICIkKGdpdC1jb25maWcgLS1nZXQgInJlbW90ZS4kMS50YWdvcHQiKSIgaW4KKwktLW5vLXRhZ3MpCisJCW5vX3RhZ3M9dCA7OworCWVzYWMKK2VzYWMKKworIyBJZiAtLXRhZ3MgKGFuZCBsYXRlciAtLWhlYWRzIG9yIC0tYWxsKSBpcyBzcGVjaWZpZWQsIHRoZW4gd2UgYXJlCisjIG5vdCB0YWxraW5nIGFib3V0IGRlZmF1bHRzIHN0b3JlZCBpbiBQdWxsOiBsaW5lIG9mIHJlbW90ZXMgb3IKKyMgYnJhbmNoZXMgZmlsZSwgYW5kIGp1c3QgZmV0Y2ggdGhvc2UgYW5kIHJlZnNwZWNzIGV4cGxpY2l0bHkgZ2l2ZW4uCisjIE90aGVyd2lzZSB3ZSBkbyB3aGF0IHdlIGFsd2F5cyBkaWQuCisKK3JlZmxpc3Q9JChnZXRfcmVtb3RlX3JlZnNfZm9yX2ZldGNoICIkQCIpCitpZiB0ZXN0ICIkdGFncyIKK3RoZW4KKwl0YWdsaXN0PWBJRlM9JwknICYmCisJCSAgZWNobyAiJGxzX3JlbW90ZV9yZXN1bHQiIHwKKwkJICBnaXQtc2hvdy1yZWYgLS1leGNsdWRlLWV4aXN0aW5nPXJlZnMvdGFncy8gfAorCSAgICAgICAgICB3aGlsZSByZWFkIHNoYTEgbmFtZQorCQkgIGRvCisJCQllY2hvICIuJHtuYW1lfToke25hbWV9IgorCQkgIGRvbmVgIHx8IGV4aXQKKwlpZiB0ZXN0ICIkIyIgLWd0IDEKKwl0aGVuCisJCSMgcmVtb3RlIFVSTCBwbHVzIGV4cGxpY2l0IHJlZnNwZWNzOyB3ZSBuZWVkIHRvIG1lcmdlIHRoZW0uCisJCXJlZmxpc3Q9IiRyZWZsaXN0JExGJHRhZ2xpc3QiCisJZWxzZQorCQkjIE5vIGV4cGxpY2l0IHJlZnNwZWNzOyBmZXRjaCB0YWdzIG9ubHkuCisJCXJlZmxpc3Q9JHRhZ2xpc3QKKwlmaQorZmkKKworZmV0Y2hfYWxsX2F0X29uY2UgKCkgeworCisgIGV2YWw9JChlY2hvICIkMSIgfCBnaXQtZmV0Y2gtLXRvb2wgcGFyc2UtcmVmbGlzdCAiLSIpCisgIGV2YWwgIiRldmFsIgorCisgICAgKCA6IHN1YnNoZWxsIGJlY2F1c2Ugd2UgbXVjayB3aXRoIElGUworICAgICAgSUZTPSIgCSRMRiIKKyAgICAgICgKKwlpZiB0ZXN0ICIkcmVtb3RlIiA9IC4gOyB0aGVuCisJICAgIGdpdC1zaG93LXJlZiAkcnJlZiB8fCBlY2hvIGZhaWxlZCAiJHJlbW90ZSIKKwllbGlmIHRlc3QgLWYgIiRyZW1vdGUiIDsgdGhlbgorCSAgICB0ZXN0IC1uICIkc2hhbGxvd19kZXB0aCIgJiYKKwkJZGllICJzaGFsbG93IGNsb25lIHdpdGggYnVuZGxlIGlzIG5vdCBzdXBwb3J0ZWQiCisJICAgIGdpdC1idW5kbGUgdW5idW5kbGUgIiRyZW1vdGUiICRycmVmIHx8CisJICAgIGVjaG8gZmFpbGVkICIkcmVtb3RlIgorCWVsc2UKKwkJaWYJdGVzdCAtZCAiJHJlbW90ZSIgJiYKKworCQkJIyBUaGUgcmVtb3RlIG1pZ2h0IGJlIG91ciBhbHRlcm5hdGUuICBXaXRoCisJCQkjIHRoaXMgb3B0aW1pemF0aW9uIHdlIHdpbGwgYnlwYXNzIGZldGNoLXBhY2sKKwkJCSMgYWx0b2dldGhlciwgd2hpY2ggbWVhbnMgd2UgY2Fubm90IGJlIGRvaW5nCisJCQkjIHRoZSBzaGFsbG93IHN0dWZmIGF0IGFsbC4KKwkJCXRlc3QgISAtZiAiJEdJVF9ESVIvc2hhbGxvdyIgJiYKKwkJCXRlc3QgLXogIiRzaGFsbG93X2RlcHRoIiAmJgorCisJCQkjIFNlZSBpZiBhbGwgb2Ygd2hhdCB3ZSBhcmUgZ29pbmcgdG8gZmV0Y2ggYXJlCisJCQkjIGNvbm5lY3RlZCB0byBvdXIgcmVwb3NpdG9yeSdzIHRpcHMsIGluIHdoaWNoCisJCQkjIGNhc2Ugd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55IGZldGNoLgorCQkJdGhlaXJzPSQoZWNobyAiJGxzX3JlbW90ZV9yZXN1bHQiIHwgXAorCQkJCWdpdC1mZXRjaC0tdG9vbCAtcyBwaWNrLXJyZWYgIiRycmVmIiAiLSIpICYmCisKKwkJCSMgVGhpcyB3aWxsIGJhcmYgd2hlbiAkdGhlaXJzIHJlYWNoIGFuIG9iamVjdCB0aGF0CisJCQkjIHdlIGRvIG5vdCBoYXZlIGluIG91ciByZXBvc2l0b3J5LiAgT3RoZXJ3aXNlLAorCQkJIyB3ZSBhbHJlYWR5IGhhdmUgZXZlcnl0aGluZyB0aGUgZmV0Y2ggd291bGQgYnJpbmcgaW4uCisJCQlnaXQtcmV2LWxpc3QgLS1vYmplY3RzICR0aGVpcnMgLS1ub3QgLS1hbGwgXAorCQkJCT4vZGV2L251bGwgMj4vZGV2L251bGwKKwkJdGhlbgorCQkJZWNobyAiJGxzX3JlbW90ZV9yZXN1bHQiIHwgXAorCQkJCWdpdC1mZXRjaC0tdG9vbCBwaWNrLXJyZWYgIiRycmVmIiAiLSIKKwkJZWxzZQorCQkJZ2l0LWZldGNoLXBhY2sgLS10aGluICRleGVjICRrZWVwICRzaGFsbG93X2RlcHRoIFwKKwkJCQkkcXVpZXQgJG5vX3Byb2dyZXNzICIkcmVtb3RlIiAkcnJlZiB8fAorCQkJZWNobyBmYWlsZWQgIiRyZW1vdGUiCisJCWZpCisJZmkKKyAgICAgICkgfAorICAgICAgKAorCWZsYWdzPQorCXRlc3QgLW4gIiR2ZXJib3NlIiAmJiBmbGFncz0iJGZsYWdzIC12IgorCXRlc3QgLW4gIiRmb3JjZSIgJiYgZmxhZ3M9IiRmbGFncyAtZiIKKwlHSVRfUkVGTE9HX0FDVElPTj0iJEdJVF9SRUZMT0dfQUNUSU9OIiBcCisJCWdpdC1mZXRjaC0tdG9vbCAkZmxhZ3MgbmF0aXZlLXN0b3JlIFwKKwkJCSIkcmVtb3RlIiAiJHJlbW90ZV9uaWNrIiAiJHJlZnMiCisgICAgICApCisgICAgKSB8fCBleGl0CisKK30KKworZmV0Y2hfcGVyX3JlZiAoKSB7CisgIHJlZmxpc3Q9IiQxIgorICByZWZzPQorICBycmVmPQorCisgIGZvciByZWYgaW4gJHJlZmxpc3QKKyAgZG8KKyAgICAgIHJlZnM9IiRyZWZzJExGJHJlZiIKKworICAgICAgIyBUaGVzZSBhcmUgcmVsYXRpdmUgcGF0aCBmcm9tICRHSVRfRElSLCB0eXBpY2FsbHkgc3RhcnRpbmcgYXQgcmVmcy8KKyAgICAgICMgYnV0IG1heSBiZSBIRUFECisgICAgICBpZiBleHByICJ6JHJlZiIgOiAnelwuJyA+L2Rldi9udWxsCisgICAgICB0aGVuCisJICBub3RfZm9yX21lcmdlPXQKKwkgIHJlZj0kKGV4cHIgInokcmVmIiA6ICd6XC5cKC4qXCknKQorICAgICAgZWxzZQorCSAgbm90X2Zvcl9tZXJnZT0KKyAgICAgIGZpCisgICAgICBpZiBleHByICJ6JHJlZiIgOiAneisnID4vZGV2L251bGwKKyAgICAgIHRoZW4KKwkgIHNpbmdsZV9mb3JjZT10CisJICByZWY9JChleHByICJ6JHJlZiIgOiAneitcKC4qXCknKQorICAgICAgZWxzZQorCSAgc2luZ2xlX2ZvcmNlPQorICAgICAgZmkKKyAgICAgIHJlbW90ZV9uYW1lPSQoZXhwciAieiRyZWYiIDogJ3pcKFteOl0qXCk6JykKKyAgICAgIGxvY2FsX25hbWU9JChleHByICJ6JHJlZiIgOiAnelteOl0qOlwoLipcKScpCisKKyAgICAgIHJyZWY9IiRycmVmJExGJHJlbW90ZV9uYW1lIgorCisgICAgICAjIFRoZXJlIGFyZSB0cmFuc3BvcnRzIHRoYXQgY2FuIGZldGNoIG9ubHkgb25lIGhlYWQgYXQgYSB0aW1lLi4uCisgICAgICBjYXNlICIkcmVtb3RlIiBpbgorICAgICAgaHR0cDovLyogfCBodHRwczovLyogfCBmdHA6Ly8qKQorCSAgdGVzdCAtbiAiJHNoYWxsb3dfZGVwdGgiICYmCisJCWRpZSAic2hhbGxvdyBjbG9uZSB3aXRoIGh0dHAgbm90IHN1cHBvcnRlZCIKKwkgIHByb3RvPWBleHByICIkcmVtb3RlIiA6ICdcKFteOl0qXCk6J2AKKwkgIGlmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorCSAgICAgIGN1cmxfZXh0cmFfYXJncz0iLWsiCisJICBmaQorCSAgaWYgWyAtbiAiJEdJVF9DVVJMX0ZUUF9OT19FUFNWIiAtbyBcCisJCSJgZ2l0LWNvbmZpZyAtLWJvb2wgaHR0cC5ub0VQU1ZgIiA9IHRydWUgXTsgdGhlbgorCSAgICAgIG5vZXBzdl9vcHQ9Ii0tZGlzYWJsZS1lcHN2IgorCSAgZmkKKworCSAgIyBGaW5kICRyZW1vdGVfbmFtZSBmcm9tIGxzLXJlbW90ZSBvdXRwdXQuCisJICBoZWFkPSQoZWNobyAiJGxzX3JlbW90ZV9yZXN1bHQiIHwgXAorCQlnaXQtZmV0Y2gtLXRvb2wgLXMgcGljay1ycmVmICIkcmVtb3RlX25hbWUiICItIikKKwkgIGV4cHIgInokaGVhZCIgOiAieiRfeDQwXCQiID4vZGV2L251bGwgfHwKKwkJZGllICJObyBzdWNoIHJlZiAkcmVtb3RlX25hbWUgYXQgJHJlbW90ZSIKKwkgIGVjaG8gPiYyICJGZXRjaGluZyAkcmVtb3RlX25hbWUgZnJvbSAkcmVtb3RlIHVzaW5nICRwcm90byIKKwkgIGNhc2UgIiRxdWlldCIgaW4gJycpIHY9LXYgOzsgKikgdj0gOzsgZXNhYworCSAgZ2l0LWh0dHAtZmV0Y2ggJHYgLWEgIiRoZWFkIiAiJHJlbW90ZSIgfHwgZXhpdAorCSAgOzsKKyAgICAgIHJzeW5jOi8vKikKKwkgIHRlc3QgLW4gIiRzaGFsbG93X2RlcHRoIiAmJgorCQlkaWUgInNoYWxsb3cgY2xvbmUgd2l0aCByc3luYyBub3Qgc3VwcG9ydGVkIgorCSAgVE1QX0hFQUQ9IiRHSVRfRElSL1RNUF9IRUFEIgorCSAgcnN5bmMgLUwgLXEgIiRyZW1vdGUvJHJlbW90ZV9uYW1lIiAiJFRNUF9IRUFEIiB8fCBleGl0IDEKKwkgIGhlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IFRNUF9IRUFEKQorCSAgcm0gLWYgIiRUTVBfSEVBRCIKKwkgIGNhc2UgIiRxdWlldCIgaW4gJycpIHY9LXYgOzsgKikgdj0gOzsgZXNhYworCSAgdGVzdCAiJHJzeW5jX3NsdXJwZWRfb2JqZWN0cyIgfHwgeworCSAgICAgIHJzeW5jIC1hICR2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAiJHJlbW90ZS9vYmplY3RzLyIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWS8iIHx8IGV4aXQKKworCSAgICAgICMgTG9vayBhdCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyBmb3IgcnN5bmMgLS0gaHR0cCB3aWxsCisJICAgICAgIyBzdXBwb3J0IGl0IG5hdGl2ZWx5IGFuZCBnaXQgbmF0aXZlIG9uZXMgd2lsbCBkbyBpdCBvbgorCSAgICAgICMgdGhlIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkgICAgICByc3luYyAtcSAiJHJlbW90ZS9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIgXAorCQkgICIkR0lUX0RJUi9UTVBfQUxUIiAyPi9kZXYvbnVsbCB8fAorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGlmIHRlc3QgLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJICAgICAgdGhlbgorCQkgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlbW90ZSIgPCIkR0lUX0RJUi9UTVBfQUxUIiB8CisJCSAgd2hpbGUgcmVhZCBhbHQKKwkJICBkbworCQkgICAgICBjYXNlICIkYWx0IiBpbiAnYmFkIGFsdGVybmF0ZTogJyopIGRpZSAiJGFsdCI7OyBlc2FjCisJCSAgICAgIGVjaG8gPiYyICJHZXR0aW5nIGFsdGVybmF0ZTogJGFsdCIKKwkJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAgICAgIiRhbHQiICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvIiB8fCBleGl0CisJCSAgZG9uZQorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGZpCisJICAgICAgcnN5bmNfc2x1cnBlZF9vYmplY3RzPXQKKwkgIH0KKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgIGFwcGVuZF9mZXRjaF9oZWFkICIkaGVhZCIgIiRyZW1vdGUiIFwKKwkgICIkcmVtb3RlX25hbWUiICIkcmVtb3RlX25pY2siICIkbG9jYWxfbmFtZSIgIiRub3RfZm9yX21lcmdlIiB8fCBleGl0CisKKyAgZG9uZQorCit9CisKK2ZldGNoX21haW4gKCkgeworCWNhc2UgIiRyZW1vdGUiIGluCisJaHR0cDovLyogfCBodHRwczovLyogfCBmdHA6Ly8qIHwgcnN5bmM6Ly8qICkKKwkJZmV0Y2hfcGVyX3JlZiAiJEAiCisJCTs7CisJKikKKwkJZmV0Y2hfYWxsX2F0X29uY2UgIiRAIgorCQk7OworCWVzYWMKK30KKworZmV0Y2hfbWFpbiAiJHJlZmxpc3QiIHx8IGV4aXQKKworIyBhdXRvbWF0ZWQgdGFnIGZvbGxvd2luZworY2FzZSAiJG5vX3RhZ3MkdGFncyIgaW4KKycnKQorCWNhc2UgIiRyZWZsaXN0IiBpbgorCSo6cmVmcy8qKQorCQkjIGVmZmVjdGl2ZSBvbmx5IHdoZW4gd2UgYXJlIGZvbGxvd2luZyByZW1vdGUgYnJhbmNoCisJCSMgdXNpbmcgbG9jYWwgdHJhY2tpbmcgYnJhbmNoLgorCQl0YWdsaXN0PSQoSUZTPScJJyAmJgorCQllY2hvICIkbHNfcmVtb3RlX3Jlc3VsdCIgfAorCQlnaXQtc2hvdy1yZWYgLS1leGNsdWRlLWV4aXN0aW5nPXJlZnMvdGFncy8gfAorCQl3aGlsZSByZWFkIHNoYTEgbmFtZQorCQlkbworCQkJZ2l0LWNhdC1maWxlIC10ICIkc2hhMSIgPi9kZXYvbnVsbCAyPiYxIHx8IGNvbnRpbnVlCisJCQllY2hvID4mMiAiQXV0by1mb2xsb3dpbmcgJG5hbWUiCisJCQllY2hvICIuJHtuYW1lfToke25hbWV9IgorCQlkb25lKQorCWVzYWMKKwljYXNlICIkdGFnbGlzdCIgaW4KKwknJykgOzsKKwk/KikKKwkJIyBkbyBub3QgZGVlcGVuIGEgc2hhbGxvdyB0cmVlIHdoZW4gZm9sbG93aW5nIHRhZ3MKKwkJc2hhbGxvd19kZXB0aD0KKwkJZmV0Y2hfbWFpbiAiJHRhZ2xpc3QiIHx8IGV4aXQgOzsKKwllc2FjCitlc2FjCisKKyMgSWYgdGhlIG9yaWdpbmFsIGhlYWQgd2FzIGVtcHR5IChpLmUuIG5vICJtYXN0ZXIiIHlldCksIG9yCisjIGlmIHdlIHdlcmUgdG9sZCBub3QgdG8gd29ycnksIHdlIGRvIG5vdCBoYXZlIHRvIGNoZWNrLgorY2FzZSAiJG9yaWdfaGVhZCIgaW4KKycnKQorCTs7Cis/KikKKwljdXJyX2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCisJaWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCisJdGhlbgorCSAgICBnaXQtdXBkYXRlLXJlZiBcCisJCQktbSAiJEdJVF9SRUZMT0dfQUNUSU9OOiBVbmRvaW5nIGluY29ycmVjdGx5IGZldGNoZWQgSEVBRC4iIFwKKwkJCUhFQUQgIiRvcmlnX2hlYWQiCisJCWRpZSAiQ2Fubm90IGZldGNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKKwlmaQorCTs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtZ3VpLy5naXRpZ25vcmUgYi9naXQtZ3VpLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwYjg2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDUgQEAKK0dJVC1WRVJTSU9OLUZJTEUKK0dJVC1HVUktVkFSUworZ2l0LWNpdG9vbAorZ2l0LWd1aQorbGliL3RjbEluZGV4CmRpZmYgLS1naXQgYS9naXQtZ3VpL0dJVC1WRVJTSU9OLUdFTiBiL2dpdC1ndWkvR0lULVZFUlNJT04tR0VOCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlZTQ5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL0dJVC1WRVJTSU9OLUdFTgpAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKworR1ZGPUdJVC1WRVJTSU9OLUZJTEUKK0RFRl9WRVI9MC43LkdJVEdVSQorCitMRj0nCisnCisKK3RyZWVfc2VhcmNoICgpCit7CisJaGVhZD0kMQorCXRyZWU9JDIKKwlmb3IgcCBpbiAkKGdpdCByZXYtbGlzdCAtLXBhcmVudHMgLS1tYXgtY291bnQ9MSAkaGVhZCAyPi9kZXYvbnVsbCkKKwlkbworCQl0ZXN0ICR0cmVlID0gJChnaXQgcmV2LXBhcnNlICRwXnt0cmVlfSAyPi9kZXYvbnVsbCkgJiYKKwkJdm49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCAkcCAyPi9kZXYvbnVsbCkgJiYKKwkJY2FzZSAiJHZuIiBpbgorCQlnaXRndWktWzAtOV0qKSBlY2hvICR2bjsgYnJlYWs7OworCQllc2FjCisJZG9uZQorfQorCisjIEFsd2F5cyB1c2UgdGhlIHRhcmJhbGwgdmVyc2lvbiBmaWxlIGlmIGZvdW5kLCBqdXN0CisjIGluIGNhc2Ugd2UgYXJlIHNvbWVob3cgY29udGFpbmVkIGluIGEgbGFyZ2VyIGdpdAorIyByZXBvc2l0b3J5IHRoYXQgZG9lc24ndCBhY3R1YWxseSB0cmFjayBvdXIgc3RhdGUuCisjIChBdCBsZWFzdCBvbmUgcGFja2FnZSBtYW5hZ2VyIGlzIGRvaW5nIHRoaXMuKQorIworIyBXZSBtYXkgYmUgYSBzdWJwcm9qZWN0LCBzbyB0cnkgbG9va2luZyBmb3IgdGhlIG1lcmdlCisjIGNvbW1pdCB0aGF0IHN1cHBsaWVkIHRoaXMgZGlyZWN0b3J5IGNvbnRlbnQgaWYgd2UgYXJlCisjIG5vdCBhdCB0aGUgdG9wbGV2ZWwuICBXZSBwcm9iYWJseSB3aWxsIGFsd2F5cyBiZSB0aGUKKyMgc2Vjb25kIHBhcmVudCBpbiB0aGUgY29tbWl0LCBidXQgd2Ugc2hvdWxkbid0IHJlbHkgb24KKyMgdGhhdCBmYWN0LgorIworIyBJZiB3ZSBhcmUgYXQgdGhlIHRvcGxldmVsIG9yIHRoZSBtZXJnZSBhc3N1bXB0aW9uIGZhaWxzCisjIHRyeSBsb29raW5nIGZvciBhIGdpdGd1aS0qIHRhZy4KKworaWYgdGVzdCAtZiB2ZXJzaW9uICYmCisgICBWTj0kKGNhdCB2ZXJzaW9uKQordGhlbgorCTogaGFwcHkKK2VsaWYgcHJlZml4PSIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXByZWZpeCAyPi9kZXYvbnVsbCkiCisgICB0ZXN0IC1uICIkcHJlZml4IiAmJgorICAgaGVhZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQgLS0gLiAyPi9kZXYvbnVsbCkgJiYKKyAgIHRyZWU9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEOiRwcmVmaXgiIDI+L2Rldi9udWxsKSAmJgorICAgVk49JCh0cmVlX3NlYXJjaCAkaGVhZCAkdHJlZSkKKyAgIGNhc2UgIiRWTiIgaW4KKyAgIGdpdGd1aS1bMC05XSopIDogaGFwcHkgOzsKKyAgICopIChleGl0IDEpIDs7CisgICBlc2FjCit0aGVuCisJVk49JChlY2hvICIkVk4iIHwgc2VkIC1lICdzL15naXRndWktLy87cy8tLy4vZycpOworZWxpZiBWTj0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj00IEhFQUQgMj4vZGV2L251bGwpICYmCisgICBjYXNlICIkVk4iIGluCisgICBnaXRndWktWzAtOV0qKSA6IGhhcHB5IDs7CisgICAqKSAoZXhpdCAxKSA7OworICAgZXNhYwordGhlbgorCVZOPSQoZWNobyAiJFZOIiB8IHNlZCAtZSAncy9eZ2l0Z3VpLS8vO3MvLS8uL2cnKTsKK2Vsc2UKKwlWTj0iJERFRl9WRVIiCitmaQorCitkaXJ0eT0kKHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbCkgfHwgZGlydHk9CitjYXNlICIkZGlydHkiIGluCisnJykKKwk7OworKikKKwlWTj0iJFZOLWRpcnR5IiA7OworZXNhYworCitpZiB0ZXN0IC1yICRHVkYKK3RoZW4KKwlWQz0kKHNlZCAtZSAncy9eR0lUR1VJX1ZFUlNJT04gPSAvLycgPCRHVkYpCitlbHNlCisJVkM9dW5zZXQKK2ZpCit0ZXN0ICIkVk4iID0gIiRWQyIgfHwgeworCWVjaG8gPiYyICJHSVRHVUlfVkVSU0lPTiA9ICRWTiIKKwllY2hvICJHSVRHVUlfVkVSU0lPTiA9ICRWTiIgPiRHVkYKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvTWFrZWZpbGUgYi9naXQtZ3VpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTUwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTM1IEBACithbGw6OgorCisjIERlZmluZSBWPTEgdG8gaGF2ZSBhIG1vcmUgdmVyYm9zZSBjb21waWxlLgorIworCitHSVQtVkVSU0lPTi1GSUxFOiAuRk9SQ0UtR0lULVZFUlNJT04tRklMRQorCUAkKFNIRUxMX1BBVEgpIC4vR0lULVZFUlNJT04tR0VOCistaW5jbHVkZSBHSVQtVkVSU0lPTi1GSUxFCisKK3VuYW1lX08gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW8gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQorCitTQ1JJUFRfU0ggPSBnaXQtZ3VpLnNoCitHSVRHVUlfQlVJTFRfSU5TID0gZ2l0LWNpdG9vbAorQUxMX1BST0dSQU1TID0gJChHSVRHVUlfQlVJTFRfSU5TKSAkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpCitBTExfTElCRklMRVMgPSAkKHdpbGRjYXJkIGxpYi8qLnRjbCkKK1BSRUxPQURfRklMRVMgPSBsaWIvY2xhc3MudGNsCisKK2lmbmRlZiBTSEVMTF9QQVRICisJU0hFTExfUEFUSCA9IC9iaW4vc2gKK2VuZGlmCisKK2lmbmRlZiBnaXRleGVjZGlyCisJZ2l0ZXhlY2RpciA6PSAkKHNoZWxsIGdpdCAtLWV4ZWMtcGF0aCkKK2VuZGlmCisKK2lmbmRlZiBzaGFyZWRpcgorCXNoYXJlZGlyIDo9ICQoZGlyICQoZ2l0ZXhlY2Rpcikpc2hhcmUKK2VuZGlmCisKK2lmbmRlZiBJTlNUQUxMCisJSU5TVEFMTCA9IGluc3RhbGwKK2VuZGlmCisKK2lmbmRlZiBWCisJUVVJRVRfR0VOICAgICAgPSBAZWNobyAnICAgJyBHRU4gJEA7CisJUVVJRVRfQlVJTFRfSU4gPSBAZWNobyAnICAgJyBCVUlMVElOICRAOworCVFVSUVUX0lOREVYICAgID0gQGVjaG8gJyAgICcgSU5ERVggJChkaXIgJEApOworCVFVSUVUXzJERVZOVUxMID0gMj4vZGV2L251bGwKK2VuZGlmCisKK1RDTF9QQVRIICAgPz0gdGNsc2gKK1RDTFRLX1BBVEggPz0gd2lzaAorCitpZmVxICgkKGZpbmRzdHJpbmcgJChNQUtFRkxBR1MpLHMpLHMpCitRVUlFVF9HRU4gPQorUVVJRVRfQlVJTFRfSU4gPQorZW5kaWYKKworREVTVERJUl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoREVTVERJUikpCitnaXRleGVjZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChnaXRleGVjZGlyKSkKK1NIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorVENMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFRDTF9QQVRIKSkKK1RDTFRLX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFRDTFRLX1BBVEgpKQorCitsaWJkaXIgICA/PSAkKHNoYXJlZGlyKS9naXQtZ3VpL2xpYgorbGliZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChsaWJkaXIpKQorCitleGVkaXIgICAgPSAkKGRpciAkKGdpdGV4ZWNkaXIpKXNoYXJlL2dpdC1ndWkvbGliCitleGVkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGV4ZWRpcikpCisKKyQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgOiAlIDogJS5zaAorCSQoUVVJRVRfR0VOKXJtIC1mICRAICRAKyAmJiBcCisJR0lUR1VJX1JFTEFUSVZFPSAmJiBcCisJaWYgdGVzdCAnJChleGVkaXJfU1EpJyA9ICckKGxpYmRpcl9TUSknOyB0aGVuIFwKKwkJaWYgdGVzdCAiJCh1bmFtZV9PKSIgPSBDeWd3aW47IFwKKwkJdGhlbiBHSVRHVUlfUkVMQVRJVkU9IDsgXAorCQllbHNlIEdJVEdVSV9SRUxBVElWRT0xOyBcCisJCWZpOyBcCisJZmkgJiYgXAorCXNlZCAtZSAnMXN8IyEuKi9zaHwjISQoU0hFTExfUEFUSF9TUSl8JyBcCisJCS1lICdzfF4gZXhlYyB3aXNoICIkJDAifCBleGVjICQoc3Vic3QgfCwnXHwnLCQoVENMVEtfUEFUSF9TUSkpICIkJDAifCcgXAorCQktZSAncy9AQEdJVEdVSV9WRVJTSU9OQEAvJChHSVRHVUlfVkVSU0lPTikvZycgXAorCQktZSAnc3xAQEdJVEdVSV9SRUxBVElWRUBAfCckJEdJVEdVSV9SRUxBVElWRSd8JyBcCisJCS1lICQkR0lUR1VJX1JFTEFUSVZFJ3N8QEBHSVRHVUlfTElCRElSQEB8JChsaWJkaXJfU1EpfCcgXAorCQkkQC5zaCA+JEArICYmIFwKKwljaG1vZCAreCAkQCsgJiYgXAorCW12ICRAKyAkQAorCiskKEdJVEdVSV9CVUlMVF9JTlMpOiBnaXQtZ3VpCisJJChRVUlFVF9CVUlMVF9JTilybSAtZiAkQCAmJiBsbiBnaXQtZ3VpICRACisKK2xpYi90Y2xJbmRleDogJChBTExfTElCRklMRVMpCisJJChRVUlFVF9JTkRFWClpZiBlY2hvIFwKKwkgICQoZm9yZWFjaCBwLCQoUFJFTE9BRF9GSUxFUyksc291cmNlICRwXDspIFwKKwkgIGF1dG9fbWtpbmRleCBsaWIgJyoudGNsJyBcCisJfCAkKFRDTF9QQVRIKSAkKFFVSUVUXzJERVZOVUxMKTsgdGhlbiA6IG9rOyBcCisJZWxzZSBcCisJIGVjaG8gMT4mMiAiICAgICogJChUQ0xfUEFUSCkgZmFpbGVkOyB1c2luZyB1bm9wdGltaXplZCBsb2FkaW5nIjsgXAorCSBybSAtZiAkQCA7IFwKKwkgZWNobyAnIyBBdXRvZ2VuZXJhdGVkIGJ5IGdpdC1ndWkgTWFrZWZpbGUnID4kQCAmJiBcCisJIGVjaG8gPj4kQCAmJiBcCisJICQoZm9yZWFjaCBwLCQoUFJFTE9BRF9GSUxFUykgJChBTExfTElCRklMRVMpLGVjaG8gJyQoc3Vic3QgbGliLywsJHApJyA+PiRAICYmKSBcCisJIGVjaG8gPj4kQCA7IFwKKwlmaQorCisjIFRoZXNlIGNhbiByZWNvcmQgR0lUR1VJX1ZFUlNJT04KKyQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSk6IEdJVC1WRVJTSU9OLUZJTEUgR0lULUdVSS1WQVJTCitsaWIvdGNsSW5kZXg6IEdJVC1HVUktVkFSUworCitUUkFDS19WQVJTID0gXAorCSQoc3Vic3QgJywnXCcnLFNIRUxMX1BBVEg9JyQoU0hFTExfUEFUSF9TUSknKSBcCisJJChzdWJzdCAnLCdcJycsVENMX1BBVEg9JyQoVENMX1BBVEhfU1EpJykgXAorCSQoc3Vic3QgJywnXCcnLFRDTFRLX1BBVEg9JyQoVENMVEtfUEFUSF9TUSknKSBcCisJJChzdWJzdCAnLCdcJycsZ2l0ZXhlY2Rpcj0nJChnaXRleGVjZGlyX1NRKScpIFwKKwkkKHN1YnN0ICcsJ1wnJyxsaWJkaXI9JyQobGliZGlyX1NRKScpIFwKKyNlbmQgVFJBQ0tfVkFSUworCitHSVQtR1VJLVZBUlM6IC5GT1JDRS1HSVQtR1VJLVZBUlMKKwlAVkFSUz0nJChUUkFDS19WQVJTKSc7IFwKKwlpZiB0ZXN0IHgiJCRWQVJTIiAhPSB4ImBjYXQgJEAgMj4vZGV2L251bGxgIiA7IHRoZW4gXAorCQllY2hvIDE+JjIgIiAgICAqIG5ldyBsb2NhdGlvbnMgb3IgVGNsL1RrIGludGVycHJldGVyIjsgXAorCQllY2hvIDE+JEAgIiQkVkFSUyI7IFwKKwlmaQorCithbGw6OiAkKEFMTF9QUk9HUkFNUykgbGliL3RjbEluZGV4CisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgLW03NTUgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJworCSQoSU5TVEFMTCkgZ2l0LWd1aSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSknCisJJChmb3JlYWNoIHAsJChHSVRHVUlfQlVJTFRfSU5TKSwgcm0gLWYgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyAmJiBsbiAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0LWd1aScgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyA7KQorCSQoSU5TVEFMTCkgLWQgLW03NTUgJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknCisJJChJTlNUQUxMKSAtbTY0NCBsaWIvdGNsSW5kZXggJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknCisJJChmb3JlYWNoIHAsJChBTExfTElCRklMRVMpLCAkKElOU1RBTEwpIC1tNjQ0ICRwICckKERFU1RESVJfU1EpJChsaWJkaXJfU1EpJyA7KQorCitkaXN0LXZlcnNpb246CisJQG1rZGlyIC1wICQoVEFSRElSKQorCUBlY2hvICQoR0lUR1VJX1ZFUlNJT04pID4gJChUQVJESVIpL3ZlcnNpb24KKworY2xlYW46OgorCXJtIC1mICQoQUxMX1BST0dSQU1TKSBsaWIvdGNsSW5kZXgKKwlybSAtZiBHSVQtVkVSU0lPTi1GSUxFIEdJVC1HVUktVkFSUworCisuUEhPTlk6IGFsbCBpbnN0YWxsIGRpc3QtdmVyc2lvbiBjbGVhbgorLlBIT05ZOiAuRk9SQ0UtR0lULVZFUlNJT04tRklMRQorLlBIT05ZOiAuRk9SQ0UtR0lULUdVSS1WQVJTCmRpZmYgLS1naXQgYS9naXQtZ3VpLnNoIGIvZ2l0LWd1aS9naXQtZ3VpLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBnaXQtZ3VpLnNoCnJlbmFtZSB0byBnaXQtZ3VpL2dpdC1ndWkuc2gKZGlmZiAtLWdpdCBhL2xpYi9ibGFtZS50Y2wgYi9naXQtZ3VpL2xpYi9ibGFtZS50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9ibGFtZS50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL2JsYW1lLnRjbApkaWZmIC0tZ2l0IGEvbGliL2JyYW5jaC50Y2wgYi9naXQtZ3VpL2xpYi9icmFuY2gudGNsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvYnJhbmNoLnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvYnJhbmNoLnRjbApkaWZmIC0tZ2l0IGEvbGliL2Jyb3dzZXIudGNsIGIvZ2l0LWd1aS9saWIvYnJvd3Nlci50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9icm93c2VyLnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvYnJvd3Nlci50Y2wKZGlmZiAtLWdpdCBhL2xpYi9jbGFzcy50Y2wgYi9naXQtZ3VpL2xpYi9jbGFzcy50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jbGFzcy50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL2NsYXNzLnRjbApkaWZmIC0tZ2l0IGEvbGliL2NvbW1pdC50Y2wgYi9naXQtZ3VpL2xpYi9jb21taXQudGNsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvY29tbWl0LnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvY29tbWl0LnRjbApkaWZmIC0tZ2l0IGEvbGliL2NvbnNvbGUudGNsIGIvZ2l0LWd1aS9saWIvY29uc29sZS50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jb25zb2xlLnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvY29uc29sZS50Y2wKZGlmZiAtLWdpdCBhL2xpYi9kYXRhYmFzZS50Y2wgYi9naXQtZ3VpL2xpYi9kYXRhYmFzZS50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9kYXRhYmFzZS50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL2RhdGFiYXNlLnRjbApkaWZmIC0tZ2l0IGEvbGliL2RpZmYudGNsIGIvZ2l0LWd1aS9saWIvZGlmZi50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9kaWZmLnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvZGlmZi50Y2wKZGlmZiAtLWdpdCBhL2xpYi9lcnJvci50Y2wgYi9naXQtZ3VpL2xpYi9lcnJvci50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcnJvci50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL2Vycm9yLnRjbApkaWZmIC0tZ2l0IGEvbGliL2luZGV4LnRjbCBiL2dpdC1ndWkvbGliL2luZGV4LnRjbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2luZGV4LnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvaW5kZXgudGNsCmRpZmYgLS1naXQgYS9saWIvbWVyZ2UudGNsIGIvZ2l0LWd1aS9saWIvbWVyZ2UudGNsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvbWVyZ2UudGNsCnJlbmFtZSB0byBnaXQtZ3VpL2xpYi9tZXJnZS50Y2wKZGlmZiAtLWdpdCBhL2xpYi9vcHRpb24udGNsIGIvZ2l0LWd1aS9saWIvb3B0aW9uLnRjbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL29wdGlvbi50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL29wdGlvbi50Y2wKZGlmZiAtLWdpdCBhL2xpYi9yZW1vdGUudGNsIGIvZ2l0LWd1aS9saWIvcmVtb3RlLnRjbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3JlbW90ZS50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL3JlbW90ZS50Y2wKZGlmZiAtLWdpdCBhL2xpYi9zaG9ydGN1dC50Y2wgYi9naXQtZ3VpL2xpYi9zaG9ydGN1dC50Y2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9zaG9ydGN1dC50Y2wKcmVuYW1lIHRvIGdpdC1ndWkvbGliL3Nob3J0Y3V0LnRjbApkaWZmIC0tZ2l0IGEvbGliL3RyYW5zcG9ydC50Y2wgYi9naXQtZ3VpL2xpYi90cmFuc3BvcnQudGNsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvdHJhbnNwb3J0LnRjbApyZW5hbWUgdG8gZ2l0LWd1aS9saWIvdHJhbnNwb3J0LnRjbApkaWZmIC0tZ2l0IGEvZ2l0LWluc3Rhd2ViLnNoIGIvZ2l0LWluc3Rhd2ViLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiYzc0MTgKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtaW5zdGF3ZWIuc2gKQEAgLTAsMCArMSwyNTUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCitVU0FHRT0nWy0tc3RhcnRdIFstLXN0b3BdIFstLXJlc3RhcnRdCisgIFstLWxvY2FsXSBbLS1odHRwZD08aHR0cGQ+XSBbLS1wb3J0PTxwb3J0Pl0gWy0tYnJvd3Nlcj08YnJvd3Nlcj5dCisgIFstLW1vZHVsZS1wYXRoPTxwYXRoPiAoZm9yIEFwYWNoZTIgb25seSldJworCisuIGdpdC1zaC1zZXR1cAorCitjYXNlICIkR0lUX0RJUiIgaW4KKy8qKQorCWZxZ2l0ZGlyPSIkR0lUX0RJUiIgOzsKKyopCisJZnFnaXRkaXI9IiRQV0QvJEdJVF9ESVIiIDs7Citlc2FjCisKK2xvY2FsPSJgZ2l0IGNvbmZpZyAtLWJvb2wgLS1nZXQgaW5zdGF3ZWIubG9jYWxgIgoraHR0cGQ9ImBnaXQgY29uZmlnIC0tZ2V0IGluc3Rhd2ViLmh0dHBkYCIKK2Jyb3dzZXI9ImBnaXQgY29uZmlnIC0tZ2V0IGluc3Rhd2ViLmJyb3dzZXJgIgorcG9ydD1gZ2l0IGNvbmZpZyAtLWdldCBpbnN0YXdlYi5wb3J0YAorbW9kdWxlX3BhdGg9ImBnaXQgY29uZmlnIC0tZ2V0IGluc3Rhd2ViLm1vZHVsZXBhdGhgIgorCitjb25mPSRHSVRfRElSL2dpdHdlYi9odHRwZC5jb25mCisKKyMgRGVmYXVsdHM6CisKKyMgaWYgaW5zdGFsbGVkLCBpdCBkb2Vzbid0IG5lZWQgZnVydGhlciBjb25maWd1cmF0aW9uIChtb2R1bGVfcGF0aCkKK3Rlc3QgLXogIiRodHRwZCIgJiYgaHR0cGQ9J2xpZ2h0dHBkIC1mJworCisjIHByb2JhYmx5IHRoZSBtb3N0IHBvcHVsYXIgYnJvd3NlciBhbW9uZyBnaXR3ZWIgdXNlcnMKK3Rlc3QgLXogIiRicm93c2VyIiAmJiBicm93c2VyPSdmaXJlZm94JworCisjIGFueSB1bnRha2VuIGxvY2FsIHBvcnQgd2lsbCBkby4uLgordGVzdCAteiAiJHBvcnQiICYmIHBvcnQ9MTIzNAorCitzdGFydF9odHRwZCAoKSB7CisJaHR0cGRfb25seT0iYGVjaG8gJGh0dHBkIHwgY3V0IC1mMSAtZCcgJ2AiCisJaWYgdGVzdCAiYGV4cHIgaW5kZXggJGh0dHBkX29ubHkgL2AiIC1lcSAnMScgfHwgXAorCQkJCXdoaWNoICRodHRwZF9vbmx5ID4vZGV2L251bGwKKwl0aGVuCisJCSRodHRwZCAkZnFnaXRkaXIvZ2l0d2ViL2h0dHBkLmNvbmYKKwllbHNlCisJCSMgbWFueSBodHRwZHMgYXJlIGluc3RhbGxlZCBpbiAvdXNyL3NiaW4gb3IgL3Vzci9sb2NhbC9zYmluCisJCSMgdGhlc2UgZGF5cyBhbmQgdGhvc2UgYXJlIG5vdCBpbiBtb3N0IHVzZXJzICRQQVRIcworCQlmb3IgaSBpbiAvdXNyL2xvY2FsL3NiaW4gL3Vzci9zYmluCisJCWRvCisJCQlpZiB0ZXN0IC14ICIkaS8kaHR0cGRfb25seSIKKwkJCXRoZW4KKwkJCQkjIGRvbid0IHF1b3RlICRodHRwZCwgdGhlcmUgY2FuIGJlCisJCQkJIyBhcmd1bWVudHMgdG8gaXQgKC1mKQorCQkJCSRpLyRodHRwZCAiJGZxZ2l0ZGlyL2dpdHdlYi9odHRwZC5jb25mIgorCQkJCXJldHVybgorCQkJZmkKKwkJZG9uZQorCQllY2hvICIkaHR0cGRfb25seSBub3QgZm91bmQuIEluc3RhbGwgJGh0dHBkX29ubHkgb3IgdXNlIiBcCisJCSAgICAgIi0taHR0cGQgdG8gc3BlY2lmeSBhbm90aGVyIGh0dHAgZGFlbW9uLiIKKwkJZXhpdCAxCisJZmkKKwlpZiB0ZXN0ICQ/ICE9IDA7IHRoZW4KKwkJZWNobyAiQ291bGQgbm90IGV4ZWN1dGUgaHR0cCBkYWVtb24gJGh0dHBkLiIKKwkJZXhpdCAxCisJZmkKK30KKworc3RvcF9odHRwZCAoKSB7CisJdGVzdCAtZiAiJGZxZ2l0ZGlyL3BpZCIgJiYga2lsbCBgY2F0ICIkZnFnaXRkaXIvcGlkImAKK30KKword2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLS1zdG9wfHN0b3ApCisJCXN0b3BfaHR0cGQKKwkJZXhpdCAwCisJCTs7CisJLS1zdGFydHxzdGFydCkKKwkJc3RhcnRfaHR0cGQKKwkJZXhpdCAwCisJCTs7CisJLS1yZXN0YXJ0fHJlc3RhcnQpCisJCXN0b3BfaHR0cGQKKwkJc3RhcnRfaHR0cGQKKwkJZXhpdCAwCisJCTs7CisJLS1sb2NhbHwtbCkKKwkJbG9jYWw9dHJ1ZQorCQk7OworCS1kfC0taHR0cGR8LS1odHRwZD0qKQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlodHRwZD1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYCA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJaHR0cGQ9IiQyIgorCQkJc2hpZnQgOzsKKwkJZXNhYworCQk7OworCS1ifC0tYnJvd3NlcnwtLWJyb3dzZXI9KikKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJYnJvd3Nlcj1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYCA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJYnJvd3Nlcj0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCTs7CisJLXB8LS1wb3J0fC0tcG9ydD0qKQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlwb3J0PWBleHByICIkMSIgOiAnLVtePV0qPVwoLipcKSdgIDs7CisJCTEsKikKKwkJCXVzYWdlIDs7CisJCSopCisJCQlwb3J0PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJOzsKKwktbXwtLW1vZHVsZS1wYXRoPSp8LS1tb2R1bGUtcGF0aCkKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJbW9kdWxlX3BhdGg9YGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCW1vZHVsZV9wYXRoPSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJOzsKKwkqKQorCQl1c2FnZQorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitta2RpciAtcCAiJEdJVF9ESVIvZ2l0d2ViL3RtcCIKK0dJVF9FWEVDX1BBVEg9ImBnaXQgLS1leGVjLXBhdGhgIgorR0lUX0RJUj0iJGZxZ2l0ZGlyIgorZXhwb3J0IEdJVF9FWEVDX1BBVEggR0lUX0RJUgorCisKK2xpZ2h0dHBkX2NvbmYgKCkgeworCWNhdCA+ICIkY29uZiIgPDxFT0YKK3NlcnZlci5kb2N1bWVudC1yb290ID0gIiRmcWdpdGRpci9naXR3ZWIiCitzZXJ2ZXIucG9ydCA9ICRwb3J0CitzZXJ2ZXIubW9kdWxlcyA9ICggIm1vZF9jZ2kiICkKK3NlcnZlci5pbmRleGZpbGVzID0gKCAiZ2l0d2ViLmNnaSIgKQorc2VydmVyLnBpZC1maWxlID0gIiRmcWdpdGRpci9waWQiCitjZ2kuYXNzaWduID0gKCAiLmNnaSIgPT4gIiIgKQorbWltZXR5cGUuYXNzaWduID0gKCAiLmNzcyIgPT4gInRleHQvY3NzIiApCitFT0YKKwl0ZXN0ICIkbG9jYWwiID0gdHJ1ZSAmJiBlY2hvICdzZXJ2ZXIuYmluZCA9ICIxMjcuMC4wLjEiJyA+PiAiJGNvbmYiCit9CisKK2FwYWNoZTJfY29uZiAoKSB7CisJdGVzdCAteiAiJG1vZHVsZV9wYXRoIiAmJiBtb2R1bGVfcGF0aD0vdXNyL2xpYi9hcGFjaGUyL21vZHVsZXMKKwlta2RpciAtcCAiJEdJVF9ESVIvZ2l0d2ViL2xvZ3MiCisJYmluZD0KKwl0ZXN0ICIkbG9jYWwiID0gdHJ1ZSAmJiBiaW5kPScxMjcuMC4wLjE6JworCWVjaG8gJ3RleHQvY3NzIGNzcycgPiAkZnFnaXRkaXIvbWltZS50eXBlcworCWNhdCA+ICIkY29uZiIgPDxFT0YKK1NlcnZlck5hbWUgImdpdC1pbnN0YXdlYiIKK1NlcnZlclJvb3QgIiRmcWdpdGRpci9naXR3ZWIiCitEb2N1bWVudFJvb3QgIiRmcWdpdGRpci9naXR3ZWIiCitQaWRGaWxlICIkZnFnaXRkaXIvcGlkIgorTGlzdGVuICRiaW5kJHBvcnQKK0VPRgorCisJZm9yIG1vZCBpbiBtaW1lIGRpcjsgZG8KKwkJaWYgdGVzdCAtZSAkbW9kdWxlX3BhdGgvbW9kXyR7bW9kfS5zbzsgdGhlbgorCQkJZWNobyAiTG9hZE1vZHVsZSAke21vZH1fbW9kdWxlICIgXAorCQkJICAgICAiJG1vZHVsZV9wYXRoL21vZF8ke21vZH0uc28iID4+ICIkY29uZiIKKwkJZmkKKwlkb25lCisJY2F0ID4+ICIkY29uZiIgPDxFT0YKK1R5cGVzQ29uZmlnICRmcWdpdGRpci9taW1lLnR5cGVzCitEaXJlY3RvcnlJbmRleCBnaXR3ZWIuY2dpCitFT0YKKworCSMgY2hlY2sgdG8gc2VlIGlmIERlbm5pcyBTdG9zYmVyZydzIG1vZF9wZXJsIGNvbXBhdGliaWxpdHkgcGF0Y2gKKwkjICg8MjAwNjA2MjExMzA3MDguR2NiYzZlNWNAbGVvbm92LnN0b3NiZXJnLm5ldD4pIGhhcyBiZWVuIGFwcGxpZWQKKwlpZiB0ZXN0IC1mICIkbW9kdWxlX3BhdGgvbW9kX3Blcmwuc28iICYmIGdyZXAgJ15vdXIgJGdpdGJpbicgXAorCQkJCSIkR0lUX0RJUi9naXR3ZWIvZ2l0d2ViLmNnaSIgPi9kZXYvbnVsbAorCXRoZW4KKwkJIyBmYXZvciBtb2RfcGVybCBpZiBhdmFpbGFibGUKKwkJY2F0ID4+ICIkY29uZiIgPDxFT0YKK0xvYWRNb2R1bGUgcGVybF9tb2R1bGUgJG1vZHVsZV9wYXRoL21vZF9wZXJsLnNvCitQZXJsUGFzc0VudiBHSVRfRElSCitQZXJsUGFzc0VudiBHSVRfRVhFQ19ESVIKKzxMb2NhdGlvbiAvZ2l0d2ViLmNnaT4KKwlTZXRIYW5kbGVyIHBlcmwtc2NyaXB0CisJUGVybFJlc3BvbnNlSGFuZGxlciBNb2RQZXJsOjpSZWdpc3RyeQorCVBlcmxPcHRpb25zICtQYXJzZUhlYWRlcnMKKwlPcHRpb25zICtFeGVjQ0dJCis8L0xvY2F0aW9uPgorRU9GCisJZWxzZQorCQkjIHBsYWluLW9sZCBDR0kKKwkJbGlzdF9tb2RzPWBlY2hvICIkaHR0cGQiIHwgc2VkICJzLy1mJC8tbC8iYAorCQkkbGlzdF9tb2RzIHwgZ3JlcCAnbW9kX2NnaVwuYycgPi9kZXYvbnVsbCAyPiYxIHx8IFwKKwkJZWNobyAiTG9hZE1vZHVsZSBjZ2lfbW9kdWxlICRtb2R1bGVfcGF0aC9tb2RfY2dpLnNvIiA+PiAiJGNvbmYiCisJCWNhdCA+PiAiJGNvbmYiIDw8RU9GCitBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmNnaQorPExvY2F0aW9uIC9naXR3ZWIuY2dpPgorCU9wdGlvbnMgK0V4ZWNDR0kKKzwvTG9jYXRpb24+CitFT0YKKwlmaQorfQorCitzY3JpcHQ9JworcyNeXChteVx8b3VyXCkgJHByb2plY3Ryb290ID0uKiNcMSAkcHJvamVjdHJvb3QgPSAiJ2BkaXJuYW1lICRmcWdpdGRpcmAnIjsjCitzI1wobXlcfG91clwpICRnaXRiaW4gPS4qI1wxICRnaXRiaW4gPSAiJyRHSVRfRVhFQ19QQVRIJyI7IworcyNcKG15XHxvdXJcKSAkcHJvamVjdHNfbGlzdCA9LiojXDEgJHByb2plY3RzX2xpc3QgPSAkcHJvamVjdHJvb3Q7IworcyNcKG15XHxvdXJcKSAkZ2l0X3RlbXAgPS4qI1wxICRnaXRfdGVtcCA9ICInJGZxZ2l0ZGlyL2dpdHdlYi90bXAnIjsjJworCitnaXR3ZWJfY2dpICgpIHsKKwljYXQgPiAiJDEudG1wIiA8PFxFT0ZHSVRXRUIKK0BAR0lUV0VCX0NHSUBACitFT0ZHSVRXRUIKKwlzZWQgIiRzY3JpcHQiICIkMS50bXAiICA+ICIkMSIKKwljaG1vZCAreCAiJDEiCisJcm0gLWYgIiQxLnRtcCIKK30KKworZ2l0d2ViX2NzcyAoKSB7CisJY2F0ID4gIiQxIiA8PFxFT0ZHSVRXRUIKK0BAR0lUV0VCX0NTU0BACitFT0ZHSVRXRUIKK30KKworZ2l0d2ViX2NnaSAkR0lUX0RJUi9naXR3ZWIvZ2l0d2ViLmNnaQorZ2l0d2ViX2NzcyAkR0lUX0RJUi9naXR3ZWIvZ2l0d2ViLmNzcworCitjYXNlICIkaHR0cGQiIGluCisqbGlnaHR0cGQqKQorCWxpZ2h0dHBkX2NvbmYKKwk7OworKmFwYWNoZTIqKQorCWFwYWNoZTJfY29uZgorCTs7CisqKQorCWVjaG8gIlVua25vd24gaHR0cGQgc3BlY2lmaWVkOiAkaHR0cGQiCisJZXhpdCAxCisJOzsKK2VzYWMKKworc3RhcnRfaHR0cGQKK3Rlc3QgLXogIiRicm93c2VyIiAmJiBicm93c2VyPWVjaG8KK3VybD1odHRwOi8vMTI3LjAuMC4xOiRwb3J0CiskYnJvd3NlciAkdXJsIHx8IGVjaG8gJHVybApkaWZmIC0tZ2l0IGEvZ2l0LWxvc3QtZm91bmQuc2ggYi9naXQtbG9zdC1mb3VuZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODU3MGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWxvc3QtZm91bmQuc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK1VTQUdFPScnCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK2lmIFsgIiQjIiAhPSAiMCIgXQordGhlbgorICAgIHVzYWdlCitmaQorCitsYWY9IiRHSVRfRElSL2xvc3QtZm91bmQiCitybSAtZnIgIiRsYWYiICYmIG1rZGlyIC1wICIkbGFmL2NvbW1pdCIgIiRsYWYvb3RoZXIiIHx8IGV4aXQKKworZ2l0IGZzY2sgLS1mdWxsIC0tbm8tcmVmbG9ncyB8Cit3aGlsZSByZWFkIGRhbmdsaW5nIHR5cGUgc2hhMQorZG8KKwljYXNlICIkZGFuZ2xpbmciIGluCisJZGFuZ2xpbmcpCisJCWlmIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRzaGExXjAiID4vZGV2L251bGwgMj4vZGV2L251bGwKKwkJdGhlbgorCQkJZGlyPSIkbGFmL2NvbW1pdCIKKwkJCWdpdC1zaG93LWJyYW5jaCAiJHNoYTEiCisJCWVsc2UKKwkJCWRpcj0iJGxhZi9vdGhlciIKKwkJZmkKKwkJZWNobyAiJHNoYTEiID4iJGRpci8kc2hhMSIKKwkJOzsKKwllc2FjCitkb25lCmRpZmYgLS1naXQgYS9naXQtbHMtcmVtb3RlLnNoIGIvZ2l0LWxzLXJlbW90ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNmVkOTlhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWxzLXJlbW90ZS5zaApAQCAtMCwwICsxLDE0MSBAQAorIyEvYmluL3NoCisjCisKK3VzYWdlICgpIHsKKyAgICBlY2hvID4mMiAidXNhZ2U6ICQwIFstLWhlYWRzXSBbLS10YWdzXSBbLXV8LS11cGxvYWQtcGFjayA8dXBsb2FkLXBhY2s+XSIKKyAgICBlY2hvID4mMiAiICAgICAgICAgIDxyZXBvc2l0b3J5PiA8cmVmcz4uLi4iCisgICAgZXhpdCAxOworfQorCitkaWUgKCkgeworICAgIGVjaG8gPiYyICIkKiIKKyAgICBleGl0IDEKK30KKworZXhlYz0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhazs7IGVzYWMKK2RvCisgIGNhc2UgIiQxIiBpbgorICAtaHwtLWh8LS1oZXwtLWhlYXwtLWhlYWR8LS1oZWFkcykKKyAgaGVhZHM9aGVhZHM7IHNoaWZ0IDs7CisgIC10fC0tdHwtLXRhfC0tdGFnfC0tdGFncykKKyAgdGFncz10YWdzOyBzaGlmdCA7OworICAtdXwtLXV8LS11cHwtLXVwbHwtLXVwbG9hfC0tdXBsb2FkfC0tdXBsb2FkLXwtLXVwbG9hZC1wfC0tdXBsb2FkLXBhfFwKKyAgLS11cGxvYWQtcGFjfC0tdXBsb2FkLXBhY2spCisJc2hpZnQKKwlleGVjPSItLXVwbG9hZC1wYWNrPSQxIgorCXNoaWZ0OzsKKyAgLXU9KnwtLXU9KnwtLXVwPSp8LS11cGw9KnwtLXVwbG89KnwtLXVwbG9hPSp8LS11cGxvYWQ9KnxcCisgIC0tdXBsb2FkLT0qfC0tdXBsb2FkLXA9KnwtLXVwbG9hZC1wYT0qfC0tdXBsb2FkLXBhYz0qfC0tdXBsb2FkLXBhY2s9KikKKwlleGVjPS0tdXBsb2FkLXBhY2s9JChleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJykKKwlzaGlmdDs7CisgIC0tKQorICBzaGlmdDsgYnJlYWsgOzsKKyAgLSopCisgIHVzYWdlIDs7CisgICopCisgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluIDApIHVzYWdlIDs7IGVzYWMKKworY2FzZSAiLCRoZWFkcywkdGFncywiIGluCissLCwpIGhlYWRzPWhlYWRzIHRhZ3M9dGFncyBvdGhlcj1vdGhlciA7OworZXNhYworCisuIGdpdC1wYXJzZS1yZW1vdGUKK3BlZWtfcmVwbz0iJChnZXRfcmVtb3RlX3VybCAiJEAiKSIKK3NoaWZ0CisKK3RtcD0ubHMtcmVtb3RlLSQkCit0cmFwICJybSAtZnIgJHRtcC0qIiAwIDEgMiAzIDE1Cit0bXBkaXI9JHRtcC1kCisKK2Nhc2UgIiRwZWVrX3JlcG8iIGluCitodHRwOi8vKiB8IGh0dHBzOi8vKiB8IGZ0cDovLyogKQorICAgICAgICBpZiBbIC1uICIkR0lUX1NTTF9OT19WRVJJRlkiIF07IHRoZW4KKyAgICAgICAgICAgIGN1cmxfZXh0cmFfYXJncz0iLWsiCisgICAgICAgIGZpCisJaWYgWyAtbiAiJEdJVF9DVVJMX0ZUUF9OT19FUFNWIiAtbyBcCisJCSJgZ2l0LWNvbmZpZyAtLWJvb2wgaHR0cC5ub0VQU1ZgIiA9IHRydWUgXTsgdGhlbgorCQljdXJsX2V4dHJhX2FyZ3M9IiR7Y3VybF9leHRyYV9hcmdzfSAtLWRpc2FibGUtZXBzdiIKKwlmaQorCWN1cmwgLW5zZiAkY3VybF9leHRyYV9hcmdzIC0taGVhZGVyICJQcmFnbWE6IG5vLWNhY2hlIiAiJHBlZWtfcmVwby9pbmZvL3JlZnMiIHx8CisJCWVjaG8gImZhaWxlZAlzbHVycGluZyIKKwk7OworCityc3luYzovLyogKQorCW1rZGlyICR0bXBkaXIgJiYKKwlyc3luYyAtcmxxICIkcGVla19yZXBvL0hFQUQiICR0bXBkaXIgJiYKKwlyc3luYyAtcnEgIiRwZWVrX3JlcG8vcmVmcyIgJHRtcGRpciB8fCB7CisJCWVjaG8gImZhaWxlZAlzbHVycGluZyIKKwkJZXhpdAorCX0KKwloZWFkPSQoY2F0ICIkdG1wZGlyL0hFQUQiKSAmJgorCWNhc2UgIiRoZWFkIiBpbgorCXJlZjonICcqKQorCQloZWFkPSQoZXhwciAieiRoZWFkIiA6ICd6cmVmOiBcKC4qXCknKSAmJgorCQloZWFkPSQoY2F0ICIkdG1wZGlyLyRoZWFkIikgfHwgZXhpdAorCWVzYWMgJiYKKwllY2hvICIkaGVhZAlIRUFEIgorCShjZCAkdG1wZGlyICYmIGZpbmQgcmVmcyAtdHlwZSBmKSB8CisJd2hpbGUgcmVhZCBwYXRoCisJZG8KKwkJY2F0ICIkdG1wZGlyLyRwYXRoIiB8IHRyIC1kICdcMDEyJworCQllY2hvICIJJHBhdGgiCisJZG9uZSAmJgorCXJtIC1mciAkdG1wZGlyCisJOzsKKworKiApCisJaWYgdGVzdCAtZiAiJHBlZWtfcmVwbyIgOyB0aGVuCisJCWdpdCBidW5kbGUgbGlzdC1oZWFkcyAiJHBlZWtfcmVwbyIgfHwKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCWVsc2UKKwkJZ2l0LXBlZWstcmVtb3RlICRleGVjICIkcGVla19yZXBvIiB8fAorCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJZmkKKwk7OworZXNhYyB8Citzb3J0IC10ICcJJyAtayAyIHwKK3doaWxlIHJlYWQgc2hhMSBwYXRoCitkbworCWNhc2UgIiRzaGExIiBpbgorCWZhaWxlZCkKKwkJZXhpdCAxIDs7CisJZXNhYworCWNhc2UgIiRwYXRoIiBpbgorCXJlZnMvaGVhZHMvKikKKwkJZ3JvdXA9aGVhZHMgOzsKKwlyZWZzL3RhZ3MvKikKKwkJZ3JvdXA9dGFncyA7OworCSopCisJCWdyb3VwPW90aGVyIDs7CisJZXNhYworCWNhc2UgIiwkaGVhZHMsJHRhZ3MsJG90aGVyLCIgaW4KKwkqLCRncm91cCwqKQorCQk7OworCSopCisJCWNvbnRpbnVlOzsKKwllc2FjCisJY2FzZSAiJCMiIGluCisJMCkKKwkJbWF0Y2g9eWVzIDs7CisJKikKKwkJbWF0Y2g9bm8KKwkJZm9yIHBhdAorCQlkbworCQkJY2FzZSAiLyRwYXRoIiBpbgorCQkJKi8kcGF0ICkKKwkJCQltYXRjaD15ZXMKKwkJCQlicmVhayA7OworCQkJZXNhYworCQlkb25lCisJZXNhYworCWNhc2UgIiRtYXRjaCIgaW4KKwlubykKKwkJY29udGludWUgOzsKKwllc2FjCisJZWNobyAiJHNoYTEJJHBhdGgiCitkb25lCmRpZmYgLS1naXQgYS9naXQtbWVyZ2Utb2N0b3B1cy5zaCBiL2dpdC1tZXJnZS1vY3RvcHVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViM2Y0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2Utb2N0b3B1cy5zaApAQCAtMCwwICsxLDExNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworIyBSZXNvbHZlIHR3byBvciBtb3JlIHRyZWVzLgorIworCitMRj0nCisnCisKK2RpZSAoKSB7CisgICAgZWNobyA+JjIgIiQqIgorICAgIGV4aXQgMQorfQorCisjIFRoZSBmaXJzdCBwYXJhbWV0ZXJzIHVwIHRvIC0tIGFyZSBtZXJnZSBiYXNlczsgdGhlIHJlc3QgYXJlIGhlYWRzLgorYmFzZXM9IGhlYWQ9IHJlbW90ZXM9IHNlcF9zZWVuPQorZm9yIGFyZworZG8KKwljYXNlICIsJHNlcF9zZWVuLCRoZWFkLCRhcmcsIiBpbgorCSosLS0sKQorCQlzZXBfc2Vlbj15ZXMKKwkJOzsKKwkseWVzLCwqKQorCQloZWFkPSRhcmcKKwkJOzsKKwkseWVzLCopCisJCXJlbW90ZXM9IiRyZW1vdGVzJGFyZyAiCisJCTs7CisJKikKKwkJYmFzZXM9IiRiYXNlcyRhcmcgIgorCQk7OworCWVzYWMKK2RvbmUKKworIyBSZWplY3QgaWYgdGhpcyBpcyBub3QgYW4gT2N0b3B1cyAtLSByZXNvbHZlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCitjYXNlICIkcmVtb3RlcyIgaW4KKz8qJyAnPyopCisJOzsKKyopCisJZXhpdCAyIDs7Citlc2FjCisKKyMgTVJDIGlzIHRoZSBjdXJyZW50ICJtZXJnZSByZWZlcmVuY2UgY29tbWl0IgorIyBNUlQgaXMgdGhlIGN1cnJlbnQgIm1lcmdlIHJlc3VsdCB0cmVlIgorCitNUkM9JGhlYWQgTVNHPSBQQVJFTlQ9Ii1wICRoZWFkIgorTVJUPSQoZ2l0LXdyaXRlLXRyZWUpCitDTlQ9MSA7IyBjb3VudGluZyBvdXIgaGVhZAorTk9OX0ZGX01FUkdFPTAKK09DVE9QVVNfRkFJTFVSRT0wCitmb3IgU0hBMSBpbiAkcmVtb3RlcworZG8KKwljYXNlICIkT0NUT1BVU19GQUlMVVJFIiBpbgorCTEpCisJCSMgV2UgYWxsb3cgb25seSBsYXN0IG9uZSB0byBoYXZlIGEgaGFuZC1yZXNvbHZhYmxlCisJCSMgY29uZmxpY3RzLiAgTGFzdCByb3VuZCBmYWlsZWQgYW5kIHdlIHN0aWxsIGhhZAorCQkjIGEgaGVhZCB0byBtZXJnZS4KKwkJZWNobyAiQXV0b21hdGVkIG1lcmdlIGRpZCBub3Qgd29yay4iCisJCWVjaG8gIlNob3VsZCBub3QgYmUgZG9pbmcgYW4gT2N0b3B1cy4iCisJCWV4aXQgMgorCWVzYWMKKworCWNvbW1vbj0kKGdpdC1tZXJnZS1iYXNlIC0tYWxsICRNUkMgJFNIQTEpIHx8CisJCWRpZSAiVW5hYmxlIHRvIGZpbmQgY29tbW9uIGNvbW1pdCB3aXRoICRTSEExIgorCisJY2FzZSAiJExGJGNvbW1vbiRMRiIgaW4KKwkqIiRMRiRTSEExJExGIiopCisJCWVjaG8gIkFscmVhZHkgdXAtdG8tZGF0ZSB3aXRoICRTSEExIgorCQljb250aW51ZQorCQk7OworCWVzYWMKKworCUNOVD1gZXhwciAkQ05UICsgMWAKKwlQQVJFTlQ9IiRQQVJFTlQgLXAgJFNIQTEiCisKKwlpZiB0ZXN0ICIkY29tbW9uLCROT05fRkZfTUVSR0UiID0gIiRNUkMsMCIKKwl0aGVuCisJCSMgVGhlIGZpcnN0IGhlYWQgYmVpbmcgbWVyZ2VkIHdhcyBhIGZhc3QtZm9yd2FyZC4KKwkJIyBBZHZhbmNlIE1SQyB0byB0aGUgaGVhZCBiZWluZyBtZXJnZWQsIGFuZCB1c2UgdGhhdAorCQkjIHRyZWUgYXMgdGhlIGludGVybWVkaWF0ZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCQkjIFdlIHN0aWxsIG5lZWQgdG8gY291bnQgdGhpcyBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQgc2V0LgorCisJCWVjaG8gIkZhc3QgZm9yd2FyZGluZyB0bzogJFNIQTEiCisJCWdpdC1yZWFkLXRyZWUgLXUgLW0gJGhlYWQgJFNIQTEgfHwgZXhpdAorCQlNUkM9JFNIQTEgTVJUPSQoZ2l0LXdyaXRlLXRyZWUpCisJCWNvbnRpbnVlCisJZmkKKworCU5PTl9GRl9NRVJHRT0xCisKKwllY2hvICJUcnlpbmcgc2ltcGxlIG1lcmdlIHdpdGggJFNIQTEiCisJZ2l0LXJlYWQtdHJlZSAtdSAtbSAtLWFnZ3Jlc3NpdmUgICRjb21tb24gJE1SVCAkU0hBMSB8fCBleGl0IDIKKwluZXh0PSQoZ2l0LXdyaXRlLXRyZWUgMj4vZGV2L251bGwpCisJaWYgdGVzdCAkPyAtbmUgMAorCXRoZW4KKwkJZWNobyAiU2ltcGxlIG1lcmdlIGRpZCBub3Qgd29yaywgdHJ5aW5nIGF1dG9tYXRpYyBtZXJnZS4iCisJCWdpdC1tZXJnZS1pbmRleCAtbyBnaXQtbWVyZ2Utb25lLWZpbGUgLWEgfHwKKwkJT0NUT1BVU19GQUlMVVJFPTEKKwkJbmV4dD0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKQorCWZpCisKKwkjIFdlIGhhdmUgbWVyZ2VkIHRoZSBvdGhlciBicmFuY2ggc3VjY2Vzc2Z1bGx5LiAgSWRlYWxseQorCSMgd2UgY291bGQgaW1wbGVtZW50IE9SJ2VkIGhlYWRzIGluIG1lcmdlLWJhc2UsIGFuZCBrZWVwCisJIyBhIGxpc3Qgb2YgY29tbWl0cyB3ZSBoYXZlIG1lcmdlZCBzbyBmYXIgaW4gTVJDIHRvIGZlZWQKKwkjIHRoZW0gdG8gbWVyZ2UtYmFzZSwgYnV0IHdlIGFwcHJveGltYXRlIGl0IGJ5IGtlZXAgdXNpbmcKKwkjIHRoZSBjdXJyZW50IE1SQy4gIFdlIHVzZWQgdG8gdXBkYXRlIGl0IHRvICRjb21tb24sIHdoaWNoCisJIyB3YXMgaW5jb3JyZWN0bHkgZG9pbmcgQU5EJ2VkIG1lcmdlLWJhc2UgaGVyZSwgd2hpY2ggd2FzCisJIyB1bm5lZWRlZC4KKworCU1SVD0kbmV4dAorZG9uZQorCitleGl0ICIkT0NUT1BVU19GQUlMVVJFIgpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLW9uZS1maWxlLnNoIGIvZ2l0LW1lcmdlLW9uZS1maWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkNjJkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2Utb25lLWZpbGUuc2gKQEAgLTAsMCArMSwxMzQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisjCisjIFRoaXMgaXMgdGhlIGdpdCBwZXItZmlsZSBtZXJnZSBzY3JpcHQsIGNhbGxlZCB3aXRoCisjCisjICAgJDEgLSBvcmlnaW5hbCBmaWxlIFNIQTEgKG9yIGVtcHR5KQorIyAgICQyIC0gZmlsZSBpbiBicmFuY2gxIFNIQTEgKG9yIGVtcHR5KQorIyAgICQzIC0gZmlsZSBpbiBicmFuY2gyIFNIQTEgKG9yIGVtcHR5KQorIyAgICQ0IC0gcGF0aG5hbWUgaW4gcmVwb3NpdG9yeQorIyAgICQ1IC0gb3JpZ2luYWwgZmlsZSBtb2RlIChvciBlbXB0eSkKKyMgICAkNiAtIGZpbGUgaW4gYnJhbmNoMSBtb2RlIChvciBlbXB0eSkKKyMgICAkNyAtIGZpbGUgaW4gYnJhbmNoMiBtb2RlIChvciBlbXB0eSkKKyMKKyMgSGFuZGxlIHNvbWUgdHJpdmlhbCBjYXNlcy4uIFRoZSBfcmVhbGx5XyB0cml2aWFsIGNhc2VzIGhhdmUKKyMgYmVlbiBoYW5kbGVkIGFscmVhZHkgYnkgZ2l0LXJlYWQtdHJlZSwgYnV0IHRoYXQgb25lIGRvZXNuJ3QKKyMgZG8gYW55IG1lcmdlcyB0aGF0IG1pZ2h0IGNoYW5nZSB0aGUgdHJlZSBsYXlvdXQuCisKK2Nhc2UgIiR7MTotLn0kezI6LS59JHszOi0ufSIgaW4KKyMKKyMgRGVsZXRlZCBpbiBib3RoIG9yIGRlbGV0ZWQgaW4gb25lIGFuZCB1bmNoYW5nZWQgaW4gdGhlIG90aGVyCisjCisiJDEuLiIgfCAiJDEuJDEiIHwgIiQxJDEuIikKKwlpZiBbICIkMiIgXTsgdGhlbgorCQllY2hvICJSZW1vdmluZyAkNCIKKwllbHNlCisJCSMgcmVhZC10cmVlIGNoZWNrZWQgdGhhdCBpbmRleCBtYXRjaGVzIEhFQUQgYWxyZWFkeSwKKwkJIyBzbyB3ZSBrbm93IHdlIGRvIG5vdCBoYXZlIHRoaXMgcGF0aCB0cmFja2VkLgorCQkjIHRoZXJlIG1heSBiZSBhbiB1bnJlbGF0ZWQgd29ya2luZyB0cmVlIGZpbGUgaGVyZSwKKwkJIyB3aGljaCB3ZSBzaG91bGQganVzdCBsZWF2ZSB1bm1vbGVzdGVkLgorCQlleGl0IDAKKwlmaQorCWlmIHRlc3QgLWYgIiQ0IjsgdGhlbgorCQlybSAtZiAtLSAiJDQiICYmCisJCXJtZGlyIC1wICIkKGV4cHIgInokNCIgOiAnelwoLipcKS8nKSIgMj4vZGV2L251bGwgfHwgOgorCWZpICYmCisJCWV4ZWMgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBvbmUuCisjCisiLiQyLiIpCisJIyB0aGUgb3RoZXIgc2lkZSBkaWQgbm90IGFkZCBhbmQgd2UgYWRkZWQgc28gdGhlcmUgaXMgbm90aGluZworCSMgdG8gYmUgZG9uZS4KKwk7OworIi4uJDMiKQorCWVjaG8gIkFkZGluZyAkNCIKKwl0ZXN0IC1mICIkNCIgfHwgeworCQllY2hvICJFUlJPUjogdW50cmFja2VkICQ0IGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBtZXJnZS4iCisJCWV4aXQgMQorCX0KKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tY2FjaGVpbmZvICIkNiQ3IiAiJDIkMyIgIiQ0IiAmJgorCQlleGVjIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBib3RoLCBpZGVudGljYWxseSAoY2hlY2sgZm9yIHNhbWUgcGVybWlzc2lvbnMpLgorIworIi4kMyQyIikKKwlpZiBbICIkNiIgIT0gIiQ3IiBdOyB0aGVuCisJCWVjaG8gIkVSUk9SOiBGaWxlICQ0IGFkZGVkIGlkZW50aWNhbGx5IGluIGJvdGggYnJhbmNoZXMsIgorCQllY2hvICJFUlJPUjogYnV0IHBlcm1pc3Npb25zIGNvbmZsaWN0ICQ2LT4kNy4iCisJCWV4aXQgMQorCWZpCisJZWNobyAiQWRkaW5nICQ0IgorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1jYWNoZWluZm8gIiQ2IiAiJDIiICIkNCIgJiYKKwkJZXhlYyBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLS0gIiQ0IgorCTs7CisKKyMKKyMgTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LgorIworIiQxJDIkMyIgfCAiLiQyJDMiKQorCisJY2FzZSAiLCQ2LCQ3LCIgaW4KKwkqLDEyMDAwMCwqKQorCQllY2hvICJFUlJPUjogJDQ6IE5vdCBtZXJnaW5nIHN5bWJvbGljIGxpbmsgY2hhbmdlcy4iCisJCWV4aXQgMQorCQk7OworCWVzYWMKKworCXNyYzI9YGdpdC11bnBhY2stZmlsZSAkM2AKKwljYXNlICIkMSIgaW4KKwknJykKKwkJZWNobyAiQWRkZWQgJDQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LiIKKwkJIyBUaGlzIGV4dHJhY3RzIE9VUiBmaWxlIGluICRvcmlnLCBhbmQgdXNlcyBnaXQtYXBwbHkgdG8KKwkJIyByZW1vdmUgbGluZXMgdGhhdCBhcmUgdW5pcXVlIHRvIG91cnMuCisJCW9yaWc9YGdpdC11bnBhY2stZmlsZSAkMmAKKwkJc3owPWB3YyAtYyA8IiRvcmlnImAKKwkJZGlmZiAtdSAtTGEvJG9yaWcgLUxiLyRvcmlnICRvcmlnICRzcmMyIHwgZ2l0LWFwcGx5IC0tbm8tYWRkIAorCQlzejE9YHdjIC1jIDwiJG9yaWciYAorCisJCSMgSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGNvbW1vbiBtYXRlcmlhbCwgaXQgaXMgbm90CisJCSMgd29ydGggdHJ5aW5nIHR3by1maWxlIG1lcmdlIHVzaW5nIGNvbW1vbiBzdWJzZWN0aW9ucy4KKwkJZXhwciAiJHN6MCIgXDwgIiRzejEiIFwqIDIgPi9kZXYvbnVsbCB8fCA6ID4kb3JpZworCQk7OworCSopCisJCWVjaG8gIkF1dG8tbWVyZ2luZyAkNCIKKwkJb3JpZz1gZ2l0LXVucGFjay1maWxlICQxYAorCQk7OworCWVzYWMKKworCSMgQmUgY2FyZWZ1bCBmb3IgZnVubnkgZmlsZW5hbWUgc3VjaCBhcyAiLUwiIGluICIkNCIsIHdoaWNoCisJIyB3b3VsZCBjb25mdXNlICJtZXJnZSIgZ3JlYXRseS4KKwlzcmMxPWBnaXQtdW5wYWNrLWZpbGUgJDJgCisJZ2l0LW1lcmdlLWZpbGUgIiRzcmMxIiAiJG9yaWciICIkc3JjMiIKKwlyZXQ9JD8KKworCSMgQ3JlYXRlIHRoZSB3b3JraW5nIHRyZWUgZmlsZSwgdXNpbmcgIm91ciB0cmVlIiB2ZXJzaW9uIGZyb20gdGhlCisJIyBpbmRleCwgYW5kIHRoZW4gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tc3RhZ2U9MiAtLSAiJDQiICYmIGNhdCAiJHNyYzEiID4iJDQiCisJcm0gLWYgLS0gIiRvcmlnIiAiJHNyYzEiICIkc3JjMiIKKworCWlmIFsgIiQ2IiAhPSAiJDciIF07IHRoZW4KKwkJZWNobyAiRVJST1I6IFBlcm1pc3Npb25zIGNvbmZsaWN0OiAkNS0+JDYsJDcuIgorCQlyZXQ9MQorCWZpCisJaWYgWyAiJDEiID0gJycgXTsgdGhlbgorCQlyZXQ9MQorCWZpCisKKwlpZiBbICRyZXQgLW5lIDAgXTsgdGhlbgorCQllY2hvICJFUlJPUjogTWVyZ2UgY29uZmxpY3QgaW4gJDQiCisJCWV4aXQgMQorCWZpCisJZXhlYyBnaXQtdXBkYXRlLWluZGV4IC0tICIkNCIKKwk7OworCisqKQorCWVjaG8gIkVSUk9SOiAkNDogTm90IGhhbmRsaW5nIGNhc2UgJDEgLT4gJDIgLT4gJDMiCisJOzsKK2VzYWMKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLW91cnMuc2ggYi9naXQtbWVyZ2Utb3Vycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjZhNWMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW91cnMuc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworIyBQcmV0ZW5kIHdlIHJlc29sdmVkIHRoZSBoZWFkcywgYnV0IGRlY2xhcmUgb3VyIHRyZWUgdHJ1bXBzIGV2ZXJ5Ym9keSBlbHNlLgorIworCisjIFdlIG5lZWQgdG8gZXhpdCB3aXRoIDIgaWYgdGhlIGluZGV4IGRvZXMgbm90IG1hdGNoIG91ciBIRUFEIHRyZWUsCisjIGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaXMgd2hhdCB3ZSB3aWxsIGJlIGNvbW1pdHRpbmcgYXMgdGhlCisjIG1lcmdlIHJlc3VsdC4KKworZ2l0LWRpZmYtaW5kZXggLS1xdWlldCAtLWNhY2hlZCBIRUFEIHx8IGV4aXQgMgorCitleGl0IDAKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1yZXNvbHZlLnNoIGIvZ2l0LW1lcmdlLXJlc29sdmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVlMWRlNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1yZXNvbHZlLnNoCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisjIFJlc29sdmUgdHdvIHRyZWVzLCB1c2luZyBlbmhhbmNlZCBtdWx0aS1iYXNlIHJlYWQtdHJlZS4KKworIyBUaGUgZmlyc3QgcGFyYW1ldGVycyB1cCB0byAtLSBhcmUgbWVyZ2UgYmFzZXM7IHRoZSByZXN0IGFyZSBoZWFkcy4KK2Jhc2VzPSBoZWFkPSByZW1vdGVzPSBzZXBfc2Vlbj0KK2ZvciBhcmcKK2RvCisJY2FzZSAiLCRzZXBfc2VlbiwkaGVhZCwkYXJnLCIgaW4KKwkqLC0tLCkKKwkJc2VwX3NlZW49eWVzCisJCTs7CisJLHllcywsKikKKwkJaGVhZD0kYXJnCisJCTs7CisJLHllcywqKQorCQlyZW1vdGVzPSIkcmVtb3RlcyRhcmcgIgorCQk7OworCSopCisJCWJhc2VzPSIkYmFzZXMkYXJnICIKKwkJOzsKKwllc2FjCitkb25lCisKKyMgR2l2ZSB1cCBpZiB3ZSBhcmUgZ2l2ZW4gbW9yZSB0aGFuIHR3byByZW1vdGVzIC0tIG5vdCBoYW5kbGluZyBvY3RvcHVzLgorY2FzZSAiJHJlbW90ZXMiIGluCis/KicgJz8qKQorCWV4aXQgMiA7OworZXNhYworCisjIEdpdmUgdXAgaWYgdGhpcyBpcyBhIGJhc2VsZXNzIG1lcmdlLgoraWYgdGVzdCAnJyA9ICIkYmFzZXMiCit0aGVuCisJZXhpdCAyCitmaQorCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0LXJlYWQtdHJlZSAtdSAtbSAtLWFnZ3Jlc3NpdmUgJGJhc2VzICRoZWFkICRyZW1vdGVzIHx8IGV4aXQgMgorZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZS4iCitpZiByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlICAyPi9kZXYvbnVsbCkKK3RoZW4KKwlleGl0IDAKK2Vsc2UKKwllY2hvICJTaW1wbGUgbWVyZ2UgZmFpbGVkLCB0cnlpbmcgQXV0b21hdGljIG1lcmdlLiIKKwlpZiBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJdGhlbgorCQlleGl0IDAKKwllbHNlCisJCWV4aXQgMQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLXN0dXBpZC5zaCBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGZhZWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworIyBSZXNvbHZlIHR3byB0cmVlcywgJ3N0dXBpZCBtZXJnZScuCisKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzOyB0aGUgcmVzdCBhcmUgaGVhZHMuCitiYXNlcz0gaGVhZD0gcmVtb3Rlcz0gc2VwX3NlZW49Citmb3IgYXJnCitkbworCWNhc2UgIiwkc2VwX3NlZW4sJGhlYWQsJGFyZywiIGluCisJKiwtLSwpCisJCXNlcF9zZWVuPXllcworCQk7OworCSx5ZXMsLCopCisJCWhlYWQ9JGFyZworCQk7OworCSx5ZXMsKikKKwkJcmVtb3Rlcz0iJHJlbW90ZXMkYXJnICIKKwkJOzsKKwkqKQorCQliYXNlcz0iJGJhc2VzJGFyZyAiCisJCTs7CisJZXNhYworZG9uZQorCisjIEdpdmUgdXAgaWYgd2UgYXJlIGdpdmVuIG1vcmUgdGhhbiB0d28gcmVtb3RlcyAtLSBub3QgaGFuZGxpbmcgb2N0b3B1cy4KK2Nhc2UgIiRyZW1vdGVzIiBpbgorPyonICc/KikKKwlleGl0IDIgOzsKK2VzYWMKKworIyBGaW5kIGFuIG9wdGltdW0gbWVyZ2UgYmFzZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjYW5kaWRhdGVzLgorY2FzZSAiJGJhc2VzIiBpbgorPyonICc/KikKKwllY2hvICJUcnlpbmcgdG8gZmluZCB0aGUgb3B0aW11bSBtZXJnZSBiYXNlLiIKKwlHPS50bXAtaW5kZXgkJAorCWJlc3Q9CisJYmVzdF9jbnQ9LTEKKwlmb3IgYyBpbiAkYmFzZXMKKwlkbworCQlybSAtZiAkRworCQlHSVRfSU5ERVhfRklMRT0kRyBnaXQtcmVhZC10cmVlIC1tICRjICRoZWFkICRyZW1vdGVzIFwKKwkJCSAyPi9kZXYvbnVsbCB8fAljb250aW51ZQorCQkjIENvdW50IHRoZSBwYXRocyB0aGF0IGFyZSB1bm1lcmdlZC4KKwkJY250PWBHSVRfSU5ERVhfRklMRT0kRyBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZCB8IHdjIC1sYAorCQlpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkJdGhlbgorCQkJYmVzdD0kYworCQkJYmVzdF9jbnQ9JGNudAorCQkJaWYgdGVzdCAiJGJlc3RfY250IiAtZXEgMAorCQkJdGhlbgorCQkJCSMgQ2Fubm90IGRvIGFueSBiZXR0ZXIgdGhhbiBhbGwgdHJpdmlhbCBtZXJnZS4KKwkJCQlicmVhaworCQkJZmkKKwkJZmkKKwlkb25lCisJcm0gLWYgJEcKKwljb21tb249IiRiZXN0IgorCTs7CisqKQorCWNvbW1vbj0iJGJhc2VzIgorCTs7Citlc2FjCisKK2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCitnaXQtcmVhZC10cmVlIC11IC1tICRjb21tb24gJGhlYWQgJHJlbW90ZXMgfHwgZXhpdCAyCitlY2hvICJUcnlpbmcgc2ltcGxlIG1lcmdlLiIKK2lmIHJlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUgIDI+L2Rldi9udWxsKQordGhlbgorCWV4aXQgMAorZWxzZQorCWVjaG8gIlNpbXBsZSBtZXJnZSBmYWlsZWQsIHRyeWluZyBBdXRvbWF0aWMgbWVyZ2UuIgorCWlmIGdpdC1tZXJnZS1pbmRleCAtbyBnaXQtbWVyZ2Utb25lLWZpbGUgLWEKKwl0aGVuCisJCWV4aXQgMAorCWVsc2UKKwkJZXhpdCAxCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9naXQtbWVyZ2Uuc2ggYi9naXQtbWVyZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjJmOGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS5zaApAQCAtMCwwICsxLDQ5NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCitVU0FHRT0nWy1uXSBbLS1uby1jb21taXRdIFstLXNxdWFzaF0gWy1zIDxzdHJhdGVneT5dIFstbT08bWVyZ2UtbWVzc2FnZT5dIDxjb21taXQ+KycKKworU1VCRElSRUNUT1JZX09LPVllcworLiBnaXQtc2gtc2V0dXAKK3JlcXVpcmVfd29ya190cmVlCitjZF90b190b3BsZXZlbAorCit0ZXN0IC16ICIkKGdpdCBscy1maWxlcyAtdSkiIHx8CisJZGllICJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLiIKKworTEY9JworJworCithbGxfc3RyYXRlZ2llcz0ncmVjdXIgcmVjdXJzaXZlIG9jdG9wdXMgcmVzb2x2ZSBzdHVwaWQgb3VycyBzdWJ0cmVlJworZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXM9J3JlY3Vyc2l2ZScKK2RlZmF1bHRfb2N0b3B1c19zdHJhdGVnaWVzPSdvY3RvcHVzJworbm9fdHJpdmlhbF9tZXJnZV9zdHJhdGVnaWVzPSdvdXJzIHN1YnRyZWUnCit1c2Vfc3RyYXRlZ2llcz0KKworaW5kZXhfbWVyZ2U9dAorCitkcm9wc2F2ZSgpIHsKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgIiRHSVRfRElSL01FUkdFX01TRyIgXAorCQkgIiRHSVRfRElSL01FUkdFX1NBVkUiIHx8IGV4aXQgMQorfQorCitzYXZlc3RhdGUoKSB7CisJIyBTdGFzaCBhd2F5IGFueSBsb2NhbCBtb2RpZmljYXRpb25zLgorCWdpdC1kaWZmLWluZGV4IC16IC0tbmFtZS1vbmx5ICRoZWFkIHwKKwljcGlvIC0wIC1vID4iJEdJVF9ESVIvTUVSR0VfU0FWRSIKK30KKworcmVzdG9yZXN0YXRlKCkgeworICAgICAgICBpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9TQVZFIgorCXRoZW4KKwkJZ2l0IHJlc2V0IC0taGFyZCAkaGVhZCA+L2Rldi9udWxsCisJCWNwaW8gLWl1diA8IiRHSVRfRElSL01FUkdFX1NBVkUiCisJCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwKKwlmaQorfQorCitmaW5pc2hfdXBfdG9fZGF0ZSAoKSB7CisJY2FzZSAiJHNxdWFzaCIgaW4KKwl0KQorCQllY2hvICIkMSAobm90aGluZyB0byBzcXVhc2gpIiA7OworCScnKQorCQllY2hvICIkMSIgOzsKKwllc2FjCisJZHJvcHNhdmUKK30KKworc3F1YXNoX21lc3NhZ2UgKCkgeworCWVjaG8gU3F1YXNoZWQgY29tbWl0IG9mIHRoZSBmb2xsb3dpbmc6CisJZWNobworCWdpdC1sb2cgLS1uby1tZXJnZXMgXiIkaGVhZCIgJHJlbW90ZQorfQorCitmaW5pc2ggKCkgeworCWlmIHRlc3QgJycgPSAiJDIiCisJdGhlbgorCQlybG9nbT0iJEdJVF9SRUZMT0dfQUNUSU9OIgorCWVsc2UKKwkJZWNobyAiJDIiCisJCXJsb2dtPSIkR0lUX1JFRkxPR19BQ1RJT046ICQyIgorCWZpCisJY2FzZSAiJHNxdWFzaCIgaW4KKwl0KQorCQllY2hvICJTcXVhc2ggY29tbWl0IC0tIG5vdCB1cGRhdGluZyBIRUFEIgorCQlzcXVhc2hfbWVzc2FnZSA+IiRHSVRfRElSL1NRVUFTSF9NU0ciCisJCTs7CisJJycpCisJCWNhc2UgIiRtZXJnZV9tc2ciIGluCisJCScnKQorCQkJZWNobyAiTm8gbWVyZ2UgbWVzc2FnZSAtLSBub3QgdXBkYXRpbmcgSEVBRCIKKwkJCTs7CisJCSopCisJCQlnaXQtdXBkYXRlLXJlZiAtbSAiJHJsb2dtIiBIRUFEICIkMSIgIiRoZWFkIiB8fCBleGl0IDEKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwllc2FjCisJY2FzZSAiJDEiIGluCisJJycpCisJCTs7CisJPyopCisJCWNhc2UgIiRub19zdW1tYXJ5IiBpbgorCQknJykKKwkJCWdpdC1kaWZmLXRyZWUgLS1zdGF0IC0tc3VtbWFyeSAtTSAiJGhlYWQiICIkMSIKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwllc2FjCit9CisKK21lcmdlX25hbWUgKCkgeworCXJlbW90ZT0iJDEiCisJcmg9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmVtb3RlXjAiIDI+L2Rldi9udWxsKSB8fCByZXR1cm4KKwliaD0kKGdpdC1zaG93LXJlZiAtcyAtLXZlcmlmeSAicmVmcy9oZWFkcy8kcmVtb3RlIiAyPi9kZXYvbnVsbCkKKwlpZiB0ZXN0ICIkcmgiID0gIiRiaCIKKwl0aGVuCisJCWVjaG8gIiRyaAkJYnJhbmNoICckcmVtb3RlJyBvZiAuIgorCWVsaWYgdHJ1bmFtZT0kKGV4cHIgIiRyZW1vdGUiIDogJ1woLipcKX5bMS05XVswLTldKiQnKSAmJgorCQlnaXQtc2hvdy1yZWYgLXEgLS12ZXJpZnkgInJlZnMvaGVhZHMvJHRydW5hbWUiIDI+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICIkcmgJCWJyYW5jaCAnJHRydW5hbWUnIChlYXJseSBwYXJ0KSBvZiAuIgorCWVsaWYgdGVzdCAiJHJlbW90ZSIgPSAiRkVUQ0hfSEVBRCIgLWEgLXIgIiRHSVRfRElSL0ZFVENIX0hFQUQiCisJdGhlbgorCQlzZWQgLWUgJ3MvCW5vdC1mb3ItbWVyZ2UJLwkJLycgLWUgMXEgXAorCQkJIiRHSVRfRElSL0ZFVENIX0hFQUQiCisJZWxzZQorCQllY2hvICIkcmgJCWNvbW1pdCAnJHJlbW90ZSciCisJZmkKK30KKworY2FzZSAiJCMiIGluIDApIHVzYWdlIDs7IGVzYWMKKworaGF2ZV9tZXNzYWdlPQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1ufC0tbm98LS1uby18LS1uby1zfC0tbm8tc3V8LS1uby1zdW18LS1uby1zdW1tfFwKKwkJLS1uby1zdW1tYXwtLW5vLXN1bW1hcnwtLW5vLXN1bW1hcnkpCisJCW5vX3N1bW1hcnk9dCA7OworCS0tc3F8LS1zcXV8LS1zcXVhfC0tc3F1YXN8LS1zcXVhc2gpCisJCXNxdWFzaD10IG5vX2NvbW1pdD10IDs7CisJLS1uby1jfC0tbm8tY298LS1uby1jb218LS1uby1jb21tfC0tbm8tY29tbWl8LS1uby1jb21taXQpCisJCW5vX2NvbW1pdD10IDs7CisJLXM9KnwtLXM9KnwtLXN0PSp8LS1zdHI9KnwtLXN0cmE9KnwtLXN0cmF0PSp8LS1zdHJhdGU9KnxcCisJCS0tc3RyYXRlZz0qfC0tc3RyYXRlZ3k9KnxcCisJLXN8LS1zfC0tc3R8LS1zdHJ8LS1zdHJhfC0tc3RyYXR8LS1zdHJhdGV8LS1zdHJhdGVnfC0tc3RyYXRlZ3kpCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCXN0cmF0ZWd5PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCXN0cmF0ZWd5PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJY2FzZSAiICRhbGxfc3RyYXRlZ2llcyAiIGluCisJCSoiICRzdHJhdGVneSAiKikKKwkJCXVzZV9zdHJhdGVnaWVzPSIkdXNlX3N0cmF0ZWdpZXMkc3RyYXRlZ3kgIiA7OworCQkqKQorCQkJZGllICJhdmFpbGFibGUgc3RyYXRlZ2llcyBhcmU6ICRhbGxfc3RyYXRlZ2llcyIgOzsKKwkJZXNhYworCQk7OworCS1tPSp8LS1tPSp8LS1tZT0qfC0tbWVzPSp8LS1tZXNzPSp8LS1tZXNzYT0qfC0tbWVzc2FnPSp8LS1tZXNzYWdlPSopCisJCW1lcmdlX21zZz1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCWhhdmVfbWVzc2FnZT10CisJCTs7CisJLW18LS1tfC0tbWV8LS1tZXN8LS1tZXNzfC0tbWVzc2F8LS1tZXNzYWd8LS1tZXNzYWdlKQorCQlzaGlmdAorCQljYXNlICIkIyIgaW4KKwkJMSkJdXNhZ2UgOzsKKwkJZXNhYworCQltZXJnZV9tc2c9IiQxIgorCQloYXZlX21lc3NhZ2U9dAorCQk7OworCS0qKQl1c2FnZSA7OworCSopCWJyZWFrIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKKyMgVGhpcyBjb3VsZCBiZSB0cmFkaXRpb25hbCAibWVyZ2UgPG1zZz4gSEVBRCA8Y29tbWl0Pi4uLiIgIGFuZCB0aGUKKyMgd2F5IHdlIGNhbiB0ZWxsIGl0IGlzIHRvIHNlZSBpZiB0aGUgc2Vjb25kIHRva2VuIGlzIEhFQUQsIGJ1dCBzb21lCisjIHBlb3BsZSBtaWdodCBoYXZlIG1pc3VzZWQgdGhlIGludGVyZmFjZSBhbmQgdXNlZCBhIGNvbW1pdHRpc2ggdGhhdAorIyBpcyB0aGUgc2FtZSBhcyBIRUFEIHRoZXJlIGluc3RlYWQuICBUcmFkaXRpb25hbCBmb3JtYXQgbmV2ZXIgd291bGQKKyMgaGF2ZSAiLW0iIHNvIGl0IGlzIGFuIGFkZGl0aW9uYWwgc2FmZXR5IG1lYXN1cmUgdG8gY2hlY2sgZm9yIGl0LgorCitpZiB0ZXN0IC16ICIkaGF2ZV9tZXNzYWdlIiAmJgorCXNlY29uZF90b2tlbj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQyXjAiIDI+L2Rldi9udWxsKSAmJgorCWhlYWRfY29tbWl0PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiSEVBRCIgMj4vZGV2L251bGwpICYmCisJdGVzdCAiJHNlY29uZF90b2tlbiIgPSAiJGhlYWRfY29tbWl0IgordGhlbgorCW1lcmdlX21zZz0iJDEiCisJc2hpZnQKKwloZWFkX2FyZz0iJDEiCisJc2hpZnQKK2VsaWYgISBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisJIyBJZiB0aGUgbWVyZ2VkIGhlYWQgaXMgYSB2YWxpZCBvbmUgdGhlcmUgaXMgbm8gcmVhc29uIHRvCisJIyBmb3JiaWQgImdpdCBtZXJnZSIgaW50byBhIGJyYW5jaCB5ZXQgdG8gYmUgYm9ybi4gIFdlIGRvCisJIyB0aGUgc2FtZSBmb3IgImdpdCBwdWxsIi4KKwlpZiB0ZXN0IDEgLW5lICQjCisJdGhlbgorCQllY2hvID4mMiAiQ2FuIG1lcmdlIG9ubHkgZXhhY3RseSBvbmUgY29tbWl0IGludG8gZW1wdHkgaGVhZCIKKwkJZXhpdCAxCisJZmkKKworCXJoPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJDFeMCIpIHx8CisJCWRpZSAiJDEgLSBub3Qgc29tZXRoaW5nIHdlIGNhbiBtZXJnZSIKKworCWdpdC11cGRhdGUtcmVmIC1tICJpbml0aWFsIHB1bGwiIEhFQUQgIiRyaCIgIiIgJiYKKwlnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRAorCWV4aXQKKworZWxzZQorCSMgV2UgYXJlIGludm9rZWQgZGlyZWN0bHkgYXMgdGhlIGZpcnN0LWNsYXNzIFVJLgorCWhlYWRfYXJnPUhFQUQKKworCSMgQWxsIHRoZSByZXN0IGFyZSB0aGUgY29tbWl0cyBiZWluZyBtZXJnZWQ7IHByZXBhcmUKKwkjIHRoZSBzdGFuZGFyZCBtZXJnZSBzdW1tYXJ5IG1lc3NhZ2UgdG8gYmUgYXBwZW5kZWQgdG8KKwkjIHRoZSBnaXZlbiBtZXNzYWdlLiAgSWYgcmVtb3RlIGlzIGludmFsaWQgd2Ugd2lsbCBkaWUKKwkjIGxhdGVyIGluIHRoZSBjb21tb24gY29kZXBhdGggc28gd2UgZGlzY2FyZCB0aGUgZXJyb3IKKwkjIGluIHRoaXMgbG9vcC4KKwltZXJnZV9uYW1lPSQoZm9yIHJlbW90ZQorCQlkbworCQkJbWVyZ2VfbmFtZSAiJHJlbW90ZSIKKwkJZG9uZSB8IGdpdC1mbXQtbWVyZ2UtbXNnCisJKQorCW1lcmdlX21zZz0iJHttZXJnZV9tc2c6KyRtZXJnZV9tc2ckTEYkTEZ9JG1lcmdlX25hbWUiCitmaQoraGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRoZWFkX2FyZyJeMCkgfHwgdXNhZ2UKKworIyBBbGwgdGhlIHJlc3QgYXJlIHJlbW90ZSBoZWFkcwordGVzdCAiJCMiID0gMCAmJiB1c2FnZSA7IyB3ZSBuZWVkIGF0IGxlYXN0IG9uZSByZW1vdGUgaGVhZC4KK3NldF9yZWZsb2dfYWN0aW9uICJtZXJnZSAkKiIKKworcmVtb3RlaGVhZHM9Citmb3IgcmVtb3RlCitkbworCXJlbW90ZWhlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmVtb3RlIl4wIDI+L2Rldi9udWxsKSB8fAorCSAgICBkaWUgIiRyZW1vdGUgLSBub3Qgc29tZXRoaW5nIHdlIGNhbiBtZXJnZSIKKwlyZW1vdGVoZWFkcz0iJHtyZW1vdGVoZWFkc30kcmVtb3RlaGVhZCAiCisJZXZhbCBHSVRIRUFEXyRyZW1vdGVoZWFkPSciJHJlbW90ZSInCisJZXhwb3J0IEdJVEhFQURfJHJlbW90ZWhlYWQKK2RvbmUKK3NldCB4ICRyZW1vdGVoZWFkcyA7IHNoaWZ0CisKK2Nhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKycnKQorCWNhc2UgIiQjIiBpbgorCTEpCisJCXZhcj0iYGdpdC1jb25maWcgLS1nZXQgcHVsbC50d29oZWFkYCIKKwkJaWYgdGVzdCAtbiAiJHZhciIKKwkJdGhlbgorCQkJdXNlX3N0cmF0ZWdpZXM9IiR2YXIiCisJCWVsc2UKKwkJCXVzZV9zdHJhdGVnaWVzPSIkZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXMiCisJCWZpIDs7CisJKikKKwkJdmFyPSJgZ2l0LWNvbmZpZyAtLWdldCBwdWxsLm9jdG9wdXNgIgorCQlpZiB0ZXN0IC1uICIkdmFyIgorCQl0aGVuCisJCQl1c2Vfc3RyYXRlZ2llcz0iJHZhciIKKwkJZWxzZQorCQkJdXNlX3N0cmF0ZWdpZXM9IiRkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcyIKKwkJZmkgOzsKKwllc2FjCisJOzsKK2VzYWMKKworZm9yIHMgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworCWZvciBudCBpbiAkbm9fdHJpdmlhbF9tZXJnZV9zdHJhdGVnaWVzCisJZG8KKwkJY2FzZSAiICRzICIgaW4KKwkJKiIgJG50ICIqKQorCQkJaW5kZXhfbWVyZ2U9ZgorCQkJYnJlYWsKKwkJCTs7CisJCWVzYWMKKwlkb25lCitkb25lCisKK2Nhc2UgIiQjIiBpbgorMSkKKwljb21tb249JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCAkaGVhZCAiJEAiKQorCTs7CisqKQorCWNvbW1vbj0kKGdpdC1zaG93LWJyYW5jaCAtLW1lcmdlLWJhc2UgJGhlYWQgIiRAIikKKwk7OworZXNhYworZWNobyAiJGhlYWQiID4iJEdJVF9ESVIvT1JJR19IRUFEIgorCitjYXNlICIkaW5kZXhfbWVyZ2UsJCMsJGNvbW1vbiwkbm9fY29tbWl0IiBpbgorZiwqKQorCSMgV2UndmUgYmVlbiB0b2xkIG5vdCB0byB0cnkgYW55dGhpbmcgY2xldmVyLiAgU2tpcCB0byByZWFsIG1lcmdlLgorCTs7Cis/LCosJycsKikKKwkjIE5vIGNvbW1vbiBhbmNlc3RvcnMgZm91bmQuIFdlIG5lZWQgYSByZWFsIG1lcmdlLgorCTs7Cis/LDEsIiQxIiwqKQorCSMgSWYgaGVhZCBjYW4gcmVhY2ggYWxsIHRoZSBtZXJnZSB0aGVuIHdlIGFyZSB1cCB0byBkYXRlLgorCSMgYnV0IGZpcnN0IHRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIG1lcmdpbmcgb25lIHJlbW90ZS4KKwlmaW5pc2hfdXBfdG9fZGF0ZSAiQWxyZWFkeSB1cC10by1kYXRlLiIKKwlleGl0IDAKKwk7OworPywxLCIkaGVhZCIsKikKKwkjIEFnYWluIHRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIG1lcmdpbmcgb25lIHJlbW90ZS4KKwllY2hvICJVcGRhdGluZyAkKGdpdC1yZXYtcGFyc2UgLS1zaG9ydCAkaGVhZCkuLiQoZ2l0LXJldi1wYXJzZSAtLXNob3J0ICQxKSIKKwlnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorCW1zZz0iRmFzdCBmb3J3YXJkIgorCWlmIHRlc3QgLW4gIiRoYXZlX21lc3NhZ2UiCisJdGhlbgorCQltc2c9IiRtc2cgKG5vIGNvbW1pdCBjcmVhdGVkOyAtbSBvcHRpb24gaWdub3JlZCkiCisJZmkKKwluZXdfaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxXjAiKSAmJgorCWdpdC1yZWFkLXRyZWUgLXYgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSAkaGVhZCAiJG5ld19oZWFkIiAmJgorCWZpbmlzaCAiJG5ld19oZWFkIiAiJG1zZyIgfHwgZXhpdAorCWRyb3BzYXZlCisJZXhpdCAwCisJOzsKKz8sMSw/KiIkTEYiPyosKikKKwkjIFdlIGFyZSBub3QgZG9pbmcgb2N0b3B1cyBhbmQgbm90IGZhc3QgZm9yd2FyZC4gIE5lZWQgYQorCSMgcmVhbCBtZXJnZS4KKwk7OworPywxLCosKQorCSMgV2UgYXJlIG5vdCBkb2luZyBvY3RvcHVzLCBub3QgZmFzdCBmb3J3YXJkLCBhbmQgaGF2ZSBvbmx5CisJIyBvbmUgY29tbW9uLgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCisJY2FzZSAiICR1c2Vfc3RyYXRlZ2llcyAiIGluCisJKicgcmVjdXJzaXZlICcqfConIHJlY3VyICcqKQorCQk6IHJ1biBtZXJnZSBsYXRlcgorCQk7OworCSopCisJCSMgU2VlIGlmIGl0IGlzIHJlYWxseSB0cml2aWFsLgorCQlnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisJCWVjaG8gIlRyeWluZyByZWFsbHkgdHJpdmlhbCBpbi1pbmRleCBtZXJnZS4uLiIKKwkJaWYgZ2l0LXJlYWQtdHJlZSAtLXRyaXZpYWwgLW0gLXUgLXYgJGNvbW1vbiAkaGVhZCAiJDEiICYmCisJCSAgIHJlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUpCisJCXRoZW4KKwkJCWVjaG8gIldvbmRlcmZ1bC4iCisJCQlyZXN1bHRfY29tbWl0PSQoCisJCQkJcHJpbnRmICclc1xuJyAiJG1lcmdlX21zZyIgfAorCQkJCWdpdC1jb21taXQtdHJlZSAkcmVzdWx0X3RyZWUgLXAgSEVBRCAtcCAiJDEiCisJCQkpIHx8IGV4aXQKKwkJCWZpbmlzaCAiJHJlc3VsdF9jb21taXQiICJJbi1pbmRleCBtZXJnZSIKKwkJCWRyb3BzYXZlCisJCQlleGl0IDAKKwkJZmkKKwkJZWNobyAiTm9wZS4iCisJZXNhYworCTs7CisqKQorCSMgQW4gb2N0b3B1cy4gIElmIHdlIGNhbiByZWFjaCBhbGwgdGhlIHJlbW90ZSB3ZSBhcmUgdXAgdG8gZGF0ZS4KKwl1cF90b19kYXRlPXQKKwlmb3IgcmVtb3RlCisJZG8KKwkJY29tbW9uX29uZT0kKGdpdC1tZXJnZS1iYXNlIC0tYWxsICRoZWFkICRyZW1vdGUpCisJCWlmIHRlc3QgIiRjb21tb25fb25lIiAhPSAiJHJlbW90ZSIKKwkJdGhlbgorCQkJdXBfdG9fZGF0ZT1mCisJCQlicmVhaworCQlmaQorCWRvbmUKKwlpZiB0ZXN0ICIkdXBfdG9fZGF0ZSIgPSB0CisJdGhlbgorCQlmaW5pc2hfdXBfdG9fZGF0ZSAiQWxyZWFkeSB1cC10by1kYXRlLiBZZWVhaCEiCisJCWV4aXQgMAorCWZpCisJOzsKK2VzYWMKKworIyBXZSBhcmUgZ29pbmcgdG8gbWFrZSBhIG5ldyBjb21taXQuCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKKyMgQXQgdGhpcyBwb2ludCwgd2UgbmVlZCBhIHJlYWwgbWVyZ2UuICBObyBtYXR0ZXIgd2hhdCBzdHJhdGVneQorIyB3ZSB1c2UsIGl0IHdvdWxkIG9wZXJhdGUgb24gdGhlIGluZGV4LCBwb3NzaWJseSBhZmZlY3RpbmcgdGhlCisjIHdvcmtpbmcgdHJlZSwgYW5kIHdoZW4gcmVzb2x2ZWQgY2xlYW5seSwgaGF2ZSB0aGUgZGVzaXJlZCB0cmVlCisjIGluIHRoZSBpbmRleCAtLSB0aGlzIG1lYW5zIHRoYXQgdGhlIGluZGV4IG11c3QgYmUgaW4gc3luYyB3aXRoCisjIHRoZSAkaGVhZCBjb21taXQuICBUaGUgc3RyYXRlZ2llcyBhcmUgcmVzcG9uc2libGUgdG8gZW5zdXJlIHRoaXMuCisKK2Nhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKz8qJyAnPyopCisgICAgIyBTdGFzaCBhd2F5IHRoZSBsb2NhbCBjaGFuZ2VzIHNvIHRoYXQgd2UgY2FuIHRyeSBtb3JlIHRoYW4gb25lLgorICAgIHNhdmVzdGF0ZQorICAgIHNpbmdsZV9zdHJhdGVneT1ubworICAgIDs7CisqKQorICAgIHJtIC1mICIkR0lUX0RJUi9NRVJHRV9TQVZFIgorICAgIHNpbmdsZV9zdHJhdGVneT15ZXMKKyAgICA7OworZXNhYworCityZXN1bHRfdHJlZT0gYmVzdF9jbnQ9LTEgYmVzdF9zdHJhdGVneT0gd3Rfc3RyYXRlZ3k9CittZXJnZV93YXNfb2s9Citmb3Igc3RyYXRlZ3kgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworICAgIHRlc3QgIiR3dF9zdHJhdGVneSIgPSAnJyB8fCB7CisJZWNobyAiUmV3aW5kaW5nIHRoZSB0cmVlIHRvIHByaXN0aW5lLi4uIgorCXJlc3RvcmVzdGF0ZQorICAgIH0KKyAgICBjYXNlICIkc2luZ2xlX3N0cmF0ZWd5IiBpbgorICAgIG5vKQorCWVjaG8gIlRyeWluZyBtZXJnZSBzdHJhdGVneSAkc3RyYXRlZ3kuLi4iCisJOzsKKyAgICBlc2FjCisKKyAgICAjIFJlbWVtYmVyIHdoaWNoIHN0cmF0ZWd5IGxlZnQgdGhlIHN0YXRlIGluIHRoZSB3b3JraW5nIHRyZWUKKyAgICB3dF9zdHJhdGVneT0kc3RyYXRlZ3kKKworICAgIGdpdC1tZXJnZS0kc3RyYXRlZ3kgJGNvbW1vbiAtLSAiJGhlYWRfYXJnIiAiJEAiCisgICAgZXhpdD0kPworICAgIGlmIHRlc3QgIiRub19jb21taXQiID0gdCAmJiB0ZXN0ICIkZXhpdCIgPSAwCisgICAgdGhlbgorICAgICAgICBtZXJnZV93YXNfb2s9dAorCWV4aXQ9MSA7IyBwcmV0ZW5kIGl0IGxlZnQgY29uZmxpY3RzLgorICAgIGZpCisKKyAgICB0ZXN0ICIkZXhpdCIgPSAwIHx8IHsKKworCSMgVGhlIGJhY2tlbmQgZXhpdHMgd2l0aCAxIHdoZW4gY29uZmxpY3RzIGFyZSBsZWZ0IHRvIGJlIHJlc29sdmVkLAorCSMgd2l0aCAyIHdoZW4gaXQgZG9lcyBub3QgaGFuZGxlIHRoZSBnaXZlbiBtZXJnZSBhdCBhbGwuCisKKwlpZiB0ZXN0ICIkZXhpdCIgLWVxIDEKKwl0aGVuCisJICAgIGNudD1geworCQlnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seQorCQlnaXQtbHMtZmlsZXMgLS11bm1lcmdlZAorCSAgICB9IHwgd2MgLWxgCisJICAgIGlmIHRlc3QgJGJlc3RfY250IC1sZSAwIC1vICRjbnQgLWxlICRiZXN0X2NudAorCSAgICB0aGVuCisJCWJlc3Rfc3RyYXRlZ3k9JHN0cmF0ZWd5CisJCWJlc3RfY250PSRjbnQKKwkgICAgZmkKKwlmaQorCWNvbnRpbnVlCisgICAgfQorCisgICAgIyBBdXRvbWVyZ2Ugc3VjY2VlZGVkLgorICAgIHJlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmIGJyZWFrCitkb25lCisKKyMgSWYgd2UgaGF2ZSBhIHJlc3VsdGluZyB0cmVlLCB0aGF0IG1lYW5zIHRoZSBzdHJhdGVneSBtb2R1bGUKKyMgYXV0byByZXNvbHZlZCB0aGUgbWVyZ2UgY2xlYW5seS4KK2lmIHRlc3QgJycgIT0gIiRyZXN1bHRfdHJlZSIKK3RoZW4KKyAgICBwYXJlbnRzPSQoZ2l0LXNob3ctYnJhbmNoIC0taW5kZXBlbmRlbnQgIiRoZWFkIiAiJEAiIHwgc2VkIC1lICdzL14vLXAgLycpCisgICAgcmVzdWx0X2NvbW1pdD0kKHByaW50ZiAnJXNcbicgIiRtZXJnZV9tc2ciIHwgZ2l0LWNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAkcGFyZW50cykgfHwgZXhpdAorICAgIGZpbmlzaCAiJHJlc3VsdF9jb21taXQiICJNZXJnZSBtYWRlIGJ5ICR3dF9zdHJhdGVneS4iCisgICAgZHJvcHNhdmUKKyAgICBleGl0IDAKK2ZpCisKKyMgUGljayB0aGUgcmVzdWx0IGZyb20gdGhlIGJlc3Qgc3RyYXRlZ3kgYW5kIGhhdmUgdGhlIHVzZXIgZml4IGl0IHVwLgorY2FzZSAiJGJlc3Rfc3RyYXRlZ3kiIGluCisnJykKKwlyZXN0b3Jlc3RhdGUKKwljYXNlICIkdXNlX3N0cmF0ZWdpZXMiIGluCisJPyonICc/KikKKwkJZWNobyA+JjIgIk5vIG1lcmdlIHN0cmF0ZWd5IGhhbmRsZWQgdGhlIG1lcmdlLiIKKwkJOzsKKwkqKQorCQllY2hvID4mMiAiTWVyZ2Ugd2l0aCBzdHJhdGVneSAkdXNlX3N0cmF0ZWdpZXMgZmFpbGVkLiIKKwkJOzsKKwllc2FjCisJZXhpdCAyCisJOzsKKyIkd3Rfc3RyYXRlZ3kiKQorCSMgV2UgYWxyZWFkeSBoYXZlIGl0cyByZXN1bHQgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKwk7OworKikKKwllY2hvICJSZXdpbmRpbmcgdGhlIHRyZWUgdG8gcHJpc3RpbmUuLi4iCisJcmVzdG9yZXN0YXRlCisJZWNobyAiVXNpbmcgdGhlICRiZXN0X3N0cmF0ZWd5IHRvIHByZXBhcmUgcmVzb2x2aW5nIGJ5IGhhbmQuIgorCWdpdC1tZXJnZS0kYmVzdF9zdHJhdGVneSAkY29tbW9uIC0tICIkaGVhZF9hcmciICIkQCIKKwk7OworZXNhYworCitpZiB0ZXN0ICIkc3F1YXNoIiA9IHQKK3RoZW4KKwlmaW5pc2gKK2Vsc2UKKwlmb3IgcmVtb3RlCisJZG8KKwkJZWNobyAkcmVtb3RlCisJZG9uZSA+IiRHSVRfRElSL01FUkdFX0hFQUQiCisJcHJpbnRmICclc1xuJyAiJG1lcmdlX21zZyIgPiIkR0lUX0RJUi9NRVJHRV9NU0ciCitmaQorCitpZiB0ZXN0ICIkbWVyZ2Vfd2FzX29rIiA9IHQKK3RoZW4KKwllY2hvID4mMiBcCisJIkF1dG9tYXRpYyBtZXJnZSB3ZW50IHdlbGw7IHN0b3BwZWQgYmVmb3JlIGNvbW1pdHRpbmcgYXMgcmVxdWVzdGVkIgorCWV4aXQgMAorZWxzZQorCXsKKwkgICAgZWNobyAnCitDb25mbGljdHM6CisnCisJCWdpdCBscy1maWxlcyAtLXVubWVyZ2VkIHwKKwkJc2VkIC1lICdzL15bXgldKgkvCS8nIHwKKwkJdW5pcQorCX0gPj4iJEdJVF9ESVIvTUVSR0VfTVNHIgorCWlmIHRlc3QgLWQgIiRHSVRfRElSL3JyLWNhY2hlIgorCXRoZW4KKwkJZ2l0LXJlcmVyZQorCWZpCisJZGllICJBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkOyBmaXggY29uZmxpY3RzIGFuZCB0aGVuIGNvbW1pdCB0aGUgcmVzdWx0LiIKK2ZpCmRpZmYgLS1naXQgYS9naXQtbWVyZ2V0b29sLnNoIGIvZ2l0LW1lcmdldG9vbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjIzNTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdldG9vbC5zaApAQCAtMCwwICsxLDM2NSBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgcHJvZ3JhbSByZXNvbHZlcyBtZXJnZSBjb25mbGljdHMgaW4gZ2l0CisjCisjIENvcHlyaWdodCAoYykgMjAwNiBUaGVvZG9yZSBZLiBUcydvCisjCisjIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKyMgYXQgdGhlIGRpc2NyZXRpb24gb2YgSnVuaW8gQyBIYW1tYW5vLgorIworCitVU0FHRT0nWy0tdG9vbD10b29sXSBbZmlsZSB0byBtZXJnZV0gLi4uJworU1VCRElSRUNUT1JZX09LPVllcworLiBnaXQtc2gtc2V0dXAKK3JlcXVpcmVfd29ya190cmVlCisKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlIHJlZmxlY3RzIGEgc3ltbGluaworaXNfc3ltbGluayAoKSB7CisgICAgdGVzdCAiJDEiID0gMTIwMDAwCit9CisKK2xvY2FsX3ByZXNlbnQgKCkgeworICAgIHRlc3QgLW4gIiRsb2NhbF9tb2RlIgorfQorCityZW1vdGVfcHJlc2VudCAoKSB7CisgICAgdGVzdCAtbiAiJHJlbW90ZV9tb2RlIgorfQorCitiYXNlX3ByZXNlbnQgKCkgeworICAgIHRlc3QgLW4gIiRiYXNlX21vZGUiCit9CisKK2NsZWFudXBfdGVtcF9maWxlcyAoKSB7CisgICAgaWYgdGVzdCAiJDEiID0gLS1zYXZlLWJhY2t1cCA7IHRoZW4KKwltdiAtLSAiJEJBQ0tVUCIgIiRwYXRoLm9yaWciCisJcm0gLWYgLS0gIiRMT0NBTCIgIiRSRU1PVEUiICIkQkFTRSIKKyAgICBlbHNlCisJcm0gLWYgLS0gIiRMT0NBTCIgIiRSRU1PVEUiICIkQkFTRSIgIiRCQUNLVVAiCisgICAgZmkKK30KKworZGVzY3JpYmVfZmlsZSAoKSB7CisgICAgbW9kZT0iJDEiCisgICAgYnJhbmNoPSIkMiIKKyAgICBmaWxlPSIkMyIKKworICAgIHByaW50ZiAiICB7JXN9OiAiICIkYnJhbmNoIgorICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorCWVjaG8gImRlbGV0ZWQiCisgICAgZWxpZiBpc19zeW1saW5rICIkbW9kZSIgOyB0aGVuCisJZWNobyAiYSBzeW1ib2xpYyBsaW5rIC0+ICckKGNhdCAiJGZpbGUiKSciCisgICAgZWxzZQorCWlmIGJhc2VfcHJlc2VudDsgdGhlbgorCSAgICBlY2hvICJtb2RpZmllZCIKKwllbHNlCisJICAgIGVjaG8gImNyZWF0ZWQiCisJZmkKKyAgICBmaQorfQorCisKK3Jlc29sdmVfc3ltbGlua19tZXJnZSAoKSB7CisgICAgd2hpbGUgdHJ1ZTsgZG8KKwlwcmludGYgIlVzZSAobClvY2FsIG9yIChyKWVtb3RlLCBvciAoYSlib3J0PyAiCisJcmVhZCBhbnMKKwljYXNlICIkYW5zIiBpbgorCSAgICBbbExdKikKKwkJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tc3RhZ2U9MiAtLSAiJHBhdGgiCisJCWdpdC1hZGQgLS0gIiRwYXRoIgorCQljbGVhbnVwX3RlbXBfZmlsZXMgLS1zYXZlLWJhY2t1cAorCQlyZXR1cm4KKwkJOzsKKwkgICAgW3JSXSopCisJCWdpdC1jaGVja291dC1pbmRleCAtZiAtLXN0YWdlPTMgLS0gIiRwYXRoIgorCQlnaXQtYWRkIC0tICIkcGF0aCIKKwkJY2xlYW51cF90ZW1wX2ZpbGVzIC0tc2F2ZS1iYWNrdXAKKwkJcmV0dXJuCisJCTs7CisJICAgIFthQV0qKQorCQlleGl0IDEKKwkJOzsKKwkgICAgZXNhYworCWRvbmUKK30KKworcmVzb2x2ZV9kZWxldGVkX21lcmdlICgpIHsKKyAgICB3aGlsZSB0cnVlOyBkbworCWlmIGJhc2VfcHJlc2VudDsgdGhlbgorCSAgICBwcmludGYgIlVzZSAobSlvZGlmaWVkIG9yIChkKWVsZXRlZCBmaWxlLCBvciAoYSlib3J0PyAiCisJZWxzZQorCSAgICBwcmludGYgIlVzZSAoYylyZWF0ZWQgb3IgKGQpZWxldGVkIGZpbGUsIG9yIChhKWJvcnQ/ICIKKwlmaQorCXJlYWQgYW5zCisJY2FzZSAiJGFucyIgaW4KKwkgICAgW21NY0NdKikKKwkJZ2l0LWFkZCAtLSAiJHBhdGgiCisJCWNsZWFudXBfdGVtcF9maWxlcyAtLXNhdmUtYmFja3VwCisJCXJldHVybgorCQk7OworCSAgICBbZERdKikKKwkJZ2l0LXJtIC0tICIkcGF0aCIgPiAvZGV2L251bGwKKwkJY2xlYW51cF90ZW1wX2ZpbGVzCisJCXJldHVybgorCQk7OworCSAgICBbYUFdKikKKwkJZXhpdCAxCisJCTs7CisJICAgIGVzYWMKKwlkb25lCit9CisKK2NoZWNrX3VuY2hhbmdlZCAoKSB7CisgICAgaWYgdGVzdCAiJHBhdGgiIC1udCAiJEJBQ0tVUCIgOyB0aGVuCisJc3RhdHVzPTA7CisgICAgZWxzZQorCXdoaWxlIHRydWU7IGRvCisJICAgIGVjaG8gIiRwYXRoIHNlZW1zIHVuY2hhbmdlZC4iCisJICAgIHByaW50ZiAiV2FzIHRoZSBtZXJnZSBzdWNjZXNzZnVsPyBbeS9uXSAiCisJICAgIHJlYWQgYW5zd2VyIDwgL2Rldi90dHkKKwkgICAgY2FzZSAiJGFuc3dlciIgaW4KKwkJeSp8WSopIHN0YXR1cz0wOyBicmVhayA7OworCQluKnxOKikgc3RhdHVzPTE7IGJyZWFrIDs7CisJICAgIGVzYWMKKwlkb25lCisgICAgZmkKK30KKworc2F2ZV9iYWNrdXAgKCkgeworICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1lcSAwOyB0aGVuCisJbXYgLS0gIiRCQUNLVVAiICIkcGF0aC5vcmlnIgorICAgIGZpCit9CisKK3JlbW92ZV9iYWNrdXAgKCkgeworICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1lcSAwOyB0aGVuCisJcm0gIiRCQUNLVVAiCisgICAgZmkKK30KKworbWVyZ2VfZmlsZSAoKSB7CisgICAgcGF0aD0iJDEiCisKKyAgICBmPWBnaXQtbHMtZmlsZXMgLXUgLS0gIiRwYXRoImAKKyAgICBpZiB0ZXN0IC16ICIkZiIgOyB0aGVuCisJaWYgdGVzdCAhIC1mICIkcGF0aCIgOyB0aGVuCisJICAgIGVjaG8gIiRwYXRoOiBmaWxlIG5vdCBmb3VuZCIKKwllbHNlCisJICAgIGVjaG8gIiRwYXRoOiBmaWxlIGRvZXMgbm90IG5lZWQgbWVyZ2luZyIKKwlmaQorCWV4aXQgMQorICAgIGZpCisKKyAgICBCQUNLVVA9IiRwYXRoLkJBQ0tVUC4kJCIKKyAgICBMT0NBTD0iJHBhdGguTE9DQUwuJCQiCisgICAgUkVNT1RFPSIkcGF0aC5SRU1PVEUuJCQiCisgICAgQkFTRT0iJHBhdGguQkFTRS4kJCIKKworICAgIG12IC0tICIkcGF0aCIgIiRCQUNLVVAiCisgICAgY3AgLS0gIiRCQUNLVVAiICIkcGF0aCIKKworICAgIGJhc2VfbW9kZT1gZ2l0IGxzLWZpbGVzIC11IC0tICIkcGF0aCIgfCBhd2sgJ3tpZiAoJDM9PTEpIHByaW50ICQxO30nYAorICAgIGxvY2FsX21vZGU9YGdpdCBscy1maWxlcyAtdSAtLSAiJHBhdGgiIHwgYXdrICd7aWYgKCQzPT0yKSBwcmludCAkMTt9J2AKKyAgICByZW1vdGVfbW9kZT1gZ2l0IGxzLWZpbGVzIC11IC0tICIkcGF0aCIgfCBhd2sgJ3tpZiAoJDM9PTMpIHByaW50ICQxO30nYAorCisgICAgYmFzZV9wcmVzZW50ICAgJiYgZ2l0IGNhdC1maWxlIGJsb2IgIjoxOiRwYXRoIiA+ICIkQkFTRSIgMj4vZGV2L251bGwKKyAgICBsb2NhbF9wcmVzZW50ICAmJiBnaXQgY2F0LWZpbGUgYmxvYiAiOjI6JHBhdGgiID4gIiRMT0NBTCIgMj4vZGV2L251bGwKKyAgICByZW1vdGVfcHJlc2VudCAmJiBnaXQgY2F0LWZpbGUgYmxvYiAiOjM6JHBhdGgiID4gIiRSRU1PVEUiIDI+L2Rldi9udWxsCisKKyAgICBpZiB0ZXN0IC16ICIkbG9jYWxfbW9kZSIgLW8gLXogIiRyZW1vdGVfbW9kZSI7IHRoZW4KKwllY2hvICJEZWxldGVkIG1lcmdlIGNvbmZsaWN0IGZvciAnJHBhdGgnOiIKKwlkZXNjcmliZV9maWxlICIkbG9jYWxfbW9kZSIgImxvY2FsIiAiJExPQ0FMIgorCWRlc2NyaWJlX2ZpbGUgIiRyZW1vdGVfbW9kZSIgInJlbW90ZSIgIiRSRU1PVEUiCisJcmVzb2x2ZV9kZWxldGVkX21lcmdlCisJcmV0dXJuCisgICAgZmkKKworICAgIGlmIGlzX3N5bWxpbmsgIiRsb2NhbF9tb2RlIiB8fCBpc19zeW1saW5rICIkcmVtb3RlX21vZGUiOyB0aGVuCisJZWNobyAiU3ltYm9saWMgbGluayBtZXJnZSBjb25mbGljdCBmb3IgJyRwYXRoJzoiCisJZGVzY3JpYmVfZmlsZSAiJGxvY2FsX21vZGUiICJsb2NhbCIgIiRMT0NBTCIKKwlkZXNjcmliZV9maWxlICIkcmVtb3RlX21vZGUiICJyZW1vdGUiICIkUkVNT1RFIgorCXJlc29sdmVfc3ltbGlua19tZXJnZQorCXJldHVybgorICAgIGZpCisKKyAgICBlY2hvICJOb3JtYWwgbWVyZ2UgY29uZmxpY3QgZm9yICckcGF0aCc6IgorICAgIGRlc2NyaWJlX2ZpbGUgIiRsb2NhbF9tb2RlIiAibG9jYWwiICIkTE9DQUwiCisgICAgZGVzY3JpYmVfZmlsZSAiJHJlbW90ZV9tb2RlIiAicmVtb3RlIiAiJFJFTU9URSIKKyAgICBwcmludGYgIkhpdCByZXR1cm4gdG8gc3RhcnQgbWVyZ2UgcmVzb2x1dGlvbiB0b29sICglcyk6ICIgIiRtZXJnZV90b29sIgorICAgIHJlYWQgYW5zCisKKyAgICBjYXNlICIkbWVyZ2VfdG9vbCIgaW4KKwlrZGlmZjMpCisJICAgIGlmIGJhc2VfcHJlc2VudCA7IHRoZW4KKwkJKGtkaWZmMyAtLWF1dG8gLS1MMSAiJHBhdGggKEJhc2UpIiAtTDIgIiRwYXRoIChMb2NhbCkiIC0tTDMgIiRwYXRoIChSZW1vdGUpIiBcCisJCSAgICAtbyAiJHBhdGgiIC0tICIkQkFTRSIgIiRMT0NBTCIgIiRSRU1PVEUiID4gL2Rldi9udWxsIDI+JjEpCisJICAgIGVsc2UKKwkJKGtkaWZmMyAtLWF1dG8gLUwxICIkcGF0aCAoTG9jYWwpIiAtLUwyICIkcGF0aCAoUmVtb3RlKSIgXAorCQkgICAgLW8gIiRwYXRoIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIgPiAvZGV2L251bGwgMj4mMSkKKwkgICAgZmkKKwkgICAgc3RhdHVzPSQ/CisJICAgIHJlbW92ZV9iYWNrdXAKKwkgICAgOzsKKwl0a2RpZmYpCisJICAgIGlmIGJhc2VfcHJlc2VudCA7IHRoZW4KKwkJdGtkaWZmIC1hICIkQkFTRSIgLW8gIiRwYXRoIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIKKwkgICAgZWxzZQorCQl0a2RpZmYgLW8gIiRwYXRoIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIKKwkgICAgZmkKKwkgICAgc3RhdHVzPSQ/CisJICAgIHNhdmVfYmFja3VwCisJICAgIDs7CisJbWVsZHx2aW1kaWZmKQorCSAgICB0b3VjaCAiJEJBQ0tVUCIKKwkgICAgJG1lcmdlX3Rvb2wgLS0gIiRMT0NBTCIgIiRwYXRoIiAiJFJFTU9URSIKKwkgICAgY2hlY2tfdW5jaGFuZ2VkCisJICAgIHNhdmVfYmFja3VwCisJICAgIDs7CisJeHhkaWZmKQorCSAgICB0b3VjaCAiJEJBQ0tVUCIKKwkgICAgaWYgYmFzZV9wcmVzZW50IDsgdGhlbgorCQl4eGRpZmYgLVggLS1zaG93LW1lcmdlZC1wYW5lIFwKKwkJICAgIC1SICdBY2NlbC5TYXZlQXNNZXJnZWQ6ICJDdHJsLVMiJyBcCisJCSAgICAtUiAnQWNjZWwuU2VhcmNoOiAiQ3RybCtGIicgXAorCQkgICAgLVIgJ0FjY2VsLlNlYXJjaEZvcndhcmQ6ICJDdHJsLUciJyBcCisJCSAgICAtLW1lcmdlZC1maWxlICIkcGF0aCIgLS0gIiRMT0NBTCIgIiRCQVNFIiAiJFJFTU9URSIKKwkgICAgZWxzZQorCQl4eGRpZmYgLVggLS1zaG93LW1lcmdlZC1wYW5lIFwKKwkJICAgIC1SICdBY2NlbC5TYXZlQXNNZXJnZWQ6ICJDdHJsLVMiJyBcCisJCSAgICAtUiAnQWNjZWwuU2VhcmNoOiAiQ3RybCtGIicgXAorCQkgICAgLVIgJ0FjY2VsLlNlYXJjaEZvcndhcmQ6ICJDdHJsLUciJyBcCisJCSAgICAtLW1lcmdlZC1maWxlICIkcGF0aCIgLS0gIiRMT0NBTCIgIiRSRU1PVEUiCisJICAgIGZpCisJICAgIGNoZWNrX3VuY2hhbmdlZAorCSAgICBzYXZlX2JhY2t1cAorCSAgICA7OworCW9wZW5kaWZmKQorCSAgICB0b3VjaCAiJEJBQ0tVUCIKKwkgICAgaWYgYmFzZV9wcmVzZW50OyB0aGVuCisJCW9wZW5kaWZmICIkTE9DQUwiICIkUkVNT1RFIiAtYW5jZXN0b3IgIiRCQVNFIiAtbWVyZ2UgIiRwYXRoIiB8IGNhdAorCSAgICBlbHNlCisJCW9wZW5kaWZmICIkTE9DQUwiICIkUkVNT1RFIiAtbWVyZ2UgIiRwYXRoIiB8IGNhdAorCSAgICBmaQorCSAgICBjaGVja191bmNoYW5nZWQKKwkgICAgc2F2ZV9iYWNrdXAKKwkgICAgOzsKKwllbWVyZ2UpCisJICAgIGlmIGJhc2VfcHJlc2VudCA7IHRoZW4KKwkJZW1hY3MgLWYgZW1lcmdlLWZpbGVzLXdpdGgtYW5jZXN0b3ItY29tbWFuZCAiJExPQ0FMIiAiJFJFTU9URSIgIiRCQVNFIiAiJHBhdGgiCisJICAgIGVsc2UKKwkJZW1hY3MgLWYgZW1lcmdlLWZpbGVzLWNvbW1hbmQgIiRMT0NBTCIgIiRSRU1PVEUiICIkcGF0aCIKKwkgICAgZmkKKwkgICAgc3RhdHVzPSQ/CisJICAgIHNhdmVfYmFja3VwCisJICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwOyB0aGVuCisJZWNobyAibWVyZ2Ugb2YgJHBhdGggZmFpbGVkIiAxPiYyCisJbXYgLS0gIiRCQUNLVVAiICIkcGF0aCIKKwlleGl0IDEKKyAgICBmaQorICAgIGdpdCBhZGQgLS0gIiRwYXRoIgorICAgIGNsZWFudXBfdGVtcF9maWxlcworfQorCit3aGlsZSBjYXNlICQjIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisgICAgY2FzZSAiJDEiIGluCisJLXR8LS10b29sKikKKwkgICAgY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkgICAgbWVyZ2VfdG9vbD1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCSAgICA7OworCQkxLCopCisJCSAgICB1c2FnZSA7OworCQkqKQorCQkgICAgbWVyZ2VfdG9vbD0iJDIiCisJCSAgICBzaGlmdCA7OworCSAgICBlc2FjCisJICAgIDs7CisJLS0pCisJICAgIGJyZWFrCisJICAgIDs7CisJLSopCisJICAgIHVzYWdlCisJICAgIDs7CisJKikKKwkgICAgYnJlYWsKKwkgICAgOzsKKyAgICBlc2FjCisgICAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAteiAiJG1lcmdlX3Rvb2wiOyB0aGVuCisgICAgbWVyZ2VfdG9vbD1gZ2l0LWNvbmZpZyBtZXJnZS50b29sYAorICAgIGNhc2UgIiRtZXJnZV90b29sIiBpbgorCWtkaWZmMyB8IHRrZGlmZiB8IHh4ZGlmZiB8IG1lbGQgfCBvcGVuZGlmZiB8IGVtZXJnZSB8IHZpbWRpZmYgfCAiIikKKwkgICAgOzsgIyBoYXBweQorCSopCisJICAgIGVjaG8gPiYyICJnaXQgY29uZmlnIG9wdGlvbiBtZXJnZS50b29sIHNldCB0byB1bmtub3duIHRvb2w6ICRtZXJnZV90b29sIgorCSAgICBlY2hvID4mMiAiUmVzZXR0aW5nIHRvIGRlZmF1bHQuLi4iCisJICAgIHVuc2V0IG1lcmdlX3Rvb2wKKwkgICAgOzsKKyAgICBlc2FjCitmaQorCitpZiB0ZXN0IC16ICIkbWVyZ2VfdG9vbCIgOyB0aGVuCisgICAgaWYgdHlwZSBrZGlmZjMgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgLW4gIiRESVNQTEFZIjsgdGhlbgorCW1lcmdlX3Rvb2w9ImtkaWZmMyI7CisgICAgZWxpZiB0eXBlIHRrZGlmZiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAtbiAiJERJU1BMQVkiOyB0aGVuCisJbWVyZ2VfdG9vbD10a2RpZmYKKyAgICBlbGlmIHR5cGUgeHhkaWZmID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0IC1uICIkRElTUExBWSI7IHRoZW4KKwltZXJnZV90b29sPXh4ZGlmZgorICAgIGVsaWYgdHlwZSBtZWxkID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0IC1uICIkRElTUExBWSI7IHRoZW4KKwltZXJnZV90b29sPW1lbGQKKyAgICBlbGlmIHR5cGUgb3BlbmRpZmYgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJbWVyZ2VfdG9vbD1vcGVuZGlmZgorICAgIGVsaWYgdHlwZSBlbWFjcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwltZXJnZV90b29sPWVtZXJnZQorICAgIGVsaWYgdHlwZSB2aW1kaWZmID4vZGV2L251bGwgMj4mMTsgdGhlbgorCW1lcmdlX3Rvb2w9dmltZGlmZgorICAgIGVsc2UKKwllY2hvICJObyBhdmFpbGFibGUgbWVyZ2UgcmVzb2x1dGlvbiBwcm9ncmFtcyBhdmFpbGFibGUuIgorCWV4aXQgMQorICAgIGZpCitmaQorCitjYXNlICIkbWVyZ2VfdG9vbCIgaW4KKyAgICBrZGlmZjN8dGtkaWZmfG1lbGR8eHhkaWZmfHZpbWRpZmZ8b3BlbmRpZmYpCisJaWYgISB0eXBlICIkbWVyZ2VfdG9vbCIgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICBlY2hvICJUaGUgbWVyZ2UgdG9vbCAkbWVyZ2VfdG9vbCBpcyBub3QgYXZhaWxhYmxlIgorCSAgICBleGl0IDEKKwlmaQorCTs7CisgICAgZW1lcmdlKQorCWlmICEgdHlwZSAiZW1hY3MiID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgZWNobyAiRW1hY3MgaXMgbm90IGF2YWlsYWJsZSIKKwkgICAgZXhpdCAxCisJZmkKKwk7OworICAgICopCisJZWNobyAiVW5rbm93biBtZXJnZSB0b29sOiAkbWVyZ2VfdG9vbCIKKwlleGl0IDEKKwk7OworZXNhYworCitpZiB0ZXN0ICQjIC1lcSAwIDsgdGhlbgorCWZpbGVzPWBnaXQgbHMtZmlsZXMgLXUgfCBzZWQgLWUgJ3MvXlteCV0qCS8vJyB8IHNvcnQgLXVgCisJaWYgdGVzdCAteiAiJGZpbGVzIiA7IHRoZW4KKwkJZWNobyAiTm8gZmlsZXMgbmVlZCBtZXJnaW5nIgorCQlleGl0IDAKKwlmaQorCWVjaG8gTWVyZ2luZyB0aGUgZmlsZXM6ICRmaWxlcworCWdpdCBscy1maWxlcyAtdSB8IHNlZCAtZSAncy9eW14JXSoJLy8nIHwgc29ydCAtdSB8IHdoaWxlIHJlYWQgaQorCWRvCisJCXByaW50ZiAiXG4iCisJCW1lcmdlX2ZpbGUgIiRpIiA8IC9kZXYvdHR5ID4gL2Rldi90dHkKKwlkb25lCitlbHNlCisJd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKwkJcHJpbnRmICJcbiIKKwkJbWVyZ2VfZmlsZSAiJDEiCisJCXNoaWZ0CisJZG9uZQorZmkKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZ2l0LXA0aW1wb3J0LnB5IGIvZ2l0LXA0aW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTc1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcDRpbXBvcnQucHkKQEAgLTAsMCArMSwzNjEgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDYsIFNlYW4gRXN0YWJyb29rcy4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBJbXBvcnQgUGVyZm9yY2UgYnJhbmNoZXMgaW50byBHaXQgcmVwb3NpdG9yaWVzLgorIyBDaGVja2luZyBvdXQgdGhlIGZpbGVzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgc3RhbmRhcmQgcDQKKyMgY2xpZW50IHdoaWNoIHlvdSBtdXN0IGhhdmUgcHJvcGVybHkgY29uZmlndXJlZCB5b3Vyc2VsZgorIworCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IGdldG9wdAorCitmcm9tIHNpZ25hbCBpbXBvcnQgc2lnbmFsLCBcCisgICBTSUdQSVBFLCBTSUdJTlQsIFNJR19ERkwsIFwKKyAgIGRlZmF1bHRfaW50X2hhbmRsZXIKKworc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpCitzID0gc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCkKK2lmIHMgIT0gZGVmYXVsdF9pbnRfaGFuZGxlcjoKKyAgIHNpZ25hbChTSUdJTlQsIHMpCisKK2RlZiBkaWUobXNnLCAqYXJncyk6CisgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgbXNnID0gIiVzICVzIiAlIChtc2csIGEpCisgICAgcHJpbnQgImdpdC1wNGltcG9ydCBmYXRhbCBlcnJvcjoiLCBtc2cKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgdXNhZ2UoKToKKyAgICBwcmludCAiVVNBR0U6IGdpdC1wNGltcG9ydCBbLXF8LXZdICBbLS1hdXRob3JzPTxmaWxlPl0gIFstdCA8dGltZXpvbmU+XSAgWy8vcDRyZXBvL3BhdGggPGJyYW5jaD5dIgorICAgIHN5cy5leGl0KDEpCisKK3ZlcmJvc2l0eSA9IDEKK2xvZ2ZpbGUgPSAiL2Rldi9udWxsIgoraWdub3JlX3dhcm5pbmdzID0gRmFsc2UKK3N0aXRjaCA9IDAKK3RhZ2FsbCA9IFRydWUKKworZGVmIHJlcG9ydChsZXZlbCwgbXNnLCAqYXJncyk6CisgICAgZ2xvYmFsIHZlcmJvc2l0eQorICAgIGdsb2JhbCBsb2dmaWxlCisgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgbXNnID0gIiVzICVzIiAlIChtc2csIGEpCisgICAgZmQgPSBvcGVuKGxvZ2ZpbGUsICJhIikKKyAgICBmZC53cml0ZWxpbmVzKG1zZykKKyAgICBmZC5jbG9zZSgpCisgICAgaWYgbGV2ZWwgPD0gdmVyYm9zaXR5OgorICAgICAgICBwcmludCBtc2cKKworY2xhc3MgcDRfY29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX3JlcG9wYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2xvYmFsIGxvZ2ZpbGUKKyAgICAgICAgICAgIHNlbGYudXNlcmxpc3QgPSB7fQorICAgICAgICAgICAgaWYgX3JlcG9wYXRoWy0xXSA9PSAnLyc6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcGF0aCA9IF9yZXBvcGF0aFs6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGggPSBfcmVwb3BhdGgKKyAgICAgICAgICAgIGlmIHNlbGYucmVwb3BhdGhbLTQ6XSAhPSAiLy4uLiI6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcGF0aD0gIiVzLy4uLiIgJSBzZWxmLnJlcG9wYXRoCisgICAgICAgICAgICBmPW9zLnBvcGVuKCdwNCAtViAyPj4lcyclbG9nZmlsZSwgJ3JiJykKKyAgICAgICAgICAgIGEgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICBpZiBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdGhlIFwicDRcIiBjb21tYW5kIikKKworICAgIGRlZiBwNChzZWxmLCBjbWQsICphcmdzKToKKyAgICAgICAgZ2xvYmFsIGxvZ2ZpbGUKKyAgICAgICAgY21kID0gIiVzICVzIiAlIChjbWQsICcgJy5qb2luKGFyZ3MpKQorICAgICAgICByZXBvcnQoMiwgIlA0OiIsIGNtZCkKKyAgICAgICAgZj1vcy5wb3BlbigncDQgLUcgJXMgMj4+JXMnICUgKGNtZCxsb2dmaWxlKSwgJ3JiJykKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChtYXJzaGFsLmxvYWQoZikpCisgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLnJldCA9IGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIHN5bmMoc2VsZiwgaWQsIGZvcmNlPUZhbHNlLCB0cmljaz1GYWxzZSwgdGVzdD1GYWxzZSk6CisgICAgICAgIGlmIGZvcmNlOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5wNCgic3luYyAtZiAlc0AlcyIlKHNlbGYucmVwb3BhdGgsIGlkKSlbMF0KKyAgICAgICAgZWxpZiB0cmljazoKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLWsgJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsaWYgdGVzdDoKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLW4gJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jICAgICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBpZiByZXRbJ2NvZGUnXSA9PSAiZXJyb3IiOgorICAgICAgICAgICAgIGRhdGEgPSByZXRbJ2RhdGEnXS51cHBlcigpCisgICAgICAgICAgICAgaWYgZGF0YS5maW5kKCdWSUVXJykgPiAwOgorICAgICAgICAgICAgICAgICBkaWUoIlBlcmZvcmNlIHJlcG9ydHMgJXMgaXMgbm90IGluIGNsaWVudCB2aWV3IiUgc2VsZi5yZXBvcGF0aCkKKyAgICAgICAgICAgICBlbGlmIGRhdGEuZmluZCgnVVAtVE8tREFURScpIDwgMDoKKyAgICAgICAgICAgICAgICAgZGllKCJDb3VsZCBub3Qgc3luYyBmaWxlcyBmcm9tIHBlcmZvcmNlIiwgc2VsZi5yZXBvcGF0aCkKKworICAgIGRlZiBjaGFuZ2VzKHNlbGYsIHNpbmNlPTApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciByZWMgaW4gc2VsZi5wNCgiY2hhbmdlcyAlc0AlcywjaGVhZCIgJSAoc2VsZi5yZXBvcGF0aCwgc2luY2UrMSkpOgorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKHJlY1snY2hhbmdlJ10pCisgICAgICAgICAgICBsaXN0LnJldmVyc2UoKQorICAgICAgICAgICAgcmV0dXJuIGxpc3QKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgYXV0aG9ycyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGY9b3BlbihmaWxlbmFtZSkKKyAgICAgICAgZm9yIGwgaW4gZi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgIHNlbGYudXNlcmxpc3RbbFs6bC5maW5kKCc9JyldLnJzdHJpcCgpXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgKGxbbC5maW5kKCc9JykrMTpsLmZpbmQoJzwnKV0ucnN0cmlwKCksbFtsLmZpbmQoJzwnKSsxOmwuZmluZCgnPicpXSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZvciBmLGUgaW4gc2VsZi51c2VybGlzdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHJlcG9ydCgyLCBmLCAiOiIsIGVbMF0sICIgIDwiLCBlWzFdLCAiPiIpCisKKyAgICBkZWYgX2dldF91c2VyKHNlbGYsIGlkKToKKyAgICAgICAgaWYgbm90IHNlbGYudXNlcmxpc3QuaGFzX2tleShpZCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdXNlciA9IHNlbGYucDQoInVzZXJzIiwgaWQpWzBdCisgICAgICAgICAgICAgICAgc2VsZi51c2VybGlzdFtpZF0gPSAodXNlclsnRnVsbE5hbWUnXSwgdXNlclsnRW1haWwnXSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnVzZXJsaXN0W2lkXSA9IChpZCwgIiIpCisgICAgICAgIHJldHVybiBzZWxmLnVzZXJsaXN0W2lkXQorCisgICAgZGVmIF9mb3JtYXRfZGF0ZShzZWxmLCB0aWNrcyk6CisgICAgICAgIHN5bWJvbD0nKycKKyAgICAgICAgbmFtZSA9IHRpbWUudHpuYW1lWzBdCisgICAgICAgIG9mZnNldCA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgaWYgdGlja3NbOF06CisgICAgICAgICAgICBuYW1lID0gdGltZS50em5hbWVbMV0KKyAgICAgICAgICAgIG9mZnNldCA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiBvZmZzZXQgPCAwOgorICAgICAgICAgICAgb2Zmc2V0ICo9IC0xCisgICAgICAgICAgICBzeW1ib2wgPSAnLScKKyAgICAgICAgbG9jYWxvID0gIiVzJTAyZCUwMmQgJXMiICUgKHN5bWJvbCwgb2Zmc2V0IC8gMzYwMCwgb2Zmc2V0ICUgMzYwMCwgbmFtZSkKKyAgICAgICAgdGlja3NvID0gdGltZS5zdHJmdGltZSgiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCB0aWNrcykKKyAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAodGlja3NvLCBsb2NhbG8pCisKKyAgICBkZWYgd2hlcmUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnA0KCJ3aGVyZSAlcyIgJSBzZWxmLnJlcG9wYXRoKVstMV1bJ3BhdGgnXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBkZXNjcmliZShzZWxmLCBudW0pOgorICAgICAgICBkZXNjID0gc2VsZi5wNCgiZGVzY3JpYmUgLXMiLCBudW0pWzBdCisgICAgICAgIHNlbGYubXNnID0gZGVzY1snZGVzYyddCisgICAgICAgIHNlbGYuYXV0aG9yLCBzZWxmLmVtYWlsID0gc2VsZi5fZ2V0X3VzZXIoZGVzY1sndXNlciddKQorICAgICAgICBzZWxmLmRhdGUgPSBzZWxmLl9mb3JtYXRfZGF0ZSh0aW1lLmxvY2FsdGltZShsb25nKGRlc2NbJ3RpbWUnXSkpKQorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBnaXRfY29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IHNlbGYuZ2l0KCItLXZlcnNpb24iKVswXVsxMjpdLnJzdHJpcCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdGhlIFwiZ2l0XCIgY29tbWFuZCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZ2l0ZGlyID0gc2VsZi5nZXRfc2luZ2xlKCJyZXYtcGFyc2UgLS1naXQtZGlyIikKKyAgICAgICAgICAgIHJlcG9ydCgyLCAiZ2RpcjoiLCBzZWxmLmdpdGRpcikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZGllKCJOb3QgYSBnaXQgcmVwb3NpdG9yeS4uLiBkaWQgeW91IGZvcmdldCB0byBcImdpdCBpbml0XCIgPyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2R1cCA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tc2hvdy1jZHVwIikKKyAgICAgICAgICAgIGlmIHNlbGYuY2R1cCAhPSAiIjoKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmNkdXApCisgICAgICAgICAgICBzZWxmLnRvcGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICByZXBvcnQoMiwgInRvcGRpcjoiLCBzZWxmLnRvcGRpcikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZGllKCJDb3VsZCBub3QgZmluZCB0b3AgZ2l0IGRpcmVjdG9yeSIpCisKKyAgICBkZWYgZ2l0KHNlbGYsIGNtZCk6CisgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgIHJlcG9ydCgyLCAiR0lUOiIsIGNtZCkKKyAgICAgICAgZj1vcy5wb3BlbignZ2l0ICVzIDI+PiVzJyAlIChjbWQsbG9nZmlsZSksICdyYicpCisgICAgICAgIHI9Zi5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLnJldCA9IGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIGdldF9zaW5nbGUoc2VsZiwgY21kKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2l0KGNtZClbMF0ucnN0cmlwKCkKKworICAgIGRlZiBjdXJyZW50X2JyYW5jaChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdGl0ID0gc2VsZi5naXQoInJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIilbMF0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdpdCgic3ltYm9saWMtcmVmIEhFQUQiKVswXVsxMTpdLnJzdHJpcCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0X2NvbmZpZyhzZWxmLCB2YXJpYWJsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdpdCgiY29uZmlnIC0tZ2V0ICVzIiAlIHZhcmlhYmxlKVswXS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldF9jb25maWcoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5naXQoImNvbmZpZyAlcyAlcyIlKHZhcmlhYmxlLCB2YWx1ZSkgKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBzZXQgJXMgdG8gIiAlIHZhcmlhYmxlLCB2YWx1ZSkKKworICAgIGRlZiBtYWtlX3RhZyhzZWxmLCBuYW1lLCBoZWFkKToKKyAgICAgICAgc2VsZi5naXQoInRhZyAtZiAlcyAlcyIlKG5hbWUsaGVhZCkpCisKKyAgICBkZWYgdG9wX2NoYW5nZShzZWxmLCBicmFuY2gpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhPXNlbGYuZ2V0X3NpbmdsZSgibmFtZS1yZXYgLS10YWdzIHJlZnMvaGVhZHMvJXMiICUgYnJhbmNoKQorICAgICAgICAgICAgbG9jID0gYS5maW5kKCcgdGFncy8nKSArIDYKKyAgICAgICAgICAgIGlmIGFbbG9jOmxvYyszXSAhPSAicDQvIjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcmV0dXJuIGludChhW2xvYyszOl1bOi0yXSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiB1cGRhdGVfaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuZ2l0KCJscy1maWxlcyAtbSAtZCAtbyAteiB8IGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLXogLS1zdGRpbiIpCisKKyAgICBkZWYgY2hlY2tvdXQoc2VsZiwgYnJhbmNoKToKKyAgICAgICAgc2VsZi5naXQoImNoZWNrb3V0ICVzIiAlIGJyYW5jaCkKKworICAgIGRlZiByZXBvaW50X2hlYWQoc2VsZiwgYnJhbmNoKToKKyAgICAgICAgc2VsZi5naXQoInN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvJXMiICUgYnJhbmNoKQorCisgICAgZGVmIHJlbW92ZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIHwgeGFyZ3Mgcm0iKQorCisgICAgZGVmIGNsZWFuX2RpcmVjdG9yaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmdpdCgiY2xlYW4gLWQiKQorCisgICAgZGVmIGZyZXNoX2JyYW5jaChzZWxmLCBicmFuY2gpOgorICAgICAgICByZXBvcnQoMSwgIkNyZWF0aW5nIG5ldyBicmFuY2giLCBicmFuY2gpCisgICAgICAgIHNlbGYuZ2l0KCJscy1maWxlcyB8IHhhcmdzIHJtIikKKyAgICAgICAgb3MucmVtb3ZlKCIuZ2l0L2luZGV4IikKKyAgICAgICAgc2VsZi5yZXBvaW50X2hlYWQoYnJhbmNoKQorICAgICAgICBzZWxmLmdpdCgiY2xlYW4gLWQiKQorCisgICAgZGVmIGJhc2VkaXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRvcGRpcgorCisgICAgZGVmIGNvbW1pdChzZWxmLCBhdXRob3IsIGVtYWlsLCBkYXRlLCBtc2csIGlkKToKKyAgICAgICAgc2VsZi51cGRhdGVfaW5kZXgoKQorICAgICAgICBmZD1vcGVuKCIubXNnIiwgInciKQorICAgICAgICBmZC53cml0ZWxpbmVzKG1zZykKKyAgICAgICAgZmQuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQiKQorICAgICAgICAgICAgICAgIGhlYWQgPSAiLXAgSEVBRCIKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAiIgorICAgICAgICAgICAgICAgIGhlYWQgPSAiIgorICAgICAgICB0cmVlID0gc2VsZi5nZXRfc2luZ2xlKCJ3cml0ZS10cmVlIikKKyAgICAgICAgZm9yIHIsbCBpbiBbKCdEQVRFJyxkYXRlKSwoJ05BTUUnLGF1dGhvciksKCdFTUFJTCcsZW1haWwpXToKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ0dJVF9BVVRIT1JfJXMnJXJdID0gbAorICAgICAgICAgICAgb3MuZW52aXJvblsnR0lUX0NPTU1JVFRFUl8lcyclcl0gPSBsCisgICAgICAgIGNvbW1pdCA9IHNlbGYuZ2V0X3NpbmdsZSgiY29tbWl0LXRyZWUgJXMgJXMgPCAubXNnIiAlICh0cmVlLGhlYWQpKQorICAgICAgICBvcy5yZW1vdmUoIi5tc2ciKQorICAgICAgICBzZWxmLm1ha2VfdGFnKCJwNC8lcyIlaWQsIGNvbW1pdCkKKyAgICAgICAgc2VsZi5naXQoInVwZGF0ZS1yZWYgSEVBRCAlcyAlcyIgJSAoY29tbWl0LCBjdXJyZW50KSApCisKK3RyeToKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJxaHZ0OiIsCisgICAgICAgICAgICBbImF1dGhvcnM9IiwiaGVscCIsInN0aXRjaD0iLCJ0aW1lem9uZT0iLCJsb2c9IiwiaWdub3JlIiwibm90YWdzIl0pCitleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorICAgIHVzYWdlKCkKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvID09ICItcSI6CisgICAgICAgIHZlcmJvc2l0eSA9IDAKKyAgICBpZiBvID09ICItdiI6CisgICAgICAgIHZlcmJvc2l0eSArPSAxCisgICAgaWYgbyBpbiAoIi0tbG9nIik6CisgICAgICAgIGxvZ2ZpbGUgPSBhCisgICAgaWYgbyBpbiAoIi0tbm90YWdzIik6CisgICAgICAgIHRhZ2FsbCA9IEZhbHNlCisgICAgaWYgbyBpbiAoIi1oIiwgIi0taGVscCIpOgorICAgICAgICB1c2FnZSgpCisgICAgaWYgbyBpbiAoIi0taWdub3JlIik6CisgICAgICAgIGlnbm9yZV93YXJuaW5ncyA9IFRydWUKKworZ2l0ID0gZ2l0X2NvbW1hbmQoKQorYnJhbmNoPWdpdC5jdXJyZW50X2JyYW5jaCgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi10IiwgIi0tdGltZXpvbmUiKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLnRpbWV6b25lIiwgYSkKKyAgICBpZiBvIGluICgiLS1zdGl0Y2giKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoLCBhKQorICAgICAgICBzdGl0Y2ggPSAxCisKK2lmIGxlbihhcmdzKSA9PSAyOgorICAgIGJyYW5jaCA9IGFyZ3NbMV0KKyAgICBnaXQuY2hlY2tvdXQoYnJhbmNoKQorICAgIGlmIGJyYW5jaCA9PSBnaXQuY3VycmVudF9icmFuY2goKToKKyAgICAgICAgZGllKCJCcmFuY2ggJXMgYWxyZWFkeSBleGlzdHMhIiAlIGJyYW5jaCkKKyAgICByZXBvcnQoMSwgIlNldHRpbmcgcGVyZm9yY2UgdG8gIiwgYXJnc1swXSkKKyAgICBnaXQuc2V0X2NvbmZpZygicGVyZm9yY2UuJXMucGF0aCIgJSBicmFuY2gsIGFyZ3NbMF0pCitlbGlmIGxlbihhcmdzKSAhPSAwOgorICAgIGRpZSgiWW91IG11c3Qgc3BlY2lmeSB0aGUgcGVyZm9yY2UgLy9kZXBvdC9wYXRoIGFuZCBnaXQgYnJhbmNoIikKKworcDRwYXRoID0gZ2l0LmdldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoKQoraWYgcDRwYXRoID09IE5vbmU6CisgICAgZGllKCJEbyBub3Qga25vdyBQZXJmb3JjZSAvL2RlcG90L3BhdGggZm9yIGdpdCBicmFuY2giLCBicmFuY2gpCisKK3A0ID0gcDRfY29tbWFuZChwNHBhdGgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi1hIiwgIi0tYXV0aG9ycyIpOgorICAgICAgICBwNC5hdXRob3JzKGEpCisKK2xvY2FsZGlyID0gZ2l0LmJhc2VkaXIoKQoraWYgcDQud2hlcmUoKVs6bGVuKGxvY2FsZGlyKV0gIT0gbG9jYWxkaXI6CisgICAgcmVwb3J0KDEsICIqKldBUk5JTkcqKiBBcHBlYXJzIHA0IGNsaWVudCBpcyBtaXNjb25maWd1cmVkIikKKyAgICByZXBvcnQoMSwgIiAgIGZvciBzeW5jIGZyb20gJXMgdG8gJXMiICUgKHA0LnJlcG9wYXRoLCBsb2NhbGRpcikpCisgICAgaWYgaWdub3JlX3dhcm5pbmdzICE9IFRydWU6CisgICAgICAgIGRpZSgiUmVjb25maWd1cmUgb3IgdXNlIFwiLS1pZ25vcmVcIiBvbiBjb21tYW5kIGxpbmUiKQorCitpZiBzdGl0Y2ggPT0gMDoKKyAgICB0b3AgPSBnaXQudG9wX2NoYW5nZShicmFuY2gpCitlbHNlOgorICAgIHRvcCA9IDAKK2NoYW5nZXMgPSBwNC5jaGFuZ2VzKHRvcCkKK2NvdW50ID0gbGVuKGNoYW5nZXMpCitpZiBjb3VudCA9PSAwOgorICAgIHJlcG9ydCgxLCAiQWxyZWFkeSB1cCB0byBkYXRlLi4uIikKKyAgICBzeXMuZXhpdCgwKQorCitwdHogPSBnaXQuZ2V0X2NvbmZpZygicGVyZm9yY2UudGltZXpvbmUiKQoraWYgcHR6OgorICAgIHJlcG9ydCgxLCAiU2V0dGluZyB0aW1lem9uZSB0byIsIHB0eikKKyAgICBvcy5lbnZpcm9uWydUWiddID0gcHR6CisgICAgdGltZS50enNldCgpCisKK2lmIHN0aXRjaCA9PSAxOgorICAgIGdpdC5yZW1vdmVfZmlsZXMoKQorICAgIGdpdC5jbGVhbl9kaXJlY3RvcmllcygpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxpZiB0b3AgPT0gMCBhbmQgYnJhbmNoICE9IGdpdC5jdXJyZW50X2JyYW5jaCgpOgorICAgIHA0LnN5bmMoY2hhbmdlc1swXSwgdGVzdD1UcnVlKQorICAgIHJlcG9ydCgxLCAiQ3JlYXRpbmcgbmV3IGluaXRpYWwgY29tbWl0Iik7CisgICAgZ2l0LmZyZXNoX2JyYW5jaChicmFuY2gpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxzZToKKyAgICBwNC5zeW5jKGNoYW5nZXNbMF0sIHRyaWNrPVRydWUpCisKK3JlcG9ydCgxLCAicHJvY2Vzc2luZyAlcyBjaGFuZ2VzIGZyb20gcDQgKCVzKSB0byBnaXQgKCVzKSIgJSAoY291bnQsIHA0LnJlcG9wYXRoLCBicmFuY2gpKQorZm9yIGlkIGluIGNoYW5nZXM6CisgICAgcmVwb3J0KDEsICJJbXBvcnRpbmcgY2hhbmdlc2V0IiwgaWQpCisgICAgY2hhbmdlID0gcDQuZGVzY3JpYmUoaWQpCisgICAgcDQuc3luYyhpZCkKKyAgICBpZiB0YWdhbGwgOgorICAgICAgICAgICAgZ2l0LmNvbW1pdChjaGFuZ2UuYXV0aG9yLCBjaGFuZ2UuZW1haWwsIGNoYW5nZS5kYXRlLCBjaGFuZ2UubXNnLCBpZCkKKyAgICBlbHNlOgorICAgICAgICAgICAgZ2l0LmNvbW1pdChjaGFuZ2UuYXV0aG9yLCBjaGFuZ2UuZW1haWwsIGNoYW5nZS5kYXRlLCBjaGFuZ2UubXNnLCAiaW1wb3J0IikKKyAgICBpZiBzdGl0Y2ggPT0gMToKKyAgICAgICAgZ2l0LmNsZWFuX2RpcmVjdG9yaWVzKCkKKyAgICAgICAgc3RpdGNoID0gMAorCmRpZmYgLS1naXQgYS9naXQtcGFyc2UtcmVtb3RlLnNoIGIvZ2l0LXBhcnNlLXJlbW90ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTA2YjEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXBhcnNlLXJlbW90ZS5zaApAQCAtMCwwICsxLDI2NCBAQAorIyEvYmluL3NoCisKKyMgZ2l0LWxzLXJlbW90ZSBjb3VsZCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIGEgZ2l0IG1hbmFnZWQgcmVwb3NpdG9yeTsKKyMgdGhpcyB3b3VsZCBmYWlsIGluIHRoYXQgY2FzZSBhbmQgd291bGQgaXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4KK0dJVF9ESVI9JChnaXQtcmV2LXBhcnNlIC0tZ2l0LWRpciAyPi9kZXYvbnVsbCkgfHwgOjsKKworZ2V0X2RhdGFfc291cmNlICgpIHsKKwljYXNlICIkMSIgaW4KKwkqLyopCisJCWVjaG8gJycKKwkJOzsKKwkuKQorCQllY2hvIHNlbGYKKwkJOzsKKwkqKQorCQlpZiB0ZXN0ICIkKGdpdC1jb25maWcgLS1nZXQgInJlbW90ZS4kMS51cmwiKSIKKwkJdGhlbgorCQkJZWNobyBjb25maWcKKwkJZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9yZW1vdGVzLyQxIgorCQl0aGVuCisJCQllY2hvIHJlbW90ZXMKKwkJZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9icmFuY2hlcy8kMSIKKwkJdGhlbgorCQkJZWNobyBicmFuY2hlcworCQllbHNlCisJCQllY2hvICcnCisJCWZpIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3VybCAoKSB7CisJZGF0YV9zb3VyY2U9JChnZXRfZGF0YV9zb3VyY2UgIiQxIikKKwljYXNlICIkZGF0YV9zb3VyY2UiIGluCisJJycpCisJCWVjaG8gIiQxIgorCQk7OworCXNlbGYpCisJCWVjaG8gIiQxIgorCQk7OworCWNvbmZpZykKKwkJZ2l0LWNvbmZpZyAtLWdldCAicmVtb3RlLiQxLnVybCIKKwkJOzsKKwlyZW1vdGVzKQorCQlzZWQgLW5lICcvXlVSTDogKi97CisJCQlzLy8vcAorCQkJcQorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIKKwkJOzsKKwlicmFuY2hlcykKKwkJc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiCisJCTs7CisJKikKKwkJZGllICJpbnRlcm5hbCBlcnJvcjogZ2V0LXJlbW90ZS11cmwgJDEiIDs7CisJZXNhYworfQorCitnZXRfZGVmYXVsdF9yZW1vdGUgKCkgeworCWN1cnJfYnJhbmNoPSQoZ2l0LXN5bWJvbGljLXJlZiAtcSBIRUFEIHwgc2VkIC1lICdzfF5yZWZzL2hlYWRzL3x8JykKKwlvcmlnaW49JChnaXQtY29uZmlnIC0tZ2V0ICJicmFuY2guJGN1cnJfYnJhbmNoLnJlbW90ZSIpCisJZWNobyAke29yaWdpbjotb3JpZ2lufQorfQorCitnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfcHVzaCAoKSB7CisJZGF0YV9zb3VyY2U9JChnZXRfZGF0YV9zb3VyY2UgIiQxIikKKwljYXNlICIkZGF0YV9zb3VyY2UiIGluCisJJycgfCBicmFuY2hlcyB8IHNlbGYpCisJCTs7ICMgbm8gZGVmYXVsdCBwdXNoIG1hcHBpbmcsIGp1c3Qgc2VuZCBtYXRjaGluZyByZWZzLgorCWNvbmZpZykKKwkJZ2l0LWNvbmZpZyAtLWdldC1hbGwgInJlbW90ZS4kMS5wdXNoIiA7OworCXJlbW90ZXMpCisJCXNlZCAtbmUgJy9eUHVzaDogKi97CisJCQlzLy8vcAorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIgOzsKKwkqKQorCQlkaWUgImludGVybmFsIGVycm9yOiBnZXQtcmVtb3RlLWRlZmF1bHQtcmVmLWZvci1wdXNoICQxIiA7OworCWVzYWMKK30KKworIyBDYWxsZWQgZnJvbSBjYW5vbl9yZWZzX2xpc3RfZm9yX2ZldGNoIC1kICIkcmVtb3RlIiwgd2hpY2gKKyMgaXMgY2FsbGVkIGZyb20gZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX2ZldGNoIHRvIGdyb2sKKyMgcmVmc3BlY3MgdGhhdCBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QKKyMgZnJvbSBnZXRfcmVtb3RlX3JlZnNfZm9yX2ZldGNoIHdoZW4gaXQgZGVhbHMgd2l0aCByZWZzcGVjcworIyBzdXBwbGllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgJGxzX3JlbW90ZV9yZXN1bHQgaGFzIHRoZSBsaXN0CisjIG9mIHJlZnMgYXZhaWxhYmxlIGF0IHJlbW90ZS4KKyMKKyMgVGhlIGZpcnN0IHRva2VuIHJldHVybmVkIGlzIGVpdGhlciAiZXhwbGljaXQiIG9yICJnbG9iIjsgdGhpcworIyBpcyB0byBoZWxwIHByZXZlbnQgcmFuZG9tbHkgImdsb2JiZWQiIHJlZiBmcm9tIGJlaW5nIGNob3NlbiBhcworIyBhIG1lcmdlIGNhbmRpZGF0ZQorZXhwYW5kX3JlZnNfd2lsZGNhcmQgKCkgeworCWVjaG8gIiRsc19yZW1vdGVfcmVzdWx0IiB8CisJZ2l0IGZldGNoLS10b29sIGV4cGFuZC1yZWZzLXdpbGRjYXJkICItIiAiJEAiCit9CisKKyMgU3Vicm91dGluZSB0byBjYW5vbmljYWxpemUgcmVtb3RlOmxvY2FsIG5vdGF0aW9uLgorY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAoKSB7CisJIyBJZiBjYWxsZWQgZnJvbSBnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfZmV0Y2gKKwkjIGxlYXZlIHRoZSBicmFuY2hlcyBpbiBicmFuY2guJHtjdXJyX2JyYW5jaH0ubWVyZ2UgYWxvbmUsCisJIyBvciB0aGUgZmlyc3Qgb25lIG90aGVyd2lzZTsgYWRkIHByZWZpeCAuIHRvIHRoZSByZXN0CisJIyB0byBwcmV2ZW50IHRoZSBzZWNvbmRhcnkgYnJhbmNoZXMgdG8gYmUgbWVyZ2VkIGJ5IGRlZmF1bHQuCisJbWVyZ2VfYnJhbmNoZXM9CisJY3Vycl9icmFuY2g9CisJaWYgdGVzdCAiJDEiID0gIi1kIgorCXRoZW4KKwkJc2hpZnQgOyByZW1vdGU9IiQxIiA7IHNoaWZ0CisJCXNldCAkKGV4cGFuZF9yZWZzX3dpbGRjYXJkICIkcmVtb3RlIiAiJEAiKQorCQlpc19leHBsaWNpdD0iJDEiCisJCXNoaWZ0CisJCWlmIHRlc3QgIiRyZW1vdGUiID0gIiQoZ2V0X2RlZmF1bHRfcmVtb3RlKSIKKwkJdGhlbgorCQkJY3Vycl9icmFuY2g9JChnaXQtc3ltYm9saWMtcmVmIC1xIEhFQUQgfCBcCisJCQkgICAgc2VkIC1lICdzfF5yZWZzL2hlYWRzL3x8JykKKwkJCW1lcmdlX2JyYW5jaGVzPSQoZ2l0LWNvbmZpZyBcCisJCQkgICAgLS1nZXQtYWxsICJicmFuY2guJHtjdXJyX2JyYW5jaH0ubWVyZ2UiKQorCQlmaQorCQlpZiB0ZXN0IC16ICIkbWVyZ2VfYnJhbmNoZXMiICYmIHRlc3QgJGlzX2V4cGxpY2l0ICE9IGV4cGxpY2l0CisJCXRoZW4KKwkJCW1lcmdlX2JyYW5jaGVzPS4udGhpcy53aWxsLm5ldmVyLm1hdGNoLmFueS5yZWYuLgorCQlmaQorCWZpCisJZm9yIHJlZgorCWRvCisJCWZvcmNlPQorCQljYXNlICIkcmVmIiBpbgorCQkrKikKKwkJCXJlZj0kKGV4cHIgInokcmVmIiA6ICd6K1woLipcKScpCisJCQlmb3JjZT0rCisJCQk7OworCQllc2FjCisJCWV4cHIgInokcmVmIiA6ICd6Lio6JyA+L2Rldi9udWxsIHx8IHJlZj0iJHtyZWZ9OiIKKwkJcmVtb3RlPSQoZXhwciAieiRyZWYiIDogJ3pcKFteOl0qXCk6JykKKwkJbG9jYWw9JChleHByICJ6JHJlZiIgOiAnelteOl0qOlwoLipcKScpCisJCWRvdF9wcmVmaXg9LgorCQlpZiB0ZXN0IC16ICIkbWVyZ2VfYnJhbmNoZXMiCisJCXRoZW4KKwkJCW1lcmdlX2JyYW5jaGVzPSRyZW1vdGUKKwkJCWRvdF9wcmVmaXg9CisJCWVsc2UKKwkJCWZvciBtZXJnZV9icmFuY2ggaW4gJG1lcmdlX2JyYW5jaGVzCisJCQlkbworCQkJICAgIFsgIiRyZW1vdGUiID0gIiRtZXJnZV9icmFuY2giIF0gJiYKKwkJCSAgICBkb3RfcHJlZml4PSAmJiBicmVhaworCQkJZG9uZQorCQlmaQorCQljYXNlICIkcmVtb3RlIiBpbgorCQknJyB8IEhFQUQgKSByZW1vdGU9SEVBRCA7OworCQlyZWZzLyopIDs7CisJCWhlYWRzLyogfCB0YWdzLyogfCByZW1vdGVzLyogKSByZW1vdGU9InJlZnMvJHJlbW90ZSIgOzsKKwkJKikgcmVtb3RlPSJyZWZzL2hlYWRzLyRyZW1vdGUiIDs7CisJCWVzYWMKKwkJY2FzZSAiJGxvY2FsIiBpbgorCQknJykgbG9jYWw9IDs7CisJCXJlZnMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIGxvY2FsPSJyZWZzLyRsb2NhbCIgOzsKKwkJKikgbG9jYWw9InJlZnMvaGVhZHMvJGxvY2FsIiA7OworCQllc2FjCisKKwkJaWYgbG9jYWxfcmVmX25hbWU9JChleHByICJ6JGxvY2FsIiA6ICd6cmVmcy9cKC4qXCknKQorCQl0aGVuCisJCSAgIGdpdC1jaGVjay1yZWYtZm9ybWF0ICIkbG9jYWxfcmVmX25hbWUiIHx8CisJCSAgIGRpZSAiKiByZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICckbG9jYWxfcmVmX25hbWUnIGxvY2FsbHkiCisJCWZpCisJCWVjaG8gIiR7ZG90X3ByZWZpeH0ke2ZvcmNlfSR7cmVtb3RlfToke2xvY2FsfSIKKwlkb25lCit9CisKKyMgUmV0dXJucyBsaXN0IG9mIHNyYzogKG5vIHN0b3JlKSwgb3Igc3JjOmRzdCAoc3RvcmUpCitnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfZmV0Y2ggKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnKQorCQllY2hvICJIRUFEOiIgOzsKKwlzZWxmKQorCSAgICAgICAgY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAtZCAiJDEiIFwKKwkJCSQoZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0nJShyZWZuYW1lKTonKQorCQk7OworCWNvbmZpZykKKwkJY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAtZCAiJDEiIFwKKwkJCSQoZ2l0LWNvbmZpZyAtLWdldC1hbGwgInJlbW90ZS4kMS5mZXRjaCIpIDs7CisJYnJhbmNoZXMpCisJCXJlbW90ZV9icmFuY2g9JChzZWQgLW5lICcvIy9zLy4qIy8vcCcgIiRHSVRfRElSL2JyYW5jaGVzLyQxIikKKwkJY2FzZSAiJHJlbW90ZV9icmFuY2giIGluICcnKSByZW1vdGVfYnJhbmNoPW1hc3RlciA7OyBlc2FjCisJCWVjaG8gInJlZnMvaGVhZHMvJHtyZW1vdGVfYnJhbmNofTpyZWZzL2hlYWRzLyQxIgorCQk7OworCXJlbW90ZXMpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggLWQgIiQxIiAkKHNlZCAtbmUgJy9eUHVsbDogKi97CisJCQkJCQlzLy8vcAorCQkJCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIpCisJCTs7CisJKikKKwkJZGllICJpbnRlcm5hbCBlcnJvcjogZ2V0LXJlbW90ZS1kZWZhdWx0LXJlZi1mb3ItZmV0Y2ggJDEiIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItcHVzaC4iIDs7CisJMSkgZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggIiRAIiA7OworCSopIHNoaWZ0OyBlY2hvICIkQCIgOzsKKwllc2FjCit9CisKK2dldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApCisJICAgIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItZmV0Y2guIiA7OworCTEpCisJICAgIGdldF9yZW1vdGVfZGVmYXVsdF9yZWZzX2Zvcl9mZXRjaCAiJEAiIDs7CisJKikKKwkgICAgc2hpZnQKKwkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkgICAgZm9yIHJlZgorCSAgICBkbworCQlpZiB0ZXN0ICIkdGFnX2p1c3Rfc2VlbiIKKwkJdGhlbgorCQkgICAgZWNobyAicmVmcy90YWdzLyR7cmVmfTpyZWZzL3RhZ3MvJHtyZWZ9IgorCQkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkJICAgIGNvbnRpbnVlCisJCWVsc2UKKwkJICAgIGNhc2UgIiRyZWYiIGluCisJCSAgICB0YWcpCisJCQl0YWdfanVzdF9zZWVuPXllcworCQkJY29udGludWUKKwkJCTs7CisJCSAgICBlc2FjCisJCWZpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggIiRyZWYiCisJICAgIGRvbmUKKwkgICAgOzsKKwllc2FjCit9CisKK3Jlc29sdmVfYWx0ZXJuYXRlcyAoKSB7CisJIyBvcmlnaW5hbCBVUkwgKHh4eC5naXQpCisJdG9wXz1gZXhwciAieiQxIiA6ICd6XChbXjpdKjovKlteL10qXCkvJ2AKKwl3aGlsZSByZWFkIHBhdGgKKwlkbworCQljYXNlICIkcGF0aCIgaW4KKwkJXCMqIHwgJycpCisJCQljb250aW51ZSA7OworCQkvKikKKwkJCWVjaG8gIiR0b3BfJHBhdGgvIiA7OworCQkuLi8qKQorCQkJIyByZWxhdGl2ZSAtLSB1Z2x5IGJ1dCBzZWVtcyB0byB3b3JrLgorCQkJZWNobyAiJDEvb2JqZWN0cy8kcGF0aC8iIDs7CisJCSopCisJCQkjIGV4aXQgY29kZSBtYXkgbm90IGJlIGNhdWdodCBieSB0aGUgcmVhZGVyLgorCQkJZWNobyAiYmFkIGFsdGVybmF0ZTogJHBhdGgiCisJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUKK30KKworZ2V0X3VwbG9hZHBhY2sgKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCWNvbmZpZykKKwkJdXBscD0kKGdpdC1jb25maWcgLS1nZXQgInJlbW90ZS4kMS51cGxvYWRwYWNrIikKKwkJZWNobyAke3VwbHA6LWdpdC11cGxvYWQtcGFja30KKwkJOzsKKwkqKQorCQllY2hvICJnaXQtdXBsb2FkLXBhY2siCisJCTs7CisJZXNhYworfQpkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwuc2ggYi9naXQtcHVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzY2NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXB1bGwuc2gKQEAgLTAsMCArMSwxMjAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgRmV0Y2ggb25lIG9yIG1vcmUgcmVtb3RlIHJlZnMgYW5kIG1lcmdlIGl0L3RoZW0gaW50byB0aGUgY3VycmVudCBIRUFELgorCitVU0FHRT0nWy1uIHwgLS1uby1zdW1tYXJ5XSBbLS1uby1jb21taXRdIFstcyBzdHJhdGVneV0uLi4gWzxmZXRjaC1vcHRpb25zPl0gPHJlcG8+IDxoZWFkPi4uLicKK0xPTkdfVVNBR0U9J0ZldGNoIG9uZSBvciBtb3JlIHJlbW90ZSByZWZzIGFuZCBtZXJnZSBpdC90aGVtIGludG8gdGhlIGN1cnJlbnQgSEVBRC4nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorc2V0X3JlZmxvZ19hY3Rpb24gInB1bGwgJCoiCityZXF1aXJlX3dvcmtfdHJlZQorY2RfdG9fdG9wbGV2ZWwKKwordGVzdCAteiAiJChnaXQgbHMtZmlsZXMgLXUpIiB8fAorCWRpZSAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS4iCisKK3N0cmF0ZWd5X2FyZ3M9IG5vX3N1bW1hcnk9IG5vX2NvbW1pdD0gc3F1YXNoPQord2hpbGUgY2FzZSAiJCMsJDEiIGluIDApIGJyZWFrIDs7ICosLSopIDs7ICopIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1ufC0tbm98LS1uby18LS1uby1zfC0tbm8tc3V8LS1uby1zdW18LS1uby1zdW1tfFwKKwkJLS1uby1zdW1tYXwtLW5vLXN1bW1hcnwtLW5vLXN1bW1hcnkpCisJCW5vX3N1bW1hcnk9LW4gOzsKKwktLW5vLWN8LS1uby1jb3wtLW5vLWNvbXwtLW5vLWNvbW18LS1uby1jb21taXwtLW5vLWNvbW1pdCkKKwkJbm9fY29tbWl0PS0tbm8tY29tbWl0IDs7CisJLS1zcXwtLXNxdXwtLXNxdWF8LS1zcXVhc3wtLXNxdWFzaCkKKwkJc3F1YXNoPS0tc3F1YXNoIDs7CisJLXM9KnwtLXM9KnwtLXN0PSp8LS1zdHI9KnwtLXN0cmE9KnwtLXN0cmF0PSp8LS1zdHJhdGU9KnxcCisJCS0tc3RyYXRlZz0qfC0tc3RyYXRlZ3k9KnxcCisJLXN8LS1zfC0tc3R8LS1zdHJ8LS1zdHJhfC0tc3RyYXR8LS1zdHJhdGV8LS1zdHJhdGVnfC0tc3RyYXRlZ3kpCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCXN0cmF0ZWd5PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCXN0cmF0ZWd5PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJc3RyYXRlZ3lfYXJncz0iJHtzdHJhdGVneV9hcmdzfS1zICRzdHJhdGVneSAiCisJCTs7CisJLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorCQl1c2FnZQorCQk7OworCS0qKQorCQkjIFBhc3MgdGhydSBhbnl0aGluZyB0aGF0IGlzIG1lYW50IGZvciBmZXRjaC4KKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworb3JpZ19oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQorZ2l0LWZldGNoIC0tdXBkYXRlLWhlYWQtb2sgIiRAIiB8fCBleGl0IDEKKworY3Vycl9oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQoraWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCit0aGVuCisJIyBUaGUgZmV0Y2ggaW52b2x2ZWQgdXBkYXRpbmcgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisJIyBUaGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXggZmlsZSBpcyBzdGlsbCBiYXNlZCBvbiB0aGUKKwkjICRvcmlnX2hlYWQgY29tbWl0LCBidXQgd2UgYXJlIG1lcmdpbmcgaW50byAkY3Vycl9oZWFkLgorCSMgRmlyc3QgdXBkYXRlIHRoZSB3b3JraW5nIHRyZWUgdG8gbWF0Y2ggJGN1cnJfaGVhZC4KKworCWVjaG8gPiYyICJXYXJuaW5nOiBmZXRjaCB1cGRhdGVkIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiIKKwllY2hvID4mMiAiV2FybmluZzogZmFzdCBmb3J3YXJkaW5nIHlvdXIgd29ya2luZyB0cmVlIGZyb20iCisJZWNobyA+JjIgIldhcm5pbmc6IGNvbW1pdCAkb3JpZ19oZWFkLiIKKwlnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorCWdpdC1yZWFkLXRyZWUgLXUgLW0gIiRvcmlnX2hlYWQiICIkY3Vycl9oZWFkIiB8fAorCQlkaWUgJ0Nhbm5vdCBmYXN0LWZvcndhcmQgeW91ciB3b3JraW5nIHRyZWUuCitBZnRlciBtYWtpbmcgc3VyZSB0aGF0IHlvdSBzYXZlZCBhbnl0aGluZyBwcmVjaW91cyBmcm9tCiskIGdpdCBkaWZmICckb3JpZ19oZWFkJworb3V0cHV0LCBydW4KKyQgZ2l0IHJlc2V0IC0taGFyZAordG8gcmVjb3Zlci4nCisKK2ZpCisKK21lcmdlX2hlYWQ9JChzZWQgLWUgJy8Jbm90LWZvci1tZXJnZQkvZCcgXAorCS1lICdzLwkuKi8vJyAiJEdJVF9ESVIiL0ZFVENIX0hFQUQgfCBcCisJdHIgJ1wwMTInICcgJykKKworY2FzZSAiJG1lcmdlX2hlYWQiIGluCisnJykKKwljdXJyX2JyYW5jaD0kKGdpdC1zeW1ib2xpYy1yZWYgLXEgSEVBRCkKKwljYXNlICQ/IGluCisJICAwKSA7OworCSAgMSkgZWNobyA+JjIgIllvdSBhcmUgbm90IGN1cnJlbnRseSBvbiBhIGJyYW5jaDsgeW91IG11c3QgZXhwbGljaXRseSIKKwkgICAgIGVjaG8gPiYyICJzcGVjaWZ5IHdoaWNoIGJyYW5jaCB5b3Ugd2lzaCB0byBtZXJnZToiCisJICAgICBlY2hvID4mMiAiICBnaXQgcHVsbCA8cmVtb3RlPiA8YnJhbmNoPiIKKwkgICAgIGV4aXQgMTs7CisJICAqKSBleGl0ICQ/OzsKKwllc2FjCisJY3Vycl9icmFuY2g9JHtjdXJyX2JyYW5jaCNyZWZzL2hlYWRzL30KKworCWVjaG8gPiYyICJXYXJuaW5nOiBObyBtZXJnZSBjYW5kaWRhdGUgZm91bmQgYmVjYXVzZSB2YWx1ZSBvZiBjb25maWcgb3B0aW9uCisgICAgICAgICBcImJyYW5jaC4ke2N1cnJfYnJhbmNofS5tZXJnZVwiIGRvZXMgbm90IG1hdGNoIGFueSByZW1vdGUgYnJhbmNoIGZldGNoZWQuIgorCWVjaG8gPiYyICJObyBjaGFuZ2VzLiIKKwlleGl0IDAKKwk7OworPyonICc/KikKKwlpZiB0ZXN0IC16ICIkb3JpZ19oZWFkIgorCXRoZW4KKwkJZWNobyA+JjIgIkNhbm5vdCBtZXJnZSBtdWx0aXBsZSBicmFuY2hlcyBpbnRvIGVtcHR5IGhlYWQiCisJCWV4aXQgMQorCWZpCisJOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJG9yaWdfaGVhZCIKK3RoZW4KKwlnaXQtdXBkYXRlLXJlZiAtbSAiaW5pdGlhbCBwdWxsIiBIRUFEICRtZXJnZV9oZWFkICIiICYmCisJZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgfHwgZXhpdCAxCisJZXhpdAorZmkKKworbWVyZ2VfbmFtZT0kKGdpdC1mbXQtbWVyZ2UtbXNnIDwiJEdJVF9ESVIvRkVUQ0hfSEVBRCIpIHx8IGV4aXQKK2V4ZWMgZ2l0LW1lcmdlICRub19zdW1tYXJ5ICRub19jb21taXQgJHNxdWFzaCAkc3RyYXRlZ3lfYXJncyBcCisJIiRtZXJnZV9uYW1lIiBIRUFEICRtZXJnZV9oZWFkCmRpZmYgLS1naXQgYS9naXQtcXVpbHRpbXBvcnQuc2ggYi9naXQtcXVpbHRpbXBvcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdhNjc1NwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1xdWlsdGltcG9ydC5zaApAQCAtMCwwICsxLDEyMiBAQAorIyEvYmluL3NoCitVU0FHRT0nLS1kcnktcnVuIC0tYXV0aG9yIDxhdXRob3I+IC0tcGF0Y2hlcyA8L3BhdGgvdG8vcXVpbHQvcGF0Y2gvZGlyZWN0b3J5PicKK1NVQkRJUkVDVE9SWV9PTj1ZZXMKKy4gZ2l0LXNoLXNldHVwCisKK2RyeV9ydW49IiIKK3F1aWx0X2F1dGhvcj0iIgord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktLWF1PSp8LS1hdXQ9KnwtLWF1dGg9KnwtLWF1dGhvPSp8LS1hdXRob3I9KikKKwkJcXVpbHRfYXV0aG9yPSQoZXhwciAieiQxIiA6ICd6LVtePV0qXCguKlwpJykKKwkJc2hpZnQKKwkJOzsKKworCS0tYXV8LS1hdXR8LS1hdXRofC0tYXV0aG98LS1hdXRob3IpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCXF1aWx0X2F1dGhvcj0iJDEiCisJCXNoaWZ0CisJCTs7CisKKwktLWRyeS1ydW4pCisJCXNoaWZ0CisJCWRyeV9ydW49MQorCQk7OworCisJLS1wYT0qfC0tcGF0PSp8LS1wYXRjPSp8LS1wYXRjaD0qfC0tcGF0Y2hlPSp8LS1wYXRjaGVzPSopCisJCVFVSUxUX1BBVENIRVM9JChleHByICJ6JDEiIDogJ3otW149XSpcKC4qXCknKQorCQlzaGlmdAorCQk7OworCisJLS1wYXwtLXBhdHwtLXBhdGN8LS1wYXRjaHwtLXBhdGNoZXwtLXBhdGNoZXMpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCVFVSUxUX1BBVENIRVM9IiQxIgorCQlzaGlmdAorCQk7OworCisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCitkb25lCisKKyMgUXVpbHQgQXV0aG9yCitpZiBbIC1uICIkcXVpbHRfYXV0aG9yIiBdIDsgdGhlbgorCXF1aWx0X2F1dGhvcl9uYW1lPSQoZXhwciAieiRxdWlsdF9hdXRob3IiIDogJ3pcKC4qW14gXVwpICo8LionKSAmJgorCXF1aWx0X2F1dGhvcl9lbWFpbD0kKGV4cHIgInokcXVpbHRfYXV0aG9yIiA6ICcuKjxcKFtePl0qXCknKSAmJgorCXRlc3QgJycgIT0gIiRxdWlsdF9hdXRob3JfbmFtZSIgJiYKKwl0ZXN0ICcnICE9ICIkcXVpbHRfYXV0aG9yX2VtYWlsIiB8fAorCWRpZSAibWFsZm9ybWVkIC0tYXV0aG9yIHBhcmFtZXRlciIKK2ZpCisKKyMgUXVpbHQgcGF0Y2ggZGlyZWN0b3J5Cis6ICR7UVVJTFRfUEFUQ0hFUzo9cGF0Y2hlc30KK2lmICEgWyAtZCAiJFFVSUxUX1BBVENIRVMiIF0gOyB0aGVuCisJZWNobyAiVGhlIFwiJFFVSUxUX1BBVENIRVNcIiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIgorCWV4aXQgMQorZmkKKworIyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMKK3RtcF9kaXI9LmRvdGVzdAordG1wX21zZz0iJHRtcF9kaXIvbXNnIgordG1wX3BhdGNoPSIkdG1wX2Rpci9wYXRjaCIKK3RtcF9pbmZvPSIkdG1wX2Rpci9pbmZvIgorCisKKyMgRmluZCB0aGUgaW50aWFsIGNvbW1pdAorY29tbWl0PSQoZ2l0LXJldi1wYXJzZSBIRUFEKQorCitta2RpciAkdG1wX2RpciB8fCBleGl0IDIKK2ZvciBwYXRjaF9uYW1lIGluICQoY2F0ICIkUVVJTFRfUEFUQ0hFUy9zZXJpZXMiIHwgZ3JlcCAtdiAnXiMnKTsgZG8KKwllY2hvICRwYXRjaF9uYW1lCisJKGNhdCAkUVVJTFRfUEFUQ0hFUy8kcGF0Y2hfbmFtZSB8IGdpdC1tYWlsaW5mbyAiJHRtcF9tc2ciICIkdG1wX3BhdGNoIiA+ICIkdG1wX2luZm8iKSB8fCBleGl0IDMKKwl0ZXN0IC1zIC5kb3Rlc3QvcGF0Y2ggfHwgeworCQllY2hvICJQYXRjaCBpcyBlbXB0eS4gIFdhcyBpdCBzcGxpdCB3cm9uZz8iCisJCWV4aXQgMQorCX0KKworCSMgUGFyc2UgdGhlIGF1dGhvciBpbmZvcm1hdGlvbgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUU9JChzZWQgLW5lICdzL0F1dGhvcjogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0kKHNlZCAtbmUgJ3MvRW1haWw6IC8vcCcgIiR0bXBfaW5mbyIpCisJd2hpbGUgdGVzdCAteiAiJEdJVF9BVVRIT1JfRU1BSUwiICYmIHRlc3QgLXogIiRHSVRfQVVUSE9SX05BTUUiIDsgZG8KKwkJaWYgWyAtbiAiJHF1aWx0X2F1dGhvciIgXSA7IHRoZW4KKwkJCUdJVF9BVVRIT1JfTkFNRT0iJHF1aWx0X2F1dGhvcl9uYW1lIjsKKwkJCUdJVF9BVVRIT1JfRU1BSUw9IiRxdWlsdF9hdXRob3JfZW1haWwiOworCQllbGlmIFsgLW4gIiRkcnlfcnVuIiBdOyB0aGVuCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCUdJVF9BVVRIT1JfTkFNRT0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQkJR0lUX0FVVEhPUl9FTUFJTD0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQllbHNlCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCWVjaG8gIi0tLSIKKwkJCWNhdCAkdG1wX21zZworCQkJcHJpbnRmICJBdXRob3I6ICI7CisJCQlyZWFkIHBhdGNoX2F1dGhvcgorCisJCQllY2hvICIkcGF0Y2hfYXV0aG9yIgorCisJCQlwYXRjaF9hdXRob3JfbmFtZT0kKGV4cHIgInokcGF0Y2hfYXV0aG9yIiA6ICd6XCguKlteIF1cKSAqPC4qJykgJiYKKwkJCXBhdGNoX2F1dGhvcl9lbWFpbD0kKGV4cHIgInokcGF0Y2hfYXV0aG9yIiA6ICcuKjxcKFtePl0qXCknKSAmJgorCQkJdGVzdCAnJyAhPSAiJHBhdGNoX2F1dGhvcl9uYW1lIiAmJgorCQkJdGVzdCAnJyAhPSAiJHBhdGNoX2F1dGhvcl9lbWFpbCIgJiYKKwkJCUdJVF9BVVRIT1JfTkFNRT0iJHBhdGNoX2F1dGhvcl9uYW1lIiAmJgorCQkJR0lUX0FVVEhPUl9FTUFJTD0iJHBhdGNoX2F1dGhvcl9lbWFpbCIKKwkJZmkKKwlkb25lCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURT0kKHNlZCAtbmUgJ3MvRGF0ZTogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgU1VCSkVDVD0kKHNlZCAtbmUgJ3MvU3ViamVjdDogLy9wJyAiJHRtcF9pbmZvIikKKwlpZiBbIC16ICIkU1VCSkVDVCIgXSA7IHRoZW4KKwkJU1VCSkVDVD0kKGVjaG8gJHBhdGNoX25hbWUgfCBzZWQgLWUgJ3MvLnBhdGNoJC8vJykKKwlmaQorCisJaWYgWyAteiAiJGRyeV9ydW4iIF0gOyB0aGVuCisJCWdpdC1hcHBseSAtLWluZGV4IC1DMSAiJHRtcF9wYXRjaCIgJiYKKwkJdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorCQljb21taXQ9JCggKGVjaG8gIiRTVUJKRUNUIjsgZWNobzsgY2F0ICIkdG1wX21zZyIpIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRjb21taXQpICYmCisJCWdpdC11cGRhdGUtcmVmIC1tICJxdWlsdGltcG9ydDogJHBhdGNoX25hbWUiIEhFQUQgJGNvbW1pdCB8fCBleGl0IDQKKwlmaQorZG9uZQorcm0gLXJmICR0bXBfZGlyIHx8IGV4aXQgNQpkaWZmIC0tZ2l0IGEvZ2l0LXJlYmFzZS5zaCBiL2dpdC1yZWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmRjMmM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWJhc2Uuc2gKQEAgLTAsMCArMSwzNjAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8uCisjCisKK1VTQUdFPSdbLXZdIFstLW9udG8gPG5ld2Jhc2U+XSA8dXBzdHJlYW0+IFs8YnJhbmNoPl0nCitMT05HX1VTQUdFPSdnaXQtcmViYXNlIHJlcGxhY2VzIDxicmFuY2g+IHdpdGggYSBuZXcgYnJhbmNoIG9mIHRoZQorc2FtZSBuYW1lLiAgV2hlbiB0aGUgLS1vbnRvIG9wdGlvbiBpcyBwcm92aWRlZCB0aGUgbmV3IGJyYW5jaCBzdGFydHMKK291dCB3aXRoIGEgSEVBRCBlcXVhbCB0byA8bmV3YmFzZT4sIG90aGVyd2lzZSBpdCBpcyBlcXVhbCB0byA8dXBzdHJlYW0+CitJdCB0aGVuIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBjb21taXQgZm9yIGVhY2ggY29tbWl0IGZyb20gdGhlIG9yaWdpbmFsCis8YnJhbmNoPiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSA8dXBzdHJlYW0+IGJyYW5jaC4KKworSXQgaXMgcG9zc2libGUgdGhhdCBhIG1lcmdlIGZhaWx1cmUgd2lsbCBwcmV2ZW50IHRoaXMgcHJvY2VzcyBmcm9tIGJlaW5nCitjb21wbGV0ZWx5IGF1dG9tYXRpYy4gIFlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBmYWlsdXJlCithbmQgcnVuIGdpdCByZWJhc2UgLS1jb250aW51ZS4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIGJ5cGFzcyB0aGUgY29tbWl0Cit0aGF0IGNhdXNlZCB0aGUgbWVyZ2UgZmFpbHVyZSB3aXRoIGdpdCByZWJhc2UgLS1za2lwLiAgVG8gcmVzdG9yZSB0aGUKK29yaWdpbmFsIDxicmFuY2g+IGFuZCByZW1vdmUgdGhlIC5kb3Rlc3Qgd29ya2luZyBmaWxlcywgdXNlIHRoZSBjb21tYW5kCitnaXQgcmViYXNlIC0tYWJvcnQgaW5zdGVhZC4KKworTm90ZSB0aGF0IGlmIDxicmFuY2g+IGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlCitjdXJyZW50bHkgY2hlY2tlZCBvdXQgYnJhbmNoIGlzIHVzZWQuICBZb3UgbXVzdCBiZSBpbiB0aGUgdG9wCitkaXJlY3Rvcnkgb2YgeW91ciBwcm9qZWN0IHRvIHN0YXJ0IChvciBjb250aW51ZSkgYSByZWJhc2UuCisKK0V4YW1wbGU6ICAgICAgIGdpdC1yZWJhc2UgbWFzdGVyfjEgdG9waWMKKworICAgICAgICBBLS0tQi0tLUMgdG9waWMgICAgICAgICAgICAgICAgICAgQSdcJyctLUInXCcnLS1DJ1wnJyB0b3BpYworICAgICAgIC8gICAgICAgICAgICAgICAgICAgLS0+ICAgICAgICAgICAvCisgIEQtLS1FLS0tRi0tLUcgbWFzdGVyICAgICAgICAgIEQtLS1FLS0tRi0tLUcgbWFzdGVyCisnCisKK1NVQkRJUkVDVE9SWV9PSz1ZZXMKKy4gZ2l0LXNoLXNldHVwCitzZXRfcmVmbG9nX2FjdGlvbiByZWJhc2UKK3JlcXVpcmVfd29ya190cmVlCitjZF90b190b3BsZXZlbAorCitSRVNPTFZFTVNHPSIKK1doZW4geW91IGhhdmUgcmVzb2x2ZWQgdGhpcyBwcm9ibGVtIHJ1biBcImdpdCByZWJhc2UgLS1jb250aW51ZVwiLgorSWYgeW91IHdvdWxkIHByZWZlciB0byBza2lwIHRoaXMgcGF0Y2gsIGluc3RlYWQgcnVuIFwiZ2l0IHJlYmFzZSAtLXNraXBcIi4KK1RvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJyYW5jaCBhbmQgc3RvcCByZWJhc2luZyBydW4gXCJnaXQgcmViYXNlIC0tYWJvcnRcIi4KKyIKK3Vuc2V0IG5ld2Jhc2UKK3N0cmF0ZWd5PXJlY3Vyc2l2ZQorZG9fbWVyZ2U9Citkb3Rlc3Q9JEdJVF9ESVIvLmRvdGVzdC1tZXJnZQorcHJlYz00Cit2ZXJib3NlPQorZ2l0X2FtX29wdD0KKworY29udGludWVfbWVyZ2UgKCkgeworCXRlc3QgLW4gIiRwcmV2X2hlYWQiIHx8IGRpZSAicHJldl9oZWFkIG11c3QgYmUgZGVmaW5lZCIKKwl0ZXN0IC1kICIkZG90ZXN0IiB8fCBkaWUgIiRkb3Rlc3QgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IgorCisJdW5tZXJnZWQ9JChnaXQtbHMtZmlsZXMgLXUpCisJaWYgdGVzdCAtbiAiJHVubWVyZ2VkIgorCXRoZW4KKwkJZWNobyAiWW91IHN0aWxsIGhhdmUgdW5tZXJnZWQgcGF0aHMgaW4geW91ciBpbmRleCIKKwkJZWNobyAiZGlkIHlvdSBmb3JnZXQgdXBkYXRlLWluZGV4PyIKKwkJZGllICIkUkVTT0xWRU1TRyIKKwlmaQorCisJaWYgISBnaXQtZGlmZi1pbmRleCAtLXF1aWV0IEhFQUQKKwl0aGVuCisJCWlmICEgZ2l0LWNvbW1pdCAtQyAiYGNhdCAkZG90ZXN0L2N1cnJlbnRgIgorCQl0aGVuCisJCQllY2hvICJDb21taXQgZmFpbGVkLCBwbGVhc2UgZG8gbm90IGNhbGwgXCJnaXQgY29tbWl0XCIiCisJCQllY2hvICJkaXJlY3RseSwgYnV0IGluc3RlYWQgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIKKwkJCWRpZSAiJFJFU09MVkVNU0ciCisJCWZpCisJCXByaW50ZiAiQ29tbWl0dGVkOiAlMCR7cHJlY31kIiAkbXNnbnVtCisJZWxzZQorCQlwcmludGYgIkFscmVhZHkgYXBwbGllZDogJTAke3ByZWN9ZCIgJG1zZ251bQorCWZpCisJZWNobyAnICdgZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgLTEgSEVBRCB8IFwKKwkJCQlzZWQgJ3MvXlthLWYwLTldXCsgLy8nYAorCisJcHJldl9oZWFkPWBnaXQtcmV2LXBhcnNlIEhFQUReMGAKKwkjIHNhdmUgdGhlIHJlc3VsdGluZyBjb21taXQgc28gd2UgY2FuIHJlYWQtdHJlZSBvbiBpdCBsYXRlcgorCWVjaG8gIiRwcmV2X2hlYWQiID4gIiRkb3Rlc3QvcHJldl9oZWFkIgorCisJIyBvbnRvIHRoZSBuZXh0IHBhdGNoOgorCW1zZ251bT0kKCgkbXNnbnVtICsgMSkpCisJZWNobyAiJG1zZ251bSIgPiIkZG90ZXN0L21zZ251bSIKK30KKworY2FsbF9tZXJnZSAoKSB7CisJY210PSIkKGNhdCAkZG90ZXN0L2NtdC4kMSkiCisJZWNobyAiJGNtdCIgPiAiJGRvdGVzdC9jdXJyZW50IgorCWhkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCWNtdF9uYW1lPSQoZ2l0LXN5bWJvbGljLXJlZiBIRUFEKQorCW1zZ251bT0kKGNhdCAkZG90ZXN0L21zZ251bSkKKwllbmQ9JChjYXQgJGRvdGVzdC9lbmQpCisJZXZhbCBHSVRIRUFEXyRjbXQ9JyIke2NtdF9uYW1lIyNyZWZzL2hlYWRzL31+JCgoJGVuZCAtICRtc2dudW0pKSInCisJZXZhbCBHSVRIRUFEXyRoZD0nIiQoY2F0ICRkb3Rlc3Qvb250b19uYW1lKSInCisJZXhwb3J0IEdJVEhFQURfJGNtdCBHSVRIRUFEXyRoZAorCWdpdC1tZXJnZS0kc3RyYXRlZ3kgIiRjbXReIiAtLSAiJGhkIiAiJGNtdCIKKwlydj0kPworCWNhc2UgIiRydiIgaW4KKwkwKQorCQl1bnNldCBHSVRIRUFEXyRjbXQgR0lUSEVBRF8kaGQKKwkJcmV0dXJuCisJCTs7CisJMSkKKwkJdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiICYmIGdpdC1yZXJlcmUKKwkJZGllICIkUkVTT0xWRU1TRyIKKwkJOzsKKwkyKQorCQllY2hvICJTdHJhdGVneTogJHJ2ICRzdHJhdGVneSBmYWlsZWQsIHRyeSBhbm90aGVyIiAxPiYyCisJCWRpZSAiJFJFU09MVkVNU0ciCisJCTs7CisJKikKKwkJZGllICJVbmtub3duIGV4aXQgY29kZSAoJHJ2KSBmcm9tIGNvbW1hbmQ6IiBcCisJCQkiZ2l0LW1lcmdlLSRzdHJhdGVneSAkY210XiAtLSBIRUFEICRjbXQiCisJCTs7CisJZXNhYworfQorCitmaW5pc2hfcmJfbWVyZ2UgKCkgeworCXJtIC1yICIkZG90ZXN0IgorCWVjaG8gIkFsbCBkb25lLiIKK30KKword2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLS1jb250aW51ZSkKKwkJZ2l0LWRpZmYtZmlsZXMgLS1xdWlldCB8fCB7CisJCQllY2hvICJZb3UgbXVzdCBlZGl0IGFsbCBtZXJnZSBjb25mbGljdHMgYW5kIHRoZW4iCisJCQllY2hvICJtYXJrIHRoZW0gYXMgcmVzb2x2ZWQgdXNpbmcgZ2l0IHVwZGF0ZS1pbmRleCIKKwkJCWV4aXQgMQorCQl9CisJCWlmIHRlc3QgLWQgIiRkb3Rlc3QiCisJCXRoZW4KKwkJCXByZXZfaGVhZD0iYGNhdCAkZG90ZXN0L3ByZXZfaGVhZGAiCisJCQllbmQ9ImBjYXQgJGRvdGVzdC9lbmRgIgorCQkJbXNnbnVtPSJgY2F0ICRkb3Rlc3QvbXNnbnVtYCIKKwkJCW9udG89ImBjYXQgJGRvdGVzdC9vbnRvYCIKKwkJCWNvbnRpbnVlX21lcmdlCisJCQl3aGlsZSB0ZXN0ICIkbXNnbnVtIiAtbGUgIiRlbmQiCisJCQlkbworCQkJCWNhbGxfbWVyZ2UgIiRtc2dudW0iCisJCQkJY29udGludWVfbWVyZ2UKKwkJCWRvbmUKKwkJCWZpbmlzaF9yYl9tZXJnZQorCQkJZXhpdAorCQlmaQorCQlnaXQgYW0gLS1yZXNvbHZlZCAtLTN3YXkgLS1yZXNvbHZlbXNnPSIkUkVTT0xWRU1TRyIKKwkJZXhpdAorCQk7OworCS0tc2tpcCkKKwkJaWYgdGVzdCAtZCAiJGRvdGVzdCIKKwkJdGhlbgorCQkJaWYgdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiCisJCQl0aGVuCisJCQkJZ2l0LXJlcmVyZSBjbGVhcgorCQkJZmkKKwkJCXByZXZfaGVhZD0iYGNhdCAkZG90ZXN0L3ByZXZfaGVhZGAiCisJCQllbmQ9ImBjYXQgJGRvdGVzdC9lbmRgIgorCQkJbXNnbnVtPSJgY2F0ICRkb3Rlc3QvbXNnbnVtYCIKKwkJCW1zZ251bT0kKCgkbXNnbnVtICsgMSkpCisJCQlvbnRvPSJgY2F0ICRkb3Rlc3Qvb250b2AiCisJCQl3aGlsZSB0ZXN0ICIkbXNnbnVtIiAtbGUgIiRlbmQiCisJCQlkbworCQkJCWNhbGxfbWVyZ2UgIiRtc2dudW0iCisJCQkJY29udGludWVfbWVyZ2UKKwkJCWRvbmUKKwkJCWZpbmlzaF9yYl9tZXJnZQorCQkJZXhpdAorCQlmaQorCQlnaXQgYW0gLTMgLS1za2lwIC0tcmVzb2x2ZW1zZz0iJFJFU09MVkVNU0ciCisJCWV4aXQKKwkJOzsKKwktLWFib3J0KQorCQlpZiB0ZXN0IC1kICIkR0lUX0RJUi9yci1jYWNoZSIKKwkJdGhlbgorCQkJZ2l0LXJlcmVyZSBjbGVhcgorCQlmaQorCQlpZiB0ZXN0IC1kICIkZG90ZXN0IgorCQl0aGVuCisJCQlybSAtciAiJGRvdGVzdCIKKwkJZWxpZiB0ZXN0IC1kIC5kb3Rlc3QKKwkJdGhlbgorCQkJcm0gLXIgLmRvdGVzdAorCQllbHNlCisJCQlkaWUgIk5vIHJlYmFzZSBpbiBwcm9ncmVzcz8iCisJCWZpCisJCWdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFECisJCWV4aXQKKwkJOzsKKwktLW9udG8pCisJCXRlc3QgMiAtbGUgIiQjIiB8fCB1c2FnZQorCQluZXdiYXNlPSIkMiIKKwkJc2hpZnQKKwkJOzsKKwktTXwtbXwtLW18LS1tZXwtLW1lcnwtLW1lcmd8LS1tZXJnZSkKKwkJZG9fbWVyZ2U9dAorCQk7OworCS1zPSp8LS1zPSp8LS1zdD0qfC0tc3RyPSp8LS1zdHJhPSp8LS1zdHJhdD0qfC0tc3RyYXRlPSp8XAorCQktLXN0cmF0ZWc9KnwtLXN0cmF0ZWd5PSp8XAorCS1zfC0tc3wtLXN0fC0tc3RyfC0tc3RyYXwtLXN0cmF0fC0tc3RyYXRlfC0tc3RyYXRlZ3wtLXN0cmF0ZWd5KQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlzdHJhdGVneT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgIDs7CisJCTEsKikKKwkJCXVzYWdlIDs7CisJCSopCisJCQlzdHJhdGVneT0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCWRvX21lcmdlPXQKKwkJOzsKKwktdnwtLXZlcmJvc2UpCisJCXZlcmJvc2U9dAorCQk7OworCS1DKikKKwkJZ2l0X2FtX29wdD0kMQorCQlzaGlmdAorCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKKyMgTWFrZSBzdXJlIHdlIGRvIG5vdCBoYXZlIC5kb3Rlc3QKK2lmIHRlc3QgLXogIiRkb19tZXJnZSIKK3RoZW4KKwlpZiBta2RpciAuZG90ZXN0CisJdGhlbgorCQlybWRpciAuZG90ZXN0CisJZWxzZQorCQllY2hvID4mMiAnCitJdCBzZWVtcyB0aGF0IEkgY2Fubm90IGNyZWF0ZSBhIC5kb3Rlc3QgZGlyZWN0b3J5LCBhbmQgSSB3b25kZXIgaWYgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBwYXRjaCBhcHBsaWNhdGlvbiBvciBhbm90aGVyIHJlYmFzZS4gIElmIHRoYXQgaXMgbm90Cit0aGUgY2FzZSwgcGxlYXNlIHJtIC1mciAuZG90ZXN0IGFuZCBydW4gbWUgYWdhaW4uICBJIGFtIHN0b3BwaW5nIGluIGNhc2UKK3lvdSBzdGlsbCBoYXZlIHNvbWV0aGluZyB2YWx1YWJsZSB0aGVyZS4nCisJCWV4aXQgMQorCWZpCitlbHNlCisJaWYgdGVzdCAtZCAiJGRvdGVzdCIKKwl0aGVuCisJCWRpZSAicHJldmlvdXMgZG90ZXN0IGRpcmVjdG9yeSAkZG90ZXN0IHN0aWxsIGV4aXN0cy4iIFwKKwkJCSd0cnkgZ2l0LXJlYmFzZSA8IC0tY29udGludWUgfCAtLWFib3J0ID4nCisJZmkKK2ZpCisKKyMgVGhlIHRyZWUgbXVzdCBiZSByZWFsbHkgcmVhbGx5IGNsZWFuLgorZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggfHwgZXhpdAorZGlmZj0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1zdGF0dXMgLXIgSEVBRCkKK2Nhc2UgIiRkaWZmIiBpbgorPyopCWVjaG8gImNhbm5vdCByZWJhc2U6IHlvdXIgaW5kZXggaXMgbm90IHVwLXRvLWRhdGUiCisJZWNobyAiJGRpZmYiCisJZXhpdCAxCisJOzsKK2VzYWMKKworIyBUaGUgdXBzdHJlYW0gaGVhZCBtdXN0IGJlIGdpdmVuLiAgTWFrZSBzdXJlIGl0IGlzIHZhbGlkLgordXBzdHJlYW1fbmFtZT0iJDEiCit1cHN0cmVhbT1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHt1cHN0cmVhbV9uYW1lfV4wImAgfHwKKyAgICBkaWUgImludmFsaWQgdXBzdHJlYW0gJHVwc3RyZWFtX25hbWUiCisKKyMgTWFrZSBzdXJlIHRoZSBicmFuY2ggdG8gcmViYXNlIG9udG8gaXMgdmFsaWQuCitvbnRvX25hbWU9JHtuZXdiYXNlLSIkdXBzdHJlYW1fbmFtZSJ9CitvbnRvPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHtvbnRvX25hbWV9XjAiKSB8fCBleGl0CisKKyMgSWYgYSBob29rIGV4aXN0cywgZ2l2ZSBpdCBhIGNoYW5jZSB0byBpbnRlcnJ1cHQKK2lmIHRlc3QgLXggIiRHSVRfRElSL2hvb2tzL3ByZS1yZWJhc2UiCit0aGVuCisJIiRHSVRfRElSL2hvb2tzL3ByZS1yZWJhc2UiICR7MSsiJEAifSB8fCB7CisJCWVjaG8gPiYyICJUaGUgcHJlLXJlYmFzZSBob29rIHJlZnVzZWQgdG8gcmViYXNlLiIKKwkJZXhpdCAxCisJfQorZmkKKworIyBJZiB0aGUgYnJhbmNoIHRvIHJlYmFzZSBpcyBnaXZlbiwgZmlyc3Qgc3dpdGNoIHRvIGl0LgorY2FzZSAiJCMiIGluCisyKQorCWJyYW5jaF9uYW1lPSIkMiIKKwlnaXQtY2hlY2tvdXQgIiQyIiB8fCB1c2FnZQorCTs7CisqKQorCWlmIGJyYW5jaF9uYW1lPWBnaXQgc3ltYm9saWMtcmVmIC1xIEhFQURgCisJdGhlbgorCQlicmFuY2hfbmFtZT1gZXhwciAieiRicmFuY2hfbmFtZSIgOiAnenJlZnMvaGVhZHMvXCguKlwpJ2AKKwllbHNlCisJCWJyYW5jaF9uYW1lPUhFQUQgOyMgZGV0YWNoZWQKKwlmaQorCTs7Citlc2FjCiticmFuY2g9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIke2JyYW5jaF9uYW1lfV4wIikgfHwgZXhpdAorCisjIE5vdyB3ZSBhcmUgcmViYXNpbmcgY29tbWl0cyAkdXBzdHJlYW0uLiRicmFuY2ggb24gdG9wIG9mICRvbnRvCisKKyMgQ2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgYmFzZWQgb24gJG9udG8sIGJ1dCB0aGlzIHNob3VsZCBiZQorIyBkb25lIG9ubHkgd2hlbiB1cHN0cmVhbSBhbmQgb250byBhcmUgdGhlIHNhbWUuCittYj0kKGdpdC1tZXJnZS1iYXNlICIkb250byIgIiRicmFuY2giKQoraWYgdGVzdCAiJHVwc3RyZWFtIiA9ICIkb250byIgJiYgdGVzdCAiJG1iIiA9ICIkb250byIKK3RoZW4KKwllY2hvID4mMiAiQ3VycmVudCBicmFuY2ggJGJyYW5jaF9uYW1lIGlzIHVwIHRvIGRhdGUuIgorCWV4aXQgMAorZmkKKworaWYgdGVzdCAtbiAiJHZlcmJvc2UiCit0aGVuCisJZWNobyAiQ2hhbmdlcyBmcm9tICRtYiB0byAkb250bzoiCisJZ2l0LWRpZmYtdHJlZSAtLXN0YXQgLS1zdW1tYXJ5ICIkbWIiICIkb250byIKK2ZpCisKKyMgUmV3aW5kIHRoZSBoZWFkIHRvICIkb250byI7IHRoaXMgc2F2ZXMgb3VyIGN1cnJlbnQgaGVhZCBpbiBPUklHX0hFQUQuCitlY2hvICJGaXJzdCwgcmV3aW5kaW5nIGhlYWQgdG8gcmVwbGF5IHlvdXIgd29yayBvbiB0b3Agb2YgaXQuLi4iCitnaXQtcmVzZXQgLS1oYXJkICIkb250byIKKworIyBJZiB0aGUgJG9udG8gaXMgYSBwcm9wZXIgZGVzY2VuZGFudCBvZiB0aGUgdGlwIG9mIHRoZSBicmFuY2gsIHRoZW4KKyMgd2UganVzdCBmYXN0IGZvcndhcmRlZC4KK2lmIHRlc3QgIiRtYiIgPSAiJGJyYW5jaCIKK3RoZW4KKwllY2hvID4mMiAiRmFzdC1mb3J3YXJkZWQgJGJyYW5jaF9uYW1lIHRvICRvbnRvX25hbWUuIgorCWV4aXQgMAorZmkKKworaWYgdGVzdCAteiAiJGRvX21lcmdlIgordGhlbgorCWdpdC1mb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgLS1mdWxsLWluZGV4IC0taWdub3JlLWlmLWluLXVwc3RyZWFtICIkdXBzdHJlYW0iLi5PUklHX0hFQUQgfAorCWdpdCBhbSAkZ2l0X2FtX29wdCAtLWJpbmFyeSAtMyAtayAtLXJlc29sdmVtc2c9IiRSRVNPTFZFTVNHIgorCWV4aXQgJD8KK2ZpCisKKyMgc3RhcnQgZG9pbmcgYSByZWJhc2Ugd2l0aCBnaXQtbWVyZ2UKKyMgdGhpcyBpcyByZW5hbWUtYXdhcmUgaWYgdGhlIHJlY3Vyc2l2ZSAoZGVmYXVsdCkgc3RyYXRlZ3kgaXMgdXNlZAorCitta2RpciAtcCAiJGRvdGVzdCIKK2VjaG8gIiRvbnRvIiA+ICIkZG90ZXN0L29udG8iCitlY2hvICIkb250b19uYW1lIiA+ICIkZG90ZXN0L29udG9fbmFtZSIKK3ByZXZfaGVhZD1gZ2l0LXJldi1wYXJzZSBIRUFEXjBgCitlY2hvICIkcHJldl9oZWFkIiA+ICIkZG90ZXN0L3ByZXZfaGVhZCIKKworbXNnbnVtPTAKK2ZvciBjbXQgaW4gYGdpdC1yZXYtbGlzdCAtLXJldmVyc2UgLS1uby1tZXJnZXMgIiR1cHN0cmVhbSIuLk9SSUdfSEVBRGAKK2RvCisJbXNnbnVtPSQoKCRtc2dudW0gKyAxKSkKKwllY2hvICIkY210IiA+ICIkZG90ZXN0L2NtdC4kbXNnbnVtIgorZG9uZQorCitlY2hvIDEgPiIkZG90ZXN0L21zZ251bSIKK2VjaG8gJG1zZ251bSA+IiRkb3Rlc3QvZW5kIgorCitlbmQ9JG1zZ251bQorbXNnbnVtPTEKKword2hpbGUgdGVzdCAiJG1zZ251bSIgLWxlICIkZW5kIgorZG8KKwljYWxsX21lcmdlICIkbXNnbnVtIgorCWNvbnRpbnVlX21lcmdlCitkb25lCisKK2ZpbmlzaF9yYl9tZXJnZQpkaWZmIC0tZ2l0IGEvZ2l0LXJlbGluay5wZXJsIGIvZ2l0LXJlbGluay5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2YjRmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVsaW5rLnBlcmwKQEAgLTAsMCArMSwxNzMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMgQ29weXJpZ2h0IDIwMDUsIFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjIERpc3RyaWJ1dGlvbiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdQTCB2MiwgYXMgZGlzdHJpYnV0ZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgTGF0ZXIgdmVyc2lvbnMgb2YgdGhlIEdQTCBhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cyBUb3J2YWxkcworIworIyBTY2FuIHR3byBnaXQgb2JqZWN0LXRyZWVzLCBhbmQgaGFyZGxpbmsgYW55IGNvbW1vbiBvYmplY3RzIGJldHdlZW4gdGhlbS4KKwordXNlIDUuMDA2OwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6Okxvbmc7CisKK3N1YiBnZXRfY2Fub25pY2FsX2Zvcm0oJCk7CitzdWIgZG9fc2Nhbl9kaXJlY3RvcnkoJCQkKTsKK3N1YiBjb21wYXJlX3R3b19maWxlcygkJCk7CitzdWIgdXNhZ2UoKTsKK3N1YiBsaW5rX3R3b19maWxlcygkJCk7CisKKyMgc3RhdHMKK215ICR0b3RhbF9saW5rZWQgPSAwOworbXkgJHRvdGFsX2FscmVhZHkgPSAwOworbXkgKCRsaW5rZWQsJGFscmVhZHkpOworCitteSAkZmFpbF9vbl9kaWZmZXJlbnRfc2l6ZXMgPSAwOworbXkgJGhlbHAgPSAwOworR2V0T3B0aW9ucygic2FmZSIgPT4gXCRmYWlsX29uX2RpZmZlcmVudF9zaXplcywKKwkgICAiaGVscCIgPT4gXCRoZWxwKTsKKwordXNhZ2UoKSBpZiAkaGVscDsKKworbXkgKEBkaXJzKSA9IEBBUkdWOworCit1c2FnZSgpIGlmICghZGVmaW5lZCAkZGlyc1swXSB8fCAhZGVmaW5lZCAkZGlyc1sxXSk7CisKKyRfID0gZ2V0X2Nhbm9uaWNhbF9mb3JtKCRfKSBmb3JlYWNoIChAZGlycyk7CisKK215ICRtYXN0ZXJfZGlyID0gcG9wIEBkaXJzOworCitvcGVuZGlyKEQsJG1hc3Rlcl9kaXIgLiAib2JqZWN0cy8iKQorCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gJG1hc3Rlcl9kaXIvb2JqZWN0cy8gOiAkISI7CisKK215IEBoYXNoZGlycyA9IGdyZXAgIS9eXC57MSwyfSQvLCByZWFkZGlyKEQpOworCitmb3JlYWNoIG15ICRyZXBvIChAZGlycykgeworCSRsaW5rZWQgPSAwOworCSRhbHJlYWR5ID0gMDsKKwlwcmludGYoIlNlYXJjaGluZyAnJXMnIGFuZCAnJXMnIGZvciBjb21tb24gb2JqZWN0cyBhbmQgaGFyZGxpbmtpbmcgdGhlbS4uLlxuIiwKKwkJJG1hc3Rlcl9kaXIsJHJlcG8pOworCisJZm9yZWFjaCBteSAkaGFzaGRpciAoQGhhc2hkaXJzKSB7CisJCWRvX3NjYW5fZGlyZWN0b3J5KCRtYXN0ZXJfZGlyLCAkaGFzaGRpciwgJHJlcG8pOworCX0KKworCXByaW50ZigiTGlua2VkICVkIGZpbGVzLCAlZCB3ZXJlIGFscmVhZHkgbGlua2VkLlxuIiwkbGlua2VkLCAkYWxyZWFkeSk7CisKKwkkdG90YWxfbGlua2VkICs9ICRsaW5rZWQ7CisJJHRvdGFsX2FscmVhZHkgKz0gJGFscmVhZHk7Cit9CisKK3ByaW50ZigiVG90YWxzOiBMaW5rZWQgJWQgZmlsZXMsICVkIHdlcmUgYWxyZWFkeSBsaW5rZWQuXG4iLAorCSR0b3RhbF9saW5rZWQsICR0b3RhbF9hbHJlYWR5KTsKKworCitzdWIgZG9fc2Nhbl9kaXJlY3RvcnkoJCQkKSB7CisJbXkgKCRzcmNkaXIsICRzdWJkaXIsICRkc3RkaXIpID0gQF87CisKKwlteSAkc2Z1bGxkaXIgPSBzcHJpbnRmKCIlc29iamVjdHMvJXMvIiwkc3JjZGlyLCRzdWJkaXIpOworCW15ICRkZnVsbGRpciA9IHNwcmludGYoIiVzb2JqZWN0cy8lcy8iLCRkc3RkaXIsJHN1YmRpcik7CisKKwlvcGVuZGlyKFMsJHNmdWxsZGlyKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuZGlyICRzZnVsbGRpcjogJCEiOworCisJZm9yZWFjaCBteSAkZmlsZSAoZ3JlcCghL1wuezEsMn0kLywgcmVhZGRpcihTKSkpIHsKKwkJbXkgJHNmaWxlbmFtZSA9ICRzZnVsbGRpciAuICRmaWxlOworCQlteSAkZGZpbGVuYW1lID0gJGRmdWxsZGlyIC4gJGZpbGU7CisKKwkJY29tcGFyZV90d29fZmlsZXMoJHNmaWxlbmFtZSwkZGZpbGVuYW1lKTsKKworCX0KKwljbG9zZWRpcihTKTsKK30KKworc3ViIGNvbXBhcmVfdHdvX2ZpbGVzKCQkKSB7CisJbXkgKCRzZmlsZW5hbWUsICRkZmlsZW5hbWUpID0gQF87CisKKwkjIFBlcmwncyBzdGF0IHJldHVybnMgcmVsZXZhbnQgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKwkjIDAgPSBkZXYgbnVtYmVyCisJIyAxID0gaW5vZGUgbnVtYmVyCisJIyA3ID0gc2l6ZQorCW15IEBzc3RhdGluZm8gPSBzdGF0KCRzZmlsZW5hbWUpOworCW15IEBkc3RhdGluZm8gPSBzdGF0KCRkZmlsZW5hbWUpOworCisJaWYgKEBzc3RhdGluZm8gPT0gMCAmJiBAZHN0YXRpbmZvID09IDApIHsKKwkJZGllIHNwcmludGYoIlN0YXQgb2YgYm90aCAlcyBhbmQgJXMgZmFpbGVkOiAlc1xuIiwkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lLCAkISk7CisKKwl9IGVsc2lmIChAZHN0YXRpbmZvID09IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmICggKCRzc3RhdGluZm9bMF0gPT0gJGRzdGF0aW5mb1swXSkgJiYKKwkgICAgICgkc3N0YXRpbmZvWzFdICE9ICRkc3RhdGluZm9bMV0pKSB7CisJCWlmICgkc3N0YXRpbmZvWzddID09ICRkc3RhdGluZm9bN10pIHsKKwkJCWxpbmtfdHdvX2ZpbGVzKCRzZmlsZW5hbWUsICRkZmlsZW5hbWUpOworCisJCX0gZWxzZSB7CisJCQlteSAkZXJyID0gc3ByaW50ZigiRVJST1I6IEZpbGUgc2l6ZXMgYXJlIG5vdCB0aGUgc2FtZSwgY2Fubm90IHJlbGluayAlcyB0byAlcy5cbiIsCisJCQkJJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSk7CisJCQlpZiAoJGZhaWxfb25fZGlmZmVyZW50X3NpemVzKSB7CisJCQkJZGllICRlcnI7CisJCQl9IGVsc2UgeworCQkJCXdhcm4gJGVycjsKKwkJCX0KKwkJfQorCisJfSBlbHNpZiAoICgkc3N0YXRpbmZvWzBdID09ICRkc3RhdGluZm9bMF0pICYmCisJICAgICAoJHNzdGF0aW5mb1sxXSA9PSAkZHN0YXRpbmZvWzFdKSkgeworCQkkYWxyZWFkeSsrOworCX0KK30KKworc3ViIGdldF9jYW5vbmljYWxfZm9ybSgkKSB7CisJbXkgJGRpciA9IHNoaWZ0OworCW15ICRvcmlnaW5hbCA9ICRkaXI7CisKKwlkaWUgIiRkaXIgaXMgbm90IGEgZGlyZWN0b3J5LiIgdW5sZXNzIC1kICRkaXI7CisKKwkkZGlyIC49ICIvIiB1bmxlc3MgJGRpciA9fiBtIy8kIzsKKwkkZGlyIC49ICIuZ2l0LyIgdW5sZXNzICRkaXIgPX4gbSNcLmdpdC8kIzsKKworCWRpZSAiJG9yaWdpbmFsIGRvZXMgbm90IGhhdmUgYSAuZ2l0LyBzdWJkaXJlY3RvcnkuXG4iIHVubGVzcyAtZCAkZGlyOworCisJcmV0dXJuICRkaXI7Cit9CisKK3N1YiBsaW5rX3R3b19maWxlcygkJCkgeworCW15ICgkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lKSA9IEBfOworCW15ICR0bXBkbmFtZSA9IHNwcmludGYoIiVzLm9sZCIsJGRmaWxlbmFtZSk7CisJcmVuYW1lKCRkZmlsZW5hbWUsJHRtcGRuYW1lKQorCQlvciBkaWUgc3ByaW50ZigiRmFpbHVyZSByZW5hbWluZyAlcyB0byAlczogJXMiLAorCQkJJGRmaWxlbmFtZSwgJHRtcGRuYW1lLCAkISk7CisKKwlpZiAoISBsaW5rKCRzZmlsZW5hbWUsJGRmaWxlbmFtZSkpIHsKKwkJbXkgJGZhaWx0eHQgPSAiIjsKKwkJdW5sZXNzIChyZW5hbWUoJHRtcGRuYW1lLCRkZmlsZW5hbWUpKSB7CisJCQkkZmFpbHR4dCA9IHNwcmludGYoCisJCQkJIkdpdCBSZXBvc2l0b3J5IGNvbnRhaW5pbmcgJXMgaXMgcHJvYmFibHkgY29ycnVwdGVkLCAiIC4KKwkJCQkicGxlYXNlIGNvcHkgJyVzJyB0byAnJXMnIHRvIGZpeC5cbiIsCisJCQkJJHRtcGRuYW1lLCAkZGZpbGVuYW1lKTsKKwkJfQorCisJCWRpZSBzcHJpbnRmKCJGYWlsZWQgdG8gbGluayAlcyB0byAlczogJXNcbiVzIiAuCisJCQkkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lLAorCQkJJCEsICRkZmlsZW5hbWUsICRmYWlsdHh0KTsKKwl9CisKKwl1bmxpbmsoJHRtcGRuYW1lKQorCQlvciBkaWUgc3ByaW50ZigiVW5saW5rIG9mICVzIGZhaWxlZDogJXNcbiIsCisJCQkkZGZpbGVuYW1lLCAkISk7CisKKwkkbGlua2VkKys7Cit9CisKKworc3ViIHVzYWdlKCkgeworCXByaW50KCJVc2FnZTogJDAgWy0tc2FmZV0gPGRpcj4gWzxkaXI+IC4uLl0gPG1hc3Rlcl9kaXI+IFxuIik7CisJcHJpbnQoIkFsbCBkaXJlY3RvcmllcyBzaG91bGQgY29udGFpbiBhIC5naXQvb2JqZWN0cy8gc3ViZGlyZWN0b3J5LlxuIik7CisJcHJpbnQoIk9wdGlvbnNcbiIpOworCXByaW50KCJcdC0tc2FmZVx0IiAuCisJCSJTdG9wcyBpZiB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGhhc2ggZXhpc3QgYnV0ICIgLgorCQkiaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuICBEZWZhdWx0IGlzIHRvIHdhcm4gYW5kIGNvbnRpbnVlLlxuIik7CisJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2dpdC1yZW1vdGUucGVybCBiL2dpdC1yZW1vdGUucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzYzNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJlbW90ZS5wZXJsCkBAIC0wLDAgKzEsNDEzIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIEdpdDsKK215ICRnaXQgPSBHaXQtPnJlcG9zaXRvcnkoKTsKKworc3ViIGFkZF9yZW1vdGVfY29uZmlnIHsKKwlteSAoJGhhc2gsICRuYW1lLCAkd2hhdCwgJHZhbHVlKSA9IEBfOworCWlmICgkd2hhdCBlcSAndXJsJykgeworCQlpZiAoZXhpc3RzICRoYXNoLT57JG5hbWV9eydVUkwnfSkgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBtb3JlIHRoYW4gb25lIHJlbW90ZS4kbmFtZS51cmxcbiI7CisJCX0KKwkJJGhhc2gtPnskbmFtZX17J1VSTCd9ID0gJHZhbHVlOworCX0KKwllbHNpZiAoJHdoYXQgZXEgJ2ZldGNoJykgeworCQkkaGFzaC0+eyRuYW1lfXsnRkVUQ0gnfSB8fD0gW107CisJCXB1c2ggQHskaGFzaC0+eyRuYW1lfXsnRkVUQ0gnfX0sICR2YWx1ZTsKKwl9CisJZWxzaWYgKCR3aGF0IGVxICdwdXNoJykgeworCQkkaGFzaC0+eyRuYW1lfXsnUFVTSCd9IHx8PSBbXTsKKwkJcHVzaCBAeyRoYXNoLT57JG5hbWV9eydQVVNIJ319LCAkdmFsdWU7CisJfQorCWlmICghZXhpc3RzICRoYXNoLT57JG5hbWV9eydTT1VSQ0UnfSkgeworCQkkaGFzaC0+eyRuYW1lfXsnU09VUkNFJ30gPSAnY29uZmlnJzsKKwl9Cit9CisKK3N1YiBhZGRfcmVtb3RlX3JlbW90ZXMgeworCW15ICgkaGFzaCwgJGZpbGUsICRuYW1lKSA9IEBfOworCisJaWYgKGV4aXN0cyAkaGFzaC0+eyRuYW1lfSkgeworCQkkaGFzaC0+eyRuYW1lfXsnV0FSTklORyd9ID0gJ2lnbm9yZWQgZHVlIHRvIGNvbmZpZyc7CisJCXJldHVybjsKKwl9CisKKwlteSAkZmg7CisJaWYgKCFvcGVuKCRmaCwgJzwnLCAkZmlsZSkpIHsKKwkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBjYW5ub3Qgb3BlbiAkZmlsZVxuIjsKKwkJcmV0dXJuOworCX0KKwlteSAkaXQgPSB7ICdTT1VSQ0UnID0+ICdyZW1vdGVzJyB9OworCSRoYXNoLT57JG5hbWV9ID0gJGl0OworCXdoaWxlICg8JGZoPikgeworCQljaG9tcDsKKwkJaWYgKC9eVVJMOlxzKiguKikkLykgeworCQkJIyBIYXZpbmcgbW9yZSB0aGFuIG9uZSBpcyBPayAtLSBpdCBpcyB1c2VkIGZvciBwdXNoLgorCQkJaWYgKCEgZXhpc3RzICRpdC0+eydVUkwnfSkgeworCQkJCSRpdC0+eydVUkwnfSA9ICQxOworCQkJfQorCQl9CisJCWVsc2lmICgvXlB1c2g6XHMqKC4qKSQvKSB7CisJCQkkaXQtPnsnUFVTSCd9IHx8PSBbXTsKKwkJCXB1c2ggQHskaXQtPnsnUFVTSCd9fSwgJDE7CisJCX0KKwkJZWxzaWYgKC9eUHVsbDpccyooLiopJC8pIHsKKwkJCSRpdC0+eydGRVRDSCd9IHx8PSBbXTsKKwkJCXB1c2ggQHskaXQtPnsnRkVUQ0gnfX0sICQxOworCQl9CisJCWVsc2lmICgvXlwjLykgeworCQkJOyAjIGlnbm9yZQorCQl9CisJCWVsc2UgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBmdW5ueSBsaW5lIGluICRmaWxlOiAkX1xuIjsKKwkJfQorCX0KKwljbG9zZSgkZmgpOworfQorCitzdWIgbGlzdF9yZW1vdGUgeworCW15ICgkZ2l0KSA9IEBfOworCW15ICVzZWVuID0gKCk7CisJbXkgQHJlbW90ZXMgPSBldmFsIHsKKwkJJGdpdC0+Y29tbWFuZChxdyhjb25maWcgLS1nZXQtcmVnZXhwKSwgJ15yZW1vdGVcLicpOworCX07CisJZm9yIChAcmVtb3RlcykgeworCQlpZiAoL15yZW1vdGVcLihcUys/KVwuKFteLlxzXSspXHMrKC4qKSQvKSB7CisJCQlhZGRfcmVtb3RlX2NvbmZpZyhcJXNlZW4sICQxLCAkMiwgJDMpOworCQl9CisJfQorCisJbXkgJGRpciA9ICRnaXQtPnJlcG9fcGF0aCgpIC4gIi9yZW1vdGVzIjsKKwlpZiAob3BlbmRpcihteSAkZGgsICRkaXIpKSB7CisJCWxvY2FsICRfOworCQl3aGlsZSAoJF8gPSByZWFkZGlyKCRkaCkpIHsKKwkJCWNob21wOworCQkJbmV4dCBpZiAoISAtZiAiJGRpci8kXyIgfHwgISAtciBfKTsKKwkJCWFkZF9yZW1vdGVfcmVtb3RlcyhcJXNlZW4sICIkZGlyLyRfIiwgJF8pOworCQl9CisJfQorCisJcmV0dXJuIFwlc2VlbjsKK30KKworc3ViIGFkZF9icmFuY2hfY29uZmlnIHsKKwlteSAoJGhhc2gsICRuYW1lLCAkd2hhdCwgJHZhbHVlKSA9IEBfOworCWlmICgkd2hhdCBlcSAncmVtb3RlJykgeworCQlpZiAoZXhpc3RzICRoYXNoLT57JG5hbWV9eydSRU1PVEUnfSkgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBtb3JlIHRoYW4gb25lIGJyYW5jaC4kbmFtZS5yZW1vdGVcbiI7CisJCX0KKwkJJGhhc2gtPnskbmFtZX17J1JFTU9URSd9ID0gJHZhbHVlOworCX0KKwllbHNpZiAoJHdoYXQgZXEgJ21lcmdlJykgeworCQkkaGFzaC0+eyRuYW1lfXsnTUVSR0UnfSB8fD0gW107CisJCXB1c2ggQHskaGFzaC0+eyRuYW1lfXsnTUVSR0UnfX0sICR2YWx1ZTsKKwl9Cit9CisKK3N1YiBsaXN0X2JyYW5jaCB7CisJbXkgKCRnaXQpID0gQF87CisJbXkgJXNlZW4gPSAoKTsKKwlteSBAYnJhbmNoZXMgPSBldmFsIHsKKwkJJGdpdC0+Y29tbWFuZChxdyhjb25maWcgLS1nZXQtcmVnZXhwKSwgJ15icmFuY2hcLicpOworCX07CisJZm9yIChAYnJhbmNoZXMpIHsKKwkJaWYgKC9eYnJhbmNoXC4oW14uXSopXC4oXFMqKVxzKyguKikkLykgeworCQkJYWRkX2JyYW5jaF9jb25maWcoXCVzZWVuLCAkMSwgJDIsICQzKTsKKwkJfQorCX0KKworCXJldHVybiBcJXNlZW47Cit9CisKK215ICRyZW1vdGUgPSBsaXN0X3JlbW90ZSgkZ2l0KTsKK215ICRicmFuY2ggPSBsaXN0X2JyYW5jaCgkZ2l0KTsKKworc3ViIHVwZGF0ZV9sc19yZW1vdGUgeworCW15ICgkaGFyZGVyLCAkaW5mbykgPSBAXzsKKworCXJldHVybiBpZiAoKCRoYXJkZXIgPT0gMCkgfHwKKwkJICAgKCgkaGFyZGVyID09IDEpICYmIGV4aXN0cyAkaW5mby0+eydMU19SRU1PVEUnfSkpOworCisJbXkgQHJlZiA9IG1hcCB7CisJCXN8XlswLTlhLWZdezQwfVxzK3JlZnMvaGVhZHMvfHw7CisJCSRfOworCX0gJGdpdC0+Y29tbWFuZChxdyhscy1yZW1vdGUgLS1oZWFkcyksICRpbmZvLT57J1VSTCd9KTsKKwkkaW5mby0+eydMU19SRU1PVEUnfSA9IFxAcmVmOworfQorCitzdWIgbGlzdF93aWxkY2FyZF9tYXBwaW5nIHsKKwlteSAoJGZvcmNlZCwgJG91cnMsICRscykgPSBAXzsKKwlteSAlcmVmczsKKwlmb3IgKEAkbHMpIHsKKwkJJHJlZnN7JF99ID0gMDE7ICMgYml0ICMwIHRvIHNheSAidGhleSBoYXZlIgorCX0KKwlmb3IgKCRnaXQtPmNvbW1hbmQoJ2Zvci1lYWNoLXJlZicsICJyZWZzL3JlbW90ZXMvJG91cnMiKSkgeworCQljaG9tcDsKKwkJbmV4dCB1bmxlc3MgKHN8XlswLTlhLWZdezQwfVxzW2Etel0rXHNyZWZzL3JlbW90ZXMvJG91cnMvfHwpOworCQluZXh0IGlmICgkXyBlcSAnSEVBRCcpOworCQkkcmVmc3skX30gfHw9IDA7CisJCSRyZWZzeyRffSB8PSAwMjsgIyBiaXQgIzEgdG8gc2F5ICJ3ZSBoYXZlIgorCX0KKwlteSAoQG5ldywgQHN0YWxlLCBAdHJhY2tlZCk7CisJZm9yIChzb3J0IGtleXMgJXJlZnMpIHsKKwkJbXkgJGhhdmUgPSAkcmVmc3skX307CisJCWlmICgkaGF2ZSA9PSAxKSB7CisJCQlwdXNoIEBuZXcsICRfOworCQl9CisJCWVsc2lmICgkaGF2ZSA9PSAyKSB7CisJCQlwdXNoIEBzdGFsZSwgJF87CisJCX0KKwkJZWxzaWYgKCRoYXZlID09IDMpIHsKKwkJCXB1c2ggQHRyYWNrZWQsICRfOworCQl9CisJfQorCXJldHVybiBcQG5ldywgXEBzdGFsZSwgXEB0cmFja2VkOworfQorCitzdWIgbGlzdF9tYXBwaW5nIHsKKwlteSAoJG5hbWUsICRpbmZvKSA9IEBfOworCW15ICRmZXRjaCA9ICRpbmZvLT57J0ZFVENIJ307CisJbXkgJGxzID0gJGluZm8tPnsnTFNfUkVNT1RFJ307CisJbXkgKEBuZXcsIEBzdGFsZSwgQHRyYWNrZWQpOworCisJZm9yIChAJGZldGNoKSB7CisJCW5leHQgdW5sZXNzICgvKFwrKT8oW146XSspOiguKikvKTsKKwkJbXkgKCRmb3JjZWQsICR0aGVpcnMsICRvdXJzKSA9ICgkMSwgJDIsICQzKTsKKwkJaWYgKCR0aGVpcnMgZXEgJ3JlZnMvaGVhZHMvKicgJiYKKwkJICAgICRvdXJzID1+IC9ecmVmc1wvcmVtb3Rlc1wvKC4qKVwvXCokLykgeworCQkJIyB3aWxkY2FyZCBtYXBwaW5nCisJCQlteSAoJHdfbmV3LCAkd19zdGFsZSwgJHdfdHJhY2tlZCkKKwkJCQk9IGxpc3Rfd2lsZGNhcmRfbWFwcGluZygkZm9yY2VkLCAkMSwgJGxzKTsKKwkJCXB1c2ggQG5ldywgQCR3X25ldzsKKwkJCXB1c2ggQHN0YWxlLCBAJHdfc3RhbGU7CisJCQlwdXNoIEB0cmFja2VkLCBAJHdfdHJhY2tlZDsKKwkJfQorCQllbHNpZiAoJHRoZWlycyA9fiAvXCovIHx8ICRvdXJzID1+IC9cKi8pIHsKKwkJCXByaW50IFNUREVSUiAiV2FybmluZzogdW5yZWNvZ25pemVkIG1hcHBpbmcgaW4gcmVtb3Rlcy4kbmFtZS5mZXRjaDogJF9cbiI7CisJCX0KKwkJZWxzaWYgKCR0aGVpcnMgPX4gc3xecmVmcy9oZWFkcy98fCkgeworCQkJaWYgKCFncmVwIHsgJF8gZXEgJHRoZWlycyB9IEAkbHMpIHsKKwkJCQlwdXNoIEBzdGFsZSwgJHRoZWlyczsKKwkJCX0KKwkJCWVsc2lmICgkb3VycyBuZSAnJykgeworCQkJCXB1c2ggQHRyYWNrZWQsICR0aGVpcnM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIFxAbmV3LCBcQHN0YWxlLCBcQHRyYWNrZWQ7Cit9CisKK3N1YiBzaG93X21hcHBpbmcgeworCW15ICgkbmFtZSwgJGluZm8pID0gQF87CisJbXkgKCRuZXcsICRzdGFsZSwgJHRyYWNrZWQpID0gbGlzdF9tYXBwaW5nKCRuYW1lLCAkaW5mbyk7CisJaWYgKEAkbmV3KSB7CisJCXByaW50ICIgIE5ldyByZW1vdGUgYnJhbmNoZXMgKG5leHQgZmV0Y2ggd2lsbCBzdG9yZSBpbiByZW1vdGVzLyRuYW1lKVxuIjsKKwkJcHJpbnQgIiAgICBAJG5ld1xuIjsKKwl9CisJaWYgKEAkc3RhbGUpIHsKKwkJcHJpbnQgIiAgU3RhbGUgdHJhY2tpbmcgYnJhbmNoZXMgaW4gcmVtb3Rlcy8kbmFtZSAodXNlICdnaXQgcmVtb3RlIHBydW5lJylcbiI7CisJCXByaW50ICIgICAgQCRzdGFsZVxuIjsKKwl9CisJaWYgKEAkdHJhY2tlZCkgeworCQlwcmludCAiICBUcmFja2VkIHJlbW90ZSBicmFuY2hlc1xuIjsKKwkJcHJpbnQgIiAgICBAJHRyYWNrZWRcbiI7CisJfQorfQorCitzdWIgcHJ1bmVfcmVtb3RlIHsKKwlteSAoJG5hbWUsICRsc19yZW1vdGUpID0gQF87CisJaWYgKCFleGlzdHMgJHJlbW90ZS0+eyRuYW1lfSkgeworCQlwcmludCBTVERFUlIgIk5vIHN1Y2ggcmVtb3RlICRuYW1lXG4iOworCQlyZXR1cm47CisJfQorCW15ICRpbmZvID0gJHJlbW90ZS0+eyRuYW1lfTsKKwl1cGRhdGVfbHNfcmVtb3RlKCRsc19yZW1vdGUsICRpbmZvKTsKKworCW15ICgkbmV3LCAkc3RhbGUsICR0cmFja2VkKSA9IGxpc3RfbWFwcGluZygkbmFtZSwgJGluZm8pOworCW15ICRwcmVmaXggPSAicmVmcy9yZW1vdGVzLyRuYW1lIjsKKwlmb3JlYWNoIG15ICR0b19wcnVuZSAoQCRzdGFsZSkgeworCQlteSBAdiA9ICRnaXQtPmNvbW1hbmQocXcocmV2LXBhcnNlIC0tdmVyaWZ5KSwgIiRwcmVmaXgvJHRvX3BydW5lIik7CisJCSRnaXQtPmNvbW1hbmQocXcodXBkYXRlLXJlZiAtZCksICIkcHJlZml4LyR0b19wcnVuZSIsICR2WzBdKTsKKwl9Cit9CisKK3N1YiBzaG93X3JlbW90ZSB7CisJbXkgKCRuYW1lLCAkbHNfcmVtb3RlKSA9IEBfOworCWlmICghZXhpc3RzICRyZW1vdGUtPnskbmFtZX0pIHsKKwkJcHJpbnQgU1RERVJSICJObyBzdWNoIHJlbW90ZSAkbmFtZVxuIjsKKwkJcmV0dXJuOworCX0KKwlteSAkaW5mbyA9ICRyZW1vdGUtPnskbmFtZX07CisJdXBkYXRlX2xzX3JlbW90ZSgkbHNfcmVtb3RlLCAkaW5mbyk7CisKKwlwcmludCAiKiByZW1vdGUgJG5hbWVcbiI7CisJcHJpbnQgIiAgVVJMOiAkaW5mby0+eydVUkwnfVxuIjsKKwlmb3IgbXkgJGJyYW5jaG5hbWUgKHNvcnQga2V5cyAlJGJyYW5jaCkgeworCQluZXh0IGlmICgkYnJhbmNoLT57JGJyYW5jaG5hbWV9eydSRU1PVEUnfSBuZSAkbmFtZSk7CisJCW15IEBtZXJnZWQgPSBtYXAgeworCQkJc3xecmVmcy9oZWFkcy98fDsKKwkJCSRfOworCQl9IHNwbGl0KCcgJywiQHskYnJhbmNoLT57JGJyYW5jaG5hbWV9eydNRVJHRSd9fSIpOworCQluZXh0IHVubGVzcyAoQG1lcmdlZCk7CisJCXByaW50ICIgIFJlbW90ZSBicmFuY2goZXMpIG1lcmdlZCB3aXRoICdnaXQgcHVsbCcgd2hpbGUgb24gYnJhbmNoICRicmFuY2huYW1lXG4iOworCQlwcmludCAiICAgIEBtZXJnZWRcbiI7CisJfQorCWlmICgkaW5mby0+eydMU19SRU1PVEUnfSkgeworCQlzaG93X21hcHBpbmcoJG5hbWUsICRpbmZvKTsKKwl9CisJaWYgKCRpbmZvLT57J1BVU0gnfSkgeworCQlteSBAcHVzaGVkID0gbWFwIHsKKwkJCXN8XnJlZnMvaGVhZHMvfHw7CisJCQlzfDpyZWZzL2hlYWRzL3w6fDsKKwkJCSRfOworCQl9IEB7JGluZm8tPnsnUFVTSCd9fTsKKwkJcHJpbnQgIiAgTG9jYWwgYnJhbmNoKGVzKSBwdXNoZWQgd2l0aCAnZ2l0IHB1c2gnXG4iOworCQlwcmludCAiICAgIEBwdXNoZWRcbiI7CisJfQorfQorCitzdWIgYWRkX3JlbW90ZSB7CisJbXkgKCRuYW1lLCAkdXJsLCAkb3B0cykgPSBAXzsKKwlpZiAoZXhpc3RzICRyZW1vdGUtPnskbmFtZX0pIHsKKwkJcHJpbnQgU1RERVJSICJyZW1vdGUgJG5hbWUgYWxyZWFkeSBleGlzdHMuXG4iOworCQlleGl0KDEpOworCX0KKwkkZ2l0LT5jb21tYW5kKCdjb25maWcnLCAicmVtb3RlLiRuYW1lLnVybCIsICR1cmwpOworCW15ICR0cmFjayA9ICRvcHRzLT57J3RyYWNrJ30gfHwgWyIqIl07CisKKwlmb3IgKEAkdHJhY2spIHsKKwkJJGdpdC0+Y29tbWFuZCgnY29uZmlnJywgJy0tYWRkJywgInJlbW90ZS4kbmFtZS5mZXRjaCIsCisJCQkgICAgICAiK3JlZnMvaGVhZHMvJF86cmVmcy9yZW1vdGVzLyRuYW1lLyRfIik7CisJfQorCWlmICgkb3B0cy0+eydmZXRjaCd9KSB7CisJCSRnaXQtPmNvbW1hbmQoJ2ZldGNoJywgJG5hbWUpOworCX0KKwlpZiAoZXhpc3RzICRvcHRzLT57J21hc3Rlcid9KSB7CisJCSRnaXQtPmNvbW1hbmQoJ3N5bWJvbGljLXJlZicsICJyZWZzL3JlbW90ZXMvJG5hbWUvSEVBRCIsCisJCQkgICAgICAicmVmcy9yZW1vdGVzLyRuYW1lLyRvcHRzLT57J21hc3Rlcid9Iik7CisJfQorfQorCitzdWIgdXBkYXRlX3JlbW90ZSB7CisJbXkgKCRuYW1lKSA9IEBfOworCisgICAgICAgIG15ICRjb25mID0gJGdpdC0+Y29uZmlnKCJyZW1vdGVzLiIgLiAkbmFtZSk7CisJaWYgKGRlZmluZWQoJGNvbmYpKSB7CisJCUByZW1vdGVzID0gc3BsaXQoJyAnLCAkY29uZik7CisJfSBlbHNpZiAoJG5hbWUgZXEgJ2RlZmF1bHQnKSB7CisJCXVuZGVmIEByZW1vdGVzOworCQlmb3IgKHNvcnQga2V5cyAlJHJlbW90ZSkgeworCQkJbXkgJGRvX2ZldGNoID0gJGdpdC0+Y29uZmlnX2Jvb2woInJlbW90ZS4iIC4gJF8gLgorCQkJCQkJICAgICIuc2tpcERlZmF1bHRVcGRhdGUiKTsKKwkJCXVubGVzcyAoJGRvX2ZldGNoKSB7CisJCQkJcHVzaCBAcmVtb3RlcywgJF87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwcmludCBTVERFUlIgIlJlbW90ZSBncm91cCAkbmFtZSBkb2VzIG5vdCBleGlzdHMuXG4iOworCQlleGl0KDEpOworCX0KKwlmb3IgKEByZW1vdGVzKSB7CisJCXByaW50ICJVcGRhdGluZyAkX1xuIjsKKwkJJGdpdC0+Y29tbWFuZCgnZmV0Y2gnLCAiJF8iKTsKKwl9Cit9CisKK3N1YiBhZGRfdXNhZ2UgeworCXByaW50IFNUREVSUiAiVXNhZ2U6IGdpdCByZW1vdGUgYWRkIFstZl0gWy10IHRyYWNrXSogWy1tIG1hc3Rlcl0gPG5hbWU+IDx1cmw+XG4iOworCWV4aXQoMSk7Cit9CisKK2lmICghQEFSR1YpIHsKKwlmb3IgKHNvcnQga2V5cyAlJHJlbW90ZSkgeworCQlwcmludCAiJF9cbiI7CisJfQorfQorZWxzaWYgKCRBUkdWWzBdIGVxICdzaG93JykgeworCW15ICRsc19yZW1vdGUgPSAxOworCW15ICRpOworCWZvciAoJGkgPSAxOyAkaSA8IEBBUkdWOyAkaSsrKSB7CisJCWlmICgkQVJHVlskaV0gZXEgJy1uJykgeworCQkJJGxzX3JlbW90ZSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlsYXN0OworCQl9CisJfQorCWlmICgkaSA+PSBAQVJHVikgeworCQlwcmludCBTVERFUlIgIlVzYWdlOiBnaXQgcmVtb3RlIHNob3cgPHJlbW90ZT5cbiI7CisJCWV4aXQoMSk7CisJfQorCWZvciAoOyAkaSA8IEBBUkdWOyAkaSsrKSB7CisJCXNob3dfcmVtb3RlKCRBUkdWWyRpXSwgJGxzX3JlbW90ZSk7CisJfQorfQorZWxzaWYgKCRBUkdWWzBdIGVxICd1cGRhdGUnKSB7CisJaWYgKEBBUkdWIDw9IDEpIHsKKwkJdXBkYXRlX3JlbW90ZSgiZGVmYXVsdCIpOworCQlleGl0KDEpOworCX0KKwlmb3IgKCRpID0gMTsgJGkgPCBAQVJHVjsgJGkrKykgeworCQl1cGRhdGVfcmVtb3RlKCRBUkdWWyRpXSk7CisJfQorfQorZWxzaWYgKCRBUkdWWzBdIGVxICdwcnVuZScpIHsKKwlteSAkbHNfcmVtb3RlID0gMTsKKwlteSAkaTsKKwlmb3IgKCRpID0gMTsgJGkgPCBAQVJHVjsgJGkrKykgeworCQlpZiAoJEFSR1ZbJGldIGVxICctbicpIHsKKwkJCSRsc19yZW1vdGUgPSAwOworCQl9CisJCWVsc2UgeworCQkJbGFzdDsKKwkJfQorCX0KKwlpZiAoJGkgPj0gQEFSR1YpIHsKKwkJcHJpbnQgU1RERVJSICJVc2FnZTogZ2l0IHJlbW90ZSBwcnVuZSA8cmVtb3RlPlxuIjsKKwkJZXhpdCgxKTsKKwl9CisJZm9yICg7ICRpIDwgQEFSR1Y7ICRpKyspIHsKKwkJcHJ1bmVfcmVtb3RlKCRBUkdWWyRpXSwgJGxzX3JlbW90ZSk7CisJfQorfQorZWxzaWYgKCRBUkdWWzBdIGVxICdhZGQnKSB7CisJbXkgJW9wdHMgPSAoKTsKKwl3aGlsZSAoMSA8IEBBUkdWICYmICRBUkdWWzFdID1+IC9eLS8pIHsKKwkJbXkgJG9wdCA9ICRBUkdWWzFdOworCQlzaGlmdCBAQVJHVjsKKwkJaWYgKCRvcHQgZXEgJy1mJyB8fCAkb3B0IGVxICctLWZldGNoJykgeworCQkJJG9wdHN7J2ZldGNoJ30gPSAxOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJG9wdCBlcSAnLXQnIHx8ICRvcHQgZXEgJy0tdHJhY2snKSB7CisJCQlpZiAoQEFSR1YgPCAxKSB7CisJCQkJYWRkX3VzYWdlKCk7CisJCQl9CisJCQkkb3B0c3sndHJhY2snfSB8fD0gW107CisJCQlwdXNoIEB7JG9wdHN7J3RyYWNrJ319LCAkQVJHVlsxXTsKKwkJCXNoaWZ0IEBBUkdWOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJG9wdCBlcSAnLW0nIHx8ICRvcHQgZXEgJy0tbWFzdGVyJykgeworCQkJaWYgKChAQVJHViA8IDEpIHx8IGV4aXN0cyAkb3B0c3snbWFzdGVyJ30pIHsKKwkJCQlhZGRfdXNhZ2UoKTsKKwkJCX0KKwkJCSRvcHRzeydtYXN0ZXInfSA9ICRBUkdWWzFdOworCQkJc2hpZnQgQEFSR1Y7CisJCQluZXh0OworCQl9CisJCWFkZF91c2FnZSgpOworCX0KKwlpZiAoQEFSR1YgIT0gMykgeworCQlhZGRfdXNhZ2UoKTsKKwl9CisJYWRkX3JlbW90ZSgkQVJHVlsxXSwgJEFSR1ZbMl0sIFwlb3B0cyk7Cit9CitlbHNlIHsKKwlwcmludCBTVERFUlIgIlVzYWdlOiBnaXQgcmVtb3RlXG4iOworCXByaW50IFNUREVSUiAiICAgICAgIGdpdCByZW1vdGUgYWRkIDxuYW1lPiA8dXJsPlxuIjsKKwlwcmludCBTVERFUlIgIiAgICAgICBnaXQgcmVtb3RlIHNob3cgPG5hbWU+XG4iOworCXByaW50IFNUREVSUiAiICAgICAgIGdpdCByZW1vdGUgcHJ1bmUgPG5hbWU+XG4iOworCXByaW50IFNUREVSUiAiICAgICAgIGdpdCByZW1vdGUgdXBkYXRlIFtncm91cF1cbiI7CisJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2dpdC1yZXBhY2suc2ggYi9naXQtcmVwYWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkZmE4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVwYWNrLnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisjCisKK1VTQUdFPSdbLWFdIFstZF0gWy1mXSBbLWxdIFstbl0gWy1xXSBbLS13aW5kb3c9Tl0gWy0tZGVwdGg9Tl0nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK25vX3VwZGF0ZV9pbmZvPSBhbGxfaW50b19vbmU9IHJlbW92ZV9yZWR1bmRhbnQ9Citsb2NhbD0gcXVpZXQ9IG5vX3JldXNlX2RlbHRhPSBleHRyYT0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1uKQlub191cGRhdGVfaW5mbz10IDs7CisJLWEpCWFsbF9pbnRvX29uZT10IDs7CisJLWQpCXJlbW92ZV9yZWR1bmRhbnQ9dCA7OworCS1xKQlxdWlldD0tcSA7OworCS1mKQlub19yZXVzZV9kZWx0YT0tLW5vLXJldXNlLWRlbHRhIDs7CisJLWwpCWxvY2FsPS0tbG9jYWwgOzsKKwktLXdpbmRvdz0qKSBleHRyYT0iJGV4dHJhICQxIiA7OworCS0tZGVwdGg9KikgZXh0cmE9IiRleHRyYSAkMSIgOzsKKwkqKQl1c2FnZSA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCisjIExhdGVyIHdlIHdpbGwgZGVmYXVsdCByZXBhY2suVXNlRGVsdGFCYXNlT2Zmc2V0IHRvIHRydWUKK2RlZmF1bHRfZGJvPWZhbHNlCisKK2Nhc2UgImBnaXQgY29uZmlnIC0tYm9vbCByZXBhY2sudXNlZGVsdGFiYXNlb2Zmc2V0IHx8CisgICAgICAgZWNobyAkZGVmYXVsdF9kYm9gIiBpbgordHJ1ZSkKKwlleHRyYT0iJGV4dHJhIC0tZGVsdGEtYmFzZS1vZmZzZXQiIDs7Citlc2FjCisKK1BBQ0tESVI9IiRHSVRfT0JKRUNUX0RJUkVDVE9SWS9wYWNrIgorUEFDS1RNUD0iJEdJVF9ESVIvLnRtcC0kJC1wYWNrIgorcm0gLWYgIiRQQUNLVE1QIi0qCit0cmFwICdybSAtZiAiJFBBQ0tUTVAiLSonIDAgMSAyIDMgMTUKKworIyBUaGVyZSB3aWxsIGJlIG1vcmUgcmVwYWNraW5nIHN0cmF0ZWdpZXMgdG8gY29tZS4uLgorY2FzZSAiLCRhbGxfaW50b19vbmUsIiBpbgorLCwpCisJYXJncz0nLS11bnBhY2tlZCAtLWluY3JlbWVudGFsJworCTs7CissdCwpCisJaWYgWyAtZCAiJFBBQ0tESVIiIF07IHRoZW4KKwkJZm9yIGUgaW4gYGNkICIkUEFDS0RJUiIgJiYgZmluZCAuIC10eXBlIGYgLW5hbWUgJyoucGFjaycgXAorCQkJfCBzZWQgLWUgJ3MvXlwuXC8vLycgLWUgJ3MvXC5wYWNrJC8vJ2AKKwkJZG8KKwkJCWlmIFsgLWUgIiRQQUNLRElSLyRlLmtlZXAiIF07IHRoZW4KKwkJCQk6IGtlZXAKKwkJCWVsc2UKKwkJCQlhcmdzPSIkYXJncyAtLXVucGFja2VkPSRlLnBhY2siCisJCQkJZXhpc3Rpbmc9IiRleGlzdGluZyAkZSIKKwkJCWZpCisJCWRvbmUKKwlmaQorCVsgLXogIiRhcmdzIiBdICYmIGFyZ3M9Jy0tdW5wYWNrZWQgLS1pbmNyZW1lbnRhbCcKKwk7OworZXNhYworCithcmdzPSIkYXJncyAkbG9jYWwgJHF1aWV0ICRub19yZXVzZV9kZWx0YSRleHRyYSIKK25hbWU9JChnaXQtcGFjay1vYmplY3RzIC0tbm9uLWVtcHR5IC0tYWxsIC0tcmVmbG9nICRhcmdzIDwvZGV2L251bGwgIiRQQUNLVE1QIikgfHwKKwlleGl0IDEKK2lmIFsgLXogIiRuYW1lIiBdOyB0aGVuCisJZWNobyBOb3RoaW5nIG5ldyB0byBwYWNrLgorZWxzZQorCWNobW9kIGEtdyAiJFBBQ0tUTVAtJG5hbWUucGFjayIKKwljaG1vZCBhLXcgIiRQQUNLVE1QLSRuYW1lLmlkeCIKKwlpZiB0ZXN0ICIkcXVpZXQiICE9ICctcSc7IHRoZW4KKwkgICAgZWNobyAiUGFjayBwYWNrLSRuYW1lIGNyZWF0ZWQuIgorCWZpCisJbWtkaXIgLXAgIiRQQUNLRElSIiB8fCBleGl0CisKKwlmb3Igc2Z4IGluIHBhY2sgaWR4CisJZG8KKwkJaWYgdGVzdCAtZiAiJFBBQ0tESVIvcGFjay0kbmFtZS4kc2Z4IgorCQl0aGVuCisJCQltdiAtZiAiJFBBQ0tESVIvcGFjay0kbmFtZS4kc2Z4IiBcCisJCQkJIiRQQUNLRElSL29sZC1wYWNrLSRuYW1lLiRzZngiCisJCWZpCisJZG9uZSAmJgorCW12IC1mICIkUEFDS1RNUC0kbmFtZS5wYWNrIiAiJFBBQ0tESVIvcGFjay0kbmFtZS5wYWNrIiAmJgorCW12IC1mICIkUEFDS1RNUC0kbmFtZS5pZHgiICAiJFBBQ0tESVIvcGFjay0kbmFtZS5pZHgiICYmCisJdGVzdCAtZiAiJFBBQ0tESVIvcGFjay0kbmFtZS5wYWNrIiAmJgorCXRlc3QgLWYgIiRQQUNLRElSL3BhY2stJG5hbWUuaWR4IiB8fCB7CisJCWVjaG8gPiYyICJDb3VsZG4ndCByZXBsYWNlIHRoZSBleGlzdGluZyBwYWNrIHdpdGggdXBkYXRlZCBvbmUuIgorCQllY2hvID4mMiAiVGhlIG9yaWdpbmFsIHNldCBvZiBwYWNrcyBoYXZlIGJlZW4gc2F2ZWQgYXMiCisJCWVjaG8gPiYyICJvbGQtcGFjay0kbmFtZS57cGFjayxpZHh9IGluICRQQUNLRElSLiIKKwkJZXhpdCAxCisJfQorCXJtIC1mICIkUEFDS0RJUi9vbGQtcGFjay0kbmFtZS5wYWNrIiAiJFBBQ0tESVIvb2xkLXBhY2stJG5hbWUuaWR4IgorZmkKKworaWYgdGVzdCAiJHJlbW92ZV9yZWR1bmRhbnQiID0gdAordGhlbgorCSMgV2Uga25vdyAkZXhpc3RpbmcgYXJlIGFsbCByZWR1bmRhbnQuCisJaWYgWyAtbiAiJGV4aXN0aW5nIiBdCisJdGhlbgorCQlzeW5jCisJCSggY2QgIiRQQUNLRElSIiAmJgorCQkgIGZvciBlIGluICRleGlzdGluZworCQkgIGRvCisJCQljYXNlICIkZSIgaW4KKwkJCXBhY2stJG5hbWUpIDs7CisJCQkqKQlybSAtZiAiJGUucGFjayIgIiRlLmlkeCIgIiRlLmtlZXAiIDs7CisJCQllc2FjCisJCSAgZG9uZQorCQkpCisJZmkKKwlnaXQtcHJ1bmUtcGFja2VkICRxdWlldAorZmkKKworY2FzZSAiJG5vX3VwZGF0ZV9pbmZvIiBpbgordCkgOiA7OworKikgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyA7OworZXNhYwpkaWZmIC0tZ2l0IGEvZ2l0LXJlcXVlc3QtcHVsbC5zaCBiL2dpdC1yZXF1ZXN0LXB1bGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmE1NzdkNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXF1ZXN0LXB1bGwuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoIC1lCisjIENvcHlyaWdodCAyMDA1LCBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisjIGF0IHRoZSBkaXNjcmV0aW9uIG9mIExpbnVzIFRvcnZhbGRzLgorCitVU0FHRT0nPGNvbW1pdD4gPHVybD4gWzxoZWFkPl0nCitMT05HX1VTQUdFPSdTdW1tYXJpemVzIHRoZSBjaGFuZ2VzIHNpbmNlIDxjb21taXQ+IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsCithbmQgaW5jbHVkZXMgPHVybD4gaW4gdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkLicKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworLiBnaXQtc2gtc2V0dXAKKy4gZ2l0LXBhcnNlLXJlbW90ZQorCitiYXNlPSQxCit1cmw9JDIKK2hlYWQ9JHszLUhFQUR9CisKK1sgIiRiYXNlIiBdIHx8IHVzYWdlCitbICIkdXJsIiBdIHx8IHVzYWdlCisKK2Jhc2VyZXY9YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRiYXNlIl4wYCAmJgoraGVhZHJldj1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGhlYWQiXjBgIHx8IGV4aXQKKworbWVyZ2VfYmFzZT1gZ2l0IG1lcmdlLWJhc2UgJGJhc2VyZXYgJGhlYWRyZXZgIHx8CitkaWUgImZhdGFsOiBObyBjb21taXRzIGluIGNvbW1vbiBiZXR3ZWVuICRiYXNlIGFuZCAkaGVhZCIKKwordXJsPSJgZ2V0X3JlbW90ZV91cmwgIiR1cmwiYCIKK2JyYW5jaD1gZ2l0IHBlZWstcmVtb3RlICIkdXJsIiBcCisJfCBzZWQgLW4gLWUgIi9eJGhlYWRyZXYJcmVmcy5oZWFkcy4veworCQlzL14uKglyZWZzLmhlYWRzLi8vCisJCXAKKwkJcQorCX0iYAoraWYgWyAteiAiJGJyYW5jaCIgXTsgdGhlbgorCWVjaG8gIndhcm46IE5vIGJyYW5jaCBvZiAkdXJsIGlzIGF0OiIgPiYyCisJZ2l0IGxvZyAtLW1heC1jb3VudD0xIC0tcHJldHR5PSdmb3JtYXQ6d2FybjogICAlaDogJXMnICRoZWFkcmV2ID4mMgorCWVjaG8gIndhcm46IEFyZSB5b3Ugc3VyZSB5b3UgcHVzaGVkICRoZWFkIHRoZXJlPyIgPiYyCisJZWNobyA+JjIKKwllY2hvID4mMgorCWJyYW5jaD0uLkJSQU5DSC5OT1QuVkVSSUZJRUQuLgorCXN0YXR1cz0xCitmaQorCitQQUdFUj0KK2V4cG9ydCBQQUdFUgorZWNobyAiVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHNpbmNlIGNvbW1pdCAkYmFzZXJldjoiCitnaXQgc2hvcnRsb2cgLS1tYXgtY291bnQ9MSAkYmFzZXJldiB8IHNlZCAtZSAncy9eXCguXCkvICBcMS8nCisKK2VjaG8gImFyZSBhdmFpbGFibGUgaW4gdGhlIGdpdCByZXBvc2l0b3J5IGF0OiIKK2VjaG8KK2VjaG8gIiAgJHVybCAkYnJhbmNoIgorZWNobworCitnaXQgc2hvcnRsb2cgXiRiYXNlcmV2ICRoZWFkcmV2CitnaXQgZGlmZiAtTSAtLXN0YXQgLS1zdW1tYXJ5ICRtZXJnZV9iYXNlICRoZWFkcmV2CitleGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL2dpdC1yZXNldC5zaCBiL2dpdC1yZXNldC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTcyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJlc2V0LnNoCkBAIC0wLDAgKzEsMTA2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IExpbnVzIFRvcnZhbGRzIGFuZCBKdW5pbyBDIEhhbWFubworIworVVNBR0U9J1stLW1peGVkIHwgLS1zb2Z0IHwgLS1oYXJkXSAgWzxjb21taXQtaXNoPl0gWyBbLS1dIDxwYXRocz4uLi5dJworU1VCRElSRUNUT1JZX09LPVllcworLiBnaXQtc2gtc2V0dXAKK3NldF9yZWZsb2dfYWN0aW9uICJyZXNldCAkKiIKK3JlcXVpcmVfd29ya190cmVlCisKK3VwZGF0ZT0gcmVzZXRfdHlwZT0tLW1peGVkCit1bnNldCByZXYKKword2hpbGUgY2FzZSAkIyBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS0tbWl4ZWQgfCAtLXNvZnQgfCAtLWhhcmQpCisJCXJlc2V0X3R5cGU9IiQxIgorCQk7OworCS0tKQorCQlicmVhaworCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCXJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxIikgfHwgZXhpdAorCQlzaGlmdAorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCis6ICR7cmV2PUhFQUR9CityZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICRyZXZeMCkgfHwgZXhpdAorCisjIFNraXAgLS0gaW4gImdpdCByZXNldCBIRUFEIC0tIGZvbyIgYW5kICJnaXQgcmVzZXQgLS0gZm9vIi4KK2Nhc2UgIiQxIiBpbiAtLSkgc2hpZnQgOzsgZXNhYworCisjIGdpdCByZXNldCAtLW1peGVkIHRyZWUgWy0tXSBwYXRocy4uLiBjYW4gYmUgdXNlZCB0bworIyBsb2FkIGNob3NlbiBwYXRocyBmcm9tIHRoZSB0cmVlIGludG8gdGhlIGluZGV4IHdpdGhvdXQKKyMgYWZmZWN0aW5nIHRoZSB3b3JraW5nIHRyZWUgbm9yIEhFQUQuCitpZiB0ZXN0ICQjICE9IDAKK3RoZW4KKwl0ZXN0ICIkcmVzZXRfdHlwZSIgPSAiLS1taXhlZCIgfHwKKwkJZGllICJDYW5ub3QgZG8gcGFydGlhbCAkcmVzZXRfdHlwZSByZXNldC4iCisKKwlnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkcmV2IC0tICIkQCIgfAorCXNlZCAtZSAncy9eOlwoWzAtN11bMC03XSpcKSBbMC03XVswLTddKiBcKFswLTlhLWZdWzAtOWEtZl0qXCkgWzAtOWEtZl1bMC05YS1mXSogW0EtWl0JXCguKlwpJC9cMSBcMglcMy8nIHwKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIC0taW5kZXgtaW5mbyB8fCBleGl0CisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2gKKwlleGl0CitmaQorCitjZF90b190b3BsZXZlbAorCitpZiB0ZXN0ICIkcmVzZXRfdHlwZSIgPSAiLS1oYXJkIgordGhlbgorCXVwZGF0ZT0tdQorZmkKKworIyBTb2Z0IHJlc2V0IGRvZXMgbm90IHRvdWNoIHRoZSBpbmRleCBmaWxlIG5vciB0aGUgd29ya2luZyB0cmVlCisjIGF0IGFsbCwgYnV0IHJlcXVpcmVzIHRoZW0gaW4gYSBnb29kIG9yZGVyLiAgT3RoZXIgcmVzZXRzIHJlc2V0CisjIHRoZSBpbmRleCBmaWxlIHRvIHRoZSB0cmVlIG9iamVjdCB3ZSBhcmUgc3dpdGNoaW5nIHRvLgoraWYgdGVzdCAiJHJlc2V0X3R5cGUiID0gIi0tc29mdCIKK3RoZW4KKwlpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiB8fAorCSAgIHRlc3QgIiIgIT0gIiQoZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQpIgorCXRoZW4KKwkJZGllICJDYW5ub3QgZG8gYSBzb2Z0IHJlc2V0IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZS4iCisJZmkKK2Vsc2UKKwlnaXQtcmVhZC10cmVlIC12IC0tcmVzZXQgJHVwZGF0ZSAiJHJldiIgfHwgZXhpdAorZmkKKworIyBBbnkgcmVzZXRzIHVwZGF0ZSBIRUFEIHRvIHRoZSBoZWFkIGJlaW5nIHN3aXRjaGVkIHRvLgoraWYgb3JpZz0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbCkKK3RoZW4KKwllY2hvICIkb3JpZyIgPiIkR0lUX0RJUi9PUklHX0hFQUQiCitlbHNlCisJcm0gLWYgIiRHSVRfRElSL09SSUdfSEVBRCIKK2ZpCitnaXQtdXBkYXRlLXJlZiAtbSAiJEdJVF9SRUZMT0dfQUNUSU9OIiBIRUFEICIkcmV2IgordXBkYXRlX3JlZl9zdGF0dXM9JD8KKworY2FzZSAiJHJlc2V0X3R5cGUiIGluCistLWhhcmQgKQorCXRlc3QgJHVwZGF0ZV9yZWZfc3RhdHVzID0gMCAmJiB7CisJCXByaW50ZiAiSEVBRCBpcyBub3cgYXQgIgorCQlHSVRfUEFHRVI9IGdpdCBsb2cgLS1tYXgtY291bnQ9MSAtLXByZXR0eT1vbmVsaW5lIFwKKwkJCS0tYWJicmV2LWNvbW1pdCBIRUFECisJfQorCTs7CistLXNvZnQgKQorCTs7ICMgTm90aGluZyBlbHNlIHRvIGRvCistLW1peGVkICkKKwkjIFJlcG9ydCB3aGF0IGhhcyBub3QgYmVlbiB1cGRhdGVkLgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoCisJOzsKK2VzYWMKKworcm0gLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiICIkR0lUX0RJUi9yci1jYWNoZS9NRVJHRV9SUiIgXAorCSIkR0lUX0RJUi9TUVVBU0hfTVNHIiAiJEdJVF9ESVIvTUVSR0VfTVNHIgorCitleGl0ICR1cGRhdGVfcmVmX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZ2l0LXNlbmQtZW1haWwucGVybCBiL2dpdC1zZW5kLWVtYWlsLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MwYzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zZW5kLWVtYWlsLnBlcmwKQEAgLTAsMCArMSw2NTkgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBDb3B5cmlnaHQgMjAwMiwyMDA1IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisjIENvcHlyaWdodCAyMDA1IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjCisjIEdQTCB2MiAoU2VlIENPUFlJTkcpCisjCisjIFBvcnRlZCB0byBzdXBwb3J0IGdpdCAibWJveCIgZm9ybWF0IGZpbGVzIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjCisjIFNlbmRzIGEgY29sbGVjdGlvbiBvZiBlbWFpbHMgdG8gdGhlIGdpdmVuIGVtYWlsIGFkZHJlc3NlcywgZGlzdHVyYmluZ2x5IGZhc3QuCisjCisjIFN1cHBvcnRzIHR3byBmb3JtYXRzOgorIyAxLiBtYm94IGZvcm1hdCBmaWxlcyAoaWdub3JpbmcgbW9zdCBoZWFkZXJzIGFuZCBNSU1FIGZvcm1hdHRpbmcgLSB0aGlzIGlzIGRlc2lnbmVkIGZvciBzZW5kaW5nIHBhdGNoZXMpCisjIDIuIFRoZSBvcmlnaW5hbCBmb3JtYXQgc3VwcG9ydCBieSBHcmVnJ3Mgc2NyaXB0OgorIyAgICBmaXJzdCBsaW5lIG9mIHRoZSBtZXNzYWdlIGlzIHdobyB0byBDQywKKyMgICAgYW5kIHNlY29uZCBsaW5lIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBtZXNzYWdlLgorIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIFRlcm06OlJlYWRMaW5lOwordXNlIEdldG9wdDo6TG9uZzsKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgR2l0OworCitwYWNrYWdlIEZha2VUZXJtOworc3ViIG5ldyB7CisJbXkgKCRjbGFzcywgJHJlYXNvbikgPSBAXzsKKwlyZXR1cm4gYmxlc3MgXCRyZWFzb24sIHNoaWZ0OworfQorc3ViIHJlYWRsaW5lIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCWRpZSAiQ2Fubm90IHVzZSByZWFkbGluZSBvbiBGYWtlVGVybTogJCRzZWxmIjsKK30KK3BhY2thZ2UgbWFpbjsKKworCitzdWIgdXNhZ2UgeworCXByaW50IDw8RU9UOworZ2l0LXNlbmQtZW1haWwgW29wdGlvbnNdIDxmaWxlIHwgZGlyZWN0b3J5Pi4uLgorT3B0aW9uczoKKyAgIC0tZnJvbSAgICAgICAgIFNwZWNpZnkgdGhlICJGcm9tOiIgbGluZSBvZiB0aGUgZW1haWwgdG8gYmUgc2VudC4KKworICAgLS10byAgICAgICAgICAgU3BlY2lmeSB0aGUgcHJpbWFyeSAiVG86IiBsaW5lIG9mIHRoZSBlbWFpbC4KKworICAgLS1jYyAgICAgICAgICAgU3BlY2lmeSBhbiBpbml0aWFsICJDYzoiIGxpc3QgZm9yIHRoZSBlbnRpcmUgc2VyaWVzCisgICAgICAgICAgICAgICAgICBvZiBlbWFpbHMuCisKKyAgIC0tYmNjICAgICAgICAgIFNwZWNpZnkgYSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0aGF0IHNob3VsZCBiZSBCY2M6CisJCSAgb24gYWxsIHRoZSBlbWFpbHMuCisKKyAgIC0tY29tcG9zZSAgICAgIFVzZSBcJEVESVRPUiB0byBlZGl0IGFuIGludHJvZHVjdG9yeSBtZXNzYWdlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgIHBhdGNoIHNlcmllcy4KKworICAgLS1zdWJqZWN0ICAgICAgU3BlY2lmeSB0aGUgaW5pdGlhbCAiU3ViamVjdDoiIGxpbmUuCisgICAgICAgICAgICAgICAgICBPbmx5IG5lY2Vzc2FyeSBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UKKwkJICBpcyBub3Qgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCisgICAtLWluLXJlcGx5LXRvICBTcGVjaWZ5IHRoZSBmaXJzdCAiSW4tUmVwbHktVG86IiBoZWFkZXIgbGluZS4KKyAgICAgICAgICAgICAgICAgIE9ubHkgdXNlZCBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UgaXMgbm90CisJCSAgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCisgICAtLWNoYWluLXJlcGx5LXRvIElmIHNldCwgdGhlIHJlcGxpZXMgd2lsbCBhbGwgYmUgdG8gdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICBlbWFpbCBzZW50LCByYXRoZXIgdGhhbiB0byB0aGUgZmlyc3QgZW1haWwgc2VudC4KKyAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIG9uLgorCisgICAtLW5vLXNpZ25lZC1vZmYtY2MgU3VwcHJlc3MgdGhlIGF1dG9tYXRpYyBhZGRpdGlvbiBvZiBlbWFpbCBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgdGhhdCBhcHBlYXIgaW4gU2lnbmVkLW9mZi1ieTogb3IgQ2M6IGxpbmVzIHRvIHRoZSBjYzoKKyAgICAgICAgICAgICAgICAgbGlzdC4gIE5vdGU6IFVzaW5nIHRoaXMgb3B0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC4KKworICAgLS1zbXRwLXNlcnZlciAgSWYgc2V0LCBzcGVjaWZpZXMgdGhlIG91dGdvaW5nIFNNVFAgc2VydmVyIHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGxvY2FsaG9zdC4KKworICAgLS1zdXBwcmVzcy1mcm9tIFN1cHByZXNzIHNlbmRpbmcgZW1haWxzIHRvIHlvdXJzZWxmIGlmIHlvdXIgYWRkcmVzcworICAgICAgICAgICAgICAgICAgYXBwZWFycyBpbiBhIEZyb206IGxpbmUuCisKKyAgIC0tcXVpZXQJICBNYWtlIGdpdC1zZW5kLWVtYWlsIGxlc3MgdmVyYm9zZS4gIE9uZSBsaW5lIHBlciBlbWFpbAorICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGFsbCB0aGF0IGlzIG91dHB1dC4KKworICAgLS1kcnktcnVuCSAgRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0dWFsbHkgc2VuZCB0aGUgZW1haWxzLgorCisgICAtLWVudmVsb3BlLXNlbmRlcglTcGVjaWZ5IHRoZSBlbnZlbG9wZSBzZW5kZXIgdXNlZCB0byBzZW5kIHRoZSBlbWFpbHMuCisKK0VPVAorCWV4aXQoMSk7Cit9CisKKyMgbW9zdCBtYWlsIHNlcnZlcnMgZ2VuZXJhdGUgdGhlIERhdGU6IGhlYWRlciwgYnV0IG5vdCBhbGwuLi4KK3N1YiBmb3JtYXRfMjgyMl90aW1lIHsKKwlteSAoJHRpbWUpID0gQF87CisJbXkgQGxvY2FsdG0gPSBsb2NhbHRpbWUoJHRpbWUpOworCW15IEBnbXR0bSA9IGdtdGltZSgkdGltZSk7CisJbXkgJGxvY2FsbWluID0gJGxvY2FsdG1bMV0gKyAkbG9jYWx0bVsyXSAqIDYwOworCW15ICRnbXRtaW4gPSAkZ210dG1bMV0gKyAkZ210dG1bMl0gKiA2MDsKKwlpZiAoJGxvY2FsdG1bMF0gIT0gJGdtdHRtWzBdKSB7CisJCWRpZSAibG9jYWwgem9uZSBkaWZmZXJzIGZyb20gR01UIGJ5IGEgbm9uLW1pbnV0ZSBpbnRlcnZhbFxuIjsKKwl9CisJaWYgKCgoJGdtdHRtWzZdICsgMSkgJSA3KSA9PSAkbG9jYWx0bVs2XSkgeworCQkkbG9jYWxtaW4gKz0gMTQ0MDsKKwl9IGVsc2lmICgoKCRnbXR0bVs2XSAtIDEpICUgNykgPT0gJGxvY2FsdG1bNl0pIHsKKwkJJGxvY2FsbWluIC09IDE0NDA7CisJfSBlbHNpZiAoJGdtdHRtWzZdICE9ICRsb2NhbHRtWzZdKSB7CisJCWRpZSAibG9jYWwgdGltZSBvZmZzZXQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDI0IGhvdXJzXG4iOworCX0KKwlteSAkb2Zmc2V0ID0gJGxvY2FsbWluIC0gJGdtdG1pbjsKKwlteSAkb2ZmaG91ciA9ICRvZmZzZXQgLyA2MDsKKwlteSAkb2ZmbWluID0gYWJzKCRvZmZzZXQgJSA2MCk7CisJaWYgKGFicygkb2ZmaG91cikgPj0gMjQpIHsKKwkJZGllICgibG9jYWwgdGltZSBvZmZzZXQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDI0IGhvdXJzXG4iKTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZigiJXMsICUyZCAlcyAlZCAlMDJkOiUwMmQ6JTAyZCAlcyUwMmQlMDJkIiwKKwkJICAgICAgIHF3KFN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdClbJGxvY2FsdG1bNl1dLAorCQkgICAgICAgJGxvY2FsdG1bM10sCisJCSAgICAgICBxdyhKYW4gRmViIE1hciBBcHIgTWF5IEp1bgorCQkJICBKdWwgQXVnIFNlcCBPY3QgTm92IERlYylbJGxvY2FsdG1bNF1dLAorCQkgICAgICAgJGxvY2FsdG1bNV0rMTkwMCwKKwkJICAgICAgICRsb2NhbHRtWzJdLAorCQkgICAgICAgJGxvY2FsdG1bMV0sCisJCSAgICAgICAkbG9jYWx0bVswXSwKKwkJICAgICAgICgkb2Zmc2V0ID49IDApID8gJysnIDogJy0nLAorCQkgICAgICAgYWJzKCRvZmZob3VyKSwKKwkJICAgICAgICRvZmZtaW4sCisJCSAgICAgICApOworfQorCitteSAkaGF2ZV9lbWFpbF92YWxpZCA9IGV2YWwgeyByZXF1aXJlIEVtYWlsOjpWYWxpZDsgMSB9OworbXkgJHNtdHA7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKTsKK3N1YiBjbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKworIyBDb25zdGFudHMgKGVzc2VudGlhbGx5KQorbXkgJGNvbXBvc2VfZmlsZW5hbWUgPSAiLm1zZy4kJCI7CisKKyMgVmFyaWFibGVzIHdlIGZpbGwgaW4gYXV0b21hdGljYWxseSwgb3IgdmlhIHByb21wdGluZzoKK215IChAdG8sQGNjLEBpbml0aWFsX2NjLEBiY2NsaXN0LEB4aCwKKwkkaW5pdGlhbF9yZXBseV90bywkaW5pdGlhbF9zdWJqZWN0LEBmaWxlcywkZnJvbSwkY29tcG9zZSwkdGltZSk7CisKKyMgQmVoYXZpb3IgbW9kaWZpY2F0aW9uIHZhcmlhYmxlcworbXkgKCRjaGFpbl9yZXBseV90bywgJHF1aWV0LCAkc3VwcHJlc3NfZnJvbSwgJG5vX3NpZ25lZF9vZmZfY2MsCisJJGRyeV9ydW4pID0gKDEsIDAsIDAsIDAsIDApOworbXkgJHNtdHBfc2VydmVyOworbXkgJGVudmVsb3BlX3NlbmRlcjsKKworIyBFeGFtcGxlIHJlcGx5IHRvOgorIyRpbml0aWFsX3JlcGx5X3RvID0gJyc7ICM8MjAwNTAyMDMxNzMyMDguR0EyMzk2NEBmb29iYXIuY29tPic7CisKK215ICRyZXBvID0gR2l0LT5yZXBvc2l0b3J5KCk7CitteSAkdGVybSA9IGV2YWwgeworCW5ldyBUZXJtOjpSZWFkTGluZSAnZ2l0LXNlbmQtZW1haWwnOworfTsKK2lmICgkQCkgeworCSR0ZXJtID0gbmV3IEZha2VUZXJtICIkQDogZ29pbmcgbm9uLWludGVyYWN0aXZlIjsKK30KKworbXkgJGRlZl9jaGFpbiA9ICRyZXBvLT5jb25maWdfYm9vbCgnc2VuZGVtYWlsLmNoYWlucmVwbHl0bycpOworaWYgKGRlZmluZWQgJGRlZl9jaGFpbiBhbmQgbm90ICRkZWZfY2hhaW4pIHsKKyAgICAkY2hhaW5fcmVwbHlfdG8gPSAwOworfQorCitAYmNjbGlzdCA9ICRyZXBvLT5jb25maWcoJ3NlbmRlbWFpbC5iY2MnKTsKK2lmICghQGJjY2xpc3Qgb3IgISRiY2NsaXN0WzBdKSB7CisgICAgQGJjY2xpc3QgPSAoKTsKK30KKworIyBCZWdpbiBieSBhY2N1bXVsYXRpbmcgYWxsIHRoZSB2YXJpYWJsZXMgKGRlZmluZWQgYWJvdmUpLCB0aGF0IHdlIHdpbGwgZW5kIHVwCisjIG5lZWRpbmcsIGZpcnN0LCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisKK215ICRyYyA9IEdldE9wdGlvbnMoImZyb209cyIgPT4gXCRmcm9tLAorICAgICAgICAgICAgICAgICAgICAiaW4tcmVwbHktdG89cyIgPT4gXCRpbml0aWFsX3JlcGx5X3RvLAorCQkgICAgInN1YmplY3Q9cyIgPT4gXCRpbml0aWFsX3N1YmplY3QsCisJCSAgICAidG89cyIgPT4gXEB0bywKKwkJICAgICJjYz1zIiA9PiBcQGluaXRpYWxfY2MsCisJCSAgICAiYmNjPXMiID0+IFxAYmNjbGlzdCwKKwkJICAgICJjaGFpbi1yZXBseS10byEiID0+IFwkY2hhaW5fcmVwbHlfdG8sCisJCSAgICAic210cC1zZXJ2ZXI9cyIgPT4gXCRzbXRwX3NlcnZlciwKKwkJICAgICJjb21wb3NlIiA9PiBcJGNvbXBvc2UsCisJCSAgICAicXVpZXQiID0+IFwkcXVpZXQsCisJCSAgICAic3VwcHJlc3MtZnJvbSIgPT4gXCRzdXBwcmVzc19mcm9tLAorCQkgICAgIm5vLXNpZ25lZC1vZmYtY2N8bm8tc2lnbmVkLW9mZi1ieS1jYyIgPT4gXCRub19zaWduZWRfb2ZmX2NjLAorCQkgICAgImRyeS1ydW4iID0+IFwkZHJ5X3J1biwKKwkJICAgICJlbnZlbG9wZS1zZW5kZXI9cyIgPT4gXCRlbnZlbG9wZV9zZW5kZXIsCisJICk7CisKK3VubGVzcyAoJHJjKSB7CisgICAgdXNhZ2UoKTsKK30KKworIyBWZXJpZnkgdGhlIHVzZXIgaW5wdXQKKworZm9yZWFjaCBteSAkZW50cnkgKEB0bykgeworCWRpZSAiQ29tbWEgaW4gLS10byBlbnRyeTogJGVudHJ5J1xuIiB1bmxlc3MgJGVudHJ5ICF+IG0vLC87Cit9CisKK2ZvcmVhY2ggbXkgJGVudHJ5IChAaW5pdGlhbF9jYykgeworCWRpZSAiQ29tbWEgaW4gLS1jYyBlbnRyeTogJGVudHJ5J1xuIiB1bmxlc3MgJGVudHJ5ICF+IG0vLC87Cit9CisKK2ZvcmVhY2ggbXkgJGVudHJ5IChAYmNjbGlzdCkgeworCWRpZSAiQ29tbWEgaW4gLS1iY2NsaXN0IGVudHJ5OiAkZW50cnknXG4iIHVubGVzcyAkZW50cnkgIX4gbS8sLzsKK30KKworIyBOb3csIGxldCdzIGZpbGwgYW55IHRoYXQgYXJlbid0IHNldCBpbiB3aXRoIGRlZmF1bHRzOgorCitteSAoJGF1dGhvcikgPSAkcmVwby0+aWRlbnRfcGVyc29uKCdhdXRob3InKTsKK215ICgkY29tbWl0dGVyKSA9ICRyZXBvLT5pZGVudF9wZXJzb24oJ2NvbW1pdHRlcicpOworCitteSAlYWxpYXNlczsKK215IEBhbGlhc19maWxlcyA9ICRyZXBvLT5jb25maWcoJ3NlbmRlbWFpbC5hbGlhc2VzZmlsZScpOworbXkgJGFsaWFzZmlsZXR5cGUgPSAkcmVwby0+Y29uZmlnKCdzZW5kZW1haWwuYWxpYXNmaWxldHlwZScpOworbXkgJXBhcnNlX2FsaWFzID0gKAorCSMgbXVsdGlsaW5lIGZvcm1hdHMgY2FuIGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlCisJbXV0dCA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXlxzKmFsaWFzXHMrKFxTKylccysoLiopJC8pIHsKKwkJCW15ICgkYWxpYXMsICRhZGRyKSA9ICgkMSwgJDIpOworCQkJJGFkZHIgPX4gcy8jLiokLy87ICMgbXV0dCBhbGxvd3MgIyBjb21tZW50cworCQkJICMgY29tbWFzIGRlbGltaXQgbXVsdGlwbGUgYWRkcmVzc2VzCisJCQkkYWxpYXNlc3skYWxpYXN9ID0gWyBzcGxpdCgvXHMqLFxzKi8sICRhZGRyKSBdOworCQl9fX0sCisJbWFpbHJjID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9eYWxpYXNccysoXFMrKVxzKyguKikkLykgeworCQkJIyBzcGFjZXMgZGVsaW1pdCBtdWx0aXBsZSBhZGRyZXNzZXMKKwkJCSRhbGlhc2VzeyQxfSA9IFsgc3BsaXQoL1xzKy8sICQyKSBdOworCQl9fX0sCisJcGluZSA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXihcUyspXHMrKC4qKSQvKSB7CisJCQkkYWxpYXNlc3skMX0gPSBbIHNwbGl0KC9ccyosXHMqLywgJDIpIF07CisJCX19fSwKKwlnbnVzID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9cKGRlZmluZS1tYWlsLWFsaWFzXHMrIihcUys/KSJccysiKFxTKz8pIlwpLykgeworCQkJJGFsaWFzZXN7JDF9ID0gWyAkMiBdOworCQl9fX0KKyk7CisKK2lmIChAYWxpYXNfZmlsZXMgYW5kICRhbGlhc2ZpbGV0eXBlIGFuZCBkZWZpbmVkICRwYXJzZV9hbGlhc3skYWxpYXNmaWxldHlwZX0pIHsKKwlmb3JlYWNoIG15ICRmaWxlIChAYWxpYXNfZmlsZXMpIHsKKwkJb3BlbiBteSAkZmgsICc8JywgJGZpbGUgb3IgZGllICJvcGVuaW5nICRmaWxlOiAkIVxuIjsKKwkJJHBhcnNlX2FsaWFzeyRhbGlhc2ZpbGV0eXBlfS0+KCRmaCk7CisJCWNsb3NlICRmaDsKKwl9Cit9CisKK215ICRwcm9tcHRpbmcgPSAwOworaWYgKCFkZWZpbmVkICRmcm9tKSB7CisJJGZyb20gPSAkYXV0aG9yIHx8ICRjb21taXR0ZXI7CisJZG8geworCQkkXyA9ICR0ZXJtLT5yZWFkbGluZSgiV2hvIHNob3VsZCB0aGUgZW1haWxzIGFwcGVhciB0byBiZSBmcm9tPyBbJGZyb21dICIpOworCX0gd2hpbGUgKCFkZWZpbmVkICRfKTsKKworCSRmcm9tID0gJF8gaWYgKCRfKTsKKwlwcmludCAiRW1haWxzIHdpbGwgYmUgc2VudCBmcm9tOiAiLCAkZnJvbSwgIlxuIjsKKwkkcHJvbXB0aW5nKys7Cit9CisKK2lmICghQHRvKSB7CisJZG8geworCQkkXyA9ICR0ZXJtLT5yZWFkbGluZSgiV2hvIHNob3VsZCB0aGUgZW1haWxzIGJlIHNlbnQgdG8/ICIsCisJCQkJIiIpOworCX0gd2hpbGUgKCFkZWZpbmVkICRfKTsKKwlteSAkdG8gPSAkXzsKKwlwdXNoIEB0bywgc3BsaXQgLywvLCAkdG87CisJJHByb21wdGluZysrOworfQorCitzdWIgZXhwYW5kX2FsaWFzZXMgeworCW15IEBjdXIgPSBAXzsKKwlteSBAbGFzdDsKKwlkbyB7CisJCUBsYXN0ID0gQGN1cjsKKwkJQGN1ciA9IG1hcCB7ICRhbGlhc2VzeyRffSA/IEB7JGFsaWFzZXN7JF99fSA6ICRfIH0gQGxhc3Q7CisJfSB3aGlsZSAoam9pbignLCcsQGN1cikgbmUgam9pbignLCcsQGxhc3QpKTsKKwlyZXR1cm4gQGN1cjsKK30KKworQHRvID0gZXhwYW5kX2FsaWFzZXMoQHRvKTsKK0B0byA9IChtYXAgeyBzYW5pdGl6ZV9hZGRyZXNzX3JmYzgyMigkXykgfSBAdG8pOworQGluaXRpYWxfY2MgPSBleHBhbmRfYWxpYXNlcyhAaW5pdGlhbF9jYyk7CitAYmNjbGlzdCA9IGV4cGFuZF9hbGlhc2VzKEBiY2NsaXN0KTsKKworaWYgKCFkZWZpbmVkICRpbml0aWFsX3N1YmplY3QgJiYgJGNvbXBvc2UpIHsKKwlkbyB7CisJCSRfID0gJHRlcm0tPnJlYWRsaW5lKCJXaGF0IHN1YmplY3Qgc2hvdWxkIHRoZSBlbWFpbHMgc3RhcnQgd2l0aD8gIiwKKwkJCSRpbml0aWFsX3N1YmplY3QpOworCX0gd2hpbGUgKCFkZWZpbmVkICRfKTsKKwkkaW5pdGlhbF9zdWJqZWN0ID0gJF87CisJJHByb21wdGluZysrOworfQorCitpZiAoIWRlZmluZWQgJGluaXRpYWxfcmVwbHlfdG8gJiYgJHByb21wdGluZykgeworCWRvIHsKKwkJJF89ICR0ZXJtLT5yZWFkbGluZSgiTWVzc2FnZS1JRCB0byBiZSB1c2VkIGFzIEluLVJlcGx5LVRvIGZvciB0aGUgZmlyc3QgZW1haWw/ICIsCisJCQkkaW5pdGlhbF9yZXBseV90byk7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCisJJGluaXRpYWxfcmVwbHlfdG8gPSAkXzsKKwkkaW5pdGlhbF9yZXBseV90byA9fiBzLyheXHMrfFxzKyQpLy9nOworfQorCitpZiAoISRzbXRwX3NlcnZlcikgeworCSRzbXRwX3NlcnZlciA9ICRyZXBvLT5jb25maWcoJ3NlbmRlbWFpbC5zbXRwc2VydmVyJyk7Cit9CitpZiAoISRzbXRwX3NlcnZlcikgeworCWZvcmVhY2ggKHF3KCAvdXNyL3NiaW4vc2VuZG1haWwgL3Vzci9saWIvc2VuZG1haWwgKSkgeworCQlpZiAoLXggJF8pIHsKKwkJCSRzbXRwX3NlcnZlciA9ICRfOworCQkJbGFzdDsKKwkJfQorCX0KKwkkc210cF9zZXJ2ZXIgfHw9ICdsb2NhbGhvc3QnOyAjIGNvdWxkIGJlIDEyNy4wLjAuMSwgdG9vLi4uICpzaHJ1ZyoKK30KKworaWYgKCRjb21wb3NlKSB7CisJIyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlY3VyZSwgYnV0IHdlIHdpbGwgbWFrZSBhIHNtYWxsCisJIyBlZmZvcnQgdG8gaGF2ZSBpdCBiZSB1bmlxdWUKKwlvcGVuKEMsIj4iLCRjb21wb3NlX2ZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZvciB3cml0aW5nICRjb21wb3NlX2ZpbGVuYW1lOiAkISI7CisJcHJpbnQgQyAiRnJvbSAkZnJvbSAjIFRoaXMgbGluZSBpcyBpZ25vcmVkLlxuIjsKKwlwcmludGYgQyAiU3ViamVjdDogJXNcblxuIiwgJGluaXRpYWxfc3ViamVjdDsKKwlwcmludGYgQyA8PEVPVDsKK0dJVDogUGxlYXNlIGVudGVyIHlvdXIgZW1haWwgYmVsb3cuCitHSVQ6IExpbmVzIGJlZ2lubmluZyBpbiAiR0lUOiAiIHdpbGwgYmUgcmVtb3ZlZC4KK0dJVDogQ29uc2lkZXIgaW5jbHVkaW5nIGFuIG92ZXJhbGwgZGlmZnN0YXQgb3IgdGFibGUgb2YgY29udGVudHMKK0dJVDogZm9yIHRoZSBwYXRjaCB5b3UgYXJlIHdyaXRpbmcuCisKK0VPVAorCWNsb3NlKEMpOworCisJbXkgJGVkaXRvciA9ICRFTlZ7RURJVE9SfTsKKwkkZWRpdG9yID0gJ3ZpJyB1bmxlc3MgZGVmaW5lZCAkZWRpdG9yOworCXN5c3RlbSgkZWRpdG9yLCAkY29tcG9zZV9maWxlbmFtZSk7CisKKwlvcGVuKEMyLCI+IiwkY29tcG9zZV9maWxlbmFtZSAuICIuZmluYWwiKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuICRjb21wb3NlX2ZpbGVuYW1lLmZpbmFsIDogIiAuICQhOworCisJb3BlbihDLCI8IiwkY29tcG9zZV9maWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiAkY29tcG9zZV9maWxlbmFtZSA6ICIgLiAkITsKKworCXdoaWxlKDxDPikgeworCQluZXh0IGlmIG0vXkdJVDogLzsKKwkJcHJpbnQgQzIgJF87CisJfQorCWNsb3NlKEMpOworCWNsb3NlKEMyKTsKKworCWRvIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIlNlbmQgdGhpcyBlbWFpbD8gKHl8bikgIik7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCisJaWYgKHVjIHN1YnN0cigkXywwLDEpIG5lICdZJykgeworCQljbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlAZmlsZXMgPSAoJGNvbXBvc2VfZmlsZW5hbWUgLiAiLmZpbmFsIik7Cit9CisKKworIyBOb3cgdGhhdCBhbGwgdGhlIGRlZmF1bHRzIGFyZSBzZXQsIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZQorIyBhcmd1bWVudHMgYW5kIGNvbGxlY3QgdXAgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQuCitmb3IgbXkgJGYgKEBBUkdWKSB7CisJaWYgKC1kICRmKSB7CisJCW9wZW5kaXIoREgsJGYpCisJCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuZGlyICRmOiAkISI7CisKKwkJcHVzaCBAZmlsZXMsIGdyZXAgeyAtZiAkXyB9IG1hcCB7ICskZiAuICIvIiAuICRfIH0KKwkJCQlzb3J0IHJlYWRkaXIoREgpOworCisJfSBlbHNpZiAoLWYgJGYpIHsKKwkJcHVzaCBAZmlsZXMsICRmOworCisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJTa2lwcGluZyAkZiAtIG5vdCBmb3VuZC5cbiI7CisJfQorfQorCitpZiAoQGZpbGVzKSB7CisJdW5sZXNzICgkcXVpZXQpIHsKKwkJcHJpbnQgJF8sIlxuIiBmb3IgKEBmaWxlcyk7CisJfQorfSBlbHNlIHsKKwlwcmludCBTVERFUlIgIlxuTm8gcGF0Y2ggZmlsZXMgc3BlY2lmaWVkIVxuXG4iOworCXVzYWdlKCk7Cit9CisKKyMgVmFyaWFibGVzIHdlIHNldCBhcyBwYXJ0IG9mIHRoZSBsb29wIG92ZXIgZmlsZXMKK291ciAoJG1lc3NhZ2VfaWQsICVtYWlsLCAkc3ViamVjdCwgJHJlcGx5X3RvLCAkcmVmZXJlbmNlcywgJG1lc3NhZ2UpOworCitzdWIgZXh0cmFjdF92YWxpZF9hZGRyZXNzIHsKKwlteSAkYWRkcmVzcyA9IHNoaWZ0OworCW15ICRsb2NhbF9wYXJ0X3JlZ2V4cCA9ICdbXjw+IlxzQF0rJzsKKwlteSAkZG9tYWluX3JlZ2V4cCA9ICdbXi48PiJcc0BdKyg/OlwuW14uPD4iXHNAXSspKyc7CisKKwkjIGNoZWNrIGZvciBhIGxvY2FsIGFkZHJlc3M6CisJcmV0dXJuICRhZGRyZXNzIGlmICgkYWRkcmVzcyA9fiAvXigkbG9jYWxfcGFydF9yZWdleHApJC8pOworCisJaWYgKCRoYXZlX2VtYWlsX3ZhbGlkKSB7CisJCXJldHVybiBzY2FsYXIgRW1haWw6OlZhbGlkLT5hZGRyZXNzKCRhZGRyZXNzKTsKKwl9IGVsc2UgeworCQkjIGxlc3Mgcm9idXN0L2NvcnJlY3QgdGhhbiB0aGUgbW9uc3RlciByZWdleHAgaW4gRW1haWw6OlZhbGlkLAorCQkjIGJ1dCBzdGlsbCBkb2VzIGEgOTklIGpvYiwgYW5kIG9uZSBsZXNzIGRlcGVuZGVuY3kKKwkJJGFkZHJlc3MgPX4gLygkbG9jYWxfcGFydF9yZWdleHBcQCRkb21haW5fcmVnZXhwKS87CisJCXJldHVybiAkMTsKKwl9Cit9CisKKyMgVXN1YWxseSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBiZWxvdyBoZXJlLgorCisjIHdlIG1ha2UgYSAiZmFrZSIgbWVzc2FnZSBpZCBieSB0YWtpbmcgdGhlIGN1cnJlbnQgbnVtYmVyCisjIG9mIHNlY29uZHMgc2luY2UgdGhlIGJlZ2lubmluZyBvZiBVbml4IHRpbWUgYW5kIHRhY2tpbmcgb24KKyMgYSByYW5kb20gbnVtYmVyIHRvIHRoZSBlbmQsIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBxdWlja2VyIHRoYW4KKyMgMSBzZWNvbmQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSB3ZXJlIGNhbGxlZC4KKworIyBXZSdsbCBzZXR1cCBhIHRlbXBsYXRlIGZvciB0aGUgbWVzc2FnZSBpZCwgdXNpbmcgdGhlICJmcm9tIiBhZGRyZXNzOgorbXkgJG1lc3NhZ2VfaWRfZnJvbSA9IGV4dHJhY3RfdmFsaWRfYWRkcmVzcygkZnJvbSk7CitteSAkbWVzc2FnZV9pZF90ZW1wbGF0ZSA9ICI8JXMtZ2l0LXNlbmQtZW1haWwtJG1lc3NhZ2VfaWRfZnJvbT4iOworCitzdWIgbWFrZV9tZXNzYWdlX2lkCit7CisJbXkgJGRhdGUgPSB0aW1lOworCW15ICRwc2V1ZG9fcmFuZCA9IGludCAocmFuZCg0MjAwKSk7CisJJG1lc3NhZ2VfaWQgPSBzcHJpbnRmICRtZXNzYWdlX2lkX3RlbXBsYXRlLCAiJGRhdGUkcHNldWRvX3JhbmQiOworCSNwcmludCAibmV3IG1lc3NhZ2UgaWQgPSAkbWVzc2FnZV9pZFxuIjsgIyBXYXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKK30KKworCisKKyR0aW1lID0gdGltZSAtIHNjYWxhciAkI2ZpbGVzOworCitzdWIgdW5xdW90ZV9yZmMyMDQ3IHsKKwlsb2NhbCAoJF8pID0gQF87CisJaWYgKHMvPVw/dXRmLThcP3FcPyguKilcPz0vJDEvZykgeworCQlzL18vIC9nOworCQlzLz0oWzAtOUEtRl17Mn0pL2NocihoZXgoJDEpKS9lZzsKKwl9CisJcmV0dXJuICIkXyI7Cit9CisKKyMgSWYgYW4gYWRkcmVzcyBjb250YWlucyBhIC4gaW4gdGhlIG5hbWUgcG9ydGlvbiwgdGhlIG5hbWUgbXVzdCBiZSBxdW90ZWQuCitzdWIgc2FuaXRpemVfYWRkcmVzc19yZmM4MjIKK3sKKwlteSAoJHJlY2lwaWVudCkgPSBAXzsKKwlteSAoJHJlY2lwaWVudF9uYW1lKSA9ICgkcmVjaXBpZW50ID1+IC9eKC4qPylccys8Lyk7CisJaWYgKCRyZWNpcGllbnRfbmFtZSAmJiAkcmVjaXBpZW50X25hbWUgPX4gL1wuLyAmJiAkcmVjaXBpZW50X25hbWUgIX4gL14iLioiJC8pIHsKKwkJbXkgKCRuYW1lLCAkYWRkcikgPSAoJHJlY2lwaWVudCA9fiAvXiguKj8pKFxzKzwuKikvKTsKKwkJJHJlY2lwaWVudCA9ICJcIiRuYW1lXCIkYWRkciI7CisJfQorCXJldHVybiAkcmVjaXBpZW50OworfQorCitzdWIgc2VuZF9tZXNzYWdlCit7CisJbXkgQHJlY2lwaWVudHMgPSB1bmlxdWVfZW1haWxfbGlzdChAdG8pOworCUBjYyA9IChtYXAgeyBzYW5pdGl6ZV9hZGRyZXNzX3JmYzgyMigkXykgfSBAY2MpOworCW15ICR0byA9IGpvaW4gKCIsXG5cdCIsIEByZWNpcGllbnRzKTsKKwlAcmVjaXBpZW50cyA9IHVuaXF1ZV9lbWFpbF9saXN0KEByZWNpcGllbnRzLEBjYyxAYmNjbGlzdCk7CisJQHJlY2lwaWVudHMgPSAobWFwIHsgZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRfKSB9IEByZWNpcGllbnRzKTsKKwlteSAkZGF0ZSA9IGZvcm1hdF8yODIyX3RpbWUoJHRpbWUrKyk7CisJbXkgJGdpdHZlcnNpb24gPSAnQEBHSVRfVkVSU0lPTkBAJzsKKwlpZiAoJGdpdHZlcnNpb24gPX4gbS8uLkdJVF9WRVJTSU9OLi4vKSB7CisJICAgICRnaXR2ZXJzaW9uID0gR2l0Ojp2ZXJzaW9uKCk7CisJfQorCisJbXkgJGNjID0gam9pbigiLCAiLCB1bmlxdWVfZW1haWxfbGlzdChAY2MpKTsKKwlteSAkY2NsaW5lID0gIiI7CisJaWYgKCRjYyBuZSAnJykgeworCQkkY2NsaW5lID0gIlxuQ2M6ICRjYyI7CisJfQorCSRmcm9tID0gc2FuaXRpemVfYWRkcmVzc19yZmM4MjIoJGZyb20pOworCW15ICRoZWFkZXIgPSAiRnJvbTogJGZyb20KK1RvOiAkdG8ke2NjbGluZX0KK1N1YmplY3Q6ICRzdWJqZWN0CitEYXRlOiAkZGF0ZQorTWVzc2FnZS1JZDogJG1lc3NhZ2VfaWQKK1gtTWFpbGVyOiBnaXQtc2VuZC1lbWFpbCAkZ2l0dmVyc2lvbgorIjsKKwlpZiAoJHJlcGx5X3RvKSB7CisKKwkJJGhlYWRlciAuPSAiSW4tUmVwbHktVG86ICRyZXBseV90b1xuIjsKKwkJJGhlYWRlciAuPSAiUmVmZXJlbmNlczogJHJlZmVyZW5jZXNcbiI7CisJfQorCWlmIChAeGgpIHsKKwkJJGhlYWRlciAuPSBqb2luKCJcbiIsIEB4aCkgLiAiXG4iOworCX0KKworCW15IEBzZW5kbWFpbF9wYXJhbWV0ZXJzID0gKCctaScsIEByZWNpcGllbnRzKTsKKwlteSAkcmF3X2Zyb20gPSAkZnJvbTsKKwkkcmF3X2Zyb20gPSAkZW52ZWxvcGVfc2VuZGVyIGlmIChkZWZpbmVkICRlbnZlbG9wZV9zZW5kZXIpOworCSRyYXdfZnJvbSA9IGV4dHJhY3RfdmFsaWRfYWRkcmVzcygkcmF3X2Zyb20pOworCXVuc2hpZnQgKEBzZW5kbWFpbF9wYXJhbWV0ZXJzLAorCQkJJy1mJywgJHJhd19mcm9tKSBpZihkZWZpbmVkICRlbnZlbG9wZV9zZW5kZXIpOworCisJaWYgKCRkcnlfcnVuKSB7CisJCSMgV2UgZG9uJ3Qgd2FudCB0byBzZW5kIHRoZSBlbWFpbC4KKwl9IGVsc2lmICgkc210cF9zZXJ2ZXIgPX4gbSNeLyMpIHsKKwkJbXkgJHBpZCA9IG9wZW4gbXkgJHNtLCAnfC0nOworCQlkZWZpbmVkICRwaWQgb3IgZGllICQhOworCQlpZiAoISRwaWQpIHsKKwkJCWV4ZWMoJHNtdHBfc2VydmVyLCBAc2VuZG1haWxfcGFyYW1ldGVycykgb3IgZGllICQhOworCQl9CisJCXByaW50ICRzbSAiJGhlYWRlclxuJG1lc3NhZ2UiOworCQljbG9zZSAkc20gb3IgZGllICQ/OworCX0gZWxzZSB7CisJCXJlcXVpcmUgTmV0OjpTTVRQOworCQkkc210cCB8fD0gTmV0OjpTTVRQLT5uZXcoICRzbXRwX3NlcnZlciApOworCQkkc210cC0+bWFpbCggJHJhd19mcm9tICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+dG8oIEByZWNpcGllbnRzICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+ZGF0YSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhc2VuZCgiJGhlYWRlclxuJG1lc3NhZ2UiKSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhZW5kKCkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+b2sgb3IgZGllICJGYWlsZWQgdG8gc2VuZCAkc3ViamVjdFxuIi4kc210cC0+bWVzc2FnZTsKKwl9CisJaWYgKCRxdWlldCkgeworCQlwcmludGYgKCgkZHJ5X3J1biA/ICJEcnktIiA6ICIiKS4iU2VudCAlc1xuIiwgJHN1YmplY3QpOworCX0gZWxzZSB7CisJCXByaW50ICgoJGRyeV9ydW4gPyAiRHJ5LSIgOiAiIikuIk9LLiBMb2cgc2F5czpcbkRhdGU6ICRkYXRlXG4iKTsKKwkJaWYgKCRzbXRwX3NlcnZlciAhfiBtI14vIykgeworCQkJcHJpbnQgIlNlcnZlcjogJHNtdHBfc2VydmVyXG4iOworCQkJcHJpbnQgIk1BSUwgRlJPTTo8JHJhd19mcm9tPlxuIjsKKwkJCXByaW50ICJSQ1BUIFRPOiIuam9pbignLCcsKG1hcCB7ICI8JF8+IiB9IEByZWNpcGllbnRzKSkuIlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICJTZW5kbWFpbDogJHNtdHBfc2VydmVyICIuam9pbignICcsQHNlbmRtYWlsX3BhcmFtZXRlcnMpLiJcbiI7CisJCX0KKwkJcHJpbnQgIkZyb206ICRmcm9tXG5TdWJqZWN0OiAkc3ViamVjdFxuQ2M6ICRjY1xuVG86ICR0b1xuXG4iOworCQlpZiAoJHNtdHApIHsKKwkJCXByaW50ICJSZXN1bHQ6ICIsICRzbXRwLT5jb2RlLCAnICcsCisJCQkJKCRzbXRwLT5tZXNzYWdlID1+IC9cbihbXlxuXStcbikkL3MpLCAiXG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIlJlc3VsdDogT0tcbiI7CisJCX0KKwl9Cit9CisKKyRyZXBseV90byA9ICRpbml0aWFsX3JlcGx5X3RvOworJHJlZmVyZW5jZXMgPSAkaW5pdGlhbF9yZXBseV90byB8fCAnJzsKK21ha2VfbWVzc2FnZV9pZCgpOworJHN1YmplY3QgPSAkaW5pdGlhbF9zdWJqZWN0OworCitmb3JlYWNoIG15ICR0IChAZmlsZXMpIHsKKwlvcGVuKEYsIjwiLCR0KSBvciBkaWUgImNhbid0IG9wZW4gZmlsZSAkdCI7CisKKwlteSAkYXV0aG9yX25vdF9zZW5kZXIgPSB1bmRlZjsKKwlAY2MgPSBAaW5pdGlhbF9jYzsKKwlAeGggPSAoKTsKKwlteSAkaW5wdXRfZm9ybWF0ID0gdW5kZWY7CisJbXkgJGhlYWRlcl9kb25lID0gMDsKKwkkbWVzc2FnZSA9ICIiOworCXdoaWxlKDxGPikgeworCQlpZiAoISRoZWFkZXJfZG9uZSkgeworCQkJaWYgKC9eRnJvbSAvKSB7CisJCQkJJGlucHV0X2Zvcm1hdCA9ICdtYm94JzsKKwkJCQluZXh0OworCQkJfQorCQkJY2hvbXA7CisJCQlpZiAoIWRlZmluZWQgJGlucHV0X2Zvcm1hdCAmJiAvXlstQS1aYS16XSs6XHMvKSB7CisJCQkJJGlucHV0X2Zvcm1hdCA9ICdtYm94JzsKKwkJCX0KKworCQkJaWYgKGRlZmluZWQgJGlucHV0X2Zvcm1hdCAmJiAkaW5wdXRfZm9ybWF0IGVxICdtYm94JykgeworCQkJCWlmICgvXlN1YmplY3Q6XHMrKC4qKSQvKSB7CisJCQkJCSRzdWJqZWN0ID0gJDE7CisKKwkJCQl9IGVsc2lmICgvXihDY3xGcm9tKTpccysoLiopJC8pIHsKKwkJCQkJaWYgKHVucXVvdGVfcmZjMjA0NygkMikgZXEgJGZyb20pIHsKKwkJCQkJCSRmcm9tID0gJDI7CisJCQkJCQluZXh0IGlmICgkc3VwcHJlc3NfZnJvbSk7CisJCQkJCX0KKwkJCQkJZWxzaWYgKCQxIGVxICdGcm9tJykgeworCQkJCQkJJGF1dGhvcl9ub3Rfc2VuZGVyID0gJDI7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCIobWJveCkgQWRkaW5nIGNjOiAlcyBmcm9tIGxpbmUgJyVzJ1xuIiwKKwkJCQkJCSQyLCAkXykgdW5sZXNzICRxdWlldDsKKwkJCQkJcHVzaCBAY2MsICQyOworCQkJCX0KKwkJCQllbHNpZiAoIS9eRGF0ZTpccy8gJiYgL15bLUEtWmEtel0rOlxzK1xTLykgeworCQkJCQlwdXNoIEB4aCwgJF87CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCSMgSW4gdGhlIHRyYWRpdGlvbmFsCisJCQkJIyAic2VuZCBsb3RzIG9mIGVtYWlsIiBmb3JtYXQsCisJCQkJIyBsaW5lIDEgPSBjYworCQkJCSMgbGluZSAyID0gc3ViamVjdAorCQkJCSMgU28gbGV0J3Mgc3VwcG9ydCB0aGF0LCB0b28uCisJCQkJJGlucHV0X2Zvcm1hdCA9ICdsb3RzJzsKKwkJCQlpZiAoQGNjID09IDApIHsKKwkJCQkJcHJpbnRmKCIobm9uLW1ib3gpIEFkZGluZyBjYzogJXMgZnJvbSBsaW5lICclcydcbiIsCisJCQkJCQkkXywgJF8pIHVubGVzcyAkcXVpZXQ7CisKKwkJCQkJcHVzaCBAY2MsICRfOworCisJCQkJfSBlbHNpZiAoIWRlZmluZWQgJHN1YmplY3QpIHsKKwkJCQkJJHN1YmplY3QgPSAkXzsKKwkJCQl9CisJCQl9CisKKwkJCSMgQSB3aGl0ZXNwYWNlIGxpbmUgd2lsbCB0ZXJtaW5hdGUgdGhlIGhlYWRlcnMKKwkJCWlmIChtL15ccyokLykgeworCQkJCSRoZWFkZXJfZG9uZSA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkbWVzc2FnZSAuPSAgJF87CisJCQlpZiAoL14oU2lnbmVkLW9mZi1ieXxDYyk6ICguKikkL2kgJiYgISRub19zaWduZWRfb2ZmX2NjKSB7CisJCQkJbXkgJGMgPSAkMjsKKwkJCQljaG9tcCAkYzsKKwkJCQlwdXNoIEBjYywgJGM7CisJCQkJcHJpbnRmKCIoc29iKSBBZGRpbmcgY2M6ICVzIGZyb20gbGluZSAnJXMnXG4iLAorCQkJCQkkYywgJF8pIHVubGVzcyAkcXVpZXQ7CisJCQl9CisJCX0KKwl9CisJY2xvc2UgRjsKKwlpZiAoZGVmaW5lZCAkYXV0aG9yX25vdF9zZW5kZXIpIHsKKwkJJGF1dGhvcl9ub3Rfc2VuZGVyID0gdW5xdW90ZV9yZmMyMDQ3KCRhdXRob3Jfbm90X3NlbmRlcik7CisJCSRtZXNzYWdlID0gIkZyb206ICRhdXRob3Jfbm90X3NlbmRlclxuXG4kbWVzc2FnZSI7CisJfQorCisKKwlzZW5kX21lc3NhZ2UoKTsKKworCSMgc2V0IHVwIGZvciB0aGUgbmV4dCBtZXNzYWdlCisJaWYgKCRjaGFpbl9yZXBseV90byB8fCAhZGVmaW5lZCAkcmVwbHlfdG8gfHwgbGVuZ3RoKCRyZXBseV90bykgPT0gMCkgeworCQkkcmVwbHlfdG8gPSAkbWVzc2FnZV9pZDsKKwkJaWYgKGxlbmd0aCAkcmVmZXJlbmNlcyA+IDApIHsKKwkJCSRyZWZlcmVuY2VzIC49ICJcbiAkbWVzc2FnZV9pZCI7CisJCX0gZWxzZSB7CisJCQkkcmVmZXJlbmNlcyA9ICIkbWVzc2FnZV9pZCI7CisJCX0KKwl9CisJbWFrZV9tZXNzYWdlX2lkKCk7Cit9CisKK2lmICgkY29tcG9zZSkgeworCWNsZWFudXBfY29tcG9zZV9maWxlcygpOworfQorCitzdWIgY2xlYW51cF9jb21wb3NlX2ZpbGVzKCkgeworCXVubGluaygkY29tcG9zZV9maWxlbmFtZSwgJGNvbXBvc2VfZmlsZW5hbWUgLiAiLmZpbmFsIik7CisKK30KKworJHNtdHAtPnF1aXQgaWYgJHNtdHA7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKSB7CisJbXkgJXNlZW47CisJbXkgQGVtYWlsczsKKworCWZvcmVhY2ggbXkgJGVudHJ5IChAXykgeworCQlpZiAobXkgJGNsZWFuID0gZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRlbnRyeSkpIHsKKwkJCSRzZWVueyRjbGVhbn0gfHw9IDA7CisJCQluZXh0IGlmICRzZWVueyRjbGVhbn0rKzsKKwkJCXB1c2ggQGVtYWlscywgJGVudHJ5OworCQl9IGVsc2UgeworCQkJcHJpbnQgU1RERVJSICJXOiB1bmFibGUgdG8gZXh0cmFjdCBhIHZhbGlkIGFkZHJlc3MiLAorCQkJCQkiIGZyb206ICRlbnRyeVxuIjsKKwkJfQorCX0KKwlyZXR1cm4gQGVtYWlsczsKK30KZGlmZiAtLWdpdCBhL2dpdC1zaC1zZXR1cC5zaCBiL2dpdC1zaC1zZXR1cC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjRjN2YyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXNoLXNldHVwLnNoCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9zaAorIworIyBUaGlzIGlzIGluY2x1ZGVkIGluIGNvbW1hbmRzIHRoYXQgZWl0aGVyIGhhdmUgdG8gYmUgcnVuIGZyb20gdGhlIHRvcGxldmVsCisjIG9mIHRoZSByZXBvc2l0b3J5LCBvciB3aXRoIEdJVF9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgcHJvcGVybHkuCisjIElmIHRoZSBHSVRfRElSIGRvZXMgbm90IGxvb2sgbGlrZSB0aGUgcmlnaHQgY29ycmVjdCBnaXQtcmVwb3NpdG9yeSwKKyMgaXQgZGllcy4KKworIyBIYXZpbmcgdGhpcyB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHdvdWxkIGJyZWFrIHNjcmlwdHMgYmVjYXVzZQorIyB5b3Ugd291bGQgY2F1c2UgImNkIiB0byBiZSBiZSB0YWtlbiB0byB1bmV4cGVjdGVkIHBsYWNlcy4gIElmIHlvdQorIyBsaWtlIENEUEFUSCwgZGVmaW5lIGl0IGZvciB5b3VyIGludGVyYWN0aXZlIHNoZWxsIHNlc3Npb25zIHdpdGhvdXQKKyMgZXhwb3J0aW5nIGl0LgordW5zZXQgQ0RQQVRICisKK2RpZSgpIHsKKwllY2hvID4mMiAiJEAiCisJZXhpdCAxCit9CisKK3VzYWdlKCkgeworCWRpZSAiVXNhZ2U6ICQwICRVU0FHRSIKK30KKworc2V0X3JlZmxvZ19hY3Rpb24oKSB7CisJaWYgWyAteiAiJHtHSVRfUkVGTE9HX0FDVElPTjorc2V0fSIgXQorCXRoZW4KKwkJR0lUX1JFRkxPR19BQ1RJT049IiQqIgorCQlleHBvcnQgR0lUX1JFRkxPR19BQ1RJT04KKwlmaQorfQorCitpc19iYXJlX3JlcG9zaXRvcnkgKCkgeworCWdpdC1jb25maWcgLS1ib29sIC0tZ2V0IGNvcmUuYmFyZSB8fAorCWNhc2UgIiRHSVRfRElSIiBpbgorCS5naXQgfCAqLy5naXQpIGVjaG8gZmFsc2UgOzsKKwkqKSBlY2hvIHRydWUgOzsKKwllc2FjCit9CisKK2NkX3RvX3RvcGxldmVsICgpIHsKKwljZHVwPSQoZ2l0LXJldi1wYXJzZSAtLXNob3ctY2R1cCkKKwlpZiB0ZXN0ICEgLXogIiRjZHVwIgorCXRoZW4KKwkJY2QgIiRjZHVwIiB8fCB7CisJCQllY2hvID4mMiAiQ2Fubm90IGNoZGlyIHRvICRjZHVwLCB0aGUgdG9wbGV2ZWwgb2YgdGhlIHdvcmtpbmcgdHJlZSIKKwkJCWV4aXQgMQorCQl9CisJZmkKK30KKworcmVxdWlyZV93b3JrX3RyZWUgKCkgeworCXRlc3QgJChpc19iYXJlX3JlcG9zaXRvcnkpID0gZmFsc2UgJiYKKwl0ZXN0ICQoZ2l0LXJldi1wYXJzZSAtLWlzLWluc2lkZS1naXQtZGlyKSA9IGZhbHNlIHx8CisJZGllICJmYXRhbDogJDAgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhIHdvcmtpbmcgdHJlZS4iCit9CisKK2lmIFsgLXogIiRMT05HX1VTQUdFIiBdCit0aGVuCisJTE9OR19VU0FHRT0iVXNhZ2U6ICQwICRVU0FHRSIKK2Vsc2UKKwlMT05HX1VTQUdFPSJVc2FnZTogJDAgJFVTQUdFCisKKyRMT05HX1VTQUdFIgorZmkKKworY2FzZSAiJDEiIGluCisJLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorCWVjaG8gIiRMT05HX1VTQUdFIgorCWV4aXQKK2VzYWMKKworIyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgdmFsaWQgcmVwb3NpdG9yeSBvZiBhIHZpbnRhZ2Ugd2UgdW5kZXJzdGFuZC4KK2lmIFsgLXogIiRTVUJESVJFQ1RPUllfT0siIF0KK3RoZW4KKwk6ICR7R0lUX0RJUj0uZ2l0fQorCUdJVF9ESVI9JChHSVRfRElSPSIkR0lUX0RJUiIgZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIpIHx8IHsKKwkJZXhpdD0kPworCQllY2hvID4mMiAiWW91IG5lZWQgdG8gcnVuIHRoaXMgY29tbWFuZCBmcm9tIHRoZSB0b3BsZXZlbCBvZiB0aGUgd29ya2luZyB0cmVlLiIKKwkJZXhpdCAkZXhpdAorCX0KK2Vsc2UKKwlHSVRfRElSPSQoZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIpIHx8IGV4aXQKK2ZpCis6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiRHSVRfRElSL29iamVjdHMifQpkaWZmIC0tZ2l0IGEvZ2l0LXN2bi5wZXJsIGIvZ2l0LXN2bi5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzNTAwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc3ZuLnBlcmwKQEAgLTAsMCArMSw0MDIzIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjIENvcHlyaWdodCAoQykgMjAwNiwgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+CisjIExpY2Vuc2U6IEdQTCB2MiBvciBsYXRlcgordXNlIHdhcm5pbmdzOwordXNlIHN0cmljdDsKK3VzZSB2YXJzIHF3LwkkQVVUSE9SICRWRVJTSU9OCisJCSRzaGExICRzaGExX3Nob3J0ICRfcmV2aXNpb24KKwkJJF9xICRfYXV0aG9ycyAldXNlcnMvOworJEFVVEhPUiA9ICdFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4nOworJFZFUlNJT04gPSAnQEBHSVRfVkVSU0lPTkBAJzsKKworbXkgJGdpdF9kaXJfdXNlcl9zZXQgPSAxIGlmIGRlZmluZWQgJEVOVntHSVRfRElSfTsKKyRFTlZ7R0lUX0RJUn0gfHw9ICcuZ2l0JzsKKyRHaXQ6OlNWTjo6ZGVmYXVsdF9yZXBvX2lkID0gJ3N2bic7CiskR2l0OjpTVk46OmRlZmF1bHRfcmVmX2lkID0gJEVOVntHSVRfU1ZOX0lEfSB8fCAnZ2l0LXN2bic7CiskR2l0OjpTVk46OlJhOjpfbG9nX3dpbmRvd19zaXplID0gMTAwOworCiskR2l0OjpTVk46OkxvZzo6VFogPSAkRU5We1RafTsKKyRFTlZ7VFp9ID0gJ1VUQyc7CiskfCA9IDE7ICMgdW5idWZmZXIgU1RET1VUCisKK3N1YiBmYXRhbCAoQCkgeyBwcmludCBTVERFUlIgQF87IGV4aXQgMSB9CityZXF1aXJlIFNWTjo6Q29yZTsgIyB1c2UoKS1pbmcgdGhpcyBjYXVzZXMgc2VnZmF1bHRzIGZvciBtZS4uLiAqc2hydWcqCityZXF1aXJlIFNWTjo6UmE7CityZXF1aXJlIFNWTjo6RGVsdGE7CitpZiAoJFNWTjo6Q29yZTo6VkVSU0lPTiBsdCAnMS4xLjAnKSB7CisJZmF0YWwgIk5lZWQgU1ZOOjpDb3JlIDEuMS4wIG9yIGJldHRlciAoZ290ICRTVk46OkNvcmU6OlZFUlNJT04pXG4iOworfQorcHVzaCBAR2l0OjpTVk46OlJhOjpJU0EsICdTVk46OlJhJzsKK3B1c2ggQFNWTjo6R2l0OjpFZGl0b3I6OklTQSwgJ1NWTjo6RGVsdGE6OkVkaXRvcic7CitwdXNoIEBTVk46OkdpdDo6RmV0Y2hlcjo6SVNBLCAnU1ZOOjpEZWx0YTo6RWRpdG9yJzsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBJTzo6RmlsZSBxdy8vOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3L2Rpcm5hbWUgYmFzZW5hbWUvOwordXNlIEZpbGU6OlBhdGggcXcvbWtwYXRoLzsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcvOmNvbmZpZyBnbnVfZ2V0b3B0IG5vX2lnbm9yZV9jYXNlIGF1dG9fYWJicmV2LzsKK3VzZSBJUEM6Ok9wZW4zOwordXNlIEdpdDsKKworQkVHSU4geworCW15ICRzOworCWZvcmVhY2ggKHF3L2NvbW1hbmQgY29tbWFuZF9vbmVsaW5lIGNvbW1hbmRfbm9pc3kgY29tbWFuZF9vdXRwdXRfcGlwZQorCSAgICAgICAgICAgIGNvbW1hbmRfaW5wdXRfcGlwZSBjb21tYW5kX2Nsb3NlX3BpcGUvKSB7CisJCSRzIC49ICIqU1ZOOjpHaXQ6OkVkaXRvcjo6JF8gPSAqU1ZOOjpHaXQ6OkZldGNoZXI6OiRfID0gIi4KKwkJICAgICAgIipHaXQ6OlNWTjo6TWlncmF0aW9uOjokXyA9ICIuCisJCSAgICAgICIqR2l0OjpTVk46OkxvZzo6JF8gPSAqR2l0OjpTVk46OiRfID0gKiRfID0gKkdpdDo6JF87ICI7CisJfQorCWV2YWwgJHM7Cit9CisKK215ICgkU1ZOKTsKKworJHNoYTEgPSBxci9bYS1mXGRdezQwfS87Ciskc2hhMV9zaG9ydCA9IHFyL1thLWZcZF17NCw0MH0vOworbXkgKCRfc3RkaW4sICRfaGVscCwgJF9lZGl0LAorCSRfbWVzc2FnZSwgJF9maWxlLAorCSRfdGVtcGxhdGUsICRfc2hhcmVkLAorCSRfdmVyc2lvbiwgJF9mZXRjaF9hbGwsICRfbm9fcmViYXNlLAorCSRfbWVyZ2UsICRfc3RyYXRlZ3ksICRfZHJ5X3J1biwgJF9sb2NhbCwKKwkkX3ByZWZpeCwgJF9ub19jaGVja291dCwgJF92ZXJib3NlKTsKKyRHaXQ6OlNWTjo6X2ZvbGxvd19wYXJlbnQgPSAxOworbXkgJXJlbW90ZV9vcHRzID0gKCAndXNlcm5hbWU9cycgPT4gXCRHaXQ6OlNWTjo6UHJvbXB0OjpfdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICdjb25maWctZGlyPXMnID0+IFwkR2l0OjpTVk46OlJhOjpjb25maWdfZGlyLAorICAgICAgICAgICAgICAgICAgICAnbm8tYXV0aC1jYWNoZScgPT4gXCRHaXQ6OlNWTjo6UHJvbXB0Ojpfbm9fYXV0aF9jYWNoZSApOworbXkgJWZjX29wdHMgPSAoICdmb2xsb3ctcGFyZW50fGZvbGxvdyEnID0+IFwkR2l0OjpTVk46Ol9mb2xsb3dfcGFyZW50LAorCQknYXV0aG9ycy1maWxlfEE9cycgPT4gXCRfYXV0aG9ycywKKwkJJ3JlcGFjazppJyA9PiBcJEdpdDo6U1ZOOjpfcmVwYWNrLAorCQknbm9NZXRhZGF0YScgPT4gXCRHaXQ6OlNWTjo6X25vX21ldGFkYXRhLAorCQkndXNlU3ZtUHJvcHMnID0+IFwkR2l0OjpTVk46Ol91c2Vfc3ZtX3Byb3BzLAorCQkndXNlU3Zuc3luY1Byb3BzJyA9PiBcJEdpdDo6U1ZOOjpfdXNlX3N2bnN5bmNfcHJvcHMsCisJCSdsb2ctd2luZG93LXNpemU9aScgPT4gXCRHaXQ6OlNWTjo6UmE6Ol9sb2dfd2luZG93X3NpemUsCisJCSduby1jaGVja291dCcgPT4gXCRfbm9fY2hlY2tvdXQsCisJCSdxdWlldHxxJyA9PiBcJF9xLAorCQkncmVwYWNrLWZsYWdzfHJlcGFjay1hcmdzfHJlcGFjay1vcHRzPXMnID0+CisJCSAgIFwkR2l0OjpTVk46Ol9yZXBhY2tfZmxhZ3MsCisJCSVyZW1vdGVfb3B0cyApOworCitteSAoJF90cnVuaywgJF90YWdzLCAkX2JyYW5jaGVzKTsKK215ICVpY3Y7CitteSAlaW5pdF9vcHRzID0gKCAndGVtcGxhdGU9cycgPT4gXCRfdGVtcGxhdGUsICdzaGFyZWQ6cycgPT4gXCRfc2hhcmVkLAorICAgICAgICAgICAgICAgICAgJ3RydW5rfFQ9cycgPT4gXCRfdHJ1bmssICd0YWdzfHQ9cycgPT4gXCRfdGFncywKKyAgICAgICAgICAgICAgICAgICdicmFuY2hlc3xiPXMnID0+IFwkX2JyYW5jaGVzLCAncHJlZml4PXMnID0+IFwkX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICdtaW5pbWl6ZS11cmx8bScgPT4gXCRHaXQ6OlNWTjo6X21pbmltaXplX3VybCwKKwkJICAnbm8tbWV0YWRhdGEnID0+IHN1YiB7ICRpY3Z7bm9NZXRhZGF0YX0gPSAxIH0sCisJCSAgJ3VzZS1zdm0tcHJvcHMnID0+IHN1YiB7ICRpY3Z7dXNlU3ZtUHJvcHN9ID0gMSB9LAorCQkgICd1c2Utc3Zuc3luYy1wcm9wcycgPT4gc3ViIHsgJGljdnt1c2VTdm5zeW5jUHJvcHN9ID0gMSB9LAorCQkgICdyZXdyaXRlLXJvb3Q9cycgPT4gc3ViIHsgJGljdntyZXdyaXRlUm9vdH0gPSAkX1sxXSB9LAorICAgICAgICAgICAgICAgICAgJXJlbW90ZV9vcHRzICk7CitteSAlY210X29wdHMgPSAoICdlZGl0fGUnID0+IFwkX2VkaXQsCisJCSdybWRpcicgPT4gXCRTVk46OkdpdDo6RWRpdG9yOjpfcm1kaXIsCisJCSdmaW5kLWNvcGllcy1oYXJkZXInID0+IFwkU1ZOOjpHaXQ6OkVkaXRvcjo6X2ZpbmRfY29waWVzX2hhcmRlciwKKwkJJ2w9aScgPT4gXCRTVk46OkdpdDo6RWRpdG9yOjpfcmVuYW1lX2xpbWl0LAorCQknY29weS1zaW1pbGFyaXR5fEM9aSc9PiBcJFNWTjo6R2l0OjpFZGl0b3I6Ol9jcF9zaW1pbGFyaXR5CispOworCitteSAlY21kID0gKAorCWZldGNoID0+IFsgXCZjbWRfZmV0Y2gsICJEb3dubG9hZCBuZXcgcmV2aXNpb25zIGZyb20gU1ZOIiwKKwkJCXsgJ3JldmlzaW9ufHI9cycgPT4gXCRfcmV2aXNpb24sCisJCQkgICdmZXRjaC1hbGx8YWxsJyA9PiBcJF9mZXRjaF9hbGwsCisJCQkgICAlZmNfb3B0cyB9IF0sCisJY2xvbmUgPT4gWyBcJmNtZF9jbG9uZSwgIkluaXRpYWxpemUgYW5kIGZldGNoIHJldmlzaW9ucyIsCisJCQl7ICdyZXZpc2lvbnxyPXMnID0+IFwkX3JldmlzaW9uLAorCQkJICAgJWZjX29wdHMsICVpbml0X29wdHMgfSBdLAorCWluaXQgPT4gWyBcJmNtZF9pbml0LCAiSW5pdGlhbGl6ZSBhIHJlcG8gZm9yIHRyYWNraW5nIiAuCisJCQkgICIgKHJlcXVpcmVzIFVSTCBhcmd1bWVudCkiLAorCQkJICBcJWluaXRfb3B0cyBdLAorCSdtdWx0aS1pbml0JyA9PiBbIFwmY21kX211bHRpX2luaXQsCisJICAgICAgICAgICAgICAgICAgIkRlcHJlY2F0ZWQgYWxpYXMgZm9yICIuCisJCQkgICInJDAgaW5pdCAtVDx0cnVuaz4gLWI8YnJhbmNoZXM+IC10PHRhZ3M+JyIsCisJCQkgIFwlaW5pdF9vcHRzIF0sCisJZGNvbW1pdCA9PiBbIFwmY21kX2Rjb21taXQsCisJICAgICAgICAgICAgICdDb21taXQgc2V2ZXJhbCBkaWZmcyB0byBtZXJnZSB3aXRoIHVwc3RyZWFtJywKKwkJCXsgJ21lcmdlfG18TScgPT4gXCRfbWVyZ2UsCisJCQkgICdzdHJhdGVneXxzPXMnID0+IFwkX3N0cmF0ZWd5LAorCQkJICAndmVyYm9zZXx2JyA9PiBcJF92ZXJib3NlLAorCQkJICAnZHJ5LXJ1bnxuJyA9PiBcJF9kcnlfcnVuLAorCQkJICAnZmV0Y2gtYWxsfGFsbCcgPT4gXCRfZmV0Y2hfYWxsLAorCQkJICAnbm8tcmViYXNlJyA9PiBcJF9ub19yZWJhc2UsCisJCQklY210X29wdHMsICVmY19vcHRzIH0gXSwKKwknc2V0LXRyZWUnID0+IFsgXCZjbWRfc2V0X3RyZWUsCisJICAgICAgICAgICAgICAgICJTZXQgYW4gU1ZOIHJlcG9zaXRvcnkgdG8gYSBnaXQgdHJlZS1pc2giLAorCQkJeyAnc3RkaW58JyA9PiBcJF9zdGRpbiwgJWNtdF9vcHRzLCAlZmNfb3B0cywgfSBdLAorCSdzaG93LWlnbm9yZScgPT4gWyBcJmNtZF9zaG93X2lnbm9yZSwgIlNob3cgc3ZuOmlnbm9yZSBsaXN0aW5ncyIsCisJCQl7ICdyZXZpc2lvbnxyPWknID0+IFwkX3JldmlzaW9uIH0gXSwKKwknbXVsdGktZmV0Y2gnID0+IFsgXCZjbWRfbXVsdGlfZmV0Y2gsCisJICAgICAgICAgICAgICAgICAgICJEZXByZWNhdGVkIGFsaWFzIGZvciAkMCBmZXRjaCAtLWFsbCIsCisJCQkgICB7ICdyZXZpc2lvbnxyPXMnID0+IFwkX3JldmlzaW9uLCAlZmNfb3B0cyB9IF0sCisJJ21pZ3JhdGUnID0+IFsgc3ViIHsgfSwKKwkgICAgICAgICAgICAgICAjIG5vLW9wLCB3ZSBhdXRvbWF0aWNhbGx5IHJ1biB0aGlzIGFueXdheXMsCisJICAgICAgICAgICAgICAgJ01pZ3JhdGUgY29uZmlndXJhdGlvbi9tZXRhZGF0YS9sYXlvdXQgZnJvbQorCQkgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIGdpdC1zdm4nLAorICAgICAgICAgICAgICAgICAgICAgICB7ICdtaW5pbWl6ZScgPT4gXCRHaXQ6OlNWTjo6TWlncmF0aW9uOjpfbWluaW1pemUsCisJCQkgJXJlbW90ZV9vcHRzIH0gXSwKKwknbG9nJyA9PiBbIFwmR2l0OjpTVk46OkxvZzo6Y21kX3Nob3dfbG9nLCAnU2hvdyBjb21taXQgbG9ncycsCisJCQl7ICdsaW1pdD1pJyA9PiBcJEdpdDo6U1ZOOjpMb2c6OmxpbWl0LAorCQkJICAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwKKwkJCSAgJ3ZlcmJvc2V8dicgPT4gXCRHaXQ6OlNWTjo6TG9nOjp2ZXJib3NlLAorCQkJICAnaW5jcmVtZW50YWwnID0+IFwkR2l0OjpTVk46OkxvZzo6aW5jcmVtZW50YWwsCisJCQkgICdvbmVsaW5lJyA9PiBcJEdpdDo6U1ZOOjpMb2c6Om9uZWxpbmUsCisJCQkgICdzaG93LWNvbW1pdCcgPT4gXCRHaXQ6OlNWTjo6TG9nOjpzaG93X2NvbW1pdCwKKwkJCSAgJ25vbi1yZWN1cnNpdmUnID0+IFwkR2l0OjpTVk46OkxvZzo6bm9uX3JlY3Vyc2l2ZSwKKwkJCSAgJ2F1dGhvcnMtZmlsZXxBPXMnID0+IFwkX2F1dGhvcnMsCisJCQkgICdjb2xvcicgPT4gXCRHaXQ6OlNWTjo6TG9nOjpjb2xvciwKKwkJCSAgJ3BhZ2VyPXMnID0+IFwkR2l0OjpTVk46OkxvZzo6cGFnZXIsCisJCQl9IF0sCisJJ2ZpbmQtcmV2JyA9PiBbIFwmY21kX2ZpbmRfcmV2LCAiVHJhbnNsYXRlIGJldHdlZW4gU1ZOIHJldmlzaW9uIG51bWJlcnMgYW5kIHRyZWUtaXNoIiwKKwkJCXsgfSBdLAorCSdyZWJhc2UnID0+IFsgXCZjbWRfcmViYXNlLCAiRmV0Y2ggYW5kIHJlYmFzZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IiwKKwkJCXsgJ21lcmdlfG18TScgPT4gXCRfbWVyZ2UsCisJCQkgICd2ZXJib3NlfHYnID0+IFwkX3ZlcmJvc2UsCisJCQkgICdzdHJhdGVneXxzPXMnID0+IFwkX3N0cmF0ZWd5LAorCQkJICAnbG9jYWx8bCcgPT4gXCRfbG9jYWwsCisJCQkgICdmZXRjaC1hbGx8YWxsJyA9PiBcJF9mZXRjaF9hbGwsCisJCQkgICVmY19vcHRzIH0gXSwKKwknY29tbWl0LWRpZmYnID0+IFsgXCZjbWRfY29tbWl0X2RpZmYsCisJICAgICAgICAgICAgICAgICAgICdDb21taXQgYSBkaWZmIGJldHdlZW4gdHdvIHRyZWVzJywKKwkJCXsgJ21lc3NhZ2V8bT1zJyA9PiBcJF9tZXNzYWdlLAorCQkJICAnZmlsZXxGPXMnID0+IFwkX2ZpbGUsCisJCQkgICdyZXZpc2lvbnxyPXMnID0+IFwkX3JldmlzaW9uLAorCQkJJWNtdF9vcHRzIH0gXSwKKyk7CisKK215ICRjbWQ7Citmb3IgKG15ICRpID0gMDsgJGkgPCBAQVJHVjsgJGkrKykgeworCWlmIChkZWZpbmVkICRjbWR7JEFSR1ZbJGldfSkgeworCQkkY21kID0gJEFSR1ZbJGldOworCQlzcGxpY2UgQEFSR1YsICRpLCAxOworCQlsYXN0OworCX0KK307CisKK215ICVvcHRzID0gJXskY21keyRjbWR9LT5bMl19IGlmIChkZWZpbmVkICRjbWQpOworCityZWFkX3JlcG9fY29uZmlnKFwlb3B0cyk7CitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSgncGFzc190aHJvdWdoJykgaWYgKCRjbWQgJiYgJGNtZCBlcSAnbG9nJyk7CitteSAkcnYgPSBHZXRPcHRpb25zKCVvcHRzLCAnaGVscHxIfGgnID0+IFwkX2hlbHAsICd2ZXJzaW9ufFYnID0+IFwkX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICdtaW5pbWl6ZS1jb25uZWN0aW9ucycgPT4gXCRHaXQ6OlNWTjo6TWlncmF0aW9uOjpfbWluaW1pemUsCisgICAgICAgICAgICAgICAgICAgICdpZHxpPXMnID0+IFwkR2l0OjpTVk46OmRlZmF1bHRfcmVmX2lkLAorICAgICAgICAgICAgICAgICAgICAnc3ZuLXJlbW90ZXxyZW1vdGV8Uj1zJyA9PiBzdWIgeworICAgICAgICAgICAgICAgICAgICAgICAkR2l0OjpTVk46Om5vX3JldXNlX2V4aXN0aW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgJEdpdDo6U1ZOOjpkZWZhdWx0X3JlcG9faWQgPSAkX1sxXSB9KTsKK2V4aXQgMSBpZiAoISRydiAmJiAkY21kICYmICRjbWQgbmUgJ2xvZycpOworCit1c2FnZSgwKSBpZiAkX2hlbHA7Cit2ZXJzaW9uKCkgaWYgJF92ZXJzaW9uOwordXNhZ2UoMSkgdW5sZXNzIGRlZmluZWQgJGNtZDsKK2xvYWRfYXV0aG9ycygpIGlmICRfYXV0aG9yczsKKworIyBtYWtlIHN1cmUgd2UncmUgYWx3YXlzIHJ1bm5pbmcKK3VubGVzcyAoJGNtZCA9fiAvKD86Y2xvbmV8aW5pdHxtdWx0aS1pbml0KSQvKSB7CisJdW5sZXNzICgtZCAkRU5We0dJVF9ESVJ9KSB7CisJCWlmICgkZ2l0X2Rpcl91c2VyX3NldCkgeworCQkJZGllICJHSVRfRElSPSRFTlZ7R0lUX0RJUn0gZXhwbGljaXRseSBzZXQsICIsCisJCQkgICAgImJ1dCBpdCBpcyBub3QgYSBkaXJlY3RvcnlcbiI7CisJCX0KKwkJbXkgJGdpdF9kaXIgPSBkZWxldGUgJEVOVntHSVRfRElSfTsKKwkJY2hvbXAobXkgJGNkdXAgPSBjb21tYW5kX29uZWxpbmUocXcvcmV2LXBhcnNlIC0tc2hvdy1jZHVwLykpOworCQl1bmxlc3MgKGxlbmd0aCAkY2R1cCkgeworCQkJZGllICJBbHJlYWR5IGF0IHRvcGxldmVsLCBidXQgJGdpdF9kaXIgIiwKKwkJCSAgICAibm90IGZvdW5kICckY2R1cCdcbiI7CisJCX0KKwkJY2hkaXIgJGNkdXAgb3IgZGllICJVbmFibGUgdG8gY2hkaXIgdXAgdG8gJyRjZHVwJ1xuIjsKKwkJdW5sZXNzICgtZCAkZ2l0X2RpcikgeworCQkJZGllICIkZ2l0X2RpciBzdGlsbCBub3QgZm91bmQgYWZ0ZXIgZ29pbmcgdG8gIiwKKwkJCSAgICAiJyRjZHVwJ1xuIjsKKwkJfQorCQkkRU5We0dJVF9ESVJ9ID0gJGdpdF9kaXI7CisJfQorfQordW5sZXNzICgkY21kID1+IC9eKD86Y2xvbmV8aW5pdHxtdWx0aS1pbml0fGNvbW1pdC1kaWZmKSQvKSB7CisJR2l0OjpTVk46Ok1pZ3JhdGlvbjo6bWlncmF0aW9uX2NoZWNrKCk7Cit9CitHaXQ6OlNWTjo6aW5pdF92YXJzKCk7CitldmFsIHsKKwlHaXQ6OlNWTjo6dmVyaWZ5X3JlbW90ZXNfc2FuaXR5KCk7CisJJGNtZHskY21kfS0+WzBdLT4oQEFSR1YpOworfTsKK2ZhdGFsICRAIGlmICRAOworcG9zdF9mZXRjaF9jaGVja291dCgpOworZXhpdCAwOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcmltYXJ5IGZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgdXNhZ2UgeworCW15ICRleGl0ID0gc2hpZnQgfHwgMDsKKwlteSAkZmQgPSAkZXhpdCA/IFwqU1RERVJSIDogXCpTVERPVVQ7CisJcHJpbnQgJGZkIDw8IiI7CitnaXQtc3ZuIC0gYmlkaXJlY3Rpb25hbCBvcGVyYXRpb25zIGJldHdlZW4gYSBzaW5nbGUgU3VidmVyc2lvbiB0cmVlIGFuZCBnaXQKK1VzYWdlOiAkMCA8Y29tbWFuZD4gW29wdGlvbnNdIFthcmd1bWVudHNdXG4KKworCXByaW50ICRmZCAiQXZhaWxhYmxlIGNvbW1hbmRzOlxuIiB1bmxlc3MgJGNtZDsKKworCWZvcmVhY2ggKHNvcnQga2V5cyAlY21kKSB7CisJCW5leHQgaWYgJGNtZCAmJiAkY21kIG5lICRfOworCQluZXh0IGlmIC9ebXVsdGktLzsgIyBkb24ndCBzaG93IGRlcHJlY2F0ZWQgY29tbWFuZHMKKwkJcHJpbnQgJGZkICcgICcscGFjaygnQTE3JywkXyksJGNtZHskX30tPlsxXSwiXG4iOworCQlmb3JlYWNoIChrZXlzICV7JGNtZHskX30tPlsyXX0pIHsKKwkJCSMgbWl4ZWQtY2FzZSBvcHRpb25zIGFyZSBmb3IgLmdpdC9jb25maWcgb25seQorCQkJbmV4dCBpZiAvW0EtWl0vICYmIC9eW2Etel0rJC9pOworCQkJIyBwcmludHMgb3V0IGFyZ3VtZW50cyBhcyB0aGV5IHNob3VsZCBiZSBwYXNzZWQ6CisJCQlteSAkeCA9IHMjWzo9XXMkIyMgPyAnPGFyZz4nIDogcyNbOj1daSQjIyA/ICc8bnVtPicgOiAnJzsKKwkJCXByaW50ICRmZCAnICcgeCAyMSwgam9pbignLCAnLCBtYXAgeyBsZW5ndGggJF8gPiAxID8KKwkJCQkJCQkiLS0kXyIgOiAiLSRfIiB9CisJCQkJCQlzcGxpdCAvXHwvLCRfKSwiICR4XG4iOworCQl9CisJfQorCXByaW50ICRmZCA8PCIiOworXG5HSVRfU1ZOX0lEIG1heSBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50IG9yIHZpYSB0aGUgLS1pZC8taSBzd2l0Y2ggdG8gYW4KK2FyYml0cmFyeSBpZGVudGlmaWVyIGlmIHlvdSdyZSB0cmFja2luZyBtdWx0aXBsZSBTVk4gYnJhbmNoZXMvcmVwb3NpdG9yaWVzIGluCitvbmUgZ2l0IHJlcG9zaXRvcnkgYW5kIHdhbnQgdG8ga2VlcCB0aGVtIHNlcGFyYXRlLiAgU2VlIGdpdC1zdm4oMSkgZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCisJZXhpdCAkZXhpdDsKK30KKworc3ViIHZlcnNpb24geworCXByaW50ICJnaXQtc3ZuIHZlcnNpb24gJFZFUlNJT04gKHN2biAkU1ZOOjpDb3JlOjpWRVJTSU9OKVxuIjsKKwlleGl0IDA7Cit9CisKK3N1YiBkb19naXRfaW5pdF9kYiB7CisJdW5sZXNzICgtZCAkRU5We0dJVF9ESVJ9KSB7CisJCW15IEBpbml0X2RiID0gKCdpbml0Jyk7CisJCXB1c2ggQGluaXRfZGIsICItLXRlbXBsYXRlPSRfdGVtcGxhdGUiIGlmIGRlZmluZWQgJF90ZW1wbGF0ZTsKKwkJaWYgKGRlZmluZWQgJF9zaGFyZWQpIHsKKwkJCWlmICgkX3NoYXJlZCA9fiAvW2Etel0vKSB7CisJCQkJcHVzaCBAaW5pdF9kYiwgIi0tc2hhcmVkPSRfc2hhcmVkIjsKKwkJCX0gZWxzZSB7CisJCQkJcHVzaCBAaW5pdF9kYiwgIi0tc2hhcmVkIjsKKwkJCX0KKwkJfQorCQljb21tYW5kX25vaXN5KEBpbml0X2RiKTsKKwl9CisJbXkgJHNldDsKKwlteSAkcGZ4ID0gInN2bi1yZW1vdGUuJEdpdDo6U1ZOOjpkZWZhdWx0X3JlcG9faWQiOworCWZvcmVhY2ggbXkgJGkgKGtleXMgJWljdikgeworCQlkaWUgIickc2V0JyBhbmQgJyRpJyBjYW5ub3QgYm90aCBiZSBzZXRcbiIgaWYgJHNldDsKKwkJbmV4dCB1bmxlc3MgZGVmaW5lZCAkaWN2eyRpfTsKKwkJY29tbWFuZF9ub2lzeSgnY29uZmlnJywgIiRwZnguJGkiLCAkaWN2eyRpfSk7CisJCSRzZXQgPSAkaTsKKwl9Cit9CisKK3N1YiBpbml0X3N1YmRpciB7CisJbXkgJHJlcG9fcGF0aCA9IHNoaWZ0IG9yIHJldHVybjsKKwlta3BhdGgoWyRyZXBvX3BhdGhdKSB1bmxlc3MgLWQgJHJlcG9fcGF0aDsKKwljaGRpciAkcmVwb19wYXRoIG9yIGRpZSAiQ291bGRuJ3QgY2hkaXIgdG8gJHJlcG9fcGF0aDogJCFcbiI7CisJJEVOVntHSVRfRElSfSA9ICcuZ2l0JzsKK30KKworc3ViIGNtZF9jbG9uZSB7CisJbXkgKCR1cmwsICRwYXRoKSA9IEBfOworCWlmICghZGVmaW5lZCAkcGF0aCAmJgorCSAgICAoZGVmaW5lZCAkX3RydW5rIHx8IGRlZmluZWQgJF9icmFuY2hlcyB8fCBkZWZpbmVkICRfdGFncykgJiYKKwkgICAgJHVybCAhfiBtI15bYS16XCtdKzovLyMpIHsKKwkJJHBhdGggPSAkdXJsOworCX0KKwkkcGF0aCA9IGJhc2VuYW1lKCR1cmwpIGlmICFkZWZpbmVkICRwYXRoIHx8ICFsZW5ndGggJHBhdGg7CisJY21kX2luaXQoJHVybCwgJHBhdGgpOworCUdpdDo6U1ZOOjpmZXRjaF9hbGwoJEdpdDo6U1ZOOjpkZWZhdWx0X3JlcG9faWQpOworfQorCitzdWIgY21kX2luaXQgeworCWlmIChkZWZpbmVkICRfdHJ1bmsgfHwgZGVmaW5lZCAkX2JyYW5jaGVzIHx8IGRlZmluZWQgJF90YWdzKSB7CisJCXJldHVybiBjbWRfbXVsdGlfaW5pdChAXyk7CisJfQorCW15ICR1cmwgPSBzaGlmdCBvciBkaWUgIlNWTiByZXBvc2l0b3J5IGxvY2F0aW9uIHJlcXVpcmVkICIsCisJICAgICAgICAgICAgICAgICAgICAgICAiYXMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnRcbiI7CisJaW5pdF9zdWJkaXIoQF8pOworCWRvX2dpdF9pbml0X2RiKCk7CisKKwlHaXQ6OlNWTi0+aW5pdCgkdXJsKTsKK30KKworc3ViIGNtZF9mZXRjaCB7CisJaWYgKGdyZXAgL15cZCs9Li8sIEBfKSB7CisJCWRpZSAiJzxyZXY+PTxjb21taXQ+JyBmZXRjaCBhcmd1bWVudHMgYXJlICIsCisJCSAgICAibm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiI7CisJfQorCW15ICgkcmVtb3RlKSA9IEBfOworCWlmIChAXyA+IDEpIHsKKwkJZGllICJVc2FnZTogJDAgZmV0Y2ggWy0tYWxsXSBbc3ZuLXJlbW90ZV1cbiI7CisJfQorCSRyZW1vdGUgfHw9ICRHaXQ6OlNWTjo6ZGVmYXVsdF9yZXBvX2lkOworCWlmICgkX2ZldGNoX2FsbCkgeworCQljbWRfbXVsdGlfZmV0Y2goKTsKKwl9IGVsc2UgeworCQlHaXQ6OlNWTjo6ZmV0Y2hfYWxsKCRyZW1vdGUsIEdpdDo6U1ZOOjpyZWFkX2FsbF9yZW1vdGVzKCkpOworCX0KK30KKworc3ViIGNtZF9zZXRfdHJlZSB7CisJbXkgKEBjb21taXRzKSA9IEBfOworCWlmICgkX3N0ZGluIHx8ICFAY29tbWl0cykgeworCQlwcmludCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iOworCQlAY29tbWl0cyA9ICgpOworCQl3aGlsZSAoPFNURElOPikgeworCQkJaWYgKC9cYigkc2hhMV9zaG9ydClcYi9vKSB7CisJCQkJdW5zaGlmdCBAY29tbWl0cywgJDE7CisJCQl9CisJCX0KKwl9CisJbXkgQHJldnM7CisJZm9yZWFjaCBteSAkYyAoQGNvbW1pdHMpIHsKKwkJbXkgQHRtcCA9IGNvbW1hbmQoJ3Jldi1wYXJzZScsJGMpOworCQlpZiAoc2NhbGFyIEB0bXAgPT0gMSkgeworCQkJcHVzaCBAcmV2cywgJHRtcFswXTsKKwkJfSBlbHNpZiAoc2NhbGFyIEB0bXAgPiAxKSB7CisJCQlwdXNoIEByZXZzLCByZXZlcnNlKGNvbW1hbmQoJ3Jldi1saXN0JyxAdG1wKSk7CisJCX0gZWxzZSB7CisJCQlmYXRhbCAiRmFpbGVkIHRvIHJldi1wYXJzZSAkY1xuIjsKKwkJfQorCX0KKwlteSAkZ3MgPSBHaXQ6OlNWTi0+bmV3OworCW15ICgkcl9sYXN0LCAkY210X2xhc3QpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJJGdzLT5mZXRjaDsKKwlpZiAoZGVmaW5lZCAkZ3MtPntsYXN0X3Jldn0gJiYgJHJfbGFzdCAhPSAkZ3MtPntsYXN0X3Jldn0pIHsKKwkJZmF0YWwgIlRoZXJlIGFyZSBuZXcgcmV2aXNpb25zIHRoYXQgd2VyZSBmZXRjaGVkICIsCisJCSAgICAgICJhbmQgbmVlZCB0byBiZSBtZXJnZWQgKG9yIGFja25vd2xlZGdlZCkgIiwKKwkJICAgICAgImJlZm9yZSBjb21taXR0aW5nLlxubGFzdCByZXY6ICRyX2xhc3RcbiIsCisJCSAgICAgICIgY3VycmVudDogJGdzLT57bGFzdF9yZXZ9XG4iOworCX0KKwkkZ3MtPnNldF90cmVlKCRfKSBmb3JlYWNoIEByZXZzOworCXByaW50ICJEb25lIGNvbW1pdHRpbmcgIixzY2FsYXIgQHJldnMsIiByZXZpc2lvbnMgdG8gU1ZOXG4iOworfQorCitzdWIgY21kX2Rjb21taXQgeworCW15ICRoZWFkID0gc2hpZnQ7CisJJGhlYWQgfHw9ICdIRUFEJzsKKwlteSBAcmVmczsKKwlteSAoJHVybCwgJHJldiwgJHV1aWQsICRncykgPSB3b3JraW5nX2hlYWRfaW5mbygkaGVhZCwgXEByZWZzKTsKKwl1bmxlc3MgKCRncykgeworCQlkaWUgIlVuYWJsZSB0byBkZXRlcm1pbmUgdXBzdHJlYW0gU1ZOIGluZm9ybWF0aW9uIGZyb20gIiwKKwkJICAgICIkaGVhZCBoaXN0b3J5XG4iOworCX0KKwlteSAkYyA9ICRyZWZzWy0xXTsKKwlteSAkbGFzdF9yZXY7CisJZm9yZWFjaCBteSAkZCAoQHJlZnMpIHsKKwkJaWYgKCF2ZXJpZnlfcmVmKCIkZH4xIikpIHsKKwkJCWZhdGFsICJDb21taXQgJGRcbiIsCisJCQkgICAgICAiaGFzIG5vIHBhcmVudCBjb21taXQsIGFuZCB0aGVyZWZvcmUgIiwKKwkJCSAgICAgICJub3RoaW5nIHRvIGRpZmYgYWdhaW5zdC5cbiIsCisJCQkgICAgICAiWW91IHNob3VsZCBiZSB3b3JraW5nIGZyb20gYSByZXBvc2l0b3J5ICIsCisJCQkgICAgICAib3JpZ2luYWxseSBjcmVhdGVkIGJ5IGdpdC1zdm5cbiI7CisJCX0KKwkJdW5sZXNzIChkZWZpbmVkICRsYXN0X3JldikgeworCQkJKHVuZGVmLCAkbGFzdF9yZXYsIHVuZGVmKSA9IGNtdF9tZXRhZGF0YSgiJGR+MSIpOworCQkJdW5sZXNzIChkZWZpbmVkICRsYXN0X3JldikgeworCQkJCWZhdGFsICJVbmFibGUgdG8gZXh0cmFjdCByZXZpc2lvbiBpbmZvcm1hdGlvbiAiLAorCQkJCSAgICAgICJmcm9tIGNvbW1pdCAkZH4xXG4iOworCQkJfQorCQl9CisJCWlmICgkX2RyeV9ydW4pIHsKKwkJCXByaW50ICJkaWZmLXRyZWUgJGR+MSAkZFxuIjsKKwkJfSBlbHNlIHsKKwkJCW15ICVlZF9vcHRzID0gKCByID0+ICRsYXN0X3JldiwKKwkJCSAgICAgICAgICAgICAgICBsb2cgPT4gZ2V0X2NvbW1pdF9lbnRyeSgkZCktPntsb2d9LAorCQkJICAgICAgICAgICAgICAgIHJhID0+IEdpdDo6U1ZOOjpSYS0+bmV3KCRncy0+ZnVsbF91cmwpLAorCQkJICAgICAgICAgICAgICAgIHRyZWVfYSA9PiAiJGR+MSIsCisJCQkgICAgICAgICAgICAgICAgdHJlZV9iID0+ICRkLAorCQkJICAgICAgICAgICAgICAgIGVkaXRvcl9jYiA9PiBzdWIgeworCQkJICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiQ29tbWl0dGVkIHIkX1swXVxuIjsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgJGxhc3RfcmV2ID0gJF9bMF07IH0sCisJCQkgICAgICAgICAgICAgICAgc3ZuX3BhdGggPT4gJycpOworCQkJaWYgKCFTVk46OkdpdDo6RWRpdG9yLT5uZXcoXCVlZF9vcHRzKS0+YXBwbHlfZGlmZikgeworCQkJCXByaW50ICJObyBjaGFuZ2VzXG4kZH4xID09ICRkXG4iOworCQkJfQorCQl9CisJfQorCXJldHVybiBpZiAkX2RyeV9ydW47CisJdW5sZXNzICgkZ3MpIHsKKwkJd2FybiAiQ291bGQgbm90IGRldGVybWluZSBmZXRjaCBpbmZvcm1hdGlvbiBmb3IgJHVybFxuIiwKKwkJICAgICAiV2lsbCBub3QgYXR0ZW1wdCB0byBmZXRjaCBhbmQgcmViYXNlIGNvbW1pdHMuXG4iLAorCQkgICAgICJUaGlzIHByb2JhYmx5IG1lYW5zIHlvdSBoYXZlIHVzZVN2bVByb3BzIGFuZCBzaG91bGRcbiIsCisJCSAgICAgIm5vdyByZXN5bmMgeW91ciBTVk46Ok1pcnJvciByZXBvc2l0b3J5LlxuIjsKKwkJcmV0dXJuOworCX0KKwkkX2ZldGNoX2FsbCA/ICRncy0+ZmV0Y2hfYWxsIDogJGdzLT5mZXRjaDsKKwl1bmxlc3MgKCRfbm9fcmViYXNlKSB7CisJCSMgd2UgYWx3YXlzIHdhbnQgdG8gcmViYXNlIGFnYWluc3QgdGhlIGN1cnJlbnQgSEVBRCwgbm90IGFueQorCQkjIGhlYWQgdGhhdCB3YXMgcGFzc2VkIHRvIHVzCisJCW15IEBkaWZmID0gY29tbWFuZCgnZGlmZi10cmVlJywgJ0hFQUQnLCAkZ3MtPnJlZm5hbWUsICctLScpOworCQlteSBAZmluaXNoOworCQlpZiAoQGRpZmYpIHsKKwkJCUBmaW5pc2ggPSByZWJhc2VfY21kKCk7CisJCQlwcmludCBTVERFUlIgIlc6IEhFQUQgYW5kICIsICRncy0+cmVmbmFtZSwgIiBkaWZmZXIsICIsCisJCQkJICAgICAidXNpbmcgQGZpbmlzaDpcbiIsICJAZGlmZiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiTm8gY2hhbmdlcyBiZXR3ZWVuIGN1cnJlbnQgSEVBRCBhbmQgIiwKKwkJCSAgICAgICRncy0+cmVmbmFtZSwgIlxuUmVzZXR0aW5nIHRvIHRoZSBsYXRlc3QgIiwKKwkJCSAgICAgICRncy0+cmVmbmFtZSwgIlxuIjsKKwkJCUBmaW5pc2ggPSBxdy9yZXNldCAtLW1peGVkLzsKKwkJfQorCQljb21tYW5kX25vaXN5KEBmaW5pc2gsICRncy0+cmVmbmFtZSk7CisJfQorfQorCitzdWIgY21kX2ZpbmRfcmV2IHsKKwlteSAkcmV2aXNpb25fb3JfaGFzaCA9IHNoaWZ0OworCW15ICRyZXN1bHQ7CisJaWYgKCRyZXZpc2lvbl9vcl9oYXNoID1+IC9eclxkKyQvKSB7CisJCW15ICRoZWFkID0gc2hpZnQ7CisJCSRoZWFkIHx8PSAnSEVBRCc7CisJCW15IEByZWZzOworCQlteSAodW5kZWYsIHVuZGVmLCB1bmRlZiwgJGdzKSA9IHdvcmtpbmdfaGVhZF9pbmZvKCRoZWFkLCBcQHJlZnMpOworCQl1bmxlc3MgKCRncykgeworCQkJZGllICJVbmFibGUgdG8gZGV0ZXJtaW5lIHVwc3RyZWFtIFNWTiBpbmZvcm1hdGlvbiBmcm9tICIsCisJCQkgICAgIiRoZWFkIGhpc3RvcnlcbiI7CisJCX0KKwkJbXkgJGRlc2lyZWRfcmV2aXNpb24gPSBzdWJzdHIoJHJldmlzaW9uX29yX2hhc2gsIDEpOworCQkkcmVzdWx0ID0gJGdzLT5yZXZfZGJfZ2V0KCRkZXNpcmVkX3JldmlzaW9uKTsKKwl9IGVsc2UgeworCQlteSAodW5kZWYsICRyZXYsIHVuZGVmKSA9IGNtdF9tZXRhZGF0YSgkcmV2aXNpb25fb3JfaGFzaCk7CisJCSRyZXN1bHQgPSAkcmV2OworCX0KKwlwcmludCAiJHJlc3VsdFxuIiBpZiAkcmVzdWx0OworfQorCitzdWIgY21kX3JlYmFzZSB7CisJY29tbWFuZF9ub2lzeShxdy91cGRhdGUtaW5kZXggLS1yZWZyZXNoLyk7CisJbXkgKCR1cmwsICRyZXYsICR1dWlkLCAkZ3MpID0gd29ya2luZ19oZWFkX2luZm8oJ0hFQUQnKTsKKwl1bmxlc3MgKCRncykgeworCQlkaWUgIlVuYWJsZSB0byBkZXRlcm1pbmUgdXBzdHJlYW0gU1ZOIGluZm9ybWF0aW9uIGZyb20gIiwKKwkJICAgICJ3b3JraW5nIHRyZWUgaGlzdG9yeVxuIjsKKwl9CisJaWYgKGNvbW1hbmQocXcvZGlmZi1pbmRleCBIRUFEIC0tLykpIHsKKwkJcHJpbnQgU1RERVJSICJDYW5ub3QgcmViYXNlIHdpdGggdW5jb21taXRlZCBjaGFuZ2VzOlxuIjsKKwkJY29tbWFuZF9ub2lzeSgnc3RhdHVzJyk7CisJCWV4aXQgMTsKKwl9CisJdW5sZXNzICgkX2xvY2FsKSB7CisJCSRfZmV0Y2hfYWxsID8gJGdzLT5mZXRjaF9hbGwgOiAkZ3MtPmZldGNoOworCX0KKwljb21tYW5kX25vaXN5KHJlYmFzZV9jbWQoKSwgJGdzLT5yZWZuYW1lKTsKK30KKworc3ViIGNtZF9zaG93X2lnbm9yZSB7CisJbXkgKCR1cmwsICRyZXYsICR1dWlkLCAkZ3MpID0gd29ya2luZ19oZWFkX2luZm8oJ0hFQUQnKTsKKwkkZ3MgfHw9IEdpdDo6U1ZOLT5uZXc7CisJbXkgJHIgPSAoZGVmaW5lZCAkX3JldmlzaW9uID8gJF9yZXZpc2lvbiA6ICRncy0+cmEtPmdldF9sYXRlc3RfcmV2bnVtKTsKKwkkZ3MtPnRyYXZlcnNlX2lnbm9yZShcKlNURE9VVCwgJGdzLT57cGF0aH0sICRyKTsKK30KKworc3ViIGNtZF9tdWx0aV9pbml0IHsKKwlteSAkdXJsID0gc2hpZnQ7CisJdW5sZXNzIChkZWZpbmVkICRfdHJ1bmsgfHwgZGVmaW5lZCAkX2JyYW5jaGVzIHx8IGRlZmluZWQgJF90YWdzKSB7CisJCXVzYWdlKDEpOworCX0KKworCSMgdGhlcmUgYXJlIGN1cnJlbnRseSBzb21lIGJ1Z3MgdGhhdCBwcmV2ZW50IG11bHRpLWluaXQvbXVsdGktZmV0Y2gKKwkjIHNldHVwcyBmcm9tIHdvcmtpbmcgd2VsbCB3aXRob3V0IHRoaXMuCisJJEdpdDo6U1ZOOjpfbWluaW1pemVfdXJsID0gMTsKKworCSRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJF9wcmVmaXg7CisJaWYgKGRlZmluZWQgJHVybCkgeworCQkkdXJsID1+IHMjLyskIyM7CisJCWluaXRfc3ViZGlyKEBfKTsKKwl9CisJZG9fZ2l0X2luaXRfZGIoKTsKKwlpZiAoZGVmaW5lZCAkX3RydW5rKSB7CisJCW15ICR0cnVua19yZWYgPSAkX3ByZWZpeCAuICd0cnVuayc7CisJCSMgdHJ5IGJvdGggb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgbG9va3VwczoKKwkJbXkgJGdzX3RydW5rID0gZXZhbCB7IEdpdDo6U1ZOLT5uZXcoJHRydW5rX3JlZikgfTsKKwkJdW5sZXNzICgkZ3NfdHJ1bmspIHsKKwkJCW15ICgkdHJ1bmtfdXJsLCAkdHJ1bmtfcGF0aCkgPQorCQkJICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX3N2bl91cmwoJHVybCwgJF90cnVuayk7CisJCQkkZ3NfdHJ1bmsgPSBHaXQ6OlNWTi0+aW5pdCgkdHJ1bmtfdXJsLCAkdHJ1bmtfcGF0aCwKKwkJCQkJCSAgIHVuZGVmLCAkdHJ1bmtfcmVmKTsKKwkJfQorCX0KKwlyZXR1cm4gdW5sZXNzIGRlZmluZWQgJF9icmFuY2hlcyB8fCBkZWZpbmVkICRfdGFnczsKKwlteSAkcmEgPSAkdXJsID8gR2l0OjpTVk46OlJhLT5uZXcoJHVybCkgOiB1bmRlZjsKKwljb21wbGV0ZV91cmxfbHNfaW5pdCgkcmEsICRfYnJhbmNoZXMsICctLWJyYW5jaGVzLy1iJywgJF9wcmVmaXgpOworCWNvbXBsZXRlX3VybF9sc19pbml0KCRyYSwgJF90YWdzLCAnLS10YWdzLy10JywgJF9wcmVmaXggLiAndGFncy8nKTsKK30KKworc3ViIGNtZF9tdWx0aV9mZXRjaCB7CisJbXkgJHJlbW90ZXMgPSBHaXQ6OlNWTjo6cmVhZF9hbGxfcmVtb3RlcygpOworCWZvcmVhY2ggbXkgJHJlcG9faWQgKHNvcnQga2V5cyAlJHJlbW90ZXMpIHsKKwkJaWYgKCRyZW1vdGVzLT57JHJlcG9faWR9LT57dXJsfSkgeworCQkJR2l0OjpTVk46OmZldGNoX2FsbCgkcmVwb19pZCwgJHJlbW90ZXMpOworCQl9CisJfQorfQorCisjIHRoaXMgY29tbWFuZCBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgcmVxdWlyZXMgbm8gbWV0YWRhdGEKK3N1YiBjbWRfY29tbWl0X2RpZmYgeworCW15ICgkdGEsICR0YiwgJHVybCkgPSBAXzsKKwlteSAkdXNhZ2UgPSAiVXNhZ2U6ICQwIGNvbW1pdC1kaWZmIC1yPHJldmlzaW9uPiAiLgorCSAgICAgICAgICAgICI8dHJlZS1pc2g+IDx0cmVlLWlzaD4gWzxVUkw+XVxuIjsKKwlmYXRhbCgkdXNhZ2UpIGlmICghZGVmaW5lZCAkdGEgfHwgIWRlZmluZWQgJHRiKTsKKwlteSAkc3ZuX3BhdGg7CisJaWYgKCFkZWZpbmVkICR1cmwpIHsKKwkJbXkgJGdzID0gZXZhbCB7IEdpdDo6U1ZOLT5uZXcgfTsKKwkJaWYgKCEkZ3MpIHsKKwkJCWZhdGFsKCJOZWVkZWQgVVJMIG9yIHVzYWJsZSBnaXQtc3ZuIC0taWQgaW4gIiwKKwkJCSAgICAgICJ0aGUgY29tbWFuZC1saW5lXG4iLCAkdXNhZ2UpOworCQl9CisJCSR1cmwgPSAkZ3MtPnt1cmx9OworCQkkc3ZuX3BhdGggPSAkZ3MtPntwYXRofTsKKwl9CisJdW5sZXNzIChkZWZpbmVkICRfcmV2aXNpb24pIHsKKwkJZmF0YWwoIi1yfC0tcmV2aXNpb24gaXMgYSByZXF1aXJlZCBhcmd1bWVudFxuIiwgJHVzYWdlKTsKKwl9CisJaWYgKGRlZmluZWQgJF9tZXNzYWdlICYmIGRlZmluZWQgJF9maWxlKSB7CisJCWZhdGFsKCJCb3RoIC0tbWVzc2FnZS8tbSBhbmQgLS1maWxlLy1GIHNwZWNpZmllZCAiLAorCQkgICAgICAiZm9yIHRoZSBjb21taXQgbWVzc2FnZS5cbiIsCisJCSAgICAgICJJIGhhdmUgbm8gaWRlYSB3aGF0IHlvdSBtZWFuXG4iKTsKKwl9CisJaWYgKGRlZmluZWQgJF9maWxlKSB7CisJCSRfbWVzc2FnZSA9IGZpbGVfdG9fcygkX2ZpbGUpOworCX0gZWxzZSB7CisJCSRfbWVzc2FnZSB8fD0gZ2V0X2NvbW1pdF9lbnRyeSgkdGIpLT57bG9nfTsKKwl9CisJbXkgJHJhIHx8PSBHaXQ6OlNWTjo6UmEtPm5ldygkdXJsKTsKKwkkc3ZuX3BhdGggfHw9ICRyYS0+e3N2bl9wYXRofTsKKwlteSAkciA9ICRfcmV2aXNpb247CisJaWYgKCRyIGVxICdIRUFEJykgeworCQkkciA9ICRyYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJfSBlbHNpZiAoJHIgIX4gL15cZCskLykgeworCQlkaWUgInJldmlzaW9uIGFyZ3VtZW50OiAkciBub3QgdW5kZXJzdG9vZCBieSBnaXQtc3ZuXG4iOworCX0KKwlteSAlZWRfb3B0cyA9ICggciA9PiAkciwKKwkgICAgICAgICAgICAgICAgbG9nID0+ICRfbWVzc2FnZSwKKwkgICAgICAgICAgICAgICAgcmEgPT4gJHJhLAorCSAgICAgICAgICAgICAgICB0cmVlX2EgPT4gJHRhLAorCSAgICAgICAgICAgICAgICB0cmVlX2IgPT4gJHRiLAorCSAgICAgICAgICAgICAgICBlZGl0b3JfY2IgPT4gc3ViIHsgcHJpbnQgIkNvbW1pdHRlZCByJF9bMF1cbiIgfSwKKwkgICAgICAgICAgICAgICAgc3ZuX3BhdGggPT4gJHN2bl9wYXRoICk7CisJaWYgKCFTVk46OkdpdDo6RWRpdG9yLT5uZXcoXCVlZF9vcHRzKS0+YXBwbHlfZGlmZikgeworCQlwcmludCAiTm8gY2hhbmdlc1xuJHRhID09ICR0YlxuIjsKKwl9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyB1dGlsaXR5IGZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiByZWJhc2VfY21kIHsKKwlteSBAY21kID0gcXcvcmViYXNlLzsKKwlwdXNoIEBjbWQsICctdicgaWYgJF92ZXJib3NlOworCXB1c2ggQGNtZCwgcXcvLS1tZXJnZS8gaWYgJF9tZXJnZTsKKwlwdXNoIEBjbWQsICItLXN0cmF0ZWd5PSRfc3RyYXRlZ3kiIGlmICRfc3RyYXRlZ3k7CisJQGNtZDsKK30KKworc3ViIHBvc3RfZmV0Y2hfY2hlY2tvdXQgeworCXJldHVybiBpZiAkX25vX2NoZWNrb3V0OworCW15ICRncyA9ICRHaXQ6OlNWTjo6X2hlYWQgb3IgcmV0dXJuOworCXJldHVybiBpZiB2ZXJpZnlfcmVmKCdyZWZzL2hlYWRzL21hc3Rlcl4wJyk7CisKKwlteSAkdmFsaWRfaGVhZCA9IHZlcmlmeV9yZWYoJ0hFQUReMCcpOworCWNvbW1hbmRfbm9pc3kocXcodXBkYXRlLXJlZiByZWZzL2hlYWRzL21hc3RlciksICRncy0+cmVmbmFtZSk7CisJcmV0dXJuIGlmICgkdmFsaWRfaGVhZCB8fCAhdmVyaWZ5X3JlZignSEVBRF4wJykpOworCisJcmV0dXJuIGlmICRFTlZ7R0lUX0RJUn0gIX4gbSNeKD86LiovKT9cLmdpdCQjOworCW15ICRpbmRleCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9IHx8ICIkRU5We0dJVF9ESVJ9L2luZGV4IjsKKwlyZXR1cm4gaWYgLWYgJGluZGV4OworCisJY2hvbXAobXkgJGJhcmUgPSBgZ2l0IGNvbmZpZyAtLWJvb2wgLS1nZXQgY29yZS5iYXJlYCk7CisJcmV0dXJuIGlmICRiYXJlIGVxICd0cnVlJzsKKwlyZXR1cm4gaWYgY29tbWFuZF9vbmVsaW5lKHF3L3Jldi1wYXJzZSAtLWlzLWluc2lkZS1naXQtZGlyLykgZXEgJ3RydWUnOworCWNvbW1hbmRfbm9pc3kocXcvcmVhZC10cmVlIC1tIC11IC12IEhFQUQgSEVBRC8pOworCXByaW50IFNUREVSUiAiQ2hlY2tlZCBvdXQgSEVBRDpcbiAgIiwKKwkgICAgICAgICAgICAgJGdzLT5mdWxsX3VybCwgIiByIiwgJGdzLT5sYXN0X3JldiwgIlxuIjsKK30KKworc3ViIGNvbXBsZXRlX3N2bl91cmwgeworCW15ICgkdXJsLCAkcGF0aCkgPSBAXzsKKwkkcGF0aCA9fiBzIy8rJCMjOworCWlmICgkcGF0aCAhfiBtI15bYS16XCtdKzovLyMpIHsKKwkJaWYgKCFkZWZpbmVkICR1cmwgfHwgJHVybCAhfiBtI15bYS16XCtdKzovLyMpIHsKKwkJCWZhdGFsKCJFOiAnJHBhdGgnIGlzIG5vdCBhIGNvbXBsZXRlIFVSTCAiLAorCQkJICAgICAgImFuZCBhIHNlcGFyYXRlIFVSTCBpcyBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJfQorCQlyZXR1cm4gKCR1cmwsICRwYXRoKTsKKwl9CisJcmV0dXJuICgkcGF0aCwgJycpOworfQorCitzdWIgY29tcGxldGVfdXJsX2xzX2luaXQgeworCW15ICgkcmEsICRyZXBvX3BhdGgsICRzd2l0Y2gsICRwZngpID0gQF87CisJdW5sZXNzICgkcmVwb19wYXRoKSB7CisJCXByaW50IFNUREVSUiAiVzogJHN3aXRjaCBub3Qgc3BlY2lmaWVkXG4iOworCQlyZXR1cm47CisJfQorCSRyZXBvX3BhdGggPX4gcyMvKyQjIzsKKwlpZiAoJHJlcG9fcGF0aCA9fiBtI15bYS16XCtdKzovLyMpIHsKKwkJJHJhID0gR2l0OjpTVk46OlJhLT5uZXcoJHJlcG9fcGF0aCk7CisJCSRyZXBvX3BhdGggPSAnJzsKKwl9IGVsc2UgeworCQkkcmVwb19wYXRoID1+IHMjXi8rIyM7CisJCXVubGVzcyAoJHJhKSB7CisJCQlmYXRhbCgiRTogJyRyZXBvX3BhdGgnIGlzIG5vdCBhIGNvbXBsZXRlIFVSTCAiLAorCQkJICAgICAgImFuZCBhIHNlcGFyYXRlIFVSTCBpcyBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJfQorCX0KKwlteSAkdXJsID0gJHJhLT57dXJsfTsKKwlteSAkZ3MgPSBHaXQ6OlNWTi0+aW5pdCgkdXJsLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCAxKTsKKwlteSAkayA9ICJzdm4tcmVtb3RlLiRncy0+e3JlcG9faWR9LnVybCI7CisJbXkgJG9yaWdfdXJsID0gZXZhbCB7IGNvbW1hbmRfb25lbGluZShxdy9jb25maWcgLS1nZXQvLCAkaykgfTsKKwlpZiAoJG9yaWdfdXJsICYmICgkb3JpZ191cmwgbmUgJGdzLT57dXJsfSkpIHsKKwkJZGllICIkayBhbHJlYWR5IHNldDogJG9yaWdfdXJsXG4iLAorCQkgICAgIndhbnRlZCB0byBzZXQgdG86ICRncy0+e3VybH1cbiI7CisJfQorCWNvbW1hbmRfb25lbGluZSgnY29uZmlnJywgJGssICRncy0+e3VybH0pIHVubGVzcyAkb3JpZ191cmw7CisJbXkgJHJlbW90ZV9wYXRoID0gIiRyYS0+e3N2bl9wYXRofS8kcmVwb19wYXRoLyoiOworCSRyZW1vdGVfcGF0aCA9fiBzIy8rIy8jZzsKKwkkcmVtb3RlX3BhdGggPX4gcyNeLyMjZzsKKwlteSAoJG4pID0gKCRzd2l0Y2ggPX4gL14tLShcdyspLyk7CisJaWYgKGxlbmd0aCAkcGZ4ICYmICRwZnggIX4gbSMvJCMpIHsKKwkJZGllICItLXByZWZpeD0nJHBmeCcgbXVzdCBoYXZlIGEgdHJhaWxpbmcgc2xhc2ggJy8nXG4iOworCX0KKwljb21tYW5kX25vaXN5KCdjb25maWcnLCAic3ZuLXJlbW90ZS4kZ3MtPntyZXBvX2lkfS4kbiIsCisJCQkJIiRyZW1vdGVfcGF0aDpyZWZzL3JlbW90ZXMvJHBmeCoiKTsKK30KKworc3ViIHZlcmlmeV9yZWYgeworCW15ICgkcmVmKSA9IEBfOworCWV2YWwgeyBjb21tYW5kX29uZWxpbmUoWyAncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJHJlZiBdLAorCSAgICAgICAgICAgICAgICAgICAgICAgeyBTVERFUlIgPT4gMCB9KTsgfTsKK30KKworc3ViIGdldF90cmVlX2Zyb21fdHJlZWlzaCB7CisJbXkgKCR0cmVlaXNoKSA9IEBfOworCSMgJHRyZWVpc2ggY2FuIGJlIGEgc3ltYm9saWMgcmVmLCB0b286CisJbXkgJHR5cGUgPSBjb21tYW5kX29uZWxpbmUocXcvY2F0LWZpbGUgLXQvLCAkdHJlZWlzaCk7CisJbXkgJGV4cGVjdGVkOworCXdoaWxlICgkdHlwZSBlcSAndGFnJykgeworCQkoJHRyZWVpc2gsICR0eXBlKSA9IGNvbW1hbmQocXcvY2F0LWZpbGUgdGFnLywgJHRyZWVpc2gpOworCX0KKwlpZiAoJHR5cGUgZXEgJ2NvbW1pdCcpIHsKKwkJJGV4cGVjdGVkID0gKGdyZXAgL150cmVlIC8sIGNvbW1hbmQocXcvY2F0LWZpbGUgY29tbWl0LywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyZWVpc2gpKVswXTsKKwkJKCRleHBlY3RlZCkgPSAoJGV4cGVjdGVkID1+IC9edHJlZSAoJHNoYTEpJC9vKTsKKwkJZGllICJVbmFibGUgdG8gZ2V0IHRyZWUgZnJvbSAkdHJlZWlzaFxuIiB1bmxlc3MgJGV4cGVjdGVkOworCX0gZWxzaWYgKCR0eXBlIGVxICd0cmVlJykgeworCQkkZXhwZWN0ZWQgPSAkdHJlZWlzaDsKKwl9IGVsc2UgeworCQlkaWUgIiR0cmVlaXNoIGlzIGEgJHR5cGUsIGV4cGVjdGVkIHRyZWUsIHRhZyBvciBjb21taXRcbiI7CisJfQorCXJldHVybiAkZXhwZWN0ZWQ7Cit9CisKK3N1YiBnZXRfY29tbWl0X2VudHJ5IHsKKwlteSAoJHRyZWVpc2gpID0gc2hpZnQ7CisJbXkgJWxvZ19lbnRyeSA9ICggbG9nID0+ICcnLCB0cmVlID0+IGdldF90cmVlX2Zyb21fdHJlZWlzaCgkdHJlZWlzaCkgKTsKKwlteSAkY29tbWl0X2VkaXRtc2cgPSAiJEVOVntHSVRfRElSfS9DT01NSVRfRURJVE1TRyI7CisJbXkgJGNvbW1pdF9tc2cgPSAiJEVOVntHSVRfRElSfS9DT01NSVRfTVNHIjsKKwlvcGVuIG15ICRsb2dfZmgsICc+JywgJGNvbW1pdF9lZGl0bXNnIG9yIGNyb2FrICQhOworCisJbXkgJHR5cGUgPSBjb21tYW5kX29uZWxpbmUocXcvY2F0LWZpbGUgLXQvLCAkdHJlZWlzaCk7CisJaWYgKCR0eXBlIGVxICdjb21taXQnIHx8ICR0eXBlIGVxICd0YWcnKSB7CisJCW15ICgkbXNnX2ZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoJ2NhdC1maWxlJywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSwgJHRyZWVpc2gpOworCQlteSAkaW5fbXNnID0gMDsKKwkJd2hpbGUgKDwkbXNnX2ZoPikgeworCQkJaWYgKCEkaW5fbXNnKSB7CisJCQkJJGluX21zZyA9IDEgaWYgKC9eXHMqJC8pOworCQkJfSBlbHNpZiAoL15naXQtc3ZuLWlkOiAvKSB7CisJCQkJIyBza2lwIHRoaXMgZm9yIG5vdywgd2UgcmVnZW5lcmF0ZSB0aGUKKwkJCQkjIGNvcnJlY3Qgb25lIG9uIHJlLWZldGNoIGFueXdheXMKKwkJCQkjIFRPRE86IHNldCAqOm1lcmdlIHByb3BlcnRpZXMgb3IgbGlrZS4uLgorCQkJfSBlbHNlIHsKKwkJCQlwcmludCAkbG9nX2ZoICRfIG9yIGNyb2FrICQhOworCQkJfQorCQl9CisJCWNvbW1hbmRfY2xvc2VfcGlwZSgkbXNnX2ZoLCAkY3R4KTsKKwl9CisJY2xvc2UgJGxvZ19maCBvciBjcm9hayAkITsKKworCWlmICgkX2VkaXQgfHwgKCR0eXBlIGVxICd0cmVlJykpIHsKKwkJbXkgJGVkaXRvciA9ICRFTlZ7VklTVUFMfSB8fCAkRU5We0VESVRPUn0gfHwgJ3ZpJzsKKwkJIyBUT0RPOiBzdHJpcCBvdXQgc3BhY2VzLCBjb21tZW50cywgbGlrZSBnaXQtY29tbWl0LnNoCisJCXN5c3RlbSgkZWRpdG9yLCAkY29tbWl0X2VkaXRtc2cpOworCX0KKwlyZW5hbWUgJGNvbW1pdF9lZGl0bXNnLCAkY29tbWl0X21zZyBvciBjcm9hayAkITsKKwlvcGVuICRsb2dfZmgsICc8JywgJGNvbW1pdF9tc2cgb3IgY3JvYWsgJCE7CisJeyBsb2NhbCAkLzsgY2hvbXAoJGxvZ19lbnRyeXtsb2d9ID0gPCRsb2dfZmg+KTsgfQorCWNsb3NlICRsb2dfZmggb3IgY3JvYWsgJCE7CisJdW5saW5rICRjb21taXRfbXNnOworCVwlbG9nX2VudHJ5OworfQorCitzdWIgc190b19maWxlIHsKKwlteSAoJHN0ciwgJGZpbGUsICRtb2RlKSA9IEBfOworCW9wZW4gbXkgJGZkLCc+JywkZmlsZSBvciBjcm9hayAkITsKKwlwcmludCAkZmQgJHN0ciwiXG4iIG9yIGNyb2FrICQhOworCWNsb3NlICRmZCBvciBjcm9hayAkITsKKwljaG1vZCAoJG1vZGUgJn4gdW1hc2ssICRmaWxlKSBpZiAoZGVmaW5lZCAkbW9kZSk7Cit9CisKK3N1YiBmaWxlX3RvX3MgeworCW15ICRmaWxlID0gc2hpZnQ7CisJb3BlbiBteSAkZmQsJzwnLCRmaWxlIG9yIGNyb2FrICIkITogZmlsZTogJGZpbGVcbiI7CisJbG9jYWwgJC87CisJbXkgJHJldCA9IDwkZmQ+OworCWNsb3NlICRmZCBvciBjcm9hayAkITsKKwkkcmV0ID1+IHMvXHMqJC8vczsKKwlyZXR1cm4gJHJldDsKK30KKworIyAnPHN2biB1c2VybmFtZT4gPSByZWFsLW5hbWUgPGVtYWlsIGFkZHJlc3M+JyBtYXBwaW5nIGJhc2VkIG9uIGdpdC1zdm5pbXBvcnQ6CitzdWIgbG9hZF9hdXRob3JzIHsKKwlvcGVuIG15ICRhdXRob3JzLCAnPCcsICRfYXV0aG9ycyBvciBkaWUgIkNhbid0IG9wZW4gJF9hdXRob3JzICQhXG4iOworCW15ICRsb2cgPSAkY21kIGVxICdsb2cnOworCXdoaWxlICg8JGF1dGhvcnM+KSB7CisJCWNob21wOworCQluZXh0IHVubGVzcyAvXihcUys/fFwobm8gYXV0aG9yXCkpXHMqPVxzKiguKz8pXHMqPCguKyk+XHMqJC87CisJCW15ICgkdXNlciwgJG5hbWUsICRlbWFpbCkgPSAoJDEsICQyLCAkMyk7CisJCWlmICgkbG9nKSB7CisJCQkkR2l0OjpTVk46OkxvZzo6cnVzZXJzeyIkbmFtZSA8JGVtYWlsPiJ9ID0gJHVzZXI7CisJCX0gZWxzZSB7CisJCQkkdXNlcnN7JHVzZXJ9ID0gWyRuYW1lLCAkZW1haWxdOworCQl9CisJfQorCWNsb3NlICRhdXRob3JzIG9yIGNyb2FrICQhOworfQorCisjIGNvbnZlcnQgR2V0T3B0OjpMb25nIHNwZWNzIGZvciB1c2UgYnkgZ2l0LWNvbmZpZworc3ViIHJlYWRfcmVwb19jb25maWcgeworCXJldHVybiB1bmxlc3MgLWQgJEVOVntHSVRfRElSfTsKKwlteSAkb3B0cyA9IHNoaWZ0OworCW15IEBjb25maWdfb25seTsKKwlmb3JlYWNoIG15ICRvIChrZXlzICUkb3B0cykgeworCQkjIGlmIHdlIGhhdmUgbWl4ZWRDYXNlIGFuZCBhIGxvbmcgb3B0aW9uLW9ubHksIHRoZW4KKwkJIyBpdCdzIGEgY29uZmlnLW9ubHkgdmFyaWFibGUgdGhhdCB3ZSBkb24ndCBuZWVkIGZvcgorCQkjIHRoZSBjb21tYW5kLWxpbmUuCisJCXB1c2ggQGNvbmZpZ19vbmx5LCAkbyBpZiAoJG8gPX4gL1tBLVpdLyAmJiAkbyA9fiAvXlthLXpdKyQvaSk7CisJCW15ICR2ID0gJG9wdHMtPnskb307CisJCW15ICgka2V5KSA9ICgkbyA9fiAvXihbYS16QS1aXC1dKykvKTsKKwkJJGtleSA9fiBzLy0vL2c7CisJCW15ICRhcmcgPSAnZ2l0LWNvbmZpZyc7CisJCSRhcmcgLj0gJyAtLWludCcgaWYgKCRvID1+IC9bOj1daSQvKTsKKwkJJGFyZyAuPSAnIC0tYm9vbCcgaWYgKCRvICF+IC9bOj1dW3NmaV0kLyk7CisJCWlmIChyZWYgJHYgZXEgJ0FSUkFZJykgeworCQkJY2hvbXAobXkgQHRtcCA9IGAkYXJnIC0tZ2V0LWFsbCBzdm4uJGtleWApOworCQkJQCR2ID0gQHRtcCBpZiBAdG1wOworCQl9IGVsc2UgeworCQkJY2hvbXAobXkgJHRtcCA9IGAkYXJnIC0tZ2V0IHN2bi4ka2V5YCk7CisJCQlpZiAoJHRtcCAmJiAhKCRhcmcgPX4gLyAtLWJvb2wvICYmICR0bXAgZXEgJ2ZhbHNlJykpIHsKKwkJCQkkJHYgPSAkdG1wOworCQkJfQorCQl9CisJfQorCWRlbGV0ZSBAJG9wdHN7QGNvbmZpZ19vbmx5fSBpZiBAY29uZmlnX29ubHk7Cit9CisKK3N1YiBleHRyYWN0X21ldGFkYXRhIHsKKwlteSAkaWQgPSBzaGlmdCBvciByZXR1cm4gKHVuZGVmLCB1bmRlZiwgdW5kZWYpOworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCkgPSAoJGlkID1+IC9eZ2l0LXN2bi1pZDpccyhcUys/KVxAKFxkKykKKwkJCQkJCQlccyhbYS1mXGRcLV0rKSQveCk7CisJaWYgKCFkZWZpbmVkICRyZXYgfHwgISR1dWlkIHx8ICEkdXJsKSB7CisJCSMgc29tZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yaWVzIEkgbWFkZSBoYWQKKwkJIyBpZGVudGlmaWVycyBsaWtlIHRoaXM6CisJCSgkcmV2LCAkdXVpZCkgPSAoJGlkID1+L15naXQtc3ZuLWlkOlxzKFxkKylcQChbYS1mXGRcLV0rKS8pOworCX0KKwlyZXR1cm4gKCR1cmwsICRyZXYsICR1dWlkKTsKK30KKworc3ViIGNtdF9tZXRhZGF0YSB7CisJcmV0dXJuIGV4dHJhY3RfbWV0YWRhdGEoKGdyZXAoL15naXQtc3ZuLWlkOiAvLAorCQljb21tYW5kKHF3L2NhdC1maWxlIGNvbW1pdC8sIHNoaWZ0KSkpWy0xXSk7Cit9CisKK3N1YiB3b3JraW5nX2hlYWRfaW5mbyB7CisJbXkgKCRoZWFkLCAkcmVmcykgPSBAXzsKKwlteSAoJGZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoJ3Jldi1saXN0JywgJGhlYWQpOworCXdoaWxlIChteSAkaGFzaCA9IDwkZmg+KSB7CisJCWNob21wKCRoYXNoKTsKKwkJbXkgKCR1cmwsICRyZXYsICR1dWlkKSA9IGNtdF9tZXRhZGF0YSgkaGFzaCk7CisJCWlmIChkZWZpbmVkICR1cmwgJiYgZGVmaW5lZCAkcmV2KSB7CisJCQlpZiAobXkgJGdzID0gR2l0OjpTVk4tPmZpbmRfYnlfdXJsKCR1cmwpKSB7CisJCQkJbXkgJGMgPSAkZ3MtPnJldl9kYl9nZXQoJHJldik7CisJCQkJaWYgKCRjICYmICRjIGVxICRoYXNoKSB7CisJCQkJCWNsb3NlICRmaDsgIyBicmVhayB0aGUgcGlwZQorCQkJCQlyZXR1cm4gKCR1cmwsICRyZXYsICR1dWlkLCAkZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCQl1bnNoaWZ0IEAkcmVmcywgJGhhc2ggaWYgJHJlZnM7CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCSh1bmRlZiwgdW5kZWYsIHVuZGVmLCB1bmRlZik7Cit9CisKK3BhY2thZ2UgR2l0OjpTVk47Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIHZhcnMgcXcvJGRlZmF1bHRfcmVwb19pZCAkZGVmYXVsdF9yZWZfaWQgJF9ub19tZXRhZGF0YSAkX2ZvbGxvd19wYXJlbnQKKyAgICAgICAgICAgICRfcmVwYWNrICRfcmVwYWNrX2ZsYWdzICRfdXNlX3N2bV9wcm9wcyAkX2hlYWQKKyAgICAgICAgICAgICRfdXNlX3N2bnN5bmNfcHJvcHMgJG5vX3JldXNlX2V4aXN0aW5nICRfbWluaW1pemVfdXJsLzsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBGaWxlOjpQYXRoIHF3L21rcGF0aC87Cit1c2UgRmlsZTo6Q29weSBxdy9jb3B5LzsKK3VzZSBJUEM6Ok9wZW4zOworCitteSAkX3JlcGFja19ucjsKKyMgcHJvcGVydGllcyB0aGF0IHdlIGRvIG5vdCBsb2c6CitteSAlU0tJUF9QUk9QOworQkVHSU4geworCSVTS0lQX1BST1AgPSBtYXAgeyAkXyA9PiAxIH0gcXcvc3ZuOndjOnJhX2Rhdjp2ZXJzaW9uLXVybAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZuOnNwZWNpYWwgc3ZuOmV4ZWN1dGFibGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bjplbnRyeTpjb21taXR0ZWQtcmV2CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm46ZW50cnk6bGFzdC1hdXRob3IKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bjplbnRyeTp1dWlkCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm46ZW50cnk6Y29tbWl0dGVkLWRhdGUvOworCisJIyBzb21lIG9wdGlvbnMgYXJlIHJlYWQgZ2xvYmFsbHksIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBsb2NhbGx5CisJIyBwZXIgW3N2bi1yZW1vdGUgIi4uLiJdIHNlY3Rpb24uICBDb21tYW5kLWxpbmUgb3B0aW9ucyB3aWxsICpOT1QqCisJIyBvdmVycmlkZSBvcHRpb25zIHNldCBpbiBhbiBbc3ZuLXJlbW90ZSAiLi4uIl0gc2VjdGlvbgorCW15ICRlOworCWZvcmVhY2ggKHF3L2ZvbGxvd19wYXJlbnQgbm9fbWV0YWRhdGEgdXNlX3N2bV9wcm9wcworCSAgICAgICAgICAgIHVzZV9zdm5zeW5jX3Byb3BzLykgeworCQlteSAka2V5ID0gJF87CisJCSRrZXkgPX4gdHIvXy8vZDsKKwkJJGUgLj0gInN1YiAkXyB7CisJCQlteSAoXCRzZWxmKSA9IFxAXzsKKwkJCXJldHVybiBcJHNlbGYtPnstJF99IGlmIGV4aXN0cyBcJHNlbGYtPnstJF99OworCQkJbXkgXCRrID0gXCJzdm4tcmVtb3RlLlwkc2VsZi0+e3JlcG9faWR9XC4ka2V5XCI7CisJCQlldmFsIHsgY29tbWFuZF9vbmVsaW5lKHF3L2NvbmZpZyAtLWdldC8sIFwkaykgfTsKKwkJCWlmIChcJEApIHsKKwkJCQlcJHNlbGYtPnstJF99ID0gXCRHaXQ6OlNWTjo6XyRfOworCQkJfSBlbHNlIHsKKwkJCQlteSBcJHYgPSBjb21tYW5kX29uZWxpbmUocXcvY29uZmlnIC0tYm9vbC8sXCRrKTsKKwkJCQlcJHNlbGYtPnstJF99ID0gXCR2IGVxICdmYWxzZScgPyAwIDogMTsKKwkJCX0KKwkJCXJldHVybiBcJHNlbGYtPnstJF99IH1cbiI7CisJfQorCSRlIC49ICIxO1xuIjsKKwlldmFsICRlIG9yIGRpZSAkQDsKK30KKworbXkgJUxPQ0tGSUxFUzsKK0VORCB7IHVubGluayBrZXlzICVMT0NLRklMRVMgaWYgJUxPQ0tGSUxFUyB9CisKK3N1YiByZXNvbHZlX2xvY2FsX2dsb2JzIHsKKwlteSAoJHVybCwgJGZldGNoLCAkZ2xvYl9zcGVjKSA9IEBfOworCXJldHVybiB1bmxlc3MgZGVmaW5lZCAkZ2xvYl9zcGVjOworCW15ICRyZWYgPSAkZ2xvYl9zcGVjLT57cmVmfTsKKwlteSAkcGF0aCA9ICRnbG9iX3NwZWMtPntwYXRofTsKKwlmb3JlYWNoIChjb21tYW5kKHF3I2Zvci1lYWNoLXJlZiAtLWZvcm1hdD0lKHJlZm5hbWUpIHJlZnMvcmVtb3RlcyMpKSB7CisJCW5leHQgdW5sZXNzIG0jXnJlZnMvcmVtb3Rlcy8kcmVmLT57cmVnZXh9JCM7CisJCW15ICRwID0gJDE7CisJCW15ICRwYXRobmFtZSA9ICRwYXRoLT5mdWxsX3BhdGgoJHApOworCQlteSAkcmVmbmFtZSA9ICRyZWYtPmZ1bGxfcGF0aCgkcCk7CisJCWlmIChteSAkZXhpc3RpbmcgPSAkZmV0Y2gtPnskcGF0aG5hbWV9KSB7CisJCQlpZiAoJGV4aXN0aW5nIG5lICRyZWZuYW1lKSB7CisJCQkJZGllICJSZWZzcGVjIGNvbmZsaWN0OlxuIiwKKwkJCQkgICAgImV4aXN0aW5nOiByZWZzL3JlbW90ZXMvJGV4aXN0aW5nXG4iLAorCQkJCSAgICAiIGdsb2JiZWQ6IHJlZnMvcmVtb3Rlcy8kcmVmbmFtZVxuIjsKKwkJCX0KKwkJCW15ICR1ID0gKDo6Y210X21ldGFkYXRhKCJyZWZzL3JlbW90ZXMvJHJlZm5hbWUiKSlbMF07CisJCQkkdSA9fiBzIV5cUSR1cmxcRSgvfCQpISEgb3IgZGllCisJCQkgICJyZWZzL3JlbW90ZXMvJHJlZm5hbWU6ICckdXJsJyBub3QgZm91bmQgaW4gJyR1J1xuIjsKKwkJCWlmICgkcGF0aG5hbWUgbmUgJHUpIHsKKwkJCQl3YXJuICJXOiBSZWZzcGVjIGdsb2IgY29uZmxpY3QgIiwKKwkJCQkgICAgICIocmVmOiByZWZzL3JlbW90ZXMvJHJlZm5hbWUpOlxuIiwKKwkJCQkgICAgICJleHBlY3RlZCBwYXRoOiAkcGF0aG5hbWVcbiIsCisJCQkJICAgICAiICAgIHJlYWwgcGF0aDogJHVcbiIsCisJCQkJICAgICAiQ29udGludWluZyBhaGVhZCB3aXRoICR1XG4iOworCQkJCW5leHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkZmV0Y2gtPnskcGF0aG5hbWV9ID0gJHJlZm5hbWU7CisJCX0KKwl9Cit9CisKK3N1YiBwYXJzZV9yZXZpc2lvbl9hcmd1bWVudCB7CisJbXkgKCRiYXNlLCAkaGVhZCkgPSBAXzsKKwlpZiAoIWRlZmluZWQgJDo6X3JldmlzaW9uIHx8ICQ6Ol9yZXZpc2lvbiBlcSAnQkFTRTpIRUFEJykgeworCQlyZXR1cm4gKCRiYXNlLCAkaGVhZCk7CisJfQorCXJldHVybiAoJDEsICQyKSBpZiAoJDo6X3JldmlzaW9uID1+IC9eKFxkKyk6KFxkKykkLyk7CisJcmV0dXJuICgkOjpfcmV2aXNpb24sICQ6Ol9yZXZpc2lvbikgaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXlxkKyQvKTsKKwlyZXR1cm4gKCRoZWFkLCAkaGVhZCkgaWYgKCQ6Ol9yZXZpc2lvbiBlcSAnSEVBRCcpOworCXJldHVybiAoJGJhc2UsICQxKSBpZiAoJDo6X3JldmlzaW9uID1+IC9eQkFTRTooXGQrKSQvKTsKKwlyZXR1cm4gKCQxLCAkaGVhZCkgaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXihcZCspOkhFQUQkLyk7CisJZGllICJyZXZpc2lvbiBhcmd1bWVudDogJDo6X3JldmlzaW9uIG5vdCB1bmRlcnN0b29kIGJ5IGdpdC1zdm5cbiI7Cit9CisKK3N1YiBmZXRjaF9hbGwgeworCW15ICgkcmVwb19pZCwgJHJlbW90ZXMpID0gQF87CisJaWYgKHJlZiAkcmVwb19pZCkgeworCQlteSAkZ3MgPSAkcmVwb19pZDsKKwkJJHJlcG9faWQgPSB1bmRlZjsKKwkJJHJlcG9faWQgPSAkZ3MtPntyZXBvX2lkfTsKKwl9CisJJHJlbW90ZXMgfHw9IHJlYWRfYWxsX3JlbW90ZXMoKTsKKwlteSAkcmVtb3RlID0gJHJlbW90ZXMtPnskcmVwb19pZH0gb3IKKwkgICAgICAgICAgICAgZGllICJbc3ZuLXJlbW90ZSBcIiRyZXBvX2lkXCJdIHVua25vd25cbiI7CisJbXkgJGZldGNoID0gJHJlbW90ZS0+e2ZldGNofTsKKwlteSAkdXJsID0gJHJlbW90ZS0+e3VybH0gb3IgZGllICJzdm4tcmVtb3RlLiRyZXBvX2lkLnVybCBub3QgZGVmaW5lZFxuIjsKKwlteSAoQGdzLCBAZ2xvYnMpOworCW15ICRyYSA9IEdpdDo6U1ZOOjpSYS0+bmV3KCR1cmwpOworCW15ICR1dWlkID0gJHJhLT5nZXRfdXVpZDsKKwlteSAkaGVhZCA9ICRyYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJbXkgJGJhc2UgPSBkZWZpbmVkICRmZXRjaCA/ICRoZWFkIDogMDsKKworCSMgcmVhZCB0aGUgbWF4IHJldnMgZm9yIHdpbGRjYXJkIGV4cGFuc2lvbiAoYnJhbmNoZXMvKiwgdGFncy8qKQorCWZvcmVhY2ggbXkgJHQgKHF3L2JyYW5jaGVzIHRhZ3MvKSB7CisJCWRlZmluZWQgJHJlbW90ZS0+eyR0fSBvciBuZXh0OworCQlwdXNoIEBnbG9icywgJHJlbW90ZS0+eyR0fTsKKwkJbXkgJG1heF9yZXYgPSBldmFsIHsgdG1wX2NvbmZpZyhxdy8tLWludCAtLWdldC8sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAic3ZuLXJlbW90ZS4kcmVwb19pZC4ke3R9LW1heFJldiIpIH07CisJCWlmIChkZWZpbmVkICRtYXhfcmV2ICYmICgkbWF4X3JldiA8ICRiYXNlKSkgeworCQkJJGJhc2UgPSAkbWF4X3JldjsKKwkJfSBlbHNpZiAoIWRlZmluZWQgJG1heF9yZXYpIHsKKwkJCSRiYXNlID0gMDsKKwkJfQorCX0KKworCWlmICgkZmV0Y2gpIHsKKwkJZm9yZWFjaCBteSAkcCAoc29ydCBrZXlzICUkZmV0Y2gpIHsKKwkJCW15ICRncyA9IEdpdDo6U1ZOLT5uZXcoJGZldGNoLT57JHB9LCAkcmVwb19pZCwgJHApOworCQkJbXkgJGxyID0gJGdzLT5yZXZfZGJfbWF4OworCQkJaWYgKGRlZmluZWQgJGxyKSB7CisJCQkJJGJhc2UgPSAkbHIgaWYgKCRsciA8ICRiYXNlKTsKKwkJCX0KKwkJCXB1c2ggQGdzLCAkZ3M7CisJCX0KKwl9CisKKwkoJGJhc2UsICRoZWFkKSA9IHBhcnNlX3JldmlzaW9uX2FyZ3VtZW50KCRiYXNlLCAkaGVhZCk7CisJJHJhLT5nc19mZXRjaF9sb29wX2NvbW1vbigkYmFzZSwgJGhlYWQsIFxAZ3MsIFxAZ2xvYnMpOworfQorCitzdWIgcmVhZF9hbGxfcmVtb3RlcyB7CisJbXkgJHIgPSB7fTsKKwlmb3JlYWNoIChncmVwIHsgcy9ec3ZuLXJlbW90ZVwuLy8gfSBjb21tYW5kKHF3L2NvbmZpZyAtbC8pKSB7CisJCWlmIChtIV4oLispXC5mZXRjaD1ccyooLiopXHMqOlxzKnJlZnMvcmVtb3Rlcy8oLispXHMqJCEpIHsKKwkJCSRyLT57JDF9LT57ZmV0Y2h9LT57JDJ9ID0gJDM7CisJCX0gZWxzaWYgKG0hXiguKylcLnVybD1ccyooLiopXHMqJCEpIHsKKwkJCSRyLT57JDF9LT57dXJsfSA9ICQyOworCQl9IGVsc2lmIChtIV4oLispXC4oYnJhbmNoZXN8dGFncyk9CisJCSAgICAgICAgICAgKC4qKTpyZWZzL3JlbW90ZXMvKC4rKVxzKiQvIXgpIHsKKwkJCW15ICgkcCwgJGcpID0gKCQzLCAkNCk7CisJCQlteSAkcnMgPSAkci0+eyQxfS0+eyQyfSA9IHsKKwkJCSAgICAgICAgICAgICAgICAgIHQgPT4gJDIsCisJCQkJCSAgcmVtb3RlID0+ICQxLAorCQkJICAgICAgICAgICAgICAgICAgcGF0aCA9PiBHaXQ6OlNWTjo6R2xvYlNwZWMtPm5ldygkcCksCisJCQkgICAgICAgICAgICAgICAgICByZWYgPT4gR2l0OjpTVk46Okdsb2JTcGVjLT5uZXcoJGcpIH07CisJCQlpZiAobGVuZ3RoKCRycy0+e3JlZn0tPntyaWdodH0pICE9IDApIHsKKwkJCQlkaWUgIlRoZSAnKicgZ2xvYiBjaGFyYWN0ZXIgbXVzdCBiZSB0aGUgbGFzdCAiLAorCQkJCSAgICAiY2hhcmFjdGVyIG9mICckZydcbiI7CisJCQl9CisJCX0KKwl9CisJJHI7Cit9CisKK3N1YiBpbml0X3ZhcnMgeworCWlmIChkZWZpbmVkICRfcmVwYWNrKSB7CisJCSRfcmVwYWNrID0gMTAwMCBpZiAoJF9yZXBhY2sgPD0gMCk7CisJCSRfcmVwYWNrX25yID0gJF9yZXBhY2s7CisJCSRfcmVwYWNrX2ZsYWdzIHx8PSAnLWQnOworCX0KK30KKworc3ViIHZlcmlmeV9yZW1vdGVzX3Nhbml0eSB7CisJcmV0dXJuIHVubGVzcyAtZCAkRU5We0dJVF9ESVJ9OworCW15ICVzZWVuOworCWZvcmVhY2ggKGNvbW1hbmQocXcvY29uZmlnIC1sLykpIHsKKwkJaWYgKG0hXnN2bi1yZW1vdGVcLig/Oi4rKVwuZmV0Y2g9Lio6cmVmcy9yZW1vdGVzLyhcUyspXHMqJCEpIHsKKwkJCWlmICgkc2VlbnskMX0pIHsKKwkJCQlkaWUgIlJlbW90ZSByZWYgcmVmcy9yZW1vdGUvJDEgaXMgdHJhY2tlZCBieSIsCisJCQkJICAgICJcbiAgXCIkX1wiXG5hbmRcbiAgXCIkc2VlbnskMX1cIlxuIiwKKwkJCQkgICAgIlBsZWFzZSByZXNvbHZlIHRoaXMgYW1iaWd1aXR5IGluICIsCisJCQkJICAgICJ5b3VyIGdpdCBjb25maWd1cmF0aW9uIGZpbGUgYmVmb3JlICIsCisJCQkJICAgICJjb250aW51aW5nXG4iOworCQkJfQorCQkJJHNlZW57JDF9ID0gJF87CisJCX0KKwl9Cit9CisKKyMgd2UgYWxsb3cgbW9yZSBjaGFycyB0aGFuIHJlbW90ZXMyY29uZmlnLnNoLi4uCitzdWIgc2FuaXRpemVfcmVtb3RlX25hbWUgeworCW15ICgkbmFtZSkgPSBAXzsKKwkkbmFtZSA9fiB0cntBLVphLXowLTk6LC8rLX17Ln1jOworCSRuYW1lOworfQorCitzdWIgZmluZF9leGlzdGluZ19yZW1vdGUgeworCW15ICgkdXJsLCAkcmVtb3RlcykgPSBAXzsKKwlyZXR1cm4gdW5kZWYgaWYgJG5vX3JldXNlX2V4aXN0aW5nOworCW15ICRleGlzdGluZzsKKwlmb3JlYWNoIG15ICRyZXBvX2lkIChrZXlzICUkcmVtb3RlcykgeworCQlteSAkdSA9ICRyZW1vdGVzLT57JHJlcG9faWR9LT57dXJsfSBvciBuZXh0OworCQluZXh0IGlmICR1IG5lICR1cmw7CisJCSRleGlzdGluZyA9ICRyZXBvX2lkOworCQlsYXN0OworCX0KKwkkZXhpc3Rpbmc7Cit9CisKK3N1YiBpbml0X3JlbW90ZV9jb25maWcgeworCW15ICgkc2VsZiwgJHVybCwgJG5vX3dyaXRlKSA9IEBfOworCSR1cmwgPX4gcyEvKyQhITsgIyBzdHJpcCB0cmFpbGluZyBzbGFzaAorCW15ICRyID0gcmVhZF9hbGxfcmVtb3RlcygpOworCW15ICRleGlzdGluZyA9IGZpbmRfZXhpc3RpbmdfcmVtb3RlKCR1cmwsICRyKTsKKwlpZiAoJGV4aXN0aW5nKSB7CisJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQlwcmludCBTVERFUlIgIlVzaW5nIGV4aXN0aW5nICIsCisJCQkJICAgICAiW3N2bi1yZW1vdGUgXCIkZXhpc3RpbmdcIl1cbiI7CisJCX0KKwkJJHNlbGYtPntyZXBvX2lkfSA9ICRleGlzdGluZzsKKwl9IGVsc2lmICgkX21pbmltaXplX3VybCkgeworCQlteSAkbWluX3VybCA9IEdpdDo6U1ZOOjpSYS0+bmV3KCR1cmwpLT5taW5pbWl6ZV91cmw7CisJCSRleGlzdGluZyA9IGZpbmRfZXhpc3RpbmdfcmVtb3RlKCRtaW5fdXJsLCAkcik7CisJCWlmICgkZXhpc3RpbmcpIHsKKwkJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQkJcHJpbnQgU1RERVJSICJVc2luZyBleGlzdGluZyAiLAorCQkJCQkgICAgICJbc3ZuLXJlbW90ZSBcIiRleGlzdGluZ1wiXVxuIjsKKwkJCX0KKwkJCSRzZWxmLT57cmVwb19pZH0gPSAkZXhpc3Rpbmc7CisJCX0KKwkJaWYgKCRtaW5fdXJsIG5lICR1cmwpIHsKKwkJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQkJcHJpbnQgU1RERVJSICJVc2luZyBoaWdoZXIgbGV2ZWwgb2YgVVJMOiAiLAorCQkJCQkgICAgICIkdXJsID0+ICRtaW5fdXJsXG4iOworCQkJfQorCQkJbXkgJG9sZF9wYXRoID0gJHNlbGYtPntwYXRofTsKKwkJCSRzZWxmLT57cGF0aH0gPSAkdXJsOworCQkJJHNlbGYtPntwYXRofSA9fiBzIV5cUSRtaW5fdXJsXEUoL3wkKSEhOworCQkJaWYgKGxlbmd0aCAkb2xkX3BhdGgpIHsKKwkJCQkkc2VsZi0+e3BhdGh9IC49ICIvJG9sZF9wYXRoIjsKKwkJCX0KKwkJCSR1cmwgPSAkbWluX3VybDsKKwkJfQorCX0KKwlteSAkb3JpZ191cmw7CisJaWYgKCEkZXhpc3RpbmcpIHsKKwkJIyB2ZXJpZnkgdGhhdCB3ZSBhcmVuJ3Qgb3ZlcndyaXRpbmcgYW55dGhpbmc6CisJCSRvcmlnX3VybCA9IGV2YWwgeworCQkJY29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1nZXQnLAorCQkJCQkic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnVybCIpCisJCX07CisJCWlmICgkb3JpZ191cmwgJiYgKCRvcmlnX3VybCBuZSAkdXJsKSkgeworCQkJZGllICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0udXJsIGFscmVhZHkgc2V0OiAiLAorCQkJICAgICIkb3JpZ191cmxcbndhbnRlZCB0byBzZXQgdG86ICR1cmxcbiI7CisJCX0KKwl9CisJbXkgKCR4cmVwb19pZCwgJHhwYXRoKSA9IGZpbmRfcmVmKCRzZWxmLT5yZWZuYW1lKTsKKwlpZiAoZGVmaW5lZCAkeHBhdGgpIHsKKwkJZGllICJzdm4tcmVtb3RlLiR4cmVwb19pZC5mZXRjaCBhbHJlYWR5IHNldCB0byB0cmFjayAiLAorCQkgICAgIiR4cGF0aDpyZWZzL3JlbW90ZXMvIiwgJHNlbGYtPnJlZm5hbWUsICJcbiI7CisJfQorCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCWNvbW1hbmRfbm9pc3koJ2NvbmZpZycsCisJCQkgICAgICAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnVybCIsICR1cmwpOworCQljb21tYW5kX25vaXN5KCdjb25maWcnLCAnLS1hZGQnLAorCQkJICAgICAgInN2bi1yZW1vdGUuJHNlbGYtPntyZXBvX2lkfS5mZXRjaCIsCisJCQkgICAgICAiJHNlbGYtPntwYXRofToiLiRzZWxmLT5yZWZuYW1lKTsKKwl9CisJJHNlbGYtPnt1cmx9ID0gJHVybDsKK30KKworc3ViIGZpbmRfYnlfdXJsIHsgIyByZXBvc19yb290IGFuZCwgcGF0aCBhcmUgb3B0aW9uYWwKKwlteSAoJGNsYXNzLCAkZnVsbF91cmwsICRyZXBvc19yb290LCAkcGF0aCkgPSBAXzsKKworCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkZnVsbF91cmw7CisJcmVtb3ZlX3VzZXJuYW1lKCRmdWxsX3VybCk7CisJcmVtb3ZlX3VzZXJuYW1lKCRyZXBvc19yb290KSBpZiBkZWZpbmVkICRyZXBvc19yb290OworCW15ICRyZW1vdGVzID0gcmVhZF9hbGxfcmVtb3RlcygpOworCWlmIChkZWZpbmVkICRmdWxsX3VybCAmJiBkZWZpbmVkICRyZXBvc19yb290ICYmICFkZWZpbmVkICRwYXRoKSB7CisJCSRwYXRoID0gJGZ1bGxfdXJsOworCQkkcGF0aCA9fiBzI15cUSRyZXBvc19yb290XEUoPzovfCQpIyM7CisJfQorCWZvcmVhY2ggbXkgJHJlcG9faWQgKGtleXMgJSRyZW1vdGVzKSB7CisJCW15ICR1ID0gJHJlbW90ZXMtPnskcmVwb19pZH0tPnt1cmx9IG9yIG5leHQ7CisJCXJlbW92ZV91c2VybmFtZSgkdSk7CisJCW5leHQgaWYgZGVmaW5lZCAkcmVwb3Nfcm9vdCAmJiAkcmVwb3Nfcm9vdCBuZSAkdTsKKworCQlteSAkZmV0Y2ggPSAkcmVtb3Rlcy0+eyRyZXBvX2lkfS0+e2ZldGNofSB8fCB7fTsKKwkJZm9yZWFjaCAocXcvYnJhbmNoZXMgdGFncy8pIHsKKwkJCXJlc29sdmVfbG9jYWxfZ2xvYnMoJHUsICRmZXRjaCwKKwkJCSAgICAgICAgICAgICAgICAgICAgJHJlbW90ZXMtPnskcmVwb19pZH0tPnskX30pOworCQl9CisJCW15ICRwID0gJHBhdGg7CisJCXVubGVzcyAoZGVmaW5lZCAkcCkgeworCQkJJHAgPSAkZnVsbF91cmw7CisJCQkkcCA9fiBzI15cUSR1XEUoPzovfCQpIyMgb3IgbmV4dDsKKwkJfQorCQlmb3JlYWNoIG15ICRmIChrZXlzICUkZmV0Y2gpIHsKKwkJCW5leHQgaWYgJGYgbmUgJHA7CisJCQlyZXR1cm4gR2l0OjpTVk4tPm5ldygkZmV0Y2gtPnskZn0sICRyZXBvX2lkLCAkZik7CisJCX0KKwl9CisJdW5kZWY7Cit9CisKK3N1YiBpbml0IHsKKwlteSAoJGNsYXNzLCAkdXJsLCAkcGF0aCwgJHJlcG9faWQsICRyZWZfaWQsICRub193cml0ZSkgPSBAXzsKKwlteSAkc2VsZiA9IF9uZXcoJGNsYXNzLCAkcmVwb19pZCwgJHJlZl9pZCwgJHBhdGgpOworCWlmIChkZWZpbmVkICR1cmwpIHsKKwkJJHNlbGYtPmluaXRfcmVtb3RlX2NvbmZpZygkdXJsLCAkbm9fd3JpdGUpOworCX0KKwkkc2VsZjsKK30KKworc3ViIGZpbmRfcmVmIHsKKwlteSAoJHJlZl9pZCkgPSBAXzsKKwlmb3JlYWNoIChjb21tYW5kKHF3L2NvbmZpZyAtbC8pKSB7CisJCW5leHQgdW5sZXNzIG0hXnN2bi1yZW1vdGVcLiguKylcLmZldGNoPQorCQkgICAgICAgICAgICAgIFxzKiguKilccyo6XHMqcmVmcy9yZW1vdGVzLyguKylccyokIXg7CisJCW15ICgkcmVwb19pZCwgJHBhdGgsICRyZWYpID0gKCQxLCAkMiwgJDMpOworCQlpZiAoJHJlZiBlcSAkcmVmX2lkKSB7CisJCQkkcGF0aCA9ICcnIGlmICgkcGF0aCA9fiBtI15cLi8/Iyk7CisJCQlyZXR1cm4gKCRyZXBvX2lkLCAkcGF0aCk7CisJCX0KKwl9CisJKHVuZGVmLCB1bmRlZiwgdW5kZWYpOworfQorCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkcmVmX2lkLCAkcmVwb19pZCwgJHBhdGgpID0gQF87CisJaWYgKGRlZmluZWQgJHJlZl9pZCAmJiAhZGVmaW5lZCAkcmVwb19pZCAmJiAhZGVmaW5lZCAkcGF0aCkgeworCQkoJHJlcG9faWQsICRwYXRoKSA9IGZpbmRfcmVmKCRyZWZfaWQpOworCQlpZiAoIWRlZmluZWQgJHJlcG9faWQpIHsKKwkJCWRpZSAiQ291bGQgbm90IGZpbmQgYSBcInN2bi1yZW1vdGUuKi5mZXRjaFwiIGtleSAiLAorCQkJICAgICJpbiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIG1hdGNoaW5nOiAiLAorCQkJICAgICJyZWZzL3JlbW90ZXMvJHJlZl9pZFxuIjsKKwkJfQorCX0KKwlteSAkc2VsZiA9IF9uZXcoJGNsYXNzLCAkcmVwb19pZCwgJHJlZl9pZCwgJHBhdGgpOworCWlmICghZGVmaW5lZCAkc2VsZi0+e3BhdGh9IHx8ICFsZW5ndGggJHNlbGYtPntwYXRofSkgeworCQlteSAkZmV0Y2ggPSBjb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICctLWdldCcsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ZuLXJlbW90ZS4kcmVwb19pZC5mZXRjaCIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOnJlZnMvcmVtb3Rlcy8kcmVmX2lkXCQiKSBvcgorCQkgICAgIGRpZSAiRmFpbGVkIHRvIHJlYWQgXCJzdm4tcmVtb3RlLiRyZXBvX2lkLmZldGNoXCIgIiwKKwkJICAgICAgICAgIlwiOnJlZnMvcmVtb3Rlcy8kcmVmX2lkXCRcIiBpbiBjb25maWdcbiI7CisJCSgkc2VsZi0+e3BhdGh9LCB1bmRlZikgPSBzcGxpdCgvXHMqOlxzKi8sICRmZXRjaCk7CisJfQorCSRzZWxmLT57dXJsfSA9IGNvbW1hbmRfb25lbGluZSgnY29uZmlnJywgJy0tZ2V0JywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN2bi1yZW1vdGUuJHJlcG9faWQudXJsIikgb3IKKyAgICAgICAgICAgICAgICAgIGRpZSAiRmFpbGVkIHRvIHJlYWQgXCJzdm4tcmVtb3RlLiRyZXBvX2lkLnVybFwiIGluIGNvbmZpZ1xuIjsKKwkkc2VsZi0+cmVidWlsZDsKKwkkc2VsZjsKK30KKworc3ViIHJlZm5hbWUgeyAicmVmcy9yZW1vdGVzLyRfWzBdLT57cmVmX2lkfSIgfQorCitzdWIgc3ZtX3V1aWQgeworCW15ICgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPntzdm19LT57dXVpZH0gaWYgJHNlbGYtPnN2bTsKKwkkc2VsZi0+cmE7CisJdW5sZXNzICgkc2VsZi0+e3N2bX0pIHsKKwkJZGllICJTVk0gVVVJRCBub3QgY2FjaGVkLCBhbmQgcmVhZGluZyByZW1vdGVseSBmYWlsZWRcbiI7CisJfQorCSRzZWxmLT57c3ZtfS0+e3V1aWR9OworfQorCitzdWIgc3ZtIHsKKwlteSAoJHNlbGYpID0gQF87CisJcmV0dXJuICRzZWxmLT57c3ZtfSBpZiAkc2VsZi0+e3N2bX07CisJbXkgJHN2bTsKKwkjIHNlZSBpZiB3ZSBoYXZlIGl0IGluIG91ciBjb25maWcsIGZpcnN0OgorCWV2YWwgeworCQlteSAkc2VjdGlvbiA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0iOworCQkkc3ZtID0geworCQkgIHNvdXJjZSA9PiB0bXBfY29uZmlnKCctLWdldCcsICIkc2VjdGlvbi5zdm0tc291cmNlIiksCisJCSAgdXVpZCA9PiB0bXBfY29uZmlnKCctLWdldCcsICIkc2VjdGlvbi5zdm0tdXVpZCIpLAorCQkgIHJlcGxhY2UgPT4gdG1wX2NvbmZpZygnLS1nZXQnLCAiJHNlY3Rpb24uc3ZtLXJlcGxhY2UiKSwKKwkJfQorCX07CisJaWYgKCRzdm0gJiYgJHN2bS0+e3NvdXJjZX0gJiYgJHN2bS0+e3V1aWR9ICYmICRzdm0tPntyZXBsYWNlfSkgeworCQkkc2VsZi0+e3N2bX0gPSAkc3ZtOworCX0KKwkkc2VsZi0+e3N2bX07Cit9CisKK3N1YiBfc2V0X3N2bV92YXJzIHsKKwlteSAoJHNlbGYsICRyYSkgPSBAXzsKKwlyZXR1cm4gJHJhIGlmICRzZWxmLT5zdm07CisKKwlteSBAZXJyID0gKCAidXNlU3ZtUHJvcHMgc2V0LCBidXQgZmFpbGVkIHRvIHJlYWQgU1ZNIHByb3BlcnRpZXNcbiIsCisJCSAgICAiKHN2bTpzb3VyY2UsIHN2bTp1dWlkKSAiLAorCQkgICAgImZyb20gdGhlIGZvbGxvd2luZyBVUkxzOlxuIiApOworCXN1YiByZWFkX3N2bV9wcm9wcyB7CisJCW15ICgkc2VsZiwgJHJhLCAkcGF0aCwgJHIpID0gQF87CisJCW15ICRwcm9wcyA9ICgkcmEtPmdldF9kaXIoJHBhdGgsICRyKSlbMl07CisJCW15ICRzcmMgPSAkcHJvcHMtPnsnc3ZtOnNvdXJjZSd9OworCQlteSAkdXVpZCA9ICRwcm9wcy0+eydzdm06dXVpZCd9OworCQlyZXR1cm4gdW5kZWYgaWYgKCEkc3JjIHx8ICEkdXVpZCk7CisKKwkJY2hvbXAoJHNyYywgJHV1aWQpOworCisJCSR1dWlkID1+IG17XlswLTlhLWZcLV17MzAsfSR9CisJCSAgICBvciBkaWUgImRvZXNuJ3QgbG9vayByaWdodCAtIHN2bTp1dWlkIGlzICckdXVpZCdcbiI7CisKKwkJIyB0aGUgJyEnIGlzIHVzZWQgdG8gbWFyayB0aGUgcmVwb3Nfcm9vdCEvcmVsYXRpdmUvcGF0aAorCQkkc3JjID1+IHN7Lz8hLz99ey99OworCQkkc3JjID1+IHN7LyskfXt9OyAjIG5vIHRyYWlsaW5nIHNsYXNoZXMgcGxlYXNlCisJCSMgdXNlcm5hbWUgaXMgb2Ygbm8gaW50ZXJlc3QKKwkJJHNyYyA9fiBzeyheW2EtelwrXSo6Ly8pW14vQF0qQH17JDF9OworCisJCW15ICRyZXBsYWNlID0gJHJhLT57dXJsfTsKKwkJJHJlcGxhY2UgLj0gIi8kcGF0aCIgaWYgbGVuZ3RoICRwYXRoOworCisJCW15ICRzZWN0aW9uID0gInN2bi1yZW1vdGUuJHNlbGYtPntyZXBvX2lkfSI7CisJCXRtcF9jb25maWcoIiRzZWN0aW9uLnN2bS1zb3VyY2UiLCAkc3JjKTsKKwkJdG1wX2NvbmZpZygiJHNlY3Rpb24uc3ZtLXJlcGxhY2UiLCAkcmVwbGFjZSk7CisJCXRtcF9jb25maWcoIiRzZWN0aW9uLnN2bS11dWlkIiwgJHV1aWQpOworCQkkc2VsZi0+e3N2bX0gPSB7CisJCQlzb3VyY2UgPT4gJHNyYywKKwkJCXV1aWQgPT4gJHV1aWQsCisJCQlyZXBsYWNlID0+ICRyZXBsYWNlCisJCX07CisJfQorCisJbXkgJHIgPSAkcmEtPmdldF9sYXRlc3RfcmV2bnVtOworCW15ICRwYXRoID0gJHNlbGYtPntwYXRofTsKKwlteSAldHJpZWQ7CisJd2hpbGUgKGxlbmd0aCAkcGF0aCkgeworCQl1bmxlc3MgKCR0cmllZHsiJHNlbGYtPnt1cmx9LyRwYXRoIn0pIHsKKwkJCXJldHVybiAkcmEgaWYgJHNlbGYtPnJlYWRfc3ZtX3Byb3BzKCRyYSwgJHBhdGgsICRyKTsKKwkJCSR0cmllZHsiJHNlbGYtPnt1cmx9LyRwYXRoIn0gPSAxOworCQl9CisJCSRwYXRoID1+IHMjLz9bXi9dKyQjIzsKKwl9CisJZGllICJQYXRoOiAnJHBhdGgnIHNob3VsZCBiZSAnJ1xuIiBpZiAkcGF0aCBuZSAnJzsKKwlyZXR1cm4gJHJhIGlmICRzZWxmLT5yZWFkX3N2bV9wcm9wcygkcmEsICRwYXRoLCAkcik7CisJJHRyaWVkeyIkc2VsZi0+e3VybH0vJHBhdGgifSA9IDE7CisKKwlpZiAoJHJhLT57cmVwb3Nfcm9vdH0gZXEgJHNlbGYtPnt1cmx9KSB7CisJCWRpZSBAZXJyLCAobWFwIHsgIiAgJF9cbiIgfSBrZXlzICV0cmllZCksICJcbiI7CisJfQorCisJIyBub3BlLCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkIHRvIHRoZSByZXBvc2l0b3J5IHJvb3Q6CisJbXkgJG9rOworCW15IEB0cmllZF9iOworCSRwYXRoID0gJHJhLT57c3ZuX3BhdGh9OworCSRyYSA9IEdpdDo6U1ZOOjpSYS0+bmV3KCRyYS0+e3JlcG9zX3Jvb3R9KTsKKwl3aGlsZSAobGVuZ3RoICRwYXRoKSB7CisJCXVubGVzcyAoJHRyaWVkeyIkcmEtPnt1cmx9LyRwYXRoIn0pIHsKKwkJCSRvayA9ICRzZWxmLT5yZWFkX3N2bV9wcm9wcygkcmEsICRwYXRoLCAkcik7CisJCQlsYXN0IGlmICRvazsKKwkJCSR0cmllZHsiJHJhLT57dXJsfS8kcGF0aCJ9ID0gMTsKKwkJfQorCQkkcGF0aCA9fiBzIy8/W14vXSskIyM7CisJfQorCWRpZSAiUGF0aDogJyRwYXRoJyBzaG91bGQgYmUgJydcbiIgaWYgJHBhdGggbmUgJyc7CisJJG9rIHx8PSAkc2VsZi0+cmVhZF9zdm1fcHJvcHMoJHJhLCAkcGF0aCwgJHIpOworCSR0cmllZHsiJHJhLT57dXJsfS8kcGF0aCJ9ID0gMTsKKwlpZiAoISRvaykgeworCQlkaWUgQGVyciwgKG1hcCB7ICIgICRfXG4iIH0ga2V5cyAldHJpZWQpLCAiXG4iOworCX0KKwlHaXQ6OlNWTjo6UmEtPm5ldygkc2VsZi0+e3VybH0pOworfQorCitzdWIgc3Zuc3luYyB7CisJbXkgKCRzZWxmKSA9IEBfOworCXJldHVybiAkc2VsZi0+e3N2bnN5bmN9IGlmICRzZWxmLT57c3Zuc3luY307CisKKwlpZiAoJHNlbGYtPm5vX21ldGFkYXRhKSB7CisJCWRpZSAiQ2FuJ3QgaGF2ZSBib3RoICdub01ldGFkYXRhJyBhbmQgIiwKKwkJICAgICIndXNlU3Zuc3luY1Byb3BzJyBvcHRpb25zIHNldCFcbiI7CisJfQorCWlmICgkc2VsZi0+cmV3cml0ZV9yb290KSB7CisJCWRpZSAiQ2FuJ3QgaGF2ZSBib3RoICd1c2VTdm5zeW5jUHJvcHMnIGFuZCAncmV3cml0ZVJvb3QnICIsCisJCSAgICAib3B0aW9ucyBzZXQhXG4iOworCX0KKworCW15ICRzdm5zeW5jOworCSMgc2VlIGlmIHdlIGhhdmUgaXQgaW4gb3VyIGNvbmZpZywgZmlyc3Q6CisJZXZhbCB7CisJCW15ICRzZWN0aW9uID0gInN2bi1yZW1vdGUuJHNlbGYtPntyZXBvX2lkfSI7CisJCSRzdm5zeW5jID0geworCQkgIHVybCA9PiB0bXBfY29uZmlnKCctLWdldCcsICIkc2VjdGlvbi5zdm5zeW5jLXVybCIpLAorCQkgIHV1aWQgPT4gdG1wX2NvbmZpZygnLS1nZXQnLCAiJHNlY3Rpb24uc3Zuc3luYy11dWlkIiksCisJCX0KKwl9OworCWlmICgkc3Zuc3luYyAmJiAkc3Zuc3luYy0+e3VybH0gJiYgJHN2bnN5bmMtPnt1dWlkfSkgeworCQlyZXR1cm4gJHNlbGYtPntzdm5zeW5jfSA9ICRzdm5zeW5jOworCX0KKworCW15ICRlcnIgPSAidXNlU3Zuc3luY1Byb3BzIHNldCwgYnV0IGZhaWxlZCB0byByZWFkICIgLgorCSAgICAgICAgICAic3Zuc3luYyBwcm9wZXJ0eTogc3ZuOnN5bmMtZnJvbS0iOworCW15ICRycCA9ICRzZWxmLT5yYS0+cmV2X3Byb3BsaXN0KDApOworCisJbXkgJHVybCA9ICRycC0+eydzdm46c3luYy1mcm9tLXVybCd9IG9yIGRpZSAkZXJyIC4gInVybFxuIjsKKwkkdXJsID1+IG17XlthLXpcK10rOi8vfSBvcgorCSAgICAgICAgICAgZGllICJkb2Vzbid0IGxvb2sgcmlnaHQgLSBzdm46c3luYy1mcm9tLXVybCBpcyAnJHVybCdcbiI7CisKKwlteSAkdXVpZCA9ICRycC0+eydzdm46c3luYy1mcm9tLXV1aWQnfSBvciBkaWUgJGVyciAuICJ1dWlkXG4iOworCSR1dWlkID1+IG17XlswLTlhLWZcLV17MzAsfSR9IG9yCisJICAgICAgICAgICBkaWUgImRvZXNuJ3QgbG9vayByaWdodCAtIHN2bjpzeW5jLWZyb20tdXVpZCBpcyAnJHV1aWQnXG4iOworCisJbXkgJHNlY3Rpb24gPSAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9IjsKKwl0bXBfY29uZmlnKCctLWFkZCcsICIkc2VjdGlvbi5zdm5zeW5jLXV1aWQiLCAkdXVpZCk7CisJdG1wX2NvbmZpZygnLS1hZGQnLCAiJHNlY3Rpb24uc3Zuc3luYy11cmwiLCAkdXJsKTsKKwlyZXR1cm4gJHNlbGYtPntzdm5zeW5jfSA9IHsgdXJsID0+ICR1cmwsIHV1aWQgPT4gJHV1aWQgfTsKK30KKworIyB0aGlzIGFsbG93cyB1cyB0byBtZW1vaXplIG91ciBTVk46OlJhIFVVSUQgbG9jYWxseSBhbmQgYXZvaWQgYQorIyByZW1vdGUgbG9va3VwICh1c2VmdWwgZm9yICdnaXQgc3ZuIGxvZycpLgorc3ViIHJhX3V1aWQgeworCW15ICgkc2VsZikgPSBAXzsKKwl1bmxlc3MgKCRzZWxmLT57cmFfdXVpZH0pIHsKKwkJbXkgJGtleSA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0udXVpZCI7CisJCW15ICR1dWlkID0gZXZhbCB7IHRtcF9jb25maWcoJy0tZ2V0JywgJGtleSkgfTsKKwkJaWYgKCEkQCAmJiAkdXVpZCAmJiAkdXVpZCA9fiAvXihbYS1mXGRcLV17MzAsfSkkLykgeworCQkJJHNlbGYtPntyYV91dWlkfSA9ICR1dWlkOworCQl9IGVsc2UgeworCQkJZGllICJyYV91dWlkIGNhbGxlZCB3aXRob3V0IFVSTFxuIiB1bmxlc3MgJHNlbGYtPnt1cmx9OworCQkJJHNlbGYtPntyYV91dWlkfSA9ICRzZWxmLT5yYS0+Z2V0X3V1aWQ7CisJCQl0bXBfY29uZmlnKCctLWFkZCcsICRrZXksICRzZWxmLT57cmFfdXVpZH0pOworCQl9CisJfQorCSRzZWxmLT57cmFfdXVpZH07Cit9CisKK3N1YiByYSB7CisJbXkgKCRzZWxmKSA9IHNoaWZ0OworCW15ICRyYSA9IEdpdDo6U1ZOOjpSYS0+bmV3KCRzZWxmLT57dXJsfSk7CisJaWYgKCRzZWxmLT51c2Vfc3ZtX3Byb3BzICYmICEkc2VsZi0+e3N2bX0pIHsKKwkJaWYgKCRzZWxmLT5ub19tZXRhZGF0YSkgeworCQkJZGllICJDYW4ndCBoYXZlIGJvdGggJ25vTWV0YWRhdGEnIGFuZCAiLAorCQkJICAgICIndXNlU3ZtUHJvcHMnIG9wdGlvbnMgc2V0IVxuIjsKKwkJfSBlbHNpZiAoJHNlbGYtPnVzZV9zdm5zeW5jX3Byb3BzKSB7CisJCQlkaWUgIkNhbid0IGhhdmUgYm90aCAndXNlU3Zuc3luY1Byb3BzJyBhbmQgIiwKKwkJCSAgICAiJ3VzZVN2bVByb3BzJyBvcHRpb25zIHNldCFcbiI7CisJCX0KKwkJJHJhID0gJHNlbGYtPl9zZXRfc3ZtX3ZhcnMoJHJhKTsKKwkJJHNlbGYtPnstd2FudF9yZXZwcm9wc30gPSAxOworCX0KKwkkcmE7Cit9CisKK3N1YiByZWxfcGF0aCB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICRyZXBvc19yb290ID0gJHNlbGYtPnJhLT57cmVwb3Nfcm9vdH07CisJcmV0dXJuICRzZWxmLT57cGF0aH0gaWYgKCRzZWxmLT57dXJsfSBlcSAkcmVwb3Nfcm9vdCk7CisJbXkgJHVybCA9ICRzZWxmLT57dXJsfSAuCisJICAgICAgICAgIChsZW5ndGggJHNlbGYtPntwYXRofSA/ICIvJHNlbGYtPntwYXRofSIgOiAkc2VsZi0+e3BhdGh9KTsKKwkkdXJsID1+IHMhXlxRJHJlcG9zX3Jvb3RcRSg/Oi8rfCQpISFnOworCSR1cmw7Cit9CisKK3N1YiB0cmF2ZXJzZV9pZ25vcmUgeworCW15ICgkc2VsZiwgJGZoLCAkcGF0aCwgJHIpID0gQF87CisJJHBhdGggPX4gcyNeLysjI2c7CisJbXkgJHJhID0gJHNlbGYtPnJhOworCW15ICgkZGlyZW50LCB1bmRlZiwgJHByb3BzKSA9ICRyYS0+Z2V0X2RpcigkcGF0aCwgJHIpOworCW15ICRwID0gJHBhdGg7CisJJHAgPX4gcyNeXFEkc2VsZi0+e3BhdGh9XEUoL3wkKSMjOworCXByaW50ICRmaCBsZW5ndGggJHAgPyAiXG4jICRwXG4iIDogIlxuIyAvXG4iOworCWlmIChteSAkcyA9ICRwcm9wcy0+eydzdm46aWdub3JlJ30pIHsKKwkJJHMgPX4gcy9bXHJcbl0rL1xuL2c7CisJCWNob21wICRzOworCQlpZiAobGVuZ3RoICRwID09IDApIHsKKwkJCSRzID1+IHMjXG4jXG4vJHAjZzsKKwkJCXByaW50ICRmaCAiLyRzXG4iOworCQl9IGVsc2UgeworCQkJJHMgPX4gcyNcbiNcbi8kcC8jZzsKKwkJCXByaW50ICRmaCAiLyRwLyRzXG4iOworCQl9CisJfQorCWZvcmVhY2ggKHNvcnQga2V5cyAlJGRpcmVudCkgeworCQluZXh0IGlmICRkaXJlbnQtPnskX30tPntraW5kfSAhPSAkU1ZOOjpOb2RlOjpkaXI7CisJCSRzZWxmLT50cmF2ZXJzZV9pZ25vcmUoJGZoLCAiJHBhdGgvJF8iLCAkcik7CisJfQorfQorCitzdWIgbGFzdF9yZXYgeyAoJF9bMF0tPmxhc3RfcmV2X2NvbW1pdClbMF0gfQorc3ViIGxhc3RfY29tbWl0IHsgKCRfWzBdLT5sYXN0X3Jldl9jb21taXQpWzFdIH0KKworIyByZXR1cm5zIHRoZSBuZXdlc3QgU1ZOIHJldmlzaW9uIG51bWJlciBhbmQgbmV3ZXN0IGNvbW1pdCBTSEExCitzdWIgbGFzdF9yZXZfY29tbWl0IHsKKwlteSAoJHNlbGYpID0gQF87CisJaWYgKGRlZmluZWQgJHNlbGYtPntsYXN0X3Jldn0gJiYgZGVmaW5lZCAkc2VsZi0+e2xhc3RfY29tbWl0fSkgeworCQlyZXR1cm4gKCRzZWxmLT57bGFzdF9yZXZ9LCAkc2VsZi0+e2xhc3RfY29tbWl0fSk7CisJfQorCW15ICRjID0gOjp2ZXJpZnlfcmVmKCRzZWxmLT5yZWZuYW1lLideMCcpOworCWlmICgkYyAmJiAhJHNlbGYtPnVzZV9zdm1fcHJvcHMgJiYgISRzZWxmLT5ub19tZXRhZGF0YSkgeworCQlteSAkcmV2ID0gKDo6Y210X21ldGFkYXRhKCRjKSlbMV07CisJCWlmIChkZWZpbmVkICRyZXYpIHsKKwkJCSgkc2VsZi0+e2xhc3RfcmV2fSwgJHNlbGYtPntsYXN0X2NvbW1pdH0pID0gKCRyZXYsICRjKTsKKwkJCXJldHVybiAoJHJldiwgJGMpOworCQl9CisJfQorCW15ICRkYl9wYXRoID0gJHNlbGYtPmRiX3BhdGg7CisJdW5sZXNzICgtZSAkZGJfcGF0aCkgeworCQkoJHNlbGYtPntsYXN0X3Jldn0sICRzZWxmLT57bGFzdF9jb21taXR9KSA9ICh1bmRlZiwgdW5kZWYpOworCQlyZXR1cm4gKHVuZGVmLCB1bmRlZik7CisJfQorCW15ICRvZmZzZXQgPSAtNDE7ICMgZnJvbSB0YWlsCisJbXkgJHJsOworCW9wZW4gbXkgJGZoLCAnPCcsICRkYl9wYXRoIG9yIGNyb2FrICIkZGJfcGF0aCBub3QgcmVhZGFibGU6ICQhXG4iOworCXN5c3NlZWsoJGZoLCAkb2Zmc2V0LCAyKTsgIyBkb24ndCBjYXJlIGZvciBlcnJvcnMKKwlzeXNyZWFkKCRmaCwgJHJsLCA0MSkgPT0gNDEgb3IgcmV0dXJuICh1bmRlZiwgdW5kZWYpOworCWNob21wICRybDsKKwl3aGlsZSAoKCcwJyB4NDApIGVxICRybCAmJiBzeXNzZWVrKCRmaCwgMCwgMSkgIT0gMCkgeworCQkkb2Zmc2V0IC09IDQxOworCQlzeXNzZWVrKCRmaCwgJG9mZnNldCwgMik7ICMgZG9uJ3QgY2FyZSBmb3IgZXJyb3JzCisJCXN5c3JlYWQoJGZoLCAkcmwsIDQxKSA9PSA0MSBvciByZXR1cm4gKHVuZGVmLCB1bmRlZik7CisJCWNob21wICRybDsKKwl9CisJaWYgKCRjICYmICRjIG5lICRybCkgeworCQlkaWUgIiRkYl9wYXRoIGFuZCAiLCAkc2VsZi0+cmVmbmFtZSwKKwkJICAgICIgaW5jb25zaXN0ZW50ITpcbiRjICE9ICRybFxuIjsKKwl9CisJbXkgJHJldiA9IHN5c3NlZWsoJGZoLCAwLCAxKSBvciBjcm9hayAkITsKKwkkcmV2ID0gICgkcmV2IC0gNDEpIC8gNDE7CisJY2xvc2UgJGZoIG9yIGNyb2FrICQhOworCSgkc2VsZi0+e2xhc3RfcmV2fSwgJHNlbGYtPntsYXN0X2NvbW1pdH0pID0gKCRyZXYsICRjKTsKKwlyZXR1cm4gKCRyZXYsICRjKTsKK30KKworc3ViIGdldF9mZXRjaF9yYW5nZSB7CisJbXkgKCRzZWxmLCAkbWluLCAkbWF4KSA9IEBfOworCSRtYXggfHw9ICRzZWxmLT5yYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJJG1pbiB8fD0gJHNlbGYtPnJldl9kYl9tYXg7CisJKCsrJG1pbiwgJG1heCk7Cit9CisKK3N1YiB0bXBfY29uZmlnIHsKKwlteSAoQGFyZ3MpID0gQF87CisJbXkgJG9sZF9kZWZfY29uZmlnID0gIiRFTlZ7R0lUX0RJUn0vc3ZuL2NvbmZpZyI7CisJbXkgJGNvbmZpZyA9ICIkRU5We0dJVF9ESVJ9L3N2bi8ubWV0YWRhdGEiOworCWlmICgtZSAkb2xkX2RlZl9jb25maWcgJiYgISAtZSAkY29uZmlnKSB7CisJCXJlbmFtZSAkb2xkX2RlZl9jb25maWcsICRjb25maWcgb3IKKwkJICAgICAgIGRpZSAiRmFpbGVkIHJlbmFtZSAkb2xkX2RlZl9jb25maWcgPT4gJGNvbmZpZzogJCFcbiI7CisJfQorCW15ICRvbGRfY29uZmlnID0gJEVOVntHSVRfQ09ORklHfTsKKwkkRU5We0dJVF9DT05GSUd9ID0gJGNvbmZpZzsKKwkkQCA9IHVuZGVmOworCW15IEByZXQgPSBldmFsIHsKKwkJdW5sZXNzICgtZiAkY29uZmlnKSB7CisJCQlta2ZpbGUoJGNvbmZpZyk7CisJCQlvcGVuIG15ICRmaCwgJz4nLCAkY29uZmlnIG9yCisJCQkgICAgZGllICJDYW4ndCBvcGVuICRjb25maWc6ICQhXG4iOworCQkJcHJpbnQgJGZoICI7IFRoaXMgZmlsZSBpcyB1c2VkIGludGVybmFsbHkgYnkgIiwKKwkJCSAgICAgICAgICAiZ2l0LXN2blxuIiBvciBkaWUKKwkJCQkgICJDb3VsZG4ndCB3cml0ZSB0byAkY29uZmlnOiAkIVxuIjsKKwkJCXByaW50ICRmaCAiOyBZb3Ugc2hvdWxkIG5vdCBoYXZlIHRvIGVkaXQgaXRcbiIgb3IKKwkJCSAgICAgIGRpZSAiQ291bGRuJ3Qgd3JpdGUgdG8gJGNvbmZpZzogJCFcbiI7CisJCQljbG9zZSAkZmggb3IgZGllICJDb3VsZG4ndCBjbG9zZSAkY29uZmlnOiAkIVxuIjsKKwkJfQorCQljb21tYW5kKCdjb25maWcnLCBAYXJncyk7CisJfTsKKwlteSAkZXJyID0gJEA7CisJaWYgKGRlZmluZWQgJG9sZF9jb25maWcpIHsKKwkJJEVOVntHSVRfQ09ORklHfSA9ICRvbGRfY29uZmlnOworCX0gZWxzZSB7CisJCWRlbGV0ZSAkRU5We0dJVF9DT05GSUd9OworCX0KKwlkaWUgJGVyciBpZiAkZXJyOworCXdhbnRhcnJheSA/IEByZXQgOiAkcmV0WzBdOworfQorCitzdWIgdG1wX2luZGV4X2RvIHsKKwlteSAoJHNlbGYsICRzdWIpID0gQF87CisJbXkgJG9sZF9pbmRleCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJHNlbGYtPntpbmRleH07CisJJEAgPSB1bmRlZjsKKwlteSBAcmV0ID0gZXZhbCB7CisJCW15ICgkZGlyLCAkYmFzZSkgPSAoJHNlbGYtPntpbmRleH0gPX4gbSNeKC4qPykvPyhbXi9dKykkIyk7CisJCW1rcGF0aChbJGRpcl0pIHVubGVzcyAtZCAkZGlyOworCQkmJHN1YjsKKwl9OworCW15ICRlcnIgPSAkQDsKKwlpZiAoZGVmaW5lZCAkb2xkX2luZGV4KSB7CisJCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJG9sZF9pbmRleDsKKwl9IGVsc2UgeworCQlkZWxldGUgJEVOVntHSVRfSU5ERVhfRklMRX07CisJfQorCWRpZSAkZXJyIGlmICRlcnI7CisJd2FudGFycmF5ID8gQHJldCA6ICRyZXRbMF07Cit9CisKK3N1YiBhc3NlcnRfaW5kZXhfY2xlYW4geworCW15ICgkc2VsZiwgJHRyZWVpc2gpID0gQF87CisKKwkkc2VsZi0+dG1wX2luZGV4X2RvKHN1YiB7CisJCWNvbW1hbmRfbm9pc3koJ3JlYWQtdHJlZScsICR0cmVlaXNoKSB1bmxlc3MgLWUgJHNlbGYtPntpbmRleH07CisJCW15ICR4ID0gY29tbWFuZF9vbmVsaW5lKCd3cml0ZS10cmVlJyk7CisJCW15ICgkeSkgPSAoY29tbWFuZChxdy9jYXQtZmlsZSBjb21taXQvLCAkdHJlZWlzaCkgPX4KKwkJICAgICAgICAgICAvXnRyZWUgKCQ6OnNoYTEpL21vKTsKKwkJcmV0dXJuIGlmICR5IGVxICR4OworCisJCXdhcm4gIkluZGV4IG1pc21hdGNoOiAkeSAhPSAkeFxucmVyZWFkaW5nICR0cmVlaXNoXG4iOworCQl1bmxpbmsgJHNlbGYtPntpbmRleH0gb3IgZGllICJ1bmxpbmsgJHNlbGYtPntpbmRleH06ICQhXG4iOworCQljb21tYW5kX25vaXN5KCdyZWFkLXRyZWUnLCAkdHJlZWlzaCk7CisJCSR4ID0gY29tbWFuZF9vbmVsaW5lKCd3cml0ZS10cmVlJyk7CisJCWlmICgkeSBuZSAkeCkgeworCQkJOjpmYXRhbCAidHJlZXMgKCR0cmVlaXNoKSAkeSAhPSAkeFxuIiwKKwkJCSAgICAgICAgIlNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcuLi5cbiI7CisJCX0KKwl9KTsKK30KKworc3ViIGdldF9jb21taXRfcGFyZW50cyB7CisJbXkgKCRzZWxmLCAkbG9nX2VudHJ5KSA9IEBfOworCW15ICglc2VlbiwgQHJldCwgQHRtcCk7CisJIyBsZWdhY3kgc3VwcG9ydCBmb3IgJ3NldC10cmVlJzsgdGhpcyBpcyBvbmx5IHVzZWQgYnkgc2V0X3RyZWVfY2I6CisJaWYgKG15ICRpcCA9ICRzZWxmLT57aW5qZWN0X3BhcmVudHN9KSB7CisJCWlmIChteSAkY29tbWl0ID0gZGVsZXRlICRpcC0+eyRsb2dfZW50cnktPntyZXZpc2lvbn19KSB7CisJCQlwdXNoIEB0bXAsICRjb21taXQ7CisJCX0KKwl9CisJaWYgKG15ICRjdXIgPSA6OnZlcmlmeV9yZWYoJHNlbGYtPnJlZm5hbWUuJ14wJykpIHsKKwkJcHVzaCBAdG1wLCAkY3VyOworCX0KKwlwdXNoIEB0bXAsICRfIGZvcmVhY2ggKEB7JGxvZ19lbnRyeS0+e3BhcmVudHN9fSwgQHRtcCk7CisJd2hpbGUgKG15ICRwID0gc2hpZnQgQHRtcCkgeworCQluZXh0IGlmICRzZWVueyRwfTsKKwkJJHNlZW57JHB9ID0gMTsKKwkJcHVzaCBAcmV0LCAkcDsKKwkJIyBNQVhQQVJFTlQgaXMgZGVmaW5lZCB0byAxNiBpbiBjb21taXQtdHJlZS5jOgorCQlsYXN0IGlmIEByZXQgPj0gMTY7CisJfQorCWlmIChAdG1wKSB7CisJCWRpZSAiciRsb2dfZW50cnktPntyZXZpc2lvbn06IE5vIHJvb20gZm9yIHBhcmVudHM6XG5cdCIsCisJCSAgICBqb2luKCJcblx0IiwgQHRtcCksICJcbiI7CisJfQorCUByZXQ7Cit9CisKK3N1YiByZXdyaXRlX3Jvb3QgeworCW15ICgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPnstcmV3cml0ZV9yb290fSBpZiBleGlzdHMgJHNlbGYtPnstcmV3cml0ZV9yb290fTsKKwlteSAkayA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0ucmV3cml0ZVJvb3QiOworCW15ICRyd3IgPSBldmFsIHsgY29tbWFuZF9vbmVsaW5lKHF3L2NvbmZpZyAtLWdldC8sICRrKSB9OworCWlmICgkcndyKSB7CisJCSRyd3IgPX4gcyMvKyQjIzsKKwkJaWYgKCRyd3IgIX4gbSNeW2EtelwrXSs6Ly8jKSB7CisJCQlkaWUgIiRyd3IgaXMgbm90IGEgdmFsaWQgVVJMIChrZXk6ICRrKVxuIjsKKwkJfQorCX0KKwkkc2VsZi0+ey1yZXdyaXRlX3Jvb3R9ID0gJHJ3cjsKK30KKworc3ViIG1ldGFkYXRhX3VybCB7CisJbXkgKCRzZWxmKSA9IEBfOworCSgkc2VsZi0+cmV3cml0ZV9yb290IHx8ICRzZWxmLT57dXJsfSkgLgorCSAgIChsZW5ndGggJHNlbGYtPntwYXRofSA/ICcvJyAuICRzZWxmLT57cGF0aH0gOiAnJyk7Cit9CisKK3N1YiBmdWxsX3VybCB7CisJbXkgKCRzZWxmKSA9IEBfOworCSRzZWxmLT57dXJsfSAuIChsZW5ndGggJHNlbGYtPntwYXRofSA/ICcvJyAuICRzZWxmLT57cGF0aH0gOiAnJyk7Cit9CisKK3N1YiBkb19naXRfY29tbWl0IHsKKwlteSAoJHNlbGYsICRsb2dfZW50cnkpID0gQF87CisJbXkgJGxyID0gJHNlbGYtPmxhc3RfcmV2OworCWlmIChkZWZpbmVkICRsciAmJiAkbHIgPj0gJGxvZ19lbnRyeS0+e3JldmlzaW9ufSkgeworCQlkaWUgIkxhc3QgZmV0Y2hlZCByZXZpc2lvbiBvZiAiLCAkc2VsZi0+cmVmbmFtZSwKKwkJICAgICIgd2FzIHIkbHIsIGJ1dCB3ZSBhcmUgYWJvdXQgdG8gZmV0Y2g6ICIsCisJCSAgICAiciRsb2dfZW50cnktPntyZXZpc2lvbn0hXG4iOworCX0KKwlpZiAobXkgJGMgPSAkc2VsZi0+cmV2X2RiX2dldCgkbG9nX2VudHJ5LT57cmV2aXNpb259KSkgeworCQljcm9hayAiJGxvZ19lbnRyeS0+e3JldmlzaW9ufSA9ICRjIGFscmVhZHkgZXhpc3RzISAiLAorCQkgICAgICAiV2h5IGFyZSB3ZSByZWZldGNoaW5nIGl0P1xuIjsKKwl9CisJJEVOVntHSVRfQVVUSE9SX05BTUV9ID0gJEVOVntHSVRfQ09NTUlUVEVSX05BTUV9ID0gJGxvZ19lbnRyeS0+e25hbWV9OworCSRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gPSAkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb2dfZW50cnktPntlbWFpbH07CisJJEVOVntHSVRfQVVUSE9SX0RBVEV9ID0gJEVOVntHSVRfQ09NTUlUVEVSX0RBVEV9ID0gJGxvZ19lbnRyeS0+e2RhdGV9OworCisJbXkgJHRyZWUgPSAkbG9nX2VudHJ5LT57dHJlZX07CisJaWYgKCFkZWZpbmVkICR0cmVlKSB7CisJCSR0cmVlID0gJHNlbGYtPnRtcF9pbmRleF9kbyhzdWIgeworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9vbmVsaW5lKCd3cml0ZS10cmVlJykgfSk7CisJfQorCWRpZSAiVHJlZSBpcyBub3QgYSB2YWxpZCBzaGExOiAkdHJlZVxuIiBpZiAkdHJlZSAhfiAvXiQ6OnNoYTEkL287CisKKwlteSBAZXhlYyA9ICgnZ2l0LWNvbW1pdC10cmVlJywgJHRyZWUpOworCWZvcmVhY2ggKCRzZWxmLT5nZXRfY29tbWl0X3BhcmVudHMoJGxvZ19lbnRyeSkpIHsKKwkJcHVzaCBAZXhlYywgJy1wJywgJF87CisJfQorCWRlZmluZWQobXkgJHBpZCA9IG9wZW4zKG15ICRtc2dfZmgsIG15ICRvdXRfZmgsICc+JlNUREVSUicsIEBleGVjKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNyb2FrICQhOworCXByaW50ICRtc2dfZmggJGxvZ19lbnRyeS0+e2xvZ30gb3IgY3JvYWsgJCE7CisJdW5sZXNzICgkc2VsZi0+bm9fbWV0YWRhdGEpIHsKKwkJcHJpbnQgJG1zZ19maCAiXG5naXQtc3ZuLWlkOiAkbG9nX2VudHJ5LT57bWV0YWRhdGF9XG4iCisJCSAgICAgICAgICAgICAgb3IgY3JvYWsgJCE7CisJfQorCSRtc2dfZmgtPmZsdXNoID09IDAgb3IgY3JvYWsgJCE7CisJY2xvc2UgJG1zZ19maCBvciBjcm9hayAkITsKKwljaG9tcChteSAkY29tbWl0ID0gZG8geyBsb2NhbCAkLzsgPCRvdXRfZmg+IH0pOworCWNsb3NlICRvdXRfZmggb3IgY3JvYWsgJCE7CisJd2FpdHBpZCAkcGlkLCAwOworCWNyb2FrICQ/IGlmICQ/OworCWlmICgkY29tbWl0ICF+IC9eJDo6c2hhMSQvbykgeworCQlkaWUgIkZhaWxlZCB0byBjb21taXQsIGludmFsaWQgc2hhMTogJGNvbW1pdFxuIjsKKwl9CisKKwkkc2VsZi0+cmV2X2RiX3NldCgkbG9nX2VudHJ5LT57cmV2aXNpb259LCAkY29tbWl0LCAxKTsKKworCSRzZWxmLT57bGFzdF9yZXZ9ID0gJGxvZ19lbnRyeS0+e3JldmlzaW9ufTsKKwkkc2VsZi0+e2xhc3RfY29tbWl0fSA9ICRjb21taXQ7CisJcHJpbnQgInIkbG9nX2VudHJ5LT57cmV2aXNpb259IjsKKwlpZiAoZGVmaW5lZCAkbG9nX2VudHJ5LT57c3ZtX3JldmlzaW9ufSkgeworCQkgcHJpbnQgIiAoXEAkbG9nX2VudHJ5LT57c3ZtX3JldmlzaW9ufSkiOworCQkgJHNlbGYtPnJldl9kYl9zZXQoJGxvZ19lbnRyeS0+e3N2bV9yZXZpc2lvbn0sICRjb21taXQsCisJCSAgICAgICAgICAgICAgICAgICAwLCAkc2VsZi0+c3ZtX3V1aWQpOworCX0KKwlwcmludCAiID0gJGNvbW1pdCAoJHNlbGYtPntyZWZfaWR9KVxuIjsKKwlpZiAoZGVmaW5lZCAkX3JlcGFjayAmJiAoLS0kX3JlcGFja19uciA9PSAwKSkgeworCQkkX3JlcGFja19uciA9ICRfcmVwYWNrOworCQkjIHJlcGFjayBkb2Vzbid0IHVzZSBhbnkgYXJndW1lbnRzIHdpdGggc3BhY2VzIGluIHRoZW0sIGRvZXMgaXQ/CisJCXByaW50ICJSdW5uaW5nIGdpdCByZXBhY2sgJF9yZXBhY2tfZmxhZ3MgLi4uXG4iOworCQljb21tYW5kX25vaXN5KCdyZXBhY2snLCBzcGxpdCgvXHMrLywgJF9yZXBhY2tfZmxhZ3MpKTsKKwkJcHJpbnQgIkRvbmUgcmVwYWNraW5nXG4iOworCX0KKwlyZXR1cm4gJGNvbW1pdDsKK30KKworc3ViIG1hdGNoX3BhdGhzIHsKKwlteSAoJHNlbGYsICRwYXRocywgJHIpID0gQF87CisJcmV0dXJuIDEgaWYgJHNlbGYtPntwYXRofSBlcSAnJzsKKwlpZiAobXkgJHBhdGggPSAkcGF0aHMtPnsiLyRzZWxmLT57cGF0aH0ifSkgeworCQlyZXR1cm4gKCRwYXRoLT57YWN0aW9ufSBlcSAnRCcpID8gMCA6IDE7CisJfQorCSRzZWxmLT57cGF0aF9yZWdleH0gfHw9IHFyL15cL1xRJHNlbGYtPntwYXRofVxFXC8vOworCWlmIChncmVwIC8kc2VsZi0+e3BhdGhfcmVnZXh9Lywga2V5cyAlJHBhdGhzKSB7CisJCXJldHVybiAxOworCX0KKwlteSAkYyA9ICcnOworCWZvcmVhY2ggKHNwbGl0IG0jLyMsICRzZWxmLT57cGF0aH0pIHsKKwkJJGMgLj0gIi8kXyI7CisJCW5leHQgdW5sZXNzICgkcGF0aHMtPnskY30gJiYKKwkJICAgICAgICAgICAgICgkcGF0aHMtPnskY30tPnthY3Rpb259ID1+IC9eW0FSXSQvKSk7CisJCWlmICgkc2VsZi0+cmEtPmNoZWNrX3BhdGgoJHNlbGYtPntwYXRofSwgJHIpID09CisJCSAgICAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdWIgZmluZF9wYXJlbnRfYnJhbmNoIHsKKwlteSAoJHNlbGYsICRwYXRocywgJHJldikgPSBAXzsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzICRzZWxmLT5mb2xsb3dfcGFyZW50OworCXVubGVzcyAoZGVmaW5lZCAkcGF0aHMpIHsKKwkJbXkgJGVycl9oYW5kbGVyID0gJFNWTjo6RXJyb3I6OmhhbmRsZXI7CisJCSRTVk46OkVycm9yOjpoYW5kbGVyID0gXCZHaXQ6OlNWTjo6UmE6OnNraXBfdW5rbm93bl9yZXZzOworCQkkc2VsZi0+cmEtPmdldF9sb2coWyRzZWxmLT57cGF0aH1dLCAkcmV2LCAkcmV2LCAwLCAxLCAxLCBzdWIgeworCQkgICAgICAgICAgICAgICAgICAgJHBhdGhzID0KKwkJCQkgICAgICBHaXQ6OlNWTjo6UmE6OmR1cF9jaGFuZ2VkX3BhdGhzKCRfWzBdKSB9KTsKKwkJJFNWTjo6RXJyb3I6OmhhbmRsZXIgPSAkZXJyX2hhbmRsZXI7CisJfQorCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkcGF0aHM7CisKKwkjIGxvb2sgZm9yIGEgcGFyZW50IGZyb20gYW5vdGhlciBicmFuY2g6CisJbXkgQGJfcGF0aF9jb21wb25lbnRzID0gc3BsaXQgbSMvIywgJHNlbGYtPnJlbF9wYXRoOworCW15IEBhX3BhdGhfY29tcG9uZW50czsKKwlteSAkaTsKKwl3aGlsZSAoQGJfcGF0aF9jb21wb25lbnRzKSB7CisJCSRpID0gJHBhdGhzLT57Jy8nLmpvaW4oJy8nLCBAYl9wYXRoX2NvbXBvbmVudHMpfTsKKwkJbGFzdCBpZiAkaSAmJiBkZWZpbmVkICRpLT57Y29weWZyb21fcGF0aH07CisJCXVuc2hpZnQoQGFfcGF0aF9jb21wb25lbnRzLCBwb3AoQGJfcGF0aF9jb21wb25lbnRzKSk7CisJfQorCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkaSAmJiBkZWZpbmVkICRpLT57Y29weWZyb21fcGF0aH07CisJbXkgJGJyYW5jaF9mcm9tID0gJGktPntjb3B5ZnJvbV9wYXRofTsKKwlpZiAoQGFfcGF0aF9jb21wb25lbnRzKSB7CisJCXByaW50IFNUREVSUiAiYnJhbmNoX2Zyb206ICRicmFuY2hfZnJvbSA9PiAiOworCQkkYnJhbmNoX2Zyb20gLj0gJy8nLmpvaW4oJy8nLCBAYV9wYXRoX2NvbXBvbmVudHMpOworCQlwcmludCBTVERFUlIgJGJyYW5jaF9mcm9tLCAiXG4iOworCX0KKwlteSAkciA9ICRpLT57Y29weWZyb21fcmV2fTsKKwlteSAkcmVwb3Nfcm9vdCA9ICRzZWxmLT5yYS0+e3JlcG9zX3Jvb3R9OworCW15ICR1cmwgPSAkc2VsZi0+cmEtPnt1cmx9OworCW15ICRuZXdfdXJsID0gJHJlcG9zX3Jvb3QgLiAkYnJhbmNoX2Zyb207CisJcHJpbnQgU1RERVJSICAiRm91bmQgcG9zc2libGUgYnJhbmNoIHBvaW50OiAiLAorCSAgICAgICAgICAgICAgIiRuZXdfdXJsID0+ICIsICRzZWxmLT5mdWxsX3VybCwgIiwgJHJcbiI7CisJJGJyYW5jaF9mcm9tID1+IHMjXi8jIzsKKwlteSAkZ3MgPSBHaXQ6OlNWTi0+ZmluZF9ieV91cmwoJG5ld191cmwsICRyZXBvc19yb290LCAkYnJhbmNoX2Zyb20pOworCXVubGVzcyAoJGdzKSB7CisJCW15ICRyZWZfaWQgPSAkc2VsZi0+e3JlZl9pZH07CisJCSRyZWZfaWQgPX4gcy9cQFxkKyQvLzsKKwkJJHJlZl9pZCAuPSAiXEAkciI7CisJCSMganVzdCBncm93IGEgdGFpbCBpZiB3ZSdyZSBub3QgdW5pcXVlIGVub3VnaCA6eAorCQkkcmVmX2lkIC49ICctJyB3aGlsZSBmaW5kX3JlZigkcmVmX2lkKTsKKwkJcHJpbnQgU1RERVJSICJJbml0aWFsaXppbmcgcGFyZW50OiAkcmVmX2lkXG4iOworCQkkZ3MgPSBHaXQ6OlNWTi0+aW5pdCgkbmV3X3VybCwgJycsICRyZWZfaWQsICRyZWZfaWQsIDEpOworCX0KKwlteSAoJHIwLCAkcGFyZW50KSA9ICRncy0+ZmluZF9yZXZfYmVmb3JlKCRyLCAxKTsKKwlpZiAoIWRlZmluZWQgJHIwIHx8ICFkZWZpbmVkICRwYXJlbnQpIHsKKwkJbXkgKCRiYXNlLCAkaGVhZCkgPSBwYXJzZV9yZXZpc2lvbl9hcmd1bWVudCgwLCAkcik7CisJCWlmICgkYmFzZSA8PSAkcikgeworCQkJJGdzLT5mZXRjaCgkYmFzZSwgJHIpOworCQl9CisJCSgkcjAsICRwYXJlbnQpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJfQorCWlmIChkZWZpbmVkICRyMCAmJiBkZWZpbmVkICRwYXJlbnQpIHsKKwkJcHJpbnQgU1RERVJSICJGb3VuZCBicmFuY2ggcGFyZW50OiAoJHNlbGYtPntyZWZfaWR9KSAkcGFyZW50XG4iOworCQlteSAkZWQ7CisJCWlmICgkc2VsZi0+cmEtPmNhbl9kb19zd2l0Y2gpIHsKKwkJCSRzZWxmLT5hc3NlcnRfaW5kZXhfY2xlYW4oJHBhcmVudCk7CisJCQlwcmludCBTVERFUlIgIkZvbGxvd2luZyBwYXJlbnQgd2l0aCBkb19zd2l0Y2hcbiI7CisJCQkjIGRvX3N3aXRjaCB3b3JrcyB3aXRoIHN2bi90cnVuayA+PSByMjIzMTIsIGJ1dCB0aGF0CisJCQkjIGlzIG5vdCBpbmNsdWRlZCB3aXRoIFNWTiAxLjQuMyAodGhlIGxhdGVzdCB2ZXJzaW9uCisJCQkjIGF0IHRoZSBtb21lbnQpLCBzbyB3ZSBjYW4ndCByZWx5IG9uIGl0CisJCQkkc2VsZi0+e2xhc3RfY29tbWl0fSA9ICRwYXJlbnQ7CisJCQkkZWQgPSBTVk46OkdpdDo6RmV0Y2hlci0+bmV3KCRzZWxmKTsKKwkJCSRncy0+cmEtPmdzX2RvX3N3aXRjaCgkcjAsICRyZXYsICRncywKKwkJCQkJICAgICAgJHNlbGYtPmZ1bGxfdXJsLCAkZWQpCisJCQkgIG9yIGRpZSAiU1ZOIGNvbm5lY3Rpb24gZmFpbGVkIHNvbWV3aGVyZS4uLlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50IFNUREVSUiAiRm9sbG93aW5nIHBhcmVudCB3aXRoIGRvX3VwZGF0ZVxuIjsKKwkJCSRlZCA9IFNWTjo6R2l0OjpGZXRjaGVyLT5uZXcoJHNlbGYpOworCQkJJHNlbGYtPnJhLT5nc19kb191cGRhdGUoJHJldiwgJHJldiwgJHNlbGYsICRlZCkKKwkJCSAgb3IgZGllICJTVk4gY29ubmVjdGlvbiBmYWlsZWQgc29tZXdoZXJlLi4uXG4iOworCQl9CisJCXByaW50IFNUREVSUiAiU3VjY2Vzc2Z1bGx5IGZvbGxvd2VkIHBhcmVudFxuIjsKKwkJcmV0dXJuICRzZWxmLT5tYWtlX2xvZ19lbnRyeSgkcmV2LCBbJHBhcmVudF0sICRlZCk7CisJfQorCXJldHVybiB1bmRlZjsKK30KKworc3ViIGRvX2ZldGNoIHsKKwlteSAoJHNlbGYsICRwYXRocywgJHJldikgPSBAXzsKKwlteSAkZWQ7CisJbXkgKCRsYXN0X3JldiwgQHBhcmVudHMpOworCWlmIChteSAkbGMgPSAkc2VsZi0+bGFzdF9jb21taXQpIHsKKwkJIyB3ZSBjYW4gaGF2ZSBhIGJyYW5jaCB0aGF0IHdhcyBkZWxldGVkLCB0aGVuIHJlLWFkZGVkCisJCSMgdW5kZXIgdGhlIHNhbWUgbmFtZSBidXQgY29waWVkIGZyb20gYW5vdGhlciBwYXRoLCBpbgorCQkjIHdoaWNoIGNhc2Ugd2UnbGwgaGF2ZSBtdWx0aXBsZSBwYXJlbnRzICh3ZSBkb24ndAorCQkjIHdhbnQgdG8gYnJlYWsgdGhlIG9yaWdpbmFsIHJlZiwgbm9yIGxvc2UgY29weXBhdGggaW5mbyk6CisJCWlmIChteSAkbG9nX2VudHJ5ID0gJHNlbGYtPmZpbmRfcGFyZW50X2JyYW5jaCgkcGF0aHMsICRyZXYpKSB7CisJCQlwdXNoIEB7JGxvZ19lbnRyeS0+e3BhcmVudHN9fSwgJGxjOworCQkJcmV0dXJuICRsb2dfZW50cnk7CisJCX0KKwkJJGVkID0gU1ZOOjpHaXQ6OkZldGNoZXItPm5ldygkc2VsZik7CisJCSRsYXN0X3JldiA9ICRzZWxmLT57bGFzdF9yZXZ9OworCQkkZWQtPntjfSA9ICRsYzsKKwkJQHBhcmVudHMgPSAoJGxjKTsKKwl9IGVsc2UgeworCQkkbGFzdF9yZXYgPSAkcmV2OworCQlpZiAobXkgJGxvZ19lbnRyeSA9ICRzZWxmLT5maW5kX3BhcmVudF9icmFuY2goJHBhdGhzLCAkcmV2KSkgeworCQkJcmV0dXJuICRsb2dfZW50cnk7CisJCX0KKwkJJGVkID0gU1ZOOjpHaXQ6OkZldGNoZXItPm5ldygkc2VsZik7CisJfQorCXVubGVzcyAoJHNlbGYtPnJhLT5nc19kb191cGRhdGUoJGxhc3RfcmV2LCAkcmV2LCAkc2VsZiwgJGVkKSkgeworCQlkaWUgIlNWTiBjb25uZWN0aW9uIGZhaWxlZCBzb21ld2hlcmUuLi5cbiI7CisJfQorCSRzZWxmLT5tYWtlX2xvZ19lbnRyeSgkcmV2LCBcQHBhcmVudHMsICRlZCk7Cit9CisKK3N1YiBnZXRfdW50cmFja2VkIHsKKwlteSAoJHNlbGYsICRlZCkgPSBAXzsKKwlteSBAb3V0OworCW15ICRoID0gJGVkLT57ZW1wdHl9OworCWZvcmVhY2ggKHNvcnQga2V5cyAlJGgpIHsKKwkJbXkgJGFjdCA9ICRoLT57JF99ID8gJytlbXB0eV9kaXInIDogJy1lbXB0eV9kaXInOworCQlwdXNoIEBvdXQsICIgICRhY3Q6ICIgLiB1cmlfZW5jb2RlKCRfKTsKKwkJd2FybiAiVzogJGFjdDogJF9cbiI7CisJfQorCWZvcmVhY2ggbXkgJHQgKHF3L2Rpcl9wcm9wIGZpbGVfcHJvcC8pIHsKKwkJJGggPSAkZWQtPnskdH0gb3IgbmV4dDsKKwkJZm9yZWFjaCBteSAkcGF0aCAoc29ydCBrZXlzICUkaCkgeworCQkJbXkgJHBwYXRoID0gJHBhdGggZXEgJycgPyAnLicgOiAkcGF0aDsKKwkJCWZvcmVhY2ggbXkgJHByb3AgKHNvcnQga2V5cyAleyRoLT57JHBhdGh9fSkgeworCQkJCW5leHQgaWYgJFNLSVBfUFJPUHskcHJvcH07CisJCQkJbXkgJHYgPSAkaC0+eyRwYXRofS0+eyRwcm9wfTsKKwkJCQlteSAkdF9wcGF0aF9wcm9wID0gIiR0OiAiIC4KKwkJCQkgICAgICAgICAgICAgICAgICAgIHVyaV9lbmNvZGUoJHBwYXRoKSAuICcgJyAuCisJCQkJICAgICAgICAgICAgICAgICAgICB1cmlfZW5jb2RlKCRwcm9wKTsKKwkJCQlpZiAoZGVmaW5lZCAkdikgeworCQkJCQlwdXNoIEBvdXQsICIgICskdF9wcGF0aF9wcm9wICIgLgorCQkJCQkgICAgICAgICAgIHVyaV9lbmNvZGUoJHYpOworCQkJCX0gZWxzZSB7CisJCQkJCXB1c2ggQG91dCwgIiAgLSR0X3BwYXRoX3Byb3AiOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlmb3JlYWNoIG15ICR0IChxdy9hYnNlbnRfZmlsZSBhYnNlbnRfZGlyZWN0b3J5LykgeworCQkkaCA9ICRlZC0+eyR0fSBvciBuZXh0OworCQlmb3JlYWNoIG15ICRwYXJlbnQgKHNvcnQga2V5cyAlJGgpIHsKKwkJCWZvcmVhY2ggbXkgJHBhdGggKHNvcnQgQHskaC0+eyRwYXJlbnR9fSkgeworCQkJCXB1c2ggQG91dCwgIiAgJHQ6ICIgLgorCQkJCSAgICAgICAgICAgdXJpX2VuY29kZSgiJHBhcmVudC8kcGF0aCIpOworCQkJCXdhcm4gIlc6ICR0OiAkcGFyZW50LyRwYXRoICIsCisJCQkJICAgICAiSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zP1xuIjsKKwkJCX0KKwkJfQorCX0KKwlcQG91dDsKK30KKworc3ViIHBhcnNlX3N2bl9kYXRlIHsKKwlteSAkZGF0ZSA9IHNoaWZ0IHx8IHJldHVybiAnKzAwMDAgMTk3MC0wMS0wMSAwMDowMDowMCc7CisJbXkgKCRZLCRtLCRkLCRILCRNLCRTKSA9ICgkZGF0ZSA9fiAvXihcZHs0fSlcLShcZFxkKVwtKFxkXGQpVAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcZFxkKVw6KFxkXGQpXDooXGRcZCkuXGQrWiQveCkgb3IKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9hayAiVW5hYmxlIHRvIHBhcnNlIGRhdGU6ICRkYXRlXG4iOworCSIrMDAwMCAkWS0kbS0kZCAkSDokTTokUyI7Cit9CisKK3N1YiBjaGVja19hdXRob3IgeworCW15ICgkYXV0aG9yKSA9IEBfOworCWlmICghZGVmaW5lZCAkYXV0aG9yIHx8IGxlbmd0aCAkYXV0aG9yID09IDApIHsKKwkJJGF1dGhvciA9ICcobm8gYXV0aG9yKSc7CisJfQorCWlmIChkZWZpbmVkICQ6Ol9hdXRob3JzICYmICEgZGVmaW5lZCAkOjp1c2Vyc3skYXV0aG9yfSkgeworCQlkaWUgIkF1dGhvcjogJGF1dGhvciBub3QgZGVmaW5lZCBpbiAkOjpfYXV0aG9ycyBmaWxlXG4iOworCX0KKwkkYXV0aG9yOworfQorCitzdWIgbWFrZV9sb2dfZW50cnkgeworCW15ICgkc2VsZiwgJHJldiwgJHBhcmVudHMsICRlZCkgPSBAXzsKKwlteSAkdW50cmFja2VkID0gJHNlbGYtPmdldF91bnRyYWNrZWQoJGVkKTsKKworCW9wZW4gbXkgJHVuLCAnPj4nLCAiJHNlbGYtPntkaXJ9L3VuaGFuZGxlZC5sb2ciIG9yIGNyb2FrICQhOworCXByaW50ICR1biAiciRyZXZcbiIgb3IgY3JvYWsgJCE7CisJcHJpbnQgJHVuICRfLCAiXG4iIGZvcmVhY2ggQCR1bnRyYWNrZWQ7CisJbXkgJWxvZ19lbnRyeSA9ICggcGFyZW50cyA9PiAkcGFyZW50cyB8fCBbXSwgcmV2aXNpb24gPT4gJHJldiwKKwkgICAgICAgICAgICAgICAgICBsb2cgPT4gJycpOworCisJbXkgJGhlYWRyZXY7CisJbXkgJGxvZ2dlZCA9IGRlbGV0ZSAkc2VsZi0+e2xvZ2dlZF9yZXZfcHJvcHN9OworCWlmICghJGxvZ2dlZCB8fCAkc2VsZi0+ey13YW50X3JldnByb3BzfSkgeworCQlteSAkcnAgPSAkc2VsZi0+cmEtPnJldl9wcm9wbGlzdCgkcmV2KTsKKwkJZm9yZWFjaCAoc29ydCBrZXlzICUkcnApIHsKKwkJCW15ICR2ID0gJHJwLT57JF99OworCQkJaWYgKC9ec3ZuOihhdXRob3J8ZGF0ZXxsb2cpJC8pIHsKKwkJCQkkbG9nX2VudHJ5eyQxfSA9ICR2OworCQkJfSBlbHNpZiAoJF8gZXEgJ3N2bTpoZWFkcmV2JykgeworCQkJCSRoZWFkcmV2ID0gJHY7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICR1biAiICByZXZfcHJvcDogIiwgdXJpX2VuY29kZSgkXyksICcgJywKKwkJCQkJICB1cmlfZW5jb2RlKCR2KSwgIlxuIjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW1hcCB7ICRsb2dfZW50cnl7JF99ID0gJGxvZ2dlZC0+eyRffSB9IGtleXMgJSRsb2dnZWQ7CisJfQorCWNsb3NlICR1biBvciBjcm9hayAkITsKKworCSRsb2dfZW50cnl7ZGF0ZX0gPSBwYXJzZV9zdm5fZGF0ZSgkbG9nX2VudHJ5e2RhdGV9KTsKKwkkbG9nX2VudHJ5e2xvZ30gLj0gIlxuIjsKKwlteSAkYXV0aG9yID0gJGxvZ19lbnRyeXthdXRob3J9ID0gY2hlY2tfYXV0aG9yKCRsb2dfZW50cnl7YXV0aG9yfSk7CisJbXkgKCRuYW1lLCAkZW1haWwpID0gZGVmaW5lZCAkOjp1c2Vyc3skYXV0aG9yfSA/IEB7JDo6dXNlcnN7JGF1dGhvcn19CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgkYXV0aG9yLCB1bmRlZik7CisJaWYgKGRlZmluZWQgJGhlYWRyZXYgJiYgJHNlbGYtPnVzZV9zdm1fcHJvcHMpIHsKKwkJaWYgKCRzZWxmLT5yZXdyaXRlX3Jvb3QpIHsKKwkJCWRpZSAiQ2FuJ3QgaGF2ZSBib3RoICd1c2VTdm1Qcm9wcycgYW5kICdyZXdyaXRlUm9vdCcgIiwKKwkJCSAgICAib3B0aW9ucyBzZXQhXG4iOworCQl9CisJCW15ICgkdXVpZCwgJHIpID0gJGhlYWRyZXYgPX4gbXteKFthLWZcZFwtXXszMCx9KTooXGQrKSR9OworCQkjIHdlIGRvbid0IHdhbnQgIlNWTTogaW5pdGlhbGl6aW5nIG1pcnJvciBmb3IganVuayIgLi4uCisJCXJldHVybiB1bmRlZiBpZiAkciA9PSAwOworCQlteSAkc3ZtID0gJHNlbGYtPnN2bTsKKwkJaWYgKCR1dWlkIG5lICRzdm0tPnt1dWlkfSkgeworCQkJZGllICJVVUlEIG1pc21hdGNoIG9uIFNWTSBwYXRoOlxuIiwKKwkJCSAgICAiZXhwZWN0ZWQ6ICRzdm0tPnt1dWlkfVxuIiwKKwkJCSAgICAiICAgICBnb3Q6ICR1dWlkXG4iOworCQl9CisJCW15ICRmdWxsX3VybCA9ICRzZWxmLT5mdWxsX3VybDsKKwkJJGZ1bGxfdXJsID1+IHMjXlxRJHN2bS0+e3JlcGxhY2V9XEUoL3wkKSMkc3ZtLT57c291cmNlfSQxIyBvcgorCQkgICAgICAgICAgICAgZGllICJGYWlsZWQgdG8gcmVwbGFjZSAnJHN2bS0+e3JlcGxhY2V9JyB3aXRoICIsCisJCSAgICAgICAgICAgICAgICAgIickc3ZtLT57c291cmNlfScgaW4gJGZ1bGxfdXJsXG4iOworCQkjIHRocm93IGF3YXkgdXNlcm5hbWUgZm9yIHN0b3JpbmcgaW4gcmVjb3JkcworCQlyZW1vdmVfdXNlcm5hbWUoJGZ1bGxfdXJsKTsKKwkJJGxvZ19lbnRyeXttZXRhZGF0YX0gPSAiJGZ1bGxfdXJsXEAkciAkdXVpZCI7CisJCSRsb2dfZW50cnl7c3ZtX3JldmlzaW9ufSA9ICRyOworCQkkZW1haWwgfHw9ICIkYXV0aG9yXEAkdXVpZCIKKwl9IGVsc2lmICgkc2VsZi0+dXNlX3N2bnN5bmNfcHJvcHMpIHsKKwkJbXkgJGZ1bGxfdXJsID0gJHNlbGYtPnN2bnN5bmMtPnt1cmx9OworCQkkZnVsbF91cmwgLj0gIi8kc2VsZi0+e3BhdGh9IiBpZiBsZW5ndGggJHNlbGYtPntwYXRofTsKKwkJcmVtb3ZlX3VzZXJuYW1lKCRmdWxsX3VybCk7CisJCW15ICR1dWlkID0gJHNlbGYtPnN2bnN5bmMtPnt1dWlkfTsKKwkJJGxvZ19lbnRyeXttZXRhZGF0YX0gPSAiJGZ1bGxfdXJsXEAkcmV2ICR1dWlkIjsKKwkJJGVtYWlsIHx8PSAiJGF1dGhvclxAJHV1aWQiCisJfSBlbHNlIHsKKwkJbXkgJHVybCA9ICRzZWxmLT5tZXRhZGF0YV91cmw7CisJCXJlbW92ZV91c2VybmFtZSgkdXJsKTsKKwkJJGxvZ19lbnRyeXttZXRhZGF0YX0gPSAiJHVybFxAJHJldiAiIC4KKwkJICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+cmEtPmdldF91dWlkOworCQkkZW1haWwgfHw9ICIkYXV0aG9yXEAiIC4gJHNlbGYtPnJhLT5nZXRfdXVpZDsKKwl9CisJJGxvZ19lbnRyeXtuYW1lfSA9ICRuYW1lOworCSRsb2dfZW50cnl7ZW1haWx9ID0gJGVtYWlsOworCVwlbG9nX2VudHJ5OworfQorCitzdWIgZmV0Y2ggeworCW15ICgkc2VsZiwgJG1pbl9yZXYsICRtYXhfcmV2LCBAcGFyZW50cykgPSBAXzsKKwlteSAoJGxhc3RfcmV2LCAkbGFzdF9jb21taXQpID0gJHNlbGYtPmxhc3RfcmV2X2NvbW1pdDsKKwlteSAoJGJhc2UsICRoZWFkKSA9ICRzZWxmLT5nZXRfZmV0Y2hfcmFuZ2UoJG1pbl9yZXYsICRtYXhfcmV2KTsKKwkkc2VsZi0+cmEtPmdzX2ZldGNoX2xvb3BfY29tbW9uKCRiYXNlLCAkaGVhZCwgWyRzZWxmXSk7Cit9CisKK3N1YiBzZXRfdHJlZV9jYiB7CisJbXkgKCRzZWxmLCAkbG9nX2VudHJ5LCAkdHJlZSwgJHJldiwgJGRhdGUsICRhdXRob3IpID0gQF87CisJJHNlbGYtPntpbmplY3RfcGFyZW50c30gPSB7ICRyZXYgPT4gJHRyZWUgfTsKKwkkc2VsZi0+ZmV0Y2godW5kZWYsIHVuZGVmKTsKK30KKworc3ViIHNldF90cmVlIHsKKwlteSAoJHNlbGYsICR0cmVlKSA9IChzaGlmdCwgc2hpZnQpOworCW15ICRsb2dfZW50cnkgPSA6OmdldF9jb21taXRfZW50cnkoJHRyZWUpOworCXVubGVzcyAoJHNlbGYtPntsYXN0X3Jldn0pIHsKKwkJZmF0YWwoIk11c3QgaGF2ZSBhbiBleGlzdGluZyByZXZpc2lvbiB0byBjb21taXRcbiIpOworCX0KKwlteSAlZWRfb3B0cyA9ICggciA9PiAkc2VsZi0+e2xhc3RfcmV2fSwKKwkgICAgICAgICAgICAgICAgbG9nID0+ICRsb2dfZW50cnktPntsb2d9LAorCSAgICAgICAgICAgICAgICByYSA9PiAkc2VsZi0+cmEsCisJICAgICAgICAgICAgICAgIHRyZWVfYSA9PiAkc2VsZi0+e2xhc3RfY29tbWl0fSwKKwkgICAgICAgICAgICAgICAgdHJlZV9iID0+ICR0cmVlLAorCSAgICAgICAgICAgICAgICBlZGl0b3JfY2IgPT4gc3ViIHsKKwkJCSAgICAgICAkc2VsZi0+c2V0X3RyZWVfY2IoJGxvZ19lbnRyeSwgJHRyZWUsIEBfKSB9LAorCSAgICAgICAgICAgICAgICBzdm5fcGF0aCA9PiAkc2VsZi0+e3BhdGh9ICk7CisJaWYgKCFTVk46OkdpdDo6RWRpdG9yLT5uZXcoXCVlZF9vcHRzKS0+YXBwbHlfZGlmZikgeworCQlwcmludCAiTm8gY2hhbmdlc1xuciRzZWxmLT57bGFzdF9yZXZ9ID0gJHRyZWVcbiI7CisJfQorfQorCitzdWIgcmVidWlsZCB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICRkYl9wYXRoID0gJHNlbGYtPmRiX3BhdGg7CisJcmV0dXJuIGlmICgtZSAkZGJfcGF0aCAmJiAhIC16ICRkYl9wYXRoKTsKKwlyZXR1cm4gdW5sZXNzIDo6dmVyaWZ5X3JlZigkc2VsZi0+cmVmbmFtZS4nXjAnKTsKKwlpZiAoLWYgJHNlbGYtPntkYl9yb290fSkgeworCQlyZW5hbWUgJHNlbGYtPntkYl9yb290fSwgJGRiX3BhdGggb3IgZGllCisJCSAgICAgInJlbmFtZSAkc2VsZi0+e2RiX3Jvb3R9ID0+ICRkYl9wYXRoIGZhaWxlZDogJCFcbiI7CisJCW15ICgkZGlyLCAkYmFzZSkgPSAoJGRiX3BhdGggPX4gbSNeKC4qPykvPyhbXi9dKykkIyk7CisJCXN5bWxpbmsgJGJhc2UsICRzZWxmLT57ZGJfcm9vdH0gb3IgZGllCisJCSAgICAgInN5bWxpbmsgJGJhc2UgPT4gJHNlbGYtPntkYl9yb290fSBmYWlsZWQ6ICQhXG4iOworCQlyZXR1cm47CisJfQorCXByaW50ICJSZWJ1aWxkaW5nICRkYl9wYXRoIC4uLlxuIjsKKwlteSAoJHJldl9saXN0LCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoInJldi1saXN0IiwgJHNlbGYtPnJlZm5hbWUpOworCW15ICRsYXRlc3Q7CisJbXkgJGZ1bGxfdXJsID0gJHNlbGYtPmZ1bGxfdXJsOworCXJlbW92ZV91c2VybmFtZSgkZnVsbF91cmwpOworCW15ICRzdm5fdXVpZDsKKwl3aGlsZSAoPCRyZXZfbGlzdD4pIHsKKwkJY2hvbXA7CisJCW15ICRjID0gJF87CisJCWRpZSAiTm9uLVNIQTE6ICRjXG4iIHVubGVzcyAkYyA9fiAvXiQ6OnNoYTEkL287CisJCW15ICgkdXJsLCAkcmV2LCAkdXVpZCkgPSA6OmNtdF9tZXRhZGF0YSgkYyk7CisJCXJlbW92ZV91c2VybmFtZSgkdXJsKTsKKworCQkjIGlnbm9yZSBtZXJnZXMgKGZyb20gc2V0LXRyZWUpCisJCW5leHQgaWYgKCFkZWZpbmVkICRyZXYgfHwgISR1dWlkKTsKKworCQkjIGlmIHdlIG1lcmdlZCBvciBvdGhlcndpc2Ugc3RhcnRlZCBlbHNld2hlcmUsIHRoaXMgaXMKKwkJIyBob3cgd2UgYnJlYWsgb3V0IG9mIGl0CisJCWlmICgoZGVmaW5lZCAkc3ZuX3V1aWQgJiYgKCR1dWlkIG5lICRzdm5fdXVpZCkpIHx8CisJCSAgICAoJGZ1bGxfdXJsICYmICR1cmwgJiYgKCR1cmwgbmUgJGZ1bGxfdXJsKSkpIHsKKwkJCW5leHQ7CisJCX0KKwkJJGxhdGVzdCB8fD0gJHJldjsKKwkJJHN2bl91dWlkIHx8PSAkdXVpZDsKKworCQkkc2VsZi0+cmV2X2RiX3NldCgkcmV2LCAkYyk7CisJCXByaW50ICJyJHJldiA9ICRjXG4iOworCX0KKwljb21tYW5kX2Nsb3NlX3BpcGUoJHJldl9saXN0LCAkY3R4KTsKKwlwcmludCAiRG9uZSByZWJ1aWxkaW5nICRkYl9wYXRoXG4iOworfQorCisjIHJldl9kYjoKKyMgVGllOjpGaWxlIHNlZW1zIHRvIGJlIHByb25lIHRvIG9mZnNldCBlcnJvcnMgaWYgcmV2aXNpb25zIGdldCBzcGFyc2UsCisjIGl0J3Mgbm90IHRoYXQgZmFzdCwgZWl0aGVyLiAgVGllOjpGaWxlIGlzIGFsc28gbm90IGluIFBlcmwgNS42LiAgU28KKyMgb25lIG9mIG15IGZhdm9yaXRlIG1vZHVsZXMgaXMgb3V0IDo8ICBOZXh0IHVwIHdvdWxkIGJlIG9uZSBvZiB0aGUgREJNCisjIG1vZHVsZXMsIGJ1dCBJJ20gbm90IHN1cmUgd2hpY2ggaXMgbW9zdCBwb3J0YWJsZS4uLiAgU28gSSdsbCBqdXN0CisjIGdvIHdpdGggc29tZXRoaW5nIHRoYXQncyBwbGFpbi10ZXh0LCBidXQgc3RpbGwgY2FwYWJsZSBvZgorIyBiZWluZyByYW5kb21seSBhY2Nlc3NlZC4gIFNvIGhlcmUncyBteSB1bHRyYS1zaW1wbGUgZml4ZWQtd2lkdGgKKyMgZGF0YWJhc2UuICBBbGwgcmVjb3JkcyBhcmUgNDAgY2hhcmFjdGVycyArICJcbiIsIHNvIGl0J3MgZWFzeSB0byBzZWVrCisjIHRvIGEgcmV2aXNpb246ICg0MSAqIHJldikgaXMgdGhlIGJ5dGUgb2Zmc2V0LgorIyBBIHJlY29yZCBvZiA0MCAwcyBkZW5vdGVzIGFuIGVtcHR5IHJldmlzaW9uLgorIyBBbmQgeWVzLCBpdCdzIHN0aWxsIHByZXR0eSBmYXN0IChmYXN0ZXIgdGhhbiBUaWU6OkZpbGUpLgorIyBUaGVzZSBmaWxlcyBhcmUgZGlzcG9zYWJsZSB1bmxlc3Mgbm9NZXRhZGF0YSBvciB1c2VTdm1Qcm9wcyBpcyBzZXQKKworc3ViIF9yZXZfZGJfc2V0IHsKKwlteSAoJGZoLCAkcmV2LCAkY29tbWl0KSA9IEBfOworCW15ICRvZmZzZXQgPSAkcmV2ICogNDE7CisJIyBhc3N1bWUgdGhhdCBhcHBlbmQgaXMgdGhlIGNvbW1vbiBjYXNlOgorCXNlZWsgJGZoLCAwLCAyIG9yIGNyb2FrICQhOworCW15ICRwb3MgPSB0ZWxsICRmaDsKKwlpZiAoJHBvcyA8ICRvZmZzZXQpIHsKKwkJZm9yICgxIC4uICgoJG9mZnNldCAtICRwb3MpIC8gNDEpKSB7CisJCQlwcmludCAkZmggKCgnMCcgeCA0MCksIlxuIikgb3IgY3JvYWsgJCE7CisJCX0KKwl9CisJc2VlayAkZmgsICRvZmZzZXQsIDAgb3IgY3JvYWsgJCE7CisJcHJpbnQgJGZoICRjb21taXQsIlxuIiBvciBjcm9hayAkITsKK30KKworc3ViIG1rZmlsZSB7CisJbXkgKCRwYXRoKSA9IEBfOworCXVubGVzcyAoLWUgJHBhdGgpIHsKKwkJbXkgKCRkaXIsICRiYXNlKSA9ICgkcGF0aCA9fiBtI14oLio/KS8/KFteL10rKSQjKTsKKwkJbWtwYXRoKFskZGlyXSkgdW5sZXNzIC1kICRkaXI7CisJCW9wZW4gbXkgJGZoLCAnPj4nLCAkcGF0aCBvciBkaWUgIkNvdWxkbid0IGNyZWF0ZSAkcGF0aDogJCFcbiI7CisJCWNsb3NlICRmaCBvciBkaWUgIkNvdWxkbid0IGNsb3NlIChjcmVhdGUpICRwYXRoOiAkIVxuIjsKKwl9Cit9CisKK3N1YiByZXZfZGJfc2V0IHsKKwlteSAoJHNlbGYsICRyZXYsICRjb21taXQsICR1cGRhdGVfcmVmLCAkdXVpZCkgPSBAXzsKKwlsZW5ndGggJGNvbW1pdCA9PSA0MCBvciBkaWUgImFyZzMgbXVzdCBiZSBhIGZ1bGwgU0hBMSBoZXhzdW1cbiI7CisJbXkgJGRiID0gJHNlbGYtPmRiX3BhdGgoJHV1aWQpOworCW15ICRkYl9sb2NrID0gIiRkYi5sb2NrIjsKKwlteSAkc2lnOworCWlmICgkdXBkYXRlX3JlZikgeworCQkkU0lHe0lOVH0gPSAkU0lHe0hVUH0gPSAkU0lHe1RFUk19ID0gJFNJR3tBTFJNfSA9ICRTSUd7UElQRX0gPQorCQkgICAgICAgICAgICAkU0lHe1VTUjF9ID0gJFNJR3tVU1IyfSA9IHN1YiB7ICRzaWcgPSAkX1swXSB9OworCX0KKwlta2ZpbGUoJGRiKTsKKworCSRMT0NLRklMRVN7JGRiX2xvY2t9ID0gMTsKKwlteSAkc3luYzsKKwkjIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBtYWtlIG91ciAucmV2X2RiIGZpbGUgdmVyeSwgdmVyeSBpbXBvcnRhbnQKKwkjIGFuZCB3ZSBjYW4ndCBhZmZvcmQgdG8gbG9zZSBpdCBiZWNhdXNlIHJlYnVpbGQoKSB3b24ndCB3b3JrCisJaWYgKCRzZWxmLT51c2Vfc3ZtX3Byb3BzIHx8ICRzZWxmLT5ub19tZXRhZGF0YSkgeworCQkkc3luYyA9IDE7CisJCWNvcHkoJGRiLCAkZGJfbG9jaykgb3IgZGllICJyZXZfZGJfc2V0KEBfKTogIiwKKwkJCQkJICAgIkZhaWxlZCB0byBjb3B5OiAiLAorCQkJCQkgICAiJGRiID0+ICRkYl9sb2NrICgkISlcbiI7CisJfSBlbHNlIHsKKwkJcmVuYW1lICRkYiwgJGRiX2xvY2sgb3IgZGllICJyZXZfZGJfc2V0KEBfKTogIiwKKwkJCQkJICAgICJGYWlsZWQgdG8gcmVuYW1lOiAiLAorCQkJCQkgICAgIiRkYiA9PiAkZGJfbG9jayAoJCEpXG4iOworCX0KKwlvcGVuIG15ICRmaCwgJys8JywgJGRiX2xvY2sgb3IgZGllICJDb3VsZG4ndCBvcGVuICRkYl9sb2NrOiAkIVxuIjsKKwlfcmV2X2RiX3NldCgkZmgsICRyZXYsICRjb21taXQpOworCWlmICgkc3luYykgeworCQkkZmgtPmZsdXNoIG9yIGRpZSAiQ291bGRuJ3QgZmx1c2ggJGRiX2xvY2s6ICQhXG4iOworCQkkZmgtPnN5bmMgb3IgZGllICJDb3VsZG4ndCBzeW5jICRkYl9sb2NrOiAkIVxuIjsKKwl9CisJY2xvc2UgJGZoIG9yIGNyb2FrICQhOworCWlmICgkdXBkYXRlX3JlZikgeworCQkkX2hlYWQgPSAkc2VsZjsKKwkJY29tbWFuZF9ub2lzeSgndXBkYXRlLXJlZicsICctbScsICJyJHJldiIsCisJCSAgICAgICAgICAgICAgJHNlbGYtPnJlZm5hbWUsICRjb21taXQpOworCX0KKwlyZW5hbWUgJGRiX2xvY2ssICRkYiBvciBkaWUgInJldl9kYl9zZXQoQF8pOiAiLCAiRmFpbGVkIHRvIHJlbmFtZTogIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkYl9sb2NrID0+ICRkYiAoJCEpXG4iOworCWRlbGV0ZSAkTE9DS0ZJTEVTeyRkYl9sb2NrfTsKKwlpZiAoJHVwZGF0ZV9yZWYpIHsKKwkJJFNJR3tJTlR9ID0gJFNJR3tIVVB9ID0gJFNJR3tURVJNfSA9ICRTSUd7QUxSTX0gPSAkU0lHe1BJUEV9ID0KKwkJICAgICAgICAgICAgJFNJR3tVU1IxfSA9ICRTSUd7VVNSMn0gPSAnREVGQVVMVCc7CisJCWtpbGwgJHNpZywgJCQgaWYgZGVmaW5lZCAkc2lnOworCX0KK30KKworc3ViIHJldl9kYl9tYXggeworCW15ICgkc2VsZikgPSBAXzsKKwkkc2VsZi0+cmVidWlsZDsKKwlteSAkZGJfcGF0aCA9ICRzZWxmLT5kYl9wYXRoOworCW15IEBzdGF0ID0gc3RhdCAkZGJfcGF0aCBvciByZXR1cm4gMDsKKwkoJHN0YXRbN10gJSA0MSkgPT0gMCBvciBkaWUgIiRkYl9wYXRoIGluY29uc2lzdGVudCBzaXplOiAkc3RhdFs3XVxuIjsKKwlteSAkbWF4ID0gJHN0YXRbN10gLyA0MTsKKwkoKCRtYXggPiAwKSA/ICRtYXggLSAxIDogMCk7Cit9CisKK3N1YiByZXZfZGJfZ2V0IHsKKwlteSAoJHNlbGYsICRyZXYsICR1dWlkKSA9IEBfOworCW15ICRyZXQ7CisJbXkgJG9mZnNldCA9ICRyZXYgKiA0MTsKKwlteSAkZGJfcGF0aCA9ICRzZWxmLT5kYl9wYXRoKCR1dWlkKTsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIC1lICRkYl9wYXRoOworCW9wZW4gbXkgJGZoLCAnPCcsICRkYl9wYXRoIG9yIGNyb2FrICQhOworCWlmIChzeXNzZWVrKCRmaCwgJG9mZnNldCwgMCkgPT0gJG9mZnNldCkgeworCQlteSAkcmVhZCA9IHN5c3JlYWQoJGZoLCAkcmV0LCA0MCk7CisJCSRyZXQgPSB1bmRlZiBpZiAoJHJlYWQgIT0gNDAgfHwgJHJldCBlcSAoJzAneDQwKSk7CisJfQorCWNsb3NlICRmaCBvciBjcm9hayAkITsKKwkkcmV0OworfQorCitzdWIgZmluZF9yZXZfYmVmb3JlIHsKKwlteSAoJHNlbGYsICRyZXYsICRlcV9vaykgPSBAXzsKKwktLSRyZXYgdW5sZXNzICRlcV9vazsKKwl3aGlsZSAoJHJldiA+IDApIHsKKwkJaWYgKG15ICRjID0gJHNlbGYtPnJldl9kYl9nZXQoJHJldikpIHsKKwkJCXJldHVybiAoJHJldiwgJGMpOworCQl9CisJCS0tJHJldjsKKwl9CisJcmV0dXJuICh1bmRlZiwgdW5kZWYpOworfQorCitzdWIgX25ldyB7CisJbXkgKCRjbGFzcywgJHJlcG9faWQsICRyZWZfaWQsICRwYXRoKSA9IEBfOworCXVubGVzcyAoZGVmaW5lZCAkcmVwb19pZCAmJiBsZW5ndGggJHJlcG9faWQpIHsKKwkJJHJlcG9faWQgPSAkR2l0OjpTVk46OmRlZmF1bHRfcmVwb19pZDsKKwl9CisJdW5sZXNzIChkZWZpbmVkICRyZWZfaWQgJiYgbGVuZ3RoICRyZWZfaWQpIHsKKwkJJF9bMl0gPSAkcmVmX2lkID0gJEdpdDo6U1ZOOjpkZWZhdWx0X3JlZl9pZDsKKwl9CisJJF9bMV0gPSAkcmVwb19pZCA9IHNhbml0aXplX3JlbW90ZV9uYW1lKCRyZXBvX2lkKTsKKwlteSAkZGlyID0gIiRFTlZ7R0lUX0RJUn0vc3ZuLyRyZWZfaWQiOworCSRfWzNdID0gJHBhdGggPSAnJyB1bmxlc3MgKGRlZmluZWQgJHBhdGgpOworCW1rcGF0aChbIiRFTlZ7R0lUX0RJUn0vc3ZuIl0pOworCWJsZXNzIHsKKwkJcmVmX2lkID0+ICRyZWZfaWQsIGRpciA9PiAkZGlyLCBpbmRleCA9PiAiJGRpci9pbmRleCIsCisJICAgICAgICBwYXRoID0+ICRwYXRoLCBjb25maWcgPT4gIiRFTlZ7R0lUX0RJUn0vc3ZuL2NvbmZpZyIsCisJICAgICAgICBkYl9yb290ID0+ICIkZGlyLy5yZXZfZGIiLCByZXBvX2lkID0+ICRyZXBvX2lkIH0sICRjbGFzczsKK30KKworc3ViIGRiX3BhdGggeworCW15ICgkc2VsZiwgJHV1aWQpID0gQF87CisJJHV1aWQgfHw9ICRzZWxmLT5yYV91dWlkOworCSIkc2VsZi0+e2RiX3Jvb3R9LiR1dWlkIjsKK30KKworc3ViIHVyaV9lbmNvZGUgeworCW15ICgkZikgPSBAXzsKKwkkZiA9fiBzIyhbXmEtekEtWjAtOVwqIVw6X1wuL1wtXSkjdWMgc3ByaW50ZigiJSUlMDJ4IixvcmQoJDEpKSNlZzsKKwkkZgorfQorCitzdWIgcmVtb3ZlX3VzZXJuYW1lIHsKKwkkX1swXSA9fiBze14oW146XSo6Ly8pW15AXStAfXskMX07Cit9CisKK3BhY2thZ2UgR2l0OjpTVk46OlByb21wdDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CityZXF1aXJlIFNWTjo6Q29yZTsKK3VzZSB2YXJzIHF3LyRfbm9fYXV0aF9jYWNoZSAkX3VzZXJuYW1lLzsKKworc3ViIHNpbXBsZSB7CisJbXkgKCRjcmVkLCAkcmVhbG0sICRkZWZhdWx0X3VzZXJuYW1lLCAkbWF5X3NhdmUsICRwb29sKSA9IEBfOworCSRtYXlfc2F2ZSA9IHVuZGVmIGlmICRfbm9fYXV0aF9jYWNoZTsKKwkkZGVmYXVsdF91c2VybmFtZSA9ICRfdXNlcm5hbWUgaWYgZGVmaW5lZCAkX3VzZXJuYW1lOworCWlmIChkZWZpbmVkICRkZWZhdWx0X3VzZXJuYW1lICYmIGxlbmd0aCAkZGVmYXVsdF91c2VybmFtZSkgeworCQlpZiAoZGVmaW5lZCAkcmVhbG0gJiYgbGVuZ3RoICRyZWFsbSkgeworCQkJcHJpbnQgU1RERVJSICJBdXRoZW50aWNhdGlvbiByZWFsbTogJHJlYWxtXG4iOworCQkJU1RERVJSLT5mbHVzaDsKKwkJfQorCQkkY3JlZC0+dXNlcm5hbWUoJGRlZmF1bHRfdXNlcm5hbWUpOworCX0gZWxzZSB7CisJCXVzZXJuYW1lKCRjcmVkLCAkcmVhbG0sICRtYXlfc2F2ZSwgJHBvb2wpOworCX0KKwkkY3JlZC0+cGFzc3dvcmQoX3JlYWRfcGFzc3dvcmQoIlBhc3N3b3JkIGZvciAnIiAuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjcmVkLT51c2VybmFtZSAuICInOiAiLCAkcmVhbG0pKTsKKwkkY3JlZC0+bWF5X3NhdmUoJG1heV9zYXZlKTsKKwkkU1ZOOjpfQ29yZTo6U1ZOX05PX0VSUk9SOworfQorCitzdWIgc3NsX3NlcnZlcl90cnVzdCB7CisJbXkgKCRjcmVkLCAkcmVhbG0sICRmYWlsdXJlcywgJGNlcnRfaW5mbywgJG1heV9zYXZlLCAkcG9vbCkgPSBAXzsKKwkkbWF5X3NhdmUgPSB1bmRlZiBpZiAkX25vX2F1dGhfY2FjaGU7CisJcHJpbnQgU1RERVJSICJFcnJvciB2YWxpZGF0aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZSBmb3IgJyRyZWFsbSc6XG4iOworCWlmICgkZmFpbHVyZXMgJiAkU1ZOOjpBdXRoOjpTU0w6OlVOS05PV05DQSkgeworCQlwcmludCBTVERFUlIgIiAtIFRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgaXNzdWVkIGJ5IGEgdHJ1c3RlZCAiLAorCQkgICAgICAiYXV0aG9yaXR5LiBVc2UgdGhlXG4iLAorCSAgICAgICAgICAgICAgIiAgIGZpbmdlcnByaW50IHRvIHZhbGlkYXRlIHRoZSBjZXJ0aWZpY2F0ZSBtYW51YWxseSFcbiI7CisJfQorCWlmICgkZmFpbHVyZXMgJiAkU1ZOOjpBdXRoOjpTU0w6OkNOTUlTTUFUQ0gpIHsKKwkJcHJpbnQgU1RERVJSICIgLSBUaGUgY2VydGlmaWNhdGUgaG9zdG5hbWUgZG9lcyBub3QgbWF0Y2guXG4iOworCX0KKwlpZiAoJGZhaWx1cmVzICYgJFNWTjo6QXV0aDo6U1NMOjpOT1RZRVRWQUxJRCkgeworCQlwcmludCBTVERFUlIgIiAtIFRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgeWV0IHZhbGlkLlxuIjsKKwl9CisJaWYgKCRmYWlsdXJlcyAmICRTVk46OkF1dGg6OlNTTDo6RVhQSVJFRCkgeworCQlwcmludCBTVERFUlIgIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC5cbiI7CisJfQorCWlmICgkZmFpbHVyZXMgJiAkU1ZOOjpBdXRoOjpTU0w6Ok9USEVSKSB7CisJCXByaW50IFNUREVSUiAiIC0gVGhlIGNlcnRpZmljYXRlIGhhcyBhbiB1bmtub3duIGVycm9yLlxuIjsKKwl9CisJcHJpbnRmIFNUREVSUgorCSAgICAgICAgIkNlcnRpZmljYXRlIGluZm9ybWF0aW9uOlxuIi4KKwkgICAgICAgICIgLSBIb3N0bmFtZTogJXNcbiIuCisJICAgICAgICAiIC0gVmFsaWQ6IGZyb20gJXMgdW50aWwgJXNcbiIuCisJICAgICAgICAiIC0gSXNzdWVyOiAlc1xuIi4KKwkgICAgICAgICIgLSBGaW5nZXJwcmludDogJXNcbiIsCisJICAgICAgICBtYXAgJGNlcnRfaW5mby0+JF8sIHF3KGhvc3RuYW1lIHZhbGlkX2Zyb20gdmFsaWRfdW50aWwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVyX2RuYW1lIGZpbmdlcnByaW50KTsKKwlteSAkY2hvaWNlOworcHJvbXB0OgorCXByaW50IFNUREVSUiAkbWF5X3NhdmUgPworCSAgICAgICIoUillamVjdCwgYWNjZXB0ICh0KWVtcG9yYXJpbHkgb3IgYWNjZXB0IChwKWVybWFuZW50bHk/ICIgOgorCSAgICAgICIoUillamVjdCBvciBhY2NlcHQgKHQpZW1wb3JhcmlseT8gIjsKKwlTVERFUlItPmZsdXNoOworCSRjaG9pY2UgPSBsYyhzdWJzdHIoPFNURElOPiB8fCAnUicsIDAsIDEpKTsKKwlpZiAoJGNob2ljZSA9fiAvXnQkL2kpIHsKKwkJJGNyZWQtPm1heV9zYXZlKHVuZGVmKTsKKwl9IGVsc2lmICgkY2hvaWNlID1+IC9eciQvaSkgeworCQlyZXR1cm4gLTE7CisJfSBlbHNpZiAoJG1heV9zYXZlICYmICRjaG9pY2UgPX4gL15wJC9pKSB7CisJCSRjcmVkLT5tYXlfc2F2ZSgkbWF5X3NhdmUpOworCX0gZWxzZSB7CisJCWdvdG8gcHJvbXB0OworCX0KKwkkY3JlZC0+YWNjZXB0ZWRfZmFpbHVyZXMoJGZhaWx1cmVzKTsKKwkkU1ZOOjpfQ29yZTo6U1ZOX05PX0VSUk9SOworfQorCitzdWIgc3NsX2NsaWVudF9jZXJ0IHsKKwlteSAoJGNyZWQsICRyZWFsbSwgJG1heV9zYXZlLCAkcG9vbCkgPSBAXzsKKwkkbWF5X3NhdmUgPSB1bmRlZiBpZiAkX25vX2F1dGhfY2FjaGU7CisJcHJpbnQgU1RERVJSICJDbGllbnQgY2VydGlmaWNhdGUgZmlsZW5hbWU6ICI7CisJU1RERVJSLT5mbHVzaDsKKwljaG9tcChteSAkZmlsZW5hbWUgPSA8U1RESU4+KTsKKwkkY3JlZC0+Y2VydF9maWxlKCRmaWxlbmFtZSk7CisJJGNyZWQtPm1heV9zYXZlKCRtYXlfc2F2ZSk7CisJJFNWTjo6X0NvcmU6OlNWTl9OT19FUlJPUjsKK30KKworc3ViIHNzbF9jbGllbnRfY2VydF9wdyB7CisJbXkgKCRjcmVkLCAkcmVhbG0sICRtYXlfc2F2ZSwgJHBvb2wpID0gQF87CisJJG1heV9zYXZlID0gdW5kZWYgaWYgJF9ub19hdXRoX2NhY2hlOworCSRjcmVkLT5wYXNzd29yZChfcmVhZF9wYXNzd29yZCgiUGFzc3dvcmQ6ICIsICRyZWFsbSkpOworCSRjcmVkLT5tYXlfc2F2ZSgkbWF5X3NhdmUpOworCSRTVk46Ol9Db3JlOjpTVk5fTk9fRVJST1I7Cit9CisKK3N1YiB1c2VybmFtZSB7CisJbXkgKCRjcmVkLCAkcmVhbG0sICRtYXlfc2F2ZSwgJHBvb2wpID0gQF87CisJJG1heV9zYXZlID0gdW5kZWYgaWYgJF9ub19hdXRoX2NhY2hlOworCWlmIChkZWZpbmVkICRyZWFsbSAmJiBsZW5ndGggJHJlYWxtKSB7CisJCXByaW50IFNUREVSUiAiQXV0aGVudGljYXRpb24gcmVhbG06ICRyZWFsbVxuIjsKKwl9CisJbXkgJHVzZXJuYW1lOworCWlmIChkZWZpbmVkICRfdXNlcm5hbWUpIHsKKwkJJHVzZXJuYW1lID0gJF91c2VybmFtZTsKKwl9IGVsc2UgeworCQlwcmludCBTVERFUlIgIlVzZXJuYW1lOiAiOworCQlTVERFUlItPmZsdXNoOworCQljaG9tcCgkdXNlcm5hbWUgPSA8U1RESU4+KTsKKwl9CisJJGNyZWQtPnVzZXJuYW1lKCR1c2VybmFtZSk7CisJJGNyZWQtPm1heV9zYXZlKCRtYXlfc2F2ZSk7CisJJFNWTjo6X0NvcmU6OlNWTl9OT19FUlJPUjsKK30KKworc3ViIF9yZWFkX3Bhc3N3b3JkIHsKKwlteSAoJHByb21wdCwgJHJlYWxtKSA9IEBfOworCXByaW50IFNUREVSUiAkcHJvbXB0OworCVNUREVSUi0+Zmx1c2g7CisJcmVxdWlyZSBUZXJtOjpSZWFkS2V5OworCVRlcm06OlJlYWRLZXk6OlJlYWRNb2RlKCdub2VjaG8nKTsKKwlteSAkcGFzc3dvcmQgPSAnJzsKKwl3aGlsZSAoZGVmaW5lZChteSAka2V5ID0gVGVybTo6UmVhZEtleTo6UmVhZEtleSgwKSkpIHsKKwkJbGFzdCBpZiAka2V5ID1+IC9bXDAxMlwwMTVdLzsgIyBcblxyCisJCSRwYXNzd29yZCAuPSAka2V5OworCX0KKwlUZXJtOjpSZWFkS2V5OjpSZWFkTW9kZSgncmVzdG9yZScpOworCXByaW50IFNUREVSUiAiXG4iOworCVNUREVSUi0+Zmx1c2g7CisJJHBhc3N3b3JkOworfQorCitwYWNrYWdlIG1haW47CisKK3sKKwlteSAka2lsbF9zdHVwaWRfd2FybmluZ3MgPSAkU1ZOOjpOb2RlOjpub25lLiRTVk46Ok5vZGU6OmZpbGUuCisJCQkJJFNWTjo6Tm9kZTo6ZGlyLiRTVk46Ok5vZGU6OnVua25vd24uCisJCQkJJFNWTjo6Tm9kZTo6bm9uZS4kU1ZOOjpOb2RlOjpmaWxlLgorCQkJCSRTVk46Ok5vZGU6OmRpci4kU1ZOOjpOb2RlOjp1bmtub3duLgorCQkJCSRTVk46OkF1dGg6OlNTTDo6Q05NSVNNQVRDSC4KKwkJCQkkU1ZOOjpBdXRoOjpTU0w6Ok5PVFlFVFZBTElELgorCQkJCSRTVk46OkF1dGg6OlNTTDo6RVhQSVJFRC4KKwkJCQkkU1ZOOjpBdXRoOjpTU0w6OlVOS05PV05DQS4KKwkJCQkkU1ZOOjpBdXRoOjpTU0w6Ok9USEVSOworfQorCitwYWNrYWdlIFNWTjo6R2l0OjpGZXRjaGVyOwordXNlIHZhcnMgcXcvQElTQS87Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENhcnAgcXcvY3JvYWsvOwordXNlIElPOjpGaWxlIHF3Ly87Cit1c2UgRGlnZXN0OjpNRDU7CisKKyMgZmlsZSBiYXRvbiBtZW1iZXJzOiBwYXRoLCBtb2RlX2EsIG1vZGVfYiwgcG9vbCwgZmgsIGJsb2IsIGJhc2UKK3N1YiBuZXcgeworCW15ICgkY2xhc3MsICRnaXRfc3ZuKSA9IEBfOworCW15ICRzZWxmID0gU1ZOOjpEZWx0YTo6RWRpdG9yLT5uZXc7CisJYmxlc3MgJHNlbGYsICRjbGFzczsKKwkkc2VsZi0+e2N9ID0gJGdpdF9zdm4tPntsYXN0X2NvbW1pdH0gaWYgZXhpc3RzICRnaXRfc3ZuLT57bGFzdF9jb21taXR9OworCSRzZWxmLT57ZW1wdHl9ID0ge307CisJJHNlbGYtPntkaXJfcHJvcH0gPSB7fTsKKwkkc2VsZi0+e2ZpbGVfcHJvcH0gPSB7fTsKKwkkc2VsZi0+e2Fic2VudF9kaXJ9ID0ge307CisJJHNlbGYtPnthYnNlbnRfZmlsZX0gPSB7fTsKKwkkc2VsZi0+e2dpaX0gPSAkZ2l0X3N2bi0+dG1wX2luZGV4X2RvKHN1YiB7IEdpdDo6SW5kZXhJbmZvLT5uZXcgfSk7CisJJHNlbGY7Cit9CisKK3N1YiBzZXRfcGF0aF9zdHJpcCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwkkc2VsZi0+e3BhdGhfc3RyaXB9ID0gcXIvXlxRJHBhdGhcRShcL3wkKS8gaWYgbGVuZ3RoICRwYXRoOworfQorCitzdWIgb3Blbl9yb290IHsKKwl7IHBhdGggPT4gJycgfTsKK30KKworc3ViIG9wZW5fZGlyZWN0b3J5IHsKKwlteSAoJHNlbGYsICRwYXRoLCAkcGIsICRyZXYpID0gQF87CisJeyBwYXRoID0+ICRwYXRoIH07Cit9CisKK3N1YiBnaXRfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwlpZiAoJHNlbGYtPntwYXRoX3N0cmlwfSkgeworCQkkcGF0aCA9fiBzISRzZWxmLT57cGF0aF9zdHJpcH0hISBvcgorCQkgIGRpZSAiRmFpbGVkIHRvIHN0cmlwIHBhdGggJyRwYXRoJyAoJHNlbGYtPntwYXRoX3N0cmlwfSlcbiI7CisJfQorCSRwYXRoOworfQorCitzdWIgZGVsZXRlX2VudHJ5IHsKKwlteSAoJHNlbGYsICRwYXRoLCAkcmV2LCAkcGIpID0gQF87CisKKwlteSAkZ3BhdGggPSAkc2VsZi0+Z2l0X3BhdGgoJHBhdGgpOworCXJldHVybiB1bmRlZiBpZiAoJGdwYXRoIGVxICcnKTsKKworCSMgcmVtb3ZlIGVudGlyZSBkaXJlY3Rvcmllcy4KKwlpZiAoY29tbWFuZCgnbHMtdHJlZScsICRzZWxmLT57Y30sICctLScsICRncGF0aCkgPX4gL14wNDAwMDAgdHJlZS8pIHsKKwkJbXkgKCRscywgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKHF3L2xzLXRyZWUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yIC0tbmFtZS1vbmx5IC16LywKKwkJCQkgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2N9LCAnLS0nLCAkZ3BhdGgpOworCQlsb2NhbCAkLyA9ICJcMCI7CisJCXdoaWxlICg8JGxzPikgeworCQkJY2hvbXA7CisJCQkkc2VsZi0+e2dpaX0tPnJlbW92ZSgkXyk7CisJCQlwcmludCAiXHREXHQkX1xuIiB1bmxlc3MgJDo6X3E7CisJCX0KKwkJcHJpbnQgIlx0RFx0JGdwYXRoL1xuIiB1bmxlc3MgJDo6X3E7CisJCWNvbW1hbmRfY2xvc2VfcGlwZSgkbHMsICRjdHgpOworCQkkc2VsZi0+e2VtcHR5fS0+eyRwYXRofSA9IDAKKwl9IGVsc2UgeworCQkkc2VsZi0+e2dpaX0tPnJlbW92ZSgkZ3BhdGgpOworCQlwcmludCAiXHREXHQkZ3BhdGhcbiIgdW5sZXNzICQ6Ol9xOworCX0KKwl1bmRlZjsKK30KKworc3ViIG9wZW5fZmlsZSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHBiLCAkcmV2KSA9IEBfOworCW15ICRncGF0aCA9ICRzZWxmLT5naXRfcGF0aCgkcGF0aCk7CisJbXkgKCRtb2RlLCAkYmxvYikgPSAoY29tbWFuZCgnbHMtdHJlZScsICRzZWxmLT57Y30sICctLScsICRncGF0aCkKKwkgICAgICAgICAgICAgICAgICAgICA9fiAvXihcZHs2fSkgYmxvYiAoW2EtZlxkXXs0MH0pXHQvKTsKKwl1bmxlc3MgKGRlZmluZWQgJG1vZGUgJiYgZGVmaW5lZCAkYmxvYikgeworCQlkaWUgIiRwYXRoIHdhcyBub3QgZm91bmQgaW4gY29tbWl0ICRzZWxmLT57Y30gKHIkcmV2KVxuIjsKKwl9CisJeyBwYXRoID0+ICRwYXRoLCBtb2RlX2EgPT4gJG1vZGUsIG1vZGVfYiA9PiAkbW9kZSwgYmxvYiA9PiAkYmxvYiwKKwkgIHBvb2wgPT4gU1ZOOjpQb29sLT5uZXcsIGFjdGlvbiA9PiAnTScgfTsKK30KKworc3ViIGFkZF9maWxlIHsKKwlteSAoJHNlbGYsICRwYXRoLCAkcGIsICRjcF9wYXRoLCAkY3BfcmV2KSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSAoJHBhdGggPX4gbSNeKC4qPykvPyhbXi9dKykkIyk7CisJZGVsZXRlICRzZWxmLT57ZW1wdHl9LT57JGRpcn07CisJeyBwYXRoID0+ICRwYXRoLCBtb2RlX2EgPT4gMTAwNjQ0LCBtb2RlX2IgPT4gMTAwNjQ0LAorCSAgcG9vbCA9PiBTVk46OlBvb2wtPm5ldywgYWN0aW9uID0+ICdBJyB9OworfQorCitzdWIgYWRkX2RpcmVjdG9yeSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJGNwX3BhdGgsICRjcF9yZXYpID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9ICgkcGF0aCA9fiBtI14oLio/KS8/KFteL10rKSQjKTsKKwlkZWxldGUgJHNlbGYtPntlbXB0eX0tPnskZGlyfTsKKwkkc2VsZi0+e2VtcHR5fS0+eyRwYXRofSA9IDE7CisJeyBwYXRoID0+ICRwYXRoIH07Cit9CisKK3N1YiBjaGFuZ2VfZGlyX3Byb3AgeworCW15ICgkc2VsZiwgJGRiLCAkcHJvcCwgJHZhbHVlKSA9IEBfOworCSRzZWxmLT57ZGlyX3Byb3B9LT57JGRiLT57cGF0aH19IHx8PSB7fTsKKwkkc2VsZi0+e2Rpcl9wcm9wfS0+eyRkYi0+e3BhdGh9fS0+eyRwcm9wfSA9ICR2YWx1ZTsKKwl1bmRlZjsKK30KKworc3ViIGFic2VudF9kaXJlY3RvcnkgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYikgPSBAXzsKKwkkc2VsZi0+e2Fic2VudF9kaXJ9LT57JHBiLT57cGF0aH19IHx8PSBbXTsKKwlwdXNoIEB7JHNlbGYtPnthYnNlbnRfZGlyfS0+eyRwYi0+e3BhdGh9fX0sICRwYXRoOworCXVuZGVmOworfQorCitzdWIgYWJzZW50X2ZpbGUgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYikgPSBAXzsKKwkkc2VsZi0+e2Fic2VudF9maWxlfS0+eyRwYi0+e3BhdGh9fSB8fD0gW107CisJcHVzaCBAeyRzZWxmLT57YWJzZW50X2ZpbGV9LT57JHBiLT57cGF0aH19fSwgJHBhdGg7CisJdW5kZWY7Cit9CisKK3N1YiBjaGFuZ2VfZmlsZV9wcm9wIHsKKwlteSAoJHNlbGYsICRmYiwgJHByb3AsICR2YWx1ZSkgPSBAXzsKKwlpZiAoJHByb3AgZXEgJ3N2bjpleGVjdXRhYmxlJykgeworCQlpZiAoJGZiLT57bW9kZV9ifSAhPSAxMjAwMDApIHsKKwkJCSRmYi0+e21vZGVfYn0gPSBkZWZpbmVkICR2YWx1ZSA/IDEwMDc1NSA6IDEwMDY0NDsKKwkJfQorCX0gZWxzaWYgKCRwcm9wIGVxICdzdm46c3BlY2lhbCcpIHsKKwkJJGZiLT57bW9kZV9ifSA9IGRlZmluZWQgJHZhbHVlID8gMTIwMDAwIDogMTAwNjQ0OworCX0gZWxzZSB7CisJCSRzZWxmLT57ZmlsZV9wcm9wfS0+eyRmYi0+e3BhdGh9fSB8fD0ge307CisJCSRzZWxmLT57ZmlsZV9wcm9wfS0+eyRmYi0+e3BhdGh9fS0+eyRwcm9wfSA9ICR2YWx1ZTsKKwl9CisJdW5kZWY7Cit9CisKK3N1YiBhcHBseV90ZXh0ZGVsdGEgeworCW15ICgkc2VsZiwgJGZiLCAkZXhwKSA9IEBfOworCW15ICRmaCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZTsKKwkkZmgtPmF1dG9mbHVzaCgxKTsKKwkjICRmaCBnZXRzIGF1dG8tY2xvc2VkKCkgYnkgU1ZOOjpUeERlbHRhOjphcHBseSgpLAorCSMgKGJ1dCAkYmFzZSBkb2VzIG5vdCwpIHNvIGR1cCgpIGl0IGZvciByZWFkaW5nIGluIGNsb3NlX2ZpbGUKKwlvcGVuIG15ICRkdXAsICc8JicsICRmaCBvciBjcm9hayAkITsKKwlteSAkYmFzZSA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZTsKKwkkYmFzZS0+YXV0b2ZsdXNoKDEpOworCWlmICgkZmItPntibG9ifSkgeworCQlkZWZpbmVkIChteSAkcGlkID0gZm9yaykgb3IgY3JvYWsgJCE7CisJCWlmICghJHBpZCkgeworCQkJb3BlbiBTVERPVVQsICc+JicsICRiYXNlIG9yIGNyb2FrICQhOworCQkJcHJpbnQgU1RET1VUICdsaW5rICcgaWYgKCRmYi0+e21vZGVfYX0gPT0gMTIwMDAwKTsKKwkJCWV4ZWMgcXcvZ2l0LWNhdC1maWxlIGJsb2IvLCAkZmItPntibG9ifSBvciBjcm9hayAkITsKKwkJfQorCQl3YWl0cGlkICRwaWQsIDA7CisJCWNyb2FrICQ/IGlmICQ/OworCisJCWlmIChkZWZpbmVkICRleHApIHsKKwkJCXNlZWsgJGJhc2UsIDAsIDAgb3IgY3JvYWsgJCE7CisJCQlteSAkbWQ1ID0gRGlnZXN0OjpNRDUtPm5ldzsKKwkJCSRtZDUtPmFkZGZpbGUoJGJhc2UpOworCQkJbXkgJGdvdCA9ICRtZDUtPmhleGRpZ2VzdDsKKwkJCWRpZSAiQ2hlY2tzdW0gbWlzbWF0Y2g6ICRmYi0+e3BhdGh9ICRmYi0+e2Jsb2J9XG4iLAorCQkJICAgICJleHBlY3RlZDogJGV4cFxuIiwKKwkJCSAgICAiICAgICBnb3Q6ICRnb3RcbiIgaWYgKCRnb3QgbmUgJGV4cCk7CisJCX0KKwl9CisJc2VlayAkYmFzZSwgMCwgMCBvciBjcm9hayAkITsKKwkkZmItPntmaH0gPSAkZHVwOworCSRmYi0+e2Jhc2V9ID0gJGJhc2U7CisJWyBTVk46OlR4RGVsdGE6OmFwcGx5KCRiYXNlLCAkZmgsIHVuZGVmLCAkZmItPntwYXRofSwgJGZiLT57cG9vbH0pIF07Cit9CisKK3N1YiBjbG9zZV9maWxlIHsKKwlteSAoJHNlbGYsICRmYiwgJGV4cCkgPSBAXzsKKwlteSAkaGFzaDsKKwlteSAkcGF0aCA9ICRzZWxmLT5naXRfcGF0aCgkZmItPntwYXRofSk7CisJaWYgKG15ICRmaCA9ICRmYi0+e2ZofSkgeworCQlpZiAoZGVmaW5lZCAkZXhwKSB7CisJCQlzZWVrKCRmaCwgMCwgMCkgb3IgY3JvYWsgJCE7CisJCQlteSAkbWQ1ID0gRGlnZXN0OjpNRDUtPm5ldzsKKwkJCSRtZDUtPmFkZGZpbGUoJGZoKTsKKwkJCW15ICRnb3QgPSAkbWQ1LT5oZXhkaWdlc3Q7CisJCQlpZiAoJGdvdCBuZSAkZXhwKSB7CisJCQkJZGllICJDaGVja3N1bSBtaXNtYXRjaDogJHBhdGhcbiIsCisJCQkJICAgICJleHBlY3RlZDogJGV4cFxuICAgIGdvdDogJGdvdFxuIjsKKwkJCX0KKwkJfQorCQlzeXNzZWVrKCRmaCwgMCwgMCkgb3IgY3JvYWsgJCE7CisJCWlmICgkZmItPnttb2RlX2J9ID09IDEyMDAwMCkgeworCQkJc3lzcmVhZCgkZmgsIG15ICRidWYsIDUpID09IDUgb3IgY3JvYWsgJCE7CisJCQkkYnVmIGVxICdsaW5rICcgb3IgZGllICIkcGF0aCBoYXMgbW9kZSAxMjAwMDAiLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhIGxpbmtcbiI7CisJCX0KKwkJZGVmaW5lZChteSAkcGlkID0gb3BlbiBteSAkb3V0LCctfCcpIG9yIGRpZSAiQ2FuJ3QgZm9yazogJCFcbiI7CisJCWlmICghJHBpZCkgeworCQkJb3BlbiBTVERJTiwgJzwmJywgJGZoIG9yIGNyb2FrICQhOworCQkJZXhlYyBxdy9naXQtaGFzaC1vYmplY3QgLXcgLS1zdGRpbi8gb3IgY3JvYWsgJCE7CisJCX0KKwkJY2hvbXAoJGhhc2ggPSBkbyB7IGxvY2FsICQvOyA8JG91dD4gfSk7CisJCWNsb3NlICRvdXQgb3IgY3JvYWsgJCE7CisJCWNsb3NlICRmaCBvciBjcm9hayAkITsKKwkJJGhhc2ggPX4gL15bYS1mXGRdezQwfSQvIG9yIGRpZSAibm90IGEgc2hhMTogJGhhc2hcbiI7CisJCWNsb3NlICRmYi0+e2Jhc2V9IG9yIGNyb2FrICQhOworCX0gZWxzZSB7CisJCSRoYXNoID0gJGZiLT57YmxvYn0gb3IgZGllICJubyBibG9iIGluZm9ybWF0aW9uXG4iOworCX0KKwkkZmItPntwb29sfS0+Y2xlYXI7CisJJHNlbGYtPntnaWl9LT51cGRhdGUoJGZiLT57bW9kZV9ifSwgJGhhc2gsICRwYXRoKSBvciBjcm9hayAkITsKKwlwcmludCAiXHQkZmItPnthY3Rpb259XHQkcGF0aFxuIiBpZiAkZmItPnthY3Rpb259ICYmICEgJDo6X3E7CisJdW5kZWY7Cit9CisKK3N1YiBhYm9ydF9lZGl0IHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT57bnJ9ID0gJHNlbGYtPntnaWl9LT57bnJ9OworCWRlbGV0ZSAkc2VsZi0+e2dpaX07CisJJHNlbGYtPlNVUEVSOjphYm9ydF9lZGl0KEBfKTsKK30KKworc3ViIGNsb3NlX2VkaXQgeworCW15ICRzZWxmID0gc2hpZnQ7CisJJHNlbGYtPntnaXRfY29tbWl0X29rfSA9IDE7CisJJHNlbGYtPntucn0gPSAkc2VsZi0+e2dpaX0tPntucn07CisJZGVsZXRlICRzZWxmLT57Z2lpfTsKKwkkc2VsZi0+U1VQRVI6OmNsb3NlX2VkaXQoQF8pOworfQorCitwYWNrYWdlIFNWTjo6R2l0OjpFZGl0b3I7Cit1c2UgdmFycyBxdy9ASVNBICRfcm1kaXIgJF9jcF9zaW1pbGFyaXR5ICRfZmluZF9jb3BpZXNfaGFyZGVyICRfcmVuYW1lX2xpbWl0LzsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgQ2FycCBxdy9jcm9hay87Cit1c2UgSU86OkZpbGU7Cit1c2UgRGlnZXN0OjpNRDU7CisKK3N1YiBuZXcgeworCW15ICgkY2xhc3MsICRvcHRzKSA9IEBfOworCWZvcmVhY2ggKHF3L3N2bl9wYXRoIHIgcmEgdHJlZV9hIHRyZWVfYiBsb2cgZWRpdG9yX2NiLykgeworCQlkaWUgIiRfIHJlcXVpcmVkIVxuIiB1bmxlc3MgKGRlZmluZWQgJG9wdHMtPnskX30pOworCX0KKworCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJbXkgJG1vZHMgPSBnZW5lcmF0ZV9kaWZmKCRvcHRzLT57dHJlZV9hfSwgJG9wdHMtPnt0cmVlX2J9KTsKKwlteSAkdHlwZXMgPSBjaGVja19kaWZmX3BhdGhzKCRvcHRzLT57cmF9LCAkb3B0cy0+e3N2bl9wYXRofSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcHRzLT57cn0sICRtb2RzKTsKKworCSMgJG9wdHMtPntyYX0gZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgdXNlZCBhZnRlciB0aGlzOgorCW15IEBjZSAgPSAkb3B0cy0+e3JhfS0+Z2V0X2NvbW1pdF9lZGl0b3IoJG9wdHMtPntsb2d9LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3B0cy0+e2VkaXRvcl9jYn0sICRwb29sKTsKKwlteSAkc2VsZiA9IFNWTjo6RGVsdGE6OkVkaXRvci0+bmV3KEBjZSwgJHBvb2wpOworCWJsZXNzICRzZWxmLCAkY2xhc3M7CisJZm9yZWFjaCAocXcvc3ZuX3BhdGggciB0cmVlX2EgdHJlZV9iLykgeworCQkkc2VsZi0+eyRffSA9ICRvcHRzLT57JF99OworCX0KKwkkc2VsZi0+e3VybH0gPSAkb3B0cy0+e3JhfS0+e3VybH07CisJJHNlbGYtPnttb2RzfSA9ICRtb2RzOworCSRzZWxmLT57dHlwZXN9ID0gJHR5cGVzOworCSRzZWxmLT57cG9vbH0gPSAkcG9vbDsKKwkkc2VsZi0+e2JhdH0gPSB7ICcnID0+ICRzZWxmLT5vcGVuX3Jvb3QoJHNlbGYtPntyfSwgJHNlbGYtPntwb29sfSkgfTsKKwkkc2VsZi0+e3JtfSA9IHsgfTsKKwkkc2VsZi0+e3BhdGhfcHJlZml4fSA9IGxlbmd0aCAkc2VsZi0+e3N2bl9wYXRofSA/CisJICAgICAgICAgICAgICAgICAgICAgICAiJHNlbGYtPntzdm5fcGF0aH0vIiA6ICcnOworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGdlbmVyYXRlX2RpZmYgeworCW15ICgkdHJlZV9hLCAkdHJlZV9iKSA9IEBfOworCW15IEBkaWZmX3RyZWUgPSBxdyhkaWZmLXRyZWUgLXogLXIpOworCWlmICgkX2NwX3NpbWlsYXJpdHkpIHsKKwkJcHVzaCBAZGlmZl90cmVlLCAiLUMkX2NwX3NpbWlsYXJpdHkiOworCX0gZWxzZSB7CisJCXB1c2ggQGRpZmZfdHJlZSwgJy1DJzsKKwl9CisJcHVzaCBAZGlmZl90cmVlLCAnLS1maW5kLWNvcGllcy1oYXJkZXInIGlmICRfZmluZF9jb3BpZXNfaGFyZGVyOworCXB1c2ggQGRpZmZfdHJlZSwgIi1sJF9yZW5hbWVfbGltaXQiIGlmIGRlZmluZWQgJF9yZW5hbWVfbGltaXQ7CisJcHVzaCBAZGlmZl90cmVlLCAkdHJlZV9hLCAkdHJlZV9iOworCW15ICgkZGlmZl9maCwgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKEBkaWZmX3RyZWUpOworCWxvY2FsICQvID0gIlwwIjsKKwlteSAkc3RhdGUgPSAnbWV0YSc7CisJbXkgQG1vZHM7CisJd2hpbGUgKDwkZGlmZl9maD4pIHsKKwkJY2hvbXAgJF87ICMgdGhpcyBnZXRzIHJpZCBvZiB0aGUgdHJhaWxpbmcgIlwwIgorCQlpZiAoJHN0YXRlIGVxICdtZXRhJyAmJiAvXjooXGR7Nn0pXHMoXGR7Nn0pXHMKKwkJCQkJJDo6c2hhMVxzKCQ6OnNoYTEpXHMKKwkJCQkJKFtNVENSQURdKVxkKiQveG8pIHsKKwkJCXB1c2ggQG1vZHMsIHsJbW9kZV9hID0+ICQxLCBtb2RlX2IgPT4gJDIsCisJCQkJCXNoYTFfYiA9PiAkMywgY2hnID0+ICQ0IH07CisJCQlpZiAoJDQgPX4gL14oPzpDfFIpJC8pIHsKKwkJCQkkc3RhdGUgPSAnZmlsZV9hJzsKKwkJCX0gZWxzZSB7CisJCQkJJHN0YXRlID0gJ2ZpbGVfYic7CisJCQl9CisJCX0gZWxzaWYgKCRzdGF0ZSBlcSAnZmlsZV9hJykgeworCQkJbXkgJHggPSAkbW9kc1skI21vZHNdIG9yIGNyb2FrICJFbXB0eSBhcnJheVxuIjsKKwkJCWlmICgkeC0+e2NoZ30gIX4gL14oPzpDfFIpJC8pIHsKKwkJCQljcm9hayAiRXJyb3IgcGFyc2luZyAkXywgJHgtPntjaGd9XG4iOworCQkJfQorCQkJJHgtPntmaWxlX2F9ID0gJF87CisJCQkkc3RhdGUgPSAnZmlsZV9iJzsKKwkJfSBlbHNpZiAoJHN0YXRlIGVxICdmaWxlX2InKSB7CisJCQlteSAkeCA9ICRtb2RzWyQjbW9kc10gb3IgY3JvYWsgIkVtcHR5IGFycmF5XG4iOworCQkJaWYgKGV4aXN0cyAkeC0+e2ZpbGVfYX0gJiYgJHgtPntjaGd9ICF+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCWlmICghZXhpc3RzICR4LT57ZmlsZV9hfSAmJiAkeC0+e2NoZ30gPX4gL14oPzpDfFIpJC8pIHsKKwkJCQljcm9hayAiRXJyb3IgcGFyc2luZyAkXywgJHgtPntjaGd9XG4iOworCQkJfQorCQkJJHgtPntmaWxlX2J9ID0gJF87CisJCQkkc3RhdGUgPSAnbWV0YSc7CisJCX0gZWxzZSB7CisJCQljcm9hayAiRXJyb3IgcGFyc2luZyAkX1xuIjsKKwkJfQorCX0KKwljb21tYW5kX2Nsb3NlX3BpcGUoJGRpZmZfZmgsICRjdHgpOworCVxAbW9kczsKK30KKworc3ViIGNoZWNrX2RpZmZfcGF0aHMgeworCW15ICgkcmEsICRwZngsICRyZXYsICRtb2RzKSA9IEBfOworCW15ICV0eXBlczsKKwkkcGZ4IC49ICcvJyBpZiBsZW5ndGggJHBmeDsKKworCXN1YiB0eXBlX2RpZmZfcGF0aHMgeworCQlteSAoJHJhLCAkdHlwZXMsICRwYXRoLCAkcmV2KSA9IEBfOworCQlteSBAcCA9IHNwbGl0IG0jLysjLCAkcGF0aDsKKwkJbXkgJGMgPSBzaGlmdCBAcDsKKwkJdW5sZXNzIChkZWZpbmVkICR0eXBlcy0+eyRjfSkgeworCQkJJHR5cGVzLT57JGN9ID0gJHJhLT5jaGVja19wYXRoKCRjLCAkcmV2KTsKKwkJfQorCQl3aGlsZSAoQHApIHsKKwkJCSRjIC49ICcvJyAuIHNoaWZ0IEBwOworCQkJbmV4dCBpZiBkZWZpbmVkICR0eXBlcy0+eyRjfTsKKwkJCSR0eXBlcy0+eyRjfSA9ICRyYS0+Y2hlY2tfcGF0aCgkYywgJHJldik7CisJCX0KKwl9CisKKwlmb3JlYWNoIG15ICRtIChAJG1vZHMpIHsKKwkJZm9yZWFjaCBteSAkZiAocXcvZmlsZV9hIGZpbGVfYi8pIHsKKwkJCW5leHQgdW5sZXNzIGRlZmluZWQgJG0tPnskZn07CisJCQlteSAoJGRpcikgPSAoJG0tPnskZn0gPX4gbSNeKC4qPykvPyg/OlteL10rKSQjKTsKKwkJCWlmIChsZW5ndGggJHBmeC4kZGlyICYmICEgZGVmaW5lZCAkdHlwZXN7JGRpcn0pIHsKKwkJCQl0eXBlX2RpZmZfcGF0aHMoJHJhLCBcJXR5cGVzLCAkcGZ4LiRkaXIsICRyZXYpOworCQkJfQorCQl9CisJfQorCVwldHlwZXM7Cit9CisKK3N1YiBzcGxpdF9wYXRoIHsKKwlyZXR1cm4gKCRfWzBdID1+IG0jXiguKj8pLz8oW14vXSspJCMpOworfQorCitzdWIgcmVwb19wYXRoIHsKKwlteSAoJHNlbGYsICRwYXRoKSA9IEBfOworCSRzZWxmLT57cGF0aF9wcmVmaXh9LihkZWZpbmVkICRwYXRoID8gJHBhdGggOiAnJyk7Cit9CisKK3N1YiB1cmxfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwkkc2VsZi0+e3VybH0gLiAnLycgLiAkc2VsZi0+cmVwb19wYXRoKCRwYXRoKTsKK30KKworc3ViIHJtZGlycyB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICRybSA9ICRzZWxmLT57cm19OworCWRlbGV0ZSAkcm0tPnsnJ307ICMgd2UgbmV2ZXIgZGVsZXRlIHRoZSB1cmwgd2UncmUgdHJhY2tpbmcKKwlyZXR1cm4gdW5sZXNzICUkcm07CisKKwlmb3JlYWNoIChrZXlzICUkcm0pIHsKKwkJbXkgQGQgPSBzcGxpdCBtIy8jLCAkXzsKKwkJbXkgJGMgPSBzaGlmdCBAZDsKKwkJJHJtLT57JGN9ID0gMTsKKwkJd2hpbGUgKEBkKSB7CisJCQkkYyAuPSAnLycgLiBzaGlmdCBAZDsKKwkJCSRybS0+eyRjfSA9IDE7CisJCX0KKwl9CisJZGVsZXRlICRybS0+eyRzZWxmLT57c3ZuX3BhdGh9fTsKKwlkZWxldGUgJHJtLT57Jyd9OyAjIHdlIG5ldmVyIGRlbGV0ZSB0aGUgdXJsIHdlJ3JlIHRyYWNraW5nCisJcmV0dXJuIHVubGVzcyAlJHJtOworCisJbXkgKCRmaCwgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKHF3L2xzLXRyZWUgLS1uYW1lLW9ubHkgLXIgLXovLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3RyZWVfYn0pOworCWxvY2FsICQvID0gIlwwIjsKKwl3aGlsZSAoPCRmaD4pIHsKKwkJY2hvbXA7CisJCW15IEBkbiA9IHNwbGl0IG0jLyMsICRfOworCQl3aGlsZSAocG9wIEBkbikgeworCQkJZGVsZXRlICRybS0+e2pvaW4gJy8nLCBAZG59OworCQl9CisJCXVubGVzcyAoJSRybSkgeworCQkJY2xvc2UgJGZoOworCQkJcmV0dXJuOworCQl9CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCisJbXkgKCRyLCAkcCwgJGJhdCkgPSAoJHNlbGYtPntyfSwgJHNlbGYtPntwb29sfSwgJHNlbGYtPntiYXR9KTsKKwlmb3JlYWNoIG15ICRkIChzb3J0IHsgJGIgPX4gdHIjLyMvIyA8PT4gJGEgPX4gdHIjLyMvIyB9IGtleXMgJSRybSkgeworCQkkc2VsZi0+Y2xvc2VfZGlyZWN0b3J5KCRiYXQtPnskZH0sICRwKTsKKwkJbXkgKCRkbikgPSAoJGQgPX4gbSNeKC4qPykvPyg/OlteL10rKSQjKTsKKwkJcHJpbnQgIlx0RCtcdCRkL1xuIiB1bmxlc3MgJDo6X3E7CisJCSRzZWxmLT5TVVBFUjo6ZGVsZXRlX2VudHJ5KCRkLCAkciwgJGJhdC0+eyRkbn0sICRwKTsKKwkJZGVsZXRlICRiYXQtPnskZH07CisJfQorfQorCitzdWIgb3Blbl9vcl9hZGRfZGlyIHsKKwlteSAoJHNlbGYsICRmdWxsX3BhdGgsICRiYXRvbikgPSBAXzsKKwlteSAkdCA9ICRzZWxmLT57dHlwZXN9LT57JGZ1bGxfcGF0aH07CisJaWYgKCFkZWZpbmVkICR0KSB7CisJCWRpZSAiJGZ1bGxfcGF0aCBub3Qga25vd24gaW4gciRzZWxmLT57cn0gb3Igd2UgaGF2ZSBhIGJ1ZyFcbiI7CisJfQorCWlmICgkdCA9PSAkU1ZOOjpOb2RlOjpub25lKSB7CisJCXJldHVybiAkc2VsZi0+YWRkX2RpcmVjdG9yeSgkZnVsbF9wYXRoLCAkYmF0b24sCisJCQkJCQl1bmRlZiwgLTEsICRzZWxmLT57cG9vbH0pOworCX0gZWxzaWYgKCR0ID09ICRTVk46Ok5vZGU6OmRpcikgeworCQlyZXR1cm4gJHNlbGYtPm9wZW5fZGlyZWN0b3J5KCRmdWxsX3BhdGgsICRiYXRvbiwKKwkJCQkJCSRzZWxmLT57cn0sICRzZWxmLT57cG9vbH0pOworCX0KKwlwcmludCBTVERFUlIgIiRmdWxsX3BhdGggYWxyZWFkeSBleGlzdHMgaW4gcmVwb3NpdG9yeSBhdCAiLAorCQkiciRzZWxmLT57cn0gYW5kIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSAoIiwKKwkJKCR0ID09ICRTVk46Ok5vZGU6OmZpbGUgPyAnZmlsZScgOiAndW5rbm93bicpLCIvJHQpXG4iOworCWV4aXQgMTsKK30KKworc3ViIGVuc3VyZV9wYXRoIHsKKwlteSAoJHNlbGYsICRwYXRoKSA9IEBfOworCW15ICRiYXQgPSAkc2VsZi0+e2JhdH07CisJbXkgJHJlcG9fcGF0aCA9ICRzZWxmLT5yZXBvX3BhdGgoJHBhdGgpOworCXJldHVybiAkYmF0LT57Jyd9IHVubGVzcyAobGVuZ3RoICRyZXBvX3BhdGgpOworCW15IEBwID0gc3BsaXQgbSMvKyMsICRyZXBvX3BhdGg7CisJbXkgJGMgPSBzaGlmdCBAcDsKKwkkYmF0LT57JGN9IHx8PSAkc2VsZi0+b3Blbl9vcl9hZGRfZGlyKCRjLCAkYmF0LT57Jyd9KTsKKwl3aGlsZSAoQHApIHsKKwkJbXkgJGMwID0gJGM7CisJCSRjIC49ICcvJyAuIHNoaWZ0IEBwOworCQkkYmF0LT57JGN9IHx8PSAkc2VsZi0+b3Blbl9vcl9hZGRfZGlyKCRjLCAkYmF0LT57JGMwfSk7CisJfQorCXJldHVybiAkYmF0LT57JGN9OworfQorCitzdWIgQSB7CisJbXkgKCRzZWxmLCAkbSkgPSBAXzsKKwlteSAoJGRpciwgJGZpbGUpID0gc3BsaXRfcGF0aCgkbS0+e2ZpbGVfYn0pOworCW15ICRwYmF0ID0gJHNlbGYtPmVuc3VyZV9wYXRoKCRkaXIpOworCW15ICRmYmF0ID0gJHNlbGYtPmFkZF9maWxlKCRzZWxmLT5yZXBvX3BhdGgoJG0tPntmaWxlX2J9KSwgJHBiYXQsCisJCQkJCXVuZGVmLCAtMSk7CisJcHJpbnQgIlx0QVx0JG0tPntmaWxlX2J9XG4iIHVubGVzcyAkOjpfcTsKKwkkc2VsZi0+Y2hnX2ZpbGUoJGZiYXQsICRtKTsKKwkkc2VsZi0+Y2xvc2VfZmlsZSgkZmJhdCx1bmRlZiwkc2VsZi0+e3Bvb2x9KTsKK30KKworc3ViIEMgeworCW15ICgkc2VsZiwgJG0pID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlteSAkZmJhdCA9ICRzZWxmLT5hZGRfZmlsZSgkc2VsZi0+cmVwb19wYXRoKCRtLT57ZmlsZV9ifSksICRwYmF0LAorCQkJCSRzZWxmLT51cmxfcGF0aCgkbS0+e2ZpbGVfYX0pLCAkc2VsZi0+e3J9KTsKKwlwcmludCAiXHRDXHQkbS0+e2ZpbGVfYX0gPT4gJG0tPntmaWxlX2J9XG4iIHVubGVzcyAkOjpfcTsKKwkkc2VsZi0+Y2hnX2ZpbGUoJGZiYXQsICRtKTsKKwkkc2VsZi0+Y2xvc2VfZmlsZSgkZmJhdCx1bmRlZiwkc2VsZi0+e3Bvb2x9KTsKK30KKworc3ViIGRlbGV0ZV9lbnRyeSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHBiYXQpID0gQF87CisJbXkgJHJwYXRoID0gJHNlbGYtPnJlcG9fcGF0aCgkcGF0aCk7CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJHJwYXRoKTsKKwkkc2VsZi0+e3JtfS0+eyRkaXJ9ID0gMTsKKwkkc2VsZi0+U1VQRVI6OmRlbGV0ZV9lbnRyeSgkcnBhdGgsICRzZWxmLT57cn0sICRwYmF0LCAkc2VsZi0+e3Bvb2x9KTsKK30KKworc3ViIFIgeworCW15ICgkc2VsZiwgJG0pID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlteSAkZmJhdCA9ICRzZWxmLT5hZGRfZmlsZSgkc2VsZi0+cmVwb19wYXRoKCRtLT57ZmlsZV9ifSksICRwYmF0LAorCQkJCSRzZWxmLT51cmxfcGF0aCgkbS0+e2ZpbGVfYX0pLCAkc2VsZi0+e3J9KTsKKwlwcmludCAiXHRSXHQkbS0+e2ZpbGVfYX0gPT4gJG0tPntmaWxlX2J9XG4iIHVubGVzcyAkOjpfcTsKKwkkc2VsZi0+Y2hnX2ZpbGUoJGZiYXQsICRtKTsKKwkkc2VsZi0+Y2xvc2VfZmlsZSgkZmJhdCx1bmRlZiwkc2VsZi0+e3Bvb2x9KTsKKworCSgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9hfSk7CisJJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJJHNlbGYtPmRlbGV0ZV9lbnRyeSgkbS0+e2ZpbGVfYX0sICRwYmF0KTsKK30KKworc3ViIE0geworCW15ICgkc2VsZiwgJG0pID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlteSAkZmJhdCA9ICRzZWxmLT5vcGVuX2ZpbGUoJHNlbGYtPnJlcG9fcGF0aCgkbS0+e2ZpbGVfYn0pLAorCQkJCSRwYmF0LCRzZWxmLT57cn0sJHNlbGYtPntwb29sfSk7CisJcHJpbnQgIlx0JG0tPntjaGd9XHQkbS0+e2ZpbGVfYn1cbiIgdW5sZXNzICQ6Ol9xOworCSRzZWxmLT5jaGdfZmlsZSgkZmJhdCwgJG0pOworCSRzZWxmLT5jbG9zZV9maWxlKCRmYmF0LHVuZGVmLCRzZWxmLT57cG9vbH0pOworfQorCitzdWIgVCB7IHNoaWZ0LT5NKEBfKSB9CisKK3N1YiBjaGFuZ2VfZmlsZV9wcm9wIHsKKwlteSAoJHNlbGYsICRmYmF0LCAkcG5hbWUsICRwdmFsKSA9IEBfOworCSRzZWxmLT5TVVBFUjo6Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwgJHBuYW1lLCAkcHZhbCwgJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBjaGdfZmlsZSB7CisJbXkgKCRzZWxmLCAkZmJhdCwgJG0pID0gQF87CisJaWYgKCRtLT57bW9kZV9ifSA9fiAvNzU1JC8gJiYgJG0tPnttb2RlX2F9ICF+IC83NTUkLykgeworCQkkc2VsZi0+Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwnc3ZuOmV4ZWN1dGFibGUnLCcqJyk7CisJfSBlbHNpZiAoJG0tPnttb2RlX2J9ICF+IC83NTUkLyAmJiAkbS0+e21vZGVfYX0gPX4gLzc1NSQvKSB7CisJCSRzZWxmLT5jaGFuZ2VfZmlsZV9wcm9wKCRmYmF0LCdzdm46ZXhlY3V0YWJsZScsdW5kZWYpOworCX0KKwlteSAkZmggPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUgb3IgY3JvYWsgJCE7CisJaWYgKCRtLT57bW9kZV9ifSA9fiAvXjEyMC8pIHsKKwkJcHJpbnQgJGZoICdsaW5rICcgb3IgY3JvYWsgJCE7CisJCSRzZWxmLT5jaGFuZ2VfZmlsZV9wcm9wKCRmYmF0LCdzdm46c3BlY2lhbCcsJyonKTsKKwl9IGVsc2lmICgkbS0+e21vZGVfYX0gPX4gL14xMjAvICYmICRtLT57bW9kZV9ifSAhfiAvXjEyMC8pIHsKKwkJJHNlbGYtPmNoYW5nZV9maWxlX3Byb3AoJGZiYXQsJ3N2bjpzcGVjaWFsJyx1bmRlZik7CisJfQorCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIGNyb2FrICQhOworCWlmICghJHBpZCkgeworCQlvcGVuIFNURE9VVCwgJz4mJywgJGZoIG9yIGNyb2FrICQhOworCQlleGVjIHF3L2dpdC1jYXQtZmlsZSBibG9iLywgJG0tPntzaGExX2J9IG9yIGNyb2FrICQhOworCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87CisJJGZoLT5mbHVzaCA9PSAwIG9yIGNyb2FrICQhOworCXNlZWsgJGZoLCAwLCAwIG9yIGNyb2FrICQhOworCisJbXkgJG1kNSA9IERpZ2VzdDo6TUQ1LT5uZXc7CisJJG1kNS0+YWRkZmlsZSgkZmgpIG9yIGNyb2FrICQhOworCXNlZWsgJGZoLCAwLCAwIG9yIGNyb2FrICQhOworCisJbXkgJGV4cCA9ICRtZDUtPmhleGRpZ2VzdDsKKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCW15ICRhdGQgPSAkc2VsZi0+YXBwbHlfdGV4dGRlbHRhKCRmYmF0LCB1bmRlZiwgJHBvb2wpOworCW15ICRnb3QgPSBTVk46OlR4RGVsdGE6OnNlbmRfc3RyZWFtKCRmaCwgQCRhdGQsICRwb29sKTsKKwlkaWUgIkNoZWNrc3VtIG1pc21hdGNoXG5leHBlY3RlZDogJGV4cFxuZ290OiAkZ290XG4iIGlmICgkZ290IG5lICRleHApOworCSRwb29sLT5jbGVhcjsKKworCWNsb3NlICRmaCBvciBjcm9hayAkITsKK30KKworc3ViIEQgeworCW15ICgkc2VsZiwgJG0pID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlwcmludCAiXHREXHQkbS0+e2ZpbGVfYn1cbiIgdW5sZXNzICQ6Ol9xOworCSRzZWxmLT5kZWxldGVfZW50cnkoJG0tPntmaWxlX2J9LCAkcGJhdCk7Cit9CisKK3N1YiBjbG9zZV9lZGl0IHsKKwlteSAoJHNlbGYpID0gQF87CisJbXkgKCRwLCRiYXQpID0gKCRzZWxmLT57cG9vbH0sICRzZWxmLT57YmF0fSk7CisJZm9yZWFjaCAoc29ydCB7ICRiID1+IHRyIy8jLyMgPD0+ICRhID1+IHRyIy8jLyMgfSBrZXlzICUkYmF0KSB7CisJCW5leHQgaWYgJF8gZXEgJyc7CisJCSRzZWxmLT5jbG9zZV9kaXJlY3RvcnkoJGJhdC0+eyRffSwgJHApOworCX0KKwkkc2VsZi0+Y2xvc2VfZGlyZWN0b3J5KCRiYXQtPnsnJ30sICRwKTsKKwkkc2VsZi0+U1VQRVI6OmNsb3NlX2VkaXQoJHApOworCSRwLT5jbGVhcjsKK30KKworc3ViIGFib3J0X2VkaXQgeworCW15ICgkc2VsZikgPSBAXzsKKwkkc2VsZi0+U1VQRVI6OmFib3J0X2VkaXQoJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBERVNUUk9ZIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT5TVVBFUjo6REVTVFJPWShAXyk7CisJJHNlbGYtPntwb29sfS0+Y2xlYXI7Cit9CisKKyMgdGhpcyBkcml2ZXMgdGhlIGVkaXRvcgorc3ViIGFwcGx5X2RpZmYgeworCW15ICgkc2VsZikgPSBAXzsKKwlteSAkbW9kcyA9ICRzZWxmLT57bW9kc307CisJbXkgJW8gPSAoIEQgPT4gMSwgUiA9PiAwLCBDID0+IC0xLCBBID0+IDMsIE0gPT4gMywgVCA9PiAzICk7CisJZm9yZWFjaCBteSAkbSAoc29ydCB7ICRveyRhLT57Y2hnfX0gPD0+ICRveyRiLT57Y2hnfX0gfSBAJG1vZHMpIHsKKwkJbXkgJGYgPSAkbS0+e2NoZ307CisJCWlmIChkZWZpbmVkICRveyRmfSkgeworCQkJJHNlbGYtPiRmKCRtKTsKKwkJfSBlbHNlIHsKKwkJCWZhdGFsKCJJbnZhbGlkIGNoYW5nZSB0eXBlOiAkZlxuIik7CisJCX0KKwl9CisJJHNlbGYtPnJtZGlycyBpZiAkX3JtZGlyOworCWlmIChAJG1vZHMgPT0gMCkgeworCQkkc2VsZi0+YWJvcnRfZWRpdDsKKwl9IGVsc2UgeworCQkkc2VsZi0+Y2xvc2VfZWRpdDsKKwl9CisJcmV0dXJuIHNjYWxhciBAJG1vZHM7Cit9CisKK3BhY2thZ2UgR2l0OjpTVk46OlJhOwordXNlIHZhcnMgcXcvQElTQSAkY29uZmlnX2RpciAkX2xvZ193aW5kb3dfc2l6ZS87Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworbXkgKCRjYW5fZG9fc3dpdGNoLCAlaWdub3JlZF9lcnIsICRSQSk7CisKK0JFR0lOIHsKKwkjIGVuZm9yY2UgdGVtcG9yYXJ5IHBvb2wgdXNhZ2UgZm9yIHNvbWUgc2ltcGxlIGZ1bmN0aW9ucworCW15ICRlOworCWZvcmVhY2ggKHF3L3Jldl9wcm9wbGlzdCBnZXRfbGF0ZXN0X3Jldm51bSBnZXRfdXVpZCBnZXRfcmVwb3Nfcm9vdC8pIHsKKwkJJGUgLj0gInN1YiAkXyB7CisJCQlteSBcJHNlbGYgPSBzaGlmdDsKKwkJCW15IFwkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCQkJbXkgXEByZXQgPSBcJHNlbGYtPlNVUEVSOjokXyhcQF8sXCRwb29sKTsKKwkJCVwkcG9vbC0+Y2xlYXI7CisJCQl3YW50YXJyYXkgPyBcQHJldCA6IFwkcmV0WzBdOyB9XG4iOworCX0KKworCWV2YWwgIiRlOyAxOyIgb3IgZGllICRAOworfQorCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkdXJsKSA9IEBfOworCSR1cmwgPX4gcyEvKyQhITsKKwlyZXR1cm4gJFJBIGlmICgkUkEgJiYgJFJBLT57dXJsfSBlcSAkdXJsKTsKKworCVNWTjo6X0NvcmU6OnN2bl9jb25maWdfZW5zdXJlKCRjb25maWdfZGlyLCB1bmRlZik7CisJbXkgKCRiYXRvbiwgJGNhbGxiYWNrcykgPSBTVk46OkNvcmU6OmF1dGhfb3Blbl9oZWxwZXIoWworCSAgICBTVk46OkNsaWVudDo6Z2V0X3NpbXBsZV9wcm92aWRlcigpLAorCSAgICBTVk46OkNsaWVudDo6Z2V0X3NzbF9zZXJ2ZXJfdHJ1c3RfZmlsZV9wcm92aWRlcigpLAorCSAgICBTVk46OkNsaWVudDo6Z2V0X3NpbXBsZV9wcm9tcHRfcHJvdmlkZXIoCisJICAgICAgXCZHaXQ6OlNWTjo6UHJvbXB0OjpzaW1wbGUsIDIpLAorCSAgICBTVk46OkNsaWVudDo6Z2V0X3NzbF9jbGllbnRfY2VydF9wcm9tcHRfcHJvdmlkZXIoCisJICAgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojpzc2xfY2xpZW50X2NlcnQsIDIpLAorCSAgICBTVk46OkNsaWVudDo6Z2V0X3NzbF9jbGllbnRfY2VydF9wd19wcm9tcHRfcHJvdmlkZXIoCisJICAgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojpzc2xfY2xpZW50X2NlcnRfcHcsIDIpLAorCSAgICBTVk46OkNsaWVudDo6Z2V0X3VzZXJuYW1lX3Byb3ZpZGVyKCksCisJICAgIFNWTjo6Q2xpZW50OjpnZXRfc3NsX3NlcnZlcl90cnVzdF9wcm9tcHRfcHJvdmlkZXIoCisJICAgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojpzc2xfc2VydmVyX3RydXN0KSwKKwkgICAgU1ZOOjpDbGllbnQ6OmdldF91c2VybmFtZV9wcm9tcHRfcHJvdmlkZXIoCisJICAgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojp1c2VybmFtZSwgMiksCisJICBdKTsKKwlteSAkY29uZmlnID0gU1ZOOjpDb3JlOjpjb25maWdfZ2V0X2NvbmZpZygkY29uZmlnX2Rpcik7CisJbXkgJHNlbGYgPSBTVk46OlJhLT5uZXcodXJsID0+ICR1cmwsIGF1dGggPT4gJGJhdG9uLAorCSAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPT4gJGNvbmZpZywKKwkJCSAgICAgIHBvb2wgPT4gU1ZOOjpQb29sLT5uZXcsCisJICAgICAgICAgICAgICAgICAgICAgIGF1dGhfcHJvdmlkZXJfY2FsbGJhY2tzID0+ICRjYWxsYmFja3MpOworCSRzZWxmLT57c3ZuX3BhdGh9ID0gJHVybDsKKwkkc2VsZi0+e3JlcG9zX3Jvb3R9ID0gJHNlbGYtPmdldF9yZXBvc19yb290OworCSRzZWxmLT57c3ZuX3BhdGh9ID1+IHMjXlxRJHNlbGYtPntyZXBvc19yb290fVxFKC98JCkjIzsKKwkkc2VsZi0+e2NhY2hlfSA9IHsgY2hlY2tfcGF0aCA9PiB7IHIgPT4gMCwgZGF0YSA9PiB7fSB9LAorCSAgICAgICAgICAgICAgICAgICBnZXRfZGlyID0+IHsgciA9PiAwLCBkYXRhID0+IHt9IH0gfTsKKwkkUkEgPSBibGVzcyAkc2VsZiwgJGNsYXNzOworfQorCitzdWIgY2hlY2tfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHIpID0gQF87CisJbXkgJGNhY2hlID0gJHNlbGYtPntjYWNoZX0tPntjaGVja19wYXRofTsKKwlpZiAoJHIgPT0gJGNhY2hlLT57cn0gJiYgZXhpc3RzICRjYWNoZS0+e2RhdGF9LT57JHBhdGh9KSB7CisJCXJldHVybiAkY2FjaGUtPntkYXRhfS0+eyRwYXRofTsKKwl9CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwlteSAkdCA9ICRzZWxmLT5TVVBFUjo6Y2hlY2tfcGF0aCgkcGF0aCwgJHIsICRwb29sKTsKKwkkcG9vbC0+Y2xlYXI7CisJaWYgKCRyICE9ICRjYWNoZS0+e3J9KSB7CisJCSV7JGNhY2hlLT57ZGF0YX19ID0gKCk7CisJCSRjYWNoZS0+e3J9ID0gJHI7CisJfQorCSRjYWNoZS0+e2RhdGF9LT57JHBhdGh9ID0gJHQ7Cit9CisKK3N1YiBnZXRfZGlyIHsKKwlteSAoJHNlbGYsICRkaXIsICRyKSA9IEBfOworCW15ICRjYWNoZSA9ICRzZWxmLT57Y2FjaGV9LT57Z2V0X2Rpcn07CisJaWYgKCRyID09ICRjYWNoZS0+e3J9KSB7CisJCWlmIChteSAkeCA9ICRjYWNoZS0+e2RhdGF9LT57JGRpcn0pIHsKKwkJCXJldHVybiB3YW50YXJyYXkgPyBAJHggOiAkeC0+WzBdOworCQl9CisJfQorCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJbXkgKCRkLCB1bmRlZiwgJHByb3BzKSA9ICRzZWxmLT5TVVBFUjo6Z2V0X2RpcigkZGlyLCAkciwgJHBvb2wpOworCW15ICVkaXJlbnRzID0gbWFwIHsgJF8gPT4geyBraW5kID0+ICRkLT57JF99LT5raW5kIH0gfSBrZXlzICUkZDsKKwkkcG9vbC0+Y2xlYXI7CisJaWYgKCRyICE9ICRjYWNoZS0+e3J9KSB7CisJCSV7JGNhY2hlLT57ZGF0YX19ID0gKCk7CisJCSRjYWNoZS0+e3J9ID0gJHI7CisJfQorCSRjYWNoZS0+e2RhdGF9LT57JGRpcn0gPSBbIFwlZGlyZW50cywgJHIsICRwcm9wcyBdOworCXdhbnRhcnJheSA/IChcJWRpcmVudHMsICRyLCAkcHJvcHMpIDogXCVkaXJlbnRzOworfQorCitzdWIgREVTVFJPWSB7CisJIyBkbyBub3QgY2FsbCB0aGUgcmVhbCBERVNUUk9ZIHNpbmNlIHdlIHN0b3JlIG91cnNlbHZlcyBpbiAkUkEKK30KKworc3ViIGdldF9sb2cgeworCW15ICgkc2VsZiwgQGFyZ3MpID0gQF87CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwlzcGxpY2UoQGFyZ3MsIDMsIDEpIGlmICgkU1ZOOjpDb3JlOjpWRVJTSU9OIGxlICcxLjIuMCcpOworCW15ICRyZXQgPSAkc2VsZi0+U1VQRVI6OmdldF9sb2coQGFyZ3MsICRwb29sKTsKKwkkcG9vbC0+Y2xlYXI7CisJJHJldDsKK30KKworc3ViIGdldF9jb21taXRfZWRpdG9yIHsKKwlteSAoJHNlbGYsICRsb2csICRjYiwgJHBvb2wpID0gQF87CisJbXkgQGxvY2sgPSAkU1ZOOjpDb3JlOjpWRVJTSU9OIGdlICcxLjIuMCcgPyAodW5kZWYsIDApIDogKCk7CisJJHNlbGYtPlNVUEVSOjpnZXRfY29tbWl0X2VkaXRvcigkbG9nLCAkY2IsIEBsb2NrLCAkcG9vbCk7Cit9CisKK3N1YiBnc19kb191cGRhdGUgeworCW15ICgkc2VsZiwgJHJldl9hLCAkcmV2X2IsICRncywgJGVkaXRvcikgPSBAXzsKKwlteSAkbmV3ID0gKCRyZXZfYSA9PSAkcmV2X2IpOworCW15ICRwYXRoID0gJGdzLT57cGF0aH07CisKKwlpZiAoJG5ldyAmJiAtZSAkZ3MtPntpbmRleH0pIHsKKwkJdW5saW5rICRncy0+e2luZGV4fSBvciBkaWUKKwkJICAiQ291bGRuJ3QgdW5saW5rIGluZGV4OiAkZ3MtPntpbmRleH06ICQhXG4iOworCX0KKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCSRlZGl0b3ItPnNldF9wYXRoX3N0cmlwKCRwYXRoKTsKKwlteSAoQHBjKSA9IHNwbGl0IG0jLyMsICRwYXRoOworCW15ICRyZXBvcnRlciA9ICRzZWxmLT5kb191cGRhdGUoJHJldl9iLCAoQHBjID8gc2hpZnQgQHBjIDogJycpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJGVkaXRvciwgJHBvb2wpOworCW15IEBsb2NrID0gJFNWTjo6Q29yZTo6VkVSU0lPTiBnZSAnMS4yLjAnID8gKHVuZGVmKSA6ICgpOworCisJIyBTaW5jZSB3ZSBjYW4ndCByZWx5IG9uIHN2bl9yYV9yZXBhcmVudCBiZWluZyBhdmFpbGFibGUsIHdlJ2xsCisJIyBqdXN0IGhhdmUgdG8gZG8gc29tZSBtYWdpYyB3aXRoIHNldF9wYXRoIHRvIG1ha2UgaXQgc28KKwkjIHdlIG9ubHkgd2FudCBhIHBhcnRpYWwgcGF0aC4KKwlteSAkc3AgPSAnJzsKKwlteSAkZmluYWwgPSBqb2luKCcvJywgQHBjKTsKKwl3aGlsZSAoQHBjKSB7CisJCSRyZXBvcnRlci0+c2V0X3BhdGgoJHNwLCAkcmV2X2IsIDAsIEBsb2NrLCAkcG9vbCk7CisJCSRzcCAuPSAnLycgaWYgbGVuZ3RoICRzcDsKKwkJJHNwIC49IHNoaWZ0IEBwYzsKKwl9CisJZGllICJCVUc6ICckc3AnICE9ICckZmluYWwnXG4iIGlmICgkc3AgbmUgJGZpbmFsKTsKKworCSRyZXBvcnRlci0+c2V0X3BhdGgoJHNwLCAkcmV2X2EsICRuZXcsIEBsb2NrLCAkcG9vbCk7CisKKwkkcmVwb3J0ZXItPmZpbmlzaF9yZXBvcnQoJHBvb2wpOworCSRwb29sLT5jbGVhcjsKKwkkZWRpdG9yLT57Z2l0X2NvbW1pdF9va307Cit9CisKKyMgdGhpcyByZXF1aXJlcyBTVk4gMS40LjMgb3IgbGF0ZXIgKGRvX3N3aXRjaCBkaWRuJ3Qgd29yayBiZWZvcmUgMS40LjMsIGFuZAorIyBzdm5fcmFfcmVwYXJlbnQgZGlkbid0IHdvcmsgYmVmb3JlIDEuNCkKK3N1YiBnc19kb19zd2l0Y2ggeworCW15ICgkc2VsZiwgJHJldl9hLCAkcmV2X2IsICRncywgJHVybF9iLCAkZWRpdG9yKSA9IEBfOworCW15ICRwYXRoID0gJGdzLT57cGF0aH07CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKworCW15ICRmdWxsX3VybCA9ICRzZWxmLT57dXJsfTsKKwlteSAkb2xkX3VybCA9ICRmdWxsX3VybDsKKwkkZnVsbF91cmwgLj0gIi8kcGF0aCIgaWYgbGVuZ3RoICRwYXRoOworCW15ICgkcmEsICRyZXBhcmVudGVkKTsKKwlpZiAoJG9sZF91cmwgbmUgJGZ1bGxfdXJsKSB7CisJCWlmICgkb2xkX3VybCAhfiBtI15zdm4oXCtzc2gpPzovLyMpIHsKKwkJCVNWTjo6X1JhOjpzdm5fcmFfcmVwYXJlbnQoJHNlbGYtPntzZXNzaW9ufSwgJGZ1bGxfdXJsLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9vbCk7CisJCQkkc2VsZi0+e3VybH0gPSAkZnVsbF91cmw7CisJCQkkcmVwYXJlbnRlZCA9IDE7CisJCX0gZWxzZSB7CisJCQkkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkZnVsbF91cmwpOworCQl9CisJfQorCSRyYSB8fD0gJHNlbGY7CisJbXkgJHJlcG9ydGVyID0gJHJhLT5kb19zd2l0Y2goJHJldl9iLCAnJywgMSwgJHVybF9iLCAkZWRpdG9yLCAkcG9vbCk7CisJbXkgQGxvY2sgPSAkU1ZOOjpDb3JlOjpWRVJTSU9OIGdlICcxLjIuMCcgPyAodW5kZWYpIDogKCk7CisJJHJlcG9ydGVyLT5zZXRfcGF0aCgnJywgJHJldl9hLCAwLCBAbG9jaywgJHBvb2wpOworCSRyZXBvcnRlci0+ZmluaXNoX3JlcG9ydCgkcG9vbCk7CisKKwlpZiAoJHJlcGFyZW50ZWQpIHsKKwkJU1ZOOjpfUmE6OnN2bl9yYV9yZXBhcmVudCgkc2VsZi0+e3Nlc3Npb259LCAkb2xkX3VybCwgJHBvb2wpOworCQkkc2VsZi0+e3VybH0gPSAkb2xkX3VybDsKKwl9CisKKwkkcG9vbC0+Y2xlYXI7CisJJGVkaXRvci0+e2dpdF9jb21taXRfb2t9OworfQorCitzdWIgZ3NfZmV0Y2hfbG9vcF9jb21tb24geworCW15ICgkc2VsZiwgJGJhc2UsICRoZWFkLCAkZ3N2LCAkZ2xvYnMpID0gQF87CisJcmV0dXJuIGlmICgkYmFzZSA+ICRoZWFkKTsKKwlteSAkaW5jID0gJF9sb2dfd2luZG93X3NpemU7CisJbXkgKCRtaW4sICRtYXgpID0gKCRiYXNlLCAkaGVhZCA8ICRiYXNlICsgJGluYyA/ICRoZWFkIDogJGJhc2UgKyAkaW5jKTsKKwlteSAlY29tbW9uOworCW15ICRjb21tb25fbWF4ID0gc2NhbGFyIEAkZ3N2OworCisJZm9yZWFjaCBteSAkZ3MgKEAkZ3N2KSB7CisJCW15IEB0bXAgPSBzcGxpdCBtIy8jLCAkZ3MtPntwYXRofTsKKwkJbXkgJHAgPSAnJzsKKwkJZm9yZWFjaCAoQHRtcCkgeworCQkJJHAgLj0gbGVuZ3RoKCRwKSA/ICIvJF8iIDogJF87CisJCQkkY29tbW9ueyRwfSB8fD0gMDsKKwkJCSRjb21tb257JHB9Kys7CisJCX0KKwl9CisJJGdsb2JzIHx8PSBbXTsKKwkkY29tbW9uX21heCArPSBzY2FsYXIgQCRnbG9iczsKKwlmb3JlYWNoIG15ICRnbG9iIChAJGdsb2JzKSB7CisJCW15IEB0bXAgPSBzcGxpdCBtIy8jLCAkZ2xvYi0+e3BhdGh9LT57bGVmdH07CisJCW15ICRwID0gJyc7CisJCWZvcmVhY2ggKEB0bXApIHsKKwkJCSRwIC49IGxlbmd0aCgkcCkgPyAiLyRfIiA6ICRfOworCQkJJGNvbW1vbnskcH0gfHw9IDA7CisJCQkkY29tbW9ueyRwfSsrOworCQl9CisJfQorCisJbXkgJGxvbmdlc3RfcGF0aCA9ICcnOworCWZvcmVhY2ggKHNvcnQge2xlbmd0aCAkYiA8PT4gbGVuZ3RoICRhfSBrZXlzICVjb21tb24pIHsKKwkJaWYgKCRjb21tb257JF99ID09ICRjb21tb25fbWF4KSB7CisJCQkkbG9uZ2VzdF9wYXRoID0gJF87CisJCQlsYXN0OworCQl9CisJfQorCXdoaWxlICgxKSB7CisJCW15ICVyZXZzOworCQlteSAkZXJyOworCQlteSAkZXJyX2hhbmRsZXIgPSAkU1ZOOjpFcnJvcjo6aGFuZGxlcjsKKwkJJFNWTjo6RXJyb3I6OmhhbmRsZXIgPSBzdWIgeworCQkJKCRlcnIpID0gQF87CisJCQlza2lwX3Vua25vd25fcmV2cygkZXJyKTsKKwkJfTsKKwkJc3ViIF9jYiB7CisJCQlteSAoJHBhdGhzLCAkciwgJGF1dGhvciwgJGRhdGUsICRsb2cpID0gQF87CisJCQlbIGR1cF9jaGFuZ2VkX3BhdGhzKCRwYXRocyksCisJCQkgIHsgYXV0aG9yID0+ICRhdXRob3IsIGRhdGUgPT4gJGRhdGUsIGxvZyA9PiAkbG9nIH0gXTsKKwkJfQorCQkkc2VsZi0+Z2V0X2xvZyhbJGxvbmdlc3RfcGF0aF0sICRtaW4sICRtYXgsIDAsIDEsIDEsCisJCSAgICAgICAgICAgICAgIHN1YiB7ICRyZXZzeyRfWzFdfSA9IF9jYihAXykgfSk7CisJCWlmICgkZXJyICYmICRtYXggPj0gJGhlYWQpIHsKKwkJCXByaW50IFNUREVSUiAiUGF0aCAnJGxvbmdlc3RfcGF0aCcgIiwKKwkJCQkgICAgICJ3YXMgcHJvYmFibHkgZGVsZXRlZDpcbiIsCisJCQkJICAgICAkZXJyLT5leHBhbmRlZF9tZXNzYWdlLAorCQkJCSAgICAgIlxuV2lsbCBhdHRlbXB0IHRvIGZvbGxvdyAiLAorCQkJCSAgICAgInJldmlzaW9ucyByJG1pbiAuLiByJG1heCAiLAorCQkJCSAgICAgImNvbW1pdHRlZCBiZWZvcmUgdGhlIGRlbGV0aW9uXG4iOworCQkJbXkgJGhpID0gJG1heDsKKwkJCXdoaWxlICgtLSRoaSA+PSAkbWluKSB7CisJCQkJbXkgJG9rOworCQkJCSRzZWxmLT5nZXRfbG9nKFskbG9uZ2VzdF9wYXRoXSwgJG1pbiwgJGhpLAorCQkJCSAgICAgICAgICAgICAgIDAsIDEsIDEsIHN1YiB7CisJCQkJICAgICAgICAgICAgICAgJG9rIHx8PSAkX1sxXTsKKwkJCQkgICAgICAgICAgICAgICAkcmV2c3skX1sxXX0gPSBfY2IoQF8pIH0pOworCQkJCWlmICgkb2spIHsKKwkJCQkJcHJpbnQgU1RERVJSICJyJG1pbiAuLiByJG9rIE9LXG4iOworCQkJCQlsYXN0OworCQkJCX0KKwkJCX0KKwkJfQorCQkkU1ZOOjpFcnJvcjo6aGFuZGxlciA9ICRlcnJfaGFuZGxlcjsKKworCQlteSAlZXhpc3RzID0gbWFwIHsgJF8tPntwYXRofSA9PiAkXyB9IEAkZ3N2OworCQlmb3JlYWNoIG15ICRyIChzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXJldnMpIHsKKwkJCW15ICgkcGF0aHMsICRsb2dnZWQpID0gQHskcmV2c3skcn19OworCisJCQlmb3JlYWNoIG15ICRncyAoJHNlbGYtPm1hdGNoX2dsb2JzKFwlZXhpc3RzLCAkcGF0aHMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnbG9icywgJHIpKSB7CisJCQkJaWYgKCRncy0+cmV2X2RiX21heCA+PSAkcikgeworCQkJCQluZXh0OworCQkJCX0KKwkJCQluZXh0IHVubGVzcyAkZ3MtPm1hdGNoX3BhdGhzKCRwYXRocywgJHIpOworCQkJCSRncy0+e2xvZ2dlZF9yZXZfcHJvcHN9ID0gJGxvZ2dlZDsKKwkJCQlpZiAobXkgJGxhc3RfY29tbWl0ID0gJGdzLT5sYXN0X2NvbW1pdCkgeworCQkJCQkkZ3MtPmFzc2VydF9pbmRleF9jbGVhbigkbGFzdF9jb21taXQpOworCQkJCX0KKwkJCQlteSAkbG9nX2VudHJ5ID0gJGdzLT5kb19mZXRjaCgkcGF0aHMsICRyKTsKKwkJCQlpZiAoJGxvZ19lbnRyeSkgeworCQkJCQkkZ3MtPmRvX2dpdF9jb21taXQoJGxvZ19lbnRyeSk7CisJCQkJfQorCQkJfQorCQkJZm9yZWFjaCBteSAkZyAoQCRnbG9icykgeworCQkJCW15ICRrID0gInN2bi1yZW1vdGUuJGctPntyZW1vdGV9LiIgLgorCQkJCSAgICAgICAgIiRnLT57dH0tbWF4UmV2IjsKKwkJCQlHaXQ6OlNWTjo6dG1wX2NvbmZpZygkaywgJHIpOworCQkJfQorCQl9CisJCSMgcHJlLWZpbGwgdGhlIC5yZXZfZGIgc2luY2UgaXQnbGwgZXZlbnR1YWxseSBnZXQgZmlsbGVkIGluCisJCSMgd2l0aCAnMCcgeDQwIGlmIHNvbWV0aGluZyBuZXcgZ2V0cyBjb21taXR0ZWQKKwkJZm9yZWFjaCBteSAkZ3MgKEAkZ3N2KSB7CisJCQluZXh0IGlmIGRlZmluZWQgJGdzLT5yZXZfZGJfZ2V0KCRtYXgpOworCQkJJGdzLT5yZXZfZGJfc2V0KCRtYXgsIDAgeDQwKTsKKwkJfQorCQlmb3JlYWNoIG15ICRnIChAJGdsb2JzKSB7CisJCQlteSAkayA9ICJzdm4tcmVtb3RlLiRnLT57cmVtb3RlfS4kZy0+e3R9LW1heFJldiI7CisJCQlHaXQ6OlNWTjo6dG1wX2NvbmZpZygkaywgJG1heCk7CisJCX0KKwkJbGFzdCBpZiAkbWF4ID49ICRoZWFkOworCQkkbWluID0gJG1heCArIDE7CisJCSRtYXggKz0gJGluYzsKKwkJJG1heCA9ICRoZWFkIGlmICgkbWF4ID4gJGhlYWQpOworCX0KK30KKworc3ViIG1hdGNoX2dsb2JzIHsKKwlteSAoJHNlbGYsICRleGlzdHMsICRwYXRocywgJGdsb2JzLCAkcikgPSBAXzsKKworCXN1YiBnZXRfZGlyX2NoZWNrIHsKKwkJbXkgKCRzZWxmLCAkZXhpc3RzLCAkZywgJHIpID0gQF87CisJCW15IEB4ID0gZXZhbCB7ICRzZWxmLT5nZXRfZGlyKCRnLT57cGF0aH0tPntsZWZ0fSwgJHIpIH07CisJCXJldHVybiB1bmxlc3Mgc2NhbGFyIEB4ID09IDM7CisJCW15ICRkaXJlbnRzID0gJHhbMF07CisJCWZvcmVhY2ggbXkgJGRlIChrZXlzICUkZGlyZW50cykgeworCQkJbmV4dCBpZiAkZGlyZW50cy0+eyRkZX0tPntraW5kfSAhPSAkU1ZOOjpOb2RlOjpkaXI7CisJCQlteSAkcCA9ICRnLT57cGF0aH0tPmZ1bGxfcGF0aCgkZGUpOworCQkJbmV4dCBpZiAkZXhpc3RzLT57JHB9OworCQkJbmV4dCBpZiAobGVuZ3RoICRnLT57cGF0aH0tPntyaWdodH0gJiYKKwkJCQkgKCRzZWxmLT5jaGVja19wYXRoKCRwLCAkcikgIT0KKwkJCQkgICRTVk46Ok5vZGU6OmRpcikpOworCQkJJGV4aXN0cy0+eyRwfSA9IEdpdDo6U1ZOLT5pbml0KCRzZWxmLT57dXJsfSwgJHAsIHVuZGVmLAorCQkJCQkgJGctPntyZWZ9LT5mdWxsX3BhdGgoJGRlKSwgMSk7CisJCX0KKwl9CisJZm9yZWFjaCBteSAkZyAoQCRnbG9icykgeworCQlpZiAobXkgJHBhdGggPSAkcGF0aHMtPnsiLyRnLT57cGF0aH0tPntsZWZ0fSJ9KSB7CisJCQlpZiAoJHBhdGgtPnthY3Rpb259ID1+IC9eW0FSXSQvKSB7CisJCQkJZ2V0X2Rpcl9jaGVjaygkc2VsZiwgJGV4aXN0cywgJGcsICRyKTsKKwkJCX0KKwkJfQorCQlmb3JlYWNoIChrZXlzICUkcGF0aHMpIHsKKwkJCWlmICgvJGctPntwYXRofS0+e2xlZnRfcmVnZXh9LyAmJgorCQkJICAgICEvJGctPntwYXRofS0+e3JlZ2V4fS8pIHsKKwkJCQluZXh0IGlmICRwYXRocy0+eyRffS0+e2FjdGlvbn0gIX4gL15bQVJdJC87CisJCQkJZ2V0X2Rpcl9jaGVjaygkc2VsZiwgJGV4aXN0cywgJGcsICRyKTsKKwkJCX0KKwkJCW5leHQgdW5sZXNzIC8kZy0+e3BhdGh9LT57cmVnZXh9LzsKKwkJCW15ICRwID0gJDE7CisJCQlteSAkcGF0aG5hbWUgPSAkZy0+e3BhdGh9LT5mdWxsX3BhdGgoJHApOworCQkJbmV4dCBpZiAkZXhpc3RzLT57JHBhdGhuYW1lfTsKKwkJCW5leHQgaWYgKCRzZWxmLT5jaGVja19wYXRoKCRwYXRobmFtZSwgJHIpICE9CisJCQkgICAgICAgICAkU1ZOOjpOb2RlOjpkaXIpOworCQkJJGV4aXN0cy0+eyRwYXRobmFtZX0gPSBHaXQ6OlNWTi0+aW5pdCgKKwkJCSAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3VybH0sICRwYXRobmFtZSwgdW5kZWYsCisJCQkgICAgICAgICAgICAgICAgICAgICAgJGctPntyZWZ9LT5mdWxsX3BhdGgoJHApLCAxKTsKKwkJfQorCQlteSAkYyA9ICcnOworCQlmb3JlYWNoIChzcGxpdCBtIy8jLCAkZy0+e3BhdGh9LT57bGVmdH0pIHsKKwkJCSRjIC49ICIvJF8iOworCQkJbmV4dCB1bmxlc3MgKCRwYXRocy0+eyRjfSAmJgorCQkJICAgICAgICAgICAgICgkcGF0aHMtPnskY30tPnthY3Rpb259ID1+IC9eW0FSXSQvKSk7CisJCQlnZXRfZGlyX2NoZWNrKCRzZWxmLCAkZXhpc3RzLCAkZywgJHIpOworCQl9CisJfQorCXZhbHVlcyAlJGV4aXN0czsKK30KKworc3ViIG1pbmltaXplX3VybCB7CisJbXkgKCRzZWxmKSA9IEBfOworCXJldHVybiAkc2VsZi0+e3VybH0gaWYgKCRzZWxmLT57dXJsfSBlcSAkc2VsZi0+e3JlcG9zX3Jvb3R9KTsKKwlteSAkdXJsID0gJHNlbGYtPntyZXBvc19yb290fTsKKwlteSBAY29tcG9uZW50cyA9IHNwbGl0KG0hLyEsICRzZWxmLT57c3ZuX3BhdGh9KTsKKwlteSAkYyA9ICcnOworCWRvIHsKKwkJJHVybCAuPSAiLyRjIiBpZiBsZW5ndGggJGM7CisJCWV2YWwgeyAocmVmICRzZWxmKS0+bmV3KCR1cmwpLT5nZXRfbGF0ZXN0X3Jldm51bSB9OworCX0gd2hpbGUgKCRAICYmICgkYyA9IHNoaWZ0IEBjb21wb25lbnRzKSk7CisJJHVybDsKK30KKworc3ViIGNhbl9kb19zd2l0Y2ggeworCW15ICRzZWxmID0gc2hpZnQ7CisJdW5sZXNzIChkZWZpbmVkICRjYW5fZG9fc3dpdGNoKSB7CisJCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJCW15ICRyZXAgPSBldmFsIHsKKwkJCSRzZWxmLT5kb19zd2l0Y2goMSwgJycsIDAsICRzZWxmLT57dXJsfSwKKwkJCSAgICAgICAgICAgICAgICAgU1ZOOjpEZWx0YTo6RWRpdG9yLT5uZXcsICRwb29sKTsKKwkJfTsKKwkJaWYgKCRAKSB7CisJCQkkY2FuX2RvX3N3aXRjaCA9IDA7CisJCX0gZWxzZSB7CisJCQkkcmVwLT5hYm9ydF9yZXBvcnQoJHBvb2wpOworCQkJJGNhbl9kb19zd2l0Y2ggPSAxOworCQl9CisJCSRwb29sLT5jbGVhcjsKKwl9CisJJGNhbl9kb19zd2l0Y2g7Cit9CisKK3N1YiBza2lwX3Vua25vd25fcmV2cyB7CisJbXkgKCRlcnIpID0gQF87CisJbXkgJGVycm5vID0gJGVyci0+YXByX2VycigpOworCSMgTWF5YmUgdGhlIGJyYW5jaCB3ZSdyZSB0cmFja2luZyBkaWRuJ3QKKwkjIGV4aXN0IHdoZW4gdGhlIHJlcG8gc3RhcnRlZCwgc28gaXQncworCSMgbm90IGFuIGVycm9yIGlmIGl0IGRvZXNuJ3QsIGp1c3QgY29udGludWUKKwkjCisJIyBXb25kZXJmdWxseSBjb25zaXN0ZW50IGxpYnJhcnksIGVoPworCSMgMTYwMDEzIC0gc3ZuOi8vIGFuZCBmaWxlOi8vCisJIyAxNzUwMDIgLSBodHRwKHMpOi8vCisJIyAxNzUwMDcgLSBodHRwKHMpOi8vICh0aGlzIHJlcG8gcmVxdWlyZWQgYXV0aG9yaXphdGlvbiwgdG9vLi4uKQorCSMgICBNb3JlIGNvZGVzIG1heSBiZSBkaXNjb3ZlcmVkIGxhdGVyLi4uCisJaWYgKCRlcnJubyA9PSAxNzUwMDcgfHwgJGVycm5vID09IDE3NTAwMiB8fCAkZXJybm8gPT0gMTYwMDEzKSB7CisJCW15ICRlcnJfa2V5ID0gJGVyci0+ZXhwYW5kZWRfbWVzc2FnZTsKKwkJIyByZXZpc2lvbiBudW1iZXJzIGNoYW5nZSBldmVyeSB0aW1lLCBmaWx0ZXIgdGhlbSBvdXQKKwkJJGVycl9rZXkgPX4gcy9cZCsvXDAvZzsKKwkJJGVycl9rZXkgPSAiJGVycm5vXDAkZXJyX2tleSI7CisJCXVubGVzcyAoJGlnbm9yZWRfZXJyeyRlcnJfa2V5fSkgeworCQkJd2FybiAiVzogSWdub3JpbmcgZXJyb3IgZnJvbSBTVk4sIHBhdGggcHJvYmFibHkgIiwKKwkJCSAgICAgImRvZXMgbm90IGV4aXN0OiAoJGVycm5vKTogIiwKKwkJCSAgICAgJGVyci0+ZXhwYW5kZWRfbWVzc2FnZSwiXG4iOworCQkJJGlnbm9yZWRfZXJyeyRlcnJfa2V5fSA9IDE7CisJCX0KKwkJcmV0dXJuOworCX0KKwlkaWUgIkVycm9yIGZyb20gU1ZOLCAoJGVycm5vKTogIiwgJGVyci0+ZXhwYW5kZWRfbWVzc2FnZSwiXG4iOworfQorCisjIHN2bl9sb2dfY2hhbmdlZF9wYXRoX3Qgb2JqZWN0cyBwYXNzZWQgdG8gZ2V0X2xvZyBhcmUgbGlrZWx5IHRvIGJlCisjIG92ZXJ3cml0dGVuIGV2ZW4gaWYgb25seSB0aGUgcmVmcyBhcmUgY29waWVkIHRvIGFuIGV4dGVybmFsIHZhcmlhYmxlLAorIyBzbyB3ZSBzaG91bGQgZHVwIHRoZSBzdHJ1Y3R1cmVzIGluIHRoZWlyIGVudGlyZXR5LiAgVXNpbmcgYW4gZXh0ZXJuYWxseQorIyBwYXNzZWQgcG9vbCAoaW5zdGVhZCBvZiBvdXIgdGVtcG9yYXJ5IGFuZCBxdWlja2x5IGNsZWFyZWQgcG9vbCBpbgorIyBHaXQ6OlNWTjo6UmEpIGRvZXMgbm90IGhlbHAgbWF0dGVycyBhdCBhbGwuLi4KK3N1YiBkdXBfY2hhbmdlZF9wYXRocyB7CisJbXkgKCRwYXRocykgPSBAXzsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzICRwYXRoczsKKwlteSAlcmV0OworCWZvcmVhY2ggbXkgJHAgKGtleXMgJSRwYXRocykgeworCQlteSAkaSA9ICRwYXRocy0+eyRwfTsKKwkJbXkgJXMgPSBtYXAgeyAkXyA9PiAkaS0+JF8gfQorCQkgICAgICAgICAgICAgIHF3L2NvcHlmcm9tX3BhdGggY29weWZyb21fcmV2IGFjdGlvbi87CisJCSRyZXR7JHB9ID0gXCVzOworCX0KKwlcJXJldDsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6TG9nOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBQT1NJWCBxdy9zdHJmdGltZS87Cit1c2UgdmFycyBxdy8kVFogJGxpbWl0ICRjb2xvciAkcGFnZXIgJG5vbl9yZWN1cnNpdmUgJHZlcmJvc2UgJG9uZWxpbmUKKyAgICAgICAgICAgICVydXNlcnMgJHNob3dfY29tbWl0ICRpbmNyZW1lbnRhbC87CitteSAkbF9mbXQ7CisKK3N1YiBjbXRfc2hvd2FibGUgeworCW15ICgkYykgPSBAXzsKKwlyZXR1cm4gMSBpZiBkZWZpbmVkICRjLT57cn07CisKKwkjIGJpZyBjb21taXQgbWVzc2FnZSBnb3QgdHJ1bmNhdGVkIGJ5IHRoZSAxNmsgcHJldHR5IGJ1ZmZlciBpbiByZXYtbGlzdAorCWlmICgkYy0+e2x9ICYmICRjLT57bH0tPlstMV0gZXEgIi4uLlxuIiAmJgorCQkJCSRjLT57YV9yYXd9ID1+IC9cQChbYS1mXGRcLV0rKT4kLykgeworCQlAeyRjLT57bH19ID0gKCk7CisJCW15IEBsb2cgPSBjb21tYW5kKHF3L2NhdC1maWxlIGNvbW1pdC8sICRjLT57Y30pOworCisJCSMgc2hpZnQgb2ZmIHRoZSBoZWFkZXJzCisJCXNoaWZ0IEBsb2cgd2hpbGUgKCRsb2dbMF0gbmUgJycpOworCQlzaGlmdCBAbG9nOworCisJCSMgVE9ETzogbWFrZSAkYy0+e2x9IG5vdCBoYXZlIGEgdHJhaWxpbmcgbmV3bGluZSBpbiB0aGUgZnV0dXJlCisJCUB7JGMtPntsfX0gPSBtYXAgeyAiJF9cbiIgfSBncmVwICEvXmdpdC1zdm4taWQ6IC8sIEBsb2c7CisKKwkJKHVuZGVmLCAkYy0+e3J9LCB1bmRlZikgPSA6OmV4dHJhY3RfbWV0YWRhdGEoCisJCQkJKGdyZXAoL15naXQtc3ZuLWlkOiAvLCBAbG9nKSlbLTFdKTsKKwl9CisJcmV0dXJuIGRlZmluZWQgJGMtPntyfTsKK30KKworc3ViIGxvZ191c2VfY29sb3IgeworCXJldHVybiAxIGlmICRjb2xvcjsKKwlteSAoJGRjLCAkZGN2YXIpOworCSRkY3ZhciA9ICdjb2xvci5kaWZmJzsKKwkkZGMgPSBgZ2l0LWNvbmZpZyAtLWdldCAkZGN2YXJgOworCWlmICgkZGMgZXEgJycpIHsKKwkJIyBub3RoaW5nIGF0IGFsbDsgZmFsbGJhY2sgdG8gImRpZmYuY29sb3IiCisJCSRkY3ZhciA9ICdkaWZmLmNvbG9yJzsKKwkJJGRjID0gYGdpdC1jb25maWcgLS1nZXQgJGRjdmFyYDsKKwl9CisJY2hvbXAoJGRjKTsKKwlpZiAoJGRjIGVxICdhdXRvJykgeworCQlteSAkcGM7CisJCSRwYyA9IGBnaXQtY29uZmlnIC0tZ2V0IGNvbG9yLnBhZ2VyYDsKKwkJaWYgKCRwYyBlcSAnJykgeworCQkJIyBkb2VzIG5vdCBoYXZlIGl0IC0tIGZhbGxiYWNrIHRvIHBhZ2VyLmNvbG9yCisJCQkkcGMgPSBgZ2l0LWNvbmZpZyAtLWJvb2wgLS1nZXQgcGFnZXIuY29sb3JgOworCQl9CisJCWVsc2UgeworCQkJJHBjID0gYGdpdC1jb25maWcgLS1ib29sIC0tZ2V0IGNvbG9yLnBhZ2VyYDsKKwkJCWlmICgkPykgeworCQkJCSRwYyA9ICdmYWxzZSc7CisJCQl9CisJCX0KKwkJY2hvbXAoJHBjKTsKKwkJaWYgKC10ICpTVERPVVQgfHwgKGRlZmluZWQgJHBhZ2VyICYmICRwYyBlcSAndHJ1ZScpKSB7CisJCQlyZXR1cm4gKCRFTlZ7VEVSTX0gJiYgJEVOVntURVJNfSBuZSAnZHVtYicpOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMCBpZiAkZGMgZXEgJ25ldmVyJzsKKwlyZXR1cm4gMSBpZiAkZGMgZXEgJ2Fsd2F5cyc7CisJY2hvbXAoJGRjID0gYGdpdC1jb25maWcgLS1ib29sIC0tZ2V0ICRkY3ZhcmApOworCXJldHVybiAoJGRjIGVxICd0cnVlJyk7Cit9CisKK3N1YiBnaXRfc3ZuX2xvZ19jbWQgeworCW15ICgkcl9taW4sICRyX21heCwgQGFyZ3MpID0gQF87CisJbXkgJGhlYWQgPSAnSEVBRCc7CisJZm9yZWFjaCBteSAkeCAoQGFyZ3MpIHsKKwkJbGFzdCBpZiAkeCBlcSAnLS0nOworCQluZXh0IHVubGVzcyA6OnZlcmlmeV9yZWYoIiR4XjAiKTsKKwkJJGhlYWQgPSAkeDsKKwkJbGFzdDsKKwl9CisKKwlteSAoJHVybCwgJHJldiwgJHV1aWQsICRncykgPSA6OndvcmtpbmdfaGVhZF9pbmZvKCRoZWFkKTsKKwkkZ3MgfHw9IEdpdDo6U1ZOLT5fbmV3OworCW15IEBjbWQgPSAocXcvbG9nIC0tYWJicmV2LWNvbW1pdCAtLXByZXR0eT1yYXcgLS1kZWZhdWx0LywKKwkgICAgICAgICAgICRncy0+cmVmbmFtZSk7CisJcHVzaCBAY21kLCAnLXInIHVubGVzcyAkbm9uX3JlY3Vyc2l2ZTsKKwlwdXNoIEBjbWQsIHF3Ly0tcmF3IC0tbmFtZS1zdGF0dXMvIGlmICR2ZXJib3NlOworCXB1c2ggQGNtZCwgJy0tY29sb3InIGlmIGxvZ191c2VfY29sb3IoKTsKKwlyZXR1cm4gQGNtZCB1bmxlc3MgZGVmaW5lZCAkcl9tYXg7CisJaWYgKCRyX21heCA9PSAkcl9taW4pIHsKKwkJcHVzaCBAY21kLCAnLS1tYXgtY291bnQ9MSc7CisJCWlmIChteSAkYyA9ICRncy0+cmV2X2RiX2dldCgkcl9tYXgpKSB7CisJCQlwdXNoIEBjbWQsICRjOworCQl9CisJfSBlbHNlIHsKKwkJbXkgKCRjX21pbiwgJGNfbWF4KTsKKwkJJGNfbWF4ID0gJGdzLT5yZXZfZGJfZ2V0KCRyX21heCk7CisJCSRjX21pbiA9ICRncy0+cmV2X2RiX2dldCgkcl9taW4pOworCQlpZiAoZGVmaW5lZCAkY19taW4gJiYgZGVmaW5lZCAkY19tYXgpIHsKKwkJCWlmICgkcl9tYXggPiAkcl9tYXgpIHsKKwkJCQlwdXNoIEBjbWQsICIkY19taW4uLiRjX21heCI7CisJCQl9IGVsc2UgeworCQkJCXB1c2ggQGNtZCwgIiRjX21heC4uJGNfbWluIjsKKwkJCX0KKwkJfSBlbHNpZiAoJHJfbWF4ID4gJHJfbWluKSB7CisJCQlwdXNoIEBjbWQsICRjX21heDsKKwkJfSBlbHNlIHsKKwkJCXB1c2ggQGNtZCwgJGNfbWluOworCQl9CisJfQorCXJldHVybiBAY21kOworfQorCisjIGFkYXB0ZWQgZnJvbSBwYWdlci5jCitzdWIgY29uZmlnX3BhZ2VyIHsKKwkkcGFnZXIgfHw9ICRFTlZ7R0lUX1BBR0VSfSB8fCAkRU5We1BBR0VSfTsKKwlpZiAoIWRlZmluZWQgJHBhZ2VyKSB7CisJCSRwYWdlciA9ICdsZXNzJzsKKwl9IGVsc2lmIChsZW5ndGggJHBhZ2VyID09IDAgfHwgJHBhZ2VyIGVxICdjYXQnKSB7CisJCSRwYWdlciA9IHVuZGVmOworCX0KK30KKworc3ViIHJ1bl9wYWdlciB7CisJcmV0dXJuIHVubGVzcyAtdCAqU1RET1VUOworCXBpcGUgbXkgJHJmZCwgbXkgJHdmZCBvciByZXR1cm47CisJZGVmaW5lZChteSAkcGlkID0gZm9yaykgb3IgOjpmYXRhbCAiQ2FuJ3QgZm9yazogJCFcbiI7CisJaWYgKCEkcGlkKSB7CisJCW9wZW4gU1RET1VULCAnPiYnLCAkd2ZkIG9yCisJCSAgICAgICAgICAgICAgICAgICAgIDo6ZmF0YWwgIkNhbid0IHJlZGlyZWN0IHRvIHN0ZG91dDogJCFcbiI7CisJCXJldHVybjsKKwl9CisJb3BlbiBTVERJTiwgJzwmJywgJHJmZCBvciA6OmZhdGFsICJDYW4ndCByZWRpcmVjdCBzdGRpbjogJCFcbiI7CisJJEVOVntMRVNTfSB8fD0gJ0ZSU1gnOworCWV4ZWMgJHBhZ2VyIG9yIDo6ZmF0YWwgIkNhbid0IHJ1biBwYWdlcjogJCEgKCRwYWdlcilcbiI7Cit9CisKK3N1YiB0el90b19zX29mZnNldCB7CisJbXkgKCR0eikgPSBAXzsKKwkkdHogPX4gcy8oXGRcZCkkLy87CisJcmV0dXJuICgkMSAqIDYwKSArICgkdHogKiAzNjAwKTsKK30KKworc3ViIGdldF9hdXRob3JfaW5mbyB7CisJbXkgKCRkZXN0LCAkYXV0aG9yLCAkdCwgJHR6KSA9IEBfOworCSRhdXRob3IgPX4gcy8oPzpeXHMqfFxzKiQpLy9nOworCSRkZXN0LT57YV9yYXd9ID0gJGF1dGhvcjsKKwlteSAkYXU7CisJaWYgKCQ6Ol9hdXRob3JzKSB7CisJCSRhdSA9ICRydXNlcnN7JGF1dGhvcn0gfHwgdW5kZWY7CisJfQorCWlmICghJGF1KSB7CisJCSgkYXUpID0gKCRhdXRob3IgPX4gLzwoW14+XSspXEBbXj5dKz4kLyk7CisJfQorCSRkZXN0LT57dH0gPSAkdDsKKwkkZGVzdC0+e3R6fSA9ICR0ejsKKwkkZGVzdC0+e2F9ID0gJGF1OworCSMgRGF0ZTo6UGFyc2UgaXNuJ3QgaW4gdGhlIHN0YW5kYXJkIFBlcmwgZGlzdHJvIDooCisJaWYgKCR0eiA9fiBzL15cKy8vKSB7CisJCSR0ICs9IHR6X3RvX3Nfb2Zmc2V0KCR0eik7CisJfSBlbHNpZiAoJHR6ID1+IHMvXlwtLy8pIHsKKwkJJHQgLT0gdHpfdG9fc19vZmZzZXQoJHR6KTsKKwl9CisJJGRlc3QtPnt0X3V0Y30gPSAkdDsKK30KKworc3ViIHByb2Nlc3NfY29tbWl0IHsKKwlteSAoJGMsICRyX21pbiwgJHJfbWF4LCAkZGVmZXIpID0gQF87CisJaWYgKGRlZmluZWQgJHJfbWluICYmIGRlZmluZWQgJHJfbWF4KSB7CisJCWlmICgkcl9taW4gPT0gJGMtPntyfSAmJiAkcl9taW4gPT0gJHJfbWF4KSB7CisJCQlzaG93X2NvbW1pdCgkYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMSBpZiAkcl9taW4gPT0gJHJfbWF4OworCQlpZiAoJHJfbWluIDwgJHJfbWF4KSB7CisJCQkjIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgcHJpbnQgb3JkZXIKKwkJCXJldHVybiAwIGlmIChkZWZpbmVkICRsaW1pdCAmJiAtLSRsaW1pdCA8IDApOworCQkJcHVzaCBAJGRlZmVyLCAkYzsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICgkcl9taW4gIT0gJHJfbWF4KSB7CisJCQlyZXR1cm4gMSBpZiAoJHJfbWluIDwgJGMtPntyfSk7CisJCQlyZXR1cm4gMSBpZiAoJHJfbWF4ID4gJGMtPntyfSk7CisJCX0KKwl9CisJcmV0dXJuIDAgaWYgKGRlZmluZWQgJGxpbWl0ICYmIC0tJGxpbWl0IDwgMCk7CisJc2hvd19jb21taXQoJGMpOworCXJldHVybiAxOworfQorCitzdWIgc2hvd19jb21taXQgeworCW15ICRjID0gc2hpZnQ7CisJaWYgKCRvbmVsaW5lKSB7CisJCW15ICR4ID0gIlxuIjsKKwkJaWYgKG15ICRsID0gJGMtPntsfSkgeworCQkJd2hpbGUgKCRsLT5bMF0gPX4gL15ccyokLykgeyBzaGlmdCBAJGwgfQorCQkJJHggPSAkbC0+WzBdOworCQl9CisJCSRsX2ZtdCB8fD0gJ0EnIC4gbGVuZ3RoKCRjLT57cn0pOworCQlwcmludCAncicscGFjaygkbF9mbXQsICRjLT57cn0pLCcgfCAnOworCQlwcmludCAiJGMtPntjfSB8ICIgaWYgJHNob3dfY29tbWl0OworCQlwcmludCAkeDsKKwl9IGVsc2UgeworCQlzaG93X2NvbW1pdF9ub3JtYWwoJGMpOworCX0KK30KKworc3ViIHNob3dfY29tbWl0X2NoYW5nZWRfcGF0aHMgeworCW15ICgkYykgPSBAXzsKKwlyZXR1cm4gdW5sZXNzICRjLT57Y2hhbmdlZH07CisJcHJpbnQgIkNoYW5nZWQgcGF0aHM6XG4iLCBAeyRjLT57Y2hhbmdlZH19OworfQorCitzdWIgc2hvd19jb21taXRfbm9ybWFsIHsKKwlteSAoJGMpID0gQF87CisJcHJpbnQgJy0nIHg3MiwgIlxuciRjLT57cn0gfCAiOworCXByaW50ICIkYy0+e2N9IHwgIiBpZiAkc2hvd19jb21taXQ7CisJcHJpbnQgIiRjLT57YX0gfCAiLCBzdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVMgJXogKCVhLCAlZCAlYiAlWSkiLAorCQkJCSBsb2NhbHRpbWUoJGMtPnt0X3V0Y30pKSwgJyB8ICc7CisJbXkgJG5yX2xpbmUgPSAwOworCisJaWYgKG15ICRsID0gJGMtPntsfSkgeworCQl3aGlsZSAoJGwtPlskIyRsXSBlcSAiXG4iICYmICQjJGwgPiAwCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgJGwtPlsoJCMkbCAtIDEpXSBlcSAiXG4iKSB7CisJCQlwb3AgQCRsOworCQl9CisJCSRucl9saW5lID0gc2NhbGFyIEAkbDsKKwkJaWYgKCEkbnJfbGluZSkgeworCQkJcHJpbnQgIjEgbGluZVxuXG5cbiI7CisJCX0gZWxzZSB7CisJCQlpZiAoJG5yX2xpbmUgPT0gMSkgeworCQkJCSRucl9saW5lID0gJzEgbGluZSc7CisJCQl9IGVsc2UgeworCQkJCSRucl9saW5lIC49ICcgbGluZXMnOworCQkJfQorCQkJcHJpbnQgJG5yX2xpbmUsICJcbiI7CisJCQlzaG93X2NvbW1pdF9jaGFuZ2VkX3BhdGhzKCRjKTsKKwkJCXByaW50ICJcbiI7CisJCQlwcmludCAkXyBmb3JlYWNoIEAkbDsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ICIxIGxpbmVcbiI7CisJCXNob3dfY29tbWl0X2NoYW5nZWRfcGF0aHMoJGMpOworCQlwcmludCAiXG4iOworCisJfQorCWZvcmVhY2ggbXkgJHggKHF3L3JhdyBzdGF0IGRpZmYvKSB7CisJCWlmICgkYy0+eyR4fSkgeworCQkJcHJpbnQgIlxuIjsKKwkJCXByaW50ICRfIGZvcmVhY2ggQHskYy0+eyR4fX0KKwkJfQorCX0KK30KKworc3ViIGNtZF9zaG93X2xvZyB7CisJbXkgKEBhcmdzKSA9IEBfOworCW15ICgkcl9taW4sICRyX21heCk7CisJbXkgJHJfbGFzdCA9IC0xOyAjIHByZXZlbnQgZHVwZXMKKwlpZiAoZGVmaW5lZCAkVFopIHsKKwkJJEVOVntUWn0gPSAkVFo7CisJfSBlbHNlIHsKKwkJZGVsZXRlICRFTlZ7VFp9OworCX0KKwlpZiAoZGVmaW5lZCAkOjpfcmV2aXNpb24pIHsKKwkJaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXihcZCspOihcZCspJC8pIHsKKwkJCSgkcl9taW4sICRyX21heCkgPSAoJDEsICQyKTsKKwkJfSBlbHNpZiAoJDo6X3JldmlzaW9uID1+IC9eXGQrJC8pIHsKKwkJCSRyX21pbiA9ICRyX21heCA9ICQ6Ol9yZXZpc2lvbjsKKwkJfSBlbHNlIHsKKwkJCTo6ZmF0YWwgIi1yJDo6X3JldmlzaW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSAiLAorCQkJCSJzdGFuZGFyZCBcJ2dpdCBsb2dcJyBhcmd1bWVudHMgaW5zdGVhZFxuIjsKKwkJfQorCX0KKworCWNvbmZpZ19wYWdlcigpOworCUBhcmdzID0gKGdpdF9zdm5fbG9nX2NtZCgkcl9taW4sICRyX21heCwgQGFyZ3MpLCBAYXJncyk7CisJbXkgJGxvZyA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoQGFyZ3MpOworCXJ1bl9wYWdlcigpOworCW15IChAaywgJGMsICRkLCAkc3RhdCk7CisJbXkgJGVzY19jb2xvciA9IHFyLyg/OlwwMzNcWyg/Oig/OlxkKzspKlxkKik/bSkqLzsKKwl3aGlsZSAoPCRsb2c+KSB7CisJCWlmICgvXiR7ZXNjX2NvbG9yfWNvbW1pdCAoJDo6c2hhMV9zaG9ydCkvbykgeworCQkJbXkgJGNtdCA9ICQxOworCQkJaWYgKCRjICYmIGNtdF9zaG93YWJsZSgkYykgJiYgJGMtPntyfSAhPSAkcl9sYXN0KSB7CisJCQkJJHJfbGFzdCA9ICRjLT57cn07CisJCQkJcHJvY2Vzc19jb21taXQoJGMsICRyX21pbiwgJHJfbWF4LCBcQGspIG9yCisJCQkJCQkJCWdvdG8gb3V0OworCQkJfQorCQkJJGQgPSB1bmRlZjsKKwkJCSRjID0geyBjID0+ICRjbXQgfTsKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn1hdXRob3IgKC4rKSAoXGQrKSAoW1wtXCtdP1xkKykkL28pIHsKKwkJCWdldF9hdXRob3JfaW5mbygkYywgJDEsICQyLCAkMyk7CisJCX0gZWxzaWYgKC9eJHtlc2NfY29sb3J9KD86dHJlZXxwYXJlbnR8Y29tbWl0dGVyKSAvbykgeworCQkJIyBpZ25vcmUKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn06XGR7Nn0gXGR7Nn0gJDo6c2hhMV9zaG9ydC9vKSB7CisJCQlwdXNoIEB7JGMtPntyYXd9fSwgJF87CisJCX0gZWxzaWYgKC9eJHtlc2NfY29sb3J9W0FDUk1EVF1cdC8pIHsKKwkJCSMgd2UgY291bGQgYWRkICRTVk4tPntzdm5fcGF0aH0gaGVyZSwgYnV0IHRoYXQgcmVxdWlyZXMKKwkJCSMgcmVtb3RlIGFjY2VzcyBhdCB0aGUgbW9tZW50IChyZXBvX3BhdGhfc3BsaXQpLi4uCisJCQlzI14oJHtlc2NfY29sb3J9KShbQUNSTURUXSlcdCMkMSAgICQyICNvOworCQkJcHVzaCBAeyRjLT57Y2hhbmdlZH19LCAkXzsKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn1kaWZmIC9vKSB7CisJCQkkZCA9IDE7CisJCQlwdXNoIEB7JGMtPntkaWZmfX0sICRfOworCQl9IGVsc2lmICgkZCkgeworCQkJcHVzaCBAeyRjLT57ZGlmZn19LCAkXzsKKwkJfSBlbHNpZiAoL15cIC4rXCBcfFxzKlxkK1wgJGVzY19jb2xvcltcK1wtXSoKKwkJICAgICAgICAgICRlc2NfY29sb3IqW1wrXC1dKiRlc2NfY29sb3IkL3gpIHsKKwkJCSRzdGF0ID0gMTsKKwkJCXB1c2ggQHskYy0+e3N0YXR9fSwgJF87CisJCX0gZWxzaWYgKCRzdGF0ICYmIC9eIFxkKyBmaWxlcyBjaGFuZ2VkLCBcZCsgaW5zZXJ0aW9ucy8pIHsKKwkJCXB1c2ggQHskYy0+e3N0YXR9fSwgJF87CisJCQkkc3RhdCA9IHVuZGVmOworCQl9IGVsc2lmICgvXiR7ZXNjX2NvbG9yfSAgICAoZ2l0LXN2bi1pZDouKykkL28pIHsKKwkJCSgkYy0+e3VybH0sICRjLT57cn0sIHVuZGVmKSA9IDo6ZXh0cmFjdF9tZXRhZGF0YSgkMSk7CisJCX0gZWxzaWYgKHMvXiR7ZXNjX2NvbG9yfSAgICAvL28pIHsKKwkJCXB1c2ggQHskYy0+e2x9fSwgJF87CisJCX0KKwl9CisJaWYgKCRjICYmIGRlZmluZWQgJGMtPntyfSAmJiAkYy0+e3J9ICE9ICRyX2xhc3QpIHsKKwkJJHJfbGFzdCA9ICRjLT57cn07CisJCXByb2Nlc3NfY29tbWl0KCRjLCAkcl9taW4sICRyX21heCwgXEBrKTsKKwl9CisJaWYgKEBrKSB7CisJCW15ICRzd2FwID0gJHJfbWF4OworCQkkcl9tYXggPSAkcl9taW47CisJCSRyX21pbiA9ICRzd2FwOworCQlwcm9jZXNzX2NvbW1pdCgkXywgJHJfbWluLCAkcl9tYXgpIGZvcmVhY2ggcmV2ZXJzZSBAazsKKwl9CitvdXQ6CisJY2xvc2UgJGxvZzsKKwlwcmludCAnLScgeDcyLCJcbiIgdW5sZXNzICRpbmNyZW1lbnRhbCB8fCAkb25lbGluZTsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6TWlncmF0aW9uOworIyB0aGVzZSB2ZXJzaW9uIG51bWJlcnMgZG8gTk9UIGNvcnJlc3BvbmQgdG8gYWN0dWFsIHZlcnNpb24gbnVtYmVycworIyBvZiBnaXQgbm9yIGdpdC1zdm4uICBUaGV5IGFyZSBqdXN0IHJlbGF0aXZlLgorIworIyB2MCBsYXlvdXQ6IC5naXQvJGlkL2luZm8vdXJsLCByZWZzL2hlYWRzLyRpZC1IRUFECisjCisjIHYxIGxheW91dDogLmdpdC8kaWQvaW5mby91cmwsIHJlZnMvcmVtb3Rlcy8kaWQKKyMKKyMgdjIgbGF5b3V0OiAuZ2l0L3N2bi8kaWQvaW5mby91cmwsIHJlZnMvcmVtb3Rlcy8kaWQKKyMKKyMgdjMgbGF5b3V0OiAuZ2l0L3N2bi8kaWQsIHJlZnMvcmVtb3Rlcy8kaWQKKyMgICAgICAgICAgICAtIGluZm8vdXJsIG1heSByZW1haW4gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisjICAgICAgICAgICAgLSB0aGlzIGlzIHdoYXQgd2UgbWlncmF0ZSB1cCB0byB0aGlzIGxheW91dCBhdXRvbWF0aWNhbGx5LAorIyAgICAgICAgICAgIC0gdGhpcyB3aWxsIGJlIHVzZWQgYnkgZ2l0IHN2biBpbml0IG9uIHNpbmdsZSBicmFuY2hlcworIyB2My4xIGxheW91dCAoYXV0byBtaWdyYXRlZCk6CisjICAgICAgICAgICAgLSAucmV2X2RiID0+IC5yZXZfZGIuJFVVSUQsIC5yZXZfZGIgd2lsbCByZW1haW4gYXMgYSBzeW1saW5rCisjICAgICAgICAgICAgICBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyMKKyMgdjQgbGF5b3V0OiAuZ2l0L3N2bi8kcmVwb19pZC8kaWQsIHJlZnMvcmVtb3Rlcy8kcmVwb19pZC8kaWQKKyMgICAgICAgICAgICAtIHRoaXMgaXMgb25seSBjcmVhdGVkIGZvciBuZXdseSBtdWx0aS1pbml0LWVkCisjICAgICAgICAgICAgICByZXBvc2l0b3JpZXMuICBTaW1pbGFyIGluIHNwaXJpdCB0byB0aGUKKyMgICAgICAgICAgICAgIC0tdXNlLXNlcGFyYXRlLXJlbW90ZXMgb3B0aW9uIGluIGdpdC1jbG9uZSAobm93IGRlZmF1bHQpCisjICAgICAgICAgICAgLSB3ZSBkbyBub3QgYXV0b21hdGljYWxseSBtaWdyYXRlIHRvIHRoaXMgKGZvbGxvd2luZworIyAgICAgICAgICAgICAgdGhlIGV4YW1wbGUgc2V0IGJ5IGNvcmUgZ2l0KQordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBGaWxlOjpQYXRoIHF3L21rcGF0aC87Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcvZGlybmFtZSBiYXNlbmFtZS87Cit1c2UgdmFycyBxdy8kX21pbmltaXplLzsKKworc3ViIG1pZ3JhdGVfZnJvbV92MCB7CisJbXkgJGdpdF9kaXIgPSAkRU5We0dJVF9ESVJ9OworCXJldHVybiB1bmRlZiB1bmxlc3MgLWQgJGdpdF9kaXI7CisJbXkgKCRmaCwgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKHF3L3Jldi1wYXJzZSAtLXN5bWJvbGljIC0tYWxsLyk7CisJbXkgJG1pZ3JhdGVkID0gMDsKKwl3aGlsZSAoPCRmaD4pIHsKKwkJY2hvbXA7CisJCW15ICgkaWQsICRvcmlnX3JlZikgPSAoJF8sICRfKTsKKwkJbmV4dCB1bmxlc3MgJGlkID1+IHMjXnJlZnMvaGVhZHMvKC4rKS1IRUFEJCMkMSM7CisJCW5leHQgdW5sZXNzIC1mICIkZ2l0X2Rpci8kaWQvaW5mby91cmwiOworCQlteSAkbmV3X3JlZiA9ICJyZWZzL3JlbW90ZXMvJGlkIjsKKwkJaWYgKDo6dmVyaWZ5X3JlZigiJG5ld19yZWZeMCIpKSB7CisJCQlwcmludCBTVERFUlIgIlc6ICRvcmlnX3JlZiBpcyBwcm9iYWJseSBhbiBvbGQgIiwKKwkJCSAgICAgICAgICAgICAiYnJhbmNoIHVzZWQgYnkgYW4gYW5jaWVudCB2ZXJzaW9uIG9mICIsCisJCQkJICAgICAiZ2l0LXN2bi5cbiIsCisJCQkJICAgICAiSG93ZXZlciwgJG5ld19yZWYgYWxzbyBleGlzdHMuXG4iLAorCQkJCSAgICAgIldlIHdpbGwgbm90IGJlIGFibGUgIiwKKwkJCQkgICAgICJ0byB1c2UgdGhpcyBicmFuY2ggdW50aWwgdGhpcyAiLAorCQkJCSAgICAgImFtYmlndWl0eSBpcyByZXNvbHZlZC5cbiI7CisJCQluZXh0OworCQl9CisJCXByaW50IFNUREVSUiAiTWlncmF0aW5nIGZyb20gdjAgbGF5b3V0Li4uXG4iIGlmICEkbWlncmF0ZWQ7CisJCXByaW50IFNUREVSUiAiUmVuYW1pbmcgcmVmOiAkb3JpZ19yZWYgPT4gJG5ld19yZWZcbiI7CisJCWNvbW1hbmRfbm9pc3koJ3VwZGF0ZS1yZWYnLCAkbmV3X3JlZiwgJG9yaWdfcmVmKTsKKwkJY29tbWFuZF9ub2lzeSgndXBkYXRlLXJlZicsICctZCcsICRvcmlnX3JlZiwgJG9yaWdfcmVmKTsKKwkJJG1pZ3JhdGVkKys7CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCXByaW50IFNUREVSUiAiRG9uZSBtaWdyYXRpbmcgZnJvbSB2MCBsYXlvdXQuLi5cbiIgaWYgJG1pZ3JhdGVkOworCSRtaWdyYXRlZDsKK30KKworc3ViIG1pZ3JhdGVfZnJvbV92MSB7CisJbXkgJGdpdF9kaXIgPSAkRU5We0dJVF9ESVJ9OworCW15ICRtaWdyYXRlZCA9IDA7CisJcmV0dXJuICRtaWdyYXRlZCB1bmxlc3MgLWQgJGdpdF9kaXI7CisJbXkgJHN2bl9kaXIgPSAiJGdpdF9kaXIvc3ZuIjsKKworCSMganVzdCBpbiBjYXNlIHNvbWVib2R5IHVzZWQgJ3N2bicgYXMgdGhlaXIgJGlkIGF0IHNvbWUgcG9pbnQuLi4KKwlyZXR1cm4gJG1pZ3JhdGVkIGlmIC1kICRzdm5fZGlyICYmICEgLWYgIiRzdm5fZGlyL2luZm8vdXJsIjsKKworCXByaW50IFNUREVSUiAiTWlncmF0aW5nIGZyb20gYSBnaXQtc3ZuIHYxIGxheW91dC4uLlxuIjsKKwlta3BhdGgoWyRzdm5fZGlyXSk7CisJcHJpbnQgU1RERVJSICJEYXRhIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIGdpdC1zdm4gZXhpc3RzLCBidXRcblx0IiwKKwkgICAgICAgICAgICAgIiRzdm5fZGlyXG5cdChyZXF1aXJlZCBmb3IgdGhpcyB2ZXJzaW9uICIsCisJICAgICAgICAgICAgICIoJDo6VkVSU0lPTikgb2YgZ2l0LXN2bikgZG9lcyBub3QuIGV4aXN0XG4iOworCW15ICgkZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShxdy9yZXYtcGFyc2UgLS1zeW1ib2xpYyAtLWFsbC8pOworCXdoaWxlICg8JGZoPikgeworCQlteSAkeCA9ICRfOworCQluZXh0IHVubGVzcyAkeCA9fiBzI15yZWZzL3JlbW90ZXMvIyM7CisJCWNob21wICR4OworCQluZXh0IHVubGVzcyAtZiAiJGdpdF9kaXIvJHgvaW5mby91cmwiOworCQlteSAkdSA9IGV2YWwgeyA6OmZpbGVfdG9fcygiJGdpdF9kaXIvJHgvaW5mby91cmwiKSB9OworCQluZXh0IHVubGVzcyAkdTsKKwkJbXkgJGRuID0gZGlybmFtZSgiJGdpdF9kaXIvc3ZuLyR4Iik7CisJCW1rcGF0aChbJGRuXSkgdW5sZXNzIC1kICRkbjsKKwkJaWYgKCR4IGVxICdzdm4nKSB7ICMgdGhleSB1c2VkICdzdm4nIGFzIEdJVF9TVk5fSUQ6CisJCQlta3BhdGgoWyIkZ2l0X2Rpci9zdm4vc3ZuIl0pOworCQkJcHJpbnQgU1RERVJSICIgLSAkZ2l0X2Rpci8keC9pbmZvID0+ICIsCisJCQkgICAgICAgICAgICAgICAgIiRnaXRfZGlyL3N2bi8keC9pbmZvXG4iOworCQkJcmVuYW1lICIkZ2l0X2Rpci8keC9pbmZvIiwgIiRnaXRfZGlyL3N2bi8keC9pbmZvIiBvcgorCQkJICAgICAgIGNyb2FrICIkITogJHgiOworCQkJIyBkb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCB0aGVzZSwgdGhleSBwcm9iYWJseQorCQkJIyBkb24ndCBleGlzdCB3aXRoIHJlcG9zIHRoaXMgb2xkIChzYXZlIGZvciBpbmRleCwKKwkJCSMgYW5kIHdlIGNhbiBlYXNpbHkgcmVnZW5lcmF0ZSB0aGF0KQorCQkJZm9yZWFjaCBteSAkZiAocXcvdW5oYW5kbGVkLmxvZyBpbmRleCAucmV2X2RiLykgeworCQkJCXJlbmFtZSAiJGdpdF9kaXIvJHgvJGYiLCAiJGdpdF9kaXIvc3ZuLyR4LyRmIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50IFNUREVSUiAiIC0gJGdpdF9kaXIvJHggPT4gJGdpdF9kaXIvc3ZuLyR4XG4iOworCQkJcmVuYW1lICIkZ2l0X2Rpci8keCIsICIkZ2l0X2Rpci9zdm4vJHgiIG9yCisJCQkgICAgICAgY3JvYWsgIiQhOiAkeCI7CisJCX0KKwkJJG1pZ3JhdGVkKys7CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCXByaW50IFNUREVSUiAiRG9uZSBtaWdyYXRpbmcgZnJvbSBhIGdpdC1zdm4gdjEgbGF5b3V0XG4iOworCSRtaWdyYXRlZDsKK30KKworc3ViIHJlYWRfb2xkX3VybHMgeworCW15ICgkbF9tYXAsICRwZngsICRwYXRoKSA9IEBfOworCW15IEBkaXI7CisJZm9yZWFjaCAoPCRwYXRoLyo+KSB7CisJCWlmICgtciAiJF8vaW5mby91cmwiKSB7CisJCQkkcGZ4IC49ICcvJyBpZiAkcGZ4ICYmICRwZnggIX4gbSEvJCE7CisJCQlteSAkcmVmX2lkID0gJHBmeCAuIGJhc2VuYW1lICRfOworCQkJbXkgJHVybCA9IDo6ZmlsZV90b19zKCIkXy9pbmZvL3VybCIpOworCQkJJGxfbWFwLT57JHJlZl9pZH0gPSAkdXJsOworCQl9IGVsc2lmICgtZCAkXykgeworCQkJcHVzaCBAZGlyLCAkXzsKKwkJfQorCX0KKwlmb3JlYWNoIChAZGlyKSB7CisJCW15ICR4ID0gJF87CisJCSR4ID1+IHMhXlxRJEVOVntHSVRfRElSfVxFL3N2bi8hIW87CisJCXJlYWRfb2xkX3VybHMoJGxfbWFwLCAkeCwgJF8pOworCX0KK30KKworc3ViIG1pZ3JhdGVfZnJvbV92MiB7CisJbXkgQGNmZyA9IGNvbW1hbmQocXcvY29uZmlnIC1sLyk7CisJcmV0dXJuIGlmIGdyZXAgL15zdm4tcmVtb3RlXC4uK1wudXJsPS8sIEBjZmc7CisJbXkgJWxfbWFwOworCXJlYWRfb2xkX3VybHMoXCVsX21hcCwgJycsICIkRU5We0dJVF9ESVJ9L3N2biIpOworCW15ICRtaWdyYXRlZCA9IDA7CisKKwlmb3JlYWNoIG15ICRyZWZfaWQgKHNvcnQga2V5cyAlbF9tYXApIHsKKwkJZXZhbCB7IEdpdDo6U1ZOLT5pbml0KCRsX21hcHskcmVmX2lkfSwgJycsIHVuZGVmLCAkcmVmX2lkKSB9OworCQlpZiAoJEApIHsKKwkJCUdpdDo6U1ZOLT5pbml0KCRsX21hcHskcmVmX2lkfSwgJycsICRyZWZfaWQsICRyZWZfaWQpOworCQl9CisJCSRtaWdyYXRlZCsrOworCX0KKwkkbWlncmF0ZWQ7Cit9CisKK3N1YiBtaW5pbWl6ZV9jb25uZWN0aW9ucyB7CisJbXkgJHIgPSBHaXQ6OlNWTjo6cmVhZF9hbGxfcmVtb3RlcygpOworCW15ICRuZXdfdXJscyA9IHt9OworCW15ICRyb290X3JlcG9zID0ge307CisJZm9yZWFjaCBteSAkcmVwb19pZCAoa2V5cyAlJHIpIHsKKwkJbXkgJHVybCA9ICRyLT57JHJlcG9faWR9LT57dXJsfSBvciBuZXh0OworCQlteSAkZmV0Y2ggPSAkci0+eyRyZXBvX2lkfS0+e2ZldGNofSBvciBuZXh0OworCQlteSAkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkdXJsKTsKKworCQkjIHNraXAgZXhpc3RpbmcgY2FzZXMgd2hlcmUgd2UgYWxyZWFkeSBjb25uZWN0IHRvIHRoZSByb290CisJCWlmICgoJHJhLT57dXJsfSBlcSAkcmEtPntyZXBvc19yb290fSkgfHwKKwkJICAgIChHaXQ6OlNWTjo6c2FuaXRpemVfcmVtb3RlX25hbWUoJHJhLT57cmVwb3Nfcm9vdH0pIGVxCisJCSAgICAgJHJlcG9faWQpKSB7CisJCQkkcm9vdF9yZXBvcy0+eyRyYS0+e3VybH19ID0gJHJlcG9faWQ7CisJCQluZXh0OworCQl9CisKKwkJbXkgJHJvb3RfcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkcmEtPntyZXBvc19yb290fSk7CisJCW15ICRyb290X3BhdGggPSAkcmEtPnt1cmx9OworCQkkcm9vdF9wYXRoID1+IHMjXlxRJHJhLT57cmVwb3Nfcm9vdH1cRSgvfCQpIyM7CisJCWZvcmVhY2ggbXkgJHBhdGggKGtleXMgJSRmZXRjaCkgeworCQkJbXkgJHJlZl9pZCA9ICRmZXRjaC0+eyRwYXRofTsKKwkJCW15ICRncyA9IEdpdDo6U1ZOLT5uZXcoJHJlZl9pZCwgJHJlcG9faWQsICRwYXRoKTsKKworCQkJIyBtYWtlIHN1cmUgd2UgY2FuIHJlYWQgd2hlbiBjb25uZWN0aW5nIHRvCisJCQkjIGEgaGlnaGVyIGxldmVsIG9mIGEgcmVwb3NpdG9yeQorCQkJbXkgKCRsYXN0X3JldiwgdW5kZWYpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJCQlpZiAoIWRlZmluZWQgJGxhc3RfcmV2KSB7CisJCQkJJGxhc3RfcmV2ID0gZXZhbCB7CisJCQkJCSRyb290X3JhLT5nZXRfbGF0ZXN0X3Jldm51bTsKKwkJCQl9OworCQkJCW5leHQgaWYgJEA7CisJCQl9CisJCQlteSAkbmV3ID0gJHJvb3RfcGF0aDsKKwkJCSRuZXcgLj0gbGVuZ3RoICRwYXRoID8gIi8kcGF0aCIgOiAnJzsKKwkJCWV2YWwgeworCQkJCSRyb290X3JhLT5nZXRfbG9nKFskbmV3XSwgJGxhc3RfcmV2LCAkbGFzdF9yZXYsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsIHN1YiB7IH0pOworCQkJfTsKKwkJCW5leHQgaWYgJEA7CisJCQkkbmV3X3VybHMtPnskcmEtPntyZXBvc19yb290fX0tPnskbmV3fSA9CisJCQkgICAgICAgIHsgcmVmX2lkID0+ICRyZWZfaWQsCisJCQkJICBvbGRfcmVwb19pZCA9PiAkcmVwb19pZCwKKwkJCQkgIG9sZF9wYXRoID0+ICRwYXRoIH07CisJCX0KKwl9CisKKwlteSBAZW1wdGllZDsKKwlmb3JlYWNoIG15ICR1cmwgKGtleXMgJSRuZXdfdXJscykgeworCQkjIHNlZSBpZiB3ZSBjYW4gcmUtdXNlIGFuIGV4aXN0aW5nIFtzdm4tcmVtb3RlICJyZXBvX2lkIl0KKwkJIyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEobiB1Z2x5KSBuZXcgc2VjdGlvbjoKKwkJbXkgJHJlcG9faWQgPSAkcm9vdF9yZXBvcy0+eyR1cmx9IHx8CisJCSAgICAgICAgICAgICAgR2l0OjpTVk46OnNhbml0aXplX3JlbW90ZV9uYW1lKCR1cmwpOworCisJCW15ICRmZXRjaCA9ICRuZXdfdXJscy0+eyR1cmx9OworCQlmb3JlYWNoIG15ICRwYXRoIChrZXlzICUkZmV0Y2gpIHsKKwkJCW15ICR4ID0gJGZldGNoLT57JHBhdGh9OworCQkJR2l0OjpTVk4tPmluaXQoJHVybCwgJHBhdGgsICRyZXBvX2lkLCAkeC0+e3JlZl9pZH0pOworCQkJbXkgJHBmeCA9ICJzdm4tcmVtb3RlLiR4LT57b2xkX3JlcG9faWR9IjsKKworCQkJbXkgJG9sZF9mZXRjaCA9IHF1b3RlbWV0YSgiJHgtPntvbGRfcGF0aH06Ii4KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZnMvcmVtb3Rlcy8keC0+e3JlZl9pZH0iKTsKKwkJCWNvbW1hbmRfbm9pc3kocXcvY29uZmlnIC0tdW5zZXQvLAorCQkJICAgICAgICAgICAgICAiJHBmeC5mZXRjaCIsICdeJy4gJG9sZF9mZXRjaCAuICckJyk7CisJCQlkZWxldGUgJHItPnskeC0+e29sZF9yZXBvX2lkfX0tPgorCQkJICAgICAgIHtmZXRjaH0tPnskeC0+e29sZF9wYXRofX07CisJCQlpZiAoIWtleXMgJXskci0+eyR4LT57b2xkX3JlcG9faWR9fS0+e2ZldGNofX0pIHsKKwkJCQljb21tYW5kX25vaXN5KHF3L2NvbmZpZyAtLXVuc2V0LywKKwkJCQkgICAgICAgICAgICAgICIkcGZ4LnVybCIpOworCQkJCXB1c2ggQGVtcHRpZWQsICR4LT57b2xkX3JlcG9faWR9CisJCQl9CisJCX0KKwl9CisJaWYgKEBlbXB0aWVkKSB7CisJCW15ICRmaWxlID0gJEVOVntHSVRfQ09ORklHfSB8fCAkRU5We0dJVF9DT05GSUdfTE9DQUx9IHx8CisJCSAgICAgICAgICAgIiRFTlZ7R0lUX0RJUn0vY29uZmlnIjsKKwkJcHJpbnQgU1RERVJSIDw8RU9GOworVGhlIGZvbGxvd2luZyBbc3ZuLXJlbW90ZV0gc2VjdGlvbnMgaW4geW91ciBjb25maWcgZmlsZSAoJGZpbGUpIGFyZSBlbXB0eQorYW5kIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZDoKK0VPRgorCQlwcmludCBTVERFUlIgIltzdm4tcmVtb3RlIFwiJF9cIl1cbiIgZm9yZWFjaCBAZW1wdGllZDsKKwl9Cit9CisKK3N1YiBtaWdyYXRpb25fY2hlY2sgeworCW1pZ3JhdGVfZnJvbV92MCgpOworCW1pZ3JhdGVfZnJvbV92MSgpOworCW1pZ3JhdGVfZnJvbV92MigpOworCW1pbmltaXplX2Nvbm5lY3Rpb25zKCkgaWYgJF9taW5pbWl6ZTsKK30KKworcGFja2FnZSBHaXQ6OkluZGV4SW5mbzsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2l0IHF3L2NvbW1hbmRfaW5wdXRfcGlwZSBjb21tYW5kX2Nsb3NlX3BpcGUvOworCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzKSA9IEBfOworCW15ICgkZ3VpLCAkY3R4KSA9IGNvbW1hbmRfaW5wdXRfcGlwZShxdy91cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvLyk7CisJYmxlc3MgeyBndWkgPT4gJGd1aSwgY3R4ID0+ICRjdHgsIG5yID0+IDB9LCAkY2xhc3M7Cit9CisKK3N1YiByZW1vdmUgeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJaWYgKHByaW50IHsgJHNlbGYtPntndWl9IH0gJzAgJywgMCB4IDQwLCAiXHQiLCAkcGF0aCwgIlwwIikgeworCQlyZXR1cm4gKyskc2VsZi0+e25yfTsKKwl9CisJdW5kZWY7Cit9CisKK3N1YiB1cGRhdGUgeworCW15ICgkc2VsZiwgJG1vZGUsICRoYXNoLCAkcGF0aCkgPSBAXzsKKwlpZiAocHJpbnQgeyAkc2VsZi0+e2d1aX0gfSAkbW9kZSwgJyAnLCAkaGFzaCwgIlx0IiwgJHBhdGgsICJcMCIpIHsKKwkJcmV0dXJuICsrJHNlbGYtPntucn07CisJfQorCXVuZGVmOworfQorCitzdWIgREVTVFJPWSB7CisJbXkgKCRzZWxmKSA9IEBfOworCWNvbW1hbmRfY2xvc2VfcGlwZSgkc2VsZi0+e2d1aX0sICRzZWxmLT57Y3R4fSk7Cit9CisKK3BhY2thZ2UgR2l0OjpTVk46Okdsb2JTcGVjOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisJbXkgKCRjbGFzcywgJGdsb2IpID0gQF87CisJbXkgJHJlID0gJGdsb2I7CisJJHJlID1+IHMhLyskISFnOyAjIG5vIG5lZWQgZm9yIHRyYWlsaW5nIHNsYXNoZXMKKwlteSAkbnIgPSAoJHJlID1+IHMhXiguKilcKiguKikkIVwoXFteL1xdK1wpIWcpOworCW15ICgkbGVmdCwgJHJpZ2h0KSA9ICgkMSwgJDIpOworCWlmICgkbnIgPiAxKSB7CisJCWRpZSAiT25seSBvbmUgJyonIHdpbGRjYXJkIGV4cGFuc2lvbiAiLAorCQkgICAgImlzIHN1cHBvcnRlZCAoZ290ICRucik6ICckZ2xvYidcbiI7CisJfSBlbHNpZiAoJG5yID09IDApIHsKKwkJZGllICJPbmUgJyonIGlzIG5lZWRlZCBmb3IgZ2xvYjogJyRnbG9iJ1xuIjsKKwl9CisJJHJlID0gcXVvdGVtZXRhKCRsZWZ0KSAuICRyZSAuIHF1b3RlbWV0YSgkcmlnaHQpOworCWlmIChsZW5ndGggJGxlZnQgJiYgISgkbGVmdCA9fiBzIS8rJCEhZykpIHsKKwkJZGllICJNaXNzaW5nIHRyYWlsaW5nICcvJyBvbiBsZWZ0IHNpZGUgb2Y6ICckZ2xvYicgKCRsZWZ0KVxuIjsKKwl9CisJaWYgKGxlbmd0aCAkcmlnaHQgJiYgISgkcmlnaHQgPX4gcyFeLyshIWcpKSB7CisJCWRpZSAiTWlzc2luZyBsZWFkaW5nICcvJyBvbiByaWdodCBzaWRlIG9mOiAnJGdsb2InICgkcmlnaHQpXG4iOworCX0KKwlteSAkbGVmdF9yZSA9IHFyL15cL1xRJGxlZnRcRShcL3wkKS87CisJYmxlc3MgeyBsZWZ0ID0+ICRsZWZ0LCByaWdodCA9PiAkcmlnaHQsIGxlZnRfcmVnZXggPT4gJGxlZnRfcmUsCisJICAgICAgICByZWdleCA9PiBxci8kcmUvLCBnbG9iID0+ICRnbG9iIH0sICRjbGFzczsKK30KKworc3ViIGZ1bGxfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwlyZXR1cm4gKGxlbmd0aCAkc2VsZi0+e2xlZnR9ID8gIiRzZWxmLT57bGVmdH0vIiA6ICcnKSAuCisJICAgICAgICRwYXRoIC4gKGxlbmd0aCAkc2VsZi0+e3JpZ2h0fSA/ICIvJHNlbGYtPntyaWdodH0iIDogJycpOworfQorCitfX0VORF9fCisKK0RhdGEgc3RydWN0dXJlczoKKworCiskcmVtb3RlcyA9IHsgIyByZXR1cm5lZCBieSByZWFkX2FsbF9yZW1vdGVzKCkKKwknc3ZuJyA9PiB7CisJCSMgc3ZuLXJlbW90ZS5zdm4udXJsPWh0dHBzOi8vc3ZuLm11c2ljcGQub3JnCisJCXVybCA9PiAnaHR0cHM6Ly9zdm4ubXVzaWNwZC5vcmcnLAorCQkjIHN2bi1yZW1vdGUuc3ZuLmZldGNoPW1wZC90cnVuazp0cnVuaworCQlmZXRjaCA9PiB7CisJCQknbXBkL3RydW5rJyA9PiAndHJ1bmsnLAorCQl9LAorCQkjIHN2bi1yZW1vdGUuc3ZuLnRhZ3M9bXBkL3RhZ3MvKjp0YWdzLyoKKwkJdGFncyA9PiB7CisJCQlwYXRoID0+IHsKKwkJCQlsZWZ0ID0+ICdtcGQvdGFncycsCisJCQkJcmlnaHQgPT4gJycsCisJCQkJcmVnZXggPT4gcXIhbXBkL3RhZ3MvKFteL10rKSQhLAorCQkJCWdsb2IgPT4gJ3RhZ3MvKicsCisJCQl9LAorCQkJcmVmID0+IHsKKwkJCQlsZWZ0ID0+ICd0YWdzJywKKwkJCQlyaWdodCA9PiAnJywKKwkJCQlyZWdleCA9PiBxciF0YWdzLyhbXi9dKykkISwKKwkJCQlnbG9iID0+ICd0YWdzLyonLAorCQkJfSwKKwkJfQorCX0KK307CisKKyRsb2dfZW50cnkgaGFzaHJlZiBhcyByZXR1cm5lZCBieSBsaWJzdm5fbG9nX2VudHJ5KCkKK3sKKwlsb2cgPT4gJ3doaXRlc3BhY2UtZm9ybWF0dGVkIGxvZyBlbnRyeQorJywJCQkJCQkjIHRyYWlsaW5nIG5ld2xpbmUgaXMgcHJlc2VydmVkCisJcmV2aXNpb24gPT4gJzgnLAkJCSMgaW50ZWdlcgorCWRhdGUgPT4gJzIwMDQtMDItMjRUMTc6MDE6NDQuMTA4MzQ1WicsCSMgY29tbWl0IGRhdGUKKwlhdXRob3IgPT4gJ2NvbW1pdHRlciBuYW1lJworfTsKKworCisjIHRoaXMgaXMgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX2RpZmYoKTsKK0Btb2RzID0gYXJyYXkgb2YgZGlmZi1pbmRleCBsaW5lIGhhc2hlcywgZWFjaCBlbGVtZW50IHJlcHJlc2VudHMgb25lIGxpbmUKKwlvZiBkaWZmLWluZGV4IG91dHB1dAorCitkaWZmLWluZGV4IGxpbmUgKCRtIGhhc2gpCit7CisJbW9kZV9hID0+IGZpcnN0IGNvbHVtbiBvZiBkaWZmLWluZGV4IG91dHB1dCwgbm8gbGVhZGluZyAnOicsCisJbW9kZV9iID0+IHNlY29uZCBjb2x1bW4gb2YgZGlmZi1pbmRleCBvdXRwdXQsCisJc2hhMV9iID0+IHNoYTFzdW0gb2YgdGhlIGZpbmFsIGJsb2IsCisJY2hnID0+IGNoYW5nZSB0eXBlIFtNQ1JBRFRdLAorCWZpbGVfYSA9PiBvcmlnaW5hbCBmaWxlIG5hbWUgb2YgYSBmaWxlIChpZmYgY2hnIGlzICdDJyBvciAnUicpCisJZmlsZV9iID0+IG5ldy9jdXJyZW50IGZpbGUgbmFtZSBvZiBhIGZpbGUgKGFueSBjaGcpCit9Cis7CisKKyMgcmV0dmFsIG9mIHJlYWRfdXJsX3BhdGhzeyxfYWxsfSgpOworJGxfbWFwID0geworCSMgcmVwb3NpdG9yeSByb290IHVybAorCSdodHRwczovL3N2bi5tdXNpY3BkLm9yZycgPT4geworCQkjIHJlcG9zaXRvcnkgcGF0aCAJCSMgR0lUX1NWTl9JRAorCQknbXBkL3RydW5rJwkJPT4JJ3RydW5rJywKKwkJJ21wZC90YWdzLzAuMTEuNScJPT4JJ3RhZ3MvMC4xMS41JywKKwl9LAorfQorCitOb3RlczoKKwlJIGRvbid0IHRydXN0IHRoZSBlYWNoKCkgZnVuY3Rpb24gb24gdW5sZXNzIEkgY3JlYXRlZCAlaGFzaCBteXNlbGYKKwliZWNhdXNlIHRoZSBpbnRlcm5hbCBpdGVyYXRvciBtYXkgbm90IGhhdmUgc3RhcnRlZCBhdCBiYXNlLgpkaWZmIC0tZ2l0IGEvZ2l0LXN2bmltcG9ydC5wZXJsIGIvZ2l0LXN2bmltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhZjhjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc3ZuaW1wb3J0LnBlcmwKQEAgLTAsMCArMSw5OTUgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hdHRoaWFzIFVybGljaHMuCisjIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHbnUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMKKyMgVGhlIGJhc2ljIGlkZWEgaXMgdG8gcHVsbCBhbmQgYW5hbHl6ZSBTVk4gY2hhbmdlcy4KKyMKKyMgQ2hlY2tpbmcgb3V0IHRoZSBmaWxlcyBpcyBkb25lIGJ5IGEgc2luZ2xlIGxvbmctcnVubmluZyBTVk4gY29ubmVjdGlvbi4KKyMKKyMgVGhlIGhlYWQgcmV2aXNpb24gaXMgb24gYnJhbmNoICJvcmlnaW4iIGJ5IGRlZmF1bHQuCisjIFlvdSBjYW4gY2hhbmdlIHRoYXQgd2l0aCB0aGUgJy1vJyBvcHRpb24uCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6Q29weTsKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBUaW1lOjpMb2NhbDsKK3VzZSBJTzo6UGlwZTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBkdXAyKTsKK3VzZSBJUEM6Ok9wZW4yOwordXNlIFNWTjo6Q29yZTsKK3VzZSBTVk46OlJhOworCitkaWUgIk5lZWQgU1ZOOkNvcmUgMS4yLjEgb3IgYmV0dGVyIiBpZiAkU1ZOOjpDb3JlOjpWRVJTSU9OIGx0ICIxLjIuMSI7CisKKyRTSUd7J1BJUEUnfT0iSUdOT1JFIjsKKyRFTlZ7J1RaJ309IlVUQyI7CisKK291cigkb3B0X2gsJG9wdF9vLCRvcHRfdiwkb3B0X3UsJG9wdF9DLCRvcHRfaSwkb3B0X20sJG9wdF9NLCRvcHRfdCwkb3B0X1QsCisgICAgJG9wdF9iLCRvcHRfciwkb3B0X0ksJG9wdF9BLCRvcHRfcywkb3B0X2wsJG9wdF9kLCRvcHRfRCwkb3B0X1MsJG9wdF9GLAorICAgICRvcHRfUCwkb3B0X1IpOworCitzdWIgdXNhZ2UoKSB7CisJcHJpbnQgU1RERVJSIDw8RU5EOworVXNhZ2U6ICR7XGJhc2VuYW1lICQwfSAgICAgIyBmZXRjaC91cGRhdGUgR0lUIGZyb20gU1ZOCisgICAgICAgWy1vIGJyYW5jaC1mb3ItSEVBRF0gWy1oXSBbLXZdIFstbCBtYXhfcmV2XSBbLVIgcmVwYWNrX2VhY2hfcmV2c10KKyAgICAgICBbLUMgR0lUX3JlcG9zaXRvcnldIFstdCB0YWduYW1lXSBbLVQgdHJ1bmtuYW1lXSBbLWIgYnJhbmNobmFtZV0KKyAgICAgICBbLWR8LURdIFstaV0gWy11XSBbLXJdIFstSSBpZ25vcmVmaWxlbmFtZV0gWy1zIHN0YXJ0X2NoZ10KKyAgICAgICBbLW1dIFstTSByZWdleF0gWy1BIGF1dGhvcl9maWxlXSBbLVNdIFstRl0gWy1QIHByb2plY3RfbmFtZV0gW1NWTl9VUkxdCitFTkQKKwlleGl0KDEpOworfQorCitnZXRvcHRzKCJBOmI6QzpkREZoaUk6bDptTTpvOnJzOnQ6VDpTUDpSOnV2Iikgb3IgdXNhZ2UoKTsKK3VzYWdlIGlmICRvcHRfaDsKKworbXkgJHRhZ19uYW1lID0gJG9wdF90IHx8ICJ0YWdzIjsKK215ICR0cnVua19uYW1lID0gJG9wdF9UIHx8ICJ0cnVuayI7CitteSAkYnJhbmNoX25hbWUgPSAkb3B0X2IgfHwgImJyYW5jaGVzIjsKK215ICRwcm9qZWN0X25hbWUgPSAkb3B0X1AgfHwgIiI7CiskcHJvamVjdF9uYW1lID0gIi8iIC4gJHByb2plY3RfbmFtZSBpZiAoJHByb2plY3RfbmFtZSk7CitteSAkcmVwYWNrX2FmdGVyID0gJG9wdF9SIHx8IDEwMDA7CisKK0BBUkdWID09IDEgb3IgQEFSR1YgPT0gMiBvciB1c2FnZSgpOworCiskb3B0X28gfHw9ICJvcmlnaW4iOworJG9wdF9zIHx8PSAxOworbXkgJGdpdF90cmVlID0gJG9wdF9DOworJGdpdF90cmVlIHx8PSAiLiI7CisKK215ICRzdm5fdXJsID0gJEFSR1ZbMF07CitteSAkc3ZuX2RpciA9ICRBUkdWWzFdOworCitvdXIgQG1lcmdlcnggPSAoKTsKK2lmICgkb3B0X20pIHsKKwlteSAkYnJhbmNoX2VzYyA9IHF1b3RlbWV0YSAoJGJyYW5jaF9uYW1lKTsKKwlteSAkdHJ1bmtfZXNjICA9IHF1b3RlbWV0YSAoJHRydW5rX25hbWUpOworCUBtZXJnZXJ4ID0KKwkoCisJCXFyIVxiKD86bWVyZyg/OmVkP3xpbmcpKVxiLio/XGIoKD86KD88PSRicmFuY2hfZXNjLylbXHdcLlwtXSspfCg/OiR0cnVua19lc2MpKVxiIWksCisJCXFyIVxiKD86ZnJvbXxvZilcVysoKD86KD88PSRicmFuY2hfZXNjLylbXHdcLlwtXSspfCg/OiR0cnVua19lc2MpKVxiIWksCisJCXFyIVxiKD86ZnJvbXxvZilcVysoPzp0aGUgKT8oW1x3XC5cLV0rKVstXHNdYnJhbmNoXGIhaQorCSk7Cit9CitpZiAoJG9wdF9NKSB7CisJdW5zaGlmdCAoQG1lcmdlcngsIHFyLyRvcHRfTS8pOworfQorCisjIEFic29sdXRpemUgZmlsZW5hbWUgbm93LCBzaW5jZSB3ZSB3aWxsIGhhdmUgY2hkaXInZWQgYnkgdGhlIHRpbWUgd2UKKyMgZ2V0IGFyb3VuZCB0byBvcGVuaW5nIGl0LgorJG9wdF9BID0gRmlsZTo6U3BlYy0+cmVsMmFicygkb3B0X0EpIGlmICRvcHRfQTsKKworb3VyICV1c2VycyA9ICgpOworb3VyICR1c2Vyc19maWxlID0gdW5kZWY7CitzdWIgcmVhZF91c2VycygkKSB7CisJJHVzZXJzX2ZpbGUgPSBGaWxlOjpTcGVjLT5yZWwyYWJzKEBfKTsKKwlkaWUgIkNhbm5vdCBvcGVuICR1c2Vyc19maWxlXG4iIHVubGVzcyAtZiAkdXNlcnNfZmlsZTsKKwlvcGVuKG15ICRhdXRob3JzLCR1c2Vyc19maWxlKTsKKwl3aGlsZSg8JGF1dGhvcnM+KSB7CisJCWNob21wOworCQluZXh0IHVubGVzcyAvXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvOworCQkobXkgJHVzZXIsbXkgJG5hbWUsbXkgJGVtYWlsKSA9ICgkMSwkMiwkMyk7CisJCSR1c2Vyc3skdXNlcn0gPSBbJG5hbWUsJGVtYWlsXTsKKwl9CisJY2xvc2UoJGF1dGhvcnMpOworfQorCitzZWxlY3QoU1RERVJSKTsgJHw9MTsgc2VsZWN0KFNURE9VVCk7CisKKworcGFja2FnZSBTVk5jb25uOworIyBCYXNpYyBTVk4gY29ubmVjdGlvbi4KKyMgV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNvbm5lY3RpbmcgYW5kIGRvd25sb2FkaW5nLCBzbyAuLi4KKwordXNlIEZpbGU6OlNwZWM7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZmlsZSk7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUgZHVwMik7Cit1c2UgRmNudGwgcXcoU0VFS19TRVQpOworCitzdWIgbmV3IHsKKwlteSgkd2hhdCwkcmVwbykgPSBAXzsKKwkkd2hhdD1yZWYoJHdoYXQpIGlmIHJlZigkd2hhdCk7CisKKwlteSAkc2VsZiA9IHt9OworCSRzZWxmLT57J2J1ZmZlcid9ID0gIiI7CisJYmxlc3MoJHNlbGYsJHdoYXQpOworCisJJHJlcG8gPX4gcyMvKyQjIzsKKwkkc2VsZi0+eydmdWxscmVwJ30gPSAkcmVwbzsKKwkkc2VsZi0+Y29ubigpOworCisJcmV0dXJuICRzZWxmOworfQorCitzdWIgY29ubiB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlteSAkcmVwbyA9ICRzZWxmLT57J2Z1bGxyZXAnfTsKKwlteSAkYXV0aCA9IFNWTjo6Q29yZTo6YXV0aF9vcGVuIChbU1ZOOjpDbGllbnQ6OmdldF9zaW1wbGVfcHJvdmlkZXIsCisJCQkgIFNWTjo6Q2xpZW50OjpnZXRfc3NsX3NlcnZlcl90cnVzdF9maWxlX3Byb3ZpZGVyLAorCQkJICBTVk46OkNsaWVudDo6Z2V0X3VzZXJuYW1lX3Byb3ZpZGVyXSk7CisJbXkgJHMgPSBTVk46OlJhLT5uZXcodXJsID0+ICRyZXBvLCBhdXRoID0+ICRhdXRoKTsKKwlkaWUgIlNWTiBjb25uZWN0aW9uIHRvICRyZXBvOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkczsKKwkkc2VsZi0+eydzdm4nfSA9ICRzOworCSRzZWxmLT57J3JlcG8nfSA9ICRyZXBvOworCSRzZWxmLT57J21heHJldid9ID0gJHMtPmdldF9sYXRlc3RfcmV2bnVtKCk7Cit9CisKK3N1YiBmaWxlIHsKKwlteSgkc2VsZiwkcGF0aCwkcmV2KSA9IEBfOworCisJbXkgKCRmaCwgJG5hbWUpID0gdGVtcGZpbGUoJ2dpdHN2bi5YWFhYWFgnLAorCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLCBVTkxJTksgPT4gMSk7CisKKwlwcmludCAiLi4uICRyZXYgJHBhdGggLi4uXG4iIGlmICRvcHRfdjsKKwlteSAodW5kZWYsICRwcm9wZXJ0aWVzKTsKKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3KCk7CisJJHBhdGggPX4gcyNeLyojIzsKKwlldmFsIHsgKHVuZGVmLCAkcHJvcGVydGllcykKKwkJICAgPSAkc2VsZi0+eydzdm4nfS0+Z2V0X2ZpbGUoJHBhdGgsJHJldiwkZmgsJHBvb2wpOyB9OworCSRwb29sLT5jbGVhcjsKKwlpZigkQCkgeworCQlyZXR1cm4gdW5kZWYgaWYgJEAgPX4gL0F0dGVtcHRlZCB0byBnZXQgY2hlY2tzdW0vOworCQlkaWUgJEA7CisJfQorCW15ICRtb2RlOworCWlmIChleGlzdHMgJHByb3BlcnRpZXMtPnsnc3ZuOmV4ZWN1dGFibGUnfSkgeworCQkkbW9kZSA9ICcxMDA3NTUnOworCX0gZWxzaWYgKGV4aXN0cyAkcHJvcGVydGllcy0+eydzdm46c3BlY2lhbCd9KSB7CisJCW15ICgkc3BlY2lhbF9jb250ZW50LCAkZmlsZXNpemUpOworCQkkZmlsZXNpemUgPSB0ZWxsICRmaDsKKwkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQlyZWFkICRmaCwgJHNwZWNpYWxfY29udGVudCwgJGZpbGVzaXplOworCQlpZiAoJHNwZWNpYWxfY29udGVudCA9fiBzL15saW5rIC8vKSB7CisJCQkkbW9kZSA9ICcxMjAwMDAnOworCQkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQkJdHJ1bmNhdGUgJGZoLCAwOworCQkJcHJpbnQgJGZoICRzcGVjaWFsX2NvbnRlbnQ7CisJCX0gZWxzZSB7CisJCQlkaWUgInVuZXhwZWN0ZWQgc3ZuOnNwZWNpYWwgZmlsZSBlbmNvdW50ZXJlZCI7CisJCX0KKwl9IGVsc2UgeworCQkkbW9kZSA9ICcxMDA2NDQnOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRtb2RlKTsKK30KKworc3ViIGlnbm9yZSB7CisJbXkoJHNlbGYsJHBhdGgsJHJldikgPSBAXzsKKworCXByaW50ICIuLi4gJHJldiAkcGF0aCAuLi5cbiIgaWYgJG9wdF92OworCSRwYXRoID1+IHMjXi8qIyM7CisJbXkgKHVuZGVmLHVuZGVmLCRwcm9wZXJ0aWVzKQorCSAgICA9ICRzZWxmLT57J3N2bid9LT5nZXRfZGlyKCRwYXRoLCRyZXYsdW5kZWYpOworCWlmIChleGlzdHMgJHByb3BlcnRpZXMtPnsnc3ZuOmlnbm9yZSd9KSB7CisJCW15ICgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRzdm4uWFhYWFhYJywKKwkJCQkJICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLAorCQkJCQkgICBVTkxJTksgPT4gMSk7CisJCXByaW50ICRmaCAkcHJvcGVydGllcy0+eydzdm46aWdub3JlJ307CisJCWNsb3NlKCRmaCk7CisJCXJldHVybiAkbmFtZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdW5kZWY7CisJfQorfQorCitzdWIgZGlyX2xpc3QgeworCW15KCRzZWxmLCRwYXRoLCRyZXYpID0gQF87CisJJHBhdGggPX4gcyNeLyojIzsKKwlteSAoJGRpcmVudHMsdW5kZWYsJHByb3BlcnRpZXMpCisJICAgID0gJHNlbGYtPnsnc3ZuJ30tPmdldF9kaXIoJHBhdGgsJHJldix1bmRlZik7CisJcmV0dXJuICRkaXJlbnRzOworfQorCitwYWNrYWdlIG1haW47Cit1c2UgVVJJOworCitvdXIgJHN2biA9ICRzdm5fdXJsOworJHN2biAuPSAiLyRzdm5fZGlyIiBpZiBkZWZpbmVkICRzdm5fZGlyOworbXkgJHN2bjIgPSBTVk5jb25uLT5uZXcoJHN2bik7Ciskc3ZuID0gU1ZOY29ubi0+bmV3KCRzdm4pOworCitteSAkbHdwX3VhOworaWYoJG9wdF9kIG9yICRvcHRfRCkgeworCSRzdm5fdXJsID0gVVJJLT5uZXcoJHN2bl91cmwpLT5jYW5vbmljYWw7CisJaWYoJG9wdF9EKSB7CisJCSRzdm5fZGlyID1+IHMjLyokIy8jOworCX0gZWxzZSB7CisJCSRzdm5fZGlyID0gIiI7CisJfQorCWlmICgkc3ZuX3VybC0+c2NoZW1lIGVxICJodHRwIikgeworCQl1c2UgTFdQOjpVc2VyQWdlbnQ7CisJCSRsd3BfdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGtlZXBfYWxpdmUgPT4gMSwgcmVxdWVzdHNfcmVkaXJlY3RhYmxlID0+IFtdKTsKKwl9IGVsc2UgeworCQlwcmludCBTVERFUlIgIldhcm5pbmc6IG5vdCBIVFRQOyB0dXJuaW5nIG9mZiBkaXJlY3QgZmlsZSBhY2Nlc3NcbiI7CisJCSRvcHRfZD0wOworCX0KK30KKworc3ViIHBkYXRlKCQpIHsKKwlteSgkZCkgPSBAXzsKKwkkZCA9fiBtIyhcZFxkXGRcZCktKFxkXGQpLShcZFxkKVQoXGRcZCk6KFxkXGQpOihcZFxkKSMKKwkJb3IgZGllICJVbnBhcnNlYWJsZSBkYXRlOiAkZFxuIjsKKwlteSAkeT0kMTsgJHktPTE5MDAgaWYgJHk+MTkwMDsKKwlyZXR1cm4gdGltZWdtKCQ2fHwwLCQ1LCQ0LCQzLCQyLTEsJHkpOworfQorCitzdWIgZ2V0d2QoKSB7CisJbXkgJHB3ZCA9IGBwd2RgOworCWNob21wICRwd2Q7CisJcmV0dXJuICRwd2Q7Cit9CisKKworc3ViIGdldF9oZWFkcmVmKCQkKSB7CisgICAgbXkgJG5hbWUgICAgPSBzaGlmdDsKKyAgICBteSAkZ2l0X2RpciA9IHNoaWZ0OworICAgIG15ICRzaGE7CisKKyAgICBpZiAob3BlbihDLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRuYW1lIikpIHsKKwljaG9tcCgkc2hhID0gPEM+KTsKKwljbG9zZShDKTsKKwlsZW5ndGgoJHNoYSkgPT0gNDAKKwkgICAgb3IgZGllICJDYW5ub3QgZ2V0IGhlYWQgaWQgZm9yICRuYW1lICgkc2hhKTogJCFcbiI7CisgICAgfQorICAgIHJldHVybiAkc2hhOworfQorCisKKy1kICRnaXRfdHJlZQorCW9yIG1rZGlyKCRnaXRfdHJlZSwwNzc3KQorCW9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkZ2l0X3RyZWU6ICQhIjsKK2NoZGlyKCRnaXRfdHJlZSk7CisKK215ICRvcmlnX2JyYW5jaCA9ICIiOworbXkgJGZvcndhcmRfbWFzdGVyID0gMDsKK215ICVicmFuY2hlczsKKworbXkgJGdpdF9kaXIgPSAkRU5WeyJHSVRfRElSIn0gfHwgIi5naXQiOworJGdpdF9kaXIgPSBnZXR3ZCgpLiIvIi4kZ2l0X2RpciB1bmxlc3MgJGdpdF9kaXIgPX4gbSNeLyM7CiskRU5WeyJHSVRfRElSIn0gPSAkZ2l0X2RpcjsKK215ICRvcmlnX2dpdF9pbmRleDsKKyRvcmlnX2dpdF9pbmRleCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9IGlmIGV4aXN0cyAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK215ICgkZ2l0X2loLCAkZ2l0X2luZGV4KSA9IHRlbXBmaWxlKCdnaXRYWFhYWFgnLCBTVUZGSVggPT4gJy5pZHgnLAorCQkJCSAgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCkpOworY2xvc2UgKCRnaXRfaWgpOworJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkZ2l0X2luZGV4OworbXkgJG1heG51bSA9IDA7CitteSAkbGFzdF9yZXYgPSAiIjsKK215ICRsYXN0X2JyYW5jaDsKK215ICRjdXJyZW50X3JldiA9ICRvcHRfcyB8fCAxOwordW5sZXNzKC1kICRnaXRfZGlyKSB7CisJc3lzdGVtKCJnaXQtaW5pdCIpOworCWRpZSAiQ2Fubm90IGluaXQgdGhlIEdJVCBkYiBhdCAkZ2l0X3RyZWU6ICQ/XG4iIGlmICQ/OworCXN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIpOworCWRpZSAiQ2Fubm90IGluaXQgYW4gZW1wdHkgdHJlZTogJD9cbiIgaWYgJD87CisKKwkkbGFzdF9icmFuY2ggPSAkb3B0X287CisJJG9yaWdfYnJhbmNoID0gIiI7Cit9IGVsc2UgeworCS1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIKKwkJb3IgZGllICJCcmFuY2ggJyRvcHRfbycgZG9lcyBub3QgZXhpc3QuXG4iLgorCQkgICAgICAgIkVpdGhlciB1c2UgdGhlIGNvcnJlY3QgJy1vIGJyYW5jaCcgb3B0aW9uLFxuIi4KKwkJICAgICAgICJvciBpbXBvcnQgdG8gYSBuZXcgcmVwb3NpdG9yeS5cbiI7CisKKwktZiAiJGdpdF9kaXIvc3ZuMmdpdCIKKwkJb3IgZGllICInJGdpdF9kaXIvc3ZuMmdpdCcgZG9lcyBub3QgZXhpc3QuXG4iLgorCQkgICAgICAgIllvdSBuZWVkIHRoYXQgZmlsZSBmb3IgaW5jcmVtZW50YWwgaW1wb3J0cy5cbiI7CisJb3BlbihGLCAiZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHwiKSBvcgorCQlkaWUgIkNhbm5vdCBydW4gZ2l0LXN5bWJvbGljLXJlZjogJCFcbiI7CisJY2hvbXAgKCRsYXN0X2JyYW5jaCA9IDxGPik7CisJJGxhc3RfYnJhbmNoID0gYmFzZW5hbWUoJGxhc3RfYnJhbmNoKTsKKwljbG9zZShGKTsKKwl1bmxlc3MoJGxhc3RfYnJhbmNoKSB7CisJCXdhcm4gIkNhbm5vdCByZWFkIHRoZSBsYXN0IGJyYW5jaCBuYW1lOiAkISAtLSBhc3N1bWluZyAnbWFzdGVyJ1xuIjsKKwkJJGxhc3RfYnJhbmNoID0gIm1hc3RlciI7CisJfQorCSRvcmlnX2JyYW5jaCA9ICRsYXN0X2JyYW5jaDsKKwkkbGFzdF9yZXYgPSBnZXRfaGVhZHJlZigkb3JpZ19icmFuY2gsICRnaXRfZGlyKTsKKwlpZiAoLWYgIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpIHsKKwkJZGllIDw8RU9NOworU1ZOMkdJVF9IRUFEIGV4aXN0cy4KK01ha2Ugc3VyZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvIEhFQUQgYW5kIHJlbW92ZSBTVk4yR0lUX0hFQUQuCitZb3UgbWF5IG5lZWQgdG8gcnVuCisKKyAgICBnaXQtcmVhZC10cmVlIC1tIC11IFNWTjJHSVRfSEVBRCBIRUFECitFT00KKwl9CisJc3lzdGVtKCdjcCcsICIkZ2l0X2Rpci9IRUFEIiwgIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworCisJJGZvcndhcmRfbWFzdGVyID0KKwkgICAgJG9wdF9vIG5lICdtYXN0ZXInICYmIC1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciIgJiYKKwkgICAgc3lzdGVtKCdjbXAnLCAnLXMnLCAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiLAorCQkJCSIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIpID09IDA7CisKKwkjIHBvcHVsYXRlIGluZGV4CisJc3lzdGVtKCdnaXQtcmVhZC10cmVlJywgJGxhc3RfcmV2KTsKKwlkaWUgInJlYWQtdHJlZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCisJIyBHZXQgdGhlIGxhc3QgaW1wb3J0IHRpbWVzdGFtcHMKKwlvcGVuIG15ICRCLCI8IiwgIiRnaXRfZGlyL3N2bjJnaXQiOworCXdoaWxlKDwkQj4pIHsKKwkJY2hvbXA7CisJCW15KCRudW0sJGJyYW5jaCwkcmVmKSA9IHNwbGl0OworCQkkYnJhbmNoZXN7JGJyYW5jaH17JG51bX0gPSAkcmVmOworCQkkYnJhbmNoZXN7JGJyYW5jaH17IkxBU1QifSA9ICRyZWY7CisJCSRjdXJyZW50X3JldiA9ICRudW0rMSBpZiAkY3VycmVudF9yZXYgPD0gJG51bTsKKwl9CisJY2xvc2UoJEIpOworfQorLWQgJGdpdF9kaXIKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgZ2l0IHN1YmRpciAoJGdpdF9kaXIpLlxuIjsKKworbXkgJGRlZmF1bHRfYXV0aG9ycyA9ICIkZ2l0X2Rpci9zdm4tYXV0aG9ycyI7CitpZiAoJG9wdF9BKSB7CisJcmVhZF91c2Vycygkb3B0X0EpOworCWNvcHkoJG9wdF9BLCRkZWZhdWx0X2F1dGhvcnMpIG9yIGRpZSAiQ29weSBmYWlsZWQ6ICQhIjsKK30gZWxzZSB7CisJcmVhZF91c2VycygkZGVmYXVsdF9hdXRob3JzKSBpZiAtZiAkZGVmYXVsdF9hdXRob3JzOworfQorCitvcGVuIEJSQU5DSEVTLCI+PiIsICIkZ2l0X2Rpci9zdm4yZ2l0IjsKKworc3ViIG5vZGVfa2luZCgkJCkgeworCW15ICgkc3ZucGF0aCwgJHJldmlzaW9uKSA9IEBfOworCW15ICRwb29sPVNWTjo6UG9vbC0+bmV3OworCSRzdm5wYXRoID1+IHMjXi8qIyM7CisJbXkgJGtpbmQgPSAkc3ZuLT57J3N2bid9LT5jaGVja19wYXRoKCRzdm5wYXRoLCRyZXZpc2lvbiwkcG9vbCk7CisJJHBvb2wtPmNsZWFyOworCXJldHVybiAka2luZDsKK30KKworc3ViIGdldF9maWxlKCQkJCkgeworCW15KCRzdm5wYXRoLCRyZXYsJHBhdGgpID0gQF87CisKKwkjIG5vdyBnZXQgaXQKKwlteSAoJG5hbWUsJG1vZGUpOworCWlmKCRvcHRfZCkgeworCQlteSgkcmVxLCRyZXMpOworCisJCSMgL3N2bi8hc3ZuL2JjLzIvZGphbmdvL3RydW5rL2RqYW5nby1kb2NzL2J1aWxkLnB5CisJCW15ICR1cmw9JHN2bl91cmwtPmNsb25lKCk7CisJCSR1cmwtPnBhdGgoJHVybC0+cGF0aC4iLyFzdm4vYmMvJHJldi8kc3ZuX2RpciRzdm5wYXRoIik7CisJCXByaW50ICIuLi4gJHBhdGguLi5cbiIgaWYgJG9wdF92OworCQkkcmVxID0gSFRUUDo6UmVxdWVzdC0+bmV3KEdFVCA9PiAkdXJsKTsKKwkJJHJlcyA9ICRsd3BfdWEtPnJlcXVlc3QoJHJlcSk7CisJCWlmICgkcmVzLT5pc19zdWNjZXNzKSB7CisJCQlteSAkZmg7CisJCQkoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0c3ZuLlhYWFhYWCcsCisJCQlESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksIFVOTElOSyA9PiAxKTsKKwkJCXByaW50ICRmaCAkcmVzLT5jb250ZW50OworCQkJY2xvc2UoJGZoKSBvciBkaWUgIkNvdWxkIG5vdCB3cml0ZSAkbmFtZTogJCFcbiI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdW5kZWYgaWYgJHJlcy0+Y29kZSA9PSAzMDE7ICMgZGlyZWN0b3J5PworCQkJZGllICRyZXMtPnN0YXR1c19saW5lLiIgYXQgJHVybFxuIjsKKwkJfQorCQkkbW9kZSA9ICcwNjQ0JzsgIyBjYW4ndCBvYnRhaW4gbW9kZSB2aWEgZGlyZWN0IGh0dHAgcmVxdWVzdD8KKwl9IGVsc2UgeworCQkoJG5hbWUsJG1vZGUpID0gJHN2bi0+ZmlsZSgiJHN2bnBhdGgiLCRyZXYpOworCQlyZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJG5hbWU7CisJfQorCisJbXkgJHBpZCA9IG9wZW4obXkgJEYsICctfCcpOworCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCWlmICghJHBpZCkgeworCSAgICBleGVjKCJnaXQtaGFzaC1vYmplY3QiLCAiLXciLCAkbmFtZSkKKwkJb3IgZGllICJDYW5ub3QgY3JlYXRlIG9iamVjdDogJCFcbiI7CisJfQorCW15ICRzaGEgPSA8JEY+OworCWNob21wICRzaGE7CisJY2xvc2UgJEY7CisJdW5saW5rICRuYW1lOworCXJldHVybiBbJG1vZGUsICRzaGEsICRwYXRoXTsKK30KKworc3ViIGdldF9pZ25vcmUoJCQkJCQpIHsKKwlteSgkbmV3LCRvbGQsJHJldiwkcGF0aCwkc3ZucGF0aCkgPSBAXzsKKworCXJldHVybiB1bmxlc3MgJG9wdF9JOworCW15ICRuYW1lID0gJHN2bi0+aWdub3JlKCIkc3ZucGF0aCIsJHJldik7CisJaWYgKCRwYXRoIGVxICcvJykgeworCQkkcGF0aCA9ICRvcHRfSTsKKwl9IGVsc2UgeworCQkkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHBhdGgsJG9wdF9JKTsKKwl9CisJaWYgKGRlZmluZWQgJG5hbWUpIHsKKwkJbXkgJHBpZCA9IG9wZW4obXkgJEYsICctfCcpOworCQlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJaWYgKCEkcGlkKSB7CisJCQlleGVjKCJnaXQtaGFzaC1vYmplY3QiLCAiLXciLCAkbmFtZSkKKwkJCSAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgb2JqZWN0OiAkIVxuIjsKKwkJfQorCQlteSAkc2hhID0gPCRGPjsKKwkJY2hvbXAgJHNoYTsKKwkJY2xvc2UgJEY7CisJCXVubGluayAkbmFtZTsKKwkJcHVzaChAJG5ldyxbJzA2NDQnLCRzaGEsJHBhdGhdKTsKKwl9IGVsc2lmIChkZWZpbmVkICRvbGQpIHsKKwkJcHVzaChAJG9sZCwkcGF0aCk7CisJfQorfQorCitzdWIgcHJvamVjdF9wYXRoKCQkKQoreworCW15ICgkcGF0aCwgJHByb2plY3QpID0gQF87CisKKwkkcGF0aCA9ICIvIi4kcGF0aCB1bmxlc3MgKCRwYXRoID1+IG0jXlwvIykgOworCXJldHVybiAkMSBpZiAoJHBhdGggPX4gbSNeJHByb2plY3RcLyguKikkIyk7CisKKwkkcGF0aCA9fiBzI1wuI1xcXC4jZzsKKwkkcGF0aCA9fiBzI1wrI1xcXCsjZzsKKwlyZXR1cm4gIi8iIGlmICgkcHJvamVjdCA9fiBtI14kcGF0aC4qJCMpOworCisJcmV0dXJuIHVuZGVmOworfQorCitzdWIgc3BsaXRfcGF0aCgkJCkgeworCW15KCRyZXYsJHBhdGgpID0gQF87CisJbXkgJGJyYW5jaDsKKworCWlmKCRwYXRoID1+IHMjXi9cUSR0YWdfbmFtZVxFLyhbXi9dKykvPyMjKSB7CisJCSRicmFuY2ggPSAiLyQxIjsKKwl9IGVsc2lmKCRwYXRoID1+IHMjXi9cUSR0cnVua19uYW1lXEUvPyMjKSB7CisJCSRicmFuY2ggPSAiLyI7CisJfSBlbHNpZigkcGF0aCA9fiBzI14vXFEkYnJhbmNoX25hbWVcRS8oW14vXSspLz8jIykgeworCQkkYnJhbmNoID0gJDE7CisJfSBlbHNlIHsKKwkJbXkgJW5vX2Vycm9yID0gKAorCQkJIi8iID0+IDEsCisJCQkiLyR0YWdfbmFtZSIgPT4gMSwKKwkJCSIvJGJyYW5jaF9uYW1lIiA9PiAxCisJCSk7CisJCXByaW50IFNUREVSUiAiJHJldjogVW5yZWNvZ25pemVkIHBhdGg6ICRwYXRoXG4iIHVubGVzcyAoZGVmaW5lZCAkbm9fZXJyb3J7JHBhdGh9KTsKKwkJcmV0dXJuICgpCisJfQorCWlmICgkcGF0aCBlcSAiIikgeworCQkkcGF0aCA9ICIvIjsKKwl9IGVsc2lmICgkcHJvamVjdF9uYW1lKSB7CisJCSRwYXRoID0gcHJvamVjdF9wYXRoKCRwYXRoLCAkcHJvamVjdF9uYW1lKTsKKwl9CisJcmV0dXJuICgkYnJhbmNoLCRwYXRoKTsKK30KKworc3ViIGJyYW5jaF9yZXYoJCQpIHsKKworCW15ICgkc3JjYnJhbmNoLCR1cHRvcmV2KSA9IEBfOworCisJbXkgJGJicmFuY2hlcyA9ICRicmFuY2hlc3skc3JjYnJhbmNofTsKKwlteSBAcmV2cyA9IHJldmVyc2Ugc29ydCB7ICgkYSBlcSAnTEFTVCcgPyAwIDogJGEpIDw9PiAoJGIgZXEgJ0xBU1QnID8gMCA6ICRiKSB9IGtleXMgJSRiYnJhbmNoZXM7CisJbXkgJHRoZXJldjsKKwlmb3JlYWNoIG15ICRhcmV2KEByZXZzKSB7CisJCW5leHQgaWYgICgkYXJldiBlcSAnTEFTVCcpOworCQlpZiAoJGFyZXYgPD0gJHVwdG9yZXYpIHsKKwkJCSR0aGVyZXYgPSAkYXJldjsKKwkJCWxhc3Q7CisJCX0KKwl9CisJcmV0dXJuICR0aGVyZXY7Cit9CisKK3N1YiBleHBhbmRfc3ZuZGlyKCQkJCk7CisKK3N1YiBleHBhbmRfc3ZuZGlyKCQkJCkKK3sKKwlteSAoJHN2bnBhdGgsICRyZXYsICRwYXRoKSA9IEBfOworCW15IEBsaXN0OworCWdldF9pZ25vcmUoXEBsaXN0LCB1bmRlZiwgJHJldiwgJHBhdGgsICRzdm5wYXRoKTsKKwlteSAkZGlyZW50cyA9ICRzdm4tPmRpcl9saXN0KCRzdm5wYXRoLCAkcmV2KTsKKwlmb3JlYWNoIG15ICRwKGtleXMgJSRkaXJlbnRzKSB7CisJCW15ICRraW5kID0gbm9kZV9raW5kKCRzdm5wYXRoLicvJy4kcCwgJHJldik7CisJCWlmICgka2luZCBlcSAkU1ZOOjpOb2RlOjpmaWxlKSB7CisJCQlteSAkZiA9IGdldF9maWxlKCRzdm5wYXRoLicvJy4kcCwgJHJldiwgJHBhdGguJy8nLiRwKTsKKwkJCXB1c2goQGxpc3QsICRmKSBpZiAkZjsKKwkJfSBlbHNpZiAoJGtpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQlwdXNoKEBsaXN0LAorCQkJICAgICBleHBhbmRfc3ZuZGlyKCRzdm5wYXRoLicvJy4kcCwgJHJldiwgJHBhdGguJy8nLiRwKSk7CisJCX0KKwl9CisJcmV0dXJuIEBsaXN0OworfQorCitzdWIgY29weV9wYXRoKCQkJCQkJCQkKSB7CisJIyBTb21lYm9keSBjb3BpZWQgYSB3aG9sZSBzdWJkaXJlY3RvcnkuCisJIyBXZSBuZWVkIHRvIGZpbmQgdGhlIGluZGV4IGVudHJpZXMgZnJvbSB0aGUgb2xkIHZlcnNpb24gd2hpY2ggdGhlCisJIyBTVk4gbG9nIGVudHJ5IHBvaW50cyB0bywgYW5kIGFkZCB0aGVtIHRvIHRoZSBuZXcgcGxhY2UuCisKKwlteSgkbmV3cmV2LCRuZXdicmFuY2gsJHBhdGgsJG9sZHBhdGgsJHJldiwkbm9kZV9raW5kLCRuZXcsJHBhcmVudHMpID0gQF87CisKKwlteSgkc3JjYnJhbmNoLCRzcmNwYXRoKSA9IHNwbGl0X3BhdGgoJHJldiwkb2xkcGF0aCk7CisJdW5sZXNzKGRlZmluZWQgJHNyY2JyYW5jaCAmJiBkZWZpbmVkICRzcmNwYXRoKSB7CisJCXByaW50ICJQYXRoIG5vdCBmb3VuZCB3aGVuIGNvcHlpbmcgZnJvbSAkb2xkcGF0aCBAICRyZXYuXG4iLgorCQkJIldpbGwgdHJ5IHRvIGNvcHkgZnJvbSBvcmlnaW5hbCBTVk4gbG9jYXRpb24uLi5cbiIKKwkJCWlmICRvcHRfdjsKKwkJcHVzaCAoQCRuZXcsIGV4cGFuZF9zdm5kaXIoJG9sZHBhdGgsICRyZXYsICRwYXRoKSk7CisJCXJldHVybjsKKwl9CisJbXkgJHRoZXJldiA9IGJyYW5jaF9yZXYoJHNyY2JyYW5jaCwgJHJldik7CisJbXkgJGdpdHJldiA9ICRicmFuY2hlc3skc3JjYnJhbmNofXskdGhlcmV2fTsKKwl1bmxlc3MoJGdpdHJldikgeworCQlwcmludCBTVERFUlIgIiRuZXdyZXY6JG5ld2JyYW5jaDogY291bGQgbm90IGZpbmQgJG9sZHBhdGggXEAgJHJldlxuIjsKKwkJcmV0dXJuOworCX0KKwlpZiAoJHNyY2JyYW5jaCBuZSAkbmV3YnJhbmNoKSB7CisJCXB1c2goQCRwYXJlbnRzLCAkYnJhbmNoZXN7JHNyY2JyYW5jaH17J0xBU1QnfSk7CisJfQorCXByaW50ICIkbmV3cmV2OiRuZXdicmFuY2g6JHBhdGg6IGNvcHlpbmcgZnJvbSAkc3JjYnJhbmNoOiRzcmNwYXRoIEAgJHJldlxuIiBpZiAkb3B0X3Y7CisJaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCSRzcmNwYXRoID1+IHMjLyokIy8jOworCX0KKwkKKwlteSAkcGlkID0gb3BlbiBteSAkZiwnLXwnOworCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCWlmICghJHBpZCkgeworCQlleGVjKCJnaXQtbHMtdHJlZSIsIi1yIiwiLXoiLCRnaXRyZXYsJHNyY3BhdGgpCisJCQlvciBkaWUgJCE7CisJfQorCWxvY2FsICQvID0gIlwwIjsKKwl3aGlsZSg8JGY+KSB7CisJCWNob21wOworCQlteSgkbSwkcCkgPSBzcGxpdCgvXHQvLCRfLDIpOworCQlteSgkbW9kZSwkdHlwZSwkc2hhMSkgPSBzcGxpdCgvIC8sJG0pOworCQluZXh0IGlmICR0eXBlIG5lICJibG9iIjsKKwkJaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQkkcCA9ICRwYXRoIC4gc3Vic3RyKCRwLGxlbmd0aCgkc3JjcGF0aCktMSk7CisJCX0gZWxzZSB7CisJCQkkcCA9ICRwYXRoOworCQl9CisJCXB1c2goQCRuZXcsWyRtb2RlLCRzaGExLCRwXSk7CQorCX0KKwljbG9zZSgkZikgb3IKKwkJcHJpbnQgU1RERVJSICIkbmV3cmV2OiRuZXdicmFuY2g6IGNvdWxkIG5vdCBsaXN0IGZpbGVzIGluICRvbGRwYXRoIFxAICRyZXZcbiI7Cit9CisKK3N1YiBjb21taXQgeworCW15KCRicmFuY2gsICRjaGFuZ2VkX3BhdGhzLCAkcmV2aXNpb24sICRhdXRob3IsICRkYXRlLCAkbWVzc2FnZSkgPSBAXzsKKwlteSgkY29tbWl0dGVyX25hbWUsJGNvbW1pdHRlcl9lbWFpbCwkZGVzdCk7CisJbXkoJGF1dGhvcl9uYW1lLCRhdXRob3JfZW1haWwpOworCW15KEBvbGQsQG5ldyxAcGFyZW50cyk7CisKKwlpZiAobm90IGRlZmluZWQgJGF1dGhvciBvciAkYXV0aG9yIGVxICIiKSB7CisJCSRjb21taXR0ZXJfbmFtZSA9ICRjb21taXR0ZXJfZW1haWwgPSAidW5rbm93biI7CisJfSBlbHNpZiAoZGVmaW5lZCAkdXNlcnNfZmlsZSkgeworCQlkaWUgIlVzZXIgJGF1dGhvciBpcyBub3QgbGlzdGVkIGluICR1c2Vyc19maWxlXG4iCisJCSAgICB1bmxlc3MgZXhpc3RzICR1c2Vyc3skYXV0aG9yfTsKKwkJKCRjb21taXR0ZXJfbmFtZSwkY29tbWl0dGVyX2VtYWlsKSA9IEB7JHVzZXJzeyRhdXRob3J9fTsKKwl9IGVsc2lmICgkYXV0aG9yID1+IC9eKC4qPylccys8KC4qKT4kLykgeworCQkoJGNvbW1pdHRlcl9uYW1lLCAkY29tbWl0dGVyX2VtYWlsKSA9ICgkMSwgJDIpOworCX0gZWxzZSB7CisJCSRhdXRob3IgPX4gcy9ePCguKik+JC8kMS87CisJCSRjb21taXR0ZXJfbmFtZSA9ICRjb21taXR0ZXJfZW1haWwgPSAkYXV0aG9yOworCX0KKworCWlmICgkb3B0X0YgJiYgJG1lc3NhZ2UgPX4gL0Zyb206XHMrKC4qPylccys8KC4qKT5ccypcbi8pIHsKKwkJKCRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCkgPSAoJDEsICQyKTsKKwkJcHJpbnQgIkF1dGhvciBmcm9tIEZyb206ICQxIDwkMj5cbiIgaWYgKCRvcHRfdik7OworCX0gZWxzaWYgKCRvcHRfUyAmJiAkbWVzc2FnZSA9fiAvU2lnbmVkLW9mZi1ieTpccysoLio/KVxzKzwoLiopPlxzKlxuLykgeworCQkoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSA9ICgkMSwgJDIpOworCQlwcmludCAiQXV0aG9yIGZyb20gU2lnbmVkLW9mZi1ieTogJDEgPCQyPlxuIiBpZiAoJG9wdF92KTs7CisJfSBlbHNlIHsKKwkJJGF1dGhvcl9uYW1lID0gJGNvbW1pdHRlcl9uYW1lOworCQkkYXV0aG9yX2VtYWlsID0gJGNvbW1pdHRlcl9lbWFpbDsKKwl9CisKKwkkZGF0ZSA9IHBkYXRlKCRkYXRlKTsKKworCW15ICR0YWc7CisJbXkgJHBhcmVudDsKKwlpZigkYnJhbmNoIGVxICIvIikgeyAjIHRydW5rCisJCSRwYXJlbnQgPSAkb3B0X287CisJfSBlbHNpZigkYnJhbmNoID1+IG0jXi8oLispIykgeyAjIHRhZworCQkkdGFnID0gMTsKKwkJJHBhcmVudCA9ICQxOworCX0gZWxzZSB7ICMgIm5vcm1hbCIgYnJhbmNoCisJCSMgbm90aGluZyB0byBkbworCQkkcGFyZW50ID0gJGJyYW5jaDsKKwl9CisJJGRlc3QgPSAkcGFyZW50OworCisJbXkgJHByZXYgPSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJaWYoJHByZXYgYW5kICRwcmV2LT5bMF0gZXEgIkEiKSB7CisJCWRlbGV0ZSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJCW15ICRvbGRwYXRoID0gJHByZXYtPlsxXTsKKwkJbXkgJHJldjsKKwkJaWYoZGVmaW5lZCAkb2xkcGF0aCkgeworCQkJbXkgJHA7CisJCQkoJHBhcmVudCwkcCkgPSBzcGxpdF9wYXRoKCRyZXZpc2lvbiwkb2xkcGF0aCk7CisJCQlpZihkZWZpbmVkICRwYXJlbnQpIHsKKwkJCQlpZigkcGFyZW50IGVxICIvIikgeworCQkJCQkkcGFyZW50ID0gJG9wdF9vOworCQkJCX0gZWxzZSB7CisJCQkJCSRwYXJlbnQgPX4gcyNeLyMjOyAjIGlmIGl0J3MgYSB0YWcKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkkcGFyZW50ID0gdW5kZWY7CisJCX0KKwl9CisKKwlteSAkcmV2OworCWlmKCRyZXZpc2lvbiA+ICRvcHRfcyBhbmQgZGVmaW5lZCAkcGFyZW50KSB7CisJCW9wZW4oSCwiZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAkcGFyZW50IHwiKTsKKwkJJHJldiA9IDxIPjsKKwkJY2xvc2UoSCkgb3IgZG8geworCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246IGNhbm5vdCBmaW5kIGNvbW1pdCAnJHBhcmVudCchXG4iOworCQkJcmV0dXJuOworCQl9OworCQljaG9wICRyZXY7CisJCWlmKGxlbmd0aCgkcmV2KSAhPSA0MCkgeworCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246IGNhbm5vdCBmaW5kIGNvbW1pdCAnJHBhcmVudCchXG4iOworCQkJcmV0dXJuOworCQl9CisJCSRyZXYgPSAkYnJhbmNoZXN7KCRwYXJlbnQgZXEgJG9wdF9vKSA/ICIvIiA6ICRwYXJlbnR9eyJMQVNUIn07CisJCWlmKCRyZXZpc2lvbiAhPSAkb3B0X3MgYW5kIG5vdCAkcmV2KSB7CisJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogZG8gbm90IGtub3cgYW5jZXN0b3IgZm9yICckcGFyZW50JyFcbiI7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQkkcmV2ID0gdW5kZWY7CisJfQorCisjCWlmKCRwcmV2IGFuZCAkcHJldi0+WzBdIGVxICJBIikgeworIwkJaWYobm90ICR0YWcpIHsKKyMJCQl1bmxlc3Mob3BlbihILCI+ICRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCIpKSB7CisjCQkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiBDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkYnJhbmNoOiAkIVxuIjsKKyMJCQkJJHN0YXRlPTExOworIwkJCQluZXh0OworIwkJCX0KKyMJCQlwcmludCBIICIkcmV2XG4iCisjCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisjCQkJY2xvc2UoSCkKKyMJCQkJb3IgZGllICJDb3VsZCBub3Qgd3JpdGUgYnJhbmNoICRicmFuY2g6ICQhIjsKKyMJCX0KKyMJfQorCWlmKG5vdCBkZWZpbmVkICRyZXYpIHsKKwkJdW5saW5rKCRnaXRfaW5kZXgpOworCX0gZWxzaWYgKCRyZXYgbmUgJGxhc3RfcmV2KSB7CisJCXByaW50ICJTd2l0Y2hpbmcgZnJvbSAkbGFzdF9yZXYgdG8gJHJldiAoJGJyYW5jaClcbiIgaWYgJG9wdF92OworCQlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAkcmV2KTsKKwkJZGllICJyZWFkLXRyZWUgZmFpbGVkIGZvciAkcmV2OiAkP1xuIiBpZiAkPzsKKwkJJGxhc3RfcmV2ID0gJHJldjsKKwl9CisKKwlwdXNoIChAcGFyZW50cywgJHJldikgaWYgZGVmaW5lZCAkcmV2OworCisJbXkgJGNpZDsKKwlpZigkdGFnIGFuZCBub3QgJSRjaGFuZ2VkX3BhdGhzKSB7CisJCSRjaWQgPSAkcmV2OworCX0gZWxzZSB7CisJCW15IEBwYXRocyA9IHNvcnQga2V5cyAlJGNoYW5nZWRfcGF0aHM7CisJCWZvcmVhY2ggbXkgJHBhdGgoQHBhdGhzKSB7CisJCQlteSAkYWN0aW9uID0gJGNoYW5nZWRfcGF0aHMtPnskcGF0aH07CisKKwkJCWlmICgkYWN0aW9uLT5bMF0gZXEgIlIiKSB7CisJCQkJIyByZWZlciB0byBhIGZpbGUvdHJlZSBpbiBhbiBlYXJsaWVyIGNvbW1pdAorCQkJCXB1c2goQG9sZCwkcGF0aCk7ICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYKKwkJCX0KKwkJCWlmKCgkYWN0aW9uLT5bMF0gZXEgIkEiKSB8fCAoJGFjdGlvbi0+WzBdIGVxICJSIikpIHsKKwkJCQlteSAkbm9kZV9raW5kID0gbm9kZV9raW5kKCRhY3Rpb24tPlszXSwgJHJldmlzaW9uKTsKKwkJCQlpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpmaWxlKSB7CisJCQkJCW15ICRmID0gZ2V0X2ZpbGUoJGFjdGlvbi0+WzNdLAorCQkJCQkJCSAkcmV2aXNpb24sICRwYXRoKTsKKwkJCQkJaWYgKCRmKSB7CisJCQkJCQlwdXNoKEBuZXcsJGYpIGlmICRmOworCQkJCQl9IGVsc2UgeworCQkJCQkJbXkgJG9wYXRoID0gJGFjdGlvbi0+WzNdOworCQkJCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246ICRicmFuY2g6IGNvdWxkIG5vdCBmZXRjaCAnJG9wYXRoJ1xuIjsKKwkJCQkJfQorCQkJCX0gZWxzaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQkJCWlmKCRhY3Rpb24tPlsxXSkgeworCQkJCQkJY29weV9wYXRoKCRyZXZpc2lvbiwgJGJyYW5jaCwKKwkJCQkJCQkgICRwYXRoLCAkYWN0aW9uLT5bMV0sCisJCQkJCQkJICAkYWN0aW9uLT5bMl0sICRub2RlX2tpbmQsCisJCQkJCQkJICBcQG5ldywgXEBwYXJlbnRzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWdldF9pZ25vcmUoXEBuZXcsIFxAb2xkLCAkcmV2aXNpb24sCisJCQkJCQkJICAgJHBhdGgsICRhY3Rpb24tPlszXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2lmICgkYWN0aW9uLT5bMF0gZXEgIkQiKSB7CisJCQkJcHVzaChAb2xkLCRwYXRoKTsKKwkJCX0gZWxzaWYgKCRhY3Rpb24tPlswXSBlcSAiTSIpIHsKKwkJCQlteSAkbm9kZV9raW5kID0gbm9kZV9raW5kKCRhY3Rpb24tPlszXSwgJHJldmlzaW9uKTsKKwkJCQlpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpmaWxlKSB7CisJCQkJCW15ICRmID0gZ2V0X2ZpbGUoJGFjdGlvbi0+WzNdLAorCQkJCQkJCSAkcmV2aXNpb24sICRwYXRoKTsKKwkJCQkJcHVzaChAbmV3LCRmKSBpZiAkZjsKKwkJCQl9IGVsc2lmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJCQlnZXRfaWdub3JlKFxAbmV3LCBcQG9sZCwgJHJldmlzaW9uLAorCQkJCQkJICAgJHBhdGgsICRhY3Rpb24tPlszXSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkaWUgIiRyZXZpc2lvbjogdW5rbm93biBhY3Rpb24gJyIuJGFjdGlvbi0+WzBdLiInIGZvciAkcGF0aFxuIjsKKwkJCX0KKwkJfQorCisJCXdoaWxlKEBvbGQpIHsKKwkJCW15IEBvMTsKKwkJCWlmKEBvbGQgPiA1NSkgeworCQkJCUBvMSA9IHNwbGljZShAb2xkLDAsNTApOworCQkJfSBlbHNlIHsKKwkJCQlAbzEgPSBAb2xkOworCQkJCUBvbGQgPSAoKTsKKwkJCX0KKwkJCW15ICRwaWQgPSBvcGVuIG15ICRGLCAiLXwiOworCQkJZGllICIkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJCWlmICghJHBpZCkgeworCQkJCWV4ZWMoImdpdC1scy1maWxlcyIsICIteiIsIEBvMSkgb3IgZGllICQhOworCQkJfQorCQkJQG8xID0gKCk7CisJCQlsb2NhbCAkLyA9ICJcMCI7CisJCQl3aGlsZSg8JEY+KSB7CisJCQkJY2hvbXA7CisJCQkJcHVzaChAbzEsJF8pOworCQkJfQorCQkJY2xvc2UoJEYpOworCisJCQl3aGlsZShAbzEpIHsKKwkJCQlteSBAbzI7CisJCQkJaWYoQG8xID4gNTUpIHsKKwkJCQkJQG8yID0gc3BsaWNlKEBvMSwwLDUwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlAbzIgPSBAbzE7CisJCQkJCUBvMSA9ICgpOworCQkJCX0KKwkJCQlzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCItLWZvcmNlLXJlbW92ZSIsIi0tIixAbzIpOworCQkJCWRpZSAiQ2Fubm90IHJlbW92ZSBmaWxlczogJD9cbiIgaWYgJD87CisJCQl9CisJCX0KKwkJd2hpbGUoQG5ldykgeworCQkJbXkgQG4yOworCQkJaWYoQG5ldyA+IDEyKSB7CisJCQkJQG4yID0gc3BsaWNlKEBuZXcsMCwxMCk7CisJCQl9IGVsc2UgeworCQkJCUBuMiA9IEBuZXc7CisJCQkJQG5ldyA9ICgpOworCQkJfQorCQkJc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwiLS1hZGQiLAorCQkJCShtYXAgeyAoJy0tY2FjaGVpbmZvJywgQCRfKSB9IEBuMikpOworCQkJZGllICJDYW5ub3QgYWRkIGZpbGVzOiAkP1xuIiBpZiAkPzsKKwkJfQorCisJCW15ICRwaWQgPSBvcGVuKEMsIi18Iik7CisJCWRpZSAiQ2Fubm90IGZvcms6ICQhIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQl1bmxlc3MoJHBpZCkgeworCQkJZXhlYygiZ2l0LXdyaXRlLXRyZWUiKTsKKwkJCWRpZSAiQ2Fubm90IGV4ZWMgZ2l0LXdyaXRlLXRyZWU6ICQhXG4iOworCQl9CisJCWNob21wKG15ICR0cmVlID0gPEM+KTsKKwkJbGVuZ3RoKCR0cmVlKSA9PSA0MAorCQkJb3IgZGllICJDYW5ub3QgZ2V0IHRyZWUgaWQgKCR0cmVlKTogJCFcbiI7CisJCWNsb3NlKEMpCisJCQlvciBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LXdyaXRlLXRyZWU6ICQ/XG4iOworCQlwcmludCAiVHJlZSBJRCAkdHJlZVxuIiBpZiAkb3B0X3Y7CisKKwkJbXkgJHByID0gSU86OlBpcGUtPm5ldygpIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZTogJCFcbiI7CisJCW15ICRwdyA9IElPOjpQaXBlLT5uZXcoKSBvciBkaWUgIkNhbm5vdCBvcGVuIHBpcGU6ICQhXG4iOworCQkkcGlkID0gZm9yaygpOworCQlkaWUgIkZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCXVubGVzcygkcGlkKSB7CisJCQkkcHItPndyaXRlcigpOworCQkJJHB3LT5yZWFkZXIoKTsKKwkJCW9wZW4oT1VULCI+JlNURE9VVCIpOworCQkJZHVwMigkcHctPmZpbGVubygpLDApOworCQkJZHVwMigkcHItPmZpbGVubygpLDEpOworCQkJJHByLT5jbG9zZSgpOworCQkJJHB3LT5jbG9zZSgpOworCisJCQlteSBAcGFyID0gKCk7CisKKwkJCSMgbG9vc2UgZGV0ZWN0aW9uIG9mIG1lcmdlcworCQkJIyBiYXNlZCBvbiB0aGUgY29tbWl0IG1zZworCQkJZm9yZWFjaCBteSAkcnggKEBtZXJnZXJ4KSB7CisJCQkJaWYgKCRtZXNzYWdlID1+ICRyeCkgeworCQkJCQlteSAkbXBhcmVudCA9ICQxOworCQkJCQlpZiAoJG1wYXJlbnQgZXEgJ0hFQUQnKSB7ICRtcGFyZW50ID0gJG9wdF9vIH07CisJCQkJCWlmICggLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG1wYXJlbnQiKSB7CisJCQkJCQkkbXBhcmVudCA9IGdldF9oZWFkcmVmKCRtcGFyZW50LCAkZ2l0X2Rpcik7CisJCQkJCQlwdXNoIChAcGFyZW50cywgJG1wYXJlbnQpOworCQkJCQkJcHJpbnQgT1VUICJNZXJnZSBwYXJlbnQgYnJhbmNoOiAkbXBhcmVudFxuIiBpZiAkb3B0X3Y7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlteSAlc2Vlbl9wYXJlbnRzID0gKCk7CisJCQlteSBAdW5pcXVlX3BhcmVudHMgPSBncmVwIHsgISAkc2Vlbl9wYXJlbnRzeyRffSArKyB9IEBwYXJlbnRzOworCQkJZm9yZWFjaCBteSAkYnBhcmVudCAoQHVuaXF1ZV9wYXJlbnRzKSB7CisJCQkJcHVzaCBAcGFyLCAnLXAnLCAkYnBhcmVudDsKKwkJCQlwcmludCBPVVQgIk1lcmdlIHBhcmVudCBicmFuY2g6ICRicGFyZW50XG4iIGlmICRvcHRfdjsKKwkJCX0KKworCQkJZXhlYygiZW52IiwKKwkJCQkiR0lUX0FVVEhPUl9OQU1FPSRhdXRob3JfbmFtZSIsCisJCQkJIkdJVF9BVVRIT1JfRU1BSUw9JGF1dGhvcl9lbWFpbCIsCisJCQkJIkdJVF9BVVRIT1JfREFURT0iLnN0cmZ0aW1lKCIrMDAwMCAlWS0lbS0lZCAlSDolTTolUyIsZ210aW1lKCRkYXRlKSksCisJCQkJIkdJVF9DT01NSVRURVJfTkFNRT0kY29tbWl0dGVyX25hbWUiLAorCQkJCSJHSVRfQ09NTUlUVEVSX0VNQUlMPSRjb21taXR0ZXJfZW1haWwiLAorCQkJCSJHSVRfQ09NTUlUVEVSX0RBVEU9Ii5zdHJmdGltZSgiKzAwMDAgJVktJW0tJWQgJUg6JU06JVMiLGdtdGltZSgkZGF0ZSkpLAorCQkJCSJnaXQtY29tbWl0LXRyZWUiLCAkdHJlZSxAcGFyKTsKKwkJCWRpZSAiQ2Fubm90IGV4ZWMgZ2l0LWNvbW1pdC10cmVlOiAkIVxuIjsKKwkJfQorCQkkcHctPndyaXRlcigpOworCQkkcHItPnJlYWRlcigpOworCisJCSRtZXNzYWdlID1+IHMvW1xzXG5dK1x6Ly87CisJCSRtZXNzYWdlID0gInIkcmV2aXNpb246ICRtZXNzYWdlIiBpZiAkb3B0X3I7CisKKwkJcHJpbnQgJHB3ICIkbWVzc2FnZVxuIgorCQkJb3IgZGllICJFcnJvciB3cml0aW5nIHRvIGdpdC1jb21taXQtdHJlZTogJCFcbiI7CisJCSRwdy0+Y2xvc2UoKTsKKworCQlwcmludCAiQ29tbWl0dGVkIGNoYW5nZSAkcmV2aXNpb246JGJyYW5jaCAiLnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIsZ210aW1lKCRkYXRlKSkuIilcbiIgaWYgJG9wdF92OworCQljaG9tcCgkY2lkID0gPCRwcj4pOworCQlsZW5ndGgoJGNpZCkgPT0gNDAKKwkJCW9yIGRpZSAiQ2Fubm90IGdldCBjb21taXQgaWQgKCRjaWQpOiAkIVxuIjsKKwkJcHJpbnQgIkNvbW1pdCBJRCAkY2lkXG4iIGlmICRvcHRfdjsKKwkJJHByLT5jbG9zZSgpOworCisJCXdhaXRwaWQoJHBpZCwwKTsKKwkJZGllICJFcnJvciBydW5uaW5nIGdpdC1jb21taXQtdHJlZTogJD9cbiIgaWYgJD87CisJfQorCisJaWYgKG5vdCBkZWZpbmVkICRjaWQpIHsKKwkJJGNpZCA9ICRicmFuY2hlc3siLyJ9eyJMQVNUIn07CisJfQorCisJaWYobm90IGRlZmluZWQgJGRlc3QpIHsKKwkJcHJpbnQgIi4uLiBubyBrbm93biBwYXJlbnRcbiIgaWYgJG9wdF92OworCX0gZWxzaWYobm90ICR0YWcpIHsKKwkJcHJpbnQgIldyaXRpbmcgdG8gcmVmcy9oZWFkcy8kZGVzdFxuIiBpZiAkb3B0X3Y7CisJCW9wZW4oQywiPiRnaXRfZGlyL3JlZnMvaGVhZHMvJGRlc3QiKSBhbmQKKwkJcHJpbnQgQyAoIiRjaWRcbiIpIGFuZAorCQljbG9zZShDKQorCQkJb3IgZGllICJDYW5ub3Qgd3JpdGUgYnJhbmNoICRkZXN0IGZvciB1cGRhdGU6ICQhXG4iOworCX0KKworCWlmKCR0YWcpIHsKKwkJbXkoJGluLCAkb3V0KSA9ICgnJywnJyk7CisJCSRsYXN0X3JldiA9ICItIiBpZiAlJGNoYW5nZWRfcGF0aHM7CisJCSMgdGhlIHRhZyB3YXMgJ2NvbXBsZXgnLCBpLmUuIGRpZCBub3QgcmVmZXIgdG8gYSAicmVhbCIgcmV2aXNpb24KKworCQkkZGVzdCA9fiB0ci9fL1wuLyBpZiAkb3B0X3U7CisJCSRicmFuY2ggPSAkZGVzdDsKKworCQlteSAkcGlkID0gb3BlbjIoJGluLCAkb3V0LCAnZ2l0LW1rdGFnJyk7CisJCXByaW50ICRvdXQgKCJvYmplY3QgJGNpZFxuIi4KKwkJICAgICJ0eXBlIGNvbW1pdFxuIi4KKwkJICAgICJ0YWcgJGRlc3RcbiIuCisJCSAgICAidGFnZ2VyICRjb21taXR0ZXJfbmFtZSA8JGNvbW1pdHRlcl9lbWFpbD4gMCArMDAwMFxuIikgYW5kCisJCWNsb3NlKCRvdXQpCisJCSAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnIG9iamVjdCAkZGVzdDogJCFcbiI7CisKKwkJbXkgJHRhZ29iaiA9IDwkaW4+OworCQljaG9tcCAkdGFnb2JqOworCisJCWlmICggIWNsb3NlKCRpbikgb3Igd2FpdHBpZCgkcGlkLCAwKSAhPSAkcGlkIG9yCisJCQkJJD8gIT0gMCBvciAkdGFnb2JqICF+IC9eWzAxMjM0NTY3ODlhYmNkZWZdezQwfSQvICkgeworCQkJZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJGRlc3Q6ICQhXG4iOworCQl9CisKKwkJb3BlbihDLCI+JGdpdF9kaXIvcmVmcy90YWdzLyRkZXN0IikgYW5kCisJCXByaW50IEMgKCIkdGFnb2JqXG4iKSBhbmQKKwkJY2xvc2UoQykKKwkJCW9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgJGJyYW5jaDogJCFcbiI7CisKKwkJcHJpbnQgIkNyZWF0ZWQgdGFnICckZGVzdCcgb24gJyRicmFuY2gnXG4iIGlmICRvcHRfdjsKKwl9CisJJGJyYW5jaGVzeyRicmFuY2h9eyJMQVNUIn0gPSAkY2lkOworCSRicmFuY2hlc3skYnJhbmNofXskcmV2aXNpb259ID0gJGNpZDsKKwkkbGFzdF9yZXYgPSAkY2lkOworCXByaW50IEJSQU5DSEVTICIkcmV2aXNpb24gJGJyYW5jaCAkY2lkXG4iOworCXByaW50ICJET05FOiAkcmV2aXNpb24gJGRlc3QgJGNpZFxuIiBpZiAkb3B0X3Y7Cit9CisKK3N1YiBjb21taXRfYWxsIHsKKwkjIFJlY3Vyc2l2ZSB1c2Ugb2YgdGhlIFNWTiBjb25uZWN0aW9uIGRvZXMgbm90IHdvcmsKKwlsb2NhbCAkc3ZuID0gJHN2bjI7CisKKwlteSAoJGNoYW5nZWRfcGF0aHMsICRyZXZpc2lvbiwgJGF1dGhvciwgJGRhdGUsICRtZXNzYWdlLCAkcG9vbCkgPSBAXzsKKwlteSAlcDsKKwl3aGlsZShteSgkcGF0aCwkYWN0aW9uKSA9IGVhY2ggJSRjaGFuZ2VkX3BhdGhzKSB7CisJCSRweyRwYXRofSA9IFsgJGFjdGlvbi0+YWN0aW9uLCRhY3Rpb24tPmNvcHlmcm9tX3BhdGgsICRhY3Rpb24tPmNvcHlmcm9tX3JldiwgJHBhdGggXTsKKwl9CisJJGNoYW5nZWRfcGF0aHMgPSBcJXA7CisKKwlteSAlZG9uZTsKKwlteSBAY29sOworCW15ICRwcmVmOworCW15ICRicmFuY2g7CisKKwl3aGlsZShteSgkcGF0aCwkYWN0aW9uKSA9IGVhY2ggJSRjaGFuZ2VkX3BhdGhzKSB7CisJCSgkYnJhbmNoLCRwYXRoKSA9IHNwbGl0X3BhdGgoJHJldmlzaW9uLCRwYXRoKTsKKwkJbmV4dCBpZiBub3QgZGVmaW5lZCAkYnJhbmNoOworCQluZXh0IGlmIG5vdCBkZWZpbmVkICRwYXRoOworCQkkZG9uZXskYnJhbmNofXskcGF0aH0gPSAkYWN0aW9uOworCX0KKwl3aGlsZSgoJGJyYW5jaCwkY2hhbmdlZF9wYXRocykgPSBlYWNoICVkb25lKSB7CisJCWNvbW1pdCgkYnJhbmNoLCAkY2hhbmdlZF9wYXRocywgJHJldmlzaW9uLCAkYXV0aG9yLCAkZGF0ZSwgJG1lc3NhZ2UpOworCX0KK30KKworJG9wdF9sID0gJHN2bi0+eydtYXhyZXYnfSBpZiBub3QgZGVmaW5lZCAkb3B0X2wgb3IgJG9wdF9sID4gJHN2bi0+eydtYXhyZXYnfTsKKworaWYgKCRvcHRfbCA8ICRjdXJyZW50X3JldikgeworICAgIHByaW50ICJVcCB0byBkYXRlOiBubyBuZXcgcmV2aXNpb25zIHRvIGZldGNoIVxuIiBpZiAkb3B0X3Y7CisgICAgdW5saW5rKCIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKTsKKyAgICBleGl0OworfQorCitwcmludCAiUHJvY2Vzc2luZyBmcm9tICRjdXJyZW50X3JldiB0byAkb3B0X2wgLi4uXG4iIGlmICRvcHRfdjsKKworbXkgJGZyb21fcmV2OworbXkgJHRvX3JldiA9ICRjdXJyZW50X3JldiAtIDE7CisKK3doaWxlICgkdG9fcmV2IDwgJG9wdF9sKSB7CisJJGZyb21fcmV2ID0gJHRvX3JldiArIDE7CisJJHRvX3JldiA9ICRmcm9tX3JldiArICRyZXBhY2tfYWZ0ZXI7CisJJHRvX3JldiA9ICRvcHRfbCBpZiAkb3B0X2wgPCAkdG9fcmV2OworCXByaW50ICJGZXRjaGluZyBmcm9tICRmcm9tX3JldiB0byAkdG9fcmV2IC4uLlxuIiBpZiAkb3B0X3Y7CisJbXkgJHBvb2w9U1ZOOjpQb29sLT5uZXc7CisJJHN2bi0+eydzdm4nfS0+Z2V0X2xvZygiLyIsJGZyb21fcmV2LCR0b19yZXYsMCwxLDEsXCZjb21taXRfYWxsLCRwb29sKTsKKwkkcG9vbC0+Y2xlYXI7CisJbXkgJHBpZCA9IGZvcmsoKTsKKwlkaWUgIkZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJdW5sZXNzKCRwaWQpIHsKKwkJZXhlYygiZ2l0LXJlcGFjayIsICItZCIpCisJCQlvciBkaWUgIkNhbm5vdCByZXBhY2s6ICQhXG4iOworCX0KKwl3YWl0cGlkKCRwaWQsIDApOworfQorCisKK3VubGluaygkZ2l0X2luZGV4KTsKKworaWYgKGRlZmluZWQgJG9yaWdfZ2l0X2luZGV4KSB7CisJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkb3JpZ19naXRfaW5kZXg7Cit9IGVsc2UgeworCWRlbGV0ZSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK30KKworIyBOb3cgc3dpdGNoIGJhY2sgdG8gdGhlIGJyYW5jaCB3ZSB3ZXJlIGluIGJlZm9yZSBhbGwgb2YgdGhpcyBoYXBwZW5lZAoraWYoJG9yaWdfYnJhbmNoKSB7CisJcHJpbnQgIkRPTkVcbiIgaWYgJG9wdF92IGFuZCAobm90IGRlZmluZWQgJG9wdF9sIG9yICRvcHRfbCA+IDApOworCXN5c3RlbSgiY3AiLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIikKKwkJaWYgJGZvcndhcmRfbWFzdGVyOworCXVubGVzcyAoJG9wdF9pKSB7CisJCXN5c3RlbSgnZ2l0LXJlYWQtdHJlZScsICctbScsICctdScsICdTVk4yR0lUX0hFQUQnLCAnSEVBRCcpOworCQlkaWUgInJlYWQtdHJlZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30gZWxzZSB7CisJJG9yaWdfYnJhbmNoID0gIm1hc3RlciI7CisJcHJpbnQgIkRPTkU7IGNyZWF0aW5nICRvcmlnX2JyYW5jaCBicmFuY2hcbiIgaWYgJG9wdF92IGFuZCAobm90IGRlZmluZWQgJG9wdF9sIG9yICRvcHRfbCA+IDApOworCXN5c3RlbSgiY3AiLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIikKKwkJdW5sZXNzIC1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciI7CisJc3lzdGVtKCdnaXQtdXBkYXRlLXJlZicsICdIRUFEJywgIiRvcmlnX2JyYW5jaCIpOworCXVubGVzcyAoJG9wdF9pKSB7CisJCXN5c3RlbSgnZ2l0IGNoZWNrb3V0Jyk7CisJCWRpZSAiY2hlY2tvdXQgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKwl9Cit9Cit1bmxpbmsoIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworY2xvc2UoQlJBTkNIRVMpOwpkaWZmIC0tZ2l0IGEvZ2l0LXRhZy5zaCBiL2dpdC10YWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYwYjdhNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC10YWcuc2gKQEAgLTAsMCArMSwxNTMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKworVVNBR0U9Jy1sIFs8cGF0dGVybj5dIHwgWy1hIHwgLXMgfCAtdSA8a2V5LWlkPl0gWy1mIHwgLWQgfCAtdl0gWy1tIDxtc2c+XSA8dGFnbmFtZT4gWzxoZWFkPl0nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK21lc3NhZ2VfZ2l2ZW49Cithbm5vdGF0ZT0KK3NpZ25lZD0KK2ZvcmNlPQorbWVzc2FnZT0KK3VzZXJuYW1lPQorbGlzdD0KK3ZlcmlmeT0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworICAgIGNhc2UgIiQxIiBpbgorICAgIC1hKQorCWFubm90YXRlPTEKKwk7OworICAgIC1zKQorCWFubm90YXRlPTEKKwlzaWduZWQ9MQorCTs7CisgICAgLWYpCisJZm9yY2U9MQorCTs7CisgICAgLWwpCisJY2FzZSAiJCMiIGluCisJMSkKKwkJc2V0IHggLiA7OworCWVzYWMKKwlzaGlmdAorCWdpdCByZXYtcGFyc2UgLS1zeW1ib2xpYyAtLXRhZ3MgfCBzb3J0IHwgZ3JlcCAiJEAiCisJZXhpdCAkPworCTs7CisgICAgLW0pCisgICAgCWFubm90YXRlPTEKKwlzaGlmdAorCW1lc3NhZ2U9IiQxIgorCWlmIHRlc3QgIiQjIiA9ICIwIjsgdGhlbgorCSAgICBkaWUgImVycm9yOiBvcHRpb24gLW0gbmVlZHMgYW4gYXJndW1lbnQiCisJZWxzZQorCSAgICBtZXNzYWdlX2dpdmVuPTEKKwlmaQorCTs7CisgICAgLUYpCisJYW5ub3RhdGU9MQorCXNoaWZ0CisJaWYgdGVzdCAiJCMiID0gIjAiOyB0aGVuCisJICAgIGRpZSAiZXJyb3I6IG9wdGlvbiAtRiBuZWVkcyBhbiBhcmd1bWVudCIKKwllbHNlCisJICAgIG1lc3NhZ2U9IiQoY2F0ICIkMSIpIgorCSAgICBtZXNzYWdlX2dpdmVuPTEKKwlmaQorCTs7CisgICAgLXUpCisJYW5ub3RhdGU9MQorCXNpZ25lZD0xCisJc2hpZnQKKwl1c2VybmFtZT0iJDEiCisJOzsKKyAgICAtZCkKKyAgICAJc2hpZnQKKwloYWRfZXJyb3I9MAorCWZvciB0YWcKKwlkbworCQljdXI9JChnaXQtc2hvdy1yZWYgLS12ZXJpZnkgLS1oYXNoIC0tICJyZWZzL3RhZ3MvJHRhZyIpIHx8IHsKKwkJCWVjaG8gPiYyICJTZXJpb3VzbHksIHdoYXQgdGFnIGFyZSB5b3UgdGFsa2luZyBhYm91dD8iCisJCQloYWRfZXJyb3I9MQorCQkJY29udGludWUKKwkJfQorCQlnaXQtdXBkYXRlLXJlZiAtbSAndGFnOiBkZWxldGUnIC1kICJyZWZzL3RhZ3MvJHRhZyIgIiRjdXIiIHx8IHsKKwkJCWhhZF9lcnJvcj0xCisJCQljb250aW51ZQorCQl9CisJCWVjaG8gIkRlbGV0ZWQgdGFnICR0YWcuIgorCWRvbmUKKwlleGl0ICRoYWRfZXJyb3IKKwk7OworICAgIC12KQorCXNoaWZ0CisJdGFnX25hbWU9IiQxIgorCXRhZz0kKGdpdC1zaG93LXJlZiAtLXZlcmlmeSAtLWhhc2ggLS0gInJlZnMvdGFncy8kdGFnX25hbWUiKSB8fAorCQlkaWUgIlNlcmlvdXNseSwgd2hhdCB0YWcgYXJlIHlvdSB0YWxraW5nIGFib3V0PyIKKwlnaXQtdmVyaWZ5LXRhZyAtdiAiJHRhZyIKKwlleGl0ICQ/CisJOzsKKyAgICAtKikKKyAgICAgICAgdXNhZ2UKKwk7OworICAgICopCisJYnJlYWsKKwk7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCituYW1lPSIkMSIKK1sgIiRuYW1lIiBdIHx8IHVzYWdlCitwcmV2PTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2lmIGdpdC1zaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL3RhZ3MvJG5hbWUiCit0aGVuCisgICAgdGVzdCAtbiAiJGZvcmNlIiB8fCBkaWUgInRhZyAnJG5hbWUnIGFscmVhZHkgZXhpc3RzIgorICAgIHByZXY9YGdpdCByZXYtcGFyc2UgInJlZnMvdGFncy8kbmFtZSJgCitmaQorc2hpZnQKK2dpdC1jaGVjay1yZWYtZm9ybWF0ICJ0YWdzLyRuYW1lIiB8fAorCWRpZSAid2UgZG8gbm90IGxpa2UgJyRuYW1lJyBhcyBhIHRhZyBuYW1lLiIKKworb2JqZWN0PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8fCBleGl0IDEKK3R5cGU9JChnaXQtY2F0LWZpbGUgLXQgJG9iamVjdCkgfHwgZXhpdCAxCit0YWdnZXI9JChnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQpIHx8IGV4aXQgMQorCit0ZXN0IC1uICIkdXNlcm5hbWUiIHx8CisJdXNlcm5hbWU9JChnaXQtcmVwby1jb25maWcgdXNlci5zaWduaW5na2V5KSB8fAorCXVzZXJuYW1lPSQoZXhwciAieiR0YWdnZXIiIDogJ3pcKC4qPlwpJykKKwordHJhcCAncm0gLWYgIiRHSVRfRElSIi9UQUdfVE1QKiAiJEdJVF9ESVIiL1RBR19GSU5BTE1TRyAiJEdJVF9ESVIiL1RBR19FRElUTVNHJyAwCisKK2lmIFsgIiRhbm5vdGF0ZSIgXTsgdGhlbgorICAgIGlmIFsgLXogIiRtZXNzYWdlX2dpdmVuIiBdOyB0aGVuCisgICAgICAgICggZWNobyAiIyIKKyAgICAgICAgICBlY2hvICIjIFdyaXRlIGEgdGFnIG1lc3NhZ2UiCisgICAgICAgICAgZWNobyAiIyIgKSA+ICIkR0lUX0RJUiIvVEFHX0VESVRNU0cKKyAgICAgICAgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19ICIkR0lUX0RJUiIvVEFHX0VESVRNU0cgfHwgZXhpdAorICAgIGVsc2UKKyAgICAgICAgcHJpbnRmICclc1xuJyAiJG1lc3NhZ2UiID4iJEdJVF9ESVIiL1RBR19FRElUTVNHCisgICAgZmkKKworICAgIGdyZXAgLXYgJ14jJyA8IiRHSVRfRElSIi9UQUdfRURJVE1TRyB8CisgICAgZ2l0LXN0cmlwc3BhY2UgPiIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHCisKKyAgICBbIC1zICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHIC1vIC1uICIkbWVzc2FnZV9naXZlbiIgXSB8fCB7CisJZWNobyA+JjIgIk5vIHRhZyBtZXNzYWdlPyIKKwlleGl0IDEKKyAgICB9CisKKyAgICAoIHByaW50ZiAnb2JqZWN0ICVzXG50eXBlICVzXG50YWcgJXNcbnRhZ2dlciAlc1xuXG4nIFwKKwkiJG9iamVjdCIgIiR0eXBlIiAiJG5hbWUiICIkdGFnZ2VyIjsKKyAgICAgIGNhdCAiJEdJVF9ESVIiL1RBR19GSU5BTE1TRyApID4iJEdJVF9ESVIiL1RBR19UTVAKKyAgICBybSAtZiAiJEdJVF9ESVIiL1RBR19UTVAuYXNjICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHCisgICAgaWYgWyAiJHNpZ25lZCIgXTsgdGhlbgorCWdwZyAtYnNhIC11ICIkdXNlcm5hbWUiICIkR0lUX0RJUiIvVEFHX1RNUCAmJgorCWNhdCAiJEdJVF9ESVIiL1RBR19UTVAuYXNjID4+IiRHSVRfRElSIi9UQUdfVE1QIHx8CisJZGllICJmYWlsZWQgdG8gc2lnbiB0aGUgdGFnIHdpdGggR1BHLiIKKyAgICBmaQorICAgIG9iamVjdD0kKGdpdC1ta3RhZyA8ICIkR0lUX0RJUiIvVEFHX1RNUCkKK2ZpCisKK2dpdCB1cGRhdGUtcmVmICJyZWZzL3RhZ3MvJG5hbWUiICIkb2JqZWN0IiAiJHByZXYiCisKZGlmZiAtLWdpdCBhL2dpdC12ZXJpZnktdGFnLnNoIGIvZ2l0LXZlcmlmeS10YWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRiN2RkMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC12ZXJpZnktdGFnLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nPHRhZz4nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK3ZlcmJvc2U9Cit3aGlsZSBjYXNlICQjIGluIDApIGJyZWFrOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcmJ8LS12ZXJib3wtLXZlcmJvc3wtLXZlcmJvc2UpCisJCXZlcmJvc2U9dCA7OworCSopCisJCWJyZWFrIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2lmIFsgIiQjIiAhPSAiMSIgXQordGhlbgorCXVzYWdlCitmaQorCit0eXBlPSIkKGdpdC1jYXQtZmlsZSAtdCAiJDEiIDI+L2Rldi9udWxsKSIgfHwKKwlkaWUgIiQxOiBubyBzdWNoIG9iamVjdC4iCisKK3Rlc3QgIiR0eXBlIiA9IHRhZyB8fAorCWRpZSAiJDE6IGNhbm5vdCB2ZXJpZnkgYSBub24tdGFnIG9iamVjdCBvZiB0eXBlICR0eXBlLiIKKworY2FzZSAiJHZlcmJvc2UiIGluCit0KQorCWdpdC1jYXQtZmlsZSAtcCAiJDEiIHwKKwlzZWQgLW4gLWUgJy9eLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0vcScgLWUgcAorCTs7Citlc2FjCisKK3RyYXAgJ3JtIC1mICIkR0lUX0RJUi8udG1wLXZ0YWciJyAwCisKK2dpdC1jYXQtZmlsZSB0YWcgIiQxIiA+IiRHSVRfRElSLy50bXAtdnRhZyIgfHwgZXhpdCAxCisKK2NhdCAiJEdJVF9ESVIvLnRtcC12dGFnIiB8CitzZWQgJy8tLS0tLUJFR0lOIFBHUC9RJyB8CitncGcgLS12ZXJpZnkgIiRHSVRfRElSLy50bXAtdnRhZyIgLSB8fCBleGl0IDEKK3JtIC1mICIkR0lUX0RJUi8udG1wLXZ0YWciCisKZGlmZiAtLWdpdCBhL2dpdC5jIGIvZ2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliNTVhMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC5jCkBAIC0wLDAgKzEsNDIxIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitjb25zdCBjaGFyIGdpdF91c2FnZV9zdHJpbmdbXSA9CisJImdpdCBbLS12ZXJzaW9uXSBbLS1leGVjLXBhdGhbPUdJVF9FWEVDX1BBVEhdXSBbLXB8LS1wYWdpbmF0ZV0gWy0tYmFyZV0gWy0tZ2l0LWRpcj1HSVRfRElSXSBbLS1oZWxwXSBDT01NQU5EIFtBUkdTXSI7CisKK3N0YXRpYyB2b2lkIHByZXBlbmRfdG9fcGF0aChjb25zdCBjaGFyICpkaXIsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqb2xkX3BhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwljaGFyICpwYXRoOworCWludCBwYXRoX2xlbiA9IGxlbjsKKworCWlmICghb2xkX3BhdGgpCisJCW9sZF9wYXRoID0gIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW4iOworCisJcGF0aF9sZW4gPSBsZW4gKyBzdHJsZW4ob2xkX3BhdGgpICsgMTsKKworCXBhdGggPSB4bWFsbG9jKHBhdGhfbGVuICsgMSk7CisKKwltZW1jcHkocGF0aCwgZGlyLCBsZW4pOworCXBhdGhbbGVuXSA9ICc6JzsKKwltZW1jcHkocGF0aCArIGxlbiArIDEsIG9sZF9wYXRoLCBwYXRoX2xlbiAtIGxlbik7CisKKwlzZXRlbnYoIlBBVEgiLCBwYXRoLCAxKTsKKworCWZyZWUocGF0aCk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29wdGlvbnMoY29uc3QgY2hhcioqKiBhcmd2LCBpbnQqIGFyZ2MpCit7CisJaW50IGhhbmRsZWQgPSAwOworCisJd2hpbGUgKCphcmdjID4gMCkgeworCQljb25zdCBjaGFyICpjbWQgPSAoKmFyZ3YpWzBdOworCQlpZiAoY21kWzBdICE9ICctJykKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEZvciBsZWdhY3kgcmVhc29ucywgdGhlICJ2ZXJzaW9uIiBhbmQgImhlbHAiCisJCSAqIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHdpdGggIi0tIiBwcmVwZW5kZWQKKwkJICogdG8gbWFrZSB0aGVtIGxvb2sgbGlrZSBmbGFncy4KKwkJICovCisJCWlmICghc3RyY21wKGNtZCwgIi0taGVscCIpIHx8ICFzdHJjbXAoY21kLCAiLS12ZXJzaW9uIikpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBDaGVjayByZW1haW5pbmcgZmxhZ3MuCisJCSAqLworCQlpZiAoIXByZWZpeGNtcChjbWQsICItLWV4ZWMtcGF0aCIpKSB7CisJCQljbWQgKz0gMTE7CisJCQlpZiAoKmNtZCA9PSAnPScpCisJCQkJZ2l0X3NldF9leGVjX3BhdGgoY21kICsgMSk7CisJCQllbHNlIHsKKwkJCQlwdXRzKGdpdF9leGVjX3BhdGgoKSk7CisJCQkJZXhpdCgwKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi1wIikgfHwgIXN0cmNtcChjbWQsICItLXBhZ2luYXRlIikpIHsKKwkJCXNldHVwX3BhZ2VyKCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItLWdpdC1kaXIiKSkgeworCQkJaWYgKCphcmdjIDwgMikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gZGlyZWN0b3J5IGdpdmVuIGZvciAtLWdpdC1kaXIuXG4iICk7CisJCQkJdXNhZ2UoZ2l0X3VzYWdlX3N0cmluZyk7CisJCQl9CisJCQlzZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCwgKCphcmd2KVsxXSwgMSk7CisJCQkoKmFyZ3YpKys7CisJCQkoKmFyZ2MpLS07CisJCQloYW5kbGVkKys7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChjbWQsICItLWdpdC1kaXI9IikpIHsKKwkJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCBjbWQgKyAxMCwgMSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItLWJhcmUiKSkgeworCQkJc3RhdGljIGNoYXIgZ2l0X2RpcltQQVRIX01BWCsxXTsKKwkJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCBnZXRjd2QoZ2l0X2Rpciwgc2l6ZW9mKGdpdF9kaXIpKSwgMSk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uOiAlc1xuIiwgY21kKTsKKwkJCXVzYWdlKGdpdF91c2FnZV9zdHJpbmcpOworCQl9CisKKwkJKCphcmd2KSsrOworCQkoKmFyZ2MpLS07CisJCWhhbmRsZWQrKzsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphbGlhc19jb21tYW5kOworc3RhdGljIGNoYXIgKmFsaWFzX3N0cmluZzsKKworc3RhdGljIGludCBnaXRfYWxpYXNfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFwcmVmaXhjbXAodmFyLCAiYWxpYXMuIikgJiYgIXN0cmNtcCh2YXIgKyA2LCBhbGlhc19jb21tYW5kKSkgeworCQlhbGlhc19zdHJpbmcgPSB4c3RyZHVwKHZhbHVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IHNyYywgZHN0LCBjb3VudCA9IDAsIHNpemUgPSAxNjsKKwljaGFyIHF1b3RlZCA9IDA7CisKKwkqYXJndiA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIHNpemUpOworCisJLyogc3BsaXQgYWxpYXNfc3RyaW5nICovCisJKCphcmd2KVtjb3VudCsrXSA9IGNtZGxpbmU7CisJZm9yIChzcmMgPSBkc3QgPSAwOyBjbWRsaW5lW3NyY107KSB7CisJCWNoYXIgYyA9IGNtZGxpbmVbc3JjXTsKKwkJaWYgKCFxdW90ZWQgJiYgaXNzcGFjZShjKSkgeworCQkJY21kbGluZVtkc3QrK10gPSAwOworCQkJd2hpbGUgKGNtZGxpbmVbKytzcmNdCisJCQkJCSYmIGlzc3BhY2UoY21kbGluZVtzcmNdKSkKKwkJCQk7IC8qIHNraXAgKi8KKwkJCWlmIChjb3VudCA+PSBzaXplKSB7CisJCQkJc2l6ZSArPSAxNjsKKwkJCQkqYXJndiA9IHhyZWFsbG9jKCphcmd2LCBzaXplb2YoY2hhciopICogc2l6ZSk7CisJCQl9CisJCQkoKmFyZ3YpW2NvdW50KytdID0gY21kbGluZSArIGRzdDsKKwkJfSBlbHNlIGlmKCFxdW90ZWQgJiYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykpIHsKKwkJCXF1b3RlZCA9IGM7CisJCQlzcmMrKzsKKwkJfSBlbHNlIGlmIChjID09IHF1b3RlZCkgeworCQkJcXVvdGVkID0gMDsKKwkJCXNyYysrOworCQl9IGVsc2UgeworCQkJaWYgKGMgPT0gJ1xcJyAmJiBxdW90ZWQgIT0gJ1wnJykgeworCQkJCXNyYysrOworCQkJCWMgPSBjbWRsaW5lW3NyY107CisJCQkJaWYgKCFjKSB7CisJCQkJCWZyZWUoKmFyZ3YpOworCQkJCQkqYXJndiA9IE5VTEw7CisJCQkJCXJldHVybiBlcnJvcigiY21kbGluZSBlbmRzIHdpdGggXFwiKTsKKwkJCQl9CisJCQl9CisJCQljbWRsaW5lW2RzdCsrXSA9IGM7CisJCQlzcmMrKzsKKwkJfQorCX0KKworCWNtZGxpbmVbZHN0XSA9IDA7CisKKwlpZiAocXVvdGVkKSB7CisJCWZyZWUoKmFyZ3YpOworCQkqYXJndiA9IE5VTEw7CisJCXJldHVybiBlcnJvcigidW5jbG9zZWQgcXVvdGUiKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2FsaWFzKGludCAqYXJnY3AsIGNvbnN0IGNoYXIgKioqYXJndikKK3sKKwlpbnQgbm9uZ2l0ID0gMCwgcmV0ID0gMCwgc2F2ZWRfZXJybm8gPSBlcnJubzsKKwljb25zdCBjaGFyICpzdWJkaXI7CisJaW50IGNvdW50LCBvcHRpb25fY291bnQ7CisJY29uc3QgY2hhcioqIG5ld19hcmd2OworCisJc3ViZGlyID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisKKwlhbGlhc19jb21tYW5kID0gKCphcmd2KVswXTsKKwlnaXRfY29uZmlnKGdpdF9hbGlhc19jb25maWcpOworCWlmIChhbGlhc19zdHJpbmcpIHsKKwkJaWYgKGFsaWFzX3N0cmluZ1swXSA9PSAnIScpIHsKKwkJCXRyYWNlX3ByaW50ZigidHJhY2U6IGFsaWFzIHRvIHNoZWxsIGNtZDogJXMgPT4gJXNcbiIsCisJCQkJICAgICBhbGlhc19jb21tYW5kLCBhbGlhc19zdHJpbmcgKyAxKTsKKwkJCXJldCA9IHN5c3RlbShhbGlhc19zdHJpbmcgKyAxKTsKKwkJCWlmIChyZXQgPj0gMCAmJiBXSUZFWElURUQocmV0KSAmJgorCQkJICAgIFdFWElUU1RBVFVTKHJldCkgIT0gMTI3KQorCQkJCWV4aXQoV0VYSVRTVEFUVVMocmV0KSk7CisJCQlkaWUoIkZhaWxlZCB0byBydW4gJyVzJyB3aGVuIGV4cGFuZGluZyBhbGlhcyAnJXMnXG4iLAorCQkJICAgIGFsaWFzX3N0cmluZyArIDEsIGFsaWFzX2NvbW1hbmQpOworCQl9CisJCWNvdW50ID0gc3BsaXRfY21kbGluZShhbGlhc19zdHJpbmcsICZuZXdfYXJndik7CisJCW9wdGlvbl9jb3VudCA9IGhhbmRsZV9vcHRpb25zKCZuZXdfYXJndiwgJmNvdW50KTsKKwkJbWVtbW92ZShuZXdfYXJndiAtIG9wdGlvbl9jb3VudCwgbmV3X2FyZ3YsCisJCQkJY291bnQgKiBzaXplb2YoY2hhciAqKSk7CisJCW5ld19hcmd2IC09IG9wdGlvbl9jb3VudDsKKworCQlpZiAoY291bnQgPCAxKQorCQkJZGllKCJlbXB0eSBhbGlhcyBmb3IgJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQlpZiAoIXN0cmNtcChhbGlhc19jb21tYW5kLCBuZXdfYXJndlswXSkpCisJCQlkaWUoInJlY3Vyc2l2ZSBhbGlhczogJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQl0cmFjZV9hcmd2X3ByaW50ZihuZXdfYXJndiwgY291bnQsCisJCQkJICAidHJhY2U6IGFsaWFzIGV4cGFuc2lvbjogJXMgPT4iLAorCQkJCSAgYWxpYXNfY29tbWFuZCk7CisKKwkJbmV3X2FyZ3YgPSB4cmVhbGxvYyhuZXdfYXJndiwgc2l6ZW9mKGNoYXIqKSAqCisJCQkJICAgIChjb3VudCArICphcmdjcCArIDEpKTsKKwkJLyogaW5zZXJ0IGFmdGVyIGNvbW1hbmQgbmFtZSAqLworCQltZW1jcHkobmV3X2FyZ3YgKyBjb3VudCwgKmFyZ3YgKyAxLCBzaXplb2YoY2hhciopICogKmFyZ2NwKTsKKwkJbmV3X2FyZ3ZbY291bnQrKmFyZ2NwXSA9IE5VTEw7CisKKwkJKmFyZ3YgPSBuZXdfYXJndjsKKwkJKmFyZ2NwICs9IGNvdW50IC0gMTsKKworCQlyZXQgPSAxOworCX0KKworCWlmIChzdWJkaXIpCisJCWNoZGlyKHN1YmRpcik7CisKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCisJcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciBnaXRfdmVyc2lvbl9zdHJpbmdbXSA9IEdJVF9WRVJTSU9OOworCisjZGVmaW5lIFJVTl9TRVRVUAkoMTw8MCkKKyNkZWZpbmUgVVNFX1BBR0VSCSgxPDwxKQorLyoKKyAqIHJlcXVpcmUgd29ya2luZyB0cmVlIHRvIGJlIHByZXNlbnQgLS0gYW55dGhpbmcgdXNlcyB0aGlzIG5lZWRzCisgKiBSVU5fU0VUVVAgZm9yIHJlYWRpbmcgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisjZGVmaW5lIE5PVF9CQVJFIAkoMTw8MikKKworc3RhdGljIHZvaWQgaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwljb25zdCBjaGFyICpjbWQgPSBhcmd2WzBdOworCXN0YXRpYyBzdHJ1Y3QgY21kX3N0cnVjdCB7CisJCWNvbnN0IGNoYXIgKmNtZDsKKwkJaW50ICgqZm4pKGludCwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKTsKKwkJaW50IG9wdGlvbjsKKwl9IGNvbW1hbmRzW10gPSB7CisJCXsgImFkZCIsIGNtZF9hZGQsIFJVTl9TRVRVUCB8IE5PVF9CQVJFIH0sCisJCXsgImFubm90YXRlIiwgY21kX2Fubm90YXRlLCBSVU5fU0VUVVAgfCBVU0VfUEFHRVIgfSwKKwkJeyAiYXBwbHkiLCBjbWRfYXBwbHkgfSwKKwkJeyAiYXJjaGl2ZSIsIGNtZF9hcmNoaXZlIH0sCisJCXsgImJsYW1lIiwgY21kX2JsYW1lLCBSVU5fU0VUVVAgfSwKKwkJeyAiYnJhbmNoIiwgY21kX2JyYW5jaCwgUlVOX1NFVFVQIH0sCisJCXsgImJ1bmRsZSIsIGNtZF9idW5kbGUgfSwKKwkJeyAiY2F0LWZpbGUiLCBjbWRfY2F0X2ZpbGUsIFJVTl9TRVRVUCB9LAorCQl7ICJjaGVja291dC1pbmRleCIsIGNtZF9jaGVja291dF9pbmRleCwgUlVOX1NFVFVQIH0sCisJCXsgImNoZWNrLXJlZi1mb3JtYXQiLCBjbWRfY2hlY2tfcmVmX2Zvcm1hdCB9LAorCQl7ICJjaGVjay1hdHRyIiwgY21kX2NoZWNrX2F0dHIsIFJVTl9TRVRVUCB8IE5PVF9CQVJFIH0sCisJCXsgImNoZXJyeSIsIGNtZF9jaGVycnksIFJVTl9TRVRVUCB9LAorCQl7ICJjaGVycnktcGljayIsIGNtZF9jaGVycnlfcGljaywgUlVOX1NFVFVQIHwgTk9UX0JBUkUgfSwKKwkJeyAiY29tbWl0LXRyZWUiLCBjbWRfY29tbWl0X3RyZWUsIFJVTl9TRVRVUCB9LAorCQl7ICJjb25maWciLCBjbWRfY29uZmlnIH0sCisJCXsgImNvdW50LW9iamVjdHMiLCBjbWRfY291bnRfb2JqZWN0cywgUlVOX1NFVFVQIH0sCisJCXsgImRlc2NyaWJlIiwgY21kX2Rlc2NyaWJlLCBSVU5fU0VUVVAgfSwKKwkJeyAiZGlmZiIsIGNtZF9kaWZmLCBVU0VfUEFHRVIgfSwKKwkJeyAiZGlmZi1maWxlcyIsIGNtZF9kaWZmX2ZpbGVzIH0sCisJCXsgImRpZmYtaW5kZXgiLCBjbWRfZGlmZl9pbmRleCwgUlVOX1NFVFVQIH0sCisJCXsgImRpZmYtdHJlZSIsIGNtZF9kaWZmX3RyZWUsIFJVTl9TRVRVUCB9LAorCQl7ICJmZXRjaC0tdG9vbCIsIGNtZF9mZXRjaF9fdG9vbCwgUlVOX1NFVFVQIH0sCisJCXsgImZtdC1tZXJnZS1tc2ciLCBjbWRfZm10X21lcmdlX21zZywgUlVOX1NFVFVQIH0sCisJCXsgImZvci1lYWNoLXJlZiIsIGNtZF9mb3JfZWFjaF9yZWYsIFJVTl9TRVRVUCB9LAorCQl7ICJmb3JtYXQtcGF0Y2giLCBjbWRfZm9ybWF0X3BhdGNoLCBSVU5fU0VUVVAgfSwKKwkJeyAiZnNjayIsIGNtZF9mc2NrLCBSVU5fU0VUVVAgfSwKKwkJeyAiZnNjay1vYmplY3RzIiwgY21kX2ZzY2ssIFJVTl9TRVRVUCB9LAorCQl7ICJnYyIsIGNtZF9nYywgUlVOX1NFVFVQIH0sCisJCXsgImdldC10YXItY29tbWl0LWlkIiwgY21kX2dldF90YXJfY29tbWl0X2lkIH0sCisJCXsgImdyZXAiLCBjbWRfZ3JlcCwgUlVOX1NFVFVQIHwgVVNFX1BBR0VSIH0sCisJCXsgImhlbHAiLCBjbWRfaGVscCB9LAorCQl7ICJpbml0IiwgY21kX2luaXRfZGIgfSwKKwkJeyAiaW5pdC1kYiIsIGNtZF9pbml0X2RiIH0sCisJCXsgImxvZyIsIGNtZF9sb2csIFJVTl9TRVRVUCB8IFVTRV9QQUdFUiB9LAorCQl7ICJscy1maWxlcyIsIGNtZF9sc19maWxlcywgUlVOX1NFVFVQIH0sCisJCXsgImxzLXRyZWUiLCBjbWRfbHNfdHJlZSwgUlVOX1NFVFVQIH0sCisJCXsgIm1haWxpbmZvIiwgY21kX21haWxpbmZvIH0sCisJCXsgIm1haWxzcGxpdCIsIGNtZF9tYWlsc3BsaXQgfSwKKwkJeyAibWVyZ2UtYmFzZSIsIGNtZF9tZXJnZV9iYXNlLCBSVU5fU0VUVVAgfSwKKwkJeyAibWVyZ2UtZmlsZSIsIGNtZF9tZXJnZV9maWxlIH0sCisJCXsgIm12IiwgY21kX212LCBSVU5fU0VUVVAgfCBOT1RfQkFSRSB9LAorCQl7ICJuYW1lLXJldiIsIGNtZF9uYW1lX3JldiwgUlVOX1NFVFVQIH0sCisJCXsgInBhY2stb2JqZWN0cyIsIGNtZF9wYWNrX29iamVjdHMsIFJVTl9TRVRVUCB9LAorCQl7ICJwaWNrYXhlIiwgY21kX2JsYW1lLCBSVU5fU0VUVVAgfCBVU0VfUEFHRVIgfSwKKwkJeyAicHJ1bmUiLCBjbWRfcHJ1bmUsIFJVTl9TRVRVUCB9LAorCQl7ICJwcnVuZS1wYWNrZWQiLCBjbWRfcHJ1bmVfcGFja2VkLCBSVU5fU0VUVVAgfSwKKwkJeyAicHVzaCIsIGNtZF9wdXNoLCBSVU5fU0VUVVAgfSwKKwkJeyAicmVhZC10cmVlIiwgY21kX3JlYWRfdHJlZSwgUlVOX1NFVFVQIH0sCisJCXsgInJlZmxvZyIsIGNtZF9yZWZsb2csIFJVTl9TRVRVUCB9LAorCQl7ICJyZXBvLWNvbmZpZyIsIGNtZF9jb25maWcgfSwKKwkJeyAicmVyZXJlIiwgY21kX3JlcmVyZSwgUlVOX1NFVFVQIH0sCisJCXsgInJldi1saXN0IiwgY21kX3Jldl9saXN0LCBSVU5fU0VUVVAgfSwKKwkJeyAicmV2LXBhcnNlIiwgY21kX3Jldl9wYXJzZSwgUlVOX1NFVFVQIH0sCisJCXsgInJldmVydCIsIGNtZF9yZXZlcnQsIFJVTl9TRVRVUCB8IE5PVF9CQVJFIH0sCisJCXsgInJtIiwgY21kX3JtLCBSVU5fU0VUVVAgfCBOT1RfQkFSRSB9LAorCQl7ICJydW5zdGF0dXMiLCBjbWRfcnVuc3RhdHVzLCBSVU5fU0VUVVAgfCBOT1RfQkFSRSB9LAorCQl7ICJzaG9ydGxvZyIsIGNtZF9zaG9ydGxvZywgUlVOX1NFVFVQIHwgVVNFX1BBR0VSIH0sCisJCXsgInNob3ctYnJhbmNoIiwgY21kX3Nob3dfYnJhbmNoLCBSVU5fU0VUVVAgfSwKKwkJeyAic2hvdyIsIGNtZF9zaG93LCBSVU5fU0VUVVAgfCBVU0VfUEFHRVIgfSwKKwkJeyAic3RyaXBzcGFjZSIsIGNtZF9zdHJpcHNwYWNlIH0sCisJCXsgInN5bWJvbGljLXJlZiIsIGNtZF9zeW1ib2xpY19yZWYsIFJVTl9TRVRVUCB9LAorCQl7ICJ0YXItdHJlZSIsIGNtZF90YXJfdHJlZSB9LAorCQl7ICJ1bnBhY2stb2JqZWN0cyIsIGNtZF91bnBhY2tfb2JqZWN0cywgUlVOX1NFVFVQIH0sCisJCXsgInVwZGF0ZS1pbmRleCIsIGNtZF91cGRhdGVfaW5kZXgsIFJVTl9TRVRVUCB9LAorCQl7ICJ1cGRhdGUtcmVmIiwgY21kX3VwZGF0ZV9yZWYsIFJVTl9TRVRVUCB9LAorCQl7ICJ1cGxvYWQtYXJjaGl2ZSIsIGNtZF91cGxvYWRfYXJjaGl2ZSB9LAorCQl7ICJ2ZXJzaW9uIiwgY21kX3ZlcnNpb24gfSwKKwkJeyAid2hhdGNoYW5nZWQiLCBjbWRfd2hhdGNoYW5nZWQsIFJVTl9TRVRVUCB8IFVTRV9QQUdFUiB9LAorCQl7ICJ3cml0ZS10cmVlIiwgY21kX3dyaXRlX3RyZWUsIFJVTl9TRVRVUCB9LAorCQl7ICJ2ZXJpZnktcGFjayIsIGNtZF92ZXJpZnlfcGFjayB9LAorCQl7ICJzaG93LXJlZiIsIGNtZF9zaG93X3JlZiwgUlVOX1NFVFVQIH0sCisJCXsgInBhY2stcmVmcyIsIGNtZF9wYWNrX3JlZnMsIFJVTl9TRVRVUCB9LAorCX07CisJaW50IGk7CisKKwkvKiBUdXJuICJnaXQgY21kIC0taGVscCIgaW50byAiZ2l0IGhlbHAgY21kIiAqLworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworCQlhcmd2WzFdID0gYXJndlswXTsKKwkJYXJndlswXSA9IGNtZCA9ICJoZWxwIjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykgeworCQlzdHJ1Y3QgY21kX3N0cnVjdCAqcCA9IGNvbW1hbmRzK2k7CisJCWNvbnN0IGNoYXIgKnByZWZpeDsKKwkJaWYgKHN0cmNtcChwLT5jbWQsIGNtZCkpCisJCQljb250aW51ZTsKKworCQlwcmVmaXggPSBOVUxMOworCQlpZiAocC0+b3B0aW9uICYgUlVOX1NFVFVQKQorCQkJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCQlpZiAocC0+b3B0aW9uICYgVVNFX1BBR0VSKQorCQkJc2V0dXBfcGFnZXIoKTsKKwkJaWYgKChwLT5vcHRpb24gJiBOT1RfQkFSRSkgJiYKKwkJCQkoaXNfYmFyZV9yZXBvc2l0b3J5KCkgfHwgaXNfaW5zaWRlX2dpdF9kaXIoKSkpCisJCQlkaWUoIiVzIG11c3QgYmUgcnVuIGluIGEgd29yayB0cmVlIiwgY21kKTsKKwkJdHJhY2VfYXJndl9wcmludGYoYXJndiwgYXJnYywgInRyYWNlOiBidWlsdC1pbjogZ2l0Iik7CisKKwkJZXhpdChwLT5mbihhcmdjLCBhcmd2LCBwcmVmaXgpKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXSA/IGFyZ3ZbMF0gOiAiZ2l0LWhlbHAiOworCWNoYXIgKnNsYXNoID0gc3RycmNocihjbWQsICcvJyk7CisJY29uc3QgY2hhciAqZXhlY19wYXRoID0gTlVMTDsKKwlpbnQgZG9uZV9hbGlhcyA9IDA7CisKKwkvKgorCSAqIFRha2UgdGhlIGJhc2VuYW1lIG9mIGFyZ3ZbMF0gYXMgdGhlIGNvbW1hbmQKKwkgKiBuYW1lLCBhbmQgdGhlIGRpcm5hbWUgYXMgdGhlIGRlZmF1bHQgZXhlY19wYXRoCisJICogaWYgaXQncyBhbiBhYnNvbHV0ZSBwYXRoIGFuZCB3ZSBkb24ndCBoYXZlCisJICogYW55dGhpbmcgYmV0dGVyLgorCSAqLworCWlmIChzbGFzaCkgeworCQkqc2xhc2grKyA9IDA7CisJCWlmICgqY21kID09ICcvJykKKwkJCWV4ZWNfcGF0aCA9IGNtZDsKKwkJY21kID0gc2xhc2g7CisJfQorCisJLyoKKwkgKiAiZ2l0LXh4eHgiIGlzIHRoZSBzYW1lIGFzICJnaXQgeHh4eCIsIGJ1dCB3ZSBvYnZpb3VzbHk6CisJICoKKwkgKiAgLSBjYW5ub3QgdGFrZSBmbGFncyBpbiBiZXR3ZWVuIHRoZSAiZ2l0IiBhbmQgdGhlICJ4eHh4Ii4KKwkgKiAgLSBjYW5ub3QgZXhlY3V0ZSBpdCBleHRlcm5hbGx5IChzaW5jZSBpdCB3b3VsZCBqdXN0IGRvCisJICogICAgdGhlIHNhbWUgdGhpbmcgb3ZlciBhZ2FpbikKKwkgKgorCSAqIFNvIHdlIGp1c3QgZGlyZWN0bHkgY2FsbCB0aGUgaW50ZXJuYWwgY29tbWFuZCBoYW5kbGVyLCBhbmQKKwkgKiBkaWUgaWYgdGhhdCBvbmUgY2Fubm90IGhhbmRsZSBpdC4KKwkgKi8KKwlpZiAoIXByZWZpeGNtcChjbWQsICJnaXQtIikpIHsKKwkJY21kICs9IDQ7CisJCWFyZ3ZbMF0gPSBjbWQ7CisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YsIGVudnApOworCQlkaWUoImNhbm5vdCBoYW5kbGUgJXMgaW50ZXJuYWxseSIsIGNtZCk7CisJfQorCisJLyogTG9vayBmb3IgZmxhZ3MuLiAqLworCWFyZ3YrKzsKKwlhcmdjLS07CisJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjKTsKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKCFwcmVmaXhjbXAoYXJndlswXSwgIi0tIikpCisJCQlhcmd2WzBdICs9IDI7CisJfSBlbHNlIHsKKwkJLyogRGVmYXVsdCBjb21tYW5kOiAiaGVscCIgKi8KKwkJYXJndlswXSA9ICJoZWxwIjsKKwkJYXJnYyA9IDE7CisJfQorCWNtZCA9IGFyZ3ZbMF07CisKKwkvKgorCSAqIFdlIHNlYXJjaCBmb3IgZ2l0IGNvbW1hbmRzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJICogIC0gZ2l0X2V4ZWNfcGF0aCgpCisJICogIC0gdGhlIHBhdGggb2YgdGhlICJnaXQiIGNvbW1hbmQgaWYgd2UgY291bGQgZmluZCBpdAorCSAqICAgIGluICQwCisJICogIC0gdGhlIHJlZ3VsYXIgUEFUSC4KKwkgKi8KKwlpZiAoZXhlY19wYXRoKQorCQlwcmVwZW5kX3RvX3BhdGgoZXhlY19wYXRoLCBzdHJsZW4oZXhlY19wYXRoKSk7CisJZXhlY19wYXRoID0gZ2l0X2V4ZWNfcGF0aCgpOworCXByZXBlbmRfdG9fcGF0aChleGVjX3BhdGgsIHN0cmxlbihleGVjX3BhdGgpKTsKKworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiBpdCdzIGFuIGludGVybmFsIGNvbW1hbmQgKi8KKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoYXJnYywgYXJndiwgZW52cCk7CisKKwkJLyogLi4gdGhlbiB0cnkgdGhlIGV4dGVybmFsIG9uZXMgKi8KKwkJZXhlY3ZfZ2l0X2NtZChhcmd2KTsKKworCQkvKiBJdCBjb3VsZCBiZSBhbiBhbGlhcyAtLSB0aGlzIHdvcmtzIGFyb3VuZCB0aGUgaW5zYW5pdHkKKwkJICogb2Ygb3ZlcnJpZGluZyAiZ2l0IGxvZyIgd2l0aCAiZ2l0IHNob3ciIGJ5IGhhdmluZworCQkgKiBhbGlhcy5sb2cgPSBzaG93CisJCSAqLworCQlpZiAoZG9uZV9hbGlhcyB8fCAhaGFuZGxlX2FsaWFzKCZhcmdjLCAmYXJndikpCisJCQlicmVhazsKKwkJZG9uZV9hbGlhcyA9IDE7CisJfQorCisJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQlpZiAoZG9uZV9hbGlhcykgeworCQkJZnByaW50ZihzdGRlcnIsICJFeHBhbnNpb24gb2YgYWxpYXMgJyVzJyBmYWlsZWQ7ICIKKwkJCQkiJyVzJyBpcyBub3QgYSBnaXQtY29tbWFuZFxuIiwKKwkJCQljbWQsIGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCQloZWxwX3Vua25vd25fY21kKGNtZCk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJyVzJzogJXNcbiIsCisJCWNtZCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ2l0LnNwZWMuaW4gYi9naXQuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ1ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LnNwZWMuaW4KQEAgLTAsMCArMSwyNTYgQEAKKyMgUGFzcyAtLXdpdGhvdXQgZG9jcyB0byBycG1idWlsZCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZG9jdW1lbnRhdGlvbgorCislZGVmaW5lIHB5dGhvbl9wYXRoIC91c3IvYmluL3B5dGhvbgorCitOYW1lOiAJCWdpdAorVmVyc2lvbjogCUBAVkVSU0lPTkBACitSZWxlYXNlOiAJMSV7P2Rpc3R9CitTdW1tYXJ5OiAgCUdpdCBjb3JlIGFuZCB0b29scworTGljZW5zZTogCUdQTAorR3JvdXA6IAkJRGV2ZWxvcG1lbnQvVG9vbHMKK1VSTDogCQlodHRwOi8va2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC8KK1NvdXJjZTogCWh0dHA6Ly9rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0LyV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKK0J1aWxkUmVxdWlyZXM6CXpsaWItZGV2ZWwgPj0gMS4yLCBvcGVuc3NsLWRldmVsLCBjdXJsLWRldmVsLCBleHBhdC1kZXZlbCAgJXshP193aXRob3V0X2RvY3M6LCB4bWx0bywgYXNjaWlkb2MgPiA2LjAuM30KK0J1aWxkUm9vdDoJJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LSV7cmVsZWFzZX0tcm9vdC0lKCV7X19pZF91fSAtbikKK1JlcXVpcmVzOglnaXQtY29yZSwgZ2l0LXN2biwgZ2l0LWN2cywgZ2l0LWFyY2gsIGdpdC1lbWFpbCwgZ2l0aywgZ2l0LWd1aSwgZ2l0LXA0LCBwZXJsLUdpdAorCislZGVzY3JpcHRpb24KK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitUaGlzIGlzIGEgZHVtbXkgcGFja2FnZSB3aGljaCBicmluZ3MgaW4gYWxsIHN1YnBhY2thZ2VzLgorCislcGFja2FnZSBjb3JlCitTdW1tYXJ5OglDb3JlIGdpdCB0b29scworR3JvdXA6CQlEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6CXpsaWIgPj0gMS4yLCByc3luYywgY3VybCwgbGVzcywgb3BlbnNzaC1jbGllbnRzLCBleHBhdAorJWRlc2NyaXB0aW9uIGNvcmUKK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitUaGVzZSBhcmUgdGhlIGNvcmUgdG9vbHMgd2l0aCBtaW5pbWFsIGRlcGVuZGVuY2llcy4KKworJXBhY2thZ2Ugc3ZuCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgU3VidmVyc2lvbiByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBzdWJ2ZXJzaW9uCislZGVzY3JpcHRpb24gc3ZuCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBTdWJ2ZXJzaW9uIHJlcG9zaXRvcmllcy4KKworJXBhY2thZ2UgY3ZzCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQ1ZTIHJlcG9zaXRvcmllcworR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0LWNvcmUgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0sIGN2cywgY3ZzcHMKKyVkZXNjcmlwdGlvbiBjdnMKK0dpdCB0b29scyBmb3IgaW1wb3J0aW5nIENWUyByZXBvc2l0b3JpZXMuCisKKyVwYWNrYWdlIGFyY2gKK1N1bW1hcnk6ICAgICAgICBHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBBcmNoIHJlcG9zaXRvcmllcworR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0LWNvcmUgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0sIHRsYQorJWRlc2NyaXB0aW9uIGFyY2gKK0dpdCB0b29scyBmb3IgaW1wb3J0aW5nIEFyY2ggcmVwb3NpdG9yaWVzLgorCislcGFja2FnZSBwNAorU3VtbWFyeTogICAgICAgIEdpdCB0b29scyBmb3IgaW1wb3J0aW5nIFBlcmZvcmNlIHJlcG9zaXRvcmllcworR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0LWNvcmUgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0sIHB5dGhvbgorJWRlc2NyaXB0aW9uIHA0CitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBQZXJmb3JjZSByZXBvc2l0b3JpZXMuCisKKyVwYWNrYWdlIGVtYWlsCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBzZW5kaW5nIGVtYWlsCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOglnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSAKKyVkZXNjcmlwdGlvbiBlbWFpbAorR2l0IHRvb2xzIGZvciBzZW5kaW5nIGVtYWlsLgorCislcGFja2FnZSBndWkKK1N1bW1hcnk6ICAgICAgICBHaXQgR1VJIHRvb2wKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCB0ayA+PSA4LjQKKyVkZXNjcmlwdGlvbiBndWkKK0dpdCBHVUkgdG9vbAorCislcGFja2FnZSAtbiBnaXRrCitTdW1tYXJ5OiAgICAgICAgR2l0IHJldmlzaW9uIHRyZWUgdmlzdWFsaXNlciAoJ2dpdGsnKQorR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0LWNvcmUgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0sIHRrID49IDguNAorJWRlc2NyaXB0aW9uIC1uIGdpdGsKK0dpdCByZXZpc2lvbiB0cmVlIHZpc3VhbGlzZXIgKCdnaXRrJykKKworJXBhY2thZ2UgLW4gcGVybC1HaXQKK1N1bW1hcnk6ICAgICAgICBQZXJsIGludGVyZmFjZSB0byBHaXQKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiAgICAgICBnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6ICAgICAgIHBlcmwoOk1PRFVMRV9DT01QQVRfJShldmFsICJgJXtfX3Blcmx9IC1WOnZlcnNpb25gIjsgZWNobyAkdmVyc2lvbikpCitCdWlsZFJlcXVpcmVzOiAgcGVybChFcnJvcikKKworJWRlc2NyaXB0aW9uIC1uIHBlcmwtR2l0CitQZXJsIGludGVyZmFjZSB0byBHaXQKKworJXByZXAKKyVzZXR1cCAtcQorCislYnVpbGQKK21ha2UgJXtfc21wX21mbGFnc30gQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgV0lUSF9QNElNUE9SVD1ZZXNQbGVhc2UgXAorICAgICBFVENfR0lUQ09ORklHPS9ldGMvZ2l0Y29uZmlnIFwKKyAgICAgcHJlZml4PSV7X3ByZWZpeH0gUFlUSE9OX1BBVEg9JXtweXRob25fcGF0aH0gYWxsICV7IT9fd2l0aG91dF9kb2NzOiBkb2N9CisKKyVpbnN0YWxsCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCittYWtlICV7X3NtcF9tZmxhZ3N9IENGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIERFU1RESVI9JFJQTV9CVUlMRF9ST09UIFwKKyAgICAgV0lUSF9QNElNUE9SVD1ZZXNQbGVhc2UgcHJlZml4PSV7X3ByZWZpeH0gbWFuZGlyPSV7X21hbmRpcn0gXAorICAgICBFVENfR0lUQ09ORklHPS9ldGMvZ2l0Y29uZmlnIFwKKyAgICAgUFlUSE9OX1BBVEg9JXtweXRob25fcGF0aH0gXAorICAgICBJTlNUQUxMRElSUz12ZW5kb3IgaW5zdGFsbCAleyE/X3dpdGhvdXRfZG9jczogaW5zdGFsbC1kb2N9CitmaW5kICRSUE1fQlVJTERfUk9PVCAtdHlwZSBmIC1uYW1lIC5wYWNrbGlzdCAtZXhlYyBybSAtZiB7fSAnOycKK2ZpbmQgJFJQTV9CVUlMRF9ST09UIC10eXBlIGYgLW5hbWUgJyouYnMnIC1lbXB0eSAtZXhlYyBybSAtZiB7fSAnOycKK2ZpbmQgJFJQTV9CVUlMRF9ST09UIC10eXBlIGYgLW5hbWUgcGVybGxvY2FsLnBvZCAtZXhlYyBybSAtZiB7fSAnOycKKworKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfYmluZGlyfSAtdHlwZSBmIHwgZ3JlcCAtdkUgInA0aW1wb3J0fGFyY2hpbXBvcnR8c3ZufGN2c3xlbWFpbHxnaXRrfGdpdC1ndWl8Z2l0LWNpdG9vbCIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEApICAgICAgICAgICAgICAgPiBiaW4tbWFuLWRvYy1maWxlcworKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtwZXJsX3ZlbmRvcmxpYn0gLXR5cGUgZiB8IHNlZCAtZSBzQF4kUlBNX0JVSUxEX1JPT1RAQCkgPj4gcGVybC1maWxlcworJWlmICV7IT9fd2l0aG91dF9kb2NzOjF9MAorKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfSAkUlBNX0JVSUxEX1JPT1QvRG9jdW1lbnRhdGlvbiAtdHlwZSBmIHwgZ3JlcCAtdkUgInA0aW1wb3J0fGFyY2hpbXBvcnR8c3ZufGdpdC1jdnN8ZW1haWx8Z2l0a3xnaXQtZ3VpfGdpdC1jaXRvb2wiIHwgc2VkIC1lIHNAXiRSUE1fQlVJTERfUk9PVEBAIC1lICdzLyQvKi8nICkgPj4gYmluLW1hbi1kb2MtZmlsZXMKKyVlbHNlCitybSAtcmYgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfQorJWVuZGlmCisKKyVjbGVhbgorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorCislZmlsZXMKKyMgVGhlc2UgYXJlIG5vIGZpbGVzIGluIHRoZSByb290IHBhY2thZ2UKKworJWZpbGVzIHN2bgorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19iaW5kaXJ9Lypzdm4qCislZG9jIERvY3VtZW50YXRpb24vKnN2bioudHh0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLypzdm4qLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qc3ZuKi5odG1sIH0KKworJWZpbGVzIGN2cworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLnR4dAorJXtfYmluZGlyfS8qY3ZzKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qY3ZzKi4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLmh0bWwgfQorCislZmlsZXMgYXJjaAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0Cisle19iaW5kaXJ9L2dpdC1hcmNoaW1wb3J0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xL2dpdC1hcmNoaW1wb3J0LjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC5odG1sIH0KKworJWZpbGVzIHA0CislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgRG9jdW1lbnRhdGlvbi9naXQtcDRpbXBvcnQudHh0Cisle19iaW5kaXJ9L2dpdC1wNGltcG9ydAorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS9naXQtcDRpbXBvcnQuMSp9CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uL2dpdC1wNGltcG9ydC5odG1sIH0KKworJWZpbGVzIGVtYWlsCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgRG9jdW1lbnRhdGlvbi8qZW1haWwqLnR4dAorJXtfYmluZGlyfS8qZW1haWwqCisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLyplbWFpbCouMSp9CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uLyplbWFpbCouaHRtbCB9CisKKyVmaWxlcyBndWkKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJXtfYmluZGlyfS9naXQtZ3VpCisle19iaW5kaXJ9L2dpdC1jaXRvb2wKKyV7X2RhdGFkaXJ9L2dpdC1ndWkvCisjIE5vdCBZZXQuLi4KKyMgJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS9naXQtZ3VpLjF9CisjICV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vZ2l0LWd1aS5odG1sfQorIyAleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xL2dpdC1jaXRvb2wuMX0KKyMgJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi9naXQtY2l0b29sLmh0bWx9CisKKyVmaWxlcyAtbiBnaXRrCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgRG9jdW1lbnRhdGlvbi8qZ2l0ayoudHh0Cisle19iaW5kaXJ9LypnaXRrKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qZ2l0ayouMSp9CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uLypnaXRrKi5odG1sIH0KKworJWZpbGVzIC1uIHBlcmwtR2l0IC1mIHBlcmwtZmlsZXMKKyVkZWZhdHRyKC0scm9vdCxyb290KQorCislZmlsZXMgY29yZSAtZiBiaW4tbWFuLWRvYy1maWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19kYXRhZGlyfS9naXQtY29yZS8KKyVkb2MgUkVBRE1FIENPUFlJTkcgRG9jdW1lbnRhdGlvbi8qLnR4dAorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qLmh0bWwgRG9jdW1lbnRhdGlvbi9ob3d0b30KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vdGVjaG5pY2FsfQorCislY2hhbmdlbG9nCisqIFR1ZSBNYXkgMTMgMjAwNyBRdXkgVG9udGhhdCA8cXRvbnRoYXRAZ21haWwuY29tPgorLSBBZGRlZCBsaWIgZmlsZXMgZm9yIGdpdC1ndWkKKy0gQWRkZWQgRG9jdW1lbnRhdGlvbi90ZWNobmljYWwgKEFzIG5lZWRlZCBieSBHaXQgVXNlcnMgTWFudWFsKQorCisqIFR1ZSBNYXkgOCAyMDA3IFF1eSBUb250aGF0IDxxdG9udGhhdEBnbWFpbC5jb20+CistIEFkZGVkIGhvd3RvIGZpbGVzCisKKyogVHVlIE1hciAyNyAyMDA3IEV5Z2VuZSBSeWFiaW5raW4gPHJlYS1naXRAY29kZWxhYnMucnU+CistIEFkZGVkIHRoZSBnaXQtcDQgcGFja2FnZTogUGVyZm9yY2UgaW1wb3J0IHN0dWZmLgorCisqIE1vbiBGZWIgMTMgMjAwNyBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CistIFVwZGF0ZSBjb3JlIHBhY2thZ2UgZGVzY3JpcHRpb24gKEdpdCBpc24ndCBhcyBzdHVwaWQgYXMgaXQgdXNlZCB0byBiZSkKKworKiBNb24gRmViIDEyIDIwMDcgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorLSBBZGQgZ2l0LWd1aSBhbmQgZ2l0LWNpdG9vbC4KKworKiBNb24gTm92IDE0IDIwMDUgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+IDAuOTkuOWotMQorLSBDaGFuZ2Ugc3VicGFja2FnZSBuYW1lcyB0byBnaXQtPG5hbWU+IGluc3RlYWQgb2YgZ2l0LWNvcmUtPG5hbWU+CistIENyZWF0ZSBlbXB0eSByb290IHBhY2thZ2Ugd2hpY2ggYnJpbmdzIGluIGFsbCBzdWJwYWNrYWdlcworLSBSZW5hbWUgZ2l0LXRrIC0+IGdpdGsKKworKiBUaHUgTm92IDEwIDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+IDAuOTkuOWctMQorLSB6bGliIGRlcGVuZGVuY3kgZml4CistIE1pbm9yIGNsZWFudXBzIGZyb20gc3BsaXQKKy0gTW92ZSBhcmNoIGltcG9ydCB0byBzZXBhcmF0ZSBwYWNrYWdlIGFzIHdlbGwKKworKiBUdWUgU2VwIDI3IDIwMDUgSmltIFJhZGZvcmQgPHJhZGZvcmRAYmxhY2tiZWFuLm9yZz4KKy0gTW92ZSBwcm9ncmFtcyB3aXRoIG5vbi1zdGFuZGFyZCBkZXBlbmRlbmNpZXMgKHN2biwgY3ZzLCBlbWFpbCkKKyAgaW50byBzZXBhcmF0ZSBwYWNrYWdlcworCisqIFR1ZSBTZXAgMjcgMjAwNSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KKy0gcGFyYWxsZWxpemUgYnVpbGQKKy0gQ09QVFMgLT4gQ0ZMQUdTCisKKyogRnJpIFNlcCAxNiAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPiAwLjk5LjYtMQorLSB1cGRhdGUgdG8gMC45OS42CisKKyogRnJpIFNlcCAxNiAyMDA1IEhvcnN0IEguIHZvbiBCcmFuZCA8dm9uYnJhbmRAaW5mLnV0ZnNtLmNsPgorLSBMaW51cyBub3RpY2VkIHRoYXQgbGVzcyBpcyByZXF1aXJlZCwgYWRkZWQgdG8gdGhlIGRlcGVuZGVuY2llcworCisqIFN1biBTZXAgMTEgMjAwNSBIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KKy0gVXBkYXRlZCBkZXBlbmRlbmNpZXMKKy0gRG9uJ3QgYXNzdW1lIG1hbnBhZ2VzIGFyZSBnemlwcGVkCisKKyogVGh1IEF1ZyAxOCAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPiAwLjk5LjQtNAorLSBkcm9wIHNoX3V0aWxzLCBzaC11dGlscywgZGlmZnV0aWxzLCBta3RlbXAsIGFuZCBvcGVuc3NsIFJlcXVpcmVzCistIHVzZSBSUE1fT1BUX0ZMQUdTIGluIHNwZWMgZmlsZSwgZHJvcCBwYXRjaDAKKworKiBXZWQgQXVnIDE3IDIwMDUgVG9tICJzcG90IiBDYWxsYXdheSA8dGNhbGxhd2FAcmVkaGF0LmNvbT4gMC45OS40LTMKKy0gdXNlIGRpc3QgdGFnIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBicmFuY2hlcworLSB1c2UgcnBtIG9wdGZsYWdzIGJ5IGRlZmF1bHQgKHBhdGNoMCkKKy0gb3duICV7X2RhdGFkaXJ9L2dpdC1jb3JlLworCisqIE1vbiBBdWcgMTUgMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4KKy0gdXBkYXRlIHNwZWMgZmlsZSB0byBmaXggQnVpbGRyb290LCBSZXF1aXJlcywgYW5kIGRyb3AgVmVuZG9yCisKKyogU3VuIEF1ZyAwNyAyMDA1IEhvcnN0IEguIHZvbiBCcmFuZCA8dm9uYnJhbmRAaW5mLnV0ZnNtLmNsPgorLSBSZWRpZCB0aGUgZGVzY3JpcHRpb24KKy0gQ3V0IG92ZXJsb25nIG1ha2UgbGluZSwgbG9vc2VuZWQgY2hhbmdlbG9nIGEgYml0CistIEkgdGhpbmsgSnVuaW8gKG9yIHBlcmhhcHMgT1NETD8pIHNob3VsZCBiZSB2ZW5kb3IuLi4KKworKiBUaHUgSnVsIDE0IDIwMDUgRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKy0gQWRkIHRoZSBtYW4gcGFnZXMsIGFuZCB0aGUgLS13aXRob3V0IGRvY3MgYnVpbGQgb3B0aW9uCisKKyogV2VkIEp1bCA3IDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc0Bvc2RsLm9yZz4KKy0gaW5pdGlhbCBnaXQgc3BlYyBmaWxlCmRpZmYgLS1naXQgYS9naXRrIGIvZ2l0awpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTdlODRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0awpAQCAtMCwwICsxLDYzOTUgQEAKKyMhL2Jpbi9zaAorIyBUY2wgaWdub3JlcyB0aGUgbmV4dCBsaW5lIC0qLSB0Y2wgLSotIFwKK2V4ZWMgd2lzaCAiJDAiIC0tICIkQCIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBQYXVsIE1hY2tlcnJhcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAorIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKKyMgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworcHJvYyBnaXRkaXIge30geworICAgIGdsb2JhbCBlbnYKKyAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKKwlyZXR1cm4gJGVudihHSVRfRElSKQorICAgIH0gZWxzZSB7CisJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQorICAgIH0KK30KKworcHJvYyBzdGFydF9yZXZfbGlzdCB7dmlld30geworICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUKKyAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCisgICAgZ2xvYmFsIHZpZXdhcmdzIHZpZXdmaWxlcyBjb21taXRpZHgKKworICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KKyAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7JHN0YXJ0bXNlY3MgKyAxMDB9XQorICAgIHNldCBjb21taXRpZHgoJHZpZXcpIDAKKyAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCisgICAgaWYgeyR2aWV3ZmlsZXMoJHZpZXcpIG5lIHt9fSB7CisJc2V0IGFyZ3MgW2NvbmNhdCAkYXJncyAiLS0iICR2aWV3ZmlsZXMoJHZpZXcpXQorICAgIH0KKyAgICBzZXQgb3JkZXIgIi0tdG9wby1vcmRlciIKKyAgICBpZiB7JGRhdGVtb2RlfSB7CisJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCisgICAgfQorICAgIGlmIHtbY2F0Y2ggeworCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCisJCQkgIC0tcGFyZW50cyAtLWJvdW5kYXJ5IC0tZGVmYXVsdCBIRUFEICRhcmdzXSByXQorICAgIH0gZXJyXX0geworCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgorCWV4aXQgMQorICAgIH0KKyAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKKyAgICBzZXQgbGVmdG92ZXIoJHZpZXcpIHt9CisgICAgZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGxmCisgICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0geworCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkdGNsZW5jb2RpbmcKKyAgICB9CisgICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCisgICAgbm93YnVzeSAkdmlldworfQorCitwcm9jIHN0b3BfcmV2X2xpc3Qge30geworICAgIGdsb2JhbCBjb21tZmQgY3VydmlldworCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWZkKCRjdXJ2aWV3KV19IHJldHVybgorICAgIHNldCBmZCAkY29tbWZkKCRjdXJ2aWV3KQorICAgIGNhdGNoIHsKKwlzZXQgcGlkIFtwaWQgJGZkXQorCWV4ZWMga2lsbCAkcGlkCisgICAgfQorICAgIGNhdGNoIHtjbG9zZSAkZmR9CisgICAgdW5zZXQgY29tbWZkKCRjdXJ2aWV3KQorfQorCitwcm9jIGdldGNvbW1pdHMge30geworICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKKworICAgIHNldCBwaGFzZSBnZXRjb21taXRzCisgICAgaW5pdGxheW91dAorICAgIHN0YXJ0X3Jldl9saXN0ICRjdXJ2aWV3CisgICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKK30KKworcHJvYyBnZXRjb21taXRsaW5lcyB7ZmQgdmlld30gIHsKKyAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKKyAgICBnbG9iYWwgbGVmdG92ZXIgY29tbWZkCisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBjb21taXRpZHggY29tbWl0cm93IGNvbW1pdGRhdGEKKyAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKKyAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmNoaWxkbGlzdCB2ZGlzcG9yZGVyIHZjbWl0bGlzdGVkCisKKyAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KKyAgICBpZiB7JHN0dWZmID09IHt9fSB7CisJaWYgeyFbZW9mICRmZF19IHJldHVybgorCWdsb2JhbCB2aWV3bmFtZQorCXVuc2V0IGNvbW1mZCgkdmlldykKKwlub3RidXN5ICR2aWV3CisJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCisJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKKwlpZiB7W2NhdGNoIHtjbG9zZSAkZmR9IGVycl19IHsKKwkgICAgc2V0IGZ2IHt9CisJICAgIGlmIHskdmlldyAhPSAkY3Vydmlld30geworCQlzZXQgZnYgIiBmb3IgdGhlIFwiJHZpZXduYW1lKCR2aWV3KVwiIHZpZXciCisJICAgIH0KKwkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGVyciAwIDRdID09ICJ1c2FnZSJ9IHsKKwkJc2V0IGVyciAiR2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OlwKKwkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKKwkJaWYgeyR2aWV3bmFtZSgkdmlldykgZXEgIkNvbW1hbmQgbGluZSJ9IHsKKwkJICAgIGFwcGVuZCBlcnIgXAorCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAorCQkJIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pIgorCQl9CisJICAgIH0gZWxzZSB7CisJCXNldCBlcnIgIkVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjogJGVyciIKKwkgICAgfQorCSAgICBlcnJvcl9wb3B1cCAkZXJyCisJfQorCWlmIHskdmlldyA9PSAkY3Vydmlld30geworCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKKwl9CisJcmV0dXJuCisgICAgfQorICAgIHNldCBzdGFydCAwCisgICAgc2V0IGdvdHNvbWUgMAorICAgIHdoaWxlIDEgeworCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQorCWlmIHskaSA8IDB9IHsKKwkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQorCSAgICBicmVhaworCX0KKwlpZiB7JHN0YXJ0ID09IDB9IHsKKwkgICAgc2V0IGNtaXQgJGxlZnRvdmVyKCR2aWV3KQorCSAgICBhcHBlbmQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAwIFtleHByIHskaSAtIDF9XV0KKwkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQorCX0gZWxzZSB7CisJICAgIHNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCisJfQorCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KKwlzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCisJc2V0IG9rIDAKKwlzZXQgbGlzdGVkIDEKKwlpZiB7JGogPj0gMH0geworCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCisJICAgIGlmIHtbc3RyaW5nIHJhbmdlICRpZHMgMCAwXSA9PSAiLSJ9IHsKKwkJc2V0IGxpc3RlZCAwCisJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQorCSAgICB9CisJICAgIHNldCBvayAxCisJICAgIGZvcmVhY2ggaWQgJGlkcyB7CisJCWlmIHtbc3RyaW5nIGxlbmd0aCAkaWRdICE9IDQwfSB7CisJCSAgICBzZXQgb2sgMAorCQkgICAgYnJlYWsKKwkJfQorCSAgICB9CisJfQorCWlmIHshJG9rfSB7CisJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKKwkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKKwkJc2V0IHNob3J0Y21pdCAiW3N0cmluZyByYW5nZSAkc2hvcnRjbWl0IDAgODBdLi4uIgorCSAgICB9CisJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCisJICAgIGV4aXQgMQorCX0KKwlzZXQgaWQgW2xpbmRleCAkaWRzIDBdCisJaWYgeyRsaXN0ZWR9IHsKKwkgICAgc2V0IG9sZHMgW2xyYW5nZSAkaWRzIDEgZW5kXQorCSAgICBzZXQgaSAwCisJICAgIGZvcmVhY2ggcCAkb2xkcyB7CisJCWlmIHskaSA9PSAwIHx8IFtsc2VhcmNoIC1leGFjdCAkb2xkcyAkcF0gPj0gJGl9IHsKKwkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAorCQl9CisJCWluY3IgaQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgc2V0IG9sZHMge30KKwl9CisJaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJHZpZXcsJGlkKV19IHsKKwkgICAgc2V0IGNoaWxkcmVuKCR2aWV3LCRpZCkge30KKwl9CisJc2V0IGNvbW1pdGRhdGEoJGlkKSBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCisJc2V0IGNvbW1pdHJvdygkdmlldywkaWQpICRjb21taXRpZHgoJHZpZXcpCisJaW5jciBjb21taXRpZHgoJHZpZXcpCisJaWYgeyR2aWV3ID09ICRjdXJ2aWV3fSB7CisJICAgIGxhcHBlbmQgcGFyZW50bGlzdCAkb2xkcworCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQorCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKKwkgICAgbGFwcGVuZCBjb21taXRsaXN0ZWQgJGxpc3RlZAorCX0gZWxzZSB7CisJICAgIGxhcHBlbmQgdnBhcmVudGxpc3QoJHZpZXcpICRvbGRzCisJICAgIGxhcHBlbmQgdmNoaWxkbGlzdCgkdmlldykgJGNoaWxkcmVuKCR2aWV3LCRpZCkKKwkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKKwkgICAgbGFwcGVuZCB2Y21pdGxpc3RlZCgkdmlldykgJGxpc3RlZAorCX0KKwlzZXQgZ290c29tZSAxCisgICAgfQorICAgIGlmIHskZ290c29tZX0geworCWlmIHskdmlldyA9PSAkY3Vydmlld30geworCSAgICB3aGlsZSB7W2xheW91dG1vcmUgJG5leHR1cGRhdGVdfSBkb3VwZGF0ZQorCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkdmlldyA9PSAkaGx2aWV3fSB7CisJICAgIHZoaWdobGlnaHRtb3JlCisJfQorICAgIH0KKyAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0geworCWRvdXBkYXRlCisgICAgfQorfQorCitwcm9jIGRvdXBkYXRlIHt9IHsKKyAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cworCisgICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKKwlmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KKyAgICB9CisgICAgdXBkYXRlCisgICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQorICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CisJc2V0IGZkICRjb21tZmQoJHYpCisJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCisgICAgfQorfQorCitwcm9jIHJlYWRjb21taXQge2lkfSB7CisgICAgaWYge1tjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdCBjYXQtZmlsZSBjb21taXQgJGlkXX1dfSByZXR1cm4KKyAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKK30KKworcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKKyAgICBnbG9iYWwgdmlld2RhdGEgY3VydmlldyBwaGFzZSBkaXNwbGF5b3JkZXIKKyAgICBnbG9iYWwgY2hpbGRyZW4gY29tbWl0cm93IHNlbGVjdGVkbGluZSB0aGlja2VybGluZQorCisgICAgaWYgeyRwaGFzZSBuZSB7fX0geworCXN0b3BfcmV2X2xpc3QKKwlzZXQgcGhhc2Uge30KKyAgICB9CisgICAgc2V0IG4gJGN1cnZpZXcKKyAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgeworCWNhdGNoIHt1bnNldCBjaGlsZHJlbigkbiwkaWQpfQorCWNhdGNoIHt1bnNldCBjb21taXRyb3coJG4sJGlkKX0KKyAgICB9CisgICAgc2V0IGN1cnZpZXcgLTEKKyAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQorICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KKyAgICBjYXRjaCB7dW5zZXQgdmlld2RhdGEoJG4pfQorICAgIGRpc2NhcmRhbGxjb21taXRzCisgICAgcmVhZHJlZnMKKyAgICBzaG93dmlldyAkbgorfQorCitwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWR9IHsKKyAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQorCisgICAgc2V0IGluaGRyIDEKKyAgICBzZXQgY29tbWVudCB7fQorICAgIHNldCBoZWFkbGluZSB7fQorICAgIHNldCBhdW5hbWUge30KKyAgICBzZXQgYXVkYXRlIHt9CisgICAgc2V0IGNvbW5hbWUge30KKyAgICBzZXQgY29tZGF0ZSB7fQorICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQorICAgIGlmIHskaGRyZW5kIDwgMH0geworCSMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgorCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQorICAgIH0KKyAgICBzZXQgaGVhZGVyIFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIDAgW2V4cHIgeyRoZHJlbmQgLSAxfV1dCisgICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQorICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CisJc2V0IHRhZyBbbGluZGV4ICRsaW5lIDBdCisJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKKwkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQorCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KKwl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0geworCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQorCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCisJfQorICAgIH0KKyAgICBzZXQgaGVhZGxpbmUge30KKyAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCisgICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQorICAgIGlmIHskaSA+PSAwfSB7CisJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQorICAgIH0gZWxzZSB7CisJc2V0IGhlYWRsaW5lICRjb21tZW50CisgICAgfQorICAgIGlmIHshJGxpc3RlZH0geworCSMgZ2l0IHJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CisJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0IGNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCisJc2V0IG5ld2NvbW1lbnQge30KKwlmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb21tZW50ICJcbiJdIHsKKwkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCisJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCisJICAgIGFwcGVuZCBuZXdjb21tZW50ICJcbiIKKwl9CisJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKKyAgICB9CisgICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CisJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKKyAgICB9CisgICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKKwkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCit9CisKK3Byb2MgZ2V0Y29tbWl0IHtpZH0geworICAgIGdsb2JhbCBjb21taXRkYXRhIGNvbW1pdGluZm8KKworICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0geworCXBhcnNlY29tbWl0ICRpZCAkY29tbWl0ZGF0YSgkaWQpIDEKKyAgICB9IGVsc2UgeworCXJlYWRjb21taXQgJGlkCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0geworCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CisJfQorICAgIH0KKyAgICByZXR1cm4gMQorfQorCitwcm9jIHJlYWRyZWZzIHt9IHsKKyAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKKyAgICBnbG9iYWwgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnMgbWFpbmhlYWQKKworICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKKwljYXRjaCB7dW5zZXQgJHZ9CisgICAgfQorICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IHNob3ctcmVmXSByXQorICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKKwlpZiB7IVtyZWdleHAge14oWzAtOWEtZl17NDB9KSByZWZzLyhbXl5dKikkfSAkbGluZSBcCisJICAgIG1hdGNoIGlkIHBhdGhdfSB7CisJICAgIGNvbnRpbnVlCisJfQorCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy8uKi9IRUFEJH0gJHBhdGggbWF0Y2hdfSB7CisJICAgIGNvbnRpbnVlCisJfQorCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0geworCSAgICBzZXQgdHlwZSBvdGhlcnMKKwkgICAgc2V0IG5hbWUgJHBhdGgKKwl9CisJaWYge1tyZWdleHAge15yZW1vdGVzL30gJHBhdGggbWF0Y2hdfSB7CisJICAgIHNldCB0eXBlIGhlYWRzCisJfQorCWlmIHskdHlwZSA9PSAidGFncyJ9IHsKKwkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGlkCisJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKKwkgICAgc2V0IG9iaiB7fQorCSAgICBzZXQgdHlwZSB7fQorCSAgICBzZXQgdGFnIHt9CisJICAgIGNhdGNoIHsKKwkJc2V0IGNvbW1pdCBbZXhlYyBnaXQgcmV2LXBhcnNlICIkaWReMCJdCisJCWlmIHskY29tbWl0ICE9ICRpZH0geworCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAorCQkgICAgbGFwcGVuZCBpZHRhZ3MoJGNvbW1pdCkgJG5hbWUKKwkJfQorCSAgICB9CQkKKwkgICAgY2F0Y2ggeworCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICRpZF0KKwkgICAgfQorCX0gZWxzZWlmIHsgJHR5cGUgPT0gImhlYWRzIiB9IHsKKwkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAorCSAgICBsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQorCX0gZWxzZSB7CisJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCisJICAgIGxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQorCX0KKyAgICB9CisgICAgY2xvc2UgJHJlZmQKKyAgICBzZXQgbWFpbmhlYWQge30KKyAgICBjYXRjaCB7CisJc2V0IHRoZWhlYWQgW2V4ZWMgZ2l0IHN5bWJvbGljLXJlZiBIRUFEXQorCWlmIHtbc3RyaW5nIG1hdGNoICJyZWZzL2hlYWRzLyoiICR0aGVoZWFkXX0geworCSAgICBzZXQgbWFpbmhlYWQgW3N0cmluZyByYW5nZSAkdGhlaGVhZCAxMSBlbmRdCisJfQorICAgIH0KK30KKworcHJvYyBzaG93X2Vycm9yIHt3IHRvcCBtc2d9IHsKKyAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKKyAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKKyAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHRvcCIKKyAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CisgICAgYmluZCAkdG9wIDxWaXNpYmlsaXR5PiAiZ3JhYiAkdG9wOyBmb2N1cyAkdG9wIgorICAgIGJpbmQgJHRvcCA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHRvcCIKKyAgICB0a3dhaXQgd2luZG93ICR0b3AKK30KKworcHJvYyBlcnJvcl9wb3B1cCBtc2cgeworICAgIHNldCB3IC5lcnJvcgorICAgIHRvcGxldmVsICR3CisgICAgd20gdHJhbnNpZW50ICR3IC4KKyAgICBzaG93X2Vycm9yICR3ICR3ICRtc2cKK30KKworcHJvYyBjb25maXJtX3BvcHVwIG1zZyB7CisgICAgZ2xvYmFsIGNvbmZpcm1fb2sKKyAgICBzZXQgY29uZmlybV9vayAwCisgICAgc2V0IHcgLmNvbmZpcm0KKyAgICB0b3BsZXZlbCAkdworICAgIHdtIHRyYW5zaWVudCAkdyAuCisgICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCisgICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCisgICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJzZXQgY29uZmlybV9vayAxOyBkZXN0cm95ICR3IgorICAgIHBhY2sgJHcub2sgLXNpZGUgbGVmdCAtZmlsbCB4CisgICAgYnV0dG9uICR3LmNhbmNlbCAtdGV4dCBDYW5jZWwgLWNvbW1hbmQgImRlc3Ryb3kgJHciCisgICAgcGFjayAkdy5jYW5jZWwgLXNpZGUgcmlnaHQgLWZpbGwgeAorICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKKyAgICB0a3dhaXQgd2luZG93ICR3CisgICAgcmV0dXJuICRjb25maXJtX29rCit9CisKK3Byb2MgbWFrZXdpbmRvdyB7fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbGluZXNwYyBjaGFyc3BjIGN0ZXh0IGNmbGlzdAorICAgIGdsb2JhbCB0ZXh0Zm9udCBtYWluZm9udCB1aWZvbnQKKyAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CisgICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAorICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgorICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CisgICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBnZHR0eXBlCisgICAgZ2xvYmFsIHNlYXJjaHN0cmluZyBzc3RyaW5nCisgICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMKKyAgICBnbG9iYWwgaGVhZGN0eG1lbnUKKworICAgIG1lbnUgLmJhcgorICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKKyAgICAuYmFyIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgbWVudSAuYmFyLmZpbGUKKyAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJVcGRhdGUiIC1jb21tYW5kIHVwZGF0ZWNvbW1pdHMKKyAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZXJlYWQgcmVmZXJlbmNlcyIgLWNvbW1hbmQgcmVyZWFkcmVmcworICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAorICAgIC5iYXIuZmlsZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIG1lbnUgLmJhci5lZGl0CisgICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAorICAgIC5iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIlByZWZlcmVuY2VzIiAtY29tbWFuZCBkb3ByZWZzCisgICAgLmJhci5lZGl0IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisKKyAgICBtZW51IC5iYXIudmlldyAtZm9udCAkdWlmb250CisgICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIlZpZXciIC1tZW51IC5iYXIudmlldworICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIk5ldyB2aWV3Li4uIiAtY29tbWFuZCB7bmV3dmlldyAwfQorICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkVkaXQgdmlldy4uLiIgLWNvbW1hbmQgZWRpdHZpZXcgXAorCS1zdGF0ZSBkaXNhYmxlZAorICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkRlbGV0ZSB2aWV3IiAtY29tbWFuZCBkZWx2aWV3IC1zdGF0ZSBkaXNhYmxlZAorICAgIC5iYXIudmlldyBhZGQgc2VwYXJhdG9yCisgICAgLmJhci52aWV3IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgIkFsbCBmaWxlcyIgLWNvbW1hbmQge3Nob3d2aWV3IDB9IFwKKwktdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAwCisKKyAgICBtZW51IC5iYXIuaGVscAorICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKKyAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBnaXRrIiAtY29tbWFuZCBhYm91dAorICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIktleSBiaW5kaW5ncyIgLWNvbW1hbmQga2V5cworICAgIC5iYXIuaGVscCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIC4gY29uZmlndXJlIC1tZW51IC5iYXIKKworICAgICMgdGhlIGd1aSBoYXMgdXBwZXIgYW5kIGxvd2VyIGhhbGYsIHBhcnRzIG9mIGEgcGFuZWQgd2luZG93LgorICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKKworICAgICMgcG9zc2libHkgdXNlIGFzc3VtZWQgZ2VvbWV0cnkKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBnZW9tZXRyeShwd3Nhc2gwKV19IHsKKyAgICAgICAgc2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW2V4cHIgezE1ICogJGxpbmVzcGN9XQorICAgICAgICBzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFtleHByIHs4MCAqICRjaGFyc3BjfV0KKyAgICAgICAgc2V0IGdlb21ldHJ5KGJvdGhlaWdodCkgW2V4cHIgezE1ICogJGxpbmVzcGN9XQorICAgICAgICBzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFtleHByIHs1MCAqICRjaGFyc3BjfV0KKyAgICAgICAgc2V0IGdlb21ldHJ5KHB3c2FzaDApICJbZXhwciB7NDAgKiAkY2hhcnNwY31dIDIiCisgICAgICAgIHNldCBnZW9tZXRyeShwd3Nhc2gxKSAiW2V4cHIgezYwICogJGNoYXJzcGN9XSAyIgorICAgIH0KKworICAgICMgdGhlIHVwcGVyIGhhbGYgd2lsbCBoYXZlIGEgcGFuZWQgd2luZG93LCBhIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0LCBhbmQgc29tZSBzdHVmZiBiZWxvdworICAgIGZyYW1lIC50ZiAtaGVpZ2h0ICRnZW9tZXRyeSh0b3BoZWlnaHQpIC13aWR0aCAkZ2VvbWV0cnkodG9wd2lkdGgpCisgICAgZnJhbWUgLnRmLmhpc3RmcmFtZQorICAgIHBhbmVkd2luZG93IC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CisKKyAgICAjIGNyZWF0ZSB0aHJlZSBjYW52YXNlcworICAgIHNldCBjc2Nyb2xsIC50Zi5oaXN0ZnJhbWUuY3NiCisgICAgc2V0IGNhbnYgLnRmLmhpc3RmcmFtZS5wd2NsaXN0LmNhbnYKKyAgICBjYW52YXMgJGNhbnYgXAorCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1iZCAwIFwKKwkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICJzY3JvbGxjYW52ICRjc2Nyb2xsIgorICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYKKyAgICBzZXQgY2FudjIgLnRmLmhpc3RmcmFtZS5wd2NsaXN0LmNhbnYyCisgICAgY2FudmFzICRjYW52MiBcCisJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCisgICAgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IGFkZCAkY2FudjIKKyAgICBzZXQgY2FudjMgLnRmLmhpc3RmcmFtZS5wd2NsaXN0LmNhbnYzCisgICAgY2FudmFzICRjYW52MyBcCisJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCisgICAgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IGFkZCAkY2FudjMKKyAgICBldmFsIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIHBsYWNlIDAgJGdlb21ldHJ5KHB3c2FzaDApCisgICAgZXZhbCAudGYuaGlzdGZyYW1lLnB3Y2xpc3Qgc2FzaCBwbGFjZSAxICRnZW9tZXRyeShwd3Nhc2gxKQorCisgICAgIyBhIHNjcm9sbCBiYXIgdG8gcnVsZSB0aGVtCisgICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCisgICAgcGFjayAkY3Njcm9sbCAtc2lkZSByaWdodCAtZmlsbCB5CisgICAgYmluZCAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CisgICAgbGFwcGVuZCBiZ2xpc3QgJGNhbnYgJGNhbnYyICRjYW52MworICAgIHBhY2sgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1zaWRlIGxlZnQKKworICAgICMgd2UgaGF2ZSB0d28gYnV0dG9uIGJhcnMgYXQgYm90dG9tIG9mIHRvcCBmcmFtZS4gQmFyIDEKKyAgICBmcmFtZSAudGYuYmFyCisgICAgZnJhbWUgLnRmLmxiYXIgLWhlaWdodCAxNQorCisgICAgc2V0IHNoYTFlbnRyeSAudGYuYmFyLnNoYTEKKyAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CisgICAgc2V0IHNoYTFidXQgLnRmLmJhci5zaGExbGFiZWwKKyAgICBidXR0b24gJHNoYTFidXQgLXRleHQgIlNIQTEgSUQ6ICIgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCBcCisJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOCAtZm9udCAkdWlmb250CisgICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQorICAgIHBhY2sgLnRmLmJhci5zaGExbGFiZWwgLXNpZGUgbGVmdAorICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCisgICAgcGFjayAkc2hhMWVudHJ5IC1zaWRlIGxlZnQgLXBhZHkgMgorCisgICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKKwkjZGVmaW5lIGxlZnRfd2lkdGggMTYKKwkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CisJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywgMHgwMCwKKwkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAorCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OworICAgIH0KKyAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKKwkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CisJI2RlZmluZSByaWdodF9oZWlnaHQgMTYKKwlzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CisJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKKwkweDAwLCAweDM4LCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDAwLCAweDM4LCAweDAwLCAweDFjLAorCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OworICAgIH0KKyAgICBidXR0b24gLnRmLmJhci5sZWZ0YnV0IC1pbWFnZSBibS1sZWZ0IC1jb21tYW5kIGdvYmFjayBcCisJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgorICAgIHBhY2sgLnRmLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQorICAgIGJ1dHRvbiAudGYuYmFyLnJpZ2h0YnV0IC1pbWFnZSBibS1yaWdodCAtY29tbWFuZCBnb2ZvcncgXAorCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKKyAgICBwYWNrIC50Zi5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CisKKyAgICBidXR0b24gLnRmLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQgLWZvbnQgJHVpZm9udAorICAgIHBhY2sgLnRmLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKKyAgICBzZXQgZmluZHN0cmluZyB7fQorICAgIHNldCBmc3RyaW5nIC50Zi5iYXIuZmluZHN0cmluZworICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZworICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCisgICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRzdHJpbmcgd3JpdGUgZmluZF9jaGFuZ2UKKyAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHggLWluIC50Zi5iYXIKKyAgICBzZXQgZmluZHR5cGUgRXhhY3QKKyAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZHR5cGUgXAorCQkgICAgICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZHR5cGUgd3JpdGUgZmluZF9jaGFuZ2UKKyAgICAudGYuYmFyLmZpbmR0eXBlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgLnRmLmJhci5maW5kdHlwZS5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCisgICAgdGtfb3B0aW9uTWVudSAudGYuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAorCUNvbW1lbnRzIEF1dGhvciBDb21taXR0ZXIKKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZGxvYyB3cml0ZSBmaW5kX2NoYW5nZQorICAgIC50Zi5iYXIuZmluZGxvYyBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIC50Zi5iYXIuZmluZGxvYy5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgcGFjayAudGYuYmFyLmZpbmRsb2MgLXNpZGUgcmlnaHQKKyAgICBwYWNrIC50Zi5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKKworICAgICMgYnVpbGQgdXAgdGhlIGJvdHRvbSBiYXIgb2YgdXBwZXIgd2luZG93CisgICAgbGFiZWwgLnRmLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAorICAgIC1mb250ICR1aWZvbnQKKyAgICBwYWNrIC50Zi5sYmFyLmZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKKyAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgorICAgIHNldCBnbSBbdGtfb3B0aW9uTWVudSAudGYubGJhci5nZHR0eXBlIGdkdHR5cGUgInRvdWNoaW5nIHBhdGhzOiIgXAorCSJhZGRpbmcvcmVtb3Zpbmcgc3RyaW5nOiJdCisgICAgdHJhY2UgYWRkIHZhcmlhYmxlIGdkdHR5cGUgd3JpdGUgaGZpbGVzX2NoYW5nZQorICAgICRnbSBjb25mIC1mb250ICR1aWZvbnQKKyAgICAudGYubGJhci5nZHR0eXBlIGNvbmYgLWZvbnQgJHVpZm9udAorICAgIHBhY2sgLnRmLmxiYXIuZ2R0dHlwZSAtc2lkZSBsZWZ0IC1maWxsIHkKKyAgICBlbnRyeSAudGYubGJhci5mZW50IC13aWR0aCAyNSAtZm9udCAkdGV4dGZvbnQgXAorCS10ZXh0dmFyaWFibGUgaGlnaGxpZ2h0X2ZpbGVzCisgICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcyB3cml0ZSBoZmlsZXNfY2hhbmdlCisgICAgbGFwcGVuZCBlbnRyaWVzIC50Zi5sYmFyLmZlbnQKKyAgICBwYWNrIC50Zi5sYmFyLmZlbnQgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMQorICAgIGxhYmVsIC50Zi5sYmFyLnZsYWJlbCAtdGV4dCAiIE9SIGluIHZpZXciIC1mb250ICR1aWZvbnQKKyAgICBwYWNrIC50Zi5sYmFyLnZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKKyAgICBnbG9iYWwgdmlld2hsbWVudSBzZWxlY3RlZGhsdmlldworICAgIHNldCB2aWV3aGxtZW51IFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnZobCBzZWxlY3RlZGhsdmlldyBOb25lXQorICAgICR2aWV3aGxtZW51IGVudHJ5Y29uZiBOb25lIC1jb21tYW5kIGRlbHZoaWdobGlnaHQKKyAgICAkdmlld2hsbWVudSBjb25mIC1mb250ICR1aWZvbnQKKyAgICAudGYubGJhci52aGwgY29uZiAtZm9udCAkdWlmb250CisgICAgcGFjayAudGYubGJhci52aGwgLXNpZGUgbGVmdCAtZmlsbCB5CisgICAgbGFiZWwgLnRmLmxiYXIucmxhYmVsIC10ZXh0ICIgT1IgIiAtZm9udCAkdWlmb250CisgICAgcGFjayAudGYubGJhci5ybGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CisgICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCisgICAgc2V0IG0gW3RrX29wdGlvbk1lbnUgLnRmLmxiYXIucmVsbSBoaWdobGlnaHRfcmVsYXRlZCBOb25lIFwKKwkiRGVzY2VuZGVudCIgIk5vdCBkZXNjZW5kZW50IiAiQW5jZXN0b3IiICJOb3QgYW5jZXN0b3IiXQorICAgICRtIGNvbmYgLWZvbnQgJHVpZm9udAorICAgIC50Zi5sYmFyLnJlbG0gY29uZiAtZm9udCAkdWlmb250CisgICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9yZWxhdGVkIHdyaXRlIHZyZWxfY2hhbmdlCisgICAgcGFjayAudGYubGJhci5yZWxtIC1zaWRlIGxlZnQgLWZpbGwgeQorCisgICAgIyBGaW5pc2ggcHV0dGluZyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdmlld2VyIHRvZ2V0aGVyCisgICAgcGFjayAudGYubGJhciAtaW4gLnRmIC1zaWRlIGJvdHRvbSAtZmlsbCB4CisgICAgcGFjayAudGYuYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKKyAgICBwYWNrIC50Zi5oaXN0ZnJhbWUgLWZpbGwgYm90aCAtc2lkZSB0b3AgLWV4cGFuZCAxCisgICAgLmN0b3AgYWRkIC50ZgorICAgIC5jdG9wIHBhbmVjb25maWd1cmUgLnRmIC1oZWlnaHQgJGdlb21ldHJ5KHRvcGhlaWdodCkKKyAgICAuY3RvcCBwYW5lY29uZmlndXJlIC50ZiAtd2lkdGggJGdlb21ldHJ5KHRvcHdpZHRoKQorCisgICAgIyBub3cgYnVpbGQgdXAgdGhlIGJvdHRvbQorICAgIHBhbmVkd2luZG93IC5wd2JvdHRvbSAtb3JpZW50IGhvcml6b250YWwKKworICAgICMgbG93ZXIgbGVmdCwgYSB0ZXh0IGJveCBvdmVyIHNlYXJjaCBiYXIsIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0CisgICAgIyBpZiB3ZSBrbm93IHdpbmRvdyBoZWlnaHQsIHRoZW4gdGhhdCB3aWxsIHNldCB0aGUgbG93ZXIgdGV4dCBoZWlnaHQsIG90aGVyd2lzZQorICAgICMgd2Ugc2V0IGxvd2VyIHRleHQgaGVpZ2h0IHdoaWNoIHdpbGwgZHJpdmUgd2luZG93IGhlaWdodAorICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkobWFpbildfSB7CisgICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQorICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShib3RoZWlnaHQpCisgICAgfQorICAgIGZyYW1lIC5ibGVmdC50b3AKKyAgICBmcmFtZSAuYmxlZnQubWlkCisKKyAgICBidXR0b24gLmJsZWZ0LnRvcC5zZWFyY2ggLXRleHQgIlNlYXJjaCIgLWNvbW1hbmQgZG9zZWFyY2ggXAorCS1mb250ICR1aWZvbnQKKyAgICBwYWNrIC5ibGVmdC50b3Auc2VhcmNoIC1zaWRlIGxlZnQgLXBhZHggNQorICAgIHNldCBzc3RyaW5nIC5ibGVmdC50b3Auc3N0cmluZworICAgIGVudHJ5ICRzc3RyaW5nIC13aWR0aCAyMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzZWFyY2hzdHJpbmcKKyAgICBsYXBwZW5kIGVudHJpZXMgJHNzdHJpbmcKKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2VhcmNoc3RyaW5nIHdyaXRlIGluY3JzZWFyY2gKKyAgICBwYWNrICRzc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKKyAgICByYWRpb2J1dHRvbiAuYmxlZnQubWlkLmRpZmYgLXRleHQgIkRpZmYiIFwKKwktY29tbWFuZCBjaGFuZ2VkaWZmZGlzcCAtdmFyaWFibGUgZGlmZmVsaWRlIC12YWx1ZSB7MCAwfQorICAgIHJhZGlvYnV0dG9uIC5ibGVmdC5taWQub2xkIC10ZXh0ICJPbGQgdmVyc2lvbiIgXAorCS1jb21tYW5kIGNoYW5nZWRpZmZkaXNwIC12YXJpYWJsZSBkaWZmZWxpZGUgLXZhbHVlIHswIDF9CisgICAgcmFkaW9idXR0b24gLmJsZWZ0Lm1pZC5uZXcgLXRleHQgIk5ldyB2ZXJzaW9uIiBcCisJLWNvbW1hbmQgY2hhbmdlZGlmZmRpc3AgLXZhcmlhYmxlIGRpZmZlbGlkZSAtdmFsdWUgezEgMH0KKyAgICBwYWNrIC5ibGVmdC5taWQuZGlmZiAuYmxlZnQubWlkLm9sZCAuYmxlZnQubWlkLm5ldyAtc2lkZSBsZWZ0CisgICAgc2V0IGN0ZXh0IC5ibGVmdC5jdGV4dAorICAgIHRleHQgJGN0ZXh0IC1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKKwktc3RhdGUgZGlzYWJsZWQgLWZvbnQgJHRleHRmb250IFwKKwkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCisgICAgc2Nyb2xsYmFyIC5ibGVmdC5zYiAtY29tbWFuZCAiJGN0ZXh0IHl2aWV3IgorICAgIHBhY2sgLmJsZWZ0LnRvcCAtc2lkZSB0b3AgLWZpbGwgeAorICAgIHBhY2sgLmJsZWZ0Lm1pZCAtc2lkZSB0b3AgLWZpbGwgeAorICAgIHBhY2sgLmJsZWZ0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKKyAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCisgICAgbGFwcGVuZCBiZ2xpc3QgJGN0ZXh0CisgICAgbGFwcGVuZCBmZ2xpc3QgJGN0ZXh0CisKKyAgICAkY3RleHQgdGFnIGNvbmYgY29tbWVudCAtd3JhcCAkd3JhcGNvbW1lbnQKKyAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKKyAgICAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDJdCisgICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMF0KKyAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQorICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKKyAgICAkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQorICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgorICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKKyAgICAkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KKyAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG02IC1mb3JlIG1hZ2VudGEKKyAgICAkY3RleHQgdGFnIGNvbmYgbTcgLWZvcmUgIiM4MDgwMDAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgorICAgICRjdGV4dCB0YWcgY29uZiBtOSAtZm9yZSAiI2ZmMDA4MCIKKyAgICAkY3RleHQgdGFnIGNvbmYgbTEwIC1mb3JlIGN5YW4KKyAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgorICAgICRjdGV4dCB0YWcgY29uZiBtMTIgLWZvcmUgIiM3MGIwZjAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG0xMyAtZm9yZSAiIzcwZjBiMCIKKyAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgorICAgICRjdGV4dCB0YWcgY29uZiBtMTUgLWZvcmUgIiNmZjcwYjAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKKyAgICBzZXQgbWVyZ2VtYXggMTYKKyAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQorICAgICRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCisgICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdworCisgICAgLnB3Ym90dG9tIGFkZCAuYmxlZnQKKyAgICAucHdib3R0b20gcGFuZWNvbmZpZ3VyZSAuYmxlZnQgLXdpZHRoICRnZW9tZXRyeShib3R3aWR0aCkKKworICAgICMgbG93ZXIgcmlnaHQKKyAgICBmcmFtZSAuYnJpZ2h0CisgICAgZnJhbWUgLmJyaWdodC5tb2RlCisgICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAorCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJwYXRjaCIKKyAgICAuYnJpZ2h0Lm1vZGUucGF0Y2ggY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICByYWRpb2J1dHRvbiAuYnJpZ2h0Lm1vZGUudHJlZSAtdGV4dCAiVHJlZSIgXAorCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgorICAgIC5icmlnaHQubW9kZS50cmVlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldworICAgIHBhY2sgLmJyaWdodC5tb2RlIC1zaWRlIHRvcCAtZmlsbCB4CisgICAgc2V0IGNmbGlzdCAuYnJpZ2h0LmNmaWxlcworICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KKyAgICB0ZXh0ICRjZmxpc3QgXAorCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKKwktZm9udCAkbWFpbmZvbnQgXAorCS10YWJzIFtsaXN0ICRpbmRlbnQgW2V4cHIgezIgKiAkaW5kZW50fV1dIFwKKwkteXNjcm9sbGNvbW1hbmQgIi5icmlnaHQuc2Igc2V0IiBcCisJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKKwktc3BhY2luZzEgMSAtc3BhY2luZzMgMQorICAgIGxhcHBlbmQgYmdsaXN0ICRjZmxpc3QKKyAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CisgICAgc2Nyb2xsYmFyIC5icmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCisgICAgcGFjayAuYnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKKyAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorICAgICRjZmxpc3QgdGFnIGNvbmZpZ3VyZSBoaWdobGlnaHQgXAorCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCisgICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKworICAgIC5wd2JvdHRvbSBhZGQgLmJyaWdodAorICAgIC5jdG9wIGFkZCAucHdib3R0b20KKworICAgICMgcmVzdG9yZSB3aW5kb3cgcG9zaXRpb24gaWYga25vd24KKyAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0geworICAgICAgICB3bSBnZW9tZXRyeSAuICIkZ2VvbWV0cnkobWFpbikiCisgICAgfQorCisgICAgYmluZCAucHdib3R0b20gPENvbmZpZ3VyZT4ge3Jlc2l6ZWNkZXRwYW5lcyAlVyAld30KKyAgICBwYWNrIC5jdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCisgICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQorICAgICNiaW5kYWxsIDxCMS1Nb3Rpb24+IHtzZWxjYW52bGluZSAlVyAleCAleX0KKyAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCisgICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCisgICAgYmluZGFsbCA8Mj4gImNhbnZzY2FuIG1hcmsgJVcgJXggJXkiCisgICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgorICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQorICAgIGJpbmRrZXkgPEVuZD4gc2VsbGFzdGxpbmUKKyAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgorICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgorICAgIGJpbmQgLiA8U2hpZnQtS2V5LVVwPiAibmV4dF9oaWdobGlnaHQgLTEiCisgICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCisgICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgorICAgIGJpbmRrZXkgPEtleS1MZWZ0PiAiZ29iYWNrIgorICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCisgICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCisgICAgYmluZCAuIDxDb250cm9sLUhvbWU+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMC4wIgorICAgIGJpbmQgLiA8Q29udHJvbC1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgorICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCisgICAgYmluZCAuIDxDb250cm9sLUtleS1Eb3duPiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgdW5pdHMiCisgICAgYmluZCAuIDxDb250cm9sLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCisgICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKKyAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCisgICAgYmluZGtleSB6ICJnb2JhY2siCisgICAgYmluZGtleSB4ICJnb2ZvcnciCisgICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKKyAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCisgICAgYmluZGtleSBqICJnb2JhY2siCisgICAgYmluZGtleSBsICJnb2ZvcnciCisgICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgorICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKKyAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgorICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KKyAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KKyAgICBiaW5ka2V5ID8gZmluZHByZXYKKyAgICBiaW5ka2V5IGYgbmV4dGZpbGUKKyAgICBiaW5ka2V5IDxGNT4gdXBkYXRlY29tbWl0cworICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKKyAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCisgICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQorICAgIGJpbmQgLiA8Q29udHJvbC1yPiBkb3NlYXJjaGJhY2sKKyAgICBiaW5kIC4gPENvbnRyb2wtcz4gZG9zZWFyY2gKKyAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQorICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQorICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQorICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQorICAgIHdtIHByb3RvY29sIC4gV01fREVMRVRFX1dJTkRPVyBkb3F1aXQKKyAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCisgICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCisgICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CisgICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKKyAgICBiaW5kICRjZmxpc3QgPDE+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQorICAgIGJpbmQgJGNmbGlzdCA8QjEtTW90aW9uPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KKyAgICBiaW5kICRjZmxpc3QgPEJ1dHRvblJlbGVhc2UtMT4ge3RyZWVjbGljayAlVyAleCAleX0KKworICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KKyAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KKyAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgorCisgICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKKyAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKKyAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAorCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KKyAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAorCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KKyAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKKyAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCisgICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKKyAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSBuZXcgYnJhbmNoIiAtY29tbWFuZCBta2JyYW5jaAorICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlcnJ5LXBpY2sgdGhpcyBjb21taXQiIFwKKwktY29tbWFuZCBjaGVycnlwaWNrCisKKyAgICBzZXQgaGVhZGN0eG1lbnUgLmhlYWRjdHhtZW51CisgICAgbWVudSAkaGVhZGN0eG1lbnUgLXRlYXJvZmYgMAorICAgICRoZWFkY3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNoZWNrIG91dCB0aGlzIGJyYW5jaCIgXAorCS1jb21tYW5kIGNvYnJhbmNoCisgICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiUmVtb3ZlIHRoaXMgYnJhbmNoIiBcCisJLWNvbW1hbmQgcm1icmFuY2gKK30KKworIyBtb3VzZS0yIG1ha2VzIGFsbCB3aW5kb3dzIHNjYW4gdmVydGljYWxseSwgYnV0IG9ubHkgdGhlIG9uZQorIyB0aGUgY3Vyc29yIGlzIGluIHNjYW5zIGhvcml6b250YWxseQorcHJvYyBjYW52c2NhbiB7b3AgdyB4IHl9IHsKKyAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MworICAgIGZvcmVhY2ggYyBbbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzXSB7CisJaWYgeyRjID09ICR3fSB7CisJICAgICRjIHNjYW4gJG9wICR4ICR5CisJfSBlbHNlIHsKKwkgICAgJGMgc2NhbiAkb3AgMCAkeQorCX0KKyAgICB9Cit9CisKK3Byb2Mgc2Nyb2xsY2FudiB7Y3Njcm9sbCBmMCBmMX0geworICAgICRjc2Nyb2xsIHNldCAkZjAgJGYxCisgICAgZHJhd2ZyYWMgJGYwICRmMQorICAgIGZsdXNoaGlnaGxpZ2h0cworfQorCisjIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQorIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQorIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCitwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0geworICAgIGdsb2JhbCBlbnRyaWVzCisgICAgYmluZCAuICRldiAkc2NyaXB0CisgICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQorICAgIGlmIHskZXNjcmlwdCA9PSB7fX0geworCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQorICAgIH0KKyAgICBmb3JlYWNoIGUgJGVudHJpZXMgeworCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCisgICAgfQorfQorCisjIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCisjIHRoZSBlbnRyeSB3aWRnZXRzCitwcm9jIGNsaWNrIHt3fSB7CisgICAgZ2xvYmFsIGVudHJpZXMKKyAgICBmb3JlYWNoIGUgJGVudHJpZXMgeworCWlmIHskdyA9PSAkZX0gcmV0dXJuCisgICAgfQorICAgIGZvY3VzIC4KK30KKworcHJvYyBzYXZlc3R1ZmYge3d9IHsKKyAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQgdWlmb250CisgICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgbWF4Z3JhcGhwY3QKKyAgICBnbG9iYWwgbWF4d2lkdGggc2hvd25lYXJ0YWdzCisgICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3YXJncyB2aWV3cGVybSBuZXh0dmlld251bQorICAgIGdsb2JhbCBjbWl0bW9kZSB3cmFwY29tbWVudAorICAgIGdsb2JhbCBjb2xvcnMgYmdjb2xvciBmZ2NvbG9yIGRpZmZjb2xvcnMKKworICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCisgICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgorICAgIGNhdGNoIHsKKwlzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCisJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQorCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KKwlwdXRzICRmIFtsaXN0IHNldCB1aWZvbnQgJHVpZm9udF0KKwlwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCisJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQorCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KKwlwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCisJcHV0cyAkZiBbbGlzdCBzZXQgd3JhcGNvbW1lbnQgJHdyYXBjb21tZW50XQorCXB1dHMgJGYgW2xpc3Qgc2V0IHNob3duZWFydGFncyAkc2hvd25lYXJ0YWdzXQorCXB1dHMgJGYgW2xpc3Qgc2V0IGJnY29sb3IgJGJnY29sb3JdCisJcHV0cyAkZiBbbGlzdCBzZXQgZmdjb2xvciAkZmdjb2xvcl0KKwlwdXRzICRmIFtsaXN0IHNldCBjb2xvcnMgJGNvbG9yc10KKwlwdXRzICRmIFtsaXN0IHNldCBkaWZmY29sb3JzICRkaWZmY29sb3JzXQorCisJcHV0cyAkZiAic2V0IGdlb21ldHJ5KG1haW4pIFt3bSBnZW9tZXRyeSAuXSIKKwlwdXRzICRmICJzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFt3aW5mbyB3aWR0aCAudGZdIgorCXB1dHMgJGYgInNldCBnZW9tZXRyeSh0b3BoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLnRmXSIKKyAgICAgICAgcHV0cyAkZiAic2V0IGdlb21ldHJ5KHB3c2FzaDApIFwiWy50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIGNvb3JkIDBdXCIiCisgICAgICAgIHB1dHMgJGYgInNldCBnZW9tZXRyeShwd3Nhc2gxKSBcIlsudGYuaGlzdGZyYW1lLnB3Y2xpc3Qgc2FzaCBjb29yZCAxXVwiIgorCXB1dHMgJGYgInNldCBnZW9tZXRyeShib3R3aWR0aCkgW3dpbmZvIHdpZHRoIC5ibGVmdF0iCisJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGJvdGhlaWdodCkgW3dpbmZvIGhlaWdodCAuYmxlZnRdIgorCisJcHV0cyAtbm9uZXdsaW5lICRmICJzZXQgcGVybXZpZXdzIHsiCisJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKKwkgICAgaWYgeyR2aWV3cGVybSgkdil9IHsKKwkJcHV0cyAkZiAie1tsaXN0ICR2aWV3bmFtZSgkdikgJHZpZXdmaWxlcygkdikgJHZpZXdhcmdzKCR2KV19IgorCSAgICB9CisJfQorCXB1dHMgJGYgIn0iCisJY2xvc2UgJGYKKwlmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKKyAgICB9CisgICAgc2V0IHN0dWZmc2F2ZWQgMQorfQorCitwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CisgICAgZ2xvYmFsIG9sZHdpZHRoCisgICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKKwlzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQorCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCisJaWYgeyR3IDwgNjB9IHsKKwkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KKwkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQorCX0gZWxzZSB7CisJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KKwkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCisJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQorCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKKwkJc2V0IHNhc2gwIDMwCisJICAgIH0KKwkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CisJCXNldCBzYXNoMSBbZXhwciB7JHNhc2gwICsgMjB9XQorCSAgICB9CisJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CisJCXNldCBzYXNoMSBbZXhwciB7JHcgLSAxMH1dCisJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0geworCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCisJCX0KKwkgICAgfQorCX0KKwkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KKwkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KKyAgICB9CisgICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cit9CisKK3Byb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30geworICAgIGdsb2JhbCBvbGR3aWR0aAorICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CisJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KKwlpZiB7JHcgPCA2MH0geworCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCisJfSBlbHNlIHsKKwkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQorCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KKwkgICAgaWYgeyRzYXNoMCA8IDQ1fSB7CisJCXNldCBzYXNoMCA0NQorCSAgICB9CisJICAgIGlmIHskc2FzaDAgPiAkdyAtIDE1fSB7CisJCXNldCBzYXNoMCBbZXhwciB7JHcgLSAxNX1dCisJICAgIH0KKwl9CisJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCisgICAgfQorICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdworfQorCitwcm9jIGFsbGNhbnZzIGFyZ3MgeworICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCisgICAgZXZhbCAkY2FudiAkYXJncworICAgIGV2YWwgJGNhbnYyICRhcmdzCisgICAgZXZhbCAkY2FudjMgJGFyZ3MKK30KKworcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKKyAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MworICAgIGJpbmQgJGNhbnYgJGV2ZW50ICRhY3Rpb24KKyAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgorICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCit9CisKK3Byb2MgYWJvdXQge30geworICAgIGdsb2JhbCB1aWZvbnQKKyAgICBzZXQgdyAuYWJvdXQKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKKwlyYWlzZSAkdworCXJldHVybgorICAgIH0KKyAgICB0b3BsZXZlbCAkdworICAgIHdtIHRpdGxlICR3ICJBYm91dCBnaXRrIgorICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CitHaXRrIC0gYSBjb21taXQgdmlld2VyIGZvciBnaXQKKworQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCisKK1VzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKKwkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwIC1ib3JkZXIgMiAtYmcgd2hpdGUgLXJlbGllZiBncm9vdmUKKyAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMiAtcGFkeSAyCisgICAgJHcubSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIgLWRlZmF1bHQgYWN0aXZlCisgICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KKyAgICAkdy5vayBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJmb2N1cyAkdy5vayIKKyAgICBiaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKKyAgICBiaW5kICR3IDxLZXktUmV0dXJuPiAiZGVzdHJveSAkdyIKK30KKworcHJvYyBrZXlzIHt9IHsKKyAgICBnbG9iYWwgdWlmb250CisgICAgc2V0IHcgLmtleXMKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKKwlyYWlzZSAkdworCXJldHVybgorICAgIH0KKyAgICB0b3BsZXZlbCAkdworICAgIHdtIHRpdGxlICR3ICJHaXRrIGtleSBiaW5kaW5ncyIKKyAgICBtZXNzYWdlICR3Lm0gLXRleHQgeworR2l0ayBrZXkgYmluZGluZ3M6CisKKzxDdHJsLVE+CQlRdWl0Cis8SG9tZT4JCU1vdmUgdG8gZmlyc3QgY29tbWl0Cis8RW5kPgkJTW92ZSB0byBsYXN0IGNvbW1pdAorPFVwPiwgcCwgaQlNb3ZlIHVwIG9uZSBjb21taXQKKzxEb3duPiwgbiwgawlNb3ZlIGRvd24gb25lIGNvbW1pdAorPExlZnQ+LCB6LCBqCUdvIGJhY2sgaW4gaGlzdG9yeSBsaXN0Cis8UmlnaHQ+LCB4LCBsCUdvIGZvcndhcmQgaW4gaGlzdG9yeSBsaXN0Cis8UGFnZVVwPglNb3ZlIHVwIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0Cis8UGFnZURvd24+CU1vdmUgZG93biBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAorPEN0cmwtSG9tZT4JU2Nyb2xsIHRvIHRvcCBvZiBjb21taXQgbGlzdAorPEN0cmwtRW5kPglTY3JvbGwgdG8gYm90dG9tIG9mIGNvbW1pdCBsaXN0Cis8Q3RybC1VcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBsaW5lCis8Q3RybC1Eb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgbGluZQorPEN0cmwtUGFnZVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIHBhZ2UKKzxDdHJsLVBhZ2VEb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgcGFnZQorPFNoaWZ0LVVwPglNb3ZlIHRvIHByZXZpb3VzIGhpZ2hsaWdodGVkIGxpbmUKKzxTaGlmdC1Eb3duPglNb3ZlIHRvIG5leHQgaGlnaGxpZ2h0ZWQgbGluZQorPERlbGV0ZT4sIGIJU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQorPEJhY2tzcGFjZT4JU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQorPFNwYWNlPgkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIG9uZSBwYWdlCit1CQlTY3JvbGwgZGlmZiB2aWV3IHVwIDE4IGxpbmVzCitkCQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gMTggbGluZXMKKzxDdHJsLUY+CQlGaW5kCis8Q3RybC1HPgkJTW92ZSB0byBuZXh0IGZpbmQgaGl0Cis8UmV0dXJuPglNb3ZlIHRvIG5leHQgZmluZCBoaXQKKy8JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdCwgb3IgcmVkbyBmaW5kCis/CQlNb3ZlIHRvIHByZXZpb3VzIGZpbmQgaGl0CitmCQlTY3JvbGwgZGlmZiB2aWV3IHRvIG5leHQgZmlsZQorPEN0cmwtUz4JCVNlYXJjaCBmb3IgbmV4dCBoaXQgaW4gZGlmZiB2aWV3Cis8Q3RybC1SPgkJU2VhcmNoIGZvciBwcmV2aW91cyBoaXQgaW4gZGlmZiB2aWV3Cis8Q3RybC1LUCs+CUluY3JlYXNlIGZvbnQgc2l6ZQorPEN0cmwtcGx1cz4JSW5jcmVhc2UgZm9udCBzaXplCis8Q3RybC1LUC0+CURlY3JlYXNlIGZvbnQgc2l6ZQorPEN0cmwtbWludXM+CURlY3JlYXNlIGZvbnQgc2l6ZQorPEY1PgkJVXBkYXRlCit9IFwKKwkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgZ3Jvb3ZlCisgICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1wYWR4IDIgLXBhZHkgMgorICAgICR3Lm0gY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciIC1kZWZhdWx0IGFjdGl2ZQorICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCisgICAgJHcub2sgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZm9jdXMgJHcub2siCisgICAgYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCisgICAgYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCit9CisKKyMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQorIyBib3R0b20gcmlnaHQgb2YgdGhlIG92ZXJhbGwgd2luZG93LgorCitwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKKyAgICBnbG9iYWwgdHJlZWNvbnRlbnRzIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKKworICAgIHNldCBpeCAwCisgICAgc2V0IHRyZWVpbmRleCgpIDAKKyAgICBzZXQgbGV2IDAKKyAgICBzZXQgcHJlZml4IHt9CisgICAgc2V0IHByZWZpeGVuZCAtMQorICAgIHNldCBwcmVmZW5kc3RhY2sge30KKyAgICBzZXQgaHRzdGFjayB7fQorICAgIHNldCBodCAwCisgICAgc2V0IHRyZWVjb250ZW50cygpIHt9CisgICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgZm9yZWFjaCBmICRsIHsKKwl3aGlsZSB7W3N0cmluZyByYW5nZSAkZiAwICRwcmVmaXhlbmRdIG5lICRwcmVmaXh9IHsKKwkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CisJCSR3IG1hcmsgc2V0IGU6JHRyZWVpbmRleCgkcHJlZml4KSAiZW5kIC0xYyIKKwkJJHcgbWFyayBncmF2aXR5IGU6JHRyZWVpbmRleCgkcHJlZml4KSBsZWZ0CisJICAgIH0KKwkgICAgc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CisJICAgIGluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCisJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQorCSAgICBzZXQgcHJlZml4ZW5kIFtsaW5kZXggJHByZWZlbmRzdGFjayBlbmRdCisJICAgIHNldCBwcmVmZW5kc3RhY2sgW2xyZXBsYWNlICRwcmVmZW5kc3RhY2sgZW5kIGVuZF0KKwkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQorCSAgICBpbmNyIGxldiAtMQorCX0KKwlzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCisJd2hpbGUge1tzZXQgc2xhc2ggW3N0cmluZyBmaXJzdCAiLyIgJHRhaWxdXSA+PSAwfSB7CisJICAgIGxhcHBlbmQgaHRzdGFjayAkaHQKKwkgICAgc2V0IGh0IDAKKwkgICAgbGFwcGVuZCBwcmVmZW5kc3RhY2sgJHByZWZpeGVuZAorCSAgICBpbmNyIHByZWZpeGVuZCBbZXhwciB7JHNsYXNoICsgMX1dCisJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCisJICAgIGxhcHBlbmQgdHJlZWNvbnRlbnRzKCRwcmVmaXgpICRkCisJICAgIHNldCBvbGRwcmVmaXggJHByZWZpeAorCSAgICBhcHBlbmQgcHJlZml4ICRkCisJICAgIHNldCB0cmVlY29udGVudHMoJHByZWZpeCkge30KKwkgICAgc2V0IHRyZWVpbmRleCgkcHJlZml4KSBbaW5jciBpeF0KKwkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAorCSAgICBzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICR0YWlsIFtleHByIHskc2xhc2grMX1dIGVuZF0KKwkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CisJCXNldCBodCAxCisJCXNldCB0cmVlZGlyb3BlbigkcHJlZml4KSBbZXhwciB7JGxldiA8ICRvcGVubGV2c31dCisJCXNldCBibSBbZXhwciB7JGxldiA9PSAkb3BlbmxldnM/ICJ0cmktcnQiOiAidHJpLWRuIn1dCisJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgorCQkkdyBtYXJrIGdyYXZpdHkgZDokaXggbGVmdAorCQlzZXQgc3RyICJcbiIKKwkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQorCQkkdyBpbnNlcnQgZW5kICRzdHIKKwkJJHcgaW1hZ2UgY3JlYXRlIGVuZCAtYWxpZ24gY2VudGVyIC1pbWFnZSAkYm0gLXBhZHggMSBcCisJCSAgICAtbmFtZSBhOiRpeAorCQkkdyBpbnNlcnQgZW5kICRkIFtoaWdobGlnaHRfdGFnICRwcmVmaXhdCisJCSR3IG1hcmsgc2V0IHM6JGl4ICJlbmQgLTFjIgorCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAorCSAgICB9CisJICAgIGluY3IgbGV2CisJfQorCWlmIHskdGFpbCBuZSB7fX0geworCSAgICBpZiB7JGxldiA8PSAkb3BlbmxldnN9IHsKKwkJaW5jciBodAorCQlzZXQgc3RyICJcbiIKKwkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQorCQkkdyBpbnNlcnQgZW5kICRzdHIKKwkJJHcgaW5zZXJ0IGVuZCAkdGFpbCBbaGlnaGxpZ2h0X3RhZyAkZl0KKwkgICAgfQorCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAorCX0KKyAgICB9CisgICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CisJc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CisJaW5jciBodCBbbGluZGV4ICRodHN0YWNrIGVuZF0KKwlzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KKyAgICB9CisgICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyBsaW5ldG9lbHQge2x9IHsKKyAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKKworICAgIHNldCB5IDIKKyAgICBzZXQgcHJlZml4IHt9CisgICAgd2hpbGUgezF9IHsKKwlmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CisJICAgIGlmIHskeSA9PSAkbH0geworCQlyZXR1cm4gIiRwcmVmaXgkZSIKKwkgICAgfQorCSAgICBzZXQgbiAxCisJICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CisJCXNldCBuICR0cmVlaGVpZ2h0KCRwcmVmaXgkZSkKKwkJaWYgeyR5ICsgJG4gPiAkbH0geworCQkgICAgYXBwZW5kIHByZWZpeCAkZQorCQkgICAgaW5jciB5CisJCSAgICBicmVhaworCQl9CisJICAgIH0KKwkgICAgaW5jciB5ICRuCisJfQorICAgIH0KK30KKworcHJvYyBoaWdobGlnaHRfdHJlZSB7eSBwcmVmaXh9IHsKKyAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CisKKyAgICBmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CisJc2V0IHBhdGggJHByZWZpeCRlCisJaWYge1toaWdobGlnaHRfdGFnICRwYXRoXSBuZSB7fX0geworCSAgICAkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkeS4wICIkeS4wIGxpbmVlbmQiCisJfQorCWluY3IgeQorCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8iICYmICR0cmVlaGVpZ2h0KCRwYXRoKSA+IDF9IHsKKwkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQorCX0KKyAgICB9CisgICAgcmV0dXJuICR5Cit9CisKK3Byb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0geworICAgIGdsb2JhbCB0cmVlZGlyb3BlbiB0cmVlaGVpZ2h0IHRyZWVwYXJlbnQgdHJlZWluZGV4CisKKyAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQorICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgICR3IGRlbGV0ZSBzOiRpeCBlOiRpeAorICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCisgICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktcnQKKyAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQorICAgIHdoaWxlIHskZGlyIG5lIHt9fSB7CisJaW5jciB0cmVlaGVpZ2h0KCRkaXIpICRuCisJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQorICAgIH0KK30KKworcHJvYyB0cmVlb3BlbmRpciB7dyBkaXJ9IHsKKyAgICBnbG9iYWwgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVjb250ZW50cyB0cmVlaW5kZXgKKworICAgIHNldCBpeCAkdHJlZWluZGV4KCRkaXIpCisgICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KKyAgICAkdyBtYXJrIHNldCBlOiRpeCBzOiRpeAorICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCByaWdodAorICAgIHNldCBsZXYgMAorICAgIHNldCBzdHIgIlxuIgorICAgIHNldCBuIFtsbGVuZ3RoICR0cmVlY29udGVudHMoJGRpcildCisgICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKKwlpbmNyIGxldgorCWFwcGVuZCBzdHIgIlx0IgorCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KKyAgICB9CisgICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJGRpcikgeworCXNldCBkZSAkZGlyJGUKKwlpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIn0geworCSAgICBzZXQgaXkgJHRyZWVpbmRleCgkZGUpCisJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CisJICAgICR3IG1hcmsgZ3Jhdml0eSBkOiRpeSBsZWZ0CisJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCisJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKKwkgICAgJHcgaW1hZ2UgY3JlYXRlIGU6JGl4IC1hbGlnbiBjZW50ZXIgLWltYWdlIHRyaS1ydCAtcGFkeCAxIFwKKwkJLW5hbWUgYTokaXkKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KKwkgICAgJHcgbWFyayBzZXQgczokaXkgZTokaXgKKwkgICAgJHcgbWFyayBncmF2aXR5IHM6JGl5IGxlZnQKKwkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCisJfSBlbHNlIHsKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRzdHIKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KKwl9CisgICAgfQorICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CisgICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBzZXQgdHJlZWRpcm9wZW4oJGRpcikgMQorICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCisgICAgc2V0IGh0IFskdyBjZ2V0IC1oZWlnaHRdCisgICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IHM6JGl4XSAuXSAwXQorICAgIGlmIHskbCA8ICR0b3B9IHsKKwkkdyB5dmlldyAkbC4wCisgICAgfSBlbHNlaWYgeyRsICsgJG4gKyAxID4gJHRvcCArICRodH0geworCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KKwlpZiB7JGwgPCAkdG9wfSB7CisJICAgIHNldCB0b3AgJGwKKwl9CisJJHcgeXZpZXcgJHRvcC4wCisgICAgfQorfQorCitwcm9jIHRyZWVjbGljayB7dyB4IHl9IHsKKyAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKKworICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSByZXR1cm4KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCisgICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCisgICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGhpZ2hsaWdodCAkY2ZsaXN0X3RvcC4wICIkY2ZsaXN0X3RvcC4wIGxpbmVlbmQiCisgICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCisgICAgc2V0IGNmbGlzdF90b3AgJGwKKyAgICBpZiB7JGwgPT0gMX0geworCSRjdGV4dCB5dmlldyAxLjAKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KKyAgICBpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIG5lICIvIn0geworCXNob3dmaWxlICRlCisgICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKKwl0cmVlY2xvc2VkaXIgJHcgJGUKKyAgICB9IGVsc2UgeworCXRyZWVvcGVuZGlyICR3ICRlCisgICAgfQorfQorCitwcm9jIHNldGZpbGVsaXN0IHtpZH0geworICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgY2ZsaXN0CisKKyAgICB0cmVldmlldyAkY2ZsaXN0ICR0cmVlZmlsZWxpc3QoJGlkKSAwCit9CisKK2ltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLXJ0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgeworICAgICNkZWZpbmUgdHJpLXJ0X3dpZHRoIDEzCisgICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0X2JpdHNbXSA9IHsKKyAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDMwLCAweDAwLCAweDcwLCAweDAwLCAweGYwLCAweDAwLAorICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgMHgwMCwgMHgwMH07Cit9IC1tYXNrZGF0YSB7CisgICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMworICAgICNkZWZpbmUgdHJpLXJ0LW1hc2tfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0LW1hc2tfYml0c1tdID0geworICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCisgICAgICAgMHhmOCwgMHgwMywgMHhmOCwgMHgwMSwgMHhmOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxOCwgMHgwMCwKKyAgICAgICAweDA4LCAweDAwfTsKK30KK2ltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLWRuIC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgeworICAgICNkZWZpbmUgdHJpLWRuX3dpZHRoIDEzCisgICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuX2JpdHNbXSA9IHsKKyAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDA3LCAweGY4LCAweDAzLAorICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgMHgwMCwgMHgwMH07Cit9IC1tYXNrZGF0YSB7CisgICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMworICAgICNkZWZpbmUgdHJpLWRuLW1hc2tfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuLW1hc2tfYml0c1tdID0geworICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCisgICAgICAgMHhmOCwgMHgwMywgMHhmMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAweDAwLCAweDAwfTsKK30KKworcHJvYyBpbml0X2ZsaXN0IHtmaXJzdH0geworICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCisgICAgaWYgeyRmaXJzdCBuZSB7fX0geworCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZmlyc3QKKwlzZXQgY2ZsaXN0X3RvcCAxCisJJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAxLjAgIjEuMCBsaW5lZW5kIgorICAgIH0gZWxzZSB7CisJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CisgICAgfQorICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQorfQorCitwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3BhdGhzCisKKyAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CisJaWYge1tzdHJpbmcgbWF0Y2ggJHAgJGZdfSB7CisJICAgIHJldHVybiAiYm9sZCIKKwl9CisgICAgfQorICAgIHJldHVybiB7fQorfQorCitwcm9jIGhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CisgICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0geworCXNldCBlbmQgW2xpbmRleCBbc3BsaXQgWyRjZmxpc3QgaW5kZXggZW5kXSAuXSAwXQorCWZvciB7c2V0IGwgMn0geyRsIDwgJGVuZH0ge2luY3IgbH0geworCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KKwkgICAgaWYge1toaWdobGlnaHRfdGFnICRsaW5lXSBuZSB7fX0geworCQkkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkbC4wICIkbC4wIGxpbmVlbmQiCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwloaWdobGlnaHRfdHJlZSAyIHt9CisgICAgfQorICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyB1bmhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CisgICAgZ2xvYmFsIGNmbGlzdAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorfQorCitwcm9jIGFkZF9mbGlzdCB7Zmx9IHsKKyAgICBnbG9iYWwgY2ZsaXN0CisKKyAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGZvcmVhY2ggZiAkZmwgeworCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCisJJGNmbGlzdCBpbnNlcnQgZW5kICRmIFtoaWdobGlnaHRfdGFnICRmXQorICAgIH0KKyAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCit9CisKK3Byb2Mgc2VsX2ZsaXN0IHt3IHggeX0geworICAgIGdsb2JhbCBjdGV4dCBkaWZmZmlsZXN0YXJ0IGNmbGlzdCBjZmxpc3RfdG9wIGNtaXRtb2RlCisKKyAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY2ZsaXN0X3RvcF19IHJldHVybgorICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAiQCR4LCR5Il0gIi4iXSAwXQorICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgorICAgICRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgJGwuMCAiJGwuMCBsaW5lZW5kIgorICAgIHNldCBjZmxpc3RfdG9wICRsCisgICAgaWYgeyRsID09IDF9IHsKKwkkY3RleHQgeXZpZXcgMS4wCisgICAgfSBlbHNlIHsKKwljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KKyAgICB9Cit9CisKKyMgRnVuY3Rpb25zIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIHNoZWxsLXR5cGUgcXVvdGluZworCitwcm9jIHNoZWxscXVvdGUge3N0cn0geworICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFwgXHRdKiIgJHN0cl19IHsKKwlyZXR1cm4gJHN0cgorICAgIH0KKyAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIipcWydcIlxcXSoiICRzdHJdfSB7CisJcmV0dXJuICJcIiRzdHJcIiIKKyAgICB9CisgICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqJyoiICRzdHJdfSB7CisJcmV0dXJuICInJHN0ciciCisgICAgfQorICAgIHJldHVybiAiXCJbc3RyaW5nIG1hcCB7XCIgXFxcIiBcXCBcXFxcfSAkc3RyXVwiIgorfQorCitwcm9jIHNoZWxsYXJnbGlzdCB7bH0geworICAgIHNldCBzdHIge30KKyAgICBmb3JlYWNoIGEgJGwgeworCWlmIHskc3RyIG5lIHt9fSB7CisJICAgIGFwcGVuZCBzdHIgIiAiCisJfQorCWFwcGVuZCBzdHIgW3NoZWxscXVvdGUgJGFdCisgICAgfQorICAgIHJldHVybiAkc3RyCit9CisKK3Byb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKKyAgICBzZXQgcmV0IHt9CisgICAgc2V0IHVzZWQgLTEKKyAgICB3aGlsZSB7MX0geworCWluY3IgdXNlZAorCWlmIHshW3JlZ2V4cCAtc3RhcnQgJHVzZWQgLWluZGljZXMgIlxbJ1wiXFxcXCBcdF0iICRzdHIgZmlyc3RdfSB7CisJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KKwkgICAgc2V0IHVzZWQgW3N0cmluZyBsZW5ndGggJHN0cl0KKwkgICAgYnJlYWsKKwl9CisJc2V0IGZpcnN0IFtsaW5kZXggJGZpcnN0IDBdCisJc2V0IGNoIFtzdHJpbmcgaW5kZXggJHN0ciAkZmlyc3RdCisJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CisJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCisJICAgIHNldCB1c2VkICRmaXJzdAorCX0KKwlpZiB7JGNoIGVxICIgIiB8fCAkY2ggZXEgIlx0In0gYnJlYWsKKwlpbmNyIHVzZWQKKwlpZiB7JGNoIGVxICInIn0geworCSAgICBzZXQgZmlyc3QgW3N0cmluZyBmaXJzdCAiJyIgJHN0ciAkdXNlZF0KKwkgICAgaWYgeyRmaXJzdCA8IDB9IHsKKwkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCisJICAgIH0KKwkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KKwkgICAgc2V0IHVzZWQgJGZpcnN0CisJICAgIGNvbnRpbnVlCisJfQorCWlmIHskY2ggZXEgIlxcIn0geworCSAgICBpZiB7JHVzZWQgPj0gW3N0cmluZyBsZW5ndGggJHN0cl19IHsKKwkJZXJyb3IgInRyYWlsaW5nIGJhY2tzbGFzaCIKKwkgICAgfQorCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KKwkgICAgY29udGludWUKKwl9CisJIyBoZXJlIGNoID09ICJcIiIKKwl3aGlsZSB7MX0geworCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CisJCWVycm9yICJ1bm1hdGNoZWQgZG91YmxlLXF1b3RlIgorCSAgICB9CisJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQorCSAgICBzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KKwkgICAgaWYgeyRmaXJzdCA+ICR1c2VkfSB7CisJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCisJCXNldCB1c2VkICRmaXJzdAorCSAgICB9CisJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKKwkgICAgaW5jciB1c2VkCisJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQorCSAgICBpbmNyIHVzZWQKKwl9CisgICAgfQorICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQorfQorCitwcm9jIHNoZWxsc3BsaXQge3N0cn0geworICAgIHNldCBsIHt9CisgICAgd2hpbGUgezF9IHsKKwlzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KKwlpZiB7JHN0ciBlcSB7fX0gYnJlYWsKKwlzZXQgZHEgW3NoZWxsZGVxdW90ZSAkc3RyXQorCXNldCBuIFtsaW5kZXggJGRxIDBdCisJc2V0IHdvcmQgW2xpbmRleCAkZHEgMV0KKwlzZXQgc3RyIFtzdHJpbmcgcmFuZ2UgJHN0ciAkbiBlbmRdCisJbGFwcGVuZCBsICR3b3JkCisgICAgfQorICAgIHJldHVybiAkbAorfQorCisjIENvZGUgdG8gaW1wbGVtZW50IG11bHRpcGxlIHZpZXdzCisKK3Byb2MgbmV3dmlldyB7aXNoaWdobGlnaHR9IHsKKyAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdWlmb250IG5ld2lzaGlnaGxpZ2h0CisgICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCisKKyAgICBzZXQgbmV3aXNoaWdobGlnaHQgJGlzaGlnaGxpZ2h0CisgICAgc2V0IHRvcCAuZ2l0a3ZpZXcKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0geworCXJhaXNlICR0b3AKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IG5ld3ZpZXduYW1lKCRuZXh0dmlld251bSkgIlZpZXcgJG5leHR2aWV3bnVtIgorICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKKyAgICBzZXQgbmV3dmlld2FyZ3MoJG5leHR2aWV3bnVtKSBbc2hlbGxhcmdsaXN0ICRyZXZ0cmVlYXJnc10KKyAgICB2aWV3ZWRpdG9yICR0b3AgJG5leHR2aWV3bnVtICJHaXRrIHZpZXcgZGVmaW5pdGlvbiIKK30KKworcHJvYyBlZGl0dmlldyB7fSB7CisgICAgZ2xvYmFsIGN1cnZpZXcKKyAgICBnbG9iYWwgdmlld25hbWUgdmlld3Blcm0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0KKyAgICBnbG9iYWwgdmlld2FyZ3MgbmV3dmlld2FyZ3MKKworICAgIHNldCB0b3AgLmdpdGt2ZWRpdC0kY3VydmlldworICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CisJcmFpc2UgJHRvcAorCXJldHVybgorICAgIH0KKyAgICBzZXQgbmV3dmlld25hbWUoJGN1cnZpZXcpICR2aWV3bmFtZSgkY3VydmlldykKKyAgICBzZXQgbmV3dmlld3Blcm0oJGN1cnZpZXcpICR2aWV3cGVybSgkY3VydmlldykKKyAgICBzZXQgbmV3dmlld2FyZ3MoJGN1cnZpZXcpIFtzaGVsbGFyZ2xpc3QgJHZpZXdhcmdzKCRjdXJ2aWV3KV0KKyAgICB2aWV3ZWRpdG9yICR0b3AgJGN1cnZpZXcgIkdpdGs6IGVkaXQgdmlldyAkdmlld25hbWUoJGN1cnZpZXcpIgorfQorCitwcm9jIHZpZXdlZGl0b3Ige3RvcCBuIHRpdGxlfSB7CisgICAgZ2xvYmFsIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHZpZXdmaWxlcworICAgIGdsb2JhbCB1aWZvbnQKKworICAgIHRvcGxldmVsICR0b3AKKyAgICB3bSB0aXRsZSAkdG9wICR0aXRsZQorICAgIGxhYmVsICR0b3AubmwgLXRleHQgIk5hbWUiIC1mb250ICR1aWZvbnQKKyAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgbmV3dmlld25hbWUoJG4pIC1mb250ICR1aWZvbnQKKyAgICBncmlkICR0b3AubmwgJHRvcC5uYW1lIC1zdGlja3kgdyAtcGFkeSA1CisgICAgY2hlY2tidXR0b24gJHRvcC5wZXJtIC10ZXh0ICJSZW1lbWJlciB0aGlzIHZpZXciIC12YXJpYWJsZSBuZXd2aWV3cGVybSgkbikgXAorCS1mb250ICR1aWZvbnQKKyAgICBncmlkICR0b3AucGVybSAtIC1wYWR5IDUgLXN0aWNreSB3CisgICAgbWVzc2FnZSAkdG9wLmFsIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKKwktdGV4dCAiQ29tbWl0cyB0byBpbmNsdWRlIChhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0KToiCisgICAgZ3JpZCAkdG9wLmFsIC0gLXN0aWNreSB3IC1wYWR5IDUKKyAgICBlbnRyeSAkdG9wLmFyZ3MgLXdpZHRoIDUwIC10ZXh0dmFyaWFibGUgbmV3dmlld2FyZ3MoJG4pIFwKKwktYmFja2dyb3VuZCB3aGl0ZSAtZm9udCAkdWlmb250CisgICAgZ3JpZCAkdG9wLmFyZ3MgLSAtc3RpY2t5IGV3IC1wYWR4IDUKKyAgICBtZXNzYWdlICR0b3AubCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCisJLXRleHQgIkVudGVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBpbmNsdWRlLCBvbmUgcGVyIGxpbmU6IgorICAgIGdyaWQgJHRvcC5sIC0gLXN0aWNreSB3CisgICAgdGV4dCAkdG9wLnQgLXdpZHRoIDQwIC1oZWlnaHQgMTAgLWJhY2tncm91bmQgd2hpdGUgLWZvbnQgJHVpZm9udAorICAgIGlmIHtbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKKwlmb3JlYWNoIGYgJHZpZXdmaWxlcygkbikgeworCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAkZgorCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAiXG4iCisJfQorCSR0b3AudCBkZWxldGUge2VuZCAtIDFjfSBlbmQKKwkkdG9wLnQgbWFyayBzZXQgaW5zZXJ0IDAuMAorICAgIH0KKyAgICBncmlkICR0b3AudCAtIC1zdGlja3kgZXcgLXBhZHggNQorICAgIGZyYW1lICR0b3AuYnV0cworICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBbbGlzdCBuZXd2aWV3b2sgJHRvcCAkbl0gXAorCS1mb250ICR1aWZvbnQKKyAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBbbGlzdCBkZXN0cm95ICR0b3BdIFwKKwktZm9udCAkdWlmb250CisgICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKKyAgICBmb2N1cyAkdG9wLnQKK30KKworcHJvYyBkb3ZpZXdtZW51IHttIGZpcnN0IGNtZCBvcCBhcmd2fSB7CisgICAgc2V0IG5tZW51IFskbSBpbmRleCBlbmRdCisgICAgZm9yIHtzZXQgaSAkZmlyc3R9IHskaSA8PSAkbm1lbnV9IHtpbmNyIGl9IHsKKwlpZiB7WyRtIGVudHJ5Y2dldCAkaSAtY29tbWFuZF0gZXEgJGNtZH0geworCSAgICBldmFsICRtICRvcCAkaSAkYXJndgorCSAgICBicmVhaworCX0KKyAgICB9Cit9CisKK3Byb2MgYWxsdmlld21lbnVzIHtuIG9wIGFyZ3N9IHsKKyAgICBnbG9iYWwgdmlld2hsbWVudQorCisgICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNSBbbGlzdCBzaG93dmlldyAkbl0gJG9wICRhcmdzCisgICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dICRvcCAkYXJncworfQorCitwcm9jIG5ld3ZpZXdvayB7dG9wIG59IHsKKyAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld3Blcm0gbmV3dmlld25hbWUgbmV3aXNoaWdobGlnaHQKKyAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdwZXJtIHNlbGVjdGVkdmlldyBjdXJ2aWV3CisgICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzIHZpZXdobG1lbnUKKworICAgIGlmIHtbY2F0Y2ggeworCXNldCBuZXdhcmdzIFtzaGVsbHNwbGl0ICRuZXd2aWV3YXJncygkbildCisgICAgfSBlcnJdfSB7CisJZXJyb3JfcG9wdXAgIkVycm9yIGluIGNvbW1pdCBzZWxlY3Rpb24gYXJndW1lbnRzOiAkZXJyIgorCXdtIHJhaXNlICR0b3AKKwlmb2N1cyAkdG9wCisJcmV0dXJuCisgICAgfQorICAgIHNldCBmaWxlcyB7fQorICAgIGZvcmVhY2ggZiBbc3BsaXQgWyR0b3AudCBnZXQgMC4wIGVuZF0gIlxuIl0geworCXNldCBmdCBbc3RyaW5nIHRyaW0gJGZdCisJaWYgeyRmdCBuZSB7fX0geworCSAgICBsYXBwZW5kIGZpbGVzICRmdAorCX0KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKKwkjIGNyZWF0aW5nIGEgbmV3IHZpZXcKKwlpbmNyIG5leHR2aWV3bnVtCisJc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCisJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCisJc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCisJc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncworCWFkZHZpZXdtZW51ICRuCisJaWYgeyEkbmV3aXNoaWdobGlnaHR9IHsKKwkgICAgYWZ0ZXIgaWRsZSBzaG93dmlldyAkbgorCX0gZWxzZSB7CisJICAgIGFmdGVyIGlkbGUgYWRkdmhpZ2hsaWdodCAkbgorCX0KKyAgICB9IGVsc2UgeworCSMgZWRpdGluZyBhbiBleGlzdGluZyB2aWV3CisJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCisJaWYgeyRuZXd2aWV3bmFtZSgkbikgbmUgJHZpZXduYW1lKCRuKX0geworCSAgICBzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKKwkgICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNSBbbGlzdCBzaG93dmlldyAkbl0gXAorCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbildCisJICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSBcCisJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKSAtdmFsdWUgJHZpZXduYW1lKCRuKV0KKwl9CisJaWYgeyRmaWxlcyBuZSAkdmlld2ZpbGVzKCRuKSB8fCAkbmV3YXJncyBuZSAkdmlld2FyZ3MoJG4pfSB7CisJICAgIHNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcworCSAgICBzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCisJICAgIGlmIHskY3VydmlldyA9PSAkbn0geworCQlhZnRlciBpZGxlIHVwZGF0ZWNvbW1pdHMKKwkgICAgfQorCX0KKyAgICB9CisgICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KK30KKworcHJvYyBkZWx2aWV3IHt9IHsKKyAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3cGVybSBobHZpZXcgc2VsZWN0ZWRobHZpZXcKKworICAgIGlmIHskY3VydmlldyA9PSAwfSByZXR1cm4KKyAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkY3Vydmlld30geworCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCisJdW5zZXQgaGx2aWV3CisgICAgfQorICAgIGFsbHZpZXdtZW51cyAkY3VydmlldyBkZWxldGUKKyAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIHt9CisgICAgc2V0IHZpZXdwZXJtKCRjdXJ2aWV3KSAwCisgICAgc2hvd3ZpZXcgMAorfQorCitwcm9jIGFkZHZpZXdtZW51IHtufSB7CisgICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdobG1lbnUKKworICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAorCS1jb21tYW5kIFtsaXN0IHNob3d2aWV3ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAkbgorICAgICR2aWV3aGxtZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCisJLWNvbW1hbmQgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkaGx2aWV3Cit9CisKK3Byb2MgZmxhdHRlbiB7dmFyfSB7CisgICAgZ2xvYmFsICR2YXIKKworICAgIHNldCByZXQge30KKyAgICBmb3JlYWNoIGkgW2FycmF5IG5hbWVzICR2YXJdIHsKKwlsYXBwZW5kIHJldCAkaSBbc2V0ICR2YXJcKCRpXCldCisgICAgfQorICAgIHJldHVybiAkcmV0Cit9CisKK3Byb2MgdW5mbGF0dGVuIHt2YXIgbH0geworICAgIGdsb2JhbCAkdmFyCisKKyAgICBjYXRjaCB7dW5zZXQgJHZhcn0KKyAgICBmb3JlYWNoIHtpIHZ9ICRsIHsKKwlzZXQgJHZhclwoJGlcKSAkdgorICAgIH0KK30KKworcHJvYyBzaG93dmlldyB7bn0geworICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdmaWxlcworICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjaGlsZGxpc3Qgcm93aWRsaXN0IHJvd29mZnNldHMKKyAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHggY29tbWl0cm93IG5leHRjb2xvciBjYW52eG1heAorICAgIGdsb2JhbCBudW1jb21taXRzIHJvd3JhbmdlbGlzdCBjb21taXRsaXN0ZWQgaWRyb3dyYW5nZXMKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjYW52IGNhbnZ5MAorICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHRyZWVkaWZmcworICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdCBwaGFzZQorICAgIGdsb2JhbCBjb21taXRpZHggcm93bGFpZG91dCByb3dvcHRpbSBsaW5lc2VnZW5kcworICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZQorICAgIGdsb2JhbCBzZWxlY3RlZHZpZXcKKyAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmNoaWxkbGlzdCB2ZGlzcG9yZGVyIHZjbWl0bGlzdGVkCisgICAgZ2xvYmFsIGhsdmlldyBzZWxlY3RlZGhsdmlldworCisgICAgaWYgeyRuID09ICRjdXJ2aWV3fSByZXR1cm4KKyAgICBzZXQgc2VsaWQge30KKyAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKKwlzZXQgc2VsaWQgJGN1cnJlbnRpZAorCXNldCB5IFt5YyAkc2VsZWN0ZWRsaW5lXQorCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKwlzZXQgc3BhbiBbJGNhbnYgeXZpZXddCisJc2V0IHl0b3AgW2V4cHIge1tsaW5kZXggJHNwYW4gMF0gKiAkeW1heH1dCisJc2V0IHlib3QgW2V4cHIge1tsaW5kZXggJHNwYW4gMV0gKiAkeW1heH1dCisJaWYgeyR5dG9wIDwgJHkgJiYgJHkgPCAkeWJvdH0geworCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7JHkgLSAkeXRvcH1dCisJfSBlbHNlIHsKKwkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeygkeWJvdCAtICR5dG9wKSAvIDJ9XQorCX0KKyAgICB9CisgICAgdW5zZWxlY3RsaW5lCisgICAgbm9ybWFsbGluZQorICAgIHN0b3BmaW5kcHJvYworICAgIGlmIHskY3VydmlldyA+PSAwfSB7CisJc2V0IHZwYXJlbnRsaXN0KCRjdXJ2aWV3KSAkcGFyZW50bGlzdAorCXNldCB2Y2hpbGRsaXN0KCRjdXJ2aWV3KSAkY2hpbGRsaXN0CisJc2V0IHZkaXNwb3JkZXIoJGN1cnZpZXcpICRkaXNwbGF5b3JkZXIKKwlzZXQgdmNtaXRsaXN0ZWQoJGN1cnZpZXcpICRjb21taXRsaXN0ZWQKKwlpZiB7JHBoYXNlIG5lIHt9fSB7CisJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAorCQlbbGlzdCAkcGhhc2UgJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0IFwKKwkJICAgICBbZmxhdHRlbiBpZHJvd3Jhbmdlc10gW2ZsYXR0ZW4gaWRpbmxpc3RdIFwKKwkJICAgICAkcm93bGFpZG91dCAkcm93b3B0aW0gJG51bWNvbW1pdHMgJGxpbmVzZWdlbmRzXQorCX0gZWxzZWlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRjdXJ2aWV3KV0KKwkJICB8fCBbbGluZGV4ICR2aWV3ZGF0YSgkY3VydmlldykgMF0gbmUge319IHsKKwkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCisJCVtsaXN0IHt9ICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdF0KKwl9CisgICAgfQorICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQorICAgIGNhdGNoIHt1bnNldCB0cmVlZGlmZnN9CisgICAgY2xlYXJfZGlzcGxheQorICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRufSB7CisJdW5zZXQgaGx2aWV3CisJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKKyAgICB9CisKKyAgICBzZXQgY3VydmlldyAkbgorICAgIHNldCBzZWxlY3RlZHZpZXcgJG4KKyAgICAuYmFyLnZpZXcgZW50cnljb25mIEVkaXQqIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQorICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRGVsZXRlKiAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KKworICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKKwlzZXQgcGVuZGluZ19zZWxlY3QgJHNlbGlkCisJZ2V0Y29tbWl0cworCXJldHVybgorICAgIH0KKworICAgIHNldCB2ICR2aWV3ZGF0YSgkbikKKyAgICBzZXQgcGhhc2UgW2xpbmRleCAkdiAwXQorICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCisgICAgc2V0IHBhcmVudGxpc3QgJHZwYXJlbnRsaXN0KCRuKQorICAgIHNldCBjaGlsZGxpc3QgJHZjaGlsZGxpc3QoJG4pCisgICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCisgICAgc2V0IHJvd2lkbGlzdCBbbGluZGV4ICR2IDFdCisgICAgc2V0IHJvd29mZnNldHMgW2xpbmRleCAkdiAyXQorICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQorICAgIGlmIHskcGhhc2UgZXEge319IHsKKwlzZXQgbnVtY29tbWl0cyBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQorCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KKyAgICB9IGVsc2UgeworCXVuZmxhdHRlbiBpZHJvd3JhbmdlcyBbbGluZGV4ICR2IDRdCisJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KKwlzZXQgcm93bGFpZG91dCBbbGluZGV4ICR2IDZdCisJc2V0IHJvd29wdGltIFtsaW5kZXggJHYgN10KKwlzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCisJc2V0IGxpbmVzZWdlbmRzIFtsaW5kZXggJHYgOV0KKyAgICB9CisKKyAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CisgICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQorICAgIHNldCBuZXh0Y29sb3IgMAorICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCisgICAgc2V0IGN1cnZpZXcgJG4KKyAgICBzZXQgcm93IDAKKyAgICBzZXRjYW52c2Nyb2xsCisgICAgc2V0IHlmIDAKKyAgICBzZXQgcm93IDAKKyAgICBpZiB7JHNlbGlkIG5lIHt9ICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJG4sJHNlbGlkKV19IHsKKwlzZXQgcm93ICRjb21taXRyb3coJG4sJHNlbGlkKQorCSMgdHJ5IHRvIGdldCB0aGUgc2VsZWN0ZWQgcm93IGluIHRoZSBzYW1lIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4KKwlzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisJc2V0IHl0b3AgW2V4cHIge1t5YyAkcm93XSAtICR5c2NyZWVufV0KKwlpZiB7JHl0b3AgPCAwfSB7CisJICAgIHNldCB5dG9wIDAKKwl9CisJc2V0IHlmIFtleHByIHskeXRvcCAqIDEuMCAvICR5bWF4fV0KKyAgICB9CisgICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZgorICAgIGRyYXd2aXNpYmxlCisgICAgc2VsZWN0bGluZSAkcm93IDAKKyAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CisJaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKKwkgICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKKwl9CisJaWYge1tpbmZvIGV4aXN0cyBjb21tZmQoJG4pXX0geworCSAgICBsYXlvdXRtb3JlIHt9CisJfSBlbHNlIHsKKwkgICAgZmluaXNoY29tbWl0cworCX0KKyAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPT0gMH0geworCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgorICAgIH0KK30KKworIyBTdHVmZiByZWxhdGluZyB0byB0aGUgaGlnaGxpZ2h0aW5nIGZhY2lsaXR5CisKK3Byb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CisgICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRuaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICR2aGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRmaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRyaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICByZXR1cm4gMAorfQorCitwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKKyAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBzZWxlY3RlZGxpbmUgYm9sZHJvd3MKKworICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdworICAgICRjYW52IGl0ZW1jb25mICRsaW5laHRhZygkcm93KSAtZm9udCAkZm9udAorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKKwkkY2FudiBkZWxldGUgc2Vjc2VsCisJc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRyb3cpXSBcCisJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKKwkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQorCSRjYW52IGxvd2VyICR0CisgICAgfQorfQorCitwcm9jIGJvbGRlbl9uYW1lIHtyb3cgZm9udH0geworICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCisKKyAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CisgICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKKwkkY2FudjIgZGVsZXRlIHNlY3NlbAorCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCisJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKKwkJICAgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KKwkkY2FudjIgbG93ZXIgJHQKKyAgICB9Cit9CisKK3Byb2MgdW5ib2xkZW4ge30geworICAgIGdsb2JhbCBtYWluZm9udCBib2xkcm93cworCisgICAgc2V0IHN0aWxsYm9sZCB7fQorICAgIGZvcmVhY2ggcm93ICRib2xkcm93cyB7CisJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyAkbWFpbmZvbnQKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93CisJfQorICAgIH0KKyAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAorfQorCitwcm9jIGFkZHZoaWdobGlnaHQge259IHsKKyAgICBnbG9iYWwgaGx2aWV3IGN1cnZpZXcgdmlld2RhdGEgdmhsX2RvbmUgdmhpZ2hsaWdodHMgY29tbWl0aWR4CisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKKwlkZWx2aGlnaGxpZ2h0CisgICAgfQorICAgIHNldCBobHZpZXcgJG4KKyAgICBpZiB7JG4gIT0gJGN1cnZpZXcgJiYgIVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CisJc2V0IHZpZXdkYXRhKCRuKSBbbGlzdCBnZXRjb21taXRzIHt7fX0ge3t9fSB7fSB7fSB7fSAwIDAgMCB7fV0KKwlzZXQgdnBhcmVudGxpc3QoJG4pIHt9CisJc2V0IHZjaGlsZGxpc3QoJG4pIHt9CisJc2V0IHZkaXNwb3JkZXIoJG4pIHt9CisJc2V0IHZjbWl0bGlzdGVkKCRuKSB7fQorCXN0YXJ0X3Jldl9saXN0ICRuCisgICAgfQorICAgIHNldCB2aGxfZG9uZSAkY29tbWl0aWR4KCRobHZpZXcpCisgICAgaWYgeyR2aGxfZG9uZSA+IDB9IHsKKwlkcmF3dmlzaWJsZQorICAgIH0KK30KKworcHJvYyBkZWx2aGlnaGxpZ2h0IHt9IHsKKyAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBobHZpZXddfSByZXR1cm4KKyAgICB1bnNldCBobHZpZXcKKyAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CisgICAgdW5ib2xkZW4KK30KKworcHJvYyB2aGlnaGxpZ2h0bW9yZSB7fSB7CisgICAgZ2xvYmFsIGhsdmlldyB2aGxfZG9uZSBjb21taXRpZHggdmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHZkaXNwb3JkZXIgY3VydmlldyBtYWluZm9udAorCisgICAgc2V0IGZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKyAgICBzZXQgbWF4ICRjb21taXRpZHgoJGhsdmlldykKKyAgICBpZiB7JGhsdmlldyA9PSAkY3Vydmlld30geworCXNldCBkaXNwICRkaXNwbGF5b3JkZXIKKyAgICB9IGVsc2UgeworCXNldCBkaXNwICR2ZGlzcG9yZGVyKCRobHZpZXcpCisgICAgfQorICAgIHNldCB2ciBbdmlzaWJsZXJvd3NdCisgICAgc2V0IHIwIFtsaW5kZXggJHZyIDBdCisgICAgc2V0IHIxIFtsaW5kZXggJHZyIDFdCisgICAgZm9yIHtzZXQgaSAkdmhsX2RvbmV9IHskaSA8ICRtYXh9IHtpbmNyIGl9IHsKKwlzZXQgaWQgW2xpbmRleCAkZGlzcCAkaV0KKwlpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0geworCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQorCSAgICBpZiB7JHIwIDw9ICRyb3cgJiYgJHJvdyA8PSAkcjF9IHsKKwkJaWYgeyFbaGlnaGxpZ2h0ZWQgJHJvd119IHsKKwkJICAgIGJvbGRlbiAkcm93ICRmb250CisJCX0KKwkJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKKwkgICAgfQorCX0KKyAgICB9CisgICAgc2V0IHZobF9kb25lICRtYXgKK30KKworcHJvYyBhc2t2aGlnaGxpZ2h0IHtyb3cgaWR9IHsKKyAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzIGNvbW1pdHJvdyBpZGRyYXduIG1haW5mb250CisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkaGx2aWV3LCRpZCldfSB7CisJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQorICAgIH0gZWxzZSB7CisJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDAKKyAgICB9Cit9CisKK3Byb2MgaGZpbGVzX2NoYW5nZSB7bmFtZSBpeCBvcH0geworICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaF9zZXJpYWwKKyAgICBnbG9iYWwgbWFpbmZvbnQgaGlnaGxpZ2h0X3BhdGhzCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CisJIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cworCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KKwl1bnNldCBmaWxlaGlnaGxpZ2h0CisJY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQorCXVuYm9sZGVuCisJdW5oaWdobGlnaHRfZmlsZWxpc3QKKyAgICB9CisgICAgc2V0IGhpZ2hsaWdodF9wYXRocyB7fQorICAgIGFmdGVyIGNhbmNlbCBkb19maWxlX2hsICRmaF9zZXJpYWwKKyAgICBpbmNyIGZoX3NlcmlhbAorICAgIGlmIHskaGlnaGxpZ2h0X2ZpbGVzIG5lIHt9fSB7CisJYWZ0ZXIgMzAwIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAorICAgIH0KK30KKworcHJvYyBtYWtlcGF0dGVybnMge2x9IHsKKyAgICBzZXQgcmV0IHt9CisgICAgZm9yZWFjaCBlICRsIHsKKwlzZXQgZWUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9ICRlXQorCWlmIHtbc3RyaW5nIGluZGV4ICRlZSBlbmRdIGVxICIvIn0geworCSAgICBsYXBwZW5kIHJldCAiJGVlKiIKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIHJldCAkZWUKKwkgICAgbGFwcGVuZCByZXQgIiRlZS8qIgorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXQKK30KKworcHJvYyBkb19maWxlX2hsIHtzZXJpYWx9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgaGlnaGxpZ2h0X3BhdGhzIGdkdHR5cGUgZmhsX2xpc3QKKworICAgIGlmIHskZ2R0dHlwZSBlcSAidG91Y2hpbmcgcGF0aHM6In0geworCWlmIHtbY2F0Y2gge3NldCBwYXRocyBbc2hlbGxzcGxpdCAkaGlnaGxpZ2h0X2ZpbGVzXX1dfSByZXR1cm4KKwlzZXQgaGlnaGxpZ2h0X3BhdGhzIFttYWtlcGF0dGVybnMgJHBhdGhzXQorCWhpZ2hsaWdodF9maWxlbGlzdAorCXNldCBnZHRhcmdzIFtjb25jYXQgLS0gJHBhdGhzXQorICAgIH0gZWxzZSB7CisJc2V0IGdkdGFyZ3MgW2xpc3QgIi1TJGhpZ2hsaWdodF9maWxlcyJdCisgICAgfQorICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLXIgLXMgLS1zdGRpbiAkZ2R0YXJnc10KKyAgICBzZXQgZmlsZWhpZ2hsaWdodCBbb3BlbiAkY21kIHIrXQorICAgIGZjb25maWd1cmUgJGZpbGVoaWdobGlnaHQgLWJsb2NraW5nIDAKKyAgICBmaWxlZXZlbnQgJGZpbGVoaWdobGlnaHQgcmVhZGFibGUgcmVhZGZoaWdobGlnaHQKKyAgICBzZXQgZmhsX2xpc3Qge30KKyAgICBkcmF3dmlzaWJsZQorICAgIGZsdXNoaGlnaGxpZ2h0cworfQorCitwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CisgICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhsX2xpc3QKKworICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKKwlsYXBwZW5kIGZobF9saXN0IHt9CisJcHV0cyAkZmlsZWhpZ2hsaWdodCAiIgorCWZsdXNoICRmaWxlaGlnaGxpZ2h0CisgICAgfQorfQorCitwcm9jIGFza2ZpbGVoaWdobGlnaHQge3JvdyBpZH0geworICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZobF9saXN0CisKKyAgICBsYXBwZW5kIGZobF9saXN0ICRpZAorICAgIHNldCBmaGlnaGxpZ2h0cygkcm93KSAtMQorICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCit9CisKK3Byb2MgcmVhZGZoaWdobGlnaHQge30geworICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGNvbW1pdHJvdyBjdXJ2aWV3IG1haW5mb250IGlkZHJhd24KKyAgICBnbG9iYWwgZmhsX2xpc3QKKworICAgIHdoaWxlIHtbZ2V0cyAkZmlsZWhpZ2hsaWdodCBsaW5lXSA+PSAwfSB7CisJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQorCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZmhsX2xpc3QgJGxpbmVdCisJaWYgeyRpIDwgMH0gY29udGludWUKKwlmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CisJICAgIHNldCBpZCBbbGluZGV4ICRmaGxfbGlzdCAkal0KKwkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKKwkJc2V0IGZoaWdobGlnaHRzKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgMAorCSAgICB9CisJfQorCXNldCBmaGxfbGlzdCBbbHJhbmdlICRmaGxfbGlzdCBbZXhwciB7JGkrMX1dIGVuZF0KKwlpZiB7JGxpbmUgZXEge319IGNvbnRpbnVlCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKV19IGNvbnRpbnVlCisJc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKQorCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkbGluZSldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlzZXQgZmhpZ2hsaWdodHMoJHJvdykgMQorICAgIH0KKyAgICBpZiB7W2VvZiAkZmlsZWhpZ2hsaWdodF19IHsKKwkjIHN0cmFuZ2UuLi4KKwlwdXRzICJvb3BzLCBnaXQgZGlmZi10cmVlIGRpZWQiCisJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQorCXVuc2V0IGZpbGVoaWdobGlnaHQKKyAgICB9CisgICAgbmV4dF9obGNvbnQKK30KKworcHJvYyBmaW5kX2NoYW5nZSB7bmFtZSBpeCBvcH0geworICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKKyAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kdHlwZQorCisgICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CisgICAgZm9yZWFjaCByb3cgJGJvbGRuYW1lcm93cyB7CisJYm9sZGVuX25hbWUgJHJvdyAkbWFpbmZvbnQKKyAgICB9CisgICAgc2V0IGJvbGRuYW1lcm93cyB7fQorICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KKyAgICB1bmJvbGRlbgorICAgIGlmIHskZmluZHR5cGUgbmUgIlJlZ2V4cCJ9IHsKKwlzZXQgZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gXAorCQkgICAkZmluZHN0cmluZ10KKwlzZXQgZmluZHBhdHRlcm4gIiokZSoiCisgICAgfQorICAgIGRyYXd2aXNpYmxlCit9CisKK3Byb2MgYXNrZmluZGhpZ2hsaWdodCB7cm93IGlkfSB7CisgICAgZ2xvYmFsIG5oaWdobGlnaHRzIGNvbW1pdGluZm8gaWRkcmF3biBtYWluZm9udAorICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmR0eXBlIGZpbmRsb2MgZmluZHBhdHRlcm4KKworICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKKwlnZXRjb21taXQgJGlkCisgICAgfQorICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKKyAgICBzZXQgaXNib2xkIDAKKyAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KKyAgICBmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKKwlpZiB7JGZpbmRsb2MgbmUgIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jIG5lICR0eX0geworCSAgICBjb250aW51ZQorCX0KKwlpZiB7JGZpbmR0eXBlIGVxICJSZWdleHAifSB7CisJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZmluZHN0cmluZyAkZl0KKwl9IGVsc2VpZiB7JGZpbmR0eXBlIGVxICJJZ25DYXNlIn0geworCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkZmluZHBhdHRlcm4gJGZdCisJfSBlbHNlIHsKKwkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KKwl9CisJaWYgeyRkb2VzbWF0Y2h9IHsKKwkgICAgaWYgeyR0eSBlcSAiQXV0aG9yIn0geworCQlzZXQgaXNib2xkIDIKKwkgICAgfSBlbHNlIHsKKwkJc2V0IGlzYm9sZCAxCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0geworCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlpZiB7JGlzYm9sZCA+PSAyfSB7CisJICAgIGJvbGRlbl9uYW1lICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKwl9CisgICAgfQorICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCit9CisKK3Byb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKKworICAgIHJoaWdobGlnaHRfbm9uZQorICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CisJYWZ0ZXIgaWRsZSBkcmF3dmlzaWJsZQorICAgIH0KK30KKworIyBwcmVwYXJlIGZvciB0ZXN0aW5nIHdoZXRoZXIgY29tbWl0cyBhcmUgZGVzY2VuZGVudHMgb3IgYW5jZXN0b3JzIG9mIGEKK3Byb2MgcmhpZ2hsaWdodF9zZWwge2F9IHsKKyAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKKworICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQorICAgIHNldCBkZXNjX3RvZG8gW2xpc3QgJGFdCisgICAgY2F0Y2gge3Vuc2V0IGFuY2VzdG9yfQorICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KKyAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0geworCXJoaWdobGlnaHRfbm9uZQorCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKKyAgICB9Cit9CisKK3Byb2MgcmhpZ2hsaWdodF9ub25lIHt9IHsKKyAgICBnbG9iYWwgcmhpZ2hsaWdodHMKKworICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KKyAgICB1bmJvbGRlbgorfQorCitwcm9jIGlzX2Rlc2NlbmRlbnQge2F9IHsKKyAgICBnbG9iYWwgY3VydmlldyBjaGlsZHJlbiBjb21taXRyb3cgZGVzY2VuZGVudCBkZXNjX3RvZG8KKworICAgIHNldCB2ICRjdXJ2aWV3CisgICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCisgICAgc2V0IHRvZG8gJGRlc2NfdG9kbworICAgIHNldCBsZWZ0b3ZlciB7fQorICAgIHNldCBkb25lIDAKKyAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0geworCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQorCWlmIHskY29tbWl0cm93KCR2LCRkbykgPCAkbGF9IHsKKwkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KKwkgICAgY29udGludWUKKwl9CisJZm9yZWFjaCBuayAkY2hpbGRyZW4oJHYsJGRvKSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJG5rKV19IHsKKwkJc2V0IGRlc2NlbmRlbnQoJG5rKSAxCisJCWxhcHBlbmQgdG9kbyAkbmsKKwkJaWYgeyRuayBlcSAkYX0geworCQkgICAgc2V0IGRvbmUgMQorCQl9CisJICAgIH0KKwl9CisJaWYgeyRkb25lfSB7CisJICAgIHNldCBkZXNjX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgc2V0IGRlc2NlbmRlbnQoJGEpIDAKKyAgICBzZXQgZGVzY190b2RvICRsZWZ0b3ZlcgorfQorCitwcm9jIGlzX2FuY2VzdG9yIHthfSB7CisgICAgZ2xvYmFsIGN1cnZpZXcgcGFyZW50bGlzdCBjb21taXRyb3cgYW5jZXN0b3IgYW5jX3RvZG8KKworICAgIHNldCB2ICRjdXJ2aWV3CisgICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCisgICAgc2V0IHRvZG8gJGFuY190b2RvCisgICAgc2V0IGxlZnRvdmVyIHt9CisgICAgc2V0IGRvbmUgMAorICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CisJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCR2LCRkbyldIHx8ICRjb21taXRyb3coJHYsJGRvKSA+ICRsYX0geworCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbworCSAgICBjb250aW51ZQorCX0KKwlmb3JlYWNoIG5wIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkdiwkZG8pXSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRucCldfSB7CisJCXNldCBhbmNlc3RvcigkbnApIDEKKwkJbGFwcGVuZCB0b2RvICRucAorCQlpZiB7JG5wIGVxICRhfSB7CisJCSAgICBzZXQgZG9uZSAxCisJCX0KKwkgICAgfQorCX0KKwlpZiB7JGRvbmV9IHsKKwkgICAgc2V0IGFuY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIHNldCBhbmNlc3RvcigkYSkgMAorICAgIHNldCBhbmNfdG9kbyAkbGVmdG92ZXIKK30KKworcHJvYyBhc2tyZWxoaWdobGlnaHQge3JvdyBpZH0geworICAgIGdsb2JhbCBkZXNjZW5kZW50IGhpZ2hsaWdodF9yZWxhdGVkIGlkZHJhd24gbWFpbmZvbnQgcmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGFuY2VzdG9yCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KKyAgICBzZXQgaXNib2xkIDAKKyAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50IiB8fAorCSRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGRlc2NlbmRlbnQifSB7CisJaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkaWQpXX0geworCSAgICBpc19kZXNjZW5kZW50ICRpZAorCX0KKwlpZiB7JGRlc2NlbmRlbnQoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50Iil9IHsKKwkgICAgc2V0IGlzYm9sZCAxCisJfQorICAgIH0gZWxzZWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIiB8fAorCSAgICAgICRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGFuY2VzdG9yIn0geworCWlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRpZCldfSB7CisJICAgIGlzX2FuY2VzdG9yICRpZAorCX0KKwlpZiB7JGFuY2VzdG9yKCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiKX0geworCSAgICBzZXQgaXNib2xkIDEKKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0geworCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKyAgICB9CisgICAgc2V0IHJoaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKK30KKworcHJvYyBuZXh0X2hsY29udCB7fSB7CisgICAgZ2xvYmFsIGZobF9yb3cgZmhsX2Rpcm4gZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKKyAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhsX2Rpcm5dIHx8ICRmaGxfZGlybiA9PSAwfSByZXR1cm4KKyAgICBzZXQgcm93ICRmaGxfcm93CisgICAgd2hpbGUgezF9IHsKKwlpZiB7JHJvdyA8IDAgfHwgJHJvdyA+PSAkbnVtY29tbWl0c30geworCSAgICBiZWxsCisJICAgIHNldCBmaGxfZGlybiAwCisJICAgIHJldHVybgorCX0KKwlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCisJaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0geworCQlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCisJICAgIH0KKwkgICAgaWYgeyR2aGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCisJfQorCWlmIHskZmluZHN0cmluZyBuZSB7fX0geworCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKKwkJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAorCSAgICB9CisJICAgIGlmIHskbmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhaworCX0KKwlpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0geworCSAgICBpZiB7IVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKKwkJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCisJICAgIH0KKwkgICAgaWYgeyRyaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCisJfQorCWlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKKwkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7CisJCSMgYXNrIGZvciBhIGZldyBtb3JlIHdoaWxlIHdlJ3JlIGF0IGl0Li4uCisJCXNldCByICRyb3cKKwkJZm9yIHtzZXQgbiAwfSB7JG4gPCAxMDB9IHtpbmNyIG59IHsKKwkJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyKV19IHsKKwkJCWFza2ZpbGVoaWdobGlnaHQgJHIgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQorCQkgICAgfQorCQkgICAgaW5jciByICRmaGxfZGlybgorCQkgICAgaWYgeyRyIDwgMCB8fCAkciA+PSAkbnVtY29tbWl0c30gYnJlYWsKKwkJfQorCQlmbHVzaGhpZ2hsaWdodHMKKwkgICAgfQorCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpIDwgMH0geworCQlzZXQgZmhsX3JvdyAkcm93CisJCXJldHVybgorCSAgICB9CisJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhaworCX0KKwlpbmNyIHJvdyAkZmhsX2Rpcm4KKyAgICB9CisgICAgc2V0IGZobF9kaXJuIDAKKyAgICBzZWxlY3RsaW5lICRyb3cgMQorfQorCitwcm9jIG5leHRfaGlnaGxpZ2h0IHtkaXJufSB7CisgICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBmaGxfcm93IGZobF9kaXJuCisgICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKKworICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIGlmIHshKFtpbmZvIGV4aXN0cyBobHZpZXddIHx8ICRmaW5kc3RyaW5nIG5lIHt9IHx8CisJICAkaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiIHx8IFtpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSl9IHJldHVybgorICAgIHNldCBmaGxfcm93IFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcm59XQorICAgIHNldCBmaGxfZGlybiAkZGlybgorICAgIG5leHRfaGxjb250Cit9CisKK3Byb2MgY2FuY2VsX25leHRfaGlnaGxpZ2h0IHt9IHsKKyAgICBnbG9iYWwgZmhsX2Rpcm4KKworICAgIHNldCBmaGxfZGlybiAwCit9CisKKyMgR3JhcGggbGF5b3V0IGZ1bmN0aW9ucworCitwcm9jIHNob3J0aWRzIHtpZHN9IHsKKyAgICBzZXQgcmVzIHt9CisgICAgZm9yZWFjaCBpZCAkaWRzIHsKKwlpZiB7W2xsZW5ndGggJGlkXSA+IDF9IHsKKwkgICAgbGFwcGVuZCByZXMgW3Nob3J0aWRzICRpZF0KKwl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKKwkgICAgbGFwcGVuZCByZXMgW3N0cmluZyByYW5nZSAkaWQgMCA3XQorCX0gZWxzZSB7CisJICAgIGxhcHBlbmQgcmVzICRpZAorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXMKK30KKworcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKKyAgICBzZXQgbiBbbGxlbmd0aCAkbF0KKyAgICB3aGlsZSB7JHggPCAkbn0geworCXNldCBlIFtsaW5kZXggJGwgJHhdCisJaWYgeyRlIG5lIHt9fSB7CisJICAgIGxzZXQgbCAkeCBbZXhwciB7JGUgKyAkb31dCisJfQorCWluY3IgeAorICAgIH0KKyAgICByZXR1cm4gJGwKK30KKworcHJvYyBudGltZXMge24gb30geworICAgIHNldCByZXQge30KKyAgICBmb3Ige30geyRuID4gMH0ge2luY3IgbiAtMX0geworCWxhcHBlbmQgcmV0ICRvCisgICAgfQorICAgIHJldHVybiAkcmV0Cit9CisKK3Byb2MgdXNlZGlucmFuZ2Uge2lkIGwxIGwyfSB7CisgICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBjaGlsZGxpc3QgY3VydmlldworCisgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKKwlzZXQgciAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKKwlpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0geworCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCisJfQorCXNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcl0KKyAgICB9IGVsc2UgeworCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCisgICAgfQorICAgIGZvcmVhY2ggYyAka2lkcyB7CisJc2V0IHIgJGNvbW1pdHJvdygkY3VydmlldywkYykKKwlpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0geworCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCisJfQorICAgIH0KKyAgICByZXR1cm4gMAorfQorCitwcm9jIHNhbml0eSB7cm93IHtmdWxsIDB9fSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCisKKyAgICBzZXQgY29sIC0xCisgICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KKyAgICBmb3JlYWNoIGlkICRpZHMgeworCWluY3IgY29sCisJaWYgeyRpZCBlcSB7fX0gY29udGludWUKKwlpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgorCSAgICBbbHNlYXJjaCAtZXhhY3QgLXN0YXJ0IFtleHByIHskY29sKzF9XSAkaWRzICRpZF0gPj0gMH0geworCSAgICBwdXRzICJvb3BzOiBbc2hvcnRpZHMgJGlkXSByZXBlYXRlZCBpbiByb3cgJHJvdyBjb2wgJGNvbDoge1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dfSIKKwl9CisJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCisJc2V0IHkgJHJvdworCXNldCB4ICRjb2wKKwl3aGlsZSB7JG8gbmUge319IHsKKwkgICAgaW5jciB5IC0xCisJICAgIGluY3IgeCAkbworCSAgICBpZiB7W2xpbmRleCAkcm93aWRsaXN0ICR5ICR4XSAhPSAkaWR9IHsKKwkJcHV0cyAib29wczogcm93b2Zmc2V0cyB3cm9uZyBhdCByb3cgW2V4cHIgeyR5KzF9XSBjb2wgW2V4cHIgeyR4LSRvfV0iCisJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKKwkJZm9yIHtzZXQgaSAkcm93fSB7JGkgPj0gJHl9IHtpbmNyIGkgLTF9IHsKKwkJICAgIHB1dHMgIiAgcm93ICRpIGlkcz17W3Nob3J0aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkaV1dfSBvZmZzPXtbbGluZGV4ICRyb3dvZmZzZXRzICRpXX0iCisJCX0KKwkJYnJlYWsKKwkgICAgfQorCSAgICBpZiB7ISRmdWxsfSBicmVhaworCSAgICBzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICR5ICR4XQorCX0KKyAgICB9Cit9CisKK3Byb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0geworICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyB1cGFycm93bGVuIGlkcm93cmFuZ2VzCisKKyAgICBmb3Ige3NldCBpIDF9IHskaSA8ICR1cGFycm93bGVuICYmICR5ID4gMX0ge2luY3IgaX0geworCWluY3IgeSAtMQorCWluY3IgeCAkegorCXNldCBvZmYwIFtsaW5kZXggJHJvd29mZnNldHMgJHldCisJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0geworCSAgICBpZiB7JHgwID49IFtsbGVuZ3RoICRvZmYwXX0geworCQlzZXQgeDAgW2xsZW5ndGggW2xpbmRleCAkcm93b2Zmc2V0cyBbZXhwciB7JHktMX1dXV0KKwkJYnJlYWsKKwkgICAgfQorCSAgICBzZXQgeiBbbGluZGV4ICRvZmYwICR4MF0KKwkgICAgaWYgeyR6IG5lIHt9fSB7CisJCWluY3IgeDAgJHoKKwkJYnJlYWsKKwkgICAgfQorCX0KKwlzZXQgeiBbZXhwciB7JHgwIC0gJHh9XQorCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KKwlsc2V0IHJvd29mZnNldHMgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHpdCisgICAgfQorICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQorICAgIGxzZXQgcm93b2Zmc2V0cyAkeSBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JHgrMX1dIC0xXQorICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJG9pZCkgJHkKK30KKworcHJvYyBpbml0bGF5b3V0IHt9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyIGNvbW1pdGxpc3RlZAorICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltCisgICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKKyAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52eG1heCBjYW52CisgICAgZ2xvYmFsIG5leHRjb2xvcgorICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbgorICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eAorICAgIGdsb2JhbCBsaW5lc2VnZW5kcworCisgICAgc2V0IG51bWNvbW1pdHMgMAorICAgIHNldCBkaXNwbGF5b3JkZXIge30KKyAgICBzZXQgY29tbWl0bGlzdGVkIHt9CisgICAgc2V0IHBhcmVudGxpc3Qge30KKyAgICBzZXQgY2hpbGRsaXN0IHt9CisgICAgc2V0IHJvd3JhbmdlbGlzdCB7fQorICAgIHNldCBuZXh0Y29sb3IgMAorICAgIHNldCByb3dpZGxpc3Qge3t9fQorICAgIHNldCByb3dvZmZzZXRzIHt7fX0KKyAgICBjYXRjaCB7dW5zZXQgaWRpbmxpc3R9CisgICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KKyAgICBzZXQgcm93bGFpZG91dCAwCisgICAgc2V0IHJvd29wdGltIDAKKyAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQorICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KKyAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CisgICAgY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQorICAgIHNldCBsaW5lc2VnZW5kcyB7fQorfQorCitwcm9jIHNldGNhbnZzY3JvbGwge30geworICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKKworICAgIHNldCB5bWF4IFtleHByIHskY2FudnkwICsgKCRudW1jb21taXRzIC0gMC41KSAqICRsaW5lc3BjICsgMn1dCisgICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCisgICAgJGNhbnYyIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KKyAgICAkY2FudjMgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQorfQorCitwcm9jIHZpc2libGVyb3dzIHt9IHsKKyAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKKworICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCisgICAgc2V0IGYgWyRjYW52IHl2aWV3XQorICAgIHNldCB5MCBbZXhwciB7aW50KFtsaW5kZXggJGYgMF0gKiAkeW1heCl9XQorICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQorICAgIGlmIHskcjAgPCAwfSB7CisJc2V0IHIwIDAKKyAgICB9CisgICAgc2V0IHkxIFtleHByIHtpbnQoW2xpbmRleCAkZiAxXSAqICR5bWF4KX1dCisgICAgc2V0IHIxIFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCisgICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30geworCXNldCByMSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KKyAgICB9CisgICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCit9CisKK3Byb2MgbGF5b3V0bW9yZSB7dG1heH0geworICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltIGNvbW1pdGlkeCBudW1jb21taXRzIG9wdGltX2RlbGF5CisgICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldworCisgICAgd2hpbGUgezF9IHsKKwlpZiB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5ID4gJG51bWNvbW1pdHN9IHsKKwkgICAgc2hvd3N0dWZmIFtleHByIHskcm93b3B0aW0gLSAkb3B0aW1fZGVsYXl9XQorCX0gZWxzZWlmIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMSA+ICRyb3dvcHRpbX0geworCSAgICBzZXQgbnIgW2V4cHIgeyRyb3dsYWlkb3V0IC0gJHVwYXJyb3dsZW4gLSAxIC0gJHJvd29wdGltfV0KKwkgICAgaWYgeyRuciA+IDEwMH0geworCQlzZXQgbnIgMTAwCisJICAgIH0KKwkgICAgb3B0aW1pemVfcm93cyAkcm93b3B0aW0gMCBbZXhwciB7JHJvd29wdGltICsgJG5yfV0KKwkgICAgaW5jciByb3dvcHRpbSAkbnIKKwl9IGVsc2VpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAkcm93bGFpZG91dH0geworCSAgICBzZXQgbnIgW2V4cHIgeyRjb21taXRpZHgoJGN1cnZpZXcpIC0gJHJvd2xhaWRvdXR9XQorCSAgICAjIG1heSBuZWVkIHRvIGluY3JlYXNlIHRoaXMgdGhyZXNob2xkIGlmIHVwYXJyb3dsZW4gb3IKKwkgICAgIyBtaW5nYXBsZW4gYXJlIGluY3JlYXNlZC4uLgorCSAgICBpZiB7JG5yID4gMTUwfSB7CisJCXNldCBuciAxNTAKKwkgICAgfQorCSAgICBzZXQgcm93ICRyb3dsYWlkb3V0CisJICAgIHNldCByb3dsYWlkb3V0IFtsYXlvdXRyb3dzICRyb3cgW2V4cHIgeyRyb3cgKyAkbnJ9XSAwXQorCSAgICBpZiB7JHJvd2xhaWRvdXQgPT0gJHJvd30geworCQlyZXR1cm4gMAorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDAKKwl9CisJaWYgeyR0bWF4IG5lIHt9ICYmIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJHRtYXh9IHsKKwkgICAgcmV0dXJuIDEKKwl9CisgICAgfQorfQorCitwcm9jIHNob3dzdHVmZiB7Y2Fuc2hvd30geworICAgIGdsb2JhbCBudW1jb21taXRzIGNvbW1pdHJvdyBwZW5kaW5nX3NlbGVjdCBzZWxlY3RlZGxpbmUKKyAgICBnbG9iYWwgbGluZXNlZ2VuZHMgaWRyb3dyYW5nZXMgaWRyYW5nZWRyYXduIGN1cnZpZXcKKworICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSB7CisJZ2xvYmFsIHBoYXNlCisJc2V0IHBoYXNlICJpbmNyZHJhdyIKKwlhbGxjYW52cyBkZWxldGUgYWxsCisgICAgfQorICAgIHNldCByb3cgJG51bWNvbW1pdHMKKyAgICBzZXQgbnVtY29tbWl0cyAkY2Fuc2hvdworICAgIHNldGNhbnZzY3JvbGwKKyAgICBzZXQgcm93cyBbdmlzaWJsZXJvd3NdCisgICAgc2V0IHIwIFtsaW5kZXggJHJvd3MgMF0KKyAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQorICAgIHNldCBzZWxyb3cgLTEKKyAgICBmb3Ige3NldCByICRyb3d9IHskciA8ICRjYW5zaG93fSB7aW5jciByfSB7CisJZm9yZWFjaCBpZCBbbGluZGV4ICRsaW5lc2VnZW5kcyBbZXhwciB7JHIrMX1dXSB7CisJICAgIHNldCBpIC0xCisJICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKKwkJaW5jciBpCisJCWlmIHskZSBuZSB7fSAmJiAkZSA8ICRudW1jb21taXRzICYmICRzIDw9ICRyMSAmJiAkZSA+PSAkcjAKKwkJICAgICYmICFbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CisJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKKwkJICAgIHNldCBpZHJhbmdlZHJhd24oJGlkLCRpKSAxCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgeyRjYW5zaG93ID4gJHIxfSB7CisJc2V0IGNhbnNob3cgJHIxCisgICAgfQorICAgIHdoaWxlIHskcm93IDwgJGNhbnNob3d9IHsKKwlkcmF3Y21pdHJvdyAkcm93CisJaW5jciByb3cKKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF0gJiYKKwlbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCldICYmCisJJGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpIDwgJG51bWNvbW1pdHN9IHsKKwlzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSAxCisgICAgfQorICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgIVtpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKKwlzZWxlY3RsaW5lIDAgMQorICAgIH0KK30KKworcHJvYyBsYXlvdXRyb3dzIHtyb3cgZW5kcm93IGxhc3R9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyCisgICAgZ2xvYmFsIHVwYXJyb3dsZW4gZG93bmFycm93bGVuIG1heHdpZHRoIG1pbmdhcGxlbgorICAgIGdsb2JhbCBjaGlsZGxpc3QgcGFyZW50bGlzdAorICAgIGdsb2JhbCBpZHJvd3JhbmdlcyBsaW5lc2VnZW5kcworICAgIGdsb2JhbCBjb21taXRpZHggY3VydmlldworICAgIGdsb2JhbCBpZGlubGlzdCByb3djaGsgcm93cmFuZ2VsaXN0CisKKyAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQorICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KKyAgICB3aGlsZSB7JHJvdyA8ICRlbmRyb3d9IHsKKwlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCisJc2V0IG9sZG9sZHMge30KKwlzZXQgbmV3b2xkcyB7fQorCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKKwkgICAgaWYgeyFbaW5mbyBleGlzdHMgaWRpbmxpc3QoJHApXX0geworCQlsYXBwZW5kIG5ld29sZHMgJHAKKwkgICAgfSBlbHNlaWYgeyEkaWRpbmxpc3QoJHApfSB7CisJCWxhcHBlbmQgb2xkb2xkcyAkcAorCSAgICB9CisJfQorCXNldCBsc2Uge30KKwlzZXQgbmV2IFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSArIFtsbGVuZ3RoICRuZXdvbGRzXQorCQkgICAgICAgKyBbbGxlbmd0aCAkb2xkb2xkc10gLSAkbWF4d2lkdGggKyAxfV0KKwlpZiB7JG5ldiA+IDB9IHsKKwkgICAgaWYgeyEkbGFzdCAmJgorCQkkcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVuID49ICRjb21taXRpZHgoJGN1cnZpZXcpfSBicmVhaworCSAgICBmb3Ige3NldCB4IFtsbGVuZ3RoICRpZGxpc3RdfSB7W2luY3IgeCAtMV0gPj0gMH0ge30geworCQlzZXQgaSBbbGluZGV4ICRpZGxpc3QgJHhdCisJCWlmIHshW2luZm8gZXhpc3RzIHJvd2NoaygkaSldIHx8ICRyb3cgPj0gJHJvd2NoaygkaSl9IHsKKwkJICAgIHNldCByIFt1c2VkaW5yYW5nZSAkaSBbZXhwciB7JHJvdyAtICRkb3duYXJyb3dsZW59XSBcCisJCQkgICAgICAgW2V4cHIgeyRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW59XV0KKwkJICAgIGlmIHskciA9PSAwfSB7CisJCQlzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICR4ICR4XQorCQkJc2V0IG9mZnMgW2xyZXBsYWNlICRvZmZzICR4ICR4XQorCQkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICR4IDFdCisJCQlzZXQgaWRpbmxpc3QoJGkpIDAKKwkJCXNldCBybTEgW2V4cHIgeyRyb3cgLSAxfV0KKwkJCWxhcHBlbmQgbHNlICRpCisJCQlsYXBwZW5kIGlkcm93cmFuZ2VzKCRpKSAkcm0xCisJCQlpZiB7W2luY3IgbmV2IC0xXSA8PSAwfSBicmVhaworCQkJY29udGludWUKKwkJICAgIH0KKwkJICAgIHNldCByb3djaGsoJGlkKSBbZXhwciB7JHJvdyArICRyfV0KKwkJfQorCSAgICB9CisJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAorCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcworCX0KKwlsYXBwZW5kIGxpbmVzZWdlbmRzICRsc2UKKwlzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRpZF0KKwlpZiB7JGNvbCA8IDB9IHsKKwkgICAgc2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XQorCSAgICBsYXBwZW5kIGlkbGlzdCAkaWQKKwkgICAgbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CisJICAgIHNldCB6IHt9CisJICAgIGlmIHtbbGluZGV4ICRjaGlsZGxpc3QgJHJvd10gbmUge319IHsKKwkJc2V0IHogW2V4cHIge1tsbGVuZ3RoIFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdy0xfV1dXSAtICRjb2x9XQorCQl1bnNldCBpZGlubGlzdCgkaWQpCisJICAgIH0KKwkgICAgbGFwcGVuZCBvZmZzICR6CisJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCisJICAgIGlmIHskeiBuZSB7fX0geworCQltYWtldXBhcnJvdyAkaWQgJGNvbCAkcm93ICR6CisJICAgIH0KKwl9IGVsc2UgeworCSAgICB1bnNldCBpZGlubGlzdCgkaWQpCisJfQorCXNldCByYW5nZXMge30KKwlpZiB7W2luZm8gZXhpc3RzIGlkcm93cmFuZ2VzKCRpZCldfSB7CisJICAgIHNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKKwkgICAgbGFwcGVuZCByYW5nZXMgJHJvdworCSAgICB1bnNldCBpZHJvd3JhbmdlcygkaWQpCisJfQorCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRyYW5nZXMKKwlpbmNyIHJvdworCXNldCBvZmZzIFtudGltZXMgW2xsZW5ndGggJGlkbGlzdF0gMF0KKwlzZXQgbCBbbGxlbmd0aCAkbmV3b2xkc10KKwlzZXQgaWRsaXN0IFtldmFsIGxyZXBsYWNlIFwkaWRsaXN0ICRjb2wgJGNvbCAkbmV3b2xkc10KKwlzZXQgbyAwCisJaWYgeyRsICE9IDF9IHsKKwkgICAgc2V0IG9mZnMgW2xyYW5nZSAkb2ZmcyAwIFtleHByIHskY29sIC0gMX1dXQorCSAgICBmb3JlYWNoIHggJG5ld29sZHMgeworCQlsYXBwZW5kIG9mZnMge30KKwkJaW5jciBvIC0xCisJICAgIH0KKwkgICAgaW5jciBvCisJICAgIHNldCB0bXAgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gW2xsZW5ndGggJG9mZnNdfV0KKwkgICAgaWYgeyR0bXAgPiAwfSB7CisJCXNldCBvZmZzIFtjb25jYXQgJG9mZnMgW250aW1lcyAkdG1wICRvXV0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGxzZXQgb2ZmcyAkY29sIHt9CisJfQorCWZvcmVhY2ggaSAkbmV3b2xkcyB7CisJICAgIHNldCBpZGlubGlzdCgkaSkgMQorCSAgICBzZXQgaWRyb3dyYW5nZXMoJGkpICRyb3cKKwl9CisJaW5jciBjb2wgJGwKKwlmb3JlYWNoIG9pZCAkb2xkb2xkcyB7CisJICAgIHNldCBpZGlubGlzdCgkb2lkKSAxCisJICAgIHNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sICRvaWRdCisJICAgIHNldCBvZmZzIFtsaW5zZXJ0ICRvZmZzICRjb2wgJG9dCisJICAgIG1ha2V1cGFycm93ICRvaWQgJGNvbCAkcm93ICRvCisJICAgIGluY3IgY29sCisJfQorCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKKwlsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKKyAgICB9CisgICAgcmV0dXJuICRyb3cKK30KKworcHJvYyBhZGRleHRyYWlkIHtpZCByb3d9IHsKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdHJvdyBjb21taXRpbmZvCisgICAgZ2xvYmFsIGNvbW1pdGlkeCBjb21taXRsaXN0ZWQKKyAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldworCisgICAgaW5jciBjb21taXRpZHgoJGN1cnZpZXcpCisgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCisgICAgbGFwcGVuZCBjb21taXRsaXN0ZWQgMAorICAgIGxhcHBlbmQgcGFyZW50bGlzdCB7fQorICAgIHNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcm93CisgICAgcmVhZGNvbW1pdCAkaWQKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CisJc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQorICAgIH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0geworCXNldCBjaGlsZHJlbigkY3VydmlldywkaWQpIHt9CisgICAgfQorICAgIGxhcHBlbmQgY2hpbGRsaXN0ICRjaGlsZHJlbigkY3VydmlldywkaWQpCit9CisKK3Byb2MgbGF5b3V0dGFpbCB7fSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkaW5saXN0IGNvbW1pdGlkeCBjdXJ2aWV3CisgICAgZ2xvYmFsIGlkcm93cmFuZ2VzIHJvd3JhbmdlbGlzdAorCisgICAgc2V0IHJvdyAkY29tbWl0aWR4KCRjdXJ2aWV3KQorICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCisgICAgd2hpbGUgeyRpZGxpc3QgbmUge319IHsKKwlzZXQgY29sIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIDF9XQorCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KKwlhZGRleHRyYWlkICRpZCAkcm93CisJdW5zZXQgaWRpbmxpc3QoJGlkKQorCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CisJbGFwcGVuZCByb3dyYW5nZWxpc3QgJGlkcm93cmFuZ2VzKCRpZCkKKwl1bnNldCBpZHJvd3JhbmdlcygkaWQpCisJaW5jciByb3cKKwlzZXQgb2ZmcyBbbnRpbWVzICRjb2wgMF0KKwlzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICRjb2wgJGNvbF0KKwlsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CisJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCisgICAgfQorCisgICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgaWRpbmxpc3RdIHsKKwlhZGRleHRyYWlkICRpZCAkcm93CisJbHNldCByb3dpZGxpc3QgJHJvdyBbbGlzdCAkaWRdCisJbHNldCByb3dvZmZzZXRzICRyb3cgMAorCW1ha2V1cGFycm93ICRpZCAwICRyb3cgMAorCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CisJbGFwcGVuZCByb3dyYW5nZWxpc3QgJGlkcm93cmFuZ2VzKCRpZCkKKwl1bnNldCBpZHJvd3JhbmdlcygkaWQpCisJaW5jciByb3cKKwlsYXBwZW5kIHJvd2lkbGlzdCB7fQorCWxhcHBlbmQgcm93b2Zmc2V0cyB7fQorICAgIH0KK30KKworcHJvYyBpbnNlcnRfcGFkIHtyb3cgY29sIG5wYWR9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMKKworICAgIHNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KKyAgICBsc2V0IHJvd2lkbGlzdCAkcm93IFtldmFsIGxpbnNlcnQgW2xpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXSAkY29sICRwYWRdCisgICAgc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd29mZnNldHMgJHJvd11dICRjb2wgJHBhZF0KKyAgICBsc2V0IHJvd29mZnNldHMgJHJvdyBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JGNvbCArICRucGFkfV0gW2V4cHIgey0kbnBhZH1dXQorfQorCitwcm9jIG9wdGltaXplX3Jvd3Mge3JvdyBjb2wgZW5kcm93fSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkcm93cmFuZ2VzIGRpc3BsYXlvcmRlcgorCisgICAgZm9yIHt9IHskcm93IDwgJGVuZHJvd30ge2luY3Igcm93fSB7CisJc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KKwlzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCisJc2V0IGhhc3BhZCAwCisJZm9yIHt9IHskY29sIDwgW2xsZW5ndGggJG9mZnNdfSB7aW5jciBjb2x9IHsKKwkgICAgaWYge1tsaW5kZXggJGlkbGlzdCAkY29sXSBlcSB7fX0geworCQlzZXQgaGFzcGFkIDEKKwkJY29udGludWUKKwkgICAgfQorCSAgICBzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCisJICAgIGlmIHskeiBlcSB7fX0gY29udGludWUKKwkgICAgc2V0IGlzYXJyb3cgMAorCSAgICBzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCisJICAgIHNldCB5MCBbZXhwciB7JHJvdyAtIDF9XQorCSAgICBzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQorCSAgICBpZiB7JHowIGVxIHt9fSB7CisJCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KKwkJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KKwkJaWYgeyRyYW5nZXMgbmUge30gJiYgJHkwID4gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CisJCSAgICBzZXQgaXNhcnJvdyAxCisJCX0KKwkgICAgfQorCSAgICBpZiB7JHogPCAtMSB8fCAoJHogPCAwICYmICRpc2Fycm93KX0geworCQlzZXQgbnBhZCBbZXhwciB7LTEgLSAkeiArICRpc2Fycm93fV0KKwkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgJG5wYWRdCisJCWluc2VydF9wYWQgJHkwICR4MCAkbnBhZAorCQlpZiB7JHkwID4gMH0geworCQkgICAgb3B0aW1pemVfcm93cyAkeTAgJHgwICRyb3cKKwkJfQorCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCisJCXNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KKwkJc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KKwkgICAgfSBlbHNlaWYgeyR6ID4gMSB8fCAoJHogPiAwICYmICRpc2Fycm93KX0geworCQlzZXQgbnBhZCBbZXhwciB7JHogLSAxICsgJGlzYXJyb3d9XQorCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KKwkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQorCQlzZXQgeDEgLTEKKwkJZm9yZWFjaCB6ICRvZmZzMiB7CisJCSAgICBpbmNyIHgxCisJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQorCQkgICAgaWYgeyR4MSArICR6ID4gJGNvbH0geworCQkJaW5jciBucGFkCisJCSAgICB9CisJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxICRucGFkXQorCQkgICAgYnJlYWsKKwkJfQorCQlzZXQgcGFkIFtudGltZXMgJG5wYWQge31dCisJCXNldCBpZGxpc3QgW2V2YWwgbGluc2VydCBcJGlkbGlzdCAkY29sICRwYWRdCisJCXNldCB0bXAgW2V2YWwgbGluc2VydCBcJG9mZnMgJGNvbCAkcGFkXQorCQlpbmNyIGNvbCAkbnBhZAorCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIFtleHByIHstJG5wYWR9XV0KKwkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQorCQlzZXQgaGFzcGFkIDEKKwkgICAgfQorCSAgICBpZiB7JHowIGVxIHt9ICYmICEkaXNhcnJvd30geworCQkjIHRoaXMgbGluZSBsaW5rcyB0byBpdHMgZmlyc3QgY2hpbGQgb24gcm93ICRyb3ctMgorCQlzZXQgcm0yIFtleHByIHskcm93IC0gMn1dCisJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJtMl0KKwkJc2V0IHhjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJtMl0gJGlkXQorCQlpZiB7JHhjID49IDB9IHsKKwkJICAgIHNldCB6MCBbZXhwciB7JHhjIC0gJHgwfV0KKwkJfQorCSAgICB9CisJICAgIGlmIHskejAgbmUge30gJiYgJHogPCAwICYmICR6MCA+IDB9IHsKKwkJaW5zZXJ0X3BhZCAkeTAgJHgwIDEKKwkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgMV0KKwkJb3B0aW1pemVfcm93cyAkeTAgW2V4cHIgeyR4MCArIDF9XSAkcm93CisJICAgIH0KKwl9CisJaWYgeyEkaGFzcGFkfSB7CisJICAgIHNldCBvIHt9CisJICAgIGZvciB7c2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIGNvbCAtMV0gPj0gMH0ge30geworCQlzZXQgbyBbbGluZGV4ICRvZmZzICRjb2xdCisJCWlmIHskbyBlcSB7fX0geworCQkgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZAorCQkgICAgc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQorCQkgICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KKwkJICAgIGlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cgPT0gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CisJCQkjIGl0IGlzLCB3b3JrIG91dCBvZmZzZXQgdG8gY2hpbGQKKwkJCXNldCB5MCBbZXhwciB7JHJvdyAtIDF9XQorCQkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeTBdCisJCQlzZXQgeDAgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkeTBdICRpZF0KKwkJCWlmIHskeDAgPj0gMH0geworCQkJICAgIHNldCBvIFtleHByIHskeDAgLSAkY29sfV0KKwkJCX0KKwkJICAgIH0KKwkJfQorCQlpZiB7JG8gZXEge30gfHwgJG8gPD0gMH0gYnJlYWsKKwkgICAgfQorCSAgICBpZiB7JG8gbmUge30gJiYgW2luY3IgY29sXSA8IFtsbGVuZ3RoICRpZGxpc3RdfSB7CisJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQorCQlzZXQgb2ZmczIgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTFdCisJCXNldCB4MSAtMQorCQlmb3JlYWNoIHogJG9mZnMyIHsKKwkJICAgIGluY3IgeDEKKwkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCisJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxIDFdCisJCSAgICBicmVhaworCQl9CisJCXNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sIHt9XQorCQlzZXQgdG1wIFtsaW5zZXJ0ICRvZmZzICRjb2wge31dCisJCWluY3IgY29sCisJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgLTFdCisJICAgIH0KKwl9CisJbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CisJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKKwlzZXQgY29sIDAKKyAgICB9Cit9CisKK3Byb2MgeGMge3JvdyBjb2x9IHsKKyAgICBnbG9iYWwgY2FudngwIGxpbmVzcGMKKyAgICByZXR1cm4gW2V4cHIgeyRjYW52eDAgKyAkY29sICogJGxpbmVzcGN9XQorfQorCitwcm9jIHljIHtyb3d9IHsKKyAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMKKyAgICByZXR1cm4gW2V4cHIgeyRjYW52eTAgKyAkcm93ICogJGxpbmVzcGN9XQorfQorCitwcm9jIGxpbmV3aWR0aCB7aWR9IHsKKyAgICBnbG9iYWwgdGhpY2tlcmxpbmUgbHRoaWNrbmVzcworCisgICAgc2V0IHdpZCAkbHRoaWNrbmVzcworICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdICYmICRpZCBlcSAkdGhpY2tlcmxpbmV9IHsKKwlzZXQgd2lkIFtleHByIHsyICogJGx0aGlja25lc3N9XQorICAgIH0KKyAgICByZXR1cm4gJHdpZAorfQorCitwcm9jIHJvd3JhbmdlcyB7aWR9IHsKKyAgICBnbG9iYWwgcGhhc2UgaWRyb3dyYW5nZXMgY29tbWl0cm93IHJvd2xhaWRvdXQgcm93cmFuZ2VsaXN0IGN1cnZpZXcKKworICAgIHNldCByYW5nZXMge30KKyAgICBpZiB7JHBoYXNlIGVxIHt9IHx8CisJKFtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KKwkgJiYgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDwgJHJvd2xhaWRvdXQpfSB7CisJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkaWQpXQorICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKKwlzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCisgICAgfQorICAgIHJldHVybiAkcmFuZ2VzCit9CisKK3Byb2MgZHJhd2xpbmVzZWcge2lkIGl9IHsKKyAgICBnbG9iYWwgcm93b2Zmc2V0cyByb3dpZGxpc3QKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyCisgICAgZ2xvYmFsIGNhbnYgY29sb3JtYXAgbGluZXNwYworICAgIGdsb2JhbCBudW1jb21taXRzIGNvbW1pdHJvdyBjdXJ2aWV3CisKKyAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQorICAgIHNldCBkb3duYXJyb3cgMQorICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCisJJiYgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDwgJG51bWNvbW1pdHN9IHsKKwlzZXQgZG93bmFycm93IFtleHByIHskaSA8IFtsbGVuZ3RoICRyYW5nZXNdIC8gMiAtIDF9XQorICAgIH0gZWxzZSB7CisJc2V0IGRvd25hcnJvdyAxCisgICAgfQorICAgIHNldCBzdGFydHJvdyBbbGluZGV4ICRyYW5nZXMgW2V4cHIgezIgKiAkaX1dXQorICAgIHNldCByb3cgW2xpbmRleCAkcmFuZ2VzIFtleHByIHsyICogJGkgKyAxfV1dCisgICAgaWYgeyRzdGFydHJvdyA9PSAkcm93fSByZXR1cm4KKyAgICBhc3NpZ25jb2xvciAkaWQKKyAgICBzZXQgY29vcmRzIHt9CisgICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KKyAgICBpZiB7JGNvbCA8IDB9IHsKKwlwdXRzICJvb3BzOiBkcmF3bGluZTogaWQgJGlkIG5vdCBvbiByb3cgJHJvdyIKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IGxhc3RvIHt9CisgICAgc2V0IG5zIDAKKyAgICB3aGlsZSB7MX0geworCXNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkY29sXQorCWlmIHskbyBlcSB7fX0gYnJlYWsKKwlpZiB7JG8gbmUgJGxhc3RvfSB7CisJICAgICMgY2hhbmdpbmcgZGlyZWN0aW9uCisJICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCisJICAgIHNldCB5IFt5YyAkcm93XQorCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQorCSAgICBzZXQgbGFzdG8gJG8KKwl9CisJaW5jciBjb2wgJG8KKwlpbmNyIHJvdyAtMQorICAgIH0KKyAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQorICAgIHNldCB5IFt5YyAkcm93XQorICAgIGxhcHBlbmQgY29vcmRzICR4ICR5CisgICAgaWYgeyRpID09IDB9IHsKKwkjIGRyYXcgdGhlIGxpbmsgdG8gdGhlIGZpcnN0IGNoaWxkIGFzIHBhcnQgb2YgdGhpcyBsaW5lCisJaW5jciByb3cgLTEKKwlzZXQgY2hpbGQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCisJc2V0IGNjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCisJaWYgeyRjY29sID49IDB9IHsKKwkgICAgc2V0IHggW3hjICRyb3cgJGNjb2xdCisJICAgIHNldCB5IFt5YyAkcm93XQorCSAgICBpZiB7JGNjb2wgPCAkY29sIC0gMX0geworCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCAtIDF9XV0gW3ljICRyb3ddCisJICAgIH0gZWxzZWlmIHskY2NvbCA+ICRjb2wgKyAxfSB7CisJCWxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskY29sICsgMX1dXSBbeWMgJHJvd10KKwkgICAgfQorCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQorCX0KKyAgICB9CisgICAgaWYge1tsbGVuZ3RoICRjb29yZHNdIDwgNH0gcmV0dXJuCisgICAgaWYgeyRkb3duYXJyb3d9IHsKKwkjIFRoaXMgbGluZSBoYXMgYW4gYXJyb3cgYXQgdGhlIGxvd2VyIGVuZDogY2hlY2sgaWYgdGhlIGFycm93IGlzCisJIyBvbiBhIGRpYWdvbmFsIHNlZ21lbnQsIGFuZCBpZiBzbywgd29yayBhcm91bmQgdGhlIFRrIDguNAorCSMgcmVmdXNhbCB0byBkcmF3IGFycm93cyBvbiBkaWFnb25hbCBsaW5lcy4KKwlzZXQgeDAgW2xpbmRleCAkY29vcmRzIDBdCisJc2V0IHgxIFtsaW5kZXggJGNvb3JkcyAyXQorCWlmIHskeDAgIT0gJHgxfSB7CisJICAgIHNldCB5MCBbbGluZGV4ICRjb29yZHMgMV0KKwkgICAgc2V0IHkxIFtsaW5kZXggJGNvb3JkcyAzXQorCSAgICBpZiB7JHkwIC0gJHkxIDw9IDIgKiAkbGluZXNwYyAmJiAkeDEgPT0gW2xpbmRleCAkY29vcmRzIDRdfSB7CisJCSMgd2UgaGF2ZSBhIG5lYXJieSB2ZXJ0aWNhbCBzZWdtZW50LCBqdXN0IHRyaW0gb2ZmIHRoZSBkaWFnIGJpdAorCQlzZXQgY29vcmRzIFtscmFuZ2UgJGNvb3JkcyAyIGVuZF0KKwkgICAgfSBlbHNlIHsKKwkJc2V0IHNsb3BlIFtleHByIHsoJHgwIC0gJHgxKSAvICgkeTAgLSAkeTEpfV0KKwkJc2V0IHhpIFtleHByIHskeDAgLSAkc2xvcGUgKiAkbGluZXNwYyAvIDJ9XQorCQlzZXQgeWkgW2V4cHIgeyR5MCAtICRsaW5lc3BjIC8gMn1dCisJCXNldCBjb29yZHMgW2xyZXBsYWNlICRjb29yZHMgMCAxICR4aSAkeTAgJHhpICR5aV0KKwkgICAgfQorCX0KKyAgICB9CisgICAgc2V0IGFycm93IFtleHByIHsyICogKCRpID4gMCkgKyAkZG93bmFycm93fV0KKyAgICBzZXQgYXJyb3cgW2xpbmRleCB7bm9uZSBmaXJzdCBsYXN0IGJvdGh9ICRhcnJvd10KKyAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkaWRdIFwKKwkgICAgICAgLWZpbGwgJGNvbG9ybWFwKCRpZCkgLXRhZ3MgbGluZXMuJGlkIC1hcnJvdyAkYXJyb3ddCisgICAgJGNhbnYgbG93ZXIgJHQKKyAgICBiaW5kbGluZSAkdCAkaWQKK30KKworcHJvYyBkcmF3cGFyZW50bGlua3Mge2lkIHJvdyBjb2wgb2xkc30geworICAgIGdsb2JhbCByb3dpZGxpc3QgY2FudiBjb2xvcm1hcAorCisgICAgc2V0IHJvdzIgW2V4cHIgeyRyb3cgKyAxfV0KKyAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQorICAgIHNldCB5IFt5YyAkcm93XQorICAgIHNldCB5MiBbeWMgJHJvdzJdCisgICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvdzJdCisgICAgIyBybXggPSByaWdodC1tb3N0IFggY29vcmQgdXNlZAorICAgIHNldCBybXggMAorICAgIGZvcmVhY2ggcCAkb2xkcyB7CisJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZHMgJHBdCisJaWYgeyRpIDwgMH0geworCSAgICBwdXRzICJvb3BzLCBwYXJlbnQgJHAgb2YgJGlkIG5vdCBpbiBsaXN0IgorCSAgICBjb250aW51ZQorCX0KKwlzZXQgeDIgW3hjICRyb3cyICRpXQorCWlmIHskeDIgPiAkcm14fSB7CisJICAgIHNldCBybXggJHgyCisJfQorCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkcF0KKwlpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93MiA9PSBbbGluZGV4ICRyYW5nZXMgMF0KKwkgICAgJiYgJHJvdzIgPCBbbGluZGV4ICRyYW5nZXMgMV19IHsKKwkgICAgIyBkcmF3bGluZXNlZyB3aWxsIGRvIHRoaXMgb25lIGZvciB1cworCSAgICBjb250aW51ZQorCX0KKwlhc3NpZ25jb2xvciAkcAorCSMgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGVkIHBhcmVudHMgaGVyZS4uLgorCXNldCBjb29yZHMgW2xpc3QgJHggJHldCisJaWYgeyRpIDwgJGNvbCAtIDF9IHsKKwkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpICsgMX1dXSAkeQorCX0gZWxzZWlmIHskaSA+ICRjb2wgKyAxfSB7CisJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSAtIDF9XV0gJHkKKwl9CisJbGFwcGVuZCBjb29yZHMgJHgyICR5MgorCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRwXSBcCisJCSAgIC1maWxsICRjb2xvcm1hcCgkcCkgLXRhZ3MgbGluZXMuJHBdCisJJGNhbnYgbG93ZXIgJHQKKwliaW5kbGluZSAkdCAkcAorICAgIH0KKyAgICByZXR1cm4gJHJteAorfQorCitwcm9jIGRyYXdsaW5lcyB7aWR9IHsKKyAgICBnbG9iYWwgY29sb3JtYXAgY2FudgorICAgIGdsb2JhbCBpZHJhbmdlZHJhd24KKyAgICBnbG9iYWwgY2hpbGRyZW4gaWRkcmF3biBjb21taXRyb3cgcm93aWRsaXN0IGN1cnZpZXcKKworICAgICRjYW52IGRlbGV0ZSBsaW5lcy4kaWQKKyAgICBzZXQgbnIgW2V4cHIge1tsbGVuZ3RoIFtyb3dyYW5nZXMgJGlkXV0gLyAyfV0KKyAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRucn0ge2luY3IgaX0geworCWlmIHtbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CisJICAgIGRyYXdsaW5lc2VnICRpZCAkaQorCX0KKyAgICB9CisgICAgZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7CisJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRjaGlsZCldfSB7CisJICAgIHNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpCisJICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCisJICAgIGlmIHskY29sID49IDB9IHsKKwkJZHJhd3BhcmVudGxpbmtzICRjaGlsZCAkcm93ICRjb2wgW2xpc3QgJGlkXQorCSAgICB9CisJfQorICAgIH0KK30KKworcHJvYyBkcmF3Y21pdHRleHQge2lkIHJvdyBjb2wgcm14fSB7CisgICAgZ2xvYmFsIGxpbmVzcGMgY2FudiBjYW52MiBjYW52MyBjYW52eTAgZmdjb2xvcgorICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgY29tbWl0aW5mbyByb3dpZGxpc3QKKyAgICBnbG9iYWwgcm93dGV4dHggaWRwb3MgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKKyAgICBnbG9iYWwgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKKyAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXggYm9sZHJvd3MgYm9sZG5hbWVyb3dzIGZnY29sb3IKKworICAgIHNldCBvZmlsbCBbZXhwciB7W2xpbmRleCAkY29tbWl0bGlzdGVkICRyb3ddPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQorICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCisgICAgc2V0IHkgW3ljICRyb3ddCisgICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCisJICAgICAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKKwkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lICRmZ2NvbG9yIC13aWR0aCAxIC10YWdzIGNpcmNsZV0KKyAgICAkY2FudiByYWlzZSAkdAorICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KKyAgICBzZXQgeHQgW3hjICRyb3cgW2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXV0KKyAgICBpZiB7JHh0IDwgJHJteH0geworCXNldCB4dCAkcm14CisgICAgfQorICAgIHNldCByb3d0ZXh0eCgkcm93KSAkeHQKKyAgICBzZXQgaWRwb3MoJGlkKSBbbGlzdCAkeCAkeHQgJHldCisgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV0gfHwgW2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV0KKwl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKKwlzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHldCisgICAgfQorICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KKyAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KKyAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KKyAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSAkZGF0ZV0KKyAgICBzZXQgZm9udCAkbWFpbmZvbnQKKyAgICBzZXQgbmZvbnQgJG1haW5mb250CisgICAgc2V0IGlzYm9sZCBbaXNoaWdobGlnaHRlZCAkcm93XQorICAgIGlmIHskaXNib2xkID4gMH0geworCWxhcHBlbmQgYm9sZHJvd3MgJHJvdworCWxhcHBlbmQgZm9udCBib2xkCisJaWYgeyRpc2JvbGQgPiAxfSB7CisJICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKKwkgICAgbGFwcGVuZCBuZm9udCBib2xkCisJfQorICAgIH0KKyAgICBzZXQgbGluZWh0YWcoJHJvdykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAorCQkJICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkZm9udCAtdGFncyB0ZXh0XQorICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRyb3cpIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgorICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKKwkJCSAgICAtdGV4dCAkbmFtZSAtZm9udCAkbmZvbnQgLXRhZ3MgdGV4dF0KKyAgICBzZXQgbGluZWR0YWcoJHJvdykgWyRjYW52MyBjcmVhdGUgdGV4dCAzICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCisJCQkgICAgLXRleHQgJGRhdGUgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRdCisgICAgc2V0IHhyIFtleHByIHskeHQgKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkaGVhZGxpbmVdfV0KKyAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CisJc2V0IGNhbnZ4bWF4ICR4cgorCXNldGNhbnZzY3JvbGwKKyAgICB9Cit9CisKK3Byb2MgZHJhd2NtaXRyb3cge3Jvd30geworICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcm93aWRsaXN0CisgICAgZ2xvYmFsIGlkcmFuZ2VkcmF3biBpZGRyYXduCisgICAgZ2xvYmFsIGNvbW1pdGluZm8gcGFyZW50bGlzdCBudW1jb21taXRzCisgICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmluZHN0cmluZyBuaGlnaGxpZ2h0cworICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKKworICAgIGlmIHskcm93ID49ICRudW1jb21taXRzfSByZXR1cm4KKyAgICBmb3JlYWNoIGlkIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSB7CisJaWYgeyRpZCBlcSB7fX0gY29udGludWUKKwlzZXQgaSAtMQorCWZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKKwkgICAgaW5jciBpCisJICAgIGlmIHskcm93IDwgJHN9IGNvbnRpbnVlCisJICAgIGlmIHskZSBlcSB7fX0gYnJlYWsKKwkgICAgaWYgeyRyb3cgPD0gJGV9IHsKKwkJaWYgeyRlIDwgJG51bWNvbW1pdHMgJiYgIVtpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKKwkJICAgIGRyYXdsaW5lc2VnICRpZCAkaQorCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKKwkJfQorCQlicmVhaworCSAgICB9CisJfQorICAgIH0KKworICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KKyAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgIVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKKwlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0gJiYgIVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKKwlhc2tmaWxlaGlnaGxpZ2h0ICRyb3cgJGlkCisgICAgfQorICAgIGlmIHskZmluZHN0cmluZyBuZSB7fSAmJiAhW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0geworCWFza2ZpbmRoaWdobGlnaHQgJHJvdyAkaWQKKyAgICB9CisgICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgJiYgIVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKKwlhc2tyZWxoaWdobGlnaHQgJHJvdyAkaWQKKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSByZXR1cm4KKyAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGlkXQorICAgIGlmIHskY29sIDwgMH0geworCXB1dHMgIm9vcHMsIHJvdyAkcm93IGlkICRpZCBub3QgaW4gbGlzdCIKKwlyZXR1cm4KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0geworCWdldGNvbW1pdCAkaWQKKyAgICB9CisgICAgYXNzaWduY29sb3IgJGlkCisgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQorICAgIGlmIHskb2xkcyBuZSB7fX0geworCXNldCBybXggW2RyYXdwYXJlbnRsaW5rcyAkaWQgJHJvdyAkY29sICRvbGRzXQorICAgIH0gZWxzZSB7CisJc2V0IHJteCAwCisgICAgfQorICAgIGRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sICRybXgKKyAgICBzZXQgaWRkcmF3bigkaWQpIDEKK30KKworcHJvYyBkcmF3ZnJhYyB7ZjAgZjF9IHsKKyAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52CisgICAgZ2xvYmFsIGxpbmVzcGMKKworICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCisgICAgc2V0IHkwIFtleHByIHtpbnQoJGYwICogJHltYXgpfV0KKyAgICBzZXQgcm93IFtleHByIHtpbnQoKCR5MCAtIDMpIC8gJGxpbmVzcGMpIC0gMX1dCisgICAgaWYgeyRyb3cgPCAwfSB7CisJc2V0IHJvdyAwCisgICAgfQorICAgIHNldCB5MSBbZXhwciB7aW50KCRmMSAqICR5bWF4KX1dCisgICAgc2V0IGVuZHJvdyBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQorICAgIGlmIHskZW5kcm93ID49ICRudW1jb21taXRzfSB7CisJc2V0IGVuZHJvdyBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KKyAgICB9CisgICAgZm9yIHt9IHskcm93IDw9ICRlbmRyb3d9IHtpbmNyIHJvd30geworCWRyYXdjbWl0cm93ICRyb3cKKyAgICB9Cit9CisKK3Byb2MgZHJhd3Zpc2libGUge30geworICAgIGdsb2JhbCBjYW52CisgICAgZXZhbCBkcmF3ZnJhYyBbJGNhbnYgeXZpZXddCit9CisKK3Byb2MgY2xlYXJfZGlzcGxheSB7fSB7CisgICAgZ2xvYmFsIGlkZHJhd24gaWRyYW5nZWRyYXduCisgICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCisKKyAgICBhbGxjYW52cyBkZWxldGUgYWxsCisgICAgY2F0Y2gge3Vuc2V0IGlkZHJhd259CisgICAgY2F0Y2gge3Vuc2V0IGlkcmFuZ2VkcmF3bn0KKyAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CisgICAgY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQorICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KKyAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9Cit9CisKK3Byb2MgZmluZGNyb3NzaW5ncyB7aWR9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IHBhcmVudGxpc3QgbnVtY29tbWl0cyByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgorCisgICAgc2V0IGNyb3NzIHt9CisgICAgc2V0IGNjcm9zcyB7fQorICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKKwlpZiB7JGUgPj0gJG51bWNvbW1pdHN9IHsKKwkgICAgc2V0IGUgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCisJfQorCWlmIHskZSA8PSAkc30gY29udGludWUKKwlzZXQgeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRlXSAkaWRdCisJaWYgeyR4IDwgMH0geworCSAgICBwdXRzICJmaW5kY3Jvc3NpbmdzOiBvb3BzLCBubyBbc2hvcnRpZHMgJGlkXSBpbiByb3cgJGUiCisJICAgIGNvbnRpbnVlCisJfQorCWZvciB7c2V0IHJvdyAkZX0ge1tpbmNyIHJvdyAtMV0gPj0gJHN9IHt9IHsKKwkgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQorCSAgICBzZXQga2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQorCSAgICBzZXQga2lkeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRraWRdCisJICAgIGlmIHska2lkeCA8IDB9IGNvbnRpbnVlCisJICAgIHNldCBuZXh0cm93IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdyArIDF9XV0KKwkgICAgZm9yZWFjaCBwICRvbGRzIHsKKwkJc2V0IHB4IFtsc2VhcmNoIC1leGFjdCAkbmV4dHJvdyAkcF0KKwkJaWYgeyRweCA8IDB9IGNvbnRpbnVlCisJCWlmIHsoJGtpZHggPCAkeCAmJiAkeCA8ICRweCkgfHwgKCRweCA8ICR4ICYmICR4IDwgJGtpZHgpfSB7CisJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjY3Jvc3MgJHBdID49IDB9IGNvbnRpbnVlCisJCSAgICBpZiB7JHggPT0gJHB4ICsgKCRraWR4IDwgJHB4PyAtMTogMSl9IHsKKwkJCWxhcHBlbmQgY2Nyb3NzICRwCisJCSAgICB9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjcm9zcyAkcF0gPCAwfSB7CisJCQlsYXBwZW5kIGNyb3NzICRwCisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBzZXQgaW5jIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkeF0KKwkgICAgaWYgeyRpbmMgZXEge319IGJyZWFrCisJICAgIGluY3IgeCAkaW5jCisJfQorICAgIH0KKyAgICByZXR1cm4gW2NvbmNhdCAkY2Nyb3NzIHt7fX0gJGNyb3NzXQorfQorCitwcm9jIGFzc2lnbmNvbG9yIHtpZH0geworICAgIGdsb2JhbCBjb2xvcm1hcCBjb2xvcnMgbmV4dGNvbG9yCisgICAgZ2xvYmFsIGNvbW1pdHJvdyBwYXJlbnRsaXN0IGNoaWxkcmVuIGNoaWxkcmVuIGN1cnZpZXcKKworICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV19IHJldHVybgorICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCisgICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0geworCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCisgICAgfSBlbHNlIHsKKwlzZXQga2lkcyB7fQorICAgIH0KKyAgICBpZiB7W2xsZW5ndGggJGtpZHNdID09IDF9IHsKKwlzZXQgY2hpbGQgW2xpbmRleCAka2lkcyAwXQorCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KKwkgICAgJiYgW2xsZW5ndGggW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCldXSA9PSAxfSB7CisJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgc2V0IGJhZGNvbG9ycyB7fQorICAgIHNldCBvcmlnYmFkIHt9CisgICAgZm9yZWFjaCB4IFtmaW5kY3Jvc3NpbmdzICRpZF0geworCWlmIHskeCBlcSB7fX0geworCSAgICAjIGRlbGltaXRlciBiZXR3ZWVuIGNvcm5lciBjcm9zc2luZ3MgYW5kIG90aGVyIGNyb3NzaW5ncworCSAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnMgLSAxfSBicmVhaworCSAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCisJfQorCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQorCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKKwkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQorCX0KKyAgICB9CisgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CisJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAorICAgIH0KKyAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCisgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CisJZm9yZWFjaCBjaGlsZCAka2lkcyB7CisJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KKwkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCldIDwgMH0geworCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQorCSAgICB9CisJICAgIGZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV0geworCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KKwkJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkcCldIDwgMH0geworCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQorCQl9CisJICAgIH0KKwl9CisJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CisJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKKwl9CisgICAgfQorICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CisJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCisJaWYge1tpbmNyIG5leHRjb2xvcl0gPj0gJG5jb2xvcnN9IHsKKwkgICAgc2V0IG5leHRjb2xvciAwCisJfQorCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY119IGJyZWFrCisgICAgfQorICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCit9CisKK3Byb2MgYmluZGxpbmUge3QgaWR9IHsKKyAgICBnbG9iYWwgY2FudgorCisgICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgorICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgorICAgICRjYW52IGJpbmQgJHQgPExlYXZlPiAibGluZWxlYXZlICRpZCIKKyAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKK30KKworcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0geworICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcyBtYWluaGVhZAorICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKKyAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjb21taXRyb3cgcm93dGV4dHggY3VydmlldyBmZ2NvbG9yIGJnY29sb3IKKworICAgIHNldCBtYXJrcyB7fQorICAgIHNldCBudGFncyAwCisgICAgc2V0IG5oZWFkcyAwCisgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKKwlzZXQgbWFya3MgJGlkdGFncygkaWQpCisJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CisJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCisJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CisJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQorICAgIH0KKyAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CisJcmV0dXJuICR4dAorICAgIH0KKworICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQorICAgIHNldCB5dCBbZXhwciB7JHkxIC0gMC41ICogJGxpbmVzcGN9XQorICAgIHNldCB5YiBbZXhwciB7JHl0ICsgJGxpbmVzcGMgLSAxfV0KKyAgICBzZXQgeHZhbHMge30KKyAgICBzZXQgd3ZhbHMge30KKyAgICBzZXQgaSAtMQorICAgIGZvcmVhY2ggdGFnICRtYXJrcyB7CisJaW5jciBpCisJaWYgeyRpID49ICRudGFncyAmJiAkaSA8ICRudGFncyArICRuaGVhZHMgJiYgJHRhZyBlcSAkbWFpbmhlYWR9IHsKKwkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlIFtjb25jYXQgJG1haW5mb250IGJvbGRdICR0YWddCisJfSBlbHNlIHsKKwkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQorCX0KKwlsYXBwZW5kIHh2YWxzICR4dAorCWxhcHBlbmQgd3ZhbHMgJHdpZAorCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQorICAgIH0KKyAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKKwkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCisgICAgJGNhbnYgbG93ZXIgJHQKKyAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CisJc2V0IHhsIFtleHByIHskeCArICRkZWx0YX1dCisJc2V0IHhyIFtleHByIHskeCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzc31dCisJc2V0IGZvbnQgJG1haW5mb250CisJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CisJICAgICMgZHJhdyBhIHRhZworCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgeyR5dCArICRkZWx0YX1dICR4bCAkeXQgXAorCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgeyR5YiAtICRkZWx0YX1dIFwKKwkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQorCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KKwkgICAgc2V0IHJvd3RleHR4KCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KKwl9IGVsc2UgeworCSAgICAjIGRyYXcgYSBoZWFkIG9yIG90aGVyIHJlZgorCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CisJCXNldCBjb2wgZ3JlZW4KKwkJaWYgeyR0YWcgZXEgJG1haW5oZWFkfSB7CisJCSAgICBsYXBwZW5kIGZvbnQgYm9sZAorCQl9CisJICAgIH0gZWxzZSB7CisJCXNldCBjb2wgIiNkZGRkZmYiCisJICAgIH0KKwkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCisJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKKwkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCisJICAgIGlmIHtbcmVnZXhwIHteKHJlbW90ZXMvLiovfHJlbW90ZXMvKX0gJHRhZyBtYXRjaCByZW1vdGVwcmVmaXhdfSB7CisJICAgICAgICBzZXQgcndpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkcmVtb3RlcHJlZml4XQorCQlzZXQgeGkgW2V4cHIgeyR4ICsgMX1dCisJCXNldCB5dGkgW2V4cHIgeyR5dCArIDF9XQorCQlzZXQgeHJpIFtleHByIHskeCArICRyd2lkfV0KKwkJJGNhbnYgY3JlYXRlIHBvbHlnb24gJHhpICR5dGkgJHhyaSAkeXRpICR4cmkgJHliICR4aSAkeWIgXAorCQkJLXdpZHRoIDAgLWZpbGwgIiNmZmRkYWEiIC10YWdzIHRhZy4kaWQKKwkgICAgfQorCX0KKwlzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyAtZmlsbCAkZmdjb2xvciBcCisJCSAgIC1mb250ICRmb250IC10YWdzIFtsaXN0IHRhZy4kaWQgdGV4dF1dCisJaWYgeyRudGFncyA+PSAwfSB7CisJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQorCX0gZWxzZWlmIHskbmhlYWRzID49IDB9IHsKKwkgICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTM+IFtsaXN0IGhlYWRtZW51ICVYICVZICRpZCAkdGFnXQorCX0KKyAgICB9CisgICAgcmV0dXJuICR4dAorfQorCitwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0geworICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKKworICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCisgICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKKwlzZXQgeCBbZXhwciB7JHggKyAwLjUgKiAoJHhzcGMyIC0gJHhzcGMxKCRsbikpfV0KKyAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKKwlzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCisgICAgfQorICAgIHJldHVybiAkeAorfQorCitwcm9jIHNob3dfc3RhdHVzIHttc2d9IHsKKyAgICBnbG9iYWwgY2FudiBtYWluZm9udCBmZ2NvbG9yCisKKyAgICBjbGVhcl9kaXNwbGF5CisgICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgJG1zZyAtZm9udCAkbWFpbmZvbnQgXAorCS10YWdzIHRleHQgLWZpbGwgJGZnY29sb3IKK30KKworcHJvYyBmaW5pc2hjb21taXRzIHt9IHsKKyAgICBnbG9iYWwgY29tbWl0aWR4IHBoYXNlIGN1cnZpZXcKKyAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QKKworICAgIGlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+IDB9IHsKKwlkcmF3cmVzdAorICAgIH0gZWxzZSB7CisJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCisgICAgfQorICAgIHNldCBwaGFzZSB7fQorICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KK30KKworIyBJbnNlcnQgYSBuZXcgY29tbWl0IGFzIHRoZSBjaGlsZCBvZiB0aGUgY29tbWl0IG9uIHJvdyAkcm93LgorIyBUaGUgbmV3IGNvbW1pdCB3aWxsIGJlIGRpc3BsYXllZCBvbiByb3cgJHJvdyBhbmQgdGhlIGNvbW1pdHMKKyMgb24gdGhhdCByb3cgYW5kIGJlbG93IHdpbGwgbW92ZSBkb3duIG9uZSByb3cuCitwcm9jIGluc2VydHJvdyB7cm93IG5ld2NtaXR9IHsKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNvbW1pdGxpc3RlZAorICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldyByb3dpZGxpc3Qgcm93b2Zmc2V0cyBudW1jb21taXRzCisgICAgZ2xvYmFsIHJvd3JhbmdlbGlzdCBpZHJvd3JhbmdlcyByb3dsYWlkb3V0IHJvd29wdGltIG51bWNvbW1pdHMKKyAgICBnbG9iYWwgbGluZXNlZ2VuZHMgc2VsZWN0ZWRsaW5lCisKKyAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30geworCXB1dHMgIm9vcHMsIGluc2VydGluZyBuZXcgcm93ICRyb3cgYnV0IG9ubHkgaGF2ZSAkbnVtY29tbWl0cyByb3dzIgorCXJldHVybgorICAgIH0KKyAgICBzZXQgcCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KKyAgICBzZXQgZGlzcGxheW9yZGVyIFtsaW5zZXJ0ICRkaXNwbGF5b3JkZXIgJHJvdyAkbmV3Y21pdF0KKyAgICBzZXQgcGFyZW50bGlzdCBbbGluc2VydCAkcGFyZW50bGlzdCAkcm93ICRwXQorICAgIHNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcm93XQorICAgIGxhcHBlbmQga2lkcyAkbmV3Y21pdAorICAgIGxzZXQgY2hpbGRsaXN0ICRyb3cgJGtpZHMKKyAgICBzZXQgY2hpbGRsaXN0IFtsaW5zZXJ0ICRjaGlsZGxpc3QgJHJvdyB7fV0KKyAgICBzZXQgY29tbWl0bGlzdGVkIFtsaW5zZXJ0ICRjb21taXRsaXN0ZWQgJHJvdyAxXQorICAgIHNldCBsIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCisgICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkbH0ge2luY3Igcn0geworCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCisJc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyCisgICAgfQorCisgICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KKyAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCisgICAgc2V0IG5ld29mZnMge30KKyAgICBmb3JlYWNoIHggJGlkbGlzdCB7CisJaWYgeyR4IGVxIHt9IHx8ICgkeCBlcSAkcCAmJiBbbGxlbmd0aCAka2lkc10gPT0gMSl9IHsKKwkgICAgbGFwcGVuZCBuZXdvZmZzIHt9CisJfSBlbHNlIHsKKwkgICAgbGFwcGVuZCBuZXdvZmZzIDAKKwl9CisgICAgfQorICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0geworCXNldCBjb2wgW2xzZWFyY2ggLWV4YWN0ICRpZGxpc3QgJHBdCisJbHNldCBpZGxpc3QgJGNvbCAkbmV3Y21pdAorICAgIH0gZWxzZSB7CisJc2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XQorCWxhcHBlbmQgaWRsaXN0ICRuZXdjbWl0CisJbGFwcGVuZCBvZmZzIHt9CisJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKKyAgICB9CisgICAgc2V0IHJvd2lkbGlzdCBbbGluc2VydCAkcm93aWRsaXN0ICRyb3cgJGlkbGlzdF0KKyAgICBzZXQgcm93b2Zmc2V0cyBbbGluc2VydCAkcm93b2Zmc2V0cyBbZXhwciB7JHJvdysxfV0gJG5ld29mZnNdCisKKyAgICBzZXQgcm93cmFuZ2VsaXN0IFtsaW5zZXJ0ICRyb3dyYW5nZWxpc3QgJHJvdyB7fV0KKyAgICBzZXQgbCBbbGxlbmd0aCAkcm93cmFuZ2VsaXN0XQorICAgIGZvciB7c2V0IHIgMH0geyRyIDwgJGx9IHtpbmNyIHJ9IHsKKwlzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcl0KKwlpZiB7JHJhbmdlcyBuZSB7fSAmJiBbbGluZGV4ICRyYW5nZXMgZW5kXSA+PSAkcm93fSB7CisJICAgIHNldCBuZXdyYW5nZXMge30KKwkgICAgZm9yZWFjaCB4ICRyYW5nZXMgeworCQlpZiB7JHggPj0gJHJvd30geworCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgW2V4cHIgeyR4ICsgMX1dCisJCX0gZWxzZSB7CisJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyAkeAorCQl9CisJICAgIH0KKwkgICAgbHNldCByb3dyYW5nZWxpc3QgJHIgJG5ld3JhbmdlcworCX0KKyAgICB9CisgICAgaWYge1tsbGVuZ3RoICRraWRzXSA+IDF9IHsKKwlzZXQgcnAxIFtleHByIHskcm93ICsgMX1dCisJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJHJwMV0KKwlpZiB7JHJhbmdlcyBlcSB7fX0geworCSAgICBzZXQgcmFuZ2VzIFtsaXN0ICRyb3cgJHJwMV0KKwl9IGVsc2VpZiB7W2xpbmRleCAkcmFuZ2VzIGVuZC0xXSA9PSAkcnAxfSB7CisJICAgIGxzZXQgcmFuZ2VzIGVuZC0xICRyb3cKKwl9CisJbHNldCByb3dyYW5nZWxpc3QgJHJwMSAkcmFuZ2VzCisgICAgfQorICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkcm93cmFuZ2VzXSB7CisJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQorCWlmIHskcmFuZ2VzIG5lIHt9ICYmIFtsaW5kZXggJHJhbmdlcyBlbmRdID49ICRyb3d9IHsKKwkgICAgc2V0IG5ld3JhbmdlcyB7fQorCSAgICBmb3JlYWNoIHggJHJhbmdlcyB7CisJCWlmIHskeCA+PSAkcm93fSB7CisJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyBbZXhwciB7JHggKyAxfV0KKwkJfSBlbHNlIHsKKwkJICAgIGxhcHBlbmQgbmV3cmFuZ2VzICR4CisJCX0KKwkgICAgfQorCSAgICBzZXQgaWRyb3dyYW5nZXMoJGlkKSAkbmV3cmFuZ2VzCisJfQorICAgIH0KKworICAgIHNldCBsaW5lc2VnZW5kcyBbbGluc2VydCAkbGluZXNlZ2VuZHMgJHJvdyB7fV0KKworICAgIGluY3Igcm93bGFpZG91dAorICAgIGluY3Igcm93b3B0aW0KKyAgICBpbmNyIG51bWNvbW1pdHMKKworICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID49ICRyb3d9IHsKKwlpbmNyIHNlbGVjdGVkbGluZQorICAgIH0KKyAgICByZWRpc3BsYXkKK30KKworIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKKyMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgorcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CisgICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKKworICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKKwkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKKyAgICB9CisgICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKK30KKworcHJvYyBub3didXN5IHt3aGF0fSB7CisgICAgZ2xvYmFsIGlzYnVzeQorCisgICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CisJLiBjb25maWcgLWN1cnNvciB3YXRjaAorCXNldHRleHRjdXJzb3Igd2F0Y2gKKyAgICB9CisgICAgc2V0IGlzYnVzeSgkd2hhdCkgMQorfQorCitwcm9jIG5vdGJ1c3kge3doYXR9IHsKKyAgICBnbG9iYWwgaXNidXN5IG1haW5jdXJzb3IgdGV4dGN1cnNvcgorCisgICAgY2F0Y2gge3Vuc2V0IGlzYnVzeSgkd2hhdCl9CisgICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CisJLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgorCXNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKKyAgICB9Cit9CisKK3Byb2MgZHJhd3Jlc3Qge30geworICAgIGdsb2JhbCBzdGFydG1zZWNzCisgICAgZ2xvYmFsIHJvd2xhaWRvdXQgY29tbWl0aWR4IGN1cnZpZXcKKyAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QKKworICAgIHNldCByb3cgJHJvd2xhaWRvdXQKKyAgICBsYXlvdXRyb3dzICRyb3dsYWlkb3V0ICRjb21taXRpZHgoJGN1cnZpZXcpIDEKKyAgICBsYXlvdXR0YWlsCisgICAgb3B0aW1pemVfcm93cyAkcm93IDAgJGNvbW1pdGlkeCgkY3VydmlldykKKyAgICBzaG93c3R1ZmYgJGNvbW1pdGlkeCgkY3VydmlldykKKyAgICBpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XX0geworCXNlbGVjdGxpbmUgMCAxCisgICAgfQorCisgICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KKyAgICAjZ2xvYmFsIG51bWNvbW1pdHMKKyAgICAjcHV0cyAib3ZlcmFsbCAkZHJhd21zZWNzIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgorfQorCitwcm9jIGZpbmRtYXRjaGVzIHtmfSB7CisgICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCisgICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0geworCXNldCBtYXRjaGVzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lICRmb3VuZHN0cmluZyAkZl0KKyAgICB9IGVsc2UgeworCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CisJICAgIHNldCBzdHIgW3N0cmluZyB0b2xvd2VyICRmXQorCX0gZWxzZSB7CisJICAgIHNldCBzdHIgJGYKKwl9CisJc2V0IG1hdGNoZXMge30KKwlzZXQgaSAwCisJd2hpbGUge1tzZXQgaiBbc3RyaW5nIGZpcnN0ICRmb3VuZHN0cmluZyAkc3RyICRpXV0gPj0gMH0geworCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgeyRqKyRmb3VuZHN0cmxlbi0xfV1dCisJICAgIHNldCBpIFtleHByIHskaiArICRmb3VuZHN0cmxlbn1dCisJfQorICAgIH0KKyAgICByZXR1cm4gJG1hdGNoZXMKK30KKworcHJvYyBkb2ZpbmQge30geworICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCisgICAgZ2xvYmFsIG51bWNvbW1pdHMgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCisgICAgZ2xvYmFsIG1haW5mb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCisgICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4gbWF0Y2hzdHJpbmcKKyAgICBnbG9iYWwgY29tbWl0ZGF0YQorCisgICAgc3RvcGZpbmRwcm9jCisgICAgdW5tYXJrbWF0Y2hlcworICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAorICAgIGZvY3VzIC4KKyAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQorICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CisJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KKyAgICB9IGVsc2UgeworCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZworICAgIH0KKyAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCisgICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KKyAgICByZWdzdWIgLWFsbCB7Wyo/XFtcXF19ICRmb3VuZHN0cmluZyB7XFwmfSBtYXRjaHN0cmluZworICAgIHNldCBtYXRjaHN0cmluZyAiKiRtYXRjaHN0cmluZyoiCisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0geworCXNldCBvbGRzZWwgLTEKKyAgICB9IGVsc2UgeworCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQorICAgIH0KKyAgICBzZXQgZGlkc2VsIDAKKyAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KKyAgICBzZXQgbCAtMQorICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CisJc2V0IGQgJGNvbW1pdGRhdGEoJGlkKQorCWluY3IgbAorCWlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKKwkgICAgc2V0IGRvZXNtYXRjaCBbcmVnZXhwICRmb3VuZHN0cmluZyAkZF0KKwl9IGVsc2VpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0geworCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkbWF0Y2hzdHJpbmcgJGRdCisJfSBlbHNlIHsKKwkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRtYXRjaHN0cmluZyAkZF0KKwl9CisJaWYgeyEkZG9lc21hdGNofSBjb250aW51ZQorCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKKwkgICAgZ2V0Y29tbWl0ICRpZAorCX0KKwlzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCisJc2V0IGRvZXNtYXRjaCAwCisJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CisJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CisJCWNvbnRpbnVlCisJICAgIH0KKwkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQorCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCisJICAgIHNldCBkb2VzbWF0Y2ggMQorCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKKwkJZHJhd2NtaXRyb3cgJGwKKwkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKKwkgICAgfSBlbHNlaWYgeyR0eSA9PSAiQXV0aG9yIn0geworCQlkcmF3Y21pdHJvdyAkbAorCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKKwkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKKwkJZHJhd2NtaXRyb3cgJGwKKwkJbWFya21hdGNoZXMgJGNhbnYzICRsICRmICRsaW5lZHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CisJICAgIH0KKwl9CisJaWYgeyRkb2VzbWF0Y2h9IHsKKwkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCisJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKKwkJZmluZHNlbGVjdGxpbmUgJGwKKwkJc2V0IGRpZHNlbCAxCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0geworCWJlbGwKKyAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKKwlmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCisgICAgfQorfQorCitwcm9jIGZpbmRzZWxlY3RsaW5lIHtsfSB7CisgICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAorICAgIHNlbGVjdGxpbmUgJGwgMQorICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0geworCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cworCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KKwlzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCisJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CisJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQorCSAgICBzZXQgZW5kIFtleHByIHtbbGluZGV4ICRtYXRjaCAxXSArIDF9XQorCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCisJfQorICAgIH0KK30KKworcHJvYyBmaW5kbmV4dCB7cmVzdGFydH0geworICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQorICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CisJaWYgeyRyZXN0YXJ0fSB7CisJICAgIGRvZmluZAorCX0KKwlyZXR1cm4KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCisgICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKKwlpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CisJICAgIGZpbmRzZWxlY3RsaW5lICRsCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgYmVsbAorfQorCitwcm9jIGZpbmRwcmV2IHt9IHsKKyAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0geworCWRvZmluZAorCXJldHVybgorICAgIH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KKyAgICBzZXQgcHJldiB7fQorICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CisJaWYgeyRsID49ICRzZWxlY3RlZGxpbmV9IGJyZWFrCisJc2V0IHByZXYgJGwKKyAgICB9CisgICAgaWYgeyRwcmV2ICE9IHt9fSB7CisJZmluZHNlbGVjdGxpbmUgJHByZXYKKyAgICB9IGVsc2UgeworCWJlbGwKKyAgICB9Cit9CisKK3Byb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0geworICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcworICAgIGdsb2JhbCBjdGV4dCBmaW5kb2xkY3Vyc29yIHBoYXNlIG1haW5jdXJzb3IgdGV4dGN1cnNvcgorICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcworCisgICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9CisgICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKKwlpZiB7ISRkb25lfSB7CisJICAgIGNhdGNoIHtleGVjIGtpbGwgJGZpbmRwcm9jcGlkfQorCX0KKwljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KKwl1bnNldCBmaW5kcHJvY3BpZAorICAgIH0KKyAgICBjYXRjaCB7dW5zZXQgZmluZGlucHJvZ3Jlc3N9CisgICAgbm90YnVzeSBmaW5kCit9CisKKyMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKKyMgYmVoaW5kIHRoZSBoZWFkbGluZQorcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKKyAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZworCisgICAgZHJhd2NtaXRyb3cgJGwKKyAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXQorICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KKyAgICAkY2FudiBsb3dlciAkdAorfQorCisjIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCitwcm9jIG1hcmttYXRjaGVzIHtjYW52IGwgc3RyIHRhZyBtYXRjaGVzIGZvbnR9IHsKKyAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQorICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCisgICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KKyAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQorICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgeworCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQorCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KKwlpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKKwlzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskc3RhcnQtMX1dXV0KKwlzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskZW5kfV1dXQorCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKKwkJICAgW2V4cHIgeyR4MCskeGxlbisyfV0gJHkxIFwKKwkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCisJJGNhbnYgbG93ZXIgJHQKKyAgICB9Cit9CisKK3Byb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CisgICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcworICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCisgICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CisgICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cit9CisKK3Byb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKKyAgICBnbG9iYWwgcm93dGV4dHgKKyAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisgICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KKyAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCisgICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQorICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQorICAgIGlmIHskbCA8IDB9IHsKKwlzZXQgbCAwCisgICAgfQorICAgIGlmIHskdyBlcSAkY2Fudn0geworCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KKyAgICB9CisgICAgdW5tYXJrbWF0Y2hlcworICAgIHNlbGVjdGxpbmUgJGwgMQorfQorCitwcm9jIGNvbW1pdF9kZXNjcmlwdG9yIHtwfSB7CisgICAgZ2xvYmFsIGNvbW1pdGluZm8KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKKwlnZXRjb21taXQgJHAKKyAgICB9CisgICAgc2V0IGwgIi4uLiIKKyAgICBpZiB7W2xsZW5ndGggJGNvbW1pdGluZm8oJHApXSA+IDF9IHsKKwlzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQorICAgIH0KKyAgICByZXR1cm4gIiRwICgkbClcbiIKK30KKworIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECisjIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgorcHJvYyBhcHBlbmR3aXRobGlua3Mge3RleHQgdGFnc30geworICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3CisKKyAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICR0ZXh0ICR0YWdzCisgICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQorICAgIGZvcmVhY2ggbCAkbGlua3MgeworCXNldCBzIFtsaW5kZXggJGwgMF0KKwlzZXQgZSBbbGluZGV4ICRsIDFdCisJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQorCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKV19IGNvbnRpbnVlCisJaW5jciBlCisJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCisJJGN0ZXh0IHRhZyBhZGQgbGluayRsaW5rbnVtICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKKwkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBcCisJICAgIFtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKSAxXQorCWluY3IgbGlua251bQorICAgIH0KKyAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQorICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KK30KKworcHJvYyB2aWV3bmV4dGxpbmUge2Rpcn0geworICAgIGdsb2JhbCBjYW52IGxpbmVzcGMKKworICAgICRjYW52IGRlbGV0ZSBob3ZlcgorICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCisgICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCisgICAgc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkZGlyICogJGxpbmVzcGN9XQorICAgIGlmIHskbmV3dG9wIDwgMH0geworCXNldCBuZXd0b3AgMAorICAgIH0gZWxzZWlmIHskbmV3dG9wID4gJHltYXh9IHsKKwlzZXQgbmV3dG9wICR5bWF4CisgICAgfQorICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KK30KKworIyBhZGQgYSBsaXN0IG9mIHRhZyBvciBicmFuY2ggbmFtZXMgYXQgcG9zaXRpb24gcG9zCisjIHJldHVybnMgdGhlIG51bWJlciBvZiBuYW1lcyBpbnNlcnRlZAorcHJvYyBhcHBlbmRyZWZzIHtwb3MgdGFncyB2YXJ9IHsKKyAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldyAkdmFyCisKKyAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggJHBvc31dfSB7CisJcmV0dXJuIDAKKyAgICB9CisgICAgc2V0IHRhZ3MgW2xzb3J0ICR0YWdzXQorICAgIHNldCBzZXAge30KKyAgICBmb3JlYWNoIHRhZyAkdGFncyB7CisJc2V0IGlkIFtzZXQgJHZhclwoJHRhZ1wpXQorCXNldCBsayBsaW5rJGxpbmtudW0KKwlpbmNyIGxpbmtudW0KKwkkY3RleHQgaW5zZXJ0ICRwb3MgJHNlcAorCSRjdGV4dCBpbnNlcnQgJHBvcyAkdGFnICRsaworCSRjdGV4dCB0YWcgY29uZiAkbGsgLWZvcmVncm91bmQgYmx1ZQorCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CisJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPDE+IFwKKwkJW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMV0KKwkgICAgJGN0ZXh0IHRhZyBjb25mICRsayAtdW5kZXJsaW5lIDEKKwkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQorCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CisJfQorCXNldCBzZXAgIiwgIgorICAgIH0KKyAgICByZXR1cm4gW2xsZW5ndGggJHRhZ3NdCit9CisKK3Byb2MgdGFnbGlzdCB7aWRzfSB7CisgICAgZ2xvYmFsIGlkdGFncworCisgICAgc2V0IHRhZ3Mge30KKyAgICBmb3JlYWNoIGlkICRpZHMgeworCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CisJICAgIGxhcHBlbmQgdGFncyAkdGFnCisJfQorICAgIH0KKyAgICByZXR1cm4gJHRhZ3MKK30KKworIyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIGNvbXB1dGluZyB0aGUgbmVhcmJ5IHRhZ3MKK3Byb2MgZGlzcG5lYXJ0YWdzIHt9IHsKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjdGV4dCBhbmNfdGFncyBkZXNjX3RhZ3Mgc2hvd25lYXJ0YWdzCisgICAgZ2xvYmFsIGRlc2NfaGVhZHMKKworICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgISRzaG93bmVhcnRhZ3N9IHJldHVybgorICAgIHNldCBpZCAkY3VycmVudGlkCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkaWQpXX0geworCWlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBoZWFkaWRzXSA+IDF9IHsKKwkgICAgJGN0ZXh0IGluc2VydCAiYnJhbmNoIC0yYyIgImVzIgorCX0KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0geworCWFwcGVuZHJlZnMgZm9sbG93cyBbdGFnbGlzdCAkYW5jX3RhZ3MoJGlkKV0gdGFnaWRzCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CisJYXBwZW5kcmVmcyBwcmVjZWRlcyBbdGFnbGlzdCAkZGVzY190YWdzKCRpZCldIHRhZ2lkcworICAgIH0KKyAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY29tbWl0aW5mbyBzZWxlY3RlZGxpbmUKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCisgICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudGxpc3QgY2hpbGRsaXN0CisgICAgZ2xvYmFsIGN1cnJlbnRpZCBzaGExZW50cnkKKyAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgbGlua251bQorICAgIGdsb2JhbCBtZXJnZW1heCBudW1jb21taXRzIHBlbmRpbmdfc2VsZWN0CisgICAgZ2xvYmFsIGNtaXRtb2RlIGRlc2NfdGFncyBhbmNfdGFncyBzaG93bmVhcnRhZ3MgYWxsY29tbWl0cyBkZXNjX2hlYWRzCisKKyAgICBjYXRjaCB7dW5zZXQgcGVuZGluZ19zZWxlY3R9CisgICAgJGNhbnYgZGVsZXRlIGhvdmVyCisgICAgbm9ybWFsbGluZQorICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAorICAgIGlmIHskbCA8IDAgfHwgJGwgPj0gJG51bWNvbW1pdHN9IHJldHVybgorICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCisgICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQorICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCisgICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KKyAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCisgICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCisgICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCisgICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KKyAgICBzZXQgbmV3dG9wICR3dG9wCisgICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKKwlpZiB7JHlib3QgPCAkd3RvcH0geworCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCisJfSBlbHNlIHsKKwkgICAgc2V0IG5ld3RvcCAkeXRvcAorCSAgICBpZiB7JG5ld3RvcCA+ICR3dG9wIC0gJGxpbmVzcGN9IHsKKwkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCisJICAgIH0KKwl9CisgICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKKwlpZiB7JHl0b3AgPiAkd2JvdH0geworCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCisJfSBlbHNlIHsKKwkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQorCSAgICBpZiB7JG5ld3RvcCA8ICR3dG9wICsgJGxpbmVzcGN9IHsKKwkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CisJaWYgeyRuZXd0b3AgPCAwfSB7CisJICAgIHNldCBuZXd0b3AgMAorCX0KKwlhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCisJZHJhd3Zpc2libGUKKyAgICB9CisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KKyAgICAkY2FudiBkZWxldGUgc2Vjc2VsCisgICAgc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCisJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCisgICAgJGNhbnYgbG93ZXIgJHQKKyAgICAkY2FudjIgZGVsZXRlIHNlY3NlbAorICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCisJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQorICAgICRjYW52MiBsb3dlciAkdAorICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCisgICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKKwkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjMgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCisgICAgJGNhbnYzIGxvd2VyICR0CisKKyAgICBpZiB7JGlzbmV3fSB7CisJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KKyAgICB9CisKKyAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCisKKyAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQorICAgIHNldCBjdXJyZW50aWQgJGlkCisgICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKKyAgICAkc2hhMWVudHJ5IGluc2VydCAwICRpZAorICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAorICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAorICAgIHJoaWdobGlnaHRfc2VsICRpZAorCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0CisgICAgc2V0IGxpbmtudW0gMAorICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKKyAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCisgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyA0XV0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICAkZGF0ZVxuIgorICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CisJJGN0ZXh0IGluc2VydCBlbmQgIlRhZ3M6IgorCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CisJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKKwl9CisJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgorICAgIH0KKworICAgIHNldCBoZWFkZXJzIHt9CisgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkbF0KKyAgICBpZiB7W2xsZW5ndGggJG9sZHNdID4gMX0geworCXNldCBucCAwCisJZm9yZWFjaCBwICRvbGRzIHsKKwkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKKwkJc2V0IHRhZyBtbWF4CisJICAgIH0gZWxzZSB7CisJCXNldCB0YWcgbSRucAorCSAgICB9CisJICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6ICIgJHRhZworCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXSB7fQorCSAgICBpbmNyIG5wCisJfQorICAgIH0gZWxzZSB7CisJZm9yZWFjaCBwICRvbGRzIHsKKwkgICAgYXBwZW5kIGhlYWRlcnMgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXSIKKwl9CisgICAgfQorCisgICAgZm9yZWFjaCBjIFtsaW5kZXggJGNoaWxkbGlzdCAkbF0geworCWFwcGVuZCBoZWFkZXJzICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY10iCisgICAgfQorCisgICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluaworICAgIGFwcGVuZHdpdGhsaW5rcyAkaGVhZGVycyB7fQorICAgIGlmIHskc2hvd25lYXJ0YWdzfSB7CisJaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHsKKwkgICAgZ2V0YWxsY29tbWl0cworCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiQnJhbmNoOiAiCisJJGN0ZXh0IG1hcmsgc2V0IGJyYW5jaCAiZW5kIC0xYyIKKwkkY3RleHQgbWFyayBncmF2aXR5IGJyYW5jaCBsZWZ0CisJaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRpZCldfSB7CisJICAgIGlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBoZWFkaWRzXSA+IDF9IHsKKwkJIyB0dXJuICJCcmFuY2giIGludG8gIkJyYW5jaGVzIgorCQkkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCisJICAgIH0KKwl9CisJJGN0ZXh0IGluc2VydCBlbmQgIlxuRm9sbG93czogIgorCSRjdGV4dCBtYXJrIHNldCBmb2xsb3dzICJlbmQgLTFjIgorCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm9sbG93cyBsZWZ0CisJaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0geworCSAgICBhcHBlbmRyZWZzIGZvbGxvd3MgW3RhZ2xpc3QgJGFuY190YWdzKCRpZCldIHRhZ2lkcworCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG5QcmVjZWRlczogIgorCSRjdGV4dCBtYXJrIHNldCBwcmVjZWRlcyAiZW5kIC0xYyIKKwkkY3RleHQgbWFyayBncmF2aXR5IHByZWNlZGVzIGxlZnQKKwlpZiB7W2luZm8gZXhpc3RzIGRlc2NfdGFncygkaWQpXX0geworCSAgICBhcHBlbmRyZWZzIHByZWNlZGVzIFt0YWdsaXN0ICRkZXNjX3RhZ3MoJGlkKV0gdGFnaWRzCisJfQorCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKyAgICB9CisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgorICAgIGFwcGVuZHdpdGhsaW5rcyBbbGluZGV4ICRpbmZvIDVdIHtjb21tZW50fQorCisgICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKKyAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQorCisgICAgaW5pdF9mbGlzdCAiQ29tbWVudHMiCisgICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHsKKwlnZXR0cmVlICRpZAorICAgIH0gZWxzZWlmIHtbbGxlbmd0aCAkb2xkc10gPD0gMX0geworCXN0YXJ0ZGlmZiAkaWQKKyAgICB9IGVsc2UgeworCW1lcmdlZGlmZiAkaWQgJGwKKyAgICB9Cit9CisKK3Byb2Mgc2VsZmlyc3RsaW5lIHt9IHsKKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2VsZWN0bGluZSAwIDEKK30KKworcHJvYyBzZWxsYXN0bGluZSB7fSB7CisgICAgZ2xvYmFsIG51bWNvbW1pdHMKKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2V0IGwgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCisgICAgc2VsZWN0bGluZSAkbCAxCit9CisKK3Byb2Mgc2VsbmV4dGxpbmUge2Rpcn0geworICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KKyAgICBzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJ9XQorICAgIHVubWFya21hdGNoZXMKKyAgICBzZWxlY3RsaW5lICRsIDEKK30KKworcHJvYyBzZWxuZXh0cGFnZSB7ZGlyfSB7CisgICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cworCisgICAgc2V0IGxwcCBbZXhwciB7KFt3aW5mbyBoZWlnaHQgJGNhbnZdIC0gMikgLyAkbGluZXNwY31dCisgICAgaWYgeyRscHAgPCAxfSB7CisJc2V0IGxwcCAxCisgICAgfQorICAgIGFsbGNhbnZzIHl2aWV3IHNjcm9sbCBbZXhwciB7JGRpciAqICRscHB9XSB1bml0cworICAgIGRyYXd2aXNpYmxlCisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCisgICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyICogJGxwcH1dCisgICAgaWYgeyRsIDwgMH0geworCXNldCBsIDAKKyAgICB9IGVsc2VpZiB7JGwgPj0gJG51bWNvbW1pdHN9IHsKKyAgICAgICAgc2V0IGwgW2V4cHIgJG51bWNvbW1pdHMgLSAxXQorICAgIH0KKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2VsZWN0bGluZSAkbCAxCit9CisKK3Byb2MgdW5zZWxlY3RsaW5lIHt9IHsKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZAorCisgICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KKyAgICBjYXRjaCB7dW5zZXQgY3VycmVudGlkfQorICAgIGFsbGNhbnZzIGRlbGV0ZSBzZWNzZWwKKyAgICByaGlnaGxpZ2h0X25vbmUKKyAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKK30KKworcHJvYyByZXNlbGVjdGxpbmUge30geworICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKKworICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0geworCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCisgICAgfQorfQorCitwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CisgICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4IGN1cnZpZXcKKworICAgIHNldCBlbHQgW2xpc3QgJGN1cnZpZXcgJGNtZF0KKyAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKKwkmJiBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXSA9PSAkZWx0fSB7CisJcmV0dXJuCisgICAgfQorCisgICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKKwlzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGVsdF0KKyAgICB9IGVsc2UgeworCWxhcHBlbmQgaGlzdG9yeSAkZWx0CisgICAgfQorICAgIGluY3IgaGlzdG9yeWluZGV4CisgICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CisJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIH0gZWxzZSB7CisJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgfQorICAgIC50Zi5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyBnb2RvIHtlbHR9IHsKKyAgICBnbG9iYWwgY3VydmlldworCisgICAgc2V0IHZpZXcgW2xpbmRleCAkZWx0IDBdCisgICAgc2V0IGNtZCBbbGluZGV4ICRlbHQgMV0KKyAgICBpZiB7JGN1cnZpZXcgIT0gJHZpZXd9IHsKKwlzaG93dmlldyAkdmlldworICAgIH0KKyAgICBldmFsICRjbWQKK30KKworcHJvYyBnb2JhY2sge30geworICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAorCisgICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CisJaW5jciBoaXN0b3J5aW5kZXggLTEKKwlnb2RvIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCisJLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICB9CisgICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0geworCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIH0KK30KKworcHJvYyBnb2Zvcncge30geworICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAorCisgICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKKwlzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KKwlpbmNyIGhpc3RvcnlpbmRleAorCWdvZG8gJGNtZAorCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICB9CisgICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CisJLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIH0KK30KKworcHJvYyBnZXR0cmVlIHtpZH0geworICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCBkaWZmaWRzIGRpZmZtZXJnZWlkIHRyZWVwZW5kaW5nCisKKyAgICBzZXQgZGlmZmlkcyAkaWQKKyAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWZpbGVsaXN0KCRpZCldfSB7CisJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CisJICAgIGlmIHtbY2F0Y2gge3NldCBndGYgW29wZW4gW2NvbmNhdCB8IGdpdCBscy10cmVlIC1yICRpZF0gcl19XX0geworCQlyZXR1cm4KKwkgICAgfQorCSAgICBzZXQgdHJlZXBlbmRpbmcgJGlkCisJICAgIHNldCB0cmVlZmlsZWxpc3QoJGlkKSB7fQorCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CisJICAgIGZjb25maWd1cmUgJGd0ZiAtYmxvY2tpbmcgMAorCSAgICBmaWxlZXZlbnQgJGd0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlbGluZSAkZ3RmICRpZF0KKwl9CisgICAgfSBlbHNlIHsKKwlzZXRmaWxlbGlzdCAkaWQKKyAgICB9Cit9CisKK3Byb2MgZ2V0dHJlZWxpbmUge2d0ZiBpZH0geworICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCB0cmVlcGVuZGluZyBjbWl0bW9kZSBkaWZmaWRzCisKKyAgICB3aGlsZSB7W2dldHMgJGd0ZiBsaW5lXSA+PSAwfSB7CisJaWYge1tsaW5kZXggJGxpbmUgMV0gbmUgImJsb2IifSBjb250aW51ZQorCXNldCBzaGExIFtsaW5kZXggJGxpbmUgMl0KKwlzZXQgZm5hbWUgW2xpbmRleCAkbGluZSAzXQorCWxhcHBlbmQgdHJlZWZpbGVsaXN0KCRpZCkgJGZuYW1lCisJbGFwcGVuZCB0cmVlaWRsaXN0KCRpZCkgJHNoYTEKKyAgICB9CisgICAgaWYgeyFbZW9mICRndGZdfSByZXR1cm4KKyAgICBjbG9zZSAkZ3RmCisgICAgdW5zZXQgdHJlZXBlbmRpbmcKKyAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0geworCWlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0geworCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKKwl9CisgICAgfSBlbHNlaWYgeyRpZCBuZSAkZGlmZmlkc30geworCWdldHRyZWUgJGRpZmZpZHMKKyAgICB9IGVsc2UgeworCXNldGZpbGVsaXN0ICRpZAorICAgIH0KK30KKworcHJvYyBzaG93ZmlsZSB7Zn0geworICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCBkaWZmaWRzCisgICAgZ2xvYmFsIGN0ZXh0IGNvbW1lbnRlbmQKKworICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWZpbGVsaXN0KCRkaWZmaWRzKSAkZl0KKyAgICBpZiB7JGkgPCAwfSB7CisJcHV0cyAib29wcywgJGYgbm90IGluIGxpc3QgZm9yIGlkICRkaWZmaWRzIgorCXJldHVybgorICAgIH0KKyAgICBzZXQgYmxvYiBbbGluZGV4ICR0cmVlaWRsaXN0KCRkaWZmaWRzKSAkaV0KKyAgICBpZiB7W2NhdGNoIHtzZXQgYmYgW29wZW4gW2NvbmNhdCB8IGdpdCBjYXQtZmlsZSBibG9iICRibG9iXSByXX0gZXJyXX0geworCXB1dHMgIm9vcHMsIGVycm9yIHJlYWRpbmcgYmxvYiAkYmxvYjogJGVyciIKKwlyZXR1cm4KKyAgICB9CisgICAgZmNvbmZpZ3VyZSAkYmYgLWJsb2NraW5nIDAKKyAgICBmaWxlZXZlbnQgJGJmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JsaW5lICRiZiAkZGlmZmlkc10KKyAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBub3JtYWwKKyAgICBjbGVhcl9jdGV4dCAkY29tbWVudGVuZAorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGZcbiIgZmlsZXNlcAorICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCisgICAgJGN0ZXh0IHl2aWV3ICRjb21tZW50ZW5kCit9CisKK3Byb2MgZ2V0YmxvYmxpbmUge2JmIGlkfSB7CisgICAgZ2xvYmFsIGRpZmZpZHMgY21pdG1vZGUgY3RleHQKKworICAgIGlmIHskaWQgbmUgJGRpZmZpZHMgfHwgJGNtaXRtb2RlIG5lICJ0cmVlIn0geworCWNhdGNoIHtjbG9zZSAkYmZ9CisJcmV0dXJuCisgICAgfQorICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAorICAgIHdoaWxlIHtbZ2V0cyAkYmYgbGluZV0gPj0gMH0geworCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgorICAgIH0KKyAgICBpZiB7W2VvZiAkYmZdfSB7CisJIyBkZWxldGUgbGFzdCBuZXdsaW5lCisJJGN0ZXh0IGRlbGV0ZSAiZW5kIC0gMmMiICJlbmQgLSAxYyIKKwljbG9zZSAkYmYKKyAgICB9CisgICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyBtZXJnZWRpZmYge2lkIGx9IHsKKyAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZm9wdHMgbWRpZmZmZAorICAgIGdsb2JhbCBkaWZmaWRzCisgICAgZ2xvYmFsIHBhcmVudGxpc3QKKworICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKKyAgICBzZXQgZGlmZmlkcyAkaWQKKyAgICAjIHRoaXMgZG9lc24ndCBzZWVtIHRvIGFjdHVhbGx5IGFmZmVjdCBhbnl0aGluZy4uLgorICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCisgICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtLWNjICRpZF0KKyAgICBpZiB7W2NhdGNoIHtzZXQgbWRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKKwllcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBtZXJnZSBkaWZmczogJGVyciIKKwlyZXR1cm4KKyAgICB9CisgICAgZmNvbmZpZ3VyZSAkbWRmIC1ibG9ja2luZyAwCisgICAgc2V0IG1kaWZmZmQoJGlkKSAkbWRmCisgICAgc2V0IG5wIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdXQorICAgIGZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQorICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KK30KKworcHJvYyBnZXRtZXJnZWRpZmZsaW5lIHttZGYgaWQgbnB9IHsKKyAgICBnbG9iYWwgZGlmZm1lcmdlaWQgY3RleHQgY2ZsaXN0IG5leHR1cGRhdGUgbWVyZ2VtYXgKKyAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBtZGlmZmZkCisKKyAgICBzZXQgbiBbZ2V0cyAkbWRmIGxpbmVdCisgICAgaWYgeyRuIDwgMH0geworCWlmIHtbZW9mICRtZGZdfSB7CisJICAgIGNsb3NlICRtZGYKKwl9CisJcmV0dXJuCisgICAgfQorICAgIGlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSB8fCAkaWQgIT0gJGRpZmZtZXJnZWlkCisJfHwgJG1kZiAhPSAkbWRpZmZmZCgkaWQpfSB7CisJcmV0dXJuCisgICAgfQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1jYyAoLiopfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKKwkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQorCWxhcHBlbmQgZGlmZmZpbGVzdGFydCAkaGVyZQorCWFkZF9mbGlzdCBbbGlzdCAkZm5hbWVdCisJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCisJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQorCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRmbmFtZSAkcGFkXG4iIGZpbGVzZXAKKyAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAfSAkbGluZV19IHsKKwkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAorICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGxpbmVdIHx8IFtyZWdleHAge15pbmRleH0gJGxpbmVdfSB7CisJIyBkbyBub3RoaW5nCisgICAgfSBlbHNlIHsKKwkjIHBhcnNlIHRoZSBwcmVmaXggLSBvbmUgJyAnLCAnLScgb3IgJysnIGZvciBlYWNoIHBhcmVudAorCXNldCBzcGFjZXMge30KKwlzZXQgbWludXNlcyB7fQorCXNldCBwbHVzZXMge30KKwlzZXQgaXNiYWQgMAorCWZvciB7c2V0IGogMH0geyRqIDwgJG5wfSB7aW5jciBqfSB7CisJICAgIHNldCBjIFtzdHJpbmcgcmFuZ2UgJGxpbmUgJGogJGpdCisJICAgIGlmIHskYyA9PSAiICJ9IHsKKwkJbGFwcGVuZCBzcGFjZXMgJGoKKwkgICAgfSBlbHNlaWYgeyRjID09ICItIn0geworCQlsYXBwZW5kIG1pbnVzZXMgJGoKKwkgICAgfSBlbHNlaWYgeyRjID09ICIrIn0geworCQlsYXBwZW5kIHBsdXNlcyAkagorCSAgICB9IGVsc2UgeworCQlzZXQgaXNiYWQgMQorCQlicmVhaworCSAgICB9CisJfQorCXNldCB0YWdzIHt9CisJc2V0IG51bSB7fQorCWlmIHshJGlzYmFkICYmICRtaW51c2VzIG5lIHt9ICYmICRwbHVzZXMgZXEge319IHsKKwkgICAgIyBsaW5lIGRvZXNuJ3QgYXBwZWFyIGluIHJlc3VsdCwgcGFyZW50cyBpbiAkbWludXNlcyBoYXZlIHRoZSBsaW5lCisJICAgIHNldCBudW0gW2xpbmRleCAkbWludXNlcyAwXQorCX0gZWxzZWlmIHshJGlzYmFkICYmICRwbHVzZXMgbmUge30gJiYgJG1pbnVzZXMgZXEge319IHsKKwkgICAgIyBsaW5lIGFwcGVhcnMgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRwbHVzZXMgZG9uJ3QgaGF2ZSB0aGUgbGluZQorCSAgICBsYXBwZW5kIHRhZ3MgbXJlc3VsdAorCSAgICBzZXQgbnVtIFtsaW5kZXggJHNwYWNlcyAwXQorCX0KKwlpZiB7JG51bSBuZSB7fX0geworCSAgICBpZiB7JG51bSA+PSAkbWVyZ2VtYXh9IHsKKwkJc2V0IG51bSAibWF4IgorCSAgICB9CisJICAgIGxhcHBlbmQgdGFncyBtJG51bQorCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgJHRhZ3MKKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKKwlpbmNyIG5leHR1cGRhdGUgMTAwCisJZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUge30KKwl1cGRhdGUKKwlmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZGYgJGlkICRucF0KKyAgICB9Cit9CisKK3Byb2Mgc3RhcnRkaWZmIHtpZHN9IHsKKyAgICBnbG9iYWwgdHJlZWRpZmZzIGRpZmZpZHMgdHJlZXBlbmRpbmcgZGlmZm1lcmdlaWQKKworICAgIHNldCBkaWZmaWRzICRpZHMKKyAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0geworCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0geworCSAgICBnZXR0cmVlZGlmZnMgJGlkcworCX0KKyAgICB9IGVsc2UgeworCWFkZHRvY2ZsaXN0ICRpZHMKKyAgICB9Cit9CisKK3Byb2MgYWRkdG9jZmxpc3Qge2lkc30geworICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CisgICAgYWRkX2ZsaXN0ICR0cmVlZGlmZnMoJGlkcykKKyAgICBnZXRibG9iZGlmZnMgJGlkcworfQorCitwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CisgICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVwZW5kaW5nCisgICAgc2V0IHRyZWVwZW5kaW5nICRpZHMKKyAgICBzZXQgdHJlZWRpZmYge30KKyAgICBpZiB7W2NhdGNoIFwKKwkge3NldCBnZHRmIFtvcGVuIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yICRpZHNdIHJdfSBcCisJXX0gcmV0dXJuCisgICAgZmNvbmZpZ3VyZSAkZ2R0ZiAtYmxvY2tpbmcgMAorICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KK30KKworcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CisgICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVkaWZmcyB0cmVlcGVuZGluZyBkaWZmaWRzIGRpZmZtZXJnZWlkCisgICAgZ2xvYmFsIGNtaXRtb2RlCisKKyAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQorICAgIGlmIHskbiA8IDB9IHsKKwlpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KKwljbG9zZSAkZ2R0ZgorCXNldCB0cmVlZGlmZnMoJGlkcykgJHRyZWVkaWZmCisJdW5zZXQgdHJlZXBlbmRpbmcKKwlpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0geworCSAgICBnZXR0cmVlICRkaWZmaWRzCisJfSBlbHNlaWYgeyRpZHMgIT0gJGRpZmZpZHN9IHsKKwkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CisJCWdldHRyZWVkaWZmcyAkZGlmZmlkcworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgYWRkdG9jZmxpc3QgJGlkcworCX0KKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQorICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKK30KKworcHJvYyBnZXRibG9iZGlmZnMge2lkc30geworICAgIGdsb2JhbCBkaWZmb3B0cyBibG9iZGlmZmZkIGRpZmZpZHMgZW52IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKKyAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCisKKyAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cworICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkc10KKyAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKKwlwdXRzICJlcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgorCXJldHVybgorICAgIH0KKyAgICBzZXQgZGlmZmluaGRyIDAKKyAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKKyAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCisgICAgc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKKyAgICBzZXQgY3VydGFnc3RhcnQgMC4wCisgICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCisgICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQorfQorCitwcm9jIHNldGlubGlzdCB7dmFyIGkgdmFsfSB7CisgICAgZ2xvYmFsICR2YXIKKworICAgIHdoaWxlIHtbbGxlbmd0aCBbc2V0ICR2YXJdXSA8ICRpfSB7CisJbGFwcGVuZCAkdmFyIHt9CisgICAgfQorICAgIGlmIHtbbGxlbmd0aCBbc2V0ICR2YXJdXSA9PSAkaX0geworCWxhcHBlbmQgJHZhciAkdmFsCisgICAgfSBlbHNlIHsKKwlsc2V0ICR2YXIgJGkgJHZhbAorICAgIH0KK30KKworcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKKyAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKKyAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CisgICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcworCisgICAgc2V0IG4gW2dldHMgJGJkZiBsaW5lXQorICAgIGlmIHskbiA8IDB9IHsKKwlpZiB7W2VvZiAkYmRmXX0geworCSAgICBjbG9zZSAkYmRmCisJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKKwkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAorCSAgICB9CisJfQorCXJldHVybgorICAgIH0KKyAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CisJcmV0dXJuCisgICAgfQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKKwkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAorCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KKwlzZXQgY3VydGFnc3RhcnQgJGhlcmUKKwlzZXQgaGVhZGVyICRuZXduYW1lCisJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJGZuYW1lXQorCWlmIHskaSA+PSAwfSB7CisJICAgIHNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCisJfQorCWlmIHskbmV3bmFtZSBuZSAkZm5hbWV9IHsKKwkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJG5ld25hbWVdCisJICAgIGlmIHskaSA+PSAwfSB7CisJCXNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCisJICAgIH0KKwl9CisJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgorCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCisJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQorCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAorCXNldCBkaWZmaW5oZHIgMQorICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIi0tLSJdID09IDB9IHsKKwkjIGRvIG5vdGhpbmcKKyAgICB9IGVsc2VpZiB7JGRpZmZpbmhkciAmJiBbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICIrKysiXSA9PSAwfSB7CisJc2V0IGRpZmZpbmhkciAwCisgICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKKwkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CisJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKKwlzZXQgZGlmZmluaGRyIDAKKyAgICB9IGVsc2UgeworCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQorCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CisJICAgIHNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCisJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZworCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCisJfSBlbHNlaWYgeyRkaWZmaW5oZHIgfHwgJHggPT0gIlxcIn0geworCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKKwl9IGVsc2UgeworCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQorCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0geworCQkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKKwkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KKwkJc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKKwkgICAgfQorCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAorCX0KKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKKwlpbmNyIG5leHR1cGRhdGUgMTAwCisJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KKwl1cGRhdGUKKwlmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgorICAgIH0KK30KKworcHJvYyBjaGFuZ2VkaWZmZGlzcCB7fSB7CisgICAgZ2xvYmFsIGN0ZXh0IGRpZmZlbGlkZQorCisgICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1lbGlkZSBbbGluZGV4ICRkaWZmZWxpZGUgMF0KKyAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWVsaWRlIFtsaW5kZXggJGRpZmZlbGlkZSAxXQorfQorCitwcm9jIHByZXZmaWxlIHt9IHsKKyAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAorICAgIHNldCBwcmV2IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgMF0KKyAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCisgICAgZm9yZWFjaCBsb2MgJGRpZmZmaWxlc3RhcnQgeworCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGxvYyA+PSAkaGVyZV19IHsKKwkgICAgJGN0ZXh0IHl2aWV3ICRwcmV2CisJICAgIHJldHVybgorCX0KKwlzZXQgcHJldiAkbG9jCisgICAgfQorICAgICRjdGV4dCB5dmlldyAkcHJldgorfQorCitwcm9jIG5leHRmaWxlIHt9IHsKKyAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAorICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KKyAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CisJaWYge1skY3RleHQgY29tcGFyZSAkbG9jID4gJGhlcmVdfSB7CisJICAgICRjdGV4dCB5dmlldyAkbG9jCisJICAgIHJldHVybgorCX0KKyAgICB9Cit9CisKK3Byb2MgY2xlYXJfY3RleHQge3tmaXJzdCAxLjB9fSB7CisgICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CisKKyAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCAkZmlyc3QgLl0gMF0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya3RvcF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya3RvcC4wXX0geworCXNldCBzbWFya3RvcCAkbAorICAgIH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya2JvdF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya2JvdC4wXX0geworCXNldCBzbWFya2JvdCAkbAorICAgIH0KKyAgICAkY3RleHQgZGVsZXRlICRmaXJzdCBlbmQKK30KKworcHJvYyBpbmNyc2VhcmNoIHtuYW1lIGl4IG9wfSB7CisgICAgZ2xvYmFsIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCisKKyAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCisgICAgaWYge1tjYXRjaCB7JGN0ZXh0IGluZGV4IGFuY2hvcn1dfSB7CisJIyBubyBhbmNob3Igc2V0LCB1c2Ugc3RhcnQgb2Ygc2VsZWN0aW9uLCBvciBvZiB2aXNpYmxlIGFyZWEKKwlzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCisJaWYgeyRzZWwgbmUge319IHsKKwkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBbbGluZGV4ICRzZWwgMF0KKwl9IGVsc2VpZiB7JHNlYXJjaGRpcm4gZXEgIi1mb3J3YXJkcyJ9IHsKKwkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCwwCisJfSBlbHNlIHsKKwkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KKwl9CisgICAgfQorICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CisJc2V0IGhlcmUgWyRjdGV4dCBzZWFyY2ggJHNlYXJjaGRpcm4gLS0gJHNlYXJjaHN0cmluZyBhbmNob3JdCisJaWYgeyRoZXJlIG5lIHt9fSB7CisJICAgICRjdGV4dCBzZWUgJGhlcmUKKwl9CisJc2VhcmNobWFya3Zpc2libGUgMQorICAgIH0KK30KKworcHJvYyBkb3NlYXJjaCB7fSB7CisgICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KKworICAgIGZvY3VzICRzc3RyaW5nCisgICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKKyAgICBzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKKyAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0geworCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KKwlpZiB7JHNlbCBuZSB7fX0geworCSAgICBzZXQgc3RhcnQgIltsaW5kZXggJHNlbCAwXSArIDFjIgorCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0geworCSAgICBzZXQgc3RhcnQgIkAwLDAiCisJfQorCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KKwkkY3RleHQgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAorCWlmIHskbWF0Y2ggZXEge319IHsKKwkgICAgYmVsbAorCSAgICByZXR1cm4KKwl9CisJJGN0ZXh0IHNlZSAkbWF0Y2gKKwlzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKKwkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCisJJGN0ZXh0IG1hcmsgdW5zZXQgYW5jaG9yCisgICAgfQorfQorCitwcm9jIGRvc2VhcmNoYmFjayB7fSB7CisgICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KKworICAgIGZvY3VzICRzc3RyaW5nCisgICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKKyAgICBzZXQgc2VhcmNoZGlybiAtYmFja3dhcmRzCisgICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKKwlzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCisJaWYgeyRzZWwgbmUge319IHsKKwkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJHNlbCAwXQorCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0geworCSAgICBzZXQgc3RhcnQgQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdCisJfQorCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtYmFja3dhcmRzIC1jb3VudCBtbCAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KKwkkY3RleHQgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAorCWlmIHskbWF0Y2ggZXEge319IHsKKwkgICAgYmVsbAorCSAgICByZXR1cm4KKwl9CisJJGN0ZXh0IHNlZSAkbWF0Y2gKKwlzZXQgbWVuZCAiJG1hdGNoICsgJG1sIGMiCisJJGN0ZXh0IHRhZyBhZGQgc2VsICRtYXRjaCAkbWVuZAorCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgorICAgIH0KK30KKworcHJvYyBzZWFyY2htYXJrIHtmaXJzdCBsYXN0fSB7CisgICAgZ2xvYmFsIGN0ZXh0IHNlYXJjaHN0cmluZworCisgICAgc2V0IG1lbmQgJGZpcnN0LjAKKyAgICB3aGlsZSB7MX0geworCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRtZW5kICRsYXN0LmVuZF0KKwlpZiB7JG1hdGNoIGVxIHt9fSBicmVhaworCXNldCBtZW5kICIkbWF0Y2ggKyAkbWxlbiBjIgorCSRjdGV4dCB0YWcgYWRkIGZvdW5kICRtYXRjaCAkbWVuZAorICAgIH0KK30KKworcHJvYyBzZWFyY2htYXJrdmlzaWJsZSB7ZG9hbGx9IHsKKyAgICBnbG9iYWwgY3RleHQgc21hcmt0b3Agc21hcmtib3QKKworICAgIHNldCB0b3BsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsMF0gLl0gMF0KKyAgICBzZXQgYm90bGluZSBbbGluZGV4IFtzcGxpdCBbJGN0ZXh0IGluZGV4IEAwLFt3aW5mbyBoZWlnaHQgJGN0ZXh0XV0gLl0gMF0KKyAgICBpZiB7JGRvYWxsIHx8ICRib3RsaW5lIDwgJHNtYXJrdG9wIHx8ICR0b3BsaW5lID4gJHNtYXJrYm90fSB7CisJIyBubyBvdmVybGFwIHdpdGggcHJldmlvdXMKKwlzZWFyY2htYXJrICR0b3BsaW5lICRib3RsaW5lCisJc2V0IHNtYXJrdG9wICR0b3BsaW5lCisJc2V0IHNtYXJrYm90ICRib3RsaW5lCisgICAgfSBlbHNlIHsKKwlpZiB7JHRvcGxpbmUgPCAkc21hcmt0b3B9IHsKKwkgICAgc2VhcmNobWFyayAkdG9wbGluZSBbZXhwciB7JHNtYXJrdG9wLTF9XQorCSAgICBzZXQgc21hcmt0b3AgJHRvcGxpbmUKKwl9CisJaWYgeyRib3RsaW5lID4gJHNtYXJrYm90fSB7CisJICAgIHNlYXJjaG1hcmsgW2V4cHIgeyRzbWFya2JvdCsxfV0gJGJvdGxpbmUKKwkgICAgc2V0IHNtYXJrYm90ICRib3RsaW5lCisJfQorICAgIH0KK30KKworcHJvYyBzY3JvbGx0ZXh0IHtmMCBmMX0geworICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcKKworICAgIC5ibGVmdC5zYiBzZXQgJGYwICRmMQorICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CisJc2VhcmNobWFya3Zpc2libGUgMAorICAgIH0KK30KKworcHJvYyBzZXRjb29yZHMge30geworICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAorICAgIGdsb2JhbCB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCisKKyAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQorICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KKyAgICBzZXQgY2FudnkwIFtleHByIHtpbnQoMyArIDAuNSAqICRsaW5lc3BjKX1dCisgICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQorICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQorICAgIHNldCB4c3BjMSgwKSAkbGluZXNwYworICAgIHNldCB4c3BjMiAkbGluZXNwYworfQorCitwcm9jIHJlZGlzcGxheSB7fSB7CisgICAgZ2xvYmFsIGNhbnYKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCisKKyAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisgICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgorICAgIHNldCBzcGFuIFskY2FudiB5dmlld10KKyAgICBjbGVhcl9kaXNwbGF5CisgICAgc2V0Y2FudnNjcm9sbAorICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCisgICAgZHJhd3Zpc2libGUKKyAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKKwlzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAorCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCisgICAgfQorfQorCitwcm9jIGluY3Jmb250IHtpbmN9IHsKKyAgICBnbG9iYWwgbWFpbmZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQorICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KKyAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQorICAgIHNldGNvb3JkcworICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAorICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCisgICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKKwkkZSBjb25mIC1mb250ICRtYWluZm9udAorICAgIH0KKyAgICBpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0geworCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKKyAgICB9CisgICAgcmVkaXNwbGF5Cit9CisKK3Byb2MgY2xlYXJzaGExIHt9IHsKKyAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKKyAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7CisJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKKyAgICB9Cit9CisKK3Byb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKKyAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAorICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQorCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0geworCXNldCBzdGF0ZSBkaXNhYmxlZAorICAgIH0gZWxzZSB7CisJc2V0IHN0YXRlIG5vcm1hbAorICAgIH0KKyAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgorICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKKwkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKKyAgICB9IGVsc2UgeworCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgorICAgIH0KK30KKworcHJvYyBnb3RvY29tbWl0IHt9IHsKKyAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgY29tbWl0cm93IHRhZ2lkcyBoZWFkaWRzCisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIGN1cnZpZXcKKworICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQorCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCisgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0geworCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQorICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkc2hhMXN0cmluZyldfSB7CisJc2V0IGlkICRoZWFkaWRzKCRzaGExc3RyaW5nKQorICAgIH0gZWxzZSB7CisJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KKwlpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0geworCSAgICBzZXQgbWF0Y2hlcyB7fQorCSAgICBmb3JlYWNoIGkgJGRpc3BsYXlvcmRlciB7CisJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGldfSB7CisJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGkKKwkJfQorCSAgICB9CisJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0geworCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0geworCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKKwkJICAgIHJldHVybgorCQl9CisJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CisJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQorCXJldHVybgorICAgIH0KKyAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0geworCXNldCB0eXBlICJTSEExIGlkIgorICAgIH0gZWxzZSB7CisJc2V0IHR5cGUgIlRhZy9IZWFkIgorICAgIH0KKyAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgorfQorCitwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisgICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KKyAgICBzZXQgaG92ZXJ4ICR4CisgICAgc2V0IGhvdmVyeSAkeQorICAgIHNldCBob3ZlcmlkICRpZAorICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKKwlhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKyAgICB9CisgICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCisgICAgJGNhbnYgZGVsZXRlIGhvdmVyCit9CisKK3Byb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0geworCXNldCBob3ZlcnggJHgKKwlzZXQgaG92ZXJ5ICR5CisJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0geworCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKwl9CisJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCisgICAgfQorfQorCitwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKKyAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKKworICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CisJJGNhbnYgZGVsZXRlIGhvdmVyCisJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0geworCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKwkgICAgdW5zZXQgaG92ZXJ0aW1lcgorCX0KKwl1bnNldCBob3ZlcmlkCisgICAgfQorfQorCitwcm9jIGxpbmVob3ZlciB7fSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisgICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCisgICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKKworICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCisgICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQorICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCisgICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQorICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KKyAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KKyAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQorICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCisJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQorICAgICRjYW52IHJhaXNlICR0CisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgXAorCSAgICAgICAtZm9udCAkbWFpbmZvbnRdCisgICAgJGNhbnYgcmFpc2UgJHQKK30KKworcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0geworICAgIGdsb2JhbCBsdGhpY2tuZXNzCisKKyAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQorICAgIHNldCB0aHJlc2ggW2V4cHIgezIgKiAkbHRoaWNrbmVzcyArIDZ9XQorICAgIHNldCBuIFtleHByIHtbbGxlbmd0aCAkcmFuZ2VzXSAtIDF9XQorICAgIGZvciB7c2V0IGkgMX0geyRpIDwgJG59IHtpbmNyIGl9IHsKKwlzZXQgcm93IFtsaW5kZXggJHJhbmdlcyAkaV0KKwlpZiB7YWJzKFt5YyAkcm93XSAtICR5KSA8ICR0aHJlc2h9IHsKKwkgICAgcmV0dXJuICRpCisJfQorICAgIH0KKyAgICByZXR1cm4ge30KK30KKworcHJvYyBhcnJvd2p1bXAge2lkIG4geX0geworICAgIGdsb2JhbCBjYW52CisKKyAgICAjIDEgPC0+IDIsIDMgPC0+IDQsIGV0Yy4uLgorICAgIHNldCBuIFtleHByIHsoKCRuIC0gMSkgXiAxKSArIDF9XQorICAgIHNldCByb3cgW2xpbmRleCBbcm93cmFuZ2VzICRpZF0gJG5dCisgICAgc2V0IHl0IFt5YyAkcm93XQorICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCisgICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQorICAgIHNldCB5c3BhbiBbZXhwciB7W2xpbmRleCAkdmlldyAxXSAtIFtsaW5kZXggJHZpZXcgMF19XQorICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KKyAgICBpZiB7JHlmcmFjIDwgMH0geworCXNldCB5ZnJhYyAwCisgICAgfQorICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWZyYWMKK30KKworcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30geworICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNhbnYgdGhpY2tlcmxpbmUgY3VydmlldworCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KKyAgICB1bm1hcmttYXRjaGVzCisgICAgdW5zZWxlY3RsaW5lCisgICAgbm9ybWFsbGluZQorICAgICRjYW52IGRlbGV0ZSBob3ZlcgorICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAorICAgIHNldCB0aGlja2VybGluZSAkaWQKKyAgICBkcmF3bGluZXMgJGlkCisgICAgaWYgeyRpc25ld30geworCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKwlpZiB7JHltYXggZXEge319IHJldHVybgorCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KKwlzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCisgICAgfQorICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCisgICAgaWYgeyRkaXJuIG5lIHt9fSB7CisJYXJyb3dqdW1wICRpZCAkZGlybiAkeQorCXJldHVybgorICAgIH0KKworICAgIGlmIHskaXNuZXd9IHsKKwlhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQorICAgIH0KKyAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0CisgICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKKyAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQorICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDpcdCIKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KKyAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQorICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCisgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKKyAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQorICAgIGlmIHska2lkcyBuZSB7fX0geworCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKKwlzZXQgaSAwCisJZm9yZWFjaCBjaGlsZCAka2lkcyB7CisJICAgIGluY3IgaQorCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRjaGlsZCldICYmICFbZ2V0Y29tbWl0ICRjaGlsZF19IGNvbnRpbnVlCisJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCisJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KKwkgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmskaSA8MT4gW2xpc3Qgc2VsYnlpZCAkY2hpbGRdCisJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgorCSAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQorCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgorCX0KKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgaW5pdF9mbGlzdCB7fQorfQorCitwcm9jIG5vcm1hbGxpbmUge30geworICAgIGdsb2JhbCB0aGlja2VybGluZQorICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdfSB7CisJc2V0IGlkICR0aGlja2VybGluZQorCXVuc2V0IHRoaWNrZXJsaW5lCisJZHJhd2xpbmVzICRpZAorICAgIH0KK30KKworcHJvYyBzZWxieWlkIHtpZH0geworICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldworICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CisJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQorICAgIH0KK30KKworcHJvYyBtc3RpbWUge30geworICAgIGdsb2JhbCBzdGFydG1zdGltZQorICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0geworCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCisgICAgfQorICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KK30KKworcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKKyAgICBnbG9iYWwgcm93Y3R4bWVudSBjb21taXRyb3cgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZCBjdXJ2aWV3CisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdCisJfHwgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKKwlzZXQgc3RhdGUgZGlzYWJsZWQKKyAgICB9IGVsc2UgeworCXNldCBzdGF0ZSBub3JtYWwKKyAgICB9CisgICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgdGhpcyoiIC1zdGF0ZSAkc3RhdGUKKyAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAiRGlmZiBzZWxlY3RlZCoiIC1zdGF0ZSAkc3RhdGUKKyAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAiTWFrZSBwYXRjaCIgLXN0YXRlICRzdGF0ZQorICAgIHNldCByb3dtZW51aWQgJGlkCisgICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKK30KKworcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKKyAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBkaXNwbGF5b3JkZXIKKworICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIGlmIHskZGlybn0geworCXNldCBvbGRpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KKwlzZXQgbmV3aWQgJHJvd21lbnVpZAorICAgIH0gZWxzZSB7CisJc2V0IG9sZGlkICRyb3dtZW51aWQKKwlzZXQgbmV3aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCisgICAgfQorICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KKyAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAorfQorCitwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKKyAgICBnbG9iYWwgY3RleHQKKyAgICBnbG9iYWwgY29tbWl0aW5mbworCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0CisgICAgaW5pdF9mbGlzdCAiVG9wIgorICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKKyAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQorICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KKyAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgorICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKKyAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCisgICAgc3RhcnRkaWZmIFtsaXN0ICRvbGRpZCAkbmV3aWRdCit9CisKK3Byb2MgbWtwYXRjaCB7fSB7CisgICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCisgICAgc2V0IG9sZGlkICRjdXJyZW50aWQKKyAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KKyAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAorICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQorICAgIHNldCB0b3AgLnBhdGNoCisgICAgc2V0IHBhdGNodG9wICR0b3AKKyAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQorICAgIHRvcGxldmVsICR0b3AKKyAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKKyAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAorICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCisgICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKKyAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CisgICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKKyAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCisgICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdworICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKKyAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCisgICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CisgICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAorICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCisgICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CisgICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKKyAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKKyAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAorICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCisgICAgaW5jciBwYXRjaG51bQorICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KKyAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCisgICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgZm9jdXMgJHRvcC5mbmFtZQorfQorCitwcm9jIG1rcGF0Y2hyZXYge30geworICAgIGdsb2JhbCBwYXRjaHRvcAorCisgICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQorICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQorICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCisgICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQorICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCisJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0geworCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKKwkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCisJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CisJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CisgICAgfQorfQorCitwcm9jIG1rcGF0Y2hnbyB7fSB7CisgICAgZ2xvYmFsIHBhdGNodG9wCisKKyAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCisgICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KKyAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCisgICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CisJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgorICAgIH0KKyAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CisgICAgdW5zZXQgcGF0Y2h0b3AKK30KKworcHJvYyBta3BhdGNoY2FuIHt9IHsKKyAgICBnbG9iYWwgcGF0Y2h0b3AKKworICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KKyAgICB1bnNldCBwYXRjaHRvcAorfQorCitwcm9jIG1rdGFnIHt9IHsKKyAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KKworICAgIHNldCB0b3AgLm1ha2V0YWcKKyAgICBzZXQgbWt0YWd0b3AgJHRvcAorICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CisgICAgdG9wbGV2ZWwgJHRvcAorICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCisgICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCisgICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAorICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CisgICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQorICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CisgICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCisgICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCisgICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbworICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCisgICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgZm9jdXMgJHRvcC50YWcKK30KKworcHJvYyBkb21rdGFnIHt9IHsKKyAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKKworICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQorICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQorICAgIGlmIHskdGFnID09IHt9fSB7CisJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKKwlyZXR1cm4KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CisJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKKwlyZXR1cm4KKyAgICB9CisgICAgaWYge1tjYXRjaCB7CisJc2V0IGRpciBbZ2l0ZGlyXQorCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KKwlzZXQgZiBbb3BlbiAkZm5hbWUgd10KKwlwdXRzICRmICRpZAorCWNsb3NlICRmCisgICAgfSBlcnJdfSB7CisJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAorICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZworICAgIHJlZHJhd3RhZ3MgJGlkCisgICAgYWRkZWR0YWcgJGlkCit9CisKK3Byb2MgcmVkcmF3dGFncyB7aWR9IHsKKyAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKKyAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXgKKworICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gcmV0dXJuCisgICAgZHJhd2NtaXRyb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCisgICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKKyAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQorICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQorICAgIHNldCB0ZXh0IFskY2FudiBpdGVtY2dldCAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAtdGV4dF0KKyAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XX1dCisgICAgaWYgeyR4ciA+ICRjYW52eG1heH0geworCXNldCBjYW52eG1heCAkeHIKKwlzZXRjYW52c2Nyb2xsCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQorCSYmICRzZWxlY3RlZGxpbmUgPT0gJGNvbW1pdHJvdygkY3VydmlldywkaWQpfSB7CisJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKKyAgICB9Cit9CisKK3Byb2MgbWt0YWdjYW4ge30geworICAgIGdsb2JhbCBta3RhZ3RvcAorCisgICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQorICAgIHVuc2V0IG1rdGFndG9wCit9CisKK3Byb2MgbWt0YWdnbyB7fSB7CisgICAgZG9ta3RhZworICAgIG1rdGFnY2FuCit9CisKK3Byb2Mgd3JpdGVjb21taXQge30geworICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAorCisgICAgc2V0IHRvcCAud3JpdGVjb21taXQKKyAgICBzZXQgd3Jjb210b3AgJHRvcAorICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CisgICAgdG9wbGV2ZWwgJHRvcAorICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgorICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCisgICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgorICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKKyAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdworICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KKyAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdworICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCisgICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKKyAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKKyAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAorICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQorICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCisgICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KKyAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKKyAgICBmb2N1cyAkdG9wLmZuYW1lCit9CisKK3Byb2Mgd3Jjb21nbyB7fSB7CisgICAgZ2xvYmFsIHdyY29tdG9wCisKKyAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KKyAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCisgICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQorICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKKwllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCisgICAgfQorICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KKyAgICB1bnNldCB3cmNvbXRvcAorfQorCitwcm9jIHdyY29tY2FuIHt9IHsKKyAgICBnbG9iYWwgd3Jjb210b3AKKworICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KKyAgICB1bnNldCB3cmNvbXRvcAorfQorCitwcm9jIG1rYnJhbmNoIHt9IHsKKyAgICBnbG9iYWwgcm93bWVudWlkIG1rYnJ0b3AKKworICAgIHNldCB0b3AgLm1ha2VicmFuY2gKKyAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQorICAgIHRvcGxldmVsICR0b3AKKyAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgbmV3IGJyYW5jaCIKKyAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAorICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKKyAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAorICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCisgICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CisgICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKKyAgICBsYWJlbCAkdG9wLm5sYWIgLXRleHQgIk5hbWU6IgorICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggNDAKKyAgICBncmlkICR0b3AubmxhYiAkdG9wLm5hbWUgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nbyAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBbbGlzdCBta2JyZ28gJHRvcF0KKyAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCAiY2F0Y2gge2Rlc3Ryb3kgJHRvcH0iCisgICAgZ3JpZCAkdG9wLmJ1dHMuZ28gJHRvcC5idXRzLmNhbgorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKKyAgICBmb2N1cyAkdG9wLm5hbWUKK30KKworcHJvYyBta2JyZ28ge3RvcH0geworICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKKworICAgIHNldCBuYW1lIFskdG9wLm5hbWUgZ2V0XQorICAgIHNldCBpZCBbJHRvcC5zaGExIGdldF0KKyAgICBpZiB7JG5hbWUgZXEge319IHsKKwllcnJvcl9wb3B1cCAiUGxlYXNlIHNwZWNpZnkgYSBuYW1lIGZvciB0aGUgbmV3IGJyYW5jaCIKKwlyZXR1cm4KKyAgICB9CisgICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KKyAgICBub3didXN5IG5ld2JyYW5jaAorICAgIHVwZGF0ZQorICAgIGlmIHtbY2F0Y2ggeworCWV4ZWMgZ2l0IGJyYW5jaCAkbmFtZSAkaWQKKyAgICB9IGVycl19IHsKKwlub3RidXN5IG5ld2JyYW5jaAorCWVycm9yX3BvcHVwICRlcnIKKyAgICB9IGVsc2UgeworCWFkZGVkaGVhZCAkaWQgJG5hbWUKKwkjIFhYWCBzaG91bGQgdXBkYXRlIGxpc3Qgb2YgaGVhZHMgZGlzcGxheWVkIGZvciBzZWxlY3RlZCBjb21taXQKKwlub3RidXN5IG5ld2JyYW5jaAorCXJlZHJhd3RhZ3MgJGlkCisgICAgfQorfQorCitwcm9jIGNoZXJyeXBpY2sge30geworICAgIGdsb2JhbCByb3dtZW51aWQgY3VydmlldyBjb21taXRyb3cKKyAgICBnbG9iYWwgbWFpbmhlYWQgZGVzY19oZWFkcyBhbmNfdGFncyBkZXNjX3RhZ3MgYWxscGFyZW50cyBhbGxjaGlsZHJlbgorCisgICAgaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRyb3dtZW51aWQpXQorCSYmIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkcm93bWVudWlkKSAkbWFpbmhlYWRdID49IDB9IHsKKwlzZXQgb2sgW2NvbmZpcm1fcG9wdXAgIkNvbW1pdCBbc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA3XSBpcyBhbHJlYWR5XAorCQkJaW5jbHVkZWQgaW4gYnJhbmNoICRtYWluaGVhZCAtLSByZWFsbHkgcmUtYXBwbHkgaXQ/Il0KKwlpZiB7ISRva30gcmV0dXJuCisgICAgfQorICAgIG5vd2J1c3kgY2hlcnJ5cGljaworICAgIHVwZGF0ZQorICAgIHNldCBvbGRoZWFkIFtleGVjIGdpdCByZXYtcGFyc2UgSEVBRF0KKyAgICAjIFVuZm9ydHVuYXRlbHkgZ2l0LWNoZXJyeS1waWNrIHdyaXRlcyBzdHVmZiB0byBzdGRlcnIgZXZlbiB3aGVuCisgICAgIyBubyBlcnJvciBvY2N1cnMsIGFuZCBleGVjIHRha2VzIHRoYXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBlcnJvci4uLgorICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgImdpdCBjaGVycnktcGljayAtciAkcm93bWVudWlkIDI+JjEifSBlcnJdfSB7CisJbm90YnVzeSBjaGVycnlwaWNrCisJZXJyb3JfcG9wdXAgJGVycgorCXJldHVybgorICAgIH0KKyAgICBzZXQgbmV3aGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCisgICAgaWYgeyRuZXdoZWFkIGVxICRvbGRoZWFkfSB7CisJbm90YnVzeSBjaGVycnlwaWNrCisJZXJyb3JfcG9wdXAgIk5vIGNoYW5nZXMgY29tbWl0dGVkIgorCXJldHVybgorICAgIH0KKyAgICBzZXQgYWxscGFyZW50cygkbmV3aGVhZCkgJG9sZGhlYWQKKyAgICBsYXBwZW5kIGFsbGNoaWxkcmVuKCRvbGRoZWFkKSAkbmV3aGVhZAorICAgIHNldCBkZXNjX2hlYWRzKCRuZXdoZWFkKSAkbWFpbmhlYWQKKyAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRvbGRoZWFkKV19IHsKKwlzZXQgYW5jX3RhZ3MoJG5ld2hlYWQpICRhbmNfdGFncygkb2xkaGVhZCkKKyAgICB9CisgICAgc2V0IGRlc2NfdGFncygkbmV3aGVhZCkge30KKyAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3Vydmlldywkb2xkaGVhZCldfSB7CisJaW5zZXJ0cm93ICRjb21taXRyb3coJGN1cnZpZXcsJG9sZGhlYWQpICRuZXdoZWFkCisJaWYgeyRtYWluaGVhZCBuZSB7fX0geworCSAgICBtb3ZlZGhlYWQgJG5ld2hlYWQgJG1haW5oZWFkCisJfQorCXJlZHJhd3RhZ3MgJG9sZGhlYWQKKwlyZWRyYXd0YWdzICRuZXdoZWFkCisgICAgfQorICAgIG5vdGJ1c3kgY2hlcnJ5cGljaworfQorCisjIGNvbnRleHQgbWVudSBmb3IgYSBoZWFkCitwcm9jIGhlYWRtZW51IHt4IHkgaWQgaGVhZH0geworICAgIGdsb2JhbCBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBoZWFkY3R4bWVudQorCisgICAgc2V0IGhlYWRtZW51aWQgJGlkCisgICAgc2V0IGhlYWRtZW51aGVhZCAkaGVhZAorICAgIHRrX3BvcHVwICRoZWFkY3R4bWVudSAkeCAkeQorfQorCitwcm9jIGNvYnJhbmNoIHt9IHsKKyAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQgaGVhZGlkcworCisgICAgIyBjaGVjayB0aGUgdHJlZSBpcyBjbGVhbiBmaXJzdD8/CisgICAgc2V0IG9sZG1haW5oZWFkICRtYWluaGVhZAorICAgIG5vd2J1c3kgY2hlY2tvdXQKKyAgICB1cGRhdGUKKyAgICBpZiB7W2NhdGNoIHsKKwlleGVjIGdpdCBjaGVja291dCAkaGVhZG1lbnVoZWFkCisgICAgfSBlcnJdfSB7CisJbm90YnVzeSBjaGVja291dAorCWVycm9yX3BvcHVwICRlcnIKKyAgICB9IGVsc2UgeworCW5vdGJ1c3kgY2hlY2tvdXQKKwlzZXQgbWFpbmhlYWQgJGhlYWRtZW51aGVhZAorCWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkb2xkbWFpbmhlYWQpXX0geworCSAgICByZWRyYXd0YWdzICRoZWFkaWRzKCRvbGRtYWluaGVhZCkKKwl9CisJcmVkcmF3dGFncyAkaGVhZG1lbnVpZAorICAgIH0KK30KKworcHJvYyBybWJyYW5jaCB7fSB7CisgICAgZ2xvYmFsIGRlc2NfaGVhZHMgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQKKyAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCisKKyAgICBzZXQgaGVhZCAkaGVhZG1lbnVoZWFkCisgICAgc2V0IGlkICRoZWFkbWVudWlkCisgICAgaWYgeyRoZWFkIGVxICRtYWluaGVhZH0geworCWVycm9yX3BvcHVwICJDYW5ub3QgZGVsZXRlIHRoZSBjdXJyZW50bHkgY2hlY2tlZC1vdXQgYnJhbmNoIgorCXJldHVybgorICAgIH0KKyAgICBpZiB7JGRlc2NfaGVhZHMoJGlkKSBlcSAkaGVhZH0geworCSMgdGhlIHN0dWZmIG9uIHRoaXMgYnJhbmNoIGlzbid0IG9uIGFueSBvdGhlciBicmFuY2gKKwlpZiB7IVtjb25maXJtX3BvcHVwICJUaGUgY29tbWl0cyBvbiBicmFuY2ggJGhlYWQgYXJlbid0IG9uIGFueSBvdGhlclwKKwkJCWJyYW5jaC5cblJlYWxseSBkZWxldGUgYnJhbmNoICRoZWFkPyJdfSByZXR1cm4KKyAgICB9CisgICAgbm93YnVzeSBybWJyYW5jaAorICAgIHVwZGF0ZQorICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGJyYW5jaCAtRCAkaGVhZH0gZXJyXX0geworCW5vdGJ1c3kgcm1icmFuY2gKKwllcnJvcl9wb3B1cCAkZXJyCisJcmV0dXJuCisgICAgfQorICAgIHJlbW92ZWRoZWFkICRpZCAkaGVhZAorICAgIHJlZHJhd3RhZ3MgJGlkCisgICAgbm90YnVzeSBybWJyYW5jaAorfQorCisjIFN0dWZmIGZvciBmaW5kaW5nIG5lYXJieSB0YWdzCitwcm9jIGdldGFsbGNvbW1pdHMge30geworICAgIGdsb2JhbCBhbGxjc3RhcnQgYWxsY29tbWl0cyBhbGxjZmQgYWxsaWRzCisKKyAgICBzZXQgYWxsaWRzIHt9CisgICAgc2V0IGZkIFtvcGVuIFtjb25jYXQgfCBnaXQgcmV2LWxpc3QgLS1hbGwgLS10b3BvLW9yZGVyIC0tcGFyZW50c10gcl0KKyAgICBzZXQgYWxsY2ZkICRmZAorICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCisgICAgc2V0IGFsbGNvbW1pdHMgInJlYWRpbmciCisgICAgbm93YnVzeSBhbGxjb21taXRzCisgICAgcmVzdGFydGdldGFsbCAkZmQKK30KKworcHJvYyBkaXNjYXJkYWxsY29tbWl0cyB7fSB7CisgICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjZmQKKyAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGFsbGR0YWdzIHRhZ2lzZGVzYyBhbGxpZHMgZGVzY19oZWFkcworCisgICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgorICAgIGlmIHskYWxsY29tbWl0cyBlcSAicmVhZGluZyJ9IHsKKwljYXRjaCB7Y2xvc2UgJGFsbGNmZH0KKyAgICB9CisgICAgZm9yZWFjaCB2IHthbGxjb21taXRzIGFsbGNoaWxkcmVuIGFsbHBhcmVudHMgYWxsaWRzIGRlc2NfdGFncyBhbmNfdGFncworCQlhbGxkdGFncyB0YWdpc2Rlc2MgZGVzY19oZWFkc30geworCWNhdGNoIHt1bnNldCAkdn0KKyAgICB9Cit9CisKK3Byb2MgcmVzdGFydGdldGFsbCB7ZmR9IHsKKyAgICBnbG9iYWwgYWxsY3N0YXJ0CisKKyAgICBmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IGdldGFsbGNsaW5lcyAkZmRdCisgICAgc2V0IGFsbGNzdGFydCBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCit9CisKK3Byb2MgY29tYmluZV9kdGFncyB7bDEgbDJ9IHsKKyAgICBnbG9iYWwgdGFnaXNkZXNjIG5vdGZpcnN0ZAorCisgICAgc2V0IHJlcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRsMSAkbDJdXQorICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKKwlzZXQgeCBbbGluZGV4ICRyZXMgJGldCisJZm9yIHtzZXQgaiBbZXhwciB7JGkrMX1dfSB7JGogPCBbbGxlbmd0aCAkcmVzXX0ge30geworCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCisJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCR4LCR5KV19IHsKKwkJaWYgeyR0YWdpc2Rlc2MoJHgsJHkpID4gMH0geworCQkgICAgIyB4IGlzIGEgZGVzY2VuZGVudCBvZiB5LCBleGNsdWRlIHgKKwkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGkgJGldCisJCSAgICBpbmNyIGkgLTEKKwkJICAgIGJyZWFrCisJCX0gZWxzZSB7CisJCSAgICAjIHkgaXMgYSBkZXNjZW5kZW50IG9mIHgsIGV4Y2x1ZGUgeQorCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaiAkal0KKwkJfQorCSAgICB9IGVsc2UgeworCQkjIG5vIHJlbGF0aW9uLCBrZWVwIGdvaW5nCisJCWluY3IgagorCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gJHJlcworfQorCitwcm9jIGNvbWJpbmVfYXRhZ3Mge2wxIGwyfSB7CisgICAgZ2xvYmFsIHRhZ2lzZGVzYworCisgICAgc2V0IHJlcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRsMSAkbDJdXQorICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKKwlzZXQgeCBbbGluZGV4ICRyZXMgJGldCisJZm9yIHtzZXQgaiBbZXhwciB7JGkrMX1dfSB7JGogPCBbbGxlbmd0aCAkcmVzXX0ge30geworCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCisJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCR4LCR5KV19IHsKKwkJaWYgeyR0YWdpc2Rlc2MoJHgsJHkpIDwgMH0geworCQkgICAgIyB4IGlzIGFuIGFuY2VzdG9yIG9mIHksIGV4Y2x1ZGUgeAorCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaSAkaV0KKwkJICAgIGluY3IgaSAtMQorCQkgICAgYnJlYWsKKwkJfSBlbHNlIHsKKwkJICAgICMgeSBpcyBhbiBhbmNlc3RvciBvZiB4LCBleGNsdWRlIHkKKwkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZworCQlpbmNyIGoKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXMKK30KKworcHJvYyBmb3J3YXJkX3Bhc3Mge2lkIGNoaWxkcmVufSB7CisgICAgZ2xvYmFsIGlkdGFncyBkZXNjX3RhZ3MgaWRoZWFkcyBkZXNjX2hlYWRzIGFsbGR0YWdzIHRhZ2lzZGVzYworCisgICAgc2V0IGR0YWdzIHt9CisgICAgc2V0IGRoZWFkcyB7fQorICAgIGZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuIHsKKwlpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkY2hpbGQpXX0geworCSAgICBzZXQgY3RhZ3MgW2xpc3QgJGNoaWxkXQorCX0gZWxzZSB7CisJICAgIHNldCBjdGFncyAkZGVzY190YWdzKCRjaGlsZCkKKwl9CisJaWYgeyRkdGFncyBlcSB7fX0geworCSAgICBzZXQgZHRhZ3MgJGN0YWdzCisJfSBlbHNlaWYgeyRjdGFncyBuZSAkZHRhZ3N9IHsKKwkgICAgc2V0IGR0YWdzIFtjb21iaW5lX2R0YWdzICRkdGFncyAkY3RhZ3NdCisJfQorCXNldCBjaGVhZHMgJGRlc2NfaGVhZHMoJGNoaWxkKQorCWlmIHskZGhlYWRzIGVxIHt9fSB7CisJICAgIHNldCBkaGVhZHMgJGNoZWFkcworCX0gZWxzZWlmIHskY2hlYWRzIG5lICRkaGVhZHN9IHsKKwkgICAgc2V0IGRoZWFkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRkaGVhZHMgJGNoZWFkc11dCisJfQorICAgIH0KKyAgICBzZXQgZGVzY190YWdzKCRpZCkgJGR0YWdzCisgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKKwlzZXQgYWR0ICRkdGFncworCWZvcmVhY2ggdGFnICRkdGFncyB7CisJICAgIHNldCBhZHQgW2NvbmNhdCAkYWR0ICRhbGxkdGFncygkdGFnKV0KKwl9CisJc2V0IGFkdCBbbHNvcnQgLXVuaXF1ZSAkYWR0XQorCXNldCBhbGxkdGFncygkaWQpICRhZHQKKwlmb3JlYWNoIHRhZyAkYWR0IHsKKwkgICAgc2V0IHRhZ2lzZGVzYygkaWQsJHRhZykgLTEKKwkgICAgc2V0IHRhZ2lzZGVzYygkdGFnLCRpZCkgMQorCX0KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CisJc2V0IGRoZWFkcyBbY29uY2F0ICRkaGVhZHMgJGlkaGVhZHMoJGlkKV0KKyAgICB9CisgICAgc2V0IGRlc2NfaGVhZHMoJGlkKSAkZGhlYWRzCit9CisKK3Byb2MgZ2V0YWxsY2xpbmVzIHtmZH0geworICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY3N0YXJ0CisgICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBpZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcworICAgIGdsb2JhbCBpZGhlYWRzIHRyYXZpbmRleAorCisgICAgd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CisJc2V0IGlkIFtsaW5kZXggJGxpbmUgMF0KKwlsYXBwZW5kIGFsbGlkcyAkaWQKKwlzZXQgb2xkcyBbbHJhbmdlICRsaW5lIDEgZW5kXQorCXNldCBhbGxwYXJlbnRzKCRpZCkgJG9sZHMKKwlpZiB7IVtpbmZvIGV4aXN0cyBhbGxjaGlsZHJlbigkaWQpXX0geworCSAgICBzZXQgYWxsY2hpbGRyZW4oJGlkKSB7fQorCX0KKwlmb3JlYWNoIHAgJG9sZHMgeworCSAgICBsYXBwZW5kIGFsbGNoaWxkcmVuKCRwKSAkaWQKKwl9CisJIyBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGRlc2NlbmRlbnRzIGFzIHdlIGdvCisJIyBhbHNvIGNvbXB1dGUgZGVzY2VuZGVudCBoZWFkcworCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKKwlpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRhbGxjc3RhcnQgPj0gNTB9IHsKKwkgICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSB7fQorCSAgICBhZnRlciBpZGxlIHJlc3RhcnRnZXRhbGwgJGZkCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgaWYge1tlb2YgJGZkXX0geworCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KKwlzZXQgYWxsY29tbWl0cyAidHJhdmVyc2luZyIKKwlhZnRlciBpZGxlIHJlc3RhcnRhdGFncworCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0geworCSAgICBlcnJvcl9wb3B1cCAiRXJyb3IgcmVhZGluZyBmdWxsIGNvbW1pdCBncmFwaDogJGVyci5cblwKKwkJCSBSZXN1bHRzIG1heSBiZSBpbmNvbXBsZXRlLiIKKwl9CisgICAgfQorfQorCisjIHdhbGsgYmFja3dhcmQgdGhyb3VnaCB0aGUgdHJlZSBhbmQgY29tcHV0ZSBuZWFyZXN0IHRhZ2dlZCBhbmNlc3RvcnMKK3Byb2MgcmVzdGFydGF0YWdzIHt9IHsKKyAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgaWR0YWdzIGFuY190YWdzIHRyYXZpbmRleAorCisgICAgc2V0IHQwIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KKyAgICBzZXQgaSAkdHJhdmluZGV4CisgICAgd2hpbGUge1tpbmNyIGkgLTFdID49IDB9IHsKKwlzZXQgaWQgW2xpbmRleCAkYWxsaWRzICRpXQorCXNldCBhdGFncyB7fQorCWZvcmVhY2ggcCAkYWxscGFyZW50cygkaWQpIHsKKwkgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJHApXX0geworCQlzZXQgcHRhZ3MgW2xpc3QgJHBdCisJICAgIH0gZWxzZSB7CisJCXNldCBwdGFncyAkYW5jX3RhZ3MoJHApCisJICAgIH0KKwkgICAgaWYgeyRhdGFncyBlcSB7fX0geworCQlzZXQgYXRhZ3MgJHB0YWdzCisJICAgIH0gZWxzZWlmIHskcHRhZ3MgbmUgJGF0YWdzfSB7CisJCXNldCBhdGFncyBbY29tYmluZV9hdGFncyAkYXRhZ3MgJHB0YWdzXQorCSAgICB9CisJfQorCXNldCBhbmNfdGFncygkaWQpICRhdGFncworCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHQwID49IDUwfSB7CisJICAgIHNldCB0cmF2aW5kZXggJGkKKwkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0YXRhZ3MKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKyAgICBzZXQgYWxsY29tbWl0cyAiZG9uZSIKKyAgICBzZXQgdHJhdmluZGV4IDAKKyAgICBub3RidXN5IGFsbGNvbW1pdHMKKyAgICBkaXNwbmVhcnRhZ3MKK30KKworIyB1cGRhdGUgdGhlIGRlc2NfdGFncyBhbmQgYW5jX3RhZ3MgYXJyYXlzIGZvciBhIG5ldyB0YWcganVzdCBhZGRlZAorcHJvYyBhZGRlZHRhZyB7aWR9IHsKKyAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cworICAgIGdsb2JhbCBpZHRhZ3MgdGFnaXNkZXNjIGFsbGR0YWdzCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHJldHVybgorICAgIHNldCBhZHQgJGRlc2NfdGFncygkaWQpCisgICAgZm9yZWFjaCB0ICRkZXNjX3RhZ3MoJGlkKSB7CisJc2V0IGFkdCBbY29uY2F0ICRhZHQgJGFsbGR0YWdzKCR0KV0KKyAgICB9CisgICAgc2V0IGFkdCBbbHNvcnQgLXVuaXF1ZSAkYWR0XQorICAgIHNldCBhbGxkdGFncygkaWQpICRhZHQKKyAgICBmb3JlYWNoIHQgJGFkdCB7CisJc2V0IHRhZ2lzZGVzYygkaWQsJHQpIC0xCisJc2V0IHRhZ2lzZGVzYygkdCwkaWQpIDEKKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0geworCXNldCB0b2RvICRhbmNfdGFncygkaWQpCisJd2hpbGUgeyR0b2RvIG5lIHt9fSB7CisJICAgIHNldCBkbyBbbGluZGV4ICR0b2RvIDBdCisJICAgIHNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCisJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCRpZCwkZG8pXX0gY29udGludWUKKwkgICAgc2V0IHRhZ2lzZGVzYygkZG8sJGlkKSAtMQorCSAgICBzZXQgdGFnaXNkZXNjKCRpZCwkZG8pIDEKKwkgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0geworCQlzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbmNfdGFncygkZG8pXQorCSAgICB9CisJfQorICAgIH0KKworICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGlkKQorICAgIHNldCBsYXN0bmV3IFtsaXN0ICRpZF0KKyAgICBzZXQgbnVwIDAKKyAgICBzZXQgbmNoIDAKKyAgICBzZXQgdG9kbyAkYWxscGFyZW50cygkaWQpCisgICAgd2hpbGUgeyR0b2RvIG5lIHt9fSB7CisJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KKwlzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQorCWlmIHshW2luZm8gZXhpc3RzIGRlc2NfdGFncygkZG8pXX0gY29udGludWUKKwlpZiB7JGRlc2NfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CisJICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGRvKQorCSAgICBzZXQgbGFzdG5ldyBbY29tYmluZV9kdGFncyAkbGFzdG9sZCBbbGlzdCAkaWRdXQorCSAgICBpbmNyIG5jaAorCX0KKwlpZiB7JGxhc3RvbGQgZXEgJGxhc3RuZXd9IGNvbnRpbnVlCisJc2V0IGRlc2NfdGFncygkZG8pICRsYXN0bmV3CisJaW5jciBudXAKKwlpZiB7IVtpbmZvIGV4aXN0cyBpZHRhZ3MoJGRvKV19IHsKKwkgICAgc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYWxscGFyZW50cygkZG8pXQorCX0KKyAgICB9CisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gcmV0dXJuCisgICAgc2V0IGxhc3RvbGQgJGFuY190YWdzKCRpZCkKKyAgICBzZXQgbGFzdG5ldyBbbGlzdCAkaWRdCisgICAgc2V0IG51cCAwCisgICAgc2V0IG5jaCAwCisgICAgc2V0IHRvZG8gJGFsbGNoaWxkcmVuKCRpZCkKKyAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKKwlzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQorCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCisJaWYgeyFbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGRvKV19IGNvbnRpbnVlCisJaWYgeyRhbmNfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CisJICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkZG8pCisJICAgIHNldCBsYXN0bmV3IFtjb21iaW5lX2F0YWdzICRsYXN0b2xkIFtsaXN0ICRpZF1dCisJICAgIGluY3IgbmNoCisJfQorCWlmIHskbGFzdG9sZCBlcSAkbGFzdG5ld30gY29udGludWUKKwlzZXQgYW5jX3RhZ3MoJGRvKSAkbGFzdG5ldworCWluY3IgbnVwCisJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRkbyldfSB7CisJICAgIHNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFsbGNoaWxkcmVuKCRkbyldCisJfQorICAgIH0KK30KKworIyB1cGRhdGUgdGhlIGRlc2NfaGVhZHMgYXJyYXkgZm9yIGEgbmV3IGhlYWQganVzdCBhZGRlZAorcHJvYyBhZGRlZGhlYWQge2hpZCBoZWFkfSB7CisgICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKKworICAgIHNldCBoZWFkaWRzKCRoZWFkKSAkaGlkCisgICAgbGFwcGVuZCBpZGhlYWRzKCRoaWQpICRoZWFkCisKKyAgICBzZXQgdG9kbyBbbGlzdCAkaGlkXQorICAgIHdoaWxlIHskdG9kbyBuZSB7fX0geworCXNldCBkbyBbbGluZGV4ICR0b2RvIDBdCisJc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KKwlpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldIHx8CisJICAgIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkZG8pICRoZWFkXSA+PSAwfSBjb250aW51ZQorCXNldCBvbGRoZWFkcyAkZGVzY19oZWFkcygkZG8pCisJbGFwcGVuZCBkZXNjX2hlYWRzKCRkbykgJGhlYWQKKwlzZXQgaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQorCXdoaWxlIHsxfSB7CisJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKKwkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CisJCSRkZXNjX2hlYWRzKCRwKSBuZSAkb2xkaGVhZHN9IGJyZWFrCisJICAgIHNldCBkbyAkcAorCSAgICBzZXQgZGVzY19oZWFkcygkZG8pICRoZWFkcworCX0KKwlzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQorICAgIH0KK30KKworIyB1cGRhdGUgdGhlIGRlc2NfaGVhZHMgYXJyYXkgZm9yIGEgaGVhZCBqdXN0IHJlbW92ZWQKK3Byb2MgcmVtb3ZlZGhlYWQge2hpZCBoZWFkfSB7CisgICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKKworICAgIHVuc2V0IGhlYWRpZHMoJGhlYWQpCisgICAgaWYgeyRpZGhlYWRzKCRoaWQpIGVxICRoZWFkfSB7CisJdW5zZXQgaWRoZWFkcygkaGlkKQorICAgIH0gZWxzZSB7CisJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRoaWQpICRoZWFkXQorCWlmIHskaSA+PSAwfSB7CisJICAgIHNldCBpZGhlYWRzKCRoaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkaGlkKSAkaSAkaV0KKwl9CisgICAgfQorCisgICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KKyAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKKwlzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQorCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCisJaWYgeyFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkZG8pXX0gY29udGludWUKKwlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRlc2NfaGVhZHMoJGRvKSAkaGVhZF0KKwlpZiB7JGkgPCAwfSBjb250aW51ZQorCXNldCBvbGRoZWFkcyAkZGVzY19oZWFkcygkZG8pCisJc2V0IGhlYWRzIFtscmVwbGFjZSAkZGVzY19oZWFkcygkZG8pICRpICRpXQorCXdoaWxlIHsxfSB7CisJICAgIHNldCBkZXNjX2hlYWRzKCRkbykgJGhlYWRzCisJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKKwkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CisJCSRkZXNjX2hlYWRzKCRwKSBuZSAkb2xkaGVhZHN9IGJyZWFrCisJICAgIHNldCBkbyAkcAorCX0KKwlzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQorICAgIH0KK30KKworIyB1cGRhdGUgdGhpbmdzIGZvciBhIGhlYWQgbW92ZWQgdG8gYSBjaGlsZCBvZiBpdHMgcHJldmlvdXMgbG9jYXRpb24KK3Byb2MgbW92ZWRoZWFkIHtpZCBuYW1lfSB7CisgICAgZ2xvYmFsIGhlYWRpZHMgaWRoZWFkcworCisgICAgc2V0IG9sZGlkICRoZWFkaWRzKCRuYW1lKQorICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKKyAgICBpZiB7JGlkaGVhZHMoJG9sZGlkKSBlcSAkbmFtZX0geworCXVuc2V0IGlkaGVhZHMoJG9sZGlkKQorICAgIH0gZWxzZSB7CisJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRvbGRpZCkgJG5hbWVdCisJaWYgeyRpID49IDB9IHsKKwkgICAgc2V0IGlkaGVhZHMoJG9sZGlkKSBbbHJlcGxhY2UgJGlkaGVhZHMoJG9sZGlkKSAkaSAkaV0KKwl9CisgICAgfQorICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCit9CisKK3Byb2MgY2hhbmdlZHJlZnMge30geworICAgIGdsb2JhbCBkZXNjX2hlYWRzIGRlc2NfdGFncyBhbmNfdGFncyBhbGxjb21taXRzIGFsbGlkcworICAgIGdsb2JhbCBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGlkdGFncyB0cmF2aW5kZXgKKworICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbGNvbW1pdHNdfSByZXR1cm4KKyAgICBjYXRjaCB7dW5zZXQgZGVzY19oZWFkc30KKyAgICBjYXRjaCB7dW5zZXQgZGVzY190YWdzfQorICAgIGNhdGNoIHt1bnNldCBhbmNfdGFnc30KKyAgICBjYXRjaCB7dW5zZXQgYWxsZHRhZ3N9CisgICAgY2F0Y2gge3Vuc2V0IHRhZ2lzZGVzY30KKyAgICBmb3JlYWNoIGlkICRhbGxpZHMgeworCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKKyAgICB9CisgICAgaWYgeyRhbGxjb21taXRzIG5lICJyZWFkaW5nIn0geworCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KKwlpZiB7JGFsbGNvbW1pdHMgbmUgInRyYXZlcnNpbmcifSB7CisJICAgIHNldCBhbGxjb21taXRzICJ0cmF2ZXJzaW5nIgorCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncworCX0KKyAgICB9Cit9CisKK3Byb2MgcmVyZWFkcmVmcyB7fSB7CisgICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCisKKyAgICBzZXQgcmVmaWRzIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkdGFnc10gXAorCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCisgICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKKwlpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV19IHsKKwkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCisJfQorICAgIH0KKyAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCisgICAgcmVhZHJlZnMKKyAgICBjaGFuZ2VkcmVmcworICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKKwkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KKyAgICBmb3JlYWNoIGlkICRyZWZpZHMgeworCXNldCB2IFtsaXN0cmVmcyAkaWRdCisJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdiB8fAorCSAgICAoJGlkIGVxICRvbGRtYWluaGVhZCAmJiAkaWQgbmUgJG1haW5oZWFkKSB8fAorCSAgICAoJGlkIGVxICRtYWluaGVhZCAmJiAkaWQgbmUgJG9sZG1haW5oZWFkKX0geworCSAgICByZWRyYXd0YWdzICRpZAorCX0KKyAgICB9Cit9CisKK3Byb2MgbGlzdHJlZnMge2lkfSB7CisgICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCisKKyAgICBzZXQgeCB7fQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CisJc2V0IHggJGlkdGFncygkaWQpCisgICAgfQorICAgIHNldCB5IHt9CisgICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CisJc2V0IHkgJGlkaGVhZHMoJGlkKQorICAgIH0KKyAgICBzZXQgeiB7fQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKKwlzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQorICAgIH0KKyAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCit9CisKK3Byb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CisgICAgZ2xvYmFsIGN0ZXh0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtCisKKyAgICBpZiB7JGlzbmV3fSB7CisJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQorICAgIH0KKyAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgY2xlYXJfY3RleHQKKyAgICBzZXQgbGlua251bSAwCisgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKKwlzZXQgdGV4dCAkdGFnY29udGVudHMoJHRhZykKKyAgICB9IGVsc2UgeworCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKKyAgICB9CisgICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0IHt9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgaW5pdF9mbGlzdCB7fQorfQorCitwcm9jIGRvcXVpdCB7fSB7CisgICAgZ2xvYmFsIHN0b3BwZWQKKyAgICBzZXQgc3RvcHBlZCAxMDAKKyAgICBzYXZlc3R1ZmYgLgorICAgIGRlc3Ryb3kgLgorfQorCitwcm9jIGRvcHJlZnMge30geworICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cworICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKKyAgICBnbG9iYWwgYmdjb2xvciBmZ2NvbG9yIGN0ZXh0IGRpZmZjb2xvcnMKKyAgICBnbG9iYWwgdWlmb250CisKKyAgICBzZXQgdG9wIC5naXRrcHJlZnMKKyAgICBzZXQgcHJlZnN0b3AgJHRvcAorICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CisJcmFpc2UgJHRvcAorCXJldHVybgorICAgIH0KKyAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30geworCXNldCBvbGRwcmVmcygkdikgW3NldCAkdl0KKyAgICB9CisgICAgdG9wbGV2ZWwgJHRvcAorICAgIHdtIHRpdGxlICR0b3AgIkdpdGsgcHJlZmVyZW5jZXMiCisgICAgbGFiZWwgJHRvcC5sZGlzcCAtdGV4dCAiQ29tbWl0IGxpc3QgZGlzcGxheSBvcHRpb25zIgorICAgICR0b3AubGRpc3AgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLnNwYWNlciAtdGV4dCAiICIKKyAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCisJLWZvbnQgb3B0aW9uZm9udAorICAgIHNwaW5ib3ggJHRvcC5tYXh3aWR0aCAtZnJvbSAwIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXh3aWR0aAorICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKKyAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKKwktZm9udCBvcHRpb25mb250CisgICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAorICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CisKKyAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKKyAgICAkdG9wLmRkaXNwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgZ3JpZCAkdG9wLmRkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCisgICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCisJLWZvbnQgb3B0aW9uZm9udAorICAgIGVudHJ5ICR0b3AuZGlmZm9wdCAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBkaWZmb3B0cworICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKKyAgICBmcmFtZSAkdG9wLm50YWcKKyAgICBsYWJlbCAkdG9wLm50YWcubCAtdGV4dCAiRGlzcGxheSBuZWFyYnkgdGFncyIgLWZvbnQgb3B0aW9uZm9udAorICAgIGNoZWNrYnV0dG9uICR0b3AubnRhZy5iIC12YXJpYWJsZSBzaG93bmVhcnRhZ3MKKyAgICBwYWNrICR0b3AubnRhZy5iICR0b3AubnRhZy5sIC1zaWRlIGxlZnQKKyAgICBncmlkIHggJHRvcC5udGFnIC1zdGlja3kgdworCisgICAgbGFiZWwgJHRvcC5jZGlzcCAtdGV4dCAiQ29sb3JzOiBwcmVzcyB0byBjaG9vc2UiCisgICAgJHRvcC5jZGlzcCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIGdyaWQgJHRvcC5jZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAorICAgIGxhYmVsICR0b3AuYmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRiZ2NvbG9yCisgICAgYnV0dG9uICR0b3AuYmdidXQgLXRleHQgIkJhY2tncm91bmQiIC1mb250IG9wdGlvbmZvbnQgXAorCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGJnY29sb3IgMCAkdG9wLmJnIGJhY2tncm91bmQgc2V0YmddCisgICAgZ3JpZCB4ICR0b3AuYmdidXQgJHRvcC5iZyAtc3RpY2t5IHcKKyAgICBsYWJlbCAkdG9wLmZnIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCAkZmdjb2xvcgorICAgIGJ1dHRvbiAkdG9wLmZnYnV0IC10ZXh0ICJGb3JlZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKKwktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBmZ2NvbG9yIDAgJHRvcC5mZyBmb3JlZ3JvdW5kIHNldGZnXQorICAgIGdyaWQgeCAkdG9wLmZnYnV0ICR0b3AuZmcgLXN0aWNreSB3CisgICAgbGFiZWwgJHRvcC5kaWZmb2xkIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDBdCisgICAgYnV0dG9uICR0b3AuZGlmZm9sZGJ1dCAtdGV4dCAiRGlmZjogb2xkIGxpbmVzIiAtZm9udCBvcHRpb25mb250IFwKKwktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDAgJHRvcC5kaWZmb2xkICJkaWZmIG9sZCBsaW5lcyIgXAorCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmVncm91bmRdXQorICAgIGdyaWQgeCAkdG9wLmRpZmZvbGRidXQgJHRvcC5kaWZmb2xkIC1zdGlja3kgdworICAgIGxhYmVsICR0b3AuZGlmZm5ldyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQorICAgIGJ1dHRvbiAkdG9wLmRpZmZuZXdidXQgLXRleHQgIkRpZmY6IG5ldyBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCisJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAxICR0b3AuZGlmZm5ldyAiZGlmZiBuZXcgbGluZXMiIFwKKwkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlZ3JvdW5kXV0KKyAgICBncmlkIHggJHRvcC5kaWZmbmV3YnV0ICR0b3AuZGlmZm5ldyAtc3RpY2t5IHcKKyAgICBsYWJlbCAkdG9wLmh1bmtzZXAgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KKyAgICBidXR0b24gJHRvcC5odW5rc2VwYnV0IC10ZXh0ICJEaWZmOiBodW5rIGhlYWRlciIgLWZvbnQgb3B0aW9uZm9udCBcCisJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAyICR0b3AuaHVua3NlcCBcCisJCSAgICAgICJkaWZmIGh1bmsgaGVhZGVyIiBcCisJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlZ3JvdW5kXV0KKyAgICBncmlkIHggJHRvcC5odW5rc2VwYnV0ICR0b3AuaHVua3NlcCAtc3RpY2t5IHcKKworICAgIGZyYW1lICR0b3AuYnV0cworICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rIC1kZWZhdWx0IGFjdGl2ZQorICAgICR0b3AuYnV0cy5vayBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHByZWZzY2FuIC1kZWZhdWx0IG5vcm1hbAorICAgICR0b3AuYnV0cy5jYW4gY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgJHRvcC5idXRzIC0gLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgYmluZCAkdG9wIDxWaXNpYmlsaXR5PiAiZm9jdXMgJHRvcC5idXRzLm9rIgorfQorCitwcm9jIGNob29zZWNvbG9yIHt2IHZpIHcgeCBjbWR9IHsKKyAgICBnbG9iYWwgJHYKKworICAgIHNldCBjIFt0a19jaG9vc2VDb2xvciAtaW5pdGlhbGNvbG9yIFtsaW5kZXggW3NldCAkdl0gJHZpXSBcCisJICAgICAgIC10aXRsZSAiR2l0azogY2hvb3NlIGNvbG9yIGZvciAkeCJdCisgICAgaWYgeyRjIGVxIHt9fSByZXR1cm4KKyAgICAkdyBjb25mIC1iYWNrZ3JvdW5kICRjCisgICAgbHNldCAkdiAkdmkgJGMKKyAgICBldmFsICRjbWQgJGMKK30KKworcHJvYyBzZXRiZyB7Y30geworICAgIGdsb2JhbCBiZ2xpc3QKKworICAgIGZvcmVhY2ggdyAkYmdsaXN0IHsKKwkkdyBjb25mIC1iYWNrZ3JvdW5kICRjCisgICAgfQorfQorCitwcm9jIHNldGZnIHtjfSB7CisgICAgZ2xvYmFsIGZnbGlzdCBjYW52CisKKyAgICBmb3JlYWNoIHcgJGZnbGlzdCB7CisJJHcgY29uZiAtZm9yZWdyb3VuZCAkYworICAgIH0KKyAgICBhbGxjYW52cyBpdGVtY29uZiB0ZXh0IC1maWxsICRjCisgICAgJGNhbnYgaXRlbWNvbmYgY2lyY2xlIC1vdXRsaW5lICRjCit9CisKK3Byb2MgcHJlZnNjYW4ge30geworICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cworICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKKworICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CisJc2V0ICR2ICRvbGRwcmVmcygkdikKKyAgICB9CisgICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQorICAgIHVuc2V0IHByZWZzdG9wCit9CisKK3Byb2MgcHJlZnNvayB7fSB7CisgICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0CisgICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncworCisgICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQorICAgIHVuc2V0IHByZWZzdG9wCisgICAgaWYgeyRtYXh3aWR0aCAhPSAkb2xkcHJlZnMobWF4d2lkdGgpCisJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKKwlyZWRpc3BsYXkKKyAgICB9IGVsc2VpZiB7JHNob3duZWFydGFncyAhPSAkb2xkcHJlZnMoc2hvd25lYXJ0YWdzKX0geworCXJlc2VsZWN0bGluZQorICAgIH0KK30KKworcHJvYyBmb3JtYXRkYXRlIHtkfSB7CisgICAgcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQorfQorCisjIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQorIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgorIyBOb3QgYWxsIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCBieSBUY2wuCitzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CisgICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCisgICAgICBJU082NDYtVVMgVVMtQVNDSUkgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgfQorICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KKyAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQorICAgIHsgSU5WQVJJQU5UIGNzSU5WQVJJQU5UIH0KKyAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KKyAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQorICAgIHsgTkFUUy1TRUZJIGlzby1pci04LTEgY3NOQVRTU0VGSSB9CisgICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CisgICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KKyAgICB7IE5BVFMtREFOTy1BREQgaXNvLWlyLTktMiBjc05BVFNEQU5PQUREIH0KKyAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CisgICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQorICAgIHsgS1NfQ181NjAxLTE5ODcgaXNvLWlyLTE0OSBLU19DXzU2MDEtMTk4OSBLU0NfNTYwMSBrb3JlYW4gY3NLU0M1NjAxMTk4NyB9CisgICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CisgICAgeyBFVUMtS1IgY3NFVUNLUiB9CisgICAgeyBJU08tMjAyMi1KUCBjc0lTTzIwMjJKUCB9CisgICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CisgICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNworICAgICAgY3NJU08xM0pJU0M2MjIwanAgfQorICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CisgICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KKyAgICB7IFBUIGlzby1pci0xNiBJU082NDYtUFQgY3NJU08xNlBvcnR1Z3Vlc2UgfQorICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CisgICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KKyAgICB7IGxhdGluLWdyZWVrIGlzby1pci0xOSBjc0lTTzE5TGF0aW5HcmVlayB9CisgICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KKyAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KKyAgICB7IExhdGluLWdyZWVrLTEgaXNvLWlyLTI3IGNzSVNPMjdMYXRpbkdyZWVrMSB9CisgICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQorICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQorICAgIHsgQlNfdmlld2RhdGEgaXNvLWlyLTQ3IGNzSVNPNDdCU1ZpZXdkYXRhIH0KKyAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KKyAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KKyAgICB7IElOSVMtY3lyaWxsaWMgaXNvLWlyLTUxIGNzSVNPNTFJTklTQ3lyaWxsaWMgfQorICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CisgICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CisgICAgeyBHQl8xOTg4LTgwIGlzby1pci01NyBjbiBJU082NDYtQ04gY3NJU081N0dCMTk4OCB9CisgICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CisgICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCisgICAgICBjc0lTTzYwTm9yd2VnaWFuMSB9CisgICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KKyAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CisgICAgeyB2aWRlb3RleC1zdXBwbCBpc28taXItNzAgY3NJU083MFZpZGVvdGV4U3VwcDEgfQorICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CisgICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KKyAgICB7IE1TWl83Nzk1LjMgaXNvLWlyLTg2IElTTzY0Ni1IVSBodSBjc0lTTzg2SHVuZ2FyaWFuIH0KKyAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQorICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KKyAgICB7IEFTTU9fNDQ5IElTT185MDM2IGFyYWJpYzcgaXNvLWlyLTg5IGNzSVNPODlBU01PNDQ5IH0KKyAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWIgaXNvLWlyLTkyIElTTzY0Ni1KUC1PQ1ItQiBqcC1vY3ItYgorICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQgaXNvLWlyLTk0IGpwLW9jci1oYW5kIGNzSVNPOTRKSVM2MjI5MTk4NGhhbmQgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAorICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CisgICAgeyBKSVNfQzYyMjktMTk4NC1rYW5hIGlzby1pci05NiBjc0lTTzk2SklTQzYyMjkxOTg0a2FuYSB9CisgICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CisgICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KKyAgICB7IElTT184ODU5LTE6MTk4NyBpc28taXItMTAwIElTT184ODU5LTEgSVNPLTg4NTktMSBsYXRpbjEgbDEgSUJNODE5CisgICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CisgICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KKyAgICB7IFQuNjEtN2JpdCBpc28taXItMTAyIGNzSVNPMTAyVDYxN2JpdCB9CisgICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CisgICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KKyAgICB7IElTT184ODU5LTQ6MTk4OCBpc28taXItMTEwIElTT184ODU5LTQgSVNPLTg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgfQorICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CisgICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQorICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTIgaXNvLWlyLTEyMiBJU082NDYtQ0EyIGNzYTctMiBjc0lTTzEyMkNhbmFkaWFuMiB9CisgICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KKyAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAorICAgICAgYXJhYmljIGNzSVNPTGF0aW5BcmFiaWMgfQorICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CisgICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KKyAgICB7IElTT184ODU5LTc6MTk4NyBpc28taXItMTI2IElTT184ODU5LTcgSVNPLTg4NTktNyBFTE9UXzkyOCBFQ01BLTExOAorICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CisgICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KKyAgICB7IElTT184ODU5LTg6MTk4OCBpc28taXItMTM4IElTT184ODU5LTggSVNPLTg4NTktOCBoZWJyZXcKKyAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQorICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CisgICAgeyBJU09fODg1OS04LUkgY3NJU084ODU5OEkgSVNPLTg4NTktOC1JIH0KKyAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CisgICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQorICAgIHsgSVNPXzY5MzctMi1hZGQgaXNvLWlyLTE0MiBjc0lTT1RleHRDb21tIH0KKyAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CisgICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKKyAgICAgIGNzSVNPTGF0aW5DeXJpbGxpYyB9CisgICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KKyAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CisgICAgeyBJU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IElTTy04ODU5LTkgbGF0aW41IGw1IGNzSVNPTGF0aW41IH0KKyAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KKyAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQorICAgIHsgSVNPXzY5MzctMi0yNSBpc28taXItMTUyIGNzSVNPNjkzN0FkZCB9CisgICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KKyAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQorICAgIHsgSVNPXzEwMzY3LWJveCBpc28taXItMTU1IGNzSVNPMTAzNjdCb3ggfQorICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CisgICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQorICAgIHsgSklTX1gwMjEyLTE5OTAgeDAyMTIgaXNvLWlyLTE1OSBjc0lTTzE1OUpJU1gwMjEyMTk5MCB9CisgICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQorICAgIHsgdXMtZGsgY3NVU0RLIH0KKyAgICB7IGRrLXVzIGNzREtVUyB9CisgICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CisgICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQorICAgIHsgSVNPLTEwNjQ2LVVDUy0yIGNzVW5pY29kZSB9CisgICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KKyAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KKyAgICB7IGhwLXJvbWFuOCByb21hbjggcjggY3NIUFJvbWFuOCB9CisgICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KKyAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKKyAgICAgIGNzSUJNMDM3IH0KKyAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KKyAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CisgICAgeyBJQk0yNzQgRUJDRElDLUJFIENQMjc0IGNzSUJNMjc0IH0KKyAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQorICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQorICAgIHsgSUJNMjc4IENQMjc4IGViY2RpYy1jcC1maSBlYmNkaWMtY3Atc2UgY3NJQk0yNzggfQorICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CisgICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQorICAgIHsgSUJNMjg0IENQMjg0IGViY2RpYy1jcC1lcyBjc0lCTTI4NCB9CisgICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KKyAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CisgICAgeyBJQk0yOTcgY3AyOTcgZWJjZGljLWNwLWZyIGNzSUJNMjk3IH0KKyAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KKyAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQorICAgIHsgSUJNNDI0IGNwNDI0IGViY2RpYy1jcC1oZSBjc0lCTTQyNCB9CisgICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQorICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQorICAgIHsgSUJNNzc1IGNwNzc1IGNzUEM3NzVCYWx0aWMgfQorICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KKyAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQorICAgIHsgSUJNODUyIGNwODUyIDg1MiBjc1BDcDg1MiB9CisgICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KKyAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQorICAgIHsgSUJNODYwIGNwODYwIDg2MCBjc0lCTTg2MCB9CisgICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KKyAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KKyAgICB7IElCTTg2MyBjcDg2MyA4NjMgY3NJQk04NjMgfQorICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KKyAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQorICAgIHsgSUJNODY2IGNwODY2IDg2NiBjc0lCTTg2NiB9CisgICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQorICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CisgICAgeyBJQk04NzAgQ1A4NzAgZWJjZGljLWNwLXJvZWNlIGViY2RpYy1jcC15dSBjc0lCTTg3MCB9CisgICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KKyAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQorICAgIHsgSUJNODkxIGNwODkxIGNzSUJNODkxIH0KKyAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CisgICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CisgICAgeyBJQk05MDUgQ1A5MDUgZWJjZGljLWNwLXRyIGNzSUJNOTA1IH0KKyAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KKyAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CisgICAgeyBFQkNESUMtQVQtREUgY3NJQk1FQkNESUNBVERFIH0KKyAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQorICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CisgICAgeyBFQkNESUMtREstTk8gY3NFQkNESUNES05PIH0KKyAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQorICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CisgICAgeyBFQkNESUMtRkktU0UtQSBjc0VCQ0RJQ0ZJU0VBIH0KKyAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KKyAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KKyAgICB7IEVCQ0RJQy1QVCBjc0VCQ0RJQ1BUIH0KKyAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KKyAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KKyAgICB7IEVCQ0RJQy1FUy1TIGNzRUJDRElDRVNTIH0KKyAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KKyAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KKyAgICB7IFVOS05PV04tOEJJVCBjc1Vua25vd244QmlUIH0KKyAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQorICAgIHsgTU5FTSBjc01uZW0gfQorICAgIHsgVklTQ0lJIGNzVklTQ0lJIH0KKyAgICB7IFZJUVIgY3NWSVFSIH0KKyAgICB7IEtPSTgtUiBjc0tPSThSIH0KKyAgICB7IElCTTAwODU4IENDU0lEMDA4NTggQ1AwMDg1OCBQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8gfQorICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQorICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KKyAgICB7IElCTTAxMTQxIENDU0lEMDExNDEgQ1AwMTE0MSBlYmNkaWMtZGUtMjczK2V1cm8gfQorICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQorICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQorICAgIHsgSUJNMDExNDQgQ0NTSUQwMTE0NCBDUDAxMTQ0IGViY2RpYy1pdC0yODArZXVybyB9CisgICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KKyAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQorICAgIHsgSUJNMDExNDcgQ0NTSUQwMTE0NyBDUDAxMTQ3IGViY2RpYy1mci0yOTcrZXVybyB9CisgICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQorICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CisgICAgeyBJQk0xMDQ3IElCTS0xMDQ3IH0KKyAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KKyAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQorICAgIHsgVU5JQ09ERS0xLTEgY3NVbmljb2RlMTEgfQorICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KKyAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CisgICAgeyBVTklDT0RFLTEtMS1VVEYtNyBjc1VuaWNvZGUxMVVURjcgfQorICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCisgICAgICBsOCB9CisgICAgeyBJU08tODg1OS0xNSBJU09fODg1OS0xNSBMYXRpbi05IH0KKyAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CisgICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQorICAgIHsgSklTX0VuY29kaW5nIGNzSklTRW5jb2RpbmcgfQorICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQorICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKKyAgICAgIEVVQy1KUCB9CisgICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQorICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CisgICAgeyBJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEgY3NVbmljb2RlTGF0aW4xIElTTy0xMDY0NiB9CisgICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQorICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNzYgY3NVbmljb2RlSUJNMTI3NiB9CisgICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQorICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xIGNzV2luZG93czMwTGF0aW4xIH0KKyAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CisgICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CisgICAgeyBJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSBjc1dpbmRvd3MzMUxhdGluNSB9CisgICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CisgICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KKyAgICB7IFZlbnR1cmEtSW50ZXJuYXRpb25hbCBjc1ZlbnR1cmFJbnRlcm5hdGlvbmFsIH0KKyAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KKyAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CisgICAgeyBJQk0tU3ltYm9scyBjc0lCTVN5bWJvbHMgfQorICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KKyAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CisgICAgeyBIUC1QaS1mb250IGNzSFBQaUZvbnQgfQorICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KKyAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KKyAgICB7IEhQLURlc2tUb3AgY3NIUERlc2t0b3AgfQorICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQorICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KKyAgICB7IFdpbmRvd3MtMzFKIGNzV2luZG93czMxSiB9CisgICAgeyBHQjIzMTIgY3NHQjIzMTIgfQorICAgIHsgQmlnNSBjc0JpZzUgfQorfQorCitwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CisgICAgZ2xvYmFsIGVuY29kaW5nX2FsaWFzZXMKKyAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQorICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCisgICAgc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgJGVuY10KKyAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KKyAgICBpZiB7JGkgPCAwfSB7CisJIyBsb29rIGZvciAiaXNvbm5uIiBpbnN0ZWFkIG9mICJpc28tbm5uIiBvciAiaXNvX25ubiIKKwlpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CisJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KKwl9CisgICAgfQorICAgIGlmIHskaSA8IDB9IHsKKwlmb3JlYWNoIGwgJGVuY29kaW5nX2FsaWFzZXMgeworCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQorCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCisJICAgICMgbG9vayB0aHJvdWdoIHRoZSBhbGlhc2VzIGZvciBvbmUgdGhhdCB0Y2wga25vd3MgYWJvdXQKKwkgICAgZm9yZWFjaCBlICRsbCB7CisJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KKwkJaWYgeyRpIDwgMH0geworCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CisJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQorCQkgICAgfQorCQl9CisJCWlmIHskaSA+PSAwfSBicmVhaworCSAgICB9CisJICAgIGJyZWFrCisJfQorICAgIH0KKyAgICBpZiB7JGkgPj0gMH0geworCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KKyAgICB9CisgICAgcmV0dXJuIHt9Cit9CisKKyMgZGVmYXVsdHMuLi4KK3NldCBkYXRlbW9kZSAwCitzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCitzZXQgd3Jjb21jbWQgImdpdCBkaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKKworc2V0IGdpdGVuY29kaW5nIHt9CitjYXRjaCB7CisgICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdCBjb25maWcgLS1nZXQgaTE4bi5jb21taXRlbmNvZGluZ10KK30KK2lmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKKyAgICBzZXQgZ2l0ZW5jb2RpbmcgInV0Zi04IgorfQorc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQoraWYgeyR0Y2xlbmNvZGluZyA9PSB7fX0geworICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCit9CisKK3NldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CitzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0KK3NldCB1aWZvbnQge0hlbHZldGljYSA5IGJvbGR9CitzZXQgZmluZG1lcmdlZmlsZXMgMAorc2V0IG1heGdyYXBocGN0IDUwCitzZXQgbWF4d2lkdGggMTYKK3NldCByZXZsaXN0b3JkZXIgMAorc2V0IGZhc3RkYXRlIDAKK3NldCB1cGFycm93bGVuIDcKK3NldCBkb3duYXJyb3dsZW4gNworc2V0IG1pbmdhcGxlbiAzMAorc2V0IGNtaXRtb2RlICJwYXRjaCIKK3NldCB3cmFwY29tbWVudCAibm9uZSIKK3NldCBzaG93bmVhcnRhZ3MgMQorCitzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0KK3NldCBiZ2NvbG9yIHdoaXRlCitzZXQgZmdjb2xvciBibGFjaworc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0KKworY2F0Y2gge3NvdXJjZSB+Ly5naXRrfQorCitmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKKworc2V0IHJldnRyZWVhcmdzIHt9Citmb3JlYWNoIGFyZyAkYXJndiB7CisgICAgc3dpdGNoIC1yZWdleHAgLS0gJGFyZyB7CisJIl4kIiB7IH0KKwkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KKwlkZWZhdWx0IHsKKwkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCisJfQorICAgIH0KK30KKworIyBjaGVjayB0aGF0IHdlIGNhbiBmaW5kIGEgLmdpdCBkaXJlY3Rvcnkgc29tZXdoZXJlLi4uCitzZXQgZ2l0ZGlyIFtnaXRkaXJdCitpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CisgICAgc2hvd19lcnJvciB7fSAuICJDYW5ub3QgZmluZCB0aGUgZ2l0IGRpcmVjdG9yeSBcIiRnaXRkaXJcIi4iCisgICAgZXhpdCAxCit9CisKK3NldCBjbWRsaW5lX2ZpbGVzIHt9CitzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHJldnRyZWVhcmdzICItLSJdCitpZiB7JGkgPj0gMH0geworICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJHJldnRyZWVhcmdzIFtleHByIHskaSArIDF9XSBlbmRdCisgICAgc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgW2V4cHIgeyRpIC0gMX1dXQorfSBlbHNlaWYgeyRyZXZ0cmVlYXJncyBuZSB7fX0geworICAgIGlmIHtbY2F0Y2ggeworCXNldCBmIFtldmFsIGV4ZWMgZ2l0IHJldi1wYXJzZSAtLW5vLXJldnMgLS1uby1mbGFncyAkcmV2dHJlZWFyZ3NdCisJc2V0IGNtZGxpbmVfZmlsZXMgW3NwbGl0ICRmICJcbiJdCisJc2V0IG4gW2xsZW5ndGggJGNtZGxpbmVfZmlsZXNdCisJc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgZW5kLSRuXQorICAgIH0gZXJyXX0geworCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAorCSMgc28gbG9vayBmb3IgImZhdGFsOiIuCisJc2V0IGkgW3N0cmluZyBmaXJzdCAiZmF0YWw6IiAkZXJyXQorCWlmIHskaSA+IDB9IHsKKwkgICAgc2V0IGVyciBbc3RyaW5nIHJhbmdlICRlcnIgW2V4cHIgeyRpICsgNn1dIGVuZF0KKwl9CisJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgorCWV4aXQgMQorICAgIH0KK30KKworc2V0IGhpc3Rvcnkge30KK3NldCBoaXN0b3J5aW5kZXggMAorc2V0IGZoX3NlcmlhbCAwCitzZXQgbmhsX25hbWVzIHt9CitzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CitzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKK3NldCBib2xkcm93cyB7fQorc2V0IGJvbGRuYW1lcm93cyB7fQorc2V0IGRpZmZlbGlkZSB7MCAwfQorCitzZXQgb3B0aW1fZGVsYXkgMTYKKworc2V0IG5leHR2aWV3bnVtIDEKK3NldCBjdXJ2aWV3IDAKK3NldCBzZWxlY3RlZHZpZXcgMAorc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKK3NldCB2aWV3ZmlsZXMoMCkge30KK3NldCB2aWV3cGVybSgwKSAwCitzZXQgdmlld2FyZ3MoMCkge30KKworc2V0IGNtZGxpbmVvayAwCitzZXQgc3RvcHBlZCAwCitzZXQgc3R1ZmZzYXZlZCAwCitzZXQgcGF0Y2hudW0gMAorc2V0Y29vcmRzCittYWtld2luZG93Cit3bSB0aXRsZSAuICJbZmlsZSB0YWlsICRhcmd2MF06IFtmaWxlIHRhaWwgW3B3ZF1dIgorcmVhZHJlZnMKKworaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0geworICAgICMgY3JlYXRlIGEgdmlldyBmb3IgdGhlIGZpbGVzL2RpcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICBzZXQgY3VydmlldyAxCisgICAgc2V0IHNlbGVjdGVkdmlldyAxCisgICAgc2V0IG5leHR2aWV3bnVtIDIKKyAgICBzZXQgdmlld25hbWUoMSkgIkNvbW1hbmQgbGluZSIKKyAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCisgICAgc2V0IHZpZXdhcmdzKDEpICRyZXZ0cmVlYXJncworICAgIHNldCB2aWV3cGVybSgxKSAwCisgICAgYWRkdmlld21lbnUgMQorICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIG5vcm1hbAorICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRGVsZXRlKiAtc3RhdGUgbm9ybWFsCit9CisKK2lmIHtbaW5mbyBleGlzdHMgcGVybXZpZXdzXX0geworICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKKwlzZXQgbiAkbmV4dHZpZXdudW0KKwlpbmNyIG5leHR2aWV3bnVtCisJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCisJc2V0IHZpZXdmaWxlcygkbikgW2xpbmRleCAkdiAxXQorCXNldCB2aWV3YXJncygkbikgW2xpbmRleCAkdiAyXQorCXNldCB2aWV3cGVybSgkbikgMQorCWFkZHZpZXdtZW51ICRuCisgICAgfQorfQorZ2V0Y29tbWl0cwpkaWZmIC0tZ2l0IGEvZ2l0d2ViL0lOU1RBTEwgYi9naXR3ZWIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI4ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL0lOU1RBTEwKQEAgLTAsMCArMSwyMjUgQEAKK0dJVCB3ZWIgSW50ZXJmYWNlIChnaXR3ZWIpIEluc3RhbGxhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpcnN0IHlvdSBoYXZlIHRvIGdlbmVyYXRlIGdpdHdlYi5jZ2kgZnJvbSBnaXR3ZWIucGVybCB1c2luZworIm1ha2UgZ2l0d2ViL2dpdHdlYi5jZ2kiLCB0aGVuIGNvcHkgYXBwcm9wcmlhdGUgZmlsZXMgKGdpdHdlYi5jZ2ksCitnaXR3ZWIuY3NzLCBnaXQtbG9nby5wbmcgYW5kIGdpdC1mYXZpY29uLnBuZykgdG8gdGhlaXIgZGVzdGluYXRpb24uCitGb3IgZXhhbXBsZSBpZiBnaXQgd2FzIChvciBpcykgaW5zdGFsbGVkIHdpdGggL3VzciBwcmVmaXgsIHlvdSBjYW4gZG8KKworCSQgbWFrZSBwcmVmaXg9L3VzciBnaXR3ZWIvZ2l0d2ViLmNnaSAgOyMgYXMgeW91cnNlbGYKKwkjIGNwIGdpdHdlYi9naXQqIC92YXIvd3d3L2NnaS1iaW4vICAgIDsjIGFzIHJvb3QKKworQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSBhdXRvY29uZiBnZW5lcmF0ZWQgLi9jb25maWd1cmUgc2NyaXB0IHRvCitzZXQgdXAgcGF0aCB0byBnaXQgYmluYXJpZXMgKHZpYSBjb25maWcubWFrLmF1dG9nZW4pLCBzbyB5b3UgY2FuIHdyaXRlCitpbnN0ZWFkCisKKwkkIG1ha2UgY29uZmlndXJlICAgICAgICAgICAgICAgICAgICAgOyMgYXMgeW91cnNlbGYKKwkkIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IgICAgICAgICAgOyMgYXMgeW91cnNlbGYKKwkkIG1ha2UgZ2l0d2ViL2dpdHdlYi5jZ2kgICAgICAgICAgICAgOyMgYXMgeW91cnNlbGYKKwkjIGNwIGdpdHdlYi9naXQqIC92YXIvd3d3L2NnaS1iaW4vICAgOyMgYXMgcm9vdAorCitUaGUgYWJvdmUgZXhhbXBsZSBhc3N1bWVzIHRoYXQgeW91ciB3ZWIgc2VydmVyIGlzIGNvbmZpZ3VyZWQgdG8gcnVuCitbZXhlY3V0YWJsZV0gZmlsZXMgaW4gL3Zhci93d3cvY2dpLWJpbi8gYXMgc2VydmVyIHNjcmlwdHMgKGFzIENHSQorc2NyaXB0cykuCisKKworQnVpbGQgdGltZSBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIGFsc28gIkhvdyB0byBjb25maWd1cmUgZ2l0d2ViIGZvciB5b3VyIGxvY2FsIHN5c3RlbSIgaW4gUkVBRE1FCitmaWxlIGZvciBnaXR3ZWIgKGluIGdpdHdlYi9SRUFETUUpLgorCistIFRoZXJlIGFyZSBtYW55IGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHdoaWNoIGFmZmVjdHMgYnVpbGRpbmcgb2YKKyAgZ2l0d2ViLmNnaTsgc2VlICJkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGdpdHdlYiIgc2VjdGlvbiBpbiBtYWluCisgICh0b3AgZGlyKSBNYWtlZmlsZSwgYW5kIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgZ2l0d2ViL2dpdHdlYi5jZ2kKKyAgdGFyZ2V0LgorCisgIE9uZSBvZiBtb3N0IGltcG9ydGFudCBpcyB3aGVyZSB0byBmaW5kIGdpdCB3cmFwcGVyIGJpbmFyeS4gR2l0d2ViCisgIHRyaWVzIHRvIGZpbmQgZ2l0IHdyYXBwZXIgYXQgJChiaW5kaXIpL2dpdCwgc28geW91IGhhdmUgdG8gc2V0ICRiaW5kaXIKKyAgd2hlbiBidWlsZGluZyBnaXR3ZWIuY2dpLCBvciAkcHJlZml4IGZyb20gd2hpY2ggJGJpbmRpciBpcyBkZXJpdmVkLiBJZgorICB5b3UgYnVpbGQgYW5kIGluc3RhbGwgZ2l0d2ViIHRvZ2V0aGVyIHdpdGggdGhlIHJlc3Qgb2YgZ2l0IHN1aXRlLAorICB0aGVyZSBzaG91bGQgYmUgbm8gcHJvYmxlbXMuIE90aGVyd2lzZSwgaWYgZ2l0IHdhcyBmb3IgZXhhbXBsZQorICBpbnN0YWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlLCB5b3UgaGF2ZSB0byBzZXQgJHByZWZpeCAob3IgJGJpbmRpcikKKyAgYWNjb3JkaW5nbHkuCisKKy0gQW5vdGhlciBpbXBvcnRhbnQgaXNzdWUgaXMgd2hlcmUgYXJlIGdpdCByZXBvc2l0b3JpZXMgeW91IHdhbnQgdG8gbWFrZQorICBhdmFpbGFibGUgdG8gZ2l0d2ViLiBCeSBkZWZhdWx0IGdpdHdlYiBzZWFyY2ggZm9yIHJlcG9zaXRvcmllcyB1bmRlcgorICAvcHViL2dpdDsgaWYgeW91IHdhbnQgdG8gaGF2ZSBwcm9qZWN0cyBzb21ld2hlcmUgZWxzZSwgbGlrZSAvaG9tZS9naXQsCisgIHVzZSBHSVRXRUJfUFJPSkVDVFJPT1QgYnVpbGQgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KKworICBCeSBkZWZhdWx0IGFsbCBnaXQgcmVwb3NpdG9yaWVzIHVuZGVyIHByb2plY3Ryb290IGFyZSB2aXNpYmxlIGFuZAorICBhdmFpbGFibGUgdG8gZ2l0d2ViLiBMaXN0IG9mIHByb2plY3RzIGlzIGdlbmVyYXRlZCBieSBkZWZhdWx0IGJ5CisgIHNjYW5uaW5nIHRoZSBwcm9qZWN0cm9vdCBkaXJlY3RvcnkgZm9yIGdpdCByZXBvc2l0b3JpZXMuIFRoaXMgY2FuIGJlCisgIGNoYW5nZWQgKGNvbmZpZ3VyZWQpIGFzIGRlc2NyaWJlZCBpbiAiR2l0d2ViIHJlcG9zaXRvcmllcyIgc2VjdGlvbgorICBiZWxvdy4KKworICBOb3RlIHRoYXQgZ2l0d2ViIGRlYWxzIGRpcmVjdGx5IHdpdGggb2JqZWN0IGRhdGFiYXNlLCBhbmQgZG9lcyBub3QKKyAgbmVlZCB3b3JraW5nIGRpcmVjdG9yeTsgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgaXMgdGhlIG5hbWUgb2YgaXRzCisgIHJlcG9zaXRvcnkgb2JqZWN0IGRhdGFiYXNlLCB1c3VhbGx5IHByb2plY3RuYW1lLmdpdCBmb3IgYmFyZQorICByZXBvc2l0b3JpZXMuIElmIHlvdSB3YW50IHRvIHByb3ZpZGUgZ2l0d2ViIGFjY2VzcyB0byBub24tYmFyZSAobGl2ZSkKKyAgcmVwb3NpdG9yeSwgeW91IGNhbiBtYWtlIHByb2plY3RuYW1lLmdpdCBzeW1ib2xpYyBsaW5rIHVuZGVyCisgIHByb2plY3Ryb290IGxpbmtpbmcgdG8gcHJvamVjdG5hbWUvLmdpdCAoYnV0IGl0IGlzIGp1c3QKKyAgYSBzdWdnZXN0aW9uKS4KKworLSBZb3UgY2FuIGNvbnRyb2wgd2hlcmUgZ2l0d2ViIHRyaWVzIHRvIGZpbmQgaXRzIG1haW4gQ1NTIHN0eWxlIGZpbGUsCisgIGl0cyBmYXZpY29uIGFuZCBsb2dvIHdpdGggR0lUV0VCX0NTUywgR0lUV0VCX0ZBVklDT04gYW5kIEdJVFdFQl9MT0dPCisgIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLiBCeSBkZWZhdWx0IGdpdHdlYiB0cmllcyB0byBmaW5kIHRoZW0KKyAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGdpdHdlYi5jZ2kgc2NyaXB0LgorCitCdWlsZCBleGFtcGxlCit+fn5+fn5+fn5+fn5+CisKKy0gVG8gaW5zdGFsbCBnaXR3ZWIgdG8gL3Zhci93d3cvY2dpLWJpbi9naXR3ZWIvIHdoZW4gZ2l0IHdyYXBwZXIKKyAgaXMgaW5zdGFsbGVkIGF0IC91c3IvbG9jYWwvYmluL2dpdCBhbmQgdGhlIHJlcG9zaXRvcmllcyAocHJvamVjdHMpCisgIHdlIHdhbnQgdG8gZGlzcGxheSBhcmUgdW5kZXIgL2hvbWUvbG9jYWwvc2NtLCB5b3UgY2FuIGRvCisKKwltYWtlIEdJVFdFQl9QUk9KRUNUUk9PVD0iL2hvbWUvbG9jYWwvc2NtIiBcCisJICAgICBHSVRXRUJfQ1NTPSIvZ2l0d2ViL2dpdHdlYi5jc3MiIFwKKwkgICAgIEdJVFdFQl9MT0dPPSIvZ2l0d2ViL2dpdC1sb2dvLnBuZyIgXAorCSAgICAgR0lUV0VCX0ZBVklDT049Ii9naXR3ZWIvZ2l0LWZhdmljb24ucG5nIiBcCisJICAgICBiaW5kaXI9L3Vzci9sb2NhbC9iaW4gXAorCSAgICAgZ2l0d2ViL2dpdHdlYi5jZ2kKKworCWNwIC1mdiB+L2dpdC9naXR3ZWIvZ2l0d2ViLntjZ2ksY3NzfSBcCisJICAgICAgIH4vZ2l0L2dpdHdlYi9naXQte2Zhdmljb24sbG9nb30ucG5nIFwKKwkgICAgIC92YXIvd3d3L2NnaS1iaW4vZ2l0d2ViLworCisKK0dpdHdlYiBjb25maWcgZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NlZSBhbHNvICJSdW50aW1lIGdpdHdlYiBjb25maWd1cmF0aW9uIiBzZWN0aW9uIGluIFJFQURNRSBmaWxlCitmb3IgZ2l0d2ViIChpbiBnaXR3ZWIvUkVBRE1FKS4KKworLSBZb3UgY2FuIGNvbmZpZ3VyZSBnaXR3ZWIgZnVydGhlciB1c2luZyBnaXR3ZWIgY29uZmlndXJhdGlvbiBmaWxlOworICBieSBkZWZhdWx0IGl0IGlzIGZpbGUgbmFtZWQgZ2l0d2ViX2NvbmZpZy5wZXJsIGluIHRoZSBzYW1lIHBsYWNlIGFzCisgIGdpdHdlYi5jZ2kgc2NyaXB0LiBZb3UgY2FuIGNvbnRyb2wgZGVmYXVsdCBwbGFjZSBmb3IgY29uZmlnIGZpbGUKKyAgdXNpbmcgR0lUV0VCX0NPTkZJRyBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLCBhbmQgeW91IGNhbiBzZXQgaXQKKyAgdXNpbmcgR0lUV0VCX0NPTkZJRyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlLgorCistIEdpdHdlYiBjb25maWcgZmlsZSBpcyBbZnJhZ21lbnRdIG9mIHBlcmwgY29kZS4gWW91IGNhbiBzZXQgdmFyaWFibGVzCisgIHVzaW5nICJvdXIgJHZhcmlhYmxlID0gdmFsdWUiOyB0ZXh0IGZyb20gIiMiIGNoYXJhY3RlciB1bnRpbCB0aGUgZW5kCisgIG9mIGEgbGluZSBpcyBpZ25vcmVkLiBTZWUgcGVybHN5bigxKSBmb3IgZGV0YWlscy4KKworICBTZWUgdGhlIHRvcCBvZiBnaXR3ZWIucGVybCBmaWxlIGZvciBleGFtcGxlcyBvZiBjdXN0b21pemFibGUgb3B0aW9ucy4KKworQ29uZmlnIGZpbGUgZXhhbXBsZQorfn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyBlbmFibGUgYmxhbWUsIHBpY2theGUgc2VhcmNoLCBhbmQgc25hcHNob3Qgc3VwcG9ydCwgd2hpbGUgYWxsb3dpbmcKK2luZGl2aWR1YWwgcHJvamVjdHMgdG8gdHVybiB0aGVtIG9mZiwgcHV0IHRoZSBmb2xsb3dpbmcgaW4geW91cgorR0lUV0VCX0NPTkZJRyBmaWxlOgorCisJJGZlYXR1cmV7J2JsYW1lJ317J2RlZmF1bHQnfSA9IFsxXTsKKwkkZmVhdHVyZXsnYmxhbWUnfXsnb3ZlcnJpZGUnfSA9IDE7CisKKwkkZmVhdHVyZXsncGlja2F4ZSd9eydkZWZhdWx0J30gPSBbMV07CisJJGZlYXR1cmV7J3BpY2theGUnfXsnb3ZlcnJpZGUnfSA9IDE7CisKKwkkZmVhdHVyZXsnc25hcHNob3QnfXsnZGVmYXVsdCd9ID0gWyd4LWd6aXAnLCAnZ3onLCAnZ3ppcCddOworCSRmZWF0dXJleydzbmFwc2hvdCd9eydvdmVycmlkZSd9ID0gMTsKKworCitHaXR3ZWIgcmVwb3NpdG9yaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQnkgZGVmYXVsdCBhbGwgZ2l0IHJlcG9zaXRvcmllcyB1bmRlciBwcm9qZWN0cm9vdCBhcmUgdmlzaWJsZSBhbmQKKyAgYXZhaWxhYmxlIHRvIGdpdHdlYi4gTGlzdCBvZiBwcm9qZWN0cyBpcyBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBieQorICBzY2FubmluZyB0aGUgcHJvamVjdHJvb3QgZGlyZWN0b3J5IGZvciBnaXQgcmVwb3NpdG9yaWVzIChmb3Igb2JqZWN0CisgIGRhdGFiYXNlcyB0byBiZSBtb3JlIGV4YWN0KS4KKworICBZb3UgY2FuIHByb3ZpZGUgcHJlLWdlbmVyYXRlZCBsaXN0IG9mIFt2aXNpYmxlXSByZXBvc2l0b3JpZXMsCisgIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgb3duZXJzICh0aGUgcHJvamVjdCBvd25lcnNoaXAKKyAgaXMgdGFrZW4gZnJvbSBvd25lciBvZiByZXBvc2l0b3J5IGRpcmVjdG9yeSBvdGhlcndpc2UpLCBieSBzZXR0aW5nCisgIEdJVFdFQl9MSVNUIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKG9yICRwcm9qZWN0c19saXN0IHZhcmlhYmxlCisgIGluIGdpdHdlYiBjb25maWcgZmlsZSkgdG8gcG9pbnQgdG8gYSBwbGFpbiBmaWxlLgorCisgIEVhY2ggbGluZSBvZiBwcm9qZWN0cyBsaXN0IGZpbGUgc2hvdWxkIGNvbnNpc3Qgb2YgdXJsLWVuY29kZWQgcGF0aAorICB0byBwcm9qZWN0IHJlcG9zaXRvcnkgZGF0YWJhc2UgKHJlbGF0aXZlIHRvIHByb2plY3Ryb290KSBzZXBhcmF0ZWQKKyAgYnkgc3BhY2UgZnJvbSB1cmwtZW5jb2RlZCBwcm9qZWN0IG93bmVyOyBzcGFjZXMgaW4gYm90aCBwcm9qZWN0IHBhdGgKKyAgYW5kIHByb2plY3Qgb3duZXIgaGF2ZSB0byBiZSBlbmNvZGVkIGFzIGVpdGhlciAnJTIwJyBvciAnKycuCisKKyAgWW91IGNhbiBnZW5lcmF0ZSBwcm9qZWN0cyBsaXN0IGluZGV4IGZpbGUgdXNpbmcgcHJvamVjdF9pbmRleCBhY3Rpb24KKyAgKHRoZSAnVFhUJyBsaW5rIG9uIHByb2plY3RzIGxpc3QgcGFnZSkgZGlyZWN0bHkgZnJvbSBnaXR3ZWIuCisKKy0gQnkgZGVmYXVsdCBldmVuIGlmIHByb2plY3QgaXMgbm90IHZpc2libGUgb24gcHJvamVjdHMgbGlzdCBwYWdlLCB5b3UKKyAgY2FuIHZpZXcgaXQgbmV2ZXJ0aGVsZXNzIGJ5IGhhbmQtY3JhZnRpbmcgZ2l0d2ViIFVSTC4gWW91IGNhbiBzZXQKKyAgR0lUV0VCX1NUUklDVF9FWFBPUlQgYnVpbGQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAob3IgJHN0cmljdF9leHBvcnQKKyAgdmFyaWFibGUgaW4gZ2l0d2ViIGNvbmZpZyBmaWxlKSB0byBvbmx5IGFsbG93IHZpZXdpbmcgb2YKKyAgcmVwb3NpdG9yaWVzIGFsc28gc2hvd24gb24gdGhlIG92ZXJ2aWV3IHBhZ2UuCisKKy0gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjb25maWd1cmUgZ2l0d2ViIHRvIG9ubHkgbGlzdCBhbmQgYWxsb3cKKyAgdmlld2luZyBvZiB0aGUgZXhwbGljaXRseSBleHBvcnRlZCByZXBvc2l0b3JpZXMsIHZpYQorICBHSVRXRUJfRVhQT1JUX09LIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKG9yICRleHBvcnRfb2sKKyAgdmFyaWFibGUgaW4gZ2l0d2ViIGNvbmZpZyBmaWxlKS4gSWYgaXQgZXZhbHVhdGVzIHRvIHRydWUsIGdpdHdlYgorICBzaG93IHJlcG9zaXRvcnkgb25seSBpZiB0aGlzIGZpbGUgZXhpc3RzIGluIGl0cyBvYmplY3QgZGF0YWJhc2UKKyAgKGlmIGRpcmVjdG9yeSBoYXMgdGhlIG1hZ2ljIGZpbGUgJGV4cG9ydF9vaykuCisKK0dlbmVyYXRpbmcgcHJvamVjdHMgbGlzdCB1c2luZyBnaXR3ZWIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV2UgYXNzdW1lIHRoYXQgR0lUV0VCX0NPTkZJRyBoYXMgaXRzIGRlZmF1bHQgTWFrZWZpbGUgdmFsdWUsIG5hbWVseQorZ2l0d2ViX2NvbmZpZy5wZXJsLiBQdXQgdGhlIGZvbGxvd2luZyBpbiBnaXR3ZWJfbWFrZV9pbmRleC5wZXJsIGZpbGU6CisKKwkkR0lUV0VCX0NPTkZJRyA9ICJnaXR3ZWJfY29uZmlnLnBlcmwiOworCWRvICRHSVRXRUJfQ09ORklHIGlmIC1lICRHSVRXRUJfQ09ORklHOworCisJJHByb2plY3RzX2xpc3QgPSAkcHJvamVjdHJvb3Q7CisKK1RoZW4gY3JlYXRlIHRoZSBmb2xsb3dpbmcgc2NyaXB0IHRvIGdldCBsaXN0IG9mIHByb2plY3QgaW4gdGhlIGZvcm1hdAorc3VpdGFibGUgZm9yIEdJVFdFQl9MSVNUIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKG9yCiskcHJvamVjdHNfbGlzdCB2YXJpYWJsZSBpbiBnaXR3ZWIgY29uZmlnKToKKworCSMhL2Jpbi9zaAorCisJZXhwb3J0IEdJVFdFQl9DT05GSUc9ImdpdHdlYl9tYWtlX2luZGV4LnBlcmwiCisJZXhwb3J0IEdBVEVXQVlfSU5URVJGQUNFPSJDR0kvMS4xIgorCWV4cG9ydCBIVFRQX0FDQ0VQVD0iKi8qIgorCWV4cG9ydCBSRVFVRVNUX01FVEhPRD0iR0VUIgorCWV4cG9ydCBRVUVSWV9TVFJJTkc9ImE9cHJvamVjdF9pbmRleCIKKworCXBlcmwgLS0gL3Zhci93d3cvY2dpLWJpbi9naXR3ZWIuY2dpCisKKworUmVxdWlyZW1lbnRzCistLS0tLS0tLS0tLS0KKworIC0gQ29yZSBnaXQgdG9vbHMKKyAtIFBlcmwKKyAtIFBlcmwgbW9kdWxlczogQ0dJLCBFbmNvZGUsIEZjbnRsLCBGaWxlOjpGaW5kLCBGaWxlOjpCYXNlbmFtZS4KKyAtIHdlYiBzZXJ2ZXIKKworCitFeGFtcGxlIHdlYiBzZXJ2ZXIgY29uZmlndXJhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworU2VlIGFsc28gIldlYnNlcnZlciBjb25maWd1cmF0aW9uIiBzZWN0aW9uIGluIFJFQURNRSBmaWxlIGZvciBnaXR3ZWIKKyhpbiBnaXR3ZWIvUkVBRE1FKS4KKworCistIEFwYWNoZTIsIGdpdHdlYiBpbnN0YWxsZWQgYXMgQ0dJIHNjcmlwdCwKKyAgdW5kZXIgL3Zhci93d3cvY2dpLWJpbi8KKworCVNjcmlwdEFsaWFzIC9jZ2ktYmluLyAiL3Zhci93d3cvY2dpLWJpbi8iCisKKwk8RGlyZWN0b3J5ICIvdmFyL3d3dy9jZ2ktYmluIj4KKwkgICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bWxpbmtzIEV4ZWNDR0kKKwkgICAgQWxsb3dPdmVycmlkZSBOb25lCisJICAgIE9yZGVyIGFsbG93LGRlbnkKKwkgICAgQWxsb3cgZnJvbSBhbGwKKwk8L0RpcmVjdG9yeT4KKworLSBBcGFjaGUyLCBnaXR3ZWIgaW5zdGFsbGVkIGFzIG1vZF9wZXJsIGxlZ2FjeSBzY3JpcHQsCisgIHVuZGVyIC92YXIvd3d3L3BlcmwvCisKKwlBbGlhcyAvcGVybCAiL3Zhci93d3cvcGVybCIKKworCTxEaXJlY3RvcnkgIi92YXIvd3d3L3BlcmwiPgorCSAgICBTZXRIYW5kbGVyIHBlcmwtc2NyaXB0CisJICAgIFBlcmxSZXNwb25zZUhhbmRsZXIgTW9kUGVybDo6UmVnaXN0cnkKKwkgICAgUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycworCSAgICBPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltbGlua3MgK0V4ZWNDR0kKKwkgICAgQWxsb3dPdmVycmlkZSBOb25lCisJICAgIE9yZGVyIGFsbG93LGRlbnkKKwkgICAgQWxsb3cgZnJvbSBhbGwKKwk8L0RpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL2dpdHdlYi9SRUFETUUgYi9naXR3ZWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmU5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvUkVBRE1FCkBAIC0wLDAgKzEsODIgQEAKK0dJVCB3ZWIgSW50ZXJmYWNlCis9PT09PT09PT09PT09PT09PQorCitUaGUgb25lIHdvcmtpbmcgb246CisgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9naXQvCisKK0Zyb20gdGhlIGdpdCB2ZXJzaW9uIDEuNC4wIGdpdHdlYiBpcyBidW5kbGVkIHdpdGggZ2l0LgorCisKK0hvdyB0byBjb25maWd1cmUgZ2l0d2ViIGZvciB5b3VyIGxvY2FsIHN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHdoZW4gYnVpbGRpbmcgR0lUOgorICogR0lUV0VCX1NJVEVOQU1FCisgICBTaG93biBpbiB0aGUgdGl0bGUgb2YgYWxsIGdlbmVyYXRlZCBwYWdlcywgZGVmYXVsdHMgdG8gdGhlIHNlcnZlcnMgbmFtZS4KKyAqIEdJVFdFQl9QUk9KRUNUUk9PVAorICAgVGhlIHJvb3QgZGlyZWN0b3J5IGZvciBhbGwgcHJvamVjdHMgc2hvd24gYnkgZ2l0d2ViLgorICogR0lUV0VCX0xJU1QKKyAgIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0byBzY2FuIGZvciBwcm9qZWN0cyAoZGVmYXVsdHMgdG8gcHJvamVjdCByb290KQorICAgb3IgdG8gYSBmaWxlIGZvciBleHBsaWNpdCBsaXN0aW5nIG9mIHByb2plY3RzLgorICogR0lUV0VCX0hPTUVURVhUCisgICBwb2ludHMgdG8gYW4gLmh0bWwgZmlsZSB3aGljaCBpcyBpbmNsdWRlZCBvbiB0aGUgZ2l0d2ViIHByb2plY3QKKyAgIG92ZXJ2aWV3IHBhZ2UuCisgKiBHSVRXRUJfQ1NTCisgICBQb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSBwdXQgZ2l0d2ViLmNzcyBvbiB5b3VyIHdlYiBzZXJ2ZXIuCisgKiBHSVRXRUJfTE9HTworICAgUG9pbnRzIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgcHV0IGdpdC1sb2dvLnBuZyBvbiB5b3VyIHdlYiBzZXJ2ZXIuCisgKiBHSVRXRUJfQ09ORklHCisgICBUaGlzIGZpbGUgd2lsbCBiZSBsb2FkZWQgdXNpbmcgJ3JlcXVpcmUnIGFuZCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhbnkKKyAgIG9mIHRoZSBvcHRpb25zIGFib3ZlIGFzIHdlbGwgYXMgc29tZSBvdGhlciBvcHRpb25zIC0gc2VlIHRoZSB0b3Agb2YKKyAgICdnaXR3ZWIuY2dpJyBmb3IgdGhlaXIgZnVsbCBsaXN0IGFuZCBkZXNjcmlwdGlvbi4gIElmIHRoZSBlbnZpcm9ubWVudAorICAgJEdJVFdFQl9DT05GSUcgaXMgc2V0IHdoZW4gZ2l0d2ViLmNnaSBpcyBleGVjdXRlZCB0aGUgZmlsZSBpbiB0aGUKKyAgIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgbG9hZGVkIGluc3RlYWQgb2YgdGhlIGZpbGUKKyAgIHNwZWNpZmllZCB3aGVuIGdpdHdlYi5jZ2kgd2FzIGNyZWF0ZWQuCisKKworUnVudGltZSBnaXR3ZWIgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFkanVzdCBnaXR3ZWIgYmVoYXZpb3VyIHVzaW5nIHRoZSBmaWxlIHNwZWNpZmllZCBpbiBgR0lUV0VCX0NPTkZJR2AKKyhkZWZhdWx0cyB0byAnZ2l0d2ViX2NvbmZpZy5wZXJsJyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIENHSSkuCitTZWUgdGhlIHRvcCBvZiAnZ2l0d2ViLmNnaScgZm9yIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBhbmQgc29tZSBkZXNjcmlwdGlvbi4KK1RoZSBtb3N0IG5vdGFibGUgdGhpbmcgdGhhdCBpcyBub3QgY29uZmlndXJhYmxlIGF0IGNvbXBpbGUgdGltZSBhcmUgdGhlCitvcHRpb25hbCBmZWF0dXJlcywgc3RvcmVkIGluIHRoZSAnJWZlYXR1cmVzJyB2YXJpYWJsZS4gWW91IGNhbiBmaW5kIGZ1cnRoZXIKK2Rlc2NyaXB0aW9uIG9uIGhvdyB0byByZWNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBmZWF0dXJlcyBzZXR0aW5nIGluIHlvdXIKK2BHSVRXRUJfQ09ORklHYCBvciBwZXItcHJvamVjdCBpbiBgcHJvamVjdC5naXQvY29uZmlnYCBpbnNpZGUgJ2dpdHdlYi5jZ2knLgorCisKK1dlYnNlcnZlciBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBoYXZlIG9uZSBVUkwgZm9yIGJvdGggZ2l0d2ViIGFuZCB5b3VyIGh0dHA6Ly8KK3JlcG9zaXRvcmllcywgeW91IGNhbiBjb25maWd1cmUgYXBhY2hlIGxpa2UgdGhpczoKKworPFZpcnR1YWxIb3N0IHd3dzo4MD4KKyAgICBTZXJ2ZXJOYW1lIGdpdC5kb21haW4ub3JnCisgICAgRG9jdW1lbnRSb290IC9wdWIvZ2l0CisgICAgUmV3cml0ZUVuZ2luZSBvbgorICAgIFJld3JpdGVSdWxlIF4vKC4qXC5naXQvKD8hLz8oaW5mb3xvYmplY3RzfHJlZnMpKS4qKT8kIC9jZ2ktYmluL2dpdHdlYi5jZ2kle1JFUVVFU1RfVVJJfSAgW0wsUFRdCisgICAgU2V0RW52CUdJVFdFQl9DT05GSUcJL2V0Yy9naXR3ZWIuY29uZgorPC9WaXJ0dWFsSG9zdD4KKworVGhlIGFib3ZlIGNvbmZpZ3VyYXRpb24gZXhwZWN0cyB5b3VyIHB1YmxpYyByZXBvc2l0b3JpZXMgdG8gbGl2ZSB1bmRlcgorL3B1Yi9naXQgYW5kIHdpbGwgc2VydmUgdGhlbSBhcyBodHRwOi8vZ2l0LmRvbWFpbi5vcmcvZGlyLXVuZGVyLXB1Yi1naXQsCitib3RoIGFzIGNsb25lYWJsZSBHSVQgVVJMIGFuZCBhcyBicm93c2VhYmxlIGdpdHdlYiBpbnRlcmZhY2UuCitJZiB5b3UgdGhlbiBzdGFydCB5b3VyIGdpdC1kYWVtb24gd2l0aCAtLWJhc2UtcGF0aD0vcHViL2dpdCAtLWV4cG9ydC1hbGwKK3RoZW4geW91IGNhbiBldmVuIHVzZSB0aGUgZ2l0Oi8vIFVSTCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcGF0aC4KKworU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0lUV0VCX0NPTkZJRyB3aWxsIHRlbGwgZ2l0d2ViIHRvIHVzZQordGhlIG5hbWVkIGZpbGUgKGkuZS4gaW4gdGhpcyBleGFtcGxlIC9ldGMvZ2l0d2ViLmNvbmYpIGFzIGEKK2NvbmZpZ3VyYXRpb24gZm9yIGdpdHdlYi4gIFBlcmwgdmFyaWFibGVzIGRlZmluZWQgaW4gaGVyZSB3aWxsCitvdmVycmlkZSB0aGUgZGVmYXVsdHMgZ2l2ZW4gYXQgdGhlIGhlYWQgb2YgdGhlIGdpdHdlYi5wZXJsIChvcgorZ2l0d2ViLmNnaSkuICBMb29rIGF0IHRoZSBjb21tZW50cyBpbiB0aGF0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uCit3aGljaCB2YXJpYWJsZXMgYW5kIHdoYXQgdGhleSBtZWFuLgorCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieToKKyAgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorCitBbnkgY29tbWVudC9xdWVzdGlvbi9jb25jZXJuIHRvOgorICBHaXQgbWFpbGluZyBsaXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPgorCmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0LWZhdmljb24ucG5nIGIvZ2l0d2ViL2dpdC1mYXZpY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYzN2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL2dpdC1mYXZpY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0LWxvZ28ucG5nIGIvZ2l0d2ViL2dpdC1sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFlOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL2dpdC1sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0d2ViLmNzcyBiL2dpdHdlYi9naXR3ZWIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDgyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvZ2l0d2ViLmNzcwpAQCAtMCwwICsxLDQ5MCBAQAorYm9keSB7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiBzbWFsbDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHg7CisJbWFyZ2luOiAxMHB4OworCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisJY29sb3I6ICMwMDAwMDA7Cit9CisKK2EgeworCWNvbG9yOiAjMDAwMGNjOworfQorCithOmhvdmVyLCBhOnZpc2l0ZWQsIGE6YWN0aXZlIHsKKwljb2xvcjogIzg4MDAwMDsKK30KKworc3Bhbi5jbnRybCB7CisJYm9yZGVyOiBkYXNoZWQgI2FhYWFhYTsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlwYWRkaW5nOiAwcHggMnB4IDBweCAycHg7CisJbWFyZ2luOiAgMHB4IDJweCAwcHggMnB4OworfQorCitpbWcubG9nbyB7CisJZmxvYXQ6IHJpZ2h0OworCWJvcmRlci13aWR0aDogMHB4OworfQorCitkaXYucGFnZV9oZWFkZXIgeworCWhlaWdodDogMjVweDsKKwlwYWRkaW5nOiA4cHg7CisJZm9udC1zaXplOiAxNTAlOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7Cit9CisKK2Rpdi5wYWdlX2hlYWRlciBhOnZpc2l0ZWQsIGEuaGVhZGVyIHsKKwljb2xvcjogIzAwMDBjYzsKK30KKworZGl2LnBhZ2VfaGVhZGVyIGE6aG92ZXIgeworCWNvbG9yOiAjODgwMDAwOworfQorCitkaXYucGFnZV9uYXYgeworCXBhZGRpbmc6IDhweDsKK30KKworZGl2LnBhZ2VfbmF2IGE6dmlzaXRlZCB7CisJY29sb3I6ICMwMDAwY2M7Cit9CisKK2Rpdi5wYWdlX3BhdGggeworCXBhZGRpbmc6IDhweDsKKwlmb250LXdlaWdodDogYm9sZDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweDsKK30KKworZGl2LnBhZ2VfZm9vdGVyIHsKKwloZWlnaHQ6IDE3cHg7CisJcGFkZGluZzogNHB4IDhweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZDlkOGQxOworfQorCitkaXYucGFnZV9mb290ZXJfdGV4dCB7CisJZmxvYXQ6IGxlZnQ7CisJY29sb3I6ICM1NTU1NTU7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCitkaXYucGFnZV9ib2R5IHsKKwlwYWRkaW5nOiA4cHg7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKworZGl2LnRpdGxlLCBhLnRpdGxlIHsKKwlkaXNwbGF5OiBibG9jazsKKwlwYWRkaW5nOiA2cHggOHB4OworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNlZGVjZTY7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjMDAwMDAwOworfQorCithLnRpdGxlOmhvdmVyIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZDlkOGQxOworfQorCitkaXYudGl0bGVfdGV4dCB7CisJcGFkZGluZzogNnB4IDBweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweDsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorCitkaXYubG9nX2JvZHkgeworCXBhZGRpbmc6IDhweCA4cHggOHB4IDE1MHB4OworfQorCitzcGFuLmFnZSB7CisJcG9zaXRpb246IHJlbGF0aXZlOworCWZsb2F0OiBsZWZ0OworCXdpZHRoOiAxNDJweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK3NwYW4uc2lnbm9mZiB7CisJY29sb3I6ICM4ODg4ODg7Cit9CisKK2Rpdi5sb2dfbGluayB7CisJcGFkZGluZzogMHB4IDhweDsKKwlmb250LXNpemU6IDcwJTsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKwlmb250LXN0eWxlOiBub3JtYWw7CisJcG9zaXRpb246IHJlbGF0aXZlOworCWZsb2F0OiBsZWZ0OworCXdpZHRoOiAxMzZweDsKK30KKworZGl2Lmxpc3RfaGVhZCB7CisJcGFkZGluZzogNnB4IDhweCA0cHg7CisJYm9yZGVyOiBzb2xpZCAjZDlkOGQxOworCWJvcmRlci13aWR0aDogMXB4IDBweCAwcHg7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCitkaXYuYXV0aG9yX2RhdGUgeworCXBhZGRpbmc6IDhweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweCAwcHg7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCithLmxpc3QgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogIzAwMDAwMDsKK30KKworYS5zdWJqZWN0LCBhLm5hbWUgeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit0YWJsZS50YWdzIGEuc3ViamVjdCB7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworYS5saXN0OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKwljb2xvcjogIzg4MDAwMDsKK30KKworYS50ZXh0IHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6ICMwMDAwY2M7Cit9CisKK2EudGV4dDp2aXNpdGVkIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6ICM4ODAwMDA7Cit9CisKK2EudGV4dDpob3ZlciB7CisJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisJY29sb3I6ICM4ODAwMDA7Cit9CisKK3RhYmxlIHsKKwlwYWRkaW5nOiA4cHggNHB4OworfQorCit0YWJsZS5wcm9qZWN0X2xpc3QgeworCWJvcmRlci1zcGFjaW5nOiAwOworfQorCit0YWJsZS5kaWZmX3RyZWUgeworCWJvcmRlci1zcGFjaW5nOiAwOworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKK3RhYmxlLmNvbWJpbmVkLmRpZmZfdHJlZSB0ZCB7CisJcGFkZGluZy1yaWdodDogMjRweDsKK30KKwordGFibGUuY29tYmluZWQuZGlmZl90cmVlIHRkLmxpbmsgeworCXBhZGRpbmc6IDBweCAycHg7Cit9CisKK3RhYmxlLmNvbWJpbmVkLmRpZmZfdHJlZSB0ZC5ub2NoYW5nZSBhIHsKKwljb2xvcjogIzY2NjZmZjsKK30KKwordGFibGUuY29tYmluZWQuZGlmZl90cmVlIHRkLm5vY2hhbmdlIGE6aG92ZXIsCit0YWJsZS5jb21iaW5lZC5kaWZmX3RyZWUgdGQubm9jaGFuZ2UgYTp2aXNpdGVkIHsKKwljb2xvcjogI2QwNjY2NjsKK30KKwordGFibGUuYmxhbWUgeworCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cit9CisKK3RhYmxlLmJsYW1lIHRkIHsKKwlwYWRkaW5nOiAwcHggNXB4OworCWZvbnQtc2l6ZTogMTAwJTsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0aCB7CisJcGFkZGluZzogMnB4IDVweDsKKwlmb250LXNpemU6IDEwMCU7CisJdGV4dC1hbGlnbjogbGVmdDsKK30KKwordHIubGlnaHQ6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNlZGVjZTY7Cit9CisKK3RyLmRhcmsgeworCWJhY2tncm91bmQtY29sb3I6ICNmNmY2ZjA7Cit9CisKK3RyLmRhcmsyIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmNmYwOworfQorCit0ci5kYXJrOmhvdmVyIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2U2OworfQorCit0ZCB7CisJcGFkZGluZzogMnB4IDVweDsKKwlmb250LXNpemU6IDEwMCU7CisJdmVydGljYWwtYWxpZ246IHRvcDsKK30KKwordGQubGluaywgdGQuc2VsZmxpbmsgeworCXBhZGRpbmc6IDJweCA1cHg7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiA3MCU7Cit9CisKK3RkLnNlbGZsaW5rIHsKKwlwYWRkaW5nLXJpZ2h0OiAwcHg7Cit9CisKK3RkLnNoYTEgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKK3RkLmVycm9yIHsKKwljb2xvcjogcmVkOworCWJhY2tncm91bmQtY29sb3I6IHllbGxvdzsKK30KKwordGQuY3VycmVudF9oZWFkIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKwordGFibGUuZGlmZl90cmVlIHNwYW4uZmlsZV9zdGF0dXMubmV3IHsKKwljb2xvcjogIzAwODAwMDsKK30KKwordGFibGUuZGlmZl90cmVlIHNwYW4uZmlsZV9zdGF0dXMuZGVsZXRlZCB7CisJY29sb3I6ICNjMDAwMDA7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSBzcGFuLmZpbGVfc3RhdHVzLm1vdmVkLAordGFibGUuZGlmZl90cmVlIHNwYW4uZmlsZV9zdGF0dXMubW9kZV9jaG5nZSB7CisJY29sb3I6ICM3Nzc3Nzc7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSBzcGFuLmZpbGVfc3RhdHVzLmNvcGllZCB7CisgIGNvbG9yOiAjNzBhMDcwOworfQorCisvKiBhZ2UyOiA2MCo2MCoyNCoyIDw9IGFnZSAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTIsIHRhYmxlLmJsYW1lIHRkLmFnZTIgeworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLyogYWdlMTogNjAqNjAqMiA8PSBhZ2UgPCA2MCo2MCoyNCoyICovCit0YWJsZS5wcm9qZWN0X2xpc3QgdGQuYWdlMSB7CisJY29sb3I6ICMwMDk5MDA7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCit0YWJsZS5ibGFtZSB0ZC5hZ2UxIHsKKwljb2xvcjogIzAwOTkwMDsKKwliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKworLyogYWdlMDogYWdlIDwgNjAqNjAqMiAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTAgeworCWNvbG9yOiAjMDA5OTAwOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKwordGFibGUuYmxhbWUgdGQuYWdlMCB7CisJY29sb3I6ICMwMDk5MDA7CisJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RkLnByZSwgZGl2LnByZSwgZGl2LmRpZmYgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisJZm9udC1zaXplOiAxMnB4OworCXdoaXRlLXNwYWNlOiBwcmU7Cit9CisKK3RkLm1vZGUgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKKy8qIHN0eWxpbmcgb2YgZGlmZnMgKHBhdGNoc2V0cyk6IGNvbW1pdGRpZmYgYW5kIGJsb2JkaWZmIHZpZXdzICovCitkaXYuZGlmZi5oZWFkZXIsCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIgeworCXdoaXRlLXNwYWNlOiBub3JtYWw7Cit9CisKK2Rpdi5kaWZmLmhlYWRlciB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2U2OworCisJbWFyZ2luLXRvcDogNHB4OworCXBhZGRpbmc6IDRweCAwcHggMnB4IDBweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDFweCAwcHg7Cit9CisKK2Rpdi5kaWZmLmhlYWRlciBhLnBhdGggeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIsCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIgYS5wYXRoLAorZGl2LmRpZmYuZXh0ZW5kZWRfaGVhZGVyIGEuaGFzaCB7CisJY29sb3I6ICM3Nzc3Nzc7Cit9CisKK2Rpdi5kaWZmLmV4dGVuZGVkX2hlYWRlciAuaW5mbyB7CisJY29sb3I6ICNiMGIwYjA7Cit9CisKK2Rpdi5kaWZmLmV4dGVuZGVkX2hlYWRlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVlZTsKKwlwYWRkaW5nOiAycHggMHB4IDJweCAwcHg7Cit9CisKK2Rpdi5kaWZmIGEubGlzdCwKK2Rpdi5kaWZmIGEucGF0aCwKK2Rpdi5kaWZmIGEuaGFzaCB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCitkaXYuZGlmZiBhLmxpc3Q6aG92ZXIsCitkaXYuZGlmZiBhLnBhdGg6aG92ZXIsCitkaXYuZGlmZiBhLmhhc2g6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitkaXYuZGlmZi50b19maWxlIGEucGF0aCwKK2Rpdi5kaWZmLnRvX2ZpbGUgeworCWNvbG9yOiAjMDA3MDAwOworfQorCitkaXYuZGlmZi5hZGQgeworCWNvbG9yOiAjMDA4ODAwOworfQorCitkaXYuZGlmZi5mcm9tX2ZpbGUgYS5wYXRoLAorZGl2LmRpZmYuZnJvbV9maWxlIHsKKwljb2xvcjogI2FhMDAwMDsKK30KKworZGl2LmRpZmYucmVtIHsKKwljb2xvcjogI2NjMDAwMDsKK30KKworZGl2LmRpZmYuY2h1bmtfaGVhZGVyIGEsCitkaXYuZGlmZi5jaHVua19oZWFkZXIgeworCWNvbG9yOiAjOTkwMDk5OworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgeworCWJvcmRlcjogZG90dGVkICNmZmUwZmY7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDBweCAwcHg7CisJbWFyZ2luLXRvcDogMnB4OworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgc3Bhbi5jaHVua19pbmZvIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZWZmOworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgc3Bhbi5zZWN0aW9uIHsKKwljb2xvcjogI2FhMjJhYTsKK30KKworZGl2LmRpZmYuaW5jb21wbGV0ZSB7CisJY29sb3I6ICNjY2NjY2M7Cit9CisKK2Rpdi5kaWZmLm5vZGlmZmVyZW5jZXMgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWNvbG9yOiAjNjAwMDAwOworfQorCitkaXYuaW5kZXhfaW5jbHVkZSB7CisJYm9yZGVyOiBzb2xpZCAjZDlkOGQxOworCWJvcmRlci13aWR0aDogMHB4IDBweCAxcHg7CisJcGFkZGluZzogMTJweCA4cHg7Cit9CisKK2Rpdi5zZWFyY2ggeworCWZvbnQtc2l6ZTogMTAwJTsKKwlmb250LXdlaWdodDogbm9ybWFsOworCW1hcmdpbjogNHB4IDhweDsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJdG9wOiA1NnB4OworCXJpZ2h0OiAxMnB4Cit9CisKK3RkLmxpbmVuciB7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK2EubGluZW5yIHsKKwljb2xvcjogIzk5OTk5OTsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmUKK30KKworYS5yc3NfbG9nbyB7CisJZmxvYXQ6IHJpZ2h0OworCXBhZGRpbmc6IDNweCAwcHg7CisJd2lkdGg6IDM1cHg7CisJbGluZS1oZWlnaHQ6IDEwcHg7CisJYm9yZGVyOiAxcHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiAjZmNjN2E1ICM3ZDMzMDIgIzNlMWEwMSAjZmY5NTRlOworCWNvbG9yOiAjZmZmZmZmOworCWJhY2tncm91bmQtY29sb3I6ICNmZjY2MDA7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiA3MCU7CisJdGV4dC1hbGlnbjogY2VudGVyOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYS5yc3NfbG9nbzpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlNTUwMDsKK30KKworc3Bhbi5yZWZzIHNwYW4geworCXBhZGRpbmc6IDBweCA0cHg7CisJZm9udC1zaXplOiA3MCU7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlib3JkZXI6IDFweCBzb2xpZDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYWZmOworCWJvcmRlci1jb2xvcjogI2ZmY2NmZiAjZmYwMGVlICNmZjAwZWUgI2ZmY2NmZjsKK30KKworc3Bhbi5yZWZzIHNwYW4ucmVmIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjYWFhYWZmOworCWJvcmRlci1jb2xvcjogI2NjY2NmZiAjMDAzM2NjICMwMDMzY2MgI2NjY2NmZjsKK30KKworc3Bhbi5yZWZzIHNwYW4udGFnIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmFhOworCWJvcmRlci1jb2xvcjogI2ZmZmZjYyAjZmZlZTAwICNmZmVlMDAgI2ZmZmZjYzsKK30KKworc3Bhbi5yZWZzIHNwYW4uaGVhZCB7CisJYmFja2dyb3VuZC1jb2xvcjogI2FhZmZhYTsKKwlib3JkZXItY29sb3I6ICNjY2ZmY2MgIzAwY2MzMyAjMDBjYzMzICNjY2ZmY2M7Cit9CisKK3NwYW4uYXRuaWdodCB7CisJY29sb3I6ICNjYzAwMDA7Cit9CisKK3NwYW4ubWF0Y2ggeworCWNvbG9yOiAjZTAwMDAwOworfQorCitkaXYuYmluYXJ5IHsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0d2ViLnBlcmwgYi9naXR3ZWIvZ2l0d2ViLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM3MDExYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi9naXR3ZWIucGVybApAQCAtMCwwICsxLDUxODMgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIGdpdHdlYiAtIHNpbXBsZSB3ZWIgaW50ZXJmYWNlIHRvIHRyYWNrIGNoYW5nZXMgaW4gZ2l0IHJlcG9zaXRvcmllcworIworIyAoQykgMjAwNS0yMDA2LCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisjIChDKSAyMDA1LCBDaHJpc3RpYW4gR2llcmtlCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDR0kgcXcoOnN0YW5kYXJkIDplc2NhcGVIVE1MIC1ub3N0aWNreSk7Cit1c2UgQ0dJOjpVdGlsIHF3KHVuZXNjYXBlKTsKK3VzZSBDR0k6OkNhcnAgcXcoZmF0YWxzVG9Ccm93c2VyKTsKK3VzZSBFbmNvZGU7Cit1c2UgRmNudGwgJzptb2RlJzsKK3VzZSBGaWxlOjpGaW5kIHF3KCk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUpOworYmlubW9kZSBTVERPVVQsICc6dXRmOCc7CisKK0JFR0lOIHsKKwlDR0ktPmNvbXBpbGUoKSBpZiAkRU5WeydNT0RfUEVSTCd9OworfQorCitvdXIgJGNnaSA9IG5ldyBDR0k7CitvdXIgJHZlcnNpb24gPSAiKytHSVRfVkVSU0lPTisrIjsKK291ciAkbXlfdXJsID0gJGNnaS0+dXJsKCk7CitvdXIgJG15X3VyaSA9ICRjZ2ktPnVybCgtYWJzb2x1dGUgPT4gMSk7CisKKyMgY29yZSBnaXQgZXhlY3V0YWJsZSB0byB1c2UKKyMgdGhpcyBjYW4ganVzdCBiZSAiZ2l0IiBpZiB5b3VyIHdlYnNlcnZlciBoYXMgYSBzZW5zaWJsZSBQQVRICitvdXIgJEdJVCA9ICIrK0dJVF9CSU5ESVIrKy9naXQiOworCisjIGFic29sdXRlIGZzLXBhdGggd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHByb2plY3QgcGF0aAorI291ciAkcHJvamVjdHJvb3QgPSAiL3B1Yi9zY20iOworb3VyICRwcm9qZWN0cm9vdCA9ICIrK0dJVFdFQl9QUk9KRUNUUk9PVCsrIjsKKworIyB0YXJnZXQgb2YgdGhlIGhvbWUgbGluayBvbiB0b3Agb2YgYWxsIHBhZ2VzCitvdXIgJGhvbWVfbGluayA9ICRteV91cmkgfHwgIi8iOworCisjIHN0cmluZyBvZiB0aGUgaG9tZSBsaW5rIG9uIHRvcCBvZiBhbGwgcGFnZXMKK291ciAkaG9tZV9saW5rX3N0ciA9ICIrK0dJVFdFQl9IT01FX0xJTktfU1RSKysiOworCisjIG5hbWUgb2YgeW91ciBzaXRlIG9yIG9yZ2FuaXphdGlvbiB0byBhcHBlYXIgaW4gcGFnZSB0aXRsZXMKKyMgcmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmUgZm9yIGNsZWFyZXIgYm9va21hcmtzCitvdXIgJHNpdGVfbmFtZSA9ICIrK0dJVFdFQl9TSVRFTkFNRSsrIgorICAgICAgICAgICAgICAgICB8fCAoJEVOVnsnU0VSVkVSX05BTUUnfSB8fCAiVW50aXRsZWQiKSAuICIgR2l0IjsKKworIyBmaWxlbmFtZSBvZiBodG1sIHRleHQgdG8gaW5jbHVkZSBhdCB0b3Agb2YgZWFjaCBwYWdlCitvdXIgJHNpdGVfaGVhZGVyID0gIisrR0lUV0VCX1NJVEVfSEVBREVSKysiOworIyBodG1sIHRleHQgdG8gaW5jbHVkZSBhdCBob21lIHBhZ2UKK291ciAkaG9tZV90ZXh0ID0gIisrR0lUV0VCX0hPTUVURVhUKysiOworIyBmaWxlbmFtZSBvZiBodG1sIHRleHQgdG8gaW5jbHVkZSBhdCBib3R0b20gb2YgZWFjaCBwYWdlCitvdXIgJHNpdGVfZm9vdGVyID0gIisrR0lUV0VCX1NJVEVfRk9PVEVSKysiOworCisjIFVSSSBvZiBzdHlsZXNoZWV0cworb3VyIEBzdHlsZXNoZWV0cyA9ICgiKytHSVRXRUJfQ1NTKysiKTsKKyMgVVJJIG9mIGEgc2luZ2xlIHN0eWxlc2hlZXQsIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGluIEdJVFdFQl9DT05GSUcuCitvdXIgJHN0eWxlc2hlZXQgPSB1bmRlZjsKKyMgVVJJIG9mIEdJVCBsb2dvICg3MngyNyBzaXplKQorb3VyICRsb2dvID0gIisrR0lUV0VCX0xPR08rKyI7CisjIFVSSSBvZiBHSVQgZmF2aWNvbiwgYXNzdW1lZCB0byBiZSBpbWFnZS9wbmcgdHlwZQorb3VyICRmYXZpY29uID0gIisrR0lUV0VCX0ZBVklDT04rKyI7CisKKyMgVVJJIGFuZCBsYWJlbCAodGl0bGUpIG9mIEdJVCBsb2dvIGxpbmsKKyNvdXIgJGxvZ29fdXJsID0gImh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLyI7Cisjb3VyICRsb2dvX2xhYmVsID0gImdpdCBkb2N1bWVudGF0aW9uIjsKK291ciAkbG9nb191cmwgPSAiaHR0cDovL2dpdC5vci5jei8iOworb3VyICRsb2dvX2xhYmVsID0gImdpdCBob21lcGFnZSI7CisKKyMgc291cmNlIG9mIHByb2plY3RzIGxpc3QKK291ciAkcHJvamVjdHNfbGlzdCA9ICIrK0dJVFdFQl9MSVNUKysiOworCisjIGRlZmF1bHQgb3JkZXIgb2YgcHJvamVjdHMgbGlzdAorIyB2YWxpZCB2YWx1ZXMgYXJlIG5vbmUsIHByb2plY3QsIGRlc2NyLCBvd25lciwgYW5kIGFnZQorb3VyICRkZWZhdWx0X3Byb2plY3RzX29yZGVyID0gInByb2plY3QiOworCisjIHNob3cgcmVwb3NpdG9yeSBvbmx5IGlmIHRoaXMgZmlsZSBleGlzdHMKKyMgKG9ubHkgZWZmZWN0aXZlIGlmIHRoaXMgdmFyaWFibGUgZXZhbHVhdGVzIHRvIHRydWUpCitvdXIgJGV4cG9ydF9vayA9ICIrK0dJVFdFQl9FWFBPUlRfT0srKyI7CisKKyMgb25seSBhbGxvdyB2aWV3aW5nIG9mIHJlcG9zaXRvcmllcyBhbHNvIHNob3duIG9uIHRoZSBvdmVydmlldyBwYWdlCitvdXIgJHN0cmljdF9leHBvcnQgPSAiKytHSVRXRUJfU1RSSUNUX0VYUE9SVCsrIjsKKworIyBsaXN0IG9mIGdpdCBiYXNlIFVSTHMgdXNlZCBmb3IgVVJMIHRvIHdoZXJlIGZldGNoIHByb2plY3QgZnJvbSwKKyMgaS5lLiBmdWxsIFVSTCBpcyAiJGdpdF9iYXNlX3VybC8kcHJvamVjdCIKK291ciBAZ2l0X2Jhc2VfdXJsX2xpc3QgPSBncmVwIHsgJF8gbmUgJycgfSAoIisrR0lUV0VCX0JBU0VfVVJMKysiKTsKKworIyBkZWZhdWx0IGJsb2JfcGxhaW4gbWltZXR5cGUgYW5kIGRlZmF1bHQgY2hhcnNldCBmb3IgdGV4dC9wbGFpbiBibG9iCitvdXIgJGRlZmF1bHRfYmxvYl9wbGFpbl9taW1ldHlwZSA9ICd0ZXh0L3BsYWluJzsKK291ciAkZGVmYXVsdF90ZXh0X3BsYWluX2NoYXJzZXQgID0gdW5kZWY7CisKKyMgZmlsZSB0byB1c2UgZm9yIGd1ZXNzaW5nIE1JTUUgdHlwZXMgYmVmb3JlIHRyeWluZyAvZXRjL21pbWUudHlwZXMKKyMgKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGdpdCByZXBvc2l0b3J5KQorb3VyICRtaW1ldHlwZXNfZmlsZSA9IHVuZGVmOworCisjIFlvdSBkZWZpbmUgc2l0ZS13aWRlIGZlYXR1cmUgZGVmYXVsdHMgaGVyZTsgb3ZlcnJpZGUgdGhlbSB3aXRoCisjICRHSVRXRUJfQ09ORklHIGFzIG5lY2Vzc2FyeS4KK291ciAlZmVhdHVyZSA9ICgKKwkjIGZlYXR1cmUgPT4geworCSMgCSdzdWInID0+IGZlYXR1cmUtc3ViIChzdWJyb3V0aW5lKSwKKwkjIAknb3ZlcnJpZGUnID0+IGFsbG93LW92ZXJyaWRlIChib29sZWFuKSwKKwkjIAknZGVmYXVsdCcgPT4gWyBkZWZhdWx0IG9wdGlvbnMuLi5dIChhcnJheSByZWZlcmVuY2UpfQorCSMKKwkjIGlmIGZlYXR1cmUgaXMgb3ZlcnJpZGFibGUgKGl0IG1lYW5zIHRoYXQgYWxsb3ctb3ZlcnJpZGUgaGFzIHRydWUgdmFsdWUpLAorCSMgdGhlbiBmZWF0dXJlLXN1YiB3aWxsIGJlIGNhbGxlZCB3aXRoIGRlZmF1bHQgb3B0aW9ucyBhcyBwYXJhbWV0ZXJzOworCSMgcmV0dXJuIHZhbHVlIG9mIGZlYXR1cmUtc3ViIGluZGljYXRlcyBpZiB0byBlbmFibGUgc3BlY2lmaWVkIGZlYXR1cmUKKwkjCisJIyBpZiB0aGVyZSBpcyBubyAnc3ViJyBrZXkgKG5vIGZlYXR1cmUtc3ViKSwgdGhlbiBmZWF0dXJlIGNhbm5vdCBiZQorCSMgb3ZlcnJpZGVuCisJIworCSMgdXNlIGdpdHdlYl9jaGVja19mZWF0dXJlKDxmZWF0dXJlPikgdG8gY2hlY2sgaWYgPGZlYXR1cmU+IGlzIGVuYWJsZWQKKworCSMgRW5hYmxlIHRoZSAnYmxhbWUnIGJsb2Igdmlldywgc2hvd2luZyB0aGUgbGFzdCBjb21taXQgdGhhdCBtb2RpZmllZAorCSMgZWFjaCBsaW5lIGluIHRoZSBmaWxlLiBUaGlzIGNhbiBiZSB2ZXJ5IENQVS1pbnRlbnNpdmUuCisKKwkjIFRvIGVuYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnYmxhbWUnfXsnZGVmYXVsdCd9ID0gWzFdOworCSMgVG8gaGF2ZSBwcm9qZWN0IHNwZWNpZmljIGNvbmZpZyBlbmFibGUgb3ZlcnJpZGUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydibGFtZSd9eydvdmVycmlkZSd9ID0gMTsKKwkjIGFuZCBpbiBwcm9qZWN0IGNvbmZpZyBnaXR3ZWIuYmxhbWUgPSAwfDE7CisJJ2JsYW1lJyA9PiB7CisJCSdzdWInID0+IFwmZmVhdHVyZV9ibGFtZSwKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWzBdfSwKKworCSMgRW5hYmxlIHRoZSAnc25hcHNob3QnIGxpbmssIHByb3ZpZGluZyBhIGNvbXByZXNzZWQgdGFyYmFsbCBvZiBhbnkKKwkjIHRyZWUuIFRoaXMgY2FuIHBvdGVudGlhbGx5IGdlbmVyYXRlIGhpZ2ggdHJhZmZpYyBpZiB5b3UgaGF2ZSBsYXJnZQorCSMgcHJvamVjdC4KKworCSMgVG8gZGlzYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnc25hcHNob3QnfXsnZGVmYXVsdCd9ID0gW3VuZGVmXTsKKwkjIFRvIGhhdmUgcHJvamVjdCBzcGVjaWZpYyBjb25maWcgZW5hYmxlIG92ZXJyaWRlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnc25hcHNob3QnfXsnb3ZlcnJpZGUnfSA9IDE7CisJIyBhbmQgaW4gcHJvamVjdCBjb25maWcgZ2l0d2ViLnNuYXBzaG90ID0gbm9uZXxnemlwfGJ6aXAyOworCSdzbmFwc2hvdCcgPT4geworCQknc3ViJyA9PiBcJmZlYXR1cmVfc25hcHNob3QsCisJCSdvdmVycmlkZScgPT4gMCwKKwkJIyAgICAgICAgID0+IFtjb250ZW50LWVuY29kaW5nLCBzdWZmaXgsIHByb2dyYW1dCisJCSdkZWZhdWx0JyA9PiBbJ3gtZ3ppcCcsICdneicsICdnemlwJ119LAorCisJIyBFbmFibGUgdGV4dCBzZWFyY2gsIHdoaWNoIHdpbGwgbGlzdCB0aGUgY29tbWl0cyB3aGljaCBtYXRjaCBhdXRob3IsCisJIyBjb21taXR0ZXIgb3IgY29tbWl0IHRleHQgdG8gYSBnaXZlbiBzdHJpbmcuICBFbmFibGVkIGJ5IGRlZmF1bHQuCisJIyBQcm9qZWN0IHNwZWNpZmljIG92ZXJyaWRlIGlzIG5vdCBzdXBwb3J0ZWQuCisJJ3NlYXJjaCcgPT4geworCQknb3ZlcnJpZGUnID0+IDAsCisJCSdkZWZhdWx0JyA9PiBbMV19LAorCisJIyBFbmFibGUgZ3JlcCBzZWFyY2gsIHdoaWNoIHdpbGwgbGlzdCB0aGUgZmlsZXMgaW4gY3VycmVudGx5IHNlbGVjdGVkCisJIyB0cmVlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0cmluZy4gRW5hYmxlZCBieSBkZWZhdWx0LiBUaGlzIGNhbiBiZQorCSMgcG90ZW50aWFsbHkgQ1BVLWludGVuc2l2ZSwgb2YgY291cnNlLgorCisJIyBUbyBlbmFibGUgc3lzdGVtIHdpZGUgaGF2ZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J2dyZXAnfXsnZGVmYXVsdCd9ID0gWzFdOworCSMgVG8gaGF2ZSBwcm9qZWN0IHNwZWNpZmljIGNvbmZpZyBlbmFibGUgb3ZlcnJpZGUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydncmVwJ317J292ZXJyaWRlJ30gPSAxOworCSMgYW5kIGluIHByb2plY3QgY29uZmlnIGdpdHdlYi5ncmVwID0gMHwxOworCSdncmVwJyA9PiB7CisJCSdvdmVycmlkZScgPT4gMCwKKwkJJ2RlZmF1bHQnID0+IFsxXX0sCisKKwkjIEVuYWJsZSB0aGUgcGlja2F4ZSBzZWFyY2gsIHdoaWNoIHdpbGwgbGlzdCB0aGUgY29tbWl0cyB0aGF0IG1vZGlmaWVkCisJIyBhIGdpdmVuIHN0cmluZyBpbiBhIGZpbGUuIFRoaXMgY2FuIGJlIHByYWN0aWNhbCBhbmQgcXVpdGUgZmFzdGVyCisJIyBhbHRlcm5hdGl2ZSB0byAnYmxhbWUnLCBidXQgc3RpbGwgcG90ZW50aWFsbHkgQ1BVLWludGVuc2l2ZS4KKworCSMgVG8gZW5hYmxlIHN5c3RlbSB3aWRlIGhhdmUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydwaWNrYXhlJ317J2RlZmF1bHQnfSA9IFsxXTsKKwkjIFRvIGhhdmUgcHJvamVjdCBzcGVjaWZpYyBjb25maWcgZW5hYmxlIG92ZXJyaWRlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsncGlja2F4ZSd9eydvdmVycmlkZSd9ID0gMTsKKwkjIGFuZCBpbiBwcm9qZWN0IGNvbmZpZyBnaXR3ZWIucGlja2F4ZSA9IDB8MTsKKwkncGlja2F4ZScgPT4geworCQknc3ViJyA9PiBcJmZlYXR1cmVfcGlja2F4ZSwKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWzFdfSwKKworCSMgTWFrZSBnaXR3ZWIgdXNlIGFuIGFsdGVybmF0aXZlIGZvcm1hdCBvZiB0aGUgVVJMcyB3aGljaCBjYW4gYmUKKwkjIG1vcmUgcmVhZGFibGUgYW5kIG5hdHVyYWwtbG9va2luZzogcHJvamVjdCBuYW1lIGlzIGVtYmVkZGVkCisJIyBkaXJlY3RseSBpbiB0aGUgcGF0aCBhbmQgdGhlIHF1ZXJ5IHN0cmluZyBjb250YWlucyBvdGhlcgorCSMgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiBBbGwgZ2l0d2ViIGluc3RhbGxhdGlvbnMgcmVjb2duaXplCisJIyBVUkwgaW4gZWl0aGVyIGZvcm1hdDsgdGhpcyBjb25maWd1cmVzIGluIHdoaWNoIGZvcm1hdHMgZ2l0d2ViCisJIyBnZW5lcmF0ZXMgbGlua3MuCisKKwkjIFRvIGVuYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsncGF0aGluZm8nfXsnZGVmYXVsdCd9ID0gWzFdOworCSMgUHJvamVjdCBzcGVjaWZpYyBvdmVycmlkZSBpcyBub3Qgc3VwcG9ydGVkLgorCisJIyBOb3RlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgQ1NTLAorCSMgZmF2aWNvbiwgbG9nbyBhbmQgcG9zc2libHkgb3RoZXIgZmlsZXMgdG8gYW4gYWJzb2x1dGUgVVJMLiBBbHNvLAorCSMgaWYgZ2l0d2ViLmNnaSBzZXJ2ZXMgYXMgeW91ciBpbmRleGZpbGUsIHlvdSB3aWxsIG5lZWQgdG8gZm9yY2UKKwkjICRteV91cmkgdG8gY29udGFpbiB0aGUgc2NyaXB0IG5hbWUgaW4geW91ciAkR0lUV0VCX0NPTkZJRy4KKwkncGF0aGluZm8nID0+IHsKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWzBdfSwKKworCSMgTWFrZSBnaXR3ZWIgY29uc2lkZXIgcHJvamVjdHMgaW4gcHJvamVjdCByb290IHN1YmRpcmVjdG9yaWVzCisJIyB0byBiZSBmb3JrcyBvZiBleGlzdGluZyBwcm9qZWN0cy4gR2l2ZW4gcHJvamVjdCAkcHJvam5hbWUuZ2l0LAorCSMgcHJvamVjdHMgbWF0Y2hpbmcgJHByb2puYW1lLyouZ2l0IHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBtYWluCisJIyBwcm9qZWN0cyBsaXN0LCBpbnN0ZWFkIGEgJysnIG1hcmsgd2lsbCBiZSBhZGRlZCB0byAkcHJvam5hbWUKKwkjIHRoZXJlIGFuZCBhICdmb3JrcycgdmlldyB3aWxsIGJlIGVuYWJsZWQgZm9yIHRoZSBwcm9qZWN0LCBsaXN0aW5nCisJIyBhbGwgdGhlIGZvcmtzLiBJZiBwcm9qZWN0IGxpc3QgaXMgdGFrZW4gZnJvbSBhIGZpbGUsIGZvcmtzIGhhdmUKKwkjIHRvIGJlIGxpc3RlZCBhZnRlciB0aGUgbWFpbiBwcm9qZWN0LgorCisJIyBUbyBlbmFibGUgc3lzdGVtIHdpZGUgaGF2ZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J2ZvcmtzJ317J2RlZmF1bHQnfSA9IFsxXTsKKwkjIFByb2plY3Qgc3BlY2lmaWMgb3ZlcnJpZGUgaXMgbm90IHN1cHBvcnRlZC4KKwknZm9ya3MnID0+IHsKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWzBdfSwKKyk7CisKK3N1YiBnaXR3ZWJfY2hlY2tfZmVhdHVyZSB7CisJbXkgKCRuYW1lKSA9IEBfOworCXJldHVybiB1bmxlc3MgZXhpc3RzICRmZWF0dXJleyRuYW1lfTsKKwlteSAoJHN1YiwgJG92ZXJyaWRlLCBAZGVmYXVsdHMpID0gKAorCQkkZmVhdHVyZXskbmFtZX17J3N1Yid9LAorCQkkZmVhdHVyZXskbmFtZX17J292ZXJyaWRlJ30sCisJCUB7JGZlYXR1cmV7JG5hbWV9eydkZWZhdWx0J319KTsKKwlpZiAoISRvdmVycmlkZSkgeyByZXR1cm4gQGRlZmF1bHRzOyB9CisJaWYgKCFkZWZpbmVkICRzdWIpIHsKKwkJd2FybiAiZmVhdHVyZSAkbmFtZSBpcyBub3Qgb3ZlcnJpZGVhYmxlIjsKKwkJcmV0dXJuIEBkZWZhdWx0czsKKwl9CisJcmV0dXJuICRzdWItPihAZGVmYXVsdHMpOworfQorCitzdWIgZmVhdHVyZV9ibGFtZSB7CisJbXkgKCR2YWwpID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygnYmxhbWUnLCAnLS1ib29sJyk7CisKKwlpZiAoJHZhbCBlcSAndHJ1ZScpIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNpZiAoJHZhbCBlcSAnZmFsc2UnKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAkX1swXTsKK30KKworc3ViIGZlYXR1cmVfc25hcHNob3QgeworCW15ICgkY3R5cGUsICRzdWZmaXgsICRjb21tYW5kKSA9IEBfOworCisJbXkgKCR2YWwpID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygnc25hcHNob3QnKTsKKworCWlmICgkdmFsIGVxICdnemlwJykgeworCQlyZXR1cm4gKCd4LWd6aXAnLCAnZ3onLCAnZ3ppcCcpOworCX0gZWxzaWYgKCR2YWwgZXEgJ2J6aXAyJykgeworCQlyZXR1cm4gKCd4LWJ6aXAyJywgJ2J6MicsICdiemlwMicpOworCX0gZWxzaWYgKCR2YWwgZXEgJ25vbmUnKSB7CisJCXJldHVybiAoKTsKKwl9CisKKwlyZXR1cm4gKCRjdHlwZSwgJHN1ZmZpeCwgJGNvbW1hbmQpOworfQorCitzdWIgZ2l0d2ViX2hhdmVfc25hcHNob3QgeworCW15ICgkY3R5cGUsICRzdWZmaXgsICRjb21tYW5kKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdzbmFwc2hvdCcpOworCW15ICRoYXZlX3NuYXBzaG90ID0gKGRlZmluZWQgJGN0eXBlICYmIGRlZmluZWQgJHN1ZmZpeCk7CisKKwlyZXR1cm4gJGhhdmVfc25hcHNob3Q7Cit9CisKK3N1YiBmZWF0dXJlX2dyZXAgeworCW15ICgkdmFsKSA9IGdpdF9nZXRfcHJvamVjdF9jb25maWcoJ2dyZXAnLCAnLS1ib29sJyk7CisKKwlpZiAoJHZhbCBlcSAndHJ1ZScpIHsKKwkJcmV0dXJuICgxKTsKKwl9IGVsc2lmICgkdmFsIGVxICdmYWxzZScpIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKCRfWzBdKTsKK30KKworc3ViIGZlYXR1cmVfcGlja2F4ZSB7CisJbXkgKCR2YWwpID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygncGlja2F4ZScsICctLWJvb2wnKTsKKworCWlmICgkdmFsIGVxICd0cnVlJykgeworCQlyZXR1cm4gKDEpOworCX0gZWxzaWYgKCR2YWwgZXEgJ2ZhbHNlJykgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoJF9bMF0pOworfQorCisjIGNoZWNraW5nIEhFQUQgZmlsZSB3aXRoIC1lIGlzIGZyYWdpbGUgaWYgdGhlIHJlcG9zaXRvcnkgd2FzCisjIGluaXRpYWxpemVkIGxvbmcgdGltZSBhZ28gKGkuZS4gc3ltbGluayBIRUFEKSBhbmQgd2FzIHBhY2stcmVmJ2VkCisjIGFuZCB0aGVuIHBydW5lZC4KK3N1YiBjaGVja19oZWFkX2xpbmsgeworCW15ICgkZGlyKSA9IEBfOworCW15ICRoZWFkZmlsZSA9ICIkZGlyL0hFQUQiOworCXJldHVybiAoKC1lICRoZWFkZmlsZSkgfHwKKwkJKC1sICRoZWFkZmlsZSAmJiByZWFkbGluaygkaGVhZGZpbGUpID1+IC9ecmVmc1wvaGVhZHNcLy8pKTsKK30KKworc3ViIGNoZWNrX2V4cG9ydF9vayB7CisJbXkgKCRkaXIpID0gQF87CisJcmV0dXJuIChjaGVja19oZWFkX2xpbmsoJGRpcikgJiYKKwkJKCEkZXhwb3J0X29rIHx8IC1lICIkZGlyLyRleHBvcnRfb2siKSk7Cit9CisKKyMgcmVuYW1lIGRldGVjdGlvbiBvcHRpb25zIGZvciBnaXQtZGlmZiBhbmQgZ2l0LWRpZmYtdHJlZQorIyAtIGRlZmF1bHQgaXMgJy1NJywgd2l0aCB0aGUgY29zdCBwcm9wb3J0aW9uYWwgdG8KKyMgICAobnVtYmVyIG9mIHJlbW92ZWQgZmlsZXMpICogKG51bWJlciBvZiBuZXcgZmlsZXMpLgorIyAtIG1vcmUgY29zdGx5IGlzICctQycgKG9yICctQycsICctTScpLCB3aXRoIHRoZSBjb3N0IHByb3BvcnRpb25hbCB0bworIyAgIChudW1iZXIgb2YgY2hhbmdlZCBmaWxlcyArIG51bWJlciBvZiByZW1vdmVkIGZpbGVzKSAqIChudW1iZXIgb2YgbmV3IGZpbGVzKQorIyAtIGV2ZW4gbW9yZSBjb3N0bHkgaXMgJy1DJywgJy0tZmluZC1jb3BpZXMtaGFyZGVyJyB3aXRoIGNvc3QKKyMgICAobnVtYmVyIG9mIGZpbGVzIGluIHRoZSBvcmlnaW5hbCB0cmVlKSAqIChudW1iZXIgb2YgbmV3IGZpbGVzKQorIyAtIG9uZSBtaWdodCB3YW50IHRvIGluY2x1ZGUgJy1CJyBvcHRpb24sIGUuZy4gJy1CJywgJy1NJworb3VyIEBkaWZmX29wdHMgPSAoJy1NJyk7ICMgdGFrZW4gZnJvbSBnaXRfY29tbWl0CisKK291ciAkR0lUV0VCX0NPTkZJRyA9ICRFTlZ7J0dJVFdFQl9DT05GSUcnfSB8fCAiKytHSVRXRUJfQ09ORklHKysiOworZG8gJEdJVFdFQl9DT05GSUcgaWYgLWUgJEdJVFdFQl9DT05GSUc7CisKKyMgdmVyc2lvbiBvZiB0aGUgY29yZSBnaXQgYmluYXJ5CitvdXIgJGdpdF92ZXJzaW9uID0gcXgoJEdJVCAtLXZlcnNpb24pID1+IG0vZ2l0IHZlcnNpb24gKC4qKSQvID8gJDEgOiAidW5rbm93biI7CisKKyRwcm9qZWN0c19saXN0IHx8PSAkcHJvamVjdHJvb3Q7CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBpbnB1dCB2YWxpZGF0aW9uIGFuZCBkaXNwYXRjaAorb3VyICRhY3Rpb24gPSAkY2dpLT5wYXJhbSgnYScpOworaWYgKGRlZmluZWQgJGFjdGlvbikgeworCWlmICgkYWN0aW9uID1+IG0vW14wLTlhLXpBLVpcLlwtX10vKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgYWN0aW9uIHBhcmFtZXRlciIpOworCX0KK30KKworIyBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBwYXRobmFtZXMKK291ciAkcHJvamVjdCA9ICRjZ2ktPnBhcmFtKCdwJyk7CitpZiAoZGVmaW5lZCAkcHJvamVjdCkgeworCWlmICghdmFsaWRhdGVfcGF0aG5hbWUoJHByb2plY3QpIHx8CisJICAgICEoLWQgIiRwcm9qZWN0cm9vdC8kcHJvamVjdCIpIHx8CisJICAgICFjaGVja19oZWFkX2xpbmsoIiRwcm9qZWN0cm9vdC8kcHJvamVjdCIpIHx8CisJICAgICgkZXhwb3J0X29rICYmICEoLWUgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC8kZXhwb3J0X29rIikpIHx8CisJICAgICgkc3RyaWN0X2V4cG9ydCAmJiAhcHJvamVjdF9pbl9saXN0KCRwcm9qZWN0KSkpIHsKKwkJdW5kZWYgJHByb2plY3Q7CisJCWRpZV9lcnJvcih1bmRlZiwgIk5vIHN1Y2ggcHJvamVjdCIpOworCX0KK30KKworb3VyICRmaWxlX25hbWUgPSAkY2dpLT5wYXJhbSgnZicpOworaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCWlmICghdmFsaWRhdGVfcGF0aG5hbWUoJGZpbGVfbmFtZSkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworCX0KK30KKworb3VyICRmaWxlX3BhcmVudCA9ICRjZ2ktPnBhcmFtKCdmcCcpOworaWYgKGRlZmluZWQgJGZpbGVfcGFyZW50KSB7CisJaWYgKCF2YWxpZGF0ZV9wYXRobmFtZSgkZmlsZV9wYXJlbnQpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgZmlsZSBwYXJlbnQgcGFyYW1ldGVyIik7CisJfQorfQorCisjIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHJlZm5hbWVzCitvdXIgJGhhc2ggPSAkY2dpLT5wYXJhbSgnaCcpOworaWYgKGRlZmluZWQgJGhhc2gpIHsKKwlpZiAoIXZhbGlkYXRlX3JlZm5hbWUoJGhhc2gpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgaGFzaCBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKK291ciAkaGFzaF9wYXJlbnQgPSAkY2dpLT5wYXJhbSgnaHAnKTsKK2lmIChkZWZpbmVkICRoYXNoX3BhcmVudCkgeworCWlmICghdmFsaWRhdGVfcmVmbmFtZSgkaGFzaF9wYXJlbnQpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgaGFzaCBwYXJlbnQgcGFyYW1ldGVyIik7CisJfQorfQorCitvdXIgJGhhc2hfYmFzZSA9ICRjZ2ktPnBhcmFtKCdoYicpOworaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCWlmICghdmFsaWRhdGVfcmVmbmFtZSgkaGFzaF9iYXNlKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggYmFzZSBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKK291ciAkaGFzaF9wYXJlbnRfYmFzZSA9ICRjZ2ktPnBhcmFtKCdocGInKTsKK2lmIChkZWZpbmVkICRoYXNoX3BhcmVudF9iYXNlKSB7CisJaWYgKCF2YWxpZGF0ZV9yZWZuYW1lKCRoYXNoX3BhcmVudF9iYXNlKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggcGFyZW50IGJhc2UgcGFyYW1ldGVyIik7CisJfQorfQorCisjIG90aGVyIHBhcmFtZXRlcnMKK291ciAkcGFnZSA9ICRjZ2ktPnBhcmFtKCdwZycpOworaWYgKGRlZmluZWQgJHBhZ2UpIHsKKwlpZiAoJHBhZ2UgPX4gbS9bXjAtOV0vKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgcGFnZSBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKK291ciAkc2VhcmNodHlwZSA9ICRjZ2ktPnBhcmFtKCdzdCcpOworaWYgKGRlZmluZWQgJHNlYXJjaHR5cGUpIHsKKwlpZiAoJHNlYXJjaHR5cGUgPX4gbS9bXmEtel0vKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgc2VhcmNodHlwZSBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKK291ciAkc2VhcmNodGV4dCA9ICRjZ2ktPnBhcmFtKCdzJyk7CitvdXIgJHNlYXJjaF9yZWdleHA7CitpZiAoZGVmaW5lZCAkc2VhcmNodGV4dCkgeworCWlmICgkc2VhcmNodHlwZSBuZSAnZ3JlcCcgYW5kICRzZWFyY2h0eXBlIG5lICdwaWNrYXhlJyBhbmQgJHNlYXJjaHRleHQgPX4gbS9bXmEtekEtWjAtOV9cLlwvXC1cK1w6XEAgXS8pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBzZWFyY2ggcGFyYW1ldGVyIik7CisJfQorCWlmIChsZW5ndGgoJHNlYXJjaHRleHQpIDwgMikgeworCQlkaWVfZXJyb3IodW5kZWYsICJBdCBsZWFzdCB0d28gY2hhcmFjdGVycyBhcmUgcmVxdWlyZWQgZm9yIHNlYXJjaCBwYXJhbWV0ZXIiKTsKKwl9CisJJHNlYXJjaF9yZWdleHAgPSBxdW90ZW1ldGEgJHNlYXJjaHRleHQ7Cit9CisKKyMgbm93IHJlYWQgUEFUSF9JTkZPIGFuZCB1c2UgaXQgYXMgYWx0ZXJuYXRpdmUgdG8gcGFyYW1ldGVycworc3ViIGV2YWx1YXRlX3BhdGhfaW5mbyB7CisJcmV0dXJuIGlmIGRlZmluZWQgJHByb2plY3Q7CisJbXkgJHBhdGhfaW5mbyA9ICRFTlZ7IlBBVEhfSU5GTyJ9OworCXJldHVybiBpZiAhJHBhdGhfaW5mbzsKKwkkcGF0aF9pbmZvID1+IHMsXi8rLCw7CisJcmV0dXJuIGlmICEkcGF0aF9pbmZvOworCSMgZmluZCB3aGljaCBwYXJ0IG9mIFBBVEhfSU5GTyBpcyBwcm9qZWN0CisJJHByb2plY3QgPSAkcGF0aF9pbmZvOworCSRwcm9qZWN0ID1+IHMsLyskLCw7CisJd2hpbGUgKCRwcm9qZWN0ICYmICFjaGVja19oZWFkX2xpbmsoIiRwcm9qZWN0cm9vdC8kcHJvamVjdCIpKSB7CisJCSRwcm9qZWN0ID1+IHMsLypbXi9dKiQsLDsKKwl9CisJIyB2YWxpZGF0ZSBwcm9qZWN0CisJJHByb2plY3QgPSB2YWxpZGF0ZV9wYXRobmFtZSgkcHJvamVjdCk7CisJaWYgKCEkcHJvamVjdCB8fAorCSAgICAoJGV4cG9ydF9vayAmJiAhLWUgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC8kZXhwb3J0X29rIikgfHwKKwkgICAgKCRzdHJpY3RfZXhwb3J0ICYmICFwcm9qZWN0X2luX2xpc3QoJHByb2plY3QpKSkgeworCQl1bmRlZiAkcHJvamVjdDsKKwkJcmV0dXJuOworCX0KKwkjIGRvIG5vdCBjaGFuZ2UgYW55IHBhcmFtZXRlcnMgaWYgYW4gYWN0aW9uIGlzIGdpdmVuIHVzaW5nIHRoZSBxdWVyeSBzdHJpbmcKKwlyZXR1cm4gaWYgJGFjdGlvbjsKKwkkcGF0aF9pbmZvID1+IHMsXiRwcm9qZWN0LyosLDsKKwlteSAoJHJlZm5hbWUsICRwYXRobmFtZSkgPSBzcGxpdCgvOi8sICRwYXRoX2luZm8sIDIpOworCWlmIChkZWZpbmVkICRwYXRobmFtZSkgeworCQkjIHdlIGdvdCAicHJvamVjdC5naXQvYnJhbmNoOmZpbGVuYW1lIiBvciAicHJvamVjdC5naXQvYnJhbmNoOmRpci8iCisJCSMgd2UgY291bGQgdXNlIGdpdF9nZXRfdHlwZShicmFuY2g6cGF0aG5hbWUpLCBidXQgaXQgbmVlZHMgJGdpdF9kaXIKKwkJJHBhdGhuYW1lID1+IHMsXi8rLCw7CisJCWlmICghJHBhdGhuYW1lIHx8IHN1YnN0cigkcGF0aG5hbWUsIC0xKSBlcSAiLyIpIHsKKwkJCSRhY3Rpb24gIHx8PSAidHJlZSI7CisJCQkkcGF0aG5hbWUgPX4gcywvJCwsOworCQl9IGVsc2UgeworCQkJJGFjdGlvbiAgfHw9ICJibG9iX3BsYWluIjsKKwkJfQorCQkkaGFzaF9iYXNlIHx8PSB2YWxpZGF0ZV9yZWZuYW1lKCRyZWZuYW1lKTsKKwkJJGZpbGVfbmFtZSB8fD0gdmFsaWRhdGVfcGF0aG5hbWUoJHBhdGhuYW1lKTsKKwl9IGVsc2lmIChkZWZpbmVkICRyZWZuYW1lKSB7CisJCSMgd2UgZ290ICJwcm9qZWN0LmdpdC9icmFuY2giCisJCSRhY3Rpb24gfHw9ICJzaG9ydGxvZyI7CisJCSRoYXNoICAgfHw9IHZhbGlkYXRlX3JlZm5hbWUoJHJlZm5hbWUpOworCX0KK30KK2V2YWx1YXRlX3BhdGhfaW5mbygpOworCisjIHBhdGggdG8gdGhlIGN1cnJlbnQgZ2l0IHJlcG9zaXRvcnkKK291ciAkZ2l0X2RpcjsKKyRnaXRfZGlyID0gIiRwcm9qZWN0cm9vdC8kcHJvamVjdCIgaWYgJHByb2plY3Q7CisKKyMgZGlzcGF0Y2gKK215ICVhY3Rpb25zID0gKAorCSJibGFtZSIgPT4gXCZnaXRfYmxhbWUyLAorCSJibG9iZGlmZiIgPT4gXCZnaXRfYmxvYmRpZmYsCisJImJsb2JkaWZmX3BsYWluIiA9PiBcJmdpdF9ibG9iZGlmZl9wbGFpbiwKKwkiYmxvYiIgPT4gXCZnaXRfYmxvYiwKKwkiYmxvYl9wbGFpbiIgPT4gXCZnaXRfYmxvYl9wbGFpbiwKKwkiY29tbWl0ZGlmZiIgPT4gXCZnaXRfY29tbWl0ZGlmZiwKKwkiY29tbWl0ZGlmZl9wbGFpbiIgPT4gXCZnaXRfY29tbWl0ZGlmZl9wbGFpbiwKKwkiY29tbWl0IiA9PiBcJmdpdF9jb21taXQsCisJImZvcmtzIiA9PiBcJmdpdF9mb3JrcywKKwkiaGVhZHMiID0+IFwmZ2l0X2hlYWRzLAorCSJoaXN0b3J5IiA9PiBcJmdpdF9oaXN0b3J5LAorCSJsb2ciID0+IFwmZ2l0X2xvZywKKwkicnNzIiA9PiBcJmdpdF9yc3MsCisJImF0b20iID0+IFwmZ2l0X2F0b20sCisJInNlYXJjaCIgPT4gXCZnaXRfc2VhcmNoLAorCSJzZWFyY2hfaGVscCIgPT4gXCZnaXRfc2VhcmNoX2hlbHAsCisJInNob3J0bG9nIiA9PiBcJmdpdF9zaG9ydGxvZywKKwkic3VtbWFyeSIgPT4gXCZnaXRfc3VtbWFyeSwKKwkidGFnIiA9PiBcJmdpdF90YWcsCisJInRhZ3MiID0+IFwmZ2l0X3RhZ3MsCisJInRyZWUiID0+IFwmZ2l0X3RyZWUsCisJInNuYXBzaG90IiA9PiBcJmdpdF9zbmFwc2hvdCwKKwkib2JqZWN0IiA9PiBcJmdpdF9vYmplY3QsCisJIyB0aG9zZSBiZWxvdyBkb24ndCBuZWVkICRwcm9qZWN0CisJIm9wbWwiID0+IFwmZ2l0X29wbWwsCisJInByb2plY3RfbGlzdCIgPT4gXCZnaXRfcHJvamVjdF9saXN0LAorCSJwcm9qZWN0X2luZGV4IiA9PiBcJmdpdF9wcm9qZWN0X2luZGV4LAorKTsKKworaWYgKCFkZWZpbmVkICRhY3Rpb24pIHsKKwlpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkkYWN0aW9uID0gZ2l0X2dldF90eXBlKCRoYXNoKTsKKwl9IGVsc2lmIChkZWZpbmVkICRoYXNoX2Jhc2UgJiYgZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRhY3Rpb24gPSBnaXRfZ2V0X3R5cGUoIiRoYXNoX2Jhc2U6JGZpbGVfbmFtZSIpOworCX0gZWxzaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJJGFjdGlvbiA9ICdzdW1tYXJ5JzsKKwl9IGVsc2UgeworCQkkYWN0aW9uID0gJ3Byb2plY3RfbGlzdCc7CisJfQorfQoraWYgKCFkZWZpbmVkKCRhY3Rpb25zeyRhY3Rpb259KSkgeworCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gYWN0aW9uIik7Cit9CitpZiAoJGFjdGlvbiAhfiBtL14ob3BtbHxwcm9qZWN0X2xpc3R8cHJvamVjdF9pbmRleCkkLyAmJgorICAgICEkcHJvamVjdCkgeworCWRpZV9lcnJvcih1bmRlZiwgIlByb2plY3QgbmVlZGVkIik7Cit9CiskYWN0aW9uc3skYWN0aW9ufS0+KCk7CitleGl0OworCisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyBhY3Rpb24gbGlua3MKKworc3ViIGhyZWYoJSkgeworCW15ICVwYXJhbXMgPSBAXzsKKwkjIGRlZmF1bHQgaXMgdG8gdXNlIC1hYnNvbHV0ZSB1cmwoKSBpLmUuICRteV91cmkKKwlteSAkaHJlZiA9ICRwYXJhbXN7LWZ1bGx9ID8gJG15X3VybCA6ICRteV91cmk7CisKKwkjIFhYWDogV2FybmluZzogSWYgeW91IHRvdWNoIHRoaXMsIGNoZWNrIHRoZSBzZWFyY2ggZm9ybSBmb3IgdXBkYXRpbmcsCisJIyB0b28uCisKKwlteSBAbWFwcGluZyA9ICgKKwkJcHJvamVjdCA9PiAicCIsCisJCWFjdGlvbiA9PiAiYSIsCisJCWZpbGVfbmFtZSA9PiAiZiIsCisJCWZpbGVfcGFyZW50ID0+ICJmcCIsCisJCWhhc2ggPT4gImgiLAorCQloYXNoX3BhcmVudCA9PiAiaHAiLAorCQloYXNoX2Jhc2UgPT4gImhiIiwKKwkJaGFzaF9wYXJlbnRfYmFzZSA9PiAiaHBiIiwKKwkJcGFnZSA9PiAicGciLAorCQlvcmRlciA9PiAibyIsCisJCXNlYXJjaHRleHQgPT4gInMiLAorCQlzZWFyY2h0eXBlID0+ICJzdCIsCisJKTsKKwlteSAlbWFwcGluZyA9IEBtYXBwaW5nOworCisJJHBhcmFtc3sncHJvamVjdCd9ID0gJHByb2plY3QgdW5sZXNzIGV4aXN0cyAkcGFyYW1zeydwcm9qZWN0J307CisKKwlteSAoJHVzZV9wYXRoaW5mbykgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgncGF0aGluZm8nKTsKKwlpZiAoJHVzZV9wYXRoaW5mbykgeworCQkjIHVzZSBQQVRIX0lORk8gZm9yIHByb2plY3QgbmFtZQorCQkkaHJlZiAuPSAiLyRwYXJhbXN7J3Byb2plY3QnfSIgaWYgZGVmaW5lZCAkcGFyYW1zeydwcm9qZWN0J307CisJCWRlbGV0ZSAkcGFyYW1zeydwcm9qZWN0J307CisKKwkJIyBTdW1tYXJ5IGp1c3QgdXNlcyB0aGUgcHJvamVjdCBwYXRoIFVSTAorCQlpZiAoZGVmaW5lZCAkcGFyYW1zeydhY3Rpb24nfSAmJiAkcGFyYW1zeydhY3Rpb24nfSBlcSAnc3VtbWFyeScpIHsKKwkJCWRlbGV0ZSAkcGFyYW1zeydhY3Rpb24nfTsKKwkJfQorCX0KKworCSMgbm93IGVuY29kZSB0aGUgcGFyYW1ldGVycyBleHBsaWNpdGx5CisJbXkgQHJlc3VsdCA9ICgpOworCWZvciAobXkgJGkgPSAwOyAkaSA8IEBtYXBwaW5nOyAkaSArPSAyKSB7CisJCW15ICgkbmFtZSwgJHN5bWJvbCkgPSAoJG1hcHBpbmdbJGldLCAkbWFwcGluZ1skaSsxXSk7CisJCWlmIChkZWZpbmVkICRwYXJhbXN7JG5hbWV9KSB7CisJCQlwdXNoIEByZXN1bHQsICRzeW1ib2wgLiAiPSIgLiBlc2NfcGFyYW0oJHBhcmFtc3skbmFtZX0pOworCQl9CisJfQorCSRocmVmIC49ICI/IiAuIGpvaW4oJzsnLCBAcmVzdWx0KSBpZiBzY2FsYXIgQHJlc3VsdDsKKworCXJldHVybiAkaHJlZjsKK30KKworCisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyB2YWxpZGF0aW9uLCBxdW90aW5nL3VucXVvdGluZyBhbmQgZXNjYXBpbmcKKworc3ViIHZhbGlkYXRlX3BhdGhuYW1lIHsKKwlteSAkaW5wdXQgPSBzaGlmdCB8fCByZXR1cm4gdW5kZWY7CisKKwkjIG5vICcuJyBvciAnLi4nIGFzIGVsZW1lbnRzIG9mIHBhdGgsIGkuZS4gbm8gJy4nIG5vciAnLi4nCisJIyBhdCB0aGUgYmVnaW5uaW5nLCBhdCB0aGUgZW5kLCBhbmQgYmV0d2VlbiBzbGFzaGVzLgorCSMgYWxzbyB0aGlzIGNhdGNoZXMgZG91YmxlZCBzbGFzaGVzCisJaWYgKCRpbnB1dCA9fiBtIShefC8pKHxcLnxcLlwuKSgvfCQpISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCSMgbm8gbnVsbCBjaGFyYWN0ZXJzCisJaWYgKCRpbnB1dCA9fiBtIVwwISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkaW5wdXQ7Cit9CisKK3N1YiB2YWxpZGF0ZV9yZWZuYW1lIHsKKwlteSAkaW5wdXQgPSBzaGlmdCB8fCByZXR1cm4gdW5kZWY7CisKKwkjIHRleHR1YWwgaGFzaGVzIGFyZSBPLksuCisJaWYgKCRpbnB1dCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQlyZXR1cm4gJGlucHV0OworCX0KKwkjIGl0IG11c3QgYmUgY29ycmVjdCBwYXRobmFtZQorCSRpbnB1dCA9IHZhbGlkYXRlX3BhdGhuYW1lKCRpbnB1dCkKKwkJb3IgcmV0dXJuIHVuZGVmOworCSMgcmVzdHJpY3Rpb25zIG9uIHJlZiBuYW1lIGFjY29yZGluZyB0byBnaXQtY2hlY2stcmVmLWZvcm1hdAorCWlmICgkaW5wdXQgPX4gbSEoL1wufFwuXC58W1wwMDAtXDA0MFwxNzcgfl46PypcW118LyQpISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkaW5wdXQ7Cit9CisKKyMgcXVvdGUgdW5zYWZlIGNoYXJzLCBidXQga2VlcCB0aGUgc2xhc2gsIGV2ZW4gd2hlbiBpdCdzIG5vdAorIyBjb3JyZWN0LCBidXQgcXVvdGVkIHNsYXNoZXMgbG9vayB0b28gaG9ycmlibGUgaW4gYm9va21hcmtzCitzdWIgZXNjX3BhcmFtIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJJHN0ciA9fiBzLyhbXkEtWmEtejAtOVwtXy5+KClcLzpAXSkvc3ByaW50ZigiJSUlMDJYIiwgb3JkKCQxKSkvZWc7CisJJHN0ciA9fiBzL1wrLyUyQi9nOworCSRzdHIgPX4gcy8gL1wrL2c7CisJcmV0dXJuICRzdHI7Cit9CisKKyMgcXVvdGUgdW5zYWZlIGNoYXJzIGluIHdob2xlIFVSTCwgc28gc29tZSBjaGFyYWN0cnMgY2Fubm90IGJlIHF1b3RlZAorc3ViIGVzY191cmwgeworCW15ICRzdHIgPSBzaGlmdDsKKwkkc3RyID1+IHMvKFteQS1aYS16MC05XC1fLn4oKTtcLzs/OkAmPV0pL3NwcmludGYoIiUlJTAyWCIsIG9yZCgkMSkpL2VnOworCSRzdHIgPX4gcy9cKy8lMkIvZzsKKwkkc3RyID1+IHMvIC9cKy9nOworCXJldHVybiAkc3RyOworfQorCisjIHJlcGxhY2UgaW52YWxpZCB1dGY4IGNoYXJhY3RlciB3aXRoIFNVQlNUSVRVVElPTiBzZXF1ZW5jZQorc3ViIGVzY19odG1sICgkOyUpIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJbXkgJW9wdHMgPSBAXzsKKworCSRzdHIgPSBkZWNvZGVfdXRmOCgkc3RyKTsKKwkkc3RyID0gJGNnaS0+ZXNjYXBlSFRNTCgkc3RyKTsKKwlpZiAoJG9wdHN7Jy1uYnNwJ30pIHsKKwkJJHN0ciA9fiBzLyAvJm5ic3A7L2c7CisJfQorCSRzdHIgPX4gc3woW1s6Y250cmw6XV0pfCgoJDEgbmUgIlx0IikgPyBxdW90X2NlYygkMSkgOiAkMSl8ZWc7CisJcmV0dXJuICRzdHI7Cit9CisKKyMgcXVvdGUgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBlc2NhcGUgZmlsZW5hbWUgdG8gSFRNTAorc3ViIGVzY19wYXRoIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJbXkgJW9wdHMgPSBAXzsKKworCSRzdHIgPSBkZWNvZGVfdXRmOCgkc3RyKTsKKwkkc3RyID0gJGNnaS0+ZXNjYXBlSFRNTCgkc3RyKTsKKwlpZiAoJG9wdHN7Jy1uYnNwJ30pIHsKKwkJJHN0ciA9fiBzLyAvJm5ic3A7L2c7CisJfQorCSRzdHIgPX4gc3woW1s6Y250cmw6XV0pfHF1b3RfY2VjKCQxKXxlZzsKKwlyZXR1cm4gJHN0cjsKK30KKworIyBNYWtlIGNvbnRyb2wgY2hhcmFjdGVycyAicHJpbnRhYmxlIiwgdXNpbmcgY2hhcmFjdGVyIGVzY2FwZSBjb2RlcyAoQ0VDKQorc3ViIHF1b3RfY2VjIHsKKwlteSAkY250cmwgPSBzaGlmdDsKKwlteSAlZXMgPSAoICMgY2hhcmFjdGVyIGVzY2FwZSBjb2RlcywgYWthIGVzY2FwZSBzZXF1ZW5jZXMKKwkJICAgIlx0IiA9PiAnXHQnLCAgICMgdGFiICAgICAgICAgICAgKEhUKQorCQkgICAiXG4iID0+ICdcbicsICAgIyBsaW5lIGZlZWQgICAgICAoTEYpCisJCSAgICJcciIgPT4gJ1xyJywgICAjIGNhcnJpZ2UgcmV0dXJuIChDUikKKwkJICAgIlxmIiA9PiAnXGYnLCAgICMgZm9ybSBmZWVkICAgICAgKEZGKQorCQkgICAiXGIiID0+ICdcYicsICAgIyBiYWNrc3BhY2UgICAgICAoQlMpCisJCSAgICJcYSIgPT4gJ1xhJywgICAjIGFsYXJtIChiZWxsKSAgIChCRUwpCisJCSAgICJcZSIgPT4gJ1xlJywgICAjIGVzY2FwZSAgICAgICAgIChFU0MpCisJCSAgICJcMDEzIiA9PiAnXHYnLCAjIHZlcnRpY2FsIHRhYiAgIChWVCkKKwkJICAgIlwwMDAiID0+ICdcMCcsICMgbnVsIGNoYXJhY3RlciAgKE5VTCkKKwkJICAgKTsKKwlteSAkY2hyID0gKCAoZXhpc3RzICRlc3skY250cmx9KQorCQkgICAgPyAkZXN7JGNudHJsfQorCQkgICAgOiBzcHJpbnRmKCdcJTAzbycsIG9yZCgkY250cmwpKSApOworCXJldHVybiAiPHNwYW4gY2xhc3M9XCJjbnRybFwiPiRjaHI8L3NwYW4+IjsKK30KKworIyBBbHRlcm5hdGl2ZWx5IHVzZSB1bmljb2RlIGNvbnRyb2wgcGljdHVyZXMgY29kZXBvaW50cywKKyMgVW5pY29kZSAicHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIiAoUFIpCitzdWIgcXVvdF91cHIgeworCW15ICRjbnRybCA9IHNoaWZ0OworCW15ICRjaHIgPSBzcHJpbnRmKCcmIyUwNGQ7JywgMHgyNDAwK29yZCgkY250cmwpKTsKKwlyZXR1cm4gIjxzcGFuIGNsYXNzPVwiY250cmxcIj4kY2hyPC9zcGFuPiI7Cit9CisKKyMgZ2l0IG1heSByZXR1cm4gcXVvdGVkIGFuZCBlc2NhcGVkIGZpbGVuYW1lcworc3ViIHVucXVvdGUgeworCW15ICRzdHIgPSBzaGlmdDsKKworCXN1YiB1bnEgeworCQlteSAkc2VxID0gc2hpZnQ7CisJCW15ICVlcyA9ICggIyBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzLCBha2EgZXNjYXBlIHNlcXVlbmNlcworCQkJJ3QnID0+ICJcdCIsICAgIyB0YWIgICAgICAgICAgICAoSFQsIFRBQikKKwkJCSduJyA9PiAiXG4iLCAgICMgbmV3bGluZSAgICAgICAgKE5MKQorCQkJJ3InID0+ICJcciIsICAgIyByZXR1cm4gICAgICAgICAoQ1IpCisJCQknZicgPT4gIlxmIiwgICAjIGZvcm0gZmVlZCAgICAgIChGRikKKwkJCSdiJyA9PiAiXGIiLCAgICMgYmFja3NwYWNlICAgICAgKEJTKQorCQkJJ2EnID0+ICJcYSIsICAgIyBhbGFybSAoYmVsbCkgICAoQkVMKQorCQkJJ2UnID0+ICJcZSIsICAgIyBlc2NhcGUgICAgICAgICAoRVNDKQorCQkJJ3YnID0+ICJcMDEzIiwgIyB2ZXJ0aWNhbCB0YWIgICAoVlQpCisJCSk7CisKKwkJaWYgKCRzZXEgPX4gbS9eWzAtN117MSwzfSQvKSB7CisJCQkjIG9jdGFsIGNoYXIgc2VxdWVuY2UKKwkJCXJldHVybiBjaHIob2N0KCRzZXEpKTsKKwkJfSBlbHNpZiAoZXhpc3RzICRlc3skc2VxfSkgeworCQkJIyBDIGVzY2FwZSBzZXF1ZW5jZSwgYWthIGNoYXJhY3RlciBlc2NhcGUgY29kZQorCQkJcmV0dXJuICRlc3skc2VxfQorCQl9CisJCSMgcXVvdGVkIG9yZGluYXJ5IGNoYXJhY3RlcgorCQlyZXR1cm4gJHNlcTsKKwl9CisKKwlpZiAoJHN0ciA9fiBtL14iKC4qKSIkLykgeworCQkjIG5lZWRzIHVucXVvdGluZworCQkkc3RyID0gJDE7CisJCSRzdHIgPX4gcy9cXChbXjAtN118WzAtN117MSwzfSkvdW5xKCQxKS9lZzsKKwl9CisJcmV0dXJuICRzdHI7Cit9CisKKyMgZXNjYXBlIHRhYnMgKGNvbnZlcnQgdGFicyB0byBzcGFjZXMpCitzdWIgdW50YWJpZnkgeworCW15ICRsaW5lID0gc2hpZnQ7CisKKwl3aGlsZSAoKG15ICRwb3MgPSBpbmRleCgkbGluZSwgIlx0IikpICE9IC0xKSB7CisJCWlmIChteSAkY291bnQgPSAoOCAtICgkcG9zICUgOCkpKSB7CisJCQlteSAkc3BhY2VzID0gJyAnIHggJGNvdW50OworCQkJJGxpbmUgPX4gcy9cdC8kc3BhY2VzLzsKKwkJfQorCX0KKworCXJldHVybiAkbGluZTsKK30KKworc3ViIHByb2plY3RfaW5fbGlzdCB7CisJbXkgJHByb2plY3QgPSBzaGlmdDsKKwlteSBAbGlzdCA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgpOworCXJldHVybiBAbGlzdCAmJiBzY2FsYXIoZ3JlcCB7ICRfLT57J3BhdGgnfSBlcSAkcHJvamVjdCB9IEBsaXN0KTsKK30KKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgSFRNTCBhd2FyZSBzdHJpbmcgbWFuaXB1bGF0aW9uCisKK3N1YiBjaG9wX3N0ciB7CisJbXkgJHN0ciA9IHNoaWZ0OworCW15ICRsZW4gPSBzaGlmdDsKKwlteSAkYWRkX2xlbiA9IHNoaWZ0IHx8IDEwOworCisJIyBhbGxvdyBvbmx5ICRsZW4gY2hhcnMsIGJ1dCBkb24ndCBjdXQgYSB3b3JkIGlmIGl0IHdvdWxkIGZpdCBpbiAkYWRkX2xlbgorCSMgaWYgaXQgZG9lc24ndCBmaXQsIGN1dCBpdCBpZiBpdCdzIHN0aWxsIGxvbmdlciB0aGFuIHRoZSBkb3RzIHdlIHdvdWxkIGFkZAorCSRzdHIgPX4gbS9eKC57MCwkbGVufVteIFwvXC1fOlwuQF17MCwkYWRkX2xlbn0pKC4qKS87CisJbXkgJGJvZHkgPSAkMTsKKwlteSAkdGFpbCA9ICQyOworCWlmIChsZW5ndGgoJHRhaWwpID4gNCkgeworCQkkdGFpbCA9ICIgLi4uIjsKKwkJJGJvZHkgPX4gcy8mW147XSokLy87ICMgcmVtb3ZlIGNob3BwZWQgY2hhcmFjdGVyIGVudGl0aWVzCisJfQorCXJldHVybiAiJGJvZHkkdGFpbCI7Cit9CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIGZ1bmN0aW9ucyByZXR1cm5pbmcgc2hvcnQgc3RyaW5ncworCisjIENTUyBjbGFzcyBmb3IgZ2l2ZW4gYWdlIHZhbHVlIChpbiBzZWNvbmRzKQorc3ViIGFnZV9jbGFzcyB7CisJbXkgJGFnZSA9IHNoaWZ0OworCisJaWYgKCFkZWZpbmVkICRhZ2UpIHsKKwkJcmV0dXJuICJub2FnZSI7CisJfSBlbHNpZiAoJGFnZSA8IDYwKjYwKjIpIHsKKwkJcmV0dXJuICJhZ2UwIjsKKwl9IGVsc2lmICgkYWdlIDwgNjAqNjAqMjQqMikgeworCQlyZXR1cm4gImFnZTEiOworCX0gZWxzZSB7CisJCXJldHVybiAiYWdlMiI7CisJfQorfQorCisjIGNvbnZlcnQgYWdlIGluIHNlY29uZHMgdG8gIm5uIHVuaXRzIGFnbyIgc3RyaW5nCitzdWIgYWdlX3N0cmluZyB7CisJbXkgJGFnZSA9IHNoaWZ0OworCW15ICRhZ2Vfc3RyOworCisJaWYgKCRhZ2UgPiA2MCo2MCoyNCozNjUqMikgeworCQkkYWdlX3N0ciA9IChpbnQgJGFnZS82MC82MC8yNC8zNjUpOworCQkkYWdlX3N0ciAuPSAiIHllYXJzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjYwKjI0KigzNjUvMTIpKjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MC82MC8yNC8oMzY1LzEyKTsKKwkJJGFnZV9zdHIgLj0gIiBtb250aHMgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMjQqNyoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjAvNjAvMjQvNzsKKwkJJGFnZV9zdHIgLj0gIiB3ZWVrcyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCo2MCoyNCoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjAvNjAvMjQ7CisJCSRhZ2Vfc3RyIC49ICIgZGF5cyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCo2MCoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjAvNjA7CisJCSRhZ2Vfc3RyIC49ICIgaG91cnMgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwOworCQkkYWdlX3N0ciAuPSAiIG1pbiBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiAyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2U7CisJCSRhZ2Vfc3RyIC49ICIgc2VjIGFnbyI7CisJfSBlbHNlIHsKKwkJJGFnZV9zdHIgLj0gIiByaWdodCBub3ciOworCX0KKwlyZXR1cm4gJGFnZV9zdHI7Cit9CisKKyMgY29udmVydCBmaWxlIG1vZGUgaW4gb2N0YWwgdG8gc3ltYm9saWMgZmlsZSBtb2RlIHN0cmluZworc3ViIG1vZGVfc3RyIHsKKwlteSAkbW9kZSA9IG9jdCBzaGlmdDsKKworCWlmIChTX0lTRElSKCRtb2RlICYgU19JRk1UKSkgeworCQlyZXR1cm4gJ2Ryd3hyLXhyLXgnOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAnbHJ3eHJ3eHJ3eCc7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJIyBnaXQgY2FyZXMgb25seSBhYm91dCB0aGUgZXhlY3V0YWJsZSBiaXQKKwkJaWYgKCRtb2RlICYgU19JWFVTUikgeworCQkJcmV0dXJuICctcnd4ci14ci14JzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAnLXJ3LXItLXItLSc7CisJCX07CisJfSBlbHNlIHsKKwkJcmV0dXJuICctLS0tLS0tLS0tJzsKKwl9Cit9CisKKyMgY29udmVydCBmaWxlIG1vZGUgaW4gb2N0YWwgdG8gZmlsZSB0eXBlIHN0cmluZworc3ViIGZpbGVfdHlwZSB7CisJbXkgJG1vZGUgPSBzaGlmdDsKKworCWlmICgkbW9kZSAhfiBtL15bMC03XSskLykgeworCQlyZXR1cm4gJG1vZGU7CisJfSBlbHNlIHsKKwkJJG1vZGUgPSBvY3QgJG1vZGU7CisJfQorCisJaWYgKFNfSVNESVIoJG1vZGUgJiBTX0lGTVQpKSB7CisJCXJldHVybiAiZGlyZWN0b3J5IjsKKwl9IGVsc2lmIChTX0lTTE5LKCRtb2RlKSkgeworCQlyZXR1cm4gInN5bWxpbmsiOworCX0gZWxzaWYgKFNfSVNSRUcoJG1vZGUpKSB7CisJCXJldHVybiAiZmlsZSI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKyMgY29udmVydCBmaWxlIG1vZGUgaW4gb2N0YWwgdG8gZmlsZSB0eXBlIGRlc2NyaXB0aW9uIHN0cmluZworc3ViIGZpbGVfdHlwZV9sb25nIHsKKwlteSAkbW9kZSA9IHNoaWZ0OworCisJaWYgKCRtb2RlICF+IG0vXlswLTddKyQvKSB7CisJCXJldHVybiAkbW9kZTsKKwl9IGVsc2UgeworCQkkbW9kZSA9IG9jdCAkbW9kZTsKKwl9CisKKwlpZiAoU19JU0RJUigkbW9kZSAmIFNfSUZNVCkpIHsKKwkJcmV0dXJuICJkaXJlY3RvcnkiOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAic3ltbGluayI7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJaWYgKCRtb2RlICYgU19JWFVTUikgeworCQkJcmV0dXJuICJleGVjdXRhYmxlIjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAiZmlsZSI7CisJCX07CisJfSBlbHNlIHsKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgZnVuY3Rpb25zIHJldHVybmluZyBzaG9ydCBIVE1MIGZyYWdtZW50cywgb3IgdHJhbnNmb3JtaW5nIEhUTUwgZnJhZ21lbnRzCisjIyB3aGljaCBkb24ndCBiZWxvbmcgdG8gb3RoZXIgc2VjdGlvbnMKKworIyBmb3JtYXQgbGluZSBvZiBjb21taXQgbWVzc2FnZS4KK3N1YiBmb3JtYXRfbG9nX2xpbmVfaHRtbCB7CisJbXkgJGxpbmUgPSBzaGlmdDsKKworCSRsaW5lID0gZXNjX2h0bWwoJGxpbmUsIC1uYnNwPT4xKTsKKwlpZiAoJGxpbmUgPX4gbS8oWzAtOWEtZkEtRl17OCw0MH0pLykgeworCQlteSAkaGFzaF90ZXh0ID0gJDE7CisJCW15ICRsaW5rID0KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ib2JqZWN0IiwgaGFzaD0+JGhhc2hfdGV4dCksCisJCQkgICAgICAgIC1jbGFzcyA9PiAidGV4dCJ9LCAkaGFzaF90ZXh0KTsKKwkJJGxpbmUgPX4gcy8kaGFzaF90ZXh0LyRsaW5rLzsKKwl9CisJcmV0dXJuICRsaW5lOworfQorCisjIGZvcm1hdCBtYXJrZXIgb2YgcmVmcyBwb2ludGluZyB0byBnaXZlbiBvYmplY3QKK3N1YiBmb3JtYXRfcmVmX21hcmtlciB7CisJbXkgKCRyZWZzLCAkaWQpID0gQF87CisJbXkgJG1hcmtlcnMgPSAnJzsKKworCWlmIChkZWZpbmVkICRyZWZzLT57JGlkfSkgeworCQlmb3JlYWNoIG15ICRyZWYgKEB7JHJlZnMtPnskaWR9fSkgeworCQkJbXkgKCR0eXBlLCAkbmFtZSkgPSBxdygpOworCQkJIyBlLmcuIHRhZ3MvdjIuNi4xMSBvciBoZWFkcy9uZXh0CisJCQlpZiAoJHJlZiA9fiBtIV4oLio/KXM/LyguKikkISkgeworCQkJCSR0eXBlID0gJDE7CisJCQkJJG5hbWUgPSAkMjsKKwkJCX0gZWxzZSB7CisJCQkJJHR5cGUgPSAicmVmIjsKKwkJCQkkbmFtZSA9ICRyZWY7CisJCQl9CisKKwkJCSRtYXJrZXJzIC49ICIgPHNwYW4gY2xhc3M9XCIkdHlwZVwiIHRpdGxlPVwiJHJlZlwiPiIgLgorCQkJICAgICAgICAgICAgZXNjX2h0bWwoJG5hbWUpIC4gIjwvc3Bhbj4iOworCQl9CisJfQorCisJaWYgKCRtYXJrZXJzKSB7CisJCXJldHVybiAnIDxzcGFuIGNsYXNzPSJyZWZzIj4nLiAkbWFya2VycyAuICc8L3NwYW4+JzsKKwl9IGVsc2UgeworCQlyZXR1cm4gIiI7CisJfQorfQorCisjIGZvcm1hdCwgcGVyaGFwcyBzaG9ydGVuZWQgYW5kIHdpdGggbWFya2VycywgdGl0bGUgbGluZQorc3ViIGZvcm1hdF9zdWJqZWN0X2h0bWwgeworCW15ICgkbG9uZywgJHNob3J0LCAkaHJlZiwgJGV4dHJhKSA9IEBfOworCSRleHRyYSA9ICcnIHVubGVzcyBkZWZpbmVkKCRleHRyYSk7CisKKwlpZiAobGVuZ3RoKCRzaG9ydCkgPCBsZW5ndGgoJGxvbmcpKSB7CisJCXJldHVybiAkY2dpLT5hKHstaHJlZiA9PiAkaHJlZiwgLWNsYXNzID0+ICJsaXN0IHN1YmplY3QiLAorCQkgICAgICAgICAgICAgICAgLXRpdGxlID0+IGRlY29kZV91dGY4KCRsb25nKX0sCisJCSAgICAgICBlc2NfaHRtbCgkc2hvcnQpIC4gJGV4dHJhKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gJGNnaS0+YSh7LWhyZWYgPT4gJGhyZWYsIC1jbGFzcyA9PiAibGlzdCBzdWJqZWN0In0sCisJCSAgICAgICBlc2NfaHRtbCgkbG9uZykgIC4gJGV4dHJhKTsKKwl9Cit9CisKKyMgZm9ybWF0IHBhdGNoIChkaWZmKSBsaW5lIChyYXRoZXIgbm90IHRvIGJlIHVzZWQgZm9yIGRpZmYgaGVhZGVycykKK3N1YiBmb3JtYXRfZGlmZl9saW5lIHsKKwlteSAkbGluZSA9IHNoaWZ0OworCW15ICgkZnJvbSwgJHRvKSA9IEBfOworCW15ICRkaWZmX2NsYXNzID0gIiI7CisKKwljaG9tcCAkbGluZTsKKworCWlmICgkZnJvbSAmJiAkdG8gJiYgcmVmKCRmcm9tLT57J2hyZWYnfSkgZXEgIkFSUkFZIikgeworCQkjIGNvbWJpbmVkIGRpZmYKKwkJbXkgJHByZWZpeCA9IHN1YnN0cigkbGluZSwgMCwgc2NhbGFyIEB7JGZyb20tPnsnaHJlZid9fSk7CisJCWlmICgkbGluZSA9fiBtL15cQHszfS8pIHsKKwkJCSRkaWZmX2NsYXNzID0gIiBjaHVua19oZWFkZXIiOworCQl9IGVsc2lmICgkbGluZSA9fiBtL15cXC8pIHsKKwkJCSRkaWZmX2NsYXNzID0gIiBpbmNvbXBsZXRlIjsKKwkJfSBlbHNpZiAoJHByZWZpeCA9fiB0ci8rLysvKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgYWRkIjsKKwkJfSBlbHNpZiAoJHByZWZpeCA9fiB0ci8tLy0vKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgcmVtIjsKKwkJfQorCX0gZWxzZSB7CisJCSMgYXNzdW1lIG9yZGluYXJ5IGRpZmYKKwkJbXkgJGNoYXIgPSBzdWJzdHIoJGxpbmUsIDAsIDEpOworCQlpZiAoJGNoYXIgZXEgJysnKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgYWRkIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgJy0nKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgcmVtIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgJ0AnKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgY2h1bmtfaGVhZGVyIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgIlxcIikgeworCQkJJGRpZmZfY2xhc3MgPSAiIGluY29tcGxldGUiOworCQl9CisJfQorCSRsaW5lID0gdW50YWJpZnkoJGxpbmUpOworCWlmICgkZnJvbSAmJiAkdG8gJiYgJGxpbmUgPX4gbS9eXEB7Mn0gLykgeworCQlteSAoJGZyb21fdGV4dCwgJGZyb21fc3RhcnQsICRmcm9tX2xpbmVzLCAkdG9fdGV4dCwgJHRvX3N0YXJ0LCAkdG9fbGluZXMsICRzZWN0aW9uKSA9CisJCQkkbGluZSA9fiBtL15cQHsyfSAoLShcZCspKD86LChcZCspKT8pIChcKyhcZCspKD86LChcZCspKT8pIFxAezJ9KC4qKSQvOworCisJCSRmcm9tX2xpbmVzID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbV9saW5lczsKKwkJJHRvX2xpbmVzICAgPSAwIHVubGVzcyBkZWZpbmVkICR0b19saW5lczsKKworCQlpZiAoJGZyb20tPnsnaHJlZid9KSB7CisJCQkkZnJvbV90ZXh0ID0gJGNnaS0+YSh7LWhyZWY9PiIkZnJvbS0+eydocmVmJ30jbCRmcm9tX3N0YXJ0IiwKKwkJCSAgICAgICAgICAgICAgICAgICAgIC1jbGFzcz0+Imxpc3QifSwgJGZyb21fdGV4dCk7CisJCX0KKwkJaWYgKCR0by0+eydocmVmJ30pIHsKKwkJCSR0b190ZXh0ICAgPSAkY2dpLT5hKHstaHJlZj0+IiR0by0+eydocmVmJ30jbCR0b19zdGFydCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAtY2xhc3M9PiJsaXN0In0sICR0b190ZXh0KTsKKwkJfQorCQkkbGluZSA9ICI8c3BhbiBjbGFzcz1cImNodW5rX2luZm9cIj5AQCAkZnJvbV90ZXh0ICR0b190ZXh0IEBAPC9zcGFuPiIgLgorCQkgICAgICAgICI8c3BhbiBjbGFzcz1cInNlY3Rpb25cIj4iIC4gZXNjX2h0bWwoJHNlY3Rpb24sIC1uYnNwPT4xKSAuICI8L3NwYW4+IjsKKwkJcmV0dXJuICI8ZGl2IGNsYXNzPVwiZGlmZiRkaWZmX2NsYXNzXCI+JGxpbmU8L2Rpdj5cbiI7CisJfSBlbHNpZiAoJGZyb20gJiYgJHRvICYmICRsaW5lID1+IG0vXlxAezN9LykgeworCQlteSAoJHByZWZpeCwgJHJhbmdlcywgJHNlY3Rpb24pID0gJGxpbmUgPX4gbS9eKFxAKykgKC4qPykgXEArKC4qKSQvOworCQlteSAoQGZyb21fdGV4dCwgQGZyb21fc3RhcnQsIEBmcm9tX25saW5lcywgJHRvX3RleHQsICR0b19zdGFydCwgJHRvX25saW5lcyk7CisKKwkJQGZyb21fdGV4dCA9IHNwbGl0KCcgJywgJHJhbmdlcyk7CisJCWZvciAobXkgJGkgPSAwOyAkaSA8IEBmcm9tX3RleHQ7ICsrJGkpIHsKKwkJCSgkZnJvbV9zdGFydFskaV0sICRmcm9tX25saW5lc1skaV0pID0KKwkJCQkoc3BsaXQoJywnLCBzdWJzdHIoJGZyb21fdGV4dFskaV0sIDEpKSwgMCk7CisJCX0KKworCQkkdG9fdGV4dCAgID0gcG9wIEBmcm9tX3RleHQ7CisJCSR0b19zdGFydCAgPSBwb3AgQGZyb21fc3RhcnQ7CisJCSR0b19ubGluZXMgPSBwb3AgQGZyb21fbmxpbmVzOworCisJCSRsaW5lID0gIjxzcGFuIGNsYXNzPVwiY2h1bmtfaW5mb1wiPiRwcmVmaXggIjsKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgQGZyb21fdGV4dDsgKyskaSkgeworCQkJaWYgKCRmcm9tLT57J2hyZWYnfVskaV0pIHsKKwkJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+IiRmcm9tLT57J2hyZWYnfVskaV0jbCRmcm9tX3N0YXJ0WyRpXSIsCisJCQkJICAgICAgICAgICAgICAgICAgLWNsYXNzPT4ibGlzdCJ9LCAkZnJvbV90ZXh0WyRpXSk7CisJCQl9IGVsc2UgeworCQkJCSRsaW5lIC49ICRmcm9tX3RleHRbJGldOworCQkJfQorCQkJJGxpbmUgLj0gIiAiOworCQl9CisJCWlmICgkdG8tPnsnaHJlZid9KSB7CisJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+IiR0by0+eydocmVmJ30jbCR0b19zdGFydCIsCisJCQkgICAgICAgICAgICAgICAgICAtY2xhc3M9PiJsaXN0In0sICR0b190ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCSRsaW5lIC49ICR0b190ZXh0OworCQl9CisJCSRsaW5lIC49ICIgJHByZWZpeDwvc3Bhbj4iIC4KKwkJICAgICAgICAgIjxzcGFuIGNsYXNzPVwic2VjdGlvblwiPiIgLiBlc2NfaHRtbCgkc2VjdGlvbiwgLW5ic3A9PjEpIC4gIjwvc3Bhbj4iOworCQlyZXR1cm4gIjxkaXYgY2xhc3M9XCJkaWZmJGRpZmZfY2xhc3NcIj4kbGluZTwvZGl2PlxuIjsKKwl9CisJcmV0dXJuICI8ZGl2IGNsYXNzPVwiZGlmZiRkaWZmX2NsYXNzXCI+IiAuIGVzY19odG1sKCRsaW5lLCAtbmJzcD0+MSkgLiAiPC9kaXY+XG4iOworfQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBnaXQgdXRpbGl0eSBzdWJyb3V0aW5lcywgaW52b2tpbmcgZ2l0IGNvbW1hbmRzCisKKyMgcmV0dXJucyBwYXRoIHRvIHRoZSBjb3JlIGdpdCBleGVjdXRhYmxlIGFuZCB0aGUgLS1naXQtZGlyIHBhcmFtZXRlciBhcyBsaXN0CitzdWIgZ2l0X2NtZCB7CisJcmV0dXJuICRHSVQsICctLWdpdC1kaXI9Jy4kZ2l0X2RpcjsKK30KKworIyByZXR1cm5zIHBhdGggdG8gdGhlIGNvcmUgZ2l0IGV4ZWN1dGFibGUgYW5kIHRoZSAtLWdpdC1kaXIgcGFyYW1ldGVyIGFzIHN0cmluZworc3ViIGdpdF9jbWRfc3RyIHsKKwlyZXR1cm4gam9pbignICcsIGdpdF9jbWQoKSk7Cit9CisKKyMgZ2V0IEhFQUQgcmVmIG9mIGdpdmVuIHByb2plY3QgYXMgaGFzaAorc3ViIGdpdF9nZXRfaGVhZF9oYXNoIHsKKwlteSAkcHJvamVjdCA9IHNoaWZ0OworCW15ICRvX2dpdF9kaXIgPSAkZ2l0X2RpcjsKKwlteSAkcmV0dmFsID0gdW5kZWY7CisJJGdpdF9kaXIgPSAiJHByb2plY3Ryb290LyRwcm9qZWN0IjsKKwlpZiAob3BlbiBteSAkZmQsICItfCIsIGdpdF9jbWQoKSwgInJldi1wYXJzZSIsICItLXZlcmlmeSIsICJIRUFEIikgeworCQlteSAkaGVhZCA9IDwkZmQ+OworCQljbG9zZSAkZmQ7CisJCWlmIChkZWZpbmVkICRoZWFkICYmICRoZWFkID1+IC9eKFswLTlhLWZBLUZdezQwfSkkLykgeworCQkJJHJldHZhbCA9ICQxOworCQl9CisJfQorCWlmIChkZWZpbmVkICRvX2dpdF9kaXIpIHsKKwkJJGdpdF9kaXIgPSAkb19naXRfZGlyOworCX0KKwlyZXR1cm4gJHJldHZhbDsKK30KKworIyBnZXQgdHlwZSBvZiBnaXZlbiBvYmplY3QKK3N1YiBnaXRfZ2V0X3R5cGUgeworCW15ICRoYXNoID0gc2hpZnQ7CisKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiY2F0LWZpbGUiLCAnLXQnLCAkaGFzaCBvciByZXR1cm47CisJbXkgJHR5cGUgPSA8JGZkPjsKKwljbG9zZSAkZmQgb3IgcmV0dXJuOworCWNob21wICR0eXBlOworCXJldHVybiAkdHlwZTsKK30KKworc3ViIGdpdF9nZXRfcHJvamVjdF9jb25maWcgeworCW15ICgka2V5LCAkdHlwZSkgPSBAXzsKKworCXJldHVybiB1bmxlc3MgKCRrZXkpOworCSRrZXkgPX4gcy9eZ2l0d2ViXC4vLzsKKwlyZXR1cm4gaWYgKCRrZXkgPX4gbS9cVy8pOworCisJbXkgQHggPSAoZ2l0X2NtZCgpLCAnY29uZmlnJyk7CisJaWYgKGRlZmluZWQgJHR5cGUpIHsgcHVzaCBAeCwgJHR5cGU7IH0KKwlwdXNoIEB4LCAiLS1nZXQiOworCXB1c2ggQHgsICJnaXR3ZWIuJGtleSI7CisJbXkgJHZhbCA9IHF4KEB4KTsKKwljaG9tcCAkdmFsOworCXJldHVybiAoJHZhbCk7Cit9CisKKyMgZ2V0IGhhc2ggb2YgZ2l2ZW4gcGF0aCBhdCBnaXZlbiByZWYKK3N1YiBnaXRfZ2V0X2hhc2hfYnlfcGF0aCB7CisJbXkgJGJhc2UgPSBzaGlmdDsKKwlteSAkcGF0aCA9IHNoaWZ0IHx8IHJldHVybiB1bmRlZjsKKwlteSAkdHlwZSA9IHNoaWZ0OworCisJJHBhdGggPX4gcywvKyQsLDsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJscy10cmVlIiwgJGJhc2UsICItLSIsICRwYXRoCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWxzLXRyZWUgZmFpbGVkIik7CisJbXkgJGxpbmUgPSA8JGZkPjsKKwljbG9zZSAkZmQgb3IgcmV0dXJuIHVuZGVmOworCisJaWYgKCFkZWZpbmVkICRsaW5lKSB7CisJCSMgdGhlcmUgaXMgbm8gdHJlZSBvciBoYXNoIGdpdmVuIGJ5ICRwYXRoIGF0ICRiYXNlCisJCXJldHVybiB1bmRlZjsKKwl9CisKKwkjJzEwMDY0NCBibG9iIDBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQvOworCWlmIChkZWZpbmVkICR0eXBlICYmICR0eXBlIG5lICQyKSB7CisJCSMgdHlwZSBkb2Vzbid0IG1hdGNoCisJCXJldHVybiB1bmRlZjsKKwl9CisJcmV0dXJuICQzOworfQorCisjIGdldCBwYXRoIG9mIGVudHJ5IHdpdGggZ2l2ZW4gaGFzaCBhdCBnaXZlbiB0cmVlLWlzaCAocmVmKQorIyB1c2VkIHRvIGdldCAnZnJvbScgZmlsZW5hbWUgZm9yIGNvbWJpbmVkIGRpZmYgKG1lcmdlIGNvbW1pdCkgZm9yIHJlbmFtZXMKK3N1YiBnaXRfZ2V0X3BhdGhfYnlfaGFzaCB7CisJbXkgJGJhc2UgPSBzaGlmdCB8fCByZXR1cm47CisJbXkgJGhhc2ggPSBzaGlmdCB8fCByZXR1cm47CisKKwlsb2NhbCAkLyA9ICJcMCI7CisKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAibHMtdHJlZSIsICctcicsICctdCcsICcteicsICRiYXNlCisJCW9yIHJldHVybiB1bmRlZjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCAkbGluZTsKKworCQkjJzA0MDAwMCB0cmVlIDU5NTU5NmE2YTkxMTdkZGJhOWZlMzc5YjZiMDEyYjU1OGJhYzg0MjMJZ2l0d2ViJworCQkjJzEwMDY0NCBibG9iIGUwMmU5MGYwNDI5YmUwZDJhNjliNzY1NzExMDFmMjBiOGY3NTUzMGYJZ2l0d2ViL1JFQURNRScKKwkJaWYgKCRsaW5lID1+IG0vKD86WzAtOV0rKSAoPzouKykgJGhhc2hcdCguKykkLykgeworCQkJY2xvc2UgJGZkOworCQkJcmV0dXJuICQxOworCQl9CisJfQorCWNsb3NlICRmZDsKKwlyZXR1cm4gdW5kZWY7Cit9CisKKyMjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyMjIGdpdCB1dGlsaXR5IGZ1bmN0aW9ucywgZGlyZWN0bHkgYWNjZXNzaW5nIGdpdCByZXBvc2l0b3J5CisKK3N1YiBnaXRfZ2V0X3Byb2plY3RfZGVzY3JpcHRpb24geworCW15ICRwYXRoID0gc2hpZnQ7CisKKwlvcGVuIG15ICRmZCwgIiRwcm9qZWN0cm9vdC8kcGF0aC9kZXNjcmlwdGlvbiIgb3IgcmV0dXJuIHVuZGVmOworCW15ICRkZXNjciA9IDwkZmQ+OworCWNsb3NlICRmZDsKKwlpZiAoZGVmaW5lZCAkZGVzY3IpIHsKKwkJY2hvbXAgJGRlc2NyOworCX0KKwlyZXR1cm4gJGRlc2NyOworfQorCitzdWIgZ2l0X2dldF9wcm9qZWN0X3VybF9saXN0IHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCisJb3BlbiBteSAkZmQsICIkcHJvamVjdHJvb3QvJHBhdGgvY2xvbmV1cmwiIG9yIHJldHVybjsKKwlteSBAZ2l0X3Byb2plY3RfdXJsX2xpc3QgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwljbG9zZSAkZmQ7CisKKwlyZXR1cm4gd2FudGFycmF5ID8gQGdpdF9wcm9qZWN0X3VybF9saXN0IDogXEBnaXRfcHJvamVjdF91cmxfbGlzdDsKK30KKworc3ViIGdpdF9nZXRfcHJvamVjdHNfbGlzdCB7CisJbXkgKCRmaWx0ZXIpID0gQF87CisJbXkgQGxpc3Q7CisKKwkkZmlsdGVyIHx8PSAnJzsKKwkkZmlsdGVyID1+IHMvXC5naXQkLy87CisKKwlteSAoJGNoZWNrX2ZvcmtzKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdmb3JrcycpOworCisJaWYgKC1kICRwcm9qZWN0c19saXN0KSB7CisJCSMgc2VhcmNoIGluIGRpcmVjdG9yeQorCQlteSAkZGlyID0gJHByb2plY3RzX2xpc3QgLiAoJGZpbHRlciA/ICIvJGZpbHRlciIgOiAnJyk7CisJCSMgcmVtb3ZlIHRoZSB0cmFpbGluZyAiLyIKKwkJJGRpciA9fiBzIS8rJCEhOworCQlteSAkcGZ4bGVuID0gbGVuZ3RoKCIkZGlyIik7CisKKwkJRmlsZTo6RmluZDo6ZmluZCh7CisJCQlmb2xsb3dfZmFzdCA9PiAxLCAjIGZvbGxvdyBzeW1ib2xpYyBsaW5rcworCQkJZGFuZ2xpbmdfc3ltbGlua3MgPT4gMCwgIyBpZ25vcmUgZGFuZ2xpbmcgc3ltbGlua3MsIHNpbGVudGx5CisJCQl3YW50ZWQgPT4gc3ViIHsKKwkJCQkjIHNraXAgcHJvamVjdC1saXN0IHRvcGxldmVsLCBpZiB3ZSBnZXQgaXQuCisJCQkJcmV0dXJuIGlmIChtIV5bLy5dJCEpOworCQkJCSMgb25seSBkaXJlY3RvcmllcyBjYW4gYmUgZ2l0IHJlcG9zaXRvcmllcworCQkJCXJldHVybiB1bmxlc3MgKC1kICRfKTsKKworCQkJCW15ICRzdWJkaXIgPSBzdWJzdHIoJEZpbGU6OkZpbmQ6Om5hbWUsICRwZnhsZW4gKyAxKTsKKwkJCQkjIHdlIGNoZWNrIHJlbGF0ZWQgZmlsZSBpbiAkcHJvamVjdHJvb3QKKwkJCQlpZiAoJGNoZWNrX2ZvcmtzIGFuZCAkc3ViZGlyID1+IG0jLy4jKSB7CisJCQkJCSRGaWxlOjpGaW5kOjpwcnVuZSA9IDE7CisJCQkJfSBlbHNpZiAoY2hlY2tfZXhwb3J0X29rKCIkcHJvamVjdHJvb3QvJGZpbHRlci8kc3ViZGlyIikpIHsKKwkJCQkJcHVzaCBAbGlzdCwgeyBwYXRoID0+ICgkZmlsdGVyID8gIiRmaWx0ZXIvIiA6ICcnKSAuICRzdWJkaXIgfTsKKwkJCQkJJEZpbGU6OkZpbmQ6OnBydW5lID0gMTsKKwkJCQl9CisJCQl9LAorCQl9LCAiJGRpciIpOworCisJfSBlbHNpZiAoLWYgJHByb2plY3RzX2xpc3QpIHsKKwkJIyByZWFkIGZyb20gZmlsZSh1cmwtZW5jb2RlZCk6CisJCSMgJ2dpdCUyRmdpdC5naXQgTGludXMrVG9ydmFsZHMnCisJCSMgJ2xpYnMlMkZrbGliYyUyRmtsaWJjLmdpdCBILitQZXRlcitBbnZpbicKKwkJIyAnbGludXglMkZob3RwbHVnJTJGdWRldi5naXQgR3JlZytLcm9haC1IYXJ0bWFuJworCQlteSAlcGF0aHM7CisJCW9wZW4gbXkgKCRmZCksICRwcm9qZWN0c19saXN0IG9yIHJldHVybjsKKwlQUk9KRUNUOgorCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQlteSAoJHBhdGgsICRvd25lcikgPSBzcGxpdCAnICcsICRsaW5lOworCQkJJHBhdGggPSB1bmVzY2FwZSgkcGF0aCk7CisJCQkkb3duZXIgPSB1bmVzY2FwZSgkb3duZXIpOworCQkJaWYgKCFkZWZpbmVkICRwYXRoKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkZmlsdGVyIG5lICcnKSB7CisJCQkJIyBsb29raW5nIGZvciBmb3JrczsKKwkJCQlteSAkcGZ4ID0gc3Vic3RyKCRwYXRoLCAwLCBsZW5ndGgoJGZpbHRlcikpOworCQkJCWlmICgkcGZ4IG5lICRmaWx0ZXIpIHsKKwkJCQkJbmV4dCBQUk9KRUNUOworCQkJCX0KKwkJCQlteSAkc2Z4ID0gc3Vic3RyKCRwYXRoLCBsZW5ndGgoJGZpbHRlcikpOworCQkJCWlmICgkc2Z4ICF+IC9eXC8uKlwuZ2l0JC8pIHsKKwkJCQkJbmV4dCBQUk9KRUNUOworCQkJCX0KKwkJCX0gZWxzaWYgKCRjaGVja19mb3JrcykgeworCQkJUEFUSDoKKwkJCQlmb3JlYWNoIG15ICRmaWx0ZXIgKGtleXMgJXBhdGhzKSB7CisJCQkJCSMgbG9va2luZyBmb3IgZm9ya3M7CisJCQkJCW15ICRwZnggPSBzdWJzdHIoJHBhdGgsIDAsIGxlbmd0aCgkZmlsdGVyKSk7CisJCQkJCWlmICgkcGZ4IG5lICRmaWx0ZXIpIHsKKwkJCQkJCW5leHQgUEFUSDsKKwkJCQkJfQorCQkJCQlteSAkc2Z4ID0gc3Vic3RyKCRwYXRoLCBsZW5ndGgoJGZpbHRlcikpOworCQkJCQlpZiAoJHNmeCAhfiAvXlwvLipcLmdpdCQvKSB7CisJCQkJCQluZXh0IFBBVEg7CisJCQkJCX0KKwkJCQkJIyBpcyBhIGZvcmssIGRvbid0IGluY2x1ZGUgaXQgaW4KKwkJCQkJIyB0aGUgbGlzdAorCQkJCQluZXh0IFBST0pFQ1Q7CisJCQkJfQorCQkJfQorCQkJaWYgKGNoZWNrX2V4cG9ydF9vaygiJHByb2plY3Ryb290LyRwYXRoIikpIHsKKwkJCQlteSAkcHIgPSB7CisJCQkJCXBhdGggPT4gJHBhdGgsCisJCQkJCW93bmVyID0+IGRlY29kZV91dGY4KCRvd25lciksCisJCQkJfTsKKwkJCQlwdXNoIEBsaXN0LCAkcHI7CisJCQkJKG15ICRmb3Jrc19wYXRoID0gJHBhdGgpID1+IHMvXC5naXQkLy87CisJCQkJJHBhdGhzeyRmb3Jrc19wYXRofSsrOworCQkJfQorCQl9CisJCWNsb3NlICRmZDsKKwl9CisJcmV0dXJuIEBsaXN0OworfQorCitzdWIgZ2l0X2dldF9wcm9qZWN0X293bmVyIHsKKwlteSAkcHJvamVjdCA9IHNoaWZ0OworCW15ICRvd25lcjsKKworCXJldHVybiB1bmRlZiB1bmxlc3MgJHByb2plY3Q7CisKKwkjIHJlYWQgZnJvbSBmaWxlICh1cmwtZW5jb2RlZCk6CisJIyAnZ2l0JTJGZ2l0LmdpdCBMaW51cytUb3J2YWxkcycKKwkjICdsaWJzJTJGa2xpYmMlMkZrbGliYy5naXQgSC4rUGV0ZXIrQW52aW4nCisJIyAnbGludXglMkZob3RwbHVnJTJGdWRldi5naXQgR3JlZytLcm9haC1IYXJ0bWFuJworCWlmICgtZiAkcHJvamVjdHNfbGlzdCkgeworCQlvcGVuIChteSAkZmQgLCAkcHJvamVjdHNfbGlzdCk7CisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkbGluZTsKKwkJCW15ICgkcHIsICRvdykgPSBzcGxpdCAnICcsICRsaW5lOworCQkJJHByID0gdW5lc2NhcGUoJHByKTsKKwkJCSRvdyA9IHVuZXNjYXBlKCRvdyk7CisJCQlpZiAoJHByIGVxICRwcm9qZWN0KSB7CisJCQkJJG93bmVyID0gZGVjb2RlX3V0ZjgoJG93KTsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWNsb3NlICRmZDsKKwl9CisJaWYgKCFkZWZpbmVkICRvd25lcikgeworCQkkb3duZXIgPSBnZXRfZmlsZV9vd25lcigiJHByb2plY3Ryb290LyRwcm9qZWN0Iik7CisJfQorCisJcmV0dXJuICRvd25lcjsKK30KKworc3ViIGdpdF9nZXRfbGFzdF9hY3Rpdml0eSB7CisJbXkgKCRwYXRoKSA9IEBfOworCW15ICRmZDsKKworCSRnaXRfZGlyID0gIiRwcm9qZWN0cm9vdC8kcGF0aCI7CisJb3BlbigkZmQsICItfCIsIGdpdF9jbWQoKSwgJ2Zvci1lYWNoLXJlZicsCisJICAgICAnLS1mb3JtYXQ9JShjb21taXR0ZXIpJywKKwkgICAgICctLXNvcnQ9LWNvbW1pdHRlcmRhdGUnLAorCSAgICAgJy0tY291bnQ9MScsCisJICAgICAncmVmcy9oZWFkcycpIG9yIHJldHVybjsKKwlteSAkbW9zdF9yZWNlbnQgPSA8JGZkPjsKKwljbG9zZSAkZmQgb3IgcmV0dXJuOworCWlmIChkZWZpbmVkICRtb3N0X3JlY2VudCAmJgorCSAgICAkbW9zdF9yZWNlbnQgPX4gLyAoXGQrKSBbLStdWzAxXVxkXGRcZCQvKSB7CisJCW15ICR0aW1lc3RhbXAgPSAkMTsKKwkJbXkgJGFnZSA9IHRpbWUgLSAkdGltZXN0YW1wOworCQlyZXR1cm4gKCRhZ2UsIGFnZV9zdHJpbmcoJGFnZSkpOworCX0KK30KKworc3ViIGdpdF9nZXRfcmVmZXJlbmNlcyB7CisJbXkgJHR5cGUgPSBzaGlmdCB8fCAiIjsKKwlteSAlcmVmczsKKwkjIDVkYzAxYzU5NWU2YzZlYzljY2RhNGY2ZjY5YzEzMWMwZGQ5NDVmOGMgcmVmcy90YWdzL3YyLjYuMTEKKwkjIGMzOWFlMDdmMzkzODA2Y2NmNDA2ZWY5NjZlOWExNWFmYzQzY2MzNmEgcmVmcy90YWdzL3YyLjYuMTFee30KKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAic2hvdy1yZWYiLCAiLS1kZXJlZmVyZW5jZSIsCisJCSgkdHlwZSA/ICgiLS0iLCAicmVmcy8kdHlwZSIpIDogKCkpICMgdXNlIC0tIDxwYXR0ZXJuPiBpZiAkdHlwZQorCQlvciByZXR1cm47CisKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCAkbGluZTsKKwkJaWYgKCRsaW5lID1+IG0hXihbMC05YS1mQS1GXXs0MH0pXHNyZWZzLygkdHlwZS8/W15eXSspISkgeworCQkJaWYgKGRlZmluZWQgJHJlZnN7JDF9KSB7CisJCQkJcHVzaCBAeyRyZWZzeyQxfX0sICQyOworCQkJfSBlbHNlIHsKKwkJCQkkcmVmc3skMX0gPSBbICQyIF07CisJCQl9CisJCX0KKwl9CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlyZXR1cm4gXCVyZWZzOworfQorCitzdWIgZ2l0X2dldF9yZXZfbmFtZV90YWdzIHsKKwlteSAkaGFzaCA9IHNoaWZ0IHx8IHJldHVybiB1bmRlZjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJuYW1lLXJldiIsICItLXRhZ3MiLCAkaGFzaAorCQlvciByZXR1cm47CisJbXkgJG5hbWVfcmV2ID0gPCRmZD47CisJY2xvc2UgJGZkOworCisJaWYgKCRuYW1lX3JldiA9fiBtfF4kaGFzaCB0YWdzLyguKikkfCkgeworCQlyZXR1cm4gJDE7CisJfSBlbHNlIHsKKwkJIyBjYXRjaGVzIGFsc28gJyRoYXNoIHVuZGVmaW5lZCcgb3V0cHV0CisJCXJldHVybiB1bmRlZjsKKwl9Cit9CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIHBhcnNlIHRvIGhhc2ggZnVuY3Rpb25zCisKK3N1YiBwYXJzZV9kYXRlIHsKKwlteSAkZXBvY2ggPSBzaGlmdDsKKwlteSAkdHogPSBzaGlmdCB8fCAiLTAwMDAiOworCisJbXkgJWRhdGU7CisJbXkgQG1vbnRocyA9ICgiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKTsKKwlteSBAZGF5cyA9ICgiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Iik7CisJbXkgKCRzZWMsICRtaW4sICRob3VyLCAkbWRheSwgJG1vbiwgJHllYXIsICR3ZGF5LCAkeWRheSkgPSBnbXRpbWUoJGVwb2NoKTsKKwkkZGF0ZXsnaG91cid9ID0gJGhvdXI7CisJJGRhdGV7J21pbnV0ZSd9ID0gJG1pbjsKKwkkZGF0ZXsnbWRheSd9ID0gJG1kYXk7CisJJGRhdGV7J2RheSd9ID0gJGRheXNbJHdkYXldOworCSRkYXRleydtb250aCd9ID0gJG1vbnRoc1skbW9uXTsKKwkkZGF0ZXsncmZjMjgyMid9ICAgPSBzcHJpbnRmICIlcywgJWQgJXMgJTRkICUwMmQ6JTAyZDolMDJkICswMDAwIiwKKwkgICAgICAgICAgICAgICAgICAgICAkZGF5c1skd2RheV0sICRtZGF5LCAkbW9udGhzWyRtb25dLCAxOTAwKyR5ZWFyLCAkaG91ciAsJG1pbiwgJHNlYzsKKwkkZGF0ZXsnbWRheS10aW1lJ30gPSBzcHJpbnRmICIlZCAlcyAlMDJkOiUwMmQiLAorCSAgICAgICAgICAgICAgICAgICAgICRtZGF5LCAkbW9udGhzWyRtb25dLCAkaG91ciAsJG1pbjsKKwkkZGF0ZXsnaXNvLTg2MDEnfSAgPSBzcHJpbnRmICIlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZFoiLAorCSAgICAgICAgICAgICAgICAgICAgIDE5MDArJHllYXIsICRtb24sICRtZGF5LCAkaG91ciAsJG1pbiwgJHNlYzsKKworCSR0eiA9fiBtL14oWytcLV1bMC05XVswLTldKShbMC05XVswLTldKSQvOworCW15ICRsb2NhbCA9ICRlcG9jaCArICgoaW50ICQxICsgKCQyLzYwKSkgKiAzNjAwKTsKKwkoJHNlYywgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uLCAkeWVhciwgJHdkYXksICR5ZGF5KSA9IGdtdGltZSgkbG9jYWwpOworCSRkYXRleydob3VyX2xvY2FsJ30gPSAkaG91cjsKKwkkZGF0ZXsnbWludXRlX2xvY2FsJ30gPSAkbWluOworCSRkYXRleyd0el9sb2NhbCd9ID0gJHR6OworCSRkYXRleydpc28tdHonfSA9IHNwcmludGYoIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkICVzIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MDArJHllYXIsICRtb24rMSwgJG1kYXksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAkaG91ciwgJG1pbiwgJHNlYywgJHR6KTsKKwlyZXR1cm4gJWRhdGU7Cit9CisKK3N1YiBwYXJzZV90YWcgeworCW15ICR0YWdfaWQgPSBzaGlmdDsKKwlteSAldGFnOworCW15IEBjb21tZW50OworCisJb3BlbiBteSAkZmQsICItfCIsIGdpdF9jbWQoKSwgImNhdC1maWxlIiwgInRhZyIsICR0YWdfaWQgb3IgcmV0dXJuOworCSR0YWd7J2lkJ30gPSAkdGFnX2lkOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWNob21wICRsaW5lOworCQlpZiAoJGxpbmUgPX4gbS9eb2JqZWN0IChbMC05YS1mQS1GXXs0MH0pJC8pIHsKKwkJCSR0YWd7J29iamVjdCd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnR5cGUgKC4rKSQvKSB7CisJCQkkdGFneyd0eXBlJ30gPSAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9edGFnICguKykkLykgeworCQkJJHRhZ3snbmFtZSd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnRhZ2dlciAoLiopIChbMC05XSspICguKikkLykgeworCQkJJHRhZ3snYXV0aG9yJ30gPSAkMTsKKwkJCSR0YWd7J2Vwb2NoJ30gPSAkMjsKKwkJCSR0YWd7J3R6J30gPSAkMzsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS8tLUJFR0lOLykgeworCQkJcHVzaCBAY29tbWVudCwgJGxpbmU7CisJCQlsYXN0OworCQl9IGVsc2lmICgkbGluZSBlcSAiIikgeworCQkJbGFzdDsKKwkJfQorCX0KKwlwdXNoIEBjb21tZW50LCA8JGZkPjsKKwkkdGFneydjb21tZW50J30gPSBcQGNvbW1lbnQ7CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlpZiAoIWRlZmluZWQgJHRhZ3snbmFtZSd9KSB7CisJCXJldHVybgorCX07CisJcmV0dXJuICV0YWcKK30KKworc3ViIHBhcnNlX2NvbW1pdF90ZXh0IHsKKwlteSAoJGNvbW1pdF90ZXh0LCAkd2l0aHBhcmVudHMpID0gQF87CisJbXkgQGNvbW1pdF9saW5lcyA9IHNwbGl0ICdcbicsICRjb21taXRfdGV4dDsKKwlteSAlY287CisKKwlwb3AgQGNvbW1pdF9saW5lczsgIyBSZW1vdmUgJ1wwJworCisJaWYgKCEgQGNvbW1pdF9saW5lcykgeworCQlyZXR1cm47CisJfQorCisJbXkgJGhlYWRlciA9IHNoaWZ0IEBjb21taXRfbGluZXM7CisJaWYgKCRoZWFkZXIgIX4gbS9eWzAtOWEtZkEtRl17NDB9LykgeworCQlyZXR1cm47CisJfQorCSgkY297J2lkJ30sIG15IEBwYXJlbnRzKSA9IHNwbGl0ICcgJywgJGhlYWRlcjsKKwl3aGlsZSAobXkgJGxpbmUgPSBzaGlmdCBAY29tbWl0X2xpbmVzKSB7CisJCWxhc3QgaWYgJGxpbmUgZXEgIlxuIjsKKwkJaWYgKCRsaW5lID1+IG0vXnRyZWUgKFswLTlhLWZBLUZdezQwfSkkLykgeworCQkJJGNveyd0cmVlJ30gPSAkMTsKKwkJfSBlbHNpZiAoKCFkZWZpbmVkICR3aXRocGFyZW50cykgJiYgKCRsaW5lID1+IG0vXnBhcmVudCAoWzAtOWEtZkEtRl17NDB9KSQvKSkgeworCQkJcHVzaCBAcGFyZW50cywgJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXmF1dGhvciAoLiopIChbMC05XSspICguKikkLykgeworCQkJJGNveydhdXRob3InfSA9ICQxOworCQkJJGNveydhdXRob3JfZXBvY2gnfSA9ICQyOworCQkJJGNveydhdXRob3JfdHonfSA9ICQzOworCQkJaWYgKCRjb3snYXV0aG9yJ30gPX4gbS9eKFtePF0rKSA8KFtePl0qKT4vKSB7CisJCQkJJGNveydhdXRob3JfbmFtZSd9ICA9ICQxOworCQkJCSRjb3snYXV0aG9yX2VtYWlsJ30gPSAkMjsKKwkJCX0gZWxzZSB7CisJCQkJJGNveydhdXRob3JfbmFtZSd9ID0gJGNveydhdXRob3InfTsKKwkJCX0KKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9eY29tbWl0dGVyICguKikgKFswLTldKykgKC4qKSQvKSB7CisJCQkkY297J2NvbW1pdHRlcid9ID0gJDE7CisJCQkkY297J2NvbW1pdHRlcl9lcG9jaCd9ID0gJDI7CisJCQkkY297J2NvbW1pdHRlcl90eid9ID0gJDM7CisJCQkkY297J2NvbW1pdHRlcl9uYW1lJ30gPSAkY297J2NvbW1pdHRlcid9OworCQkJaWYgKCRjb3snY29tbWl0dGVyJ30gPX4gbS9eKFtePF0rKSA8KFtePl0qKT4vKSB7CisJCQkJJGNveydjb21taXR0ZXJfbmFtZSd9ICA9ICQxOworCQkJCSRjb3snY29tbWl0dGVyX2VtYWlsJ30gPSAkMjsKKwkJCX0gZWxzZSB7CisJCQkJJGNveydjb21taXR0ZXJfbmFtZSd9ID0gJGNveydjb21taXR0ZXInfTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWRlZmluZWQgJGNveyd0cmVlJ30pIHsKKwkJcmV0dXJuOworCX07CisJJGNveydwYXJlbnRzJ30gPSBcQHBhcmVudHM7CisJJGNveydwYXJlbnQnfSA9ICRwYXJlbnRzWzBdOworCisJZm9yZWFjaCBteSAkdGl0bGUgKEBjb21taXRfbGluZXMpIHsKKwkJJHRpdGxlID1+IHMvXiAgICAvLzsKKwkJaWYgKCR0aXRsZSBuZSAiIikgeworCQkJJGNveyd0aXRsZSd9ID0gY2hvcF9zdHIoJHRpdGxlLCA4MCwgNSk7CisJCQkjIHJlbW92ZSBsZWFkaW5nIHN0dWZmIG9mIG1lcmdlcyB0byBtYWtlIHRoZSBpbnRlcmVzdGluZyBwYXJ0IHZpc2libGUKKwkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJJHRpdGxlID1+IHMvXkF1dG9tYXRpYyAvLzsKKwkJCQkkdGl0bGUgPX4gcy9ebWVyZ2UgKG9mfHdpdGgpIC9NZXJnZSAuLi4gL2k7CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMvKGh0dHB8cnN5bmMpOlwvXC8vLzsKKwkJCQl9CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMvKG1hc3Rlcnx3d3d8cnN5bmMpXC4vLzsKKwkJCQl9CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMva2VybmVsLm9yZzo/Ly87CisJCQkJfQorCQkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJCSR0aXRsZSA9fiBzL1wvcHViXC9zY20vLzsKKwkJCQl9CisJCQl9CisJCQkkY297J3RpdGxlX3Nob3J0J30gPSBjaG9wX3N0cigkdGl0bGUsIDUwLCA1KTsKKwkJCWxhc3Q7CisJCX0KKwl9CisJaWYgKCRjb3sndGl0bGUnfSBlcSAiIikgeworCQkkY297J3RpdGxlJ30gPSAkY297J3RpdGxlX3Nob3J0J30gPSAnKG5vIGNvbW1pdCBtZXNzYWdlKSc7CisJfQorCSMgcmVtb3ZlIGFkZGVkIHNwYWNlcworCWZvcmVhY2ggbXkgJGxpbmUgKEBjb21taXRfbGluZXMpIHsKKwkJJGxpbmUgPX4gcy9eICAgIC8vOworCX0KKwkkY297J2NvbW1lbnQnfSA9IFxAY29tbWl0X2xpbmVzOworCisJbXkgJGFnZSA9IHRpbWUgLSAkY297J2NvbW1pdHRlcl9lcG9jaCd9OworCSRjb3snYWdlJ30gPSAkYWdlOworCSRjb3snYWdlX3N0cmluZyd9ID0gYWdlX3N0cmluZygkYWdlKTsKKwlteSAoJHNlYywgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uLCAkeWVhciwgJHdkYXksICR5ZGF5KSA9IGdtdGltZSgkY297J2NvbW1pdHRlcl9lcG9jaCd9KTsKKwlpZiAoJGFnZSA+IDYwKjYwKjI0KjcqMikgeworCQkkY297J2FnZV9zdHJpbmdfZGF0ZSd9ID0gc3ByaW50ZiAiJTRpLSUwMnUtJTAyaSIsIDE5MDAgKyAkeWVhciwgJG1vbisxLCAkbWRheTsKKwkJJGNveydhZ2Vfc3RyaW5nX2FnZSd9ID0gJGNveydhZ2Vfc3RyaW5nJ307CisJfSBlbHNlIHsKKwkJJGNveydhZ2Vfc3RyaW5nX2RhdGUnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCQkkY297J2FnZV9zdHJpbmdfYWdlJ30gPSBzcHJpbnRmICIlNGktJTAydS0lMDJpIiwgMTkwMCArICR5ZWFyLCAkbW9uKzEsICRtZGF5OworCX0KKwlyZXR1cm4gJWNvOworfQorCitzdWIgcGFyc2VfY29tbWl0IHsKKwlteSAoJGNvbW1pdF9pZCkgPSBAXzsKKwlteSAlY287CisKKwlsb2NhbCAkLyA9ICJcMCI7CisKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAicmV2LWxpc3QiLAorCQkiLS1wYXJlbnRzIiwKKwkJIi0taGVhZGVyIiwKKwkJIi0tbWF4LWNvdW50PTEiLAorCQkkY29tbWl0X2lkLAorCQkiLS0iLAorCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1yZXYtbGlzdCBmYWlsZWQiKTsKKwklY28gPSBwYXJzZV9jb21taXRfdGV4dCg8JGZkPiwgMSk7CisJY2xvc2UgJGZkOworCisJcmV0dXJuICVjbzsKK30KKworc3ViIHBhcnNlX2NvbW1pdHMgeworCW15ICgkY29tbWl0X2lkLCAkbWF4Y291bnQsICRza2lwLCAkYXJnLCAkZmlsZW5hbWUpID0gQF87CisJbXkgQGNvczsKKworCSRtYXhjb3VudCB8fD0gMTsKKwkkc2tpcCB8fD0gMDsKKworCWxvY2FsICQvID0gIlwwIjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJyZXYtbGlzdCIsCisJCSItLWhlYWRlciIsCisJCSgkYXJnID8gKCRhcmcpIDogKCkpLAorCQkoIi0tbWF4LWNvdW50PSIgLiAkbWF4Y291bnQpLAorCQkoIi0tc2tpcD0iIC4gJHNraXApLAorCQkkY29tbWl0X2lkLAorCQkiLS0iLAorCQkoJGZpbGVuYW1lID8gKCRmaWxlbmFtZSkgOiAoKSkKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtcmV2LWxpc3QgZmFpbGVkIik7CisJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJbXkgJWNvID0gcGFyc2VfY29tbWl0X3RleHQoJGxpbmUpOworCQlwdXNoIEBjb3MsIFwlY287CisJfQorCWNsb3NlICRmZDsKKworCXJldHVybiB3YW50YXJyYXkgPyBAY29zIDogXEBjb3M7Cit9CisKKyMgcGFyc2UgcmVmIGZyb20gcmVmX2ZpbGUsIGdpdmVuIGJ5IHJlZl9pZCwgd2l0aCBnaXZlbiB0eXBlCitzdWIgcGFyc2VfcmVmIHsKKwlteSAkcmVmX2ZpbGUgPSBzaGlmdDsKKwlteSAkcmVmX2lkID0gc2hpZnQ7CisJbXkgJHR5cGUgPSBzaGlmdCB8fCBnaXRfZ2V0X3R5cGUoJHJlZl9pZCk7CisJbXkgJXJlZl9pdGVtOworCisJJHJlZl9pdGVteyd0eXBlJ30gPSAkdHlwZTsKKwkkcmVmX2l0ZW17J2lkJ30gPSAkcmVmX2lkOworCSRyZWZfaXRlbXsnZXBvY2gnfSA9IDA7CisJJHJlZl9pdGVteydhZ2UnfSA9ICJ1bmtub3duIjsKKwlpZiAoJHR5cGUgZXEgInRhZyIpIHsKKwkJbXkgJXRhZyA9IHBhcnNlX3RhZygkcmVmX2lkKTsKKwkJJHJlZl9pdGVteydjb21tZW50J30gPSAkdGFneydjb21tZW50J307CisJCWlmICgkdGFneyd0eXBlJ30gZXEgImNvbW1pdCIpIHsKKwkJCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkdGFneydvYmplY3QnfSk7CisJCQkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAkY297J2NvbW1pdHRlcl9lcG9jaCd9OworCQkJJHJlZl9pdGVteydhZ2UnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCQl9IGVsc2lmIChkZWZpbmVkKCR0YWd7J2Vwb2NoJ30pKSB7CisJCQlteSAkYWdlID0gdGltZSAtICR0YWd7J2Vwb2NoJ307CisJCQkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAkdGFneydlcG9jaCd9OworCQkJJHJlZl9pdGVteydhZ2UnfSA9IGFnZV9zdHJpbmcoJGFnZSk7CisJCX0KKwkJJHJlZl9pdGVteydyZWZ0eXBlJ30gPSAkdGFneyd0eXBlJ307CisJCSRyZWZfaXRlbXsnbmFtZSd9ID0gJHRhZ3snbmFtZSd9OworCQkkcmVmX2l0ZW17J3JlZmlkJ30gPSAkdGFneydvYmplY3QnfTsKKwl9IGVsc2lmICgkdHlwZSBlcSAiY29tbWl0Iil7CisJCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkcmVmX2lkKTsKKwkJJHJlZl9pdGVteydyZWZ0eXBlJ30gPSAiY29tbWl0IjsKKwkJJHJlZl9pdGVteyduYW1lJ30gPSAkcmVmX2ZpbGU7CisJCSRyZWZfaXRlbXsndGl0bGUnfSA9ICRjb3sndGl0bGUnfTsKKwkJJHJlZl9pdGVteydyZWZpZCd9ID0gJHJlZl9pZDsKKwkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGNveydjb21taXR0ZXJfZXBvY2gnfTsKKwkJJHJlZl9pdGVteydhZ2UnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCX0gZWxzZSB7CisJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gJHR5cGU7CisJCSRyZWZfaXRlbXsnbmFtZSd9ID0gJHJlZl9maWxlOworCQkkcmVmX2l0ZW17J3JlZmlkJ30gPSAkcmVmX2lkOworCX0KKworCXJldHVybiAlcmVmX2l0ZW07Cit9CisKKyMgcGFyc2UgbGluZSBvZiBnaXQtZGlmZi10cmVlICJyYXciIG91dHB1dAorc3ViIHBhcnNlX2RpZmZ0cmVlX3Jhd19saW5lIHsKKwlteSAkbGluZSA9IHNoaWZ0OworCW15ICVyZXM7CisKKwkjICc6MTAwNjQ0IDEwMDY0NCAwM2IyMTgyNjBlOTliNzhjNmRmMGVkMzc4ZTU5ZWQ5MjA1Y2NjOTZkIDNiOTNkNWU3Y2M3ZjdkZDRlYmVkMTNhNWNjMWE0YWQ5NzZmYzk0ZDggTQlscy1maWxlcy5jJworCSMgJzoxMDA2NDQgMTAwNjQ0IDdmOTI4MTk4NTA4Njk3MWQzODc3YWNhMjc3MDRmMmFhZjljNDQ4Y2UgYmMxOTBlYmM3MWJiZDkyM2YyYjcyOGU1MDU0MDhmNWU1NGJkMDczYSBNCXJldi10cmVlLmMnCisJaWYgKCRsaW5lID1+IG0vXjooWzAtN117Nn0pIChbMC03XXs2fSkgKFswLTlhLWZBLUZdezQwfSkgKFswLTlhLWZBLUZdezQwfSkgKC4pKFswLTldezAsM30pXHQoLiopJC8pIHsKKwkJJHJlc3snZnJvbV9tb2RlJ30gPSAkMTsKKwkJJHJlc3sndG9fbW9kZSd9ID0gJDI7CisJCSRyZXN7J2Zyb21faWQnfSA9ICQzOworCQkkcmVzeyd0b19pZCd9ID0gJDQ7CisJCSRyZXN7J3N0YXR1cyd9ID0gJDU7CisJCSRyZXN7J3NpbWlsYXJpdHknfSA9ICQ2OworCQlpZiAoJHJlc3snc3RhdHVzJ30gZXEgJ1InIHx8ICRyZXN7J3N0YXR1cyd9IGVxICdDJykgeyAjIHJlbmFtZWQgb3IgY29waWVkCisJCQkoJHJlc3snZnJvbV9maWxlJ30sICRyZXN7J3RvX2ZpbGUnfSkgPSBtYXAgeyB1bnF1b3RlKCRfKSB9IHNwbGl0KCJcdCIsICQ3KTsKKwkJfSBlbHNlIHsKKwkJCSRyZXN7J2ZpbGUnfSA9IHVucXVvdGUoJDcpOworCQl9CisJfQorCSMgJzo6MTAwNzU1IDEwMDc1NSAxMDA3NTUgNjBlNzljYTFiMDFiYzhiMDU3YWJlMTdkZGFiNDg0Njk5YTdmNWZkYiA5NDA2N2NjNWY3MzM4OGYzMzcyMmQ1MmFlMDJmNDQ2OTJiYzA3NDkwIDk0MDY3Y2M1ZjczMzg4ZjMzNzIyZDUyYWUwMmY0NDY5MmJjMDc0OTAgTVIJZ2l0LWd1aS9naXQtZ3VpLnNoJworCSMgY29tYmluZWQgZGlmZiAoZm9yIG1lcmdlIGNvbW1pdCkKKwllbHNpZiAoJGxpbmUgPX4gcy9eKDo6KykoKD86WzAtN117Nn0gKSspKCg/OlswLTlhLWZBLUZdezQwfSApKykoW2EtekEtWl0rKVx0KC4qKSQvLykgeworCQkkcmVzeyducGFyZW50cyd9ICA9IGxlbmd0aCgkMSk7CisJCSRyZXN7J2Zyb21fbW9kZSd9ID0gWyBzcGxpdCgnICcsICQyKSBdOworCQkkcmVzeyd0b19tb2RlJ30gPSBwb3AgQHskcmVzeydmcm9tX21vZGUnfX07CisJCSRyZXN7J2Zyb21faWQnfSA9IFsgc3BsaXQoJyAnLCAkMykgXTsKKwkJJHJlc3sndG9faWQnfSA9IHBvcCBAeyRyZXN7J2Zyb21faWQnfX07CisJCSRyZXN7J3N0YXR1cyd9ID0gWyBzcGxpdCgnJywgJDQpIF07CisJCSRyZXN7J3RvX2ZpbGUnfSA9IHVucXVvdGUoJDUpOworCX0KKwkjICdjNTEyYjUyMzQ3MjQ4NWFlZjRmZmY5ZTU3YjIyOWQ5ZDI0M2M5NjdmJworCWVsc2lmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCSRyZXN7J2NvbW1pdCd9ID0gJDE7CisJfQorCisJcmV0dXJuIHdhbnRhcnJheSA/ICVyZXMgOiBcJXJlczsKK30KKworIyBwYXJzZSBsaW5lIG9mIGdpdC1scy10cmVlIG91dHB1dAorc3ViIHBhcnNlX2xzX3RyZWVfbGluZSAoJDslKSB7CisJbXkgJGxpbmUgPSBzaGlmdDsKKwlteSAlb3B0cyA9IEBfOworCW15ICVyZXM7CisKKwkjJzEwMDY0NCBibG9iIDBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQoLispJC9zOworCisJJHJlc3snbW9kZSd9ID0gJDE7CisJJHJlc3sndHlwZSd9ID0gJDI7CisJJHJlc3snaGFzaCd9ID0gJDM7CisJaWYgKCRvcHRzeycteid9KSB7CisJCSRyZXN7J25hbWUnfSA9ICQ0OworCX0gZWxzZSB7CisJCSRyZXN7J25hbWUnfSA9IHVucXVvdGUoJDQpOworCX0KKworCXJldHVybiB3YW50YXJyYXkgPyAlcmVzIDogXCVyZXM7Cit9CisKKyMjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyMjIHBhcnNlIHRvIGFycmF5IG9mIGhhc2hlcyBmdW5jdGlvbnMKKworc3ViIGdpdF9nZXRfaGVhZHNfbGlzdCB7CisJbXkgJGxpbWl0ID0gc2hpZnQ7CisJbXkgQGhlYWRzbGlzdDsKKworCW9wZW4gbXkgJGZkLCAnLXwnLCBnaXRfY21kKCksICdmb3ItZWFjaC1yZWYnLAorCQkoJGxpbWl0ID8gJy0tY291bnQ9Jy4oJGxpbWl0KzEpIDogKCkpLCAnLS1zb3J0PS1jb21taXR0ZXJkYXRlJywKKwkJJy0tZm9ybWF0PSUob2JqZWN0bmFtZSkgJShyZWZuYW1lKSAlKHN1YmplY3QpJTAwJShjb21taXR0ZXIpJywKKwkJJ3JlZnMvaGVhZHMnCisJCW9yIHJldHVybjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQlteSAlcmVmX2l0ZW07CisKKwkJY2hvbXAgJGxpbmU7CisJCW15ICgkcmVmaW5mbywgJGNvbW1pdHRlcmluZm8pID0gc3BsaXQoL1wwLywgJGxpbmUpOworCQlteSAoJGhhc2gsICRuYW1lLCAkdGl0bGUpID0gc3BsaXQoJyAnLCAkcmVmaW5mbywgMyk7CisJCW15ICgkY29tbWl0dGVyLCAkZXBvY2gsICR0eikgPQorCQkJKCRjb21taXR0ZXJpbmZvID1+IC9eKC4qKSAoWzAtOV0rKSAoLiopJC8pOworCQkkbmFtZSA9fiBzIV5yZWZzL2hlYWRzLyEhOworCisJCSRyZWZfaXRlbXsnbmFtZSd9ICA9ICRuYW1lOworCQkkcmVmX2l0ZW17J2lkJ30gICAgPSAkaGFzaDsKKwkJJHJlZl9pdGVteyd0aXRsZSd9ID0gJHRpdGxlIHx8ICcobm8gY29tbWl0IG1lc3NhZ2UpJzsKKwkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGVwb2NoOworCQlpZiAoJGVwb2NoKSB7CisJCQkkcmVmX2l0ZW17J2FnZSd9ID0gYWdlX3N0cmluZyh0aW1lIC0gJHJlZl9pdGVteydlcG9jaCd9KTsKKwkJfSBlbHNlIHsKKwkJCSRyZWZfaXRlbXsnYWdlJ30gPSAidW5rbm93biI7CisJCX0KKworCQlwdXNoIEBoZWFkc2xpc3QsIFwlcmVmX2l0ZW07CisJfQorCWNsb3NlICRmZDsKKworCXJldHVybiB3YW50YXJyYXkgPyBAaGVhZHNsaXN0IDogXEBoZWFkc2xpc3Q7Cit9CisKK3N1YiBnaXRfZ2V0X3RhZ3NfbGlzdCB7CisJbXkgJGxpbWl0ID0gc2hpZnQ7CisJbXkgQHRhZ3NsaXN0OworCisJb3BlbiBteSAkZmQsICctfCcsIGdpdF9jbWQoKSwgJ2Zvci1lYWNoLXJlZicsCisJCSgkbGltaXQgPyAnLS1jb3VudD0nLigkbGltaXQrMSkgOiAoKSksICctLXNvcnQ9LWNyZWF0b3JkYXRlJywKKwkJJy0tZm9ybWF0PSUob2JqZWN0bmFtZSkgJShvYmplY3R0eXBlKSAlKHJlZm5hbWUpICcuCisJCSclKCpvYmplY3RuYW1lKSAlKCpvYmplY3R0eXBlKSAlKHN1YmplY3QpJTAwJShjcmVhdG9yKScsCisJCSdyZWZzL3RhZ3MnCisJCW9yIHJldHVybjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQlteSAlcmVmX2l0ZW07CisKKwkJY2hvbXAgJGxpbmU7CisJCW15ICgkcmVmaW5mbywgJGNyZWF0b3JpbmZvKSA9IHNwbGl0KC9cMC8sICRsaW5lKTsKKwkJbXkgKCRpZCwgJHR5cGUsICRuYW1lLCAkcmVmaWQsICRyZWZ0eXBlLCAkdGl0bGUpID0gc3BsaXQoJyAnLCAkcmVmaW5mbywgNik7CisJCW15ICgkY3JlYXRvciwgJGVwb2NoLCAkdHopID0KKwkJCSgkY3JlYXRvcmluZm8gPX4gL14oLiopIChbMC05XSspICguKikkLyk7CisJCSRuYW1lID1+IHMhXnJlZnMvdGFncy8hITsKKworCQkkcmVmX2l0ZW17J3R5cGUnfSA9ICR0eXBlOworCQkkcmVmX2l0ZW17J2lkJ30gPSAkaWQ7CisJCSRyZWZfaXRlbXsnbmFtZSd9ID0gJG5hbWU7CisJCWlmICgkdHlwZSBlcSAidGFnIikgeworCQkJJHJlZl9pdGVteydzdWJqZWN0J30gPSAkdGl0bGU7CisJCQkkcmVmX2l0ZW17J3JlZnR5cGUnfSA9ICRyZWZ0eXBlOworCQkJJHJlZl9pdGVteydyZWZpZCd9ICAgPSAkcmVmaWQ7CisJCX0gZWxzZSB7CisJCQkkcmVmX2l0ZW17J3JlZnR5cGUnfSA9ICR0eXBlOworCQkJJHJlZl9pdGVteydyZWZpZCd9ICAgPSAkaWQ7CisJCX0KKworCQlpZiAoJHR5cGUgZXEgInRhZyIgfHwgJHR5cGUgZXEgImNvbW1pdCIpIHsKKwkJCSRyZWZfaXRlbXsnZXBvY2gnfSA9ICRlcG9jaDsKKwkJCWlmICgkZXBvY2gpIHsKKwkJCQkkcmVmX2l0ZW17J2FnZSd9ID0gYWdlX3N0cmluZyh0aW1lIC0gJHJlZl9pdGVteydlcG9jaCd9KTsKKwkJCX0gZWxzZSB7CisJCQkJJHJlZl9pdGVteydhZ2UnfSA9ICJ1bmtub3duIjsKKwkJCX0KKwkJfQorCisJCXB1c2ggQHRhZ3NsaXN0LCBcJXJlZl9pdGVtOworCX0KKwljbG9zZSAkZmQ7CisKKwlyZXR1cm4gd2FudGFycmF5ID8gQHRhZ3NsaXN0IDogXEB0YWdzbGlzdDsKK30KKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgZmlsZXN5c3RlbS1yZWxhdGVkIGZ1bmN0aW9ucworCitzdWIgZ2V0X2ZpbGVfb3duZXIgeworCW15ICRwYXRoID0gc2hpZnQ7CisKKwlteSAoJGRldiwgJGlubywgJG1vZGUsICRubGluaywgJHN0X3VpZCwgJHN0X2dpZCwgJHJkZXYsICRzaXplKSA9IHN0YXQoJHBhdGgpOworCW15ICgkbmFtZSwgJHBhc3N3ZCwgJHVpZCwgJGdpZCwgJHF1b3RhLCAkY29tbWVudCwgJGdjb3MsICRkaXIsICRzaGVsbCkgPSBnZXRwd3VpZCgkc3RfdWlkKTsKKwlpZiAoIWRlZmluZWQgJGdjb3MpIHsKKwkJcmV0dXJuIHVuZGVmOworCX0KKwlteSAkb3duZXIgPSAkZ2NvczsKKwkkb3duZXIgPX4gcy9bLDtdLiokLy87CisJcmV0dXJuIGRlY29kZV91dGY4KCRvd25lcik7Cit9CisKKyMjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyMjIG1pbWV0eXBlIHJlbGF0ZWQgZnVuY3Rpb25zCisKK3N1YiBtaW1ldHlwZV9ndWVzc19maWxlIHsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKwlteSAkbWltZW1hcCA9IHNoaWZ0OworCS1yICRtaW1lbWFwIG9yIHJldHVybiB1bmRlZjsKKworCW15ICVtaW1lbWFwOworCW9wZW4oTUlNRSwgJG1pbWVtYXApIG9yIHJldHVybiB1bmRlZjsKKwl3aGlsZSAoPE1JTUU+KSB7CisJCW5leHQgaWYgbS9eIy87ICMgc2tpcCBjb21tZW50cworCQlteSAoJG1pbWUsICRleHRzKSA9IHNwbGl0KC9cdCsvKTsKKwkJaWYgKGRlZmluZWQgJGV4dHMpIHsKKwkJCW15IEBleHRzID0gc3BsaXQoL1xzKy8sICRleHRzKTsKKwkJCWZvcmVhY2ggbXkgJGV4dCAoQGV4dHMpIHsKKwkJCQkkbWltZW1hcHskZXh0fSA9ICRtaW1lOworCQkJfQorCQl9CisJfQorCWNsb3NlKE1JTUUpOworCisJJGZpbGVuYW1lID1+IC9cLihbXi5dKikkLzsKKwlyZXR1cm4gJG1pbWVtYXB7JDF9OworfQorCitzdWIgbWltZXR5cGVfZ3Vlc3MgeworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCW15ICRtaW1lOworCSRmaWxlbmFtZSA9fiAvXC4vIG9yIHJldHVybiB1bmRlZjsKKworCWlmICgkbWltZXR5cGVzX2ZpbGUpIHsKKwkJbXkgJGZpbGUgPSAkbWltZXR5cGVzX2ZpbGU7CisJCWlmICgkZmlsZSAhfiBtIV4vISkgeyAjIGlmIGl0IGlzIHJlbGF0aXZlIHBhdGgKKwkJCSMgaXQgaXMgcmVsYXRpdmUgdG8gcHJvamVjdAorCQkJJGZpbGUgPSAiJHByb2plY3Ryb290LyRwcm9qZWN0LyRmaWxlIjsKKwkJfQorCQkkbWltZSA9IG1pbWV0eXBlX2d1ZXNzX2ZpbGUoJGZpbGVuYW1lLCAkZmlsZSk7CisJfQorCSRtaW1lIHx8PSBtaW1ldHlwZV9ndWVzc19maWxlKCRmaWxlbmFtZSwgJy9ldGMvbWltZS50eXBlcycpOworCXJldHVybiAkbWltZTsKK30KKworc3ViIGJsb2JfbWltZXR5cGUgeworCW15ICRmZCA9IHNoaWZ0OworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisJaWYgKCRmaWxlbmFtZSkgeworCQlteSAkbWltZSA9IG1pbWV0eXBlX2d1ZXNzKCRmaWxlbmFtZSk7CisJCSRtaW1lIGFuZCByZXR1cm4gJG1pbWU7CisJfQorCisJIyBqdXN0IGluIGNhc2UKKwlyZXR1cm4gJGRlZmF1bHRfYmxvYl9wbGFpbl9taW1ldHlwZSB1bmxlc3MgJGZkOworCisJaWYgKC1UICRmZCkgeworCQlyZXR1cm4gJ3RleHQvcGxhaW4nIC4KKwkJICAgICAgICgkZGVmYXVsdF90ZXh0X3BsYWluX2NoYXJzZXQgPyAnOyBjaGFyc2V0PScuJGRlZmF1bHRfdGV4dF9wbGFpbl9jaGFyc2V0IDogJycpOworCX0gZWxzaWYgKCEgJGZpbGVuYW1lKSB7CisJCXJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKKwl9IGVsc2lmICgkZmlsZW5hbWUgPX4gbS9cLnBuZyQvaSkgeworCQlyZXR1cm4gJ2ltYWdlL3BuZyc7CisJfSBlbHNpZiAoJGZpbGVuYW1lID1+IG0vXC5naWYkL2kpIHsKKwkJcmV0dXJuICdpbWFnZS9naWYnOworCX0gZWxzaWYgKCRmaWxlbmFtZSA9fiBtL1wuanBlP2ckL2kpIHsKKwkJcmV0dXJuICdpbWFnZS9qcGVnJzsKKwl9IGVsc2UgeworCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CisJfQorfQorCisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgSFRNTDogaGVhZGVyLCBmb290ZXIsIGVycm9yIHBhZ2UKKworc3ViIGdpdF9oZWFkZXJfaHRtbCB7CisJbXkgJHN0YXR1cyA9IHNoaWZ0IHx8ICIyMDAgT0siOworCW15ICRleHBpcmVzID0gc2hpZnQ7CisKKwlteSAkdGl0bGUgPSAiJHNpdGVfbmFtZSI7CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJJHRpdGxlIC49ICIgLSAiIC4gZGVjb2RlX3V0ZjgoJHByb2plY3QpOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQkkdGl0bGUgLj0gIi8kYWN0aW9uIjsKKwkJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCQkkdGl0bGUgLj0gIiAtICIgLiBlc2NfcGF0aCgkZmlsZV9uYW1lKTsKKwkJCQlpZiAoJGFjdGlvbiBlcSAidHJlZSIgJiYgJGZpbGVfbmFtZSAhfiBtfC8kfCkgeworCQkJCQkkdGl0bGUgLj0gIi8iOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlteSAkY29udGVudF90eXBlOworCSMgcmVxdWlyZSBleHBsaWNpdCBzdXBwb3J0IGZyb20gdGhlIFVBIGlmIHdlIGFyZSB0byBzZW5kIHRoZSBwYWdlIGFzCisJIyAnYXBwbGljYXRpb24veGh0bWwreG1sJywgb3RoZXJ3aXNlIHNlbmQgaXQgYXMgcGxhaW4gb2xkICd0ZXh0L2h0bWwnLgorCSMgd2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2UgTVNJRSBzb21ldGltZXMgZ2xvYnMgJyovKicsIHByZXRlbmRpbmcgdG8KKwkjIHN1cHBvcnQgeGh0bWwreG1sIGJ1dCBjaG9raW5nIHdoZW4gaXQgZ2V0cyB3aGF0IGl0IGFza2VkIGZvci4KKwlpZiAoZGVmaW5lZCAkY2dpLT5odHRwKCdIVFRQX0FDQ0VQVCcpICYmCisJICAgICRjZ2ktPmh0dHAoJ0hUVFBfQUNDRVBUJykgPX4gbS8oLHw7fFxzfF4pYXBwbGljYXRpb25cL3hodG1sXCt4bWwoLHw7fFxzfCQpLyAmJgorCSAgICAkY2dpLT5BY2NlcHQoJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcpICE9IDApIHsKKwkJJGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnOworCX0gZWxzZSB7CisJCSRjb250ZW50X3R5cGUgPSAndGV4dC9odG1sJzsKKwl9CisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlPT4kY29udGVudF90eXBlLCAtY2hhcnNldCA9PiAndXRmLTgnLAorCSAgICAgICAgICAgICAgICAgICAtc3RhdHVzPT4gJHN0YXR1cywgLWV4cGlyZXMgPT4gJGV4cGlyZXMpOworCW15ICRtb2RfcGVybF92ZXJzaW9uID0gJEVOVnsnTU9EX1BFUkwnfSA/ICIgJEVOVnsnTU9EX1BFUkwnfSIgOiAnJzsKKwlwcmludCA8PEVPRjsKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuLVVTIiBsYW5nPSJlbi1VUyI+Cis8IS0tIGdpdCB3ZWIgaW50ZXJmYWNlIHZlcnNpb24gJHZlcnNpb24sIChDKSAyMDA1LTIwMDYsIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc1xAdnJmeS5vcmc+LCBDaHJpc3RpYW4gR2llcmtlIC0tPgorPCEtLSBnaXQgY29yZSBiaW5hcmllcyB2ZXJzaW9uICRnaXRfdmVyc2lvbiAtLT4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIkY29udGVudF90eXBlOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImdpdHdlYi8kdmVyc2lvbiBnaXQvJGdpdF92ZXJzaW9uJG1vZF9wZXJsX3ZlcnNpb24iLz4KKzxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0iaW5kZXgsIG5vZm9sbG93Ii8+Cis8dGl0bGU+JHRpdGxlPC90aXRsZT4KK0VPRgorIyBwcmludCBvdXQgZWFjaCBzdHlsZXNoZWV0IHRoYXQgZXhpc3QKKwlpZiAoZGVmaW5lZCAkc3R5bGVzaGVldCkgeworI3Byb3ZpZGVzIGJhY2t3YXJkcyBjYXBhYmlsaXR5IGZvciB0aG9zZSBwZW9wbGUgd2hvIGRlZmluZSBzdHlsZSBzaGVldCBpbiBhIGNvbmZpZyBmaWxlCisJCXByaW50ICc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiRzdHlsZXNoZWV0LiciLz4nLiJcbiI7CisJfSBlbHNlIHsKKwkJZm9yZWFjaCBteSAkc3R5bGVzaGVldCAoQHN0eWxlc2hlZXRzKSB7CisJCQluZXh0IHVubGVzcyAkc3R5bGVzaGVldDsKKwkJCXByaW50ICc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiRzdHlsZXNoZWV0LiciLz4nLiJcbiI7CisJCX0KKwl9CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBSU1MgZmVlZCIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCIgLz4nLiJcbiIsCisJCSAgICAgICBlc2NfcGFyYW0oJHByb2plY3QpLCBocmVmKGFjdGlvbj0+InJzcyIpKTsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBBdG9tIGZlZWQiICcuCisJCSAgICAgICAnaHJlZj0iJXMiIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIiAvPicuIlxuIiwKKwkJICAgICAgIGVzY19wYXJhbSgkcHJvamVjdCksIGhyZWYoYWN0aW9uPT4iYXRvbSIpKTsKKwl9IGVsc2UgeworCQlwcmludGYoJzxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iJXMgcHJvamVjdHMgbGlzdCIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0idGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIvPicuIlxuIiwKKwkJICAgICAgICRzaXRlX25hbWUsIGhyZWYocHJvamVjdD0+dW5kZWYsIGFjdGlvbj0+InByb2plY3RfaW5kZXgiKSk7CisJCXByaW50ZignPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSIlcyBwcm9qZWN0cyBmZWVkcyIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0idGV4dC94LW9wbWwiLz4nLiJcbiIsCisJCSAgICAgICAkc2l0ZV9uYW1lLCBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJvcG1sIikpOworCX0KKwlpZiAoZGVmaW5lZCAkZmF2aWNvbikgeworCQlwcmludCBxcSg8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9IiRmYXZpY29uIiB0eXBlPSJpbWFnZS9wbmciLz5cbik7CisJfQorCisJcHJpbnQgIjwvaGVhZD5cbiIgLgorCSAgICAgICI8Ym9keT5cbiI7CisKKwlpZiAoLWYgJHNpdGVfaGVhZGVyKSB7CisJCW9wZW4gKG15ICRmZCwgJHNpdGVfaGVhZGVyKTsKKwkJcHJpbnQgPCRmZD47CisJCWNsb3NlICRmZDsKKwl9CisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfaGVhZGVyXCI+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBlc2NfdXJsKCRsb2dvX3VybCksCisJICAgICAgICAgICAgICAgLXRpdGxlID0+ICRsb2dvX2xhYmVsfSwKKwkgICAgICAgICAgICAgIHFxKDxpbWcgc3JjPSIkbG9nbyIgd2lkdGg9IjcyIiBoZWlnaHQ9IjI3IiBhbHQ9ImdpdCIgY2xhc3M9ImxvZ28iLz4pKTsKKwlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBlc2NfdXJsKCRob21lX2xpbmspfSwgJGhvbWVfbGlua19zdHIpIC4gIiAvICI7CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzdW1tYXJ5Iil9LCBlc2NfaHRtbCgkcHJvamVjdCkpOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQlwcmludCAiIC8gJGFjdGlvbiI7CisJCX0KKwkJcHJpbnQgIlxuIjsKKwl9CisJcHJpbnQgIjwvZGl2PlxuIjsKKworCW15ICgkaGF2ZV9zZWFyY2gpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ3NlYXJjaCcpOworCWlmICgoZGVmaW5lZCAkcHJvamVjdCkgJiYgKCRoYXZlX3NlYXJjaCkpIHsKKwkJaWYgKCFkZWZpbmVkICRzZWFyY2h0ZXh0KSB7CisJCQkkc2VhcmNodGV4dCA9ICIiOworCQl9CisJCW15ICRzZWFyY2hfaGFzaDsKKwkJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2hfYmFzZTsKKwkJfSBlbHNpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2g7CisJCX0gZWxzZSB7CisJCQkkc2VhcmNoX2hhc2ggPSAiSEVBRCI7CisJCX0KKwkJJGNnaS0+cGFyYW0oImEiLCAic2VhcmNoIik7CisJCSRjZ2ktPnBhcmFtKCJoIiwgJHNlYXJjaF9oYXNoKTsKKwkJJGNnaS0+cGFyYW0oInAiLCAkcHJvamVjdCk7CisJCXByaW50ICRjZ2ktPnN0YXJ0Zm9ybSgtbWV0aG9kID0+ICJnZXQiLCAtYWN0aW9uID0+ICRteV91cmkpIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJzZWFyY2hcIj5cbiIgLgorCQkgICAgICAkY2dpLT5oaWRkZW4oLW5hbWUgPT4gInAiKSAuICJcbiIgLgorCQkgICAgICAkY2dpLT5oaWRkZW4oLW5hbWUgPT4gImEiKSAuICJcbiIgLgorCQkgICAgICAkY2dpLT5oaWRkZW4oLW5hbWUgPT4gImgiKSAuICJcbiIgLgorCQkgICAgICAkY2dpLT5wb3B1cF9tZW51KC1uYW1lID0+ICdzdCcsIC1kZWZhdWx0ID0+ICdjb21taXQnLAorCQkgICAgICAgICAgICAgICAgICAgICAgIC12YWx1ZXMgPT4gWydjb21taXQnLCAnZ3JlcCcsICdhdXRob3InLCAnY29tbWl0dGVyJywgJ3BpY2theGUnXSkgLgorCQkgICAgICAkY2dpLT5zdXAoJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzZWFyY2hfaGVscCIpfSwgIj8iKSkgLgorCQkgICAgICAiIHNlYXJjaDpcbiIsCisJCSAgICAgICRjZ2ktPnRleHRmaWVsZCgtbmFtZSA9PiAicyIsIC12YWx1ZSA9PiAkc2VhcmNodGV4dCkgLiAiXG4iIC4KKwkJICAgICAgIjwvZGl2PiIgLgorCQkgICAgICAkY2dpLT5lbmRfZm9ybSgpIC4gIlxuIjsKKwl9Cit9CisKK3N1YiBnaXRfZm9vdGVyX2h0bWwgeworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9mb290ZXJcIj5cbiI7CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJbXkgJGRlc2NyID0gZ2l0X2dldF9wcm9qZWN0X2Rlc2NyaXB0aW9uKCRwcm9qZWN0KTsKKwkJaWYgKGRlZmluZWQgJGRlc2NyKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfZm9vdGVyX3RleHRcIj4iIC4gZXNjX2h0bWwoJGRlc2NyKSAuICI8L2Rpdj5cbiI7CisJCX0KKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJyc3MiKSwKKwkJICAgICAgICAgICAgICAtY2xhc3MgPT4gInJzc19sb2dvIn0sICJSU1MiKSAuICIgIjsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJhdG9tIiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiQXRvbSIpIC4gIlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJvcG1sIiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiT1BNTCIpIC4gIiAiOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJwcm9qZWN0X2luZGV4IiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiVFhUIikgLiAiXG4iOworCX0KKwlwcmludCAiPC9kaXY+XG4iIDsKKworCWlmICgtZiAkc2l0ZV9mb290ZXIpIHsKKwkJb3BlbiAobXkgJGZkLCAkc2l0ZV9mb290ZXIpOworCQlwcmludCA8JGZkPjsKKwkJY2xvc2UgJGZkOworCX0KKworCXByaW50ICI8L2JvZHk+XG4iIC4KKwkgICAgICAiPC9odG1sPiI7Cit9CisKK3N1YiBkaWVfZXJyb3IgeworCW15ICRzdGF0dXMgPSBzaGlmdCB8fCAiNDAzIEZvcmJpZGRlbiI7CisJbXkgJGVycm9yID0gc2hpZnQgfHwgIk1hbGZvcm1lZCBxdWVyeSwgZmlsZSBtaXNzaW5nIG9yIHBlcm1pc3Npb24gZGVuaWVkIjsKKworCWdpdF9oZWFkZXJfaHRtbCgkc3RhdHVzKTsKKwlwcmludCA8PEVPRjsKKzxkaXYgY2xhc3M9InBhZ2VfYm9keSI+Cis8YnIgLz48YnIgLz4KKyRzdGF0dXMgLSAkZXJyb3IKKzxiciAvPgorPC9kaXY+CitFT0YKKwlnaXRfZm9vdGVyX2h0bWwoKTsKKwlleGl0OworfQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgb3Igb3V0cHV0dGluZyBIVE1MOiBuYXZpZ2F0aW9uCisKK3N1YiBnaXRfcHJpbnRfcGFnZV9uYXYgeworCW15ICgkY3VycmVudCwgJHN1cHByZXNzLCAkaGVhZCwgJHRyZWVoZWFkLCAkdHJlZWJhc2UsICRleHRyYSkgPSBAXzsKKwkkZXh0cmEgPSAnJyBpZiAhZGVmaW5lZCAkZXh0cmE7ICMgcGFnZXIgb3IgZm9ybWF0cworCisJbXkgQG5hdnMgPSBxdyhzdW1tYXJ5IHNob3J0bG9nIGxvZyBjb21taXQgY29tbWl0ZGlmZiB0cmVlKTsKKwlpZiAoJHN1cHByZXNzKSB7CisJCUBuYXZzID0gZ3JlcCB7ICRfIG5lICRzdXBwcmVzcyB9IEBuYXZzOworCX0KKworCW15ICVhcmcgPSBtYXAgeyAkXyA9PiB7YWN0aW9uPT4kX30gfSBAbmF2czsKKwlpZiAoZGVmaW5lZCAkaGVhZCkgeworCQlmb3IgKHF3KGNvbW1pdCBjb21taXRkaWZmKSkgeworCQkJJGFyZ3skX317J2hhc2gnfSA9ICRoZWFkOworCQl9CisJCWlmICgkY3VycmVudCA9fiBtL14odHJlZSB8IGxvZyB8IHNob3J0bG9nIHwgY29tbWl0IHwgY29tbWl0ZGlmZiB8IHNlYXJjaCkkL3gpIHsKKwkJCWZvciAocXcoc2hvcnRsb2cgbG9nKSkgeworCQkJCSRhcmd7JF99eydoYXNoJ30gPSAkaGVhZDsKKwkJCX0KKwkJfQorCX0KKwkkYXJneyd0cmVlJ317J2hhc2gnfSA9ICR0cmVlaGVhZCBpZiBkZWZpbmVkICR0cmVlaGVhZDsKKwkkYXJneyd0cmVlJ317J2hhc2hfYmFzZSd9ID0gJHRyZWViYXNlIGlmIGRlZmluZWQgJHRyZWViYXNlOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCShqb2luICIgfCAiLAorCQkgbWFwIHsgJF8gZXEgJGN1cnJlbnQgPworCQkgICAgICAgJF8gOiAkY2dpLT5hKHstaHJlZiA9PiBocmVmKCV7JGFyZ3skX319KX0sICIkXyIpCisJCSB9IEBuYXZzKTsKKwlwcmludCAiPGJyLz5cbiRleHRyYTxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworfQorCitzdWIgZm9ybWF0X3BhZ2luZ19uYXYgeworCW15ICgkYWN0aW9uLCAkaGFzaCwgJGhlYWQsICRwYWdlLCAkbnJldnMpID0gQF87CisJbXkgJHBhZ2luZ19uYXY7CisKKworCWlmICgkaGFzaCBuZSAkaGVhZCB8fCAkcGFnZSkgeworCQkkcGFnaW5nX25hdiAuPSAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+JGFjdGlvbil9LCAiSEVBRCIpOworCX0gZWxzZSB7CisJCSRwYWdpbmdfbmF2IC49ICJIRUFEIjsKKwl9CisKKwlpZiAoJHBhZ2UgPiAwKSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiRhY3Rpb24sIGhhc2g9PiRoYXNoLCBwYWdlPT4kcGFnZS0xKSwKKwkJCSAgICAgICAgIC1hY2Nlc3NrZXkgPT4gInAiLCAtdGl0bGUgPT4gIkFsdC1wIn0sICJwcmV2Iik7CisJfSBlbHNlIHsKKwkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgcHJldiI7CisJfQorCisJaWYgKCRucmV2cyA+PSAoMTAwICogKCRwYWdlKzEpLTEpKSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiRhY3Rpb24sIGhhc2g9PiRoYXNoLCBwYWdlPT4kcGFnZSsxKSwKKwkJCSAgICAgICAgIC1hY2Nlc3NrZXkgPT4gIm4iLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0Iik7CisJfSBlbHNlIHsKKwkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgbmV4dCI7CisJfQorCisJcmV0dXJuICRwYWdpbmdfbmF2OworfQorCisjIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgb3Igb3V0cHV0dGluZyBIVE1MOiBkaXYKKworc3ViIGdpdF9wcmludF9oZWFkZXJfZGl2IHsKKwlteSAoJGFjdGlvbiwgJHRpdGxlLCAkaGFzaCwgJGhhc2hfYmFzZSkgPSBAXzsKKwlteSAlYXJncyA9ICgpOworCisJJGFyZ3N7J2FjdGlvbid9ID0gJGFjdGlvbjsKKwkkYXJnc3snaGFzaCd9ID0gJGhhc2ggaWYgJGhhc2g7CisJJGFyZ3N7J2hhc2hfYmFzZSd9ID0gJGhhc2hfYmFzZSBpZiAkaGFzaF9iYXNlOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoJWFyZ3MpLCAtY2xhc3MgPT4gInRpdGxlIn0sCisJICAgICAgJHRpdGxlID8gJHRpdGxlIDogJGFjdGlvbikgLgorCSAgICAgICJcbjwvZGl2PlxuIjsKK30KKworI3N1YiBnaXRfcHJpbnRfYXV0aG9yc2hpcCAoXCUpIHsKK3N1YiBnaXRfcHJpbnRfYXV0aG9yc2hpcCB7CisJbXkgJGNvID0gc2hpZnQ7CisKKwlteSAlYWQgPSBwYXJzZV9kYXRlKCRjby0+eydhdXRob3JfZXBvY2gnfSwgJGNvLT57J2F1dGhvcl90eid9KTsKKwlwcmludCAiPGRpdiBjbGFzcz1cImF1dGhvcl9kYXRlXCI+IiAuCisJICAgICAgZXNjX2h0bWwoJGNvLT57J2F1dGhvcl9uYW1lJ30pIC4KKwkgICAgICAiIFskYWR7J3JmYzI4MjInfSI7CisJaWYgKCRhZHsnaG91cl9sb2NhbCd9IDwgNikgeworCQlwcmludGYoIiAoPHNwYW4gY2xhc3M9XCJhdG5pZ2h0XCI+JTAyZDolMDJkPC9zcGFuPiAlcykiLAorCQkgICAgICAgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgKCUwMmQ6JTAyZCAlcykiLAorCQkgICAgICAgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfQorCXByaW50ICJdPC9kaXY+XG4iOworfQorCitzdWIgZ2l0X3ByaW50X3BhZ2VfcGF0aCB7CisJbXkgJG5hbWUgPSBzaGlmdDsKKwlteSAkdHlwZSA9IHNoaWZ0OworCW15ICRoYiA9IHNoaWZ0OworCisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfcGF0aFwiPiI7CisJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaF9iYXNlPT4kaGIpLAorCSAgICAgICAgICAgICAgLXRpdGxlID0+ICd0cmVlIHJvb3QnfSwgZGVjb2RlX3V0ZjgoIlskcHJvamVjdF0iKSk7CisJcHJpbnQgIiAvICI7CisJaWYgKGRlZmluZWQgJG5hbWUpIHsKKwkJbXkgQGRpcm5hbWUgPSBzcGxpdCAnLycsICRuYW1lOworCQlteSAkYmFzZW5hbWUgPSBwb3AgQGRpcm5hbWU7CisJCW15ICRmdWxsbmFtZSA9ICcnOworCisJCWZvcmVhY2ggbXkgJGRpciAoQGRpcm5hbWUpIHsKKwkJCSRmdWxsbmFtZSAuPSAoJGZ1bGxuYW1lID8gJy8nIDogJycpIC4gJGRpcjsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGZpbGVfbmFtZT0+JGZ1bGxuYW1lLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYiksCisJCQkgICAgICAgICAgICAgIC10aXRsZSA9PiAkZnVsbG5hbWV9LCBlc2NfcGF0aCgkZGlyKSk7CisJCQlwcmludCAiIC8gIjsKKwkJfQorCQlpZiAoZGVmaW5lZCAkdHlwZSAmJiAkdHlwZSBlcSAnYmxvYicpIHsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYl9wbGFpbiIsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGIpLAorCQkJICAgICAgICAgICAgICAtdGl0bGUgPT4gJG5hbWV9LCBlc2NfcGF0aCgkYmFzZW5hbWUpKTsKKwkJfSBlbHNpZiAoZGVmaW5lZCAkdHlwZSAmJiAkdHlwZSBlcSAndHJlZScpIHsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGIpLAorCQkJICAgICAgICAgICAgICAtdGl0bGUgPT4gJG5hbWV9LCBlc2NfcGF0aCgkYmFzZW5hbWUpKTsKKwkJCXByaW50ICIgLyAiOworCQl9IGVsc2UgeworCQkJcHJpbnQgZXNjX3BhdGgoJGJhc2VuYW1lKTsKKwkJfQorCX0KKwlwcmludCAiPGJyLz48L2Rpdj5cbiI7Cit9CisKKyMgc3ViIGdpdF9wcmludF9sb2cgKFxAOyUpIHsKK3N1YiBnaXRfcHJpbnRfbG9nICgkOyUpIHsKKwlteSAkbG9nID0gc2hpZnQ7CisJbXkgJW9wdHMgPSBAXzsKKworCWlmICgkb3B0c3snLXJlbW92ZV90aXRsZSd9KSB7CisJCSMgcmVtb3ZlIHRpdGxlLCBpLmUuIGZpcnN0IGxpbmUgb2YgbG9nCisJCXNoaWZ0IEAkbG9nOworCX0KKwkjIHJlbW92ZSBsZWFkaW5nIGVtcHR5IGxpbmVzCisJd2hpbGUgKGRlZmluZWQgJGxvZy0+WzBdICYmICRsb2ctPlswXSBlcSAiIikgeworCQlzaGlmdCBAJGxvZzsKKwl9CisKKwkjIHByaW50IGxvZworCW15ICRzaWdub2ZmID0gMDsKKwlteSAkZW1wdHkgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEAkbG9nKSB7CisJCWlmICgkbGluZSA9fiBtL14gKihzaWduZWRbIFwtXW9mZlsgXC1dYnlbIDpdfGFja2VkWyBcLV1ieVsgOl18Y2NbIDpdKS9pKSB7CisJCQkkc2lnbm9mZiA9IDE7CisJCQkkZW1wdHkgPSAwOworCQkJaWYgKCEgJG9wdHN7Jy1yZW1vdmVfc2lnbm9mZid9KSB7CisJCQkJcHJpbnQgIjxzcGFuIGNsYXNzPVwic2lnbm9mZlwiPiIgLiBlc2NfaHRtbCgkbGluZSkgLiAiPC9zcGFuPjxici8+XG4iOworCQkJCW5leHQ7CisJCQl9IGVsc2UgeworCQkJCSMgcmVtb3ZlIHNpZ25vZmYgbGluZXMKKwkJCQluZXh0OworCQkJfQorCQl9IGVsc2UgeworCQkJJHNpZ25vZmYgPSAwOworCQl9CisKKwkJIyBwcmludCBvbmx5IG9uZSBlbXB0eSBsaW5lCisJCSMgZG8gbm90IHByaW50IGVtcHR5IGxpbmUgYWZ0ZXIgc2lnbm9mZgorCQlpZiAoJGxpbmUgZXEgIiIpIHsKKwkJCW5leHQgaWYgKCRlbXB0eSB8fCAkc2lnbm9mZik7CisJCQkkZW1wdHkgPSAxOworCQl9IGVsc2UgeworCQkJJGVtcHR5ID0gMDsKKwkJfQorCisJCXByaW50IGZvcm1hdF9sb2dfbGluZV9odG1sKCRsaW5lKSAuICI8YnIvPlxuIjsKKwl9CisKKwlpZiAoJG9wdHN7Jy1maW5hbF9lbXB0eV9saW5lJ30pIHsKKwkJIyBlbmQgd2l0aCBzaW5nbGUgZW1wdHkgbGluZQorCQlwcmludCAiPGJyLz5cbiIgdW5sZXNzICRlbXB0eTsKKwl9Cit9CisKKyMgcmV0dXJuIGxpbmsgdGFyZ2V0ICh3aGF0IGxpbmsgcG9pbnRzIHRvKQorc3ViIGdpdF9nZXRfbGlua190YXJnZXQgeworCW15ICRoYXNoID0gc2hpZnQ7CisJbXkgJGxpbmtfdGFyZ2V0OworCisJIyByZWFkIGxpbmsKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiY2F0LWZpbGUiLCAiYmxvYiIsICRoYXNoCisJCW9yIHJldHVybjsKKwl7CisJCWxvY2FsICQvOworCQkkbGlua190YXJnZXQgPSA8JGZkPjsKKwl9CisJY2xvc2UgJGZkCisJCW9yIHJldHVybjsKKworCXJldHVybiAkbGlua190YXJnZXQ7Cit9CisKKyMgZ2l2ZW4gbGluayB0YXJnZXQsIGFuZCB0aGUgZGlyZWN0b3J5IChiYXNlZGlyKSB0aGUgbGluayBpcyBpbiwKKyMgcmV0dXJuIHRhcmdldCBvZiBsaW5rIHJlbGF0aXZlIHRvIHRvcCBkaXJlY3RvcnkgKHRvcCB0cmVlKTsKKyMgcmV0dXJuIHVuZGVmIGlmIGl0IGlzIG5vdCBwb3NzaWJsZSAoaW5jbHVkaW5nIGFic29sdXRlIGxpbmtzKS4KK3N1YiBub3JtYWxpemVfbGlua190YXJnZXQgeworCW15ICgkbGlua190YXJnZXQsICRiYXNlZGlyLCAkaGFzaF9iYXNlKSA9IEBfOworCisJIyB3ZSBjYW4gbm9ybWFsaXplIHN5bWxpbmsgdGFyZ2V0IG9ubHkgaWYgJGhhc2hfYmFzZSBpcyBwcm92aWRlZAorCXJldHVybiB1bmxlc3MgJGhhc2hfYmFzZTsKKworCSMgYWJzb2x1dGUgc3ltbGlua3MgKGJlZ2lubmluZyB3aXRoICcvJykgY2Fubm90IGJlIG5vcm1hbGl6ZWQKKwlyZXR1cm4gaWYgKHN1YnN0cigkbGlua190YXJnZXQsIDAsIDEpIGVxICcvJyk7CisKKwkjIG5vcm1hbGl6ZSBsaW5rIHRhcmdldCB0byBwYXRoIGZyb20gdG9wIChyb290KSB0cmVlIChkaXIpCisJbXkgJHBhdGg7CisJaWYgKCRiYXNlZGlyKSB7CisJCSRwYXRoID0gJGJhc2VkaXIgLiAnLycgLiAkbGlua190YXJnZXQ7CisJfSBlbHNlIHsKKwkJIyB3ZSBhcmUgaW4gdG9wIChyb290KSB0cmVlIChkaXIpCisJCSRwYXRoID0gJGxpbmtfdGFyZ2V0OworCX0KKworCSMgcmVtb3ZlIC8vLCAvLi8sIGFuZCAvLi4vCisJbXkgQHBhdGhfcGFydHM7CisJZm9yZWFjaCBteSAkcGFydCAoc3BsaXQoJy8nLCAkcGF0aCkpIHsKKwkJIyBkaXNjYXJkICcuJyBhbmQgJycKKwkJbmV4dCBpZiAoISRwYXJ0IHx8ICRwYXJ0IGVxICcuJyk7CisJCSMgaGFuZGxlICcuLicKKwkJaWYgKCRwYXJ0IGVxICcuLicpIHsKKwkJCWlmIChAcGF0aF9wYXJ0cykgeworCQkJCXBvcCBAcGF0aF9wYXJ0czsKKwkJCX0gZWxzZSB7CisJCQkJIyBsaW5rIGxlYWRzIG91dHNpZGUgcmVwb3NpdG9yeSAob3V0c2lkZSB0b3AgZGlyKQorCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB1c2ggQHBhdGhfcGFydHMsICRwYXJ0OworCQl9CisJfQorCSRwYXRoID0gam9pbignLycsIEBwYXRoX3BhcnRzKTsKKworCXJldHVybiAkcGF0aDsKK30KKworIyBwcmludCB0cmVlIGVudHJ5IChyb3cgb2YgZ2l0X3RyZWUpLCBidXQgd2l0aG91dCBlbmNvbXBhc3NpbmcgPHRyPiBlbGVtZW50CitzdWIgZ2l0X3ByaW50X3RyZWVfZW50cnkgeworCW15ICgkdCwgJGJhc2VkaXIsICRoYXNoX2Jhc2UsICRoYXZlX2JsYW1lKSA9IEBfOworCisJbXkgJWJhc2Vfa2V5ID0gKCk7CisJJGJhc2Vfa2V5eydoYXNoX2Jhc2UnfSA9ICRoYXNoX2Jhc2UgaWYgZGVmaW5lZCAkaGFzaF9iYXNlOworCisJIyBUaGUgZm9ybWF0IG9mIGEgdGFibGUgcm93IGlzOiBtb2RlIGxpc3QgbGluay4gIFdoZXJlIG1vZGUgaXMKKwkjIHRoZSBtb2RlIG9mIHRoZSBlbnRyeSwgbGlzdCBpcyB0aGUgbmFtZSBvZiB0aGUgZW50cnksIGFuIGhyZWYsCisJIyBhbmQgbGluayBpcyB0aGUgYWN0aW9uIGxpbmtzIG9mIHRoZSBlbnRyeS4KKworCXByaW50ICI8dGQgY2xhc3M9XCJtb2RlXCI+IiAuIG1vZGVfc3RyKCR0LT57J21vZGUnfSkgLiAiPC90ZD5cbiI7CisJaWYgKCR0LT57J3R5cGUnfSBlcSAiYmxvYiIpIHsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpc3RcIj4iIC4KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiR0LT57J2hhc2gnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iLCAlYmFzZV9rZXkpLAorCQkJICAgICAgICAtY2xhc3MgPT4gImxpc3QifSwgZXNjX3BhdGgoJHQtPnsnbmFtZSd9KSk7CisJCWlmIChTX0lTTE5LKG9jdCAkdC0+eydtb2RlJ30pKSB7CisJCQlteSAkbGlua190YXJnZXQgPSBnaXRfZ2V0X2xpbmtfdGFyZ2V0KCR0LT57J2hhc2gnfSk7CisJCQlpZiAoJGxpbmtfdGFyZ2V0KSB7CisJCQkJbXkgJG5vcm1fdGFyZ2V0ID0gbm9ybWFsaXplX2xpbmtfdGFyZ2V0KCRsaW5rX3RhcmdldCwgJGJhc2VkaXIsICRoYXNoX2Jhc2UpOworCQkJCWlmIChkZWZpbmVkICRub3JtX3RhcmdldCkgeworCQkJCQlwcmludCAiIC0+ICIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Im9iamVjdCIsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRub3JtX3RhcmdldCksCisJCQkJCSAgICAgICAgICAgICAgIC10aXRsZSA9PiAkbm9ybV90YXJnZXR9LCBlc2NfcGF0aCgkbGlua190YXJnZXQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludCAiIC0+ICIgLiBlc2NfcGF0aCgkbGlua190YXJnZXQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludCAiPC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5rXCI+IjsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JHQtPnsnaGFzaCd9LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+IiRiYXNlZGlyJHQtPnsnbmFtZSd9IiwgJWJhc2Vfa2V5KX0sCisJCSAgICAgICAgICAgICAgImJsb2IiKTsKKwkJaWYgKCRoYXZlX2JsYW1lKSB7CisJCQlwcmludCAiIHwgIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsYW1lIiwgaGFzaD0+JHQtPnsnaGFzaCd9LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIsICViYXNlX2tleSl9LAorCQkJICAgICAgICAgICAgICAiYmxhbWUiKTsKKwkJfQorCQlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJCQlwcmludCAiIHwgIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiR0LT57J2hhc2gnfSwgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iKX0sCisJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCX0KKwkJcHJpbnQgIiB8ICIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIpfSwKKwkJCSAgICAgICAgInJhdyIpOworCQlwcmludCAiPC90ZD5cbiI7CisKKwl9IGVsc2lmICgkdC0+eyd0eXBlJ30gZXEgInRyZWUiKSB7CisJCXByaW50ICI8dGQgY2xhc3M9XCJsaXN0XCI+IjsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JHQtPnsnaGFzaCd9LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+IiRiYXNlZGlyJHQtPnsnbmFtZSd9IiwgJWJhc2Vfa2V5KX0sCisJCSAgICAgICAgICAgICAgZXNjX3BhdGgoJHQtPnsnbmFtZSd9KSk7CisJCXByaW50ICI8L3RkPlxuIjsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kdC0+eydoYXNoJ30sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iLCAlYmFzZV9rZXkpfSwKKwkJICAgICAgICAgICAgICAidHJlZSIpOworCQlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJCQlwcmludCAiIHwgIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+IiRiYXNlZGlyJHQtPnsnbmFtZSd9Iil9LAorCQkJICAgICAgICAgICAgICAiaGlzdG9yeSIpOworCQl9CisJCXByaW50ICI8L3RkPlxuIjsKKwl9Cit9CisKKyMjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyMjIGZ1bmN0aW9ucyBwcmludGluZyBsYXJnZSBmcmFnbWVudHMgb2YgSFRNTAorCitzdWIgZmlsbF9mcm9tX2ZpbGVfaW5mbyB7CisJbXkgKCRkaWZmLCBAcGFyZW50cykgPSBAXzsKKworCSRkaWZmLT57J2Zyb21fZmlsZSd9ID0gWyBdOworCSRkaWZmLT57J2Zyb21fZmlsZSd9WyRkaWZmLT57J25wYXJlbnRzJ30gLSAxXSA9IHVuZGVmOworCWZvciAobXkgJGkgPSAwOyAkaSA8ICRkaWZmLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJaWYgKCRkaWZmLT57J3N0YXR1cyd9WyRpXSBlcSAnUicgfHwKKwkJICAgICRkaWZmLT57J3N0YXR1cyd9WyRpXSBlcSAnQycpIHsKKwkJCSRkaWZmLT57J2Zyb21fZmlsZSd9WyRpXSA9CisJCQkJZ2l0X2dldF9wYXRoX2J5X2hhc2goJHBhcmVudHNbJGldLCAkZGlmZi0+eydmcm9tX2lkJ31bJGldKTsKKwkJfQorCX0KKworCXJldHVybiAkZGlmZjsKK30KKworIyBwYXJhbWV0ZXJzIGNhbiBiZSBzdHJpbmdzLCBvciByZWZlcmVuY2VzIHRvIGFycmF5cyBvZiBzdHJpbmdzCitzdWIgZnJvbV9pZHNfZXEgeworCW15ICgkYSwgJGIpID0gQF87CisKKwlpZiAocmVmKCRhKSBlcSAiQVJSQVkiICYmIHJlZigkYikgZXEgIkFSUkFZIiAmJiBAJGEgPT0gQCRiKSB7CisJCWZvciAobXkgJGkgPSAwOyAkaSA8IEAkYTsgKyskaSkgeworCQkJcmV0dXJuIDAgdW5sZXNzICgkYS0+WyRpXSBlcSAkYi0+WyRpXSk7CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNpZiAoIXJlZigkYSkgJiYgIXJlZigkYikpIHsKKwkJcmV0dXJuICRhIGVxICRiOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworCitzdWIgZ2l0X2RpZmZ0cmVlX2JvZHkgeworCW15ICgkZGlmZnRyZWUsICRoYXNoLCBAcGFyZW50cykgPSBAXzsKKwlteSAoJHBhcmVudCkgPSAkcGFyZW50c1swXTsKKwlteSAoJGhhdmVfYmxhbWUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2JsYW1lJyk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJsaXN0X2hlYWRcIj5cbiI7CisJaWYgKCQjeyRkaWZmdHJlZX0gPiAxMCkgeworCQlwcmludCgoJCN7JGRpZmZ0cmVlfSArIDEpIC4gIiBmaWxlcyBjaGFuZ2VkOlxuIik7CisJfQorCXByaW50ICI8L2Rpdj5cbiI7CisKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwiIiAuCisJICAgICAgKEBwYXJlbnRzID4gMSA/ICJjb21iaW5lZCAiIDogIiIpIC4KKwkgICAgICAiZGlmZl90cmVlXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCW15ICRwYXRjaG5vID0gMDsKKwlmb3JlYWNoIG15ICRsaW5lIChAeyRkaWZmdHJlZX0pIHsKKwkJbXkgJGRpZmY7CisJCWlmIChyZWYoJGxpbmUpIGVxICJIQVNIIikgeworCQkJIyBwcmUtcGFyc2VkIChvciBnZW5lcmF0ZWQgYnkgaGFuZCkKKwkJCSRkaWZmID0gJGxpbmU7CisJCX0gZWxzZSB7CisJCQkkZGlmZiA9IHBhcnNlX2RpZmZ0cmVlX3Jhd19saW5lKCRsaW5lKTsKKwkJfQorCisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisKKwkJaWYgKGV4aXN0cyAkZGlmZi0+eyducGFyZW50cyd9KSB7ICMgY29tYmluZWQgZGlmZgorCisJCQlmaWxsX2Zyb21fZmlsZV9pbmZvKCRkaWZmLCBAcGFyZW50cykKKwkJCQl1bmxlc3MgZXhpc3RzICRkaWZmLT57J2Zyb21fZmlsZSd9OworCisJCQlpZiAoJGRpZmYtPnsndG9faWQnfSBuZSAoJzAnIHggNDApKSB7CisJCQkJIyBmaWxlIGV4aXN0cyBpbiB0aGUgcmVzdWx0IChjaGlsZCkgY29tbWl0CisJCQkJcHJpbnQgIjx0ZD4iIC4KKwkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kZGlmZi0+eyd0b19pZCd9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoKSwKKwkJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfcGF0aCgkZGlmZi0+eyd0b19maWxlJ30pKSAuCisJCQkJICAgICAgIjwvdGQ+XG4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRkPiIgLgorCQkJCSAgICAgIGVzY19wYXRoKCRkaWZmLT57J3RvX2ZpbGUnfSkgLgorCQkJCSAgICAgICI8L3RkPlxuIjsKKwkJCX0KKworCQkJaWYgKCRhY3Rpb24gZXEgJ2NvbW1pdGRpZmYnKSB7CisJCQkJIyBsaW5rIHRvIHBhdGNoCisJCQkJJHBhdGNobm8rKzsKKwkJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKSAuCisJCQkJICAgICAgIiB8ICIgLgorCQkJCSAgICAgICI8L3RkPlxuIjsKKwkJCX0KKworCQkJbXkgJGhhc19oaXN0b3J5ID0gMDsKKwkJCW15ICRub3RfZGVsZXRlZCA9IDA7CisJCQlmb3IgKG15ICRpID0gMDsgJGkgPCAkZGlmZi0+eyducGFyZW50cyd9OyAkaSsrKSB7CisJCQkJbXkgJGhhc2hfcGFyZW50ID0gJHBhcmVudHNbJGldOworCQkJCW15ICRmcm9tX2hhc2ggPSAkZGlmZi0+eydmcm9tX2lkJ31bJGldOworCQkJCW15ICRmcm9tX3BhdGggPSAkZGlmZi0+eydmcm9tX2ZpbGUnfVskaV07CisJCQkJbXkgJHN0YXR1cyA9ICRkaWZmLT57J3N0YXR1cyd9WyRpXTsKKworCQkJCSRoYXNfaGlzdG9yeSB8fD0gKCRzdGF0dXMgbmUgJ0EnKTsKKwkJCQkkbm90X2RlbGV0ZWQgfHw9ICgkc3RhdHVzIG5lICdEJyk7CisKKwkJCQlpZiAoJHN0YXR1cyBlcSAnQScpIHsKKwkJCQkJcHJpbnQgIjx0ZCAgY2xhc3M9XCJsaW5rXCIgYWxpZ249XCJyaWdodFwiPiB8IDwvdGQ+XG4iOworCQkJCX0gZWxzaWYgKCRzdGF0dXMgZXEgJ0QnKSB7CisJCQkJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZnJvbV9oYXNoLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZyb21fcGF0aCl9LAorCQkJCQkgICAgICAgICAgICAgICJibG9iIiAuICgkaSsxKSkgLgorCQkJCQkgICAgICAiIHwgPC90ZD5cbiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCRkaWZmLT57J3RvX2lkJ30gZXEgJGZyb21faGFzaCkgeworCQkJCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmsgbm9jaGFuZ2VcIj4iOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJCQl9CisJCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9wYXJlbnQ9PiRmcm9tX2hhc2gsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3BhcmVudF9iYXNlPT4kaGFzaF9wYXJlbnQsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXJlbnQ9PiRmcm9tX3BhdGgpfSwKKwkJCQkJICAgICAgICAgICAgICAiZGlmZiIgLiAoJGkrMSkpIC4KKwkJCQkJICAgICAgIiB8IDwvdGQ+XG4iOworCQkJCX0KKwkJCX0KKworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJaWYgKCRub3RfZGVsZXRlZCkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZi0+eyd0b19pZCd9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoKX0sCisJCQkJICAgICAgICAgICAgICAiYmxvYiIpOworCQkJCXByaW50ICIgfCAiIGlmICgkaGFzX2hpc3RvcnkpOworCQkJfQorCQkJaWYgKCRoYXNfaGlzdG9yeSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gpfSwKKwkJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJCXByaW50ICI8L3RyPlxuIjsKKwkJCW5leHQ7ICMgaW5zdGVhZCBvZiAnZWxzZScgY2xhdXNlLCB0byBhdm9pZCBleHRyYSBpbmRlbnQKKwkJfQorCQkjIGVsc2Ugb3JkaW5hcnkgZGlmZgorCisJCW15ICgkdG9fbW9kZV9vY3QsICR0b19tb2RlX3N0ciwgJHRvX2ZpbGVfdHlwZSk7CisJCW15ICgkZnJvbV9tb2RlX29jdCwgJGZyb21fbW9kZV9zdHIsICRmcm9tX2ZpbGVfdHlwZSk7CisJCWlmICgkZGlmZi0+eyd0b19tb2RlJ30gbmUgKCcwJyB4IDYpKSB7CisJCQkkdG9fbW9kZV9vY3QgPSBvY3QgJGRpZmYtPnsndG9fbW9kZSd9OworCQkJaWYgKFNfSVNSRUcoJHRvX21vZGVfb2N0KSkgeyAjIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZQorCQkJCSR0b19tb2RlX3N0ciA9IHNwcmludGYoIiUwNG8iLCAkdG9fbW9kZV9vY3QgJiAwNzc3KTsgIyBwZXJtaXNzaW9uIGJpdHMKKwkJCX0KKwkJCSR0b19maWxlX3R5cGUgPSBmaWxlX3R5cGUoJGRpZmYtPnsndG9fbW9kZSd9KTsKKwkJfQorCQlpZiAoJGRpZmYtPnsnZnJvbV9tb2RlJ30gbmUgKCcwJyB4IDYpKSB7CisJCQkkZnJvbV9tb2RlX29jdCA9IG9jdCAkZGlmZi0+eydmcm9tX21vZGUnfTsKKwkJCWlmIChTX0lTUkVHKCR0b19tb2RlX29jdCkpIHsgIyBvbmx5IGZvciByZWd1bGFyIGZpbGUKKwkJCQkkZnJvbV9tb2RlX3N0ciA9IHNwcmludGYoIiUwNG8iLCAkZnJvbV9tb2RlX29jdCAmIDA3NzcpOyAjIHBlcm1pc3Npb24gYml0cworCQkJfQorCQkJJGZyb21fZmlsZV90eXBlID0gZmlsZV90eXBlKCRkaWZmLT57J2Zyb21fbW9kZSd9KTsKKwkJfQorCisJCWlmICgkZGlmZi0+eydzdGF0dXMnfSBlcSAiQSIpIHsgIyBjcmVhdGVkCisJCQlteSAkbW9kZV9jaG5nID0gIjxzcGFuIGNsYXNzPVwiZmlsZV9zdGF0dXMgbmV3XCI+W25ldyAkdG9fZmlsZV90eXBlIjsKKwkJCSRtb2RlX2NobmcgICAuPSAiIHdpdGggbW9kZTogJHRvX21vZGVfc3RyIiBpZiAkdG9fbW9kZV9zdHI7CisJCQkkbW9kZV9jaG5nICAgLj0gIl08L3NwYW4+IjsKKwkJCXByaW50ICI8dGQ+IjsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KSwKKwkJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nPC90ZD5cbiI7CisJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlpZiAoJGFjdGlvbiBlcSAnY29tbWl0ZGlmZicpIHsKKwkJCQkjIGxpbmsgdG8gcGF0Y2gKKwkJCQkkcGF0Y2hubysrOworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKTsKKwkJCQlwcmludCAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KX0sCisJCQkgICAgICAgICAgICAgICJibG9iIik7CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJfSBlbHNpZiAoJGRpZmYtPnsnc3RhdHVzJ30gZXEgIkQiKSB7ICMgZGVsZXRlZAorCQkJbXkgJG1vZGVfY2huZyA9ICI8c3BhbiBjbGFzcz1cImZpbGVfc3RhdHVzIGRlbGV0ZWRcIj5bZGVsZXRlZCAkZnJvbV9maWxlX3R5cGVdPC9zcGFuPiI7CisJCQlwcmludCAiPHRkPiI7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kZGlmZi0+eydmcm9tX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JHBhcmVudCwgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nPC90ZD5cbiI7CisJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlpZiAoJGFjdGlvbiBlcSAnY29tbWl0ZGlmZicpIHsKKwkJCQkjIGxpbmsgdG8gcGF0Y2gKKwkJCQkkcGF0Y2hubysrOworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKTsKKwkJCQlwcmludCAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J2Zyb21faWQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kcGFyZW50LCBmaWxlX25hbWU9PiRkaWZmLT57J2ZpbGUnfSl9LAorCQkJICAgICAgICAgICAgICAiYmxvYiIpIC4gIiB8ICI7CisJCQlpZiAoJGhhdmVfYmxhbWUpIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsYW1lIiwgaGFzaF9iYXNlPT4kcGFyZW50LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJibGFtZSIpIC4gIiB8ICI7CisJCQl9CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRwYXJlbnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KX0sCisJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJfSBlbHNpZiAoJGRpZmYtPnsnc3RhdHVzJ30gZXEgIk0iIHx8ICRkaWZmLT57J3N0YXR1cyd9IGVxICJUIikgeyAjIG1vZGlmaWVkLCBvciB0eXBlIGNoYW5nZWQKKwkJCW15ICRtb2RlX2NobmdlID0gIiI7CisJCQlpZiAoJGRpZmYtPnsnZnJvbV9tb2RlJ30gIT0gJGRpZmYtPnsndG9fbW9kZSd9KSB7CisJCQkJJG1vZGVfY2huZ2UgPSAiPHNwYW4gY2xhc3M9XCJmaWxlX3N0YXR1cyBtb2RlX2NobmdlXCI+W2NoYW5nZWQiOworCQkJCWlmICgkZnJvbV9maWxlX3R5cGUgbmUgJHRvX2ZpbGVfdHlwZSkgeworCQkJCQkkbW9kZV9jaG5nZSAuPSAiIGZyb20gJGZyb21fZmlsZV90eXBlIHRvICR0b19maWxlX3R5cGUiOworCQkJCX0KKwkJCQlpZiAoKCRmcm9tX21vZGVfb2N0ICYgMDc3NykgIT0gKCR0b19tb2RlX29jdCAmIDA3NzcpKSB7CisJCQkJCWlmICgkZnJvbV9tb2RlX3N0ciAmJiAkdG9fbW9kZV9zdHIpIHsKKwkJCQkJCSRtb2RlX2NobmdlIC49ICIgbW9kZTogJGZyb21fbW9kZV9zdHItPiR0b19tb2RlX3N0ciI7CisJCQkJCX0gZWxzaWYgKCR0b19tb2RlX3N0cikgeworCQkJCQkJJG1vZGVfY2huZ2UgLj0gIiBtb2RlOiAkdG9fbW9kZV9zdHIiOworCQkJCQl9CisJCQkJfQorCQkJCSRtb2RlX2NobmdlIC49ICJdPC9zcGFuPlxuIjsKKwkJCX0KKwkJCXByaW50ICI8dGQ+IjsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KSwKKwkJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nZTwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJaWYgKCRhY3Rpb24gZXEgJ2NvbW1pdGRpZmYnKSB7CisJCQkJIyBsaW5rIHRvIHBhdGNoCisJCQkJJHBhdGNobm8rKzsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiI3BhdGNoJHBhdGNobm8ifSwgInBhdGNoIikgLgorCQkJCSAgICAgICIgfCAiOworCQkJfSBlbHNpZiAoJGRpZmYtPnsndG9faWQnfSBuZSAkZGlmZi0+eydmcm9tX2lkJ30pIHsKKwkJCQkjICJjb21taXQiIHZpZXcgYW5kIG1vZGlmaWVkIGZpbGUgKG5vdCBvbmx1IG1vZGUgY2hhbmdlZCkKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JkaWZmIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sIGhhc2hfcGFyZW50PT4kZGlmZi0+eydmcm9tX2lkJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoLCBoYXNoX3BhcmVudF9iYXNlPT4kcGFyZW50LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJkaWZmIikgLgorCQkJCSAgICAgICIgfCAiOworCQkJfQorCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgICJibG9iIikgLiAiIHwgIjsKKwkJCWlmICgkaGF2ZV9ibGFtZSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBoYXNoX2Jhc2U9PiRoYXNoLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJibGFtZSIpIC4gIiB8ICI7CisJCQl9CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J2ZpbGUnfSl9LAorCQkJICAgICAgICAgICAgICAiaGlzdG9yeSIpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCisJCX0gZWxzaWYgKCRkaWZmLT57J3N0YXR1cyd9IGVxICJSIiB8fCAkZGlmZi0+eydzdGF0dXMnfSBlcSAiQyIpIHsgIyByZW5hbWVkIG9yIGNvcGllZAorCQkJbXkgJXN0YXR1c19uYW1lID0gKCdSJyA9PiAnbW92ZWQnLCAnQycgPT4gJ2NvcGllZCcpOworCQkJbXkgJG5zdGF0dXMgPSAkc3RhdHVzX25hbWV7JGRpZmYtPnsnc3RhdHVzJ319OworCQkJbXkgJG1vZGVfY2huZyA9ICIiOworCQkJaWYgKCRkaWZmLT57J2Zyb21fbW9kZSd9ICE9ICRkaWZmLT57J3RvX21vZGUnfSkgeworCQkJCSMgbW9kZSBhbHNvIGZvciBkaXJlY3Rvcmllcywgc28gd2UgY2Fubm90IHVzZSAkdG9fbW9kZV9zdHIKKwkJCQkkbW9kZV9jaG5nID0gc3ByaW50ZigiLCBtb2RlOiAlMDRvIiwgJHRvX21vZGVfb2N0ICYgMDc3Nyk7CisJCQl9CisJCQlwcmludCAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pLAorCQkJICAgICAgICAgICAgICAtY2xhc3MgPT4gImxpc3QifSwgZXNjX3BhdGgoJGRpZmYtPnsndG9fZmlsZSd9KSkgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48c3BhbiBjbGFzcz1cImZpbGVfc3RhdHVzICRuc3RhdHVzXCI+WyRuc3RhdHVzIGZyb20gIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoX2Jhc2U9PiRwYXJlbnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J2Zyb21faWQnfSwgZmlsZV9uYW1lPT4kZGlmZi0+eydmcm9tX2ZpbGUnfSksCisJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfcGF0aCgkZGlmZi0+eydmcm9tX2ZpbGUnfSkpIC4KKwkJCSAgICAgICIgd2l0aCAiIC4gKGludCAkZGlmZi0+eydzaW1pbGFyaXR5J30pIC4gIiUgc2ltaWxhcml0eSRtb2RlX2NobmddPC9zcGFuPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IjsKKwkJCWlmICgkYWN0aW9uIGVxICdjb21taXRkaWZmJykgeworCQkJCSMgbGluayB0byBwYXRjaAorCQkJCSRwYXRjaG5vKys7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiNwYXRjaCRwYXRjaG5vIn0sICJwYXRjaCIpIC4KKwkJCQkgICAgICAiIHwgIjsKKwkJCX0gZWxzaWYgKCRkaWZmLT57J3RvX2lkJ30gbmUgJGRpZmYtPnsnZnJvbV9pZCd9KSB7CisJCQkJIyAiY29tbWl0IiB2aWV3IGFuZCBtb2RpZmllZCBmaWxlIChub3Qgb25seSBwdXJlIHJlbmFtZSBvciBjb3B5KQorCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwgaGFzaF9wYXJlbnQ9PiRkaWZmLT57J2Zyb21faWQnfSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGhhc2hfcGFyZW50X2Jhc2U9PiRwYXJlbnQsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSwgZmlsZV9wYXJlbnQ9PiRkaWZmLT57J2Zyb21fZmlsZSd9KX0sCisJCQkJICAgICAgICAgICAgICAiZGlmZiIpIC4KKwkJCQkgICAgICAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JHBhcmVudCwgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgImJsb2IiKSAuICIgfCAiOworCQkJaWYgKCRoYXZlX2JsYW1lKSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibGFtZSIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSl9LAorCQkJCSAgICAgICAgICAgICAgImJsYW1lIikgLiAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgImhpc3RvcnkiKTsKKwkJCXByaW50ICI8L3RkPlxuIjsKKworCQl9ICMgd2Ugc2hvdWxkIG5vdCBlbmNvdW50ZXIgVW5tZXJnZWQgKFUpIG9yIFVua25vd24gKFgpIHN0YXR1cworCQlwcmludCAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworc3ViIGdpdF9wYXRjaHNldF9ib2R5IHsKKwlteSAoJGZkLCAkZGlmZnRyZWUsICRoYXNoLCBAaGFzaF9wYXJlbnRzKSA9IEBfOworCW15ICgkaGFzaF9wYXJlbnQpID0gJGhhc2hfcGFyZW50c1swXTsKKworCW15ICRwYXRjaF9pZHggPSAwOworCW15ICRwYXRjaF9udW1iZXIgPSAwOworCW15ICRwYXRjaF9saW5lOworCW15ICRkaWZmaW5mbzsKKwlteSAoJWZyb20sICV0byk7CisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhdGNoc2V0XCI+XG4iOworCisJIyBza2lwIHRvIGZpcnN0IHBhdGNoCisJd2hpbGUgKCRwYXRjaF9saW5lID0gPCRmZD4pIHsKKwkJY2hvbXAgJHBhdGNoX2xpbmU7CisKKwkJbGFzdCBpZiAoJHBhdGNoX2xpbmUgPX4gbS9eZGlmZiAvKTsKKwl9CisKKyBQQVRDSDoKKwl3aGlsZSAoJHBhdGNoX2xpbmUpIHsKKwkJbXkgQGRpZmZfaGVhZGVyOworCQlteSAoJGZyb21faWQsICR0b19pZCk7CisKKwkJIyBnaXQgZGlmZiBoZWFkZXIKKwkJI2Fzc2VydCgkcGF0Y2hfbGluZSA9fiBtL15kaWZmIC8pIGlmIERFQlVHOworCQkjYXNzZXJ0KCRwYXRjaF9saW5lICF+IG0hJC8kISkgaWYgREVCVUc7ICMgaXMgY2hvbXAtZWQKKwkJJHBhdGNoX251bWJlcisrOworCQlwdXNoIEBkaWZmX2hlYWRlciwgJHBhdGNoX2xpbmU7CisKKwkJIyBleHRlbmRlZCBkaWZmIGhlYWRlcgorCUVYVEVOREVEX0hFQURFUjoKKwkJd2hpbGUgKCRwYXRjaF9saW5lID0gPCRmZD4pIHsKKwkJCWNob21wICRwYXRjaF9saW5lOworCisJCQlsYXN0IEVYVEVOREVEX0hFQURFUiBpZiAoJHBhdGNoX2xpbmUgPX4gbS9eLS0tIHxeZGlmZiAvKTsKKworCQkJaWYgKCRwYXRjaF9saW5lID1+IG0vXmluZGV4IChbMC05YS1mQS1GXXs0MH0pLi4oWzAtOWEtZkEtRl17NDB9KS8pIHsKKwkJCQkkZnJvbV9pZCA9ICQxOworCQkJCSR0b19pZCAgID0gJDI7CisJCQl9IGVsc2lmICgkcGF0Y2hfbGluZSA9fiBtL15pbmRleCAoKD86WzAtOWEtZkEtRl17NDB9LCkrWzAtOWEtZkEtRl17NDB9KS4uKFswLTlhLWZBLUZdezQwfSkvKSB7CisJCQkJJGZyb21faWQgPSBbIHNwbGl0KCcsJywgJDEpIF07CisJCQkJJHRvX2lkICAgPSAkMjsKKwkJCX0KKworCQkJcHVzaCBAZGlmZl9oZWFkZXIsICRwYXRjaF9saW5lOworCQl9CisJCW15ICRsYXN0X3BhdGNoX2xpbmUgPSAkcGF0Y2hfbGluZTsKKworCQkjIGNoZWNrIGlmIGN1cnJlbnQgcGF0Y2ggYmVsb25nIHRvIGN1cnJlbnQgcmF3IGxpbmUKKwkJIyBhbmQgcGFyc2UgcmF3IGdpdC1kaWZmIGxpbmUgaWYgbmVlZGVkCisJCWlmIChkZWZpbmVkICRkaWZmaW5mbyAmJgorCQkgICAgZGVmaW5lZCAkZnJvbV9pZCAmJiBkZWZpbmVkICR0b19pZCAmJgorCQkgICAgZnJvbV9pZHNfZXEoJGRpZmZpbmZvLT57J2Zyb21faWQnfSwgJGZyb21faWQpICYmCisJCSAgICAkZGlmZmluZm8tPnsndG9faWQnfSBlcSAkdG9faWQpIHsKKwkJCSMgdGhpcyBpcyBjb250aW51YXRpb24gb2YgYSBzcGxpdCBwYXRjaAorCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYXRjaCBjb250XCI+XG4iOworCQl9IGVsc2UgeworCQkJIyBhZHZhbmNlIHJhdyBnaXQtZGlmZiBvdXRwdXQgaWYgbmVlZGVkCisJCQkkcGF0Y2hfaWR4KysgaWYgZGVmaW5lZCAkZGlmZmluZm87CisKKwkJCSMgcmVhZCBhbmQgcHJlcGFyZSBwYXRjaCBpbmZvcm1hdGlvbgorCQkJaWYgKHJlZigkZGlmZnRyZWUtPlskcGF0Y2hfaWR4XSkgZXEgIkhBU0giKSB7CisJCQkJIyBwcmUtcGFyc2VkIChvciBnZW5lcmF0ZWQgYnkgaGFuZCkKKwkJCQkkZGlmZmluZm8gPSAkZGlmZnRyZWUtPlskcGF0Y2hfaWR4XTsKKwkJCX0gZWxzZSB7CisJCQkJJGRpZmZpbmZvID0gcGFyc2VfZGlmZnRyZWVfcmF3X2xpbmUoJGRpZmZ0cmVlLT5bJHBhdGNoX2lkeF0pOworCQkJfQorCQkJaWYgKCRkaWZmaW5mby0+eyducGFyZW50cyd9KSB7CisJCQkJIyBjb21iaW5lZCBkaWZmCisJCQkJJGZyb217J2ZpbGUnfSA9IFtdOworCQkJCSRmcm9teydocmVmJ30gPSBbXTsKKwkJCQlmaWxsX2Zyb21fZmlsZV9pbmZvKCRkaWZmaW5mbywgQGhhc2hfcGFyZW50cykKKwkJCQkJdW5sZXNzIGV4aXN0cyAkZGlmZmluZm8tPnsnZnJvbV9maWxlJ307CisJCQkJZm9yIChteSAkaSA9IDA7ICRpIDwgJGRpZmZpbmZvLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJCQkJJGZyb217J2ZpbGUnfVskaV0gPSAkZGlmZmluZm8tPnsnZnJvbV9maWxlJ31bJGldIHx8ICRkaWZmaW5mby0+eyd0b19maWxlJ307CisJCQkJCWlmICgkZGlmZmluZm8tPnsnc3RhdHVzJ31bJGldIG5lICJBIikgeyAjIG5vdCBuZXcgKGFkZGVkKSBmaWxlCisJCQkJCQkkZnJvbXsnaHJlZid9WyRpXSA9IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaF9wYXJlbnRzWyRpXSwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZmluZm8tPnsnZnJvbV9pZCd9WyRpXSwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmcm9teydmaWxlJ31bJGldKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRmcm9teydocmVmJ31bJGldID0gdW5kZWY7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSRmcm9teydmaWxlJ30gPSAkZGlmZmluZm8tPnsnZnJvbV9maWxlJ30gfHwgJGRpZmZpbmZvLT57J2ZpbGUnfTsKKwkJCQlpZiAoJGRpZmZpbmZvLT57J3N0YXR1cyd9IG5lICJBIikgeyAjIG5vdCBuZXcgKGFkZGVkKSBmaWxlCisJCQkJCSRmcm9teydocmVmJ30gPSBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoX2Jhc2U9PiRoYXNoX3BhcmVudCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmZpbmZvLT57J2Zyb21faWQnfSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZnJvbXsnZmlsZSd9KTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWxldGUgJGZyb217J2hyZWYnfTsKKwkJCQl9CisJCQl9CisKKwkJCSR0b3snZmlsZSd9ID0gJGRpZmZpbmZvLT57J3RvX2ZpbGUnfSB8fCAkZGlmZmluZm8tPnsnZmlsZSd9OworCQkJaWYgKCRkaWZmaW5mby0+eyd0b19pZCd9IG5lICgnMCcgeCA0MCkpIHsgIyBmaWxlIGV4aXN0cyBpbiByZXN1bHQKKwkJCQkkdG97J2hyZWYnfSA9IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmaW5mby0+eyd0b19pZCd9LAorCQkJCSAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiR0b3snZmlsZSd9KTsKKwkJCX0gZWxzZSB7CisJCQkJZGVsZXRlICR0b3snaHJlZid9OworCQkJfQorCQkJIyB0aGlzIGlzIGZpcnN0IHBhdGNoIGZvciByYXcgZGlmZnRyZWUgbGluZSB3aXRoICRwYXRjaF9pZHggaW5kZXgKKwkJCSMgd2UgaW5kZXggQCRkaWZmdHJlZSBhcnJheSBmcm9tIDAsIGJ1dCBudW1iZXIgcGF0Y2hlcyBmcm9tIDEKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwicGF0Y2hcIiBpZD1cInBhdGNoIi4gKCRwYXRjaF9pZHgrMSkgLiJcIj5cbiI7CisJCX0KKworCQkjIHByaW50ICJnaXQgZGlmZiIgaGVhZGVyCisJCSRwYXRjaF9saW5lID0gc2hpZnQgQGRpZmZfaGVhZGVyOworCQlpZiAoJGRpZmZpbmZvLT57J25wYXJlbnRzJ30pIHsKKworCQkJIyBjb21iaW5lZCBkaWZmCisJCQkkcGF0Y2hfbGluZSA9fiBzIV4oZGlmZiAoLio/KSApIj8uKiQhJDEhOworCQkJaWYgKCR0b3snaHJlZid9KSB7CisJCQkJJHBhdGNoX2xpbmUgLj0gJGNnaS0+YSh7LWhyZWYgPT4gJHRveydocmVmJ30sIC1jbGFzcyA9PiAicGF0aCJ9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJHRveydmaWxlJ30pKTsKKwkJCX0gZWxzZSB7ICMgZmlsZSB3YXMgZGVsZXRlZAorCQkJCSRwYXRjaF9saW5lIC49IGVzY19wYXRoKCR0b3snZmlsZSd9KTsKKwkJCX0KKworCQl9IGVsc2UgeworCisJCQkkcGF0Y2hfbGluZSA9fiBzIV4oZGlmZiAoLio/KSApIj9hLy4qJCEkMSE7CisJCQlpZiAoJGZyb217J2hyZWYnfSkgeworCQkJCSRwYXRjaF9saW5lIC49ICRjZ2ktPmEoey1ocmVmID0+ICRmcm9teydocmVmJ30sIC1jbGFzcyA9PiAicGF0aCJ9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgJ2EvJyAuIGVzY19wYXRoKCRmcm9teydmaWxlJ30pKTsKKwkJCX0gZWxzZSB7ICMgZmlsZSB3YXMgYWRkZWQKKwkJCQkkcGF0Y2hfbGluZSAuPSAnYS8nIC4gZXNjX3BhdGgoJGZyb217J2ZpbGUnfSk7CisJCQl9CisJCQkkcGF0Y2hfbGluZSAuPSAnICc7CisJCQlpZiAoJHRveydocmVmJ30pIHsKKwkJCQkkcGF0Y2hfbGluZSAuPSAkY2dpLT5hKHstaHJlZiA9PiAkdG97J2hyZWYnfSwgLWNsYXNzID0+ICJwYXRoIn0sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAnYi8nIC4gZXNjX3BhdGgoJHRveydmaWxlJ30pKTsKKwkJCX0gZWxzZSB7ICMgZmlsZSB3YXMgZGVsZXRlZAorCQkJCSRwYXRjaF9saW5lIC49ICdiLycgLiBlc2NfcGF0aCgkdG97J2ZpbGUnfSk7CisJCQl9CisKKwkJfQorCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgaGVhZGVyXCI+JHBhdGNoX2xpbmU8L2Rpdj5cbiI7CisKKwkJIyBwcmludCBleHRlbmRlZCBkaWZmIGhlYWRlcgorCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgZXh0ZW5kZWRfaGVhZGVyXCI+XG4iIGlmIChAZGlmZl9oZWFkZXIgPiAwKTsKKwlFWFRFTkRFRF9IRUFERVI6CisJCWZvcmVhY2ggJHBhdGNoX2xpbmUgKEBkaWZmX2hlYWRlcikgeworCQkJIyBtYXRjaCA8cGF0aD4KKwkJCWlmICgkcGF0Y2hfbGluZSA9fiBzIV4oKGNvcHl8cmVuYW1lKSBmcm9tICkuKiQhJDEhICYmICRmcm9teydocmVmJ30pIHsKKwkJCQkkcGF0Y2hfbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+JGZyb217J2hyZWYnfSwgLWNsYXNzPT4icGF0aCJ9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJGZyb217J2ZpbGUnfSkpOworCQkJfQorCQkJaWYgKCRwYXRjaF9saW5lID1+IHMhXigoY29weXxyZW5hbWUpIHRvICkuKiQhJDEhICYmICR0b3snaHJlZid9KSB7CisJCQkJJHBhdGNoX2xpbmUgLj0gJGNnaS0+YSh7LWhyZWY9PiR0b3snaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBlc2NfcGF0aCgkdG97J2ZpbGUnfSkpOworCQkJfQorCQkJIyBtYXRjaCBzaW5nbGUgPG1vZGU+CisJCQlpZiAoJHBhdGNoX2xpbmUgPX4gbS9ccyhcZHs2fSkkLykgeworCQkJCSRwYXRjaF9saW5lIC49ICc8c3BhbiBjbGFzcz0iaW5mbyI+ICgnIC4KKwkJCQkgICAgICAgICAgICAgICBmaWxlX3R5cGVfbG9uZygkMSkgLgorCQkJCSAgICAgICAgICAgICAgICcpPC9zcGFuPic7CisJCQl9CisJCQkjIG1hdGNoIDxoYXNoPgorCQkJaWYgKCRwYXRjaF9saW5lID1+IG0vXmluZGV4IFswLTlhLWZBLUZdezQwfSxbMC05YS1mQS1GXXs0MH0vKSB7CisJCQkJIyBjYW4gbWF0Y2ggb25seSBmb3IgY29tYmluZWQgZGlmZgorCQkJCSRwYXRjaF9saW5lID0gJ2luZGV4ICc7CisJCQkJZm9yIChteSAkaSA9IDA7ICRpIDwgJGRpZmZpbmZvLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJCQkJaWYgKCRmcm9teydocmVmJ31bJGldKSB7CisJCQkJCQkkcGF0Y2hfbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+JGZyb217J2hyZWYnfVskaV0sCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAtY2xhc3M9PiJoYXNoIn0sCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZGlmZmluZm8tPnsnZnJvbV9pZCd9WyRpXSwwLDcpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRwYXRjaF9saW5lIC49ICcwJyB4IDc7CisJCQkJCX0KKwkJCQkJIyBzZXBhcmF0b3IKKwkJCQkJJHBhdGNoX2xpbmUgLj0gJywnIGlmICgkaSA8ICRkaWZmaW5mby0+eyducGFyZW50cyd9IC0gMSk7CisJCQkJfQorCQkJCSRwYXRjaF9saW5lIC49ICcuLic7CisJCQkJaWYgKCR0b3snaHJlZid9KSB7CisJCQkJCSRwYXRjaF9saW5lIC49ICRjZ2ktPmEoey1ocmVmPT4kdG97J2hyZWYnfSwgLWNsYXNzPT4iaGFzaCJ9LAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZGlmZmluZm8tPnsndG9faWQnfSwwLDcpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkkcGF0Y2hfbGluZSAuPSAnMCcgeCA3OworCQkJCX0KKworCQkJfSBlbHNpZiAoJHBhdGNoX2xpbmUgPX4gbS9eaW5kZXggWzAtOWEtZkEtRl17NDB9Li5bMC05YS1mQS1GXXs0MH0vKSB7CisJCQkJIyBjYW4gbWF0Y2ggb25seSBmb3Igb3JkaW5hcnkgZGlmZgorCQkJCW15ICgkZnJvbV9saW5rLCAkdG9fbGluayk7CisJCQkJaWYgKCRmcm9teydocmVmJ30pIHsKKwkJCQkJJGZyb21fbGluayA9ICRjZ2ktPmEoey1ocmVmPT4kZnJvbXsnaHJlZid9LCAtY2xhc3M9PiJoYXNoIn0sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZGlmZmluZm8tPnsnZnJvbV9pZCd9LDAsNykpOworCQkJCX0gZWxzZSB7CisJCQkJCSRmcm9tX2xpbmsgPSAnMCcgeCA3OworCQkJCX0KKwkJCQlpZiAoJHRveydocmVmJ30pIHsKKwkJCQkJJHRvX2xpbmsgPSAkY2dpLT5hKHstaHJlZj0+JHRveydocmVmJ30sIC1jbGFzcz0+Imhhc2gifSwKKwkJCQkJICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZGlmZmluZm8tPnsndG9faWQnfSwwLDcpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkkdG9fbGluayA9ICcwJyB4IDc7CisJCQkJfQorCQkJCSNhZmZpcm0geworCQkJCSMJbXkgKCRmcm9tX2hhc2gsICR0b19oYXNoKSA9CisJCQkJIwkJKCRwYXRjaF9saW5lID1+IG0vXmluZGV4IChbMC05YS1mQS1GXXs0MH0pLi4oWzAtOWEtZkEtRl17NDB9KS8pOworCQkJCSMJbXkgKCRmcm9tX2lkLCAkdG9faWQpID0KKwkJCQkjCQkoJGRpZmZpbmZvLT57J2Zyb21faWQnfSwgJGRpZmZpbmZvLT57J3RvX2lkJ30pOworCQkJCSMJKCRmcm9tX2hhc2ggZXEgJGZyb21faWQpICYmICgkdG9faGFzaCBlcSAkdG9faWQpOworCQkJCSN9IGlmIERFQlVHOworCQkJCW15ICgkZnJvbV9pZCwgJHRvX2lkKSA9ICgkZGlmZmluZm8tPnsnZnJvbV9pZCd9LCAkZGlmZmluZm8tPnsndG9faWQnfSk7CisJCQkJJHBhdGNoX2xpbmUgPX4gcyEkZnJvbV9pZFwuXC4kdG9faWQhJGZyb21fbGluay4uJHRvX2xpbmshOworCQkJfQorCQkJcHJpbnQgJHBhdGNoX2xpbmUgLiAiPGJyLz5cbiI7CisJCX0KKwkJcHJpbnQgIjwvZGl2PlxuIiAgaWYgKEBkaWZmX2hlYWRlciA+IDApOyAjIGNsYXNzPSJkaWZmIGV4dGVuZGVkX2hlYWRlciIKKworCQkjIGZyb20tZmlsZS90by1maWxlIGRpZmYgaGVhZGVyCisJCSRwYXRjaF9saW5lID0gJGxhc3RfcGF0Y2hfbGluZTsKKwkJaWYgKCEgJHBhdGNoX2xpbmUpIHsKKwkJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9InBhdGNoIgorCQkJbGFzdCBQQVRDSDsKKwkJfQorCQluZXh0IFBBVENIIGlmICgkcGF0Y2hfbGluZSA9fiBtL15kaWZmIC8pOworCQkjYXNzZXJ0KCRwYXRjaF9saW5lID1+IG0vXi0tLS8pIGlmIERFQlVHOworCQlpZiAoISRkaWZmaW5mby0+eyducGFyZW50cyd9ICYmICMgbm90IGZyb20tZmlsZSBsaW5lIGZvciBjb21iaW5lZCBkaWZmCisJCSAgICAkZnJvbXsnaHJlZid9ICYmICRwYXRjaF9saW5lID1+IG0hXi0tLSAiP2EvISkgeworCQkJJHBhdGNoX2xpbmUgPSAnLS0tIGEvJyAuCisJCQkgICAgICAgICAgICAgICRjZ2ktPmEoey1ocmVmPT4kZnJvbXsnaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCQkgICAgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJGZyb217J2ZpbGUnfSkpOworCQl9CisJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiBmcm9tX2ZpbGVcIj4kcGF0Y2hfbGluZTwvZGl2PlxuIjsKKworCQkkcGF0Y2hfbGluZSA9IDwkZmQ+OworCQljaG9tcCAkcGF0Y2hfbGluZTsKKworCQkjYXNzZXJ0KCRwYXRjaF9saW5lID1+IG0vXisrKy8pIGlmIERFQlVHOworCQlpZiAoJHRveydocmVmJ30gJiYgJHBhdGNoX2xpbmUgPX4gbSFeXCtcK1wrICI/Yi8hKSB7CisJCQkkcGF0Y2hfbGluZSA9ICcrKysgYi8nIC4KKwkJCSAgICAgICAgICAgICAgJGNnaS0+YSh7LWhyZWY9PiR0b3snaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCQkgICAgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJHRveydmaWxlJ30pKTsKKwkJfQorCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgdG9fZmlsZVwiPiRwYXRjaF9saW5lPC9kaXY+XG4iOworCisJCSMgdGhlIHBhdGNoIGl0c2VsZgorCUxJTkU6CisJCXdoaWxlICgkcGF0Y2hfbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkcGF0Y2hfbGluZTsKKworCQkJbmV4dCBQQVRDSCBpZiAoJHBhdGNoX2xpbmUgPX4gbS9eZGlmZiAvKTsKKworCQkJcHJpbnQgZm9ybWF0X2RpZmZfbGluZSgkcGF0Y2hfbGluZSwgXCVmcm9tLCBcJXRvKTsKKwkJfQorCisJfSBjb250aW51ZSB7CisJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9InBhdGNoIgorCX0KKworCWlmICgkcGF0Y2hfbnVtYmVyID09IDApIHsKKwkJaWYgKEBoYXNoX3BhcmVudHMgPiAxKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgbm9kaWZmZXJlbmNlc1wiPlRyaXZpYWwgbWVyZ2U8L2Rpdj5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgbm9kaWZmZXJlbmNlc1wiPk5vIGRpZmZlcmVuY2VzIGZvdW5kPC9kaXY+XG4iOworCQl9CisJfQorCisJcHJpbnQgIjwvZGl2PlxuIjsgIyBjbGFzcz0icGF0Y2hzZXQiCit9CisKKyMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4KKworc3ViIGdpdF9wcm9qZWN0X2xpc3RfYm9keSB7CisJbXkgKCRwcm9qbGlzdCwgJG9yZGVyLCAkZnJvbSwgJHRvLCAkZXh0cmEsICRub19oZWFkZXIpID0gQF87CisKKwlteSAoJGNoZWNrX2ZvcmtzKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdmb3JrcycpOworCisJbXkgQHByb2plY3RzOworCWZvcmVhY2ggbXkgJHByIChAJHByb2psaXN0KSB7CisJCW15IChAYWEpID0gZ2l0X2dldF9sYXN0X2FjdGl2aXR5KCRwci0+eydwYXRoJ30pOworCQl1bmxlc3MgKEBhYSkgeworCQkJbmV4dDsKKwkJfQorCQkoJHByLT57J2FnZSd9LCAkcHItPnsnYWdlX3N0cmluZyd9KSA9IEBhYTsKKwkJaWYgKCFkZWZpbmVkICRwci0+eydkZXNjcid9KSB7CisJCQlteSAkZGVzY3IgPSBnaXRfZ2V0X3Byb2plY3RfZGVzY3JpcHRpb24oJHByLT57J3BhdGgnfSkgfHwgIiI7CisJCQkkcHItPnsnZGVzY3JfbG9uZyd9ID0gZGVjb2RlX3V0ZjgoJGRlc2NyKTsKKwkJCSRwci0+eydkZXNjcid9ID0gY2hvcF9zdHIoJGRlc2NyLCAyNSwgNSk7CisJCX0KKwkJaWYgKCFkZWZpbmVkICRwci0+eydvd25lcid9KSB7CisJCQkkcHItPnsnb3duZXInfSA9IGdldF9maWxlX293bmVyKCIkcHJvamVjdHJvb3QvJHByLT57J3BhdGgnfSIpIHx8ICIiOworCQl9CisJCWlmICgkY2hlY2tfZm9ya3MpIHsKKwkJCW15ICRwbmFtZSA9ICRwci0+eydwYXRoJ307CisJCQlpZiAoKCRwbmFtZSA9fiBzL1wuZ2l0JC8vKSAmJgorCQkJICAgICgkcG5hbWUgIX4gL1wvJC8pICYmCisJCQkgICAgKC1kICIkcHJvamVjdHJvb3QvJHBuYW1lIikpIHsKKwkJCQkkcHItPnsnZm9ya3MnfSA9ICItZCAkcHJvamVjdHJvb3QvJHBuYW1lIjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSRwci0+eydmb3Jrcyd9ID0gMDsKKwkJCX0KKwkJfQorCQlwdXNoIEBwcm9qZWN0cywgJHByOworCX0KKworCSRvcmRlciB8fD0gJGRlZmF1bHRfcHJvamVjdHNfb3JkZXI7CisJJGZyb20gPSAwIHVubGVzcyBkZWZpbmVkICRmcm9tOworCSR0byA9ICQjcHJvamVjdHMgaWYgKCFkZWZpbmVkICR0byB8fCAkI3Byb2plY3RzIDwgJHRvKTsKKworCXByaW50ICI8dGFibGUgY2xhc3M9XCJwcm9qZWN0X2xpc3RcIj5cbiI7CisJdW5sZXNzICgkbm9faGVhZGVyKSB7CisJCXByaW50ICI8dHI+XG4iOworCQlpZiAoJGNoZWNrX2ZvcmtzKSB7CisJCQlwcmludCAiPHRoPjwvdGg+XG4iOworCQl9CisJCWlmICgkb3JkZXIgZXEgInByb2plY3QiKSB7CisJCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydwYXRoJ30gY21wICRiLT57J3BhdGgnfX0gQHByb2plY3RzOworCQkJcHJpbnQgIjx0aD5Qcm9qZWN0PC90aD5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRoPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT51bmRlZiwgb3JkZXI9Pidwcm9qZWN0JyksCisJCQkgICAgICAgICAgICAgICAtY2xhc3MgPT4gImhlYWRlciJ9LCAiUHJvamVjdCIpIC4KKwkJCSAgICAgICI8L3RoPlxuIjsKKwkJfQorCQlpZiAoJG9yZGVyIGVxICJkZXNjciIpIHsKKwkJCUBwcm9qZWN0cyA9IHNvcnQgeyRhLT57J2Rlc2NyJ30gY21wICRiLT57J2Rlc2NyJ319IEBwcm9qZWN0czsKKwkJCXByaW50ICI8dGg+RGVzY3JpcHRpb248L3RoPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dGg+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBvcmRlcj0+J2Rlc2NyJyksCisJCQkgICAgICAgICAgICAgICAtY2xhc3MgPT4gImhlYWRlciJ9LCAiRGVzY3JpcHRpb24iKSAuCisJCQkgICAgICAiPC90aD5cbiI7CisJCX0KKwkJaWYgKCRvcmRlciBlcSAib3duZXIiKSB7CisJCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydvd25lcid9IGNtcCAkYi0+eydvd25lcid9fSBAcHJvamVjdHM7CisJCQlwcmludCAiPHRoPk93bmVyPC90aD5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRoPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT51bmRlZiwgb3JkZXI9Pidvd25lcicpLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJoZWFkZXIifSwgIk93bmVyIikgLgorCQkJICAgICAgIjwvdGg+XG4iOworCQl9CisJCWlmICgkb3JkZXIgZXEgImFnZSIpIHsKKwkJCUBwcm9qZWN0cyA9IHNvcnQgeyRhLT57J2FnZSd9IDw9PiAkYi0+eydhZ2UnfX0gQHByb2plY3RzOworCQkJcHJpbnQgIjx0aD5MYXN0IENoYW5nZTwvdGg+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0aD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+dW5kZWYsIG9yZGVyPT4nYWdlJyksCisJCQkgICAgICAgICAgICAgICAtY2xhc3MgPT4gImhlYWRlciJ9LCAiTGFzdCBDaGFuZ2UiKSAuCisJCQkgICAgICAiPC90aD5cbiI7CisJCX0KKwkJcHJpbnQgIjx0aD48L3RoPlxuIiAuCisJCSAgICAgICI8L3RyPlxuIjsKKwl9CisJbXkgJGFsdGVybmF0ZSA9IDE7CisJZm9yIChteSAkaSA9ICRmcm9tOyAkaSA8PSAkdG87ICRpKyspIHsKKwkJbXkgJHByID0gJHByb2plY3RzWyRpXTsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJaWYgKCRjaGVja19mb3JrcykgeworCQkJcHJpbnQgIjx0ZD4iOworCQkJaWYgKCRwci0+eydmb3Jrcyd9KSB7CisJCQkJcHJpbnQgIjwhLS0gJHByLT57J2ZvcmtzJ30gLS0+XG4iOworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4iZm9ya3MiKX0sICIrIik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjx0ZD4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT4kcHItPnsncGF0aCd9LCBhY3Rpb249PiJzdW1tYXJ5IiksCisJCSAgICAgICAgICAgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkcHItPnsncGF0aCd9KSkgLiAiPC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+InN1bW1hcnkiKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IiwgLXRpdGxlID0+ICRwci0+eydkZXNjcl9sb25nJ319LAorCQkgICAgICAgICAgICAgICAgICAgICAgICBlc2NfaHRtbCgkcHItPnsnZGVzY3InfSkpIC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD48aT4iIC4gY2hvcF9zdHIoJHByLT57J293bmVyJ30sIDE1KSAuICI8L2k+PC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCIiLiBhZ2VfY2xhc3MoJHByLT57J2FnZSd9KSAuICJcIj4iIC4KKwkJICAgICAgKGRlZmluZWQgJHByLT57J2FnZV9zdHJpbmcnfSA/ICRwci0+eydhZ2Vfc3RyaW5nJ30gOiAiTm8gY29tbWl0cyIpIC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT4kcHItPnsncGF0aCd9LCBhY3Rpb249PiJzdW1tYXJ5Iil9LCAic3VtbWFyeSIpICAgLiAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4ic2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+ImxvZyIpfSwgImxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+InRyZWUiKX0sICJ0cmVlIikgLgorCQkgICAgICAoJHByLT57J2ZvcmtzJ30gPyAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4iZm9ya3MiKX0sICJmb3JrcyIpIDogJycpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiI7CisJCWlmICgkY2hlY2tfZm9ya3MpIHsKKwkJCXByaW50ICI8dGQ+PC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjx0ZCBjb2xzcGFuPVwiNVwiPiRleHRyYTwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7Cit9CisKK3N1YiBnaXRfc2hvcnRsb2dfYm9keSB7CisJIyB1c2VzIGdsb2JhbCB2YXJpYWJsZSAkcHJvamVjdAorCW15ICgkY29tbWl0bGlzdCwgJGZyb20sICR0bywgJHJlZnMsICRleHRyYSkgPSBAXzsKKworCW15ICRoYXZlX3NuYXBzaG90ID0gZ2l0d2ViX2hhdmVfc25hcHNob3QoKTsKKworCSRmcm9tID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbTsKKwkkdG8gPSAkI3skY29tbWl0bGlzdH0gaWYgKCFkZWZpbmVkICR0byB8fCAkI3skY29tbWl0bGlzdH0gPCAkdG8pOworCisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cInNob3J0bG9nXCIgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICVjbyA9ICV7JGNvbW1pdGxpc3QtPlskaV19OworCQlteSAkY29tbWl0ID0gJGNveydpZCd9OworCQlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb21taXQpOworCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCX0KKwkJJGFsdGVybmF0ZSBePSAxOworCQkjIGdpdF9zdW1tYXJ5KCkgdXNlZCBwcmludCAiPHRkPjxpPiRjb3snYWdlX3N0cmluZyd9PC9pPjwvdGQ+XG4iIC4KKwkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD4iOworCQlwcmludCBmb3JtYXRfc3ViamVjdF9odG1sKCRjb3sndGl0bGUnfSwgJGNveyd0aXRsZV9zaG9ydCd9LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYoYWN0aW9uPT4iY29tbWl0IiwgaGFzaD0+JGNvbW1pdCksICRyZWYpOworCQlwcmludCAiPC90ZD5cbiIgLgorCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb21taXQpfSwgImNvbW1pdCIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdGRpZmYiLCBoYXNoPT4kY29tbWl0KX0sICJjb21taXRkaWZmIikgLiAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiRjb21taXQsIGhhc2hfYmFzZT0+JGNvbW1pdCl9LCAidHJlZSIpOworCQlpZiAoJGhhdmVfc25hcHNob3QpIHsKKwkJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzbmFwc2hvdCIsIGhhc2g9PiRjb21taXQpfSwgInNuYXBzaG90Iik7CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkIGNvbHNwYW49XCI0XCI+JGV4dHJhPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworc3ViIGdpdF9oaXN0b3J5X2JvZHkgeworCSMgV2FybmluZzogYXNzdW1lcyBjb25zdGFudCB0eXBlIChibG9iIG9yIHRyZWUpIGR1cmluZyBoaXN0b3J5CisJbXkgKCRjb21taXRsaXN0LCAkZnJvbSwgJHRvLCAkcmVmcywgJGhhc2hfYmFzZSwgJGZ0eXBlLCAkZXh0cmEpID0gQF87CisKKwkkZnJvbSA9IDAgdW5sZXNzIGRlZmluZWQgJGZyb207CisJJHRvID0gJCN7JGNvbW1pdGxpc3R9IHVubGVzcyAoZGVmaW5lZCAkdG8gJiYgJHRvIDw9ICQjeyRjb21taXRsaXN0fSk7CisKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwiaGlzdG9yeVwiIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwlmb3IgKG15ICRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeworCQlteSAlY28gPSAleyRjb21taXRsaXN0LT5bJGldfTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKwkJbXkgJGNvbW1pdCA9ICRjb3snaWQnfTsKKworCQlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb21taXQpOworCisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCXByaW50ICI8dGQgdGl0bGU9XCIkY297J2FnZV9zdHJpbmdfYWdlJ31cIj48aT4kY297J2FnZV9zdHJpbmdfZGF0ZSd9PC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIyBzaG9ydGxvZyB1c2VzICAgICAgY2hvcF9zdHIoJGNveydhdXRob3JfbmFtZSd9LCAxMCkKKwkJICAgICAgIjx0ZD48aT4iIC4gZXNjX2h0bWwoY2hvcF9zdHIoJGNveydhdXRob3JfbmFtZSd9LCAxNSwgMykpIC4gIjwvaT48L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+IjsKKwkJIyBvcmlnaW5hbGx5IGdpdF9oaXN0b3J5IHVzZWQgY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkKKwkJcHJpbnQgZm9ybWF0X3N1YmplY3RfaHRtbCgkY297J3RpdGxlJ30sICRjb3sndGl0bGVfc2hvcnQnfSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb21taXQpLCAkcmVmKTsKKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiRmdHlwZSwgaGFzaF9iYXNlPT4kY29tbWl0LCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwgJGZ0eXBlKSAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGNvbW1pdCl9LCAiY29tbWl0ZGlmZiIpOworCisJCWlmICgkZnR5cGUgZXEgJ2Jsb2InKSB7CisJCQlteSAkYmxvYl9jdXJyZW50ID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSk7CisJCQlteSAkYmxvYl9wYXJlbnQgID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGNvbW1pdCwgJGZpbGVfbmFtZSk7CisJCQlpZiAoZGVmaW5lZCAkYmxvYl9jdXJyZW50ICYmIGRlZmluZWQgJGJsb2JfcGFyZW50ICYmCisJCQkJCSRibG9iX2N1cnJlbnQgbmUgJGJsb2JfcGFyZW50KSB7CisJCQkJcHJpbnQgIiB8ICIgLgorCQkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JkaWZmIiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kYmxvYl9jdXJyZW50LCBoYXNoX3BhcmVudD0+JGJsb2JfcGFyZW50LAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgaGFzaF9wYXJlbnRfYmFzZT0+JGNvbW1pdCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJCQkJICAgICAgICAiZGlmZiB0byBjdXJyZW50Iik7CisJCQl9CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkIGNvbHNwYW49XCI0XCI+JGV4dHJhPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworc3ViIGdpdF90YWdzX2JvZHkgeworCSMgdXNlcyBnbG9iYWwgdmFyaWFibGUgJHByb2plY3QKKwlteSAoJHRhZ2xpc3QsICRmcm9tLCAkdG8sICRleHRyYSkgPSBAXzsKKwkkZnJvbSA9IDAgdW5sZXNzIGRlZmluZWQgJGZyb207CisJJHRvID0gJCN7JHRhZ2xpc3R9IGlmICghZGVmaW5lZCAkdG8gfHwgJCN7JHRhZ2xpc3R9IDwgJHRvKTsKKworCXByaW50ICI8dGFibGUgY2xhc3M9XCJ0YWdzXCIgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICRlbnRyeSA9ICR0YWdsaXN0LT5bJGldOworCQlteSAldGFnID0gJSRlbnRyeTsKKwkJbXkgJGNvbW1lbnQgPSAkdGFneydzdWJqZWN0J307CisJCW15ICRjb21tZW50X3Nob3J0OworCQlpZiAoZGVmaW5lZCAkY29tbWVudCkgeworCQkJJGNvbW1lbnRfc2hvcnQgPSBjaG9wX3N0cigkY29tbWVudCwgMzAsIDUpOworCQl9CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmIChkZWZpbmVkICR0YWd7J2FnZSd9KSB7CisJCQlwcmludCAiPHRkPjxpPiR0YWd7J2FnZSd9PC9pPjwvdGQ+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ZD48L3RkPlxuIjsKKwkJfQorCQlwcmludCAiPHRkPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+JHRhZ3sncmVmdHlwZSd9LCBoYXNoPT4kdGFneydyZWZpZCd9KSwKKwkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IG5hbWUifSwgZXNjX2h0bWwoJHRhZ3snbmFtZSd9KSkgLgorCQkgICAgICAiPC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiI7CisJCWlmIChkZWZpbmVkICRjb21tZW50KSB7CisJCQlwcmludCBmb3JtYXRfc3ViamVjdF9odG1sKCRjb21tZW50LCAkY29tbWVudF9zaG9ydCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZihhY3Rpb249PiJ0YWciLCBoYXNoPT4kdGFneydpZCd9KSk7CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cInNlbGZsaW5rXCI+IjsKKwkJaWYgKCR0YWd7J3R5cGUnfSBlcSAidGFnIikgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0YWciLCBoYXNoPT4kdGFneydpZCd9KX0sICJ0YWciKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICImbmJzcDsiOworCQl9CisJCXByaW50ICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiR0YWd7J3JlZnR5cGUnfSwgaGFzaD0+JHRhZ3sncmVmaWQnfSl9LCAkdGFneydyZWZ0eXBlJ30pOworCQlpZiAoJHRhZ3sncmVmdHlwZSd9IGVxICJjb21taXQiKSB7CisJCQlwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kdGFneyduYW1lJ30pfSwgInNob3J0bG9nIikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImxvZyIsIGhhc2g9PiR0YWd7J25hbWUnfSl9LCAibG9nIik7CisJCX0gZWxzaWYgKCR0YWd7J3JlZnR5cGUnfSBlcSAiYmxvYiIpIHsKKwkJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwgaGFzaD0+JHRhZ3sncmVmaWQnfSl9LCAicmF3Iik7CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+IjsKKwl9CisJaWYgKGRlZmluZWQgJGV4dHJhKSB7CisJCXByaW50ICI8dHI+XG4iIC4KKwkJICAgICAgIjx0ZCBjb2xzcGFuPVwiNVwiPiRleHRyYTwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7Cit9CisKK3N1YiBnaXRfaGVhZHNfYm9keSB7CisJIyB1c2VzIGdsb2JhbCB2YXJpYWJsZSAkcHJvamVjdAorCW15ICgkaGVhZGxpc3QsICRoZWFkLCAkZnJvbSwgJHRvLCAkZXh0cmEpID0gQF87CisJJGZyb20gPSAwIHVubGVzcyBkZWZpbmVkICRmcm9tOworCSR0byA9ICQjeyRoZWFkbGlzdH0gaWYgKCFkZWZpbmVkICR0byB8fCAkI3skaGVhZGxpc3R9IDwgJHRvKTsKKworCXByaW50ICI8dGFibGUgY2xhc3M9XCJoZWFkc1wiIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwlmb3IgKG15ICRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeworCQlteSAkZW50cnkgPSAkaGVhZGxpc3QtPlskaV07CisJCW15ICVyZWYgPSAlJGVudHJ5OworCQlteSAkY3VyciA9ICRyZWZ7J2lkJ30gZXEgJGhlYWQ7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCXByaW50ICI8dGQ+PGk+JHJlZnsnYWdlJ308L2k+PC90ZD5cbiIgLgorCQkgICAgICAoJGN1cnIgPyAiPHRkIGNsYXNzPVwiY3VycmVudF9oZWFkXCI+IiA6ICI8dGQ+IikgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNob3J0bG9nIiwgaGFzaD0+JHJlZnsnbmFtZSd9KSwKKwkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IG5hbWUifSxlc2NfaHRtbCgkcmVmeyduYW1lJ30pKSAuCisJCSAgICAgICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kcmVmeyduYW1lJ30pfSwgInNob3J0bG9nIikgLiAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ibG9nIiwgaGFzaD0+JHJlZnsnbmFtZSd9KX0sICJsb2ciKSAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JHJlZnsnbmFtZSd9LCBoYXNoX2Jhc2U9PiRyZWZ7J25hbWUnfSl9LCAidHJlZSIpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+IjsKKwl9CisJaWYgKGRlZmluZWQgJGV4dHJhKSB7CisJCXByaW50ICI8dHI+XG4iIC4KKwkJICAgICAgIjx0ZCBjb2xzcGFuPVwiM1wiPiRleHRyYTwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7Cit9CisKK3N1YiBnaXRfc2VhcmNoX2dyZXBfYm9keSB7CisJbXkgKCRjb21taXRsaXN0LCAkZnJvbSwgJHRvLCAkZXh0cmEpID0gQF87CisJJGZyb20gPSAwIHVubGVzcyBkZWZpbmVkICRmcm9tOworCSR0byA9ICQjeyRjb21taXRsaXN0fSBpZiAoIWRlZmluZWQgJHRvIHx8ICQjeyRjb21taXRsaXN0fSA8ICR0byk7CisKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwiZ3JlcFwiIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwlmb3IgKG15ICRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeworCQlteSAlY28gPSAleyRjb21taXRsaXN0LT5bJGldfTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKwkJbXkgJGNvbW1pdCA9ICRjb3snaWQnfTsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDE1LCA1KSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kY297J2lkJ30pLCAtY2xhc3MgPT4gImxpc3Qgc3ViamVjdCJ9LAorCQkJICAgICAgIGVzY19odG1sKGNob3Bfc3RyKCRjb3sndGl0bGUnfSwgNTApKSAuICI8YnIvPiIpOworCQlteSAkY29tbWVudCA9ICRjb3snY29tbWVudCd9OworCQlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJCWlmICgkbGluZSA9fiBtL14oLiopKCRzZWFyY2hfcmVnZXhwKSguKikkL2kpIHsKKwkJCQlteSAkbGVhZCA9IGVzY19odG1sKCQxKSB8fCAiIjsKKwkJCQkkbGVhZCA9IGNob3Bfc3RyKCRsZWFkLCAzMCwgMTApOworCQkJCW15ICRtYXRjaCA9IGVzY19odG1sKCQyKSB8fCAiIjsKKwkJCQlteSAkdHJhaWwgPSBlc2NfaHRtbCgkMykgfHwgIiI7CisJCQkJJHRyYWlsID0gY2hvcF9zdHIoJHRyYWlsLCAzMCwgMTApOworCQkJCW15ICR0ZXh0ID0gIiRsZWFkPHNwYW4gY2xhc3M9XCJtYXRjaFwiPiRtYXRjaDwvc3Bhbj4kdHJhaWwiOworCQkJCXByaW50IGNob3Bfc3RyKCR0ZXh0LCA4MCwgNSkgLiAiPGJyLz5cbiI7CisJCQl9CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kY297J2lkJ30pfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kY297J3RyZWUnfSwgaGFzaF9iYXNlPT4kY297J2lkJ30pfSwgInRyZWUiKTsKKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkIGNvbHNwYW49XCIzXCI+JGV4dHJhPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyMgYWN0aW9ucworCitzdWIgZ2l0X3Byb2plY3RfbGlzdCB7CisJbXkgJG9yZGVyID0gJGNnaS0+cGFyYW0oJ28nKTsKKwlpZiAoZGVmaW5lZCAkb3JkZXIgJiYgJG9yZGVyICF+IG0vbm9uZXxwcm9qZWN0fGRlc2NyfG93bmVyfGFnZS8pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBvcmRlciBwYXJhbWV0ZXIiKTsKKwl9CisKKwlteSBAbGlzdCA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgpOworCWlmICghQGxpc3QpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gcHJvamVjdHMgZm91bmQiKTsKKwl9CisKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlpZiAoLWYgJGhvbWVfdGV4dCkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cImluZGV4X2luY2x1ZGVcIj5cbiI7CisJCW9wZW4gKG15ICRmZCwgJGhvbWVfdGV4dCk7CisJCXByaW50IDwkZmQ+OworCQljbG9zZSAkZmQ7CisJCXByaW50ICI8L2Rpdj5cbiI7CisJfQorCWdpdF9wcm9qZWN0X2xpc3RfYm9keShcQGxpc3QsICRvcmRlcik7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfZm9ya3MgeworCW15ICRvcmRlciA9ICRjZ2ktPnBhcmFtKCdvJyk7CisJaWYgKGRlZmluZWQgJG9yZGVyICYmICRvcmRlciAhfiBtL25vbmV8cHJvamVjdHxkZXNjcnxvd25lcnxhZ2UvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gb3JkZXIgcGFyYW1ldGVyIik7CisJfQorCisJbXkgQGxpc3QgPSBnaXRfZ2V0X3Byb2plY3RzX2xpc3QoJHByb2plY3QpOworCWlmICghQGxpc3QpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gZm9ya3MgZm91bmQiKTsKKwl9CisKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdzdW1tYXJ5JywgIiRwcm9qZWN0IGZvcmtzIik7CisJZ2l0X3Byb2plY3RfbGlzdF9ib2R5KFxAbGlzdCwgJG9yZGVyKTsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9wcm9qZWN0X2luZGV4IHsKKwlteSBAcHJvamVjdHMgPSBnaXRfZ2V0X3Byb2plY3RzX2xpc3QoJHByb2plY3QpOworCisJcHJpbnQgJGNnaS0+aGVhZGVyKAorCQktdHlwZSA9PiAndGV4dC9wbGFpbicsCisJCS1jaGFyc2V0ID0+ICd1dGYtOCcsCisJCS1jb250ZW50X2Rpc3Bvc2l0aW9uID0+ICdpbmxpbmU7IGZpbGVuYW1lPSJpbmRleC5hdXgiJyk7CisKKwlmb3JlYWNoIG15ICRwciAoQHByb2plY3RzKSB7CisJCWlmICghZXhpc3RzICRwci0+eydvd25lcid9KSB7CisJCQkkcHItPnsnb3duZXInfSA9IGdldF9maWxlX293bmVyKCIkcHJvamVjdHJvb3QvJHByLT57J3BhdGgnfSIpOworCQl9CisKKwkJbXkgKCRwYXRoLCAkb3duZXIpID0gKCRwci0+eydwYXRoJ30sICRwci0+eydvd25lcid9KTsKKwkJIyBxdW90ZSBhcyBpbiBDR0k6OlV0aWw6OmVuY29kZSwgYnV0IGtlZXAgdGhlIHNsYXNoLCBhbmQgdXNlICcrJyBmb3IgJyAnCisJCSRwYXRoICA9fiBzLyhbXmEtekEtWjAtOV8uXC1cLyBdKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9lZzsKKwkJJG93bmVyID1+IHMvKFteYS16QS1aMC05Xy5cLVwvIF0pL3NwcmludGYoIiUlJTAyWCIsIG9yZCgkMSkpL2VnOworCQkkcGF0aCAgPX4gcy8gL1wrL2c7CisJCSRvd25lciA9fiBzLyAvXCsvZzsKKworCQlwcmludCAiJHBhdGggJG93bmVyXG4iOworCX0KK30KKworc3ViIGdpdF9zdW1tYXJ5IHsKKwlteSAkZGVzY3IgPSBnaXRfZ2V0X3Byb2plY3RfZGVzY3JpcHRpb24oJHByb2plY3QpIHx8ICJub25lIjsKKwlteSAlY28gPSBwYXJzZV9jb21taXQoIkhFQUQiKTsKKwlteSAlY2QgPSAlY28gPyBwYXJzZV9kYXRlKCRjb3snY29tbWl0dGVyX2Vwb2NoJ30sICRjb3snY29tbWl0dGVyX3R6J30pIDogKCk7CisJbXkgJGhlYWQgPSAkY297J2lkJ307CisKKwlteSAkb3duZXIgPSBnaXRfZ2V0X3Byb2plY3Rfb3duZXIoJHByb2plY3QpOworCisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKwkjIFRoZXNlIGdldF8qX2xpc3QgZnVuY3Rpb25zIHJldHVybiBvbmUgbW9yZSB0byBhbGxvdyB1cyB0byBzZWUgaWYKKwkjIHRoZXJlIGFyZSBtb3JlIC4uLgorCW15IEB0YWdsaXN0ICA9IGdpdF9nZXRfdGFnc19saXN0KDE2KTsKKwlteSBAaGVhZGxpc3QgPSBnaXRfZ2V0X2hlYWRzX2xpc3QoMTYpOworCW15IEBmb3JrbGlzdDsKKwlteSAoJGNoZWNrX2ZvcmtzKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdmb3JrcycpOworCisJaWYgKCRjaGVja19mb3JrcykgeworCQlAZm9ya2xpc3QgPSBnaXRfZ2V0X3Byb2plY3RzX2xpc3QoJHByb2plY3QpOworCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignc3VtbWFyeScsJycsICRoZWFkKTsKKworCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4mbmJzcDs8L2Rpdj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiIgLgorCSAgICAgICI8dHI+PHRkPmRlc2NyaXB0aW9uPC90ZD48dGQ+IiAuIGVzY19odG1sKCRkZXNjcikgLiAiPC90ZD48L3RyPlxuIiAuCisJICAgICAgIjx0cj48dGQ+b3duZXI8L3RkPjx0ZD4kb3duZXI8L3RkPjwvdHI+XG4iOworCWlmIChkZWZpbmVkICRjZHsncmZjMjgyMid9KSB7CisJCXByaW50ICI8dHI+PHRkPmxhc3QgY2hhbmdlPC90ZD48dGQ+JGNkeydyZmMyODIyJ308L3RkPjwvdHI+XG4iOworCX0KKworCSMgdXNlIHBlciBwcm9qZWN0IGdpdCBVUkwgbGlzdCBpbiAkcHJvamVjdHJvb3QvJHByb2plY3QvY2xvbmV1cmwKKwkjIG9yIG1ha2UgcHJvamVjdCBnaXQgVVJMIGZyb20gZ2l0IGJhc2UgVVJMIGFuZCBwcm9qZWN0IG5hbWUKKwlteSAkdXJsX3RhZyA9ICJVUkwiOworCW15IEB1cmxfbGlzdCA9IGdpdF9nZXRfcHJvamVjdF91cmxfbGlzdCgkcHJvamVjdCk7CisJQHVybF9saXN0ID0gbWFwIHsgIiRfLyRwcm9qZWN0IiB9IEBnaXRfYmFzZV91cmxfbGlzdCB1bmxlc3MgQHVybF9saXN0OworCWZvcmVhY2ggbXkgJGdpdF91cmwgKEB1cmxfbGlzdCkgeworCQluZXh0IHVubGVzcyAkZ2l0X3VybDsKKwkJcHJpbnQgIjx0cj48dGQ+JHVybF90YWc8L3RkPjx0ZD4kZ2l0X3VybDwvdGQ+PC90cj5cbiI7CisJCSR1cmxfdGFnID0gIiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKKworCWlmICgtcyAiJHByb2plY3Ryb290LyRwcm9qZWN0L1JFQURNRS5odG1sIikgeworCQlpZiAob3BlbiBteSAkZmQsICIkcHJvamVjdHJvb3QvJHByb2plY3QvUkVBRE1FLmh0bWwiKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlXCI+cmVhZG1lPC9kaXY+XG4iOworCQkJcHJpbnQgJF8gd2hpbGUgKDwkZmQ+KTsKKwkJCWNsb3NlICRmZDsKKwkJfQorCX0KKworCSMgd2UgbmVlZCB0byByZXF1ZXN0IG9uZSBtb3JlIHRoYW4gMTYgKDAuLjE1KSB0byBjaGVjayBpZgorCSMgdGhvc2UgMTYgYXJlIGFsbAorCW15IEBjb21taXRsaXN0ID0gJGhlYWQgPyBwYXJzZV9jb21taXRzKCRoZWFkLCAxNykgOiAoKTsKKwlpZiAoQGNvbW1pdGxpc3QpIHsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3Nob3J0bG9nJyk7CisJCWdpdF9zaG9ydGxvZ19ib2R5KFxAY29tbWl0bGlzdCwgMCwgMTUsICRyZWZzLAorCQkgICAgICAgICAgICAgICAgICAkI2NvbW1pdGxpc3QgPD0gIDE1ID8gdW5kZWYgOgorCQkgICAgICAgICAgICAgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNob3J0bG9nIil9LCAiLi4uIikpOworCX0KKworCWlmIChAdGFnbGlzdCkgeworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdigndGFncycpOworCQlnaXRfdGFnc19ib2R5KFxAdGFnbGlzdCwgMCwgMTUsCisJCSAgICAgICAgICAgICAgJCN0YWdsaXN0IDw9ICAxNSA/IHVuZGVmIDoKKwkJICAgICAgICAgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRhZ3MiKX0sICIuLi4iKSk7CisJfQorCisJaWYgKEBoZWFkbGlzdCkgeworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignaGVhZHMnKTsKKwkJZ2l0X2hlYWRzX2JvZHkoXEBoZWFkbGlzdCwgJGhlYWQsIDAsIDE1LAorCQkgICAgICAgICAgICAgICAkI2hlYWRsaXN0IDw9IDE1ID8gdW5kZWYgOgorCQkgICAgICAgICAgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImhlYWRzIil9LCAiLi4uIikpOworCX0KKworCWlmIChAZm9ya2xpc3QpIHsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2ZvcmtzJyk7CisJCWdpdF9wcm9qZWN0X2xpc3RfYm9keShcQGZvcmtsaXN0LCB1bmRlZiwgMCwgMTUsCisJCSAgICAgICAgICAgICAgICAgICAgICAkI2ZvcmtsaXN0IDw9IDE1ID8gdW5kZWYgOgorCQkgICAgICAgICAgICAgICAgICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJmb3JrcyIpfSwgIi4uLiIpLAorCQkgICAgICAgICAgICAgICAgICAgICAgJ25vaGVhZGVyJyk7CisJfQorCisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfdGFnIHsKKwlteSAkaGVhZCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoZWFkLHVuZGVmLCRoZWFkKTsKKwlteSAldGFnID0gcGFyc2VfdGFnKCRoYXNoKTsKKworCWlmICghICV0YWcpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biB0YWcgb2JqZWN0Iik7CisJfQorCisJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2NvbW1pdCcsIGVzY19odG1sKCR0YWd7J25hbWUnfSksICRoYXNoKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCSAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iIC4KKwkgICAgICAiPHRyPlxuIiAuCisJICAgICAgIjx0ZD5vYmplY3Q8L3RkPlxuIiAuCisJICAgICAgIjx0ZD4iIC4gJGNnaS0+YSh7LWNsYXNzID0+ICJsaXN0IiwgLWhyZWYgPT4gaHJlZihhY3Rpb249PiR0YWd7J3R5cGUnfSwgaGFzaD0+JHRhZ3snb2JqZWN0J30pfSwKKwkgICAgICAgICAgICAgICAgICAgICAgICR0YWd7J29iamVjdCd9KSAuICI8L3RkPlxuIiAuCisJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiR0YWd7J3R5cGUnfSwgaGFzaD0+JHRhZ3snb2JqZWN0J30pfSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YWd7J3R5cGUnfSkgLiAiPC90ZD5cbiIgLgorCSAgICAgICI8L3RyPlxuIjsKKwlpZiAoZGVmaW5lZCgkdGFneydhdXRob3InfSkpIHsKKwkJbXkgJWFkID0gcGFyc2VfZGF0ZSgkdGFneydlcG9jaCd9LCAkdGFneyd0eid9KTsKKwkJcHJpbnQgIjx0cj48dGQ+YXV0aG9yPC90ZD48dGQ+IiAuIGVzY19odG1sKCR0YWd7J2F1dGhvcid9KSAuICI8L3RkPjwvdHI+XG4iOworCQlwcmludCAiPHRyPjx0ZD48L3RkPjx0ZD4iIC4gJGFkeydyZmMyODIyJ30gLgorCQkJc3ByaW50ZigiICglMDJkOiUwMmQgJXMpIiwgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSkgLgorCQkJIjwvdGQ+PC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuXG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+IjsKKwlteSAkY29tbWVudCA9ICR0YWd7J2NvbW1lbnQnfTsKKwlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJY2hvbXAgJGxpbmU7CisJCXByaW50IGVzY19odG1sKCRsaW5lLCAtbmJzcD0+MSkgLiAiPGJyLz5cbiI7CisJfQorCXByaW50ICI8L2Rpdj5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfYmxhbWUyIHsKKwlteSAkZmQ7CisJbXkgJGZ0eXBlOworCisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCWlmICghJGhhdmVfYmxhbWUpIHsKKwkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwl9CisJZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIkZpbGUgbmFtZSBub3QgZGVmaW5lZCIpIGlmICghJGZpbGVfbmFtZSk7CisJJGhhc2hfYmFzZSB8fD0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCWRpZV9lcnJvcih1bmRlZiwgIkNvdWxkbid0IGZpbmQgYmFzZSBjb21taXQiKSB1bmxlc3MgKCRoYXNoX2Jhc2UpOworCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGNvbW1pdCBmYWlsZWQiKTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkaGFzaF9iYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpCisJCQlvciBkaWVfZXJyb3IodW5kZWYsICJFcnJvciBsb29raW5nIHVwIGZpbGUiKTsKKwl9CisJJGZ0eXBlID0gZ2l0X2dldF90eXBlKCRoYXNoKTsKKwlpZiAoJGZ0eXBlICF+ICJibG9iIikgeworCQlkaWVfZXJyb3IoJzQwMCBCYWQgUmVxdWVzdCcsICJPYmplY3QgaXMgbm90IGEgYmxvYiIpOworCX0KKwlvcGVuICgkZmQsICItfCIsIGdpdF9jbWQoKSwgImJsYW1lIiwgJy1wJywgJy0tJywKKwkgICAgICAkZmlsZV9uYW1lLCAkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1ibGFtZSBmYWlsZWQiKTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlteSAkZm9ybWF0c19uYXYgPQorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJICAgICAgICAiYmxvYiIpIC4KKwkJIiB8ICIgLgorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJCSJoaXN0b3J5IikgLgorCQkiIHwgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJICAgICAgICAiSEVBRCIpOworCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2hfYmFzZSwkY297J3RyZWUnfSwkaGFzaF9iYXNlLCAkZm9ybWF0c19uYXYpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pLCAkaGFzaF9iYXNlKTsKKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICRmdHlwZSwgJGhhc2hfYmFzZSk7CisJbXkgQHJldl9jb2xvciA9IChxdyhsaWdodDIgZGFyazIpKTsKKwlteSAkbnVtX2NvbG9ycyA9IHNjYWxhcihAcmV2X2NvbG9yKTsKKwlteSAkY3VycmVudF9jb2xvciA9IDA7CisJbXkgJGxhc3RfcmV2OworCXByaW50IDw8SFRNTDsKKzxkaXYgY2xhc3M9InBhZ2VfYm9keSI+Cis8dGFibGUgY2xhc3M9ImJsYW1lIj4KKzx0cj48dGg+Q29tbWl0PC90aD48dGg+TGluZTwvdGg+PHRoPkRhdGE8L3RoPjwvdHI+CitIVE1MCisJbXkgJW1ldGFpbmZvID0gKCk7CisJd2hpbGUgKDEpIHsKKwkJJF8gPSA8JGZkPjsKKwkJbGFzdCB1bmxlc3MgZGVmaW5lZCAkXzsKKwkJbXkgKCRmdWxsX3JldiwgJG9yaWdfbGluZW5vLCAkbGluZW5vLCAkZ3JvdXBfc2l6ZSkgPQorCQkgICAgL14oWzAtOWEtZl17NDB9KSAoXGQrKSAoXGQrKSg/OiAoXGQrKSk/JC87CisJCWlmICghZXhpc3RzICRtZXRhaW5mb3skZnVsbF9yZXZ9KSB7CisJCQkkbWV0YWluZm97JGZ1bGxfcmV2fSA9IHt9OworCQl9CisJCW15ICRtZXRhID0gJG1ldGFpbmZveyRmdWxsX3Jldn07CisJCXdoaWxlICg8JGZkPikgeworCQkJbGFzdCBpZiAocy9eXHQvLyk7CisJCQlpZiAoL14oXFMrKSAoLiopJC8pIHsKKwkJCQkkbWV0YS0+eyQxfSA9ICQyOworCQkJfQorCQl9CisJCW15ICRkYXRhID0gJF87CisJCWNob21wICRkYXRhOworCQlteSAkcmV2ID0gc3Vic3RyKCRmdWxsX3JldiwgMCwgOCk7CisJCW15ICRhdXRob3IgPSAkbWV0YS0+eydhdXRob3InfTsKKwkJbXkgJWRhdGUgPSBwYXJzZV9kYXRlKCRtZXRhLT57J2F1dGhvci10aW1lJ30sCisJCSAgICAgICAgICAgICAgICAgICAgICAkbWV0YS0+eydhdXRob3ItdHonfSk7CisJCW15ICRkYXRlID0gJGRhdGV7J2lzby10eid9OworCQlpZiAoJGdyb3VwX3NpemUpIHsKKwkJCSRjdXJyZW50X2NvbG9yID0gKyskY3VycmVudF9jb2xvciAlICRudW1fY29sb3JzOworCQl9CisJCXByaW50ICI8dHIgY2xhc3M9XCIkcmV2X2NvbG9yWyRjdXJyZW50X2NvbG9yXVwiPlxuIjsKKwkJaWYgKCRncm91cF9zaXplKSB7CisJCQlwcmludCAiPHRkIGNsYXNzPVwic2hhMVwiIjsKKwkJCXByaW50ICIgdGl0bGU9XCIiLiBlc2NfaHRtbCgkYXV0aG9yKSAuICIsICRkYXRlXCIiOworCQkJcHJpbnQgIiByb3dzcGFuPVwiJGdyb3VwX3NpemVcIiIgaWYgKCRncm91cF9zaXplID4gMSk7CisJCQlwcmludCAiPiI7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRmdWxsX3JldiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkgICAgICAgICAgICAgIGVzY19odG1sKCRyZXYpKTsKKwkJCXByaW50ICI8L3RkPlxuIjsKKwkJfQorCQlvcGVuIChteSAkZGQsICItfCIsIGdpdF9jbWQoKSwgInJldi1wYXJzZSIsICIkZnVsbF9yZXZeIikKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LXJldi1wYXJzZSBmYWlsZWQiKTsKKwkJbXkgJHBhcmVudF9jb21taXQgPSA8JGRkPjsKKwkJY2xvc2UgJGRkOworCQljaG9tcCgkcGFyZW50X2NvbW1pdCk7CisJCW15ICRibGFtZWQgPSBocmVmKGFjdGlvbiA9PiAnYmxhbWUnLAorCQkgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPT4gJG1ldGEtPnsnZmlsZW5hbWUnfSwKKwkJICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlID0+ICRwYXJlbnRfY29tbWl0KTsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmVuclwiPiI7CisJCXByaW50ICRjZ2ktPmEoeyAtaHJlZiA9PiAiJGJsYW1lZCNsJG9yaWdfbGluZW5vIiwKKwkJICAgICAgICAgICAgICAgIC1pZCA9PiAibCRsaW5lbm8iLAorCQkgICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaW5lbnIiIH0sCisJCSAgICAgICAgICAgICAgZXNjX2h0bWwoJGxpbmVubykpOworCQlwcmludCAiPC90ZD4iOworCQlwcmludCAiPHRkIGNsYXNzPVwicHJlXCI+IiAuIGVzY19odG1sKCRkYXRhKSAuICI8L3RkPlxuIjsKKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJcHJpbnQgIjwvZGl2PiI7CisJY2xvc2UgJGZkCisJCW9yIHByaW50ICJSZWFkaW5nIGJsb2IgZmFpbGVkXG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2JsYW1lIHsKKwlteSAkZmQ7CisKKwlteSAoJGhhdmVfYmxhbWUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2JsYW1lJyk7CisJaWYgKCEkaGF2ZV9ibGFtZSkgeworCQlkaWVfZXJyb3IoJzQwMyBQZXJtaXNzaW9uIGRlbmllZCcsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCX0KKwlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiRmlsZSBuYW1lIG5vdCBkZWZpbmVkIikgaWYgKCEkZmlsZV9uYW1lKTsKKwkkaGFzaF9iYXNlIHx8PSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJZGllX2Vycm9yKHVuZGVmLCAiQ291bGRuJ3QgZmluZCBiYXNlIGNvbW1pdCIpIHVubGVzcyAoJGhhc2hfYmFzZSk7CisJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoX2Jhc2UpCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgY29tbWl0IGZhaWxlZCIpOworCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQkkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRoYXNoX2Jhc2UsICRmaWxlX25hbWUsICJibG9iIikKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIkVycm9yIGxvb2t1cCBmaWxlIik7CisJfQorCW9wZW4gKCRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiYW5ub3RhdGUiLCAnLWwnLCAnLXQnLCAnLXInLCAkZmlsZV9uYW1lLCAkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1hbm5vdGF0ZSBmYWlsZWQiKTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlteSAkZm9ybWF0c19uYXYgPQorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJICAgICAgICAiYmxvYiIpIC4KKwkJIiB8ICIgLgorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJCSJoaXN0b3J5IikgLgorCQkiIHwgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJICAgICAgICAiSEVBRCIpOworCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2hfYmFzZSwkY297J3RyZWUnfSwkaGFzaF9iYXNlLCAkZm9ybWF0c19uYXYpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pLCAkaGFzaF9iYXNlKTsKKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICdibG9iJywgJGhhc2hfYmFzZSk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJcHJpbnQgPDxIVE1MOworPHRhYmxlIGNsYXNzPSJibGFtZSI+CisgIDx0cj4KKyAgICA8dGg+Q29tbWl0PC90aD4KKyAgICA8dGg+QWdlPC90aD4KKyAgICA8dGg+QXV0aG9yPC90aD4KKyAgICA8dGg+TGluZTwvdGg+CisgICAgPHRoPkRhdGE8L3RoPgorICA8L3RyPgorSFRNTAorCW15IEBsaW5lX2NsYXNzID0gKHF3KGxpZ2h0IGRhcmspKTsKKwlteSAkbGluZV9jbGFzc19sZW4gPSBzY2FsYXIgKEBsaW5lX2NsYXNzKTsKKwlteSAkbGluZV9jbGFzc19udW0gPSAkI2xpbmVfY2xhc3M7CisJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJbXkgJGxvbmdfcmV2OworCQlteSAkc2hvcnRfcmV2OworCQlteSAkYXV0aG9yOworCQlteSAkdGltZTsKKwkJbXkgJGxpbmVubzsKKwkJbXkgJGRhdGE7CisJCW15ICRhZ2U7CisJCW15ICRhZ2Vfc3RyOworCQlteSAkYWdlX2NsYXNzOworCisJCWNob21wICRsaW5lOworCQkkbGluZV9jbGFzc19udW0gPSAoJGxpbmVfY2xhc3NfbnVtICsgMSkgJSAkbGluZV9jbGFzc19sZW47CisKKwkJaWYgKCRsaW5lID1+IG0vXihbMC05YS1mQS1GXXs0MH0pXHRcKFxzKihbXlx0XSspXHQoXGQrKSBbKy1dXGRcZFxkXGRcdChcZCspXCkoLiopJC8pIHsKKwkJCSRsb25nX3JldiA9ICQxOworCQkJJGF1dGhvciAgID0gJDI7CisJCQkkdGltZSAgICAgPSAkMzsKKwkJCSRsaW5lbm8gICA9ICQ0OworCQkJJGRhdGEgICAgID0gJDU7CisJCX0gZWxzZSB7CisJCQlwcmludCBxcSggIDx0cj48dGQgY29sc3Bhbj0iNSIgY2xhc3M9ImVycm9yIj5VbmFibGUgdG8gcGFyc2U6ICRsaW5lPC90ZD48L3RyPlxuKTsKKwkJCW5leHQ7CisJCX0KKwkJJHNob3J0X3JldiAgPSBzdWJzdHIgKCRsb25nX3JldiwgMCwgOCk7CisJCSRhZ2UgICAgICAgID0gdGltZSAoKSAtICR0aW1lOworCQkkYWdlX3N0ciAgICA9IGFnZV9zdHJpbmcgKCRhZ2UpOworCQkkYWdlX3N0ciAgICA9fiBzLyAvJm5ic3A7L2c7CisJCSRhZ2VfY2xhc3MgID0gYWdlX2NsYXNzKCRhZ2UpOworCQkkYXV0aG9yICAgICA9IGVzY19odG1sICgkYXV0aG9yKTsKKwkJJGF1dGhvciAgICAgPX4gcy8gLyZuYnNwOy9nOworCisJCSRkYXRhID0gdW50YWJpZnkoJGRhdGEpOworCQkkZGF0YSA9IGVzY19odG1sICgkZGF0YSk7CisKKwkJcHJpbnQgPDxIVE1MOworICA8dHIgY2xhc3M9IiRsaW5lX2NsYXNzWyRsaW5lX2NsYXNzX251bV0iPgorICAgIDx0ZCBjbGFzcz0ic2hhMSI+PGEgaHJlZj0iJHtcaHJlZiAoYWN0aW9uPT4iY29tbWl0IiwgaGFzaD0+JGxvbmdfcmV2KX0iIGNsYXNzPSJ0ZXh0Ij4kc2hvcnRfcmV2Li48L2E+PC90ZD4KKyAgICA8dGQgY2xhc3M9IiRhZ2VfY2xhc3MiPiRhZ2Vfc3RyPC90ZD4KKyAgICA8dGQ+JGF1dGhvcjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsaW5lbnIiPjxhIGlkPSIkbGluZW5vIiBocmVmPSIjJGxpbmVubyIgY2xhc3M9ImxpbmVuciI+JGxpbmVubzwvYT48L3RkPgorICAgIDx0ZCBjbGFzcz0icHJlIj4kZGF0YTwvdGQ+CisgIDwvdHI+CitIVE1MCisJfSAjIHdoaWxlIChteSAkbGluZSA9IDwkZmQ+KQorCXByaW50ICI8L3RhYmxlPlxuXG4iOworCWNsb3NlICRmZAorCQlvciBwcmludCAiUmVhZGluZyBibG9iIGZhaWxlZC5cbiI7CisJcHJpbnQgIjwvZGl2PiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfdGFncyB7CisJbXkgJGhlYWQgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGVhZCx1bmRlZiwkaGVhZCk7CisJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3N1bW1hcnknLCAkcHJvamVjdCk7CisKKwlteSBAdGFnc2xpc3QgPSBnaXRfZ2V0X3RhZ3NfbGlzdCgpOworCWlmIChAdGFnc2xpc3QpIHsKKwkJZ2l0X3RhZ3NfYm9keShcQHRhZ3NsaXN0KTsKKwl9CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfaGVhZHMgeworCW15ICRoZWFkID0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhlYWQsdW5kZWYsJGhlYWQpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdzdW1tYXJ5JywgJHByb2plY3QpOworCisJbXkgQGhlYWRzbGlzdCA9IGdpdF9nZXRfaGVhZHNfbGlzdCgpOworCWlmIChAaGVhZHNsaXN0KSB7CisJCWdpdF9oZWFkc19ib2R5KFxAaGVhZHNsaXN0LCAkaGVhZCk7CisJfQorCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2Jsb2JfcGxhaW4geworCW15ICRleHBpcmVzOworCisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCW15ICRiYXNlID0gJGhhc2hfYmFzZSB8fCBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJCQkkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRiYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiRXJyb3IgbG9va3VwIGZpbGUiKTsKKwkJfSBlbHNlIHsKKwkJCWRpZV9lcnJvcih1bmRlZiwgIk5vIGZpbGUgbmFtZSBkZWZpbmVkIik7CisJCX0KKwl9IGVsc2lmICgkaGFzaCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQkjIGJsb2JzIGRlZmluZWQgYnkgbm9uLXRleHR1YWwgaGFzaCBpZCdzIGNhbiBiZSBjYWNoZWQKKwkJJGV4cGlyZXMgPSAiKzFkIjsKKwl9CisKKwlteSAkdHlwZSA9IHNoaWZ0OworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJjYXQtZmlsZSIsICJibG9iIiwgJGhhc2gKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiQ291bGRuJ3QgY2F0ICRmaWxlX25hbWUsICRoYXNoIik7CisKKwkkdHlwZSB8fD0gYmxvYl9taW1ldHlwZSgkZmQsICRmaWxlX25hbWUpOworCisJIyBzYXZlIGFzIGZpbGVuYW1lLCBldmVuIHdoZW4gbm8gJGZpbGVfbmFtZSBpcyBnaXZlbgorCW15ICRzYXZlX2FzID0gIiRoYXNoIjsKKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRzYXZlX2FzID0gJGZpbGVfbmFtZTsKKwl9IGVsc2lmICgkdHlwZSA9fiBtL150ZXh0XC8vKSB7CisJCSRzYXZlX2FzIC49ICcudHh0JzsKKwl9CisKKwlwcmludCAkY2dpLT5oZWFkZXIoCisJCS10eXBlID0+ICIkdHlwZSIsCisJCS1leHBpcmVzPT4kZXhwaXJlcywKKwkJLWNvbnRlbnRfZGlzcG9zaXRpb24gPT4gJ2lubGluZTsgZmlsZW5hbWU9IicgLiAiJHNhdmVfYXMiIC4gJyInKTsKKwl1bmRlZiAkLzsKKwliaW5tb2RlIFNURE9VVCwgJzpyYXcnOworCXByaW50IDwkZmQ+OworCWJpbm1vZGUgU1RET1VULCAnOnV0ZjgnOyAjIGFzIHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGdpdHdlYi5jZ2kKKwkkLyA9ICJcbiI7CisJY2xvc2UgJGZkOworfQorCitzdWIgZ2l0X2Jsb2IgeworCW15ICRleHBpcmVzOworCisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCW15ICRiYXNlID0gJGhhc2hfYmFzZSB8fCBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJCQkkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRiYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiRXJyb3IgbG9va3VwIGZpbGUiKTsKKwkJfSBlbHNlIHsKKwkJCWRpZV9lcnJvcih1bmRlZiwgIk5vIGZpbGUgbmFtZSBkZWZpbmVkIik7CisJCX0KKwl9IGVsc2lmICgkaGFzaCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQkjIGJsb2JzIGRlZmluZWQgYnkgbm9uLXRleHR1YWwgaGFzaCBpZCdzIGNhbiBiZSBjYWNoZWQKKwkJJGV4cGlyZXMgPSAiKzFkIjsKKwl9CisKKwlteSAoJGhhdmVfYmxhbWUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2JsYW1lJyk7CisJb3BlbiBteSAkZmQsICItfCIsIGdpdF9jbWQoKSwgImNhdC1maWxlIiwgImJsb2IiLCAkaGFzaAorCQlvciBkaWVfZXJyb3IodW5kZWYsICJDb3VsZG4ndCBjYXQgJGZpbGVfbmFtZSwgJGhhc2giKTsKKwlteSAkbWltZXR5cGUgPSBibG9iX21pbWV0eXBlKCRmZCwgJGZpbGVfbmFtZSk7CisJaWYgKCRtaW1ldHlwZSAhfiBtIV4oPzp0ZXh0L3xpbWFnZS8oPzpnaWZ8cG5nfGpwZWcpJCkhKSB7CisJCWNsb3NlICRmZDsKKwkJcmV0dXJuIGdpdF9ibG9iX3BsYWluKCRtaW1ldHlwZSk7CisJfQorCSMgd2UgY2FuIGhhdmUgYmxhbWUgb25seSBmb3IgdGV4dC8qIG1pbWV0eXBlCisJJGhhdmVfYmxhbWUgJiY9ICgkbWltZXR5cGUgPX4gbSFedGV4dC8hKTsKKworCWdpdF9oZWFkZXJfaHRtbCh1bmRlZiwgJGV4cGlyZXMpOworCW15ICRmb3JtYXRzX25hdiA9ICcnOworCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UgJiYgKG15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaF9iYXNlKSkpIHsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJaWYgKCRoYXZlX2JsYW1lKSB7CisJCQkJJGZvcm1hdHNfbmF2IC49CisJCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGhhc2gsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSl9LAorCQkJCQkgICAgICAgICJibGFtZSIpIC4KKwkJCQkJIiB8ICI7CisJCQl9CisJCQkkZm9ybWF0c19uYXYgLj0KKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kaGFzaCwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkJICAgICAgICAiaGlzdG9yeSIpIC4KKwkJCQkiIHwgIiAuCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRoYXNoLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJCQkgICAgICAgICJyYXciKSAuCisJCQkJIiB8ICIgLgorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiJIRUFEIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkJICAgICAgICAiSEVBRCIpOworCQl9IGVsc2UgeworCQkJJGZvcm1hdHNfbmF2IC49CisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwgaGFzaD0+JGhhc2gpfSwgInJhdyIpOworCQl9CisJCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2hfYmFzZSwkY297J3RyZWUnfSwkaGFzaF9iYXNlLCAkZm9ybWF0c19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICI8YnIvPjxici8+PC9kaXY+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoPC9kaXY+XG4iOworCX0KKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICJibG9iIiwgJGhhc2hfYmFzZSk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJaWYgKCRtaW1ldHlwZSA9fiBtIV50ZXh0LyEpIHsKKwkJbXkgJG5yOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQkkbnIrKzsKKwkJCSRsaW5lID0gdW50YWJpZnkoJGxpbmUpOworCQkJcHJpbnRmICI8ZGl2IGNsYXNzPVwicHJlXCI+PGEgaWQ9XCJsJWlcIiBocmVmPVwiI2wlaVwiIGNsYXNzPVwibGluZW5yXCI+JTRpPC9hPiAlczwvZGl2PlxuIiwKKwkJCSAgICAgICAkbnIsICRuciwgJG5yLCBlc2NfaHRtbCgkbGluZSwgLW5ic3A9PjEpOworCQl9CisJfSBlbHNpZiAoJG1pbWV0eXBlID1+IG0hXmltYWdlLyEpIHsKKwkJcHJpbnQgcXEhPGltZyB0eXBlPSIkbWltZXR5cGUiITsKKwkJaWYgKCRmaWxlX25hbWUpIHsKKwkJCXByaW50IHFxISBhbHQ9IiRmaWxlX25hbWUiIHRpdGxlPSIkZmlsZV9uYW1lIiE7CisJCX0KKwkJcHJpbnQgcXEhIHNyYz0iISAuCisJCSAgICAgIGhyZWYoYWN0aW9uPT4iYmxvYl9wbGFpbiIsIGhhc2g9PiRoYXNoLAorCQkgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKSAuCisJCSAgICAgIHFxISIgLz5cbiE7CisJfQorCWNsb3NlICRmZAorCQlvciBwcmludCAiUmVhZGluZyBibG9iIGZhaWxlZC5cbiI7CisJcHJpbnQgIjwvZGl2PiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfdHJlZSB7CisJbXkgJGhhdmVfc25hcHNob3QgPSBnaXR3ZWJfaGF2ZV9zbmFwc2hvdCgpOworCisJaWYgKCFkZWZpbmVkICRoYXNoX2Jhc2UpIHsKKwkJJGhhc2hfYmFzZSA9ICJIRUFEIjsKKwl9CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCSRoYXNoID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSwgInRyZWUiKTsKKwkJfSBlbHNlIHsKKwkJCSRoYXNoID0gJGhhc2hfYmFzZTsKKwkJfQorCX0KKwkkLyA9ICJcMCI7CisJb3BlbiBteSAkZmQsICItfCIsIGdpdF9jbWQoKSwgImxzLXRyZWUiLCAnLXonLCAkaGFzaAorCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1scy10cmVlIGZhaWxlZCIpOworCW15IEBlbnRyaWVzID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgdHJlZSBmYWlsZWQiKTsKKwkkLyA9ICJcbiI7CisKKwlteSAkcmVmcyA9IGdpdF9nZXRfcmVmZXJlbmNlcygpOworCW15ICRyZWYgPSBmb3JtYXRfcmVmX21hcmtlcigkcmVmcywgJGhhc2hfYmFzZSk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJbXkgJGJhc2VkaXIgPSAnJzsKKwlteSAoJGhhdmVfYmxhbWUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2JsYW1lJyk7CisJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiAobXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoX2Jhc2UpKSkgeworCQlteSBAdmlld3NfbmF2ID0gKCk7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCXB1c2ggQHZpZXdzX25hdiwKKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kaGFzaCwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkJICAgICAgICAiaGlzdG9yeSIpLAorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiJIRUFEIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkJICAgICAgICAiSEVBRCIpLAorCQl9CisJCWlmICgkaGF2ZV9zbmFwc2hvdCkgeworCQkJIyBGSVhNRTogU2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHdlIGhhdmUgbm8gaGFzaCBiYXNlIGFzIHdlbGwuCisJCQlwdXNoIEB2aWV3c19uYXYsCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzbmFwc2hvdCIsIGhhc2g9PiRoYXNoKX0sCisJCQkJICAgICAgICAic25hcHNob3QiKTsKKwkJfQorCQlnaXRfcHJpbnRfcGFnZV9uYXYoJ3RyZWUnLCcnLCAkaGFzaF9iYXNlLCB1bmRlZiwgdW5kZWYsIGpvaW4oJyB8ICcsIEB2aWV3c19uYXYpKTsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2NvbW1pdCcsIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAkcmVmLCAkaGFzaF9iYXNlKTsKKwl9IGVsc2UgeworCQl1bmRlZiAkaGFzaF9iYXNlOworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iOworCQlwcmludCAiPGJyLz48YnIvPjwvZGl2PlxuIjsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoPC9kaXY+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRiYXNlZGlyID0gJGZpbGVfbmFtZTsKKwkJaWYgKCRiYXNlZGlyIG5lICcnICYmIHN1YnN0cigkYmFzZWRpciwgLTEpIG5lICcvJykgeworCQkJJGJhc2VkaXIgLj0gJy8nOworCQl9CisJfQorCWdpdF9wcmludF9wYWdlX3BhdGgoJGZpbGVfbmFtZSwgJ3RyZWUnLCAkaGFzaF9iYXNlKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwkjICcuLicgKHRvcCBkaXJlY3RvcnkpIGxpbmsgaWYgcG9zc2libGUKKwlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmCisJICAgIGRlZmluZWQgJGZpbGVfbmFtZSAmJiAkZmlsZV9uYW1lID1+IG0hW14vXSskISkgeworCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCX0KKwkJJGFsdGVybmF0ZSBePSAxOworCisJCW15ICR1cCA9ICRmaWxlX25hbWU7CisJCSR1cCA9fiBzIS8/W14vXSskISE7CisJCXVuZGVmICR1cCB1bmxlc3MgJHVwOworCQkjIGJhc2VkIG9uIGdpdF9wcmludF90cmVlX2VudHJ5CisJCXByaW50ICc8dGQgY2xhc3M9Im1vZGUiPicgLiBtb2RlX3N0cignMDQwMDAwJykgLiAiPC90ZD5cbiI7CisJCXByaW50ICc8dGQgY2xhc3M9Imxpc3QiPic7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiR1cCl9LAorCQkgICAgICAgICAgICAgICIuLiIpOworCQlwcmludCAiPC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5rXCI+PC90ZD5cbiI7CisKKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlmb3JlYWNoIG15ICRsaW5lIChAZW50cmllcykgeworCQlteSAldCA9IHBhcnNlX2xzX3RyZWVfbGluZSgkbGluZSwgLXogPT4gMSk7CisKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKworCQlnaXRfcHJpbnRfdHJlZV9lbnRyeShcJXQsICRiYXNlZGlyLCAkaGFzaF9iYXNlLCAkaGF2ZV9ibGFtZSk7CisKKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiIgLgorCSAgICAgICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3NuYXBzaG90IHsKKwlteSAoJGN0eXBlLCAkc3VmZml4LCAkY29tbWFuZCkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgnc25hcHNob3QnKTsKKwlteSAkaGF2ZV9zbmFwc2hvdCA9IChkZWZpbmVkICRjdHlwZSAmJiBkZWZpbmVkICRzdWZmaXgpOworCWlmICghJGhhdmVfc25hcHNob3QpIHsKKwkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwl9CisKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJfQorCisJbXkgJGZpbGVuYW1lID0gZGVjb2RlX3V0ZjgoYmFzZW5hbWUoJHByb2plY3QpKSAuICItJGhhc2gudGFyLiRzdWZmaXgiOworCisJcHJpbnQgJGNnaS0+aGVhZGVyKAorCQktdHlwZSA9PiAiYXBwbGljYXRpb24vJGN0eXBlIiwKKwkJLWNvbnRlbnRfZGlzcG9zaXRpb24gPT4gJ2lubGluZTsgZmlsZW5hbWU9IicgLiAiJGZpbGVuYW1lIiAuICciJywKKwkJLXN0YXR1cyA9PiAnMjAwIE9LJyk7CisKKwlteSAkZ2l0ID0gZ2l0X2NtZF9zdHIoKTsKKwlteSAkbmFtZSA9ICRwcm9qZWN0OworCSRuYW1lID1+IHMvXDA0Ny9cMDQ3XFxcMDQ3XDA0Ny9nOworCW9wZW4gbXkgJGZkLCAiLXwiLAorCQkiJGdpdCBhcmNoaXZlIC0tZm9ybWF0PXRhciAtLXByZWZpeD1cJyRuYW1lXCcvICRoYXNoIHwgJGNvbW1hbmQiCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIkV4ZWN1dGUgZ2l0LXRhci10cmVlIGZhaWxlZCIpOworCWJpbm1vZGUgU1RET1VULCAnOnJhdyc7CisJcHJpbnQgPCRmZD47CisJYmlubW9kZSBTVERPVVQsICc6dXRmOCc7ICMgYXMgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgZ2l0d2ViLmNnaQorCWNsb3NlICRmZDsKKworfQorCitzdWIgZ2l0X2xvZyB7CisJbXkgJGhlYWQgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gJGhlYWQ7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRyZWZzID0gZ2l0X2dldF9yZWZlcmVuY2VzKCk7CisKKwlteSBAY29tbWl0bGlzdCA9IHBhcnNlX2NvbW1pdHMoJGhhc2gsIDEwMSwgKDEwMCAqICRwYWdlKSk7CisKKwlteSAkcGFnaW5nX25hdiA9IGZvcm1hdF9wYWdpbmdfbmF2KCdsb2cnLCAkaGFzaCwgJGhlYWQsICRwYWdlLCAoMTAwICogKCRwYWdlKzEpKSk7CisKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJ2xvZycsJycsICRoYXNoLHVuZGVmLHVuZGVmLCAkcGFnaW5nX25hdik7CisKKwlpZiAoIUBjb21taXRsaXN0KSB7CisJCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaCk7CisKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3N1bW1hcnknLCAkcHJvamVjdCk7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+IExhc3QgY2hhbmdlICRjb3snYWdlX3N0cmluZyd9Ljxici8+PGJyLz48L2Rpdj5cbiI7CisJfQorCW15ICR0byA9ICgkI2NvbW1pdGxpc3QgPj0gOTkpID8gKDk5KSA6ICgkI2NvbW1pdGxpc3QpOworCWZvciAobXkgJGkgPSAwOyAkaSA8PSAkdG87ICRpKyspIHsKKwkJbXkgJWNvID0gJXskY29tbWl0bGlzdFskaV19OworCQluZXh0IGlmICElY287CisJCW15ICRjb21taXQgPSAkY297J2lkJ307CisJCW15ICRyZWYgPSBmb3JtYXRfcmVmX21hcmtlcigkcmVmcywgJGNvbW1pdCk7CisJCW15ICVhZCA9IHBhcnNlX2RhdGUoJGNveydhdXRob3JfZXBvY2gnfSk7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLAorCQkgICAgICAgICAgICAgICAiPHNwYW4gY2xhc3M9XCJhZ2VcIj4kY297J2FnZV9zdHJpbmcnfTwvc3Bhbj4iIC4KKwkJICAgICAgICAgICAgICAgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYsCisJCSAgICAgICAgICAgICAgICRjb21taXQpOworCQlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCQkgICAgICAiPGRpdiBjbGFzcz1cImxvZ19saW5rXCI+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kY29tbWl0KX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGNvbW1pdCl9LCAiY29tbWl0ZGlmZiIpIC4KKwkJICAgICAgIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kY29tbWl0LCBoYXNoX2Jhc2U9PiRjb21taXQpfSwgInRyZWUiKSAuCisJCSAgICAgICI8YnIvPlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiIgLgorCQkgICAgICAiPGk+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yX25hbWUnfSkgLiAgIiBbJGFkeydyZmMyODIyJ31dPC9pPjxici8+XG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKworCQlwcmludCAiPGRpdiBjbGFzcz1cImxvZ19ib2R5XCI+XG4iOworCQlnaXRfcHJpbnRfbG9nKCRjb3snY29tbWVudCd9LCAtZmluYWxfZW1wdHlfbGluZT0+IDEpOworCQlwcmludCAiPC9kaXY+XG4iOworCX0KKwlpZiAoJCNjb21taXRsaXN0ID49IDEwMCkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImxvZyIsIGhhc2g9PiRoYXNoLCBwYWdlPT4kcGFnZSsxKSwKKwkJCSAgICAgICAtYWNjZXNza2V5ID0+ICJuIiwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpOworCQlwcmludCAiPC9kaXY+XG4iOworCX0KKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9jb21taXQgeworCSRoYXNoIHx8PSAkaGFzaF9iYXNlIHx8ICJIRUFEIjsKKwlteSAlY28gPSBwYXJzZV9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdCIpOworCX0KKwlteSAlYWQgPSBwYXJzZV9kYXRlKCRjb3snYXV0aG9yX2Vwb2NoJ30sICRjb3snYXV0aG9yX3R6J30pOworCW15ICVjZCA9IHBhcnNlX2RhdGUoJGNveydjb21taXR0ZXJfZXBvY2gnfSwgJGNveydjb21taXR0ZXJfdHonfSk7CisKKwlteSAkcGFyZW50ICA9ICRjb3sncGFyZW50J307CisJbXkgJHBhcmVudHMgPSAkY297J3BhcmVudHMnfTsgIyBsaXN0cmVmCisKKwkjIHdlIG5lZWQgdG8gcHJlcGFyZSAkZm9ybWF0c19uYXYgYmVmb3JlIGFueSBwYXJhbWV0ZXIgbXVuZ2luZworCW15ICRmb3JtYXRzX25hdjsKKwlpZiAoIWRlZmluZWQgJHBhcmVudCkgeworCQkjIC0tcm9vdCBjb21taXRkaWZmCisJCSRmb3JtYXRzX25hdiAuPSAnKGluaXRpYWwpJzsKKwl9IGVsc2lmIChAJHBhcmVudHMgPT0gMSkgeworCQkjIHNpbmdsZSBwYXJlbnQgY29tbWl0CisJCSRmb3JtYXRzX25hdiAuPQorCQkJJyhwYXJlbnQ6ICcgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLAorCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kcGFyZW50KX0sCisJCQkgICAgICAgIGVzY19odG1sKHN1YnN0cigkcGFyZW50LCAwLCA3KSkpIC4KKwkJCScpJzsKKwl9IGVsc2UgeworCQkjIG1lcmdlIGNvbW1pdAorCQkkZm9ybWF0c19uYXYgLj0KKwkJCScobWVyZ2U6ICcgLgorCQkJam9pbignICcsIG1hcCB7CisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JF8pfSwKKwkJCQkgICAgICAgIGVzY19odG1sKHN1YnN0cigkXywgMCwgNykpKTsKKwkJCX0gQCRwYXJlbnRzICkgLgorCQkJJyknOworCX0KKworCWlmICghZGVmaW5lZCAkcGFyZW50KSB7CisJCSRwYXJlbnQgPSAiLS1yb290IjsKKwl9CisJbXkgQGRpZmZ0cmVlOworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCAiLS1uby1jb21taXQtaWQiLAorCQlAZGlmZl9vcHRzLAorCQkoQCRwYXJlbnRzIDw9IDEgPyAkcGFyZW50IDogJy1jJyksCisJCSRoYXNoLCAiLS0iCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwlAZGlmZnRyZWUgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwljbG9zZSAkZmQgb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCisJIyBub24tdGV4dHVhbCBoYXNoIGlkJ3MgY2FuIGJlIGNhY2hlZAorCW15ICRleHBpcmVzOworCWlmICgkaGFzaCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQkkZXhwaXJlcyA9ICIrMWQiOworCX0KKwlteSAkcmVmcyA9IGdpdF9nZXRfcmVmZXJlbmNlcygpOworCW15ICRyZWYgPSBmb3JtYXRfcmVmX21hcmtlcigkcmVmcywgJGNveydpZCd9KTsKKworCW15ICRoYXZlX3NuYXBzaG90ID0gZ2l0d2ViX2hhdmVfc25hcHNob3QoKTsKKworCWdpdF9oZWFkZXJfaHRtbCh1bmRlZiwgJGV4cGlyZXMpOworCWdpdF9wcmludF9wYWdlX25hdignY29tbWl0JywgJycsCisJICAgICAgICAgICAgICAgICAgICRoYXNoLCAkY297J3RyZWUnfSwgJGhhc2gsCisJICAgICAgICAgICAgICAgICAgICRmb3JtYXRzX25hdik7CisKKwlpZiAoZGVmaW5lZCAkY297J3BhcmVudCd9KSB7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXRkaWZmJywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYsICRoYXNoKTsKKwl9IGVsc2UgeworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdigndHJlZScsIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAkcmVmLCAkY297J3RyZWUnfSwgJGhhc2gpOworCX0KKwlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCSAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCXByaW50ICI8dHI+PHRkPmF1dGhvcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkY297J2F1dGhvcid9KSAuICI8L3RkPjwvdHI+XG4iLgorCSAgICAgICI8dHI+IiAuCisJICAgICAgIjx0ZD48L3RkPjx0ZD4gJGFkeydyZmMyODIyJ30iOworCWlmICgkYWR7J2hvdXJfbG9jYWwnfSA8IDYpIHsKKwkJcHJpbnRmKCIgKDxzcGFuIGNsYXNzPVwiYXRuaWdodFwiPiUwMmQ6JTAyZDwvc3Bhbj4gJXMpIiwKKwkJICAgICAgICRhZHsnaG91cl9sb2NhbCd9LCAkYWR7J21pbnV0ZV9sb2NhbCd9LCAkYWR7J3R6X2xvY2FsJ30pOworCX0gZWxzZSB7CisJCXByaW50ZigiICglMDJkOiUwMmQgJXMpIiwKKwkJICAgICAgICRhZHsnaG91cl9sb2NhbCd9LCAkYWR7J21pbnV0ZV9sb2NhbCd9LCAkYWR7J3R6X2xvY2FsJ30pOworCX0KKwlwcmludCAiPC90ZD4iIC4KKwkgICAgICAiPC90cj5cbiI7CisJcHJpbnQgIjx0cj48dGQ+Y29tbWl0dGVyPC90ZD48dGQ+IiAuIGVzY19odG1sKCRjb3snY29tbWl0dGVyJ30pIC4gIjwvdGQ+PC90cj5cbiI7CisJcHJpbnQgIjx0cj48dGQ+PC90ZD48dGQ+ICRjZHsncmZjMjgyMid9IiAuCisJICAgICAgc3ByaW50ZigiICglMDJkOiUwMmQgJXMpIiwgJGNkeydob3VyX2xvY2FsJ30sICRjZHsnbWludXRlX2xvY2FsJ30sICRjZHsndHpfbG9jYWwnfSkgLgorCSAgICAgICI8L3RkPjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPmNvbW1pdDwvdGQ+PHRkIGNsYXNzPVwic2hhMVwiPiRjb3snaWQnfTwvdGQ+PC90cj5cbiI7CisJcHJpbnQgIjx0cj4iIC4KKwkgICAgICAiPHRkPnRyZWU8L3RkPiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJzaGExXCI+IiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JGNveyd0cmVlJ30sIGhhc2hfYmFzZT0+JGhhc2gpLAorCSAgICAgICAgICAgICAgIGNsYXNzID0+ICJsaXN0In0sICRjb3sndHJlZSd9KSAuCisJICAgICAgIjwvdGQ+IiAuCisJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kY297J3RyZWUnfSwgaGFzaF9iYXNlPT4kaGFzaCl9LAorCSAgICAgICAgICAgICAgInRyZWUiKTsKKwlpZiAoJGhhdmVfc25hcHNob3QpIHsKKwkJcHJpbnQgIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNuYXBzaG90IiwgaGFzaD0+JGhhc2gpfSwgInNuYXBzaG90Iik7CisJfQorCXByaW50ICI8L3RkPiIgLgorCSAgICAgICI8L3RyPlxuIjsKKworCWZvcmVhY2ggbXkgJHBhciAoQCRwYXJlbnRzKSB7CisJCXByaW50ICI8dHI+IiAuCisJCSAgICAgICI8dGQ+cGFyZW50PC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cInNoYTFcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kcGFyKSwKKwkJICAgICAgICAgICAgICAgY2xhc3MgPT4gImxpc3QifSwgJHBhcikgLgorCQkgICAgICAiPC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kcGFyKX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGhhc2gsIGhhc2hfcGFyZW50PT4kcGFyKX0sICJkaWZmIikgLgorCQkgICAgICAiPC90ZD4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT4iLgorCSAgICAgICI8L2Rpdj5cbiI7CisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIjsKKwlnaXRfcHJpbnRfbG9nKCRjb3snY29tbWVudCd9KTsKKwlwcmludCAiPC9kaXY+XG4iOworCisJZ2l0X2RpZmZ0cmVlX2JvZHkoXEBkaWZmdHJlZSwgJGhhc2gsIEAkcGFyZW50cyk7CisKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9vYmplY3QgeworCSMgb2JqZWN0IGlzIGRlZmluZWQgYnk6CisJIyAtIGhhc2ggb3IgaGFzaF9iYXNlIGFsb25lCisJIyAtIGhhc2hfYmFzZSBhbmQgZmlsZV9uYW1lCisJbXkgJHR5cGU7CisKKwkjIC0gaGFzaCBvciBoYXNoX2Jhc2UgYWxvbmUKKwlpZiAoJGhhc2ggfHwgKCRoYXNoX2Jhc2UgJiYgIWRlZmluZWQgJGZpbGVfbmFtZSkpIHsKKwkJbXkgJG9iamVjdF9pZCA9ICRoYXNoIHx8ICRoYXNoX2Jhc2U7CisKKwkJbXkgJGdpdF9jb21tYW5kID0gZ2l0X2NtZF9zdHIoKTsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0X2NvbW1hbmQgY2F0LWZpbGUgLXQgJG9iamVjdF9pZCAyPi9kZXYvbnVsbCIKKwkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJPYmplY3QgZG9lcyBub3QgZXhpc3QiKTsKKwkJJHR5cGUgPSA8JGZkPjsKKwkJY2hvbXAgJHR5cGU7CisJCWNsb3NlICRmZAorCQkJb3IgZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIk9iamVjdCBkb2VzIG5vdCBleGlzdCIpOworCisJIyAtIGhhc2hfYmFzZSBhbmQgZmlsZV9uYW1lCisJfSBlbHNpZiAoJGhhc2hfYmFzZSAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGZpbGVfbmFtZSA9fiBzLC8rJCwsOworCisJCXN5c3RlbShnaXRfY21kKCksICJjYXQtZmlsZSIsICctZScsICRoYXNoX2Jhc2UpID09IDAKKwkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJCYXNlIG9iamVjdCBkb2VzIG5vdCBleGlzdCIpOworCisJCSMgaGVyZSBlcnJvcnMgc2hvdWxkIG5vdCBoYXBlbgorCQlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAibHMtdHJlZSIsICRoYXNoX2Jhc2UsICItLSIsICRmaWxlX25hbWUKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWxzLXRyZWUgZmFpbGVkIik7CisJCW15ICRsaW5lID0gPCRmZD47CisJCWNsb3NlICRmZDsKKworCQkjJzEwMDY0NCBibG9iIDBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkJdW5sZXNzICgkbGluZSAmJiAkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQvKSB7CisJCQlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiRmlsZSBvciBkaXJlY3RvcnkgZm9yIGdpdmVuIGJhc2UgZG9lcyBub3QgZXhpc3QiKTsKKwkJfQorCQkkdHlwZSA9ICQyOworCQkkaGFzaCA9ICQzOworCX0gZWxzZSB7CisJCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJOb3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpbmQgb2JqZWN0Iik7CisJfQorCisJcHJpbnQgJGNnaS0+cmVkaXJlY3QoLXVyaSA9PiBocmVmKGFjdGlvbj0+JHR5cGUsIC1mdWxsPT4xLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlX25hbWUpLAorCSAgICAgICAgICAgICAgICAgICAgIC1zdGF0dXMgPT4gJzMwMiBGb3VuZCcpOworfQorCitzdWIgZ2l0X2Jsb2JkaWZmIHsKKwlteSAkZm9ybWF0ID0gc2hpZnQgfHwgJ2h0bWwnOworCisJbXkgJGZkOworCW15IEBkaWZmdHJlZTsKKwlteSAlZGlmZmluZm87CisJbXkgJGV4cGlyZXM7CisKKwkjIHByZXBhcmluZyAkZmQgYW5kICVkaWZmaW5mbyBmb3IgZ2l0X3BhdGNoc2V0X2JvZHkKKwkjIG5ldyBzdHlsZSBVUkkKKwlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmIGRlZmluZWQgJGhhc2hfcGFyZW50X2Jhc2UpIHsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJIyByZWFkIHJhdyBvdXRwdXQKKwkJCW9wZW4gJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCBAZGlmZl9vcHRzLAorCQkJCSRoYXNoX3BhcmVudF9iYXNlLCAkaGFzaF9iYXNlLAorCQkJCSItLSIsIChkZWZpbmVkICRmaWxlX3BhcmVudCA/ICRmaWxlX3BhcmVudCA6ICgpKSwgJGZpbGVfbmFtZQorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwkJCUBkaWZmdHJlZSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCQkJY2xvc2UgJGZkCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCQkJQGRpZmZ0cmVlCisJCQkJb3IgZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIkJsb2IgZGlmZiBub3QgZm91bmQiKTsKKworCQl9IGVsc2lmIChkZWZpbmVkICRoYXNoICYmCisJCSAgICAgICAgICRoYXNoID1+IC9bMC05YS1mQS1GXXs0MH0vKSB7CisJCQkjIHRyeSB0byBmaW5kIGZpbGVuYW1lIGZyb20gJGhhc2gKKworCQkJIyByZWFkIGZpbHRlcmVkIHJhdyBvdXRwdXQKKwkJCW9wZW4gJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCBAZGlmZl9vcHRzLAorCQkJCSRoYXNoX3BhcmVudF9iYXNlLCAkaGFzaF9iYXNlLCAiLS0iCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCQkJQGRpZmZ0cmVlID0KKwkJCQkjICc6MTAwNjQ0IDEwMDY0NCAwM2IyMTgyNi4uLiAzYjkzZDVlNy4uLiBNCWxzLWZpbGVzLmMnCisJCQkJIyAkaGFzaCA9PSB0b19pZAorCQkJCWdyZXAgeyAvXjpbMC03XXs2fSBbMC03XXs2fSBbMC05YS1mQS1GXXs0MH0gJGhhc2gvIH0KKwkJCQltYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwkJCWNsb3NlICRmZAorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwkJCUBkaWZmdHJlZQorCQkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJCbG9iIGRpZmYgbm90IGZvdW5kIik7CisKKwkJfSBlbHNlIHsKKwkJCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJNaXNzaW5nIG9uZSBvZiB0aGUgYmxvYiBkaWZmIHBhcmFtZXRlcnMiKTsKKwkJfQorCisJCWlmIChAZGlmZnRyZWUgPiAxKSB7CisJCQlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiQW1iaWd1b3VzIGJsb2IgZGlmZiBzcGVjaWZpY2F0aW9uIik7CisJCX0KKworCQklZGlmZmluZm8gPSBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkZGlmZnRyZWVbMF0pOworCQkkZmlsZV9wYXJlbnQgfHw9ICRkaWZmaW5mb3snZnJvbV9maWxlJ30gfHwgJGZpbGVfbmFtZSB8fCAkZGlmZmluZm97J2ZpbGUnfTsKKwkJJGZpbGVfbmFtZSAgIHx8PSAkZGlmZmluZm97J3RvX2ZpbGUnfSAgIHx8ICRkaWZmaW5mb3snZmlsZSd9OworCisJCSRoYXNoX3BhcmVudCB8fD0gJGRpZmZpbmZveydmcm9tX2lkJ307CisJCSRoYXNoICAgICAgICB8fD0gJGRpZmZpbmZveyd0b19pZCd9OworCisJCSMgbm9uLXRleHR1YWwgaGFzaCBpZCdzIGNhbiBiZSBjYWNoZWQKKwkJaWYgKCRoYXNoX2Jhc2UgPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8gJiYKKwkJICAgICRoYXNoX3BhcmVudF9iYXNlID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCQkkZXhwaXJlcyA9ICcrMWQnOworCQl9CisKKwkJIyBvcGVuIHBhdGNoIG91dHB1dAorCQlvcGVuICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZi10cmVlIiwgJy1yJywgQGRpZmZfb3B0cywKKwkJCSctcCcsICgkZm9ybWF0IGVxICdodG1sJyA/ICItLWZ1bGwtaW5kZXgiIDogKCkpLAorCQkJJGhhc2hfcGFyZW50X2Jhc2UsICRoYXNoX2Jhc2UsCisJCQkiLS0iLCAoZGVmaW5lZCAkZmlsZV9wYXJlbnQgPyAkZmlsZV9wYXJlbnQgOiAoKSksICRmaWxlX25hbWUKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwl9CisKKwkjIG9sZC9sZWdhY3kgc3R5bGUgVVJJCisJaWYgKCElZGlmZmluZm8gJiYgIyBpZiBuZXcgc3R5bGUgVVJJIGZhaWxlZAorCSAgICBkZWZpbmVkICRoYXNoICYmIGRlZmluZWQgJGhhc2hfcGFyZW50KSB7CisJCSMgZmFrZSBnaXQtZGlmZi10cmVlIHJhdyBvdXRwdXQKKwkJJGRpZmZpbmZveydmcm9tX21vZGUnfSA9ICRkaWZmaW5mb3sndG9fbW9kZSd9ID0gImJsb2IiOworCQkkZGlmZmluZm97J2Zyb21faWQnfSA9ICRoYXNoX3BhcmVudDsKKwkJJGRpZmZpbmZveyd0b19pZCd9ICAgPSAkaGFzaDsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJaWYgKGRlZmluZWQgJGZpbGVfcGFyZW50KSB7CisJCQkJJGRpZmZpbmZveydzdGF0dXMnfSA9ICcyJzsKKwkJCQkkZGlmZmluZm97J2Zyb21fZmlsZSd9ID0gJGZpbGVfcGFyZW50OworCQkJCSRkaWZmaW5mb3sndG9fZmlsZSd9ICAgPSAkZmlsZV9uYW1lOworCQkJfSBlbHNlIHsgIyBhc3N1bWUgbm90IHJlbmFtZWQKKwkJCQkkZGlmZmluZm97J3N0YXR1cyd9ID0gJzEnOworCQkJCSRkaWZmaW5mb3snZnJvbV9maWxlJ30gPSAkZmlsZV9uYW1lOworCQkJCSRkaWZmaW5mb3sndG9fZmlsZSd9ICAgPSAkZmlsZV9uYW1lOworCQkJfQorCQl9IGVsc2UgeyAjIG5vIGZpbGVuYW1lIGdpdmVuCisJCQkkZGlmZmluZm97J3N0YXR1cyd9ID0gJzInOworCQkJJGRpZmZpbmZveydmcm9tX2ZpbGUnfSA9ICRoYXNoX3BhcmVudDsKKwkJCSRkaWZmaW5mb3sndG9fZmlsZSd9ICAgPSAkaGFzaDsKKwkJfQorCisJCSMgbm9uLXRleHR1YWwgaGFzaCBpZCdzIGNhbiBiZSBjYWNoZWQKKwkJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvICYmCisJCSAgICAkaGFzaF9wYXJlbnQgPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJCSRleHBpcmVzID0gJysxZCc7CisJCX0KKworCQkjIG9wZW4gcGF0Y2ggb3V0cHV0CisJCW9wZW4gJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmIiwgQGRpZmZfb3B0cywKKwkJCSctcCcsICgkZm9ybWF0IGVxICdodG1sJyA/ICItLWZ1bGwtaW5kZXgiIDogKCkpLAorCQkJJGhhc2hfcGFyZW50LCAkaGFzaCwgIi0tIgorCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtZGlmZiBmYWlsZWQiKTsKKwl9IGVsc2UgIHsKKwkJZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIk1pc3Npbmcgb25lIG9mIHRoZSBibG9iIGRpZmYgcGFyYW1ldGVycyIpCisJCQl1bmxlc3MgJWRpZmZpbmZvOworCX0KKworCSMgaGVhZGVyCisJaWYgKCRmb3JtYXQgZXEgJ2h0bWwnKSB7CisJCW15ICRmb3JtYXRzX25hdiA9CisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JkaWZmX3BsYWluIiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGhhc2gsIGhhc2hfcGFyZW50PT4kaGFzaF9wYXJlbnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgaGFzaF9wYXJlbnRfYmFzZT0+JGhhc2hfcGFyZW50X2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSwgZmlsZV9wYXJlbnQ9PiRmaWxlX3BhcmVudCl9LAorCQkJICAgICAgICAicmF3Iik7CisJCWdpdF9oZWFkZXJfaHRtbCh1bmRlZiwgJGV4cGlyZXMpOworCQlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmIChteSAlY28gPSBwYXJzZV9jb21taXQoJGhhc2hfYmFzZSkpKSB7CisJCQlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoYXNoX2Jhc2UsJGNveyd0cmVlJ30sJGhhc2hfYmFzZSwgJGZvcm1hdHNfbmF2KTsKKwkJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pLCAkaGFzaF9iYXNlKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj48YnIvPiRmb3JtYXRzX25hdjxici8+PC9kaXY+XG4iOworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoIHZzICRoYXNoX3BhcmVudDwvZGl2PlxuIjsKKwkJfQorCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICJibG9iIiwgJGhhc2hfYmFzZSk7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfcGF0aFwiPjwvZGl2PlxuIjsKKwkJfQorCisJfSBlbHNpZiAoJGZvcm1hdCBlcSAncGxhaW4nKSB7CisJCXByaW50ICRjZ2ktPmhlYWRlcigKKwkJCS10eXBlID0+ICd0ZXh0L3BsYWluJywKKwkJCS1jaGFyc2V0ID0+ICd1dGYtOCcsCisJCQktZXhwaXJlcyA9PiAkZXhwaXJlcywKKwkJCS1jb250ZW50X2Rpc3Bvc2l0aW9uID0+ICdpbmxpbmU7IGZpbGVuYW1lPSInIC4gIiRmaWxlX25hbWUiIC4gJy5wYXRjaCInKTsKKworCQlwcmludCAiWC1HaXQtVXJsOiAiIC4gJGNnaS0+c2VsZl91cmwoKSAuICJcblxuIjsKKworCX0gZWxzZSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gYmxvYmRpZmYgZm9ybWF0Iik7CisJfQorCisJIyBwYXRjaAorCWlmICgkZm9ybWF0IGVxICdodG1sJykgeworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIjsKKworCQlnaXRfcGF0Y2hzZXRfYm9keSgkZmQsIFsgXCVkaWZmaW5mbyBdLCAkaGFzaF9iYXNlLCAkaGFzaF9wYXJlbnRfYmFzZSk7CisJCWNsb3NlICRmZDsKKworCQlwcmludCAiPC9kaXY+XG4iOyAjIGNsYXNzPSJwYWdlX2JvZHkiCisJCWdpdF9mb290ZXJfaHRtbCgpOworCisJfSBlbHNlIHsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCSRsaW5lID1+IHMhYS8oJGhhc2h8JGhhc2hfcGFyZW50KSEnYS8nLmVzY19wYXRoKCRkaWZmaW5mb3snZnJvbV9maWxlJ30pIWVnOworCQkJJGxpbmUgPX4gcyFiLygkaGFzaHwkaGFzaF9wYXJlbnQpISdiLycuZXNjX3BhdGgoJGRpZmZpbmZveyd0b19maWxlJ30pIWVnOworCisJCQlwcmludCAkbGluZTsKKworCQkJbGFzdCBpZiAkbGluZSA9fiBtIV5cK1wrXCshOworCQl9CisJCWxvY2FsICQvID0gdW5kZWY7CisJCXByaW50IDwkZmQ+OworCQljbG9zZSAkZmQ7CisJfQorfQorCitzdWIgZ2l0X2Jsb2JkaWZmX3BsYWluIHsKKwlnaXRfYmxvYmRpZmYoJ3BsYWluJyk7Cit9CisKK3N1YiBnaXRfY29tbWl0ZGlmZiB7CisJbXkgJGZvcm1hdCA9IHNoaWZ0IHx8ICdodG1sJzsKKwkkaGFzaCB8fD0gJGhhc2hfYmFzZSB8fCAiSEVBRCI7CisJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoKTsKKwlpZiAoISVjbykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIGNvbW1pdCBvYmplY3QiKTsKKwl9CisKKwkjIHdlIG5lZWQgdG8gcHJlcGFyZSAkZm9ybWF0c19uYXYgYmVmb3JlIGFueSBwYXJhbWV0ZXIgbXVuZ2luZworCW15ICRmb3JtYXRzX25hdjsKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJJGZvcm1hdHNfbmF2ID0KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0ZGlmZl9wbGFpbiIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRoYXNoLCBoYXNoX3BhcmVudD0+JGhhc2hfcGFyZW50KX0sCisJCQkgICAgICAgICJyYXciKTsKKworCQlpZiAoZGVmaW5lZCAkaGFzaF9wYXJlbnQpIHsKKwkJCSMgY29tbWl0ZGlmZiB3aXRoIHR3byBjb21taXRzIGdpdmVuCisJCQlteSAkaGFzaF9wYXJlbnRfc2hvcnQgPSAkaGFzaF9wYXJlbnQ7CisJCQlpZiAoJGhhc2hfcGFyZW50ID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCQkJJGhhc2hfcGFyZW50X3Nob3J0ID0gc3Vic3RyKCRoYXNoX3BhcmVudCwgMCwgNyk7CisJCQl9CisJCQkkZm9ybWF0c19uYXYgLj0KKwkJCQknIChmcm9tOiAnIC4KKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdGRpZmYiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGhhc2hfcGFyZW50KX0sCisJCQkJICAgICAgICBlc2NfaHRtbCgkaGFzaF9wYXJlbnRfc2hvcnQpKSAuCisJCQkJJyknOworCQl9IGVsc2lmICghJGNveydwYXJlbnQnfSkgeworCQkJIyAtLXJvb3QgY29tbWl0ZGlmZgorCQkJJGZvcm1hdHNfbmF2IC49ICcgKGluaXRpYWwpJzsKKwkJfSBlbHNpZiAoc2NhbGFyIEB7JGNveydwYXJlbnRzJ319ID09IDEpIHsKKwkJCSMgc2luZ2xlIHBhcmVudCBjb21taXQKKwkJCSRmb3JtYXRzX25hdiAuPQorCQkJCScgKHBhcmVudDogJyAuCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRjb3sncGFyZW50J30pfSwKKwkJCQkgICAgICAgIGVzY19odG1sKHN1YnN0cigkY297J3BhcmVudCd9LCAwLCA3KSkpIC4KKwkJCQknKSc7CisJCX0gZWxzZSB7CisJCQkjIG1lcmdlIGNvbW1pdAorCQkJJGZvcm1hdHNfbmF2IC49CisJCQkJJyAobWVyZ2U6ICcgLgorCQkJCWpvaW4oJyAnLCBtYXAgeworCQkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdGRpZmYiLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRfKX0sCisJCQkJCSAgICAgICAgZXNjX2h0bWwoc3Vic3RyKCRfLCAwLCA3KSkpOworCQkJCX0gQHskY297J3BhcmVudHMnfX0gKSAuCisJCQkJJyknOworCQl9CisJfQorCisJbXkgJGhhc2hfcGFyZW50X3BhcmFtID0gJGhhc2hfcGFyZW50OworCWlmICghZGVmaW5lZCAkaGFzaF9wYXJlbnQpIHsKKwkJJGhhc2hfcGFyZW50X3BhcmFtID0KKwkJCUB7JGNveydwYXJlbnRzJ319ID4gMSA/ICctYycgOiAkY297J3BhcmVudCd9IHx8ICctLXJvb3QnOworCX0KKworCSMgcmVhZCBjb21taXRkaWZmCisJbXkgJGZkOworCW15IEBkaWZmdHJlZTsKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJb3BlbiAkZmQsICItfCIsIGdpdF9jbWQoKSwgImRpZmYtdHJlZSIsICctcicsIEBkaWZmX29wdHMsCisJCQkiLS1uby1jb21taXQtaWQiLCAiLS1wYXRjaC13aXRoLXJhdyIsICItLWZ1bGwtaW5kZXgiLAorCQkJJGhhc2hfcGFyZW50X3BhcmFtLCAkaGFzaCwgIi0tIgorCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkbGluZTsKKwkJCSMgZW1wdHkgbGluZSBlbmRzIHJhdyBwYXJ0IG9mIGRpZmYtdHJlZSBvdXRwdXQKKwkJCWxhc3QgdW5sZXNzICRsaW5lOworCQkJcHVzaCBAZGlmZnRyZWUsIHNjYWxhciBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkbGluZSk7CisJCX0KKworCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ3BsYWluJykgeworCQlvcGVuICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZi10cmVlIiwgJy1yJywgQGRpZmZfb3B0cywKKwkJCSctcCcsICRoYXNoX3BhcmVudF9wYXJhbSwgJGhhc2gsICItLSIKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKworCX0gZWxzZSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0ZGlmZiBmb3JtYXQiKTsKKwl9CisKKwkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJbXkgJGV4cGlyZXM7CisJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCisJIyB3cml0ZSBjb21taXQgbWVzc2FnZQorCWlmICgkZm9ybWF0IGVxICdodG1sJykgeworCQlteSAkcmVmcyA9IGdpdF9nZXRfcmVmZXJlbmNlcygpOworCQlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb3snaWQnfSk7CisKKwkJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJCWdpdF9wcmludF9wYWdlX25hdignY29tbWl0ZGlmZicsJycsICRoYXNoLCRjb3sndHJlZSd9LCRoYXNoLCAkZm9ybWF0c19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYsICRoYXNoKTsKKwkJZ2l0X3ByaW50X2F1dGhvcnNoaXAoXCVjbyk7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCQlpZiAoQHskY297J2NvbW1lbnQnfX0gPiAxKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImxvZ1wiPlxuIjsKKwkJCWdpdF9wcmludF9sb2coJGNveydjb21tZW50J30sIC1maW5hbF9lbXB0eV9saW5lPT4gMSwgLXJlbW92ZV90aXRsZSA9PiAxKTsKKwkJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9ImxvZyIKKwkJfQorCisJfSBlbHNpZiAoJGZvcm1hdCBlcSAncGxhaW4nKSB7CisJCW15ICRyZWZzID0gZ2l0X2dldF9yZWZlcmVuY2VzKCJ0YWdzIik7CisJCW15ICR0YWduYW1lID0gZ2l0X2dldF9yZXZfbmFtZV90YWdzKCRoYXNoKTsKKwkJbXkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHByb2plY3QpIC4gIi0kaGFzaC5wYXRjaCI7CisKKwkJcHJpbnQgJGNnaS0+aGVhZGVyKAorCQkJLXR5cGUgPT4gJ3RleHQvcGxhaW4nLAorCQkJLWNoYXJzZXQgPT4gJ3V0Zi04JywKKwkJCS1leHBpcmVzID0+ICRleHBpcmVzLAorCQkJLWNvbnRlbnRfZGlzcG9zaXRpb24gPT4gJ2lubGluZTsgZmlsZW5hbWU9IicgLiAiJGZpbGVuYW1lIiAuICciJyk7CisJCW15ICVhZCA9IHBhcnNlX2RhdGUoJGNveydhdXRob3JfZXBvY2gnfSwgJGNveydhdXRob3JfdHonfSk7CisJCXByaW50IDw8VEVYVDsKK0Zyb206ICRjb3snYXV0aG9yJ30KK0RhdGU6ICRhZHsncmZjMjgyMid9ICgkYWR7J3R6X2xvY2FsJ30pCitTdWJqZWN0OiAkY297J3RpdGxlJ30KK1RFWFQKKwkJcHJpbnQgIlgtR2l0LVRhZzogJHRhZ25hbWVcbiIgaWYgJHRhZ25hbWU7CisJCXByaW50ICJYLUdpdC1Vcmw6ICIgLiAkY2dpLT5zZWxmX3VybCgpIC4gIlxuXG4iOworCisJCWZvcmVhY2ggbXkgJGxpbmUgKEB7JGNveydjb21tZW50J319KSB7CisJCQlwcmludCAiJGxpbmVcbiI7CisJCX0KKwkJcHJpbnQgIi0tLVxuXG4iOworCX0KKworCSMgd3JpdGUgcGF0Y2gKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJZ2l0X2RpZmZ0cmVlX2JvZHkoXEBkaWZmdHJlZSwgJGhhc2gsICRoYXNoX3BhcmVudCB8fCBAeyRjb3sncGFyZW50cyd9fSk7CisJCXByaW50ICI8YnIvPlxuIjsKKworCQlnaXRfcGF0Y2hzZXRfYm9keSgkZmQsIFxAZGlmZnRyZWUsICRoYXNoLCAkaGFzaF9wYXJlbnQgfHwgQHskY297J3BhcmVudHMnfX0pOworCQljbG9zZSAkZmQ7CisJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9InBhZ2VfYm9keSIKKwkJZ2l0X2Zvb3Rlcl9odG1sKCk7CisKKwl9IGVsc2lmICgkZm9ybWF0IGVxICdwbGFpbicpIHsKKwkJbG9jYWwgJC8gPSB1bmRlZjsKKwkJcHJpbnQgPCRmZD47CisJCWNsb3NlICRmZAorCQkJb3IgcHJpbnQgIlJlYWRpbmcgZ2l0LWRpZmYtdHJlZSBmYWlsZWRcbiI7CisJfQorfQorCitzdWIgZ2l0X2NvbW1pdGRpZmZfcGxhaW4geworCWdpdF9jb21taXRkaWZmKCdwbGFpbicpOworfQorCitzdWIgZ2l0X2hpc3RvcnkgeworCWlmICghZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJCSRoYXNoX2Jhc2UgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRmdHlwZTsKKwlteSAlY28gPSBwYXJzZV9jb21taXQoJGhhc2hfYmFzZSk7CisJaWYgKCElY28pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBjb21taXQgb2JqZWN0Iik7CisJfQorCisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKwlteSAkbGltaXQgPSBzcHJpbnRmKCItLW1heC1jb3VudD0laSIsICgxMDAgKiAoJHBhZ2UrMSkpKTsKKworCWlmICghZGVmaW5lZCAkaGFzaCAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkaGFzaF9iYXNlLCAkZmlsZV9uYW1lKTsKKwl9CisJaWYgKGRlZmluZWQgJGhhc2gpIHsKKwkJJGZ0eXBlID0gZ2l0X2dldF90eXBlKCRoYXNoKTsKKwl9CisKKwlteSBAY29tbWl0bGlzdCA9IHBhcnNlX2NvbW1pdHMoJGhhc2hfYmFzZSwgMTAxLCAoMTAwICogJHBhZ2UpLCAiLS1mdWxsLWhpc3RvcnkiLCAkZmlsZV9uYW1lKTsKKworCW15ICRwYWdpbmdfbmF2ID0gJyc7CisJaWYgKCRwYWdlID4gMCkgeworCQkkcGFnaW5nX25hdiAuPQorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoaXN0b3J5IiwgaGFzaD0+JGhhc2gsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkgICAgICAgICJmaXJzdCIpOworCQkkcGFnaW5nX25hdiAuPSAiICZzZG90OyAiIC4KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2g9PiRoYXNoLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSwgcGFnZT0+JHBhZ2UtMSksCisJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJwIiwgLXRpdGxlID0+ICJBbHQtcCJ9LCAicHJldiIpOworCX0gZWxzZSB7CisJCSRwYWdpbmdfbmF2IC49ICJmaXJzdCI7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IHByZXYiOworCX0KKwlpZiAoJCNjb21taXRsaXN0ID49IDEwMCkgeworCQkkcGFnaW5nX25hdiAuPSAiICZzZG90OyAiIC4KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2g9PiRoYXNoLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSwgcGFnZT0+JHBhZ2UrMSksCisJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJuIiwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpOworCX0gZWxzZSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IG5leHQiOworCX0KKwlteSAkbmV4dF9saW5rID0gJyc7CisJaWYgKCQjY29tbWl0bGlzdCA+PSAxMDApIHsKKwkJJG5leHRfbGluayA9CisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlX25hbWUsIHBhZ2U9PiRwYWdlKzEpLAorCQkJICAgICAgICAgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwl9CisKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJ2hpc3RvcnknLCcnLCAkaGFzaF9iYXNlLCRjb3sndHJlZSd9LCRoYXNoX2Jhc2UsICRwYWdpbmdfbmF2KTsKKwlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAkZnR5cGUsICRoYXNoX2Jhc2UpOworCisJZ2l0X2hpc3RvcnlfYm9keShcQGNvbW1pdGxpc3QsIDAsIDk5LAorCSAgICAgICAgICAgICAgICAgJHJlZnMsICRoYXNoX2Jhc2UsICRmdHlwZSwgJG5leHRfbGluayk7CisKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9zZWFyY2ggeworCW15ICgkaGF2ZV9zZWFyY2gpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ3NlYXJjaCcpOworCWlmICghJGhhdmVfc2VhcmNoKSB7CisJCWRpZV9lcnJvcignNDAzIFBlcm1pc3Npb24gZGVuaWVkJywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisJfQorCWlmICghZGVmaW5lZCAkc2VhcmNodGV4dCkgeworCQlkaWVfZXJyb3IodW5kZWYsICJUZXh0IGZpZWxkIGVtcHR5Iik7CisJfQorCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQkkaGFzaCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwl9CisJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoKTsKKwlpZiAoISVjbykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIGNvbW1pdCBvYmplY3QiKTsKKwl9CisJaWYgKCFkZWZpbmVkICRwYWdlKSB7CisJCSRwYWdlID0gMDsKKwl9CisKKwkkc2VhcmNodHlwZSB8fD0gJ2NvbW1pdCc7CisJaWYgKCRzZWFyY2h0eXBlIGVxICdwaWNrYXhlJykgeworCQkjIHBpY2theGUgbWF5IHRha2UgYWxsIHJlc291cmNlcyBvZiB5b3VyIGJveCBhbmQgcnVuIGZvciBzZXZlcmFsIG1pbnV0ZXMKKwkJIyB3aXRoIGV2ZXJ5IHF1ZXJ5IC0gc28gZGVjaWRlIGJ5IHlvdXJzZWxmIGhvdyBwdWJsaWMgeW91IG1ha2UgdGhpcyBmZWF0dXJlCisJCW15ICgkaGF2ZV9waWNrYXhlKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdwaWNrYXhlJyk7CisJCWlmICghJGhhdmVfcGlja2F4ZSkgeworCQkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwkJfQorCX0KKwlpZiAoJHNlYXJjaHR5cGUgZXEgJ2dyZXAnKSB7CisJCW15ICgkaGF2ZV9ncmVwKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdncmVwJyk7CisJCWlmICghJGhhdmVfZ3JlcCkgeworCQkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwkJfQorCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCisJaWYgKCRzZWFyY2h0eXBlIGVxICdjb21taXQnIG9yICRzZWFyY2h0eXBlIGVxICdhdXRob3InIG9yICRzZWFyY2h0eXBlIGVxICdjb21taXR0ZXInKSB7CisJCW15ICRncmVwdHlwZTsKKwkJaWYgKCRzZWFyY2h0eXBlIGVxICdjb21taXQnKSB7CisJCQkkZ3JlcHR5cGUgPSAiLS1ncmVwPSI7CisJCX0gZWxzaWYgKCRzZWFyY2h0eXBlIGVxICdhdXRob3InKSB7CisJCQkkZ3JlcHR5cGUgPSAiLS1hdXRob3I9IjsKKwkJfSBlbHNpZiAoJHNlYXJjaHR5cGUgZXEgJ2NvbW1pdHRlcicpIHsKKwkJCSRncmVwdHlwZSA9ICItLWNvbW1pdHRlcj0iOworCQl9CisJCSRncmVwdHlwZSAuPSAkc2VhcmNoX3JlZ2V4cDsKKwkJbXkgQGNvbW1pdGxpc3QgPSBwYXJzZV9jb21taXRzKCRoYXNoLCAxMDEsICgxMDAgKiAkcGFnZSksICRncmVwdHlwZSk7CisKKwkJbXkgJHBhZ2luZ19uYXYgPSAnJzsKKwkJaWYgKCRwYWdlID4gMCkgeworCQkJJHBhZ2luZ19uYXYgLj0KKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNlYXJjaCIsIGhhc2g9PiRoYXNoLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNodGV4dD0+JHNlYXJjaHRleHQsIHNlYXJjaHR5cGU9PiRzZWFyY2h0eXBlKX0sCisJCQkJICAgICAgICAiZmlyc3QiKTsKKwkJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICIgLgorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2VhcmNoIiwgaGFzaD0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2h0ZXh0PT4kc2VhcmNodGV4dCwgc2VhcmNodHlwZT0+JHNlYXJjaHR5cGUsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBwYWdlPT4kcGFnZS0xKSwKKwkJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJwIiwgLXRpdGxlID0+ICJBbHQtcCJ9LCAicHJldiIpOworCQl9IGVsc2UgeworCQkJJHBhZ2luZ19uYXYgLj0gImZpcnN0IjsKKwkJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IHByZXYiOworCQl9CisJCWlmICgkI2NvbW1pdGxpc3QgPj0gMTAwKSB7CisJCQkkcGFnaW5nX25hdiAuPSAiICZzZG90OyAiIC4KKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNlYXJjaCIsIGhhc2g9PiRoYXNoLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNodGV4dD0+JHNlYXJjaHRleHQsIHNlYXJjaHR5cGU9PiRzZWFyY2h0eXBlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgcGFnZT0+JHBhZ2UrMSksCisJCQkJICAgICAgICAgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwkJfSBlbHNlIHsKKwkJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IG5leHQiOworCQl9CisJCW15ICRuZXh0X2xpbmsgPSAnJzsKKwkJaWYgKCQjY29tbWl0bGlzdCA+PSAxMDApIHsKKwkJCSRuZXh0X2xpbmsgPQorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2VhcmNoIiwgaGFzaD0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2h0ZXh0PT4kc2VhcmNodGV4dCwgc2VhcmNodHlwZT0+JHNlYXJjaHR5cGUsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBwYWdlPT4kcGFnZSsxKSwKKwkJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJuIiwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpOworCQl9CisKKwkJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGFzaCwkY297J3RyZWUnfSwkaGFzaCwgJHBhZ2luZ19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2gpOworCQlnaXRfc2VhcmNoX2dyZXBfYm9keShcQGNvbW1pdGxpc3QsIDAsIDk5LCAkbmV4dF9saW5rKTsKKwl9CisKKwlpZiAoJHNlYXJjaHR5cGUgZXEgJ3BpY2theGUnKSB7CisJCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2gsJGNveyd0cmVlJ30sJGhhc2gpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2gpOworCisJCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCQlteSAkYWx0ZXJuYXRlID0gMTsKKwkJJC8gPSAiXG4iOworCQlteSAkZ2l0X2NvbW1hbmQgPSBnaXRfY21kX3N0cigpOworCQlteSAkc2VhcmNocXRleHQgPSAkc2VhcmNodGV4dDsKKwkJJHNlYXJjaHF0ZXh0ID1+IHMvJy8nXFwnJy87CisJCW9wZW4gbXkgJGZkLCAiLXwiLCAiJGdpdF9jb21tYW5kIHJldi1saXN0ICRoYXNoIHwgIiAuCisJCQkiJGdpdF9jb21tYW5kIGRpZmYtdHJlZSAtciAtLXN0ZGluIC1TXCckc2VhcmNocXRleHRcJyI7CisJCXVuZGVmICVjbzsKKwkJbXkgQGZpbGVzOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJaWYgKCVjbyAmJiAkbGluZSA9fiBtL146KFswLTddezZ9KSAoWzAtN117Nn0pIChbMC05YS1mQS1GXXs0MH0pIChbMC05YS1mQS1GXXs0MH0pICguKVx0KC4qKSQvKSB7CisJCQkJbXkgJXNldDsKKwkJCQkkc2V0eydmaWxlJ30gPSAkNjsKKwkJCQkkc2V0eydmcm9tX2lkJ30gPSAkMzsKKwkJCQkkc2V0eyd0b19pZCd9ID0gJDQ7CisJCQkJJHNldHsnaWQnfSA9ICRzZXR7J3RvX2lkJ307CisJCQkJaWYgKCRzZXR7J2lkJ30gPX4gbS8wezQwfS8pIHsKKwkJCQkJJHNldHsnaWQnfSA9ICRzZXR7J2Zyb21faWQnfTsKKwkJCQl9CisJCQkJaWYgKCRzZXR7J2lkJ30gPX4gbS8wezQwfS8pIHsKKwkJCQkJbmV4dDsKKwkJCQl9CisJCQkJcHVzaCBAZmlsZXMsIFwlc2V0OworCQkJfSBlbHNpZiAoJGxpbmUgPX4gbS9eKFswLTlhLWZBLUZdezQwfSkkLyl7CisJCQkJaWYgKCVjbykgeworCQkJCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQkJCX0KKwkJCQkJJGFsdGVybmF0ZSBePSAxOworCQkJCQlwcmludCAiPHRkIHRpdGxlPVwiJGNveydhZ2Vfc3RyaW5nX2FnZSd9XCI+PGk+JGNveydhZ2Vfc3RyaW5nX2RhdGUnfTwvaT48L3RkPlxuIiAuCisJCQkJCSAgICAgICI8dGQ+PGk+IiAuIGVzY19odG1sKGNob3Bfc3RyKCRjb3snYXV0aG9yX25hbWUnfSwgMTUsIDUpKSAuICI8L2k+PC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkPiIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb3snaWQnfSksCisJCQkJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IHN1YmplY3QifSwKKwkJCQkJICAgICAgICAgICAgICBlc2NfaHRtbChjaG9wX3N0cigkY297J3RpdGxlJ30sIDUwKSkgLiAiPGJyLz4iKTsKKwkJCQkJd2hpbGUgKG15ICRzZXRyZWYgPSBzaGlmdCBAZmlsZXMpIHsKKwkJCQkJCW15ICVzZXQgPSAlJHNldHJlZjsKKwkJCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2hfYmFzZT0+JGNveydpZCd9LAorCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kc2V0eydpZCd9LCBmaWxlX25hbWU9PiRzZXR7J2ZpbGUnfSksCisJCQkJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LAorCQkJCQkJICAgICAgICAgICAgICAiPHNwYW4gY2xhc3M9XCJtYXRjaFwiPiIgLiBlc2NfcGF0aCgkc2V0eydmaWxlJ30pIC4gIjwvc3Bhbj4iKSAuCisJCQkJCQkgICAgICAiPGJyLz5cbiI7CisJCQkJCX0KKwkJCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kY297J2lkJ30pfSwgImNvbW1pdCIpIC4KKwkJCQkJICAgICAgIiB8ICIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kY297J3RyZWUnfSwgaGFzaF9iYXNlPT4kY297J2lkJ30pfSwgInRyZWUiKTsKKwkJCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCQkJICAgICAgIjwvdHI+XG4iOworCQkJCX0KKwkJCQklY28gPSBwYXJzZV9jb21taXQoJDEpOworCQkJfQorCQl9CisJCWNsb3NlICRmZDsKKworCQlwcmludCAiPC90YWJsZT5cbiI7CisJfQorCisJaWYgKCRzZWFyY2h0eXBlIGVxICdncmVwJykgeworCQlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoYXNoLCRjb3sndHJlZSd9LCRoYXNoKTsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2NvbW1pdCcsIGVzY19odG1sKCRjb3sndGl0bGUnfSksICRoYXNoKTsKKworCQlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwkJbXkgJGFsdGVybmF0ZSA9IDE7CisJCW15ICRtYXRjaGVzID0gMDsKKwkJJC8gPSAiXG4iOworCQlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAnZ3JlcCcsICctbicsICctaScsICctRScsICRzZWFyY2h0ZXh0LCAkY297J3RyZWUnfTsKKwkJbXkgJGxhc3RmaWxlID0gJyc7CisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkbGluZTsKKwkJCW15ICgkZmlsZSwgJGxubywgJGx0ZXh0LCAkYmluYXJ5KTsKKwkJCWxhc3QgaWYgKCRtYXRjaGVzKysgPiAxMDAwKTsKKwkJCWlmICgkbGluZSA9fiAvXkJpbmFyeSBmaWxlICguKykgbWF0Y2hlcyQvKSB7CisJCQkJJGZpbGUgPSAkMTsKKwkJCQkkYmluYXJ5ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJKHVuZGVmLCAkZmlsZSwgJGxubywgJGx0ZXh0KSA9IHNwbGl0KC86LywgJGxpbmUsIDQpOworCQkJfQorCQkJaWYgKCRmaWxlIG5lICRsYXN0ZmlsZSkgeworCQkJCSRsYXN0ZmlsZSBhbmQgcHJpbnQgIjwvdGQ+PC90cj5cbiI7CisJCQkJaWYgKCRhbHRlcm5hdGUrKykgeworCQkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQkJfQorCQkJCXByaW50ICI8dGQgY2xhc3M9XCJsaXN0XCI+Ii4KKwkJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JGNveydoYXNoJ30sCisJCQkJCQkJICAgICAgIGZpbGVfbmFtZT0+IiRmaWxlIiksCisJCQkJCQktY2xhc3MgPT4gImxpc3QifSwgZXNjX3BhdGgoJGZpbGUpKTsKKwkJCQlwcmludCAiPC90ZD48dGQ+XG4iOworCQkJCSRsYXN0ZmlsZSA9ICRmaWxlOworCQkJfQorCQkJaWYgKCRiaW5hcnkpIHsKKwkJCQlwcmludCAiPGRpdiBjbGFzcz1cImJpbmFyeVwiPkJpbmFyeSBmaWxlPC9kaXY+XG4iOworCQkJfSBlbHNlIHsKKwkJCQkkbHRleHQgPSB1bnRhYmlmeSgkbHRleHQpOworCQkJCWlmICgkbHRleHQgPX4gbS9eKC4qKSgkc2VhcmNodGV4dCkoLiopJC9pKSB7CisJCQkJCSRsdGV4dCA9IGVzY19odG1sKCQxLCAtbmJzcD0+MSk7CisJCQkJCSRsdGV4dCAuPSAnPHNwYW4gY2xhc3M9Im1hdGNoIj4nOworCQkJCQkkbHRleHQgLj0gZXNjX2h0bWwoJDIsIC1uYnNwPT4xKTsKKwkJCQkJJGx0ZXh0IC49ICc8L3NwYW4+JzsKKwkJCQkJJGx0ZXh0IC49IGVzY19odG1sKCQzLCAtbmJzcD0+MSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJJGx0ZXh0ID0gZXNjX2h0bWwoJGx0ZXh0LCAtbmJzcD0+MSk7CisJCQkJfQorCQkJCXByaW50ICI8ZGl2IGNsYXNzPVwicHJlXCI+IiAuCisJCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRjb3snaGFzaCd9LAorCQkJCQkJCSAgICAgICBmaWxlX25hbWU9PiIkZmlsZSIpLicjbCcuJGxubywKKwkJCQkJCS1jbGFzcyA9PiAibGluZW5yIn0sIHNwcmludGYoJyU0aScsICRsbm8pKQorCQkJCQkuICcgJyAuICAkbHRleHQgLiAiPC9kaXY+XG4iOworCQkJfQorCQl9CisJCWlmICgkbGFzdGZpbGUpIHsKKwkJCXByaW50ICI8L3RkPjwvdHI+XG4iOworCQkJaWYgKCRtYXRjaGVzID4gMTAwMCkgeworCQkJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiBub2RpZmZlcmVuY2VzXCI+VG9vIG1hbnkgbWF0Y2hlcywgbGlzdGluZyB0cmltbWVkPC9kaXY+XG4iOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJkaWZmIG5vZGlmZmVyZW5jZXNcIj5ObyBtYXRjaGVzIGZvdW5kPC9kaXY+XG4iOworCQl9CisJCWNsb3NlICRmZDsKKworCQlwcmludCAiPC90YWJsZT5cbiI7CisJfQorCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3NlYXJjaF9oZWxwIHsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoYXNoLCRoYXNoLCRoYXNoKTsKKwlwcmludCA8PEVPVDsKKzxkbD4KKzxkdD48Yj5jb21taXQ8L2I+PC9kdD4KKzxkZD5UaGUgY29tbWl0IG1lc3NhZ2VzIGFuZCBhdXRob3JzaGlwIGluZm9ybWF0aW9uIHdpbGwgYmUgc2Nhbm5lZCBmb3IgdGhlIGdpdmVuIHN0cmluZy48L2RkPgorRU9UCisJbXkgKCRoYXZlX2dyZXApID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2dyZXAnKTsKKwlpZiAoJGhhdmVfZ3JlcCkgeworCQlwcmludCA8PEVPVDsKKzxkdD48Yj5ncmVwPC9iPjwvZHQ+Cis8ZGQ+QWxsIGZpbGVzIGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdHJlZSAoSEVBRCB1bmxlc3MgeW91IGFyZSBleHBsaWNpdGx5IGJyb3dzaW5nCisgICAgYSBkaWZmZXJlbnQgb25lKSBhcmUgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbgorPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24iPnJlZ3VsYXIgZXhwcmVzc2lvbjwvYT4KKyhQT1NJWCBleHRlbmRlZCkgYW5kIHRoZSBtYXRjaGVzIGFyZSBsaXN0ZWQuIE9uIGxhcmdlCit0cmVlcywgdGhpcyBzZWFyY2ggY2FuIHRha2UgYSB3aGlsZSBhbmQgcHV0IHNvbWUgc3RyYWluIG9uIHRoZSBzZXJ2ZXIsIHNvIHBsZWFzZSB1c2UgaXQgd2l0aAorc29tZSBjb25zaWRlcmF0aW9uLjwvZGQ+CitFT1QKKwl9CisJcHJpbnQgPDxFT1Q7Cis8ZHQ+PGI+YXV0aG9yPC9iPjwvZHQ+Cis8ZGQ+TmFtZSBhbmQgZS1tYWlsIG9mIHRoZSBjaGFuZ2UgYXV0aG9yIGFuZCBkYXRlIG9mIGJpcnRoIG9mIHRoZSBwYXRjaCB3aWxsIGJlIHNjYW5uZWQgZm9yIHRoZSBnaXZlbiBzdHJpbmcuPC9kZD4KKzxkdD48Yj5jb21taXR0ZXI8L2I+PC9kdD4KKzxkZD5OYW1lIGFuZCBlLW1haWwgb2YgdGhlIGNvbW1pdHRlciBhbmQgZGF0ZSBvZiBjb21taXQgd2lsbCBiZSBzY2FubmVkIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLjwvZGQ+CitFT1QKKwlteSAoJGhhdmVfcGlja2F4ZSkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgncGlja2F4ZScpOworCWlmICgkaGF2ZV9waWNrYXhlKSB7CisJCXByaW50IDw8RU9UOworPGR0PjxiPnBpY2theGU8L2I+PC9kdD4KKzxkZD5BbGwgY29tbWl0cyB0aGF0IGNhdXNlZCB0aGUgc3RyaW5nIHRvIGFwcGVhciBvciBkaXNhcHBlYXIgZnJvbSBhbnkgZmlsZSAoY2hhbmdlcyB0aGF0CithZGRlZCwgcmVtb3ZlZCBvciAibW9kaWZpZWQiIHRoZSBzdHJpbmcpIHdpbGwgYmUgbGlzdGVkLiBUaGlzIHNlYXJjaCBjYW4gdGFrZSBhIHdoaWxlIGFuZAordGFrZXMgYSBsb3Qgb2Ygc3RyYWluIG9uIHRoZSBzZXJ2ZXIsIHNvIHBsZWFzZSB1c2UgaXQgd2lzZWx5LjwvZGQ+CitFT1QKKwl9CisJcHJpbnQgIjwvZGw+XG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3Nob3J0bG9nIHsKKwlteSAkaGVhZCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSAkaGVhZDsKKwl9CisJaWYgKCFkZWZpbmVkICRwYWdlKSB7CisJCSRwYWdlID0gMDsKKwl9CisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKworCW15IEBjb21taXRsaXN0ID0gcGFyc2VfY29tbWl0cygkaGFzaCwgMTAxLCAoMTAwICogJHBhZ2UpKTsKKworCW15ICRwYWdpbmdfbmF2ID0gZm9ybWF0X3BhZ2luZ19uYXYoJ3Nob3J0bG9nJywgJGhhc2gsICRoZWFkLCAkcGFnZSwgKDEwMCAqICgkcGFnZSsxKSkpOworCW15ICRuZXh0X2xpbmsgPSAnJzsKKwlpZiAoJCNjb21taXRsaXN0ID49IDEwMCkgeworCQkkbmV4dF9saW5rID0KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kaGFzaCwgcGFnZT0+JHBhZ2UrMSksCisJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJuIiwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpOworCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignc2hvcnRsb2cnLCcnLCAkaGFzaCwkaGFzaCwkaGFzaCwgJHBhZ2luZ19uYXYpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdzdW1tYXJ5JywgJHByb2plY3QpOworCisJZ2l0X3Nob3J0bG9nX2JvZHkoXEBjb21taXRsaXN0LCAwLCA5OSwgJHJlZnMsICRuZXh0X2xpbmspOworCisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKKyMjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyMjIGZlZWRzIChSU1MsIEF0b207IE9QTUwpCisKK3N1YiBnaXRfZmVlZCB7CisJbXkgJGZvcm1hdCA9IHNoaWZ0IHx8ICdhdG9tJzsKKwlteSAoJGhhdmVfYmxhbWUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2JsYW1lJyk7CisKKwkjIEF0b206IGh0dHA6Ly93d3cuYXRvbWVuYWJsZWQub3JnL2RldmVsb3BlcnMvc3luZGljYXRpb24vCisJIyBSU1M6ICBodHRwOi8vd3d3Lm5vdGVzdGlwcy5jb20vODAyNTZCM0EwMDdGMjY5Mi8xL05BTU81UDlVUFEKKwlpZiAoJGZvcm1hdCBuZSAncnNzJyAmJiAkZm9ybWF0IG5lICdhdG9tJykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIHdlYiBmZWVkIGZvcm1hdCIpOworCX0KKworCSMgbG9nL2ZlZWQgb2YgY3VycmVudCAoSEVBRCkgYnJhbmNoLCBsb2cgb2YgZ2l2ZW4gYnJhbmNoLCBoaXN0b3J5IG9mIGZpbGUvZGlyZWN0b3J5CisJbXkgJGhlYWQgPSAkaGFzaCB8fCAnSEVBRCc7CisJbXkgQGNvbW1pdGxpc3QgPSBwYXJzZV9jb21taXRzKCRoZWFkLCAxNTApOworCisJbXkgJWxhdGVzdF9jb21taXQ7CisJbXkgJWxhdGVzdF9kYXRlOworCW15ICRjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vJGZvcm1hdCt4bWwiOworCWlmIChkZWZpbmVkICRjZ2ktPmh0dHAoJ0hUVFBfQUNDRVBUJykgJiYKKwkJICRjZ2ktPkFjY2VwdCgndGV4dC94bWwnKSA+ICRjZ2ktPkFjY2VwdCgkY29udGVudF90eXBlKSkgeworCQkjIGJyb3dzZXIgKGZlZWQgcmVhZGVyKSBwcmVmZXJzIHRleHQveG1sCisJCSRjb250ZW50X3R5cGUgPSAndGV4dC94bWwnOworCX0KKwlpZiAoZGVmaW5lZCgkY29tbWl0bGlzdFswXSkpIHsKKwkJJWxhdGVzdF9jb21taXQgPSAleyRjb21taXRsaXN0WzBdfTsKKwkJJWxhdGVzdF9kYXRlICAgPSBwYXJzZV9kYXRlKCRsYXRlc3RfY29tbWl0eydhdXRob3JfZXBvY2gnfSk7CisJCXByaW50ICRjZ2ktPmhlYWRlcigKKwkJCS10eXBlID0+ICRjb250ZW50X3R5cGUsCisJCQktY2hhcnNldCA9PiAndXRmLTgnLAorCQkJLWxhc3RfbW9kaWZpZWQgPT4gJGxhdGVzdF9kYXRleydyZmMyODIyJ30pOworCX0gZWxzZSB7CisJCXByaW50ICRjZ2ktPmhlYWRlcigKKwkJCS10eXBlID0+ICRjb250ZW50X3R5cGUsCisJCQktY2hhcnNldCA9PiAndXRmLTgnKTsKKwl9CisKKwkjIE9wdGltaXphdGlvbjogc2tpcCBnZW5lcmF0aW5nIHRoZSBib2R5IGlmIGNsaWVudCBhc2tzIG9ubHkKKwkjIGZvciBMYXN0LU1vZGlmaWVkIGRhdGUuCisJcmV0dXJuIGlmICgkY2dpLT5yZXF1ZXN0X21ldGhvZCgpIGVxICdIRUFEJyk7CisKKwkjIGhlYWRlciB2YXJpYWJsZXMKKwlteSAkdGl0bGUgPSAiJHNpdGVfbmFtZSAtICRwcm9qZWN0LyRhY3Rpb24iOworCW15ICRmZWVkX3R5cGUgPSAnbG9nJzsKKwlpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkkdGl0bGUgLj0gIiAtICckaGFzaCciOworCQkkZmVlZF90eXBlID0gJ2JyYW5jaCBsb2cnOworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQkkdGl0bGUgLj0gIiA6OiAkZmlsZV9uYW1lIjsKKwkJCSRmZWVkX3R5cGUgPSAnaGlzdG9yeSc7CisJCX0KKwl9IGVsc2lmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJHRpdGxlIC49ICIgLSAkZmlsZV9uYW1lIjsKKwkJJGZlZWRfdHlwZSA9ICdoaXN0b3J5JzsKKwl9CisJJHRpdGxlIC49ICIgJGZlZWRfdHlwZSI7CisJbXkgJGRlc2NyID0gZ2l0X2dldF9wcm9qZWN0X2Rlc2NyaXB0aW9uKCRwcm9qZWN0KTsKKwlpZiAoZGVmaW5lZCAkZGVzY3IpIHsKKwkJJGRlc2NyID0gZXNjX2h0bWwoJGRlc2NyKTsKKwl9IGVsc2UgeworCQkkZGVzY3IgPSAiJHByb2plY3QgIiAuCisJCSAgICAgICAgICgkZm9ybWF0IGVxICdyc3MnID8gJ1JTUycgOiAnQXRvbScpIC4KKwkJICAgICAgICAgIiBmZWVkIjsKKwl9CisJbXkgJG93bmVyID0gZ2l0X2dldF9wcm9qZWN0X293bmVyKCRwcm9qZWN0KTsKKwkkb3duZXIgPSBlc2NfaHRtbCgkb3duZXIpOworCisJI2hlYWRlcgorCW15ICRhbHRfdXJsOworCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGFsdF91cmwgPSBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJoaXN0b3J5IiwgaGFzaD0+JGhhc2gsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSk7CisJfSBlbHNpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkkYWx0X3VybCA9IGhyZWYoLWZ1bGw9PjEsIGFjdGlvbj0+ImxvZyIsIGhhc2g9PiRoYXNoKTsKKwl9IGVsc2UgeworCQkkYWx0X3VybCA9IGhyZWYoLWZ1bGw9PjEsIGFjdGlvbj0+InN1bW1hcnkiKTsKKwl9CisJcHJpbnQgcXEhPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz5cbiE7CisJaWYgKCRmb3JtYXQgZXEgJ3JzcycpIHsKKwkJcHJpbnQgPDxYTUw7Cis8cnNzIHZlcnNpb249IjIuMCIgeG1sbnM6Y29udGVudD0iaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvbW9kdWxlcy9jb250ZW50LyI+Cis8Y2hhbm5lbD4KK1hNTAorCQlwcmludCAiPHRpdGxlPiR0aXRsZTwvdGl0bGU+XG4iIC4KKwkJICAgICAgIjxsaW5rPiRhbHRfdXJsPC9saW5rPlxuIiAuCisJCSAgICAgICI8ZGVzY3JpcHRpb24+JGRlc2NyPC9kZXNjcmlwdGlvbj5cbiIgLgorCQkgICAgICAiPGxhbmd1YWdlPmVuPC9sYW5ndWFnZT5cbiI7CisJfSBlbHNpZiAoJGZvcm1hdCBlcSAnYXRvbScpIHsKKwkJcHJpbnQgPDxYTUw7Cis8ZmVlZCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIj4KK1hNTAorCQlwcmludCAiPHRpdGxlPiR0aXRsZTwvdGl0bGU+XG4iIC4KKwkJICAgICAgIjxzdWJ0aXRsZT4kZGVzY3I8L3N1YnRpdGxlPlxuIiAuCisJCSAgICAgICc8bGluayByZWw9ImFsdGVybmF0ZSIgdHlwZT0idGV4dC9odG1sIiBocmVmPSInIC4KKwkJICAgICAgJGFsdF91cmwgLiAnIiAvPicgLiAiXG4iIC4KKwkJICAgICAgJzxsaW5rIHJlbD0ic2VsZiIgdHlwZT0iJyAuICRjb250ZW50X3R5cGUgLiAnIiBocmVmPSInIC4KKwkJICAgICAgJGNnaS0+c2VsZl91cmwoKSAuICciIC8+JyAuICJcbiIgLgorCQkgICAgICAiPGlkPiIgLiBocmVmKC1mdWxsPT4xKSAuICI8L2lkPlxuIiAuCisJCSAgICAgICMgdXNlIHByb2plY3Qgb3duZXIgZm9yIGZlZWQgYXV0aG9yCisJCSAgICAgICI8YXV0aG9yPjxuYW1lPiRvd25lcjwvbmFtZT48L2F1dGhvcj5cbiI7CisJCWlmIChkZWZpbmVkICRmYXZpY29uKSB7CisJCQlwcmludCAiPGljb24+IiAuIGVzY191cmwoJGZhdmljb24pIC4gIjwvaWNvbj5cbiI7CisJCX0KKwkJaWYgKGRlZmluZWQgJGxvZ29fdXJsKSB7CisJCQkjIG5vdCB0d2ljZSBhcyB3aWRlIGFzIHRhbGw6IDcyIHggMjcgcGl4ZWxzCisJCQlwcmludCAiPGxvZ28+IiAuIGVzY191cmwoJGxvZ28pIC4gIjwvbG9nbz5cbiI7CisJCX0KKwkJaWYgKCEgJWxhdGVzdF9kYXRlKSB7CisJCQkjIGR1bW15IGRhdGUgdG8ga2VlcCB0aGUgZmVlZCB2YWxpZCB1bnRpbCBjb21taXRzIHRyaWNrbGUgaW46CisJCQlwcmludCAiPHVwZGF0ZWQ+MTk3MC0wMS0wMVQwMDowMDowMFo8L3VwZGF0ZWQ+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx1cGRhdGVkPiRsYXRlc3RfZGF0ZXsnaXNvLTg2MDEnfTwvdXBkYXRlZD5cbiI7CisJCX0KKwl9CisKKwkjIGNvbnRlbnRzCisJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjY29tbWl0bGlzdDsgJGkrKykgeworCQlteSAlY28gPSAleyRjb21taXRsaXN0WyRpXX07CisJCW15ICRjb21taXQgPSAkY297J2lkJ307CisJCSMgd2UgcmVhZCAxNTAsIHdlIGFsd2F5cyBzaG93IDMwIGFuZCB0aGUgb25lcyBtb3JlIHJlY2VudCB0aGFuIDQ4IGhvdXJzCisJCWlmICgoJGkgPj0gMjApICYmICgodGltZSAtICRjb3snYXV0aG9yX2Vwb2NoJ30pID4gNDgqNjAqNjApKSB7CisJCQlsYXN0OworCQl9CisJCW15ICVjZCA9IHBhcnNlX2RhdGUoJGNveydhdXRob3JfZXBvY2gnfSk7CisKKwkJIyBnZXQgbGlzdCBvZiBjaGFuZ2VkIGZpbGVzCisJCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCBAZGlmZl9vcHRzLAorCQkJJGNveydwYXJlbnQnfSB8fCAiLS1yb290IiwKKwkJCSRjb3snaWQnfSwgIi0tIiwgKGRlZmluZWQgJGZpbGVfbmFtZSA/ICRmaWxlX25hbWUgOiAoKSkKKwkJCW9yIG5leHQ7CisJCW15IEBkaWZmdHJlZSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCQljbG9zZSAkZmQKKwkJCW9yIG5leHQ7CisKKwkJIyBwcmludCBlbGVtZW50IChlbnRyeSwgaXRlbSkKKwkJbXkgJGNvX3VybCA9IGhyZWYoLWZ1bGw9PjEsIGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb21taXQpOworCQlpZiAoJGZvcm1hdCBlcSAncnNzJykgeworCQkJcHJpbnQgIjxpdGVtPlxuIiAuCisJCQkgICAgICAiPHRpdGxlPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gIjwvdGl0bGU+XG4iIC4KKwkJCSAgICAgICI8YXV0aG9yPiIgLiBlc2NfaHRtbCgkY297J2F1dGhvcid9KSAuICI8L2F1dGhvcj5cbiIgLgorCQkJICAgICAgIjxwdWJEYXRlPiRjZHsncmZjMjgyMid9PC9wdWJEYXRlPlxuIiAuCisJCQkgICAgICAiPGd1aWQgaXNQZXJtYUxpbms9XCJ0cnVlXCI+JGNvX3VybDwvZ3VpZD5cbiIgLgorCQkJICAgICAgIjxsaW5rPiRjb191cmw8L2xpbms+XG4iIC4KKwkJCSAgICAgICI8ZGVzY3JpcHRpb24+IiAuIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAiPC9kZXNjcmlwdGlvbj5cbiIgLgorCQkJICAgICAgIjxjb250ZW50OmVuY29kZWQ+IiAuCisJCQkgICAgICAiPCFbQ0RBVEFbXG4iOworCQl9IGVsc2lmICgkZm9ybWF0IGVxICdhdG9tJykgeworCQkJcHJpbnQgIjxlbnRyeT5cbiIgLgorCQkJICAgICAgIjx0aXRsZSB0eXBlPVwiaHRtbFwiPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gIjwvdGl0bGU+XG4iIC4KKwkJCSAgICAgICI8dXBkYXRlZD4kY2R7J2lzby04NjAxJ308L3VwZGF0ZWQ+XG4iIC4KKwkJCSAgICAgICI8YXV0aG9yPlxuIiAuCisJCQkgICAgICAiICA8bmFtZT4iIC4gZXNjX2h0bWwoJGNveydhdXRob3JfbmFtZSd9KSAuICI8L25hbWU+XG4iOworCQkJaWYgKCRjb3snYXV0aG9yX2VtYWlsJ30pIHsKKwkJCQlwcmludCAiICA8ZW1haWw+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yX2VtYWlsJ30pIC4gIjwvZW1haWw+XG4iOworCQkJfQorCQkJcHJpbnQgIjwvYXV0aG9yPlxuIiAuCisJCQkgICAgICAjIHVzZSBjb21taXR0ZXIgZm9yIGNvbnRyaWJ1dG9yCisJCQkgICAgICAiPGNvbnRyaWJ1dG9yPlxuIiAuCisJCQkgICAgICAiICA8bmFtZT4iIC4gZXNjX2h0bWwoJGNveydjb21taXR0ZXJfbmFtZSd9KSAuICI8L25hbWU+XG4iOworCQkJaWYgKCRjb3snY29tbWl0dGVyX2VtYWlsJ30pIHsKKwkJCQlwcmludCAiICA8ZW1haWw+IiAuIGVzY19odG1sKCRjb3snY29tbWl0dGVyX2VtYWlsJ30pIC4gIjwvZW1haWw+XG4iOworCQkJfQorCQkJcHJpbnQgIjwvY29udHJpYnV0b3I+XG4iIC4KKwkJCSAgICAgICI8cHVibGlzaGVkPiRjZHsnaXNvLTg2MDEnfTwvcHVibGlzaGVkPlxuIiAuCisJCQkgICAgICAiPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgdHlwZT1cInRleHQvaHRtbFwiIGhyZWY9XCIkY29fdXJsXCIgLz5cbiIgLgorCQkJICAgICAgIjxpZD4kY29fdXJsPC9pZD5cbiIgLgorCQkJICAgICAgIjxjb250ZW50IHR5cGU9XCJ4aHRtbFwiIHhtbDpiYXNlPVwiIiAuIGVzY191cmwoJG15X3VybCkgLiAiXCI+XG4iIC4KKwkJCSAgICAgICI8ZGl2IHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPlxuIjsKKwkJfQorCQlteSAkY29tbWVudCA9ICRjb3snY29tbWVudCd9OworCQlwcmludCAiPHByZT5cbiI7CisJCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQkJJGxpbmUgPSBlc2NfaHRtbCgkbGluZSk7CisJCQlwcmludCAiJGxpbmVcbiI7CisJCX0KKwkJcHJpbnQgIjwvcHJlPjx1bD5cbiI7CisJCWZvcmVhY2ggbXkgJGRpZmZ0cmVlX2xpbmUgKEBkaWZmdHJlZSkgeworCQkJbXkgJWRpZmZ0cmVlID0gcGFyc2VfZGlmZnRyZWVfcmF3X2xpbmUoJGRpZmZ0cmVlX2xpbmUpOworCQkJbmV4dCBpZiAhJGRpZmZ0cmVleydmcm9tX2lkJ307CisKKwkJCW15ICRmaWxlID0gJGRpZmZ0cmVleydmaWxlJ30gfHwgJGRpZmZ0cmVleyd0b19maWxlJ307CisKKwkJCXByaW50ICI8bGk+IiAuCisJCQkgICAgICAiWyIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZigtZnVsbD0+MSwgYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZnRyZWV7J3RvX2lkJ30sIGhhc2hfcGFyZW50PT4kZGlmZnRyZWV7J2Zyb21faWQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kY297J2lkJ30sIGhhc2hfcGFyZW50X2Jhc2U9PiRjb3sncGFyZW50J30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGUsIGZpbGVfcGFyZW50PT4kZGlmZnRyZWV7J2Zyb21fZmlsZSd9KSwKKwkJCSAgICAgICAgICAgICAgLXRpdGxlID0+ICJkaWZmIn0sICdEJyk7CisJCQlpZiAoJGhhdmVfYmxhbWUpIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJibGFtZSIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlLCBoYXNoX2Jhc2U9PiRjb21taXQpLAorCQkJCSAgICAgICAgICAgICAgLXRpdGxlID0+ICJibGFtZSJ9LCAnQicpOworCQkJfQorCQkJIyBpZiB0aGlzIGlzIG5vdCBhIGZlZWQgb2YgYSBmaWxlIGhpc3RvcnkKKwkJCWlmICghZGVmaW5lZCAkZmlsZV9uYW1lIHx8ICRmaWxlX25hbWUgbmUgJGZpbGUpIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJoaXN0b3J5IiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGUsIGhhc2g9PiRjb21taXQpLAorCQkJCSAgICAgICAgICAgICAgLXRpdGxlID0+ICJoaXN0b3J5In0sICdIJyk7CisJCQl9CisJCQkkZmlsZSA9IGVzY19wYXRoKCRmaWxlKTsKKwkJCXByaW50ICJdICIuCisJCQkgICAgICAiJGZpbGU8L2xpPlxuIjsKKwkJfQorCQlpZiAoJGZvcm1hdCBlcSAncnNzJykgeworCQkJcHJpbnQgIjwvdWw+XV0+XG4iIC4KKwkJCSAgICAgICI8L2NvbnRlbnQ6ZW5jb2RlZD5cbiIgLgorCQkJICAgICAgIjwvaXRlbT5cbiI7CisJCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ2F0b20nKSB7CisJCQlwcmludCAiPC91bD5cbjwvZGl2PlxuIiAuCisJCQkgICAgICAiPC9jb250ZW50PlxuIiAuCisJCQkgICAgICAiPC9lbnRyeT5cbiI7CisJCX0KKwl9CisKKwkjIGVuZCBvZiBmZWVkCisJaWYgKCRmb3JtYXQgZXEgJ3JzcycpIHsKKwkJcHJpbnQgIjwvY2hhbm5lbD5cbjwvcnNzPlxuIjsKKwl9CWVsc2lmICgkZm9ybWF0IGVxICdhdG9tJykgeworCQlwcmludCAiPC9mZWVkPlxuIjsKKwl9Cit9CisKK3N1YiBnaXRfcnNzIHsKKwlnaXRfZmVlZCgncnNzJyk7Cit9CisKK3N1YiBnaXRfYXRvbSB7CisJZ2l0X2ZlZWQoJ2F0b20nKTsKK30KKworc3ViIGdpdF9vcG1sIHsKKwlteSBAbGlzdCA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgpOworCisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlID0+ICd0ZXh0L3htbCcsIC1jaGFyc2V0ID0+ICd1dGYtOCcpOworCXByaW50IDw8WE1MOworPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxvcG1sIHZlcnNpb249IjEuMCI+Cis8aGVhZD4KKyAgPHRpdGxlPiRzaXRlX25hbWUgT1BNTCBFeHBvcnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8b3V0bGluZSB0ZXh0PSJnaXQgUlNTIGZlZWRzIj4KK1hNTAorCisJZm9yZWFjaCBteSAkcHIgKEBsaXN0KSB7CisJCW15ICVwcm9qID0gJSRwcjsKKwkJbXkgJGhlYWQgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvansncGF0aCd9KTsKKwkJaWYgKCFkZWZpbmVkICRoZWFkKSB7CisJCQluZXh0OworCQl9CisJCSRnaXRfZGlyID0gIiRwcm9qZWN0cm9vdC8kcHJvansncGF0aCd9IjsKKwkJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoZWFkKTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKworCQlteSAkcGF0aCA9IGVzY19odG1sKGNob3Bfc3RyKCRwcm9qeydwYXRoJ30sIDI1LCA1KSk7CisJCW15ICRyc3MgID0gIiRteV91cmw/cD0kcHJvansncGF0aCd9O2E9cnNzIjsKKwkJbXkgJGh0bWwgPSAiJG15X3VybD9wPSRwcm9qeydwYXRoJ307YT1zdW1tYXJ5IjsKKwkJcHJpbnQgIjxvdXRsaW5lIHR5cGU9XCJyc3NcIiB0ZXh0PVwiJHBhdGhcIiB0aXRsZT1cIiRwYXRoXCIgeG1sVXJsPVwiJHJzc1wiIGh0bWxVcmw9XCIkaHRtbFwiLz5cbiI7CisJfQorCXByaW50IDw8WE1MOworPC9vdXRsaW5lPgorPC9ib2R5PgorPC9vcG1sPgorWE1MCit9CmRpZmYgLS1naXQgImEvZ2l0d2ViL3Rlc3QvTVwzMDNcMjQ0cmNoZW4iICJiL2dpdHdlYi90ZXN0L01cMzAzXDI0NHJjaGVuIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdhMWQzCi0tLSAvZGV2L251bGwKKysrICJiL2dpdHdlYi90ZXN0L01cMzAzXDI0NHJjaGVuIgpAQCAtMCwwICsxLDIgQEAKK03DpHJjaGVuCitN5HJjaGVuCmRpZmYgLS1naXQgYS9naXR3ZWIvdGVzdC9maWxlIHdpdGggc3BhY2VzIGIvZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA4NTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcwpAQCAtMCwwICsxLDQgQEAKK1RoaXMKK2ZpbGVuYW1lCitjb250YWlucworc3BhY2VzLgpkaWZmIC0tZ2l0IGEvZ2l0d2ViL3Rlc3QvZmlsZStwbHVzK3NpZ24gYi9naXR3ZWIvdGVzdC9maWxlK3BsdXMrc2lnbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA1Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL3Rlc3QvZmlsZStwbHVzK3NpZ24KQEAgLTAsMCArMSw2IEBACitUaGlzCitmaWxlbmFtZQorY29udGFpbnMKKysKK3BsdXMKK2NoYXJzLgpkaWZmIC0tZ2l0IGEvZ3JlcC5jIGIvZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2Q2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmVwLmMKQEAgLTAsMCArMSw1NjUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImdyZXAuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKwordm9pZCBhcHBlbmRfZ3JlcF9wYXR0ZXJuKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICpwYXQsCisJCQkgY29uc3QgY2hhciAqb3JpZ2luLCBpbnQgbm8sIGVudW0gZ3JlcF9wYXRfdG9rZW4gdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnAgPSB4Y2FsbG9jKDEsIHNpemVvZigqcCkpOworCXAtPnBhdHRlcm4gPSBwYXQ7CisJcC0+b3JpZ2luID0gb3JpZ2luOworCXAtPm5vID0gbm87CisJcC0+dG9rZW4gPSB0OworCSpvcHQtPnBhdHRlcm5fdGFpbCA9IHA7CisJb3B0LT5wYXR0ZXJuX3RhaWwgPSAmcC0+bmV4dDsKKwlwLT5uZXh0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY29tcGlsZV9yZWdleHAoc3RydWN0IGdyZXBfcGF0ICpwLCBzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCkKK3sKKwlpbnQgZXJyID0gcmVnY29tcCgmcC0+cmVnZXhwLCBwLT5wYXR0ZXJuLCBvcHQtPnJlZ2ZsYWdzKTsKKwlpZiAoZXJyKSB7CisJCWNoYXIgZXJyYnVmWzEwMjRdOworCQljaGFyIHdoZXJlWzEwMjRdOworCQlpZiAocC0+bm8pCisJCQlzcHJpbnRmKHdoZXJlLCAiSW4gJyVzJyBhdCAlZCwgIiwKKwkJCQlwLT5vcmlnaW4sIHAtPm5vKTsKKwkJZWxzZSBpZiAocC0+b3JpZ2luKQorCQkJc3ByaW50Zih3aGVyZSwgIiVzLCAiLCBwLT5vcmlnaW4pOworCQllbHNlCisJCQl3aGVyZVswXSA9IDA7CisJCXJlZ2Vycm9yKGVyciwgJnAtPnJlZ2V4cCwgZXJyYnVmLCAxMDI0KTsKKwkJcmVnZnJlZSgmcC0+cmVnZXhwKTsKKwkJZGllKCIlcyclcyc6ICVzIiwgd2hlcmUsIHAtPnBhdHRlcm4sIGVycmJ1Zik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX29yKHN0cnVjdCBncmVwX3BhdCAqKik7CitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX2F0b20oc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeDsKKworCXAgPSAqbGlzdDsKKwlzd2l0Y2ggKHAtPnRva2VuKSB7CisJY2FzZSBHUkVQX1BBVFRFUk46IC8qIGF0b20gKi8KKwljYXNlIEdSRVBfUEFUVEVSTl9IRUFEOgorCWNhc2UgR1JFUF9QQVRURVJOX0JPRFk6CisJCXggPSB4Y2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IGdyZXBfZXhwcikpOworCQl4LT5ub2RlID0gR1JFUF9OT0RFX0FUT007CisJCXgtPnUuYXRvbSA9IHA7CisJCSpsaXN0ID0gcC0+bmV4dDsKKwkJcmV0dXJuIHg7CisJY2FzZSBHUkVQX09QRU5fUEFSRU46CisJCSpsaXN0ID0gcC0+bmV4dDsKKwkJeCA9IGNvbXBpbGVfcGF0dGVybl9vcihsaXN0KTsKKwkJaWYgKCF4KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghKmxpc3QgfHwgKCpsaXN0KS0+dG9rZW4gIT0gR1JFUF9DTE9TRV9QQVJFTikKKwkJCWRpZSgidW5tYXRjaGVkIHBhcmVudGhlc2lzIik7CisJCSpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKwkJcmV0dXJuIHg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX25vdChzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlzdHJ1Y3QgZ3JlcF9leHByICp4OworCisJcCA9ICpsaXN0OworCXN3aXRjaCAocC0+dG9rZW4pIHsKKwljYXNlIEdSRVBfTk9UOgorCQlpZiAoIXAtPm5leHQpCisJCQlkaWUoIi0tbm90IG5vdCBmb2xsb3dlZCBieSBwYXR0ZXJuIGV4cHJlc3Npb24iKTsKKwkJKmxpc3QgPSBwLT5uZXh0OworCQl4ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJeC0+bm9kZSA9IEdSRVBfTk9ERV9OT1Q7CisJCXgtPnUudW5hcnkgPSBjb21waWxlX3BhdHRlcm5fbm90KGxpc3QpOworCQlpZiAoIXgtPnUudW5hcnkpCisJCQlkaWUoIi0tbm90IGZvbGxvd2VkIGJ5IG5vbiBwYXR0ZXJuIGV4cHJlc3Npb24iKTsKKwkJcmV0dXJuIHg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGNvbXBpbGVfcGF0dGVybl9hdG9tKGxpc3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9hbmQoc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeCwgKnksICp6OworCisJeCA9IGNvbXBpbGVfcGF0dGVybl9ub3QobGlzdCk7CisJcCA9ICpsaXN0OworCWlmIChwICYmIHAtPnRva2VuID09IEdSRVBfQU5EKSB7CisJCWlmICghcC0+bmV4dCkKKwkJCWRpZSgiLS1hbmQgbm90IGZvbGxvd2VkIGJ5IHBhdHRlcm4gZXhwcmVzc2lvbiIpOworCQkqbGlzdCA9IHAtPm5leHQ7CisJCXkgPSBjb21waWxlX3BhdHRlcm5fYW5kKGxpc3QpOworCQlpZiAoIXkpCisJCQlkaWUoIi0tYW5kIG5vdCBmb2xsb3dlZCBieSBwYXR0ZXJuIGV4cHJlc3Npb24iKTsKKwkJeiA9IHhjYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgZ3JlcF9leHByKSk7CisJCXotPm5vZGUgPSBHUkVQX05PREVfQU5EOworCQl6LT51LmJpbmFyeS5sZWZ0ID0geDsKKwkJei0+dS5iaW5hcnkucmlnaHQgPSB5OworCQlyZXR1cm4gejsKKwl9CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3JlcF9leHByICpjb21waWxlX3BhdHRlcm5fb3Ioc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeCwgKnksICp6OworCisJeCA9IGNvbXBpbGVfcGF0dGVybl9hbmQobGlzdCk7CisJcCA9ICpsaXN0OworCWlmICh4ICYmIHAgJiYgcC0+dG9rZW4gIT0gR1JFUF9DTE9TRV9QQVJFTikgeworCQl5ID0gY29tcGlsZV9wYXR0ZXJuX29yKGxpc3QpOworCQlpZiAoIXkpCisJCQlkaWUoIm5vdCBhIHBhdHRlcm4gZXhwcmVzc2lvbiAlcyIsIHAtPnBhdHRlcm4pOworCQl6ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJei0+bm9kZSA9IEdSRVBfTk9ERV9PUjsKKwkJei0+dS5iaW5hcnkubGVmdCA9IHg7CisJCXotPnUuYmluYXJ5LnJpZ2h0ID0geTsKKwkJcmV0dXJuIHo7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX2V4cHIoc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlyZXR1cm4gY29tcGlsZV9wYXR0ZXJuX29yKGxpc3QpOworfQorCit2b2lkIGNvbXBpbGVfZ3JlcF9wYXR0ZXJucyhzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisKKwlpZiAob3B0LT5hbGxfbWF0Y2gpCisJCW9wdC0+ZXh0ZW5kZWQgPSAxOworCisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN3aXRjaCAocC0+dG9rZW4pIHsKKwkJY2FzZSBHUkVQX1BBVFRFUk46IC8qIGF0b20gKi8KKwkJY2FzZSBHUkVQX1BBVFRFUk5fSEVBRDoKKwkJY2FzZSBHUkVQX1BBVFRFUk5fQk9EWToKKwkJCWlmICghb3B0LT5maXhlZCkKKwkJCQljb21waWxlX3JlZ2V4cChwLCBvcHQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvcHQtPmV4dGVuZGVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcHQtPmV4dGVuZGVkKQorCQlyZXR1cm47CisKKwkvKiBUaGVuIGJ1bmRsZSB0aGVtIHVwIGluIGFuIGV4cHJlc3Npb24uCisJICogQSBjbGFzc2ljIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciB3b3VsZCBkby4KKwkgKi8KKwlwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7CisJb3B0LT5wYXR0ZXJuX2V4cHJlc3Npb24gPSBjb21waWxlX3BhdHRlcm5fZXhwcigmcCk7CisJaWYgKHApCisJCWRpZSgiaW5jb21wbGV0ZSBwYXR0ZXJuIGV4cHJlc3Npb246ICVzIiwgcC0+cGF0dGVybik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGF0dGVybl9leHByKHN0cnVjdCBncmVwX2V4cHIgKngpCit7CisJc3dpdGNoICh4LT5ub2RlKSB7CisJY2FzZSBHUkVQX05PREVfQVRPTToKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfTk9UOgorCQlmcmVlX3BhdHRlcm5fZXhwcih4LT51LnVuYXJ5KTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfQU5EOgorCWNhc2UgR1JFUF9OT0RFX09SOgorCQlmcmVlX3BhdHRlcm5fZXhwcih4LT51LmJpbmFyeS5sZWZ0KTsKKwkJZnJlZV9wYXR0ZXJuX2V4cHIoeC0+dS5iaW5hcnkucmlnaHQpOworCQlicmVhazsKKwl9CisJZnJlZSh4KTsKK30KKwordm9pZCBmcmVlX2dyZXBfcGF0dGVybnMoc3RydWN0IGdyZXBfb3B0ICpvcHQpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwLCAqbjsKKworCWZvciAocCA9IG9wdC0+cGF0dGVybl9saXN0OyBwOyBwID0gbikgeworCQluID0gcC0+bmV4dDsKKwkJc3dpdGNoIChwLT50b2tlbikgeworCQljYXNlIEdSRVBfUEFUVEVSTjogLyogYXRvbSAqLworCQljYXNlIEdSRVBfUEFUVEVSTl9IRUFEOgorCQljYXNlIEdSRVBfUEFUVEVSTl9CT0RZOgorCQkJcmVnZnJlZSgmcC0+cmVnZXhwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJZnJlZShwKTsKKwl9CisKKwlpZiAoIW9wdC0+ZXh0ZW5kZWQpCisJCXJldHVybjsKKwlmcmVlX3BhdHRlcm5fZXhwcihvcHQtPnBhdHRlcm5fZXhwcmVzc2lvbik7Cit9CisKK3N0YXRpYyBjaGFyICplbmRfb2ZfbGluZShjaGFyICpjcCwgdW5zaWduZWQgbG9uZyAqbGVmdCkKK3sKKwl1bnNpZ25lZCBsb25nIGwgPSAqbGVmdDsKKwl3aGlsZSAobCAmJiAqY3AgIT0gJ1xuJykgeworCQlsLS07CisJCWNwKys7CisJfQorCSpsZWZ0ID0gbDsKKwlyZXR1cm4gY3A7Cit9CisKK3N0YXRpYyBpbnQgd29yZF9jaGFyKGNoYXIgY2gpCit7CisJcmV0dXJuIGlzYWxudW0oY2gpIHx8IGNoID09ICdfJzsKK30KKworc3RhdGljIHZvaWQgc2hvd19saW5lKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICpib2wsIGNvbnN0IGNoYXIgKmVvbCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG5vLCBjaGFyIHNpZ24pCit7CisJaWYgKG9wdC0+cGF0aG5hbWUpCisJCXByaW50ZigiJXMlYyIsIG5hbWUsIHNpZ24pOworCWlmIChvcHQtPmxpbmVudW0pCisJCXByaW50ZigiJWQlYyIsIGxubywgc2lnbik7CisJcHJpbnRmKCIlLipzXG4iLCAoaW50KShlb2wtYm9sKSwgYm9sKTsKK30KKworc3RhdGljIGludCBmaXhtYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLCBjaGFyICpsaW5lLCByZWdtYXRjaF90ICptYXRjaCkKK3sKKwljaGFyICpoaXQgPSBzdHJzdHIobGluZSwgcGF0dGVybik7CisJaWYgKCFoaXQpIHsKKwkJbWF0Y2gtPnJtX3NvID0gbWF0Y2gtPnJtX2VvID0gLTE7CisJCXJldHVybiBSRUdfTk9NQVRDSDsKKwl9CisJZWxzZSB7CisJCW1hdGNoLT5ybV9zbyA9IGhpdCAtIGxpbmU7CisJCW1hdGNoLT5ybV9lbyA9IG1hdGNoLT5ybV9zbyArIHN0cmxlbihwYXR0ZXJuKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1hdGNoX29uZV9wYXR0ZXJuKHN0cnVjdCBncmVwX29wdCAqb3B0LCBzdHJ1Y3QgZ3JlcF9wYXQgKnAsIGNoYXIgKmJvbCwgY2hhciAqZW9sLCBlbnVtIGdyZXBfY29udGV4dCBjdHgpCit7CisJaW50IGhpdCA9IDA7CisJaW50IGF0X3RydWVfYm9sID0gMTsKKwlyZWdtYXRjaF90IHBtYXRjaFsxMF07CisKKwlpZiAoKHAtPnRva2VuICE9IEdSRVBfUEFUVEVSTikgJiYKKwkgICAgKChwLT50b2tlbiA9PSBHUkVQX1BBVFRFUk5fSEVBRCkgIT0gKGN0eCA9PSBHUkVQX0NPTlRFWFRfSEVBRCkpKQorCQlyZXR1cm4gMDsKKworIGFnYWluOgorCWlmICghb3B0LT5maXhlZCkgeworCQlyZWdleF90ICpleHAgPSAmcC0+cmVnZXhwOworCQloaXQgPSAhcmVnZXhlYyhleHAsIGJvbCwgQVJSQVlfU0laRShwbWF0Y2gpLAorCQkJICAgICAgIHBtYXRjaCwgMCk7CisJfQorCWVsc2UgeworCQloaXQgPSAhZml4bWF0Y2gocC0+cGF0dGVybiwgYm9sLCBwbWF0Y2gpOworCX0KKworCWlmIChoaXQgJiYgb3B0LT53b3JkX3JlZ2V4cCkgeworCQlpZiAoKHBtYXRjaFswXS5ybV9zbyA8IDApIHx8CisJCSAgICAoZW9sIC0gYm9sKSA8PSBwbWF0Y2hbMF0ucm1fc28gfHwKKwkJICAgIChwbWF0Y2hbMF0ucm1fZW8gPCAwKSB8fAorCQkgICAgKGVvbCAtIGJvbCkgPCBwbWF0Y2hbMF0ucm1fZW8pCisJCQlkaWUoInJlZ2V4cCByZXR1cm5lZCBub25zZW5zZSIpOworCisJCS8qIE1hdGNoIGJlZ2lubmluZyBtdXN0IGJlIGVpdGhlciBiZWdpbm5pbmcgb2YgdGhlCisJCSAqIGxpbmUsIG9yIGF0IHdvcmQgYm91bmRhcnkgKGkuZS4gdGhlIGxhc3QgY2hhciBtdXN0CisJCSAqIG5vdCBiZSBhIHdvcmQgY2hhcikuICBTaW1pbGFybHksIG1hdGNoIGVuZCBtdXN0IGJlCisJCSAqIGVpdGhlciBlbmQgb2YgdGhlIGxpbmUsIG9yIGF0IHdvcmQgYm91bmRhcnkKKwkJICogKGkuZS4gdGhlIG5leHQgY2hhciBtdXN0IG5vdCBiZSBhIHdvcmQgY2hhcikuCisJCSAqLworCQlpZiAoICgocG1hdGNoWzBdLnJtX3NvID09IDAgJiYgYXRfdHJ1ZV9ib2wpIHx8CisJCSAgICAgICF3b3JkX2NoYXIoYm9sW3BtYXRjaFswXS5ybV9zby0xXSkpICYmCisJCSAgICAgKChwbWF0Y2hbMF0ucm1fZW8gPT0gKGVvbC1ib2wpKSB8fAorCQkgICAgICAhd29yZF9jaGFyKGJvbFtwbWF0Y2hbMF0ucm1fZW9dKSkgKQorCQkJOworCQllbHNlCisJCQloaXQgPSAwOworCisJCWlmICghaGl0ICYmIHBtYXRjaFswXS5ybV9zbyArIGJvbCArIDEgPCBlb2wpIHsKKwkJCS8qIFRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgbWF0Y2ggb24gdGhlCisJCQkgKiBsaW5lLCBhbmQgdGhlIGZpcnN0IG1hdGNoIG1pZ2h0IG5vdCBiZQorCQkJICogc3RyaWN0IHdvcmQgbWF0Y2guICBCdXQgbGF0ZXIgb25lcyBjb3VsZCBiZSEKKwkJCSAqLworCQkJYm9sID0gcG1hdGNoWzBdLnJtX3NvICsgYm9sICsgMTsKKwkJCWF0X3RydWVfYm9sID0gMDsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisJcmV0dXJuIGhpdDsKK30KKworc3RhdGljIGludCBtYXRjaF9leHByX2V2YWwoc3RydWN0IGdyZXBfb3B0ICpvLAorCQkJICAgc3RydWN0IGdyZXBfZXhwciAqeCwKKwkJCSAgIGNoYXIgKmJvbCwgY2hhciAqZW9sLAorCQkJICAgZW51bSBncmVwX2NvbnRleHQgY3R4LAorCQkJICAgaW50IGNvbGxlY3RfaGl0cykKK3sKKwlpbnQgaCA9IDA7CisKKwlzd2l0Y2ggKHgtPm5vZGUpIHsKKwljYXNlIEdSRVBfTk9ERV9BVE9NOgorCQloID0gbWF0Y2hfb25lX3BhdHRlcm4obywgeC0+dS5hdG9tLCBib2wsIGVvbCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfTk9UOgorCQloID0gIW1hdGNoX2V4cHJfZXZhbChvLCB4LT51LnVuYXJ5LCBib2wsIGVvbCwgY3R4LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfQU5EOgorCQlpZiAoIWNvbGxlY3RfaGl0cykKKwkJCXJldHVybiAobWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUuYmluYXJ5LmxlZnQsCisJCQkJCQlib2wsIGVvbCwgY3R4LCAwKSAmJgorCQkJCW1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5yaWdodCwKKwkJCQkJCWJvbCwgZW9sLCBjdHgsIDApKTsKKwkJaCA9IG1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5sZWZ0LCBib2wsIGVvbCwgY3R4LCAwKTsKKwkJaCAmPSBtYXRjaF9leHByX2V2YWwobywgeC0+dS5iaW5hcnkucmlnaHQsIGJvbCwgZW9sLCBjdHgsIDApOworCQlicmVhazsKKwljYXNlIEdSRVBfTk9ERV9PUjoKKwkJaWYgKCFjb2xsZWN0X2hpdHMpCisJCQlyZXR1cm4gKG1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5sZWZ0LAorCQkJCQkJYm9sLCBlb2wsIGN0eCwgMCkgfHwKKwkJCQltYXRjaF9leHByX2V2YWwobywgeC0+dS5iaW5hcnkucmlnaHQsCisJCQkJCQlib2wsIGVvbCwgY3R4LCAwKSk7CisJCWggPSBtYXRjaF9leHByX2V2YWwobywgeC0+dS5iaW5hcnkubGVmdCwgYm9sLCBlb2wsIGN0eCwgMCk7CisJCXgtPnUuYmluYXJ5LmxlZnQtPmhpdCB8PSBoOworCQloIHw9IG1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5yaWdodCwgYm9sLCBlb2wsIGN0eCwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiVW5leHBlY3RlZCBub2RlIHR5cGUgKGludGVybmFsIGVycm9yKSAlZFxuIiwgeC0+bm9kZSk7CisJfQorCWlmIChjb2xsZWN0X2hpdHMpCisJCXgtPmhpdCB8PSBoOworCXJldHVybiBoOworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4cHIoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNoYXIgKmJvbCwgY2hhciAqZW9sLAorCQkgICAgICBlbnVtIGdyZXBfY29udGV4dCBjdHgsIGludCBjb2xsZWN0X2hpdHMpCit7CisJc3RydWN0IGdyZXBfZXhwciAqeCA9IG9wdC0+cGF0dGVybl9leHByZXNzaW9uOworCXJldHVybiBtYXRjaF9leHByX2V2YWwob3B0LCB4LCBib2wsIGVvbCwgY3R4LCBjb2xsZWN0X2hpdHMpOworfQorCitzdGF0aWMgaW50IG1hdGNoX2xpbmUoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNoYXIgKmJvbCwgY2hhciAqZW9sLAorCQkgICAgICBlbnVtIGdyZXBfY29udGV4dCBjdHgsIGludCBjb2xsZWN0X2hpdHMpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwOworCWlmIChvcHQtPmV4dGVuZGVkKQorCQlyZXR1cm4gbWF0Y2hfZXhwcihvcHQsIGJvbCwgZW9sLCBjdHgsIGNvbGxlY3RfaGl0cyk7CisKKwkvKiB3ZSBkbyBub3QgY2FsbCB3aXRoIGNvbGxlY3RfaGl0cyB3aXRob3V0IGJlaW5nIGV4dGVuZGVkICovCisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChtYXRjaF9vbmVfcGF0dGVybihvcHQsIHAsIGJvbCwgZW9sLCBjdHgpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdyZXBfYnVmZmVyXzEoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBjb2xsZWN0X2hpdHMpCit7CisJY2hhciAqYm9sID0gYnVmOworCXVuc2lnbmVkIGxvbmcgbGVmdCA9IHNpemU7CisJdW5zaWduZWQgbG5vID0gMTsKKwlzdHJ1Y3QgcHJlX2NvbnRleHRfbGluZSB7CisJCWNoYXIgKmJvbDsKKwkJY2hhciAqZW9sOworCX0gKnByZXYgPSBOVUxMLCAqcGNsOworCXVuc2lnbmVkIGxhc3RfaGl0ID0gMDsKKwl1bnNpZ25lZCBsYXN0X3Nob3duID0gMDsKKwlpbnQgYmluYXJ5X21hdGNoX29ubHkgPSAwOworCWNvbnN0IGNoYXIgKmh1bmtfbWFyayA9ICIiOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKwllbnVtIGdyZXBfY29udGV4dCBjdHggPSBHUkVQX0NPTlRFWFRfSEVBRDsKKworCWlmIChidWZmZXJfaXNfYmluYXJ5KGJ1Ziwgc2l6ZSkpIHsKKwkJc3dpdGNoIChvcHQtPmJpbmFyeSkgeworCQljYXNlIEdSRVBfQklOQVJZX0RFRkFVTFQ6CisJCQliaW5hcnlfbWF0Y2hfb25seSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBHUkVQX0JJTkFSWV9OT01BVENIOgorCQkJcmV0dXJuIDA7IC8qIEFzc3VtZSB1bm1hdGNoICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG9wdC0+cHJlX2NvbnRleHQpCisJCXByZXYgPSB4Y2FsbG9jKG9wdC0+cHJlX2NvbnRleHQsIHNpemVvZigqcHJldikpOworCWlmIChvcHQtPnByZV9jb250ZXh0IHx8IG9wdC0+cG9zdF9jb250ZXh0KQorCQlodW5rX21hcmsgPSAiLS1cbiI7CisKKwl3aGlsZSAobGVmdCkgeworCQljaGFyICplb2wsIGNoOworCQlpbnQgaGl0OworCisJCWVvbCA9IGVuZF9vZl9saW5lKGJvbCwgJmxlZnQpOworCQljaCA9ICplb2w7CisJCSplb2wgPSAwOworCisJCWlmICgoY3R4ID09IEdSRVBfQ09OVEVYVF9IRUFEKSAmJiAoZW9sID09IGJvbCkpCisJCQljdHggPSBHUkVQX0NPTlRFWFRfQk9EWTsKKworCQloaXQgPSBtYXRjaF9saW5lKG9wdCwgYm9sLCBlb2wsIGN0eCwgY29sbGVjdF9oaXRzKTsKKwkJKmVvbCA9IGNoOworCisJCWlmIChjb2xsZWN0X2hpdHMpCisJCQlnb3RvIG5leHRfbGluZTsKKworCQkvKiAiZ3JlcCAtdiAtZSBmb28gLWUgYmxhIiBzaG91bGQgbGlzdCBsaW5lcworCQkgKiB0aGF0IGRvIG5vdCBoYXZlIGVpdGhlciwgc28gaW52ZXJzaW9uIHNob3VsZAorCQkgKiBiZSBkb25lIG91dHNpZGUuCisJCSAqLworCQlpZiAob3B0LT5pbnZlcnQpCisJCQloaXQgPSAhaGl0OworCQlpZiAob3B0LT51bm1hdGNoX25hbWVfb25seSkgeworCQkJaWYgKGhpdCkKKwkJCQlyZXR1cm4gMDsKKwkJCWdvdG8gbmV4dF9saW5lOworCQl9CisJCWlmIChoaXQpIHsKKwkJCWNvdW50Kys7CisJCQlpZiAob3B0LT5zdGF0dXNfb25seSkKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChiaW5hcnlfbWF0Y2hfb25seSkgeworCQkJCXByaW50ZigiQmluYXJ5IGZpbGUgJXMgbWF0Y2hlc1xuIiwgbmFtZSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAob3B0LT5uYW1lX29ubHkpIHsKKwkJCQlwcmludGYoIiVzXG4iLCBuYW1lKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCS8qIEhpdCBhdCB0aGlzIGxpbmUuICBJZiB3ZSBoYXZlbid0IHNob3duIHRoZQorCQkJICogcHJlLWNvbnRleHQgbGluZXMsIHdlIHdvdWxkIG5lZWQgdG8gc2hvdyB0aGVtLgorCQkJICogV2hlbiBhc2tlZCB0byBkbyAiY291bnQiLCB0aGlzIHN0aWxsIHNob3cKKwkJCSAqIHRoZSBjb250ZXh0IHdoaWNoIGlzIG5vbnNlbnNlLCBidXQgdGhlIHVzZXIKKwkJCSAqIGRlc2VydmVzIHRvIGdldCB0aGF0IDstKS4KKwkJCSAqLworCQkJaWYgKG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCQl1bnNpZ25lZCBmcm9tOworCQkJCWlmIChvcHQtPnByZV9jb250ZXh0IDwgbG5vKQorCQkJCQlmcm9tID0gbG5vIC0gb3B0LT5wcmVfY29udGV4dDsKKwkJCQllbHNlCisJCQkJCWZyb20gPSAxOworCQkJCWlmIChmcm9tIDw9IGxhc3Rfc2hvd24pCisJCQkJCWZyb20gPSBsYXN0X3Nob3duICsgMTsKKwkJCQlpZiAobGFzdF9zaG93biAmJiBmcm9tICE9IGxhc3Rfc2hvd24gKyAxKQorCQkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCQl3aGlsZSAoZnJvbSA8IGxubykgeworCQkJCQlwY2wgPSAmcHJldltsbm8tZnJvbS0xXTsKKwkJCQkJc2hvd19saW5lKG9wdCwgcGNsLT5ib2wsIHBjbC0+ZW9sLAorCQkJCQkJICBuYW1lLCBmcm9tLCAnLScpOworCQkJCQlmcm9tKys7CisJCQkJfQorCQkJCWxhc3Rfc2hvd24gPSBsbm8tMTsKKwkJCX0KKwkJCWlmIChsYXN0X3Nob3duICYmIGxubyAhPSBsYXN0X3Nob3duICsgMSkKKwkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCWlmICghb3B0LT5jb3VudCkKKwkJCQlzaG93X2xpbmUob3B0LCBib2wsIGVvbCwgbmFtZSwgbG5vLCAnOicpOworCQkJbGFzdF9zaG93biA9IGxhc3RfaGl0ID0gbG5vOworCQl9CisJCWVsc2UgaWYgKGxhc3RfaGl0ICYmCisJCQkgbG5vIDw9IGxhc3RfaGl0ICsgb3B0LT5wb3N0X2NvbnRleHQpIHsKKwkJCS8qIElmIHRoZSBsYXN0IGhpdCBpcyB3aXRoaW4gdGhlIHBvc3QgY29udGV4dCwKKwkJCSAqIHdlIG5lZWQgdG8gc2hvdyB0aGlzIGxpbmUuCisJCQkgKi8KKwkJCWlmIChsYXN0X3Nob3duICYmIGxubyAhPSBsYXN0X3Nob3duICsgMSkKKwkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCXNob3dfbGluZShvcHQsIGJvbCwgZW9sLCBuYW1lLCBsbm8sICctJyk7CisJCQlsYXN0X3Nob3duID0gbG5vOworCQl9CisJCWlmIChvcHQtPnByZV9jb250ZXh0KSB7CisJCQltZW1tb3ZlKHByZXYrMSwgcHJldiwKKwkJCQkob3B0LT5wcmVfY29udGV4dC0xKSAqIHNpemVvZigqcHJldikpOworCQkJcHJldi0+Ym9sID0gYm9sOworCQkJcHJldi0+ZW9sID0gZW9sOworCQl9CisKKwluZXh0X2xpbmU6CisJCWJvbCA9IGVvbCArIDE7CisJCWlmICghbGVmdCkKKwkJCWJyZWFrOworCQlsZWZ0LS07CisJCWxubysrOworCX0KKworCWZyZWUocHJldik7CisJaWYgKGNvbGxlY3RfaGl0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAob3B0LT5zdGF0dXNfb25seSkKKwkJcmV0dXJuIDA7CisJaWYgKG9wdC0+dW5tYXRjaF9uYW1lX29ubHkpIHsKKwkJLyogV2UgZGlkIG5vdCBzZWUgYW55IGhpdCwgc28gd2Ugd2FudCB0byBzaG93IHRoaXMgKi8KKwkJcHJpbnRmKCIlc1xuIiwgbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIE5FRURTV09SSzoKKwkgKiBUaGUgcmVhbCAiZ3JlcCAtYyBmb28gKi5jIiBnaXZlcyBtYW55ICJiYXIuYzowIiBsaW5lcywKKwkgKiB3aGljaCBmZWVscyBtb3N0bHkgdXNlbGVzcyBidXQgc29tZXRpbWVzIHVzZWZ1bC4gIE1heWJlCisJICogbWFrZSBpdCBhbm90aGVyIG9wdGlvbj8gIEZvciBub3cgc3VwcHJlc3MgdGhlbS4KKwkgKi8KKwlpZiAob3B0LT5jb3VudCAmJiBjb3VudCkKKwkJcHJpbnRmKCIlczoldVxuIiwgbmFtZSwgY291bnQpOworCXJldHVybiAhIWxhc3RfaGl0OworfQorCitzdGF0aWMgdm9pZCBjbHJfaGl0X21hcmtlcihzdHJ1Y3QgZ3JlcF9leHByICp4KQoreworCS8qIEFsbC1oaXQgbWFya2VycyBhcmUgbWVhbmluZ2Z1bCBvbmx5IGF0IHRoZSB2ZXJ5IHRvcCBsZXZlbAorCSAqIE9SIG5vZGUuCisJICovCisJd2hpbGUgKDEpIHsKKwkJeC0+aGl0ID0gMDsKKwkJaWYgKHgtPm5vZGUgIT0gR1JFUF9OT0RFX09SKQorCQkJcmV0dXJuOworCQl4LT51LmJpbmFyeS5sZWZ0LT5oaXQgPSAwOworCQl4ID0geC0+dS5iaW5hcnkucmlnaHQ7CisJfQorfQorCitzdGF0aWMgaW50IGNoa19oaXRfbWFya2VyKHN0cnVjdCBncmVwX2V4cHIgKngpCit7CisJLyogVG9wIGxldmVsIG5vZGVzIGhhdmUgaGl0IG1hcmtlcnMuICBTZWUgaWYgdGhleSBhbGwgYXJlIGhpdHMgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoeC0+bm9kZSAhPSBHUkVQX05PREVfT1IpCisJCQlyZXR1cm4geC0+aGl0OworCQlpZiAoIXgtPnUuYmluYXJ5LmxlZnQtPmhpdCkKKwkJCXJldHVybiAwOworCQl4ID0geC0+dS5iaW5hcnkucmlnaHQ7CisJfQorfQorCitpbnQgZ3JlcF9idWZmZXIoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qCisJICogd2UgZG8gbm90IGhhdmUgdG8gZG8gdGhlIHR3by1wYXNzIGdyZXAgd2hlbiB3ZSBkbyBub3QgY2hlY2sKKwkgKiBidWZmZXItd2lkZSAiYWxsLW1hdGNoIi4KKwkgKi8KKwlpZiAoIW9wdC0+YWxsX21hdGNoKQorCQlyZXR1cm4gZ3JlcF9idWZmZXJfMShvcHQsIG5hbWUsIGJ1Ziwgc2l6ZSwgMCk7CisKKwkvKiBPdGhlcndpc2UgdGhlIHRvcGxldmVsICJvciIgdGVybXMgaGl0IGEgYml0IGRpZmZlcmVudGx5LgorCSAqIFdlIGZpcnN0IGNsZWFyIGhpdCBtYXJrZXJzIGZyb20gdGhlbS4KKwkgKi8KKwljbHJfaGl0X21hcmtlcihvcHQtPnBhdHRlcm5fZXhwcmVzc2lvbik7CisJZ3JlcF9idWZmZXJfMShvcHQsIG5hbWUsIGJ1Ziwgc2l6ZSwgMSk7CisKKwlpZiAoIWNoa19oaXRfbWFya2VyKG9wdC0+cGF0dGVybl9leHByZXNzaW9uKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZ3JlcF9idWZmZXJfMShvcHQsIG5hbWUsIGJ1Ziwgc2l6ZSwgMCk7Cit9CmRpZmYgLS1naXQgYS9ncmVwLmggYi9ncmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1MmRkMgotLS0gL2Rldi9udWxsCisrKyBiL2dyZXAuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIEdSRVBfSAorI2RlZmluZSBHUkVQX0gKKworZW51bSBncmVwX3BhdF90b2tlbiB7CisJR1JFUF9QQVRURVJOLAorCUdSRVBfUEFUVEVSTl9IRUFELAorCUdSRVBfUEFUVEVSTl9CT0RZLAorCUdSRVBfQU5ELAorCUdSRVBfT1BFTl9QQVJFTiwKKwlHUkVQX0NMT1NFX1BBUkVOLAorCUdSRVBfTk9ULAorCUdSRVBfT1IsCit9OworCitlbnVtIGdyZXBfY29udGV4dCB7CisJR1JFUF9DT05URVhUX0hFQUQsCisJR1JFUF9DT05URVhUX0JPRFksCit9OworCitzdHJ1Y3QgZ3JlcF9wYXQgeworCXN0cnVjdCBncmVwX3BhdCAqbmV4dDsKKwljb25zdCBjaGFyICpvcmlnaW47CisJaW50IG5vOworCWVudW0gZ3JlcF9wYXRfdG9rZW4gdG9rZW47CisJY29uc3QgY2hhciAqcGF0dGVybjsKKwlyZWdleF90IHJlZ2V4cDsKK307CisKK2VudW0gZ3JlcF9leHByX25vZGUgeworCUdSRVBfTk9ERV9BVE9NLAorCUdSRVBfTk9ERV9OT1QsCisJR1JFUF9OT0RFX0FORCwKKwlHUkVQX05PREVfT1IsCit9OworCitzdHJ1Y3QgZ3JlcF9leHByIHsKKwllbnVtIGdyZXBfZXhwcl9ub2RlIG5vZGU7CisJdW5zaWduZWQgaGl0OworCXVuaW9uIHsKKwkJc3RydWN0IGdyZXBfcGF0ICphdG9tOworCQlzdHJ1Y3QgZ3JlcF9leHByICp1bmFyeTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBncmVwX2V4cHIgKmxlZnQ7CisJCQlzdHJ1Y3QgZ3JlcF9leHByICpyaWdodDsKKwkJfSBiaW5hcnk7CisJfSB1OworfTsKKworc3RydWN0IGdyZXBfb3B0IHsKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnBhdHRlcm5fbGlzdDsKKwlzdHJ1Y3QgZ3JlcF9wYXQgKipwYXR0ZXJuX3RhaWw7CisJc3RydWN0IGdyZXBfZXhwciAqcGF0dGVybl9leHByZXNzaW9uOworCWludCBwcmVmaXhfbGVuZ3RoOworCXJlZ2V4X3QgcmVnZXhwOworCXVuc2lnbmVkIGxpbmVudW06MTsKKwl1bnNpZ25lZCBpbnZlcnQ6MTsKKwl1bnNpZ25lZCBzdGF0dXNfb25seToxOworCXVuc2lnbmVkIG5hbWVfb25seToxOworCXVuc2lnbmVkIHVubWF0Y2hfbmFtZV9vbmx5OjE7CisJdW5zaWduZWQgY291bnQ6MTsKKwl1bnNpZ25lZCB3b3JkX3JlZ2V4cDoxOworCXVuc2lnbmVkIGZpeGVkOjE7CisJdW5zaWduZWQgYWxsX21hdGNoOjE7CisjZGVmaW5lIEdSRVBfQklOQVJZX0RFRkFVTFQJMAorI2RlZmluZSBHUkVQX0JJTkFSWV9OT01BVENICTEKKyNkZWZpbmUgR1JFUF9CSU5BUllfVEVYVAkyCisJdW5zaWduZWQgYmluYXJ5OjI7CisJdW5zaWduZWQgZXh0ZW5kZWQ6MTsKKwl1bnNpZ25lZCByZWxhdGl2ZToxOworCXVuc2lnbmVkIHBhdGhuYW1lOjE7CisJaW50IHJlZ2ZsYWdzOworCXVuc2lnbmVkIHByZV9jb250ZXh0OworCXVuc2lnbmVkIHBvc3RfY29udGV4dDsKK307CisKK2V4dGVybiB2b2lkIGFwcGVuZF9ncmVwX3BhdHRlcm4oc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKnBhdCwgY29uc3QgY2hhciAqb3JpZ2luLCBpbnQgbm8sIGVudW0gZ3JlcF9wYXRfdG9rZW4gdCk7CitleHRlcm4gdm9pZCBjb21waWxlX2dyZXBfcGF0dGVybnMoc3RydWN0IGdyZXBfb3B0ICpvcHQpOworZXh0ZXJuIHZvaWQgZnJlZV9ncmVwX3BhdHRlcm5zKHN0cnVjdCBncmVwX29wdCAqb3B0KTsKK2V4dGVybiBpbnQgZ3JlcF9idWZmZXIoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9oYXNoLW9iamVjdC5jIGIvaGFzaC1vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY1MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvaGFzaC1vYmplY3QuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICogQ29weXJpZ2h0IChDKSBKdW5pbyBDIEhhbWFubywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyB2b2lkIGhhc2hfb2JqZWN0KGNvbnN0IGNoYXIgKnBhdGgsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgaW50IHdyaXRlX29iamVjdCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwKKwkgICAgZnN0YXQoZmQsICZzdCkgPCAwIHx8CisJICAgIGluZGV4X2ZkKHNoYTEsIGZkLCAmc3QsIHdyaXRlX29iamVjdCwgdHlwZSwgcGF0aCkpCisJCWRpZSh3cml0ZV9vYmplY3QKKwkJICAgID8gIlVuYWJsZSB0byBhZGQgJXMgdG8gZGF0YWJhc2UiCisJCSAgICA6ICJVbmFibGUgdG8gaGFzaCAlcyIsIHBhdGgpOworCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKK30KKworc3RhdGljIHZvaWQgaGFzaF9zdGRpbihjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaWYgKGluZGV4X3BpcGUoc2hhMSwgMCwgdHlwZSwgd3JpdGVfb2JqZWN0KSkKKwkJZGllKCJVbmFibGUgdG8gYWRkIHN0ZGluIHRvIGRhdGFiYXNlIik7CisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBoYXNoX29iamVjdF91c2FnZVtdID0KKyJnaXQtaGFzaC1vYmplY3QgWy10IDx0eXBlPl0gWy13XSBbLS1zdGRpbl0gPGZpbGU+Li4uIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnR5cGUgPSBibG9iX3R5cGU7CisJaW50IHdyaXRlX29iamVjdCA9IDA7CisJY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKwlpbnQgcHJlZml4X2xlbmd0aCA9IC0xOworCWludCBub19tb3JlX2ZsYWdzID0gMDsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghbm9fbW9yZV9mbGFncyAmJiBhcmd2W2ldWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi10IikpIHsKKwkJCQlpZiAoYXJnYyA8PSArK2kpCisJCQkJCXVzYWdlKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCQl0eXBlID0gYXJndltpXTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi13IikpIHsKKwkJCQlpZiAocHJlZml4X2xlbmd0aCA8IDApIHsKKwkJCQkJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCQkJCQlwcmVmaXhfbGVuZ3RoID0KKwkJCQkJCXByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwkJCQl9CisJCQkJd3JpdGVfb2JqZWN0ID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpIHsKKwkJCQlub19tb3JlX2ZsYWdzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taGVscCIpKQorCQkJCXVzYWdlKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc3RkaW4iKSkgeworCQkJCWhhc2hfc3RkaW4odHlwZSwgd3JpdGVfb2JqZWN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl1c2FnZShoYXNoX29iamVjdF91c2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQkJaWYgKDAgPD0gcHJlZml4X2xlbmd0aCkKKwkJCQlhcmcgPSBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBwcmVmaXhfbGVuZ3RoLAorCQkJCQkJICAgICAgYXJnKTsKKwkJCWhhc2hfb2JqZWN0KGFyZywgdHlwZV9mcm9tX3N0cmluZyh0eXBlKSwgd3JpdGVfb2JqZWN0KTsKKwkJCW5vX21vcmVfZmxhZ3MgPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaGVscC5jIGIvaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWFmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9oZWxwLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBidWlsdGluLWhlbHAuYworICoKKyAqIEJ1aWx0aW4gaGVscC1yZWxhdGVkIGNvbW1hbmRzIChoZWxwLCB1c2FnZSwgdmVyc2lvbikKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY29tbW9uLWNtZHMuaCIKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworLyogbW9zdCBHVUkgdGVybWluYWxzIHNldCBDT0xVTU5TIChhbHRob3VnaCBzb21lIGRvbid0IGV4cG9ydCBpdCkgKi8KK3N0YXRpYyBpbnQgdGVybV9jb2x1bW5zKHZvaWQpCit7CisJY2hhciAqY29sX3N0cmluZyA9IGdldGVudigiQ09MVU1OUyIpOworCWludCBuX2NvbHM7CisKKwlpZiAoY29sX3N0cmluZyAmJiAobl9jb2xzID0gYXRvaShjb2xfc3RyaW5nKSkgPiAwKQorCQlyZXR1cm4gbl9jb2xzOworCisjaWZkZWYgVElPQ0dXSU5TWgorCXsKKwkJc3RydWN0IHdpbnNpemUgd3M7CisJCWlmICghaW9jdGwoMSwgVElPQ0dXSU5TWiwgJndzKSkgeworCQkJaWYgKHdzLndzX2NvbCkKKwkJCQlyZXR1cm4gd3Mud3NfY29sOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gODA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHV0X2NoYXIoY2hhciBjLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXdoaWxlKG51bS0tKQorCQlwdXRjaGFyKGMpOworfQorCitzdGF0aWMgc3RydWN0IGNtZG5hbWUgeworCXNpemVfdCBsZW47CisJY2hhciBuYW1lWzFdOworfSAqKmNtZG5hbWU7CitzdGF0aWMgaW50IGNtZG5hbWVfYWxsb2MsIGNtZG5hbWVfY250OworCitzdGF0aWMgdm9pZCBhZGRfY21kbmFtZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBjbWRuYW1lICplbnQ7CisJaWYgKGNtZG5hbWVfYWxsb2MgPD0gY21kbmFtZV9jbnQpIHsKKwkJY21kbmFtZV9hbGxvYyA9IGNtZG5hbWVfYWxsb2MgKyAyMDA7CisJCWNtZG5hbWUgPSB4cmVhbGxvYyhjbWRuYW1lLCBjbWRuYW1lX2FsbG9jICogc2l6ZW9mKCpjbWRuYW1lKSk7CisJfQorCWVudCA9IHhtYWxsb2Moc2l6ZW9mKCplbnQpICsgbGVuKTsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5uYW1lLCBuYW1lLCBsZW4pOworCWVudC0+bmFtZVtsZW5dID0gMDsKKwljbWRuYW1lW2NtZG5hbWVfY250KytdID0gZW50OworfQorCitzdGF0aWMgaW50IGNtZG5hbWVfY29tcGFyZShjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IGNtZG5hbWUgKmEgPSAqKHN0cnVjdCBjbWRuYW1lICoqKWFfOworCXN0cnVjdCBjbWRuYW1lICpiID0gKihzdHJ1Y3QgY21kbmFtZSAqKiliXzsKKwlyZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3Qoc3RydWN0IGNtZG5hbWUgKipjbWRuYW1lLCBpbnQgbG9uZ2VzdCkKK3sKKwlpbnQgY29scyA9IDEsIHJvd3M7CisJaW50IHNwYWNlID0gbG9uZ2VzdCArIDE7IC8qIG1pbiAxIFNQIGJldHdlZW4gd29yZHMgKi8KKwlpbnQgbWF4X2NvbHMgPSB0ZXJtX2NvbHVtbnMoKSAtIDE7IC8qIGRvbid0IHByaW50ICpvbiogdGhlIGVkZ2UgKi8KKwlpbnQgaSwgajsKKworCWlmIChzcGFjZSA8IG1heF9jb2xzKQorCQljb2xzID0gbWF4X2NvbHMgLyBzcGFjZTsKKwlyb3dzID0gKGNtZG5hbWVfY250ICsgY29scyAtIDEpIC8gY29sczsKKworCXFzb3J0KGNtZG5hbWUsIGNtZG5hbWVfY250LCBzaXplb2YoKmNtZG5hbWUpLCBjbWRuYW1lX2NvbXBhcmUpOworCisJZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgeworCQlwcmludGYoIiAgIik7CisKKwkJZm9yIChqID0gMDsgaiA8IGNvbHM7IGorKykgeworCQkJaW50IG4gPSBqICogcm93cyArIGk7CisJCQlpbnQgc2l6ZSA9IHNwYWNlOworCQkJaWYgKG4gPj0gY21kbmFtZV9jbnQpCisJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBjb2xzLTEgfHwgbiArIHJvd3MgPj0gY21kbmFtZV9jbnQpCisJCQkJc2l6ZSA9IDE7CisJCQlwcmludGYoIiUtKnMiLCBzaXplLCBjbWRuYW1lW25dLT5uYW1lKTsKKwkJfQorCQlwdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgbGlzdF9jb21tYW5kcyhjb25zdCBjaGFyICpleGVjX3BhdGgsIGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJdW5zaWduZWQgaW50IGxvbmdlc3QgPSAwOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGRpcmxlbjsKKwlESVIgKmRpciA9IG9wZW5kaXIoZXhlY19wYXRoKTsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCWlmICghZGlyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiAnJXMnOiAlc1xuIiwgZXhlY19wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCWRpcmxlbiA9IHN0cmxlbihleGVjX3BhdGgpOworCWlmIChQQVRIX01BWCAtIDIwIDwgZGlybGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBpbnNhbmVseSBsb25nIGV4ZWMtcGF0aCAnJXMnXG4iLAorCQkJZXhlY19wYXRoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltZW1jcHkocGF0aCwgZXhlY19wYXRoLCBkaXJsZW4pOworCXBhdGhbZGlybGVuKytdID0gJy8nOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGVudGxlbjsKKworCQlpZiAocHJlZml4Y21wKGRlLT5kX25hbWUsICJnaXQtIikpCisJCQljb250aW51ZTsKKwkJc3RyY3B5KHBhdGgrZGlybGVuLCBkZS0+ZF9uYW1lKTsKKwkJaWYgKHN0YXQocGF0aCwgJnN0KSB8fCAvKiBzdGF0LCBub3QgbHN0YXQgKi8KKwkJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8CisJCSAgICAhKHN0LnN0X21vZGUgJiBTX0lYVVNSKSkKKwkJCWNvbnRpbnVlOworCisJCWVudGxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5leGUiKSkKKwkJCWVudGxlbiAtPSA0OworCisJCWlmIChsb25nZXN0IDwgZW50bGVuKQorCQkJbG9uZ2VzdCA9IGVudGxlbjsKKworCQlhZGRfY21kbmFtZShkZS0+ZF9uYW1lICsgNCwgZW50bGVuLTQpOworCX0KKwljbG9zZWRpcihkaXIpOworCisJcHJpbnRmKCJnaXQgY29tbWFuZHMgYXZhaWxhYmxlIGluICclcydcbiIsIGV4ZWNfcGF0aCk7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJbXB1dF9jaGFyKCctJywgc3RybGVuKGV4ZWNfcGF0aCkpOworCXB1dGNoYXIoJ1xuJyk7CisJcHJldHR5X3ByaW50X3N0cmluZ19saXN0KGNtZG5hbWUsIGxvbmdlc3QgLSA0KTsKKwlwdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBsaXN0X2NvbW1vbl9jbWRzX2hlbHAodm9pZCkKK3sKKwlpbnQgaSwgbG9uZ2VzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tb25fY21kcyk7IGkrKykgeworCQlpZiAobG9uZ2VzdCA8IHN0cmxlbihjb21tb25fY21kc1tpXS5uYW1lKSkKKwkJCWxvbmdlc3QgPSBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSk7CisJfQorCisJcHV0cygiVGhlIG1vc3QgY29tbW9ubHkgdXNlZCBnaXQgY29tbWFuZHMgYXJlOiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1vbl9jbWRzKTsgaSsrKSB7CisJCXByaW50ZigiICAgJXMgICAiLCBjb21tb25fY21kc1tpXS5uYW1lKTsKKwkJbXB1dF9jaGFyKCcgJywgbG9uZ2VzdCAtIHN0cmxlbihjb21tb25fY21kc1tpXS5uYW1lKSk7CisJCXB1dHMoY29tbW9uX2NtZHNbaV0uaGVscCk7CisJfQorCXB1dHMoIih1c2UgJ2dpdCBoZWxwIC1hJyB0byBnZXQgYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgZ2l0IGNvbW1hbmRzKSIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X21hbl9wYWdlKGNvbnN0IGNoYXIgKmdpdF9jbWQpCit7CisJY29uc3QgY2hhciAqcGFnZTsKKworCWlmICghcHJlZml4Y21wKGdpdF9jbWQsICJnaXQiKSkKKwkJcGFnZSA9IGdpdF9jbWQ7CisJZWxzZSB7CisJCWludCBwYWdlX2xlbiA9IHN0cmxlbihnaXRfY21kKSArIDQ7CisJCWNoYXIgKnAgPSB4bWFsbG9jKHBhZ2VfbGVuICsgMSk7CisJCXN0cmNweShwLCAiZ2l0LSIpOworCQlzdHJjcHkocCArIDQsIGdpdF9jbWQpOworCQlwW3BhZ2VfbGVuXSA9IDA7CisJCXBhZ2UgPSBwOworCX0KKworCWV4ZWNscCgibWFuIiwgIm1hbiIsIHBhZ2UsIE5VTEwpOworfQorCit2b2lkIGhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKQoreworCXByaW50ZigiZ2l0OiAnJXMnIGlzIG5vdCBhIGdpdC1jb21tYW5kXG5cbiIsIGNtZCk7CisJbGlzdF9jb21tb25fY21kc19oZWxwKCk7CisJZXhpdCgxKTsKK30KKworaW50IGNtZF92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXByaW50ZigiZ2l0IHZlcnNpb24gJXNcbiIsIGdpdF92ZXJzaW9uX3N0cmluZyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfaGVscChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpoZWxwX2NtZCA9IGFyZ2MgPiAxID8gYXJndlsxXSA6IE5VTEw7CisJY29uc3QgY2hhciAqZXhlY19wYXRoID0gZ2l0X2V4ZWNfcGF0aCgpOworCisJaWYgKCFoZWxwX2NtZCkgeworCQlwcmludGYoInVzYWdlOiAlc1xuXG4iLCBnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJbGlzdF9jb21tb25fY21kc19oZWxwKCk7CisJCWV4aXQoMSk7CisJfQorCisJZWxzZSBpZiAoIXN0cmNtcChoZWxwX2NtZCwgIi0tYWxsIikgfHwgIXN0cmNtcChoZWxwX2NtZCwgIi1hIikpIHsKKwkJcHJpbnRmKCJ1c2FnZTogJXNcblxuIiwgZ2l0X3VzYWdlX3N0cmluZyk7CisJCWlmKGV4ZWNfcGF0aCkKKwkJCWxpc3RfY29tbWFuZHMoZXhlY19wYXRoLCAiZ2l0LSoiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwllbHNlCisJCXNob3dfbWFuX3BhZ2UoaGVscF9jbWQpOworCisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvaHR0cC1mZXRjaC5jIGIvaHR0cC1mZXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmFlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9odHRwLWZldGNoLmMKQEAgLTAsMCArMSwxMDY0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJodHRwLmgiCisKKyNkZWZpbmUgUFJFVl9CVUZfU0laRSA0MDk2CisjZGVmaW5lIFJBTkdFX0hFQURFUl9TSVpFIDMwCisKK3N0YXRpYyBpbnQgY29tbWl0c19vbl9zdGRpbjsKKworc3RhdGljIGludCBnb3RfYWx0ZXJuYXRlcyA9IC0xOworc3RhdGljIGludCBjb3JydXB0X29iamVjdF9mb3VuZDsKKworc3RhdGljIHN0cnVjdCBjdXJsX3NsaXN0ICpub19wcmFnbWFfaGVhZGVyOworCitzdHJ1Y3QgYWx0X2Jhc2UKK3sKKwljaGFyICpiYXNlOworCWludCBnb3RfaW5kaWNlczsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3M7CisJc3RydWN0IGFsdF9iYXNlICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBhbHRfYmFzZSAqYWx0OworCitlbnVtIG9iamVjdF9yZXF1ZXN0X3N0YXRlIHsKKwlXQUlUSU5HLAorCUFCT1JURUQsCisJQUNUSVZFLAorCUNPTVBMRVRFLAorfTsKKworc3RydWN0IG9iamVjdF9yZXF1ZXN0Cit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG87CisJY2hhciAqdXJsOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IGxvY2FsOworCWVudW0gb2JqZWN0X3JlcXVlc3Rfc3RhdGUgc3RhdGU7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJY2hhciBlcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCWxvbmcgaHR0cF9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gc3RyZWFtOworCWludCB6cmV0OworCWludCByZW5hbWU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpuZXh0OworfTsKKworc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCB7CisJY29uc3QgY2hhciAqYmFzZTsKKwljaGFyICp1cmw7CisJc3RydWN0IGJ1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWludCBodHRwX3NwZWNpZmljOworfTsKKworc3RhdGljIHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqZWN0X3F1ZXVlX2hlYWQ7CisKK3N0YXRpYyBzaXplX3QgZndyaXRlX3NoYTFfZmlsZSh2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGV4cG5bNDA5Nl07CisJc2l6ZV90IHNpemUgPSBlbHRzaXplICogbm1lbWI7CisJaW50IHBvc24gPSAwOworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSA9IChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKilkYXRhOworCWRvIHsKKwkJc3NpemVfdCByZXR2YWwgPSB4d3JpdGUob2JqX3JlcS0+bG9jYWwsCisJCQkJICAgICAgIChjaGFyICopIHB0ciArIHBvc24sIHNpemUgLSBwb3NuKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcG9zbjsKKwkJcG9zbiArPSByZXR2YWw7CisJfSB3aGlsZSAocG9zbiA8IHNpemUpOworCisJb2JqX3JlcS0+c3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlvYmpfcmVxLT5zdHJlYW0ubmV4dF9pbiA9IHB0cjsKKwlkbyB7CisJCW9ial9yZXEtPnN0cmVhbS5uZXh0X291dCA9IGV4cG47CisJCW9ial9yZXEtPnN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZXhwbik7CisJCW9ial9yZXEtPnpyZXQgPSBpbmZsYXRlKCZvYmpfcmVxLT5zdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCVNIQTFfVXBkYXRlKCZvYmpfcmVxLT5jLCBleHBuLAorCQkJICAgIHNpemVvZihleHBuKSAtIG9ial9yZXEtPnN0cmVhbS5hdmFpbF9vdXQpOworCX0gd2hpbGUgKG9ial9yZXEtPnN0cmVhbS5hdmFpbF9pbiAmJiBvYmpfcmVxLT56cmV0ID09IFpfT0spOworCWRhdGFfcmVjZWl2ZWQrKzsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBtaXNzaW5nX190YXJnZXQoaW50IGNvZGUsIGludCByZXN1bHQpCit7CisJcmV0dXJuCS8qIGZpbGU6Ly8gVVJMIC0tIGRvIHdlIGV2ZXIgdXNlIG9uZT8/PyAqLworCQkocmVzdWx0ID09IENVUkxFX0ZJTEVfQ09VTEROVF9SRUFEX0ZJTEUpIHx8CisJCS8qIGh0dHA6Ly8gYW5kIGh0dHBzOi8vIFVSTCAqLworCQkoY29kZSA9PSA0MDQgJiYgcmVzdWx0ID09IENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IpIHx8CisJCS8qIGZ0cDovLyBVUkwgKi8KKwkJKGNvZGUgPT0gNTUwICYmIHJlc3VsdCA9PSBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUpCisJCTsKK30KKworI2RlZmluZSBtaXNzaW5nX3RhcmdldChhKSBtaXNzaW5nX190YXJnZXQoKGEpLT5odHRwX2NvZGUsIChhKS0+Y3VybF9yZXN1bHQpCisKK3N0YXRpYyB2b2lkIGZldGNoX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqYmFzZSk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfb2JqZWN0X3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpOworCitzdGF0aWMgdm9pZCBzdGFydF9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgob2JqX3JlcS0+c2hhMSk7CisJY2hhciBwcmV2ZmlsZVtQQVRIX01BWF07CisJY2hhciAqdXJsOworCWNoYXIgKnBvc247CisJaW50IHByZXZsb2NhbDsKKwl1bnNpZ25lZCBjaGFyIHByZXZfYnVmW1BSRVZfQlVGX1NJWkVdOworCXNzaXplX3QgcHJldl9yZWFkID0gMDsKKwlsb25nIHByZXZfcG9zbiA9IDA7CisJY2hhciByYW5nZVtSQU5HRV9IRUFERVJfU0laRV07CisJc3RydWN0IGN1cmxfc2xpc3QgKnJhbmdlX2hlYWRlciA9IE5VTEw7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwlzbnByaW50ZihwcmV2ZmlsZSwgc2l6ZW9mKHByZXZmaWxlKSwgIiVzLnByZXYiLCBvYmpfcmVxLT5maWxlbmFtZSk7CisJdW5saW5rKHByZXZmaWxlKTsKKwlyZW5hbWUob2JqX3JlcS0+dG1wZmlsZSwgcHJldmZpbGUpOworCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKworCWlmIChvYmpfcmVxLT5sb2NhbCAhPSAtMSkKKwkJZXJyb3IoImZkIGxlYWthZ2UgaW4gc3RhcnQ6ICVkIiwgb2JqX3JlcS0+bG9jYWwpOworCW9ial9yZXEtPmxvY2FsID0gb3BlbihvYmpfcmVxLT50bXBmaWxlLAorCQkJICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwkvKiBUaGlzIGNvdWxkIGhhdmUgZmFpbGVkIGR1ZSB0byB0aGUgImxhenkgZGlyZWN0b3J5IGNyZWF0aW9uIjsKKwkgKiB0cnkgdG8gbWtkaXIgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQuCisJICovCisJaWYgKG9ial9yZXEtPmxvY2FsIDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKwkJY2hhciAqZGlyID0gc3RycmNocihvYmpfcmVxLT50bXBmaWxlLCAnLycpOworCQlpZiAoZGlyKSB7CisJCQkqZGlyID0gMDsKKwkJCW1rZGlyKG9ial9yZXEtPnRtcGZpbGUsIDA3NzcpOworCQkJKmRpciA9ICcvJzsKKwkJfQorCQlvYmpfcmVxLT5sb2NhbCA9IG9wZW4ob2JqX3JlcS0+dG1wZmlsZSwKKwkJCQkgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCX0KKworCWlmIChvYmpfcmVxLT5sb2NhbCA8IDApIHsKKwkJb2JqX3JlcS0+c3RhdGUgPSBBQk9SVEVEOworCQllcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIGZvciAlczogJXMiLAorCQkgICAgICBvYmpfcmVxLT50bXBmaWxlLCBvYmpfcmVxLT5maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmb2JqX3JlcS0+c3RyZWFtLCAwLCBzaXplb2Yob2JqX3JlcS0+c3RyZWFtKSk7CisKKwlpbmZsYXRlSW5pdCgmb2JqX3JlcS0+c3RyZWFtKTsKKworCVNIQTFfSW5pdCgmb2JqX3JlcS0+Yyk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihvYmpfcmVxLT5yZXBvLT5iYXNlKSArIDUxKTsKKwlvYmpfcmVxLT51cmwgPSB4bWFsbG9jKHN0cmxlbihvYmpfcmVxLT5yZXBvLT5iYXNlKSArIDUxKTsKKwlzdHJjcHkodXJsLCBvYmpfcmVxLT5yZXBvLT5iYXNlKTsKKwlwb3NuID0gdXJsICsgc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpOworCXN0cmNweShwb3NuLCAiL29iamVjdHMvIik7CisJcG9zbiArPSA5OworCW1lbWNweShwb3NuLCBoZXgsIDIpOworCXBvc24gKz0gMjsKKwkqKHBvc24rKykgPSAnLyc7CisJc3RyY3B5KHBvc24sIGhleCArIDIpOworCXN0cmNweShvYmpfcmVxLT51cmwsIHVybCk7CisKKwkvKiBJZiBhIHByZXZpb3VzIHRlbXAgZmlsZSBpcyBwcmVzZW50LCBwcm9jZXNzIHdoYXQgd2FzIGFscmVhZHkKKwkgICBmZXRjaGVkLiAqLworCXByZXZsb2NhbCA9IG9wZW4ocHJldmZpbGUsIE9fUkRPTkxZKTsKKwlpZiAocHJldmxvY2FsICE9IC0xKSB7CisJCWRvIHsKKwkJCXByZXZfcmVhZCA9IHhyZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgb2JqX3JlcSkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJm9ial9yZXEtPnN0cmVhbSwgMCwgc2l6ZW9mKG9ial9yZXEtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmb2JqX3JlcS0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZvYmpfcmVxLT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsob2JqX3JlcS0+bG9jYWwsIDAsIFNFRUtfU0VUKTsKKwkJCWZ0cnVuY2F0ZShvYmpfcmVxLT5sb2NhbCwgMCk7CisJCX0KKwl9CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3Nfb2JqZWN0X3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSBvYmpfcmVxOworCW9ial9yZXEtPnNsb3QgPSBzbG90OworCisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIG9ial9yZXEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfc2hhMV9maWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRVJST1JCVUZGRVIsIG9ial9yZXEtPmVycm9yc3RyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKworCS8qIElmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBkYXRhIGZyb20gYSBwcmV2aW91cyBmZXRjaAorCSAgIGF0dGVtcHQsIG9ubHkgZmV0Y2ggdGhlIGRhdGEgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlLiAqLworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBvYmplY3QgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJaGV4LCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLAorCQkJCSBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJLyogVHJ5IHRvIGdldCB0aGUgcmVxdWVzdCBzdGFydGVkLCBhYm9ydCB0aGUgcmVxdWVzdCBvbiBlcnJvciAqLworCW9ial9yZXEtPnN0YXRlID0gQUNUSVZFOworCWlmICghc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJb2JqX3JlcS0+c3RhdGUgPSBBQk9SVEVEOworCQlvYmpfcmVxLT5zbG90ID0gTlVMTDsKKwkJY2xvc2Uob2JqX3JlcS0+bG9jYWwpOyBvYmpfcmVxLT5sb2NhbCA9IC0xOworCQlmcmVlKG9ial9yZXEtPnVybCk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlmY2htb2Qob2JqX3JlcS0+bG9jYWwsIDA0NDQpOworCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsgb2JqX3JlcS0+bG9jYWwgPSAtMTsKKworCWlmIChvYmpfcmVxLT5odHRwX2NvZGUgPT0gNDE2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogcmVxdWVzdGVkIHJhbmdlIGludmFsaWQ7IHdlIG1heSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhLlxuIik7CisJfSBlbHNlIGlmIChvYmpfcmVxLT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQlpZiAoc3RhdChvYmpfcmVxLT50bXBmaWxlLCAmc3QpID09IDApCisJCQlpZiAoc3Quc3Rfc2l6ZSA9PSAwKQorCQkJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKworCWluZmxhdGVFbmQoJm9ial9yZXEtPnN0cmVhbSk7CisJU0hBMV9GaW5hbChvYmpfcmVxLT5yZWFsX3NoYTEsICZvYmpfcmVxLT5jKTsKKwlpZiAob2JqX3JlcS0+enJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCQlyZXR1cm47CisJfQorCWlmIChoYXNoY21wKG9ial9yZXEtPnNoYTEsIG9ial9yZXEtPnJlYWxfc2hhMSkpIHsKKwkJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCQlyZXR1cm47CisJfQorCW9ial9yZXEtPnJlbmFtZSA9CisJCW1vdmVfdGVtcF90b19maWxlKG9ial9yZXEtPnRtcGZpbGUsIG9ial9yZXEtPmZpbGVuYW1lKTsKKworCWlmIChvYmpfcmVxLT5yZW5hbWUgPT0gMCkKKwkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgob2JqX3JlcS0+c2hhMSkpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX29iamVjdF9yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSA9CisJCShzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKiljYWxsYmFja19kYXRhOworCisJb2JqX3JlcS0+Y3VybF9yZXN1bHQgPSBvYmpfcmVxLT5zbG90LT5jdXJsX3Jlc3VsdDsKKwlvYmpfcmVxLT5odHRwX2NvZGUgPSBvYmpfcmVxLT5zbG90LT5odHRwX2NvZGU7CisJb2JqX3JlcS0+c2xvdCA9IE5VTEw7CisJb2JqX3JlcS0+c3RhdGUgPSBDT01QTEVURTsKKworCS8qIFVzZSBhbHRlcm5hdGVzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChtaXNzaW5nX3RhcmdldChvYmpfcmVxKSkgeworCQlmZXRjaF9hbHRlcm5hdGVzKGFsdC0+YmFzZSk7CisJCWlmIChvYmpfcmVxLT5yZXBvLT5uZXh0ICE9IE5VTEwpIHsKKwkJCW9ial9yZXEtPnJlcG8gPQorCQkJCW9ial9yZXEtPnJlcG8tPm5leHQ7CisJCQljbG9zZShvYmpfcmVxLT5sb2NhbCk7CisJCQlvYmpfcmVxLT5sb2NhbCA9IC0xOworCQkJc3RhcnRfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmaW5pc2hfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfb2JqZWN0X3JlcXVlc3Qoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqZW50cnkgPSBvYmplY3RfcXVldWVfaGVhZDsKKworCWlmIChvYmpfcmVxLT5sb2NhbCAhPSAtMSkKKwkJZXJyb3IoImZkIGxlYWthZ2UgaW4gcmVsZWFzZTogJWQiLCBvYmpfcmVxLT5sb2NhbCk7CisJaWYgKG9ial9yZXEgPT0gb2JqZWN0X3F1ZXVlX2hlYWQpIHsKKwkJb2JqZWN0X3F1ZXVlX2hlYWQgPSBvYmpfcmVxLT5uZXh0OworCX0gZWxzZSB7CisJCXdoaWxlIChlbnRyeS0+bmV4dCAhPSBOVUxMICYmIGVudHJ5LT5uZXh0ICE9IG9ial9yZXEpCisJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQlpZiAoZW50cnktPm5leHQgPT0gb2JqX3JlcSkKKwkJCWVudHJ5LT5uZXh0ID0gZW50cnktPm5leHQtPm5leHQ7CisJfQorCisJZnJlZShvYmpfcmVxLT51cmwpOworCWZyZWUob2JqX3JlcSk7Cit9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQordm9pZCBmaWxsX2FjdGl2ZV9zbG90cyh2b2lkKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSA9IG9iamVjdF9xdWV1ZV9oZWFkOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJaW50IG51bV90cmFuc2ZlcnM7CisKKwl3aGlsZSAoYWN0aXZlX3JlcXVlc3RzIDwgbWF4X3JlcXVlc3RzICYmIG9ial9yZXEgIT0gTlVMTCkgeworCQlpZiAob2JqX3JlcS0+c3RhdGUgPT0gV0FJVElORykgeworCQkJaWYgKGhhc19zaGExX2ZpbGUob2JqX3JlcS0+c2hhMSkpCisJCQkJb2JqX3JlcS0+c3RhdGUgPSBDT01QTEVURTsKKwkJCWVsc2UKKwkJCQlzdGFydF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwkJCWN1cmxfbXVsdGlfcGVyZm9ybShjdXJsbSwgJm51bV90cmFuc2ZlcnMpOworCQl9CisJCW9ial9yZXEgPSBvYmpfcmVxLT5uZXh0OworCX0KKworCXdoaWxlIChzbG90ICE9IE5VTEwpIHsKKwkJaWYgKCFzbG90LT5pbl91c2UgJiYgc2xvdC0+Y3VybCAhPSBOVUxMKSB7CisJCQljdXJsX2Vhc3lfY2xlYW51cChzbG90LT5jdXJsKTsKKwkJCXNsb3QtPmN1cmwgPSBOVUxMOworCQl9CisJCXNsb3QgPSBzbG90LT5uZXh0OworCX0KK30KKyNlbmRpZgorCit2b2lkIHByZWZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpuZXdyZXE7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICp0YWlsOworCWNoYXIgKmZpbGVuYW1lID0gc2hhMV9maWxlX25hbWUoc2hhMSk7CisKKwluZXdyZXEgPSB4bWFsbG9jKHNpemVvZigqbmV3cmVxKSk7CisJaGFzaGNweShuZXdyZXEtPnNoYTEsIHNoYTEpOworCW5ld3JlcS0+cmVwbyA9IGFsdDsKKwluZXdyZXEtPnVybCA9IE5VTEw7CisJbmV3cmVxLT5sb2NhbCA9IC0xOworCW5ld3JlcS0+c3RhdGUgPSBXQUlUSU5HOworCXNucHJpbnRmKG5ld3JlcS0+ZmlsZW5hbWUsIHNpemVvZihuZXdyZXEtPmZpbGVuYW1lKSwgIiVzIiwgZmlsZW5hbWUpOworCXNucHJpbnRmKG5ld3JlcS0+dG1wZmlsZSwgc2l6ZW9mKG5ld3JlcS0+dG1wZmlsZSksCisJCSAiJXMudGVtcCIsIGZpbGVuYW1lKTsKKwluZXdyZXEtPnNsb3QgPSBOVUxMOworCW5ld3JlcS0+bmV4dCA9IE5VTEw7CisKKwlpZiAob2JqZWN0X3F1ZXVlX2hlYWQgPT0gTlVMTCkgeworCQlvYmplY3RfcXVldWVfaGVhZCA9IG5ld3JlcTsKKwl9IGVsc2UgeworCQl0YWlsID0gb2JqZWN0X3F1ZXVlX2hlYWQ7CisJCXdoaWxlICh0YWlsLT5uZXh0ICE9IE5VTEwpIHsKKwkJCXRhaWwgPSB0YWlsLT5uZXh0OworCQl9CisJCXRhaWwtPm5leHQgPSBuZXdyZXE7CisJfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlmaWxsX2FjdGl2ZV9zbG90cygpOworCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRleChzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqdXJsOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJRklMRSAqaW5kZXhmaWxlOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCWlmIChoYXNfcGFja19pbmRleChzaGExKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIGluZGV4IGZvciBwYWNrICVzXG4iLCBoZXgpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL3BhY2svcGFjay0lcy5pZHgiLCByZXBvLT5iYXNlLCBoZXgpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKTsKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCWluZGV4ZmlsZSA9IGZvcGVuKHRtcGZpbGUsICJhIik7CisJaWYgKCFpbmRleGZpbGUpCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayBpbmRleCIsCisJCQkgICAgIGZpbGVuYW1lKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIGluZGV4ZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisJc2xvdC0+bG9jYWwgPSBpbmRleGZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwoaW5kZXhmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKGdldF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2YgaW5kZXggZm9yIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJaGV4LCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZjbG9zZShpbmRleGZpbGUpOworCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZ2V0IHBhY2sgaW5kZXggJXNcbiVzIiwgdXJsLAorCQkJCSAgICAgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlmY2xvc2UoaW5kZXhmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworCWZjbG9zZShpbmRleGZpbGUpOworCisJcmV0dXJuIG1vdmVfdGVtcF90b19maWxlKHRtcGZpbGUsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIGludCBzZXR1cF9pbmRleChzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKm5ld19wYWNrOworCWlmIChoYXNfcGFja19maWxlKHNoYTEpKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgbGlzdCB0aGlzIGFzIHNvbWV0aGluZyB3ZSBjYW4gZ2V0ICovCisKKwlpZiAoZmV0Y2hfaW5kZXgocmVwbywgc2hhMSkpCisJCXJldHVybiAtMTsKKworCW5ld19wYWNrID0gcGFyc2VfcGFja19pbmRleChzaGExKTsKKwluZXdfcGFjay0+bmV4dCA9IHJlcG8tPnBhY2tzOworCXJlcG8tPnBhY2tzID0gbmV3X3BhY2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWx0ZXJuYXRlc19yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgKmFsdF9yZXEgPQorCQkoc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCAqKWNhbGxiYWNrX2RhdGE7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhbHRfcmVxLT5zbG90OworCXN0cnVjdCBhbHRfYmFzZSAqdGFpbCA9IGFsdDsKKwljb25zdCBjaGFyICpiYXNlID0gYWx0X3JlcS0+YmFzZTsKKwlzdGF0aWMgY29uc3QgY2hhciBudWxsX2J5dGUgPSAnXDAnOworCWNoYXIgKmRhdGE7CisJaW50IGkgPSAwOworCisJaWYgKGFsdF9yZXEtPmh0dHBfc3BlY2lmaWMpIHsKKwkJaWYgKHNsb3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LIHx8CisJCSAgICAhYWx0X3JlcS0+YnVmZmVyLT5wb3NuKSB7CisKKwkJCS8qIFRyeSByZXVzaW5nIHRoZSBzbG90IHRvIGdldCBub24taHR0cCBhbHRlcm5hdGVzICovCisJCQlhbHRfcmVxLT5odHRwX3NwZWNpZmljID0gMDsKKwkJCXNwcmludGYoYWx0X3JlcS0+dXJsLCAiJXMvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMiLAorCQkJCWJhc2UpOworCQkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwKKwkJCQkJIGFsdF9yZXEtPnVybCk7CisJCQlhY3RpdmVfcmVxdWVzdHMrKzsKKwkJCXNsb3QtPmluX3VzZSA9IDE7CisJCQlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJCQkoKnNsb3QtPmZpbmlzaGVkKSA9IDA7CisJCQlpZiAoIXN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQkJZ290X2FsdGVybmF0ZXMgPSAtMTsKKwkJCQlzbG90LT5pbl91c2UgPSAwOworCQkJCWlmIChzbG90LT5maW5pc2hlZCAhPSBOVUxMKQorCQkJCQkoKnNsb3QtPmZpbmlzaGVkKSA9IDE7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKHNsb3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCWlmICghbWlzc2luZ190YXJnZXQoc2xvdCkpIHsKKwkJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmd3JpdGVfYnVmZmVyKCZudWxsX2J5dGUsIDEsIDEsIGFsdF9yZXEtPmJ1ZmZlcik7CisJYWx0X3JlcS0+YnVmZmVyLT5wb3NuLS07CisJZGF0YSA9IGFsdF9yZXEtPmJ1ZmZlci0+YnVmZmVyOworCisJd2hpbGUgKGkgPCBhbHRfcmVxLT5idWZmZXItPnBvc24pIHsKKwkJaW50IHBvc24gPSBpOworCQl3aGlsZSAocG9zbiA8IGFsdF9yZXEtPmJ1ZmZlci0+cG9zbiAmJiBkYXRhW3Bvc25dICE9ICdcbicpCisJCQlwb3NuKys7CisJCWlmIChkYXRhW3Bvc25dID09ICdcbicpIHsKKwkJCWludCBva2F5ID0gMDsKKwkJCWludCBzZXJ2ZXJsZW4gPSAwOworCQkJc3RydWN0IGFsdF9iYXNlICpuZXdhbHQ7CisJCQljaGFyICp0YXJnZXQgPSBOVUxMOworCQkJaWYgKGRhdGFbaV0gPT0gJy8nKSB7CisJCQkJLyogVGhpcyBjb3VudHMKKwkJCQkgKiBodHRwOi8vZ2l0Lmhvc3QvcHViL3NjbS9saW51eC5naXQvCisJCQkJICogLS0tLS0tLS0tLS1oZXJlXgorCQkJCSAqIHNvIG1lbWNweShkc3QsIGJhc2UsIHNlcnZlcmxlbikgd2lsbAorCQkJCSAqIGNvcHkgdXAgdG8gIi4uLmdpdC5ob3N0Ii4KKwkJCQkgKi8KKwkJCQljb25zdCBjaGFyICpjb2xvbl9zcyA9IHN0cnN0cihiYXNlLCI6Ly8iKTsKKwkJCQlpZiAoY29sb25fc3MpIHsKKwkJCQkJc2VydmVybGVuID0gKHN0cmNocihjb2xvbl9zcyArIDMsICcvJykKKwkJCQkJCSAgICAgLSBiYXNlKTsKKwkJCQkJb2theSA9IDE7CisJCQkJfQorCQkJfSBlbHNlIGlmICghbWVtY21wKGRhdGEgKyBpLCAiLi4vIiwgMykpIHsKKwkJCQkvKiBSZWxhdGl2ZSBVUkw7IGNob3AgdGhlIGNvcnJlc3BvbmRpbmcKKwkJCQkgKiBudW1iZXIgb2Ygc3VicGF0aCBmcm9tIGJhc2UgKGFuZCAuLi8KKwkJCQkgKiBmcm9tIGRhdGEpLCBhbmQgY29uY2F0ZW5hdGUgdGhlIHJlc3VsdC4KKwkJCQkgKgorCQkJCSAqIFRoZSBjb2RlIGZpcnN0IGRyb3BzIC4uLyBmcm9tIGRhdGEsIGFuZAorCQkJCSAqIHRoZW4gZHJvcHMgb25lIC4uLyBmcm9tIGRhdGEgYW5kIG9uZSBwYXRoCisJCQkJICogZnJvbSBiYXNlLiAgSU9XLCBvbmUgZXh0cmEgLi4vIGlzIGRyb3BwZWQKKwkJCQkgKiBmcm9tIGRhdGEgdGhhbiBwYXRoIGlzIGRyb3BwZWQgZnJvbSBiYXNlLgorCQkJCSAqCisJCQkJICogVGhpcyBpcyBub3Qgd3JvbmcuICBUaGUgYWx0ZXJuYXRlIGluCisJCQkJICogICAgIGh0dHA6Ly9naXQuaG9zdC9wdWIvc2NtL2xpbnV4LmdpdC8KKwkJCQkgKiB0byBib3Jyb3cgZnJvbQorCQkJCSAqICAgICBodHRwOi8vZ2l0Lmhvc3QvcHViL3NjbS9saW51cy5naXQvCisJCQkJICogaXMgLi4vLi4vbGludXMuZ2l0L29iamVjdHMvLiAgWW91IG5lZWQKKwkJCQkgKiB0d28gLi4vLi4vIHRvIGJvcnJvdyBmcm9tIHlvdXIgZGlyZWN0CisJCQkJICogbmVpZ2hib3VyLgorCQkJCSAqLworCQkJCWkgKz0gMzsKKwkJCQlzZXJ2ZXJsZW4gPSBzdHJsZW4oYmFzZSk7CisJCQkJd2hpbGUgKGkgKyAyIDwgcG9zbiAmJgorCQkJCSAgICAgICAhbWVtY21wKGRhdGEgKyBpLCAiLi4vIiwgMykpIHsKKwkJCQkJZG8geworCQkJCQkJc2VydmVybGVuLS07CisJCQkJCX0gd2hpbGUgKHNlcnZlcmxlbiAmJgorCQkJCQkJIGJhc2Vbc2VydmVybGVuIC0gMV0gIT0gJy8nKTsKKwkJCQkJaSArPSAzOworCQkJCX0KKwkJCQkvKiBJZiB0aGUgc2VydmVyIGdvdCByZW1vdmVkLCBnaXZlIHVwLiAqLworCQkJCW9rYXkgPSBzdHJjaHIoYmFzZSwgJzonKSAtIGJhc2UgKyAzIDwKKwkJCQkJc2VydmVybGVuOworCQkJfSBlbHNlIGlmIChhbHRfcmVxLT5odHRwX3NwZWNpZmljKSB7CisJCQkJY2hhciAqY29sb24gPSBzdHJjaHIoZGF0YSArIGksICc6Jyk7CisJCQkJY2hhciAqc2xhc2ggPSBzdHJjaHIoZGF0YSArIGksICcvJyk7CisJCQkJaWYgKGNvbG9uICYmIHNsYXNoICYmIGNvbG9uIDwgZGF0YSArIHBvc24gJiYKKwkJCQkgICAgc2xhc2ggPCBkYXRhICsgcG9zbiAmJiBjb2xvbiA8IHNsYXNoKSB7CisJCQkJCW9rYXkgPSAxOworCQkJCX0KKwkJCX0KKwkJCS8qIHNraXAgIm9iamVjdHNcbiIgYXQgZW5kICovCisJCQlpZiAob2theSkgeworCQkJCXRhcmdldCA9IHhtYWxsb2Moc2VydmVybGVuICsgcG9zbiAtIGkgLSA2KTsKKwkJCQltZW1jcHkodGFyZ2V0LCBiYXNlLCBzZXJ2ZXJsZW4pOworCQkJCW1lbWNweSh0YXJnZXQgKyBzZXJ2ZXJsZW4sIGRhdGEgKyBpLAorCQkJCSAgICAgICBwb3NuIC0gaSAtIDcpOworCQkJCXRhcmdldFtzZXJ2ZXJsZW4gKyBwb3NuIC0gaSAtIDddID0gMDsKKwkJCQlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkiQWxzbyBsb29rIGF0ICVzXG4iLCB0YXJnZXQpOworCQkJCW5ld2FsdCA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdhbHQpKTsKKwkJCQluZXdhbHQtPm5leHQgPSBOVUxMOworCQkJCW5ld2FsdC0+YmFzZSA9IHRhcmdldDsKKwkJCQluZXdhbHQtPmdvdF9pbmRpY2VzID0gMDsKKwkJCQluZXdhbHQtPnBhY2tzID0gTlVMTDsKKworCQkJCXdoaWxlICh0YWlsLT5uZXh0ICE9IE5VTEwpCisJCQkJCXRhaWwgPSB0YWlsLT5uZXh0OworCQkJCXRhaWwtPm5leHQgPSBuZXdhbHQ7CisJCQl9CisJCX0KKwkJaSA9IHBvc24gKyAxOworCX0KKworCWdvdF9hbHRlcm5hdGVzID0gMTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfYWx0ZXJuYXRlcyhjb25zdCBjaGFyICpiYXNlKQoreworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKnVybDsKKwljaGFyICpkYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgYWx0X3JlcTsKKworCS8qIElmIGFub3RoZXIgcmVxdWVzdCBoYXMgYWxyZWFkeSBzdGFydGVkIGZldGNoaW5nIGFsdGVybmF0ZXMsCisJICAgd2FpdCBmb3IgdGhlbSB0byBhcnJpdmUgYW5kIHJldHVybiB0byBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCdzCisJICAgY3VybCBtZXNzYWdlICovCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAoZ290X2FsdGVybmF0ZXMgPT0gMCkgeworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCX0KKyNlbmRpZgorCisJLyogTm90aGluZyB0byBkbyBpZiB0aGV5J3ZlIGFscmVhZHkgYmVlbiBmZXRjaGVkICovCisJaWYgKGdvdF9hbHRlcm5hdGVzID09IDEpCisJCXJldHVybjsKKworCS8qIFN0YXJ0IHRoZSBmZXRjaCAqLworCWdvdF9hbHRlcm5hdGVzID0gMDsKKworCWRhdGEgPSB4bWFsbG9jKDQwOTYpOworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IGRhdGE7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIGFsdGVybmF0ZXMgbGlzdCBmb3IgJXNcbiIsIGJhc2UpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4oYmFzZSkgKyAzMSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL2luZm8vaHR0cC1hbHRlcm5hdGVzIiwgYmFzZSk7CisKKwkvKiBVc2UgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSByZXN1bHQsIHNpbmNlIGFub3RoZXIgcmVxdWVzdAorCSAgIG1heSBmYWlsIGFuZCBuZWVkIHRvIGhhdmUgYWx0ZXJuYXRlcyBsb2FkZWQgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfYWx0ZXJuYXRlc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gJmFsdF9yZXE7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisKKwlhbHRfcmVxLmJhc2UgPSBiYXNlOworCWFsdF9yZXEudXJsID0gdXJsOworCWFsdF9yZXEuYnVmZmVyID0gJmJ1ZmZlcjsKKwlhbHRfcmVxLmh0dHBfc3BlY2lmaWMgPSAxOworCWFsdF9yZXEuc2xvdCA9IHNsb3Q7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpCisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwllbHNlCisJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisKKwlmcmVlKGRhdGEpOworCWZyZWUodXJsKTsKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRpY2VzKHN0cnVjdCBhbHRfYmFzZSAqcmVwbykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKnVybDsKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwljaGFyICpkYXRhOworCWludCBpID0gMDsKKworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCWlmIChyZXBvLT5nb3RfaW5kaWNlcykKKwkJcmV0dXJuIDA7CisKKwlkYXRhID0geG1hbGxvYyg0MDk2KTsKKwlidWZmZXIuc2l6ZSA9IDQwOTY7CisJYnVmZmVyLnBvc24gPSAwOworCWJ1ZmZlci5idWZmZXIgPSBkYXRhOworCisJaWYgKGdldF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrIGxpc3QgZm9yICVzXG4iLCByZXBvLT5iYXNlKTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgMjEpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9pbmZvL3BhY2tzIiwgcmVwby0+YmFzZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWlmIChtaXNzaW5nX3RhcmdldCgmcmVzdWx0cykpIHsKKwkJCQlyZXBvLT5nb3RfaW5kaWNlcyA9IDE7CisJCQkJZnJlZShidWZmZXIuYnVmZmVyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmVwby0+Z290X2luZGljZXMgPSAwOworCQkJCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJCQkJcmV0dXJuIGVycm9yKCIlcyIsIGN1cmxfZXJyb3JzdHIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmVwby0+Z290X2luZGljZXMgPSAwOworCQlmcmVlKGJ1ZmZlci5idWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZGF0YSA9IGJ1ZmZlci5idWZmZXI7CisJd2hpbGUgKGkgPCBidWZmZXIucG9zbikgeworCQlzd2l0Y2ggKGRhdGFbaV0pIHsKKwkJY2FzZSAnUCc6CisJCQlpKys7CisJCQlpZiAoaSArIDUyIDw9IGJ1ZmZlci5wb3NuICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSwgIiBwYWNrLSIpICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSArIDQ2LCAiLnBhY2tcbiIpKSB7CisJCQkJZ2V0X3NoYTFfaGV4KGRhdGEgKyBpICsgNiwgc2hhMSk7CisJCQkJc2V0dXBfaW5kZXgocmVwbywgc2hhMSk7CisJCQkJaSArPSA1MTsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXdoaWxlIChpIDwgYnVmZmVyLnBvc24gJiYgZGF0YVtpXSAhPSAnXG4nKQorCQkJCWkrKzsKKwkJfQorCQlpKys7CisJfQorCisJZnJlZShidWZmZXIuYnVmZmVyKTsKKwlyZXBvLT5nb3RfaW5kaWNlcyA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfcGFjayhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJc3RydWN0IHBhY2tlZF9naXQgKipsc3Q7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlpbnQgcmV0OworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCWlmIChmZXRjaF9pbmRpY2VzKHJlcG8pKQorCQlyZXR1cm4gLTE7CisJdGFyZ2V0ID0gZmluZF9zaGExX3BhY2soc2hhMSwgcmVwby0+cGFja3MpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgcGFjayAlc1xuIiwKKwkJCXNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSkpOworCQlmcHJpbnRmKHN0ZGVyciwgIiB3aGljaCBjb250YWlucyAlc1xuIiwKKwkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZXBvLT5iYXNlKSArIDY1KTsKKwlzcHJpbnRmKHVybCwgIiVzL29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLAorCQlyZXBvLT5iYXNlLCBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKworCWZpbGVuYW1lID0gc2hhMV9wYWNrX25hbWUodGFyZ2V0LT5zaGExKTsKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCXBhY2tmaWxlID0gZm9wZW4odG1wZmlsZSwgImEiKTsKKwlpZiAoIXBhY2tmaWxlKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBvcGVuIGxvY2FsIGZpbGUgJXMgZm9yIHBhY2siLAorCQkJICAgICBmaWxlbmFtZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCBwYWNrZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisJc2xvdC0+bG9jYWwgPSBwYWNrZmlsZTsKKworCS8qIElmIHRoZXJlIGlzIGRhdGEgcHJlc2VudCBmcm9tIGEgcHJldmlvdXMgdHJhbnNmZXIgYXR0ZW1wdCwKKwkgICByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgKi8KKwlwcmV2X3Bvc24gPSBmdGVsbChwYWNrZmlsZSk7CisJaWYgKHByZXZfcG9zbj4wKSB7CisJCWlmIChnZXRfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmY2xvc2UocGFja2ZpbGUpOworCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZ2V0IHBhY2sgZmlsZSAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZjbG9zZShwYWNrZmlsZSk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwl0YXJnZXQtPnBhY2tfc2l6ZSA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlmY2xvc2UocGFja2ZpbGUpOworCisJcmV0ID0gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlsc3QgPSAmcmVwby0+cGFja3M7CisJd2hpbGUgKCpsc3QgIT0gdGFyZ2V0KQorCQlsc3QgPSAmKCgqbHN0KS0+bmV4dCk7CisJKmxzdCA9ICgqbHN0KS0+bmV4dDsKKworCWlmICh2ZXJpZnlfcGFjayh0YXJnZXQsIDApKQorCQlyZXR1cm4gLTE7CisJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWJvcnRfb2JqZWN0X3JlcXVlc3Qoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCWlmIChvYmpfcmVxLT5sb2NhbCA+PSAwKSB7CisJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsKKwkJb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwl9CisJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCWlmIChvYmpfcmVxLT5zbG90KSB7CisgCQlyZWxlYXNlX2FjdGl2ZV9zbG90KG9ial9yZXEtPnNsb3QpOworCQlvYmpfcmVxLT5zbG90ID0gTlVMTDsKKwl9CisJcmVsZWFzZV9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKK30KKworc3RhdGljIGludCBmZXRjaF9vYmplY3Qoc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKmhleCA9IHNoYTFfdG9faGV4KHNoYTEpOworCWludCByZXQgPSAwOworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSA9IG9iamVjdF9xdWV1ZV9oZWFkOworCisJd2hpbGUgKG9ial9yZXEgIT0gTlVMTCAmJiBoYXNoY21wKG9ial9yZXEtPnNoYTEsIHNoYTEpKQorCQlvYmpfcmVxID0gb2JqX3JlcS0+bmV4dDsKKwlpZiAob2JqX3JlcSA9PSBOVUxMKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGZpbmQgcmVxdWVzdCBmb3IgJXMgaW4gdGhlIHF1ZXVlIiwgaGV4KTsKKworCWlmIChoYXNfc2hhMV9maWxlKG9ial9yZXEtPnNoYTEpKSB7CisJCWFib3J0X29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCXdoaWxlIChvYmpfcmVxLT5zdGF0ZSA9PSBXQUlUSU5HKSB7CisJCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisJfQorI2Vsc2UKKwlzdGFydF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKyNlbmRpZgorCisJd2hpbGUgKG9ial9yZXEtPnN0YXRlID09IEFDVElWRSkgeworCQlydW5fYWN0aXZlX3Nsb3Qob2JqX3JlcS0+c2xvdCk7CisJfQorCWlmIChvYmpfcmVxLT5sb2NhbCAhPSAtMSkgeworCQljbG9zZShvYmpfcmVxLT5sb2NhbCk7IG9ial9yZXEtPmxvY2FsID0gLTE7CisJfQorCisJaWYgKG9ial9yZXEtPnN0YXRlID09IEFCT1JURUQpIHsKKwkJcmV0ID0gZXJyb3IoIlJlcXVlc3QgZm9yICVzIGFib3J0ZWQiLCBoZXgpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0sgJiYKKwkJICAgb2JqX3JlcS0+aHR0cF9jb2RlICE9IDQxNikgeworCQlpZiAobWlzc2luZ190YXJnZXQob2JqX3JlcSkpCisJCQlyZXQgPSAtMTsgLyogQmUgc2lsZW50LCBpdCBpcyBwcm9iYWJseSBpbiBhIHBhY2suICovCisJCWVsc2UKKwkJCXJldCA9IGVycm9yKCIlcyAoY3VybF9yZXN1bHQgPSAlZCwgaHR0cF9jb2RlID0gJWxkLCBzaGExID0gJXMpIiwKKwkJCQkgICAgb2JqX3JlcS0+ZXJyb3JzdHIsIG9ial9yZXEtPmN1cmxfcmVzdWx0LAorCQkJCSAgICBvYmpfcmVxLT5odHRwX2NvZGUsIGhleCk7CisJfSBlbHNlIGlmIChvYmpfcmVxLT56cmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQljb3JydXB0X29iamVjdF9mb3VuZCsrOworCQlyZXQgPSBlcnJvcigiRmlsZSAlcyAoJXMpIGNvcnJ1cHQiLCBoZXgsIG9ial9yZXEtPnVybCk7CisJfSBlbHNlIGlmIChoYXNoY21wKG9ial9yZXEtPnNoYTEsIG9ial9yZXEtPnJlYWxfc2hhMSkpIHsKKwkJcmV0ID0gZXJyb3IoIkZpbGUgJXMgaGFzIGJhZCBoYXNoIiwgaGV4KTsKKwl9IGVsc2UgaWYgKG9ial9yZXEtPnJlbmFtZSA8IDApIHsKKwkJcmV0ID0gZXJyb3IoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGVuYW1lICVzIiwKKwkJCSAgICBvYmpfcmVxLT5maWxlbmFtZSk7CisJfQorCisJcmVsZWFzZV9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgYWx0X2Jhc2UgKmFsdGJhc2UgPSBhbHQ7CisKKwlpZiAoIWZldGNoX29iamVjdChhbHRiYXNlLCBzaGExKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKGFsdGJhc2UpIHsKKwkJaWYgKCFmZXRjaF9wYWNrKGFsdGJhc2UsIHNoYTEpKQorCQkJcmV0dXJuIDA7CisJCWZldGNoX2FsdGVybmF0ZXMoYWx0LT5iYXNlKTsKKwkJYWx0YmFzZSA9IGFsdGJhc2UtPm5leHQ7CisJfQorCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGZpbmQgJXMgdW5kZXIgJXMiLCBzaGExX3RvX2hleChzaGExKSwKKwkJICAgICBhbHQtPmJhc2UpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19xdW90ZShpbnQgY2gpCit7CisJaWYgKCgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkKKwkJCXx8ICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkKKwkJCXx8ICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJCXx8IChjaCA9PSAnLycpCisJCQl8fCAoY2ggPT0gJy0nKQorCQkJfHwgKGNoID09ICcuJykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXgoaW50IHYpCit7CisJaWYgKHYgPCAxMCkgcmV0dXJuICcwJyArIHY7CisJZWxzZSByZXR1cm4gJ0EnICsgdiAtIDEwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfcmVmX3VybChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZHAsICpxcmVmOworCWludCBsZW4sIGJhc2VsZW4sIGNoOworCisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlsZW4gPSBiYXNlbGVuICsgNzsgLyogIi9yZWZzLyIgKyBOVUwgKi8KKwlmb3IgKGNwID0gcmVmOyAoY2ggPSAqY3ApICE9IDA7IGNwKyssIGxlbisrKQorCQlpZiAobmVlZHNfcXVvdGUoY2gpKQorCQkJbGVuICs9IDI7IC8qIGV4dHJhIHR3byBoZXggcGx1cyByZXBsYWNlbWVudCAlICovCisJcXJlZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkocXJlZiwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KHFyZWYgKyBiYXNlbGVuLCAiL3JlZnMvIiwgNik7CisJZm9yIChjcCA9IHJlZiwgZHAgPSBxcmVmICsgYmFzZWxlbiArIDY7IChjaCA9ICpjcCkgIT0gMDsgY3ArKykgeworCQlpZiAobmVlZHNfcXVvdGUoY2gpKSB7CisJCQkqZHArKyA9ICclJzsKKwkJCSpkcCsrID0gaGV4KChjaCA+PiA0KSAmIDB4Rik7CisJCQkqZHArKyA9IGhleChjaCAmIDB4Rik7CisJCX0KKwkJZWxzZQorCQkJKmRwKysgPSBjaDsKKwl9CisJKmRwID0gMDsKKworCXJldHVybiBxcmVmOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKyAgICAgICAgY2hhciAqdXJsOworICAgICAgICBjaGFyIGhleFs0Ml07CisgICAgICAgIHN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNvbnN0IGNoYXIgKmJhc2UgPSBhbHQtPmJhc2U7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworICAgICAgICBidWZmZXIuc2l6ZSA9IDQxOworICAgICAgICBidWZmZXIucG9zbiA9IDA7CisgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBoZXg7CisgICAgICAgIGhleFs0MV0gPSAnXDAnOworCisJdXJsID0gcXVvdGVfcmVmX3VybChiYXNlLCByZWYpOworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykKKwkJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgZ2V0ICVzIGZvciAlc1xuJXMiLAorCQkJCSAgICAgdXJsLCByZWYsIGN1cmxfZXJyb3JzdHIpOworCX0gZWxzZSB7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKyAgICAgICAgaGV4WzQwXSA9ICdcMCc7CisgICAgICAgIGdldF9zaGExX2hleChoZXgsIHNoYTEpOworICAgICAgICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBjb21taXRzOworCWNvbnN0IGNoYXIgKip3cml0ZV9yZWYgPSBOVUxMOworCWNoYXIgKipjb21taXRfaWQ7CisJY29uc3QgY2hhciAqdXJsOworCWNoYXIgKnM7CisJaW50IGFyZyA9IDE7CisJaW50IHJjID0gMDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisJCQlnZXRfdHJlZSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKwkJCWdldF9hbGwgPSAxOworCQkJZ2V0X3RyZWUgPSAxOworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpIHsKKwkJCWdldF92ZXJib3NlbHkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndycpIHsKKwkJCXdyaXRlX3JlZiA9ICZhcmd2W2FyZyArIDFdOworCQkJYXJnKys7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworCQkJZ2V0X3JlY292ZXIgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1zdGRpbiIpKSB7CisJCQljb21taXRzX29uX3N0ZGluID0gMTsKKwkJfQorCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyIC0gY29tbWl0c19vbl9zdGRpbikgeworCQl1c2FnZSgiZ2l0LWh0dHAtZmV0Y2ggWy1jXSBbLXRdIFstYV0gWy12XSBbLS1yZWNvdmVyXSBbLXcgcmVmXSBbLS1zdGRpbl0gY29tbWl0LWlkIHVybCIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGNvbW1pdHNfb25fc3RkaW4pIHsKKwkJY29tbWl0cyA9IHB1bGxfdGFyZ2V0c19zdGRpbigmY29tbWl0X2lkLCAmd3JpdGVfcmVmKTsKKwl9IGVsc2UgeworCQljb21taXRfaWQgPSAoY2hhciAqKikgJmFyZ3ZbYXJnKytdOworCQljb21taXRzID0gMTsKKwl9CisJdXJsID0gYXJndlthcmddOworCisJaHR0cF9pbml0KCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKworCWFsdCA9IHhtYWxsb2Moc2l6ZW9mKCphbHQpKTsKKwlhbHQtPmJhc2UgPSB4bWFsbG9jKHN0cmxlbih1cmwpICsgMSk7CisJc3RyY3B5KGFsdC0+YmFzZSwgdXJsKTsKKwlmb3IgKHMgPSBhbHQtPmJhc2UgKyBzdHJsZW4oYWx0LT5iYXNlKSAtIDE7ICpzID09ICcvJzsgLS1zKQorCQkqcyA9IDA7CisJYWx0LT5nb3RfaW5kaWNlcyA9IDA7CisJYWx0LT5wYWNrcyA9IE5VTEw7CisJYWx0LT5uZXh0ID0gTlVMTDsKKworCWlmIChwdWxsKGNvbW1pdHMsIGNvbW1pdF9pZCwgd3JpdGVfcmVmLCB1cmwpKQorCQlyYyA9IDE7CisKKwlodHRwX2NsZWFudXAoKTsKKworCWN1cmxfc2xpc3RfZnJlZV9hbGwobm9fcHJhZ21hX2hlYWRlcik7CisKKwlpZiAoY29tbWl0c19vbl9zdGRpbikKKwkJcHVsbF90YXJnZXRzX2ZyZWUoY29tbWl0cywgY29tbWl0X2lkLCB3cml0ZV9yZWYpOworCisJaWYgKGNvcnJ1cHRfb2JqZWN0X2ZvdW5kKSB7CisJCWZwcmludGYoc3RkZXJyLAorIlNvbWUgbG9vc2Ugb2JqZWN0IHdlcmUgZm91bmQgdG8gYmUgY29ycnVwdCwgYnV0IHRoZXkgbWlnaHQgYmUganVzdFxuIgorImEgZmFsc2UgJzQwNCBOb3QgRm91bmQnIGVycm9yIG1lc3NhZ2Ugc2VudCB3aXRoIGluY29ycmVjdCBIVFRQXG4iCisic3RhdHVzIGNvZGUuICBTdWdnZXN0IHJ1bm5pbmcgZ2l0LWZzY2suXG4iKTsKKwl9CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaHR0cC1wdXNoLmMgYi9odHRwLXB1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y3Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvaHR0cC1wdXNoLmMKQEAgLTAsMCArMSwyNTUzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiaHR0cC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCisjaW5jbHVkZSA8ZXhwYXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgaHR0cF9wdXNoX3VzYWdlW10gPQorImdpdC1odHRwLXB1c2ggWy0tYWxsXSBbLS1mb3JjZV0gWy0tdmVyYm9zZV0gPHJlbW90ZT4gWzxoZWFkPi4uLl1cbiI7CisKKyNpZm5kZWYgWE1MX1NUQVRVU19PSworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19PSyA9IDEsCisgIFhNTF9TVEFUVVNfRVJST1IgPSAwCit9OworI2RlZmluZSBYTUxfU1RBVFVTX09LICAgIDEKKyNkZWZpbmUgWE1MX1NUQVRVU19FUlJPUiAwCisjZW5kaWYKKworI2RlZmluZSBQUkVWX0JVRl9TSVpFIDQwOTYKKyNkZWZpbmUgUkFOR0VfSEVBREVSX1NJWkUgMzAKKworLyogREFWIG1ldGhvZHMgKi8KKyNkZWZpbmUgREFWX0xPQ0sgIkxPQ0siCisjZGVmaW5lIERBVl9NS0NPTCAiTUtDT0wiCisjZGVmaW5lIERBVl9NT1ZFICJNT1ZFIgorI2RlZmluZSBEQVZfUFJPUEZJTkQgIlBST1BGSU5EIgorI2RlZmluZSBEQVZfUFVUICJQVVQiCisjZGVmaW5lIERBVl9VTkxPQ0sgIlVOTE9DSyIKKyNkZWZpbmUgREFWX0RFTEVURSAiREVMRVRFIgorCisvKiBEQVYgbG9jayBmbGFncyAqLworI2RlZmluZSBEQVZfUFJPUF9MT0NLV1IgKDF1IDw8IDApCisjZGVmaW5lIERBVl9QUk9QX0xPQ0tFWCAoMXUgPDwgMSkKKyNkZWZpbmUgREFWX0xPQ0tfT0sgKDF1IDw8IDIpCisKKy8qIERBViBYTUwgcHJvcGVydGllcyAqLworI2RlZmluZSBEQVZfQ1RYX0xPQ0tFTlRSWSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkiCisjZGVmaW5lIERBVl9DVFhfTE9DS1RZUEVfV1JJVEUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5wcm9wc3RhdC5wcm9wLnN1cHBvcnRlZGxvY2subG9ja2VudHJ5LmxvY2t0eXBlLndyaXRlIgorI2RlZmluZSBEQVZfQ1RYX0xPQ0tUWVBFX0VYQ0xVU0lWRSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkubG9ja3Njb3BlLmV4Y2x1c2l2ZSIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfT1dORVIgIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5vd25lci5ocmVmIgorI2RlZmluZSBEQVZfQUNUSVZFTE9DS19USU1FT1VUICIucHJvcC5sb2NrZGlzY292ZXJ5LmFjdGl2ZWxvY2sudGltZW91dCIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfVE9LRU4gIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5sb2NrdG9rZW4uaHJlZiIKKyNkZWZpbmUgREFWX1BST1BGSU5EX1JFU1AgIi5tdWx0aXN0YXR1cy5yZXNwb25zZSIKKyNkZWZpbmUgREFWX1BST1BGSU5EX05BTUUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5ocmVmIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfQ09MTEVDVElPTiAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3AucmVzb3VyY2V0eXBlLmNvbGxlY3Rpb24iCisKKy8qIERBViByZXF1ZXN0IGJvZHkgdGVtcGxhdGVzICovCisjZGVmaW5lIFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6cHJvcGZpbmQgeG1sbnM6RD1cIkRBVjpcIj5cbjxEOnByb3AgeG1sbnM6Uj1cIiVzXCI+XG48RDpzdXBwb3J0ZWRsb2NrLz5cbjwvRDpwcm9wPlxuPC9EOnByb3BmaW5kPiIKKyNkZWZpbmUgUFJPUEZJTkRfQUxMX1JFUVVFU1QgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz5cbjxEOnByb3BmaW5kIHhtbG5zOkQ9XCJEQVY6XCI+XG48RDphbGxwcm9wLz5cbjwvRDpwcm9wZmluZD4iCisjZGVmaW5lIExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6bG9ja2luZm8geG1sbnM6RD1cIkRBVjpcIj5cbjxEOmxvY2tzY29wZT48RDpleGNsdXNpdmUvPjwvRDpsb2Nrc2NvcGU+XG48RDpsb2NrdHlwZT48RDp3cml0ZS8+PC9EOmxvY2t0eXBlPlxuPEQ6b3duZXI+XG48RDpocmVmPm1haWx0bzolczwvRDpocmVmPlxuPC9EOm93bmVyPlxuPC9EOmxvY2tpbmZvPiIKKworI2RlZmluZSBMT0NLX1RJTUUgNjAwCisjZGVmaW5lIExPQ0tfUkVGUkVTSCAzMAorCisvKiBiaXRzICMwLTE1IGluIHJldmlzaW9uLmggKi8KKworI2RlZmluZSBMT0NBTCAgICAoMXU8PDE2KQorI2RlZmluZSBSRU1PVEUgICAoMXU8PDE3KQorI2RlZmluZSBGRVRDSElORyAoMXU8PDE4KQorI2RlZmluZSBQVVNISU5HICAoMXU8PDE5KQorCisvKiBXZSBhbGxvdyAicmVjdXJzaXZlIiBzeW1ib2xpYyByZWZzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaCAqLworI2RlZmluZSBNQVhERVBUSCA1CisKK3N0YXRpYyBpbnQgcHVzaGluZzsKK3N0YXRpYyBpbnQgYWJvcnRlZDsKK3N0YXRpYyBzaWduZWQgY2hhciByZW1vdGVfZGlyX2V4aXN0c1syNTZdOworCitzdGF0aWMgc3RydWN0IGN1cmxfc2xpc3QgKm5vX3ByYWdtYV9oZWFkZXI7CitzdGF0aWMgc3RydWN0IGN1cmxfc2xpc3QgKmRlZmF1bHRfaGVhZGVyczsKKworc3RhdGljIGludCBwdXNoX3ZlcmJvc2VseTsKK3N0YXRpYyBpbnQgcHVzaF9hbGw7CitzdGF0aWMgaW50IGZvcmNlX2FsbDsKKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqb2JqZWN0czsKKworc3RydWN0IHJlcG8KK3sKKwljaGFyICp1cmw7CisJaW50IHBhdGhfbGVuOworCWludCBoYXNfaW5mb19yZWZzOworCWludCBjYW5fdXBkYXRlX2luZm9fcmVmczsKKwlpbnQgaGFzX2luZm9fcGFja3M7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzOworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9ja3M7Cit9OworCitzdGF0aWMgc3RydWN0IHJlcG8gKnJlbW90ZTsKKworZW51bSB0cmFuc2Zlcl9zdGF0ZSB7CisJTkVFRF9GRVRDSCwKKwlSVU5fRkVUQ0hfTE9PU0UsCisJUlVOX0ZFVENIX1BBQ0tFRCwKKwlORUVEX1BVU0gsCisJUlVOX01LQ09MLAorCVJVTl9QVVQsCisJUlVOX01PVkUsCisJQUJPUlRFRCwKKwlDT01QTEVURSwKK307CisKK3N0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0Cit7CisJc3RydWN0IG9iamVjdCAqb2JqOworCWNoYXIgKnVybDsKKwljaGFyICpkZXN0OworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jazsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZGVyczsKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBsb2NhbF9maWxlbm87CisJRklMRSAqbG9jYWxfc3RyZWFtOworCWVudW0gdHJhbnNmZXJfc3RhdGUgc3RhdGU7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJY2hhciBlcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCWxvbmcgaHR0cF9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gc3RyZWFtOworCWludCB6cmV0OworCWludCByZW5hbWU7CisJdm9pZCAqdXNlckRhdGE7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3RfcXVldWVfaGVhZDsKKworc3RydWN0IHhtbF9jdHgKK3sKKwljaGFyICpuYW1lOworCWludCBsZW47CisJY2hhciAqY2RhdGE7CisJdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCk7CisJdm9pZCAqdXNlckRhdGE7Cit9OworCitzdHJ1Y3QgcmVtb3RlX2xvY2sKK3sKKwljaGFyICp1cmw7CisJY2hhciAqb3duZXI7CisJY2hhciAqdG9rZW47CisJdGltZV90IHN0YXJ0X3RpbWU7CisJbG9uZyB0aW1lb3V0OworCWludCByZWZyZXNoaW5nOworCXN0cnVjdCByZW1vdGVfbG9jayAqbmV4dDsKK307CisKKy8qIEZsYWdzIHRoYXQgY29udHJvbCByZW1vdGVfbHMgcHJvY2Vzc2luZyAqLworI2RlZmluZSBQUk9DRVNTX0ZJTEVTICgxdSA8PCAwKQorI2RlZmluZSBQUk9DRVNTX0RJUlMgICgxdSA8PCAxKQorI2RlZmluZSBSRUNVUlNJVkUgICAgICgxdSA8PCAyKQorCisvKiBGbGFncyB0aGF0IHJlbW90ZV9scyBwYXNzZXMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zICovCisjZGVmaW5lIElTX0RJUiAoMXUgPDwgMCkKKworc3RydWN0IHJlbW90ZV9sc19jdHgKK3sKKwljaGFyICpwYXRoOworCXZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKTsKKwl2b2lkICp1c2VyRGF0YTsKKwlpbnQgZmxhZ3M7CisJY2hhciAqZGVudHJ5X25hbWU7CisJaW50IGRlbnRyeV9mbGFnczsKKwlzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqcGFyZW50OworfTsKKworc3RhdGljIHZvaWQgZmluaXNoX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpOworc3RhdGljIHZvaWQgcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0KKwkJKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICopY2FsbGJhY2tfZGF0YTsKKworCWZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QpOworfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3N0YXRpYyBzaXplX3QgZndyaXRlX3NoYTFfZmlsZSh2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGV4cG5bNDA5Nl07CisJc2l6ZV90IHNpemUgPSBlbHRzaXplICogbm1lbWI7CisJaW50IHBvc24gPSAwOworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0gKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICopZGF0YTsKKwlkbyB7CisJCXNzaXplX3QgcmV0dmFsID0geHdyaXRlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywKKwkJCQkgICAgICAgKGNoYXIgKikgcHRyICsgcG9zbiwgc2l6ZSAtIHBvc24pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiBwb3NuOworCQlwb3NuICs9IHJldHZhbDsKKwl9IHdoaWxlIChwb3NuIDwgc2l6ZSk7CisKKwlyZXF1ZXN0LT5zdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXJlcXVlc3QtPnN0cmVhbS5uZXh0X2luID0gcHRyOworCWRvIHsKKwkJcmVxdWVzdC0+c3RyZWFtLm5leHRfb3V0ID0gZXhwbjsKKwkJcmVxdWVzdC0+c3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihleHBuKTsKKwkJcmVxdWVzdC0+enJldCA9IGluZmxhdGUoJnJlcXVlc3QtPnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwkJU0hBMV9VcGRhdGUoJnJlcXVlc3QtPmMsIGV4cG4sCisJCQkgICAgc2l6ZW9mKGV4cG4pIC0gcmVxdWVzdC0+c3RyZWFtLmF2YWlsX291dCk7CisJfSB3aGlsZSAocmVxdWVzdC0+c3RyZWFtLmF2YWlsX2luICYmIHJlcXVlc3QtPnpyZXQgPT0gWl9PSyk7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9sb29zZShzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgcHJldmZpbGVbUEFUSF9NQVhdOworCWNoYXIgKnVybDsKKwljaGFyICpwb3NuOworCWludCBwcmV2bG9jYWw7CisJdW5zaWduZWQgY2hhciBwcmV2X2J1ZltQUkVWX0JVRl9TSVpFXTsKKwlzc2l6ZV90IHByZXZfcmVhZCA9IDA7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCisJZmlsZW5hbWUgPSBzaGExX2ZpbGVfbmFtZShyZXF1ZXN0LT5vYmotPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwlzbnByaW50ZihwcmV2ZmlsZSwgc2l6ZW9mKHByZXZmaWxlKSwgIiVzLnByZXYiLCByZXF1ZXN0LT5maWxlbmFtZSk7CisJdW5saW5rKHByZXZmaWxlKTsKKwlyZW5hbWUocmVxdWVzdC0+dG1wZmlsZSwgcHJldmZpbGUpOworCXVubGluayhyZXF1ZXN0LT50bXBmaWxlKTsKKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gIT0gLTEpCisJCWVycm9yKCJmZCBsZWFrYWdlIGluIHN0YXJ0OiAlZCIsIHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7CisJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gb3BlbihyZXF1ZXN0LT50bXBmaWxlLAorCQkJCSAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwkvKiBUaGlzIGNvdWxkIGhhdmUgZmFpbGVkIGR1ZSB0byB0aGUgImxhenkgZGlyZWN0b3J5IGNyZWF0aW9uIjsKKwkgKiB0cnkgdG8gbWtkaXIgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQuCisJICovCisJaWYgKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA8IDAgJiYgZXJybm8gPT0gRU5PRU5UKSB7CisJCWNoYXIgKmRpciA9IHN0cnJjaHIocmVxdWVzdC0+dG1wZmlsZSwgJy8nKTsKKwkJaWYgKGRpcikgeworCQkJKmRpciA9IDA7CisJCQlta2RpcihyZXF1ZXN0LT50bXBmaWxlLCAwNzc3KTsKKwkJCSpkaXIgPSAnLyc7CisJCX0KKwkJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gb3BlbihyZXF1ZXN0LT50bXBmaWxlLAorCQkJCQkgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJfQorCisJaWYgKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA8IDApIHsKKwkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQllcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIGZvciAlczogJXMiLAorCQkgICAgICByZXF1ZXN0LT50bXBmaWxlLCByZXF1ZXN0LT5maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmcmVxdWVzdC0+c3RyZWFtLCAwLCBzaXplb2YocmVxdWVzdC0+c3RyZWFtKSk7CisKKwlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKworCVNIQTFfSW5pdCgmcmVxdWVzdC0+Yyk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA1MCk7CisJcmVxdWVzdC0+dXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgNTApOworCXN0cmNweSh1cmwsIHJlbW90ZS0+dXJsKTsKKwlwb3NuID0gdXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKTsKKwlzdHJjcHkocG9zbiwgIm9iamVjdHMvIik7CisJcG9zbiArPSA4OworCW1lbWNweShwb3NuLCBoZXgsIDIpOworCXBvc24gKz0gMjsKKwkqKHBvc24rKykgPSAnLyc7CisJc3RyY3B5KHBvc24sIGhleCArIDIpOworCXN0cmNweShyZXF1ZXN0LT51cmwsIHVybCk7CisKKwkvKiBJZiBhIHByZXZpb3VzIHRlbXAgZmlsZSBpcyBwcmVzZW50LCBwcm9jZXNzIHdoYXQgd2FzIGFscmVhZHkKKwkgICBmZXRjaGVkLiAqLworCXByZXZsb2NhbCA9IG9wZW4ocHJldmZpbGUsIE9fUkRPTkxZKTsKKwlpZiAocHJldmxvY2FsICE9IC0xKSB7CisJCWRvIHsKKwkJCXByZXZfcmVhZCA9IHhyZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgcmVxdWVzdCkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZyZXF1ZXN0LT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwLCBTRUVLX1NFVCk7CisJCQlmdHJ1bmNhdGUocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwKTsKKwkJfQorCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCByZXF1ZXN0KTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX3NoYTFfZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCByZXF1ZXN0LT5lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisKKwkvKiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZmV0Y2gKKwkgICBhdHRlbXB0LCBvbmx5IGZldGNoIHRoZSBkYXRhIHdlIGRvbid0IGFscmVhZHkgaGF2ZS4gKi8KKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIG9iamVjdCAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsCisJCQkJIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IHRoZSByZXF1ZXN0IHN0YXJ0ZWQsIGFib3J0IHRoZSByZXF1ZXN0IG9uIGVycm9yICovCisJcmVxdWVzdC0+c3RhdGUgPSBSVU5fRkVUQ0hfTE9PU0U7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9ta2NvbChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWNoYXIgKnBvc247CisKKwlyZXF1ZXN0LT51cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAxMyk7CisJc3RyY3B5KHJlcXVlc3QtPnVybCwgcmVtb3RlLT51cmwpOworCXBvc24gPSByZXF1ZXN0LT51cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCXN0cmNweShwb3NuLCAiLyIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgcmVxdWVzdC0+ZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX01LQ09MOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9wYWNrZWQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKmNoZWNrX3JlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhyZXF1ZXN0LT5vYmotPnNoYTEsIHJlbW90ZS0+cGFja3MpOworCWlmICghdGFyZ2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZldGNoICVzLCB3aWxsIG5vdCBiZSBhYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mbyByZWZzXG4iLCBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoc3RkZXJyLAkiRmV0Y2hpbmcgcGFjayAlc1xuIiwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsIHNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLAorCQlyZW1vdGUtPnVybCwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXNuJ3QgYW5vdGhlciBvcGVuIHJlcXVlc3QgZm9yIHRoaXMgcGFjayAqLworCXdoaWxlIChjaGVja19yZXF1ZXN0KSB7CisJCWlmIChjaGVja19yZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfUEFDS0VEICYmCisJCSAgICAhc3RyY21wKGNoZWNrX3JlcXVlc3QtPnVybCwgdXJsKSkgeworCQkJZnJlZSh1cmwpOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3JlcXVlc3QgPSBjaGVja19yZXF1ZXN0LT5uZXh0OworCX0KKworCXBhY2tmaWxlID0gZm9wZW4ocmVxdWVzdC0+dG1wZmlsZSwgImEiKTsKKwlpZiAoIXBhY2tmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQlmaWxlbmFtZSk7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlmcmVlKHVybCk7CisJCXJldHVybjsKKwl9CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IHJlcXVlc3Q7CisJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gcGFja2ZpbGU7CisJcmVxdWVzdC0+dXNlckRhdGEgPSB0YXJnZXQ7CisKKwlyZXF1ZXN0LT51cmwgPSB1cmw7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIHBhY2tmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IHBhY2tmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCS8qIFRyeSB0byBnZXQgdGhlIHJlcXVlc3Qgc3RhcnRlZCwgYWJvcnQgdGhlIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlyZXF1ZXN0LT5zdGF0ZSA9IFJVTl9GRVRDSF9QQUNLRUQ7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wdXQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwljaGFyICpwb3NuOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyIGhkcls1MF07CisJdm9pZCAqdW5wYWNrZWQ7CisJdW5zaWduZWQgbG9uZyBsZW47CisJaW50IGhkcmxlbjsKKwlzc2l6ZV90IHNpemU7CisJel9zdHJlYW0gc3RyZWFtOworCisJdW5wYWNrZWQgPSByZWFkX3NoYTFfZmlsZShyZXF1ZXN0LT5vYmotPnNoYTEsICZ0eXBlLCAmbGVuKTsKKwloZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGVuYW1lKHR5cGUpLCBsZW4pICsgMTsKKworCS8qIFNldCBpdCB1cCAqLworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJZGVmbGF0ZUluaXQoJnN0cmVhbSwgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJc2l6ZSA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBsZW4gKyBoZHJsZW4pOworCXJlcXVlc3QtPmJ1ZmZlci5idWZmZXIgPSB4bWFsbG9jKHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9vdXQgPSByZXF1ZXN0LT5idWZmZXIuYnVmZmVyOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworCisJLyogRmlyc3QgaGVhZGVyLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9ICh2b2lkICopaGRyOworCXN0cmVhbS5hdmFpbF9pbiA9IGhkcmxlbjsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCAwKSA9PSBaX09LKQorCQkvKiBub3RoaW5nICovOworCisJLyogVGhlbiB0aGUgZGF0YSBpdHNlbGYuLiAqLworCXN0cmVhbS5uZXh0X2luID0gdW5wYWNrZWQ7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSA9PSBaX09LKQorCQkvKiBub3RoaW5nICovOworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisJZnJlZSh1bnBhY2tlZCk7CisKKwlyZXF1ZXN0LT5idWZmZXIuc2l6ZSA9IHN0cmVhbS50b3RhbF9vdXQ7CisJcmVxdWVzdC0+YnVmZmVyLnBvc24gPSAwOworCisJcmVxdWVzdC0+dXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgCisJCQkgICAgICAgc3RybGVuKHJlcXVlc3QtPmxvY2stPnRva2VuKSArIDUxKTsKKwlzdHJjcHkocmVxdWVzdC0+dXJsLCByZW1vdGUtPnVybCk7CisJcG9zbiA9IHJlcXVlc3QtPnVybCArIHN0cmxlbihyZW1vdGUtPnVybCk7CisJc3RyY3B5KHBvc24sICJvYmplY3RzLyIpOworCXBvc24gKz0gODsKKwltZW1jcHkocG9zbiwgaGV4LCAyKTsKKwlwb3NuICs9IDI7CisJKihwb3NuKyspID0gJy8nOworCXN0cmNweShwb3NuLCBoZXggKyAyKTsKKwlyZXF1ZXN0LT5kZXN0ID0geG1hbGxvYyhzdHJsZW4ocmVxdWVzdC0+dXJsKSArIDE0KTsKKwlzcHJpbnRmKHJlcXVlc3QtPmRlc3QsICJEZXN0aW5hdGlvbjogJXMiLCByZXF1ZXN0LT51cmwpOworCXBvc24gKz0gMzg7CisJKihwb3NuKyspID0gJ18nOworCXN0cmNweShwb3NuLCByZXF1ZXN0LT5sb2NrLT50b2tlbik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IHJlcXVlc3Q7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJnJlcXVlc3QtPmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIHJlcXVlc3QtPmJ1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9QVVQpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9QVVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDApOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHJlcXVlc3QtPnVybCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX1BVVDsKKwl9IGVsc2UgeworCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwkJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X21vdmUoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7IC8qIHVuZG8gUFVUIHNldHVwICovCisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9NT1ZFKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCByZXF1ZXN0LT5kZXN0KTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiT3ZlcndyaXRlOiBUIik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHJlcXVlc3QtPnVybCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX01PVkU7CisJfSBlbHNlIHsKKwkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQlmcmVlKHJlcXVlc3QtPnVybCk7CisJCXJlcXVlc3QtPnVybCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHJlZnJlc2hfbG9jayhzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKmlmX2hlYWRlcjsKKwljaGFyIHRpbWVvdXRfaGVhZGVyWzI1XTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlsb2NrLT5yZWZyZXNoaW5nID0gMTsKKworCWlmX2hlYWRlciA9IHhtYWxsb2Moc3RybGVuKGxvY2stPnRva2VuKSArIDI1KTsKKwlzcHJpbnRmKGlmX2hlYWRlciwgIklmOiAoPG9wYXF1ZWxvY2t0b2tlbjolcz4pIiwgbG9jay0+dG9rZW4pOworCXNwcmludGYodGltZW91dF9oZWFkZXIsICJUaW1lb3V0OiBTZWNvbmQtJWxkIiwgbG9jay0+dGltZW91dCk7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgaWZfaGVhZGVyKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCB0aW1lb3V0X2hlYWRlcik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIGxvY2stPnVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9MT0NLKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTE9DSyBIVFRQIGVycm9yICVsZFxuIiwKKwkJCQlyZXN1bHRzLmh0dHBfY29kZSk7CisJCX0gZWxzZSB7CisJCQlsb2NrLT5zdGFydF90aW1lID0gdGltZShOVUxMKTsKKwkJCXJjID0gMTsKKwkJfQorCX0KKworCWxvY2stPnJlZnJlc2hpbmcgPSAwOworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCWZyZWUoaWZfaGVhZGVyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbG9ja3Modm9pZCkKK3sKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2sgPSByZW1vdGUtPmxvY2tzOworCXRpbWVfdCBjdXJyZW50X3RpbWUgPSB0aW1lKE5VTEwpOworCWludCB0aW1lX3JlbWFpbmluZzsKKworCXdoaWxlIChsb2NrKSB7CisJCXRpbWVfcmVtYWluaW5nID0gbG9jay0+c3RhcnRfdGltZSArIGxvY2stPnRpbWVvdXQgLQorCQkJY3VycmVudF90aW1lOworCQlpZiAoIWxvY2stPnJlZnJlc2hpbmcgJiYgdGltZV9yZW1haW5pbmcgPCBMT0NLX1JFRlJFU0gpIHsKKwkJCWlmICghcmVmcmVzaF9sb2NrKGxvY2spKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJVbmFibGUgdG8gcmVmcmVzaCBsb2NrIGZvciAlc1xuIiwKKwkJCQkJbG9jay0+dXJsKTsKKwkJCQlhYm9ydGVkID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbG9jayA9IGxvY2stPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKmVudHJ5ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCisJaWYgKHJlcXVlc3QgPT0gcmVxdWVzdF9xdWV1ZV9oZWFkKSB7CisJCXJlcXVlc3RfcXVldWVfaGVhZCA9IHJlcXVlc3QtPm5leHQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGVudHJ5LT5uZXh0ICE9IE5VTEwgJiYgZW50cnktPm5leHQgIT0gcmVxdWVzdCkKKwkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeS0+bmV4dCA9PSByZXF1ZXN0KQorCQkJZW50cnktPm5leHQgPSBlbnRyeS0+bmV4dC0+bmV4dDsKKwl9CisKKwlpZiAocmVxdWVzdC0+bG9jYWxfZmlsZW5vICE9IC0xKQorCQljbG9zZShyZXF1ZXN0LT5sb2NhbF9maWxlbm8pOworCWlmIChyZXF1ZXN0LT5sb2NhbF9zdHJlYW0pCisJCWZjbG9zZShyZXF1ZXN0LT5sb2NhbF9zdHJlYW0pOworCWlmIChyZXF1ZXN0LT51cmwgIT0gTlVMTCkKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCWZyZWUocmVxdWVzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9yZXF1ZXN0KHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJc3RydWN0IHBhY2tlZF9naXQgKipsc3Q7CisKKwlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9IHJlcXVlc3QtPnNsb3QtPmN1cmxfcmVzdWx0OworCXJlcXVlc3QtPmh0dHBfY29kZSA9IHJlcXVlc3QtPnNsb3QtPmh0dHBfY29kZTsKKwlyZXF1ZXN0LT5zbG90ID0gTlVMTDsKKworCS8qIEtlZXAgbG9ja3MgYWN0aXZlICovCisJY2hlY2tfbG9ja3MoKTsKKworCWlmIChyZXF1ZXN0LT5oZWFkZXJzICE9IE5VTEwpCisJCWN1cmxfc2xpc3RfZnJlZV9hbGwocmVxdWVzdC0+aGVhZGVycyk7CisKKwkvKiBVUkwgaXMgcmV1c2VkIGZvciBNT1ZFIGFmdGVyIFBVVCAqLworCWlmIChyZXF1ZXN0LT5zdGF0ZSAhPSBSVU5fUFVUKSB7CisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwkJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwl9CisKKwlpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX01LQ09MKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSyB8fAorCQkgICAgcmVxdWVzdC0+aHR0cF9jb2RlID09IDQwNSkgeworCQkJcmVtb3RlX2Rpcl9leGlzdHNbcmVxdWVzdC0+b2JqLT5zaGExWzBdXSA9IDE7CisJCQlzdGFydF9wdXQocmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk1LQ09MICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fUFVUKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJc3RhcnRfbW92ZShyZXF1ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLAkiUFVUICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fTU9WRSkgeworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICBzZW50ICVzXG4iLAorCQkJCQlzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJCXJlcXVlc3QtPm9iai0+ZmxhZ3MgfD0gUkVNT1RFOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJNT1ZFICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfTE9PU0UpIHsKKwkJZmNobW9kKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywgMDQ0NCk7CisJCWNsb3NlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7IHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyAmJgorCQkgICAgcmVxdWVzdC0+aHR0cF9jb2RlICE9IDQxNikgeworCQkJaWYgKHN0YXQocmVxdWVzdC0+dG1wZmlsZSwgJnN0KSA9PSAwKSB7CisJCQkJaWYgKHN0LnN0X3NpemUgPT0gMCkKKwkJCQkJdW5saW5rKHJlcXVlc3QtPnRtcGZpbGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJlcXVlc3QtPmh0dHBfY29kZSA9PSA0MTYpCisJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiByZXF1ZXN0ZWQgcmFuZ2UgaW52YWxpZDsgd2UgbWF5IGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEuXG4iKTsKKworCQkJaW5mbGF0ZUVuZCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJCVNIQTFfRmluYWwocmVxdWVzdC0+cmVhbF9zaGExLCAmcmVxdWVzdC0+Yyk7CisJCQlpZiAocmVxdWVzdC0+enJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJCQl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisJCQl9IGVsc2UgaWYgKGhhc2hjbXAocmVxdWVzdC0+b2JqLT5zaGExLCByZXF1ZXN0LT5yZWFsX3NoYTEpKSB7CisJCQkJdW5saW5rKHJlcXVlc3QtPnRtcGZpbGUpOworCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0LT5yZW5hbWUgPQorCQkJCQltb3ZlX3RlbXBfdG9fZmlsZSgKKwkJCQkJCXJlcXVlc3QtPnRtcGZpbGUsCisJCQkJCQlyZXF1ZXN0LT5maWxlbmFtZSk7CisJCQkJaWYgKHJlcXVlc3QtPnJlbmFtZSA9PSAwKSB7CisJCQkJCXJlcXVlc3QtPm9iai0+ZmxhZ3MgfD0gKExPQ0FMIHwgUkVNT1RFKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBUcnkgZmV0Y2hpbmcgcGFja2VkIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAocmVxdWVzdC0+b2JqLT5mbGFncyAmIExPQ0FMKQorCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQllbHNlCisJCQlzdGFydF9mZXRjaF9wYWNrZWQocmVxdWVzdCk7CisKKwl9IGVsc2UgaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9GRVRDSF9QQUNLRUQpIHsKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBnZXQgcGFjayBmaWxlICVzXG4lcyIsCisJCQkJcmVxdWVzdC0+dXJsLCBjdXJsX2Vycm9yc3RyKTsKKwkJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQl9IGVsc2UgeworCQkJb2ZmX3QgcGFja19zaXplID0gZnRlbGwocmVxdWVzdC0+bG9jYWxfc3RyZWFtKTsKKworCQkJZmNsb3NlKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSk7CisJCQlyZXF1ZXN0LT5sb2NhbF9zdHJlYW0gPSBOVUxMOworCQkJaWYgKCFtb3ZlX3RlbXBfdG9fZmlsZShyZXF1ZXN0LT50bXBmaWxlLAorCQkJCQkgICAgICAgcmVxdWVzdC0+ZmlsZW5hbWUpKSB7CisJCQkJdGFyZ2V0ID0gKHN0cnVjdCBwYWNrZWRfZ2l0ICopcmVxdWVzdC0+dXNlckRhdGE7CisJCQkJdGFyZ2V0LT5wYWNrX3NpemUgPSBwYWNrX3NpemU7CisJCQkJbHN0ID0gJnJlbW90ZS0+cGFja3M7CisJCQkJd2hpbGUgKCpsc3QgIT0gdGFyZ2V0KQorCQkJCQlsc3QgPSAmKCgqbHN0KS0+bmV4dCk7CisJCQkJKmxzdCA9ICgqbHN0KS0+bmV4dDsKKworCQkJCWlmICghdmVyaWZ5X3BhY2sodGFyZ2V0LCAwKSkKKwkJCQkJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisJCQkJZWxzZQorCQkJCQlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwkJCX0KKwkJfQorCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3ZvaWQgZmlsbF9hY3RpdmVfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqbmV4dDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCWludCBudW1fdHJhbnNmZXJzOworCisJaWYgKGFib3J0ZWQpCisJCXJldHVybjsKKworCXdoaWxlIChhY3RpdmVfcmVxdWVzdHMgPCBtYXhfcmVxdWVzdHMgJiYgcmVxdWVzdCAhPSBOVUxMKSB7CisJCW5leHQgPSByZXF1ZXN0LT5uZXh0OworCQlpZiAocmVxdWVzdC0+c3RhdGUgPT0gTkVFRF9GRVRDSCkgeworCQkJc3RhcnRfZmV0Y2hfbG9vc2UocmVxdWVzdCk7CisJCX0gZWxzZSBpZiAocHVzaGluZyAmJiByZXF1ZXN0LT5zdGF0ZSA9PSBORUVEX1BVU0gpIHsKKwkJCWlmIChyZW1vdGVfZGlyX2V4aXN0c1tyZXF1ZXN0LT5vYmotPnNoYTFbMF1dID09IDEpIHsKKwkJCQlzdGFydF9wdXQocmVxdWVzdCk7CisJCQl9IGVsc2UgeworCQkJCXN0YXJ0X21rY29sKHJlcXVlc3QpOworCQkJfQorCQkJY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisJCX0KKwkJcmVxdWVzdCA9IG5leHQ7CisJfQorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkgeworCQlpZiAoIXNsb3QtPmluX3VzZSAmJiBzbG90LT5jdXJsICE9IE5VTEwpIHsKKwkJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQkJc2xvdC0+Y3VybCA9IE5VTEw7CisJCX0KKwkJc2xvdCA9IHNsb3QtPm5leHQ7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfb2JqZWN0X2xpc3QodW5zaWduZWQgY2hhciBwYXJlbnQpOworCitzdGF0aWMgdm9pZCBhZGRfZmV0Y2hfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwljaGVja19sb2NrcygpOworCisJLyoKKwkgKiBEb24ndCBmZXRjaCB0aGUgb2JqZWN0IGlmIGl0J3Mga25vd24gdG8gZXhpc3QgbG9jYWxseQorCSAqIG9yIGlzIGFscmVhZHkgaW4gdGhlIHJlcXVlc3QgcXVldWUKKwkgKi8KKwlpZiAocmVtb3RlX2Rpcl9leGlzdHNbb2JqLT5zaGExWzBdXSA9PSAtMSkKKwkJZ2V0X3JlbW90ZV9vYmplY3RfbGlzdChvYmotPnNoYTFbMF0pOworCWlmIChvYmotPmZsYWdzICYgKExPQ0FMIHwgRkVUQ0hJTkcpKQorCQlyZXR1cm47CisKKwlvYmotPmZsYWdzIHw9IEZFVENISU5HOworCXJlcXVlc3QgPSB4bWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPm9iaiA9IG9iajsKKwlyZXF1ZXN0LT51cmwgPSBOVUxMOworCXJlcXVlc3QtPmxvY2sgPSBOVUxMOworCXJlcXVlc3QtPmhlYWRlcnMgPSBOVUxMOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCXJlcXVlc3QtPmxvY2FsX3N0cmVhbSA9IE5VTEw7CisJcmVxdWVzdC0+c3RhdGUgPSBORUVEX0ZFVENIOworCXJlcXVlc3QtPm5leHQgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJcmVxdWVzdF9xdWV1ZV9oZWFkID0gcmVxdWVzdDsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwlzdGVwX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgYWRkX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqdGFyZ2V0OworCisJLyogS2VlcCBsb2NrcyBhY3RpdmUgKi8KKwljaGVja19sb2NrcygpOworCisJLyoKKwkgKiBEb24ndCBwdXNoIHRoZSBvYmplY3QgaWYgaXQncyBrbm93biB0byBleGlzdCBvbiB0aGUgcmVtb3RlCisJICogb3IgaXMgYWxyZWFkeSBpbiB0aGUgcmVxdWVzdCBxdWV1ZQorCSAqLworCWlmIChyZW1vdGVfZGlyX2V4aXN0c1tvYmotPnNoYTFbMF1dID09IC0xKQorCQlnZXRfcmVtb3RlX29iamVjdF9saXN0KG9iai0+c2hhMVswXSk7CisJaWYgKG9iai0+ZmxhZ3MgJiAoUkVNT1RFIHwgUFVTSElORykpCisJCXJldHVybiAwOworCXRhcmdldCA9IGZpbmRfc2hhMV9wYWNrKG9iai0+c2hhMSwgcmVtb3RlLT5wYWNrcyk7CisJaWYgKHRhcmdldCkgeworCQlvYmotPmZsYWdzIHw9IFJFTU9URTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2JqLT5mbGFncyB8PSBQVVNISU5HOworCXJlcXVlc3QgPSB4bWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPm9iaiA9IG9iajsKKwlyZXF1ZXN0LT51cmwgPSBOVUxMOworCXJlcXVlc3QtPmxvY2sgPSBsb2NrOworCXJlcXVlc3QtPmhlYWRlcnMgPSBOVUxMOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCXJlcXVlc3QtPmxvY2FsX3N0cmVhbSA9IE5VTEw7CisJcmVxdWVzdC0+c3RhdGUgPSBORUVEX1BVU0g7CisJcmVxdWVzdC0+bmV4dCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlyZXF1ZXN0X3F1ZXVlX2hlYWQgPSByZXF1ZXN0OworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlmaWxsX2FjdGl2ZV9zbG90cygpOworCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZldGNoX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqdXJsOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJRklMRSAqaW5kZXhmaWxlOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCS8qIERvbid0IHVzZSB0aGUgaW5kZXggaWYgdGhlIHBhY2sgaXNuJ3QgdGhlcmUgKi8KKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLCByZW1vdGUtPnVybCwgaGV4KTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMSk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZyZWUodXJsKTsKKwkJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHZlcmlmeSBwYWNrICVzIGlzIGF2YWlsYWJsZSIsCisJCQkJICAgICBoZXgpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworCWlmIChoYXNfcGFja19pbmRleChzaGExKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHVzaF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBpbmRleCBmb3IgcGFjayAlc1xuIiwgaGV4KTsKKworCXNwcmludGYodXJsLCAiJXNvYmplY3RzL3BhY2svcGFjay0lcy5pZHgiLCByZW1vdGUtPnVybCwgaGV4KTsKKworCWZpbGVuYW1lID0gc2hhMV9wYWNrX2luZGV4X25hbWUoc2hhMSk7CisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMudGVtcCIsIGZpbGVuYW1lKTsKKwlpbmRleGZpbGUgPSBmb3Blbih0bXBmaWxlLCAiYSIpOworCWlmICghaW5kZXhmaWxlKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBvcGVuIGxvY2FsIGZpbGUgJXMgZm9yIHBhY2sgaW5kZXgiLAorCQkJICAgICBmaWxlbmFtZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDApOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgaW5kZXhmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IGluZGV4ZmlsZTsKKworCS8qIElmIHRoZXJlIGlzIGRhdGEgcHJlc2VudCBmcm9tIGEgcHJldmlvdXMgdHJhbnNmZXIgYXR0ZW1wdCwKKwkgICByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgKi8KKwlwcmV2X3Bvc24gPSBmdGVsbChpbmRleGZpbGUpOworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAocHVzaF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2YgaW5kZXggZm9yIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJaGV4LCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZyZWUodXJsKTsKKwkJCWZjbG9zZShpbmRleGZpbGUpOworCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZ2V0IHBhY2sgaW5kZXggJXNcbiVzIiwgdXJsLAorCQkJCSAgICAgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlmcmVlKHVybCk7CisJCWZjbG9zZShpbmRleGZpbGUpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZnJlZSh1cmwpOworCWZjbG9zZShpbmRleGZpbGUpOworCisJcmV0dXJuIG1vdmVfdGVtcF90b19maWxlKHRtcGZpbGUsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIGludCBzZXR1cF9pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXdfcGFjazsKKworCWlmIChmZXRjaF9pbmRleChzaGExKSkKKwkJcmV0dXJuIC0xOworCisJbmV3X3BhY2sgPSBwYXJzZV9wYWNrX2luZGV4KHNoYTEpOworCW5ld19wYWNrLT5uZXh0ID0gcmVtb3RlLT5wYWNrczsKKwlyZW1vdGUtPnBhY2tzID0gbmV3X3BhY2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfaW5kaWNlcyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqdXJsOworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKmRhdGE7CisJaW50IGkgPSAwOworCisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJZGF0YSA9IHhjYWxsb2MoMSwgNDA5Nik7CisJYnVmZmVyLnNpemUgPSA0MDk2OworCWJ1ZmZlci5wb3NuID0gMDsKKwlidWZmZXIuYnVmZmVyID0gZGF0YTsKKworCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgbGlzdFxuIik7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAyMCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvaW5mby9wYWNrcyIsIHJlbW90ZS0+dXJsKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnJlZShidWZmZXIuYnVmZmVyKTsKKwkJCWZyZWUodXJsKTsKKwkJCWlmIChyZXN1bHRzLmh0dHBfY29kZSA9PSA0MDQpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIGVycm9yKCIlcyIsIGN1cmxfZXJyb3JzdHIpOworCQl9CisJfSBlbHNlIHsKKwkJZnJlZShidWZmZXIuYnVmZmVyKTsKKwkJZnJlZSh1cmwpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCWZyZWUodXJsKTsKKworCWRhdGEgPSBidWZmZXIuYnVmZmVyOworCXdoaWxlIChpIDwgYnVmZmVyLnBvc24pIHsKKwkJc3dpdGNoIChkYXRhW2ldKSB7CisJCWNhc2UgJ1AnOgorCQkJaSsrOworCQkJaWYgKGkgKyA1MiA8IGJ1ZmZlci5wb3NuICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSwgIiBwYWNrLSIpICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSArIDQ2LCAiLnBhY2tcbiIpKSB7CisJCQkJZ2V0X3NoYTFfaGV4KGRhdGEgKyBpICsgNiwgc2hhMSk7CisJCQkJc2V0dXBfaW5kZXgoc2hhMSk7CisJCQkJaSArPSA1MTsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXdoaWxlIChkYXRhW2ldICE9ICdcbicpCisJCQkJaSsrOworCQl9CisJCWkrKzsKKwl9CisKKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19xdW90ZShpbnQgY2gpCit7CisJaWYgKCgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkKKwkJCXx8ICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkKKwkJCXx8ICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJCXx8IChjaCA9PSAnLycpCisJCQl8fCAoY2ggPT0gJy0nKQorCQkJfHwgKGNoID09ICcuJykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXgoaW50IHYpCit7CisJaWYgKHYgPCAxMCkgcmV0dXJuICcwJyArIHY7CisJZWxzZSByZXR1cm4gJ0EnICsgdiAtIDEwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfcmVmX3VybChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZHAsICpxcmVmOworCWludCBsZW4sIGJhc2VsZW4sIGNoOworCisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlsZW4gPSBiYXNlbGVuICsgMTsKKwlmb3IgKGNwID0gcmVmOyAoY2ggPSAqY3ApICE9IDA7IGNwKyssIGxlbisrKQorCQlpZiAobmVlZHNfcXVvdGUoY2gpKQorCQkJbGVuICs9IDI7IC8qIGV4dHJhIHR3byBoZXggcGx1cyByZXBsYWNlbWVudCAlICovCisJcXJlZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkocXJlZiwgYmFzZSwgYmFzZWxlbik7CisJZm9yIChjcCA9IHJlZiwgZHAgPSBxcmVmICsgYmFzZWxlbjsgKGNoID0gKmNwKSAhPSAwOyBjcCsrKSB7CisJCWlmIChuZWVkc19xdW90ZShjaCkpIHsKKwkJCSpkcCsrID0gJyUnOworCQkJKmRwKysgPSBoZXgoKGNoID4+IDQpICYgMHhGKTsKKwkJCSpkcCsrID0gaGV4KGNoICYgMHhGKTsKKwkJfQorCQllbHNlCisJCQkqZHArKyA9IGNoOworCX0KKwkqZHAgPSAwOworCisJcmV0dXJuIHFyZWY7Cit9CisKK2ludCBmZXRjaF9yZWYoY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworICAgICAgICBjaGFyICp1cmw7CisgICAgICAgIGNoYXIgaGV4WzQyXTsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciAqYmFzZSA9IHJlbW90ZS0+dXJsOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKyAgICAgICAgYnVmZmVyLnNpemUgPSA0MTsKKyAgICAgICAgYnVmZmVyLnBvc24gPSAwOworICAgICAgICBidWZmZXIuYnVmZmVyID0gaGV4OworICAgICAgICBoZXhbNDFdID0gJ1wwJzsKKworCXVybCA9IHF1b3RlX3JlZl91cmwoYmFzZSwgcmVmKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGdldCAlcyBmb3IgJXNcbiVzIiwKKwkJCQkgICAgIHVybCwgcmVmLCBjdXJsX2Vycm9yc3RyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisgICAgICAgIGhleFs0MF0gPSAnXDAnOworICAgICAgICBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9uZV9yZW1vdGVfb2JqZWN0KGNvbnN0IGNoYXIgKmhleCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iajsKKworCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSAhPSAwKQorCQlyZXR1cm47CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKQorCQlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisKKwkvKiBJZ25vcmUgcmVtb3RlIG9iamVjdHMgdGhhdCBkb24ndCBleGlzdCBsb2NhbGx5ICovCisJaWYgKCFvYmopCisJCXJldHVybjsKKworCW9iai0+ZmxhZ3MgfD0gUkVNT1RFOworCWlmICghb2JqZWN0X2xpc3RfY29udGFpbnMob2JqZWN0cywgb2JqKSkKKwkJb2JqZWN0X2xpc3RfaW5zZXJ0KG9iaiwgJm9iamVjdHMpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbG9ja3Byb3BfY3R4KHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKQoreworCWludCAqbG9ja19mbGFncyA9IChpbnQgKiljdHgtPnVzZXJEYXRhOworCisJaWYgKHRhZ19jbG9zZWQpIHsKKwkJaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQ1RYX0xPQ0tFTlRSWSkpIHsKKwkJCWlmICgoKmxvY2tfZmxhZ3MgJiBEQVZfUFJPUF9MT0NLRVgpICYmCisJCQkgICAgKCpsb2NrX2ZsYWdzICYgREFWX1BST1BfTE9DS1dSKSkgeworCQkJCSpsb2NrX2ZsYWdzIHw9IERBVl9MT0NLX09LOworCQkJfQorCQkJKmxvY2tfZmxhZ3MgJj0gREFWX0xPQ0tfT0s7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9DVFhfTE9DS1RZUEVfV1JJVEUpKSB7CisJCQkqbG9ja19mbGFncyB8PSBEQVZfUFJPUF9MT0NLV1I7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9DVFhfTE9DS1RZUEVfRVhDTFVTSVZFKSkgeworCQkJKmxvY2tfZmxhZ3MgfD0gREFWX1BST1BfTE9DS0VYOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbmV3X2xvY2tfY3R4KHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKQoreworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jayA9IChzdHJ1Y3QgcmVtb3RlX2xvY2sgKiljdHgtPnVzZXJEYXRhOworCisJaWYgKHRhZ19jbG9zZWQgJiYgY3R4LT5jZGF0YSkgeworCQlpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9BQ1RJVkVMT0NLX09XTkVSKSkgeworCQkJbG9jay0+b3duZXIgPSB4bWFsbG9jKHN0cmxlbihjdHgtPmNkYXRhKSArIDEpOworCQkJc3RyY3B5KGxvY2stPm93bmVyLCBjdHgtPmNkYXRhKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0FDVElWRUxPQ0tfVElNRU9VVCkpIHsKKwkJCWlmICghcHJlZml4Y21wKGN0eC0+Y2RhdGEsICJTZWNvbmQtIikpCisJCQkJbG9jay0+dGltZW91dCA9CisJCQkJCXN0cnRvbChjdHgtPmNkYXRhICsgNywgTlVMTCwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQUNUSVZFTE9DS19UT0tFTikpIHsKKwkJCWlmICghcHJlZml4Y21wKGN0eC0+Y2RhdGEsICJvcGFxdWVsb2NrdG9rZW46IikpIHsKKwkJCQlsb2NrLT50b2tlbiA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpIC0gMTUpOworCQkJCXN0cmNweShsb2NrLT50b2tlbiwgY3R4LT5jZGF0YSArIDE2KTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb25lX3JlbW90ZV9yZWYoY2hhciAqcmVmbmFtZSk7CisKK3N0YXRpYyB2b2lkCit4bWxfc3RhcnRfdGFnKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cykKK3sKKwlzdHJ1Y3QgeG1sX2N0eCAqY3R4ID0gKHN0cnVjdCB4bWxfY3R4ICopdXNlckRhdGE7CisJY29uc3QgY2hhciAqYyA9IHN0cmNocihuYW1lLCAnOicpOworCWludCBuZXdfbGVuOworCisJaWYgKGMgPT0gTlVMTCkKKwkJYyA9IG5hbWU7CisJZWxzZQorCQljKys7CisKKwluZXdfbGVuID0gc3RybGVuKGN0eC0+bmFtZSkgKyBzdHJsZW4oYykgKyAyOworCisJaWYgKG5ld19sZW4gPiBjdHgtPmxlbikgeworCQljdHgtPm5hbWUgPSB4cmVhbGxvYyhjdHgtPm5hbWUsIG5ld19sZW4pOworCQljdHgtPmxlbiA9IG5ld19sZW47CisJfQorCXN0cmNhdChjdHgtPm5hbWUsICIuIik7CisJc3RyY2F0KGN0eC0+bmFtZSwgYyk7CisKKwlmcmVlKGN0eC0+Y2RhdGEpOworCWN0eC0+Y2RhdGEgPSBOVUxMOworCisJY3R4LT51c2VyRnVuYyhjdHgsIDApOworfQorCitzdGF0aWMgdm9pZAoreG1sX2VuZF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHhtbF9jdHggKmN0eCA9IChzdHJ1Y3QgeG1sX2N0eCAqKXVzZXJEYXRhOworCWNvbnN0IGNoYXIgKmMgPSBzdHJjaHIobmFtZSwgJzonKTsKKwljaGFyICplcDsKKworCWN0eC0+dXNlckZ1bmMoY3R4LCAxKTsKKworCWlmIChjID09IE5VTEwpCisJCWMgPSBuYW1lOworCWVsc2UKKwkJYysrOworCisJZXAgPSBjdHgtPm5hbWUgKyBzdHJsZW4oY3R4LT5uYW1lKSAtIHN0cmxlbihjKSAtIDE7CisJKmVwID0gMDsKK30KKworc3RhdGljIHZvaWQKK3htbF9jZGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisJc3RydWN0IHhtbF9jdHggKmN0eCA9IChzdHJ1Y3QgeG1sX2N0eCAqKXVzZXJEYXRhOworCWZyZWUoY3R4LT5jZGF0YSk7CisJY3R4LT5jZGF0YSA9IHhtYWxsb2MobGVuICsgMSk7CisJLyogTkI6ICdzJyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkLCBjYW4gbm90IHVzZSBzdHJsY3B5IGhlcmUgKi8KKwltZW1jcHkoY3R4LT5jZGF0YSwgcywgbGVuKTsKKwljdHgtPmNkYXRhW2xlbl0gPSAnXDAnOworfQorCitzdGF0aWMgc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrX3JlbW90ZShjb25zdCBjaGFyICpwYXRoLCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCXN0cnVjdCBidWZmZXIgb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyIGluX2J1ZmZlcjsKKwljaGFyICpvdXRfZGF0YTsKKwljaGFyICppbl9kYXRhOworCWNoYXIgKnVybDsKKwljaGFyICplcDsKKwljaGFyIHRpbWVvdXRfaGVhZGVyWzI1XTsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2sgPSBOVUxMOworCVhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKwllbnVtIFhNTF9TdGF0dXMgcmVzdWx0OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJc3RydWN0IHhtbF9jdHggY3R4OworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisJLyogTWFrZSBzdXJlIGxlYWRpbmcgZGlyZWN0b3JpZXMgZXhpc3QgZm9yIHRoZSByZW1vdGUgcmVmICovCisJZXAgPSBzdHJjaHIodXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKSArIDEsICcvJyk7CisJd2hpbGUgKGVwKSB7CisJCSplcCA9IDA7CisJCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwkJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCQlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LICYmCisJCQkgICAgcmVzdWx0cy5odHRwX2NvZGUgIT0gNDA1KSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJVbmFibGUgdG8gY3JlYXRlIGJyYW5jaCBwYXRoICVzXG4iLAorCQkJCQl1cmwpOworCQkJCWZyZWUodXJsKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IE1LQ09MIHJlcXVlc3RcbiIpOworCQkJZnJlZSh1cmwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKmVwID0gJy8nOworCQllcCA9IHN0cmNocihlcCArIDEsICcvJyk7CisJfQorCisJb3V0X2J1ZmZlci5zaXplID0gc3RybGVuKExPQ0tfUkVRVUVTVCkgKyBzdHJsZW4oZ2l0X2RlZmF1bHRfZW1haWwpIC0gMjsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsIExPQ0tfUkVRVUVTVCwgZ2l0X2RlZmF1bHRfZW1haWwpOworCW91dF9idWZmZXIucG9zbiA9IDA7CisJb3V0X2J1ZmZlci5idWZmZXIgPSBvdXRfZGF0YTsKKworCWluX2J1ZmZlci5zaXplID0gNDA5NjsKKwlpbl9kYXRhID0geG1hbGxvYyhpbl9idWZmZXIuc2l6ZSk7CisJaW5fYnVmZmVyLnBvc24gPSAwOworCWluX2J1ZmZlci5idWZmZXIgPSBpbl9kYXRhOworCisJc3ByaW50Zih0aW1lb3V0X2hlYWRlciwgIlRpbWVvdXQ6IFNlY29uZC0lbGQiLCB0aW1lb3V0KTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCB0aW1lb3V0X2hlYWRlcik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgIkNvbnRlbnQtVHlwZTogdGV4dC94bWwiKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJm91dF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBvdXRfYnVmZmVyLnNpemUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZpbl9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTE9DSyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWxvY2sgPSB4Y2FsbG9jKDEsIHNpemVvZigqbG9jaykpOworCWxvY2stPnRpbWVvdXQgPSAtMTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX25ld19sb2NrX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9IGxvY2s7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmZmVyLAorCQkJCQkgICBpbl9idWZmZXIucG9zbiwgMSk7CisJCQlmcmVlKGN0eC5uYW1lKTsKKwkJCWlmIChyZXN1bHQgIT0gWE1MX1NUQVRVU19PSykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiWE1MIGVycm9yOiAlc1xuIiwKKwkJCQkJWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQkJbG9jay0+dGltZW91dCA9IC0xOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgTE9DSyByZXF1ZXN0XG4iKTsKKwl9CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2RhdGEpOworCisJaWYgKGxvY2stPnRva2VuID09IE5VTEwgfHwgbG9jay0+dGltZW91dCA8PSAwKSB7CisJCWlmIChsb2NrLT50b2tlbiAhPSBOVUxMKQorCQkJZnJlZShsb2NrLT50b2tlbik7CisJCWlmIChsb2NrLT5vd25lciAhPSBOVUxMKQorCQkJZnJlZShsb2NrLT5vd25lcik7CisJCWZyZWUodXJsKTsKKwkJZnJlZShsb2NrKTsKKwkJbG9jayA9IE5VTEw7CisJfSBlbHNlIHsKKwkJbG9jay0+dXJsID0gdXJsOworCQlsb2NrLT5zdGFydF90aW1lID0gdGltZShOVUxMKTsKKwkJbG9jay0+bmV4dCA9IHJlbW90ZS0+bG9ja3M7CisJCXJlbW90ZS0+bG9ja3MgPSBsb2NrOworCX0KKworCXJldHVybiBsb2NrOworfQorCitzdGF0aWMgaW50IHVubG9ja19yZW1vdGUoc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKnByZXYgPSByZW1vdGUtPmxvY2tzOworCWNoYXIgKmxvY2tfdG9rZW5faGVhZGVyOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWxvY2tfdG9rZW5faGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMzEpOworCXNwcmludGYobG9ja190b2tlbl9oZWFkZXIsICJMb2NrLVRva2VuOiA8b3BhcXVlbG9ja3Rva2VuOiVzPiIsCisJCWxvY2stPnRva2VuKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBsb2NrX3Rva2VuX2hlYWRlcik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1VOTE9DSyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKQorCQkJcmMgPSAxOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIlVOTE9DSyBIVFRQIGVycm9yICVsZFxuIiwKKwkJCQlyZXN1bHRzLmh0dHBfY29kZSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgVU5MT0NLIHJlcXVlc3RcbiIpOworCX0KKworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCWZyZWUobG9ja190b2tlbl9oZWFkZXIpOworCisJaWYgKHJlbW90ZS0+bG9ja3MgPT0gbG9jaykgeworCQlyZW1vdGUtPmxvY2tzID0gbG9jay0+bmV4dDsKKwl9IGVsc2UgeworCQl3aGlsZSAocHJldiAmJiBwcmV2LT5uZXh0ICE9IGxvY2spCisJCQlwcmV2ID0gcHJldi0+bmV4dDsKKwkJaWYgKHByZXYpCisJCQlwcmV2LT5uZXh0ID0gcHJldi0+bmV4dC0+bmV4dDsKKwl9CisKKwlpZiAobG9jay0+b3duZXIgIT0gTlVMTCkKKwkJZnJlZShsb2NrLT5vd25lcik7CisJZnJlZShsb2NrLT51cmwpOworCWZyZWUobG9jay0+dG9rZW4pOworCWZyZWUobG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9scyhjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsCisJCSAgICAgIHZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKSwKKwkJICAgICAgdm9pZCAqdXNlckRhdGEpOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xzX29iamVjdChzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpCit7CisJdW5zaWduZWQgaW50ICpwYXJlbnQgPSAodW5zaWduZWQgaW50ICopbHMtPnVzZXJEYXRhOworCWNoYXIgKnBhdGggPSBscy0+ZGVudHJ5X25hbWU7CisJY2hhciAqb2JqX2hleDsKKworCWlmICghc3RyY21wKGxzLT5wYXRoLCBscy0+ZGVudHJ5X25hbWUpICYmIChscy0+ZmxhZ3MgJiBJU19ESVIpKSB7CisJCXJlbW90ZV9kaXJfZXhpc3RzWypwYXJlbnRdID0gMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJsZW4ocGF0aCkgIT0gNDkpCisJCXJldHVybjsKKwlwYXRoICs9IDg7CisJb2JqX2hleCA9IHhtYWxsb2Moc3RybGVuKHBhdGgpKTsKKwkvKiBOQjogcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkLCBjYW4gbm90IHVzZSBzdHJsY3B5IGhlcmUgKi8KKwltZW1jcHkob2JqX2hleCwgcGF0aCwgMik7CisJc3RyY3B5KG9ial9oZXggKyAyLCBwYXRoICsgMyk7CisJb25lX3JlbW90ZV9vYmplY3Qob2JqX2hleCk7CisJZnJlZShvYmpfaGV4KTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19sc19yZWYoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCWlmICghc3RyY21wKGxzLT5wYXRoLCBscy0+ZGVudHJ5X25hbWUpICYmIChscy0+ZGVudHJ5X2ZsYWdzICYgSVNfRElSKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAgJXNcbiIsIGxzLT5kZW50cnlfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShscy0+ZGVudHJ5X2ZsYWdzICYgSVNfRElSKSkKKwkJb25lX3JlbW90ZV9yZWYobHMtPmRlbnRyeV9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3JlbW90ZV9sc19jdHgoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpCit7CisJc3RydWN0IHJlbW90ZV9sc19jdHggKmxzID0gKHN0cnVjdCByZW1vdGVfbHNfY3R4ICopY3R4LT51c2VyRGF0YTsKKworCWlmICh0YWdfY2xvc2VkKSB7CisJCWlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX1JFU1ApICYmIGxzLT5kZW50cnlfbmFtZSkgeworCQkJaWYgKGxzLT5kZW50cnlfZmxhZ3MgJiBJU19ESVIpIHsKKwkJCQlpZiAobHMtPmZsYWdzICYgUFJPQ0VTU19ESVJTKSB7CisJCQkJCWxzLT51c2VyRnVuYyhscyk7CisJCQkJfQorCQkJCWlmIChzdHJjbXAobHMtPmRlbnRyeV9uYW1lLCBscy0+cGF0aCkgJiYKKwkJCQkgICAgbHMtPmZsYWdzICYgUkVDVVJTSVZFKSB7CisJCQkJCXJlbW90ZV9scyhscy0+ZGVudHJ5X25hbWUsCisJCQkJCQkgIGxzLT5mbGFncywKKwkJCQkJCSAgbHMtPnVzZXJGdW5jLAorCQkJCQkJICBscy0+dXNlckRhdGEpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobHMtPmZsYWdzICYgUFJPQ0VTU19GSUxFUykgeworCQkJCWxzLT51c2VyRnVuYyhscyk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9OQU1FKSAmJiBjdHgtPmNkYXRhKSB7CisJCQlscy0+ZGVudHJ5X25hbWUgPSB4bWFsbG9jKHN0cmxlbihjdHgtPmNkYXRhKSAtCisJCQkJCQkgIHJlbW90ZS0+cGF0aF9sZW4gKyAxKTsKKwkJCXN0cmNweShscy0+ZGVudHJ5X25hbWUsIGN0eC0+Y2RhdGEgKyByZW1vdGUtPnBhdGhfbGVuKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX0NPTExFQ1RJT04pKSB7CisJCQlscy0+ZGVudHJ5X2ZsYWdzIHw9IElTX0RJUjsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9SRVNQKSkgeworCQlmcmVlKGxzLT5kZW50cnlfbmFtZSk7CisJCWxzLT5kZW50cnlfbmFtZSA9IE5VTEw7CisJCWxzLT5kZW50cnlfZmxhZ3MgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3RlX2xzKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICAgdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpLAorCQkgICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKwljaGFyICp1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJc3RydWN0IHJlbW90ZV9sc19jdHggbHM7CisKKwlscy5mbGFncyA9IGZsYWdzOworCWxzLnBhdGggPSB4c3RyZHVwKHBhdGgpOworCWxzLmRlbnRyeV9uYW1lID0gTlVMTDsKKwlscy5kZW50cnlfZmxhZ3MgPSAwOworCWxzLnVzZXJEYXRhID0gdXNlckRhdGE7CisJbHMudXNlckZ1bmMgPSB1c2VyRnVuYzsKKworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCBwYXRoKTsKKworCW91dF9idWZmZXIuc2l6ZSA9IHN0cmxlbihQUk9QRklORF9BTExfUkVRVUVTVCk7CisJb3V0X2RhdGEgPSB4bWFsbG9jKG91dF9idWZmZXIuc2l6ZSArIDEpOworCXNucHJpbnRmKG91dF9kYXRhLCBvdXRfYnVmZmVyLnNpemUgKyAxLCBQUk9QRklORF9BTExfUkVRVUVTVCk7CisJb3V0X2J1ZmZlci5wb3NuID0gMDsKKwlvdXRfYnVmZmVyLmJ1ZmZlciA9IG91dF9kYXRhOworCisJaW5fYnVmZmVyLnNpemUgPSA0MDk2OworCWluX2RhdGEgPSB4bWFsbG9jKGluX2J1ZmZlci5zaXplKTsKKwlpbl9idWZmZXIucG9zbiA9IDA7CisJaW5fYnVmZmVyLmJ1ZmZlciA9IGluX2RhdGE7CisKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiRGVwdGg6IDEiKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiQ29udGVudC1UeXBlOiB0ZXh0L3htbCIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmb3V0X2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIG91dF9idWZmZXIuc2l6ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmluX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9QUk9QRklORCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX3JlbW90ZV9sc19jdHg7CisJCQljdHgudXNlckRhdGEgPSAmbHM7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmZmVyLAorCQkJCQkgICBpbl9idWZmZXIucG9zbiwgMSk7CisJCQlmcmVlKGN0eC5uYW1lKTsKKworCQkJaWYgKHJlc3VsdCAhPSBYTUxfU1RBVFVTX09LKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJYTUwgZXJyb3I6ICVzXG4iLAorCQkJCQlYTUxfRXJyb3JTdHJpbmcoCisJCQkJCQlYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3RcbiIpOworCX0KKworCWZyZWUobHMucGF0aCk7CisJZnJlZSh1cmwpOworCWZyZWUob3V0X2RhdGEpOworCWZyZWUoaW5fYnVmZmVyLmJ1ZmZlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfb2JqZWN0X2xpc3QodW5zaWduZWQgY2hhciBwYXJlbnQpCit7CisJY2hhciBwYXRoW10gPSAib2JqZWN0cy9YWC8iOworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXVuc2lnbmVkIGludCB2YWwgPSBwYXJlbnQ7CisKKwlwYXRoWzhdID0gaGV4W3ZhbCA+PiA0XTsKKwlwYXRoWzldID0gaGV4W3ZhbCAmIDB4Zl07CisJcmVtb3RlX2Rpcl9leGlzdHNbdmFsXSA9IDA7CisJcmVtb3RlX2xzKHBhdGgsIChQUk9DRVNTX0ZJTEVTIHwgUFJPQ0VTU19ESVJTKSwKKwkJICBwcm9jZXNzX2xzX29iamVjdCwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja2luZ19hdmFpbGFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJaW50IGxvY2tfZmxhZ3MgPSAwOworCisJb3V0X2J1ZmZlci5zaXplID0KKwkJc3RybGVuKFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCkgKworCQlzdHJsZW4ocmVtb3RlLT51cmwpIC0gMjsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsCisJCSBQUk9QRklORF9TVVBQT1JURURMT0NLX1JFUVVFU1QsIHJlbW90ZS0+dXJsKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMCIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVtb3RlLT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFJPUEZJTkQpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJY3R4Lm5hbWUgPSB4Y2FsbG9jKDEwLCAxKTsKKwkJCWN0eC5sZW4gPSAwOworCQkJY3R4LmNkYXRhID0gTlVMTDsKKwkJCWN0eC51c2VyRnVuYyA9IGhhbmRsZV9sb2NrcHJvcF9jdHg7CisJCQljdHgudXNlckRhdGEgPSAmbG9ja19mbGFnczsKKwkJCVhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZjdHgpOworCQkJWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgeG1sX3N0YXJ0X3RhZywKKwkJCQkJICAgICAgeG1sX2VuZF90YWcpOworCQkJcmVzdWx0ID0gWE1MX1BhcnNlKHBhcnNlciwgaW5fYnVmZmVyLmJ1ZmZlciwKKwkJCQkJICAgaW5fYnVmZmVyLnBvc24sIDEpOworCQkJZnJlZShjdHgubmFtZSk7CisKKwkJCWlmIChyZXN1bHQgIT0gWE1MX1NUQVRVU19PSykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiWE1MIGVycm9yOiAlc1xuIiwKKwkJCQkJWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQkJbG9ja19mbGFncyA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBQUk9QRklORCByZXF1ZXN0XG4iKTsKKwl9CisKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2J1ZmZlci5idWZmZXIpOworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCisJcmV0dXJuIGxvY2tfZmxhZ3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKiphZGRfb25lX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3RfbGlzdCAqKnApCit7CisJc3RydWN0IG9iamVjdF9saXN0ICplbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmplY3RfbGlzdCkpOworCWVudHJ5LT5pdGVtID0gb2JqOworCWVudHJ5LT5uZXh0ID0gKnA7CisJKnAgPSBlbnRyeTsKKwlyZXR1cm4gJmVudHJ5LT5uZXh0OworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICoqcHJvY2Vzc19ibG9iKHN0cnVjdCBibG9iICpibG9iLAorCQkJCQkgc3RydWN0IG9iamVjdF9saXN0ICoqcCwKKwkJCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZibG9iLT5vYmplY3Q7CisKKwlvYmotPmZsYWdzIHw9IExPQ0FMOworCisJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQlyZXR1cm4gcDsKKworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwlyZXR1cm4gYWRkX29uZV9vYmplY3Qob2JqLCBwKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCQkJIHN0cnVjdCBvYmplY3RfbGlzdCAqKnAsCisJCQkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgbmFtZV9wYXRoIG1lOworCisJb2JqLT5mbGFncyB8PSBMT0NBTDsKKworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuIHA7CisJaWYgKHBhcnNlX3RyZWUodHJlZSkgPCAwKQorCQlkaWUoImJhZCB0cmVlIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCisJb2JqLT5mbGFncyB8PSBTRUVOOworCW5hbWUgPSB4c3RyZHVwKG5hbWUpOworCXAgPSBhZGRfb25lX29iamVjdChvYmosIHApOworCW1lLnVwID0gcGF0aDsKKwltZS5lbGVtID0gbmFtZTsKKwltZS5lbGVtX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQlwID0gcHJvY2Vzc190cmVlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLCBwLCAmbWUsIG5hbWUpOworCQllbHNlCisJCQlwID0gcHJvY2Vzc19ibG9iKGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpLCBwLCAmbWUsIG5hbWUpOworCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBnZXRfZGVsdGEoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJaW50IGk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvYmplY3RfbGlzdCAqKnAgPSAmb2JqZWN0czsKKwlpbnQgY291bnQgPSAwOworCisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2cykpICE9IE5VTEwpIHsKKwkJcCA9IHByb2Nlc3NfdHJlZShjb21taXQtPnRyZWUsIHAsIE5VTEwsICIiKTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gTE9DQUw7CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQljb3VudCArPSBhZGRfc2VuZF9yZXF1ZXN0KCZjb21taXQtPm9iamVjdCwgbG9jayk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJldnMtPnBlbmRpbmcubnI7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICplbnRyeSA9IHJldnMtPnBlbmRpbmcub2JqZWN0cyArIGk7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IGVudHJ5LT5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gZW50cnktPm5hbWU7CisKKwkJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQkJY29udGludWU7CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RBRykgeworCQkJb2JqLT5mbGFncyB8PSBTRUVOOworCQkJcCA9IGFkZF9vbmVfb2JqZWN0KG9iaiwgcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCQlwID0gcHJvY2Vzc190cmVlKChzdHJ1Y3QgdHJlZSAqKW9iaiwgcCwgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2JqLT50eXBlID09IE9CSl9CTE9CKSB7CisJCQlwID0gcHJvY2Vzc19ibG9iKChzdHJ1Y3QgYmxvYiAqKW9iaiwgcCwgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoInVua25vd24gcGVuZGluZyBvYmplY3QgJXMgKCVzKSIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSksIG5hbWUpOworCX0KKworCXdoaWxlIChvYmplY3RzKSB7CisJCWlmICghKG9iamVjdHMtPml0ZW0tPmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQljb3VudCArPSBhZGRfc2VuZF9yZXF1ZXN0KG9iamVjdHMtPml0ZW0sIGxvY2spOworCQlvYmplY3RzID0gb2JqZWN0cy0+bmV4dDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3JlbW90ZSh1bnNpZ25lZCBjaGFyICpzaGExLCBzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKm91dF9kYXRhOworCWNoYXIgKmlmX2hlYWRlcjsKKwlzdHJ1Y3QgYnVmZmVyIG91dF9idWZmZXI7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlpbnQgaTsKKworCWlmX2hlYWRlciA9IHhtYWxsb2Moc3RybGVuKGxvY2stPnRva2VuKSArIDI1KTsKKwlzcHJpbnRmKGlmX2hlYWRlciwgIklmOiAoPG9wYXF1ZWxvY2t0b2tlbjolcz4pIiwgbG9jay0+dG9rZW4pOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIGlmX2hlYWRlcik7CisKKwlvdXRfYnVmZmVyLnNpemUgPSA0MTsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJaSA9IHNucHJpbnRmKG91dF9kYXRhLCBvdXRfYnVmZmVyLnNpemUgKyAxLCAiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAoaSAhPSBvdXRfYnVmZmVyLnNpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQVVQgcmVxdWVzdCBib2R5XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW91dF9idWZmZXIucG9zbiA9IDA7CisJb3V0X2J1ZmZlci5idWZmZXIgPSBvdXRfZGF0YTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJm91dF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBvdXRfYnVmZmVyLnNpemUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUFVULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCBsb2NrLT51cmwpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJZnJlZShvdXRfZGF0YSk7CisJCWZyZWUoaWZfaGVhZGVyKTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJQVVQgZXJyb3I6IGN1cmwgcmVzdWx0PSVkLCBIVFRQIGNvZGU9JWxkXG4iLAorCQkJCXJlc3VsdHMuY3VybF9yZXN1bHQsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwkJCS8qIFdlIHNob3VsZCBhdHRlbXB0IHJlY292ZXJ5PyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlmcmVlKG91dF9kYXRhKTsKKwkJZnJlZShpZl9oZWFkZXIpOworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBQVVQgcmVxdWVzdFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHJlZiAqbG9jYWxfcmVmcywgKipsb2NhbF90YWlsOworc3RhdGljIHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzLCAqKnJlbW90ZV90YWlsOworCitzdGF0aWMgaW50IG9uZV9sb2NhbF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IHJlZiAqcmVmOworCWludCBsZW4gPSBzdHJsZW4ocmVmbmFtZSkgKyAxOworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuKTsKKwloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEpOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKmxvY2FsX3RhaWwgPSByZWY7CisJbG9jYWxfdGFpbCA9ICZyZWYtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9uZV9yZW1vdGVfcmVmKGNoYXIgKnJlZm5hbWUpCit7CisJc3RydWN0IHJlZiAqcmVmOworCXVuc2lnbmVkIGNoYXIgcmVtb3RlX3NoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpbnQgbGVuID0gc3RybGVuKHJlZm5hbWUpICsgMTsKKworCWlmIChmZXRjaF9yZWYocmVmbmFtZSwgcmVtb3RlX3NoYTEpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVW5hYmxlIHRvIGZldGNoIHJlZiAlcyBmcm9tICVzXG4iLAorCQkJcmVmbmFtZSwgcmVtb3RlLT51cmwpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGZXRjaCBhIGNvcHkgb2YgdGhlIG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0IGxvY2FsbHkgLSBpdAorCSAqIG1heSBiZSByZXF1aXJlZCBmb3IgdXBkYXRpbmcgc2VydmVyIGluZm8gbGF0ZXIuCisJICovCisJaWYgKHJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgJiYgIWhhc19zaGExX2ZpbGUocmVtb3RlX3NoYTEpKSB7CisJCW9iaiA9IGxvb2t1cF91bmtub3duX29iamVjdChyZW1vdGVfc2hhMSk7CisJCWlmIChvYmopIHsKKwkJCWZwcmludGYoc3RkZXJyLAkiICBmZXRjaCAlcyBmb3IgJXNcbiIsCisJCQkJc2hhMV90b19oZXgocmVtb3RlX3NoYTEpLCByZWZuYW1lKTsKKwkJCWFkZF9mZXRjaF9yZXF1ZXN0KG9iaik7CisJCX0KKwl9CisKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJaGFzaGNweShyZWYtPm9sZF9zaGExLCByZW1vdGVfc2hhMSk7CisJbWVtY3B5KHJlZi0+bmFtZSwgcmVmbmFtZSwgbGVuKTsKKwkqcmVtb3RlX3RhaWwgPSByZWY7CisJcmVtb3RlX3RhaWwgPSAmcmVmLT5uZXh0OworfQorCitzdGF0aWMgdm9pZCBnZXRfbG9jYWxfaGVhZHModm9pZCkKK3sKKwlsb2NhbF90YWlsID0gJmxvY2FsX3JlZnM7CisJZm9yX2VhY2hfcmVmKG9uZV9sb2NhbF9yZWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnZXRfZGF2X3JlbW90ZV9oZWFkcyh2b2lkKQoreworCXJlbW90ZV90YWlsID0gJnJlbW90ZV9yZWZzOworCXJlbW90ZV9scygicmVmcy8iLCAoUFJPQ0VTU19GSUxFUyB8IFBST0NFU1NfRElSUyB8IFJFQ1VSU0lWRSksIHByb2Nlc3NfbHNfcmVmLCBOVUxMKTsKK30KKworc3RhdGljIGludCBpc196ZXJvX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCWlmICgqc2hhMSsrKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1bm1hcmtfYW5kX2ZyZWUoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LCB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRlbXAgPSBsaXN0OworCQl0ZW1wLT5pdGVtLT5vYmplY3QuZmxhZ3MgJj0gfm1hcms7CisJCWxpc3QgPSB0ZW1wLT5uZXh0OworCQlmcmVlKHRlbXApOworCX0KK30KKworc3RhdGljIGludCByZWZfbmV3ZXIoY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEpCit7CisJc3RydWN0IG9iamVjdCAqbzsKKwlzdHJ1Y3QgY29tbWl0ICpvbGQsICpuZXc7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LCAqdXNlZDsKKwlpbnQgZm91bmQgPSAwOworCisJLyogQm90aCBuZXcgYW5kIG9sZCBtdXN0IGJlIGNvbW1pdC1pc2ggYW5kIG5ldyBpcyBkZXNjZW5kYW50IG9mCisJICogb2xkLiAgT3RoZXJ3aXNlIHdlIHJlcXVpcmUgLS1mb3JjZS4KKwkgKi8KKwlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChvbGRfc2hhMSksIE5VTEwsIDApOworCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiAwOworCW9sZCA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChuZXdfc2hhMSksIE5VTEwsIDApOworCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiAwOworCW5ldyA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlpZiAocGFyc2VfY29tbWl0KG5ldykgPCAwKQorCQlyZXR1cm4gMDsKKworCXVzZWQgPSBsaXN0ID0gTlVMTDsKKwljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmbGlzdCk7CisJd2hpbGUgKGxpc3QpIHsKKwkJbmV3ID0gcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmbGlzdCwgVE1QX01BUkspOworCQljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmdXNlZCk7CisJCWlmIChuZXcgPT0gb2xkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bm1hcmtfYW5kX2ZyZWUobGlzdCwgVE1QX01BUkspOworCXVubWFya19hbmRfZnJlZSh1c2VkLCBUTVBfTUFSSyk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7IHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQljb250aW51ZTsKKwkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcocGFyZW50LT50cmVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKGNvbW1pdC0+dHJlZSk7CisJCQljb250aW51ZTsKKwkJfQorCQltYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcmVtb3RlX2luZm9fcmVmKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscykKK3sKKwlzdHJ1Y3QgYnVmZmVyICpidWYgPSAoc3RydWN0IGJ1ZmZlciAqKWxzLT51c2VyRGF0YTsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9zaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCWludCBsZW47CisJY2hhciAqcmVmX2luZm87CisKKwlpZiAoZmV0Y2hfcmVmKGxzLT5kZW50cnlfbmFtZSwgcmVtb3RlX3NoYTEpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVW5hYmxlIHRvIGZldGNoIHJlZiAlcyBmcm9tICVzXG4iLAorCQkJbHMtPmRlbnRyeV9uYW1lLCByZW1vdGUtPnVybCk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbyA9IHBhcnNlX29iamVjdChyZW1vdGVfc2hhMSk7CisJaWYgKCFvKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBwYXJzZSBvYmplY3QgJXMgZm9yIHJlbW90ZSByZWYgJXNcbiIsCisJCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgKyA0MjsKKwlyZWZfaW5mbyA9IHhjYWxsb2MobGVuICsgMSwgMSk7CisJc3ByaW50ZihyZWZfaW5mbywgIiVzCSVzXG4iLAorCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJZndyaXRlX2J1ZmZlcihyZWZfaW5mbywgMSwgbGVuLCBidWYpOworCWZyZWUocmVmX2luZm8pOworCisJaWYgKG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQlvID0gZGVyZWZfdGFnKG8sIGxzLT5kZW50cnlfbmFtZSwgMCk7CisJCWlmIChvKSB7CisJCQlsZW4gPSBzdHJsZW4obHMtPmRlbnRyeV9uYW1lKSArIDQ1OworCQkJcmVmX2luZm8gPSB4Y2FsbG9jKGxlbiArIDEsIDEpOworCQkJc3ByaW50ZihyZWZfaW5mbywgIiVzCSVzXnt9XG4iLAorCQkJCXNoYTFfdG9faGV4KG8tPnNoYTEpLCBscy0+ZGVudHJ5X25hbWUpOworCQkJZndyaXRlX2J1ZmZlcihyZWZfaW5mbywgMSwgbGVuLCBidWYpOworCQkJZnJlZShyZWZfaW5mbyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZW1vdGVfaW5mb19yZWZzKHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqaWZfaGVhZGVyOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisKKwlidWZmZXIuYnVmZmVyID0geGNhbGxvYygxLCA0MDk2KTsKKwlidWZmZXIuc2l6ZSA9IDQwOTY7CisJYnVmZmVyLnBvc24gPSAwOworCXJlbW90ZV9scygicmVmcy8iLCAoUFJPQ0VTU19GSUxFUyB8IFJFQ1VSU0lWRSksCisJCSAgYWRkX3JlbW90ZV9pbmZvX3JlZiwgJmJ1ZmZlcik7CisJaWYgKCFhYm9ydGVkKSB7CisJCWlmX2hlYWRlciA9IHhtYWxsb2Moc3RybGVuKGxvY2stPnRva2VuKSArIDI1KTsKKwkJc3ByaW50ZihpZl9oZWFkZXIsICJJZjogKDxvcGFxdWVsb2NrdG9rZW46JXM+KSIsIGxvY2stPnRva2VuKTsKKwkJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgaWZfaGVhZGVyKTsKKworCQlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJmJ1ZmZlcik7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBidWZmZXIucG9zbik7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFVUKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9QVVQsIDEpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCBsb2NrLT51cmwpOworCisJCWJ1ZmZlci5wb3NuID0gMDsKKworCQlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJQVVQgZXJyb3I6IGN1cmwgcmVzdWx0PSVkLCBIVFRQIGNvZGU9JWxkXG4iLAorCQkJCQlyZXN1bHRzLmN1cmxfcmVzdWx0LCByZXN1bHRzLmh0dHBfY29kZSk7CisJCQl9CisJCX0KKwkJZnJlZShpZl9oZWFkZXIpOworCX0KKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworfQorCitzdGF0aWMgaW50IHJlbW90ZV9leGlzdHMoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICp1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlzcHJpbnRmKHVybCwgIiVzJXMiLCByZW1vdGUtPnVybCwgcGF0aCk7CisKKyAgICAgICAgc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMSk7CisKKyAgICAgICAgaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuaHR0cF9jb2RlID09IDQwNCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiSEVBRCBIVFRQIGVycm9yICVsZFxuIiwgcmVzdWx0cy5odHRwX2NvZGUpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IEhFQUQgcmVxdWVzdFxuIik7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBmZXRjaF9zeW1yZWYoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKnN5bXJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICp1cmw7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisJYnVmZmVyLnNpemUgPSA0MDk2OworCWJ1ZmZlci5wb3NuID0gMDsKKwlidWZmZXIuYnVmZmVyID0geG1hbGxvYyhidWZmZXIuc2l6ZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWRpZSgiQ291bGRuJ3QgZ2V0ICVzIGZvciByZW1vdGUgc3ltcmVmXG4lcyIsCisJCQkgICAgdXJsLCBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWRpZSgiVW5hYmxlIHRvIHN0YXJ0IHJlbW90ZSBzeW1yZWYgcmVxdWVzdCIpOworCX0KKwlmcmVlKHVybCk7CisKKwlpZiAoKnN5bXJlZiAhPSBOVUxMKQorCQlmcmVlKCpzeW1yZWYpOworCSpzeW1yZWYgPSBOVUxMOworCWhhc2hjbHIoc2hhMSk7CisKKwlpZiAoYnVmZmVyLnBvc24gPT0gMCkKKwkJcmV0dXJuOworCisJLyogSWYgaXQncyBhIHN5bXJlZiwgc2V0IHRoZSByZWZuYW1lOyBvdGhlcndpc2UgdHJ5IGZvciBhIHNoYTEgKi8KKwlpZiAoIXByZWZpeGNtcCgoY2hhciAqKWJ1ZmZlci5idWZmZXIsICJyZWY6ICIpKSB7CisJCSpzeW1yZWYgPSB4bWFsbG9jKGJ1ZmZlci5wb3NuIC0gNSk7CisJCW1lbWNweSgqc3ltcmVmLCAoY2hhciAqKWJ1ZmZlci5idWZmZXIgKyA1LCBidWZmZXIucG9zbiAtIDYpOworCQkoKnN5bXJlZilbYnVmZmVyLnBvc24gLSA2XSA9ICdcMCc7CisJfSBlbHNlIHsKKwkJZ2V0X3NoYTFfaGV4KGJ1ZmZlci5idWZmZXIsIHNoYTEpOworCX0KKworCWZyZWUoYnVmZmVyLmJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X21lcmdlX2Jhc2UodW5zaWduZWQgY2hhciAqaGVhZF9zaGExLCB1bnNpZ25lZCBjaGFyICpicmFuY2hfc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpoZWFkID0gbG9va3VwX2NvbW1pdChoZWFkX3NoYTEpOworCXN0cnVjdCBjb21taXQgKmJyYW5jaCA9IGxvb2t1cF9jb21taXQoYnJhbmNoX3NoYTEpOworCXN0cnVjdCBjb21taXRfbGlzdCAqbWVyZ2VfYmFzZXMgPSBnZXRfbWVyZ2VfYmFzZXMoaGVhZCwgYnJhbmNoLCAxKTsKKworCXJldHVybiAobWVyZ2VfYmFzZXMgJiYgIW1lcmdlX2Jhc2VzLT5uZXh0ICYmIG1lcmdlX2Jhc2VzLT5pdGVtID09IGJyYW5jaCk7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX3JlbW90ZV9icmFuY2goY2hhciAqcGF0dGVybiwgaW50IGZvcmNlKQoreworCXN0cnVjdCByZWYgKnJlZnMgPSByZW1vdGVfcmVmczsKKwlzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisJY2hhciAqc3ltcmVmID0gTlVMTDsKKwlpbnQgbWF0Y2g7CisJaW50IHBhdGxlbiA9IHN0cmxlbihwYXR0ZXJuKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqdXJsOworCisJLyogRmluZCB0aGUgcmVtb3RlIGJyYW5jaChlcykgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBicmFuY2ggbmFtZSAqLworCWZvciAobWF0Y2ggPSAwOyByZWZzOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQljaGFyICpuYW1lID0gcmVmcy0+bmFtZTsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChuYW1lbGVuIDwgcGF0bGVuIHx8CisJCSAgICBtZW1jbXAobmFtZSArIG5hbWVsZW4gLSBwYXRsZW4sIHBhdHRlcm4sIHBhdGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKG5hbWVsZW4gIT0gcGF0bGVuICYmIG5hbWVbbmFtZWxlbiAtIHBhdGxlbiAtIDFdICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQltYXRjaCsrOworCQlyZW1vdGVfcmVmID0gcmVmczsKKwl9CisJaWYgKG1hdGNoID09IDApCisJCXJldHVybiBlcnJvcigiTm8gcmVtb3RlIGJyYW5jaCBtYXRjaGVzICVzIiwgcGF0dGVybik7CisJaWYgKG1hdGNoICE9IDEpCisJCXJldHVybiBlcnJvcigiTW9yZSB0aGFuIG9uZSByZW1vdGUgYnJhbmNoIG1hdGNoZXMgJXMiLAorCQkJICAgICBwYXR0ZXJuKTsKKworCS8qCisJICogUmVtb3RlIEhFQUQgbXVzdCBiZSBhIHN5bXJlZiAobm90IGV4YWN0bHkgZm9vbHByb29mOyBhIHJlbW90ZQorCSAqIHN5bWxpbmsgdG8gYSBzeW1yZWYgd2lsbCBsb29rIGxpa2UgYSBzeW1yZWYpCisJICovCisJZmV0Y2hfc3ltcmVmKCJIRUFEIiwgJnN5bXJlZiwgaGVhZF9zaGExKTsKKwlpZiAoIXN5bXJlZikKKwkJcmV0dXJuIGVycm9yKCJSZW1vdGUgSEVBRCBpcyBub3QgYSBzeW1yZWYiKTsKKworCS8qIFJlbW90ZSBicmFuY2ggbXVzdCBub3QgYmUgdGhlIHJlbW90ZSBIRUFEICovCisJZm9yIChpPTA7IHN5bXJlZiAmJiBpPE1BWERFUFRIOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAocmVtb3RlX3JlZi0+bmFtZSwgc3ltcmVmKSkKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIGJyYW5jaCAlcyBpcyB0aGUgY3VycmVudCBIRUFEIiwKKwkJCQkgICAgIHJlbW90ZV9yZWYtPm5hbWUpOworCQlmZXRjaF9zeW1yZWYoc3ltcmVmLCAmc3ltcmVmLCBoZWFkX3NoYTEpOworCX0KKworCS8qIFJ1biBleHRyYSBzYW5pdHkgY2hlY2tzIGlmIGRlbGV0ZSBpcyBub3QgZm9yY2VkICovCisJaWYgKCFmb3JjZSkgeworCQkvKiBSZW1vdGUgSEVBRCBtdXN0IHJlc29sdmUgdG8gYSBrbm93biBvYmplY3QgKi8KKwkJaWYgKHN5bXJlZikKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgc3ltcmVmcyB0b28gZGVlcCIpOworCQlpZiAoaXNfemVyb19zaGExKGhlYWRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHJlbW90ZSBIRUFEIik7CisJCWlmICghaGFzX3NoYTFfZmlsZShoZWFkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJSZW1vdGUgSEVBRCByZXNvbHZlcyB0byBvYmplY3QgJXNcbndoaWNoIGRvZXMgbm90IGV4aXN0IGxvY2FsbHksIHBlcmhhcHMgeW91IG5lZWQgdG8gZmV0Y2g/Iiwgc2hhMV90b19oZXgoaGVhZF9zaGExKSk7CisKKwkJLyogUmVtb3RlIGJyYW5jaCBtdXN0IHJlc29sdmUgdG8gYSBrbm93biBvYmplY3QgKi8KKwkJaWYgKGlzX3plcm9fc2hhMShyZW1vdGVfcmVmLT5vbGRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHJlbW90ZSBicmFuY2ggJXMiLAorCQkJCSAgICAgcmVtb3RlX3JlZi0+bmFtZSk7CisJCWlmICghaGFzX3NoYTFfZmlsZShyZW1vdGVfcmVmLT5vbGRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBicmFuY2ggJXMgcmVzb2x2ZXMgdG8gb2JqZWN0ICVzXG53aGljaCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5LCBwZXJoYXBzIHlvdSBuZWVkIHRvIGZldGNoPyIsIHJlbW90ZV9yZWYtPm5hbWUsIHNoYTFfdG9faGV4KHJlbW90ZV9yZWYtPm9sZF9zaGExKSk7CisKKwkJLyogUmVtb3RlIGJyYW5jaCBtdXN0IGJlIGFuIGFuY2VzdG9yIG9mIHJlbW90ZSBIRUFEICovCisJCWlmICghdmVyaWZ5X21lcmdlX2Jhc2UoaGVhZF9zaGExLCByZW1vdGVfcmVmLT5vbGRfc2hhMSkpIHsKKwkJCXJldHVybiBlcnJvcigiVGhlIGJyYW5jaCAnJXMnIGlzIG5vdCBhIHN0cmljdCBzdWJzZXQgb2YgeW91ciBjdXJyZW50IEhFQUQuXG5JZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGl0LCBydW46XG5cdCdnaXQgaHR0cC1wdXNoIC1EICVzICVzJyIsIHJlbW90ZV9yZWYtPm5hbWUsIHJlbW90ZS0+dXJsLCBwYXR0ZXJuKTsKKwkJfQorCX0KKworCS8qIFNlbmQgZGVsZXRlIHJlcXVlc3QgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIlJlbW92aW5nIHJlbW90ZSBicmFuY2ggJyVzJ1xuIiwgcmVtb3RlX3JlZi0+bmFtZSk7CisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHJlbW90ZV9yZWYtPm5hbWUpICsgMSk7CisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHJlbW90ZV9yZWYtPm5hbWUpOworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX0RFTEVURSk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJZnJlZSh1cmwpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykKKwkJCXJldHVybiBlcnJvcigiREVMRVRFIHJlcXVlc3QgZmFpbGVkICglZC8lbGQpXG4iLAorCQkJCSAgICAgcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCX0gZWxzZSB7CisJCWZyZWUodXJsKTsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgREVMRVRFIHJlcXVlc3QiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpuZXh0X3JlcXVlc3Q7CisJaW50IG5yX3JlZnNwZWMgPSAwOworCWNoYXIgKipyZWZzcGVjID0gTlVMTDsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKnJlZl9sb2NrID0gTlVMTDsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmluZm9fcmVmX2xvY2sgPSBOVUxMOworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCWludCBkZWxldGVfYnJhbmNoID0gMDsKKwlpbnQgZm9yY2VfZGVsZXRlID0gMDsKKwlpbnQgb2JqZWN0c190b19zZW5kOworCWludCByYyA9IDA7CisJaW50IGk7CisJaW50IG5ld19yZWZzOworCXN0cnVjdCByZWYgKnJlZjsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXJlbW90ZSA9IHhjYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCAxKTsKKworCWFyZ3YrKzsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJcHVzaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mb3JjZSIpKSB7CisJCQkJZm9yY2VfYWxsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJcHVzaF92ZXJib3NlbHkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLUQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWZvcmNlX2RlbGV0ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFyZW1vdGUtPnVybCkgeworCQkJY2hhciAqcGF0aCA9IHN0cnN0cihhcmcsICIvLyIpOworCQkJcmVtb3RlLT51cmwgPSBhcmc7CisJCQlpZiAocGF0aCkgeworCQkJCXBhdGggPSBzdHJjaHIocGF0aCsyLCAnLycpOworCQkJCWlmIChwYXRoKQorCQkJCQlyZW1vdGUtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJcmVmc3BlYyA9IGFyZ3Y7CisJCW5yX3JlZnNwZWMgPSBhcmdjIC0gaTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZW1vdGUtPnVybCkKKwkJdXNhZ2UoaHR0cF9wdXNoX3VzYWdlKTsKKworCWlmIChkZWxldGVfYnJhbmNoICYmIG5yX3JlZnNwZWMgIT0gMSkKKwkJZGllKCJZb3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIGJyYW5jaCBuYW1lIHdoZW4gZGVsZXRpbmcgYSByZW1vdGUgYnJhbmNoIik7CisKKwltZW1zZXQocmVtb3RlX2Rpcl9leGlzdHMsIC0xLCAyNTYpOworCisJaHR0cF9pbml0KCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJSYW5nZToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJEZXN0aW5hdGlvbjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJJZjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsCisJCQkJCSAgICAiUHJhZ21hOiBuby1jYWNoZSIpOworCisJLyogVmVyaWZ5IERBViBjb21wbGlhbmNlL2xvY2sgc3VwcG9ydCAqLworCWlmICghbG9ja2luZ19hdmFpbGFibGUoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBEQVYgbG9ja2luZyBzdXBwb3J0IG9uIHJlbW90ZSByZXBvICVzXG4iLCByZW1vdGUtPnVybCk7CisJCXJjID0gMTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJlbW90ZSBoYXMgc2VydmVyIGluZm8gZmlsZXMgKi8KKwlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwlyZW1vdGUtPmhhc19pbmZvX3JlZnMgPSByZW1vdGVfZXhpc3RzKCJpbmZvL3JlZnMiKTsKKwlyZW1vdGUtPmhhc19pbmZvX3BhY2tzID0gcmVtb3RlX2V4aXN0cygib2JqZWN0cy9pbmZvL3BhY2tzIik7CisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcykgeworCQlpbmZvX3JlZl9sb2NrID0gbG9ja19yZW1vdGUoImluZm8vcmVmcyIsIExPQ0tfVElNRSk7CisJCWlmIChpbmZvX3JlZl9sb2NrKQorCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDE7CisJfQorCWlmIChyZW1vdGUtPmhhc19pbmZvX3BhY2tzKQorCQlmZXRjaF9pbmRpY2VzKCk7CisKKwkvKiBHZXQgYSBsaXN0IG9mIGFsbCBsb2NhbCBhbmQgcmVtb3RlIGhlYWRzIHRvIHZhbGlkYXRlIHJlZnNwZWNzICovCisJZ2V0X2xvY2FsX2hlYWRzKCk7CisJZnByaW50ZihzdGRlcnIsICJGZXRjaGluZyByZW1vdGUgaGVhZHMuLi5cbiIpOworCWdldF9kYXZfcmVtb3RlX2hlYWRzKCk7CisKKwkvKiBSZW1vdmUgYSByZW1vdGUgYnJhbmNoIGlmIC1kIG9yIC1EIHdhcyBzcGVjaWZpZWQgKi8KKwlpZiAoZGVsZXRlX2JyYW5jaCkgeworCQlpZiAoZGVsZXRlX3JlbW90ZV9icmFuY2gocmVmc3BlY1swXSwgZm9yY2VfZGVsZXRlKSA9PSAtMSkKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRlbGV0ZSByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZnNwZWNbMF0pOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbWF0Y2ggdGhlbSB1cCAqLworCWlmICghcmVtb3RlX3RhaWwpCisJCXJlbW90ZV90YWlsID0gJnJlbW90ZV9yZWZzOworCWlmIChtYXRjaF9yZWZzKGxvY2FsX3JlZnMsIHJlbW90ZV9yZWZzLCAmcmVtb3RlX3RhaWwsCisJCSAgICAgICBucl9yZWZzcGVjLCByZWZzcGVjLCBwdXNoX2FsbCkpCisJCXJldHVybiAtMTsKKwlpZiAoIXJlbW90ZV9yZWZzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcmVmcyBpbiBjb21tb24gYW5kIG5vbmUgc3BlY2lmaWVkOyBkb2luZyBub3RoaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCW5ld19yZWZzID0gMDsKKwlmb3IgKHJlZiA9IHJlbW90ZV9yZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQljaGFyIG9sZF9oZXhbNjBdLCAqbmV3X2hleDsKKwkJY29uc3QgY2hhciAqY29tbWl0X2FyZ3ZbNF07CisJCWludCBjb21taXRfYXJnYzsKKwkJY2hhciAqbmV3X3NoYTFfaGV4LCAqb2xkX3NoYTFfaGV4OworCisJCWlmICghcmVmLT5wZWVyX3JlZikKKwkJCWNvbnRpbnVlOworCQlpZiAoIWhhc2hjbXAocmVmLT5vbGRfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEpKSB7CisJCQlpZiAocHVzaF92ZXJib3NlbHkgfHwgMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZm9yY2VfYWxsICYmCisJCSAgICAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICAhcmVmLT5mb3JjZSkgeworCQkJaWYgKCFoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpIHx8CisJCQkgICAgIXJlZl9uZXdlcihyZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwKKwkJCQkgICAgICAgcmVmLT5vbGRfc2hhMSkpIHsKKwkJCQkvKiBXZSBkbyBub3QgaGF2ZSB0aGUgcmVtb3RlIHJlZiwgb3IKKwkJCQkgKiB3ZSBrbm93IHRoYXQgdGhlIHJlbW90ZSByZWYgaXMgbm90CisJCQkJICogYW4gYW5jZXN0b3Igb2Ygd2hhdCB3ZSBhcmUgdHJ5aW5nIHRvCisJCQkJICogcHVzaC4gIEVpdGhlciB3YXkgdGhpcyBjYW4gYmUgbG9zaW5nCisJCQkJICogY29tbWl0cyBhdCB0aGUgcmVtb3RlIGVuZCBhbmQgbGlrZWx5CisJCQkJICogd2Ugd2VyZSBub3QgdXAgdG8gZGF0ZSB0byBiZWdpbiB3aXRoLgorCQkJCSAqLworCQkJCWVycm9yKCJyZW1vdGUgJyVzJyBpcyBub3QgYSBzdHJpY3QgIgorCQkJCSAgICAgICJzdWJzZXQgb2YgbG9jYWwgcmVmICclcycuICIKKwkJCQkgICAgICAibWF5YmUgeW91IGFyZSBub3QgdXAtdG8tZGF0ZSBhbmQgIgorCQkJCSAgICAgICJuZWVkIHRvIHB1bGwgZmlyc3Q/IiwKKwkJCQkgICAgICByZWYtPm5hbWUsCisJCQkJICAgICAgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCQkJcmMgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIHJlZi0+cGVlcl9yZWYtPm5ld19zaGExKTsKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPm5ld19zaGExKSkgeworCQkJZXJyb3IoImNhbm5vdCBoYXBwZW4gYW55bW9yZSIpOworCQkJcmMgPSAtMzsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5ld19yZWZzKys7CisJCXN0cmNweShvbGRfaGV4LCBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCW5ld19oZXggPSBzaGExX3RvX2hleChyZWYtPm5ld19zaGExKTsKKworCQlmcHJpbnRmKHN0ZGVyciwgInVwZGF0aW5nICclcyciLCByZWYtPm5hbWUpOworCQlpZiAoc3RyY21wKHJlZi0+bmFtZSwgcmVmLT5wZWVyX3JlZi0+bmFtZSkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiB1c2luZyAnJXMnIiwgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCWZwcmludGYoc3RkZXJyLCAiXG4gIGZyb20gJXNcbiAgdG8gICAlc1xuIiwgb2xkX2hleCwgbmV3X2hleCk7CisKKworCQkvKiBMb2NrIHJlbW90ZSBicmFuY2ggcmVmICovCisJCXJlZl9sb2NrID0gbG9ja19yZW1vdGUocmVmLT5uYW1lLCBMT0NLX1RJTUUpOworCQlpZiAocmVmX2xvY2sgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9jayByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZi0+bmFtZSk7CisJCQlyYyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNldCB1cCByZXZpc2lvbiBpbmZvIGZvciB0aGlzIHJlZnNwZWMgKi8KKwkJY29tbWl0X2FyZ2MgPSAzOworCQluZXdfc2hhMV9oZXggPSB4c3RyZHVwKHNoYTFfdG9faGV4KHJlZi0+bmV3X3NoYTEpKTsKKwkJb2xkX3NoYTFfaGV4ID0gTlVMTDsKKwkJY29tbWl0X2FyZ3ZbMV0gPSAiLS1vYmplY3RzIjsKKwkJY29tbWl0X2FyZ3ZbMl0gPSBuZXdfc2hhMV9oZXg7CisJCWlmICghcHVzaF9hbGwgJiYgIWlzX3plcm9fc2hhMShyZWYtPm9sZF9zaGExKSkgeworCQkJb2xkX3NoYTFfaGV4ID0geG1hbGxvYyg0Mik7CisJCQlzcHJpbnRmKG9sZF9zaGExX2hleCwgIl4lcyIsCisJCQkJc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQkJY29tbWl0X2FyZ3ZbM10gPSBvbGRfc2hhMV9oZXg7CisJCQljb21taXRfYXJnYysrOworCQl9CisJCWluaXRfcmV2aXNpb25zKCZyZXZzLCBzZXR1cF9naXRfZGlyZWN0b3J5KCkpOworCQlzZXR1cF9yZXZpc2lvbnMoY29tbWl0X2FyZ2MsIGNvbW1pdF9hcmd2LCAmcmV2cywgTlVMTCk7CisJCWZyZWUobmV3X3NoYTFfaGV4KTsKKwkJaWYgKG9sZF9zaGExX2hleCkgeworCQkJZnJlZShvbGRfc2hhMV9oZXgpOworCQkJY29tbWl0X2FyZ3ZbMV0gPSBOVUxMOworCQl9CisKKwkJLyogR2VuZXJhdGUgYSBsaXN0IG9mIG9iamVjdHMgdGhhdCBuZWVkIHRvIGJlIHB1c2hlZCAqLworCQlwdXNoaW5nID0gMDsKKwkJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKTsKKwkJbWFya19lZGdlc191bmludGVyZXN0aW5nKHJldnMuY29tbWl0cyk7CisJCW9iamVjdHNfdG9fc2VuZCA9IGdldF9kZWx0YSgmcmV2cywgcmVmX2xvY2spOworCQlmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cygpOworCisJCS8qIFB1c2ggbWlzc2luZyBvYmplY3RzIHRvIHJlbW90ZSwgdGhpcyB3b3VsZCBiZSBhCisJCSAgIGNvbnZlbmllbnQgdGltZSB0byBwYWNrIHRoZW0gZmlyc3QgaWYgYXBwcm9wcmlhdGUuICovCisJCXB1c2hpbmcgPSAxOworCQlpZiAob2JqZWN0c190b19zZW5kKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgc2VuZGluZyAlZCBvYmplY3RzXG4iLAorCQkJCW9iamVjdHNfdG9fc2VuZCk7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorCQlmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cygpOworCisJCS8qIFVwZGF0ZSB0aGUgcmVtb3RlIGJyYW5jaCBpZiBhbGwgd2VudCB3ZWxsICovCisJCWlmIChhYm9ydGVkIHx8ICF1cGRhdGVfcmVtb3RlKHJlZi0+bmV3X3NoYTEsIHJlZl9sb2NrKSkgeworCQkJcmMgPSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCXVubG9jazoKKwkJaWYgKCFyYykKKwkJCWZwcmludGYoc3RkZXJyLCAiICAgIGRvbmVcbiIpOworCQl1bmxvY2tfcmVtb3RlKHJlZl9sb2NrKTsKKwkJY2hlY2tfbG9ja3MoKTsKKwl9CisKKwkvKiBVcGRhdGUgcmVtb3RlIHNlcnZlciBpbmZvIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcyAmJiBuZXdfcmVmcykgeworCQlpZiAoaW5mb19yZWZfbG9jayAmJiByZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nIHJlbW90ZSBzZXJ2ZXIgaW5mb1xuIik7CisJCQl1cGRhdGVfcmVtb3RlX2luZm9fcmVmcyhpbmZvX3JlZl9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mb1xuIik7CisJCX0KKwl9CisJaWYgKGluZm9fcmVmX2xvY2spCisJCXVubG9ja19yZW1vdGUoaW5mb19yZWZfbG9jayk7CisKKyBjbGVhbnVwOgorCWZyZWUocmVtb3RlKTsKKworCWN1cmxfc2xpc3RfZnJlZV9hbGwobm9fcHJhZ21hX2hlYWRlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkZWZhdWx0X2hlYWRlcnMpOworCisJaHR0cF9jbGVhbnVwKCk7CisKKwlyZXF1ZXN0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXdoaWxlIChyZXF1ZXN0ICE9IE5VTEwpIHsKKwkJbmV4dF9yZXF1ZXN0ID0gcmVxdWVzdC0+bmV4dDsKKwkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQlyZXF1ZXN0ID0gbmV4dF9yZXF1ZXN0OworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2h0dHAuYyBiL2h0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTI3ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC5jCkBAIC0wLDAgKzEsNDk3IEBACisjaW5jbHVkZSAiaHR0cC5oIgorCitpbnQgZGF0YV9yZWNlaXZlZDsKK2ludCBhY3RpdmVfcmVxdWVzdHMgPSAwOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK2ludCBtYXhfcmVxdWVzdHMgPSAtMTsKK0NVUkxNICpjdXJsbTsKKyNlbmRpZgorI2lmbmRlZiBOT19DVVJMX0VBU1lfRFVQSEFORExFCitDVVJMICpjdXJsX2RlZmF1bHQ7CisjZW5kaWYKK2NoYXIgY3VybF9lcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCitpbnQgY3VybF9zc2xfdmVyaWZ5ID0gLTE7CitjaGFyICpzc2xfY2VydCA9IE5VTEw7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorY2hhciAqc3NsX2tleSA9IE5VTEw7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CitjaGFyICpzc2xfY2FwYXRoID0gTlVMTDsKKyNlbmRpZgorY2hhciAqc3NsX2NhaW5mbyA9IE5VTEw7Citsb25nIGN1cmxfbG93X3NwZWVkX2xpbWl0ID0gLTE7Citsb25nIGN1cmxfbG93X3NwZWVkX3RpbWUgPSAtMTsKK2ludCBjdXJsX2Z0cF9ub19lcHN2ID0gMDsKKworc3RydWN0IGN1cmxfc2xpc3QgKnByYWdtYV9oZWFkZXI7CisKK3N0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICphY3RpdmVfcXVldWVfaGVhZCA9IE5VTEw7CisKK3NpemVfdCBmcmVhZF9idWZmZXIodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWlmIChzaXplID4gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5wb3NuKQorCQlzaXplID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5wb3NuOworCW1lbWNweShwdHIsIChjaGFyICopIGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5wb3NuLCBzaXplKTsKKwlidWZmZXItPnBvc24gKz0gc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc2l6ZV90IGZ3cml0ZV9idWZmZXIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcikKK3sKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlpZiAoc2l6ZSA+IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+cG9zbikgeworCQlidWZmZXItPnNpemUgPSBidWZmZXItPnNpemUgKiAzIC8gMjsKKwkJaWYgKGJ1ZmZlci0+c2l6ZSA8IGJ1ZmZlci0+cG9zbiArIHNpemUpCisJCQlidWZmZXItPnNpemUgPSBidWZmZXItPnBvc24gKyBzaXplOworCQlidWZmZXItPmJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlci0+YnVmZmVyLCBidWZmZXItPnNpemUpOworCX0KKwltZW1jcHkoKGNoYXIgKikgYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPnBvc24sIHB0ciwgc2l6ZSk7CisJYnVmZmVyLT5wb3NuICs9IHNpemU7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBzaXplOworfQorCitzaXplX3QgZndyaXRlX251bGwoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgc2l6ZV90IG5tZW1iLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCit7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBlbHRzaXplICogbm1lbWI7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorc3RhdGljIHZvaWQgcHJvY2Vzc19jdXJsX21lc3NhZ2VzKHZvaWQpCit7CisJaW50IG51bV9tZXNzYWdlczsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlDVVJMTXNnICpjdXJsX21lc3NhZ2UgPSBjdXJsX211bHRpX2luZm9fcmVhZChjdXJsbSwgJm51bV9tZXNzYWdlcyk7CisKKwl3aGlsZSAoY3VybF9tZXNzYWdlICE9IE5VTEwpIHsKKwkJaWYgKGN1cmxfbWVzc2FnZS0+bXNnID09IENVUkxNU0dfRE9ORSkgeworCQkJaW50IGN1cmxfcmVzdWx0ID0gY3VybF9tZXNzYWdlLT5kYXRhLnJlc3VsdDsKKwkJCXNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwkJCXdoaWxlIChzbG90ICE9IE5VTEwgJiYKKwkJCSAgICAgICBzbG90LT5jdXJsICE9IGN1cmxfbWVzc2FnZS0+ZWFzeV9oYW5kbGUpCisJCQkJc2xvdCA9IHNsb3QtPm5leHQ7CisJCQlpZiAoc2xvdCAhPSBOVUxMKSB7CisJCQkJY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKGN1cmxtLCBzbG90LT5jdXJsKTsKKwkJCQlzbG90LT5jdXJsX3Jlc3VsdCA9IGN1cmxfcmVzdWx0OworCQkJCWZpbmlzaF9hY3RpdmVfc2xvdChzbG90KTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJSZWNlaXZlZCBET05FIG1lc3NhZ2UgZm9yIHVua25vd24gcmVxdWVzdCFcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIENVUkwgbWVzc2FnZSByZWNlaXZlZDogJWRcbiIsCisJCQkJKGludCljdXJsX21lc3NhZ2UtPm1zZyk7CisJCX0KKwkJY3VybF9tZXNzYWdlID0gY3VybF9tdWx0aV9pbmZvX3JlYWQoY3VybG0sICZudW1fbWVzc2FnZXMpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGh0dHBfb3B0aW9ucyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKCJodHRwLnNzbHZlcmlmeSIsIHZhcikpIHsKKwkJaWYgKGN1cmxfc3NsX3ZlcmlmeSA9PSAtMSkgeworCQkJY3VybF9zc2xfdmVyaWZ5ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKCJodHRwLnNzbGNlcnQiLCB2YXIpKSB7CisJCWlmIChzc2xfY2VydCA9PSBOVUxMKSB7CisJCQlzc2xfY2VydCA9IHhtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKKwkJCXN0cmNweShzc2xfY2VydCwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCisJaWYgKCFzdHJjbXAoImh0dHAuc3Nsa2V5IiwgdmFyKSkgeworCQlpZiAoc3NsX2tleSA9PSBOVUxMKSB7CisJCQlzc2xfa2V5ID0geG1hbGxvYyhzdHJsZW4odmFsdWUpKzEpOworCQkJc3RyY3B5KHNzbF9rZXksIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisJaWYgKCFzdHJjbXAoImh0dHAuc3NsY2FwYXRoIiwgdmFyKSkgeworCQlpZiAoc3NsX2NhcGF0aCA9PSBOVUxMKSB7CisJCQlzc2xfY2FwYXRoID0geG1hbGxvYyhzdHJsZW4odmFsdWUpKzEpOworCQkJc3RyY3B5KHNzbF9jYXBhdGgsIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlpZiAoIXN0cmNtcCgiaHR0cC5zc2xjYWluZm8iLCB2YXIpKSB7CisJCWlmIChzc2xfY2FpbmZvID09IE5VTEwpIHsKKwkJCXNzbF9jYWluZm8gPSB4bWFsbG9jKHN0cmxlbih2YWx1ZSkrMSk7CisJCQlzdHJjcHkoc3NsX2NhaW5mbywgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCQorCWlmICghc3RyY21wKCJodHRwLm1heHJlcXVlc3RzIiwgdmFyKSkgeworCQlpZiAobWF4X3JlcXVlc3RzID09IC0xKQorCQkJbWF4X3JlcXVlc3RzID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKCFzdHJjbXAoImh0dHAubG93c3BlZWRsaW1pdCIsIHZhcikpIHsKKwkJaWYgKGN1cmxfbG93X3NwZWVkX2xpbWl0ID09IC0xKQorCQkJY3VybF9sb3dfc3BlZWRfbGltaXQgPSAobG9uZylnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKCJodHRwLmxvd3NwZWVkdGltZSIsIHZhcikpIHsKKwkJaWYgKGN1cmxfbG93X3NwZWVkX3RpbWUgPT0gLTEpCisJCQljdXJsX2xvd19zcGVlZF90aW1lID0gKGxvbmcpZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKCJodHRwLm5vZXBzdiIsIHZhcikpIHsKKwkJY3VybF9mdHBfbm9fZXBzdiA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmFsbCBiYWNrIG9uIHRoZSBkZWZhdWx0IG9uZXMgKi8KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgQ1VSTCogZ2V0X2N1cmxfaGFuZGxlKHZvaWQpCit7CisJQ1VSTCogcmVzdWx0ID0gY3VybF9lYXN5X2luaXQoKTsKKworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBjdXJsX3NzbF92ZXJpZnkpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDcKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9ORVRSQywgQ1VSTF9ORVRSQ19PUFRJT05BTCk7CisjZW5kaWYKKworCWlmIChzc2xfY2VydCAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xDRVJULCBzc2xfY2VydCk7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorCWlmIChzc2xfa2V5ICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1NTTEtFWSwgc3NsX2tleSk7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisJaWYgKHNzbF9jYXBhdGggIT0gTlVMTCkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfQ0FQQVRILCBzc2xfY2FwYXRoKTsKKyNlbmRpZgorCWlmIChzc2xfY2FpbmZvICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0NBSU5GTywgc3NsX2NhaW5mbyk7CisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOworCisJaWYgKGN1cmxfbG93X3NwZWVkX2xpbWl0ID4gMCAmJiBjdXJsX2xvd19zcGVlZF90aW1lID4gMCkgeworCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9MT1dfU1BFRURfTElNSVQsCisJCQkJIGN1cmxfbG93X3NwZWVkX2xpbWl0KTsKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTE9XX1NQRUVEX1RJTUUsCisJCQkJIGN1cmxfbG93X3NwZWVkX3RpbWUpOworCX0KKworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKKworCWlmIChnZXRlbnYoIkdJVF9DVVJMX1ZFUkJPU0UiKSkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfVkVSQk9TRSwgMSk7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9VU0VSQUdFTlQsIEdJVF9VU0VSX0FHRU5UKTsKKworCWlmIChjdXJsX2Z0cF9ub19lcHN2KQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9GVFBfVVNFX0VQU1YsIDApOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBodHRwX2luaXQodm9pZCkKK3sKKwljaGFyICpsb3dfc3BlZWRfbGltaXQ7CisJY2hhciAqbG93X3NwZWVkX3RpbWU7CisKKwljdXJsX2dsb2JhbF9pbml0KENVUkxfR0xPQkFMX0FMTCk7CisKKwlwcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocHJhZ21hX2hlYWRlciwgIlByYWdtYTogbm8tY2FjaGUiKTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJeworCQljaGFyICpodHRwX21heF9yZXF1ZXN0cyA9IGdldGVudigiR0lUX0hUVFBfTUFYX1JFUVVFU1RTIik7CisJCWlmIChodHRwX21heF9yZXF1ZXN0cyAhPSBOVUxMKQorCQkJbWF4X3JlcXVlc3RzID0gYXRvaShodHRwX21heF9yZXF1ZXN0cyk7CisJfQorCisJY3VybG0gPSBjdXJsX211bHRpX2luaXQoKTsKKwlpZiAoY3VybG0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIGN1cmwgbXVsdGkgaGFuZGxlLlxuIik7CisJCWV4aXQoMSk7CisJfQorI2VuZGlmCisKKwlpZiAoZ2V0ZW52KCJHSVRfU1NMX05PX1ZFUklGWSIpKQorCQljdXJsX3NzbF92ZXJpZnkgPSAwOworCisJc3NsX2NlcnQgPSBnZXRlbnYoIkdJVF9TU0xfQ0VSVCIpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKKwlzc2xfa2V5ID0gZ2V0ZW52KCJHSVRfU1NMX0tFWSIpOworI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwOAorCXNzbF9jYXBhdGggPSBnZXRlbnYoIkdJVF9TU0xfQ0FQQVRIIik7CisjZW5kaWYKKwlzc2xfY2FpbmZvID0gZ2V0ZW52KCJHSVRfU1NMX0NBSU5GTyIpOworCisJbG93X3NwZWVkX2xpbWl0ID0gZ2V0ZW52KCJHSVRfSFRUUF9MT1dfU1BFRURfTElNSVQiKTsKKwlpZiAobG93X3NwZWVkX2xpbWl0ICE9IE5VTEwpCisJCWN1cmxfbG93X3NwZWVkX2xpbWl0ID0gc3RydG9sKGxvd19zcGVlZF9saW1pdCwgTlVMTCwgMTApOworCWxvd19zcGVlZF90aW1lID0gZ2V0ZW52KCJHSVRfSFRUUF9MT1dfU1BFRURfVElNRSIpOworCWlmIChsb3dfc3BlZWRfdGltZSAhPSBOVUxMKQorCQljdXJsX2xvd19zcGVlZF90aW1lID0gc3RydG9sKGxvd19zcGVlZF90aW1lLCBOVUxMLCAxMCk7CisKKwlnaXRfY29uZmlnKGh0dHBfb3B0aW9ucyk7CisKKwlpZiAoY3VybF9zc2xfdmVyaWZ5ID09IC0xKQorCQljdXJsX3NzbF92ZXJpZnkgPSAxOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlpZiAobWF4X3JlcXVlc3RzIDwgMSkKKwkJbWF4X3JlcXVlc3RzID0gREVGQVVMVF9NQVhfUkVRVUVTVFM7CisjZW5kaWYKKworCWlmIChnZXRlbnYoIkdJVF9DVVJMX0ZUUF9OT19FUFNWIikpCisJCWN1cmxfZnRwX25vX2Vwc3YgPSAxOworCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKwljdXJsX2RlZmF1bHQgPSBnZXRfY3VybF9oYW5kbGUoKTsKKyNlbmRpZgorfQorCit2b2lkIGh0dHBfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwljaGFyICp3YWl0X3VybDsKKyNlbmRpZgorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkgeworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJCWlmIChzbG90LT5pbl91c2UpIHsKKwkJCWN1cmxfZWFzeV9nZXRpbmZvKHNsb3QtPmN1cmwsCisJCQkJCSAgQ1VSTElORk9fRUZGRUNUSVZFX1VSTCwKKwkJCQkJICAmd2FpdF91cmwpOworCQkJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIGZvciAlc1xuIiwgd2FpdF91cmwpOworCQkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQl9CisjZW5kaWYKKwkJaWYgKHNsb3QtPmN1cmwgIT0gTlVMTCkKKwkJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQlzbG90ID0gc2xvdC0+bmV4dDsKKwl9CisKKyNpZm5kZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorCWN1cmxfZWFzeV9jbGVhbnVwKGN1cmxfZGVmYXVsdCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJY3VybF9tdWx0aV9jbGVhbnVwKGN1cmxtKTsKKyNlbmRpZgorCWN1cmxfZ2xvYmFsX2NsZWFudXAoKTsKKworCWN1cmxfc2xpc3RfZnJlZV9hbGwocHJhZ21hX2hlYWRlcik7CisgICAgICAgIHByYWdtYV9oZWFkZXIgPSBOVUxMOworfQorCitzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqZ2V0X2FjdGl2ZV9zbG90KHZvaWQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqbmV3c2xvdDsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJaW50IG51bV90cmFuc2ZlcnM7CisKKwkvKiBXYWl0IGZvciBhIHNsb3QgdG8gb3BlbiB1cCBpZiB0aGUgcXVldWUgaXMgZnVsbCAqLworCXdoaWxlIChhY3RpdmVfcmVxdWVzdHMgPj0gbWF4X3JlcXVlc3RzKSB7CisJCWN1cmxfbXVsdGlfcGVyZm9ybShjdXJsbSwgJm51bV90cmFuc2ZlcnMpOworCQlpZiAobnVtX3RyYW5zZmVycyA8IGFjdGl2ZV9yZXF1ZXN0cykgeworCQkJcHJvY2Vzc19jdXJsX21lc3NhZ2VzKCk7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlIChzbG90ICE9IE5VTEwgJiYgc2xvdC0+aW5fdXNlKSB7CisJCXNsb3QgPSBzbG90LT5uZXh0OworCX0KKwlpZiAoc2xvdCA9PSBOVUxMKSB7CisJCW5ld3Nsb3QgPSB4bWFsbG9jKHNpemVvZigqbmV3c2xvdCkpOworCQluZXdzbG90LT5jdXJsID0gTlVMTDsKKwkJbmV3c2xvdC0+aW5fdXNlID0gMDsKKwkJbmV3c2xvdC0+bmV4dCA9IE5VTEw7CisKKwkJc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCQlpZiAoc2xvdCA9PSBOVUxMKSB7CisJCQlhY3RpdmVfcXVldWVfaGVhZCA9IG5ld3Nsb3Q7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoc2xvdC0+bmV4dCAhPSBOVUxMKSB7CisJCQkJc2xvdCA9IHNsb3QtPm5leHQ7CisJCQl9CisJCQlzbG90LT5uZXh0ID0gbmV3c2xvdDsKKwkJfQorCQlzbG90ID0gbmV3c2xvdDsKKwl9CisKKwlpZiAoc2xvdC0+Y3VybCA9PSBOVUxMKSB7CisjaWZkZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorCQlzbG90LT5jdXJsID0gZ2V0X2N1cmxfaGFuZGxlKCk7CisjZWxzZQorCQlzbG90LT5jdXJsID0gY3VybF9lYXN5X2R1cGhhbmRsZShjdXJsX2RlZmF1bHQpOworI2VuZGlmCisJfQorCisJYWN0aXZlX3JlcXVlc3RzKys7CisJc2xvdC0+aW5fdXNlID0gMTsKKwlzbG90LT5sb2NhbCA9IE5VTEw7CisJc2xvdC0+cmVzdWx0cyA9IE5VTEw7CisJc2xvdC0+ZmluaXNoZWQgPSBOVUxMOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSBOVUxMOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBOVUxMOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcHJhZ21hX2hlYWRlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCBjdXJsX2Vycm9yc3RyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDApOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKworCXJldHVybiBzbG90OworfQorCitpbnQgc3RhcnRfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlDVVJMTWNvZGUgY3VybG1fcmVzdWx0ID0gY3VybF9tdWx0aV9hZGRfaGFuZGxlKGN1cmxtLCBzbG90LT5jdXJsKTsKKworCWlmIChjdXJsbV9yZXN1bHQgIT0gQ1VSTE1fT0sgJiYKKwkgICAgY3VybG1fcmVzdWx0ICE9IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkgeworCQlhY3RpdmVfcmVxdWVzdHMtLTsKKwkJc2xvdC0+aW5fdXNlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQordm9pZCBzdGVwX2FjdGl2ZV9zbG90cyh2b2lkKQoreworCWludCBudW1fdHJhbnNmZXJzOworCUNVUkxNY29kZSBjdXJsbV9yZXN1bHQ7CisKKwlkbyB7CisJCWN1cmxtX3Jlc3VsdCA9IGN1cmxfbXVsdGlfcGVyZm9ybShjdXJsbSwgJm51bV90cmFuc2ZlcnMpOworCX0gd2hpbGUgKGN1cmxtX3Jlc3VsdCA9PSBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0pOworCWlmIChudW1fdHJhbnNmZXJzIDwgYWN0aXZlX3JlcXVlc3RzKSB7CisJCXByb2Nlc3NfY3VybF9tZXNzYWdlcygpOworCQlmaWxsX2FjdGl2ZV9zbG90cygpOworCX0KK30KKyNlbmRpZgorCit2b2lkIHJ1bl9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWxvbmcgbGFzdF9wb3MgPSAwOworCWxvbmcgY3VycmVudF9wb3M7CisJZmRfc2V0IHJlYWRmZHM7CisJZmRfc2V0IHdyaXRlZmRzOworCWZkX3NldCBleGNmZHM7CisJaW50IG1heF9mZDsKKwlzdHJ1Y3QgdGltZXZhbCBzZWxlY3RfdGltZW91dDsKKwlpbnQgZmluaXNoZWQgPSAwOworCisJc2xvdC0+ZmluaXNoZWQgPSAmZmluaXNoZWQ7CisJd2hpbGUgKCFmaW5pc2hlZCkgeworCQlkYXRhX3JlY2VpdmVkID0gMDsKKwkJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKworCQlpZiAoIWRhdGFfcmVjZWl2ZWQgJiYgc2xvdC0+bG9jYWwgIT0gTlVMTCkgeworCQkJY3VycmVudF9wb3MgPSBmdGVsbChzbG90LT5sb2NhbCk7CisJCQlpZiAoY3VycmVudF9wb3MgPiBsYXN0X3BvcykKKwkJCQlkYXRhX3JlY2VpdmVkKys7CisJCQlsYXN0X3BvcyA9IGN1cnJlbnRfcG9zOworCQl9CisKKwkJaWYgKHNsb3QtPmluX3VzZSAmJiAhZGF0YV9yZWNlaXZlZCkgeworCQkJbWF4X2ZkID0gMDsKKwkJCUZEX1pFUk8oJnJlYWRmZHMpOworCQkJRkRfWkVSTygmd3JpdGVmZHMpOworCQkJRkRfWkVSTygmZXhjZmRzKTsKKwkJCXNlbGVjdF90aW1lb3V0LnR2X3NlYyA9IDA7CisJCQlzZWxlY3RfdGltZW91dC50dl91c2VjID0gNTAwMDA7CisJCQlzZWxlY3QobWF4X2ZkLCAmcmVhZGZkcywgJndyaXRlZmRzLAorCQkJICAgICAgICZleGNmZHMsICZzZWxlY3RfdGltZW91dCk7CisJCX0KKwl9CisjZWxzZQorCXdoaWxlIChzbG90LT5pbl91c2UpIHsKKwkJc2xvdC0+Y3VybF9yZXN1bHQgPSBjdXJsX2Vhc3lfcGVyZm9ybShzbG90LT5jdXJsKTsKKwkJZmluaXNoX2FjdGl2ZV9zbG90KHNsb3QpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjbG9zZWRvd25fYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisgICAgICAgIGFjdGl2ZV9yZXF1ZXN0cy0tOworICAgICAgICBzbG90LT5pbl91c2UgPSAwOworfQorCit2b2lkIHJlbGVhc2VfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisJY2xvc2Vkb3duX2FjdGl2ZV9zbG90KHNsb3QpOworCWlmIChzbG90LT5jdXJsKSB7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKGN1cmxtLCBzbG90LT5jdXJsKTsKKyNlbmRpZgorCQljdXJsX2Vhc3lfY2xlYW51cChzbG90LT5jdXJsKTsKKwkJc2xvdC0+Y3VybCA9IE5VTEw7CisJfQorI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisJY2xvc2Vkb3duX2FjdGl2ZV9zbG90KHNsb3QpOworICAgICAgICBjdXJsX2Vhc3lfZ2V0aW5mbyhzbG90LT5jdXJsLCBDVVJMSU5GT19IVFRQX0NPREUsICZzbG90LT5odHRwX2NvZGUpOworCisJaWYgKHNsb3QtPmZpbmlzaGVkICE9IE5VTEwpCisJCSgqc2xvdC0+ZmluaXNoZWQpID0gMTsKKworCS8qIFN0b3JlIHNsb3QgcmVzdWx0cyBzbyB0aGV5IGNhbiBiZSByZWFkIGFmdGVyIHRoZSBzbG90IGlzIHJldXNlZCAqLworCWlmIChzbG90LT5yZXN1bHRzICE9IE5VTEwpIHsKKwkJc2xvdC0+cmVzdWx0cy0+Y3VybF9yZXN1bHQgPSBzbG90LT5jdXJsX3Jlc3VsdDsKKwkJc2xvdC0+cmVzdWx0cy0+aHR0cF9jb2RlID0gc2xvdC0+aHR0cF9jb2RlOworCX0KKworICAgICAgICAvKiBSdW4gY2FsbGJhY2sgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgICAgaWYgKHNsb3QtPmNhbGxiYWNrX2Z1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNsb3QtPmNhbGxiYWNrX2Z1bmMoc2xvdC0+Y2FsbGJhY2tfZGF0YSk7CisgICAgICAgIH0KK30KKwordm9pZCBmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cyh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKQorCQlpZiAoc2xvdC0+aW5fdXNlKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJCX0gZWxzZSB7CisJCQlzbG90ID0gc2xvdC0+bmV4dDsKKwkJfQorfQpkaWZmIC0tZ2l0IGEvaHR0cC5oIGIvaHR0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjZiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9odHRwLmgKQEAgLTAsMCArMSwxMDggQEAKKyNpZm5kZWYgSFRUUF9ICisjZGVmaW5lIEhUVFBfSAorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorI2luY2x1ZGUgPGN1cmwvZWFzeS5oPgorCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MTAwMAorI2RlZmluZSBVU0VfQ1VSTF9NVUxUSQorI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUUyA1CisjZW5kaWYKKworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MDcwNAorI2RlZmluZSBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgZG8geyAvKiBub3RoaW5nICovIH0gd2hpbGUoMCkKKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MDgwMAorI2RlZmluZSBjdXJsX2dsb2JhbF9pbml0KGEpIGRvIHsgLyogbm90aGluZyAqLyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmIChMSUJDVVJMX1ZFUlNJT05fTlVNIDwgMHgwNzBjMDQpIHx8IChMSUJDVVJMX1ZFUlNJT05fTlVNID09IDB4MDcxMDAwKQorI2RlZmluZSBOT19DVVJMX0VBU1lfRFVQSEFORExFCisjZW5kaWYKKworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MGEwMworI2RlZmluZSBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIENVUkxFX0hUVFBfTk9UX0ZPVU5ECisjZW5kaWYKKworc3RydWN0IHNsb3RfcmVzdWx0cworeworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWxvbmcgaHR0cF9jb2RlOworfTsKKworc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QKK3sKKwlDVVJMICpjdXJsOworCUZJTEUgKmxvY2FsOworCWludCBpbl91c2U7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJbG9uZyBodHRwX2NvZGU7CisJaW50ICpmaW5pc2hlZDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzICpyZXN1bHRzOworCXZvaWQgKmNhbGxiYWNrX2RhdGE7CisJdm9pZCAoKmNhbGxiYWNrX2Z1bmMpKHZvaWQgKmRhdGEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpuZXh0OworfTsKKworc3RydWN0IGJ1ZmZlcgoreworICAgICAgICBzaXplX3QgcG9zbjsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHZvaWQgKmJ1ZmZlcjsKK307CisKKy8qIEN1cmwgcmVxdWVzdCByZWFkL3dyaXRlIGNhbGxiYWNrcyAqLworZXh0ZXJuIHNpemVfdCBmcmVhZF9idWZmZXIodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKTsKK2V4dGVybiBzaXplX3QgZndyaXRlX2J1ZmZlcihjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICAgIHNpemVfdCBubWVtYiwgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKTsKK2V4dGVybiBzaXplX3QgZndyaXRlX251bGwoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgc2l6ZV90IG5tZW1iLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpOworCisvKiBTbG90IGxpZmVjeWNsZSBmdW5jdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqZ2V0X2FjdGl2ZV9zbG90KHZvaWQpOworZXh0ZXJuIGludCBzdGFydF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CitleHRlcm4gdm9pZCBydW5fYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpOworZXh0ZXJuIHZvaWQgZmluaXNoX2FsbF9hY3RpdmVfc2xvdHModm9pZCk7CitleHRlcm4gdm9pZCByZWxlYXNlX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitleHRlcm4gdm9pZCBmaWxsX2FjdGl2ZV9zbG90cyh2b2lkKTsKK2V4dGVybiB2b2lkIHN0ZXBfYWN0aXZlX3Nsb3RzKHZvaWQpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIGh0dHBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGh0dHBfY2xlYW51cCh2b2lkKTsKKworZXh0ZXJuIGludCBkYXRhX3JlY2VpdmVkOworZXh0ZXJuIGludCBhY3RpdmVfcmVxdWVzdHM7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorZXh0ZXJuIGludCBtYXhfcmVxdWVzdHM7CitleHRlcm4gQ1VSTE0gKmN1cmxtOworI2VuZGlmCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKK2V4dGVybiBDVVJMICpjdXJsX2RlZmF1bHQ7CisjZW5kaWYKK2V4dGVybiBjaGFyIGN1cmxfZXJyb3JzdHJbQ1VSTF9FUlJPUl9TSVpFXTsKKworZXh0ZXJuIGludCBjdXJsX3NzbF92ZXJpZnk7CitleHRlcm4gY2hhciAqc3NsX2NlcnQ7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorZXh0ZXJuIGNoYXIgKnNzbF9rZXk7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CitleHRlcm4gY2hhciAqc3NsX2NhcGF0aDsKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKnNzbF9jYWluZm87CitleHRlcm4gbG9uZyBjdXJsX2xvd19zcGVlZF9saW1pdDsKK2V4dGVybiBsb25nIGN1cmxfbG93X3NwZWVkX3RpbWU7CisKK2V4dGVybiBzdHJ1Y3QgY3VybF9zbGlzdCAqcHJhZ21hX2hlYWRlcjsKK2V4dGVybiBzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcmFuZ2VfaGVhZGVyOworCitleHRlcm4gc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKmFjdGl2ZV9xdWV1ZV9oZWFkOworCisjZW5kaWYgLyogSFRUUF9IICovCmRpZmYgLS1naXQgYS9pZGVudC5jIGIvaWRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ5NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvaWRlbnQuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIGlkZW50LmMKKyAqCisgKiBjcmVhdGUgZ2l0IGlkZW50aWZpZXIgbGluZXMgb2YgdGhlIGZvcm0gIm5hbWUgPGVtYWlsPiBkYXRlIgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBMaW51cyBUb3J2YWxkcworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNoYXIgZ2l0X2RlZmF1bHRfZGF0ZVs1MF07CisKK3N0YXRpYyB2b2lkIGNvcHlfZ2Vjb3MoY29uc3Qgc3RydWN0IHBhc3N3ZCAqdywgY2hhciAqbmFtZSwgc2l6ZV90IHN6KQoreworCWNoYXIgKnNyYywgKmRzdDsKKwlzaXplX3QgbGVuLCBubGVuOworCisJbmxlbiA9IHN0cmxlbih3LT5wd19uYW1lKTsKKworCS8qIFRyYWRpdGlvbmFsbHkgR0VDT1MgZmllbGQgaGFkIG9mZmljZSBwaG9uZSBudW1iZXJzIGV0Yywgc2VwYXJhdGVkCisJICogd2l0aCBjb21tYXMuICBBbHNvICYgc3RhbmRzIGZvciBjYXBpdGFsaXplZCBmb3JtIG9mIHRoZSBsb2dpbiBuYW1lLgorCSAqLworCisJZm9yIChsZW4gPSAwLCBkc3QgPSBuYW1lLCBzcmMgPSB3LT5wd19nZWNvczsgbGVuIDwgc3o7IHNyYysrKSB7CisJCWludCBjaCA9ICpzcmM7CisJCWlmIChjaCAhPSAnJicpIHsKKwkJCSpkc3QrKyA9IGNoOworCQkJaWYgKGNoID09IDAgfHwgY2ggPT0gJywnKQorCQkJCWJyZWFrOworCQkJbGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGVuICsgbmxlbiA8IHN6KSB7CisJCQkvKiBTb3JyeSwgTXIuIE1jRG9uYWxkLi4uICovCisJCQkqZHN0KysgPSB0b3VwcGVyKCp3LT5wd19uYW1lKTsKKwkJCW1lbWNweShkc3QsIHctPnB3X25hbWUgKyAxLCBubGVuIC0gMSk7CisJCQlkc3QgKz0gbmxlbiAtIDE7CisJCX0KKwl9CisJaWYgKGxlbiA8IHN6KQorCQluYW1lW2xlbl0gPSAwOworCWVsc2UKKwkJZGllKCJZb3VyIHBhcmVudHMgbXVzdCBoYXZlIGhhdGVkIHlvdSEiKTsKKworfQorCitzdGF0aWMgdm9pZCBjb3B5X2VtYWlsKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCS8qCisJICogTWFrZSB1cCBhIGZha2UgZW1haWwgYWRkcmVzcworCSAqIChuYW1lICsgJ0AnICsgaG9zdG5hbWUgWysgJy4nICsgZG9tYWlubmFtZV0pCisJICovCisJc2l6ZV90IGxlbiA9IHN0cmxlbihwdy0+cHdfbmFtZSk7CisJaWYgKGxlbiA+IHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkvMikKKwkJZGllKCJZb3VyIHN5c2FkbWluIG11c3QgaGF0ZSB5b3UhIik7CisJbWVtY3B5KGdpdF9kZWZhdWx0X2VtYWlsLCBwdy0+cHdfbmFtZSwgbGVuKTsKKwlnaXRfZGVmYXVsdF9lbWFpbFtsZW4rK10gPSAnQCc7CisJZ2V0aG9zdG5hbWUoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sIHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkgLSBsZW4pOworCWlmICghc3RyY2hyKGdpdF9kZWZhdWx0X2VtYWlsK2xlbiwgJy4nKSkgeworCQlzdHJ1Y3QgaG9zdGVudCAqaGUgPSBnZXRob3N0YnluYW1lKGdpdF9kZWZhdWx0X2VtYWlsICsgbGVuKTsKKwkJY2hhciAqZG9tYWlubmFtZTsKKworCQlsZW4gPSBzdHJsZW4oZ2l0X2RlZmF1bHRfZW1haWwpOworCQlnaXRfZGVmYXVsdF9lbWFpbFtsZW4rK10gPSAnLic7CisJCWlmIChoZSAmJiAoZG9tYWlubmFtZSA9IHN0cmNocihoZS0+aF9uYW1lLCAnLicpKSkKKwkJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sIGRvbWFpbm5hbWUgKyAxLAorCQkJCXNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkgLSBsZW4pOworCQllbHNlCisJCQlzdHJsY3B5KGdpdF9kZWZhdWx0X2VtYWlsICsgbGVuLCAiKG5vbmUpIiwKKwkJCQlzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpIC0gbGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2lkZW50KHZvaWQpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBOVUxMOworCisJLyogR2V0IHRoZSBuYW1lICgiZ2Vjb3MiKSAqLworCWlmICghZ2l0X2RlZmF1bHRfbmFtZVswXSkgeworCQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwkJaWYgKCFwdykKKwkJCWRpZSgiWW91IGRvbid0IGV4aXN0LiBHbyBhd2F5ISIpOworCQljb3B5X2dlY29zKHB3LCBnaXRfZGVmYXVsdF9uYW1lLCBzaXplb2YoZ2l0X2RlZmF1bHRfbmFtZSkpOworCX0KKworCWlmICghZ2l0X2RlZmF1bHRfZW1haWxbMF0pIHsKKwkJaWYgKCFwdykKKwkJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCQlpZiAoIXB3KQorCQkJZGllKCJZb3UgZG9uJ3QgZXhpc3QuIEdvIGF3YXkhIik7CisJCWNvcHlfZW1haWwocHcpOworCX0KKworCS8qIEFuZCBzZXQgdGhlIGRlZmF1bHQgZGF0ZSAqLworCWlmICghZ2l0X2RlZmF1bHRfZGF0ZVswXSkKKwkJZGF0ZXN0YW1wKGdpdF9kZWZhdWx0X2RhdGUsIHNpemVvZihnaXRfZGVmYXVsdF9kYXRlKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JhdyhjaGFyICpidWYsIHNpemVfdCBzaXplLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpzdHIpCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworCWlmIChvZmZzZXQgKyBsZW4gPiBzaXplKQorCQlyZXR1cm4gc2l6ZTsKKwltZW1jcHkoYnVmICsgb2Zmc2V0LCBzdHIsIGxlbik7CisJcmV0dXJuIG9mZnNldCArIGxlbjsKK30KKworc3RhdGljIGludCBjcnVkKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlzdGF0aWMgY2hhciBjcnVkX2FycmF5WzI1Nl07CisJc3RhdGljIGludCBjcnVkX2FycmF5X2luaXRpYWxpemVkID0gMDsKKworCWlmICghY3J1ZF9hcnJheV9pbml0aWFsaXplZCkgeworCQlpbnQgazsKKworCQlmb3IgKGsgPSAwOyBrIDw9IDMxOyArK2spIGNydWRfYXJyYXlba10gPSAxOworCQljcnVkX2FycmF5WycgJ10gPSAxOworCQljcnVkX2FycmF5WycuJ10gPSAxOworCQljcnVkX2FycmF5WycsJ10gPSAxOworCQljcnVkX2FycmF5Wyc6J10gPSAxOworCQljcnVkX2FycmF5Wyc7J10gPSAxOworCQljcnVkX2FycmF5Wyc8J10gPSAxOworCQljcnVkX2FycmF5Wyc+J10gPSAxOworCQljcnVkX2FycmF5WyciJ10gPSAxOworCQljcnVkX2FycmF5WydcJyddID0gMTsKKwkJY3J1ZF9hcnJheV9pbml0aWFsaXplZCA9IDE7CisJfQorCXJldHVybiBjcnVkX2FycmF5W2NdOworfQorCisvKgorICogQ29weSBvdmVyIGEgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiwgYnV0IGF2b2lkIHNwZWNpYWwKKyAqIGNoYXJhY3RlcnMgKCdcbicsICc8JyBhbmQgJz4nKSBhbmQgcmVtb3ZlIGNydWQgYXQgdGhlIGVuZAorICovCitzdGF0aWMgaW50IGNvcHkoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqc3JjKQoreworCXNpemVfdCBpLCBsZW47CisJdW5zaWduZWQgY2hhciBjOworCisJLyogUmVtb3ZlIGNydWQgZnJvbSB0aGUgYmVnaW5uaW5nLi4gKi8KKwl3aGlsZSAoKGMgPSAqc3JjKSAhPSAwKSB7CisJCWlmICghY3J1ZChjKSkKKwkJCWJyZWFrOworCQlzcmMrKzsKKwl9CisKKwkvKiBSZW1vdmUgY3J1ZCBmcm9tIHRoZSBlbmQuLiAqLworCWxlbiA9IHN0cmxlbihzcmMpOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWMgPSBzcmNbbGVuLTFdOworCQlpZiAoIWNydWQoYykpCisJCQlicmVhazsKKwkJLS1sZW47CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSByZXN0IHRvIHRoZSBidWZmZXIsIGJ1dCBhdm9pZCB0aGUgc3BlY2lhbAorCSAqIGNoYXJhY3RlcnMgJ1xuJyAnPCcgYW5kICc+JyB0aGF0IGFjdCBhcyBkZWxpbWl0ZXJzIG9uCisJICogYSBpZGVudGlmaWNhdGlvbiBsaW5lCisJICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSAqc3JjKys7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdcbic6IGNhc2UgJzwnOiBjYXNlICc+JzoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJCXJldHVybiBzaXplOworCQlidWZbb2Zmc2V0KytdID0gYzsKKwl9CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgYXVfZW52W10gPSAiR0lUX0FVVEhPUl9OQU1FIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNvX2VudltdID0gIkdJVF9DT01NSVRURVJfTkFNRSI7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X2hpbnQgPQorIlxuIgorIioqKiBZb3VyIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSB5b3VyIHN5c3RlbSBzZXJ2aWNlcyAoZ2Vjb3MpLlxuIgorIlxuIgorIlJ1blxuIgorIlxuIgorIiAgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwieW91QGVtYWlsLmNvbVwiXG4iCisiICBnaXQgY29uZmlnIHVzZXIubmFtZSBcIllvdXIgTmFtZVwiXG4iCisiXG4iCisiVG8gc2V0IHRoZSBpZGVudGl0eSBpbiB0aGlzIHJlcG9zaXRvcnkuXG4iCisiQWRkIC0tZ2xvYmFsIHRvIHNldCB5b3VyIGFjY291bnRcJ3MgZGVmYXVsdFxuIgorIlxuIjsKKworY29uc3QgY2hhciAqZm10X2lkZW50KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmVtYWlsLAorCQkgICAgICBjb25zdCBjaGFyICpkYXRlX3N0ciwgaW50IGVycm9yX29uX25vX25hbWUpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMDBdOworCWNoYXIgZGF0ZVs1MF07CisJaW50IGk7CisKKwlzZXR1cF9pZGVudCgpOworCWlmICghbmFtZSkKKwkJbmFtZSA9IGdpdF9kZWZhdWx0X25hbWU7CisJaWYgKCFlbWFpbCkKKwkJZW1haWwgPSBnaXRfZGVmYXVsdF9lbWFpbDsKKwlpZiAoIWVtYWlsKQorCQllbWFpbCA9IGdldGVudigiRU1BSUwiKTsKKworCWlmICghKm5hbWUpIHsKKwkJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwkJaWYgKDAgPD0gZXJyb3Jfb25fbm9fbmFtZSAmJgorCQkgICAgbmFtZSA9PSBnaXRfZGVmYXVsdF9uYW1lICYmIGVudl9oaW50KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZW52X2hpbnQsIGF1X2VudiwgY29fZW52KTsKKwkJCWVudl9oaW50ID0gTlVMTDsgLyogd2FybiBvbmx5IG9uY2UsIGZvciAiZ2l0LXZhciAtbCIgKi8KKwkJfQorCQlpZiAoMCA8IGVycm9yX29uX25vX25hbWUpCisJCQlkaWUoImVtcHR5IGlkZW50ICVzIDwlcz4gbm90IGFsbG93ZWQiLCBuYW1lLCBlbWFpbCk7CisJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCQlpZiAoIXB3KQorCQkJZGllKCJZb3UgZG9uJ3QgZXhpc3QuIEdvIGF3YXkhIik7CisJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfbmFtZSwgcHctPnB3X25hbWUsCisJCQlzaXplb2YoZ2l0X2RlZmF1bHRfbmFtZSkpOworCQluYW1lID0gZ2l0X2RlZmF1bHRfbmFtZTsKKwl9CisKKwlzdHJjcHkoZGF0ZSwgZ2l0X2RlZmF1bHRfZGF0ZSk7CisJaWYgKGRhdGVfc3RyKQorCQlwYXJzZV9kYXRlKGRhdGVfc3RyLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworCisJaSA9IGNvcHkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCwgbmFtZSk7CisJaSA9IGFkZF9yYXcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgIiA8Iik7CisJaSA9IGNvcHkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgZW1haWwpOworCWkgPSBhZGRfcmF3KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksICI+ICIpOworCWkgPSBjb3B5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksIGRhdGUpOworCWlmIChpID49IHNpemVvZihidWZmZXIpKQorCQlkaWUoIkltcG9zc2libHkgbG9uZyBwZXJzb25hbCBpZGVudGlmaWVyIik7CisJYnVmZmVyW2ldID0gMDsKKwlyZXR1cm4gYnVmZmVyOworfQorCitjb25zdCBjaGFyICpnaXRfYXV0aG9yX2luZm8oaW50IGVycm9yX29uX25vX25hbWUpCit7CisJcmV0dXJuIGZtdF9pZGVudChnZXRlbnYoIkdJVF9BVVRIT1JfTkFNRSIpLAorCQkJIGdldGVudigiR0lUX0FVVEhPUl9FTUFJTCIpLAorCQkJIGdldGVudigiR0lUX0FVVEhPUl9EQVRFIiksCisJCQkgZXJyb3Jfb25fbm9fbmFtZSk7Cit9CisKK2NvbnN0IGNoYXIgKmdpdF9jb21taXR0ZXJfaW5mbyhpbnQgZXJyb3Jfb25fbm9fbmFtZSkKK3sKKwlyZXR1cm4gZm10X2lkZW50KGdldGVudigiR0lUX0NPTU1JVFRFUl9OQU1FIiksCisJCQkgZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX0VNQUlMIiksCisJCQkgZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX0RBVEUiKSwKKwkJCSBlcnJvcl9vbl9ub19uYW1lKTsKK30KZGlmZiAtLWdpdCBhL2ltYXAtc2VuZC5jIGIvaW1hcC1zZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4M2E0YQotLS0gL2Rldi9udWxsCisrKyBiL2ltYXAtc2VuZC5jCkBAIC0wLDAgKzEsMTM0NSBAQAorLyoKKyAqIGdpdC1pbWFwLXNlbmQgLSBkcm9wcyBwYXRjaGVzIGludG8gYW4gaW1hcCBEcmFmdHMgZm9sZGVyCisgKiAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tIGlzeW5jL21ic3luYyAtIG1haWxib3ggc3luY2hyb25pemVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgTWljaGFlbCBSLiBFbGtpbnMgPG1lQG11dHQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgT3N3YWxkIEJ1ZGRlbmhhZ2VuIDxvc3NpQHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pa2UgTWNDb3JtYWNrCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKK3R5cGVkZWYgc3RydWN0IHN0b3JlX2NvbmYgeworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqcGF0aDsgLyogc2hvdWxkIHRoaXMgYmUgaGVyZT8gaXRzIGludGVycHJldGF0aW9uIGlzIGRyaXZlci1zcGVjaWZpYyAqLworCWNoYXIgKm1hcF9pbmJveDsKKwljaGFyICp0cmFzaDsKKwl1bnNpZ25lZCBtYXhfc2l6ZTsgLyogb2ZmX3QgaXMgb3ZlcmtpbGwgKi8KKwl1bnNpZ25lZCB0cmFzaF9yZW1vdGVfbmV3OjEsIHRyYXNoX29ubHlfbmV3OjE7Cit9IHN0b3JlX2NvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nX2xpc3QgeworCXN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dDsKKwljaGFyIHN0cmluZ1sxXTsKK30gc3RyaW5nX2xpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9jb25mIHsKKwlzdHJ1Y3QgY2hhbm5lbF9jb25mICpuZXh0OworCWNoYXIgKm5hbWU7CisJc3RvcmVfY29uZl90ICptYXN0ZXIsICpzbGF2ZTsKKwljaGFyICptYXN0ZXJfbmFtZSwgKnNsYXZlX25hbWU7CisJY2hhciAqc3luY19zdGF0ZTsKKwlzdHJpbmdfbGlzdF90ICpwYXR0ZXJuczsKKwlpbnQgbW9wcywgc29wczsKKwl1bnNpZ25lZCBtYXhfbWVzc2FnZXM7IC8qIGZvciBzbGF2ZSBvbmx5ICovCit9IGNoYW5uZWxfY29uZl90OworCit0eXBlZGVmIHN0cnVjdCBncm91cF9jb25mIHsKKwlzdHJ1Y3QgZ3JvdXBfY29uZiAqbmV4dDsKKwljaGFyICpuYW1lOworCXN0cmluZ19saXN0X3QgKmNoYW5uZWxzOworfSBncm91cF9jb25mX3Q7CisKKy8qIEZvciBtZXNzYWdlLT5zdGF0dXMgKi8KKyNkZWZpbmUgTV9SRUNFTlQgICAgICAgKDE8PDApIC8qIHVuc3luY2FibGUgZmxhZzsgbWFpbGRpcl8qIGRlcGVuZCBvbiB0aGlzIGJlaW5nIDE8PDAgKi8KKyNkZWZpbmUgTV9ERUFEICAgICAgICAgKDE8PDEpIC8qIGV4cHVuZ2VkICovCisjZGVmaW5lIE1fRkxBR1MgICAgICAgICgxPDwyKSAvKiBmbGFncyBmZXRjaGVkICovCisKK3R5cGVkZWYgc3RydWN0IG1lc3NhZ2UgeworCXN0cnVjdCBtZXNzYWdlICpuZXh0OworCS8qIHN0cmluZ19saXN0X3QgKmtleXdvcmRzOyAqLworCXNpemVfdCBzaXplOyAvKiB6ZXJvIGltcGxpZXMgIm5vdCBmZXRjaGVkIiAqLworCWludCB1aWQ7CisJdW5zaWduZWQgY2hhciBmbGFncywgc3RhdHVzOworfSBtZXNzYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHN0b3JlIHsKKwlzdG9yZV9jb25mX3QgKmNvbmY7IC8qIGZvcmVpZ24gKi8KKworCS8qIGN1cnJlbnRseSBvcGVuIG1haWxib3ggKi8KKwljb25zdCBjaGFyICpuYW1lOyAvKiBmb3JlaWduISBtYXliZSBwcmVzZXQ/ICovCisJY2hhciAqcGF0aDsgLyogb3duICovCisJbWVzc2FnZV90ICptc2dzOyAvKiBvd24gKi8KKwlpbnQgdWlkdmFsaWRpdHk7CisJdW5zaWduZWQgY2hhciBvcHRzOyAvKiBtYXliZSBwcmVzZXQ/ICovCisJLyogbm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgZG8gX25vdF8gcmVmbGVjdCBzdGF0cyBmcm9tIG1zZ3MsIGJ1dCBtYWlsYm94IHRvdGFscyAqLworCWludCBjb3VudDsgLyogIyBvZiBtZXNzYWdlcyAqLworCWludCByZWNlbnQ7IC8qICMgb2YgcmVjZW50IG1lc3NhZ2VzIC0gZG9uJ3QgdHJ1c3QgdGhpcyBiZXlvbmQgdGhlIGluaXRpYWwgcmVhZCAqLworfSBzdG9yZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciAqZGF0YTsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNybGY6MTsKK30gbXNnX2RhdGFfdDsKKworI2RlZmluZSBEUlZfT0sgICAgICAgICAgMAorI2RlZmluZSBEUlZfTVNHX0JBRCAgICAgLTEKKyNkZWZpbmUgRFJWX0JPWF9CQUQgICAgIC0yCisjZGVmaW5lIERSVl9TVE9SRV9CQUQgICAtMworCitzdGF0aWMgaW50IFZlcmJvc2UsIFF1aWV0OworCitzdGF0aWMgdm9pZCBpbWFwX2luZm8oIGNvbnN0IGNoYXIgKiwgLi4uICk7CitzdGF0aWMgdm9pZCBpbWFwX3dhcm4oIGNvbnN0IGNoYXIgKiwgLi4uICk7CisKK3N0YXRpYyBjaGFyICpuZXh0X2FyZyggY2hhciAqKiApOworCitzdGF0aWMgdm9pZCBmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIG1lc3NhZ2VfdCAqICk7CisKK3N0YXRpYyBpbnQgbmZzbnByaW50ZiggY2hhciAqYnVmLCBpbnQgYmxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4gKTsKKworCitzdGF0aWMgdm9pZCBhcmM0X2luaXQoIHZvaWQgKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFyYzRfZ2V0Ynl0ZSggdm9pZCApOworCit0eXBlZGVmIHN0cnVjdCBpbWFwX3NlcnZlcl9jb25mIHsKKwljaGFyICpuYW1lOworCWNoYXIgKnR1bm5lbDsKKwljaGFyICpob3N0OworCWludCBwb3J0OworCWNoYXIgKnVzZXI7CisJY2hhciAqcGFzczsKK30gaW1hcF9zZXJ2ZXJfY29uZl90OworCit0eXBlZGVmIHN0cnVjdCBpbWFwX3N0b3JlX2NvbmYgeworCXN0b3JlX2NvbmZfdCBnZW47CisJaW1hcF9zZXJ2ZXJfY29uZl90ICpzZXJ2ZXI7CisJdW5zaWduZWQgdXNlX25hbWVzcGFjZToxOworfSBpbWFwX3N0b3JlX2NvbmZfdDsKKworI2RlZmluZSBOSUwJKHZvaWQqKTB4MQorI2RlZmluZSBMSVNUCSh2b2lkKikweDIKKwordHlwZWRlZiBzdHJ1Y3QgX2xpc3QgeworCXN0cnVjdCBfbGlzdCAqbmV4dCwgKmNoaWxkOworCWNoYXIgKnZhbDsKKwlpbnQgbGVuOworfSBsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZmQ7Cit9IFNvY2tldF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJU29ja2V0X3Qgc29jazsKKwlpbnQgYnl0ZXM7CisJaW50IG9mZnNldDsKKwljaGFyIGJ1ZlsxMDI0XTsKK30gYnVmZmVyX3Q7CisKK3N0cnVjdCBpbWFwX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcCB7CisJaW50IHVpZG5leHQ7IC8qIGZyb20gU0VMRUNUIHJlc3BvbnNlcyAqLworCWxpc3RfdCAqbnNfcGVyc29uYWwsICpuc19vdGhlciwgKm5zX3NoYXJlZDsgLyogTkFNRVNQQUNFIGluZm8gKi8KKwl1bnNpZ25lZCBjYXBzLCByY2FwczsgLyogQ0FQQUJJTElUWSByZXN1bHRzICovCisJLyogY29tbWFuZCBxdWV1ZSAqLworCWludCBuZXh0dGFnLCBudW1faW5fcHJvZ3Jlc3MsIGxpdGVyYWxfcGVuZGluZzsKKwlzdHJ1Y3QgaW1hcF9jbWQgKmluX3Byb2dyZXNzLCAqKmluX3Byb2dyZXNzX2FwcGVuZDsKKwlidWZmZXJfdCBidWY7IC8qIHRoaXMgaXMgQklHLCBzbyBwdXQgaXQgbGFzdCAqLworfSBpbWFwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGltYXBfc3RvcmUgeworCXN0b3JlX3QgZ2VuOworCWludCB1aWR2YWxpZGl0eTsKKwlpbWFwX3QgKmltYXA7CisJY29uc3QgY2hhciAqcHJlZml4OworCXVuc2lnbmVkIC8qY3VycmVudG5jOjEsKi8gdHJhc2huYzoxOworfSBpbWFwX3N0b3JlX3Q7CisKK3N0cnVjdCBpbWFwX2NtZF9jYiB7CisJaW50ICgqY29udCkoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWQgKmNtZCwgY29uc3QgY2hhciAqcHJvbXB0ICk7CisJdm9pZCAoKmRvbmUpKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICpjbWQsIGludCByZXNwb25zZSk7CisJdm9pZCAqY3R4OworCWNoYXIgKmRhdGE7CisJaW50IGRsZW47CisJaW50IHVpZDsKKwl1bnNpZ25lZCBjcmVhdGU6MSwgdHJ5Y3JlYXRlOjE7Cit9OworCitzdHJ1Y3QgaW1hcF9jbWQgeworCXN0cnVjdCBpbWFwX2NtZCAqbmV4dDsKKwlzdHJ1Y3QgaW1hcF9jbWRfY2IgY2I7CisJY2hhciAqY21kOworCWludCB0YWc7Cit9OworCisjZGVmaW5lIENBUChjYXApIChpbWFwLT5jYXBzICYgKDEgPDwgKGNhcCkpKQorCitlbnVtIENBUEFCSUxJVFkgeworCU5PTE9HSU4gPSAwLAorCVVJRFBMVVMsCisJTElURVJBTFBMVVMsCisJTkFNRVNQQUNFLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNhcF9saXN0W10gPSB7CisJIkxPR0lORElTQUJMRUQiLAorCSJVSURQTFVTIiwKKwkiTElURVJBTCsiLAorCSJOQU1FU1BBQ0UiLAorfTsKKworI2RlZmluZSBSRVNQX09LICAgIDAKKyNkZWZpbmUgUkVTUF9OTyAgICAxCisjZGVmaW5lIFJFU1BfQkFEICAgMgorCitzdGF0aWMgaW50IGdldF9jbWRfcmVzdWx0KCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICp0Y21kICk7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKkZsYWdzW10gPSB7CisJIkRyYWZ0IiwKKwkiRmxhZ2dlZCIsCisJIkFuc3dlcmVkIiwKKwkiU2VlbiIsCisJIkRlbGV0ZWQiLAorfTsKKworc3RhdGljIHZvaWQKK3NvY2tldF9wZXJyb3IoIGNvbnN0IGNoYXIgKmZ1bmMsIFNvY2tldF90ICpzb2NrLCBpbnQgcmV0ICkKK3sKKwlpZiAocmV0IDwgMCkKKwkJcGVycm9yKCBmdW5jICk7CisJZWxzZQorCQlmcHJpbnRmKCBzdGRlcnIsICIlczogdW5leHBlY3RlZCBFT0ZcbiIsIGZ1bmMgKTsKK30KKworc3RhdGljIGludAorc29ja2V0X3JlYWQoIFNvY2tldF90ICpzb2NrLCBjaGFyICpidWYsIGludCBsZW4gKQoreworCXNzaXplX3QgbiA9IHhyZWFkKCBzb2NrLT5mZCwgYnVmLCBsZW4gKTsKKwlpZiAobiA8PSAwKSB7CisJCXNvY2tldF9wZXJyb3IoICJyZWFkIiwgc29jaywgbiApOworCQljbG9zZSggc29jay0+ZmQgKTsKKwkJc29jay0+ZmQgPSAtMTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQKK3NvY2tldF93cml0ZSggU29ja2V0X3QgKnNvY2ssIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiApCit7CisJaW50IG4gPSB3cml0ZV9pbl9mdWxsKCBzb2NrLT5mZCwgYnVmLCBsZW4gKTsKKwlpZiAobiAhPSBsZW4pIHsKKwkJc29ja2V0X3BlcnJvciggIndyaXRlIiwgc29jaywgbiApOworCQljbG9zZSggc29jay0+ZmQgKTsKKwkJc29jay0+ZmQgPSAtMTsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qIHNpbXBsZSBsaW5lIGJ1ZmZlcmluZyAqLworc3RhdGljIGludAorYnVmZmVyX2dldHMoIGJ1ZmZlcl90ICogYiwgY2hhciAqKnMgKQoreworCWludCBuOworCWludCBzdGFydCA9IGItPm9mZnNldDsKKworCSpzID0gYi0+YnVmICsgc3RhcnQ7CisKKwlmb3IgKDs7KSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIFxyXG4gc2VxdWVuY2UgKi8KKwkJaWYgKGItPm9mZnNldCArIDEgPj0gYi0+Ynl0ZXMpIHsKKwkJCWlmIChzdGFydCkgeworCQkJCS8qIHNoaWZ0IGRvd24gdXNlZCBieXRlcyAqLworCQkJCSpzID0gYi0+YnVmOworCisJCQkJYXNzZXJ0KCBzdGFydCA8PSBiLT5ieXRlcyApOworCQkJCW4gPSBiLT5ieXRlcyAtIHN0YXJ0OworCisJCQkJaWYgKG4pCisJCQkJCW1lbW1vdmUoYi0+YnVmLCBiLT5idWYgKyBzdGFydCwgbik7CisJCQkJYi0+b2Zmc2V0IC09IHN0YXJ0OworCQkJCWItPmJ5dGVzID0gbjsKKwkJCQlzdGFydCA9IDA7CisJCQl9CisKKwkJCW4gPSBzb2NrZXRfcmVhZCggJmItPnNvY2ssIGItPmJ1ZiArIGItPmJ5dGVzLAorCQkJCQkgc2l6ZW9mKGItPmJ1ZikgLSBiLT5ieXRlcyApOworCisJCQlpZiAobiA8PSAwKQorCQkJCXJldHVybiAtMTsKKworCQkJYi0+Ynl0ZXMgKz0gbjsKKwkJfQorCisJCWlmIChiLT5idWZbYi0+b2Zmc2V0XSA9PSAnXHInKSB7CisJCQlhc3NlcnQoIGItPm9mZnNldCArIDEgPCBiLT5ieXRlcyApOworCQkJaWYgKGItPmJ1ZltiLT5vZmZzZXQgKyAxXSA9PSAnXG4nKSB7CisJCQkJYi0+YnVmW2ItPm9mZnNldF0gPSAwOyAgLyogdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJCQliLT5vZmZzZXQgKz0gMjsgLyogbmV4dCBsaW5lICovCisJCQkJaWYgKFZlcmJvc2UpCisJCQkJCXB1dHMoICpzICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQliLT5vZmZzZXQrKzsKKwl9CisJLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIHZvaWQKK2ltYXBfaW5mbyggY29uc3QgY2hhciAqbXNnLCAuLi4gKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoIVF1aWV0KSB7CisJCXZhX3N0YXJ0KCB2YSwgbXNnICk7CisJCXZwcmludGYoIG1zZywgdmEgKTsKKwkJdmFfZW5kKCB2YSApOworCQlmZmx1c2goIHN0ZG91dCApOworCX0KK30KKworc3RhdGljIHZvaWQKK2ltYXBfd2FybiggY29uc3QgY2hhciAqbXNnLCAuLi4gKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoUXVpZXQgPCAyKSB7CisJCXZhX3N0YXJ0KCB2YSwgbXNnICk7CisJCXZmcHJpbnRmKCBzdGRlcnIsIG1zZywgdmEgKTsKKwkJdmFfZW5kKCB2YSApOworCX0KK30KKworc3RhdGljIGNoYXIgKgorbmV4dF9hcmcoIGNoYXIgKipzICkKK3sKKwljaGFyICpyZXQ7CisKKwlpZiAoIXMgfHwgISpzKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAoaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpICoqcyApKQorCQkoKnMpKys7CisJaWYgKCEqKnMpIHsKKwkJKnMgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCoqcyA9PSAnIicpIHsKKwkJKysqczsKKwkJcmV0ID0gKnM7CisJCSpzID0gc3RyY2hyKCAqcywgJyInICk7CisJfSBlbHNlIHsKKwkJcmV0ID0gKnM7CisJCXdoaWxlICgqKnMgJiYgIWlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSAqKnMgKSkKKwkJCSgqcykrKzsKKwl9CisJaWYgKCpzKSB7CisJCWlmICgqKnMpCisJCQkqKCpzKSsrID0gMDsKKwkJaWYgKCEqKnMpCisJCQkqcyA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIG1lc3NhZ2VfdCAqbXNncyApCit7CisJbWVzc2FnZV90ICp0bXNnOworCisJZm9yICg7IG1zZ3M7IG1zZ3MgPSB0bXNnKSB7CisJCXRtc2cgPSBtc2dzLT5uZXh0OworCQlmcmVlKCBtc2dzICk7CisJfQorfQorCitzdGF0aWMgaW50CituZnNucHJpbnRmKCBjaGFyICpidWYsIGludCBibGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLiApCit7CisJaW50IHJldDsKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQoIHZhLCBmbXQgKTsKKwlpZiAoYmxlbiA8PSAwIHx8ICh1bnNpZ25lZCkocmV0ID0gdnNucHJpbnRmKCBidWYsIGJsZW4sIGZtdCwgdmEgKSkgPj0gKHVuc2lnbmVkKWJsZW4pCisJCWRpZSggIkZhdGFsOiBidWZmZXIgdG9vIHNtYWxsLiBQbGVhc2UgcmVwb3J0IGEgYnVnLlxuIik7CisJdmFfZW5kKCB2YSApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgaSwgaiwgc1syNTZdOworfSByczsKKworc3RhdGljIHZvaWQKK2FyYzRfaW5pdCggdm9pZCApCit7CisJaW50IGksIGZkOworCXVuc2lnbmVkIGNoYXIgaiwgc2ksIGRhdFsxMjhdOworCisJaWYgKChmZCA9IG9wZW4oICIvZGV2L3VyYW5kb20iLCBPX1JET05MWSApKSA8IDAgJiYgKGZkID0gb3BlbiggIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkgKSkgPCAwKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIkZhdGFsOiBubyByYW5kb20gbnVtYmVyIHNvdXJjZSBhdmFpbGFibGUuXG4iICk7CisJCWV4aXQoIDMgKTsKKwl9CisJaWYgKHJlYWRfaW5fZnVsbCggZmQsIGRhdCwgMTI4ICkgIT0gMTI4KSB7CisJCWZwcmludGYoIHN0ZGVyciwgIkZhdGFsOiBjYW5ub3QgcmVhZCByYW5kb20gbnVtYmVyIHNvdXJjZS5cbiIgKTsKKwkJZXhpdCggMyApOworCX0KKwljbG9zZSggZmQgKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJcnMuc1tpXSA9IGk7CisJZm9yIChpID0gaiA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzaSA9IHJzLnNbaV07CisJCWogKz0gc2kgKyBkYXRbaSAmIDEyN107CisJCXJzLnNbaV0gPSBycy5zW2pdOworCQlycy5zW2pdID0gc2k7CisJfQorCXJzLmkgPSBycy5qID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJYXJjNF9nZXRieXRlKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCithcmM0X2dldGJ5dGUoIHZvaWQgKQoreworCXVuc2lnbmVkIGNoYXIgc2ksIHNqOworCisJcnMuaSsrOworCXNpID0gcnMuc1tycy5pXTsKKwlycy5qICs9IHNpOworCXNqID0gcnMuc1tycy5qXTsKKwlycy5zW3JzLmldID0gc2o7CisJcnMuc1tycy5qXSA9IHNpOworCXJldHVybiBycy5zWyhzaSArIHNqKSAmIDB4ZmZdOworfQorCitzdGF0aWMgc3RydWN0IGltYXBfY21kICoKK3ZfaXNzdWVfaW1hcF9jbWQoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWRfY2IgKmNiLAorCQkgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCApCit7CisJaW1hcF90ICppbWFwID0gY3R4LT5pbWFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kOworCWludCBuLCBidWZsOworCWNoYXIgYnVmWzEwMjRdOworCisJY21kID0geG1hbGxvYyggc2l6ZW9mKHN0cnVjdCBpbWFwX2NtZCkgKTsKKwluZnZhc3ByaW50ZiggJmNtZC0+Y21kLCBmbXQsIGFwICk7CisJY21kLT50YWcgPSArK2ltYXAtPm5leHR0YWc7CisKKwlpZiAoY2IpCisJCWNtZC0+Y2IgPSAqY2I7CisJZWxzZQorCQltZW1zZXQoICZjbWQtPmNiLCAwLCBzaXplb2YoY21kLT5jYikgKTsKKworCXdoaWxlIChpbWFwLT5saXRlcmFsX3BlbmRpbmcpCisJCWdldF9jbWRfcmVzdWx0KCBjdHgsIE5VTEwgKTsKKworCWJ1ZmwgPSBuZnNucHJpbnRmKCBidWYsIHNpemVvZihidWYpLCBjbWQtPmNiLmRhdGEgPyBDQVAoTElURVJBTFBMVVMpID8KKwkJCSAgICIlZCAlc3slZCt9XHJcbiIgOiAiJWQgJXN7JWR9XHJcbiIgOiAiJWQgJXNcclxuIiwKKwkJCSAgIGNtZC0+dGFnLCBjbWQtPmNtZCwgY21kLT5jYi5kbGVuICk7CisJaWYgKFZlcmJvc2UpIHsKKwkJaWYgKGltYXAtPm51bV9pbl9wcm9ncmVzcykKKwkJCXByaW50ZiggIiglZCBpbiBwcm9ncmVzcykgIiwgaW1hcC0+bnVtX2luX3Byb2dyZXNzICk7CisJCWlmIChtZW1jbXAoIGNtZC0+Y21kLCAiTE9HSU4iLCA1ICkpCisJCQlwcmludGYoICI+Pj4gJXMiLCBidWYgKTsKKwkJZWxzZQorCQkJcHJpbnRmKCAiPj4+ICVkIExPR0lOIDx1c2VyPiA8cGFzcz5cbiIsIGNtZC0+dGFnICk7CisJfQorCWlmIChzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgYnVmLCBidWZsICkgIT0gYnVmbCkgeworCQlmcmVlKCBjbWQtPmNtZCApOworCQlmcmVlKCBjbWQgKTsKKwkJaWYgKGNiICYmIGNiLT5kYXRhKQorCQkJZnJlZSggY2ItPmRhdGEgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChjbWQtPmNiLmRhdGEpIHsKKwkJaWYgKENBUChMSVRFUkFMUExVUykpIHsKKwkJCW4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgY21kLT5jYi5kYXRhLCBjbWQtPmNiLmRsZW4gKTsKKwkJCWZyZWUoIGNtZC0+Y2IuZGF0YSApOworCQkJaWYgKG4gIT0gY21kLT5jYi5kbGVuIHx8CisJCQkgICAgKG4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgIlxyXG4iLCAyICkpICE9IDIpCisJCQl7CisJCQkJZnJlZSggY21kLT5jbWQgKTsKKwkJCQlmcmVlKCBjbWQgKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWNtZC0+Y2IuZGF0YSA9IE5VTEw7CisJCX0gZWxzZQorCQkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMTsKKwl9IGVsc2UgaWYgKGNtZC0+Y2IuY29udCkKKwkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMTsKKwljbWQtPm5leHQgPSBOVUxMOworCSppbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSBjbWQ7CisJaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gJmNtZC0+bmV4dDsKKwlpbWFwLT5udW1faW5fcHJvZ3Jlc3MrKzsKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgc3RydWN0IGltYXBfY21kICoKK2lzc3VlX2ltYXBfY21kKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXN0cnVjdCBpbWFwX2NtZCAqcmV0OworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydCggYXAsIGZtdCApOworCXJldCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraW1hcF9leGVjKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXZhX2xpc3QgYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwljbWRwID0gdl9pc3N1ZV9pbWFwX2NtZCggY3R4LCBjYiwgZm10LCBhcCApOworCXZhX2VuZCggYXAgKTsKKwlpZiAoIWNtZHApCisJCXJldHVybiBSRVNQX0JBRDsKKworCXJldHVybiBnZXRfY21kX3Jlc3VsdCggY3R4LCBjbWRwICk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfZXhlY19tKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXZhX2xpc3QgYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwljbWRwID0gdl9pc3N1ZV9pbWFwX2NtZCggY3R4LCBjYiwgZm10LCBhcCApOworCXZhX2VuZCggYXAgKTsKKwlpZiAoIWNtZHApCisJCXJldHVybiBEUlZfU1RPUkVfQkFEOworCisJc3dpdGNoIChnZXRfY21kX3Jlc3VsdCggY3R4LCBjbWRwICkpIHsKKwljYXNlIFJFU1BfQkFEOiByZXR1cm4gRFJWX1NUT1JFX0JBRDsKKwljYXNlIFJFU1BfTk86IHJldHVybiBEUlZfTVNHX0JBRDsKKwlkZWZhdWx0OiByZXR1cm4gRFJWX09LOworCX0KK30KKworc3RhdGljIGludAoraXNfYXRvbSggbGlzdF90ICpsaXN0ICkKK3sKKwlyZXR1cm4gbGlzdCAmJiBsaXN0LT52YWwgJiYgbGlzdC0+dmFsICE9IE5JTCAmJiBsaXN0LT52YWwgIT0gTElTVDsKK30KKworc3RhdGljIGludAoraXNfbGlzdCggbGlzdF90ICpsaXN0ICkKK3sKKwlyZXR1cm4gbGlzdCAmJiBsaXN0LT52YWwgPT0gTElTVDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfbGlzdCggbGlzdF90ICpsaXN0ICkKK3sKKwlsaXN0X3QgKnRtcDsKKworCWZvciAoOyBsaXN0OyBsaXN0ID0gdG1wKSB7CisJCXRtcCA9IGxpc3QtPm5leHQ7CisJCWlmIChpc19saXN0KCBsaXN0ICkpCisJCQlmcmVlX2xpc3QoIGxpc3QtPmNoaWxkICk7CisJCWVsc2UgaWYgKGlzX2F0b20oIGxpc3QgKSkKKwkJCWZyZWUoIGxpc3QtPnZhbCApOworCQlmcmVlKCBsaXN0ICk7CisJfQorfQorCitzdGF0aWMgaW50CitwYXJzZV9pbWFwX2xpc3RfbCggaW1hcF90ICppbWFwLCBjaGFyICoqc3AsIGxpc3RfdCAqKmN1cnAsIGludCBsZXZlbCApCit7CisJbGlzdF90ICpjdXI7CisJY2hhciAqcyA9ICpzcCwgKnA7CisJaW50IG4sIGJ5dGVzOworCisJZm9yICg7OykgeworCQl3aGlsZSAoaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpKnMgKSkKKwkJCXMrKzsKKwkJaWYgKGxldmVsICYmICpzID09ICcpJykgeworCQkJcysrOworCQkJYnJlYWs7CisJCX0KKwkJKmN1cnAgPSBjdXIgPSB4bWFsbG9jKCBzaXplb2YoKmN1cikgKTsKKwkJY3VycCA9ICZjdXItPm5leHQ7CisJCWN1ci0+dmFsID0gTlVMTDsgLyogZm9yIGNsZWFuIGJhaWwgKi8KKwkJaWYgKCpzID09ICcoJykgeworCQkJLyogc3VibGlzdCAqLworCQkJcysrOworCQkJY3VyLT52YWwgPSBMSVNUOworCQkJaWYgKHBhcnNlX2ltYXBfbGlzdF9sKCBpbWFwLCAmcywgJmN1ci0+Y2hpbGQsIGxldmVsICsgMSApKQorCQkJCWdvdG8gYmFpbDsKKwkJfSBlbHNlIGlmIChpbWFwICYmICpzID09ICd7JykgeworCQkJLyogbGl0ZXJhbCAqLworCQkJYnl0ZXMgPSBjdXItPmxlbiA9IHN0cnRvbCggcyArIDEsICZzLCAxMCApOworCQkJaWYgKCpzICE9ICd9JykKKwkJCQlnb3RvIGJhaWw7CisKKwkJCXMgPSBjdXItPnZhbCA9IHhtYWxsb2MoIGN1ci0+bGVuICk7CisKKwkJCS8qIGR1bXAgd2hhdHMgbGVmdCBvdmVyIGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKwkJCW4gPSBpbWFwLT5idWYuYnl0ZXMgLSBpbWFwLT5idWYub2Zmc2V0OworCisJCQlpZiAobiA+IGJ5dGVzKQorCQkJCS8qIHRoZSBlbnRpcmUgbWVzc2FnZSBmaXQgaW4gdGhlIGJ1ZmZlciAqLworCQkJCW4gPSBieXRlczsKKworCQkJbWVtY3B5KCBzLCBpbWFwLT5idWYuYnVmICsgaW1hcC0+YnVmLm9mZnNldCwgbiApOworCQkJcyArPSBuOworCQkJYnl0ZXMgLT0gbjsKKworCQkJLyogbWFyayB0aGF0IHdlIHVzZWQgcGFydCBvZiB0aGUgYnVmZmVyICovCisJCQlpbWFwLT5idWYub2Zmc2V0ICs9IG47CisKKwkJCS8qIG5vdyByZWFkIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlICovCisJCQl3aGlsZSAoYnl0ZXMgPiAwKSB7CisJCQkJaWYgKChuID0gc29ja2V0X3JlYWQgKCZpbWFwLT5idWYuc29jaywgcywgYnl0ZXMpKSA8PSAwKQorCQkJCQlnb3RvIGJhaWw7CisJCQkJcyArPSBuOworCQkJCWJ5dGVzIC09IG47CisJCQl9CisKKwkJCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJnMgKSkKKwkJCQlnb3RvIGJhaWw7CisJCX0gZWxzZSBpZiAoKnMgPT0gJyInKSB7CisJCQkvKiBxdW90ZWQgc3RyaW5nICovCisJCQlzKys7CisJCQlwID0gczsKKwkJCWZvciAoOyAqcyAhPSAnIic7IHMrKykKKwkJCQlpZiAoISpzKQorCQkJCQlnb3RvIGJhaWw7CisJCQljdXItPmxlbiA9IHMgLSBwOworCQkJcysrOworCQkJY3VyLT52YWwgPSB4bWFsbG9jKCBjdXItPmxlbiArIDEgKTsKKwkJCW1lbWNweSggY3VyLT52YWwsIHAsIGN1ci0+bGVuICk7CisJCQljdXItPnZhbFtjdXItPmxlbl0gPSAwOworCQl9IGVsc2UgeworCQkJLyogYXRvbSAqLworCQkJcCA9IHM7CisJCQlmb3IgKDsgKnMgJiYgIWlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSpzICk7IHMrKykKKwkJCQlpZiAobGV2ZWwgJiYgKnMgPT0gJyknKQorCQkJCQlicmVhazsKKwkJCWN1ci0+bGVuID0gcyAtIHA7CisJCQlpZiAoY3VyLT5sZW4gPT0gMyAmJiAhbWVtY21wICgiTklMIiwgcCwgMykpCisJCQkJY3VyLT52YWwgPSBOSUw7CisJCQllbHNlIHsKKwkJCQljdXItPnZhbCA9IHhtYWxsb2MoIGN1ci0+bGVuICsgMSApOworCQkJCW1lbWNweSggY3VyLT52YWwsIHAsIGN1ci0+bGVuICk7CisJCQkJY3VyLT52YWxbY3VyLT5sZW5dID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICghbGV2ZWwpCisJCQlicmVhazsKKwkJaWYgKCEqcykKKwkJCWdvdG8gYmFpbDsKKwl9CisJKnNwID0gczsKKwkqY3VycCA9IE5VTEw7CisJcmV0dXJuIDA7CisKKyAgYmFpbDoKKwkqY3VycCA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgbGlzdF90ICoKK3BhcnNlX2ltYXBfbGlzdCggaW1hcF90ICppbWFwLCBjaGFyICoqc3AgKQoreworCWxpc3RfdCAqaGVhZDsKKworCWlmICghcGFyc2VfaW1hcF9saXN0X2woIGltYXAsIHNwLCAmaGVhZCwgMCApKQorCQlyZXR1cm4gaGVhZDsKKwlmcmVlX2xpc3QoIGhlYWQgKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGxpc3RfdCAqCitwYXJzZV9saXN0KCBjaGFyICoqc3AgKQoreworCXJldHVybiBwYXJzZV9pbWFwX2xpc3QoIE5VTEwsIHNwICk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9jYXBhYmlsaXR5KCBpbWFwX3QgKmltYXAsIGNoYXIgKmNtZCApCit7CisJY2hhciAqYXJnOworCXVuc2lnbmVkIGk7CisKKwlpbWFwLT5jYXBzID0gMHg4MDAwMDAwMDsKKwl3aGlsZSAoKGFyZyA9IG5leHRfYXJnKCAmY21kICkpKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYXBfbGlzdCk7IGkrKykKKwkJCWlmICghc3RyY21wKCBjYXBfbGlzdFtpXSwgYXJnICkpCisJCQkJaW1hcC0+Y2FwcyB8PSAxIDw8IGk7CisJaW1hcC0+cmNhcHMgPSBpbWFwLT5jYXBzOworfQorCitzdGF0aWMgaW50CitwYXJzZV9yZXNwb25zZV9jb2RlKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY2hhciAqcyApCit7CisJaW1hcF90ICppbWFwID0gY3R4LT5pbWFwOworCWNoYXIgKmFyZywgKnA7CisKKwlpZiAoKnMgIT0gJ1snKQorCQlyZXR1cm4gUkVTUF9PSzsJCS8qIG5vIHJlc3BvbnNlIGNvZGUgKi8KKwlzKys7CisJaWYgKCEocCA9IHN0cmNociggcywgJ10nICkpKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCByZXNwb25zZSBjb2RlXG4iICk7CisJCXJldHVybiBSRVNQX0JBRDsKKwl9CisJKnArKyA9IDA7CisJYXJnID0gbmV4dF9hcmcoICZzICk7CisJaWYgKCFzdHJjbXAoICJVSURWQUxJRElUWSIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGN0eC0+Z2VuLnVpZHZhbGlkaXR5ID0gYXRvaSggYXJnICkpKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBtYWxmb3JtZWQgVUlEVkFMSURJVFkgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJVSURORVhUIiwgYXJnICkpIHsKKwkJaWYgKCEoYXJnID0gbmV4dF9hcmcoICZzICkpIHx8ICEoaW1hcC0+dWlkbmV4dCA9IGF0b2koIGFyZyApKSkgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIE5FWFRVSUQgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJDQVBBQklMSVRZIiwgYXJnICkpIHsKKwkJcGFyc2VfY2FwYWJpbGl0eSggaW1hcCwgcyApOworCX0gZWxzZSBpZiAoIXN0cmNtcCggIkFMRVJUIiwgYXJnICkpIHsKKwkJLyogUkZDMjA2MCBzYXlzIHRoYXQgdGhlc2UgbWVzc2FnZXMgTVVTVCBiZSBkaXNwbGF5ZWQKKwkJICogdG8gdGhlIHVzZXIKKwkJICovCisJCWZvciAoOyBpc3NwYWNlKCAodW5zaWduZWQgY2hhcikqcCApOyBwKyspOworCQlmcHJpbnRmKCBzdGRlcnIsICIqKiogSU1BUCBBTEVSVCAqKiogJXNcbiIsIHAgKTsKKwl9IGVsc2UgaWYgKGNiICYmIGNiLT5jdHggJiYgIXN0cmNtcCggIkFQUEVORFVJRCIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGN0eC0+Z2VuLnVpZHZhbGlkaXR5ID0gYXRvaSggYXJnICkpIHx8CisJCSAgICAhKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKCooaW50ICopY2ItPmN0eCA9IGF0b2koIGFyZyApKSkKKwkJeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIEFQUEVORFVJRCBzdGF0dXNcbiIgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJfQorCX0KKwlyZXR1cm4gUkVTUF9PSzsKK30KKworc3RhdGljIGludAorZ2V0X2NtZF9yZXN1bHQoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWQgKnRjbWQgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwlzdHJ1Y3QgaW1hcF9jbWQgKmNtZHAsICoqcGNtZHAsICpuY21kcDsKKwljaGFyICpjbWQsICphcmcsICphcmcxLCAqcDsKKwlpbnQgbiwgcmVzcCwgcmVzcDIsIHRhZzsKKworCWZvciAoOzspIHsKKwkJaWYgKGJ1ZmZlcl9nZXRzKCAmaW1hcC0+YnVmLCAmY21kICkpCisJCQlyZXR1cm4gUkVTUF9CQUQ7CisKKwkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJaWYgKCphcmcgPT0gJyonKSB7CisJCQlhcmcgPSBuZXh0X2FyZyggJmNtZCApOworCQkJaWYgKCFhcmcpIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmFibGUgdG8gcGFyc2UgdW50YWdnZWQgcmVzcG9uc2VcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisKKwkJCWlmICghc3RyY21wKCAiTkFNRVNQQUNFIiwgYXJnICkpIHsKKwkJCQlpbWFwLT5uc19wZXJzb25hbCA9IHBhcnNlX2xpc3QoICZjbWQgKTsKKwkJCQlpbWFwLT5uc19vdGhlciA9IHBhcnNlX2xpc3QoICZjbWQgKTsKKwkJCQlpbWFwLT5uc19zaGFyZWQgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoICJPSyIsIGFyZyApIHx8ICFzdHJjbXAoICJCQUQiLCBhcmcgKSB8fAorCQkJCSAgICFzdHJjbXAoICJOTyIsIGFyZyApIHx8ICFzdHJjbXAoICJCWUUiLCBhcmcgKSkgeworCQkJCWlmICgocmVzcCA9IHBhcnNlX3Jlc3BvbnNlX2NvZGUoIGN0eCwgTlVMTCwgY21kICkpICE9IFJFU1BfT0spCisJCQkJCXJldHVybiByZXNwOworCQkJfSBlbHNlIGlmICghc3RyY21wKCAiQ0FQQUJJTElUWSIsIGFyZyApKQorCQkJCXBhcnNlX2NhcGFiaWxpdHkoIGltYXAsIGNtZCApOworCQkJZWxzZSBpZiAoKGFyZzEgPSBuZXh0X2FyZyggJmNtZCApKSkgeworCQkJCWlmICghc3RyY21wKCAiRVhJU1RTIiwgYXJnMSApKQorCQkJCQljdHgtPmdlbi5jb3VudCA9IGF0b2koIGFyZyApOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoICJSRUNFTlQiLCBhcmcxICkpCisJCQkJCWN0eC0+Z2VuLnJlY2VudCA9IGF0b2koIGFyZyApOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmFibGUgdG8gcGFyc2UgdW50YWdnZWQgcmVzcG9uc2VcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIWltYXAtPmluX3Byb2dyZXNzKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmV4cGVjdGVkIHJlcGx5OiAlcyAlc1xuIiwgYXJnLCBjbWQgPyBjbWQgOiAiIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9IGVsc2UgaWYgKCphcmcgPT0gJysnKSB7CisJCQkvKiBUaGlzIGNhbiBoYXBwZW4gb25seSB3aXRoIHRoZSBsYXN0IGNvbW1hbmQgdW5kZXJ3YXksIGFzCisJCQkgICBpdCBlbmZvcmNlcyBhIHJvdW5kLXRyaXAuICovCisJCQljbWRwID0gKHN0cnVjdCBpbWFwX2NtZCAqKSgoY2hhciAqKWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCAtCisJCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGltYXBfY21kLCBuZXh0KSk7CisJCQlpZiAoY21kcC0+Y2IuZGF0YSkgeworCQkJCW4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgY21kcC0+Y2IuZGF0YSwgY21kcC0+Y2IuZGxlbiApOworCQkJCWZyZWUoIGNtZHAtPmNiLmRhdGEgKTsKKwkJCQljbWRwLT5jYi5kYXRhID0gTlVMTDsKKwkJCQlpZiAobiAhPSAoaW50KWNtZHAtPmNiLmRsZW4pCisJCQkJCXJldHVybiBSRVNQX0JBRDsKKwkJCX0gZWxzZSBpZiAoY21kcC0+Y2IuY29udCkgeworCQkJCWlmIChjbWRwLT5jYi5jb250KCBjdHgsIGNtZHAsIGNtZCApKQorCQkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVuZXhwZWN0ZWQgY29tbWFuZCBjb250aW51YXRpb24gcmVxdWVzdFxuIiApOworCQkJCXJldHVybiBSRVNQX0JBRDsKKwkJCX0KKwkJCWlmIChzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgIlxyXG4iLCAyICkgIT0gMikKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQlpZiAoIWNtZHAtPmNiLmNvbnQpCisJCQkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMDsKKwkJCWlmICghdGNtZCkKKwkJCQlyZXR1cm4gRFJWX09LOworCQl9IGVsc2UgeworCQkJdGFnID0gYXRvaSggYXJnICk7CisJCQlmb3IgKHBjbWRwID0gJmltYXAtPmluX3Byb2dyZXNzOyAoY21kcCA9ICpwY21kcCk7IHBjbWRwID0gJmNtZHAtPm5leHQpCisJCQkJaWYgKGNtZHAtPnRhZyA9PSB0YWcpCisJCQkJCWdvdG8gZ290dGFnOworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5leHBlY3RlZCB0YWcgJXNcbiIsIGFyZyApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQkgIGdvdHRhZzoKKwkJCWlmICghKCpwY21kcCA9IGNtZHAtPm5leHQpKQorCQkJCWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCA9IHBjbWRwOworCQkJaW1hcC0+bnVtX2luX3Byb2dyZXNzLS07CisJCQlpZiAoY21kcC0+Y2IuY29udCB8fCBjbWRwLT5jYi5kYXRhKQorCQkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDA7CisJCQlhcmcgPSBuZXh0X2FyZyggJmNtZCApOworCQkJaWYgKCFzdHJjbXAoICJPSyIsIGFyZyApKQorCQkJCXJlc3AgPSBEUlZfT0s7CisJCQllbHNlIHsKKwkJCQlpZiAoIXN0cmNtcCggIk5PIiwgYXJnICkpIHsKKwkJCQkJaWYgKGNtZHAtPmNiLmNyZWF0ZSAmJiBjbWQgJiYgKGNtZHAtPmNiLnRyeWNyZWF0ZSB8fCAhbWVtY21wKCBjbWQsICJbVFJZQ1JFQVRFXSIsIDExICkpKSB7IC8qIFNFTEVDVCwgQVBQRU5EIG9yIFVJRCBDT1BZICovCisJCQkJCQlwID0gc3RyY2hyKCBjbWRwLT5jbWQsICciJyApOworCQkJCQkJaWYgKCFpc3N1ZV9pbWFwX2NtZCggY3R4LCBOVUxMLCAiQ1JFQVRFIFwiJS4qc1wiIiwgc3RyY2hyKCBwICsgMSwgJyInICkgLSBwICsgMSwgcCApKSB7CisJCQkJCQkJcmVzcCA9IFJFU1BfQkFEOworCQkJCQkJCWdvdG8gbm9ybWFsOworCQkJCQkJfQorCQkJCQkJLyogbm90IHdhaXRpbmcgaGVyZSB2aW9sYXRlcyB0aGUgc3BlYywgYnV0IGEgc2VydmVyIHRoYXQgZG9lcyBub3QKKwkJCQkJCSAgIGdyb2sgdGhpcyBub25ldGhlbGVzcyB2aW9sYXRlcyBpdCB0b28uICovCisJCQkJCQljbWRwLT5jYi5jcmVhdGUgPSAwOworCQkJCQkJaWYgKCEobmNtZHAgPSBpc3N1ZV9pbWFwX2NtZCggY3R4LCAmY21kcC0+Y2IsICIlcyIsIGNtZHAtPmNtZCApKSkgeworCQkJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQkJCQlnb3RvIG5vcm1hbDsKKwkJCQkJCX0KKwkJCQkJCWZyZWUoIGNtZHAtPmNtZCApOworCQkJCQkJZnJlZSggY21kcCApOworCQkJCQkJaWYgKCF0Y21kKQorCQkJCQkJCXJldHVybiAwOwkvKiBpZ25vcmVkICovCisJCQkJCQlpZiAoY21kcCA9PSB0Y21kKQorCQkJCQkJCXRjbWQgPSBuY21kcDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXJlc3AgPSBSRVNQX05POworCQkJCX0gZWxzZSAvKmlmICghc3RyY21wKCAiQkFEIiwgYXJnICkpKi8KKwkJCQkJcmVzcCA9IFJFU1BfQkFEOworCQkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgY29tbWFuZCAnJXMnIHJldHVybmVkIHJlc3BvbnNlICglcykgLSAlc1xuIiwKKwkJCQkJIG1lbWNtcCAoY21kcC0+Y21kLCAiTE9HSU4iLCA1KSA/CisJCQkJCQkJY21kcC0+Y21kIDogIkxPR0lOIDx1c2VyPiA8cGFzcz4iLAorCQkJCQkJCWFyZywgY21kID8gY21kIDogIiIpOworCQkJfQorCQkJaWYgKChyZXNwMiA9IHBhcnNlX3Jlc3BvbnNlX2NvZGUoIGN0eCwgJmNtZHAtPmNiLCBjbWQgKSkgPiByZXNwKQorCQkJCXJlc3AgPSByZXNwMjsKKwkJICBub3JtYWw6CisJCQlpZiAoY21kcC0+Y2IuZG9uZSkKKwkJCQljbWRwLT5jYi5kb25lKCBjdHgsIGNtZHAsIHJlc3AgKTsKKwkJCWlmIChjbWRwLT5jYi5kYXRhKQorCQkJCWZyZWUoIGNtZHAtPmNiLmRhdGEgKTsKKwkJCWZyZWUoIGNtZHAtPmNtZCApOworCQkJZnJlZSggY21kcCApOworCQkJaWYgKCF0Y21kIHx8IHRjbWQgPT0gY21kcCkKKwkJCQlyZXR1cm4gcmVzcDsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgdm9pZAoraW1hcF9jbG9zZV9zZXJ2ZXIoIGltYXBfc3RvcmVfdCAqaWN0eCApCit7CisJaW1hcF90ICppbWFwID0gaWN0eC0+aW1hcDsKKworCWlmIChpbWFwLT5idWYuc29jay5mZCAhPSAtMSkgeworCQlpbWFwX2V4ZWMoIGljdHgsIE5VTEwsICJMT0dPVVQiICk7CisJCWNsb3NlKCBpbWFwLT5idWYuc29jay5mZCApOworCX0KKwlmcmVlX2xpc3QoIGltYXAtPm5zX3BlcnNvbmFsICk7CisJZnJlZV9saXN0KCBpbWFwLT5uc19vdGhlciApOworCWZyZWVfbGlzdCggaW1hcC0+bnNfc2hhcmVkICk7CisJZnJlZSggaW1hcCApOworfQorCitzdGF0aWMgdm9pZAoraW1hcF9jbG9zZV9zdG9yZSggc3RvcmVfdCAqY3R4ICkKK3sKKwlpbWFwX2Nsb3NlX3NlcnZlciggKGltYXBfc3RvcmVfdCAqKWN0eCApOworCWZyZWVfZ2VuZXJpY19tZXNzYWdlcyggY3R4LT5tc2dzICk7CisJZnJlZSggY3R4ICk7Cit9CisKK3N0YXRpYyBzdG9yZV90ICoKK2ltYXBfb3Blbl9zdG9yZSggaW1hcF9zZXJ2ZXJfY29uZl90ICpzcnZjICkKK3sKKwlpbWFwX3N0b3JlX3QgKmN0eDsKKwlpbWFwX3QgKmltYXA7CisJY2hhciAqYXJnLCAqcnNwOworCXN0cnVjdCBob3N0ZW50ICpoZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcywgYVsyXSwgcHJlYXV0aDsKKwlwaWRfdCBwaWQ7CisKKwljdHggPSB4Y2FsbG9jKCBzaXplb2YoKmN0eCksIDEgKTsKKworCWN0eC0+aW1hcCA9IGltYXAgPSB4Y2FsbG9jKCBzaXplb2YoKmltYXApLCAxICk7CisJaW1hcC0+YnVmLnNvY2suZmQgPSAtMTsKKwlpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSAmaW1hcC0+aW5fcHJvZ3Jlc3M7CisKKwkvKiBvcGVuIGNvbm5lY3Rpb24gdG8gSU1BUCBzZXJ2ZXIgKi8KKworCWlmIChzcnZjLT50dW5uZWwpIHsKKwkJaW1hcF9pbmZvKCAiU3RhcnRpbmcgdHVubmVsICclcycuLi4gIiwgc3J2Yy0+dHVubmVsICk7CisKKwkJaWYgKHNvY2tldHBhaXIoIFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBhICkpIHsKKwkJCXBlcnJvciggInNvY2tldHBhaXIiICk7CisJCQlleGl0KCAxICk7CisJCX0KKworCQlwaWQgPSBmb3JrKCk7CisJCWlmIChwaWQgPCAwKQorCQkJX2V4aXQoIDEyNyApOworCQlpZiAoIXBpZCkgeworCQkJaWYgKGR1cDIoIGFbMF0sIDAgKSA9PSAtMSB8fCBkdXAyKCBhWzBdLCAxICkgPT0gLTEpCisJCQkJX2V4aXQoIDEyNyApOworCQkJY2xvc2UoIGFbMF0gKTsKKwkJCWNsb3NlKCBhWzFdICk7CisJCQlleGVjbCggIi9iaW4vc2giLCAic2giLCAiLWMiLCBzcnZjLT50dW5uZWwsIE5VTEwgKTsKKwkJCV9leGl0KCAxMjcgKTsKKwkJfQorCisJCWNsb3NlIChhWzBdKTsKKworCQlpbWFwLT5idWYuc29jay5mZCA9IGFbMV07CisKKwkJaW1hcF9pbmZvKCAib2tcbiIgKTsKKwl9IGVsc2UgeworCQltZW1zZXQoICZhZGRyLCAwLCBzaXplb2YoYWRkcikgKTsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKCBzcnZjLT5wb3J0ICk7CisJCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwkJaW1hcF9pbmZvKCAiUmVzb2x2aW5nICVzLi4uICIsIHNydmMtPmhvc3QgKTsKKwkJaGUgPSBnZXRob3N0YnluYW1lKCBzcnZjLT5ob3N0ICk7CisJCWlmICghaGUpIHsKKwkJCXBlcnJvciggImdldGhvc3RieW5hbWUiICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaW1hcF9pbmZvKCAib2tcbiIgKTsKKworCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooKGludCAqKSBoZS0+aF9hZGRyX2xpc3RbMF0pOworCisJCXMgPSBzb2NrZXQoIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwICk7CisKKwkJaW1hcF9pbmZvKCAiQ29ubmVjdGluZyB0byAlczolaHUuLi4gIiwgaW5ldF9udG9hKCBhZGRyLnNpbl9hZGRyICksIG50b2hzKCBhZGRyLnNpbl9wb3J0ICkgKTsKKwkJaWYgKGNvbm5lY3QoIHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpICkpIHsKKwkJCWNsb3NlKCBzICk7CisJCQlwZXJyb3IoICJjb25uZWN0IiApOworCQkJZ290byBiYWlsOworCQl9CisJCWltYXBfaW5mbyggIm9rXG4iICk7CisKKwkJaW1hcC0+YnVmLnNvY2suZmQgPSBzOworCisJfQorCisJLyogcmVhZCB0aGUgZ3JlZXRpbmcgc3RyaW5nICovCisJaWYgKGJ1ZmZlcl9nZXRzKCAmaW1hcC0+YnVmLCAmcnNwICkpIHsKKwkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbm8gZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlhcmcgPSBuZXh0X2FyZyggJnJzcCApOworCWlmICghYXJnIHx8ICphcmcgIT0gJyonIHx8IChhcmcgPSBuZXh0X2FyZyggJnJzcCApKSA9PSBOVUxMKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IGludmFsaWQgZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlwcmVhdXRoID0gMDsKKwlpZiAoIXN0cmNtcCggIlBSRUFVVEgiLCBhcmcgKSkKKwkJcHJlYXV0aCA9IDE7CisJZWxzZSBpZiAoc3RyY21wKCAiT0siLCBhcmcgKSAhPSAwKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVua25vd24gZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsIE5VTEwsIHJzcCApOworCWlmICghaW1hcC0+Y2FwcyAmJiBpbWFwX2V4ZWMoIGN0eCwgTlVMTCwgIkNBUEFCSUxJVFkiICkgIT0gUkVTUF9PSykKKwkJZ290byBiYWlsOworCisJaWYgKCFwcmVhdXRoKSB7CisKKwkJaW1hcF9pbmZvICgiTG9nZ2luZyBpbi4uLlxuIik7CisJCWlmICghc3J2Yy0+dXNlcikgeworCQkJZnByaW50Ziggc3RkZXJyLCAiU2tpcHBpbmcgc2VydmVyICVzLCBubyB1c2VyXG4iLCBzcnZjLT5ob3N0ICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaWYgKCFzcnZjLT5wYXNzKSB7CisJCQljaGFyIHByb21wdFs4MF07CisJCQlzcHJpbnRmKCBwcm9tcHQsICJQYXNzd29yZCAoJXNAJXMpOiAiLCBzcnZjLT51c2VyLCBzcnZjLT5ob3N0ICk7CisJCQlhcmcgPSBnZXRwYXNzKCBwcm9tcHQgKTsKKwkJCWlmICghYXJnKSB7CisJCQkJcGVycm9yKCAiZ2V0cGFzcyIgKTsKKwkJCQlleGl0KCAxICk7CisJCQl9CisJCQlpZiAoISphcmcpIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJTa2lwcGluZyBhY2NvdW50ICVzQCVzLCBubyBwYXNzd29yZFxuIiwgc3J2Yy0+dXNlciwgc3J2Yy0+aG9zdCApOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCS8qCisJCQkgKiBnZXRwYXNzKCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyLiAgbWFrZSBhIGNvcHkKKwkJCSAqIGZvciBsb25nIHRlcm0gc3RvcmFnZS4KKwkJCSAqLworCQkJc3J2Yy0+cGFzcyA9IHhzdHJkdXAoIGFyZyApOworCQl9CisJCWlmIChDQVAoTk9MT0dJTikpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlNraXBwaW5nIGFjY291bnQgJXNAJXMsIHNlcnZlciBmb3JiaWRzIExPR0lOXG4iLCBzcnZjLT51c2VyLCBzcnZjLT5ob3N0ICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaW1hcF93YXJuKCAiKioqIElNQVAgV2FybmluZyAqKiogUGFzc3dvcmQgaXMgYmVpbmcgc2VudCBpbiB0aGUgY2xlYXJcbiIgKTsKKwkJaWYgKGltYXBfZXhlYyggY3R4LCBOVUxMLCAiTE9HSU4gXCIlc1wiIFwiJXNcIiIsIHNydmMtPnVzZXIsIHNydmMtPnBhc3MgKSAhPSBSRVNQX09LKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBMT0dJTiBmYWlsZWRcbiIgKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCX0gLyogIXByZWF1dGggKi8KKworCWN0eC0+cHJlZml4ID0gIiI7CisJY3R4LT50cmFzaG5jID0gMTsKKwlyZXR1cm4gKHN0b3JlX3QgKiljdHg7CisKKyAgYmFpbDoKKwlpbWFwX2Nsb3NlX3N0b3JlKCAmY3R4LT5nZW4gKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAoraW1hcF9tYWtlX2ZsYWdzKCBpbnQgZmxhZ3MsIGNoYXIgKmJ1ZiApCit7CisJY29uc3QgY2hhciAqczsKKwl1bnNpZ25lZCBpLCBkOworCisJZm9yIChpID0gZCA9IDA7IGkgPCBBUlJBWV9TSVpFKEZsYWdzKTsgaSsrKQorCQlpZiAoZmxhZ3MgJiAoMSA8PCBpKSkgeworCQkJYnVmW2QrK10gPSAnICc7CisJCQlidWZbZCsrXSA9ICdcXCc7CisJCQlmb3IgKHMgPSBGbGFnc1tpXTsgKnM7IHMrKykKKwkJCQlidWZbZCsrXSA9ICpzOworCQl9CisJYnVmWzBdID0gJygnOworCWJ1ZltkKytdID0gJyknOworCXJldHVybiBkOworfQorCisjZGVmaW5lIFRVSURMIDgKKworc3RhdGljIGludAoraW1hcF9zdG9yZV9tc2coIHN0b3JlX3QgKmdjdHgsIG1zZ19kYXRhX3QgKmRhdGEsIGludCAqdWlkICkKK3sKKwlpbWFwX3N0b3JlX3QgKmN0eCA9IChpbWFwX3N0b3JlX3QgKilnY3R4OworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwlzdHJ1Y3QgaW1hcF9jbWRfY2IgY2I7CisJY2hhciAqZm1hcCwgKmJ1ZjsKKwljb25zdCBjaGFyICpwcmVmaXgsICpib3g7CisJaW50IHJldCwgaSwgaiwgZCwgbGVuLCBleHRyYSwgbm9jcjsKKwlpbnQgc3RhcnQsIHNicmVhayA9IDAsIGVicmVhayA9IDA7CisJY2hhciBmbGFnc3RyWzEyOF0sIHR1aWRbVFVJREwgKiAyICsgMV07CisKKwltZW1zZXQoICZjYiwgMCwgc2l6ZW9mKGNiKSApOworCisJZm1hcCA9IGRhdGEtPmRhdGE7CisJbGVuID0gZGF0YS0+bGVuOworCW5vY3IgPSAhZGF0YS0+Y3JsZjsKKwlleHRyYSA9IDAsIGkgPSAwOworCWlmICghQ0FQKFVJRFBMVVMpICYmIHVpZCkgeworCSAgbmxvb3A6CisJCXN0YXJ0ID0gaTsKKwkJd2hpbGUgKGkgPCBsZW4pCisJCQlpZiAoZm1hcFtpKytdID09ICdcbicpIHsKKwkJCQlleHRyYSArPSBub2NyOworCQkJCWlmIChpIC0gMiArIG5vY3IgPT0gc3RhcnQpIHsKKwkJCQkJc2JyZWFrID0gZWJyZWFrID0gaSAtIDIgKyBub2NyOworCQkJCQlnb3RvIG1rdGlkOworCQkJCX0KKwkJCQlpZiAoIW1lbWNtcCggZm1hcCArIHN0YXJ0LCAiWC1UVUlEOiAiLCA4ICkpIHsKKwkJCQkJZXh0cmEgLT0gKGVicmVhayA9IGkpIC0gKHNicmVhayA9IHN0YXJ0KSArIG5vY3I7CisJCQkJCWdvdG8gbWt0aWQ7CisJCQkJfQorCQkJCWdvdG8gbmxvb3A7CisJCQl9CisJCS8qIGludmFsaWQgbWVzc2FnZSAqLworCQlmcmVlKCBmbWFwICk7CisJCXJldHVybiBEUlZfTVNHX0JBRDsKKwkgbWt0aWQ6CisJCWZvciAoaiA9IDA7IGogPCBUVUlETDsgaisrKQorCQkJc3ByaW50ZiggdHVpZCArIGogKiAyLCAiJTAyeCIsIGFyYzRfZ2V0Ynl0ZSgpICk7CisJCWV4dHJhICs9IDggKyBUVUlETCAqIDIgKyAyOworCX0KKwlpZiAobm9jcikKKwkJZm9yICg7IGkgPCBsZW47IGkrKykKKwkJCWlmIChmbWFwW2ldID09ICdcbicpCisJCQkJZXh0cmErKzsKKworCWNiLmRsZW4gPSBsZW4gKyBleHRyYTsKKwlidWYgPSBjYi5kYXRhID0geG1hbGxvYyggY2IuZGxlbiApOworCWkgPSAwOworCWlmICghQ0FQKFVJRFBMVVMpICYmIHVpZCkgeworCQlpZiAobm9jcikgeworCQkJZm9yICg7IGkgPCBzYnJlYWs7IGkrKykKKwkJCQlpZiAoZm1hcFtpXSA9PSAnXG4nKSB7CisJCQkJCSpidWYrKyA9ICdccic7CisJCQkJCSpidWYrKyA9ICdcbic7CisJCQkJfSBlbHNlCisJCQkJCSpidWYrKyA9IGZtYXBbaV07CisJCX0gZWxzZSB7CisJCQltZW1jcHkoIGJ1ZiwgZm1hcCwgc2JyZWFrICk7CisJCQlidWYgKz0gc2JyZWFrOworCQl9CisJCW1lbWNweSggYnVmLCAiWC1UVUlEOiAiLCA4ICk7CisJCWJ1ZiArPSA4OworCQltZW1jcHkoIGJ1ZiwgdHVpZCwgVFVJREwgKiAyICk7CisJCWJ1ZiArPSBUVUlETCAqIDI7CisJCSpidWYrKyA9ICdccic7CisJCSpidWYrKyA9ICdcbic7CisJCWkgPSBlYnJlYWs7CisJfQorCWlmIChub2NyKSB7CisJCWZvciAoOyBpIDwgbGVuOyBpKyspCisJCQlpZiAoZm1hcFtpXSA9PSAnXG4nKSB7CisJCQkJKmJ1ZisrID0gJ1xyJzsKKwkJCQkqYnVmKysgPSAnXG4nOworCQkJfSBlbHNlCisJCQkJKmJ1ZisrID0gZm1hcFtpXTsKKwl9IGVsc2UKKwkJbWVtY3B5KCBidWYsIGZtYXAgKyBpLCBsZW4gLSBpICk7CisKKwlmcmVlKCBmbWFwICk7CisKKwlkID0gMDsKKwlpZiAoZGF0YS0+ZmxhZ3MpIHsKKwkJZCA9IGltYXBfbWFrZV9mbGFncyggZGF0YS0+ZmxhZ3MsIGZsYWdzdHIgKTsKKwkJZmxhZ3N0cltkKytdID0gJyAnOworCX0KKwlmbGFnc3RyW2RdID0gMDsKKworCWlmICghdWlkKSB7CisJCWJveCA9IGdjdHgtPmNvbmYtPnRyYXNoOworCQlwcmVmaXggPSBjdHgtPnByZWZpeDsKKwkJY2IuY3JlYXRlID0gMTsKKwkJaWYgKGN0eC0+dHJhc2huYykKKwkJCWltYXAtPmNhcHMgPSBpbWFwLT5yY2FwcyAmIH4oMSA8PCBMSVRFUkFMUExVUyk7CisJfSBlbHNlIHsKKwkJYm94ID0gZ2N0eC0+bmFtZTsKKwkJcHJlZml4ID0gIXN0cmNtcCggYm94LCAiSU5CT1giICkgPyAiIiA6IGN0eC0+cHJlZml4OworCQljYi5jcmVhdGUgPSAwOworCX0KKwljYi5jdHggPSB1aWQ7CisJcmV0ID0gaW1hcF9leGVjX20oIGN0eCwgJmNiLCAiQVBQRU5EIFwiJXMlc1wiICVzIiwgcHJlZml4LCBib3gsIGZsYWdzdHIgKTsKKwlpbWFwLT5jYXBzID0gaW1hcC0+cmNhcHM7CisJaWYgKHJldCAhPSBEUlZfT0spCisJCXJldHVybiByZXQ7CisJaWYgKCF1aWQpCisJCWN0eC0+dHJhc2huYyA9IDA7CisJZWxzZQorCQlnY3R4LT5jb3VudCsrOworCisJcmV0dXJuIERSVl9PSzsKK30KKworI2RlZmluZSBDSFVOS1NJWkUgMHgxMDAwCisKK3N0YXRpYyBpbnQKK3JlYWRfbWVzc2FnZSggRklMRSAqZiwgbXNnX2RhdGFfdCAqbXNnICkKK3sKKwlpbnQgbGVuLCByOworCisJbWVtc2V0KCBtc2csIDAsIHNpemVvZiAqbXNnICk7CisJbGVuID0gQ0hVTktTSVpFOworCW1zZy0+ZGF0YSA9IHhtYWxsb2MoIGxlbisxICk7CisJbXNnLT5kYXRhWzBdID0gMDsKKworCXdoaWxlKCFmZW9mKCBmICkpIHsKKwkJaWYgKG1zZy0+bGVuID49IGxlbikgeworCQkJdm9pZCAqcDsKKwkJCWxlbiArPSBDSFVOS1NJWkU7CisJCQlwID0geHJlYWxsb2MobXNnLT5kYXRhLCBsZW4rMSk7CisJCQlpZiAoIXApCisJCQkJYnJlYWs7CisJCQltc2ctPmRhdGEgPSBwOworCQl9CisJCXIgPSBmcmVhZCggJm1zZy0+ZGF0YVttc2ctPmxlbl0sIDEsIGxlbiAtIG1zZy0+bGVuLCBmICk7CisJCWlmIChyIDw9IDApCisJCQlicmVhazsKKwkJbXNnLT5sZW4gKz0gcjsKKwl9CisJbXNnLT5kYXRhW21zZy0+bGVuXSA9IDA7CisJcmV0dXJuIG1zZy0+bGVuOworfQorCitzdGF0aWMgaW50Citjb3VudF9tZXNzYWdlcyggbXNnX2RhdGFfdCAqbXNnICkKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgKnAgPSBtc2ctPmRhdGE7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIXByZWZpeGNtcChwLCAiRnJvbSAiKSkgeworCQkJY291bnQrKzsKKwkJCXAgKz0gNTsKKwkJfQorCQlwID0gc3Ryc3RyKCBwKzUsICJcbkZyb20gIik7CisJCWlmICghcCkKKwkJCWJyZWFrOworCQlwKys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorc3BsaXRfbXNnKCBtc2dfZGF0YV90ICphbGxfbXNncywgbXNnX2RhdGFfdCAqbXNnLCBpbnQgKm9mcyApCit7CisJY2hhciAqcCwgKmRhdGE7CisKKwltZW1zZXQoIG1zZywgMCwgc2l6ZW9mICptc2cgKTsKKwlpZiAoKm9mcyA+PSBhbGxfbXNncy0+bGVuKQorCQlyZXR1cm4gMDsKKworCWRhdGEgPSAmYWxsX21zZ3MtPmRhdGFbICpvZnMgXTsKKwltc2ctPmxlbiA9IGFsbF9tc2dzLT5sZW4gLSAqb2ZzOworCisJaWYgKG1zZy0+bGVuIDwgNSB8fCBwcmVmaXhjbXAoZGF0YSwgIkZyb20gIikpCisJCXJldHVybiAwOworCisJcCA9IHN0cmNociggZGF0YSwgJ1xuJyApOworCWlmIChwKSB7CisJCXAgPSAmcFsxXTsKKwkJbXNnLT5sZW4gLT0gcC1kYXRhOworCQkqb2ZzICs9IHAtZGF0YTsKKwkJZGF0YSA9IHA7CisJfQorCisJcCA9IHN0cnN0ciggZGF0YSwgIlxuRnJvbSAiICk7CisJaWYgKHApCisJCW1zZy0+bGVuID0gJnBbMV0gLSBkYXRhOworCisJbXNnLT5kYXRhID0geG1hbGxvYyggbXNnLT5sZW4gKyAxICk7CisJaWYgKCFtc2ctPmRhdGEpCisJCXJldHVybiAwOworCisJbWVtY3B5KCBtc2ctPmRhdGEsIGRhdGEsIG1zZy0+bGVuICk7CisJbXNnLT5kYXRhWyBtc2ctPmxlbiBdID0gMDsKKworCSpvZnMgKz0gbXNnLT5sZW47CisgCXJldHVybiAxOworfQorCitzdGF0aWMgaW1hcF9zZXJ2ZXJfY29uZl90IHNlcnZlciA9Cit7CisJTlVMTCwJLyogbmFtZSAqLworCU5VTEwsCS8qIHR1bm5lbCAqLworCU5VTEwsCS8qIGhvc3QgKi8KKwkwLAkvKiBwb3J0ICovCisJTlVMTCwJLyogdXNlciAqLworCU5VTEwsCS8qIHBhc3MgKi8KK307CisKK3N0YXRpYyBjaGFyICppbWFwX2ZvbGRlcjsKKworc3RhdGljIGludAorZ2l0X2ltYXBfY29uZmlnKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreworCWNoYXIgaW1hcF9rZXlbXSA9ICJpbWFwLiI7CisKKwlpZiAoc3RybmNtcCgga2V5LCBpbWFwX2tleSwgc2l6ZW9mIGltYXBfa2V5IC0gMSApKQorCQlyZXR1cm4gMDsKKwlrZXkgKz0gc2l6ZW9mIGltYXBfa2V5IC0gMTsKKworCWlmICghc3RyY21wKCAiZm9sZGVyIiwga2V5ICkpIHsKKwkJaW1hcF9mb2xkZXIgPSB4c3RyZHVwKCB2YWwgKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJob3N0Iiwga2V5ICkpIHsKKwkJeworCQkJaWYgKCFwcmVmaXhjbXAodmFsLCAiaW1hcDoiKSkKKwkJCQl2YWwgKz0gNTsKKwkJCWlmICghc2VydmVyLnBvcnQpCisJCQkJc2VydmVyLnBvcnQgPSAxNDM7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAodmFsLCAiLy8iKSkKKwkJCXZhbCArPSAyOworCQlzZXJ2ZXIuaG9zdCA9IHhzdHJkdXAoIHZhbCApOworCX0KKwllbHNlIGlmICghc3RyY21wKCAidXNlciIsIGtleSApKQorCQlzZXJ2ZXIudXNlciA9IHhzdHJkdXAoIHZhbCApOworCWVsc2UgaWYgKCFzdHJjbXAoICJwYXNzIiwga2V5ICkpCisJCXNlcnZlci5wYXNzID0geHN0cmR1cCggdmFsICk7CisJZWxzZSBpZiAoIXN0cmNtcCggInBvcnQiLCBrZXkgKSkKKwkJc2VydmVyLnBvcnQgPSBnaXRfY29uZmlnX2ludCgga2V5LCB2YWwgKTsKKwllbHNlIGlmICghc3RyY21wKCAidHVubmVsIiwga2V5ICkpCisJCXNlcnZlci50dW5uZWwgPSB4c3RyZHVwKCB2YWwgKTsKKwlyZXR1cm4gMDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwltc2dfZGF0YV90IGFsbF9tc2dzLCBtc2c7CisJc3RvcmVfdCAqY3R4ID0gTlVMTDsKKwlpbnQgdWlkID0gMDsKKwlpbnQgb2ZzID0gMDsKKwlpbnQgcjsKKwlpbnQgdG90YWwsIG4gPSAwOworCisJLyogaW5pdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKwlhcmM0X2luaXQoKTsKKworCWdpdF9jb25maWcoIGdpdF9pbWFwX2NvbmZpZyApOworCisJaWYgKCFpbWFwX2ZvbGRlcikgeworCQlmcHJpbnRmKCBzdGRlcnIsICJubyBpbWFwIHN0b3JlIHNwZWNpZmllZFxuIiApOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiByZWFkIHRoZSBtZXNzYWdlcyAqLworCWlmICghcmVhZF9tZXNzYWdlKCBzdGRpbiwgJmFsbF9tc2dzICkpIHsKKwkJZnByaW50ZihzdGRlcnIsIm5vdGhpbmcgdG8gc2VuZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXRvdGFsID0gY291bnRfbWVzc2FnZXMoICZhbGxfbXNncyApOworCWlmICghdG90YWwpIHsKKwkJZnByaW50ZihzdGRlcnIsIm5vIG1lc3NhZ2VzIHRvIHNlbmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB3cml0ZSBpdCB0byB0aGUgaW1hcCBzZXJ2ZXIgKi8KKwljdHggPSBpbWFwX29wZW5fc3RvcmUoICZzZXJ2ZXIgKTsKKwlpZiAoIWN0eCkgeworCQlmcHJpbnRmKCBzdGRlcnIsImZhaWxlZCB0byBvcGVuIHN0b3JlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZnByaW50Ziggc3RkZXJyLCAic2VuZGluZyAlZCBtZXNzYWdlJXNcbiIsIHRvdGFsLCAodG90YWwhPTEpPyJzIjoiIiApOworCWN0eC0+bmFtZSA9IGltYXBfZm9sZGVyOworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHBlcmNlbnQgPSBuICogMTAwIC8gdG90YWw7CisJCWZwcmludGYoIHN0ZGVyciwgIiU0dSUlICglZC8lZCkgZG9uZVxyIiwgcGVyY2VudCwgbiwgdG90YWwgKTsKKwkJaWYgKCFzcGxpdF9tc2coICZhbGxfbXNncywgJm1zZywgJm9mcyApKQorCQkJYnJlYWs7CisJCXIgPSBpbWFwX3N0b3JlX21zZyggY3R4LCAmbXNnLCAmdWlkICk7CisJCWlmIChyICE9IERSVl9PSykgYnJlYWs7CisJCW4rKzsKKwl9CisJZnByaW50Ziggc3RkZXJyLCJcbiIgKTsKKworCWltYXBfY2xvc2Vfc3RvcmUoIGN0eCApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbmRleC1wYWNrLmMgYi9pbmRleC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNGE5YwotLS0gL2Rldi9udWxsCisrKyBiL2luZGV4LXBhY2suYwpAQCAtMCwwICsxLDk1MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJwcm9ncmVzcy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBpbmRleF9wYWNrX3VzYWdlW10gPQorImdpdC1pbmRleC1wYWNrIFstdl0gWy1vIDxpbmRleC1maWxlPl0gW3sgLS0ta2VlcCB8IC0ta2VlcD08bXNnPiB9XSB7IDxwYWNrLWZpbGU+IHwgLS1zdGRpbiBbLS1maXgtdGhpbl0gWzxwYWNrLWZpbGU+XSB9IjsKKworc3RydWN0IG9iamVjdF9lbnRyeQoreworCW9mZl90IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGhkcl9zaXplOworCXVpbnQzMl90IGNyYzMyOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwllbnVtIG9iamVjdF90eXBlIHJlYWxfdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKwordW5pb24gZGVsdGFfYmFzZSB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlvZmZfdCBvZmZzZXQ7Cit9OworCisvKgorICogRXZlbiBpZiBzaXplb2YodW5pb24gZGVsdGFfYmFzZSkgPT0gMjQgb24gNjQtYml0IGFyY2hzLCB3ZSByZWFsbHkgd2FudAorICogdG8gbWVtY21wKCkgb25seSB0aGUgZmlyc3QgMjAgYnl0ZXMuCisgKi8KKyNkZWZpbmUgVU5JT05fQkFTRV9TWgkyMAorCitzdHJ1Y3QgZGVsdGFfZW50cnkKK3sKKwl1bmlvbiBkZWx0YV9iYXNlIGJhc2U7CisJaW50IG9ial9ubzsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmplY3RzOworc3RhdGljIHN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGFzOworc3RhdGljIGludCBucl9vYmplY3RzOworc3RhdGljIGludCBucl9kZWx0YXM7CitzdGF0aWMgaW50IG5yX3Jlc29sdmVkX2RlbHRhczsKKworc3RhdGljIGludCBmcm9tX3N0ZGluOworc3RhdGljIGludCB2ZXJib3NlOworCitzdGF0aWMgc3RydWN0IHByb2dyZXNzIHByb2dyZXNzOworCisvKiBXZSBhbHdheXMgcmVhZCBpbiA0a0IgY2h1bmtzLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVmZmVyWzQwOTZdOworc3RhdGljIHVuc2lnbmVkIGludCBpbnB1dF9vZmZzZXQsIGlucHV0X2xlbjsKK3N0YXRpYyBvZmZfdCBjb25zdW1lZF9ieXRlczsKK3N0YXRpYyBTSEFfQ1RYIGlucHV0X2N0eDsKK3N0YXRpYyB1aW50MzJfdCBpbnB1dF9jcmMzMjsKK3N0YXRpYyBpbnQgaW5wdXRfZmQsIG91dHB1dF9mZCwgcGFja19mZDsKKworLyogRGlzY2FyZCBjdXJyZW50IGJ1ZmZlciB1c2VkIGNvbnRlbnQuICovCitzdGF0aWMgdm9pZCBmbHVzaCh2b2lkKQoreworCWlmIChpbnB1dF9vZmZzZXQpIHsKKwkJaWYgKG91dHB1dF9mZCA+PSAwKQorCQkJd3JpdGVfb3JfZGllKG91dHB1dF9mZCwgaW5wdXRfYnVmZmVyLCBpbnB1dF9vZmZzZXQpOworCQlTSEExX1VwZGF0ZSgmaW5wdXRfY3R4LCBpbnB1dF9idWZmZXIsIGlucHV0X29mZnNldCk7CisJCW1lbW1vdmUoaW5wdXRfYnVmZmVyLCBpbnB1dF9idWZmZXIgKyBpbnB1dF9vZmZzZXQsIGlucHV0X2xlbik7CisJCWlucHV0X29mZnNldCA9IDA7CisJfQorfQorCisvKgorICogTWFrZSBzdXJlIGF0IGxlYXN0ICJtaW4iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciwgYW5kCisgKiByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgKmZpbGwoaW50IG1pbikKK3sKKwlpZiAobWluIDw9IGlucHV0X2xlbikKKwkJcmV0dXJuIGlucHV0X2J1ZmZlciArIGlucHV0X29mZnNldDsKKwlpZiAobWluID4gc2l6ZW9mKGlucHV0X2J1ZmZlcikpCisJCWRpZSgiY2Fubm90IGZpbGwgJWQgYnl0ZXMiLCBtaW4pOworCWZsdXNoKCk7CisJZG8geworCQlzc2l6ZV90IHJldCA9IHhyZWFkKGlucHV0X2ZkLCBpbnB1dF9idWZmZXIgKyBpbnB1dF9sZW4sCisJCQkJc2l6ZW9mKGlucHV0X2J1ZmZlcikgLSBpbnB1dF9sZW4pOworCQlpZiAocmV0IDw9IDApIHsKKwkJCWlmICghcmV0KQorCQkJCWRpZSgiZWFybHkgRU9GIik7CisJCQlkaWUoInJlYWQgZXJyb3Igb24gaW5wdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpbnB1dF9sZW4gKz0gcmV0OworCX0gd2hpbGUgKGlucHV0X2xlbiA8IG1pbik7CisJcmV0dXJuIGlucHV0X2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgdXNlKGludCBieXRlcykKK3sKKwlpZiAoYnl0ZXMgPiBpbnB1dF9sZW4pCisJCWRpZSgidXNlZCBtb3JlIGJ5dGVzIHRoYW4gd2VyZSBhdmFpbGFibGUiKTsKKwlpbnB1dF9jcmMzMiA9IGNyYzMyKGlucHV0X2NyYzMyLCBpbnB1dF9idWZmZXIgKyBpbnB1dF9vZmZzZXQsIGJ5dGVzKTsKKwlpbnB1dF9sZW4gLT0gYnl0ZXM7CisJaW5wdXRfb2Zmc2V0ICs9IGJ5dGVzOworCisJLyogbWFrZSBzdXJlIG9mZl90IGlzIHN1ZmZpY2llbnRseSBsYXJnZSBub3QgdG8gd3JhcCAqLworCWlmIChjb25zdW1lZF9ieXRlcyA+IGNvbnN1bWVkX2J5dGVzICsgYnl0ZXMpCisJCWRpZSgicGFjayB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgZGVmaW5pdGlvbiBvZiBvZmZfdCIpOworCWNvbnN1bWVkX2J5dGVzICs9IGJ5dGVzOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqb3Blbl9wYWNrX2ZpbGUoY29uc3QgY2hhciAqcGFja19uYW1lKQoreworCWlmIChmcm9tX3N0ZGluKSB7CisJCWlucHV0X2ZkID0gMDsKKwkJaWYgKCFwYWNrX25hbWUpIHsKKwkJCXN0YXRpYyBjaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCQkJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkJCSAiJXMvdG1wX3BhY2tfWFhYWFhYIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJCQlvdXRwdXRfZmQgPSBta3N0ZW1wKHRtcGZpbGUpOworCQkJcGFja19uYW1lID0geHN0cmR1cCh0bXBmaWxlKTsKKwkJfSBlbHNlCisJCQlvdXRwdXRfZmQgPSBvcGVuKHBhY2tfbmFtZSwgT19DUkVBVHxPX0VYQ0x8T19SRFdSLCAwNjAwKTsKKwkJaWYgKG91dHB1dF9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgJXM6ICVzXG4iLCBwYWNrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXBhY2tfZmQgPSBvdXRwdXRfZmQ7CisJfSBlbHNlIHsKKwkJaW5wdXRfZmQgPSBvcGVuKHBhY2tfbmFtZSwgT19SRE9OTFkpOworCQlpZiAoaW5wdXRfZmQgPCAwKQorCQkJZGllKCJjYW5ub3Qgb3BlbiBwYWNrZmlsZSAnJXMnOiAlcyIsCisJCQkgICAgcGFja19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlvdXRwdXRfZmQgPSAtMTsKKwkJcGFja19mZCA9IGlucHV0X2ZkOworCX0KKwlTSEExX0luaXQoJmlucHV0X2N0eCk7CisJcmV0dXJuIHBhY2tfbmFtZTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfcGFja19oZWFkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkciA9IGZpbGwoc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcikpOworCisJLyogSGVhZGVyIGNvbnNpc3RlbmN5IGNoZWNrICovCisJaWYgKGhkci0+aGRyX3NpZ25hdHVyZSAhPSBodG9ubChQQUNLX1NJR05BVFVSRSkpCisJCWRpZSgicGFjayBzaWduYXR1cmUgbWlzbWF0Y2giKTsKKwlpZiAoIXBhY2tfdmVyc2lvbl9vayhoZHItPmhkcl92ZXJzaW9uKSkKKwkJZGllKCJwYWNrIHZlcnNpb24gJWQgdW5zdXBwb3J0ZWQiLCBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisKKwlucl9vYmplY3RzID0gbnRvaGwoaGRyLT5oZHJfZW50cmllcyk7CisJdXNlKHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpKTsKK30KKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LAorCQkgICAgICAgLi4uKSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJY2hhciBidWZbMTAyNF07CisKKwl2YV9zdGFydChwYXJhbXMsIGZvcm1hdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlkaWUoInBhY2sgaGFzIGJhZCBvYmplY3QgYXQgb2Zmc2V0ICVsdTogJXMiLCBvZmZzZXQsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZW50cnlfZGF0YSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl2b2lkICpidWYgPSB4bWFsbG9jKHNpemUpOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCXN0cmVhbS5hdmFpbF9pbiA9IGlucHV0X2xlbjsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IGluZmxhdGUoJnN0cmVhbSwgMCk7CisJCXVzZShpbnB1dF9sZW4gLSBzdHJlYW0uYXZhaWxfaW4pOworCQlpZiAoc3RyZWFtLnRvdGFsX291dCA9PSBzaXplICYmIHJldCA9PSBaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJldCAhPSBaX09LKQorCQkJYmFkX29iamVjdChvZmZzZXQsICJpbmZsYXRlIHJldHVybmVkICVkIiwgcmV0KTsKKwkJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCQlzdHJlYW0uYXZhaWxfaW4gPSBpbnB1dF9sZW47CisJfQorCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19yYXdfZW50cnkoc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqLCB1bmlvbiBkZWx0YV9iYXNlICpkZWx0YV9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgKnAsIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCXVuc2lnbmVkIHNoaWZ0OworCXZvaWQgKmRhdGE7CisKKwlvYmotPm9mZnNldCA9IGNvbnN1bWVkX2J5dGVzOworCWlucHV0X2NyYzMyID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKworCXAgPSBmaWxsKDEpOworCWMgPSAqcDsKKwl1c2UoMSk7CisJb2JqLT50eXBlID0gKGMgPj4gNCkgJiA3OworCXNpemUgPSAoYyAmIDE1KTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCXAgPSBmaWxsKDEpOworCQljID0gKnA7CisJCXVzZSgxKTsKKwkJc2l6ZSArPSAoYyAmIDB4N2ZVTCkgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IDc7CisJfQorCW9iai0+c2l6ZSA9IHNpemU7CisKKwlzd2l0Y2ggKG9iai0+dHlwZSkgeworCWNhc2UgT0JKX1JFRl9ERUxUQToKKwkJaGFzaGNweShkZWx0YV9iYXNlLT5zaGExLCBmaWxsKDIwKSk7CisJCXVzZSgyMCk7CisJCWJyZWFrOworCWNhc2UgT0JKX09GU19ERUxUQToKKwkJbWVtc2V0KGRlbHRhX2Jhc2UsIDAsIHNpemVvZigqZGVsdGFfYmFzZSkpOworCQlwID0gZmlsbCgxKTsKKwkJYyA9ICpwOworCQl1c2UoMSk7CisJCWJhc2Vfb2Zmc2V0ID0gYyAmIDEyNzsKKwkJd2hpbGUgKGMgJiAxMjgpIHsKKwkJCWJhc2Vfb2Zmc2V0ICs9IDE7CisJCQlpZiAoIWJhc2Vfb2Zmc2V0IHx8IE1TQihiYXNlX29mZnNldCwgNykpCisJCQkJYmFkX29iamVjdChvYmotPm9mZnNldCwgIm9mZnNldCB2YWx1ZSBvdmVyZmxvdyBmb3IgZGVsdGEgYmFzZSBvYmplY3QiKTsKKwkJCXAgPSBmaWxsKDEpOworCQkJYyA9ICpwOworCQkJdXNlKDEpOworCQkJYmFzZV9vZmZzZXQgPSAoYmFzZV9vZmZzZXQgPDwgNykgKyAoYyAmIDEyNyk7CisJCX0KKwkJZGVsdGFfYmFzZS0+b2Zmc2V0ID0gb2JqLT5vZmZzZXQgLSBiYXNlX29mZnNldDsKKwkJaWYgKGRlbHRhX2Jhc2UtPm9mZnNldCA+PSBvYmotPm9mZnNldCkKKwkJCWJhZF9vYmplY3Qob2JqLT5vZmZzZXQsICJkZWx0YSBiYXNlIG9mZnNldCBpcyBvdXQgb2YgYm91bmQiKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfQ09NTUlUOgorCWNhc2UgT0JKX1RSRUU6CisJY2FzZSBPQkpfQkxPQjoKKwljYXNlIE9CSl9UQUc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9vYmplY3Qob2JqLT5vZmZzZXQsICJ1bmtub3duIG9iamVjdCB0eXBlICVkIiwgb2JqLT50eXBlKTsKKwl9CisJb2JqLT5oZHJfc2l6ZSA9IGNvbnN1bWVkX2J5dGVzIC0gb2JqLT5vZmZzZXQ7CisKKwlkYXRhID0gdW5wYWNrX2VudHJ5X2RhdGEob2JqLT5vZmZzZXQsIG9iai0+c2l6ZSk7CisJb2JqLT5jcmMzMiA9IGlucHV0X2NyYzMyOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X2RhdGFfZnJvbV9wYWNrKHN0cnVjdCBvYmplY3RfZW50cnkgKm9iaikKK3sKKwl1bnNpZ25lZCBsb25nIGZyb20gPSBvYmpbMF0ub2Zmc2V0ICsgb2JqWzBdLmhkcl9zaXplOworCXVuc2lnbmVkIGxvbmcgbGVuID0gb2JqWzFdLm9mZnNldCAtIGZyb207CisJdW5zaWduZWQgbG9uZyByZHkgPSAwOworCXVuc2lnbmVkIGNoYXIgKnNyYywgKmRhdGE7CisJel9zdHJlYW0gc3RyZWFtOworCWludCBzdDsKKworCXNyYyA9IHhtYWxsb2MobGVuKTsKKwlkYXRhID0gc3JjOworCWRvIHsKKwkJc3NpemVfdCBuID0gcHJlYWQocGFja19mZCwgZGF0YSArIHJkeSwgbGVuIC0gcmR5LCBmcm9tICsgcmR5KTsKKwkJaWYgKG4gPD0gMCkKKwkJCWRpZSgiY2Fubm90IHByZWFkIHBhY2sgZmlsZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZHkgKz0gbjsKKwl9IHdoaWxlIChyZHkgPCBsZW4pOworCWRhdGEgPSB4bWFsbG9jKG9iai0+c2l6ZSk7CisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkYXRhOworCXN0cmVhbS5hdmFpbF9vdXQgPSBvYmotPnNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBzcmM7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCXdoaWxlICgoc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSkgPT0gWl9PSyk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoc3QgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS50b3RhbF9vdXQgIT0gb2JqLT5zaXplKQorCQlkaWUoInNlcmlvdXMgaW5mbGF0ZSBpbmNvbnNpc3RlbmN5Iik7CisJZnJlZShzcmMpOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGZpbmRfZGVsdGEoY29uc3QgdW5pb24gZGVsdGFfYmFzZSAqYmFzZSkKK3sKKwlpbnQgZmlyc3QgPSAwLCBsYXN0ID0gbnJfZGVsdGFzOworCisgICAgICAgIHdoaWxlIChmaXJzdCA8IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhID0gJmRlbHRhc1tuZXh0XTsKKyAgICAgICAgICAgICAgICBpbnQgY21wOworCisgICAgICAgICAgICAgICAgY21wID0gbWVtY21wKGJhc2UsICZkZWx0YS0+YmFzZSwgVU5JT05fQkFTRV9TWik7CisgICAgICAgICAgICAgICAgaWYgKCFjbXApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlyc3QgPSBuZXh0KzE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC1maXJzdC0xOworfQorCitzdGF0aWMgaW50IGZpbmRfZGVsdGFfY2hpbGRyZW4oY29uc3QgdW5pb24gZGVsdGFfYmFzZSAqYmFzZSwKKwkJCSAgICAgICBpbnQgKmZpcnN0X2luZGV4LCBpbnQgKmxhc3RfaW5kZXgpCit7CisJaW50IGZpcnN0ID0gZmluZF9kZWx0YShiYXNlKTsKKwlpbnQgbGFzdCA9IGZpcnN0OworCWludCBlbmQgPSBucl9kZWx0YXMgLSAxOworCisJaWYgKGZpcnN0IDwgMCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmaXJzdCA+IDAgJiYgIW1lbWNtcCgmZGVsdGFzW2ZpcnN0IC0gMV0uYmFzZSwgYmFzZSwgVU5JT05fQkFTRV9TWikpCisJCS0tZmlyc3Q7CisJd2hpbGUgKGxhc3QgPCBlbmQgJiYgIW1lbWNtcCgmZGVsdGFzW2xhc3QgKyAxXS5iYXNlLCBiYXNlLCBVTklPTl9CQVNFX1NaKSkKKwkJKytsYXN0OworCSpmaXJzdF9pbmRleCA9IGZpcnN0OworCSpsYXN0X2luZGV4ID0gbGFzdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hhMV9vYmplY3QoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWhhc2hfc2hhMV9maWxlKGRhdGEsIHNpemUsIHR5cGVuYW1lKHR5cGUpLCBzaGExKTsKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkgeworCQl2b2lkICpoYXNfZGF0YTsKKwkJZW51bSBvYmplY3RfdHlwZSBoYXNfdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBoYXNfc2l6ZTsKKwkJaGFzX2RhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmaGFzX3R5cGUsICZoYXNfc2l6ZSk7CisJCWlmICghaGFzX2RhdGEpCisJCQlkaWUoImNhbm5vdCByZWFkIGV4aXN0aW5nIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKHNpemUgIT0gaGFzX3NpemUgfHwgdHlwZSAhPSBoYXNfdHlwZSB8fAorCQkgICAgbWVtY21wKGRhdGEsIGhhc19kYXRhLCBzaXplKSAhPSAwKQorCQkJZGllKCJTSEExIENPTExJU0lPTiBGT1VORCBXSVRIICVzICEiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWZyZWUoaGFzX2RhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzb2x2ZV9kZWx0YShzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpkZWx0YV9vYmosIHZvaWQgKmJhc2VfZGF0YSwKKwkJCSAgdW5zaWduZWQgbG9uZyBiYXNlX3NpemUsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSkKK3sKKwl2b2lkICpkZWx0YV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZTsKKwl2b2lkICpyZXN1bHQ7CisJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZTsKKwl1bmlvbiBkZWx0YV9iYXNlIGRlbHRhX2Jhc2U7CisJaW50IGosIGZpcnN0LCBsYXN0OworCisJZGVsdGFfb2JqLT5yZWFsX3R5cGUgPSB0eXBlOworCWRlbHRhX2RhdGEgPSBnZXRfZGF0YV9mcm9tX3BhY2soZGVsdGFfb2JqKTsKKwlkZWx0YV9zaXplID0gZGVsdGFfb2JqLT5zaXplOworCXJlc3VsdCA9IHBhdGNoX2RlbHRhKGJhc2VfZGF0YSwgYmFzZV9zaXplLCBkZWx0YV9kYXRhLCBkZWx0YV9zaXplLAorCQkJICAgICAmcmVzdWx0X3NpemUpOworCWZyZWUoZGVsdGFfZGF0YSk7CisJaWYgKCFyZXN1bHQpCisJCWJhZF9vYmplY3QoZGVsdGFfb2JqLT5vZmZzZXQsICJmYWlsZWQgdG8gYXBwbHkgZGVsdGEiKTsKKwlzaGExX29iamVjdChyZXN1bHQsIHJlc3VsdF9zaXplLCB0eXBlLCBkZWx0YV9vYmotPnNoYTEpOworCW5yX3Jlc29sdmVkX2RlbHRhcysrOworCisJaGFzaGNweShkZWx0YV9iYXNlLnNoYTEsIGRlbHRhX29iai0+c2hhMSk7CisJaWYgKCFmaW5kX2RlbHRhX2NoaWxkcmVuKCZkZWx0YV9iYXNlLCAmZmlyc3QsICZsYXN0KSkgeworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gb2JqZWN0cyArIGRlbHRhc1tqXS5vYmpfbm87CisJCQlpZiAoY2hpbGQtPnJlYWxfdHlwZSA9PSBPQkpfUkVGX0RFTFRBKQorCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIHJlc3VsdCwgcmVzdWx0X3NpemUsIHR5cGUpOworCQl9CisJfQorCisJbWVtc2V0KCZkZWx0YV9iYXNlLCAwLCBzaXplb2YoZGVsdGFfYmFzZSkpOworCWRlbHRhX2Jhc2Uub2Zmc2V0ID0gZGVsdGFfb2JqLT5vZmZzZXQ7CisJaWYgKCFmaW5kX2RlbHRhX2NoaWxkcmVuKCZkZWx0YV9iYXNlLCAmZmlyc3QsICZsYXN0KSkgeworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gb2JqZWN0cyArIGRlbHRhc1tqXS5vYmpfbm87CisJCQlpZiAoY2hpbGQtPnJlYWxfdHlwZSA9PSBPQkpfT0ZTX0RFTFRBKQorCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIHJlc3VsdCwgcmVzdWx0X3NpemUsIHR5cGUpOworCQl9CisJfQorCisJZnJlZShyZXN1bHQpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfZGVsdGFfZW50cnkoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhX2EgPSBhOworCWNvbnN0IHN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGFfYiA9IGI7CisJcmV0dXJuIG1lbWNtcCgmZGVsdGFfYS0+YmFzZSwgJmRlbHRhX2ItPmJhc2UsIFVOSU9OX0JBU0VfU1opOworfQorCisvKiBQYXJzZSBhbGwgb2JqZWN0cyBhbmQgcmV0dXJuIHRoZSBwYWNrIGNvbnRlbnQgU0hBMSBoYXNoICovCitzdGF0aWMgdm9pZCBwYXJzZV9wYWNrX29iamVjdHModW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhID0gZGVsdGFzOworCXZvaWQgKmRhdGE7CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKgorCSAqIEZpcnN0IHBhc3M6CisJICogLSBmaW5kIGxvY2F0aW9ucyBvZiBhbGwgb2JqZWN0czsKKwkgKiAtIGNhbGN1bGF0ZSBTSEExIG9mIGFsbCBub24tZGVsdGEgb2JqZWN0czsKKwkgKiAtIHJlbWVtYmVyIGJhc2UgKFNIQTEgb3Igb2Zmc2V0KSBmb3IgYWxsIGRlbHRhcy4KKwkgKi8KKwlpZiAodmVyYm9zZSkKKwkJc3RhcnRfcHJvZ3Jlc3MoJnByb2dyZXNzLCAiSW5kZXhpbmcgJXUgb2JqZWN0cy4uLiIsICIiLCBucl9vYmplY3RzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKm9iaiA9ICZvYmplY3RzW2ldOworCQlkYXRhID0gdW5wYWNrX3Jhd19lbnRyeShvYmosICZkZWx0YS0+YmFzZSk7CisJCW9iai0+cmVhbF90eXBlID0gb2JqLT50eXBlOworCQlpZiAob2JqLT50eXBlID09IE9CSl9SRUZfREVMVEEgfHwgb2JqLT50eXBlID09IE9CSl9PRlNfREVMVEEpIHsKKwkJCW5yX2RlbHRhcysrOworCQkJZGVsdGEtPm9ial9ubyA9IGk7CisJCQlkZWx0YSsrOworCQl9IGVsc2UKKwkJCXNoYTFfb2JqZWN0KGRhdGEsIG9iai0+c2l6ZSwgb2JqLT50eXBlLCBvYmotPnNoYTEpOworCQlmcmVlKGRhdGEpOworCQlpZiAodmVyYm9zZSkKKwkJCWRpc3BsYXlfcHJvZ3Jlc3MoJnByb2dyZXNzLCBpKzEpOworCX0KKwlvYmplY3RzW2ldLm9mZnNldCA9IGNvbnN1bWVkX2J5dGVzOworCWlmICh2ZXJib3NlKQorCQlzdG9wX3Byb2dyZXNzKCZwcm9ncmVzcyk7CisKKwkvKiBDaGVjayBwYWNrIGludGVncml0eSAqLworCWZsdXNoKCk7CisJU0hBMV9GaW5hbChzaGExLCAmaW5wdXRfY3R4KTsKKwlpZiAoaGFzaGNtcChmaWxsKDIwKSwgc2hhMSkpCisJCWRpZSgicGFjayBpcyBjb3JydXB0ZWQgKFNIQTEgbWlzbWF0Y2gpIik7CisJdXNlKDIwKTsKKworCS8qIElmIGlucHV0X2ZkIGlzIGEgZmlsZSwgd2Ugc2hvdWxkIGhhdmUgcmVhY2hlZCBpdHMgZW5kIG5vdy4gKi8KKwlpZiAoZnN0YXQoaW5wdXRfZmQsICZzdCkpCisJCWRpZSgiY2Fubm90IGZzdGF0IHBhY2tmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgJiYKKwkJCWxzZWVrKGlucHV0X2ZkLCAwLCBTRUVLX0NVUikgLSBpbnB1dF9sZW4gIT0gc3Quc3Rfc2l6ZSkKKwkJZGllKCJwYWNrIGhhcyBqdW5rIGF0IHRoZSBlbmQiKTsKKworCWlmICghbnJfZGVsdGFzKQorCQlyZXR1cm47CisKKwkvKiBTb3J0IGRlbHRhcyBieSBiYXNlIFNIQTEvb2Zmc2V0IGZvciBmYXN0IHNlYXJjaGluZyAqLworCXFzb3J0KGRlbHRhcywgbnJfZGVsdGFzLCBzaXplb2Yoc3RydWN0IGRlbHRhX2VudHJ5KSwKKwkgICAgICBjb21wYXJlX2RlbHRhX2VudHJ5KTsKKworCS8qCisJICogU2Vjb25kIHBhc3M6CisJICogLSBmb3IgYWxsIG5vbi1kZWx0YSBvYmplY3RzLCBsb29rIGlmIGl0IGlzIHVzZWQgYXMgYSBiYXNlIGZvcgorCSAqICAgZGVsdGFzOworCSAqIC0gaWYgdXNlZCBhcyBhIGJhc2UsIHVuY29tcHJlc3MgdGhlIG9iamVjdCBhbmQgYXBwbHkgYWxsIGRlbHRhcywKKwkgKiAgIHJlY3Vyc2l2ZWx5IGNoZWNraW5nIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGlzIHVzZWQgYXMgYSBiYXNlCisJICogICBmb3Igc29tZSBtb3JlIGRlbHRhcy4KKwkgKi8KKwlpZiAodmVyYm9zZSkKKwkJc3RhcnRfcHJvZ3Jlc3MoJnByb2dyZXNzLCAiUmVzb2x2aW5nICV1IGRlbHRhcy4uLiIsICIiLCBucl9kZWx0YXMpOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gJm9iamVjdHNbaV07CisJCXVuaW9uIGRlbHRhX2Jhc2UgYmFzZTsKKwkJaW50IGosIHJlZiwgcmVmX2ZpcnN0LCByZWZfbGFzdCwgb2ZzLCBvZnNfZmlyc3QsIG9mc19sYXN0OworCisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1JFRl9ERUxUQSB8fCBvYmotPnR5cGUgPT0gT0JKX09GU19ERUxUQSkKKwkJCWNvbnRpbnVlOworCQloYXNoY3B5KGJhc2Uuc2hhMSwgb2JqLT5zaGExKTsKKwkJcmVmID0gIWZpbmRfZGVsdGFfY2hpbGRyZW4oJmJhc2UsICZyZWZfZmlyc3QsICZyZWZfbGFzdCk7CisJCW1lbXNldCgmYmFzZSwgMCwgc2l6ZW9mKGJhc2UpKTsKKwkJYmFzZS5vZmZzZXQgPSBvYmotPm9mZnNldDsKKwkJb2ZzID0gIWZpbmRfZGVsdGFfY2hpbGRyZW4oJmJhc2UsICZvZnNfZmlyc3QsICZvZnNfbGFzdCk7CisJCWlmICghcmVmICYmICFvZnMpCisJCQljb250aW51ZTsKKwkJZGF0YSA9IGdldF9kYXRhX2Zyb21fcGFjayhvYmopOworCQlpZiAocmVmKQorCQkJZm9yIChqID0gcmVmX2ZpcnN0OyBqIDw9IHJlZl9sYXN0OyBqKyspIHsKKwkJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG9iamVjdHMgKyBkZWx0YXNbal0ub2JqX25vOworCQkJCWlmIChjaGlsZC0+cmVhbF90eXBlID09IE9CSl9SRUZfREVMVEEpCisJCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIGRhdGEsCisJCQkJCQkgICAgICBvYmotPnNpemUsIG9iai0+dHlwZSk7CisJCQl9CisJCWlmIChvZnMpCisJCQlmb3IgKGogPSBvZnNfZmlyc3Q7IGogPD0gb2ZzX2xhc3Q7IGorKykgeworCQkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gb2JqZWN0cyArIGRlbHRhc1tqXS5vYmpfbm87CisJCQkJaWYgKGNoaWxkLT5yZWFsX3R5cGUgPT0gT0JKX09GU19ERUxUQSkKKwkJCQkJcmVzb2x2ZV9kZWx0YShjaGlsZCwgZGF0YSwKKwkJCQkJCSAgICAgIG9iai0+c2l6ZSwgb2JqLT50eXBlKTsKKwkJCX0KKwkJZnJlZShkYXRhKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlkaXNwbGF5X3Byb2dyZXNzKCZwcm9ncmVzcywgbnJfcmVzb2x2ZWRfZGVsdGFzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY29tcHJlc3NlZChpbnQgZmQsIHZvaWQgKmluLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdWludDMyX3QgKm9ial9jcmMpCit7CisJel9zdHJlYW0gc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgbWF4c2l6ZTsKKwl2b2lkICpvdXQ7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwpOworCW1heHNpemUgPSBkZWZsYXRlQm91bmQoJnN0cmVhbSwgc2l6ZSk7CisJb3V0ID0geG1hbGxvYyhtYXhzaXplKTsKKworCS8qIENvbXByZXNzIGl0ICovCisJc3RyZWFtLm5leHRfaW4gPSBpbjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXN0cmVhbS5uZXh0X291dCA9IG91dDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gbWF4c2l6ZTsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSyk7CisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKworCXNpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXdyaXRlX29yX2RpZShmZCwgb3V0LCBzaXplKTsKKwkqb2JqX2NyYyA9IGNyYzMyKCpvYmpfY3JjLCBvdXQsIHNpemUpOworCWZyZWUob3V0KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX29ial90b19wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAmb2JqZWN0c1tucl9vYmplY3RzKytdOworCXVuc2lnbmVkIGNoYXIgaGVhZGVyWzEwXTsKKwl1bnNpZ25lZCBsb25nIHMgPSBzaXplOworCWludCBuID0gMDsKKwl1bnNpZ25lZCBjaGFyIGMgPSAodHlwZSA8PCA0KSB8IChzICYgMTUpOworCXMgPj49IDQ7CisJd2hpbGUgKHMpIHsKKwkJaGVhZGVyW24rK10gPSBjIHwgMHg4MDsKKwkJYyA9IHMgJiAweDdmOworCQlzID4+PSA3OworCX0KKwloZWFkZXJbbisrXSA9IGM7CisJd3JpdGVfb3JfZGllKG91dHB1dF9mZCwgaGVhZGVyLCBuKTsKKwlvYmpbMF0uY3JjMzIgPSBjcmMzMigwLCBaX05VTEwsIDApOworCW9ialswXS5jcmMzMiA9IGNyYzMyKG9ialswXS5jcmMzMiwgaGVhZGVyLCBuKTsKKwlvYmpbMV0ub2Zmc2V0ID0gb2JqWzBdLm9mZnNldCArIG47CisJb2JqWzFdLm9mZnNldCArPSB3cml0ZV9jb21wcmVzc2VkKG91dHB1dF9mZCwgYnVmLCBzaXplLCAmb2JqWzBdLmNyYzMyKTsKKwloYXNoY3B5KG9iai0+c2hhMSwgc2hhMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsdGFfcG9zX2NvbXBhcmUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCXN0cnVjdCBkZWx0YV9lbnRyeSAqYSA9ICooc3RydWN0IGRlbHRhX2VudHJ5ICoqKV9hOworCXN0cnVjdCBkZWx0YV9lbnRyeSAqYiA9ICooc3RydWN0IGRlbHRhX2VudHJ5ICoqKV9iOworCXJldHVybiBhLT5vYmpfbm8gLSBiLT5vYmpfbm87Cit9CisKK3N0YXRpYyB2b2lkIGZpeF91bnJlc29sdmVkX2RlbHRhcyhpbnQgbnJfdW5yZXNvbHZlZCkKK3sKKwlzdHJ1Y3QgZGVsdGFfZW50cnkgKipzb3J0ZWRfYnlfcG9zOworCWludCBpLCBuID0gMDsKKworCS8qCisJICogU2luY2UgbWFueSB1bnJlc29sdmVkIGRlbHRhcyBtYXkgd2VsbCBiZSB0aGVtc2VsdmVzIGJhc2Ugb2JqZWN0cworCSAqIGZvciBtb3JlIHVucmVzb2x2ZWQgZGVsdGFzLCB3ZSByZWFsbHkgd2FudCB0byBpbmNsdWRlIHRoZQorCSAqIHNtYWxsZXN0IG51bWJlciBvZiBiYXNlIG9iamVjdHMgdGhhdCB3b3VsZCBjb3ZlciBhcyBtdWNoIGRlbHRhCisJICogYXMgcG9zc2libGUgYnkgcGlja2luZyB0aGUKKwkgKiB0cnVuYyBkZWx0YXMgZmlyc3QsIGFsbG93aW5nIGZvciBvdGhlciBkZWx0YXMgdG8gcmVzb2x2ZSB3aXRob3V0CisJICogYWRkaXRpb25hbCBiYXNlIG9iamVjdHMuICBTaW5jZSBtb3N0IGJhc2Ugb2JqZWN0cyBhcmUgdG8gYmUgZm91bmQKKwkgKiBiZWZvcmUgZGVsdGFzIGRlcGVuZGluZyBvbiB0aGVtLCBhIGdvb2QgaGV1cmlzdGljIGlzIHRvIHN0YXJ0CisJICogcmVzb2x2aW5nIGRlbHRhcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgcGFjay4KKwkgKi8KKwlzb3J0ZWRfYnlfcG9zID0geG1hbGxvYyhucl91bnJlc29sdmVkICogc2l6ZW9mKCpzb3J0ZWRfYnlfcG9zKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX2RlbHRhczsgaSsrKSB7CisJCWlmIChvYmplY3RzW2RlbHRhc1tpXS5vYmpfbm9dLnJlYWxfdHlwZSAhPSBPQkpfUkVGX0RFTFRBKQorCQkJY29udGludWU7CisJCXNvcnRlZF9ieV9wb3NbbisrXSA9ICZkZWx0YXNbaV07CisJfQorCXFzb3J0KHNvcnRlZF9ieV9wb3MsIG4sIHNpemVvZigqc29ydGVkX2J5X3BvcyksIGRlbHRhX3Bvc19jb21wYXJlKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJc3RydWN0IGRlbHRhX2VudHJ5ICpkID0gc29ydGVkX2J5X3Bvc1tpXTsKKwkJdm9pZCAqZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCWludCBqLCBmaXJzdCwgbGFzdDsKKworCQlpZiAob2JqZWN0c1tkLT5vYmpfbm9dLnJlYWxfdHlwZSAhPSBPQkpfUkVGX0RFTFRBKQorCQkJY29udGludWU7CisJCWRhdGEgPSByZWFkX3NoYTFfZmlsZShkLT5iYXNlLnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCWZpbmRfZGVsdGFfY2hpbGRyZW4oJmQtPmJhc2UsICZmaXJzdCwgJmxhc3QpOworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gb2JqZWN0cyArIGRlbHRhc1tqXS5vYmpfbm87CisJCQlpZiAoY2hpbGQtPnJlYWxfdHlwZSA9PSBPQkpfUkVGX0RFTFRBKQorCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIGRhdGEsIHNpemUsIHR5cGUpOworCQl9CisKKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKGQtPmJhc2Uuc2hhMSwgZGF0YSwgc2l6ZSwgdHlwZW5hbWUodHlwZSkpKQorCQkJZGllKCJsb2NhbCBvYmplY3QgJXMgaXMgY29ycnVwdCIsIHNoYTFfdG9faGV4KGQtPmJhc2Uuc2hhMSkpOworCQlhcHBlbmRfb2JqX3RvX3BhY2soZC0+YmFzZS5zaGExLCBkYXRhLCBzaXplLCB0eXBlKTsKKwkJZnJlZShkYXRhKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlkaXNwbGF5X3Byb2dyZXNzKCZwcm9ncmVzcywgbnJfcmVzb2x2ZWRfZGVsdGFzKTsKKwl9CisJZnJlZShzb3J0ZWRfYnlfcG9zKTsKK30KKworc3RhdGljIHVpbnQzMl90IGluZGV4X2RlZmF1bHRfdmVyc2lvbiA9IDE7CitzdGF0aWMgdWludDMyX3QgaW5kZXhfb2ZmMzJfbGltaXQgPSAweDdmZmZmZmZmOworCitzdGF0aWMgaW50IHNoYTFfY29tcGFyZShjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqYSA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9iOworCXJldHVybiBoYXNoY21wKGEtPnNoYTEsIGItPnNoYTEpOworfQorCisvKgorICogT24gZW50cnkgKnNoYTEgY29udGFpbnMgdGhlIHBhY2sgY29udGVudCBTSEExIGhhc2gsIG9uIGV4aXQgaXQgaXMKKyAqIHRoZSBTSEExIGhhc2ggb2Ygc29ydGVkIG9iamVjdCBuYW1lcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKndyaXRlX2luZGV4X2ZpbGUoY29uc3QgY2hhciAqaW5kZXhfbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmY7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqbGlzdCwgKipsYXN0OworCXVpbnQzMl90IGFycmF5WzI1Nl07CisJaW50IGksIGZkOworCVNIQV9DVFggY3R4OworCXVpbnQzMl90IGluZGV4X3ZlcnNpb247CisKKwlpZiAobnJfb2JqZWN0cykgeworCQlzb3J0ZWRfYnlfc2hhID0KKwkJCXhjYWxsb2MobnJfb2JqZWN0cywgc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkgKikpOworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJbGFzdCA9IHNvcnRlZF9ieV9zaGEgKyBucl9vYmplY3RzOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgKytpKQorCQkJc29ydGVkX2J5X3NoYVtpXSA9ICZvYmplY3RzW2ldOworCQlxc29ydChzb3J0ZWRfYnlfc2hhLCBucl9vYmplY3RzLCBzaXplb2Yoc29ydGVkX2J5X3NoYVswXSksCisJCSAgICAgIHNoYTFfY29tcGFyZSk7CisJfQorCWVsc2UKKwkJc29ydGVkX2J5X3NoYSA9IGxpc3QgPSBsYXN0ID0gTlVMTDsKKworCWlmICghaW5kZXhfbmFtZSkgeworCQlzdGF0aWMgY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwkJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkJICIlcy90bXBfaWR4X1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCQlmZCA9IG1rc3RlbXAodG1wZmlsZSk7CisJCWluZGV4X25hbWUgPSB4c3RyZHVwKHRtcGZpbGUpOworCX0gZWxzZSB7CisJCXVubGluayhpbmRleF9uYW1lKTsKKwkJZmQgPSBvcGVuKGluZGV4X25hbWUsIE9fQ1JFQVR8T19FWENMfE9fV1JPTkxZLCAwNjAwKTsKKwl9CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlICVzOiAlcyIsIGluZGV4X25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZiA9IHNoYTFmZChmZCwgaW5kZXhfbmFtZSk7CisKKwkvKiBpZiBsYXN0IG9iamVjdCdzIG9mZnNldCBpcyA+PSAyXjMxIHdlIHNob3VsZCB1c2UgaW5kZXggVjIgKi8KKwlpbmRleF92ZXJzaW9uID0gKG9iamVjdHNbbnJfb2JqZWN0cy0xXS5vZmZzZXQgPj4gMzEpID8gMiA6IGluZGV4X2RlZmF1bHRfdmVyc2lvbjsKKworCS8qIGluZGV4IHZlcnNpb25zIDIgYW5kIGFib3ZlIG5lZWQgYSBoZWFkZXIgKi8KKwlpZiAoaW5kZXhfdmVyc2lvbiA+PSAyKSB7CisJCXN0cnVjdCBwYWNrX2lkeF9oZWFkZXIgaGRyOworCQloZHIuaWR4X3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfSURYX1NJR05BVFVSRSk7CisJCWhkci5pZHhfdmVyc2lvbiA9IGh0b25sKGluZGV4X3ZlcnNpb24pOworCQlzaGExd3JpdGUoZiwgJmhkciwgc2l6ZW9mKGhkcikpOworCX0KKworCS8qCisJICogV3JpdGUgdGhlIGZpcnN0LWxldmVsIHRhYmxlICh0aGUgbGlzdCBpcyBzb3J0ZWQsCisJICogYnV0IHdlIHVzZSBhIDI1Ni1lbnRyeSBsb29rdXAgdG8gYmUgYWJsZSB0byBhdm9pZAorCSAqIGhhdmluZyB0byBkbyBlaWdodCBleHRyYSBiaW5hcnkgc2VhcmNoIGl0ZXJhdGlvbnMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbmV4dCA9IGxpc3Q7CisJCXdoaWxlIChuZXh0IDwgbGFzdCkgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gKm5leHQ7CisJCQlpZiAob2JqLT5zaGExWzBdICE9IGkpCisJCQkJYnJlYWs7CisJCQluZXh0Kys7CisJCX0KKwkJYXJyYXlbaV0gPSBodG9ubChuZXh0IC0gc29ydGVkX2J5X3NoYSk7CisJCWxpc3QgPSBuZXh0OworCX0KKwlzaGExd3JpdGUoZiwgYXJyYXksIDI1NiAqIDQpOworCisJLyogY29tcHV0ZSB0aGUgU0hBMSBoYXNoIG9mIHNvcnRlZCBvYmplY3QgbmFtZXMuICovCisJU0hBMV9Jbml0KCZjdHgpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgYWN0dWFsIFNIQTEgZW50cmllcy4uCisJICovCisJbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAqbGlzdCsrOworCQlpZiAoaW5kZXhfdmVyc2lvbiA8IDIpIHsKKwkJCXVpbnQzMl90IG9mZnNldCA9IGh0b25sKG9iai0+b2Zmc2V0KTsKKwkJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJfQorCQlzaGExd3JpdGUoZiwgb2JqLT5zaGExLCAyMCk7CisJCVNIQTFfVXBkYXRlKCZjdHgsIG9iai0+c2hhMSwgMjApOworCX0KKworCWlmIChpbmRleF92ZXJzaW9uID49IDIpIHsKKwkJdW5zaWduZWQgaW50IG5yX2xhcmdlX29mZnNldCA9IDA7CisKKwkJLyogd3JpdGUgdGhlIGNyYzMyIHRhYmxlICovCisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAqbGlzdCsrOworCQkJdWludDMyX3QgY3JjMzJfdmFsID0gaHRvbmwob2JqLT5jcmMzMik7CisJCQlzaGExd3JpdGUoZiwgJmNyYzMyX3ZhbCwgNCk7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgMzItYml0IG9mZnNldCB0YWJsZSAqLworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gKmxpc3QrKzsKKwkJCXVpbnQzMl90IG9mZnNldCA9IChvYmotPm9mZnNldCA8PSBpbmRleF9vZmYzMl9saW1pdCkgPworCQkJCW9iai0+b2Zmc2V0IDogKDB4ODAwMDAwMDAgfCBucl9sYXJnZV9vZmZzZXQrKyk7CisJCQlvZmZzZXQgPSBodG9ubChvZmZzZXQpOworCQkJc2hhMXdyaXRlKGYsICZvZmZzZXQsIDQpOworCQl9CisKKwkJLyogd3JpdGUgdGhlIGxhcmdlIG9mZnNldCB0YWJsZSAqLworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJd2hpbGUgKG5yX2xhcmdlX29mZnNldCkgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gKmxpc3QrKzsKKwkJCXVpbnQ2NF90IG9mZnNldCA9IG9iai0+b2Zmc2V0OworCQkJaWYgKG9mZnNldCA+IGluZGV4X29mZjMyX2xpbWl0KSB7CisJCQkJdWludDMyX3Qgc3BsaXRbMl07CisJCQkJc3BsaXRbMF0JPSBodG9ubChvZmZzZXQgPj4gMzIpOworCQkJCXNwbGl0WzFdID0gaHRvbmwob2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCQkJc2hhMXdyaXRlKGYsIHNwbGl0LCA4KTsKKwkJCQlucl9sYXJnZV9vZmZzZXQtLTsKKwkJCX0KKwkJfQorCX0KKworCXNoYTF3cml0ZShmLCBzaGExLCAyMCk7CisJc2hhMWNsb3NlKGYsIE5VTEwsIDEpOworCWZyZWUoc29ydGVkX2J5X3NoYSk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlyZXR1cm4gaW5kZXhfbmFtZTsKK30KKworc3RhdGljIHZvaWQgZmluYWwoY29uc3QgY2hhciAqZmluYWxfcGFja19uYW1lLCBjb25zdCBjaGFyICpjdXJyX3BhY2tfbmFtZSwKKwkJICBjb25zdCBjaGFyICpmaW5hbF9pbmRleF9uYW1lLCBjb25zdCBjaGFyICpjdXJyX2luZGV4X25hbWUsCisJCSAgY29uc3QgY2hhciAqa2VlcF9uYW1lLCBjb25zdCBjaGFyICprZWVwX21zZywKKwkJICB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNvbnN0IGNoYXIgKnJlcG9ydCA9ICJwYWNrIjsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCWludCBlcnI7CisKKwlpZiAoIWZyb21fc3RkaW4pIHsKKwkJY2xvc2UoaW5wdXRfZmQpOworCX0gZWxzZSB7CisJCWVyciA9IGNsb3NlKG91dHB1dF9mZCk7CisJCWlmIChlcnIpCisJCQlkaWUoImVycm9yIHdoaWxlIGNsb3NpbmcgcGFjayBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNobW9kKGN1cnJfcGFja19uYW1lLCAwNDQ0KTsKKwl9CisKKwlpZiAoa2VlcF9tc2cpIHsKKwkJaW50IGtlZXBfZmQsIGtlZXBfbXNnX2xlbiA9IHN0cmxlbihrZWVwX21zZyk7CisJCWlmICgha2VlcF9uYW1lKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy9wYWNrL3BhY2stJXMua2VlcCIsCisJCQkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCWtlZXBfbmFtZSA9IG5hbWU7CisJCX0KKwkJa2VlcF9mZCA9IG9wZW4oa2VlcF9uYW1lLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOworCQlpZiAoa2VlcF9mZCA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFRVhJU1QpCisJCQkJZGllKCJjYW5ub3Qgd3JpdGUga2VlcCBmaWxlIik7CisJCX0gZWxzZSB7CisJCQlpZiAoa2VlcF9tc2dfbGVuID4gMCkgeworCQkJCXdyaXRlX29yX2RpZShrZWVwX2ZkLCBrZWVwX21zZywga2VlcF9tc2dfbGVuKTsKKwkJCQl3cml0ZV9vcl9kaWUoa2VlcF9mZCwgIlxuIiwgMSk7CisJCQl9CisJCQljbG9zZShrZWVwX2ZkKTsKKwkJCXJlcG9ydCA9ICJrZWVwIjsKKwkJfQorCX0KKworCWlmIChmaW5hbF9wYWNrX25hbWUgIT0gY3Vycl9wYWNrX25hbWUpIHsKKwkJaWYgKCFmaW5hbF9wYWNrX25hbWUpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5wYWNrIiwKKwkJCQkgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJZmluYWxfcGFja19uYW1lID0gbmFtZTsKKwkJfQorCQlpZiAobW92ZV90ZW1wX3RvX2ZpbGUoY3Vycl9wYWNrX25hbWUsIGZpbmFsX3BhY2tfbmFtZSkpCisJCQlkaWUoImNhbm5vdCBzdG9yZSBwYWNrIGZpbGUiKTsKKwl9CisKKwljaG1vZChjdXJyX2luZGV4X25hbWUsIDA0NDQpOworCWlmIChmaW5hbF9pbmRleF9uYW1lICE9IGN1cnJfaW5kZXhfbmFtZSkgeworCQlpZiAoIWZpbmFsX2luZGV4X25hbWUpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5pZHgiLAorCQkJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBzaGExX3RvX2hleChzaGExKSk7CisJCQlmaW5hbF9pbmRleF9uYW1lID0gbmFtZTsKKwkJfQorCQlpZiAobW92ZV90ZW1wX3RvX2ZpbGUoY3Vycl9pbmRleF9uYW1lLCBmaW5hbF9pbmRleF9uYW1lKSkKKwkJCWRpZSgiY2Fubm90IHN0b3JlIGluZGV4IGZpbGUiKTsKKwl9CisKKwlpZiAoIWZyb21fc3RkaW4pIHsKKwkJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0gZWxzZSB7CisJCWNoYXIgYnVmWzQ4XTsKKwkJaW50IGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc1x0JXNcbiIsCisJCQkJICAgcmVwb3J0LCBzaGExX3RvX2hleChzaGExKSk7CisJCXdyaXRlX29yX2RpZSgxLCBidWYsIGxlbik7CisKKwkJLyoKKwkJICogTGV0J3MganVzdCBtaW1pYyBnaXQtdW5wYWNrLW9iamVjdHMgaGVyZSBhbmQgd3JpdGUKKwkJICogdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5wdXQgYnVmZmVyIHRvIHN0ZG91dC4KKwkJICovCisJCXdoaWxlIChpbnB1dF9sZW4pIHsKKwkJCWVyciA9IHh3cml0ZSgxLCBpbnB1dF9idWZmZXIgKyBpbnB1dF9vZmZzZXQsIGlucHV0X2xlbik7CisJCQlpZiAoZXJyIDw9IDApCisJCQkJYnJlYWs7CisJCQlpbnB1dF9sZW4gLT0gZXJyOworCQkJaW5wdXRfb2Zmc2V0ICs9IGVycjsKKwkJfQorCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBmaXhfdGhpbl9wYWNrID0gMDsKKwljb25zdCBjaGFyICpjdXJyX3BhY2ssICpwYWNrX25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmN1cnJfaW5kZXgsICppbmRleF9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICprZWVwX25hbWUgPSBOVUxMLCAqa2VlcF9tc2cgPSBOVUxMOworCWNoYXIgKmluZGV4X25hbWVfYnVmID0gTlVMTCwgKmtlZXBfbmFtZV9idWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXN0ZGluIikpIHsKKwkJCQlmcm9tX3N0ZGluID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWZpeC10aGluIikpIHsKKwkJCQlmaXhfdGhpbl9wYWNrID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWtlZXAiKSkgeworCQkJCWtlZXBfbXNnID0gIiI7CisJCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1rZWVwPSIpKSB7CisJCQkJa2VlcF9tc2cgPSBhcmcgKyA3OworCQkJfSBlbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tcGFja19oZWFkZXI9IikpIHsKKwkJCQlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcjsKKwkJCQljaGFyICpjOworCisJCQkJaGRyID0gKHN0cnVjdCBwYWNrX2hlYWRlciAqKWlucHV0X2J1ZmZlcjsKKwkJCQloZHItPmhkcl9zaWduYXR1cmUgPSBodG9ubChQQUNLX1NJR05BVFVSRSk7CisJCQkJaGRyLT5oZHJfdmVyc2lvbiA9IGh0b25sKHN0cnRvdWwoYXJnICsgMTQsICZjLCAxMCkpOworCQkJCWlmICgqYyAhPSAnLCcpCisJCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCQloZHItPmhkcl9lbnRyaWVzID0gaHRvbmwoc3RydG91bChjICsgMSwgJmMsIDEwKSk7CisJCQkJaWYgKCpjKQorCQkJCQlkaWUoImJhZCAlcyIsIGFyZyk7CisJCQkJaW5wdXRfbGVuID0gc2l6ZW9mKCpoZHIpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmcsICItbyIpKSB7CisJCQkJaWYgKGluZGV4X25hbWUgfHwgKGkrMSkgPj0gYXJnYykKKwkJCQkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJCQkJaW5kZXhfbmFtZSA9IGFyZ3ZbKytpXTsKKwkJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLWluZGV4LXZlcnNpb249IikpIHsKKwkJCQljaGFyICpjOworCQkJCWluZGV4X2RlZmF1bHRfdmVyc2lvbiA9IHN0cnRvdWwoYXJnICsgMTYsICZjLCAxMCk7CisJCQkJaWYgKGluZGV4X2RlZmF1bHRfdmVyc2lvbiA+IDIpCisJCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCQlpZiAoKmMgPT0gJywnKQorCQkJCQlpbmRleF9vZmYzMl9saW1pdCA9IHN0cnRvdWwoYysxLCAmYywgMCk7CisJCQkJaWYgKCpjIHx8IGluZGV4X29mZjMyX2xpbWl0ICYgMHg4MDAwMDAwMCkKKwkJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJfSBlbHNlCisJCQkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwYWNrX25hbWUpCisJCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwkJcGFja19uYW1lID0gYXJnOworCX0KKworCWlmICghcGFja19uYW1lICYmICFmcm9tX3N0ZGluKQorCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwlpZiAoZml4X3RoaW5fcGFjayAmJiAhZnJvbV9zdGRpbikKKwkJZGllKCItLWZpeC10aGluIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgLS1zdGRpbiIpOworCWlmICghaW5kZXhfbmFtZSAmJiBwYWNrX25hbWUpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihwYWNrX25hbWUpOworCQlpZiAoIWhhc19leHRlbnNpb24ocGFja19uYW1lLCAiLnBhY2siKSkKKwkJCWRpZSgicGFja2ZpbGUgbmFtZSAnJXMnIGRvZXMgbm90IGVuZCB3aXRoICcucGFjayciLAorCQkJICAgIHBhY2tfbmFtZSk7CisJCWluZGV4X25hbWVfYnVmID0geG1hbGxvYyhsZW4pOworCQltZW1jcHkoaW5kZXhfbmFtZV9idWYsIHBhY2tfbmFtZSwgbGVuIC0gNSk7CisJCXN0cmNweShpbmRleF9uYW1lX2J1ZiArIGxlbiAtIDUsICIuaWR4Iik7CisJCWluZGV4X25hbWUgPSBpbmRleF9uYW1lX2J1ZjsKKwl9CisJaWYgKGtlZXBfbXNnICYmICFrZWVwX25hbWUgJiYgcGFja19uYW1lKSB7CisJCWludCBsZW4gPSBzdHJsZW4ocGFja19uYW1lKTsKKwkJaWYgKCFoYXNfZXh0ZW5zaW9uKHBhY2tfbmFtZSwgIi5wYWNrIikpCisJCQlkaWUoInBhY2tmaWxlIG5hbWUgJyVzJyBkb2VzIG5vdCBlbmQgd2l0aCAnLnBhY2snIiwKKwkJCSAgICBwYWNrX25hbWUpOworCQlrZWVwX25hbWVfYnVmID0geG1hbGxvYyhsZW4pOworCQltZW1jcHkoa2VlcF9uYW1lX2J1ZiwgcGFja19uYW1lLCBsZW4gLSA1KTsKKwkJc3RyY3B5KGtlZXBfbmFtZV9idWYgKyBsZW4gLSA1LCAiLmtlZXAiKTsKKwkJa2VlcF9uYW1lID0ga2VlcF9uYW1lX2J1ZjsKKwl9CisKKwljdXJyX3BhY2sgPSBvcGVuX3BhY2tfZmlsZShwYWNrX25hbWUpOworCXBhcnNlX3BhY2tfaGVhZGVyKCk7CisJb2JqZWN0cyA9IHhtYWxsb2MoKG5yX29iamVjdHMgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSk7CisJZGVsdGFzID0geG1hbGxvYyhucl9vYmplY3RzICogc2l6ZW9mKHN0cnVjdCBkZWx0YV9lbnRyeSkpOworCXBhcnNlX3BhY2tfb2JqZWN0cyhzaGExKTsKKwlpZiAobnJfZGVsdGFzID09IG5yX3Jlc29sdmVkX2RlbHRhcykgeworCQlpZiAodmVyYm9zZSkKKwkJCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzKTsKKwkJLyogRmx1c2ggcmVtYWluaW5nIHBhY2sgZmluYWwgMjAtYnl0ZSBTSEExLiAqLworCQlmbHVzaCgpOworCX0gZWxzZSB7CisJCWlmIChmaXhfdGhpbl9wYWNrKSB7CisJCQlpbnQgbnJfdW5yZXNvbHZlZCA9IG5yX2RlbHRhcyAtIG5yX3Jlc29sdmVkX2RlbHRhczsKKwkJCWludCBucl9vYmplY3RzX2luaXRpYWwgPSBucl9vYmplY3RzOworCQkJaWYgKG5yX3VucmVzb2x2ZWQgPD0gMCkKKwkJCQlkaWUoImNvbmZ1c2lvbiBiZXlvbmQgaW5zYW5pdHkiKTsKKwkJCW9iamVjdHMgPSB4cmVhbGxvYyhvYmplY3RzLAorCQkJCQkgICAobnJfb2JqZWN0cyArIG5yX3VucmVzb2x2ZWQgKyAxKQorCQkJCQkgICAqIHNpemVvZigqb2JqZWN0cykpOworCQkJZml4X3VucmVzb2x2ZWRfZGVsdGFzKG5yX3VucmVzb2x2ZWQpOworCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQlzdG9wX3Byb2dyZXNzKCZwcm9ncmVzcyk7CisJCQkJZnByaW50ZihzdGRlcnIsICIlZCBvYmplY3RzIHdlcmUgYWRkZWQgdG8gY29tcGxldGUgdGhpcyB0aGluIHBhY2suXG4iLAorCQkJCQlucl9vYmplY3RzIC0gbnJfb2JqZWN0c19pbml0aWFsKTsKKwkJCX0KKwkJCWZpeHVwX3BhY2tfaGVhZGVyX2Zvb3RlcihvdXRwdXRfZmQsIHNoYTEsCisJCQkJY3Vycl9wYWNrLCBucl9vYmplY3RzKTsKKwkJfQorCQlpZiAobnJfZGVsdGFzICE9IG5yX3Jlc29sdmVkX2RlbHRhcykKKwkJCWRpZSgicGFjayBoYXMgJWQgdW5yZXNvbHZlZCBkZWx0YXMiLAorCQkJICAgIG5yX2RlbHRhcyAtIG5yX3Jlc29sdmVkX2RlbHRhcyk7CisJfQorCWZyZWUoZGVsdGFzKTsKKwljdXJyX2luZGV4ID0gd3JpdGVfaW5kZXhfZmlsZShpbmRleF9uYW1lLCBzaGExKTsKKwlmaW5hbChwYWNrX25hbWUsIGN1cnJfcGFjaywKKwkJaW5kZXhfbmFtZSwgY3Vycl9pbmRleCwKKwkJa2VlcF9uYW1lLCBrZWVwX21zZywKKwkJc2hhMSk7CisJZnJlZShvYmplY3RzKTsKKwlmcmVlKGluZGV4X25hbWVfYnVmKTsKKwlmcmVlKGtlZXBfbmFtZV9idWYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbnRlcnBvbGF0ZS5jIGIvaW50ZXJwb2xhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjMwNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJwb2xhdGUuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2IEpvbiBMb2VsaWdlcgorICovCisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJpbnRlcnBvbGF0ZS5oIgorCisKK3ZvaWQgaW50ZXJwX3NldF9lbnRyeShzdHJ1Y3QgaW50ZXJwICp0YWJsZSwgaW50IHNsb3QsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWNoYXIgKm9sZHZhbCA9IHRhYmxlW3Nsb3RdLnZhbHVlOworCWNoYXIgKm5ld3ZhbCA9IE5VTEw7CisKKwlpZiAob2xkdmFsKQorCQlmcmVlKG9sZHZhbCk7CisKKwlpZiAodmFsdWUpCisJCW5ld3ZhbCA9IHhzdHJkdXAodmFsdWUpOworCisJdGFibGVbc2xvdF0udmFsdWUgPSBuZXd2YWw7Cit9CisKKwordm9pZCBpbnRlcnBfY2xlYXJfdGFibGUoc3RydWN0IGludGVycCAqdGFibGUsIGludCBuaW50ZXJwcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuaW50ZXJwczsgaSsrKSB7CisJCWludGVycF9zZXRfZW50cnkodGFibGUsIGksIE5VTEwpOworCX0KK30KKworCisvKgorICogQ29udmVydCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiBidWZmZXIgb3JpZworICogaW50byB0aGUgc3VwcGxpZWQgYnVmZmVyLCByZXN1bHQsIHdob3NlIGxlbmd0aCBpcyByZXNsZW4sCisgKiBwZXJmb3JtaW5nIHN1YnN0aXR1dGlvbnMgb24gJS1uYW1lZCBzdWItc3RyaW5ncyBmcm9tCisgKiB0aGUgdGFibGUsIGludGVycHMsIHdpdGggbmludGVycHMgZW50cmllcy4KKyAqCisgKiBFeGFtcGxlIGludGVycHM6CisgKiAgICB7CisgKiAgICAgICAgeyAiJUgiLCAiZXhhbXBsZS5vcmcifSwKKyAqICAgICAgICB7ICIlcG9ydCIsICIxMjMifSwKKyAqICAgICAgICB7ICIlJSIsICIlIn0sCisgKiAgICB9CisgKgorICogUmV0dXJucyAxIG9uIGEgc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb24gcGFzcyB0aGF0IGZpdHMgaW4gcmVzdWx0LAorICogUmV0dXJucyAwIG9uIGEgZmFpbGVkIG9yIG92ZXJmbG93aW5nIHN1YnN0aXR1dGlvbiBwYXNzLgorICovCisKK2ludCBpbnRlcnBvbGF0ZShjaGFyICpyZXN1bHQsIGludCByZXNsZW4sCisJCWNvbnN0IGNoYXIgKm9yaWcsCisJCWNvbnN0IHN0cnVjdCBpbnRlcnAgKmludGVycHMsIGludCBuaW50ZXJwcykKK3sKKwljb25zdCBjaGFyICpzcmMgPSBvcmlnOworCWNoYXIgKmRlc3QgPSByZXN1bHQ7CisJaW50IG5ld2xlbiA9IDA7CisJY29uc3QgY2hhciAqbmFtZSwgKnZhbHVlOworCWludCBuYW1lbGVuLCB2YWx1ZWxlbjsKKwlpbnQgaTsKKwljaGFyIGM7CisKKyAgICAgICAgbWVtc2V0KHJlc3VsdCwgMCwgcmVzbGVuKTsKKworCXdoaWxlICgoYyA9ICpzcmMpICYmIG5ld2xlbiA8IHJlc2xlbiAtIDEpIHsKKwkJaWYgKGMgPT0gJyUnKSB7CisJCQkvKiBUcnkgdG8gbWF0Y2ggYW4gaW50ZXJwb2xhdGlvbiBzdHJpbmcuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbmludGVycHM7IGkrKykgeworCQkJCW5hbWUgPSBpbnRlcnBzW2ldLm5hbWU7CisJCQkJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJCQlpZiAoc3RybmNtcChzcmMsIG5hbWUsIG5hbWVsZW4pID09IDApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBDaGVjayBmb3IgdmFsaWQgaW50ZXJwb2xhdGlvbi4gKi8KKwkJCWlmIChpIDwgbmludGVycHMpIHsKKwkJCQl2YWx1ZSA9IGludGVycHNbaV0udmFsdWU7CisJCQkJdmFsdWVsZW4gPSBzdHJsZW4odmFsdWUpOworCisJCQkJaWYgKG5ld2xlbiArIHZhbHVlbGVuIDwgcmVzbGVuIC0gMSkgeworCQkJCQkvKiBTdWJzdGl0dXRlLiAqLworCQkJCQlzdHJuY3B5KGRlc3QsIHZhbHVlLCB2YWx1ZWxlbik7CisJCQkJCW5ld2xlbiArPSB2YWx1ZWxlbjsKKwkJCQkJZGVzdCArPSB2YWx1ZWxlbjsKKwkJCQkJc3JjICs9IG5hbWVsZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogU29tZXRoaW5nJ3Mgbm90IGZpdHRpbmcuICovCisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvKiBTa2lwIGJvZ3VzIGludGVycG9sYXRpb24uICovCisJCQkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJCQluZXdsZW4rKzsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJLyogU3RyYWlnaHQgY29weSBvbmUgbm9uLWludGVycG9sYXRpb24gY2hhcmFjdGVyLiAqLworCQkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJCW5ld2xlbisrOworCQl9CisJfQorCisJcmV0dXJuIG5ld2xlbiA8IHJlc2xlbiAtIDE7Cit9CmRpZmYgLS1naXQgYS9pbnRlcnBvbGF0ZS5oIGIvaW50ZXJwb2xhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEyNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJwb2xhdGUuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDYgSm9uIExvZWxpZ2VyCisgKi8KKworI2lmbmRlZiBJTlRFUlBPTEFURV9ICisjZGVmaW5lIElOVEVSUE9MQVRFX0gKKworLyoKKyAqIENvbnZlcnQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gYnVmZmVyIG9yaWcsCisgKiBwZXJmb3JtaW5nIHN1YnN0aXR1dGlvbnMgb24gJS1uYW1lZCBzdWItc3RyaW5ncyBmcm9tCisgKiB0aGUgaW50ZXJwcmV0YXRpb24gdGFibGUuCisgKi8KKworc3RydWN0IGludGVycCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKK307CisKK2V4dGVybiB2b2lkIGludGVycF9zZXRfZW50cnkoc3RydWN0IGludGVycCAqdGFibGUsIGludCBzbG90LCBjb25zdCBjaGFyICp2YWx1ZSk7CitleHRlcm4gdm9pZCBpbnRlcnBfY2xlYXJfdGFibGUoc3RydWN0IGludGVycCAqdGFibGUsIGludCBuaW50ZXJwcyk7CisKK2V4dGVybiBpbnQgaW50ZXJwb2xhdGUoY2hhciAqcmVzdWx0LCBpbnQgcmVzbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqb3JpZywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcnAgKmludGVycHMsIGludCBuaW50ZXJwcyk7CisKKyNlbmRpZiAvKiBJTlRFUlBPTEFURV9IICovCmRpZmYgLS1naXQgYS9saXN0LW9iamVjdHMuYyBiL2xpc3Qtb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGY4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saXN0LW9iamVjdHMuYwpAQCAtMCwwICsxLDE3MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsaXN0LW9iamVjdHMuaCIKKworc3RhdGljIHZvaWQgcHJvY2Vzc19ibG9iKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSBzdHJ1Y3QgYmxvYiAqYmxvYiwKKwkJCSBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmYmxvYi0+b2JqZWN0OworCisJaWYgKCFyZXZzLT5ibG9iX29iamVjdHMpCisJCXJldHVybjsKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHhzdHJkdXAobmFtZSk7CisJYWRkX29iamVjdChvYmosIHAsIHBhdGgsIG5hbWUpOworfQorCisvKgorICogUHJvY2Vzc2luZyBhIGdpdGxpbmsgZW50cnkgY3VycmVudGx5IGRvZXMgbm90aGluZywgc2luY2UKKyAqIHdlIGRvIG5vdCByZWN1cnNlIGludG8gdGhlIHN1YnByb2plY3QuCisgKgorICogV2UgKmNvdWxkKiBldmVudHVhbGx5IGFkZCBhIGZsYWcgdGhhdCBhY3R1YWxseSBkb2VzIHRoYXQsCisgKiB3aGljaCB3b3VsZCBpbnZvbHZlOgorICogIC0gaXMgdGhlIHN1YnByb2plY3QgYWN0dWFsbHkgY2hlY2tlZCBvdXQ/CisgKiAgLSBpZiBzbywgc2VlIGlmIHRoZSBzdWJwcm9qZWN0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKKyAqICAgIHRvIHRoZSBhbHRlcm5hdGVzIGxpc3QsIGFuZCBhZGQgaXQgaWYgbm90LgorICogIC0gcHJvY2VzcyB0aGUgY29tbWl0IChvciB0YWcpIHRoZSBnaXRsaW5rIHBvaW50cyB0bworICogICAgcmVjdXJzaXZlbHkuCisgKgorICogSG93ZXZlciwgaXQncyB1bmNsZWFyIHdoZXRoZXIgdGhlcmUgaXMgcmVhbGx5IGV2ZXIgYW55CisgKiByZWFzb24gdG8gc2VlIHN1cGVycHJvamVjdHMgYW5kIHN1YnByb2plY3RzIGFzIHN1Y2ggYQorICogInVuaWZpZWQiIG9iamVjdCBwb29sIChwb3RlbnRpYWxseSByZXN1bHRpbmcgaW4gYSB0b3RhbGx5CisgKiBodW1vbmdvdXMgcGFjayAtIGF2b2lkaW5nIHdoaWNoIHdhcyB0aGUgd2hvbGUgcG9pbnQgb2YKKyAqIGhhdmluZyBnaXRsaW5rcyBpbiB0aGUgZmlyc3QgcGxhY2UhKS4KKyAqCisgKiBTbyBmb3Igbm93LCB0aGVyZSBpcyBqdXN0IGEgbm90ZSB0aGF0IHdlICpjb3VsZCogZm9sbG93CisgKiB0aGUgbGluaywgYW5kIGhvdyB0byBkbyBpdC4gV2hldGhlciBpdCBuZWNlc3NhcmlseSBtYWtlcworICogYW55IHNlbnNlIHdoYXQtc28tZXZlciB0byBldmVyIGRvIHRoYXQgaXMgYW5vdGhlciBpc3N1ZS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19naXRsaW5rKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICAgIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgICAgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190cmVlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSBzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCSBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgbmFtZV9wYXRoIG1lOworCisJaWYgKCFyZXZzLT50cmVlX29iamVjdHMpCisJCXJldHVybjsKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybjsKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSA8IDApCisJCWRpZSgiYmFkIHRyZWUgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJb2JqLT5mbGFncyB8PSBTRUVOOworCW5hbWUgPSB4c3RyZHVwKG5hbWUpOworCWFkZF9vYmplY3Qob2JqLCBwLCBwYXRoLCBuYW1lKTsKKwltZS51cCA9IHBhdGg7CisJbWUuZWxlbSA9IG5hbWU7CisJbWUuZWxlbV9sZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJcHJvY2Vzc190cmVlKHJldnMsCisJCQkJICAgICBsb29rdXBfdHJlZShlbnRyeS5zaGExKSwKKwkJCQkgICAgIHAsICZtZSwgZW50cnkucGF0aCk7CisJCWVsc2UgaWYgKFNfSVNESVJMTksoZW50cnkubW9kZSkpCisJCQlwcm9jZXNzX2dpdGxpbmsocmV2cywgZW50cnkuc2hhMSwKKwkJCQkJcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwkJZWxzZQorCQkJcHJvY2Vzc19ibG9iKHJldnMsCisJCQkJICAgICBsb29rdXBfYmxvYihlbnRyeS5zaGExKSwKKwkJCQkgICAgIHAsICZtZSwgZW50cnkucGF0aCk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkJICAgIHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCQkJICAgIHNob3dfZWRnZV9mbiBzaG93X2VkZ2UpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAoIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY29udGludWU7CisJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKHBhcmVudC0+dHJlZSk7CisJCWlmIChyZXZzLT5lZGdlX2hpbnQgJiYgIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFNIT1dOKSkgeworCQkJcGFyZW50LT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisJCQlzaG93X2VkZ2UocGFyZW50KTsKKwkJfQorCX0KK30KKwordm9pZCBtYXJrX2VkZ2VzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LAorCQkJICAgICAgc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgICAgc2hvd19lZGdlX2ZuIHNob3dfZWRnZSkKK3sKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcoY29tbWl0LT50cmVlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1hcmtfZWRnZV9wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0LCByZXZzLCBzaG93X2VkZ2UpOworCX0KK30KKwordm9pZCB0cmF2ZXJzZV9jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgIHZvaWQgKCpzaG93X2NvbW1pdCkoc3RydWN0IGNvbW1pdCAqKSwKKwkJCSAgdm9pZCAoKnNob3dfb2JqZWN0KShzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICopKQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IG9iamVjdHMgPSB7IDAsIDAsIE5VTEwgfTsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldnMpKSAhPSBOVUxMKSB7CisJCXByb2Nlc3NfdHJlZShyZXZzLCBjb21taXQtPnRyZWUsICZvYmplY3RzLCBOVUxMLCAiIik7CisJCXNob3dfY29tbWl0KGNvbW1pdCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCByZXZzLT5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqcGVuZGluZyA9IHJldnMtPnBlbmRpbmcub2JqZWN0cyArIGk7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBlbmRpbmctPml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZW5kaW5nLT5uYW1lOworCQlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCQljb250aW51ZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlvYmotPmZsYWdzIHw9IFNFRU47CisJCQlhZGRfb2JqZWN0X2FycmF5KG9iaiwgbmFtZSwgJm9iamVjdHMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQkJcHJvY2Vzc190cmVlKHJldnMsIChzdHJ1Y3QgdHJlZSAqKW9iaiwgJm9iamVjdHMsCisJCQkJICAgICBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXByb2Nlc3NfYmxvYihyZXZzLCAoc3RydWN0IGJsb2IgKilvYmosICZvYmplY3RzLAorCQkJCSAgICAgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoInVua25vd24gcGVuZGluZyBvYmplY3QgJXMgKCVzKSIsCisJCSAgICBzaGExX3RvX2hleChvYmotPnNoYTEpLCBuYW1lKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG9iamVjdHMubnI7IGkrKykKKwkJc2hvd19vYmplY3QoJm9iamVjdHMub2JqZWN0c1tpXSk7Cit9CmRpZmYgLS1naXQgYS9saXN0LW9iamVjdHMuaCBiL2xpc3Qtb2JqZWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDEzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saXN0LW9iamVjdHMuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIExJU1RfT0JKRUNUU19ICisjZGVmaW5lIExJU1RfT0JKRUNUU19ICisKK3R5cGVkZWYgdm9pZCAoKnNob3dfY29tbWl0X2ZuKShzdHJ1Y3QgY29tbWl0ICopOwordHlwZWRlZiB2b2lkICgqc2hvd19vYmplY3RfZm4pKHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKik7Cit0eXBlZGVmIHZvaWQgKCpzaG93X2VkZ2VfZm4pKHN0cnVjdCBjb21taXQgKik7CisKK3ZvaWQgdHJhdmVyc2VfY29tbWl0X2xpc3Qoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzaG93X2NvbW1pdF9mbiwgc2hvd19vYmplY3RfZm4pOworCit2b2lkIG1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKiwgc3RydWN0IHJldl9pbmZvICosIHNob3dfZWRnZV9mbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbG9jYWwtZmV0Y2guYyBiL2xvY2FsLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2NTBlZgotLS0gL2Rldi9udWxsCisrKyBiL2xvY2FsLWZldGNoLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKworc3RhdGljIGludCB1c2VfbGluazsKK3N0YXRpYyBpbnQgdXNlX3N5bWxpbms7CitzdGF0aWMgaW50IHVzZV9maWxlY29weSA9IDE7CitzdGF0aWMgaW50IGNvbW1pdHNfb25fc3RkaW47CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXRoOyAvKiAiUmVtb3RlIiBnaXQgcmVwb3NpdG9yeSAqLworCit2b2lkIHByZWZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3M7CisKK3N0YXRpYyB2b2lkIHNldHVwX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKm5ld19wYWNrOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCXN0cmNweShmaWxlbmFtZSwgcGF0aCk7CisJc3RyY2F0KGZpbGVuYW1lLCAiL29iamVjdHMvcGFjay9wYWNrLSIpOworCXN0cmNhdChmaWxlbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCXN0cmNhdChmaWxlbmFtZSwgIi5pZHgiKTsKKwluZXdfcGFjayA9IHBhcnNlX3BhY2tfaW5kZXhfZmlsZShzaGExLCBmaWxlbmFtZSk7CisJbmV3X3BhY2stPm5leHQgPSBwYWNrczsKKwlwYWNrcyA9IG5ld19wYWNrOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGljZXModm9pZCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXNwcmludGYoZmlsZW5hbWUsICIlcy9vYmplY3RzL3BhY2svIiwgcGF0aCk7CisJZGlyID0gb3BlbmRpcihmaWxlbmFtZSk7CisJaWYgKCFkaXIpCisJCXJldHVybiAtMTsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQlpZiAobmFtZWxlbiAhPSA1MCB8fAorCQkgICAgIWhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5wYWNrIikpCisJCQljb250aW51ZTsKKwkJZ2V0X3NoYTFfaGV4KGRlLT5kX25hbWUgKyA1LCBzaGExKTsKKwkJc2V0dXBfaW5kZXgoc2hhMSk7CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCwgY29uc3QgY2hhciAqaGV4LAorCQkgICAgIGludCB3YXJuX2lmX25vdF9leGlzdHMpCit7CisJc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhkZXN0KTsKKwlpZiAodXNlX2xpbmspIHsKKwkJaWYgKCFsaW5rKHNvdXJjZSwgZGVzdCkpIHsKKwkJCXB1bGxfc2F5KCJsaW5rICVzXG4iLCBoZXgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogSWYgd2UgZ290IEVOT0VOVCB0aGVyZSBpcyBubyBwb2ludCBjb250aW51aW5nLiAqLworCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQlpZiAoIXdhcm5faWZfbm90X2V4aXN0cykKKwkJCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gZXJyb3IoImRvZXMgbm90IGV4aXN0ICVzIiwgc291cmNlKTsKKwkJfQorCX0KKwlpZiAodXNlX3N5bWxpbmspIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChzdGF0KHNvdXJjZSwgJnN0KSkgeworCQkJaWYgKCF3YXJuX2lmX25vdF9leGlzdHMgJiYgZXJybm8gPT0gRU5PRU5UKQorCQkJCXJldHVybiAtMTsKKwkJCXJldHVybiBlcnJvcigiY2Fubm90IHN0YXQgJXM6ICVzIiwgc291cmNlLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAoIXN5bWxpbmsoc291cmNlLCBkZXN0KSkgeworCQkJcHVsbF9zYXkoInN5bWxpbmsgJXNcbiIsIGhleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAodXNlX2ZpbGVjb3B5KSB7CisJCWludCBpZmQsIG9mZCwgc3RhdHVzID0gMDsKKworCQlpZmQgPSBvcGVuKHNvdXJjZSwgT19SRE9OTFkpOworCQlpZiAoaWZkIDwgMCkgeworCQkJaWYgKCF3YXJuX2lmX25vdF9leGlzdHMgJiYgZXJybm8gPT0gRU5PRU5UKQorCQkJCXJldHVybiAtMTsKKwkJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXMiLCBzb3VyY2UpOworCQl9CisJCW9mZCA9IG9wZW4oZGVzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwkJaWYgKG9mZCA8IDApIHsKKwkJCWNsb3NlKGlmZCk7CisJCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBvcGVuICVzIiwgZGVzdCk7CisJCX0KKwkJc3RhdHVzID0gY29weV9mZChpZmQsIG9mZCk7CisJCWNsb3NlKG9mZCk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gZXJyb3IoImNhbm5vdCB3cml0ZSAlcyIsIGRlc3QpOworCQlwdWxsX3NheSgiY29weSAlc1xuIiwgaGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBlcnJvcigiZmFpbGVkIHRvIGNvcHkgJXMgd2l0aCBnaXZlbiBjb3B5IG1ldGhvZHMuIiwgaGV4KTsKK30KKworc3RhdGljIGludCBmZXRjaF9wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnRhcmdldDsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlpZiAoc2V0dXBfaW5kaWNlcygpKQorCQlyZXR1cm4gLTE7CisJdGFyZ2V0ID0gZmluZF9zaGExX3BhY2soc2hhMSwgcGFja3MpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGZpbmQgJXM6IG5vdCBzZXBhcmF0ZSBvciBpbiBhbnkgcGFjayIsIAorCQkJICAgICBzaGExX3RvX2hleChzaGExKSk7CisJaWYgKGdldF92ZXJib3NlbHkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgJXNcbiIsCisJCQlzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwkJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsCisJCQlzaGExX3RvX2hleChzaGExKSk7CisJfQorCXNwcmludGYoZmlsZW5hbWUsICIlcy9vYmplY3RzL3BhY2svcGFjay0lcy5wYWNrIiwgCisJCXBhdGgsIHNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSkpOworCWNvcHlfZmlsZShmaWxlbmFtZSwgc2hhMV9wYWNrX25hbWUodGFyZ2V0LT5zaGExKSwKKwkJICBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpLCAxKTsKKwlzcHJpbnRmKGZpbGVuYW1lLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMuaWR4IiwgCisJCXBhdGgsIHNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSkpOworCWNvcHlfZmlsZShmaWxlbmFtZSwgc2hhMV9wYWNrX2luZGV4X25hbWUodGFyZ2V0LT5zaGExKSwKKwkJICBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpLCAxKTsKKwlpbnN0YWxsX3BhY2tlZF9naXQodGFyZ2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZXRjaF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGludCBvYmplY3RfbmFtZV9zdGFydCA9IC0xOworCXN0YXRpYyBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChzaGExKTsKKwljaGFyICpkZXN0X2ZpbGVuYW1lID0gc2hhMV9maWxlX25hbWUoc2hhMSk7CisKKyAJaWYgKG9iamVjdF9uYW1lX3N0YXJ0IDwgMCkgeworCQlzdHJjcHkoZmlsZW5hbWUsIHBhdGgpOyAvKiBlLmcuIGdpdC5naXQgKi8KKwkJc3RyY2F0KGZpbGVuYW1lLCAiL29iamVjdHMvIik7CisJCW9iamVjdF9uYW1lX3N0YXJ0ID0gc3RybGVuKGZpbGVuYW1lKTsKKwl9CisJZmlsZW5hbWVbb2JqZWN0X25hbWVfc3RhcnQrMF0gPSBoZXhbMF07CisJZmlsZW5hbWVbb2JqZWN0X25hbWVfc3RhcnQrMV0gPSBoZXhbMV07CisJZmlsZW5hbWVbb2JqZWN0X25hbWVfc3RhcnQrMl0gPSAnLyc7CisJc3RyY3B5KGZpbGVuYW1lICsgb2JqZWN0X25hbWVfc3RhcnQgKyAzLCBoZXggKyAyKTsKKwlyZXR1cm4gY29weV9maWxlKGZpbGVuYW1lLCBkZXN0X2ZpbGVuYW1lLCBoZXgsIDApOworfQorCitpbnQgZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gZmV0Y2hfZmlsZShzaGExKSAmJiBmZXRjaF9wYWNrKHNoYTEpOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgaW50IHJlZl9uYW1lX3N0YXJ0ID0gLTE7CisJc3RhdGljIGNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCXN0YXRpYyBjaGFyIGhleFs0MV07CisJaW50IGlmZDsKKworCWlmIChyZWZfbmFtZV9zdGFydCA8IDApIHsKKwkJc3ByaW50ZihmaWxlbmFtZSwgIiVzL3JlZnMvIiwgcGF0aCk7CisJCXJlZl9uYW1lX3N0YXJ0ID0gc3RybGVuKGZpbGVuYW1lKTsKKwl9CisJc3RyY3B5KGZpbGVuYW1lICsgcmVmX25hbWVfc3RhcnQsIHJlZik7CisJaWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChpZmQgPCAwKSB7CisJCWNsb3NlKGlmZCk7CisJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXMiLCBmaWxlbmFtZSk7CisJfQorCWlmIChyZWFkX2luX2Z1bGwoaWZkLCBoZXgsIDQwKSAhPSA0MCB8fCBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkgeworCQljbG9zZShpZmQpOworCQlyZXR1cm4gZXJyb3IoImNhbm5vdCByZWFkIGZyb20gJXMiLCBmaWxlbmFtZSk7CisJfQorCWNsb3NlKGlmZCk7CisJcHVsbF9zYXkoInJlZiAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBsb2NhbF9wdWxsX3VzYWdlW10gPQorImdpdC1sb2NhbC1mZXRjaCBbLWNdIFstdF0gWy1hXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gWy1sXSBbLXNdIFstbl0gWy0tc3RkaW5dIGNvbW1pdC1pZCBwYXRoIjsKKworLyoKKyAqIEJ5IGRlZmF1bHQgd2Ugb25seSB1c2UgZmlsZSBjb3B5LgorICogSWYgLWwgaXMgc3BlY2lmaWVkLCBhIGhhcmQgbGluayBpcyBhdHRlbXB0ZWQuCisgKiBJZiAtcyBpcyBzcGVjaWZpZWQsIHRoZW4gYSBzeW1saW5rIGlzIGF0dGVtcHRlZC4KKyAqIElmIC1uIGlzIF9ub3RfIHNwZWNpZmllZCwgdGhlbiBhIHJlZ3VsYXIgZmlsZS10by1maWxlIGNvcHkgaXMgZG9uZS4KKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBjb21taXRzOworCWNvbnN0IGNoYXIgKip3cml0ZV9yZWYgPSBOVUxMOworCWNoYXIgKipjb21taXRfaWQ7CisJaW50IGFyZyA9IDE7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworCQlpZiAoYXJndlthcmddWzFdID09ICd0JykKKwkJCWdldF90cmVlID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykKKwkJCWdldF9oaXN0b3J5ID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdhJykgeworCQkJZ2V0X2FsbCA9IDE7CisJCQlnZXRfdHJlZSA9IDE7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdsJykKKwkJCXVzZV9saW5rID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdzJykKKwkJCXVzZV9zeW1saW5rID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICduJykKKwkJCXVzZV9maWxlY29weSA9IDA7CisJCWVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpCisJCQlnZXRfdmVyYm9zZWx5ID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd3JykKKwkJCXdyaXRlX3JlZiA9ICZhcmd2WysrYXJnXTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkKKwkJCWdldF9yZWNvdmVyID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXN0ZGluIikpCisJCQljb21taXRzX29uX3N0ZGluID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UobG9jYWxfcHVsbF91c2FnZSk7CisJCWFyZysrOworCX0KKwlpZiAoYXJnYyA8IGFyZyArIDIgLSBjb21taXRzX29uX3N0ZGluKQorCQl1c2FnZShsb2NhbF9wdWxsX3VzYWdlKTsKKwlpZiAoY29tbWl0c19vbl9zdGRpbikgeworCQljb21taXRzID0gcHVsbF90YXJnZXRzX3N0ZGluKCZjb21taXRfaWQsICZ3cml0ZV9yZWYpOworCX0gZWxzZSB7CisJCWNvbW1pdF9pZCA9IChjaGFyICoqKSAmYXJndlthcmcrK107CisJCWNvbW1pdHMgPSAxOworCX0KKwlwYXRoID0gYXJndlthcmddOworCisJaWYgKHB1bGwoY29tbWl0cywgY29tbWl0X2lkLCB3cml0ZV9yZWYsIHBhdGgpKQorCQlyZXR1cm4gMTsKKworCWlmIChjb21taXRzX29uX3N0ZGluKQorCQlwdWxsX3RhcmdldHNfZnJlZShjb21taXRzLCBjb21taXRfaWQsIHdyaXRlX3JlZik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xvY2tmaWxlLmMgYi9sb2NrZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGIzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NrZmlsZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgKmxvY2tfZmlsZV9saXN0Oworc3RhdGljIGNvbnN0IGNoYXIgKmFsdGVybmF0ZV9pbmRleF9vdXRwdXQ7CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9sb2NrX2ZpbGUodm9pZCkKK3sKKwlwaWRfdCBtZSA9IGdldHBpZCgpOworCisJd2hpbGUgKGxvY2tfZmlsZV9saXN0KSB7CisJCWlmIChsb2NrX2ZpbGVfbGlzdC0+b3duZXIgPT0gbWUgJiYKKwkJICAgIGxvY2tfZmlsZV9saXN0LT5maWxlbmFtZVswXSkKKwkJCXVubGluayhsb2NrX2ZpbGVfbGlzdC0+ZmlsZW5hbWUpOworCQlsb2NrX2ZpbGVfbGlzdCA9IGxvY2tfZmlsZV9saXN0LT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xvY2tfZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV9sb2NrX2ZpbGUoKTsKKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwlyYWlzZShzaWdubyk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKmxrLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmZDsKKwlzcHJpbnRmKGxrLT5maWxlbmFtZSwgIiVzLmxvY2siLCBwYXRoKTsKKwlmZCA9IG9wZW4obGstPmZpbGVuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwlpZiAoMCA8PSBmZCkgeworCQlsay0+b3duZXIgPSBnZXRwaWQoKTsKKwkJaWYgKCFsay0+b25fbGlzdCkgeworCQkJbGstPm5leHQgPSBsb2NrX2ZpbGVfbGlzdDsKKwkJCWxvY2tfZmlsZV9saXN0ID0gbGs7CisJCQlsay0+b25fbGlzdCA9IDE7CisJCX0KKwkJaWYgKGxvY2tfZmlsZV9saXN0KSB7CisJCQlzaWduYWwoU0lHSU5ULCByZW1vdmVfbG9ja19maWxlX29uX3NpZ25hbCk7CisJCQlhdGV4aXQocmVtb3ZlX2xvY2tfZmlsZSk7CisJCX0KKwkJaWYgKGFkanVzdF9zaGFyZWRfcGVybShsay0+ZmlsZW5hbWUpKQorCQkJcmV0dXJuIGVycm9yKCJjYW5ub3QgZml4IHBlcm1pc3Npb24gYml0cyBvbiAlcyIsCisJCQkJICAgICBsay0+ZmlsZW5hbWUpOworCX0KKwllbHNlCisJCWxrLT5maWxlbmFtZVswXSA9IDA7CisJcmV0dXJuIGZkOworfQorCitpbnQgaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShzdHJ1Y3QgbG9ja19maWxlICpsaywgY29uc3QgY2hhciAqcGF0aCwgaW50IGRpZV9vbl9lcnJvcikKK3sKKwlpbnQgZmQgPSBsb2NrX2ZpbGUobGssIHBhdGgpOworCWlmIChmZCA8IDAgJiYgZGllX29uX2Vycm9yKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgJyVzLmxvY2snOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGZkOworfQorCitpbnQgY29tbWl0X2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICpsaykKK3sKKwljaGFyIHJlc3VsdF9maWxlW1BBVEhfTUFYXTsKKwlpbnQgaTsKKwlzdHJjcHkocmVzdWx0X2ZpbGUsIGxrLT5maWxlbmFtZSk7CisJaSA9IHN0cmxlbihyZXN1bHRfZmlsZSkgLSA1OyAvKiAubG9jayAqLworCXJlc3VsdF9maWxlW2ldID0gMDsKKwlpID0gcmVuYW1lKGxrLT5maWxlbmFtZSwgcmVzdWx0X2ZpbGUpOworCWxrLT5maWxlbmFtZVswXSA9IDA7CisJcmV0dXJuIGk7Cit9CisKK2ludCBob2xkX2xvY2tlZF9pbmRleChzdHJ1Y3QgbG9ja19maWxlICpsaywgaW50IGRpZV9vbl9lcnJvcikKK3sKKwlyZXR1cm4gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShsaywgZ2V0X2luZGV4X2ZpbGUoKSwgZGllX29uX2Vycm9yKTsKK30KKwordm9pZCBzZXRfYWx0ZXJuYXRlX2luZGV4X291dHB1dChjb25zdCBjaGFyICpuYW1lKQoreworCWFsdGVybmF0ZV9pbmRleF9vdXRwdXQgPSBuYW1lOworfQorCitpbnQgY29tbWl0X2xvY2tlZF9pbmRleChzdHJ1Y3QgbG9ja19maWxlICpsaykKK3sKKwlpZiAoYWx0ZXJuYXRlX2luZGV4X291dHB1dCkgeworCQlpbnQgcmVzdWx0ID0gcmVuYW1lKGxrLT5maWxlbmFtZSwgYWx0ZXJuYXRlX2luZGV4X291dHB1dCk7CisJCWxrLT5maWxlbmFtZVswXSA9IDA7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWVsc2UKKwkJcmV0dXJuIGNvbW1pdF9sb2NrX2ZpbGUobGspOworfQorCit2b2lkIHJvbGxiYWNrX2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICpsaykKK3sKKwlpZiAobGstPmZpbGVuYW1lWzBdKQorCQl1bmxpbmsobGstPmZpbGVuYW1lKTsKKwlsay0+ZmlsZW5hbWVbMF0gPSAwOworfQorCmRpZmYgLS1naXQgYS9sb2ctdHJlZS5jIGIvbG9nLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbG9nLXRyZWUuYwpAQCAtMCwwICsxLDQwMSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAicmVmbG9nLXdhbGsuaCIKKworc3RydWN0IGRlY29yYXRpb24gbmFtZV9kZWNvcmF0aW9uID0geyAib2JqZWN0IG5hbWVzIiB9OworCitzdGF0aWMgdm9pZCBzaG93X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgYWJicmV2KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlmb3IgKHAgPSBjb21taXQtPnBhcmVudHM7IHAgOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwLT5pdGVtOworCQlwcmludGYoIiAlcyIsIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLCBhYmJyZXYpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGVjb3JhdGlvbnMoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwlzdHJ1Y3QgbmFtZV9kZWNvcmF0aW9uICpkZWNvcmF0aW9uOworCisJZGVjb3JhdGlvbiA9IGxvb2t1cF9kZWNvcmF0aW9uKCZuYW1lX2RlY29yYXRpb24sICZjb21taXQtPm9iamVjdCk7CisJaWYgKCFkZWNvcmF0aW9uKQorCQlyZXR1cm47CisJcHJlZml4ID0gIiAoIjsKKwl3aGlsZSAoZGVjb3JhdGlvbikgeworCQlwcmludGYoIiVzJXMiLCBwcmVmaXgsIGRlY29yYXRpb24tPm5hbWUpOworCQlwcmVmaXggPSAiLCAiOworCQlkZWNvcmF0aW9uID0gZGVjb3JhdGlvbi0+bmV4dDsKKwl9CisJcHV0Y2hhcignKScpOworfQorCisvKgorICogU2VhcmNoIGZvciAiXlstQS1aYS16XSs6IFteQF0rQCIgcGF0dGVybi4gSXQgdXN1YWxseSBtYXRjaGVzCisgKiBTaWduZWQtb2ZmLWJ5OiBhbmQgQWNrZWQtYnk6IGxpbmVzLgorICovCitzdGF0aWMgaW50IGRldGVjdF9hbnlfc2lnbm9mZihjaGFyICpsZXR0ZXIsIGludCBzaXplKQoreworCWNoYXIgY2gsICpjcDsKKwlpbnQgc2Vlbl9jb2xvbiA9IDA7CisJaW50IHNlZW5fYXQgPSAwOworCWludCBzZWVuX25hbWUgPSAwOworCWludCBzZWVuX2hlYWQgPSAwOworCisJY3AgPSBsZXR0ZXIgKyBzaXplOworCXdoaWxlIChsZXR0ZXIgPD0gLS1jcCAmJiAoY2ggPSAqY3ApID09ICdcbicpCisJCWNvbnRpbnVlOworCisJd2hpbGUgKGxldHRlciA8PSBjcCkgeworCQljaCA9ICpjcC0tOworCQlpZiAoY2ggPT0gJ1xuJykKKwkJCWJyZWFrOworCisJCWlmICghc2Vlbl9hdCkgeworCQkJaWYgKGNoID09ICdAJykKKwkJCQlzZWVuX2F0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc2Vlbl9jb2xvbikgeworCQkJaWYgKGNoID09ICdAJykKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UgaWYgKGNoID09ICc6JykKKwkJCQlzZWVuX2NvbG9uID0gMTsKKwkJCWVsc2UKKwkJCQlzZWVuX25hbWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKSB8fAorCQkgICAgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpIHx8CisJCSAgICBjaCA9PSAnLScpIHsKKwkJCXNlZW5faGVhZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBubyBlbXB0eSBsYXN0IGxpbmUgZG9lc24ndCBtYXRjaCAqLworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlZW5faGVhZCAmJiBzZWVuX25hbWU7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3NpZ25vZmYoY2hhciAqYnVmLCBpbnQgYnVmX3N6LCBpbnQgYXQsIGNvbnN0IGNoYXIgKnNpZ25vZmYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc2lnbmVkX29mZl9ieVtdID0gIlNpZ25lZC1vZmYtYnk6ICI7CisJaW50IHNpZ25vZmZfbGVuID0gc3RybGVuKHNpZ25vZmYpOworCWludCBoYXNfc2lnbm9mZiA9IDA7CisJY2hhciAqY3AgPSBidWY7CisKKwkvKiBEbyB3ZSBoYXZlIGVub3VnaCBzcGFjZSB0byBhZGQgaXQ/ICovCisJaWYgKGJ1Zl9zeiAtIGF0IDw9IHN0cmxlbihzaWduZWRfb2ZmX2J5KSArIHNpZ25vZmZfbGVuICsgMykKKwkJcmV0dXJuIGF0OworCisJLyogRmlyc3Qgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUgc2lnbi1vZmYgYnkgdGhlIHNpZ25lciAqLworCXdoaWxlICgoY3AgPSBzdHJzdHIoY3AsIHNpZ25lZF9vZmZfYnkpKSkgeworCisJCWhhc19zaWdub2ZmID0gMTsKKworCQljcCArPSBzdHJsZW4oc2lnbmVkX29mZl9ieSk7CisJCWlmIChjcCArIHNpZ25vZmZfbGVuID49IGJ1ZiArIGF0KQorCQkJYnJlYWs7CisJCWlmIChzdHJuY21wKGNwLCBzaWdub2ZmLCBzaWdub2ZmX2xlbikpCisJCQljb250aW51ZTsKKwkJaWYgKCFpc3NwYWNlKGNwW3NpZ25vZmZfbGVuXSkpCisJCQljb250aW51ZTsKKwkJLyogd2UgYWxyZWFkeSBoYXZlIGhpbSAqLworCQlyZXR1cm4gYXQ7CisJfQorCisJaWYgKCFoYXNfc2lnbm9mZikKKwkJaGFzX3NpZ25vZmYgPSBkZXRlY3RfYW55X3NpZ25vZmYoYnVmLCBhdCk7CisKKwlpZiAoIWhhc19zaWdub2ZmKQorCQlidWZbYXQrK10gPSAnXG4nOworCisJc3RyY3B5KGJ1ZiArIGF0LCBzaWduZWRfb2ZmX2J5KTsKKwlhdCArPSBzdHJsZW4oc2lnbmVkX29mZl9ieSk7CisJc3RyY3B5KGJ1ZiArIGF0LCBzaWdub2ZmKTsKKwlhdCArPSBzaWdub2ZmX2xlbjsKKwlidWZbYXQrK10gPSAnXG4nOworCWJ1ZlthdF0gPSAwOworCXJldHVybiBhdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkaWdpdHNfaW5fbnVtYmVyKHVuc2lnbmVkIGludCBudW1iZXIpCit7CisJdW5zaWduZWQgaW50IGkgPSAxMCwgcmVzdWx0ID0gMTsKKwl3aGlsZSAoaSA8PSBudW1iZXIpIHsKKwkJaSAqPSAxMDsKKwkJcmVzdWx0Kys7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgc2hvd19sb2coc3RydWN0IHJldl9pbmZvICpvcHQsIGNvbnN0IGNoYXIgKnNlcCkKK3sKKwlzdGF0aWMgY2hhciB0aGlzX2hlYWRlclsxNjM4NF07CisJc3RydWN0IGxvZ19pbmZvICpsb2cgPSBvcHQtPmxvZ2luZm87CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9nLT5jb21taXQsICpwYXJlbnQgPSBsb2ctPnBhcmVudDsKKwlpbnQgYWJicmV2ID0gb3B0LT5kaWZmb3B0LmFiYnJldjsKKwlpbnQgYWJicmV2X2NvbW1pdCA9IG9wdC0+YWJicmV2X2NvbW1pdCA/IG9wdC0+YWJicmV2IDogNDA7CisJY29uc3QgY2hhciAqZXh0cmE7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpzdWJqZWN0ID0gTlVMTCwgKmV4dHJhX2hlYWRlcnMgPSBvcHQtPmV4dHJhX2hlYWRlcnM7CisKKwlvcHQtPmxvZ2luZm8gPSBOVUxMOworCWlmICghb3B0LT52ZXJib3NlX2hlYWRlcikgeworCQlpZiAob3B0LT5sZWZ0X3JpZ2h0KSB7CisJCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBCT1VOREFSWSkKKwkJCQlwdXRjaGFyKCctJyk7CisJCQllbHNlIGlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNZTU1FVFJJQ19MRUZUKQorCQkJCXB1dGNoYXIoJzwnKTsKKwkJCWVsc2UKKwkJCQlwdXRjaGFyKCc+Jyk7CisJCX0KKwkJZnB1dHMoZGlmZl91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIGFiYnJldl9jb21taXQpLCBzdGRvdXQpOworCQlpZiAob3B0LT5wYXJlbnRzKQorCQkJc2hvd19wYXJlbnRzKGNvbW1pdCwgYWJicmV2X2NvbW1pdCk7CisJCXNob3dfZGVjb3JhdGlvbnMoY29tbWl0KTsKKwkJcHV0Y2hhcihvcHQtPmRpZmZvcHQubGluZV90ZXJtaW5hdGlvbik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZSAib25lbGluZSIgZm9ybWF0IGhhcyBzZXZlcmFsIHNwZWNpYWwgY2FzZXM6CisJICogIC0gVGhlIHByZXR0eS1wcmludGVkIGNvbW1pdCBsYWNrcyBhIG5ld2xpbmUgYXQgdGhlIGVuZAorCSAqICAgIG9mIHRoZSBidWZmZXIsIGJ1dCB3ZSBkbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlCisJICogICAgaGF2ZSBhIG5ld2xpbmUgdGhlcmUuIElmIHRoZSBzZXBhcmF0b3IgaXNuJ3QgYWxyZWFkeQorCSAqICAgIGEgbmV3bGluZSwgYWRkIGFuIGV4dHJhIG9uZS4KKwkgKiAgLSB1bmxpa2Ugb3RoZXIgbG9nIG1lc3NhZ2VzLCB0aGUgb25lLWxpbmUgZm9ybWF0IGRvZXMKKwkgKiAgICBub3QgaGF2ZSBhbiBlbXB0eSBsaW5lIGJldHdlZW4gZW50cmllcy4KKwkgKi8KKwlleHRyYSA9ICIiOworCWlmICgqc2VwICE9ICdcbicgJiYgb3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCWV4dHJhID0gIlxuIjsKKwlpZiAob3B0LT5zaG93bl9vbmUgJiYgb3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIob3B0LT5kaWZmb3B0LmxpbmVfdGVybWluYXRpb24pOworCW9wdC0+c2hvd25fb25lID0gMTsKKworCS8qCisJICogUHJpbnQgaGVhZGVyIGxpbmUgb2YgaGVhZGVyLi4KKwkgKi8KKworCWlmIChvcHQtPmNvbW1pdF9mb3JtYXQgPT0gQ01JVF9GTVRfRU1BSUwpIHsKKwkJY2hhciAqc2hhMSA9IHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQlpZiAob3B0LT50b3RhbCA+IDApIHsKKwkJCXN0YXRpYyBjaGFyIGJ1ZmZlcls2NF07CisJCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJCQkiU3ViamVjdDogWyVzICUwKmQvJWRdICIsCisJCQkJCW9wdC0+c3ViamVjdF9wcmVmaXgsCisJCQkJCWRpZ2l0c19pbl9udW1iZXIob3B0LT50b3RhbCksCisJCQkJCW9wdC0+bnIsIG9wdC0+dG90YWwpOworCQkJc3ViamVjdCA9IGJ1ZmZlcjsKKwkJfSBlbHNlIGlmIChvcHQtPnRvdGFsID09IDApIHsKKwkJCXN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOworCQkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJIlN1YmplY3Q6IFslc10gIiwKKwkJCQkJb3B0LT5zdWJqZWN0X3ByZWZpeCk7CisJCQlzdWJqZWN0ID0gYnVmZmVyOworCQl9IGVsc2UgeworCQkJc3ViamVjdCA9ICJTdWJqZWN0OiAiOworCQl9CisKKwkJcHJpbnRmKCJGcm9tICVzIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMVxuIiwgc2hhMSk7CisJCWlmIChvcHQtPm1lc3NhZ2VfaWQpCisJCQlwcmludGYoIk1lc3NhZ2UtSWQ6IDwlcz5cbiIsIG9wdC0+bWVzc2FnZV9pZCk7CisJCWlmIChvcHQtPnJlZl9tZXNzYWdlX2lkKQorCQkJcHJpbnRmKCJJbi1SZXBseS1UbzogPCVzPlxuUmVmZXJlbmNlczogPCVzPlxuIiwKKwkJCSAgICAgICBvcHQtPnJlZl9tZXNzYWdlX2lkLCBvcHQtPnJlZl9tZXNzYWdlX2lkKTsKKwkJaWYgKG9wdC0+bWltZV9ib3VuZGFyeSkgeworCQkJc3RhdGljIGNoYXIgc3ViamVjdF9idWZmZXJbMTAyNF07CisJCQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07CisJCQlzbnByaW50ZihzdWJqZWN0X2J1ZmZlciwgc2l6ZW9mKHN1YmplY3RfYnVmZmVyKSAtIDEsCisJCQkJICIlcyIKKwkJCQkgIk1JTUUtVmVyc2lvbjogMS4wXG4iCisJCQkJICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsiCisJCQkJICIgYm91bmRhcnk9XCIlcyVzXCJcbiIKKwkJCQkgIlxuIgorCQkJCSAiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FICIKKwkJCQkgImZvcm1hdC5cbiIKKwkJCQkgIi0tJXMlc1xuIgorCQkJCSAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyAiCisJCQkJICJjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWRcbiIKKwkJCQkgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcblxuIiwKKwkJCQkgZXh0cmFfaGVhZGVycyA/IGV4dHJhX2hlYWRlcnMgOiAiIiwKKwkJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSwKKwkJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSk7CisJCQlleHRyYV9oZWFkZXJzID0gc3ViamVjdF9idWZmZXI7CisKKwkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLAorCQkJCSAiLS0lcyVzXG4iCisJCQkJICJDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsiCisJCQkJICIgbmFtZT1cIiVzLmRpZmZcIlxuIgorCQkJCSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCQkJCSAiQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IgorCQkJCSAiIGZpbGVuYW1lPVwiJXMuZGlmZlwiXG5cbiIsCisJCQkJIG1pbWVfYm91bmRhcnlfbGVhZGVyLCBvcHQtPm1pbWVfYm91bmRhcnksCisJCQkJIHNoYTEsCisJCQkJIG9wdC0+bm9faW5saW5lID8gImF0dGFjaG1lbnQiIDogImlubGluZSIsCisJCQkJIHNoYTEpOworCQkJb3B0LT5kaWZmb3B0LnN0YXRfc2VwID0gYnVmZmVyOworCQl9CisJfSBlbHNlIGlmIChvcHQtPmNvbW1pdF9mb3JtYXQgIT0gQ01JVF9GTVRfVVNFUkZPUk1BVCkgeworCQlmcHV0cyhkaWZmX2dldF9jb2xvcihvcHQtPmRpZmZvcHQuY29sb3JfZGlmZiwgRElGRl9DT01NSVQpLAorCQkgICAgICBzdGRvdXQpOworCQlpZiAob3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCQlmcHV0cygiY29tbWl0ICIsIHN0ZG91dCk7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZKQorCQkJcHV0Y2hhcignLScpOworCQllbHNlIGlmIChvcHQtPmxlZnRfcmlnaHQpIHsKKwkJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNZTU1FVFJJQ19MRUZUKQorCQkJCXB1dGNoYXIoJzwnKTsKKwkJCWVsc2UKKwkJCQlwdXRjaGFyKCc+Jyk7CisJCX0KKwkJZnB1dHMoZGlmZl91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIGFiYnJldl9jb21taXQpLAorCQkgICAgICBzdGRvdXQpOworCQlpZiAob3B0LT5wYXJlbnRzKQorCQkJc2hvd19wYXJlbnRzKGNvbW1pdCwgYWJicmV2X2NvbW1pdCk7CisJCWlmIChwYXJlbnQpCisJCQlwcmludGYoIiAoZnJvbSAlcykiLAorCQkJICAgICAgIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLAorCQkJCQkJICBhYmJyZXZfY29tbWl0KSk7CisJCXNob3dfZGVjb3JhdGlvbnMoY29tbWl0KTsKKwkJcHJpbnRmKCIlcyIsCisJCSAgICAgICBkaWZmX2dldF9jb2xvcihvcHQtPmRpZmZvcHQuY29sb3JfZGlmZiwgRElGRl9SRVNFVCkpOworCQlwdXRjaGFyKG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FID8gJyAnIDogJ1xuJyk7CisJCWlmIChvcHQtPnJlZmxvZ19pbmZvKSB7CisJCQlzaG93X3JlZmxvZ19tZXNzYWdlKG9wdC0+cmVmbG9nX2luZm8sCisJCQkJICAgIG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FLAorCQkJCSAgICBvcHQtPmRhdGVfbW9kZSk7CisJCQlpZiAob3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpIHsKKwkJCQlwcmludGYoIiVzIiwgc2VwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEFuZCB0aGVuIHRoZSBwcmV0dHktcHJpbnRlZCBtZXNzYWdlIGl0c2VsZgorCSAqLworCWxlbiA9IHByZXR0eV9wcmludF9jb21taXQob3B0LT5jb21taXRfZm9ybWF0LCBjb21taXQsIH4wdSwgdGhpc19oZWFkZXIsCisJCQkJICBzaXplb2YodGhpc19oZWFkZXIpLCBhYmJyZXYsIHN1YmplY3QsCisJCQkJICBleHRyYV9oZWFkZXJzLCBvcHQtPmRhdGVfbW9kZSk7CisKKwlpZiAob3B0LT5hZGRfc2lnbm9mZikKKwkJbGVuID0gYXBwZW5kX3NpZ25vZmYodGhpc19oZWFkZXIsIHNpemVvZih0aGlzX2hlYWRlciksIGxlbiwKKwkJCQkgICAgIG9wdC0+YWRkX3NpZ25vZmYpOworCXByaW50ZigiJXMlcyVzIiwgdGhpc19oZWFkZXIsIGV4dHJhLCBzZXApOworfQorCitpbnQgbG9nX3RyZWVfZGlmZl9mbHVzaChzdHJ1Y3QgcmV2X2luZm8gKm9wdCkKK3sKKwlkaWZmY29yZV9zdGQoJm9wdC0+ZGlmZm9wdCk7CisKKwlpZiAoZGlmZl9xdWV1ZV9pc19lbXB0eSgpKSB7CisJCWludCBzYXZlZF9mbXQgPSBvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdDsKKwkJb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJCWRpZmZfZmx1c2goJm9wdC0+ZGlmZm9wdCk7CisJCW9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gc2F2ZWRfZm10OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3B0LT5sb2dpbmZvICYmICFvcHQtPm5vX2NvbW1pdF9pZCkgeworCQkvKiBXaGVuIHNob3dpbmcgYSB2ZXJib3NlIGhlYWRlciAoaS5lLiBsb2cgbWVzc2FnZSksCisJCSAqIGFuZCBub3QgaW4gLS1wcmV0dHk9b25lbGluZSBmb3JtYXQsIHdlIHdvdWxkIHdhbnQKKwkJICogYW4gZXh0cmEgbmV3bGluZSBiZXR3ZWVuIHRoZSBlbmQgb2YgbG9nIGFuZCB0aGUKKwkJICogb3V0cHV0IGZvciByZWFkYWJpbGl0eS4KKwkJICovCisJCXNob3dfbG9nKG9wdCwgb3B0LT5kaWZmb3B0Lm1zZ19zZXApOworCQlpZiAob3B0LT52ZXJib3NlX2hlYWRlciAmJgorCQkgICAgb3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpIHsKKwkJCWludCBwY2ggPSBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8IERJRkZfRk9STUFUX1BBVENIOworCQkJaWYgKChwY2ggJiBvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkgPT0gcGNoKQorCQkJCXByaW50ZigiLS0tIik7CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJfQorCWRpZmZfZmx1c2goJm9wdC0+ZGlmZm9wdCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGlmZl9jb21iaW5lZChzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXVuc2lnbmVkIGNvbnN0IGNoYXIgKnNoYTEgPSBjb21taXQtPm9iamVjdC5zaGExOworCisJZGlmZl90cmVlX2NvbWJpbmVkX21lcmdlKHNoYTEsIG9wdC0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCBvcHQpOworCXJldHVybiAhb3B0LT5sb2dpbmZvOworfQorCisvKgorICogU2hvdyB0aGUgZGlmZiBvZiBhIGNvbW1pdC4KKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBwcmludGVkIGFueSBsb2cgaW5mbyBtZXNzYWdlcworICovCitzdGF0aWMgaW50IGxvZ190cmVlX2RpZmYoc3RydWN0IHJldl9pbmZvICpvcHQsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGxvZ19pbmZvICpsb2cpCit7CisJaW50IHNob3dlZF9sb2c7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCXVuc2lnbmVkIGNvbnN0IGNoYXIgKnNoYTEgPSBjb21taXQtPm9iamVjdC5zaGExOworCisJaWYgKCFvcHQtPmRpZmYpCisJCXJldHVybiAwOworCisJLyogUm9vdCBjb21taXQ/ICovCisJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwlpZiAoIXBhcmVudHMpIHsKKwkJaWYgKG9wdC0+c2hvd19yb290X2RpZmYpIHsKKwkJCWRpZmZfcm9vdF90cmVlX3NoYTEoc2hhMSwgIiIsICZvcHQtPmRpZmZvcHQpOworCQkJbG9nX3RyZWVfZGlmZl9mbHVzaChvcHQpOworCQl9CisJCXJldHVybiAhb3B0LT5sb2dpbmZvOworCX0KKworCS8qIE1vcmUgdGhhbiBvbmUgcGFyZW50PyAqLworCWlmIChwYXJlbnRzICYmIHBhcmVudHMtPm5leHQpIHsKKwkJaWYgKG9wdC0+aWdub3JlX21lcmdlcykKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChvcHQtPmNvbWJpbmVfbWVyZ2VzKQorCQkJcmV0dXJuIGRvX2RpZmZfY29tYmluZWQob3B0LCBjb21taXQpOworCisJCS8qIElmIHdlIHNob3cgaW5kaXZpZHVhbCBkaWZmcywgc2hvdyB0aGUgcGFyZW50IGluZm8gKi8KKwkJbG9nLT5wYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCX0KKworCXNob3dlZF9sb2cgPSAwOworCWZvciAoOzspIHsKKwkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKworCQlkaWZmX3RyZWVfc2hhMShwYXJlbnQtPm9iamVjdC5zaGExLCBzaGExLCAiIiwgJm9wdC0+ZGlmZm9wdCk7CisJCWxvZ190cmVlX2RpZmZfZmx1c2gob3B0KTsKKworCQlzaG93ZWRfbG9nIHw9ICFvcHQtPmxvZ2luZm87CisKKwkJLyogU2V0IHVwIHRoZSBsb2cgaW5mbyBmb3IgdGhlIG5leHQgcGFyZW50LCBpZiBhbnkuLiAqLworCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJaWYgKCFwYXJlbnRzKQorCQkJYnJlYWs7CisJCWxvZy0+cGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKwkJb3B0LT5sb2dpbmZvID0gbG9nOworCX0KKwlyZXR1cm4gc2hvd2VkX2xvZzsKK30KKworaW50IGxvZ190cmVlX2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBsb2dfaW5mbyBsb2c7CisJaW50IHNob3duOworCisJbG9nLmNvbW1pdCA9IGNvbW1pdDsKKwlsb2cucGFyZW50ID0gTlVMTDsKKwlvcHQtPmxvZ2luZm8gPSAmbG9nOworCisJc2hvd24gPSBsb2dfdHJlZV9kaWZmKG9wdCwgY29tbWl0LCAmbG9nKTsKKwlpZiAoIXNob3duICYmIG9wdC0+bG9naW5mbyAmJiBvcHQtPmFsd2F5c19zaG93X2hlYWRlcikgeworCQlsb2cucGFyZW50ID0gTlVMTDsKKwkJc2hvd19sb2cob3B0LCAiIik7CisJCXNob3duID0gMTsKKwl9CisJb3B0LT5sb2dpbmZvID0gTlVMTDsKKwlyZXR1cm4gc2hvd247Cit9CmRpZmYgLS1naXQgYS9sb2ctdHJlZS5oIGIvbG9nLXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiNTZhCi0tLSAvZGV2L251bGwKKysrIGIvbG9nLXRyZWUuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIExPR19UUkVFX0gKKyNkZWZpbmUgTE9HX1RSRUVfSAorCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworc3RydWN0IGxvZ19pbmZvIHsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQsICpwYXJlbnQ7Cit9OworCit2b2lkIGluaXRfbG9nX3RyZWVfb3B0KHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9kaWZmX2ZsdXNoKHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9jb21taXQoc3RydWN0IHJldl9pbmZvICosIHN0cnVjdCBjb21taXQgKik7CitpbnQgbG9nX3RyZWVfb3B0X3BhcnNlKHN0cnVjdCByZXZfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBpbnQpOwordm9pZCBzaG93X2xvZyhzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgY29uc3QgY2hhciAqc2VwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tYWlsbWFwLmMgYi9tYWlsbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1NjdhMgotLS0gL2Rldi9udWxsCisrKyBiL21haWxtYXAuYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKyNpbmNsdWRlICJtYWlsbWFwLmgiCisKK2ludCByZWFkX21haWxtYXAoc3RydWN0IHBhdGhfbGlzdCAqbWFwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKnJlcG9fYWJicmV2KQoreworCWNoYXIgYnVmZmVyWzEwMjRdOworCUZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKworCWlmIChmID09IE5VTEwpCisJCXJldHVybiAxOworCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSAhPSBOVUxMKSB7CisJCWNoYXIgKmVuZF9vZl9uYW1lLCAqbGVmdF9icmFja2V0LCAqcmlnaHRfYnJhY2tldDsKKwkJY2hhciAqbmFtZSwgKmVtYWlsOworCQlpbnQgaTsKKwkJaWYgKGJ1ZmZlclswXSA9PSAnIycpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGFiYnJldltdID0gIiMgcmVwby1hYmJyZXY6IjsKKwkJCWludCBhYmJsZW4gPSBzaXplb2YoYWJicmV2KSAtIDE7CisJCQlpbnQgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisKKwkJCWlmICghcmVwb19hYmJyZXYpCisJCQkJY29udGludWU7CisKKwkJCWlmIChsZW4gJiYgYnVmZmVyW2xlbiAtIDFdID09ICdcbicpCisJCQkJYnVmZmVyWy0tbGVuXSA9IDA7CisJCQlpZiAoIXN0cm5jbXAoYnVmZmVyLCBhYmJyZXYsIGFiYmxlbikpIHsKKwkJCQljaGFyICpjcDsKKworCQkJCWlmIChyZXBvX2FiYnJldikKKwkJCQkJZnJlZSgqcmVwb19hYmJyZXYpOworCQkJCSpyZXBvX2FiYnJldiA9IHhtYWxsb2MobGVuKTsKKworCQkJCWZvciAoY3AgPSBidWZmZXIgKyBhYmJsZW47IGlzc3BhY2UoKmNwKTsgY3ArKykKKwkJCQkJOyAvKiBub3RoaW5nICovCisJCQkJc3RyY3B5KCpyZXBvX2FiYnJldiwgY3ApOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKChsZWZ0X2JyYWNrZXQgPSBzdHJjaHIoYnVmZmVyLCAnPCcpKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmICgocmlnaHRfYnJhY2tldCA9IHN0cmNocihsZWZ0X2JyYWNrZXQgKyAxLCAnPicpKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmIChyaWdodF9icmFja2V0ID09IGxlZnRfYnJhY2tldCArIDEpCisJCQljb250aW51ZTsKKwkJZm9yIChlbmRfb2ZfbmFtZSA9IGxlZnRfYnJhY2tldDsgZW5kX29mX25hbWUgIT0gYnVmZmVyCisJCQkJJiYgaXNzcGFjZShlbmRfb2ZfbmFtZVstMV0pOyBlbmRfb2ZfbmFtZS0tKQorCQkJLyoga2VlcCBvbiBsb29raW5nICovCisJCWlmIChlbmRfb2ZfbmFtZSA9PSBidWZmZXIpCisJCQljb250aW51ZTsKKwkJbmFtZSA9IHhtYWxsb2MoZW5kX29mX25hbWUgLSBidWZmZXIgKyAxKTsKKwkJc3RybGNweShuYW1lLCBidWZmZXIsIGVuZF9vZl9uYW1lIC0gYnVmZmVyICsgMSk7CisJCWVtYWlsID0geG1hbGxvYyhyaWdodF9icmFja2V0IC0gbGVmdF9icmFja2V0KTsKKwkJZm9yIChpID0gMDsgaSA8IHJpZ2h0X2JyYWNrZXQgLSBsZWZ0X2JyYWNrZXQgLSAxOyBpKyspCisJCQllbWFpbFtpXSA9IHRvbG93ZXIobGVmdF9icmFja2V0W2kgKyAxXSk7CisJCWVtYWlsW3JpZ2h0X2JyYWNrZXQgLSBsZWZ0X2JyYWNrZXQgLSAxXSA9ICdcMCc7CisJCXBhdGhfbGlzdF9pbnNlcnQoZW1haWwsIG1hcCktPnV0aWwgPSBuYW1lOworCX0KKwlmY2xvc2UoZik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYXBfZW1haWwoc3RydWN0IHBhdGhfbGlzdCAqbWFwLCBjb25zdCBjaGFyICplbWFpbCwgY2hhciAqbmFtZSwgaW50IG1heGxlbikKK3sKKwljaGFyICpwOworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwljaGFyIGJ1ZlsxMDI0XSwgKm1haWxidWY7CisJaW50IGk7CisKKwkvKiBhdXRvY29tcGxldGUgY29tbW9uIGRldmVsb3BlcnMgKi8KKwlwID0gc3RyY2hyKGVtYWlsLCAnPicpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSBlbWFpbCArIDEgPCBzaXplb2YoYnVmKSkKKwkJbWFpbGJ1ZiA9IGJ1ZjsKKwllbHNlCisJCW1haWxidWYgPSB4bWFsbG9jKHAgLSBlbWFpbCArIDEpOworCisJLyogZG93bmNhc2UgdGhlIGVtYWlsIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcCAtIGVtYWlsOyBpKyspCisJCW1haWxidWZbaV0gPSB0b2xvd2VyKGVtYWlsW2ldKTsKKwltYWlsYnVmW2ldID0gMDsKKwlpdGVtID0gcGF0aF9saXN0X2xvb2t1cChtYWlsYnVmLCBtYXApOworCWlmIChtYWlsYnVmICE9IGJ1ZikKKwkJZnJlZShtYWlsYnVmKTsKKwlpZiAoaXRlbSAhPSBOVUxMKSB7CisJCWNvbnN0IGNoYXIgKnJlYWxuYW1lID0gKGNvbnN0IGNoYXIgKilpdGVtLT51dGlsOworCQlzdHJsY3B5KG5hbWUsIHJlYWxuYW1lLCBtYXhsZW4pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21haWxtYXAuaCBiL21haWxtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAzZmQyCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbG1hcC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBNQUlMTUFQX0gKKyNkZWZpbmUgTUFJTE1BUF9ICisKK2ludCByZWFkX21haWxtYXAoc3RydWN0IHBhdGhfbGlzdCAqbWFwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKnJlcG9fYWJicmV2KTsKK2ludCBtYXBfZW1haWwoc3RydWN0IHBhdGhfbGlzdCAqbWFpbG1hcCwgY29uc3QgY2hhciAqZW1haWwsIGNoYXIgKm5hbWUsIGludCBtYXhsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21hdGNoLXRyZWVzLmMgYi9tYXRjaC10cmVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2FmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tYXRjaC10cmVlcy5jCkBAIC0wLDAgKzEsMzA0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKK3N0YXRpYyBpbnQgc2NvcmVfbWlzc2luZyh1bnNpZ25lZCBtb2RlLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBzY29yZTsKKworCWlmIChTX0lTRElSKG1vZGUpKQorCQlzY29yZSA9IC0xMDAwOworCWVsc2UgaWYgKFNfSVNMTksobW9kZSkpCisJCXNjb3JlID0gLTUwMDsKKwllbHNlCisJCXNjb3JlID0gLTUwOworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIGludCBzY29yZV9kaWZmZXJzKHVuc2lnbmVkIG1vZGUxLCB1bnNpZ25lZCBtb2RlMiwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgc2NvcmU7CisKKwlpZiAoU19JU0RJUihtb2RlMSkgIT0gU19JU0RJUihtb2RlMikpCisJCXNjb3JlID0gLTEwMDsKKwllbHNlIGlmIChTX0lTTE5LKG1vZGUxKSAhPSBTX0lTTE5LKG1vZGUyKSkKKwkJc2NvcmUgPSAtNTA7CisJZWxzZQorCQlzY29yZSA9IC01OworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIGludCBzY29yZV9tYXRjaGVzKHVuc2lnbmVkIG1vZGUxLCB1bnNpZ25lZCBtb2RlMiwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgc2NvcmU7CisKKwkvKiBIZWgsIHdlIGZvdW5kIFNIQS0xIGNvbGxpc2lvbnMgYmV0d2VlbiBkaWZmZXJlbnQga2luZCBvZiBvYmplY3RzICovCisJaWYgKFNfSVNESVIobW9kZTEpICE9IFNfSVNESVIobW9kZTIpKQorCQlzY29yZSA9IC0xMDA7CisJZWxzZSBpZiAoU19JU0xOSyhtb2RlMSkgIT0gU19JU0xOSyhtb2RlMikpCisJCXNjb3JlID0gLTUwOworCisJZWxzZSBpZiAoU19JU0RJUihtb2RlMSkpCisJCXNjb3JlID0gMTAwMDsKKwllbHNlIGlmIChTX0lTTE5LKG1vZGUxKSkKKwkJc2NvcmUgPSA1MDA7CisJZWxzZQorCQlzY29yZSA9IDI1MDsKKwlyZXR1cm4gc2NvcmU7Cit9CisKKy8qCisgKiBJbnNwZWN0IHR3byB0cmVlcywgYW5kIGdpdmUgYSBzY29yZSB0aGF0IHRlbGxzIGhvdyBzaW1pbGFyIHRoZXkgYXJlLgorICovCitzdGF0aWMgaW50IHNjb3JlX3RyZWVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gxLCBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMikKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIG9uZTsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHR3bzsKKwl2b2lkICpvbmVfYnVmLCAqdHdvX2J1ZjsKKwlpbnQgc2NvcmUgPSAwOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlvbmVfYnVmID0gcmVhZF9zaGExX2ZpbGUoaGFzaDEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFvbmVfYnVmKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHRyZWUgKCVzKSIsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJaWYgKHR5cGUgIT0gT0JKX1RSRUUpCisJCWRpZSgiJXMgaXMgbm90IGEgdHJlZSIsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJaW5pdF90cmVlX2Rlc2MoJm9uZSwgb25lX2J1Ziwgc2l6ZSk7CisJdHdvX2J1ZiA9IHJlYWRfc2hhMV9maWxlKGhhc2gyLCAmdHlwZSwgJnNpemUpOworCWlmICghdHdvX2J1ZikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICglcykiLCBzaGExX3RvX2hleChoYXNoMikpOworCWlmICh0eXBlICE9IE9CSl9UUkVFKQorCQlkaWUoIiVzIGlzIG5vdCBhIHRyZWUiLCBzaGExX3RvX2hleChoYXNoMikpOworCWluaXRfdHJlZV9kZXNjKCZ0d28sIHR3b19idWYsIHNpemUpOworCXdoaWxlIChvbmUuc2l6ZSB8IHR3by5zaXplKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVsZW0xID0gZWxlbTE7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVsZW0yID0gZWxlbTI7CisJCWNvbnN0IGNoYXIgKnBhdGgxID0gcGF0aDE7CisJCWNvbnN0IGNoYXIgKnBhdGgyID0gcGF0aDI7CisJCXVuc2lnbmVkIG1vZGUxID0gbW9kZTE7CisJCXVuc2lnbmVkIG1vZGUyID0gbW9kZTI7CisJCWludCBjbXA7CisKKwkJaWYgKG9uZS5zaXplKQorCQkJZWxlbTEgPSB0cmVlX2VudHJ5X2V4dHJhY3QoJm9uZSwgJnBhdGgxLCAmbW9kZTEpOworCQlpZiAodHdvLnNpemUpCisJCQllbGVtMiA9IHRyZWVfZW50cnlfZXh0cmFjdCgmdHdvLCAmcGF0aDIsICZtb2RlMik7CisKKwkJaWYgKCFvbmUuc2l6ZSkgeworCQkJLyogdHdvIGhhcyBtb3JlIGVudHJpZXMgKi8KKwkJCXNjb3JlICs9IHNjb3JlX21pc3NpbmcobW9kZTIsIHBhdGgyKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KCZ0d28pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCF0d28uc2l6ZSkgeworCQkJLyogdHdvIGxhY2tzIHRoaXMgZW50cnkgKi8KKwkJCXNjb3JlICs9IHNjb3JlX21pc3NpbmcobW9kZTEsIHBhdGgxKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KCZvbmUpOworCQkJY29udGludWU7CisJCX0KKwkJY21wID0gYmFzZV9uYW1lX2NvbXBhcmUocGF0aDEsIHN0cmxlbihwYXRoMSksIG1vZGUxLAorCQkJCQlwYXRoMiwgc3RybGVuKHBhdGgyKSwgbW9kZTIpOworCQlpZiAoY21wIDwgMCkgeworCQkJLyogcGF0aDEgZG9lcyBub3QgYXBwZWFyIGluIHR3byAqLworCQkJc2NvcmUgKz0gc2NvcmVfbWlzc2luZyhtb2RlMSwgcGF0aDEpOworCQkJdXBkYXRlX3RyZWVfZW50cnkoJm9uZSk7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChjbXAgPiAwKSB7CisJCQkvKiBwYXRoMiBkb2VzIG5vdCBhcHBlYXIgaW4gb25lICovCisJCQlzY29yZSArPSBzY29yZV9taXNzaW5nKG1vZGUyLCBwYXRoMik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSgmdHdvKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKGhhc2hjbXAoZWxlbTEsIGVsZW0yKSkKKwkJCS8qIHRoZXkgYXJlIGRpZmZlcmVudCAqLworCQkJc2NvcmUgKz0gc2NvcmVfZGlmZmVycyhtb2RlMSwgbW9kZTIsIHBhdGgxKTsKKwkJZWxzZQorCQkJLyogc2FtZSBzdWJ0cmVlIG9yIGJsb2IgKi8KKwkJCXNjb3JlICs9IHNjb3JlX21hdGNoZXMobW9kZTEsIG1vZGUyLCBwYXRoMSk7CisJCXVwZGF0ZV90cmVlX2VudHJ5KCZvbmUpOworCQl1cGRhdGVfdHJlZV9lbnRyeSgmdHdvKTsKKwl9CisJZnJlZShvbmVfYnVmKTsKKwlmcmVlKHR3b19idWYpOworCXJldHVybiBzY29yZTsKK30KKworLyoKKyAqIE1hdGNoIG9uZSBpdHNlbGYgYW5kIGl0cyBzdWJ0cmVlcyB3aXRoIHR3byBhbmQgcGljayB0aGUgYmVzdCBtYXRjaC4KKyAqLworc3RhdGljIHZvaWQgbWF0Y2hfdHJlZXMoY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaDEsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMiwKKwkJCWludCAqYmVzdF9zY29yZSwKKwkJCWNoYXIgKipiZXN0X21hdGNoLAorCQkJY2hhciAqYmFzZSwKKwkJCWludCByZWN1cnNlX2xpbWl0KQoreworCXN0cnVjdCB0cmVlX2Rlc2Mgb25lOworCXZvaWQgKm9uZV9idWY7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCW9uZV9idWYgPSByZWFkX3NoYTFfZmlsZShoYXNoMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIW9uZV9idWYpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAoJXMpIiwgc2hhMV90b19oZXgoaGFzaDEpKTsKKwlpZiAodHlwZSAhPSBPQkpfVFJFRSkKKwkJZGllKCIlcyBpcyBub3QgYSB0cmVlIiwgc2hhMV90b19oZXgoaGFzaDEpKTsKKwlpbml0X3RyZWVfZGVzYygmb25lLCBvbmVfYnVmLCBzaXplKTsKKworCXdoaWxlIChvbmUuc2l6ZSkgeworCQljb25zdCBjaGFyICpwYXRoOworCQljb25zdCB1bnNpZ25lZCBjaGFyICplbGVtOworCQl1bnNpZ25lZCBtb2RlOworCQlpbnQgc2NvcmU7CisKKwkJZWxlbSA9IHRyZWVfZW50cnlfZXh0cmFjdCgmb25lLCAmcGF0aCwgJm1vZGUpOworCQlpZiAoIVNfSVNESVIobW9kZSkpCisJCQlnb3RvIG5leHQ7CisJCXNjb3JlID0gc2NvcmVfdHJlZXMoZWxlbSwgaGFzaDIpOworCQlpZiAoKmJlc3Rfc2NvcmUgPCBzY29yZSkgeworCQkJY2hhciAqbmV3cGF0aDsKKwkJCW5ld3BhdGggPSB4bWFsbG9jKHN0cmxlbihiYXNlKSArIHN0cmxlbihwYXRoKSArIDEpOworCQkJc3ByaW50ZihuZXdwYXRoLCAiJXMlcyIsIGJhc2UsIHBhdGgpOworCQkJZnJlZSgqYmVzdF9tYXRjaCk7CisJCQkqYmVzdF9tYXRjaCA9IG5ld3BhdGg7CisJCQkqYmVzdF9zY29yZSA9IHNjb3JlOworCQl9CisJCWlmIChyZWN1cnNlX2xpbWl0KSB7CisJCQljaGFyICpuZXdiYXNlOworCQkJbmV3YmFzZSA9IHhtYWxsb2Moc3RybGVuKGJhc2UpICsgc3RybGVuKHBhdGgpICsgMik7CisJCQlzcHJpbnRmKG5ld2Jhc2UsICIlcyVzLyIsIGJhc2UsIHBhdGgpOworCQkJbWF0Y2hfdHJlZXMoZWxlbSwgaGFzaDIsIGJlc3Rfc2NvcmUsIGJlc3RfbWF0Y2gsCisJCQkJICAgIG5ld2Jhc2UsIHJlY3Vyc2VfbGltaXQgLSAxKTsKKwkJCWZyZWUobmV3YmFzZSk7CisJCX0KKworCW5leHQ6CisJCXVwZGF0ZV90cmVlX2VudHJ5KCZvbmUpOworCX0KKwlmcmVlKG9uZV9idWYpOworfQorCisvKgorICogQSB0cmVlICJoYXNoMSIgaGFzIGEgc3ViZGlyZWN0b3J5IGF0ICJwcmVmaXgiLiAgQ29tZSB1cCB3aXRoIGEKKyAqIHRyZWUgb2JqZWN0IGJ5IHJlcGxhY2luZyBpdCB3aXRoIGFub3RoZXIgdHJlZSAiaGFzaDIiLgorICovCitzdGF0aWMgaW50IHNwbGljZV90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gxLAorCQkgICAgICAgY2hhciAqcHJlZml4LAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaDIsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQpCit7CisJY2hhciAqc3VicGF0aDsKKwlpbnQgdG9wbGVuOworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHN6OworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwl1bnNpZ25lZCBjaGFyICpyZXdyaXRlX2hlcmU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmV3cml0ZV93aXRoOworCXVuc2lnbmVkIGNoYXIgc3VidHJlZVsyMF07CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWludCBzdGF0dXM7CisKKwlzdWJwYXRoID0gc3RyY2hyKHByZWZpeCwgJy8nKTsKKwlpZiAoIXN1YnBhdGgpCisJCXRvcGxlbiA9IHN0cmxlbihwcmVmaXgpOworCWVsc2UgeworCQl0b3BsZW4gPSBzdWJwYXRoIC0gcHJlZml4OworCQlzdWJwYXRoKys7CisJfQorCisJYnVmID0gcmVhZF9zaGExX2ZpbGUoaGFzaDEsICZ0eXBlLCAmc3opOworCWlmICghYnVmKQorCQlkaWUoImNhbm5vdCByZWFkIHRyZWUgJXMiLCBzaGExX3RvX2hleChoYXNoMSkpOworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCBidWYsIHN6KTsKKworCXJld3JpdGVfaGVyZSA9IE5VTEw7CisJd2hpbGUgKGRlc2Muc2l6ZSkgeworCQljb25zdCBjaGFyICpuYW1lOworCQl1bnNpZ25lZCBtb2RlOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCisJCXNoYTEgPSB0cmVlX2VudHJ5X2V4dHJhY3QoJmRlc2MsICZuYW1lLCAmbW9kZSk7CisJCWlmIChzdHJsZW4obmFtZSkgPT0gdG9wbGVuICYmCisJCSAgICAhbWVtY21wKG5hbWUsIHByZWZpeCwgdG9wbGVuKSkgeworCQkJaWYgKCFTX0lTRElSKG1vZGUpKQorCQkJCWRpZSgiZW50cnkgJXMgaW4gdHJlZSAlcyBpcyBub3QgYSB0cmVlIiwKKwkJCQkgICAgbmFtZSwgc2hhMV90b19oZXgoaGFzaDEpKTsKKwkJCXJld3JpdGVfaGVyZSA9ICh1bnNpZ25lZCBjaGFyICopIHNoYTE7CisJCQlicmVhazsKKwkJfQorCQl1cGRhdGVfdHJlZV9lbnRyeSgmZGVzYyk7CisJfQorCWlmICghcmV3cml0ZV9oZXJlKQorCQlkaWUoImVudHJ5ICUuKnMgbm90IGZvdW5kIGluIHRyZWUgJXMiLAorCQkgICAgdG9wbGVuLCBwcmVmaXgsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJaWYgKHN1YnBhdGgpIHsKKwkJc3RhdHVzID0gc3BsaWNlX3RyZWUocmV3cml0ZV9oZXJlLCBzdWJwYXRoLCBoYXNoMiwgc3VidHJlZSk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCQlyZXdyaXRlX3dpdGggPSBzdWJ0cmVlOworCX0KKwllbHNlCisJCXJld3JpdGVfd2l0aCA9IGhhc2gyOworCWhhc2hjcHkocmV3cml0ZV9oZXJlLCByZXdyaXRlX3dpdGgpOworCXN0YXR1cyA9IHdyaXRlX3NoYTFfZmlsZShidWYsIHN6LCB0cmVlX3R5cGUsIHJlc3VsdCk7CisJZnJlZShidWYpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBXZSBhcmUgdHJ5aW5nIHRvIGNvbWUgdXAgd2l0aCBhIG1lcmdlIGJldHdlZW4gb25lIGFuZCB0d28gdGhhdAorICogcmVzdWx0cyBpbiBhIHRyZWUgc2hhcGUgc2ltaWxhciB0byBvbmUuICBUaGUgdHJlZSB0d28gbWlnaHQKKyAqIGNvcnJlc3BvbmQgdG8gYSBzdWJ0cmVlIG9mIG9uZSwgaW4gd2hpY2ggY2FzZSBpdCBuZWVkcyB0byBiZQorICogc2hpZnRlZCBkb3duIGJ5IHByZWZpeGluZyBvdGhlcndpc2UgZW1wdHkgZGlyZWN0b3JpZXMuICBPbiB0aGUKKyAqIG90aGVyIGhhbmQsIGl0IGNvdWxkIGNvdmVyIHRyZWUgb25lIGFuZCB3ZSBtaWdodCBuZWVkIHRvIHBpY2sgYQorICogc3VidHJlZSBvZiBpdC4KKyAqLwordm9pZCBzaGlmdF90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gxLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMiwKKwkJdW5zaWduZWQgY2hhciAqc2hpZnRlZCwKKwkJaW50IGRlcHRoX2xpbWl0KQoreworCWNoYXIgKmFkZF9wcmVmaXg7CisJY2hhciAqZGVsX3ByZWZpeDsKKwlpbnQgYWRkX3Njb3JlLCBkZWxfc2NvcmU7CisKKwlhZGRfc2NvcmUgPSBkZWxfc2NvcmUgPSBzY29yZV90cmVlcyhoYXNoMSwgaGFzaDIpOworCWFkZF9wcmVmaXggPSB4Y2FsbG9jKDEsIDEpOworCWRlbF9wcmVmaXggPSB4Y2FsbG9jKDEsIDEpOworCisJLyoKKwkgKiBTZWUgaWYgb25lJ3Mgc3VidHJlZSByZXNlbWJsZXMgdHdvOyBpZiBzbyB3ZSBuZWVkIHRvIHByZWZpeAorCSAqIHR3byB3aXRoIGEgZmV3IGZha2UgdHJlZXMgdG8gbWF0Y2ggdGhlIHByZWZpeC4KKwkgKi8KKwltYXRjaF90cmVlcyhoYXNoMSwgaGFzaDIsICZhZGRfc2NvcmUsICZhZGRfcHJlZml4LCAiIiwgZGVwdGhfbGltaXQpOworCisJLyoKKwkgKiBTZWUgaWYgdHdvJ3Mgc3VidHJlZSByZXNlbWJsZXMgb25lOyBpZiBzbyB3ZSBuZWVkIHRvCisJICogcGljayBvbmx5IHN1YnRyZWUgb2YgdHdvLgorCSAqLworCW1hdGNoX3RyZWVzKGhhc2gyLCBoYXNoMSwgJmRlbF9zY29yZSwgJmRlbF9wcmVmaXgsICIiLCBkZXB0aF9saW1pdCk7CisKKwkvKiBBc3N1bWUgd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55IHNoaWZ0aW5nICovCisJaGFzaGNweShzaGlmdGVkLCBoYXNoMik7CisKKwlpZiAoYWRkX3Njb3JlIDwgZGVsX3Njb3JlKSB7CisJCS8qIFdlIG5lZWQgdG8gcGljayBhIHN1YnRyZWUgb2YgdHdvICovCisJCXVuc2lnbmVkIG1vZGU7CisKKwkJaWYgKCEqZGVsX3ByZWZpeCkKKwkJCXJldHVybjsKKworCQlpZiAoZ2V0X3RyZWVfZW50cnkoaGFzaDIsIGRlbF9wcmVmaXgsIHNoaWZ0ZWQsICZtb2RlKSkKKwkJCWRpZSgiY2Fubm90IGZpbmQgcGF0aCAlcyBpbiB0cmVlICVzIiwKKwkJCSAgICBkZWxfcHJlZml4LCBzaGExX3RvX2hleChoYXNoMikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEqYWRkX3ByZWZpeCkKKwkJcmV0dXJuOworCisJc3BsaWNlX3RyZWUoaGFzaDEsIGFkZF9wcmVmaXgsIGhhc2gyLCBzaGlmdGVkKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVyZ2UtZmlsZS5jIGIvbWVyZ2UtZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGQxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZXJnZS1maWxlLmMKQEAgLTAsMCArMSwxMTcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgaW50IGZpbGxfbW1maWxlX2Jsb2IobW1maWxlX3QgKmYsIHN0cnVjdCBibG9iICpvYmopCit7CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisKKwlidWYgPSByZWFkX3NoYTFfZmlsZShvYmotPm9iamVjdC5zaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghYnVmKQorCQlyZXR1cm4gLTE7CisJaWYgKHR5cGUgIT0gT0JKX0JMT0IpCisJCXJldHVybiAtMTsKKwlmLT5wdHIgPSBidWY7CisJZi0+c2l6ZSA9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfbW1maWxlKG1tZmlsZV90ICpmKQoreworCWZyZWUoZi0+cHRyKTsKK30KKworc3RhdGljIHZvaWQgKnRocmVlX3dheV9maWxlbWVyZ2UobW1maWxlX3QgKmJhc2UsIG1tZmlsZV90ICpvdXIsIG1tZmlsZV90ICp0aGVpciwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwltbWJ1ZmZlcl90IHJlczsKKwl4cHBhcmFtX3QgeHBwOworCWludCBtZXJnZV9zdGF0dXM7CisKKwltZW1zZXQoJnhwcCwgMCwgc2l6ZW9mKHhwcCkpOworCW1lcmdlX3N0YXR1cyA9IHhkbF9tZXJnZShiYXNlLCBvdXIsICIub3VyIiwgdGhlaXIsICIudGhlaXIiLAorCQkmeHBwLCBYRExfTUVSR0VfWkVBTE9VUywgJnJlcyk7CisKKwlpZiAobWVyZ2Vfc3RhdHVzIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqc2l6ZSA9IHJlcy5zaXplOworCXJldHVybiByZXMucHRyOworfQorCitzdGF0aWMgaW50IGNvbW1vbl9vdXRmKHZvaWQgKnByaXZfLCBtbWJ1ZmZlcl90ICptYiwgaW50IG5idWYpCit7CisJaW50IGk7CisJbW1maWxlX3QgKmRzdCA9IHByaXZfOworCisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykgeworCQltZW1jcHkoZHN0LT5wdHIgKyBkc3QtPnNpemUsIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCWRzdC0+c2l6ZSArPSBtYltpXS5zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9jb21tb25fZmlsZShtbWZpbGVfdCAqcmVzLCBtbWZpbGVfdCAqZjEsIG1tZmlsZV90ICpmMikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBmMS0+c2l6ZSA8IGYyLT5zaXplID8gZjEtPnNpemUgOiBmMi0+c2l6ZTsKKwl2b2lkICpwdHIgPSB4bWFsbG9jKHNpemUpOworCXhwcGFyYW1fdCB4cHA7CisJeGRlbWl0Y29uZl90IHhlY2ZnOworCXhkZW1pdGNiX3QgZWNiOworCisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAzOworCXhlY2ZnLmZsYWdzID0gWERMX0VNSVRfQ09NTU9OOworCWVjYi5vdXRmID0gY29tbW9uX291dGY7CisKKwlyZXMtPnB0ciA9IHB0cjsKKwlyZXMtPnNpemUgPSAwOworCisJZWNiLnByaXYgPSByZXM7CisJcmV0dXJuIHhkbF9kaWZmKGYxLCBmMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKK30KKwordm9pZCAqbWVyZ2VfZmlsZShzdHJ1Y3QgYmxvYiAqYmFzZSwgc3RydWN0IGJsb2IgKm91ciwgc3RydWN0IGJsb2IgKnRoZWlyLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXZvaWQgKnJlcyA9IE5VTEw7CisJbW1maWxlX3QgZjEsIGYyLCBjb21tb247CisKKwkvKgorCSAqIFJlbW92ZWQgaW4gZWl0aGVyIGJyYW5jaD8KKwkgKgorCSAqIE5PVEUhIFRoaXMgZGVwZW5kcyBvbiB0aGUgY2FsbGVyIGhhdmluZyBkb25lIHRoZQorCSAqIHByb3BlciB3YXJuaW5nIGFib3V0IHJlbW92aW5nIGEgZmlsZSB0aGF0IGdvdAorCSAqIG1vZGlmaWVkIGluIHRoZSBvdGhlciBicmFuY2ghCisJICovCisJaWYgKCFvdXIgfHwgIXRoZWlyKSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJaWYgKGJhc2UpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCFvdXIpCisJCQlvdXIgPSB0aGVpcjsKKwkJcmV0dXJuIHJlYWRfc2hhMV9maWxlKG91ci0+b2JqZWN0LnNoYTEsICZ0eXBlLCBzaXplKTsKKwl9CisKKwlpZiAoZmlsbF9tbWZpbGVfYmxvYigmZjEsIG91cikgPCAwKQorCQlnb3RvIG91dF9ub19tbWZpbGU7CisJaWYgKGZpbGxfbW1maWxlX2Jsb2IoJmYyLCB0aGVpcikgPCAwKQorCQlnb3RvIG91dF9mcmVlX2YxOworCisJaWYgKGJhc2UpIHsKKwkJaWYgKGZpbGxfbW1maWxlX2Jsb2IoJmNvbW1vbiwgYmFzZSkgPCAwKQorCQkJZ290byBvdXRfZnJlZV9mMl9mMTsKKwl9IGVsc2UgeworCQlpZiAoZ2VuZXJhdGVfY29tbW9uX2ZpbGUoJmNvbW1vbiwgJmYxLCAmZjIpIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWVfZjJfZjE7CisJfQorCXJlcyA9IHRocmVlX3dheV9maWxlbWVyZ2UoJmNvbW1vbiwgJmYxLCAmZjIsIHNpemUpOworCWZyZWVfbW1maWxlKCZjb21tb24pOworb3V0X2ZyZWVfZjJfZjE6CisJZnJlZV9tbWZpbGUoJmYyKTsKK291dF9mcmVlX2YxOgorCWZyZWVfbW1maWxlKCZmMSk7CitvdXRfbm9fbW1maWxlOgorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS1pbmRleC5jIGIvbWVyZ2UtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk5ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVyZ2UtaW5kZXguYwpAQCAtMCwwICsxLDEyNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKnBnbTsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd1bWVudHNbOV07CitzdGF0aWMgaW50IG9uZV9zaG90LCBxdWlldDsKK3N0YXRpYyBpbnQgZXJyOworCitzdGF0aWMgdm9pZCBydW5fcHJvZ3JhbSh2b2lkKQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGNoaWxkOworCW1lbXNldCgmY2hpbGQsIDAsIHNpemVvZihjaGlsZCkpOworCWNoaWxkLmFyZ3YgPSBhcmd1bWVudHM7CisJaWYgKHJ1bl9jb21tYW5kKCZjaGlsZCkpIHsKKwkJaWYgKG9uZV9zaG90KSB7CisJCQllcnIrKzsKKwkJfSBlbHNlIHsKKwkJCWlmICghcXVpZXQpCisJCQkJZGllKCJtZXJnZSBwcm9ncmFtIGZhaWxlZCIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtZXJnZV9lbnRyeShpbnQgcG9zLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmb3VuZDsKKwkKKwlpZiAocG9zID49IGFjdGl2ZV9ucikKKwkJZGllKCJnaXQtbWVyZ2UtaW5kZXg6ICVzIG5vdCBpbiB0aGUgY2FjaGUiLCBwYXRoKTsKKwlhcmd1bWVudHNbMF0gPSBwZ207CisJYXJndW1lbnRzWzFdID0gIiI7CisJYXJndW1lbnRzWzJdID0gIiI7CisJYXJndW1lbnRzWzNdID0gIiI7CisJYXJndW1lbnRzWzRdID0gcGF0aDsKKwlhcmd1bWVudHNbNV0gPSAiIjsKKwlhcmd1bWVudHNbNl0gPSAiIjsKKwlhcmd1bWVudHNbN10gPSAiIjsKKwlhcmd1bWVudHNbOF0gPSBOVUxMOworCWZvdW5kID0gMDsKKwlkbyB7CisJCXN0YXRpYyBjaGFyIGhleGJ1Zls0XVs2MF07CisJCXN0YXRpYyBjaGFyIG93bmJ1Zls0XVs2MF07CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJaW50IHN0YWdlID0gY2Vfc3RhZ2UoY2UpOworCisJCWlmIChzdHJjbXAoY2UtPm5hbWUsIHBhdGgpKQorCQkJYnJlYWs7CisJCWZvdW5kKys7CisJCXN0cmNweShoZXhidWZbc3RhZ2VdLCBzaGExX3RvX2hleChjZS0+c2hhMSkpOworCQlzcHJpbnRmKG93bmJ1ZltzdGFnZV0sICIlbyIsIG50b2hsKGNlLT5jZV9tb2RlKSk7CisJCWFyZ3VtZW50c1tzdGFnZV0gPSBoZXhidWZbc3RhZ2VdOworCQlhcmd1bWVudHNbc3RhZ2UgKyA0XSA9IG93bmJ1ZltzdGFnZV07CisJfSB3aGlsZSAoKytwb3MgPCBhY3RpdmVfbnIpOworCWlmICghZm91bmQpCisJCWRpZSgiZ2l0LW1lcmdlLWluZGV4OiAlcyBub3QgaW4gdGhlIGNhY2hlIiwgcGF0aCk7CisJcnVuX3Byb2dyYW0oKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKworCS8qCisJICogSWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlIGFzIHN0YWdlMCwgaXQncworCSAqIGFscmVhZHkgbWVyZ2VkIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmIChwb3MgPCAwKQorCQltZXJnZV9lbnRyeSgtcG9zLTEsIHBhdGgpOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV9hbGwodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKCFjZV9zdGFnZShjZSkpCisJCQljb250aW51ZTsKKwkJaSArPSBtZXJnZV9lbnRyeShpLCBjZS0+bmFtZSktMTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgZm9yY2VfZmlsZSA9IDA7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlpZiAoYXJnYyA8IDMpCisJCXVzYWdlKCJnaXQtbWVyZ2UtaW5kZXggWy1vXSBbLXFdIDxtZXJnZS1wcm9ncmFtPiAoLWEgfCA8ZmlsZW5hbWU+KikiKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlyZWFkX2NhY2hlKCk7CisKKwlpID0gMTsKKwlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW8iKSkgeworCQlvbmVfc2hvdCA9IDE7CisJCWkrKzsKKwl9CisJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1xIikpIHsKKwkJcXVpZXQgPSAxOworCQlpKys7CisJfQorCXBnbSA9IGFyZ3ZbaSsrXTsKKwlmb3IgKDsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoIWZvcmNlX2ZpbGUgJiYgKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCQlmb3JjZV9maWxlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1hIikpIHsKKwkJCQltZXJnZV9hbGwoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRpZSgiZ2l0LW1lcmdlLWluZGV4OiB1bmtub3duIG9wdGlvbiAlcyIsIGFyZyk7CisJCX0KKwkJbWVyZ2VfZmlsZShhcmcpOworCX0KKwlpZiAoZXJyICYmICFxdWlldCkKKwkJZGllKCJtZXJnZSBwcm9ncmFtIGZhaWxlZCIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS1yZWN1cnNpdmUuYyBiL21lcmdlLXJlY3Vyc2l2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODJiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZXJnZS1yZWN1cnNpdmUuYwpAQCAtMCwwICsxLDE3NzYgQEAKKy8qCisgKiBSZWN1cnNpdmUgTWVyZ2UgYWxnb3JpdGhtIHN0b2xlbiBmcm9tIGdpdC1tZXJnZS1yZWN1cnNpdmUucHkgYnkKKyAqIEZyZWRyaWsgS3VpdmluZW4uCisgKiBUaGUgdGhpZXZlcyB3ZXJlIEFsZXggUmllc2VuIGFuZCBKb2hhbm5lcyBTY2hpbmRlbGluLCBpbiBKdW5lL0p1bHkgMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidW5wYWNrLXRyZWVzLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaW50ZXJwb2xhdGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisKK3N0YXRpYyBpbnQgc3VidHJlZV9tZXJnZTsKKworc3RhdGljIHN0cnVjdCB0cmVlICpzaGlmdF90cmVlX29iamVjdChzdHJ1Y3QgdHJlZSAqb25lLCBzdHJ1Y3QgdHJlZSAqdHdvKQoreworCXVuc2lnbmVkIGNoYXIgc2hpZnRlZFsyMF07CisKKwkvKgorCSAqIE5FRURTV09SSzogdGhpcyBsaW1pdHMgdGhlIHJlY3Vyc2lvbiBkZXB0aCB0byBoYXJkY29kZWQKKwkgKiB2YWx1ZSAnMicgdG8gYXZvaWQgZXhjZXNzaXZlIG92ZXJoZWFkLgorCSAqLworCXNoaWZ0X3RyZWUob25lLT5vYmplY3Quc2hhMSwgdHdvLT5vYmplY3Quc2hhMSwgc2hpZnRlZCwgMik7CisJaWYgKCFoYXNoY21wKHR3by0+b2JqZWN0LnNoYTEsIHNoaWZ0ZWQpKQorCQlyZXR1cm4gdHdvOworCXJldHVybiBsb29rdXBfdHJlZShzaGlmdGVkKTsKK30KKworLyoKKyAqIEEgdmlydHVhbCBjb21taXQgaGFzCisgKiAtIChjb25zdCBjaGFyICopY29tbWl0LT51dGlsIHNldCB0byB0aGUgbmFtZSwgYW5kCisgKiAtICooaW50ICopY29tbWl0LT5vYmplY3Quc2hhMSBzZXQgdG8gdGhlIHZpcnR1YWwgaWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNvbW1pdF9saXN0X2NvdW50KGNvbnN0IHN0cnVjdCBjb21taXRfbGlzdCAqbCkKK3sKKwl1bnNpZ25lZCBjID0gMDsKKwlmb3IgKDsgbDsgbCA9IGwtPm5leHQgKQorCQljKys7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICptYWtlX3ZpcnR1YWxfY29tbWl0KHN0cnVjdCB0cmVlICp0cmVlLCBjb25zdCBjaGFyICpjb21tZW50KQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb21taXQpKTsKKwlzdGF0aWMgdW5zaWduZWQgdmlydHVhbF9pZCA9IDE7CisJY29tbWl0LT50cmVlID0gdHJlZTsKKwljb21taXQtPnV0aWwgPSAodm9pZCopY29tbWVudDsKKwkqKGludCopY29tbWl0LT5vYmplY3Quc2hhMSA9IHZpcnR1YWxfaWQrKzsKKwkvKiBhdm9pZCB3YXJuaW5ncyAqLworCWNvbW1pdC0+b2JqZWN0LnBhcnNlZCA9IDE7CisJcmV0dXJuIGNvbW1pdDsKK30KKworLyoKKyAqIFNpbmNlIHdlIHVzZSBnZXRfdHJlZV9lbnRyeSgpLCB3aGljaCBkb2VzIG5vdCBwdXQgdGhlIHJlYWQgb2JqZWN0IGludG8KKyAqIHRoZSBvYmplY3QgcG9vbCwgd2UgY2Fubm90IHJlbHkgb24gYSA9PSBiLgorICovCitzdGF0aWMgaW50IHNoYV9lcShjb25zdCB1bnNpZ25lZCBjaGFyICphLCBjb25zdCB1bnNpZ25lZCBjaGFyICpiKQoreworCWlmICghYSAmJiAhYikKKwkJcmV0dXJuIDI7CisJcmV0dXJuIGEgJiYgYiAmJiBoYXNoY21wKGEsIGIpID09IDA7Cit9CisKKy8qCisgKiBTaW5jZSB3ZSB3YW50IHRvIHdyaXRlIHRoZSBpbmRleCBldmVudHVhbGx5LCB3ZSBjYW5ub3QgcmV1c2UgdGhlIGluZGV4CisgKiBmb3IgdGhlc2UgKHRlbXBvcmFyeSkgZGF0YS4KKyAqLworc3RydWN0IHN0YWdlX2RhdGEKK3sKKwlzdHJ1Y3QKKwl7CisJCXVuc2lnbmVkIG1vZGU7CisJCXVuc2lnbmVkIGNoYXIgc2hhWzIwXTsKKwl9IHN0YWdlc1s0XTsKKwl1bnNpZ25lZCBwcm9jZXNzZWQ6MTsKK307CisKK3N0cnVjdCBvdXRwdXRfYnVmZmVyCit7CisJc3RydWN0IG91dHB1dF9idWZmZXIgKm5leHQ7CisJY2hhciAqc3RyOworfTsKKworc3RhdGljIHN0cnVjdCBwYXRoX2xpc3QgY3VycmVudF9maWxlX3NldCA9IHtOVUxMLCAwLCAwLCAxfTsKK3N0YXRpYyBzdHJ1Y3QgcGF0aF9saXN0IGN1cnJlbnRfZGlyZWN0b3J5X3NldCA9IHtOVUxMLCAwLCAwLCAxfTsKKworc3RhdGljIGludCBjYWxsX2RlcHRoID0gMDsKK3N0YXRpYyBpbnQgdmVyYm9zaXR5ID0gMjsKK3N0YXRpYyBpbnQgYnVmZmVyX291dHB1dCA9IDE7CitzdGF0aWMgc3RydWN0IG91dHB1dF9idWZmZXIgKm91dHB1dF9saXN0LCAqb3V0cHV0X2VuZDsKKworc3RhdGljIGludCBzaG93IChpbnQgdikKK3sKKwlyZXR1cm4gKCFjYWxsX2RlcHRoICYmIHZlcmJvc2l0eSA+PSB2KSB8fCB2ZXJib3NpdHkgPj0gNTsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0KGludCB2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlpZiAoYnVmZmVyX291dHB1dCAmJiBzaG93KHYpKSB7CisJCXN0cnVjdCBvdXRwdXRfYnVmZmVyICpiID0geG1hbGxvYyhzaXplb2YoKmIpKTsKKwkJbmZ2YXNwcmludGYoJmItPnN0ciwgZm10LCBhcmdzKTsKKwkJYi0+bmV4dCA9IE5VTEw7CisJCWlmIChvdXRwdXRfZW5kKQorCQkJb3V0cHV0X2VuZC0+bmV4dCA9IGI7CisJCWVsc2UKKwkJCW91dHB1dF9saXN0ID0gYjsKKwkJb3V0cHV0X2VuZCA9IGI7CisJfSBlbHNlIGlmIChzaG93KHYpKSB7CisJCWludCBpOworCQlmb3IgKGkgPSBjYWxsX2RlcHRoOyBpLS07KQorCQkJZnB1dHMoIiAgIiwgc3Rkb3V0KTsKKwkJdmZwcmludGYoc3Rkb3V0LCBmbXQsIGFyZ3MpOworCQlmcHV0YygnXG4nLCBzdGRvdXQpOworCX0KKwl2YV9lbmQoYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX291dHB1dCgpCit7CisJc3RydWN0IG91dHB1dF9idWZmZXIgKmIsICpuOworCWZvciAoYiA9IG91dHB1dF9saXN0OyBiOyBiID0gbikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gY2FsbF9kZXB0aDsgaS0tOykKKwkJCWZwdXRzKCIgICIsIHN0ZG91dCk7CisJCWZwdXRzKGItPnN0ciwgc3Rkb3V0KTsKKwkJZnB1dGMoJ1xuJywgc3Rkb3V0KTsKKwkJbiA9IGItPm5leHQ7CisJCWZyZWUoYi0+c3RyKTsKKwkJZnJlZShiKTsKKwl9CisJb3V0cHV0X2xpc3QgPSBOVUxMOworCW91dHB1dF9lbmQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfY29tbWl0X3RpdGxlKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpbnQgaTsKKwlmbHVzaF9vdXRwdXQoKTsKKwlmb3IgKGkgPSBjYWxsX2RlcHRoOyBpLS07KQorCQlmcHV0cygiICAiLCBzdGRvdXQpOworCWlmIChjb21taXQtPnV0aWwpCisJCXByaW50ZigidmlydHVhbCAlc1xuIiwgKGNoYXIgKiljb21taXQtPnV0aWwpOworCWVsc2UgeworCQlwcmludGYoIiVzICIsIGZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCBERUZBVUxUX0FCQlJFVikpOworCQlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkgIT0gMCkKKwkJCXByaW50ZigiKGJhZCBjb21taXQpXG4iKTsKKwkJZWxzZSB7CisJCQljb25zdCBjaGFyICpzOworCQkJaW50IGxlbjsKKwkJCWZvciAocyA9IGNvbW1pdC0+YnVmZmVyOyAqczsgcysrKQorCQkJCWlmICgqcyA9PSAnXG4nICYmIHNbMV0gPT0gJ1xuJykgeworCQkJCQlzICs9IDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWZvciAobGVuID0gMDsgc1tsZW5dICYmICdcbicgIT0gc1tsZW5dOyBsZW4rKykKKwkJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJCXByaW50ZigiJS4qc1xuIiwgbGVuLCBzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSAqbWFrZV9jYWNoZV9lbnRyeSh1bnNpZ25lZCBpbnQgbW9kZSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YWdlLCBpbnQgcmVmcmVzaCkKK3sKKwlpbnQgc2l6ZSwgbGVuOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoIXZlcmlmeV9wYXRoKHBhdGgpKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN0cmxlbihwYXRoKTsKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCWhhc2hjcHkoY2UtPnNoYTEsIHNoYTEpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbGVuKTsKKwljZS0+Y2VfZmxhZ3MgPSBjcmVhdGVfY2VfZmxhZ3MobGVuLCBzdGFnZSk7CisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShtb2RlKTsKKworCWlmIChyZWZyZXNoKQorCQlyZXR1cm4gcmVmcmVzaF9jYWNoZV9lbnRyeShjZSwgMCk7CisKKwlyZXR1cm4gY2U7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2NhY2hlaW5mbyh1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YWdlLCBpbnQgcmVmcmVzaCwgaW50IG9wdGlvbnMpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwljZSA9IG1ha2VfY2FjaGVfZW50cnkobW9kZSwgc2hhMSA/IHNoYTEgOiBudWxsX3NoYTEsIHBhdGgsIHN0YWdlLCByZWZyZXNoKTsKKwlpZiAoIWNlKQorCQlyZXR1cm4gZXJyb3IoImFkZGluZm9fY2FjaGUgZmFpbGVkIGZvciBwYXRoICclcyciLCBwYXRoKTsKKwlyZXR1cm4gYWRkX2NhY2hlX2VudHJ5KGNlLCBvcHRpb25zKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMgdXNlZCBpbiBhIG51bWJlciBvZiBwbGFjZXMgYnV0CisgKiBvbmx5IHdyaXR0ZW4gdG8gaW4gdGhlICdtZXJnZScgZnVuY3Rpb24uCisgKgorICogaW5kZXhfb25seSA9PSAxICAgID0+IERvbid0IGxlYXZlIGFueSBub24tc3RhZ2UgMCBlbnRyaWVzIGluIHRoZSBjYWNoZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICBkb24ndCB1cGRhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorICogICAgICAgICAgICAgICAwICAgID0+IExlYXZlIHVubWVyZ2VkIGVudHJpZXMgaW4gdGhlIGNhY2hlIGFuZCB1cGRhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQgaW5kZXhfb25seSA9IDA7CisKK3N0YXRpYyBpbnQgZ2l0X21lcmdlX3RyZWVzKGludCBpbmRleF9vbmx5LAorCQkJICAgc3RydWN0IHRyZWUgKmNvbW1vbiwKKwkJCSAgIHN0cnVjdCB0cmVlICpoZWFkLAorCQkJICAgc3RydWN0IHRyZWUgKm1lcmdlKQoreworCWludCByYzsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnRyZWVzID0gTlVMTDsKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlpZiAoaW5kZXhfb25seSkKKwkJb3B0cy5pbmRleF9vbmx5ID0gMTsKKwllbHNlCisJCW9wdHMudXBkYXRlID0gMTsKKwlvcHRzLm1lcmdlID0gMTsKKwlvcHRzLmhlYWRfaWR4ID0gMjsKKwlvcHRzLmZuID0gdGhyZWV3YXlfbWVyZ2U7CisKKwlvYmplY3RfbGlzdF9hcHBlbmQoJmNvbW1vbi0+b2JqZWN0LCAmdHJlZXMpOworCW9iamVjdF9saXN0X2FwcGVuZCgmaGVhZC0+b2JqZWN0LCAmdHJlZXMpOworCW9iamVjdF9saXN0X2FwcGVuZCgmbWVyZ2UtPm9iamVjdCwgJnRyZWVzKTsKKworCXJjID0gdW5wYWNrX3RyZWVzKHRyZWVzLCAmb3B0cyk7CisJY2FjaGVfdHJlZV9mcmVlKCZhY3RpdmVfY2FjaGVfdHJlZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVubWVyZ2VkX2luZGV4KHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZSAqZ2l0X3dyaXRlX3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgdHJlZSAqcmVzdWx0ID0gTlVMTDsKKworCWlmICh1bm1lcmdlZF9pbmRleCgpKSB7CisJCWludCBpOworCQlvdXRwdXQoMCwgIlRoZXJlIGFyZSB1bm1lcmdlZCBpbmRleCBlbnRyaWVzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCQlpZiAoY2Vfc3RhZ2UoY2UpKQorCQkJCW91dHB1dCgwLCAiJWQgJS4qcyIsIGNlX3N0YWdlKGNlKSwgY2VfbmFtZWxlbihjZSksIGNlLT5uYW1lKTsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWFjdGl2ZV9jYWNoZV90cmVlKQorCQlhY3RpdmVfY2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKworCWlmICghY2FjaGVfdHJlZV9mdWxseV92YWxpZChhY3RpdmVfY2FjaGVfdHJlZSkgJiYKKwkgICAgY2FjaGVfdHJlZV91cGRhdGUoYWN0aXZlX2NhY2hlX3RyZWUsCisJCQkgICAgICBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9uciwgMCwgMCkgPCAwKQorCQlkaWUoImVycm9yIGJ1aWxkaW5nIHRyZWVzIik7CisKKwlyZXN1bHQgPSBsb29rdXBfdHJlZShhY3RpdmVfY2FjaGVfdHJlZS0+c2hhMSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNhdmVfZmlsZXNfZGlycyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQljb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aCwKKwkJdW5zaWduZWQgaW50IG1vZGUsIGludCBzdGFnZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCWNoYXIgKm5ld3BhdGggPSB4bWFsbG9jKGJhc2VsZW4gKyBsZW4gKyAxKTsKKwltZW1jcHkobmV3cGF0aCwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld3BhdGggKyBiYXNlbGVuLCBwYXRoLCBsZW4pOworCW5ld3BhdGhbYmFzZWxlbiArIGxlbl0gPSAnXDAnOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXBhdGhfbGlzdF9pbnNlcnQobmV3cGF0aCwgJmN1cnJlbnRfZGlyZWN0b3J5X3NldCk7CisJZWxzZQorCQlwYXRoX2xpc3RfaW5zZXJ0KG5ld3BhdGgsICZjdXJyZW50X2ZpbGVfc2V0KTsKKwlmcmVlKG5ld3BhdGgpOworCisJcmV0dXJuIFJFQURfVFJFRV9SRUNVUlNJVkU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpbGVzX2RpcnMoc3RydWN0IHRyZWUgKnRyZWUpCit7CisJaW50IG47CisJaWYgKHJlYWRfdHJlZV9yZWN1cnNpdmUodHJlZSwgIiIsIDAsIDAsIE5VTEwsIHNhdmVfZmlsZXNfZGlycykgIT0gMCkKKwkJcmV0dXJuIDA7CisJbiA9IGN1cnJlbnRfZmlsZV9zZXQubnIgKyBjdXJyZW50X2RpcmVjdG9yeV9zZXQubnI7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgaW5kZXhfZW50cnkgaW5zdGFuY2Ugd2hpY2ggZG9lc24ndCBoYXZlIHRvIGNvcnJlc3BvbmQgdG8KKyAqIGEgcmVhbCBjYWNoZSBlbnRyeSBpbiBHaXQncyBpbmRleC4KKyAqLworc3RhdGljIHN0cnVjdCBzdGFnZV9kYXRhICppbnNlcnRfc3RhZ2VfZGF0YShjb25zdCBjaGFyICpwYXRoLAorCQlzdHJ1Y3QgdHJlZSAqbywgc3RydWN0IHRyZWUgKmEsIHN0cnVjdCB0cmVlICpiLAorCQlzdHJ1Y3QgcGF0aF9saXN0ICplbnRyaWVzKQoreworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwlzdHJ1Y3Qgc3RhZ2VfZGF0YSAqZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdGFnZV9kYXRhKSk7CisJZ2V0X3RyZWVfZW50cnkoby0+b2JqZWN0LnNoYTEsIHBhdGgsCisJCQllLT5zdGFnZXNbMV0uc2hhLCAmZS0+c3RhZ2VzWzFdLm1vZGUpOworCWdldF90cmVlX2VudHJ5KGEtPm9iamVjdC5zaGExLCBwYXRoLAorCQkJZS0+c3RhZ2VzWzJdLnNoYSwgJmUtPnN0YWdlc1syXS5tb2RlKTsKKwlnZXRfdHJlZV9lbnRyeShiLT5vYmplY3Quc2hhMSwgcGF0aCwKKwkJCWUtPnN0YWdlc1szXS5zaGEsICZlLT5zdGFnZXNbM10ubW9kZSk7CisJaXRlbSA9IHBhdGhfbGlzdF9pbnNlcnQocGF0aCwgZW50cmllcyk7CisJaXRlbS0+dXRpbCA9IGU7CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZSBuYW1lcyB0byBzdGFnZV9kYXRhIG9iamVjdHMuIFRoZQorICogZGljdGlvbmFyeSBjb250YWlucyBvbmUgZW50cnkgZm9yIGV2ZXJ5IHBhdGggd2l0aCBhIG5vbi16ZXJvIHN0YWdlIGVudHJ5LgorICovCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCAqZ2V0X3VubWVyZ2VkKHZvaWQpCit7CisJc3RydWN0IHBhdGhfbGlzdCAqdW5tZXJnZWQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0KSk7CisJaW50IGk7CisKKwl1bm1lcmdlZC0+c3RyZHVwX3BhdGhzID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisJCXN0cnVjdCBzdGFnZV9kYXRhICplOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIWNlX3N0YWdlKGNlKSkKKwkJCWNvbnRpbnVlOworCisJCWl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKGNlLT5uYW1lLCB1bm1lcmdlZCk7CisJCWlmICghaXRlbSkgeworCQkJaXRlbSA9IHBhdGhfbGlzdF9pbnNlcnQoY2UtPm5hbWUsIHVubWVyZ2VkKTsKKwkJCWl0ZW0tPnV0aWwgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3RhZ2VfZGF0YSkpOworCQl9CisJCWUgPSBpdGVtLT51dGlsOworCQllLT5zdGFnZXNbY2Vfc3RhZ2UoY2UpXS5tb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQloYXNoY3B5KGUtPnN0YWdlc1tjZV9zdGFnZShjZSldLnNoYSwgY2UtPnNoYTEpOworCX0KKworCXJldHVybiB1bm1lcmdlZDsKK30KKworc3RydWN0IHJlbmFtZQoreworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyOworCXN0cnVjdCBzdGFnZV9kYXRhICpzcmNfZW50cnk7CisJc3RydWN0IHN0YWdlX2RhdGEgKmRzdF9lbnRyeTsKKwl1bnNpZ25lZCBwcm9jZXNzZWQ6MTsKK307CisKKy8qCisgKiBHZXQgaW5mb3JtYXRpb24gb2YgYWxsIHJlbmFtZXMgd2hpY2ggb2NjdXJyZWQgYmV0d2VlbiAnb190cmVlJyBhbmQKKyAqICd0cmVlJy4gV2UgbmVlZCB0aGUgdGhyZWUgdHJlZXMgaW4gdGhlIG1lcmdlICgnb190cmVlJywgJ2FfdHJlZScgYW5kCisgKiAnYl90cmVlJykgdG8gYmUgYWJsZSB0byBhc3NvY2lhdGUgdGhlIGNvcnJlY3QgY2FjaGUgZW50cmllcyB3aXRoCisgKiB0aGUgcmVuYW1lIGluZm9ybWF0aW9uLiAndHJlZScgaXMgYWx3YXlzIGVxdWFsIHRvIGVpdGhlciBhX3RyZWUgb3IgYl90cmVlLgorICovCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCAqZ2V0X3JlbmFtZXMoc3RydWN0IHRyZWUgKnRyZWUsCisJCQkJCXN0cnVjdCB0cmVlICpvX3RyZWUsCisJCQkJCXN0cnVjdCB0cmVlICphX3RyZWUsCisJCQkJCXN0cnVjdCB0cmVlICpiX3RyZWUsCisJCQkJCXN0cnVjdCBwYXRoX2xpc3QgKmVudHJpZXMpCit7CisJaW50IGk7CisJc3RydWN0IHBhdGhfbGlzdCAqcmVuYW1lczsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIG9wdHM7CisKKwlyZW5hbWVzID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBhdGhfbGlzdCkpOworCWRpZmZfc2V0dXAoJm9wdHMpOworCW9wdHMucmVjdXJzaXZlID0gMTsKKwlvcHRzLmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWlmIChkaWZmX3NldHVwX2RvbmUoJm9wdHMpIDwgMCkKKwkJZGllKCJkaWZmIHNldHVwIGZhaWxlZCIpOworCWRpZmZfdHJlZV9zaGExKG9fdHJlZS0+b2JqZWN0LnNoYTEsIHRyZWUtPm9iamVjdC5zaGExLCAiIiwgJm9wdHMpOworCWRpZmZjb3JlX3N0ZCgmb3B0cyk7CisJZm9yIChpID0gMDsgaSA8IGRpZmZfcXVldWVkX2RpZmYubnI7ICsraSkgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisJCXN0cnVjdCByZW5hbWUgKnJlOworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpciA9IGRpZmZfcXVldWVkX2RpZmYucXVldWVbaV07CisJCWlmIChwYWlyLT5zdGF0dXMgIT0gJ1InKSB7CisJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocGFpcik7CisJCQljb250aW51ZTsKKwkJfQorCQlyZSA9IHhtYWxsb2Moc2l6ZW9mKCpyZSkpOworCQlyZS0+cHJvY2Vzc2VkID0gMDsKKwkJcmUtPnBhaXIgPSBwYWlyOworCQlpdGVtID0gcGF0aF9saXN0X2xvb2t1cChyZS0+cGFpci0+b25lLT5wYXRoLCBlbnRyaWVzKTsKKwkJaWYgKCFpdGVtKQorCQkJcmUtPnNyY19lbnRyeSA9IGluc2VydF9zdGFnZV9kYXRhKHJlLT5wYWlyLT5vbmUtPnBhdGgsCisJCQkJCW9fdHJlZSwgYV90cmVlLCBiX3RyZWUsIGVudHJpZXMpOworCQllbHNlCisJCQlyZS0+c3JjX2VudHJ5ID0gaXRlbS0+dXRpbDsKKworCQlpdGVtID0gcGF0aF9saXN0X2xvb2t1cChyZS0+cGFpci0+dHdvLT5wYXRoLCBlbnRyaWVzKTsKKwkJaWYgKCFpdGVtKQorCQkJcmUtPmRzdF9lbnRyeSA9IGluc2VydF9zdGFnZV9kYXRhKHJlLT5wYWlyLT50d28tPnBhdGgsCisJCQkJCW9fdHJlZSwgYV90cmVlLCBiX3RyZWUsIGVudHJpZXMpOworCQllbHNlCisJCQlyZS0+ZHN0X2VudHJ5ID0gaXRlbS0+dXRpbDsKKwkJaXRlbSA9IHBhdGhfbGlzdF9pbnNlcnQocGFpci0+b25lLT5wYXRoLCByZW5hbWVzKTsKKwkJaXRlbS0+dXRpbCA9IHJlOworCX0KKwlvcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJZGlmZl9xdWV1ZWRfZGlmZi5uciA9IDA7CisJZGlmZl9mbHVzaCgmb3B0cyk7CisJcmV0dXJuIHJlbmFtZXM7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3N0YWdlcyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbywKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYSwgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmIsCisJCQkgaW50IGNsZWFyKQoreworCWludCBvcHRpb25zID0gQUREX0NBQ0hFX09LX1RPX0FERCB8IEFERF9DQUNIRV9PS19UT19SRVBMQUNFOworCWlmIChjbGVhcikKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCQlyZXR1cm4gLTE7CisJaWYgKG8pCisJCWlmIChhZGRfY2FjaGVpbmZvKG8tPm1vZGUsIG8tPnNoYTEsIHBhdGgsIDEsIDAsIG9wdGlvbnMpKQorCQkJcmV0dXJuIC0xOworCWlmIChhKQorCQlpZiAoYWRkX2NhY2hlaW5mbyhhLT5tb2RlLCBhLT5zaGExLCBwYXRoLCAyLCAwLCBvcHRpb25zKSkKKwkJCXJldHVybiAtMTsKKwlpZiAoYikKKwkJaWYgKGFkZF9jYWNoZWluZm8oYi0+bW9kZSwgYi0+c2hhMSwgcGF0aCwgMywgMCwgb3B0aW9ucykpCisJCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3BhdGgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0LCBsZW47CisJY2hhciAqc2xhc2gsICpkaXJzOworCisJcmV0ID0gdW5saW5rKG5hbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbGVuID0gc3RybGVuKG5hbWUpOworCWRpcnMgPSB4bWFsbG9jKGxlbisxKTsKKwltZW1jcHkoZGlycywgbmFtZSwgbGVuKTsKKwlkaXJzW2xlbl0gPSAnXDAnOworCXdoaWxlICgoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CisJCSpzbGFzaCA9ICdcMCc7CisJCWxlbiA9IHNsYXNoIC0gbmFtZTsKKwkJaWYgKHJtZGlyKG5hbWUpICE9IDApCisJCQlicmVhazsKKwl9CisJZnJlZShkaXJzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlbW92ZV9maWxlKGludCBjbGVhbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IG5vX3dkKQoreworCWludCB1cGRhdGVfY2FjaGUgPSBpbmRleF9vbmx5IHx8IGNsZWFuOworCWludCB1cGRhdGVfd29ya2luZ19kaXJlY3RvcnkgPSAhaW5kZXhfb25seSAmJiAhbm9fd2Q7CisKKwlpZiAodXBkYXRlX2NhY2hlKSB7CisJCWlmIChyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGgpKQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAodXBkYXRlX3dvcmtpbmdfZGlyZWN0b3J5KSB7CisJCXVubGluayhwYXRoKTsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCB8fCBlcnJubyAhPSBFSVNESVIpCisJCQlyZXR1cm4gLTE7CisJCXJlbW92ZV9wYXRoKHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnVuaXF1ZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJyYW5jaCkKK3sKKwljaGFyICpuZXdwYXRoID0geG1hbGxvYyhzdHJsZW4ocGF0aCkgKyAxICsgc3RybGVuKGJyYW5jaCkgKyA4ICsgMSk7CisJaW50IHN1ZmZpeCA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqcCA9IG5ld3BhdGggKyBzdHJsZW4ocGF0aCk7CisJc3RyY3B5KG5ld3BhdGgsIHBhdGgpOworCSoocCsrKSA9ICd+JzsKKwlzdHJjcHkocCwgYnJhbmNoKTsKKwlmb3IgKDsgKnA7ICsrcCkKKwkJaWYgKCcvJyA9PSAqcCkKKwkJCSpwID0gJ18nOworCXdoaWxlIChwYXRoX2xpc3RfaGFzX3BhdGgoJmN1cnJlbnRfZmlsZV9zZXQsIG5ld3BhdGgpIHx8CisJICAgICAgIHBhdGhfbGlzdF9oYXNfcGF0aCgmY3VycmVudF9kaXJlY3Rvcnlfc2V0LCBuZXdwYXRoKSB8fAorCSAgICAgICBsc3RhdChuZXdwYXRoLCAmc3QpID09IDApCisJCXNwcmludGYocCwgIl8lZCIsIHN1ZmZpeCsrKTsKKworCXBhdGhfbGlzdF9pbnNlcnQobmV3cGF0aCwgJmN1cnJlbnRfZmlsZV9zZXQpOworCXJldHVybiBuZXdwYXRoOworfQorCitzdGF0aWMgaW50IG1rZGlyX3AoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBtb2RlKQoreworCS8qIHBhdGggcG9pbnRzIHRvIGNhY2hlIGVudHJpZXMsIHNvIHhzdHJkdXAgYmVmb3JlIG1lc3Npbmcgd2l0aCBpdCAqLworCWNoYXIgKmJ1ZiA9IHhzdHJkdXAocGF0aCk7CisJaW50IHJlc3VsdCA9IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoYnVmKTsKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfYnVmZmVyKGludCBmZCwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWxvbmcgcmV0ID0gd3JpdGVfaW5fZnVsbChmZCwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIElnbm9yZSBlcGlwZSAqLworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWJyZWFrOworCQkJZGllKCJtZXJnZS1yZWN1cnNpdmU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghcmV0KSB7CisJCQlkaWUoIm1lcmdlLXJlY3Vyc2l2ZTogZGlzayBmdWxsPyIpOworCQl9CisJCXNpemUgLT0gcmV0OworCQlidWYgKz0gcmV0OworCX0KK30KKworc3RhdGljIGludCBtYWtlX3Jvb21fZm9yX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgc3RhdHVzOworCWNvbnN0IGNoYXIgKm1zZyA9ICJmYWlsZWQgdG8gY3JlYXRlIHBhdGggJyVzJyVzIjsKKworCXN0YXR1cyA9IG1rZGlyX3AocGF0aCwgMDc3Nyk7CisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IC0zKSB7CisJCQkvKiBzb21ldGhpbmcgZWxzZSBleGlzdHMgKi8KKwkJCWVycm9yKG1zZywgcGF0aCwgIjogcGVyaGFwcyBhIEQvRiBjb25mbGljdD8iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkaWUobXNnLCBwYXRoLCAiIik7CisJfQorCisJLyogU3VjY2Vzc2Z1bCB1bmxpbmsgaXMgZ29vZC4uICovCisJaWYgKCF1bmxpbmsocGF0aCkpCisJCXJldHVybiAwOworCS8qIC4uIGFuZCBzbyBpcyBubyBleGlzdGluZyBmaWxlICovCisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJcmV0dXJuIDA7CisJLyogLi4gYnV0IG5vdCBzb21lIG90aGVyIGVycm9yICh3aG8gcmVhbGx5IGNhcmVzIHdoYXQ/KSAqLworCXJldHVybiBlcnJvcihtc2csIHBhdGgsICI6IHBlcmhhcHMgYSBEL0YgY29uZmxpY3Q/Iik7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9maWxlX2ZsYWdzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYSwKKwkJCSAgICAgIHVuc2lnbmVkIG1vZGUsCisJCQkgICAgICBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgICAgaW50IHVwZGF0ZV9jYWNoZSwKKwkJCSAgICAgIGludCB1cGRhdGVfd2QpCit7CisJaWYgKGluZGV4X29ubHkpCisJCXVwZGF0ZV93ZCA9IDA7CisKKwlpZiAodXBkYXRlX3dkKSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdm9pZCAqYnVmOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhLCAmdHlwZSwgJnNpemUpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgiY2Fubm90IHJlYWQgb2JqZWN0ICVzICclcyciLCBzaGExX3RvX2hleChzaGEpLCBwYXRoKTsKKwkJaWYgKHR5cGUgIT0gT0JKX0JMT0IpCisJCQlkaWUoImJsb2IgZXhwZWN0ZWQgZm9yICVzICclcyciLCBzaGExX3RvX2hleChzaGEpLCBwYXRoKTsKKworCQlpZiAobWFrZV9yb29tX2Zvcl9wYXRoKHBhdGgpIDwgMCkgeworCQkJdXBkYXRlX3dkID0gMDsKKwkJCWdvdG8gdXBkYXRlX2luZGV4OworCQl9CisJCWlmIChTX0lTUkVHKG1vZGUpIHx8ICghaGFzX3N5bWxpbmtzICYmIFNfSVNMTksobW9kZSkpKSB7CisJCQlpbnQgZmQ7CisJCQlpZiAobW9kZSAmIDAxMDApCisJCQkJbW9kZSA9IDA3Nzc7CisJCQllbHNlCisJCQkJbW9kZSA9IDA2NjY7CisJCQlmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgbW9kZSk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWRpZSgiZmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZsdXNoX2J1ZmZlcihmZCwgYnVmLCBzaXplKTsKKwkJCWNsb3NlKGZkKTsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKG1vZGUpKSB7CisJCQljaGFyICpsbmsgPSB4bWFsbG9jKHNpemUgKyAxKTsKKwkJCW1lbWNweShsbmssIGJ1Ziwgc2l6ZSk7CisJCQlsbmtbc2l6ZV0gPSAnXDAnOworCQkJbWtkaXJfcChwYXRoLCAwNzc3KTsKKwkJCXVubGluayhwYXRoKTsKKwkJCXN5bWxpbmsobG5rLCBwYXRoKTsKKwkJCWZyZWUobG5rKTsKKwkJfSBlbHNlCisJCQlkaWUoImRvIG5vdCBrbm93IHdoYXQgdG8gZG8gd2l0aCAlMDZvICVzICclcyciLAorCQkJICAgIG1vZGUsIHNoYTFfdG9faGV4KHNoYSksIHBhdGgpOworCX0KKyB1cGRhdGVfaW5kZXg6CisJaWYgKHVwZGF0ZV9jYWNoZSkKKwkJYWRkX2NhY2hlaW5mbyhtb2RlLCBzaGEsIHBhdGgsIDAsIHVwZGF0ZV93ZCwgQUREX0NBQ0hFX09LX1RPX0FERCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9maWxlKGludCBjbGVhbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYSwKKwkJCXVuc2lnbmVkIG1vZGUsCisJCQljb25zdCBjaGFyICpwYXRoKQoreworCXVwZGF0ZV9maWxlX2ZsYWdzKHNoYSwgbW9kZSwgcGF0aCwgaW5kZXhfb25seSB8fCBjbGVhbiwgIWluZGV4X29ubHkpOworfQorCisvKiBMb3cgbGV2ZWwgZmlsZSBtZXJnaW5nLCB1cGRhdGUgYW5kIHJlbW92YWwgKi8KKworc3RydWN0IG1lcmdlX2ZpbGVfaW5mbworeworCXVuc2lnbmVkIGNoYXIgc2hhWzIwXTsKKwl1bnNpZ25lZCBtb2RlOworCXVuc2lnbmVkIGNsZWFuOjEsCisJCSBtZXJnZToxOworfTsKKworc3RhdGljIHZvaWQgZmlsbF9tbShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBtbWZpbGVfdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKworCWlmICghaGFzaGNtcChzaGExLCBudWxsX3NoYTEpKSB7CisJCW1tLT5wdHIgPSB4c3RyZHVwKCIiKTsKKwkJbW0tPnNpemUgPSAwOworCQlyZXR1cm47CisJfQorCisJbW0tPnB0ciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFtbS0+cHRyIHx8IHR5cGUgIT0gT0JKX0JMT0IpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgYmxvYiBvYmplY3QgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJbW0tPnNpemUgPSBzaXplOworfQorCisvKgorICogQ3VzdG9taXphYmxlIGxvdy1sZXZlbCBtZXJnZSBkcml2ZXJzIHN1cHBvcnQuCisgKi8KKworc3RydWN0IGxsX21lcmdlX2RyaXZlcjsKK3R5cGVkZWYgaW50ICgqbGxfbWVyZ2VfZm4pKGNvbnN0IHN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKiwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICBtbWZpbGVfdCAqb3JpZywKKwkJCSAgIG1tZmlsZV90ICpzcmMxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJCSAgIG1tZmlsZV90ICpzcmMyLCBjb25zdCBjaGFyICpuYW1lMiwKKwkJCSAgIG1tYnVmZmVyX3QgKnJlc3VsdCk7CisKK3N0cnVjdCBsbF9tZXJnZV9kcml2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJbGxfbWVyZ2VfZm4gZm47CisJY29uc3QgY2hhciAqcmVjdXJzaXZlOworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKm5leHQ7CisJY2hhciAqY21kbGluZTsKK307CisKKy8qCisgKiBCdWlsdC1pbiBsb3ctbGV2ZWxzCisgKi8KK3N0YXRpYyBpbnQgbGxfeGRsX21lcmdlKGNvbnN0IHN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmRydl91bnVzZWQsCisJCQljb25zdCBjaGFyICpwYXRoX3VudXNlZCwKKwkJCW1tZmlsZV90ICpvcmlnLAorCQkJbW1maWxlX3QgKnNyYzEsIGNvbnN0IGNoYXIgKm5hbWUxLAorCQkJbW1maWxlX3QgKnNyYzIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQkJbW1idWZmZXJfdCAqcmVzdWx0KQoreworCXhwcGFyYW1fdCB4cHA7CisKKwlpZiAoYnVmZmVyX2lzX2JpbmFyeShvcmlnLT5wdHIsIG9yaWctPnNpemUpIHx8CisJCQlidWZmZXJfaXNfYmluYXJ5KHNyYzEtPnB0ciwgc3JjMS0+c2l6ZSkgfHwKKwkJCWJ1ZmZlcl9pc19iaW5hcnkoc3JjMi0+cHRyLCBzcmMyLT5zaXplKSkKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgbWVyZ2UgYmluYXJ5IGZpbGVzOiAlcyB2cy4gJXNcbiIsCisJCQluYW1lMSwgbmFtZTIpOworCisJbWVtc2V0KCZ4cHAsIDAsIHNpemVvZih4cHApKTsKKwlyZXR1cm4geGRsX21lcmdlKG9yaWcsCisJCQkgc3JjMSwgbmFtZTEsCisJCQkgc3JjMiwgbmFtZTIsCisJCQkgJnhwcCwgWERMX01FUkdFX1pFQUxPVVMsCisJCQkgcmVzdWx0KTsKK30KKworc3RhdGljIGludCBsbF91bmlvbl9tZXJnZShjb25zdCBzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyICpkcnZfdW51c2VkLAorCQkJICBjb25zdCBjaGFyICpwYXRoX3VudXNlZCwKKwkJCSAgbW1maWxlX3QgKm9yaWcsCisJCQkgIG1tZmlsZV90ICpzcmMxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJCSAgbW1maWxlX3QgKnNyYzIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQkJICBtbWJ1ZmZlcl90ICpyZXN1bHQpCit7CisJY2hhciAqc3JjLCAqZHN0OworCWxvbmcgc2l6ZTsKKwljb25zdCBpbnQgbWFya2VyX3NpemUgPSA3OworCisJaW50IHN0YXR1cyA9IGxsX3hkbF9tZXJnZShkcnZfdW51c2VkLCBwYXRoX3VudXNlZCwKKwkJCQkgIG9yaWcsIHNyYzEsIE5VTEwsIHNyYzIsIE5VTEwsIHJlc3VsdCk7CisJaWYgKHN0YXR1cyA8PSAwKQorCQlyZXR1cm4gc3RhdHVzOworCXNpemUgPSByZXN1bHQtPnNpemU7CisJc3JjID0gZHN0ID0gcmVzdWx0LT5wdHI7CisJd2hpbGUgKHNpemUpIHsKKwkJY2hhciBjaDsKKwkJaWYgKChtYXJrZXJfc2l6ZSA8IHNpemUpICYmCisJCSAgICAoKnNyYyA9PSAnPCcgfHwgKnNyYyA9PSAnPScgfHwgKnNyYyA9PSAnPicpKSB7CisJCQlpbnQgaTsKKwkJCWNoID0gKnNyYzsKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXJrZXJfc2l6ZTsgaSsrKQorCQkJCWlmIChzcmNbaV0gIT0gY2gpCisJCQkJCWdvdG8gbm90X2FfbWFya2VyOworCQkJaWYgKHNyY1ttYXJrZXJfc2l6ZV0gIT0gJ1xuJykKKwkJCQlnb3RvIG5vdF9hX21hcmtlcjsKKwkJCXNyYyArPSBtYXJrZXJfc2l6ZSArIDE7CisJCQlzaXplIC09IG1hcmtlcl9zaXplICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJbm90X2FfbWFya2VyOgorCQlkbyB7CisJCQljaCA9ICpzcmMrKzsKKwkJCSpkc3QrKyA9IGNoOworCQkJc2l6ZS0tOworCQl9IHdoaWxlIChjaCAhPSAnXG4nICYmIHNpemUpOworCX0KKwlyZXN1bHQtPnNpemUgPSBkc3QgLSByZXN1bHQtPnB0cjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbF9iaW5hcnlfbWVyZ2UoY29uc3Qgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqZHJ2X3VudXNlZCwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhdGhfdW51c2VkLAorCQkJICAgbW1maWxlX3QgKm9yaWcsCisJCQkgICBtbWZpbGVfdCAqc3JjMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCQkgICBtbWZpbGVfdCAqc3JjMiwgY29uc3QgY2hhciAqbmFtZTIsCisJCQkgICBtbWJ1ZmZlcl90ICpyZXN1bHQpCit7CisJLyoKKwkgKiBUaGUgdGVudGF0aXZlIG1lcmdlIHJlc3VsdCBpcyAib3VycyIgZm9yIHRoZSBmaW5hbCByb3VuZCwKKwkgKiBvciBjb21tb24gYW5jZXN0b3IgZm9yIGFuIGludGVybmFsIG1lcmdlLiAgU3RpbGwgcmV0dXJuCisJICogImNvbmZsaWN0ZWQgbWVyZ2UiIHN0YXR1cy4KKwkgKi8KKwltbWZpbGVfdCAqc3RvbGVuID0gaW5kZXhfb25seSA/IG9yaWcgOiBzcmMxOworCisJcmVzdWx0LT5wdHIgPSBzdG9sZW4tPnB0cjsKKwlyZXN1bHQtPnNpemUgPSBzdG9sZW4tPnNpemU7CisJc3RvbGVuLT5wdHIgPSBOVUxMOworCXJldHVybiAxOworfQorCisjZGVmaW5lIExMX0JJTkFSWV9NRVJHRSAwCisjZGVmaW5lIExMX1RFWFRfTUVSR0UgMQorI2RlZmluZSBMTF9VTklPTl9NRVJHRSAyCitzdGF0aWMgc3RydWN0IGxsX21lcmdlX2RyaXZlciBsbF9tZXJnZV9kcnZbXSA9IHsKKwl7ICJiaW5hcnkiLCAiYnVpbHQtaW4gYmluYXJ5IG1lcmdlIiwgbGxfYmluYXJ5X21lcmdlIH0sCisJeyAidGV4dCIsICJidWlsdC1pbiAzLXdheSB0ZXh0IG1lcmdlIiwgbGxfeGRsX21lcmdlIH0sCisJeyAidW5pb24iLCAiYnVpbHQtaW4gdW5pb24gbWVyZ2UiLCBsbF91bmlvbl9tZXJnZSB9LAorfTsKKworc3RhdGljIHZvaWQgY3JlYXRlX3RlbXAobW1maWxlX3QgKnNyYywgY2hhciAqcGF0aCkKK3sKKwlpbnQgZmQ7CisKKwlzdHJjcHkocGF0aCwgIi5tZXJnZV9maWxlX1hYWFhYWCIpOworCWZkID0gbWtzdGVtcChwYXRoKTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgdGVtcC1maWxlIik7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsIHNyYy0+cHRyLCBzcmMtPnNpemUpICE9IHNyYy0+c2l6ZSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgdGVtcC1maWxlIik7CisJY2xvc2UoZmQpOworfQorCisvKgorICogVXNlciBkZWZpbmVkIGxvdy1sZXZlbCBtZXJnZSBkcml2ZXIgc3VwcG9ydC4KKyAqLworc3RhdGljIGludCBsbF9leHRfbWVyZ2UoY29uc3Qgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqZm4sCisJCQljb25zdCBjaGFyICpwYXRoLAorCQkJbW1maWxlX3QgKm9yaWcsCisJCQltbWZpbGVfdCAqc3JjMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCQltbWZpbGVfdCAqc3JjMiwgY29uc3QgY2hhciAqbmFtZTIsCisJCQltbWJ1ZmZlcl90ICpyZXN1bHQpCit7CisJY2hhciB0ZW1wWzNdWzUwXTsKKwljaGFyIGNtZGJ1ZlsyMDQ4XTsKKwlzdHJ1Y3QgaW50ZXJwIHRhYmxlW10gPSB7CisJCXsgIiVPIiB9LAorCQl7ICIlQSIgfSwKKwkJeyAiJUIiIH0sCisJfTsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBjaGlsZDsKKwljb25zdCBjaGFyICphcmdzWzIwXTsKKwlpbnQgc3RhdHVzLCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChmbi0+Y21kbGluZSA9PSBOVUxMKQorCQlkaWUoImN1c3RvbSBtZXJnZSBkcml2ZXIgJXMgbGFja3MgY29tbWFuZCBsaW5lLiIsIGZuLT5uYW1lKTsKKworCXJlc3VsdC0+cHRyID0gTlVMTDsKKwlyZXN1bHQtPnNpemUgPSAwOworCWNyZWF0ZV90ZW1wKG9yaWcsIHRlbXBbMF0pOworCWNyZWF0ZV90ZW1wKHNyYzEsIHRlbXBbMV0pOworCWNyZWF0ZV90ZW1wKHNyYzIsIHRlbXBbMl0pOworCisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMCwgdGVtcFswXSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMSwgdGVtcFsxXSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMiwgdGVtcFsyXSk7CisKKwlvdXRwdXQoMSwgIm1lcmdpbmcgJXMgdXNpbmcgJXMiLCBwYXRoLAorCSAgICAgICBmbi0+ZGVzY3JpcHRpb24gPyBmbi0+ZGVzY3JpcHRpb24gOiBmbi0+bmFtZSk7CisKKwlpbnRlcnBvbGF0ZShjbWRidWYsIHNpemVvZihjbWRidWYpLCBmbi0+Y21kbGluZSwgdGFibGUsIDMpOworCisJbWVtc2V0KCZjaGlsZCwgMCwgc2l6ZW9mKGNoaWxkKSk7CisJY2hpbGQuYXJndiA9IGFyZ3M7CisJYXJnc1swXSA9ICJzaCI7CisJYXJnc1sxXSA9ICItYyI7CisJYXJnc1syXSA9IGNtZGJ1ZjsKKwlhcmdzWzNdID0gTlVMTDsKKworCXN0YXR1cyA9IHJ1bl9jb21tYW5kKCZjaGlsZCk7CisJaWYgKHN0YXR1cyA8IC1FUlJfUlVOX0NPTU1BTkRfRk9SSykKKwkJOyAvKiBmYWlsdXJlIGluIHJ1bi1jb21tYW5kICovCisJZWxzZQorCQlzdGF0dXMgPSAtc3RhdHVzOworCWZkID0gb3Blbih0ZW1wWzFdLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBiYWQ7CisJaWYgKGZzdGF0KGZkLCAmc3QpKQorCQlnb3RvIGNsb3NlX2JhZDsKKwlyZXN1bHQtPnNpemUgPSBzdC5zdF9zaXplOworCXJlc3VsdC0+cHRyID0geG1hbGxvYyhyZXN1bHQtPnNpemUgKyAxKTsKKwlpZiAocmVhZF9pbl9mdWxsKGZkLCByZXN1bHQtPnB0ciwgcmVzdWx0LT5zaXplKSAhPSByZXN1bHQtPnNpemUpIHsKKwkJZnJlZShyZXN1bHQtPnB0cik7CisJCXJlc3VsdC0+cHRyID0gTlVMTDsKKwkJcmVzdWx0LT5zaXplID0gMDsKKwl9CisgY2xvc2VfYmFkOgorCWNsb3NlKGZkKTsKKyBiYWQ6CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJdW5saW5rKHRlbXBbaV0pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBtZXJnZS5kZWZhdWx0IGFuZCBtZXJnZS5kcml2ZXIgY29uZmlndXJhdGlvbiBpdGVtcworICovCitzdGF0aWMgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqbGxfdXNlcl9tZXJnZSwgKipsbF91c2VyX21lcmdlX3RhaWw7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9sbF9tZXJnZTsKKworc3RhdGljIGludCByZWFkX21lcmdlX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmZuOworCWNvbnN0IGNoYXIgKmVwLCAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKworCWlmICghc3RyY21wKHZhciwgIm1lcmdlLmRlZmF1bHQiKSkgeworCQlpZiAodmFsdWUpCisJCQlkZWZhdWx0X2xsX21lcmdlID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW55dGhpbmcgYnV0ICJtZXJnZS48bmFtZT4udmFyaWFibGUiOworCSAqIGVzcGVjaWFsbHksIHdlIGRvIG5vdCB3YW50IHRvIGxvb2sgYXQgdmFyaWFibGVzIHN1Y2ggYXMKKwkgKiAibWVyZ2Uuc3VtbWFyeSIsICJtZXJnZS50b29sIiwgYW5kICJtZXJnZS52ZXJib3NpdHkiLgorCSAqLworCWlmIChwcmVmaXhjbXAodmFyLCAibWVyZ2UuIikgfHwgKGVwID0gc3RycmNocih2YXIsICcuJykpID09IHZhciArIDUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGaW5kIGV4aXN0aW5nIG9uZSBhcyB3ZSBtaWdodCBiZSBwcm9jZXNzaW5nIG1lcmdlLjxuYW1lPi52YXIyCisJICogYWZ0ZXIgc2VlaW5nIG1lcmdlLjxuYW1lPi52YXIxLgorCSAqLworCW5hbWUgPSB2YXIgKyA2OworCW5hbWVsZW4gPSBlcCAtIG5hbWU7CisJZm9yIChmbiA9IGxsX3VzZXJfbWVyZ2U7IGZuOyBmbiA9IGZuLT5uZXh0KQorCQlpZiAoIXN0cm5jbXAoZm4tPm5hbWUsIG5hbWUsIG5hbWVsZW4pICYmICFmbi0+bmFtZVtuYW1lbGVuXSkKKwkJCWJyZWFrOworCWlmICghZm4pIHsKKwkJY2hhciAqbmFtZWJ1ZjsKKwkJZm4gPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyKSk7CisJCW5hbWVidWYgPSB4bWFsbG9jKG5hbWVsZW4gKyAxKTsKKwkJbWVtY3B5KG5hbWVidWYsIG5hbWUsIG5hbWVsZW4pOworCQluYW1lYnVmW25hbWVsZW5dID0gMDsKKwkJZm4tPm5hbWUgPSBuYW1lYnVmOworCQlmbi0+Zm4gPSBsbF9leHRfbWVyZ2U7CisJCWZuLT5uZXh0ID0gTlVMTDsKKwkJKmxsX3VzZXJfbWVyZ2VfdGFpbCA9IGZuOworCQlsbF91c2VyX21lcmdlX3RhaWwgPSAmKGZuLT5uZXh0KTsKKwl9CisKKwllcCsrOworCisJaWYgKCFzdHJjbXAoIm5hbWUiLCBlcCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBlcnJvcigiJXM6IGxhY2tzIHZhbHVlIiwgdmFyKTsKKwkJZm4tPmRlc2NyaXB0aW9uID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoImRyaXZlciIsIGVwKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGVycm9yKCIlczogbGFja3MgdmFsdWUiLCB2YXIpOworCQkvKgorCQkgKiBtZXJnZS48bmFtZT4uZHJpdmVyIHNwZWNpZmllcyB0aGUgY29tbWFuZCBsaW5lOgorCQkgKgorCQkgKgljb21tYW5kLWxpbmUKKwkJICoKKwkJICogVGhlIGNvbW1hbmQtbGluZSB3aWxsIGJlIGludGVycG9sYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKKwkJICogdG9rZW5zIGFuZCBpcyBnaXZlbiB0byB0aGUgc2hlbGw6CisJCSAqCisJCSAqICAgICVPIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgdGhlIG1lcmdlIGJhc2UuCisJCSAqICAgICVBIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3Igb3VyIHZlcnNpb24uCisJCSAqICAgICVCIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgdGhlIG90aGVyIGJyYW5jaGVzJyB2ZXJzaW9uLgorCQkgKgorCQkgKiBUaGUgZXh0ZXJuYWwgbWVyZ2UgZHJpdmVyIHNob3VsZCB3cml0ZSB0aGUgcmVzdWx0cyBpbiB0aGUKKwkJICogZmlsZSBuYW1lZCBieSAlQSwgYW5kIHNpZ25hbCB0aGF0IGl0IGhhcyBkb25lIHdpdGggemVybyBleGl0CisJCSAqIHN0YXR1cy4KKwkJICovCisJCWZuLT5jbWRsaW5lID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoInJlY3Vyc2l2ZSIsIGVwKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGVycm9yKCIlczogbGFja3MgdmFsdWUiLCB2YXIpOworCQlmbi0+cmVjdXJzaXZlID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfbGxfbWVyZ2Uodm9pZCkKK3sKKwlpZiAobGxfdXNlcl9tZXJnZV90YWlsKQorCQlyZXR1cm47CisJbGxfdXNlcl9tZXJnZV90YWlsID0gJmxsX3VzZXJfbWVyZ2U7CisJZ2l0X2NvbmZpZyhyZWFkX21lcmdlX2NvbmZpZyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyICpmaW5kX2xsX21lcmdlX2RyaXZlcihjb25zdCBjaGFyICptZXJnZV9hdHRyKQoreworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmZuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGk7CisKKwlpbml0aWFsaXplX2xsX21lcmdlKCk7CisKKwlpZiAoQVRUUl9UUlVFKG1lcmdlX2F0dHIpKQorCQlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9URVhUX01FUkdFXTsKKwllbHNlIGlmIChBVFRSX0ZBTFNFKG1lcmdlX2F0dHIpKQorCQlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9CSU5BUllfTUVSR0VdOworCWVsc2UgaWYgKEFUVFJfVU5TRVQobWVyZ2VfYXR0cikpIHsKKwkJaWYgKCFkZWZhdWx0X2xsX21lcmdlKQorCQkJcmV0dXJuICZsbF9tZXJnZV9kcnZbTExfVEVYVF9NRVJHRV07CisJCWVsc2UKKwkJCW5hbWUgPSBkZWZhdWx0X2xsX21lcmdlOworCX0KKwllbHNlCisJCW5hbWUgPSBtZXJnZV9hdHRyOworCisJZm9yIChmbiA9IGxsX3VzZXJfbWVyZ2U7IGZuOyBmbiA9IGZuLT5uZXh0KQorCQlpZiAoIXN0cmNtcChmbi0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gZm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbF9tZXJnZV9kcnYpOyBpKyspCisJCWlmICghc3RyY21wKGxsX21lcmdlX2RydltpXS5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiAmbGxfbWVyZ2VfZHJ2W2ldOworCisJLyogZGVmYXVsdCB0byB0aGUgMy13YXkgKi8KKwlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9URVhUX01FUkdFXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdpdF9wYXRoX2NoZWNrX21lcmdlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RhdGljIHN0cnVjdCBnaXRfYXR0cl9jaGVjayBhdHRyX21lcmdlX2NoZWNrOworCisJaWYgKCFhdHRyX21lcmdlX2NoZWNrLmF0dHIpCisJCWF0dHJfbWVyZ2VfY2hlY2suYXR0ciA9IGdpdF9hdHRyKCJtZXJnZSIsIDUpOworCisJaWYgKGdpdF9jaGVja2F0dHIocGF0aCwgMSwgJmF0dHJfbWVyZ2VfY2hlY2spKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYXR0cl9tZXJnZV9jaGVjay52YWx1ZTsKK30KKworc3RhdGljIGludCBsbF9tZXJnZShtbWJ1ZmZlcl90ICpyZXN1bHRfYnVmLAorCQkgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm8sCisJCSAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYSwKKwkJICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpiLAorCQkgICAgY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJICAgIGNvbnN0IGNoYXIgKmJyYW5jaDIpCit7CisJbW1maWxlX3Qgb3JpZywgc3JjMSwgc3JjMjsKKwljaGFyICpuYW1lMSwgKm5hbWUyOworCWludCBtZXJnZV9zdGF0dXM7CisJY29uc3QgY2hhciAqbGxfZHJpdmVyX25hbWU7CisJY29uc3Qgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqZHJpdmVyOworCisJbmFtZTEgPSB4c3RyZHVwKG1rcGF0aCgiJXM6JXMiLCBicmFuY2gxLCBhLT5wYXRoKSk7CisJbmFtZTIgPSB4c3RyZHVwKG1rcGF0aCgiJXM6JXMiLCBicmFuY2gyLCBiLT5wYXRoKSk7CisKKwlmaWxsX21tKG8tPnNoYTEsICZvcmlnKTsKKwlmaWxsX21tKGEtPnNoYTEsICZzcmMxKTsKKwlmaWxsX21tKGItPnNoYTEsICZzcmMyKTsKKworCWxsX2RyaXZlcl9uYW1lID0gZ2l0X3BhdGhfY2hlY2tfbWVyZ2UoYS0+cGF0aCk7CisJZHJpdmVyID0gZmluZF9sbF9tZXJnZV9kcml2ZXIobGxfZHJpdmVyX25hbWUpOworCisJaWYgKGluZGV4X29ubHkgJiYgZHJpdmVyLT5yZWN1cnNpdmUpCisJCWRyaXZlciA9IGZpbmRfbGxfbWVyZ2VfZHJpdmVyKGRyaXZlci0+cmVjdXJzaXZlKTsKKwltZXJnZV9zdGF0dXMgPSBkcml2ZXItPmZuKGRyaXZlciwgYS0+cGF0aCwKKwkJCQkgICZvcmlnLCAmc3JjMSwgbmFtZTEsICZzcmMyLCBuYW1lMiwKKwkJCQkgIHJlc3VsdF9idWYpOworCisJZnJlZShuYW1lMSk7CisJZnJlZShuYW1lMik7CisJZnJlZShvcmlnLnB0cik7CisJZnJlZShzcmMxLnB0cik7CisJZnJlZShzcmMyLnB0cik7CisJcmV0dXJuIG1lcmdlX3N0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWVyZ2VfZmlsZShzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbywKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKmEsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpiLAorCQljb25zdCBjaGFyICpicmFuY2gxLCBjb25zdCBjaGFyICpicmFuY2gyKQoreworCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gcmVzdWx0OworCXJlc3VsdC5tZXJnZSA9IDA7CisJcmVzdWx0LmNsZWFuID0gMTsKKworCWlmICgoU19JRk1UICYgYS0+bW9kZSkgIT0gKFNfSUZNVCAmIGItPm1vZGUpKSB7CisJCXJlc3VsdC5jbGVhbiA9IDA7CisJCWlmIChTX0lTUkVHKGEtPm1vZGUpKSB7CisJCQlyZXN1bHQubW9kZSA9IGEtPm1vZGU7CisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGEtPnNoYTEpOworCQl9IGVsc2UgeworCQkJcmVzdWx0Lm1vZGUgPSBiLT5tb2RlOworCQkJaGFzaGNweShyZXN1bHQuc2hhLCBiLT5zaGExKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghc2hhX2VxKGEtPnNoYTEsIG8tPnNoYTEpICYmICFzaGFfZXEoYi0+c2hhMSwgby0+c2hhMSkpCisJCQlyZXN1bHQubWVyZ2UgPSAxOworCisJCXJlc3VsdC5tb2RlID0gYS0+bW9kZSA9PSBvLT5tb2RlID8gYi0+bW9kZTogYS0+bW9kZTsKKworCQlpZiAoc2hhX2VxKGEtPnNoYTEsIG8tPnNoYTEpKQorCQkJaGFzaGNweShyZXN1bHQuc2hhLCBiLT5zaGExKTsKKwkJZWxzZSBpZiAoc2hhX2VxKGItPnNoYTEsIG8tPnNoYTEpKQorCQkJaGFzaGNweShyZXN1bHQuc2hhLCBhLT5zaGExKTsKKwkJZWxzZSBpZiAoU19JU1JFRyhhLT5tb2RlKSkgeworCQkJbW1idWZmZXJfdCByZXN1bHRfYnVmOworCQkJaW50IG1lcmdlX3N0YXR1czsKKworCQkJbWVyZ2Vfc3RhdHVzID0gbGxfbWVyZ2UoJnJlc3VsdF9idWYsIG8sIGEsIGIsCisJCQkJCQlicmFuY2gxLCBicmFuY2gyKTsKKworCQkJaWYgKChtZXJnZV9zdGF0dXMgPCAwKSB8fCAhcmVzdWx0X2J1Zi5wdHIpCisJCQkJZGllKCJGYWlsZWQgdG8gZXhlY3V0ZSBpbnRlcm5hbCBtZXJnZSIpOworCisJCQlpZiAod3JpdGVfc2hhMV9maWxlKHJlc3VsdF9idWYucHRyLCByZXN1bHRfYnVmLnNpemUsCisJCQkJCSAgICBibG9iX3R5cGUsIHJlc3VsdC5zaGEpKQorCQkJCWRpZSgiVW5hYmxlIHRvIGFkZCAlcyB0byBkYXRhYmFzZSIsCisJCQkJICAgIGEtPnBhdGgpOworCisJCQlmcmVlKHJlc3VsdF9idWYucHRyKTsKKwkJCXJlc3VsdC5jbGVhbiA9IChtZXJnZV9zdGF0dXMgPT0gMCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIShTX0lTTE5LKGEtPm1vZGUpIHx8IFNfSVNMTksoYi0+bW9kZSkpKQorCQkJCWRpZSgiY2Fubm90IG1lcmdlIG1vZGVzPyIpOworCisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGEtPnNoYTEpOworCisJCQlpZiAoIXNoYV9lcShhLT5zaGExLCBiLT5zaGExKSkKKwkJCQlyZXN1bHQuY2xlYW4gPSAwOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgY29uZmxpY3RfcmVuYW1lX3JlbmFtZShzdHJ1Y3QgcmVuYW1lICpyZW4xLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJyYW5jaDEsCisJCQkJICAgc3RydWN0IHJlbmFtZSAqcmVuMiwKKwkJCQkgICBjb25zdCBjaGFyICpicmFuY2gyKQoreworCWNoYXIgKmRlbFsyXTsKKwlpbnQgZGVscCA9IDA7CisJY29uc3QgY2hhciAqcmVuMV9kc3QgPSByZW4xLT5wYWlyLT50d28tPnBhdGg7CisJY29uc3QgY2hhciAqcmVuMl9kc3QgPSByZW4yLT5wYWlyLT50d28tPnBhdGg7CisJY29uc3QgY2hhciAqZHN0X25hbWUxID0gcmVuMV9kc3Q7CisJY29uc3QgY2hhciAqZHN0X25hbWUyID0gcmVuMl9kc3Q7CisJaWYgKHBhdGhfbGlzdF9oYXNfcGF0aCgmY3VycmVudF9kaXJlY3Rvcnlfc2V0LCByZW4xX2RzdCkpIHsKKwkJZHN0X25hbWUxID0gZGVsW2RlbHArK10gPSB1bmlxdWVfcGF0aChyZW4xX2RzdCwgYnJhbmNoMSk7CisJCW91dHB1dCgxLCAiJXMgaXMgYSBkaXJlY3RvcnkgaW4gJXMgYWRkZWQgYXMgJXMgaW5zdGVhZCIsCisJCSAgICAgICByZW4xX2RzdCwgYnJhbmNoMiwgZHN0X25hbWUxKTsKKwkJcmVtb3ZlX2ZpbGUoMCwgcmVuMV9kc3QsIDApOworCX0KKwlpZiAocGF0aF9saXN0X2hhc19wYXRoKCZjdXJyZW50X2RpcmVjdG9yeV9zZXQsIHJlbjJfZHN0KSkgeworCQlkc3RfbmFtZTIgPSBkZWxbZGVscCsrXSA9IHVuaXF1ZV9wYXRoKHJlbjJfZHN0LCBicmFuY2gyKTsKKwkJb3V0cHV0KDEsICIlcyBpcyBhIGRpcmVjdG9yeSBpbiAlcyBhZGRlZCBhcyAlcyBpbnN0ZWFkIiwKKwkJICAgICAgIHJlbjJfZHN0LCBicmFuY2gxLCBkc3RfbmFtZTIpOworCQlyZW1vdmVfZmlsZSgwLCByZW4yX2RzdCwgMCk7CisJfQorCWlmIChpbmRleF9vbmx5KSB7CisJCXJlbW92ZV9maWxlX2Zyb21fY2FjaGUoZHN0X25hbWUxKTsKKwkJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShkc3RfbmFtZTIpOworCQkvKgorCQkgKiBVbmNvbW1lbnQgdG8gbGVhdmUgdGhlIGNvbmZsaWN0aW5nIG5hbWVzIGluIHRoZSByZXN1bHRpbmcgdHJlZQorCQkgKgorCQkgKiB1cGRhdGVfZmlsZSgwLCByZW4xLT5wYWlyLT50d28tPnNoYTEsIHJlbjEtPnBhaXItPnR3by0+bW9kZSwgZHN0X25hbWUxKTsKKwkJICogdXBkYXRlX2ZpbGUoMCwgcmVuMi0+cGFpci0+dHdvLT5zaGExLCByZW4yLT5wYWlyLT50d28tPm1vZGUsIGRzdF9uYW1lMik7CisJCSAqLworCX0gZWxzZSB7CisJCXVwZGF0ZV9zdGFnZXMoZHN0X25hbWUxLCBOVUxMLCByZW4xLT5wYWlyLT50d28sIE5VTEwsIDEpOworCQl1cGRhdGVfc3RhZ2VzKGRzdF9uYW1lMiwgTlVMTCwgTlVMTCwgcmVuMi0+cGFpci0+dHdvLCAxKTsKKwl9CisJd2hpbGUgKGRlbHAtLSkKKwkJZnJlZShkZWxbZGVscF0pOworfQorCitzdGF0aWMgdm9pZCBjb25mbGljdF9yZW5hbWVfZGlyKHN0cnVjdCByZW5hbWUgKnJlbjEsCisJCQkJY29uc3QgY2hhciAqYnJhbmNoMSkKK3sKKwljaGFyICpuZXdfcGF0aCA9IHVuaXF1ZV9wYXRoKHJlbjEtPnBhaXItPnR3by0+cGF0aCwgYnJhbmNoMSk7CisJb3V0cHV0KDEsICJSZW5hbWVkICVzIHRvICVzIGluc3RlYWQiLCByZW4xLT5wYWlyLT5vbmUtPnBhdGgsIG5ld19wYXRoKTsKKwlyZW1vdmVfZmlsZSgwLCByZW4xLT5wYWlyLT50d28tPnBhdGgsIDApOworCXVwZGF0ZV9maWxlKDAsIHJlbjEtPnBhaXItPnR3by0+c2hhMSwgcmVuMS0+cGFpci0+dHdvLT5tb2RlLCBuZXdfcGF0aCk7CisJZnJlZShuZXdfcGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZsaWN0X3JlbmFtZV9yZW5hbWVfMihzdHJ1Y3QgcmVuYW1lICpyZW4xLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJCQkgICAgIHN0cnVjdCByZW5hbWUgKnJlbjIsCisJCQkJICAgICBjb25zdCBjaGFyICpicmFuY2gyKQoreworCWNoYXIgKm5ld19wYXRoMSA9IHVuaXF1ZV9wYXRoKHJlbjEtPnBhaXItPnR3by0+cGF0aCwgYnJhbmNoMSk7CisJY2hhciAqbmV3X3BhdGgyID0gdW5pcXVlX3BhdGgocmVuMi0+cGFpci0+dHdvLT5wYXRoLCBicmFuY2gyKTsKKwlvdXRwdXQoMSwgIlJlbmFtZWQgJXMgdG8gJXMgYW5kICVzIHRvICVzIGluc3RlYWQiLAorCSAgICAgICByZW4xLT5wYWlyLT5vbmUtPnBhdGgsIG5ld19wYXRoMSwKKwkgICAgICAgcmVuMi0+cGFpci0+b25lLT5wYXRoLCBuZXdfcGF0aDIpOworCXJlbW92ZV9maWxlKDAsIHJlbjEtPnBhaXItPnR3by0+cGF0aCwgMCk7CisJdXBkYXRlX2ZpbGUoMCwgcmVuMS0+cGFpci0+dHdvLT5zaGExLCByZW4xLT5wYWlyLT50d28tPm1vZGUsIG5ld19wYXRoMSk7CisJdXBkYXRlX2ZpbGUoMCwgcmVuMi0+cGFpci0+dHdvLT5zaGExLCByZW4yLT5wYWlyLT50d28tPm1vZGUsIG5ld19wYXRoMik7CisJZnJlZShuZXdfcGF0aDIpOworCWZyZWUobmV3X3BhdGgxKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JlbmFtZXMoc3RydWN0IHBhdGhfbGlzdCAqYV9yZW5hbWVzLAorCQkJICAgc3RydWN0IHBhdGhfbGlzdCAqYl9yZW5hbWVzLAorCQkJICAgY29uc3QgY2hhciAqYV9icmFuY2gsCisJCQkgICBjb25zdCBjaGFyICpiX2JyYW5jaCkKK3sKKwlpbnQgY2xlYW5fbWVyZ2UgPSAxLCBpLCBqOworCXN0cnVjdCBwYXRoX2xpc3QgYV9ieV9kc3QgPSB7TlVMTCwgMCwgMCwgMH0sIGJfYnlfZHN0ID0ge05VTEwsIDAsIDAsIDB9OworCWNvbnN0IHN0cnVjdCByZW5hbWUgKnNyZTsKKworCWZvciAoaSA9IDA7IGkgPCBhX3JlbmFtZXMtPm5yOyBpKyspIHsKKwkJc3JlID0gYV9yZW5hbWVzLT5pdGVtc1tpXS51dGlsOworCQlwYXRoX2xpc3RfaW5zZXJ0KHNyZS0+cGFpci0+dHdvLT5wYXRoLCAmYV9ieV9kc3QpLT51dGlsCisJCQk9IHNyZS0+ZHN0X2VudHJ5OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYl9yZW5hbWVzLT5ucjsgaSsrKSB7CisJCXNyZSA9IGJfcmVuYW1lcy0+aXRlbXNbaV0udXRpbDsKKwkJcGF0aF9saXN0X2luc2VydChzcmUtPnBhaXItPnR3by0+cGF0aCwgJmJfYnlfZHN0KS0+dXRpbAorCQkJPSBzcmUtPmRzdF9lbnRyeTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGFfcmVuYW1lcy0+bnIgfHwgaiA8IGJfcmVuYW1lcy0+bnI7KSB7CisJCWludCBjb21wYXJlOworCQljaGFyICpzcmM7CisJCXN0cnVjdCBwYXRoX2xpc3QgKnJlbmFtZXMxLCAqcmVuYW1lczIsICpyZW5hbWVzMkRzdDsKKwkJc3RydWN0IHJlbmFtZSAqcmVuMSA9IE5VTEwsICpyZW4yID0gTlVMTDsKKwkJY29uc3QgY2hhciAqYnJhbmNoMSwgKmJyYW5jaDI7CisJCWNvbnN0IGNoYXIgKnJlbjFfc3JjLCAqcmVuMV9kc3Q7CisKKwkJaWYgKGkgPj0gYV9yZW5hbWVzLT5ucikgeworCQkJY29tcGFyZSA9IDE7CisJCQlyZW4yID0gYl9yZW5hbWVzLT5pdGVtc1tqKytdLnV0aWw7CisJCX0gZWxzZSBpZiAoaiA+PSBiX3JlbmFtZXMtPm5yKSB7CisJCQljb21wYXJlID0gLTE7CisJCQlyZW4xID0gYV9yZW5hbWVzLT5pdGVtc1tpKytdLnV0aWw7CisJCX0gZWxzZSB7CisJCQljb21wYXJlID0gc3RyY21wKGFfcmVuYW1lcy0+aXRlbXNbaV0ucGF0aCwKKwkJCQkJYl9yZW5hbWVzLT5pdGVtc1tqXS5wYXRoKTsKKwkJCWlmIChjb21wYXJlIDw9IDApCisJCQkJcmVuMSA9IGFfcmVuYW1lcy0+aXRlbXNbaSsrXS51dGlsOworCQkJaWYgKGNvbXBhcmUgPj0gMCkKKwkJCQlyZW4yID0gYl9yZW5hbWVzLT5pdGVtc1tqKytdLnV0aWw7CisJCX0KKworCQkvKiBUT0RPOiByZWZhY3Rvciwgc28gdGhhdCAxLzIgYXJlIG5vdCBuZWVkZWQgKi8KKwkJaWYgKHJlbjEpIHsKKwkJCXJlbmFtZXMxID0gYV9yZW5hbWVzOworCQkJcmVuYW1lczIgPSBiX3JlbmFtZXM7CisJCQlyZW5hbWVzMkRzdCA9ICZiX2J5X2RzdDsKKwkJCWJyYW5jaDEgPSBhX2JyYW5jaDsKKwkJCWJyYW5jaDIgPSBiX2JyYW5jaDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCByZW5hbWUgKnRtcDsKKwkJCXJlbmFtZXMxID0gYl9yZW5hbWVzOworCQkJcmVuYW1lczIgPSBhX3JlbmFtZXM7CisJCQlyZW5hbWVzMkRzdCA9ICZhX2J5X2RzdDsKKwkJCWJyYW5jaDEgPSBiX2JyYW5jaDsKKwkJCWJyYW5jaDIgPSBhX2JyYW5jaDsKKwkJCXRtcCA9IHJlbjI7CisJCQlyZW4yID0gcmVuMTsKKwkJCXJlbjEgPSB0bXA7CisJCX0KKwkJc3JjID0gcmVuMS0+cGFpci0+b25lLT5wYXRoOworCisJCXJlbjEtPmRzdF9lbnRyeS0+cHJvY2Vzc2VkID0gMTsKKwkJcmVuMS0+c3JjX2VudHJ5LT5wcm9jZXNzZWQgPSAxOworCisJCWlmIChyZW4xLT5wcm9jZXNzZWQpCisJCQljb250aW51ZTsKKwkJcmVuMS0+cHJvY2Vzc2VkID0gMTsKKworCQlyZW4xX3NyYyA9IHJlbjEtPnBhaXItPm9uZS0+cGF0aDsKKwkJcmVuMV9kc3QgPSByZW4xLT5wYWlyLT50d28tPnBhdGg7CisKKwkJaWYgKHJlbjIpIHsKKwkJCWNvbnN0IGNoYXIgKnJlbjJfc3JjID0gcmVuMi0+cGFpci0+b25lLT5wYXRoOworCQkJY29uc3QgY2hhciAqcmVuMl9kc3QgPSByZW4yLT5wYWlyLT50d28tPnBhdGg7CisJCQkvKiBSZW5hbWVkIGluIDEgYW5kIHJlbmFtZWQgaW4gMiAqLworCQkJaWYgKHN0cmNtcChyZW4xX3NyYywgcmVuMl9zcmMpICE9IDApCisJCQkJZGllKCJyZW4xLnNyYyAhPSByZW4yLnNyYyIpOworCQkJcmVuMi0+ZHN0X2VudHJ5LT5wcm9jZXNzZWQgPSAxOworCQkJcmVuMi0+cHJvY2Vzc2VkID0gMTsKKwkJCWlmIChzdHJjbXAocmVuMV9kc3QsIHJlbjJfZHN0KSAhPSAwKSB7CisJCQkJY2xlYW5fbWVyZ2UgPSAwOworCQkJCW91dHB1dCgxLCAiQ09ORkxJQ1QgKHJlbmFtZS9yZW5hbWUpOiAiCisJCQkJICAgICAgICJSZW5hbWUgXCIlc1wiLT5cIiVzXCIgaW4gYnJhbmNoIFwiJXNcIiAiCisJCQkJICAgICAgICJyZW5hbWUgXCIlc1wiLT5cIiVzXCIgaW4gXCIlc1wiJXMiLAorCQkJCSAgICAgICBzcmMsIHJlbjFfZHN0LCBicmFuY2gxLAorCQkJCSAgICAgICBzcmMsIHJlbjJfZHN0LCBicmFuY2gyLAorCQkJCSAgICAgICBpbmRleF9vbmx5ID8gIiAobGVmdCB1bnJlc29sdmVkKSI6ICIiKTsKKwkJCQlpZiAoaW5kZXhfb25seSkgeworCQkJCQlyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHNyYyk7CisJCQkJCXVwZGF0ZV9maWxlKDAsIHJlbjEtPnBhaXItPm9uZS0+c2hhMSwKKwkJCQkJCSAgICByZW4xLT5wYWlyLT5vbmUtPm1vZGUsIHNyYyk7CisJCQkJfQorCQkJCWNvbmZsaWN0X3JlbmFtZV9yZW5hbWUocmVuMSwgYnJhbmNoMSwgcmVuMiwgYnJhbmNoMik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWZpOworCQkJCXJlbW92ZV9maWxlKDEsIHJlbjFfc3JjLCAxKTsKKwkJCQltZmkgPSBtZXJnZV9maWxlKHJlbjEtPnBhaXItPm9uZSwKKwkJCQkJCSByZW4xLT5wYWlyLT50d28sCisJCQkJCQkgcmVuMi0+cGFpci0+dHdvLAorCQkJCQkJIGJyYW5jaDEsCisJCQkJCQkgYnJhbmNoMik7CisJCQkJaWYgKG1maS5tZXJnZSB8fCAhbWZpLmNsZWFuKQorCQkJCQlvdXRwdXQoMSwgIlJlbmFtZWQgJXMtPiVzIiwgc3JjLCByZW4xX2RzdCk7CisKKwkJCQlpZiAobWZpLm1lcmdlKQorCQkJCQlvdXRwdXQoMiwgIkF1dG8tbWVyZ2VkICVzIiwgcmVuMV9kc3QpOworCisJCQkJaWYgKCFtZmkuY2xlYW4pIHsKKwkJCQkJb3V0cHV0KDEsICJDT05GTElDVCAoY29udGVudCk6IG1lcmdlIGNvbmZsaWN0IGluICVzIiwKKwkJCQkJICAgICAgIHJlbjFfZHN0KTsKKwkJCQkJY2xlYW5fbWVyZ2UgPSAwOworCisJCQkJCWlmICghaW5kZXhfb25seSkKKwkJCQkJCXVwZGF0ZV9zdGFnZXMocmVuMV9kc3QsCisJCQkJCQkJICAgICAgcmVuMS0+cGFpci0+b25lLAorCQkJCQkJCSAgICAgIHJlbjEtPnBhaXItPnR3bywKKwkJCQkJCQkgICAgICByZW4yLT5wYWlyLT50d28sCisJCQkJCQkJICAgICAgMSAvKiBjbGVhciAqLyk7CisJCQkJfQorCQkJCXVwZGF0ZV9maWxlKG1maS5jbGVhbiwgbWZpLnNoYSwgbWZpLm1vZGUsIHJlbjFfZHN0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFJlbmFtZWQgaW4gMSwgbWF5YmUgY2hhbmdlZCBpbiAyICovCisJCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisJCQkvKiB3ZSBvbmx5IHVzZSBzaGExIGFuZCBtb2RlIG9mIHRoZXNlICovCisJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyBzcmNfb3RoZXIsIGRzdF9vdGhlcjsKKwkJCWludCB0cnlfbWVyZ2UsIHN0YWdlID0gYV9yZW5hbWVzID09IHJlbmFtZXMxID8gMzogMjsKKworCQkJcmVtb3ZlX2ZpbGUoMSwgcmVuMV9zcmMsIGluZGV4X29ubHkgfHwgc3RhZ2UgPT0gMyk7CisKKwkJCWhhc2hjcHkoc3JjX290aGVyLnNoYTEsIHJlbjEtPnNyY19lbnRyeS0+c3RhZ2VzW3N0YWdlXS5zaGEpOworCQkJc3JjX290aGVyLm1vZGUgPSByZW4xLT5zcmNfZW50cnktPnN0YWdlc1tzdGFnZV0ubW9kZTsKKwkJCWhhc2hjcHkoZHN0X290aGVyLnNoYTEsIHJlbjEtPmRzdF9lbnRyeS0+c3RhZ2VzW3N0YWdlXS5zaGEpOworCQkJZHN0X290aGVyLm1vZGUgPSByZW4xLT5kc3RfZW50cnktPnN0YWdlc1tzdGFnZV0ubW9kZTsKKworCQkJdHJ5X21lcmdlID0gMDsKKworCQkJaWYgKHBhdGhfbGlzdF9oYXNfcGF0aCgmY3VycmVudF9kaXJlY3Rvcnlfc2V0LCByZW4xX2RzdCkpIHsKKwkJCQljbGVhbl9tZXJnZSA9IDA7CisJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL2RpcmVjdG9yeSk6IFJlbmFtZWQgJXMtPiVzIGluICVzICIKKwkJCQkgICAgICAgIiBkaXJlY3RvcnkgJXMgYWRkZWQgaW4gJXMiLAorCQkJCSAgICAgICByZW4xX3NyYywgcmVuMV9kc3QsIGJyYW5jaDEsCisJCQkJICAgICAgIHJlbjFfZHN0LCBicmFuY2gyKTsKKwkJCQljb25mbGljdF9yZW5hbWVfZGlyKHJlbjEsIGJyYW5jaDEpOworCQkJfSBlbHNlIGlmIChzaGFfZXEoc3JjX290aGVyLnNoYTEsIG51bGxfc2hhMSkpIHsKKwkJCQljbGVhbl9tZXJnZSA9IDA7CisJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL2RlbGV0ZSk6IFJlbmFtZWQgJXMtPiVzIGluICVzICIKKwkJCQkgICAgICAgImFuZCBkZWxldGVkIGluICVzIiwKKwkJCQkgICAgICAgcmVuMV9zcmMsIHJlbjFfZHN0LCBicmFuY2gxLAorCQkJCSAgICAgICBicmFuY2gyKTsKKwkJCQl1cGRhdGVfZmlsZSgwLCByZW4xLT5wYWlyLT50d28tPnNoYTEsIHJlbjEtPnBhaXItPnR3by0+bW9kZSwgcmVuMV9kc3QpOworCQkJfSBlbHNlIGlmICghc2hhX2VxKGRzdF9vdGhlci5zaGExLCBudWxsX3NoYTEpKSB7CisJCQkJY29uc3QgY2hhciAqbmV3X3BhdGg7CisJCQkJY2xlYW5fbWVyZ2UgPSAwOworCQkJCXRyeV9tZXJnZSA9IDE7CisJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL2FkZCk6IFJlbmFtZWQgJXMtPiVzIGluICVzLiAiCisJCQkJICAgICAgICIlcyBhZGRlZCBpbiAlcyIsCisJCQkJICAgICAgIHJlbjFfc3JjLCByZW4xX2RzdCwgYnJhbmNoMSwKKwkJCQkgICAgICAgcmVuMV9kc3QsIGJyYW5jaDIpOworCQkJCW5ld19wYXRoID0gdW5pcXVlX3BhdGgocmVuMV9kc3QsIGJyYW5jaDIpOworCQkJCW91dHB1dCgxLCAiQWRkZWQgYXMgJXMgaW5zdGVhZCIsIG5ld19wYXRoKTsKKwkJCQl1cGRhdGVfZmlsZSgwLCBkc3Rfb3RoZXIuc2hhMSwgZHN0X290aGVyLm1vZGUsIG5ld19wYXRoKTsKKwkJCX0gZWxzZSBpZiAoKGl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKHJlbjFfZHN0LCByZW5hbWVzMkRzdCkpKSB7CisJCQkJcmVuMiA9IGl0ZW0tPnV0aWw7CisJCQkJY2xlYW5fbWVyZ2UgPSAwOworCQkJCXJlbjItPnByb2Nlc3NlZCA9IDE7CisJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL3JlbmFtZSk6IFJlbmFtZWQgJXMtPiVzIGluICVzLiAiCisJCQkJICAgICAgICJSZW5hbWVkICVzLT4lcyBpbiAlcyIsCisJCQkJICAgICAgIHJlbjFfc3JjLCByZW4xX2RzdCwgYnJhbmNoMSwKKwkJCQkgICAgICAgcmVuMi0+cGFpci0+b25lLT5wYXRoLCByZW4yLT5wYWlyLT50d28tPnBhdGgsIGJyYW5jaDIpOworCQkJCWNvbmZsaWN0X3JlbmFtZV9yZW5hbWVfMihyZW4xLCBicmFuY2gxLCByZW4yLCBicmFuY2gyKTsKKwkJCX0gZWxzZQorCQkJCXRyeV9tZXJnZSA9IDE7CisKKwkJCWlmICh0cnlfbWVyZ2UpIHsKKwkJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbywgKmEsICpiOworCQkJCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWZpOworCQkJCXNyY19vdGhlci5wYXRoID0gKGNoYXIgKilyZW4xX3NyYzsKKworCQkJCW8gPSByZW4xLT5wYWlyLT5vbmU7CisJCQkJaWYgKGFfcmVuYW1lcyA9PSByZW5hbWVzMSkgeworCQkJCQlhID0gcmVuMS0+cGFpci0+dHdvOworCQkJCQliID0gJnNyY19vdGhlcjsKKwkJCQl9IGVsc2UgeworCQkJCQliID0gcmVuMS0+cGFpci0+dHdvOworCQkJCQlhID0gJnNyY19vdGhlcjsKKwkJCQl9CisJCQkJbWZpID0gbWVyZ2VfZmlsZShvLCBhLCBiLAorCQkJCQkJYV9icmFuY2gsIGJfYnJhbmNoKTsKKworCQkJCWlmIChtZmkuY2xlYW4gJiYKKwkJCQkgICAgc2hhX2VxKG1maS5zaGEsIHJlbjEtPnBhaXItPnR3by0+c2hhMSkgJiYKKwkJCQkgICAgbWZpLm1vZGUgPT0gcmVuMS0+cGFpci0+dHdvLT5tb2RlKQorCQkJCQkvKgorCQkJCQkgKiBUaGlzIG1lc3NhZ2VkIGlzIHBhcnQgb2YKKwkJCQkJICogdDYwMjIgdGVzdC4gSWYgeW91IGNoYW5nZQorCQkJCQkgKiBpdCB1cGRhdGUgdGhlIHRlc3QgdG9vLgorCQkJCQkgKi8KKwkJCQkJb3V0cHV0KDMsICJTa2lwcGVkICVzIChtZXJnZWQgc2FtZSBhcyBleGlzdGluZykiLCByZW4xX2RzdCk7CisJCQkJZWxzZSB7CisJCQkJCWlmIChtZmkubWVyZ2UgfHwgIW1maS5jbGVhbikKKwkJCQkJCW91dHB1dCgxLCAiUmVuYW1lZCAlcyA9PiAlcyIsIHJlbjFfc3JjLCByZW4xX2RzdCk7CisJCQkJCWlmIChtZmkubWVyZ2UpCisJCQkJCQlvdXRwdXQoMiwgIkF1dG8tbWVyZ2VkICVzIiwgcmVuMV9kc3QpOworCQkJCQlpZiAoIW1maS5jbGVhbikgeworCQkJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL21vZGlmeSk6IE1lcmdlIGNvbmZsaWN0IGluICVzIiwKKwkJCQkJCSAgICAgICByZW4xX2RzdCk7CisJCQkJCQljbGVhbl9tZXJnZSA9IDA7CisKKwkJCQkJCWlmICghaW5kZXhfb25seSkKKwkJCQkJCQl1cGRhdGVfc3RhZ2VzKHJlbjFfZHN0LAorCQkJCQkJCQkgICAgICBvLCBhLCBiLCAxKTsKKwkJCQkJfQorCQkJCQl1cGRhdGVfZmlsZShtZmkuY2xlYW4sIG1maS5zaGEsIG1maS5tb2RlLCByZW4xX2RzdCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXBhdGhfbGlzdF9jbGVhcigmYV9ieV9kc3QsIDApOworCXBhdGhfbGlzdF9jbGVhcigmYl9ieV9kc3QsIDApOworCisJcmV0dXJuIGNsZWFuX21lcmdlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhZ2Vfc2hhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYSwgdW5zaWduZWQgbW9kZSkKK3sKKwlyZXR1cm4gKGlzX251bGxfc2hhMShzaGEpIHx8IG1vZGUgPT0gMCkgPyBOVUxMOiAodW5zaWduZWQgY2hhciAqKXNoYTsKK30KKworLyogUGVyIGVudHJ5IG1lcmdlIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHByb2Nlc3NfZW50cnkoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YWdlX2RhdGEgKmVudHJ5LAorCQkJIGNvbnN0IGNoYXIgKmJyYW5jaDEsCisJCQkgY29uc3QgY2hhciAqYnJhbmNoMikKK3sKKwkvKgorCXByaW50ZigicHJvY2Vzc2luZyBlbnRyeSwgY2xlYW4gY2FjaGU6ICVzXG4iLCBpbmRleF9vbmx5ID8gInllcyI6ICJubyIpOworCXByaW50X2luZGV4X2VudHJ5KCJcdHBhdGg6ICIsIGVudHJ5KTsKKwkqLworCWludCBjbGVhbl9tZXJnZSA9IDE7CisJdW5zaWduZWQgb19tb2RlID0gZW50cnktPnN0YWdlc1sxXS5tb2RlOworCXVuc2lnbmVkIGFfbW9kZSA9IGVudHJ5LT5zdGFnZXNbMl0ubW9kZTsKKwl1bnNpZ25lZCBiX21vZGUgPSBlbnRyeS0+c3RhZ2VzWzNdLm1vZGU7CisJdW5zaWduZWQgY2hhciAqb19zaGEgPSBzdGFnZV9zaGEoZW50cnktPnN0YWdlc1sxXS5zaGEsIG9fbW9kZSk7CisJdW5zaWduZWQgY2hhciAqYV9zaGEgPSBzdGFnZV9zaGEoZW50cnktPnN0YWdlc1syXS5zaGEsIGFfbW9kZSk7CisJdW5zaWduZWQgY2hhciAqYl9zaGEgPSBzdGFnZV9zaGEoZW50cnktPnN0YWdlc1szXS5zaGEsIGJfbW9kZSk7CisKKwlpZiAob19zaGEgJiYgKCFhX3NoYSB8fCAhYl9zaGEpKSB7CisJCS8qIENhc2UgQTogRGVsZXRlZCBpbiBvbmUgKi8KKwkJaWYgKCghYV9zaGEgJiYgIWJfc2hhKSB8fAorCQkgICAgKHNoYV9lcShhX3NoYSwgb19zaGEpICYmICFiX3NoYSkgfHwKKwkJICAgICghYV9zaGEgJiYgc2hhX2VxKGJfc2hhLCBvX3NoYSkpKSB7CisJCQkvKiBEZWxldGVkIGluIGJvdGggb3IgZGVsZXRlZCBpbiBvbmUgYW5kCisJCQkgKiB1bmNoYW5nZWQgaW4gdGhlIG90aGVyICovCisJCQlpZiAoYV9zaGEpCisJCQkJb3V0cHV0KDIsICJSZW1vdmVkICVzIiwgcGF0aCk7CisJCQkvKiBkbyBub3QgdG91Y2ggd29ya2luZyBmaWxlIGlmIGl0IGRpZCBub3QgZXhpc3QgKi8KKwkJCXJlbW92ZV9maWxlKDEsIHBhdGgsICFhX3NoYSk7CisJCX0gZWxzZSB7CisJCQkvKiBEZWxldGVkIGluIG9uZSBhbmQgY2hhbmdlZCBpbiB0aGUgb3RoZXIgKi8KKwkJCWNsZWFuX21lcmdlID0gMDsKKwkJCWlmICghYV9zaGEpIHsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChkZWxldGUvbW9kaWZ5KTogJXMgZGVsZXRlZCBpbiAlcyAiCisJCQkJICAgICAgICJhbmQgbW9kaWZpZWQgaW4gJXMuIFZlcnNpb24gJXMgb2YgJXMgbGVmdCBpbiB0cmVlLiIsCisJCQkJICAgICAgIHBhdGgsIGJyYW5jaDEsCisJCQkJICAgICAgIGJyYW5jaDIsIGJyYW5jaDIsIHBhdGgpOworCQkJCXVwZGF0ZV9maWxlKDAsIGJfc2hhLCBiX21vZGUsIHBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChkZWxldGUvbW9kaWZ5KTogJXMgZGVsZXRlZCBpbiAlcyAiCisJCQkJICAgICAgICJhbmQgbW9kaWZpZWQgaW4gJXMuIFZlcnNpb24gJXMgb2YgJXMgbGVmdCBpbiB0cmVlLiIsCisJCQkJICAgICAgIHBhdGgsIGJyYW5jaDIsCisJCQkJICAgICAgIGJyYW5jaDEsIGJyYW5jaDEsIHBhdGgpOworCQkJCXVwZGF0ZV9maWxlKDAsIGFfc2hhLCBhX21vZGUsIHBhdGgpOworCQkJfQorCQl9CisKKwl9IGVsc2UgaWYgKCghb19zaGEgJiYgYV9zaGEgJiYgIWJfc2hhKSB8fAorCQkgICAoIW9fc2hhICYmICFhX3NoYSAmJiBiX3NoYSkpIHsKKwkJLyogQ2FzZSBCOiBBZGRlZCBpbiBvbmUuICovCisJCWNvbnN0IGNoYXIgKmFkZF9icmFuY2g7CisJCWNvbnN0IGNoYXIgKm90aGVyX2JyYW5jaDsKKwkJdW5zaWduZWQgbW9kZTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhOworCQljb25zdCBjaGFyICpjb25mOworCisJCWlmIChhX3NoYSkgeworCQkJYWRkX2JyYW5jaCA9IGJyYW5jaDE7CisJCQlvdGhlcl9icmFuY2ggPSBicmFuY2gyOworCQkJbW9kZSA9IGFfbW9kZTsKKwkJCXNoYSA9IGFfc2hhOworCQkJY29uZiA9ICJmaWxlL2RpcmVjdG9yeSI7CisJCX0gZWxzZSB7CisJCQlhZGRfYnJhbmNoID0gYnJhbmNoMjsKKwkJCW90aGVyX2JyYW5jaCA9IGJyYW5jaDE7CisJCQltb2RlID0gYl9tb2RlOworCQkJc2hhID0gYl9zaGE7CisJCQljb25mID0gImRpcmVjdG9yeS9maWxlIjsKKwkJfQorCQlpZiAocGF0aF9saXN0X2hhc19wYXRoKCZjdXJyZW50X2RpcmVjdG9yeV9zZXQsIHBhdGgpKSB7CisJCQljb25zdCBjaGFyICpuZXdfcGF0aCA9IHVuaXF1ZV9wYXRoKHBhdGgsIGFkZF9icmFuY2gpOworCQkJY2xlYW5fbWVyZ2UgPSAwOworCQkJb3V0cHV0KDEsICJDT05GTElDVCAoJXMpOiBUaGVyZSBpcyBhIGRpcmVjdG9yeSB3aXRoIG5hbWUgJXMgaW4gJXMuICIKKwkJCSAgICAgICAiQWRkZWQgJXMgYXMgJXMiLAorCQkJICAgICAgIGNvbmYsIHBhdGgsIG90aGVyX2JyYW5jaCwgcGF0aCwgbmV3X3BhdGgpOworCQkJcmVtb3ZlX2ZpbGUoMCwgcGF0aCwgMCk7CisJCQl1cGRhdGVfZmlsZSgwLCBzaGEsIG1vZGUsIG5ld19wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCW91dHB1dCgyLCAiQWRkZWQgJXMiLCBwYXRoKTsKKwkJCXVwZGF0ZV9maWxlKDEsIHNoYSwgbW9kZSwgcGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKGFfc2hhICYmIGJfc2hhKSB7CisJCS8qIENhc2UgQzogQWRkZWQgaW4gYm90aCAoY2hlY2sgZm9yIHNhbWUgcGVybWlzc2lvbnMpIGFuZCAqLworCQkvKiBjYXNlIEQ6IE1vZGlmaWVkIGluIGJvdGgsIGJ1dCBkaWZmZXJlbnRseS4gKi8KKwkJY29uc3QgY2hhciAqcmVhc29uID0gImNvbnRlbnQiOworCQlzdHJ1Y3QgbWVyZ2VfZmlsZV9pbmZvIG1maTsKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgbywgYSwgYjsKKworCQlpZiAoIW9fc2hhKSB7CisJCQlyZWFzb24gPSAiYWRkL2FkZCI7CisJCQlvX3NoYSA9ICh1bnNpZ25lZCBjaGFyICopbnVsbF9zaGExOworCQl9CisJCW91dHB1dCgyLCAiQXV0by1tZXJnZWQgJXMiLCBwYXRoKTsKKwkJby5wYXRoID0gYS5wYXRoID0gYi5wYXRoID0gKGNoYXIgKilwYXRoOworCQloYXNoY3B5KG8uc2hhMSwgb19zaGEpOworCQlvLm1vZGUgPSBvX21vZGU7CisJCWhhc2hjcHkoYS5zaGExLCBhX3NoYSk7CisJCWEubW9kZSA9IGFfbW9kZTsKKwkJaGFzaGNweShiLnNoYTEsIGJfc2hhKTsKKwkJYi5tb2RlID0gYl9tb2RlOworCisJCW1maSA9IG1lcmdlX2ZpbGUoJm8sICZhLCAmYiwKKwkJCQkgYnJhbmNoMSwgYnJhbmNoMik7CisKKwkJaWYgKG1maS5jbGVhbikKKwkJCXVwZGF0ZV9maWxlKDEsIG1maS5zaGEsIG1maS5tb2RlLCBwYXRoKTsKKwkJZWxzZSB7CisJCQljbGVhbl9tZXJnZSA9IDA7CisJCQlvdXRwdXQoMSwgIkNPTkZMSUNUICglcyk6IE1lcmdlIGNvbmZsaWN0IGluICVzIiwKKwkJCQkJcmVhc29uLCBwYXRoKTsKKworCQkJaWYgKGluZGV4X29ubHkpCisJCQkJdXBkYXRlX2ZpbGUoMCwgbWZpLnNoYSwgbWZpLm1vZGUsIHBhdGgpOworCQkJZWxzZQorCQkJCXVwZGF0ZV9maWxlX2ZsYWdzKG1maS5zaGEsIG1maS5tb2RlLCBwYXRoLAorCQkJCQkgICAgICAwIC8qIHVwZGF0ZV9jYWNoZSAqLywgMSAvKiB1cGRhdGVfd29ya2luZ19kaXJlY3RvcnkgKi8pOworCQl9CisJfSBlbHNlIGlmICghb19zaGEgJiYgIWFfc2hhICYmICFiX3NoYSkgeworCQkvKgorCQkgKiB0aGlzIGVudHJ5IHdhcyBkZWxldGVkIGFsdG9nZXRoZXIuIGFfbW9kZSA9PSAwIG1lYW5zCisJCSAqIHdlIGhhZCB0aGF0IHBhdGggYW5kIHdhbnQgdG8gYWN0aXZlbHkgcmVtb3ZlIGl0LgorCQkgKi8KKwkJcmVtb3ZlX2ZpbGUoMSwgcGF0aCwgIWFfbW9kZSk7CisJfSBlbHNlCisJCWRpZSgiRmF0YWwgbWVyZ2UgZmFpbHVyZSwgc2hvdWxkbid0IGhhcHBlbi4iKTsKKworCXJldHVybiBjbGVhbl9tZXJnZTsKK30KKworc3RhdGljIGludCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZSAqaGVhZCwKKwkJICAgICAgIHN0cnVjdCB0cmVlICptZXJnZSwKKwkJICAgICAgIHN0cnVjdCB0cmVlICpjb21tb24sCisJCSAgICAgICBjb25zdCBjaGFyICpicmFuY2gxLAorCQkgICAgICAgY29uc3QgY2hhciAqYnJhbmNoMiwKKwkJICAgICAgIHN0cnVjdCB0cmVlICoqcmVzdWx0KQoreworCWludCBjb2RlLCBjbGVhbjsKKworCWlmIChzdWJ0cmVlX21lcmdlKSB7CisJCW1lcmdlID0gc2hpZnRfdHJlZV9vYmplY3QoaGVhZCwgbWVyZ2UpOworCQljb21tb24gPSBzaGlmdF90cmVlX29iamVjdChoZWFkLCBjb21tb24pOworCX0KKworCWlmIChzaGFfZXEoY29tbW9uLT5vYmplY3Quc2hhMSwgbWVyZ2UtPm9iamVjdC5zaGExKSkgeworCQlvdXRwdXQoMCwgIkFscmVhZHkgdXB0b2RhdGUhIik7CisJCSpyZXN1bHQgPSBoZWFkOworCQlyZXR1cm4gMTsKKwl9CisKKwljb2RlID0gZ2l0X21lcmdlX3RyZWVzKGluZGV4X29ubHksIGNvbW1vbiwgaGVhZCwgbWVyZ2UpOworCisJaWYgKGNvZGUgIT0gMCkKKwkJZGllKCJtZXJnaW5nIG9mIHRyZWVzICVzIGFuZCAlcyBmYWlsZWQiLAorCQkgICAgc2hhMV90b19oZXgoaGVhZC0+b2JqZWN0LnNoYTEpLAorCQkgICAgc2hhMV90b19oZXgobWVyZ2UtPm9iamVjdC5zaGExKSk7CisKKwlpZiAodW5tZXJnZWRfaW5kZXgoKSkgeworCQlzdHJ1Y3QgcGF0aF9saXN0ICplbnRyaWVzLCAqcmVfaGVhZCwgKnJlX21lcmdlOworCQlpbnQgaTsKKwkJcGF0aF9saXN0X2NsZWFyKCZjdXJyZW50X2ZpbGVfc2V0LCAxKTsKKwkJcGF0aF9saXN0X2NsZWFyKCZjdXJyZW50X2RpcmVjdG9yeV9zZXQsIDEpOworCQlnZXRfZmlsZXNfZGlycyhoZWFkKTsKKwkJZ2V0X2ZpbGVzX2RpcnMobWVyZ2UpOworCisJCWVudHJpZXMgPSBnZXRfdW5tZXJnZWQoKTsKKwkJcmVfaGVhZCAgPSBnZXRfcmVuYW1lcyhoZWFkLCBjb21tb24sIGhlYWQsIG1lcmdlLCBlbnRyaWVzKTsKKwkJcmVfbWVyZ2UgPSBnZXRfcmVuYW1lcyhtZXJnZSwgY29tbW9uLCBoZWFkLCBtZXJnZSwgZW50cmllcyk7CisJCWNsZWFuID0gcHJvY2Vzc19yZW5hbWVzKHJlX2hlYWQsIHJlX21lcmdlLAorCQkJCWJyYW5jaDEsIGJyYW5jaDIpOworCQlmb3IgKGkgPSAwOyBpIDwgZW50cmllcy0+bnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGVudHJpZXMtPml0ZW1zW2ldLnBhdGg7CisJCQlzdHJ1Y3Qgc3RhZ2VfZGF0YSAqZSA9IGVudHJpZXMtPml0ZW1zW2ldLnV0aWw7CisJCQlpZiAoIWUtPnByb2Nlc3NlZAorCQkJCSYmICFwcm9jZXNzX2VudHJ5KHBhdGgsIGUsIGJyYW5jaDEsIGJyYW5jaDIpKQorCQkJCWNsZWFuID0gMDsKKwkJfQorCisJCXBhdGhfbGlzdF9jbGVhcihyZV9tZXJnZSwgMCk7CisJCXBhdGhfbGlzdF9jbGVhcihyZV9oZWFkLCAwKTsKKwkJcGF0aF9saXN0X2NsZWFyKGVudHJpZXMsIDEpOworCisJfQorCWVsc2UKKwkJY2xlYW4gPSAxOworCisJaWYgKGluZGV4X29ubHkpCisJCSpyZXN1bHQgPSBnaXRfd3JpdGVfdHJlZSgpOworCisJcmV0dXJuIGNsZWFuOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpyZXZlcnNlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm5leHQgPSBOVUxMLCAqY3VycmVudCwgKmJhY2t1cDsKKwlmb3IgKGN1cnJlbnQgPSBsaXN0OyBjdXJyZW50OyBjdXJyZW50ID0gYmFja3VwKSB7CisJCWJhY2t1cCA9IGN1cnJlbnQtPm5leHQ7CisJCWN1cnJlbnQtPm5leHQgPSBuZXh0OworCQluZXh0ID0gY3VycmVudDsKKwl9CisJcmV0dXJuIG5leHQ7Cit9CisKKy8qCisgKiBNZXJnZSB0aGUgY29tbWl0cyBoMSBhbmQgaDIsIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpcnR1YWwKKyAqIGNvbW1pdCBvYmplY3QgYW5kIGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBjbGVhbm5lc3Mgb2YgdGhlIG1lcmdlLgorICovCitzdGF0aWMgaW50IG1lcmdlKHN0cnVjdCBjb21taXQgKmgxLAorCQkgc3RydWN0IGNvbW1pdCAqaDIsCisJCSBjb25zdCBjaGFyICpicmFuY2gxLAorCQkgY29uc3QgY2hhciAqYnJhbmNoMiwKKwkJIHN0cnVjdCBjb21taXRfbGlzdCAqY2EsCisJCSBzdHJ1Y3QgY29tbWl0ICoqcmVzdWx0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqaXRlcjsKKwlzdHJ1Y3QgY29tbWl0ICptZXJnZWRfY29tbW9uX2FuY2VzdG9yczsKKwlzdHJ1Y3QgdHJlZSAqbXJ0cmVlOworCWludCBjbGVhbjsKKworCWlmIChzaG93KDQpKSB7CisJCW91dHB1dCg0LCAiTWVyZ2luZzoiKTsKKwkJb3V0cHV0X2NvbW1pdF90aXRsZShoMSk7CisJCW91dHB1dF9jb21taXRfdGl0bGUoaDIpOworCX0KKworCWlmICghY2EpIHsKKwkJY2EgPSBnZXRfbWVyZ2VfYmFzZXMoaDEsIGgyLCAxKTsKKwkJY2EgPSByZXZlcnNlX2NvbW1pdF9saXN0KGNhKTsKKwl9CisKKwlpZiAoc2hvdyg1KSkgeworCQlvdXRwdXQoNSwgImZvdW5kICV1IGNvbW1vbiBhbmNlc3RvcihzKToiLCBjb21taXRfbGlzdF9jb3VudChjYSkpOworCQlmb3IgKGl0ZXIgPSBjYTsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpCisJCQlvdXRwdXRfY29tbWl0X3RpdGxlKGl0ZXItPml0ZW0pOworCX0KKworCW1lcmdlZF9jb21tb25fYW5jZXN0b3JzID0gcG9wX2NvbW1pdCgmY2EpOworCWlmIChtZXJnZWRfY29tbW9uX2FuY2VzdG9ycyA9PSBOVUxMKSB7CisJCS8qIGlmIHRoZXJlIGlzIG5vIGNvbW1vbiBhbmNlc3RvciwgbWFrZSBhbiBlbXB0eSB0cmVlICovCisJCXN0cnVjdCB0cmVlICp0cmVlID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKKworCQl0cmVlLT5vYmplY3QucGFyc2VkID0gMTsKKwkJdHJlZS0+b2JqZWN0LnR5cGUgPSBPQkpfVFJFRTsKKwkJcHJldGVuZF9zaGExX2ZpbGUoTlVMTCwgMCwgT0JKX1RSRUUsIHRyZWUtPm9iamVjdC5zaGExKTsKKwkJbWVyZ2VkX2NvbW1vbl9hbmNlc3RvcnMgPSBtYWtlX3ZpcnR1YWxfY29tbWl0KHRyZWUsICJhbmNlc3RvciIpOworCX0KKworCWZvciAoaXRlciA9IGNhOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkgeworCQljYWxsX2RlcHRoKys7CisJCS8qCisJCSAqIFdoZW4gdGhlIG1lcmdlIGZhaWxzLCB0aGUgcmVzdWx0IGNvbnRhaW5zIGZpbGVzCisJCSAqIHdpdGggY29uZmxpY3QgbWFya2Vycy4gVGhlIGNsZWFubmVzcyBmbGFnIGlzCisJCSAqIGlnbm9yZWQsIGl0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkLCBhcyByZXN1bHQgb2YKKwkJICogbWVyZ2VfdHJlZXMgaGFzIGFsd2F5cyBvdmVyd3JpdHRlbiBpdDogdGhlIGNvbW1pdHRlZAorCQkgKiAiY29uZmxpY3RzIiB3ZXJlIGFscmVhZHkgcmVzb2x2ZWQuCisJCSAqLworCQlkaXNjYXJkX2NhY2hlKCk7CisJCW1lcmdlKG1lcmdlZF9jb21tb25fYW5jZXN0b3JzLCBpdGVyLT5pdGVtLAorCQkgICAgICAiVGVtcG9yYXJ5IG1lcmdlIGJyYW5jaCAxIiwKKwkJICAgICAgIlRlbXBvcmFyeSBtZXJnZSBicmFuY2ggMiIsCisJCSAgICAgIE5VTEwsCisJCSAgICAgICZtZXJnZWRfY29tbW9uX2FuY2VzdG9ycyk7CisJCWNhbGxfZGVwdGgtLTsKKworCQlpZiAoIW1lcmdlZF9jb21tb25fYW5jZXN0b3JzKQorCQkJZGllKCJtZXJnZSByZXR1cm5lZCBubyBjb21taXQiKTsKKwl9CisKKwlkaXNjYXJkX2NhY2hlKCk7CisJaWYgKCFjYWxsX2RlcHRoKSB7CisJCXJlYWRfY2FjaGUoKTsKKwkJaW5kZXhfb25seSA9IDA7CisJfSBlbHNlCisJCWluZGV4X29ubHkgPSAxOworCisJY2xlYW4gPSBtZXJnZV90cmVlcyhoMS0+dHJlZSwgaDItPnRyZWUsIG1lcmdlZF9jb21tb25fYW5jZXN0b3JzLT50cmVlLAorCQkJICAgIGJyYW5jaDEsIGJyYW5jaDIsICZtcnRyZWUpOworCisJaWYgKGluZGV4X29ubHkpIHsKKwkJKnJlc3VsdCA9IG1ha2VfdmlydHVhbF9jb21taXQobXJ0cmVlLCAibWVyZ2VkIHRyZWUiKTsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGgxLCAmKCpyZXN1bHQpLT5wYXJlbnRzKTsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGgyLCAmKCpyZXN1bHQpLT5wYXJlbnRzLT5uZXh0KTsKKwl9CisJZmx1c2hfb3V0cHV0KCk7CisJcmV0dXJuIGNsZWFuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYmV0dGVyX2JyYW5jaF9uYW1lKGNvbnN0IGNoYXIgKmJyYW5jaCkKK3sKKwlzdGF0aWMgY2hhciBnaXRoZWFkX2Vudls4ICsgNDAgKyAxXTsKKwljaGFyICpuYW1lOworCisJaWYgKHN0cmxlbihicmFuY2gpICE9IDQwKQorCQlyZXR1cm4gYnJhbmNoOworCXNwcmludGYoZ2l0aGVhZF9lbnYsICJHSVRIRUFEXyVzIiwgYnJhbmNoKTsKKwluYW1lID0gZ2V0ZW52KGdpdGhlYWRfZW52KTsKKwlyZXR1cm4gbmFtZSA/IG5hbWUgOiBicmFuY2g7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpnZXRfcmVmKGNvbnN0IGNoYXIgKnJlZikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKworCWlmIChnZXRfc2hhMShyZWYsIHNoYTEpKQorCQlkaWUoIkNvdWxkIG5vdCByZXNvbHZlIHJlZiAnJXMnIiwgcmVmKTsKKwlvYmplY3QgPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCByZWYsIHN0cmxlbihyZWYpKTsKKwlpZiAob2JqZWN0LT50eXBlID09IE9CSl9UUkVFKQorCQlyZXR1cm4gbWFrZV92aXJ0dWFsX2NvbW1pdCgoc3RydWN0IHRyZWUqKW9iamVjdCwKKwkJCWJldHRlcl9icmFuY2hfbmFtZShyZWYpKTsKKwlpZiAob2JqZWN0LT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiBOVUxMOworCWlmIChwYXJzZV9jb21taXQoKHN0cnVjdCBjb21taXQgKilvYmplY3QpKQorCQlkaWUoIkNvdWxkIG5vdCBwYXJzZSBjb21taXQgJyVzJyIsIHNoYTFfdG9faGV4KG9iamVjdC0+c2hhMSkpOworCXJldHVybiAoc3RydWN0IGNvbW1pdCAqKW9iamVjdDsKK30KKworc3RhdGljIGludCBtZXJnZV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNhc2VjbXAodmFyLCAibWVyZ2UudmVyYm9zaXR5IikpIHsKKwkJdmVyYm9zaXR5ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpiYXNlc1syMF07CisJc3RhdGljIHVuc2lnbmVkIGJhc2VzX2NvdW50ID0gMDsKKwlpbnQgaSwgY2xlYW47CisJY29uc3QgY2hhciAqYnJhbmNoMSwgKmJyYW5jaDI7CisJc3RydWN0IGNvbW1pdCAqcmVzdWx0LCAqaDEsICpoMjsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmNhID0gTlVMTDsKKwlzdHJ1Y3QgbG9ja19maWxlICpsb2NrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCWludCBpbmRleF9mZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKGFyZ3ZbMF0pOworCQlpZiAoOCA8IG5hbWVsZW4gJiYKKwkJICAgICFzdHJjbXAoYXJndlswXSArIG5hbWVsZW4gLSA4LCAiLXN1YnRyZWUiKSkKKwkJCXN1YnRyZWVfbWVyZ2UgPSAxOworCX0KKworCWdpdF9jb25maWcobWVyZ2VfY29uZmlnKTsKKwlpZiAoZ2V0ZW52KCJHSVRfTUVSR0VfVkVSQk9TSVRZIikpCisJCXZlcmJvc2l0eSA9IHN0cnRvbChnZXRlbnYoIkdJVF9NRVJHRV9WRVJCT1NJVFkiKSwgTlVMTCwgMTApOworCisJaWYgKGFyZ2MgPCA0KQorCQlkaWUoIlVzYWdlOiAlcyA8YmFzZT4uLi4gLS0gPGhlYWQ+IDxyZW1vdGU+IC4uLlxuIiwgYXJndlswXSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKQorCQkJYnJlYWs7CisJCWlmIChiYXNlc19jb3VudCA8IHNpemVvZihiYXNlcykvc2l6ZW9mKCpiYXNlcykpCisJCQliYXNlc1tiYXNlc19jb3VudCsrXSA9IGFyZ3ZbaV07CisJfQorCWlmIChhcmdjIC0gaSAhPSAzKSAvKiAiLS0iICI8aGVhZD4iICI8cmVtb3RlPiIgKi8KKwkJZGllKCJOb3QgaGFuZGxpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiB0d28gaGVhZHMgbWVyZ2UuIik7CisJaWYgKHZlcmJvc2l0eSA+PSA1KQorCQlidWZmZXJfb3V0cHV0ID0gMDsKKworCWJyYW5jaDEgPSBhcmd2WysraV07CisJYnJhbmNoMiA9IGFyZ3ZbKytpXTsKKworCWgxID0gZ2V0X3JlZihicmFuY2gxKTsKKwloMiA9IGdldF9yZWYoYnJhbmNoMik7CisKKwlicmFuY2gxID0gYmV0dGVyX2JyYW5jaF9uYW1lKGJyYW5jaDEpOworCWJyYW5jaDIgPSBiZXR0ZXJfYnJhbmNoX25hbWUoYnJhbmNoMik7CisKKwlpZiAoc2hvdygzKSkKKwkJcHJpbnRmKCJNZXJnaW5nICVzIHdpdGggJXNcbiIsIGJyYW5jaDEsIGJyYW5jaDIpOworCisJaW5kZXhfZmQgPSBob2xkX2xvY2tlZF9pbmRleChsb2NrLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBiYXNlc19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBjb21taXQgKmFuY2VzdG9yID0gZ2V0X3JlZihiYXNlc1tpXSk7CisJCWNhID0gY29tbWl0X2xpc3RfaW5zZXJ0KGFuY2VzdG9yLCAmY2EpOworCX0KKwljbGVhbiA9IG1lcmdlKGgxLCBoMiwgYnJhbmNoMSwgYnJhbmNoMiwgY2EsICZyZXN1bHQpOworCisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkICYmCisJICAgICh3cml0ZV9jYWNoZShpbmRleF9mZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJICAgICBjbG9zZShpbmRleF9mZCkgfHwgY29tbWl0X2xvY2tlZF9pbmRleChsb2NrKSkpCisJCQlkaWUgKCJ1bmFibGUgdG8gd3JpdGUgJXMiLCBnZXRfaW5kZXhfZmlsZSgpKTsKKworCXJldHVybiBjbGVhbiA/IDA6IDE7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS10cmVlLmMgYi9tZXJnZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ZDllNgotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLXRyZWUuYwpAQCAtMCwwICsxLDM1NiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV90cmVlX3VzYWdlW10gPSAiZ2l0LW1lcmdlLXRyZWUgPGJhc2UtdHJlZT4gPGJyYW5jaDE+IDxicmFuY2gyPiI7CitzdGF0aWMgaW50IHJlc29sdmVfZGlyZWN0b3JpZXMgPSAxOworCitzdHJ1Y3QgbWVyZ2VfbGlzdCB7CisJc3RydWN0IG1lcmdlX2xpc3QgKm5leHQ7CisJc3RydWN0IG1lcmdlX2xpc3QgKmxpbms7CS8qIG90aGVyIHN0YWdlcyBmb3IgdGhpcyBvYmplY3QgKi8KKworCXVuc2lnbmVkIGludCBzdGFnZSA6IDIsCisJCSAgICAgZmxhZ3MgOiAzMDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwljb25zdCBjaGFyICpwYXRoOworCXN0cnVjdCBibG9iICpibG9iOworfTsKKworc3RhdGljIHN0cnVjdCBtZXJnZV9saXN0ICptZXJnZV9yZXN1bHQsICoqbWVyZ2VfcmVzdWx0X2VuZCA9ICZtZXJnZV9yZXN1bHQ7CisKK3N0YXRpYyB2b2lkIGFkZF9tZXJnZV9lbnRyeShzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJKm1lcmdlX3Jlc3VsdF9lbmQgPSBlbnRyeTsKKwltZXJnZV9yZXN1bHRfZW5kID0gJmVudHJ5LT5uZXh0OworfQorCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpOworCitzdGF0aWMgY29uc3QgY2hhciAqZXhwbGFuYXRpb24oc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5KQoreworCXN3aXRjaCAoZW50cnktPnN0YWdlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gIm1lcmdlZCI7CisJY2FzZSAzOgorCQlyZXR1cm4gImFkZGVkIGluIHJlbW90ZSI7CisJY2FzZSAyOgorCQlpZiAoZW50cnktPmxpbmspCisJCQlyZXR1cm4gImFkZGVkIGluIGJvdGgiOworCQlyZXR1cm4gImFkZGVkIGluIGxvY2FsIjsKKwl9CisKKwkvKiBFeGlzdGVkIGluIGJhc2UgKi8KKwllbnRyeSA9IGVudHJ5LT5saW5rOworCWlmICghZW50cnkpCisJCXJldHVybiAicmVtb3ZlZCBpbiBib3RoIjsKKworCWlmIChlbnRyeS0+bGluaykKKwkJcmV0dXJuICJjaGFuZ2VkIGluIGJvdGgiOworCisJaWYgKGVudHJ5LT5zdGFnZSA9PSAzKQorCQlyZXR1cm4gInJlbW92ZWQgaW4gbG9jYWwiOworCXJldHVybiAicmVtb3ZlZCBpbiByZW1vdGUiOworfQorCitleHRlcm4gdm9pZCAqbWVyZ2VfZmlsZShzdHJ1Y3QgYmxvYiAqLCBzdHJ1Y3QgYmxvYiAqLCBzdHJ1Y3QgYmxvYiAqLCB1bnNpZ25lZCBsb25nICopOworCitzdGF0aWMgdm9pZCAqcmVzdWx0KHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJc3RydWN0IGJsb2IgKmJhc2UsICpvdXIsICp0aGVpcjsKKworCWlmICghZW50cnktPnN0YWdlKQorCQlyZXR1cm4gcmVhZF9zaGExX2ZpbGUoZW50cnktPmJsb2ItPm9iamVjdC5zaGExLCAmdHlwZSwgc2l6ZSk7CisJYmFzZSA9IE5VTEw7CisJaWYgKGVudHJ5LT5zdGFnZSA9PSAxKSB7CisJCWJhc2UgPSBlbnRyeS0+YmxvYjsKKwkJZW50cnkgPSBlbnRyeS0+bGluazsKKwl9CisJb3VyID0gTlVMTDsKKwlpZiAoZW50cnkgJiYgZW50cnktPnN0YWdlID09IDIpIHsKKwkJb3VyID0gZW50cnktPmJsb2I7CisJCWVudHJ5ID0gZW50cnktPmxpbms7CisJfQorCXRoZWlyID0gTlVMTDsKKwlpZiAoZW50cnkpCisJCXRoZWlyID0gZW50cnktPmJsb2I7CisJcmV0dXJuIG1lcmdlX2ZpbGUoYmFzZSwgb3VyLCB0aGVpciwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkICpvcmlnaW4oc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5LCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl3aGlsZSAoZW50cnkpIHsKKwkJaWYgKGVudHJ5LT5zdGFnZSA9PSAyKQorCQkJcmV0dXJuIHJlYWRfc2hhMV9maWxlKGVudHJ5LT5ibG9iLT5vYmplY3Quc2hhMSwgJnR5cGUsIHNpemUpOworCQllbnRyeSA9IGVudHJ5LT5saW5rOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzaG93X291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKQorCQlwcmludGYoIiUuKnMiLCAoaW50KSBtYltpXS5zaXplLCBtYltpXS5wdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RpZmYoc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwltbWZpbGVfdCBzcmMsIGRzdDsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwl4ZGVtaXRjYl90IGVjYjsKKworCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJeGVjZmcuY3R4bGVuID0gMzsKKwl4ZWNmZy5mbGFncyA9IDA7CisJZWNiLm91dGYgPSBzaG93X291dGY7CisJZWNiLnByaXYgPSBOVUxMOworCisJc3JjLnB0ciA9IG9yaWdpbihlbnRyeSwgJnNpemUpOworCWlmICghc3JjLnB0cikKKwkJc2l6ZSA9IDA7CisJc3JjLnNpemUgPSBzaXplOworCWRzdC5wdHIgPSByZXN1bHQoZW50cnksICZzaXplKTsKKwlpZiAoIWRzdC5wdHIpCisJCXNpemUgPSAwOworCWRzdC5zaXplID0gc2l6ZTsKKwl4ZGxfZGlmZigmc3JjLCAmZHN0LCAmeHBwLCAmeGVjZmcsICZlY2IpOworCWZyZWUoc3JjLnB0cik7CisJZnJlZShkc3QucHRyKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19yZXN1bHRfbGlzdChzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJcHJpbnRmKCIlc1xuIiwgZXhwbGFuYXRpb24oZW50cnkpKTsKKwlkbyB7CisJCXN0cnVjdCBtZXJnZV9saXN0ICpsaW5rID0gZW50cnktPmxpbms7CisJCXN0YXRpYyBjb25zdCBjaGFyICpkZXNjWzRdID0geyAicmVzdWx0IiwgImJhc2UiLCAib3VyIiwgInRoZWlyIiB9OworCQlwcmludGYoIiAgJS02cyAlbyAlcyAlc1xuIiwgZGVzY1tlbnRyeS0+c3RhZ2VdLCBlbnRyeS0+bW9kZSwgc2hhMV90b19oZXgoZW50cnktPmJsb2ItPm9iamVjdC5zaGExKSwgZW50cnktPnBhdGgpOworCQllbnRyeSA9IGxpbms7CisJfSB3aGlsZSAoZW50cnkpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdCh2b2lkKQoreworCXN0cnVjdCBtZXJnZV9saXN0ICp3YWxrOworCisJd2FsayA9IG1lcmdlX3Jlc3VsdDsKKwl3aGlsZSAod2FsaykgeworCQlzaG93X3Jlc3VsdF9saXN0KHdhbGspOworCQlzaG93X2RpZmYod2Fsayk7CisJCXdhbGsgPSB3YWxrLT5uZXh0OworCX0KK30KKworLyogQW4gZW1wdHkgZW50cnkgbmV2ZXIgY29tcGFyZXMgc2FtZSwgbm90IGV2ZW4gdG8gYW5vdGhlciBlbXB0eSBlbnRyeSAqLworc3RhdGljIGludCBzYW1lX2VudHJ5KHN0cnVjdCBuYW1lX2VudHJ5ICphLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYikKK3sKKwlyZXR1cm4JYS0+c2hhMSAmJgorCQliLT5zaGExICYmCisJCSFoYXNoY21wKGEtPnNoYTEsIGItPnNoYTEpICYmCisJCWEtPm1vZGUgPT0gYi0+bW9kZTsKK30KKworc3RhdGljIHN0cnVjdCBtZXJnZV9saXN0ICpjcmVhdGVfZW50cnkodW5zaWduZWQgc3RhZ2UsIHVuc2lnbmVkIG1vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IG1lcmdlX2xpc3QgKnJlcyA9IHhtYWxsb2Moc2l6ZW9mKCpyZXMpKTsKKworCW1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSk7CisJcmVzLT5zdGFnZSA9IHN0YWdlOworCXJlcy0+cGF0aCA9IHBhdGg7CisJcmVzLT5tb2RlID0gbW9kZTsKKwlyZXMtPmJsb2IgPSBsb29rdXBfYmxvYihzaGExKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCByZXNvbHZlKGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBuYW1lX2VudHJ5ICpicmFuY2gxLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqcmVzdWx0KQoreworCXN0cnVjdCBtZXJnZV9saXN0ICpvcmlnLCAqZmluYWw7CisJY29uc3QgY2hhciAqcGF0aDsKKworCS8qIElmIGl0J3MgYWxyZWFkeSBicmFuY2gxLCBkb24ndCBib3RoZXIgc2hvd2luZyBpdCAqLworCWlmICghYnJhbmNoMSkKKwkJcmV0dXJuOworCisJcGF0aCA9IHhzdHJkdXAobWtwYXRoKCIlcyVzIiwgYmFzZSwgcmVzdWx0LT5wYXRoKSk7CisJb3JpZyA9IGNyZWF0ZV9lbnRyeSgyLCBicmFuY2gxLT5tb2RlLCBicmFuY2gxLT5zaGExLCBwYXRoKTsKKwlmaW5hbCA9IGNyZWF0ZV9lbnRyeSgwLCByZXN1bHQtPm1vZGUsIHJlc3VsdC0+c2hhMSwgcGF0aCk7CisKKwlmaW5hbC0+bGluayA9IG9yaWc7CisKKwlhZGRfbWVyZ2VfZW50cnkoZmluYWwpOworfQorCitzdGF0aWMgaW50IHVucmVzb2x2ZWRfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBuYW1lX2VudHJ5IG5bM10pCit7CisJaW50IGJhc2VsZW4sIHBhdGhsZW47CisJY2hhciAqbmV3YmFzZTsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSAqcDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHRbM107CisJdm9pZCAqYnVmMCwgKmJ1ZjEsICpidWYyOworCisJaWYgKCFyZXNvbHZlX2RpcmVjdG9yaWVzKQorCQlyZXR1cm4gMDsKKwlwID0gbjsKKwlpZiAoIXAtPm1vZGUpIHsKKwkJcCsrOworCQlpZiAoIXAtPm1vZGUpCisJCQlwKys7CisJfQorCWlmICghU19JU0RJUihwLT5tb2RlKSkKKwkJcmV0dXJuIDA7CisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlwYXRobGVuID0gdHJlZV9lbnRyeV9sZW4ocC0+cGF0aCwgcC0+c2hhMSk7CisJbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwLT5wYXRoLCBwYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwYXRobGVuLCAiLyIsIDIpOworCisJYnVmMCA9IGZpbGxfdHJlZV9kZXNjcmlwdG9yKHQrMCwgblswXS5zaGExKTsKKwlidWYxID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IodCsxLCBuWzFdLnNoYTEpOworCWJ1ZjIgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcih0KzIsIG5bMl0uc2hhMSk7CisJbWVyZ2VfdHJlZXModCwgbmV3YmFzZSk7CisKKwlmcmVlKGJ1ZjApOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKG5ld2Jhc2UpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWVyZ2VfbGlzdCAqbGlua19lbnRyeSh1bnNpZ25lZCBzdGFnZSwgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IG5hbWVfZW50cnkgKm4sIHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCXN0cnVjdCBtZXJnZV9saXN0ICpsaW5rOworCisJaWYgKCFuLT5tb2RlKQorCQlyZXR1cm4gZW50cnk7CisJaWYgKGVudHJ5KQorCQlwYXRoID0gZW50cnktPnBhdGg7CisJZWxzZQorCQlwYXRoID0geHN0cmR1cChta3BhdGgoIiVzJXMiLCBiYXNlLCBuLT5wYXRoKSk7CisJbGluayA9IGNyZWF0ZV9lbnRyeShzdGFnZSwgbi0+bW9kZSwgbi0+c2hhMSwgcGF0aCk7CisJbGluay0+bGluayA9IGVudHJ5OworCXJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZCB1bnJlc29sdmVkKGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBuYW1lX2VudHJ5IG5bM10pCit7CisJc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5ID0gTlVMTDsKKworCWlmICh1bnJlc29sdmVkX2RpcmVjdG9yeShiYXNlLCBuKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEbyB0aGVtIGluIHJldmVyc2Ugb3JkZXIgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGxpbmsKKwkgKiBsaXN0IGhhcyB0aGUgc3RhZ2VzIGluIG9yZGVyIC0gbGlua19lbnRyeSBhZGRzIG5ldworCSAqIGxpbmtzIGF0IHRoZSBmcm9udC4KKwkgKi8KKwllbnRyeSA9IGxpbmtfZW50cnkoMywgYmFzZSwgbiArIDIsIGVudHJ5KTsKKwllbnRyeSA9IGxpbmtfZW50cnkoMiwgYmFzZSwgbiArIDEsIGVudHJ5KTsKKwllbnRyeSA9IGxpbmtfZW50cnkoMSwgYmFzZSwgbiArIDAsIGVudHJ5KTsKKworCWFkZF9tZXJnZV9lbnRyeShlbnRyeSk7Cit9CisKKy8qCisgKiBNZXJnZSB0d28gdHJlZXMgdG9nZXRoZXIgKHRbMV0gYW5kIHRbMl0pLCB1c2luZyBhIGNvbW1vbiBiYXNlICh0WzBdKQorICogYXMgdGhlIG9yaWdpbi4KKyAqCisgKiBUaGlzIHdhbGtzIHRoZSAoc29ydGVkKSB0cmVlcyBpbiBsb2NrLXN0ZXAsIGNoZWNraW5nIGV2ZXJ5IHBvc3NpYmxlCisgKiBuYW1lLiBOb3RlIHRoYXQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseSBzb3J0IGRpZmZlcmVudGx5IGZyb20gb3RoZXIKKyAqIGZpbGVzIChzZWUgImJhc2VfbmFtZV9jb21wYXJlIiksIHNvIHlvdSdsbCBuZXZlciBzZWUgZmlsZS9kaXJlY3RvcnkKKyAqIGNvbmZsaWN0cywgYmVjYXVzZSB0aGV5IHdvbid0IGV2ZXIgY29tcGFyZSB0aGUgc2FtZS4KKyAqCisgKiBJT1csIGlmIGEgZGlyZWN0b3J5IGNoYW5nZXMgdG8gYSBmaWxlbmFtZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCisgKiBzZWVuIGFzIHRoZSBkaXJlY3RvcnkgZ29pbmcgYXdheSwgYW5kIHRoZSBmaWxlbmFtZSBiZWluZyBjcmVhdGVkLgorICoKKyAqIFRoaW5rIG9mIHRoaXMgYXMgYSB0aHJlZS13YXkgZGlmZi4KKyAqCisgKiBUaGUgb3V0cHV0IHdpbGwgYmUgZWl0aGVyOgorICogIC0gc3VjY2Vzc2Z1bCBtZXJnZQorICoJICIwIG1vZGUgc2hhMSBmaWxlbmFtZSIKKyAqICAgIE5PVEUgTk9URSBOT1RFISBGSVhNRSEgV2UgcmVhbGx5IHJlYWxseSBuZWVkIHRvIHdhbGsgdGhlIGluZGV4CisgKiAgICBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgdG9vIQorICoKKyAqICAtIGNvbmZsaWN0OgorICoJIjEgbW9kZSBzaGExIGZpbGVuYW1lIgorICoJIjIgbW9kZSBzaGExIGZpbGVuYW1lIgorICoJIjMgbW9kZSBzaGExIGZpbGVuYW1lIgorICogICAgd2hlcmUgbm90IGFsbCBvZiB0aGUgMS8yLzMgbGluZXMgbWF5IGV4aXN0LCBvZiBjb3Vyc2UuCisgKgorICogVGhlIHN1Y2Nlc3NmdWwgbWVyZ2UgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgdGhyZWUtd2F5IG1lcmdlCisgKiBpbiBnaXQtcmVhZC10cmVlLgorICovCitzdGF0aWMgdm9pZCB0aHJlZXdheV9jYWxsYmFjayhpbnQgbiwgdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnksIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJLyogU2FtZSBpbiBib3RoPyAqLworCWlmIChzYW1lX2VudHJ5KGVudHJ5KzEsIGVudHJ5KzIpKSB7CisJCWlmIChlbnRyeVswXS5zaGExKSB7CisJCQlyZXNvbHZlKGJhc2UsIE5VTEwsIGVudHJ5KzEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHNhbWVfZW50cnkoZW50cnkrMCwgZW50cnkrMSkpIHsKKwkJaWYgKGVudHJ5WzJdLnNoYTEgJiYgIVNfSVNESVIoZW50cnlbMl0ubW9kZSkpIHsKKwkJCXJlc29sdmUoYmFzZSwgZW50cnkrMSwgZW50cnkrMik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoc2FtZV9lbnRyeShlbnRyeSswLCBlbnRyeSsyKSkgeworCQlpZiAoZW50cnlbMV0uc2hhMSAmJiAhU19JU0RJUihlbnRyeVsxXS5tb2RlKSkgeworCQkJcmVzb2x2ZShiYXNlLCBOVUxMLCBlbnRyeSsxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXVucmVzb2x2ZWQoYmFzZSwgZW50cnkpOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJdHJhdmVyc2VfdHJlZXMoMywgdCwgYmFzZSwgdGhyZWV3YXlfY2FsbGJhY2spOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X3RyZWVfZGVzY3JpcHRvcihzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpyZXYpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl2b2lkICpidWY7CisKKwlpZiAoZ2V0X3NoYTEocmV2LCBzaGExKSkKKwkJZGllKCJ1bmtub3duIHJldiAlcyIsIHJldik7CisJYnVmID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IoZGVzYywgc2hhMSk7CisJaWYgKCFidWYpCisJCWRpZSgiJXMgaXMgbm90IGEgdHJlZSIsIHJldik7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0cmVlX2Rlc2MgdFszXTsKKwl2b2lkICpidWYxLCAqYnVmMiwgKmJ1ZjM7CisKKwlpZiAoYXJnYyAhPSA0KQorCQl1c2FnZShtZXJnZV90cmVlX3VzYWdlKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWJ1ZjEgPSBnZXRfdHJlZV9kZXNjcmlwdG9yKHQrMCwgYXJndlsxXSk7CisJYnVmMiA9IGdldF90cmVlX2Rlc2NyaXB0b3IodCsxLCBhcmd2WzJdKTsKKwlidWYzID0gZ2V0X3RyZWVfZGVzY3JpcHRvcih0KzIsIGFyZ3ZbM10pOworCW1lcmdlX3RyZWVzKHQsICIiKTsKKwlmcmVlKGJ1ZjEpOworCWZyZWUoYnVmMik7CisJZnJlZShidWYzKTsKKworCXNob3dfcmVzdWx0KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ta3RhZy5jIGIvbWt0YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzEwMTExCi0tLSAvZGV2L251bGwKKysrIGIvbWt0YWcuYwpAQCAtMCwwICsxLDE0NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisKKy8qCisgKiBBIHNpZ25hdHVyZSBmaWxlIGhhcyBhIHZlcnkgc2ltcGxlIGZpeGVkIGZvcm1hdDogZm91ciBsaW5lcworICogb2YgIm9iamVjdCA8c2hhMT4iICsgInR5cGUgPHR5cGVuYW1lPiIgKyAidGFnIDx0YWduYW1lPiIgKworICogInRhZ2dlciA8Y29tbWl0dGVyPiIsIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSwgYSBmcmVlLWZvcm0gdGFnCisgKiBtZXNzYWdlIGFuZCBhIHNpZ25hdHVyZSBibG9jayB0aGF0IGdpdCBpdHNlbGYgZG9lc24ndCBjYXJlIGFib3V0LAorICogYnV0IHRoYXQgY2FuIGJlIHZlcmlmaWVkIHdpdGggZ3BnIG9yIHNpbWlsYXIuCisgKgorICogVGhlIGZpcnN0IHRocmVlIGxpbmVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IDYzIGJ5dGVzOgorICogIm9iamVjdCA8c2hhMT5cbiIgaXMgNDggYnl0ZXMsICJ0eXBlIHRhZ1xuIiBhdCA5IGJ5dGVzIGlzIHRoZQorICogc2hvcnRlc3QgcG9zc2libGUgdHlwZS1saW5lLCBhbmQgInRhZyAuXG4iIGF0IDYgYnl0ZXMgaXMgdGhlCisgKiBzaG9ydGVzdCBzaW5nbGUtY2hhcmFjdGVyLXRhZyBsaW5lLiAKKyAqCisgKiBXZSBhbHNvIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgZnVsbCBvYmplY3QgdG8gOGtCLgorICogSnVzdCBiZWNhdXNlIEknbSBhIGxhenkgYmFzdGFyZCwgYW5kIGlmIHlvdSBjYW4ndCBmaXQgYSBzaWduYXR1cmUKKyAqIGluIHRoYXQgc2l6ZSwgeW91J3JlIGRvaW5nIHNvbWV0aGluZyB3cm9uZy4KKyAqLworCisvKiBTb21lIHJhbmRvbSBzaXplICovCisjZGVmaW5lIE1BWFNJWkUgKDgxOTIpCisKKy8qCisgKiBXZSByZWZ1c2UgdG8gdGFnIHNvbWV0aGluZyB3ZSBjYW4ndCB2ZXJpZnkuIEp1c3QgYmVjYXVzZS4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3R5cGUpCit7CisJaW50IHJldCA9IC0xOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKworCWlmIChidWZmZXIpIHsKKwkJaWYgKHR5cGUgPT0gdHlwZV9mcm9tX3N0cmluZyhleHBlY3RlZF90eXBlKSkKKwkJCXJldCA9IGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGJ1ZmZlciwgc2l6ZSwgZXhwZWN0ZWRfdHlwZSk7CisJCWZyZWUoYnVmZmVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIE5PX0M5OV9GT1JNQVQKKyNkZWZpbmUgUERfRk1UICIlZCIKKyNlbHNlCisjZGVmaW5lIFBEX0ZNVCAiJXRkIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyaWZ5X3RhZyhjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgdHlwZWxlbjsKKwljaGFyIHR5cGVbMjBdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqb2JqZWN0LCAqdHlwZV9saW5lLCAqdGFnX2xpbmUsICp0YWdnZXJfbGluZTsKKworCWlmIChzaXplIDwgNjQpCisJCXJldHVybiBlcnJvcigid2FubmEgZm9vbCBtZSA/IHlvdSBvYnZpb3VzbHkgZ290IHRoZSBzaXplIHdyb25nICEiKTsKKworCWJ1ZmZlcltzaXplXSA9IDA7CisKKwkvKiBWZXJpZnkgb2JqZWN0IGxpbmUgKi8KKwlvYmplY3QgPSBidWZmZXI7CisJaWYgKG1lbWNtcChvYmplY3QsICJvYmplY3QgIiwgNykpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBkb2VzIG5vdCBzdGFydCB3aXRoIFwib2JqZWN0IFwiIiwgMCk7CisKKwlpZiAoZ2V0X3NoYTFfaGV4KG9iamVjdCArIDcsIHNoYTEpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogY291bGQgbm90IGdldCBTSEExIGhhc2giLCA3KTsKKworCS8qIFZlcmlmeSB0eXBlIGxpbmUgKi8KKwl0eXBlX2xpbmUgPSBvYmplY3QgKyA0ODsKKwlpZiAobWVtY21wKHR5cGVfbGluZSAtIDEsICJcbnR5cGUgIiwgNikpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBjb3VsZCBub3QgZmluZCBcIlxcbnR5cGUgXCIiLCA0Nyk7CisKKwkvKiBWZXJpZnkgdGFnLWxpbmUgKi8KKwl0YWdfbGluZSA9IHN0cmNocih0eXBlX2xpbmUsICdcbicpOworCWlmICghdGFnX2xpbmUpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IGNvdWxkIG5vdCBmaW5kIG5leHQgXCJcXG5cIiIsIHR5cGVfbGluZSAtIGJ1ZmZlcik7CisJdGFnX2xpbmUrKzsKKwlpZiAobWVtY21wKHRhZ19saW5lLCAidGFnICIsIDQpIHx8IHRhZ19saW5lWzRdID09ICdcbicpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IG5vIFwidGFnIFwiIGZvdW5kIiwgdGFnX2xpbmUgLSBidWZmZXIpOworCisJLyogR2V0IHRoZSBhY3R1YWwgdHlwZSAqLworCXR5cGVsZW4gPSB0YWdfbGluZSAtIHR5cGVfbGluZSAtIHN0cmxlbigidHlwZSBcbiIpOworCWlmICh0eXBlbGVuID49IHNpemVvZih0eXBlKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogdHlwZSB0b28gbG9uZyIsIHR5cGVfbGluZSs1IC0gYnVmZmVyKTsKKworCW1lbWNweSh0eXBlLCB0eXBlX2xpbmUrNSwgdHlwZWxlbik7CisJdHlwZVt0eXBlbGVuXSA9IDA7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgb2JqZWN0IG1hdGNoZXMgKi8KKwlpZiAodmVyaWZ5X29iamVjdChzaGExLCB0eXBlKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyJWQ6IGNvdWxkIG5vdCB2ZXJpZnkgb2JqZWN0ICVzIiwgNywgc2hhMV90b19oZXgoc2hhMSkpOworCisJLyogVmVyaWZ5IHRoZSB0YWctbmFtZTogd2UgZG9uJ3QgYWxsb3cgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHNwYWNlcyBpbiBpdCAqLworCXRhZ19saW5lICs9IDQ7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqdGFnX2xpbmUrKzsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQlpZiAoYyA+ICcgJykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiBjb3VsZCBub3QgdmVyaWZ5IHRhZyBuYW1lIiwgdGFnX2xpbmUgLSBidWZmZXIpOworCX0KKworCS8qIFZlcmlmeSB0aGUgdGFnZ2VyIGxpbmUgKi8KKwl0YWdnZXJfbGluZSA9IHRhZ19saW5lOworCisJaWYgKG1lbWNtcCh0YWdnZXJfbGluZSwgInRhZ2dlciIsIDYpIHx8ICh0YWdnZXJfbGluZVs2XSA9PSAnXG4nKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogY291bGQgbm90IGZpbmQgXCJ0YWdnZXJcIiIsIHRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKworCS8qIFRPRE86IGNoZWNrIGZvciBjb21taXR0ZXIgaW5mbyArIGJsYW5rIGxpbmU/ICovCisJLyogQWxzbywgdGhlIG1pbmltdW0gbGVuZ3RoIGlzIHByb2JhYmx5ICsgInRhZ2dlciAuIiwgb3IgNjMrOD03MSAqLworCisJLyogVGhlIGFjdHVhbCBzdHVmZiBhZnRlcndhcmRzIHdlIGRvbid0IGNhcmUgYWJvdXQuLiAqLworCXJldHVybiAwOworfQorCisjdW5kZWYgUERfRk1UCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSA0MDk2OworCWNoYXIgKmJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJdW5zaWduZWQgY2hhciByZXN1bHRfc2hhMVsyMF07CisKKwlpZiAoYXJnYyAhPSAxKQorCQl1c2FnZSgiZ2l0LW1rdGFnIDwgc2lnbmF0dXJlZmlsZSIpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJaWYgKHJlYWRfcGlwZSgwLCAmYnVmZmVyLCAmc2l6ZSkpIHsKKwkJZnJlZShidWZmZXIpOworCQlkaWUoImNvdWxkIG5vdCByZWFkIGZyb20gc3RkaW4iKTsKKwl9CisKKwkvKiBWZXJpZnkgaXQgZm9yIHNvbWUgYmFzaWMgc2FuaXR5OiBpdCBuZWVkcyB0byBzdGFydCB3aXRoCisJICAgIm9iamVjdCA8c2hhMT5cbnR5cGVcbnRhZ2dlciAiICovCisJaWYgKHZlcmlmeV90YWcoYnVmZmVyLCBzaXplKSA8IDApCisJCWRpZSgiaW52YWxpZCB0YWcgc2lnbmF0dXJlIGZpbGUiKTsKKworCWlmICh3cml0ZV9zaGExX2ZpbGUoYnVmZmVyLCBzaXplLCB0YWdfdHlwZSwgcmVzdWx0X3NoYTEpIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgdGFnIGZpbGUiKTsKKworCWZyZWUoYnVmZmVyKTsKKworCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHJlc3VsdF9zaGExKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ta3RyZWUuYyBiL21rdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmRkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ta3RyZWUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIEdJVCAtIHRoZSBzdHVwaWQgY29udGVudCB0cmFja2VyCisgKgorICogQ29weXJpZ2h0IChjKSBKdW5pbyBDIEhhbWFubywgMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworc3RhdGljIHN0cnVjdCB0cmVlZW50IHsKKwl1bnNpZ25lZCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IGxlbjsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9ICoqZW50cmllczsKK3N0YXRpYyBpbnQgYWxsb2MsIHVzZWQ7CisKK3N0YXRpYyB2b2lkIGFwcGVuZF90b190cmVlKHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHRyZWVlbnQgKmVudDsKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCWlmIChzdHJjaHIocGF0aCwgJy8nKSkKKwkJZGllKCJwYXRoICVzIGNvbnRhaW5zIHNsYXNoIiwgcGF0aCk7CisKKwlpZiAoYWxsb2MgPD0gdXNlZCkgeworCQlhbGxvYyA9IGFsbG9jX25yKHVzZWQpOworCQllbnRyaWVzID0geHJlYWxsb2MoZW50cmllcywgc2l6ZW9mKCplbnRyaWVzKSAqIGFsbG9jKTsKKwl9CisJZW50ID0gZW50cmllc1t1c2VkKytdID0geG1hbGxvYyhzaXplb2YoKiplbnRyaWVzKSArIGxlbiArIDEpOworCWVudC0+bW9kZSA9IG1vZGU7CisJZW50LT5sZW4gPSBsZW47CisJaGFzaGNweShlbnQtPnNoYTEsIHNoYTEpOworCW1lbWNweShlbnQtPm5hbWUsIHBhdGgsIGxlbisxKTsKK30KKworc3RhdGljIGludCBlbnRfY29tcGFyZShjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHRyZWVlbnQgKmEgPSAqKHN0cnVjdCB0cmVlZW50ICoqKWFfOworCXN0cnVjdCB0cmVlZW50ICpiID0gKihzdHJ1Y3QgdHJlZWVudCAqKiliXzsKKwlyZXR1cm4gYmFzZV9uYW1lX2NvbXBhcmUoYS0+bmFtZSwgYS0+bGVuLCBhLT5tb2RlLAorCQkJCSBiLT5uYW1lLCBiLT5sZW4sIGItPm1vZGUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90cmVlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb2Zmc2V0OworCWludCBpOworCisJcXNvcnQoZW50cmllcywgdXNlZCwgc2l6ZW9mKCplbnRyaWVzKSwgZW50X2NvbXBhcmUpOworCWZvciAoc2l6ZSA9IGkgPSAwOyBpIDwgdXNlZDsgaSsrKQorCQlzaXplICs9IDMyICsgZW50cmllc1tpXS0+bGVuOworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJb2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB1c2VkOyBpKyspIHsKKwkJc3RydWN0IHRyZWVlbnQgKmVudCA9IGVudHJpZXNbaV07CisKKwkJaWYgKG9mZnNldCArIGVudC0+bGVuICsgMTAwIDwgc2l6ZSkgeworCQkJc2l6ZSA9IGFsbG9jX25yKG9mZnNldCArIGVudC0+bGVuICsgMTAwKTsKKwkJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgc2l6ZSk7CisJCX0KKwkJb2Zmc2V0ICs9IHNwcmludGYoYnVmZmVyICsgb2Zmc2V0LCAiJW8gIiwgZW50LT5tb2RlKTsKKwkJb2Zmc2V0ICs9IHNwcmludGYoYnVmZmVyICsgb2Zmc2V0LCAiJXMiLCBlbnQtPm5hbWUpOworCQlidWZmZXJbb2Zmc2V0KytdID0gMDsKKwkJaGFzaGNweSgodW5zaWduZWQgY2hhciopYnVmZmVyICsgb2Zmc2V0LCBlbnQtPnNoYTEpOworCQlvZmZzZXQgKz0gMjA7CisJfQorCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIG9mZnNldCwgdHJlZV90eXBlLCBzaGExKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbWt0cmVlX3VzYWdlW10gPSAiZ2l0LW1rdHJlZSBbLXpdIjsKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IHN0cmJ1ZiBzYjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXdoaWxlICgoMSA8IGFjKSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJY2hhciAqYXJnID0gYXZbMV07CisJCWlmICghc3RyY21wKCIteiIsIGFyZykpCisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJZWxzZQorCQkJdXNhZ2UobWt0cmVlX3VzYWdlKTsKKwkJYWMtLTsKKwkJYXYrKzsKKwl9CisKKwlzdHJidWZfaW5pdCgmc2IpOworCXdoaWxlICgxKSB7CisJCWludCBsZW47CisJCWNoYXIgKnB0ciwgKm50cjsKKwkJdW5zaWduZWQgbW9kZTsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQljaGFyICpwYXRoOworCisJCXJlYWRfbGluZSgmc2IsIHN0ZGluLCBsaW5lX3Rlcm1pbmF0aW9uKTsKKwkJaWYgKHNiLmVvZikKKwkJCWJyZWFrOworCQlsZW4gPSBzYi5sZW47CisJCXB0ciA9IHNiLmJ1ZjsKKwkJLyogSW5wdXQgaXMgbm9uLXJlY3Vyc2l2ZSBscy10cmVlIG91dHB1dCBmb3JtYXQKKwkJICogbW9kZSBTUCB0eXBlIFNQIHNoYTEgVEFCIG5hbWUKKwkJICovCisJCW1vZGUgPSBzdHJ0b3VsKHB0ciwgJm50ciwgOCk7CisJCWlmIChwdHIgPT0gbnRyIHx8ICFudHIgfHwgKm50ciAhPSAnICcpCisJCQlkaWUoImlucHV0IGZvcm1hdCBlcnJvcjogJXMiLCBzYi5idWYpOworCQlwdHIgPSBudHIgKyAxOyAvKiB0eXBlICovCisJCW50ciA9IHN0cmNocihwdHIsICcgJyk7CisJCWlmICghbnRyIHx8IHNiLmJ1ZiArIGxlbiA8PSBudHIgKyA0MSB8fAorCQkgICAgbnRyWzQxXSAhPSAnXHQnIHx8CisJCSAgICBnZXRfc2hhMV9oZXgobnRyICsgMSwgc2hhMSkpCisJCQlkaWUoImlucHV0IGZvcm1hdCBlcnJvcjogJXMiLCBzYi5idWYpOworCQl0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwkJaWYgKHR5cGUgPCAwKQorCQkJZGllKCJvYmplY3QgJXMgdW5hdmFpbGFibGUiLCBzaGExX3RvX2hleChzaGExKSk7CisJCSpudHIrKyA9IDA7IC8qIG5vdyBhdCB0aGUgYmVnaW5uaW5nIG9mIFNIQTEgKi8KKwkJaWYgKHR5cGUgIT0gdHlwZV9mcm9tX3N0cmluZyhwdHIpKQorCQkJZGllKCJvYmplY3QgdHlwZSAlcyBtaXNtYXRjaCAoJXMpIiwgcHRyLCB0eXBlbmFtZSh0eXBlKSk7CisJCW50ciArPSA0MTsgLyogYXQgdGhlIGJlZ2lubmluZyBvZiBuYW1lICovCisJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIG50clswXSA9PSAnIicpCisJCQlwYXRoID0gdW5xdW90ZV9jX3N0eWxlKG50ciwgTlVMTCk7CisJCWVsc2UKKwkJCXBhdGggPSBudHI7CisKKwkJYXBwZW5kX3RvX3RyZWUobW9kZSwgc2hhMSwgcGF0aCk7CisKKwkJaWYgKHBhdGggIT0gbnRyKQorCQkJZnJlZShwYXRoKTsKKwl9CisJd3JpdGVfdHJlZShzaGExKTsKKwlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvbW96aWxsYS1zaGExL3NoYTEuYyBiL21vemlsbGEtc2hhMS9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NTMxZAotLS0gL2Rldi9udWxsCisrKyBiL21vemlsbGEtc2hhMS9zaGExLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIAorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAqIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICogCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgU0hBIDE4MC0xIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoQ29tcGFjdCB2ZXJzaW9uKQorICogCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUGF1bCBLb2NoZXIgb2YKKyAqIENyeXB0b2dyYXBoeSBSZXNlYXJjaC4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgUGF1bCBLb2NoZXIgYXJlIAorICogQ29weXJpZ2h0IChDKSAxOTk1LTkgYnkgQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLCBJbmMuICBBbGwKKyAqIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogICAgIFBhdWwgS29jaGVyCisgKiAKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUKKyAqICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIAorICogaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIAorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvCisgKiBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwKKyAqIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5CisgKiB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50CisgKiBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlCisgKiBHUEwuCisgKi8KKworI2luY2x1ZGUgInNoYTEuaCIKKworc3RhdGljIHZvaWQgc2hhSGFzaEJsb2NrKFNIQV9DVFggKmN0eCk7CisKK3ZvaWQgU0hBMV9Jbml0KFNIQV9DVFggKmN0eCkgeworICBpbnQgaTsKKworICBjdHgtPmxlblcgPSAwOworICBjdHgtPnNpemVIaSA9IGN0eC0+c2l6ZUxvID0gMDsKKworICAvKiBJbml0aWFsaXplIEggd2l0aCB0aGUgbWFnaWMgY29uc3RhbnRzIChzZWUgRklQUzE4MCBmb3IgY29uc3RhbnRzKQorICAgKi8KKyAgY3R4LT5IWzBdID0gMHg2NzQ1MjMwMTsKKyAgY3R4LT5IWzFdID0gMHhlZmNkYWI4OTsKKyAgY3R4LT5IWzJdID0gMHg5OGJhZGNmZTsKKyAgY3R4LT5IWzNdID0gMHgxMDMyNTQ3NjsKKyAgY3R4LT5IWzRdID0gMHhjM2QyZTFmMDsKKworICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykKKyAgICBjdHgtPldbaV0gPSAwOworfQorCisKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICpfZGF0YUluLCBpbnQgbGVuKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFJbiA9IF9kYXRhSW47CisgIGludCBpOworCisgIC8qIFJlYWQgdGhlIGRhdGEgaW50byBXIGFuZCBwcm9jZXNzIGJsb2NrcyBhcyB0aGV5IGdldCBmdWxsCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBjdHgtPldbY3R4LT5sZW5XIC8gNF0gPDw9IDg7CisgICAgY3R4LT5XW2N0eC0+bGVuVyAvIDRdIHw9ICh1bnNpZ25lZCBpbnQpZGF0YUluW2ldOworICAgIGlmICgoKytjdHgtPmxlblcpICUgNjQgPT0gMCkgeworICAgICAgc2hhSGFzaEJsb2NrKGN0eCk7CisgICAgICBjdHgtPmxlblcgPSAwOworICAgIH0KKyAgICBjdHgtPnNpemVMbyArPSA4OworICAgIGN0eC0+c2l6ZUhpICs9IChjdHgtPnNpemVMbyA8IDgpOworICB9Cit9CisKKwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgaGFzaG91dFsyMF0sIFNIQV9DVFggKmN0eCkgeworICB1bnNpZ25lZCBjaGFyIHBhZDB4ODAgPSAweDgwOworICB1bnNpZ25lZCBjaGFyIHBhZDB4MDAgPSAweDAwOworICB1bnNpZ25lZCBjaGFyIHBhZGxlbls4XTsKKyAgaW50IGk7CisKKyAgLyogUGFkIHdpdGggYSBiaW5hcnkgMSAoZS5nLiAweDgwKSwgdGhlbiB6ZXJvZXMsIHRoZW4gbGVuZ3RoCisgICAqLworICBwYWRsZW5bMF0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUhpID4+IDI0KSAmIDI1NSk7CisgIHBhZGxlblsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gMTYpICYgMjU1KTsKKyAgcGFkbGVuWzJdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVIaSA+PiA4KSAmIDI1NSk7CisgIHBhZGxlblszXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gMCkgJiAyNTUpOworICBwYWRsZW5bNF0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUxvID4+IDI0KSAmIDI1NSk7CisgIHBhZGxlbls1XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gMTYpICYgMjU1KTsKKyAgcGFkbGVuWzZdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVMbyA+PiA4KSAmIDI1NSk7CisgIHBhZGxlbls3XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gMCkgJiAyNTUpOworICBTSEExX1VwZGF0ZShjdHgsICZwYWQweDgwLCAxKTsKKyAgd2hpbGUgKGN0eC0+bGVuVyAhPSA1NikKKyAgICBTSEExX1VwZGF0ZShjdHgsICZwYWQweDAwLCAxKTsKKyAgU0hBMV9VcGRhdGUoY3R4LCBwYWRsZW4sIDgpOworCisgIC8qIE91dHB1dCBoYXNoCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIGhhc2hvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoY3R4LT5IW2kgLyA0XSA+PiAyNCk7CisgICAgY3R4LT5IW2kgLyA0XSA8PD0gODsKKyAgfQorCisgIC8qCisgICAqICBSZS1pbml0aWFsaXplIHRoZSBjb250ZXh0IChhbHNvIHplcm9pemVzIGNvbnRlbnRzKQorICAgKi8KKyAgU0hBMV9Jbml0KGN0eCk7Cit9CisKKworI2RlZmluZSBTSEFfUk9UKFgsbikgKCgoWCkgPDwgKG4pKSB8ICgoWCkgPj4gKDMyLShuKSkpKQorCitzdGF0aWMgdm9pZCBzaGFIYXNoQmxvY2soU0hBX0NUWCAqY3R4KSB7CisgIGludCB0OworICB1bnNpZ25lZCBpbnQgQSxCLEMsRCxFLFRFTVA7CisKKyAgZm9yICh0ID0gMTY7IHQgPD0gNzk7IHQrKykKKyAgICBjdHgtPldbdF0gPQorICAgICAgU0hBX1JPVChjdHgtPldbdC0zXSBeIGN0eC0+V1t0LThdIF4gY3R4LT5XW3QtMTRdIF4gY3R4LT5XW3QtMTZdLCAxKTsKKworICBBID0gY3R4LT5IWzBdOworICBCID0gY3R4LT5IWzFdOworICBDID0gY3R4LT5IWzJdOworICBEID0gY3R4LT5IWzNdOworICBFID0gY3R4LT5IWzRdOworCisgIGZvciAodCA9IDA7IHQgPD0gMTk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoKChDXkQpJkIpXkQpICAgICArIEUgKyBjdHgtPldbdF0gKyAweDVhODI3OTk5OworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gMjA7IHQgPD0gMzk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoQl5DXkQpICAgICAgICAgICArIEUgKyBjdHgtPldbdF0gKyAweDZlZDllYmExOworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gNDA7IHQgPD0gNTk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoKEImQyl8KEQmKEJ8QykpKSArIEUgKyBjdHgtPldbdF0gKyAweDhmMWJiY2RjOworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gNjA7IHQgPD0gNzk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoQl5DXkQpICAgICAgICAgICArIEUgKyBjdHgtPldbdF0gKyAweGNhNjJjMWQ2OworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKworICBjdHgtPkhbMF0gKz0gQTsKKyAgY3R4LT5IWzFdICs9IEI7CisgIGN0eC0+SFsyXSArPSBDOworICBjdHgtPkhbM10gKz0gRDsKKyAgY3R4LT5IWzRdICs9IEU7Cit9CisKZGlmZiAtLWdpdCBhL21vemlsbGEtc2hhMS9zaGExLmggYi9tb3ppbGxhLXNoYTEvc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODJhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tb3ppbGxhLXNoYTEvc2hhMS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIAorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAqIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICogCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgU0hBIDE4MC0xIEhlYWRlciBGaWxlCisgKiAKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBQYXVsIEtvY2hlciBvZgorICogQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLiAgUG9ydGlvbnMgY3JlYXRlZCBieSBQYXVsIEtvY2hlciBhcmUgCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtOSBieSBDcnlwdG9ncmFwaHkgUmVzZWFyY2gsIEluYy4gIEFsbAorICogUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiAgICAgUGF1bCBLb2NoZXIKKyAqIAorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZQorICogIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgCisgKiBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8KKyAqIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLAorICogaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkKKyAqIHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQKKyAqIG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUKKyAqIEdQTC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBIWzVdOworICB1bnNpZ25lZCBpbnQgV1s4MF07CisgIGludCBsZW5XOworICB1bnNpZ25lZCBpbnQgc2l6ZUhpLHNpemVMbzsKK30gU0hBX0NUWDsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqY3R4KTsKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhSW4sIGludCBsZW4pOwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgaGFzaG91dFsyMF0sIFNIQV9DVFggKmN0eCk7CmRpZmYgLS1naXQgYS9vYmplY3QtcmVmcy5jIGIvb2JqZWN0LXJlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJlOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0LXJlZnMuYwpAQCAtMCwwICsxLDg5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJkZWNvcmF0ZS5oIgorCitpbnQgdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCitzdGF0aWMgc3RydWN0IGRlY29yYXRpb24gcmVmX2RlY29yYXRlOworCitzdHJ1Y3Qgb2JqZWN0X3JlZnMgKmxvb2t1cF9vYmplY3RfcmVmcyhzdHJ1Y3Qgb2JqZWN0ICpiYXNlKQoreworCXJldHVybiBsb29rdXBfZGVjb3JhdGlvbigmcmVmX2RlY29yYXRlLCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgYWRkX29iamVjdF9yZWZzKHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IG9iamVjdF9yZWZzICpyZWZzKQoreworCWlmIChhZGRfZGVjb3JhdGlvbigmcmVmX2RlY29yYXRlLCBvYmosIHJlZnMpKQorCQlkaWUoIm9iamVjdCAlcyB0cmllZCB0byBhZGQgcmVmcyB0d2ljZSEiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKK30KKworc3RydWN0IG9iamVjdF9yZWZzICphbGxvY19vYmplY3RfcmVmcyh1bnNpZ25lZCBjb3VudCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnM7CisJc2l6ZV90IHNpemUgPSBzaXplb2YoKnJlZnMpICsgY291bnQqc2l6ZW9mKHN0cnVjdCBvYmplY3QgKik7CisKKwlyZWZzID0geGNhbGxvYygxLCBzaXplKTsKKwlyZWZzLT5jb3VudCA9IGNvdW50OworCXJldHVybiByZWZzOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfb2JqZWN0X3BvaW50ZXJzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IG9iamVjdCAqIGNvbnN0ICpwYSA9IGE7CisJY29uc3Qgc3RydWN0IG9iamVjdCAqIGNvbnN0ICpwYiA9IGI7CisJaWYgKCpwYSA9PSAqcGIpCisJCXJldHVybiAwOworCWVsc2UgaWYgKCpwYSA8ICpwYikKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3ZvaWQgc2V0X29iamVjdF9yZWZzKHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IG9iamVjdF9yZWZzICpyZWZzKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisJLyogRG8gbm90IGluc3RhbGwgZW1wdHkgbGlzdCBvZiByZWZlcmVuY2VzICovCisJaWYgKHJlZnMtPmNvdW50IDwgMSkgeworCQlmcmVlKHJlZnMpOworCQlyZXR1cm47CisJfQorCisJLyogU29ydCB0aGUgbGlzdCBhbmQgZmlsdGVyIG91dCBkdXBsaWNhdGVzICovCisJcXNvcnQocmVmcy0+cmVmLCByZWZzLT5jb3VudCwgc2l6ZW9mKHJlZnMtPnJlZlswXSksCisJICAgICAgY29tcGFyZV9vYmplY3RfcG9pbnRlcnMpOworCWZvciAoaSA9IGogPSAxOyBpIDwgcmVmcy0+Y291bnQ7IGkrKykgeworCQlpZiAocmVmcy0+cmVmW2ldICE9IHJlZnMtPnJlZltpIC0gMV0pCisJCQlyZWZzLT5yZWZbaisrXSA9IHJlZnMtPnJlZltpXTsKKwl9CisJaWYgKGogPCByZWZzLT5jb3VudCkgeworCQkvKiBEdXBsaWNhdGVzIHdlcmUgZm91bmQgLSByZWFsbG9jYXRlIGxpc3QgKi8KKwkJc2l6ZV90IHNpemUgPSBzaXplb2YoKnJlZnMpICsgaipzaXplb2Yoc3RydWN0IG9iamVjdCAqKTsKKwkJcmVmcy0+Y291bnQgPSBqOworCQlyZWZzID0geHJlYWxsb2MocmVmcywgc2l6ZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJlZnMtPmNvdW50OyBpKyspCisJCXJlZnMtPnJlZltpXS0+dXNlZCA9IDE7CisJYWRkX29iamVjdF9yZWZzKG9iaiwgcmVmcyk7Cit9CisKK3ZvaWQgbWFya19yZWFjaGFibGUoc3RydWN0IG9iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwljb25zdCBzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnM7CisKKwlpZiAoIXRyYWNrX29iamVjdF9yZWZzKQorCQlkaWUoImNhbm5vdCBkbyByZWFjaGFiaWxpdHkgd2l0aCBvYmplY3QgcmVmcyB0dXJuZWQgb2ZmIik7CisJLyogSWYgd2UndmUgYmVlbiBoZXJlIGFscmVhZHksIGRvbid0IGJvdGhlciAqLworCWlmIChvYmotPmZsYWdzICYgbWFzaykKKwkJcmV0dXJuOworCW9iai0+ZmxhZ3MgfD0gbWFzazsKKwlyZWZzID0gbG9va3VwX29iamVjdF9yZWZzKG9iaik7CisJaWYgKHJlZnMpIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHJlZnMtPmNvdW50OyBpKyspCisJCQltYXJrX3JlYWNoYWJsZShyZWZzLT5yZWZbaV0sIG1hc2spOworCX0KK30KKworCmRpZmYgLS1naXQgYS9vYmplY3QuYyBiL29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzkzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmplY3QuYwpAQCAtMCwwICsxLDI1NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworc3RhdGljIHN0cnVjdCBvYmplY3QgKipvYmpfaGFzaDsKK3N0YXRpYyBpbnQgbnJfb2Jqcywgb2JqX2hhc2hfc2l6ZTsKKwordW5zaWduZWQgaW50IGdldF9tYXhfb2JqZWN0X2luZGV4KHZvaWQpCit7CisJcmV0dXJuIG9ial9oYXNoX3NpemU7Cit9CisKK3N0cnVjdCBvYmplY3QgKmdldF9pbmRleGVkX29iamVjdCh1bnNpZ25lZCBpbnQgaWR4KQoreworCXJldHVybiBvYmpfaGFzaFtpZHhdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqb2JqZWN0X3R5cGVfc3RyaW5nc1tdID0geworCU5VTEwsCQkvKiBPQkpfTk9ORSA9IDAgKi8KKwkiY29tbWl0IiwJLyogT0JKX0NPTU1JVCA9IDEgKi8KKwkidHJlZSIsCQkvKiBPQkpfVFJFRSA9IDIgKi8KKwkiYmxvYiIsCQkvKiBPQkpfQkxPQiA9IDMgKi8KKwkidGFnIiwJCS8qIE9CSl9UQUcgPSA0ICovCit9OworCitjb25zdCBjaGFyICp0eXBlbmFtZSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKG9iamVjdF90eXBlX3N0cmluZ3MpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gb2JqZWN0X3R5cGVfc3RyaW5nc1t0eXBlXTsKK30KKworaW50IHR5cGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUob2JqZWN0X3R5cGVfc3RyaW5ncyk7IGkrKykKKwkJaWYgKCFzdHJjbXAoc3RyLCBvYmplY3RfdHlwZV9zdHJpbmdzW2ldKSkKKwkJCXJldHVybiBpOworCWRpZSgiaW52YWxpZCBvYmplY3QgdHlwZSBcIiVzXCIiLCBzdHIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfb2JqKHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGhhc2ggPSAqKHVuc2lnbmVkIGludCAqKW9iai0+c2hhMTsKKwlyZXR1cm4gaGFzaCAlIG47Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9vYmpfaGFzaChzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3QgKipoYXNoLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgaiA9IGhhc2hfb2JqKG9iaiwgc2l6ZSk7CisKKwl3aGlsZSAoaGFzaFtqXSkgeworCQlqKys7CisJCWlmIChqID49IHNpemUpCisJCQlqID0gMDsKKwl9CisJaGFzaFtqXSA9IG9iajsKK30KKworc3RhdGljIGludCBoYXNodGFibGVfaW5kZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwltZW1jcHkoJmksIHNoYTEsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlyZXR1cm4gKGludCkoaSAlIG9ial9oYXNoX3NpemUpOworfQorCitzdHJ1Y3Qgb2JqZWN0ICpsb29rdXBfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJaWYgKCFvYmpfaGFzaCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpID0gaGFzaHRhYmxlX2luZGV4KHNoYTEpOworCXdoaWxlICgob2JqID0gb2JqX2hhc2hbaV0pICE9IE5VTEwpIHsKKwkJaWYgKCFoYXNoY21wKHNoYTEsIG9iai0+c2hhMSkpCisJCQlicmVhazsKKwkJaSsrOworCQlpZiAoaSA9PSBvYmpfaGFzaF9zaXplKQorCQkJaSA9IDA7CisJfQorCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkIGdyb3dfb2JqZWN0X2hhc2godm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgbmV3X2hhc2hfc2l6ZSA9IG9ial9oYXNoX3NpemUgPCAzMiA/IDMyIDogMiAqIG9ial9oYXNoX3NpemU7CisJc3RydWN0IG9iamVjdCAqKm5ld19oYXNoOworCisJbmV3X2hhc2ggPSB4Y2FsbG9jKG5ld19oYXNoX3NpemUsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopKTsKKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2hhc2hfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IG9ial9oYXNoW2ldOworCQlpZiAoIW9iaikKKwkJCWNvbnRpbnVlOworCQlpbnNlcnRfb2JqX2hhc2gob2JqLCBuZXdfaGFzaCwgbmV3X2hhc2hfc2l6ZSk7CisJfQorCWZyZWUob2JqX2hhc2gpOworCW9ial9oYXNoID0gbmV3X2hhc2g7CisJb2JqX2hhc2hfc2l6ZSA9IG5ld19oYXNoX3NpemU7Cit9CisKK3ZvaWQgKmNyZWF0ZV9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHR5cGUsIHZvaWQgKm8pCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbzsKKworCW9iai0+cGFyc2VkID0gMDsKKwlvYmotPnVzZWQgPSAwOworCW9iai0+dHlwZSA9IHR5cGU7CisJb2JqLT5mbGFncyA9IDA7CisJaGFzaGNweShvYmotPnNoYTEsIHNoYTEpOworCisJaWYgKG9ial9oYXNoX3NpemUgLSAxIDw9IG5yX29ianMgKiAyKQorCQlncm93X29iamVjdF9oYXNoKCk7CisKKwlpbnNlcnRfb2JqX2hhc2gob2JqLCBvYmpfaGFzaCwgb2JqX2hhc2hfc2l6ZSk7CisJbnJfb2JqcysrOworCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCW9iaiA9IGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX05PTkUsIGFsbG9jX29iamVjdF9ub2RlKCkpOworCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKnBhcnNlX29iamVjdF9idWZmZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmJ1ZmZlciwgaW50ICplYXRlbl9wKQoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpbnQgZWF0ZW4gPSAwOworCisJaWYgKHR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJc3RydWN0IGJsb2IgKmJsb2IgPSBsb29rdXBfYmxvYihzaGExKTsKKwkJcGFyc2VfYmxvYl9idWZmZXIoYmxvYiwgYnVmZmVyLCBzaXplKTsKKwkJb2JqID0gJmJsb2ItPm9iamVjdDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJc3RydWN0IHRyZWUgKnRyZWUgPSBsb29rdXBfdHJlZShzaGExKTsKKwkJb2JqID0gJnRyZWUtPm9iamVjdDsKKwkJaWYgKCF0cmVlLT5vYmplY3QucGFyc2VkKSB7CisJCQlwYXJzZV90cmVlX2J1ZmZlcih0cmVlLCBidWZmZXIsIHNpemUpOworCQkJZWF0ZW4gPSAxOworCQl9CisJfSBlbHNlIGlmICh0eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwkJcGFyc2VfY29tbWl0X2J1ZmZlcihjb21taXQsIGJ1ZmZlciwgc2l6ZSk7CisJCWlmICghY29tbWl0LT5idWZmZXIpIHsKKwkJCWNvbW1pdC0+YnVmZmVyID0gYnVmZmVyOworCQkJZWF0ZW4gPSAxOworCQl9CisJCW9iaiA9ICZjb21taXQtPm9iamVjdDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gT0JKX1RBRykgeworCQlzdHJ1Y3QgdGFnICp0YWcgPSBsb29rdXBfdGFnKHNoYTEpOworCQlwYXJzZV90YWdfYnVmZmVyKHRhZywgYnVmZmVyLCBzaXplKTsKKwkJb2JqID0gJnRhZy0+b2JqZWN0OworCX0gZWxzZSB7CisJCXdhcm5pbmcoIm9iamVjdCAlcyBoYXMgdW5rbm93biB0eXBlIGlkICVkXG4iLCBzaGExX3RvX2hleChzaGExKSwgdHlwZSk7CisJCW9iaiA9IE5VTEw7CisJfQorCWlmIChvYmogJiYgb2JqLT50eXBlID09IE9CSl9OT05FKQorCQlvYmotPnR5cGUgPSB0eXBlOworCSplYXRlbl9wID0gZWF0ZW47CisJcmV0dXJuIG9iajsKK30KKworc3RydWN0IG9iamVjdCAqcGFyc2Vfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlpbnQgZWF0ZW47CisJdm9pZCAqYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKworCWlmIChidWZmZXIpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqOworCQlpZiAoY2hlY2tfc2hhMV9zaWduYXR1cmUoc2hhMSwgYnVmZmVyLCBzaXplLCB0eXBlbmFtZSh0eXBlKSkgPCAwKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQllcnJvcigic2hhMSBtaXNtYXRjaCAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlvYmogPSBwYXJzZV9vYmplY3RfYnVmZmVyKHNoYTEsIHR5cGUsIHNpemUsIGJ1ZmZlciwgJmVhdGVuKTsKKwkJaWYgKCFlYXRlbikKKwkJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIG9iajsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBvYmplY3RfbGlzdCAqb2JqZWN0X2xpc3RfaW5zZXJ0KHN0cnVjdCBvYmplY3QgKml0ZW0sCisJCQkJICAgICAgIHN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm5ld19saXN0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisgICAgICAgIG5ld19saXN0LT5pdGVtID0gaXRlbTsKKyAgICAgICAgbmV3X2xpc3QtPm5leHQgPSAqbGlzdF9wOworICAgICAgICAqbGlzdF9wID0gbmV3X2xpc3Q7CisgICAgICAgIHJldHVybiBuZXdfbGlzdDsKK30KKwordm9pZCBvYmplY3RfbGlzdF9hcHBlbmQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCXN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCkKK3sKKwl3aGlsZSAoKmxpc3RfcCkgeworCQlsaXN0X3AgPSAmKCgqbGlzdF9wKS0+bmV4dCk7CisJfQorCSpsaXN0X3AgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2xpc3QpKTsKKwkoKmxpc3RfcCktPm5leHQgPSBOVUxMOworCSgqbGlzdF9wKS0+aXRlbSA9IGl0ZW07Cit9CisKK3Vuc2lnbmVkIG9iamVjdF9saXN0X2xlbmd0aChzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QpCit7CisJdW5zaWduZWQgcmV0ID0gMDsKKwl3aGlsZSAobGlzdCkgeworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJcmV0Kys7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBvYmplY3RfbGlzdF9jb250YWlucyhzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QsIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAobGlzdC0+aXRlbSA9PSBvYmopCisJCQlyZXR1cm4gMTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGFkZF9vYmplY3RfYXJyYXkoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSkKK3sKKwlhZGRfb2JqZWN0X2FycmF5X3dpdGhfbW9kZShvYmosIG5hbWUsIGFycmF5LCBTX0lGSU5WQUxJRCk7Cit9CisKK3ZvaWQgYWRkX29iamVjdF9hcnJheV93aXRoX21vZGUoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSwgdW5zaWduZWQgbW9kZSkKK3sKKwl1bnNpZ25lZCBuciA9IGFycmF5LT5ucjsKKwl1bnNpZ25lZCBhbGxvYyA9IGFycmF5LT5hbGxvYzsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvYmplY3RzID0gYXJyYXktPm9iamVjdHM7CisKKwlpZiAobnIgPj0gYWxsb2MpIHsKKwkJYWxsb2MgPSAoYWxsb2MgKyAzMikgKiAyOworCQlvYmplY3RzID0geHJlYWxsb2Mob2JqZWN0cywgYWxsb2MgKiBzaXplb2YoKm9iamVjdHMpKTsKKwkJYXJyYXktPmFsbG9jID0gYWxsb2M7CisJCWFycmF5LT5vYmplY3RzID0gb2JqZWN0czsKKwl9CisJb2JqZWN0c1tucl0uaXRlbSA9IG9iajsKKwlvYmplY3RzW25yXS5uYW1lID0gbmFtZTsKKwlvYmplY3RzW25yXS5tb2RlID0gbW9kZTsKKwlhcnJheS0+bnIgPSArK25yOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0LmggYi9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYxOWVlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0LmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBPQkpFQ1RfSAorI2RlZmluZSBPQkpFQ1RfSAorCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgeworCXN0cnVjdCBvYmplY3QgKml0ZW07CisJc3RydWN0IG9iamVjdF9saXN0ICpuZXh0OworfTsKKworc3RydWN0IG9iamVjdF9yZWZzIHsKKwl1bnNpZ25lZCBjb3VudDsKKwlzdHJ1Y3Qgb2JqZWN0ICpyZWZbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBvYmplY3RfYXJyYXkgeworCXVuc2lnbmVkIGludCBucjsKKwl1bnNpZ25lZCBpbnQgYWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSB7CisJCXN0cnVjdCBvYmplY3QgKml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIG1vZGU7CisJfSAqb2JqZWN0czsKK307CisKKyNkZWZpbmUgVFlQRV9CSVRTICAgMworI2RlZmluZSBGTEFHX0JJVFMgIDI3CisKKy8qCisgKiBUaGUgb2JqZWN0IHR5cGUgaXMgc3RvcmVkIGluIDMgYml0cy4KKyAqLworc3RydWN0IG9iamVjdCB7CisJdW5zaWduZWQgcGFyc2VkIDogMTsKKwl1bnNpZ25lZCB1c2VkIDogMTsKKwl1bnNpZ25lZCB0eXBlIDogVFlQRV9CSVRTOworCXVuc2lnbmVkIGZsYWdzIDogRkxBR19CSVRTOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitleHRlcm4gaW50IHRyYWNrX29iamVjdF9yZWZzOworCitleHRlcm4gY29uc3QgY2hhciAqdHlwZW5hbWUodW5zaWduZWQgaW50IHR5cGUpOworZXh0ZXJuIGludCB0eXBlX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X21heF9vYmplY3RfaW5kZXgodm9pZCk7CitleHRlcm4gc3RydWN0IG9iamVjdCAqZ2V0X2luZGV4ZWRfb2JqZWN0KHVuc2lnbmVkIGludCk7CitleHRlcm4gc3RydWN0IG9iamVjdF9yZWZzICpsb29rdXBfb2JqZWN0X3JlZnMoc3RydWN0IG9iamVjdCAqKTsKKworLyoqIEludGVybmFsIG9ubHkgKiovCitzdHJ1Y3Qgb2JqZWN0ICpsb29rdXBfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitleHRlcm4gdm9pZCAqY3JlYXRlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgdHlwZSwgdm9pZCAqb2JqKTsKKworLyoqIFJldHVybnMgdGhlIG9iamVjdCwgaGF2aW5nIHBhcnNlZCBpdCB0byBmaW5kIG91dCB3aGF0IGl0IGlzLiAqKi8KK3N0cnVjdCBvYmplY3QgKnBhcnNlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyogR2l2ZW4gdGhlIHJlc3VsdCBvZiByZWFkX3NoYTFfZmlsZSgpLCByZXR1cm5zIHRoZSBvYmplY3QgYWZ0ZXIKKyAqIHBhcnNpbmcgaXQuICBlYXRlbl9wIGluZGljYXRlcyBpZiB0aGUgb2JqZWN0IGhhcyBhIGJvcnJvd2VkIGNvcHkKKyAqIG9mIGJ1ZmZlciBhbmQgdGhlIGNhbGxlciBzaG91bGQgbm90IGZyZWUoKSBpdC4KKyAqLworc3RydWN0IG9iamVjdCAqcGFyc2Vfb2JqZWN0X2J1ZmZlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqYnVmZmVyLCBpbnQgKmVhdGVuX3ApOworCisvKiogUmV0dXJucyB0aGUgb2JqZWN0LCB3aXRoIHBvdGVudGlhbGx5IGV4Y2VzcyBtZW1vcnkgYWxsb2NhdGVkLiAqKi8KK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCAgY2hhciAqc2hhMSk7CisKK3N0cnVjdCBvYmplY3RfcmVmcyAqYWxsb2Nfb2JqZWN0X3JlZnModW5zaWduZWQgY291bnQpOwordm9pZCBzZXRfb2JqZWN0X3JlZnMoc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnMpOworCit2b2lkIG1hcmtfcmVhY2hhYmxlKHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IG1hc2spOworCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm9iamVjdF9saXN0X2luc2VydChzdHJ1Y3Qgb2JqZWN0ICppdGVtLCAKKwkJCQkgICAgICAgc3RydWN0IG9iamVjdF9saXN0ICoqbGlzdF9wKTsKKwordm9pZCBvYmplY3RfbGlzdF9hcHBlbmQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCXN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCk7CisKK3Vuc2lnbmVkIG9iamVjdF9saXN0X2xlbmd0aChzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QpOworCitpbnQgb2JqZWN0X2xpc3RfY29udGFpbnMoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0LCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCisvKiBPYmplY3QgYXJyYXkgaGFuZGxpbmcgLi4gKi8KK3ZvaWQgYWRkX29iamVjdF9hcnJheShzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvYmplY3RfYXJyYXkgKmFycmF5KTsKK3ZvaWQgYWRkX29iamVjdF9hcnJheV93aXRoX21vZGUoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSwgdW5zaWduZWQgbW9kZSk7CisKKyNlbmRpZiAvKiBPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvcGFjay1jaGVjay5jIGIvcGFjay1jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDUzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLWNoZWNrLmMKQEAgLTAsMCArMSwxNjQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhY2suaCIKKworc3RhdGljIGludCB2ZXJpZnlfcGFja2ZpbGUoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycykKK3sKKwlvZmZfdCBpbmRleF9zaXplID0gcC0+aW5kZXhfc2l6ZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleF9iYXNlID0gcC0+aW5kZXhfZGF0YTsKKwlTSEFfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCW9mZl90IG9mZnNldCA9IDAsIHBhY2tfc2lnID0gcC0+cGFja19zaXplIC0gMjA7CisJdWludDMyX3QgbnJfb2JqZWN0cywgaTsKKwlpbnQgZXJyOworCisJLyogTm90ZSB0aGF0IHRoZSBwYWNrIGhlYWRlciBjaGVja3MgYXJlIGFjdHVhbGx5IHBlcmZvcm1lZCBieQorCSAqIHVzZV9wYWNrIHdoZW4gaXQgZmlyc3Qgb3BlbnMgdGhlIHBhY2sgZmlsZS4gIElmIGFueXRoaW5nCisJICogZ29lcyB3cm9uZyBkdXJpbmcgdGhvc2UgY2hlY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBkaWUgb3V0CisJICogaW1tZWRpYXRlbHkuCisJICovCisKKwlTSEExX0luaXQoJmN0eCk7CisJd2hpbGUgKG9mZnNldCA8IHBhY2tfc2lnKSB7CisJCXVuc2lnbmVkIGludCByZW1haW5pbmc7CisJCXVuc2lnbmVkIGNoYXIgKmluID0gdXNlX3BhY2socCwgd19jdXJzLCBvZmZzZXQsICZyZW1haW5pbmcpOworCQlvZmZzZXQgKz0gcmVtYWluaW5nOworCQlpZiAob2Zmc2V0ID4gcGFja19zaWcpCisJCQlyZW1haW5pbmcgLT0gKHVuc2lnbmVkIGludCkob2Zmc2V0IC0gcGFja19zaWcpOworCQlTSEExX1VwZGF0ZSgmY3R4LCBpbiwgcmVtYWluaW5nKTsKKwl9CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlpZiAoaGFzaGNtcChzaGExLCB1c2VfcGFjayhwLCB3X2N1cnMsIHBhY2tfc2lnLCBOVUxMKSkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGl0c2VsZiIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisJaWYgKGhhc2hjbXAoc2hhMSwgaW5kZXhfYmFzZSArIGluZGV4X3NpemUgLSA0MCkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGlkeCIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisJdW51c2VfcGFjayh3X2N1cnMpOworCisJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gaWR4IGlzIHZhbGlkLiAgU2luY2Ugd2UKKwkgKiBoYXZlIHZlcmlmaWVkIHRoYXQgbnJfb2JqZWN0cyBtYXRjaGVzIGJldHdlZW4gaWR4IGFuZCBwYWNrLAorCSAqIHdlIGRvIG5vdCBkbyBzY2FuLXN0cmVhbWluZyBjaGVjayBvbiB0aGUgcGFjayBmaWxlLgorCSAqLworCW5yX29iamVjdHMgPSBwLT5udW1fb2JqZWN0czsKKwlmb3IgKGkgPSAwLCBlcnIgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisJCXZvaWQgKmRhdGE7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQlvZmZfdCBvZmZzZXQ7CisKKwkJc2hhMSA9IG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSk7CisJCWlmICghc2hhMSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBudGgtcGFja2VkLW9iamVjdCIpOworCQlvZmZzZXQgPSBmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsIHApOworCQlpZiAoIW9mZnNldCkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisJCWRhdGEgPSB1bnBhY2tfZW50cnkocCwgb2Zmc2V0LCAmdHlwZSwgJnNpemUpOworCQlpZiAoIWRhdGEpIHsKKwkJCWVyciA9IGVycm9yKCJjYW5ub3QgdW5wYWNrICVzIGZyb20gJXMiLAorCQkJCSAgICBzaGExX3RvX2hleChzaGExKSwgcC0+cGFja19uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaGVja19zaGExX3NpZ25hdHVyZShzaGExLCBkYXRhLCBzaXplLCB0eXBlbmFtZSh0eXBlKSkpIHsKKwkJCWVyciA9IGVycm9yKCJwYWNrZWQgJXMgZnJvbSAlcyBpcyBjb3JydXB0IiwKKwkJCQkgICAgc2hhMV90b19oZXgoc2hhMSksIHAtPnBhY2tfbmFtZSk7CisJCQlmcmVlKGRhdGEpOworCQkJY29udGludWU7CisJCX0KKwkJZnJlZShkYXRhKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKyNkZWZpbmUgTUFYX0NIQUlOIDQwCisKK3N0YXRpYyB2b2lkIHNob3dfcGFja19pbmZvKHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVpbnQzMl90IG5yX29iamVjdHMsIGksIGNoYWluX2hpc3RvZ3JhbVtNQVhfQ0hBSU5dOworCisJbnJfb2JqZWN0cyA9IHAtPm51bV9vYmplY3RzOworCW1lbXNldChjaGFpbl9oaXN0b2dyYW0sIDAsIHNpemVvZihjaGFpbl9oaXN0b2dyYW0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCQljb25zdCBjaGFyICp0eXBlOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCXVuc2lnbmVkIGxvbmcgc3RvcmVfc2l6ZTsKKwkJb2ZmX3Qgb2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgZGVsdGFfY2hhaW5fbGVuZ3RoOworCisJCXNoYTEgPSBudGhfcGFja2VkX29iamVjdF9zaGExKHAsIGkpOworCQlpZiAoIXNoYTEpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCBwKTsKKwkJaWYgKCFvZmZzZXQpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgZmluZC1wYWNrLWVudHJ5LW9uZSIpOworCisJCXR5cGUgPSBwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHAsIG9mZnNldCwgJnNpemUsICZzdG9yZV9zaXplLAorCQkJCQkJICZkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkJCQkgYmFzZV9zaGExKTsKKwkJcHJpbnRmKCIlcyAiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICghZGVsdGFfY2hhaW5fbGVuZ3RoKQorCQkJcHJpbnRmKCIlLTZzICVsdSAlIlBSSXVNQVgiXG4iLAorCQkJICAgICAgIHR5cGUsIHNpemUsICh1aW50bWF4X3Qpb2Zmc2V0KTsKKwkJZWxzZSB7CisJCQlwcmludGYoIiUtNnMgJWx1ICUiUFJJdU1BWCIgJXUgJXNcbiIsCisJCQkgICAgICAgdHlwZSwgc2l6ZSwgKHVpbnRtYXhfdClvZmZzZXQsCisJCQkgICAgICAgZGVsdGFfY2hhaW5fbGVuZ3RoLCBzaGExX3RvX2hleChiYXNlX3NoYTEpKTsKKwkJCWlmIChkZWx0YV9jaGFpbl9sZW5ndGggPCBNQVhfQ0hBSU4pCisJCQkJY2hhaW5faGlzdG9ncmFtW2RlbHRhX2NoYWluX2xlbmd0aF0rKzsKKwkJCWVsc2UKKwkJCQljaGFpbl9oaXN0b2dyYW1bMF0rKzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBSU47IGkrKykgeworCQlpZiAoIWNoYWluX2hpc3RvZ3JhbVtpXSkKKwkJCWNvbnRpbnVlOworCQlwcmludGYoImNoYWluIGxlbmd0aCAlcyAlZDogJWQgb2JqZWN0JXNcbiIsCisJCSAgICAgICBpID8gIj0iIDogIj49IiwKKwkJICAgICAgIGkgPyBpIDogTUFYX0NIQUlOLAorCQkgICAgICAgY2hhaW5faGlzdG9ncmFtW2ldLAorCQkgICAgICAgMSA8IGNoYWluX2hpc3RvZ3JhbVtpXSA/ICJzIiA6ICIiKTsKKwl9Cit9CisKK2ludCB2ZXJpZnlfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgaW50IHZlcmJvc2UpCit7CisJb2ZmX3QgaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXhfYmFzZSA9IHAtPmluZGV4X2RhdGE7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmV0OworCisJcmV0ID0gMDsKKwkvKiBWZXJpZnkgU0hBMSBzdW0gb2YgdGhlIGluZGV4IGZpbGUgKi8KKwlTSEExX0luaXQoJmN0eCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgaW5kZXhfYmFzZSwgKHVuc2lnbmVkIGludCkoaW5kZXhfc2l6ZSAtIDIwKSk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlpZiAoaGFzaGNtcChzaGExLCBpbmRleF9iYXNlICsgaW5kZXhfc2l6ZSAtIDIwKSkKKwkJcmV0ID0gZXJyb3IoIlBhY2tmaWxlIGluZGV4IGZvciAlcyBTSEExIG1pc21hdGNoIiwKKwkJCSAgICBwLT5wYWNrX25hbWUpOworCisJaWYgKCFyZXQpIHsKKwkJLyogVmVyaWZ5IHBhY2sgZmlsZSAqLworCQlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJCXJldCA9IHZlcmlmeV9wYWNrZmlsZShwLCAmd19jdXJzKTsKKwkJdW51c2VfcGFjaygmd19jdXJzKTsKKwl9CisKKwlpZiAodmVyYm9zZSkgeworCQlpZiAocmV0KQorCQkJcHJpbnRmKCIlczogYmFkXG4iLCBwLT5wYWNrX25hbWUpOworCQllbHNlIHsKKwkJCXNob3dfcGFja19pbmZvKHApOworCQkJcHJpbnRmKCIlczogb2tcbiIsIHAtPnBhY2tfbmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvcGFjay1yZWR1bmRhbnQuYyBiL3BhY2stcmVkdW5kYW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNzdlMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2stcmVkdW5kYW50LmMKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisqCisqIENvcHlyaWdodCAyMDA1LCBMdWthcyBTYW5kc3Ryb20gPGx1a2Fzc0BldGVrLmNoYWxtZXJzLnNlPgorKgorKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KKyoKKyovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIEJMS1NJWkUgNTEyCisKK3N0YXRpYyBjb25zdCBjaGFyIHBhY2tfcmVkdW5kYW50X3VzYWdlW10gPQorImdpdC1wYWNrLXJlZHVuZGFudCBbIC0tdmVyYm9zZSBdIFsgLS1hbHQtb2RiIF0gPCAtLWFsbCB8IDwucGFjayBmaWxlbmFtZT4gLi4uPiI7CisKK3N0YXRpYyBpbnQgbG9hZF9hbGxfcGFja3MsIHZlcmJvc2UsIGFsdF9vZGI7CisKK3N0cnVjdCBsbGlzdF9pdGVtIHsKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV4dDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworfTsKK3N0YXRpYyBzdHJ1Y3QgbGxpc3QgeworCXN0cnVjdCBsbGlzdF9pdGVtICpmcm9udDsKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqYmFjazsKKwlzaXplX3Qgc2l6ZTsKK30gKmFsbF9vYmplY3RzOyAvKiBhbGwgb2JqZWN0cyB3aGljaCBtdXN0IGJlIHByZXNlbnQgaW4gbG9jYWwgcGFja2ZpbGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFja19saXN0IHsKKwlzdHJ1Y3QgcGFja19saXN0ICpuZXh0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrOworCXN0cnVjdCBsbGlzdCAqdW5pcXVlX29iamVjdHM7CisJc3RydWN0IGxsaXN0ICphbGxfb2JqZWN0czsKK30gKmxvY2FsX3BhY2tzID0gTlVMTCwgKmFsdG9kYl9wYWNrcyA9IE5VTEw7CisKK3N0cnVjdCBwbGwgeworCXN0cnVjdCBwbGwgKm5leHQ7CisJc3RydWN0IHBhY2tfbGlzdCAqcGw7Cit9OworCitzdGF0aWMgc3RydWN0IGxsaXN0X2l0ZW0gKmZyZWVfbm9kZXM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9pdGVtX3B1dChzdHJ1Y3QgbGxpc3RfaXRlbSAqaXRlbSkKK3sKKwlpdGVtLT5uZXh0ID0gZnJlZV9ub2RlczsKKwlmcmVlX25vZGVzID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxpc3RfaXRlbSAqbGxpc3RfaXRlbV9nZXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3OworCWlmICggZnJlZV9ub2RlcyApIHsKKwkJbmV3ID0gZnJlZV9ub2RlczsKKwkJZnJlZV9ub2RlcyA9IGZyZWVfbm9kZXMtPm5leHQ7CisJfSBlbHNlIHsKKwkJaW50IGkgPSAxOworCQluZXcgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgbGxpc3RfaXRlbSkgKiBCTEtTSVpFKTsKKwkJZm9yKDtpIDwgQkxLU0laRTsgaSsrKSB7CisJCQlsbGlzdF9pdGVtX3B1dCgmbmV3W2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCBsbGlzdF9mcmVlKHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSgobGlzdC0+YmFjayA9IGxpc3QtPmZyb250KSkgeworCQlsaXN0LT5mcm9udCA9IGxpc3QtPmZyb250LT5uZXh0OworCQlsbGlzdF9pdGVtX3B1dChsaXN0LT5iYWNrKTsKKwl9CisJZnJlZShsaXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2luaXQoc3RydWN0IGxsaXN0ICoqbGlzdCkKK3sKKwkqbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbGlzdCkpOworCSgqbGlzdCktPmZyb250ID0gKCpsaXN0KS0+YmFjayA9IE5VTEw7CisJKCpsaXN0KS0+c2l6ZSA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3QgKiBsbGlzdF9jb3B5KHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGxpc3QgKnJldDsKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3LCAqb2xkLCAqcHJldjsKKwkKKwlsbGlzdF9pbml0KCZyZXQpOworCisJaWYgKChyZXQtPnNpemUgPSBsaXN0LT5zaXplKSA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJbmV3ID0gcmV0LT5mcm9udCA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJbmV3LT5zaGExID0gbGlzdC0+ZnJvbnQtPnNoYTE7CisKKwlvbGQgPSBsaXN0LT5mcm9udC0+bmV4dDsKKwl3aGlsZSAob2xkKSB7CisJCXByZXYgPSBuZXc7CisJCW5ldyA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJCXByZXYtPm5leHQgPSBuZXc7CisJCW5ldy0+c2hhMSA9IG9sZC0+c2hhMTsKKwkJb2xkID0gb2xkLT5uZXh0OworCX0KKwluZXctPm5leHQgPSBOVUxMOworCXJldC0+YmFjayA9IG5ldzsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnQoc3RydWN0IGxsaXN0ICpsaXN0LAorCQkJCQkgICAgICBzdHJ1Y3QgbGxpc3RfaXRlbSAqYWZ0ZXIsCisJCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXcgPSBsbGlzdF9pdGVtX2dldCgpOworCW5ldy0+c2hhMSA9IHNoYTE7CisJbmV3LT5uZXh0ID0gTlVMTDsKKworCWlmIChhZnRlciAhPSBOVUxMKSB7CisJCW5ldy0+bmV4dCA9IGFmdGVyLT5uZXh0OworCQlhZnRlci0+bmV4dCA9IG5ldzsKKwkJaWYgKGFmdGVyID09IGxpc3QtPmJhY2spCisJCQlsaXN0LT5iYWNrID0gbmV3OworCX0gZWxzZSB7LyogaW5zZXJ0IGluIGZyb250ICovCisJCWlmIChsaXN0LT5zaXplID09IDApCisJCQlsaXN0LT5iYWNrID0gbmV3OworCQllbHNlCisJCQluZXctPm5leHQgPSBsaXN0LT5mcm9udDsKKwkJbGlzdC0+ZnJvbnQgPSBuZXc7CisJfQorCWxpc3QtPnNpemUrKzsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnRfYmFjayhzdHJ1Y3QgbGxpc3QgKmxpc3QsCisJCQkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXJldHVybiBsbGlzdF9pbnNlcnQobGlzdCwgbGlzdC0+YmFjaywgc2hhMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKmxsaXN0X2luc2VydF9zb3J0ZWRfdW5pcXVlKHN0cnVjdCBsbGlzdCAqbGlzdCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBsbGlzdF9pdGVtICpoaW50KQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpwcmV2ID0gTlVMTCwgKmw7CisKKwlsID0gKGhpbnQgPT0gTlVMTCkgPyBsaXN0LT5mcm9udCA6IGhpbnQ7CisJd2hpbGUgKGwpIHsKKwkJaW50IGNtcCA9IGhhc2hjbXAobC0+c2hhMSwgc2hhMSk7CisJCWlmIChjbXAgPiAwKSB7IC8qIHdlIGluc2VydCBiZWZvcmUgdGhpcyBlbnRyeSAqLworCQkJcmV0dXJuIGxsaXN0X2luc2VydChsaXN0LCBwcmV2LCBzaGExKTsKKwkJfQorCQlpZighY21wKSB7IC8qIGFscmVhZHkgZXhpc3RzICovCisJCQlyZXR1cm4gbDsKKwkJfQorCQlwcmV2ID0gbDsKKwkJbCA9IGwtPm5leHQ7CisJfQorCS8qIGluc2VydCBhdCB0aGUgZW5kICovCisJcmV0dXJuIGxsaXN0X2luc2VydF9iYWNrKGxpc3QsIHNoYTEpOworfQorCisvKiByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpdGVtIGluIGZyb250IG9mIHNoYTEgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKiBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHN0cnVjdCBsbGlzdCAqbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKnByZXYsICpsOworCityZWRvX2Zyb21fc3RhcnQ6CisJbCA9IChoaW50ID09IE5VTEwpID8gbGlzdC0+ZnJvbnQgOiBoaW50OworCXByZXYgPSBOVUxMOworCXdoaWxlIChsKSB7CisJCWludCBjbXAgPSBoYXNoY21wKGwtPnNoYTEsIHNoYTEpOworCQlpZiAoY21wID4gMCkgLyogbm90IGluIGxpc3QsIHNpbmNlIHNvcnRlZCAqLworCQkJcmV0dXJuIHByZXY7CisJCWlmKCFjbXApIHsgLyogZm91bmQgKi8KKwkJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCQlpZiAoaGludCAhPSBOVUxMICYmIGhpbnQgIT0gbGlzdC0+ZnJvbnQpIHsKKwkJCQkJLyogd2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgZWxlbWVudCAqLworCQkJCQloaW50ID0gTlVMTDsKKwkJCQkJZ290byByZWRvX2Zyb21fc3RhcnQ7CisJCQkJfQorCQkJCWxpc3QtPmZyb250ID0gbC0+bmV4dDsKKwkJCX0gZWxzZQorCQkJCXByZXYtPm5leHQgPSBsLT5uZXh0OworCQkJaWYgKGwgPT0gbGlzdC0+YmFjaykKKwkJCQlsaXN0LT5iYWNrID0gcHJldjsKKwkJCWxsaXN0X2l0ZW1fcHV0KGwpOworCQkJbGlzdC0+c2l6ZS0tOworCQkJcmV0dXJuIHByZXY7CisJCX0KKwkJcHJldiA9IGw7CisJCWwgPSBsLT5uZXh0OworCX0KKwlyZXR1cm4gcHJldjsKK30KKworLyogY29tcHV0ZXMgQVxCICovCitzdGF0aWMgdm9pZCBsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHN0cnVjdCBsbGlzdCAqQSwKKwkJCQkgICAgIHN0cnVjdCBsbGlzdCAqQikKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqaGludCwgKmI7CisKKwloaW50ID0gTlVMTDsKKwliID0gQi0+ZnJvbnQ7CisKKwl3aGlsZSAoYikgeworCQloaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShBLCBiLT5zaGExLCBoaW50KTsKKwkJYiA9IGItPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfaW5zZXJ0KHN0cnVjdCBwYWNrX2xpc3QgKipwbCwKKwkJCQkJICAgc3RydWN0IHBhY2tfbGlzdCAqZW50cnkpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWNrX2xpc3QpKTsKKwltZW1jcHkocCwgZW50cnksIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcC0+bmV4dCA9ICpwbDsKKwkqcGwgPSBwOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBwYWNrX2xpc3Rfc2l6ZShzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwl3aGlsZShwbCkgeworCQlyZXQrKzsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfZGlmZmVyZW5jZShjb25zdCBzdHJ1Y3QgcGFja19saXN0ICpBLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqQikKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpyZXQ7CisJY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqcGw7CisKKwlpZiAoQSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBsID0gQjsKKwl3aGlsZSAocGwgIT0gTlVMTCkgeworCQlpZiAoQS0+cGFjayA9PSBwbC0+cGFjaykKKwkJCXJldHVybiBwYWNrX2xpc3RfZGlmZmVyZW5jZShBLT5uZXh0LCBCKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tfbGlzdCkpOworCW1lbWNweShyZXQsIEEsIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcmV0LT5uZXh0ID0gcGFja19saXN0X2RpZmZlcmVuY2UoQS0+bmV4dCwgQik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY21wX3R3b19wYWNrcyhzdHJ1Y3QgcGFja19saXN0ICpwMSwgc3RydWN0IHBhY2tfbGlzdCAqcDIpCit7CisJdW5zaWduZWQgbG9uZyBwMV9vZmYgPSAwLCBwMl9vZmYgPSAwLCBwMV9zdGVwLCBwMl9zdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCXN0cnVjdCBsbGlzdF9pdGVtICpwMV9oaW50ID0gTlVMTCwgKnAyX2hpbnQgPSBOVUxMOworCisJcDFfYmFzZSA9IHAxLT5wYWNrLT5pbmRleF9kYXRhOworCXAyX2Jhc2UgPSBwMi0+cGFjay0+aW5kZXhfZGF0YTsKKwlwMV9iYXNlICs9IDI1NiAqIDQgKyAoKHAxLT5wYWNrLT5pbmRleF92ZXJzaW9uIDwgMikgPyA0IDogOCk7CisJcDJfYmFzZSArPSAyNTYgKiA0ICsgKChwMi0+cGFjay0+aW5kZXhfdmVyc2lvbiA8IDIpID8gNCA6IDgpOworCXAxX3N0ZXAgPSAocDEtPnBhY2stPmluZGV4X3ZlcnNpb24gPCAyKSA/IDI0IDogMjA7CisJcDJfc3RlcCA9IChwMi0+cGFjay0+aW5kZXhfdmVyc2lvbiA8IDIpID8gMjQgOiAyMDsKKworCXdoaWxlIChwMV9vZmYgPCBwMS0+cGFjay0+bnVtX29iamVjdHMgKiBwMV9zdGVwICYmCisJICAgICAgIHAyX29mZiA8IHAyLT5wYWNrLT5udW1fb2JqZWN0cyAqIHAyX3N0ZXApCisJeworCQlpbnQgY21wID0gaGFzaGNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmKTsKKwkJLyogY21wIH4gcDEgLSBwMiAqLworCQlpZiAoY21wID09IDApIHsKKwkJCXAxX2hpbnQgPSBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHAxLT51bmlxdWVfb2JqZWN0cywKKwkJCQkJcDFfYmFzZSArIHAxX29mZiwgcDFfaGludCk7CisJCQlwMl9oaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShwMi0+dW5pcXVlX29iamVjdHMsCisJCQkJCXAxX2Jhc2UgKyBwMV9vZmYsIHAyX2hpbnQpOworCQkJcDFfb2ZmICs9IHAxX3N0ZXA7CisJCQlwMl9vZmYgKz0gcDJfc3RlcDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbXAgPCAwKSB7IC8qIHAxIGhhcyB0aGUgb2JqZWN0LCBwMiBkb2Vzbid0ICovCisJCQlwMV9vZmYgKz0gcDFfc3RlcDsKKwkJfSBlbHNlIHsgLyogcDIgaGFzIHRoZSBvYmplY3QsIHAxIGRvZXNuJ3QgKi8KKwkJCXAyX29mZiArPSBwMl9zdGVwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwbGxfZnJlZShzdHJ1Y3QgcGxsICpsKQoreworCXN0cnVjdCBwbGwgKm9sZDsKKwlzdHJ1Y3QgcGFja19saXN0ICpvcGw7CisKKwl3aGlsZSAobCkgeworCQlvbGQgPSBsOworCQl3aGlsZSAobC0+cGwpIHsKKwkJCW9wbCA9IGwtPnBsOworCQkJbC0+cGwgPSBvcGwtPm5leHQ7CisJCQlmcmVlKG9wbCk7CisJCX0KKwkJbCA9IGwtPm5leHQ7CisJCWZyZWUob2xkKTsKKwl9Cit9CisKKy8qIGFsbCB0aGUgcGVybXV0YXRpb25zIGhhdmUgdG8gYmUgZnJlZSgpZCBhdCB0aGUgc2FtZSB0aW1lLAorICogc2luY2UgdGhleSByZWZlciB0byBlYWNoIG90aGVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxsICogZ2V0X3Blcm11dGF0aW9ucyhzdHJ1Y3QgcGFja19saXN0ICpsaXN0LCBpbnQgbikKK3sKKwlzdHJ1Y3QgcGxsICpzdWJzZXQsICpyZXQgPSBOVUxMLCAqbmV3X3BsbCA9IE5VTEwsICpwbGw7CisKKwlpZiAobGlzdCA9PSBOVUxMIHx8IHBhY2tfbGlzdF9zaXplKGxpc3QpIDwgbiB8fCBuID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKG4gPT0gMSkgeworCQl3aGlsZSAobGlzdCkgeworCQkJbmV3X3BsbCA9IHhtYWxsb2Moc2l6ZW9mKHBsbCkpOworCQkJbmV3X3BsbC0+cGwgPSBOVUxMOworCQkJcGFja19saXN0X2luc2VydCgmbmV3X3BsbC0+cGwsIGxpc3QpOworCQkJbmV3X3BsbC0+bmV4dCA9IHJldDsKKwkJCXJldCA9IG5ld19wbGw7CisJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXdoaWxlIChsaXN0LT5uZXh0KSB7CisJCXN1YnNldCA9IGdldF9wZXJtdXRhdGlvbnMobGlzdC0+bmV4dCwgbiAtIDEpOworCQl3aGlsZSAoc3Vic2V0KSB7CisJCQluZXdfcGxsID0geG1hbGxvYyhzaXplb2YocGxsKSk7CisJCQluZXdfcGxsLT5wbCA9IHN1YnNldC0+cGw7CisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZuZXdfcGxsLT5wbCwgbGlzdCk7CisJCQluZXdfcGxsLT5uZXh0ID0gcmV0OworCQkJcmV0ID0gbmV3X3BsbDsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc19zdXBlcnNldChzdHJ1Y3QgcGFja19saXN0ICpwbCwgc3RydWN0IGxsaXN0ICpsaXN0KQoreworCXN0cnVjdCBsbGlzdCAqZGlmZjsKKworCWRpZmYgPSBsbGlzdF9jb3B5KGxpc3QpOworCisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoZGlmZiwgcGwtPmFsbF9vYmplY3RzKTsKKwkJaWYgKGRpZmYtPnNpemUgPT0gMCkgeyAvKiB3ZSdyZSBkb25lICovCisJCQlsbGlzdF9mcmVlKGRpZmYpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJbGxpc3RfZnJlZShkaWZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBzaXplb2ZfdW5pb24oc3RydWN0IHBhY2tlZF9naXQgKnAxLCBzdHJ1Y3QgcGFja2VkX2dpdCAqcDIpCit7CisJc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBwMV9vZmYgPSAwLCBwMl9vZmYgPSAwLCBwMV9zdGVwLCBwMl9zdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCisJcDFfYmFzZSA9IHAxLT5pbmRleF9kYXRhOworCXAyX2Jhc2UgPSBwMi0+aW5kZXhfZGF0YTsKKwlwMV9iYXNlICs9IDI1NiAqIDQgKyAoKHAxLT5pbmRleF92ZXJzaW9uIDwgMikgPyA0IDogOCk7CisJcDJfYmFzZSArPSAyNTYgKiA0ICsgKChwMi0+aW5kZXhfdmVyc2lvbiA8IDIpID8gNCA6IDgpOworCXAxX3N0ZXAgPSAocDEtPmluZGV4X3ZlcnNpb24gPCAyKSA/IDI0IDogMjA7CisJcDJfc3RlcCA9IChwMi0+aW5kZXhfdmVyc2lvbiA8IDIpID8gMjQgOiAyMDsKKworCXdoaWxlIChwMV9vZmYgPCBwMS0+bnVtX29iamVjdHMgKiBwMV9zdGVwICYmCisJICAgICAgIHAyX29mZiA8IHAyLT5udW1fb2JqZWN0cyAqIHAyX3N0ZXApCisJeworCQlpbnQgY21wID0gaGFzaGNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmKTsKKwkJLyogY21wIH4gcDEgLSBwMiAqLworCQlpZiAoY21wID09IDApIHsKKwkJCXJldCsrOworCQkJcDFfb2ZmICs9IHAxX3N0ZXA7CisJCQlwMl9vZmYgKz0gcDJfc3RlcDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbXAgPCAwKSB7IC8qIHAxIGhhcyB0aGUgb2JqZWN0LCBwMiBkb2Vzbid0ICovCisJCQlwMV9vZmYgKz0gcDFfc3RlcDsKKwkJfSBlbHNlIHsgLyogcDIgaGFzIHRoZSBvYmplY3QsIHAxIGRvZXNuJ3QgKi8KKwkJCXAyX29mZiArPSBwMl9zdGVwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIGFub3RoZXIgTyhuXjIpIGZ1bmN0aW9uIC4uLiAqLworc3RhdGljIHNpemVfdCBnZXRfcGFja19yZWR1bmRhbmN5KHN0cnVjdCBwYWNrX2xpc3QgKnBsKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnN1YnNldDsKKwlzaXplX3QgcmV0ID0gMDsKKworCWlmIChwbCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoc3Vic2V0ID0gcGwtPm5leHQpKSB7CisJCXdoaWxlKHN1YnNldCkgeworCQkJcmV0ICs9IHNpemVvZl91bmlvbihwbC0+cGFjaywgc3Vic2V0LT5wYWNrKTsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIG9mZl90IHBhY2tfc2V0X2J5dGVjb3VudChzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlvZmZfdCByZXQgPSAwOworCXdoaWxlIChwbCkgeworCQlyZXQgKz0gcGwtPnBhY2stPnBhY2tfc2l6ZTsKKwkJcmV0ICs9IHBsLT5wYWNrLT5pbmRleF9zaXplOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtaW5pbWl6ZShzdHJ1Y3QgcGFja19saXN0ICoqbWluKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsLCAqdW5pcXVlID0gTlVMTCwKKwkJKm5vbl91bmlxdWUgPSBOVUxMLCAqbWluX3Blcm0gPSBOVUxMOworCXN0cnVjdCBwbGwgKnBlcm0sICpwZXJtX2FsbCwgKnBlcm1fb2sgPSBOVUxMLCAqbmV3X3Blcm07CisJc3RydWN0IGxsaXN0ICptaXNzaW5nOworCW9mZl90IG1pbl9wZXJtX3NpemUgPSAwLCBwZXJtX3NpemU7CisJaW50IG47CisKKwlwbCA9IGxvY2FsX3BhY2tzOworCXdoaWxlIChwbCkgeworCQlpZihwbC0+dW5pcXVlX29iamVjdHMtPnNpemUpCisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZ1bmlxdWUsIHBsKTsKKwkJZWxzZQorCQkJcGFja19saXN0X2luc2VydCgmbm9uX3VuaXF1ZSwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwkvKiBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZSBtaXNzaW5nIGZyb20gdGhlIHNldCBvZiB1bmlxdWUgcGFja3MgKi8KKwltaXNzaW5nID0gbGxpc3RfY29weShhbGxfb2JqZWN0cyk7CisJcGwgPSB1bmlxdWU7CisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobWlzc2luZywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisKKwkvKiByZXR1cm4gaWYgdGhlcmUgYXJlIG5vIG9iamVjdHMgbWlzc2luZyBmcm9tIHRoZSB1bmlxdWUgc2V0ICovCisJaWYgKG1pc3NpbmctPnNpemUgPT0gMCkgeworCQkqbWluID0gdW5pcXVlOworCQlyZXR1cm47CisJfQorCisJLyogZmluZCB0aGUgcGVybXV0YXRpb25zIHdoaWNoIGNvbnRhaW4gYWxsIG1pc3Npbmcgb2JqZWN0cyAqLworCWZvciAobiA9IDE7IG4gPD0gcGFja19saXN0X3NpemUobm9uX3VuaXF1ZSkgJiYgIXBlcm1fb2s7IG4rKykgeworCQlwZXJtX2FsbCA9IHBlcm0gPSBnZXRfcGVybXV0YXRpb25zKG5vbl91bmlxdWUsIG4pOworCQl3aGlsZSAocGVybSkgeworCQkJaWYgKGlzX3N1cGVyc2V0KHBlcm0tPnBsLCBtaXNzaW5nKSkgeworCQkJCW5ld19wZXJtID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBsbCkpOworCQkJCW1lbWNweShuZXdfcGVybSwgcGVybSwgc2l6ZW9mKHN0cnVjdCBwbGwpKTsKKwkJCQluZXdfcGVybS0+bmV4dCA9IHBlcm1fb2s7CisJCQkJcGVybV9vayA9IG5ld19wZXJtOworCQkJfQorCQkJcGVybSA9IHBlcm0tPm5leHQ7CisJCX0KKwkJaWYgKHBlcm1fb2spCisJCQlicmVhazsKKwkJcGxsX2ZyZWUocGVybV9hbGwpOworCX0KKwlpZiAocGVybV9vayA9PSBOVUxMKQorCQlkaWUoIkludGVybmFsIGVycm9yOiBObyBjb21wbGV0ZSBzZXRzIGZvdW5kIVxuIik7CisKKwkvKiBmaW5kIHRoZSBwZXJtdXRhdGlvbiB3aXRoIHRoZSBzbWFsbGVzdCBzaXplICovCisJcGVybSA9IHBlcm1fb2s7CisJd2hpbGUgKHBlcm0pIHsKKwkJcGVybV9zaXplID0gcGFja19zZXRfYnl0ZWNvdW50KHBlcm0tPnBsKTsKKwkJaWYgKCFtaW5fcGVybV9zaXplIHx8IG1pbl9wZXJtX3NpemUgPiBwZXJtX3NpemUpIHsKKwkJCW1pbl9wZXJtX3NpemUgPSBwZXJtX3NpemU7CisJCQltaW5fcGVybSA9IHBlcm0tPnBsOworCQl9CisJCXBlcm0gPSBwZXJtLT5uZXh0OworCX0KKwkqbWluID0gbWluX3Blcm07CisJLyogYWRkIHRoZSB1bmlxdWUgcGFja3MgdG8gdGhlIGxpc3QgKi8KKwlwbCA9IHVuaXF1ZTsKKwl3aGlsZShwbCkgeworCQlwYWNrX2xpc3RfaW5zZXJ0KG1pbiwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9hbGxfb2JqZWN0cyh2b2lkKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsID0gbG9jYWxfcGFja3M7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQsICpsOworCisJbGxpc3RfaW5pdCgmYWxsX29iamVjdHMpOworCisJd2hpbGUgKHBsKSB7CisJCWhpbnQgPSBOVUxMOworCQlsID0gcGwtPmFsbF9vYmplY3RzLT5mcm9udDsKKwkJd2hpbGUgKGwpIHsKKwkJCWhpbnQgPSBsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShhbGxfb2JqZWN0cywKKwkJCQkJCQkgIGwtPnNoYTEsIGhpbnQpOworCQkJbCA9IGwtPm5leHQ7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJLyogcmVtb3ZlIG9iamVjdHMgcHJlc2VudCBpbiByZW1vdGUgcGFja3MgKi8KKwlwbCA9IGFsdG9kYl9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9Cit9CisKKy8qIHRoaXMgc2NhbGVzIGxpa2UgTyhuXjIpICovCitzdGF0aWMgdm9pZCBjbXBfbG9jYWxfcGFja3Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpzdWJzZXQsICpwbCA9IGxvY2FsX3BhY2tzOworCisJd2hpbGUgKChzdWJzZXQgPSBwbCkpIHsKKwkJd2hpbGUoKHN1YnNldCA9IHN1YnNldC0+bmV4dCkpCisJCQljbXBfdHdvX3BhY2tzKHBsLCBzdWJzZXQpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgc2Nhbl9hbHRfb2RiX3BhY2tzKHZvaWQpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqbG9jYWwsICphbHQ7CisKKwlhbHQgPSBhbHRvZGJfcGFja3M7CisJd2hpbGUgKGFsdCkgeworCQlsb2NhbCA9IGxvY2FsX3BhY2tzOworCQl3aGlsZSAobG9jYWwpIHsKKwkJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobG9jYWwtPnVuaXF1ZV9vYmplY3RzLAorCQkJCQkJCWFsdC0+YWxsX29iamVjdHMpOworCQkJbG9jYWwgPSBsb2NhbC0+bmV4dDsKKwkJfQorCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKGFsbF9vYmplY3RzLCBhbHQtPmFsbF9vYmplY3RzKTsKKwkJYWx0ID0gYWx0LT5uZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBhZGRfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0IGw7CisJdW5zaWduZWQgbG9uZyBvZmYgPSAwLCBzdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2U7CisKKwlpZiAoIXAtPnBhY2tfbG9jYWwgJiYgIShhbHRfb2RiIHx8IHZlcmJvc2UpKQorCQlyZXR1cm4gTlVMTDsKKworCWwucGFjayA9IHA7CisJbGxpc3RfaW5pdCgmbC5hbGxfb2JqZWN0cyk7CisKKwliYXNlID0gcC0+aW5kZXhfZGF0YTsKKwliYXNlICs9IDI1NiAqIDQgKyAoKHAtPmluZGV4X3ZlcnNpb24gPCAyKSA/IDQgOiA4KTsKKwlzdGVwID0gKHAtPmluZGV4X3ZlcnNpb24gPCAyKSA/IDI0IDogMjA7CisJd2hpbGUgKG9mZiA8IHAtPm51bV9vYmplY3RzICogc3RlcCkgeworCQlsbGlzdF9pbnNlcnRfYmFjayhsLmFsbF9vYmplY3RzLCBiYXNlICsgb2ZmKTsKKwkJb2ZmICs9IHN0ZXA7CisJfQorCS8qIHRoaXMgbGlzdCB3aWxsIGJlIHBydW5lZCBpbiBjbXBfdHdvX3BhY2tzIGxhdGVyICovCisJbC51bmlxdWVfb2JqZWN0cyA9IGxsaXN0X2NvcHkobC5hbGxfb2JqZWN0cyk7CisJaWYgKHAtPnBhY2tfbG9jYWwpCisJCXJldHVybiBwYWNrX2xpc3RfaW5zZXJ0KCZsb2NhbF9wYWNrcywgJmwpOworCWVsc2UKKwkJcmV0dXJuIHBhY2tfbGlzdF9pbnNlcnQoJmFsdG9kYl9wYWNrcywgJmwpOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tfbGlzdCAqIGFkZF9wYWNrX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBwYWNrZWRfZ2l0OworCisJaWYgKHN0cmxlbihmaWxlbmFtZSkgPCA0MCkKKwkJZGllKCJCYWQgcGFjayBmaWxlbmFtZTogJXNcbiIsIGZpbGVuYW1lKTsKKworCXdoaWxlIChwKSB7CisJCWlmIChzdHJzdHIocC0+cGFja19uYW1lLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gYWRkX3BhY2socCk7CisJCXAgPSBwLT5uZXh0OworCX0KKwlkaWUoIkZpbGVuYW1lICVzIG5vdCBmb3VuZCBpbiBwYWNrZWRfZ2l0XG4iLCBmaWxlbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYWxsKHZvaWQpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBwYWNrZWRfZ2l0OworCisJd2hpbGUgKHApIHsKKwkJYWRkX3BhY2socCk7CisJCXAgPSBwLT5uZXh0OworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCXN0cnVjdCBwYWNrX2xpc3QgKm1pbiwgKnJlZCwgKnBsOworCXN0cnVjdCBsbGlzdCAqaWdub3JlOworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisJY2hhciBidWZbNDJdOyAvKiA0MCBieXRlIHNoYTEgKyBcbiArIFwwICovCisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQlsb2FkX2FsbF9wYWNrcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZighc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKCFzdHJjbXAoYXJnLCAiLS1hbHQtb2RiIikpIHsKKwkJCWFsdF9vZGIgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYoKmFyZyA9PSAnLScpCisJCQl1c2FnZShwYWNrX3JlZHVuZGFudF91c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJaWYgKGxvYWRfYWxsX3BhY2tzKQorCQlsb2FkX2FsbCgpOworCWVsc2UKKwkJd2hpbGUgKCooYXJndiArIGkpICE9IE5VTEwpCisJCQlhZGRfcGFja19maWxlKCooYXJndiArIGkrKykpOworCisJaWYgKGxvY2FsX3BhY2tzID09IE5VTEwpCisJCWRpZSgiWmVybyBwYWNrcyBmb3VuZCFcbiIpOworCisJbG9hZF9hbGxfb2JqZWN0cygpOworCisJY21wX2xvY2FsX3BhY2tzKCk7CisJaWYgKGFsdF9vZGIpCisJCXNjYW5fYWx0X29kYl9wYWNrcygpOworCisJLyogaWdub3JlIG9iamVjdHMgZ2l2ZW4gb24gc3RkaW4gKi8KKwlsbGlzdF9pbml0KCZpZ25vcmUpOworCWlmICghaXNhdHR5KDApKSB7CisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBzdGRpbikpIHsKKwkJCXNoYTEgPSB4bWFsbG9jKDIwKTsKKwkJCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBzaGExKSkKKwkJCQlkaWUoIkJhZCBzaGExIG9uIHN0ZGluOiAlcyIsIGJ1Zik7CisJCQlsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShpZ25vcmUsIHNoYTEsIE5VTEwpOworCQl9CisJfQorCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoYWxsX29iamVjdHMsIGlnbm9yZSk7CisJcGwgPSBsb2NhbF9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShwbC0+dW5pcXVlX29iamVjdHMsIGlnbm9yZSk7CisJCXBsID0gcGwtPm5leHQ7CisJfQorCisJbWluaW1pemUoJm1pbik7CisKKwlpZiAodmVyYm9zZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSAlbHUgcGFja3MgYXZhaWxhYmxlIGluIGFsdC1vZGJzLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXBhY2tfbGlzdF9zaXplKGFsdG9kYl9wYWNrcykpOworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBzbWFsbGVzdCAoYnl0ZXdpc2UpIHNldCBvZiBwYWNrcyBpczpcbiIpOworCQlwbCA9IG1pbjsKKwkJd2hpbGUgKHBsKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlx0JXNcbiIsIHBsLT5wYWNrLT5wYWNrX25hbWUpOworCQkJcGwgPSBwbC0+bmV4dDsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgImNvbnRhaW5pbmcgJWx1IGR1cGxpY2F0ZSBvYmplY3RzICIKKwkJCQkid2l0aCBhIHRvdGFsIHNpemUgb2YgJWx1a2IuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpZ2V0X3BhY2tfcmVkdW5kYW5jeShtaW4pLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19zZXRfYnl0ZWNvdW50KG1pbikvMTAyNCk7CisJCWZwcmludGYoc3RkZXJyLCAiQSB0b3RhbCBvZiAlbHUgdW5pcXVlIG9iamVjdHMgd2VyZSBjb25zaWRlcmVkLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFsbF9vYmplY3RzLT5zaXplKTsKKwkJZnByaW50ZihzdGRlcnIsICJSZWR1bmRhbnQgcGFja3MgKHdpdGggaW5kZXhlcyk6XG4iKTsKKwl9CisJcGwgPSByZWQgPSBwYWNrX2xpc3RfZGlmZmVyZW5jZShsb2NhbF9wYWNrcywgbWluKTsKKwl3aGlsZSAocGwpIHsKKwkJcHJpbnRmKCIlc1xuJXNcbiIsCisJCSAgICAgICBzaGExX3BhY2tfaW5kZXhfbmFtZShwbC0+cGFjay0+c2hhMSksCisJCSAgICAgICBwbC0+cGFjay0+cGFja19uYW1lKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiJWx1TUIgb2YgcmVkdW5kYW50IHBhY2tzIGluIHRvdGFsLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXBhY2tfc2V0X2J5dGVjb3VudChyZWQpLygxMDI0KjEwMjQpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcGFjay13cml0ZS5jIGIvcGFjay13cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMmU0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLXdyaXRlLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCit2b2lkIGZpeHVwX3BhY2tfaGVhZGVyX2Zvb3RlcihpbnQgcGFja19mZCwKKwkJCSB1bnNpZ25lZCBjaGFyICpwYWNrX2ZpbGVfc2hhMSwKKwkJCSBjb25zdCBjaGFyICpwYWNrX25hbWUsCisJCQkgdWludDMyX3Qgb2JqZWN0X2NvdW50KQoreworCXN0YXRpYyBjb25zdCBpbnQgYnVmX3N6ID0gMTI4ICogMTAyNDsKKwlTSEFfQ1RYIGM7CisJc3RydWN0IHBhY2tfaGVhZGVyIGhkcjsKKwljaGFyICpidWY7CisKKwlpZiAobHNlZWsocGFja19mZCwgMCwgU0VFS19TRVQpICE9IDApCisJCWRpZSgiRmFpbGVkIHNlZWtpbmcgdG8gc3RhcnQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAocmVhZF9pbl9mdWxsKHBhY2tfZmQsICZoZHIsIHNpemVvZihoZHIpKSAhPSBzaXplb2YoaGRyKSkKKwkJZGllKCJVbmFibGUgdG8gcmVyZWFkIGhlYWRlciBvZiAlczogJXMiLCBwYWNrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGxzZWVrKHBhY2tfZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQorCQlkaWUoIkZhaWxlZCBzZWVraW5nIHRvIHN0YXJ0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaGRyLmhkcl9lbnRyaWVzID0gaHRvbmwob2JqZWN0X2NvdW50KTsKKwl3cml0ZV9vcl9kaWUocGFja19mZCwgJmhkciwgc2l6ZW9mKGhkcikpOworCisJU0hBMV9Jbml0KCZjKTsKKwlTSEExX1VwZGF0ZSgmYywgJmhkciwgc2l6ZW9mKGhkcikpOworCisJYnVmID0geG1hbGxvYyhidWZfc3opOworCWZvciAoOzspIHsKKwkJc3NpemVfdCBuID0geHJlYWQocGFja19mZCwgYnVmLCBidWZfc3opOworCQlpZiAoIW4pCisJCQlicmVhazsKKwkJaWYgKG4gPCAwKQorCQkJZGllKCJGYWlsZWQgdG8gY2hlY2tzdW0gJXM6ICVzIiwgcGFja19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlTSEExX1VwZGF0ZSgmYywgYnVmLCBuKTsKKwl9CisJZnJlZShidWYpOworCisJU0hBMV9GaW5hbChwYWNrX2ZpbGVfc2hhMSwgJmMpOworCXdyaXRlX29yX2RpZShwYWNrX2ZkLCBwYWNrX2ZpbGVfc2hhMSwgMjApOworfQpkaWZmIC0tZ2l0IGEvcGFjay5oIGIvcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjdmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBQQUNLX0gKKyNkZWZpbmUgUEFDS19ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworLyoKKyAqIFBhY2tlZCBvYmplY3QgaGVhZGVyCisgKi8KKyNkZWZpbmUgUEFDS19TSUdOQVRVUkUgMHg1MDQxNDM0YgkvKiAiUEFDSyIgKi8KKyNkZWZpbmUgUEFDS19WRVJTSU9OIDIKKyNkZWZpbmUgcGFja192ZXJzaW9uX29rKHYpICgodikgPT0gaHRvbmwoMikgfHwgKHYpID09IGh0b25sKDMpKQorc3RydWN0IHBhY2tfaGVhZGVyIHsKKwl1aW50MzJfdCBoZHJfc2lnbmF0dXJlOworCXVpbnQzMl90IGhkcl92ZXJzaW9uOworCXVpbnQzMl90IGhkcl9lbnRyaWVzOworfTsKKworLyoKKyAqIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIGluZGV4IGZvcm1hdHMgbGF0ZXIgdGhhbiB2ZXJzaW9uIDEgc2hvdWxkCisgKiBzdGFydCB3aXRoIHRoaXMgc2lnbmF0dXJlLCBhcyBhbGwgb2xkZXIgZ2l0IGJpbmFyaWVzIHdvdWxkIGZpbmQgdGhpcworICogdmFsdWUgaWxsZWdhbCBhbmQgYWJvcnQgcmVhZGluZyB0aGUgZmlsZS4KKyAqCisgKiBUaGlzIGlzIHRoZSBjYXNlIGJlY2F1c2UgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIGEgcGFja2ZpbGUKKyAqIGNhbm5vdCBleGNlZWQgMSw0MzEsNjYwLDAwMCBhcyBldmVyeSBvYmplY3Qgd291bGQgbmVlZCBhdCBsZWFzdAorICogMyBieXRlcyBvZiBkYXRhIGFuZCB0aGUgb3ZlcmFsbCBwYWNrZmlsZSBjYW5ub3QgZXhjZWVkIDQgR2lCIHdpdGgKKyAqIHZlcnNpb24gMSBvZiB0aGUgaW5kZXggZmlsZSBkdWUgdG8gdGhlIG9mZnNldHMgbGltaXRlZCB0byAzMiBiaXRzLgorICogQ2xlYXJseSB0aGUgc2lnbmF0dXJlIGV4Y2VlZHMgdGhpcyBtYXhpbXVtLgorICoKKyAqIFZlcnkgb2xkIGdpdCBiaW5hcmllcyB3aWxsIGFsc28gY29tcGFyZSB0aGUgZmlyc3QgNCBieXRlcyB0byB0aGUKKyAqIG5leHQgNCBieXRlcyBpbiB0aGUgaW5kZXggYW5kIGFib3J0IHdpdGggYSAibm9uLW1vbm90b25pYyBpbmRleCIKKyAqIGVycm9yIGlmIHRoZSBzZWNvbmQgNCBieXRlIHdvcmQgaXMgc21hbGxlciB0aGFuIHRoZSBmaXJzdCA0CisgKiBieXRlIHdvcmQuICBUaGlzIHdvdWxkIGJlIHRydWUgaW4gdGhlIHByb3Bvc2VkIGZ1dHVyZSBpbmRleAorICogZm9ybWF0IGFzIGlkeF9zaWduYXR1cmUgd291bGQgYmUgZ3JlYXRlciB0aGFuIGlkeF92ZXJzaW9uLgorICovCisjZGVmaW5lIFBBQ0tfSURYX1NJR05BVFVSRSAweGZmNzQ0ZjYzCS8qICJcMzc3dE9jIiAqLworCisvKgorICogUGFja2VkIG9iamVjdCBpbmRleCBoZWFkZXIKKyAqLworc3RydWN0IHBhY2tfaWR4X2hlYWRlciB7CisJdWludDMyX3QgaWR4X3NpZ25hdHVyZTsKKwl1aW50MzJfdCBpZHhfdmVyc2lvbjsKK307CisKKworZXh0ZXJuIGludCB2ZXJpZnlfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZml4dXBfcGFja19oZWFkZXJfZm9vdGVyKGludCwgdW5zaWduZWQgY2hhciAqLCBjb25zdCBjaGFyICosIHVpbnQzMl90KTsKKworI2RlZmluZSBQSF9FUlJPUl9FT0YJCSgtMSkKKyNkZWZpbmUgUEhfRVJST1JfUEFDS19TSUdOQVRVUkUJKC0yKQorI2RlZmluZSBQSF9FUlJPUl9QUk9UT0NPTAkoLTMpCitleHRlcm4gaW50IHJlYWRfcGFja19oZWFkZXIoaW50IGZkLCBzdHJ1Y3QgcGFja19oZWFkZXIgKik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3BhZ2VyLmMgYi9wYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjgwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWdlci5jCkBAIC0wLDAgKzEsNjkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisvKgorICogVGhpcyBpcyBzcGxpdCB1cCBmcm9tIHRoZSByZXN0IG9mIGdpdCBzbyB0aGF0IHdlIG1pZ2h0IGRvCisgKiBzb21ldGhpbmcgZGlmZmVyZW50IG9uIFdpbmRvd3MsIGZvciBleGFtcGxlLgorICovCisKK3N0YXRpYyB2b2lkIHJ1bl9wYWdlcihjb25zdCBjaGFyICpwYWdlcikKK3sKKwkvKgorCSAqIFdvcmsgYXJvdW5kIGJ1ZyBpbiAibGVzcyIgYnkgbm90IHN0YXJ0aW5nIGl0IHVudGlsIHdlCisJICogaGF2ZSByZWFsIGlucHV0CisJICovCisJZmRfc2V0IGluOworCisJRkRfWkVSTygmaW4pOworCUZEX1NFVCgwLCAmaW4pOworCXNlbGVjdCgxLCAmaW4sIE5VTEwsICZpbiwgTlVMTCk7CisKKwlleGVjbHAocGFnZXIsIHBhZ2VyLCBOVUxMKTsKKwlleGVjbCgiL2Jpbi9zaCIsICJzaCIsICItYyIsIHBhZ2VyLCBOVUxMKTsKK30KKwordm9pZCBzZXR1cF9wYWdlcih2b2lkKQoreworCXBpZF90IHBpZDsKKwlpbnQgZmRbMl07CisJY29uc3QgY2hhciAqcGFnZXIgPSBnZXRlbnYoIkdJVF9QQUdFUiIpOworCisJaWYgKCFpc2F0dHkoMSkpCisJCXJldHVybjsKKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9ICJsZXNzIjsKKwllbHNlIGlmICghKnBhZ2VyIHx8ICFzdHJjbXAocGFnZXIsICJjYXQiKSkKKwkJcmV0dXJuOworCisJcGFnZXJfaW5fdXNlID0gMTsgLyogbWVhbnMgd2UgYXJlIGVtaXR0aW5nIHRvIHRlcm1pbmFsICovCisKKwlpZiAocGlwZShmZCkgPCAwKQorCQlyZXR1cm47CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSB7CisJCWNsb3NlKGZkWzBdKTsKKwkJY2xvc2UoZmRbMV0pOworCQlyZXR1cm47CisJfQorCisJLyogcmV0dXJuIGluIHRoZSBjaGlsZCAqLworCWlmICghcGlkKSB7CisJCWR1cDIoZmRbMV0sIDEpOworCQljbG9zZShmZFswXSk7CisJCWNsb3NlKGZkWzFdKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSBvcmlnaW5hbCBwcm9jZXNzIHR1cm5zIGludG8gdGhlIFBBR0VSICovCisJZHVwMihmZFswXSwgMCk7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKworCXNldGVudigiTEVTUyIsICJGUlNYIiwgMCk7CisJcnVuX3BhZ2VyKHBhZ2VyKTsKKwlkaWUoInVuYWJsZSB0byBleGVjdXRlIHBhZ2VyICclcyciLCBwYWdlcik7CisJZXhpdCgyNTUpOworfQpkaWZmIC0tZ2l0IGEvcGF0Y2gtZGVsdGEuYyBiL3BhdGNoLWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5ZGI4MQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWRlbHRhLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIHBhdGNoLWRlbHRhLmM6CisgKiByZWNyZWF0ZSBhIGJ1ZmZlciBmcm9tIGEgc291cmNlIGFuZCB0aGUgZGVsdGEgcHJvZHVjZWQgYnkgZGlmZi1kZWx0YS5jCisgKgorICogKEMpIDIwMDUgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisKK3ZvaWQgKnBhdGNoX2RlbHRhKGNvbnN0IHZvaWQgKnNyY19idWYsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUsCisJCSAgY29uc3Qgdm9pZCAqZGVsdGFfYnVmLCB1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsCisJCSAgdW5zaWduZWQgbG9uZyAqZHN0X3NpemUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgKnRvcDsKKwl1bnNpZ25lZCBjaGFyICpkc3RfYnVmLCAqb3V0LCBjbWQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKGRlbHRhX3NpemUgPCBERUxUQV9TSVpFX01JTikKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhID0gZGVsdGFfYnVmOworCXRvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRlbHRhX2J1ZiArIGRlbHRhX3NpemU7CisKKwkvKiBtYWtlIHN1cmUgdGhlIG9yaWcgZmlsZSBzaXplIG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QgKi8KKwlzaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCB0b3ApOworCWlmIChzaXplICE9IHNyY19zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIG5vdyB0aGUgcmVzdWx0IHNpemUgKi8KKwlzaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCB0b3ApOworCWRzdF9idWYgPSB4bWFsbG9jKHNpemUgKyAxKTsKKwlkc3RfYnVmW3NpemVdID0gMDsKKworCW91dCA9IGRzdF9idWY7CisJd2hpbGUgKGRhdGEgPCB0b3ApIHsKKwkJY21kID0gKmRhdGErKzsKKwkJaWYgKGNtZCAmIDB4ODApIHsKKwkJCXVuc2lnbmVkIGxvbmcgY3Bfb2ZmID0gMCwgY3Bfc2l6ZSA9IDA7CisJCQlpZiAoY21kICYgMHgwMSkgY3Bfb2ZmID0gKmRhdGErKzsKKwkJCWlmIChjbWQgJiAweDAyKSBjcF9vZmYgfD0gKCpkYXRhKysgPDwgOCk7CisJCQlpZiAoY21kICYgMHgwNCkgY3Bfb2ZmIHw9ICgqZGF0YSsrIDw8IDE2KTsKKwkJCWlmIChjbWQgJiAweDA4KSBjcF9vZmYgfD0gKCpkYXRhKysgPDwgMjQpOworCQkJaWYgKGNtZCAmIDB4MTApIGNwX3NpemUgPSAqZGF0YSsrOworCQkJaWYgKGNtZCAmIDB4MjApIGNwX3NpemUgfD0gKCpkYXRhKysgPDwgOCk7CisJCQlpZiAoY21kICYgMHg0MCkgY3Bfc2l6ZSB8PSAoKmRhdGErKyA8PCAxNik7CisJCQlpZiAoY3Bfc2l6ZSA9PSAwKSBjcF9zaXplID0gMHgxMDAwMDsKKwkJCWlmIChjcF9vZmYgKyBjcF9zaXplIDwgY3Bfc2l6ZSB8fAorCQkJICAgIGNwX29mZiArIGNwX3NpemUgPiBzcmNfc2l6ZSB8fAorCQkJICAgIGNwX3NpemUgPiBzaXplKQorCQkJCWJyZWFrOworCQkJbWVtY3B5KG91dCwgKGNoYXIgKikgc3JjX2J1ZiArIGNwX29mZiwgY3Bfc2l6ZSk7CisJCQlvdXQgKz0gY3Bfc2l6ZTsKKwkJCXNpemUgLT0gY3Bfc2l6ZTsKKwkJfSBlbHNlIGlmIChjbWQpIHsKKwkJCWlmIChjbWQgPiBzaXplKQorCQkJCWJyZWFrOworCQkJbWVtY3B5KG91dCwgZGF0YSwgY21kKTsKKwkJCW91dCArPSBjbWQ7CisJCQlkYXRhICs9IGNtZDsKKwkJCXNpemUgLT0gY21kOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGNtZCA9PSAwIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZW5jb2RpbmcKKwkJCSAqIGV4dGVuc2lvbnMuIEluIHRoZSBtZWFuIHRpbWUgd2UgbXVzdCBmYWlsIHdoZW4KKwkJCSAqIGVuY291bnRlcmluZyB0aGVtIChtaWdodCBiZSBkYXRhIGNvcnJ1cHRpb24pLgorCQkJICovCisJCQllcnJvcigidW5leHBlY3RlZCBkZWx0YSBvcGNvZGUgMCIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoZGF0YSAhPSB0b3AgfHwgc2l6ZSAhPSAwKSB7CisJCWVycm9yKCJkZWx0YSByZXBsYXkgaGFzIGdvbmUgd2lsZCIpOworCQliYWQ6CisJCWZyZWUoZHN0X2J1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCSpkc3Rfc2l6ZSA9IG91dCAtIGRzdF9idWY7CisJcmV0dXJuIGRzdF9idWY7Cit9CmRpZmYgLS1naXQgYS9wYXRjaC1pZC5jIGIvcGF0Y2gtaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZkMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGF0Y2gtaWQuYwpAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHZvaWQgZmx1c2hfY3VycmVudF9pZChpbnQgcGF0Y2hsZW4sIHVuc2lnbmVkIGNoYXIgKmlkLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGNoYXIgcmVzdWx0WzIwXTsKKwljaGFyIG5hbWVbNTBdOworCisJaWYgKCFwYXRjaGxlbikKKwkJcmV0dXJuOworCisJU0hBMV9GaW5hbChyZXN1bHQsIGMpOworCW1lbWNweShuYW1lLCBzaGExX3RvX2hleChpZCksIDQxKTsKKwlwcmludGYoIiVzICVzXG4iLCBzaGExX3RvX2hleChyZXN1bHQpLCBuYW1lKTsKKwlTSEExX0luaXQoYyk7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3NwYWNlKGNoYXIgKmxpbmUpCit7CisJY2hhciAqc3JjID0gbGluZTsKKwljaGFyICpkc3QgPSBsaW5lOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpzcmMrKykgIT0gJ1wwJykgeworCQlpZiAoIWlzc3BhY2UoYykpCisJCQkqZHN0KysgPSBjOworCX0KKwlyZXR1cm4gZHN0IC0gbGluZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfaWRfbGlzdCh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJU0hBX0NUWCBjdHg7CisJaW50IHBhdGNobGVuID0gMDsKKworCVNIQTFfSW5pdCgmY3R4KTsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIG5bMjBdOworCQljaGFyICpwID0gbGluZTsKKwkJaW50IGxlbjsKKworCQlpZiAoIW1lbWNtcChsaW5lLCAiZGlmZi10cmVlICIsIDEwKSkKKwkJCXAgKz0gMTA7CisJCWVsc2UgaWYgKCFtZW1jbXAobGluZSwgImNvbW1pdCAiLCA3KSkKKwkJCXAgKz0gNzsKKworCQlpZiAoIWdldF9zaGExX2hleChwLCBuKSkgeworCQkJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7CisJCQloYXNoY3B5KHNoYTEsIG4pOworCQkJcGF0Y2hsZW4gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgY29tbWl0IGNvbW1lbnRzICovCisJCWlmICghcGF0Y2hsZW4gJiYgbWVtY21wKGxpbmUsICJkaWZmICIsIDUpKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIGdpdC1kaWZmIGluZGV4IGhlYWRlciAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiaW5kZXggIiwgNikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUgbGluZSBudW1iZXJzIHdoZW4gY29tcHV0aW5nIHRoZSBTSEExIG9mIHRoZSBwYXRjaCAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiQEAgLSIsIDQpKQorCQkJY29udGludWU7CisKKwkJLyogQ29tcHV0ZSB0aGUgc2hhIHdpdGhvdXQgd2hpdGVzcGFjZSAqLworCQlsZW4gPSByZW1vdmVfc3BhY2UobGluZSk7CisJCXBhdGNobGVuICs9IGxlbjsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgbGluZSwgbGVuKTsKKwl9CisJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBhdGNoX2lkX3VzYWdlW10gPSAiZ2l0LXBhdGNoLWlkIDwgcGF0Y2giOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgIT0gMSkKKwkJdXNhZ2UocGF0Y2hfaWRfdXNhZ2UpOworCisJZ2VuZXJhdGVfaWRfbGlzdCgpOworCXJldHVybiAwOworfQkKZGlmZiAtLWdpdCBhL3BhdGNoLWlkcy5jIGIvcGF0Y2gtaWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4OGZhYwotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWlkcy5jCkBAIC0wLDAgKzEsMTkyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGF0Y2gtaWRzLmgiCisKK3N0YXRpYyBpbnQgY29tbWl0X3BhdGNoX2lkKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGNvbW1pdC0+cGFyZW50cykKKwkJZGlmZl90cmVlX3NoYTEoY29tbWl0LT5wYXJlbnRzLT5pdGVtLT5vYmplY3Quc2hhMSwKKwkJICAgICAgICAgICAgICAgY29tbWl0LT5vYmplY3Quc2hhMSwgIiIsIG9wdGlvbnMpOworCWVsc2UKKwkJZGlmZl9yb290X3RyZWVfc2hhMShjb21taXQtPm9iamVjdC5zaGExLCAiIiwgb3B0aW9ucyk7CisJZGlmZmNvcmVfc3RkKG9wdGlvbnMpOworCXJldHVybiBkaWZmX2ZsdXNoX3BhdGNoX2lkKG9wdGlvbnMsIHNoYTEpOworfQorCitzdGF0aWMgdWludDMyX3QgdGFrZTIoY29uc3QgdW5zaWduZWQgY2hhciAqaWQpCit7CisJcmV0dXJuICgoaWRbMF0gPDwgOCkgfCBpZFsxXSk7Cit9CisKKy8qCisgKiBDb252ZW50aW9uYWwgYmluYXJ5IHNlYXJjaCBsb29wIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgKiAgICAgIGRvIHsKKyAqICAgICAgICAgICAgICBpbnQgbWkgPSAobG8gKyBoaSkgLyAyOworICogICAgICAgICAgICAgIGludCBjbXAgPSAiZW50cnkgcG9pbnRlZCBhdCBieSBtaSIgbWludXMgInRhcmdldCI7CisgKiAgICAgICAgICAgICAgaWYgKCFjbXApCisgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1pIGlzIHRoZSB3YW50ZWQgb25lKQorICogICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICogICAgICAgICAgICAgICAgICAgICAgaGkgPSBtaTsgIm1pIGlzIGxhcmdlciB0aGFuIHRhcmdldCIKKyAqICAgICAgICAgICAgICBlbHNlCisgKiAgICAgICAgICAgICAgICAgICAgICBsbyA9IG1pKzE7ICJtaSBpcyBzbWFsbGVyIHRoYW4gdGFyZ2V0IgorICogICAgICB9IHdoaWxlIChsbyA8IGhpKTsKKyAqCisgKiBUaGUgaW52YXJpYW50cyBhcmU6CisgKgorICogLSBXaGVuIGVudGVyaW5nIHRoZSBsb29wLCBsbyBwb2ludHMgYXQgYSBzbG90IHRoYXQgaXMgbmV2ZXIKKyAqICAgYWJvdmUgdGhlIHRhcmdldCAoaXQgY291bGQgYmUgYXQgdGhlIHRhcmdldCksIGhpIHBvaW50cyBhdCBhCisgKiAgIHNsb3QgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIHRoZSB0YXJnZXQgKGl0IGNhbiBuZXZlcgorICogICBiZSBhdCB0aGUgdGFyZ2V0KS4KKyAqCisgKiAtIFdlIGZpbmQgYSBwb2ludCAnbWknIGJldHdlZW4gbG8gYW5kIGhpIChtaSBjb3VsZCBiZSB0aGUgc2FtZQorICogICBhcyBsbywgYnV0IG5ldmVyIGNhbiBiZSB0aGUgc2FtZSBhcyBoaSksIGFuZCBjaGVjayBpZiBpdCBoaXRzCisgKiAgIHRoZSB0YXJnZXQuICBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6CisgKgorICogICAgLSBpZiBpdCBpcyBhIGhpdCwgd2UgYXJlIGhhcHB5LgorICoKKyAqICAgIC0gaWYgaXQgaXMgc3RyaWN0bHkgaGlnaGVyIHRoYW4gdGhlIHRhcmdldCwgd2UgdXBkYXRlIGhpIHdpdGgKKyAqICAgICAgaXQuCisgKgorICogICAgLSBpZiBpdCBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHdlIHVwZGF0ZSBsbyB0byBiZQorICogICAgICBvbmUgc2xvdCBhZnRlciBpdCwgYmVjYXVzZSB3ZSBhbGxvdyBsbyB0byBiZSBhdCB0aGUgdGFyZ2V0LgorICoKKyAqIFdoZW4gY2hvb3NpbmcgJ21pJywgd2UgZG8gbm90IGhhdmUgdG8gdGFrZSB0aGUgIm1pZGRsZSIgYnV0CisgKiBhbnl3aGVyZSBpbiBiZXR3ZWVuIGxvIGFuZCBoaSwgYXMgbG9uZyBhcyBsbyA8PSBtaSA8IGhpIGlzCisgKiBzYXRpc2ZpZWQuICBXaGVuIHdlIHNvbWVob3cga25vdyB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZQorICogdGFyZ2V0IGFuZCBsbyBpcyBtdWNoIHNob3J0ZXIgdGhhbiB0aGUgdGFyZ2V0IGFuZCBoaSwgd2UgY291bGQKKyAqIHBpY2sgbWkgdGhhdCBpcyBtdWNoIGNsb3NlciB0byBsbyB0aGFuIHRoZSBtaWR3YXkuCisgKi8KK3N0YXRpYyBpbnQgcGF0Y2hfcG9zKHN0cnVjdCBwYXRjaF9pZCAqKnRhYmxlLCBpbnQgbnIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlkKQoreworCWludCBoaSA9IG5yOworCWludCBsbyA9IDA7CisJaW50IG1pID0gMDsKKworCWlmICghbnIpCisJCXJldHVybiAtMTsKKworCWlmIChuciAhPSAxKSB7CisJCXVuc2lnbmVkIGxvdiwgaGl2LCBtaXYsIG9mczsKKworCQlmb3IgKG9mcyA9IDA7IG9mcyA8IDE4OyBvZnMgKz0gMikgeworCQkJbG92ID0gdGFrZTIodGFibGVbMF0tPnBhdGNoX2lkICsgb2ZzKTsKKwkJCWhpdiA9IHRha2UyKHRhYmxlW25yLTFdLT5wYXRjaF9pZCArIG9mcyk7CisJCQltaXYgPSB0YWtlMihpZCArIG9mcyk7CisJCQlpZiAobWl2IDwgbG92KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChoaXYgPCBtaXYpCisJCQkJcmV0dXJuIC0xIC0gbnI7CisJCQlpZiAobG92ICE9IGhpdikgeworCQkJCS8qCisJCQkJICogQXQgdGhpcyBwb2ludCBtaXYgY291bGQgYmUgZXF1YWwKKwkJCQkgKiB0byBoaXYgKGJ1dCBpZCBjb3VsZCBzdGlsbCBiZSBoaWdoZXIpOworCQkJCSAqIHRoZSBpbnZhcmlhbnQgb2YgKG1pIDwgaGkpIHNob3VsZCBiZQorCQkJCSAqIGtlcHQuCisJCQkJICovCisJCQkJbWkgPSAobnItMSkgKiAobWl2IC0gbG92KSAvIChoaXYgLSBsb3YpOworCQkJCWlmIChsbyA8PSBtaSAmJiBtaSA8IGhpKQorCQkJCQlicmVhazsKKwkJCQlkaWUoIm9vcHMiKTsKKwkJCX0KKwkJfQorCQlpZiAoMTggPD0gb2ZzKQorCQkJZGllKCJjYW5ub3QgaGFwcGVuIC0tIGxvIGFuZCBoaSBhcmUgaWRlbnRpY2FsIik7CisJfQorCisJZG8geworCQlpbnQgY21wOworCQljbXAgPSBoYXNoY21wKHRhYmxlW21pXS0+cGF0Y2hfaWQsIGlkKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gbWk7CisJCWlmIChjbXAgPiAwKQorCQkJaGkgPSBtaTsKKwkJZWxzZQorCQkJbG8gPSBtaSArIDE7CisJCW1pID0gKGhpICsgbG8pIC8gMjsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlyZXR1cm4gLWxvLTE7Cit9CisKKyNkZWZpbmUgQlVDS0VUX1NJWkUgMTkwIC8qIDE5MCAqIDIxID0gMzk5MCwgd2l0aCBzbG9wIGNsb3NlIGVub3VnaCB0byA0SyAqLworc3RydWN0IHBhdGNoX2lkX2J1Y2tldCB7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqbmV4dDsKKwlpbnQgbnI7CisJc3RydWN0IHBhdGNoX2lkIGJ1Y2tldFtCVUNLRVRfU0laRV07Cit9OworCitpbnQgaW5pdF9wYXRjaF9pZHMoc3RydWN0IHBhdGNoX2lkcyAqaWRzKQoreworCW1lbXNldChpZHMsIDAsIHNpemVvZigqaWRzKSk7CisJZGlmZl9zZXR1cCgmaWRzLT5kaWZmb3B0cyk7CisJaWRzLT5kaWZmb3B0cy5yZWN1cnNpdmUgPSAxOworCWlmIChkaWZmX3NldHVwX2RvbmUoJmlkcy0+ZGlmZm9wdHMpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJkaWZmX3NldHVwX2RvbmUgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmcmVlX3BhdGNoX2lkcyhzdHJ1Y3QgcGF0Y2hfaWRzICppZHMpCit7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqbmV4dCwgKnBhdGNoZXM7CisKKwlmcmVlKGlkcy0+dGFibGUpOworCWZvciAocGF0Y2hlcyA9IGlkcy0+cGF0Y2hlczsgcGF0Y2hlczsgcGF0Y2hlcyA9IG5leHQpIHsKKwkJbmV4dCA9IHBhdGNoZXMtPm5leHQ7CisJCWZyZWUocGF0Y2hlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBhdGNoX2lkICphZGRfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkgICBzdHJ1Y3QgcGF0Y2hfaWRzICppZHMsCisJCQkJICAgaW50IG5vX2FkZCkKK3sKKwlzdHJ1Y3QgcGF0Y2hfaWRfYnVja2V0ICpidWNrZXQ7CisJc3RydWN0IHBhdGNoX2lkICplbnQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcG9zOworCisJaWYgKGNvbW1pdF9wYXRjaF9pZChjb21taXQsICZpZHMtPmRpZmZvcHRzLCBzaGExKSkKKwkJcmV0dXJuIE5VTEw7CisJcG9zID0gcGF0Y2hfcG9zKGlkcy0+dGFibGUsIGlkcy0+bnIsIHNoYTEpOworCWlmICgwIDw9IHBvcykKKwkJcmV0dXJuIGlkcy0+dGFibGVbcG9zXTsKKwlpZiAobm9fYWRkKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IC0xIC0gcG9zOworCisJYnVja2V0ID0gaWRzLT5wYXRjaGVzOworCWlmICghYnVja2V0IHx8IChCVUNLRVRfU0laRSA8PSBidWNrZXQtPm5yKSkgeworCQlidWNrZXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqYnVja2V0KSk7CisJCWJ1Y2tldC0+bmV4dCA9IGlkcy0+cGF0Y2hlczsKKwkJaWRzLT5wYXRjaGVzID0gYnVja2V0OworCX0KKwllbnQgPSAmYnVja2V0LT5idWNrZXRbYnVja2V0LT5ucisrXTsKKwloYXNoY3B5KGVudC0+cGF0Y2hfaWQsIHNoYTEpOworCisJaWYgKGlkcy0+YWxsb2MgPD0gaWRzLT5ucikgeworCQlpZHMtPmFsbG9jID0gYWxsb2NfbnIoaWRzLT5ucik7CisJCWlkcy0+dGFibGUgPSB4cmVhbGxvYyhpZHMtPnRhYmxlLCBzaXplb2YoZW50KSAqIGlkcy0+YWxsb2MpOworCX0KKwlpZiAocG9zIDwgaWRzLT5ucikKKwkJbWVtbW92ZShpZHMtPnRhYmxlICsgcG9zICsgMSwgaWRzLT50YWJsZSArIHBvcywKKwkJCXNpemVvZihlbnQpICogKGlkcy0+bnIgLSBwb3MpKTsKKwlpZHMtPm5yKys7CisJaWRzLT50YWJsZVtwb3NdID0gZW50OworCXJldHVybiBpZHMtPnRhYmxlW3Bvc107Cit9CisKK3N0cnVjdCBwYXRjaF9pZCAqaGFzX2NvbW1pdF9wYXRjaF9pZChzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkJICAgICBzdHJ1Y3QgcGF0Y2hfaWRzICppZHMpCit7CisJcmV0dXJuIGFkZF9jb21taXQoY29tbWl0LCBpZHMsIDEpOworfQorCitzdHJ1Y3QgcGF0Y2hfaWQgKmFkZF9jb21taXRfcGF0Y2hfaWQoc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJCSAgICAgc3RydWN0IHBhdGNoX2lkcyAqaWRzKQoreworCXJldHVybiBhZGRfY29tbWl0KGNvbW1pdCwgaWRzLCAwKTsKK30KZGlmZiAtLWdpdCBhL3BhdGNoLWlkcy5oIGIvcGF0Y2gtaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjN2NhMQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWlkcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgUEFUQ0hfSURTX0gKKyNkZWZpbmUgUEFUQ0hfSURTX0gKKworc3RydWN0IHBhdGNoX2lkIHsKKwl1bnNpZ25lZCBjaGFyIHBhdGNoX2lkWzIwXTsKKwljaGFyIHNlZW47Cit9OworCitzdHJ1Y3QgcGF0Y2hfaWRzIHsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZvcHRzOworCWludCBuciwgYWxsb2M7CisJc3RydWN0IHBhdGNoX2lkICoqdGFibGU7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqcGF0Y2hlczsKK307CisKK2ludCBpbml0X3BhdGNoX2lkcyhzdHJ1Y3QgcGF0Y2hfaWRzICopOworaW50IGZyZWVfcGF0Y2hfaWRzKHN0cnVjdCBwYXRjaF9pZHMgKik7CitzdHJ1Y3QgcGF0Y2hfaWQgKmFkZF9jb21taXRfcGF0Y2hfaWQoc3RydWN0IGNvbW1pdCAqLCBzdHJ1Y3QgcGF0Y2hfaWRzICopOworc3RydWN0IHBhdGNoX2lkICpoYXNfY29tbWl0X3BhdGNoX2lkKHN0cnVjdCBjb21taXQgKiwgc3RydWN0IHBhdGNoX2lkcyAqKTsKKworI2VuZGlmIC8qIFBBVENIX0lEU19IICovCmRpZmYgLS1naXQgYS9wYXRoLWxpc3QuYyBiL3BhdGgtbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYWE1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRoLWxpc3QuYwpAQCAtMCwwICsxLDEwMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKKy8qIGlmIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBwb2ludCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVudHJ5IGNvdWxkIGJlCisgKiBpbnNlcnRlZCAqLworc3RhdGljIGludCBnZXRfZW50cnlfaW5kZXgoY29uc3Qgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGF0aCwKKwkJaW50ICpleGFjdF9tYXRjaCkKK3sKKwlpbnQgbGVmdCA9IC0xLCByaWdodCA9IGxpc3QtPm5yOworCisJd2hpbGUgKGxlZnQgKyAxIDwgcmlnaHQpIHsKKwkJaW50IG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKwkJaW50IGNvbXBhcmUgPSBzdHJjbXAocGF0aCwgbGlzdC0+aXRlbXNbbWlkZGxlXS5wYXRoKTsKKwkJaWYgKGNvbXBhcmUgPCAwKQorCQkJcmlnaHQgPSBtaWRkbGU7CisJCWVsc2UgaWYgKGNvbXBhcmUgPiAwKQorCQkJbGVmdCA9IG1pZGRsZTsKKwkJZWxzZSB7CisJCQkqZXhhY3RfbWF0Y2ggPSAxOworCQkJcmV0dXJuIG1pZGRsZTsKKwkJfQorCX0KKworCSpleGFjdF9tYXRjaCA9IDA7CisJcmV0dXJuIHJpZ2h0OworfQorCisvKiByZXR1cm5zIC0xLWluZGV4IGlmIGFscmVhZHkgZXhpc3RzICovCitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBleGFjdF9tYXRjaDsKKwlpbnQgaW5kZXggPSBnZXRfZW50cnlfaW5kZXgobGlzdCwgcGF0aCwgJmV4YWN0X21hdGNoKTsKKworCWlmIChleGFjdF9tYXRjaCkKKwkJcmV0dXJuIC0xIC0gaW5kZXg7CisKKwlpZiAobGlzdC0+bnIgKyAxID49IGxpc3QtPmFsbG9jKSB7CisJCWxpc3QtPmFsbG9jICs9IDMyOworCQlsaXN0LT5pdGVtcyA9IHhyZWFsbG9jKGxpc3QtPml0ZW1zLCBsaXN0LT5hbGxvYworCQkJCSogc2l6ZW9mKHN0cnVjdCBwYXRoX2xpc3RfaXRlbSkpOworCX0KKwlpZiAoaW5kZXggPCBsaXN0LT5ucikKKwkJbWVtbW92ZShsaXN0LT5pdGVtcyArIGluZGV4ICsgMSwgbGlzdC0+aXRlbXMgKyBpbmRleCwKKwkJCQkobGlzdC0+bnIgLSBpbmRleCkKKwkJCQkqIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0pKTsKKwlsaXN0LT5pdGVtc1tpbmRleF0ucGF0aCA9IGxpc3QtPnN0cmR1cF9wYXRocyA/CisJCXhzdHJkdXAocGF0aCkgOiAoY2hhciAqKXBhdGg7CisJbGlzdC0+aXRlbXNbaW5kZXhdLnV0aWwgPSBOVUxMOworCWxpc3QtPm5yKys7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0cnVjdCBwYXRoX2xpc3RfaXRlbSAqcGF0aF9saXN0X2luc2VydChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCWludCBpbmRleCA9IGFkZF9lbnRyeShsaXN0LCBwYXRoKTsKKworCWlmIChpbmRleCA8IDApCisJCWluZGV4ID0gLTEgLSBpbmRleDsKKworCXJldHVybiBsaXN0LT5pdGVtcyArIGluZGV4OworfQorCitpbnQgcGF0aF9saXN0X2hhc19wYXRoKGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGV4YWN0X21hdGNoOworCWdldF9lbnRyeV9pbmRleChsaXN0LCBwYXRoLCAmZXhhY3RfbWF0Y2gpOworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfbG9va3VwKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJaW50IGV4YWN0X21hdGNoLCBpID0gZ2V0X2VudHJ5X2luZGV4KGxpc3QsIHBhdGgsICZleGFjdF9tYXRjaCk7CisJaWYgKCFleGFjdF9tYXRjaCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxpc3QtPml0ZW1zICsgaTsKK30KKwordm9pZCBwYXRoX2xpc3RfY2xlYXIoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgaW50IGZyZWVfaXRlbXMpCit7CisJaWYgKGxpc3QtPml0ZW1zKSB7CisJCWludCBpOworCQlpZiAoZnJlZV9pdGVtcykKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKSB7CisJCQkJaWYgKGxpc3QtPnN0cmR1cF9wYXRocykKKwkJCQkJZnJlZShsaXN0LT5pdGVtc1tpXS5wYXRoKTsKKwkJCQlmcmVlKGxpc3QtPml0ZW1zW2ldLnV0aWwpOworCQkJfQorCQlmcmVlKGxpc3QtPml0ZW1zKTsKKwl9CisJbGlzdC0+aXRlbXMgPSBOVUxMOworCWxpc3QtPm5yID0gbGlzdC0+YWxsb2MgPSAwOworfQorCit2b2lkIHByaW50X3BhdGhfbGlzdChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpwKQoreworCWludCBpOworCWlmICggdGV4dCApCisJCXByaW50ZigiJXNcbiIsIHRleHQpOworCWZvciAoaSA9IDA7IGkgPCBwLT5ucjsgaSsrKQorCQlwcmludGYoIiVzOiVwXG4iLCBwLT5pdGVtc1tpXS5wYXRoLCBwLT5pdGVtc1tpXS51dGlsKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGF0aC1saXN0LmggYi9wYXRoLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVmZmFiCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC1saXN0LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBQQVRIX0xJU1RfSAorI2RlZmluZSBQQVRIX0xJU1RfSAorCitzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0geworCWNoYXIgKnBhdGg7CisJdm9pZCAqdXRpbDsKK307CitzdHJ1Y3QgcGF0aF9saXN0Cit7CisJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtczsKKwl1bnNpZ25lZCBpbnQgbnIsIGFsbG9jOworCXVuc2lnbmVkIGludCBzdHJkdXBfcGF0aHM6MTsKK307CisKK3ZvaWQgcHJpbnRfcGF0aF9saXN0KGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKnApOworCitpbnQgcGF0aF9saXN0X2hhc19wYXRoKGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgpOwordm9pZCBwYXRoX2xpc3RfY2xlYXIoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgaW50IGZyZWVfaXRlbXMpOworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfaW5zZXJ0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfbG9va3VwKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworCisjZW5kaWYgLyogUEFUSF9MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3BhdGguYyBiL3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk1Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogSSdtIHRpcmVkIG9mIGRvaW5nICJ2c25wcmludGYoKSIgZXRjIGp1c3QgdG8gb3BlbiBhCisgKiBmaWxlLCBzbyBoZXJlJ3MgYSAicmV0dXJuIHN0YXRpYyBidWZmZXIgd2l0aCBwcmludGYiCisgKiBpbnRlcmZhY2UgZm9yIHBhdGhzLgorICoKKyAqIEl0J3Mgb2J2aW91c2x5IG5vdCB0aHJlYWQtc2FmZS4gU3VlIG1lLiBCdXQgaXQncyBxdWl0ZQorICogdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZQorICoKKyAqICAgZiA9IG9wZW4obWtwYXRoKCIlcy8lcy5naXQiLCBiYXNlLCBuYW1lKSwgT19SRE9OTFkpOworICoKKyAqIHdoaWNoIGlzIHdoYXQgaXQncyBkZXNpZ25lZCBmb3IuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY2hhciBiYWRfcGF0aFtdID0gIi9iYWQtcGF0aC8iOworCitzdGF0aWMgY2hhciAqZ2V0X3BhdGhuYW1lKHZvaWQpCit7CisJc3RhdGljIGNoYXIgcGF0aG5hbWVfYXJyYXlbNF1bUEFUSF9NQVhdOworCXN0YXRpYyBpbnQgaW5kZXg7CisJcmV0dXJuIHBhdGhuYW1lX2FycmF5WzMgJiArK2luZGV4XTsKK30KKworc3RhdGljIGNoYXIgKmNsZWFudXBfcGF0aChjaGFyICpwYXRoKQoreworCS8qIENsZWFuIGl0IHVwICovCisJaWYgKCFtZW1jbXAocGF0aCwgIi4vIiwgMikpIHsKKwkJcGF0aCArPSAyOworCQl3aGlsZSAoKnBhdGggPT0gJy8nKQorCQkJcGF0aCsrOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworY2hhciAqbWtwYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBsZW47CisJY2hhciAqcGF0aG5hbWUgPSBnZXRfcGF0aG5hbWUoKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHBhdGhuYW1lLCBQQVRIX01BWCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJcmV0dXJuIGJhZF9wYXRoOworCXJldHVybiBjbGVhbnVwX3BhdGgocGF0aG5hbWUpOworfQorCitjaGFyICpnaXRfcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljb25zdCBjaGFyICpnaXRfZGlyID0gZ2V0X2dpdF9kaXIoKTsKKwljaGFyICpwYXRobmFtZSA9IGdldF9wYXRobmFtZSgpOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBsZW47CisKKwlsZW4gPSBzdHJsZW4oZ2l0X2Rpcik7CisJaWYgKGxlbiA+IFBBVEhfTUFYLTEwMCkKKwkJcmV0dXJuIGJhZF9wYXRoOworCW1lbWNweShwYXRobmFtZSwgZ2l0X2RpciwgbGVuKTsKKwlpZiAobGVuICYmIGdpdF9kaXJbbGVuLTFdICE9ICcvJykKKwkJcGF0aG5hbWVbbGVuKytdID0gJy8nOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuICs9IHZzbnByaW50ZihwYXRobmFtZSArIGxlbiwgUEFUSF9NQVggLSBsZW4sIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCXJldHVybiBiYWRfcGF0aDsKKwlyZXR1cm4gY2xlYW51cF9wYXRoKHBhdGhuYW1lKTsKK30KKworCisvKiBnaXRfbWtzdGVtcCgpIC0gY3JlYXRlIHRtcCBmaWxlIGhvbm9yaW5nIFRNUERJUiB2YXJpYWJsZSAqLworaW50IGdpdF9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnRlbXBsYXRlKQoreworCWNoYXIgKmVudiwgKnBjaCA9IHBhdGg7CisKKwlpZiAoKGVudiA9IGdldGVudigiVE1QRElSIikpID09IE5VTEwpIHsKKwkJc3RyY3B5KHBjaCwgIi90bXAvIik7CisJCWxlbiAtPSA1OworCQlwY2ggKz0gNTsKKwl9IGVsc2UgeworCQlzaXplX3QgbiA9IHNucHJpbnRmKHBjaCwgbGVuLCAiJXMvIiwgZW52KTsKKworCQlsZW4gLT0gbjsKKwkJcGNoICs9IG47CisJfQorCisJc3RybGNweShwY2gsIHRlbXBsYXRlLCBsZW4pOworCisJcmV0dXJuIG1rc3RlbXAocGF0aCk7Cit9CisKKworaW50IHZhbGlkYXRlX2hlYWRyZWYoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpidWYsIGJ1ZmZlclsyNTZdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IGxlbiwgZmQ7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSBpdCBpcyBhICJyZWZzLy4uIiBzeW1saW5rICovCisJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJbGVuID0gcmVhZGxpbmsocGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJaWYgKGxlbiA+PSA1ICYmICFtZW1jbXAoInJlZnMvIiwgYnVmZmVyLCA1KSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBBbnl0aGluZyBlbHNlLCBqdXN0IG9wZW4gaXQgYW5kIHRyeSB0byBzZWUgaWYgaXQgaXMgYSBzeW1ib2xpYyByZWYuCisJICovCisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisJbGVuID0gcmVhZF9pbl9mdWxsKGZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogSXMgaXQgYSBzeW1ib2xpYyByZWY/CisJICovCisJaWYgKGxlbiA8IDQpCisJCXJldHVybiAtMTsKKwlpZiAoIW1lbWNtcCgicmVmOiIsIGJ1ZmZlciwgNCkpIHsKKwkJYnVmID0gYnVmZmVyICsgNDsKKwkJbGVuIC09IDQ7CisJCXdoaWxlIChsZW4gJiYgaXNzcGFjZSgqYnVmKSkKKwkJCWJ1ZisrLCBsZW4tLTsKKwkJaWYgKGxlbiA+PSA1ICYmICFtZW1jbXAoInJlZnMvIiwgYnVmLCA1KSkKKwkJCXJldHVybiAwOworCX0KKworCS8qCisJICogSXMgdGhpcyBhIGRldGFjaGVkIEhFQUQ/CisJICovCisJaWYgKCFnZXRfc2hhMV9oZXgoYnVmZmVyLCBzaGExKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjaGFyICp1c2VyX3BhdGgoY2hhciAqYnVmLCBjaGFyICpwYXRoLCBpbnQgc3opCit7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJY2hhciAqc2xhc2g7CisJaW50IGxlbiwgYmFzZWxlbjsKKworCWlmICghcGF0aCB8fCBwYXRoWzBdICE9ICd+JykKKwkJcmV0dXJuIE5VTEw7CisJcGF0aCsrOworCXNsYXNoID0gc3RyY2hyKHBhdGgsICcvJyk7CisJaWYgKHBhdGhbMF0gPT0gJy8nIHx8ICFwYXRoWzBdKSB7CisJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCX0KKwllbHNlIHsKKwkJaWYgKHNsYXNoKSB7CisJCQkqc2xhc2ggPSAwOworCQkJcHcgPSBnZXRwd25hbShwYXRoKTsKKwkJCSpzbGFzaCA9ICcvJzsKKwkJfQorCQllbHNlCisJCQlwdyA9IGdldHB3bmFtKHBhdGgpOworCX0KKwlpZiAoIXB3IHx8ICFwdy0+cHdfZGlyIHx8IHN6IDw9IHN0cmxlbihwdy0+cHdfZGlyKSkKKwkJcmV0dXJuIE5VTEw7CisJYmFzZWxlbiA9IHN0cmxlbihwdy0+cHdfZGlyKTsKKwltZW1jcHkoYnVmLCBwdy0+cHdfZGlyLCBiYXNlbGVuKTsKKwl3aGlsZSAoKDEgPCBiYXNlbGVuKSAmJiAoYnVmW2Jhc2VsZW4tMV0gPT0gJy8nKSkgeworCQlidWZbYmFzZWxlbi0xXSA9IDA7CisJCWJhc2VsZW4tLTsKKwl9CisJaWYgKHNsYXNoICYmIHNsYXNoWzFdKSB7CisJCWxlbiA9IHN0cmxlbihzbGFzaCk7CisJCWlmIChzeiA8PSBiYXNlbGVuICsgbGVuKQorCQkJcmV0dXJuIE5VTEw7CisJCW1lbWNweShidWYgKyBiYXNlbGVuLCBzbGFzaCwgbGVuICsgMSk7CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBGaXJzdCwgb25lIGRpcmVjdG9yeSB0byB0cnkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobS4KKyAqCisgKiAoMCkgSWYgInN0cmljdCIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIHVzZWQgYXMgZ2l2ZW4gYW5kIG5vIERXSU0gaXMKKyAqICAgICBkb25lLiBPdGhlcndpc2U6CisgKiAoMSkgIn4vcGF0aCIgdG8gbWVhbiBwYXRoIHVuZGVyIHRoZSBydW5uaW5nIHVzZXIncyBob21lIGRpcmVjdG9yeTsKKyAqICgyKSAifnVzZXIvcGF0aCIgdG8gbWVhbiBwYXRoIHVuZGVyIG5hbWVkIHVzZXIncyBob21lIGRpcmVjdG9yeTsKKyAqICgzKSAicmVsYXRpdmUvcGF0aCIgdG8gbWVhbiBjd2QgcmVsYXRpdmUgZGlyZWN0b3J5OyBvcgorICogKDQpICIvYWJzb2x1dGUvcGF0aCIgdG8gbWVhbiBhYnNvbHV0ZSBkaXJlY3RvcnkuCisgKgorICogVW5sZXNzICJzdHJpY3QiIGlzIGdpdmVuLCB3ZSB0cnkgYWNjZXNzKCkgZm9yIGV4aXN0ZW5jZSBvZiAiJXMuZ2l0Ly5naXQiLAorICogIiVzLy5naXQiLCAiJXMuZ2l0IiwgIiVzIiBpbiB0aGlzIG9yZGVyLiAgVGhlIGZpcnN0IG9uZSB0aGF0IGV4aXN0cyBpcworICogd2hhdCB3ZSB0cnkuCisgKgorICogU2Vjb25kLCB3ZSB0cnkgY2hkaXIoKSB0byB0aGF0LiAgVXBvbiBmYWlsdXJlLCB3ZSByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGVuLCB3ZSB0cnkgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGEgdmFsaWQgZ2l0IHJlcG9zaXRvcnkuCisgKiBVcG9uIGZhaWx1cmUsIHdlIHJldHVybiBOVUxMLgorICoKKyAqIElmIGFsbCBnb2VzIHdlbGwsIHdlIHJldHVybiB0aGUgZGlyZWN0b3J5IHdlIHVzZWQgdG8gY2hkaXIoKSAoYnV0CisgKiBiZWZvcmUgfnVzZXIgaXMgZXhwYW5kZWQpLCBhdm9pZGluZyBnZXRjd2QoKSByZXNvbHZpbmcgc3ltYm9saWMKKyAqIGxpbmtzLiAgVXNlciByZWxhdGl2ZSBwYXRocyBhcmUgYWxzbyByZXR1cm5lZCBhcyB0aGV5IGFyZSBnaXZlbiwKKyAqIGV4Y2VwdCBEV0lNIHN1ZmZpeGluZy4KKyAqLworY2hhciAqZW50ZXJfcmVwbyhjaGFyICpwYXRoLCBpbnQgc3RyaWN0KQoreworCXN0YXRpYyBjaGFyIHVzZWRfcGF0aFtQQVRIX01BWF07CisJc3RhdGljIGNoYXIgdmFsaWRhdGVkX3BhdGhbUEFUSF9NQVhdOworCisJaWYgKCFwYXRoKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghc3RyaWN0KSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpzdWZmaXhbXSA9IHsKKwkJCSIuZ2l0Ly5naXQiLCAiLy5naXQiLCAiLmdpdCIsICIiLCBOVUxMLAorCQl9OworCQlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCQlpbnQgaTsKKwkJd2hpbGUgKCgxIDwgbGVuKSAmJiAocGF0aFtsZW4tMV0gPT0gJy8nKSkgeworCQkJcGF0aFtsZW4tMV0gPSAwOworCQkJbGVuLS07CisJCX0KKwkJaWYgKFBBVEhfTUFYIDw9IGxlbikKKwkJCXJldHVybiBOVUxMOworCQlpZiAocGF0aFswXSA9PSAnficpIHsKKwkJCWlmICghdXNlcl9wYXRoKHVzZWRfcGF0aCwgcGF0aCwgUEFUSF9NQVgpKQorCQkJCXJldHVybiBOVUxMOworCQkJc3RyY3B5KHZhbGlkYXRlZF9wYXRoLCBwYXRoKTsKKwkJCXBhdGggPSB1c2VkX3BhdGg7CisJCX0KKwkJZWxzZSBpZiAoUEFUSF9NQVggLSAxMCA8IGxlbikKKwkJCXJldHVybiBOVUxMOworCQllbHNlIHsKKwkJCXBhdGggPSBzdHJjcHkodXNlZF9wYXRoLCBwYXRoKTsKKwkJCXN0cmNweSh2YWxpZGF0ZWRfcGF0aCwgcGF0aCk7CisJCX0KKwkJbGVuID0gc3RybGVuKHBhdGgpOworCQlmb3IgKGkgPSAwOyBzdWZmaXhbaV07IGkrKykgeworCQkJc3RyY3B5KHBhdGggKyBsZW4sIHN1ZmZpeFtpXSk7CisJCQlpZiAoIWFjY2VzcyhwYXRoLCBGX09LKSkgeworCQkJCXN0cmNhdCh2YWxpZGF0ZWRfcGF0aCwgc3VmZml4W2ldKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN1ZmZpeFtpXSB8fCBjaGRpcihwYXRoKSkKKwkJCXJldHVybiBOVUxMOworCQlwYXRoID0gdmFsaWRhdGVkX3BhdGg7CisJfQorCWVsc2UgaWYgKGNoZGlyKHBhdGgpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChhY2Nlc3MoIm9iamVjdHMiLCBYX09LKSA9PSAwICYmIGFjY2VzcygicmVmcyIsIFhfT0spID09IDAgJiYKKwkgICAgdmFsaWRhdGVfaGVhZHJlZigiSEVBRCIpID09IDApIHsKKwkJc2V0ZW52KCJHSVRfRElSIiwgIi4iLCAxKTsKKwkJY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQoKTsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhZGp1c3Rfc2hhcmVkX3Blcm0oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgbW9kZTsKKworCWlmICghc2hhcmVkX3JlcG9zaXRvcnkpCisJCXJldHVybiAwOworCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIC0xOworCW1vZGUgPSBzdC5zdF9tb2RlOworCWlmIChtb2RlICYgU19JUlVTUikKKwkJbW9kZSB8PSAoc2hhcmVkX3JlcG9zaXRvcnkgPT0gUEVSTV9HUk9VUAorCQkJID8gU19JUkdSUAorCQkJIDogKHNoYXJlZF9yZXBvc2l0b3J5ID09IFBFUk1fRVZFUllCT0RZCisJCQkgICAgPyAoU19JUkdSUHxTX0lST1RIKQorCQkJICAgIDogMCkpOworCisJaWYgKG1vZGUgJiBTX0lXVVNSKQorCQltb2RlIHw9IFNfSVdHUlA7CisKKwlpZiAobW9kZSAmIFNfSVhVU1IpCisJCW1vZGUgfD0gKHNoYXJlZF9yZXBvc2l0b3J5ID09IFBFUk1fR1JPVVAKKwkJCSA/IFNfSVhHUlAKKwkJCSA6IChzaGFyZWRfcmVwb3NpdG9yeSA9PSBQRVJNX0VWRVJZQk9EWQorCQkJICAgID8gKFNfSVhHUlB8U19JWE9USCkKKwkJCSAgICA6IDApKTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJbW9kZSB8PSBTX0lTR0lEOworCWlmICgobW9kZSAmIHN0LnN0X21vZGUpICE9IG1vZGUgJiYgY2htb2QocGF0aCwgbW9kZSkgPCAwKQorCQlyZXR1cm4gLTI7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wZWVrLXJlbW90ZS5jIGIvcGVlay1yZW1vdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmJmYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGVlay1yZW1vdGUuYwpAQCAtMCwwICsxLDc1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgcGVla19yZW1vdGVfdXNhZ2VbXSA9CisiZ2l0LXBlZWstcmVtb3RlIFstLXVwbG9hZC1wYWNrPTxnaXQtdXBsb2FkLXBhY2s+XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiI7CitzdGF0aWMgY29uc3QgY2hhciAqdXBsb2FkcGFjayA9ICJnaXQtdXBsb2FkLXBhY2siOworCitzdGF0aWMgaW50IHBlZWtfcmVtb3RlKGludCBmZFsyXSwgdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IHJlZiAqcmVmOworCisJZ2V0X3JlbW90ZV9oZWFkcyhmZFswXSwgJnJlZiwgMCwgTlVMTCwgZmxhZ3MpOworCXBhY2tldF9mbHVzaChmZFsxXSk7CisKKwl3aGlsZSAocmVmKSB7CisJCXByaW50ZigiJXMJJXNcbiIsIHNoYTFfdG9faGV4KHJlZi0+b2xkX3NoYTEpLCByZWYtPm5hbWUpOworCQlyZWYgPSByZWYtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIHJldDsKKwljaGFyICpkZXN0ID0gTlVMTDsKKwlpbnQgZmRbMl07CisJcGlkX3QgcGlkOworCWludCBub25naXQgPSAwOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS11cGxvYWQtcGFjaz0iKSkgeworCQkJCXVwbG9hZHBhY2sgPSBhcmcgKyAxNDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhlYz0iKSkgeworCQkJCXVwbG9hZHBhY2sgPSBhcmcgKyA3OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tdGFncyIsIGFyZykpIHsKKwkJCQlmbGFncyB8PSBSRUZfVEFHUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWhlYWRzIiwgYXJnKSkgeworCQkJCWZsYWdzIHw9IFJFRl9IRUFEUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXJlZnMiLCBhcmcpKSB7CisJCQkJZmxhZ3MgfD0gUkVGX05PUk1BTDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKHBlZWtfcmVtb3RlX3VzYWdlKTsKKwkJfQorCQlkZXN0ID0gYXJnOworCQlicmVhazsKKwl9CisKKwlpZiAoIWRlc3QgfHwgaSAhPSBhcmdjIC0gMSkKKwkJdXNhZ2UocGVla19yZW1vdGVfdXNhZ2UpOworCisJcGlkID0gZ2l0X2Nvbm5lY3QoZmQsIGRlc3QsIHVwbG9hZHBhY2spOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKwlyZXQgPSBwZWVrX3JlbW90ZShmZCwgZmxhZ3MpOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJcmV0IHw9IGZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuICEhcmV0OworfQpkaWZmIC0tZ2l0IGEvcGVybC8uZ2l0aWdub3JlIGIvcGVybC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjI0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9wZXJsLy5naXRpZ25vcmUKQEAgLTAsMCArMSw1IEBACitwZXJsLm1haworcGVybC5tYWsub2xkCitibGliCitibGliZGlycworcG1fdG9fYmxpYgpkaWZmIC0tZ2l0IGEvcGVybC9HaXQucG0gYi9wZXJsL0dpdC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQzNjExCi0tLSAvZGV2L251bGwKKysrIGIvcGVybC9HaXQucG0KQEAgLTAsMCArMSw4NzggQEAKKz1oZWFkMSBOQU1FCisKK0dpdCAtIFBlcmwgaW50ZXJmYWNlIHRvIHRoZSBHaXQgdmVyc2lvbiBjb250cm9sIHN5c3RlbQorCis9Y3V0CisKKworcGFja2FnZSBHaXQ7CisKK3VzZSBzdHJpY3Q7CisKKworQkVHSU4geworCitvdXIgKCRWRVJTSU9OLCBASVNBLCBARVhQT1JULCBARVhQT1JUX09LKTsKKworIyBUb3RhbGx5IHVuc3RhYmxlIEFQSS4KKyRWRVJTSU9OID0gJzAuMDEnOworCisKKz1oZWFkMSBTWU5PUFNJUworCisgIHVzZSBHaXQ7CisKKyAgbXkgJHZlcnNpb24gPSBHaXQ6OmNvbW1hbmRfb25lbGluZSgndmVyc2lvbicpOworCisgIGdpdF9jbWRfdHJ5IHsgR2l0Ojpjb21tYW5kX25vaXN5KCd1cGRhdGUtc2VydmVyLWluZm8nKSB9CisgICAgICAgICAgICAgICclcyBmYWlsZWQgdy8gY29kZSAlZCc7CisKKyAgbXkgJHJlcG8gPSBHaXQtPnJlcG9zaXRvcnkgKERpcmVjdG9yeSA9PiAnL3Nydi9naXQvY29naXRvLmdpdCcpOworCisKKyAgbXkgQHJldnMgPSAkcmVwby0+Y29tbWFuZCgncmV2LWxpc3QnLCAnLS1zaW5jZT1sYXN0IG1vbmRheScsICctLWFsbCcpOworCisgIG15ICgkZmgsICRjKSA9ICRyZXBvLT5jb21tYW5kX291dHB1dF9waXBlKCdyZXYtbGlzdCcsICctLXNpbmNlPWxhc3QgbW9uZGF5JywgJy0tYWxsJyk7CisgIG15ICRsYXN0cmV2ID0gPCRmaD47IGNob21wICRsYXN0cmV2OworICAkcmVwby0+Y29tbWFuZF9jbG9zZV9waXBlKCRmaCwgJGMpOworCisgIG15ICRsYXN0cmV2ID0gJHJlcG8tPmNvbW1hbmRfb25lbGluZSggWyAncmV2LWxpc3QnLCAnLS1hbGwnIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RERVJSID0+IDAgKTsKKworPWN1dAorCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK0BJU0EgPSBxdyhFeHBvcnRlcik7CisKK0BFWFBPUlQgPSBxdyhnaXRfY21kX3RyeSk7CisKKyMgTWV0aG9kcyB3aGljaCBjYW4gYmUgY2FsbGVkIGFzIHN0YW5kYWxvbmUgZnVuY3Rpb25zIGFzIHdlbGw6CitARVhQT1JUX09LID0gcXcoY29tbWFuZCBjb21tYW5kX29uZWxpbmUgY29tbWFuZF9ub2lzeQorICAgICAgICAgICAgICAgIGNvbW1hbmRfb3V0cHV0X3BpcGUgY29tbWFuZF9pbnB1dF9waXBlIGNvbW1hbmRfY2xvc2VfcGlwZQorICAgICAgICAgICAgICAgIHZlcnNpb24gZXhlY19wYXRoIGhhc2hfb2JqZWN0IGdpdF9jbWRfdHJ5KTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgUGVybCBzY3JpcHRzIGVhc3kgd2F5IHRvIGludGVyZmFjZSB0aGUgR2l0IHZlcnNpb24gY29udHJvbAorc3lzdGVtLiBUaGUgbW9kdWxlcyBoYXZlIGFuIGVhc3kgYW5kIHdlbGwtdGVzdGVkIHdheSB0byBjYWxsIGFyYml0cmFyeSBHaXQKK2NvbW1hbmRzOyBpbiB0aGUgZnV0dXJlLCB0aGUgaW50ZXJmYWNlIHdpbGwgYWxzbyBwcm92aWRlIHNwZWNpYWxpemVkIG1ldGhvZHMKK2ZvciBkb2luZyBlYXNpbHkgb3BlcmF0aW9ucyB3aGljaCBhcmUgbm90IHRvdGFsbHkgdHJpdmlhbCB0byBkbyBvdmVyCit0aGUgZ2VuZXJpYyBjb21tYW5kIGludGVyZmFjZS4KKworV2hpbGUgc29tZSBjb21tYW5kcyBjYW4gYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoZS5nLiAndmVyc2lvbicKK29yICdpbml0JyksIG1vc3Qgb3BlcmF0aW9ucyByZXF1aXJlIGEgcmVwb3NpdG9yeSBjb250ZXh0LCB3aGljaCBpbiBwcmFjdGljZQorbWVhbnMgZ2V0dGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgR2l0IG9iamVjdCB1c2luZyB0aGUgcmVwb3NpdG9yeSgpIGNvbnN0cnVjdG9yLgorKEluIHRoZSBmdXR1cmUsIHdlIHdpbGwgYWxzbyBnZXQgYSBuZXdfcmVwb3NpdG9yeSgpIGNvbnN0cnVjdG9yLikgQWxsIGNvbW1hbmRzCitjYWxsZWQgYXMgbWV0aG9kcyBvZiB0aGUgb2JqZWN0IGFyZSB0aGVuIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZQorcmVwb3NpdG9yeS4KKworUGFydCBvZiB0aGUgInJlcG9zaXRvcnkgc3RhdGUiIGlzIGFsc28gaW5mb3JtYXRpb24gYWJvdXQgcGF0aCB0byB0aGUgYXR0YWNoZWQKK3dvcmtpbmcgY29weSAodW5sZXNzIHlvdSB3b3JrIHdpdGggYSBiYXJlIHJlcG9zaXRvcnkpLiBZb3UgY2FuIGFsc28gbmF2aWdhdGUKK2luc2lkZSBvZiB0aGUgd29ya2luZyBjb3B5IHVzaW5nIHRoZSBDPHdjX2NoZGlyKCk+IG1ldGhvZC4gKE5vdGUgdGhhdAordGhlIHJlcG9zaXRvcnkgb2JqZWN0IGlzIHNlbGYtY29udGFpbmVkIGFuZCB3aWxsIG5vdCBjaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkKK29mIHlvdXIgcHJvY2Vzcy4pCisKK1RPRE86IEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IGFsc28gZG8KKworCW15ICRyZW1vdGVyZXBvID0gJHJlcG8tPnJlbW90ZV9yZXBvc2l0b3J5IChOYW1lID0+ICdjb2dpdG8nLCBCcmFuY2ggPT4gJ21hc3RlcicpOworCSRyZW1vdGVyZXBvIHx8PSBHaXQtPnJlbW90ZV9yZXBvc2l0b3J5ICgnaHR0cDovL2dpdC5vci5jei9jb2dpdG8uZ2l0LycpOworCW15IEByZWZzID0gJHJlbW90ZXJlcG8tPnJlZnMoKTsKKworQ3VycmVudGx5LCB0aGUgbW9kdWxlIG1lcmVseSB3cmFwcyBjYWxscyB0byBleHRlcm5hbCBHaXQgdG9vbHMuIEluIHRoZSBmdXR1cmUsCitpdCB3aWxsIHByb3ZpZGUgYSBtdWNoIGZhc3RlciB3YXkgdG8gaW50ZXJhY3Qgd2l0aCBHaXQgYnkgbGlua2luZyBkaXJlY3RseQordG8gbGliZ2l0LiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWx5IG9wYXF1ZSB0byB0aGUgdXNlciwgdGhvdWdoIChwZXJmb3JtYW5jZQoraW5jcmVhdGUgbm9ud2l0aHN0YW5kaW5nKS4KKworPWN1dAorCisKK3VzZSBDYXJwIHF3KGNhcnAgY3JvYWspOyAjIGJ1dCBjcm9hayBpcyBiYWQgLSB0aHJvdyBpbnN0ZWFkCit1c2UgRXJyb3IgcXcoOnRyeSk7Cit1c2UgQ3dkIHF3KGFic19wYXRoKTsKKworfQorCisKKz1oZWFkMSBDT05TVFJVQ1RPUlMKKworPW92ZXIgNAorCis9aXRlbSByZXBvc2l0b3J5ICggT1BUSU9OUyApCisKKz1pdGVtIHJlcG9zaXRvcnkgKCBESVJFQ1RPUlkgKQorCis9aXRlbSByZXBvc2l0b3J5ICgpCisKK0NvbnN0cnVjdCBhIG5ldyByZXBvc2l0b3J5IG9iamVjdC4KK0M8T1BUSU9OUz4gYXJlIHBhc3NlZCBpbiBhIGhhc2ggbGlrZSBmYXNoaW9uLCB1c2luZyBrZXkgYW5kIHZhbHVlIHBhaXJzLgorUG9zc2libGUgb3B0aW9ucyBhcmU6CisKK0I8UmVwb3NpdG9yeT4gLSBQYXRoIHRvIHRoZSBHaXQgcmVwb3NpdG9yeS4KKworQjxXb3JraW5nQ29weT4gLSBQYXRoIHRvIHRoZSBhc3NvY2lhdGVkIHdvcmtpbmcgY29weTsgbm90IHN0cmljdGx5IHJlcXVpcmVkCithcyBtYW55IGNvbW1hbmRzIHdpbGwgaGFwcGlseSBjcnVuY2ggb24gYSBiYXJlIHJlcG9zaXRvcnkuCisKK0I8V29ya2luZ1N1YmRpcj4gLSBTdWJkaXJlY3RvcnkgaW4gdGhlIHdvcmtpbmcgY29weSB0byB3b3JrIGluc2lkZS4KK0p1c3QgbGVmdCB1bmRlZmluZWQgaWYgeW91IGRvIG5vdCB3YW50IHRvIGxpbWl0IHRoZSBzY29wZSBvZiBvcGVyYXRpb25zLgorCitCPERpcmVjdG9yeT4gLSBQYXRoIHRvIHRoZSBHaXQgd29ya2luZyBkaXJlY3RvcnkgaW4gaXRzIHVzdWFsIHNldHVwLgorVGhlIEM8LmdpdD4gZGlyZWN0b3J5IGlzIHNlYXJjaGVkIGluIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCB0aGUgcGFyZW50CitkaXJlY3RvcmllczsgaWYgZm91bmQsIEM8V29ya2luZ0NvcHk+IGlzIHNldCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKK2l0IGFuZCBDPFJlcG9zaXRvcnk+IHRvIHRoZSBDPC5naXQ+IGRpcmVjdG9yeSBpdHNlbGYuIElmIG5vIEM8LmdpdD4KK2RpcmVjdG9yeSB3YXMgZm91bmQsIHRoZSBDPERpcmVjdG9yeT4gaXMgYXNzdW1lZCB0byBiZSBhIGJhcmUgcmVwb3NpdG9yeSwKK0M8UmVwb3NpdG9yeT4gaXMgc2V0IHRvIHBvaW50IGF0IGl0IGFuZCBDPFdvcmtpbmdDb3B5PiBpcyBsZWZ0IHVuZGVmaW5lZC4KK0lmIHRoZSBDPCRHSVRfRElSPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIHRoaW5ncyBiZWhhdmUgYXMgZXhwZWN0ZWQKK2FzIHdlbGwuCisKK1lvdSBzaG91bGQgbm90IHVzZSBib3RoIEM8RGlyZWN0b3J5PiBhbmQgZWl0aGVyIG9mIEM8UmVwb3NpdG9yeT4gYW5kCitDPFdvcmtpbmdDb3B5PiAtIHRoZSByZXN1bHRzIG9mIHRoYXQgYXJlIHVuZGVmaW5lZC4KKworQWx0ZXJuYXRpdmVseSwgYSBkaXJlY3RvcnkgcGF0aCBtYXkgYmUgcGFzc2VkIGFzIGEgc2luZ2xlIHNjYWxhciBhcmd1bWVudAordG8gdGhlIGNvbnN0cnVjdG9yOyBpdCBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgb25seSB0aGUgQzxEaXJlY3Rvcnk+IG9wdGlvbgorZmllbGQuCisKK0NhbGxpbmcgdGhlIGNvbnN0cnVjdG9yIHdpdGggbm8gb3B0aW9ucyB3aGF0c29ldmVyIGlzIGVxdWl2YWxlbnQgdG8KK2NhbGxpbmcgaXQgd2l0aCBDPDwgRGlyZWN0b3J5ID0+ICcuJyA+Pi4gSW4gZ2VuZXJhbCwgaWYgeW91IGFyZSBidWlsZGluZworYSBzdGFuZGFyZCBwb3JjZWxhaW4gY29tbWFuZCwgc2ltcGx5IGRvaW5nIEM8PCBHaXQtPnJlcG9zaXRvcnkoKSA+PiBzaG91bGQKK2RvIHRoZSByaWdodCB0aGluZyBhbmQgc2V0dXAgdGhlIG9iamVjdCB0byByZWZsZWN0IGV4YWN0bHkgd2hlcmUgdGhlIHVzZXIKK2lzIHJpZ2h0IG5vdy4KKworPWN1dAorCitzdWIgcmVwb3NpdG9yeSB7CisJbXkgJGNsYXNzID0gc2hpZnQ7CisJbXkgQGFyZ3MgPSBAXzsKKwlteSAlb3B0cyA9ICgpOworCW15ICRzZWxmOworCisJaWYgKGRlZmluZWQgJGFyZ3NbMF0pIHsKKwkJaWYgKCQjYXJncyAlIDIgIT0gMSkgeworCQkJIyBOb3QgYSBoYXNoLgorCQkJJCNhcmdzID09IDAgb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgiYmFkIHVzYWdlIik7CisJCQklb3B0cyA9ICggRGlyZWN0b3J5ID0+ICRhcmdzWzBdICk7CisJCX0gZWxzZSB7CisJCQklb3B0cyA9IEBhcmdzOworCQl9CisJfQorCisJaWYgKG5vdCBkZWZpbmVkICRvcHRze1JlcG9zaXRvcnl9IGFuZCBub3QgZGVmaW5lZCAkb3B0c3tXb3JraW5nQ29weX0pIHsKKwkJJG9wdHN7RGlyZWN0b3J5fSB8fD0gJy4nOworCX0KKworCWlmICgkb3B0c3tEaXJlY3Rvcnl9KSB7CisJCS1kICRvcHRze0RpcmVjdG9yeX0gb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgiRGlyZWN0b3J5IG5vdCBmb3VuZDogJCEiKTsKKworCQlteSAkc2VhcmNoID0gR2l0LT5yZXBvc2l0b3J5KFdvcmtpbmdDb3B5ID0+ICRvcHRze0RpcmVjdG9yeX0pOworCQlteSAkZGlyOworCQl0cnkgeworCQkJJGRpciA9ICRzZWFyY2gtPmNvbW1hbmRfb25lbGluZShbJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RERVJSID0+IDApOworCQl9IGNhdGNoIEdpdDo6RXJyb3I6OkNvbW1hbmQgd2l0aCB7CisJCQkkZGlyID0gdW5kZWY7CisJCX07CisKKwkJaWYgKCRkaXIpIHsKKwkJCSRkaXIgPX4gbSNeLyMgb3IgJGRpciA9ICRvcHRze0RpcmVjdG9yeX0gLiAnLycgLiAkZGlyOworCQkJJG9wdHN7UmVwb3NpdG9yeX0gPSAkZGlyOworCisJCQkjIElmIC0tZ2l0LWRpciB3ZW50IG9rLCB0aGlzIHNob3VsZG4ndCBkaWUgZWl0aGVyLgorCQkJbXkgJHByZWZpeCA9ICRzZWFyY2gtPmNvbW1hbmRfb25lbGluZSgncmV2LXBhcnNlJywgJy0tc2hvdy1wcmVmaXgnKTsKKwkJCSRkaXIgPSBhYnNfcGF0aCgkb3B0c3tEaXJlY3Rvcnl9KSAuICcvJzsKKwkJCWlmICgkcHJlZml4KSB7CisJCQkJaWYgKHN1YnN0cigkZGlyLCAtbGVuZ3RoKCRwcmVmaXgpKSBuZSAkcHJlZml4KSB7CisJCQkJCXRocm93IEVycm9yOjpTaW1wbGUoInJldi1wYXJzZSBjb25mdXNlZCBtZSAtICRkaXIgZG9lcyBub3QgaGF2ZSB0cmFpbGluZyAkcHJlZml4Iik7CisJCQkJfQorCQkJCXN1YnN0cigkZGlyLCAtbGVuZ3RoKCRwcmVmaXgpKSA9ICcnOworCQkJfQorCQkJJG9wdHN7V29ya2luZ0NvcHl9ID0gJGRpcjsKKwkJCSRvcHRze1dvcmtpbmdTdWJkaXJ9ID0gJHByZWZpeDsKKworCQl9IGVsc2UgeworCQkJIyBBIGJhcmUgcmVwb3NpdG9yeT8gTGV0J3Mgc2VlLi4uCisJCQkkZGlyID0gJG9wdHN7RGlyZWN0b3J5fTsKKworCQkJdW5sZXNzICgtZCAiJGRpci9yZWZzIiBhbmQgLWQgIiRkaXIvb2JqZWN0cyIgYW5kIC1lICIkZGlyL0hFQUQiKSB7CisJCQkJIyBNaW1pY2sgZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIgZXJyb3IgbWVzc2FnZToKKwkJCQl0aHJvdyBFcnJvcjo6U2ltcGxlKCdmYXRhbDogTm90IGEgZ2l0IHJlcG9zaXRvcnknKTsKKwkJCX0KKwkJCW15ICRzZWFyY2ggPSBHaXQtPnJlcG9zaXRvcnkoUmVwb3NpdG9yeSA9PiAkZGlyKTsKKwkJCXRyeSB7CisJCQkJJHNlYXJjaC0+Y29tbWFuZCgnc3ltYm9saWMtcmVmJywgJ0hFQUQnKTsKKwkJCX0gY2F0Y2ggR2l0OjpFcnJvcjo6Q29tbWFuZCB3aXRoIHsKKwkJCQkjIE1pbWljayBnaXQtcmV2LXBhcnNlIC0tZ2l0LWRpciBlcnJvciBtZXNzYWdlOgorCQkJCXRocm93IEVycm9yOjpTaW1wbGUoJ2ZhdGFsOiBOb3QgYSBnaXQgcmVwb3NpdG9yeScpOworCQkJfQorCisJCQkkb3B0c3tSZXBvc2l0b3J5fSA9IGFic19wYXRoKCRkaXIpOworCQl9CisKKwkJZGVsZXRlICRvcHRze0RpcmVjdG9yeX07CisJfQorCisJJHNlbGYgPSB7IG9wdHMgPT4gXCVvcHRzIH07CisJYmxlc3MgJHNlbGYsICRjbGFzczsKK30KKworCis9YmFjaworCis9aGVhZDEgTUVUSE9EUworCis9b3ZlciA0CisKKz1pdGVtIGNvbW1hbmQgKCBDT01NQU5EIFssIEFSR1VNRU5UUy4uLiBdICkKKworPWl0ZW0gY29tbWFuZCAoIFsgQ09NTUFORCwgQVJHVU1FTlRTLi4uIF0sIHsgT3B0ID0+IFZhbCAuLi4gfSApCisKK0V4ZWN1dGUgdGhlIGdpdmVuIEdpdCBDPENPTU1BTkQ+IChzcGVjaWZ5IGl0IHdpdGhvdXQgdGhlICdnaXQtJworcHJlZml4KSwgb3B0aW9uYWxseSB3aXRoIHRoZSBzcGVjaWZpZWQgZXh0cmEgQzxBUkdVTUVOVFM+LgorCitUaGUgc2Vjb25kIG1vcmUgZWxhYm9yYXRlIGZvcm0gY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gZnVydGhlciBhZGp1c3QKK3RoZSBjb21tYW5kIGV4ZWN1dGlvbi4gQ3VycmVudGx5LCBvbmx5IG9uZSBvcHRpb24gaXMgc3VwcG9ydGVkOgorCitCPFNUREVSUj4gLSBIb3cgdG8gZGVhbCB3aXRoIHRoZSBjb21tYW5kJ3MgZXJyb3Igb3V0cHV0LiBCeSBkZWZhdWx0IChDPHVuZGVmPikKK2l0IGlzIGRlbGl2ZXJlZCB0byB0aGUgY2FsbGVyJ3MgQzxTVERFUlI+LiBBIGZhbHNlIHZhbHVlICgwIG9yICcnKSB3aWxsIGNhdXNlCitpdCB0byBiZSB0aHJvd24gYXdheS4gSWYgeW91IHdhbnQgdG8gcHJvY2VzcyBpdCwgeW91IGNhbiBnZXQgaXQgaW4gYSBmaWxlaGFuZGxlCit5b3Ugc3BlY2lmeSwgYnV0IHlvdSBtdXN0IGJlIGV4dHJlbWVseSBjYXJlZnVsOyBpZiB0aGUgZXJyb3Igb3V0cHV0IGlzIG5vdAordmVyeSBzaG9ydCBhbmQgeW91IHdhbnQgdG8gcmVhZCBpdCBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHdoZXJlIHlvdSBjYWxsZWQKK0M8Y29tbWFuZCgpPiwgeW91IGFyZSBzZXQgdXAgZm9yIGEgbmljZSBkZWFkbG9jayEKKworVGhlIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgYW55IGluc3RhbmNlIG9yIG9uIGEgc3BlY2lmaWVkIEdpdCByZXBvc2l0b3J5CisoaW4gdGhhdCBjYXNlIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuIGluIHRoZSByZXBvc2l0b3J5IGNvbnRleHQpLgorCitJbiBzY2FsYXIgY29udGV4dCwgaXQgcmV0dXJucyBhbGwgdGhlIGNvbW1hbmQgb3V0cHV0IGluIGEgc2luZ2xlIHN0cmluZworKHZlcmJhdGltKS4KKworSW4gYXJyYXkgY29udGV4dCwgaXQgcmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGxpbmVzIHByaW50ZWQgdG8gdGhlCitjb21tYW5kJ3Mgc3Rkb3V0ICh3aXRob3V0IHRyYWlsaW5nIG5ld2xpbmVzKS4KKworSW4gYm90aCBjYXNlcywgdGhlIGNvbW1hbmQncyBzdGRpbiBhbmQgc3RkZXJyIGFyZSB0aGUgc2FtZSBhcyB0aGUgY2FsbGVyJ3MuCisKKz1jdXQKKworc3ViIGNvbW1hbmQgeworCW15ICgkZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShAXyk7CisKKwlpZiAobm90IGRlZmluZWQgd2FudGFycmF5KSB7CisJCSMgTm90aGluZyB0byBwZXBwZXIgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiB3aXRoLgorCQlfY21kX2Nsb3NlKCRmaCwgJGN0eCk7CisKKwl9IGVsc2lmIChub3Qgd2FudGFycmF5KSB7CisJCWxvY2FsICQvOworCQlteSAkdGV4dCA9IDwkZmg+OworCQl0cnkgeworCQkJX2NtZF9jbG9zZSgkZmgsICRjdHgpOworCQl9IGNhdGNoIEdpdDo6RXJyb3I6OkNvbW1hbmQgd2l0aCB7CisJCQkjIFBlcHBlciB3aXRoIHRoZSBvdXRwdXQ6CisJCQlteSAkRSA9IHNoaWZ0OworCQkJJEUtPnsnLW91dHB1dHJlZid9ID0gXCR0ZXh0OworCQkJdGhyb3cgJEU7CisJCX07CisJCXJldHVybiAkdGV4dDsKKworCX0gZWxzZSB7CisJCW15IEBsaW5lcyA9IDwkZmg+OworCQlkZWZpbmVkIGFuZCBjaG9tcCBmb3IgQGxpbmVzOworCQl0cnkgeworCQkJX2NtZF9jbG9zZSgkZmgsICRjdHgpOworCQl9IGNhdGNoIEdpdDo6RXJyb3I6OkNvbW1hbmQgd2l0aCB7CisJCQlteSAkRSA9IHNoaWZ0OworCQkJJEUtPnsnLW91dHB1dHJlZid9ID0gXEBsaW5lczsKKwkJCXRocm93ICRFOworCQl9OworCQlyZXR1cm4gQGxpbmVzOworCX0KK30KKworCis9aXRlbSBjb21tYW5kX29uZWxpbmUgKCBDT01NQU5EIFssIEFSR1VNRU5UUy4uLiBdICkKKworPWl0ZW0gY29tbWFuZF9vbmVsaW5lICggWyBDT01NQU5ELCBBUkdVTUVOVFMuLi4gXSwgeyBPcHQgPT4gVmFsIC4uLiB9ICkKKworRXhlY3V0ZSB0aGUgZ2l2ZW4gQzxDT01NQU5EPiBpbiB0aGUgc2FtZSB3YXkgYXMgY29tbWFuZCgpCitkb2VzIGJ1dCBhbHdheXMgcmV0dXJuIGEgc2NhbGFyIHN0cmluZyBjb250YWluaW5nIHRoZSBmaXJzdCBsaW5lCitvZiB0aGUgY29tbWFuZCdzIHN0YW5kYXJkIG91dHB1dC4KKworPWN1dAorCitzdWIgY29tbWFuZF9vbmVsaW5lIHsKKwlteSAoJGZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoQF8pOworCisJbXkgJGxpbmUgPSA8JGZoPjsKKwlkZWZpbmVkICRsaW5lIGFuZCBjaG9tcCAkbGluZTsKKwl0cnkgeworCQlfY21kX2Nsb3NlKCRmaCwgJGN0eCk7CisJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQkjIFBlcHBlciB3aXRoIHRoZSBvdXRwdXQ6CisJCW15ICRFID0gc2hpZnQ7CisJCSRFLT57Jy1vdXRwdXRyZWYnfSA9IFwkbGluZTsKKwkJdGhyb3cgJEU7CisJfTsKKwlyZXR1cm4gJGxpbmU7Cit9CisKKworPWl0ZW0gY29tbWFuZF9vdXRwdXRfcGlwZSAoIENPTU1BTkQgWywgQVJHVU1FTlRTLi4uIF0gKQorCis9aXRlbSBjb21tYW5kX291dHB1dF9waXBlICggWyBDT01NQU5ELCBBUkdVTUVOVFMuLi4gXSwgeyBPcHQgPT4gVmFsIC4uLiB9ICkKKworRXhlY3V0ZSB0aGUgZ2l2ZW4gQzxDT01NQU5EPiBpbiB0aGUgc2FtZSB3YXkgYXMgY29tbWFuZCgpCitkb2VzIGJ1dCByZXR1cm4gYSBwaXBlIGZpbGVoYW5kbGUgZnJvbSB3aGljaCB0aGUgY29tbWFuZCBvdXRwdXQgY2FuIGJlCityZWFkLgorCitUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBDPCgkcGlwZSwgJGN0eCk+IGluIGFycmF5IGNvbnRleHQuCitTZWUgQzxjb21tYW5kX2Nsb3NlX3BpcGUoKT4gZm9yIGRldGFpbHMuCisKKz1jdXQKKworc3ViIGNvbW1hbmRfb3V0cHV0X3BpcGUgeworCV9jb21tYW5kX2NvbW1vbl9waXBlKCctfCcsIEBfKTsKK30KKworCis9aXRlbSBjb21tYW5kX2lucHV0X3BpcGUgKCBDT01NQU5EIFssIEFSR1VNRU5UUy4uLiBdICkKKworPWl0ZW0gY29tbWFuZF9pbnB1dF9waXBlICggWyBDT01NQU5ELCBBUkdVTUVOVFMuLi4gXSwgeyBPcHQgPT4gVmFsIC4uLiB9ICkKKworRXhlY3V0ZSB0aGUgZ2l2ZW4gQzxDT01NQU5EPiBpbiB0aGUgc2FtZSB3YXkgYXMgY29tbWFuZF9vdXRwdXRfcGlwZSgpCitkb2VzIGJ1dCByZXR1cm4gYW4gaW5wdXQgcGlwZSBmaWxlaGFuZGxlIGluc3RlYWQ7IHRoZSBjb21tYW5kIG91dHB1dAoraXMgbm90IGNhcHR1cmVkLgorCitUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBDPCgkcGlwZSwgJGN0eCk+IGluIGFycmF5IGNvbnRleHQuCitTZWUgQzxjb21tYW5kX2Nsb3NlX3BpcGUoKT4gZm9yIGRldGFpbHMuCisKKz1jdXQKKworc3ViIGNvbW1hbmRfaW5wdXRfcGlwZSB7CisJX2NvbW1hbmRfY29tbW9uX3BpcGUoJ3wtJywgQF8pOworfQorCisKKz1pdGVtIGNvbW1hbmRfY2xvc2VfcGlwZSAoIFBJUEUgWywgQ1RYIF0gKQorCitDbG9zZSB0aGUgQzxQSVBFPiBhcyByZXR1cm5lZCBmcm9tIEM8Y29tbWFuZF8qX3BpcGUoKT4sIGNoZWNraW5nCit3aGV0aGVyIHRoZSBjb21tYW5kIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4gVGhlIG9wdGlvbmFsIEM8Q1RYPiBhcmd1bWVudAoraXMgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBjb21tYW5kIG5hbWUgaW4gdGhlIGVycm9yIG1lc3NhZ2UsCithbmQgaXQgaXMgdGhlIHNlY29uZCB2YWx1ZSByZXR1cm5lZCBieSBDPGNvbW1hbmRfKl9waXBlKCk+IHdoZW4KK2NhbGxlZCBpbiBhcnJheSBjb250ZXh0LiBUaGUgY2FsbCBpZGlvbSBpczoKKworCW15ICgkZmgsICRjdHgpID0gJHItPmNvbW1hbmRfb3V0cHV0X3BpcGUoJ3N0YXR1cycpOworCXdoaWxlICg8JGZoPikgeyAuLi4gfQorCSRyLT5jb21tYW5kX2Nsb3NlX3BpcGUoJGZoLCAkY3R4KTsKKworTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IHJlbHkgb24gd2hhdGV2ZXIgYWN0dWFsbHkgaXMgaW4gQzxDVFg+OworY3VycmVudGx5IGl0IGlzIHNpbXBseSB0aGUgY29tbWFuZCBuYW1lIGJ1dCBpbiBmdXR1cmUgdGhlIGNvbnRleHQgbWlnaHQKK2hhdmUgbW9yZSBjb21wbGljYXRlZCBzdHJ1Y3R1cmUuCisKKz1jdXQKKworc3ViIGNvbW1hbmRfY2xvc2VfcGlwZSB7CisJbXkgKCRzZWxmLCAkZmgsICRjdHgpID0gX21heWJlX3NlbGYoQF8pOworCSRjdHggfHw9ICc8dW5rbm93bj4nOworCV9jbWRfY2xvc2UoJGZoLCAkY3R4KTsKK30KKworCis9aXRlbSBjb21tYW5kX25vaXN5ICggQ09NTUFORCBbLCBBUkdVTUVOVFMuLi4gXSApCisKK0V4ZWN1dGUgdGhlIGdpdmVuIEM8Q09NTUFORD4gaW4gdGhlIHNhbWUgd2F5IGFzIGNvbW1hbmQoKSBkb2VzIGJ1dCBkbyBub3QKK2NhcHR1cmUgdGhlIGNvbW1hbmQgb3V0cHV0IC0gdGhlIHN0YW5kYXJkIG91dHB1dCBpcyBub3QgcmVkaXJlY3RlZCBhbmQgZ29lcwordG8gdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgY2FsbGVyIGFwcGxpY2F0aW9uLgorCitXaGlsZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCBjb21tYW5kX25vaXN5KCksIHlvdSBtaWdodCB3YW50IHRvIGFzIHdlbGwgdXNlCitpdCBmb3IgdGhlIG1vc3Qgc2lsZW50IEdpdCBjb21tYW5kcyB3aGljaCB5b3Uga25vdyB3aWxsIG5ldmVyIHBvbGx1dGUgeW91cgorc3Rkb3V0IGJ1dCB5b3Ugd2FudCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGhlIHBpcGUgc2V0dXAgd2hlbiBjYWxsaW5nIHRoZW0uCisKK1RoZSBmdW5jdGlvbiByZXR1cm5zIG9ubHkgYWZ0ZXIgdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIHJ1bm5pbmcuCisKKz1jdXQKKworc3ViIGNvbW1hbmRfbm9pc3kgeworCW15ICgkc2VsZiwgJGNtZCwgQGFyZ3MpID0gX21heWJlX3NlbGYoQF8pOworCV9jaGVja192YWxpZF9jbWQoJGNtZCk7CisKKwlteSAkcGlkID0gZm9yazsKKwlpZiAobm90IGRlZmluZWQgJHBpZCkgeworCQl0aHJvdyBFcnJvcjo6U2ltcGxlKCJmb3JrIGZhaWxlZDogJCEiKTsKKwl9IGVsc2lmICgkcGlkID09IDApIHsKKwkJX2NtZF9leGVjKCRzZWxmLCAkY21kLCBAYXJncyk7CisJfQorCWlmICh3YWl0cGlkKCRwaWQsIDApID4gMCBhbmQgJD8+PjggIT0gMCkgeworCQl0aHJvdyBHaXQ6OkVycm9yOjpDb21tYW5kKGpvaW4oJyAnLCAkY21kLCBAYXJncyksICQ/ID4+IDgpOworCX0KK30KKworCis9aXRlbSB2ZXJzaW9uICgpCisKK1JldHVybiB0aGUgR2l0IHZlcnNpb24gaW4gdXNlLgorCis9Y3V0CisKK3N1YiB2ZXJzaW9uIHsKKwlteSAkdmVyc3RyID0gY29tbWFuZF9vbmVsaW5lKCctLXZlcnNpb24nKTsKKwkkdmVyc3RyID1+IHMvXmdpdCB2ZXJzaW9uIC8vOworCSR2ZXJzdHI7Cit9CisKKworPWl0ZW0gZXhlY19wYXRoICgpCisKK1JldHVybiBwYXRoIHRvIHRoZSBHaXQgc3ViLWNvbW1hbmQgZXhlY3V0YWJsZXMgKHRoZSBzYW1lIGFzCitDPGdpdCAtLWV4ZWMtcGF0aD4pLiBVc2VmdWwgbW9zdGx5IG9ubHkgaW50ZXJuYWxseS4KKworPWN1dAorCitzdWIgZXhlY19wYXRoIHsgY29tbWFuZF9vbmVsaW5lKCctLWV4ZWMtcGF0aCcpIH0KKworCis9aXRlbSByZXBvX3BhdGggKCkKKworUmV0dXJuIHBhdGggdG8gdGhlIGdpdCByZXBvc2l0b3J5LiBNdXN0IGJlIGNhbGxlZCBvbiBhIHJlcG9zaXRvcnkgaW5zdGFuY2UuCisKKz1jdXQKKworc3ViIHJlcG9fcGF0aCB7ICRfWzBdLT57b3B0c30tPntSZXBvc2l0b3J5fSB9CisKKworPWl0ZW0gd2NfcGF0aCAoKQorCitSZXR1cm4gcGF0aCB0byB0aGUgd29ya2luZyBjb3B5LiBNdXN0IGJlIGNhbGxlZCBvbiBhIHJlcG9zaXRvcnkgaW5zdGFuY2UuCisKKz1jdXQKKworc3ViIHdjX3BhdGggeyAkX1swXS0+e29wdHN9LT57V29ya2luZ0NvcHl9IH0KKworCis9aXRlbSB3Y19zdWJkaXIgKCkKKworUmV0dXJuIHBhdGggdG8gdGhlIHN1YmRpcmVjdG9yeSBpbnNpZGUgb2YgYSB3b3JraW5nIGNvcHkuIE11c3QgYmUgY2FsbGVkCitvbiBhIHJlcG9zaXRvcnkgaW5zdGFuY2UuCisKKz1jdXQKKworc3ViIHdjX3N1YmRpciB7ICRfWzBdLT57b3B0c30tPntXb3JraW5nU3ViZGlyfSB8fD0gJycgfQorCisKKz1pdGVtIHdjX2NoZGlyICggU1VCRElSICkKKworQ2hhbmdlIHRoZSB3b3JraW5nIGNvcHkgc3ViZGlyZWN0b3J5IHRvIHdvcmsgd2l0aGluLiBUaGUgQzxTVUJESVI+IGlzCityZWxhdGl2ZSB0byB0aGUgd29ya2luZyBjb3B5IHJvb3QgZGlyZWN0b3J5IChub3QgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5KS4KK011c3QgYmUgY2FsbGVkIG9uIGEgcmVwb3NpdG9yeSBpbnN0YW5jZSBhdHRhY2hlZCB0byBhIHdvcmtpbmcgY29weQorYW5kIHRoZSBkaXJlY3RvcnkgbXVzdCBleGlzdC4KKworPWN1dAorCitzdWIgd2NfY2hkaXIgeworCW15ICgkc2VsZiwgJHN1YmRpcikgPSBAXzsKKwkkc2VsZi0+d2NfcGF0aCgpCisJCW9yIHRocm93IEVycm9yOjpTaW1wbGUoImJhcmUgcmVwb3NpdG9yeSIpOworCisJLWQgJHNlbGYtPndjX3BhdGgoKS4nLycuJHN1YmRpcgorCQlvciB0aHJvdyBFcnJvcjo6U2ltcGxlKCJzdWJkaXIgbm90IGZvdW5kOiAkISIpOworCSMgT2YgY291cnNlIHdlIHdpbGwgbm90ICJob2xkIiB0aGUgc3ViZGlyZWN0b3J5IHNvIGFueW9uZQorCSMgY2FuIGRlbGV0ZSBpdCBub3cgYW5kIHdlIHdpbGwgbmV2ZXIga25vdy4gQnV0IGF0IGxlYXN0IHdlIHRyaWVkLgorCisJJHNlbGYtPntvcHRzfS0+e1dvcmtpbmdTdWJkaXJ9ID0gJHN1YmRpcjsKK30KKworCis9aXRlbSBjb25maWcgKCBWQVJJQUJMRSApCisKK1JldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIEM8VkFSSUFCTEU+IGluIHRoZSBzYW1lIG1hbm5lciBhcyBDPGNvbmZpZz4KK2RvZXMuIEluIHNjYWxhciBjb250ZXh0IHJlcXVpcmVzIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgb25seSBvbmUgdGltZQorKGV4Y2VwdGlvbiBpcyB0aHJvd24gb3RoZXJ3aXNlKSwgaW4gYXJyYXkgY29udGV4dCByZXR1cm5zIGFsbG93cyB0aGUKK3ZhcmlhYmxlIHRvIGJlIHNldCBtdWx0aXBsZSB0aW1lcyBhbmQgcmV0dXJucyBhbGwgdGhlIHZhbHVlcy4KKworTXVzdCBiZSBjYWxsZWQgb24gYSByZXBvc2l0b3J5IGluc3RhbmNlLgorCitUaGlzIGN1cnJlbnRseSB3cmFwcyBjb21tYW5kKCdjb25maWcnKSBzbyBpdCBpcyBub3Qgc28gZmFzdC4KKworPWN1dAorCitzdWIgY29uZmlnIHsKKwlteSAoJHNlbGYsICR2YXIpID0gQF87CisJJHNlbGYtPnJlcG9fcGF0aCgpCisJCW9yIHRocm93IEVycm9yOjpTaW1wbGUoIm5vdCBhIHJlcG9zaXRvcnkiKTsKKworCXRyeSB7CisJCWlmICh3YW50YXJyYXkpIHsKKwkJCXJldHVybiAkc2VsZi0+Y29tbWFuZCgnY29uZmlnJywgJy0tZ2V0LWFsbCcsICR2YXIpOworCQl9IGVsc2UgeworCQkJcmV0dXJuICRzZWxmLT5jb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICctLWdldCcsICR2YXIpOworCQl9CisJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQlteSAkRSA9IHNoaWZ0OworCQlpZiAoJEUtPnZhbHVlKCkgPT0gMSkgeworCQkJIyBLZXkgbm90IGZvdW5kLgorCQkJcmV0dXJuIHVuZGVmOworCQl9IGVsc2UgeworCQkJdGhyb3cgJEU7CisJCX0KKwl9OworfQorCisKKz1pdGVtIGNvbmZpZ19ib29sICggVkFSSUFCTEUgKQorCitSZXRyaWV2ZSB0aGUgYm9vbCBjb25maWd1cmF0aW9uIEM8VkFSSUFCTEU+LiBUaGUgcmV0dXJuIHZhbHVlCitpcyB1c2FibGUgYXMgYSBib29sZWFuIGluIHBlcmwgKGFuZCBDPHVuZGVmPiBpZiBpdCdzIG5vdCBkZWZpbmVkLAorb2YgY291cnNlKS4KKworTXVzdCBiZSBjYWxsZWQgb24gYSByZXBvc2l0b3J5IGluc3RhbmNlLgorCitUaGlzIGN1cnJlbnRseSB3cmFwcyBjb21tYW5kKCdjb25maWcnKSBzbyBpdCBpcyBub3Qgc28gZmFzdC4KKworPWN1dAorCitzdWIgY29uZmlnX2Jvb2wgeworCW15ICgkc2VsZiwgJHZhcikgPSBAXzsKKwkkc2VsZi0+cmVwb19wYXRoKCkKKwkJb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgibm90IGEgcmVwb3NpdG9yeSIpOworCisJdHJ5IHsKKwkJbXkgJHZhbCA9ICRzZWxmLT5jb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICctLWJvb2wnLCAnLS1nZXQnLAorCQkJCQkgICAgICAkdmFyKTsKKwkJcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICR2YWw7CisJCXJldHVybiAkdmFsIGVxICd0cnVlJzsKKwl9IGNhdGNoIEdpdDo6RXJyb3I6OkNvbW1hbmQgd2l0aCB7CisJCW15ICRFID0gc2hpZnQ7CisJCWlmICgkRS0+dmFsdWUoKSA9PSAxKSB7CisJCQkjIEtleSBub3QgZm91bmQuCisJCQlyZXR1cm4gdW5kZWY7CisJCX0gZWxzZSB7CisJCQl0aHJvdyAkRTsKKwkJfQorCX07Cit9CisKKworPWl0ZW0gaWRlbnQgKCBUWVBFIHwgSURFTlRTVFIgKQorCis9aXRlbSBpZGVudF9wZXJzb24gKCBUWVBFIHwgSURFTlRTVFIgfCBJREVOVEFSUkFZICkKKworVGhpcyBzdWl0ZSBvZiBmdW5jdGlvbnMgcmV0cmlldmVzIGFuZCBwYXJzZXMgaWRlbnQgaW5mb3JtYXRpb24sIGFzIHN0b3JlZAoraW4gdGhlIGNvbW1pdCBhbmQgdGFnIG9iamVjdHMgb3IgcHJvZHVjZWQgYnkgQzx2YXIgR0lUX3R5cGVfSURFTlQ+ICh0aHVzCitDPFRZUEU+IGNhbiBiZSBlaXRoZXIgSTxhdXRob3I+IG9yIEk8Y29tbWl0dGVyPjsgY2FzZSBpcyBpbnNpZ25pZmljYW50KS4KKworVGhlIEM8aWRlbnQ+IG1ldGhvZCByZXRyaWV2ZXMgdGhlIGlkZW50IGluZm9ybWF0aW9uIGZyb20gQzxnaXQtdmFyPgorYW5kIGVpdGhlciByZXR1cm5zIGl0IGFzIGEgc2NhbGFyIHN0cmluZyBvciBhcyBhbiBhcnJheSB3aXRoIHRoZSBmaWVsZHMgcGFyc2VkLgorQWx0ZXJuYXRpdmVseSwgaXQgY2FuIHRha2UgYSBwcmVwYXJlZCBpZGVudCBzdHJpbmcgKGUuZy4gZnJvbSB0aGUgY29tbWl0CitvYmplY3QpIGFuZCBqdXN0IHBhcnNlIGl0LgorCitDPGlkZW50X3BlcnNvbj4gcmV0dXJucyB0aGUgcGVyc29uIHBhcnQgb2YgdGhlIGlkZW50IC0gbmFtZSBhbmQgZW1haWw7CitpdCBjYW4gdGFrZSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgQzxpZGVudD4gb3IgdGhlIGFycmF5IHJldHVybmVkIGJ5IEM8aWRlbnQ+LgorCitUaGUgc3lub3BzaXMgaXMgbGlrZToKKworCW15ICgkbmFtZSwgJGVtYWlsLCAkdGltZV90eikgPSBpZGVudCgnYXV0aG9yJyk7CisJIiRuYW1lIDwkZW1haWw+IiBlcSBpZGVudF9wZXJzb24oJ2F1dGhvcicpOworCSIkbmFtZSA8JGVtYWlsPiIgZXEgaWRlbnRfcGVyc29uKCRuYW1lKTsKKwkkdGltZV90eiA9fiAvXlxkKyBbKy1dXGR7NH0kLzsKKworQm90aCBtZXRob2RzIG11c3QgYmUgY2FsbGVkIG9uIGEgcmVwb3NpdG9yeSBpbnN0YW5jZS4KKworPWN1dAorCitzdWIgaWRlbnQgeworCW15ICgkc2VsZiwgJHR5cGUpID0gQF87CisJbXkgJGlkZW50c3RyOworCWlmIChsYyAkdHlwZSBlcSBsYyAnY29tbWl0dGVyJyBvciBsYyAkdHlwZSBlcSBsYyAnYXV0aG9yJykgeworCQkkaWRlbnRzdHIgPSAkc2VsZi0+Y29tbWFuZF9vbmVsaW5lKCd2YXInLCAnR0lUXycudWMoJHR5cGUpLidfSURFTlQnKTsKKwl9IGVsc2UgeworCQkkaWRlbnRzdHIgPSAkdHlwZTsKKwl9CisJaWYgKHdhbnRhcnJheSkgeworCQlyZXR1cm4gJGlkZW50c3RyID1+IC9eKC4qKSA8KC4qKT4gKFxkKyBbKy1dXGR7NH0pJC87CisJfSBlbHNlIHsKKwkJcmV0dXJuICRpZGVudHN0cjsKKwl9Cit9CisKK3N1YiBpZGVudF9wZXJzb24geworCW15ICgkc2VsZiwgQGlkZW50KSA9IEBfOworCSQjaWRlbnQgPT0gMCBhbmQgQGlkZW50ID0gJHNlbGYtPmlkZW50KCRpZGVudFswXSk7CisJcmV0dXJuICIkaWRlbnRbMF0gPCRpZGVudFsxXT4iOworfQorCisKKz1pdGVtIGhhc2hfb2JqZWN0ICggVFlQRSwgRklMRU5BTUUgKQorCitDb21wdXRlIHRoZSBTSEExIG9iamVjdCBpZCBvZiB0aGUgZ2l2ZW4gQzxGSUxFTkFNRT4gKG9yIGRhdGEgd2FpdGluZyBpbgorQzxGSUxFSEFORExFPikgY29uc2lkZXJpbmcgaXQgaXMgb2YgdGhlIEM8VFlQRT4gb2JqZWN0IHR5cGUgKEM8YmxvYj4sCitDPGNvbW1pdD4sIEM8dHJlZT4pLgorCitUaGUgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBhbnkgaW5zdGFuY2Ugb3Igb24gYSBzcGVjaWZpZWQgR2l0IHJlcG9zaXRvcnksCitpdCBtYWtlcyB6ZXJvIGRpZmZlcmVuY2UuCisKK1RoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBTSEExIGhhc2guCisKKz1jdXQKKworIyBUT0RPOiBTdXBwb3J0IGZvciBwYXNzaW5nIEZJTEVIQU5ETEUgaW5zdGVhZCBvZiBGSUxFTkFNRQorc3ViIGhhc2hfb2JqZWN0IHsKKwlteSAoJHNlbGYsICR0eXBlLCAkZmlsZSkgPSBfbWF5YmVfc2VsZihAXyk7CisJY29tbWFuZF9vbmVsaW5lKCdoYXNoLW9iamVjdCcsICctdCcsICR0eXBlLCAkZmlsZSk7Cit9CisKKworCis9YmFjaworCis9aGVhZDEgRVJST1IgSEFORExJTkcKKworQWxsIGZ1bmN0aW9ucyBhcmUgc3VwcG9zZWQgdG8gdGhyb3cgUGVybCBleGNlcHRpb25zIGluIGNhc2Ugb2YgZXJyb3JzLgorU2VlIHRoZSBMPEVycm9yPiBtb2R1bGUgb24gaG93IHRvIGNhdGNoIHRob3NlLiBNb3N0IGV4Y2VwdGlvbnMgYXJlIG1lcmUKK0w8RXJyb3I6OlNpbXBsZT4gaW5zdGFuY2VzLgorCitIb3dldmVyLCB0aGUgQzxjb21tYW5kKCk+LCBDPGNvbW1hbmRfb25lbGluZSgpPiBhbmQgQzxjb21tYW5kX25vaXN5KCk+CitmdW5jdGlvbnMgc3VpdGUgY2FuIHRocm93IEM8R2l0OjpFcnJvcjo6Q29tbWFuZD4gZXhjZXB0aW9ucyBhcyB3ZWxsOiB0aG9zZSBhcmUKK3Rocm93biB3aGVuIHRoZSBleHRlcm5hbCBjb21tYW5kIHJldHVybnMgYW4gZXJyb3IgY29kZSBhbmQgY29udGFpbiB0aGUgZXJyb3IKK2NvZGUgYXMgd2VsbCBhcyBhY2Nlc3MgdG8gdGhlIGNhcHR1cmVkIGNvbW1hbmQncyBvdXRwdXQuIFRoZSBleGNlcHRpb24gY2xhc3MKK3Byb3ZpZGVzIHRoZSB1c3VhbCBDPHN0cmluZ2lmeT4gYW5kIEM8dmFsdWU+IChjb21tYW5kJ3MgZXhpdCBjb2RlKSBtZXRob2RzIGFuZAoraW4gYWRkaXRpb24gYWxzbyBhIEM8Y21kX291dHB1dD4gbWV0aG9kIHRoYXQgcmV0dXJucyBlaXRoZXIgYW4gYXJyYXkgb3IgYQorc3RyaW5nIHdpdGggdGhlIGNhcHR1cmVkIGNvbW1hbmQgb3V0cHV0IChkZXBlbmRpbmcgb24gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCitjYWxsIGNvbnRleHQ7IEM8Y29tbWFuZF9ub2lzeSgpPiByZXR1cm5zIEM8dW5kZWY+KSBhbmQgJDxjbWRsaW5lPiB3aGljaAorcmV0dXJucyB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cyAoYnV0IHdpdGhvdXQgcHJvcGVyIHF1b3RpbmcpLgorCitOb3RlIHRoYXQgdGhlIEM8Y29tbWFuZF8qX3BpcGUoKT4gZnVuY3Rpb25zIGNhbm5vdCB0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZQoraXQgaGFzIG5vIGlkZWEgd2hldGhlciB0aGUgY29tbWFuZCBmYWlsZWQgb3Igbm90LiBZb3Ugd2lsbCBvbmx5IGZpbmQgb3V0CithdCB0aGUgdGltZSB5b3UgQzxjbG9zZT4gdGhlIHBpcGU7IGlmIHlvdSB3YW50IHRvIGhhdmUgdGhhdCBhdXRvbWF0ZWQsCit1c2UgQzxjb21tYW5kX2Nsb3NlX3BpcGUoKT4sIHdoaWNoIGNhbiB0aHJvdyB0aGUgZXhjZXB0aW9uLgorCis9Y3V0CisKK3sKKwlwYWNrYWdlIEdpdDo6RXJyb3I6OkNvbW1hbmQ7CisKKwlAR2l0OjpFcnJvcjo6Q29tbWFuZDo6SVNBID0gcXcoRXJyb3IpOworCisJc3ViIG5ldyB7CisJCW15ICRzZWxmID0gc2hpZnQ7CisJCW15ICRjbWRsaW5lID0gJycgLiBzaGlmdDsKKwkJbXkgJHZhbHVlID0gMCArIHNoaWZ0OworCQlteSAkb3V0cHV0cmVmID0gc2hpZnQ7CisJCW15KEBhcmdzKSA9ICgpOworCisJCWxvY2FsICRFcnJvcjo6RGVwdGggPSAkRXJyb3I6OkRlcHRoICsgMTsKKworCQlwdXNoKEBhcmdzLCAnLWNtZGxpbmUnLCAkY21kbGluZSk7CisJCXB1c2goQGFyZ3MsICctdmFsdWUnLCAkdmFsdWUpOworCQlwdXNoKEBhcmdzLCAnLW91dHB1dHJlZicsICRvdXRwdXRyZWYpOworCisJCSRzZWxmLT5TVVBFUjo6bmV3KC10ZXh0ID0+ICdjb21tYW5kIHJldHVybmVkIGVycm9yJywgQGFyZ3MpOworCX0KKworCXN1YiBzdHJpbmdpZnkgeworCQlteSAkc2VsZiA9IHNoaWZ0OworCQlteSAkdGV4dCA9ICRzZWxmLT5TVVBFUjo6c3RyaW5naWZ5OworCQkkc2VsZi0+Y21kbGluZSgpIC4gJzogJyAuICR0ZXh0IC4gJzogJyAuICRzZWxmLT52YWx1ZSgpIC4gIlxuIjsKKwl9CisKKwlzdWIgY21kbGluZSB7CisJCW15ICRzZWxmID0gc2hpZnQ7CisJCSRzZWxmLT57Jy1jbWRsaW5lJ307CisJfQorCisJc3ViIGNtZF9vdXRwdXQgeworCQlteSAkc2VsZiA9IHNoaWZ0OworCQlteSAkcmVmID0gJHNlbGYtPnsnLW91dHB1dHJlZid9OworCQlkZWZpbmVkICRyZWYgb3IgdW5kZWY7CisJCWlmIChyZWYgJHJlZiBlcSAnQVJSQVknKSB7CisJCQlyZXR1cm4gQCRyZWY7CisJCX0gZWxzZSB7ICMgU0NBTEFSCisJCQlyZXR1cm4gJCRyZWY7CisJCX0KKwl9Cit9CisKKz1vdmVyIDQKKworPWl0ZW0gZ2l0X2NtZF90cnkgeyBDT0RFIH0gRVJSTVNHCisKK1RoaXMgbWFnaWNhbCBzdGF0ZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhdGNoIGFueSBDPEdpdDo6RXJyb3I6OkNvbW1hbmQ+CitleGNlcHRpb25zIHRocm93biBieSBDPENPREU+IGFuZCBtYWtlIHlvdXIgcHJvZ3JhbSBkaWUgd2l0aCBDPEVSUk1TRz4KK29uIGl0cyBsaXBzOyB0aGUgbWVzc2FnZSB3aWxsIGhhdmUgJXMgc3Vic3RpdHV0ZWQgZm9yIHRoZSBjb21tYW5kIGxpbmUKK2FuZCAlZCBmb3IgdGhlIGV4aXQgc3RhdHVzLiBUaGlzIHN0YXRlbWVudCBpcyB1c2VmdWwgbW9zdGx5IGZvciBwcm9kdWNpbmcKK21vcmUgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlcy4KKworSW4gY2FzZSBvZiBubyBleGNlcHRpb24gY2F1Z2h0IHRoZSBzdGF0ZW1lbnQgcmV0dXJucyBDPENPREU+J3MgcmV0dXJuIHZhbHVlLgorCitOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSBhdXRvLWV4cG9ydGVkIGZ1bmN0aW9uLgorCis9Y3V0CisKK3N1YiBnaXRfY21kX3RyeSgmJCkgeworCW15ICgkY29kZSwgJGVycm1zZykgPSBAXzsKKwlteSBAcmVzdWx0OworCW15ICRlcnI7CisJbXkgJGFycmF5ID0gd2FudGFycmF5OworCXRyeSB7CisJCWlmICgkYXJyYXkpIHsKKwkJCUByZXN1bHQgPSAmJGNvZGU7CisJCX0gZWxzZSB7CisJCQkkcmVzdWx0WzBdID0gJiRjb2RlOworCQl9CisJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQlteSAkRSA9IHNoaWZ0OworCQkkZXJyID0gJGVycm1zZzsKKwkJJGVyciA9fiBzL1wlcy8kRS0+Y21kbGluZSgpL2dlOworCQkkZXJyID1+IHMvXCVkLyRFLT52YWx1ZSgpL2dlOworCQkjIFdlIGNhbid0IGNyb2FrIGhlcmUgc2luY2UgRXJyb3IucG0gd291bGQgbWFuZ2xlCisJCSMgdGhhdCB0byBFcnJvcjo6U2ltcGxlLgorCX07CisJJGVyciBhbmQgY3JvYWsgJGVycjsKKwlyZXR1cm4gJGFycmF5ID8gQHJlc3VsdCA6ICRyZXN1bHRbMF07Cit9CisKKworPWJhY2sKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgMjAwNiBieSBQZXRyIEJhdWRpcyBFPGx0PnBhc2t5QHN1c2UuY3pFPGd0Pi4KKworVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKK2FuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAorZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworPWN1dAorCisKKyMgVGFrZSByYXcgbWV0aG9kIGFyZ3VtZW50IGxpc3QgYW5kIHJldHVybiAoJG9iaiwgQGFyZ3MpIGluIGNhc2UKKyMgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIHVwb24gYW4gaW5zdGFuY2UgYW5kICh1bmRlZiwgQGFyZ3MpIGlmCisjIGl0IHdhcyBjYWxsZWQgZGlyZWN0bHkuCitzdWIgX21heWJlX3NlbGYgeworCSMgVGhpcyBicmVha3MgaW5oZXJpdGFuY2UuIE9oIHdlbGwuCisJcmVmICRfWzBdIGVxICdHaXQnID8gQF8gOiAodW5kZWYsIEBfKTsKK30KKworIyBDaGVjayBpZiB0aGUgY29tbWFuZCBpZCBpcyBzb21ldGhpbmcgcmVhc29uYWJsZS4KK3N1YiBfY2hlY2tfdmFsaWRfY21kIHsKKwlteSAoJGNtZCkgPSBAXzsKKwkkY21kID1+IC9eW2EtejAtOUEtWl8tXSskLyBvciB0aHJvdyBFcnJvcjo6U2ltcGxlKCJiYWQgY29tbWFuZDogJGNtZCIpOworfQorCisjIENvbW1vbiBiYWNrZW5kIGZvciB0aGUgcGlwZSBjcmVhdG9ycy4KK3N1YiBfY29tbWFuZF9jb21tb25fcGlwZSB7CisJbXkgJGRpcmVjdGlvbiA9IHNoaWZ0OworCW15ICgkc2VsZiwgQHApID0gX21heWJlX3NlbGYoQF8pOworCW15ICglb3B0cywgJGNtZCwgQGFyZ3MpOworCWlmIChyZWYgJHBbMF0pIHsKKwkJKCRjbWQsIEBhcmdzKSA9IEB7c2hpZnQgQHB9OworCQklb3B0cyA9IHJlZiAkcFswXSA/ICV7JHBbMF19IDogQHA7CisJfSBlbHNlIHsKKwkJKCRjbWQsIEBhcmdzKSA9IEBwOworCX0KKwlfY2hlY2tfdmFsaWRfY21kKCRjbWQpOworCisJbXkgJGZoOworCWlmICgkXk8gZXEgJ01TV2luMzInKSB7CisJCSMgQWN0aXZlU3RhdGUgUGVybAorCQkjZGVmaW5lZCAkb3B0c3tTVERFUlJ9IGFuZAorCQkjCXdhcm4gJ2lnbm9yaW5nIFNUREVSUiBvcHRpb24gLSBydW5uaW5nIHcvIEFjdGl2ZVN0YXRlJzsKKwkJJGRpcmVjdGlvbiBlcSAnLXwnIG9yCisJCQlkaWUgJ2lucHV0IHBpcGUgZm9yIEFjdGl2ZVN0YXRlIG5vdCBpbXBsZW1lbnRlZCc7CisJCSMgdGhlIHN0cmFuZ2UgY29uc3RydWN0aW9uIHdpdGggKkFDUElQRSBpcyBqdXN0IHRvCisJCSMgZXhwbGFpbiB0aGUgdGllIGJlbG93IHRoYXQgd2Ugd2FudCB0byBiaW5kIHRvCisJCSMgYSBoYW5kbGUgY2xhc3MsIG5vdCBzY2FsYXIuIEl0IGlzIG5vdCBrbm93biBpZgorCQkjIGl0IGlzIHNvbWV0aGluZyBzcGVjaWZpYyB0byBBY3RpdmVTdGF0ZSBQZXJsIG9yCisJCSMganVzdCBhIFBlcmwgcXVpcmsuCisJCXRpZSAoKkFDUElQRSwgJ0dpdDo6YWN0aXZlc3RhdGVfcGlwZScsICRjbWQsIEBhcmdzKTsKKwkJJGZoID0gKkFDUElQRTsKKworCX0gZWxzZSB7CisJCW15ICRwaWQgPSBvcGVuKCRmaCwgJGRpcmVjdGlvbik7CisJCWlmIChub3QgZGVmaW5lZCAkcGlkKSB7CisJCQl0aHJvdyBFcnJvcjo6U2ltcGxlKCJvcGVuIGZhaWxlZDogJCEiKTsKKwkJfSBlbHNpZiAoJHBpZCA9PSAwKSB7CisJCQlpZiAoZGVmaW5lZCAkb3B0c3tTVERFUlJ9KSB7CisJCQkJY2xvc2UgU1RERVJSOworCQkJfQorCQkJaWYgKCRvcHRze1NUREVSUn0pIHsKKwkJCQlvcGVuIChTVERFUlIsICc+JicsICRvcHRze1NUREVSUn0pCisJCQkJCW9yIGRpZSAiZHVwIGZhaWxlZDogJCEiOworCQkJfQorCQkJX2NtZF9leGVjKCRzZWxmLCAkY21kLCBAYXJncyk7CisJCX0KKwl9CisJcmV0dXJuIHdhbnRhcnJheSA/ICgkZmgsIGpvaW4oJyAnLCAkY21kLCBAYXJncykpIDogJGZoOworfQorCisjIFdoZW4gYWxyZWFkeSBpbiB0aGUgc3VicHJvY2Vzcywgc2V0IHVwIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZQorIyBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnkgYW5kIGV4ZWN1dGUgdGhlIGdpdCBjb21tYW5kLgorc3ViIF9jbWRfZXhlYyB7CisJbXkgKCRzZWxmLCBAYXJncykgPSBAXzsKKwlpZiAoJHNlbGYpIHsKKwkJJHNlbGYtPnJlcG9fcGF0aCgpIGFuZCAkRU5WeydHSVRfRElSJ30gPSAkc2VsZi0+cmVwb19wYXRoKCk7CisJCSRzZWxmLT53Y19wYXRoKCkgYW5kIGNoZGlyKCRzZWxmLT53Y19wYXRoKCkpOworCQkkc2VsZi0+d2Nfc3ViZGlyKCkgYW5kIGNoZGlyKCRzZWxmLT53Y19zdWJkaXIoKSk7CisJfQorCV9leGVjdl9naXRfY21kKEBhcmdzKTsKKwlkaWUgImV4ZWMgZmFpbGVkOiAkISI7Cit9CisKKyMgRXhlY3V0ZSB0aGUgZ2l2ZW4gR2l0IGNvbW1hbmQgKCRfWzBdKSB3aXRoIGFyZ3VtZW50cyAoJF9bMS4uXSkKKyMgYnkgc2VhcmNoaW5nIGZvciBpdCBhdCBwcm9wZXIgcGxhY2VzLgorc3ViIF9leGVjdl9naXRfY21kIHsgZXhlYygnZ2l0JywgQF8pOyB9CisKKyMgQ2xvc2UgcGlwZSB0byBhIHN1YnByb2Nlc3MuCitzdWIgX2NtZF9jbG9zZSB7CisJbXkgKCRmaCwgJGN0eCkgPSBAXzsKKwlpZiAobm90IGNsb3NlICRmaCkgeworCQlpZiAoJCEpIHsKKwkJCSMgSXQncyBqdXN0IGNsb3NlLCBubyBwb2ludCBpbiBmYXRhbGl0aWVzCisJCQljYXJwICJlcnJvciBjbG9zaW5nIHBpcGU6ICQhIjsKKwkJfSBlbHNpZiAoJD8gPj4gOCkgeworCQkJIyBUaGUgY2FsbGVyIHNob3VsZCBwZXBwZXIgdGhpcy4KKwkJCXRocm93IEdpdDo6RXJyb3I6OkNvbW1hbmQoJGN0eCwgJD8gPj4gOCk7CisJCX0KKwkJIyBlbHNlIHdlIG1pZ2h0IGUuZy4gY2xvc2VkIGEgbGl2ZSBzdHJlYW07IHRoZSBjb21tYW5kCisJCSMgZHlpbmcgb2YgU0lHUElQRSB3b3VsZCBkcml2ZSB1cyBoZXJlLgorCX0KK30KKworCitzdWIgREVTVFJPWSB7IH0KKworCisjIFBpcGUgaW1wbGVtZW50YXRpb24gZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCisKK3BhY2thZ2UgR2l0OjphY3RpdmVzdGF0ZV9waXBlOwordXNlIHN0cmljdDsKKworc3ViIFRJRUhBTkRMRSB7CisJbXkgKCRjbGFzcywgQHBhcmFtcykgPSBAXzsKKwkjIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IGhvcnJpYmxlIGlkZWEgYW5kIHRoZSB0aGluZyB3aWxsIGV4cGxvZGUKKwkjIGF0IHRoZSBtb21lbnQgeW91IGdpdmUgaXQgYXJndW1lbnRzIHRoYXQgcmVxdWlyZSBzb21lIHF1b3RpbmcsCisJIyBidXQgSSBoYXZlIG5vIEFjdGl2ZVN0YXRlIGNsdWUuLi4gLS1wYXNreQorCSMgTGV0J3MganVzdCBob3BlIEFjdGl2ZVN0YXRlIFBlcmwgZG9lcyBhdCBsZWFzdCB0aGUgcXVvdGluZworCSMgY29ycmVjdGx5LgorCW15IEBkYXRhID0gcXh7Z2l0IEBwYXJhbXN9OworCWJsZXNzIHsgaSA9PiAwLCBkYXRhID0+IFxAZGF0YSB9LCAkY2xhc3M7Cit9CisKK3N1YiBSRUFETElORSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlpZiAoJHNlbGYtPntpfSA+PSBzY2FsYXIgQHskc2VsZi0+e2RhdGF9fSkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkc2VsZi0+eydkYXRhJ30tPlsgJHNlbGYtPntpfSsrIF07Cit9CisKK3N1YiBDTE9TRSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlkZWxldGUgJHNlbGYtPntkYXRhfTsKKwlkZWxldGUgJHNlbGYtPntpfTsKK30KKworc3ViIEVPRiB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlyZXR1cm4gKCRzZWxmLT57aX0gPj0gc2NhbGFyIEB7JHNlbGYtPntkYXRhfX0pOworfQorCisKKzE7ICMgRmFtb3VzIGxhc3Qgd29yZHMKZGlmZiAtLWdpdCBhL3BlcmwvTWFrZWZpbGUgYi9wZXJsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjk1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wZXJsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHBlcmwgc3VwcG9ydCBtb2R1bGVzIGFuZCByb3V0aW5lCisjCittYWtmaWxlOj1wZXJsLm1haworCitQRVJMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFBFUkxfUEFUSCkpCitwcmVmaXhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHByZWZpeCkpCisKK2lmbmRlZiBWCisJUVVJRVQgPSBACitlbmRpZgorCithbGwgaW5zdGFsbCBpbnN0bGliZGlyOiAkKG1ha2ZpbGUpCisJJChRVUlFVCkkKE1BS0UpIC1mICQobWFrZmlsZSkgJEAKKworY2xlYW46CisJJChRVUlFVCl0ZXN0IC1mICQobWFrZmlsZSkgJiYgJChNQUtFKSAtZiAkKG1ha2ZpbGUpICRAIHx8IGV4aXQgMAorCSQoUk0pIHBwcG9ydC5oCisJJChSTSkgJChtYWtmaWxlKQorCSQoUk0pICQobWFrZmlsZSkub2xkCisKK2lmZGVmIE5PX1BFUkxfTUFLRU1BS0VSCitpbnN0ZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChwcmVmaXgpL2xpYikKKyQobWFrZmlsZSk6IC4uL0dJVC1DRkxBR1MgTWFrZWZpbGUKKwllY2hvIGFsbDogPiAkQAorCWVjaG8gJwk6JyA+PiAkQAorCWVjaG8gaW5zdGFsbDogPj4gJEAKKwllY2hvICcJbWtkaXIgLXAgJChpbnN0ZGlyX1NRKScgPj4gJEAKKwllY2hvICcJJChSTSkgJChpbnN0ZGlyX1NRKS9HaXQucG07IGNwIEdpdC5wbSAkKGluc3RkaXJfU1EpJyA+PiAkQAorCWVjaG8gJwkkKFJNKSAkKGluc3RkaXJfU1EpL0Vycm9yLnBtOyBcCisJY3AgcHJpdmF0ZS1FcnJvci5wbSAkKGluc3RkaXJfU1EpL0Vycm9yLnBtJyA+PiAkQAorCWVjaG8gaW5zdGxpYmRpcjogPj4gJEAKKwllY2hvICcJZWNobyAkKGluc3RkaXJfU1EpJyA+PiAkQAorZWxzZQorJChtYWtmaWxlKTogTWFrZWZpbGUuUEwgLi4vR0lULUNGTEFHUworCSQoUEVSTF9QQVRIKSAkPCBQUkVGSVg9JyQocHJlZml4X1NRKScKK2VuZGlmCisKKyMgdGhpcyBpcyBqdXN0IGFkZGVkIGNvbWZvcnQgZm9yIGNhbGxpbmcgbWFrZSBkaXJlY3RseSBpbiBwZXJsIGRpcgorIyAoZXZlbiB0aG91Z2ggR0lULUNGTEFHUyBhcmVuJ3QgdXNlZCB5ZXQuIElmIGV2ZXIpCisuLi9HSVQtQ0ZMQUdTOgorCSQoTUFLRSkgLUMgLi4gR0lULUNGTEFHUworCmRpZmYgLS1naXQgYS9wZXJsL01ha2VmaWxlLlBMIGIvcGVybC9NYWtlZmlsZS5QTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc1MTYxCi0tLSAvZGV2L251bGwKKysrIGIvcGVybC9NYWtlZmlsZS5QTApAQCAtMCwwICsxLDMzIEBACit1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKKworc3ViIE1ZOjpwb3N0YW1ibGUgeworCXJldHVybiA8PCdNQUtFX0ZSQUcnOworaW5zdGxpYmRpcjoKKwlAZWNobyAnJChJTlNUQUxMU0lURUxJQiknCisKK01BS0VfRlJBRworfQorCitteSAlcG0gPSAoJ0dpdC5wbScgPT4gJyQoSU5TVF9MSUJESVIpL0dpdC5wbScpOworCisjIFdlIGNvbWUgd2l0aCBvdXIgb3duIGJ1bmRsZWQgRXJyb3IucG0uIEl0J3Mgbm90IGluIHRoZSBzZXQgb2YgZGVmYXVsdAorIyBQZXJsIG1vZHVsZXMgc28gaW5zdGFsbCBpdCBpZiBpdCdzIG5vdCBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSB5ZXQuCitldmFsIHsgcmVxdWlyZSBFcnJvciB9OworaWYgKCRAIHx8ICRFcnJvcjo6VkVSU0lPTiA8IDAuMTUwMDkpIHsKKwkkcG17J3ByaXZhdGUtRXJyb3IucG0nfSA9ICckKElOU1RfTElCRElSKS9FcnJvci5wbSc7Cit9CisKK215ICVleHRyYTsKKyRleHRyYXtERVNURElSfSA9ICRFTlZ7REVTVERJUn0gaWYgJEVOVntERVNURElSfTsKKworIyByZWRpcmVjdCBzdGRvdXQsIG90aGVyd2lzZSB0aGUgbWVzc2FnZSAiV3JpdGluZyBwZXJsLm1hayBmb3IgR2l0IgorIyBkaXNydXB0cyB0aGUgb3V0cHV0IGZvciB0aGUgdGFyZ2V0ICdpbnN0bGliZGlyJworb3BlbiBTVERPVVQsICI+JlNUREVSUiI7CisKK1dyaXRlTWFrZWZpbGUoCisJTkFNRSAgICAgICAgICAgID0+ICdHaXQnLAorCVZFUlNJT05fRlJPTSAgICA9PiAnR2l0LnBtJywKKwlQTQkJPT4gXCVwbSwKKwlNQUtFRklMRQk9PiAncGVybC5tYWsnLAorCSVleHRyYQorKTsKZGlmZiAtLWdpdCBhL3BlcmwvcHJpdmF0ZS1FcnJvci5wbSBiL3BlcmwvcHJpdmF0ZS1FcnJvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU5Y2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvcGVybC9wcml2YXRlLUVycm9yLnBtCkBAIC0wLDAgKzEsODI3IEBACisjIEVycm9yLnBtCisjCisjIENvcHlyaWdodCAoYykgMTk5Ny04IEdyYWhhbSBCYXJyIDxnYmFyckB0aS5jb20+LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKyMKKyMgQmFzZWQgb24gbXkgb3JpZ2luYWwgRXJyb3IucG0sIGFuZCBFeGNlcHRpb25zLnBtIGJ5IFBldGVyIFNlaWJlbAorIyA8cGV0ZXJAd2VibG9naWMuY29tPiBhbmQgYWRhcHRlZCBieSBKZXNzZSBHbGljayA8amdsaWNrQHNpZy5ic2guY29tPi4KKyMKKyMgYnV0IG1vZGlmaWVkICoqKnNpZ25pZmljYW50bHkqKioKKworcGFja2FnZSBFcnJvcjsKKwordXNlIHN0cmljdDsKK3VzZSB2YXJzIHF3KCRWRVJTSU9OKTsKK3VzZSA1LjAwNDsKKworJFZFUlNJT04gPSAiMC4xNTAwOSI7CisKK3VzZSBvdmVybG9hZCAoCisJJyIiJwkgICA9Pgknc3RyaW5naWZ5JywKKwknMCsnCSAgID0+CSd2YWx1ZScsCisJJ2Jvb2wnICAgICA9PglzdWIgeyByZXR1cm4gMTsgfSwKKwknZmFsbGJhY2snID0+CTEKKyk7CisKKyRFcnJvcjo6RGVwdGggPSAwOwkjIERlcHRoIHRvIHBhc3MgdG8gY2FsbGVyKCkKKyRFcnJvcjo6RGVidWcgPSAwOwkjIEdlbmVyYXRlIHZlcmJvc2Ugc3RhY2sgdHJhY2VzCitARXJyb3I6OlNUQUNLID0gKCk7CSMgQ2xhdXNlIHN0YWNrIGZvciB0cnkKKyRFcnJvcjo6VEhST1dOID0gdW5kZWY7CSMgbGFzdCBlcnJvciB0aHJvd24sIGEgd29ya2Fyb3VuZCB1bnRpbCBkaWUgJHJlZiB3b3JrcworCitteSAkTEFTVDsJCSMgTGFzdCBlcnJvciBjcmVhdGVkCitteSAlRVJST1I7CQkjIExhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHBhY2thZ2UKKworc3ViIHRocm93X0Vycm9yX1NpbXBsZQoreworICAgIG15ICRhcmdzID0gc2hpZnQ7CisgICAgcmV0dXJuIEVycm9yOjpTaW1wbGUtPm5ldygkYXJncy0+eyd0ZXh0J30pOworfQorCiskRXJyb3I6Ok9iamVjdGlmeUNhbGxiYWNrID0gXCZ0aHJvd19FcnJvcl9TaW1wbGU7CisKKworIyBFeHBvcnRlZCBzdWJzIGFyZSBkZWZpbmVkIGluIEVycm9yOjpzdWJzCisKK3N1YiBpbXBvcnQgeworICAgIHNoaWZ0OworICAgIGxvY2FsICRFeHBvcnRlcjo6RXhwb3J0TGV2ZWwgPSAkRXhwb3J0ZXI6OkV4cG9ydExldmVsICsgMTsKKyAgICBFcnJvcjo6c3Vicy0+aW1wb3J0KEBfKTsKK30KKworIyBJIHJlYWxseSB3YW50IHRvIHVzZSBsYXN0IGZvciB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCwgYnV0IGl0IGlzIGEga2V5d29yZAorIyB3aGljaCBwcmV2ZW50IHRoZSBzeW50YXggIGxhc3QgRXJyb3IKKworc3ViIHByaW9yIHsKKyAgICBzaGlmdDsgIyBpZ25vcmUKKworICAgIHJldHVybiAkTEFTVCB1bmxlc3MgQF87CisKKyAgICBteSAkcGtnID0gc2hpZnQ7CisgICAgcmV0dXJuIGV4aXN0cyAkRVJST1J7JHBrZ30gPyAkRVJST1J7JHBrZ30gOiB1bmRlZgorCXVubGVzcyByZWYoJHBrZyk7CisKKyAgICBteSAkb2JqID0gJHBrZzsKKyAgICBteSAkZXJyID0gdW5kZWY7CisgICAgaWYoJG9iai0+aXNhKCdIQVNIJykpIHsKKwkkZXJyID0gJG9iai0+eydfX0Vycm9yX18nfQorCSAgICBpZiBleGlzdHMgJG9iai0+eydfX0Vycm9yX18nfTsKKyAgICB9CisgICAgZWxzaWYoJG9iai0+aXNhKCdHTE9CJykpIHsKKwkkZXJyID0gJHsqJG9ian17J19fRXJyb3JfXyd9CisJICAgIGlmIGV4aXN0cyAkeyokb2JqfXsnX19FcnJvcl9fJ307CisgICAgfQorCisgICAgJGVycjsKK30KKworc3ViIGZsdXNoIHsKKyAgICBzaGlmdDsgI2lnbm9yZQorCisgICAgdW5sZXNzIChAXykgeworICAgICAgICRMQVNUID0gdW5kZWY7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG15ICRwa2cgPSBzaGlmdDsKKyAgICByZXR1cm4gdW5sZXNzIHJlZigkcGtnKTsKKworICAgIHVuZGVmICRFUlJPUnskcGtnfSBpZiBkZWZpbmVkICRFUlJPUnskcGtnfTsKK30KKworIyBSZXR1cm4gYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSBhYm91dCB3aGVyZSB0aGUgZXJyb3IKKyMgaGFwcGVuZWQuIFRoZSAtc3RhY2t0cmFjZSBlbGVtZW50IG9ubHkgZXhpc3RzIGlmICRFcnJvcjo6REVCVUcKKyMgd2FzIHNldCB3aGVuIHRoZSBlcnJvciB3YXMgY3JlYXRlZAorCitzdWIgc3RhY2t0cmFjZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+eyctc3RhY2t0cmFjZSd9CisJaWYgZXhpc3RzICRzZWxmLT57Jy1zdGFja3RyYWNlJ307CisKKyAgICBteSAkdGV4dCA9IGV4aXN0cyAkc2VsZi0+eyctdGV4dCd9ID8gJHNlbGYtPnsnLXRleHQnfSA6ICJEaWVkIjsKKworICAgICR0ZXh0IC49IHNwcmludGYoIiBhdCAlcyBsaW5lICVkLlxuIiwgJHNlbGYtPmZpbGUsICRzZWxmLT5saW5lKQorCXVubGVzcygkdGV4dCA9fiAvXG4kL3MpOworCisgICAgJHRleHQ7Cit9CisKKyMgQWxsb3cgZXJyb3IgcHJvcGFnYXRpb24sIGllCisjCisjICRiZXItPmVuY29kZSguLi4pIG9yCisjICAgIHJldHVybiBFcnJvci0+cHJpb3IoJGJlciktPmFzc29jaWF0ZSgkbGRhcCk7CisKK3N1YiBhc3NvY2lhdGUgeworICAgIG15ICRlcnIgPSBzaGlmdDsKKyAgICBteSAkb2JqID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzIHJlZigkb2JqKTsKKworICAgIGlmKCRvYmotPmlzYSgnSEFTSCcpKSB7CisJJG9iai0+eydfX0Vycm9yX18nfSA9ICRlcnI7CisgICAgfQorICAgIGVsc2lmKCRvYmotPmlzYSgnR0xPQicpKSB7CisJJHsqJG9ian17J19fRXJyb3JfXyd9ID0gJGVycjsKKyAgICB9CisgICAgJG9iaiA9IHJlZigkb2JqKTsKKyAgICAkRVJST1J7IHJlZigkb2JqKSB9ID0gJGVycjsKKworICAgIHJldHVybjsKK30KKworc3ViIG5ldyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSgkcGtnLCRmaWxlLCRsaW5lKSA9IGNhbGxlcigkRXJyb3I6OkRlcHRoKTsKKworICAgIG15ICRlcnIgPSBibGVzcyB7CisJJy1wYWNrYWdlJyA9PiAkcGtnLAorCSctZmlsZScgICAgPT4gJGZpbGUsCisJJy1saW5lJyAgICA9PiAkbGluZSwKKwlAXworICAgIH0sICRzZWxmOworCisgICAgJGVyci0+YXNzb2NpYXRlKCRlcnItPnsnLW9iamVjdCd9KQorCWlmKGV4aXN0cyAkZXJyLT57Jy1vYmplY3QnfSk7CisKKyAgICAjIFRvIGFsd2F5cyBjcmVhdGUgYSBzdGFja3RyYWNlIHdvdWxkIGJlIHZlcnkgaW5lZmZpY2llbnQsIHNvCisgICAgIyB3ZSBvbmx5IGRvIGl0IGlmICRFcnJvcjo6RGVidWcgaXMgc2V0CisKKyAgICBpZigkRXJyb3I6OkRlYnVnKSB7CisJcmVxdWlyZSBDYXJwOworCWxvY2FsICRDYXJwOjpDYXJwTGV2ZWwgPSAkRXJyb3I6OkRlcHRoOworCW15ICR0ZXh0ID0gZGVmaW5lZCgkZXJyLT57Jy10ZXh0J30pID8gJGVyci0+eyctdGV4dCd9IDogIkVycm9yIjsKKwlteSAkdHJhY2UgPSBDYXJwOjpsb25nbWVzcygkdGV4dCk7CisJIyBSZW1vdmUgdHJ5IGNhbGxzIGZyb20gdGhlIHRyYWNlCisJJHRyYWNlID1+IHMvKFxuXHMrXFMrX19BTk9OX19bXlxuXSspP1xuXHMrZXZhbFteXG5dK1xuXHMrRXJyb3I6OnN1YnM6OnRyeVteXG5dKyg/PVxuKS8vc29nOworCSR0cmFjZSA9fiBzLyhcblxzK1xTK19fQU5PTl9fW15cbl0rKT9cblxzK2V2YWxbXlxuXStcblxzK0Vycm9yOjpzdWJzOjpydW5fY2xhdXNlc1teXG5dK1xuXHMrRXJyb3I6OnN1YnM6OnRyeVteXG5dKyg/PVxuKS8vc29nOworCSRlcnItPnsnLXN0YWNrdHJhY2UnfSA9ICR0cmFjZQorICAgIH0KKworICAgICRAID0gJExBU1QgPSAkRVJST1J7JHBrZ30gPSAkZXJyOworfQorCisjIFRocm93IGFuIGVycm9yLiB0aGlzIGNvbnRhaW5zIHNvbWUgdmVyeSBnb3J5IGNvZGUuCisKK3N1YiB0aHJvdyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBsb2NhbCAkRXJyb3I6OkRlcHRoID0gJEVycm9yOjpEZXB0aCArIDE7CisKKyAgICAjIGlmIHdlIGFyZSBub3QgcmV0aHJvdy1pbmcgdGhlbiBjcmVhdGUgdGhlIG9iamVjdCB0byB0aHJvdworICAgICRzZWxmID0gJHNlbGYtPm5ldyhAXykgdW5sZXNzIHJlZigkc2VsZik7CisKKyAgICBkaWUgJEVycm9yOjpUSFJPV04gPSAkc2VsZjsKK30KKworIyBzeW50YWN0aWMgc3VnYXIgZm9yCisjCisjICAgIGRpZSB3aXRoIEVycm9yKCAuLi4gKTsKKworc3ViIHdpdGggeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbG9jYWwgJEVycm9yOjpEZXB0aCA9ICRFcnJvcjo6RGVwdGggKyAxOworCisgICAgJHNlbGYtPm5ldyhAXyk7Cit9CisKKyMgc3ludGFjdGljIHN1Z2FyIGZvcgorIworIyAgICByZWNvcmQgRXJyb3IoIC4uLiApIGFuZCByZXR1cm47CisKK3N1YiByZWNvcmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbG9jYWwgJEVycm9yOjpEZXB0aCA9ICRFcnJvcjo6RGVwdGggKyAxOworCisgICAgJHNlbGYtPm5ldyhAXyk7Cit9CisKKyMgY2F0Y2ggY2xhdXNlIGZvcgorIworIyB0cnkgeyAuLi4gfSBjYXRjaCBDTEFTUyB3aXRoIHsgLi4uIH0KKworc3ViIGNhdGNoIHsKKyAgICBteSAkcGtnID0gc2hpZnQ7CisgICAgbXkgJGNvZGUgPSBzaGlmdDsKKyAgICBteSAkY2xhdXNlcyA9IHNoaWZ0IHx8IHt9OworICAgIG15ICRjYXRjaCA9ICRjbGF1c2VzLT57J2NhdGNoJ30gfHw9IFtdOworCisgICAgdW5zaGlmdCBAJGNhdGNoLCAgJHBrZywgJGNvZGU7CisKKyAgICAkY2xhdXNlczsKK30KKworIyBPYmplY3QgcXVlcnkgbWV0aG9kcworCitzdWIgb2JqZWN0IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGV4aXN0cyAkc2VsZi0+eyctb2JqZWN0J30gPyAkc2VsZi0+eyctb2JqZWN0J30gOiB1bmRlZjsKK30KKworc3ViIGZpbGUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgZXhpc3RzICRzZWxmLT57Jy1maWxlJ30gPyAkc2VsZi0+eyctZmlsZSd9IDogdW5kZWY7Cit9CisKK3N1YiBsaW5lIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGV4aXN0cyAkc2VsZi0+eyctbGluZSd9ID8gJHNlbGYtPnsnLWxpbmUnfSA6IHVuZGVmOworfQorCitzdWIgdGV4dCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBleGlzdHMgJHNlbGYtPnsnLXRleHQnfSA/ICRzZWxmLT57Jy10ZXh0J30gOiB1bmRlZjsKK30KKworIyBvdmVybG9hZCBtZXRob2RzCisKK3N1YiBzdHJpbmdpZnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgZGVmaW5lZCAkc2VsZi0+eyctdGV4dCd9ID8gJHNlbGYtPnsnLXRleHQnfSA6ICJEaWVkIjsKK30KKworc3ViIHZhbHVlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGV4aXN0cyAkc2VsZi0+eyctdmFsdWUnfSA/ICRzZWxmLT57Jy12YWx1ZSd9IDogdW5kZWY7Cit9CisKK3BhY2thZ2UgRXJyb3I6OlNpbXBsZTsKKworQEVycm9yOjpTaW1wbGU6OklTQSA9IHF3KEVycm9yKTsKKworc3ViIG5ldyB7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHRleHQgID0gIiIgLiBzaGlmdDsKKyAgICBteSAkdmFsdWUgPSBzaGlmdDsKKyAgICBteShAYXJncykgPSAoKTsKKworICAgIGxvY2FsICRFcnJvcjo6RGVwdGggPSAkRXJyb3I6OkRlcHRoICsgMTsKKworICAgIEBhcmdzID0gKCAtZmlsZSA9PiAkMSwgLWxpbmUgPT4gJDIpCisJaWYoJHRleHQgPX4gcy9ccythdFxzKyhcUyspXHMrbGluZVxzKyhcZCspKD86LFxzKjxbXj5dKj5ccytsaW5lXHMrXGQrKT9cLj9cbj8kLy9zKTsKKyAgICBwdXNoKEBhcmdzLCAnLXZhbHVlJywgMCArICR2YWx1ZSkKKwlpZiBkZWZpbmVkKCR2YWx1ZSk7CisKKyAgICAkc2VsZi0+U1VQRVI6Om5ldygtdGV4dCA9PiAkdGV4dCwgQGFyZ3MpOworfQorCitzdWIgc3RyaW5naWZ5IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR0ZXh0ID0gJHNlbGYtPlNVUEVSOjpzdHJpbmdpZnk7CisgICAgJHRleHQgLj0gc3ByaW50ZigiIGF0ICVzIGxpbmUgJWQuXG4iLCAkc2VsZi0+ZmlsZSwgJHNlbGYtPmxpbmUpCisJdW5sZXNzKCR0ZXh0ID1+IC9cbiQvcyk7CisgICAgJHRleHQ7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEluc3BpcmVkIGJ5IGNvZGUgZnJvbSBKZXNzZSBHbGljayA8amdsaWNrQHNpZy5ic2guY29tPiBhbmQKKyMgUGV0ZXIgU2VpYmVsIDxwZXRlckB3ZWJsb2dpYy5jb20+CisKK3BhY2thZ2UgRXJyb3I6OnN1YnM7CisKK3VzZSBFeHBvcnRlciAoKTsKK3VzZSB2YXJzIHF3KEBFWFBPUlRfT0sgQElTQSAlRVhQT1JUX1RBR1MpOworCitARVhQT1JUX09LICAgPSBxdyh0cnkgd2l0aCBmaW5hbGx5IGV4Y2VwdCBvdGhlcndpc2UpOworJUVYUE9SVF9UQUdTID0gKHRyeSA9PiBcQEVYUE9SVF9PSyk7CisKK0BJU0EgPSBxdyhFeHBvcnRlcik7CisKKworc3ViIGJsZXNzZWQgeworCW15ICRpdGVtID0gc2hpZnQ7CisJbG9jYWwgJEA7ICMgZG9uJ3Qga2lsbCBhbiBvdXRlciAkQAorCXJlZiAkaXRlbSBhbmQgZXZhbCB7ICRpdGVtLT5jYW4oJ2NhbicpIH07Cit9CisKKworc3ViIHJ1bl9jbGF1c2VzICgkJCRcQCkgeworICAgIG15KCRjbGF1c2VzLCRlcnIsJHdhbnRhcnJheSwkcmVzdWx0KSA9IEBfOworICAgIG15ICRjb2RlID0gdW5kZWY7CisKKyAgICAkZXJyID0gJEVycm9yOjpPYmplY3RpZnlDYWxsYmFjay0+KHsndGV4dCcgPT4kZXJyfSkgdW5sZXNzIHJlZigkZXJyKTsKKworICAgIENBVENIOiB7CisKKwkjIGNhdGNoCisJbXkgJGNhdGNoOworCWlmKGRlZmluZWQoJGNhdGNoID0gJGNsYXVzZXMtPnsnY2F0Y2gnfSkpIHsKKwkgICAgbXkgJGkgPSAwOworCisJICAgIENBVENITE9PUDoKKwkgICAgZm9yKCA7ICRpIDwgQCRjYXRjaCA7ICRpICs9IDIpIHsKKwkJbXkgJHBrZyA9ICRjYXRjaC0+WyRpXTsKKwkJdW5sZXNzKGRlZmluZWQgJHBrZykgeworCQkgICAgI2V4Y2VwdAorCQkgICAgc3BsaWNlKEAkY2F0Y2gsJGksMiwkY2F0Y2gtPlskaSsxXS0+KCkpOworCQkgICAgJGkgLT0gMjsKKwkJICAgIG5leHQgQ0FUQ0hMT09QOworCQl9CisJCWVsc2lmKGJsZXNzZWQoJGVycikgJiYgJGVyci0+aXNhKCRwa2cpKSB7CisJCSAgICAkY29kZSA9ICRjYXRjaC0+WyRpKzFdOworCQkgICAgd2hpbGUoMSkgeworCQkJbXkgJG1vcmUgPSAwOworCQkJbG9jYWwoJEVycm9yOjpUSFJPV04pOworCQkJbXkgJG9rID0gZXZhbCB7CisJCQkgICAgaWYoJHdhbnRhcnJheSkgeworCQkJCUB7JHJlc3VsdH0gPSAkY29kZS0+KCRlcnIsXCRtb3JlKTsKKwkJCSAgICB9CisJCQkgICAgZWxzaWYoZGVmaW5lZCgkd2FudGFycmF5KSkgeworCQkJICAgICAgICBAeyRyZXN1bHR9ID0gKCk7CisJCQkJJHJlc3VsdC0+WzBdID0gJGNvZGUtPigkZXJyLFwkbW9yZSk7CisJCQkgICAgfQorCQkJICAgIGVsc2UgeworCQkJCSRjb2RlLT4oJGVycixcJG1vcmUpOworCQkJICAgIH0KKwkJCSAgICAxOworCQkJfTsKKwkJCWlmKCAkb2sgKSB7CisJCQkgICAgbmV4dCBDQVRDSExPT1AgaWYgJG1vcmU7CisJCQkgICAgdW5kZWYgJGVycjsKKwkJCX0KKwkJCWVsc2UgeworCQkJICAgICRlcnIgPSBkZWZpbmVkKCRFcnJvcjo6VEhST1dOKQorCQkJCSAgICA/ICRFcnJvcjo6VEhST1dOIDogJEA7CisgICAgICAgICAgICAgICAgJGVyciA9ICRFcnJvcjo6T2JqZWN0aWZ5Q2FsbGJhY2stPih7J3RleHQnID0+JGVycn0pCisgICAgICAgICAgICAgICAgICAgIHVubGVzcyByZWYoJGVycik7CisJCQl9CisJCQlsYXN0IENBVENIOworCQkgICAgfTsKKwkJfQorCSAgICB9CisJfQorCisJIyBvdGhlcndpc2UKKwlteSAkb3dpc2U7CisJaWYoZGVmaW5lZCgkb3dpc2UgPSAkY2xhdXNlcy0+eydvdGhlcndpc2UnfSkpIHsKKwkgICAgbXkgJGNvZGUgPSAkY2xhdXNlcy0+eydvdGhlcndpc2UnfTsKKwkgICAgbXkgJG1vcmUgPSAwOworCSAgICBteSAkb2sgPSBldmFsIHsKKwkJaWYoJHdhbnRhcnJheSkgeworCQkgICAgQHskcmVzdWx0fSA9ICRjb2RlLT4oJGVycixcJG1vcmUpOworCQl9CisJCWVsc2lmKGRlZmluZWQoJHdhbnRhcnJheSkpIHsKKwkJICAgIEB7JHJlc3VsdH0gPSAoKTsKKwkJICAgICRyZXN1bHQtPlswXSA9ICRjb2RlLT4oJGVycixcJG1vcmUpOworCQl9CisJCWVsc2UgeworCQkgICAgJGNvZGUtPigkZXJyLFwkbW9yZSk7CisJCX0KKwkJMTsKKwkgICAgfTsKKwkgICAgaWYoICRvayApIHsKKwkJdW5kZWYgJGVycjsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJJGVyciA9IGRlZmluZWQoJEVycm9yOjpUSFJPV04pCisJCQk/ICRFcnJvcjo6VEhST1dOIDogJEA7CisKKyAgICAgICAgJGVyciA9ICRFcnJvcjo6T2JqZWN0aWZ5Q2FsbGJhY2stPih7J3RleHQnID0+JGVycn0pCisgICAgICAgICAgICB1bmxlc3MgcmVmKCRlcnIpOworCSAgICB9CisJfQorICAgIH0KKyAgICAkZXJyOworfQorCitzdWIgdHJ5ICgmOyQpIHsKKyAgICBteSAkdHJ5ID0gc2hpZnQ7CisgICAgbXkgJGNsYXVzZXMgPSBAXyA/IHNoaWZ0IDoge307CisgICAgbXkgJG9rID0gMDsKKyAgICBteSAkZXJyID0gdW5kZWY7CisgICAgbXkgQHJlc3VsdCA9ICgpOworCisgICAgdW5zaGlmdCBARXJyb3I6OlNUQUNLLCAkY2xhdXNlczsKKworICAgIG15ICR3YW50YXJyYXkgPSB3YW50YXJyYXkoKTsKKworICAgIGRvIHsKKwlsb2NhbCAkRXJyb3I6OlRIUk9XTiA9IHVuZGVmOworICAgIGxvY2FsICRAID0gdW5kZWY7CisKKwkkb2sgPSBldmFsIHsKKwkgICAgaWYoJHdhbnRhcnJheSkgeworCQlAcmVzdWx0ID0gJHRyeS0+KCk7CisJICAgIH0KKwkgICAgZWxzaWYoZGVmaW5lZCAkd2FudGFycmF5KSB7CisJCSRyZXN1bHRbMF0gPSAkdHJ5LT4oKTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJJHRyeS0+KCk7CisJICAgIH0KKwkgICAgMTsKKwl9OworCisJJGVyciA9IGRlZmluZWQoJEVycm9yOjpUSFJPV04pID8gJEVycm9yOjpUSFJPV04gOiAkQAorCSAgICB1bmxlc3MgJG9rOworICAgIH07CisKKyAgICBzaGlmdCBARXJyb3I6OlNUQUNLOworCisgICAgJGVyciA9IHJ1bl9jbGF1c2VzKCRjbGF1c2VzLCRlcnIsd2FudGFycmF5LEByZXN1bHQpCisJdW5sZXNzKCRvayk7CisKKyAgICAkY2xhdXNlcy0+eydmaW5hbGx5J30tPigpCisJaWYoZGVmaW5lZCgkY2xhdXNlcy0+eydmaW5hbGx5J30pKTsKKworICAgIGlmIChkZWZpbmVkKCRlcnIpKQorICAgIHsKKyAgICAgICAgaWYgKGJsZXNzZWQoJGVycikgJiYgJGVyci0+Y2FuKCd0aHJvdycpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAkZXJyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGllICRlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3YW50YXJyYXkgPyBAcmVzdWx0IDogJHJlc3VsdFswXTsKK30KKworIyBFYWNoIGNsYXVzZSBhZGRzIGEgc3ViIHRvIHRoZSBsaXN0IG9mIGNsYXVzZXMuIFRoZSBmaW5hbGx5IGNsYXVzZSBpcworIyBhbHdheXMgdGhlIGxhc3QsIGFuZCB0aGUgb3RoZXJ3aXNlIGNsYXVzZSBpcyBhbHdheXMgYWRkZWQganVzdCBiZWZvcmUKKyMgdGhlIGZpbmFsbHkgY2xhdXNlLgorIworIyBBbGwgY2xhdXNlcywgZXhjZXB0IHRoZSBmaW5hbGx5IGNsYXVzZSwgYWRkIGEgc3ViIHdoaWNoIHRha2VzIG9uZSBhcmd1bWVudAorIyB0aGlzIGFyZ3VtZW50IHdpbGwgYmUgdGhlIGVycm9yIGJlaW5nIHRocm93bi4gVGhlIHN1YiB3aWxsIHJldHVybiBhIGNvZGUgcmVmCisjIGlmIHRoYXQgY2xhdXNlIGNhbiBoYW5kbGUgdGhhdCBlcnJvciwgb3RoZXJ3aXNlIHVuZGVmIGlzIHJldHVybmVkLgorIworIyBUaGUgb3RoZXJ3aXNlIGNsYXVzZSBhZGRzIGEgc3ViIHdoaWNoIHVuY29uZGl0aW9uYWxseSByZXR1cm5zIHRoZSB1c2VycworIyBjb2RlIHJlZmVyZW5jZSwgdGhpcyBpcyB3aHkgaXQgaXMgZm9yY2VkIHRvIGJlIGxhc3QuCisjCisjIFRoZSBjYXRjaCBjbGF1c2UgaXMgZGVmaW5lZCBpbiBFcnJvci5wbSwgYXMgdGhlIHN5bnRheCBjYXVzZXMgaXQgdG8KKyMgYmUgY2FsbGVkIGFzIGEgbWV0aG9kCisKK3N1YiB3aXRoICgmOyQpIHsKKyAgICBAXworfQorCitzdWIgZmluYWxseSAoJikgeworICAgIG15ICRjb2RlID0gc2hpZnQ7CisgICAgbXkgJGNsYXVzZXMgPSB7ICdmaW5hbGx5JyA9PiAkY29kZSB9OworICAgICRjbGF1c2VzOworfQorCisjIFRoZSBleGNlcHQgY2xhdXNlIGlzIGEgYmxvY2sgd2hpY2ggcmV0dXJucyBhIGhhc2hyZWYgb3IgYSBsaXN0IG9mCisjIGtleS12YWx1ZSBwYWlycywgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBjbGFzc2VzIGFuZCB0aGUgdmFsdWVzIGFyZSBzdWJzLgorCitzdWIgZXhjZXB0ICgmOyQpIHsKKyAgICBteSAkY29kZSA9IHNoaWZ0OworICAgIG15ICRjbGF1c2VzID0gc2hpZnQgfHwge307CisgICAgbXkgJGNhdGNoID0gJGNsYXVzZXMtPnsnY2F0Y2gnfSB8fD0gW107CisKKyAgICBteSAkc3ViID0gc3ViIHsKKwlteSAkcmVmOworCW15KEBhcnJheSkgPSAkY29kZS0+KCRfWzBdKTsKKwlpZihAYXJyYXkgPT0gMSAmJiByZWYoJGFycmF5WzBdKSkgeworCSAgICAkcmVmID0gJGFycmF5WzBdOworCSAgICAkcmVmID0gWyAlJHJlZiBdCisJCWlmKFVOSVZFUlNBTDo6aXNhKCRyZWYsJ0hBU0gnKSk7CisJfQorCWVsc2UgeworCSAgICAkcmVmID0gXEBhcnJheTsKKwl9CisJQCRyZWYKKyAgICB9OworCisgICAgdW5zaGlmdCBAeyRjYXRjaH0sIHVuZGVmLCAkc3ViOworCisgICAgJGNsYXVzZXM7Cit9CisKK3N1YiBvdGhlcndpc2UgKCY7JCkgeworICAgIG15ICRjb2RlID0gc2hpZnQ7CisgICAgbXkgJGNsYXVzZXMgPSBzaGlmdCB8fCB7fTsKKworICAgIGlmKGV4aXN0cyAkY2xhdXNlcy0+eydvdGhlcndpc2UnfSkgeworCXJlcXVpcmUgQ2FycDsKKwlDYXJwOjpjcm9haygiTXVsdGlwbGUgb3RoZXJ3aXNlIGNsYXVzZXMiKTsKKyAgICB9CisKKyAgICAkY2xhdXNlcy0+eydvdGhlcndpc2UnfSA9ICRjb2RlOworCisgICAgJGNsYXVzZXM7Cit9CisKKzE7CitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK0Vycm9yIC0gRXJyb3IvZXhjZXB0aW9uIGhhbmRsaW5nIGluIGFuIE9PLWlzaCB3YXkKKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgRXJyb3IgcXcoOnRyeSk7CisKKyAgICB0aHJvdyBFcnJvcjo6U2ltcGxlKCAiQSBzaW1wbGUgZXJyb3IiKTsKKworICAgIHN1YiB4eXogeworICAgICAgICAuLi4KKwlyZWNvcmQgRXJyb3I6OlNpbXBsZSgiQSBzaW1wbGUgZXJyb3IiKQorCSAgICBhbmQgcmV0dXJuOworICAgIH0KKworICAgIHVubGluaygkZmlsZSkgb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgiJGZpbGU6ICQhIiwkISk7CisKKyAgICB0cnkgeworCWRvX3NvbWVfc3R1ZmYoKTsKKwlkaWUgImVycm9yISIgaWYgJGNvbmRpdGlvbjsKKwl0aHJvdyBFcnJvcjo6U2ltcGxlIC10ZXh0ID0+ICJPb3BzISIgaWYgJG90aGVyX2NvbmRpdGlvbjsKKyAgICB9CisgICAgY2F0Y2ggRXJyb3I6OklPIHdpdGggeworCW15ICRFID0gc2hpZnQ7CisJcHJpbnQgU1RERVJSICJGaWxlICIsICRFLT57Jy1maWxlJ30sICIgaGFkIGEgcHJvYmxlbVxuIjsKKyAgICB9CisgICAgZXhjZXB0IHsKKwlteSAkRSA9IHNoaWZ0OworCW15ICRnZW5lcmFsX2hhbmRsZXI9c3ViIHtzZW5kX21lc3NhZ2UgJEUtPnstZGVzY3JpcHRpb259fTsKKwlyZXR1cm4geworCSAgICBVc2VyRXhjZXB0aW9uMSA9PiAkZ2VuZXJhbF9oYW5kbGVyLAorCSAgICBVc2VyRXhjZXB0aW9uMiA9PiAkZ2VuZXJhbF9oYW5kbGVyCisJfTsKKyAgICB9CisgICAgb3RoZXJ3aXNlIHsKKwlwcmludCBTVERFUlIgIldlbGwgSSBkb24ndCBrbm93IHdoYXQgdG8gc2F5XG4iOworICAgIH0KKyAgICBmaW5hbGx5IHsKKwljbG9zZV90aGVfZ2FyYWdlX2Rvb3JfYWxyZWFkeSgpOyAjIFNob3VsZCBiZSByZWxpYWJsZQorICAgIH07ICMgRG9uJ3QgZm9yZ2V0IHRoZSB0cmFpbGluZyA7IG9yIHlvdSBtaWdodCBiZSBzdXJwcmlzZWQKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPEVycm9yPiBwYWNrYWdlIHByb3ZpZGVzIHR3byBpbnRlcmZhY2VzLiBGaXJzdGx5IEM8RXJyb3I+IHByb3ZpZGVzCithIHByb2NlZHVyYWwgaW50ZXJmYWNlIHRvIGV4Y2VwdGlvbiBoYW5kbGluZy4gU2Vjb25kbHkgQzxFcnJvcj4gaXMgYQorYmFzZSBjbGFzcyBmb3IgZXJyb3JzL2V4Y2VwdGlvbnMgdGhhdCBjYW4gZWl0aGVyIGJlIHRocm93biwgZm9yCitzdWJzZXF1ZW50IGNhdGNoLCBvciBjYW4gc2ltcGx5IGJlIHJlY29yZGVkLgorCitFcnJvcnMgaW4gdGhlIGNsYXNzIEM8RXJyb3I+IHNob3VsZCBub3QgYmUgdGhyb3duIGRpcmVjdGx5LCBidXQgdGhlCit1c2VyIHNob3VsZCB0aHJvdyBlcnJvcnMgZnJvbSBhIHN1Yi1jbGFzcyBvZiBDPEVycm9yPi4KKworPWhlYWQxIFBST0NFRFVSQUwgSU5URVJGQUNFCisKK0M8RXJyb3I+IGV4cG9ydHMgc3Vicm91dGluZXMgdG8gcGVyZm9ybSBleGNlcHRpb24gaGFuZGxpbmcuIFRoZXNlIHdpbGwKK2JlIGV4cG9ydGVkIGlmIHRoZSBDPDp0cnk+IHRhZyBpcyB1c2VkIGluIHRoZSBDPHVzZT4gbGluZS4KKworPW92ZXIgNAorCis9aXRlbSB0cnkgQkxPQ0sgQ0xBVVNFUworCitDPHRyeT4gaXMgdGhlIG1haW4gc3Vicm91dGluZSBjYWxsZWQgYnkgdGhlIHVzZXIuIEFsbCBvdGhlciBzdWJyb3V0aW5lcworZXhwb3J0ZWQgYXJlIGNsYXVzZXMgdG8gdGhlIHRyeSBzdWJyb3V0aW5lLgorCitUaGUgQkxPQ0sgd2lsbCBiZSBldmFsdWF0ZWQgYW5kLCBpZiBubyBlcnJvciBpcyB0aHJvdywgdHJ5IHdpbGwgcmV0dXJuCit0aGUgcmVzdWx0IG9mIHRoZSBibG9jay4KKworQzxDTEFVU0VTPiBhcmUgdGhlIHN1YnJvdXRpbmVzIGJlbG93LCB3aGljaCBkZXNjcmliZSB3aGF0IHRvIGRvIGluIHRoZQorZXZlbnQgb2YgYW4gZXJyb3IgYmVpbmcgdGhyb3duIHdpdGhpbiBCTE9DSy4KKworPWl0ZW0gY2F0Y2ggQ0xBU1Mgd2l0aCBCTE9DSworCitUaGlzIGNsYXVzZXMgd2lsbCBjYXVzZSBhbGwgZXJyb3JzIHRoYXQgc2F0aXNmeSBDPCRlcnItRTxndD5pc2EoQ0xBU1MpPgordG8gYmUgY2F1Z2h0IGFuZCBoYW5kbGVkIGJ5IGV2YWx1YXRpbmcgQzxCTE9DSz4uCisKK0M8QkxPQ0s+IHdpbGwgYmUgcGFzc2VkIHR3byBhcmd1bWVudHMuIFRoZSBmaXJzdCB3aWxsIGJlIHRoZSBlcnJvcgorYmVpbmcgdGhyb3duLiBUaGUgc2Vjb25kIGlzIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyIHZhcmlhYmxlLiBJZiB0aGlzCit2YXJpYWJsZSBpcyBzZXQgYnkgdGhlIGNhdGNoIGJsb2NrIHRoZW4sIG9uIHJldHVybiBmcm9tIHRoZSBjYXRjaAorYmxvY2ssIHRyeSB3aWxsIGNvbnRpbnVlIHByb2Nlc3NpbmcgYXMgaWYgdGhlIGNhdGNoIGJsb2NrIHdhcyBuZXZlcgorZm91bmQuCisKK1RvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdGhlIGNhdGNoIGJsb2NrIG1heSBjYWxsIEM8JGVyci1FPGd0PnRocm93PgorCitJZiB0aGUgc2NhbGFyIHJlZmVyZW5jZSBieSB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzZXQsIGFuZCB0aGUKK2Vycm9yIGlzIG5vdCB0aHJvd24uIFRoZW4gdGhlIGN1cnJlbnQgdHJ5IGJsb2NrIHdpbGwgcmV0dXJuIHdpdGggdGhlCityZXN1bHQgZnJvbSB0aGUgY2F0Y2ggYmxvY2suCisKKz1pdGVtIGV4Y2VwdCBCTE9DSworCitXaGVuIEM8dHJ5PiBpcyBsb29raW5nIGZvciBhIGhhbmRsZXIsIGlmIGFuIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQKK0M8QkxPQ0s+IGlzIGV2YWx1YXRlZC4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgYmxvY2sgc2hvdWxkIGJlIGEKK0hBU0hSRUYgb3IgYSBsaXN0IG9mIGtleS12YWx1ZSBwYWlycywgd2hlcmUgdGhlIGtleXMgYXJlIGNsYXNzIG5hbWVzCithbmQgdGhlIHZhbHVlcyBhcmUgQ09ERSByZWZlcmVuY2VzIGZvciB0aGUgaGFuZGxlciBvZiBlcnJvcnMgb2YgdGhhdAordHlwZS4KKworPWl0ZW0gb3RoZXJ3aXNlIEJMT0NLCisKK0NhdGNoIGFueSBlcnJvciBieSBleGVjdXRpbmcgdGhlIGNvZGUgaW4gQzxCTE9DSz4KKworV2hlbiBldmFsdWF0ZWQgQzxCTE9DSz4gd2lsbCBiZSBwYXNzZWQgb25lIGFyZ3VtZW50LCB3aGljaCB3aWxsIGJlIHRoZQorZXJyb3IgYmVpbmcgcHJvY2Vzc2VkLgorCitPbmx5IG9uZSBvdGhlcndpc2UgYmxvY2sgbWF5IGJlIHNwZWNpZmllZCBwZXIgdHJ5IGJsb2NrCisKKz1pdGVtIGZpbmFsbHkgQkxPQ0sKKworRXhlY3V0ZSB0aGUgY29kZSBpbiBDPEJMT0NLPiBlaXRoZXIgYWZ0ZXIgdGhlIGNvZGUgaW4gdGhlIHRyeSBibG9jayBoYXMKK3N1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsIG9yIGlmIHRoZSB0cnkgYmxvY2sgdGhyb3dzIGFuIGVycm9yIHRoZW4KK0M8QkxPQ0s+IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGhhbmRsZXIgaGFzIGNvbXBsZXRlZC4KKworSWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGVycm9yIHRoZW4gdGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0LCB0aGUKK2ZpbmFsbHkgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCBhbmQgdGhlIGVycm9yIHdpbGwgYmUgcmUtdGhyb3duLgorCitPbmx5IG9uZSBmaW5hbGx5IGJsb2NrIG1heSBiZSBzcGVjaWZpZWQgcGVyIHRyeSBibG9jaworCis9YmFjaworCis9aGVhZDEgQ0xBU1MgSU5URVJGQUNFCisKKz1oZWFkMiBDT05TVFJVQ1RPUlMKKworVGhlIEM8RXJyb3I+IG9iamVjdCBpcyBpbXBsZW1lbnRlZCBhcyBhIEhBU0guIFRoaXMgSEFTSCBpcyBpbml0aWFsaXplZAord2l0aCB0aGUgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCB0byBpdCdzIGNvbnN0cnVjdG9yLiBUaGUgZWxlbWVudHMKK3RoYXQgYXJlIHVzZWQgYnksIG9yIGFyZSByZXRyaWV2YWJsZSBieSB0aGUgQzxFcnJvcj4gY2xhc3MgYXJlIGxpc3RlZAorYmVsb3csIG90aGVyIGNsYXNzZXMgbWF5IGFkZCB0byB0aGVzZS4KKworCS1maWxlCisJLWxpbmUKKwktdGV4dAorCS12YWx1ZQorCS1vYmplY3QKKworSWYgQzwtZmlsZT4gb3IgQzwtbGluZT4gYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cwordGhlbiB0aGVzZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2hlcmUKK3RoZSBjb25zdHJ1Y3RvciB3YXMgY2FsbGVkIGZyb20uCisKK0lmIHRoZSBlcnJvciBpcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0IHRoZW4gdGhlIG9iamVjdCBzaG91bGQgYmUKK3Bhc3NlZCBhcyB0aGUgQzwtb2JqZWN0PiBhcmd1bWVudC4gVGhpcyB3aWxsIGFsbG93IHRoZSBDPEVycm9yPiBwYWNrYWdlCit0byBhc3NvY2lhdGUgdGhlIGVycm9yIHdpdGggdGhlIG9iamVjdC4KKworVGhlIEM8RXJyb3I+IHBhY2thZ2UgcmVtZW1iZXJzIHRoZSBsYXN0IGVycm9yIGNyZWF0ZWQsIGFuZCBhbHNvIHRoZQorbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLiBUaGlzIGNvdWxkIGVpdGhlciBiZSB0aGUgbGFzdAorZXJyb3IgY3JlYXRlZCBieSBhIHN1YiBpbiB0aGF0IHBhY2thZ2UsIG9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIHBhc3NlZAorYW4gb2JqZWN0IGJsZXNzZWQgaW50byB0aGF0IHBhY2thZ2UgYXMgdGhlIEM8LW9iamVjdD4gYXJndW1lbnQuCisKKz1vdmVyIDQKKworPWl0ZW0gdGhyb3cgKCBbIEFSR1MgXSApCisKK0NyZWF0ZSBhIG5ldyBDPEVycm9yPiBvYmplY3QgYW5kIHRocm93IGFuIGVycm9yLCB3aGljaCB3aWxsIGJlIGNhdWdodAorYnkgYSBzdXJyb3VuZGluZyBDPHRyeT4gYmxvY2ssIGlmIHRoZXJlIGlzIG9uZS4gT3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2UKK3RoZSBwcm9ncmFtIHRvIGV4aXQuCisKK0M8dGhyb3c+IG1heSBhbHNvIGJlIGNhbGxlZCBvbiBhbiBleGlzdGluZyBlcnJvciB0byByZS10aHJvdyBpdC4KKworPWl0ZW0gd2l0aCAoIFsgQVJHUyBdICkKKworQ3JlYXRlIGEgbmV3IEM8RXJyb3I+IG9iamVjdCBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcyBkZWZpbmVkIGZvcgorc3ludGFjdGljIHN1Z2FyLCBlZworCisgICAgZGllIHdpdGggU29tZTo6RXJyb3IgKCAuLi4gKTsKKworPWl0ZW0gcmVjb3JkICggWyBBUkdTIF0gKQorCitDcmVhdGUgYSBuZXcgQzxFcnJvcj4gb2JqZWN0IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzIGRlZmluZWQgZm9yCitzeW50YWN0aWMgc3VnYXIsIGVnCisKKyAgICByZWNvcmQgU29tZTo6RXJyb3IgKCAuLi4gKQorCWFuZCByZXR1cm47CisKKz1iYWNrCisKKz1oZWFkMiBTVEFUSUMgTUVUSE9EUworCis9b3ZlciA0CisKKz1pdGVtIHByaW9yICggWyBQQUNLQUdFIF0gKQorCitSZXR1cm4gdGhlIGxhc3QgZXJyb3IgY3JlYXRlZCwgb3IgdGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoCitDPFBBQ0tBR0U+CisKKz1pdGVtIGZsdXNoICggWyBQQUNLQUdFIF0gKQorCitGbHVzaCB0aGUgbGFzdCBlcnJvciBjcmVhdGVkLCBvciB0aGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGgKK0M8UEFDS0FHRT4uSXQgaXMgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoZSBlcnJvciBzdGFjayBiZWZvcmUgZXhpdGluZyB0aGUKK3BhY2thZ2Ugb3IgdW5jYXVnaHQgZXJyb3JzIGdlbmVyYXRlZCB1c2luZyBDPHJlY29yZD4gd2lsbCBiZSByZXBvcnRlZC4KKworICAgICAkRXJyb3ItPmZsdXNoOworCis9Y3V0CisKKz1iYWNrCisKKz1oZWFkMiBPQkpFQ1QgTUVUSE9EUworCis9b3ZlciA0CisKKz1pdGVtIHN0YWNrdHJhY2UKKworSWYgdGhlIHZhcmlhYmxlIEM8JEVycm9yOjpEZWJ1Zz4gd2FzIG5vbi16ZXJvIHdoZW4gdGhlIGVycm9yIHdhcworY3JlYXRlZCwgdGhlbiBDPHN0YWNrdHJhY2U+IHJldHVybnMgYSBzdHJpbmcgY3JlYXRlZCBieSBjYWxsaW5nCitDPENhcnA6OmxvbmdtZXNzPi4gSWYgdGhlIHZhcmlhYmxlIHdhcyB6ZXJvIHRoZSBDPHN0YWNrdHJhY2U+IHJldHVybnMKK3RoZSB0ZXh0IG9mIHRoZSBlcnJvciBhcHBlbmRlZCB3aXRoIHRoZSBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIgb2YKK3doZXJlIHRoZSBlcnJvciB3YXMgY3JlYXRlZCwgcHJvdmlkaW5nIHRoZSB0ZXh0IGRvZXMgbm90IGVuZCB3aXRoIGEKK25ld2xpbmUuCisKKz1pdGVtIG9iamVjdAorCitUaGUgb2JqZWN0IHRoaXMgZXJyb3Igd2FzIGFzc29jaWF0ZWQgd2l0aAorCis9aXRlbSBmaWxlCisKK1RoZSBmaWxlIHdoZXJlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGVycm9yIHdhcyBjYWxsZWQgZnJvbQorCis9aXRlbSBsaW5lCisKK1RoZSBsaW5lIHdoZXJlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGVycm9yIHdhcyBjYWxsZWQgZnJvbQorCis9aXRlbSB0ZXh0CisKK1RoZSB0ZXh0IG9mIHRoZSBlcnJvcgorCis9YmFjaworCis9aGVhZDIgT1ZFUkxPQUQgTUVUSE9EUworCis9b3ZlciA0CisKKz1pdGVtIHN0cmluZ2lmeQorCitBIG1ldGhvZCB0aGF0IGNvbnZlcnRzIHRoZSBvYmplY3QgaW50byBhIHN0cmluZy4gVGhpcyBtZXRob2QgbWF5IHNpbXBseQorcmV0dXJuIHRoZSBzYW1lIGFzIHRoZSBDPHRleHQ+IG1ldGhvZCwgb3IgaXQgbWF5IGFwcGVuZCBtb3JlCitpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCisKK0J5IGRlZmF1bHQgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgQzwtdGV4dD4gYXJndW1lbnQgdGhhdCB3YXMgcGFzc2VkIHRvCit0aGUgY29uc3RydWN0b3IsIG9yIHRoZSBzdHJpbmcgQzwiRGllZCI+IGlmIG5vbmUgd2FzIGdpdmVuLgorCis9aXRlbSB2YWx1ZQorCitBIG1ldGhvZCB0aGF0IHdpbGwgcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorZXJyb3IuIEZvciBleGFtcGxlIGlmIGFuIGVycm9yIHdhcyBjcmVhdGVkIGR1ZSB0byB0aGUgZmFpbHVyZSBvZiBhCitzeXN0ZW0gY2FsbCwgdGhlbiB0aGlzIG1heSByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgb2YgQzwkIT4gYXQgdGhlCit0aW1lLgorCitCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIEM8LXZhbHVlPiBhcmd1bWVudCB0aGF0IHdhcyBwYXNzZWQKK3RvIHRoZSBjb25zdHJ1Y3Rvci4KKworPWJhY2sKKworPWhlYWQxIFBSRS1ERUZJTkVEIEVSUk9SIENMQVNTRVMKKworPW92ZXIgNAorCis9aXRlbSBFcnJvcjo6U2ltcGxlCisKK1RoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaG9sZCBzaW1wbGUgZXJyb3Igc3RyaW5ncyBhbmQgdmFsdWVzLiBJdCdzCitjb25zdHJ1Y3RvciB0YWtlcyB0d28gYXJndW1lbnRzLiBUaGUgZmlyc3QgaXMgYSB0ZXh0IHZhbHVlLCB0aGUgc2Vjb25kCitpcyBhIG51bWVyaWMgdmFsdWUuIFRoZXNlIHZhbHVlcyBhcmUgd2hhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZQorb3ZlcmxvYWQgbWV0aG9kcy4KKworSWYgdGhlIHRleHQgdmFsdWUgZW5kcyB3aXRoIEM8YXQgZmlsZSBsaW5lIDE+IGFzICRAIHN0cmluZ3MgZG8sIHRoZW4KK3RoaXMgaW5mb21hdGlvbiB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBDPC1maWxlPiBhbmQgQzwtbGluZT4gYXJndW1lbnRzCitvZiB0aGUgZXJyb3Igb2JqZWN0LgorCitUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBpZiBhbiBldmFsJ2QgYmxvY2sgZGllJ3Mgd2l0aCBhbiBlcnJvcgordGhhdCBpcyBhIHBsYWluIHN0cmluZy4gKFVubGVzcyBDPCRFcnJvcjo6T2JqZWN0aWZ5Q2FsbGJhY2s+IGlzIG1vZGlmaWVkKQorCis9YmFjaworCis9aGVhZDEgJEVycm9yOjpPYmplY3RpZnlDYWxsYmFjaworCitUaGlzIHZhcmlhYmxlIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgc3Vicm91dGluZSB0aGF0IGNvbnZlcnRzIGVycm9ycyB0aGF0CithcmUgcGxhaW4gc3RyaW5ncyB0byBvYmplY3RzLiBJdCBpcyB1c2VkIGJ5IEVycm9yLnBtIHRvIGNvbnZlcnQgdGV4dHVhbAorZXJyb3JzIHRvIG9iamVjdHMsIGFuZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdXNlci4KKworSXQgYWNjZXB0cyBhIHNpbmdsZSBhcmd1bWVudCB3aGljaCBpcyBhIGhhc2ggcmVmZXJlbmNlIHRvIG5hbWVkIHBhcmFtZXRlcnMuCitDdXJyZW50bHkgdGhlIG9ubHkgbmFtZWQgcGFyYW1ldGVyIHBhc3NlZCBpcyBDPCd0ZXh0Jz4gd2hpY2ggaXMgdGhlIHRleHQKK29mIHRoZSBlcnJvciwgYnV0IG90aGVycyBtYXkgYmUgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUuCisKK0ZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGNhdXNlIEVycm9yLnBtIHRvIHRocm93IG9iamVjdHMgb2YgdGhlCitjbGFzcyBNeUVycm9yOjpCYXIgYnkgZGVmYXVsdDoKKworICAgIHN1YiB0aHJvd19NeUVycm9yX0JhcgorICAgIHsKKyAgICAgICAgbXkgJGFyZ3MgPSBzaGlmdDsKKyAgICAgICAgbXkgJGVyciA9IE15RXJyb3I6OkJhci0+bmV3KCk7CisgICAgICAgICRlcnItPnsnTXlCYXJUZXh0J30gPSAkYXJncy0+eyd0ZXh0J307CisgICAgICAgIHJldHVybiAkZXJyOworICAgIH0KKworICAgIHsKKyAgICAgICAgbG9jYWwgJEVycm9yOjpPYmplY3RpZnlDYWxsYmFjayA9IFwmdGhyb3dfTXlFcnJvcl9CYXI7CisKKyAgICAgICAgIyBFcnJvciBoYW5kbGluZyBoZXJlLgorICAgIH0KKworPWhlYWQxIEtOT1dOIEJVR1MKKworTm9uZSwgYnV0IHRoYXQgZG9lcyBub3QgbWVhbiB0aGVyZSBhcmUgbm90IGFueS4KKworPWhlYWQxIEFVVEhPUlMKKworR3JhaGFtIEJhcnIgPGdiYXJyQHBvYm94LmNvbT4KKworVGhlIGNvZGUgdGhhdCBpbnNwaXJlZCBtZSB0byB3cml0ZSB0aGlzIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKK1BldGVyIFNlaWJlbCA8cGV0ZXJAd2VibG9naWMuY29tPiBhbmQgYWRhcHRlZCBieSBKZXNzZSBHbGljaworPGpnbGlja0BzaWcuYnNoLmNvbT4uCisKKz1oZWFkMSBNQUlOVEFJTkVSCisKK1NobG9taSBGaXNoIDxzaGxvbWlmQGlnbHUub3JnLmlsPgorCis9aGVhZDEgUEFTVCBNQUlOVEFJTkVSUworCitBcnVuIEt1bWFyIFUgPHVfYXJ1bmt1bWFyQHlhaG9vLmNvbT4KKworPWN1dApkaWZmIC0tZ2l0IGEvcGt0LWxpbmUuYyBiL3BrdC1saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNTI2OAotLS0gL2Rldi9udWxsCisrKyBiL3BrdC1saW5lLmMKQEAgLTAsMCArMSwxMTQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisKKy8qCisgKiBXcml0ZSBhIHBhY2tldGl6ZWQgc3RyZWFtLCB3aGVyZSBlYWNoIGxpbmUgaXMgcHJlY2VkZWQgYnkKKyAqIGl0cyBsZW5ndGggKGluY2x1ZGluZyB0aGUgaGVhZGVyKSBhcyBhIDQtYnl0ZSBoZXggbnVtYmVyLgorICogQSBsZW5ndGggb2YgJ3plcm8nIG1lYW5zIGVuZCBvZiBzdHJlYW0gKGFuZCBhIGxlbmd0aCBvZiAxLTMKKyAqIHdvdWxkIGJlIGFuIGVycm9yKS4gCisgKgorICogVGhpcyBpcyBhbGwgcHJldHR5IHN0dXBpZCwgYnV0IHdlIHVzZSB0aGlzIHBhY2tldGl6ZWQgbGluZQorICogZm9ybWF0IHRvIG1ha2UgYSBzdHJlYW1pbmcgZm9ybWF0IHBvc3NpYmxlIHdpdGhvdXQgZXZlcgorICogb3Zlci1ydW5uaW5nIHRoZSByZWFkIGJ1ZmZlcnMuIFRoYXQgd2F5IHdlJ2xsIG5ldmVyIHJlYWQKKyAqIGludG8gd2hhdCBtaWdodCBiZSB0aGUgcGFjayBkYXRhICh3aGljaCBzaG91bGQgZ28gdG8gYW5vdGhlcgorICogcHJvY2VzcyBlbnRpcmVseSkuCisgKgorICogVGhlIHdyaXRpbmcgc2lkZSBjb3VsZCB1c2Ugc3RkaW8sIGJ1dCBzaW5jZSB0aGUgcmVhZGluZworICogc2lkZSBjYW4ndCwgd2Ugc3RheSB3aXRoIHB1cmUgcmVhZC93cml0ZSBpbnRlcmZhY2VzLgorICovCitzc2l6ZV90IHNhZmVfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNzaXplX3QgbikKK3sKKwlzc2l6ZV90IG5uID0gbjsKKwl3aGlsZSAobikgeworCQlpbnQgcmV0ID0geHdyaXRlKGZkLCBidWYsIG4pOworCQlpZiAocmV0ID4gMCkgeworCQkJYnVmID0gKGNoYXIgKikgYnVmICsgcmV0OworCQkJbiAtPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXJldCkKKwkJCWRpZSgid3JpdGUgZXJyb3IgKGRpc2sgZnVsbD8pIik7CisJCWRpZSgid3JpdGUgZXJyb3IgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybiBubjsKK30KKworLyoKKyAqIElmIHdlIGJ1ZmZlcmVkIHRoaW5ncyB1cCBhYm92ZSAod2UgZG9uJ3QsIGJ1dCB3ZSBzaG91bGQpLAorICogd2UnZCBmbHVzaCBpdCBoZXJlCisgKi8KK3ZvaWQgcGFja2V0X2ZsdXNoKGludCBmZCkKK3sKKwlzYWZlX3dyaXRlKGZkLCAiMDAwMCIsIDQpOworfQorCisjZGVmaW5lIGhleChhKSAoaGV4Y2hhclsoYSkgJiAxNV0pCit2b2lkIHBhY2tldF93cml0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwlzdGF0aWMgY2hhciBoZXhjaGFyW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIG47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSB2c25wcmludGYoYnVmZmVyICsgNCwgc2l6ZW9mKGJ1ZmZlcikgLSA0LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobiA+PSBzaXplb2YoYnVmZmVyKS00KQorCQlkaWUoInByb3RvY29sIGVycm9yOiBpbXBvc3NpYmx5IGxvbmcgbGluZSIpOworCW4gKz0gNDsKKwlidWZmZXJbMF0gPSBoZXgobiA+PiAxMik7CisJYnVmZmVyWzFdID0gaGV4KG4gPj4gOCk7CisJYnVmZmVyWzJdID0gaGV4KG4gPj4gNCk7CisJYnVmZmVyWzNdID0gaGV4KG4pOworCXNhZmVfd3JpdGUoZmQsIGJ1ZmZlciwgbik7Cit9CisKK3N0YXRpYyB2b2lkIHNhZmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzaXplX3QgbiA9IDA7CisKKwl3aGlsZSAobiA8IHNpemUpIHsKKwkJc3NpemVfdCByZXQgPSB4cmVhZChmZCwgKGNoYXIgKikgYnVmZmVyICsgbiwgc2l6ZSAtIG4pOworCQlpZiAocmV0IDwgMCkKKwkJCWRpZSgicmVhZCBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIlRoZSByZW1vdGUgZW5kIGh1bmcgdXAgdW5leHBlY3RlZGx5Iik7CisJCW4gKz0gcmV0OworCX0KK30KKworaW50IHBhY2tldF9yZWFkX2xpbmUoaW50IGZkLCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIHNpemUpCit7CisJaW50IG47CisJdW5zaWduZWQgbGVuOworCWNoYXIgbGluZWxlbls0XTsKKworCXNhZmVfcmVhZChmZCwgbGluZWxlbiwgNCk7CisKKwlsZW4gPSAwOworCWZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gbGluZWxlbltuXTsKKwkJbGVuIDw8PSA0OworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKwkJCWxlbiArPSBjIC0gJzAnOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisJCQlsZW4gKz0gYyAtICdhJyArIDEwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB7CisJCQlsZW4gKz0gYyAtICdBJyArIDEwOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJwcm90b2NvbCBlcnJvcjogYmFkIGxpbmUgbGVuZ3RoIGNoYXJhY3RlciIpOworCX0KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJbGVuIC09IDQ7CisJaWYgKGxlbiA+PSBzaXplKQorCQlkaWUoInByb3RvY29sIGVycm9yOiBiYWQgbGluZSBsZW5ndGggJWQiLCBsZW4pOworCXNhZmVfcmVhZChmZCwgYnVmZmVyLCBsZW4pOworCWJ1ZmZlcltsZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvcGt0LWxpbmUuaCBiL3BrdC1saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNjUzZgotLS0gL2Rldi9udWxsCisrKyBiL3BrdC1saW5lLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBQS1RMSU5FX0gKKyNkZWZpbmUgUEtUTElORV9ICisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworLyoKKyAqIFNpbGx5IHBhY2tldGl6ZWQgbGluZSB3cml0aW5nIGludGVyZmFjZQorICovCit2b2lkIHBhY2tldF9mbHVzaChpbnQgZmQpOwordm9pZCBwYWNrZXRfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisKK2ludCBwYWNrZXRfcmVhZF9saW5lKGludCBmZCwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKTsKK3NzaXplX3Qgc2FmZV93cml0ZShpbnQsIGNvbnN0IHZvaWQgKiwgc3NpemVfdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcHBjL3NoYTEuYyBiL3BwYy9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyMDM5OAotLS0gL2Rldi9udWxsCisrKyBiL3BwYy9zaGExLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFNIQS0xIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4KKyAqCisgKiBUaGlzIHZlcnNpb24gYXNzdW1lcyB3ZSBhcmUgcnVubmluZyBvbiBhIGJpZy1lbmRpYW4gbWFjaGluZS4KKyAqIEl0IGNhbGxzIGFuIGV4dGVybmFsIHNoYTFfY29yZSgpIHRvIHByb2Nlc3MgYmxvY2tzIG9mIDY0IGJ5dGVzLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzaGExLmgiCisKK2V4dGVybiB2b2lkIHNoYTFfY29yZSh1aW50MzJfdCAqaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwKKwkJICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MpOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpCit7CisJYy0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJYy0+aGFzaFsxXSA9IDB4RUZDREFCODk7CisJYy0+aGFzaFsyXSA9IDB4OThCQURDRkU7CisJYy0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJYy0+aGFzaFs0XSA9IDB4QzNEMkUxRjA7CisJYy0+bGVuID0gMDsKKwljLT5jbnQgPSAwOworCXJldHVybiAwOworfQorCitpbnQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdW5zaWduZWQgbG9uZyBuYjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gcHRyOworCisJYy0+bGVuICs9ICh1aW50NjRfdCkgbiA8PCAzOworCXdoaWxlIChuICE9IDApIHsKKwkJaWYgKGMtPmNudCB8fCBuIDwgNjQpIHsKKwkJCW5iID0gNjQgLSBjLT5jbnQ7CisJCQlpZiAobmIgPiBuKQorCQkJCW5iID0gbjsKKwkJCW1lbWNweSgmYy0+YnVmLmJbYy0+Y250XSwgcCwgbmIpOworCQkJaWYgKChjLT5jbnQgKz0gbmIpID09IDY0KSB7CisJCQkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJCQljLT5jbnQgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJbmIgPSBuID4+IDY7CisJCQlzaGExX2NvcmUoYy0+aGFzaCwgcCwgbmIpOworCQkJbmIgPDw9IDY7CisJCX0KKwkJbiAtPSBuYjsKKwkJcCArPSBuYjsKKwl9CisJcmV0dXJuIDA7Cit9CQorCitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGludCBjbnQgPSBjLT5jbnQ7CisKKwljLT5idWYuYltjbnQrK10gPSAweDgwOworCWlmIChjbnQgPiA1NikgeworCQlpZiAoY250IDwgNjQpCisJCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDY0IC0gY250KTsKKwkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJY250ID0gMDsKKwl9CisJaWYgKGNudCA8IDU2KQorCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDU2IC0gY250KTsKKwljLT5idWYubFs3XSA9IGMtPmxlbjsKKwlzaGExX2NvcmUoYy0+aGFzaCwgYy0+YnVmLmIsIDEpOworCW1lbWNweShoYXNoLCBjLT5oYXNoLCAyMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcGMvc2hhMS5oIGIvcHBjL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M1MWFhCi0tLSAvZGV2L251bGwKKysrIGIvcHBjL3NoYTEuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNoYV9jb250ZXh0IHsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVpbnQzMl90IGNudDsKKwl1aW50NjRfdCBsZW47CisJdW5pb24geworCQl1bnNpZ25lZCBjaGFyIGJbNjRdOworCQl1aW50NjRfdCBsWzhdOworCX0gYnVmOworfSBTSEFfQ1RYOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7CitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKTsKZGlmZiAtLWdpdCBhL3BwYy9zaGExcHBjLlMgYi9wcGMvc2hhMXBwYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9wcGMvc2hhMXBwYy5TCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gZm9yIFBvd2VyUEMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisKKy8qCisgKiBQb3dlclBDIGNhbGxpbmcgY29udmVudGlvbjoKKyAqICVyMCAtIHZvbGF0aWxlIHRlbXAKKyAqICVyMSAtIHN0YWNrIHBvaW50ZXIuCisgKiAlcjIgLSByZXNlcnZlZAorICogJXIzLSVyMTIgLSBJbmNvbWluZyBhcmd1bWVudHMgJiByZXR1cm4gdmFsdWVzOyB2b2xhdGlsZS4KKyAqICVyMTMtJXIzMSAtIENhbGxlZS1zYXZlIHJlZ2lzdGVycworICogJWxyIC0gUmV0dXJuIGFkZHJlc3MsIHZvbGF0aWxlCisgKiAlY3RyIC0gdm9sYXRpbGUKKyAqCisgKiBSZWdpc3RlciB1c2FnZSBpbiB0aGlzIHJvdXRpbmU6CisgKiAlcjAgLSB0ZW1wCisgKiAlcjMgLSBhcmd1bWVudCAocG9pbnRlciB0byA1IHdvcmRzIG9mIFNIQSBzdGF0ZSkKKyAqICVyNCAtIGFyZ3VtZW50IChwb2ludGVyIHRvIGRhdGEgdG8gaGFzaCkKKyAqICVyNSAtIENvbnN0YW50IEsgaW4gU0hBIHJvdW5kIChpbml0aWFsbHkgbnVtYmVyIG9mIGJsb2NrcyB0byBoYXNoKQorICogJXI2LSVyMTAgLSBXb3JraW5nIGNvcGllcyBvZiBTSEEgdmFyaWFibGVzIEEuLkUgKGFjdHVhbGx5IEUuLkEgb3JkZXIpCisgKiAlcjExLSVyMjYgLSBEYXRhIGJlaW5nIGhhc2hlZCBXW10uCisgKiAlcjI3LSVyMzEgLSBQcmV2aW91cyBjb3BpZXMgb2YgQS4uRSwgZm9yIGZpbmFsIGFkZCBiYWNrLgorICogJWN0ciAtIGxvb3AgY291bnQKKyAqLworCisKKy8qCisgKiBXZSByb2xsIHRoZSByZWdpc3RlcnMgZm9yIEEsIEIsIEMsIEQsIEUgYXJvdW5kIG9uIGVhY2gKKyAqIGl0ZXJhdGlvbjsgRSBvbiBpdGVyYXRpb24gdCBpcyBEIG9uIGl0ZXJhdGlvbiB0KzEsIGFuZCBzbyBvbi4KKyAqIFdlIHVzZSByZWdpc3RlcnMgNiAtIDEwIGZvciB0aGlzLiAgKFJlZ2lzdGVycyAyNyAtIDMxIGhvbGQKKyAqIHRoZSBwcmV2aW91cyB2YWx1ZXMuKQorICovCisjZGVmaW5lIFJBKHQpCSgoKHQpKzQpJTUrNikKKyNkZWZpbmUgUkIodCkJKCgodCkrMyklNSs2KQorI2RlZmluZSBSQyh0KQkoKCh0KSsyKSU1KzYpCisjZGVmaW5lIFJEKHQpCSgoKHQpKzEpJTUrNikKKyNkZWZpbmUgUkUodCkJKCgodCkrMCklNSs2KQorCisvKiBXZSB1c2UgcmVnaXN0ZXJzIDExIC0gMjYgZm9yIHRoZSBXIHZhbHVlcyAqLworI2RlZmluZSBXKHQpCSgodCklMTYrMTEpCisKKy8qIFJlZ2lzdGVyIDUgaXMgdXNlZCBmb3IgdGhlIGNvbnN0YW50IGsgKi8KKworLyoKKyAqIFRoZSBiYXNpYyBTSEEtMSByb3VuZCBmdW5jdGlvbiBpczoKKyAqIEUgKz0gUk9UTChBLDUpICsgRihCLEMsRCkgKyBXW2ldICsgSzsgIEIgPSBST1RMKEIsMzApCisgKiBUaGVuIHRoZSB2YXJpYWJsZXMgYXJlIHJlbmFtZWQ6IChBLEIsQyxELEUpID0gKEUsQSxCLEMsRCkuCisgKgorICogRXZlcnkgMjAgcm91bmRzLCB0aGUgZnVuY3Rpb24gRigpIGFuZCB0aGUgY29uc3RhbnQgSyBjaGFuZ2VzOgorICogLSAyMCByb3VuZHMgb2YgZjAoYixjLGQpID0gImJpdCB3aXNlIGIgPyBjIDogZCIgPSAgKF5iICYgZCkgKyAoYiAmIGMpCisgKiAtIDIwIHJvdW5kcyBvZiBmMShiLGMsZCkgPSBiXmNeZCA9IChiXmQpXmMKKyAqIC0gMjAgcm91bmRzIG9mIGYyKGIsYyxkKSA9IG1ham9yaXR5KGIsYyxkKSA9IChiJmQpICsgKChiXmQpJmMpCisgKiAtIDIwIG1vcmUgcm91bmRzIG9mIGYxKGIsYyxkKQorICoKKyAqIFRoZXNlIGFyZSBhbGwgc2NoZWR1bGVkIGZvciBuZWFyLW9wdGltYWwgcGVyZm9ybWFuY2Ugb24gYSBHNC4KKyAqIFRoZSBHNCBpcyBhIDMtaXNzdWUgb3V0LW9mLW9yZGVyIG1hY2hpbmUgd2l0aCAzIEFMVXMsIGJ1dCBpdCBjYW4gb25seQorICogKmNvbnNpZGVyKiBzdGFydGluZyB0aGUgb2xkZXN0IDMgaW5zdHJ1Y3Rpb25zIHBlciBjeWNsZS4gIFNvIHRvIGdldAorICogbWF4aW11bSBwZXJmb3JtYW5jZSBvdXQgb2YgaXQsIHlvdSBoYXZlIHRvIHRyZWF0IGl0IGFzIGFuIGluLW9yZGVyCisgKiBtYWNoaW5lLiAgV2hpY2ggbWVhbnMgaW50ZXJsZWF2aW5nIHRoZSBjb21wdXRhdGlvbiByb3VuZCB0IHdpdGggdGhlCisgKiBjb21wdXRhdGlvbiBvZiBXW3QrNF0uCisgKgorICogVGhlIGZpcnN0IDE2IHJvdW5kcyB1c2UgVyB2YWx1ZXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gbWVtb3J5LCB3aGlsZSB0aGUKKyAqIHJlbWFpbmluZyA2NCB1c2UgdmFsdWVzIGNvbXB1dGVkIGZyb20gdGhvc2UgZmlyc3QgMTYuICBXZSBwcmVsb2FkCisgKiA0IHZhbHVlcyBiZWZvcmUgc3RhcnRpbmcsIHNvIHRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiByb3VuZHM6CisgKiAtIFRoZSBmaXJzdCAxMiAoYWxsIGYwKSBhbHNvIGxvYWQgdGhlIFcgdmFsdWVzIGZyb20gbWVtb3J5LgorICogLSBUaGUgbmV4dCA2NCBjb21wdXRlIFcoaSs0KSBpbiBwYXJhbGxlbC4gOCpmMCwgMjAqZjEsIDIwKmYyLCAxNipmMS4KKyAqIC0gVGhlIGxhc3QgNCAoYWxsIGYxKSBkbyBub3QgZG8gYW55dGhpbmcgd2l0aCBXLgorICoKKyAqIFRoZXJlZm9yZSwgd2UgaGF2ZSA2IGRpZmZlcmVudCByb3VuZCBmdW5jdGlvbnM6CisgKiBTVEVQRDBfTE9BRCh0LHMpIC0gUGVyZm9ybSByb3VuZCB0IGFuZCBsb2FkIFcocykuICBzIDwgMTYKKyAqIFNURVBEMF9VUERBVEUodCxzKSAtIFBlcmZvcm0gcm91bmQgdCBhbmQgY29tcHV0ZSBXKHMpLiAgcyA+PSAxNi4KKyAqIFNURVBEMV9VUERBVEUodCxzKQorICogU1RFUEQyX1VQREFURSh0LHMpCisgKiBTVEVQRDEodCkgLSBQZXJmb3JtIHJvdW5kIHQgd2l0aCBubyBsb2FkIG9yIHVwZGF0ZS4KKyAqCisgKiBUaGUgRzUgaXMgbW9yZSBmdWxseSBvdXQtb2Ytb3JkZXIsIGFuZCBjYW4gZmluZCB0aGUgcGFyYWxsZWxpc20KKyAqIGJ5IGl0c2VsZi4gIFRoZSBiaWcgbGltaXQgaXMgdGhhdCBpdCBoYXMgYSAyLWN5Y2xlIEFMVSBsYXRlbmN5LCBzbworICogZXZlbiB0aG91Z2ggaXQncyAyLXdheSwgdGhlIGNvZGUgaGFzIHRvIGJlIHNjaGVkdWxlZCBhcyBpZiBpdCdzCisgKiA0LXdheSwgd2hpY2ggY2FuIGJlIGEgbGltaXQuICBUbyBoZWxwIGl0LCB3ZSB0cnkgdG8gc2NoZWR1bGUgdGhlCisgKiByZWFkIG9mIFJBKHQpIGFzIGxhdGUgYXMgcG9zc2libGUgc28gaXQgZG9lc24ndCBzdGFsbCB3YWl0aW5nIGZvcgorICogdGhlIHByZXZpb3VzIHJvdW5kJ3MgUkUodC0xKSwgYW5kIHdlIHRyeSB0byByb3RhdGUgUkIodCkgYXMgZWFybHkKKyAqIGFzIHBvc3NpYmxlIHdoaWxlIHJlYWRpbmcgUkModCkgKD0gUkIodC0xKSkgYXMgbGF0ZSBhcyBwb3NzaWJsZS4KKyAqLworCisvKiB0aGUgaW5pdGlhbCBsb2Fkcy4gKi8KKyNkZWZpbmUgTE9BRFcocykgXAorCWx3eglXKHMpLChzKSo0KCVyNCkKKworLyoKKyAqIFBlcmZvcm0gYSBzdGVwIHdpdGggRjAsIGFuZCBsb2FkIFcocykuICBVc2VzIFcocykgYXMgYSB0ZW1wb3JhcnkKKyAqIGJlZm9yZSBsb2FkaW5nIGl0LgorICogVGhpcyBpcyBhY3R1YWxseSAxMCBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIGFuIGF3a3dhcmQgZml0LgorICogSXQgY2FuIGV4ZWN1dGUgZ3JvdXBlZCBhcyBsaXN0ZWQsIG9yIGRlbGF5ZWQgb25lIGluc3RydWN0aW9uLgorICogKElmIGRlbGF5ZWQgdHdvIGluc3RydWN0aW9ucywgdGhlcmUgaXMgYSBzdGFsbCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZQorICogc2Vjb25kIGxpbmUuKSAgVGh1cywgdHdvIGl0ZXJhdGlvbnMgdGFrZSA3IGN5Y2xlcywgMy41IGN5Y2xlcyBwZXIgcm91bmQuCisgKi8KKyNkZWZpbmUgU1RFUEQwX0xPQUQodCxzKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgIGFuZCAgICBXKHMpLFJDKHQpLFJCKHQpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgICBcCithZGQgUkUodCksUkUodCksVyhzKTsgYWRkICAgICVyMCwlcjAsJXI1OyAgICAgIGx3eiAgICBXKHMpLChzKSo0KCVyNCk7ICBcCithZGQgUkUodCksUkUodCksJXIwCisKKy8qCisgKiBUaGlzIGlzIGxpa2V3aXNlIGF3a3dhcmQsIDEzIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIsIGl0IGNhbiBhbHNvCisgKiBleGVjdXRlIHN0YXJ0aW5nIHdpdGggMiBvdXQgb2YgMyBwb3NzaWJsZSBtb2R1bGksIHNvIGl0IGRvZXMgMiByb3VuZHMKKyAqIGluIDkgY3ljbGVzLCA0LjUgY3ljbGVzL3JvdW5kLgorICovCisjZGVmaW5lIFNURVBEMF9VUERBVEUodCxzLGxvYWRrLi4uKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgeG9yICAgIFcocyksVygocyktMTYpLFcoKHMpLTMpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgYW5kICAgICVyMCxSQyh0KSxSQih0KTsgeG9yICAgIFcocyksVyhzKSxXKChzKS04KTsgICAgICBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgeG9yICAgIFcocyksVyhzKSxXKChzKS0xNCk7ICAgICBcCithZGQgUkUodCksUkUodCksJXI1OyAgbG9hZGs7IHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgIFwKK2FkZCBSRSh0KSxSRSh0KSwlcjAKKworLyogTmljZWx5IG9wdGltYWwuICBDb252ZW5pZW50bHksIGFsc28gdGhlIG1vc3QgY29tbW9uLiAqLworI2RlZmluZSBTVEVQRDFfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyB4b3IgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHhvciAgICBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMQorCisvKgorICogVGhlIG5ha2VkIHZlcnNpb24sIG5vIFVQREFURSwgZm9yIHRoZSBsYXN0IDQgcm91bmRzLiAgMyBjeWNsZXMgcGVyLgorICogV2UgY291bGQgdXNlIFcocykgYXMgYSB0ZW1wIHJlZ2lzdGVyLCBidXQgd2UgZG9uJ3QgbmVlZCBpdC4KKyAqLworI2RlZmluZSBTVEVQRDEodCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkICAgUkUodCksUkUodCksVyh0KTsgeG9yICAgICVyMCxSRCh0KSxSQih0KTsgXAorcm90bHdpIFJCKHQpLFJCKHQpLDMwOyAgYWRkICAgUkUodCksUkUodCksJXI1OyAgeG9yICAgICVyMCwlcjAsUkModCk7ICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMDsgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgLyogc3BhcmUgc2xvdCAqLyAgICAgICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMAorCisvKgorICogMTQgaW5zdHJ1Y3Rpb25zLCA1IGN5Y2xlcyBwZXIuICBUaGUgbWFqb3JpdHkgZnVuY3Rpb24gaXMgYSBiaXQKKyAqIGF3a3dhcmQgdG8gY29tcHV0ZS4gIFRoaXMgY2FuIGV4ZWN1dGUgd2l0aCBhIDEtaW5zdHJ1Y3Rpb24gZGVsYXksCisgKiBidXQgaXQgY2F1c2VzIGEgMi1pbnN0cnVjdGlvbiBkZWxheSwgd2hpY2ggdHJpZ2dlcnMgYSBzdGFsbC4KKyAqLworI2RlZmluZSBTVEVQRDJfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IGFuZCAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyBhbmQgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgICAgICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMAorCisjZGVmaW5lIFNURVAwX0xPQUQ0KHQscykJCVwKKwlTVEVQRDBfTE9BRCh0LHMpOwkJXAorCVNURVBEMF9MT0FEKCh0KzEpLChzKSsxKTsJXAorCVNURVBEMF9MT0FEKCh0KSsyLChzKSsyKTsJXAorCVNURVBEMF9MT0FEKCh0KSszLChzKSszKQorCisjZGVmaW5lIFNURVBVUDQoZm4sIHQsIHMsIGxvYWRrLi4uKQkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKHQscywpOwkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKCh0KSsxLChzKSsxLCk7CVwKKwlTVEVQIyNmbiMjX1VQREFURSgodCkrMiwocykrMiwpOwlcCisJU1RFUCMjZm4jI19VUERBVEUoKHQpKzMsKHMpKzMsbG9hZGspCisKKyNkZWZpbmUgU1RFUFVQMjAoZm4sIHQsIHMsIGxvYWRrLi4uKQlcCisJU1RFUFVQNChmbiwgdCwgcywpOwkJXAorCVNURVBVUDQoZm4sICh0KSs0LCAocykrNCwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzgsIChzKSs4LCk7CVwKKwlTVEVQVVA0KGZuLCAodCkrMTIsIChzKSsxMiwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzE2LCAocykrMTYsIGxvYWRrKQorCisJLmdsb2JsCXNoYTFfY29yZQorc2hhMV9jb3JlOgorCXN0d3UJJXIxLC04MCglcjEpCisJc3RtdwklcjEzLDQoJXIxKQorCisJLyogTG9hZCB1cCBBIC0gRSAqLworCWxtdwklcjI3LDAoJXIzKQorCisJbXRjdHIJJXI1CisKKzE6CisJTE9BRFcoMCkKKwlsaXMJJXI1LDB4NWE4MgorCW1yCVJFKDApLCVyMzEKKwlMT0FEVygxKQorCW1yCVJEKDApLCVyMzAKKwltcglSQygwKSwlcjI5CisJTE9BRFcoMikKKwlvcmkJJXI1LCVyNSwweDc5OTkJLyogSzAtMTkgKi8KKwltcglSQigwKSwlcjI4CisJTE9BRFcoMykKKwltcglSQSgwKSwlcjI3CisKKwlTVEVQMF9MT0FENCgwLCA0KQorCVNURVAwX0xPQUQ0KDQsIDgpCisJU1RFUDBfTE9BRDQoOCwgMTIpCisJU1RFUFVQNChEMCwgMTIsIDE2LCkKKwlTVEVQVVA0KEQwLCAxNiwgMjAsIGxpcyAlcjUsMHg2ZWQ5KQorCisJb3JpCSVyNSwlcjUsMHhlYmExCS8qIEsyMC0zOSAqLworCVNURVBVUDIwKEQxLCAyMCwgMjQsIGxpcyAlcjUsMHg4ZjFiKQorCisJb3JpCSVyNSwlcjUsMHhiY2RjCS8qIEs0MC01OSAqLworCVNURVBVUDIwKEQyLCA0MCwgNDQsIGxpcyAlcjUsMHhjYTYyKQorCisJb3JpCSVyNSwlcjUsMHhjMWQ2CS8qIEs2MC03OSAqLworCVNURVBVUDQoRDEsIDYwLCA2NCwpCisJU1RFUFVQNChEMSwgNjQsIDY4LCkKKwlTVEVQVVA0KEQxLCA2OCwgNzIsKQorCVNURVBVUDQoRDEsIDcyLCA3NiwpCisJYWRkaQklcjQsJXI0LDY0CisJU1RFUEQxKDc2KQorCVNURVBEMSg3NykKKwlTVEVQRDEoNzgpCisJU1RFUEQxKDc5KQorCisJLyogQWRkIHJlc3VsdHMgdG8gb3JpZ2luYWwgdmFsdWVzICovCisJYWRkCSVyMzEsJXIzMSxSRSgwKQorCWFkZAklcjMwLCVyMzAsUkQoMCkKKwlhZGQJJXIyOSwlcjI5LFJDKDApCisJYWRkCSVyMjgsJXIyOCxSQigwKQorCWFkZAklcjI3LCVyMjcsUkEoMCkKKworCWJkbnoJMWIKKworCS8qIFNhdmUgZmluYWwgaGFzaCwgcmVzdG9yZSByZWdpc3RlcnMsIGFuZCByZXR1cm4gKi8KKwlzdG13CSVyMjcsMCglcjMpCisJbG13CSVyMTMsNCglcjEpCisJYWRkaQklcjEsJXIxLDgwCisJYmxyCmRpZmYgLS1naXQgYS9wcm9ncmVzcy5jIGIvcHJvZ3Jlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY3ODkwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3Jlc3MuYwpAQCAtMCwwICsxLDEwNiBAQAorI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcHJvZ3Jlc3NfdXBkYXRlOworCitzdGF0aWMgdm9pZCBwcm9ncmVzc19pbnRlcnZhbChpbnQgc2lnbnVtKQoreworCXByb2dyZXNzX3VwZGF0ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wcm9ncmVzc19zaWduYWwodm9pZCkKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXN0cnVjdCBpdGltZXJ2YWwgdjsKKworCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wcm9ncmVzc19zaWduYWwodm9pZCkKK3sKKwlzdHJ1Y3QgaXRpbWVydmFsIHYgPSB7ezAsfSx9OworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKKwlwcm9ncmVzc191cGRhdGUgPSAwOworfQorCitpbnQgZGlzcGxheV9wcm9ncmVzcyhzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCB1bnNpZ25lZCBuKQoreworCWlmIChwcm9ncmVzcy0+ZGVsYXkpIHsKKwkJY2hhciBidWZbODBdOworCQlpZiAoIXByb2dyZXNzX3VwZGF0ZSB8fCAtLXByb2dyZXNzLT5kZWxheSkKKwkJCXJldHVybiAwOworCQlpZiAocHJvZ3Jlc3MtPnRvdGFsKSB7CisJCQl1bnNpZ25lZCBwZXJjZW50ID0gbiAqIDEwMCAvIHByb2dyZXNzLT50b3RhbDsKKwkJCWlmIChwZXJjZW50ID4gcHJvZ3Jlc3MtPmRlbGF5ZWRfcGVyY2VudF90cmVzaG9sZCkgeworCQkJCS8qIGluaGliaXQgdGhpcyBwcm9ncmVzcyByZXBvcnQgZW50aXJlbHkgKi8KKwkJCQljbGVhcl9wcm9ncmVzc19zaWduYWwoKTsKKwkJCQlwcm9ncmVzcy0+ZGVsYXkgPSAtMTsKKwkJCQlwcm9ncmVzcy0+dG90YWwgPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWlmIChzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJICAgICBwcm9ncmVzcy0+ZGVsYXllZF90aXRsZSwgcHJvZ3Jlc3MtPnRvdGFsKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1Zik7CisJfQorCWlmIChwcm9ncmVzcy0+dG90YWwpIHsKKwkJdW5zaWduZWQgcGVyY2VudCA9IG4gKiAxMDAgLyBwcm9ncmVzcy0+dG90YWw7CisJCWlmIChwZXJjZW50ICE9IHByb2dyZXNzLT5sYXN0X3BlcmNlbnQgfHwgcHJvZ3Jlc3NfdXBkYXRlKSB7CisJCQlwcm9ncmVzcy0+bGFzdF9wZXJjZW50ID0gcGVyY2VudDsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJcHJvZ3Jlc3MtPnByZWZpeCwgcGVyY2VudCwgbiwgcHJvZ3Jlc3MtPnRvdGFsKTsKKwkJCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSBpZiAocHJvZ3Jlc3NfdXBkYXRlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMldVxyIiwgcHJvZ3Jlc3MtPnByZWZpeCwgbik7CisJCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBzdGFydF9wcm9ncmVzcyhzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCBjb25zdCBjaGFyICp0aXRsZSwKKwkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgdW5zaWduZWQgdG90YWwpCit7CisJY2hhciBidWZbODBdOworCXByb2dyZXNzLT5wcmVmaXggPSBwcmVmaXg7CisJcHJvZ3Jlc3MtPnRvdGFsID0gdG90YWw7CisJcHJvZ3Jlc3MtPmxhc3RfcGVyY2VudCA9IC0xOworCXByb2dyZXNzLT5kZWxheSA9IDA7CisJaWYgKHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHRpdGxlLCB0b3RhbCkpCisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1Zik7CisJc2V0X3Byb2dyZXNzX3NpZ25hbCgpOworfQorCit2b2lkIHN0YXJ0X3Byb2dyZXNzX2RlbGF5KHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MsIGNvbnN0IGNoYXIgKnRpdGxlLAorCQkJICBjb25zdCBjaGFyICpwcmVmaXgsIHVuc2lnbmVkIHRvdGFsLAorCQkJICB1bnNpZ25lZCBwZXJjZW50X3RyZXNob2xkLCB1bnNpZ25lZCBkZWxheSkKK3sKKwlwcm9ncmVzcy0+cHJlZml4ID0gcHJlZml4OworCXByb2dyZXNzLT50b3RhbCA9IHRvdGFsOworCXByb2dyZXNzLT5sYXN0X3BlcmNlbnQgPSAtMTsKKwlwcm9ncmVzcy0+ZGVsYXllZF9wZXJjZW50X3RyZXNob2xkID0gcGVyY2VudF90cmVzaG9sZDsKKwlwcm9ncmVzcy0+ZGVsYXllZF90aXRsZSA9IHRpdGxlOworCXByb2dyZXNzLT5kZWxheSA9IGRlbGF5OworCXNldF9wcm9ncmVzc19zaWduYWwoKTsKK30KKwordm9pZCBzdG9wX3Byb2dyZXNzKHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MpCit7CisJY2xlYXJfcHJvZ3Jlc3Nfc2lnbmFsKCk7CisJaWYgKHByb2dyZXNzLT50b3RhbCkKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyZXNzLmggYi9wcm9ncmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTFhODkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmVzcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgUFJPR1JFU1NfSAorI2RlZmluZSBQUk9HUkVTU19ICisKK3N0cnVjdCBwcm9ncmVzcyB7CisJY29uc3QgY2hhciAqcHJlZml4OworCXVuc2lnbmVkIHRvdGFsOworCXVuc2lnbmVkIGxhc3RfcGVyY2VudDsKKwl1bnNpZ25lZCBkZWxheTsKKwl1bnNpZ25lZCBkZWxheWVkX3BlcmNlbnRfdHJlc2hvbGQ7CisJY29uc3QgY2hhciAqZGVsYXllZF90aXRsZTsKK307CisKK2ludCBkaXNwbGF5X3Byb2dyZXNzKHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MsIHVuc2lnbmVkIG4pOwordm9pZCBzdGFydF9wcm9ncmVzcyhzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCBjb25zdCBjaGFyICp0aXRsZSwKKwkJICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgdW5zaWduZWQgdG90YWwpOwordm9pZCBzdGFydF9wcm9ncmVzc19kZWxheShzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCBjb25zdCBjaGFyICp0aXRsZSwKKwkJCSAgY29uc3QgY2hhciAqcHJlZml4LCB1bnNpZ25lZCB0b3RhbCwKKwkJCSAgdW5zaWduZWQgcGVyY2VudF90cmVzaG9sZCwgdW5zaWduZWQgZGVsYXkpOwordm9pZCBzdG9wX3Byb2dyZXNzKHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3F1b3RlLmMgYi9xdW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWU0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9xdW90ZS5jCkBAIC0wLDAgKzEsNDIzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCisvKiBIZWxwIHRvIGNvcHkgdGhlIHRoaW5nIHByb3Blcmx5IHF1b3RlZCBmb3IgdGhlIHNoZWxsIHNhZmV0eS4KKyAqIGFueSBzaW5nbGUgcXVvdGUgaXMgcmVwbGFjZWQgd2l0aCAnXCcnLCBhbnkgZXhjbGFtYXRpb24gcG9pbnQKKyAqIGlzIHJlcGxhY2VkIHdpdGggJ1whJywgYW5kIHRoZSB3aG9sZSB0aGluZyBpcyBlbmNsb3NlZCBpbiBhCisgKgorICogRS5nLgorICogIG9yaWdpbmFsICAgICBzcV9xdW90ZSAgICAgcmVzdWx0CisgKiAgbmFtZSAgICAgPT0+IG5hbWUgICAgICA9PT4gJ25hbWUnCisgKiAgYSBiICAgICAgPT0+IGEgYiAgICAgICA9PT4gJ2EgYicKKyAqICBhJ2IgICAgICA9PT4gYSdcJydiICAgID09PiAnYSdcJydiJworICogIGEhYiAgICAgID09PiBhJ1whJ2IgICAgPT0+ICdhJ1whJ2InCisgKi8KKyN1bmRlZiBFTUlUCisjZGVmaW5lIEVNSVQoeCkgZG8geyBpZiAoKytsZW4gPCBuKSAqYnArKyA9ICh4KTsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkX2JzX3F1b3RlKGNoYXIgYykKK3sKKwlyZXR1cm4gKGMgPT0gJ1wnJyB8fCBjID09ICchJyk7Cit9CisKK3NpemVfdCBzcV9xdW90ZV9idWYoY2hhciAqZHN0LCBzaXplX3QgbiwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgYzsKKwljaGFyICpicCA9IGRzdDsKKwlzaXplX3QgbGVuID0gMDsKKworCUVNSVQoJ1wnJyk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAobmVlZF9ic19xdW90ZShjKSkgeworCQkJRU1JVCgnXCcnKTsKKwkJCUVNSVQoJ1xcJyk7CisJCQlFTUlUKGMpOworCQkJRU1JVCgnXCcnKTsKKwkJfSBlbHNlIHsKKwkJCUVNSVQoYyk7CisJCX0KKwl9CisJRU1JVCgnXCcnKTsKKworCWlmICggbiApCisJCSpicCA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCit2b2lkIHNxX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgYzsKKworCWZwdXRjKCdcJycsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAobmVlZF9ic19xdW90ZShjKSkgeworCQkJZnB1dHMoIidcXCIsIHN0cmVhbSk7CisJCQlmcHV0YyhjLCBzdHJlYW0pOworCQkJZnB1dGMoJ1wnJywgc3RyZWFtKTsKKwkJfSBlbHNlIHsKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCX0KKwl9CisJZnB1dGMoJ1wnJywgc3RyZWFtKTsKK30KKworY2hhciAqc3FfcXVvdGUoY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKmJ1ZjsKKwlzaXplX3QgY250OworCisJY250ID0gc3FfcXVvdGVfYnVmKE5VTEwsIDAsIHNyYykgKyAxOworCWJ1ZiA9IHhtYWxsb2MoY250KTsKKwlzcV9xdW90ZV9idWYoYnVmLCBjbnQsIHNyYyk7CisKKwlyZXR1cm4gYnVmOworfQorCitjaGFyICpzcV9xdW90ZV9hcmd2KGNvbnN0IGNoYXIqKiBhcmd2LCBpbnQgY291bnQpCit7CisJY2hhciAqYnVmLCAqdG87CisJaW50IGk7CisJc2l6ZV90IGxlbiA9IDA7CisKKwkvKiBDb3VudCBhcmd2IGlmIG5lZWRlZC4gKi8KKwlpZiAoY291bnQgPCAwKSB7CisJCWZvciAoY291bnQgPSAwOyBhcmd2W2NvdW50XTsgY291bnQrKykKKwkJCTsgLyoganVzdCBjb3VudGluZyAqLworCX0KKworCS8qIFNwZWNpYWwgY2FzZTogbm8gYXJndi4gKi8KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4geGNhbGxvYygxLDEpOworCisJLyogR2V0IGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGguICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWxlbiArPSBzcV9xdW90ZV9idWYoTlVMTCwgMCwgYXJndltpXSkgKyAxOworCisJLyogQWxsb2MgZGVzdGluYXRpb24gYnVmZmVyLiAqLworCXRvID0gYnVmID0geG1hbGxvYyhsZW4gKyAxKTsKKworCS8qIENvcHkgaW50byBkZXN0aW5hdGlvbiBidWZmZXIuICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJKnRvKysgPSAnICc7CisJCXRvICs9IHNxX3F1b3RlX2J1Zih0bywgbGVuLCBhcmd2W2ldKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogQXBwZW5kIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGJ1ZmZlciwgd2l0aCBvciB3aXRob3V0IHNoZWxsIHF1b3RpbmcuCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIG92ZXJmbG93ZWQuCisgKi8KK2ludCBhZGRfdG9fc3RyaW5nKGNoYXIgKipwdHJwLCBpbnQgKnNpemVwLCBjb25zdCBjaGFyICpzdHIsIGludCBxdW90ZSkKK3sKKwljaGFyICpwID0gKnB0cnA7CisJaW50IHNpemUgPSAqc2l6ZXA7CisJaW50IG9jOworCWludCBlcnIgPSAwOworCisJaWYgKHF1b3RlKQorCQlvYyA9IHNxX3F1b3RlX2J1ZihwLCBzaXplLCBzdHIpOworCWVsc2UgeworCQlvYyA9IHN0cmxlbihzdHIpOworCQltZW1jcHkocCwgc3RyLCAoc2l6ZSA8PSBvYykgPyBzaXplIC0gMSA6IG9jKTsKKwl9CisKKwlpZiAoc2l6ZSA8PSBvYykgeworCQllcnIgPSAxOworCQlvYyA9IHNpemUgLSAxOworCX0KKworCSpwdHJwICs9IG9jOworCSoqcHRycCA9ICdcMCc7CisJKnNpemVwIC09IG9jOworCXJldHVybiBlcnI7Cit9CisKK2NoYXIgKnNxX2RlcXVvdGUoY2hhciAqYXJnKQoreworCWNoYXIgKmRzdCA9IGFyZzsKKwljaGFyICpzcmMgPSBhcmc7CisJY2hhciBjOworCisJaWYgKCpzcmMgIT0gJ1wnJykKKwkJcmV0dXJuIE5VTEw7CisJZm9yICg7OykgeworCQljID0gKisrc3JjOworCQlpZiAoIWMpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGMgIT0gJ1wnJykgeworCQkJKmRzdCsrID0gYzsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIHN0ZXBwZWQgb3V0IG9mIHNxICovCisJCXN3aXRjaCAoKisrc3JjKSB7CisJCWNhc2UgJ1wwJzoKKwkJCSpkc3QgPSAwOworCQkJcmV0dXJuIGFyZzsKKwkJY2FzZSAnXFwnOgorCQkJYyA9ICorK3NyYzsKKwkJCWlmIChuZWVkX2JzX3F1b3RlKGMpICYmICorK3NyYyA9PSAnXCcnKSB7CisJCQkJKmRzdCsrID0gYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJLyogRmFsbHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorfQorCisvKgorICogQy1zdHlsZSBuYW1lIHF1b3RpbmcuCisgKgorICogRG9lcyBvbmUgb2YgdGhyZWUgdGhpbmdzOgorICoKKyAqICgxKSBpZiBvdXRidWYgYW5kIG91dGZwIGFyZSBib3RoIE5VTEwsIGluc3BlY3QgdGhlIGlucHV0IG5hbWUgYW5kCisgKiAgICAgY291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgbmVlZGVkIHRvIGhvbGQgY19zdHlsZQorICogICAgIHF1b3RlZCB2ZXJzaW9uIG9mIG5hbWUsIGNvdW50aW5nIHRoZSBkb3VibGUgcXVvdGVzIGFyb3VuZAorICogICAgIGl0IGJ1dCBub3QgdGVybWluYXRpbmcgTlVMLCBhbmQgcmV0dXJucyBpdC4gIEhvd2V2ZXIsIGlmIG5hbWUKKyAqICAgICBkb2VzIG5vdCBuZWVkIGNfc3R5bGUgcXVvdGluZywgaXQgcmV0dXJucyAwLgorICoKKyAqICgyKSBpZiBvdXRidWYgaXMgbm90IE5VTEwsIGl0IG11c3QgcG9pbnQgYXQgYSBidWZmZXIgbGFyZ2UgZW5vdWdoCisgKiAgICAgdG8gaG9sZCB0aGUgY19zdHlsZSBxdW90ZWQgdmVyc2lvbiBvZiBuYW1lLCBlbmNsb3NpbmcgZG91YmxlCisgKiAgICAgcXVvdGVzLCBhbmQgdGVybWluYXRpbmcgTlVMLiAgRmlsbHMgb3V0YnVmIHdpdGggY19zdHlsZSBxdW90ZWQKKyAqICAgICB2ZXJzaW9uIG9mIG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlLXF1b3RlIHBhaXIuICBSZXR1cm4gdmFsdWUKKyAqICAgICBpcyB1bmRlZmluZWQuCisgKgorICogKDMpIGlmIG91dGZwIGlzIG5vdCBOVUxMLCBvdXRwdXRzIGNfc3R5bGUgcXVvdGVkIHZlcnNpb24gb2YgbmFtZSwKKyAqICAgICBidXQgbm90IGVuY2xvc2VkIGluIGRvdWJsZS1xdW90ZSBwYWlyLiAgUmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAqLworCitzdGF0aWMgaW50IHF1b3RlX2Nfc3R5bGVfY291bnRlZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkgY2hhciAqb3V0YnVmLCBGSUxFICpvdXRmcCwgaW50IG5vX2RxKQoreworI3VuZGVmIEVNSVQKKyNkZWZpbmUgRU1JVChjKSBcCisJKG91dGJ1ZiA/ICgqb3V0YnVmKysgPSAoYykpIDogb3V0ZnAgPyBmcHV0YyhjLCBvdXRmcCkgOiAoY291bnQrKykpCisKKyNkZWZpbmUgRU1JVFEoKSBFTUlUKCdcXCcpCisKKwljb25zdCBjaGFyICpzcDsKKwlpbnQgY2gsIGNvdW50ID0gMCwgbmVlZHF1b3RlID0gMDsKKworCWlmICghbm9fZHEpCisJCUVNSVQoJyInKTsKKwlmb3IgKHNwID0gbmFtZTsgc3AgPCBuYW1lICsgbmFtZWxlbjsgc3ArKykgeworCQljaCA9ICpzcDsKKwkJaWYgKCFjaCkKKwkJCWJyZWFrOworCQlpZiAoKGNoIDwgJyAnKSB8fCAoY2ggPT0gJyInKSB8fCAoY2ggPT0gJ1xcJykgfHwKKwkJICAgIChjaCA+PSAwMTc3KSkgeworCQkJbmVlZHF1b3RlID0gMTsKKwkJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJ1xhJzogRU1JVFEoKTsgY2ggPSAnYSc7IGJyZWFrOworCQkJY2FzZSAnXGInOiBFTUlUUSgpOyBjaCA9ICdiJzsgYnJlYWs7CisJCQljYXNlICdcZic6IEVNSVRRKCk7IGNoID0gJ2YnOyBicmVhazsKKwkJCWNhc2UgJ1xuJzogRU1JVFEoKTsgY2ggPSAnbic7IGJyZWFrOworCQkJY2FzZSAnXHInOiBFTUlUUSgpOyBjaCA9ICdyJzsgYnJlYWs7CisJCQljYXNlICdcdCc6IEVNSVRRKCk7IGNoID0gJ3QnOyBicmVhazsKKwkJCWNhc2UgJ1x2JzogRU1JVFEoKTsgY2ggPSAndic7IGJyZWFrOworCisJCQljYXNlICdcXCc6IC8qIGZhbGx0aHJ1ICovCisJCQljYXNlICciJzogRU1JVFEoKTsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIG9jdGFsICovCisJCQkJRU1JVFEoKTsKKwkJCQlFTUlUKCgoY2ggPj4gNikgJiAwMykgKyAnMCcpOworCQkJCUVNSVQoKChjaCA+PiAzKSAmIDA3KSArICcwJyk7CisJCQkJY2ggPSAoY2ggJiAwNykgKyAnMCc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJRU1JVChjaCk7CisJfQorCWlmICghbm9fZHEpCisJCUVNSVQoJyInKTsKKwlpZiAob3V0YnVmKQorCQkqb3V0YnVmID0gMDsKKworCXJldHVybiBuZWVkcXVvdGUgPyBjb3VudCA6IDA7Cit9CisKK2ludCBxdW90ZV9jX3N0eWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKm91dGJ1ZiwgRklMRSAqb3V0ZnAsIGludCBub19kcSkKK3sKKwlpbnQgY250ID0gc3RybGVuKG5hbWUpOworCXJldHVybiBxdW90ZV9jX3N0eWxlX2NvdW50ZWQobmFtZSwgY250LCBvdXRidWYsIG91dGZwLCBub19kcSk7Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgdW5xdW90aW5nLgorICoKKyAqIFF1b3RlZCBzaG91bGQgcG9pbnQgYXQgdGhlIG9wZW5pbmcgZG91YmxlIHF1b3RlLiAgUmV0dXJucworICogYW4gYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhvbGRzIHVucXVvdGVkIG5hbWUsIHdoaWNoIHRoZSBjYWxsZXIKKyAqIHNob3VsZCBmcmVlIHdoZW4gZG9uZS4gIFVwZGF0ZXMgZW5kcCBwb2ludGVyIHRvIHBvaW50IGF0CisgKiBvbmUgcGFzdCB0aGUgZW5kaW5nIGRvdWJsZSBxdW90ZSBpZiBnaXZlbi4KKyAqLworCitjaGFyICp1bnF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqcXVvdGVkLCBjb25zdCBjaGFyICoqZW5kcCkKK3sKKwljb25zdCBjaGFyICpzcDsKKwljaGFyICpuYW1lID0gTlVMTCwgKm91dHAgPSBOVUxMOworCWludCBjb3VudCA9IDAsIGNoLCBhYzsKKworI3VuZGVmIEVNSVQKKyNkZWZpbmUgRU1JVChjKSAob3V0cCA/ICgqb3V0cCsrID0gKGMpKSA6IChjb3VudCsrKSkKKworCWlmICgqcXVvdGVkKysgIT0gJyInKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCS8qIGZpcnN0IHBhc3MgY291bnRzIGFuZCBhbGxvY2F0ZXMsIHNlY29uZCBwYXNzIGZpbGxzICovCisJCWZvciAoc3AgPSBxdW90ZWQ7IChjaCA9ICpzcCsrKSAhPSAnIic7ICkgeworCQkJaWYgKGNoID09ICdcXCcpIHsKKwkJCQlzd2l0Y2ggKGNoID0gKnNwKyspIHsKKwkJCQljYXNlICdhJzogY2ggPSAnXGEnOyBicmVhazsKKwkJCQljYXNlICdiJzogY2ggPSAnXGInOyBicmVhazsKKwkJCQljYXNlICdmJzogY2ggPSAnXGYnOyBicmVhazsKKwkJCQljYXNlICduJzogY2ggPSAnXG4nOyBicmVhazsKKwkJCQljYXNlICdyJzogY2ggPSAnXHInOyBicmVhazsKKwkJCQljYXNlICd0JzogY2ggPSAnXHQnOyBicmVhazsKKwkJCQljYXNlICd2JzogY2ggPSAnXHYnOyBicmVhazsKKworCQkJCWNhc2UgJ1xcJzogY2FzZSAnIic6CisJCQkJCWJyZWFrOyAvKiB2ZXJiYXRpbSAqLworCisJCQkJY2FzZSAnMCc6CisJCQkJY2FzZSAnMSc6CisJCQkJY2FzZSAnMic6CisJCQkJY2FzZSAnMyc6CisJCQkJY2FzZSAnNCc6CisJCQkJY2FzZSAnNSc6CisJCQkJY2FzZSAnNic6CisJCQkJY2FzZSAnNyc6CisJCQkJCS8qIG9jdGFsICovCisJCQkJCWFjID0gKChjaCAtICcwJykgPDwgNik7CisJCQkJCWlmICgoY2ggPSAqc3ArKykgPCAnMCcgfHwgJzcnIDwgY2gpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJYWMgfD0gKChjaCAtICcwJykgPDwgMyk7CisJCQkJCWlmICgoY2ggPSAqc3ArKykgPCAnMCcgfHwgJzcnIDwgY2gpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJYWMgfD0gKGNoIC0gJzAnKTsKKwkJCQkJY2ggPSBhYzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5VTEw7IC8qIG1hbGZvcm1lZCAqLworCQkJCX0KKwkJCX0KKwkJCUVNSVQoY2gpOworCQl9CisKKwkJaWYgKG5hbWUpIHsKKwkJCSpvdXRwID0gMDsKKwkJCWlmIChlbmRwKQorCQkJCSplbmRwID0gc3A7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCQlvdXRwID0gbmFtZSA9IHhtYWxsb2MoY291bnQgKyAxKTsKKwl9Cit9CisKK3ZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBxdW90ZSwgRklMRSAqb3V0KQoreworCWludCBuZWVkcXVvdGU7CisKKwlpZiAoIXF1b3RlKSB7CisJbm9fcXVvdGU6CisJCWlmIChwcmVmaXhfbGVuKQorCQkJZnByaW50ZihvdXQsICIlLipzIiwgcHJlZml4X2xlbiwgcHJlZml4KTsKKwkJZnB1dHMobmFtZSwgb3V0KTsKKwkJcmV0dXJuOworCX0KKworCW5lZWRxdW90ZSA9IDA7CisJaWYgKHByZWZpeF9sZW4pCisJCW5lZWRxdW90ZSA9IHF1b3RlX2Nfc3R5bGVfY291bnRlZChwcmVmaXgsIHByZWZpeF9sZW4sCisJCQkJCQkgIE5VTEwsIE5VTEwsIDApOworCWlmICghbmVlZHF1b3RlKQorCQluZWVkcXVvdGUgPSBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApOworCWlmIChuZWVkcXVvdGUpIHsKKwkJZnB1dGMoJyInLCBvdXQpOworCQlpZiAocHJlZml4X2xlbikKKwkJCXF1b3RlX2Nfc3R5bGVfY291bnRlZChwcmVmaXgsIHByZWZpeF9sZW4sCisJCQkJCSAgICAgIE5VTEwsIG91dCwgMSk7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgb3V0LCAxKTsKKwkJZnB1dGMoJyInLCBvdXQpOworCX0KKwllbHNlCisJCWdvdG8gbm9fcXVvdGU7Cit9CisKKy8qIHF1b3RpbmcgYXMgYSBzdHJpbmcgbGl0ZXJhbCBmb3Igb3RoZXIgbGFuZ3VhZ2VzICovCisKK3ZvaWQgcGVybF9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljb25zdCBjaGFyIHNxID0gJ1wnJzsKKwljb25zdCBjaGFyIGJxID0gJ1xcJzsKKwljaGFyIGM7CisKKwlmcHV0YyhzcSwgc3RyZWFtKTsKKwl3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJCWlmIChjID09IHNxIHx8IGMgPT0gYnEpCisJCQlmcHV0YyhicSwgc3RyZWFtKTsKKwkJZnB1dGMoYywgc3RyZWFtKTsKKwl9CisJZnB1dGMoc3EsIHN0cmVhbSk7Cit9CisKK3ZvaWQgcHl0aG9uX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNvbnN0IGNoYXIgc3EgPSAnXCcnOworCWNvbnN0IGNoYXIgYnEgPSAnXFwnOworCWNvbnN0IGNoYXIgbmwgPSAnXG4nOworCWNoYXIgYzsKKworCWZwdXRjKHNxLCBzdHJlYW0pOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJaWYgKGMgPT0gbmwpIHsKKwkJCWZwdXRjKGJxLCBzdHJlYW0pOworCQkJZnB1dGMoJ24nLCBzdHJlYW0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gc3EgfHwgYyA9PSBicSkKKwkJCWZwdXRjKGJxLCBzdHJlYW0pOworCQlmcHV0YyhjLCBzdHJlYW0pOworCX0KKwlmcHV0YyhzcSwgc3RyZWFtKTsKK30KKwordm9pZCB0Y2xfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciBjOworCisJZnB1dGMoJyInLCBzdHJlYW0pOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1snOiBjYXNlICddJzoKKwkJY2FzZSAneyc6IGNhc2UgJ30nOgorCQljYXNlICckJzogY2FzZSAnXFwnOiBjYXNlICciJzoKKwkJCWZwdXRjKCdcXCcsIHN0cmVhbSk7CisJCWRlZmF1bHQ6CisJCQlmcHV0YyhjLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ1xmJzoKKwkJCWZwdXRzKCJcXGYiLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ1xyJzoKKwkJCWZwdXRzKCJcXHIiLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCWZwdXRzKCJcXG4iLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ1x0JzoKKwkJCWZwdXRzKCJcXHQiLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCWNhc2UgJ1x2JzoKKwkJCWZwdXRzKCJcXHYiLCBzdHJlYW0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJZnB1dGMoJyInLCBzdHJlYW0pOworfQpkaWZmIC0tZ2l0IGEvcXVvdGUuaCBiL3F1b3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMzYxMAotLS0gL2Rldi9udWxsCisrKyBiL3F1b3RlLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZiBRVU9URV9ICisjZGVmaW5lIFFVT1RFX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIEhlbHAgdG8gY29weSB0aGUgdGhpbmcgcHJvcGVybHkgcXVvdGVkIGZvciB0aGUgc2hlbGwgc2FmZXR5LgorICogYW55IHNpbmdsZSBxdW90ZSBpcyByZXBsYWNlZCB3aXRoICdcJycsIGFueSBleGNsYW1hdGlvbiBwb2ludAorICogaXMgcmVwbGFjZWQgd2l0aCAnXCEnLCBhbmQgdGhlIHdob2xlIHRoaW5nIGlzIGVuY2xvc2VkIGluIGEKKyAqIHNpbmdsZSBxdW90ZSBwYWlyLgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHBhc3NpbmcgdGhlIHJlc3VsdCB0byBzeXN0ZW0oKSBhcyBhbgorICogYXJndW1lbnQ6CisgKgorICogc3ByaW50ZihjbWQsICJmb29iYXIgJXMgJXMiLCBzcV9xdW90ZShhcmcwKSwgc3FfcXVvdGUoYXJnMSkpCisgKgorICogd291bGQgYmUgYXBwcm9wcmlhdGUuICBJZiB0aGUgc3lzdGVtKCkgaXMgZ29pbmcgdG8gY2FsbCBzc2ggdG8KKyAqIHJ1biB0aGUgY29tbWFuZCBvbiB0aGUgb3RoZXIgc2lkZToKKyAqCisgKiBzcHJpbnRmKGNtZCwgImdpdC1kaWZmLXRyZWUgJXMgJXMiLCBzcV9xdW90ZShhcmcwKSwgc3FfcXVvdGUoYXJnMSkpOworICogc3ByaW50ZihyY21kLCAic3NoICVzICVzIiwgc3FfcXVvdGUoaG9zdCksIHNxX3F1b3RlKGNtZCkpOworICoKKyAqIE5vdGUgdGhhdCB0aGUgYWJvdmUgZXhhbXBsZXMgbGVhayBtZW1vcnkhICBSZW1lbWJlciB0byBmcmVlIHJlc3VsdCBmcm9tCisgKiBzcV9xdW90ZSgpIGluIGEgcmVhbCBhcHBsaWNhdGlvbi4KKyAqCisgKiBzcV9xdW90ZV9idWYoKSB3cml0ZXMgdG8gYW4gZXhpc3RpbmcgYnVmZmVyIG9mIHNwZWNpZmllZCBzaXplOyBpdAorICogd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAqIGV4Y2x1ZGluZyB0aGUgZmluYWwgbnVsbCByZWdhcmRsZXNzIG9mIHRoZSBidWZmZXIgc2l6ZS4KKyAqLworCitleHRlcm4gY2hhciAqc3FfcXVvdGUoY29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiB2b2lkIHNxX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiBzaXplX3Qgc3FfcXVvdGVfYnVmKGNoYXIgKmRzdCwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gY2hhciAqc3FfcXVvdGVfYXJndihjb25zdCBjaGFyKiogYXJndiwgaW50IGNvdW50KTsKKworLyoKKyAqIEFwcGVuZCBhIHN0cmluZyB0byBhIHN0cmluZyBidWZmZXIsIHdpdGggb3Igd2l0aG91dCBzaGVsbCBxdW90aW5nLgorICogUmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd2VkLgorICovCitleHRlcm4gaW50IGFkZF90b19zdHJpbmcoY2hhciAqKnB0cnAsIGludCAqc2l6ZXAsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHF1b3RlKTsKKworLyogVGhpcyB1bndyYXBzIHdoYXQgc3FfcXVvdGUoKSBwcm9kdWNlcyBpbiBwbGFjZSwgYnV0IHJldHVybnMKKyAqIE5VTEwgaWYgdGhlIGlucHV0IGRvZXMgbm90IGxvb2sgbGlrZSB3aGF0IHNxX3F1b3RlIHdvdWxkIGhhdmUKKyAqIHByb2R1Y2VkLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZShjaGFyICopOworCitleHRlcm4gaW50IHF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqb3V0YnVmLCBGSUxFICpvdXRmcCwKKwkJCSBpbnQgbm9kcSk7CitleHRlcm4gY2hhciAqdW5xdW90ZV9jX3N0eWxlKGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApOworCitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZChjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHF1b3RlLCBGSUxFICpvdXQpOworCisvKiBxdW90aW5nIGFzIGEgc3RyaW5nIGxpdGVyYWwgZm9yIG90aGVyIGxhbmd1YWdlcyAqLworZXh0ZXJuIHZvaWQgcGVybF9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gdm9pZCBweXRob25fcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworZXh0ZXJuIHZvaWQgdGNsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZWFjaGFibGUuYyBiL3JlYWNoYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWVlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjaGFibGUuYwpAQCAtMCwwICsxLDIyMCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJyZWFjaGFibGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYmxvYihzdHJ1Y3QgYmxvYiAqYmxvYiwKKwkJCSBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmYmxvYi0+b2JqZWN0OworCisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBTRUVOOworCS8qIE5vdGhpbmcgdG8gZG8sIHJlYWxseSAuLiBUaGUgYmxvYiBsb29rdXAgd2FzIHRoZSBpbXBvcnRhbnQgcGFydCAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2dpdGxpbmsoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgICBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJICAgIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHdlIHdhbnQgdG8gcmVjdXJzZSBpbnRvIHRoaXMsIHJlYWxseS4gKi8KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190cmVlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlpZiAob2JqLT5mbGFncyAmIFNFRU4pCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJaWYgKHBhcnNlX3RyZWUodHJlZSkgPCAwKQorCQlkaWUoImJhZCB0cmVlIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCW5hbWUgPSB4c3RyZHVwKG5hbWUpOworCWFkZF9vYmplY3Qob2JqLCBwLCBwYXRoLCBuYW1lKTsKKwltZS51cCA9IHBhdGg7CisJbWUuZWxlbSA9IG5hbWU7CisJbWUuZWxlbV9sZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJcHJvY2Vzc190cmVlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLCBwLCAmbWUsIGVudHJ5LnBhdGgpOworCQllbHNlIGlmIChTX0lTRElSTE5LKGVudHJ5Lm1vZGUpKQorCQkJcHJvY2Vzc19naXRsaW5rKGVudHJ5LnNoYTEsIHAsICZtZSwgZW50cnkucGF0aCk7CisJCWVsc2UKKwkJCXByb2Nlc3NfYmxvYihsb29rdXBfYmxvYihlbnRyeS5zaGExKSwgcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwl9CisJZnJlZSh0cmVlLT5idWZmZXIpOworCXRyZWUtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdGFnKHN0cnVjdCB0YWcgKnRhZywgc3RydWN0IG9iamVjdF9hcnJheSAqcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdGFnLT5vYmplY3Q7CisJc3RydWN0IG5hbWVfcGF0aCBtZTsKKworCWlmIChvYmotPmZsYWdzICYgU0VFTikKKwkJcmV0dXJuOworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKworCW1lLnVwID0gTlVMTDsKKwltZS5lbGVtID0gInRhZzovIjsKKwltZS5lbGVtX2xlbiA9IDU7CisKKwlpZiAocGFyc2VfdGFnKHRhZykgPCAwKQorCQlkaWUoImJhZCB0YWcgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJYWRkX29iamVjdCh0YWctPnRhZ2dlZCwgcCwgTlVMTCwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfY29tbWl0X2xpc3Qoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IG9iamVjdHMgPSB7IDAsIDAsIE5VTEwgfTsKKworCS8qIFdhbGsgYWxsIGNvbW1pdHMsIHByb2Nlc3MgdGhlaXIgdHJlZXMgKi8KKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXZzKSkgIT0gTlVMTCkKKwkJcHJvY2Vzc190cmVlKGNvbW1pdC0+dHJlZSwgJm9iamVjdHMsIE5VTEwsICIiKTsKKworCS8qIFRoZW4gd2FsayBhbGwgdGhlIHBlbmRpbmcgb2JqZWN0cywgcmVjdXJzaXZlbHkgcHJvY2Vzc2luZyB0aGVtIHRvbyAqLworCWZvciAoaSA9IDA7IGkgPCByZXZzLT5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqcGVuZGluZyA9IHJldnMtPnBlbmRpbmcub2JqZWN0cyArIGk7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBlbmRpbmctPml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZW5kaW5nLT5uYW1lOworCQlpZiAob2JqLT50eXBlID09IE9CSl9UQUcpIHsKKwkJCXByb2Nlc3NfdGFnKChzdHJ1Y3QgdGFnICopIG9iaiwgJm9iamVjdHMsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQkJcHJvY2Vzc190cmVlKChzdHJ1Y3QgdHJlZSAqKW9iaiwgJm9iamVjdHMsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikgeworCQkJcHJvY2Vzc19ibG9iKChzdHJ1Y3QgYmxvYiAqKW9iaiwgJm9iamVjdHMsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJ1bmtub3duIHBlbmRpbmcgb2JqZWN0ICVzICglcykiLCBzaGExX3RvX2hleChvYmotPnNoYTEpLCBuYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWRkX29uZV9yZWZsb2dfZW50KHVuc2lnbmVkIGNoYXIgKm9zaGExLCB1bnNpZ25lZCBjaGFyICpuc2hhMSwKKwkJY29uc3QgY2hhciAqZW1haWwsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wLCBpbnQgdHosCisJCWNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0OworCXN0cnVjdCByZXZfaW5mbyAqcmV2cyA9IChzdHJ1Y3QgcmV2X2luZm8gKiljYl9kYXRhOworCisJb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KG9zaGExKTsKKwlpZiAob2JqZWN0KQorCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCAiIik7CisJb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KG5zaGExKTsKKwlpZiAob2JqZWN0KQorCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCAiIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29uZV9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCXN0cnVjdCByZXZfaW5mbyAqcmV2cyA9IChzdHJ1Y3QgcmV2X2luZm8gKiljYl9kYXRhOworCisJaWYgKCFvYmplY3QpCisJCWRpZSgiYmFkIG9iamVjdCByZWY6ICVzOiVzIiwgcGF0aCwgc2hhMV90b19oZXgoc2hhMSkpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsICIiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9vbmVfcmVmbG9nKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCWZvcl9lYWNoX3JlZmxvZ19lbnQocGF0aCwgYWRkX29uZV9yZWZsb2dfZW50LCBjYl9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX29uZV90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZSA9IGxvb2t1cF90cmVlKHNoYTEpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmdHJlZS0+b2JqZWN0LCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCwgc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCWludCBpOworCisJaWYgKGl0LT5lbnRyeV9jb3VudCA+PSAwKQorCQlhZGRfb25lX3RyZWUoaXQtPnNoYTEsIHJldnMpOworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKQorCQlhZGRfY2FjaGVfdHJlZShpdC0+ZG93bltpXS0+Y2FjaGVfdHJlZSwgcmV2cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jYWNoZV9yZWZzKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgaTsKKworCXJlYWRfY2FjaGUoKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJLyoKKwkJICogVGhlIGluZGV4IGNhbiBjb250YWluIGJsb2JzIGFuZCBHSVRMSU5LcywgR0lUTElOS3MgYXJlIGhhc2hlcworCQkgKiB0aGF0IGRvbid0IGFjdHVhbGx5IHBvaW50IHRvIG9iamVjdHMgaW4gdGhlIHJlcG9zaXRvcnksIGl0J3MKKwkJICogYWxtb3N0IGd1YXJhbnRlZWQgdGhhdCB0aGV5IGFyZSBOT1QgYmxvYnMsIHNvIHdlIGRvbid0IGNhbGwKKwkJICogbG9va3VwX2Jsb2IoKSBvbiB0aGVtLCB0byBhdm9pZCBwb3B1bGF0aW5nIHRoZSBoYXNoIHRhYmxlCisJCSAqIHdpdGggaW52YWxpZCBpbmZvcm1hdGlvbgorCQkgKi8KKwkJaWYgKFNfSVNESVJMTksobnRvaGwoYWN0aXZlX2NhY2hlW2ldLT5jZV9tb2RlKSkpCisJCQljb250aW51ZTsKKworCQlsb29rdXBfYmxvYihhY3RpdmVfY2FjaGVbaV0tPnNoYTEpOworCQkvKgorCQkgKiBXZSBjb3VsZCBhZGQgdGhlIGJsb2JzIHRvIHRoZSBwZW5kaW5nIGxpc3QsIGJ1dCBxdWl0ZQorCQkgKiBmcmFua2x5LCB3ZSBkb24ndCBjYXJlLiBPbmNlIHdlJ3ZlIGxvb2tlZCB0aGVtIHVwLCBhbmQKKwkJICogYWRkZWQgdGhlbSBhcyBvYmplY3RzLCB3ZSd2ZSByZWFsbHkgZG9uZSBldmVyeXRoaW5nCisJCSAqIHRoZXJlIGlzIHRvIGRvIGZvciBhIGJsb2IKKwkJICovCisJfQorCWlmIChhY3RpdmVfY2FjaGVfdHJlZSkKKwkJYWRkX2NhY2hlX3RyZWUoYWN0aXZlX2NhY2hlX3RyZWUsIHJldnMpOworfQorCit2b2lkIG1hcmtfcmVhY2hhYmxlX29iamVjdHMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgbWFya19yZWZsb2cpCit7CisJLyoKKwkgKiBTZXQgdXAgcmV2aXNpb24gcGFyc2luZywgYW5kIG1hcmsgdXMgYXMgYmVpbmcgaW50ZXJlc3RlZAorCSAqIGluIGFsbCBvYmplY3QgdHlwZXMsIG5vdCBqdXN0IGNvbW1pdHMuCisJICovCisJcmV2cy0+dGFnX29iamVjdHMgPSAxOworCXJldnMtPmJsb2Jfb2JqZWN0cyA9IDE7CisJcmV2cy0+dHJlZV9vYmplY3RzID0gMTsKKworCS8qIEFkZCBhbGwgcmVmcyBmcm9tIHRoZSBpbmRleCBmaWxlICovCisJYWRkX2NhY2hlX3JlZnMocmV2cyk7CisKKwkvKiBBZGQgYWxsIGV4dGVybmFsIHJlZnMgKi8KKwlmb3JfZWFjaF9yZWYoYWRkX29uZV9yZWYsIHJldnMpOworCisJLyogQWRkIGFsbCByZWZsb2cgaW5mbyAqLworCWlmIChtYXJrX3JlZmxvZykKKwkJZm9yX2VhY2hfcmVmbG9nKGFkZF9vbmVfcmVmbG9nLCByZXZzKTsKKworCS8qCisJICogU2V0IHVwIHRoZSByZXZpc2lvbiB3YWxrIC0gdGhpcyB3aWxsIG1vdmUgYWxsIGNvbW1pdHMKKwkgKiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgdG8gdGhlIGNvbW1pdCB3YWxraW5nIGxpc3QuCisJICovCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldnMpOworCXdhbGtfY29tbWl0X2xpc3QocmV2cyk7Cit9CmRpZmYgLS1naXQgYS9yZWFjaGFibGUuaCBiL3JlYWNoYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzUxODEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjaGFibGUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgUkVBQ0hFQUJMRV9ICisjZGVmaW5lIFJFQUNIRUFCTEVfSAorCitleHRlcm4gdm9pZCBtYXJrX3JlYWNoYWJsZV9vYmplY3RzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IG1hcmtfcmVmbG9nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZWFkLWNhY2hlLmMgYi9yZWFkLWNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmNDZkYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWQtY2FjaGUuYwpAQCAtMCwwICsxLDEwOTcgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNkZWZpbmUgTk9fVEhFX0lOREVYX0NPTVBBVElCSUxJVFlfTUFDUk9TCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCisvKiBJbmRleCBleHRlbnNpb25zLgorICoKKyAqIFRoZSBmaXJzdCBsZXR0ZXIgc2hvdWxkIGJlICdBJy4uJ1onIGZvciBleHRlbnNpb25zIHRoYXQgYXJlIG5vdAorICogbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3Qgb3BlcmF0aW9uIChpLmUuIG9wdGltaXphdGlvbiBkYXRhKS4KKyAqIFdoZW4gbmV3IGV4dGVuc2lvbnMgYXJlIGFkZGVkIHRoYXQgX25lZWRzXyB0byBiZSB1bmRlcnN0b29kIGluCisgKiBvcmRlciB0byBjb3JyZWN0bHkgaW50ZXJwcmV0IHRoZSBpbmRleCBmaWxlLCBwaWNrIGNoYXJhY3RlciB0aGF0CisgKiBpcyBvdXRzaWRlIHRoZSByYW5nZSwgdG8gY2F1c2UgdGhlIHJlYWRlciB0byBhYm9ydC4KKyAqLworCisjZGVmaW5lIENBQ0hFX0VYVChzKSAoIChzWzBdPDwyNCl8KHNbMV08PDE2KXwoc1syXTw8OCl8KHNbM10pICkKKyNkZWZpbmUgQ0FDSEVfRVhUX1RSRUUgMHg1NDUyNDU0NQkvKiAiVFJFRSIgKi8KKworc3RydWN0IGluZGV4X3N0YXRlIHRoZV9pbmRleDsKKworLyoKKyAqIFRoaXMgb25seSB1cGRhdGVzIHRoZSAibm9uLWNyaXRpY2FsIiBwYXJ0cyBvZiB0aGUgZGlyZWN0b3J5CisgKiBjYWNoZSwgaWUgdGhlIHBhcnRzIHRoYXQgYXJlbid0IHRyYWNrZWQgYnkgR0lULCBhbmQgb25seSB1c2VkCisgKiB0byB2YWxpZGF0ZSB0aGUgY2FjaGUuCisgKi8KK3ZvaWQgZmlsbF9zdGF0X2NhY2hlX2luZm8oc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCWNlLT5jZV9jdGltZS5zZWMgPSBodG9ubChzdC0+c3RfY3RpbWUpOworCWNlLT5jZV9tdGltZS5zZWMgPSBodG9ubChzdC0+c3RfbXRpbWUpOworI2lmZGVmIFVTRV9OU0VDCisJY2UtPmNlX2N0aW1lLm5zZWMgPSBodG9ubChzdC0+c3RfY3RpbS50dl9uc2VjKTsKKwljZS0+Y2VfbXRpbWUubnNlYyA9IGh0b25sKHN0LT5zdF9tdGltLnR2X25zZWMpOworI2VuZGlmCisJY2UtPmNlX2RldiA9IGh0b25sKHN0LT5zdF9kZXYpOworCWNlLT5jZV9pbm8gPSBodG9ubChzdC0+c3RfaW5vKTsKKwljZS0+Y2VfdWlkID0gaHRvbmwoc3QtPnN0X3VpZCk7CisJY2UtPmNlX2dpZCA9IGh0b25sKHN0LT5zdF9naWQpOworCWNlLT5jZV9zaXplID0gaHRvbmwoc3QtPnN0X3NpemUpOworCisJaWYgKGFzc3VtZV91bmNoYW5nZWQpCisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9WQUxJRCk7Cit9CisKK3N0YXRpYyBpbnQgY2VfY29tcGFyZV9kYXRhKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbnQgbWF0Y2ggPSAtMTsKKwlpbnQgZmQgPSBvcGVuKGNlLT5uYW1lLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPj0gMCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoIWluZGV4X2ZkKHNoYTEsIGZkLCBzdCwgMCwgT0JKX0JMT0IsIGNlLT5uYW1lKSkKKwkJCW1hdGNoID0gaGFzaGNtcChzaGExLCBjZS0+c2hhMSk7CisJCS8qIGluZGV4X2ZkKCkgY2xvc2VkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYWxyZWFkeSAqLworCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbnQgY2VfY29tcGFyZV9saW5rKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHNpemVfdCBleHBlY3RlZF9zaXplKQoreworCWludCBtYXRjaCA9IC0xOworCWNoYXIgKnRhcmdldDsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlpbnQgbGVuOworCisJdGFyZ2V0ID0geG1hbGxvYyhleHBlY3RlZF9zaXplKTsKKwlsZW4gPSByZWFkbGluayhjZS0+bmFtZSwgdGFyZ2V0LCBleHBlY3RlZF9zaXplKTsKKwlpZiAobGVuICE9IGV4cGVjdGVkX3NpemUpIHsKKwkJZnJlZSh0YXJnZXQpOworCQlyZXR1cm4gLTE7CisJfQorCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGNlLT5zaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghYnVmZmVyKSB7CisJCWZyZWUodGFyZ2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2l6ZSA9PSBleHBlY3RlZF9zaXplKQorCQltYXRjaCA9IG1lbWNtcChidWZmZXIsIHRhcmdldCwgc2l6ZSk7CisJZnJlZShidWZmZXIpOworCWZyZWUodGFyZ2V0KTsKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbnQgY2VfY29tcGFyZV9naXRsaW5rKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCS8qCisJICogV2UgZG9uJ3QgYWN0dWFsbHkgcmVxdWlyZSB0aGF0IHRoZSAuZ2l0IGRpcmVjdG9yeQorCSAqIHVuZGVyIERJUkxOSyBkaXJlY3RvcnkgYmUgYSB2YWxpZCBnaXQgZGlyZWN0b3J5LiBJdAorCSAqIG1pZ2h0IGV2ZW4gYmUgbWlzc2luZyAoaW4gY2FzZSBub2JvZHkgcG9wdWxhdGVkIHRoYXQKKwkgKiBzdWItcHJvamVjdCkuCisJICoKKwkgKiBJZiBzbywgd2UgY29uc2lkZXIgaXQgYWx3YXlzIHRvIG1hdGNoLgorCSAqLworCWlmIChyZXNvbHZlX2dpdGxpbmtfcmVmKGNlLT5uYW1lLCAiSEVBRCIsIHNoYTEpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGhhc2hjbXAoc2hhMSwgY2UtPnNoYTEpOworfQorCitzdGF0aWMgaW50IGNlX21vZGlmaWVkX2NoZWNrX2ZzKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlpZiAoY2VfY29tcGFyZV9kYXRhKGNlLCBzdCkpCisJCQlyZXR1cm4gREFUQV9DSEFOR0VEOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWlmIChjZV9jb21wYXJlX2xpbmsoY2UsIHhzaXplX3Qoc3QtPnN0X3NpemUpKSkKKwkJCXJldHVybiBEQVRBX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUjoKKwkJaWYgKFNfSVNESVJMTksobnRvaGwoY2UtPmNlX21vZGUpKSkKKwkJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiBUWVBFX0NIQU5HRUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX21hdGNoX3N0YXRfYmFzaWMoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCXVuc2lnbmVkIGludCBjaGFuZ2VkID0gMDsKKworCXN3aXRjaCAobnRvaGwoY2UtPmNlX21vZGUpICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQljaGFuZ2VkIHw9ICFTX0lTUkVHKHN0LT5zdF9tb2RlKSA/IFRZUEVfQ0hBTkdFRCA6IDA7CisJCS8qIFdlIGNvbnNpZGVyIG9ubHkgdGhlIG93bmVyIHggYml0IHRvIGJlIHJlbGV2YW50IGZvcgorCQkgKiAibW9kZSBjaGFuZ2VzIgorCQkgKi8KKwkJaWYgKHRydXN0X2V4ZWN1dGFibGVfYml0ICYmCisJCSAgICAoMDEwMCAmIChudG9obChjZS0+Y2VfbW9kZSkgXiBzdC0+c3RfbW9kZSkpKQorCQkJY2hhbmdlZCB8PSBNT0RFX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJaWYgKCFTX0lTTE5LKHN0LT5zdF9tb2RlKSAmJgorCQkgICAgKGhhc19zeW1saW5rcyB8fCAhU19JU1JFRyhzdC0+c3RfbW9kZSkpKQorCQkJY2hhbmdlZCB8PSBUWVBFX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUkxOSzoKKwkJaWYgKCFTX0lTRElSKHN0LT5zdF9tb2RlKSkKKwkJCWNoYW5nZWQgfD0gVFlQRV9DSEFOR0VEOworCQllbHNlIGlmIChjZV9jb21wYXJlX2dpdGxpbmsoY2UpKQorCQkJY2hhbmdlZCB8PSBEQVRBX0NIQU5HRUQ7CisJCXJldHVybiBjaGFuZ2VkOworCWRlZmF1bHQ6CisJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGNlX21vZGUgaXMgJW8iLCBudG9obChjZS0+Y2VfbW9kZSkpOworCX0KKwlpZiAoY2UtPmNlX210aW1lLnNlYyAhPSBodG9ubChzdC0+c3RfbXRpbWUpKQorCQljaGFuZ2VkIHw9IE1USU1FX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9jdGltZS5zZWMgIT0gaHRvbmwoc3QtPnN0X2N0aW1lKSkKKwkJY2hhbmdlZCB8PSBDVElNRV9DSEFOR0VEOworCisjaWZkZWYgVVNFX05TRUMKKwkvKgorCSAqIG5zZWMgc2VlbXMgdW5yZWxpYWJsZSAtIG5vdCBhbGwgZmlsZXN5c3RlbXMgc3VwcG9ydCBpdCwgc28KKwkgKiBhcyBsb25nIGFzIGl0IGlzIGluIHRoZSBpbm9kZSBjYWNoZSB5b3UgZ2V0IHJpZ2h0IG5zZWMKKwkgKiBidXQgYWZ0ZXIgaXQgZ2V0cyBmbHVzaGVkLCB5b3UgZ2V0IHplcm8gbnNlYy4KKwkgKi8KKwlpZiAoY2UtPmNlX210aW1lLm5zZWMgIT0gaHRvbmwoc3QtPnN0X210aW0udHZfbnNlYykpCisJCWNoYW5nZWQgfD0gTVRJTUVfQ0hBTkdFRDsKKwlpZiAoY2UtPmNlX2N0aW1lLm5zZWMgIT0gaHRvbmwoc3QtPnN0X2N0aW0udHZfbnNlYykpCisJCWNoYW5nZWQgfD0gQ1RJTUVfQ0hBTkdFRDsKKyNlbmRpZgkKKworCWlmIChjZS0+Y2VfdWlkICE9IGh0b25sKHN0LT5zdF91aWQpIHx8CisJICAgIGNlLT5jZV9naWQgIT0gaHRvbmwoc3QtPnN0X2dpZCkpCisJCWNoYW5nZWQgfD0gT1dORVJfQ0hBTkdFRDsKKwlpZiAoY2UtPmNlX2lubyAhPSBodG9ubChzdC0+c3RfaW5vKSkKKwkJY2hhbmdlZCB8PSBJTk9ERV9DSEFOR0VEOworCisjaWZkZWYgVVNFX1NUREVWCisJLyoKKwkgKiBzdF9kZXYgYnJlYWtzIG9uIG5ldHdvcmsgZmlsZXN5c3RlbXMgd2hlcmUgZGlmZmVyZW50CisJICogY2xpZW50cyB3aWxsIGhhdmUgZGlmZmVyZW50IHZpZXdzIG9mIHdoYXQgImRldmljZSIKKwkgKiB0aGUgZmlsZXN5c3RlbSBpcyBvbgorCSAqLworCWlmIChjZS0+Y2VfZGV2ICE9IGh0b25sKHN0LT5zdF9kZXYpKQorCQljaGFuZ2VkIHw9IElOT0RFX0NIQU5HRUQ7CisjZW5kaWYKKworCWlmIChjZS0+Y2Vfc2l6ZSAhPSBodG9ubChzdC0+c3Rfc2l6ZSkpCisJCWNoYW5nZWQgfD0gREFUQV9DSEFOR0VEOworCisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK2ludCBpZV9tYXRjaF9zdGF0KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkgIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgaW50IG9wdGlvbnMpCit7CisJdW5zaWduZWQgaW50IGNoYW5nZWQ7CisJaW50IGlnbm9yZV92YWxpZCA9IG9wdGlvbnMgJiAwMTsKKwlpbnQgYXNzdW1lX3JhY3lfaXNfbW9kaWZpZWQgPSBvcHRpb25zICYgMDI7CisKKwkvKgorCSAqIElmIGl0J3MgbWFya2VkIGFzIGFsd2F5cyB2YWxpZCBpbiB0aGUgaW5kZXgsIGl0J3MKKwkgKiB2YWxpZCB3aGF0ZXZlciB0aGUgY2hlY2tlZC1vdXQgY29weSBzYXlzLgorCSAqLworCWlmICghaWdub3JlX3ZhbGlkICYmIChjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQlyZXR1cm4gMDsKKworCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0X2Jhc2ljKGNlLCBzdCk7CisKKwkvKgorCSAqIFdpdGhpbiAxIHNlY29uZCBvZiB0aGlzIHNlcXVlbmNlOgorCSAqIAllY2hvIHh5enp5ID5maWxlICYmIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZQorCSAqIHJ1bm5pbmcgdGhpcyBjb21tYW5kOgorCSAqIAllY2hvIGZyb3R6ID5maWxlCisJICogd291bGQgZ2l2ZSBhIGZhbHNlbHkgY2xlYW4gY2FjaGUgZW50cnkuICBUaGUgbXRpbWUgYW5kCisJICogbGVuZ3RoIG1hdGNoIHRoZSBjYWNoZSwgYW5kIG90aGVyIHN0YXQgZmllbGRzIGRvIG5vdCBjaGFuZ2UuCisJICoKKwkgKiBXZSBjb3VsZCBkZXRlY3QgdGhpcyBhdCB1cGRhdGUtaW5kZXggdGltZSAodGhlIGNhY2hlIGVudHJ5CisJICogYmVpbmcgcmVnaXN0ZXJlZC91cGRhdGVkIHJlY29yZHMgdGhlIHNhbWUgdGltZSBhcyAibm93IikKKwkgKiBhbmQgZGVsYXkgdGhlIHJldHVybiBmcm9tIGdpdC11cGRhdGUtaW5kZXgsIGJ1dCB0aGF0IHdvdWxkCisJICogZWZmZWN0aXZlbHkgbWVhbiB3ZSBjYW4gbWFrZSBhdCBtb3N0IG9uZSBjb21taXQgcGVyIHNlY29uZCwKKwkgKiB3aGljaCBpcyBub3QgYWNjZXB0YWJsZS4gIEluc3RlYWQsIHdlIGNoZWNrIGNhY2hlIGVudHJpZXMKKwkgKiB3aG9zZSBtdGltZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGluZGV4IGZpbGUgdGltZXN0YW1wIG1vcmUKKwkgKiBjYXJlZnVsbHkgdGhhbiBvdGhlcnMuCisJICovCisJaWYgKCFjaGFuZ2VkICYmCisJICAgIGlzdGF0ZS0+dGltZXN0YW1wICYmCisJICAgIGlzdGF0ZS0+dGltZXN0YW1wIDw9IG50b2hsKGNlLT5jZV9tdGltZS5zZWMpKSB7CisJCWlmIChhc3N1bWVfcmFjeV9pc19tb2RpZmllZCkKKwkJCWNoYW5nZWQgfD0gREFUQV9DSEFOR0VEOworCQllbHNlCisJCQljaGFuZ2VkIHw9IGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCBzdCk7CisJfQorCisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK2ludCBpZV9tb2RpZmllZChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0LCBpbnQgcmVhbGx5KQoreworCWludCBjaGFuZ2VkLCBjaGFuZ2VkX2ZzOworCWNoYW5nZWQgPSBpZV9tYXRjaF9zdGF0KGlzdGF0ZSwgY2UsIHN0LCByZWFsbHkpOworCWlmICghY2hhbmdlZCkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiB0aGUgbW9kZSBvciB0eXBlIGhhcyBjaGFuZ2VkLCB0aGVyZSdzIG5vIHBvaW50IGluIHRyeWluZworCSAqIHRvIHJlZnJlc2ggdGhlIGVudHJ5IC0gaXQncyBub3QgZ29pbmcgdG8gbWF0Y2gKKwkgKi8KKwlpZiAoY2hhbmdlZCAmIChNT0RFX0NIQU5HRUQgfCBUWVBFX0NIQU5HRUQpKQorCQlyZXR1cm4gY2hhbmdlZDsKKworCS8qIEltbWVkaWF0ZWx5IGFmdGVyIHJlYWQtdHJlZSBvciB1cGRhdGUtaW5kZXggLS1jYWNoZWluZm8sCisJICogdGhlIGxlbmd0aCBmaWVsZCBpcyB6ZXJvLiAgRm9yIG90aGVyIGNhc2VzIHRoZSBjZV9zaXplCisJICogc2hvdWxkIG1hdGNoIHRoZSBTSEExIHJlY29yZGVkIGluIHRoZSBpbmRleCBlbnRyeS4KKwkgKi8KKwlpZiAoKGNoYW5nZWQgJiBEQVRBX0NIQU5HRUQpICYmIGNlLT5jZV9zaXplICE9IGh0b25sKDApKQorCQlyZXR1cm4gY2hhbmdlZDsKKworCWNoYW5nZWRfZnMgPSBjZV9tb2RpZmllZF9jaGVja19mcyhjZSwgc3QpOworCWlmIChjaGFuZ2VkX2ZzKQorCQlyZXR1cm4gY2hhbmdlZCB8IGNoYW5nZWRfZnM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBiYXNlX25hbWVfY29tcGFyZShjb25zdCBjaGFyICpuYW1lMSwgaW50IGxlbjEsIGludCBtb2RlMSwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZTIsIGludCBsZW4yLCBpbnQgbW9kZTIpCit7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisJaW50IGNtcDsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCkKKwkJcmV0dXJuIGNtcDsKKwljMSA9IG5hbWUxW2xlbl07CisJYzIgPSBuYW1lMltsZW5dOworCWlmICghYzEgJiYgU19JU0RJUihtb2RlMSkpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgU19JU0RJUihtb2RlMikpCisJCWMyID0gJy8nOworCXJldHVybiAoYzEgPCBjMikgPyAtMSA6IChjMSA+IGMyKSA/IDEgOiAwOworfQorCitpbnQgY2FjaGVfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgZmxhZ3MxLCBjb25zdCBjaGFyICpuYW1lMiwgaW50IGZsYWdzMikKK3sKKwlpbnQgbGVuMSA9IGZsYWdzMSAmIENFX05BTUVNQVNLOworCWludCBsZW4yID0gZmxhZ3MyICYgQ0VfTkFNRU1BU0s7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisJaW50IGNtcDsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCkKKwkJcmV0dXJuIGNtcDsKKwlpZiAobGVuMSA8IGxlbjIpCisJCXJldHVybiAtMTsKKwlpZiAobGVuMSA+IGxlbjIpCisJCXJldHVybiAxOworCisJLyogQ29tcGFyZSBzdGFnZXMgICovCisJZmxhZ3MxICY9IENFX1NUQUdFTUFTSzsKKwlmbGFnczIgJj0gQ0VfU1RBR0VNQVNLOworCisJaWYgKGZsYWdzMSA8IGZsYWdzMikKKwkJcmV0dXJuIC0xOworCWlmIChmbGFnczEgPiBmbGFnczIpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgaW5kZXhfbmFtZV9wb3Moc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWludCBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gMDsKKwlsYXN0ID0gaXN0YXRlLT5jYWNoZV9ucjsKKwl3aGlsZSAobGFzdCA+IGZpcnN0KSB7CisJCWludCBuZXh0ID0gKGxhc3QgKyBmaXJzdCkgPj4gMTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGlzdGF0ZS0+Y2FjaGVbbmV4dF07CisJCWludCBjbXAgPSBjYWNoZV9uYW1lX2NvbXBhcmUobmFtZSwgbmFtZWxlbiwgY2UtPm5hbWUsIG50b2hzKGNlLT5jZV9mbGFncykpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBuZXh0OworCQlpZiAoY21wIDwgMCkgeworCQkJbGFzdCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlmaXJzdCA9IG5leHQrMTsKKwl9CisJcmV0dXJuIC1maXJzdC0xOworfQorCisvKiBSZW1vdmUgZW50cnksIHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIGVudHJpZXMgdG8gZ28uLiAqLworaW50IHJlbW92ZV9pbmRleF9lbnRyeV9hdChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgaW50IHBvcykKK3sKKwlpc3RhdGUtPmNhY2hlX2NoYW5nZWQgPSAxOworCWlzdGF0ZS0+Y2FjaGVfbnItLTsKKwlpZiAocG9zID49IGlzdGF0ZS0+Y2FjaGVfbnIpCisJCXJldHVybiAwOworCW1lbW1vdmUoaXN0YXRlLT5jYWNoZSArIHBvcywKKwkJaXN0YXRlLT5jYWNoZSArIHBvcyArIDEsCisJCShpc3RhdGUtPmNhY2hlX25yIC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCXJldHVybiAxOworfQorCitpbnQgcmVtb3ZlX2ZpbGVfZnJvbV9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcG9zID0gaW5kZXhfbmFtZV9wb3MoaXN0YXRlLCBwYXRoLCBzdHJsZW4ocGF0aCkpOworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zLTE7CisJd2hpbGUgKHBvcyA8IGlzdGF0ZS0+Y2FjaGVfbnIgJiYgIXN0cmNtcChpc3RhdGUtPmNhY2hlW3Bvc10tPm5hbWUsIHBhdGgpKQorCQlyZW1vdmVfaW5kZXhfZW50cnlfYXQoaXN0YXRlLCBwb3MpOworCXJldHVybiAwOworfQorCitpbnQgYWRkX2ZpbGVfdG9faW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKnBhdGgsIGludCB2ZXJib3NlKQoreworCWludCBzaXplLCBuYW1lbGVuOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSkKKwkJZGllKCIlczogdW5hYmxlIHRvIHN0YXQgKCVzKSIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisKKwlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgIVNfSVNMTksoc3Quc3RfbW9kZSkgJiYgIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCWRpZSgiJXM6IGNhbiBvbmx5IGFkZCByZWd1bGFyIGZpbGVzLCBzeW1ib2xpYyBsaW5rcyBvciBnaXQtZGlyZWN0b3JpZXMiLCBwYXRoKTsKKworCW5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJd2hpbGUgKG5hbWVsZW4gJiYgcGF0aFtuYW1lbGVuLTFdID09ICcvJykKKwkJCW5hbWVsZW4tLTsKKwl9CisJc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobmFtZWxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gaHRvbnMobmFtZWxlbik7CisJZmlsbF9zdGF0X2NhY2hlX2luZm8oY2UsICZzdCk7CisKKwlpZiAodHJ1c3RfZXhlY3V0YWJsZV9iaXQgJiYgaGFzX3N5bWxpbmtzKQorCQljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHN0LnN0X21vZGUpOworCWVsc2UgeworCQkvKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSwgcGljayB0aGUgbW9kZSBiaXRzIGFuZCB0eXBlCisJCSAqIGZyb20gaXQsIG90aGVyd2lzZSBhc3N1bWUgdW5leGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KKwkJICovCisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqZW50OworCQlpbnQgcG9zID0gaW5kZXhfbmFtZV9wb3MoaXN0YXRlLCBwYXRoLCBuYW1lbGVuKTsKKworCQllbnQgPSAoMCA8PSBwb3MpID8gaXN0YXRlLT5jYWNoZVtwb3NdIDogTlVMTDsKKwkJY2UtPmNlX21vZGUgPSBjZV9tb2RlX2Zyb21fc3RhdChlbnQsIHN0LnN0X21vZGUpOworCX0KKworCWlmIChpbmRleF9wYXRoKGNlLT5zaGExLCBwYXRoLCAmc3QsIDEpKQorCQlkaWUoInVuYWJsZSB0byBpbmRleCBmaWxlICVzIiwgcGF0aCk7CisJaWYgKGFkZF9pbmRleF9lbnRyeShpc3RhdGUsIGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREfEFERF9DQUNIRV9PS19UT19SRVBMQUNFKSkKKwkJZGllKCJ1bmFibGUgdG8gYWRkICVzIHRvIGluZGV4IixwYXRoKTsKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJhZGQgJyVzJ1xuIiwgcGF0aCk7CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoaXN0YXRlLT5jYWNoZV90cmVlLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYikKK3sKKwlpbnQgbGVuID0gY2VfbmFtZWxlbihhKTsKKwlyZXR1cm4gY2VfbmFtZWxlbihiKSA9PSBsZW4gJiYgIW1lbWNtcChhLT5uYW1lLCBiLT5uYW1lLCBsZW4pOworfQorCitpbnQgY2VfcGF0aF9tYXRjaChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqbWF0Y2gsICpuYW1lOworCWludCBsZW47CisKKwlpZiAoIXBhdGhzcGVjKQorCQlyZXR1cm4gMTsKKworCWxlbiA9IGNlX25hbWVsZW4oY2UpOworCW5hbWUgPSBjZS0+bmFtZTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzcGVjKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwkJaWYgKG1hdGNobGVuID4gbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAobmFtZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF0Y2hsZW4gJiYgbmFtZVttYXRjaGxlbi0xXSA9PSAnLycpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5hbWVbbWF0Y2hsZW5dID09ICcvJyB8fCAhbmFtZVttYXRjaGxlbl0pCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFtYXRjaGxlbikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGZ1bmRhbWVudGFsbHkgZG9uJ3QgbGlrZSBzb21lIHBhdGhzOiB3ZSBkb24ndCB3YW50CisgKiBkb3Qgb3IgZG90LWRvdCBhbnl3aGVyZSwgYW5kIGZvciBvYnZpb3VzIHJlYXNvbnMgZG9uJ3QKKyAqIHdhbnQgdG8gcmVjdXJzZSBpbnRvICIuZ2l0IiBlaXRoZXIuCisgKgorICogQWxzbywgd2UgZG9uJ3Qgd2FudCBkb3VibGUgc2xhc2hlcyBvciBzbGFzaGVzIGF0IHRoZQorICogZW5kIHRoYXQgY2FuIG1ha2UgcGF0aG5hbWVzIGFtYmlndW91cy4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfZG90ZmlsZShjb25zdCBjaGFyICpyZXN0KQoreworCS8qCisJICogVGhlIGZpcnN0IGNoYXJhY3RlciB3YXMgJy4nLCBidXQgdGhhdAorCSAqIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkLCB3ZSBub3cgdGVzdAorCSAqIHRoZSByZXN0LgorCSAqLworCXN3aXRjaCAoKnJlc3QpIHsKKwkvKiAiLiIgaXMgbm90IGFsbG93ZWQgKi8KKwljYXNlICdcMCc6IGNhc2UgJy8nOgorCQlyZXR1cm4gMDsKKworCS8qCisJICogIi5naXQiIGZvbGxvd2VkIGJ5ICBOVUwgb3Igc2xhc2ggaXMgYmFkLiBUaGlzCisJICogc2hhcmVzIHRoZSBwYXRoIGVuZCB0ZXN0IHdpdGggdGhlICIuLiIgY2FzZS4KKwkgKi8KKwljYXNlICdnJzoKKwkJaWYgKHJlc3RbMV0gIT0gJ2knKQorCQkJYnJlYWs7CisJCWlmIChyZXN0WzJdICE9ICd0JykKKwkJCWJyZWFrOworCQlyZXN0ICs9IDI7CisJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlICcuJzoKKwkJaWYgKHJlc3RbMV0gPT0gJ1wwJyB8fCByZXN0WzFdID09ICcvJykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHZlcmlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBjOworCisJZ290byBpbnNpZGU7CisJZm9yICg7OykgeworCQlpZiAoIWMpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGMgPT0gJy8nKSB7CitpbnNpZGU6CisJCQljID0gKnBhdGgrKzsKKwkJCXN3aXRjaCAoYykgeworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJy8nOiBjYXNlICdcMCc6CisJCQkJYnJlYWs7CisJCQljYXNlICcuJzoKKwkJCQlpZiAodmVyaWZ5X2RvdGZpbGUocGF0aCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJYyA9ICpwYXRoKys7CisJfQorfQorCisvKgorICogRG8gd2UgaGF2ZSBhbm90aGVyIGZpbGUgdGhhdCBoYXMgdGhlIGJlZ2lubmluZyBjb21wb25lbnRzIGJlaW5nIGEKKyAqIHByb3BlciBzdXBlcnNldCBvZiB0aGUgbmFtZSB3ZSdyZSB0cnlpbmcgdG8gYWRkPworICovCitzdGF0aWMgaW50IGhhc19maWxlX25hbWUoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJCQkgY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGxlbiA9IGNlX25hbWVsZW4oY2UpOworCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKwljb25zdCBjaGFyICpuYW1lID0gY2UtPm5hbWU7CisKKwl3aGlsZSAocG9zIDwgaXN0YXRlLT5jYWNoZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKnAgPSBpc3RhdGUtPmNhY2hlW3BvcysrXTsKKworCQlpZiAobGVuID49IGNlX25hbWVsZW4ocCkpCisJCQlicmVhazsKKwkJaWYgKG1lbWNtcChuYW1lLCBwLT5uYW1lLCBsZW4pKQorCQkJYnJlYWs7CisJCWlmIChjZV9zdGFnZShwKSAhPSBzdGFnZSkKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+bmFtZVtsZW5dICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNlX3N0YWdlKHApICYmICFwLT5jZV9tb2RlKQorCQkJY29udGludWU7CisJCXJldHZhbCA9IC0xOworCQlpZiAoIW9rX3RvX3JlcGxhY2UpCisJCQlicmVhazsKKwkJcmVtb3ZlX2luZGV4X2VudHJ5X2F0KGlzdGF0ZSwgLS1wb3MpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRG8gd2UgaGF2ZSBhbm90aGVyIGZpbGUgd2l0aCBhIHBhdGhuYW1lIHRoYXQgaXMgYSBwcm9wZXIKKyAqIHN1YnNldCBvZiB0aGUgbmFtZSB3ZSdyZSB0cnlpbmcgdG8gYWRkPworICovCitzdGF0aWMgaW50IGhhc19kaXJfbmFtZShzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwKKwkJCWNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGludCBwb3MsIGludCBva190b19yZXBsYWNlKQoreworCWludCByZXR2YWwgPSAwOworCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKwljb25zdCBjaGFyICpuYW1lID0gY2UtPm5hbWU7CisJY29uc3QgY2hhciAqc2xhc2ggPSBuYW1lICsgY2VfbmFtZWxlbihjZSk7CisKKwlmb3IgKDs7KSB7CisJCWludCBsZW47CisKKwkJZm9yICg7OykgeworCQkJaWYgKCotLXNsYXNoID09ICcvJykKKwkJCQlicmVhazsKKwkJCWlmIChzbGFzaCA8PSBjZS0+bmFtZSkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWxlbiA9IHNsYXNoIC0gbmFtZTsKKworCQlwb3MgPSBpbmRleF9uYW1lX3Bvcyhpc3RhdGUsIG5hbWUsIG50b2hzKGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKSkpOworCQlpZiAocG9zID49IDApIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBvbmUsIGJ1dCBub3Qgc28gZmFzdC4gIFRoaXMgY291bGQKKwkJCSAqIGJlIGEgbWFya2VyIHRoYXQgc2F5cyAiSSB3YXMgaGVyZSwgYnV0CisJCQkgKiBJIGFtIGJlaW5nIHJlbW92ZWQiLiAgU3VjaCBhbiBlbnRyeSBpcworCQkJICogbm90IGEgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHRyZWUsIGFuZAorCQkJICogaXQgaXMgT2sgdG8gaGF2ZSBhIGRpcmVjdG9yeSBhdCB0aGUgc2FtZQorCQkJICogcGF0aC4KKwkJCSAqLworCQkJaWYgKHN0YWdlIHx8IGlzdGF0ZS0+Y2FjaGVbcG9zXS0+Y2VfbW9kZSkgeworCQkJCXJldHZhbCA9IC0xOworCQkJCWlmICghb2tfdG9fcmVwbGFjZSkKKwkJCQkJYnJlYWs7CisJCQkJcmVtb3ZlX2luZGV4X2VudHJ5X2F0KGlzdGF0ZSwgcG9zKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlwb3MgPSAtcG9zLTE7CisKKwkJLyoKKwkJICogVHJpdmlhbCBvcHRpbWl6YXRpb246IGlmIHdlIGZpbmQgYW4gZW50cnkgdGhhdAorCQkgKiBhbHJlYWR5IG1hdGNoZXMgdGhlIHN1Yi1kaXJlY3RvcnksIHRoZW4gd2Uga25vdworCQkgKiB3ZSdyZSBvaywgYW5kIHdlIGNhbiBleGl0LgorCQkgKi8KKwkJd2hpbGUgKHBvcyA8IGlzdGF0ZS0+Y2FjaGVfbnIpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqcCA9IGlzdGF0ZS0+Y2FjaGVbcG9zXTsKKwkJCWlmICgoY2VfbmFtZWxlbihwKSA8PSBsZW4pIHx8CisJCQkgICAgKHAtPm5hbWVbbGVuXSAhPSAnLycpIHx8CisJCQkgICAgbWVtY21wKHAtPm5hbWUsIG5hbWUsIGxlbikpCisJCQkJYnJlYWs7IC8qIG5vdCBvdXIgc3ViZGlyZWN0b3J5ICovCisJCQlpZiAoY2Vfc3RhZ2UocCkgPT0gc3RhZ2UgJiYgKHN0YWdlIHx8IHAtPmNlX21vZGUpKQorCQkJCS8qIHAgaXMgYXQgdGhlIHNhbWUgc3RhZ2UgYXMgb3VyIGVudHJ5LCBhbmQKKwkJCQkgKiBpcyBhIHN1YmRpcmVjdG9yeSBvZiB3aGF0IHdlIGFyZSBsb29raW5nCisJCQkJICogYXQsIHNvIHdlIGNhbm5vdCBoYXZlIGNvbmZsaWN0cyBhdCBvdXIKKwkJCQkgKiBsZXZlbCBvciBhbnl0aGluZyBzaG9ydGVyLgorCQkJCSAqLworCQkJCXJldHVybiByZXR2YWw7CisJCQlwb3MrKzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBXZSBtYXkgYmUgaW4gYSBzaXR1YXRpb24gd2hlcmUgd2UgYWxyZWFkeSBoYXZlIHBhdGgvZmlsZSBhbmQgcGF0aAorICogaXMgYmVpbmcgYWRkZWQsIG9yIHdlIGFscmVhZHkgaGF2ZSBwYXRoIGFuZCBwYXRoL2ZpbGUgaXMgYmVpbmcKKyAqIGFkZGVkLiAgRWl0aGVyIG9uZSB3b3VsZCByZXN1bHQgaW4gYSBub25zZW5zZSB0cmVlIHRoYXQgaGFzIHBhdGgKKyAqIHR3aWNlIHdoZW4gZ2l0LXdyaXRlLXRyZWUgdHJpZXMgdG8gd3JpdGUgaXQgb3V0LiAgUHJldmVudCBpdC4KKyAqIAorICogSWYgb2stdG8tcmVwbGFjZSBpcyBzcGVjaWZpZWQsIHdlIHJlbW92ZSB0aGUgY29uZmxpY3RpbmcgZW50cmllcworICogZnJvbSB0aGUgY2FjaGUgc28gdGhlIGNhbGxlciBzaG91bGQgcmVjb21wdXRlIHRoZSBpbnNlcnQgcG9zaXRpb24uCisgKiBXaGVuIHRoaXMgaGFwcGVucywgd2UgcmV0dXJuIG5vbi16ZXJvLgorICovCitzdGF0aWMgaW50IGNoZWNrX2ZpbGVfZGlyZWN0b3J5X2NvbmZsaWN0KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkJCQkgY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJCQkJIGludCBwb3MsIGludCBva190b19yZXBsYWNlKQoreworCWludCByZXR2YWw7CisKKwkvKgorCSAqIFdoZW4gY2UgaXMgYW4gIkkgYW0gZ29pbmcgYXdheSIgZW50cnksIHdlIGFsbG93IGl0IHRvIGJlIGFkZGVkCisJICovCisJaWYgKCFjZV9zdGFnZShjZSkgJiYgIWNlLT5jZV9tb2RlKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgY2hlY2sgaWYgdGhlIHBhdGggaXMgYSBzdWItcGF0aCBvZiBhIHN1YnNlcXVlbnQgcGF0aG5hbWUKKwkgKiBmaXJzdCwgc2luY2UgcmVtb3ZpbmcgdGhvc2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbgorCSAqIGluIHRoZSBhcnJheS4KKwkgKi8KKwlyZXR2YWwgPSBoYXNfZmlsZV9uYW1lKGlzdGF0ZSwgY2UsIHBvcywgb2tfdG9fcmVwbGFjZSk7CisKKwkvKgorCSAqIFRoZW4gY2hlY2sgaWYgdGhlIHBhdGggbWlnaHQgaGF2ZSBhIGNsYXNoaW5nIHN1Yi1kaXJlY3RvcnkKKwkgKiBiZWZvcmUgaXQuCisJICovCisJcmV0dXJuIHJldHZhbCArIGhhc19kaXJfbmFtZShpc3RhdGUsIGNlLCBwb3MsIG9rX3RvX3JlcGxhY2UpOworfQorCitpbnQgYWRkX2luZGV4X2VudHJ5KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgb3B0aW9uKQoreworCWludCBwb3M7CisJaW50IG9rX3RvX2FkZCA9IG9wdGlvbiAmIEFERF9DQUNIRV9PS19UT19BREQ7CisJaW50IG9rX3RvX3JlcGxhY2UgPSBvcHRpb24gJiBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRTsKKwlpbnQgc2tpcF9kZl9jaGVjayA9IG9wdGlvbiAmIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0s7CisKKwlwb3MgPSBpbmRleF9uYW1lX3Bvcyhpc3RhdGUsIGNlLT5uYW1lLCBudG9ocyhjZS0+Y2VfZmxhZ3MpKTsKKworCS8qIGV4aXN0aW5nIG1hdGNoPyBKdXN0IHJlcGxhY2UgaXQuICovCisJaWYgKHBvcyA+PSAwKSB7CisJCWlzdGF0ZS0+Y2FjaGVfY2hhbmdlZCA9IDE7CisJCWlzdGF0ZS0+Y2FjaGVbcG9zXSA9IGNlOworCQlyZXR1cm4gMDsKKwl9CisJcG9zID0gLXBvcy0xOworCisJLyoKKwkgKiBJbnNlcnRpbmcgYSBtZXJnZWQgZW50cnkgKCJzdGFnZSAwIikgaW50byB0aGUgaW5kZXgKKwkgKiB3aWxsIGFsd2F5cyByZXBsYWNlIGFsbCBub24tbWVyZ2VkIGVudHJpZXMuLgorCSAqLworCWlmIChwb3MgPCBpc3RhdGUtPmNhY2hlX25yICYmIGNlX3N0YWdlKGNlKSA9PSAwKSB7CisJCXdoaWxlIChjZV9zYW1lX25hbWUoaXN0YXRlLT5jYWNoZVtwb3NdLCBjZSkpIHsKKwkJCW9rX3RvX2FkZCA9IDE7CisJCQlpZiAoIXJlbW92ZV9pbmRleF9lbnRyeV9hdChpc3RhdGUsIHBvcykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIW9rX3RvX2FkZCkKKwkJcmV0dXJuIC0xOworCWlmICghdmVyaWZ5X3BhdGgoY2UtPm5hbWUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXNraXBfZGZfY2hlY2sgJiYKKwkgICAgY2hlY2tfZmlsZV9kaXJlY3RvcnlfY29uZmxpY3QoaXN0YXRlLCBjZSwgcG9zLCBva190b19yZXBsYWNlKSkgeworCQlpZiAoIW9rX3RvX3JlcGxhY2UpCisJCQlyZXR1cm4gZXJyb3IoIiclcycgYXBwZWFycyBhcyBib3RoIGEgZmlsZSBhbmQgYXMgYSBkaXJlY3RvcnkiLAorCQkJCSAgICAgY2UtPm5hbWUpOworCQlwb3MgPSBpbmRleF9uYW1lX3Bvcyhpc3RhdGUsIGNlLT5uYW1lLCBudG9ocyhjZS0+Y2VfZmxhZ3MpKTsKKwkJcG9zID0gLXBvcy0xOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgYmlnIGVub3VnaCAuLiAqLworCWlmIChpc3RhdGUtPmNhY2hlX25yID09IGlzdGF0ZS0+Y2FjaGVfYWxsb2MpIHsKKwkJaXN0YXRlLT5jYWNoZV9hbGxvYyA9IGFsbG9jX25yKGlzdGF0ZS0+Y2FjaGVfYWxsb2MpOworCQlpc3RhdGUtPmNhY2hlID0geHJlYWxsb2MoaXN0YXRlLT5jYWNoZSwKKwkJCQkJaXN0YXRlLT5jYWNoZV9hbGxvYyAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCX0KKworCS8qIEFkZCBpdCBpbi4uICovCisJaXN0YXRlLT5jYWNoZV9ucisrOworCWlmIChpc3RhdGUtPmNhY2hlX25yID4gcG9zKQorCQltZW1tb3ZlKGlzdGF0ZS0+Y2FjaGUgKyBwb3MgKyAxLAorCQkJaXN0YXRlLT5jYWNoZSArIHBvcywKKwkJCShpc3RhdGUtPmNhY2hlX25yIC0gcG9zIC0gMSkgKiBzaXplb2YoY2UpKTsKKwlpc3RhdGUtPmNhY2hlW3Bvc10gPSBjZTsKKwlpc3RhdGUtPmNhY2hlX2NoYW5nZWQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogInJlZnJlc2giIGRvZXMgbm90IGNhbGN1bGF0ZSBhIG5ldyBzaGExIGZpbGUgb3IgYnJpbmcgdGhlCisgKiBjYWNoZSB1cC10by1kYXRlIGZvciBtb2RlL2NvbnRlbnQgY2hhbmdlcy4gQnV0IHdoYXQgaXQKKyAqIF9kb2VzXyBkbyBpcyB0byAicmUtbWF0Y2giIHRoZSBzdGF0IGluZm9ybWF0aW9uIG9mIGEgZmlsZQorICogd2l0aCB0aGUgY2FjaGUsIHNvIHRoYXQgeW91IGNhbiByZWZyZXNoIHRoZSBjYWNoZSBmb3IgYQorICogZmlsZSB0aGF0IGhhc24ndCBiZWVuIGNoYW5nZWQgYnV0IHdoZXJlIHRoZSBzdGF0IGVudHJ5IGlzCisgKiBvdXQgb2YgZGF0ZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgeW91J2Qgd2FudCB0byBkbyB0aGlzIGFmdGVyIGRvaW5nIGEgImdpdC1yZWFkLXRyZWUiLAorICogdG8gbGluayB1cCB0aGUgc3RhdCBjYWNoZSBkZXRhaWxzIHdpdGggdGhlIHByb3BlciBmaWxlcy4KKyAqLworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9jYWNoZV9lbnQoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJCQkJCSAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHJlYWxseSwgaW50ICplcnIpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICp1cGRhdGVkOworCWludCBjaGFuZ2VkLCBzaXplOworCisJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkgeworCQlpZiAoZXJyKQorCQkJKmVyciA9IGVycm5vOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljaGFuZ2VkID0gaWVfbWF0Y2hfc3RhdChpc3RhdGUsIGNlLCAmc3QsIHJlYWxseSk7CisJaWYgKCFjaGFuZ2VkKSB7CisJCWlmIChyZWFsbHkgJiYgYXNzdW1lX3VuY2hhbmdlZCAmJgorCQkgICAgIShjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQkJOyAvKiBtYXJrIHRoaXMgb25lIFZBTElEIGFnYWluICovCisJCWVsc2UKKwkJCXJldHVybiBjZTsKKwl9CisKKwlpZiAoaWVfbW9kaWZpZWQoaXN0YXRlLCBjZSwgJnN0LCByZWFsbHkpKSB7CisJCWlmIChlcnIpCisJCQkqZXJyID0gRUlOVkFMOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaXplID0gY2Vfc2l6ZShjZSk7CisJdXBkYXRlZCA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KHVwZGF0ZWQsIGNlLCBzaXplKTsKKwlmaWxsX3N0YXRfY2FjaGVfaW5mbyh1cGRhdGVkLCAmc3QpOworCisJLyogSW4gdGhpcyBjYXNlLCBpZiByZWFsbHkgaXMgbm90IHNldCwgd2Ugc2hvdWxkIGxlYXZlCisJICogQ0VfVkFMSUQgYml0IGFsb25lLiAgT3RoZXJ3aXNlLCBwYXRocyBtYXJrZWQgd2l0aAorCSAqIC0tbm8tYXNzdW1lLXVuY2hhbmdlZCAoaS5lLiB0aGluZ3MgdG8gYmUgZWRpdGVkKSB3aWxsCisJICogcmVhY3F1aXJlIENFX1ZBTElEIGJpdCBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyBub3QKKwkgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgorCSAqLworCWlmICghcmVhbGx5ICYmIGFzc3VtZV91bmNoYW5nZWQgJiYgIShjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQl1cGRhdGVkLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfVkFMSUQpOworCisJcmV0dXJuIHVwZGF0ZWQ7Cit9CisKK2ludCByZWZyZXNoX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGk7CisJaW50IGhhc19lcnJvcnMgPSAwOworCWludCByZWFsbHkgPSAoZmxhZ3MgJiBSRUZSRVNIX1JFQUxMWSkgIT0gMDsKKwlpbnQgYWxsb3dfdW5tZXJnZWQgPSAoZmxhZ3MgJiBSRUZSRVNIX1VOTUVSR0VEKSAhPSAwOworCWludCBxdWlldCA9IChmbGFncyAmIFJFRlJFU0hfUVVJRVQpICE9IDA7CisJaW50IG5vdF9uZXcgPSAoZmxhZ3MgJiBSRUZSRVNIX0lHTk9SRV9NSVNTSU5HKSAhPSAwOworCisJZm9yIChpID0gMDsgaSA8IGlzdGF0ZS0+Y2FjaGVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCAqbmV3OworCQlpbnQgY2FjaGVfZXJybm8gPSAwOworCisJCWNlID0gaXN0YXRlLT5jYWNoZVtpXTsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJd2hpbGUgKChpIDwgaXN0YXRlLT5jYWNoZV9ucikgJiYKKwkJCSAgICAgICAhIHN0cmNtcChpc3RhdGUtPmNhY2hlW2ldLT5uYW1lLCBjZS0+bmFtZSkpCisJCQkJaSsrOworCQkJaS0tOworCQkJaWYgKGFsbG93X3VubWVyZ2VkKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCIlczogbmVlZHMgbWVyZ2VcbiIsIGNlLT5uYW1lKTsKKwkJCWhhc19lcnJvcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQluZXcgPSByZWZyZXNoX2NhY2hlX2VudChpc3RhdGUsIGNlLCByZWFsbHksICZjYWNoZV9lcnJubyk7CisJCWlmIChuZXcgPT0gY2UpCisJCQljb250aW51ZTsKKwkJaWYgKCFuZXcpIHsKKwkJCWlmIChub3RfbmV3ICYmIGNhY2hlX2Vycm5vID09IEVOT0VOVCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZWFsbHkgJiYgY2FjaGVfZXJybm8gPT0gRUlOVkFMKSB7CisJCQkJLyogSWYgd2UgYXJlIGRvaW5nIC0tcmVhbGx5LXJlZnJlc2ggdGhhdAorCQkJCSAqIG1lYW5zIHRoZSBpbmRleCBpcyBub3QgdmFsaWQgYW55bW9yZS4KKwkJCQkgKi8KKwkJCQljZS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1ZBTElEKTsKKwkJCQlpc3RhdGUtPmNhY2hlX2NoYW5nZWQgPSAxOworCQkJfQorCQkJaWYgKHF1aWV0KQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCIlczogbmVlZHMgdXBkYXRlXG4iLCBjZS0+bmFtZSk7CisJCQloYXNfZXJyb3JzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlzdGF0ZS0+Y2FjaGVfY2hhbmdlZCA9IDE7CisJCS8qIFlvdSBjYW4gTk9UIGp1c3QgZnJlZSBpc3RhdGUtPmNhY2hlW2ldIGhlcmUsIHNpbmNlIGl0CisJCSAqIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcmlseSBtYWxsb2MoKWVkIGJ1dCBjYW4gYWxzbyBjb21lCisJCSAqIGZyb20gbW1hcCgpLiAqLworCQlpc3RhdGUtPmNhY2hlW2ldID0gbmV3OworCX0KKwlyZXR1cm4gaGFzX2Vycm9yczsKK30KKworc3RydWN0IGNhY2hlX2VudHJ5ICpyZWZyZXNoX2NhY2hlX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGludCByZWFsbHkpCit7CisJcmV0dXJuIHJlZnJlc2hfY2FjaGVfZW50KCZ0aGVfaW5kZXgsIGNlLCByZWFsbHksIE5VTEwpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9oZHIoc3RydWN0IGNhY2hlX2hlYWRlciAqaGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJU0hBX0NUWCBjOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKENBQ0hFX1NJR05BVFVSRSkpCisJCXJldHVybiBlcnJvcigiYmFkIHNpZ25hdHVyZSIpOworCWlmIChoZHItPmhkcl92ZXJzaW9uICE9IGh0b25sKDIpKQorCQlyZXR1cm4gZXJyb3IoImJhZCBpbmRleCB2ZXJzaW9uIik7CisJU0hBMV9Jbml0KCZjKTsKKwlTSEExX1VwZGF0ZSgmYywgaGRyLCBzaXplIC0gMjApOworCVNIQTFfRmluYWwoc2hhMSwgJmMpOworCWlmIChoYXNoY21wKHNoYTEsICh1bnNpZ25lZCBjaGFyICopaGRyICsgc2l6ZSAtIDIwKSkKKwkJcmV0dXJuIGVycm9yKCJiYWQgaW5kZXggZmlsZSBzaGExIHNpZ25hdHVyZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaW5kZXhfZXh0ZW5zaW9uKHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkJCWNvbnN0IGNoYXIgKmV4dCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlzd2l0Y2ggKENBQ0hFX0VYVChleHQpKSB7CisJY2FzZSBDQUNIRV9FWFRfVFJFRToKKwkJaXN0YXRlLT5jYWNoZV90cmVlID0gY2FjaGVfdHJlZV9yZWFkKGRhdGEsIHN6KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCpleHQgPCAnQScgfHwgJ1onIDwgKmV4dCkKKwkJCXJldHVybiBlcnJvcigiaW5kZXggdXNlcyAlLjRzIGV4dGVuc2lvbiwgd2hpY2ggd2UgZG8gbm90IHVuZGVyc3RhbmQiLAorCQkJCSAgICAgZXh0KTsKKwkJZnByaW50ZihzdGRlcnIsICJpZ25vcmluZyAlLjRzIGV4dGVuc2lvblxuIiwgZXh0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSkKK3sKKwlyZXR1cm4gcmVhZF9pbmRleF9mcm9tKGlzdGF0ZSwgZ2V0X2luZGV4X2ZpbGUoKSk7Cit9CisKKy8qIHJlbWVtYmVyIHRvIGRpc2NhcmRfY2FjaGUoKSBiZWZvcmUgcmVhZGluZyBhIGRpZmZlcmVudCBjYWNoZSEgKi8KK2ludCByZWFkX2luZGV4X2Zyb20oc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGZkLCBpOworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBjYWNoZV9oZWFkZXIgKmhkcjsKKworCWVycm5vID0gRUJVU1k7CisJaWYgKGlzdGF0ZS0+bW1hcCkKKwkJcmV0dXJuIGlzdGF0ZS0+Y2FjaGVfbnI7CisKKwllcnJubyA9IEVOT0VOVDsKKwlpc3RhdGUtPnRpbWVzdGFtcCA9IDA7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKwkJZGllKCJpbmRleCBmaWxlIG9wZW4gZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCWlmIChmc3RhdChmZCwgJnN0KSkKKwkJZGllKCJjYW5ub3Qgc3RhdCB0aGUgb3BlbiBpbmRleCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWVycm5vID0gRUlOVkFMOworCWlzdGF0ZS0+bW1hcF9zaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwlpZiAoaXN0YXRlLT5tbWFwX3NpemUgPCBzaXplb2Yoc3RydWN0IGNhY2hlX2hlYWRlcikgKyAyMCkKKwkJZGllKCJpbmRleCBmaWxlIHNtYWxsZXIgdGhhbiBleHBlY3RlZCIpOworCisJaXN0YXRlLT5tbWFwID0geG1tYXAoTlVMTCwgaXN0YXRlLT5tbWFwX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCisJaGRyID0gaXN0YXRlLT5tbWFwOworCWlmICh2ZXJpZnlfaGRyKGhkciwgaXN0YXRlLT5tbWFwX3NpemUpIDwgMCkKKwkJZ290byB1bm1hcDsKKworCWlzdGF0ZS0+Y2FjaGVfbnIgPSBudG9obChoZHItPmhkcl9lbnRyaWVzKTsKKwlpc3RhdGUtPmNhY2hlX2FsbG9jID0gYWxsb2NfbnIoaXN0YXRlLT5jYWNoZV9ucik7CisJaXN0YXRlLT5jYWNoZSA9IHhjYWxsb2MoaXN0YXRlLT5jYWNoZV9hbGxvYywgc2l6ZW9mKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSk7CisKKwlvZmZzZXQgPSBzaXplb2YoKmhkcik7CisJZm9yIChpID0gMDsgaSA8IGlzdGF0ZS0+Y2FjaGVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJCWNlID0gKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSgoY2hhciAqKShpc3RhdGUtPm1tYXApICsgb2Zmc2V0KTsKKwkJb2Zmc2V0ID0gb2Zmc2V0ICsgY2Vfc2l6ZShjZSk7CisJCWlzdGF0ZS0+Y2FjaGVbaV0gPSBjZTsKKwl9CisJaXN0YXRlLT50aW1lc3RhbXAgPSBzdC5zdF9tdGltZTsKKwl3aGlsZSAob2Zmc2V0IDw9IGlzdGF0ZS0+bW1hcF9zaXplIC0gMjAgLSA4KSB7CisJCS8qIEFmdGVyIGFuIGFycmF5IG9mIGFjdGl2ZV9uciBpbmRleCBlbnRyaWVzLAorCQkgKiB0aGVyZSBjYW4gYmUgYXJiaXRyYXJ5IG51bWJlciBvZiBleHRlbmRlZAorCQkgKiBzZWN0aW9ucywgZWFjaCBvZiB3aGljaCBpcyBwcmVmaXhlZCB3aXRoCisJCSAqIGV4dGVuc2lvbiBuYW1lICg0LWJ5dGUpIGFuZCBzZWN0aW9uIGxlbmd0aAorCQkgKiBpbiA0LWJ5dGUgbmV0d29yayBieXRlIG9yZGVyLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBleHRzaXplOworCQltZW1jcHkoJmV4dHNpemUsIChjaGFyICopKGlzdGF0ZS0+bW1hcCkgKyBvZmZzZXQgKyA0LCA0KTsKKwkJZXh0c2l6ZSA9IG50b2hsKGV4dHNpemUpOworCQlpZiAocmVhZF9pbmRleF9leHRlbnNpb24oaXN0YXRlLAorCQkJCQkgKChjb25zdCBjaGFyICopIChpc3RhdGUtPm1tYXApKSArIG9mZnNldCwKKwkJCQkJIChjaGFyICopIChpc3RhdGUtPm1tYXApICsgb2Zmc2V0ICsgOCwKKwkJCQkJIGV4dHNpemUpIDwgMCkKKwkJCWdvdG8gdW5tYXA7CisJCW9mZnNldCArPSA4OworCQlvZmZzZXQgKz0gZXh0c2l6ZTsKKwl9CisJcmV0dXJuIGlzdGF0ZS0+Y2FjaGVfbnI7CisKK3VubWFwOgorCW11bm1hcChpc3RhdGUtPm1tYXAsIGlzdGF0ZS0+bW1hcF9zaXplKTsKKwllcnJubyA9IEVJTlZBTDsKKwlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworfQorCitpbnQgZGlzY2FyZF9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJaXN0YXRlLT5jYWNoZV9uciA9IDA7CisJaXN0YXRlLT5jYWNoZV9jaGFuZ2VkID0gMDsKKwlpc3RhdGUtPnRpbWVzdGFtcCA9IDA7CisJY2FjaGVfdHJlZV9mcmVlKCYoaXN0YXRlLT5jYWNoZV90cmVlKSk7CisJaWYgKGlzdGF0ZS0+bW1hcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBtdW5tYXAoaXN0YXRlLT5tbWFwLCBpc3RhdGUtPm1tYXBfc2l6ZSk7CisJaXN0YXRlLT5tbWFwID0gTlVMTDsKKwlpc3RhdGUtPm1tYXBfc2l6ZSA9IDA7CisKKwkvKiBubyBuZWVkIHRvIHRocm93IGF3YXkgYWxsb2NhdGVkIGFjdGl2ZV9jYWNoZSAqLworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgODE5Mgorc3RhdGljIHVuc2lnbmVkIGNoYXIgd3JpdGVfYnVmZmVyW1dSSVRFX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX2J1ZmZlcl9sZW47CisKK3N0YXRpYyBpbnQgY2Vfd3JpdGVfZmx1c2goU0hBX0NUWCAqY29udGV4dCwgaW50IGZkKQoreworCXVuc2lnbmVkIGludCBidWZmZXJlZCA9IHdyaXRlX2J1ZmZlcl9sZW47CisJaWYgKGJ1ZmZlcmVkKSB7CisJCVNIQTFfVXBkYXRlKGNvbnRleHQsIHdyaXRlX2J1ZmZlciwgYnVmZmVyZWQpOworCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgd3JpdGVfYnVmZmVyLCBidWZmZXJlZCkgIT0gYnVmZmVyZWQpCisJCQlyZXR1cm4gLTE7CisJCXdyaXRlX2J1ZmZlcl9sZW4gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZV93cml0ZShTSEFfQ1RYICpjb250ZXh0LCBpbnQgZmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBpbnQgYnVmZmVyZWQgPSB3cml0ZV9idWZmZXJfbGVuOworCQl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IFdSSVRFX0JVRkZFUl9TSVpFIC0gYnVmZmVyZWQ7CisJCWlmIChwYXJ0aWFsID4gbGVuKQorCQkJcGFydGlhbCA9IGxlbjsKKwkJbWVtY3B5KHdyaXRlX2J1ZmZlciArIGJ1ZmZlcmVkLCBkYXRhLCBwYXJ0aWFsKTsKKwkJYnVmZmVyZWQgKz0gcGFydGlhbDsKKwkJaWYgKGJ1ZmZlcmVkID09IFdSSVRFX0JVRkZFUl9TSVpFKSB7CisJCQl3cml0ZV9idWZmZXJfbGVuID0gYnVmZmVyZWQ7CisJCQlpZiAoY2Vfd3JpdGVfZmx1c2goY29udGV4dCwgZmQpKQorCQkJCXJldHVybiAtMTsKKwkJCWJ1ZmZlcmVkID0gMDsKKwkJfQorCQl3cml0ZV9idWZmZXJfbGVuID0gYnVmZmVyZWQ7CisJCWxlbiAtPSBwYXJ0aWFsOworCQlkYXRhID0gKGNoYXIgKikgZGF0YSArIHBhcnRpYWw7CisgCX0KKyAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfaW5kZXhfZXh0X2hlYWRlcihTSEFfQ1RYICpjb250ZXh0LCBpbnQgZmQsCisJCQkJICB1bnNpZ25lZCBpbnQgZXh0LCB1bnNpZ25lZCBpbnQgc3opCit7CisJZXh0ID0gaHRvbmwoZXh0KTsKKwlzeiA9IGh0b25sKHN6KTsKKwlyZXR1cm4gKChjZV93cml0ZShjb250ZXh0LCBmZCwgJmV4dCwgNCkgPCAwKSB8fAorCQkoY2Vfd3JpdGUoY29udGV4dCwgZmQsICZzeiwgNCkgPCAwKSkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY2VfZmx1c2goU0hBX0NUWCAqY29udGV4dCwgaW50IGZkKQoreworCXVuc2lnbmVkIGludCBsZWZ0ID0gd3JpdGVfYnVmZmVyX2xlbjsKKworCWlmIChsZWZ0KSB7CisJCXdyaXRlX2J1ZmZlcl9sZW4gPSAwOworCQlTSEExX1VwZGF0ZShjb250ZXh0LCB3cml0ZV9idWZmZXIsIGxlZnQpOworCX0KKworCS8qIEZsdXNoIGZpcnN0IGlmIG5vdCBlbm91Z2ggc3BhY2UgZm9yIFNIQTEgc2lnbmF0dXJlICovCisJaWYgKGxlZnQgKyAyMCA+IFdSSVRFX0JVRkZFUl9TSVpFKSB7CisJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCB3cml0ZV9idWZmZXIsIGxlZnQpICE9IGxlZnQpCisJCQlyZXR1cm4gLTE7CisJCWxlZnQgPSAwOworCX0KKworCS8qIEFwcGVuZCB0aGUgU0hBMSBzaWduYXR1cmUgYXQgdGhlIGVuZCAqLworCVNIQTFfRmluYWwod3JpdGVfYnVmZmVyICsgbGVmdCwgY29udGV4dCk7CisJbGVmdCArPSAyMDsKKwlyZXR1cm4gKHdyaXRlX2luX2Z1bGwoZmQsIHdyaXRlX2J1ZmZlciwgbGVmdCkgIT0gbGVmdCkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNlX3NtdWRnZV9yYWNpbHlfY2xlYW5fZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwkvKgorCSAqIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaW4gdGhpcyBmdW5jdGlvbiBpcyB0byBzbXVkZ2UgdGhlCisJICogZmFsc2VseSBjbGVhbiBlbnRyeSBkdWUgdG8gdG91Y2gtdXBkYXRlLXRvdWNoIHJhY2UsIHNvIHdlIGxlYXZlCisJICogZXZlcnl0aGluZyBlbHNlIGFzIHRoZXkgYXJlLiAgV2UgYXJlIGNhbGxlZCBmb3IgZW50cmllcyB3aG9zZQorCSAqIGNlX210aW1lIG1hdGNoIHRoZSBpbmRleCBmaWxlIG10aW1lLgorCSAqLworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkKKwkJcmV0dXJuOworCWlmIChjZV9tYXRjaF9zdGF0X2Jhc2ljKGNlLCAmc3QpKQorCQlyZXR1cm47CisJaWYgKGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCAmc3QpKSB7CisJCS8qIFRoaXMgaXMgInJhY2lseSBjbGVhbiI7IHNtdWRnZSBpdC4gIE5vdGUgdGhhdCB0aGlzCisJCSAqIGlzIGEgdHJpY2t5IGNvZGUuICBBdCBmaXJzdCBnbGFuY2UsIGl0IG1heSBhcHBlYXIKKwkJICogdGhhdCBpdCBjYW4gYnJlYWsgd2l0aCB0aGlzIHNlcXVlbmNlOgorCQkgKgorCQkgKiAkIGVjaG8geHl6enkgPmZyb3R6CisJCSAqICQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90egorCQkgKiAkIDogPmZyb3R6CisJCSAqICQgc2xlZXAgMworCQkgKiAkIGVjaG8gZmlsZnJlID5uaXRmb2wKKwkJICogJCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbAorCQkgKgorCQkgKiBidXQgaXQgZG9lcyBub3QuICBXaGVuIHRoZSBzZWNvbmQgdXBkYXRlLWluZGV4IHJ1bnMsCisJCSAqIGl0IG5vdGljZXMgdGhhdCB0aGUgZW50cnkgImZyb3R6IiBoYXMgdGhlIHNhbWUgdGltZXN0YW1wCisJCSAqIGFzIGluZGV4LCBhbmQgaWYgd2Ugd2VyZSB0byBzbXVkZ2UgaXQgYnkgcmVzZXR0aW5nIGl0cworCQkgKiBzaXplIHRvIHplcm8gaGVyZSwgdGhlbiB0aGUgb2JqZWN0IG5hbWUgcmVjb3JkZWQKKwkJICogaW4gaW5kZXggaXMgdGhlIDYtYnl0ZSBmaWxlIGJ1dCB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24KKwkJICogYmVjb21lcyB6ZXJvIC0tLSB3aGljaCB3b3VsZCB0aGVuIG1hdGNoIHdoYXQgd2Ugd291bGQKKwkJICogb2J0YWluIGZyb20gdGhlIGZpbGVzeXN0ZW0gbmV4dCB0aW1lIHdlIHN0YXQoImZyb3R6IikuIAorCQkgKgorCQkgKiBIb3dldmVyLCB0aGUgc2Vjb25kIHVwZGF0ZS1pbmRleCwgYmVmb3JlIGNhbGxpbmcKKwkJICogdGhpcyBmdW5jdGlvbiwgbm90aWNlcyB0aGF0IHRoZSBjYWNoZWQgc2l6ZSBpcyA2CisJCSAqIGJ5dGVzIGFuZCB3aGF0IGlzIG9uIHRoZSBmaWxlc3lzdGVtIGlzIGFuIGVtcHR5CisJCSAqIGZpbGUsIGFuZCBuZXZlciBjYWxscyB1cywgc28gdGhlIGNhY2hlZCBzaXplIGluZm9ybWF0aW9uCisJCSAqIGZvciAiZnJvdHoiIHN0YXlzIDYgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGZpbGVzeXN0ZW0uCisJCSAqLworCQljZS0+Y2Vfc2l6ZSA9IGh0b25sKDApOworCX0KK30KKworaW50IHdyaXRlX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBpbnQgbmV3ZmQpCit7CisJU0hBX0NUWCBjOworCXN0cnVjdCBjYWNoZV9oZWFkZXIgaGRyOworCWludCBpLCByZW1vdmVkOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlID0gaXN0YXRlLT5jYWNoZTsKKwlpbnQgZW50cmllcyA9IGlzdGF0ZS0+Y2FjaGVfbnI7CisKKwlmb3IgKGkgPSByZW1vdmVkID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKwkJaWYgKCFjYWNoZVtpXS0+Y2VfbW9kZSkKKwkJCXJlbW92ZWQrKzsKKworCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoQ0FDSEVfU0lHTkFUVVJFKTsKKwloZHIuaGRyX3ZlcnNpb24gPSBodG9ubCgyKTsKKwloZHIuaGRyX2VudHJpZXMgPSBodG9ubChlbnRyaWVzIC0gcmVtb3ZlZCk7CisKKwlTSEExX0luaXQoJmMpOworCWlmIChjZV93cml0ZSgmYywgbmV3ZmQsICZoZHIsIHNpemVvZihoZHIpKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlpZiAoIWNlLT5jZV9tb2RlKQorCQkJY29udGludWU7CisJCWlmIChpc3RhdGUtPnRpbWVzdGFtcCAmJgorCQkgICAgaXN0YXRlLT50aW1lc3RhbXAgPD0gbnRvaGwoY2UtPmNlX210aW1lLnNlYykpCisJCQljZV9zbXVkZ2VfcmFjaWx5X2NsZWFuX2VudHJ5KGNlKTsKKwkJaWYgKGNlX3dyaXRlKCZjLCBuZXdmZCwgY2UsIGNlX3NpemUoY2UpKSA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJLyogV3JpdGUgZXh0ZW5zaW9uIGRhdGEgaGVyZSAqLworCWlmIChpc3RhdGUtPmNhY2hlX3RyZWUpIHsKKwkJdW5zaWduZWQgbG9uZyBzejsKKwkJdm9pZCAqZGF0YSA9IGNhY2hlX3RyZWVfd3JpdGUoaXN0YXRlLT5jYWNoZV90cmVlLCAmc3opOworCQlpZiAoZGF0YSAmJgorCQkgICAgIXdyaXRlX2luZGV4X2V4dF9oZWFkZXIoJmMsIG5ld2ZkLCBDQUNIRV9FWFRfVFJFRSwgc3opICYmCisJCSAgICAhY2Vfd3JpdGUoJmMsIG5ld2ZkLCBkYXRhLCBzeikpCisJCQlmcmVlKGRhdGEpOworCQllbHNlIHsKKwkJCWZyZWUoZGF0YSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIGNlX2ZsdXNoKCZjLCBuZXdmZCk7Cit9CmRpZmYgLS1naXQgYS9yZWNlaXZlLXBhY2suYyBiL3JlY2VpdmUtcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWEyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWNlaXZlLXBhY2suYwpAQCAtMCwwICsxLDUxNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgcmVjZWl2ZV9wYWNrX3VzYWdlW10gPSAiZ2l0LXJlY2VpdmUtcGFjayA8Z2l0LWRpcj4iOworCitzdGF0aWMgaW50IGRlbnlfbm9uX2Zhc3RfZm9yd2FyZHMgPSAwOworc3RhdGljIGludCByZWNlaXZlX3VucGFja19saW1pdCA9IC0xOworc3RhdGljIGludCB0cmFuc2Zlcl91bnBhY2tfbGltaXQgPSAtMTsKK3N0YXRpYyBpbnQgdW5wYWNrX2xpbWl0ID0gMTAwOworc3RhdGljIGludCByZXBvcnRfc3RhdHVzOworCitzdGF0aWMgY2hhciBjYXBhYmlsaXRpZXNbXSA9ICIgcmVwb3J0LXN0YXR1cyBkZWxldGUtcmVmcyAiOworc3RhdGljIGludCBjYXBhYmlsaXRpZXNfc2VudDsKKworc3RhdGljIGludCByZWNlaXZlX3BhY2tfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHN0cmNtcCh2YXIsICJyZWNlaXZlLmRlbnlub25mYXN0Zm9yd2FyZHMiKSA9PSAwKSB7CisJCWRlbnlfbm9uX2Zhc3RfZm9yd2FyZHMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodmFyLCAicmVjZWl2ZS51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJcmVjZWl2ZV91bnBhY2tfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh2YXIsICJ0cmFuc2Zlci51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJdHJhbnNmZXJfdW5wYWNrX2xpbWl0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJaWYgKGNhcGFiaWxpdGllc19zZW50KQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSksIHBhdGgsIDAsIGNhcGFiaWxpdGllcyk7CisJY2FwYWJpbGl0aWVzX3NlbnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkX2luZm8odm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoc2hvd19yZWYsIE5VTEwpOworCWlmICghY2FwYWJpbGl0aWVzX3NlbnQpCisJCXNob3dfcmVmKCJjYXBhYmlsaXRpZXNee30iLCBudWxsX3NoYTEsIDAsIE5VTEwpOworCit9CisKK3N0cnVjdCBjb21tYW5kIHsKKwlzdHJ1Y3QgY29tbWFuZCAqbmV4dDsKKwljb25zdCBjaGFyICplcnJvcl9zdHJpbmc7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJY2hhciByZWZfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpjb21tYW5kczsKKworc3RhdGljIGNvbnN0IGNoYXIgcHJlX3JlY2VpdmVfaG9va1tdID0gImhvb2tzL3ByZS1yZWNlaXZlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHBvc3RfcmVjZWl2ZV9ob29rW10gPSAiaG9va3MvcG9zdC1yZWNlaXZlIjsKKworc3RhdGljIGludCBob29rX3N0YXR1cyhpbnQgY29kZSwgY29uc3QgY2hhciAqaG9va19uYW1lKQoreworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0ZPUks6CisJCXJldHVybiBlcnJvcigiaG9vayBmb3JrIGZhaWxlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9FWEVDOgorCQlyZXR1cm4gZXJyb3IoImhvb2sgZXhlY3V0ZSBmYWlsZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfUElQRToKKwkJcmV0dXJuIGVycm9yKCJob29rIHBpcGUgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQ6CisJCXJldHVybiBlcnJvcigid2FpdHBpZCBmYWlsZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9XUk9OR19QSUQ6CisJCXJldHVybiBlcnJvcigid2FpdHBpZCBpcyBjb25mdXNlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJcmV0dXJuIGVycm9yKCIlcyBkaWVkIG9mIHNpZ25hbCIsIGhvb2tfbmFtZSk7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gZXJyb3IoIiVzIGRpZWQgc3RyYW5nZWx5IiwgaG9va19uYW1lKTsKKwlkZWZhdWx0OgorCQllcnJvcigiJXMgZXhpdGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIGhvb2tfbmFtZSwgLWNvZGUpOworCQlyZXR1cm4gLWNvZGU7CisJfQorfQorCitzdGF0aWMgaW50IHJ1bl9ob29rKGNvbnN0IGNoYXIgKmhvb2tfbmFtZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbc2l6ZW9mKGNvbW1hbmRzLT5vbGRfc2hhMSkgKiAyICsgUEFUSF9NQVggKyA0XTsKKwlzdHJ1Y3QgY29tbWFuZCAqY21kOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHByb2M7CisJY29uc3QgY2hhciAqYXJndlsyXTsKKwlpbnQgaGF2ZV9pbnB1dCA9IDAsIGNvZGU7CisKKwlmb3IgKGNtZCA9IGNvbW1hbmRzOyAhaGF2ZV9pbnB1dCAmJiBjbWQ7IGNtZCA9IGNtZC0+bmV4dCkgeworCQlpZiAoIWNtZC0+ZXJyb3Jfc3RyaW5nKQorCQkJaGF2ZV9pbnB1dCA9IDE7CisJfQorCisJaWYgKCFoYXZlX2lucHV0IHx8IGFjY2Vzcyhob29rX25hbWUsIFhfT0spIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2WzBdID0gaG9va19uYW1lOworCWFyZ3ZbMV0gPSBOVUxMOworCisJbWVtc2V0KCZwcm9jLCAwLCBzaXplb2YocHJvYykpOworCXByb2MuYXJndiA9IGFyZ3Y7CisJcHJvYy5pbiA9IC0xOworCXByb2Muc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisKKwljb2RlID0gc3RhcnRfY29tbWFuZCgmcHJvYyk7CisJaWYgKGNvZGUpCisJCXJldHVybiBob29rX3N0YXR1cyhjb2RlLCBob29rX25hbWUpOworCWZvciAoY21kID0gY29tbWFuZHM7IGNtZDsgY21kID0gY21kLT5uZXh0KSB7CisJCWlmICghY21kLT5lcnJvcl9zdHJpbmcpIHsKKwkJCXNpemVfdCBuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzICVzICVzXG4iLAorCQkJCXNoYTFfdG9faGV4KGNtZC0+b2xkX3NoYTEpLAorCQkJCXNoYTFfdG9faGV4KGNtZC0+bmV3X3NoYTEpLAorCQkJCWNtZC0+cmVmX25hbWUpOworCQkJaWYgKHdyaXRlX2luX2Z1bGwocHJvYy5pbiwgYnVmLCBuKSAhPSBuKQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBob29rX3N0YXR1cyhmaW5pc2hfY29tbWFuZCgmcHJvYyksIGhvb2tfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3VwZGF0ZV9ob29rKHN0cnVjdCBjb21tYW5kICpjbWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdXBkYXRlX2hvb2tbXSA9ICJob29rcy91cGRhdGUiOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHByb2M7CisJY29uc3QgY2hhciAqYXJndls1XTsKKworCWlmIChhY2Nlc3ModXBkYXRlX2hvb2ssIFhfT0spIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2WzBdID0gdXBkYXRlX2hvb2s7CisJYXJndlsxXSA9IGNtZC0+cmVmX25hbWU7CisJYXJndlsyXSA9IHNoYTFfdG9faGV4KGNtZC0+b2xkX3NoYTEpOworCWFyZ3ZbM10gPSBzaGExX3RvX2hleChjbWQtPm5ld19zaGExKTsKKwlhcmd2WzRdID0gTlVMTDsKKworCW1lbXNldCgmcHJvYywgMCwgc2l6ZW9mKHByb2MpKTsKKwlwcm9jLmFyZ3YgPSBhcmd2OworCXByb2Mubm9fc3RkaW4gPSAxOworCXByb2Muc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisKKwlyZXR1cm4gaG9va19zdGF0dXMocnVuX2NvbW1hbmQoJnByb2MpLCB1cGRhdGVfaG9vayk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1cGRhdGUoc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gY21kLT5yZWZfbmFtZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSA9IGNtZC0+b2xkX3NoYTE7CisJdW5zaWduZWQgY2hhciAqbmV3X3NoYTEgPSBjbWQtPm5ld19zaGExOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKworCWlmICghcHJlZml4Y21wKG5hbWUsICJyZWZzLyIpICYmIGNoZWNrX3JlZl9mb3JtYXQobmFtZSArIDUpKSB7CisJCWVycm9yKCJyZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICclcycgbG9jYWxseSIsIG5hbWUpOworCQlyZXR1cm4gImZ1bm55IHJlZm5hbWUiOworCX0KKworCWlmICghaXNfbnVsbF9zaGExKG5ld19zaGExKSAmJiAhaGFzX3NoYTFfZmlsZShuZXdfc2hhMSkpIHsKKwkJZXJyb3IoInVucGFjayBzaG91bGQgaGF2ZSBnZW5lcmF0ZWQgJXMsICIKKwkJICAgICAgImJ1dCBJIGNhbid0IGZpbmQgaXQhIiwgc2hhMV90b19oZXgobmV3X3NoYTEpKTsKKwkJcmV0dXJuICJiYWQgcGFjayI7CisJfQorCWlmIChkZW55X25vbl9mYXN0X2ZvcndhcmRzICYmICFpc19udWxsX3NoYTEobmV3X3NoYTEpICYmCisJICAgICFpc19udWxsX3NoYTEob2xkX3NoYTEpICYmCisJICAgICFwcmVmaXhjbXAobmFtZSwgInJlZnMvaGVhZHMvIikpIHsKKwkJc3RydWN0IGNvbW1pdCAqb2xkX2NvbW1pdCwgKm5ld19jb21taXQ7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqYmFzZXMsICplbnQ7CisKKwkJb2xkX2NvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopcGFyc2Vfb2JqZWN0KG9sZF9zaGExKTsKKwkJbmV3X2NvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopcGFyc2Vfb2JqZWN0KG5ld19zaGExKTsKKwkJYmFzZXMgPSBnZXRfbWVyZ2VfYmFzZXMob2xkX2NvbW1pdCwgbmV3X2NvbW1pdCwgMSk7CisJCWZvciAoZW50ID0gYmFzZXM7IGVudDsgZW50ID0gZW50LT5uZXh0KQorCQkJaWYgKCFoYXNoY21wKG9sZF9zaGExLCBlbnQtPml0ZW0tPm9iamVjdC5zaGExKSkKKwkJCQlicmVhazsKKwkJZnJlZV9jb21taXRfbGlzdChiYXNlcyk7CisJCWlmICghZW50KSB7CisJCQllcnJvcigiZGVueWluZyBub24tZmFzdCBmb3J3YXJkICVzIgorCQkJICAgICAgIiAoeW91IHNob3VsZCBwdWxsIGZpcnN0KSIsIG5hbWUpOworCQkJcmV0dXJuICJub24tZmFzdCBmb3J3YXJkIjsKKwkJfQorCX0KKwlpZiAocnVuX3VwZGF0ZV9ob29rKGNtZCkpIHsKKwkJZXJyb3IoImhvb2sgZGVjbGluZWQgdG8gdXBkYXRlICVzIiwgbmFtZSk7CisJCXJldHVybiAiaG9vayBkZWNsaW5lZCI7CisJfQorCisJaWYgKGlzX251bGxfc2hhMShuZXdfc2hhMSkpIHsKKwkJaWYgKGRlbGV0ZV9yZWYobmFtZSwgb2xkX3NoYTEpKSB7CisJCQllcnJvcigiZmFpbGVkIHRvIGRlbGV0ZSAlcyIsIG5hbWUpOworCQkJcmV0dXJuICJmYWlsZWQgdG8gZGVsZXRlIjsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAtPiBkZWxldGVkXG4iLCBuYW1lLAorCQkJc2hhMV90b19oZXgob2xkX3NoYTEpKTsKKwkJcmV0dXJuIE5VTEw7IC8qIGdvb2QgKi8KKwl9CisJZWxzZSB7CisJCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShuYW1lLCBvbGRfc2hhMSk7CisJCWlmICghbG9jaykgeworCQkJZXJyb3IoImZhaWxlZCB0byBsb2NrICVzIiwgbmFtZSk7CisJCQlyZXR1cm4gImZhaWxlZCB0byBsb2NrIjsKKwkJfQorCQlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgbmV3X3NoYTEsICJwdXNoIikpIHsKKwkJCXJldHVybiAiZmFpbGVkIHRvIHdyaXRlIjsgLyogZXJyb3IoKSBhbHJlYWR5IGNhbGxlZCAqLworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIC0+ICVzXG4iLCBuYW1lLAorCQkJc2hhMV90b19oZXgob2xkX3NoYTEpLCBzaGExX3RvX2hleChuZXdfc2hhMSkpOworCQlyZXR1cm4gTlVMTDsgLyogZ29vZCAqLworCX0KK30KKworc3RhdGljIGNoYXIgdXBkYXRlX3Bvc3RfaG9va1tdID0gImhvb2tzL3Bvc3QtdXBkYXRlIjsKKworc3RhdGljIHZvaWQgcnVuX3VwZGF0ZV9wb3N0X2hvb2soc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kX3A7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisKKwlmb3IgKGFyZ2MgPSAwLCBjbWRfcCA9IGNtZDsgY21kX3A7IGNtZF9wID0gY21kX3AtPm5leHQpIHsKKwkJaWYgKGNtZF9wLT5lcnJvcl9zdHJpbmcpCisJCQljb250aW51ZTsKKwkJYXJnYysrOworCX0KKwlpZiAoIWFyZ2MgfHwgYWNjZXNzKHVwZGF0ZV9wb3N0X2hvb2ssIFhfT0spIDwgMCkKKwkJcmV0dXJuOworCWFyZ3YgPSB4bWFsbG9jKHNpemVvZigqYXJndikgKiAoMiArIGFyZ2MpKTsKKwlhcmd2WzBdID0gdXBkYXRlX3Bvc3RfaG9vazsKKworCWZvciAoYXJnYyA9IDEsIGNtZF9wID0gY21kOyBjbWRfcDsgY21kX3AgPSBjbWRfcC0+bmV4dCkgeworCQljaGFyICpwOworCQlpZiAoY21kX3AtPmVycm9yX3N0cmluZykKKwkJCWNvbnRpbnVlOworCQlwID0geG1hbGxvYyhzdHJsZW4oY21kX3AtPnJlZl9uYW1lKSArIDEpOworCQlzdHJjcHkocCwgY21kX3AtPnJlZl9uYW1lKTsKKwkJYXJndlthcmdjXSA9IHA7CisJCWFyZ2MrKzsKKwl9CisJYXJndlthcmdjXSA9IE5VTEw7CisJcnVuX2NvbW1hbmRfdl9vcHQoYXJndiwgUlVOX0NPTU1BTkRfTk9fU1RESU4KKwkJfCBSVU5fQ09NTUFORF9TVERPVVRfVE9fU1RERVJSKTsKK30KKworc3RhdGljIHZvaWQgZXhlY3V0ZV9jb21tYW5kcyhjb25zdCBjaGFyICp1bnBhY2tlcl9lcnJvcikKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kID0gY29tbWFuZHM7CisKKwlpZiAodW5wYWNrZXJfZXJyb3IpIHsKKwkJd2hpbGUgKGNtZCkgeworCQkJY21kLT5lcnJvcl9zdHJpbmcgPSAibi9hICh1bnBhY2tlciBlcnJvcikiOworCQkJY21kID0gY21kLT5uZXh0OworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAocnVuX2hvb2socHJlX3JlY2VpdmVfaG9vaykpIHsKKwkJd2hpbGUgKGNtZCkgeworCQkJY21kLT5lcnJvcl9zdHJpbmcgPSAicHJlLXJlY2VpdmUgaG9vayBkZWNsaW5lZCI7CisJCQljbWQgPSBjbWQtPm5leHQ7CisJCX0KKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChjbWQpIHsKKwkJY21kLT5lcnJvcl9zdHJpbmcgPSB1cGRhdGUoY21kKTsKKwkJY21kID0gY21kLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9oZWFkX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqKnAgPSAmY29tbWFuZHM7CisJZm9yICg7OykgeworCQlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCQl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXSwgbmV3X3NoYTFbMjBdOworCQlzdHJ1Y3QgY29tbWFuZCAqY21kOworCQljaGFyICpyZWZuYW1lOworCQlpbnQgbGVuLCByZWZsZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKwkJaWYgKGxlbiA8IDgzIHx8CisJCSAgICBsaW5lWzQwXSAhPSAnICcgfHwKKwkJICAgIGxpbmVbODFdICE9ICcgJyB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUsIG9sZF9zaGExKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUgKyA0MSwgbmV3X3NoYTEpKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgb2xkL25ldy9yZWYsIGdvdCAnJXMnIiwKKwkJCSAgICBsaW5lKTsKKworCQlyZWZuYW1lID0gbGluZSArIDgyOworCQlyZWZsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJCWlmIChyZWZsZW4gKyA4MiA8IGxlbikgeworCQkJaWYgKHN0cnN0cihyZWZuYW1lICsgcmVmbGVuICsgMSwgInJlcG9ydC1zdGF0dXMiKSkKKwkJCQlyZXBvcnRfc3RhdHVzID0gMTsKKwkJfQorCQljbWQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkgKyBsZW4gLSA4MCk7CisJCWhhc2hjcHkoY21kLT5vbGRfc2hhMSwgb2xkX3NoYTEpOworCQloYXNoY3B5KGNtZC0+bmV3X3NoYTEsIG5ld19zaGExKTsKKwkJbWVtY3B5KGNtZC0+cmVmX25hbWUsIGxpbmUgKyA4MiwgbGVuIC0gODEpOworCQljbWQtPmVycm9yX3N0cmluZyA9IE5VTEw7CisJCWNtZC0+bmV4dCA9IE5VTEw7CisJCSpwID0gY21kOworCQlwID0gJmNtZC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9wYWNrX2hlYWRlcihzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcikKK3sKKwlzd2l0Y2ggKHJlYWRfcGFja19oZWFkZXIoMCwgaGRyKSkgeworCWNhc2UgUEhfRVJST1JfRU9GOgorCQlyZXR1cm4gImVvZiBiZWZvcmUgcGFjayBoZWFkZXIgd2FzIGZ1bGx5IHJlYWQiOworCisJY2FzZSBQSF9FUlJPUl9QQUNLX1NJR05BVFVSRToKKwkJcmV0dXJuICJwcm90b2NvbCBlcnJvciAocGFjayBzaWduYXR1cmUgbWlzbWF0Y2ggZGV0ZWN0ZWQpIjsKKworCWNhc2UgUEhfRVJST1JfUFJPVE9DT0w6CisJCXJldHVybiAicHJvdG9jb2wgZXJyb3IgKHBhY2sgdmVyc2lvbiB1bnN1cHBvcnRlZCkiOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIGVycm9yIGluIHBhcnNlX3BhY2tfaGVhZGVyIjsKKworCWNhc2UgMDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGFja19sb2NrZmlsZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnVucGFjayh2b2lkKQoreworCXN0cnVjdCBwYWNrX2hlYWRlciBoZHI7CisJY29uc3QgY2hhciAqaGRyX2VycjsKKwljaGFyIGhkcl9hcmdbMzhdOworCisJaGRyX2VyciA9IHBhcnNlX3BhY2tfaGVhZGVyKCZoZHIpOworCWlmIChoZHJfZXJyKQorCQlyZXR1cm4gaGRyX2VycjsKKwlzbnByaW50ZihoZHJfYXJnLCBzaXplb2YoaGRyX2FyZyksICItLXBhY2tfaGVhZGVyPSV1LCV1IiwKKwkJCW50b2hsKGhkci5oZHJfdmVyc2lvbiksIG50b2hsKGhkci5oZHJfZW50cmllcykpOworCisJaWYgKG50b2hsKGhkci5oZHJfZW50cmllcykgPCB1bnBhY2tfbGltaXQpIHsKKwkJaW50IGNvZGU7CisJCWNvbnN0IGNoYXIgKnVucGFja2VyWzNdOworCQl1bnBhY2tlclswXSA9ICJ1bnBhY2stb2JqZWN0cyI7CisJCXVucGFja2VyWzFdID0gaGRyX2FyZzsKKwkJdW5wYWNrZXJbMl0gPSBOVUxMOworCQljb2RlID0gcnVuX2NvbW1hbmRfdl9vcHQodW5wYWNrZXIsIFJVTl9HSVRfQ01EKTsKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBOVUxMOworCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRk9SSzoKKwkJCXJldHVybiAidW5wYWNrIGZvcmsgZmFpbGVkIjsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCQlyZXR1cm4gInVucGFjayBleGVjdXRlIGZhaWxlZCI7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEOgorCQkJcmV0dXJuICJ3YWl0cGlkIGZhaWxlZCI7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDoKKwkJCXJldHVybiAid2FpdHBpZCBpcyBjb25mdXNlZCI7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJCXJldHVybiAidW5wYWNrZXIgZGllZCBvZiBzaWduYWwiOworCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ6CisJCQlyZXR1cm4gInVucGFja2VyIGRpZWQgc3RyYW5nZWx5IjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidW5wYWNrZXIgZXhpdGVkIHdpdGggZXJyb3IgY29kZSI7CisJCX0KKwl9IGVsc2UgeworCQljb25zdCBjaGFyICprZWVwZXJbNl07CisJCWludCBzLCBsZW4sIHN0YXR1czsKKwkJY2hhciBrZWVwX2FyZ1syNTZdOworCQljaGFyIHBhY2tuYW1lWzQ2XTsKKwkJc3RydWN0IGNoaWxkX3Byb2Nlc3MgaXA7CisKKwkJcyA9IHNwcmludGYoa2VlcF9hcmcsICItLWtlZXA9cmVjZWl2ZS1wYWNrICVpIG9uICIsIGdldHBpZCgpKTsKKwkJaWYgKGdldGhvc3RuYW1lKGtlZXBfYXJnICsgcywgc2l6ZW9mKGtlZXBfYXJnKSAtIHMpKQorCQkJc3RyY3B5KGtlZXBfYXJnICsgcywgImxvY2FsaG9zdCIpOworCisJCWtlZXBlclswXSA9ICJpbmRleC1wYWNrIjsKKwkJa2VlcGVyWzFdID0gIi0tc3RkaW4iOworCQlrZWVwZXJbMl0gPSAiLS1maXgtdGhpbiI7CisJCWtlZXBlclszXSA9IGhkcl9hcmc7CisJCWtlZXBlcls0XSA9IGtlZXBfYXJnOworCQlrZWVwZXJbNV0gPSBOVUxMOworCQltZW1zZXQoJmlwLCAwLCBzaXplb2YoaXApKTsKKwkJaXAuYXJndiA9IGtlZXBlcjsKKwkJaXAub3V0ID0gLTE7CisJCWlwLmdpdF9jbWQgPSAxOworCQlpZiAoc3RhcnRfY29tbWFuZCgmaXApKQorCQkJcmV0dXJuICJpbmRleC1wYWNrIGZvcmsgZmFpbGVkIjsKKworCQkvKgorCQkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZXhwZWN0cyBmcm9tIGluZGV4LXBhY2sncyBvdXRwdXQKKwkJICogaXMgInBhY2tcdCU0MHNcbiIgb3IgImtlZXBcdCU0MHNcbiIgKDQ2IGJ5dGVzKSB3aGVyZQorCQkgKiAlNDBzIGlzIHRoZSBuZXdseSBjcmVhdGVkIHBhY2sgU0hBMSBuYW1lLiAgSW4gdGhlICJrZWVwIgorCQkgKiBjYXNlLCB3ZSBuZWVkIGl0IHRvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyAua2VlcCBmaWxlCisJCSAqIGxhdGVyIG9uLiAgSWYgd2UgZG9uJ3QgZ2V0IHRoYXQgdGhlbiB0b3VnaCBsdWNrIHdpdGggaXQuCisJCSAqLworCQlmb3IgKGxlbiA9IDA7CisJCSAgICAgbGVuIDwgNDYgJiYgKHMgPSB4cmVhZChpcC5vdXQsIHBhY2tuYW1lK2xlbiwgNDYtbGVuKSkgPiAwOworCQkgICAgIGxlbiArPSBzKTsKKwkJaWYgKGxlbiA9PSA0NiAmJiBwYWNrbmFtZVs0NV0gPT0gJ1xuJyAmJgorCQkgICAgbWVtY21wKHBhY2tuYW1lLCAia2VlcFx0IiwgNSkgPT0gMCkgeworCQkJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwkJCXBhY2tuYW1lWzQ1XSA9IDA7CisJCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy9wYWNrL3BhY2stJXMua2VlcCIsCisJCQkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHBhY2tuYW1lICsgNSk7CisJCQlwYWNrX2xvY2tmaWxlID0geHN0cmR1cChwYXRoKTsKKwkJfQorCisJCXN0YXR1cyA9IGZpbmlzaF9jb21tYW5kKCZpcCk7CisJCWlmICghc3RhdHVzKSB7CisJCQlyZXByZXBhcmVfcGFja2VkX2dpdCgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuICJpbmRleC1wYWNrIGFibm9ybWFsIGV4aXQiOworCX0KK30KKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnVucGFja19zdGF0dXMpCit7CisJc3RydWN0IGNvbW1hbmQgKmNtZDsKKwlwYWNrZXRfd3JpdGUoMSwgInVucGFjayAlc1xuIiwKKwkJICAgICB1bnBhY2tfc3RhdHVzID8gdW5wYWNrX3N0YXR1cyA6ICJvayIpOworCWZvciAoY21kID0gY29tbWFuZHM7IGNtZDsgY21kID0gY21kLT5uZXh0KSB7CisJCWlmICghY21kLT5lcnJvcl9zdHJpbmcpCisJCQlwYWNrZXRfd3JpdGUoMSwgIm9rICVzXG4iLAorCQkJCSAgICAgY21kLT5yZWZfbmFtZSk7CisJCWVsc2UKKwkJCXBhY2tldF93cml0ZSgxLCAibmcgJXMgJXNcbiIsCisJCQkJICAgICBjbWQtPnJlZl9uYW1lLCBjbWQtPmVycm9yX3N0cmluZyk7CisJfQorCXBhY2tldF9mbHVzaCgxKTsKK30KKworc3RhdGljIGludCBkZWxldGVfb25seShzdHJ1Y3QgY29tbWFuZCAqY21kKQoreworCXdoaWxlIChjbWQpIHsKKwkJaWYgKCFpc19udWxsX3NoYTEoY21kLT5uZXdfc2hhMSkpCisJCQlyZXR1cm4gMDsKKwkJY21kID0gY21kLT5uZXh0OworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNoYXIgKmRpciA9IE5VTEw7CisKKwlhcmd2Kys7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSAqYXJndisrOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJLyogRG8gZmxhZyBoYW5kbGluZyBoZXJlICovCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQl9CisJCWlmIChkaXIpCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQlkaXIgPSBhcmc7CisJfQorCWlmICghZGlyKQorCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCisJaWYgKCFlbnRlcl9yZXBvKGRpciwgMCkpCisJCWRpZSgiJyVzJzogdW5hYmxlIHRvIGNoZGlyIG9yIG5vdCBhIGdpdCBhcmNoaXZlIiwgZGlyKTsKKworCWlmIChpc19yZXBvc2l0b3J5X3NoYWxsb3coKSkKKwkJZGllKCJhdHRlbXB0IHRvIHB1c2ggaW50byBhIHNoYWxsb3cgcmVwb3NpdG9yeSIpOworCisJZ2l0X2NvbmZpZyhyZWNlaXZlX3BhY2tfY29uZmlnKTsKKworCWlmICgwIDw9IHRyYW5zZmVyX3VucGFja19saW1pdCkKKwkJdW5wYWNrX2xpbWl0ID0gdHJhbnNmZXJfdW5wYWNrX2xpbWl0OworCWVsc2UgaWYgKDAgPD0gcmVjZWl2ZV91bnBhY2tfbGltaXQpCisJCXVucGFja19saW1pdCA9IHJlY2VpdmVfdW5wYWNrX2xpbWl0OworCisJd3JpdGVfaGVhZF9pbmZvKCk7CisKKwkvKiBFT0YgKi8KKwlwYWNrZXRfZmx1c2goMSk7CisKKwlyZWFkX2hlYWRfaW5mbygpOworCWlmIChjb21tYW5kcykgeworCQljb25zdCBjaGFyICp1bnBhY2tfc3RhdHVzID0gTlVMTDsKKworCQlpZiAoIWRlbGV0ZV9vbmx5KGNvbW1hbmRzKSkKKwkJCXVucGFja19zdGF0dXMgPSB1bnBhY2soKTsKKwkJZXhlY3V0ZV9jb21tYW5kcyh1bnBhY2tfc3RhdHVzKTsKKwkJaWYgKHBhY2tfbG9ja2ZpbGUpCisJCQl1bmxpbmsocGFja19sb2NrZmlsZSk7CisJCWlmIChyZXBvcnRfc3RhdHVzKQorCQkJcmVwb3J0KHVucGFja19zdGF0dXMpOworCQlydW5faG9vayhwb3N0X3JlY2VpdmVfaG9vayk7CisJCXJ1bl91cGRhdGVfcG9zdF9ob29rKGNvbW1hbmRzKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yZWZsb2ctd2Fsay5jIGIvcmVmbG9nLXdhbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTgzODU4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVmbG9nLXdhbGsuYwpAQCAtMCwwICsxLDI3MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgInJlZmxvZy13YWxrLmgiCisKK3N0cnVjdCBjb21wbGV0ZV9yZWZsb2dzIHsKKwljaGFyICpyZWY7CisJc3RydWN0IHJlZmxvZ19pbmZvIHsKKwkJdW5zaWduZWQgY2hhciBvc2hhMVsyMF0sIG5zaGExWzIwXTsKKwkJY2hhciAqZW1haWw7CisJCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOworCQlpbnQgdHo7CisJCWNoYXIgKm1lc3NhZ2U7CisJfSAqaXRlbXM7CisJaW50IG5yLCBhbGxvYzsKK307CisKK3N0YXRpYyBpbnQgcmVhZF9vbmVfcmVmbG9nKHVuc2lnbmVkIGNoYXIgKm9zaGExLCB1bnNpZ25lZCBjaGFyICpuc2hhMSwKKwkJY29uc3QgY2hhciAqZW1haWwsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wLCBpbnQgdHosCisJCWNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgKmFycmF5ID0gY2JfZGF0YTsKKwlzdHJ1Y3QgcmVmbG9nX2luZm8gKml0ZW07CisKKwlpZiAoYXJyYXktPm5yID49IGFycmF5LT5hbGxvYykgeworCQlhcnJheS0+YWxsb2MgPSBhbGxvY19ucihhcnJheS0+bnIgKyAxKTsKKwkJYXJyYXktPml0ZW1zID0geHJlYWxsb2MoYXJyYXktPml0ZW1zLCBhcnJheS0+YWxsb2MgKgorCQkJc2l6ZW9mKHN0cnVjdCByZWZsb2dfaW5mbykpOworCX0KKwlpdGVtID0gYXJyYXktPml0ZW1zICsgYXJyYXktPm5yOworCW1lbWNweShpdGVtLT5vc2hhMSwgb3NoYTEsIDIwKTsKKwltZW1jcHkoaXRlbS0+bnNoYTEsIG5zaGExLCAyMCk7CisJaXRlbS0+ZW1haWwgPSB4c3RyZHVwKGVtYWlsKTsKKwlpdGVtLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJaXRlbS0+dHogPSB0ejsKKwlpdGVtLT5tZXNzYWdlID0geHN0cmR1cChtZXNzYWdlKTsKKwlhcnJheS0+bnIrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb21wbGV0ZV9yZWZsb2dzICpyZWFkX2NvbXBsZXRlX3JlZmxvZyhjb25zdCBjaGFyICpyZWYpCit7CisJc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgKnJlZmxvZ3MgPQorCQl4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgY29tcGxldGVfcmVmbG9ncyksIDEpOworCXJlZmxvZ3MtPnJlZiA9IHhzdHJkdXAocmVmKTsKKwlmb3JfZWFjaF9yZWZsb2dfZW50KHJlZiwgcmVhZF9vbmVfcmVmbG9nLCByZWZsb2dzKTsKKwlpZiAocmVmbG9ncy0+bnIgPT0gMCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljb25zdCBjaGFyICpuYW1lID0gcmVzb2x2ZV9yZWYocmVmLCBzaGExLCAxLCBOVUxMKTsKKwkJaWYgKG5hbWUpCisJCQlmb3JfZWFjaF9yZWZsb2dfZW50KG5hbWUsIHJlYWRfb25lX3JlZmxvZywgcmVmbG9ncyk7CisJfQorCWlmIChyZWZsb2dzLT5uciA9PSAwKSB7CisJCWludCBsZW4gPSBzdHJsZW4ocmVmKTsKKwkJY2hhciAqcmVmbmFtZSA9IHhtYWxsb2MobGVuICsgMTIpOworCQlzcHJpbnRmKHJlZm5hbWUsICJyZWZzLyVzIiwgcmVmKTsKKwkJZm9yX2VhY2hfcmVmbG9nX2VudChyZWZuYW1lLCByZWFkX29uZV9yZWZsb2csIHJlZmxvZ3MpOworCQlpZiAocmVmbG9ncy0+bnIgPT0gMCkgeworCQkJc3ByaW50ZihyZWZuYW1lLCAicmVmcy9oZWFkcy8lcyIsIHJlZik7CisJCQlmb3JfZWFjaF9yZWZsb2dfZW50KHJlZm5hbWUsIHJlYWRfb25lX3JlZmxvZywgcmVmbG9ncyk7CisJCX0KKwkJZnJlZShyZWZuYW1lKTsKKwl9CisJcmV0dXJuIHJlZmxvZ3M7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZmxvZ19yZWNub19ieV90aW1lKHN0cnVjdCBjb21wbGV0ZV9yZWZsb2dzICphcnJheSwKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBhcnJheS0+bnIgLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHRpbWVzdGFtcCA+PSBhcnJheS0+aXRlbXNbaV0udGltZXN0YW1wKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgY29tbWl0X2luZm9fbGlmbyB7CisJc3RydWN0IGNvbW1pdF9pbmZvIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCQl2b2lkICp1dGlsOworCX0gKml0ZW1zOworCWludCBuciwgYWxsb2M7Cit9OworCitzdGF0aWMgc3RydWN0IGNvbW1pdF9pbmZvICpnZXRfY29tbWl0X2luZm8oc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQlzdHJ1Y3QgY29tbWl0X2luZm9fbGlmbyAqbGlmbywgaW50IHBvcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlmby0+bnI7IGkrKykKKwkJaWYgKGxpZm8tPml0ZW1zW2ldLmNvbW1pdCA9PSBjb21taXQpIHsKKwkJCXN0cnVjdCBjb21taXRfaW5mbyAqcmVzdWx0ID0gJmxpZm8tPml0ZW1zW2ldOworCQkJaWYgKHBvcCkgeworCQkJCWlmIChpICsgMSA8IGxpZm8tPm5yKQorCQkJCQltZW1tb3ZlKGxpZm8tPml0ZW1zICsgaSwKKwkJCQkJCWxpZm8tPml0ZW1zICsgaSArIDEsCisJCQkJCQkobGlmby0+bnIgLSBpKSAqCisJCQkJCQlzaXplb2Yoc3RydWN0IGNvbW1pdF9pbmZvKSk7CisJCQkJbGlmby0+bnItLTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYWRkX2NvbW1pdF9pbmZvKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgdm9pZCAqdXRpbCwKKwkJc3RydWN0IGNvbW1pdF9pbmZvX2xpZm8gKmxpZm8pCit7CisJc3RydWN0IGNvbW1pdF9pbmZvICppbmZvOworCWlmIChsaWZvLT5uciA+PSBsaWZvLT5hbGxvYykgeworCQlsaWZvLT5hbGxvYyA9IGFsbG9jX25yKGxpZm8tPm5yICsgMSk7CisJCWxpZm8tPml0ZW1zID0geHJlYWxsb2MobGlmby0+aXRlbXMsCisJCQlsaWZvLT5hbGxvYyAqIHNpemVvZihzdHJ1Y3QgY29tbWl0X2luZm8pKTsKKwl9CisJaW5mbyA9IGxpZm8tPml0ZW1zICsgbGlmby0+bnI7CisJaW5mby0+Y29tbWl0ID0gY29tbWl0OworCWluZm8tPnV0aWwgPSB1dGlsOworCWxpZm8tPm5yKys7Cit9CisKK3N0cnVjdCBjb21taXRfcmVmbG9nIHsKKwlpbnQgZmxhZywgcmVjbm87CisJc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgKnJlZmxvZ3M7Cit9OworCitzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyB7CisJc3RydWN0IGNvbW1pdF9pbmZvX2xpZm8gcmVmbG9nczsKKwlzdHJ1Y3QgcGF0aF9saXN0IGNvbXBsZXRlX3JlZmxvZ3M7CisJc3RydWN0IGNvbW1pdF9yZWZsb2cgKmxhc3RfY29tbWl0X3JlZmxvZzsKK307CisKK3ZvaWQgaW5pdF9yZWZsb2dfd2FsayhzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyoqIGluZm8pCit7CisJKmluZm8gPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyksIDEpOworfQorCit2b2lkIGFkZF9yZWZsb2dfZm9yX3dhbGsoc3RydWN0IHJlZmxvZ193YWxrX2luZm8gKmluZm8sCisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9IDA7CisJaW50IHJlY25vID0gLTE7CisJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtOworCXN0cnVjdCBjb21wbGV0ZV9yZWZsb2dzICpyZWZsb2dzOworCWNoYXIgKmJyYW5jaCwgKmF0ID0gc3RyY2hyKG5hbWUsICdAJyk7CisJc3RydWN0IGNvbW1pdF9yZWZsb2cgKmNvbW1pdF9yZWZsb2c7CisKKwlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlkaWUgKCJDYW5ub3Qgd2FsayByZWZsb2dzIGZvciAlcyIsIG5hbWUpOworCisJYnJhbmNoID0geHN0cmR1cChuYW1lKTsKKwlpZiAoYXQgJiYgYXRbMV0gPT0gJ3snKSB7CisJCWNoYXIgKmVwOworCQlicmFuY2hbYXQgLSBuYW1lXSA9ICdcMCc7CisJCXJlY25vID0gc3RydG91bChhdCArIDIsICZlcCwgMTApOworCQlpZiAoKmVwICE9ICd9JykgeworCQkJcmVjbm8gPSAtMTsKKwkJCXRpbWVzdGFtcCA9IGFwcHJveGlkYXRlKGF0ICsgMik7CisJCX0KKwl9IGVsc2UKKwkJcmVjbm8gPSAwOworCisJaXRlbSA9IHBhdGhfbGlzdF9sb29rdXAoYnJhbmNoLCAmaW5mby0+Y29tcGxldGVfcmVmbG9ncyk7CisJaWYgKGl0ZW0pCisJCXJlZmxvZ3MgPSBpdGVtLT51dGlsOworCWVsc2UgeworCQlpZiAoKmJyYW5jaCA9PSAnXDAnKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJY29uc3QgY2hhciAqaGVhZCA9IHJlc29sdmVfcmVmKCJIRUFEIiwgc2hhMSwgMCwgTlVMTCk7CisJCQlpZiAoIWhlYWQpCisJCQkJZGllICgiTm8gY3VycmVudCBicmFuY2giKTsKKwkJCWZyZWUoYnJhbmNoKTsKKwkJCWJyYW5jaCA9IHhzdHJkdXAoaGVhZCk7CisJCX0KKwkJcmVmbG9ncyA9IHJlYWRfY29tcGxldGVfcmVmbG9nKGJyYW5jaCk7CisJCWlmICghcmVmbG9ncyB8fCByZWZsb2dzLT5uciA9PSAwKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJY2hhciAqYjsKKwkJCWlmIChkd2ltX2xvZyhicmFuY2gsIHN0cmxlbihicmFuY2gpLCBzaGExLCAmYikgPT0gMSkgeworCQkJCWlmIChyZWZsb2dzKSB7CisJCQkJCWZyZWUocmVmbG9ncy0+cmVmKTsKKwkJCQkJZnJlZShyZWZsb2dzKTsKKwkJCQl9CisJCQkJZnJlZShicmFuY2gpOworCQkJCWJyYW5jaCA9IGI7CisJCQkJcmVmbG9ncyA9IHJlYWRfY29tcGxldGVfcmVmbG9nKGJyYW5jaCk7CisJCQl9CisJCX0KKwkJaWYgKCFyZWZsb2dzIHx8IHJlZmxvZ3MtPm5yID09IDApCisJCQlkaWUoIk5vIHJlZmxvZ3MgZm91bmQgZm9yICclcyciLCBicmFuY2gpOworCQlwYXRoX2xpc3RfaW5zZXJ0KGJyYW5jaCwgJmluZm8tPmNvbXBsZXRlX3JlZmxvZ3MpLT51dGlsCisJCQk9IHJlZmxvZ3M7CisJfQorCisJY29tbWl0X3JlZmxvZyA9IHhjYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfcmVmbG9nKSwgMSk7CisJaWYgKHJlY25vIDwgMCkgeworCQljb21taXRfcmVmbG9nLT5mbGFnID0gMTsKKwkJY29tbWl0X3JlZmxvZy0+cmVjbm8gPSBnZXRfcmVmbG9nX3JlY25vX2J5X3RpbWUocmVmbG9ncywgdGltZXN0YW1wKTsKKwkJaWYgKGNvbW1pdF9yZWZsb2ctPnJlY25vIDwgMCkgeworCQkJZnJlZShicmFuY2gpOworCQkJZnJlZShjb21taXRfcmVmbG9nKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZQorCQljb21taXRfcmVmbG9nLT5yZWNubyA9IHJlZmxvZ3MtPm5yIC0gcmVjbm8gLSAxOworCWNvbW1pdF9yZWZsb2ctPnJlZmxvZ3MgPSByZWZsb2dzOworCisJYWRkX2NvbW1pdF9pbmZvKGNvbW1pdCwgY29tbWl0X3JlZmxvZywgJmluZm8tPnJlZmxvZ3MpOworfQorCit2b2lkIGZha2VfcmVmbG9nX3BhcmVudChzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqaW5mbywgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfaW5mbyAqY29tbWl0X2luZm8gPQorCQlnZXRfY29tbWl0X2luZm8oY29tbWl0LCAmaW5mby0+cmVmbG9ncywgMCk7CisJc3RydWN0IGNvbW1pdF9yZWZsb2cgKmNvbW1pdF9yZWZsb2c7CisJc3RydWN0IHJlZmxvZ19pbmZvICpyZWZsb2c7CisKKwlpbmZvLT5sYXN0X2NvbW1pdF9yZWZsb2cgPSBOVUxMOworCWlmICghY29tbWl0X2luZm8pCisJCXJldHVybjsKKworCWNvbW1pdF9yZWZsb2cgPSBjb21taXRfaW5mby0+dXRpbDsKKwlpZiAoY29tbWl0X3JlZmxvZy0+cmVjbm8gPCAwKSB7CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlyZWZsb2cgPSAmY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+aXRlbXNbY29tbWl0X3JlZmxvZy0+cmVjbm9dOworCWluZm8tPmxhc3RfY29tbWl0X3JlZmxvZyA9IGNvbW1pdF9yZWZsb2c7CisJY29tbWl0X3JlZmxvZy0+cmVjbm8tLTsKKwljb21taXRfaW5mby0+Y29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilwYXJzZV9vYmplY3QocmVmbG9nLT5vc2hhMSk7CisJaWYgKCFjb21taXRfaW5mby0+Y29tbWl0KSB7CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwljb21taXQtPnBhcmVudHMgPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X2xpc3QpLCAxKTsKKwljb21taXQtPnBhcmVudHMtPml0ZW0gPSBjb21taXRfaW5mby0+Y29tbWl0OworCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH4oQURERUQgfCBTRUVOIHwgU0hPV04pOworfQorCit2b2lkIHNob3dfcmVmbG9nX21lc3NhZ2Uoc3RydWN0IHJlZmxvZ193YWxrX2luZm8qIGluZm8sIGludCBvbmVsaW5lLAorCWludCByZWxhdGl2ZV9kYXRlKQoreworCWlmIChpbmZvICYmIGluZm8tPmxhc3RfY29tbWl0X3JlZmxvZykgeworCQlzdHJ1Y3QgY29tbWl0X3JlZmxvZyAqY29tbWl0X3JlZmxvZyA9IGluZm8tPmxhc3RfY29tbWl0X3JlZmxvZzsKKwkJc3RydWN0IHJlZmxvZ19pbmZvICppbmZvOworCisJCWluZm8gPSAmY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+aXRlbXNbY29tbWl0X3JlZmxvZy0+cmVjbm8rMV07CisJCWlmIChvbmVsaW5lKSB7CisJCQlwcmludGYoIiVzQHsiLCBjb21taXRfcmVmbG9nLT5yZWZsb2dzLT5yZWYpOworCQkJaWYgKGNvbW1pdF9yZWZsb2ctPmZsYWcgfHwgcmVsYXRpdmVfZGF0ZSkKKwkJCQlwcmludGYoIiVzIiwgc2hvd19kYXRlKGluZm8tPnRpbWVzdGFtcCwgMCwgMSkpOworCQkJZWxzZQorCQkJCXByaW50ZigiJWQiLCBjb21taXRfcmVmbG9nLT5yZWZsb2dzLT5ucgorCQkJCSAgICAgICAtIDIgLSBjb21taXRfcmVmbG9nLT5yZWNubyk7CisJCQlwcmludGYoIn06ICVzIiwgaW5mby0+bWVzc2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGYoIlJlZmxvZzogJXNAeyIsIGNvbW1pdF9yZWZsb2ctPnJlZmxvZ3MtPnJlZik7CisJCQlpZiAoY29tbWl0X3JlZmxvZy0+ZmxhZyB8fCByZWxhdGl2ZV9kYXRlKQorCQkJCXByaW50ZigiJXMiLCBzaG93X2RhdGUoaW5mby0+dGltZXN0YW1wLAorCQkJCQkJCWluZm8tPnR6LAorCQkJCQkJCXJlbGF0aXZlX2RhdGUpKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVkIiwgY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+bnIKKwkJCQkgICAgICAgLSAyIC0gY29tbWl0X3JlZmxvZy0+cmVjbm8pOworCQkJcHJpbnRmKCJ9ICglcylcblJlZmxvZyBtZXNzYWdlOiAlcyIsCisJCQkgICAgICAgaW5mby0+ZW1haWwsIGluZm8tPm1lc3NhZ2UpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcmVmbG9nLXdhbGsuaCBiL3JlZmxvZy13YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmNzAxNQotLS0gL2Rldi9udWxsCisrKyBiL3JlZmxvZy13YWxrLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBSRUZMT0dfV0FMS19ICisjZGVmaW5lIFJFRkxPR19XQUxLX0gKKworZXh0ZXJuIHZvaWQgaW5pdF9yZWZsb2dfd2FsayhzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyoqIGluZm8pOworZXh0ZXJuIHZvaWQgYWRkX3JlZmxvZ19mb3Jfd2FsayhzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqaW5mbywKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0LCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGZha2VfcmVmbG9nX3BhcmVudChzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqaW5mbywKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0KTsKK2V4dGVybiB2b2lkIHNob3dfcmVmbG9nX21lc3NhZ2Uoc3RydWN0IHJlZmxvZ193YWxrX2luZm8gKmluZm8sIGludCwgaW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZWZzLmMgYi9yZWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4NzZiZgotLS0gL2Rldi9udWxsCisrKyBiL3JlZnMuYwpAQCAtMCwwICsxLDE0MjcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworLyogSVNTWU1SRUY9MDEgYW5kIElTUEFDS0VEPTAyIGFyZSBwdWJsaWMgaW50ZXJmYWNlcyAqLworI2RlZmluZSBSRUZfS05PV1NfUEVFTEVEIDA0CisKK3N0cnVjdCByZWZfbGlzdCB7CisJc3RydWN0IHJlZl9saXN0ICpuZXh0OworCXVuc2lnbmVkIGNoYXIgZmxhZzsgLyogSVNTWU1SRUY/IElTUEFDS0VEPyAqLworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBwZWVsZWRbMjBdOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9yZWZfbGluZShjaGFyICpsaW5lLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCS8qCisJICogNDI6IHRoZSBhbnN3ZXIgdG8gZXZlcnl0aGluZy4KKwkgKgorCSAqIEluIHRoaXMgY2FzZSwgaXQgaGFwcGVucyB0byBiZSB0aGUgYW5zd2VyIHRvCisJICogIDQwIChsZW5ndGggb2Ygc2hhMSBoZXggcmVwcmVzZW50YXRpb24pCisJICogICsxIChzcGFjZSBpbiBiZXR3ZWVuIGhleCBhbmQgbmFtZSkKKwkgKiAgKzEgKG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkKKwkgKi8KKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpIC0gNDI7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiBOVUxMOworCWlmIChnZXRfc2hhMV9oZXgobGluZSwgc2hhMSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWlzc3BhY2UobGluZVs0MF0pKQorCQlyZXR1cm4gTlVMTDsKKwlsaW5lICs9IDQxOworCWlmIChpc3NwYWNlKCpsaW5lKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGxpbmVbbGVuXSAhPSAnXG4nKQorCQlyZXR1cm4gTlVMTDsKKwlsaW5lW2xlbl0gPSAwOworCisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmX2xpc3QgKmFkZF9yZWYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQlpbnQgZmxhZywgc3RydWN0IHJlZl9saXN0ICpsaXN0LAorCQkJCXN0cnVjdCByZWZfbGlzdCAqKm5ld19lbnRyeSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCByZWZfbGlzdCAqZW50cnk7CisKKwkvKiBBbGxvY2F0ZSBpdCBhbmQgYWRkIGl0IGluLi4gKi8KKwlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCWVudHJ5ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlZl9saXN0KSArIGxlbik7CisJaGFzaGNweShlbnRyeS0+c2hhMSwgc2hhMSk7CisJaGFzaGNscihlbnRyeS0+cGVlbGVkKTsKKwltZW1jcHkoZW50cnktPm5hbWUsIG5hbWUsIGxlbik7CisJZW50cnktPmZsYWcgPSBmbGFnOworCWVudHJ5LT5uZXh0ID0gbGlzdDsKKwlpZiAobmV3X2VudHJ5KQorCQkqbmV3X2VudHJ5ID0gZW50cnk7CisJcmV0dXJuIGVudHJ5OworfQorCisvKiBtZXJnZSBzb3J0IHRoZSByZWYgbGlzdCAqLworc3RhdGljIHN0cnVjdCByZWZfbGlzdCAqc29ydF9yZWZfbGlzdChzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QpCit7CisJaW50IHBzaXplLCBxc2l6ZSwgbGFzdF9tZXJnZV9jb3VudCwgY21wOworCXN0cnVjdCByZWZfbGlzdCAqcCwgKnEsICpsLCAqZTsKKwlzdHJ1Y3QgcmVmX2xpc3QgKm5ld19saXN0ID0gbGlzdDsKKwlpbnQgayA9IDE7CisJaW50IG1lcmdlX2NvdW50ID0gMDsKKworCWlmICghbGlzdCkKKwkJcmV0dXJuIGxpc3Q7CisKKwlkbyB7CisJCWxhc3RfbWVyZ2VfY291bnQgPSBtZXJnZV9jb3VudDsKKwkJbWVyZ2VfY291bnQgPSAwOworCisJCXBzaXplID0gMDsKKworCQlwID0gbmV3X2xpc3Q7CisJCXEgPSBuZXdfbGlzdDsKKwkJbmV3X2xpc3QgPSBOVUxMOworCQlsID0gTlVMTDsKKworCQl3aGlsZSAocCkgeworCQkJbWVyZ2VfY291bnQrKzsKKworCQkJd2hpbGUgKHBzaXplIDwgayAmJiBxLT5uZXh0KSB7CisJCQkJcSA9IHEtPm5leHQ7CisJCQkJcHNpemUrKzsKKwkJCX0KKwkJCXFzaXplID0gazsKKworCQkJd2hpbGUgKChwc2l6ZSA+IDApIHx8IChxc2l6ZSA+IDAgJiYgcSkpIHsKKwkJCQlpZiAocXNpemUgPT0gMCB8fCAhcSkgeworCQkJCQllID0gcDsKKwkJCQkJcCA9IHAtPm5leHQ7CisJCQkJCXBzaXplLS07CisJCQkJfSBlbHNlIGlmIChwc2l6ZSA9PSAwKSB7CisJCQkJCWUgPSBxOworCQkJCQlxID0gcS0+bmV4dDsKKwkJCQkJcXNpemUtLTsKKwkJCQl9IGVsc2UgeworCQkJCQljbXAgPSBzdHJjbXAocS0+bmFtZSwgcC0+bmFtZSk7CisJCQkJCWlmIChjbXAgPCAwKSB7CisJCQkJCQllID0gcTsKKwkJCQkJCXEgPSBxLT5uZXh0OworCQkJCQkJcXNpemUtLTsKKwkJCQkJfSBlbHNlIGlmIChjbXAgPiAwKSB7CisJCQkJCQllID0gcDsKKwkJCQkJCXAgPSBwLT5uZXh0OworCQkJCQkJcHNpemUtLTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChoYXNoY21wKHEtPnNoYTEsIHAtPnNoYTEpKQorCQkJCQkJCWRpZSgiRHVwbGljYXRlZCByZWYsIGFuZCBTSEExcyBkb24ndCBtYXRjaDogJXMiLAorCQkJCQkJCSAgICBxLT5uYW1lKTsKKwkJCQkJCXdhcm5pbmcoIkR1cGxpY2F0ZWQgcmVmOiAlcyIsIHEtPm5hbWUpOworCQkJCQkJZSA9IHE7CisJCQkJCQlxID0gcS0+bmV4dDsKKwkJCQkJCXFzaXplLS07CisJCQkJCQlmcmVlKGUpOworCQkJCQkJZSA9IHA7CisJCQkJCQlwID0gcC0+bmV4dDsKKwkJCQkJCXBzaXplLS07CisJCQkJCX0KKwkJCQl9CisKKwkJCQllLT5uZXh0ID0gTlVMTDsKKworCQkJCWlmIChsKQorCQkJCQlsLT5uZXh0ID0gZTsKKwkJCQlpZiAoIW5ld19saXN0KQorCQkJCQluZXdfbGlzdCA9IGU7CisJCQkJbCA9IGU7CisJCQl9CisKKwkJCXAgPSBxOworCQl9OworCisJCWsgPSBrICogMjsKKwl9IHdoaWxlICgobGFzdF9tZXJnZV9jb3VudCAhPSBtZXJnZV9jb3VudCkgfHwgKGxhc3RfbWVyZ2VfY291bnQgIT0gMSkpOworCisJcmV0dXJuIG5ld19saXN0OworfQorCisvKgorICogRnV0dXJlOiBuZWVkIHRvIGJlIGluICJzdHJ1Y3QgcmVwb3NpdG9yeSIKKyAqIHdoZW4gZG9pbmcgYSBmdWxsIGxpYmlmaWNhdGlvbi4KKyAqLworc3RydWN0IGNhY2hlZF9yZWZzIHsKKwljaGFyIGRpZF9sb29zZTsKKwljaGFyIGRpZF9wYWNrZWQ7CisJc3RydWN0IHJlZl9saXN0ICpsb29zZTsKKwlzdHJ1Y3QgcmVmX2xpc3QgKnBhY2tlZDsKK30gY2FjaGVkX3JlZnM7CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVmX2xpc3Qoc3RydWN0IHJlZl9saXN0ICpsaXN0KQoreworCXN0cnVjdCByZWZfbGlzdCAqbmV4dDsKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBuZXh0KSB7CisJCW5leHQgPSBsaXN0LT5uZXh0OworCQlmcmVlKGxpc3QpOworCX0KK30KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9jYWNoZWRfcmVmcyh2b2lkKQoreworCXN0cnVjdCBjYWNoZWRfcmVmcyAqY2EgPSAmY2FjaGVkX3JlZnM7CisKKwlpZiAoY2EtPmRpZF9sb29zZSAmJiBjYS0+bG9vc2UpCisJCWZyZWVfcmVmX2xpc3QoY2EtPmxvb3NlKTsKKwlpZiAoY2EtPmRpZF9wYWNrZWQgJiYgY2EtPnBhY2tlZCkKKwkJZnJlZV9yZWZfbGlzdChjYS0+cGFja2VkKTsKKwljYS0+bG9vc2UgPSBjYS0+cGFja2VkID0gTlVMTDsKKwljYS0+ZGlkX2xvb3NlID0gY2EtPmRpZF9wYWNrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCByZWFkX3BhY2tlZF9yZWZzKEZJTEUgKmYsIHN0cnVjdCBjYWNoZWRfcmVmcyAqY2FjaGVkX3JlZnMpCit7CisJc3RydWN0IHJlZl9saXN0ICpsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmX2xpc3QgKmxhc3QgPSBOVUxMOworCWNoYXIgcmVmbGluZVtQQVRIX01BWF07CisJaW50IGZsYWcgPSBSRUZfSVNQQUNLRUQ7CisKKwl3aGlsZSAoZmdldHMocmVmbGluZSwgc2l6ZW9mKHJlZmxpbmUpLCBmKSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljb25zdCBjaGFyICpuYW1lOworCQlzdGF0aWMgY29uc3QgY2hhciBoZWFkZXJbXSA9ICIjIHBhY2stcmVmcyB3aXRoOiI7CisKKwkJaWYgKCFzdHJuY21wKHJlZmxpbmUsIGhlYWRlciwgc2l6ZW9mKGhlYWRlciktMSkpIHsKKwkJCWNvbnN0IGNoYXIgKnRyYWl0cyA9IHJlZmxpbmUgKyBzaXplb2YoaGVhZGVyKSAtIDE7CisJCQlpZiAoc3Ryc3RyKHRyYWl0cywgIiBwZWVsZWQgIikpCisJCQkJZmxhZyB8PSBSRUZfS05PV1NfUEVFTEVEOworCQkJLyogcGVyaGFwcyBvdGhlciB0cmFpdHMgbGF0ZXIgYXMgd2VsbCAqLworCQkJY29udGludWU7CisJCX0KKworCQluYW1lID0gcGFyc2VfcmVmX2xpbmUocmVmbGluZSwgc2hhMSk7CisJCWlmIChuYW1lKSB7CisJCQlsaXN0ID0gYWRkX3JlZihuYW1lLCBzaGExLCBmbGFnLCBsaXN0LCAmbGFzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGFzdCAmJgorCQkgICAgcmVmbGluZVswXSA9PSAnXicgJiYKKwkJICAgIHN0cmxlbihyZWZsaW5lKSA9PSA0MiAmJgorCQkgICAgcmVmbGluZVs0MV0gPT0gJ1xuJyAmJgorCQkgICAgIWdldF9zaGExX2hleChyZWZsaW5lICsgMSwgc2hhMSkpCisJCQloYXNoY3B5KGxhc3QtPnBlZWxlZCwgc2hhMSk7CisJfQorCWNhY2hlZF9yZWZzLT5wYWNrZWQgPSBzb3J0X3JlZl9saXN0KGxpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9saXN0ICpnZXRfcGFja2VkX3JlZnModm9pZCkKK3sKKwlpZiAoIWNhY2hlZF9yZWZzLmRpZF9wYWNrZWQpIHsKKwkJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJwYWNrZWQtcmVmcyIpLCAiciIpOworCQljYWNoZWRfcmVmcy5wYWNrZWQgPSBOVUxMOworCQlpZiAoZikgeworCQkJcmVhZF9wYWNrZWRfcmVmcyhmLCAmY2FjaGVkX3JlZnMpOworCQkJZmNsb3NlKGYpOworCQl9CisJCWNhY2hlZF9yZWZzLmRpZF9wYWNrZWQgPSAxOworCX0KKwlyZXR1cm4gY2FjaGVkX3JlZnMucGFja2VkOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9saXN0ICpnZXRfcmVmX2Rpcihjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKGdpdF9wYXRoKCIlcyIsIGJhc2UpKTsKKworCWlmIChkaXIpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCQljaGFyICpyZWYgPSB4bWFsbG9jKGJhc2VsZW4gKyAyNTcpOworCisJCW1lbWNweShyZWYsIGJhc2UsIGJhc2VsZW4pOworCQlpZiAoYmFzZWxlbiAmJiBiYXNlW2Jhc2VsZW4tMV0gIT0gJy8nKQorCQkJcmVmW2Jhc2VsZW4rK10gPSAnLyc7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IGZsYWc7CisJCQlpbnQgbmFtZWxlbjsKKworCQkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJCWNvbnRpbnVlOworCQkJbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJCWlmIChuYW1lbGVuID4gMjU1KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5sb2NrIikpCisJCQkJY29udGludWU7CisJCQltZW1jcHkocmVmICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJCWlmIChzdGF0KGdpdF9wYXRoKCIlcyIsIHJlZiksICZzdCkgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQlsaXN0ID0gZ2V0X3JlZl9kaXIocmVmLCBsaXN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcmVzb2x2ZV9yZWYocmVmLCBzaGExLCAxLCAmZmxhZykpIHsKKwkJCQllcnJvcigiJXMgcG9pbnRzIG5vd2hlcmUhIiwgcmVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxpc3QgPSBhZGRfcmVmKHJlZiwgc2hhMSwgZmxhZywgbGlzdCwgTlVMTCk7CisJCX0KKwkJZnJlZShyZWYpOworCQljbG9zZWRpcihkaXIpOworCX0KKwlyZXR1cm4gc29ydF9yZWZfbGlzdChsaXN0KTsKK30KKworc3RhdGljIHN0cnVjdCByZWZfbGlzdCAqZ2V0X2xvb3NlX3JlZnModm9pZCkKK3sKKwlpZiAoIWNhY2hlZF9yZWZzLmRpZF9sb29zZSkgeworCQljYWNoZWRfcmVmcy5sb29zZSA9IGdldF9yZWZfZGlyKCJyZWZzIiwgTlVMTCk7CisJCWNhY2hlZF9yZWZzLmRpZF9sb29zZSA9IDE7CisJfQorCXJldHVybiBjYWNoZWRfcmVmcy5sb29zZTsKK30KKworLyogV2UgYWxsb3cgInJlY3Vyc2l2ZSIgc3ltYm9saWMgcmVmcy4gT25seSB3aXRoaW4gcmVhc29uLCB0aG91Z2ggKi8KKyNkZWZpbmUgTUFYREVQVEggNQorI2RlZmluZSBNQVhSRUZMRU4gKDEwMjQpCisKK3N0YXRpYyBpbnQgcmVzb2x2ZV9naXRsaW5rX3BhY2tlZF9yZWYoY2hhciAqbmFtZSwgaW50IHBhdGhsZW4sIGNvbnN0IGNoYXIgKnJlZm5hbWUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCkKK3sKKwlGSUxFICpmOworCXN0cnVjdCBjYWNoZWRfcmVmcyByZWZzOworCXN0cnVjdCByZWZfbGlzdCAqcmVmOworCWludCByZXR2YWw7CisKKwlzdHJjcHkobmFtZSArIHBhdGhsZW4sICJwYWNrZWQtcmVmcyIpOworCWYgPSBmb3BlbihuYW1lLCAiciIpOworCWlmICghZikKKwkJcmV0dXJuIC0xOworCXJlYWRfcGFja2VkX3JlZnMoZiwgJnJlZnMpOworCWZjbG9zZShmKTsKKwlyZWYgPSByZWZzLnBhY2tlZDsKKwlyZXR2YWwgPSAtMTsKKwl3aGlsZSAocmVmKSB7CisJCWlmICghc3RyY21wKHJlZi0+bmFtZSwgcmVmbmFtZSkpIHsKKwkJCXJldHZhbCA9IDA7CisJCQltZW1jcHkocmVzdWx0LCByZWYtPnNoYTEsIDIwKTsKKwkJCWJyZWFrOworCQl9CisJCXJlZiA9IHJlZi0+bmV4dDsKKwl9CisJZnJlZV9yZWZfbGlzdChyZWZzLnBhY2tlZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCByZXNvbHZlX2dpdGxpbmtfcmVmX3JlY3Vyc2l2ZShjaGFyICpuYW1lLCBpbnQgcGF0aGxlbiwgY29uc3QgY2hhciAqcmVmbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCBpbnQgcmVjdXJzaW9uKQoreworCWludCBmZCwgbGVuID0gc3RybGVuKHJlZm5hbWUpOworCWNoYXIgYnVmZmVyWzEyOF0sICpwOworCisJaWYgKHJlY3Vyc2lvbiA+IE1BWERFUFRIIHx8IGxlbiA+IE1BWFJFRkxFTikKKwkJcmV0dXJuIC0xOworCW1lbWNweShuYW1lICsgcGF0aGxlbiwgcmVmbmFtZSwgbGVuKzEpOworCWZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIHJlc29sdmVfZ2l0bGlua19wYWNrZWRfcmVmKG5hbWUsIHBhdGhsZW4sIHJlZm5hbWUsIHJlc3VsdCk7CisKKwlsZW4gPSByZWFkKGZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCWNsb3NlKGZkKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChsZW4gJiYgaXNzcGFjZShidWZmZXJbbGVuLTFdKSkKKwkJbGVuLS07CisJYnVmZmVyW2xlbl0gPSAwOworCisJLyogV2FzIGl0IGEgZGV0YWNoZWQgaGVhZCBvciBhbiBvbGQtZmFzaGlvbmVkIHN5bWxpbms/ICovCisJaWYgKCFnZXRfc2hhMV9oZXgoYnVmZmVyLCByZXN1bHQpKQorCQlyZXR1cm4gMDsKKworCS8qIFN5bXJlZj8gKi8KKwlpZiAoc3RybmNtcChidWZmZXIsICJyZWY6IiwgNCkpCisJCXJldHVybiAtMTsKKwlwID0gYnVmZmVyICsgNDsKKwl3aGlsZSAoaXNzcGFjZSgqcCkpCisJCXArKzsKKworCXJldHVybiByZXNvbHZlX2dpdGxpbmtfcmVmX3JlY3Vyc2l2ZShuYW1lLCBwYXRobGVuLCBwLCByZXN1bHQsIHJlY3Vyc2lvbisxKTsKK30KKworaW50IHJlc29sdmVfZ2l0bGlua19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcmVmbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0KQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCksIHJldHZhbDsKKwljaGFyICpnaXRkaXI7CisKKwl3aGlsZSAobGVuICYmIHBhdGhbbGVuLTFdID09ICcvJykKKwkJbGVuLS07CisJaWYgKCFsZW4pCisJCXJldHVybiAtMTsKKwlnaXRkaXIgPSB4bWFsbG9jKGxlbiArIE1BWFJFRkxFTiArIDgpOworCW1lbWNweShnaXRkaXIsIHBhdGgsIGxlbik7CisJbWVtY3B5KGdpdGRpciArIGxlbiwgIi8uZ2l0LyIsIDcpOworCisJcmV0dmFsID0gcmVzb2x2ZV9naXRsaW5rX3JlZl9yZWN1cnNpdmUoZ2l0ZGlyLCBsZW4rNiwgcmVmbmFtZSwgcmVzdWx0LCAwKTsKKwlmcmVlKGdpdGRpcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworY29uc3QgY2hhciAqcmVzb2x2ZV9yZWYoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgcmVhZGluZywgaW50ICpmbGFnKQoreworCWludCBkZXB0aCA9IE1BWERFUFRILCBsZW47CisJY2hhciBidWZmZXJbMjU2XTsKKwlzdGF0aWMgY2hhciByZWZfYnVmZmVyWzI1Nl07CisKKwlpZiAoZmxhZykKKwkJKmZsYWcgPSAwOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICpwYXRoID0gZ2l0X3BhdGgoIiVzIiwgcmVmKTsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKmJ1ZjsKKwkJaW50IGZkOworCisJCWlmICgtLWRlcHRoIDwgMCkKKwkJCXJldHVybiBOVUxMOworCisJCS8qIFNwZWNpYWwgY2FzZTogbm9uLWV4aXN0aW5nIGZpbGUuCisJCSAqIE5vdCBoYXZpbmcgdGhlIHJlZnMvaGVhZHMvbmV3LWJyYW5jaCBpcyBPSworCQkgKiBpZiB3ZSBhcmUgd3JpdGluZyBpbnRvIGl0LCBzbyBpcyAuZ2l0L0hFQUQKKwkJICogdGhhdCBwb2ludHMgYXQgcmVmcy9oZWFkcy9tYXN0ZXIgc3RpbGwgdG8gYmUKKwkJICogYm9ybi4gIEl0IGlzIE5PVCBPSyBpZiB3ZSBhcmUgcmVzb2x2aW5nIGZvcgorCQkgKiByZWFkaW5nLgorCQkgKi8KKwkJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKSB7CisJCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QgPSBnZXRfcGFja2VkX3JlZnMoKTsKKwkJCXdoaWxlIChsaXN0KSB7CisJCQkJaWYgKCFzdHJjbXAocmVmLCBsaXN0LT5uYW1lKSkgeworCQkJCQloYXNoY3B5KHNoYTEsIGxpc3QtPnNoYTEpOworCQkJCQlpZiAoZmxhZykKKwkJCQkJCSpmbGFnIHw9IFJFRl9JU1BBQ0tFRDsKKwkJCQkJcmV0dXJuIHJlZjsKKwkJCQl9CisJCQkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCQl9CisJCQlpZiAocmVhZGluZyB8fCBlcnJubyAhPSBFTk9FTlQpCisJCQkJcmV0dXJuIE5VTEw7CisJCQloYXNoY2xyKHNoYTEpOworCQkJcmV0dXJuIHJlZjsKKwkJfQorCisJCS8qIEZvbGxvdyAibm9ybWFsaXplZCIgLSBpZSAicmVmcy8uLiIgc3ltbGlua3MgYnkgaGFuZCAqLworCQlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJbGVuID0gcmVhZGxpbmsocGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZmZlciwgNSkpIHsKKwkJCQlidWZmZXJbbGVuXSA9IDA7CisJCQkJc3RyY3B5KHJlZl9idWZmZXIsIGJ1ZmZlcik7CisJCQkJcmVmID0gcmVmX2J1ZmZlcjsKKwkJCQlpZiAoZmxhZykKKwkJCQkJKmZsYWcgfD0gUkVGX0lTU1lNUkVGOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogSXMgaXQgYSBkaXJlY3Rvcnk/ICovCisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQllcnJubyA9IEVJU0RJUjsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyoKKwkJICogQW55dGhpbmcgZWxzZSwganVzdCBvcGVuIGl0IGFuZCB0cnkgdG8gdXNlIGl0IGFzCisJCSAqIGEgcmVmCisJCSAqLworCQlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWxlbiA9IHJlYWRfaW5fZnVsbChmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJY2xvc2UoZmQpOworCisJCS8qCisJCSAqIElzIGl0IGEgc3ltYm9saWMgcmVmPworCQkgKi8KKwkJaWYgKGxlbiA8IDQgfHwgbWVtY21wKCJyZWY6IiwgYnVmZmVyLCA0KSkKKwkJCWJyZWFrOworCQlidWYgPSBidWZmZXIgKyA0OworCQlsZW4gLT0gNDsKKwkJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKCpidWYpKQorCQkJYnVmKyssIGxlbi0tOworCQl3aGlsZSAobGVuICYmIGlzc3BhY2UoYnVmW2xlbi0xXSkpCisJCQlsZW4tLTsKKwkJYnVmW2xlbl0gPSAwOworCQltZW1jcHkocmVmX2J1ZmZlciwgYnVmLCBsZW4gKyAxKTsKKwkJcmVmID0gcmVmX2J1ZmZlcjsKKwkJaWYgKGZsYWcpCisJCQkqZmxhZyB8PSBSRUZfSVNTWU1SRUY7CisJfQorCWlmIChsZW4gPCA0MCB8fCBnZXRfc2hhMV9oZXgoYnVmZmVyLCBzaGExKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJlZjsKK30KKworaW50IHJlYWRfcmVmKGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAocmVzb2x2ZV9yZWYocmVmLCBzaGExLCAxLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRvX29uZV9yZWYoY29uc3QgY2hhciAqYmFzZSwgZWFjaF9yZWZfZm4gZm4sIGludCB0cmltLAorCQkgICAgICB2b2lkICpjYl9kYXRhLCBzdHJ1Y3QgcmVmX2xpc3QgKmVudHJ5KQoreworCWlmIChzdHJuY21wKGJhc2UsIGVudHJ5LT5uYW1lLCB0cmltKSkKKwkJcmV0dXJuIDA7CisJaWYgKGlzX251bGxfc2hhMShlbnRyeS0+c2hhMSkpCisJCXJldHVybiAwOworCWlmICghaGFzX3NoYTFfZmlsZShlbnRyeS0+c2hhMSkpIHsKKwkJZXJyb3IoIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgb2JqZWN0ISIsIGVudHJ5LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBmbihlbnRyeS0+bmFtZSArIHRyaW0sIGVudHJ5LT5zaGExLCBlbnRyeS0+ZmxhZywgY2JfZGF0YSk7Cit9CisKK2ludCBwZWVsX3JlZihjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGZsYWc7CisJdW5zaWduZWQgY2hhciBiYXNlWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJaWYgKCFyZXNvbHZlX3JlZihyZWYsIGJhc2UsIDEsICZmbGFnKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKChmbGFnICYgUkVGX0lTUEFDS0VEKSkgeworCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QgPSBnZXRfcGFja2VkX3JlZnMoKTsKKworCQl3aGlsZSAobGlzdCkgeworCQkJaWYgKCFzdHJjbXAobGlzdC0+bmFtZSwgcmVmKSkgeworCQkJCWlmIChsaXN0LT5mbGFnICYgUkVGX0tOT1dTX1BFRUxFRCkgeworCQkJCQloYXNoY3B5KHNoYTEsIGxpc3QtPnBlZWxlZCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkvKiBvbGRlciBwYWNrLXJlZnMgZGlkIG5vdCBsZWF2ZSBwZWVsZWQgb25lcyAqLworCQkJCWJyZWFrOworCQkJfQorCQkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCX0KKwl9CisKKwkvKiBmYWxsYmFjayAtIGNhbGxlcnMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgZm9yIHVucGFja2VkIHJlZnMgKi8KKwlvID0gcGFyc2Vfb2JqZWN0KGJhc2UpOworCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCByZWYsIDApOworCQlpZiAobykgeworCQkJaGFzaGNweShzaGExLCBvLT5zaGExKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkb19mb3JfZWFjaF9yZWYoY29uc3QgY2hhciAqYmFzZSwgZWFjaF9yZWZfZm4gZm4sIGludCB0cmltLAorCQkJICAgdm9pZCAqY2JfZGF0YSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCByZWZfbGlzdCAqcGFja2VkID0gZ2V0X3BhY2tlZF9yZWZzKCk7CisJc3RydWN0IHJlZl9saXN0ICpsb29zZSA9IGdldF9sb29zZV9yZWZzKCk7CisKKwl3aGlsZSAocGFja2VkICYmIGxvb3NlKSB7CisJCXN0cnVjdCByZWZfbGlzdCAqZW50cnk7CisJCWludCBjbXAgPSBzdHJjbXAocGFja2VkLT5uYW1lLCBsb29zZS0+bmFtZSk7CisJCWlmICghY21wKSB7CisJCQlwYWNrZWQgPSBwYWNrZWQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY21wID4gMCkgeworCQkJZW50cnkgPSBsb29zZTsKKwkJCWxvb3NlID0gbG9vc2UtPm5leHQ7CisJCX0gZWxzZSB7CisJCQllbnRyeSA9IHBhY2tlZDsKKwkJCXBhY2tlZCA9IHBhY2tlZC0+bmV4dDsKKwkJfQorCQlyZXR2YWwgPSBkb19vbmVfcmVmKGJhc2UsIGZuLCB0cmltLCBjYl9kYXRhLCBlbnRyeSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWZvciAocGFja2VkID0gcGFja2VkID8gcGFja2VkIDogbG9vc2U7IHBhY2tlZDsgcGFja2VkID0gcGFja2VkLT5uZXh0KSB7CisJCXJldHZhbCA9IGRvX29uZV9yZWYoYmFzZSwgZm4sIHRyaW0sIGNiX2RhdGEsIHBhY2tlZCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGhlYWRfcmVmKGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IGZsYWc7CisKKwlpZiAocmVzb2x2ZV9yZWYoIkhFQUQiLCBzaGExLCAxLCAmZmxhZykpCisJCXJldHVybiBmbigiSEVBRCIsIHNoYTEsIGZsYWcsIGNiX2RhdGEpOworCXJldHVybiAwOworfQorCitpbnQgZm9yX2VhY2hfcmVmKGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMvIiwgZm4sIDAsIGNiX2RhdGEpOworfQorCitpbnQgZm9yX2VhY2hfdGFnX3JlZihlYWNoX3JlZl9mbiBmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL3RhZ3MvIiwgZm4sIDEwLCBjYl9kYXRhKTsKK30KKworaW50IGZvcl9lYWNoX2JyYW5jaF9yZWYoZWFjaF9yZWZfZm4gZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJcmV0dXJuIGRvX2Zvcl9lYWNoX3JlZigicmVmcy9oZWFkcy8iLCBmbiwgMTEsIGNiX2RhdGEpOworfQorCitpbnQgZm9yX2VhY2hfcmVtb3RlX3JlZihlYWNoX3JlZl9mbiBmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL3JlbW90ZXMvIiwgZm4sIDEzLCBjYl9kYXRhKTsKK30KKworLyogTkVFRFNXT1JLOiBUaGlzIGlzIG9ubHkgdXNlZCBieSBzc2gtdXBsb2FkIGFuZCBpdCBzaG91bGQgZ287IHRoZQorICogY2FsbGVyIHNob3VsZCBkbyByZXNvbHZlX3JlZiBvciByZWFkX3JlZiBsaWtlIGV2ZXJ5Ym9keSBlbHNlLiAgT3IKKyAqIG1heWJlIGV2ZXJ5Ym9keSBlbHNlIHNob3VsZCB1c2UgZ2V0X3JlZl9zaGExKCkgaW5zdGVhZCBvZiBkb2luZworICogcmVhZF9yZWYoKS4KKyAqLworaW50IGdldF9yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiByZWFkX3JlZihta3BhdGgoInJlZnMvJXMiLCByZWYpLCBzaGExKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSAicmVmIiBpcyBzb21ldGhpbmcgcmVhc29uYWJsZSB0byBoYXZlIHVuZGVyICIuZ2l0L3JlZnMvIjsKKyAqIFdlIGRvIG5vdCBsaWtlIGl0IGlmOgorICoKKyAqIC0gYW55IHBhdGggY29tcG9uZW50IG9mIGl0IGJlZ2lucyB3aXRoICIuIiwgb3IKKyAqIC0gaXQgaGFzIGRvdWJsZSBkb3RzICIuLiIsIG9yCisgKiAtIGl0IGhhcyBBU0NJSSBjb250cm9sIGNoYXJhY3RlciwgIn4iLCAiXiIsICI6IiBvciBTUCwgYW55d2hlcmUsIG9yCisgKiAtIGl0IGVuZHMgd2l0aCBhICIvIi4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBiYWRfcmVmX2NoYXIoaW50IGNoKQoreworCXJldHVybiAoKCh1bnNpZ25lZCkgY2gpIDw9ICcgJyB8fAorCQljaCA9PSAnficgfHwgY2ggPT0gJ14nIHx8IGNoID09ICc6JyB8fAorCQkvKiAyLjEzIFBhdHRlcm4gTWF0Y2hpbmcgTm90YXRpb24gKi8KKwkJY2ggPT0gJz8nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnWycpOworfQorCitpbnQgY2hlY2tfcmVmX2Zvcm1hdChjb25zdCBjaGFyICpyZWYpCit7CisJaW50IGNoLCBsZXZlbDsKKwljb25zdCBjaGFyICpjcCA9IHJlZjsKKworCWxldmVsID0gMDsKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoKGNoID0gKmNwKyspID09ICcvJykKKwkJCTsgLyogdG9sZXJhdGUgZHVwbGljYXRlZCBzbGFzaGVzICovCisJCWlmICghY2gpCisJCQlyZXR1cm4gLTE7IC8qIHNob3VsZCBub3QgZW5kIHdpdGggc2xhc2hlcyAqLworCisJCS8qIHdlIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIGNvbXBvbmVudCAqLworCQlpZiAoY2ggPT0gJy4nIHx8IGJhZF9yZWZfY2hhcihjaCkpCisJCQlyZXR1cm4gLTE7CisKKwkJLyogc2NhbiB0aGUgcmVzdCBvZiB0aGUgcGF0aCBjb21wb25lbnQgKi8KKwkJd2hpbGUgKChjaCA9ICpjcCsrKSAhPSAwKSB7CisJCQlpZiAoYmFkX3JlZl9jaGFyKGNoKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoY2ggPT0gJy8nKQorCQkJCWJyZWFrOworCQkJaWYgKGNoID09ICcuJyAmJiAqY3AgPT0gJy4nKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlsZXZlbCsrOworCQlpZiAoIWNoKSB7CisJCQlpZiAobGV2ZWwgPCAyKQorCQkJCXJldHVybiAtMjsgLyogYXQgbGVhc3Qgb2YgZm9ybSAiaGVhZHMvYmxhaCIgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHJlZl9sb2NrICp2ZXJpZnlfbG9jayhzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssCisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpCit7CisJaWYgKCFyZXNvbHZlX3JlZihsb2NrLT5yZWZfbmFtZSwgbG9jay0+b2xkX3NoYTEsIG11c3RleGlzdCwgTlVMTCkpIHsKKwkJZXJyb3IoIkNhbid0IHZlcmlmeSByZWYgJXMiLCBsb2NrLT5yZWZfbmFtZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaGFzaGNtcChsb2NrLT5vbGRfc2hhMSwgb2xkX3NoYTEpKSB7CisJCWVycm9yKCJSZWYgJXMgaXMgYXQgJXMgYnV0IGV4cGVjdGVkICVzIiwgbG9jay0+cmVmX25hbWUsCisJCQlzaGExX3RvX2hleChsb2NrLT5vbGRfc2hhMSksIHNoYTFfdG9faGV4KG9sZF9zaGExKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbG9jazsKK30KKworc3RhdGljIGludCByZW1vdmVfZW1wdHlfZGlyX3JlY3Vyc2l2ZShjaGFyICpwYXRoLCBpbnQgbGVuKQoreworCURJUiAqZGlyID0gb3BlbmRpcihwYXRoKTsKKwlzdHJ1Y3QgZGlyZW50ICplOworCWludCByZXQgPSAwOworCisJaWYgKCFkaXIpCisJCXJldHVybiAtMTsKKwlpZiAocGF0aFtsZW4tMV0gIT0gJy8nKQorCQlwYXRoW2xlbisrXSA9ICcvJzsKKwl3aGlsZSAoKGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCBuYW1sZW47CisJCWlmICgoZS0+ZF9uYW1lWzBdID09ICcuJykgJiYKKwkJICAgICgoZS0+ZF9uYW1lWzFdID09IDApIHx8CisJCSAgICAgKChlLT5kX25hbWVbMV0gPT0gJy4nKSAmJiBlLT5kX25hbWVbMl0gPT0gMCkpKQorCQkJY29udGludWU7IC8qICIuIiBhbmQgIi4uIiAqLworCisJCW5hbWxlbiA9IHN0cmxlbihlLT5kX25hbWUpOworCQlpZiAoKGxlbiArIG5hbWxlbiA8IFBBVEhfTUFYKSAmJgorCQkgICAgc3RyY3B5KHBhdGggKyBsZW4sIGUtPmRfbmFtZSkgJiYKKwkJICAgICFsc3RhdChwYXRoLCAmc3QpICYmCisJCSAgICBTX0lTRElSKHN0LnN0X21vZGUpICYmCisJCSAgICAhcmVtb3ZlX2VtcHR5X2Rpcl9yZWN1cnNpdmUocGF0aCwgbGVuICsgbmFtbGVuKSkKKwkJCWNvbnRpbnVlOyAvKiBoYXBweSAqLworCisJCS8qIHBhdGggdG9vIGxvbmcsIHN0YXQgZmFpbHMsIG9yIG5vbi1kaXJlY3Rvcnkgc3RpbGwgZXhpc3RzICovCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlpZiAoIXJldCkgeworCQlwYXRoW2xlbl0gPSAwOworCQlyZXQgPSBybWRpcihwYXRoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZW1vdmVfZW1wdHlfZGlyZWN0b3JpZXMoY2hhciAqZmlsZSkKK3sKKwkvKiB3ZSB3YW50IHRvIGNyZWF0ZSBhIGZpbGUgYnV0IHRoZXJlIGlzIGEgZGlyZWN0b3J5IHRoZXJlOworCSAqIGlmIHRoYXQgaXMgYW4gZW1wdHkgZGlyZWN0b3J5IChvciBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zCisJICogb25seSBlbXB0eSBkaXJlY3RvcmllcyksIHJlbW92ZSB0aGVtLgorCSAqLworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGxlbiA9IHN0cmxlbihmaWxlKTsKKworCWlmIChsZW4gPj0gUEFUSF9NQVgpIC8qIHBhdGggdG9vIGxvbmcgOy0pICovCisJCXJldHVybiAtMTsKKwlzdHJjcHkocGF0aCwgZmlsZSk7CisJcmV0dXJuIHJlbW92ZV9lbXB0eV9kaXJfcmVjdXJzaXZlKHBhdGgsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmVmbmFtZV9hdmFpbGFibGUoY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICpvbGRyZWYsCisJCQkJc3RydWN0IHJlZl9saXN0ICpsaXN0LCBpbnQgcXVpZXQpCit7CisJaW50IG5hbWxlbiA9IHN0cmxlbihyZWYpOyAvKiBlLmcuICdmb28vYmFyJyAqLworCXdoaWxlIChsaXN0KSB7CisJCS8qIGxpc3QtPm5hbWUgY291bGQgYmUgJ2Zvbycgb3IgJ2Zvby9iYXIvYmF6JyAqLworCQlpZiAoIW9sZHJlZiB8fCBzdHJjbXAob2xkcmVmLCBsaXN0LT5uYW1lKSkgeworCQkJaW50IGxlbiA9IHN0cmxlbihsaXN0LT5uYW1lKTsKKwkJCWludCBjbXBsZW4gPSAobmFtbGVuIDwgbGVuKSA/IG5hbWxlbiA6IGxlbjsKKwkJCWNvbnN0IGNoYXIgKmxlYWQgPSAobmFtbGVuIDwgbGVuKSA/IGxpc3QtPm5hbWUgOiByZWY7CisJCQlpZiAoIXN0cm5jbXAocmVmLCBsaXN0LT5uYW1lLCBjbXBsZW4pICYmCisJCQkgICAgbGVhZFtjbXBsZW5dID09ICcvJykgeworCQkJCWlmICghcXVpZXQpCisJCQkJCWVycm9yKCInJXMnIGV4aXN0czsgY2Fubm90IGNyZWF0ZSAnJXMnIiwKKwkJCQkJICAgICAgbGlzdC0+bmFtZSwgcmVmKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmX2xvY2sgKmxvY2tfcmVmX3NoYTFfYmFzaWMoY29uc3QgY2hhciAqcmVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwgaW50ICpmbGFnKQoreworCWNoYXIgKnJlZl9maWxlOworCWNvbnN0IGNoYXIgKm9yaWdfcmVmID0gcmVmOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgbGFzdF9lcnJubyA9IDA7CisJaW50IG11c3RleGlzdCA9IChvbGRfc2hhMSAmJiAhaXNfbnVsbF9zaGExKG9sZF9zaGExKSk7CisKKwlsb2NrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJlZl9sb2NrKSk7CisJbG9jay0+bG9ja19mZCA9IC0xOworCisJcmVmID0gcmVzb2x2ZV9yZWYocmVmLCBsb2NrLT5vbGRfc2hhMSwgbXVzdGV4aXN0LCBmbGFnKTsKKwlpZiAoIXJlZiAmJiBlcnJubyA9PSBFSVNESVIpIHsKKwkJLyogd2UgYXJlIHRyeWluZyB0byBsb2NrIGZvbyBidXQgd2UgdXNlZCB0bworCQkgKiBoYXZlIGZvby9iYXIgd2hpY2ggbm93IGRvZXMgbm90IGV4aXN0OworCQkgKiBpdCBpcyBub3JtYWwgZm9yIHRoZSBlbXB0eSBkaXJlY3RvcnkgJ2ZvbycKKwkJICogdG8gcmVtYWluLgorCQkgKi8KKwkJcmVmX2ZpbGUgPSBnaXRfcGF0aCgiJXMiLCBvcmlnX3JlZik7CisJCWlmIChyZW1vdmVfZW1wdHlfZGlyZWN0b3JpZXMocmVmX2ZpbGUpKSB7CisJCQlsYXN0X2Vycm5vID0gZXJybm87CisJCQllcnJvcigidGhlcmUgYXJlIHN0aWxsIHJlZnMgdW5kZXIgJyVzJyIsIG9yaWdfcmVmKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJCXJlZiA9IHJlc29sdmVfcmVmKG9yaWdfcmVmLCBsb2NrLT5vbGRfc2hhMSwgbXVzdGV4aXN0LCBmbGFnKTsKKwl9CisJaWYgKCFyZWYpIHsKKwkJbGFzdF9lcnJubyA9IGVycm5vOworCQllcnJvcigidW5hYmxlIHRvIHJlc29sdmUgcmVmZXJlbmNlICVzOiAlcyIsCisJCQlvcmlnX3JlZiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCS8qIFdoZW4gdGhlIHJlZiBkaWQgbm90IGV4aXN0IGFuZCB3ZSBhcmUgY3JlYXRpbmcgaXQsCisJICogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlZiB0aGF0IGlzIHBhY2tlZAorCSAqIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggb3VyIHJlZm5hbWUsIG5vciBhIHJlZiB3aG9zZQorCSAqIG5hbWUgaXMgYSBwcm9wZXIgcHJlZml4IG9mIG91ciByZWZuYW1lLgorCSAqLworCWlmIChpc19udWxsX3NoYTEobG9jay0+b2xkX3NoYTEpICYmCisgICAgICAgICAgICAhaXNfcmVmbmFtZV9hdmFpbGFibGUocmVmLCBOVUxMLCBnZXRfcGFja2VkX3JlZnMoKSwgMCkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJbG9jay0+bGsgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbG9ja19maWxlKSk7CisKKwlsb2NrLT5yZWZfbmFtZSA9IHhzdHJkdXAocmVmKTsKKwlsb2NrLT5vcmlnX3JlZl9uYW1lID0geHN0cmR1cChvcmlnX3JlZik7CisJcmVmX2ZpbGUgPSBnaXRfcGF0aCgiJXMiLCByZWYpOworCWxvY2stPmZvcmNlX3dyaXRlID0gbHN0YXQocmVmX2ZpbGUsICZzdCkgJiYgZXJybm8gPT0gRU5PRU5UOworCisJaWYgKHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMocmVmX2ZpbGUpKSB7CisJCWxhc3RfZXJybm8gPSBlcnJubzsKKwkJZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAlcyIsIHJlZl9maWxlKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWxvY2stPmxvY2tfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxvY2stPmxrLCByZWZfZmlsZSwgMSk7CisKKwlyZXR1cm4gb2xkX3NoYTEgPyB2ZXJpZnlfbG9jayhsb2NrLCBvbGRfc2hhMSwgbXVzdGV4aXN0KSA6IGxvY2s7CisKKyBlcnJvcl9yZXR1cm46CisJdW5sb2NrX3JlZihsb2NrKTsKKwllcnJubyA9IGxhc3RfZXJybm87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCWNoYXIgcmVmcGF0aFtQQVRIX01BWF07CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJcmV0dXJuIE5VTEw7CisJc3RyY3B5KHJlZnBhdGgsIG1rcGF0aCgicmVmcy8lcyIsIHJlZikpOworCXJldHVybiBsb2NrX3JlZl9zaGExX2Jhc2ljKHJlZnBhdGgsIG9sZF9zaGExLCBOVUxMKTsKK30KKworc3RydWN0IHJlZl9sb2NrICpsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCWlmIChjaGVja19yZWZfZm9ybWF0KHJlZikgPT0gLTEpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsb2NrX3JlZl9zaGExX2Jhc2ljKHJlZiwgb2xkX3NoYTEsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBwYWNrbG9jazsKKworc3RhdGljIGludCByZXBhY2tfd2l0aG91dF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSkKK3sKKwlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QsICpwYWNrZWRfcmVmX2xpc3Q7CisJaW50IGZkOworCWludCBmb3VuZCA9IDA7CisKKwlwYWNrZWRfcmVmX2xpc3QgPSBnZXRfcGFja2VkX3JlZnMoKTsKKwlmb3IgKGxpc3QgPSBwYWNrZWRfcmVmX2xpc3Q7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmICghc3RyY21wKHJlZm5hbWUsIGxpc3QtPm5hbWUpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMDsKKwlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJnBhY2tsb2NrLCBnaXRfcGF0aCgicGFja2VkLXJlZnMiKSwgMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3QgZGVsZXRlICclcycgZnJvbSBwYWNrZWQgcmVmcyIsIHJlZm5hbWUpOworCisJZm9yIChsaXN0ID0gcGFja2VkX3JlZl9saXN0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQljaGFyIGxpbmVbUEFUSF9NQVggKyAxMDBdOworCQlpbnQgbGVuOworCisJCWlmICghc3RyY21wKHJlZm5hbWUsIGxpc3QtPm5hbWUpKQorCQkJY29udGludWU7CisJCWxlbiA9IHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiVzICVzXG4iLAorCQkJICAgICAgIHNoYTFfdG9faGV4KGxpc3QtPnNoYTEpLCBsaXN0LT5uYW1lKTsKKwkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiBidXQganVzdCBiZWluZyBkZWZlbnNpdmUgKi8KKwkJaWYgKGxlbiA+IHNpemVvZihsaW5lKSkKKwkJCWRpZSgidG9vIGxvbmcgYSByZWZuYW1lICclcyciLCBsaXN0LT5uYW1lKTsKKwkJd3JpdGVfb3JfZGllKGZkLCBsaW5lLCBsZW4pOworCX0KKwlyZXR1cm4gY29tbWl0X2xvY2tfZmlsZSgmcGFja2xvY2spOworfQorCitpbnQgZGVsZXRlX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlpbnQgZXJyLCBpLCByZXQgPSAwLCBmbGFnID0gMDsKKworCWxvY2sgPSBsb2NrX3JlZl9zaGExX2Jhc2ljKHJlZm5hbWUsIHNoYTEsICZmbGFnKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiAxOworCWlmICghKGZsYWcgJiBSRUZfSVNQQUNLRUQpKSB7CisJCS8qIGxvb3NlICovCisJCWkgPSBzdHJsZW4obG9jay0+bGstPmZpbGVuYW1lKSAtIDU7IC8qIC5sb2NrICovCisJCWxvY2stPmxrLT5maWxlbmFtZVtpXSA9IDA7CisJCWVyciA9IHVubGluayhsb2NrLT5say0+ZmlsZW5hbWUpOworCQlpZiAoZXJyKSB7CisJCQlyZXQgPSAxOworCQkJZXJyb3IoInVubGluayglcykgZmFpbGVkOiAlcyIsCisJCQkgICAgICBsb2NrLT5say0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJbG9jay0+bGstPmZpbGVuYW1lW2ldID0gJy4nOworCX0KKwkvKiByZW1vdmluZyB0aGUgbG9vc2Ugb25lIGNvdWxkIGhhdmUgcmVzdXJyZWN0ZWQgYW4gZWFybGllcgorCSAqIHBhY2tlZCBvbmUuICBBbHNvLCBpZiBpdCB3YXMgbm90IGxvb3NlIHdlIG5lZWQgdG8gcmVwYWNrCisJICogd2l0aG91dCBpdC4KKwkgKi8KKwlyZXQgfD0gcmVwYWNrX3dpdGhvdXRfcmVmKHJlZm5hbWUpOworCisJZXJyID0gdW5saW5rKGdpdF9wYXRoKCJsb2dzLyVzIiwgbG9jay0+cmVmX25hbWUpKTsKKwlpZiAoZXJyICYmIGVycm5vICE9IEVOT0VOVCkKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiB1bmxpbmsoJXMpIGZhaWxlZDogJXMiLAorCQkJZ2l0X3BhdGgoImxvZ3MvJXMiLCBsb2NrLT5yZWZfbmFtZSksIHN0cmVycm9yKGVycm5vKSk7CisJaW52YWxpZGF0ZV9jYWNoZWRfcmVmcygpOworCXVubG9ja19yZWYobG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHJlbmFtZV9yZWYoY29uc3QgY2hhciAqb2xkcmVmLCBjb25zdCBjaGFyICpuZXdyZWYsIGNvbnN0IGNoYXIgKmxvZ21zZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciByZW5hbWVkX3JlZltdID0gIlJFTkFNRUQtUkVGIjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCBvcmlnX3NoYTFbMjBdOworCWludCBmbGFnID0gMCwgbG9nbW92ZWQgPSAwOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlzdHJ1Y3Qgc3RhdCBsb2dpbmZvOworCWludCBsb2cgPSAhbHN0YXQoZ2l0X3BhdGgoImxvZ3MvJXMiLCBvbGRyZWYpLCAmbG9naW5mbyk7CisKKwlpZiAoU19JU0xOSyhsb2dpbmZvLnN0X21vZGUpKQorCQlyZXR1cm4gZXJyb3IoInJlZmxvZyBmb3IgJXMgaXMgYSBzeW1saW5rIiwgb2xkcmVmKTsKKworCWlmICghcmVzb2x2ZV9yZWYob2xkcmVmLCBvcmlnX3NoYTEsIDEsICZmbGFnKSkKKwkJcmV0dXJuIGVycm9yKCJyZWZuYW1lICVzIG5vdCBmb3VuZCIsIG9sZHJlZik7CisKKwlpZiAoIWlzX3JlZm5hbWVfYXZhaWxhYmxlKG5ld3JlZiwgb2xkcmVmLCBnZXRfcGFja2VkX3JlZnMoKSwgMCkpCisJCXJldHVybiAxOworCisJaWYgKCFpc19yZWZuYW1lX2F2YWlsYWJsZShuZXdyZWYsIG9sZHJlZiwgZ2V0X2xvb3NlX3JlZnMoKSwgMCkpCisJCXJldHVybiAxOworCisJbG9jayA9IGxvY2tfcmVmX3NoYTFfYmFzaWMocmVuYW1lZF9yZWYsIE5VTEwsIE5VTEwpOworCWlmICghbG9jaykKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gbG9jayAlcyIsIHJlbmFtZWRfcmVmKTsKKwlsb2NrLT5mb3JjZV93cml0ZSA9IDE7CisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIG9yaWdfc2hhMSwgbG9nbXNnKSkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gc2F2ZSBjdXJyZW50IHNoYTEgaW4gJXMiLCByZW5hbWVkX3JlZik7CisKKwlpZiAobG9nICYmIHJlbmFtZShnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZiksIGdpdF9wYXRoKCJ0bXAtcmVuYW1lZC1sb2ciKSkpCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIG1vdmUgbG9nZmlsZSBsb2dzLyVzIHRvIHRtcC1yZW5hbWVkLWxvZzogJXMiLAorCQkJb2xkcmVmLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKGRlbGV0ZV9yZWYob2xkcmVmLCBvcmlnX3NoYTEpKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gZGVsZXRlIG9sZCAlcyIsIG9sZHJlZik7CisJCWdvdG8gcm9sbGJhY2s7CisJfQorCisJaWYgKHJlc29sdmVfcmVmKG5ld3JlZiwgc2hhMSwgMSwgJmZsYWcpICYmIGRlbGV0ZV9yZWYobmV3cmVmLCBzaGExKSkgeworCQlpZiAoZXJybm89PUVJU0RJUikgeworCQkJaWYgKHJlbW92ZV9lbXB0eV9kaXJlY3RvcmllcyhnaXRfcGF0aCgiJXMiLCBuZXdyZWYpKSkgeworCQkJCWVycm9yKCJEaXJlY3Rvcnkgbm90IGVtcHR5OiAlcyIsIG5ld3JlZik7CisJCQkJZ290byByb2xsYmFjazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nICVzIiwgbmV3cmVmKTsKKwkJCWdvdG8gcm9sbGJhY2s7CisJCX0KKwl9CisKKwlpZiAobG9nICYmIHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpKSkgeworCQllcnJvcigidW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgZm9yICVzIiwgbmV3cmVmKTsKKwkJZ290byByb2xsYmFjazsKKwl9CisKKyByZXRyeToKKwlpZiAobG9nICYmIHJlbmFtZShnaXRfcGF0aCgidG1wLXJlbmFtZWQtbG9nIiksIGdpdF9wYXRoKCJsb2dzLyVzIiwgbmV3cmVmKSkpIHsKKwkJaWYgKGVycm5vPT1FSVNESVIgfHwgZXJybm89PUVOT1RESVIpIHsKKwkJCS8qCisJCQkgKiByZW5hbWUoYSwgYikgd2hlbiBiIGlzIGFuIGV4aXN0aW5nCisJCQkgKiBkaXJlY3Rvcnkgb3VnaHQgdG8gcmVzdWx0IGluIElTRElSLCBidXQKKwkJCSAqIFNvbGFyaXMgNS44IGdpdmVzIEVOT1RESVIuICBTaGVlc2guCisJCQkgKi8KKwkJCWlmIChyZW1vdmVfZW1wdHlfZGlyZWN0b3JpZXMoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpKSkgeworCQkJCWVycm9yKCJEaXJlY3Rvcnkgbm90IGVtcHR5OiBsb2dzLyVzIiwgbmV3cmVmKTsKKwkJCQlnb3RvIHJvbGxiYWNrOworCQkJfQorCQkJZ290byByZXRyeTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmFibGUgdG8gbW92ZSBsb2dmaWxlIHRtcC1yZW5hbWVkLWxvZyB0byBsb2dzLyVzOiAlcyIsCisJCQkJbmV3cmVmLCBzdHJlcnJvcihlcnJubykpOworCQkJZ290byByb2xsYmFjazsKKwkJfQorCX0KKwlsb2dtb3ZlZCA9IGxvZzsKKworCWxvY2sgPSBsb2NrX3JlZl9zaGExX2Jhc2ljKG5ld3JlZiwgTlVMTCwgTlVMTCk7CisJaWYgKCFsb2NrKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gbG9jayAlcyBmb3IgdXBkYXRlIiwgbmV3cmVmKTsKKwkJZ290byByb2xsYmFjazsKKwl9CisKKwlsb2NrLT5mb3JjZV93cml0ZSA9IDE7CisJaGFzaGNweShsb2NrLT5vbGRfc2hhMSwgb3JpZ19zaGExKTsKKwlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgb3JpZ19zaGExLCBsb2dtc2cpKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gd3JpdGUgY3VycmVudCBzaGExIGludG8gJXMiLCBuZXdyZWYpOworCQlnb3RvIHJvbGxiYWNrOworCX0KKworCXJldHVybiAwOworCisgcm9sbGJhY2s6CisJbG9jayA9IGxvY2tfcmVmX3NoYTFfYmFzaWMob2xkcmVmLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWxvY2spIHsKKwkJZXJyb3IoInVuYWJsZSB0byBsb2NrICVzIGZvciByb2xsYmFjayIsIG9sZHJlZik7CisJCWdvdG8gcm9sbGJhY2tsb2c7CisJfQorCisJbG9jay0+Zm9yY2Vfd3JpdGUgPSAxOworCWZsYWcgPSBsb2dfYWxsX3JlZl91cGRhdGVzOworCWxvZ19hbGxfcmVmX3VwZGF0ZXMgPSAwOworCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCBvcmlnX3NoYTEsIE5VTEwpKQorCQllcnJvcigidW5hYmxlIHRvIHdyaXRlIGN1cnJlbnQgc2hhMSBpbnRvICVzIiwgb2xkcmVmKTsKKwlsb2dfYWxsX3JlZl91cGRhdGVzID0gZmxhZzsKKworIHJvbGxiYWNrbG9nOgorCWlmIChsb2dtb3ZlZCAmJiByZW5hbWUoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpLCBnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZikpKQorCQllcnJvcigidW5hYmxlIHRvIHJlc3RvcmUgbG9nZmlsZSAlcyBmcm9tICVzOiAlcyIsCisJCQlvbGRyZWYsIG5ld3JlZiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoIWxvZ21vdmVkICYmIGxvZyAmJgorCSAgICByZW5hbWUoZ2l0X3BhdGgoInRtcC1yZW5hbWVkLWxvZyIpLCBnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZikpKQorCQllcnJvcigidW5hYmxlIHRvIHJlc3RvcmUgbG9nZmlsZSAlcyBmcm9tIHRtcC1yZW5hbWVkLWxvZzogJXMiLAorCQkJb2xkcmVmLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgdW5sb2NrX3JlZihzdHJ1Y3QgcmVmX2xvY2sgKmxvY2spCit7CisJaWYgKGxvY2stPmxvY2tfZmQgPj0gMCkgeworCQljbG9zZShsb2NrLT5sb2NrX2ZkKTsKKwkJLyogRG8gbm90IGZyZWUgbG9jay0+bGsgLS0gYXRleGl0KCkgc3RpbGwgbG9va3MgYXQgdGhlbSAqLworCQlpZiAobG9jay0+bGspCisJCQlyb2xsYmFja19sb2NrX2ZpbGUobG9jay0+bGspOworCX0KKwlmcmVlKGxvY2stPnJlZl9uYW1lKTsKKwlmcmVlKGxvY2stPm9yaWdfcmVmX25hbWUpOworCWZyZWUobG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbG9nX3JlZl93cml0ZShjb25zdCBjaGFyICpyZWZfbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbG9nZmQsIHdyaXR0ZW4sIG9mbGFncyA9IE9fQVBQRU5EIHwgT19XUk9OTFk7CisJdW5zaWduZWQgbWF4bGVuLCBsZW47CisJaW50IG1zZ2xlbjsKKwljaGFyICpsb2dfZmlsZSwgKmxvZ3JlYzsKKwljb25zdCBjaGFyICpjb21taXR0ZXI7CisKKwlpZiAobG9nX2FsbF9yZWZfdXBkYXRlcyA8IDApCisJCWxvZ19hbGxfcmVmX3VwZGF0ZXMgPSAhaXNfYmFyZV9yZXBvc2l0b3J5KCk7CisKKwlsb2dfZmlsZSA9IGdpdF9wYXRoKCJsb2dzLyVzIiwgcmVmX25hbWUpOworCisJaWYgKGxvZ19hbGxfcmVmX3VwZGF0ZXMgJiYKKwkgICAgKCFwcmVmaXhjbXAocmVmX25hbWUsICJyZWZzL2hlYWRzLyIpIHx8CisJICAgICAhcHJlZml4Y21wKHJlZl9uYW1lLCAicmVmcy9yZW1vdGVzLyIpIHx8CisJICAgICAhc3RyY21wKHJlZl9uYW1lLCAiSEVBRCIpKSkgeworCQlpZiAoc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3Rvcmllcyhsb2dfZmlsZSkgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSBmb3IgJXMiLAorCQkJCSAgICAgbG9nX2ZpbGUpOworCQlvZmxhZ3MgfD0gT19DUkVBVDsKKwl9CisKKwlsb2dmZCA9IG9wZW4obG9nX2ZpbGUsIG9mbGFncywgMDY2Nik7CisJaWYgKGxvZ2ZkIDwgMCkgeworCQlpZiAoIShvZmxhZ3MgJiBPX0NSRUFUKSAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoKG9mbGFncyAmIE9fQ1JFQVQpICYmIGVycm5vID09IEVJU0RJUikgeworCQkJaWYgKHJlbW92ZV9lbXB0eV9kaXJlY3Rvcmllcyhsb2dfZmlsZSkpIHsKKwkJCQlyZXR1cm4gZXJyb3IoIlRoZXJlIGFyZSBzdGlsbCBsb2dzIHVuZGVyICclcyciLAorCQkJCQkgICAgIGxvZ19maWxlKTsKKwkJCX0KKwkJCWxvZ2ZkID0gb3Blbihsb2dfZmlsZSwgb2ZsYWdzLCAwNjY2KTsKKwkJfQorCisJCWlmIChsb2dmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBhcHBlbmQgdG8gJXM6ICVzIiwKKwkJCQkgICAgIGxvZ19maWxlLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCWFkanVzdF9zaGFyZWRfcGVybShsb2dfZmlsZSk7CisKKwltc2dsZW4gPSAwOworCWlmIChtc2cpIHsKKwkJLyogY2xlYW4gdXAgdGhlIG1lc3NhZ2UgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhIHNpbmdsZSBsaW5lICovCisJCWZvciAoIDsgKm1zZzsgbXNnKyspCisJCQlpZiAoIWlzc3BhY2UoKm1zZykpCisJCQkJYnJlYWs7CisJCWlmICgqbXNnKSB7CisJCQljb25zdCBjaGFyICplcCA9IHN0cmNocihtc2csICdcbicpOworCQkJaWYgKGVwKQorCQkJCW1zZ2xlbiA9IGVwIC0gbXNnOworCQkJZWxzZQorCQkJCW1zZ2xlbiA9IHN0cmxlbihtc2cpOworCQl9CisJfQorCisJY29tbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKC0xKTsKKwltYXhsZW4gPSBzdHJsZW4oY29tbWl0dGVyKSArIG1zZ2xlbiArIDEwMDsKKwlsb2dyZWMgPSB4bWFsbG9jKG1heGxlbik7CisJbGVuID0gc3ByaW50Zihsb2dyZWMsICIlcyAlcyAlc1xuIiwKKwkJICAgICAgc2hhMV90b19oZXgob2xkX3NoYTEpLAorCQkgICAgICBzaGExX3RvX2hleChuZXdfc2hhMSksCisJCSAgICAgIGNvbW1pdHRlcik7CisJaWYgKG1zZ2xlbikKKwkJbGVuICs9IHNwcmludGYobG9ncmVjICsgbGVuIC0gMSwgIlx0JS4qc1xuIiwgbXNnbGVuLCBtc2cpIC0gMTsKKwl3cml0dGVuID0gbGVuIDw9IG1heGxlbiA/IHdyaXRlX2luX2Z1bGwobG9nZmQsIGxvZ3JlYywgbGVuKSA6IC0xOworCWZyZWUobG9ncmVjKTsKKwljbG9zZShsb2dmZCk7CisJaWYgKHdyaXR0ZW4gIT0gbGVuKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBhcHBlbmQgdG8gJXMiLCBsb2dfZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3cml0ZV9yZWZfc2hhMShzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbG9nbXNnKQoreworCXN0YXRpYyBjaGFyIHRlcm0gPSAnXG4nOworCisJaWYgKCFsb2NrKQorCQlyZXR1cm4gLTE7CisJaWYgKCFsb2NrLT5mb3JjZV93cml0ZSAmJiAhaGFzaGNtcChsb2NrLT5vbGRfc2hhMSwgc2hhMSkpIHsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh3cml0ZV9pbl9mdWxsKGxvY2stPmxvY2tfZmQsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCkgIT0gNDAgfHwKKwkgICAgd3JpdGVfaW5fZnVsbChsb2NrLT5sb2NrX2ZkLCAmdGVybSwgMSkgIT0gMQorCQl8fCBjbG9zZShsb2NrLT5sb2NrX2ZkKSA8IDApIHsKKwkJZXJyb3IoIkNvdWxkbid0IHdyaXRlICVzIiwgbG9jay0+bGstPmZpbGVuYW1lKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpbnZhbGlkYXRlX2NhY2hlZF9yZWZzKCk7CisJaWYgKGxvZ19yZWZfd3JpdGUobG9jay0+cmVmX25hbWUsIGxvY2stPm9sZF9zaGExLCBzaGExLCBsb2dtc2cpIDwgMCB8fAorCSAgICAoc3RyY21wKGxvY2stPnJlZl9uYW1lLCBsb2NrLT5vcmlnX3JlZl9uYW1lKSAmJgorCSAgICAgbG9nX3JlZl93cml0ZShsb2NrLT5vcmlnX3JlZl9uYW1lLCBsb2NrLT5vbGRfc2hhMSwgc2hhMSwgbG9nbXNnKSA8IDApKSB7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHN0cmNtcChsb2NrLT5vcmlnX3JlZl9uYW1lLCAiSEVBRCIpICE9IDApIHsKKwkJLyoKKwkJICogU3BlY2lhbCBoYWNrOiBJZiBhIGJyYW5jaCBpcyB1cGRhdGVkIGRpcmVjdGx5IGFuZCBIRUFECisJCSAqIHBvaW50cyB0byBpdCAobWF5IGhhcHBlbiBvbiB0aGUgcmVtb3RlIHNpZGUgb2YgYSBwdXNoCisJCSAqIGZvciBleGFtcGxlKSB0aGVuIGxvZ2ljYWxseSB0aGUgSEVBRCByZWZsb2cgc2hvdWxkIGJlCisJCSAqIHVwZGF0ZWQgdG9vLgorCQkgKiBBIGdlbmVyaWMgc29sdXRpb24gaW1wbGllcyByZXZlcnNlIHN5bXJlZiBpbmZvcm1hdGlvbiwKKwkJICogYnV0IGZpbmRpbmcgYWxsIHN5bXJlZnMgcG9pbnRpbmcgdG8gdGhlIGdpdmVuIGJyYW5jaAorCQkgKiB3b3VsZCBiZSByYXRoZXIgY29zdGx5IGZvciB0aGlzIHJhcmUgZXZlbnQgKHRoZSBkaXJlY3QKKwkJICogdXBkYXRlIG9mIGEgYnJhbmNoKSB0byBiZSB3b3J0aCBpdC4gIFNvIGxldCdzIGNoZWF0IGFuZAorCQkgKiBjaGVjayB3aXRoIEhFQUQgb25seSB3aGljaCBzaG91bGQgY292ZXIgOTklIG9mIGFsbCB1c2FnZQorCQkgKiBzY2VuYXJpb3MgKGV2ZW4gMTAwJSBvZiB0aGUgZGVmYXVsdCBvbmVzKS4KKwkJICovCisJCXVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKwkJaW50IGhlYWRfZmxhZzsKKwkJY29uc3QgY2hhciAqaGVhZF9yZWY7CisJCWhlYWRfcmVmID0gcmVzb2x2ZV9yZWYoIkhFQUQiLCBoZWFkX3NoYTEsIDEsICZoZWFkX2ZsYWcpOworCQlpZiAoaGVhZF9yZWYgJiYgKGhlYWRfZmxhZyAmIFJFRl9JU1NZTVJFRikgJiYKKwkJICAgICFzdHJjbXAoaGVhZF9yZWYsIGxvY2stPnJlZl9uYW1lKSkKKwkJCWxvZ19yZWZfd3JpdGUoIkhFQUQiLCBsb2NrLT5vbGRfc2hhMSwgc2hhMSwgbG9nbXNnKTsKKwl9CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUobG9jay0+bGspKSB7CisJCWVycm9yKCJDb3VsZG4ndCBzZXQgJXMiLCBsb2NrLT5yZWZfbmFtZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJbG9jay0+bG9ja19mZCA9IC0xOworCXVubG9ja19yZWYobG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjcmVhdGVfc3ltcmVmKGNvbnN0IGNoYXIgKnJlZl90YXJnZXQsIGNvbnN0IGNoYXIgKnJlZnNfaGVhZHNfbWFzdGVyLAorCQkgIGNvbnN0IGNoYXIgKmxvZ21zZykKK3sKKwljb25zdCBjaGFyICpsb2NrcGF0aDsKKwljaGFyIHJlZlsxMDAwXTsKKwlpbnQgZmQsIGxlbiwgd3JpdHRlbjsKKwljaGFyICpnaXRfSEVBRCA9IHhzdHJkdXAoZ2l0X3BhdGgoIiVzIiwgcmVmX3RhcmdldCkpOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdLCBuZXdfc2hhMVsyMF07CisKKwlpZiAobG9nbXNnICYmIHJlYWRfcmVmKHJlZl90YXJnZXQsIG9sZF9zaGExKSkKKwkJaGFzaGNscihvbGRfc2hhMSk7CisKKwlpZiAoc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhnaXRfSEVBRCkgPCAwKQorCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAlcyIsIGdpdF9IRUFEKTsKKworI2lmbmRlZiBOT19TWU1MSU5LX0hFQUQKKwlpZiAocHJlZmVyX3N5bWxpbmtfcmVmcykgeworCQl1bmxpbmsoZ2l0X0hFQUQpOworCQlpZiAoIXN5bWxpbmsocmVmc19oZWFkc19tYXN0ZXIsIGdpdF9IRUFEKSkKKwkJCWdvdG8gZG9uZTsKKwkJZnByaW50ZihzdGRlcnIsICJubyBzeW1saW5rIC0gZmFsbGluZyBiYWNrIHRvIHN5bWJvbGljIHJlZlxuIik7CisJfQorI2VuZGlmCisKKwlsZW4gPSBzbnByaW50ZihyZWYsIHNpemVvZihyZWYpLCAicmVmOiAlc1xuIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCWlmIChzaXplb2YocmVmKSA8PSBsZW4pIHsKKwkJZXJyb3IoInJlZm5hbWUgdG9vIGxvbmc6ICVzIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCQlnb3RvIGVycm9yX2ZyZWVfcmV0dXJuOworCX0KKwlsb2NrcGF0aCA9IG1rcGF0aCgiJXMubG9jayIsIGdpdF9IRUFEKTsKKwlmZCA9IG9wZW4obG9ja3BhdGgsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2Nik7CisJaWYgKGZkIDwgMCkgeworCQllcnJvcigiVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmciLCBsb2NrcGF0aCk7CisJCWdvdG8gZXJyb3JfZnJlZV9yZXR1cm47CisJfQorCXdyaXR0ZW4gPSB3cml0ZV9pbl9mdWxsKGZkLCByZWYsIGxlbik7CisJY2xvc2UoZmQpOworCWlmICh3cml0dGVuICE9IGxlbikgeworCQllcnJvcigiVW5hYmxlIHRvIHdyaXRlIHRvICVzIiwgbG9ja3BhdGgpOworCQlnb3RvIGVycm9yX3VubGlua19yZXR1cm47CisJfQorCWlmIChyZW5hbWUobG9ja3BhdGgsIGdpdF9IRUFEKSA8IDApIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgJXMiLCBnaXRfSEVBRCk7CisJCWdvdG8gZXJyb3JfdW5saW5rX3JldHVybjsKKwl9CisJaWYgKGFkanVzdF9zaGFyZWRfcGVybShnaXRfSEVBRCkpIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBmaXggcGVybWlzc2lvbnMgb24gJXMiLCBsb2NrcGF0aCk7CisJZXJyb3JfdW5saW5rX3JldHVybjoKKwkJdW5saW5rKGxvY2twYXRoKTsKKwllcnJvcl9mcmVlX3JldHVybjoKKwkJZnJlZShnaXRfSEVBRCk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgTk9fU1lNTElOS19IRUFECisJZG9uZToKKyNlbmRpZgorCWlmIChsb2dtc2cgJiYgIXJlYWRfcmVmKHJlZnNfaGVhZHNfbWFzdGVyLCBuZXdfc2hhMSkpCisJCWxvZ19yZWZfd3JpdGUocmVmX3RhcmdldCwgb2xkX3NoYTEsIG5ld19zaGExLCBsb2dtc2cpOworCisJZnJlZShnaXRfSEVBRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpyZWZfbXNnKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmVuZHApCit7CisJY29uc3QgY2hhciAqZXA7CisJY2hhciAqbXNnOworCisJbGluZSArPSA4MjsKKwlmb3IgKGVwID0gbGluZTsgZXAgPCBlbmRwICYmICplcCAhPSAnXG4nOyBlcCsrKQorCQk7CisJbXNnID0geG1hbGxvYyhlcCAtIGxpbmUgKyAxKTsKKwltZW1jcHkobXNnLCBsaW5lLCBlcCAtIGxpbmUpOworCW1zZ1tlcCAtIGxpbmVdID0gMDsKKwlyZXR1cm4gbXNnOworfQorCitpbnQgcmVhZF9yZWZfYXQoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBsb25nIGF0X3RpbWUsIGludCBjbnQsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKiptc2csIHVuc2lnbmVkIGxvbmcgKmN1dG9mZl90aW1lLCBpbnQgKmN1dG9mZl90eiwgaW50ICpjdXRvZmZfY250KQoreworCWNvbnN0IGNoYXIgKmxvZ2ZpbGUsICpsb2dkYXRhLCAqbG9nZW5kLCAqcmVjLCAqbGFzdGd0LCAqbGFzdHJlYzsKKwljaGFyICp0el9jOworCWludCBsb2dmZCwgdHosIHJlY2NudCA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCXVuc2lnbmVkIGNoYXIgbG9nZ2VkX3NoYTFbMjBdOworCXZvaWQgKmxvZ19tYXBwZWQ7CisJc2l6ZV90IG1hcHN6OworCisJbG9nZmlsZSA9IGdpdF9wYXRoKCJsb2dzLyVzIiwgcmVmKTsKKwlsb2dmZCA9IG9wZW4obG9nZmlsZSwgT19SRE9OTFksIDApOworCWlmIChsb2dmZCA8IDApCisJCWRpZSgiVW5hYmxlIHRvIHJlYWQgbG9nICVzOiAlcyIsIGxvZ2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJZnN0YXQobG9nZmQsICZzdCk7CisJaWYgKCFzdC5zdF9zaXplKQorCQlkaWUoIkxvZyAlcyBpcyBlbXB0eS4iLCBsb2dmaWxlKTsKKwltYXBzeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJbG9nX21hcHBlZCA9IHhtbWFwKE5VTEwsIG1hcHN6LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBsb2dmZCwgMCk7CisJbG9nZGF0YSA9IGxvZ19tYXBwZWQ7CisJY2xvc2UobG9nZmQpOworCisJbGFzdHJlYyA9IE5VTEw7CisJcmVjID0gbG9nZW5kID0gbG9nZGF0YSArIHN0LnN0X3NpemU7CisJd2hpbGUgKGxvZ2RhdGEgPCByZWMpIHsKKwkJcmVjY250Kys7CisJCWlmIChsb2dkYXRhIDwgcmVjICYmICoocmVjLTEpID09ICdcbicpCisJCQlyZWMtLTsKKwkJbGFzdGd0ID0gTlVMTDsKKwkJd2hpbGUgKGxvZ2RhdGEgPCByZWMgJiYgKihyZWMtMSkgIT0gJ1xuJykgeworCQkJcmVjLS07CisJCQlpZiAoKnJlYyA9PSAnPicpCisJCQkJbGFzdGd0ID0gcmVjOworCQl9CisJCWlmICghbGFzdGd0KQorCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJZGF0ZSA9IHN0cnRvdWwobGFzdGd0ICsgMSwgJnR6X2MsIDEwKTsKKwkJaWYgKGRhdGUgPD0gYXRfdGltZSB8fCBjbnQgPT0gMCkgeworCQkJdHogPSBzdHJ0b3VsKHR6X2MsIE5VTEwsIDEwKTsKKwkJCWlmIChtc2cpCisJCQkJKm1zZyA9IHJlZl9tc2cocmVjLCBsb2dlbmQpOworCQkJaWYgKGN1dG9mZl90aW1lKQorCQkJCSpjdXRvZmZfdGltZSA9IGRhdGU7CisJCQlpZiAoY3V0b2ZmX3R6KQorCQkJCSpjdXRvZmZfdHogPSB0ejsKKwkJCWlmIChjdXRvZmZfY250KQorCQkJCSpjdXRvZmZfY250ID0gcmVjY250IC0gMTsKKwkJCWlmIChsYXN0cmVjKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChsYXN0cmVjLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGhhc2hjbXAobG9nZ2VkX3NoYTEsIHNoYTEpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyBoYXMgZ2FwIGFmdGVyICVzLlxuIiwKKwkJCQkJCWxvZ2ZpbGUsIHNob3dfcmZjMjgyMl9kYXRlKGRhdGUsIHR6KSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGF0ZSA9PSBhdF90aW1lKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KHJlYyArIDQxLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGhhc2hjbXAobG9nZ2VkX3NoYTEsIHNoYTEpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyB1bmV4cGVjdGVkbHkgZW5kZWQgb24gJXMuXG4iLAorCQkJCQkJbG9nZmlsZSwgc2hvd19yZmMyODIyX2RhdGUoZGF0ZSwgdHopKTsKKwkJCQl9CisJCQl9CisJCQltdW5tYXAobG9nX21hcHBlZCwgbWFwc3opOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdHJlYyA9IHJlYzsKKwkJaWYgKGNudCA+IDApCisJCQljbnQtLTsKKwl9CisKKwlyZWMgPSBsb2dkYXRhOworCXdoaWxlIChyZWMgPCBsb2dlbmQgJiYgKnJlYyAhPSAnPicgJiYgKnJlYyAhPSAnXG4nKQorCQlyZWMrKzsKKwlpZiAocmVjID09IGxvZ2VuZCB8fCAqcmVjID09ICdcbicpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJZGF0ZSA9IHN0cnRvdWwocmVjICsgMSwgJnR6X2MsIDEwKTsKKwl0eiA9IHN0cnRvdWwodHpfYywgTlVMTCwgMTApOworCWlmIChnZXRfc2hhMV9oZXgobG9nZGF0YSwgc2hhMSkpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJaWYgKG1zZykKKwkJKm1zZyA9IHJlZl9tc2cobG9nZGF0YSwgbG9nZW5kKTsKKwltdW5tYXAobG9nX21hcHBlZCwgbWFwc3opOworCisJaWYgKGN1dG9mZl90aW1lKQorCQkqY3V0b2ZmX3RpbWUgPSBkYXRlOworCWlmIChjdXRvZmZfdHopCisJCSpjdXRvZmZfdHogPSB0ejsKKwlpZiAoY3V0b2ZmX2NudCkKKwkJKmN1dG9mZl9jbnQgPSByZWNjbnQ7CisJcmV0dXJuIDE7Cit9CisKK2ludCBmb3JfZWFjaF9yZWZsb2dfZW50KGNvbnN0IGNoYXIgKnJlZiwgZWFjaF9yZWZsb2dfZW50X2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCWNvbnN0IGNoYXIgKmxvZ2ZpbGU7CisJRklMRSAqbG9nZnA7CisJY2hhciBidWZbMTAyNF07CisJaW50IHJldCA9IDA7CisKKwlsb2dmaWxlID0gZ2l0X3BhdGgoImxvZ3MvJXMiLCByZWYpOworCWxvZ2ZwID0gZm9wZW4obG9nZmlsZSwgInIiKTsKKwlpZiAoIWxvZ2ZwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGxvZ2ZwKSkgeworCQl1bnNpZ25lZCBjaGFyIG9zaGExWzIwXSwgbnNoYTFbMjBdOworCQljaGFyICplbWFpbF9lbmQsICptZXNzYWdlOworCQl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwkJaW50IGxlbiwgdHo7CisKKwkJLyogb2xkIFNQIG5ldyBTUCBuYW1lIDxlbWFpbD4gU1AgdGltZSBUQUIgbXNnIExGICovCisJCWxlbiA9IHN0cmxlbihidWYpOworCQlpZiAobGVuIDwgODMgfHwgYnVmW2xlbi0xXSAhPSAnXG4nIHx8CisJCSAgICBnZXRfc2hhMV9oZXgoYnVmLCBvc2hhMSkgfHwgYnVmWzQwXSAhPSAnICcgfHwKKwkJICAgIGdldF9zaGExX2hleChidWYgKyA0MSwgbnNoYTEpIHx8IGJ1Zls4MV0gIT0gJyAnIHx8CisJCSAgICAhKGVtYWlsX2VuZCA9IHN0cmNocihidWYgKyA4MiwgJz4nKSkgfHwKKwkJICAgIGVtYWlsX2VuZFsxXSAhPSAnICcgfHwKKwkJICAgICEodGltZXN0YW1wID0gc3RydG91bChlbWFpbF9lbmQgKyAyLCAmbWVzc2FnZSwgMTApKSB8fAorCQkgICAgIW1lc3NhZ2UgfHwgbWVzc2FnZVswXSAhPSAnICcgfHwKKwkJICAgIChtZXNzYWdlWzFdICE9ICcrJyAmJiBtZXNzYWdlWzFdICE9ICctJykgfHwKKwkJICAgICFpc2RpZ2l0KG1lc3NhZ2VbMl0pIHx8ICFpc2RpZ2l0KG1lc3NhZ2VbM10pIHx8CisJCSAgICAhaXNkaWdpdChtZXNzYWdlWzRdKSB8fCAhaXNkaWdpdChtZXNzYWdlWzVdKSkKKwkJCWNvbnRpbnVlOyAvKiBjb3JydXB0PyAqLworCQllbWFpbF9lbmRbMV0gPSAnXDAnOworCQl0eiA9IHN0cnRvbChtZXNzYWdlICsgMSwgTlVMTCwgMTApOworCQlpZiAobWVzc2FnZVs2XSAhPSAnXHQnKQorCQkJbWVzc2FnZSArPSA2OworCQllbHNlCisJCQltZXNzYWdlICs9IDc7CisJCXJldCA9IGZuKG9zaGExLCBuc2hhMSwgYnVmKzgyLCB0aW1lc3RhbXAsIHR6LCBtZXNzYWdlLCBjYl9kYXRhKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwlmY2xvc2UobG9nZnApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fZm9yX2VhY2hfcmVmbG9nKGNvbnN0IGNoYXIgKmJhc2UsIGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCURJUiAqZGlyID0gb3BlbmRpcihnaXRfcGF0aCgibG9ncy8lcyIsIGJhc2UpKTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkaXIpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCQljaGFyICpsb2cgPSB4bWFsbG9jKGJhc2VsZW4gKyAyNTcpOworCisJCW1lbWNweShsb2csIGJhc2UsIGJhc2VsZW4pOworCQlpZiAoYmFzZWxlbiAmJiBiYXNlW2Jhc2VsZW4tMV0gIT0gJy8nKQorCQkJbG9nW2Jhc2VsZW4rK10gPSAnLyc7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpbnQgbmFtZWxlbjsKKworCQkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJCWNvbnRpbnVlOworCQkJbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJCWlmIChuYW1lbGVuID4gMjU1KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5sb2NrIikpCisJCQkJY29udGludWU7CisJCQltZW1jcHkobG9nICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJCWlmIChzdGF0KGdpdF9wYXRoKCJsb2dzLyVzIiwgbG9nKSwgJnN0KSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCXJldHZhbCA9IGRvX2Zvcl9lYWNoX3JlZmxvZyhsb2csIGZuLCBjYl9kYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCQlpZiAoIXJlc29sdmVfcmVmKGxvZywgc2hhMSwgMCwgTlVMTCkpCisJCQkJCXJldHZhbCA9IGVycm9yKCJiYWQgcmVmIGZvciAlcyIsIGxvZyk7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSBmbihsb2csIHNoYTEsIDAsIGNiX2RhdGEpOworCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJfQorCQlmcmVlKGxvZyk7CisJCWNsb3NlZGlyKGRpcik7CisJfQorCWVsc2UgaWYgKCpiYXNlKQorCQlyZXR1cm4gZXJybm87CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGZvcl9lYWNoX3JlZmxvZyhlYWNoX3JlZl9mbiBmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmbG9nKCIiLCBmbiwgY2JfZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9yZWZzLmggYi9yZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZjZkOQotLS0gL2Rldi9udWxsCisrKyBiL3JlZnMuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIFJFRlNfSAorI2RlZmluZSBSRUZTX0gKKworc3RydWN0IHJlZl9sb2NrIHsKKwljaGFyICpyZWZfbmFtZTsKKwljaGFyICpvcmlnX3JlZl9uYW1lOworCXN0cnVjdCBsb2NrX2ZpbGUgKmxrOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCWludCBsb2NrX2ZkOworCWludCBmb3JjZV93cml0ZTsKK307CisKKyNkZWZpbmUgUkVGX0lTU1lNUkVGIDAxCisjZGVmaW5lIFJFRl9JU1BBQ0tFRCAwMgorCisvKgorICogQ2FsbHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBmb3IgZWFjaCByZWYgZmlsZSB1bnRpbCBpdCByZXR1cm5zIG5vbnplcm8sCisgKiBhbmQgcmV0dXJucyB0aGUgdmFsdWUKKyAqLwordHlwZWRlZiBpbnQgZWFjaF9yZWZfZm4oY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWdzLCB2b2lkICpjYl9kYXRhKTsKK2V4dGVybiBpbnQgaGVhZF9yZWYoZWFjaF9yZWZfZm4sIHZvaWQgKik7CitleHRlcm4gaW50IGZvcl9lYWNoX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfdGFnX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfYnJhbmNoX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfcmVtb3RlX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKKworZXh0ZXJuIGludCBwZWVsX3JlZihjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CisKKy8qKiBSZWFkcyB0aGUgcmVmcyBmaWxlIHNwZWNpZmllZCBpbnRvIHNoYTEgKiovCitleHRlcm4gaW50IGdldF9yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiogTG9ja3MgYSAicmVmcy8iIHJlZiByZXR1cm5pbmcgdGhlIGxvY2sgb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlLiAqKi8KK2V4dGVybiBzdHJ1Y3QgcmVmX2xvY2sgKmxvY2tfcmVmX3NoYTEoY29uc3QgY2hhciAqcmVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSk7CisKKy8qKiBMb2NrcyBhbnkgcmVmIChmb3IgJ0hFQUQnIHR5cGUgcmVmcykuICovCitleHRlcm4gc3RydWN0IHJlZl9sb2NrICpsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKTsKKworLyoqIFJlbGVhc2UgYW55IGxvY2sgdGFrZW4gYnV0IG5vdCB3cml0dGVuLiAqKi8KK2V4dGVybiB2b2lkIHVubG9ja19yZWYoc3RydWN0IHJlZl9sb2NrICpsb2NrKTsKKworLyoqIFdyaXRlcyBzaGExIGludG8gdGhlIHJlZiBzcGVjaWZpZWQgYnkgdGhlIGxvY2suICoqLworZXh0ZXJuIGludCB3cml0ZV9yZWZfc2hhMShzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm1zZyk7CisKKy8qKiBSZWFkcyBsb2cgZm9yIHRoZSB2YWx1ZSBvZiByZWYgZHVyaW5nIGF0X3RpbWUuICoqLworZXh0ZXJuIGludCByZWFkX3JlZl9hdChjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGxvbmcgYXRfdGltZSwgaW50IGNudCwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqKm1zZywgdW5zaWduZWQgbG9uZyAqY3V0b2ZmX3RpbWUsIGludCAqY3V0b2ZmX3R6LCBpbnQgKmN1dG9mZl9jbnQpOworCisvKiBpdGVyYXRlIG92ZXIgcmVmbG9nIGVudHJpZXMgKi8KK3R5cGVkZWYgaW50IGVhY2hfcmVmbG9nX2VudF9mbih1bnNpZ25lZCBjaGFyICpvc2hhMSwgdW5zaWduZWQgY2hhciAqbnNoYTEsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBjb25zdCBjaGFyICosIHZvaWQgKik7CitpbnQgZm9yX2VhY2hfcmVmbG9nX2VudChjb25zdCBjaGFyICpyZWYsIGVhY2hfcmVmbG9nX2VudF9mbiBmbiwgdm9pZCAqY2JfZGF0YSk7CisKKy8qCisgKiBDYWxscyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoIHJlZmxvZyBmaWxlIHVudGlsIGl0IHJldHVybnMgbm9uemVybywKKyAqIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQorICovCitleHRlcm4gaW50IGZvcl9lYWNoX3JlZmxvZyhlYWNoX3JlZl9mbiwgdm9pZCAqKTsKKworLyoqIFJldHVybnMgMCBpZiB0YXJnZXQgaGFzIHRoZSByaWdodCBmb3JtYXQgZm9yIGEgcmVmLiAqKi8KK2V4dGVybiBpbnQgY2hlY2tfcmVmX2Zvcm1hdChjb25zdCBjaGFyICp0YXJnZXQpOworCisvKiogcmVuYW1lIHJlZiwgcmV0dXJuIDAgb24gc3VjY2VzcyAqKi8KK2V4dGVybiBpbnQgcmVuYW1lX3JlZihjb25zdCBjaGFyICpvbGRyZWYsIGNvbnN0IGNoYXIgKm5ld3JlZiwgY29uc3QgY2hhciAqbG9nbXNnKTsKKworLyoqIHJlc29sdmUgcmVmIGluIG5lc3RlZCAiZ2l0bGluayIgcmVwb3NpdG9yeSAqLworZXh0ZXJuIGludCByZXNvbHZlX2dpdGxpbmtfcmVmKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJlZm5hbWUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCk7CisKKyNlbmRpZiAvKiBSRUZTX0ggKi8KZGlmZiAtLWdpdCBhL3JldmlzaW9uLmMgYi9yZXZpc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2M2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9yZXZpc2lvbi5jCkBAIC0wLDAgKzEsMTUxNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAiZ3JlcC5oIgorI2luY2x1ZGUgInJlZmxvZy13YWxrLmgiCisjaW5jbHVkZSAicGF0Y2gtaWRzLmgiCisKK3N0YXRpYyBjaGFyICpwYXRoX25hbWUoc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZV9wYXRoICpwOworCWNoYXIgKm4sICptOworCWludCBubGVuID0gc3RybGVuKG5hbWUpOworCWludCBsZW4gPSBubGVuICsgMTsKKworCWZvciAocCA9IHBhdGg7IHA7IHAgPSBwLT51cCkgeworCQlpZiAocC0+ZWxlbV9sZW4pCisJCQlsZW4gKz0gcC0+ZWxlbV9sZW4gKyAxOworCX0KKwluID0geG1hbGxvYyhsZW4pOworCW0gPSBuICsgbGVuIC0gKG5sZW4gKyAxKTsKKwlzdHJjcHkobSwgbmFtZSk7CisJZm9yIChwID0gcGF0aDsgcDsgcCA9IHAtPnVwKSB7CisJCWlmIChwLT5lbGVtX2xlbikgeworCQkJbSAtPSBwLT5lbGVtX2xlbiArIDE7CisJCQltZW1jcHkobSwgcC0+ZWxlbSwgcC0+ZWxlbV9sZW4pOworCQkJbVtwLT5lbGVtX2xlbl0gPSAnLyc7CisJCX0KKwl9CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgYWRkX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmosCisJCXN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCXN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJYWRkX29iamVjdF9hcnJheShvYmosIHBhdGhfbmFtZShwYXRoLCBuYW1lKSwgcCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfYmxvYl91bmludGVyZXN0aW5nKHN0cnVjdCBibG9iICpibG9iKQoreworCWlmIChibG9iLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlyZXR1cm47CisJYmxvYi0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7Cit9CisKK3ZvaWQgbWFya190cmVlX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWUgKnRyZWUpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisKKwlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJaWYgKCFoYXNfc2hhMV9maWxlKG9iai0+c2hhMSkpCisJCXJldHVybjsKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSA8IDApCisJCWRpZSgiYmFkIHRyZWUgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcobG9va3VwX3RyZWUoZW50cnkuc2hhMSkpOworCQllbHNlCisJCQltYXJrX2Jsb2JfdW5pbnRlcmVzdGluZyhsb29rdXBfYmxvYihlbnRyeS5zaGExKSk7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB0cmVlIGFueSBtb3JlCisJICogYWZ0ZXIgaXQgaGFzIGJlZW4gbWFya2VkIHVuaW50ZXJlc3RpbmcuCisJICovCisJZnJlZSh0cmVlLT5idWZmZXIpOworCXRyZWUtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3ZvaWQgbWFya19wYXJlbnRzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKworCXdoaWxlIChwYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisKKwkJCS8qCisJCQkgKiBOb3JtYWxseSB3ZSBoYXZlbid0IHBhcnNlZCB0aGUgcGFyZW50CisJCQkgKiB5ZXQsIHNvIHdlIHdvbid0IGhhdmUgYSBwYXJlbnQgb2YgYSBwYXJlbnQKKwkJCSAqIGhlcmUuIEhvd2V2ZXIsIGl0IG1heSB0dXJuIG91dCB0aGF0IHdlJ3ZlCisJCQkgKiByZWFjaGVkIHRoaXMgY29tbWl0IHNvbWUgb3RoZXIgd2F5ICh3aGVyZSBpdAorCQkJICogd2Fzbid0IHVuaW50ZXJlc3RpbmcpLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKKwkJCSAqIHRvIG1hcmsgaXRzIHBhcmVudHMgcmVjdXJzaXZlbHkgdG9vLi4KKwkJCSAqLworCQkJaWYgKGNvbW1pdC0+cGFyZW50cykKKwkJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQl9CisKKwkJLyoKKwkJICogQSBtaXNzaW5nIGNvbW1pdCBpcyBvayBpZmYgaXRzIHBhcmVudCBpcyBtYXJrZWQKKwkJICogdW5pbnRlcmVzdGluZy4KKwkJICoKKwkJICogV2UganVzdCBtYXJrIHN1Y2ggYSB0aGluZyBwYXJzZWQsIHNvIHRoYXQgd2hlbgorCQkgKiBpdCBpcyBwb3BwZWQgbmV4dCB0aW1lIGFyb3VuZCwgd2Ugd29uJ3QgYmUgdHJ5aW5nCisJCSAqIHRvIHBhcnNlIGl0IGFuZCBnZXQgYW4gZXJyb3IuCisJCSAqLworCQlpZiAoIWhhc19zaGExX2ZpbGUoY29tbWl0LT5vYmplY3Quc2hhMSkpCisJCQljb21taXQtPm9iamVjdC5wYXJzZWQgPSAxOworCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwl9Cit9CisKK3ZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKQoreworCWFkZF9wZW5kaW5nX29iamVjdF93aXRoX21vZGUocmV2cywgb2JqLCBuYW1lLCBTX0lGSU5WQUxJRCk7Cit9CisKK3ZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0X3dpdGhfbW9kZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbW9kZSkKK3sKKwlpZiAocmV2cy0+bm9fd2FsayAmJiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQlkaWUoIm9iamVjdCByYW5nZXMgZG8gbm90IG1ha2Ugc2Vuc2Ugd2hlbiBub3Qgd2Fsa2luZyByZXZpc2lvbnMiKTsKKwlhZGRfb2JqZWN0X2FycmF5X3dpdGhfbW9kZShvYmosIG5hbWUsICZyZXZzLT5wZW5kaW5nLCBtb2RlKTsKKwlpZiAocmV2cy0+cmVmbG9nX2luZm8gJiYgb2JqLT50eXBlID09IE9CSl9DT01NSVQpCisJCWFkZF9yZWZsb2dfZm9yX3dhbGsocmV2cy0+cmVmbG9nX2luZm8sCisJCQkJKHN0cnVjdCBjb21taXQgKilvYmosIG5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdCAqZ2V0X3JlZmVyZW5jZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisKKwlvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmplY3QpCisJCWRpZSgiYmFkIG9iamVjdCAlcyIsIG5hbWUpOworCW9iamVjdC0+ZmxhZ3MgfD0gZmxhZ3M7CisJcmV0dXJuIG9iamVjdDsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXQgKmhhbmRsZV9jb21taXQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IG9iamVjdC0+ZmxhZ3M7CisKKwkvKgorCSAqIFRhZyBvYmplY3Q/IExvb2sgd2hhdCBpdCBwb2ludHMgdG8uLgorCSAqLworCXdoaWxlIChvYmplY3QtPnR5cGUgPT0gT0JKX1RBRykgeworCQlzdHJ1Y3QgdGFnICp0YWcgPSAoc3RydWN0IHRhZyAqKSBvYmplY3Q7CisJCWlmIChyZXZzLT50YWdfb2JqZWN0cyAmJiAhKGZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCB0YWctPnRhZyk7CisJCW9iamVjdCA9IHBhcnNlX29iamVjdCh0YWctPnRhZ2dlZC0+c2hhMSk7CisJCWlmICghb2JqZWN0KQorCQkJZGllKCJiYWQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgodGFnLT50YWdnZWQtPnNoYTEpKTsKKwl9CisKKwkvKgorCSAqIENvbW1pdCBvYmplY3Q/IEp1c3QgcmV0dXJuIGl0LCB3ZSdsbCBkbyBhbGwgdGhlIGNvbXBsZXgKKwkgKiByZWFjaGFiaWxpdHkgY3J1ZC4KKwkgKi8KKwlpZiAob2JqZWN0LT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvYmplY3Q7CisJCWlmIChwYXJzZV9jb21taXQoY29tbWl0KSA8IDApCisJCQlkaWUoInVuYWJsZSB0byBwYXJzZSBjb21taXQgJXMiLCBuYW1lKTsKKwkJaWYgKGZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJCQlyZXZzLT5saW1pdGVkID0gMTsKKwkJfQorCQlyZXR1cm4gY29tbWl0OworCX0KKworCS8qCisJICogVHJlZSBvYmplY3Q/IEVpdGhlciBtYXJrIGl0IHVuaW5pdGVyZXN0aW5nLCBvciBhZGQgaXQKKwkgKiB0byB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGxvb2sgYXQgbGF0ZXIuLgorCSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJc3RydWN0IHRyZWUgKnRyZWUgPSAoc3RydWN0IHRyZWUgKilvYmplY3Q7CisJCWlmICghcmV2cy0+dHJlZV9vYmplY3RzKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChmbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKHRyZWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgIiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIEJsb2Igb2JqZWN0PyBZb3Uga25vdyB0aGUgZHJpbGwgYnkgbm93Li4KKwkgKi8KKwlpZiAob2JqZWN0LT50eXBlID09IE9CSl9CTE9CKSB7CisJCXN0cnVjdCBibG9iICpibG9iID0gKHN0cnVjdCBibG9iICopb2JqZWN0OworCQlpZiAoIXJldnMtPmJsb2Jfb2JqZWN0cykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX2Jsb2JfdW5pbnRlcmVzdGluZyhibG9iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsICIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRpZSgiJXMgaXMgdW5rbm93biBvYmplY3QiLCBuYW1lKTsKK30KKworc3RhdGljIGludCBldmVyeWJvZHlfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKm9yaWcpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gb3JpZzsKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgZ29hbCBpcyB0byBnZXQgUkVWX1RSRUVfTkVXIGFzIHRoZSByZXN1bHQgb25seSBpZiB0aGUKKyAqIGRpZmYgY29uc2lzdHMgb2YgYWxsICcrJyAoYW5kIG5vIG90aGVyIGNoYW5nZXMpLCBhbmQKKyAqIFJFVl9UUkVFX0RJRkZFUkVOVCBvdGhlcndpc2UgKG9mIGNvdXJzZSBpZiB0aGUgdHJlZXMgYXJlCisgKiB0aGUgc2FtZSB3ZSB3YW50IFJFVl9UUkVFX1NBTUUpLiAgVGhhdCBtZWFucyB0aGF0IG9uY2Ugd2UKKyAqIGdldCB0byBSRVZfVFJFRV9ESUZGRVJFTlQsIHdlIGRvIG5vdCBoYXZlIHRvIGxvb2sgYW55IGZ1cnRoZXIuCisgKi8KK3N0YXRpYyBpbnQgdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfU0FNRTsKKworc3RhdGljIHZvaWQgZmlsZV9hZGRfcmVtb3ZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSAgICBpbnQgYWRkcmVtb3ZlLCB1bnNpZ25lZCBtb2RlLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJICAgIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGRpZmYgPSBSRVZfVFJFRV9ESUZGRVJFTlQ7CisKKwkvKgorCSAqIElzIGl0IGFuIGFkZCBvZiBhIG5ldyBmaWxlPyBJdCBtZWFucyB0aGF0IHRoZSBvbGQgdHJlZQorCSAqIGRpZG4ndCBoYXZlIGl0IGF0IGFsbCwgc28gd2Ugd2lsbCB0dXJuICJSRVZfVFJFRV9TQU1FIiAtPgorCSAqICJSRVZfVFJFRV9ORVciLCBidXQgbGVhdmUgYW55ICJSRVZfVFJFRV9ESUZGRVJFTlQiIGFsb25lCisJICogKGFuZCBpZiBpdCBhbHJlYWR5IHdhcyAiUkVWX1RSRUVfTkVXIiwgd2UnbGwga2VlcCBpdAorCSAqICJSRVZfVFJFRV9ORVciIG9mIGNvdXJzZSkuCisJICovCisJaWYgKGFkZHJlbW92ZSA9PSAnKycpIHsKKwkJZGlmZiA9IHRyZWVfZGlmZmVyZW5jZTsKKwkJaWYgKGRpZmYgIT0gUkVWX1RSRUVfU0FNRSkKKwkJCXJldHVybjsKKwkJZGlmZiA9IFJFVl9UUkVFX05FVzsKKwl9CisJdHJlZV9kaWZmZXJlbmNlID0gZGlmZjsKKwlpZiAodHJlZV9kaWZmZXJlbmNlID09IFJFVl9UUkVFX0RJRkZFUkVOVCkKKwkJb3B0aW9ucy0+aGFzX2NoYW5nZXMgPSAxOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgdW5zaWduZWQgb2xkX21vZGUsIHVuc2lnbmVkIG5ld19tb2RlLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfRElGRkVSRU5UOworCW9wdGlvbnMtPmhhc19jaGFuZ2VzID0gMTsKK30KKworaW50IHJldl9jb21wYXJlX3RyZWUoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgdHJlZSAqdDEsIHN0cnVjdCB0cmVlICp0MikKK3sKKwlpZiAoIXQxKQorCQlyZXR1cm4gUkVWX1RSRUVfTkVXOworCWlmICghdDIpCisJCXJldHVybiBSRVZfVFJFRV9ESUZGRVJFTlQ7CisJdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfU0FNRTsKKwlyZXZzLT5wcnVuaW5nLmhhc19jaGFuZ2VzID0gMDsKKwlpZiAoZGlmZl90cmVlX3NoYTEodDEtPm9iamVjdC5zaGExLCB0Mi0+b2JqZWN0LnNoYTEsICIiLAorCQkJICAgJnJldnMtPnBydW5pbmcpIDwgMCkKKwkJcmV0dXJuIFJFVl9UUkVFX0RJRkZFUkVOVDsKKwlyZXR1cm4gdHJlZV9kaWZmZXJlbmNlOworfQorCitpbnQgcmV2X3NhbWVfdHJlZV9hc19lbXB0eShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCB0cmVlICp0MSkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB0cmVlX2Rlc2MgZW1wdHksIHJlYWw7CisKKwlpZiAoIXQxKQorCQlyZXR1cm4gMDsKKworCXRyZWUgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZSh0MS0+b2JqZWN0LnNoYTEsIHRyZWVfdHlwZSwgJnNpemUsIE5VTEwpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisJaW5pdF90cmVlX2Rlc2MoJnJlYWwsIHRyZWUsIHNpemUpOworCWluaXRfdHJlZV9kZXNjKCZlbXB0eSwgIiIsIDApOworCisJdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfU0FNRTsKKwlyZXZzLT5wcnVuaW5nLmhhc19jaGFuZ2VzID0gMDsKKwlyZXR2YWwgPSBkaWZmX3RyZWUoJmVtcHR5LCAmcmVhbCwgIiIsICZyZXZzLT5wcnVuaW5nKTsKKwlmcmVlKHRyZWUpOworCisJcmV0dXJuIHJldHZhbCA+PSAwICYmICh0cmVlX2RpZmZlcmVuY2UgPT0gUkVWX1RSRUVfU0FNRSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyeV90b19zaW1wbGlmeV9jb21taXQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAsICpwYXJlbnQ7CisJaW50IHRyZWVfY2hhbmdlZCA9IDAsIHRyZWVfc2FtZSA9IDA7CisKKwlpZiAoIWNvbW1pdC0+dHJlZSkKKwkJcmV0dXJuOworCisJaWYgKCFjb21taXQtPnBhcmVudHMpIHsKKwkJaWYgKCFyZXZfc2FtZV90cmVlX2FzX2VtcHR5KHJldnMsIGNvbW1pdC0+dHJlZSkpCisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBUUkVFQ0hBTkdFOworCQlyZXR1cm47CisJfQorCisJcHAgPSAmY29tbWl0LT5wYXJlbnRzOworCXdoaWxlICgocGFyZW50ID0gKnBwKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnQtPml0ZW07CisKKwkJaWYgKHBhcnNlX2NvbW1pdChwKSA8IDApCisJCQlkaWUoImNhbm5vdCBzaW1wbGlmeSBjb21taXQgJXMgKGJlY2F1c2Ugb2YgJXMpIiwKKwkJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwKKwkJCSAgICBzaGExX3RvX2hleChwLT5vYmplY3Quc2hhMSkpOworCQlzd2l0Y2ggKHJldl9jb21wYXJlX3RyZWUocmV2cywgcC0+dHJlZSwgY29tbWl0LT50cmVlKSkgeworCQljYXNlIFJFVl9UUkVFX1NBTUU6CisJCQl0cmVlX3NhbWUgPSAxOworCQkJaWYgKCFyZXZzLT5zaW1wbGlmeV9oaXN0b3J5IHx8IChwLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkgeworCQkJCS8qIEV2ZW4gaWYgYSBtZXJnZSB3aXRoIGFuIHVuaW50ZXJlc3RpbmcKKwkJCQkgKiBzaWRlIGJyYW5jaCBicm91Z2h0IHRoZSBlbnRpcmUgY2hhbmdlCisJCQkJICogd2UgYXJlIGludGVyZXN0ZWQgaW4sIHdlIGRvIG5vdCB3YW50CisJCQkJICogdG8gbG9zZSB0aGUgb3RoZXIgYnJhbmNoZXMgb2YgdGhpcworCQkJCSAqIG1lcmdlLCBzbyB3ZSBqdXN0IGtlZXAgZ29pbmcuCisJCQkJICovCisJCQkJcHAgPSAmcGFyZW50LT5uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGFyZW50LT5uZXh0ID0gTlVMTDsKKwkJCWNvbW1pdC0+cGFyZW50cyA9IHBhcmVudDsKKwkJCXJldHVybjsKKworCQljYXNlIFJFVl9UUkVFX05FVzoKKwkJCWlmIChyZXZzLT5yZW1vdmVfZW1wdHlfdHJlZXMgJiYKKwkJCSAgICByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHJldnMsIHAtPnRyZWUpKSB7CisJCQkJLyogV2UgYXJlIGFkZGluZyBhbGwgdGhlIHNwZWNpZmllZAorCQkJCSAqIHBhdGhzIGZyb20gdGhpcyBwYXJlbnQsIHNvIHRoZQorCQkJCSAqIGhpc3RvcnkgYmV5b25kIHRoaXMgcGFyZW50IGlzIG5vdAorCQkJCSAqIGludGVyZXN0aW5nLiAgUmVtb3ZlIGl0cyBwYXJlbnRzCisJCQkJICogKHRoZXkgYXJlIGdyYW5kcGFyZW50cyBmb3IgdXMpLgorCQkJCSAqIElPVywgd2UgcHJldGVuZCB0aGlzIHBhcmVudCBpcyBhCisJCQkJICogInJvb3QiIGNvbW1pdC4KKwkJCQkgKi8KKwkJCQlpZiAocGFyc2VfY29tbWl0KHApIDwgMCkKKwkJCQkJZGllKCJjYW5ub3Qgc2ltcGxpZnkgY29tbWl0ICVzIChpbnZhbGlkICVzKSIsCisJCQkJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwKKwkJCQkJICAgIHNoYTFfdG9faGV4KHAtPm9iamVjdC5zaGExKSk7CisJCQkJcC0+cGFyZW50cyA9IE5VTEw7CisJCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgUkVWX1RSRUVfRElGRkVSRU5UOgorCQkJdHJlZV9jaGFuZ2VkID0gMTsKKwkJCXBwID0gJnBhcmVudC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgiYmFkIHRyZWUgY29tcGFyZSBmb3IgY29tbWl0ICVzIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCX0KKwlpZiAodHJlZV9jaGFuZ2VkICYmICF0cmVlX3NhbWUpCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BhcmVudHNfdG9fbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwl1bnNpZ25lZCBsZWZ0X2ZsYWc7CisJaW50IGFkZCwgcmVzdDsKKworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEFEREVEKQorCQlyZXR1cm4gMDsKKwljb21taXQtPm9iamVjdC5mbGFncyB8PSBBRERFRDsKKworCS8qCisJICogSWYgdGhlIGNvbW1pdCBpcyB1bmludGVyZXN0aW5nLCBkb24ndCB0cnkgdG8KKwkgKiBwcnVuZSBwYXJlbnRzIC0gd2Ugd2FudCB0aGUgbWF4aW1hbCB1bmludGVyZXN0aW5nCisJICogc2V0LgorCSAqCisJICogTm9ybWFsbHkgd2UgaGF2ZW4ndCBwYXJzZWQgdGhlIHBhcmVudAorCSAqIHlldCwgc28gd2Ugd29uJ3QgaGF2ZSBhIHBhcmVudCBvZiBhIHBhcmVudAorCSAqIGhlcmUuIEhvd2V2ZXIsIGl0IG1heSB0dXJuIG91dCB0aGF0IHdlJ3ZlCisJICogcmVhY2hlZCB0aGlzIGNvbW1pdCBzb21lIG90aGVyIHdheSAod2hlcmUgaXQKKwkgKiB3YXNuJ3QgdW5pbnRlcmVzdGluZyksIGluIHdoaWNoIGNhc2Ugd2UgbmVlZAorCSAqIHRvIG1hcmsgaXRzIHBhcmVudHMgcmVjdXJzaXZlbHkgdG9vLi4KKwkgKi8KKwlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCXdoaWxlIChwYXJlbnQpIHsKKwkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnQtPml0ZW07CisJCQlwYXJlbnQgPSBwYXJlbnQtPm5leHQ7CisJCQlpZiAocGFyc2VfY29tbWl0KHApIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCWlmIChwLT5wYXJlbnRzKQorCQkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKHApOworCQkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFNFRU4pCisJCQkJY29udGludWU7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gU0VFTjsKKwkJCWluc2VydF9ieV9kYXRlKHAsIGxpc3QpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogT2ssIHRoZSBjb21taXQgd2Fzbid0IHVuaW50ZXJlc3RpbmcuIFRyeSB0bworCSAqIHNpbXBsaWZ5IHRoZSBjb21taXQgaGlzdG9yeSBhbmQgZmluZCB0aGUgcGFyZW50CisJICogdGhhdCBoYXMgbm8gZGlmZmVyZW5jZXMgaW4gdGhlIHBhdGggc2V0IGlmIG9uZSBleGlzdHMuCisJICovCisJaWYgKHJldnMtPnBydW5lX2ZuKQorCQlyZXZzLT5wcnVuZV9mbihyZXZzLCBjb21taXQpOworCisJaWYgKHJldnMtPm5vX3dhbGspCisJCXJldHVybiAwOworCisJbGVmdF9mbGFnID0gKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU1lNTUVUUklDX0xFRlQpOworCisJcmVzdCA9ICFyZXZzLT5maXJzdF9wYXJlbnRfb25seTsKKwlmb3IgKHBhcmVudCA9IGNvbW1pdC0+cGFyZW50cywgYWRkID0gMTsgcGFyZW50OyBhZGQgPSByZXN0KSB7CisJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnQtPml0ZW07CisKKwkJcGFyZW50ID0gcGFyZW50LT5uZXh0OworCQlpZiAocGFyc2VfY29tbWl0KHApIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJcC0+b2JqZWN0LmZsYWdzIHw9IGxlZnRfZmxhZzsKKwkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFNFRU4pCisJCQljb250aW51ZTsKKwkJcC0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJCWlmIChhZGQpCisJCQlpbnNlcnRfYnlfZGF0ZShwLCBsaXN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZXJyeV9waWNrX2xpc3Qoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlpbnQgbGVmdF9jb3VudCA9IDAsIHJpZ2h0X2NvdW50ID0gMDsKKwlpbnQgbGVmdF9maXJzdDsKKwlzdHJ1Y3QgcGF0Y2hfaWRzIGlkczsKKworCS8qIEZpcnN0IGNvdW50IHRoZSBjb21taXRzIG9uIHRoZSBsZWZ0IGFuZCBvbiB0aGUgcmlnaHQgKi8KKwlmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwLT5pdGVtOworCQl1bnNpZ25lZCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCQlpZiAoZmxhZ3MgJiBCT1VOREFSWSkKKwkJCTsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCkKKwkJCWxlZnRfY291bnQrKzsKKwkJZWxzZQorCQkJcmlnaHRfY291bnQrKzsKKwl9CisKKwlsZWZ0X2ZpcnN0ID0gbGVmdF9jb3VudCA8IHJpZ2h0X2NvdW50OworCWluaXRfcGF0Y2hfaWRzKCZpZHMpOworCisJLyogQ29tcHV0ZSBwYXRjaC1pZHMgZm9yIG9uZSBzaWRlICovCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJdW5zaWduZWQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKworCQlpZiAoZmxhZ3MgJiBCT1VOREFSWSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGZld2VyIGxlZnQsIGxlZnRfZmlyc3QgaXMgc2V0IGFuZCB3ZSBvbWl0CisJCSAqIGNvbW1pdHMgb24gdGhlIHJpZ2h0IGJyYW5jaCBpbiB0aGlzIGxvb3AuICBJZiB3ZSBoYXZlCisJCSAqIGZld2VyIHJpZ2h0LCB3ZSBza2lwIHRoZSBsZWZ0IG9uZXMuCisJCSAqLworCQlpZiAobGVmdF9maXJzdCAhPSAhIShmbGFncyAmIFNZTU1FVFJJQ19MRUZUKSkKKwkJCWNvbnRpbnVlOworCQljb21taXQtPnV0aWwgPSBhZGRfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcyk7CisJfQorCisJLyogQ2hlY2sgdGhlIG90aGVyIHNpZGUgKi8KKwlmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwLT5pdGVtOworCQlzdHJ1Y3QgcGF0Y2hfaWQgKmlkOworCQl1bnNpZ25lZCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCisJCWlmIChmbGFncyAmIEJPVU5EQVJZKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgZmV3ZXIgbGVmdCwgbGVmdF9maXJzdCBpcyBzZXQgYW5kIHdlIG9taXQKKwkJICogY29tbWl0cyBvbiB0aGUgbGVmdCBicmFuY2ggaW4gdGhpcyBsb29wLgorCQkgKi8KKwkJaWYgKGxlZnRfZmlyc3QgPT0gISEoZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBIYXZlIHdlIHNlZW4gdGhlIHNhbWUgcGF0Y2ggaWQ/CisJCSAqLworCQlpZCA9IGhhc19jb21taXRfcGF0Y2hfaWQoY29tbWl0LCAmaWRzKTsKKwkJaWYgKCFpZCkKKwkJCWNvbnRpbnVlOworCQlpZC0+c2VlbiA9IDE7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOOworCX0KKworCS8qIE5vdyBjaGVjayB0aGUgb3JpZ2luYWwgc2lkZSBmb3Igc2VlbiBvbmVzICovCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJc3RydWN0IHBhdGNoX2lkICplbnQ7CisKKwkJZW50ID0gY29tbWl0LT51dGlsOworCQlpZiAoIWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZW50LT5zZWVuKQorCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisJCWNvbW1pdC0+dXRpbCA9IE5VTEw7CisJfQorCisJZnJlZV9wYXRjaF9pZHMoJmlkcyk7Cit9CisKK3N0YXRpYyBpbnQgbGltaXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gcmV2cy0+Y29tbWl0czsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm5ld2xpc3QgPSBOVUxMOworCXN0cnVjdCBjb21taXRfbGlzdCAqKnAgPSAmbmV3bGlzdDsKKworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqZW50cnkgPSBsaXN0OworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmY29tbWl0LT5vYmplY3Q7CisKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWZyZWUoZW50cnkpOworCisJCWlmIChyZXZzLT5tYXhfYWdlICE9IC0xICYmIChjb21taXQtPmRhdGUgPCByZXZzLT5tYXhfYWdlKSkKKwkJCW9iai0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJaWYgKGFkZF9wYXJlbnRzX3RvX2xpc3QocmV2cywgY29tbWl0LCAmbGlzdCkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJCQlpZiAoZXZlcnlib2R5X3VuaW50ZXJlc3RpbmcobGlzdCkpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmV2cy0+bWluX2FnZSAhPSAtMSAmJiAoY29tbWl0LT5kYXRlID4gcmV2cy0+bWluX2FnZSkpCisJCQljb250aW51ZTsKKwkJcCA9ICZjb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCBwKS0+bmV4dDsKKwl9CisJaWYgKHJldnMtPmNoZXJyeV9waWNrKQorCQljaGVycnlfcGlja19saXN0KG5ld2xpc3QpOworCisJcmV2cy0+Y29tbWl0cyA9IG5ld2xpc3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhbGxfcmVmc19jYiB7CisJaW50IGFsbF9mbGFnczsKKwlpbnQgd2FybmVkX2JhZF9yZWZsb2c7CisJc3RydWN0IHJldl9pbmZvICphbGxfcmV2czsKKwljb25zdCBjaGFyICpuYW1lX2Zvcl9lcnJvcm1zZzsKK307CisKK3N0YXRpYyBpbnQgaGFuZGxlX29uZV9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFsbF9yZWZzX2NiICpjYiA9IGNiX2RhdGE7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gZ2V0X3JlZmVyZW5jZShjYi0+YWxsX3JldnMsIHBhdGgsIHNoYTEsCisJCQkJCSAgICAgIGNiLT5hbGxfZmxhZ3MpOworCWFkZF9wZW5kaW5nX29iamVjdChjYi0+YWxsX3JldnMsIG9iamVjdCwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hbGwoc3RydWN0IHJldl9pbmZvICpyZXZzLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgYWxsX3JlZnNfY2IgY2I7CisJY2IuYWxsX3JldnMgPSByZXZzOworCWNiLmFsbF9mbGFncyA9IGZsYWdzOworCWZvcl9lYWNoX3JlZihoYW5kbGVfb25lX3JlZiwgJmNiKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29uZV9yZWZsb2dfY29tbWl0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFsbF9yZWZzX2NiICpjYiA9IGNiX2RhdGE7CisJaWYgKCFpc19udWxsX3NoYTEoc2hhMSkpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJaWYgKG8pIHsKKwkJCW8tPmZsYWdzIHw9IGNiLT5hbGxfZmxhZ3M7CisJCQlhZGRfcGVuZGluZ19vYmplY3QoY2ItPmFsbF9yZXZzLCBvLCAiIik7CisJCX0KKwkJZWxzZSBpZiAoIWNiLT53YXJuZWRfYmFkX3JlZmxvZykgeworCQkJd2FybmluZygicmVmbG9nIG9mICclcycgcmVmZXJlbmNlcyBwcnVuZWQgY29tbWl0cyIsCisJCQkJY2ItPm5hbWVfZm9yX2Vycm9ybXNnKTsKKwkJCWNiLT53YXJuZWRfYmFkX3JlZmxvZyA9IDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29uZV9yZWZsb2dfZW50KHVuc2lnbmVkIGNoYXIgKm9zaGExLCB1bnNpZ25lZCBjaGFyICpuc2hhMSwKKwkJY29uc3QgY2hhciAqZW1haWwsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wLCBpbnQgdHosCisJCWNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKmNiX2RhdGEpCit7CisJaGFuZGxlX29uZV9yZWZsb2dfY29tbWl0KG9zaGExLCBjYl9kYXRhKTsKKwloYW5kbGVfb25lX3JlZmxvZ19jb21taXQobnNoYTEsIGNiX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmbG9nKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhbGxfcmVmc19jYiAqY2IgPSBjYl9kYXRhOworCWNiLT53YXJuZWRfYmFkX3JlZmxvZyA9IDA7CisJY2ItPm5hbWVfZm9yX2Vycm9ybXNnID0gcGF0aDsKKwlmb3JfZWFjaF9yZWZsb2dfZW50KHBhdGgsIGhhbmRsZV9vbmVfcmVmbG9nX2VudCwgY2JfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZWZsb2coc3RydWN0IHJldl9pbmZvICpyZXZzLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgYWxsX3JlZnNfY2IgY2I7CisJY2IuYWxsX3JldnMgPSByZXZzOworCWNiLmFsbF9mbGFncyA9IGZsYWdzOworCWZvcl9lYWNoX3JlZmxvZyhoYW5kbGVfb25lX3JlZmxvZywgJmNiKTsKK30KKworc3RhdGljIGludCBhZGRfcGFyZW50c19vbmx5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICppdDsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJaWYgKCphcmcgPT0gJ14nKSB7CisJCWZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJCWFyZysrOworCX0KKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKDEpIHsKKwkJaXQgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGFyZywgc2hhMSwgMCk7CisJCWlmIChpdC0+dHlwZSAhPSBPQkpfVEFHKQorCQkJYnJlYWs7CisJCWhhc2hjcHkoc2hhMSwgKChzdHJ1Y3QgdGFnKilpdCktPnRhZ2dlZC0+c2hhMSk7CisJfQorCWlmIChpdC0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKWl0OworCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsgcGFyZW50czsgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpIHsKKwkJaXQgPSAmcGFyZW50cy0+aXRlbS0+b2JqZWN0OworCQlpdC0+ZmxhZ3MgfD0gZmxhZ3M7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBpdCwgYXJnKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9yZXZpc2lvbnMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJbWVtc2V0KHJldnMsIDAsIHNpemVvZigqcmV2cykpOworCisJcmV2cy0+YWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJcmV2cy0+aWdub3JlX21lcmdlcyA9IDE7CisJcmV2cy0+c2ltcGxpZnlfaGlzdG9yeSA9IDE7CisJcmV2cy0+cHJ1bmluZy5yZWN1cnNpdmUgPSAxOworCXJldnMtPnBydW5pbmcucXVpZXQgPSAxOworCXJldnMtPnBydW5pbmcuYWRkX3JlbW92ZSA9IGZpbGVfYWRkX3JlbW92ZTsKKwlyZXZzLT5wcnVuaW5nLmNoYW5nZSA9IGZpbGVfY2hhbmdlOworCXJldnMtPmxpZm8gPSAxOworCXJldnMtPmRlbnNlID0gMTsKKwlyZXZzLT5wcmVmaXggPSBwcmVmaXg7CisJcmV2cy0+bWF4X2FnZSA9IC0xOworCXJldnMtPm1pbl9hZ2UgPSAtMTsKKwlyZXZzLT5za2lwX2NvdW50ID0gLTE7CisJcmV2cy0+bWF4X2NvdW50ID0gLTE7CisJcmV2cy0+c3ViamVjdF9wcmVmaXggPSAiUEFUQ0giOworCisJcmV2cy0+cHJ1bmVfZm4gPSBOVUxMOworCXJldnMtPnBydW5lX2RhdGEgPSBOVUxMOworCisJcmV2cy0+dG9wb19zZXR0ZXIgPSB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXI7CisJcmV2cy0+dG9wb19nZXR0ZXIgPSB0b3BvX3NvcnRfZGVmYXVsdF9nZXR0ZXI7CisKKwlyZXZzLT5jb21taXRfZm9ybWF0ID0gQ01JVF9GTVRfREVGQVVMVDsKKworCWRpZmZfc2V0dXAoJnJldnMtPmRpZmZvcHQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGVuZGluZ19jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXdoaWxlIChjb21taXRfbGlzdCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSAmY29tbWl0X2xpc3QtPml0ZW0tPm9iamVjdDsKKwkJb2JqZWN0LT5mbGFncyB8PSBmbGFnczsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgc2hhMV90b19oZXgob2JqZWN0LT5zaGExKSk7CisJCWNvbW1pdF9saXN0ID0gY29tbWl0X2xpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3Nob3dfbWVyZ2Uoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqYmFzZXM7CisJc3RydWN0IGNvbW1pdCAqaGVhZCwgKm90aGVyOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqKnBydW5lID0gTlVMTDsKKwlpbnQgaSwgcHJ1bmVfbnVtID0gMTsgLyogY291bnRpbmcgdGVybWluYXRpbmcgTlVMTCAqLworCisJaWYgKGdldF9zaGExKCJIRUFEIiwgc2hhMSkgfHwgIShoZWFkID0gbG9va3VwX2NvbW1pdChzaGExKSkpCisJCWRpZSgiLS1tZXJnZSB3aXRob3V0IEhFQUQ/Iik7CisJaWYgKGdldF9zaGExKCJNRVJHRV9IRUFEIiwgc2hhMSkgfHwgIShvdGhlciA9IGxvb2t1cF9jb21taXQoc2hhMSkpKQorCQlkaWUoIi0tbWVyZ2Ugd2l0aG91dCBNRVJHRV9IRUFEPyIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmaGVhZC0+b2JqZWN0LCAiSEVBRCIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmb3RoZXItPm9iamVjdCwgIk1FUkdFX0hFQUQiKTsKKwliYXNlcyA9IGdldF9tZXJnZV9iYXNlcyhoZWFkLCBvdGhlciwgMSk7CisJd2hpbGUgKGJhc2VzKSB7CisJCXN0cnVjdCBjb21taXQgKml0ID0gYmFzZXMtPml0ZW07CisJCXN0cnVjdCBjb21taXRfbGlzdCAqbiA9IGJhc2VzLT5uZXh0OworCQlmcmVlKGJhc2VzKTsKKwkJYmFzZXMgPSBuOworCQlpdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmaXQtPm9iamVjdCwgIihtZXJnZS1iYXNlKSIpOworCX0KKworCWlmICghYWN0aXZlX25yKQorCQlyZWFkX2NhY2hlKCk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWlmIChjZV9wYXRoX21hdGNoKGNlLCByZXZzLT5wcnVuZV9kYXRhKSkgeworCQkJcHJ1bmVfbnVtKys7CisJCQlwcnVuZSA9IHhyZWFsbG9jKHBydW5lLCBzaXplb2YoKnBydW5lKSAqIHBydW5lX251bSk7CisJCQlwcnVuZVtwcnVuZV9udW0tMl0gPSBjZS0+bmFtZTsKKwkJCXBydW5lW3BydW5lX251bS0xXSA9IE5VTEw7CisJCX0KKwkJd2hpbGUgKChpKzEgPCBhY3RpdmVfbnIpICYmCisJCSAgICAgICBjZV9zYW1lX25hbWUoY2UsIGFjdGl2ZV9jYWNoZVtpKzFdKSkKKwkJCWkrKzsKKwl9CisJcmV2cy0+cHJ1bmVfZGF0YSA9IHBydW5lOworfQorCitpbnQgaGFuZGxlX3JldmlzaW9uX2FyZyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCWludCBmbGFncywKKwkJCWludCBjYW50X2JlX2ZpbGVuYW1lKQoreworCXVuc2lnbmVkIG1vZGU7CisJY2hhciAqZG90ZG90OworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsb2NhbF9mbGFnczsKKworCWRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpOworCWlmIChkb3Rkb3QpIHsKKwkJdW5zaWduZWQgY2hhciBmcm9tX3NoYTFbMjBdOworCQljb25zdCBjaGFyICpuZXh0ID0gZG90ZG90ICsgMjsKKwkJY29uc3QgY2hhciAqdGhpcyA9IGFyZzsKKwkJaW50IHN5bW1ldHJpYyA9ICpuZXh0ID09ICcuJzsKKwkJdW5zaWduZWQgaW50IGZsYWdzX2V4Y2x1ZGUgPSBmbGFncyBeIFVOSU5URVJFU1RJTkc7CisKKwkJKmRvdGRvdCA9IDA7CisJCW5leHQgKz0gc3ltbWV0cmljOworCisJCWlmICghKm5leHQpCisJCQluZXh0ID0gIkhFQUQiOworCQlpZiAoZG90ZG90ID09IGFyZykKKwkJCXRoaXMgPSAiSEVBRCI7CisJCWlmICghZ2V0X3NoYTEodGhpcywgZnJvbV9zaGExKSAmJgorCQkgICAgIWdldF9zaGExKG5leHQsIHNoYTEpKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICphLCAqYjsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqZXhjbHVkZTsKKworCQkJYSA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGZyb21fc2hhMSk7CisJCQliID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJCQlpZiAoIWEgfHwgIWIpIHsKKwkJCQlkaWUoc3ltbWV0cmljID8KKwkJCQkgICAgIkludmFsaWQgc3ltbWV0cmljIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiAlcy4uLiVzIiA6CisJCQkJICAgICJJbnZhbGlkIHJldmlzaW9uIHJhbmdlICVzLi4lcyIsCisJCQkJICAgIGFyZywgbmV4dCk7CisJCQl9CisKKwkJCWlmICghY2FudF9iZV9maWxlbmFtZSkgeworCQkJCSpkb3Rkb3QgPSAnLic7CisJCQkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJCQl9CisKKwkJCWlmIChzeW1tZXRyaWMpIHsKKwkJCQlleGNsdWRlID0gZ2V0X21lcmdlX2Jhc2VzKGEsIGIsIDEpOworCQkJCWFkZF9wZW5kaW5nX2NvbW1pdF9saXN0KHJldnMsIGV4Y2x1ZGUsCisJCQkJCQkJZmxhZ3NfZXhjbHVkZSk7CisJCQkJZnJlZV9jb21taXRfbGlzdChleGNsdWRlKTsKKwkJCQlhLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3MgfCBTWU1NRVRSSUNfTEVGVDsKKwkJCX0gZWxzZQorCQkJCWEtPm9iamVjdC5mbGFncyB8PSBmbGFnc19leGNsdWRlOworCQkJYi0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZhLT5vYmplY3QsIHRoaXMpOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZiLT5vYmplY3QsIG5leHQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmRvdGRvdCA9ICcuJzsKKwl9CisJZG90ZG90ID0gc3Ryc3RyKGFyZywgIl5AIik7CisJaWYgKGRvdGRvdCAmJiAhZG90ZG90WzJdKSB7CisJCSpkb3Rkb3QgPSAwOworCQlpZiAoYWRkX3BhcmVudHNfb25seShyZXZzLCBhcmcsIGZsYWdzKSkKKwkJCXJldHVybiAwOworCQkqZG90ZG90ID0gJ14nOworCX0KKwlkb3Rkb3QgPSBzdHJzdHIoYXJnLCAiXiEiKTsKKwlpZiAoZG90ZG90ICYmICFkb3Rkb3RbMl0pIHsKKwkJKmRvdGRvdCA9IDA7CisJCWlmICghYWRkX3BhcmVudHNfb25seShyZXZzLCBhcmcsIGZsYWdzIF4gVU5JTlRFUkVTVElORykpCisJCQkqZG90ZG90ID0gJ14nOworCX0KKworCWxvY2FsX2ZsYWdzID0gMDsKKwlpZiAoKmFyZyA9PSAnXicpIHsKKwkJbG9jYWxfZmxhZ3MgPSBVTklOVEVSRVNUSU5HOworCQlhcmcrKzsKKwl9CisJaWYgKGdldF9zaGExX3dpdGhfbW9kZShhcmcsIHNoYTEsICZtb2RlKSkKKwkJcmV0dXJuIC0xOworCWlmICghY2FudF9iZV9maWxlbmFtZSkKKwkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJb2JqZWN0ID0gZ2V0X3JlZmVyZW5jZShyZXZzLCBhcmcsIHNoYTEsIGZsYWdzIF4gbG9jYWxfZmxhZ3MpOworCWFkZF9wZW5kaW5nX29iamVjdF93aXRoX21vZGUocmV2cywgb2JqZWN0LCBhcmcsIG1vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfZ3JlcChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKnB0biwgZW51bSBncmVwX3BhdF90b2tlbiB3aGF0KQoreworCWlmICghcmV2cy0+Z3JlcF9maWx0ZXIpIHsKKwkJc3RydWN0IGdyZXBfb3B0ICpvcHQgPSB4Y2FsbG9jKDEsIHNpemVvZigqb3B0KSk7CisJCW9wdC0+c3RhdHVzX29ubHkgPSAxOworCQlvcHQtPnBhdHRlcm5fdGFpbCA9ICYob3B0LT5wYXR0ZXJuX2xpc3QpOworCQlvcHQtPnJlZ2ZsYWdzID0gUkVHX05FV0xJTkU7CisJCXJldnMtPmdyZXBfZmlsdGVyID0gb3B0OworCX0KKwlhcHBlbmRfZ3JlcF9wYXR0ZXJuKHJldnMtPmdyZXBfZmlsdGVyLCBwdG4sCisJCQkgICAgImNvbW1hbmQgbGluZSIsIDAsIHdoYXQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfaGVhZGVyX2dyZXAoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpmaWVsZCwgY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwljaGFyICpwYXQ7CisJY29uc3QgY2hhciAqcHJlZml4OworCWludCBwYXRsZW4sIGZsZGxlbjsKKworCWZsZGxlbiA9IHN0cmxlbihmaWVsZCk7CisJcGF0bGVuID0gc3RybGVuKHBhdHRlcm4pOworCXBhdCA9IHhtYWxsb2MocGF0bGVuICsgZmxkbGVuICsgMTApOworCXByZWZpeCA9ICIuKiI7CisJaWYgKCpwYXR0ZXJuID09ICdeJykgeworCQlwcmVmaXggPSAiIjsKKwkJcGF0dGVybisrOworCX0KKwlzcHJpbnRmKHBhdCwgIl4lcyAlcyVzIiwgZmllbGQsIHByZWZpeCwgcGF0dGVybik7CisJYWRkX2dyZXAocmV2cywgcGF0LCBHUkVQX1BBVFRFUk5fSEVBRCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tZXNzYWdlX2dyZXAoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWFkZF9ncmVwKHJldnMsIHBhdHRlcm4sIEdSRVBfUEFUVEVSTl9CT0RZKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2lnbm9yZV9wYWNrZWQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBudW0gPSArK3JldnMtPm51bV9pZ25vcmVfcGFja2VkOworCisJcmV2cy0+aWdub3JlX3BhY2tlZCA9IHhyZWFsbG9jKHJldnMtPmlnbm9yZV9wYWNrZWQsCisJCQkJICAgICAgIHNpemVvZihjb25zdCBjaGFyICoqKSAqIChudW0gKyAxKSk7CisJcmV2cy0+aWdub3JlX3BhY2tlZFtudW0tMV0gPSBuYW1lOworCXJldnMtPmlnbm9yZV9wYWNrZWRbbnVtXSA9IE5VTEw7Cit9CisKKy8qCisgKiBQYXJzZSByZXZpc2lvbiBpbmZvcm1hdGlvbiwgZmlsbGluZyBpbiB0aGUgInJldl9pbmZvIiBzdHJ1Y3R1cmUsCisgKiBhbmQgcmVtb3ZpbmcgdGhlIHVzZWQgYXJndW1lbnRzIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBsZWZ0IHRoYXQgd2VyZW4ndCByZWNvZ25pemVkCisgKiAod2hpY2ggYXJlIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGFyZ3VtZW50IGxpc3QpCisgKi8KK2ludCBzZXR1cF9yZXZpc2lvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKmRlZikKK3sKKwlpbnQgaSwgZmxhZ3MsIHNlZW5fZGFzaGRhc2gsIHNob3dfbWVyZ2U7CisJY29uc3QgY2hhciAqKnVucmVjb2duaXplZCA9IGFyZ3YgKyAxOworCWludCBsZWZ0ID0gMTsKKwlpbnQgYWxsX21hdGNoID0gMDsKKworCS8qIEZpcnN0LCBzZWFyY2ggZm9yICItLSIgKi8KKwlzZWVuX2Rhc2hkYXNoID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmIChzdHJjbXAoYXJnLCAiLS0iKSkKKwkJCWNvbnRpbnVlOworCQlhcmd2W2ldID0gTlVMTDsKKwkJYXJnYyA9IGk7CisJCXJldnMtPnBydW5lX2RhdGEgPSBnZXRfcGF0aHNwZWMocmV2cy0+cHJlZml4LCBhcmd2ICsgaSArIDEpOworCQlzZWVuX2Rhc2hkYXNoID0gMTsKKwkJYnJlYWs7CisJfQorCisJZmxhZ3MgPSBzaG93X21lcmdlID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICgqYXJnID09ICctJykgeworCQkJaW50IG9wdHM7CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLW1heC1jb3VudD0iKSkgeworCQkJCXJldnMtPm1heF9jb3VudCA9IGF0b2koYXJnICsgMTIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1za2lwPSIpKSB7CisJCQkJcmV2cy0+c2tpcF9jb3VudCA9IGF0b2koYXJnICsgNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBhY2NlcHQgLTxkaWdpdD4sIGxpa2UgdHJhZGl0aW9uYWwgImhlYWQiICovCisJCQlpZiAoKCphcmcgPT0gJy0nKSAmJiBpc2RpZ2l0KGFyZ1sxXSkpIHsKKwkJCQlyZXZzLT5tYXhfY291bnQgPSBhdG9pKGFyZyArIDEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJCWlmIChhcmdjIDw9IGkgKyAxKQorCQkJCQlkaWUoIi1uIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmd2WysraV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLW4iKSkgeworCQkJCXJldnMtPm1heF9jb3VudCA9IGF0b2koYXJnICsgMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLW1heC1hZ2U9IikpIHsKKwkJCQlyZXZzLT5tYXhfYWdlID0gYXRvaShhcmcgKyAxMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXNpbmNlPSIpKSB7CisJCQkJcmV2cy0+bWF4X2FnZSA9IGFwcHJveGlkYXRlKGFyZyArIDgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hZnRlcj0iKSkgeworCQkJCXJldnMtPm1heF9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tbWluLWFnZT0iKSkgeworCQkJCXJldnMtPm1pbl9hZ2UgPSBhdG9pKGFyZyArIDEwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYmVmb3JlPSIpKSB7CisJCQkJcmV2cy0+bWluX2FnZSA9IGFwcHJveGlkYXRlKGFyZyArIDkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS11bnRpbD0iKSkgeworCQkJCXJldnMtPm1pbl9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWxsIikpIHsKKwkJCQloYW5kbGVfYWxsKHJldnMsIGZsYWdzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZmlyc3QtcGFyZW50IikpIHsKKwkJCQlyZXZzLT5maXJzdF9wYXJlbnRfb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJlZmxvZyIpKSB7CisJCQkJaGFuZGxlX3JlZmxvZyhyZXZzLCBmbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItZyIpIHx8CisJCQkJCSFzdHJjbXAoYXJnLCAiLS13YWxrLXJlZmxvZ3MiKSkgeworCQkJCWluaXRfcmVmbG9nX3dhbGsoJnJldnMtPnJlZmxvZ19pbmZvKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm90IikpIHsKKwkJCQlmbGFncyBePSBVTklOVEVSRVNUSU5HOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kZWZhdWx0IikpIHsKKwkJCQlpZiAoKytpID49IGFyZ2MpCisJCQkJCWRpZSgiYmFkIC0tZGVmYXVsdCBhcmd1bWVudCIpOworCQkJCWRlZiA9IGFyZ3ZbaV07CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW1lcmdlIikpIHsKKwkJCQlzaG93X21lcmdlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdG9wby1vcmRlciIpKSB7CisJCQkJcmV2cy0+dG9wb19vcmRlciA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWRhdGUtb3JkZXIiKSkgeworCQkJCXJldnMtPmxpZm8gPSAwOworCQkJCXJldnMtPnRvcG9fb3JkZXIgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1wYXJlbnRzIikpIHsKKwkJCQlyZXZzLT5wYXJlbnRzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVuc2UiKSkgeworCQkJCXJldnMtPmRlbnNlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tc3BhcnNlIikpIHsKKwkJCQlyZXZzLT5kZW5zZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJlbW92ZS1lbXB0eSIpKSB7CisJCQkJcmV2cy0+cmVtb3ZlX2VtcHR5X3RyZWVzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tbWVyZ2VzIikpIHsKKwkJCQlyZXZzLT5ub19tZXJnZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1ib3VuZGFyeSIpKSB7CisJCQkJcmV2cy0+Ym91bmRhcnkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1sZWZ0LXJpZ2h0IikpIHsKKwkJCQlyZXZzLT5sZWZ0X3JpZ2h0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tY2hlcnJ5LXBpY2siKSkgeworCQkJCXJldnMtPmNoZXJyeV9waWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cyIpKSB7CisJCQkJcmV2cy0+dGFnX29iamVjdHMgPSAxOworCQkJCXJldnMtPnRyZWVfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+YmxvYl9vYmplY3RzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cy1lZGdlIikpIHsKKwkJCQlyZXZzLT50YWdfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+dHJlZV9vYmplY3RzID0gMTsKKwkJCQlyZXZzLT5ibG9iX29iamVjdHMgPSAxOworCQkJCXJldnMtPmVkZ2VfaGludCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXVucGFja2VkIikpIHsKKwkJCQlyZXZzLT51bnBhY2tlZCA9IDE7CisJCQkJZnJlZShyZXZzLT5pZ25vcmVfcGFja2VkKTsKKwkJCQlyZXZzLT5pZ25vcmVfcGFja2VkID0gTlVMTDsKKwkJCQlyZXZzLT5udW1faWdub3JlX3BhY2tlZCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVucGFja2VkPSIpKSB7CisJCQkJcmV2cy0+dW5wYWNrZWQgPSAxOworCQkJCWFkZF9pZ25vcmVfcGFja2VkKHJldnMsIGFyZysxMSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItciIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZGlmZm9wdC5yZWN1cnNpdmUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXQiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRpZmZvcHQucmVjdXJzaXZlID0gMTsKKwkJCQlyZXZzLT5kaWZmb3B0LnRyZWVfaW5fcmVjdXJzaXZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCQlyZXZzLT5pZ25vcmVfbWVyZ2VzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1jIikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAwOworCQkJCXJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tY2MiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IDE7CisJCQkJcmV2cy0+Y29tYmluZV9tZXJnZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJCXJldnMtPnZlcmJvc2VfaGVhZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcHJldHR5IikpIHsKKwkJCQlyZXZzLT52ZXJib3NlX2hlYWRlciA9IDE7CisJCQkJcmV2cy0+Y29tbWl0X2Zvcm1hdCA9IGdldF9jb21taXRfZm9ybWF0KGFyZys4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcm9vdCIpKSB7CisJCQkJcmV2cy0+c2hvd19yb290X2RpZmYgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1jb21taXQtaWQiKSkgeworCQkJCXJldnMtPm5vX2NvbW1pdF9pZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsd2F5cyIpKSB7CisJCQkJcmV2cy0+YWx3YXlzX3Nob3dfaGVhZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tYWJicmV2IikpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hYmJyZXYiKSkgeworCQkJCXJldnMtPmFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hYmJyZXY9IikpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSBzdHJ0b3VsKGFyZyArIDksIE5VTEwsIDEwKTsKKwkJCQlpZiAocmV2cy0+YWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCXJldnMtPmFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJCWVsc2UgaWYgKHJldnMtPmFiYnJldiA+IDQwKQorCQkJCQlyZXZzLT5hYmJyZXYgPSA0MDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2LWNvbW1pdCIpKSB7CisJCQkJcmV2cy0+YWJicmV2X2NvbW1pdCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwtZGlmZiIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZnVsbF9kaWZmID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZnVsbC1oaXN0b3J5IikpIHsKKwkJCQlyZXZzLT5zaW1wbGlmeV9oaXN0b3J5ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVsYXRpdmUtZGF0ZSIpKSB7CisJCQkJcmV2cy0+ZGF0ZV9tb2RlID0gREFURV9SRUxBVElWRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLWRhdGU9IiwgNykpIHsKKwkJCQlpZiAoIXN0cmNtcChhcmcgKyA3LCAicmVsYXRpdmUiKSkKKwkJCQkJcmV2cy0+ZGF0ZV9tb2RlID0gREFURV9SRUxBVElWRTsKKwkJCQllbHNlIGlmICghc3RyY21wKGFyZyArIDcsICJsb2NhbCIpKQorCQkJCQlyZXZzLT5kYXRlX21vZGUgPSBEQVRFX0xPQ0FMOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoYXJnICsgNywgImRlZmF1bHQiKSkKKwkJCQkJcmV2cy0+ZGF0ZV9tb2RlID0gREFURV9OT1JNQUw7CisJCQkJZWxzZQorCQkJCQlkaWUoInVua25vd24gZGF0ZSBmb3JtYXQgJXMiLCBhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogR3JlcHBpbmcgdGhlIGNvbW1pdCBsb2cKKwkJCSAqLworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hdXRob3I9IikpIHsKKwkJCQlhZGRfaGVhZGVyX2dyZXAocmV2cywgImF1dGhvciIsIGFyZys5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tY29tbWl0dGVyPSIpKSB7CisJCQkJYWRkX2hlYWRlcl9ncmVwKHJldnMsICJjb21taXR0ZXIiLCBhcmcrMTIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1ncmVwPSIpKSB7CisJCQkJYWRkX21lc3NhZ2VfZ3JlcChyZXZzLCBhcmcrNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbC1tYXRjaCIpKSB7CisJCQkJYWxsX21hdGNoID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZW5jb2Rpbmc9IikpIHsKKwkJCQlhcmcgKz0gMTE7CisJCQkJaWYgKHN0cmNtcChhcmcsICJub25lIikpCisJCQkJCWdpdF9sb2dfb3V0cHV0X2VuY29kaW5nID0geHN0cmR1cChhcmcpOworCQkJCWVsc2UKKwkJCQkJZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcgPSAiIjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmV2ZXJzZSIpKSB7CisJCQkJcmV2cy0+cmV2ZXJzZSBePSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlvcHRzID0gZGlmZl9vcHRfcGFyc2UoJnJldnMtPmRpZmZvcHQsIGFyZ3YraSwgYXJnYy1pKTsKKwkJCWlmIChvcHRzID4gMCkgeworCQkJCWlmIChzdHJjbXAoYXJndltpXSwgIi16IikpCisJCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCWkgKz0gb3B0cyAtIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqdW5yZWNvZ25pemVkKysgPSBhcmc7CisJCQlsZWZ0Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChoYW5kbGVfcmV2aXNpb25fYXJnKGFyZywgcmV2cywgZmxhZ3MsIHNlZW5fZGFzaGRhc2gpKSB7CisJCQlpbnQgajsKKwkJCWlmIChzZWVuX2Rhc2hkYXNoIHx8ICphcmcgPT0gJ14nKQorCQkJCWRpZSgiYmFkIHJldmlzaW9uICclcyciLCBhcmcpOworCisJCQkvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhICItLSI6CisJCQkgKiAoMSkgYWxsIGZpbGVuYW1lcyBtdXN0IGV4aXN0OworCQkJICogKDIpIGFsbCByZXYtYXJncyBtdXN0IG5vdCBiZSBpbnRlcnByZXRhYmxlCisJCQkgKiAgICAgYXMgYSB2YWxpZCBmaWxlbmFtZS4KKwkJCSAqIGJ1dCB0aGUgbGF0dGVyIHdlIGhhdmUgY2hlY2tlZCBpbiB0aGUgbWFpbiBsb29wLgorCQkJICovCisJCQlmb3IgKGogPSBpOyBqIDwgYXJnYzsgaisrKQorCQkJCXZlcmlmeV9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZ3Zbal0pOworCisJCQlyZXZzLT5wcnVuZV9kYXRhID0gZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwKKwkJCQkJCQlhcmd2ICsgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzaG93X21lcmdlKQorCQlwcmVwYXJlX3Nob3dfbWVyZ2UocmV2cyk7CisJaWYgKGRlZiAmJiAhcmV2cy0+cGVuZGluZy5ucikgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJCXVuc2lnbmVkIG1vZGU7CisJCWlmIChnZXRfc2hhMV93aXRoX21vZGUoZGVmLCBzaGExLCAmbW9kZSkpCisJCQlkaWUoImJhZCBkZWZhdWx0IHJldmlzaW9uICclcyciLCBkZWYpOworCQlvYmplY3QgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGRlZiwgc2hhMSwgMCk7CisJCWFkZF9wZW5kaW5nX29iamVjdF93aXRoX21vZGUocmV2cywgb2JqZWN0LCBkZWYsIG1vZGUpOworCX0KKworCWlmIChyZXZzLT50b3BvX29yZGVyKQorCQlyZXZzLT5saW1pdGVkID0gMTsKKworCWlmIChyZXZzLT5wcnVuZV9kYXRhKSB7CisJCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhyZXZzLT5wcnVuZV9kYXRhLCAmcmV2cy0+cHJ1bmluZyk7CisJCXJldnMtPnBydW5lX2ZuID0gdHJ5X3RvX3NpbXBsaWZ5X2NvbW1pdDsKKwkJaWYgKCFyZXZzLT5mdWxsX2RpZmYpCisJCQlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocmV2cy0+cHJ1bmVfZGF0YSwgJnJldnMtPmRpZmZvcHQpOworCX0KKwlpZiAocmV2cy0+Y29tYmluZV9tZXJnZXMpIHsKKwkJcmV2cy0+aWdub3JlX21lcmdlcyA9IDA7CisJCWlmIChyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgJiYgIXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJCXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1BBVENIOworCX0KKwlyZXZzLT5kaWZmb3B0LmFiYnJldiA9IHJldnMtPmFiYnJldjsKKwlpZiAoZGlmZl9zZXR1cF9kb25lKCZyZXZzLT5kaWZmb3B0KSA8IDApCisJCWRpZSgiZGlmZl9zZXR1cF9kb25lIGZhaWxlZCIpOworCisJaWYgKHJldnMtPmdyZXBfZmlsdGVyKSB7CisJCXJldnMtPmdyZXBfZmlsdGVyLT5hbGxfbWF0Y2ggPSBhbGxfbWF0Y2g7CisJCWNvbXBpbGVfZ3JlcF9wYXR0ZXJucyhyZXZzLT5ncmVwX2ZpbHRlcik7CisJfQorCisJcmV0dXJuIGxlZnQ7Cit9CisKK2ludCBwcmVwYXJlX3JldmlzaW9uX3dhbGsoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCWludCBuciA9IHJldnMtPnBlbmRpbmcubnI7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZSwgKmxpc3Q7CisKKwllID0gbGlzdCA9IHJldnMtPnBlbmRpbmcub2JqZWN0czsKKwlyZXZzLT5wZW5kaW5nLm5yID0gMDsKKwlyZXZzLT5wZW5kaW5nLmFsbG9jID0gMDsKKwlyZXZzLT5wZW5kaW5nLm9iamVjdHMgPSBOVUxMOworCXdoaWxlICgtLW5yID49IDApIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gaGFuZGxlX2NvbW1pdChyZXZzLCBlLT5pdGVtLCBlLT5uYW1lKTsKKwkJaWYgKGNvbW1pdCkgeworCQkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkgeworCQkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmcmV2cy0+Y29tbWl0cyk7CisJCQl9CisJCX0KKwkJZSsrOworCX0KKwlmcmVlKGxpc3QpOworCisJaWYgKHJldnMtPm5vX3dhbGspCisJCXJldHVybiAwOworCWlmIChyZXZzLT5saW1pdGVkKQorCQlpZiAobGltaXRfbGlzdChyZXZzKSA8IDApCisJCQlyZXR1cm4gLTE7CisJaWYgKHJldnMtPnRvcG9fb3JkZXIpCisJCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4oJnJldnMtPmNvbW1pdHMsIHJldnMtPmxpZm8sCisJCQkJCSAgICAgcmV2cy0+dG9wb19zZXR0ZXIsCisJCQkJCSAgICAgcmV2cy0+dG9wb19nZXR0ZXIpOworCXJldHVybiAwOworfQorCitlbnVtIHJld3JpdGVfcmVzdWx0IHsKKwlyZXdyaXRlX29uZV9vaywKKwlyZXdyaXRlX29uZV9ub3BhcmVudHMsCisJcmV3cml0ZV9vbmVfZXJyb3IsCit9OworCitzdGF0aWMgZW51bSByZXdyaXRlX3Jlc3VsdCByZXdyaXRlX29uZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKipwcCkKK3sKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBjb21taXQgKnAgPSAqcHA7CisJCWlmICghcmV2cy0+bGltaXRlZCkKKwkJCWlmIChhZGRfcGFyZW50c190b19saXN0KHJldnMsIHAsICZyZXZzLT5jb21taXRzKSA8IDApCisJCQkJcmV0dXJuIHJld3JpdGVfb25lX2Vycm9yOworCQlpZiAocC0+cGFyZW50cyAmJiBwLT5wYXJlbnRzLT5uZXh0KQorCQkJcmV0dXJuIHJld3JpdGVfb25lX29rOworCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgKFRSRUVDSEFOR0UgfCBVTklOVEVSRVNUSU5HKSkKKwkJCXJldHVybiByZXdyaXRlX29uZV9vazsKKwkJaWYgKCFwLT5wYXJlbnRzKQorCQkJcmV0dXJuIHJld3JpdGVfb25lX25vcGFyZW50czsKKwkJKnBwID0gcC0+cGFyZW50cy0+aXRlbTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmV3cml0ZV9wYXJlbnRzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqKnBwID0gJmNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAoKnBwKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50ID0gKnBwOworCQlzd2l0Y2ggKHJld3JpdGVfb25lKHJldnMsICZwYXJlbnQtPml0ZW0pKSB7CisJCWNhc2UgcmV3cml0ZV9vbmVfb2s6CisJCQlicmVhazsKKwkJY2FzZSByZXdyaXRlX29uZV9ub3BhcmVudHM6CisJCQkqcHAgPSBwYXJlbnQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJY2FzZSByZXdyaXRlX29uZV9lcnJvcjoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwcCA9ICZwYXJlbnQtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbW1pdF9tYXRjaChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCByZXZfaW5mbyAqb3B0KQoreworCWlmICghb3B0LT5ncmVwX2ZpbHRlcikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGdyZXBfYnVmZmVyKG9wdC0+Z3JlcF9maWx0ZXIsCisJCQkgICBOVUxMLCAvKiB3ZSBzYXkgbm90aGluZywgbm90IGV2ZW4gZmlsZW5hbWUgKi8KKwkJCSAgIGNvbW1pdC0+YnVmZmVyLCBzdHJsZW4oY29tbWl0LT5idWZmZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXQgKmdldF9yZXZpc2lvbl8xKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpZiAoIXJldnMtPmNvbW1pdHMpCisJCXJldHVybiBOVUxMOworCisJZG8geworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKmVudHJ5ID0gcmV2cy0+Y29tbWl0czsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gZW50cnktPml0ZW07CisKKwkJcmV2cy0+Y29tbWl0cyA9IGVudHJ5LT5uZXh0OworCQlmcmVlKGVudHJ5KTsKKworCQlpZiAocmV2cy0+cmVmbG9nX2luZm8pCisJCQlmYWtlX3JlZmxvZ19wYXJlbnQocmV2cy0+cmVmbG9nX2luZm8sIGNvbW1pdCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZW4ndCBkb25lIHRoZSBsaXN0IGxpbWl0aW5nLCB3ZSBuZWVkIHRvIGxvb2sgYXQKKwkJICogdGhlIHBhcmVudHMgaGVyZS4gV2UgYWxzbyBuZWVkIHRvIGRvIHRoZSBkYXRlLWJhc2VkIGxpbWl0aW5nCisJCSAqIHRoYXQgd2UnZCBvdGhlcndpc2UgaGF2ZSBkb25lIGluIGxpbWl0X2xpc3QoKS4KKwkJICovCisJCWlmICghcmV2cy0+bGltaXRlZCkgeworCQkJaWYgKHJldnMtPm1heF9hZ2UgIT0gLTEgJiYKKwkJCSAgICAoY29tbWl0LT5kYXRlIDwgcmV2cy0+bWF4X2FnZSkpCisJCQkJY29udGludWU7CisJCQlpZiAoYWRkX3BhcmVudHNfdG9fbGlzdChyZXZzLCBjb21taXQsICZyZXZzLT5jb21taXRzKSA8IDApCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU0hPV04pCisJCQljb250aW51ZTsKKworCQlpZiAocmV2cy0+dW5wYWNrZWQgJiYgaGFzX3NoYTFfcGFjayhjb21taXQtPm9iamVjdC5zaGExLAorCQkJCQkJICAgIHJldnMtPmlnbm9yZV9wYWNrZWQpKQorCQkgICAgY29udGludWU7CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQlpZiAocmV2cy0+bWluX2FnZSAhPSAtMSAmJiAoY29tbWl0LT5kYXRlID4gcmV2cy0+bWluX2FnZSkpCisJCQljb250aW51ZTsKKwkJaWYgKHJldnMtPm5vX21lcmdlcyAmJgorCQkgICAgY29tbWl0LT5wYXJlbnRzICYmIGNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNvbW1pdF9tYXRjaChjb21taXQsIHJldnMpKQorCQkJY29udGludWU7CisJCWlmIChyZXZzLT5wcnVuZV9mbiAmJiByZXZzLT5kZW5zZSkgeworCQkJLyogQ29tbWl0IHdpdGhvdXQgY2hhbmdlcz8gKi8KKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVFJFRUNIQU5HRSkpIHsKKwkJCQkvKiBkcm9wIG1lcmdlcyB1bmxlc3Mgd2Ugd2FudCBwYXJlbnRob29kICovCisJCQkJaWYgKCFyZXZzLT5wYXJlbnRzKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBub24tbWVyZ2UgLSBhbHdheXMgaWdub3JlIGl0ICovCisJCQkJaWYgKCFjb21taXQtPnBhcmVudHMgfHwgIWNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocmV2cy0+cGFyZW50cyAmJiByZXdyaXRlX3BhcmVudHMocmV2cywgY29tbWl0KSA8IDApCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIGNvbW1pdDsKKwl9IHdoaWxlIChyZXZzLT5jb21taXRzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ2NfYm91bmRhcnkoc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXkpCit7CisJdW5zaWduZWQgbnIgPSBhcnJheS0+bnI7CisJdW5zaWduZWQgYWxsb2MgPSBhcnJheS0+YWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqb2JqZWN0cyA9IGFycmF5LT5vYmplY3RzOworCisJaWYgKGFsbG9jIDw9IG5yKSB7CisJCXVuc2lnbmVkIGksIGo7CisJCWZvciAoaSA9IGogPSAwOyBpIDwgbnI7IGkrKykgeworCQkJaWYgKG9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgJiBTSE9XTikKKwkJCQljb250aW51ZTsKKwkJCWlmIChpICE9IGopCisJCQkJb2JqZWN0c1tqXSA9IG9iamVjdHNbaV07CisJCQlqKys7CisJCX0KKwkJZm9yIChpID0gajsgaSA8IG5yOyBpKyspCisJCQlvYmplY3RzW2ldLml0ZW0gPSBOVUxMOworCQlhcnJheS0+bnIgPSBqOworCX0KK30KKworc3RydWN0IGNvbW1pdCAqZ2V0X3JldmlzaW9uKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjID0gTlVMTDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmw7CisKKwlpZiAocmV2cy0+Ym91bmRhcnkgPT0gMikgeworCQl1bnNpZ25lZCBpOworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSA9ICZyZXZzLT5ib3VuZGFyeV9jb21taXRzOworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvYmplY3RzID0gYXJyYXktPm9iamVjdHM7CisJCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+bnI7IGkrKykgeworCQkJYyA9IChzdHJ1Y3QgY29tbWl0ICopKG9iamVjdHNbaV0uaXRlbSk7CisJCQlpZiAoIWMpCisJCQkJY29udGludWU7CisJCQlpZiAoIShjLT5vYmplY3QuZmxhZ3MgJiBDSElMRF9TSE9XTikpCisJCQkJY29udGludWU7CisJCQlpZiAoIShjLT5vYmplY3QuZmxhZ3MgJiBTSE9XTikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFycmF5LT5uciA8PSBpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJYy0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOIHwgQk9VTkRBUlk7CisJCXJldHVybiBjOworCX0KKworCWlmIChyZXZzLT5yZXZlcnNlKSB7CisJCWludCBsaW1pdCA9IC0xOworCisJCWlmICgwIDw9IHJldnMtPm1heF9jb3VudCkgeworCQkJbGltaXQgPSByZXZzLT5tYXhfY291bnQ7CisJCQlpZiAoMCA8IHJldnMtPnNraXBfY291bnQpCisJCQkJbGltaXQgKz0gcmV2cy0+c2tpcF9jb3VudDsKKwkJfQorCQlsID0gTlVMTDsKKwkJd2hpbGUgKChjID0gZ2V0X3JldmlzaW9uXzEocmV2cykpKSB7CisJCQljb21taXRfbGlzdF9pbnNlcnQoYywgJmwpOworCQkJaWYgKCgwIDwgbGltaXQpICYmICEtLWxpbWl0KQorCQkJCWJyZWFrOworCQl9CisJCXJldnMtPmNvbW1pdHMgPSBsOworCQlyZXZzLT5yZXZlcnNlID0gMDsKKwkJcmV2cy0+bWF4X2NvdW50ID0gLTE7CisJCWMgPSBOVUxMOworCX0KKworCS8qCisJICogTm93IHBpY2sgdXAgd2hhdCB0aGV5IHdhbnQgdG8gZ2l2ZSB1cworCSAqLworCWMgPSBnZXRfcmV2aXNpb25fMShyZXZzKTsKKwlpZiAoYykgeworCQl3aGlsZSAoMCA8IHJldnMtPnNraXBfY291bnQpIHsKKwkJCXJldnMtPnNraXBfY291bnQtLTsKKwkJCWMgPSBnZXRfcmV2aXNpb25fMShyZXZzKTsKKwkJCWlmICghYykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgdGhlIG1heF9jb3VudC4KKwkgKi8KKwlzd2l0Y2ggKHJldnMtPm1heF9jb3VudCkgeworCWNhc2UgLTE6CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYyA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldnMtPm1heF9jb3VudC0tOworCX0KKworCWlmIChjKQorCQljLT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisKKwlpZiAoIXJldnMtPmJvdW5kYXJ5KSB7CisJCXJldHVybiBjOworCX0KKworCWlmICghYykgeworCQkvKgorCQkgKiBnZXRfcmV2aXNpb25fMSgpIHJ1bnMgb3V0IHRoZSBjb21taXRzLCBhbmQKKwkJICogd2UgYXJlIGRvbmUgY29tcHV0aW5nIHRoZSBib3VuZGFyaWVzLgorCQkgKiBzd2l0Y2ggdG8gYm91bmRhcnkgY29tbWl0cyBvdXRwdXQgbW9kZS4KKwkJICovCisJCXJldnMtPmJvdW5kYXJ5ID0gMjsKKwkJcmV0dXJuIGdldF9yZXZpc2lvbihyZXZzKTsKKwl9CisKKwkvKgorCSAqIGJvdW5kYXJ5IGNvbW1pdHMgYXJlIHRoZSBjb21taXRzIHRoYXQgYXJlIHBhcmVudHMgb2YgdGhlCisJICogb25lcyB3ZSBnb3QgZnJvbSBnZXRfcmV2aXNpb25fMSgpIGJ1dCB0aGV5IHRoZW1zZWx2ZXMgYXJlCisJICogbm90IHJldHVybmVkIGZyb20gZ2V0X3JldmlzaW9uXzEoKS4gIEJlZm9yZSByZXR1cm5pbmcKKwkgKiAnYycsIHdlIG5lZWQgdG8gbWFyayBpdHMgcGFyZW50cyB0aGF0IHRoZXkgY291bGQgYmUgYm91bmRhcmllcy4KKwkgKi8KKworCWZvciAobCA9IGMtPnBhcmVudHM7IGw7IGwgPSBsLT5uZXh0KSB7CisJCXN0cnVjdCBvYmplY3QgKnA7CisJCXAgPSAmKGwtPml0ZW0tPm9iamVjdCk7CisJCWlmIChwLT5mbGFncyAmIChDSElMRF9TSE9XTiB8IFNIT1dOKSkKKwkJCWNvbnRpbnVlOworCQlwLT5mbGFncyB8PSBDSElMRF9TSE9XTjsKKwkJZ2NfYm91bmRhcnkoJnJldnMtPmJvdW5kYXJ5X2NvbW1pdHMpOworCQlhZGRfb2JqZWN0X2FycmF5KHAsIE5VTEwsICZyZXZzLT5ib3VuZGFyeV9jb21taXRzKTsKKwl9CisKKwlyZXR1cm4gYzsKK30KZGlmZiAtLWdpdCBhL3JldmlzaW9uLmggYi9yZXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDUxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsMTM2IEBACisjaWZuZGVmIFJFVklTSU9OX0gKKyNkZWZpbmUgUkVWSVNJT05fSAorCisjZGVmaW5lIFNFRU4JCSgxdTw8MCkKKyNkZWZpbmUgVU5JTlRFUkVTVElORyAgICgxdTw8MSkKKyNkZWZpbmUgVFJFRUNIQU5HRQkoMXU8PDIpCisjZGVmaW5lIFNIT1dOCQkoMXU8PDMpCisjZGVmaW5lIFRNUF9NQVJLCSgxdTw8NCkgLyogZm9yIGlzb2xhdGVkIGNhc2VzOyBjbGVhbiBhZnRlciB1c2UgKi8KKyNkZWZpbmUgQk9VTkRBUlkJKDF1PDw1KQorI2RlZmluZSBDSElMRF9TSE9XTgkoMXU8PDYpCisjZGVmaW5lIEFEREVECQkoMXU8PDcpCS8qIFBhcmVudHMgYWxyZWFkeSBwYXJzZWQgYW5kIGFkZGVkPyAqLworI2RlZmluZSBTWU1NRVRSSUNfTEVGVAkoMXU8PDgpCisKK3N0cnVjdCByZXZfaW5mbzsKK3N0cnVjdCBsb2dfaW5mbzsKKwordHlwZWRlZiB2b2lkIChwcnVuZV9mbl90KShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CisKK3N0cnVjdCByZXZfaW5mbyB7CisJLyogU3RhcnRpbmcgbGlzdCAqLworCXN0cnVjdCBjb21taXRfbGlzdCAqY29tbWl0czsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHBlbmRpbmc7CisKKwkvKiBQYXJlbnRzIG9mIHNob3duIGNvbW1pdHMgKi8KKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IGJvdW5kYXJ5X2NvbW1pdHM7CisKKwkvKiBCYXNpYyBpbmZvcm1hdGlvbiAqLworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwl2b2lkICpwcnVuZV9kYXRhOworCXBydW5lX2ZuX3QgKnBydW5lX2ZuOworCisJLyogVHJhdmVyc2FsIGZsYWdzICovCisJdW5zaWduZWQgaW50CWRlbnNlOjEsCisJCQlub19tZXJnZXM6MSwKKwkJCW5vX3dhbGs6MSwKKwkJCXJlbW92ZV9lbXB0eV90cmVlczoxLAorCQkJc2ltcGxpZnlfaGlzdG9yeToxLAorCQkJbGlmbzoxLAorCQkJdG9wb19vcmRlcjoxLAorCQkJdGFnX29iamVjdHM6MSwKKwkJCXRyZWVfb2JqZWN0czoxLAorCQkJYmxvYl9vYmplY3RzOjEsCisJCQllZGdlX2hpbnQ6MSwKKwkJCWxpbWl0ZWQ6MSwKKwkJCXVucGFja2VkOjEsIC8qIHNlZSBhbHNvIGlnbm9yZV9wYWNrZWQgYmVsb3cgKi8KKwkJCWJvdW5kYXJ5OjIsCisJCQlsZWZ0X3JpZ2h0OjEsCisJCQlwYXJlbnRzOjEsCisJCQlyZXZlcnNlOjEsCisJCQljaGVycnlfcGljazoxLAorCQkJZmlyc3RfcGFyZW50X29ubHk6MTsKKworCS8qIERpZmYgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJZGlmZjoxLAorCQkJZnVsbF9kaWZmOjEsCisJCQlzaG93X3Jvb3RfZGlmZjoxLAorCQkJbm9fY29tbWl0X2lkOjEsCisJCQl2ZXJib3NlX2hlYWRlcjoxLAorCQkJaWdub3JlX21lcmdlczoxLAorCQkJY29tYmluZV9tZXJnZXM6MSwKKwkJCWRlbnNlX2NvbWJpbmVkX21lcmdlczoxLAorCQkJYWx3YXlzX3Nob3dfaGVhZGVyOjE7CisKKwkvKiBGb3JtYXQgaW5mbyAqLworCXVuc2lnbmVkIGludAlzaG93bl9vbmU6MSwKKwkJCWFiYnJldl9jb21taXQ6MTsKKwllbnVtIGRhdGVfbW9kZSBkYXRlX21vZGU7CisKKwljb25zdCBjaGFyICoqaWdub3JlX3BhY2tlZDsgLyogcHJldGVuZCBvYmplY3RzIGluIHRoZXNlIGFyZSB1bnBhY2tlZCAqLworCWludCBudW1faWdub3JlX3BhY2tlZDsKKworCXVuc2lnbmVkIGludAlhYmJyZXY7CisJZW51bSBjbWl0X2ZtdAljb21taXRfZm9ybWF0OworCXN0cnVjdCBsb2dfaW5mbyAqbG9naW5mbzsKKwlpbnQJCW5yLCB0b3RhbDsKKwljb25zdCBjaGFyCSptaW1lX2JvdW5kYXJ5OworCWNvbnN0IGNoYXIJKm1lc3NhZ2VfaWQ7CisJY29uc3QgY2hhcgkqcmVmX21lc3NhZ2VfaWQ7CisJY29uc3QgY2hhcgkqYWRkX3NpZ25vZmY7CisJY29uc3QgY2hhcgkqZXh0cmFfaGVhZGVyczsKKwljb25zdCBjaGFyCSpsb2dfcmVlbmNvZGU7CisJY29uc3QgY2hhcgkqc3ViamVjdF9wcmVmaXg7CisJaW50CQlub19pbmxpbmU7CisKKwkvKiBGaWx0ZXIgYnkgY29tbWl0IGxvZyBtZXNzYWdlICovCisJc3RydWN0IGdyZXBfb3B0CSpncmVwX2ZpbHRlcjsKKworCS8qIHNwZWNpYWwgbGltaXRzICovCisJaW50IHNraXBfY291bnQ7CisJaW50IG1heF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIG1heF9hZ2U7CisJdW5zaWduZWQgbG9uZyBtaW5fYWdlOworCisJLyogZGlmZiBpbmZvIGZvciBwYXRjaGVzIGFuZCBmb3IgcGF0aHMgbGltaXRpbmcgKi8KKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZvcHQ7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBwcnVuaW5nOworCisJdG9wb19zb3J0X3NldF9mbl90IHRvcG9fc2V0dGVyOworCXRvcG9fc29ydF9nZXRfZm5fdCB0b3BvX2dldHRlcjsKKworCXN0cnVjdCByZWZsb2dfd2Fsa19pbmZvICpyZWZsb2dfaW5mbzsKK307CisKKyNkZWZpbmUgUkVWX1RSRUVfU0FNRQkJMAorI2RlZmluZSBSRVZfVFJFRV9ORVcJCTEKKyNkZWZpbmUgUkVWX1RSRUVfRElGRkVSRU5UCTIKKworLyogcmV2aXNpb24uYyAqLworZXh0ZXJuIGludCByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHN0cnVjdCByZXZfaW5mbyAqLCBzdHJ1Y3QgdHJlZSAqdDEpOworZXh0ZXJuIGludCByZXZfY29tcGFyZV90cmVlKHN0cnVjdCByZXZfaW5mbyAqLCBzdHJ1Y3QgdHJlZSAqdDEsIHN0cnVjdCB0cmVlICp0Mik7CisKK2V4dGVybiB2b2lkIGluaXRfcmV2aXNpb25zKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgc2V0dXBfcmV2aXNpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpkZWYpOworZXh0ZXJuIGludCBoYW5kbGVfcmV2aXNpb25fYXJnKGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHJldl9pbmZvICpyZXZzLGludCBmbGFncyxpbnQgY2FudF9iZV9maWxlbmFtZSk7CisKK2V4dGVybiBpbnQgcHJlcGFyZV9yZXZpc2lvbl93YWxrKHN0cnVjdCByZXZfaW5mbyAqcmV2cyk7CitleHRlcm4gc3RydWN0IGNvbW1pdCAqZ2V0X3JldmlzaW9uKHN0cnVjdCByZXZfaW5mbyAqcmV2cyk7CisKK2V4dGVybiB2b2lkIG1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CitleHRlcm4gdm9pZCBtYXJrX3RyZWVfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgdHJlZSAqdHJlZSk7CisKK3N0cnVjdCBuYW1lX3BhdGggeworCXN0cnVjdCBuYW1lX3BhdGggKnVwOworCWludCBlbGVtX2xlbjsKKwljb25zdCBjaGFyICplbGVtOworfTsKKworZXh0ZXJuIHZvaWQgYWRkX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmosCisJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkgICAgICAgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gdm9pZCBhZGRfcGVuZGluZ19vYmplY3Qoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0X3dpdGhfbW9kZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbW9kZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnNoLmMgYi9yc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU0YTIzCi0tLSAvZGV2L251bGwKKysrIGIvcnNoLmMKQEAgLTAsMCArMSw4MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnNoLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworI2RlZmluZSBDT01NQU5EX1NJWkUgNDA5NgorCitpbnQgc2V0dXBfY29ubmVjdGlvbihpbnQgKmZkX2luLCBpbnQgKmZkX291dCwgY29uc3QgY2hhciAqcmVtb3RlX3Byb2csCisJCSAgICAgY2hhciAqdXJsLCBpbnQgcm10X2FyZ2MsIGNoYXIgKipybXRfYXJndikKK3sKKwljaGFyICpob3N0OworCWNoYXIgKnBhdGg7CisJaW50IHN2WzJdOworCWNoYXIgY29tbWFuZFtDT01NQU5EX1NJWkVdOworCWNoYXIgKnBvc247CisJaW50IHNpemVuOworCWludCBvZjsKKwlpbnQgaTsKKwlwaWRfdCBwaWQ7CisKKwlpZiAoIXN0cmNtcCh1cmwsICItIikpIHsKKwkJKmZkX2luID0gMDsKKwkJKmZkX291dCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWhvc3QgPSBzdHJzdHIodXJsLCAiLy8iKTsKKwlpZiAoaG9zdCkgeworCQlob3N0ICs9IDI7CisJCXBhdGggPSBzdHJjaHIoaG9zdCwgJy8nKTsKKwl9IGVsc2UgeworCQlob3N0ID0gdXJsOworCQlwYXRoID0gc3RyY2hyKGhvc3QsICc6Jyk7CisJCWlmIChwYXRoKQorCQkJKihwYXRoKyspID0gJ1wwJzsKKwl9CisJaWYgKCFwYXRoKSB7CisJCXJldHVybiBlcnJvcigiQmFkIFVSTDogJXMiLCB1cmwpOworCX0KKwkvKiAkR0lUX1JTSCA8aG9zdD4gImVudiBHSVRfRElSPTxwYXRoPiA8cmVtb3RlX3Byb2c+IDxhcmdzLi4uPiIgKi8KKwlzaXplbiA9IENPTU1BTkRfU0laRTsKKwlwb3NuID0gY29tbWFuZDsKKwlvZiA9IDA7CisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCAiZW52ICIsIDApOworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgR0lUX0RJUl9FTlZJUk9OTUVOVCAiPSIsIDApOworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgcGF0aCwgMSk7CisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCAiICIsIDApOworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgcmVtb3RlX3Byb2csIDEpOworCisJZm9yICggaSA9IDAgOyBpIDwgcm10X2FyZ2MgOyBpKysgKSB7CisJCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgIiAiLCAwKTsKKwkJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCBybXRfYXJndltpXSwgMSk7CisJfQorCisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCAiIC0iLCAwKTsKKworCWlmICggb2YgKQorCQlyZXR1cm4gZXJyb3IoIkNvbW1hbmQgbGluZSB0b28gbG9uZyIpOworCisJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHN2KSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBjcmVhdGUgc29ja2V0Iik7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgZm9yayIpOworCWlmICghcGlkKSB7CisJCWNvbnN0IGNoYXIgKnNzaCwgKnNzaF9iYXNlbmFtZTsKKwkJc3NoID0gZ2V0ZW52KCJHSVRfU1NIIik7CisJCWlmICghc3NoKSBzc2ggPSAic3NoIjsKKwkJc3NoX2Jhc2VuYW1lID0gc3RycmNocihzc2gsICcvJyk7CisJCWlmICghc3NoX2Jhc2VuYW1lKQorCQkJc3NoX2Jhc2VuYW1lID0gc3NoOworCQllbHNlCisJCQlzc2hfYmFzZW5hbWUrKzsKKwkJY2xvc2Uoc3ZbMV0pOworCQlkdXAyKHN2WzBdLCAwKTsKKwkJZHVwMihzdlswXSwgMSk7CisJCWV4ZWNscChzc2gsIHNzaF9iYXNlbmFtZSwgaG9zdCwgY29tbWFuZCwgTlVMTCk7CisJfQorCWNsb3NlKHN2WzBdKTsKKwkqZmRfaW4gPSBzdlsxXTsKKwkqZmRfb3V0ID0gc3ZbMV07CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yc2guaCBiL3JzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDE5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9yc2guaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgUlNIX0gKKyNkZWZpbmUgUlNIX0gKKworaW50IHNldHVwX2Nvbm5lY3Rpb24oaW50ICpmZF9pbiwgaW50ICpmZF9vdXQsIGNvbnN0IGNoYXIgKnJlbW90ZV9wcm9nLCAKKwkJICAgICBjaGFyICp1cmwsIGludCBybXRfYXJnYywgY2hhciAqKnJtdF9hcmd2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ydW4tY29tbWFuZC5jIGIvcnVuLWNvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY1MjNlCi0tLSAvZGV2L251bGwKKysrIGIvcnVuLWNvbW1hbmQuYwpAQCAtMCwwICsxLDE0NSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VfcGFpcihpbnQgZmRbMl0pCit7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1cF9kZXZudWxsKGludCB0bykKK3sKKwlpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOworCWR1cDIoZmQsIHRvKTsKKwljbG9zZShmZCk7Cit9CisKK2ludCBzdGFydF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICpjbWQpCit7CisJaW50IG5lZWRfaW4sIG5lZWRfb3V0OworCWludCBmZGluWzJdLCBmZG91dFsyXTsKKworCW5lZWRfaW4gPSAhY21kLT5ub19zdGRpbiAmJiBjbWQtPmluIDwgMDsKKwlpZiAobmVlZF9pbikgeworCQlpZiAocGlwZShmZGluKSA8IDApCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9QSVBFOworCQljbWQtPmluID0gZmRpblsxXTsKKwkJY21kLT5jbG9zZV9pbiA9IDE7CisJfQorCisJbmVlZF9vdXQgPSAhY21kLT5ub19zdGRvdXQKKwkJJiYgIWNtZC0+c3Rkb3V0X3RvX3N0ZGVycgorCQkmJiBjbWQtPm91dCA8IDA7CisJaWYgKG5lZWRfb3V0KSB7CisJCWlmIChwaXBlKGZkb3V0KSA8IDApIHsKKwkJCWlmIChuZWVkX2luKQorCQkJCWNsb3NlX3BhaXIoZmRpbik7CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9QSVBFOworCQl9CisJCWNtZC0+b3V0ID0gZmRvdXRbMF07CisJCWNtZC0+Y2xvc2Vfb3V0ID0gMTsKKwl9CisKKwljbWQtPnBpZCA9IGZvcmsoKTsKKwlpZiAoY21kLT5waWQgPCAwKSB7CisJCWlmIChuZWVkX2luKQorCQkJY2xvc2VfcGFpcihmZGluKTsKKwkJaWYgKG5lZWRfb3V0KQorCQkJY2xvc2VfcGFpcihmZG91dCk7CisJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX0ZPUks7CisJfQorCisJaWYgKCFjbWQtPnBpZCkgeworCQlpZiAoY21kLT5ub19zdGRpbikKKwkJCWR1cF9kZXZudWxsKDApOworCQllbHNlIGlmIChuZWVkX2luKSB7CisJCQlkdXAyKGZkaW5bMF0sIDApOworCQkJY2xvc2VfcGFpcihmZGluKTsKKwkJfSBlbHNlIGlmIChjbWQtPmluKSB7CisJCQlkdXAyKGNtZC0+aW4sIDApOworCQkJY2xvc2UoY21kLT5pbik7CisJCX0KKworCQlpZiAoY21kLT5ub19zdGRvdXQpCisJCQlkdXBfZGV2bnVsbCgxKTsKKwkJZWxzZSBpZiAoY21kLT5zdGRvdXRfdG9fc3RkZXJyKQorCQkJZHVwMigyLCAxKTsKKwkJZWxzZSBpZiAobmVlZF9vdXQpIHsKKwkJCWR1cDIoZmRvdXRbMV0sIDEpOworCQkJY2xvc2VfcGFpcihmZG91dCk7CisJCX0gZWxzZSBpZiAoY21kLT5vdXQgPiAxKSB7CisJCQlkdXAyKGNtZC0+b3V0LCAxKTsKKwkJCWNsb3NlKGNtZC0+b3V0KTsKKwkJfQorCisJCWlmIChjbWQtPmdpdF9jbWQpIHsKKwkJCWV4ZWN2X2dpdF9jbWQoY21kLT5hcmd2KTsKKwkJfSBlbHNlIHsKKwkJCWV4ZWN2cChjbWQtPmFyZ3ZbMF0sIChjaGFyICpjb25zdCopIGNtZC0+YXJndik7CisJCX0KKwkJZGllKCJleGVjICVzIGZhaWxlZC4iLCBjbWQtPmFyZ3ZbMF0pOworCX0KKworCWlmIChuZWVkX2luKQorCQljbG9zZShmZGluWzBdKTsKKwllbHNlIGlmIChjbWQtPmluKQorCQljbG9zZShjbWQtPmluKTsKKworCWlmIChuZWVkX291dCkKKwkJY2xvc2UoZmRvdXRbMV0pOworCWVsc2UgaWYgKGNtZC0+b3V0ID4gMSkKKwkJY2xvc2UoY21kLT5vdXQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBmaW5pc2hfY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY21kKQoreworCWlmIChjbWQtPmNsb3NlX2luKQorCQljbG9zZShjbWQtPmluKTsKKwlpZiAoY21kLT5jbG9zZV9vdXQpCisJCWNsb3NlKGNtZC0+b3V0KTsKKworCWZvciAoOzspIHsKKwkJaW50IHN0YXR1cywgY29kZTsKKwkJcGlkX3Qgd2FpdGluZyA9IHdhaXRwaWQoY21kLT5waWQsICZzdGF0dXMsIDApOworCisJCWlmICh3YWl0aW5nIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDsKKwkJfQorCQlpZiAod2FpdGluZyAhPSBjbWQtPnBpZCkKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOworCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfU0lHTkFMOworCisJCWlmICghV0lGRVhJVEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX05PRVhJVDsKKwkJY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWlmIChjb2RlKQorCQkJcmV0dXJuIC1jb2RlOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBydW5fY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY21kKQoreworCWludCBjb2RlID0gc3RhcnRfY29tbWFuZChjbWQpOworCWlmIChjb2RlKQorCQlyZXR1cm4gY29kZTsKKwlyZXR1cm4gZmluaXNoX2NvbW1hbmQoY21kKTsKK30KKworaW50IHJ1bl9jb21tYW5kX3Zfb3B0KGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgb3B0KQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGNtZDsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5hcmd2ID0gYXJndjsKKwljbWQubm9fc3RkaW4gPSBvcHQgJiBSVU5fQ09NTUFORF9OT19TVERJTiA/IDEgOiAwOworCWNtZC5naXRfY21kID0gb3B0ICYgUlVOX0dJVF9DTUQgPyAxIDogMDsKKwljbWQuc3Rkb3V0X3RvX3N0ZGVyciA9IG9wdCAmIFJVTl9DT01NQU5EX1NURE9VVF9UT19TVERFUlIgPyAxIDogMDsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CmRpZmYgLS1naXQgYS9ydW4tY29tbWFuZC5oIGIvcnVuLWNvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgwZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVuLWNvbW1hbmQuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIFJVTl9DT01NQU5EX0gKKyNkZWZpbmUgUlVOX0NPTU1BTkRfSAorCitlbnVtIHsKKwlFUlJfUlVOX0NPTU1BTkRfRk9SSyA9IDEwMDAwLAorCUVSUl9SVU5fQ09NTUFORF9FWEVDLAorCUVSUl9SVU5fQ09NTUFORF9QSVBFLAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUwsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElULAorfTsKKworc3RydWN0IGNoaWxkX3Byb2Nlc3MgeworCWNvbnN0IGNoYXIgKiphcmd2OworCXBpZF90IHBpZDsKKwlpbnQgaW47CisJaW50IG91dDsKKwl1bnNpZ25lZCBjbG9zZV9pbjoxOworCXVuc2lnbmVkIGNsb3NlX291dDoxOworCXVuc2lnbmVkIG5vX3N0ZGluOjE7CisJdW5zaWduZWQgbm9fc3Rkb3V0OjE7CisJdW5zaWduZWQgZ2l0X2NtZDoxOyAvKiBpZiB0aGlzIGlzIHRvIGJlIGdpdCBzdWItY29tbWFuZCAqLworCXVuc2lnbmVkIHN0ZG91dF90b19zdGRlcnI6MTsKK307CisKK2ludCBzdGFydF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICopOworaW50IGZpbmlzaF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICopOworaW50IHJ1bl9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICopOworCisjZGVmaW5lIFJVTl9DT01NQU5EX05PX1NURElOIDEKKyNkZWZpbmUgUlVOX0dJVF9DTUQJICAgICAyCS8qSWYgdGhpcyBpcyB0byBiZSBnaXQgc3ViLWNvbW1hbmQgKi8KKyNkZWZpbmUgUlVOX0NPTU1BTkRfU1RET1VUX1RPX1NUREVSUiA0CitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlbmQtcGFjay5jIGIvc2VuZC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViNTE2MgotLS0gL2Rldi9udWxsCisrKyBiL3NlbmQtcGFjay5jCkBAIC0wLDAgKzEsNDA0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBzZW5kX3BhY2tfdXNhZ2VbXSA9CisiZ2l0LXNlbmQtcGFjayBbLS1hbGxdIFstLWZvcmNlXSBbLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+XSBbLS12ZXJib3NlXSBbLS10aGluXSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZj4uLi5dXG4iCisiICAtLWFsbCBhbmQgZXhwbGljaXQgPHJlZj4gc3BlY2lmaWNhdGlvbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CitzdGF0aWMgY29uc3QgY2hhciAqcmVjZWl2ZXBhY2sgPSAiZ2l0LXJlY2VpdmUtcGFjayI7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IHNlbmRfYWxsOworc3RhdGljIGludCBmb3JjZV91cGRhdGU7CitzdGF0aWMgaW50IHVzZV90aGluX3BhY2s7CisKKy8qCisgKiBNYWtlIGEgcGFjayBzdHJlYW0gYW5kIHNwaXQgaXQgb3V0IGludG8gZmlsZSBkZXNjcmlwdG9yIGZkCisgKi8KK3N0YXRpYyBpbnQgcGFja19vYmplY3RzKGludCBmZCwgc3RydWN0IHJlZiAqcmVmcykKK3sKKwkvKgorCSAqIFRoZSBjaGlsZCBiZWNvbWVzIHBhY2stb2JqZWN0cyAtLXJldnM7IHdlIGZlZWQKKwkgKiB0aGUgcmV2aXNpb24gcGFyYW1ldGVycyB0byBpdCB2aWEgaXRzIHN0ZGluIGFuZAorCSAqIGxldCBpdHMgc3Rkb3V0IGdvIGJhY2sgdG8gdGhlIG90aGVyIGVuZC4KKwkgKi8KKwljb25zdCBjaGFyICphcmdzW10gPSB7CisJCSJwYWNrLW9iamVjdHMiLAorCQkiLS1hbGwtcHJvZ3Jlc3MiLAorCQkiLS1yZXZzIiwKKwkJIi0tc3Rkb3V0IiwKKwkJTlVMTCwKKwkJTlVMTCwKKwl9OworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHBvOworCisJaWYgKHVzZV90aGluX3BhY2spCisJCWFyZ3NbNF0gPSAiLS10aGluIjsKKwltZW1zZXQoJnBvLCAwLCBzaXplb2YocG8pKTsKKwlwby5hcmd2ID0gYXJnczsKKwlwby5pbiA9IC0xOworCXBvLm91dCA9IGZkOworCXBvLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZwbykpCisJCWRpZSgiZ2l0LXBhY2stb2JqZWN0cyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKgorCSAqIFdlIGZlZWQgdGhlIHBhY2stb2JqZWN0cyB3ZSBqdXN0IHNwYXduZWQgd2l0aCByZXZpc2lvbgorCSAqIHBhcmFtZXRlcnMgYnkgd3JpdGluZyB0byB0aGUgcGlwZS4KKwkgKi8KKwl3aGlsZSAocmVmcykgeworCQljaGFyIGJ1Zls0Ml07CisKKwkJaWYgKCFpc19udWxsX3NoYTEocmVmcy0+b2xkX3NoYTEpICYmCisJCSAgICBoYXNfc2hhMV9maWxlKHJlZnMtPm9sZF9zaGExKSkgeworCQkJbWVtY3B5KGJ1ZiArIDEsIHNoYTFfdG9faGV4KHJlZnMtPm9sZF9zaGExKSwgNDApOworCQkJYnVmWzBdID0gJ14nOworCQkJYnVmWzQxXSA9ICdcbic7CisJCQlpZiAoIXdyaXRlX29yX3doaW5lKHBvLmluLCBidWYsIDQyLAorCQkJCQkJInNlbmQtcGFjazogc2VuZCByZWZzIikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpc19udWxsX3NoYTEocmVmcy0+bmV3X3NoYTEpKSB7CisJCQltZW1jcHkoYnVmLCBzaGExX3RvX2hleChyZWZzLT5uZXdfc2hhMSksIDQwKTsKKwkJCWJ1Zls0MF0gPSAnXG4nOworCQkJaWYgKCF3cml0ZV9vcl93aGluZShwby5pbiwgYnVmLCA0MSwKKwkJCQkJCSJzZW5kLXBhY2s6IHNlbmQgcmVmcyIpKQorCQkJCWJyZWFrOworCQl9CisJCXJlZnMgPSByZWZzLT5uZXh0OworCX0KKworCWlmIChmaW5pc2hfY29tbWFuZCgmcG8pKQorCQlyZXR1cm4gZXJyb3IoInBhY2stb2JqZWN0cyBkaWVkIHdpdGggc3RyYW5nZSBlcnJvciIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bm1hcmtfYW5kX2ZyZWUoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LCB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRlbXAgPSBsaXN0OworCQl0ZW1wLT5pdGVtLT5vYmplY3QuZmxhZ3MgJj0gfm1hcms7CisJCWxpc3QgPSB0ZW1wLT5uZXh0OworCQlmcmVlKHRlbXApOworCX0KK30KKworc3RhdGljIGludCByZWZfbmV3ZXIoY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEpCit7CisJc3RydWN0IG9iamVjdCAqbzsKKwlzdHJ1Y3QgY29tbWl0ICpvbGQsICpuZXc7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LCAqdXNlZDsKKwlpbnQgZm91bmQgPSAwOworCisJLyogQm90aCBuZXcgYW5kIG9sZCBtdXN0IGJlIGNvbW1pdC1pc2ggYW5kIG5ldyBpcyBkZXNjZW5kYW50IG9mCisJICogb2xkLiAgT3RoZXJ3aXNlIHdlIHJlcXVpcmUgLS1mb3JjZS4KKwkgKi8KKwlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChvbGRfc2hhMSksIE5VTEwsIDApOworCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiAwOworCW9sZCA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChuZXdfc2hhMSksIE5VTEwsIDApOworCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiAwOworCW5ldyA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlpZiAocGFyc2VfY29tbWl0KG5ldykgPCAwKQorCQlyZXR1cm4gMDsKKworCXVzZWQgPSBsaXN0ID0gTlVMTDsKKwljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmbGlzdCk7CisJd2hpbGUgKGxpc3QpIHsKKwkJbmV3ID0gcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmbGlzdCwgMSk7CisJCWNvbW1pdF9saXN0X2luc2VydChuZXcsICZ1c2VkKTsKKwkJaWYgKG5ldyA9PSBvbGQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubWFya19hbmRfZnJlZShsaXN0LCAxKTsKKwl1bm1hcmtfYW5kX2ZyZWUodXNlZCwgMSk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IHJlZiAqbG9jYWxfcmVmcywgKipsb2NhbF90YWlsOworc3RhdGljIHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzLCAqKnJlbW90ZV90YWlsOworCitzdGF0aWMgaW50IG9uZV9sb2NhbF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IHJlZiAqcmVmOworCWludCBsZW4gPSBzdHJsZW4ocmVmbmFtZSkgKyAxOworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuKTsKKwloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEpOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKmxvY2FsX3RhaWwgPSByZWY7CisJbG9jYWxfdGFpbCA9ICZyZWYtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9sb2NhbF9oZWFkcyh2b2lkKQoreworCWxvY2FsX3RhaWwgPSAmbG9jYWxfcmVmczsKKwlmb3JfZWFjaF9yZWYob25lX2xvY2FsX3JlZiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0dXMoaW50IGluKQoreworCWNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlpZiAobGVuIDwgMTAgfHwgbWVtY21wKGxpbmUsICJ1bnBhY2sgIiwgNykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkaWQgbm90IHJlY2VpdmUgc3RhdHVzIGJhY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtZW1jbXAobGluZSwgInVucGFjayBva1xuIiwgMTApKSB7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwl3aGlsZSAoMSkgeworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGluLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgMyB8fAorCQkgICAgKG1lbWNtcChsaW5lLCAib2siLCAyKSAmJiBtZW1jbXAobGluZSwgIm5nIiwgMikpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInByb3RvY29sIGVycm9yOiAlc1xuIiwgbGluZSk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghbWVtY21wKGxpbmUsICJvayIsIDIpKQorCQkJY29udGludWU7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRfcGFjayhpbnQgaW4sIGludCBvdXQsIGludCBucl9yZWZzcGVjLCBjaGFyICoqcmVmc3BlYykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IG5ld19yZWZzOworCWludCByZXQgPSAwOworCWludCBhc2tfZm9yX3N0YXR1c19yZXBvcnQgPSAwOworCWludCBhbGxvd19kZWxldGluZ19yZWZzID0gMDsKKwlpbnQgZXhwZWN0X3N0YXR1c19yZXBvcnQgPSAwOworCisJLyogTm8gZnVubnkgYnVzaW5lc3Mgd2l0aCB0aGUgbWF0Y2hlciAqLworCXJlbW90ZV90YWlsID0gZ2V0X3JlbW90ZV9oZWFkcyhpbiwgJnJlbW90ZV9yZWZzLCAwLCBOVUxMLCBSRUZfTk9STUFMKTsKKwlnZXRfbG9jYWxfaGVhZHMoKTsKKworCS8qIERvZXMgdGhlIG90aGVyIGVuZCBzdXBwb3J0IHRoZSByZXBvcnRpbmc/ICovCisJaWYgKHNlcnZlcl9zdXBwb3J0cygicmVwb3J0LXN0YXR1cyIpKQorCQlhc2tfZm9yX3N0YXR1c19yZXBvcnQgPSAxOworCWlmIChzZXJ2ZXJfc3VwcG9ydHMoImRlbGV0ZS1yZWZzIikpCisJCWFsbG93X2RlbGV0aW5nX3JlZnMgPSAxOworCisJLyogbWF0Y2ggdGhlbSB1cCAqLworCWlmICghcmVtb3RlX3RhaWwpCisJCXJlbW90ZV90YWlsID0gJnJlbW90ZV9yZWZzOworCWlmIChtYXRjaF9yZWZzKGxvY2FsX3JlZnMsIHJlbW90ZV9yZWZzLCAmcmVtb3RlX3RhaWwsCisJCSAgICAgICBucl9yZWZzcGVjLCByZWZzcGVjLCBzZW5kX2FsbCkpCisJCXJldHVybiAtMTsKKworCWlmICghcmVtb3RlX3JlZnMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyByZWZzIGluIGNvbW1vbiBhbmQgbm9uZSBzcGVjaWZpZWQ7IGRvaW5nIG5vdGhpbmcuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5LCB0ZWxsIHRoZSBvdGhlciBlbmQhCisJICovCisJbmV3X3JlZnMgPSAwOworCWZvciAocmVmID0gcmVtb3RlX3JlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNoYXIgb2xkX2hleFs2MF0sICpuZXdfaGV4OworCQlpbnQgZGVsZXRlX3JlZjsKKworCQlpZiAoIXJlZi0+cGVlcl9yZWYpCisJCQljb250aW51ZTsKKworCQlkZWxldGVfcmVmID0gaXNfbnVsbF9zaGExKHJlZi0+cGVlcl9yZWYtPm5ld19zaGExKTsKKwkJaWYgKGRlbGV0ZV9yZWYgJiYgIWFsbG93X2RlbGV0aW5nX3JlZnMpIHsKKwkJCWVycm9yKCJyZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCBkZWxldGluZyByZWZzIik7CisJCQlyZXQgPSAtMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGVsZXRlX3JlZiAmJgorCQkgICAgIWhhc2hjbXAocmVmLT5vbGRfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgcGFydCBkZXRlcm1pbmVzIHdoYXQgY2FuIG92ZXJ3cml0ZSB3aGF0LgorCQkgKiBUaGUgcnVsZXMgYXJlOgorCQkgKgorCQkgKiAoMCkgeW91IGNhbiBhbHdheXMgdXNlIC0tZm9yY2Ugb3IgK0E6QiBub3RhdGlvbiB0bworCQkgKiAgICAgc2VsZWN0aXZlbHkgZm9yY2UgaW5kaXZpZHVhbCByZWYgcGFpcnMuCisJCSAqCisJCSAqICgxKSBpZiB0aGUgb2xkIHRoaW5nIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDIpIGlmIHlvdSBkbyBub3QgaGF2ZSB0aGUgb2xkIHRoaW5nLCB5b3UgYXJlIG5vdCBhbGxvd2VkCisJCSAqICAgICB0byBvdmVyd3JpdGUgaXQ7IHlvdSB3b3VsZCBub3Qga25vdyB3aGF0IHlvdSBhcmUgbG9zaW5nCisJCSAqICAgICBvdGhlcndpc2UuCisJCSAqCisJCSAqICgzKSBpZiBib3RoIG5ldyBhbmQgb2xkIGFyZSBjb21taXQtaXNoLCBhbmQgbmV3IGlzIGEKKwkJICogICAgIGRlc2NlbmRhbnQgb2Ygb2xkLCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDQpIHJlZ2FyZGxlc3Mgb2YgYWxsIG9mIHRoZSBhYm92ZSwgcmVtb3ZpbmcgOkIgaXMKKwkJICogICAgIGFsd2F5cyBhbGxvd2VkLgorCQkgKi8KKworCQlpZiAoIWZvcmNlX3VwZGF0ZSAmJgorCQkgICAgIWRlbGV0ZV9yZWYgJiYKKwkJICAgICFpc19udWxsX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkJICAgICFyZWYtPmZvcmNlKSB7CisJCQlpZiAoIWhhc19zaGExX2ZpbGUocmVmLT5vbGRfc2hhMSkgfHwKKwkJCSAgICAhcmVmX25ld2VyKHJlZi0+cGVlcl9yZWYtPm5ld19zaGExLAorCQkJCSAgICAgICByZWYtPm9sZF9zaGExKSkgeworCQkJCS8qIFdlIGRvIG5vdCBoYXZlIHRoZSByZW1vdGUgcmVmLCBvcgorCQkJCSAqIHdlIGtub3cgdGhhdCB0aGUgcmVtb3RlIHJlZiBpcyBub3QKKwkJCQkgKiBhbiBhbmNlc3RvciBvZiB3aGF0IHdlIGFyZSB0cnlpbmcgdG8KKwkJCQkgKiBwdXNoLiAgRWl0aGVyIHdheSB0aGlzIGNhbiBiZSBsb3NpbmcKKwkJCQkgKiBjb21taXRzIGF0IHRoZSByZW1vdGUgZW5kIGFuZCBsaWtlbHkKKwkJCQkgKiB3ZSB3ZXJlIG5vdCB1cCB0byBkYXRlIHRvIGJlZ2luIHdpdGguCisJCQkJICovCisJCQkJZXJyb3IoInJlbW90ZSAnJXMnIGlzIG5vdCBhIHN0cmljdCAiCisJCQkJICAgICAgInN1YnNldCBvZiBsb2NhbCByZWYgJyVzJy4gIgorCQkJCSAgICAgICJtYXliZSB5b3UgYXJlIG5vdCB1cC10by1kYXRlIGFuZCAiCisJCQkJICAgICAgIm5lZWQgdG8gcHVsbCBmaXJzdD8iLAorCQkJCSAgICAgIHJlZi0+bmFtZSwKKwkJCQkgICAgICByZWYtPnBlZXJfcmVmLT5uYW1lKTsKKwkJCQlyZXQgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIHJlZi0+cGVlcl9yZWYtPm5ld19zaGExKTsKKwkJaWYgKCFkZWxldGVfcmVmKQorCQkJbmV3X3JlZnMrKzsKKwkJc3RyY3B5KG9sZF9oZXgsIHNoYTFfdG9faGV4KHJlZi0+b2xkX3NoYTEpKTsKKwkJbmV3X2hleCA9IHNoYTFfdG9faGV4KHJlZi0+bmV3X3NoYTEpOworCisJCWlmIChhc2tfZm9yX3N0YXR1c19yZXBvcnQpIHsKKwkJCXBhY2tldF93cml0ZShvdXQsICIlcyAlcyAlcyVjJXMiLAorCQkJCSAgICAgb2xkX2hleCwgbmV3X2hleCwgcmVmLT5uYW1lLCAwLAorCQkJCSAgICAgInJlcG9ydC1zdGF0dXMiKTsKKwkJCWFza19mb3Jfc3RhdHVzX3JlcG9ydCA9IDA7CisJCQlleHBlY3Rfc3RhdHVzX3JlcG9ydCA9IDE7CisJCX0KKwkJZWxzZQorCQkJcGFja2V0X3dyaXRlKG91dCwgIiVzICVzICVzIiwKKwkJCQkgICAgIG9sZF9oZXgsIG5ld19oZXgsIHJlZi0+bmFtZSk7CisJCWlmIChkZWxldGVfcmVmKQorCQkJZnByaW50ZihzdGRlcnIsICJkZWxldGluZyAnJXMnXG4iLCByZWYtPm5hbWUpOworCQllbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidXBkYXRpbmcgJyVzJyIsIHJlZi0+bmFtZSk7CisJCQlpZiAoc3RyY21wKHJlZi0+bmFtZSwgcmVmLT5wZWVyX3JlZi0+bmFtZSkpCisJCQkJZnByaW50ZihzdGRlcnIsICIgdXNpbmcgJyVzJyIsCisJCQkJCXJlZi0+cGVlcl9yZWYtPm5hbWUpOworCQkJZnByaW50ZihzdGRlcnIsICJcbiAgZnJvbSAlc1xuICB0byAgICVzXG4iLAorCQkJCW9sZF9oZXgsIG5ld19oZXgpOworCQl9CisJfQorCisJcGFja2V0X2ZsdXNoKG91dCk7CisJaWYgKG5ld19yZWZzKQorCQlyZXQgPSBwYWNrX29iamVjdHMob3V0LCByZW1vdGVfcmVmcyk7CisJY2xvc2Uob3V0KTsKKworCWlmIChleHBlY3Rfc3RhdHVzX3JlcG9ydCkgeworCQlpZiAocmVjZWl2ZV9zdGF0dXMoaW4pKQorCQkJcmV0ID0gLTQ7CisJfQorCisJaWYgKCFuZXdfcmVmcyAmJiByZXQgPT0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJFdmVyeXRoaW5nIHVwLXRvLWRhdGVcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZlcmlmeV9yZW1vdGVfbmFtZXMoaW50IG5yX2hlYWRzLCBjaGFyICoqaGVhZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykgeworCQljb25zdCBjaGFyICpyZW1vdGUgPSBzdHJjaHIoaGVhZHNbaV0sICc6Jyk7CisKKwkJcmVtb3RlID0gcmVtb3RlID8gKHJlbW90ZSArIDEpIDogaGVhZHNbaV07CisJCXN3aXRjaCAoY2hlY2tfcmVmX2Zvcm1hdChyZW1vdGUpKSB7CisJCWNhc2UgMDogLyogb2sgKi8KKwkJY2FzZSAtMjogLyogb2sgYnV0IGEgc2luZ2xlIGxldmVsIC0tIHRoYXQgaXMgZmluZSBmb3IKKwkJCSAgKiBhIG1hdGNoIHBhdHRlcm4uCisJCQkgICovCisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoInJlbW90ZSBwYXJ0IG9mIHJlZnNwZWMgaXMgbm90IGEgdmFsaWQgbmFtZSBpbiAlcyIsCisJCSAgICBoZWFkc1tpXSk7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIG5yX2hlYWRzID0gMDsKKwljaGFyICpkZXN0ID0gTlVMTDsKKwljaGFyICoqaGVhZHMgPSBOVUxMOworCWludCBmZFsyXSwgcmV0OworCXBpZF90IHBpZDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlhcmd2Kys7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKywgYXJndisrKSB7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1yZWNlaXZlLXBhY2s9IikpIHsKKwkJCQlyZWNlaXZlcGFjayA9IGFyZyArIDE1OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGVjPSIpKSB7CisJCQkJcmVjZWl2ZXBhY2sgPSBhcmcgKyA3OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJCXNlbmRfYWxsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZm9yY2UiKSkgeworCQkJCWZvcmNlX3VwZGF0ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXZlcmJvc2UiKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10aGluIikpIHsKKwkJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKHNlbmRfcGFja191c2FnZSk7CisJCX0KKwkJaWYgKCFkZXN0KSB7CisJCQlkZXN0ID0gYXJnOworCQkJY29udGludWU7CisJCX0KKwkJaGVhZHMgPSBhcmd2OworCQlucl9oZWFkcyA9IGFyZ2MgLSBpOworCQlicmVhazsKKwl9CisJaWYgKCFkZXN0KQorCQl1c2FnZShzZW5kX3BhY2tfdXNhZ2UpOworCWlmIChoZWFkcyAmJiBzZW5kX2FsbCkKKwkJdXNhZ2Uoc2VuZF9wYWNrX3VzYWdlKTsKKwl2ZXJpZnlfcmVtb3RlX25hbWVzKG5yX2hlYWRzLCBoZWFkcyk7CisKKwlwaWQgPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgcmVjZWl2ZXBhY2spOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKwlyZXQgPSBzZW5kX3BhY2soZmRbMF0sIGZkWzFdLCBucl9oZWFkcywgaGVhZHMpOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJcmV0IHw9IGZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuICEhcmV0OworfQpkaWZmIC0tZ2l0IGEvc2VydmVyLWluZm8uYyBiL3NlcnZlci1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliZTVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZlci1pbmZvLmMKQEAgLTAsMCArMSwyNTAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworLyogcmVmcyAqLworc3RhdGljIEZJTEUgKmluZm9fcmVmX2ZwOworCitzdGF0aWMgaW50IGFkZF9pbmZvX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghbykKKwkJcmV0dXJuIC0xOworCisJZnByaW50ZihpbmZvX3JlZl9mcCwgIiVzCSVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJaWYgKG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQlvID0gZGVyZWZfdGFnKG8sIHBhdGgsIDApOworCQlpZiAobykKKwkJCWZwcmludGYoaW5mb19yZWZfZnAsICIlcwklc157fVxuIiwKKwkJCQlzaGExX3RvX2hleChvLT5zaGExKSwgcGF0aCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9pbmZvX3JlZnMoaW50IGZvcmNlKQoreworCWNoYXIgKnBhdGgwID0geHN0cmR1cChnaXRfcGF0aCgiaW5mby9yZWZzIikpOworCWludCBsZW4gPSBzdHJsZW4ocGF0aDApOworCWNoYXIgKnBhdGgxID0geG1hbGxvYyhsZW4gKyAyKTsKKworCXN0cmNweShwYXRoMSwgcGF0aDApOworCXN0cmNweShwYXRoMSArIGxlbiwgIisiKTsKKworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMocGF0aDApOworCWluZm9fcmVmX2ZwID0gZm9wZW4ocGF0aDEsICJ3Iik7CisJaWYgKCFpbmZvX3JlZl9mcCkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gdXBkYXRlICVzIiwgcGF0aDApOworCWZvcl9lYWNoX3JlZihhZGRfaW5mb19yZWYsIE5VTEwpOworCWZjbG9zZShpbmZvX3JlZl9mcCk7CisJcmVuYW1lKHBhdGgxLCBwYXRoMCk7CisJZnJlZShwYXRoMCk7CisJZnJlZShwYXRoMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBhY2tzICovCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyB7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJaW50IG9sZF9udW07CisJaW50IG5ld19udW07CisJaW50IG5yX2FsbG9jOworCWludCBucl9oZWFkczsKKwl1bnNpZ25lZCBjaGFyICgqaGVhZClbMjBdOworfSAqKmluZm87CitzdGF0aWMgaW50IG51bV9wYWNrOworc3RhdGljIGNvbnN0IGNoYXIgKm9iamRpcjsKK3N0YXRpYyBpbnQgb2JqZGlybGVuOworCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyAqZmluZF9wYWNrX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGluZm9baV0tPnA7CisJCS8qIHNraXAgIi9wYWNrLyIgYWZ0ZXIgIi5naXQvb2JqZWN0cyIgKi8KKwkJaWYgKCFzdHJjbXAocC0+cGFja19uYW1lICsgb2JqZGlybGVuICsgNiwgbmFtZSkpCisJCQlyZXR1cm4gaW5mb1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgaW5mbyBpbiB0aGUKKyAqIG9sZCBmaWxlIGlzIHVzZWxlc3MuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcGFja19kZWYoY29uc3QgY2hhciAqbGluZSwgaW50IG9sZF9jbnQpCit7CisJc3RydWN0IHBhY2tfaW5mbyAqaSA9IGZpbmRfcGFja19ieV9uYW1lKGxpbmUgKyAyKTsKKwlpZiAoaSkgeworCQlpLT5vbGRfbnVtID0gb2xkX2NudDsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQkvKiBUaGUgZmlsZSBkZXNjcmliZXMgYSBwYWNrIHRoYXQgaXMgbm8gbG9uZ2VyIGhlcmUgKi8KKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIGluZm8gaW4gdGhlCisgKiBvbGQgZmlsZSBpcyB1c2VsZXNzLgorICovCitzdGF0aWMgaW50IHJlYWRfcGFja19pbmZvX2ZpbGUoY29uc3QgY2hhciAqaW5mb2ZpbGUpCit7CisJRklMRSAqZnA7CisJY2hhciBsaW5lWzEwMDBdOworCWludCBvbGRfY250ID0gMDsKKworCWZwID0gZm9wZW4oaW5mb2ZpbGUsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIDE7IC8qIG5vbmV4aXN0ZW50IGlzIG5vdCBhbiBlcnJvci4gKi8KKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCQlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKworCQlpZiAoIWxlbikKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdQJzogLyogUCBuYW1lICovCisJCQlpZiAocGFyc2VfcGFja19kZWYobGluZSwgb2xkX2NudCsrKSkKKwkJCQlnb3RvIG91dF9zdGFsZTsKKwkJCWJyZWFrOworCQljYXNlICdEJzogLyogd2UgdXNlZCB0byBlbWl0IEQgYnV0IHRoYXQgd2FzIG1pc2d1aWRlZC4gKi8KKwkJCWdvdG8gb3V0X3N0YWxlOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOiAvKiB3ZSB1c2VkIHRvIGVtaXQgVCBidXQgbm9ib2R5IHVzZXMgaXQuICovCisJCQlnb3RvIG91dF9zdGFsZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoInVucmVjb2duaXplZDogJXMiLCBsaW5lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cisgb3V0X3N0YWxlOgorCWZjbG9zZShmcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9pbmZvKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgcGFja19pbmZvICogY29uc3QqIGEgPSBhXzsKKwlzdHJ1Y3QgcGFja19pbmZvICogY29uc3QqIGIgPSBiXzsKKworCWlmICgwIDw9ICgqYSktPm9sZF9udW0gJiYgMCA8PSAoKmIpLT5vbGRfbnVtKQorCQkvKiBLZWVwIHRoZSBvcmRlciBpbiB0aGUgb3JpZ2luYWwgKi8KKwkJcmV0dXJuICgqYSktPm9sZF9udW0gLSAoKmIpLT5vbGRfbnVtOworCWVsc2UgaWYgKDAgPD0gKCphKS0+b2xkX251bSkKKwkJLyogT25seSBBIGV4aXN0ZWQgaW4gdGhlIG9yaWdpbmFsIHNvIEIgaXMgb2J2aW91c2x5IG5ld2VyICovCisJCXJldHVybiAtMTsKKwllbHNlIGlmICgwIDw9ICgqYiktPm9sZF9udW0pCisJCS8qIFRoZSBvdGhlciB3YXkgYXJvdW5kLiAqLworCQlyZXR1cm4gMTsKKworCS8qIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGJ1dCBhdCBsZWFzdCBrZWVwIHRoZSBjb21wYXJpc29uIHN0YWJsZSAqLworCWlmICgoKmEpLT5wID09ICgqYiktPnApCisJCXJldHVybiAwOworCWVsc2UgaWYgKCgqYSktPnAgPCAoKmIpLT5wKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wYWNrX2luZm8oY29uc3QgY2hhciAqaW5mb2ZpbGUsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlpbnQgc3RhbGU7CisJaW50IGkgPSAwOworCisJb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlvYmpkaXJsZW4gPSBzdHJsZW4ob2JqZGlyKTsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCS8qIHdlIGlnbm9yZSB0aGluZ3Mgb24gYWx0ZXJuYXRlIHBhdGggc2luY2UgdGhleSBhcmUKKwkJICogbm90IGF2YWlsYWJsZSB0byB0aGUgcHVsbGVycyBpbiBnZW5lcmFsLgorCQkgKi8KKwkJaWYgKCFwLT5wYWNrX2xvY2FsKQorCQkJY29udGludWU7CisJCWkrKzsKKwl9CisJbnVtX3BhY2sgPSBpOworCWluZm8gPSB4Y2FsbG9jKG51bV9wYWNrLCBzaXplb2Yoc3RydWN0IHBhY2tfaW5mbyAqKSk7CisJZm9yIChpID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmICghcC0+cGFja19sb2NhbCkKKwkJCWNvbnRpbnVlOworCQlpbmZvW2ldID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBhY2tfaW5mbykpOworCQlpbmZvW2ldLT5wID0gcDsKKwkJaW5mb1tpXS0+b2xkX251bSA9IC0xOworCQlpKys7CisJfQorCisJaWYgKGluZm9maWxlICYmICFmb3JjZSkKKwkJc3RhbGUgPSByZWFkX3BhY2tfaW5mb19maWxlKGluZm9maWxlKTsKKwllbHNlCisJCXN0YWxlID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFjazsgaSsrKSB7CisJCWlmIChzdGFsZSkgeworCQkJaW5mb1tpXS0+b2xkX251bSA9IC0xOworCQkJaW5mb1tpXS0+bnJfaGVhZHMgPSAwOworCQl9CisJfQorCisJLyogcmVudW1iZXIgdGhlbSAqLworCXFzb3J0KGluZm8sIG51bV9wYWNrLCBzaXplb2YoaW5mb1swXSksIGNvbXBhcmVfaW5mbyk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWNrOyBpKyspCisJCWluZm9baV0tPm5ld19udW0gPSBpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrX2luZm9fZmlsZShGSUxFICpmcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykKKwkJZnByaW50ZihmcCwgIlAgJXNcbiIsIGluZm9baV0tPnAtPnBhY2tfbmFtZSArIG9iamRpcmxlbiArIDYpOworCWZwdXRjKCdcbicsIGZwKTsKK30KKworc3RhdGljIGludCB1cGRhdGVfaW5mb19wYWNrcyhpbnQgZm9yY2UpCit7CisJY2hhciBpbmZvZmlsZVtQQVRIX01BWF07CisJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwlpbnQgbmFtZWxlbjsKKwlGSUxFICpmcDsKKworCW5hbWVsZW4gPSBzcHJpbnRmKGluZm9maWxlLCAiJXMvaW5mby9wYWNrcyIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCXN0cmNweShuYW1lLCBpbmZvZmlsZSk7CisJc3RyY3B5KG5hbWUgKyBuYW1lbGVuLCAiKyIpOworCisJaW5pdF9wYWNrX2luZm8oaW5mb2ZpbGUsIGZvcmNlKTsKKworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMobmFtZSk7CisJZnAgPSBmb3BlbihuYW1lLCAidyIpOworCWlmICghZnApCisJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXMiLCBuYW1lKTsKKwl3cml0ZV9wYWNrX2luZm9fZmlsZShmcCk7CisJZmNsb3NlKGZwKTsKKwlyZW5hbWUobmFtZSwgaW5mb2ZpbGUpOworCXJldHVybiAwOworfQorCisvKiBwdWJsaWMgKi8KK2ludCB1cGRhdGVfc2VydmVyX2luZm8oaW50IGZvcmNlKQoreworCS8qIFdlIHdvdWxkIGFkZCBtb3JlIGR1bWItc2VydmVyIHN1cHBvcnQgZmlsZXMgbGF0ZXIsCisJICogaW5jbHVkaW5nIGluZGV4IG9mIGF2YWlsYWJsZSBwYWNrIGZpbGVzIGFuZCB0aGVpcgorCSAqIGludGVuZGVkIGF1ZGllbmNlcy4KKwkgKi8KKwlpbnQgZXJycyA9IDA7CisKKwllcnJzID0gZXJycyB8IHVwZGF0ZV9pbmZvX3JlZnMoZm9yY2UpOworCWVycnMgPSBlcnJzIHwgdXBkYXRlX2luZm9fcGFja3MoZm9yY2UpOworCisJLyogcmVtb3ZlIGxlZnRvdmVyIHJldi1jYWNoZSBmaWxlIGlmIHRoZXJlIGlzIGFueSAqLworCXVubGluayhnaXRfcGF0aCgiaW5mby9yZXYtY2FjaGUiKSk7CisKKwlyZXR1cm4gZXJyczsKK30KZGlmZiAtLWdpdCBhL3NldHVwLmMgYi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXR1cC5jCkBAIC0wLDAgKzEsMjk2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworY29uc3QgY2hhciAqcHJlZml4X3BhdGgoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgbGVuLCBjb25zdCBjaGFyICpwYXRoKQoreworCWNvbnN0IGNoYXIgKm9yaWcgPSBwYXRoOworCWZvciAoOzspIHsKKwkJY2hhciBjOworCQlpZiAoKnBhdGggIT0gJy4nKQorCQkJYnJlYWs7CisJCWMgPSBwYXRoWzFdOworCQkvKiAiLiIgKi8KKwkJaWYgKCFjKSB7CisJCQlwYXRoKys7CisJCQlicmVhazsKKwkJfQorCQkvKiAiLi8iICovCisJCWlmIChjID09ICcvJykgeworCQkJcGF0aCArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgIT0gJy4nKQorCQkJYnJlYWs7CisJCWMgPSBwYXRoWzJdOworCQlpZiAoIWMpCisJCQlwYXRoICs9IDI7CisJCWVsc2UgaWYgKGMgPT0gJy8nKQorCQkJcGF0aCArPSAzOworCQllbHNlCisJCQlicmVhazsKKwkJLyogIi4uIiBhbmQgIi4uLyIgKi8KKwkJLyogUmVtb3ZlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwcmVmaXggKi8KKwkJZG8geworCQkJaWYgKCFsZW4pCisJCQkJZGllKCInJXMnIGlzIG91dHNpZGUgcmVwb3NpdG9yeSIsIG9yaWcpOworCQkJbGVuLS07CisJCX0gd2hpbGUgKGxlbiAmJiBwcmVmaXhbbGVuLTFdICE9ICcvJyk7CisJCWNvbnRpbnVlOworCX0KKwlpZiAobGVuKSB7CisJCWludCBzcGVjbGVuID0gc3RybGVuKHBhdGgpOworCQljaGFyICpuID0geG1hbGxvYyhzcGVjbGVuICsgbGVuICsgMSk7CisJCisJCW1lbWNweShuLCBwcmVmaXgsIGxlbik7CisJCW1lbWNweShuICsgbGVuLCBwYXRoLCBzcGVjbGVuKzEpOworCQlwYXRoID0gbjsKKwl9CisJcmV0dXJuIHBhdGg7Cit9CisKKy8qIAorICogVW5saWtlIHByZWZpeF9wYXRoLCB0aGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBuYW1lZCBmaWxlIGRvZXMKKyAqIG5vdCBoYXZlIHRvIGludGVyYWN0IHdpdGggaW5kZXggZW50cnk7IGkuZS4gbmFtZSBvZiBhIHJhbmRvbSBmaWxlCisgKiBvbiB0aGUgZmlsZXN5c3RlbS4KKyAqLworY29uc3QgY2hhciAqcHJlZml4X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnBmeCwgaW50IHBmeF9sZW4sIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpZiAoIXBmeCB8fCAhKnBmeCB8fCBhcmdbMF0gPT0gJy8nKQorCQlyZXR1cm4gYXJnOworCW1lbWNweShwYXRoLCBwZngsIHBmeF9sZW4pOworCXN0cmNweShwYXRoICsgcGZ4X2xlbiwgYXJnKTsKKwlyZXR1cm4gcGF0aDsKK30KKworLyoKKyAqIFZlcmlmeSBhIGZpbGVuYW1lIHRoYXQgd2UgZ290IGFzIGFuIGFyZ3VtZW50IGZvciBhIHBhdGhzcGVjCisgKiBlbnRyeS4gTm90ZSB0aGF0IGEgZmlsZW5hbWUgdGhhdCBiZWdpbnMgd2l0aCAiLSIgbmV2ZXIgdmVyaWZpZXMKKyAqIGFzIHRydWUsIGJlY2F1c2UgZXZlbiBpZiBzdWNoIGEgZmlsZW5hbWUgd2VyZSB0byBleGlzdCwgd2Ugd2FudAorICogaXQgdG8gYmUgcHJlY2VkZWQgYnkgdGhlICItLSIgbWFya2VyIChvciB3ZSB3YW50IHRoZSB1c2VyIHRvCisgKiB1c2UgYSBmb3JtYXQgbGlrZSAiLi8tZmlsZW5hbWUiKQorICovCit2b2lkIHZlcmlmeV9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCphcmcgPT0gJy0nKQorCQlkaWUoImJhZCBmbGFnICclcycgdXNlZCBhZnRlciBmaWxlbmFtZSIsIGFyZyk7CisJbmFtZSA9IHByZWZpeCA/IHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHN0cmxlbihwcmVmaXgpLCBhcmcpIDogYXJnOworCWlmICghbHN0YXQobmFtZSwgJnN0KSkKKwkJcmV0dXJuOworCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCWRpZSgiYW1iaWd1b3VzIGFyZ3VtZW50ICclcyc6IHVua25vd24gcmV2aXNpb24gb3IgcGF0aCBub3QgaW4gdGhlIHdvcmtpbmcgdHJlZS5cbiIKKwkJICAgICJVc2UgJy0tJyB0byBzZXBhcmF0ZSBwYXRocyBmcm9tIHJldmlzaW9ucyIsIGFyZyk7CisJZGllKCInJXMnOiAlcyIsIGFyZywgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLyoKKyAqIE9wcG9zaXRlIG9mIHRoZSBhYm92ZTogdGhlIGNvbW1hbmQgbGluZSBkaWQgbm90IGhhdmUgLS0gbWFya2VyCisgKiBhbmQgd2UgcGFyc2VkIHRoZSBhcmcgYXMgYSByZWZuYW1lLiAgSXQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRhYmxlCisgKiBhcyBhIGZpbGVuYW1lLgorICovCit2b2lkIHZlcmlmeV9ub25fZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICphcmcpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChpc19pbnNpZGVfZ2l0X2RpcigpKQorCQlyZXR1cm47CisJaWYgKCphcmcgPT0gJy0nKQorCQlyZXR1cm47IC8qIGZsYWcgKi8KKwluYW1lID0gcHJlZml4ID8gcHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgc3RybGVuKHByZWZpeCksIGFyZykgOiBhcmc7CisJaWYgKCFsc3RhdChuYW1lLCAmc3QpKQorCQlkaWUoImFtYmlndW91cyBhcmd1bWVudCAnJXMnOiBib3RoIHJldmlzaW9uIGFuZCBmaWxlbmFtZVxuIgorCQkgICAgIlVzZSAnLS0nIHRvIHNlcGFyYXRlIGZpbGVuYW1lcyBmcm9tIHJldmlzaW9ucyIsIGFyZyk7CisJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJZGllKCInJXMnOiAlcyIsIGFyZywgc3RyZXJyb3IoZXJybm8pKTsKK30KKworY29uc3QgY2hhciAqKmdldF9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwljb25zdCBjaGFyICplbnRyeSA9ICpwYXRoc3BlYzsKKwljb25zdCBjaGFyICoqcDsKKwlpbnQgcHJlZml4bGVuOworCisJaWYgKCFwcmVmaXggJiYgIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZW50cnkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKnNwZWNbMl07CisJCXNwZWNbMF0gPSBwcmVmaXg7CisJCXNwZWNbMV0gPSBOVUxMOworCQlyZXR1cm4gc3BlYzsKKwl9CisKKwkvKiBPdGhlcndpc2Ugd2UgaGF2ZSB0byByZS13cml0ZSB0aGUgZW50cmllcy4uICovCisJcCA9IHBhdGhzcGVjOworCXByZWZpeGxlbiA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwlkbyB7CisJCSpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhsZW4sIGVudHJ5KTsKKwl9IHdoaWxlICgoZW50cnkgPSAqKytwKSAhPSBOVUxMKTsKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKiopIHBhdGhzcGVjOworfQorCisvKgorICogVGVzdCBpZiBpdCBsb29rcyBsaWtlIHdlJ3JlIGF0IGEgZ2l0IGRpcmVjdG9yeS4KKyAqIFdlIHdhbnQgdG8gc2VlOgorICoKKyAqICAtIGVpdGhlciBhIG9iamVjdHMvIGRpcmVjdG9yeSBfb3JfIHRoZSBwcm9wZXIKKyAqICAgIEdJVF9PQkpFQ1RfRElSRUNUT1JZIGVudmlyb25tZW50IHZhcmlhYmxlCisgKiAgLSBhIHJlZnMvIGRpcmVjdG9yeQorICogIC0gZWl0aGVyIGEgSEVBRCBzeW1saW5rIG9yIGEgSEVBRCBmaWxlIHRoYXQgaXMgZm9ybWF0dGVkIGFzCisgKiAgICBhIHByb3BlciAicmVmOiIsIG9yIGEgcmVndWxhciBmaWxlIEhFQUQgdGhhdCBoYXMgYSBwcm9wZXJseQorICogICAgZm9ybWF0dGVkIHNoYTEgb2JqZWN0IG5hbWUuCisgKi8KK3N0YXRpYyBpbnQgaXNfZ2l0X2RpcmVjdG9yeShjb25zdCBjaGFyICpzdXNwZWN0KQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdXNwZWN0KTsKKworCXN0cmNweShwYXRoLCBzdXNwZWN0KTsKKwlpZiAoZ2V0ZW52KERCX0VOVklST05NRU5UKSkgeworCQlpZiAoYWNjZXNzKGdldGVudihEQl9FTlZJUk9OTUVOVCksIFhfT0spKQorCQkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlzdHJjcHkocGF0aCArIGxlbiwgIi9vYmplY3RzIik7CisJCWlmIChhY2Nlc3MocGF0aCwgWF9PSykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzdHJjcHkocGF0aCArIGxlbiwgIi9yZWZzIik7CisJaWYgKGFjY2VzcyhwYXRoLCBYX09LKSkKKwkJcmV0dXJuIDA7CisKKwlzdHJjcHkocGF0aCArIGxlbiwgIi9IRUFEIik7CisJaWYgKHZhbGlkYXRlX2hlYWRyZWYocGF0aCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW5zaWRlX2dpdF9kaXIgPSAtMTsKKworaW50IGlzX2luc2lkZV9naXRfZGlyKHZvaWQpCit7CisJaWYgKGluc2lkZV9naXRfZGlyIDwgMCkgeworCQljaGFyIGJ1ZmZlclsxMDI0XTsKKworCQlpZiAoaXNfYmFyZV9yZXBvc2l0b3J5KCkpCisJCQlyZXR1cm4gKGluc2lkZV9naXRfZGlyID0gMSk7CisJCWlmIChnZXRjd2QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpIHsKKwkJCWNvbnN0IGNoYXIgKmdpdF9kaXIgPSBnZXRfZ2l0X2RpcigpLCAqY3dkID0gYnVmZmVyOworCQkJd2hpbGUgKCpnaXRfZGlyICYmICpnaXRfZGlyID09ICpjd2QpIHsKKwkJCQlnaXRfZGlyKys7CisJCQkJY3dkKys7CisJCQl9CisJCQlpbnNpZGVfZ2l0X2RpciA9ICEqZ2l0X2RpcjsKKwkJfSBlbHNlCisJCQlpbnNpZGVfZ2l0X2RpciA9IDA7CisJfQorCXJldHVybiBpbnNpZGVfZ2l0X2RpcjsKK30KKworY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoaW50ICpub25naXRfb2spCit7CisJc3RhdGljIGNoYXIgY3dkW1BBVEhfTUFYKzFdOworCWNvbnN0IGNoYXIgKmdpdGRpcmVudjsKKwlpbnQgbGVuLCBvZmZzZXQ7CisKKwkvKgorCSAqIElmIEdJVF9ESVIgaXMgc2V0IGV4cGxpY2l0bHksIHdlJ3JlIG5vdCBnb2luZworCSAqIHRvIGRvIGFueSBkaXNjb3ZlcnksIGJ1dCB3ZSBzdGlsbCBkbyByZXBvc2l0b3J5CisJICogdmFsaWRhdGlvbi4KKwkgKi8KKwlnaXRkaXJlbnYgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKGdpdGRpcmVudikgeworCQlpZiAoUEFUSF9NQVggLSA0MCA8IHN0cmxlbihnaXRkaXJlbnYpKQorCQkJZGllKCInJCVzJyB0b28gYmlnIiwgR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJCWlmIChpc19naXRfZGlyZWN0b3J5KGdpdGRpcmVudikpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG5vbmdpdF9vaykgeworCQkJKm5vbmdpdF9vayA9IDE7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkaWUoIk5vdCBhIGdpdCByZXBvc2l0b3J5OiAnJXMnIiwgZ2l0ZGlyZW52KTsKKwl9CisKKwlpZiAoIWdldGN3ZChjd2QsIHNpemVvZihjd2QpLTEpIHx8IGN3ZFswXSAhPSAnLycpCisJCWRpZSgiVW5hYmxlIHRvIHJlYWQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIpOworCisJb2Zmc2V0ID0gbGVuID0gc3RybGVuKGN3ZCk7CisJZm9yICg7OykgeworCQlpZiAoaXNfZ2l0X2RpcmVjdG9yeSgiLmdpdCIpKQorCQkJYnJlYWs7CisJCWNoZGlyKCIuLiIpOworCQlkbyB7CisJCQlpZiAoIW9mZnNldCkgeworCQkJCWlmIChpc19naXRfZGlyZWN0b3J5KGN3ZCkpIHsKKwkJCQkJaWYgKGNoZGlyKGN3ZCkpCisJCQkJCQlkaWUoIkNhbm5vdCBjb21lIGJhY2sgdG8gY3dkIik7CisJCQkJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCBjd2QsIDEpOworCQkJCQlpbnNpZGVfZ2l0X2RpciA9IDE7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlpZiAobm9uZ2l0X29rKSB7CisJCQkJCWlmIChjaGRpcihjd2QpKQorCQkJCQkJZGllKCJDYW5ub3QgY29tZSBiYWNrIHRvIGN3ZCIpOworCQkJCQkqbm9uZ2l0X29rID0gMTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnkiKTsKKwkJCX0KKwkJfSB3aGlsZSAoY3dkWy0tb2Zmc2V0XSAhPSAnLycpOworCX0KKworCWlmIChvZmZzZXQgPT0gbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE1ha2UgIm9mZnNldCIgcG9pbnQgdG8gcGFzdCB0aGUgJy8nLCBhbmQgYWRkIGEgJy8nIGF0IHRoZSBlbmQgKi8KKwlvZmZzZXQrKzsKKwljd2RbbGVuKytdID0gJy8nOworCWN3ZFtsZW5dID0gMDsKKwlpbnNpZGVfZ2l0X2RpciA9ICFwcmVmaXhjbXAoY3dkICsgb2Zmc2V0LCAiLmdpdC8iKTsKKwlyZXR1cm4gY3dkICsgb2Zmc2V0OworfQorCitpbnQgZ2l0X2NvbmZpZ19wZXJtKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHZhbHVlKSB7CisJCWlmICghc3RyY21wKHZhbHVlLCAidW1hc2siKSkKKwkJCXJldHVybiBQRVJNX1VNQVNLOworCQlpZiAoIXN0cmNtcCh2YWx1ZSwgImdyb3VwIikpCisJCQlyZXR1cm4gUEVSTV9HUk9VUDsKKwkJaWYgKCFzdHJjbXAodmFsdWUsICJhbGwiKSB8fAorCQkgICAgIXN0cmNtcCh2YWx1ZSwgIndvcmxkIikgfHwKKwkJICAgICFzdHJjbXAodmFsdWUsICJldmVyeWJvZHkiKSkKKwkJCXJldHVybiBQRVJNX0VWRVJZQk9EWTsKKwl9CisJcmV0dXJuIGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKK30KKworaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICAgICBpZiAoc3RyY21wKHZhciwgImNvcmUucmVwb3NpdG9yeWZvcm1hdHZlcnNpb24iKSA9PSAwKQorICAgICAgICAgICAgICAgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCWVsc2UgaWYgKHN0cmNtcCh2YXIsICJjb3JlLnNoYXJlZHJlcG9zaXRvcnkiKSA9PSAwKQorCQlzaGFyZWRfcmVwb3NpdG9yeSA9IGdpdF9jb25maWdfcGVybSh2YXIsIHZhbHVlKTsKKyAgICAgICByZXR1cm4gMDsKK30KKworaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0KHZvaWQpCit7CisJZ2l0X2NvbmZpZyhjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKTsKKwlpZiAoR0lUX1JFUE9fVkVSU0lPTiA8IHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24pCisJCWRpZSAoIkV4cGVjdGVkIGdpdCByZXBvIHZlcnNpb24gPD0gJWQsIGZvdW5kICVkIiwKKwkJICAgICBHSVRfUkVQT19WRVJTSU9OLCByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnJldHZhbCA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KE5VTEwpOworCWNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0KCk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3NoYTFfZmlsZS5jIGIvc2hhMV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzMjhjOAotLS0gL2Rldi9udWxsCisrKyBiL3NoYTFfZmlsZS5jCkBAIC0wLDAgKzEsMjQzNSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqCisgKiBUaGlzIGhhbmRsZXMgYmFzaWMgZ2l0IHNoYTEgb2JqZWN0IGZpbGVzIC0gcGFja2luZywgdW5wYWNraW5nLAorICogY3JlYXRpb24gZXRjLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworI2lmbmRlZiBPX05PQVRJTUUKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19QUENfXykpCisjZGVmaW5lIE9fTk9BVElNRSAwMTAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgT19OT0FUSU1FIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBOT19DOTlfRk9STUFUCisjZGVmaW5lIFNaX0ZNVCAibHUiCisjZWxzZQorI2RlZmluZSBTWl9GTVQgInp1IgorI2VuZGlmCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgbnVsbF9zaGExWzIwXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzaGExX2ZpbGVfb3Blbl9mbGFnID0gT19OT0FUSU1FOworCitjb25zdCBzaWduZWQgY2hhciBoZXh2YWxfdGFibGVbMjU2XSA9IHsKKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMDAtMDcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMDgtMGYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMTAtMTcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMTgtMWYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMjAtMjcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMjgtMmYgKi8KKwkgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAkJLyogMzAtMzcgKi8KKwkgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogMzgtM2YgKi8KKwkgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xLAkJLyogNDAtNDcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNDgtNGYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNTAtNTcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNTgtNWYgKi8KKwkgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xLAkJLyogNjAtNjcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNjgtNjcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNzAtNzcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogNzgtN2YgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogODAtODcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogODgtOGYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogOTAtOTcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogOTgtOWYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYTAtYTcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYTgtYWYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYjAtYjcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYjgtYmYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYzAtYzcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogYzgtY2YgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZDAtZDcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZDgtZGYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZTAtZTcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZTgtZWYgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZjAtZjcgKi8KKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJLyogZjgtZmYgKi8KK307CisKK2ludCBnZXRfc2hhMV9oZXgoY29uc3QgY2hhciAqaGV4LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAoaGV4dmFsKGhleFswXSkgPDwgNCkgfCBoZXh2YWwoaGV4WzFdKTsKKwkJaWYgKHZhbCAmIH4weGZmKQorCQkJcmV0dXJuIC0xOworCQkqc2hhMSsrID0gdmFsOworCQloZXggKz0gMjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKGNoYXIgKnBhdGgpCit7CisJY2hhciAqcG9zID0gcGF0aDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgqcG9zID09ICcvJykKKwkJcG9zKys7CisKKwl3aGlsZSAocG9zKSB7CisJCXBvcyA9IHN0cmNocihwb3MsICcvJyk7CisJCWlmICghcG9zKQorCQkJYnJlYWs7CisJCSpwb3MgPSAwOworCQlpZiAoIXN0YXQocGF0aCwgJnN0KSkgeworCQkJLyogcGF0aCBleGlzdHMgKi8KKwkJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCSpwb3MgPSAnLyc7CisJCQkJcmV0dXJuIC0zOworCQkJfQorCQl9CisJCWVsc2UgaWYgKG1rZGlyKHBhdGgsIDA3NzcpKSB7CisJCQkqcG9zID0gJy8nOworCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UgaWYgKGFkanVzdF9zaGFyZWRfcGVybShwYXRoKSkgeworCQkJKnBvcyA9ICcvJzsKKwkJCXJldHVybiAtMjsKKwkJfQorCQkqcG9zKysgPSAnLyc7CisJfQorCXJldHVybiAwOworfQorCitjaGFyICogc2hhMV90b19oZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgaW50IGJ1Zm5vOworCXN0YXRpYyBjaGFyIGhleGJ1ZmZlcls0XVs1MF07CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJY2hhciAqYnVmZmVyID0gaGV4YnVmZmVyWzMgJiArK2J1Zm5vXSwgKmJ1ZiA9IGJ1ZmZlcjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAqc2hhMSsrOworCQkqYnVmKysgPSBoZXhbdmFsID4+IDRdOworCQkqYnVmKysgPSBoZXhbdmFsICYgMHhmXTsKKwl9CisJKmJ1ZiA9ICdcMCc7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3NoYTFfcGF0aChjaGFyICpwYXRoYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCQl1bnNpZ25lZCBpbnQgdmFsID0gc2hhMVtpXTsKKwkJY2hhciAqcG9zID0gcGF0aGJ1ZiArIGkqMiArIChpID4gMCk7CisJCSpwb3MrKyA9IGhleFt2YWwgPj4gNF07CisJCSpwb3MgPSBoZXhbdmFsICYgMHhmXTsKKwl9Cit9CisKKy8qCisgKiBOT1RFISBUaGlzIHJldHVybnMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIsIHNvIHlvdSBoYXZlIHRvIGJlCisgKiBjYXJlZnVsIGFib3V0IHVzaW5nIGl0LiBEbyBhICJ4c3RyZHVwKCkiIGlmIHlvdSBuZWVkIHRvIHNhdmUgdGhlCisgKiBmaWxlbmFtZS4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIGxvY2F0aW9uIGZvciBjcmVhdGluZy4gIFJlYWRpbmcKKyAqIFNIQTEgZmlsZSBjYW4gaGFwcGVuIGZyb20gYW55IGFsdGVybmF0ZSBkaXJlY3RvcnkgbGlzdGVkIGluIHRoZQorICogREJfRU5WSVJPTk1FTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgbm90IGZvdW5kIGluCisgKiB0aGUgcHJpbWFyeSBvYmplY3QgZGF0YWJhc2UuCisgKi8KK2NoYXIgKnNoYTFfZmlsZV9uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNoYXIgKm5hbWUsICpiYXNlOworCisJaWYgKCFiYXNlKSB7CisJCWNvbnN0IGNoYXIgKnNoYTFfZmlsZV9kaXJlY3RvcnkgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCQlpbnQgbGVuID0gc3RybGVuKHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQliYXNlID0geG1hbGxvYyhsZW4gKyA2MCk7CisJCW1lbWNweShiYXNlLCBzaGExX2ZpbGVfZGlyZWN0b3J5LCBsZW4pOworCQltZW1zZXQoYmFzZStsZW4sIDAsIDYwKTsKKwkJYmFzZVtsZW5dID0gJy8nOworCQliYXNlW2xlbiszXSA9ICcvJzsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxOworCX0KKwlmaWxsX3NoYTFfcGF0aChuYW1lLCBzaGExKTsKKwlyZXR1cm4gYmFzZTsKK30KKworY2hhciAqc2hhMV9wYWNrX25hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwlzdGF0aWMgY2hhciAqbmFtZSwgKmJhc2UsICpidWY7CisJaW50IGk7CisKKwlpZiAoIWJhc2UpIHsKKwkJY29uc3QgY2hhciAqc2hhMV9maWxlX2RpcmVjdG9yeSA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJCWludCBsZW4gPSBzdHJsZW4oc2hhMV9maWxlX2RpcmVjdG9yeSk7CisJCWJhc2UgPSB4bWFsbG9jKGxlbiArIDYwKTsKKwkJc3ByaW50ZihiYXNlLCAiJXMvcGFjay9wYWNrLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAucGFjayIsIHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQluYW1lID0gYmFzZSArIGxlbiArIDExOworCX0KKworCWJ1ZiA9IG5hbWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKnNoYTErKzsKKwkJKmJ1ZisrID0gaGV4W3ZhbCA+PiA0XTsKKwkJKmJ1ZisrID0gaGV4W3ZhbCAmIDB4Zl07CisJfQorCQorCXJldHVybiBiYXNlOworfQorCitjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXN0YXRpYyBjaGFyICpuYW1lLCAqYmFzZSwgKmJ1ZjsKKwlpbnQgaTsKKworCWlmICghYmFzZSkgeworCQljb25zdCBjaGFyICpzaGExX2ZpbGVfZGlyZWN0b3J5ID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IGxlbiA9IHN0cmxlbihzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJYmFzZSA9IHhtYWxsb2MobGVuICsgNjApOworCQlzcHJpbnRmKGJhc2UsICIlcy9wYWNrL3BhY2stMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MC5pZHgiLCBzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxMTsKKwl9CisKKwlidWYgPSBuYW1lOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKwkKKwlyZXR1cm4gYmFzZTsKK30KKworc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdF9vZGJfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqKmFsdF9vZGJfdGFpbDsKKworc3RhdGljIHZvaWQgcmVhZF9pbmZvX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqIGFsdGVybmF0ZXMsIGludCBkZXB0aCk7CisKKy8qCisgKiBQcmVwYXJlIGFsdGVybmF0ZSBvYmplY3QgZGF0YWJhc2UgcmVnaXN0cnkuCisgKgorICogVGhlIHZhcmlhYmxlIGFsdF9vZGJfbGlzdCBwb2ludHMgYXQgdGhlIGxpc3Qgb2Ygc3RydWN0CisgKiBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlLiAgVGhlIGVsZW1lbnRzIG9uIHRoaXMgbGlzdCBjb21lIGZyb20KKyAqIG5vbi1lbXB0eSBlbGVtZW50cyBmcm9tIGNvbG9uIHNlcGFyYXRlZCBBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQKKyAqIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgJEdJVF9PQkpFQ1RfRElSRUNUT1JZL2luZm8vYWx0ZXJuYXRlcywKKyAqIHdob3NlIGNvbnRlbnRzIGlzIHNpbWlsYXIgdG8gdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBidXQgY2FuIGJlCisgKiBMRiBzZXBhcmF0ZWQuICBJdHMgYmFzZSBwb2ludHMgYXQgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIgdGhhdAorICogY29udGFpbnMgIi90aGUvZGlyZWN0b3J5L2NvcnJlc3BvbmRpbmcvdG8vLmdpdC9vYmplY3RzLy4uLiIsIHdoaWxlCisgKiBpdHMgbmFtZSBwb2ludHMganVzdCBhZnRlciB0aGUgc2xhc2ggYXQgdGhlIGVuZCBvZiAiLmdpdC9vYmplY3RzLyIKKyAqIGluIHRoZSBleGFtcGxlIGFib3ZlLCBhbmQgaGFzIGVub3VnaCBzcGFjZSB0byBob2xkIDQwLWJ5dGUgaGV4CisgKiBTSEExLCBhbiBleHRyYSBzbGFzaCBmb3IgdGhlIGZpcnN0IGxldmVsIGluZGlyZWN0aW9uLCBhbmQgdGhlCisgKiB0ZXJtaW5hdGluZyBOVUwuCisgKi8KK3N0YXRpYyBpbnQgbGlua19hbHRfb2RiX2VudHJ5KGNvbnN0IGNoYXIgKiBlbnRyeSwgaW50IGxlbiwgY29uc3QgY2hhciAqIHJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICpvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICplbnQ7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKwkvKiA0MyA9IDQwLWJ5dGUgKyAyICcvJyArIHRlcm1pbmF0aW5nIE5VTCAqLworCWludCBwZnhsZW4gPSBsZW47CisJaW50IGVudGxlbiA9IHBmeGxlbiArIDQzOworCWludCBiYXNlX2xlbiA9IC0xOworCisJaWYgKCplbnRyeSAhPSAnLycgJiYgcmVsYXRpdmVfYmFzZSkgeworCQkvKiBSZWxhdGl2ZSBhbHQtb2RiICovCisJCWlmIChiYXNlX2xlbiA8IDApCisJCQliYXNlX2xlbiA9IHN0cmxlbihyZWxhdGl2ZV9iYXNlKSArIDE7CisJCWVudGxlbiArPSBiYXNlX2xlbjsKKwkJcGZ4bGVuICs9IGJhc2VfbGVuOworCX0KKwllbnQgPSB4bWFsbG9jKHNpemVvZigqZW50KSArIGVudGxlbik7CisKKwlpZiAoKmVudHJ5ICE9ICcvJyAmJiByZWxhdGl2ZV9iYXNlKSB7CisJCW1lbWNweShlbnQtPmJhc2UsIHJlbGF0aXZlX2Jhc2UsIGJhc2VfbGVuIC0gMSk7CisJCWVudC0+YmFzZVtiYXNlX2xlbiAtIDFdID0gJy8nOworCQltZW1jcHkoZW50LT5iYXNlICsgYmFzZV9sZW4sIGVudHJ5LCBsZW4pOworCX0KKwllbHNlCisJCW1lbWNweShlbnQtPmJhc2UsIGVudHJ5LCBwZnhsZW4pOworCisJZW50LT5uYW1lID0gZW50LT5iYXNlICsgcGZ4bGVuICsgMTsKKwllbnQtPmJhc2VbcGZ4bGVuICsgM10gPSAnLyc7CisJZW50LT5iYXNlW3BmeGxlbl0gPSBlbnQtPmJhc2VbZW50bGVuLTFdID0gMDsKKworCS8qIERldGVjdCBjYXNlcyB3aGVyZSBhbHRlcm5hdGUgZGlzYXBwZWFyZWQgKi8KKwlpZiAoc3RhdChlbnQtPmJhc2UsICZzdCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZXJyb3IoIm9iamVjdCBkaXJlY3RvcnkgJXMgZG9lcyBub3QgZXhpc3Q7ICIKKwkJICAgICAgImNoZWNrIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMuIiwKKwkJICAgICAgZW50LT5iYXNlKTsKKwkJZnJlZShlbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUHJldmVudCB0aGUgY29tbW9uIG1pc3Rha2Ugb2YgbGlzdGluZyB0aGUgc2FtZQorCSAqIHRoaW5nIHR3aWNlLCBvciBvYmplY3QgZGlyZWN0b3J5IGl0c2VsZi4KKwkgKi8KKwlmb3IgKGFsdCA9IGFsdF9vZGJfbGlzdDsgYWx0OyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJaWYgKCFtZW1jbXAoZW50LT5iYXNlLCBhbHQtPmJhc2UsIHBmeGxlbikpIHsKKwkJCWZyZWUoZW50KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAoIW1lbWNtcChlbnQtPmJhc2UsIG9iamRpciwgcGZ4bGVuKSkgeworCQlmcmVlKGVudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGQgdGhlIGFsdGVybmF0ZSBlbnRyeSAqLworCSphbHRfb2RiX3RhaWwgPSBlbnQ7CisJYWx0X29kYl90YWlsID0gJihlbnQtPm5leHQpOworCWVudC0+bmV4dCA9IE5VTEw7CisKKwkvKiByZWN1cnNpdmVseSBhZGQgYWx0ZXJuYXRlcyAqLworCXJlYWRfaW5mb19hbHRlcm5hdGVzKGVudC0+YmFzZSwgZGVwdGggKyAxKTsKKworCWVudC0+YmFzZVtwZnhsZW5dID0gJy8nOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfYWx0X29kYl9lbnRyaWVzKGNvbnN0IGNoYXIgKmFsdCwgY29uc3QgY2hhciAqZXAsIGludCBzZXAsCisJCQkJIGNvbnN0IGNoYXIgKnJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljb25zdCBjaGFyICpjcCwgKmxhc3Q7CisKKwlpZiAoZGVwdGggPiA1KSB7CisJCWVycm9yKCIlczogaWdub3JpbmcgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZXMsIG5lc3RpbmcgdG9vIGRlZXAuIiwKKwkJCQlyZWxhdGl2ZV9iYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWxhc3QgPSBhbHQ7CisJd2hpbGUgKGxhc3QgPCBlcCkgeworCQljcCA9IGxhc3Q7CisJCWlmIChjcCA8IGVwICYmICpjcCA9PSAnIycpIHsKKwkJCXdoaWxlIChjcCA8IGVwICYmICpjcCAhPSBzZXApCisJCQkJY3ArKzsKKwkJCWxhc3QgPSBjcCArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgIT0gc2VwKQorCQkJY3ArKzsKKwkJaWYgKGxhc3QgIT0gY3ApIHsKKwkJCWlmICgoKmxhc3QgIT0gJy8nKSAmJiBkZXB0aCkgeworCQkJCWVycm9yKCIlczogaWdub3JpbmcgcmVsYXRpdmUgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZSAlcyIsCisJCQkJCQlyZWxhdGl2ZV9iYXNlLCBsYXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJbGlua19hbHRfb2RiX2VudHJ5KGxhc3QsIGNwIC0gbGFzdCwKKwkJCQkJCXJlbGF0aXZlX2Jhc2UsIGRlcHRoKTsKKwkJCX0KKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgPT0gc2VwKQorCQkJY3ArKzsKKwkJbGFzdCA9IGNwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9pbmZvX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqIHJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljaGFyICptYXA7CisJc2l6ZV90IG1hcHN6OworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgYWx0X2ZpbGVfbmFtZVtdID0gImluZm8vYWx0ZXJuYXRlcyI7CisJLyogR2l2ZW4gdGhhdCByZWxhdGl2ZV9iYXNlIGlzIG5vIGxvbmdlciB0aGFuIFBBVEhfTUFYLAorCSAgIGVuc3VyZSB0aGF0ICJwYXRoIiBoYXMgZW5vdWdoIHNwYWNlIHRvIGFwcGVuZCAiLyIsIHRoZQorCSAgIGZpbGUgbmFtZSwgImluZm8vYWx0ZXJuYXRlcyIsIGFuZCBhIHRyYWlsaW5nIE5VTC4gICovCisJY2hhciBwYXRoW1BBVEhfTUFYICsgMSArIHNpemVvZiBhbHRfZmlsZV9uYW1lXTsKKwlpbnQgZmQ7CisKKwlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIHJlbGF0aXZlX2Jhc2UsIGFsdF9maWxlX25hbWUpOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCWlmIChmc3RhdChmZCwgJnN0KSB8fCAoc3Quc3Rfc2l6ZSA9PSAwKSkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCW1hcCA9IHhtbWFwKE5VTEwsIG1hcHN6LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCisJbGlua19hbHRfb2RiX2VudHJpZXMobWFwLCBtYXAgKyBtYXBzeiwgJ1xuJywgcmVsYXRpdmVfYmFzZSwgZGVwdGgpOworCisJbXVubWFwKG1hcCwgbWFwc3opOworfQorCit2b2lkIHByZXBhcmVfYWx0X29kYih2b2lkKQoreworCWNvbnN0IGNoYXIgKmFsdDsKKworCWFsdCA9IGdldGVudihBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQpOworCWlmICghYWx0KSBhbHQgPSAiIjsKKworCWlmIChhbHRfb2RiX3RhaWwpCisJCXJldHVybjsKKwlhbHRfb2RiX3RhaWwgPSAmYWx0X29kYl9saXN0OworCWxpbmtfYWx0X29kYl9lbnRyaWVzKGFsdCwgYWx0ICsgc3RybGVuKGFsdCksICc6JywgTlVMTCwgMCk7CisKKwlyZWFkX2luZm9fYWx0ZXJuYXRlcyhnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCAwKTsKK30KKworc3RhdGljIGNoYXIgKmZpbmRfc2hhMV9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwljaGFyICpuYW1lID0gc2hhMV9maWxlX25hbWUoc2hhMSk7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKworCWlmICghc3RhdChuYW1lLCBzdCkpCisJCXJldHVybiBuYW1lOworCXByZXBhcmVfYWx0X29kYigpOworCWZvciAoYWx0ID0gYWx0X29kYl9saXN0OyBhbHQ7IGFsdCA9IGFsdC0+bmV4dCkgeworCQluYW1lID0gYWx0LT5uYW1lOworCQlmaWxsX3NoYTFfcGF0aChuYW1lLCBzaGExKTsKKwkJaWYgKCFzdGF0KGFsdC0+YmFzZSwgc3QpKQorCQkJcmV0dXJuIGFsdC0+YmFzZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFja191c2VkX2N0cjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFja19tbWFwX2NhbGxzOworc3RhdGljIHVuc2lnbmVkIGludCBwZWFrX3BhY2tfb3Blbl93aW5kb3dzOworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrX29wZW5fd2luZG93czsKK3N0YXRpYyBzaXplX3QgcGVha19wYWNrX21hcHBlZDsKK3N0YXRpYyBzaXplX3QgcGFja19tYXBwZWQ7CitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja2VkX2dpdDsKKwordm9pZCBwYWNrX3JlcG9ydCgpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJwYWNrX3JlcG9ydDogZ2V0cGFnZXNpemUoKSAgICAgICAgICAgID0gJTEwIiBTWl9GTVQgIlxuIgorCQkicGFja19yZXBvcnQ6IGNvcmUucGFja2VkR2l0V2luZG93U2l6ZSA9ICUxMCIgU1pfRk1UICJcbiIKKwkJInBhY2tfcmVwb3J0OiBjb3JlLnBhY2tlZEdpdExpbWl0ICAgICAgPSAlMTAiIFNaX0ZNVCAiXG4iLAorCQkoc2l6ZV90KSBnZXRwYWdlc2l6ZSgpLAorCQlwYWNrZWRfZ2l0X3dpbmRvd19zaXplLAorCQlwYWNrZWRfZ2l0X2xpbWl0KTsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJInBhY2tfcmVwb3J0OiBwYWNrX3VzZWRfY3RyICAgICAgICAgICAgPSAlMTB1XG4iCisJCSJwYWNrX3JlcG9ydDogcGFja19tbWFwX2NhbGxzICAgICAgICAgID0gJTEwdVxuIgorCQkicGFja19yZXBvcnQ6IHBhY2tfb3Blbl93aW5kb3dzICAgICAgICA9ICUxMHUgLyAlMTB1XG4iCisJCSJwYWNrX3JlcG9ydDogcGFja19tYXBwZWQgICAgICAgICAgICAgID0gIgorCQkJIiUxMCIgU1pfRk1UICIgLyAlMTAiIFNaX0ZNVCAiXG4iLAorCQlwYWNrX3VzZWRfY3RyLAorCQlwYWNrX21tYXBfY2FsbHMsCisJCXBhY2tfb3Blbl93aW5kb3dzLCBwZWFrX3BhY2tfb3Blbl93aW5kb3dzLAorCQlwYWNrX21hcHBlZCwgcGVha19wYWNrX21hcHBlZCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGFja2VkX2dpdF9pZHgoY29uc3QgY2hhciAqcGF0aCwgIHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXZvaWQgKmlkeF9tYXA7CisJc3RydWN0IHBhY2tfaWR4X2hlYWRlciAqaGRyOworCXNpemVfdCBpZHhfc2l6ZTsKKwl1aW50MzJfdCB2ZXJzaW9uLCBuciwgaSwgKmluZGV4OworCWludCBmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChmc3RhdChmZCwgJnN0KSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisJaWR4X3NpemUgPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCWlmIChpZHhfc2l6ZSA8IDQgKiAyNTYgKyAyMCArIDIwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIGVycm9yKCJpbmRleCBmaWxlICVzIGlzIHRvbyBzbWFsbCIsIHBhdGgpOworCX0KKwlpZHhfbWFwID0geG1tYXAoTlVMTCwgaWR4X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisKKwloZHIgPSBpZHhfbWFwOworCWlmIChoZHItPmlkeF9zaWduYXR1cmUgPT0gaHRvbmwoUEFDS19JRFhfU0lHTkFUVVJFKSkgeworCQl2ZXJzaW9uID0gbnRvaGwoaGRyLT5pZHhfdmVyc2lvbik7CisJCWlmICh2ZXJzaW9uIDwgMiB8fCB2ZXJzaW9uID4gMikgeworCQkJbXVubWFwKGlkeF9tYXAsIGlkeF9zaXplKTsKKwkJCXJldHVybiBlcnJvcigiaW5kZXggZmlsZSAlcyBpcyB2ZXJzaW9uICVkIgorCQkJCSAgICAgIiBhbmQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJpbmFyeSIKKwkJCQkgICAgICIgKHRyeSB1cGdyYWRpbmcgR0lUIHRvIGEgbmV3ZXIgdmVyc2lvbikiLAorCQkJCSAgICAgcGF0aCwgdmVyc2lvbik7CisJCX0KKwl9IGVsc2UKKwkJdmVyc2lvbiA9IDE7CisKKwluciA9IDA7CisJaW5kZXggPSBpZHhfbWFwOworCWlmICh2ZXJzaW9uID4gMSkKKwkJaW5kZXggKz0gMjsgIC8qIHNraXAgaW5kZXggaGVhZGVyICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXVpbnQzMl90IG4gPSBudG9obChpbmRleFtpXSk7CisJCWlmIChuIDwgbnIpIHsKKwkJCW11bm1hcChpZHhfbWFwLCBpZHhfc2l6ZSk7CisJCQlyZXR1cm4gZXJyb3IoIm5vbi1tb25vdG9uaWMgaW5kZXggJXMiLCBwYXRoKTsKKwkJfQorCQluciA9IG47CisJfQorCisJaWYgKHZlcnNpb24gPT0gMSkgeworCQkvKgorCQkgKiBUb3RhbCBzaXplOgorCQkgKiAgLSAyNTYgaW5kZXggZW50cmllcyA0IGJ5dGVzIGVhY2gKKwkJICogIC0gMjQtYnl0ZSBlbnRyaWVzICogbnIgKDIwLWJ5dGUgc2hhMSArIDQtYnl0ZSBvZmZzZXQpCisJCSAqICAtIDIwLWJ5dGUgU0hBMSBvZiB0aGUgcGFja2ZpbGUKKwkJICogIC0gMjAtYnl0ZSBTSEExIGZpbGUgY2hlY2tzdW0KKwkJICovCisJCWlmIChpZHhfc2l6ZSAhPSA0KjI1NiArIG5yICogMjQgKyAyMCArIDIwKSB7CisJCQltdW5tYXAoaWR4X21hcCwgaWR4X3NpemUpOworCQkJcmV0dXJuIGVycm9yKCJ3cm9uZyBpbmRleCBmaWxlIHNpemUgaW4gJXMiLCBwYXRoKTsKKwkJfQorCX0gZWxzZSBpZiAodmVyc2lvbiA9PSAyKSB7CisJCS8qCisJCSAqIE1pbmltdW0gc2l6ZToKKwkJICogIC0gOCBieXRlcyBvZiBoZWFkZXIKKwkJICogIC0gMjU2IGluZGV4IGVudHJpZXMgNCBieXRlcyBlYWNoCisJCSAqICAtIDIwLWJ5dGUgc2hhMSBlbnRyeSAqIG5yCisJCSAqICAtIDQtYnl0ZSBjcmMgZW50cnkgKiBucgorCQkgKiAgLSA0LWJ5dGUgb2Zmc2V0IGVudHJ5ICogbnIKKwkJICogIC0gMjAtYnl0ZSBTSEExIG9mIHRoZSBwYWNrZmlsZQorCQkgKiAgLSAyMC1ieXRlIFNIQTEgZmlsZSBjaGVja3N1bQorCQkgKiBBbmQgYWZ0ZXIgdGhlIDQtYnl0ZSBvZmZzZXQgdGFibGUgbWlnaHQgYmUgYQorCQkgKiB2YXJpYWJsZSBzaXplZCB0YWJsZSBjb250YWluaW5nIDgtYnl0ZSBlbnRyaWVzCisJCSAqIGZvciBvZmZzZXRzIGxhcmdlciB0aGFuIDJeMzEuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIG1pbl9zaXplID0gOCArIDQqMjU2ICsgbnIqKDIwICsgNCArIDQpICsgMjAgKyAyMDsKKwkJdW5zaWduZWQgbG9uZyBtYXhfc2l6ZSA9IG1pbl9zaXplOworCQlpZiAobnIpCisJCQltYXhfc2l6ZSArPSAobnIgLSAxKSo4OworCQlpZiAoaWR4X3NpemUgPCBtaW5fc2l6ZSB8fCBpZHhfc2l6ZSA+IG1heF9zaXplKSB7CisJCQltdW5tYXAoaWR4X21hcCwgaWR4X3NpemUpOworCQkJcmV0dXJuIGVycm9yKCJ3cm9uZyBpbmRleCBmaWxlIHNpemUgaW4gJXMiLCBwYXRoKTsKKwkJfQorCQlpZiAoaWR4X3NpemUgIT0gbWluX3NpemUpIHsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gZGVhbCB3aXRoIGxhcmdlIHBhY2sgb2Zmc2V0cyAqLworCQkJb2ZmX3QgeCA9IDB4N2ZmZmZmZmZVTCwgeSA9IDB4ZmZmZmZmZmZVTDsKKwkJCWlmICh4ID4gKHggKyAxKSB8fCB5ID4gKHkgKyAxKSkgeworCQkJCW11bm1hcChpZHhfbWFwLCBpZHhfc2l6ZSk7CisJCQkJcmV0dXJuIGVycm9yKCJwYWNrIHRvbyBsYXJnZSBmb3IgY3VycmVudCBkZWZpbml0aW9uIG9mIG9mZl90IGluICVzIiwgcGF0aCk7CisJCQl9CisJCX0KKwl9CisKKwlwLT5pbmRleF92ZXJzaW9uID0gdmVyc2lvbjsKKwlwLT5pbmRleF9kYXRhID0gaWR4X21hcDsKKwlwLT5pbmRleF9zaXplID0gaWR4X3NpemU7CisJcC0+bnVtX29iamVjdHMgPSBucjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2Nhbl93aW5kb3dzKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCXN0cnVjdCBwYWNrZWRfZ2l0ICoqbHJ1X3AsCisJc3RydWN0IHBhY2tfd2luZG93ICoqbHJ1X3csCisJc3RydWN0IHBhY2tfd2luZG93ICoqbHJ1X2wpCit7CisJc3RydWN0IHBhY2tfd2luZG93ICp3LCAqd19sOworCisJZm9yICh3X2wgPSBOVUxMLCB3ID0gcC0+d2luZG93czsgdzsgdyA9IHctPm5leHQpIHsKKwkJaWYgKCF3LT5pbnVzZV9jbnQpIHsKKwkJCWlmICghKmxydV93IHx8IHctPmxhc3RfdXNlZCA8ICgqbHJ1X3cpLT5sYXN0X3VzZWQpIHsKKwkJCQkqbHJ1X3AgPSBwOworCQkJCSpscnVfdyA9IHc7CisJCQkJKmxydV9sID0gd19sOworCQkJfQorCQl9CisJCXdfbCA9IHc7CisJfQorfQorCitzdGF0aWMgaW50IHVudXNlX29uZV93aW5kb3coc3RydWN0IHBhY2tlZF9naXQgKmN1cnJlbnQsIGludCBrZWVwX2ZkKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwLCAqbHJ1X3AgPSBOVUxMOworCXN0cnVjdCBwYWNrX3dpbmRvdyAqbHJ1X3cgPSBOVUxMLCAqbHJ1X2wgPSBOVUxMOworCisJaWYgKGN1cnJlbnQpCisJCXNjYW5fd2luZG93cyhjdXJyZW50LCAmbHJ1X3AsICZscnVfdywgJmxydV9sKTsKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJc2Nhbl93aW5kb3dzKHAsICZscnVfcCwgJmxydV93LCAmbHJ1X2wpOworCWlmIChscnVfcCkgeworCQltdW5tYXAobHJ1X3ctPmJhc2UsIGxydV93LT5sZW4pOworCQlwYWNrX21hcHBlZCAtPSBscnVfdy0+bGVuOworCQlpZiAobHJ1X2wpCisJCQlscnVfbC0+bmV4dCA9IGxydV93LT5uZXh0OworCQllbHNlIHsKKwkJCWxydV9wLT53aW5kb3dzID0gbHJ1X3ctPm5leHQ7CisJCQlpZiAoIWxydV9wLT53aW5kb3dzICYmIGxydV9wLT5wYWNrX2ZkICE9IGtlZXBfZmQpIHsKKwkJCQljbG9zZShscnVfcC0+cGFja19mZCk7CisJCQkJbHJ1X3AtPnBhY2tfZmQgPSAtMTsKKwkJCX0KKwkJfQorCQlmcmVlKGxydV93KTsKKwkJcGFja19vcGVuX3dpbmRvd3MtLTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZV90IG5lZWQsIGludCBmZCkKK3sKKwlzaXplX3QgY3VyID0gcGFja19tYXBwZWQ7CisJd2hpbGUgKG5lZWQgPj0gKGN1ciAtIHBhY2tfbWFwcGVkKSAmJiB1bnVzZV9vbmVfd2luZG93KE5VTEwsIGZkKSkKKwkJOyAvKiBub3RoaW5nICovCit9CisKK3ZvaWQgdW51c2VfcGFjayhzdHJ1Y3QgcGFja193aW5kb3cgKip3X2N1cnNvcikKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKncgPSAqd19jdXJzb3I7CisJaWYgKHcpIHsKKwkJdy0+aW51c2VfY250LS07CisJCSp3X2N1cnNvciA9IE5VTEw7CisJfQorfQorCisvKgorICogRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseSBhcyB0aGlzIGxlYWtzIHAtPnBhY2tfZmQgb24gZXJyb3IgcmV0dXJuOworICogY2FsbCBvcGVuX3BhY2tlZF9naXQoKSBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IG9wZW5fcGFja2VkX2dpdF8xKHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrX2hlYWRlciBoZHI7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyICppZHhfc2hhMTsKKwlsb25nIGZkX2ZsYWc7CisKKwlwLT5wYWNrX2ZkID0gb3BlbihwLT5wYWNrX25hbWUsIE9fUkRPTkxZKTsKKwlpZiAocC0+cGFja19mZCA8IDAgfHwgZnN0YXQocC0+cGFja19mZCwgJnN0KSkKKwkJcmV0dXJuIC0xOworCisJLyogSWYgd2UgY3JlYXRlZCB0aGUgc3RydWN0IGJlZm9yZSB3ZSBoYWQgdGhlIHBhY2sgd2UgbGFjayBzaXplLiAqLworCWlmICghcC0+cGFja19zaXplKSB7CisJCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgbm90IGEgcmVndWxhciBmaWxlIiwgcC0+cGFja19uYW1lKTsKKwkJcC0+cGFja19zaXplID0gc3Quc3Rfc2l6ZTsKKwl9IGVsc2UgaWYgKHAtPnBhY2tfc2l6ZSAhPSBzdC5zdF9zaXplKQorCQlyZXR1cm4gZXJyb3IoInBhY2tmaWxlICVzIHNpemUgY2hhbmdlZCIsIHAtPnBhY2tfbmFtZSk7CisKKwkvKiBXZSBsZWF2ZSB0aGVzZSBmaWxlIGRlc2NyaXB0b3JzIG9wZW4gd2l0aCBzbGlkaW5nIG1tYXA7CisJICogdGhlcmUgaXMgbm8gcG9pbnQga2VlcGluZyB0aGVtIG9wZW4gYWNyb3NzIGV4ZWMoKSwgdGhvdWdoLgorCSAqLworCWZkX2ZsYWcgPSBmY250bChwLT5wYWNrX2ZkLCBGX0dFVEZELCAwKTsKKwlpZiAoZmRfZmxhZyA8IDApCisJCXJldHVybiBlcnJvcigiY2Fubm90IGRldGVybWluZSBmaWxlIGRlc2NyaXB0b3IgZmxhZ3MiKTsKKwlmZF9mbGFnIHw9IEZEX0NMT0VYRUM7CisJaWYgKGZjbnRsKHAtPnBhY2tfZmQsIEZfU0VURkQsIGZkX2ZsYWcpID09IC0xKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBzZXQgRkRfQ0xPRVhFQyIpOworCisJLyogVmVyaWZ5IHdlIHJlY29nbml6ZSB0aGlzIHBhY2sgZmlsZSBmb3JtYXQuICovCisJaWYgKHJlYWRfaW5fZnVsbChwLT5wYWNrX2ZkLCAmaGRyLCBzaXplb2YoaGRyKSkgIT0gc2l6ZW9mKGhkcikpCisJCXJldHVybiBlcnJvcigiZmlsZSAlcyBpcyBmYXIgdG9vIHNob3J0IHRvIGJlIGEgcGFja2ZpbGUiLCBwLT5wYWNrX25hbWUpOworCWlmIChoZHIuaGRyX3NpZ25hdHVyZSAhPSBodG9ubChQQUNLX1NJR05BVFVSRSkpCisJCXJldHVybiBlcnJvcigiZmlsZSAlcyBpcyBub3QgYSBHSVQgcGFja2ZpbGUiLCBwLT5wYWNrX25hbWUpOworCWlmICghcGFja192ZXJzaW9uX29rKGhkci5oZHJfdmVyc2lvbikpCisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgaXMgdmVyc2lvbiAldSBhbmQgbm90IHN1cHBvcnRlZCIKKwkJCSIgKHRyeSB1cGdyYWRpbmcgR0lUIHRvIGEgbmV3ZXIgdmVyc2lvbikiLAorCQkJcC0+cGFja19uYW1lLCBudG9obChoZHIuaGRyX3ZlcnNpb24pKTsKKworCS8qIFZlcmlmeSB0aGUgcGFjayBtYXRjaGVzIGl0cyBpbmRleC4gKi8KKwlpZiAocC0+bnVtX29iamVjdHMgIT0gbnRvaGwoaGRyLmhkcl9lbnRyaWVzKSkKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBjbGFpbXMgdG8gaGF2ZSAldSBvYmplY3RzIgorCQkJICAgICAiIHdoaWxlIGluZGV4IGluZGljYXRlcyAldSBvYmplY3RzIiwKKwkJCSAgICAgcC0+cGFja19uYW1lLCBudG9obChoZHIuaGRyX2VudHJpZXMpLAorCQkJICAgICBwLT5udW1fb2JqZWN0cyk7CisJaWYgKGxzZWVrKHAtPnBhY2tfZmQsIHAtPnBhY2tfc2l6ZSAtIHNpemVvZihzaGExKSwgU0VFS19TRVQpID09IC0xKQorCQlyZXR1cm4gZXJyb3IoImVuZCBvZiBwYWNrZmlsZSAlcyBpcyB1bmF2YWlsYWJsZSIsIHAtPnBhY2tfbmFtZSk7CisJaWYgKHJlYWRfaW5fZnVsbChwLT5wYWNrX2ZkLCBzaGExLCBzaXplb2Yoc2hhMSkpICE9IHNpemVvZihzaGExKSkKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBzaWduYXR1cmUgaXMgdW5hdmFpbGFibGUiLCBwLT5wYWNrX25hbWUpOworCWlkeF9zaGExID0gKCh1bnNpZ25lZCBjaGFyICopcC0+aW5kZXhfZGF0YSkgKyBwLT5pbmRleF9zaXplIC0gNDA7CisJaWYgKGhhc2hjbXAoc2hhMSwgaWR4X3NoYTEpKQorCQlyZXR1cm4gZXJyb3IoInBhY2tmaWxlICVzIGRvZXMgbm90IG1hdGNoIGluZGV4IiwgcC0+cGFja19uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJaWYgKCFvcGVuX3BhY2tlZF9naXRfMShwKSkKKwkJcmV0dXJuIDA7CisJaWYgKHAtPnBhY2tfZmQgIT0gLTEpIHsKKwkJY2xvc2UocC0+cGFja19mZCk7CisJCXAtPnBhY2tfZmQgPSAtMTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGluX3dpbmRvdyhzdHJ1Y3QgcGFja193aW5kb3cgKndpbiwgb2ZmX3Qgb2Zmc2V0KQoreworCS8qIFdlIG11c3QgcHJvbWlzZSBhdCBsZWFzdCAyMCBieXRlcyAob25lIGhhc2gpIGFmdGVyIHRoZQorCSAqIG9mZnNldCBpcyBhdmFpbGFibGUgZnJvbSB0aGlzIHdpbmRvdywgb3RoZXJ3aXNlIHRoZSBvZmZzZXQKKwkgKiBpcyBub3QgYWN0dWFsbHkgaW4gdGhpcyB3aW5kb3cgYW5kIGEgZGlmZmVyZW50IHdpbmRvdyAod2hpY2gKKwkgKiBoYXMgdGhhdCBvbmUgaGFzaCBleGNlc3MpIG11c3QgYmUgdXNlZC4gIFRoaXMgaXMgdG8gc3VwcG9ydAorCSAqIHRoZSBvYmplY3QgaGVhZGVyIGFuZCBkZWx0YSBiYXNlIHBhcnNpbmcgcm91dGluZXMgYmVsb3cuCisJICovCisJb2ZmX3Qgd2luX29mZiA9IHdpbi0+b2Zmc2V0OworCXJldHVybiB3aW5fb2ZmIDw9IG9mZnNldAorCQkmJiAob2Zmc2V0ICsgMjApIDw9ICh3aW5fb2ZmICsgd2luLT5sZW4pOworfQorCit1bnNpZ25lZCBjaGFyKiB1c2VfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCwKKwkJc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzb3IsCisJCW9mZl90IG9mZnNldCwKKwkJdW5zaWduZWQgaW50ICpsZWZ0KQoreworCXN0cnVjdCBwYWNrX3dpbmRvdyAqd2luID0gKndfY3Vyc29yOworCisJaWYgKHAtPnBhY2tfZmQgPT0gLTEgJiYgb3Blbl9wYWNrZWRfZ2l0KHApKQorCQlkaWUoInBhY2tmaWxlICVzIGNhbm5vdCBiZSBhY2Nlc3NlZCIsIHAtPnBhY2tfbmFtZSk7CisKKwkvKiBTaW5jZSBwYWNrZmlsZXMgZW5kIGluIGEgaGFzaCBvZiB0aGVpciBjb250ZW50IGFuZCBpdHMKKwkgKiBwb2ludGxlc3MgdG8gYXNrIGZvciBhbiBvZmZzZXQgaW50byB0aGUgbWlkZGxlIG9mIHRoYXQKKwkgKiBoYXNoLCBhbmQgdGhlIGluX3dpbmRvdyBmdW5jdGlvbiBhYm92ZSB3b3VsZG4ndCBtYXRjaAorCSAqIGRvbid0IGFsbG93IGFuIG9mZnNldCB0b28gY2xvc2UgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgKi8KKwlpZiAob2Zmc2V0ID4gKHAtPnBhY2tfc2l6ZSAtIDIwKSkKKwkJZGllKCJvZmZzZXQgYmV5b25kIGVuZCBvZiBwYWNrZmlsZSAodHJ1bmNhdGVkIHBhY2s/KSIpOworCisJaWYgKCF3aW4gfHwgIWluX3dpbmRvdyh3aW4sIG9mZnNldCkpIHsKKwkJaWYgKHdpbikKKwkJCXdpbi0+aW51c2VfY250LS07CisJCWZvciAod2luID0gcC0+d2luZG93czsgd2luOyB3aW4gPSB3aW4tPm5leHQpIHsKKwkJCWlmIChpbl93aW5kb3cod2luLCBvZmZzZXQpKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghd2luKSB7CisJCQlzaXplX3Qgd2luZG93X2FsaWduID0gcGFja2VkX2dpdF93aW5kb3dfc2l6ZSAvIDI7CisJCQlvZmZfdCBsZW47CisJCQl3aW4gPSB4Y2FsbG9jKDEsIHNpemVvZigqd2luKSk7CisJCQl3aW4tPm9mZnNldCA9IChvZmZzZXQgLyB3aW5kb3dfYWxpZ24pICogd2luZG93X2FsaWduOworCQkJbGVuID0gcC0+cGFja19zaXplIC0gd2luLT5vZmZzZXQ7CisJCQlpZiAobGVuID4gcGFja2VkX2dpdF93aW5kb3dfc2l6ZSkKKwkJCQlsZW4gPSBwYWNrZWRfZ2l0X3dpbmRvd19zaXplOworCQkJd2luLT5sZW4gPSAoc2l6ZV90KWxlbjsKKwkJCXBhY2tfbWFwcGVkICs9IHdpbi0+bGVuOworCQkJd2hpbGUgKHBhY2tlZF9naXRfbGltaXQgPCBwYWNrX21hcHBlZAorCQkJCSYmIHVudXNlX29uZV93aW5kb3cocCwgcC0+cGFja19mZCkpCisJCQkJOyAvKiBub3RoaW5nICovCisJCQl3aW4tPmJhc2UgPSB4bW1hcChOVUxMLCB3aW4tPmxlbiwKKwkJCQlQUk9UX1JFQUQsIE1BUF9QUklWQVRFLAorCQkJCXAtPnBhY2tfZmQsIHdpbi0+b2Zmc2V0KTsKKwkJCWlmICh3aW4tPmJhc2UgPT0gTUFQX0ZBSUxFRCkKKwkJCQlkaWUoInBhY2tmaWxlICVzIGNhbm5vdCBiZSBtYXBwZWQ6ICVzIiwKKwkJCQkJcC0+cGFja19uYW1lLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcGFja19tbWFwX2NhbGxzKys7CisJCQlwYWNrX29wZW5fd2luZG93cysrOworCQkJaWYgKHBhY2tfbWFwcGVkID4gcGVha19wYWNrX21hcHBlZCkKKwkJCQlwZWFrX3BhY2tfbWFwcGVkID0gcGFja19tYXBwZWQ7CisJCQlpZiAocGFja19vcGVuX3dpbmRvd3MgPiBwZWFrX3BhY2tfb3Blbl93aW5kb3dzKQorCQkJCXBlYWtfcGFja19vcGVuX3dpbmRvd3MgPSBwYWNrX29wZW5fd2luZG93czsKKwkJCXdpbi0+bmV4dCA9IHAtPndpbmRvd3M7CisJCQlwLT53aW5kb3dzID0gd2luOworCQl9CisJfQorCWlmICh3aW4gIT0gKndfY3Vyc29yKSB7CisJCXdpbi0+bGFzdF91c2VkID0gcGFja191c2VkX2N0cisrOworCQl3aW4tPmludXNlX2NudCsrOworCQkqd19jdXJzb3IgPSB3aW47CisJfQorCW9mZnNldCAtPSB3aW4tPm9mZnNldDsKKwlpZiAobGVmdCkKKwkJKmxlZnQgPSB3aW4tPmxlbiAtIHhzaXplX3Qob2Zmc2V0KTsKKwlyZXR1cm4gd2luLT5iYXNlICsgb2Zmc2V0OworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqYWRkX3BhY2tlZF9naXQoY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhfbGVuLCBpbnQgbG9jYWwpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSB4bWFsbG9jKHNpemVvZigqcCkgKyBwYXRoX2xlbiArIDIpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgYSBjb3JyZXNwb25kaW5nIC5wYWNrIGZpbGUgZXhpc3RzIGFuZCB0aGF0CisJICogdGhlIGluZGV4IGxvb2tzIHNhbmUuCisJICovCisJcGF0aF9sZW4gLT0gc3RybGVuKCIuaWR4Iik7CisJaWYgKHBhdGhfbGVuIDwgMSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KHAtPnBhY2tfbmFtZSwgcGF0aCwgcGF0aF9sZW4pOworCXN0cmNweShwLT5wYWNrX25hbWUgKyBwYXRoX2xlbiwgIi5wYWNrIik7CisJaWYgKHN0YXQocC0+cGFja19uYW1lLCAmc3QpIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8CisJICAgIGNoZWNrX3BhY2tlZF9naXRfaWR4KHBhdGgsIHApKSB7CisJCWZyZWUocCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIG9rLCBpdCBsb29rcyBzYW5lIGFzIGZhciBhcyB3ZSBjYW4gY2hlY2sgd2l0aG91dAorCSAqIGFjdHVhbGx5IG1hcHBpbmcgdGhlIHBhY2sgZmlsZS4KKwkgKi8KKwlwLT5wYWNrX3NpemUgPSBzdC5zdF9zaXplOworCXAtPm5leHQgPSBOVUxMOworCXAtPndpbmRvd3MgPSBOVUxMOworCXAtPnBhY2tfZmQgPSAtMTsKKwlwLT5wYWNrX2xvY2FsID0gbG9jYWw7CisJcC0+bXRpbWUgPSBzdC5zdF9tdGltZTsKKwlpZiAocGF0aF9sZW4gPCA0MCB8fCBnZXRfc2hhMV9oZXgocGF0aCArIHBhdGhfbGVuIC0gNDAsIHAtPnNoYTEpKQorCQloYXNoY2xyKHAtPnNoYTEpOworCXJldHVybiBwOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKnBhdGggPSBzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKTsKKwlyZXR1cm4gcGFyc2VfcGFja19pbmRleF9maWxlKHNoYTEsIHBhdGgpOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCSBjb25zdCBjaGFyICppZHhfcGF0aCkKK3sKKwljb25zdCBjaGFyICpwYXRoID0gc2hhMV9wYWNrX25hbWUoc2hhMSk7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSB4bWFsbG9jKHNpemVvZigqcCkgKyBzdHJsZW4ocGF0aCkgKyAyKTsKKworCWlmIChjaGVja19wYWNrZWRfZ2l0X2lkeChpZHhfcGF0aCwgcCkpIHsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3RyY3B5KHAtPnBhY2tfbmFtZSwgcGF0aCk7CisJcC0+cGFja19zaXplID0gMDsKKwlwLT5uZXh0ID0gTlVMTDsKKwlwLT53aW5kb3dzID0gTlVMTDsKKwlwLT5wYWNrX2ZkID0gLTE7CisJaGFzaGNweShwLT5zaGExLCBzaGExKTsKKwlyZXR1cm4gcDsKK30KKwordm9pZCBpbnN0YWxsX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKnBhY2spCit7CisJcGFjay0+bmV4dCA9IHBhY2tlZF9naXQ7CisJcGFja2VkX2dpdCA9IHBhY2s7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcGFja2VkX2dpdF9vbmUoY2hhciAqb2JqZGlyLCBpbnQgbG9jYWwpCit7CisJLyogRW5zdXJlIHRoYXQgdGhpcyBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHNvIHRoYXQgd2UgY2FuCisJICAgYXBwZW5kICIvcGFjay8iIHdpdGhvdXQgY2xvYmJlcmluZyB0aGUgc3RhY2sgZXZlbiBpZgorCSAgIHN0cmxlbihvYmpkaXIpIHdlcmUgUEFUSF9NQVguICAqLworCWNoYXIgcGF0aFtQQVRIX01BWCArIDEgKyA0ICsgMSArIDFdOworCWludCBsZW47CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwlzcHJpbnRmKHBhdGgsICIlcy9wYWNrIiwgb2JqZGlyKTsKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRpcikgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZXJyb3IoInVuYWJsZSB0byBvcGVuIG9iamVjdCBwYWNrIGRpcmVjdG9yeTogJXM6ICVzIiwKKwkJCSAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJcGF0aFtsZW4rK10gPSAnLyc7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnA7CisKKwkJaWYgKCFoYXNfZXh0ZW5zaW9uKGRlLT5kX25hbWUsICIuaWR4IikpCisJCQljb250aW51ZTsKKworCQlpZiAobGVuICsgbmFtZWxlbiArIDEgPiBzaXplb2YocGF0aCkpCisJCQljb250aW51ZTsKKworCQkvKiBEb24ndCByZW9wZW4gYSBwYWNrIHdlIGFscmVhZHkgaGF2ZS4gKi8KKwkJc3RyY3B5KHBhdGggKyBsZW4sIGRlLT5kX25hbWUpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKCFtZW1jbXAocGF0aCwgcC0+cGFja19uYW1lLCBsZW4gKyBuYW1lbGVuIC0gNCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHApCisJCQljb250aW51ZTsKKwkJLyogU2VlIGlmIGl0IHJlYWxseSBpcyBhIHZhbGlkIC5pZHggZmlsZSB3aXRoIGNvcnJlc3BvbmRpbmcKKwkJICogLnBhY2sgZmlsZSB0aGF0IHdlIGNhbiBtYXAuCisJCSAqLworCQlwID0gYWRkX3BhY2tlZF9naXQocGF0aCwgbGVuICsgbmFtZWxlbiwgbG9jYWwpOworCQlpZiAoIXApCisJCQljb250aW51ZTsKKwkJaW5zdGFsbF9wYWNrZWRfZ2l0KHApOworCX0KKwljbG9zZWRpcihkaXIpOworfQorCitzdGF0aWMgaW50IHNvcnRfcGFjayhjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHBhY2tlZF9naXQgKmEgPSAqKChzdHJ1Y3QgcGFja2VkX2dpdCAqKilhXyk7CisJc3RydWN0IHBhY2tlZF9naXQgKmIgPSAqKChzdHJ1Y3QgcGFja2VkX2dpdCAqKiliXyk7CisJaW50IHN0OworCisJLyoKKwkgKiBMb2NhbCBwYWNrcyB0ZW5kIHRvIGNvbnRhaW4gb2JqZWN0cyBzcGVjaWZpYyB0byBvdXIKKwkgKiB2YXJpYW50IG9mIHRoZSBwcm9qZWN0IHRoYW4gcmVtb3RlIG9uZXMuICBJbiBhZGRpdGlvbiwKKwkgKiByZW1vdGUgb25lcyBjb3VsZCBiZSBvbiBhIG5ldHdvcmsgbW91bnRlZCBmaWxlc3lzdGVtLgorCSAqIEZhdm9yIGxvY2FsIG9uZXMgZm9yIHRoZXNlIHJlYXNvbnMuCisJICovCisJc3QgPSBhLT5wYWNrX2xvY2FsIC0gYi0+cGFja19sb2NhbDsKKwlpZiAoc3QpCisJCXJldHVybiAtc3Q7CisKKwkvKgorCSAqIFlvdW5nZXIgcGFja3MgdGVuZCB0byBjb250YWluIG1vcmUgcmVjZW50IG9iamVjdHMsCisJICogYW5kIG1vcmUgcmVjZW50IG9iamVjdHMgdGVuZCB0byBnZXQgYWNjZXNzZWQgbW9yZQorCSAqIG9mdGVuLgorCSAqLworCWlmIChhLT5tdGltZSA8IGItPm10aW1lKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChhLT5tdGltZSA9PSBiLT5tdGltZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCByZWFycmFuZ2VfcGFja2VkX2dpdCh2b2lkKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICoqYXJ5LCAqcDsKKwlpbnQgaSwgbjsKKworCWZvciAobiA9IDAsIHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJbisrOworCWlmIChuIDwgMikKKwkJcmV0dXJuOworCisJLyogcHJlcGFyZSBhbiBhcnJheSBvZiBwYWNrZWRfZ2l0IGZvciBlYXNpZXIgc29ydGluZyAqLworCWFyeSA9IHhjYWxsb2Mobiwgc2l6ZW9mKHN0cnVjdCBwYWNrZWRfZ2l0ICopKTsKKwlmb3IgKG4gPSAwLCBwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpCisJCWFyeVtuKytdID0gcDsKKworCXFzb3J0KGFyeSwgbiwgc2l6ZW9mKHN0cnVjdCBwYWNrZWRfZ2l0ICopLCBzb3J0X3BhY2spOworCisJLyogbGluayB0aGVtIGJhY2sgYWdhaW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbiAtIDE7IGkrKykKKwkJYXJ5W2ldLT5uZXh0ID0gYXJ5W2kgKyAxXTsKKwlhcnlbbiAtIDFdLT5uZXh0ID0gTlVMTDsKKwlwYWNrZWRfZ2l0ID0gYXJ5WzBdOworCisJZnJlZShhcnkpOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSA9IDA7Cit2b2lkIHByZXBhcmVfcGFja2VkX2dpdCh2b2lkKQoreworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHQ7CisKKwlpZiAocHJlcGFyZV9wYWNrZWRfZ2l0X3J1bl9vbmNlKQorCQlyZXR1cm47CisJcHJlcGFyZV9wYWNrZWRfZ2l0X29uZShnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCAxKTsKKwlwcmVwYXJlX2FsdF9vZGIoKTsKKwlmb3IgKGFsdCA9IGFsdF9vZGJfbGlzdDsgYWx0OyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJYWx0LT5uYW1lWy0xXSA9IDA7CisJCXByZXBhcmVfcGFja2VkX2dpdF9vbmUoYWx0LT5iYXNlLCAwKTsKKwkJYWx0LT5uYW1lWy0xXSA9ICcvJzsKKwl9CisJcmVhcnJhbmdlX3BhY2tlZF9naXQoKTsKKwlwcmVwYXJlX3BhY2tlZF9naXRfcnVuX29uY2UgPSAxOworfQorCit2b2lkIHJlcHJlcGFyZV9wYWNrZWRfZ2l0KHZvaWQpCit7CisJcHJlcGFyZV9wYWNrZWRfZ2l0X3J1bl9vbmNlID0gMDsKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKK30KKworaW50IGNoZWNrX3NoYTFfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKm1hcCwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwloYXNoX3NoYTFfZmlsZShtYXAsIHNpemUsIHR5cGUsIHJlYWxfc2hhMSk7CisJcmV0dXJuIGhhc2hjbXAoc2hhMSwgcmVhbF9zaGExKSA/IC0xIDogMDsKK30KKwordm9pZCAqbWFwX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCXZvaWQgKm1hcDsKKwlpbnQgZmQ7CisJY2hhciAqZmlsZW5hbWUgPSBmaW5kX3NoYTFfZmlsZShzaGExLCAmc3QpOworCisJaWYgKCFmaWxlbmFtZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgc2hhMV9maWxlX29wZW5fZmxhZyk7CisJaWYgKGZkIDwgMCkgeworCQkvKiBTZWUgaWYgaXQgd29ya3Mgd2l0aG91dCBPX05PQVRJTUUgKi8KKwkJc3dpdGNoIChzaGExX2ZpbGVfb3Blbl9mbGFnKSB7CisJCWRlZmF1bHQ6CisJCQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwkJCWlmIChmZCA+PSAwKQorCQkJCWJyZWFrOworCQkvKiBGYWxsdGhyb3VnaCAqLworCQljYXNlIDA6CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIElmIGl0IGZhaWxlZCBvbmNlLCBpdCB3aWxsIHByb2JhYmx5IGZhaWwgYWdhaW4uCisJCSAqIFN0b3AgdXNpbmcgT19OT0FUSU1FCisJCSAqLworCQlzaGExX2ZpbGVfb3Blbl9mbGFnID0gMDsKKwl9CisJKnNpemUgPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCW1hcCA9IHhtbWFwKE5VTEwsICpzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCXJldHVybiBtYXA7Cit9CisKK2ludCBsZWdhY3lfbG9vc2Vfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKm1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgd29yZDsKKworCS8qCisJICogSXMgaXQgYSB6bGliLWNvbXByZXNzZWQgYnVmZmVyPyBJZiBzbywgdGhlIGZpcnN0IGJ5dGUKKwkgKiBtdXN0IGJlIDB4NzggKDE1LWJpdCB3aW5kb3cgc2l6ZSwgZGVmbGF0ZWQpLCBhbmQgdGhlCisJICogZmlyc3QgMTYtYml0IHdvcmQgaXMgZXZlbmx5IGRpdmlzaWJsZSBieSAzMQorCSAqLworCXdvcmQgPSAobWFwWzBdIDw8IDgpICsgbWFwWzFdOworCWlmIChtYXBbMF0gPT0gMHg3OCAmJiAhKHdvcmQgJSAzMSkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgdW5wYWNrX29iamVjdF9oZWFkZXJfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXVuc2lnbmVkIHNoaWZ0OworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyB1c2VkID0gMDsKKworCWMgPSBidWZbdXNlZCsrXTsKKwkqdHlwZSA9IChjID4+IDQpICYgNzsKKwlzaXplID0gYyAmIDE1OworCXNoaWZ0ID0gNDsKKwl3aGlsZSAoYyAmIDB4ODApIHsKKwkJaWYgKGxlbiA8PSB1c2VkKQorCQkJcmV0dXJuIDA7CisJCWlmIChzaXplb2YobG9uZykgKiA4IDw9IHNoaWZ0KQorCQkJcmV0dXJuIDA7CisJCWMgPSBidWZbdXNlZCsrXTsKKwkJc2l6ZSArPSAoYyAmIDB4N2YpIDw8IHNoaWZ0OworCQlzaGlmdCArPSA3OworCX0KKwkqc2l6ZXAgPSBzaXplOworCXJldHVybiB1c2VkOworfQorCitzdGF0aWMgaW50IHVucGFja19zaGExX2hlYWRlcih6X3N0cmVhbSAqc3RyZWFtLCB1bnNpZ25lZCBjaGFyICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZnNpeikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIHVzZWQ7CisJc3RhdGljIGNvbnN0IGNoYXIgdmFsaWRfbG9vc2Vfb2JqZWN0X3R5cGVbOF0gPSB7CisJCTAsIC8qIE9CSl9FWFQgKi8KKwkJMSwgMSwgMSwgMSwgLyogImNvbW1pdCIsICJ0cmVlIiwgImJsb2IiLCAidGFnIiAqLworCQkwLCAvKiAiZGVsdGEiIGFuZCBvdGhlcnMgYXJlIGludmFsaWQgaW4gYSBsb29zZSBvYmplY3QgKi8KKwl9OworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKworCS8qIEdldCB0aGUgZGF0YSBzdHJlYW0gKi8KKwltZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoKnN0cmVhbSkpOworCXN0cmVhbS0+bmV4dF9pbiA9IG1hcDsKKwlzdHJlYW0tPmF2YWlsX2luID0gbWFwc2l6ZTsKKwlzdHJlYW0tPm5leHRfb3V0ID0gYnVmZmVyOworCXN0cmVhbS0+YXZhaWxfb3V0ID0gYnVmc2l6OworCisJaWYgKGxlZ2FjeV9sb29zZV9vYmplY3QobWFwKSkgeworCQlpbmZsYXRlSW5pdChzdHJlYW0pOworCQlyZXR1cm4gaW5mbGF0ZShzdHJlYW0sIDApOworCX0KKworCXVzZWQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcl9nZW50bHkobWFwLCBtYXBzaXplLCAmdHlwZSwgJnNpemUpOworCWlmICghdXNlZCB8fCAhdmFsaWRfbG9vc2Vfb2JqZWN0X3R5cGVbdHlwZV0pCisJCXJldHVybiAtMTsKKwltYXAgKz0gdXNlZDsKKwltYXBzaXplIC09IHVzZWQ7CisKKwkvKiBTZXQgdXAgdGhlIHN0cmVhbSBmb3IgdGhlIHJlc3QuLiAqLworCXN0cmVhbS0+bmV4dF9pbiA9IG1hcDsKKwlzdHJlYW0tPmF2YWlsX2luID0gbWFwc2l6ZTsKKwlpbmZsYXRlSW5pdChzdHJlYW0pOworCisJLyogQW5kIGdlbmVyYXRlIHRoZSBmYWtlIHRyYWRpdGlvbmFsIGhlYWRlciAqLworCXN0cmVhbS0+dG90YWxfb3V0ID0gMSArIHNucHJpbnRmKGJ1ZmZlciwgYnVmc2l6LCAiJXMgJWx1IiwKKwkJCQkJIHR5cGVuYW1lKHR5cGUpLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19zaGExX3Jlc3Qoel9zdHJlYW0gKnN0cmVhbSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGJ5dGVzID0gc3RybGVuKGJ1ZmZlcikgKyAxOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHhtYWxsb2MoMStzaXplKTsKKwl1bnNpZ25lZCBsb25nIG47CisJaW50IHN0YXR1cyA9IFpfT0s7CisKKwluID0gc3RyZWFtLT50b3RhbF9vdXQgLSBieXRlczsKKwlpZiAobiA+IHNpemUpCisJCW4gPSBzaXplOworCW1lbWNweShidWYsIChjaGFyICopIGJ1ZmZlciArIGJ5dGVzLCBuKTsKKwlieXRlcyA9IG47CisJaWYgKGJ5dGVzIDw9IHNpemUpIHsKKwkJLyoKKwkJICogVGhlIGFib3ZlIGNvbmRpdGlvbiBtdXN0IGJlIChieXRlcyA8PSBzaXplKSwgbm90CisJCSAqIChieXRlcyA8IHNpemUpLiAgSW4gb3RoZXIgd29yZHMsIGV2ZW4gdGhvdWdoIHdlCisJCSAqIGV4cGVjdCBubyBtb3JlIG91dHB1dCBhbmQgc2V0IGF2YWlsX291dCB0byB6ZXIwLAorCQkgKiB0aGUgaW5wdXQgemxpYiBzdHJlYW0gbWF5IGhhdmUgYnl0ZXMgdGhhdCBleHByZXNzCisJCSAqICJ0aGlzIGNvbmNsdWRlcyB0aGUgc3RyZWFtIiwgYW5kIHdlICpkbyogd2FudCB0bworCQkgKiBlYXQgdGhhdCBpbnB1dC4KKwkJICoKKwkJICogT3RoZXJ3aXNlIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHRlc3QgdGhhdCB3ZQorCQkgKiBjb25zdW1lZCBhbGwgdGhlIGlucHV0IHRvIHJlYWNoIHRoZSBleHBlY3RlZCBzaXplOworCQkgKiB3ZSBhbHNvIHdhbnQgdG8gY2hlY2sgdGhhdCB6bGliIHRlbGxzIHVzIHRoYXQgYWxsCisJCSAqIHdlbnQgd2VsbCB3aXRoIHN0YXR1cyA9PSBaX1NUUkVBTV9FTkQgYXQgdGhlIGVuZC4KKwkJICovCisJCXN0cmVhbS0+bmV4dF9vdXQgPSBidWYgKyBieXRlczsKKwkJc3RyZWFtLT5hdmFpbF9vdXQgPSBzaXplIC0gYnl0ZXM7CisJCXdoaWxlIChzdGF0dXMgPT0gWl9PSykKKwkJCXN0YXR1cyA9IGluZmxhdGUoc3RyZWFtLCBaX0ZJTklTSCk7CisJfQorCWJ1ZltzaXplXSA9IDA7CisJaWYgKHN0YXR1cyA9PSBaX1NUUkVBTV9FTkQgJiYgIXN0cmVhbS0+YXZhaWxfaW4pIHsKKwkJaW5mbGF0ZUVuZChzdHJlYW0pOworCQlyZXR1cm4gYnVmOworCX0KKworCWlmIChzdGF0dXMgPCAwKQorCQllcnJvcigiY29ycnVwdCBsb29zZSBvYmplY3QgJyVzJyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwllbHNlIGlmIChzdHJlYW0tPmF2YWlsX2luKQorCQllcnJvcigiZ2FyYmFnZSBhdCBlbmQgb2YgbG9vc2Ugb2JqZWN0ICclcyciLAorCQkgICAgICBzaGExX3RvX2hleChzaGExKSk7CisJZnJlZShidWYpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogV2UgdXNlZCB0byBqdXN0IHVzZSAic3NjYW5mKCkiLCBidXQgdGhhdCdzIGFjdHVhbGx5IHdheQorICogdG9vIHBlcm1pc3NpdmUgZm9yIHdoYXQgd2Ugd2FudCB0byBjaGVjay4gU28gZG8gYW4gYW5hbAorICogb2JqZWN0IGhlYWRlciBwYXJzZSBieSBoYW5kLgorICovCitzdGF0aWMgaW50IHBhcnNlX3NoYTFfaGVhZGVyKGNvbnN0IGNoYXIgKmhkciwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJY2hhciB0eXBlWzEwXTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkvKgorCSAqIFRoZSB0eXBlIGNhbiBiZSBhdCBtb3N0IHRlbiBieXRlcyAoaW5jbHVkaW5nIHRoZSAKKwkgKiB0ZXJtaW5hdGluZyAnXDAnIHRoYXQgd2UgYWRkKSwgYW5kIGlzIGZvbGxvd2VkIGJ5CisJICogYSBzcGFjZS4KKwkgKi8KKwlpID0gMDsKKwlmb3IgKDs7KSB7CisJCWNoYXIgYyA9ICpoZHIrKzsKKwkJaWYgKGMgPT0gJyAnKQorCQkJYnJlYWs7CisJCXR5cGVbaSsrXSA9IGM7CisJCWlmIChpID49IHNpemVvZih0eXBlKSkKKwkJCXJldHVybiAtMTsKKwl9CisJdHlwZVtpXSA9IDA7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBmb2xsb3cgaW1tZWRpYXRlbHksIGFuZCBiZSBpbiBjYW5vbmljYWwKKwkgKiBkZWNpbWFsIGZvcm1hdCAoaWUgIjAxMCIgaXMgbm90IHZhbGlkKS4KKwkgKi8KKwlzaXplID0gKmhkcisrIC0gJzAnOworCWlmIChzaXplID4gOSkKKwkJcmV0dXJuIC0xOworCWlmIChzaXplKSB7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYyA9ICpoZHIgLSAnMCc7CisJCQlpZiAoYyA+IDkpCisJCQkJYnJlYWs7CisJCQloZHIrKzsKKwkJCXNpemUgPSBzaXplICogMTAgKyBjOworCQl9CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBiZSBmb2xsb3dlZCBieSBhIHplcm8gYnl0ZQorCSAqLworCXJldHVybiAqaGRyID8gLTEgOiB0eXBlX2Zyb21fc3RyaW5nKHR5cGUpOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX3NoYTFfZmlsZSh2b2lkICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0OworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkcls4MTkyXTsKKworCXJldCA9IHVucGFja19zaGExX2hlYWRlcigmc3RyZWFtLCBtYXAsIG1hcHNpemUsIGhkciwgc2l6ZW9mKGhkcikpOworCWlmIChyZXQgPCBaX09LIHx8ICgqdHlwZSA9IHBhcnNlX3NoYTFfaGVhZGVyKGhkciwgc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdW5wYWNrX3NoYTFfcmVzdCgmc3RyZWFtLCBoZHIsICpzaXplLCBzaGExKTsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfc2l6ZV9mcm9tX2RlbHRhKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQkJICAgICAgICAgIG9mZl90IGN1cnBvcykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgZGVsdGFfaGVhZFsyMF0sICppbjsKKwl6X3N0cmVhbSBzdHJlYW07CisJaW50IHN0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9oZWFkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZGVsdGFfaGVhZCk7CisKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlkbyB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBjdXJwb3MsICZzdHJlYW0uYXZhaWxfaW4pOworCQlzdHJlYW0ubmV4dF9pbiA9IGluOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQljdXJwb3MgKz0gc3RyZWFtLm5leHRfaW4gLSBpbjsKKwl9IHdoaWxlICgoc3QgPT0gWl9PSyB8fCBzdCA9PSBaX0JVRl9FUlJPUikgJiYKKwkJIHN0cmVhbS50b3RhbF9vdXQgPCBzaXplb2YoZGVsdGFfaGVhZCkpOworCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJaWYgKChzdCAhPSBaX1NUUkVBTV9FTkQpICYmIHN0cmVhbS50b3RhbF9vdXQgIT0gc2l6ZW9mKGRlbHRhX2hlYWQpKQorCQlkaWUoImRlbHRhIGRhdGEgdW5wYWNrLWluaXRpYWwgZmFpbGVkIik7CisKKwkvKiBFeGFtaW5lIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIGRlbHRhIHRvIGZpZ3VyZSBvdXQKKwkgKiB0aGUgcmVzdWx0IHNpemUuCisJICovCisJZGF0YSA9IGRlbHRhX2hlYWQ7CisKKwkvKiBpZ25vcmUgYmFzZSBzaXplICovCisJZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCBkZWx0YV9oZWFkK3NpemVvZihkZWx0YV9oZWFkKSk7CisKKwkvKiBSZWFkIHRoZSByZXN1bHQgc2l6ZSAqLworCXJldHVybiBnZXRfZGVsdGFfaGRyX3NpemUoJmRhdGEsIGRlbHRhX2hlYWQrc2l6ZW9mKGRlbHRhX2hlYWQpKTsKK30KKworc3RhdGljIG9mZl90IGdldF9kZWx0YV9iYXNlKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgICBzdHJ1Y3QgcGFja193aW5kb3cgKip3X2N1cnMsCisJCQkJICAgIG9mZl90ICpjdXJwb3MsCisJCQkJICAgIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCQkgICAgb2ZmX3QgZGVsdGFfb2JqX29mZnNldCkKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlX2luZm8gPSB1c2VfcGFjayhwLCB3X2N1cnMsICpjdXJwb3MsIE5VTEwpOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCisJLyogdXNlX3BhY2soKSBhc3N1cmVkIHVzIHdlIGhhdmUgW2Jhc2VfaW5mbywgYmFzZV9pbmZvICsgMjApCisJICogYXMgYSByYW5nZSB0aGF0IHdlIGNhbiBsb29rIGF0IHdpdGhvdXQgd2Fsa2luZyBvZmYgdGhlCisJICogZW5kIG9mIHRoZSBtYXBwZWQgd2luZG93LiAgSXRzIGFjdHVhbGx5IHRoZSBoYXNoIHNpemUKKwkgKiB0aGF0IGlzIGFzc3VyZWQuICBBbiBPRlNfREVMVEEgbG9uZ2VyIHRoYW4gdGhlIGhhc2ggc2l6ZQorCSAqIGlzIHN0dXBpZCwgYXMgdGhlbiBhIFJFRl9ERUxUQSB3b3VsZCBiZSBzbWFsbGVyIHRvIHN0b3JlLgorCSAqLworCWlmICh0eXBlID09IE9CSl9PRlNfREVMVEEpIHsKKwkJdW5zaWduZWQgdXNlZCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJhc2VfaW5mb1t1c2VkKytdOworCQliYXNlX29mZnNldCA9IGMgJiAxMjc7CisJCXdoaWxlIChjICYgMTI4KSB7CisJCQliYXNlX29mZnNldCArPSAxOworCQkJaWYgKCFiYXNlX29mZnNldCB8fCBNU0IoYmFzZV9vZmZzZXQsIDcpKQorCQkJCWRpZSgib2Zmc2V0IHZhbHVlIG92ZXJmbG93IGZvciBkZWx0YSBiYXNlIG9iamVjdCIpOworCQkJYyA9IGJhc2VfaW5mb1t1c2VkKytdOworCQkJYmFzZV9vZmZzZXQgPSAoYmFzZV9vZmZzZXQgPDwgNykgKyAoYyAmIDEyNyk7CisJCX0KKwkJYmFzZV9vZmZzZXQgPSBkZWx0YV9vYmpfb2Zmc2V0IC0gYmFzZV9vZmZzZXQ7CisJCWlmIChiYXNlX29mZnNldCA+PSBkZWx0YV9vYmpfb2Zmc2V0KQorCQkJZGllKCJkZWx0YSBiYXNlIG9mZnNldCBvdXQgb2YgYm91bmQiKTsKKwkJKmN1cnBvcyArPSB1c2VkOworCX0gZWxzZSBpZiAodHlwZSA9PSBPQkpfUkVGX0RFTFRBKSB7CisJCS8qIFRoZSBiYXNlIGVudHJ5IF9tdXN0XyBiZSBpbiB0aGUgc2FtZSBwYWNrICovCisJCWJhc2Vfb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShiYXNlX2luZm8sIHApOworCQlpZiAoIWJhc2Vfb2Zmc2V0KQorCQkJZGllKCJmYWlsZWQgdG8gZmluZCBkZWx0YS1wYWNrIGJhc2Ugb2JqZWN0ICVzIiwKKwkJCQlzaGExX3RvX2hleChiYXNlX2luZm8pKTsKKwkJKmN1cnBvcyArPSAyMDsKKwl9IGVsc2UKKwkJZGllKCJJIGFtIHRvdGFsbHkgc2NyZXdlZCIpOworCXJldHVybiBiYXNlX29mZnNldDsKK30KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBtdXR1YWxseSByZWN1cnNpdmUgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgcGFja2VkX29iamVjdF9pbmZvKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpzaXplcCk7CisKK3N0YXRpYyBpbnQgcGFja2VkX2RlbHRhX2luZm8oc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkgICAgIHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCSAgICAgb2ZmX3QgY3VycG9zLAorCQkJICAgICBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCQkgICAgIG9mZl90IG9ial9vZmZzZXQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCW9mZl90IGJhc2Vfb2Zmc2V0OworCisJYmFzZV9vZmZzZXQgPSBnZXRfZGVsdGFfYmFzZShwLCB3X2N1cnMsICZjdXJwb3MsIHR5cGUsIG9ial9vZmZzZXQpOworCXR5cGUgPSBwYWNrZWRfb2JqZWN0X2luZm8ocCwgYmFzZV9vZmZzZXQsIE5VTEwpOworCisJLyogV2UgY2hvb3NlIHRvIG9ubHkgZ2V0IHRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBhbmQKKwkgKiBpZ25vcmUgcG90ZW50aWFsbHkgY29ycnVwdCBwYWNrIGZpbGUgdGhhdCBleHBlY3RzIHRoZSBkZWx0YQorCSAqIGJhc2VkIG9uIGEgYmFzZSB3aXRoIGEgd3Jvbmcgc2l6ZS4gIFRoaXMgc2F2ZXMgdG9ucyBvZgorCSAqIGluZmxhdGUoKSBjYWxscy4KKwkgKi8KKwlpZiAoc2l6ZXApCisJCSpzaXplcCA9IGdldF9zaXplX2Zyb21fZGVsdGEocCwgd19jdXJzLCBjdXJwb3MpOworCisJcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX29iamVjdF9oZWFkZXIoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQkJCW9mZl90ICpjdXJwb3MsCisJCQkJdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBpbnQgbGVmdDsKKwl1bnNpZ25lZCBsb25nIHVzZWQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJLyogdXNlX3BhY2soKSBhc3N1cmVzIHVzIHdlIGhhdmUgW2Jhc2UsIGJhc2UgKyAyMCkgYXZhaWxhYmxlCisJICogYXMgYSByYW5nZSB0aGF0IHdlIGNhbiBsb29rIGF0IGF0LiAgKEl0cyBhY3R1YWxseSB0aGUgaGFzaAorCSAqIHNpemUgdGhhdCBpcyBhc3N1cmVkLikgIFdpdGggb3VyIG9iamVjdCBoZWFkZXIgZW5jb2RpbmcKKwkgKiB0aGUgbWF4aW11bSBkZWZsYXRlZCBvYmplY3Qgc2l6ZSBpcyAyXjEzNywgd2hpY2ggaXMganVzdAorCSAqIGluc2FuZSwgc28gd2Uga25vdyB3b24ndCBleGNlZWQgd2hhdCB3ZSBoYXZlIGJlZW4gZ2l2ZW4uCisJICovCisJYmFzZSA9IHVzZV9wYWNrKHAsIHdfY3VycywgKmN1cnBvcywgJmxlZnQpOworCXVzZWQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcl9nZW50bHkoYmFzZSwgbGVmdCwgJnR5cGUsIHNpemVwKTsKKwlpZiAoIXVzZWQpCisJCWRpZSgib2JqZWN0IG9mZnNldCBvdXRzaWRlIG9mIHBhY2sgZmlsZSIpOworCSpjdXJwb3MgKz0gdXNlZDsKKworCXJldHVybiB0eXBlOworfQorCitjb25zdCBjaGFyICpwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgICAgIG9mZl90IG9ial9vZmZzZXQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzdG9yZV9zaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGVsdGFfY2hhaW5fbGVuZ3RoLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJb2ZmX3QgY3VycG9zOworCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJdW5zaWduZWQgY2hhciAqbmV4dF9zaGExOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKworCSpkZWx0YV9jaGFpbl9sZW5ndGggPSAwOworCWN1cnBvcyA9IG9ial9vZmZzZXQ7CisJdHlwZSA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsICZ3X2N1cnMsICZjdXJwb3MsIHNpemUpOworCisJZm9yICg7OykgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJZGVmYXVsdDoKKwkJCWRpZSgicGFjayAlcyBjb250YWlucyB1bmtub3duIG9iamVjdCB0eXBlICVkIiwKKwkJCSAgICBwLT5wYWNrX25hbWUsIHR5cGUpOworCQljYXNlIE9CSl9DT01NSVQ6CisJCWNhc2UgT0JKX1RSRUU6CisJCWNhc2UgT0JKX0JMT0I6CisJCWNhc2UgT0JKX1RBRzoKKwkJCSpzdG9yZV9zaXplID0gMDsgLyogbm90eWV0ICovCisJCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCQkJcmV0dXJuIHR5cGVuYW1lKHR5cGUpOworCQljYXNlIE9CSl9PRlNfREVMVEE6CisJCQlvYmpfb2Zmc2V0ID0gZ2V0X2RlbHRhX2Jhc2UocCwgJndfY3VycywgJmN1cnBvcywgdHlwZSwgb2JqX29mZnNldCk7CisJCQlpZiAoKmRlbHRhX2NoYWluX2xlbmd0aCA9PSAwKSB7CisJCQkJLyogVE9ETzogZmluZCBiYXNlX3NoYTEgYXMgcG9pbnRlZCBieSBjdXJwb3MgKi8KKwkJCQloYXNoY2xyKGJhc2Vfc2hhMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPQkpfUkVGX0RFTFRBOgorCQkJbmV4dF9zaGExID0gdXNlX3BhY2socCwgJndfY3VycywgY3VycG9zLCBOVUxMKTsKKwkJCWlmICgqZGVsdGFfY2hhaW5fbGVuZ3RoID09IDApCisJCQkJaGFzaGNweShiYXNlX3NoYTEsIG5leHRfc2hhMSk7CisJCQlvYmpfb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShuZXh0X3NoYTEsIHApOworCQkJYnJlYWs7CisJCX0KKwkJKCpkZWx0YV9jaGFpbl9sZW5ndGgpKys7CisJCWN1cnBvcyA9IG9ial9vZmZzZXQ7CisJCXR5cGUgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcihwLCAmd19jdXJzLCAmY3VycG9zLCAmZHVtbXkpOworCX0KK30KKworc3RhdGljIGludCBwYWNrZWRfb2JqZWN0X2luZm8oc3RydWN0IHBhY2tlZF9naXQgKnAsIG9mZl90IG9ial9vZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCW9mZl90IGN1cnBvcyA9IG9ial9vZmZzZXQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJdHlwZSA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsICZ3X2N1cnMsICZjdXJwb3MsICZzaXplKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0JKX09GU19ERUxUQToKKwljYXNlIE9CSl9SRUZfREVMVEE6CisJCXR5cGUgPSBwYWNrZWRfZGVsdGFfaW5mbyhwLCAmd19jdXJzLCBjdXJwb3MsCisJCQkJCSB0eXBlLCBvYmpfb2Zmc2V0LCBzaXplcCk7CisJCWJyZWFrOworCWNhc2UgT0JKX0NPTU1JVDoKKwljYXNlIE9CSl9UUkVFOgorCWNhc2UgT0JKX0JMT0I6CisJY2FzZSBPQkpfVEFHOgorCQlpZiAoc2l6ZXApCisJCQkqc2l6ZXAgPSBzaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoInBhY2sgJXMgY29udGFpbnMgdW5rbm93biBvYmplY3QgdHlwZSAlZCIsCisJCSAgICBwLT5wYWNrX25hbWUsIHR5cGUpOworCX0KKwl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCXJldHVybiB0eXBlOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX2NvbXByZXNzZWRfZW50cnkoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJICAgIHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCQkgICAgb2ZmX3QgY3VycG9zLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHN0OworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIsICppbjsKKworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSArIDEpOworCWJ1ZmZlcltzaXplXSA9IDA7CisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWZmZXI7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlkbyB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBjdXJwb3MsICZzdHJlYW0uYXZhaWxfaW4pOworCQlzdHJlYW0ubmV4dF9pbiA9IGluOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQljdXJwb3MgKz0gc3RyZWFtLm5leHRfaW4gLSBpbjsKKwl9IHdoaWxlIChzdCA9PSBaX09LIHx8IHN0ID09IFpfQlVGX0VSUk9SKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCWlmICgoc3QgIT0gWl9TVFJFQU1fRU5EKSB8fCBzdHJlYW0udG90YWxfb3V0ICE9IHNpemUpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYnVmZmVyOworfQorCisjZGVmaW5lIE1BWF9ERUxUQV9DQUNIRSAoMjU2KQorCitzdGF0aWMgc2l6ZV90IGRlbHRhX2Jhc2VfY2FjaGVkOworCitzdGF0aWMgc3RydWN0IGRlbHRhX2Jhc2VfY2FjaGVfbHJ1X2xpc3QgeworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2xydV9saXN0ICpwcmV2OworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2xydV9saXN0ICpuZXh0OworfSBkZWx0YV9iYXNlX2NhY2hlX2xydSA9IHsgJmRlbHRhX2Jhc2VfY2FjaGVfbHJ1LCAmZGVsdGFfYmFzZV9jYWNoZV9scnUgfTsKKworc3RhdGljIHN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5IHsKKwlzdHJ1Y3QgZGVsdGFfYmFzZV9jYWNoZV9scnVfbGlzdCBscnU7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlvZmZfdCBiYXNlX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworfSBkZWx0YV9iYXNlX2NhY2hlW01BWF9ERUxUQV9DQUNIRV07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhY2tfZW50cnlfaGFzaChzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgb2ZmX3QgYmFzZV9vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJaGFzaCA9ICh1bnNpZ25lZCBsb25nKXAgKyAodW5zaWduZWQgbG9uZyliYXNlX29mZnNldDsKKwloYXNoICs9IChoYXNoID4+IDgpICsgKGhhc2ggPj4gMTYpOworCXJldHVybiBoYXNoICUgTUFYX0RFTFRBX0NBQ0hFOworfQorCitzdGF0aWMgdm9pZCAqY2FjaGVfb3JfdW5wYWNrX2VudHJ5KHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBvZmZfdCBiYXNlX29mZnNldCwKKwl1bnNpZ25lZCBsb25nICpiYXNlX3NpemUsIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIGludCBrZWVwX2NhY2hlKQoreworCXZvaWQgKnJldDsKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSBwYWNrX2VudHJ5X2hhc2gocCwgYmFzZV9vZmZzZXQpOworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICplbnQgPSBkZWx0YV9iYXNlX2NhY2hlICsgaGFzaDsKKworCXJldCA9IGVudC0+ZGF0YTsKKwlpZiAocmV0ICYmIGVudC0+cCA9PSBwICYmIGVudC0+YmFzZV9vZmZzZXQgPT0gYmFzZV9vZmZzZXQpCisJCWdvdG8gZm91bmRfY2FjaGVfZW50cnk7CisJcmV0dXJuIHVucGFja19lbnRyeShwLCBiYXNlX29mZnNldCwgdHlwZSwgYmFzZV9zaXplKTsKKworZm91bmRfY2FjaGVfZW50cnk6CisJaWYgKCFrZWVwX2NhY2hlKSB7CisJCWVudC0+ZGF0YSA9IE5VTEw7CisJCWVudC0+bHJ1Lm5leHQtPnByZXYgPSBlbnQtPmxydS5wcmV2OworCQllbnQtPmxydS5wcmV2LT5uZXh0ID0gZW50LT5scnUubmV4dDsKKwkJZGVsdGFfYmFzZV9jYWNoZWQgLT0gZW50LT5zaXplOworCX0KKwllbHNlIHsKKwkJcmV0ID0geG1hbGxvYyhlbnQtPnNpemUgKyAxKTsKKwkJbWVtY3B5KHJldCwgZW50LT5kYXRhLCBlbnQtPnNpemUpOworCQkoKGNoYXIgKilyZXQpW2VudC0+c2l6ZV0gPSAwOworCX0KKwkqdHlwZSA9IGVudC0+dHlwZTsKKwkqYmFzZV9zaXplID0gZW50LT5zaXplOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX2RlbHRhX2Jhc2VfY2FjaGUoc3RydWN0IGRlbHRhX2Jhc2VfY2FjaGVfZW50cnkgKmVudCkKK3sKKwlpZiAoZW50LT5kYXRhKSB7CisJCWZyZWUoZW50LT5kYXRhKTsKKwkJZW50LT5kYXRhID0gTlVMTDsKKwkJZW50LT5scnUubmV4dC0+cHJldiA9IGVudC0+bHJ1LnByZXY7CisJCWVudC0+bHJ1LnByZXYtPm5leHQgPSBlbnQtPmxydS5uZXh0OworCQlkZWx0YV9iYXNlX2NhY2hlZCAtPSBlbnQtPnNpemU7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZGVsdGFfYmFzZV9jYWNoZShzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgb2ZmX3QgYmFzZV9vZmZzZXQsCisJdm9pZCAqYmFzZSwgdW5zaWduZWQgbG9uZyBiYXNlX3NpemUsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSBwYWNrX2VudHJ5X2hhc2gocCwgYmFzZV9vZmZzZXQpOworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICplbnQgPSBkZWx0YV9iYXNlX2NhY2hlICsgaGFzaDsKKwlzdHJ1Y3QgZGVsdGFfYmFzZV9jYWNoZV9scnVfbGlzdCAqbHJ1OworCisJcmVsZWFzZV9kZWx0YV9iYXNlX2NhY2hlKGVudCk7CisJZGVsdGFfYmFzZV9jYWNoZWQgKz0gYmFzZV9zaXplOworCisJZm9yIChscnUgPSBkZWx0YV9iYXNlX2NhY2hlX2xydS5uZXh0OworCSAgICAgZGVsdGFfYmFzZV9jYWNoZWQgPiBkZWx0YV9iYXNlX2NhY2hlX2xpbWl0CisJICAgICAmJiBscnUgIT0gJmRlbHRhX2Jhc2VfY2FjaGVfbHJ1OworCSAgICAgbHJ1ID0gbHJ1LT5uZXh0KSB7CisJCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICpmID0gKHZvaWQgKilscnU7CisJCWlmIChmLT50eXBlID09IE9CSl9CTE9CKQorCQkJcmVsZWFzZV9kZWx0YV9iYXNlX2NhY2hlKGYpOworCX0KKwlmb3IgKGxydSA9IGRlbHRhX2Jhc2VfY2FjaGVfbHJ1Lm5leHQ7CisJICAgICBkZWx0YV9iYXNlX2NhY2hlZCA+IGRlbHRhX2Jhc2VfY2FjaGVfbGltaXQKKwkgICAgICYmIGxydSAhPSAmZGVsdGFfYmFzZV9jYWNoZV9scnU7CisJICAgICBscnUgPSBscnUtPm5leHQpIHsKKwkJc3RydWN0IGRlbHRhX2Jhc2VfY2FjaGVfZW50cnkgKmYgPSAodm9pZCAqKWxydTsKKwkJcmVsZWFzZV9kZWx0YV9iYXNlX2NhY2hlKGYpOworCX0KKworCWVudC0+cCA9IHA7CisJZW50LT5iYXNlX29mZnNldCA9IGJhc2Vfb2Zmc2V0OworCWVudC0+dHlwZSA9IHR5cGU7CisJZW50LT5kYXRhID0gYmFzZTsKKwllbnQtPnNpemUgPSBiYXNlX3NpemU7CisJZW50LT5scnUubmV4dCA9ICZkZWx0YV9iYXNlX2NhY2hlX2xydTsKKwllbnQtPmxydS5wcmV2ID0gZGVsdGFfYmFzZV9jYWNoZV9scnUucHJldjsKKwlkZWx0YV9iYXNlX2NhY2hlX2xydS5wcmV2LT5uZXh0ID0gJmVudC0+bHJ1OworCWRlbHRhX2Jhc2VfY2FjaGVfbHJ1LnByZXYgPSAmZW50LT5scnU7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZGVsdGFfZW50cnkoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQkJCW9mZl90IGN1cnBvcywKKwkJCQl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsCisJCQkJb2ZmX3Qgb2JqX29mZnNldCwKKwkJCQllbnVtIG9iamVjdF90eXBlICp0eXBlLAorCQkJCXVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXZvaWQgKmRlbHRhX2RhdGEsICpyZXN1bHQsICpiYXNlOworCXVuc2lnbmVkIGxvbmcgYmFzZV9zaXplOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCisJYmFzZV9vZmZzZXQgPSBnZXRfZGVsdGFfYmFzZShwLCB3X2N1cnMsICZjdXJwb3MsICp0eXBlLCBvYmpfb2Zmc2V0KTsKKwliYXNlID0gY2FjaGVfb3JfdW5wYWNrX2VudHJ5KHAsIGJhc2Vfb2Zmc2V0LCAmYmFzZV9zaXplLCB0eXBlLCAwKTsKKwlpZiAoIWJhc2UpCisJCWRpZSgiZmFpbGVkIHRvIHJlYWQgZGVsdGEgYmFzZSBvYmplY3QiCisJCSAgICAiIGF0ICUiUFJJdU1BWCIgZnJvbSAlcyIsCisJCSAgICAodWludG1heF90KWJhc2Vfb2Zmc2V0LCBwLT5wYWNrX25hbWUpOworCisJZGVsdGFfZGF0YSA9IHVucGFja19jb21wcmVzc2VkX2VudHJ5KHAsIHdfY3VycywgY3VycG9zLCBkZWx0YV9zaXplKTsKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlLCBiYXNlX3NpemUsCisJCQkgICAgIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUsCisJCQkgICAgIHNpemVwKTsKKwlpZiAoIXJlc3VsdCkKKwkJZGllKCJmYWlsZWQgdG8gYXBwbHkgZGVsdGEiKTsKKwlmcmVlKGRlbHRhX2RhdGEpOworCWFkZF9kZWx0YV9iYXNlX2NhY2hlKHAsIGJhc2Vfb2Zmc2V0LCBiYXNlLCBiYXNlX3NpemUsICp0eXBlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkICp1bnBhY2tfZW50cnkoc3RydWN0IHBhY2tlZF9naXQgKnAsIG9mZl90IG9ial9vZmZzZXQsCisJCSAgIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBwYWNrX3dpbmRvdyAqd19jdXJzID0gTlVMTDsKKwlvZmZfdCBjdXJwb3MgPSBvYmpfb2Zmc2V0OworCXZvaWQgKmRhdGE7CisKKwkqdHlwZSA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsICZ3X2N1cnMsICZjdXJwb3MsIHNpemVwKTsKKwlzd2l0Y2ggKCp0eXBlKSB7CisJY2FzZSBPQkpfT0ZTX0RFTFRBOgorCWNhc2UgT0JKX1JFRl9ERUxUQToKKwkJZGF0YSA9IHVucGFja19kZWx0YV9lbnRyeShwLCAmd19jdXJzLCBjdXJwb3MsICpzaXplcCwKKwkJCQkJICBvYmpfb2Zmc2V0LCB0eXBlLCBzaXplcCk7CisJCWJyZWFrOworCWNhc2UgT0JKX0NPTU1JVDoKKwljYXNlIE9CSl9UUkVFOgorCWNhc2UgT0JKX0JMT0I6CisJY2FzZSBPQkpfVEFHOgorCQlkYXRhID0gdW5wYWNrX2NvbXByZXNzZWRfZW50cnkocCwgJndfY3VycywgY3VycG9zLCAqc2l6ZXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoInVua25vd24gb2JqZWN0IHR5cGUgJWkgaW4gJXMiLCAqdHlwZSwgcC0+cGFja19uYW1lKTsKKwl9CisJdW51c2VfcGFjaygmd19jdXJzKTsKKwlyZXR1cm4gZGF0YTsKK30KKworY29uc3QgdW5zaWduZWQgY2hhciAqbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShjb25zdCBzdHJ1Y3QgcGFja2VkX2dpdCAqcCwKKwkJCQkJICAgIHVpbnQzMl90IG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSBwLT5pbmRleF9kYXRhOworCWlmIChuID49IHAtPm51bV9vYmplY3RzKQorCQlyZXR1cm4gTlVMTDsKKwlpbmRleCArPSA0ICogMjU2OworCWlmIChwLT5pbmRleF92ZXJzaW9uID09IDEpIHsKKwkJcmV0dXJuIGluZGV4ICsgMjQgKiBuICsgNDsKKwl9IGVsc2UgeworCQlpbmRleCArPSA4OworCQlyZXR1cm4gaW5kZXggKyAyMCAqIG47CisJfQorfQorCitzdGF0aWMgb2ZmX3QgbnRoX3BhY2tlZF9vYmplY3Rfb2Zmc2V0KGNvbnN0IHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCB1aW50MzJfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluZGV4ID0gcC0+aW5kZXhfZGF0YTsKKwlpbmRleCArPSA0ICogMjU2OworCWlmIChwLT5pbmRleF92ZXJzaW9uID09IDEpIHsKKwkJcmV0dXJuIG50b2hsKCooKHVpbnQzMl90ICopKGluZGV4ICsgMjQgKiBuKSkpOworCX0gZWxzZSB7CisJCXVpbnQzMl90IG9mZjsKKwkJaW5kZXggKz0gOCArIHAtPm51bV9vYmplY3RzICogKDIwICsgNCk7CisJCW9mZiA9IG50b2hsKCooKHVpbnQzMl90ICopKGluZGV4ICsgNCAqIG4pKSk7CisJCWlmICghKG9mZiAmIDB4ODAwMDAwMDApKQorCQkJcmV0dXJuIG9mZjsKKwkJaW5kZXggKz0gcC0+bnVtX29iamVjdHMgKiA0ICsgKG9mZiAmIDB4N2ZmZmZmZmYpICogODsKKwkJcmV0dXJuICgoKHVpbnQ2NF90KW50b2hsKCooKHVpbnQzMl90ICopKGluZGV4ICsgMCkpKSkgPDwgMzIpIHwKKwkJCQkgICBudG9obCgqKCh1aW50MzJfdCAqKShpbmRleCArIDQpKSk7CisJfQorfQorCitvZmZfdCBmaW5kX3BhY2tfZW50cnlfb25lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJICBzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwljb25zdCB1aW50MzJfdCAqbGV2ZWwxX29mcyA9IHAtPmluZGV4X2RhdGE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSBwLT5pbmRleF9kYXRhOworCXVuc2lnbmVkIGhpLCBsbzsKKworCWlmIChwLT5pbmRleF92ZXJzaW9uID4gMSkgeworCQlsZXZlbDFfb2ZzICs9IDI7CisJCWluZGV4ICs9IDg7CisJfQorCWluZGV4ICs9IDQgKiAyNTY7CisJaGkgPSBudG9obChsZXZlbDFfb2ZzWypzaGExXSk7CisJbG8gPSAoKCpzaGExID09IDB4MCkgPyAwIDogbnRvaGwobGV2ZWwxX29mc1sqc2hhMSAtIDFdKSk7CisKKwlkbyB7CisJCXVuc2lnbmVkIG1pID0gKGxvICsgaGkpIC8gMjsKKwkJdW5zaWduZWQgeCA9IChwLT5pbmRleF92ZXJzaW9uID4gMSkgPyAobWkgKiAyMCkgOiAobWkgKiAyNCArIDQpOworCQlpbnQgY21wID0gaGFzaGNtcChpbmRleCArIHgsIHNoYTEpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBudGhfcGFja2VkX29iamVjdF9vZmZzZXQocCwgbWkpOworCQlpZiAoY21wID4gMCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkrMTsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaGVzX3BhY2tfbmFtZShzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgY29uc3QgY2hhciAqaWcpCit7CisJY29uc3QgY2hhciAqbGFzdF9jLCAqYzsKKworCWlmICghc3RyY21wKHAtPnBhY2tfbmFtZSwgaWcpKQorCQlyZXR1cm4gMDsKKworCWZvciAoYyA9IHAtPnBhY2tfbmFtZSwgbGFzdF9jID0gYzsgKmM7KQorCQlpZiAoKmMgPT0gJy8nKQorCQkJbGFzdF9jID0gKytjOworCQllbHNlCisJCQkrK2M7CisJaWYgKCFzdHJjbXAobGFzdF9jLCBpZykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9wYWNrX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBwYWNrX2VudHJ5ICplLCBjb25zdCBjaGFyICoqaWdub3JlX3BhY2tlZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlvZmZfdCBvZmZzZXQ7CisKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChpZ25vcmVfcGFja2VkKSB7CisJCQljb25zdCBjaGFyICoqaWc7CisJCQlmb3IgKGlnID0gaWdub3JlX3BhY2tlZDsgKmlnOyBpZysrKQorCQkJCWlmICghbWF0Y2hlc19wYWNrX25hbWUocCwgKmlnKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoKmlnKQorCQkJCWNvbnRpbnVlOworCQl9CisJCW9mZnNldCA9IGZpbmRfcGFja19lbnRyeV9vbmUoc2hhMSwgcCk7CisJCWlmIChvZmZzZXQpIHsKKwkJCS8qCisJCQkgKiBXZSBhcmUgYWJvdXQgdG8gdGVsbCB0aGUgY2FsbGVyIHdoZXJlIHRoZXkgY2FuCisJCQkgKiBsb2NhdGUgdGhlIHJlcXVlc3RlZCBvYmplY3QuICBXZSBiZXR0ZXIgbWFrZQorCQkJICogc3VyZSB0aGUgcGFja2ZpbGUgaXMgc3RpbGwgaGVyZSBhbmQgY2FuIGJlCisJCQkgKiBhY2Nlc3NlZCBiZWZvcmUgc3VwcGx5aW5nIHRoYXQgYW5zd2VyLCBhcworCQkJICogaXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIHNpbmNlIHRoZSBpbmRleAorCQkJICogd2FzIGxvYWRlZCEKKwkJCSAqLworCQkJaWYgKHAtPnBhY2tfZmQgPT0gLTEgJiYgb3Blbl9wYWNrZWRfZ2l0KHApKSB7CisJCQkJZXJyb3IoInBhY2tmaWxlICVzIGNhbm5vdCBiZSBhY2Nlc3NlZCIsIHAtPnBhY2tfbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQllLT5vZmZzZXQgPSBvZmZzZXQ7CisJCQllLT5wID0gcDsKKwkJCWhhc2hjcHkoZS0+c2hhMSwgc2hhMSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhY2tlZF9naXQgKmZpbmRfc2hhMV9wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIAorCQkJCSAgc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCisJZm9yIChwID0gcGFja3M7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsIHApKQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyBpbnQgc2hhMV9sb29zZV9vYmplY3RfaW5mbyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgc2l6ZTsKKwl2b2lkICptYXA7CisJel9zdHJlYW0gc3RyZWFtOworCWNoYXIgaGRyWzMyXTsKKworCW1hcCA9IG1hcF9zaGExX2ZpbGUoc2hhMSwgJm1hcHNpemUpOworCWlmICghbWFwKQorCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBmaW5kICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmICh1bnBhY2tfc2hhMV9oZWFkZXIoJnN0cmVhbSwgbWFwLCBtYXBzaXplLCBoZHIsIHNpemVvZihoZHIpKSA8IDApCisJCXN0YXR1cyA9IGVycm9yKCJ1bmFibGUgdG8gdW5wYWNrICVzIGhlYWRlciIsCisJCQkgICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCWVsc2UgaWYgKChzdGF0dXMgPSBwYXJzZV9zaGExX2hlYWRlcihoZHIsICZzaXplKSkgPCAwKQorCQlzdGF0dXMgPSBlcnJvcigidW5hYmxlIHRvIHBhcnNlICVzIGhlYWRlciIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwllbHNlIGlmIChzaXplcCkKKwkJKnNpemVwID0gc2l6ZTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCW11bm1hcChtYXAsIG1hcHNpemUpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBzaGExX29iamVjdF9pbmZvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoIWZpbmRfcGFja19lbnRyeShzaGExLCAmZSwgTlVMTCkpIHsKKwkJcmVwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJaWYgKCFmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUsIE5VTEwpKQorCQkJcmV0dXJuIHNoYTFfbG9vc2Vfb2JqZWN0X2luZm8oc2hhMSwgc2l6ZXApOworCX0KKwlyZXR1cm4gcGFja2VkX29iamVjdF9pbmZvKGUucCwgZS5vZmZzZXQsIHNpemVwKTsKK30KKworc3RhdGljIHZvaWQgKnJlYWRfcGFja2VkX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgICAgIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJc3RydWN0IHBhY2tfZW50cnkgZTsKKworCWlmICghZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlLCBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gY2FjaGVfb3JfdW5wYWNrX2VudHJ5KGUucCwgZS5vZmZzZXQsIHNpemUsIHR5cGUsIDEpOworfQorCisvKgorICogVGhpcyBpcyBtZWFudCB0byBob2xkIGEgKnNtYWxsKiBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IHlvdSB3b3VsZAorICogd2FudCByZWFkX3NoYTFfZmlsZSgpIHRvIGJlIGFibGUgdG8gcmV0dXJuLCBidXQgeWV0IHlvdSBkbyBub3Qgd2FudAorICogdG8gd3JpdGUgdGhlbSBpbnRvIHRoZSBvYmplY3Qgc3RvcmUgKGUuZy4gYSBicm93c2Utb25seQorICogYXBwbGljYXRpb24pLgorICovCitzdGF0aWMgc3RydWN0IGNhY2hlZF9vYmplY3QgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9ICpjYWNoZWRfb2JqZWN0czsKK3N0YXRpYyBpbnQgY2FjaGVkX29iamVjdF9uciwgY2FjaGVkX29iamVjdF9hbGxvYzsKKworc3RhdGljIHN0cnVjdCBjYWNoZWRfb2JqZWN0ICpmaW5kX2NhY2hlZF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FjaGVkX29iamVjdCAqY28gPSBjYWNoZWRfb2JqZWN0czsKKworCWZvciAoaSA9IDA7IGkgPCBjYWNoZWRfb2JqZWN0X25yOyBpKyssIGNvKyspIHsKKwkJaWYgKCFoYXNoY21wKGNvLT5zaGExLCBzaGExKSkKKwkJCXJldHVybiBjbzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBwcmV0ZW5kX3NoYTFfZmlsZSh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNhY2hlZF9vYmplY3QgKmNvOworCisJaGFzaF9zaGExX2ZpbGUoYnVmLCBsZW4sIHR5cGVuYW1lKHR5cGUpLCBzaGExKTsKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSB8fCBmaW5kX2NhY2hlZF9vYmplY3Qoc2hhMSkpCisJCXJldHVybiAwOworCWlmIChjYWNoZWRfb2JqZWN0X2FsbG9jIDw9IGNhY2hlZF9vYmplY3RfbnIpIHsKKwkJY2FjaGVkX29iamVjdF9hbGxvYyA9IGFsbG9jX25yKGNhY2hlZF9vYmplY3RfYWxsb2MpOworCQljYWNoZWRfb2JqZWN0cyA9IHhyZWFsbG9jKGNhY2hlZF9vYmplY3RzLAorCQkJCQkgIHNpemVvZigqY2FjaGVkX29iamVjdHMpICoKKwkJCQkJICBjYWNoZWRfb2JqZWN0X2FsbG9jKTsKKwl9CisJY28gPSAmY2FjaGVkX29iamVjdHNbY2FjaGVkX29iamVjdF9ucisrXTsKKwljby0+c2l6ZSA9IGxlbjsKKwljby0+dHlwZSA9IHR5cGU7CisJY28tPmJ1ZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkoY28tPmJ1ZiwgYnVmLCBsZW4pOworCWhhc2hjcHkoY28tPnNoYTEsIHNoYTEpOworCXJldHVybiAwOworfQorCit2b2lkICpyZWFkX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBlbnVtIG9iamVjdF90eXBlICp0eXBlLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBtYXBzaXplOworCXZvaWQgKm1hcCwgKmJ1ZjsKKwlzdHJ1Y3QgY2FjaGVkX29iamVjdCAqY287CisKKwljbyA9IGZpbmRfY2FjaGVkX29iamVjdChzaGExKTsKKwlpZiAoY28pIHsKKwkJYnVmID0geG1hbGxvYyhjby0+c2l6ZSArIDEpOworCQltZW1jcHkoYnVmLCBjby0+YnVmLCBjby0+c2l6ZSk7CisJCSgoY2hhciopYnVmKVtjby0+c2l6ZV0gPSAwOworCQkqdHlwZSA9IGNvLT50eXBlOworCQkqc2l6ZSA9IGNvLT5zaXplOworCQlyZXR1cm4gYnVmOworCX0KKworCWJ1ZiA9IHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgdHlwZSwgc2l6ZSk7CisJaWYgKGJ1ZikKKwkJcmV0dXJuIGJ1ZjsKKwltYXAgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZtYXBzaXplKTsKKwlpZiAobWFwKSB7CisJCWJ1ZiA9IHVucGFja19zaGExX2ZpbGUobWFwLCBtYXBzaXplLCB0eXBlLCBzaXplLCBzaGExKTsKKwkJbXVubWFwKG1hcCwgbWFwc2l6ZSk7CisJCXJldHVybiBidWY7CisJfQorCXJlcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJcmV0dXJuIHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgdHlwZSwgc2l6ZSk7Cit9CisKK3ZvaWQgKnJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJIGNvbnN0IGNoYXIgKnJlcXVpcmVkX3R5cGVfbmFtZSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkgdW5zaWduZWQgY2hhciAqYWN0dWFsX3NoYTFfcmV0dXJuKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZSwgcmVxdWlyZWRfdHlwZTsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBpc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGFjdHVhbF9zaGExWzIwXTsKKworCXJlcXVpcmVkX3R5cGUgPSB0eXBlX2Zyb21fc3RyaW5nKHJlcXVpcmVkX3R5cGVfbmFtZSk7CisJaGFzaGNweShhY3R1YWxfc2hhMSwgc2hhMSk7CisJd2hpbGUgKDEpIHsKKwkJaW50IHJlZl9sZW5ndGggPSAtMTsKKwkJY29uc3QgY2hhciAqcmVmX3R5cGUgPSBOVUxMOworCisJCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGFjdHVhbF9zaGExLCAmdHlwZSwgJmlzaXplKTsKKwkJaWYgKCFidWZmZXIpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHR5cGUgPT0gcmVxdWlyZWRfdHlwZSkgeworCQkJKnNpemUgPSBpc2l6ZTsKKwkJCWlmIChhY3R1YWxfc2hhMV9yZXR1cm4pCisJCQkJaGFzaGNweShhY3R1YWxfc2hhMV9yZXR1cm4sIGFjdHVhbF9zaGExKTsKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwkJLyogSGFuZGxlIHJlZmVyZW5jZXMgKi8KKwkJZWxzZSBpZiAodHlwZSA9PSBPQkpfQ09NTUlUKQorCQkJcmVmX3R5cGUgPSAidHJlZSAiOworCQllbHNlIGlmICh0eXBlID09IE9CSl9UQUcpCisJCQlyZWZfdHlwZSA9ICJvYmplY3QgIjsKKwkJZWxzZSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZWZfbGVuZ3RoID0gc3RybGVuKHJlZl90eXBlKTsKKworCQlpZiAobWVtY21wKGJ1ZmZlciwgcmVmX3R5cGUsIHJlZl9sZW5ndGgpIHx8CisJCSAgICBnZXRfc2hhMV9oZXgoKGNoYXIgKikgYnVmZmVyICsgcmVmX2xlbmd0aCwgYWN0dWFsX3NoYTEpKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmcmVlKGJ1ZmZlcik7CisJCS8qIE5vdyB3ZSBoYXZlIHRoZSBJRCBvZiB0aGUgcmVmZXJyZWQtdG8gb2JqZWN0IGluCisJCSAqIGFjdHVhbF9zaGExLiAgQ2hlY2sgYWdhaW4uICovCisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqc2hhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhkciwgaW50ICpoZHJsZW4pCit7CisJU0hBX0NUWCBjOworCisJLyogR2VuZXJhdGUgdGhlIGhlYWRlciAqLworCSpoZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikrMTsKKworCS8qIFNoYTEuLiAqLworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhkciwgKmhkcmxlbik7CisJU0hBMV9VcGRhdGUoJmMsIGJ1ZiwgbGVuKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjKTsKK30KKworLyoKKyAqIExpbmsgdGhlIHRlbXBmaWxlIHRvIHRoZSBmaW5hbCBwbGFjZSwgcG9zc2libHkgY3JlYXRpbmcgdGhlCisgKiBsYXN0IGRpcmVjdG9yeSBsZXZlbCBhcyB5b3UgZG8gc28uCisgKgorICogUmV0dXJucyB0aGUgZXJybm8gb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGxpbmtfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisJY2hhciAqZGlyOworCisJaWYgKCFsaW5rKHRtcGZpbGUsIGZpbGVuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRyeSB0byBta2RpciB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCBpZiB0aGF0IGZhaWxlZC4KKwkgKgorCSAqIFJlLXRyeSB0aGUgImxpbmsoKSIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBta2RpcgorCSAqIHN1Y2NlZWRzLCBzaW5jZSBhIHJhY2UgbWlnaHQgbWVhbiB0aGF0IHNvbWVib2R5CisJICogZWxzZSBzdWNjZWVkZWQuCisJICovCisJcmV0ID0gZXJybm87CisJZGlyID0gc3RycmNocihmaWxlbmFtZSwgJy8nKTsKKwlpZiAoZGlyKSB7CisJCSpkaXIgPSAwOworCQlpZiAoIW1rZGlyKGZpbGVuYW1lLCAwNzc3KSAmJiBhZGp1c3Rfc2hhcmVkX3Blcm0oZmlsZW5hbWUpKSB7CisJCQkqZGlyID0gJy8nOworCQkJcmV0dXJuIC0yOworCQl9CisJCSpkaXIgPSAnLyc7CisJCWlmICghbGluayh0bXBmaWxlLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0ID0gZXJybm87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNb3ZlIHRoZSBqdXN0IHdyaXR0ZW4gb2JqZWN0IGludG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UKKyAqLworaW50IG1vdmVfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQgPSBsaW5rX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7CisKKwkvKgorCSAqIENvZGEgaGFjayAtIGNvZGEgZG9lc24ndCBsaWtlIGNyb3NzLWRpcmVjdG9yeSBsaW5rcywKKwkgKiBzbyB3ZSBmYWxsIGJhY2sgdG8gYSByZW5hbWUsIHdoaWNoIHdpbGwgbWVhbiB0aGF0IGl0CisJICogd29uJ3QgYmUgYWJsZSB0byBjaGVjayBjb2xsaXNpb25zLCBidXQgdGhhdCdzIG5vdCBhCisJICogYmlnIGRlYWwuCisJICoKKwkgKiBUaGUgc2FtZSBob2xkcyBmb3IgRkFUIGZvcm1hdHRlZCBtZWRpYS4KKwkgKgorCSAqIFdoZW4gdGhpcyBzdWNjZWVkcywgd2UganVzdCByZXR1cm4gMC4gV2UgaGF2ZSBub3RoaW5nCisJICogbGVmdCB0byB1bmxpbmsuCisJICovCisJaWYgKHJldCAmJiByZXQgIT0gRUVYSVNUKSB7CisJCWlmICghcmVuYW1lKHRtcGZpbGUsIGZpbGVuYW1lKSkKKwkJCXJldHVybiAwOworCQlyZXQgPSBlcnJubzsKKwl9CisJdW5saW5rKHRtcGZpbGUpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCAhPSBFRVhJU1QpIHsKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZW5hbWUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IocmV0KSk7CisJCX0KKwkJLyogRklYTUUhISEgQ29sbGlzaW9uIGNoZWNrIGhlcmUgPyAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcihpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgYnVmLCBsZW4pIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJmaWxlIHdyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2JpbmFyeV9oZWFkZXIodW5zaWduZWQgY2hhciAqaGRyLCBlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBoZHJfbGVuOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWMgPSAodHlwZSA8PCA0KSB8IChsZW4gJiAxNSk7CisJbGVuID4+PSA0OworCWhkcl9sZW4gPSAxOworCXdoaWxlIChsZW4pIHsKKwkJKmhkcisrID0gYyB8IDB4ODA7CisJCWhkcl9sZW4rKzsKKwkJYyA9IChsZW4gJiAweDdmKTsKKwkJbGVuID4+PSA3OworCX0KKwkqaGRyID0gYzsKKwlyZXR1cm4gaGRyX2xlbjsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfb2JqZWN0X2hlYWRlcih6X3N0cmVhbSAqc3RyZWFtLCBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgb2JqX3R5cGUsIGhkcmxlbjsKKworCWlmICh1c2VfbGVnYWN5X2hlYWRlcnMpIHsKKwkJd2hpbGUgKGRlZmxhdGUoc3RyZWFtLCAwKSA9PSBaX09LKQorCQkJLyogbm90aGluZyAqLzsKKwkJcmV0dXJuOworCX0KKwlvYmpfdHlwZSA9IHR5cGVfZnJvbV9zdHJpbmcodHlwZSk7CisJaGRybGVuID0gd3JpdGVfYmluYXJ5X2hlYWRlcihzdHJlYW0tPm5leHRfb3V0LCBvYmpfdHlwZSwgbGVuKTsKKwlzdHJlYW0tPnRvdGFsX291dCA9IGhkcmxlbjsKKwlzdHJlYW0tPm5leHRfb3V0ICs9IGhkcmxlbjsKKwlzdHJlYW0tPmF2YWlsX291dCAtPSBoZHJsZW47Cit9CisKK2ludCBoYXNoX3NoYTFfZmlsZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBjb25zdCBjaGFyICp0eXBlLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciBoZHJbMzJdOworCWludCBoZHJsZW47CisJd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUoYnVmLCBsZW4sIHR5cGUsIHNoYTEsIGhkciwgJmhkcmxlbik7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3cml0ZV9zaGExX2ZpbGUodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqcmV0dXJuc2hhMSkKK3sKKwlpbnQgc2l6ZSwgcmV0OworCXVuc2lnbmVkIGNoYXIgKmNvbXByZXNzZWQ7CisJel9zdHJlYW0gc3RyZWFtOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqZmlsZW5hbWU7CisJc3RhdGljIGNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJY2hhciBoZHJbMzJdOworCWludCBmZCwgaGRybGVuOworCisJLyogTm9ybWFsbHkgaWYgd2UgaGF2ZSBpdCBpbiB0aGUgcGFjayB0aGVuIHdlIGRvIG5vdCBib3RoZXIgd3JpdGluZworCSAqIGl0IG91dCBpbnRvIC5naXQvb2JqZWN0cy8/Py8/ezM4fSBmaWxlLgorCSAqLworCXdyaXRlX3NoYTFfZmlsZV9wcmVwYXJlKGJ1ZiwgbGVuLCB0eXBlLCBzaGExLCBoZHIsICZoZHJsZW4pOworCWZpbGVuYW1lID0gc2hhMV9maWxlX25hbWUoc2hhMSk7CisJaWYgKHJldHVybnNoYTEpCisJCWhhc2hjcHkocmV0dXJuc2hhMSwgc2hhMSk7CisJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCisJCXJldHVybiAwOworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCS8qCisJCSAqIEZJWE1FISEhIFdlIG1pZ2h0IGRvIGNvbGxpc2lvbiBjaGVja2luZyBoZXJlLCBidXQgd2UnZAorCQkgKiBuZWVkIHRvIHVuY29tcHJlc3MgdGhlIG9sZCBmaWxlIGFuZCBjaGVjayBpdC4gTGF0ZXIuCisJCSAqLworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJcmV0dXJuIGVycm9yKCJzaGExIGZpbGUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksICIlcy90bXBfb2JqX1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCisJZmQgPSBta3N0ZW1wKHRtcGZpbGUpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQRVJNKQorCQkJcmV0dXJuIGVycm9yKCJpbnN1ZmZpY2llbnQgcGVybWlzc2lvbiBmb3IgYWRkaW5nIGFuIG9iamVjdCB0byByZXBvc2l0b3J5IGRhdGFiYXNlICVzXG4iLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKwkJZWxzZQorCQkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBzaGExIGZpbGVuYW1lICVzOiAlc1xuIiwgdG1wZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwkvKiBTZXQgaXQgdXAgKi8KKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwpOworCXNpemUgPSA4ICsgZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIGxlbitoZHJsZW4pOworCWNvbXByZXNzZWQgPSB4bWFsbG9jKHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9vdXQgPSBjb21wcmVzc2VkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworCisJLyogRmlyc3QgaGVhZGVyLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyICopaGRyOworCXN0cmVhbS5hdmFpbF9pbiA9IGhkcmxlbjsKKwlzZXR1cF9vYmplY3RfaGVhZGVyKCZzdHJlYW0sIHR5cGUsIGxlbik7CisKKwkvKiBUaGVuIHRoZSBkYXRhIGl0c2VsZi4uICovCisJc3RyZWFtLm5leHRfaW4gPSBidWY7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCXJldCA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCWlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKQorCQlkaWUoInVuYWJsZSB0byBkZWZsYXRlIG5ldyBvYmplY3QgJXMgKCVkKSIsIHNoYTFfdG9faGV4KHNoYTEpLCByZXQpOworCisJcmV0ID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAocmV0ICE9IFpfT0spCisJCWRpZSgiZGVmbGF0ZUVuZCBvbiBvYmplY3QgJXMgZmFpbGVkICglZCkiLCBzaGExX3RvX2hleChzaGExKSwgcmV0KTsKKworCXNpemUgPSBzdHJlYW0udG90YWxfb3V0OworCisJaWYgKHdyaXRlX2J1ZmZlcihmZCwgY29tcHJlc3NlZCwgc2l6ZSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGUiKTsKKwlmY2htb2QoZmQsIDA0NDQpOworCWlmIChjbG9zZShmZCkpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZSIpOworCWZyZWUoY29tcHJlc3NlZCk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCisvKgorICogV2UgbmVlZCB0byB1bnBhY2sgYW5kIHJlY29tcHJlc3MgdGhlIG9iamVjdCBmb3Igd3JpdGluZworICogaXQgb3V0IHRvIGEgZGlmZmVyZW50IGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkICpyZXBhY2tfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgKm9ianNpemUpCit7CisJc2l6ZV90IHNpemU7CisJel9zdHJlYW0gc3RyZWFtOworCXVuc2lnbmVkIGNoYXIgKnVucGFja2VkOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyIGhkclszMl07CisJaW50IGhkcmxlbjsKKwl2b2lkICpidWY7CisKKwkvKiBuZWVkIHRvIHVucGFjayBhbmQgcmVjb21wcmVzcyBpdCBieSBpdHNlbGYgKi8KKwl1bnBhY2tlZCA9IHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgJnR5cGUsICZsZW4pOworCWlmICghdW5wYWNrZWQpCisJCWVycm9yKCJjYW5ub3QgcmVhZCBzaGExX2ZpbGUgZm9yICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJaGRybGVuID0gc3ByaW50ZihoZHIsICIlcyAlbHUiLCB0eXBlbmFtZSh0eXBlKSwgbGVuKSArIDE7CisKKwkvKiBTZXQgaXQgdXAgKi8KKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwpOworCXNpemUgPSBkZWZsYXRlQm91bmQoJnN0cmVhbSwgbGVuICsgaGRybGVuKTsKKwlidWYgPSB4bWFsbG9jKHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwkvKiBGaXJzdCBoZWFkZXIuLiAqLworCXN0cmVhbS5uZXh0X2luID0gKHZvaWQgKiloZHI7CisJc3RyZWFtLmF2YWlsX2luID0gaGRybGVuOworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIDApID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisKKwkvKiBUaGVuIHRoZSBkYXRhIGl0c2VsZi4uICovCisJc3RyZWFtLm5leHRfaW4gPSB1bnBhY2tlZDsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlmcmVlKHVucGFja2VkKTsKKworCSpvYmpzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgd3JpdGVfc2hhMV90b19mZChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIG9ianNpemU7CisJdm9pZCAqYnVmID0gbWFwX3NoYTFfZmlsZShzaGExLCAmb2Jqc2l6ZSk7CisKKwlpZiAoYnVmKSB7CisJCXJldHZhbCA9IHdyaXRlX2J1ZmZlcihmZCwgYnVmLCBvYmpzaXplKTsKKwkJbXVubWFwKGJ1Ziwgb2Jqc2l6ZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJYnVmID0gcmVwYWNrX29iamVjdChzaGExLCAmb2Jqc2l6ZSk7CisJcmV0dmFsID0gd3JpdGVfYnVmZmVyKGZkLCBidWYsIG9ianNpemUpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgd3JpdGVfc2hhMV9mcm9tX2ZkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY2hhciAqYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCAqYnVmcG9zbikKK3sKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBsb2NhbDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciByZWFsX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgZGlzY2FyZFs0MDk2XTsKKwlpbnQgcmV0OworCVNIQV9DVFggYzsKKworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzL3RtcF9vYmpfWFhYWFhYIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisKKwlsb2NhbCA9IG1rc3RlbXAodG1wZmlsZSk7CisJaWYgKGxvY2FsIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRVBFUk0pCisJCQlyZXR1cm4gZXJyb3IoImluc3VmZmljaWVudCBwZXJtaXNzaW9uIGZvciBhZGRpbmcgYW4gb2JqZWN0IHRvIHJlcG9zaXRvcnkgZGF0YWJhc2UgJXNcbiIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCQllbHNlCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IHNoYTEgZmlsZW5hbWUgJXM6ICVzXG4iLCB0bXBmaWxlLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCVNIQTFfSW5pdCgmYyk7CisKKwlkbyB7CisJCXNzaXplX3Qgc2l6ZTsKKwkJaWYgKCpidWZwb3NuKSB7CisJCQlzdHJlYW0uYXZhaWxfaW4gPSAqYnVmcG9zbjsKKwkJCXN0cmVhbS5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyOworCQkJZG8geworCQkJCXN0cmVhbS5uZXh0X291dCA9IGRpc2NhcmQ7CisJCQkJc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihkaXNjYXJkKTsKKwkJCQlyZXQgPSBpbmZsYXRlKCZzdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCQkJU0hBMV9VcGRhdGUoJmMsIGRpc2NhcmQsIHNpemVvZihkaXNjYXJkKSAtCisJCQkJCSAgICBzdHJlYW0uYXZhaWxfb3V0KTsKKwkJCX0gd2hpbGUgKHN0cmVhbS5hdmFpbF9pbiAmJiByZXQgPT0gWl9PSyk7CisJCQlpZiAod3JpdGVfYnVmZmVyKGxvY2FsLCBidWZmZXIsICpidWZwb3NuIC0gc3RyZWFtLmF2YWlsX2luKSA8IDApCisJCQkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc2hhMSBmaWxlIik7CisJCQltZW1tb3ZlKGJ1ZmZlciwgYnVmZmVyICsgKmJ1ZnBvc24gLSBzdHJlYW0uYXZhaWxfaW4sCisJCQkJc3RyZWFtLmF2YWlsX2luKTsKKwkJCSpidWZwb3NuID0gc3RyZWFtLmF2YWlsX2luOworCQkJaWYgKHJldCAhPSBaX09LKQorCQkJCWJyZWFrOworCQl9CisJCXNpemUgPSB4cmVhZChmZCwgYnVmZmVyICsgKmJ1ZnBvc24sIGJ1ZnNpemUgLSAqYnVmcG9zbik7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCWNsb3NlKGxvY2FsKTsKKwkJCXVubGluayh0bXBmaWxlKTsKKwkJCWlmICghc2l6ZSkKKwkJCQlyZXR1cm4gZXJyb3IoIkNvbm5lY3Rpb24gY2xvc2VkPyIpOworCQkJcGVycm9yKCJSZWFkaW5nIGZyb20gY29ubmVjdGlvbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpidWZwb3NuICs9IHNpemU7CisJfSB3aGlsZSAoMSk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKworCWZjaG1vZChsb2NhbCwgMDQ0NCk7CisJaWYgKGNsb3NlKGxvY2FsKSAhPSAwKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGUiKTsKKwlTSEExX0ZpbmFsKHJlYWxfc2hhMSwgJmMpOworCWlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCXVubGluayh0bXBmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJGaWxlICVzIGNvcnJ1cHRlZCIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJaWYgKGhhc2hjbXAoc2hhMSwgcmVhbF9zaGExKSkgeworCQl1bmxpbmsodG1wZmlsZSk7CisJCXJldHVybiBlcnJvcigiRmlsZSAlcyBoYXMgYmFkIGhhc2giLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCisJcmV0dXJuIG1vdmVfdGVtcF90b19maWxlKHRtcGZpbGUsIHNoYTFfZmlsZV9uYW1lKHNoYTEpKTsKK30KKworaW50IGhhc19wYWNrX2luZGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaWYgKHN0YXQoc2hhMV9wYWNrX2luZGV4X25hbWUoc2hhMSksICZzdCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgaGFzX3BhY2tfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdGF0IHN0OworCWlmIChzdGF0KHNoYTFfcGFja19uYW1lKHNoYTEpLCAmc3QpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IGhhc19zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqKmlnbm9yZV9wYWNrZWQpCit7CisJc3RydWN0IHBhY2tfZW50cnkgZTsKKwlyZXR1cm4gZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlLCBpZ25vcmVfcGFja2VkKTsKK30KKworaW50IGhhc19zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCisJaWYgKGZpbmRfcGFja19lbnRyeShzaGExLCAmZSwgTlVMTCkpCisJCXJldHVybiAxOworCXJldHVybiBmaW5kX3NoYTFfZmlsZShzaGExLCAmc3QpID8gMSA6IDA7Cit9CisKKy8qCisgKiByZWFkcyBmcm9tIGZkIGFzIGxvbmcgYXMgcG9zc2libGUgaW50byBhIHN1cHBsaWVkIGJ1ZmZlciBvZiBzaXplIGJ5dGVzLgorICogSWYgbmVjZXNzYXJ5IHRoZSBidWZmZXIncyBzaXplIGlzIGluY3JlYXNlZCB1c2luZyByZWFsbG9jKCkKKyAqCisgKiByZXR1cm5zIDAgaWYgYW55dGhpbmcgd2VudCBmaW5lIGFuZCAtMSBvdGhlcndpc2UKKyAqCisgKiBOT1RFOiBib3RoIGJ1ZiBhbmQgc2l6ZSBtYXkgY2hhbmdlLCBidXQgZXZlbiB3aGVuIC0xIGlzIHJldHVybmVkCisgKiB5b3Ugc3RpbGwgaGF2ZSB0byBmcmVlKCkgaXQgeW91cnNlbGYuCisgKi8KK2ludCByZWFkX3BpcGUoaW50IGZkLCBjaGFyKiogcmV0dXJuX2J1ZiwgdW5zaWduZWQgbG9uZyogcmV0dXJuX3NpemUpCit7CisJY2hhciogYnVmID0gKnJldHVybl9idWY7CisJdW5zaWduZWQgbG9uZyBzaXplID0gKnJldHVybl9zaXplOworCXNzaXplX3QgaXJldDsKKwl1bnNpZ25lZCBsb25nIG9mZiA9IDA7CisKKwlkbyB7CisJCWlyZXQgPSB4cmVhZChmZCwgYnVmICsgb2ZmLCBzaXplIC0gb2ZmKTsKKwkJaWYgKGlyZXQgPiAwKSB7CisJCQlvZmYgKz0gaXJldDsKKwkJCWlmIChvZmYgPT0gc2l6ZSkgeworCQkJCXNpemUgKj0gMjsKKwkJCQlidWYgPSB4cmVhbGxvYyhidWYsIHNpemUpOworCQkJfQorCQl9CisJfSB3aGlsZSAoaXJldCA+IDApOworCisJKnJldHVybl9idWYgPSBidWY7CisJKnJldHVybl9zaXplID0gb2ZmOworCisJaWYgKGlyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbmRleF9waXBlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHdyaXRlX29iamVjdCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSA0MDk2OworCWNoYXIgKmJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisJaW50IHJldDsKKworCWlmIChyZWFkX3BpcGUoZmQsICZidWYsICZzaXplKSkgeworCQlmcmVlKGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXR5cGUpCisJCXR5cGUgPSBibG9iX3R5cGU7CisJaWYgKHdyaXRlX29iamVjdCkKKwkJcmV0ID0gd3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgdHlwZSwgc2hhMSk7CisJZWxzZQorCQlyZXQgPSBoYXNoX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGUsIHNoYTEpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaW5kZXhfZmQodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QsCisJICAgICBlbnVtIG9iamVjdF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc2l6ZV90IHNpemUgPSB4c2l6ZV90KHN0LT5zdF9zaXplKTsKKwl2b2lkICpidWYgPSBOVUxMOworCWludCByZXQsIHJlX2FsbG9jYXRlZCA9IDA7CisKKwlpZiAoc2l6ZSkKKwkJYnVmID0geG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKworCWlmICghdHlwZSkKKwkJdHlwZSA9IE9CSl9CTE9COworCisJLyoKKwkgKiBDb252ZXJ0IGJsb2JzIHRvIGdpdCBpbnRlcm5hbCBmb3JtYXQKKwkgKi8KKwlpZiAoKHR5cGUgPT0gT0JKX0JMT0IpICYmIFNfSVNSRUcoc3QtPnN0X21vZGUpKSB7CisJCXVuc2lnbmVkIGxvbmcgbnNpemUgPSBzaXplOworCQljaGFyICpuYnVmID0gY29udmVydF90b19naXQocGF0aCwgYnVmLCAmbnNpemUpOworCQlpZiAobmJ1ZikgeworCQkJbXVubWFwKGJ1Ziwgc2l6ZSk7CisJCQlzaXplID0gbnNpemU7CisJCQlidWYgPSBuYnVmOworCQkJcmVfYWxsb2NhdGVkID0gMTsKKwkJfQorCX0KKworCWlmICh3cml0ZV9vYmplY3QpCisJCXJldCA9IHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGVuYW1lKHR5cGUpLCBzaGExKTsKKwllbHNlCisJCXJldCA9IGhhc2hfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgdHlwZW5hbWUodHlwZSksIHNoYTEpOworCWlmIChyZV9hbGxvY2F0ZWQpIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoc2l6ZSkKKwkJbXVubWFwKGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGluZGV4X3BhdGgodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0KQoreworCWludCBmZDsKKwljaGFyICp0YXJnZXQ7CisJc2l6ZV90IGxlbjsKKworCXN3aXRjaCAoc3QtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIm9wZW4oXCIlc1wiKTogJXMiLCBwYXRoLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGluZGV4X2ZkKHNoYTEsIGZkLCBzdCwgd3JpdGVfb2JqZWN0LCBPQkpfQkxPQiwgcGF0aCkgPCAwKQorCQkJcmV0dXJuIGVycm9yKCIlczogZmFpbGVkIHRvIGluc2VydCBpbnRvIGRhdGFiYXNlIiwKKwkJCQkgICAgIHBhdGgpOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWxlbiA9IHhzaXplX3Qoc3QtPnN0X3NpemUpOworCQl0YXJnZXQgPSB4bWFsbG9jKGxlbiArIDEpOworCQlpZiAocmVhZGxpbmsocGF0aCwgdGFyZ2V0LCBsZW4gKyAxKSAhPSBzdC0+c3Rfc2l6ZSkgeworCQkJY2hhciAqZXJyc3RyID0gc3RyZXJyb3IoZXJybm8pOworCQkJZnJlZSh0YXJnZXQpOworCQkJcmV0dXJuIGVycm9yKCJyZWFkbGluayhcIiVzXCIpOiAlcyIsIHBhdGgsCisJCQkgICAgICAgICAgICAgZXJyc3RyKTsKKwkJfQorCQlpZiAoIXdyaXRlX29iamVjdCkKKwkJCWhhc2hfc2hhMV9maWxlKHRhcmdldCwgbGVuLCBibG9iX3R5cGUsIHNoYTEpOworCQllbHNlIGlmICh3cml0ZV9zaGExX2ZpbGUodGFyZ2V0LCBsZW4sIGJsb2JfdHlwZSwgc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIiVzOiBmYWlsZWQgdG8gaW5zZXJ0IGludG8gZGF0YWJhc2UiLAorCQkJCSAgICAgcGF0aCk7CisJCWZyZWUodGFyZ2V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgorCQlyZXR1cm4gcmVzb2x2ZV9naXRsaW5rX3JlZihwYXRoLCAiSEVBRCIsIHNoYTEpOworCWRlZmF1bHQ6CisJCXJldHVybiBlcnJvcigiJXM6IHVuc3VwcG9ydGVkIGZpbGUgdHlwZSIsIHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlYWRfcGFja19oZWFkZXIoaW50IGZkLCBzdHJ1Y3QgcGFja19oZWFkZXIgKmhlYWRlcikKK3sKKwljaGFyICpjID0gKGNoYXIqKWhlYWRlcjsKKwlzc2l6ZV90IHJlbWFpbmluZyA9IHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpOworCWRvIHsKKwkJc3NpemVfdCByID0geHJlYWQoZmQsIGMsIHJlbWFpbmluZyk7CisJCWlmIChyIDw9IDApCisJCQkvKiAiZW9mIGJlZm9yZSBwYWNrIGhlYWRlciB3YXMgZnVsbHkgcmVhZCIgKi8KKwkJCXJldHVybiBQSF9FUlJPUl9FT0Y7CisJCXJlbWFpbmluZyAtPSByOworCQljICs9IHI7CisJfSB3aGlsZSAocmVtYWluaW5nID4gMCk7CisJaWYgKGhlYWRlci0+aGRyX3NpZ25hdHVyZSAhPSBodG9ubChQQUNLX1NJR05BVFVSRSkpCisJCS8qICJwcm90b2NvbCBlcnJvciAocGFjayBzaWduYXR1cmUgbWlzbWF0Y2ggZGV0ZWN0ZWQpIiAqLworCQlyZXR1cm4gUEhfRVJST1JfUEFDS19TSUdOQVRVUkU7CisJaWYgKCFwYWNrX3ZlcnNpb25fb2soaGVhZGVyLT5oZHJfdmVyc2lvbikpCisJCS8qICJwcm90b2NvbCBlcnJvciAocGFjayB2ZXJzaW9uIHVuc3VwcG9ydGVkKSIgKi8KKwkJcmV0dXJuIFBIX0VSUk9SX1BST1RPQ09MOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2hhMV9uYW1lLmMgYi9zaGExX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWYyNWEyCi0tLSAvZGV2L251bGwKKysrIGIvc2hhMV9uYW1lLmMKQEAgLTAsMCArMSw3MTYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgaW50IGZpbmRfc2hvcnRfb2JqZWN0X2ZpbGVuYW1lKGludCBsZW4sIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKwljaGFyIGhleFs0MF07CisJaW50IGZvdW5kID0gMDsKKwlzdGF0aWMgc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmZha2VlbnQ7CisKKwlpZiAoIWZha2VlbnQpIHsKKwkJY29uc3QgY2hhciAqb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IG9iamRpcl9sZW4gPSBzdHJsZW4ob2JqZGlyKTsKKwkJaW50IGVudGxlbiA9IG9iamRpcl9sZW4gKyA0MzsKKwkJZmFrZWVudCA9IHhtYWxsb2Moc2l6ZW9mKCpmYWtlZW50KSArIGVudGxlbik7CisJCW1lbWNweShmYWtlZW50LT5iYXNlLCBvYmpkaXIsIG9iamRpcl9sZW4pOworCQlmYWtlZW50LT5uYW1lID0gZmFrZWVudC0+YmFzZSArIG9iamRpcl9sZW4gKyAxOworCQlmYWtlZW50LT5uYW1lWy0xXSA9ICcvJzsKKwl9CisJZmFrZWVudC0+bmV4dCA9IGFsdF9vZGJfbGlzdDsKKworCXNwcmludGYoaGV4LCAiJS4ycyIsIG5hbWUpOworCWZvciAoYWx0ID0gZmFrZWVudDsgYWx0ICYmIGZvdW5kIDwgMjsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCXN0cnVjdCBkaXJlbnQgKmRlOworCQlESVIgKmRpcjsKKwkJc3ByaW50ZihhbHQtPm5hbWUsICIlLjJzLyIsIG5hbWUpOworCQlkaXIgPSBvcGVuZGlyKGFsdC0+YmFzZSk7CisJCWlmICghZGlyKQorCQkJY29udGludWU7CisJCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJCWlmIChzdHJsZW4oZGUtPmRfbmFtZSkgIT0gMzgpCisJCQkJY29udGludWU7CisJCQlpZiAobWVtY21wKGRlLT5kX25hbWUsIG5hbWUgKyAyLCBsZW4gLSAyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghZm91bmQpIHsKKwkJCQltZW1jcHkoaGV4ICsgMiwgZGUtPmRfbmFtZSwgMzgpOworCQkJCWZvdW5kKys7CisJCQl9CisJCQllbHNlIGlmIChtZW1jbXAoaGV4ICsgMiwgZGUtPmRfbmFtZSwgMzgpKSB7CisJCQkJZm91bmQgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfQorCWlmIChmb3VuZCA9PSAxKQorCQlyZXR1cm4gZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkgPT0gMDsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfc2hhKHVuc2lnbmVkIGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYikKK3sKKwlkbyB7CisJCWlmICgqYSAhPSAqYikKKwkJCXJldHVybiAwOworCQlhKys7CisJCWIrKzsKKwkJbGVuIC09IDI7CisJfSB3aGlsZSAobGVuID4gMSk7CisJaWYgKGxlbikKKwkJaWYgKCgqYSBeICpiKSAmIDB4ZjApCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5kX3Nob3J0X3BhY2tlZF9vYmplY3QoaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbWF0Y2gsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZm91bmRfc2hhMSA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHAgJiYgZm91bmQgPCAyOyBwID0gcC0+bmV4dCkgeworCQl1aW50MzJfdCBudW0gPSBwLT5udW1fb2JqZWN0czsKKwkJdWludDMyX3QgZmlyc3QgPSAwLCBsYXN0ID0gbnVtOworCQl3aGlsZSAoZmlyc3QgPCBsYXN0KSB7CisJCQl1aW50MzJfdCBtaWQgPSAoZmlyc3QgKyBsYXN0KSAvIDI7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpub3c7CisJCQlpbnQgY21wOworCisJCQlub3cgPSBudGhfcGFja2VkX29iamVjdF9zaGExKHAsIG1pZCk7CisJCQljbXAgPSBoYXNoY21wKG1hdGNoLCBub3cpOworCQkJaWYgKCFjbXApIHsKKwkJCQlmaXJzdCA9IG1pZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJZmlyc3QgPSBtaWQrMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxhc3QgPSBtaWQ7CisJCX0KKwkJaWYgKGZpcnN0IDwgbnVtKSB7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpub3csICpuZXh0OworCQkgICAgICAgbm93ID0gbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBmaXJzdCk7CisJCQlpZiAobWF0Y2hfc2hhKGxlbiwgbWF0Y2gsIG5vdykpIHsKKwkJCQluZXh0ID0gbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBmaXJzdCsxKTsKKwkJCSAgICAgICBpZiAoIW5leHR8fCAhbWF0Y2hfc2hhKGxlbiwgbWF0Y2gsIG5leHQpKSB7CisJCQkJCS8qIHVuaXF1ZSB3aXRoaW4gdGhpcyBwYWNrICovCisJCQkJCWlmICghZm91bmQpIHsKKwkJCQkJCWZvdW5kX3NoYTEgPSBub3c7CisJCQkJCQlmb3VuZCsrOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGhhc2hjbXAoZm91bmRfc2hhMSwgbm93KSkgeworCQkJCQkJZm91bmQgPSAyOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8qIG5vdCBldmVuIHVuaXF1ZSB3aXRoaW4gdGhpcyBwYWNrICovCisJCQkJCWZvdW5kID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChmb3VuZCA9PSAxKQorCQloYXNoY3B5KHNoYTEsIGZvdW5kX3NoYTEpOworCXJldHVybiBmb3VuZDsKK30KKworI2RlZmluZSBTSE9SVF9OQU1FX05PVF9GT1VORCAoLTEpCisjZGVmaW5lIFNIT1JUX05BTUVfQU1CSUdVT1VTICgtMikKKworc3RhdGljIGludCBmaW5kX3VuaXF1ZV9zaG9ydF9vYmplY3QoaW50IGxlbiwgY2hhciAqY2Fub25pY2FsLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyICpyZXMsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGhhc191bnBhY2tlZCwgaGFzX3BhY2tlZDsKKwl1bnNpZ25lZCBjaGFyIHVucGFja2VkX3NoYTFbMjBdLCBwYWNrZWRfc2hhMVsyMF07CisKKwloYXNfdW5wYWNrZWQgPSBmaW5kX3Nob3J0X29iamVjdF9maWxlbmFtZShsZW4sIGNhbm9uaWNhbCwgdW5wYWNrZWRfc2hhMSk7CisJaGFzX3BhY2tlZCA9IGZpbmRfc2hvcnRfcGFja2VkX29iamVjdChsZW4sIHJlcywgcGFja2VkX3NoYTEpOworCWlmICghaGFzX3VucGFja2VkICYmICFoYXNfcGFja2VkKQorCQlyZXR1cm4gU0hPUlRfTkFNRV9OT1RfRk9VTkQ7CisJaWYgKDEgPCBoYXNfdW5wYWNrZWQgfHwgMSA8IGhhc19wYWNrZWQpCisJCXJldHVybiBTSE9SVF9OQU1FX0FNQklHVU9VUzsKKwlpZiAoaGFzX3VucGFja2VkICE9IGhhc19wYWNrZWQpIHsKKwkJaGFzaGNweShzaGExLCAoaGFzX3BhY2tlZCA/IHBhY2tlZF9zaGExIDogdW5wYWNrZWRfc2hhMSkpOworCQlyZXR1cm4gMDsKKwl9CisJLyogQm90aCBoYXZlIHVuaXF1ZSBvbmVzIC0tIGRvIHRoZXkgbWF0Y2g/ICovCisJaWYgKGhhc2hjbXAocGFja2VkX3NoYTEsIHVucGFja2VkX3NoYTEpKQorCQlyZXR1cm4gU0hPUlRfTkFNRV9BTUJJR1VPVVM7CisJaGFzaGNweShzaGExLCBwYWNrZWRfc2hhMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Nob3J0X3NoYTEoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgaW50IHF1aWV0bHkpCit7CisJaW50IGksIHN0YXR1czsKKwljaGFyIGNhbm9uaWNhbFs0MF07CisJdW5zaWduZWQgY2hhciByZXNbMjBdOworCisJaWYgKGxlbiA8IE1JTklNVU1fQUJCUkVWIHx8IGxlbiA+IDQwKQorCQlyZXR1cm4gLTE7CisJaGFzaGNscihyZXMpOworCW1lbXNldChjYW5vbmljYWwsICd4JywgNDApOworCWZvciAoaSA9IDA7IGkgPCBsZW4gO2krKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBuYW1lW2ldOworCQl1bnNpZ25lZCBjaGFyIHZhbDsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJdmFsID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQl2YWwgPSBjIC0gJ2EnICsgMTA7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0nRicpIHsKKwkJCXZhbCA9IGMgLSAnQScgKyAxMDsKKwkJCWMgLT0gJ0EnIC0gJ2EnOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKwkJY2Fub25pY2FsW2ldID0gYzsKKwkJaWYgKCEoaSAmIDEpKQorCQkJdmFsIDw8PSA0OworCQlyZXNbaSA+PiAxXSB8PSB2YWw7CisJfQorCisJc3RhdHVzID0gZmluZF91bmlxdWVfc2hvcnRfb2JqZWN0KGksIGNhbm9uaWNhbCwgcmVzLCBzaGExKTsKKwlpZiAoIXF1aWV0bHkgJiYgKHN0YXR1cyA9PSBTSE9SVF9OQU1FX0FNQklHVU9VUykpCisJCXJldHVybiBlcnJvcigic2hvcnQgU0hBMSAlLipzIGlzIGFtYmlndW91cy4iLCBsZW4sIGNhbm9uaWNhbCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworY29uc3QgY2hhciAqZmluZF91bmlxdWVfYWJicmV2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBsZW4pCit7CisJaW50IHN0YXR1cywgaXNfbnVsbDsKKwlzdGF0aWMgY2hhciBoZXhbNDFdOworCisJaXNfbnVsbCA9IGlzX251bGxfc2hhMShzaGExKTsKKwltZW1jcHkoaGV4LCBzaGExX3RvX2hleChzaGExKSwgNDApOworCWlmIChsZW4gPT0gNDAgfHwgIWxlbikKKwkJcmV0dXJuIGhleDsKKwl3aGlsZSAobGVuIDwgNDApIHsKKwkJdW5zaWduZWQgY2hhciBzaGExX3JldFsyMF07CisJCXN0YXR1cyA9IGdldF9zaG9ydF9zaGExKGhleCwgbGVuLCBzaGExX3JldCwgMSk7CisJCWlmICghc3RhdHVzIHx8CisJCSAgICAoaXNfbnVsbCAmJiBzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpKSB7CisJCQloZXhbbGVuXSA9IDA7CisJCQlyZXR1cm4gaGV4OworCQl9CisJCWlmIChzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFtYmlndW91c19wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4pCit7CisJaW50IHNsYXNoID0gMTsKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBsZW47IGNudCsrKSB7CisJCXN3aXRjaCAoKnBhdGgrKykgeworCQljYXNlICdcMCc6CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQlpZiAoc2xhc2gpCisJCQkJYnJlYWs7CisJCQlzbGFzaCA9IDE7CisJCQljb250aW51ZTsKKwkJY2FzZSAnLic6CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCXNsYXNoID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2xhc2g7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWZfZm10W10gPSB7CisJIiUuKnMiLAorCSJyZWZzLyUuKnMiLAorCSJyZWZzL3RhZ3MvJS4qcyIsCisJInJlZnMvaGVhZHMvJS4qcyIsCisJInJlZnMvcmVtb3Rlcy8lLipzIiwKKwkicmVmcy9yZW1vdGVzLyUuKnMvSEVBRCIsCisJTlVMTAorfTsKKworaW50IGR3aW1fcmVmKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqKnJlZikKK3sKKwljb25zdCBjaGFyICoqcCwgKnI7CisJaW50IHJlZnNfZm91bmQgPSAwOworCisJKnJlZiA9IE5VTEw7CisJZm9yIChwID0gcmVmX2ZtdDsgKnA7IHArKykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFfZnJvbV9yZWZbMjBdOworCQl1bnNpZ25lZCBjaGFyICp0aGlzX3Jlc3VsdDsKKworCQl0aGlzX3Jlc3VsdCA9IHJlZnNfZm91bmQgPyBzaGExX2Zyb21fcmVmIDogc2hhMTsKKwkJciA9IHJlc29sdmVfcmVmKG1rcGF0aCgqcCwgbGVuLCBzdHIpLCB0aGlzX3Jlc3VsdCwgMSwgTlVMTCk7CisJCWlmIChyKSB7CisJCQlpZiAoIXJlZnNfZm91bmQrKykKKwkJCQkqcmVmID0geHN0cmR1cChyKTsKKwkJCWlmICghd2Fybl9hbWJpZ3VvdXNfcmVmcykKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVmc19mb3VuZDsKK30KKworaW50IGR3aW1fbG9nKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqKmxvZykKK3sKKwljb25zdCBjaGFyICoqcDsKKwlpbnQgbG9nc19mb3VuZCA9IDA7CisKKwkqbG9nID0gTlVMTDsKKwlmb3IgKHAgPSByZWZfZm10OyAqcDsgcCsrKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQl1bnNpZ25lZCBjaGFyIGhhc2hbMjBdOworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQljb25zdCBjaGFyICpyZWYsICppdDsKKworCQlzdHJjcHkocGF0aCwgbWtwYXRoKCpwLCBsZW4sIHN0cikpOworCQlyZWYgPSByZXNvbHZlX3JlZihwYXRoLCBoYXNoLCAwLCBOVUxMKTsKKwkJaWYgKCFyZWYpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdGF0KGdpdF9wYXRoKCJsb2dzLyVzIiwgcGF0aCksICZzdCkgJiYKKwkJICAgIFNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQlpdCA9IHBhdGg7CisJCWVsc2UgaWYgKHN0cmNtcChyZWYsIHBhdGgpICYmCisJCQkgIXN0YXQoZ2l0X3BhdGgoImxvZ3MvJXMiLCByZWYpLCAmc3QpICYmCisJCQkgU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCWl0ID0gcmVmOworCQllbHNlCisJCQljb250aW51ZTsKKwkJaWYgKCFsb2dzX2ZvdW5kKyspIHsKKwkJCSpsb2cgPSB4c3RyZHVwKGl0KTsKKwkJCWhhc2hjcHkoc2hhMSwgaGFzaCk7CisJCX0KKwkJaWYgKCF3YXJuX2FtYmlndW91c19yZWZzKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBsb2dzX2ZvdW5kOworfQorCitzdGF0aWMgaW50IGdldF9zaGExX2Jhc2ljKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqd2FybmluZyA9ICJ3YXJuaW5nOiByZWZuYW1lICclLipzJyBpcyBhbWJpZ3VvdXMuXG4iOworCWNoYXIgKnJlYWxfcmVmID0gTlVMTDsKKwlpbnQgcmVmc19mb3VuZCA9IDA7CisJaW50IGF0LCByZWZsb2dfbGVuOworCisJaWYgKGxlbiA9PSA0MCAmJiAhZ2V0X3NoYTFfaGV4KHN0ciwgc2hhMSkpCisJCXJldHVybiAwOworCisJLyogYmFzaWNAe3RpbWUgb3IgbnVtYmVyfSBmb3JtYXQgdG8gcXVlcnkgcmVmLWxvZyAqLworCXJlZmxvZ19sZW4gPSBhdCA9IDA7CisJaWYgKHN0cltsZW4tMV0gPT0gJ30nKSB7CisJCWZvciAoYXQgPSAwOyBhdCA8IGxlbiAtIDE7IGF0KyspIHsKKwkJCWlmIChzdHJbYXRdID09ICdAJyAmJiBzdHJbYXQrMV0gPT0gJ3snKSB7CisJCQkJcmVmbG9nX2xlbiA9IChsZW4tMSkgLSAoYXQrMik7CisJCQkJbGVuID0gYXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBBY2NlcHQgb25seSB1bmFtYmlndW91cyByZWYgcGF0aHMuICovCisJaWYgKGxlbiAmJiBhbWJpZ3VvdXNfcGF0aChzdHIsIGxlbikpCisJCXJldHVybiAtMTsKKworCWlmICghbGVuICYmIHJlZmxvZ19sZW4pIHsKKwkJLyogYWxsb3cgIkB7Li4ufSIgdG8gbWVhbiB0aGUgY3VycmVudCBicmFuY2ggcmVmbG9nICovCisJCXJlZnNfZm91bmQgPSBkd2ltX3JlZigiSEVBRCIsIDQsIHNoYTEsICZyZWFsX3JlZik7CisJfSBlbHNlIGlmIChyZWZsb2dfbGVuKQorCQlyZWZzX2ZvdW5kID0gZHdpbV9sb2coc3RyLCBsZW4sIHNoYTEsICZyZWFsX3JlZik7CisJZWxzZQorCQlyZWZzX2ZvdW5kID0gZHdpbV9yZWYoc3RyLCBsZW4sIHNoYTEsICZyZWFsX3JlZik7CisKKwlpZiAoIXJlZnNfZm91bmQpCisJCXJldHVybiAtMTsKKworCWlmICh3YXJuX2FtYmlndW91c19yZWZzICYmIHJlZnNfZm91bmQgPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgd2FybmluZywgbGVuLCBzdHIpOworCisJaWYgKHJlZmxvZ19sZW4pIHsKKwkJaW50IG50aCwgaTsKKwkJdW5zaWduZWQgbG9uZyBhdF90aW1lOworCQl1bnNpZ25lZCBsb25nIGNvX3RpbWU7CisJCWludCBjb190eiwgY29fY250OworCisJCS8qIElzIGl0IGFza2luZyBmb3IgTi10aCBlbnRyeSwgb3IgYXBwcm94aWRhdGU/ICovCisJCWZvciAoaSA9IG50aCA9IDA7IDAgPD0gbnRoICYmIGkgPCByZWZsb2dfbGVuOyBpKyspIHsKKwkJCWNoYXIgY2ggPSBzdHJbYXQrMitpXTsKKwkJCWlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQorCQkJCW50aCA9IG50aCAqIDEwICsgY2ggLSAnMCc7CisJCQllbHNlCisJCQkJbnRoID0gLTE7CisJCX0KKwkJaWYgKDAgPD0gbnRoKQorCQkJYXRfdGltZSA9IDA7CisJCWVsc2UKKwkJCWF0X3RpbWUgPSBhcHByb3hpZGF0ZShzdHIgKyBhdCArIDIpOworCQlpZiAocmVhZF9yZWZfYXQocmVhbF9yZWYsIGF0X3RpbWUsIG50aCwgc2hhMSwgTlVMTCwKKwkJCQkmY29fdGltZSwgJmNvX3R6LCAmY29fY250KSkgeworCQkJaWYgKGF0X3RpbWUpCisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJ3YXJuaW5nOiBMb2cgZm9yICclLipzJyBvbmx5IGdvZXMgIgorCQkJCQkiYmFjayB0byAlcy5cbiIsIGxlbiwgc3RyLAorCQkJCQlzaG93X3JmYzI4MjJfZGF0ZShjb190aW1lLCBjb190eikpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkid2FybmluZzogTG9nIGZvciAnJS4qcycgb25seSBoYXMgIgorCQkJCQkiJWQgZW50cmllcy5cbiIsIGxlbiwgc3RyLCBjb19jbnQpOworCQl9CisJfQorCisJZnJlZShyZWFsX3JlZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfMShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworc3RhdGljIGludCBnZXRfcGFyZW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCByZXQgPSBnZXRfc2hhMV8xKG5hbWUsIGxlbiwgc2hhMSk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCXJldHVybiAtMTsKKwlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKwlpZiAoIWlkeCkgeworCQloYXNoY3B5KHJlc3VsdCwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCXJldHVybiAwOworCX0KKwlwID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwKSB7CisJCWlmICghLS1pZHgpIHsKKwkJCWhhc2hjcHkocmVzdWx0LCBwLT5pdGVtLT5vYmplY3Quc2hhMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwID0gcC0+bmV4dDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldF9udGhfYW5jZXN0b3IoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCBnZW5lcmF0aW9uKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHJldCA9IGdldF9zaGExXzEobmFtZSwgbGVuLCBzaGExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKGdlbmVyYXRpb24tLSkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKworCQlpZiAoIWNvbW1pdCB8fCBwYXJzZV9jb21taXQoY29tbWl0KSB8fCAhY29tbWl0LT5wYXJlbnRzKQorCQkJcmV0dXJuIC0xOworCQloYXNoY3B5KHNoYTEsIGNvbW1pdC0+cGFyZW50cy0+aXRlbS0+b2JqZWN0LnNoYTEpOworCX0KKwloYXNoY3B5KHJlc3VsdCwgc2hhMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVlbF9vbmlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGNoYXIgb3V0ZXJbMjBdOworCWNvbnN0IGNoYXIgKnNwOworCXVuc2lnbmVkIGludCBleHBlY3RlZF90eXBlID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJLyoKKwkgKiAicmVmXnt0eXBlfSIgZGVyZWZlcmVuY2VzIHJlZiByZXBlYXRlZGx5IHVudGlsIHlvdSBjYW5ub3QKKwkgKiBkZXJlZmVyZW5jZSBhbnltb3JlLCBvciB5b3UgZ2V0IGFuIG9iamVjdCBvZiBnaXZlbiB0eXBlLAorCSAqIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gICJyZWZee30iIG1lYW5zIGp1c3QgZGVyZWZlcmVuY2UKKwkgKiB0YWdzIHVudGlsIHlvdSBnZXQgYSBub24tdGFnLiAgInJlZl4wIiBpcyBhIHNob3J0aGFuZCBmb3IKKwkgKiAicmVmXntjb21taXR9Ii4gICJjb21taXRee3RyZWV9IiBjb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlCisJICogdG9wLWxldmVsIHRyZWUgb2YgdGhlIGdpdmVuIGNvbW1pdC4KKwkgKi8KKwlpZiAobGVuIDwgNCB8fCBuYW1lW2xlbi0xXSAhPSAnfScpCisJCXJldHVybiAtMTsKKworCWZvciAoc3AgPSBuYW1lICsgbGVuIC0gMTsgbmFtZSA8PSBzcDsgc3AtLSkgeworCQlpbnQgY2ggPSAqc3A7CisJCWlmIChjaCA9PSAneycgJiYgbmFtZSA8IHNwICYmIHNwWy0xXSA9PSAnXicpCisJCQlicmVhazsKKwl9CisJaWYgKHNwIDw9IG5hbWUpCisJCXJldHVybiAtMTsKKworCXNwKys7IC8qIGJlZ2lubmluZyBvZiB0eXBlIG5hbWUsIG9yIGNsb3NpbmcgYnJhY2UgZm9yIGVtcHR5ICovCisJaWYgKCFzdHJuY21wKGNvbW1pdF90eXBlLCBzcCwgNikgJiYgc3BbNl0gPT0gJ30nKQorCQlleHBlY3RlZF90eXBlID0gT0JKX0NPTU1JVDsKKwllbHNlIGlmICghc3RybmNtcCh0cmVlX3R5cGUsIHNwLCA0KSAmJiBzcFs0XSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfVFJFRTsKKwllbHNlIGlmICghc3RybmNtcChibG9iX3R5cGUsIHNwLCA0KSAmJiBzcFs0XSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfQkxPQjsKKwllbHNlIGlmIChzcFswXSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfTk9ORTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfc2hhMV8xKG5hbWUsIHNwIC0gbmFtZSAtIDIsIG91dGVyKSkKKwkJcmV0dXJuIC0xOworCisJbyA9IHBhcnNlX29iamVjdChvdXRlcik7CisJaWYgKCFvKQorCQlyZXR1cm4gLTE7CisJaWYgKCFleHBlY3RlZF90eXBlKSB7CisJCW8gPSBkZXJlZl90YWcobywgbmFtZSwgc3AgLSBuYW1lIC0gMik7CisJCWlmICghbyB8fCAoIW8tPnBhcnNlZCAmJiAhcGFyc2Vfb2JqZWN0KG8tPnNoYTEpKSkKKwkJCXJldHVybiAtMTsKKwkJaGFzaGNweShzaGExLCBvLT5zaGExKTsKKwl9CisJZWxzZSB7CisJCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBzeW50YXggbG9vayBjb3JyZWN0LCBzbworCQkgKiBpZiB3ZSBkbyBub3QgZ2V0IHRoZSBuZWVkZWQgb2JqZWN0LCB3ZSBzaG91bGQKKwkJICogYmFyZi4KKwkJICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmICghbyB8fCAoIW8tPnBhcnNlZCAmJiAhcGFyc2Vfb2JqZWN0KG8tPnNoYTEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoby0+dHlwZSA9PSBleHBlY3RlZF90eXBlKSB7CisJCQkJaGFzaGNweShzaGExLCBvLT5zaGExKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChvLT50eXBlID09IE9CSl9UQUcpCisJCQkJbyA9ICgoc3RydWN0IHRhZyopIG8pLT50YWdnZWQ7CisJCQllbHNlIGlmIChvLT50eXBlID09IE9CSl9DT01NSVQpCisJCQkJbyA9ICYoKChzdHJ1Y3QgY29tbWl0ICopIG8pLT50cmVlLT5vYmplY3QpOworCQkJZWxzZQorCQkJCXJldHVybiBlcnJvcigiJS4qczogZXhwZWN0ZWQgJXMgdHlwZSwgYnV0IHRoZSBvYmplY3QgZGVyZWZlcmVuY2VzIHRvICVzIHR5cGUiLAorCQkJCQkgICAgIGxlbiwgbmFtZSwgdHlwZW5hbWUoZXhwZWN0ZWRfdHlwZSksCisJCQkJCSAgICAgdHlwZW5hbWUoby0+dHlwZSkpOworCQkJaWYgKCFvLT5wYXJzZWQpCisJCQkJcGFyc2Vfb2JqZWN0KG8tPnNoYTEpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9kZXNjcmliZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY29uc3QgY2hhciAqY3A7CisKKwlmb3IgKGNwID0gbmFtZSArIGxlbiAtIDE7IG5hbWUgKyAyIDw9IGNwOyBjcC0tKSB7CisJCWNoYXIgY2ggPSAqY3A7CisJCWlmIChoZXh2YWwoY2gpICYgfjAzNzcpIHsKKwkJCS8qIFdlIG11c3QgYmUgbG9va2luZyBhdCBnIGluICJTT01FVEhJTkctZyIKKwkJCSAqIGZvciBpdCB0byBiZSBkZXNjcmliZSBvdXRwdXQuCisJCQkgKi8KKwkJCWlmIChjaCA9PSAnZycgJiYgY3BbLTFdID09ICctJykgeworCQkJCWNwKys7CisJCQkJbGVuIC09IGNwIC0gbmFtZTsKKwkJCQlyZXR1cm4gZ2V0X3Nob3J0X3NoYTEoY3AsIGxlbiwgc2hhMSwgMSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldF9zaGExXzEoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0LCBoYXNfc3VmZml4OworCWNvbnN0IGNoYXIgKmNwOworCisJLyogIm5hbWV+MyIgaXMgIm5hbWVeXl4iLAorCSAqICJuYW1lfiIgYW5kICJuYW1lfjAiIGFyZSBuYW1lIC0tIG5vdCAibmFtZV4wIiEKKwkgKiAibmFtZV4iIGlzIG5vdCAibmFtZV4wIjsgaXQgaXMgIm5hbWVeMSIuCisJICovCisJaGFzX3N1ZmZpeCA9IDA7CisJZm9yIChjcCA9IG5hbWUgKyBsZW4gLSAxOyBuYW1lIDw9IGNwOyBjcC0tKSB7CisJCWludCBjaCA9ICpjcDsKKwkJaWYgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCisJCQljb250aW51ZTsKKwkJaWYgKGNoID09ICd+JyB8fCBjaCA9PSAnXicpCisJCQloYXNfc3VmZml4ID0gY2g7CisJCWJyZWFrOworCX0KKworCWlmIChoYXNfc3VmZml4KSB7CisJCWludCBudW0gPSAwOworCQlpbnQgbGVuMSA9IGNwIC0gbmFtZTsKKwkJY3ArKzsKKwkJd2hpbGUgKGNwIDwgbmFtZSArIGxlbikKKwkJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJCWlmIChoYXNfc3VmZml4ID09ICdeJykgeworCQkJaWYgKCFudW0gJiYgbGVuMSA9PSBsZW4gLSAxKQorCQkJCW51bSA9IDE7CisJCQlyZXR1cm4gZ2V0X3BhcmVudChuYW1lLCBsZW4xLCBzaGExLCBudW0pOworCQl9CisJCS8qIGVsc2UgaWYgKGhhc19zdWZmaXggPT0gJ34nKSAtLSBnb2VzIHdpdGhvdXQgc2F5aW5nICovCisJCXJldHVybiBnZXRfbnRoX2FuY2VzdG9yKG5hbWUsIGxlbjEsIHNoYTEsIG51bSk7CisJfQorCisJcmV0ID0gcGVlbF9vbmlvbihuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGdldF9zaGExX2Jhc2ljKG5hbWUsIGxlbiwgc2hhMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJLyogSXQgY291bGQgYmUgZGVzY3JpYmUgb3V0cHV0IHRoYXQgaXMgIlNPTUVUSElORy1nWFhYWCIgKi8KKwlyZXQgPSBnZXRfZGVzY3JpYmVfbmFtZShuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBnZXRfc2hvcnRfc2hhMShuYW1lLCBsZW4sIHNoYTEsIDApOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QgPSBjYl9kYXRhOworCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuIDA7CisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfVEFHKQorCQlvYmplY3QgPSBkZXJlZl90YWcob2JqZWN0LCBwYXRoLCBzdHJsZW4ocGF0aCkpOworCWlmIChvYmplY3QtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIDA7CisJaW5zZXJ0X2J5X2RhdGUoKHN0cnVjdCBjb21taXQgKilvYmplY3QsIGxpc3QpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpbnRlcnByZXRzIG5hbWVzIGxpa2UgJzovSW5pdGlhbCByZXZpc2lvbiBvZiAiZ2l0IicgYnkgc2VhcmNoaW5nCisgKiB0aHJvdWdoIGhpc3RvcnkgYW5kIHJldHVybmluZyB0aGUgZmlyc3QgY29tbWl0IHdob3NlIG1lc3NhZ2Ugc3RhcnRzCisgKiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCisgKgorICogRm9yIGZ1dHVyZSBleHRlbnNpb24sICc6LyEnIGlzIHJlc2VydmVkLiBJZiB5b3Ugd2FudCB0byBtYXRjaCBhIG1lc3NhZ2UKKyAqIGJlZ2lubmluZyB3aXRoIGEgJyEnLCB5b3UgaGF2ZSB0byByZXBlYXQgdGhlIGV4Y2xhbWF0aW9uIG1hcmsuCisgKi8KKworI2RlZmluZSBPTkVMSU5FX1NFRU4gKDF1PDwyMCkKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfb25lbGluZShjb25zdCBjaGFyICpwcmVmaXgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gTlVMTCwgKmJhY2t1cCA9IE5VTEwsICpsOworCWludCByZXR2YWwgPSAtMTsKKworCWlmIChwcmVmaXhbMF0gPT0gJyEnKSB7CisJCWlmIChwcmVmaXhbMV0gIT0gJyEnKQorCQkJZGllICgiSW52YWxpZCBzZWFyY2ggcGF0dGVybjogJXMiLCBwcmVmaXgpOworCQlwcmVmaXgrKzsKKwl9CisJaWYgKCFzYXZlX2NvbW1pdF9idWZmZXIpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IGV4cGFuZCBvbmVsaW5lLW5hbWUuIik7CisJZm9yX2VhY2hfcmVmKGhhbmRsZV9vbmVfcmVmLCAmbGlzdCk7CisJZm9yIChsID0gbGlzdDsgbDsgbCA9IGwtPm5leHQpCisJCWNvbW1pdF9saXN0X2luc2VydChsLT5pdGVtLCAmYmFja3VwKTsKKwl3aGlsZSAobGlzdCkgeworCQljaGFyICpwOworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwkJY29tbWl0ID0gcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmbGlzdCwgT05FTElORV9TRUVOKTsKKwkJcGFyc2Vfb2JqZWN0KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQlpZiAoIWNvbW1pdC0+YnVmZmVyIHx8ICEocCA9IHN0cnN0cihjb21taXQtPmJ1ZmZlciwgIlxuXG4iKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwcmVmaXhjbXAocCArIDIsIHByZWZpeCkpIHsKKwkJCWhhc2hjcHkoc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJZnJlZV9jb21taXRfbGlzdChsaXN0KTsKKwlmb3IgKGwgPSBiYWNrdXA7IGw7IGwgPSBsLT5uZXh0KQorCQljbGVhcl9jb21taXRfbWFya3MobC0+aXRlbSwgT05FTElORV9TRUVOKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyBpcyBsaWtlICJnZXRfc2hhMV9iYXNpYygpIiwgZXhjZXB0IGl0IGFsbG93cyAic2hhMSBleHByZXNzaW9ucyIsCisgKiBub3RhYmx5ICJ4eXpeIiBmb3IgInBhcmVudCBvZiB4eXoiCisgKi8KK2ludCBnZXRfc2hhMShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIHVudXNlZDsKKwlyZXR1cm4gZ2V0X3NoYTFfd2l0aF9tb2RlKG5hbWUsIHNoYTEsICZ1bnVzZWQpOworfQorCitpbnQgZ2V0X3NoYTFfd2l0aF9tb2RlKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkICptb2RlKQoreworCWludCByZXQsIGJyYWNrZXRfZGVwdGg7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJY29uc3QgY2hhciAqY3A7CisKKwkqbW9kZSA9IFNfSUZJTlZBTElEOworCXByZXBhcmVfYWx0X29kYigpOworCXJldCA9IGdldF9zaGExXzEobmFtZSwgbmFtZWxlbiwgc2hhMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisJLyogc2hhMTpwYXRoIC0tPiBvYmplY3QgbmFtZSBvZiBwYXRoIGluIGVudCBzaGExCisJICogOnBhdGggLT4gb2JqZWN0IG5hbWUgb2YgcGF0aCBpbiBpbmRleAorCSAqIDpbMC0zXTpwYXRoIC0+IG9iamVjdCBuYW1lIG9mIHBhdGggaW4gaW5kZXggYXQgc3RhZ2UKKwkgKi8KKwlpZiAobmFtZVswXSA9PSAnOicpIHsKKwkJaW50IHN0YWdlID0gMDsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJaW50IHBvczsKKwkJaWYgKG5hbWVsZW4gPiAyICYmIG5hbWVbMV0gPT0gJy8nKQorCQkJcmV0dXJuIGdldF9zaGExX29uZWxpbmUobmFtZSArIDIsIHNoYTEpOworCQlpZiAobmFtZWxlbiA8IDMgfHwKKwkJICAgIG5hbWVbMl0gIT0gJzonIHx8CisJCSAgICBuYW1lWzFdIDwgJzAnIHx8ICczJyA8IG5hbWVbMV0pCisJCQljcCA9IG5hbWUgKyAxOworCQllbHNlIHsKKwkJCXN0YWdlID0gbmFtZVsxXSAtICcwJzsKKwkJCWNwID0gbmFtZSArIDM7CisJCX0KKwkJbmFtZWxlbiA9IG5hbWVsZW4gLSAoY3AgLSBuYW1lKTsKKwkJaWYgKCFhY3RpdmVfY2FjaGUpCisJCQlyZWFkX2NhY2hlKCk7CisJCWlmIChhY3RpdmVfbnIgPCAwKQorCQkJcmV0dXJuIC0xOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhjcCwgbmFtZWxlbik7CisJCWlmIChwb3MgPCAwKQorCQkJcG9zID0gLXBvcyAtIDE7CisJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkJICAgIG1lbWNtcChjZS0+bmFtZSwgY3AsIG5hbWVsZW4pKQorCQkJCWJyZWFrOworCQkJaWYgKGNlX3N0YWdlKGNlKSA9PSBzdGFnZSkgeworCQkJCWhhc2hjcHkoc2hhMSwgY2UtPnNoYTEpOworCQkJCSptb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcG9zKys7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGNwID0gbmFtZSwgYnJhY2tldF9kZXB0aCA9IDA7ICpjcDsgY3ArKykgeworCQlpZiAoKmNwID09ICd7JykKKwkJCWJyYWNrZXRfZGVwdGgrKzsKKwkJZWxzZSBpZiAoYnJhY2tldF9kZXB0aCAmJiAqY3AgPT0gJ30nKQorCQkJYnJhY2tldF9kZXB0aC0tOworCQllbHNlIGlmICghYnJhY2tldF9kZXB0aCAmJiAqY3AgPT0gJzonKQorCQkJYnJlYWs7CisJfQorCWlmICgqY3AgPT0gJzonKSB7CisJCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXTsKKwkJaWYgKCFnZXRfc2hhMV8xKG5hbWUsIGNwLW5hbWUsIHRyZWVfc2hhMSkpCisJCQlyZXR1cm4gZ2V0X3RyZWVfZW50cnkodHJlZV9zaGExLCBjcCsxLCBzaGExLAorCQkJCQkgICAgICBtb2RlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NoYWxsb3cuYyBiL3NoYWxsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTc4Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhbGxvdy5jCkBAIC0wLDAgKzEsMTA0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworc3RhdGljIGludCBpc19zaGFsbG93ID0gLTE7CisKK2ludCByZWdpc3Rlcl9zaGFsbG93KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPQorCQl4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X2dyYWZ0KSk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKworCWhhc2hjcHkoZ3JhZnQtPnNoYTEsIHNoYTEpOworCWdyYWZ0LT5ucl9wYXJlbnQgPSAtMTsKKwlpZiAoY29tbWl0ICYmIGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJY29tbWl0LT5wYXJlbnRzID0gTlVMTDsKKwlyZXR1cm4gcmVnaXN0ZXJfY29tbWl0X2dyYWZ0KGdyYWZ0LCAwKTsKK30KKworaW50IGlzX3JlcG9zaXRvcnlfc2hhbGxvdyh2b2lkKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKGlzX3NoYWxsb3cgPj0gMCkKKwkJcmV0dXJuIGlzX3NoYWxsb3c7CisKKwlmcCA9IGZvcGVuKGdpdF9wYXRoKCJzaGFsbG93IiksICJyIik7CisJaWYgKCFmcCkgeworCQlpc19zaGFsbG93ID0gMDsKKwkJcmV0dXJuIGlzX3NoYWxsb3c7CisJfQorCWlzX3NoYWxsb3cgPSAxOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoZ2V0X3NoYTFfaGV4KGJ1Ziwgc2hhMSkpCisJCQlkaWUoImJhZCBzaGFsbG93IGxpbmU6ICVzIiwgYnVmKTsKKwkJcmVnaXN0ZXJfc2hhbGxvdyhzaGExKTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gaXNfc2hhbGxvdzsKK30KKworc3RydWN0IGNvbW1pdF9saXN0ICpnZXRfc2hhbGxvd19jb21taXRzKHN0cnVjdCBvYmplY3RfYXJyYXkgKmhlYWRzLCBpbnQgZGVwdGgsCisJCWludCBzaGFsbG93X2ZsYWcsIGludCBub3Rfc2hhbGxvd19mbGFnKQoreworCWludCBpID0gMCwgY3VyX2RlcHRoID0gMDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IG9iamVjdF9hcnJheSBzdGFjayA9IHswLCAwLCBOVUxMfTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBOVUxMOworCisJd2hpbGUgKGNvbW1pdCB8fCBpIDwgaGVhZHMtPm5yIHx8IHN0YWNrLm5yKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwkJaWYgKCFjb21taXQpIHsKKwkJCWlmIChpIDwgaGVhZHMtPm5yKSB7CisJCQkJY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKikKKwkJCQkJZGVyZWZfdGFnKGhlYWRzLT5vYmplY3RzW2krK10uaXRlbSwgTlVMTCwgMCk7CisJCQkJaWYgKGNvbW1pdC0+b2JqZWN0LnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJCQljb21taXQgPSBOVUxMOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFjb21taXQtPnV0aWwpCisJCQkJCWNvbW1pdC0+dXRpbCA9IHhtYWxsb2Moc2l6ZW9mKGludCkpOworCQkJCSooaW50ICopY29tbWl0LT51dGlsID0gMDsKKwkJCQljdXJfZGVwdGggPSAwOworCQkJfSBlbHNlIHsKKwkJCQljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKQorCQkJCQlzdGFjay5vYmplY3RzWy0tc3RhY2subnJdLml0ZW07CisJCQkJY3VyX2RlcHRoID0gKihpbnQgKiljb21taXQtPnV0aWw7CisJCQl9CisJCX0KKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IG5vdF9zaGFsbG93X2ZsYWc7CisJCWN1cl9kZXB0aCsrOworCQlmb3IgKHAgPSBjb21taXQtPnBhcmVudHMsIGNvbW1pdCA9IE5VTEw7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAoIXAtPml0ZW0tPnV0aWwpIHsKKwkJCQlpbnQgKnBvaW50ZXIgPSB4bWFsbG9jKHNpemVvZihpbnQpKTsKKwkJCQlwLT5pdGVtLT51dGlsID0gcG9pbnRlcjsKKwkJCQkqcG9pbnRlciA9ICBjdXJfZGVwdGg7CisJCQl9IGVsc2UgeworCQkJCWludCAqcG9pbnRlciA9IHAtPml0ZW0tPnV0aWw7CisJCQkJaWYgKGN1cl9kZXB0aCA+PSAqcG9pbnRlcikKKwkJCQkJY29udGludWU7CisJCQkJKnBvaW50ZXIgPSBjdXJfZGVwdGg7CisJCQl9CisJCQlpZiAoY3VyX2RlcHRoIDwgZGVwdGgpIHsKKwkJCQlpZiAocC0+bmV4dCkKKwkJCQkJYWRkX29iamVjdF9hcnJheSgmcC0+aXRlbS0+b2JqZWN0LAorCQkJCQkJCU5VTEwsICZzdGFjayk7CisJCQkJZWxzZSB7CisJCQkJCWNvbW1pdCA9IHAtPml0ZW07CisJCQkJCWN1cl9kZXB0aCA9ICooaW50ICopY29tbWl0LT51dGlsOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29tbWl0X2xpc3RfaW5zZXJ0KHAtPml0ZW0sICZyZXN1bHQpOworCQkJCXAtPml0ZW0tPm9iamVjdC5mbGFncyB8PSBzaGFsbG93X2ZsYWc7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCmRpZmYgLS1naXQgYS9zaGVsbC5jIGIvc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTgzZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwuYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBpbnQgZG9fZ2VuZXJpY19jbWQoY29uc3QgY2hhciAqbWUsIGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpteV9hcmd2WzRdOworCisJaWYgKCFhcmcgfHwgIShhcmcgPSBzcV9kZXF1b3RlKGFyZykpKQorCQlkaWUoImJhZCBhcmd1bWVudCIpOworCWlmIChwcmVmaXhjbXAobWUsICJnaXQtIikpCisJCWRpZSgiYmFkIGNvbW1hbmQiKTsKKworCW15X2FyZ3ZbMF0gPSBtZSArIDQ7CisJbXlfYXJndlsxXSA9IGFyZzsKKwlteV9hcmd2WzJdID0gTlVMTDsKKworCXJldHVybiBleGVjdl9naXRfY21kKG15X2FyZ3YpOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1hbmRzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmV4ZWMpKGNvbnN0IGNoYXIgKm1lLCBjaGFyICphcmcpOworfSBjbWRfbGlzdFtdID0geworCXsgImdpdC1yZWNlaXZlLXBhY2siLCBkb19nZW5lcmljX2NtZCB9LAorCXsgImdpdC11cGxvYWQtcGFjayIsIGRvX2dlbmVyaWNfY21kIH0sCisJeyBOVUxMIH0sCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcHJvZzsKKwlzdHJ1Y3QgY29tbWFuZHMgKmNtZDsKKworCS8qIFdlIHdhbnQgdG8gc2VlICItYyBjbWQgYXJncyIsIGFuZCBub3RoaW5nIGVsc2UgKi8KKwlpZiAoYXJnYyAhPSAzIHx8IHN0cmNtcChhcmd2WzFdLCAiLWMiKSkKKwkJZGllKCJXaGF0IGRvIHlvdSB0aGluayBJIGFtPyBBIHNoZWxsPyIpOworCisJcHJvZyA9IGFyZ3ZbMl07CisJYXJndiArPSAyOworCWFyZ2MgLT0gMjsKKwlmb3IgKGNtZCA9IGNtZF9saXN0IDsgY21kLT5uYW1lIDsgY21kKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihjbWQtPm5hbWUpOworCQljaGFyICphcmc7CisJCWlmIChzdHJuY21wKGNtZC0+bmFtZSwgcHJvZywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlhcmcgPSBOVUxMOworCQlzd2l0Y2ggKHByb2dbbGVuXSkgeworCQljYXNlICdcMCc6CisJCQlhcmcgPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQkJYXJnID0gcHJvZyArIGxlbiArIDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWV4aXQoY21kLT5leGVjKGNtZC0+bmFtZSwgYXJnKSk7CisJfQorCWRpZSgidW5yZWNvZ25pemVkIGNvbW1hbmQgJyVzJyIsIHByb2cpOworfQpkaWZmIC0tZ2l0IGEvc2hvdy1pbmRleC5jIGIvc2hvdy1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWQ5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaG93LWluZGV4LmMKQEAgLTAsMCArMSw3OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJdW5zaWduZWQgbnI7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJc3RhdGljIHVuc2lnbmVkIGludCB0b3BfaW5kZXhbMjU2XTsKKworCWlmIChmcmVhZCh0b3BfaW5kZXgsIDIgKiA0LCAxLCBzdGRpbikgIT0gMSkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBoZWFkZXIiKTsKKwlpZiAodG9wX2luZGV4WzBdID09IGh0b25sKFBBQ0tfSURYX1NJR05BVFVSRSkpIHsKKwkJdmVyc2lvbiA9IG50b2hsKHRvcF9pbmRleFsxXSk7CisJCWlmICh2ZXJzaW9uIDwgMiB8fCB2ZXJzaW9uID4gMikKKwkJCWRpZSgidW5rbm93biBpbmRleCB2ZXJzaW9uIik7CisJCWlmIChmcmVhZCh0b3BfaW5kZXgsIDI1NiAqIDQsIDEsIHN0ZGluKSAhPSAxKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBpbmRleCIpOworCX0gZWxzZSB7CisJCXZlcnNpb24gPSAxOworCQlpZiAoZnJlYWQoJnRvcF9pbmRleFsyXSwgMjU0ICogNCwgMSwgc3RkaW4pICE9IDEpCisJCQlkaWUoInVuYWJsZSB0byByZWFkIGluZGV4Iik7CisJfQorCW5yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJdW5zaWduZWQgbiA9IG50b2hsKHRvcF9pbmRleFtpXSk7CisJCWlmIChuIDwgbnIpCisJCQlkaWUoImNvcnJ1cHQgaW5kZXggZmlsZSIpOworCQluciA9IG47CisJfQorCWlmICh2ZXJzaW9uID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGVudHJ5WzZdOworCisJCQlpZiAoZnJlYWQoZW50cnksIDQgKyAyMCwgMSwgc3RkaW4pICE9IDEpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBlbnRyeSAldS8ldSIsIGksIG5yKTsKKwkJCW9mZnNldCA9IG50b2hsKGVudHJ5WzBdKTsKKwkJCXByaW50ZigiJXUgJXNcbiIsIG9mZnNldCwgc2hhMV90b19oZXgoKHZvaWQgKikoZW50cnkrMSkpKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIG9mZjY0X25yID0gMDsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQl1aW50MzJfdCBjcmM7CisJCQl1aW50MzJfdCBvZmY7CisJCX0gKmVudHJpZXMgPSB4bWFsbG9jKG5yICogc2l6ZW9mKGVudHJpZXNbMF0pKTsKKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCQlpZiAoZnJlYWQoZW50cmllc1tpXS5zaGExLCAyMCwgMSwgc3RkaW4pICE9IDEpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExICV1LyV1IiwgaSwgbnIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJCWlmIChmcmVhZCgmZW50cmllc1tpXS5jcmMsIDQsIDEsIHN0ZGluKSAhPSAxKQorCQkJCWRpZSgidW5hYmxlIHRvIHJlYWQgY3JjICV1LyV1IiwgaSwgbnIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJCWlmIChmcmVhZCgmZW50cmllc1tpXS5vZmYsIDQsIDEsIHN0ZGluKSAhPSAxKQorCQkJCWRpZSgidW5hYmxlIHRvIHJlYWQgMzJiIG9mZnNldCAldS8ldSIsIGksIG5yKTsKKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJCXVpbnQ2NF90IG9mZnNldDsKKwkJCXVpbnQzMl90IG9mZiA9IG50b2hsKGVudHJpZXNbaV0ub2ZmKTsKKwkJCWlmICghKG9mZiAmIDB4ODAwMDAwMDApKSB7CisJCQkJb2Zmc2V0ID0gb2ZmOworCQkJfSBlbHNlIHsKKwkJCQl1aW50MzJfdCBvZmY2NFsyXTsKKwkJCQlpZiAoKG9mZiAmIDB4N2ZmZmZmZmYpICE9IG9mZjY0X25yKQorCQkJCQlkaWUoImluY29uc2lzdGVudCA2NGIgb2Zmc2V0IGluZGV4Iik7CisJCQkJaWYgKGZyZWFkKG9mZjY0LCA4LCAxLCBzdGRpbikgIT0gMSkKKwkJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCA2NGIgb2Zmc2V0ICV1Iiwgb2ZmNjRfbnIpOworCQkJCW9mZnNldCA9ICgoKHVpbnQ2NF90KW50b2hsKG9mZjY0WzBdKSkgPDwgMzIpIHwKKwkJCQkJCSAgICAgbnRvaGwob2ZmNjRbMV0pOworCQkJCW9mZjY0X25yKys7CisJCQl9CisJCQlwcmludGYoIiVsbHUgJXMgKCUwOHgpXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmZzZXQsCisJCQkgICAgICAgc2hhMV90b19oZXgoZW50cmllc1tpXS5zaGExKSwKKwkJCSAgICAgICBudG9obChlbnRyaWVzW2ldLmNyYykpOworCQl9CisJCWZyZWUoZW50cmllcyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2lkZWJhbmQuYyBiL3NpZGViYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3ZmEzYwotLS0gL2Rldi9udWxsCisrKyBiL3NpZGViYW5kLmMKQEAgLTAsMCArMSw3OCBAQAorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAic2lkZWJhbmQuaCIKKworLyoKKyAqIFJlY2VpdmUgbXVsdGlwbGV4ZWQgb3V0cHV0IHN0cmVhbSBvdmVyIGdpdCBuYXRpdmUgcHJvdG9jb2wuCisgKiBpbl9zdHJlYW0gaXMgdGhlIGlucHV0IHN0cmVhbSBmcm9tIHRoZSByZW1vdGUsIHdoaWNoIGNhcnJpZXMgZGF0YQorICogaW4gcGt0X2xpbmUgZm9ybWF0IHdpdGggYmFuZCBkZXNpZ25hdG9yLiAgRGVtdWx0aXBsZXggaXQgaW50byBvdXQKKyAqIGFuZCBlcnIgYW5kIHJldHVybiBlcnJvciBhcHByb3ByaWF0ZWx5LiAgQmFuZCAjMSBjYXJyaWVzIHRoZQorICogcHJpbWFyeSBwYXlsb2FkLiAgVGhpbmdzIGNvbWluZyBvdmVyIGJhbmQgIzIgaXMgbm90IG5lY2Vzc2FyaWx5CisgKiBlcnJvcjsgdGhleSBhcmUgdXN1YWxseSBpbmZvcm1hdGl2ZSBtZXNzYWdlIG9uIHRoZSBzdGFuZGFyZCBlcnJvcgorICogc3RyZWFtLCBha2EgInZlcmJvc2UiKS4gIEEgbWVzc2FnZSBvdmVyIGJhbmQgIzMgaXMgYSBzaWduYWwgdGhhdAorICogdGhlIHJlbW90ZSBkaWVkIHVuZXhwZWN0ZWRseS4gIEEgZmx1c2goKSBjb25jbHVkZXMgdGhlIHN0cmVhbS4KKyAqLworaW50IHJlY3Zfc2lkZWJhbmQoY29uc3QgY2hhciAqbWUsIGludCBpbl9zdHJlYW0sIGludCBvdXQsIGludCBlcnIpCit7CisJY2hhciBidWZbNyArIExBUkdFX1BBQ0tFVF9NQVggKyAxXTsKKwlzdHJjcHkoYnVmLCAicmVtb3RlOiIpOworCXdoaWxlICgxKSB7CisJCWludCBiYW5kLCBsZW47CisJCWxlbgk9IHBhY2tldF9yZWFkX2xpbmUoaW5fc3RyZWFtLCBidWYrNywgTEFSR0VfUEFDS0VUX01BWCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgMSkgeworCQkJbGVuID0gc3ByaW50ZihidWYsICIlczogcHJvdG9jb2wgZXJyb3I6IG5vIGJhbmQgZGVzaWduYXRvclxuIiwgbWUpOworCQkJc2FmZV93cml0ZShlcnIsIGJ1ZiwgbGVuKTsKKwkJCXJldHVybiBTSURFQkFORF9QUk9UT0NPTF9FUlJPUjsKKwkJfQorCQliYW5kID0gYnVmWzddICYgMHhmZjsKKwkJbGVuLS07CisJCXN3aXRjaCAoYmFuZCkgeworCQljYXNlIDM6CisJCQlidWZbN10gPSAnICc7CisJCQlidWZbOCtsZW5dID0gJ1xuJzsKKwkJCXNhZmVfd3JpdGUoZXJyLCBidWYsIDgrbGVuKzEpOworCQkJcmV0dXJuIFNJREVCQU5EX1JFTU9URV9FUlJPUjsKKwkJY2FzZSAyOgorCQkJYnVmWzddID0gJyAnOworCQkJc2FmZV93cml0ZShlcnIsIGJ1ZiwgOCtsZW4pOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCXNhZmVfd3JpdGUob3V0LCBidWYrOCwgbGVuKTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJbGVuID0gc3ByaW50ZihidWYsCisJCQkJICAgICAgIiVzOiBwcm90b2NvbCBlcnJvcjogYmFkIGJhbmQgIyVkXG4iLAorCQkJCSAgICAgIG1lLCBiYW5kKTsKKwkJCXNhZmVfd3JpdGUoZXJyLCBidWYsIGxlbik7CisJCQlyZXR1cm4gU0lERUJBTkRfUFJPVE9DT0xfRVJST1I7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmZCBpcyBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBzaWRlOyBzZW5kIHRoZSBzaWRlYmFuZCBkYXRhCisgKiBvdmVyIG11bHRpcGxleGVkIHBhY2tldCBzdHJlYW0uCisgKi8KK3NzaXplX3Qgc2VuZF9zaWRlYmFuZChpbnQgZmQsIGludCBiYW5kLCBjb25zdCBjaGFyICpkYXRhLCBzc2l6ZV90IHN6LCBpbnQgcGFja2V0X21heCkKK3sKKwlzc2l6ZV90IHNzeiA9IHN6OworCWNvbnN0IGNoYXIgKnAgPSBkYXRhOworCisJd2hpbGUgKHN6KSB7CisJCXVuc2lnbmVkIG47CisJCWNoYXIgaGRyWzVdOworCisJCW4gPSBzejsKKwkJaWYgKHBhY2tldF9tYXggLSA1IDwgbikKKwkJCW4gPSBwYWNrZXRfbWF4IC0gNTsKKwkJc3ByaW50ZihoZHIsICIlMDR4IiwgbiArIDUpOworCQloZHJbNF0gPSBiYW5kOworCQlzYWZlX3dyaXRlKGZkLCBoZHIsIDUpOworCQlzYWZlX3dyaXRlKGZkLCBwLCBuKTsKKwkJcCArPSBuOworCQlzeiAtPSBuOworCX0KKwlyZXR1cm4gc3N6OworfQpkaWZmIC0tZ2l0IGEvc2lkZWJhbmQuaCBiL3NpZGViYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0YjY5MQotLS0gL2Rldi9udWxsCisrKyBiL3NpZGViYW5kLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBTSURFQkFORF9ICisjZGVmaW5lIFNJREVCQU5EX0gKKworI2RlZmluZSBTSURFQkFORF9QUk9UT0NPTF9FUlJPUiAtMgorI2RlZmluZSBTSURFQkFORF9SRU1PVEVfRVJST1IgLTEKKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9NQVggMTAwMAorI2RlZmluZSBMQVJHRV9QQUNLRVRfTUFYIDY1NTIwCisKK2ludCByZWN2X3NpZGViYW5kKGNvbnN0IGNoYXIgKm1lLCBpbnQgaW5fc3RyZWFtLCBpbnQgb3V0LCBpbnQgZXJyKTsKK3NzaXplX3Qgc2VuZF9zaWRlYmFuZChpbnQgZmQsIGludCBiYW5kLCBjb25zdCBjaGFyICpkYXRhLCBzc2l6ZV90IHN6LCBpbnQgcGFja2V0X21heCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3NoLWZldGNoLmMgYi9zc2gtZmV0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY1MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3NoLWZldGNoLmMKQEAgLTAsMCArMSwxNjYgQEAKKyNpZm5kZWYgQ09VTlRFUlBBUlRfRU5WX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfRU5WX05BTUUgIkdJVF9TU0hfVVBMT0FEIgorI2VuZGlmCisjaWZuZGVmIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRQorI2RlZmluZSBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUgImdpdC1zc2gtdXBsb2FkIgorI2VuZGlmCisjaWZuZGVmIE1ZX1BST0dSQU1fTkFNRQorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtZmV0Y2giCisjZW5kaWYKKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicnNoLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBpbnQgZmRfaW47CitzdGF0aWMgaW50IGZkX291dDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb247CitzdGF0aWMgdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKKworc3RhdGljIGludCBwcmVmZXRjaGVzOworCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICppbl90cmFuc2l0Oworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKmVuZF9vZl90cmFuc2l0ID0gJmluX3RyYW5zaXQ7CisKK3ZvaWQgcHJlZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyIHR5cGUgPSAnbyc7CisJc3RydWN0IG9iamVjdF9saXN0ICpub2RlOworCWlmIChwcmVmZXRjaGVzID4gMTAwKSB7CisJCWZldGNoKGluX3RyYW5zaXQtPml0ZW0tPnNoYTEpOworCX0KKwlub2RlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisJbm9kZS0+bmV4dCA9IE5VTEw7CisJbm9kZS0+aXRlbSA9IGxvb2t1cF91bmtub3duX29iamVjdChzaGExKTsKKwkqZW5kX29mX3RyYW5zaXQgPSBub2RlOworCWVuZF9vZl90cmFuc2l0ID0gJm5vZGUtPm5leHQ7CisJLyogWFhYOiB3aGF0IGlmIHRoZXNlIHdyaXRlcyBmYWlsPyAqLworCXdyaXRlX2luX2Z1bGwoZmRfb3V0LCAmdHlwZSwgMSk7CisJd3JpdGVfaW5fZnVsbChmZF9vdXQsIHNoYTEsIDIwKTsKKwlwcmVmZXRjaGVzKys7Cit9CisKK3N0YXRpYyBjaGFyIGNvbm5fYnVmWzQwOTZdOworc3RhdGljIHNpemVfdCBjb25uX2J1Zl9wb3NuOworCitpbnQgZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0OworCXNpZ25lZCBjaGFyIHJlbW90ZTsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnRlbXA7CisKKwlpZiAoaGFzaGNtcChzaGExLCBpbl90cmFuc2l0LT5pdGVtLT5zaGExKSkgeworCQkvKiB3ZSBtdXN0IGhhdmUgYWxyZWFkeSBmZXRjaGVkIGl0IHRvIGNsZWFuIHRoZSBxdWV1ZSAqLworCQlyZXR1cm4gaGFzX3NoYTFfZmlsZShzaGExKSA/IDAgOiAtMTsKKwl9CisJcHJlZmV0Y2hlcy0tOworCXRlbXAgPSBpbl90cmFuc2l0OworCWluX3RyYW5zaXQgPSBpbl90cmFuc2l0LT5uZXh0OworCWlmICghaW5fdHJhbnNpdCkKKwkJZW5kX29mX3RyYW5zaXQgPSAmaW5fdHJhbnNpdDsKKwlmcmVlKHRlbXApOworCisJaWYgKGNvbm5fYnVmX3Bvc24pIHsKKwkJcmVtb3RlID0gY29ubl9idWZbMF07CisJCW1lbW1vdmUoY29ubl9idWYsIGNvbm5fYnVmICsgMSwgLS1jb25uX2J1Zl9wb3NuKTsKKwl9IGVsc2UgeworCQlpZiAoeHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKwkJCXJldHVybiAtMTsKKwl9CisJLyogZnByaW50ZihzdGRlcnIsICJHb3QgJWRcbiIsIHJlbW90ZSk7ICovCisJaWYgKHJlbW90ZSA8IDApCisJCXJldHVybiByZW1vdGU7CisJcmV0ID0gd3JpdGVfc2hhMV9mcm9tX2ZkKHNoYTEsIGZkX2luLCBjb25uX2J1ZiwgNDA5NiwgJmNvbm5fYnVmX3Bvc24pOworCWlmICghcmV0KQorCQlwdWxsX3NheSgiZ290ICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfdmVyc2lvbih2b2lkKQoreworCWNoYXIgdHlwZSA9ICd2JzsKKwlpZiAod3JpdGVfaW5fZnVsbChmZF9vdXQsICZ0eXBlLCAxKSAhPSAxIHx8CisJICAgIHdyaXRlX2luX2Z1bGwoZmRfb3V0LCAmbG9jYWxfdmVyc2lvbiwgMSkpIHsKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCByZXF1ZXN0IHZlcnNpb24gZnJvbSByZW1vdGUgZW5kIik7CisJfQorCWlmICh4cmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCByZWFkIHZlcnNpb24gZnJvbSByZW1vdGUgZW5kIik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzaWduZWQgY2hhciByZW1vdGU7CisJY2hhciB0eXBlID0gJ3InOworCWludCBsZW5ndGggPSBzdHJsZW4ocmVmKSArIDE7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmRfb3V0LCAmdHlwZSwgMSkgIT0gMSB8fAorCSAgICB3cml0ZV9pbl9mdWxsKGZkX291dCwgcmVmLCBsZW5ndGgpICE9IGxlbmd0aCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlYWRfaW5fZnVsbChmZF9pbiwgJnJlbW90ZSwgMSkgIT0gMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZW1vdGUgPCAwKQorCQlyZXR1cm4gcmVtb3RlOworCWlmIChyZWFkX2luX2Z1bGwoZmRfaW4sIHNoYTEsIDIwKSAhPSAyMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBzc2hfZmV0Y2hfdXNhZ2VbXSA9CisgIE1ZX1BST0dSQU1fTkFNRQorICAiIFstY10gWy10XSBbLWFdIFstdl0gWy0tcmVjb3Zlcl0gWy13IHJlZl0gY29tbWl0LWlkIHVybCI7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqd3JpdGVfcmVmID0gTlVMTDsKKwljaGFyICpjb21taXRfaWQ7CisJY2hhciAqdXJsOworCWludCBhcmcgPSAxOworCWNvbnN0IGNoYXIgKnByb2c7CisKKwlwcm9nID0gZ2V0ZW52KCJHSVRfU1NIX1BVU0giKTsKKwlpZiAoIXByb2cpIHByb2cgPSAiZ2l0LXNzaC11cGxvYWQiOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKwkJaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndCcpIHsKKwkJCWdldF90cmVlID0gMTsKKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdhJykgeworCQkJZ2V0X2FsbCA9IDE7CisJCQlnZXRfdHJlZSA9IDE7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd3JykgeworCQkJd3JpdGVfcmVmID0gYXJndlthcmcgKyAxXTsKKwkJCWFyZysrOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKwkJCWdldF9yZWNvdmVyID0gMTsKKwkJfQorCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CisJCXVzYWdlKHNzaF9mZXRjaF91c2FnZSk7CisJCXJldHVybiAxOworCX0KKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisJdXJsID0gYXJndlthcmcgKyAxXTsKKworCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgcHJvZywgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZ2V0X3ZlcnNpb24oKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAocHVsbCgxLCAmY29tbWl0X2lkLCAmd3JpdGVfcmVmLCB1cmwpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3NoLXB1bGwuYyBiL3NzaC1wdWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4Y2U0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NzaC1wdWxsLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIENPVU5URVJQQVJUX0VOVl9OQU1FICJHSVRfU1NIX1BVU0giCisjZGVmaW5lIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1wdXNoIgorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtcHVsbCIKKyNpbmNsdWRlICJzc2gtZmV0Y2guYyIKZGlmZiAtLWdpdCBhL3NzaC1wdXNoLmMgYi9zc2gtcHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjJkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zc2gtcHVzaC5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBDT1VOVEVSUEFSVF9FTlZfTkFNRSAiR0lUX1NTSF9QVUxMIgorI2RlZmluZSBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUgImdpdC1zc2gtcHVsbCIKKyNkZWZpbmUgTVlfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXB1c2giCisjaW5jbHVkZSAic3NoLXVwbG9hZC5jIgpkaWZmIC0tZ2l0IGEvc3NoLXVwbG9hZC5jIGIvc3NoLXVwbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGQ0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zc2gtdXBsb2FkLmMKQEAgLTAsMCArMSwxNDMgQEAKKyNpZm5kZWYgQ09VTlRFUlBBUlRfRU5WX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfRU5WX05BTUUgIkdJVF9TU0hfRkVUQ0giCisjZW5kaWYKKyNpZm5kZWYgQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FCisjZGVmaW5lIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1mZXRjaCIKKyNlbmRpZgorI2lmbmRlZiBNWV9QUk9HUkFNX05BTUUKKyNkZWZpbmUgTVlfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXVwbG9hZCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyc2guaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb247CisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworc3RhdGljIGludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisJc3NpemVfdCBzaXplOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc2lnbmVkIGNoYXIgcmVtb3RlOworCisJc2l6ZSA9IHJlYWRfaW5fZnVsbChmZF9pbiwgc2hhMSwgMjApOworCWlmIChzaXplIDwgMCkgeworCQlwZXJyb3IoImdpdC1zc2gtdXBsb2FkOiByZWFkICIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghc2l6ZSkKKwkJcmV0dXJuIC0xOworCQorCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIlNlcnZpbmcgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXJlbW90ZSA9IDA7CisJCisJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC11cGxvYWQ6IGNvdWxkIG5vdCBmaW5kICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCQlyZW1vdGUgPSAtMTsKKwl9CisJCisJaWYgKHdyaXRlX2luX2Z1bGwoZmRfb3V0LCAmcmVtb3RlLCAxKSAhPSAxKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAocmVtb3RlIDwgMCkKKwkJcmV0dXJuIDA7CisJCisJcmV0dXJuIHdyaXRlX3NoYTFfdG9fZmQoZmRfb3V0LCBzaGExKTsKK30KKworc3RhdGljIGludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKK3sKKwlpZiAoeHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKQorCQlyZXR1cm4gLTE7CisJd3JpdGVfaW5fZnVsbChmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJ2ZV9yZWYoaW50IGZkX2luLCBpbnQgZmRfb3V0KQoreworCWNoYXIgcmVmW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBwb3NuID0gMDsKKwlzaWduZWQgY2hhciByZW1vdGUgPSAwOworCWRvIHsKKwkJaWYgKHBvc24gPj0gUEFUSF9NQVggfHwgeHJlYWQoZmRfaW4sIHJlZiArIHBvc24sIDEpIDwgMSkKKwkJCXJldHVybiAtMTsKKwkJcG9zbisrOworCX0gd2hpbGUgKHJlZltwb3NuIC0gMV0pOworCisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgcmVmKTsKKworCWlmIChnZXRfcmVmX3NoYTEocmVmLCBzaGExKSkKKwkJcmVtb3RlID0gLTE7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmRfb3V0LCAmcmVtb3RlLCAxKSAhPSAxKQorCQlyZXR1cm4gMDsKKwlpZiAocmVtb3RlKQorCQlyZXR1cm4gMDsKKwl3cml0ZV9pbl9mdWxsKGZkX291dCwgc2hhMSwgMjApOworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzZXJ2aWNlKGludCBmZF9pbiwgaW50IGZkX291dCkgeworCWNoYXIgdHlwZTsKKwlzc2l6ZV90IHJldHZhbDsKKwlkbyB7CisJCXJldHZhbCA9IHhyZWFkKGZkX2luLCAmdHlwZSwgMSk7CisJCWlmIChyZXR2YWwgPCAxKSB7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlwZXJyb3IoImdpdC1zc2gtdXBsb2FkOiByZWFkICIpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0eXBlID09ICd2JyAmJiBzZXJ2ZV92ZXJzaW9uKGZkX2luLCBmZF9vdXQpKQorCQkJcmV0dXJuOworCQlpZiAodHlwZSA9PSAnbycgJiYgc2VydmVfb2JqZWN0KGZkX2luLCBmZF9vdXQpKQorCQkJcmV0dXJuOworCQlpZiAodHlwZSA9PSAncicgJiYgc2VydmVfcmVmKGZkX2luLCBmZF9vdXQpKQorCQkJcmV0dXJuOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBzc2hfcHVzaF91c2FnZVtdID0KKwlNWV9QUk9HUkFNX05BTUUgIiBbLWNdIFstdF0gWy1hXSBbLXcgcmVmXSBjb21taXQtaWQgdXJsIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBhcmcgPSAxOworICAgICAgICBjaGFyICpjb21taXRfaWQ7CisgICAgICAgIGNoYXIgKnVybDsKKwlpbnQgZmRfaW4sIGZkX291dDsKKwljb25zdCBjaGFyICpwcm9nOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBoZXhbNDFdOworCisJcHJvZyA9IGdldGVudihDT1VOVEVSUEFSVF9FTlZfTkFNRSk7CisJaWYgKCFwcm9nKSBwcm9nID0gQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworCQlpZiAoYXJndlthcmddWzFdID09ICd3JykKKwkJCWFyZysrOworICAgICAgICAgICAgICAgIGFyZysrOworICAgICAgICB9CisJaWYgKGFyZ2MgPCBhcmcgKyAyKQorCQl1c2FnZShzc2hfcHVzaF91c2FnZSk7CisJY29tbWl0X2lkID0gYXJndlthcmddOworCXVybCA9IGFyZ3ZbYXJnICsgMV07CisJaWYgKGdldF9zaGExKGNvbW1pdF9pZCwgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBjb21taXRfaWQpOworCW1lbWNweShoZXgsIHNoYTFfdG9faGV4KHNoYTEpLCBzaXplb2YoaGV4KSk7CisJYXJndlthcmddID0gaGV4OworCisJaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCBwcm9nLCB1cmwsIGFyZywgYXJndiArIDEpKQorCQlyZXR1cm4gMTsKKworCXNlcnZpY2UoZmRfaW4sIGZkX291dCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zdHJidWYuYyBiL3N0cmJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTRiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJidWYuYwpAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKwordm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXNiLT5idWYgPSBOVUxMOworCXNiLT5lb2YgPSBzYi0+YWxsb2MgPSBzYi0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgc3RyYnVmX2JlZ2luKHN0cnVjdCBzdHJidWYgKnNiKSB7CisJZnJlZShzYi0+YnVmKTsKKwlzdHJidWZfaW5pdChzYik7Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBzdHJidWZfYWRkKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgY2gpIHsKKwlpZiAoc2ItPmFsbG9jIDw9IHNiLT5sZW4pIHsKKwkJc2ItPmFsbG9jID0gc2ItPmFsbG9jICogMyAvIDIgKyAxNjsKKwkJc2ItPmJ1ZiA9IHhyZWFsbG9jKHNiLT5idWYsIHNiLT5hbGxvYyk7CisJfQorCXNiLT5idWZbc2ItPmxlbisrXSA9IGNoOworfQorCitzdGF0aWMgdm9pZCBzdHJidWZfZW5kKHN0cnVjdCBzdHJidWYgKnNiKSB7CisJc3RyYnVmX2FkZChzYiwgMCk7Cit9CisKK3ZvaWQgcmVhZF9saW5lKHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IHRlcm0pIHsKKwlpbnQgY2g7CisJc3RyYnVmX2JlZ2luKHNiKTsKKwlpZiAoZmVvZihmcCkpIHsKKwkJc2ItPmVvZiA9IDE7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSB0ZXJtKQorCQkJYnJlYWs7CisJCXN0cmJ1Zl9hZGQoc2IsIGNoKTsKKwl9CisJaWYgKGNoID09IEVPRiAmJiBzYi0+bGVuID09IDApCisJCXNiLT5lb2YgPSAxOworCXN0cmJ1Zl9lbmQoc2IpOworfQorCmRpZmYgLS1naXQgYS9zdHJidWYuaCBiL3N0cmJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2MwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJidWYuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIFNUUkJVRl9ICisjZGVmaW5lIFNUUkJVRl9ICitzdHJ1Y3Qgc3RyYnVmIHsKKwlpbnQgYWxsb2M7CisJaW50IGxlbjsKKwlpbnQgZW9mOworCWNoYXIgKmJ1ZjsKK307CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9pbml0KHN0cnVjdCBzdHJidWYgKik7CitleHRlcm4gdm9pZCByZWFkX2xpbmUoc3RydWN0IHN0cmJ1ZiAqLCBGSUxFICosIGludCk7CisKKyNlbmRpZiAvKiBTVFJCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3ltbGlua3MuYyBiL3N5bWxpbmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5YWNlNgotLS0gL2Rldi9udWxsCisrKyBiL3N5bWxpbmtzLmMKQEAgLTAsMCArMSw0OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBoYXNfc3ltbGlua19sZWFkaW5nX3BhdGgoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqbGFzdF9zeW1saW5rKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY29uc3QgY2hhciAqc3AsICplcDsKKwljaGFyICpkcDsKKworCXNwID0gbmFtZTsKKwlkcCA9IHBhdGg7CisKKwlpZiAobGFzdF9zeW1saW5rICYmICpsYXN0X3N5bWxpbmspIHsKKwkJc2l6ZV90IGxhc3RfbGVuID0gc3RybGVuKGxhc3Rfc3ltbGluayk7CisJCXNpemVfdCBsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChsYXN0X2xlbiA8IGxlbiAmJgorCQkgICAgIXN0cm5jbXAobmFtZSwgbGFzdF9zeW1saW5rLCBsYXN0X2xlbikgJiYKKwkJICAgIG5hbWVbbGFzdF9sZW5dID09ICcvJykKKwkJCXJldHVybiAxOworCQkqbGFzdF9zeW1saW5rID0gJ1wwJzsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlzaXplX3QgbGVuOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQllcCA9IHN0cmNocihzcCwgJy8nKTsKKwkJaWYgKCFlcCkKKwkJCWJyZWFrOworCQlsZW4gPSBlcCAtIHNwOworCQlpZiAoUEFUSF9NQVggPD0gZHAgKyBsZW4gLSBwYXRoICsgMikKKwkJCXJldHVybiAwOyAvKiBuZXcgbmFtZSBpcyBsb25nZXIgdGhhbiB0aGF0Pz8/ICovCisJCW1lbWNweShkcCwgc3AsIGxlbik7CisJCWRwW2xlbl0gPSAwOworCisJCWlmIChsc3RhdChwYXRoLCAmc3QpKQorCQkJcmV0dXJuIDA7CisJCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQlpZiAobGFzdF9zeW1saW5rKQorCQkJCXN0cmNweShsYXN0X3N5bWxpbmssIHBhdGgpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlkcFtsZW4rK10gPSAnLyc7CisJCWRwID0gZHAgKyBsZW47CisJCXNwID0gZXAgKyAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3QvLmdpdGlnbm9yZSBiL3QvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQ2N2MwCi0tLSAvZGV2L251bGwKKysrIGIvdC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3RyYXNoCmRpZmYgLS1naXQgYS90L01ha2VmaWxlIGIvdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUzODUwCi0tLSAvZGV2L251bGwKKysrIGIvdC9NYWtlZmlsZQpAQCAtMCwwICsxLDMxIEBACisjIFJ1biB0ZXN0cworIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKworI0dJVF9URVNUX09QVFM9LS12ZXJib3NlIC0tZGVidWcKK1NIRUxMX1BBVEggPz0gJChTSEVMTCkKK1RBUiA/PSAkKFRBUikKKworIyBTaGVsbCBxdW90ZTsKK1NIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorCitUID0gJCh3aWxkY2FyZCB0WzAtOV1bMC05XVswLTldWzAtOV0tKi5zaCkKK1RTVk4gPSAkKHdpbGRjYXJkIHQ5MVswLTldWzAtOV0tKi5zaCkKKworYWxsOiAkKFQpIGNsZWFuCisKKyQoVCk6CisJQGVjaG8gIioqKiAkQCAqKioiOyBHSVRfQ09ORklHPS5naXQvY29uZmlnICckKFNIRUxMX1BBVEhfU1EpJyAkQCAkKEdJVF9URVNUX09QVFMpCisKK2NsZWFuOgorCXJtIC1mciB0cmFzaAorCisjIHdlIGNhbiB0ZXN0IE5PX09QVElNSVpFX0NPTU1JVFMgaW5kZXBlbmRlbnRseSBvZiBMQ19BTEwKK2Z1bGwtc3ZuLXRlc3Q6CisJJChNQUtFKSAkKFRTVk4pIEdJVF9TVk5fTk9fT1BUSU1JWkVfQ09NTUlUUz0xIExDX0FMTD1DCisJJChNQUtFKSAkKFRTVk4pIEdJVF9TVk5fTk9fT1BUSU1JWkVfQ09NTUlUUz0wIExDX0FMTD1lbl9VUy5VVEYtOAorCisuUEhPTlk6ICQoVCkgY2xlYW4KKy5OT1RQQVJBTExFTDoKKwpkaWZmIC0tZ2l0IGEvdC9SRUFETUUgYi90L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmYyNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdC9SRUFETUUKQEAgLTAsMCArMSwyMTEgQEAKK0NvcmUgR0lUIFRlc3RzCis9PT09PT09PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBob2xkcyBtYW55IHRlc3Qgc2NyaXB0cyBmb3IgY29yZSBHSVQgdG9vbHMuICBUaGUKK2ZpcnN0IHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHJ1biB0aGUgdGVzdHMKK2FuZCByZWFkIHRoZWlyIG91dHB1dC4KKworV2hlbiBmaXhpbmcgdGhlIHRvb2xzIG9yIGFkZGluZyBlbmhhbmNlbWVudHMsIHlvdSBhcmUgc3Ryb25nbHkKK2VuY291cmFnZWQgdG8gYWRkIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvdmVyIHdoYXQgeW91IGFyZQordHJ5aW5nIHRvIGZpeCBvciBlbmhhbmNlLiAgVGhlIGxhdGVyIHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudAorZGVzY3JpYmVzIGhvdyB5b3VyIHRlc3Qgc2NyaXB0cyBzaG91bGQgYmUgb3JnYW5pemVkLgorCisKK1J1bm5pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGVhc2llc3Qgd2F5IHRvIHJ1biB0ZXN0cyBpcyB0byBzYXkgIm1ha2UiLiAgVGhpcyBydW5zIGFsbAordGhlIHRlc3RzLgorCisgICAgKioqIHQwMDAwLWJhc2ljLnNoICoqKgorICAgICogICBvayAxOiAuZ2l0L29iamVjdHMgc2hvdWxkIGJlIGVtcHR5IGFmdGVyIGdpdC1pbml0IGluIGFuIGVtcHR5IHJlcG8uCisgICAgKiAgIG9rIDI6IC5naXQvb2JqZWN0cyBzaG91bGQgaGF2ZSAyNTYgc3ViZGlyZWN0b3JpZXMuCisgICAgKiAgIG9rIDM6IGdpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbCBhZGRpbmcuCisgICAgLi4uCisgICAgKiAgIG9rIDIzOiBubyBkaWZmIGFmdGVyIGNoZWNrb3V0IGFuZCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaC4KKyAgICAqIHBhc3NlZCBhbGwgMjMgdGVzdChzKQorICAgICoqKiB0MDEwMC1lbnZpcm9ubWVudC1uYW1lcy5zaCAqKioKKyAgICAqICAgb2sgMTogdXNpbmcgb2xkIG5hbWVzIHNob3VsZCBpc3N1ZSB3YXJuaW5ncy4KKyAgICAqICAgb2sgMjogdXNpbmcgb2xkIG5hbWVzIGJ1dCBoYXZpbmcgbmV3IG5hbWVzIHNob3VsZCBub3QgaXNzdWUgd2FybmluZ3MuCisgICAgLi4uCisKK09yIHlvdSBjYW4gcnVuIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkgZnJvbSBjb21tYW5kIGxpbmUsIGxpa2UKK3RoaXM6CisKKyAgICAkIHNoIC4vdDMwMDEtbHMtZmlsZXMta2lsbGVkLnNoCisgICAgKiAgIG9rIDE6IGdpdC11cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuCisgICAgKiAgIG9rIDI6IGdpdC1scy1maWxlcyAtayB0byBzaG93IGtpbGxlZCBmaWxlcy4KKyAgICAqICAgb2sgMzogdmFsaWRhdGUgZ2l0LWxzLWZpbGVzIC1rIG91dHB1dC4KKyAgICAqIHBhc3NlZCBhbGwgMyB0ZXN0KHMpCisKK1lvdSBjYW4gcGFzcyAtLXZlcmJvc2UgKG9yIC12KSwgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUKKyhvciAtaSkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHRoZSB0ZXN0LgorCistLXZlcmJvc2U6OgorCVRoaXMgbWFrZXMgdGhlIHRlc3QgbW9yZSB2ZXJib3NlLiAgU3BlY2lmaWNhbGx5LCB0aGUKKwljb21tYW5kIGJlaW5nIHJ1biBhbmQgdGhlaXIgb3V0cHV0IGlmIGFueSBhcmUgYWxzbworCW91dHB1dC4KKworLS1kZWJ1Zzo6CisJVGhpcyBtYXkgaGVscCB0aGUgcGVyc29uIHdobyBpcyBkZXZlbG9waW5nIGEgbmV3IHRlc3QuCisJSXQgY2F1c2VzIHRoZSBjb21tYW5kIGRlZmluZWQgd2l0aCB0ZXN0X2RlYnVnIHRvIHJ1bi4KKworLS1pbW1lZGlhdGU6OgorCVRoaXMgY2F1c2VzIHRoZSB0ZXN0IHRvIGltbWVkaWF0ZWx5IGV4aXQgdXBvbiB0aGUgZmlyc3QKKwlmYWlsZWQgdGVzdC4KKworCitOYW1pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLQorCitUaGUgdGVzdCBmaWxlcyBhcmUgbmFtZWQgYXM6CisKKwl0Tk5OTi1jb21tYW5kbmFtZS1kZXRhaWxzLnNoCisKK3doZXJlIE4gaXMgYSBkZWNpbWFsIGRpZ2l0LgorCitGaXJzdCBkaWdpdCB0ZWxscyB0aGUgZmFtaWx5OgorCisJMCAtIHRoZSBhYnNvbHV0ZSBiYXNpY3MgYW5kIGdsb2JhbCBzdHVmZgorCTEgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyBkYXRhYmFzZQorCTIgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyB0aGUgd29ya2luZyB0cmVlCisJMyAtIHRoZSBvdGhlciBiYXNpYyBjb21tYW5kcyAoZS5nLiBscy1maWxlcykKKwk0IC0gdGhlIGRpZmYgY29tbWFuZHMKKwk1IC0gdGhlIHB1bGwgYW5kIGV4cG9ydGluZyBjb21tYW5kcworCTYgLSB0aGUgcmV2aXNpb24gdHJlZSBjb21tYW5kcyAoZXZlbiBlLmcuIG1lcmdlLWJhc2UpCisJNyAtIHRoZSBwb3JjZWxhaW5pc2ggY29tbWFuZHMgY29uY2VybmluZyB0aGUgd29ya2luZyB0cmVlCisJOCAtIHRoZSBwb3JjZWxhaW5pc2ggY29tbWFuZHMgY29uY2VybmluZyBmb3JlbnNpY3MKKwk5IC0gdGhlIGdpdCB0b29scworCitTZWNvbmQgZGlnaXQgdGVsbHMgdGhlIHBhcnRpY3VsYXIgY29tbWFuZCB3ZSBhcmUgdGVzdGluZy4KKworVGhpcmQgZGlnaXQgKG9wdGlvbmFsbHkpIHRlbGxzIHRoZSBwYXJ0aWN1bGFyIHN3aXRjaCBvciBncm91cCBvZiBzd2l0Y2hlcword2UgYXJlIHRlc3RpbmcuCisKK0lmIHlvdSBjcmVhdGUgZmlsZXMgdW5kZXIgdC8gZGlyZWN0b3J5IChpLmUuIGhlcmUpIHRoYXQgaXMgbm90Cit0aGUgdG9wLWxldmVsIHRlc3Qgc2NyaXB0LCBuZXZlciBuYW1lIHRoZSBmaWxlIHRvIG1hdGNoIHRoZSBhYm92ZQorcGF0dGVybi4gIFRoZSBNYWtlZmlsZSBoZXJlIGNvbnNpZGVycyBhbGwgc3VjaCBmaWxlcyBhcyB0aGUKK3RvcC1sZXZlbCB0ZXN0IHNjcmlwdCBhbmQgdHJpZXMgdG8gcnVuIGFsbCBvZiB0aGVtLiAgQSBjYXJlIGlzCitlc3BlY2lhbGx5IG5lZWRlZCBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgY29tbW9uIHRlc3QgbGlicmFyeQorZmlsZSwgc2ltaWxhciB0byB0ZXN0LWxpYi5zaCwgYmVjYXVzZSBzdWNoIGEgbGlicmFyeSBmaWxlIG1heQorbm90IGJlIHN1aXRhYmxlIGZvciBzdGFuZGFsb25lIGV4ZWN1dGlvbi4KKworCitXcml0aW5nIFRlc3RzCistLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IHNjcmlwdCBpcyB3cml0dGVuIGFzIGEgc2hlbGwgc2NyaXB0LiAgSXQgc2hvdWxkIHN0YXJ0Cit3aXRoIHRoZSBzdGFuZGFyZCAiIyEvYmluL3NoIiB3aXRoIGNvcHlyaWdodCBub3RpY2VzLCBhbmQgYW4KK2Fzc2lnbm1lbnQgdG8gdmFyaWFibGUgJ3Rlc3RfZGVzY3JpcHRpb24nLCBsaWtlIHRoaXM6CisKKwkjIS9iaW4vc2gKKwkjCisJIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKwkjCisKKwl0ZXN0X2Rlc2NyaXB0aW9uPSd4eHggdGVzdCAob3B0aW9uIC0tZnJvdHopCisKKwlUaGlzIHRlc3QgcmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBjYWNoZQorCWFuZCB0cmllcyB0byBydW4gZ2l0LWxzLWZpbGVzIHdpdGggb3B0aW9uIC0tZnJvdHouJworCisKK1NvdXJjZSAndGVzdC1saWIuc2gnCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciBhc3NpZ25pbmcgdGVzdF9kZXNjcmlwdGlvbiwgdGhlIHRlc3Qgc2NyaXB0IHNob3VsZCBzb3VyY2UKK3Rlc3QtbGliLnNoIGxpa2UgdGhpczoKKworCS4gLi90ZXN0LWxpYi5zaAorCitUaGlzIHRlc3QgaGFybmVzcyBsaWJyYXJ5IGRvZXMgdGhlIGZvbGxvd2luZyB0aGluZ3M6CisKKyAtIElmIHRoZSBzY3JpcHQgaXMgaW52b2tlZCB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudCAtLWhlbHAKKyAgIChvciAtaCksIGl0IHNob3dzIHRoZSB0ZXN0X2Rlc2NyaXB0aW9uIGFuZCBleGl0cy4KKworIC0gQ3JlYXRlcyBhbiBlbXB0eSB0ZXN0IGRpcmVjdG9yeSB3aXRoIGFuIGVtcHR5IC5naXQvb2JqZWN0cworICAgZGF0YWJhc2UgYW5kIGNoZGlyKDIpIGludG8gaXQuICBUaGlzIGRpcmVjdG9yeSBpcyAndC90cmFzaCcKKyAgIGlmIHlvdSBtdXN0IGtub3csIGJ1dCBJIGRvIG5vdCB0aGluayB5b3UgY2FyZS4KKworIC0gRGVmaW5lcyBzdGFuZGFyZCB0ZXN0IGhlbHBlciBmdW5jdGlvbnMgZm9yIHlvdXIgc2NyaXB0cyB0bworICAgdXNlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBkZXNpZ25lZCB0byBtYWtlIGFsbCBzY3JpcHRzIGJlaGF2ZQorICAgY29uc2lzdGVudGx5IHdoZW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAtLXZlcmJvc2UgKG9yIC12KSwKKyAgIC0tZGVidWcgKG9yIC1kKSwgYW5kIC0taW1tZWRpYXRlIChvciAtaSkgaXMgZ2l2ZW4uCisKKworRW5kIHdpdGggdGVzdF9kb25lCistLS0tLS0tLS0tLS0tLS0tLS0KKworWW91ciBzY3JpcHQgd2lsbCBiZSBhIHNlcXVlbmNlIG9mIHRlc3RzLCB1c2luZyBoZWxwZXIgZnVuY3Rpb25zCitmcm9tIHRoZSB0ZXN0IGhhcm5lc3MgbGlicmFyeS4gIEF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdCwgY2FsbAorJ3Rlc3RfZG9uZScuCisKKworVGVzdCBoYXJuZXNzIGxpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBhIGhhbmRmdWwgaGVscGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSB0ZXN0IGhhcm5lc3MKK2xpYnJhcnkgZm9yIHlvdXIgc2NyaXB0IHRvIHVzZS4KKworIC0gdGVzdF9leHBlY3Rfc3VjY2VzcyA8bWVzc2FnZT4gPHNjcmlwdD4KKworICAgVGhpcyB0YWtlcyB0d28gc3RyaW5ncyBhcyBwYXJhbWV0ZXIsIGFuZCBldmFsdWF0ZXMgdGhlCisgICA8c2NyaXB0Pi4gIElmIGl0IHlpZWxkcyBzdWNjZXNzLCB0ZXN0IGlzIGNvbnNpZGVyZWQKKyAgIHN1Y2Nlc3NmdWwuICA8bWVzc2FnZT4gc2hvdWxkIHN0YXRlIHdoYXQgaXQgaXMgdGVzdGluZy4KKworICAgRXhhbXBsZToKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSAgICAnZ2l0LXdyaXRlLXRyZWUgc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgdHJlZS4nIFwKKwkgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSknCisKKyAtIHRlc3RfZXhwZWN0X2ZhaWx1cmUgPG1lc3NhZ2U+IDxzY3JpcHQ+CisKKyAgIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHRlc3RfZXhwZWN0X3N1Y2Nlc3MuICBJZiA8c2NyaXB0PgorICAgeWllbGRzIHN1Y2Nlc3MsIHRlc3QgaXMgY29uc2lkZXJlZCBhIGZhaWx1cmUuCisKKyAgIEV4YW1wbGU6CisKKwl0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbCBhZGRpbmcuJyBcCisJICAgICdnaXQtdXBkYXRlLWluZGV4IHNob3VsZC1iZS1lbXB0eScKKworIC0gdGVzdF9kZWJ1ZyA8c2NyaXB0PgorCisgICBUaGlzIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCA8c2NyaXB0PiwgYW5kIGV2YWx1YXRlcyBpdCBvbmx5CisgICB3aGVuIHRoZSB0ZXN0IHNjcmlwdCBpcyBzdGFydGVkIHdpdGggLS1kZWJ1ZyBjb21tYW5kIGxpbmUKKyAgIGFyZ3VtZW50LiAgVGhpcyBpcyBwcmltYXJpbHkgbWVhbnQgZm9yIHVzZSBkdXJpbmcgdGhlCisgICBkZXZlbG9wbWVudCBvZiBhIG5ldyB0ZXN0IHNjcmlwdC4KKworIC0gdGVzdF9kb25lCisKKyAgIFlvdXIgdGVzdCBzY3JpcHQgbXVzdCBoYXZlIHRlc3RfZG9uZSBhdCB0aGUgZW5kLiAgSXRzIHB1cnBvc2UKKyAgIGlzIHRvIHN1bW1hcml6ZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIGluIHRoZSB0ZXN0IHNjcmlwdCBhbmQKKyAgIGV4aXQgd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorCisKK1RpcHMgZm9yIFdyaXRpbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgd2l0aCBhbnkgcHJvZ3JhbW1pbmcgcHJvamVjdHMsIGV4aXN0aW5nIHByb2dyYW1zIGFyZSB0aGUgYmVzdAorc291cmNlIG9mIHRoZSBpbmZvcm1hdGlvbi4gIEhvd2V2ZXIsIGRvIF9ub3RfIGVtdWxhdGUKK3QwMDAwLWJhc2ljLnNoIHdoZW4gd3JpdGluZyB5b3VyIHRlc3RzLiAgVGhlIHRlc3QgaXMgc3BlY2lhbCBpbgordGhhdCBpdCB0cmllcyB0byB2YWxpZGF0ZSB0aGUgdmVyeSBjb3JlIG9mIEdJVC4gIEZvciBleGFtcGxlLCBpdAora25vd3MgdGhhdCB0aGVyZSB3aWxsIGJlIDI1NiBzdWJkaXJlY3RvcmllcyB1bmRlciAuZ2l0L29iamVjdHMvLAorYW5kIGl0IGtub3dzIHRoYXQgdGhlIG9iamVjdCBJRCBvZiBhbiBlbXB0eSB0cmVlIGlzIGEgY2VydGFpbgorNDAtYnl0ZSBzdHJpbmcuICBUaGlzIGlzIGRlbGliZXJhdGVseSBkb25lIHNvIGluIHQwMDAwLWJhc2ljLnNoCitiZWNhdXNlIHRoZSB0aGluZ3MgdGhlIHZlcnkgYmFzaWMgY29yZSB0ZXN0IHRyaWVzIHRvIGFjaGlldmUgaXMKK3RvIHNlcnZlIGFzIGEgYmFzaXMgZm9yIHBlb3BsZSB3aG8gYXJlIGNoYW5naW5nIHRoZSBHSVQgaW50ZXJuYWwKK2RyYXN0aWNhbGx5LiAgRm9yIHRoZXNlIHBlb3BsZSwgYWZ0ZXIgbWFraW5nIGNlcnRhaW4gY2hhbmdlcywKK25vdCBzZWVpbmcgZmFpbHVyZXMgZnJvbSB0aGUgYmFzaWMgdGVzdCBfaXNfIGEgZmFpbHVyZS4gIEFuZAorc3VjaCBkcmFzdGljIGNoYW5nZXMgdG8gdGhlIGNvcmUgR0lUIHRoYXQgZXZlbiBjaGFuZ2VzIHRoZXNlCitvdGhlcndpc2Ugc3VwcG9zZWRseSBzdGFibGUgb2JqZWN0IElEcyBzaG91bGQgYmUgYWNjb21wYW5pZWQgYnkKK2FuIHVwZGF0ZSB0byB0MDAwMC1iYXNpYy5zaC4KKworSG93ZXZlciwgb3RoZXIgdGVzdHMgdGhhdCBzaW1wbHkgcmVseSBvbiBiYXNpYyBwYXJ0cyBvZiB0aGUgY29yZQorR0lUIHdvcmtpbmcgcHJvcGVybHkgc2hvdWxkIG5vdCBoYXZlIHRoYXQgbGV2ZWwgb2YgaW50aW1hdGUKK2tub3dsZWRnZSBvZiB0aGUgY29yZSBHSVQgaW50ZXJuYWxzLiAgSWYgYWxsIHRoZSB0ZXN0IHNjcmlwdHMKK2hhcmRjb2RlZCB0aGUgb2JqZWN0IElEcyBsaWtlIHQwMDAwLWJhc2ljLnNoIGRvZXMsIHRoYXQgZGVmZWF0cwordGhlIHB1cnBvc2Ugb2YgdDAwMDAtYmFzaWMuc2gsIHdoaWNoIGlzIHRvIGlzb2xhdGUgdGhhdCBsZXZlbCBvZgordmFsaWRhdGlvbiBpbiBvbmUgcGxhY2UuICBZb3VyIHRlc3QgYWxzbyBlbmRzIHVwIG5lZWRpbmcKK3VwZGF0aW5nIHdoZW4gc3VjaCBhIGNoYW5nZSB0byB0aGUgaW50ZXJuYWwgaGFwcGVucywgc28gZG8gX25vdF8KK2RvIGl0IGFuZCBsZWF2ZSB0aGUgbG93IGxldmVsIG9mIHZhbGlkYXRpb24gdG8gdDAwMDAtYmFzaWMuc2guCmRpZmYgLS1naXQgYS90L2Fubm90YXRlLXRlc3RzLnNoIGIvdC9hbm5vdGF0ZS10ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNiMjczCi0tLSAvZGV2L251bGwKKysrIGIvdC9hbm5vdGF0ZS10ZXN0cy5zaApAQCAtMCwwICsxLDEyMyBAQAorIyBUaGlzIGZpbGUgaXNuJ3QgdXNlZCBhcyBhIHRlc3Qgc2NyaXB0IGRpcmVjdGx5LCBpbnN0ZWFkIGl0IGlzCisjIHNvdXJjZWQgZnJvbSB0ODAwMS1hbm5vdGF0ZS5zaCBhbmQgdDgwMDEtYmxhbWUuc2guCisKK2NoZWNrX2NvdW50ICgpIHsKKwloZWFkPQorCWNhc2UgIiQxIiBpbiAtaCkgaGVhZD0iJDIiOyBzaGlmdDsgc2hpZnQgOzsgZXNhYworCWVjaG8gIiRQUk9HIGZpbGUgJGhlYWQiID4mNAorCSRQUk9HIGZpbGUgJGhlYWQgPi5yZXN1bHQgfHwgcmV0dXJuIDEKKwljYXQgLnJlc3VsdCB8IHBlcmwgLWUgJworCQlteSAlZXhwZWN0ID0gKEBBUkdWKTsKKwkJbXkgJWNvdW50ID0gKCk7CisJCXdoaWxlICg8U1RESU4+KSB7CisJCQlpZiAoL15bMC05YS1mXStcdFwoKFteXHRdKylcdC8pIHsKKwkJCQlteSAkYXV0aG9yID0gJDE7CisJCQkJZm9yICgkYXV0aG9yKSB7IHMvXlxzKi8vOyBzL1xzKiQvLzsgfQorCQkJCWlmIChleGlzdHMgJGV4cGVjdHskYXV0aG9yfSkgeworCQkJCQkkY291bnR7JGF1dGhvcn0rKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXkgJGJhZCA9IDA7CisJCXdoaWxlIChteSAoJGF1dGhvciwgJGNvdW50KSA9IGVhY2ggJWNvdW50KSB7CisJCQlteSAkb2s7CisJCQlpZiAoJGV4cGVjdHskYXV0aG9yfSAhPSAkY291bnQpIHsKKwkJCQkkYmFkID0gMTsKKwkJCQkkb2sgPSAiYmFkIjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSRvayA9ICJnb29kIjsKKwkJCX0KKwkJCXByaW50IFNUREVSUiAiQXV0aG9yICRhdXRob3IgKGV4cGVjdGVkICRleHBlY3R7JGF1dGhvcn0sIGF0dHJpYnV0ZWQgJGNvdW50KSAkb2tcbiI7CisJCX0KKwkJZXhpdCgkYmFkKTsKKwknICIkQCIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyAiMUEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj5maWxlICYmCisgICAgIGdpdCBhZGQgZmlsZQorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIGFsbCBsaW5lcyBibGFtZWQgb24gQScgXAorICAgICdjaGVja19jb3VudCBBIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdTZXR1cCBuZXcgbGluZXMgYmxhbWVkIG9uIEInIFwKKyAgICAnZWNobyAiMkEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+PmZpbGUgJiYKKyAgICAgZWNobyAibGF6eSBkb2ciID4+IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCIiBnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgdHdvIG9uIEInIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMScgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMSBtYXN0ZXIgJiYKKyAgICAgZWNobyAiM0Egc2xvdyBncmVlbiBmb3gganVtcHMgaW50byB0aGUiID4+IGZpbGUgJiYKKyAgICAgZWNobyAid2VsbC4iID4+IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCMSIgZ2l0IGNvbW1pdCAtYSAtbSAiQnJhbmNoMS0xIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgdHdvIG9uIEIsIHR3byBvbiBCMScgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAyIEIxIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDInIFwKKyAgICAnZ2l0IGNoZWNrb3V0IC1iIGJyYW5jaDIgbWFzdGVyICYmCisgICAgIHNlZCAtZSAicy8yQSBxdWljayBicm93bi80QSBxdWljayBicm93biBsYXp5IGRvZy8iIDwgZmlsZSA+IGZpbGUubmV3ICYmCisgICAgIG12IGZpbGUubmV3IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCMiIgZ2l0IGNvbW1pdCAtYSAtbSAiQnJhbmNoMi0xIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgb25lIG9uIEIsIG9uZSBvbiBCMicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIyIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDMnIFwKKyAgICAnZ2l0IHB1bGwgLiBicmFuY2gxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgdHdvIG9uIEIxLCBvbmUgb24gQjInIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMSBCMSAyIEIyIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdBbm5vdGF0aW5nIGFuIG9sZCByZXZpc2lvbiB3b3JrcycgXAorICAgICdjaGVja19jb3VudCAtaCBtYXN0ZXIgQSAyIEIgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ2NoZWNrX2NvdW50IC1oIG1hc3Rlcl4gQSAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbWVyZ2Utc2V0dXAgcGFydCA0JyBcCisgICAgJ2VjaG8gImV2aWwgbWVyZ2UuIiA+PmZpbGUgJiYKKyAgICAgZ2l0IGNvbW1pdCAtYSAtLWFtZW5kJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgdHdvIG9uIEIxLCBvbmUgb24gQjIsIG9uZSBvbiBBIFUgVGhvcicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIxIDIgQjIgMSAiQSBVIFRob3IiIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhbiBpbmNvbXBsZXRlIGxpbmUgYWRkZWQnIFwKKyAgICAnZWNobyAiaW5jb21wbGV0ZSIgfCB0ciAtZCAiXFwwMTIiID4+ZmlsZSAmJgorICAgIEdJVF9BVVRIT1JfTkFNRT0iQyIgZ2l0IGNvbW1pdCAtYSAtbSAiSW5jb21wbGV0ZSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdXaXRoIGluY29tcGxldGUgbGluZXMuJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjEgMiBCMiAxICJBIFUgVGhvciIgMSBDIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzb21lIGVkaXQnIFwKKyAgICAnbXYgZmlsZSBmaWxlLm9yaWcgJiYKKyAgICBzZWQgLWUgInMvXjNBLzk5LyIgLWUgIi9eMUEvZCIgLWUgIi9eaW5jb21wbGV0ZS9kIiA8IGZpbGUub3JpZyA+IGZpbGUgJiYKKyAgICBlY2hvICJpbmNvbXBsZXRlIiB8IHRyIC1kICJcXDAxMiIgPj5maWxlICYmCisgICAgR0lUX0FVVEhPUl9OQU1FPSJEIiBnaXQgY29tbWl0IC1hIC1tICJlZGl0IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NvbWUgZWRpdCcgXAorICAgICdjaGVja19jb3VudCBBIDEgQiAxIEIxIDEgQjIgMSAiQSBVIFRob3IiIDEgQyAxIEQgMScKZGlmZiAtLWdpdCBhL3QvZGlmZi1saWIuc2ggYi90L2RpZmYtbGliLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjRmZTYKLS0tIC9kZXYvbnVsbAorKysgYi90L2RpZmYtbGliLnNoCkBAIC0wLDAgKzEsNDEgQEAKKzoKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCitzYW5pdGl6ZV9kaWZmX3Jhdz0nL146L3MvICciJF94NDAiJyAnIiRfeDQwIicgXChbQS1aXVwpWzAtOV0qCS8gWCBYIFwxIwkvJworY29tcGFyZV9kaWZmX3JhdyAoKSB7CisgICAgIyBXaGVuIGhldXJpc3RpY3MgYXJlIGltcHJvdmVkLCB0aGUgc2NvcmUgbnVtYmVycyB3b3VsZCBjaGFuZ2UuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBjb21wYXJpbmcuCisgICAgIyBBbHNvIHdlIGRvIG5vdCBjaGVjayBTSEExIGhhc2ggZ2VuZXJhdGlvbiBpbiB0aGlzIHRlc3QsIHdoaWNoCisgICAgIyBpcyBhIGpvYiBmb3IgdDAwMDAtYmFzaWMuc2gKKworICAgIHNlZCAtZSAiJHNhbml0aXplX2RpZmZfcmF3IiA8IiQxIiA+LnRtcC0xCisgICAgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXciIDwiJDIiID4udG1wLTIKKyAgICBnaXQgZGlmZiAudG1wLTEgLnRtcC0yICYmIHJtIC1mIC50bXAtMSAudG1wLTIKK30KKworc2FuaXRpemVfZGlmZl9yYXdfej0nL146L3MvICciJF94NDAiJyAnIiRfeDQwIicgXChbQS1aXVwpWzAtOV0qJC8gWCBYIFwxIy8nCitjb21wYXJlX2RpZmZfcmF3X3ogKCkgeworICAgICMgV2hlbiBoZXVyaXN0aWNzIGFyZSBpbXByb3ZlZCwgdGhlIHNjb3JlIG51bWJlcnMgd291bGQgY2hhbmdlLgorICAgICMgSWdub3JlIHRoZW0gd2hpbGUgY29tcGFyaW5nLgorICAgICMgQWxzbyB3ZSBkbyBub3QgY2hlY2sgU0hBMSBoYXNoIGdlbmVyYXRpb24gaW4gdGhpcyB0ZXN0LCB3aGljaAorICAgICMgaXMgYSBqb2IgZm9yIHQwMDAwLWJhc2ljLnNoCisKKyAgICB0ciAnXDAnICdcMDEyJyA8IiQxIiB8IHNlZCAtZSAiJHNhbml0aXplX2RpZmZfcmF3X3oiID4udG1wLTEKKyAgICB0ciAnXDAnICdcMDEyJyA8IiQyIiB8IHNlZCAtZSAiJHNhbml0aXplX2RpZmZfcmF3X3oiID4udG1wLTIKKyAgICBnaXQgZGlmZiAudG1wLTEgLnRtcC0yICYmIHJtIC1mIC50bXAtMSAudG1wLTIKK30KKworY29tcGFyZV9kaWZmX3BhdGNoICgpIHsKKyAgICAjIFdoZW4gaGV1cmlzdGljcyBhcmUgaW1wcm92ZWQsIHRoZSBzY29yZSBudW1iZXJzIHdvdWxkIGNoYW5nZS4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIGNvbXBhcmluZy4KKyAgICBzZWQgLWUgJworCS9eW2Rpc10qaW1pbGFyaXR5IGluZGV4IFswLTldKiUkL2QKKwkvXmluZGV4IFswLTlhLWZdKlwuXC5bMC05YS1mXS9kCisgICAgJyA8IiQxIiA+LnRtcC0xCisgICAgc2VkIC1lICcKKwkvXltkaXNdKmltaWxhcml0eSBpbmRleCBbMC05XSolJC9kCisJL15pbmRleCBbMC05YS1mXSpcLlwuWzAtOWEtZl0vZAorICAgICcgPCIkMiIgPi50bXAtMgorICAgIGdpdCBkaWZmIC50bXAtMSAudG1wLTIgJiYgcm0gLWYgLnRtcC0xIC50bXAtMgorfQpkaWZmIC0tZ2l0IGEvdC9saWItZ2l0LXN2bi5zaCBiL3QvbGliLWdpdC1zdm4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZTc4YwotLS0gL2Rldi9udWxsCisrKyBiL3QvbGliLWdpdC1zdm4uc2gKQEAgLTAsMCArMSw1MCBAQAorLiAuL3Rlc3QtbGliLnNoCisKK2lmIHRlc3QgLW4gIiROT19TVk5fVEVTVFMiCit0aGVuCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgTk9fU1ZOX1RFU1RTIGRlZmluZWQnIDoKKwl0ZXN0X2RvbmUKKwlleGl0CitmaQorCitHSVRfRElSPSRQV0QvLmdpdAorR0lUX1NWTl9ESVI9JEdJVF9ESVIvc3ZuL2dpdC1zdm4KK1NWTl9UUkVFPSRHSVRfU1ZOX0RJUi9zdm4tdHJlZQorCitzdm4gPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/IC1uZSAxCit0aGVuCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgc3ZuIG5vdCBmb3VuZCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCisKK3N2bnJlcG89JFBXRC9zdm5yZXBvCisKK3BlcmwgLXcgLWUgIgordXNlIFNWTjo6Q29yZTsKK3VzZSBTVk46OlJlcG9zOworXCRTVk46OkNvcmU6OlZFUlNJT04gZ3QgJzEuMS4wJyBvciBleGl0KDQyKTsKK3N5c3RlbShxdy9zdm5hZG1pbiBjcmVhdGUgLS1mcy10eXBlIGZzZnMvLCAnJHN2bnJlcG8nKSA9PSAwIG9yIGV4aXQoNDEpOworIiA+JjMgMj4mNAoreD0kPworaWYgdGVzdCAkeCAtbmUgMAordGhlbgorCWlmIHRlc3QgJHggLWVxIDQyOyB0aGVuCisJCWVycj0nUGVybCBTVk4gbGlicmFyaWVzIG11c3QgYmUgPj0gMS4xLjAnCisJZWxpZiB0ZXN0ICR4IC1lcSA0MTsgdGhlbgorCQllcnI9J3N2bmFkbWluIGZhaWxlZCB0byBjcmVhdGUgZnNmcyByZXBvc2l0b3J5JworCWVsc2UKKwkJZXJyPSdQZXJsIFNWTiBsaWJyYXJpZXMgbm90IGZvdW5kIG9yIHVudXNhYmxlLCBza2lwcGluZyB0ZXN0JworCWZpCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJGVyciIgOgorCXRlc3RfZG9uZQorCWV4aXQKK2ZpCisKK3Jhd3N2bnJlcG89IiRzdm5yZXBvIgorc3ZucmVwbz0iZmlsZTovLyRzdm5yZXBvIgorCitwb2tlKCkgeworCXRlc3QtY2htdGltZSArMSAiJDEiCit9CmRpZmYgLS1naXQgYS90L2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoIGIvdC9saWItcmVhZC10cmVlLW0tM3dheS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvdC9saWItcmVhZC10cmVlLW0tM3dheS5zaApAQCAtMCwwICsxLDE1OCBAQAorOiBJbmNsdWRlZCBmcm9tIHQxMDAwLXJlYWQtdHJlZS1tLTN3YXkuc2ggYW5kIG90aGVycworIyBPcmlnaW5hbCB0cmVlLgorbWtkaXIgWgorZm9yIGEgaW4gTiBEIE0KK2RvCisgICAgZm9yIGIgaW4gTiBEIE0KKyAgICBkbworICAgICAgICBwPSRhJGIKKwllY2hvIFRoaXMgaXMgJHAgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gPiRwCisJZWNobyBUaGlzIGlzIFovJHAgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gPlovJHAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkgICAgImFkZGluZyB0ZXN0IGZpbGUgJHAgYW5kIFovJHAiIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgJHAgJiYKKwkgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBaLyRwJworICAgIGRvbmUKK2RvbmUKK2VjaG8gVGhpcyBpcyBTUyBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLiA+U1MKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGRpbmcgdGVzdCBmaWxlIFNTJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgU1MnCitjYXQgPlRUIDw8XEVPRgorVGhpcyBpcyBhIHRyaXZpYWwgbWVyZ2Ugc2FtcGxlIHRleHQuCitCcmFuY2ggQSBpcyBleHBlY3RlZCB0byB1cGNhc2UgdGhpcyB3b3JkLCBoZXJlLgorVGhlcmUgYXJlIHNvbWUgZmlsbGVyIGxpbmVzIHRvIGF2b2lkIGRpZmYgY29udGV4dAorY29uZmxpY3RzIGhlcmUsCitsaWtlIHRoaXMgb25lLAorYW5kIHRoaXMgb25lLAorYW5kIHRoaXMgb25lIGlzIHlldCBhbm90aGVyIG9uZSBvZiB0aGVtLgorQXQgdGhlIHZlcnkgZW5kLCBoZXJlIGNvbWVzIGFub3RoZXIgbGluZSwgdGhhdCBpcwordGhlIHdvcmQsIGV4cGVjdGVkIHRvIGJlIHVwY2FzZWQgYnkgQnJhbmNoIEIuCitUaGlzIGNvbmNsdWRlcyB0aGUgdHJpdmlhbCBtZXJnZSBzYW1wbGUgZmlsZS4KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyB0ZXN0IGZpbGUgVFQnIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBUVCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIGluaXRpYWwgdHJlZScgXAorICAgICd0cmVlX089JChnaXQtd3JpdGUtdHJlZSknCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnJhbmNoIEEgYW5kIEIgbWFrZXMgdGhlIGNoYW5nZXMgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBtYXRyaXguCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnJhbmNoIEEKKwordG9fcmVtb3ZlPSQoZWNobyBEPyBaL0Q/KQorcm0gLWYgJHRvX3JlbW92ZQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAocmVtb3ZhbCknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAkdG9fcmVtb3ZlJworCitmb3IgcCBpbiBNPyBaL00/CitkbworICAgIGVjaG8gVGhpcyBpcyBtb2RpZmllZCAkcCBpbiB0aGUgYnJhbmNoIEEuID4kcAorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjaGFuZ2UgaW4gYnJhbmNoIEEgKG1vZGlmaWNhdGlvbiknIFwKKyAgICAgICAgImdpdC11cGRhdGUtaW5kZXggJHAiCitkb25lCisKK2ZvciBwIGluIEFOIEFBIFovQU4gWi9BQQorZG8KKyAgICBlY2hvIFRoaXMgaXMgYWRkZWQgJHAgaW4gdGhlIGJyYW5jaCBBLiA+JHAKKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hhbmdlIGluIGJyYW5jaCBBIChhZGRpdGlvbiknIFwKKwkiZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAkcCIKK2RvbmUKKworZWNobyBUaGlzIGlzIFNTIGZyb20gdGhlIG1vZGlmaWVkIHRyZWUuID5TUworZWNobyBUaGlzIGlzIExMIGZyb20gdGhlIG1vZGlmaWVkIHRyZWUuID5MTAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAoYWRkaXRpb24pJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBTUycKK212IFRUIFRULQorc2VkIC1lICcvQnJhbmNoIEEvcy93b3JkL1dPUkQvZycgPFRULSA+VFQKK3JtIC1mIFRULQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAoZWRpdCknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBUVCcKKworbWtkaXIgREYKK2VjaG8gQnJhbmNoIEEgbWFrZXMgYSBmaWxlIGF0IERGL0RGLCBjcmVhdGluZyBhIGRpcmVjdG9yeSBERi4gPkRGL0RGCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBBIChjaGFuZ2UgZmlsZSB0byBkaXJlY3RvcnkpJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgREYvREYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWNvcmRpbmcgYnJhbmNoIEEgdHJlZScgXAorICAgICd0cmVlX0E9JChnaXQtd3JpdGUtdHJlZSknCisJICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyYW5jaCBCCisjIFN0YXJ0IGZyb20gTworCitybSAtcmYgW05ETUFTTFRdW05ETUFTTFRdIFogREYKK21rZGlyIFoKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkaW5nIG9yaWdpbmFsIHRyZWUgYW5kIGNoZWNraW5nIG91dCcgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlX08gJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1hJworCit0b19yZW1vdmU9JChlY2hvID9EIFovP0QpCitybSAtZiAkdG9fcmVtb3ZlCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChyZW1vdmFsKScgXAorICAgICJnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlICR0b19yZW1vdmUiCisKK2ZvciBwIGluID9NIFovP00KK2RvCisgICAgZWNobyBUaGlzIGlzIG1vZGlmaWVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAobW9kaWZpY2F0aW9uKScgXAorCSJnaXQtdXBkYXRlLWluZGV4ICRwIgorZG9uZQorCitmb3IgcCBpbiBOQSBBQSBaL05BIFovQUEKK2RvCisgICAgZWNobyBUaGlzIGlzIGFkZGVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24pJyBcCisJImdpdC11cGRhdGUtaW5kZXggLS1hZGQgJHAiCitkb25lCitlY2hvIFRoaXMgaXMgU1MgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPlNTCitlY2hvIFRoaXMgaXMgTEwgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPkxMCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChhZGRpdGlvbiBhbmQgbW9kaWZpY2F0aW9uKScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggU1MnCittdiBUVCBUVC0KK3NlZCAtZSAnL0JyYW5jaCBCL3Mvd29yZC9XT1JEL2cnIDxUVC0gPlRUCitybSAtZiBUVC0KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEIgKG1vZGlmaWNhdGlvbiknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBUVCcKKworZWNobyBCcmFuY2ggQiBtYWtlcyBhIGZpbGUgYXQgREYuID5ERgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24gb2YgYSBmaWxlIHRvIGNvbmZsaWN0IHdpdGggZGlyZWN0b3J5KScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVjb3JkaW5nIGJyYW5jaCBCIHRyZWUnIFwKKyAgICAndHJlZV9CPSQoZ2l0LXdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAna2VlcCBjb250ZW50cyBvZiAzIHRyZWVzIGZvciBlYXN5IGFjY2VzcycgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfTyAmJgorICAgICBta2RpciAub3JpZy1PICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1PLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBta2RpciAub3JpZy1BICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1BLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBta2RpciAub3JpZy1CICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1CLyAtZiAtcSAtYScKZGlmZiAtLWdpdCBhL3QvdDAwMDAtYmFzaWMuc2ggYi90L3QwMDAwLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4NmRlNzAKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDAwLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjg0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgdGhlIHZlcnkgYmFzaWNzIHBhcnQgIzEuCisKK1RoZSByZXN0IG9mIHRoZSB0ZXN0IHN1aXRlIGRvZXMgbm90IGNoZWNrIHRoZSBiYXNpYyBvcGVyYXRpb24gb2YgZ2l0CitwbHVtYmluZyBjb21tYW5kcyB0byB3b3JrIHZlcnkgY2FyZWZ1bGx5LiAgVGhlaXIgam9iIGlzIHRvIGNvbmNlbnRyYXRlCitvbiB0cmlja3kgZmVhdHVyZXMgdGhhdCBjYXVzZWQgYnVncyBpbiB0aGUgcGFzdCB0byBkZXRlY3QgcmVncmVzc2lvbi4KKworVGhpcyB0ZXN0IHJ1bnMgdmVyeSBiYXNpYyBmZWF0dXJlcywgbGlrZSByZWdpc3RlcmluZyB0aGluZ3MgaW4gY2FjaGUsCit3cml0aW5nIHRyZWUsIGV0Yy4KKworTm90ZSB0aGF0IHRoaXMgdGVzdCAqZGVsaWJlcmF0ZWx5KiBoYXJkLWNvZGVzIG1hbnkgZXhwZWN0ZWQgb2JqZWN0CitJRHMuICBXaGVuIG9iamVjdCBJRCBjb21wdXRhdGlvbiBjaGFuZ2VzLCBsaWtlIGluIHRoZSBwcmV2aW91cyBjYXNlIG9mCitzd2FwcGluZyBjb21wcmVzc2lvbiBhbmQgaGFzaGluZyBvcmRlciwgdGhlIHBlcnNvbiB3aG8gaXMgbWFraW5nIHRoZQorbW9kaWZpY2F0aW9uICpzaG91bGQqIHRha2Ugbm90aWNlIGFuZCB1cGRhdGUgdGhlIHRlc3QgdmVjdG9ycyBoZXJlLgorJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEl0IGFwcGVhcnMgdGhhdCBwZW9wbGUgdHJ5IHRvIHJ1biB0ZXN0cyB3aXRob3V0IGJ1aWxkaW5nLi4uCisKKy4uL2dpdCA+L2Rldi9udWxsCitpZiB0ZXN0ICQ/ICE9IDEKK3RoZW4KKwllY2hvID4mMiAnWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgYnVpbHQgZ2l0IHlldC4nCisJZXhpdCAxCitmaQorCisuIC4vdGVzdC1saWIuc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBnaXQtaW5pdCBoYXMgYmVlbiBkb25lIGluIGFuIGVtcHR5IHJlcG9zaXRvcnkuCisjIG1ha2Ugc3VyZSBpdCBpcyBlbXB0eS4KKworZmluZCAuZ2l0L29iamVjdHMgLXR5cGUgZiAtcHJpbnQgPnNob3VsZC1iZS1lbXB0eQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJy5naXQvb2JqZWN0cyBzaG91bGQgYmUgZW1wdHkgYWZ0ZXIgZ2l0LWluaXQgaW4gYW4gZW1wdHkgcmVwby4nIFwKKyAgICAnY21wIC1zIC9kZXYvbnVsbCBzaG91bGQtYmUtZW1wdHknIAorCisjIGFsc28gaXQgc2hvdWxkIGhhdmUgMiBzdWJkaXJlY3Rvcmllczsgbm8gZmFuLW91dCBhbnltb3JlLCBwYWNrLCBhbmQgaW5mby4KKyMgMyBpcyBjb3VudGluZyAib2JqZWN0cyIgaXRzZWxmCitmaW5kIC5naXQvb2JqZWN0cyAtdHlwZSBkIC1wcmludCA+ZnVsbC1vZi1kaXJlY3RvcmllcwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJy5naXQvb2JqZWN0cyBzaG91bGQgaGF2ZSAzIHN1YmRpcmVjdG9yaWVzLicgXAorICAgICd0ZXN0ICQod2MgLWwgPCBmdWxsLW9mLWRpcmVjdG9yaWVzKSA9IDMnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmFzaWNzIG9mIHRoZSBiYXNpY3MKKworIyB1cGRhdGluZyBhIG5ldyBmaWxlIHdpdGhvdXQgLS1hZGQgc2hvdWxkIGZhaWwuCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRob3V0IC0tYWRkIHNob3VsZCBmYWlsIGFkZGluZy4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBzaG91bGQtYmUtZW1wdHknCisKKyMgYW5kIHdpdGggLS1hZGQgaXQgc2hvdWxkIHN1Y2NlZWQsIGV2ZW4gaWYgaXQgaXMgZW1wdHkgKGl0IHVzZWQgdG8gZmFpbCkuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRoIC0tYWRkIHNob3VsZCBzdWNjZWVkLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHNob3VsZC1iZS1lbXB0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZScgXAorICAgICd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpJworCisjIHdlIGtub3cgdGhlIHNoYXBlIGFuZCBjb250ZW50cyBvZiB0aGUgdHJlZSBhbmQga25vdyB0aGUgb2JqZWN0IElEIGZvciBpdC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvYmplY3QgSUQgb2YgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkdHJlZSIgPSA3YmI5NDM1NTlhMzA1YmRkNmJkZWUyY2VmNmU1ZGYyNDEzYzNkMzBhJworCisjIFJlbW92aW5nIHBhdGhzLgorcm0gLWYgc2hvdWxkLWJlLWVtcHR5IGZ1bGwtb2YtZGlyZWN0b3JpZXMKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHdpdGhvdXQgLS1yZW1vdmUgc2hvdWxkIGZhaWwgcmVtb3ZpbmcuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggc2hvdWxkLWJlLWVtcHR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRoIC0tcmVtb3ZlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSBzaG91bGQtYmUtZW1wdHknCisKKyMgRW1wdHkgdHJlZSBjYW4gYmUgd3JpdHRlbiB3aXRoIHJlY2VudCB3cml0ZS10cmVlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC13cml0ZS10cmVlIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IHRyZWUuJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvYmplY3QgSUQgb2YgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkdHJlZSIgPSA0YjgyNWRjNjQyY2I2ZWI5YTA2MGU1NGJmOGQ2OTI4OGZiZWU0OTA0JworCisjIFZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cworbWtkaXIgcGF0aDIgcGF0aDMgcGF0aDMvc3VicDMKK2ZvciBwIGluIHBhdGgwIHBhdGgyL2ZpbGUyIHBhdGgzL2ZpbGUzIHBhdGgzL3N1YnAzL2ZpbGUzCitkbworICAgIGVjaG8gImhlbGxvICRwIiA+JHAKKyAgICBsbiAtcyAiaGVsbG8gJHAiICR7cH1zeW0KK2RvbmUKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGRpbmcgdmFyaW91cyB0eXBlcyBvZiBvYmplY3RzIHdpdGggZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZC4nIFwKKyAgICAnZmluZCBwYXRoKiAhIC10eXBlIGQgLXByaW50IHwgeGFyZ3MgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCcKKworIyBTaG93IHRoZW0gYW5kIHNlZSB0aGF0IG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2hvd2luZyBzdGFnZSB3aXRoIGdpdC1scy1maWxlcyAtLXN0YWdlJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLXN0YWdlID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQgMAlwYXRoMAorMTIwMDAwIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEgMAlwYXRoMHN5bQorMTAwNjQ0IDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcgMAlwYXRoMi9maWxlMgorMTIwMDAwIGQ4Y2UxNjFhZGRjNTE3Mzg2N2EzYzNjNzMwOTI0Mzg4ZGFlZGJjMzggMAlwYXRoMi9maWxlMnN5bQorMTAwNjQ0IDBhYTM0Y2FlNjhkMDg3ODU3OGFkMTE5Yzg2Y2EyYjVlZDViMjgzNzYgMAlwYXRoMy9maWxlMworMTIwMDAwIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYgMAlwYXRoMy9maWxlM3N5bQorMTAwNjQ0IDAwZmI1OTA4Y2I5N2MyNTY0YTk3ODNjMGM2NDA4NzMzM2IzYjQ2NGYgMAlwYXRoMy9zdWJwMy9maWxlMworMTIwMDAwIDY2NDlhMWViZTllOWYxYzU1M2I2NmY1YTZlNzQxMzZhMDdjY2M1N2MgMAlwYXRoMy9zdWJwMy9maWxlM3N5bQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0LWxzLWZpbGVzIG91dHB1dCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICdkaWZmIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUuJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb2JqZWN0IElEIGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ3Rlc3QgIiR0cmVlIiA9IDA4NzcwNGE5NmJhZjFjMmQxYzg2OWE4YjA4NDQ4MWUxMjFjODhiNWInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzaG93aW5nIHRyZWUgd2l0aCBnaXQtbHMtdHJlZScgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgYmxvYiBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0CXBhdGgwCisxMjAwMDAgYmxvYiAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxCXBhdGgwc3ltCiswNDAwMDAgdHJlZSA1OGEwOWMyM2UyY2ExNTIxOTNmMjc4NmUwNjk4NmI3YjY3MTJiZGJlCXBhdGgyCiswNDAwMDAgdHJlZSAyMWFlODI2OWNhY2JlNTdhZTA5MTM4ZGNjM2EyODg3ZjkwNGQwMmIzCXBhdGgzCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtdHJlZSBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCisjIFRoaXMgY2hhbmdlZCBpbiBscy10cmVlIHBhdGhzcGVjIGNoYW5nZSAtLSByZWN1cnNpdmUgZG9lcworIyBub3Qgc2hvdyB0cmVlIG5vZGVzIGFueW1vcmUuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2hvd2luZyB0cmVlIHdpdGggZ2l0LWxzLXRyZWUgLXInIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgJHRyZWUgPmN1cnJlbnQnCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGJsb2IgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NAlwYXRoMAorMTIwMDAwIGJsb2IgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMQlwYXRoMHN5bQorMTAwNjQ0IGJsb2IgM2ZlZmY5NDllZDAwYTYyZDlmN2FmOTdjMTVjZDhhMzA1OTVlN2FjNwlwYXRoMi9maWxlMgorMTIwMDAwIGJsb2IgZDhjZTE2MWFkZGM1MTczODY3YTNjM2M3MzA5MjQzODhkYWVkYmMzOAlwYXRoMi9maWxlMnN5bQorMTAwNjQ0IGJsb2IgMGFhMzRjYWU2OGQwODc4NTc4YWQxMTljODZjYTJiNWVkNWIyODM3NglwYXRoMy9maWxlMworMTIwMDAwIGJsb2IgODU5OTEwMzk2OWI0M2FmZjdlNDMwZWZlYTc5Y2E0NjM2NDY2Nzk0ZglwYXRoMy9maWxlM3N5bQorMTAwNjQ0IGJsb2IgMDBmYjU5MDhjYjk3YzI1NjRhOTc4M2MwYzY0MDg3MzMzYjNiNDY0ZglwYXRoMy9zdWJwMy9maWxlMworMTIwMDAwIGJsb2IgNjY0OWExZWJlOWU5ZjFjNTUzYjY2ZjVhNmU3NDEzNmEwN2NjYzU3YwlwYXRoMy9zdWJwMy9maWxlM3N5bQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgb3V0cHV0IGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKworIyBCdXQgd2l0aCAtciAtdCB3ZSBjYW4gaGF2ZSBib3RoLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgdHJlZSB3aXRoIGdpdC1scy10cmVlIC1yIC10JyBcCisgICAgJ2dpdC1scy10cmVlIC1yIC10ICR0cmVlID5jdXJyZW50JworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBibG9iIGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQJcGF0aDAKKzEyMDAwMCBibG9iIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEJcGF0aDBzeW0KKzA0MDAwMCB0cmVlIDU4YTA5YzIzZTJjYTE1MjE5M2YyNzg2ZTA2OTg2YjdiNjcxMmJkYmUJcGF0aDIKKzEwMDY0NCBibG9iIDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcJcGF0aDIvZmlsZTIKKzEyMDAwMCBibG9iIGQ4Y2UxNjFhZGRjNTE3Mzg2N2EzYzNjNzMwOTI0Mzg4ZGFlZGJjMzgJcGF0aDIvZmlsZTJzeW0KKzA0MDAwMCB0cmVlIDIxYWU4MjY5Y2FjYmU1N2FlMDkxMzhkY2MzYTI4ODdmOTA0ZDAyYjMJcGF0aDMKKzEwMDY0NCBibG9iIDBhYTM0Y2FlNjhkMDg3ODU3OGFkMTE5Yzg2Y2EyYjVlZDViMjgzNzYJcGF0aDMvZmlsZTMKKzEyMDAwMCBibG9iIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYJcGF0aDMvZmlsZTNzeW0KKzA0MDAwMCB0cmVlIDNjNWU1Mzk5ZjNhMzMzZWRkZWNjZTdhOWI5NDY1YjYzZjY1ZjUxZTIJcGF0aDMvc3VicDMKKzEwMDY0NCBibG9iIDAwZmI1OTA4Y2I5N2MyNTY0YTk3ODNjMGM2NDA4NzMzM2IzYjQ2NGYJcGF0aDMvc3VicDMvZmlsZTMKKzEyMDAwMCBibG9iIDY2NDlhMWViZTllOWYxYzU1M2I2NmY1YTZlNzQxMzZhMDdjY2M1N2MJcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy10cmVlIC1yIG91dHB1dCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICdkaWZmIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHBhcnRpYWwgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZSAtLXByZWZpeC4nIFwKKyAgICAncHRyZWU9JChnaXQtd3JpdGUtdHJlZSAtLXByZWZpeD1wYXRoMyknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb2JqZWN0IElEIGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ3Rlc3QgIiRwdHJlZSIgPSAyMWFlODI2OWNhY2JlNTdhZTA5MTM4ZGNjM2EyODg3ZjkwNGQwMmIzJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyBwYXJ0aWFsIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUgLS1wcmVmaXguJyBcCisgICAgJ3B0cmVlPSQoZ2l0LXdyaXRlLXRyZWUgLS1wcmVmaXg9cGF0aDMvc3VicDMpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkcHRyZWUiID0gM2M1ZTUzOTlmM2EzMzNlZGRlY2NlN2E5Yjk0NjViNjNmNjVmNTFlMicKKworY2F0ID5iYWRvYmplY3RzIDw8RU9GCisxMDA2NDQgYmxvYiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCWRpci9maWxlMQorMTAwNjQ0IGJsb2IgMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlkaXIvZmlsZTIKKzEwMDY0NCBibG9iIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAJZGlyL2ZpbGUzCisxMDA2NDQgYmxvYiA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCWRpci9maWxlNAorMTAwNjQ0IGJsb2IgNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlkaXIvZmlsZTUKK0VPRgorCitybSAuZ2l0L2luZGV4Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHV0IGludmFsaWQgb2JqZWN0cyBpbnRvIHRoZSBpbmRleC4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gPCBiYWRvYmplY3RzJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnd3JpdGluZyB0aGlzIHRyZWUgd2l0aG91dCAtLW1pc3Npbmctb2suJyBcCisgICAgJ2dpdC13cml0ZS10cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0aGlzIHRyZWUgd2l0aCAtLW1pc3Npbmctb2suJyBcCisgICAgJ2dpdC13cml0ZS10cmVlIC0tbWlzc2luZy1vaycKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitybSAuZ2l0L2luZGV4Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSBmb2xsb3dlZCBieSB3cml0ZS10cmVlIHNob3VsZCBiZSBpZGVtcG90ZW50LicgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlICYmCisgICAgIHRlc3QgLWYgLmdpdC9pbmRleCAmJgorICAgICBuZXd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgIHRlc3QgIiRuZXd0cmVlIiA9ICIkdHJlZSInCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMAorOjEyMDAwMCAxMjAwMDAgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDBzeW0KKzoxMDA2NDQgMTAwNjQ0IDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgyL2ZpbGUyCis6MTIwMDAwIDEyMDAwMCBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMi9maWxlMnN5bQorOjEwMDY0NCAxMDA2NDQgMGFhMzRjYWU2OGQwODc4NTc4YWQxMTljODZjYTJiNWVkNWIyODM3NiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvZmlsZTMKKzoxMjAwMDAgMTIwMDAwIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgzL2ZpbGUzc3ltCis6MTAwNjQ0IDEwMDY0NCAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMy9zdWJwMy9maWxlMworOjEyMDAwMCAxMjAwMDAgNjY0OWExZWJlOWU5ZjFjNTUzYjY2ZjVhNmU3NDEzNmEwN2NjYzU3YyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdC1kaWZmLWZpbGVzIG91dHB1dCBmb3IgYSBrbm93IGNhY2hlL3dvcmsgdHJlZSBzdGF0ZS4nIFwKKyAgICAnZ2l0LWRpZmYtZmlsZXMgPmN1cnJlbnQgJiYgZGlmZiA+L2Rldi9udWxsIC1iIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCBzaG91bGQgc3VjY2VlZC4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdubyBkaWZmIGFmdGVyIGNoZWNrb3V0IGFuZCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaC4nIFwKKyAgICAnZ2l0LWRpZmYtZmlsZXMgPmN1cnJlbnQgJiYgY21wIC1zIGN1cnJlbnQgL2Rldi9udWxsJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQPTA4NzcwNGE5NmJhZjFjMmQxYzg2OWE4YjA4NDQ4MWUxMjFjODhiNWIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY29tbWl0LXRyZWUgcmVjb3JkcyB0aGUgY29ycmVjdCB0cmVlIGluIGEgY29tbWl0LicgXAorICAgICdjb21taXQwPSQoZWNobyBOTyB8IGdpdC1jb21taXQtdHJlZSAkUCkgJiYKKyAgICAgdHJlZT0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MCB8CisJIHNlZCAtbiAtZSAicy9edHJlZSAvL3AiIC1lICIvXmF1dGhvciAvcSIpICYmCisgICAgIHRlc3QgInokdHJlZSIgPSAieiRQIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1jb21taXQtdHJlZSByZWNvcmRzIHRoZSBjb3JyZWN0IHBhcmVudCBpbiBhIGNvbW1pdC4nIFwKKyAgICAnY29tbWl0MT0kKGVjaG8gTk8gfCBnaXQtY29tbWl0LXRyZWUgJFAgLXAgJGNvbW1pdDApICYmCisgICAgIHBhcmVudD0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MSB8CisJIHNlZCAtbiAtZSAicy9ecGFyZW50IC8vcCIgLWUgIi9eYXV0aG9yIC9xIikgJiYKKyAgICAgdGVzdCAieiRjb21taXQwIiA9ICJ6JHBhcmVudCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY29tbWl0LXRyZWUgb21pdHMgZHVwbGljYXRlZCBwYXJlbnQgaW4gYSBjb21taXQuJyBcCisgICAgJ2NvbW1pdDI9JChlY2hvIE5PIHwgZ2l0LWNvbW1pdC10cmVlICRQIC1wICRjb21taXQwIC1wICRjb21taXQwKSAmJgorICAgICBwYXJlbnQ9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDIgfAorCSBzZWQgLW4gLWUgInMvXnBhcmVudCAvL3AiIC1lICIvXmF1dGhvciAvcSIgfAorCSBzb3J0IC11KSAmJgorICAgICB0ZXN0ICJ6JGNvbW1pdDAiID0gInokcGFyZW50IiAmJgorICAgICBudW1wYXJlbnQ9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDIgfAorCSBzZWQgLW4gLWUgInMvXnBhcmVudCAvL3AiIC1lICIvXmF1dGhvciAvcSIgfAorCSB3YyAtbCkgJiYKKyAgICAgdGVzdCAkbnVtcGFyZW50ID0gMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IEQvRiBjb25mbGljdCcgJworCW12IHBhdGgwIHRtcCAmJgorCW12IHBhdGgyIHBhdGgwICYmCisJbXYgdG1wIHBhdGgyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlcGxhY2UgcGF0aDIgcGF0aDAvZmlsZTIgJiYKKwludW1wYXRoMD0kKGdpdCBscy1maWxlcyBwYXRoMCB8IHdjIC1sKSAmJgorCXRlc3QgJG51bXBhdGgwID0gMQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwMTAtcmFjeS1naXQuc2ggYi90L3QwMDEwLXJhY3ktZ2l0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NWE5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDEwLXJhY3ktZ2l0LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyYWN5IEdJVCcKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgVGhpcyB0ZXN0IGNhbiBnaXZlIGZhbHNlIHN1Y2Nlc3MgaWYgeW91ciBtYWNoaW5lIGlzIHN1ZmZpY2llbnRseQorIyBzbG93IG9yIHlvdXIgdHJpYWwgaGFwcGVuZWQgdG8gaGFwcGVuIG9uIHNlY29uZCBib3VuZGFyeS4KKworZm9yIHRyaWFsIGluIDAgMSAyIDMgNAorZG8KKwlybSAtZiAuZ2l0L2luZGV4CisJZWNobyBmcm90eiA+aW5mb2NvbQorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgaW5mb2NvbQorCWVjaG8geHl6enkgPmluZm9jb20KKworCWZpbGVzPWBnaXQgZGlmZi1maWxlcyAtcGAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiUmFjeSBHSVQgdHJpYWwgIyR0cmlhbCBwYXJ0IEEiIFwKKwkndGVzdCAiIiAhPSAiJGZpbGVzIicKKworCXNsZWVwIDEKKwllY2hvIHh5enp5ID5jb3JuZXJzdG9uZQorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgY29ybmVyc3RvbmUKKworCWZpbGVzPWBnaXQgZGlmZi1maWxlcyAtcGAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiUmFjeSBHSVQgdHJpYWwgIyR0cmlhbCBwYXJ0IEIiIFwKKwkndGVzdCAiIiAhPSAiJGZpbGVzIicKKworZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwMjAtY3JsZi5zaCBiL3QvdDAwMjAtY3JsZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTFkZmQwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MDAyMC1jcmxmLnNoCkBAIC0wLDAgKzEsMjkzIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nQ1JMRiBjb252ZXJzaW9uJworCisuIC4vdGVzdC1saWIuc2gKKworcV90b19udWwgKCkgeworCXRyIFEgJ1wwJworfQorCithcHBlbmRfY3IgKCkgeworCXNlZCAtZSAncy8kL1EvJyB8IHRyIFEgJ1wwMTUnCit9CisKK3JlbW92ZV9jciAoKSB7CisJdHIgJ1wwMTUnIFEgPCIkMSIgfCBncmVwIFEgPi9kZXYvbnVsbCAmJgorCXRyICdcMDE1JyBRIDwiJDEiIHwgc2VkIC1uZSAncy9RJC8vcCcKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiBmYWxzZSAmJgorCisJZm9yIHcgaW4gSGVsbG8gd29ybGQgaG93IGFyZSB5b3U7IGRvIGVjaG8gJHc7IGRvbmUgPm9uZSAmJgorCW1rZGlyIGRpciAmJgorCWZvciB3IGluIEkgYW0gdmVyeSB2ZXJ5IGZpbmUgdGhhbmsgeW91OyBkbyBlY2hvICR3OyBkb25lID5kaXIvdHdvICYmCisJZm9yIHcgaW4gT2ggaGVyZSBpcyBOVUxRaW4gdGV4dCBoZXJlOyBkbyBlY2hvICR3OyBkb25lIHwgcV90b19udWwgPnRocmVlICYmCisJZ2l0IGFkZCAuICYmCisKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKworCW9uZT1gZ2l0IHJldi1wYXJzZSBIRUFEOm9uZWAgJiYKKwlkaXI9YGdpdCByZXYtcGFyc2UgSEVBRDpkaXJgICYmCisJdHdvPWBnaXQgcmV2LXBhcnNlIEhFQUQ6ZGlyL3R3b2AgJiYKKwl0aHJlZT1gZ2l0IHJldi1wYXJzZSBIRUFEOnRocmVlYCAmJgorCisJZm9yIHcgaW4gU29tZSBleHRyYSBsaW5lcyBoZXJlOyBkbyBlY2hvICR3OyBkb25lID4+b25lICYmCisJZ2l0IGRpZmYgPnBhdGNoLmZpbGUgJiYKKwlwYXRjaGVkPWBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8b25lYCAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwllY2hvIGhhcHB5LgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgd2l0aCBhdXRvY3JsZj1pbnB1dCcgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiBpbnB1dCAmJgorCisJZm9yIGYgaW4gb25lIGRpci90d28KKwlkbworCQlhcHBlbmRfY3IgPCRmID50bXAgJiYgbXYgLWYgdG1wICRmICYmCisJCWdpdCB1cGRhdGUtaW5kZXggLS0gJGYgfHwgeworCQkJZWNobyBPb3BzCisJCQlmYWxzZQorCQkJYnJlYWsKKwkJfQorCWRvbmUgJiYKKworCWRpZmZlcnM9YGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIEhFQURgICYmCisJdGVzdCAteiAiJGRpZmZlcnMiIHx8IHsKKwkJZWNobyBPb3BzICIkZGlmZmVycyIKKwkJZmFsc2UKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlIHdpdGggYXV0b2NybGY9dHJ1ZScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiB0cnVlICYmCisKKwlmb3IgZiBpbiBvbmUgZGlyL3R3bworCWRvCisJCWFwcGVuZF9jciA8JGYgPnRtcCAmJiBtdiAtZiB0bXAgJGYgJiYKKwkJZ2l0IHVwZGF0ZS1pbmRleCAtLSAkZiB8fCB7CisJCQllY2hvICJPb3BzICRmIgorCQkJZmFsc2UKKwkJCWJyZWFrCisJCX0KKwlkb25lICYmCisKKwlkaWZmZXJzPWBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEYCAmJgorCXRlc3QgLXogIiRkaWZmZXJzIiB8fCB7CisJCWVjaG8gT29wcyAiJGRpZmZlcnMiCisJCWZhbHNlCisJfQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdpdGggYXV0b2NybGY9dHJ1ZScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlcG8tY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlmb3IgZiBpbiBvbmUgZGlyL3R3bworCWRvCisJCXJlbW92ZV9jciAiJGYiID50bXAgJiYgbXYgLWYgdG1wICRmICYmCisJCWdpdCB1cGRhdGUtaW5kZXggLS0gJGYgfHwgeworCQkJZWNobyAiRWg/ICRmIgorCQkJZmFsc2UKKwkJCWJyZWFrCisJCX0KKwlkb25lICYmCisJdGVzdCAiJG9uZSIgPSBgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPG9uZWAgJiYKKwl0ZXN0ICIkdHdvIiA9IGBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8ZGlyL3R3b2AgJiYKKwlkaWZmZXJzPWBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEYCAmJgorCXRlc3QgLXogIiRkaWZmZXJzIiB8fCB7CisJCWVjaG8gT29wcyAiJGRpZmZlcnMiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3aXRoIGF1dG9jcmxmPWlucHV0JyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiBpbnB1dCAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlmb3IgZiBpbiBvbmUgZGlyL3R3bworCWRvCisJCWlmIHJlbW92ZV9jciAiJGYiID4vZGV2L251bGwKKwkJdGhlbgorCQkJZWNobyAiRWg/ICRmIgorCQkJZmFsc2UKKwkJCWJyZWFrCisJCWVsc2UKKwkJCWdpdCB1cGRhdGUtaW5kZXggLS0gJGYKKwkJZmkKKwlkb25lICYmCisJdGVzdCAiJG9uZSIgPSBgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPG9uZWAgJiYKKwl0ZXN0ICIkdHdvIiA9IGBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8ZGlyL3R3b2AgJiYKKwlkaWZmZXJzPWBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEYCAmJgorCXRlc3QgLXogIiRkaWZmZXJzIiB8fCB7CisJCWVjaG8gT29wcyAiJGRpZmZlcnMiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAoYXV0b2NybGY9aW5wdXQpJyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiBpbnB1dCAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlnaXQgYXBwbHkgcGF0Y2guZmlsZSAmJgorCXRlc3QgIiRwYXRjaGVkIiA9ICJgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPG9uZWAiIHx8IHsKKwkJZWNobyAiRWg/ICBhcHBseSB3aXRob3V0IGluZGV4IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgcGF0Y2ggLS1jYWNoZWQgKGF1dG9jcmxmPWlucHV0KScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlcG8tY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZ2l0IGFwcGx5IC0tY2FjaGVkIHBhdGNoLmZpbGUgJiYKKwl0ZXN0ICIkcGF0Y2hlZCIgPSBgZ2l0IHJldi1wYXJzZSA6b25lYCB8fCB7CisJCWVjaG8gIkVoPyAgYXBwbHkgd2l0aCAtLWNhY2hlZCIKKwkJZmFsc2UKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHBhdGNoIC0taW5kZXggKGF1dG9jcmxmPWlucHV0KScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlcG8tY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZ2l0IGFwcGx5IC0taW5kZXggcGF0Y2guZmlsZSAmJgorCXRlc3QgIiRwYXRjaGVkIiA9IGBnaXQgcmV2LXBhcnNlIDpvbmVgICYmCisJdGVzdCAiJHBhdGNoZWQiID0gYGdpdCBoYXNoLW9iamVjdCAtLXN0ZGluIDxvbmVgIHx8IHsKKwkJZWNobyAiRWg/ICBhcHBseSB3aXRoIC0taW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAoYXV0b2NybGY9dHJ1ZSknICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWdpdCByZXBvLWNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZ2l0IGFwcGx5IHBhdGNoLmZpbGUgJiYKKwl0ZXN0ICIkcGF0Y2hlZCIgPSAiYHJlbW92ZV9jciBvbmUgfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbmAiIHx8IHsKKwkJZWNobyAiRWg/ICBhcHBseSB3aXRob3V0IGluZGV4IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgcGF0Y2ggLS1jYWNoZWQgKGF1dG9jcmxmPXRydWUpJyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgcmVwby1jb25maWcgY29yZS5hdXRvY3JsZiB0cnVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWdpdCBhcHBseSAtLWNhY2hlZCBwYXRjaC5maWxlICYmCisJdGVzdCAiJHBhdGNoZWQiID0gYGdpdCByZXYtcGFyc2UgOm9uZWAgfHwgeworCQllY2hvICJFaD8gIGFwcGx5IHdpdGhvdXQgaW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAtLWluZGV4IChhdXRvY3JsZj10cnVlKScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlcG8tY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlnaXQgYXBwbHkgLS1pbmRleCBwYXRjaC5maWxlICYmCisJdGVzdCAiJHBhdGNoZWQiID0gYGdpdCByZXYtcGFyc2UgOm9uZWAgJiYKKwl0ZXN0ICIkcGF0Y2hlZCIgPSAiYHJlbW92ZV9jciBvbmUgfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbmAiIHx8IHsKKwkJZWNobyAiRWg/ICBhcHBseSB3aXRoIC0taW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcuZ2l0YXR0cmlidXRlcyBzYXlzIHR3byBpcyBiaW5hcnknICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWVjaG8gInR3byAtY3JsZiIgPi5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IHJlcG8tY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlpZiByZW1vdmVfY3IgZGlyL3R3byA+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICJIdWg/IgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpICYmCisKKwlpZiByZW1vdmVfY3Igb25lID4vZGV2L251bGwKKwl0aGVuCisJCTogaGFwcHkKKwllbHNlCisJCWVjaG8gIkh1aD8iCisJCWZhbHNlCisJZmkgJiYKKworCWlmIHJlbW92ZV9jciB0aHJlZSA+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICJIdWg/IgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy5naXRhdHRyaWJ1dGVzIHNheXMgdHdvIGlzIGlucHV0JyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwllY2hvICJ0d28gY3JsZj1pbnB1dCIgPi5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWlmIHJlbW92ZV9jciBkaXIvdHdvID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIkh1aD8iCisJCWZhbHNlCisJZWxzZQorCQk6IGhhcHB5CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLmdpdGF0dHJpYnV0ZXMgc2F5cyB0d28gYW5kIHRocmVlIGFyZSB0ZXh0JyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwllY2hvICJ0KiBjcmxmIiA+LmdpdGF0dHJpYnV0ZXMgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJaWYgcmVtb3ZlX2NyIGRpci90d28gPi9kZXYvbnVsbAorCXRoZW4KKwkJOiBoYXBweQorCWVsc2UKKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwlmaSAmJgorCisJaWYgcmVtb3ZlX2NyIHRocmVlID4vZGV2L251bGwKKwl0aGVuCisJCTogaGFwcHkKKwllbHNlCisJCWVjaG8gIkh1aD8iCisJCWZhbHNlCisJZmkKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QwMDIxLWNvbnZlcnNpb24uc2ggYi90L3QwMDIxLWNvbnZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgzOWY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMjEtY29udmVyc2lvbi5zaApAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nYmxvYiBjb252ZXJzaW9uIHZpYSBnaXRhdHRyaWJ1dGVzJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0IDw8XEVPRiA+cm90MTMuc2gKK3RyICdbYS16QS1aXScgJ1tuLXphLW1OLVpBLU1dJworRU9GCitjaG1vZCAreCByb3QxMy5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlnaXQgY29uZmlnIGZpbHRlci5yb3QxMy5zbXVkZ2UgLi9yb3QxMy5zaCAmJgorCWdpdCBjb25maWcgZmlsdGVyLnJvdDEzLmNsZWFuIC4vcm90MTMuc2ggJiYKKworCXsKKwkgICAgZWNobyAiKi50IGZpbHRlcj1yb3QxMyIKKwkgICAgZWNobyAiKi5pIGlkZW50IgorCX0gPi5naXRhdHRyaWJ1dGVzICYmCisKKwl7CisJICAgIGVjaG8gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbQorCSAgICBlY2hvIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoKKwkgICAgZWNobyAnXCcnJElkJCdcJycKKwl9ID50ZXN0ICYmCisJY2F0IHRlc3QgPnRlc3QudCAmJgorCWNhdCB0ZXN0ID50ZXN0Lm8gJiYKKwljYXQgdGVzdCA+dGVzdC5pICYmCisJZ2l0IGFkZCB0ZXN0IHRlc3QudCB0ZXN0LmkgJiYKKwlybSAtZiB0ZXN0IHRlc3QudCB0ZXN0LmkgJiYKKwlnaXQgY2hlY2tvdXQgLS0gdGVzdCB0ZXN0LnQgdGVzdC5pCisnCisKK3NjcmlwdD0ncy9eXCRJZDogXChbMC05YS1mXSpcKSBcJC9cMS9wJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIGNoZWNrICcKKworCWNtcCB0ZXN0Lm8gdGVzdCAmJgorCWNtcCB0ZXN0Lm8gdGVzdC50ICYmCisKKwkjIGlkZW50IHNob3VsZCBiZSBzdHJpcHBlZCBpbiB0aGUgcmVwb3NpdG9yeQorCWdpdCBkaWZmIC0tcmF3IC0tZXhpdC1jb2RlIDp0ZXN0IDp0ZXN0LmkgJiYKKwlpZD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgOnRlc3QpICYmCisJZW1iZWRkZWQ9JChzZWQgLW5lICIkc2NyaXB0IiB0ZXN0LmkpICYmCisJdGVzdCAieiRpZCIgPSAieiRlbWJlZGRlZCIKKycKKworIyBJZiBhbiBleHBhbmRlZCBpZGVudCBldmVyIGdldHMgaW50byB0aGUgcmVwb3NpdG9yeSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdAorIyBpdCBpcyBjb2xsYXBzZWQgYmVmb3JlIGJlaW5nIGV4cGFuZGVkIGFnYWluIG9uIGNoZWNrb3V0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIGV4cGFuZGVkX2luX3JlcG8gJworCXsKKwkJZWNobyAiRmlsZSB3aXRoIGV4cGFuZGVkIGtleXdvcmRzIgorCQllY2hvICJcJElkXCQiCisJCWVjaG8gIlwkSWQ6XCQiCisJCWVjaG8gIlwkSWQ6IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgXCQiCisJCWVjaG8gIlwkSWQ6IE5vU3BhY2VBdEVuZFwkIgorCQllY2hvICJcJElkOk5vU3BhY2VBdEZyb250IFwkIgorCQllY2hvICJcJElkOk5vU3BhY2VBdEVpdGhlckVuZFwkIgorCQllY2hvICJcJElkOiBOb1Rlcm1pbmF0aW5nU3ltYm9sIgorCX0gPiBleHBhbmRlZC1rZXl3b3JkcyAmJgorCisJeworCQllY2hvICJGaWxlIHdpdGggZXhwYW5kZWQga2V5d29yZHMiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IE5vVGVybWluYXRpbmdTeW1ib2wiCisJfSA+IGV4cGVjdGVkLW91dHB1dCAmJgorCisJZ2l0IGFkZCBleHBhbmRlZC1rZXl3b3JkcyAmJgorCWdpdCBjb21taXQgLW0gIkZpbGUgd2l0aCBrZXl3b3JkcyBleHBhbmRlZCIgJiYKKworCWVjaG8gImV4cGFuZGVkLWtleXdvcmRzIGlkZW50IiA+PiAuZ2l0YXR0cmlidXRlcyAmJgorCisJcm0gLWYgZXhwYW5kZWQta2V5d29yZHMgJiYKKwlnaXQgY2hlY2tvdXQgLS0gZXhwYW5kZWQta2V5d29yZHMgJiYKKwljYXQgZXhwYW5kZWQta2V5d29yZHMgJiYKKwljbXAgZXhwYW5kZWQta2V5d29yZHMgZXhwZWN0ZWQtb3V0cHV0CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoIGIvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlNGU1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAwLXJlYWQtdHJlZS1tLTN3YXkuc2gKQEAgLTAsMCArMSw1MTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGhyZWUgd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tCisKK1RoaXMgdGVzdCB0cmllcyB0aHJlZS13YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0KKworVGhlcmUgaXMgb25lIGFuY2VzdG9yIChjYWxsZWQgTyBmb3IgT3JpZ2luYWwpIGFuZCB0d28gYnJhbmNoZXMgQQorYW5kIEIgZGVyaXZlZCBmcm9tIGl0LiAgV2Ugd2FudCB0byBkbyBhIDMtd2F5IG1lcmdlIGJldHdlZW4gQSBhbmQKK0IsIHVzaW5nIE8gYXMgdGhlIGNvbW1vbiBhbmNlc3Rvci4KKworICAgIG1lcmdlIEEgTyBCCisKK0RlY2lzaW9ucyBhcmUgbWFkZSBieSBjb21wYXJpbmcgY29udGVudHMgb2YgTywgQSBhbmQgQiBwYXRobmFtZQorYnkgcGF0aG5hbWUuICBUaGUgcmVzdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBndWlkaW5nCitwcmluY2lwbGU6CisKKyAtIElmIG9ubHkgQSBkb2VzIHNvbWV0aGluZyB0byBpdCBhbmQgQiBkb2VzIG5vdCB0b3VjaCBpdCwgdGFrZQorICAgd2hhdGV2ZXIgQSBkb2VzLgorCisgLSBJZiBvbmx5IEIgZG9lcyBzb21ldGhpbmcgdG8gaXQgYW5kIEEgZG9lcyBub3QgdG91Y2ggaXQsIHRha2UKKyAgIHdoYXRldmVyIEIgZG9lcy4KKworIC0gSWYgYm90aCBBIGFuZCBCIGRvZXMgc29tZXRoaW5nIGJ1dCBpbiB0aGUgc2FtZSB3YXksIHRha2UKKyAgIHdoYXRldmVyIHRoZXkgZG8uCisKKyAtIElmIEEgYW5kIEIgZG9lcyBzb21ldGhpbmcgYnV0IGRpZmZlcmVudCB0aGluZ3MsIHdlIG5lZWQgYQorICAgMy13YXkgbWVyZ2U6CisKKyAgIC0gV2UgY2Fubm90IGRvIGFueXRoaW5nIGFib3V0IHRoZSBmb2xsb3dpbmcgY2FzZXM6CisKKyAgICAgKiBPIGRvZXMgbm90IGhhdmUgaXQuICBBIGFuZCBCIGJvdGggbXVzdCBiZSBhZGRpbmcgdG8gdGhlCisgICAgICAgc2FtZSBwYXRoIGluZGVwZW5kZW50bHkuCisKKyAgICAgKiBBIGRlbGV0ZXMgaXQuICBCIG11c3QgYmUgbW9kaWZ5aW5nLgorCisgICAtIE90aGVyd2lzZSwgQSBhbmQgQiBhcmUgbW9kaWZ5aW5nLiAgUnVuIDMtd2F5IG1lcmdlLgorCitGaXJzdCwgdGhlIGNhc2UgbWF0cml4LgorCisgLSBWZXJ0aWNhbCBheGlzIGlzIGZvciBBJ1wnJ3MgYWN0aW9ucy4KKyAtIEhvcml6b250YWwgYXhpcyBpcyBmb3IgQidcJydzIGFjdGlvbnMuCisKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBBICAgICAgICBCIHwgTm8gQWN0aW9uICB8ICAgRGVsZXRlICAgfCAgIE1vZGlmeSAgIHwgICAgQWRkICAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgTm8gQWN0aW9uICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfAorfCAgICAgICAgICAgIHwgc2VsZWN0IE8gICB8IGRlbGV0ZSAgICAgfCBzZWxlY3QgQiAgIHwgc2VsZWN0IEIgICB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwKK3wtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tfAorfCBEZWxldGUgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAqKioqKioqKioqIHwgICAgY2FuICAgICB8Cit8ICAgICAgICAgICAgfCBkZWxldGUgICAgIHwgZGVsZXRlICAgICB8IG1lcmdlICAgICAgfCAgICBub3QgICAgIHwKK3wgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICBoYXBwZW4gICAgfAorfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS18Cit8IE1vZGlmeSAgICAgfCAgICAgICAgICAgIHwgKioqKioqKioqKiB8ID8/Pz8/Pz8/Pz8gfCAgICBjYW4gICAgIHwKK3wgICAgICAgICAgICB8IHNlbGVjdCBBICAgfCBtZXJnZSAgICAgIHwgc2VsZWN0IEE9QiB8ICAgIG5vdCAgICAgfAorfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCBtZXJnZSAgICAgIHwgIGhhcHBlbiAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgQWRkICAgICAgICB8ICAgICAgICAgICAgfCAgICBjYW4gICAgIHwgICAgY2FuICAgICB8ID8/Pz8/Pz8/Pz8gfAorfCAgICAgICAgICAgIHwgc2VsZWN0IEEgICB8ICAgIG5vdCAgICAgfCAgICBub3QgICAgIHwgc2VsZWN0IEE9QiB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgIGhhcHBlbiAgICB8ICBoYXBwZW4gICAgfCBtZXJnZSAgICAgIHwKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorCitJbiBhZGRpdGlvbjoKKworIFNTOiBhIHNwZWNpYWwgY2FzZSBvZiBNTSwgd2hlcmUgQSBhbmQgQiBtYWtlcyB0aGUgc2FtZSBtb2RpZmljYXRpb24uCisgTEw6IGEgc3BlY2lhbCBjYXNlIG9mIEFBLCB3aGVyZSBBIGFuZCBCIGNyZWF0ZXMgdGhlIHNhbWUgZmlsZS4KKyBUVDogYSBzcGVjaWFsIGNhc2Ugb2YgTU0sIHdoZXJlIEEgYW5kIEIgbWFrZXMgbWVyZ2VhYmxlIGNoYW5nZXMuCisgREY6IGEgc3BlY2lhbCBjYXNlLCB3aGVyZSBBIG1ha2VzIGEgZGlyZWN0b3J5IGFuZCBCIG1ha2VzIGEgZmlsZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJpdmlhbCAibWFqb3JpdHkgd2hlbiAzIHN0YWdlcyBleGlzdCIgbWVyZ2UgcGx1cyAjMkFMVCwgIzNBTFQKKyMgYW5kICM1QUxUIHRyaXZpYWwgbWVyZ2VzLgorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IFggMglBQQorMTAwNjQ0IFggMwlBQQorMTAwNjQ0IFggMAlBTgorMTAwNjQ0IFggMQlERAorMTAwNjQ0IFggMwlERgorMTAwNjQ0IFggMglERi9ERgorMTAwNjQ0IFggMQlETQorMTAwNjQ0IFggMwlETQorMTAwNjQ0IFggMQlETgorMTAwNjQ0IFggMwlETgorMTAwNjQ0IFggMAlMTAorMTAwNjQ0IFggMQlNRAorMTAwNjQ0IFggMglNRAorMTAwNjQ0IFggMQlNTQorMTAwNjQ0IFggMglNTQorMTAwNjQ0IFggMwlNTQorMTAwNjQ0IFggMAlNTgorMTAwNjQ0IFggMAlOQQorMTAwNjQ0IFggMQlORAorMTAwNjQ0IFggMglORAorMTAwNjQ0IFggMAlOTQorMTAwNjQ0IFggMAlOTgorMTAwNjQ0IFggMAlTUworMTAwNjQ0IFggMQlUVAorMTAwNjQ0IFggMglUVAorMTAwNjQ0IFggMwlUVAorMTAwNjQ0IFggMglaL0FBCisxMDA2NDQgWCAzCVovQUEKKzEwMDY0NCBYIDAJWi9BTgorMTAwNjQ0IFggMQlaL0RECisxMDA2NDQgWCAxCVovRE0KKzEwMDY0NCBYIDMJWi9ETQorMTAwNjQ0IFggMQlaL0ROCisxMDA2NDQgWCAzCVovRE4KKzEwMDY0NCBYIDEJWi9NRAorMTAwNjQ0IFggMglaL01ECisxMDA2NDQgWCAxCVovTU0KKzEwMDY0NCBYIDIJWi9NTQorMTAwNjQ0IFggMwlaL01NCisxMDA2NDQgWCAwCVovTU4KKzEwMDY0NCBYIDAJWi9OQQorMTAwNjQ0IFggMQlaL05ECisxMDA2NDQgWCAyCVovTkQKKzEwMDY0NCBYIDAJWi9OTQorMTAwNjQ0IFggMAlaL05OCitFT0YKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCisKK2NoZWNrX3Jlc3VsdCAoKSB7CisgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgfCBzZWQgLWUgJ3MvICciJF94NDAiJyAvIFggLycgPmN1cnJlbnQgJiYKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50Cit9CisKKyMgVGhpcyBpcyBkb25lIG9uIGFuIGVtcHR5IHdvcmsgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgbm9ybWFsCisjIG1lcmdlIHBlcnNvbiBiZWhhdmlvdXIuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMy13YXkgbWVyZ2Ugd2l0aCBnaXQtcmVhZC10cmVlIC1tLCBlbXB0eSBjYWNoZScgXAorICAgICJybSAtZnIgW05ETUFMVFNdW05ETUFMVFNGXSBaICYmCisgICAgIHJtIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKyMgVGhpcyBzdGFydHMgb3V0IHdpdGggdGhlIGZpcnN0IGhlYWQsIHdoaWNoIGlzIHRoZSBub3JtYWwKKyMgcGF0Y2ggc3VibWl0dGVyIGJlaGF2aW91ci4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczLXdheSBtZXJnZSB3aXRoIGdpdC1yZWFkLXRyZWUgLW0sIG1hdGNoIEgnIFwKKyAgICAicm0gLWZyIFtORE1BTFRTXVtORE1BTFRTRl0gWiAmJgorICAgICBybSAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKzogPDxcRU5EX09GX0NBU0VfVEFCTEUKKworV2UgaGF2ZSBzbyBmYXIgdGVzdGVkIG9ubHkgZW1wdHkgaW5kZXggYW5kIGNsZWFuLWFuZC1tYXRjaGluZy1BIGluZGV4CitjYXNlIHdoaWNoIGFyZSB0cml2aWFsLiAgTWFrZSBzdXJlIGluZGV4IHJlcXVpcmVtZW50cyBhcmUgYWxzbworY2hlY2tlZC4KKworImdpdC1yZWFkLXRyZWUgLW0gTyBBIEIiCisKKyAgICAgTyAgICAgICBBICAgICAgIEIgICAgICAgICByZXN1bHQgICAgICBpbmRleCByZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMSAgbWlzc2luZyBtaXNzaW5nIG1pc3NpbmcgICAtICAgICAgICAgICBtdXN0IG5vdCBleGlzdC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMiAgbWlzc2luZyBtaXNzaW5nIGV4aXN0cyAgICB0YWtlIEIqICAgICBtdXN0IG1hdGNoIEIsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMyAgbWlzc2luZyBleGlzdHMgIG1pc3NpbmcgICB0YWtlIEEqICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgNCAgbWlzc2luZyBleGlzdHMgIEEhPUIgICAgICBubyBtZXJnZSAgICBtdXN0IG1hdGNoIEEgYW5kIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAtdG8tZGF0ZSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA1ICBtaXNzaW5nIGV4aXN0cyAgQT09QiAgICAgIHRha2UgQSAgICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA2ICBleGlzdHMgIG1pc3NpbmcgbWlzc2luZyAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA3ICBleGlzdHMgIG1pc3NpbmcgTyE9QiAgICAgIG5vIG1lcmdlICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA4ICBleGlzdHMgIG1pc3NpbmcgTz09QiAgICAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA5ICBleGlzdHMgIE8hPUEgICAgbWlzc2luZyAgIG5vIG1lcmdlICAgIG11c3QgbWF0Y2ggQSBhbmQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC10by1kYXRlLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTAgIGV4aXN0cyAgTz09QSAgICBtaXNzaW5nICAgbm8gbWVyZ2UgICAgbXVzdCBtYXRjaCBBCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTEgIGV4aXN0cyAgTyE9QSAgICBPIT1CICAgICAgbm8gbWVyZ2UgICAgbXVzdCBtYXRjaCBBIGFuZCBiZQorICAgICAgICAgICAgICAgICAgICAgQSE9QiAgICAgICAgICAgICAgICAgIHVwLXRvLWRhdGUsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMiAgZXhpc3RzICBPIT1BICAgIE8hPUIgICAgICB0YWtlIEEgICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgIEE9PUIKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMyAgZXhpc3RzICBPIT1BICAgIE89PUIgICAgICB0YWtlIEEgICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNCAgZXhpc3RzICBPPT1BICAgIE8hPUIgICAgICB0YWtlIEIgICAgICBpZiBleGlzdHMsIG11c3QgZWl0aGVyICgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIEEgYW5kIGJlIHVwLXRvLWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKDIpIG1hdGNoIEIuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTUgIGV4aXN0cyAgTz09QSAgICBPPT1CICAgICAgdGFrZSBCICAgICAgbXVzdCBtYXRjaCBBIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNiAgZXhpc3RzICBPPT1BICAgIE89PUIgICAgICBiYXJmICAgICAgICBtdXN0IG1hdGNoIEEgaWYgZXhpc3RzLgorICAgICAqbXVsdGkqIGluIG9uZSAgaW4gYW5vdGhlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlOiB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaW4gY2FzZSAyIGFuZCAzLiAgVGhlIHRyZWUgQSBtYXkgY29udGFpbgorREYgKGZpbGUpIHdoZW4gdHJlZSBCIHJlcXVpcmUgREYgdG8gYmUgYSBkaXJlY3RvcnkgYnkgaGF2aW5nIERGL0RGCisoZmlsZSkuCisKK0VORF9PRl9DQVNFX1RBQkxFCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxIC0gbXVzdCBub3QgaGF2ZSBhbiBlbnRyeSBub3QgaW4gQS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBYWCAmJgorICAgICBlY2hvIFhYID5YWCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFhYICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyIC0gbXVzdCBtYXRjaCBCIGluICFPICYmICFBICYmIEIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOQSAmJgorICAgICBjcCAub3JpZy1CL05BIE5BICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTkEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIgLSBtYXRjaGluZyBCIGFsb25lIGlzIE9LIGluICFPICYmICFBICYmIEIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOQSAmJgorICAgICBjcCAub3JpZy1CL05BIE5BICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTkEgJiYKKyAgICAgZWNobyBleHRyYSA+Pk5BICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczIC0gbXVzdCBtYXRjaCBBIGluICFPICYmIEEgJiYgIUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBTiAmJgorICAgICBjcCAub3JpZy1BL0FOIEFOICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQU4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczIC0gbWF0Y2hpbmcgQSBhbG9uZSBpcyBPSyBpbiAhTyAmJiBBICYmICFCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQU4gJiYKKyAgICAgY3AgLm9yaWctQS9BTiBBTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFOICYmCisgICAgIGVjaG8gZXh0cmEgPj5BTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMyAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gIU8gJiYgQSAmJiAhQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFOICYmCisgICAgIGNwIC5vcmlnLUEvQU4gQU4gJiYKKyAgICAgZWNobyBleHRyYSA+PkFOICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQU4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzQgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluICFPICYmIEEgJiYgQiAmJiBBIT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQUEgJiYKKyAgICAgY3AgLm9yaWctQS9BQSBBQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnNCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluICFPICYmIEEgJiYgQiAmJiBBIT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQUEgJiYKKyAgICAgY3AgLm9yaWctQS9BQSBBQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIGVjaG8gZXh0cmEgPj5BQSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnNCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluICFPICYmIEEgJiYgQiAmJiBBIT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQUEgJiYKKyAgICAgY3AgLm9yaWctQS9BQSBBQSAmJgorICAgICBlY2hvIGV4dHJhID4+QUEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBQSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAtIG11c3QgbWF0Y2ggaW4gIU8gJiYgQSAmJiBCICYmIEE9PUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBMTCAmJgorICAgICBjcCAub3JpZy1BL0xMIExMICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc1IC0gbXVzdCBtYXRjaCBpbiAhTyAmJiBBICYmIEIgJiYgQT09QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IExMICYmCisgICAgIGNwIC5vcmlnLUEvTEwgTEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBMTCAmJgorICAgICBlY2hvIGV4dHJhID4+TEwgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc1IChmYWlsKSAtIG11c3QgbWF0Y2ggQSBpbiAhTyAmJiBBICYmIEIgJiYgQT09QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IExMICYmCisgICAgIGNwIC5vcmlnLUEvTEwgTEwgJiYKKyAgICAgZWNobyBleHRyYSA+PkxMICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzYgLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmICFCIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBERCAmJgorICAgICBlY2hvIEREID5ERAorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEREICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc3IC0gbXVzdCBub3QgZXhpc3QgaW4gTyAmJiAhQSAmJiBCICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IERNICYmCisgICAgIGNwIC5vcmlnLUIvRE0gRE0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBETSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnOCAtIG11c3Qgbm90IGV4aXN0IGluIE8gJiYgIUEgJiYgQiAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBETiAmJgorICAgICBjcCAub3JpZy1CL0ROIEROICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgRE4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPIT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNRCAmJgorICAgICBjcCAub3JpZy1BL01EIE1EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTUQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc5IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE8hPUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1EICYmCisgICAgIGNwIC5vcmlnLUEvTUQgTUQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNRCAmJgorICAgICBlY2hvIGV4dHJhID4+TUQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzkgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTyE9QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTUQgJiYKKyAgICAgY3AgLm9yaWctQS9NRCBNRCAmJgorICAgICBlY2hvIGV4dHJhID4+TUQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNRCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTAgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPPT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBORCAmJgorICAgICBjcCAub3JpZy1BL05EIE5EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTkQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxMCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPPT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBORCAmJgorICAgICBjcCAub3JpZy1BL05EIE5EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTkQgJiYKKyAgICAgZWNobyBleHRyYSA+Pk5EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxMCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPPT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBORCAmJgorICAgICBjcCAub3JpZy1BL05EIE5EICYmCisgICAgIGVjaG8gZXh0cmEgPj5ORCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBPIT1CICYmIEEhPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1NICYmCisgICAgIGNwIC5vcmlnLUEvTU0gTU0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzExIChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBPIT1CICYmIEEhPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1NICYmCisgICAgIGNwIC5vcmlnLUEvTU0gTU0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNTSAmJgorICAgICBlY2hvIGV4dHJhID4+TU0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzExIChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBPIT1CICYmIEEhPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1NICYmCisgICAgIGNwIC5vcmlnLUEvTU0gTU0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk1NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTU0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgQT09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggU1MgJiYKKyAgICAgY3AgLm9yaWctQS9TUyBTUyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFNTICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTIgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBBPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBTUyAmJgorICAgICBjcCAub3JpZy1BL1NTIFNTICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgU1MgJiYKKyAgICAgZWNobyBleHRyYSA+PlNTICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTIgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgQT09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggU1MgJiYKKyAgICAgY3AgLm9yaWctQS9TUyBTUyAmJgorICAgICBlY2hvIGV4dHJhID4+U1MgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBTUyAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTMgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNTiAmJgorICAgICBjcCAub3JpZy1BL01OIE1OICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTU4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1OICYmCisgICAgIGNwIC5vcmlnLUEvTU4gTU4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNTiAmJgorICAgICBlY2hvIGV4dHJhID4+TU4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNCAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTSAmJgorICAgICBjcCAub3JpZy1BL05NIE5NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNCAtIG1heSBtYXRjaCBCIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTyE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk0gJiYKKyAgICAgY3AgLm9yaWctQi9OTSBOTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5NICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzE0IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTSAmJgorICAgICBjcCAub3JpZy1BL05NIE5NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxNCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTyE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk0gJiYKKyAgICAgY3AgLm9yaWctQS9OTSBOTSAmJgorICAgICBlY2hvIGV4dHJhID4+Tk0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTUgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTiAmJgorICAgICBjcCAub3JpZy1BL05OIE5OICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5OICYmCisgICAgIGNwIC5vcmlnLUEvTk4gTk4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTiAmJgorICAgICBlY2hvIGV4dHJhID4+Tk4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxNSAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTiAmJgorICAgICBjcCAub3JpZy1BL05OIE5OICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5OICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKKyMgIzE2Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTYgLSBBIG1hdGNoZXMgaW4gb25lIGFuZCBCIG1hdGNoZXMgaW4gYW5vdGhlci4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBGMTYgJiYKKyAgICBlY2hvIEYxNiA+RjE2ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBGMTYgJiYKKyAgICB0cmVlMD1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgZWNobyBFMTYgPkYxNiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggRjE2ICYmCisgICAgdHJlZTE9YGdpdC13cml0ZS10cmVlYCAmJgorICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWUwICR0cmVlMSAkdHJlZTEgJHRyZWUwICYmCisgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMS1yZWFkLXRyZWUtbS0yd2F5LnNoIGIvdC90MTAwMS1yZWFkLXRyZWUtbS0yd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAzMDIyNmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAxLXJlYWQtdHJlZS1tLTJ3YXkuc2gKQEAgLTAsMCArMSwzNDQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVHdvIHdheSBtZXJnZSB3aXRoIHJlYWQtdHJlZSAtbSAkSCAkTQorCitUaGlzIHRlc3QgdHJpZXMgdHdvLXdheSBtZXJnZSAoYWthIGZhc3QgZm9yd2FyZCB3aXRoIGNhcnJ5IGZvcndhcmQpLgorCitUaGVyZSBpcyB0aGUgaGVhZCAoY2FsbGVkIEgpIGFuZCBhbm90aGVyIGNvbW1pdCAoY2FsbGVkIE0pLCB3aGljaCBpcworc2ltcGx5IGFoZWFkIG9mIEguICBUaGUgaW5kZXggYW5kIHRoZSB3b3JrIHRyZWUgY29udGFpbnMgYSBzdGF0ZSB0aGF0CitpcyBkZXJpdmVkIGZyb20gSCwgYnV0IG1heSBhbHNvIGhhdmUgbG9jYWwgY2hhbmdlcy4gIFRoaXMgdGVzdCBjaGVja3MKK2FsbCB0aGUgY29tYmluYXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgdHdvLXRyZWUgbWVyZ2UgImNhcnJ5IGZvcndhcmQiCitydWxlcywgZm91bmQgaW4gPERvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQ+LgorCitJbiB0aGUgdGVzdCwgdGhlc2UgcGF0aHMgYXJlIHVzZWQ6CisgICAgICAgIGJvemJhciAgLSBpbiBILCBzdGF5cyBpbiBNLCBtb2RpZmllZCBmcm9tIGJvemJhciB0byBnbnVzdG8KKyAgICAgICAgZnJvdHogICAtIG5vdCBpbiBIIGFkZGVkIGluIE0KKyAgICAgICAgbml0Zm9sICAtIGluIEgsIHN0YXlzIGluIE0gdW5tb2RpZmllZAorICAgICAgICByZXpyb3YgIC0gaW4gSCwgZGVsZXRlZCBpbiBNCisgICAgICAgIHlvbWluICAgLSBub3QgaW4gSCBub3IgTQorJworLiAuL3Rlc3QtbGliLnNoCisKK3JlYWRfdHJlZV90d293YXkgKCkgeworICAgIGdpdC1yZWFkLXRyZWUgLW0gIiQxIiAiJDIiICYmIGdpdC1scy1maWxlcyAtLXN0YWdlCit9CisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorY29tcGFyZV9jaGFuZ2UgKCkgeworCXNlZCAtbiA+Y3VycmVudCBcCisJICAgIC1lICcvXi0tLSAvZDsgL14rKysgL2Q7IC9eQEAgL2Q7JyBcCisJICAgIC1lICdzL15cKFstK11bMC03XVswLTddWzAtN11bMC03XVswLTddWzAtN11cKSAnIiRfeDQwIicgL1wxIFggL3AnIFwKKwkgICAgIiQxIgorCWdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQKK30KKworY2hlY2tfY2FjaGVfYXQgKCkgeworCWNsZWFuX2lmX2VtcHR5PWBnaXQtZGlmZi1maWxlcyAtLSAiJDEiYAorCWNhc2UgIiRjbGVhbl9pZl9lbXB0eSIgaW4KKwknJykgIGVjaG8gIiQxOiBjbGVhbiIgOzsKKwk/KikgIGVjaG8gIiQxOiBkaXJ0eSIgOzsKKwllc2FjCisJY2FzZSAiJDIsJGNsZWFuX2lmX2VtcHR5IiBpbgorCWNsZWFuLCkJCTogICAgIDs7CisJY2xlYW4sPyopCWZhbHNlIDs7CisJZGlydHksKQkJZmFsc2UgOzsKKwlkaXJ0eSw/KikJOiAgICAgOzsKKwllc2FjCit9CisKK2NhdCA+Ym96YmFyLW9sZCA8PFxFT0YKK1RoaXMgaXMgYSBzYW1wbGUgZmlsZSB1c2VkIGluIHR3by13YXkgZmFzdCBmb3J3YXJkIG1lcmdlCit0ZXN0cy4gIEl0cyBzZWNvbmQgbGluZSBlbmRzIHdpdGggYSBtYWdpYyB3b3JkIGJvemJhcgord2hpY2ggd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgbWVyZ2VkIGhlYWQgdG8gZ251c3RvLgorSXQgaGFzIHNvbWUgZXh0cmEgbGluZXMgc28gdGhhdCBleHRlcm5hbCB0b29scyBjYW4KK3N1Y2Nlc3NmdWxseSBtZXJnZSBpbmRlcGVuZGVudCBjaGFuZ2VzIG1hZGUgdG8gbGF0ZXIKK2xpbmVzIChzdWNoIGFzIHRoaXMgb25lKSwgYXZvaWRpbmcgbGluZSBjb25mbGljdHMuCitFT0YKKworc2VkIC1lICdzL2JvemJhci9nbnVzdG8gKGVhcmxpZXIgYm96YmFyKS8nIGJvemJhci1vbGQgPmJvemJhci1uZXcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgc2V0dXAgXAorICAgICdlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBlY2hvIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGNhdCBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBlY2hvIHlvbWluID55b21pbiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCBib3piYXIgcmV6cm92ICYmCisgICAgIHRyZWVIPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlSCAkdHJlZUggJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVIICYmCisKKyAgICAgY2F0IGJvemJhci1uZXcgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6IGJvemJhciAtLWZvcmNlLXJlbW92ZSByZXpyb3YgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPk0ub3V0ICYmCisgICAgIHRyZWVNPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlTSAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVNICYmCisgICAgIGdpdC1kaWZmLXRyZWUgJHRyZWVIICR0cmVlTScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEsIDIsIDMgLSBubyBjYXJyeSBmb3J3YXJkJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xLTMub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDEtMy5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGRpcnR5ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGRpcnR5ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eScKKworZWNobyAnKzEwMDY0NCBYIDAJeW9taW4nID5leHBlY3RlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID40Lm91dCB8fCByZXR1cm4gMQorICAgICBnaXQgZGlmZiBNLm91dCA0Lm91dCA+NGRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBjYXJyeSBmb3J3YXJkIGxvY2FsIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHlvbWluID55b21pbiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHlvbWluICYmCisgICAgIGVjaG8geW9taW4geW9taW4gPnlvbWluICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+NS5vdXQgfHwgcmV0dXJuIDEKKyAgICAgZ2l0IGRpZmYgTS5vdXQgNS5vdXQgPjVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSA1ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgeW9taW4gZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2IC0gbG9jYWwgYWRkaXRpb24gYWxyZWFkeSBoYXMgdGhlIHNhbWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID42Lm91dCAmJgorICAgICBnaXQgZGlmZiBNLm91dCA2Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzcgLSBsb2NhbCBhZGRpdGlvbiBhbHJlYWR5IGhhcyB0aGUgc2FtZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjcub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDcub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGRpcnR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOCAtIGNvbmZsaWN0aW5nIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzkgLSBjb25mbGljdGluZyBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMCAtIHBhdGggcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjEwLm91dCAmJgorICAgICBnaXQgZGlmZiBNLm91dCAxMC5vdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMSAtIGRpcnR5IHBhdGggcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworY2F0ID5leHBlY3RlZCA8PEVPRgorLTEwMDY0NCBYIDAJbml0Zm9sCisrMTAwNjQ0IFggMAluaXRmb2wKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgLSB1bmNoYW5nZWQgaW4gdHdvIGhlYWRzLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE0Lm91dCB8fCByZXR1cm4gMQorICAgICBnaXQgZGlmZiBNLm91dCAxNC5vdXQgPjE0ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgMTRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCBuaXRmb2wgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE1Lm91dCB8fCByZXR1cm4gMQorICAgICBnaXQgZGlmZiBNLm91dCAxNS5vdXQgPjE1ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgMTVkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCBuaXRmb2wgZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNiAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTcgLSBjb25mbGljdGluZyBsb2NhbCBjaGFuZ2UuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxOCAtIGxvY2FsIGNoYW5nZSBhbHJlYWR5IGhhdmluZyBhIGdvb2QgcmVzdWx0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW5ldyA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTgub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDE4Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxOSAtIGxvY2FsIGNoYW5nZSBhbHJlYWR5IGhhdmluZyBhIGdvb2QgcmVzdWx0LCBmdXJ0aGVyIG1vZGlmaWVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW5ldyA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTkub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDE5Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMCAtIG5vIGxvY2FsIGNoYW5nZSwgdXNlIG5ldyB0cmVlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW9sZCA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MjAub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDIwLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMSAtIG5vIGxvY2FsIGNoYW5nZSwgZGlydHkgY2FjaGUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCisjIFRoaXMgZmFpbHMgd2l0aCBzdHJhaWdodCB0d28td2F5IGZhc3QgZm9yd2FyZC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMiAtIGxvY2FsIGNoYW5nZSBjYWNoZSB1cGRhdGVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBzZWQgLWUgInMvc3VjaCBhcy9TVUNIIEFTLyIgYm96YmFyLW9sZCA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworIyBBbHNvIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGJyZWFrIERGIHZzIERGL0RGIGNhc2UuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSBzZXR1cC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIHRyZWVERj1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZURGICR0cmVlREYgJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVERiAmJgorCisgICAgIHJtIC1mIERGICYmCisgICAgIG1rZGlyIERGICYmCisgICAgIGVjaG8gREYvREYgPkRGL0RGICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgREYgREYvREYgJiYKKyAgICAgdHJlZURGREY9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERkRGICR0cmVlREZERiAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPkRGREYub3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSB0ZXN0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIHJtIC1mciBERiAmJgorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPkRGREZjaGVjay5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgREZERi5vdXQgREZERmNoZWNrLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBERi9ERiBkaXJ0eSAmJgorICAgICA6JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDItcmVhZC10cmVlLW0tdS0yd2F5LnNoIGIvdC90MTAwMi1yZWFkLXRyZWUtbS11LTJ3YXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdmZTk5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDItcmVhZC10cmVlLW0tdS0yd2F5LnNoCkBAIC0wLDAgKzEsMzQ0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1R3byB3YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0gLXUgJEggJE0KKworVGhpcyBpcyBpZGVudGljYWwgdG8gdDEwMDEsIGJ1dCB1c2VzIC11IHRvIHVwZGF0ZSB0aGUgd29yayB0cmVlIGFzIHdlbGwuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK2NvbXBhcmVfY2hhbmdlICgpIHsKKwlzZWQgPmN1cnJlbnQgXAorCSAgICAtZSAnL14tLS0gL2Q7IC9eKysrIC9kOyAvXkBAIC9kOycgXAorCSAgICAtZSAncy9eXCguWzAtN11bMC03XVswLTddWzAtN11bMC03XVswLTddXCkgJyIkX3g0MCInIC9cMSBYIC8nICIkMSIKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50Cit9CisKK2NoZWNrX2NhY2hlX2F0ICgpIHsKKwljbGVhbl9pZl9lbXB0eT1gZ2l0LWRpZmYtZmlsZXMgLS0gIiQxImAKKwljYXNlICIkY2xlYW5faWZfZW1wdHkiIGluCisJJycpICBlY2hvICIkMTogY2xlYW4iIDs7CisJPyopICBlY2hvICIkMTogZGlydHkiIDs7CisJZXNhYworCWNhc2UgIiQyLCRjbGVhbl9pZl9lbXB0eSIgaW4KKwljbGVhbiwpCQk6ICAgICA7OworCWNsZWFuLD8qKQlmYWxzZSA7OworCWRpcnR5LCkJCWZhbHNlIDs7CisJZGlydHksPyopCTogICAgIDs7CisJZXNhYworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2VjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGVjaG8gbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZWNobyBib3piYXIgPmJvemJhciAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sIGJvemJhciByZXpyb3YgJiYKKyAgICAgdHJlZUg9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVIICR0cmVlSCAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZUggJiYKKworICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogYm96YmFyIC0tZm9yY2UtcmVtb3ZlIHJlenJvdiAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+TS5vdXQgJiYKKyAgICAgdHJlZU09YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVNICR0cmVlTSAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZU0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPk0uc3VtICYmCisgICAgIGdpdC1kaWZmLXRyZWUgJHRyZWVIICR0cmVlTScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEsIDIsIDMgLSBubyBjYXJyeSBmb3J3YXJkJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjEtMy5vdXQgJiYKKyAgICAgY21wIE0ub3V0IDEtMy5vdXQgJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDMuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwzLnN1bSAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogY2xlYW4gJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvICIrMTAwNjQ0IFggMAl5b21pbiIgPmV4cGVjdGVkICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID40Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCA0Lm91dCA+NGRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBjbGVhbiAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDQuc3VtICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluMSAmJgorICAgICBkaWZmIHlvbWluIHlvbWluMSAmJgorICAgICBybSAtZiB5b21pbjEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc1IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZWNobyB5b21pbiB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID41Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCA1Lm91dCA+NWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDVkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNS5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDUuc3VtICYmCisgICAgIDogZGlydHkgaW5kZXggc2hvdWxkIGhhdmUgcHJldmVudGVkIC11IGZyb20gY2hlY2tpbmcgaXQgb3V0LiAmJgorICAgICBlY2hvIHlvbWluIHlvbWluID55b21pbjEgJiYKKyAgICAgZGlmZiB5b21pbiB5b21pbjEgJiYKKyAgICAgcm0gLWYgeW9taW4xJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNiAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjYub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDYub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwzLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMy5zdW0gJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHoxICYmCisgICAgIGRpZmYgZnJvdHogZnJvdHoxICYmCisgICAgIHJtIC1mIGZyb3R6MScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzcgLSBsb2NhbCBhZGRpdGlvbiBhbHJlYWR5IGhhcyB0aGUgc2FtZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID43Lm91dCAmJgorICAgICBkaWZmIC1VMCBNLm91dCA3Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNy5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDcuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIDogZGlydHkgaW5kZXggc2hvdWxkIGhhdmUgcHJldmVudGVkIC11IGZyb20gY2hlY2tpbmcgaXQgb3V0LiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90ejEgJiYKKyAgICAgZGlmZiBmcm90eiBmcm90ejEgJiYKKyAgICAgcm0gLWYgZnJvdHoxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOCAtIGNvbmZsaWN0aW5nIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc5IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjEwLm91dCAmJgorICAgICBjbXAgTS5vdXQgMTAub3V0ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxMC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDEwLnN1bScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzExIC0gZGlydHkgcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgaWYgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTMgLSB1bm1hdGNoaW5nIGxvY2FsIGNoYW5nZXMgYmVpbmcgcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgaWYgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCitjYXQgPmV4cGVjdGVkIDw8RU9GCistMTAwNjQ0IFggMAluaXRmb2wKKysxMDA2NDQgWCAwCW5pdGZvbAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNCAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE0Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCAxNC5vdXQgPjE0ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgMTRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6ID5hY3R1YWwxNC5zdW0gJiYKKyAgICAgZ3JlcCAtdiBuaXRmb2wgTS5zdW0gPiBleHBlY3RlZDE0LnN1bSAmJgorICAgICBjbXAgZXhwZWN0ZWQxNC5zdW0gYWN0dWFsMTQuc3VtICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxNGEuc3VtICYmCisgICAgIGlmIGNtcCBNLnN1bSBhY3R1YWwxNGEuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBjbGVhbiAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbDEgJiYKKyAgICAgZGlmZiBuaXRmb2wgbml0Zm9sMSAmJgorICAgICBybSAtZiBuaXRmb2wxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTUgLSB1bmNoYW5nZWQgaW4gdHdvIGhlYWRzLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDE1Lm91dCA+MTVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6ID5hY3R1YWwxNS5zdW0gJiYKKyAgICAgZ3JlcCAtdiBuaXRmb2wgTS5zdW0gPiBleHBlY3RlZDE1LnN1bSAmJgorICAgICBjbXAgZXhwZWN0ZWQxNS5zdW0gYWN0dWFsMTUuc3VtICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxNWEuc3VtICYmCisgICAgIGlmIGNtcCBNLnN1bSBhY3R1YWwxNWEuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCBuaXRmb2wgPm5pdGZvbDEgJiYKKyAgICAgZGlmZiBuaXRmb2wgbml0Zm9sMSAmJgorICAgICBybSAtZiBuaXRmb2wxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTYgLSBjb25mbGljdGluZyBsb2NhbCBjaGFuZ2UuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNyAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxOCAtIGxvY2FsIGNoYW5nZSBhbHJlYWR5IGhhdmluZyBhIGdvb2QgcmVzdWx0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBnbnVzdG8gPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE4Lm91dCAmJgorICAgICBkaWZmIC1VMCBNLm91dCAxOC5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxOC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDE4LnN1bScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE5IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQsIGZ1cnRoZXIgbW9kaWZpZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTkub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDE5Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHkgJiYKKyAgICAgc3VtIGZyb3R6IG5pdGZvbCA+YWN0dWFsMTkuc3VtICYmCisgICAgIGdyZXAgLXYgYm96YmFyICBNLnN1bSA+IGV4cGVjdGVkMTkuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE5LnN1bSBhY3R1YWwxOS5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE5YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE5YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIxICYmCisgICAgIGRpZmYgYm96YmFyIGJvemJhcjEgJiYKKyAgICAgcm0gLWYgYm96YmFyMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIwIC0gbm8gbG9jYWwgY2hhbmdlLCB1c2UgbmV3IHRyZWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MjAub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDIwLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDIwLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMjAuc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjEgLSBubyBsb2NhbCBjaGFuZ2UsIGRpcnR5IGNhY2hlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKKyMgQWxzbyBtYWtlIHN1cmUgd2UgZGlkIG5vdCBicmVhayBERiB2cyBERi9ERiBjYXNlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2Ugc2V0dXAuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXgKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICB0cmVlREY9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERiAkdHJlZURGICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlREYgJiYKKworICAgICBybSAtZiBERiAmJgorICAgICBta2RpciBERiAmJgorICAgICBlY2hvIERGL0RGID5ERi9ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIERGIERGL0RGICYmCisgICAgIHRyZWVERkRGPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlREZERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGLm91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2UgdGVzdC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBybSAtZnIgREYgJiYKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlREYgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGY2hlY2sub3V0ICYmCisgICAgIGRpZmYgLVUwIERGREYub3V0IERGREZjaGVjay5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgREYvREYgY2xlYW4nCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMy1yZWFkLXRyZWUtcHJlZml4LnNoIGIvdC90MTAwMy1yZWFkLXRyZWUtcHJlZml4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4YWIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAzLXJlYWQtdHJlZS1wcmVmaXguc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcmVhZC10cmVlIC0tcHJlZml4IHRlc3QuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGhlbGxvID5vbmUgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG9uZSAmJgorCXRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorCWVjaG8gdHJlZSBpcyAkdHJlZQorJworCitlY2hvICdvbmUKK3R3by9vbmUnID5leHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhZC10cmVlIC0tcHJlZml4JyAnCisJZ2l0LXJlYWQtdHJlZSAtLXByZWZpeD10d28vICR0cmVlICYmCisJZ2l0LWxzLWZpbGVzID5hY3R1YWwgJiYKKwljbXAgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDQtcmVhZC10cmVlLW0tdS13Zi5zaCBiL3QvdDEwMDQtcmVhZC10cmVlLW0tdS13Zi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTE0MjBhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTAwNC1yZWFkLXRyZWUtbS11LXdmLnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ncmVhZC10cmVlIC1tIC11IGNoZWNrcyB3b3JraW5nIHRyZWUgZmlsZXMnCisKKy4gLi90ZXN0LWxpYi5zaAorCisjIHR3by10cmVlIHRlc3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHdvLXdheSBzZXR1cCcgJworCisJbWtkaXIgc3ViZGlyICYmCisJZWNobyA+ZmlsZTEgZmlsZSBvbmUgJiYKKwllY2hvID5maWxlMiBmaWxlIHR3byAmJgorCWVjaG8gPnN1YmRpci9maWxlMSBmaWxlIG9uZSBpbiBzdWJkaXJlY3RvcnkgJiYKKwllY2hvID5zdWJkaXIvZmlsZTIgZmlsZSB0d28gaW4gc3ViZGlyZWN0b3J5ICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMSBmaWxlMiBzdWJkaXIvZmlsZTEgc3ViZGlyL2ZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwlnaXQgdGFnIC1mIGJyYW5jaC1wb2ludCAmJgorCisJZWNobyBmaWxlMiBpcyBub3QgdHJhY2tlZCBvbiB0aGUgbWFzdGVyIGFueW1vcmUgJiYKKwlybSAtZiBmaWxlMiBzdWJkaXIvZmlsZTIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGZpbGUyIHN1YmRpci9maWxlMiAmJgorCWdpdCBjb21taXQgLWEgLW0gIm1hc3RlciByZW1vdmVzIGZpbGUyIGFuZCBzdWJkaXIvZmlsZTIiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3R3by13YXkgbm90IGNsb2JiZXJpbmcnICcKKworCWVjaG8gPmZpbGUyIG1hc3RlciBjcmVhdGVzIHVudHJhY2tlZCBmaWxlMiAmJgorCWVjaG8gPnN1YmRpci9maWxlMiBtYXN0ZXIgY3JlYXRlcyB1bnRyYWNrZWQgc3ViZGlyL2ZpbGUyICYmCisJaWYgZXJyPWBnaXQgcmVhZC10cmVlIC1tIC11IG1hc3RlciBzaWRlIDI+JjFgCisJdGhlbgorCQllY2hvIHNob3VsZCBoYXZlIGNvbXBsYWluZWQKKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gImhhcHB5IHRvIHNlZSAkZXJyIgorCWZpCisnCisKK2VjaG8gZmlsZTIgPi5naXRpZ25vcmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHdvLXdheSB3aXRoIGluY29ycmVjdCAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSAoMSknICcKKworCWlmIGVycj1gZ2l0IHJlYWQtdHJlZSAtbSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlIG1hc3RlciBzaWRlIDI+JjFgCisJdGhlbgorCQllY2hvIHNob3VsZCBoYXZlIGNvbXBsYWluZWQKKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gImhhcHB5IHRvIHNlZSAkZXJyIgorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3R3by13YXkgd2l0aCBpbmNvcnJlY3QgLS1leGNsdWRlLXBlci1kaXJlY3RvcnkgKDIpJyAnCisKKwlpZiBlcnI9YGdpdCByZWFkLXRyZWUgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9Zm9vIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgbWFzdGVyIHNpZGUgMj4mMWAKKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgY29tcGxhaW5lZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiaGFwcHkgdG8gc2VlICRlcnIiCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHdvLXdheSBjbG9iYmVyaW5nIGEgaWdub3JlZCBmaWxlJyAnCisKKwlnaXQgcmVhZC10cmVlIC1tIC11IC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgbWFzdGVyIHNpZGUKKycKKworcm0gLWYgLmdpdGlnbm9yZQorCisjIHRocmVlLXRyZWUgdGVzdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aHJlZS13YXkgbm90IGNvbXBsYWluaW5nIG9uIGFuIHVudHJhY2tlZCBwYXRoIGluIGJvdGgnICcKKworCXJtIC1mIGZpbGUyIHN1YmRpci9maWxlMiAmJgorCWdpdCBjaGVja291dCBzaWRlICYmCisJZWNobyA+ZmlsZTMgZmlsZSB0aHJlZSAmJgorCWVjaG8gPnN1YmRpci9maWxlMyBmaWxlIHRocmVlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMyBzdWJkaXIvZmlsZTMgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJzaWRlIGFkZHMgZmlsZTMgYW5kIHJlbW92ZXMgZmlsZTIiICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZWNobyA+ZmlsZTIgZmlsZSB0d28gaXMgdW50cmFja2VkIG9uIHRoZSBtYXN0ZXIgc2lkZSAmJgorCWVjaG8gPnN1YmRpci9maWxlMiBmaWxlIHR3byBpcyB1bnRyYWNrZWQgb24gdGhlIG1hc3RlciBzaWRlICYmCisKKwlnaXQtcmVhZC10cmVlIC1tIC11IGJyYW5jaC1wb2ludCBtYXN0ZXIgc2lkZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aHJlZS13YXkgbm90IGNsb2JiZXJpbmcgYSB3b3JraW5nIHRyZWUgZmlsZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCXJtIC1mIGZpbGUyIHN1YmRpci9maWxlMiBmaWxlMyBzdWJkaXIvZmlsZTMgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZWNobyA+ZmlsZTMgZmlsZSB0aHJlZSBjcmVhdGVkIGluIG1hc3RlciwgdW50cmFja2VkICYmCisJZWNobyA+c3ViZGlyL2ZpbGUzIGZpbGUgdGhyZWUgY3JlYXRlZCBpbiBtYXN0ZXIsIHVudHJhY2tlZCAmJgorCWlmIGVycj1gZ2l0IHJlYWQtdHJlZSAtbSAtdSBicmFuY2gtcG9pbnQgbWFzdGVyIHNpZGUgMj4mMWAKKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgY29tcGxhaW5lZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiaGFwcHkgdG8gc2VlICRlcnIiCisJZmkKKycKKworZWNobyA+LmdpdGlnbm9yZSBmaWxlMworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aHJlZS13YXkgbm90IGNvbXBsYWluaW5nIG9uIGFuIHVudHJhY2tlZCBmaWxlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJcm0gLWYgZmlsZTIgc3ViZGlyL2ZpbGUyIGZpbGUzIHN1YmRpci9maWxlMyAmJgorCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwllY2hvID5maWxlMyBmaWxlIHRocmVlIGNyZWF0ZWQgaW4gbWFzdGVyLCB1bnRyYWNrZWQgJiYKKwllY2hvID5zdWJkaXIvZmlsZTMgZmlsZSB0aHJlZSBjcmVhdGVkIGluIG1hc3RlciwgdW50cmFja2VkICYmCisKKwlnaXQgcmVhZC10cmVlIC1tIC11IC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgYnJhbmNoLXBvaW50IG1hc3RlciBzaWRlCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAyMC1zdWJkaXJlY3Rvcnkuc2ggYi90L3QxMDIwLXN1YmRpcmVjdG9yeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZThmOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MTAyMC1zdWJkaXJlY3Rvcnkuc2gKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVHJ5IHZhcmlvdXMgY29yZS1sZXZlbCBjb21tYW5kcyBpbiBzdWJkaXJlY3RvcnkuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlsb25nPSJhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoiICYmCisJZm9yIGMgaW4gJGxvbmc7IGRvIGVjaG8gJGM7IGRvbmUgPm9uZSAmJgorCW1rZGlyIGRpciAmJgorCWZvciBjIGluIHggeSB6ICRsb25nIGEgYiBjOyBkbyBlY2hvICRjOyBkb25lID5kaXIvdHdvICYmCisJY3Agb25lIG9yaWdpbmFsLm9uZSAmJgorCWNwIGRpci90d28gb3JpZ2luYWwudHdvCisnCitIRVJFPWBwd2RgCitMRj0nCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCBhbmQgbHMtZmlsZXMnICcKKwljZCAkSEVSRSAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgb25lICYmCisJY2FzZSAiYGdpdC1scy1maWxlc2AiIGluCisJb25lKSBlY2hvIG9rIG9uZSA7OworCSopIGVjaG8gYmFkIG9uZTsgZXhpdCAxIDs7CisJZXNhYyAmJgorCWNkIGRpciAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgdHdvICYmCisJY2FzZSAiYGdpdC1scy1maWxlc2AiIGluCisJdHdvKSBlY2hvIG9rIHR3byA7OworCSopIGVjaG8gYmFkIHR3bzsgZXhpdCAxIDs7CisJZXNhYyAmJgorCWNkIC4uICYmCisJY2FzZSAiYGdpdC1scy1maWxlc2AiIGluCisJZGlyL3R3byIkTEYib25lKSBlY2hvIG9rIGJvdGggOzsKKwkqKSBlY2hvIGJhZDsgZXhpdCAxIDs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjYXQtZmlsZScgJworCWNkICRIRVJFICYmCisJdHdvPWBnaXQtbHMtZmlsZXMgLXMgZGlyL3R3b2AgJiYKKwl0d289YGV4cHIgIiR0d28iIDogIlswLTddKiBcXChbMC05YS1mXSpcXCkiYCAmJgorCWVjaG8gIiR0d28iICYmCisJZ2l0LWNhdC1maWxlIC1wICIkdHdvIiA+YWN0dWFsICYmCisJY21wIGRpci90d28gYWN0dWFsICYmCisJY2QgZGlyICYmCisJZ2l0LWNhdC1maWxlIC1wICIkdHdvIiA+YWN0dWFsICYmCisJY21wIHR3byBhY3R1YWwKKycKK3JtIC1mIGFjdHVhbCBkaXIvYWN0dWFsCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYtZmlsZXMnICcKKwljZCAkSEVSRSAmJgorCWVjaG8gYSA+Pm9uZSAmJgorCWVjaG8gZCA+PmRpci90d28gJiYKKwljYXNlICJgZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHlgIiBpbgorCWRpci90d28iJExGIm9uZSkgZWNobyBvayB0b3AgOzsKKwkqKSBlY2hvIGJhZCB0b3A7IGV4aXQgMSA7OworCWVzYWMgJiYKKwkjIGRpZmYgc2hvdWxkIG5vdCBvbWl0IGxlYWRpbmcgcGF0aHMKKwljZCBkaXIgJiYKKwljYXNlICJgZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHlgIiBpbgorCWRpci90d28iJExGIm9uZSkgZWNobyBvayBzdWJkaXIgOzsKKwkqKSBlY2hvIGJhZCBzdWJkaXI7IGV4aXQgMSA7OworCWVzYWMgJiYKKwljYXNlICJgZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgLmAiIGluCisJZGlyL3R3bykgZWNobyBvayBzdWJkaXIgbGltaXRlZCA7OworCSopIGVjaG8gYmFkIHN1YmRpciBsaW1pdGVkOyBleGl0IDEgOzsKKwllc2FjCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dyaXRlLXRyZWUnICcKKwljZCAkSEVSRSAmJgorCXRvcD1gZ2l0LXdyaXRlLXRyZWVgICYmCisJZWNobyAkdG9wICYmCisJY2QgZGlyICYmCisJc3ViPWBnaXQtd3JpdGUtdHJlZWAgJiYKKwllY2hvICRzdWIgJiYKKwl0ZXN0ICJ6JHRvcCIgPSAieiRzdWIiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0LWluZGV4JyAnCisJY2QgJEhFUkUgJiYKKwlnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgb25lICYmCisJY21wIG9uZSBvcmlnaW5hbC5vbmUgJiYKKwljZCBkaXIgJiYKKwlnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgdHdvICYmCisJY21wIHR3byAuLi9vcmlnaW5hbC50d28KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhZC10cmVlJyAnCisJY2QgJEhFUkUgJiYKKwlybSAtZiBvbmUgZGlyL3R3byAmJgorCXRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorCWdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAiJHRyZWUiICYmCisJY21wIG9uZSBvcmlnaW5hbC5vbmUgJiYKKwljbXAgZGlyL3R3byBvcmlnaW5hbC50d28gJiYKKwljZCBkaXIgJiYKKwlybSAtZiB0d28gJiYKKwlnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgIiR0cmVlIiAmJgorCWNtcCB0d28gLi4vb3JpZ2luYWwudHdvICYmCisJY21wIC4uL29uZSAuLi9vcmlnaW5hbC5vbmUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gZmlsZS9yZXYgYW1iaWd1aXR5IGNoZWNrIGluc2lkZSAuZ2l0JyAnCisJY2QgJEhFUkUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIDEgJiYKKwljZCAkSEVSRS8uZ2l0ICYmCisJZ2l0IHNob3cgLXMgSEVBRAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBmaWxlL3JldiBhbWJpZ3VpdHkgY2hlY2sgaW5zaWRlIGEgYmFyZSByZXBvJyAnCisJY2QgJEhFUkUgJiYKKwlnaXQgY2xvbmUgLXMgLS1iYXJlIC5naXQgZm9vLmdpdCAmJgorCWNkIGZvby5naXQgJiYgR0lUX0RJUj0uIGdpdCBzaG93IC1zIEhFQUQKKycKKworIyBUaGlzIHN0aWxsIGRvZXMgbm90IHdvcmsgYXMgaXQgc2hvdWxkLi4uCis6IHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vIGZpbGUvcmV2IGFtYmlndWl0eSBjaGVjayBpbnNpZGUgYSBiYXJlIHJlcG8nICcKKwljZCAkSEVSRSAmJgorCWdpdCBjbG9uZSAtcyAtLWJhcmUgLmdpdCBmb28uZ2l0ICYmCisJY2QgZm9vLmdpdCAmJiBnaXQgc2hvdyAtcyBIRUFECisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RldGVjdGlvbiBzaG91bGQgbm90IGJlIGZvb2xlZCBieSBhIHN5bWxpbmsnICcKKwljZCAkSEVSRSAmJgorCXJtIC1mciBmb28uZ2l0ICYmCisJZ2l0IGNsb25lIC1zIC5naXQgYW5vdGhlciAmJgorCWxuIC1zIGFub3RoZXIgeWV0YW5vdGhlciAmJgorCWNkIHlldGFub3RoZXIvLmdpdCAmJgorCWdpdCBzaG93IC1zIEhFQUQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMTAwLWNvbW1pdC10cmVlLW9wdGlvbnMuc2ggYi90L3QxMTAwLWNvbW1pdC10cmVlLW9wdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTlhMGVkNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDExMDAtY29tbWl0LXRyZWUtb3B0aW9ucy5zaApAQCAtMCwwICsxLDQ1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IFJlbmUgU2NoYXJmZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY29tbWl0LXRyZWUgb3B0aW9ucyB0ZXN0CisKK1RoaXMgdGVzdCBjaGVja3MgdGhhdCBnaXQtY29tbWl0LXRyZWUgY2FuIGNyZWF0ZSBhIHNwZWNpZmljIGNvbW1pdAorb2JqZWN0IGJ5IGRlZmluaW5nIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBpdCB1bmRlcnN0YW5kcy4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKK3RyZWUgNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNAorYXV0aG9yIEF1dGhvciBOYW1lIDxhdXRob3JAZW1haWw+IDExMTcxNDg0MDAgKzAwMDAKK2NvbW1pdHRlciBDb21taXR0ZXIgTmFtZSA8Y29tbWl0dGVyQGVtYWlsPiAxMTE3MTUwMjAwICswMDAwCisKK2NvbW1lbnQgdGV4dAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0ZXN0IHByZXBhcmF0aW9uOiB3cml0ZSBlbXB0eSB0cmVlJyBcCisgICAgJ2dpdC13cml0ZS10cmVlID50cmVlaWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb25zdHJ1Y3QgY29tbWl0JyBcCisgICAgJ2VjaG8gY29tbWVudCB0ZXh0IHwKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJBdXRob3IgTmFtZSIgXAorICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRob3JAZW1haWwiIFwKKyAgICAgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjAwIiBcCisgICAgIEdJVF9DT01NSVRURVJfTkFNRT0iQ29tbWl0dGVyIE5hbWUiIFwKKyAgICAgR0lUX0NPTU1JVFRFUl9FTUFJTD0iY29tbWl0dGVyQGVtYWlsIiBcCisgICAgIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorICAgICBUWj1HTVQgZ2l0LWNvbW1pdC10cmVlIGBjYXQgdHJlZWlkYCA+Y29tbWl0aWQgMj4vZGV2L251bGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIGNvbW1pdCcgXAorICAgICdnaXQtY2F0LWZpbGUgY29tbWl0IGBjYXQgY29tbWl0aWRgID5jb21taXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb21wYXJlIGNvbW1pdCcgXAorICAgICdkaWZmIGV4cGVjdGVkIGNvbW1pdCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMjAwLXR1dG9yaWFsLnNoIGIvdC90MTIwMC10dXRvcmlhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTJjMzBmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTIwMC10dXRvcmlhbC5zaApAQCAtMCwwICsxLDE2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0Egc2ltcGxlIHR1cmlhbCBpbiB0aGUgZm9ybSBvZiBhIHRlc3QgY2FzZScKKworLiAuL3Rlc3QtbGliLnNoCisKK2VjaG8gIkhlbGxvIFdvcmxkIiA+IGhlbGxvCitlY2hvICJTaWxseSBleGFtcGxlIiA+IGV4YW1wbGUKKworZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBoZWxsbyBleGFtcGxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jsb2InICJ0ZXN0IGJsb2IgPSBcIiQoZ2l0LWNhdC1maWxlIC10IDU1N2RiMDMpXCIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jsb2IgNTU3ZGIwMycgInRlc3QgXCJIZWxsbyBXb3JsZFwiID0gXCIkKGdpdC1jYXQtZmlsZSBibG9iIDU1N2RiMDMpXCIiCisKK2VjaG8gIkl0J3MgYSBuZXcgZGF5IGZvciBnaXQiID4+aGVsbG8KK2NhdCA+IGRpZmYuZXhwZWN0IDw8IEVPRgorZGlmZiAtLWdpdCBhL2hlbGxvIGIvaGVsbG8KK2luZGV4IDU1N2RiMDMuLjI2MzQxNGYgMTAwNjQ0CistLS0gYS9oZWxsbworKysrIGIvaGVsbG8KK0BAIC0xICsxLDIgQEAKKyBIZWxsbyBXb3JsZAorK0l0J3MgYSBuZXcgZGF5IGZvciBnaXQKK0VPRgorZ2l0LWRpZmYtZmlsZXMgLXAgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtZmlsZXMgLXAnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCitnaXQgZGlmZiA+IGRpZmYub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZicgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKKwordHJlZT0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0cmVlJyAidGVzdCA4OTg4ZGExNWQwNzdkNDgyOWZjNTFkODU0NGMwOTdkZWY2NjQ0ZGJiID0gJHRyZWUiCisKK291dHB1dD0iJChlY2hvICJJbml0aWFsIGNvbW1pdCIgfCBnaXQtY29tbWl0LXRyZWUgJChnaXQtd3JpdGUtdHJlZSkgMj4mMSA+IC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIpIgorCitnaXQtZGlmZi1pbmRleCAtcCBIRUFEID4gZGlmZi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWluZGV4IC1wIEhFQUQnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCisKK2dpdCBkaWZmIEhFQUQgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYgSEVBRCcgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKKworI3JtIGhlbGxvCisjdGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IEhFQUQnICJnaXQtcmVhZC10cmVlIC0tcmVzZXQgSEVBRCA7IHRlc3QgXCJoZWxsbzogbmVlZHMgdXBkYXRlXCIgPSBcIiQoZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gpXCIiCisKK2NhdCA+IHdoYXRjaGFuZ2VkLmV4cGVjdCA8PCBFT0YKK2NvbW1pdCBWQVJJQUJMRQorQXV0aG9yOiBWQVJJQUJMRQorRGF0ZTogICBWQVJJQUJMRQorCisgICAgSW5pdGlhbCBjb21taXQKKworZGlmZiAtLWdpdCBhL2V4YW1wbGUgYi9leGFtcGxlCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZjI0Yzc0YQorLS0tIC9kZXYvbnVsbAorKysrIGIvZXhhbXBsZQorQEAgLTAsMCArMSBAQAorK1NpbGx5IGV4YW1wbGUKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNTU3ZGIwMworLS0tIC9kZXYvbnVsbAorKysrIGIvaGVsbG8KK0BAIC0wLDAgKzEgQEAKKytIZWxsbyBXb3JsZAorRU9GCisKK2dpdC13aGF0Y2hhbmdlZCAtcCAtLXJvb3QgfCBcCisJc2VkIC1lICIxcy9eXCguXHs3XH1cKS5cezQwXH0vXDFWQVJJQUJMRS8iIFwKKwkJLWUgIjIsM3MvXlwoLlx7OFx9XCkuKiQvXDFWQVJJQUJMRS8iIFwKKz4gd2hhdGNoYW5nZWQub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtd2hhdGNoYW5nZWQgLXAgLS1yb290JyAnY21wIHdoYXRjaGFuZ2VkLmV4cGVjdCB3aGF0Y2hhbmdlZC5vdXRwdXQnCisKK2dpdCB0YWcgbXktZmlyc3QtdGFnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgdGFnIG15LWZpcnN0LXRhZycgJ2NtcCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy90YWdzL215LWZpcnN0LXRhZycKKworIyBUT0RPOiB0ZXN0IGdpdC1jbG9uZQorCitnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2gKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBjaGVja291dCAtYiBteWJyYW5jaCcgJ2NtcCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9teWJyYW5jaCcKKworY2F0ID4gYnJhbmNoLmV4cGVjdCA8PEVPRgorICBtYXN0ZXIKKyogbXlicmFuY2gKK0VPRgorCitnaXQgYnJhbmNoID4gYnJhbmNoLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGJyYW5jaCcgJ2NtcCBicmFuY2guZXhwZWN0IGJyYW5jaC5vdXRwdXQnCisKK2dpdCBjaGVja291dCBteWJyYW5jaAorZWNobyAiV29yaywgd29yaywgd29yayIgPj5oZWxsbworZ2l0IGNvbW1pdCAtbSAnU29tZSB3b3JrLicgLWkgaGVsbG8KKworZ2l0IGNoZWNrb3V0IG1hc3RlcgorCitlY2hvICJQbGF5LCBwbGF5LCBwbGF5IiA+PmhlbGxvCitlY2hvICJMb3RzIG9mIGZ1biIgPj5leGFtcGxlCitnaXQgY29tbWl0IC1tICdTb21lIGZ1bi4nIC1pIGhlbGxvIGV4YW1wbGUKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnZ2l0IHJlc29sdmUgbm93IGZhaWxzJyAnCisJZ2l0IG1lcmdlIC1tICJNZXJnZSB3b3JrIGluIG15YnJhbmNoIiBteWJyYW5jaAorJworCitjYXQgPiBoZWxsbyA8PCBFT0YKK0hlbGxvIFdvcmxkCitJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CitQbGF5LCBwbGF5LCBwbGF5CitXb3JrLCB3b3JrLCB3b3JrCitFT0YKKworZ2l0IGNvbW1pdCAtbSAnTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4nIC1pIGhlbGxvCisKK3Rlc3RfZG9uZQorCitjYXQgPiBzaG93LWJyYW5jaC5leHBlY3QgPDwgRU9GCisqIFttYXN0ZXJdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCisgISBbbXlicmFuY2hdIFNvbWUgd29yay4KKy0tCistICBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorKisgW215YnJhbmNoXSBTb21lIHdvcmsuCitFT0YKKworZ2l0IHNob3ctYnJhbmNoIC0tdG9wby1vcmRlciBtYXN0ZXIgbXlicmFuY2ggPiBzaG93LWJyYW5jaC5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBzaG93LWJyYW5jaCcgJ2NtcCBzaG93LWJyYW5jaC5leHBlY3Qgc2hvdy1icmFuY2gub3V0cHV0JworCitnaXQgY2hlY2tvdXQgbXlicmFuY2gKKworY2F0ID4gcmVzb2x2ZS5leHBlY3QgPDwgRU9GCitVcGRhdGluZyBmcm9tIFZBUklBQkxFIHRvIFZBUklBQkxFCisgZXhhbXBsZSB8ICAgIDEgKworIGhlbGxvICAgfCAgICAxICsKKyAyIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKK0VPRgorCitnaXQgbWVyZ2UgLXMgIk1lcmdlIHVwc3RyZWFtIGNoYW5nZXMuIiBtYXN0ZXIgfCBcCisJc2VkIC1lICIxcy9bMC05YS1mXVx7NDBcfS9WQVJJQUJMRS9nIiA+cmVzb2x2ZS5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCByZXNvbHZlJyAnY21wIHJlc29sdmUuZXhwZWN0IHJlc29sdmUub3V0cHV0JworCitjYXQgPiBzaG93LWJyYW5jaDIuZXhwZWN0IDw8IEVPRgorISBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorICogW215YnJhbmNoXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorLS0KKy0tIFttYXN0ZXJdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCitFT0YKKworZ2l0IHNob3ctYnJhbmNoIC0tdG9wby1vcmRlciBtYXN0ZXIgbXlicmFuY2ggPiBzaG93LWJyYW5jaDIub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgc2hvdy1icmFuY2gnICdjbXAgc2hvdy1icmFuY2gyLmV4cGVjdCBzaG93LWJyYW5jaDIub3V0cHV0JworCisjIFRPRE86IHRlc3QgZ2l0IGZldGNoCisKKyMgVE9ETzogdGVzdCBnaXQgcHVzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcmVwYWNrJyAnZ2l0IHJlcGFjaycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBwcnVuZS1wYWNrZWQnICdnaXQgcHJ1bmUtcGFja2VkJwordGVzdF9leHBlY3RfZmFpbHVyZSAnLT4gb25seSBwYWNrZWQgb2JqZWN0cycgJ2ZpbmQgLXR5cGUgZiAuZ2l0L29iamVjdHMvWzAtOWEtZl1bMC05YS1mXScKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDEzMDAtcmVwby1jb25maWcuc2ggYi90L3QxMzAwLXJlcG8tY29uZmlnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxYTc4YjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMzAwLXJlcG8tY29uZmlnLnNoCkBAIC0wLDAgKzEsNTIzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBnaXQtY29uZmlnIGluIGRpZmZlcmVudCBzZXR0aW5ncycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3QgLWYgLmdpdC9jb25maWcgJiYgcm0gLmdpdC9jb25maWcKKworZ2l0LWNvbmZpZyBjb3JlLnBlbmd1aW4gImxpdHRsZSBibHVlIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gbGl0dGxlIGJsdWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LWNvbmZpZyBDb3JlLk1vdmllIEJhZFBoeXNpY3MKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2NvcmVdCisJcGVuZ3VpbiA9IGxpdHRsZSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWl4ZWQgY2FzZScgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdC1jb25maWcgQ29yZXMuV2hhdEV2ZXIgU2Vjb25kCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworW0NvcmVzXQorCVdoYXRFdmVyID0gU2Vjb25kCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2ltaWxhciBzZWN0aW9uJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LWNvbmZpZyBDT1JFLlVQUEVSQ0FTRSB0cnVlCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworCVVQUEVSQ0FTRSA9IHRydWUKK1tDb3Jlc10KKwlXaGF0RXZlciA9IFNlY29uZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpbWlsYXIgc2VjdGlvbicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcGxhY2Ugd2l0aCBub24tbWF0Y2gnIFwKKwknZ2l0LWNvbmZpZyBjb3JlLnBlbmd1aW4ga2luZ3BpbiAhYmx1ZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVwbGFjZSB3aXRoIG5vbi1tYXRjaCAoYWN0dWFsbHkgbWF0Y2hpbmcpJyBcCisJJ2dpdC1jb25maWcgY29yZS5wZW5ndWluICJ2ZXJ5IGJsdWUiICFraW5ncGluJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gdmVyeSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCisJVVBQRVJDQVNFID0gdHJ1ZQorCXBlbmd1aW4gPSBraW5ncGluCitbQ29yZXNdCisJV2hhdEV2ZXIgPSBTZWNvbmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub24tbWF0Y2ggcmVzdWx0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworY2F0ID4gLmdpdC9jb25maWcgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJCWhhaGEgICA9ImJldGEiICMgbGFzdCBzaWxseSBjb21tZW50CitoYWhhID0gaGVsbG8KKwloYWhhID0gYmVsbG8KK1tuZXh0U2VjdGlvbl0gbm9OZXdsaW5lID0gb3VjaAorRU9GCisKK2NwIC5naXQvY29uZmlnIC5naXQvY29uZmlnMgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSB1bnNldCcgXAorCSdnaXQtY29uZmlnIC0tdW5zZXQtYWxsIGJldGEuaGFoYScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGlwbGUgdW5zZXQgaXMgY29ycmVjdCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK212IC5naXQvY29uZmlnMiAuZ2l0L2NvbmZpZworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXJlcGxhY2UtYWxsJyBcCisJJ2dpdC1jb25maWcgLS1yZXBsYWNlLWFsbCBiZXRhLmhhaGEgZ2FtbWEnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKKwloYWhhID0gZ2FtbWEKK1tuZXh0U2VjdGlvbl0gbm9OZXdsaW5lID0gb3VjaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FsbCByZXBsYWNlZCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdC1jb25maWcgYmV0YS5oYWhhIGFscGhhCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKKwloYWhhID0gYWxwaGEKK1tuZXh0U2VjdGlvbl0gbm9OZXdsaW5lID0gb3VjaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYWxseSBtZWFuIHRlc3QnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtY29uZmlnIG5leHRzZWN0aW9uLm5vbmV3bGluZSB3b3cKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCWhhaGEgPSBhbHBoYQorW25leHRTZWN0aW9uXQorCW5vbmV3bGluZSA9IHdvdworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYWxseSByZWFsbHkgbWVhbiB0ZXN0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0IHZhbHVlJyAndGVzdCBhbHBoYSA9ICQoZ2l0LWNvbmZpZyBiZXRhLmhhaGEpJworZ2l0LWNvbmZpZyAtLXVuc2V0IGJldGEuaGFoYQorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5zZXQnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtY29uZmlnIG5leHRzZWN0aW9uLk5vTmV3TGluZSAid293MiBmb3IgbWUiICJmb3IgbWUkIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhcicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbi1tYXRjaCcgXAorCSdnaXQtY29uZmlnIC0tZ2V0IG5leHRzZWN0aW9uLm5vbmV3bGluZSAhZm9yJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub24tbWF0Y2ggdmFsdWUnIFwKKwkndGVzdCB3b3cgPSAkKGdpdC1jb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICFmb3IpJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhbWJpZ3VvdXMgZ2V0JyBcCisJJ2dpdC1jb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgbXVsdGl2YXInIFwKKwknZ2l0LWNvbmZpZyAtLWdldC1hbGwgbmV4dHNlY3Rpb24ubm9uZXdsaW5lJworCitnaXQtY29uZmlnIG5leHRzZWN0aW9uLm5vbmV3bGluZSAid293MyIgIndvdyQiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlub25ld2xpbmUgPSB3b3czCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhciByZXBsYWNlJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYW1iaWd1b3VzIHZhbHVlJyAnZ2l0LWNvbmZpZyBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FtYmlndW91cyB1bnNldCcgXAorCSdnaXQtY29uZmlnIC0tdW5zZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdpbnZhbGlkIHVuc2V0JyBcCisJJ2dpdC1jb25maWcgLS11bnNldCBzb21lc2VjdGlvbi5ub25ld2xpbmUnCisKK2dpdC1jb25maWcgLS11bnNldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIndvdzMkIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhciB1bnNldCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2ludmFsaWQga2V5JyAnZ2l0LWNvbmZpZyBpbnZhbC4ya2V5IGJsYWJsYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29ycmVjdCBrZXknICdnaXQtY29uZmlnIDEyMzQ1Ni5hMTIzIDk4NycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaGllcmFyY2hpY2FsIHNlY3Rpb24nIFwKKwknZ2l0LWNvbmZpZyBWZXJzaW9uLjEuMi4zZVguQWxwaGEgYmV0YScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXQorCU5vTmV3TGluZSA9IHdvdzIgZm9yIG1lCitbMTIzNDU2XQorCWExMjMgPSA5ODcKK1tWZXJzaW9uICIxLjIuM2VYIl0KKwlBbHBoYSA9IGJldGEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdoaWVyYXJjaGljYWwgc2VjdGlvbiB2YWx1ZScgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2JldGEubm9pbmRlbnQ9c2lsbHlWYWx1ZQorbmV4dHNlY3Rpb24ubm9uZXdsaW5lPXdvdzIgZm9yIG1lCisxMjM0NTYuYTEyMz05ODcKK3ZlcnNpb24uMS4yLjNlWC5hbHBoYT1iZXRhCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd29ya2luZyAtLWxpc3QnIFwKKwknZ2l0LWNvbmZpZyAtLWxpc3QgPiBvdXRwdXQgJiYgY21wIG91dHB1dCBleHBlY3QnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2JldGEubm9pbmRlbnQgc2lsbHlWYWx1ZQorbmV4dHNlY3Rpb24ubm9uZXdsaW5lIHdvdzIgZm9yIG1lCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1nZXQtcmVnZXhwJyBcCisJJ2dpdC1jb25maWcgLS1nZXQtcmVnZXhwIGluID4gb3V0cHV0ICYmIGNtcCBvdXRwdXQgZXhwZWN0JworCitnaXQtY29uZmlnIC0tYWRkIG5leHRzZWN0aW9uLm5vbmV3bGluZSAid293NCBmb3IgeW91IgorCitjYXQgPiBleHBlY3QgPDwgRU9GCit3b3cyIGZvciBtZQord293NCBmb3IgeW91CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1hZGQnIFwKKwknZ2l0LWNvbmZpZyAtLWdldC1hbGwgbmV4dHNlY3Rpb24ubm9uZXdsaW5lID4gb3V0cHV0ICYmIGNtcCBvdXRwdXQgZXhwZWN0JworCitjYXQgPiAuZ2l0L2NvbmZpZyA8PCBFT0YKK1tub3ZhbHVlXQorCXZhcmlhYmxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0IHZhcmlhYmxlIHdpdGggbm8gdmFsdWUnIFwKKwknZ2l0LWNvbmZpZyAtLWdldCBub3ZhbHVlLnZhcmlhYmxlIF4kJworCitlY2hvIG5vdmFsdWUudmFyaWFibGUgPiBleHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0LXJlZ2V4cCB2YXJpYWJsZSB3aXRoIG5vIHZhbHVlJyBcCisJJ2dpdC1jb25maWcgLS1nZXQtcmVnZXhwIG5vdmFsdWUgPiBvdXRwdXQgJiYKKwkgY21wIG91dHB1dCBleHBlY3QnCisKK2dpdC1jb25maWcgPiBvdXRwdXQgMj4mMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBhcmd1bWVudHMsIGJ1dCBubyBjcmFzaCcgXAorCSJ0ZXN0ICQ/ID0gMTI5ICYmIGdyZXAgdXNhZ2Ugb3V0cHV0IgorCitjYXQgPiAuZ2l0L2NvbmZpZyA8PCBFT0YKK1thLmJdCisJYyA9IGQKK0VPRgorCitnaXQtY29uZmlnIGEueCB5CisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1thLmJdCisJYyA9IGQKK1thXQorCXggPSB5CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbmV3IHNlY3Rpb24gaXMgcGFydGlhbCBtYXRjaCBvZiBhbm90aGVyJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LWNvbmZpZyBiLnggeQorZ2l0LWNvbmZpZyBhLmIgYworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYS5iXQorCWMgPSBkCitbYV0KKwl4ID0geQorCWIgPSBjCitbYl0KKwl4ID0geQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25ldyB2YXJpYWJsZSBpbnNlcnRzIGludG8gcHJvcGVyIHNlY3Rpb24nICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitjYXQgPiBvdGhlci1jb25maWcgPDwgRU9GCitbZWluXQorCWJhaG4gPSBzdHJhc3NlCitFT0YKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorZWluLmJhaG49c3RyYXNzZQorRU9GCisKK0dJVF9DT05GSUc9b3RoZXItY29uZmlnIGdpdC1jb25maWcgLWwgPiBvdXRwdXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWx0ZXJuYXRpdmUgR0lUX0NPTkZJRycgJ2NtcCBvdXRwdXQgZXhwZWN0JworCitHSVRfQ09ORklHPW90aGVyLWNvbmZpZyBnaXQtY29uZmlnIGFud29obmVyLnBhcmsgYXVzd2VpcworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbZWluXQorCWJhaG4gPSBzdHJhc3NlCitbYW53b2huZXJdCisJcGFyayA9IGF1c3dlaXMKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXNldCBpbiBhbHRlcm5hdGl2ZSBHSVRfQ09ORklHJyAnY21wIG90aGVyLWNvbmZpZyBleHBlY3QnCisKK2NhdCA+IC5naXQvY29uZmlnIDw8IEVPRgorIyBIYWxsbworCSNCZWxsbworW2JyYW5jaCAiZWlucyJdCisJeCA9IDEKK1ticmFuY2guZWluc10KKwl5ID0gMQorCVticmFuY2ggIjEgMjM0IGJsYWJsL2EiXQord2VpcmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJyZW5hbWUgc2VjdGlvbiIgXAorCSJnaXQtY29uZmlnIC0tcmVuYW1lLXNlY3Rpb24gYnJhbmNoLmVpbnMgYnJhbmNoLnp3ZWkiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKyMgSGFsbG8KKwkjQmVsbG8KK1ticmFuY2ggInp3ZWkiXQorCXggPSAxCitbYnJhbmNoICJ6d2VpIl0KKwl5ID0gMQorCVticmFuY2ggIjEgMjM0IGJsYWJsL2EiXQord2VpcmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJyZW5hbWUgc3VjY2VlZGVkIiAiZ2l0IGRpZmYgZXhwZWN0IC5naXQvY29uZmlnIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICJyZW5hbWUgbm9uLWV4aXN0aW5nIHNlY3Rpb24iIFwKKwknZ2l0LWNvbmZpZyAtLXJlbmFtZS1zZWN0aW9uIGJyYW5jaC4id29ybGQgZG9taW5hdGlvbiIgYnJhbmNoLmRyZWknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBzdWNjZWVkZWQiICJnaXQgZGlmZiBleHBlY3QgLmdpdC9jb25maWciCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBhbm90aGVyIHNlY3Rpb24iIFwKKwknZ2l0LWNvbmZpZyAtLXJlbmFtZS1zZWN0aW9uIGJyYW5jaC4iMSAyMzQgYmxhYmwvYSIgYnJhbmNoLmRyZWknCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKyMgSGFsbG8KKwkjQmVsbG8KK1ticmFuY2ggInp3ZWkiXQorCXggPSAxCitbYnJhbmNoICJ6d2VpIl0KKwl5ID0gMQorW2JyYW5jaCAiZHJlaSJdCit3ZWlyZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBzdWNjZWVkZWQiICJnaXQgZGlmZiBleHBlY3QgLmdpdC9jb25maWciCisKK2NhdCA+PiAuZ2l0L2NvbmZpZyA8PCBFT0YKKyAgW2JyYW5jaCAiendlaSJdIGEgPSAxIFticmFuY2ggInZpZXIiXQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbW92ZSBzZWN0aW9uIiAiZ2l0IGNvbmZpZyAtLXJlbW92ZS1zZWN0aW9uIGJyYW5jaC56d2VpIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCisjIEhhbGxvCisJI0JlbGxvCitbYnJhbmNoICJkcmVpIl0KK3dlaXJkCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAic2VjdGlvbiB3YXMgcmVtb3ZlZCBwcm9wZXJseSIgXAorCSJnaXQgZGlmZiAtdSBleHBlY3QgLmdpdC9jb25maWciCisKK3JtIC5naXQvY29uZmlnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tnaXRjdnNdCisJZW5hYmxlZCA9IHRydWUKKwlkYm5hbWUgPSAlR2dpdGN2czIuJWEuJW0uc3FsaXRlCitbZ2l0Y3ZzICJleHQiXQorCWRibmFtZSA9ICVHZ2l0Y3ZzMS4lYS4lbS5zcWxpdGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZWN0aW9uIGVuZGluZycgJworCisJZ2l0LWNvbmZpZyBnaXRjdnMuZW5hYmxlZCB0cnVlICYmCisJZ2l0LWNvbmZpZyBnaXRjdnMuZXh0LmRibmFtZSAlR2dpdGN2czEuJWEuJW0uc3FsaXRlICYmCisJZ2l0LWNvbmZpZyBnaXRjdnMuZGJuYW1lICVHZ2l0Y3ZzMi4lYS4lbS5zcWxpdGUgJiYKKwljbXAgLmdpdC9jb25maWcgZXhwZWN0CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBudW1iZXJzICcKKworCWdpdC1jb25maWcga2lsby5ncmFtIDFrICYmCisJZ2l0LWNvbmZpZyBtZWdhLnRvbiAxbSAmJgorCWs9JChnaXQtY29uZmlnIC0taW50IC0tZ2V0IGtpbG8uZ3JhbSkgJiYKKwl0ZXN0IHoxMDI0ID0gInokayIgJiYKKwltPSQoZ2l0LWNvbmZpZyAtLWludCAtLWdldCBtZWdhLnRvbikgJiYKKwl0ZXN0IHoxMDQ4NTc2ID0gInokbSIKKycKKworY2F0ID4gZXhwZWN0IDw8IEVPRgordHJ1ZQorZmFsc2UKK3RydWUKK2ZhbHNlCit0cnVlCitmYWxzZQordHJ1ZQorZmFsc2UKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIGJvb2wgJworCisJZ2l0LWNvbmZpZyBib29sLnRydWUxIDAxICYmCisJZ2l0LWNvbmZpZyBib29sLnRydWUyIC0xICYmCisJZ2l0LWNvbmZpZyBib29sLnRydWUzIFllUyAmJgorCWdpdC1jb25maWcgYm9vbC50cnVlNCB0cnVlICYmCisJZ2l0LWNvbmZpZyBib29sLmZhbHNlMSAwMDAgJiYKKwlnaXQtY29uZmlnIGJvb2wuZmFsc2UyICIiICYmCisJZ2l0LWNvbmZpZyBib29sLmZhbHNlMyBuTyAmJgorCWdpdC1jb25maWcgYm9vbC5mYWxzZTQgRkFMU0UgJiYKKwlybSAtZiByZXN1bHQgJiYKKwlmb3IgaSBpbiAxIDIgMyA0CisJZG8KKwkgICAgZ2l0LWNvbmZpZyAtLWJvb2wgLS1nZXQgYm9vbC50cnVlJGkgPj5yZXN1bHQKKwkgICAgZ2l0LWNvbmZpZyAtLWJvb2wgLS1nZXQgYm9vbC5mYWxzZSRpID4+cmVzdWx0CisgICAgICAgIGRvbmUgJiYKKwljbXAgZXhwZWN0IHJlc3VsdCcKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnaW52YWxpZCBib29sJyAnCisKKwlnaXQtY29uZmlnIGJvb2wubm9ib29sIGZvb2JhciAmJgorCWdpdC1jb25maWcgLS1ib29sIC0tZ2V0IGJvb2wubm9ib29sJworCitybSAuZ2l0L2NvbmZpZworCitnaXQtY29uZmlnIHF1b3RlLmxlYWRpbmcgIiB0ZXN0IgorZ2l0LWNvbmZpZyBxdW90ZS5lbmRpbmcgInRlc3QgIgorZ2l0LWNvbmZpZyBxdW90ZS5zZW1pY29sb24gInRlc3Q7dGVzdCIKK2dpdC1jb25maWcgcXVvdGUuaGFzaCAidGVzdCN0ZXN0IgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbcXVvdGVdCisJbGVhZGluZyA9ICIgdGVzdCIKKwllbmRpbmcgPSAidGVzdCAiCisJc2VtaWNvbG9uID0gInRlc3Q7dGVzdCIKKwloYXNoID0gInRlc3QjdGVzdCIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdxdW90aW5nJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3RfZmFpbHVyZSAna2V5IHdpdGggbmV3bGluZScgJ2dpdCBjb25maWcga2V5LndpdGhcXFwKK25ld2xpbmUgMTIzJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2YWx1ZSB3aXRoIG5ld2xpbmUnICdnaXQgY29uZmlnIGtleS5zdWIgdmFsdWUud2l0aFxcXAorbmV3bGluZScKKworY2F0ID4gLmdpdC9jb25maWcgPDxcRU9GCitbc2VjdGlvbl0KKwk7IGNvbW1lbnQgXAorCWNvbnRpbnVlZCA9IGNvbnRcCitpbnVlZAorCW5vbmNvbnQgICA9IG5vdCBjb250aW51ZWQgOyBcCisJcXVvdGVjb250ID0gImNvbnQ7XAoraW51ZWQiCitFT0YKKworY2F0ID4gZXhwZWN0IDw8XEVPRgorc2VjdGlvbi5jb250aW51ZWQ9Y29udGludWVkCitzZWN0aW9uLm5vbmNvbnQ9bm90IGNvbnRpbnVlZAorc2VjdGlvbi5xdW90ZWNvbnQ9Y29udDtpbnVlZAorRU9GCisKK2dpdCBjb25maWcgLS1saXN0ID4gcmVzdWx0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZhbHVlIGNvbnRpbnVlZCBvbiBuZXh0IGxpbmUnICdjbXAgcmVzdWx0IGV4cGVjdCcKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDE0MDAtdXBkYXRlLXJlZi5zaCBiL3QvdDE0MDAtdXBkYXRlLXJlZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGFiYTJjCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTQwMC11cGRhdGUtcmVmLnNoCkBAIC0wLDAgKzEsMjM0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdC11cGRhdGUtcmVmIGFuZCBiYXNpYyByZWYgbG9nZ2luZycKKy4gLi90ZXN0LWxpYi5zaAorCitaPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK0E9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorQj0yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCitDPTMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKK0Q9NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorRT01NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1CitGPTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYKK209cmVmcy9oZWFkcy9tYXN0ZXIKK25fZGlyPXJlZnMvaGVhZHMvZ3UKK249JG5fZGlyL2ZpeGVzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0iIFwKKwkiZ2l0LXVwZGF0ZS1yZWYgJG0gJEEgJiYKKwkgdGVzdCAkQSInID0gJChjYXQgLmdpdC8nIiRtIicpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSIgXAorCSJnaXQtdXBkYXRlLXJlZiAkbSAkQiAkQSAmJgorCSB0ZXN0ICRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJmYWlsIHRvIGNyZWF0ZSAkbiIgXAorCSJ0b3VjaCAuZ2l0LyRuX2RpcgorCSBnaXQtdXBkYXRlLXJlZiAkbiAkQSA+b3V0IDI+ZXJyIicKKwkgdGVzdCAkPyAhPSAwJworcm0gLWYgLmdpdC8kbl9kaXIgb3V0IGVycgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY3JlYXRlICRtIChieSBIRUFEKSIgXAorCSJnaXQtdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0gKGJ5IEhFQUQpIiBcCisJImdpdC11cGRhdGUtcmVmIEhFQUQgJEIgJEEgJiYKKwkgdGVzdCAkQiInID0gJChjYXQgLmdpdC8nIiRtIicpJworcm0gLWYgLmdpdC8kbQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwknKG5vdCkgY3JlYXRlIEhFQUQgd2l0aCBvbGQgc2hhMScgXAorCSJnaXQtdXBkYXRlLXJlZiBIRUFEICRBICRCIgordGVzdF9leHBlY3RfZmFpbHVyZSBcCisJIihub3QpIHByaW9yIGNyZWF0ZWQgLmdpdC8kbSIgXAorCSJ0ZXN0IC1mIC5naXQvJG0iCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgSEVBRCIgXAorCSJnaXQtdXBkYXRlLXJlZiBIRUFEICRBIgordGVzdF9leHBlY3RfZmFpbHVyZSBcCisJJyhub3QpIGNoYW5nZSBIRUFEIHdpdGggd3JvbmcgU0hBMScgXAorCSJnaXQtdXBkYXRlLXJlZiBIRUFEICRCICRaIgordGVzdF9leHBlY3RfZmFpbHVyZSBcCisJIihub3QpIGNoYW5nZWQgLmdpdC8kbSIgXAorCSJ0ZXN0ICRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCitybSAtZiAuZ2l0LyRtCisKKzogYSByZXBvc2l0b3J5IHdpdGggd29ya2luZyB0cmVlIGFsd2F5cyBoYXMgcmVmbG9nIHRoZXNlIGRheXMuLi4KKzogPi5naXQvbG9ncy9yZWZzL2hlYWRzL21hc3RlcgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAnIiRBIicgLW0gIkluaXRpYWwgQ3JlYXRpb24iICYmCisJIHRlc3QgJyIkQSInID0gJChjYXQgLmdpdC8nIiRtIicpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInVwZGF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzEiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCciICRCICRBICInLW0gIlN3aXRjaCIgJiYKKwkgdGVzdCAnIiRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkic2V0ICRtIChsb2dnZWQgYnkgdG91Y2gpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEJyIgJEEgJiYKKwkgdGVzdCAkQSInID0gJChjYXQgLmdpdC8nIiRtIicpJworCitjYXQgPmV4cGVjdCA8PEVPRgorJFogJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJSW5pdGlhbCBDcmVhdGlvbgorJEEgJEIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyNjAgKzAwMDAJU3dpdGNoCiskQiAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDg2MCArMDAwMAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkidmVyaWZ5aW5nICRtJ3MgbG9nIiBcCisJImRpZmYgZXhwZWN0IC5naXQvbG9ncy8kbSIKK3JtIC1yZiAuZ2l0LyRtIC5naXQvbG9ncyBleHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2VuYWJsZSBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMnIFwKKwknZ2l0LWNvbmZpZyBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMgdHJ1ZSAmJgorCSB0ZXN0IHRydWUgPSAkKGdpdC1jb25maWcgLS1ib29sIC0tZ2V0IGNvcmUubG9nQWxsUmVmVXBkYXRlcyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMiIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEJyIgJEEgIictbSAiSW5pdGlhbCBDcmVhdGlvbiIgJiYKKwkgdGVzdCAnIiRBIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkidXBkYXRlICRtIChsb2dnZWQgYnkgY29uZmlnKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzMiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCciICRCICRBICInLW0gIlN3aXRjaCIgJiYKKwkgdGVzdCAnIiRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkic2V0ICRtIChsb2dnZWQgYnkgY29uZmlnKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6NDMiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAnIiRBICYmCisJIHRlc3QgJEEiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzIwICswMDAwCUluaXRpYWwgQ3JlYXRpb24KKyRBICRCICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzgwICswMDAwCVN3aXRjaAorJEIgJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA5ODAgKzAwMDAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInZlcmlmeWluZyAkbSdzIGxvZyIgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCitybSAtZiAuZ2l0LyRtIC5naXQvbG9ncy8kbSBleHBlY3QKKworZ2l0LXVwZGF0ZS1yZWYgJG0gJEQKK2NhdCA+LmdpdC9sb2dzLyRtIDw8RU9GCiskQyAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDMyMCAtMDUwMAorJEEgJEIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAzODAgLTA1MDAKKyRGICRaICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwNjgwIC0wNTAwCiskWiAkRSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDk4MCAtMDUwMAorRU9GCisKK2VkPSJUaHUsIDI2IE1heSAyMDA1IDE4OjMyOjAwIC0wNTAwIgorZ2Q9IlRodSwgMjYgTWF5IDIwMDUgMTg6MzM6MDAgLTA1MDAiCitsZD0iVGh1LCAyNiBNYXkgMjAwNSAxODo0MzowMCAtMDUwMCIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjUgMjAwNX0iIChiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI1IDIwMDV9IiA+byAyPmUgJiYKKwkgdGVzdCAnIiRDIicgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICJ3YXJuaW5nOiBMb2cgZm9yICdcJ21hc3RlclwnJyBvbmx5IGdvZXMgYmFjayB0byAkZWQuIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiUXVlcnkgbWFzdGVyQHsyMDA1LTA1LTI1fSAoYmVmb3JlIGhpc3RvcnkpIiBcCisJJ3JtIC1mIG8gZQorCSBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3RlckB7MjAwNS0wNS0yNX0gPm8gMj5lICYmCisJIHRlc3QgJyIkQyInID0gJChjYXQgbykgJiYKKwkgZWNobyB0ZXN0ICJ3YXJuaW5nOiBMb2cgZm9yICdcJ21hc3RlclwnJyBvbmx5IGdvZXMgYmFjayB0byAkZWQuIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzE6NTl9IiAoMSBzZWNvbmQgYmVmb3JlIGhpc3RvcnkpJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAe01heSAyNiAyMDA1IDIzOjMxOjU5fSIgPm8gMj5lICYmCisJIHRlc3QgJyIkQyInID0gJChjYXQgbykgJiYKKwkgdGVzdCAid2FybmluZzogTG9nIGZvciAnXCcnbWFzdGVyJ1wnJyBvbmx5IGdvZXMgYmFjayB0byAkZWQuIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzI6MDB9IiAoZXhhY3RseSBoaXN0b3J5IHN0YXJ0KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHtNYXkgMjYgMjAwNSAyMzozMjowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICciJEEiJyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiAobWlkZGxlIG9mIGhpc3Rvcnkgd2l0aCBnYXApJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiA+byAyPmUgJiYKKwkgdGVzdCAnIiRCIicgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICJ3YXJuaW5nOiBMb2cgLmdpdC9sb2dzLyciJG0gaGFzIGdhcCBhZnRlciAkZ2QiJy4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjM4OjAwfSIgKG1pZGRsZSBvZiBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjM4OjAwfSIgPm8gMj5lICYmCisJIHRlc3QgJyIkWiInID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iIChleGFjdCBlbmQgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICciJEUiJyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAezIwMDUtMDUtMjh9IiAocGFzdCBlbmQgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yOH0iID5vIDI+ZSAmJgorCSB0ZXN0ICciJEQiJyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJyIkbSB1bmV4cGVjdGVkbHkgZW5kZWQgb24gJGxkIicuIiA9ICIkKGNhdCBlKSInCisKKworcm0gLWYgLmdpdC8kbSAuZ2l0L2xvZ3MvJG0gZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ2VjaG8gVEVTVCA+RiAmJgorICAgICBnaXQtYWRkIEYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgZ2l0LWNvbW1pdCAtbSBhZGQgLWEgJiYKKwkgaF9URVNUPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCSBlY2hvIFRoZSBvdGhlciBkYXkgdGhpcyBkaWQgbm90IHdvcmsuID5NICYmCisJIGVjaG8gQW5kIHRoZW4gQm9iIHRvbGQgbWUgaG93IHRvIGZpeCBpdC4gPj5NICYmCisJIGVjaG8gT1RIRVIgPkYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQxIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgZ2l0LWNvbW1pdCAtRiBNIC1hICYmCisJIGhfT1RIRVI9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJIGVjaG8gRklYRUQgPkYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQ0IiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0NCIgZ2l0LWNvbW1pdCAtLWFtZW5kICYmCisJIGhfRklYRUQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJIGVjaG8gVEVTVCtGSVhFRCA+RiAmJgorCSBlY2hvIE1lcmdlZCBpbml0aWFsIGNvbW1pdCBhbmQgYSBsYXRlciBjb21taXQuID5NICYmCisJIGVjaG8gJGhfVEVTVCA+LmdpdC9NRVJHRV9IRUFEICYmCisJIEdJVF9BVVRIT1JfREFURT0iMjAwNS0wNS0yNiAyMzo0NSIgXAorCSBHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6NDUiIGdpdC1jb21taXQgLUYgTSAmJgorCSBoX01FUkdFRD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKwkgcm0gLWYgTScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRoX1RFU1QgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJY29tbWl0IChpbml0aWFsKTogYWRkCiskaF9URVNUICRoX09USEVSICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwODYwICswMDAwCWNvbW1pdDogVGhlIG90aGVyIGRheSB0aGlzIGRpZCBub3Qgd29yay4KKyRoX09USEVSICRoX0ZJWEVEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUxMDQwICswMDAwCWNvbW1pdCAoYW1lbmQpOiBUaGUgb3RoZXIgZGF5IHRoaXMgZGlkIG5vdCB3b3JrLgorJGhfRklYRUQgJGhfTUVSR0VEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUxMTAwICswMDAwCWNvbW1pdCAobWVyZ2UpOiBNZXJnZWQgaW5pdGlhbCBjb21taXQgYW5kIGEgbGF0ZXIgY29tbWl0LgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNvbW1pdCBsb2dnZWQgdXBkYXRlcycgXAorCSJkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0iCit1bnNldCBoX1RFU1QgaF9PVEhFUiBoX0ZJWEVEIGhfTUVSR0VECisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6RiAoZXhwZWN0IE9USEVSKScgXAorCSd0ZXN0IE9USEVSID0gJChnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6RiknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNhdC1maWxlIGJsb2IgbWFzdGVyQHsyMDA1LTA1LTI2IDIzOjMwfTpGIChleHBlY3QgVEVTVCknIFwKKwkndGVzdCBURVNUID0gJChnaXQtY2F0LWZpbGUgYmxvYiAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjMwfTpGIiknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNhdC1maWxlIGJsb2IgbWFzdGVyQHsyMDA1LTA1LTI2IDIzOjQyfTpGIChleHBlY3QgT1RIRVIpJyBcCisJJ3Rlc3QgT1RIRVIgPSAkKGdpdC1jYXQtZmlsZSBibG9iICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6NDJ9OkYiKScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxNDEwLXJlZmxvZy5zaCBiL3QvdDE0MTAtcmVmbG9nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YmJjMzgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxNDEwLXJlZmxvZy5zaApAQCAtMCwwICsxLDE3OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHBydW5lIGFuZCByZWZsb2cgZXhwaXJhdGlvbicKKy4gLi90ZXN0LWxpYi5zaAorCitjaGVja19oYXZlICgpIHsKKwlnYWFoPSAmJgorCWZvciBOIGluICIkQCIKKwlkbworCQlldmFsICJvPVwkJE4iICYmIGdpdCBjYXQtZmlsZSAtdCAkbyB8fCB7CisJCQllY2hvIEdhYWggJE4KKwkJCWdhYWg9JE4KKwkJCWJyZWFrCisJCX0KKwlkb25lICYmCisJdGVzdCAteiAiJGdhYWgiCit9CisKK2NoZWNrX2ZzY2sgKCkgeworCW91dHB1dD0kKGdpdCBmc2NrIC0tZnVsbCkKKwljYXNlICIkMSIgaW4KKwknJykKKwkJdGVzdCAteiAiJG91dHB1dCIgOzsKKwkqKQorCQllY2hvICIkb3V0cHV0IiB8IGdyZXAgIiQxIiA7OworCWVzYWMKK30KKworY29ycnVwdCAoKSB7CisJYWE9JHsxJT8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/fSB6ej0kezEjPz99CisJbXYgLmdpdC9vYmplY3RzLyRhYS8kenogLmdpdC8kYWEkenoKK30KKworcmVjb3ZlciAoKSB7CisJYWE9JHsxJT8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/fSB6ej0kezEjPz99CisJbWtkaXIgLXAgLmdpdC9vYmplY3RzLyRhYQorCW12IC5naXQvJGFhJHp6IC5naXQvb2JqZWN0cy8kYWEvJHp6Cit9CisKK2NoZWNrX2RvbnRfaGF2ZSAoKSB7CisJZ2FhaD0gJiYKKwlmb3IgTiBpbiAiJEAiCisJZG8KKwkJZXZhbCAibz1cJCROIgorCQlnaXQgY2F0LWZpbGUgLXQgJG8gJiYgeworCQkJZWNobyBHYWFoICROCisJCQlnYWFoPSROCisJCQlicmVhaworCQl9CisJZG9uZQorCXRlc3QgLXogIiRnYWFoIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlta2RpciAtcCBBL0IgJiYKKwllY2hvIHJhdCA+QyAmJgorCWVjaG8gb3ggPkEvRCAmJgorCWVjaG8gdGlnZXIgPkEvQi9FICYmCisJZ2l0IGFkZCAuICYmCisKKwl0ZXN0X3RpY2sgJiYgZ2l0IGNvbW1pdCAtbSByYWJiaXQgJiYKKwlIPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisJQT1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOkFgICYmCisJQj1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOkEvQmAgJiYKKwlDPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6Q2AgJiYKKwlEPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6QS9EYCAmJgorCUU9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpBL0IvRWAgJiYKKwljaGVja19mc2NrICYmCisKKwljaG1vZCAreCBDICYmCisJKCB0ZXN0ICJgZ2l0IGNvbmZpZyAtLWJvb2wgY29yZS5maWxlbW9kZWAiICE9IGZhbHNlIHx8CisJICBlY2hvIGV4ZWN1dGFibGUgPj5DICkgJiYKKwlnaXQgYWRkIEMgJiYKKwl0ZXN0X3RpY2sgJiYgZ2l0IGNvbW1pdCAtbSBkcmFnb24gJiYKKwlMPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisJY2hlY2tfZnNjayAmJgorCisJcm0gLWYgQyBBL0IvRSAmJgorCWVjaG8gc25ha2UgPkYgJiYKKwllY2hvIGhvcnNlID5BL0cgJiYKKwlnaXQgYWRkIEYgQS9HICYmCisJdGVzdF90aWNrICYmIGdpdCBjb21taXQgLWEgLW0gc2hlZXAgJiYKKwlGPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6RmAgJiYKKwlHPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6QS9HYCAmJgorCUk9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpBYCAmJgorCUo9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKwljaGVja19mc2NrICYmCisKKwlybSAtZiBBL0cgJiYKKwl0ZXN0X3RpY2sgJiYgZ2l0IGNvbW1pdCAtYSAtbSBtb25rZXkgJiYKKwlLPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisJY2hlY2tfZnNjayAmJgorCisJY2hlY2tfaGF2ZSBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCAmJgorCisJZ2l0IHBydW5lICYmCisKKwljaGVja19oYXZlIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMICYmCisKKwljaGVja19mc2NrICYmCisKKwlsb2dsZW49JCh3YyAtbCA8LmdpdC9sb2dzL3JlZnMvaGVhZHMvbWFzdGVyKSAmJgorCXRlc3QgJGxvZ2xlbiA9IDQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyByZXdpbmQgJworCXRlc3RfdGljayAmJiBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MiAmJgorCXRlc3QgLWYgQyAmJgorCXRlc3QgLWYgQS9CL0UgJiYKKwkhIHRlc3QgLWYgRiAmJgorCSEgdGVzdCAtZiBBL0cgJiYKKworCWNoZWNrX2hhdmUgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgJiYKKworCWdpdCBwcnVuZSAmJgorCisJY2hlY2tfaGF2ZSBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCAmJgorCisJbG9nbGVuPSQod2MgLWwgPC5naXQvbG9ncy9yZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICRsb2dsZW4gPSA1CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvcnJ1cHQgYW5kIGNoZWNrJyAnCisKKwljb3JydXB0ICRGICYmCisJY2hlY2tfZnNjayAibWlzc2luZyBibG9iICRGIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlZmxvZyBleHBpcmUgLS1kcnktcnVuIHNob3VsZCBub3QgdG91Y2ggcmVmbG9nJyAnCisKKwlnaXQgcmVmbG9nIGV4cGlyZSAtLWRyeS1ydW4gXAorCQktLWV4cGlyZT0kKCgkdGVzdF90aWNrIC0gMTAwMDApKSBcCisJCS0tZXhwaXJlLXVucmVhY2hhYmxlPSQoKCR0ZXN0X3RpY2sgLSAxMDAwMCkpIFwKKwkJLS1zdGFsZS1maXggXAorCQktLWFsbCAmJgorCisJbG9nbGVuPSQod2MgLWwgPC5naXQvbG9ncy9yZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICRsb2dsZW4gPSA1ICYmCisKKwljaGVja19mc2NrICJtaXNzaW5nIGJsb2IgJEYiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlZmxvZyBleHBpcmUnICcKKworCWdpdCByZWZsb2cgZXhwaXJlIC0tdmVyYm9zZSBcCisJCS0tZXhwaXJlPSQoKCR0ZXN0X3RpY2sgLSAxMDAwMCkpIFwKKwkJLS1leHBpcmUtdW5yZWFjaGFibGU9JCgoJHRlc3RfdGljayAtIDEwMDAwKSkgXAorCQktLXN0YWxlLWZpeCBcCisJCS0tYWxsICYmCisKKwlsb2dsZW49JCh3YyAtbCA8LmdpdC9sb2dzL3JlZnMvaGVhZHMvbWFzdGVyKSAmJgorCXRlc3QgJGxvZ2xlbiA9IDIgJiYKKworCWNoZWNrX2ZzY2sgImRhbmdsaW5nIGNvbW1pdCAkSyIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJ1bmUgYW5kIGZzY2snICcKKworCWdpdCBwcnVuZSAmJgorCWNoZWNrX2ZzY2sgJiYKKworCWNoZWNrX2hhdmUgQSBCIEMgRCBFIEggTCAmJgorCWNoZWNrX2RvbnRfaGF2ZSBGIEcgSSBKIEsKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWNvdmVyIGFuZCBjaGVjaycgJworCisJcmVjb3ZlciAkRiAmJgorCWNoZWNrX2ZzY2sgImRhbmdsaW5nIGJsb2IgJEYiCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAwLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wM2VhNGRlCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCB0ZXN0LgorCitUaGlzIHRlc3QgcmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXN5c3RlbSBzdHJ1Y3R1cmUgaW4gdGhlCitjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworQW5kIHRoZW4gdHJpZXMgdG8gY2hlY2tvdXQgaW4gYSB3b3JrIHRyZWUgdGhhdCBoYXMgdGhlIGZvbGxvd2luZzoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEgICAgICAgLSBhIGZpbGUKKworVGhlIGdpdC1jaGVja291dC1pbmRleCBjb21tYW5kIHNob3VsZCBmYWlsIHdoZW4gYXR0ZW1wdGluZyB0byBjaGVja291dAorcGF0aDAsIGZpbmRpbmcgaXQgaXMgb2NjdXBpZWQgYnkgYSBkaXJlY3RvcnksIGFuZCBwYXRoMS9maWxlMSwgZmluZGluZworcGF0aDEgaXMgb2NjdXBpZWQgYnkgYSBub24tZGlyZWN0b3J5LiAgV2l0aCAiLWYiIGZsYWcsIGl0IHNob3VsZCByZW1vdmUKK3RoZSBjb25mbGljdGluZyBwYXRocyBhbmQgc3VjY2VlZC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitkYXRlID5wYXRoMAorbWtkaXIgcGF0aDEKK2RhdGUgPnBhdGgxL2ZpbGUxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEvZmlsZTEnCisKK3JtIC1mciBwYXRoMCBwYXRoMQorbWtkaXIgcGF0aDAKK2RhdGUgPnBhdGgwL2ZpbGUwCitkYXRlID5wYXRoMQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IHdpdGhvdXQgLWYgc2hvdWxkIGZhaWwgb24gY29uZmxpY3Rpbmcgd29yayB0cmVlLicgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggd2l0aCAtZiBzaG91bGQgc3VjY2VlZC4nIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IGNvbmZsaWN0aW5nIHBhdGhzLicgXAorICAgICd0ZXN0IC1mIHBhdGgwICYmIHRlc3QgLWQgcGF0aDEgJiYgdGVzdCAtZiBwYXRoMS9maWxlMScKKwordGVzdF9kb25lCisKKwpkaWZmIC0tZ2l0IGEvdC90MjAwMS1jaGVja291dC1jYWNoZS1jbGFzaC5zaCBiL3QvdDIwMDEtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGRjYWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDEtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2gKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggdGVzdC4KKworVGhpcyB0ZXN0IHJlZ2lzdGVycyB0aGUgZm9sbG93aW5nIGZpbGVzeXN0ZW0gc3RydWN0dXJlIGluIHRoZSBjYWNoZToKKworICAgIHBhdGgwL2ZpbGUwCS0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworYW5kIGF0dGVtcHRzIHRvIGNoZWNrIGl0IG91dCB3aGVuIHRoZSB3b3JrIHRyZWUgaGFzOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMSAgICAgICAtIGEgc3ltbGluayBwb2ludGluZyBhdCAicGF0aDAiCisKK0NoZWNrb3V0IGNhY2hlIHNob3VsZCBmYWlsIHRvIGV4dHJhY3QgcGF0aDEvZmlsZTEgYmVjYXVzZSB0aGUgbGVhZGluZworcGF0aCBwYXRoMSBpcyBvY2N1cGllZCBieSBhIG5vbi1kaXJlY3RvcnkuICBXaXRoICItZiIgaXQgc2hvdWxkIHJlbW92ZQordGhlIHN5bWxpbmsgcGF0aDEgYW5kIGNyZWF0ZSBkaXJlY3RvcnkgcGF0aDEgYW5kIGZpbGUgcGF0aDEvZmlsZTEuCisnCisuIC4vdGVzdC1saWIuc2gKKworc2hvd19maWxlcygpIHsKKwkjIHNob3cgZmlsZXN5c3RlbSBmaWxlcywganVzdCBbLWRsXSBmb3IgdHlwZSBhbmQgbmFtZQorCWZpbmQgcGF0aD8gLWxzIHwKKwlzZWQgLWUgJ3MvXlswLTldKiAqIFswLTldKiAqIFwoWy1iY2RsXVwpW14gXSogKlswLTldKiAqW14gXSogKlteIF0qICpbMC05XSogW0EtWl1bYS16XVthLXpdIFswLTldWzAtOV0gW14gXSogL2ZzOiBcMSAvJworCSMgd2hhdCdzIGluIHRoZSBjYWNoZSwganVzdCBtb2RlIGFuZCBuYW1lCisJZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgfAorCXNlZCAtZSAncy9eXChbMC05XSpcKSBbMC05YS1mXSogWzAtM10gL2NhOiBcMSAvJworCSMgd2hhdCdzIGluIHRoZSB0cmVlLCBqdXN0IG1vZGUgYW5kIG5hbWUuCisJZ2l0LWxzLXRyZWUgLXIgIiQxIiB8CisJc2VkIC1lICdzL15cKFswLTldKlwpCVteIF0qCVswLTlhLWZdKgkvdHI6IFwxIC8nCit9CisKK21rZGlyIHBhdGgwCitkYXRlID5wYXRoMC9maWxlMAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAvZmlsZTAnIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMC9maWxlMCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUnIFwKKyAgICAndHJlZTE9JChnaXQtd3JpdGUtdHJlZSknCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMScKKworbWtkaXIgcGF0aDEKK2RhdGUgPnBhdGgxL2ZpbGUxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMS9maWxlMScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgxL2ZpbGUxJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZScgXAorICAgICd0cmVlMj0kKGdpdC13cml0ZS10cmVlKScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUyJworCitybSAtZnIgcGF0aDEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIHByZXZpb3VzbHkgd3JpdHRlbiB0cmVlIGFuZCBjaGVja291dC4nIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZTEgJiYgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTEnCisKK2xuIC1zIHBhdGgwIHBhdGgxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBhIHN5bWxpbmsuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDEnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlJyBcCisgICAgJ3RyZWUzPSQoZ2l0LXdyaXRlLXRyZWUpJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTMnCisKKyMgTW9ydGVuIHNheXMgIkdvdCB0aGF0PyIgaGVyZS4KKyMgVGVzdCBiZWdpbnMuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIHByZXZpb3VzbHkgd3JpdHRlbiB0cmVlIGFuZCBjaGVja291dC4nIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZTIgJiYgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyBvdXQgY29uZmxpY3RpbmcgcGF0aCB3aXRoIC1mJyBcCisgICAgJ3Rlc3QgISAtaCBwYXRoMCAmJiB0ZXN0IC1kIHBhdGgwICYmCisgICAgIHRlc3QgISAtaCBwYXRoMSAmJiB0ZXN0IC1kIHBhdGgxICYmCisgICAgIHRlc3QgISAtaCBwYXRoMC9maWxlMCAmJiB0ZXN0IC1mIHBhdGgwL2ZpbGUwICYmCisgICAgIHRlc3QgISAtaCBwYXRoMS9maWxlMSAmJiB0ZXN0IC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90MjAwMi1jaGVja291dC1jYWNoZS11LnNoIGIvdC90MjAwMi1jaGVja291dC1jYWNoZS11LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNTJkZGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggLXUgdGVzdC4KKworV2l0aCAtdSBmbGFnLCBnaXQtY2hlY2tvdXQtaW5kZXggaW50ZXJuYWxseSBydW5zIHRoZSBlcXVpdmFsZW50IG9mCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCBvbiB0aGUgY2hlY2tlZCBvdXQgZW50cnkuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK2VjaG8gZnJvdHogPnBhdGgwICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwICYmCit0PSQoZ2l0LXdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyd3aXRob3V0IC11LCBnaXQtY2hlY2tvdXQtaW5kZXggc211ZGdlcyBzdGF0IGluZm9ybWF0aW9uLicgJworcm0gLWYgcGF0aDAgJiYKK2dpdC1yZWFkLXRyZWUgJHQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtZiAtYSAmJgorZ2l0LWRpZmYtZmlsZXMgfCBkaWZmIC0gL2Rldi9udWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd3aXRoIC11LCBnaXQtY2hlY2tvdXQtaW5kZXggcGlja3MgdXAgc3RhdCBpbmZvcm1hdGlvbiBmcm9tIG5ldyBmaWxlcy4nICcKK3JtIC1mIHBhdGgwICYmCitnaXQtcmVhZC10cmVlICR0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLWEgJiYKK2dpdC1kaWZmLWZpbGVzIHwgZGlmZiAtIC9kZXYvbnVsbCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAzLWNoZWNrb3V0LWNhY2hlLW1rZGlyLnNoIGIvdC90MjAwMy1jaGVja291dC1jYWNoZS1ta2Rpci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOWJjOTBhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMy1jaGVja291dC1jYWNoZS1ta2Rpci5zaApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCAtLXByZWZpeCB0ZXN0LgorCitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IC0tcHJlZml4IG9wdGlvbiB3b3JrcyBhcyBhZHZlcnRpc2VkLCBhbmQKK2Fsc28gdmVyaWZpZXMgdGhhdCBzdWNoIGxlYWRpbmcgcGF0aCBtYXkgY29udGFpbiBzeW1saW5rcywgdW5saWtlCit0aGUgR0lUIGNvbnRyb2xsZWQgcGF0aHMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnbWtkaXIgcGF0aDEgJiYKKyAgICBlY2hvIGZyb3R6ID5wYXRoMCAmJgorICAgIGVjaG8gcmV6cm92ID5wYXRoMS9maWxlMSAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdoYXZlIHN5bWxpbmsgaW4gcGxhY2Ugd2hlcmUgZGlyIGlzIGV4cGVjdGVkLicgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgJiYKKyAgICAgbWtkaXIgcGF0aDIgJiYKKyAgICAgbG4gLXMgcGF0aDIgcGF0aDEgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIHRlc3QgISAtaCBwYXRoMSAmJiB0ZXN0IC1kIHBhdGgxICYmCisgICAgIHRlc3QgLWYgcGF0aDEvZmlsZTEgJiYgdGVzdCAhIC1mIHBhdGgyL2ZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXBhdGgyLycgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgJiYKKyAgICAgbWtkaXIgcGF0aDIgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXBhdGgyLyAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHBhdGgyL3BhdGgwICYmCisgICAgIHRlc3QgLWYgcGF0aDIvcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgwICYmCisgICAgIHRlc3QgISAtZiBwYXRoMS9maWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAtJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAtIC1mIC1hICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgwICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgISAtZiBwYXRoMCAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wLSBidXQgd2l0aCBhIGNvbmZsaWN0aW5nIGZpbGUgYW5kIGRpcicgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBlY2hvIG5pdGZvbCA+dG1wLXBhdGgxICYmCisgICAgIG1rZGlyIHRtcC1wYXRoMCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wLSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMCAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgxL2ZpbGUxJworCisjIExpbnVzIGZpeCAjMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAvb3JhcnkvIHdoZXJlIHRtcCBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSB0bXAxL29yYXJ5ICYmCisgICAgIGxuIC1zIHRtcDEgdG1wICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAvb3JhcnkvIC1mIC1hICYmCisgICAgIHRlc3QgLWQgdG1wMS9vcmFyeSAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnkvcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5L3BhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgLWggdG1wJworCisjIExpbnVzIGZpeCAjMgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAvb3JhcnktIHdoZXJlIHRtcCBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSAmJgorICAgICBsbiAtcyB0bXAxIHRtcCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wL29yYXJ5LSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnktcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5LXBhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgLWggdG1wJworCisjIExpbnVzIGZpeCAjMwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAtIHdoZXJlIHRtcC1wYXRoMSBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSAmJgorICAgICBsbiAtcyB0bXAxIHRtcC1wYXRoMSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wLSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMCAmJgorICAgICB0ZXN0ICEgLWggdG1wLXBhdGgxICYmCisgICAgIHRlc3QgLWQgdG1wLXBhdGgxICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDQtY2hlY2tvdXQtY2FjaGUtdGVtcC5zaCBiL3QvdDIwMDQtY2hlY2tvdXQtY2FjaGUtdGVtcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTAwOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwNC1jaGVja291dC1jYWNoZS10ZW1wLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggLS10ZW1wIHRlc3QuCisKK1dpdGggLS10ZW1wIGZsYWcsIGdpdC1jaGVja291dC1pbmRleCB3cml0ZXMgdG8gdGVtcG9yYXJ5IG1lcmdlIGZpbGVzCityYXRoZXIgdGhhbiB0aGUgdHJhY2tlZCBwYXRoLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3ByZXBhcmF0aW9uJyAnCitta2RpciBhc3ViZGlyICYmCitlY2hvIHRyZWUxcGF0aDAgPnBhdGgwICYmCitlY2hvIHRyZWUxcGF0aDEgPnBhdGgxICYmCitlY2hvIHRyZWUxcGF0aDMgPnBhdGgzICYmCitlY2hvIHRyZWUxcGF0aDQgPnBhdGg0ICYmCitlY2hvIHRyZWUxYXN1YmRpci9wYXRoNSA+YXN1YmRpci9wYXRoNSAmJgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMSBwYXRoMyBwYXRoNCBhc3ViZGlyL3BhdGg1ICYmCit0MT0kKGdpdC13cml0ZS10cmVlKSAmJgorcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2VjaG8gdHJlZTJwYXRoMCA+cGF0aDAgJiYKK2VjaG8gdHJlZTJwYXRoMSA+cGF0aDEgJiYKK2VjaG8gdHJlZTJwYXRoMiA+cGF0aDIgJiYKK2VjaG8gdHJlZTJwYXRoNCA+cGF0aDQgJiYKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEgcGF0aDIgcGF0aDQgJiYKK3QyPSQoZ2l0LXdyaXRlLXRyZWUpICYmCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZWNobyB0cmVlMnBhdGgwID5wYXRoMCAmJgorZWNobyB0cmVlM3BhdGgxID5wYXRoMSAmJgorZWNobyB0cmVlM3BhdGgyID5wYXRoMiAmJgorZWNobyB0cmVlM3BhdGgzID5wYXRoMyAmJgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMSBwYXRoMiBwYXRoMyAmJgordDM9JChnaXQtd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IG9uZSBzdGFnZSAwIHRvIHRlbXBvcmFyeSBmaWxlJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZ2l0LXJlYWQtdHJlZSAkdDEgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXRlbXAgLS0gcGF0aDEgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IHBhdGgxICYmCitwPSQoY3V0ICItZAkiIC1mMSBvdXQpICYmCit0ZXN0IC1mICRwICYmCit0ZXN0ICQoY2F0ICRwKSA9IHRyZWUxcGF0aDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZSAwIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2dpdC1yZWFkLXRyZWUgJHQxICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLWEgLS10ZW1wID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDUgJiYKK2ZvciBmIGluIHBhdGgwIHBhdGgxIHBhdGgzIHBhdGg0IGFzdWJkaXIvcGF0aDUKK2RvCisJdGVzdCAkKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMikgPSAkZiAmJgorCXA9JChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjEpICYmCisJdGVzdCAtZiAkcCAmJgorCXRlc3QgJChjYXQgJHApID0gdHJlZTEkZgorZG9uZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyZSAzLXdheSBtZXJnZScgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2dpdC1yZWFkLXRyZWUgLW0gJHQxICR0MiAkdDMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IG9uZSBzdGFnZSAyIHRvIHRlbXBvcmFyeSBmaWxlJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXN0YWdlPTIgLS10ZW1wIC0tIHBhdGgxID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBwYXRoMSAmJgorcD0kKGN1dCAiLWQJIiAtZjEgb3V0KSAmJgordGVzdCAtZiAkcCAmJgordGVzdCAkKGNhdCAkcCkgPSB0cmVlMnBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2UgMiB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tYWxsIC0tc3RhZ2U9MiAtLXRlbXAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMyAmJgorZm9yIGYgaW4gcGF0aDEgcGF0aDIgcGF0aDQKK2RvCisJdGVzdCAkKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMikgPSAkZiAmJgorCXA9JChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjEpICYmCisJdGVzdCAtZiAkcCAmJgorCXRlc3QgJChjYXQgJHApID0gdHJlZTIkZgorZG9uZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9vbmUgZmlsZSB0byBub3RoaW5nJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXN0YWdlPWFsbCAtLXRlbXAgLS0gcGF0aDAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9vbmUgZmlsZSB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9YWxsIC0tdGVtcCAtLSBwYXRoMSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDEgJiYKK2N1dCAiLWQJIiAtZjEgb3V0IHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxcGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDEpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBzb21lIHN0YWdlcy9vbmUgZmlsZSB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9YWxsIC0tdGVtcCAtLSBwYXRoMiA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDIgJiYKK2N1dCAiLWQJIiAtZjEgb3V0IHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgJHMxID0gLiAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGgyICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgyKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9hbGwgZmlsZXMgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtYSAtLXN0YWdlPWFsbCAtLXRlbXAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gNScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDA6IG5vIGVudHJ5JyAnCit0ZXN0IHgkKGdyZXAgcGF0aDAgb3V0IHwgY3V0ICItZAkiIC1mMikgPSB4JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoMTogYWxsIDMgc3RhZ2VzJyAnCit0ZXN0ICQoZ3JlcCBwYXRoMSBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGgxICYmCitncmVwIHBhdGgxIG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoMSAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMSAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgyOiBubyBzdGFnZSAxLCBoYXZlIHN0YWdlIDIgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGgyIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDIgJiYKK2dyZXAgcGF0aDIgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0ICRzMSA9IC4gJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMiAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMiknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgzOiBubyBzdGFnZSAyLCBoYXZlIHN0YWdlIDEgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGgzIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDMgJiYKK2dyZXAgcGF0aDMgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAkczIgPSAuICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoMyAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGg0OiBubyBzdGFnZSAzLCBoYXZlIHN0YWdlIDEgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGg0IG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDQgJiYKK2dyZXAgcGF0aDQgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgJHMzID0gLiAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoNCAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoNCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIGFzdWJkaXIvcGF0aDU6IG5vIHN0YWdlIDIgYW5kIDMgaGF2ZSBzdGFnZSAxJyAnCit0ZXN0ICQoZ3JlcCBhc3ViZGlyL3BhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjIpID0gYXN1YmRpci9wYXRoNSAmJgorZ3JlcCBhc3ViZGlyL3BhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgJHMyID0gLiAmJgordGVzdCAkczMgPSAuICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMWFzdWJkaXIvcGF0aDUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCAtLXRlbXAgd2l0aGluIHN1YmRpcicgJworKGNkIGFzdWJkaXIgJiYKKyBnaXQtY2hlY2tvdXQtaW5kZXggLWEgLS1zdGFnZT1hbGwgPm91dCAmJgorIHRlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKKyB0ZXN0ICQoZ3JlcCBwYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGg1ICYmCisgZ3JlcCBwYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKKyB0ZXN0IC1mIC4uLyRzMSAmJgorIHRlc3QgJHMyID0gLiAmJgorIHRlc3QgJHMzID0gLiAmJgorIHRlc3QgJChjYXQgLi4vJHMxKSA9IHRyZWUxYXN1YmRpci9wYXRoNSkKKyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IC0tdGVtcCBzeW1saW5rJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorbG4gLXMgYiBhICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGEgJiYKK3Q0PSQoZ2l0LXdyaXRlLXRyZWUpICYmCitybSAtZiAuZ2l0L2luZGV4ICYmCitnaXQtcmVhZC10cmVlICR0NCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tdGVtcCAtYSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gYSAmJgorcD0kKGN1dCAiLWQJIiAtZjEgb3V0KSAmJgordGVzdCAtZiAkcCAmJgordGVzdCAkKGNhdCAkcCkgPSBiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDUtY2hlY2tvdXQtaW5kZXgtc3ltbGlua3Muc2ggYi90L3QyMDA1LWNoZWNrb3V0LWluZGV4LXN5bWxpbmtzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzNGE1MTUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDA1LWNoZWNrb3V0LWluZGV4LXN5bWxpbmtzLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgU2l4dAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggb24gZmlsZXN5c3RlbSB3L28gc3ltbGlua3MgdGVzdC4KKworVGhpcyB0ZXN0cyB0aGF0IGdpdC1jaGVja291dC1pbmRleCBjcmVhdGVzIGEgc3ltYm9saWMgbGluayBhcyBhIHBsYWluCitmaWxlIGlmIGNvcmUuc3ltbGlua3MgaXMgZmFsc2UuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK2dpdC1jb25maWcgY29yZS5zeW1saW5rcyBmYWxzZSAmJgorbD0kKGVjaG8gLW4gZmlsZSB8IGdpdC1oYXNoLW9iamVjdCAtdCBibG9iIC13IC0tc3RkaW4pICYmCitlY2hvICIxMjAwMDAgJGwJc3ltbGluayIgfCBnaXQtdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisndGhlIGNoZWNrZWQtb3V0IHN5bWxpbmsgbXVzdCBiZSBhIGZpbGUnICcKK2dpdC1jaGVja291dC1pbmRleCBzeW1saW5rICYmCit0ZXN0IC1mIHN5bWxpbmsnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBmaWxlIG11c3QgYmUgdGhlIGJsb2Igd2UgYWRkZWQgZHVyaW5nIHRoZSBzZXR1cCcgJwordGVzdCAiJChnaXQtaGFzaC1vYmplY3QgLXQgYmxvYiBzeW1saW5rKSIgPSAkbCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMTAwLXVwZGF0ZS1jYWNoZS1iYWRwYXRoLnNoIGIvdC90MjEwMC11cGRhdGUtY2FjaGUtYmFkcGF0aC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YmMwYTNiCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjEwMC11cGRhdGUtY2FjaGUtYmFkcGF0aC5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC11cGRhdGUtaW5kZXggbm9uc2Vuc2UtcGF0aCB0ZXN0LgorCitUaGlzIHRlc3QgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgY2FjaGU6CisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIHBhdGgxICAgICAgIC0gYSBzeW1saW5rCisgICAgcGF0aDIvZmlsZTIgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMy9maWxlMyAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorCithbmQgdHJpZXMgdG8gZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB0aGUgZm9sbG93aW5nOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMS9maWxlMSAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDMgICAgICAgLSBhIHN5bWxpbmsKKworQWxsIG9mIHRoZSBhdHRlbXB0cyBzaG91bGQgZmFpbC4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK21rZGlyIHBhdGgyIHBhdGgzCitkYXRlID5wYXRoMAorbG4gLXMgeHl6enkgcGF0aDEKK2RhdGUgPnBhdGgyL2ZpbGUyCitkYXRlID5wYXRoMy9maWxlMworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB0byBhZGQgdmFyaW91cyBwYXRocy4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLSBwYXRoMCBwYXRoMSBwYXRoMi9maWxlMiBwYXRoMy9maWxlMycKKworcm0gLWZyIHBhdGg/CisKK21rZGlyIHBhdGgwIHBhdGgxCitkYXRlID5wYXRoMgorbG4gLXMgZnJvdHogcGF0aDMKK2RhdGUgPnBhdGgwL2ZpbGUwCitkYXRlID5wYXRoMS9maWxlMQorCitmb3IgcCBpbiBwYXRoMC9maWxlMCBwYXRoMS9maWxlMSBwYXRoMiBwYXRoMworZG8KKwl0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkgICAgImdpdC11cGRhdGUtaW5kZXggdG8gYWRkIGNvbmZsaWN0aW5nIHBhdGggJHAgc2hvdWxkIGZhaWwuIiBcCisJICAgICJnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tICRwIgorZG9uZQordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMTAxLXVwZGF0ZS1pbmRleC1yZXVwZGF0ZS5zaCBiL3QvdDIxMDEtdXBkYXRlLWluZGV4LXJldXBkYXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3OGVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMTAxLXVwZGF0ZS1pbmRleC1yZXVwZGF0ZS5zaApAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC11cGRhdGUtaW5kZXggLS1hZ2FpbiB0ZXN0LgorJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgM2IxOGU1MTJkYmE3OWU0YzgzMDBkZDA4YWViMzdmOGU3MjhiOGRhZCAwCWZpbGUxCisxMDA2NDQgOWRiODg5Mzg1NmE4YTAyZWFhNzM0NzAwNTRiN2MxYzVhN2M4MmU0NyAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLWFkZCcgXAorCSdlY2hvIGhlbGxvIHdvcmxkID5maWxlMSAmJgorCSBlY2hvIGdvb2RieWUgcGVvcGxlID5maWxlMiAmJgorCSBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUxIGZpbGUyICYmCisJIGdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tYWdhaW4nIFwKKwkncm0gLWYgZmlsZTEgJiYKKwllY2hvIGhlbGxvIGV2ZXJ5Ym9keSA+ZmlsZTIgJiYKKwlpZiBnaXQtdXBkYXRlLWluZGV4IC0tYWdhaW4KKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgcmVmdXNlZCB0byByZW1vdmUgZmlsZTEKKwkJZXhpdCAxCisJZWxzZQorCQllY2hvIGhhcHB5IC0gZmFpbGVkIGFzIGV4cGVjdGVkCisJZmkgJiYKKwkgZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tYWdhaW4nIFwKKwknZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLWFnYWluICYmCisJIGdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlyc3QgY29tbWl0JyAnZ2l0LWNvbW1pdCAtbSBpbml0aWFsJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCA1M2FiNDQ2YzNmNGU0MmNlOWJiNzI4YTBjY2IyODNhMTAxYmU0OTc5IDAJZGlyMS9maWxlMworMTAwNjQ0IDBmMWFlMTQyMmMyYmY0M2YxMTdkM2RiZDcxNWM5ODhhOWVkMjEwM2YgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggYWdhaW4nIFwKKwknbWtkaXIgLXAgZGlyMSAmJgorCWVjaG8gaGVsbG8gd29ybGQgPmRpcjEvZmlsZTMgJiYKKwllY2hvIGdvb2RieWUgcGVvcGxlID5maWxlMiAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZTIgZGlyMS9maWxlMyAmJgorCWVjaG8gaGVsbG8gZXZlcnlib2R5ID5maWxlMgorCWVjaG8gaGFwcHkgPmRpcjEvZmlsZTMgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWdhaW4gJiYKKwlnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwljbXAgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgZDdmYjNmNjk1ZjA2Yzc1OWRiZjNhYjAwMDQ2ZTdjYzJkYTIyZDEwZiAwCWRpcjEvZmlsZTMKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tdXBkYXRlIGZyb20gc3ViZGlyJyBcCisJJ2VjaG8gbm90IHNvIGhhcHB5ID5maWxlMiAmJgorCWNkIGRpcjEgJiYKKwljYXQgLi4vZmlsZTIgPmZpbGUzICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFnYWluICYmCisJY2QgLi4gJiYKKwlnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwljbXAgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgNTk0ZmI1YmIxNzU5ZDkwOTk4ZTJiZjJhMzgyNjFhZThlMjQzYzc2MCAwCWRpcjEvZmlsZTMKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tdXBkYXRlIHdpdGggcGF0aHNwZWMnIFwKKwknZWNobyB2ZXJ5IGhhcHB5ID5maWxlMiAmJgorCWNhdCBmaWxlMiA+ZGlyMS9maWxlMyAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZ2FpbiBkaXIxLyAmJgorCWdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCWNtcCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIxMDItdXBkYXRlLWluZGV4LXN5bWxpbmtzLnNoIGIvdC90MjEwMi11cGRhdGUtaW5kZXgtc3ltbGlua3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTY5ZWY4OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIxMDItdXBkYXRlLWluZGV4LXN5bWxpbmtzLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgU2l4dAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtdXBkYXRlLWluZGV4IG9uIGZpbGVzeXN0ZW0gdy9vIHN5bWxpbmtzIHRlc3QuCisKK1RoaXMgdGVzdHMgdGhhdCBnaXQtdXBkYXRlLWluZGV4IGtlZXBzIHRoZSBzeW1ib2xpYyBsaW5rIHByb3BlcnR5CitldmVuIGlmIGEgcGxhaW4gZmlsZSBpcyBpbiB0aGUgd29ya2luZyB0cmVlIGlmIGNvcmUuc3ltbGlua3MgaXMgZmFsc2UuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK2dpdC1jb25maWcgY29yZS5zeW1saW5rcyBmYWxzZSAmJgorbD0kKGVjaG8gLW4gZmlsZSB8IGdpdC1oYXNoLW9iamVjdCAtdCBibG9iIC13IC0tc3RkaW4pICYmCitlY2hvICIxMjAwMDAgJGwJc3ltbGluayIgfCBnaXQtdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnbW9kaWZ5IHRoZSBzeW1ib2xpYyBsaW5rJyAnCitlY2hvIC1uIG5ldy1maWxlID4gc3ltbGluayAmJgorZ2l0LXVwZGF0ZS1pbmRleCBzeW1saW5rJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd0aGUgaW5kZXggZW50cnkgbXVzdCBzdGlsbCBiZSBhIHN5bWJvbGljIGxpbmsnICcKK2Nhc2UgImBnaXQtbHMtZmlsZXMgLS1zdGFnZSAtLWNhY2hlZCBzeW1saW5rYCIgaW4KKzEyMDAwMCIgIipzeW1saW5rKSBlY2hvIG9rOzsKKyopIGVjaG8gZmFpbDsgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgLS1jYWNoZWQgc3ltbGluazsgKGV4aXQgMSk7OworZXNhYycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMjAwLWFkZC11cGRhdGUuc2ggYi90L3QyMjAwLWFkZC11cGRhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODMwMDVlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIyMDAtYWRkLXVwZGF0ZS5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFkZCAtdSB3aXRoIHBhdGggbGltaXRpbmcKKworVGhpcyB0ZXN0IGNyZWF0ZXMgYSB3b3JraW5nIHRyZWUgc3RhdGUgd2l0aCB0aHJlZSBmaWxlczoKKworICB0b3AgKHByZXZpb3VzbHkgY29tbWl0dGVkLCBtb2RpZmllZCkKKyAgZGlyL3N1YiAocHJldmlvdXNseSBjb21taXR0ZWQsIG1vZGlmaWVkKQorICBkaXIvb3RoZXIgKHVudHJhY2tlZCkKKworYW5kIGlzc3VlcyBhIGdpdC1hZGQgLXUgd2l0aCBwYXRoIGxpbWl0aW5nIG9uICJkaXIiIHRvIGFkZAorb25seSB0aGUgdXBkYXRlcyB0byBkaXIvc3ViLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCitlY2hvIGluaXRpYWwgPnRvcCAmJgorbWtkaXIgZGlyICYmCitlY2hvIGluaXRpYWwgPmRpci9zdWIgJiYKK2dpdC1hZGQgZGlyL3N1YiB0b3AgJiYKK2dpdC1jb21taXQgLW0gaW5pdGlhbCAmJgorZWNobyBjaGFuZ2VkID50b3AgJiYKK2VjaG8gY2hhbmdlZCA+ZGlyL3N1YiAmJgorZWNobyBvdGhlciA+ZGlyL290aGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZScgJ2dpdC1hZGQgLXUgZGlyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgdG91Y2hlZCBjb3JyZWN0IHBhdGgnIFwKKyAgJ3Rlc3QgImBnaXQtZGlmZi1maWxlcyAtLW5hbWUtc3RhdHVzIGRpci9zdWJgIiA9ICIiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgZGlkIG5vdCB0b3VjaCBvdGhlciB0cmFja2VkIGZpbGVzJyBcCisgICd0ZXN0ICJgZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLXN0YXR1cyB0b3BgIiA9ICJNCXRvcCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBkaWQgbm90IHRvdWNoIHVudHJhY2tlZCBmaWxlcycgXAorICAndGVzdCAiYGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1zdGF0dXMgZGlyL290aGVyYCIgPSAiIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaCBiL3QvdDMwMDAtbHMtZmlsZXMtb3RoZXJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkY2JlMDMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyB0ZXN0ICgtLW90aGVycyBzaG91bGQgcGljayB1cCBzeW1saW5rcykuCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy1maWxlcyAtLW90aGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgb24gdGhlCitmaWxlc3lzdGVtLgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMQktIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMtanVuayAgLSBhIGZpbGUgdG8gY29uZnVzZSB0aGluZ3MKKyAgICBwYXRoMy9maWxlMyAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorJworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGUgPnBhdGgwCitsbiAtcyB4eXp6eSBwYXRoMQorbWtkaXIgcGF0aDIgcGF0aDMKK2RhdGUgPnBhdGgyL2ZpbGUyCitkYXRlID5wYXRoMi1qdW5rCitkYXRlID5wYXRoMy9maWxlMworZGF0ZSA+cGF0aDMtanVuaworZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMy1qdW5rIHBhdGgzL2ZpbGUzCisKK2NhdCA+ZXhwZWN0ZWQxIDw8RU9GCitleHBlY3RlZDEKK2V4cGVjdGVkMgorb3V0cHV0CitwYXRoMAorcGF0aDEKK3BhdGgyLWp1bmsKK3BhdGgyL2ZpbGUyCitFT0YKK3NlZCAtZSAnc3xwYXRoMi9maWxlMnxwYXRoMi98JyA8ZXhwZWN0ZWQxID5leHBlY3RlZDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzID5vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgc2hvdWxkIHBpY2sgdXAgc3ltbGlua3MuJyBcCisgICAgJ2RpZmYgb3V0cHV0IGV4cGVjdGVkMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5ID5vdXRwdXQnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSBzaG91bGQgbm90IGdldCBjb25mdXNlZC4nIFwKKyAgICAnZGlmZiBvdXRwdXQgZXhwZWN0ZWQyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMDEtbHMtZmlsZXMtb3RoZXJzLWV4Y2x1ZGUuc2ggYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjZmNmYmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCkBAIC0wLDAgKzEsMTAyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUKKworVGhpcyB0ZXN0IHJ1bnMgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIGFuZCB0ZXN0cyAtLWV4Y2x1ZGUgcGF0dGVybnMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitybSAtZnIgb25lIHRocmVlCitmb3IgZGlyIGluIC4gb25lIG9uZS90d28gdGhyZWUKK2RvCisgIG1rZGlyIC1wICRkaXIgJiYKKyAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4CisgIGRvCisgICAgPiRkaXIvYS4kaQorICBkb25lCitkb25lCisKK2NhdCA+ZXhwZWN0IDw8RU9GCithLjIKK2EuNAorYS41CithLjgKK29uZS9hLjMKK29uZS9hLjQKK29uZS9hLjUKK29uZS9hLjcKK29uZS90d28vYS4yCitvbmUvdHdvL2EuMworb25lL3R3by9hLjUKK29uZS90d28vYS43CitvbmUvdHdvL2EuOAordGhyZWUvYS4yCit0aHJlZS9hLjMKK3RocmVlL2EuNAordGhyZWUvYS41Cit0aHJlZS9hLjgKK0VPRgorCitlY2hvICcuZ2l0aWdub3JlCitvdXRwdXQKK2V4cGVjdAorLmdpdGlnbm9yZQorKi43CishKi44JyA+LmdpdC9pZ25vcmUKKworZWNobyAnKi4xCisvKi4zCishKi42JyA+LmdpdGlnbm9yZQorZWNobyAnKi4yCit0d28vKi40CishKi43CisqLjgnID5vbmUvLmdpdGlnbm9yZQorZWNobyAnISouMgorISouOCcgPm9uZS90d28vLmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHdpdGggdmFyaW91cyBleGNsdWRlIG9wdGlvbnMuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyBcCisgICAgICAgLS1leGNsdWRlPVwqLjYgXAorICAgICAgIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICA+b3V0cHV0ICYmCisgICAgIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQnCisKKyMgVGVzdCBcclxuIChNU0RPUy1saWtlIHN5c3RlbXMpCitwcmludGYgJyouMVxyXG4vKi4zXHJcbiEqLjZcclxuJyA+LmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHdpdGggXHJcbiBsaW5lIGVuZGluZ3MuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyBcCisgICAgICAgLS1leGNsdWRlPVwqLjYgXAorICAgICAgIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICA+b3V0cHV0ICYmCisgICAgIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQnCisKK2NhdCA+IGV4Y2x1ZGVzLWZpbGUgPDwgRU9GCisqLlsxLThdCitlKgorRU9GCisKK2dpdC1jb25maWcgY29yZS5leGNsdWRlc0ZpbGUgZXhjbHVkZXMtZmlsZQorCitnaXQtcnVuc3RhdHVzIHwgZ3JlcCAiXiMJIiA+IG91dHB1dAorCitjYXQgPiBleHBlY3QgPDwgRU9GCisjCS5naXRpZ25vcmUKKyMJYS42CisjCW9uZS8KKyMJb3V0cHV0CisjCXRocmVlLworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1zdGF0dXMgaG9ub3VycyBjb3JlLmV4Y2x1ZGVzZmlsZScgXAorCSdkaWZmIC11IGV4cGVjdCBvdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAwMi1scy1maWxlcy1kYXNocGF0aC5zaCBiL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M4OTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtZmlsZXMgdGVzdCAoLS0gdG8gdGVybWluYXRlIHRoZSBwYXRoIGxpc3QpLgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtZmlsZXMgLS1vdGhlcnMgd2l0aCB0aGUgZm9sbG93aW5nIG9uIHRoZQorZmlsZXN5c3RlbS4KKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgLWZvbwktIGEgZmlsZSB3aXRoIGEgZnVubnkgbmFtZS4KKyAgICAtLQkJLSBhbm90aGVyIGZpbGUgd2l0aCBhIGZ1bm55IG5hbWUuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJc2V0dXAgXAorCSdlY2hvIGZyb3R6ID5wYXRoMCAmJgorCWVjaG8gZnJvdHogPi4vLWZvbyAmJgorCWVjaG8gZnJvdHogPi4vLS0nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aG91dCBwYXRoIHJlc3RyaWN0aW9uLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgPm91dHB1dCAmJgorICAgICBnaXQgZGlmZiBvdXRwdXQgLSA8PEVPRgorLS0KKy1mb28KK291dHB1dAorcGF0aDAKK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGggcGF0aCByZXN0cmljdGlvbi4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHBhdGgwID5vdXRwdXQgJiYKKwlnaXQgZGlmZiBvdXRwdXQgLSA8PEVPRgorcGF0aDAKK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGggcGF0aCByZXN0cmljdGlvbiB3aXRoIC0tLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLS0gcGF0aDAgPm91dHB1dCAmJgorCWdpdCBkaWZmIG91dHB1dCAtIDw8RU9GCitwYXRoMAorRU9GCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aCBwYXRoIHJlc3RyaWN0aW9uIHdpdGggLS0gLS0uJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLSAtLSA+b3V0cHV0ICYmCisJZ2l0IGRpZmYgb3V0cHV0IC0gPDxFT0YKKy0tCitFT0YKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyB3aXRoIG5vIHBhdGggcmVzdHJpY3Rpb24uJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLSA+b3V0cHV0ICYmCisJZ2l0IGRpZmYgb3V0cHV0IC0gPDxFT0YKKy0tCistZm9vCitvdXRwdXQKK3BhdGgwCitFT0YKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDEwLWxzLWZpbGVzLWtpbGxlZC1tb2RpZmllZC5zaCBiL3QvdDMwMTAtbHMtZmlsZXMta2lsbGVkLW1vZGlmaWVkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmYzE5NzYKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDEwLWxzLWZpbGVzLWtpbGxlZC1tb2RpZmllZC5zaApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyAtayBhbmQgLW0gZmxhZ3MgdGVzdC4KKworVGhpcyB0ZXN0IHByZXBhcmVzIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNhY2hlOgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMSAgICAgICAtIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvZmlsZTMgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworYW5kIHRoZSBmb2xsb3dpbmcgb24gdGhlIGZpbGVzeXN0ZW06CisKKyAgICBwYXRoMC9maWxlMCAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgxL2ZpbGUxIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMyAgICAgICAtIGEgc3ltbGluaworICAgIHBhdGg0CS0gYSBmaWxlCisgICAgcGF0aDUJLSBhIHN5bWxpbmsKKyAgICBwYXRoNi9maWxlNiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorCitnaXQtbHMtZmlsZXMgLWsgc2hvdWxkIHJlcG9ydCB0aGF0IGV4aXN0aW5nIGZpbGVzeXN0ZW0KK29iamVjdHMgZXhjZXB0IHBhdGg0LCBwYXRoNSBhbmQgcGF0aDYvZmlsZTYgdG8gYmUga2lsbGVkLgorCitBbHNvIGZvciBtb2RpZmljYXRpb24gdGVzdCwgdGhlIGNhY2hlIGFuZCB3b3JraW5nIHRyZWUgaGF2ZToKKworICAgIHBhdGg3ICAgICAgIC0gYW4gZW1wdHkgZmlsZSwgbW9kaWZpZWQgdG8gYSBub24tZW1wdHkgZmlsZS4KKyAgICBwYXRoOCAgICAgICAtIGEgbm9uLWVtcHR5IGZpbGUsIG1vZGlmaWVkIHRvIGFuIGVtcHR5IGZpbGUuCisgICAgcGF0aDkJLSBhbiBlbXB0eSBmaWxlLCBjYWNoZSBkaXJ0aWVkLgorICAgIHBhdGgxMAktIGEgbm9uLWVtcHR5IGZpbGUsIGNhY2hlIGRpcnRpZWQuCisKK1dlIHNob3VsZCByZXBvcnQgcGF0aDAsIHBhdGgxLCBwYXRoMi9maWxlMiwgcGF0aDMvZmlsZTMsIHBhdGg3IGFuZCBwYXRoOAorbW9kaWZpZWQgd2l0aG91dCByZXBvcnRpbmcgcGF0aDkgYW5kIHBhdGgxMC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitkYXRlID5wYXRoMAorbG4gLXMgeHl6enkgcGF0aDEKK21rZGlyIHBhdGgyIHBhdGgzCitkYXRlID5wYXRoMi9maWxlMgorZGF0ZSA+cGF0aDMvZmlsZTMKKzogPnBhdGg3CitkYXRlID5wYXRoOAorOiA+cGF0aDkKK2RhdGUgPnBhdGgxMAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgImdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS0gcGF0aDAgcGF0aDEgcGF0aD8vZmlsZT8gcGF0aDcgcGF0aDggcGF0aDkgcGF0aDEwIgorCitybSAtZnIgcGF0aD8gOyMgbGVhdmUgcGF0aDEwIGFsb25lCitkYXRlID5wYXRoMgorbG4gLXMgZnJvdHogcGF0aDMKK2xuIC1zIG5pdGZvbCBwYXRoNQorbWtkaXIgcGF0aDAgcGF0aDEgcGF0aDYKK2RhdGUgPnBhdGgwL2ZpbGUwCitkYXRlID5wYXRoMS9maWxlMQorZGF0ZSA+cGF0aDYvZmlsZTYKK2RhdGUgPnBhdGg3Cis6ID5wYXRoOAorOiA+cGF0aDkKK3RvdWNoIHBhdGgxMAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC1rIHRvIHNob3cga2lsbGVkIGZpbGVzLicgXAorICAgICdnaXQtbHMtZmlsZXMgLWsgPi5vdXRwdXQnCitjYXQgPi5leHBlY3RlZCA8PEVPRgorcGF0aDAvZmlsZTAKK3BhdGgxL2ZpbGUxCitwYXRoMgorcGF0aDMKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0LWxzLWZpbGVzIC1rIG91dHB1dC4nIFwKKyAgICAnZGlmZiAub3V0cHV0IC5leHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtbSB0byBzaG93IG1vZGlmaWVkIGZpbGVzLicgXAorICAgICdnaXQtbHMtZmlsZXMgLW0gPi5vdXRwdXQnCitjYXQgPi5leHBlY3RlZCA8PEVPRgorcGF0aDAKK3BhdGgxCitwYXRoMi9maWxlMgorcGF0aDMvZmlsZTMKK3BhdGg3CitwYXRoOAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtbHMtZmlsZXMgLW0gb3V0cHV0LicgXAorICAgICdkaWZmIC5vdXRwdXQgLmV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMjAtbHMtZmlsZXMtZXJyb3ItdW5tYXRjaC5zaCBiL3QvdDMwMjAtbHMtZmlsZXMtZXJyb3ItdW5tYXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTU1NTllCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAyMC1scy1maWxlcy1lcnJvci11bm1hdGNoLnNoCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FybCBELiBXb3J0aAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtZmlsZXMgdGVzdCBmb3IgLS1lcnJvci11bm1hdGNoIG9wdGlvbgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIHRvIGVuc3VyZSBpdCBjb3JyZWN0bHkKK3JldHVybnMgYW4gZXJyb3Igd2hlbiBhIG5vbi1leGlzdGVudCBwYXRoIGlzIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kCitsaW5lLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3RvdWNoIGZvbyBiYXIKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgZm9vIGJhcgorZ2l0LWNvbW1pdCAtbSAiYWRkIGZvbyBiYXIiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIHNob3VsZCBmYWlsIHdpdGggdW5tYXRjaGVkIHBhdGguJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vIGJhci1kb2VzLW5vdC1tYXRjaCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggc2hvdWxkIHN1Y2NlZWQgZWl0aCBtYXRjaGVkIHBhdGhzLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXInCisKK3Rlc3RfZG9uZQorMQpkaWZmIC0tZ2l0IGEvdC90MzAzMC1tZXJnZS1yZWN1cnNpdmUuc2ggYi90L3QzMDMwLW1lcmdlLXJlY3Vyc2l2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmVlMmIwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAzMC1tZXJnZS1yZWN1cnNpdmUuc2gKQEAgLTAsMCArMSw1MjggQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdtZXJnZS1yZWN1cnNpdmUgYmFja2VuZCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgMScgJworCisJZWNobyBoZWxsbyA+YSAmJgorCW8wPSQoZ2l0IGhhc2gtb2JqZWN0IGEpICYmCisJY3AgYSBiICYmCisJY3AgYSBjICYmCisJbWtkaXIgZCAmJgorCWNwIGEgZC9lICYmCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgYWRkIGEgYiBjIGQvZSAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWMwPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWdpdCBicmFuY2ggc2lkZSAmJgorCWdpdCBicmFuY2ggZGYtMSAmJgorCWdpdCBicmFuY2ggZGYtMiAmJgorCWdpdCBicmFuY2ggZGYtMyAmJgorCWdpdCBicmFuY2ggcmVtb3ZlICYmCisKKwllY2hvIGhlbGxvID4+YSAmJgorCWNwIGEgZC9lICYmCisJbzE9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCWdpdCBhZGQgYSBkL2UgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIm1hc3RlciBtb2RpZmllcyBhIGFuZCBkL2UiICYmCisJYzE9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8xCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8xCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCAyJyAnCisKKwlybSAtcmYgW2FiY2RdICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwllY2hvIGdvb2RieWUgPj5hICYmCisJbzI9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCWdpdCBhZGQgYSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAic2lkZSBtb2RpZmllcyBhIiAmJgorCWMyPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCSggZ2l0IGxzLXRyZWUgLXIgSEVBRCA7IGdpdCBscy1maWxlcyAtcyApID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMglhIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYiIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWMiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAlkL2UiCisJCWVjaG8gIjEwMDY0NCAkbzIgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgMycgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCBkZi0xICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbCAmJgorCisJcm0gLWYgYiAmJiBta2RpciBiICYmIGVjaG8gZGYtMSA+Yi9jICYmIGdpdCBhZGQgYi9jICYmCisJbzM9JChnaXQgaGFzaC1vYmplY3QgYi9jKSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiZGYtMSBtYWtlcyBiL2MiICYmCisJYzM9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMwliL2MiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMyAwCWIvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgNCcgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCBkZi0yICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbCAmJgorCisJcm0gLWYgYSAmJiBta2RpciBhICYmIGVjaG8gZGYtMiA+YS9jICYmIGdpdCBhZGQgYS9jICYmCisJbzQ9JChnaXQgaGFzaC1vYmplY3QgYS9jKSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiZGYtMiBtYWtlcyBhL2MiICYmCisJYzQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG80CWEvYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG80IDAJYS9jIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgNScgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCByZW1vdmUgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwlybSAtZiBiICYmCisJZWNobyByZW1vdmUtY29uZmxpY3QgPmEgJiYKKworCWdpdCBhZGQgYSAmJgorCWdpdCBybSBiICYmCisJbzU9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInJlbW92ZSByZW1vdmVzIGIgYW5kIG1vZGlmaWVzIGEiICYmCisJYzU9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG81CWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG81IDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCA2JyAnCisKKwlybSAtcmYgW2FiY2RdICYmCisJZ2l0IGNoZWNrb3V0IGRmLTMgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwlybSAtZnIgZCAmJiBlY2hvIGRmLTMgPmQgJiYgZ2l0IGFkZCBkICYmCisJbzY9JChnaXQgaGFzaC1vYmplY3QgZCkgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gImRmLTMgbWFrZXMgZCIgJiYKKwljNj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzYJZCIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvNiAwCWQiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIHNpbXBsZScgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCBjaGVja291dCAtZiAiJGMyIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMyIiAiJGMxIgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgcmVzdWx0JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzIgMglhIgorCQllY2hvICIxMDA2NDQgJG8xIDMJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8xIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIHJlbW92ZSBjb25mbGljdCcgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM1IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgcmVtb3ZlIGNvbmZsaWN0JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMglhIgorCQllY2hvICIxMDA2NDQgJG81IDMJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIHNpbXBsZScgJworCXJtIC1mciBbYWJjZF0gJiYKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IC1mICIkYzEiICYmCisKKwlnaXQtbWVyZ2UtcmVjdXJzaXZlICIkYzAiIC0tICIkYzEiICIkYzMiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLXJlY3Vyc2l2ZSByZXN1bHQnICcKKworCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMyAwCWIvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM0IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCcgJworCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzAgMQlhIgorCQllY2hvICIxMDA2NDQgJG8xIDIJYSIKKwkJZWNobyAiMTAwNjQ0ICRvNCAwCWEvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8xIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCB0aGUgb3RoZXIgd2F5JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGM0IiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGM0IiAiJGMxIgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCB0aGUgb3RoZXIgd2F5JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMwlhIgorCQllY2hvICIxMDA2NDQgJG80IDAJYS9jIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM2IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCcgJworCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzYgMwlkIgorCQllY2hvICIxMDA2NDQgJG8wIDEJZC9lIgorCQllY2hvICIxMDA2NDQgJG8xIDIJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCcgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgLWYgIiRjNiIgJiYKKworCWdpdC1tZXJnZS1yZWN1cnNpdmUgIiRjMCIgLS0gIiRjNiIgIiRjMSIKKwlzdGF0dXM9JD8KKwljYXNlICIkc3RhdHVzIiBpbgorCTEpCisJCTogaGFwcHkKKwkJOzsKKwkqKQorCQllY2hvID4mMiAid2h5IHN0YXR1cyAkc3RhdHVzISEhIgorCQlmYWxzZQorCQk7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCByZXN1bHQnICcKKworCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG82IDIJZCIKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAzCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jlc2V0IGFuZCAzLXdheSBtZXJnZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAiJGMyIiAmJgorCWdpdCByZWFkLXRyZWUgLW0gIiRjMCIgIiRjMiIgIiRjMSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXNldCBhbmQgYmluZCBtZXJnZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCBtYXN0ZXIgJiYKKwlnaXQgcmVhZC10cmVlIC0tcHJlZml4PU0vIG1hc3RlciAmJgorCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9iIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwgJiYKKworCWdpdCByZWFkLXRyZWUgLS1wcmVmaXg9YTEvIG1hc3RlciAmJgorCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9iIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8xIDAJYTEvYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWExL2IiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlhMS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJYTEvZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworCWdpdCByZWFkLXRyZWUgLS1wcmVmaXg9ei8gbWFzdGVyICYmCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlNL2EiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlNL2IiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlNL2MiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlNL2QvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhMS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYTEvYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWExL2MiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhMS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCXovYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCXovYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCXovYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCXovZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDMwNDAtc3VicHJvamVjdHMtYmFzaWMuc2ggYi90L3QzMDQwLXN1YnByb2plY3RzLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5YjlmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDQwLXN1YnByb2plY3RzLWJhc2ljLnNoCkBAIC0wLDAgKzEsODUgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdCYXNpYyBzdWJwcm9qZWN0IGZ1bmN0aW9uYWxpdHknCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnU3VwZXIgcHJvamVjdCBjcmVhdGlvbicgXAorICAgICc6ID5NYWtlZmlsZSAmJgorICAgIGdpdCBhZGQgTWFrZWZpbGUgJiYKKyAgICBnaXQgY29tbWl0IC1tICJTdXBlcnByb2plY3QgY3JlYXRlZCInCisKKworY2F0ID5leHBlY3RlZCA8PEVPRgorOjAwMDAwMCAxNjAwMDAgMDAwMDAuLi4gQQlzdWIxCis6MDAwMDAwIDE2MDAwMCAwMDAwMC4uLiBBCXN1YjIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRlIHN1YnByb2plY3RzJyBcCisgICAgJ21rZGlyIHN1YjEgJiYKKyAgICAoIGNkIHN1YjEgJiYgZ2l0IGluaXQgJiYgOiA+TWFrZWZpbGUgJiYgZ2l0IGFkZCAqICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtbSAic3VicHJvamVjdCAxIiApICYmCisgICAgbWtkaXIgc3ViMiAmJgorICAgICggY2Qgc3ViMiAmJiBnaXQgaW5pdCAmJiA6ID5NYWtlZmlsZSAmJiBnaXQgYWRkICogJiYKKyAgICBnaXQgY29tbWl0IC1xIC1tICJzdWJwcm9qZWN0IDIiICkgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHN1YjEgJiYKKyAgICBnaXQgYWRkIHN1YjIgJiYKKyAgICBnaXQgY29tbWl0IC1xIC1tICJzdWJwcm9qZWN0cyBhZGRlZCIgJiYKKyAgICBnaXQgZGlmZi10cmVlIC0tYWJicmV2PTUgSEVBRF4gSEVBRCB8Y3V0IC1kIiAiIC1mLTMsNS0gPmN1cnJlbnQgJiYKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitnaXQgYnJhbmNoIHNhdmUgSEVBRAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBpZiBmc2NrIGlnbm9yZXMgdGhlIHN1YnByb2plY3RzJyBcCisgICAgJ2dpdCBmc2NrIC0tZnVsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgY29tbWl0IGluIGEgc3VicHJvamVjdCBkZXRlY3RlZCcgXAorICAgICcoIGNkIHN1YjEgJiYKKyAgICBlY2hvICJhbGw6IiA+Pk1ha2VmaWxlICYmCisgICAgZWNobyAiCXRydWUiID4+TWFrZWZpbGUgJiYKKyAgICBnaXQgY29tbWl0IC1xIC1hIC1tICJtYWtlIGFsbCIgKSAmJiB7CisgICAgICAgIGdpdCBkaWZmLWZpbGVzIC0tZXhpdC1jb2RlCisJdGVzdCAkPyA9IDEKKyAgICB9JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBpZiBhIGNoYW5nZWQgc3VicHJvamVjdCBIRUFEIGNhbiBiZSBjb21taXR0ZWQnIFwKKyAgICAnZ2l0IGNvbW1pdCAtcSAtYSAtbSAic3ViMSBjaGFuZ2VkIiAmJiB7CisJZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSBIRUFEXiBIRUFECisJdGVzdCAkPyA9IDEKKyAgICB9JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBpZiBkaWZmLWluZGV4IHdvcmtzIGZvciBzdWJwcm9qZWN0IGVsZW1lbnRzJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tY2FjaGVkIHNhdmUgLS0gc3ViMQorICAgIHRlc3QgJD8gPSAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBpZiBkaWZmLXRyZWUgd29ya3MgZm9yIHN1YnByb2plY3QgZWxlbWVudHMnIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSBIRUFEXiBIRUFEIC0tIHN1YjEKKyAgICB0ZXN0ICQ/ID0gMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgZ2l0IGRpZmYgd29ya3MgZm9yIHN1YnByb2plY3QgZWxlbWVudHMnIFwKKyAgICAnZ2l0IGRpZmYgLS1leGl0LWNvZGUgSEVBRF4gSEVBRAorICAgIHRlc3QgJD8gPSAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBpZiBjbG9uZSB3b3JrcycgXAorICAgICdnaXQgbHMtZmlsZXMgLXMgPmV4cGVjdGVkICYmCisgICAgZ2l0IGNsb25lIC1sIC1zIC4gY2xvbmVkICYmCisgICAgKCBjZCBjbG9uZWQgJiYgZ2l0IGxzLWZpbGVzIC1zICkgPmN1cnJlbnQgJiYKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZW1vdmluZyBhbmQgYWRkaW5nIHN1YnByb2plY3QnIFwKKyAgICAnZ2l0IHVwZGF0ZS1pbmRleCAtLWZvcmNlLXJlbW92ZSAtLSBzdWIyICYmCisgICAgbXYgc3ViMiBzdWIzICYmCisgICAgZ2l0IGFkZCBzdWIzICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtbSAicmVuYW1pbmcgYSBzdWJwcm9qZWN0IiAmJiB7CisJZ2l0IGRpZmYgLU0gLS1uYW1lLXN0YXR1cyAtLWV4aXQtY29kZSBIRUFEXiBIRUFECisJdGVzdCAkPyA9IDEKKyAgICB9JworCisjIHRoZSBpbmRleCBtdXN0IGNvbnRhaW4gdGhlIG9iamVjdCBuYW1lIHRoZSBIRUFEIG9mIHRoZQorIyBzdWJwcm9qZWN0IHN1YjEgd2FzIGF0IHRoZSBwb2ludCAic2F2ZSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IGluIHN1cGVycHJvamVjdCcgXAorICAgICdnaXQgY2hlY2tvdXQgc2F2ZSAmJgorICAgIGdpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tcmF3IC0tY2FjaGVkIHNhdmUgLS0gc3ViMScKKworIyBqdXN0IGludGVyZXN0aW5nIHdoYXQgaGFwcGVuZWQuLi4KKyMgZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyAtTSBzYXZlIG1hc3RlcgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTA3NDkyCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCkBAIC0wLDAgKzEsMTU4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy10cmVlIHRlc3QuCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy10cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbiBhIHRyZWUuCisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIHBhdGgxCS0gYSBzeW1saW5rCisgICAgcGF0aDIvZm9vICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMi9iYXpibyAtIGEgc3ltbGluayBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyL2Jhei9iIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5CisKK1RoZSBuZXcgcGF0aCByZXN0cmljdGlvbiBjb2RlIHNob3VsZCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHBhdGgyIGFuZAorcGF0aDIvYmF6LiAgQWxzbyBwYXRoMC8gc2hvdWxkIHNub3cgbm90aGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnbWtkaXIgcGF0aDIgcGF0aDIvYmF6ICYmCisgICAgIGVjaG8gSGkgPnBhdGgwICYmCisgICAgIGxuIC1zIHBhdGgwIHBhdGgxICYmCisgICAgIGVjaG8gTG8gPnBhdGgyL2ZvbyAmJgorICAgICBsbiAtcyAuLi9wYXRoMSBwYXRoMi9iYXpibyAmJgorICAgICBlY2hvIE1pID5wYXRoMi9iYXovYiAmJgorICAgICBmaW5kIHBhdGg/IFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjaGVjaworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBwbGFpbicgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorMDQwMDAwIHRyZWUgWAlwYXRoMgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSByZWN1cnNpdmUnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDAKKzEyMDAwMCBibG9iIFgJcGF0aDEKKzEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKzEyMDAwMCBibG9iIFgJcGF0aDIvYmF6Ym8KKzEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHJlY3Vyc2l2ZSB3aXRoIC10JyBcCisgICAgJ2dpdC1scy10cmVlIC1yIC10ICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgwCisxMjAwMDAgYmxvYiBYCXBhdGgxCiswNDAwMDAgdHJlZSBYCXBhdGgyCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorMTAwNjQ0IGJsb2IgWAlwYXRoMi9iYXovYgorMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlIHdpdGggLWQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgLWQgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKworIyBpdCB1c2VkIHRvIGJlIHBhdGgxIGFuZCB0aGVuIHBhdGgwLCBidXQgd2l0aCBwYXRoc3BlYyBzZW1hbnRpY3MKKyMgdGhleSBhcmUgc2hvd24gaW4gY2Fub25pY2FsIG9yZGVyLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMSBwYXRoMCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgwLycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMC8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBJdCB1c2VkIHRvIHNob3cgcGF0aDIgYW5kIGl0cyBpbW1lZGlhdGUgY2hpbGRyZW4gYnV0CisjIHdpdGggcGF0aHNwZWMgc2VtYW50aWNzIGl0IHNob3dzIG9ubHkgcGF0aDIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDInIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDIgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyAuLi4gYW5kIHBhdGgyLyBzaG93cyB0aGUgY2hpbGRyZW4uCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyLycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMi8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CisxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisxMDA2NDQgYmxvYiBYCXBhdGgyL2ZvbworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIFRoZSBzYW1lIGNoYW5nZSAtLSBleGFjdCBtYXRjaCBkb2VzIG5vdCBzaG93IGNoaWxkcmVuIG9mCisjIHBhdGgyL2JhegordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYXonIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDIvYmF6ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyL2JhaycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMi9iYWsgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgLXQgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYWsnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXQgJHRyZWUgcGF0aDIvYmFrID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2ggYi90L3QzMTAxLWxzLXRyZWUtZGlybmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wODc5MjlhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2gKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy10cmVlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGhhbmRsaW5nLgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW4gYSB0cmVlLgorCisgICAgMS50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgMi50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDAvYS9iL2MvMS50eHQgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvYi9jLzEudHh0ICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMi50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK1Rlc3QgdGhlIGhhbmRsaW5nIG9mIG11bGl0cGxlIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlsZQorZW50cmllcy4gIEFsc28gdGVzdCBvZGQgZmlsZW5hbWUgYW5kIG1pc3NpbmcgZW50cmllcyBoYW5kbGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnZWNobyAxMTEgPjEudHh0ICYmCisgICAgIGVjaG8gMjIyID4yLnR4dCAmJgorICAgICBta2RpciBwYXRoMCBwYXRoMC9hIHBhdGgwL2EvYiBwYXRoMC9hL2IvYyAmJgorICAgICBlY2hvIDExMSA+cGF0aDAvYS9iL2MvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDEgcGF0aDEvYiBwYXRoMS9iL2MgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgxL2IvYy8xLnR4dCAmJgorICAgICBta2RpciBwYXRoMiAmJgorICAgICBlY2hvIDExMSA+cGF0aDIvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDMgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgzLzEudHh0ICYmCisgICAgIGVjaG8gMjIyID5wYXRoMy8yLnR4dCAmJgorICAgICBmaW5kICoudHh0IHBhdGgqIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjaGVjaworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBwbGFpbicgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorMTAwNjQ0IGJsb2IgWAkyLnR4dAorMDQwMDAwIHRyZWUgWAlwYXRoMAorMDQwMDAwIHRyZWUgWAlwYXRoMQorMDQwMDAwIHRyZWUgWAlwYXRoMgorMDQwMDAwIHRyZWUgWAlwYXRoMworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIFJlY3Vyc2l2ZSBkb2VzIG5vdCBzaG93IHRyZWUgbm9kZXMgYW55bW9yZS4uLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlJyBcCisgICAgJ2dpdC1scy10cmVlIC1yICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCTIudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgwL2EvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgxL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMi8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8yLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgMS50eHQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgMS50eHQgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIHBhdGgxL2IvYy8xLnR4dCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMS9iL2MvMS50eHQgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDEvYi9jLzEudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBhbGwgMS50eHQgZmlsZXMnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgMS50eHQgcGF0aDAvYS9iL2MvMS50eHQgcGF0aDEvYi9jLzEudHh0IHBhdGgyLzEudHh0IHBhdGgzLzEudHh0ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgwL2EvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgxL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMi8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8xLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIEkgYW0gbm90IHNvIHN1cmUgYWJvdXQgdGhpcyBvbmUgYWZ0ZXIgbHMtdHJlZSBkb2luZyBwYXRoc3BlYyBtYXRjaC4KKyMgSGF2aW5nIGJvdGggcGF0aDAvYSBhbmQgcGF0aDAvYS9iL2MgbWFrZXMgcGF0aDAvYSByZWR1bmRhbnQsIGFuZAorIyBpdCBiZWhhdmVzIGFzIGlmIHBhdGgwL2EvYi9jLCBwYXRoMS9iL2MsIHBhdGgyIGFuZCBwYXRoMyBhcmUgc3BlY2lmaWVkLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIGRpcmVjdG9yaWVzJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgzIHBhdGgyIHBhdGgwL2EvYi9jIHBhdGgxL2IvYyBwYXRoMC9hID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgwL2EvYi9jCiswNDAwMDAgdHJlZSBYCXBhdGgxL2IvYworMDQwMDAwIHRyZWUgWAlwYXRoMgorMDQwMDAwIHRyZWUgWAlwYXRoMworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIEFnYWluLCBkdXBsaWNhdGVzIGFyZSBmaWx0ZXJlZCBhd2F5IHNvIHRoaXMgaXMgZXF1aXZhbGVudCB0bworIyBoYXZpbmcgMS50eHQgYW5kIHBhdGgzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgb2RkIG5hbWVzJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIDEudHh0IC8xLnR4dCAvLzEudHh0IHBhdGgzLzEudHh0IC9wYXRoMy8xLnR4dCAvL3BhdGgzLy8xLnR4dCBwYXRoMyAvcGF0aDMvIHBhdGgzLy8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDMvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDMvMi50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIG1pc3NpbmcgZmlsZXMgYW5kIGV4dHJhIHNsYXNoZXMnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgMS50eHQvIGFiYy50eHQgcGF0aDMvLzIzLnR4dCBwYXRoMy8yLnR4dC8vLyA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMyMDAtYnJhbmNoLnNoIGIvdC90MzIwMC1icmFuY2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmY2ZDg4NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMyMDAtYnJhbmNoLnNoCkBAIC0wLDAgKzEsMTg2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBicmFuY2ggLS1mb28gc2hvdWxkIG5vdCBjcmVhdGUgYm9ndXMgYnJhbmNoCisKK1RoaXMgdGVzdCBydW5zIGdpdCBicmFuY2ggLS1oZWxwIGFuZCBjaGVja3MgdGhhdCB0aGUgYXJndW1lbnQgaXMgcHJvcGVybHkKK2hhbmRsZWQuICBTcGVjaWZpY2FsbHksIHRoYXQgYSBib2d1cyBicmFuY2ggaXMgbm90IGNyZWF0ZWQuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgYSB0cml2aWFsIHJlcG9zaXRvcnknIFwKKyAgICAnZWNobyBIZWxsbyA+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkluaXRpYWwgY29tbWl0LiIgJiYKKyAgICAgSEVBRD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCknCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQgYnJhbmNoIC0taGVscCBzaG91bGQgbm90IGhhdmUgY3JlYXRlZCBhIGJvZ3VzIGJyYW5jaCcgXAorICAgICdnaXQtYnJhbmNoIC0taGVscCA8L2Rldi9udWxsID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgOgorICAgICB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy8tLWhlbHAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGFiYyBzaG91bGQgY3JlYXRlIGEgYnJhbmNoJyBcCisgICAgJ2dpdC1icmFuY2ggYWJjICYmIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2FiYycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggYS9iL2Mgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCcgXAorICAgICdnaXQtYnJhbmNoIGEvYi9jICYmIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2EvYi9jJworCitjYXQgPmV4cGVjdCA8PEVPRgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAkSEVBRCAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDIwMCArMDAwMAlicmFuY2g6IENyZWF0ZWQgZnJvbSBtYXN0ZXIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggLWwgZC9lL2Ygc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCBhbmQgYSBsb2cnIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisgICAgIGdpdC1icmFuY2ggLWwgZC9lL2YgJiYKKwkgdGVzdCAtZiAuZ2l0L3JlZnMvaGVhZHMvZC9lL2YgJiYKKwkgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9kL2UvZiAmJgorCSBkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9kL2UvZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggLWQgZC9lL2Ygc2hvdWxkIGRlbGV0ZSBhIGJyYW5jaCBhbmQgYSBsb2cnIFwKKwknZ2l0LWJyYW5jaCAtZCBkL2UvZiAmJgorCSB0ZXN0ICEgLWYgLmdpdC9yZWZzL2hlYWRzL2QvZS9mICYmCisJIHRlc3QgISAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9kL2UvZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggai9rIHNob3VsZCB3b3JrIGFmdGVyIGJyYW5jaCBqIGhhcyBiZWVuIGRlbGV0ZWQnIFwKKyAgICAgICAnZ2l0LWJyYW5jaCBqICYmCisgICAgICAgIGdpdC1icmFuY2ggLWQgaiAmJgorICAgICAgICBnaXQtYnJhbmNoIGovaycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggbCBzaG91bGQgd29yayBhZnRlciBicmFuY2ggbC9tIGhhcyBiZWVuIGRlbGV0ZWQnIFwKKyAgICAgICAnZ2l0LWJyYW5jaCBsL20gJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtZCBsL20gJiYKKyAgICAgICAgZ2l0LWJyYW5jaCBsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtbSBtIG0vbSBzaG91bGQgd29yaycgXAorICAgICAgICdnaXQtYnJhbmNoIC1sIG0gJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtbSBtIG0vbSAmJgorICAgICAgICB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL20vbScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggLW0gbi9uIG4gc2hvdWxkIHdvcmsnIFwKKyAgICAgICAnZ2l0LWJyYW5jaCAtbCBuL24gJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtbSBuL24gbgorICAgICAgICB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL24nCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQgYnJhbmNoIC1tIG8vbyBvIHNob3VsZCBmYWlsIHdoZW4gby9wIGV4aXN0cycgXAorICAgICAgICdnaXQtYnJhbmNoIG8vbyAmJgorICAgICAgICBnaXQtYnJhbmNoIG8vcCAmJgorICAgICAgICBnaXQtYnJhbmNoIC1tIG8vbyBvJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0IGJyYW5jaCAtbSBxIHIvcSBzaG91bGQgZmFpbCB3aGVuIHIgZXhpc3RzJyBcCisgICAgICAgJ2dpdC1icmFuY2ggcSAmJgorICAgICAgICAgZ2l0LWJyYW5jaCByICYmCisgICAgICAgICBnaXQtYnJhbmNoIC1tIHEgci9xJworCittdiAuZ2l0L2NvbmZpZyAuZ2l0L2NvbmZpZy1zYXZlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoIC1tIHEgcTIgd2l0aG91dCBjb25maWcgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtYnJhbmNoIC1tIHEgcTIgJiYKKwlnaXQtYnJhbmNoIC1tIHEyIHEKKycKKworbXYgLmdpdC9jb25maWctc2F2ZWQgLmdpdC9jb25maWcKKworZ2l0LWNvbmZpZyBicmFuY2gucy9zLmR1bW15IEhlbGxvCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1tIHMvcyBzIHNob3VsZCB3b3JrIHdoZW4gcy90IGlzIGRlbGV0ZWQnIFwKKyAgICAgICAnZ2l0LWJyYW5jaCAtbCBzL3MgJiYKKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9zL3MgJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtbCBzL3QgJiYKKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9zL3QgJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtZCBzL3QgJiYKKyAgICAgICAgZ2l0LWJyYW5jaCAtbSBzL3MgcyAmJgorICAgICAgICB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL3MnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZyBpbmZvcm1hdGlvbiB3YXMgcmVuYW1lZCwgdG9vJyBcCisJInRlc3QgJChnaXQtY29uZmlnIGJyYW5jaC5zLmR1bW15KSA9IEhlbGxvICYmCisJICEgZ2l0LWNvbmZpZyBicmFuY2gucy9zL2R1bW15IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LWJyYW5jaCAtbSB1IHYgc2hvdWxkIGZhaWwgd2hlbiB0aGUgcmVmbG9nIGZvciB1IGlzIGEgc3ltbGluaycgXAorICAgICdnaXQtYnJhbmNoIC1sIHUgJiYKKyAgICAgbXYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvdSByZWFsLXUgJiYKKyAgICAgbG4gLXMgcmVhbC11IC5naXQvbG9ncy9yZWZzL2hlYWRzL3UgJiYKKyAgICAgZ2l0LWJyYW5jaCAtbSB1IHYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgdHJhY2tpbmcgc2V0dXAgdmlhIC0tdHJhY2snIFwKKyAgICAnZ2l0LWNvbmZpZyByZW1vdGUubG9jYWwudXJsIC4gJiYKKyAgICAgZ2l0LWNvbmZpZyByZW1vdGUubG9jYWwuZmV0Y2ggcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9sb2NhbC8qICYmCisgICAgIChnaXQtc2hvdy1yZWYgLXEgcmVmcy9yZW1vdGVzL2xvY2FsL21hc3RlciB8fCBnaXQtZmV0Y2ggbG9jYWwpICYmCisgICAgIGdpdC1icmFuY2ggLS10cmFjayBteTEgbG9jYWwvbWFzdGVyICYmCisgICAgIHRlc3QgJChnaXQtY29uZmlnIGJyYW5jaC5teTEucmVtb3RlKSA9IGxvY2FsICYmCisgICAgIHRlc3QgJChnaXQtY29uZmlnIGJyYW5jaC5teTEubWVyZ2UpID0gcmVmcy9oZWFkcy9tYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgdHJhY2tpbmcgc2V0dXAgKG5vbi13aWxkY2FyZCwgbWF0Y2hpbmcpJyBcCisgICAgJ2dpdC1jb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdC1jb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvcmVtb3Rlcy9sb2NhbC9tYXN0ZXIgJiYKKyAgICAgKGdpdC1zaG93LXJlZiAtcSByZWZzL3JlbW90ZXMvbG9jYWwvbWFzdGVyIHx8IGdpdC1mZXRjaCBsb2NhbCkgJiYKKyAgICAgZ2l0LWJyYW5jaCAtLXRyYWNrIG15NCBsb2NhbC9tYXN0ZXIgJiYKKyAgICAgdGVzdCAkKGdpdC1jb25maWcgYnJhbmNoLm15NC5yZW1vdGUpID0gbG9jYWwgJiYKKyAgICAgdGVzdCAkKGdpdC1jb25maWcgYnJhbmNoLm15NC5tZXJnZSkgPSByZWZzL2hlYWRzL21hc3RlcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCB0cmFja2luZyBzZXR1cCAobm9uLXdpbGRjYXJkLCBub3QgbWF0Y2hpbmcpJyBcCisgICAgJ2dpdC1jb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdC1jb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvczpyZWZzL3JlbW90ZXMvbG9jYWwvcyAmJgorICAgICAoZ2l0LXNob3ctcmVmIC1xIHJlZnMvcmVtb3Rlcy9sb2NhbC9tYXN0ZXIgfHwgZ2l0LWZldGNoIGxvY2FsKSAmJgorICAgICBnaXQtYnJhbmNoIC0tdHJhY2sgbXk1IGxvY2FsL21hc3RlciAmJgorICAgICAhIHRlc3QgIiQoZ2l0LWNvbmZpZyBicmFuY2gubXk1LnJlbW90ZSkiID0gbG9jYWwgJiYKKyAgICAgISB0ZXN0ICIkKGdpdC1jb25maWcgYnJhbmNoLm15NS5tZXJnZSkiID0gcmVmcy9oZWFkcy9tYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgdHJhY2tpbmcgc2V0dXAgdmlhIGNvbmZpZycgXAorICAgICdnaXQtY29uZmlnIGJyYW5jaC5hdXRvc2V0dXBtZXJnZSB0cnVlICYmCisgICAgIGdpdC1jb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdC1jb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvbG9jYWwvKiAmJgorICAgICAoZ2l0LXNob3ctcmVmIC1xIHJlZnMvcmVtb3Rlcy9sb2NhbC9tYXN0ZXIgfHwgZ2l0LWZldGNoIGxvY2FsKSAmJgorICAgICBnaXQtYnJhbmNoIG15MyBsb2NhbC9tYXN0ZXIgJiYKKyAgICAgdGVzdCAkKGdpdC1jb25maWcgYnJhbmNoLm15My5yZW1vdGUpID0gbG9jYWwgJiYKKyAgICAgdGVzdCAkKGdpdC1jb25maWcgYnJhbmNoLm15My5tZXJnZSkgPSByZWZzL2hlYWRzL21hc3RlcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBvdmVycmlkaW5nIHRyYWNraW5nIHNldHVwIHZpYSAtLW5vLXRyYWNrJyBcCisgICAgJ2dpdC1jb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIHRydWUgJiYKKyAgICAgZ2l0LWNvbmZpZyByZW1vdGUubG9jYWwudXJsIC4gJiYKKyAgICAgZ2l0LWNvbmZpZyByZW1vdGUubG9jYWwuZmV0Y2ggcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9sb2NhbC8qICYmCisgICAgIChnaXQtc2hvdy1yZWYgLXEgcmVmcy9yZW1vdGVzL2xvY2FsL21hc3RlciB8fCBnaXQtZmV0Y2ggbG9jYWwpICYmCisgICAgIGdpdC1icmFuY2ggLS1uby10cmFjayBteTIgbG9jYWwvbWFzdGVyICYmCisgICAgIGdpdC1jb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGZhbHNlICYmCisgICAgICEgdGVzdCAiJChnaXQtY29uZmlnIGJyYW5jaC5teTIucmVtb3RlKSIgPSBsb2NhbCAmJgorICAgICAhIHRlc3QgIiQoZ2l0LWNvbmZpZyBicmFuY2gubXkyLm1lcmdlKSIgPSByZWZzL2hlYWRzL21hc3RlcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBsb2NhbCB0cmFja2luZyBzZXR1cCcgXAorICAgICdnaXQgYnJhbmNoIC0tdHJhY2sgbXk2IHMgJiYKKyAgICAgdGVzdCAkKGdpdC1jb25maWcgYnJhbmNoLm15Ni5yZW1vdGUpID0gLiAmJgorICAgICB0ZXN0ICQoZ2l0LWNvbmZpZyBicmFuY2gubXk2Lm1lcmdlKSA9IHJlZnMvaGVhZHMvcycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCB0cmFja2luZyBzZXR1cCB2aWEgLS10cmFjayBidXQgZGVlcGVyJyBcCisgICAgJ2dpdC1jb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdC1jb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvbG9jYWwvKiAmJgorICAgICAoZ2l0LXNob3ctcmVmIC1xIHJlZnMvcmVtb3Rlcy9sb2NhbC9vL28gfHwgZ2l0LWZldGNoIGxvY2FsKSAmJgorICAgICBnaXQtYnJhbmNoIC0tdHJhY2sgbXk3IGxvY2FsL28vbyAmJgorICAgICB0ZXN0ICIkKGdpdC1jb25maWcgYnJhbmNoLm15Ny5yZW1vdGUpIiA9IGxvY2FsICYmCisgICAgIHRlc3QgIiQoZ2l0LWNvbmZpZyBicmFuY2gubXk3Lm1lcmdlKSIgPSByZWZzL2hlYWRzL28vbycKKworIyBLZWVwIHRoaXMgdGVzdCBsYXN0LCBhcyBpdCBjaGFuZ2VzIHRoZSBjdXJyZW50IGJyYW5jaAorY2F0ID5leHBlY3QgPDxFT0YKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgJEhFQUQgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJYnJhbmNoOiBDcmVhdGVkIGZyb20gbWFzdGVyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgZy9oL2kgLWwgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCBhbmQgYSBsb2cnIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisgICAgIGdpdC1jaGVja291dCAtYiBnL2gvaSAtbCBtYXN0ZXIgJiYKKwkgdGVzdCAtZiAuZ2l0L3JlZnMvaGVhZHMvZy9oL2kgJiYKKwkgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9nL2gvaSAmJgorCSBkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9nL2gvaScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMjEwLXBhY2stcmVmcy5zaCBiL3QvdDMyMTAtcGFjay1yZWZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwYzdlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMjEwLXBhY2stcmVmcy5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBBbW9zIFdhdGVybGFuZAorIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hyaXN0aWFuIENvdWRlcgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcGFjay1yZWZzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBicmFuY2ggc2VtYW50aWMKKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IHBhY2stcmVmcyBhbmQgZ2l0IHNob3ctcmVmIGFuZCBjaGVja3MgdGhhdCB0aGUgYnJhbmNoCitzZW1hbnRpYyBpcyBzdGlsbCB0aGUgc2FtZS4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitlY2hvICdbY29yZV0gbG9nYWxscmVmdXBkYXRlcyA9IHRydWUnID4+LmdpdC9jb25maWcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgYSB0cml2aWFsIHJlcG9zaXRvcnknIFwKKyAgICAnZWNobyBIZWxsbyA+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkluaXRpYWwgY29tbWl0LiIgJiYKKyAgICAgSEVBRD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCknCisKK1NIQTE9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZWUgaWYgZ2l0IHNob3ctcmVmIHdvcmtzIGFzIGV4cGVjdGVkJyBcCisgICAgJ2dpdC1icmFuY2ggYSAmJgorICAgICBTSEExPWBjYXQgLmdpdC9yZWZzL2hlYWRzL2FgICYmCisgICAgIGVjaG8gIiRTSEExIHJlZnMvaGVhZHMvYSIgPmV4cGVjdCAmJgorICAgICBnaXQtc2hvdy1yZWYgYSA+cmVzdWx0ICYmCisgICAgIGRpZmYgZXhwZWN0IHJlc3VsdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NlZSBpZiBhIGJyYW5jaCBzdGlsbCBleGlzdHMgd2hlbiBwYWNrZWQnIFwKKyAgICAnZ2l0LWJyYW5jaCBiICYmCisgICAgIGdpdC1wYWNrLXJlZnMgLS1hbGwgJiYKKyAgICAgcm0gLWYgLmdpdC9yZWZzL2hlYWRzL2IgJiYKKyAgICAgZWNobyAiJFNIQTEgcmVmcy9oZWFkcy9iIiA+ZXhwZWN0ICYmCisgICAgIGdpdC1zaG93LXJlZiBiID5yZXN1bHQgJiYKKyAgICAgZGlmZiBleHBlY3QgcmVzdWx0JworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0IGJyYW5jaCBjL2Qgc2hvdWxkIGJhcmYgaWYgYnJhbmNoIGMgZXhpc3RzJyBcCisgICAgJ2dpdC1icmFuY2ggYyAmJgorICAgICBnaXQtcGFjay1yZWZzIC0tYWxsICYmCisgICAgIHJtIC5naXQvcmVmcy9oZWFkcy9jICYmCisgICAgIGdpdC1icmFuY2ggYy9kJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2VlIGlmIGEgYnJhbmNoIHN0aWxsIGV4aXN0cyBhZnRlciBnaXQgcGFjay1yZWZzIC0tcHJ1bmUnIFwKKyAgICAnZ2l0LWJyYW5jaCBlICYmCisgICAgIGdpdC1wYWNrLXJlZnMgLS1hbGwgLS1wcnVuZSAmJgorICAgICBlY2hvICIkU0hBMSByZWZzL2hlYWRzL2UiID5leHBlY3QgJiYKKyAgICAgZ2l0LXNob3ctcmVmIGUgPnJlc3VsdCAmJgorICAgICBkaWZmIGV4cGVjdCByZXN1bHQnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdzZWUgaWYgZ2l0IHBhY2stcmVmcyAtLXBydW5lIHJlbW92ZSByZWYgZmlsZXMnIFwKKyAgICAnZ2l0LWJyYW5jaCBmICYmCisgICAgIGdpdC1wYWNrLXJlZnMgLS1hbGwgLS1wcnVuZSAmJgorICAgICBscyAuZ2l0L3JlZnMvaGVhZHMvZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggZyBzaG91bGQgd29yayB3aGVuIGdpdCBicmFuY2ggZy9oIGhhcyBiZWVuIGRlbGV0ZWQnIFwKKyAgICAnZ2l0LWJyYW5jaCBnL2ggJiYKKyAgICAgZ2l0LXBhY2stcmVmcyAtLWFsbCAtLXBydW5lICYmCisgICAgIGdpdC1icmFuY2ggLWQgZy9oICYmCisgICAgIGdpdC1icmFuY2ggZyAmJgorICAgICBnaXQtcGFjay1yZWZzIC0tYWxsICYmCisgICAgIGdpdC1icmFuY2ggLWQgZycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2dpdCBicmFuY2ggaS9qL2sgc2hvdWxkIGJhcmYgaWYgYnJhbmNoIGkgZXhpc3RzJyBcCisgICAgJ2dpdC1icmFuY2ggaSAmJgorICAgICBnaXQtcGFjay1yZWZzIC0tYWxsIC0tcHJ1bmUgJiYKKyAgICAgZ2l0LWJyYW5jaCBpL2ovaycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Rlc3QgZ2l0IGJyYW5jaCBrIGFmdGVyIGJyYW5jaCBrL2wvbSBhbmQgay9sbSBoYXZlIGJlZW4gZGVsZXRlZCcgXAorICAgICdnaXQtYnJhbmNoIGsvbCAmJgorICAgICBnaXQtYnJhbmNoIGsvbG0gJiYKKyAgICAgZ2l0LWJyYW5jaCAtZCBrL2wgJiYKKyAgICAgZ2l0LWJyYW5jaCBrL2wvbSAmJgorICAgICBnaXQtYnJhbmNoIC1kIGsvbC9tICYmCisgICAgIGdpdC1icmFuY2ggLWQgay9sbSAmJgorICAgICBnaXQtYnJhbmNoIGsnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0ZXN0IGdpdCBicmFuY2ggbiBhZnRlciBzb21lIGJyYW5jaCBkZWxldGlvbiBhbmQgcHJ1bmluZycgXAorICAgICdnaXQtYnJhbmNoIG4vbyAmJgorICAgICBnaXQtYnJhbmNoIG4vb3AgJiYKKyAgICAgZ2l0LWJyYW5jaCAtZCBuL28gJiYKKyAgICAgZ2l0LWJyYW5jaCBuL28vcCAmJgorICAgICBnaXQtYnJhbmNoIC1kIG4vb3AgJiYKKyAgICAgZ2l0LXBhY2stcmVmcyAtLWFsbCAtLXBydW5lICYmCisgICAgIGdpdC1icmFuY2ggLWQgbi9vL3AgJiYKKyAgICAgZ2l0LWJyYW5jaCBuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYWNrLCBwcnVuZSBhbmQgcmVwYWNrJyAnCisJZ2l0LXRhZyBmb28gJiYKKwlnaXQtcGFjay1yZWZzIC0tYWxsIC0tcHJ1bmUgJiYKKwlnaXQtc2hvdy1yZWYgPmFsbC1vZi10aGVtICYmCisJZ2l0LXBhY2stcmVmcyAmJgorCWdpdC1zaG93LXJlZiA+YWdhaW4gJiYKKwlkaWZmIGFsbC1vZi10aGVtIGFnYWluCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzMwMC1mdW5ueS1uYW1lcy5zaCBiL3QvdDMzMDAtZnVubnktbmFtZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVhMTQwMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMzMDAtZnVubnktbmFtZXMuc2gKQEAgLTAsMCArMSwxNjAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nUGF0aG5hbWVzIHdpdGggZnVubnkgY2hhcmFjdGVycy4KKworVGhpcyB0ZXN0IHRyaWVzIHBhdGhuYW1lcyB3aXRoIGZ1bm55IGNoYXJhY3RlcnMgaW4gdGhlIHdvcmtpbmcKK3RyZWUsIGluZGV4LCBhbmQgdHJlZSBvYmplY3RzLgorJworCisuIC4vdGVzdC1saWIuc2gKKworcDA9J25vLWZ1bm55JworcDE9J3RhYnMJLCIgKGRxKSBhbmQgc3BhY2VzJworcDI9J2p1c3Qgc3BhY2UnCisKK2NhdCA+IiRwMCIgPDxcRU9GCisxLiBBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGNhdCwgb29wcyBkb2cuCisyLiBBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGNhdCwgb29wcyBkb2cuCiszLiBBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGNhdCwgb29wcyBkb2cuCitFT0YKKworY2F0ID4iJHAxIiAiJHAwIgorZWNobyAnRm9vIEJhciBCYXonID4iJHAyIgorCit0ZXN0IC1mICIkcDEiICYmIGNtcCAiJHAwIiAiJHAxIiB8fCB7CisJIyBzaW5jZSBGQVQvTlRGUyBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcywgc2tpcCB0aGlzIHRlc3QKKwlzYXkgJ1lvdXIgZmlsZXN5c3RlbSBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcywgdGVzdCBza2lwcGVkLicKKwl0ZXN0X2RvbmUKK30KKworZWNobyAnanVzdCBzcGFjZQorbm8tZnVubnknID5leHBlY3RlZAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWxzLWZpbGVzIG5vLWZ1bm55JyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgIiRwMCIgIiRwMiIgJiYKKwlnaXQtbHMtZmlsZXMgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCit0MD1gZ2l0LXdyaXRlLXRyZWVgCitlY2hvICIkdDAiID50MAorCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK2p1c3Qgc3BhY2UKK25vLWZ1bm55CisidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWxzLWZpbGVzIHdpdGgtZnVubnknIFwKKwknZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAiJHAxIiAmJgorCWdpdC1scy1maWxlcyA+Y3VycmVudCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2VjaG8gJ2p1c3Qgc3BhY2UKK25vLWZ1bm55Cit0YWJzCSwiIChkcSkgYW5kIHNwYWNlcycgPmV4cGVjdGVkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtbHMtZmlsZXMgLXogd2l0aC1mdW5ueScgXAorCSdnaXQtbHMtZmlsZXMgLXogfCB0ciBcXDAgXFwwMTIgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCit0MT1gZ2l0LXdyaXRlLXRyZWVgCitlY2hvICIkdDEiID50MQorCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK2p1c3Qgc3BhY2UKK25vLWZ1bm55CisidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWxzLXRyZWUgd2l0aCBmdW5ueScgXAorCSdnaXQtbHMtdHJlZSAtciAkdDEgfCBzZWQgLWUgInMvXlteCV0qCS8vIiA+Y3VycmVudCAmJgorCSBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK0EJInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWluZGV4IHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtaW5kZXggLS1uYW1lLXN0YXR1cyAkdDAgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtdHJlZSAtLW5hbWUtc3RhdHVzICR0MCAkdDEgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitlY2hvICdBCit0YWJzCSwiIChkcSkgYW5kIHNwYWNlcycgPmV4cGVjdGVkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi1pbmRleCAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLWluZGV4IC16IC0tbmFtZS1zdGF0dXMgJHQwIHwgdHIgXFwwIFxcMDEyID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLXRyZWUgLXogLS1uYW1lLXN0YXR1cyAkdDAgJHQxIHwgdHIgXFwwIFxcMDEyID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitDTlVNCW5vLWZ1bm55CSJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIC1DIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtdHJlZSAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAtLW5hbWUtc3RhdHVzIFwKKwkJJHQwICR0MSB8IHNlZCAtZSAncy9eQ1swLTldKi9DTlVNLycgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK1JOVU0Jbm8tZnVubnkJInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgZGVsZXRlIHdpdGgtZnVubnknIFwKKwknZ2l0LXVwZGF0ZS1pbmRleCAtLWZvcmNlLXJlbW92ZSAiJHAwIiAmJgorCWdpdC1kaWZmLWluZGV4IC1NIC0tbmFtZS1zdGF0dXMgXAorCQkkdDAgfCBzZWQgLWUgJ3MvXlJbMC05XSovUk5VTS8nID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvbm8tZnVubnkgImIvdGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK3NpbWlsYXJpdHkgaW5kZXggTlVNJQorcmVuYW1lIGZyb20gbm8tZnVubnkKK3JlbmFtZSB0byAidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSBkZWxldGUgd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi1pbmRleCAtTSAtcCAkdDAgfAorCSBzZWQgLWUgInMvaW5kZXggWzAtOV0qJS9pbmRleCBOVU0lLyIgPmN1cnJlbnQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2htb2QgK3ggIiRwMSIKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL25vLWZ1bm55ICJiL3RhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitvbGQgbW9kZSAxMDA2NDQKK25ldyBtb2RlIDEwMDc1NQorc2ltaWxhcml0eSBpbmRleCBOVU0lCityZW5hbWUgZnJvbSBuby1mdW5ueQorcmVuYW1lIHRvICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLWluZGV4IC1NIC1wICR0MCB8CisJIHNlZCAtZSAicy9pbmRleCBbMC05XSolL2luZGV4IE5VTSUvIiA+Y3VycmVudCAmJgorCSBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorIDEgZmlsZXMgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIHJlbmFtZSB3aXRoLWZ1bm55IGFwcGxpZWQnIFwKKwknZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHQwIHwKKwkgZ2l0LWFwcGx5IC0tc3RhdCB8IHNlZCAtZSAicy98LiovLyIgLWUgInMvICpcJC8vIiA+Y3VycmVudCAmJgorCSBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKyBuby1mdW5ueQorICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorIDIgZmlsZXMgY2hhbmdlZCwgMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55IGFwcGxpZWQnIFwKKwknZ2l0LWRpZmYtaW5kZXggLXAgJHQwIHwKKwkgZ2l0LWFwcGx5IC0tc3RhdCB8IHNlZCAtZSAicy98LiovLyIgLWUgInMvICpcJC8vIiA+Y3VycmVudCAmJgorCSBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtYXBwbHkgbm9uLWdpdCBkaWZmJyBcCisJJ2dpdC1kaWZmLWluZGV4IC1wICR0MCB8CisJIHNlZCAtbmUgIi9eWy0rQF0vcCIgfAorCSBnaXQtYXBwbHkgLS1zdGF0IHwgc2VkIC1lICJzL3wuKi8vIiAtZSAicy8gKlwkLy8iID5jdXJyZW50ICYmCisJIGdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMC1yZWJhc2Uuc2ggYi90L3QzNDAwLXJlYmFzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOWQzMTMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzQwMC1yZWJhc2Uuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBBbW9zIFdhdGVybGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmViYXNlIHNob3VsZCBub3QgZGVzdHJveSBhdXRob3IgaW5mb3JtYXRpb24KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IHJlYmFzZSBhbmQgY2hlY2tzIHRoYXQgdGhlIGF1dGhvciBpbmZvcm1hdGlvbiBpcyBub3QgbG9zdC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD1ib2d1c19lbWFpbF9hZGRyZXNzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlcG9zaXRvcnkgd2l0aCB0b3BpYyBicmFuY2gsIHRoZW4gcmViYXNlIGFnYWluc3QgbWFzdGVyJyBcCisgICAgJ2VjaG8gRmlyc3QgPiBBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQS4iICYmCisgICAgIGdpdCBjaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKyAgICAgZWNobyBTZWNvbmQgPiBCICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQiAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQi4iICYmCisgICAgIGdpdCBjaGVja291dCAtZiBtYXN0ZXIgJiYKKyAgICAgZWNobyBUaGlyZCA+PiBBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJNb2RpZnkgQS4iICYmCisgICAgIGdpdCBjaGVja291dCAtZiBteS10b3BpYy1icmFuY2ggJiYKKyAgICAgZ2l0IHJlYmFzZSBtYXN0ZXInCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICd0aGUgcmViYXNlIG9wZXJhdGlvbiBzaG91bGQgbm90IGhhdmUgZGVzdHJveWVkIGF1dGhvciBpbmZvcm1hdGlvbicgXAorICAgICdnaXQgbG9nIHwgZ3JlcCAiQXV0aG9yOiIgfCBncmVwICI8PiInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMS1yZWJhc2UtcGFydGlhbC5zaCBiL3QvdDM0MDEtcmViYXNlLXBhcnRpYWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGIxOWQzYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDEtcmViYXNlLXBhcnRpYWwuc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBZYW5uIERpcnNvbiwgYmFzZWQgb24gdDM0MDAgYnkgQW1vcyBXYXRlcmxhbmQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSBzaG91bGQgZGV0ZWN0IHBhdGNoZXMgaW50ZWdyYXRlZCB1cHN0cmVhbQorCitUaGlzIHRlc3QgY2hlcnJ5LXBpY2tzIG9uZSBsb2NhbCBjaGFuZ2Ugb2YgdHdvIGludG8gbWFzdGVyIGJyYW5jaCwgYW5kCitjaGVja3MgdGhhdCBnaXQgcmViYXNlIHN1Y2NlZWRzIHdpdGggb25seSB0aGUgc2Vjb25kIHBhdGNoIGluIHRoZQorbG9jYWwgYnJhbmNoLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlcG9zaXRvcnkgd2l0aCB0b3BpYyBicmFuY2gnIFwKKyAgICAnZWNobyBGaXJzdCA+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBBLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWIgbXktdG9waWMtYnJhbmNoICYmCisKKyAgICAgZWNobyBTZWNvbmQgPiBCICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQiAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQi4iICYmCisKKyAgICAgZWNobyBBbm90aGVyU2Vjb25kID4gQyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEMgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEMuIiAmJgorCisgICAgIGdpdC1jaGVja291dCAtZiBtYXN0ZXIgJiYKKworICAgICBlY2hvIFRoaXJkID4+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIk1vZGlmeSBBLiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BpY2sgdG9wIHBhdGNoIGZyb20gdG9waWMgYnJhbmNoIGludG8gbWFzdGVyJyBcCisgICAgJ2dpdC1jaGVycnktcGljayBteS10b3BpYy1icmFuY2heMCAmJgorICAgICBnaXQtY2hlY2tvdXQgLWYgbXktdG9waWMtYnJhbmNoICYmCisgICAgIGdpdC1icmFuY2ggbWFzdGVyLW1lcmdlIG1hc3RlciAmJgorICAgICBnaXQtYnJhbmNoIG15LXRvcGljLWJyYW5jaC1tZXJnZSBteS10b3BpYy1icmFuY2gKKycKKwordGVzdF9kZWJ1ZyBcCisgICAgJ2dpdC1jaGVycnkgbWFzdGVyICYmCisgICAgIGdpdC1mb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgLS1mdWxsLWluZGV4IG1hc3RlciA+L2Rldi9udWxsICYmCisgICAgIGdpdGsgLS1hbGwgJiBzbGVlcCAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWJhc2UgdG9waWMgYnJhbmNoIGFnYWluc3QgbmV3IG1hc3RlciBhbmQgY2hlY2sgZ2l0LWFtIGRpZCBub3QgZ2V0IGhhbHRlZCcgXAorICAgICdnaXQtcmViYXNlIG1hc3RlciAmJiB0ZXN0ICEgLWQgLmRvdGVzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3JlYmFzZSAtLW1lcmdlIHRvcGljIGJyYW5jaCB0aGF0IHdhcyBwYXJ0aWFsbHkgbWVyZ2VkIHVwc3RyZWFtJyBcCisJJ2dpdC1jaGVja291dCAtZiBteS10b3BpYy1icmFuY2gtbWVyZ2UgJiYKKwkgZ2l0LXJlYmFzZSAtLW1lcmdlIG1hc3Rlci1tZXJnZSAmJgorCSB0ZXN0ICEgLWQgLmdpdC8uZG90ZXN0LW1lcmdlJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDItcmViYXNlLW1lcmdlLnNoIGIvdC90MzQwMi1yZWJhc2UtbWVyZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc3OWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDItcmViYXNlLW1lcmdlLnNoCkBAIC0wLDAgKzEsMTA2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWJhc2UgLS1tZXJnZSB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKworVD0iQSBxdWljayBicm93biBmb3gKK2p1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiIKK2ZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA5IDEwCitkbworCWVjaG8gIiRpICRUIgorZG9uZSA+b3JpZ2luYWwKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZ2l0IGFkZCBvcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLW0iaW5pdGlhbCIgJiYKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwllY2hvICIxMSAkVCIgPj5vcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLWEgLW0ibWFzdGVyIHVwZGF0ZXMgYSBiaXQuIiAmJgorCisJZWNobyAiMTIgJFQiID4+b3JpZ2luYWwgJiYKKwlnaXQgY29tbWl0IC1hIC1tIm1hc3RlciB1cGRhdGVzIGEgYml0IG1vcmUuIiAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwkoZWNobyAiMCAkVCIgOyBjYXQgb3JpZ2luYWwpID5yZW5hbWVkICYmCisJZ2l0IGFkZCByZW5hbWVkICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWZvcmNlLXJlbW92ZSBvcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLWEgLW0ic2lkZSByZW5hbWVzIGFuZCBlZGl0cy4iICYmCisKKwl0ciAiW2Etel0iICJbQS1aXSIgPG9yaWdpbmFsID5uZXdmaWxlICYmCisJZ2l0IGFkZCBuZXdmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSJzaWRlIGVkaXRzIGZ1cnRoZXIuIiAmJgorCisJdHIgIlthLW1dIiAiW0EtTV0iIDxvcmlnaW5hbCA+bmV3ZmlsZSAmJgorCXJtIC1mIG9yaWdpbmFsICYmCisJZ2l0IGNvbW1pdCAtYSAtbSJzaWRlIGVkaXRzIG9uY2UgYWdhaW4uIiAmJgorCisJZ2l0IGJyYW5jaCB0ZXN0LXJlYmFzZSBzaWRlICYmCisJZ2l0IGJyYW5jaCB0ZXN0LXJlYmFzZS1waWNrIHNpZGUgJiYKKwlnaXQgYnJhbmNoIHRlc3QtcmVmZXJlbmNlLXBpY2sgc2lkZSAmJgorCWdpdCBjaGVja291dCAtYiB0ZXN0LW1lcmdlIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVmZXJlbmNlIG1lcmdlJyAnCisJZ2l0IG1lcmdlIC1zIHJlY3Vyc2l2ZSAicmVmZXJlbmNlIG1lcmdlIiBIRUFEIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHJlYmFzZSAnCisJZ2l0IGNoZWNrb3V0IHRlc3QtcmViYXNlICYmCisJZ2l0IHJlYmFzZSAtLW1lcmdlIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBhbmQgcmViYXNlIHNob3VsZCBtYXRjaCcgJworCWdpdCBkaWZmLXRyZWUgLXIgdGVzdC1yZWJhc2UgdGVzdC1tZXJnZSA+ZGlmZmVyZW5jZSAmJgorCWlmIHRlc3QgLXMgZGlmZmVyZW5jZQorCXRoZW4KKwkJY2F0IGRpZmZlcmVuY2UKKwkJKGV4aXQgMSkKKwllbHNlCisJCWVjaG8gaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgdGhlIG90aGVyIHdheScgJworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IHJlYmFzZSAtLW1lcmdlIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYW5kIHJlYmFzZSBzaG91bGQgbWF0Y2gnICcKKwlnaXQgZGlmZi10cmVlIC1yIHRlc3QtcmViYXNlIHRlc3QtbWVyZ2UgPmRpZmZlcmVuY2UgJiYKKwlpZiB0ZXN0IC1zIGRpZmZlcmVuY2UKKwl0aGVuCisJCWNhdCBkaWZmZXJlbmNlCisJCShleGl0IDEpCisJZWxzZQorCQllY2hvIGhhcHB5CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGlja2luZyByZWJhc2UnICcKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQgcmViYXNlIC0tbWVyZ2UgLS1vbnRvIG1hc3RlciBzaWRlXl4gJiYKKwltYj0kKGdpdCBtZXJnZS1iYXNlIG1hc3RlciBIRUFEKSAmJgorCWlmIHRlc3QgIiRtYiIgPSAiJChnaXQgcmV2LXBhcnNlIG1hc3RlcikiCisJdGhlbgorCQllY2hvIGhhcHB5CisJZWxzZQorCQlnaXQgc2hvdy1icmFuY2gKKwkJKGV4aXQgMSkKKwlmaSAmJgorCWY9JChnaXQgZGlmZi10cmVlIC0tbmFtZS1vbmx5IEhFQUReIEhFQUQpICYmCisJZz0kKGdpdCBkaWZmLXRyZWUgLS1uYW1lLW9ubHkgSEVBRF5eIEhFQUReKSAmJgorCWNhc2UgIiRmLCRnIiBpbgorCW5ld2ZpbGUsbmV3ZmlsZSkKKwkJZWNobyBoYXBweSA7OworCSopCisJCWVjaG8gIiRmIgorCQllY2hvICIkZyIKKwkJKGV4aXQgMSkKKwllc2FjCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMy1yZWJhc2Utc2tpcC5zaCBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTc3YzQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSAtLW1lcmdlIC0tc2tpcCB0ZXN0cycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IGdpdC1hbSAtMyAtLXNraXAgc3RyYXRlZ3kgaXMgdGVzdGVkIGluZGVwZW5kZW50bHkKKyMgYW5kIGFsd2F5cyB3b3JrcyA6KQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGhlbGxvID4gaGVsbG8gJiYKKwlnaXQgYWRkIGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtbSAiaGVsbG8iICYmCisJZ2l0IGJyYW5jaCBza2lwLXJlZmVyZW5jZSAmJgorCisJZWNobyB3b3JsZCA+PiBoZWxsbyAmJgorCWdpdCBjb21taXQgLWEgLW0gImhlbGxvIHdvcmxkIiAmJgorCWVjaG8gZ29vZGJ5ZSA+PiBoZWxsbyAmJgorCWdpdCBjb21taXQgLWEgLW0gImdvb2RieWUiICYmCisKKwlnaXQgY2hlY2tvdXQgLWYgc2tpcC1yZWZlcmVuY2UgJiYKKwllY2hvIG1vbyA+IGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAid2Ugc2hvdWxkIHNraXAgdGhpcyIgJiYKKwllY2hvIG1vbyA+IGNvdyAmJgorCWdpdCBhZGQgY293ICYmCisJZ2l0IGNvbW1pdCAtbSAidGhpcyBzaG91bGQgbm90IGJlIHNraXBwZWQiICYmCisJZ2l0IGJyYW5jaCBwcmUtcmViYXNlIHNraXAtcmVmZXJlbmNlICYmCisJZ2l0IGJyYW5jaCBza2lwLW1lcmdlIHNraXAtcmVmZXJlbmNlCisJJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdyZWJhc2Ugd2l0aCBnaXQgYW0gLTMgKGRlZmF1bHQpJyAnCisJZ2l0IHJlYmFzZSBtYXN0ZXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIC0tc2tpcCB3aXRoIGFtIC0zJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEICYmCisJZ2l0IHJlYmFzZSAtLXNraXAKKwknCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCBza2lwLW1lcmdlJyAnZ2l0IGNoZWNrb3V0IC1mIHNraXAtbWVyZ2UnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ3JlYmFzZSB3aXRoIC0tbWVyZ2UnICdnaXQgcmViYXNlIC0tbWVyZ2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLS1za2lwIHdpdGggLS1tZXJnZScgJworCWdpdCByZXNldCAtLWhhcmQgSEVBRCAmJgorCWdpdCByZWJhc2UgLS1za2lwCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBhbmQgcmVmZXJlbmNlIHRyZWVzIGVxdWFsJyBcCisJJ3Rlc3QgLXogImBnaXQtZGlmZi10cmVlIHNraXAtbWVyZ2Ugc2tpcC1yZWZlcmVuY2VgIicKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmIHNsZWVwIDEnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3QzNTAwLWNoZXJyeS5zaCBiL3QvdDM1MDAtY2hlcnJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4M2JiZWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNTAwLWNoZXJyeS5zaApAQCAtMCwwICsxLDU0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFlhbm4gRGlyc29uLCBiYXNlZCBvbiB0MzQwMCBieSBBbW9zIFdhdGVybGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlcnJ5IHNob3VsZCBkZXRlY3QgcGF0Y2hlcyBpbnRlZ3JhdGVkIHVwc3RyZWFtCisKK1RoaXMgdGVzdCBjaGVycnktcGlja3Mgb25lIGxvY2FsIGNoYW5nZSBvZiB0d28gaW50byBtYXN0ZXIgYnJhbmNoLCBhbmQKK2NoZWNrcyB0aGF0IGdpdC1jaGVycnkgb25seSByZXR1cm5zIHRoZSBzZWNvbmQgcGF0Y2ggaW4gdGhlIGxvY2FsIGJyYW5jaAorJworLiAuL3Rlc3QtbGliLnNoCisKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPWJvZ3VzX2VtYWlsX2FkZHJlc3MKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVwb3NpdG9yeSB3aXRoIHRvcGljIGJyYW5jaCwgYW5kIGNoZWNrIGNoZXJyeSBmaW5kcyB0aGUgMiBwYXRjaGVzIGZyb20gdGhlcmUnIFwKKyAgICAnZWNobyBGaXJzdCA+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBBLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWIgbXktdG9waWMtYnJhbmNoICYmCisKKyAgICAgZWNobyBTZWNvbmQgPiBCICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQiAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQi4iICYmCisKKyAgICAgc2xlZXAgMiAmJgorICAgICBlY2hvIEFub3RoZXJTZWNvbmQgPiBDICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQyAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQy4iICYmCisKKyAgICAgZ2l0LWNoZWNrb3V0IC1mIG1hc3RlciAmJgorICAgICBybSAtZiBCIEMgJiYKKworICAgICBlY2hvIFRoaXJkID4+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIk1vZGlmeSBBLiIgJiYKKworICAgICBleHByICIkKGVjaG8gJChnaXQtY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2gpICkiIDogIisgW14gXSogKyAuKiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIHRoYXQgY2hlcnJ5IHdpdGggbGltaXQgcmV0dXJucyBvbmx5IHRoZSB0b3AgcGF0Y2gnXAorICAgICdleHByICIkKGVjaG8gJChnaXQtY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2ggbXktdG9waWMtYnJhbmNoXjEpICkiIDogIisgW14gXSoiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVycnktcGljayBvbmUgb2YgdGhlIDIgcGF0Y2hlcywgYW5kIGNoZWNrIGNoZXJyeSByZWNvZ25pemVkIG9uZSBhbmQgb25seSBvbmUgYXMgbmV3JyBcCisgICAgJ2dpdC1jaGVycnktcGljayBteS10b3BpYy1icmFuY2heMCAmJgorICAgICBlY2hvICQoZ2l0LWNoZXJyeSBtYXN0ZXIgbXktdG9waWMtYnJhbmNoKSAmJgorICAgICBleHByICIkKGVjaG8gJChnaXQtY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2gpICkiIDogIisgW14gXSogLSAuKiIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNTAxLXJldmVydC1jaGVycnktcGljay5zaCBiL3QvdDM1MDEtcmV2ZXJ0LWNoZXJyeS1waWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1MmFmMWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNTAxLXJldmVydC1jaGVycnktcGljay5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBjaGVycnktcGljayBhbmQgcmV2ZXJ0IHdpdGggcmVuYW1lcworCisgIC0tCisgICArIHJlbmFtZTI6IHJlbmFtZXMgb29wcyB0byBvcG9zCisgICsgIHJlbmFtZTE6IHJlbmFtZXMgb29wcyB0byBzcG9vCisgICsgIGFkZGVkOiAgIGFkZHMgZXh0cmEgbGluZSB0byBvb3BzCisgICsrIGluaXRpYWw6IGhhcyBsaW5lcyBpbiBvb3BzCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIGwgaW4gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8KKwlkbworCQllY2hvICRsJGwkbCRsJGwkbCRsJGwkbAorCWRvbmUgPm9vcHMgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBhZGQgb29wcyAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCB0YWcgaW5pdGlhbCAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyAiQWRkIGV4dHJhIGxpbmUgYXQgdGhlIGVuZCIgPj5vb3BzICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBhZGRlZCAmJgorCWdpdCB0YWcgYWRkZWQgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBtdiBvb3BzIHNwb28gJiYKKwlnaXQgY29tbWl0IC1tIHJlbmFtZTEgJiYKKwlnaXQgdGFnIHJlbmFtZTEgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjaGVja291dCAtYiBzaWRlIGluaXRpYWwgJiYKKwlnaXQgbXYgb29wcyBvcG9zICYmCisJZ2l0IGNvbW1pdCAtbSByZW5hbWUyICYmCisJZ2l0IHRhZyByZW5hbWUyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZXJyeS1waWNrIGFmdGVyIHJlbmFtaW5nIGJyYW5jaCcgJworCisJZ2l0IGNoZWNrb3V0IHJlbmFtZTIgJiYKKwlFRElUT1I9OiBWSVNVQUw9OiBnaXQgY2hlcnJ5LXBpY2sgYWRkZWQgJiYKKwl0ZXN0IC1mIG9wb3MgJiYKKwlncmVwICJBZGQgZXh0cmEgbGluZSBhdCB0aGUgZW5kIiBvcG9zCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV2ZXJ0IGFmdGVyIHJlbmFtaW5nIGJyYW5jaCcgJworCisJZ2l0IGNoZWNrb3V0IHJlbmFtZTEgJiYKKwlFRElUT1I9OiBWSVNVQUw9OiBnaXQgcmV2ZXJ0IGFkZGVkICYmCisJdGVzdCAtZiBzcG9vICYmCisJISBncmVwICJBZGQgZXh0cmEgbGluZSBhdCB0aGUgZW5kIiBzcG9vCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNjAwLXJtLnNoIGIvdC90MzYwMC1ybS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTk3Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzYwMC1ybS5zaApAQCAtMCwwICsxLDE4NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXJsIEQuIFdvcnRoCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3Qgb2YgdGhlIHZhcmlvdXMgb3B0aW9ucyB0byBnaXQtcm0uJworCisuIC4vdGVzdC1saWIuc2gKKworIyBTZXR1cCBzb21lIGZpbGVzIHRvIGJlIHJlbW92ZWQsIHNvbWUgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnSW5pdGlhbGl6ZSB0ZXN0IGRpcmVjdG9yeScgXAorICAgICJ0b3VjaCAtLSBmb28gYmFyIGJheiAnc3BhY2UgZW1iZWRkZWQnIC1xICYmCisgICAgIGdpdC1hZGQgLS0gZm9vIGJhciBiYXogJ3NwYWNlIGVtYmVkZGVkJyAtcSAmJgorICAgICBnaXQtY29tbWl0IC1tICdhZGQgbm9ybWFsIGZpbGVzJyAmJgorICAgICB0ZXN0X3RhYnM9eSAmJgorICAgICBpZiB0b3VjaCAtLSAndGFiCWVtYmVkZGVkJyAnbmV3bGluZQorZW1iZWRkZWQnCisgICAgIHRoZW4KKyAgICAgZ2l0LWFkZCAtLSAndGFiCWVtYmVkZGVkJyAnbmV3bGluZQorZW1iZWRkZWQnICYmCisgICAgIGdpdC1jb21taXQgLW0gJ2FkZCBmaWxlcyB3aXRoIHRhYnMgYW5kIG5ld2xpbmVzJworICAgICBlbHNlCisgICAgICAgICBzYXkgJ1lvdXIgZmlsZXN5c3RlbSBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcy4nCisgICAgICAgICB0ZXN0X3RhYnM9bgorICAgICBmaSIKKworIyBMYXRlciB3ZSB3aWxsIHRyeSByZW1vdmluZyBhbiB1bnJlbW92YWJsZSBwYXRoIHRvIG1ha2Ugc3VyZQorIyBnaXQtcm0gYmFyZnMsIGJ1dCBpZiB0aGUgdGVzdCBpcyBydW4gYXMgcm9vdCB0aGF0IGNhbm5vdCBiZQorIyBhcnJhbmdlZC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdEZXRlcm1pbmUgcm0gYmVoYXZpb3InIFwKKyAgICAnOiA+dGVzdC1maWxlCisgICAgIGNobW9kIGEtdyAuCisgICAgIHJtIC1mIHRlc3QtZmlsZQorICAgICB0ZXN0IC1mIHRlc3QtZmlsZSAmJiB0ZXN0X2ZhaWxlZF9yZW1vdmU9eQorICAgICBjaG1vZCA3NzUgLgorICAgICBybSAtZiB0ZXN0LWZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQcmUtY2hlY2sgdGhhdCBmb28gZXhpc3RzIGFuZCBpcyBpbiBpbmRleCBiZWZvcmUgZ2l0LXJtIGZvbycgXAorICAgICdbIC1mIGZvbyBdICYmIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0IGdpdC1ybSBmb28gc3VjY2VlZHMnIFwKKyAgICAnZ2l0LXJtIC0tY2FjaGVkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Bvc3QtY2hlY2sgdGhhdCBmb28gZXhpc3RzIGJ1dCBpcyBub3QgaW4gaW5kZXggYWZ0ZXIgZ2l0LXJtIGZvbycgXAorICAgICdbIC1mIGZvbyBdICYmICEgZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQcmUtY2hlY2sgdGhhdCBiYXIgZXhpc3RzIGFuZCBpcyBpbiBpbmRleCBiZWZvcmUgImdpdC1ybSBiYXIiJyBcCisgICAgJ1sgLWYgYmFyIF0gJiYgZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBiYXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUZXN0IHRoYXQgImdpdC1ybSBiYXIiIHN1Y2NlZWRzJyBcCisgICAgJ2dpdC1ybSBiYXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQb3N0LWNoZWNrIHRoYXQgYmFyIGRvZXMgbm90IGV4aXN0IGFuZCBpcyBub3QgaW4gaW5kZXggYWZ0ZXIgImdpdC1ybSAtZiBiYXIiJyBcCisgICAgJyEgWyAtZiBiYXIgXSAmJiAhIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0ICJnaXQtcm0gLS0gLXEiIHN1Y2NlZWRzIChyZW1vdmUgYSBmaWxlIHRoYXQgbG9va3MgbGlrZSBhbiBvcHRpb24pJyBcCisgICAgJ2dpdC1ybSAtLSAtcScKKwordGVzdCAiJHRlc3RfdGFicyIgPSB5ICYmIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICJUZXN0IHRoYXQgXCJnaXQtcm0gLWZcIiBzdWNjZWVkcyB3aXRoIGVtYmVkZGVkIHNwYWNlLCB0YWIsIG9yIG5ld2xpbmUgY2hhcmFjdGVycy4iIFwKKyAgICAiZ2l0LXJtIC1mICdzcGFjZSBlbWJlZGRlZCcgJ3RhYgllbWJlZGRlZCcgJ25ld2xpbmUKK2VtYmVkZGVkJyIKKworaWYgdGVzdCAiJHRlc3RfZmFpbGVkX3JlbW92ZSIgPSB5OyB0aGVuCitjaG1vZCBhLXcgLgordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0LXJtIC1mIiBmYWlscyBpZiBpdHMgcm0gZmFpbHMnIFwKKyAgICAnZ2l0LXJtIC1mIGJheicKK2NobW9kIDc3NSAuCitlbHNlCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgcmVtb3ZhbCBmYWlsdXJlIChwZXJoYXBzIHJ1bm5pbmcgYXMgcm9vdD8pJyA6CitmaQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnV2hlbiB0aGUgcm0gaW4gImdpdC1ybSAtZiIgZmFpbHMsIGl0IHNob3VsZCBub3QgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIGluZGV4JyBcCisgICAgJ2dpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggYmF6JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZW1vdmUgbm9uZXhpc3RlbnQgZmlsZSB3aXRoIC0taWdub3JlLXVubWF0Y2gnICcKKwlnaXQgcm0gLS1pZ25vcmUtdW5tYXRjaCBub25leGlzdGVudAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcicm0iIGNvbW1hbmQgcHJpbnRlZCcgJworCWVjaG8gZnJvdHogPiB0ZXN0LWZpbGUgJiYKKwlnaXQgYWRkIHRlc3QtZmlsZSAmJgorCWdpdCBjb21taXQgLW0gImFkZCBmaWxlIGZvciBybSB0ZXN0IiAmJgorCWdpdCBybSB0ZXN0LWZpbGUgPiBybS1vdXRwdXQgJiYKKwl0ZXN0IGBlZ3JlcCAiXnJtICIgcm0tb3V0cHV0IHwgd2MgLWxgID0gMSAmJgorCXJtIC1mIHRlc3QtZmlsZSBybS1vdXRwdXQgJiYKKwlnaXQgY29tbWl0IC1tICJyZW1vdmUgZmlsZSBmcm9tIHJtIHRlc3QiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJyJybSIgY29tbWFuZCBzdXBwcmVzc2VkIHdpdGggLS1xdWlldCcgJworCWVjaG8gZnJvdHogPiB0ZXN0LWZpbGUgJiYKKwlnaXQgYWRkIHRlc3QtZmlsZSAmJgorCWdpdCBjb21taXQgLW0gImFkZCBmaWxlIGZvciBybSAtLXF1aWV0IHRlc3QiICYmCisJZ2l0IHJtIC0tcXVpZXQgdGVzdC1maWxlID4gcm0tb3V0cHV0ICYmCisJdGVzdCBgd2MgLWwgPCBybS1vdXRwdXRgID0gMCAmJgorCXJtIC1mIHRlc3QtZmlsZSBybS1vdXRwdXQgJiYKKwlnaXQgY29tbWl0IC1tICJyZW1vdmUgZmlsZSBmcm9tIHJtIC0tcXVpZXQgdGVzdCIKKycKKworIyBOb3csIGZhaWx1cmUgY2FzZXMuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZS1hZGQgZm9vIGFuZCBiYXonICcKKwlnaXQgYWRkIGZvbyBiYXogJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnTW9kaWZ5IGZvbyAtLSBybSBzaG91bGQgcmVmdXNlJyAnCisJZWNobyA+PmZvbyAmJgorCSEgZ2l0IHJtIGZvbyBiYXogJiYKKwl0ZXN0IC1mIGZvbyAmJgorCXRlc3QgLWYgYmF6ICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmF6CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ01vZGlmaWVkIGZvbyAtLSBybSAtZiBzaG91bGQgd29yaycgJworCWdpdCBybSAtZiBmb28gYmF6ICYmCisJdGVzdCAhIC1mIGZvbyAmJgorCXRlc3QgISAtZiBiYXogJiYKKwkhIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vICYmCisJISBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZS1hZGQgZm9vIGFuZCBiYXogZm9yIEhFQUQgdGVzdHMnICcKKwllY2hvIGZyb3R6ID5mb28gJiYKKwlnaXQgY2hlY2tvdXQgSEVBRCAtLSBiYXogJiYKKwlnaXQgYWRkIGZvbyBiYXogJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9vIGlzIGRpZmZlcmVudCBpbiBpbmRleCBmcm9tIEhFQUQgLS0gcm0gc2hvdWxkIHJlZnVzZScgJworCSEgZ2l0IHJtIGZvbyBiYXogJiYKKwl0ZXN0IC1mIGZvbyAmJgorCXRlc3QgLWYgYmF6ICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmF6CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1dCB3aXRoIC1mIGl0IHNob3VsZCB3b3JrLicgJworCWdpdCBybSAtZiBmb28gYmF6ICYmCisJdGVzdCAhIC1mIGZvbyAmJgorCXRlc3QgISAtZiBiYXogJiYKKwkhIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vCisJISBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhegorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgdGVzdCBzZXR1cCcgJworCW1rZGlyIC1wIGZyb3R6ICYmCisJZWNobyBxZndmcSA+ZnJvdHovbml0Zm9sICYmCisJZ2l0IGFkZCBmcm90eiAmJgorCWdpdCBjb21taXQgLW0gInN1YmRpciB0ZXN0IgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgd2l0aG91dCAtciBmYWlscycgJworCSEgZ2l0IHJtIGZyb3R6ICYmCisJdGVzdCAtZCBmcm90eiAmJgorCXRlc3QgLWYgZnJvdHovbml0Zm9sCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1JlY3Vyc2l2ZSB3aXRoIC1yIGJ1dCBkaXJ0eScgJworCWVjaG8gcWZ3ZnEgPj5mcm90ei9uaXRmb2wKKwkhIGdpdCBybSAtciBmcm90eiAmJgorCXRlc3QgLWQgZnJvdHogJiYKKwl0ZXN0IC1mIGZyb3R6L25pdGZvbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgd2l0aCAtciAtZicgJworCWdpdCBybSAtZiAtciBmcm90eiAmJgorCSEgdGVzdCAtZiBmcm90ei9uaXRmb2wgJiYKKwkhIHRlc3QgLWQgZnJvdHoKKycKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnUmVtb3ZlIG5vbmV4aXN0ZW50IGZpbGUgcmV0dXJucyBub256ZXJvIGV4aXQgc3RhdHVzJyAnCisJZ2l0IHJtIG5vbmV4aXN0ZW50CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzcwMC1hZGQuc2ggYi90L3QzNzAwLWFkZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDhjYzdkCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzcwMC1hZGQuc2gKQEAgLTAsMCArMSwxMTMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FybCBELiBXb3J0aAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IG9mIGdpdC1hZGQsIGluY2x1ZGluZyB0aGUgLS0gb3B0aW9uLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUZXN0IG9mIGdpdC1hZGQnIFwKKyAgICAndG91Y2ggZm9vICYmIGdpdC1hZGQgZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUG9zdC1jaGVjayB0aGF0IGZvbyBpcyBpbiB0aGUgaW5kZXgnIFwKKyAgICAnZ2l0LWxzLWZpbGVzIGZvbyB8IGdyZXAgZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0ICJnaXQtYWRkIC0tIC1xIiB3b3JrcycgXAorICAgICd0b3VjaCAtLSAtcSAmJiBnaXQtYWRkIC0tIC1xJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWFkZDogVGVzdCB0aGF0IGV4ZWN1dGFibGUgYml0IGlzIG5vdCB1c2VkIGlmIGNvcmUuZmlsZW1vZGU9MCcgXAorCSdnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUgMCAmJgorCSBlY2hvIGZvbyA+eGZvbzEgJiYKKwkgY2htb2QgNzU1IHhmb28xICYmCisJIGdpdC1hZGQgeGZvbzEgJiYKKwkgY2FzZSAiYGdpdC1scy1maWxlcyAtLXN0YWdlIHhmb28xYCIgaW4KKwkgMTAwNjQ0IiAiKnhmb28xKSBlY2hvIG9rOzsKKwkgKikgZWNobyBmYWlsOyBnaXQtbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMTsgKGV4aXQgMSk7OworCSBlc2FjJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtYWRkOiBmaWxlbW9kZT0wIHNob3VsZCBub3QgZ2V0IGNvbmZ1c2VkIGJ5IHN5bWxpbmsnICcKKwlybSAtZiB4Zm9vMSAmJgorCWxuIC1zIGZvbyB4Zm9vMSAmJgorCWdpdC1hZGQgeGZvbzEgJiYKKwljYXNlICJgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgeGZvbzFgIiBpbgorCTEyMDAwMCIgIip4Zm9vMSkgZWNobyBvazs7CisJKikgZWNobyBmYWlsOyBnaXQtbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMTsgKGV4aXQgMSk7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQ6IFRlc3QgdGhhdCBleGVjdXRhYmxlIGJpdCBpcyBub3QgdXNlZC4uLicgXAorCSdnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUgMCAmJgorCSBlY2hvIGZvbyA+eGZvbzIgJiYKKwkgY2htb2QgNzU1IHhmb28yICYmCisJIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeGZvbzIgJiYKKwkgY2FzZSAiYGdpdC1scy1maWxlcyAtLXN0YWdlIHhmb28yYCIgaW4KKwkgMTAwNjQ0IiAiKnhmb28yKSBlY2hvIG9rOzsKKwkgKikgZWNobyBmYWlsOyBnaXQtbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMjsgKGV4aXQgMSk7OworCSBlc2FjJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtYWRkOiBmaWxlbW9kZT0wIHNob3VsZCBub3QgZ2V0IGNvbmZ1c2VkIGJ5IHN5bWxpbmsnICcKKwlybSAtZiB4Zm9vMiAmJgorCWxuIC1zIGZvbyB4Zm9vMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgeGZvbzIgJiYKKwljYXNlICJgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgeGZvbzJgIiBpbgorCTEyMDAwMCIgIip4Zm9vMikgZWNobyBvazs7CisJKikgZWNobyBmYWlsOyBnaXQtbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMjsgKGV4aXQgMSk7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQ6IFRlc3QgdGhhdCBleGVjdXRhYmxlIGJpdCBpcyBub3QgdXNlZC4uLicgXAorCSdnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUgMCAmJgorCSBsbiAtcyB4Zm9vMiB4Zm9vMyAmJgorCSBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHhmb28zICYmCisJIGNhc2UgImBnaXQtbHMtZmlsZXMgLS1zdGFnZSB4Zm9vM2AiIGluCisJIDEyMDAwMCIgIip4Zm9vMykgZWNobyBvazs7CisJICopIGVjaG8gZmFpbDsgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgeGZvbzM7IChleGl0IDEpOzsKKwkgZXNhYycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLmdpdGlnbm9yZSB0ZXN0IHNldHVwJyAnCisJZWNobyAiKi5pZyIgPi5naXRpZ25vcmUgJiYKKwlta2RpciBjLmlmIGQuaWcgJiYKKwk+YS5pZyAmJiA+Yi5pZiAmJgorCT5jLmlmL2MuaWYgJiYgPmMuaWYvYy5pZyAmJgorCT5kLmlnL2QuaWYgJiYgPmQuaWcvZC5pZworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcuZ2l0aWdub3JlIGlzIGhvbm9yZWQnICcKKwlnaXQtYWRkIC4gJiYKKwkhIGdpdC1scy1maWxlcyB8IGdyZXAgIlxcLmlnIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdlcnJvciBvdXQgd2hlbiBhdHRlbXB0aW5nIHRvIGFkZCBpZ25vcmVkIG9uZXMgd2l0aG91dCAtZicgJworCSEgZ2l0LWFkZCBhLj8/ICYmCisJISBnaXQtbHMtZmlsZXMgfCBncmVwICJcXC5pZyIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXJyb3Igb3V0IHdoZW4gYXR0ZW1wdGluZyB0byBhZGQgaWdub3JlZCBvbmVzIHdpdGhvdXQgLWYnICcKKwkhIGdpdC1hZGQgZC4/PyAmJgorCSEgZ2l0LWxzLWZpbGVzIHwgZ3JlcCAiXFwuaWciCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBpZ25vcmVkIG9uZXMgd2l0aCAtZicgJworCWdpdC1hZGQgLWYgYS4/PyAmJgorCWdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggYS5pZworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhZGQgaWdub3JlZCBvbmVzIHdpdGggLWYnICcKKwlnaXQtYWRkIC1mIGQuPz8vKiAmJgorCWdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZC5pZy9kLmlmIGQuaWcvZC5pZworJworCitta2RpciAxIDEvMiAxLzMKK3RvdWNoIDEvMi9hIDEvMy9iIDEvMi9jCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBjb3JyZWN0IHByZWZpeCBkZXRlY3Rpb24nICcKKwlnaXQgYWRkIDEvMi9hIDEvMy9iIDEvMi9jCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzgwMC1ta3RhZy5zaCBiL3QvdDM4MDAtbWt0YWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M3ZTQzMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM4MDAtbWt0YWcuc2gKQEAgLTAsMCArMSwyMjcgQEAKKyMhL2Jpbi9zaAorIworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbWt0YWc6IHRhZyBvYmplY3QgdmVyaWZ5IHRlc3QnCisKKy4gLi90ZXN0LWxpYi5zaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGVjayB0aGUgdGFnLnNpZyBmaWxlLCBleHBlY3RpbmcgdmVyaWZ5X3RhZygpIHRvIGZhaWwsCisjIGFuZCBjaGVja2luZyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIG1hdGNoZXMgdGhlIHBhdHRlcm4KKyMgZ2l2ZW4gaW4gdGhlIGV4cGVjdC5wYXQgZmlsZS4KKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgKCkgeworICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAiJDEiIFwKKyAgICAgICAgJ2dpdC1ta3RhZyA8dGFnLnNpZyAyPm1lc3NhZ2UgfHwKKyAgICAgICAgIGVncmVwIC1xIC1mIGV4cGVjdC5wYXQgbWVzc2FnZScKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmlyc3QgY3JlYXRlIGEgY29tbWl0LCBzbyB3ZSBoYXZlIGEgdmFsaWQgb2JqZWN0L3R5cGUKKyMgZm9yIHRoZSB0YWcuCitlY2hvIEhlbGxvID5BCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEKK2dpdC1jb21taXQgLW0gIkluaXRpYWwgY29tbWl0IgoraGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAxLiBsZW5ndGggY2hlY2sKKworY2F0ID50YWcuc2lnIDw8RU9GCit0b28gc2hvcnQgZm9yIGEgdGFnCitFT0YKKworY2F0ID5leHBlY3QucGF0IDw8RU9GCiteZXJyb3I6IC4qc2l6ZSB3cm9uZy4qJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICdUYWcgb2JqZWN0IGxlbmd0aCBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAyLiBvYmplY3QgbGluZSBsYWJlbCBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK3h4eHh4eCAxMzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1Cit0eXBlIHRhZwordGFnIG15dGFnCitFT0YKKworY2F0ID5leHBlY3QucGF0IDw8RU9GCiteZXJyb3I6IGNoYXIwOiAuKiJvYmplY3QgIiQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnIm9iamVjdCIgbGluZSBsYWJlbCBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAzLiBvYmplY3QgbGluZSBTSEExIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IHp6OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnCit0YWcgbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjc6IC4qU0hBMSBoYXNoJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcib2JqZWN0IiBsaW5lIFNIQTEgY2hlY2snCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNC4gdHlwZSBsaW5lIGxhYmVsIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3h4eHggdGFnCit0YWcgbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjQ3OiAuKiJbXF1udHlwZSAiJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidHlwZSIgbGluZSBsYWJlbCBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA1LiB0eXBlIGxpbmUgZW9sIGNoZWNrCisKK2VjaG8gIm9iamVjdCA3NzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1IiA+dGFnLnNpZworcHJpbnRmICJ0eXBlIHRhZ3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3MiID4+dGFnLnNpZworCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjQ4OiAuKiJbXF1uIiQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInR5cGUiIGxpbmUgZW9sIGNoZWNrJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDYuIHRhZyBsaW5lIGxhYmVsIGNoZWNrICMxCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnCit4eHggbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjU3OiBubyAidGFnICIgZm91bmQkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJyJ0YWciIGxpbmUgbGFiZWwgY2hlY2sgIzEnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNy4gdGFnIGxpbmUgbGFiZWwgY2hlY2sgIzIKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgNzc5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQordHlwZSB0YWdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cKK3RhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyODc6IG5vICJ0YWcgIiBmb3VuZCQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInRhZyIgbGluZSBsYWJlbCBjaGVjayAjMicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA4LiB0eXBlIGxpbmUgdHlwZS1uYW1lIGxlbmd0aCBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCA3NzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1Cit0eXBlIHRhZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZwordGFnIG15dGFnCitFT0YKKworY2F0ID5leHBlY3QucGF0IDw8RU9GCiteZXJyb3I6IGNoYXI1MzogdHlwZSB0b28gbG9uZyQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInR5cGUiIGxpbmUgdHlwZS1uYW1lIGxlbmd0aCBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA5LiB2ZXJpZnkgb2JqZWN0IChTSEExL3R5cGUpIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnZ2dnCit0YWcgbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjc6IGNvdWxkIG5vdCB2ZXJpZnkgb2JqZWN0LiokCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ3ZlcmlmeSBvYmplY3QgKFNIQTEvdHlwZSkgY2hlY2snCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxMC4gdmVyaWZ5IHRhZy1uYW1lIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15CXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNjc6IGNvdWxkIG5vdCB2ZXJpZnkgdGFnIG5hbWUkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ3ZlcmlmeSB0YWctbmFtZSBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDExLiB0YWdnZXIgbGluZSBsYWJlbCBjaGVjayAjMQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNzA6IGNvdWxkIG5vdCBmaW5kICJ0YWdnZXIiJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidGFnZ2VyIiBsaW5lIGxhYmVsIGNoZWNrICMxJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTIuIHRhZ2dlciBsaW5lIGxhYmVsIGNoZWNrICMyCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjcwOiBjb3VsZCBub3QgZmluZCAidGFnZ2VyIiQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInRhZ2dlciIgbGluZSBsYWJlbCBjaGVjayAjMicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEzLiBjcmVhdGUgdmFsaWQgdGFnCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIgYW5vdGhlckBleGFtcGxlLmNvbQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGUgdmFsaWQgdGFnJyBcCisgICAgJ2dpdC1ta3RhZyA8dGFnLnNpZyA+LmdpdC9yZWZzL3RhZ3MvbXl0YWcgMj5tZXNzYWdlJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTQuIGNoZWNrIG15dGFnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayBteXRhZycgXAorICAgICdnaXQtdGFnIC1sIHwgZ3JlcCBteXRhZycKKworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM5MDAtaTE4bi1jb21taXQuc2ggYi90L3QzOTAwLWkxOG4tY29tbWl0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmZGRiNjgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzOTAwLWkxOG4tY29tbWl0LnNoCkBAIC0wLDAgKzEsMTIyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2NvbW1pdCBhbmQgbG9nIG91dHB1dCBlbmNvZGluZ3MnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjb21wYXJlX3dpdGggKCkgeworCWdpdC1zaG93IC1zICQxIHwgc2VkIC1lICcxLC9eJC9kJyAtZSAncy9eICAgIC8vJyAtZSAnJGQnID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgY3VycmVudCAiJDIiCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCTogPkYgJiYKKwlnaXQtYWRkIEYgJiYKKwlUPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisJQz0kKGdpdC1jb21taXQtdHJlZSAkVCA8Li4vdDM5MDAvMS1VVEYtOC50eHQpICYmCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQyAmJgorCWdpdC10YWcgQzAKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gZW5jb2RpbmcgaGVhZGVyIGZvciBiYXNlIGNhc2UnICcKKwlFPSQoZ2l0LWNhdC1maWxlIGNvbW1pdCBDMCB8IHNlZCAtbmUgInMvXmVuY29kaW5nIC8vcCIpICYmCisJdGVzdCB6ID0gInokRSIKKycKKworZm9yIEggaW4gSVNPLTg4NTktMSBFVUNKUCBJU08tMjAyMi1KUAorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkSCBzZXR1cCIgJworCQlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgJEggJiYKKwkJZ2l0LWNoZWNrb3V0IC1iICRIIEMwICYmCisJCWVjaG8gJEggPkYgJiYKKwkJZ2l0LWNvbW1pdCAtYSAtRiAuLi90MzkwMC8kSC50eHQKKwknCitkb25lCisKK2ZvciBIIGluIElTTy04ODU5LTEgRVVDSlAgSVNPLTIwMjItSlAKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2sgZW5jb2RpbmcgaGVhZGVyIGZvciAkSCIgJworCQlFPSQoZ2l0LWNhdC1maWxlIGNvbW1pdCAnJEgnIHwgc2VkIC1uZSAicy9eZW5jb2RpbmcgLy9wIikgJiYKKwkJdGVzdCAieiRFIiA9ICJ6JyRIJyIKKwknCitkb25lCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZyB0byByZW1vdmUgY3VzdG9taXphdGlvbicgJworCWdpdC1jb25maWcgLS11bnNldC1hbGwgaTE4bi5jb21taXRlbmNvZGluZyAmJgorCWlmIFo9JChnaXQtY29uZmlnIC0tZ2V0LWFsbCBpMThuLmNvbW1pdGVuY29kaW5nKQorCXRoZW4KKwkJZWNobyBPb3BzLCBzaG91bGQgaGF2ZSBmYWlsZWQuCisJCWZhbHNlCisJZWxzZQorCQl0ZXN0IHogPSAieiRaIgorCWZpICYmCisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIHV0Zi04CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0lTTy04ODU5LTEgc2hvdWxkIGJlIHNob3duIGluIFVURi04IG5vdycgJworCWNvbXBhcmVfd2l0aCBJU08tODg1OS0xIC4uL3QzOTAwLzEtVVRGLTgudHh0CisnCisKK2ZvciBIIGluIEVVQ0pQIElTTy0yMDIyLUpQCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRIIHNob3VsZCBiZSBzaG93biBpbiBVVEYtOCBub3ciICcKKwkJY29tcGFyZV93aXRoICckSCcgLi4vdDM5MDAvMi1VVEYtOC50eHQKKwknCitkb25lCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZyB0byBhZGQgY3VzdG9taXphdGlvbicgJworCWdpdC1jb25maWcgLS11bnNldC1hbGwgaTE4bi5jb21taXRlbmNvZGluZyAmJgorCWlmIFo9JChnaXQtY29uZmlnIC0tZ2V0LWFsbCBpMThuLmNvbW1pdGVuY29kaW5nKQorCXRoZW4KKwkJZWNobyBPb3BzLCBzaG91bGQgaGF2ZSBmYWlsZWQuCisJCWZhbHNlCisJZWxzZQorCQl0ZXN0IHogPSAieiRaIgorCWZpCisnCisKK2ZvciBIIGluIElTTy04ODU5LTEgRVVDSlAgSVNPLTIwMjItSlAKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJEggc2hvdWxkIGJlIHNob3duIGluIGl0c2VsZiBub3ciICcKKwkJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nICckSCcgJiYKKwkJY29tcGFyZV93aXRoICckSCcgLi4vdDM5MDAvJyRIJy50eHQKKwknCitkb25lCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZyB0byB0d2VhayBjdXN0b21pemF0aW9uJyAnCisJZ2l0LWNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIHV0Zi04CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0lTTy04ODU5LTEgc2hvdWxkIGJlIHNob3duIGluIFVURi04IG5vdycgJworCWNvbXBhcmVfd2l0aCBJU08tODg1OS0xIC4uL3QzOTAwLzEtVVRGLTgudHh0CisnCisKK2ZvciBIIGluIEVVQ0pQIElTTy0yMDIyLUpQCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRIIHNob3VsZCBiZSBzaG93biBpbiBVVEYtOCBub3ciICcKKwkJY29tcGFyZV93aXRoICckSCcgLi4vdDM5MDAvMi1VVEYtOC50eHQKKwknCitkb25lCisKK2ZvciBKIGluIEVVQ0pQIElTTy0yMDIyLUpQCitkbworCWdpdC1jb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyAkSgorCWZvciBIIGluIEVVQ0pQIElTTy0yMDIyLUpQCisJZG8KKwkJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJEggc2hvdWxkIGJlIHNob3duIGluICRKIG5vdyIgJworCQkJY29tcGFyZV93aXRoICckSCcgLi4vdDM5MDAvJyRKJy50eHQKKwkJJworCWRvbmUKK2RvbmUKKworZm9yIEggaW4gSVNPLTg4NTktMSBFVUNKUCBJU08tMjAyMi1KUAorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJObyBjb252ZXJzaW9uIHdpdGggJEgiICcKKwkJY29tcGFyZV93aXRoICItLWVuY29kaW5nPW5vbmUgJyRIJyIgLi4vdDM5MDAvJyRIJy50eHQKKwknCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzkwMC8xLVVURi04LnR4dCBiL3QvdDM5MDAvMS1VVEYtOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzMWUxOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDAvMS1VVEYtOC50eHQKQEAgLTAsMCArMSwzIEBACivDhMOLw5HDj8OWCisKK8OBYsOnZMOoZmcKZGlmZiAtLWdpdCBhL3QvdDM5MDAvMi1VVEYtOC50eHQgYi90L3QzOTAwLzItVVRGLTgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjRmOGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzOTAwLzItVVRGLTgudHh0CkBAIC0wLDAgKzEsNCBAQAor44Gv44KM44Gy44G744G1CisKK+OBl+OBpuOBhOOCi+OBruOBjOOAgeOBhOOCi+OBruOBp+OAggor5r+x5rWc44G744KM44G344KK44G944KM44G+44Gz44GQ44KK44KN44G444CCCmRpZmYgLS1naXQgYS90L3QzOTAwL0VVQ0pQLnR4dCBiL3QvdDM5MDAvRVVDSlAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmYyYWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzOTAwL0VVQ0pQLnR4dApAQCAtMCwwICsxLDQgQEAKK6TPpOyk0qTbpNUKKworpLekxqSkpOukzqSsoaKkpKTrpM6kx6GjCivfwMnNpNuk7KTXpOqk3aTspN6k06SwpOqk7aTYoaMKZGlmZiAtLWdpdCBhL3QvdDM5MDAvSVNPLTIwMjItSlAudHh0IGIvdC90MzkwMC9JU08tMjAyMi1KUC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiNTMzMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDAvSVNPLTIwMjItSlAudHh0CkBAIC0wLDAgKzEsNCBAQAorGyRCJE8kbCRSJFskVRsoQgorCisbJEIkNyRGJCQkayROJCwhIiQkJGskTiRHISMbKEIKKxskQl9ASU0kWyRsJFckaiRdJGwkXiRTJDAkaiRtJFghIxsoQgpkaWZmIC0tZ2l0IGEvdC90MzkwMC9JU08tODg1OS0xLnR4dCBiL3QvdDM5MDAvSVNPLTg4NTktMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiZWYwZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDAvSVNPLTg4NTktMS50eHQKQEAgLTAsMCArMSwzIEBACivEy9HP1gorCivBYudk6GZnCmRpZmYgLS1naXQgYS90L3QzOTAxLTg4NTktMS50eHQgYi90L3QzOTAxLTg4NTktMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhjMjFhNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDEtODg1OS0xLnR4dApAQCAtMCwwICsxLDQgQEAKKzogdG8gYmUgc291cmNlZCBpbiB0MzkwMSAtLSB0aGlzIGlzIGxhdGluLTEKK0dJVF9BVVRIT1JfTkFNRT0iwentIPP6IiAmJgorR0lUX0NPTU1JVFRFUl9OQU1FPSRHSVRfQVVUSE9SX05BTUUgJiYKK2V4cG9ydCBHSVRfQVVUSE9SX05BTUUgR0lUX0NPTU1JVFRFUl9OQU1FCmRpZmYgLS1naXQgYS90L3QzOTAxLWkxOG4tcGF0Y2guc2ggYi90L3QzOTAxLWkxOG4tcGF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRiZjBlZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDEtaTE4bi1wYXRjaC5zaApAQCAtMCwwICsxLDI1NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdpMThuIHNldHRpbmdzIGFuZCBmb3JtYXQtcGF0Y2ggfCBhbSBwaXBlJworCisuIC4vdGVzdC1saWIuc2gKKworY2hlY2tfZW5jb2RpbmcgKCkgeworCSMgTWFrZSBzdXJlIGNoYXJhY3RlcnMgYXJlIG5vdCBjb3JydXB0ZWQKKwljbnQ9IiQxIiBoZWFkZXI9IiQyIiBpPTEgaj0wIGJhZD0wCisJd2hpbGUgdGVzdCAiJGkiIC1sZSAkY250CisJZG8KKwkJZ2l0IGZvcm1hdC1wYXRjaCAtLWVuY29kaW5nPVVURi04IC0tc3Rkb3V0IEhFQUR+JGkuLkhFQUR+JGogfAorCQlncmVwICJeRnJvbTogPT9VVEYtOD9xPz1DMz04MT1DMz1BOT1DMz1BRD0yMD1DMz1CMz1DMz1CQT89IiAmJgorCQlnaXQtY2F0LWZpbGUgY29tbWl0IEhFQUR+JGogfAorCQljYXNlICIkaGVhZGVyIiBpbgorCQk4ODU5KQorCQkJZ3JlcCAiXmVuY29kaW5nIElTTy04ODU5LTEiIDs7CisJCSopCisJCQkhIGdyZXAgIl5lbmNvZGluZyBJU08tODg1OS0xIiA7OworCQllc2FjIHx8IHsKKwkJCWJhZD0xCisJCQlicmVhaworCQl9CisJCWo9JGkKKwkJaT0kKCgkaSsxKSkKKwlkb25lCisJKGV4aXQgJGJhZCkKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIFVURi04ICYmCisKKwkjIHVzZSBVVEYtOCBpbiBhdXRob3IgYW5kIGNvbW1pdHRlciBuYW1lIHRvIG1hdGNoIHRoZQorCSMgaTE4bi5jb21taXRlbmNvZGluZyBzZXR0aW5ncworCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gIiRHSVRfQVVUSE9SX05BTUUiID5taW5lICYmCisJZ2l0IGFkZCBtaW5lICYmCisJZ2l0IGNvbW1pdCAtcyAtbSAiSW5pdGlhbCBjb21taXQiICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIEhlbGxvIHdvcmxkID5taW5lICYmCisJZ2l0IGFkZCBtaW5lICYmCisJZ2l0IGNvbW1pdCAtcyAtbSAiU2Vjb25kIG9uIG1haW4iICYmCisKKwkjIHRoZSBmaXJzdCBjb21taXQgb24gdGhlIHNpZGUgYnJhbmNoIGlzIFVURi04CisJdGVzdF90aWNrICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUgbWFzdGVyXiAmJgorCWVjaG8gQW5vdGhlciBmaWxlID55b3VycyAmJgorCWdpdCBhZGQgeW91cnMgJiYKKwlnaXQgY29tbWl0IC1zIC1tICJTZWNvbmQgb24gc2lkZSIgJiYKKworCSMgdGhlIHNlY29uZCBvbmUgb24gdGhlIHNpZGUgYnJhbmNoIGlzIElTTy04ODU5LTEKKwlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCSMgdXNlIGF1dGhvciBhbmQgY29tbWl0dGVyIG5hbWUgaW4gSVNPLTg4NTktMSB0byBtYXRjaCBpdC4KKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIFlldCBhbm90aGVyID50aGVpcnMgJiYKKwlnaXQgYWRkIHRoZWlycyAmJgorCWdpdCBjb21taXQgLXMgLW0gIlRoaXJkIG9uIHNpZGUiICYmCisKKwkjIEJhY2sgdG8gZGVmYXVsdAorCWdpdC1jb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBVVEYtOAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JtYXQtcGF0Y2ggb3V0cHV0IChJU08tODg1OS0xKScgJworCWdpdC1jb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBJU08tODg1OS0xICYmCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IG1hc3Rlci4uSEVBRF4gPm91dC1sMSAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgSEVBRF4gPm91dC1sMiAmJgorCWdyZXAgIl5Db250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMSIgb3V0LWwxICYmCisJZ3JlcCAiXkZyb206ID0/SVNPLTg4NTktMT9xPz1DMT1FOT1FRD0yMD1GMz1GQT89IiBvdXQtbDEgJiYKKwlncmVwICJeQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEiIG91dC1sMiAmJgorCWdyZXAgIl5Gcm9tOiA9P0lTTy04ODU5LTE/cT89QzE9RTk9RUQ9MjA9RjM9RkE/PSIgb3V0LWwyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdC1wYXRjaCBvdXRwdXQgKFVURi04KScgJworCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBVVEYtOCAmJgorCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBtYXN0ZXIuLkhFQUReID5vdXQtdTEgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IEhFQUReID5vdXQtdTIgJiYKKwlncmVwICJeQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04IiBvdXQtdTEgJiYKKwlncmVwICJeRnJvbTogPT9VVEYtOD9xPz1DMz04MT1DMz1BOT1DMz1BRD0yMD1DMz1CMz1DMz1CQT89IiBvdXQtdTEgJiYKKwlncmVwICJeQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04IiBvdXQtdTIgJiYKKwlncmVwICJeRnJvbTogPT9VVEYtOD9xPz1DMz04MT1DMz1BOT1DMz1BRD0yMD1DMz1CMz1DMz1CQT89IiBvdXQtdTIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIChVL1UpJyAnCisJIyBXZSB3YW50IHRoZSByZXN1bHQgb2YgcmViYXNlIGluIFVURi04CisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIFVURi04ICYmCisKKwkjIFRoZSB0ZXN0IGlzIGFib3V0IGxvZ291dHB1dGVuY29kaW5nIG5vdCBhZmZlY3RpbmcgdGhlCisJIyBmaW5hbCBvdXRjb21lIC0tIGl0IGlzIHVzZWQgaW50ZXJuYWxseSB0byBnZW5lcmF0ZSB0aGUKKwkjIHBhdGNoIGFuZCB0aGUgbG9nLgorCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIFVURi04ICYmCisKKwkjIFRoZSByZXN1bHQgd2lsbCBiZSBjb21taXR0ZWQgYnkgR0lUX0NPTU1JVFRFUl9OQU1FIC0tCisJIyB3ZSB3YW50IFVURi04IGVuY29kZWQgbmFtZS4KKwkuIC4uL3QzOTAxLXV0ZjgudHh0ICYmCisJZ2l0IGNoZWNrb3V0IC1iIHRlc3QgJiYKKwlnaXQtcmViYXNlIG1hc3RlciAmJgorCisJY2hlY2tfZW5jb2RpbmcgMgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgKFUvTCknICcKKwlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAoTC9MKScgJworCSMgSW4gdGhpcyB0ZXN0IHdlIHdhbnQgSVNPLTg4NTktMSBlbmNvZGVkIGNvbW1pdHMgYXMgdGhlIHJlc3VsdAorCWdpdC1jb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyIDg4NTkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIChML1UpJyAnCisJIyBUaGlzIGlzIHBhdGhvbG9naWNhbCAtLSB1c2UgVVRGLTggYXMgaW50ZXJtZWRpYXRlIGZvcm0KKwkjIHRvIGdldCBJU08tODg1OS0xIHJlc3VsdHMuCisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgVVRGLTggJiYKKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyIDg4NTkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5LXBpY2soVS9VKScgJworCSMgQm90aCB0aGUgY29tbWl0ZW5jb2RpbmcgYW5kIGxvZ291dHB1dGVuY29kaW5nIGlzIHNldCB0byBVVEYtOC4KKworCWdpdC1jb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBVVEYtOCAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBVVEYtOCAmJgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGVeICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGUgJiYKKwlFRElUT1I9OiBWSVNVQUw9OiBnaXQgcmV2ZXJ0IEhFQUQgJiYKKworCWNoZWNrX2VuY29kaW5nIDMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5LXBpY2soTC9MKScgJworCSMgQm90aCB0aGUgY29tbWl0ZW5jb2RpbmcgYW5kIGxvZ291dHB1dGVuY29kaW5nIGlzIHNldCB0byBJU08tODg1OS0xCisKKwlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJLiAuLi90MzkwMS04ODU5LTEudHh0ICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIG1hc3RlciAmJgorCWdpdCBjaGVycnktcGljayBzaWRlXiAmJgorCWdpdCBjaGVycnktcGljayBzaWRlICYmCisJRURJVE9SPTogVklTVUFMPTogZ2l0IHJldmVydCBIRUFEICYmCisKKwljaGVja19lbmNvZGluZyAzIDg4NTkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5LXBpY2soVS9MKScgJworCSMgQ29tbWl0ZW5jb2RpbmcgaXMgc2V0IHRvIFVURi04IGJ1dCBsb2dvdXRwdXRlbmNvZGluZyBpcyBJU08tODg1OS0xCisKKwlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGVeICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGUgJiYKKwlFRElUT1I9OiBWSVNVQUw9OiBnaXQgcmV2ZXJ0IEhFQUQgJiYKKworCWNoZWNrX2VuY29kaW5nIDMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5LXBpY2soTC9VKScgJworCSMgQWdhaW4sIHRoZSBjb21taXRlbmNvZGluZyBpcyBzZXQgdG8gSVNPLTg4NTktMSBidXQKKwkjIGxvZ291dHB1dGVuY29kaW5nIGlzIHNldCB0byBVVEYtOC4KKworCWdpdC1jb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIFVURi04ICYmCisJLiAuLi90MzkwMS04ODU5LTEudHh0ICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIG1hc3RlciAmJgorCWdpdCBjaGVycnktcGljayBzaWRlXiAmJgorCWdpdCBjaGVycnktcGljayBzaWRlICYmCisJRURJVE9SPTogVklTVUFMPTogZ2l0IHJldmVydCBIRUFEICYmCisKKwljaGVja19lbmNvZGluZyAzIDg4NTkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIC0tbWVyZ2UgKFUvVSknICcKKwlnaXQtY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgVVRGLTggJiYKKwkuIC4uL3QzOTAxLXV0ZjgudHh0ICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQtcmViYXNlIC0tbWVyZ2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAtLW1lcmdlIChVL0wpJyAnCisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIFVURi04ICYmCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwkuIC4uL3QzOTAxLXV0ZjgudHh0ICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQtcmViYXNlIC0tbWVyZ2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAtLW1lcmdlIChML0wpJyAnCisJIyBJbiB0aGlzIHRlc3Qgd2Ugd2FudCBJU08tODg1OS0xIGVuY29kZWQgY29tbWl0cyBhcyB0aGUgcmVzdWx0CisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCS4gLi4vdDM5MDEtODg1OS0xLnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBzaWRlICYmCisJZ2l0LXJlYmFzZSAtLW1lcmdlIG1hc3RlciAmJgorCisJY2hlY2tfZW5jb2RpbmcgMiA4ODU5CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAtLW1lcmdlIChML1UpJyAnCisJIyBUaGlzIGlzIHBhdGhvbG9naWNhbCAtLSB1c2UgVVRGLTggYXMgaW50ZXJtZWRpYXRlIGZvcm0KKwkjIHRvIGdldCBJU08tODg1OS0xIHJlc3VsdHMuCisJZ2l0LWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgVVRGLTggJiYKKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgLS1tZXJnZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIgODg1OQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM5MDEtdXRmOC50eHQgYi90L3QzOTAxLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmNTIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzOTAxLXV0ZjgudHh0CkBAIC0wLDAgKzEsNCBAQAorOiB0byBiZSBzb3VyY2VkIGluIHQzOTAxIC0tIHRoaXMgaXMgdXRmOAorR0lUX0FVVEhPUl9OQU1FPSLDgcOpw60gw7PDuiIgJiYKK0dJVF9DT01NSVRURVJfTkFNRT0kR0lUX0FVVEhPUl9OQU1FICYmCitleHBvcnQgR0lUX0FVVEhPUl9OQU1FIEdJVF9DT01NSVRURVJfTkFNRQpkaWZmIC0tZ2l0IGEvdC90NDAwMC1kaWZmLWZvcm1hdC5zaCBiL3QvdDQwMDAtZGlmZi1mb3JtYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM1OGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDAtZGlmZi1mb3JtYXQuc2gKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGJ1aWx0LWluIGRpZmYgb3V0cHV0IGVuZ2luZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK2VjaG8gPnBhdGgwICdMaW5lIDEKK0xpbmUgMgorbGluZSAzJworY2F0IHBhdGgwID5wYXRoMQorY2htb2QgK3ggcGF0aDEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VwZGF0ZS1jYWNoZSAtLWFkZCB0d28gZmlsZXMgd2l0aCBhbmQgd2l0aG91dCAreC4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMScKKworbXYgcGF0aDAgcGF0aDAtCitzZWQgLWUgJ3MvbGluZS9MaW5lLycgPHBhdGgwLSA+cGF0aDAKK2NobW9kICt4IHBhdGgwCitybSAtZiBwYXRoMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1kaWZmLWZpbGVzIC1wIGFmdGVyIGVkaXRpbmcgd29yayB0cmVlLicgXAorICAgICdnaXQtZGlmZi1maWxlcyAtcCA+Y3VycmVudCcKKworIyB0aGF0J3MgYXMgZmFyIGFzIGl0IGNvbWVzCitpZiBbICIkKGdpdCBjb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0nCisJdGVzdF9kb25lCitmaQorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL3BhdGgwIGIvcGF0aDAKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CistLS0gYS9wYXRoMAorKysrIGIvcGF0aDAKK0BAIC0xLDMgKzEsMyBAQAorIExpbmUgMQorIExpbmUgMgorLWxpbmUgMworK0xpbmUgMworZGlmZiAtLWdpdCBhL3BhdGgxIGIvcGF0aDEKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQorLS0tIGEvcGF0aDEKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLUxpbmUgMQorLUxpbmUgMgorLWxpbmUgMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtZGlmZi1maWxlcyAtcCBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDEtZGlmZi1yZW5hbWUuc2ggYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlM2MyMGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCByZW5hbWUgZGV0ZWN0aW9uIGluIGRpZmYgZW5naW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworZWNobyA+cGF0aDAgJ0xpbmUgMQorTGluZSAyCitMaW5lIDMKK0xpbmUgNAorTGluZSA1CitMaW5lIDYKK0xpbmUgNworTGluZSA4CitMaW5lIDkKK0xpbmUgMTAKK2xpbmUgMTEKK0xpbmUgMTIKK0xpbmUgMTMKK0xpbmUgMTQKK0xpbmUgMTUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VwZGF0ZS1jYWNoZSAtLWFkZCBhIGZpbGUuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0ZSB0aGF0IHRyZWUuJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYgZWNobyAkdHJlZScKKworc2VkIC1lICdzL2xpbmUvTGluZS8nIDxwYXRoMCA+cGF0aDEKK3JtIC1mIHBhdGgwCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVuYW1lZCBhbmQgZWRpdGVkIHRoZSBmaWxlLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIHBhdGgwIHBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLXAgLU0gYWZ0ZXIgcmVuYW1lIGFuZCBlZGl0aW5nLicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtcCAtTSAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvcGF0aDAgYi9wYXRoMQorcmVuYW1lIGZyb20gcGF0aDAKK3JlbmFtZSB0byBwYXRoMQorLS0tIGEvcGF0aDAKKysrKyBiL3BhdGgxCitAQCAtOCw3ICs4LDcgQEAgTGluZSA3CisgTGluZSA4CisgTGluZSA5CisgTGluZSAxMAorLWxpbmUgMTEKKytMaW5lIDExCisgTGluZSAxMgorIExpbmUgMTMKKyBMaW5lIDE0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDItZGlmZi1iYXNpYy5zaCBiL3QvdDQwMDItZGlmZi1iYXNpYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmVkYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMi1kaWZmLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjQ3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZGlmZiByYXctb3V0cHV0LgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vbGliLXJlYWQtdHJlZS1tLTN3YXkuc2gKKworY2F0ID4udGVzdC1wbGFpbi1PQSA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCBBCUFBCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgQQlBTgorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmQ1MGY2NWQzYmRhYjkxYzYzNDQ0Mjk0ZDM4ZjA4YWVmZjMyOGU0MiBBCURGCis6MTAwNjQ0IDAwMDAwMCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETQorOjEwMDY0NCAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDEwMDY0NCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgTQlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBNCU1OCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIE0JVFQKKzowNDAwMDAgMDQwMDAwIDdkNjcwZmRjZGI5OTI5ZjZjN2RhYzE5NmZmNzg2ODljZDFjNTY2YTEgNWU1ZjIyMDcyYmIzOWY2ZTEyY2Y2NjNhNTdjYjYzNGM3NmVlZmI0OSBNCVoKK0VPRgorCitjYXQgPi50ZXN0LXJlY3Vyc2l2ZS1PQSA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCBBCUFBCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgQQlBTgorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNjhhNmQ4YjkxZGExMTA0NWNmNGFhM2E1YWI5ZjJhNzgxYzcwMTI0OSBBCURGL0RGCis6MTAwNjQ0IDAwMDAwMCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETQorOjEwMDY0NCAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDEwMDY0NCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgTQlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBNCU1OCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIE0JVFQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgOGFjYjhlOTc1MGUzZjY0NGJmMzIzZmNmM2QzMzg4NDlkYjEwNmM3NyBBCVovQUEKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDg3NDk0MjYyMDg0Y2VmZWU3ZWQ0ODRkMjBjOGRjMDU4MDc5MTI3MiBBCVovQU4KKzoxMDA2NDQgMDAwMDAwIDg3OTAwN2VmYWU2MjRkMmIxMzA3MjE0YjI0YTk1NmYwYThkNjg2YTggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovREQKKzoxMDA2NDQgMDAwMDAwIDliNTQxYjIyNzVjMDZlM2E3YjEzZjI4YmFkZjUyOTRlMmFlNjNkZjQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovRE0KKzoxMDA2NDQgMDAwMDAwIGJlYjVkMzhjNTUyODNkMjgwNjg1ZWEyMWEwZTUwY2ZjYzBjYTA2NGEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovRE4KKzoxMDA2NDQgMTAwNjQ0IGQ0MWZkYTQxYjdlYzRkZTQ2YjQzY2I3ZWE0MmE0NTAwMWFlMzkzZDUgYTc5YWMzYmU5Mzc3NjM5ZTFjN2QxZWRmMWFlMWIzYTVmMGNjZDhhOSBNCVovTUQKKzoxMDA2NDQgMTAwNjQ0IDRjYTIyYmFlMjUyN2QzZDllMTY3NjQ5OGEwZmJhM2IzNTViZDEyNzggNjE0MjJiYTljMmM4NzM0MTYwNjFhODhjZDQwYTU5YTM1YjU3NjQ3NCBNCVovTU0KKzoxMDA2NDQgMTAwNjQ0IGIxNmQ3YjI1Yjg2OWYyYmViMTI0ZWZhNTM0NjdkOGExNTUwYWQ2OTQgYTVjNTQ0YzIxY2ZjYjA3ZWI4MGE0ZDg5YTViN2QxNTcwMDAyZWRmZCBNCVovTU4KK0VPRgorY2F0ID4udGVzdC1wbGFpbi1PQiA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBBCUFBCis6MTAwNjQ0IDAwMDAwMCBiY2M2OGVmOTk3MDE3NDY2ZDVjOTA5NGJjZjc2OTIyOTVmNTg4YzlhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzoxMDA2NDQgMTAwNjQ0IDE0MWMxZjE2NDIzMjhlNGJjNDZhN2Q4MDFhNzFkYTM5MmU2Njc5MWUgM2M0ZDhkZTVmYmFkMDg1NzJiYWI4ZTEwZWVmOGRiYjI2NGNmMDIzMSBNCURNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDFkNDExMjJlYmRkN2E2NDBmMjlkM2M5Y2M0ZjlkNzAwOTQzNzQ3NjIgQQlMTAorOjEwMDY0NCAwMDAwMDAgMDNmMjRjOGM0NzAwYmFiY2NmZDI4YjY1NGU3ZThlYWM0MDJhZDZjZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTUQKKzoxMDA2NDQgMTAwNjQ0IGIyNTg1MDhhZmI3Y2ViNDQ5OTgxYmQ5ZDYzZDJkM2U5NzFiZjhkMzQgMTk5ODlkNDU1OWFhZTQxN2ZlZGVlMjQwY2NmMmJhMzE1ZWE0ZGMyYiBNCU1NCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiBjNGU0YTEyMjMxYjlmYTc5YTAwNTNjYjYwNzdmY2IyMWJiNWIxMzVhIE0JVFQKKzowNDAwMDAgMDQwMDAwIDdkNjcwZmRjZGI5OTI5ZjZjN2RhYzE5NmZmNzg2ODljZDFjNTY2YTEgMWJhNTIzOTU1ZDUxNjA2ODFhZjY1Y2I3NzY0MTFmNTc0YzFlODE1NSBNCVoKK0VPRgorY2F0ID4udGVzdC1yZWN1cnNpdmUtT0IgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgQQlBQQorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MTAwNjQ0IDEwMDY0NCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgTQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxZDQxMTIyZWJkZDdhNjQwZjI5ZDNjOWNjNGY5ZDcwMDk0Mzc0NzYyIEEJTEwKKzoxMDA2NDQgMDAwMDAwIDAzZjI0YzhjNDcwMGJhYmNjZmQyOGI2NTRlN2U4ZWFjNDAyYWQ2Y2QgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiMjU4NTA4YWZiN2NlYjQ0OTk4MWJkOWQ2M2QyZDNlOTcxYmY4ZDM0IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxNTg4NTg4MWVhNjkxMTUzNTFjMDliMzgzNzFmMDM0OGEzZmI4YzY3IEEJTkEKKzoxMDA2NDQgMDAwMDAwIGE0ZTE3OWU0MjkxZTU1MzZhNWUxYzgyZTA5MTA1Mjc3MmQyYzVhOTMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU5ECis6MTAwNjQ0IDEwMDY0NCBjOGYyNTc4MWU4ZjE3OTJlM2U0MGI3NDIyNWUyMDU1MzA0MWI1MjI2IGNkYjlhOGMzZGE1NzE1MDJhYzMwMjI1ZTljMTdiZWNjYjgzODc5ODMgTQlOTQorOjEwMDY0NCAxMDA2NDQgNDBjOTU5Zjk4NGM4Yjg5YTJiMDI1MjBkMTdmMDBkNzE3ZjAyNDM5NyAyYWM1NDdhZTk2MTRhMDBkMWIyODI3NWRlNjA4MTMxZjdhMGUyNTlmIE0JU1MKKzoxMDA2NDQgMTAwNjQ0IDRhYzEzNDU4ODk5YWI5MDhlZjNiMTEyOGZhMzc4ZGFlZmM4OGQzNTYgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZjMGI5OTI4NmQwYmNlNTUxYWM0YTdiM2RmZjhiNzA2ZWRmZjM3MTUgQQlaL0FBCis6MTAwNjQ0IDAwMDAwMCA4NzkwMDdlZmFlNjI0ZDJiMTMwNzIxNGIyNGE5NTZmMGE4ZDY4NmE4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0RECis6MTAwNjQ0IDEwMDY0NCA5YjU0MWIyMjc1YzA2ZTNhN2IxM2YyOGJhZGY1Mjk0ZTJhZTYzZGY0IGQ3NzM3MWQxNTgxN2ZjYWE1N2VlZWMyN2Y3NzBjNTA1YmE5NzRlYzEgTQlaL0RNCis6MTAwNjQ0IDAwMDAwMCBkNDFmZGE0MWI3ZWM0ZGU0NmI0M2NiN2VhNDJhNDUwMDFhZTM5M2Q1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL01ECis6MTAwNjQ0IDEwMDY0NCA0Y2EyMmJhZTI1MjdkM2Q5ZTE2NzY0OThhMGZiYTNiMzU1YmQxMjc4IDY5N2FhZDc3MTVhMWU3MzA2Y2E3NjI5MGEzZGQ0MjA4ZmJhZWRkZmEgTQlaL01NCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQxMjk3OWMyMmZmZjY5YzU5Y2E5NDA5ZTdhOGZlM2VlMjVlYWVlODAgQQlaL05BCis6MTAwNjQ0IDAwMDAwMCBhMTgzOTNjNjM2Yjk4ZTliZDcyOTZiOGI0MzdlYTQ5OTJiNzI0NDBjIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL05ECis6MTAwNjQ0IDEwMDY0NCAzZmRiZTE3ZmQwMTMzMDNhMmU5ODFlMWNhMWM2Y2Q2ZTcyNzg5MDg3IDdlMDlkNmEzYTE0YmQ2MzA5MTNlOGM3NTY5M2NlYTMyMTU3YjYwNmQgTQlaL05NCitFT0YKK2NhdCA+LnRlc3QtcGxhaW4tQUIgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBjY2JhNzJhZDM4ODhhMzUyMGIzOWVmY2Y3ODBiOWVlNjQxNjc1MzVkIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgTQlBQQorOjEwMDY0NCAwMDAwMDAgN2U0MjZmYjA3OTQ3OWZkNjdmNmQ4MWY5ODRlNGVjNjQ5YTQ0YmMyNSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJQU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MDQwMDAwIDAwMDAwMCA2ZDUwZjY1ZDNiZGFiOTFjNjM0NDQyOTRkMzhmMDhhZWZmMzI4ZTQyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzYzRkOGRlNWZiYWQwODU3MmJhYjhlMTBlZWY4ZGJiMjY0Y2YwMjMxIEEJRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSBBCUROCis6MTAwNjQ0IDAwMDAwMCAxMDNkOWY4OWI1MGI5YWFkMDMwNTRiNTc5YmU1ZTdhYTY2NWYyZDU3IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlNRAorOjEwMDY0NCAxMDA2NDQgYjQzMWIyNzJkODI5ZmYzYWE0ZDFhNTA4NWY0Mzk0YWI0ZDMzMDViNiAxOTk4OWQ0NTU5YWFlNDE3ZmVkZWUyNDBjY2YyYmEzMTVlYTRkYzJiIE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGE3MTZkNThkZTRhNTcwZTAwMzhmNWMzMDdiZDhkYjM0ZGFlYTAyMWYgYmQwODRiMGMyN2M3YjZjYzM0ZjExZDZkMDUwOWEyOWJlM2NhZjk3MCBNCU1OCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIGM0ZTRhMTIyMzFiOWZhNzlhMDA1M2NiNjA3N2ZjYjIxYmI1YjEzNWEgTQlUVAorOjA0MDAwMCAwNDAwMDAgNWU1ZjIyMDcyYmIzOWY2ZTEyY2Y2NjNhNTdjYjYzNGM3NmVlZmI0OSAxYmE1MjM5NTVkNTE2MDY4MWFmNjVjYjc3NjQxMWY1NzRjMWU4MTU1IE0JWgorRU9GCitjYXQgPi50ZXN0LXJlY3Vyc2l2ZS1BQiA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGNjYmE3MmFkMzg4OGEzNTIwYjM5ZWZjZjc4MGI5ZWU2NDE2NzUzNWQgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBNCUFBCis6MTAwNjQ0IDAwMDAwMCA3ZTQyNmZiMDc5NDc5ZmQ2N2Y2ZDgxZjk4NGU0ZWM2NDlhNDRiYzI1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlBTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzoxMDA2NDQgMDAwMDAwIDY4YTZkOGI5MWRhMTEwNDVjZjRhYTNhNWFiOWYyYTc4MWM3MDEyNDkgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURGL0RGCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgQQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWFiZGUxNTA2ZGRmODA2NTcyZmY0ZDQwN2JkMDY4ODVkMGY4ZWU5IEEJRE4KKzoxMDA2NDQgMDAwMDAwIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjEwMDY0NCAxMDA2NDQgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBiZDA4NGIwYzI3YzdiNmNjMzRmMTFkNmQwNTA5YTI5YmUzY2FmOTcwIE0JTU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTU4ODU4ODFlYTY5MTE1MzUxYzA5YjM4MzcxZjAzNDhhM2ZiOGM2NyBBCU5BCis6MTAwNjQ0IDAwMDAwMCBhNGUxNzllNDI5MWU1NTM2YTVlMWM4MmUwOTEwNTI3NzJkMmM1YTkzIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlORAorOjEwMDY0NCAxMDA2NDQgYzhmMjU3ODFlOGYxNzkyZTNlNDBiNzQyMjVlMjA1NTMwNDFiNTIyNiBjZGI5YThjM2RhNTcxNTAyYWMzMDIyNWU5YzE3YmVjY2I4Mzg3OTgzIE0JTk0KKzoxMDA2NDQgMTAwNjQ0IDRjODZmOWE4NWZiYzVlNjgwNGVlMmUxN2E3OTc1MzhmYmU3ODViY2EgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MTAwNjQ0IDEwMDY0NCA4YWNiOGU5NzUwZTNmNjQ0YmYzMjNmY2YzZDMzODg0OWRiMTA2Yzc3IDZjMGI5OTI4NmQwYmNlNTUxYWM0YTdiM2RmZjhiNzA2ZWRmZjM3MTUgTQlaL0FBCis6MTAwNjQ0IDAwMDAwMCAwODc0OTQyNjIwODRjZWZlZTdlZDQ4NGQyMGM4ZGMwNTgwNzkxMjcyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0FOCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQ3NzM3MWQxNTgxN2ZjYWE1N2VlZWMyN2Y3NzBjNTA1YmE5NzRlYzEgQQlaL0RNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGJlYjVkMzhjNTUyODNkMjgwNjg1ZWEyMWEwZTUwY2ZjYzBjYTA2NGEgQQlaL0ROCis6MTAwNjQ0IDAwMDAwMCBhNzlhYzNiZTkzNzc2MzllMWM3ZDFlZGYxYWUxYjNhNWYwY2NkOGE5IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL01ECis6MTAwNjQ0IDEwMDY0NCA2MTQyMmJhOWMyYzg3MzQxNjA2MWE4OGNkNDBhNTlhMzViNTc2NDc0IDY5N2FhZDc3MTVhMWU3MzA2Y2E3NjI5MGEzZGQ0MjA4ZmJhZWRkZmEgTQlaL01NCis6MTAwNjQ0IDEwMDY0NCBhNWM1NDRjMjFjZmNiMDdlYjgwYTRkODlhNWI3ZDE1NzAwMDJlZGZkIGIxNmQ3YjI1Yjg2OWYyYmViMTI0ZWZhNTM0NjdkOGExNTUwYWQ2OTQgTQlaL01OCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQxMjk3OWMyMmZmZjY5YzU5Y2E5NDA5ZTdhOGZlM2VlMjVlYWVlODAgQQlaL05BCis6MTAwNjQ0IDAwMDAwMCBhMTgzOTNjNjM2Yjk4ZTliZDcyOTZiOGI0MzdlYTQ5OTJiNzI0NDBjIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL05ECis6MTAwNjQ0IDEwMDY0NCAzZmRiZTE3ZmQwMTMzMDNhMmU5ODFlMWNhMWM2Y2Q2ZTcyNzg5MDg3IDdlMDlkNmEzYTE0YmQ2MzA5MTNlOGM3NTY5M2NlYTMyMTU3YjYwNmQgTQlaL05NCitFT0YKKworeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworeDQwPSIkeDQwJHg0MCR4NDAkeDQwJHg0MCR4NDAkeDQwJHg0MCIKK3o0MD0nMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKK2NtcF9kaWZmX2ZpbGVzX291dHB1dCAoKSB7CisgICAgIyBkaWZmLWZpbGVzIG5ldmVyIHJlcG9ydHMgYWRkaXRpb25zLiAgQWxzbyBpdCBkb2VzIG5vdCBmaWxsIGluIHRoZQorICAgICMgb2JqZWN0IElEIGZvciB0aGUgY2hhbmdlZCBmaWxlcyBiZWNhdXNlIGl0IHdhbnRzIHlvdSB0byBsb29rIGF0IHRoZQorICAgICMgZmlsZXN5c3RlbS4KKyAgICBzZWQgPCIkMiIgPi50ZXN0LXRtcCBcCisJLWUgJy9eOjAwMDAwMCAvZDtzLyckeDQwJ1woIFtNQ1JORFVdWzAtOV0qXCkJLyckejQwJ1wxCS8nICYmCisgICAgZGlmZiAiJDEiIC50ZXN0LXRtcAorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX08gJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1PQScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9PICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9BJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX08gJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9PICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9CJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX0EgJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1BQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1jYWNoZSBPIHdpdGggQSBpbiBjYWNoZScgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlX0EgJiYKKyAgICAgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWVfTyA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWNhY2hlIE8gd2l0aCBCIGluIGNhY2hlJyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZV9PID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtY2FjaGUgQSB3aXRoIEIgaW4gY2FjaGUnIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1maWxlcyB3aXRoIE8gaW4gY2FjaGUgYW5kIEEgY2hlY2tlZCBvdXQnIFwKKyAgICAncm0gLWZyIFogW0EtWl1bQS1aXSAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlX0EgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAkdHJlZV9PIHx8IHJldHVybiAxCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwgOyMgdGhpcyBjYW4gZXhpdCBub24temVybworICAgICBnaXQtZGlmZi1maWxlcyA+LnRlc3QtYSAmJgorICAgICBjbXBfZGlmZl9maWxlc19vdXRwdXQgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWZpbGVzIHdpdGggTyBpbiBjYWNoZSBhbmQgQiBjaGVja2VkIG91dCcgXAorICAgICdybSAtZnIgWiBbQS1aXVtBLVpdICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0ICR0cmVlX08gfHwgcmV0dXJuIDEKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbCA7IyB0aGlzIGNhbiBleGl0IG5vbi16ZXJvCisgICAgIGdpdC1kaWZmLWZpbGVzID4udGVzdC1hICYmCisgICAgIGNtcF9kaWZmX2ZpbGVzX291dHB1dCAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtZmlsZXMgd2l0aCBBIGluIGNhY2hlIGFuZCBCIGNoZWNrZWQgb3V0JyBcCisgICAgJ3JtIC1mciBaIFtBLVpdW0EtWl0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtYSAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgJHRyZWVfQSB8fCByZXR1cm4gMQorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsIDsjIHRoaXMgY2FuIGV4aXQgbm9uLXplcm8KKyAgICAgZ2l0LWRpZmYtZmlsZXMgPi50ZXN0LWEgJiYKKyAgICAgY21wX2RpZmZfZmlsZXNfb3V0cHV0IC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdyB3ZSBoYXZlIGVzdGFibGlzaGVkIHRoZSBiYXNlbGluZSwgd2UgZG8gbm90IGhhdmUgdG8KKyMgcmVseSBvbiBpbmRpdmlkdWFsIG9iamVjdCBJRCB2YWx1ZXMgdGhhdCBtdWNoLgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIE8gQSA9PSBkaWZmLXRyZWUgLVIgQSBPJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtUiAkdHJlZV9BICR0cmVlX08gPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIC1yIE8gQSA9PSBkaWZmLXRyZWUgLXIgLVIgQSBPJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtciAtUiAkdHJlZV9BICR0cmVlX08gPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIEIgQSA9PSBkaWZmLXRyZWUgLVIgQSBCJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgJHRyZWVfQiAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtUiAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIC1yIEIgQSA9PSBkaWZmLXRyZWUgLXIgLVIgQSBCJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfQiAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtciAtUiAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDMtZGlmZi1yZW5hbWUtMS5zaCBiL3QvdDQwMDMtZGlmZi1yZW5hbWUtMS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzUxOTcwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMy1kaWZmLXJlbmFtZS0xLnNoCkBAIC0wLDAgKzEsMTI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J01vcmUgcmVuYW1lIGRldGVjdGlvbgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGVjaG8gZnJvdHogPnJlenJvdiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQ09QWUlORyByZXpyb3YgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ3NlZCAtZSAncy9IT1dFVkVSL0hvd2V2ZXIvJyA8Q09QWUlORyA+Q09QWUlORy4xICYmCisgICAgc2VkIC1lICdzL0dQTC9HLlAuTC9nJyA8Q09QWUlORyA+Q09QWUlORy4yICYmCisgICAgcm0gLWYgQ09QWUlORyAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLj8nCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HLjEgYW5kIENPUFlJTkcuMiwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFNvIHdlIHNheSB5b3UKKyMgY29weS1hbmQtZWRpdCBvbmUsIGFuZCByZW5hbWUtYW5kLWVkaXQgdGhlIG90aGVyLiAgV2UgZG8gbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3YuCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcuMQorY29weSBmcm9tIENPUFlJTkcKK2NvcHkgdG8gQ09QWUlORy4xCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjEKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIb3dldmVyLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORy4yCityZW5hbWUgZnJvbSBDT1BZSU5HCityZW5hbWUgdG8gQ09QWUlORy4yCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjIKK0BAIC0yICsyIEBACistIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorKyBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgRy5QLkwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEcuUC5MdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitAQCAtMTIgKzEyIEBACistCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKysJVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHLlAuTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgYWdhaW4nIFwKKyAgICAnbXYgQ09QWUlORy4yIENPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMSBDT1BZSU5HLjInCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBTbyB3ZSBzYXkgeW91CisjIGVkaXRlZCBvbmUsIGFuZCBjb3B5LWFuZC1lZGl0IHRoZSBvdGhlci4gIFdlIGRvIG5vdCBzYXkKKyMgYW55dGhpbmcgYWJvdXQgcmV6cm92LgorCitHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIGdpdC1kaWZmLWluZGV4IC1DIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HCitAQCAtMiArMiBAQAorLSBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgR1BMIGFzIGZhciBhcyB0aGlzIHByb2plY3QKKysgTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEcuUC5MIGFzIGZhciBhcyB0aGlzIHByb2plY3QKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHLlAuTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorQEAgLTEyICsxMiBAQAorLQlUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisrCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgRy5QLkwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjEKK2NvcHkgZnJvbSBDT1BZSU5HCitjb3B5IHRvIENPUFlJTkcuMQorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4xCitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgb25jZSBhZ2FpbicgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBidXQgQ09QWUlORyBpcyBub3QgZWRpdGVkLiAgV2Ugc2F5IHlvdSBjb3B5LWFuZC1lZGl0IENPUFlJTkcuMTsgdGhpcworIyBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgLUMgbW9kZSBub3cgcmVwb3J0cyB0aGUgdW5tb2RpZmllZCBmaWxlIHRvCisjIHRoZSBkaWZmLWNvcmUuICBVbmNoYW5nZWQgcmV6cm92LCBhbHRob3VnaCBiZWluZyBmZWQgdG8KKyMgZ2l0LWRpZmYtaW5kZXggYXMgd2VsbCwgc2hvdWxkIG5vdCBiZSBtZW50aW9uZWQuCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgXAorICAgIGdpdC1kaWZmLWluZGV4IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjEKK2NvcHkgZnJvbSBDT1BZSU5HCitjb3B5IHRvIENPUFlJTkcuMQorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4xCitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDQtZGlmZi1yZW5hbWUtc3ltbGluay5zaCBiL3QvdDQwMDQtZGlmZi1yZW5hbWUtc3ltbGluay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjNhYWEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwNC1kaWZmLXJlbmFtZS1zeW1saW5rLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nTW9yZSByZW5hbWUgZGV0ZWN0aW9uIHRlc3RzLgorCitUaGUgcmVuYW1lIGRldGVjdGlvbiBsb2dpYyBzaG91bGQgYmUgYWJsZSB0byBkZXRlY3QgcHVyZSByZW5hbWUgb3IKK2NvcHkgb2Ygc3ltYm9saWMgbGlua3MsIGJ1dCBzaG91bGQgbm90IHByb2R1Y2UgcmVuYW1lL2NvcHkgZm9sbG93ZWQKK2J5IGFuIGVkaXQgZm9yIHRoZW0uCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyB4eXp6eSB8IHRyIC1kICdcXFxcJzAxMiA+eW9taW4gJiYKKyAgICAgbG4gLXMgeHl6enkgZnJvdHogJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6IHlvbWluICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdtdiBmcm90eiByZXpyb3YgJiYKKyAgICAgcm0gLWYgeW9taW4gJiYKKyAgICAgbG4gLXMgeHl6enkgbml0Zm9sICYmCisgICAgIGxuIC1zIHh6enp5IGJvemJhciAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZnJvdHogcmV6cm92IG5pdGZvbCBib3piYXIgeW9taW4nCisKKyMgdHJlZSBoYXMgZnJvdHogcG9pbnRpbmcgYXQgeHl6enksIGFuZCB5b21pbiB0aGF0IGNvbnRhaW5zIHh5enp5IHRvCisjIGNvbmZ1c2UgdGhpbmdzLiAgd29yayB0cmVlIGhhcyByZXpyb3YgKHh5enp5KSBuaXRmb2wgKHh5enp5KSBhbmQKKyMgYm96YmFyICh4enp6eSkuCisjIHJlenJvdiBhbmQgbml0Zm9sIGFyZSByZW5hbWUvY29weSBvZiBmcm90eiBhbmQgYm96YmFyIHNob3VsZCBiZQorIyBhIG5ldyBjcmVhdGlvbi4KKworR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9ib3piYXIgYi9ib3piYXIKK25ldyBmaWxlIG1vZGUgMTIwMDAwCistLS0gL2Rldi9udWxsCisrKysgYi9ib3piYXIKK0BAIC0wLDAgKzEgQEAKKyt4enp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9uaXRmb2wKK3NpbWlsYXJpdHkgaW5kZXggMTAwJQorY29weSBmcm9tIGZyb3R6Citjb3B5IHRvIG5pdGZvbAorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvcmV6cm92CitzaW1pbGFyaXR5IGluZGV4IDEwMCUKK3JlbmFtZSBmcm9tIGZyb3R6CityZW5hbWUgdG8gcmV6cm92CitkaWZmIC0tZ2l0IGEveW9taW4gYi95b21pbgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CistLS0gYS95b21pbgorKysrIC9kZXYvbnVsbAorQEAgLTEgKzAsMCBAQAorLXh5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZGlmZiBvdXRwdXQnIFwKKyAgICAnY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwNS1kaWZmLXJlbmFtZS0yLnNoIGIvdC90NDAwNS1kaWZmLXJlbmFtZS0yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4NGZkMjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA1LWRpZmYtcmVuYW1lLTIuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdTYW1lIHJlbmFtZSBkZXRlY3Rpb24gYXMgdDQwMDMgYnV0IHRlc3RpbmcgZGlmZi1yYXcuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDT1BZSU5HIHJlenJvdiAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnc2VkIC1lICdzL0hPV0VWRVIvSG93ZXZlci8nIDxDT1BZSU5HID5DT1BZSU5HLjEgJiYKKyAgICBzZWQgLWUgJ3MvR1BML0cuUC5ML2cnIDxDT1BZSU5HID5DT1BZSU5HLjIgJiYKKyAgICBybSAtZiBDT1BZSU5HICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuPycKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcuMSBhbmQgQ09QWUlORy4yLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBhbmQgQ09QWUlORy4yIGFyZSBiYXNlZCBvbiBDT1BZSU5HLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZyBhYm91dAorIyByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC1NICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQJQ09QWUlORwlDT1BZSU5HLjEKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDZjNjc5NjFiYmFlZDM0YTEyN2Y3NmQyNjFmNGMwYmY3M2VkYTQ3MSBSMTIzNAlDT1BZSU5HCUNPUFlJTkcuMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIGFnYWluJyBcCisgICAgJ212IENPUFlJTkcuMiBDT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEgQ09QWUlORy4yJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBpcyBiYXNlZCBvbiBDT1BZSU5HIGFuZCBDT1BZSU5HIGlzIHN0aWxsIHRoZXJlLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZworIyBhYm91dCByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC1DICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNmM2Nzk2MWJiYWVkMzRhMTI3Zjc2ZDI2MWY0YzBiZjczZWRhNDcxIE0JQ09QWUlORworOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CUNPUFlJTkcJQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgdGhlIHNhbWUgQ09QWUlORyBhbmQKKyMgY29weS1lZGl0ZWQgQ09QWUlORy4xLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNob3VsZCBub3Qgc2F5CisjIGFueXRoaW5nIGFib3V0IHJlenJvdiBub3IgQ09QWUlORywgc2luY2UgdGhlIHJldmlzZWQgYWdhaW4gZGlmZi1yYXcKKyMgbm93cyBob3cgdG8gc2F5IENvcHkuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBvbmNlIGFnYWluJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEnCisKK2dpdC1kaWZmLWluZGV4IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CUNPUFlJTkcJQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA2LWRpZmYtbW9kZS5zaCBiL3QvdDQwMDYtZGlmZi1tb2RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3MmM2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA2LWRpZmYtbW9kZS5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbW9kZSBjaGFuZ2UgZGlmZnMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitpZiBbICIkKGdpdCBjb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0sIHVzaW5nIHVwZGF0ZS1pbmRleCAtLWNobW9kPSt4JworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPSt4JyBcCisJICAgICdnaXQtdXBkYXRlLWluZGV4IHJlenJvdiAmJgorCSAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPSt4IHJlenJvdiAmJgorCSAgICAgZ2l0LWRpZmYtaW5kZXggJHRyZWUgPmN1cnJlbnQnCitlbHNlCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdjaG1vZCcgXAorCSAgICAnY2htb2QgK3ggcmV6cm92ICYmCisJICAgICBnaXQtdXBkYXRlLWluZGV4IHJlenJvdiAmJgorCSAgICAgZ2l0LWRpZmYtaW5kZXggJHRyZWUgPmN1cnJlbnQnCitmaQorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3NlZCAtZSAncy9cKDoxMDA2NDQgMTAwNzU1XCkgXCgnIiRfeDQwIidcKSBcMiAvXDEgWCBYIC8nIDxjdXJyZW50ID5jaGVjaworZWNobyAiOjEwMDY0NCAxMDA3NTUgWCBYIE0JcmV6cm92IiA+ZXhwZWN0ZWQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeScgXAorICAgICdnaXQgZGlmZiBleHBlY3RlZCBjaGVjaycKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDQwMDctcmVuYW1lLTMuc2ggYi90L3Q0MDA3LXJlbmFtZS0zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNmJhNjkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA3LXJlbmFtZS0zLnNoCkBAIC0wLDAgKzEsOTAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nUmVuYW1lIGludGVyYWN0aW9uIHdpdGggcGF0aHNwZWMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnbWtkaXIgcGF0aDAgcGF0aDEgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAvQ09QWUlORyAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnY3AgcGF0aDAvQ09QWUlORyBwYXRoMS9DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgcGF0aDAvQ09QWUlORyBwYXRoMS9DT1BZSU5HJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGFuZAorIyBwYXRoMSBib3RoIGhhdmUgQ09QWUlORyBhbmQgdGhlIGxhdHRlciBpcyBhIGNvcHkgb2YgcGF0aDAvQ09QWUlORy4KKyMgQ29tcGFyaW5nIHRoZSBmdWxsIHRyZWUgd2l0aCBjYWNoZSBzaG91bGQgdGVsbCB1cyBzby4KKworZ2l0LWRpZmYtaW5kZXggLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBDMTAwCXBhdGgwL0NPUFlJTkcJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGFuZAorIyBwYXRoMSBib3RoIGhhdmUgQ09QWUlORyBhbmQgdGhlIGxhdHRlciBpcyBhIGNvcHkgb2YgcGF0aDAvQ09QWUlORy4KKyMgSG93ZXZlciB3aGVuIHdlIHNheSB3ZSBjYXJlIG9ubHkgYWJvdXQgcGF0aDEsIHdlIHNob3VsZCBqdXN0IHNlZQorIyBwYXRoMS9DT1BZSU5HIHN1ZGRlbmx5IGFwcGVhcmluZyBmcm9tIG5vd2hlcmUsIG5vdCBkZXRlY3RlZCBhcworIyBhIGNvcHkgZnJvbSBwYXRoMC9DT1BZSU5HLgorCitnaXQtZGlmZi1pbmRleCAtQyAkdHJlZSBwYXRoMSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIEEJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndHdlYWsgd29yayB0cmVlJyBcCisgICAgJ3JtIC1mIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSBwYXRoMC9DT1BZSU5HJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGRvZXMKKyMgbm90IGhhdmUgQ09QWUlORyBhbnltb3JlIGFuZCBwYXRoMSBoYXMgQ09QWUlORyB3aGljaCBpcyBhIGNvcHkgb2YKKyMgcGF0aDAvQ09QWUlORy4gIFNob3dpbmcgdGhlIGZ1bGwgdHJlZSB3aXRoIGNhY2hlIHNob3VsZCB0ZWxsIHVzIGFib3V0CisjIHRoZSByZW5hbWUuCisKK2dpdC1kaWZmLWluZGV4IC1DICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgUjEwMAlwYXRoMC9DT1BZSU5HCXBhdGgxL0NPUFlJTkcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgdGhlIHJlc3VsdCAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyBJbiB0aGUgdHJlZSwgdGhlcmUgaXMgb25seSBwYXRoMC9DT1BZSU5HLiAgSW4gdGhlIGNhY2hlLCBwYXRoMCBkb2VzCisjIG5vdCBoYXZlIENPUFlJTkcgYW55bW9yZSBhbmQgcGF0aDEgaGFzIENPUFlJTkcgd2hpY2ggaXMgYSBjb3B5IG9mCisjIHBhdGgwL0NPUFlJTkcuICBXaGVuIHdlIHNheSB3ZSBjYXJlIG9ubHkgYWJvdXQgcGF0aDEsIHdlIHNob3VsZCBqdXN0CisjIHNlZSBwYXRoMS9DT1BZSU5HIGFwcGVhcmluZyBmcm9tIG5vd2hlcmUuCisKK2dpdC1kaWZmLWluZGV4IC1DICR0cmVlIHBhdGgxID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgQQlwYXRoMS9DT1BZSU5HCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSByZXN1bHQgKCM0KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwOC1kaWZmLWJyZWFrLXJld3JpdGUuc2ggYi90L3Q0MDA4LWRpZmYtYnJlYWstcmV3cml0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjNhYzFlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwOC1kaWZmLWJyZWFrLXJld3JpdGUuc2gKQEAgLTAsMCArMSwxODggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nQnJlYWsgYW5kIHRoZW4gcmVuYW1lCisKK1dlIGhhdmUgdHdvIHZlcnkgZGlmZmVyZW50IGZpbGVzLCBmaWxlMCBhbmQgZmlsZTEsIHJlZ2lzdGVyZWQgaW4gYSB0cmVlLgorCitXZSB1cGRhdGUgZmlsZTEgc28gZHJhc3RpY2FsbHkgdGhhdCBpdCBpcyBtb3JlIHNpbWlsYXIgdG8gZmlsZTAsIGFuZAordGhlbiByZW1vdmUgZmlsZTAuICBXaXRoIC1CLCBjaGFuZ2VzIHRvIGZpbGUxIHNob3VsZCBiZSBicm9rZW4gaW50bworc2VwYXJhdGUgZGVsZXRlIGFuZCBjcmVhdGUsIHJlc3VsdGluZyBpbiByZW1vdmFsIG9mIGZpbGUwLCByZW1vdmFsIG9mCitvcmlnaW5hbCBmaWxlMSBhbmQgY3JlYXRpb24gb2YgY29tcGxldGVseSByZXdyaXR0ZW4gZmlsZTEuCisKK0Z1cnRoZXIsIHdpdGggLUIgYW5kIC1NIHRvZ2V0aGVyLCB0aGVzZSB0aHJlZSBtb2RpZmljYXRpb25zIHNob3VsZAordHVybiBpbnRvIHJlbmFtZS1lZGl0IG9mIGZpbGUwIGludG8gZmlsZTEuCisKK1N0YXJ0aW5nIGZyb20gdGhlIHNhbWUgdHdvIGZpbGVzIGluIHRoZSB0cmVlLCB3ZSBzd2FwIGZpbGUwIGFuZCBmaWxlMS4KK1dpdGggLUIsIHRoaXMgc2hvdWxkIGJlIGRldGVjdGVkIGFzIHR3byBjb21wbGV0ZSByZXdyaXRlcywgcmVzdWx0aW5nIGluCitmb3VyIGNoYW5nZXMgaW4gdG90YWwuCisKK0Z1cnRoZXIsIHdpdGggLUIgYW5kIC1NIHRvZ2V0aGVyLCB0aGVzZSBzaG91bGQgdHVybiBpbnRvIHR3byByZW5hbWVzLgorJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2NhdCAuLi8uLi9SRUFETUUgPmZpbGUwICYmCisgICAgIGNhdCAuLi8uLi9DT1BZSU5HID5maWxlMSAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZTAgZmlsZTEgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAiJHRyZWUiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGZpbGUxIHdpdGggY29weS1lZGl0IG9mIGZpbGUwIGFuZCByZW1vdmUgZmlsZTAnIFwKKyAgICAnc2VkIC1lICJzL2dpdC9HSVQvIiBmaWxlMCA+ZmlsZTEgJiYKKyAgICAgcm0gLWYgZmlsZTAgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGZpbGUwIGZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAtLWNhY2hlZCAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAwMDAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMTFlMzMxNDY1YTg5YzM5NGRjMjVjNzgwZGUyMzAwNDM3NTBjMWVjOCBNMTAwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUIgYW5kIC1NJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CIC1NICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDA4YmIyZmI2NzFkZWZmNGMwM2E0ZDRhMGExMzE1ZGZmOThkNTczMmMgUjEwMAlmaWxlMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzd2FwIGZpbGUwIGFuZCBmaWxlMScgXAorICAgICdybSAtZiBmaWxlMCBmaWxlMSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtYSAmJgorICAgICBtdiBmaWxlMCB0bXAgJiYKKyAgICAgbXYgZmlsZTEgZmlsZTAgJiYKKyAgICAgbXYgdG1wIGZpbGUxICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggZmlsZTAgZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgTTEwMAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiBhbmQgLU0nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgLU0gIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBSMTAwCWZpbGUxCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgUjEwMAlmaWxlMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCM0KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtYWtlIGZpbGUwIGludG8gc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50JyBcCisgICAgJ3JtIC1mIGZpbGUwICYmCisgICAgIGxuIC1zIGZyb3R6IGZpbGUwICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggZmlsZTAgZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEyMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDY3YmU0MjFmODg4MjQ1Nzg4NTc2MjRmN2IzZGM3NWU5OWE4YTE0ODEgVAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjNSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCisjIFRoaXMgc2hvdWxkIG5vdCBtaXN0YWtlIGZpbGUwIGFzIHRoZSBjb3B5IHNvdXJjZSBvZiBuZXcgZmlsZTEKKyMgZHVlIHRvIHR5cGUgZGlmZmVyZW5jZXMuCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMjAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA2N2JlNDIxZjg4ODI0NTc4ODU3NjI0ZjdiM2RjNzVlOTlhOGExNDgxIFQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBNMTAwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAtTSAoIzYpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLU0nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLU0gIiR0cmVlIiA+Y3VycmVudCcKKworIyBUaGlzIHNob3VsZCBub3QgbWlzdGFrZSBmaWxlMCBhcyB0aGUgY29weSBzb3VyY2Ugb2YgbmV3IGZpbGUxCisjIGR1ZSB0byB0eXBlIGRpZmZlcmVuY2VzLgorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTIwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNjdiZTQyMWY4ODgyNDU3ODg1NzYyNGY3YjNkYzc1ZTk5YThhMTQ4MSBUCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgTQlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLU0gKCM3KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdmaWxlMSBlZGl0ZWQgdG8gbG9vayBsaWtlIGZpbGUwIGFuZCBmaWxlMCByZW5hbWUtZWRpdGVkIHRvIGZpbGUyJyBcCisgICAgJ3JtIC1mIGZpbGUwIGZpbGUxICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWUgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IC1hICYmCisgICAgIHNlZCAtZSAicy9naXQvR0lULyIgZmlsZTAgPmZpbGUxICYmCisgICAgIHNlZCAtZSAicy9naXQvR0VULyIgZmlsZTAgPmZpbGUyICYmCisgICAgIHJtIC1mIGZpbGUwCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZmlsZTAgZmlsZTEgZmlsZTInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDAwMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwOGJiMmZiNjcxZGVmZjRjMDNhNGQ0YTBhMTMxNWRmZjk4ZDU3MzJjIE0xMDAJZmlsZTEKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBBCWZpbGUyCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAoIzgpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUIgLU0nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgLU0gIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgMDhiYjJmYjY3MWRlZmY0YzAzYTRkNGEwYTEzMTVkZmY5OGQ1NzMyYyBDMDk1CWZpbGUwCWZpbGUxCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDU5ZjgzMmU1YzhiM2Y3ZTQ4NmJlMTVhZDBjZDNlOTViYTlhZjg5OTggUjA5NQlmaWxlMAlmaWxlMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCM5KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwOS1kaWZmLXJlbmFtZS00LnNoIGIvdC90NDAwOS1kaWZmLXJlbmFtZS00LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmMmY4YjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA5LWRpZmYtcmVuYW1lLTQuc2gKQEAgLTAsMCArMSw5NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdTYW1lIHJlbmFtZSBkZXRlY3Rpb24gYXMgdDQwMDMgYnV0IHRlc3RpbmcgZGlmZi1yYXcgLXouCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDT1BZSU5HIHJlenJvdiAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnc2VkIC1lICdzL0hPV0VWRVIvSG93ZXZlci8nIDxDT1BZSU5HID5DT1BZSU5HLjEgJiYKKyAgICBzZWQgLWUgJ3MvR1BML0cuUC5ML2cnIDxDT1BZSU5HID5DT1BZSU5HLjIgJiYKKyAgICBybSAtZiBDT1BZSU5HICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuPycKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcuMSBhbmQgQ09QWUlORy4yLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBhbmQgQ09QWUlORy4yIGFyZSBiYXNlZCBvbiBDT1BZSU5HLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZyBhYm91dAorIyByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC16IC1NICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQKK0NPUFlJTkcKK0NPUFlJTkcuMQorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNmM2Nzk2MWJiYWVkMzRhMTI3Zjc2ZDI2MWY0YzBiZjczZWRhNDcxIFIxMjM0CitDT1BZSU5HCitDT1BZSU5HLjIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3Jhd196IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIGFnYWluJyBcCisgICAgJ212IENPUFlJTkcuMiBDT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEgQ09QWUlORy4yJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBpcyBiYXNlZCBvbiBDT1BZSU5HIGFuZCBDT1BZSU5HIGlzIHN0aWxsIHRoZXJlLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZworIyBhYm91dCByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC16IC1DICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNmM2Nzk2MWJiYWVkMzRhMTI3Zjc2ZDI2MWY0YzBiZjczZWRhNDcxIE0KK0NPUFlJTkcKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAorQ09QWUlORworQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXdfeiBjdXJyZW50IGV4cGVjdGVkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyB0aGUgc2FtZSBDT1BZSU5HIGFuZAorIyBjb3B5LWVkaXRlZCBDT1BZSU5HLjEsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2hvdWxkIG5vdCBzYXkKKyMgYW55dGhpbmcgYWJvdXQgcmV6cm92IG5vciBDT1BZSU5HLCBzaW5jZSB0aGUgcmV2aXNlZCBhZ2FpbiBkaWZmLXJhdworIyBub3dzIGhvdyB0byBzYXkgQ29weS4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIG9uY2UgYWdhaW4nIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMScKKworZ2l0LWRpZmYtaW5kZXggLXogLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQKK0NPUFlJTkcKK0NPUFlJTkcuMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMzKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3X3ogY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDEwLWRpZmYtcGF0aHNwZWMuc2ggYi90L3Q0MDEwLWRpZmYtcGF0aHNwZWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWUxNTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTAtZGlmZi1wYXRoc3BlYy5zaApAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1BhdGhzcGVjIHJlc3RyaWN0aW9ucworCitQcmVwYXJlOgorICAgICAgICBmaWxlMAorICAgICAgICBwYXRoMS9maWxlMQorJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2VjaG8gZnJvdHogPmZpbGUwICYmCisgICAgIG1rZGlyIHBhdGgxICYmCisgICAgIGVjaG8gcmV6cm92ID5wYXRoMS9maWxlMSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUwIHBhdGgxL2ZpbGUxICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICIkdHJlZSIgJiYKKyAgICAgZWNobyBuaXRmb2wgPmZpbGUwICYmCisgICAgIGVjaG8geW9taW4gPnBhdGgxL2ZpbGUxICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggZmlsZTAgcGF0aDEvZmlsZTEnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBwYXRoIHNob3VsZCBzaG93IG5vdGhpbmcnIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gcGF0aCA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA3NjY0OThkOTNhNGIwNjA1N2E4ZTQ5ZDIzZjQwNjhmMTE3MGZmMzhmIDBhNDFlMTE1YWI2MWJlMDMyOGExOWIyOWYxOGNkY2I0OTMzOGQ1MTYgTQlwYXRoMS9maWxlMQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gcGF0aDEgc2hvdWxkIHNob3cgcGF0aDEvZmlsZTEnIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gcGF0aDEgPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNzY2NDk4ZDkzYTRiMDYwNTdhOGU0OWQyM2Y0MDY4ZjExNzBmZjM4ZiAwYTQxZTExNWFiNjFiZTAzMjhhMTliMjlmMThjZGNiNDkzMzhkNTE2IE0JcGF0aDEvZmlsZTEKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIHBhdGgxLyBzaG91bGQgc2hvdyBwYXRoMS9maWxlMScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBwYXRoMS8gPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNzY2NDk4ZDkzYTRiMDYwNTdhOGU0OWQyM2Y0MDY4ZjExNzBmZjM4ZiAwYTQxZTExNWFiNjFiZTAzMjhhMTliMjlmMThjZGNiNDkzMzhkNTE2IE0JZmlsZTAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIGZpbGUwIHNob3VsZCBzaG93IGZpbGUwJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIGZpbGUwID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIGZpbGUwLyBzaG91bGQgZW1pdCBub3RoaW5nLicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBmaWxlMC8gPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTEtZGlmZi1zeW1saW5rLnNoIGIvdC90NDAxMS1kaWZmLXN5bWxpbmsuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc5YTgzMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTEtZGlmZi1zeW1saW5rLnNoCkBAIC0wLDAgKzEsODUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGRpZmYgb2Ygc3ltbGlua3MuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaAorCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CituZXcgZmlsZSBtb2RlIDEyMDAwMAoraW5kZXggMDAwMDAwMC4uN2M0NjVhZgorLS0tIC9kZXYvbnVsbAorKysrIGIvZnJvdHoKK0BAIC0wLDAgKzEgQEAKKyt4eXp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgbmV3IHN5bWxpbmsnIFwKKyAgICAnbG4gLXMgeHl6enkgZnJvdHogJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4ICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICBHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIGdpdC1kaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiB1bmNoYW5nZWQgc3ltbGluaycgXAorICAgICd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCBmcm90eiAmJgorICAgIHRlc3QgLXogIiQoZ2l0LWRpZmYtaW5kZXggLS1uYW1lLW9ubHkgJHRyZWUpIicKKworY2F0ID4gZXhwZWN0ZWQgPDwgRU9GCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9mcm90egorZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCitpbmRleCA3YzQ2NWFmLi4wMDAwMDAwCistLS0gYS9mcm90egorKysrIC9kZXYvbnVsbAorQEAgLTEgKzAsMCBAQAorLXh5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiByZW1vdmVkIHN5bWxpbmsnIFwKKyAgICAncm0gZnJvdHogJiYKKyAgICBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+IGN1cnJlbnQgJiYKKyAgICBjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDwgRU9GCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9mcm90egorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIGlkZW50aWNhbCwgYnV0IG5ld2x5IGNyZWF0ZWQgc3ltbGluaycgXAorICAgICdzbGVlcCAzICYmCisgICAgbG4gLXMgeHl6enkgZnJvdHogJiYKKyAgICBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+IGN1cnJlbnQgJiYKKyAgICBjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDwgRU9GCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9mcm90egoraW5kZXggN2M0NjVhZi4uZGYxZGI1NCAxMjAwMDAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEgKzEgQEAKKy14eXp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisreXh5eXoKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIGRpZmZlcmVudCBzeW1saW5rJyBcCisgICAgJ3JtIGZyb3R6ICYmCisgICAgbG4gLXMgeXh5eXogZnJvdHogJiYKKyAgICBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+IGN1cnJlbnQgJiYKKyAgICBjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDEyLWRpZmYtYmluYXJ5LnNoIGIvdC90NDAxMi1kaWZmLWJpbmFyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjM2MDZjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMi1kaWZmLWJpbmFyeS5zaApAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0JpbmFyeSBkaWZmIGFuZCBhcHBseQorJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyZSByZXBvc2l0b3J5JyBcCisJJ2VjaG8gQUlUID5hICYmIGVjaG8gQklUID5iICYmIGVjaG8gQ0lUID5jICYmIGVjaG8gRElUID5kICYmCisJIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYSBiIGMgZCAmJgorCSBlY2hvIGdpdCA+YSAmJgorCSBjYXQgLi4vdGVzdDQwMTIucG5nID5iICYmCisJIGVjaG8gZ2l0ID5jICYmCisJIGNhdCBiIGIgPmQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorIGEgfCAgICAyICstCisgYiB8ICBCaW4KKyBjIHwgICAgMiArLQorIGQgfCAgQmluCisgNCBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgd2l0aG91dCAtLWJpbmFyeScgXAorCSdnaXQtZGlmZiB8IGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5ID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmIHdpdGggLS1iaW5hcnknIFwKKwknZ2l0LWRpZmYgLS1iaW5hcnkgfCBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKworIyBhcHBseSBuZWVkcyB0byBiZSBhYmxlIHRvIHNraXAgdGhlIGJpbmFyeSBtYXRlcmlhbCBjb3JyZWN0bHkKKyMgaW4gb3JkZXIgdG8gcmVwb3J0IHRoZSBsaW5lIG51bWJlciBvZiBhIGNvcnJ1cHQgcGF0Y2guCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBkZXRlY3RpbmcgY29ycnVwdCBwYXRjaCBjb3JyZWN0bHknIFwKKwknZ2l0LWRpZmYgfCBzZWQgLWUgJ3MvLUNJVC94Q0lULycgPmJyb2tlbiAmJgorCSBpZiBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBicm9rZW4gMj5kZXRlY3RlZAorCSB0aGVuCisJCWVjaG8gdW5oYXBweSAtIHNob3VsZCBoYXZlIGRldGVjdGVkIGFuIGVycm9yCisJCShleGl0IDEpCisJIGVsc2UKKwkJZWNobyBoYXBweQorCSBmaSAmJgorCSBkZXRlY3RlZD1gY2F0IGRldGVjdGVkYCAmJgorCSBkZXRlY3RlZD1gZXhwciAiJGRldGVjdGVkIiA6ICJmYXRhbC4qYXQgbGluZSBcXChbMC05XSpcXClcJCJgICYmCisJIGRldGVjdGVkPWBzZWQgLW5lICIke2RldGVjdGVkfXAiIGJyb2tlbmAgJiYKKwkgdGVzdCAiJGRldGVjdGVkIiA9IHhDSVQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGRldGVjdGluZyBjb3JydXB0IHBhdGNoIGNvcnJlY3RseScgXAorCSdnaXQtZGlmZiAtLWJpbmFyeSB8IHNlZCAtZSAncy8tQ0lUL3hDSVQvJyA+YnJva2VuICYmCisJIGlmIGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IGJyb2tlbiAyPmRldGVjdGVkCisJIHRoZW4KKwkJZWNobyB1bmhhcHB5IC0gc2hvdWxkIGhhdmUgZGV0ZWN0ZWQgYW4gZXJyb3IKKwkJKGV4aXQgMSkKKwkgZWxzZQorCQllY2hvIGhhcHB5CisJIGZpICYmCisJIGRldGVjdGVkPWBjYXQgZGV0ZWN0ZWRgICYmCisJIGRldGVjdGVkPWBleHByICIkZGV0ZWN0ZWQiIDogImZhdGFsLiphdCBsaW5lIFxcKFswLTldKlxcKVwkImAgJiYKKwkgZGV0ZWN0ZWQ9YHNlZCAtbmUgIiR7ZGV0ZWN0ZWR9cCIgYnJva2VuYCAmJgorCSB0ZXN0ICIkZGV0ZWN0ZWQiID0geENJVCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbCBjb21taXQnICdnaXQtY29tbWl0IC1hIC1tIGluaXRpYWwnCisKKyMgVHJ5IHJlbW92YWwgKGIpLCBtb2RpZmljYXRpb24gKGQpLCBhbmQgY3JlYXRpb24gKGUpLgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZi1pbmRleCB3aXRoIC0tYmluYXJ5JyBcCisJJ2VjaG8gQUlUID5hICYmIG12IGIgZSAmJiBlY2hvIENJVCA+YyAmJiBjYXQgZSA+ZCAmJgorCSBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGEgYiBjIGQgZSAmJgorCSB0cmVlMD1gZ2l0LXdyaXRlLXRyZWVgICYmCisJIGdpdC1kaWZmIC0tY2FjaGVkIC0tYmluYXJ5ID5jdXJyZW50ICYmCisJIGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBwYXRjaCcgXAorCSdnaXQtcmVzZXQgLS1oYXJkICYmCisJIGdpdC1hcHBseSAtLWJpbmFyeSAtLWluZGV4IDxjdXJyZW50ICYmCisJIHRyZWUxPWBnaXQtd3JpdGUtdHJlZWAgJiYKKwkgdGVzdCAiJHRyZWUxIiA9ICIkdHJlZTAiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTMtZGlmZi12YXJpb3VzLnNoIGIvdC90NDAxMy1kaWZmLXZhcmlvdXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU3ZDY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMtZGlmZi12YXJpb3VzLnNoCkBAIC0wLDAgKzEsMjU5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1ZhcmlvdXMgZGlmZiBmb3JtYXR0aW5nIG9wdGlvbnMnCisKKy4gLi90ZXN0LWxpYi5zaAorCitMRj0nCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAwOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMDowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJbWtkaXIgZGlyICYmCisJbWtkaXIgZGlyMiAmJgorCWZvciBpIGluIDEgMiAzOyBkbyBlY2hvICRpOyBkb25lID5maWxlMCAmJgorCWZvciBpIGluIEEgQjsgZG8gZWNobyAkaTsgZG9uZSA+ZGlyL3N1YiAmJgorCWNhdCBmaWxlMCA+ZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUwIGZpbGUyIGRpci9zdWIgJiYKKwlnaXQgY29tbWl0IC1tIEluaXRpYWwgJiYKKworCWdpdCBicmFuY2ggaW5pdGlhbCAmJgorCWdpdCBicmFuY2ggc2lkZSAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAxOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMTowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZm9yIGkgaW4gNCA1IDY7IGRvIGVjaG8gJGk7IGRvbmUgPj5maWxlMCAmJgorCWZvciBpIGluIEMgRDsgZG8gZWNobyAkaTsgZG9uZSA+PmRpci9zdWIgJiYKKwlybSAtZiBmaWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZmlsZTAgZmlsZTIgZGlyL3N1YiAmJgorCWdpdCBjb21taXQgLW0gIlNlY29uZCR7TEZ9JHtMRn1UaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LiIgJiYKKworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowMjowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDI6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCWZvciBpIGluIEEgQiBDOyBkbyBlY2hvICRpOyBkb25lID5maWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwlmb3IgaSBpbiBFIEY7IGRvIGVjaG8gJGk7IGRvbmUgPj5kaXIvc3ViICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBkaXIvc3ViICYmCisJZ2l0IGNvbW1pdCAtbSBUaGlyZCAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAzOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMzowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlmb3IgaSBpbiBBIEIgQzsgZG8gZWNobyAkaTsgZG9uZSA+PmZpbGUwICYmCisJZm9yIGkgaW4gMSAyOyBkbyBlY2hvICRpOyBkb25lID4+ZGlyL3N1YiAmJgorCWNhdCBkaXIvc3ViID5maWxlMyAmJgorCWdpdCBhZGQgZmlsZTMgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUwIGRpci9zdWIgJiYKKwlnaXQgY29tbWl0IC1tIFNpZGUgJiYKKworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowNDowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDQ6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgcHVsbCAtcyBvdXJzIC4gc2lkZSAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjA1OjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowNTowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZm9yIGkgaW4gQSBCIEM7IGRvIGVjaG8gJGk7IGRvbmUgPj5maWxlMCAmJgorCWZvciBpIGluIDEgMjsgZG8gZWNobyAkaTsgZG9uZSA+PmRpci9zdWIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUwIGRpci9zdWIgJiYKKworCWdpdCBjb25maWcgbG9nLnNob3dyb290IGZhbHNlICYmCisJZ2l0IGNvbW1pdCAtLWFtZW5kICYmCisJZ2l0IHNob3ctYnJhbmNoCisnCisKKzogPDxcRU9GCishIFtpbml0aWFsXSBJbml0aWFsCisgKiBbbWFzdGVyXSBNZXJnZSBicmFuY2ggJ3NpZGUnCisgICEgW3NpZGVdIFNpZGUKKy0tLQorIC0gIFttYXN0ZXJdIE1lcmdlIGJyYW5jaCAnc2lkZScKKyAqKyBbc2lkZV0gU2lkZQorICogIFttYXN0ZXJeXSBTZWNvbmQKKysqKyBbaW5pdGlhbF0gSW5pdGlhbAorRU9GCisKK1Y9YGdpdCB2ZXJzaW9uIHwgc2VkIC1lICdzL15naXQgdmVyc2lvbiAvLycgLWUgJ3MvXC4vXFwuL2cnYAord2hpbGUgcmVhZCBjbWQKK2RvCisJY2FzZSAiJGNtZCIgaW4KKwknJyB8ICcjJyopIGNvbnRpbnVlIDs7CisJZXNhYworCXRlc3Q9YGVjaG8gIiRjbWQiIHwgc2VkIC1lICdzfFsvIF1bLyBdKnxffGcnYAorCWNudD1gZXhwciAkdGVzdF9jb3VudCArIDFgCisJcGZ4PWBwcmludGYgIiUwNGQiICRjbnRgCisJZXhwZWN0PSIuLi90NDAxMy9kaWZmLiR0ZXN0IgorCWFjdHVhbD0iJHBmeC1kaWZmLiR0ZXN0IgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ2l0ICRjbWQiICcKKwkJeworCQkJZWNobyAiXCQgZ2l0ICRjbWQiCisJCQlnaXQgJGNtZCB8CisJCQlzZWQgLWUgInMvXlxcKC0qXFwpJFZcXCgtKlxcKVwkL1xcMWctaS10LS12LWUtci1zLWktby1uXDIvIiBcCisJCQkgICAgLWUgInMvXlxcKC4qbWl4ZWQ7IGJvdW5kYXJ5PVwiLSpcXCkkVlxcKC0qXFwpXCJcJC9cXDFnLWktdC0tdi1lLXItcy1pLW8tblwyXCIvIgorCQkJZWNobyAiXCQiCisJCX0gPiIkYWN0dWFsIiAmJgorCQlpZiB0ZXN0IC1mICIkZXhwZWN0IgorCQl0aGVuCisJCQlnaXQgZGlmZiAiJGV4cGVjdCIgIiRhY3R1YWwiICYmCisJCQlybSAtZiAiJGFjdHVhbCIKKwkJZWxzZQorCQkJIyB0aGlzIGlzIHRvIGhlbHAgZGV2ZWxvcGluZyBuZXcgdGVzdHMuCisJCQljcCAiJGFjdHVhbCIgIiRleHBlY3QiCisJCQlmYWxzZQorCQlmaQorCScKK2RvbmUgPDxcRU9GCitkaWZmLXRyZWUgaW5pdGlhbAorZGlmZi10cmVlIC1yIGluaXRpYWwKK2RpZmYtdHJlZSAtciAtLWFiYnJldiBpbml0aWFsCitkaWZmLXRyZWUgLXIgLS1hYmJyZXY9NCBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLS1hYmJyZXYgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtciBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC1yIC0tYWJicmV2IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXY9NCBpbml0aWFsCitkaWZmLXRyZWUgLXAgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorCitkaWZmLXRyZWUgLS1wcmV0dHkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLXAgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1zdW1tYXJ5IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXN0YXQgLS1zdW1tYXJ5IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLXAgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXN0YXQgaW5pdGlhbAorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdW1tYXJ5IGluaXRpYWwKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3VtbWFyeSAtciBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCAtLXN1bW1hcnkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKworZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC1wIGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcm9vdCAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorCitkaWZmLXRyZWUgLS1wcmV0dHkgc2lkZQorZGlmZi10cmVlIC0tcHJldHR5IC1wIHNpZGUKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXBhdGNoLXdpdGgtc3RhdCBzaWRlCisKK2RpZmYtdHJlZSBtYXN0ZXIKK2RpZmYtdHJlZSAtcCBtYXN0ZXIKK2RpZmYtdHJlZSAtcCAtbSBtYXN0ZXIKK2RpZmYtdHJlZSAtYyBtYXN0ZXIKK2RpZmYtdHJlZSAtYyAtLWFiYnJldiBtYXN0ZXIKK2RpZmYtdHJlZSAtLWNjIG1hc3RlcgorIyBzdGF0IG9ubHkgc2hvdWxkIHNob3cgdGhlIGRpZmZzdGF0IHdpdGggdGhlIGZpcnN0IHBhcmVudAorZGlmZi10cmVlIC1jIC0tc3RhdCBtYXN0ZXIKK2RpZmYtdHJlZSAtLWNjIC0tc3RhdCBtYXN0ZXIKK2RpZmYtdHJlZSAtYyAtLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorZGlmZi10cmVlIC0tY2MgLS1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgc3RhdCBzdW1tYXJ5IHNob3VsZCBzaG93IHRoZSBkaWZmc3RhdCBhbmQgc3VtbWFyeSB3aXRoIHRoZSBmaXJzdCBwYXJlbnQKK2RpZmYtdHJlZSAtYyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2RpZmYtdHJlZSAtLWNjIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2RpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2RpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgdGhpcyBpcyBjb3JyZWN0CitkaWZmLXRyZWUgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgc2lkZQorCitsb2cgbWFzdGVyCitsb2cgLXAgbWFzdGVyCitsb2cgLS1yb290IG1hc3RlcgorbG9nIC0tcm9vdCAtcCBtYXN0ZXIKK2xvZyAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2xvZyAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCitsb2cgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCitsb2cgLS1yb290IC1jIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCitsb2cgLS1yb290IC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorbG9nIC1TRiBtYXN0ZXIKK2xvZyAtU0YgLXAgbWFzdGVyCisKK3doYXRjaGFuZ2VkIG1hc3Rlcgord2hhdGNoYW5nZWQgLXAgbWFzdGVyCit3aGF0Y2hhbmdlZCAtLXJvb3QgbWFzdGVyCit3aGF0Y2hhbmdlZCAtLXJvb3QgLXAgbWFzdGVyCit3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAord2hhdGNoYW5nZWQgLS1yb290IC1jIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCit3aGF0Y2hhbmdlZCAtLXJvb3QgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCit3aGF0Y2hhbmdlZCAtU0YgbWFzdGVyCit3aGF0Y2hhbmdlZCAtU0YgLXAgbWFzdGVyCisKK2xvZyAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIgLS0gZGlyLword2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyIC0tIGRpci8KK2xvZyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyIC0tIGRpci8KK3doYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIgLS0gZGlyLworCitzaG93IGluaXRpYWwKK3Nob3cgLS1yb290IGluaXRpYWwKK3Nob3cgc2lkZQorc2hvdyBtYXN0ZXIKK3Nob3cgLS1zdGF0IHNpZGUKK3Nob3cgLS1zdGF0IC0tc3VtbWFyeSBzaWRlCitzaG93IC0tcGF0Y2gtd2l0aC1zdGF0IHNpZGUKK3Nob3cgLS1wYXRjaC13aXRoLXJhdyBzaWRlCitzaG93IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBzaWRlCisKK2Zvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK2Zvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitmb3JtYXQtcGF0Y2ggLS1hdHRhY2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitmb3JtYXQtcGF0Y2ggLS1pbmxpbmUgLS1zdGRvdXQgaW5pdGlhbC4uc2lkZQorZm9ybWF0LXBhdGNoIC0taW5saW5lIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3Rlcl4KK2Zvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXIKK2Zvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCAtLXN1YmplY3QtcHJlZml4PVRFU1RDQVNFIGluaXRpYWwuLm1hc3RlcgorCitkaWZmIC0tYWJicmV2IGluaXRpYWwuLnNpZGUKK2RpZmYgLXIgaW5pdGlhbC4uc2lkZQorZGlmZiAtLXN0YXQgaW5pdGlhbC4uc2lkZQorZGlmZiAtciAtLXN0YXQgaW5pdGlhbC4uc2lkZQorZGlmZiBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwuLnNpZGUKK2RpZmYgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IC1yIGluaXRpYWwuLnNpZGUKK2RpZmYgLS1wYXRjaC13aXRoLXJhdyAtciBpbml0aWFsLi5zaWRlCitkaWZmIC0tbmFtZS1zdGF0dXMgZGlyMiBkaXIKK0VPRgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5Zjc4YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMzQgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWFkOGMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSwzOSBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2M3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMjNiOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNjIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jYyBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZlYjNiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNjJiZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSw4IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2M3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlN2YzMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1zdGF0IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWNiNGUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjX21hc3RlcgpAQCAtMCwwICsxLDMwIEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTc3YWIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDkwNWIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjhiNDUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGRlNGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3OWYxYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMzMgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcm9vdCAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWQyNDJiYTc5YWU4OWFjNjk1ZTI2YjNkNGMyN2E4ZTZmMDI4ZjllIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzMzM2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTA5MmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy1wX2luaXRpYWwKQEAgLTAsMCArMSwyOSBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC1wIGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5MjBhYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcm9vdCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhIEluaXRpYWwKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZGE3YTMzZmE3N2Q4MDY2ZDY2OTg2NDM5NDBjZTU4NjBmZTJkN2ZiMyBBCWRpcgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Yjc2YmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLXBfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC1wIGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwOTcwZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwODIzOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfc2lkZQpAQCAtMCwwICsxLDQzIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXN0YXQgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjAzYmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwzOCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDM5IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZmNlMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDE1IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCAtLXN1bW1hcnkgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDEyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfLXJfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV8tcl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGFhZmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfLXJfaW5pdGlhbApAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3VtbWFyeSAtciBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTVmNzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3VtbWFyeSBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQxMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLXBfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC1wIGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTMyZWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsMTEgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZGE3YTMzZmE3N2Q4MDY2ZDY2OTg2NDM5NDBjZTU4NjBmZTJkN2ZiMyBBCWRpcgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdGF0Xy0tc3VtbWFyeV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjk4M2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXN0YXQgLS1zdW1tYXJ5IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGNmYjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tc3RhdCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3VtbWFyeV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN1bW1hcnlfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMyYzRmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXN1bW1hcnkgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTk0MmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy1wX2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLXAgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTNhYTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy1wX3NpZGUKQEAgLTAsMCArMSwzOCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC1wIHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MTViZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X3NpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliNmUxYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfc2lkZQpAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKzowNDAwMDAgMDQwMDAwIGRhN2EzM2ZhNzdkODA2NmQ2Njk4NjQzOTQwY2U1ODYwZmUyZDdmYjMgZjk3N2VkNDZhZTY4NzNjMWMzMGFiODc4ZTE1YTRhY2NlZGMzNjE4YiBNCWRpcgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBmNDYxNWRhNjc0YzA5ZGYzMjJkNmJhOGQ2YjIxZWNmYjFiMWJhNTEwIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzI4OWUzNWJmZjMyNzI3YzA4ZGRhMjA3NTExYmVjMTM4ZmRiOWVhNSBBCWZpbGUzCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLWFiYnJldl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1hYmJyZXZfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWE4NGIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1hYmJyZXZfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLS1hYmJyZXYgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAwNDAwMDAgMDAwMDAwMC4uLiBkYTdhMzNmLi4uIEEJZGlyCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk1ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMzMgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYyYjYyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1wX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTljNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMjkgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXAgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldj00X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldj00X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1MzYxNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yXy0tYWJicmV2PTRfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXY9NCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwLi4uIDM1ZDIuLi4gQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwLi4uIDAxZTcuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMC4uLiAwMWU3Li4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yXy0tYWJicmV2X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldl9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCAtciAtLWFiYnJldiBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDM1ZDI0MmIuLi4gQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCAtciBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZjZiMDYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDA0MDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGRhN2EzM2ZhNzdkODA2NmQ2Njk4NjQzOTQwY2U1ODYwZmUyZDdmYjMgQQlkaXIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLWFiYnJldl9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tYWJicmV2X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGU0YWEyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLWFiYnJldl9tYXN0ZXIKQEAgLTAsMCArMSw1IEBACiskIGdpdCBkaWZmLXRyZWUgLWMgLS1hYmJyZXYgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0Cis6OjEwMDY0NCAxMDA2NDQgMTAwNjQ0IGNlYWQzMmUuLi4gNzI4OWUzNS4uLiA5OTI5MTNjLi4uIE1NCWRpci9zdWIKKzo6MTAwNjQ0IDEwMDY0NCAxMDA2NDQgYjQxNDEwOC4uLiBmNDYxNWRhLi4uIDEwYThhOWYuLi4gTU0JZmlsZTAKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOWY2NDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmY2NhMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlCkBAIC0wLDAgKzEsOCBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmU2YTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLWMgLS1zdGF0IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jX21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDJiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jX21hc3RlcgpAQCAtMCwwICsxLDUgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtYyBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKzo6MTAwNjQ0IDEwMDY0NCAxMDA2NDQgY2VhZDMyZTkyNWIxNDIwYzg0YzE0Y2JmN2NmNzU1ZTdlNDVhZjhhZCA3Mjg5ZTM1YmZmMzI3MjdjMDhkZGEyMDc1MTFiZWMxMzhmZGI5ZWE1IDk5MjkxM2M1YWEwYTU0NzZkMTBjNDllZDBmMjFmYzBjNmQxYWVkZjMgTU0JZGlyL3N1YgorOjoxMDA2NDQgMTAwNjQ0IDEwMDY0NCBiNDE0MTA4ZTgxZTUwOTFmZTA5NzRhMTg1OGI0ZDBkMjJiMTA3ZjcwIGY0NjE1ZGE2NzRjMDlkZjMyMmQ2YmE4ZDZiMjFlY2ZiMWIxYmE1MTAgMTBhOGE5ZjM2NTdmOTFhMTU2YjlmMDE4NGVkNzlhMjBhZGVmOWY3ZiBNTQlmaWxlMAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF8tbV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wXy1tX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBiZWEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF8tbV9tYXN0ZXIKQEAgLTAsMCArMSw4MCBAQAorJCBnaXQgZGlmZi10cmVlIC1wIC1tIG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCBjZWFkMzJlLi45OTI5MTNjIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTQsMyArNCw1IEBAIEMKKyBECisgRQorIEYKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IGI0MTQxMDguLjEwYThhOWYgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC00LDMgKzQsNiBAQAorIDQKKyA1CisgNgorK0EKKytCCisrQworNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA3Mjg5ZTM1Li45OTI5MTNjIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsNCArMSw4IEBACisgQQorIEIKKytDCisrRAorK0UKKytGCisgMQorIDIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCBmNDYxNWRhLi4xMGE4YTlmIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSw2ICsxLDkgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKKyBBCisgQgorIEMKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggNzI4OWUzNS4uMDAwMDAwMAorLS0tIGEvZmlsZTMKKysrKyAvZGV2L251bGwKK0BAIC0xLDQgKzAsMCBAQAorLUEKKy1CCistMQorLTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBjZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC1wIGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4Mjg3NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC1wIG1hc3RlcgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldj00X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2PTRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWEzYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldj00X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLXIgLS1hYmJyZXY9NCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2ODliNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfLS1hYmJyZXZfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtciAtLWFiYnJldiBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtciBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5ZmM1MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTIyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX21hc3RlcgpAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSBtYXN0ZXIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tYWJicmV2X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLWFiYnJldl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGU2NmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLWFiYnJldl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IGRpZmYgLS1hYmJyZXYgaW5pdGlhbC4uc2lkZQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1uYW1lLXN0YXR1c19kaXIyX2RpciBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tbmFtZS1zdGF0dXNfZGlyMl9kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZmRiNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tbmFtZS1zdGF0dXNfZGlyMl9kaXIKQEAgLTAsMCArMSwzIEBACiskIGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgZGlyMiBkaXIKK0EJZGlyL3N1YgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd18tcl9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd18tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTBkYzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3Xy1yX2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzNiBAQAorJCBnaXQgZGlmZiAtLXBhdGNoLXdpdGgtcmF3IC1yIGluaXRpYWwuLnNpZGUKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZDVkYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDM2IEBACiskIGdpdCBkaWZmIC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbC4uc2lkZQorOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA3Mjg5ZTM1Li4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBmNDYxNWRhLi4uIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gNzI4OWUzNS4uLiBBCWZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1zdGF0Xy1yX2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF8tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF8tcl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzcgQEAKKyQgZ2l0IGRpZmYgLS1wYXRjaC13aXRoLXN0YXQgLXIgaW5pdGlhbC4uc2lkZQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUwNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDM3IEBACiskIGdpdCBkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwuLnNpZGUKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1zdGF0X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXN0YXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTE3YjVkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1zdGF0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmIC0tc3RhdCBpbml0aWFsLi5zaWRlCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tcl8tLXN0YXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmXy1yXy0tc3RhdF9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTIyMGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl8tLXN0YXRfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYgLXIgLS1zdGF0IGluaXRpYWwuLnNpZGUKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy1yX2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjJmZTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IGRpZmYgLXIgaW5pdGlhbC4uc2lkZQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmX2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZGFmNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmX2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzMiBAQAorJCBnaXQgZGlmZiBpbml0aWFsLi5zaWRlCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjg5MWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlcgpAQCAtMCwwICsxLDE2NCBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXiBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAyNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeCkBAIC0wLDAgKzEsMTA2IEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1hdHRhY2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY4MjhlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNTkgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF8tLXN1YmplY3QtcHJlZml4PVRFU1RDQVNFX2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfLS1zdWJqZWN0LXByZWZpeD1URVNUQ0FTRV9pbml0aWFsLi5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOTNiZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfLS1zdWJqZWN0LXByZWZpeD1URVNUQ0FTRV9pbml0aWFsLi5tYXN0ZXIKQEAgLTAsMCArMSwxNjQgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCAtLXN1YmplY3QtcHJlZml4PVRFU1RDQVNFIGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtURVNUQ0FTRV0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtURVNUQ0FTRV0gVGhpcmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSI5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSI5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAzOjAwICswMDAwCitTdWJqZWN0OiBbVEVTVENBU0VdIFNpZGUKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMTBjMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCkBAIC0wLDAgKzEsMTY0IEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1pbmxpbmUgLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTllYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0taW5saW5lXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4KQEAgLTAsMCArMSwxMDYgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFlOTIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNTkgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODhjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlcgpAQCAtMCwwICsxLDEyNyBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCisKK1RoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gVGhpcmQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorLS0gCitnLWktdC0tdi1lLXItcy1pLW8tbgorCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4gYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNGI4OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpAQCAtMCwwICsxLDgxIEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCisKK1RoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gVGhpcmQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY1MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNDcgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYjhlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfCkBAIC0wLDAgKzEsNzQgQEAKKyQgZ2l0IGxvZyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyIC0tIGRpci8KK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q3Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwxMjkgQEAKKyQgZ2l0IGxvZyAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4N2EyNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KQEAgLTAsMCArMSw3NCBAQAorJCBnaXQgbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlciAtLSBkaXIvCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY0MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCBsb2cgLS1yb290IC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDUwYWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTY3IEBACiskIGdpdCBsb2cgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhjNmMwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsMTYxIEBACiskIGdpdCBsb2cgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNGUwZjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCBsb2cgLS1yb290IC1jIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNvbWJpbmVkIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jb21iaW5lZCBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3YTJlYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1wX21hc3RlcgpAQCAtMCwwICsxLDE0MiBAQAorJCBnaXQgbG9nIC0tcm9vdCAtcCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2NjZmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF9tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgbG9nIC0tcm9vdCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tU0ZfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tU0ZfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl8tcF9tYXN0ZXIKQEAgLTAsMCArMSwxOCBAQAorJCBnaXQgbG9nIC1TRiAtcCBtYXN0ZXIKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tU0ZfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tU0ZfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjJlZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl9tYXN0ZXIKQEAgLTAsMCArMSw4IEBACiskIGdpdCBsb2cgLVNGIG1hc3RlcgorY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmVmZWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy1wX21hc3RlcgpAQCAtMCwwICsxLDExNSBAQAorJCBnaXQgbG9nIC1wIG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ19tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkOWU3YgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfbWFzdGVyCkBAIC0wLDAgKzEsMzQgQEAKKyQgZ2l0IGxvZyBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXJhd19zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXJhd19zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMWI0NmEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtcmF3X3NpZGUKQEAgLTAsMCArMSw0MiBAQAorJCBnaXQgc2hvdyAtLXBhdGNoLXdpdGgtcmF3IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDcyODllMzUuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGY0NjE1ZGEuLi4gTQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiA3Mjg5ZTM1Li4uIEEJZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzdmMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSw0NCBAQAorJCBnaXQgc2hvdyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNGM1MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUKQEAgLTAsMCArMSw0MyBAQAorJCBnaXQgc2hvdyAtLXBhdGNoLXdpdGgtc3RhdCBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXJvb3RfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcm9vdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODkxMzYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXJvb3RfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBzaG93IC0tcm9vdCBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkNTk3NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF8tLXN1bW1hcnlfc2lkZQpAQCAtMCwwICsxLDEzIEBACiskIGdpdCBzaG93IC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF9zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMjMyNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF9zaWRlCkBAIC0wLDAgKzEsMTIgQEAKKyQgZ2l0IHNob3cgLS1zdGF0IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLnNob3dfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQwNjZhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfaW5pdGlhbApAQCAtMCwwICsxLDcgQEAKKyQgZ2l0IHNob3cgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd19tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuc2hvd19tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2ZTFmMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93X21hc3RlcgpAQCAtMCwwICsxLDM2IEBACiskIGdpdCBzaG93IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd19zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzBhMDczCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfc2lkZQpAQCAtMCwwICsxLDM4IEBACiskIGdpdCBzaG93IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXJfLS1fZGlyXwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ2N2NjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXJfLS1fZGlyXwpAQCAtMCwwICsxLDYxIEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyIC0tIGRpci8KK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWJiZTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsMTE2IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc4OWYxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3Rlcl8tLV9kaXJfCkBAIC0wLDAgKzEsNjEgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlciAtLSBkaXIvCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYWNmMjUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpAQCAtMCwwICsxLDE5OSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkxMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTYwIEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpAQCAtMCwwICsxLDE1NCBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjY3NjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxOTkgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCAtYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1jb21iaW5lZCBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY29tYmluZWQgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1wX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYxZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tcF9tYXN0ZXIKQEAgLTAsMCArMSwxMzUgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCAtcCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDVjYjYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290X21hc3RlcgpAQCAtMCwwICsxLDQyIEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA3Mjg5ZTM1Li4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBmNDYxNWRhLi4uIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gNzI4OWUzNS4uLiBBCWZpbGUzCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworOjEwMDY0NCAxMDA2NDQgODQyMmQ0MC4uLiBjZWFkMzJlLi4uIE0JZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiBiMWU2NzIyLi4uIEEJZmlsZTEKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDg0MjJkNDAuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGI0MTQxMDguLi4gTQlmaWxlMAorOjEwMDY0NCAwMDAwMDAgMDFlNzljMy4uLiAwMDAwMDAwLi4uIEQJZmlsZTIKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMzVkMjQyYi4uLiBBCWRpci9zdWIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDFlNzljMy4uLiBBCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGXy1wX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzlkYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl8tcF9tYXN0ZXIKQEAgLTAsMCArMSwxOCBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLVNGIC1wIG1hc3RlcgorY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGX21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTkzMjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGX21hc3RlcgpAQCAtMCwwICsxLDkgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC1TRiBtYXN0ZXIKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworOjEwMDY0NCAxMDA2NDQgODQyMmQ0MC4uLiBjZWFkMzJlLi4uIE0JZGlyL3N1YgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4ZDQzMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tcF9tYXN0ZXIKQEAgLTAsMCArMSwxMDIgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC1wIG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNiY2MyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkX21hc3RlcgpAQCAtMCwwICsxLDMyIEBACiskIGdpdCB3aGF0Y2hhbmdlZCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDcyODllMzUuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGY0NjE1ZGEuLi4gTQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiA3Mjg5ZTM1Li4uIEEJZmlsZTMKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCis6MTAwNjQ0IDEwMDY0NCA4NDIyZDQwLi4uIGNlYWQzMmUuLi4gTQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIGIxZTY3MjIuLi4gQQlmaWxlMQorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gODQyMmQ0MC4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gYjQxNDEwOC4uLiBNCWZpbGUwCis6MTAwNjQ0IDAwMDAwMCAwMWU3OWMzLi4uIDAwMDAwMDAuLi4gRAlmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxNC1mb3JtYXQtcGF0Y2guc2ggYi90L3Q0MDE0LWZvcm1hdC1wYXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjk2OWJiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxNC1mb3JtYXQtcGF0Y2guc2gKQEAgLTAsMCArMSw4OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdGb3JtYXQtcGF0Y2ggc2tpcHBpbmcgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgcGF0Y2hlcycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDkgMTA7IGRvIGVjaG8gIiRpIjsgZG9uZSA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gSW5pdGlhbCAmJgorCWdpdCBjaGVja291dCAtYiBzaWRlICYmCisKKwlmb3IgaSBpbiAxIDIgNSA2IEEgQiBDIDcgOCA5IDEwOyBkbyBlY2hvICIkaSI7IGRvbmUgPmZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIGNoYW5nZXMgIzEiICYmCisKKwlmb3IgaSBpbiBEIEUgRjsgZG8gZWNobyAiJGkiOyBkb25lID4+ZmlsZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggZmlsZSAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgY2hhbmdlcyAjMiIgJiYKKwlnaXQgdGFnIEMyICYmCisKKwlmb3IgaSBpbiA1IDYgMSAyIDMgQSA0IEIgQyA3IDggOSAxMCBEIEUgRjsgZG8gZWNobyAiJGkiOyBkb25lID5maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAiU2lkZSBjaGFuZ2VzICMzIHdpdGggXFxuIGJhY2tzbGFzaC1uIGluIGl0LiIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEMyIHwgZ2l0IGFwcGx5IC0taW5kZXggJiYKKwlnaXQgY29tbWl0IC1tICJNYXN0ZXIgYWNjZXB0cyBtb3JhbCBlcXVpdmFsZW50IG9mICMyIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZvcm1hdC1wYXRjaCAtLWlnbm9yZS1pZi1pbi11cHN0cmVhbSIgJworCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBtYXN0ZXIuLnNpZGUgPnBhdGNoMCAmJgorCWNudD1gZ3JlcCAiXkZyb20gIiBwYXRjaDAgfCB3YyAtbGAgJiYKKwl0ZXN0ICRjbnQgPSAzCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZm9ybWF0LXBhdGNoIC0taWdub3JlLWlmLWluLXVwc3RyZWFtIiAnCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IFwKKwkJLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW0gbWFzdGVyLi5zaWRlID5wYXRjaDEgJiYKKwljbnQ9YGdyZXAgIl5Gcm9tICIgcGF0Y2gxIHwgd2MgLWxgICYmCisJdGVzdCAkY250ID0gMgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZvcm1hdC1wYXRjaCByZXN1bHQgYXBwbGllcyIgJworCisJZ2l0IGNoZWNrb3V0IC1iIHJlYnVpbGQtMCBtYXN0ZXIgJiYKKwlnaXQgYW0gLTMgcGF0Y2gwICYmCisJY250PWBnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbGAgJiYKKwl0ZXN0ICRjbnQgPSAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZvcm1hdC1wYXRjaCAtLWlnbm9yZS1pZi1pbi11cHN0cmVhbSByZXN1bHQgYXBwbGllcyIgJworCisJZ2l0IGNoZWNrb3V0IC1iIHJlYnVpbGQtMSBtYXN0ZXIgJiYKKwlnaXQgYW0gLTMgcGF0Y2gxICYmCisJY250PWBnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbGAgJiYKKwl0ZXN0ICRjbnQgPSAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBkaWQgbm90IHNjcmV3IHVwIHRoZSBsb2cgbWVzc2FnZScgJworCisJZ2l0IGNhdC1maWxlIGNvbW1pdCBzaWRlIHwgZ3JlcCAiXlNpZGUgLiogd2l0aCAuKiBiYWNrc2xhc2gtbiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JtYXQtcGF0Y2ggZGlkIG5vdCBzY3JldyB1cCB0aGUgbG9nIG1lc3NhZ2UnICcKKworCWdyZXAgIl5TdWJqZWN0OiAuKlNpZGUgY2hhbmdlcyAjMyB3aXRoIC4qIGJhY2tzbGFzaC1uIiBwYXRjaDAgJiYKKwlncmVwICJeU3ViamVjdDogLipTaWRlIGNoYW5nZXMgIzMgd2l0aCAuKiBiYWNrc2xhc2gtbiIgcGF0Y2gxCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVwbGF5IGRpZCBub3Qgc2NyZXcgdXAgdGhlIGxvZyBtZXNzYWdlJyAnCisKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlYnVpbGQtMSB8IGdyZXAgIl5TaWRlIC4qIHdpdGggLiogYmFja3NsYXNoLW4iCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDE1LWRpZmYtd2hpdGVzcGFjZS5zaCBiL3QvdDQwMTUtZGlmZi13aGl0ZXNwYWNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzMGUyMDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDE1LWRpZmYtd2hpdGVzcGFjZS5zaApAQCAtMCwwICsxLDEyMCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3Qgc3BlY2lhbCB3aGl0ZXNwYWNlIGluIGRpZmYgZW5naW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworIyBSYXkgTGVodGluaWVtaSdzIGV4YW1wbGUKKworY2F0IDw8IEVPRiA+IHgKK2RvIHsKKyAgIG5vdGhpbmc7Cit9IHdoaWxlICgwKTsKK0VPRgorCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHgKKworY2F0IDw8IEVPRiA+IHgKK2RvCit7CisgICBub3RoaW5nOworfQord2hpbGUgKDApOworRU9GCisKK2NhdCA8PCBFT0YgPiBleHBlY3QKK2RpZmYgLS1naXQgYS94IGIveAoraW5kZXggYWRmMzkzNy4uNmVkYzE3MiAxMDA2NDQKKy0tLSBhL3gKKysrKyBiL3gKK0BAIC0xLDMgKzEsNSBAQAorLWRvIHsKKytkbworK3sKKyAgICBub3RoaW5nOworLX0gd2hpbGUgKDApOworK30KKyt3aGlsZSAoMCk7CitFT0YKKworZ2l0LWRpZmYgPiBvdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlJheSdzIGV4YW1wbGUgd2l0aG91dCBvcHRpb25zIiAnZ2l0IGRpZmYgZXhwZWN0IG91dCcKKworZ2l0LWRpZmYgLXcgPiBvdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlJheSdzIGV4YW1wbGUgd2l0aCAtdyIgJ2dpdCBkaWZmIGV4cGVjdCBvdXQnCisKK2dpdC1kaWZmIC1iID4gb3V0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJSYXkncyBleGFtcGxlIHdpdGggLWIiICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCit0ciAnUScgJ1wwMTUnIDw8IEVPRiA+IHgKK3doaXRlc3BhY2UgYXQgYmVnaW5uaW5nCit3aGl0ZXNwYWNlIGNoYW5nZQord2hpdGVzcGFjZSBpbiB0aGUgbWlkZGxlCit3aGl0ZXNwYWNlIGF0IGVuZAordW5jaGFuZ2VkIGxpbmUKK0NSIGF0IGVuZFEKK0VPRgorCitnaXQtdXBkYXRlLWluZGV4IHgKKworY2F0IDw8IEVPRiA+IHgKKwl3aGl0ZXNwYWNlIGF0IGJlZ2lubmluZword2hpdGVzcGFjZSAJIGNoYW5nZQord2hpdGUgc3BhY2UgaW4gdGhlIG1pZGRsZQord2hpdGVzcGFjZSBhdCBlbmQgIAordW5jaGFuZ2VkIGxpbmUKK0NSIGF0IGVuZAorRU9GCisKK3RyICdRJyAnXDAxNScgPDwgRU9GID4gZXhwZWN0CitkaWZmIC0tZ2l0IGEveCBiL3gKK2luZGV4IGQ5OWFmMjMuLjhiMzJmYjUgMTAwNjQ0CistLS0gYS94CisrKysgYi94CitAQCAtMSw2ICsxLDYgQEAKKy13aGl0ZXNwYWNlIGF0IGJlZ2lubmluZworLXdoaXRlc3BhY2UgY2hhbmdlCistd2hpdGVzcGFjZSBpbiB0aGUgbWlkZGxlCistd2hpdGVzcGFjZSBhdCBlbmQKKysJd2hpdGVzcGFjZSBhdCBiZWdpbm5pbmcKKyt3aGl0ZXNwYWNlIAkgY2hhbmdlCisrd2hpdGUgc3BhY2UgaW4gdGhlIG1pZGRsZQorK3doaXRlc3BhY2UgYXQgZW5kICAKKyB1bmNoYW5nZWQgbGluZQorLUNSIGF0IGVuZFEKKytDUiBhdCBlbmQKK0VPRgorZ2l0LWRpZmYgPiBvdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Fub3RoZXIgdGVzdCwgd2l0aG91dCBvcHRpb25zJyAnZ2l0IGRpZmYgZXhwZWN0IG91dCcKKworY2F0IDw8IEVPRiA+IGV4cGVjdAorZGlmZiAtLWdpdCBhL3ggYi94CitpbmRleCBkOTlhZjIzLi44YjMyZmI1IDEwMDY0NAorRU9GCitnaXQtZGlmZiAtdyA+IG91dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW5vdGhlciB0ZXN0LCB3aXRoIC13JyAnZ2l0IGRpZmYgZXhwZWN0IG91dCcKKwordHIgJ1EnICdcMDE1JyA8PCBFT0YgPiBleHBlY3QKK2RpZmYgLS1naXQgYS94IGIveAoraW5kZXggZDk5YWYyMy4uOGIzMmZiNSAxMDA2NDQKKy0tLSBhL3gKKysrKyBiL3gKK0BAIC0xLDYgKzEsNiBAQAorLXdoaXRlc3BhY2UgYXQgYmVnaW5uaW5nCisrCXdoaXRlc3BhY2UgYXQgYmVnaW5uaW5nCisgd2hpdGVzcGFjZSBjaGFuZ2UKKy13aGl0ZXNwYWNlIGluIHRoZSBtaWRkbGUKKyt3aGl0ZSBzcGFjZSBpbiB0aGUgbWlkZGxlCisgd2hpdGVzcGFjZSBhdCBlbmQKKyB1bmNoYW5nZWQgbGluZQorIENSIGF0IGVuZFEKK0VPRgorZ2l0LWRpZmYgLWIgPiBvdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Fub3RoZXIgdGVzdCwgd2l0aCAtYicgJ2dpdCBkaWZmIGV4cGVjdCBvdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxNi1kaWZmLXF1b3RlLnNoIGIvdC90NDAxNi1kaWZmLXF1b3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkYmRjMGMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDE2LWRpZmYtcXVvdGUuc2gKQEAgLTAsMCArMSw3MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdRdW90aW5nIHBhdGhzIGluIGRpZmYgb3V0cHV0LgorJworCisuIC4vdGVzdC1saWIuc2gKKworUDA9J3BhdGhuYW1lJworUDE9J3BhdGhuYW1lCXdpdGggSFQnCitQMj0ncGF0aG5hbWUgd2l0aCBTUCcKK1AzPSdwYXRobmFtZQord2l0aCBMRicKKzogPiIkUDEiIDI+JjEgJiYgdGVzdCAtZiAiJFAxIiAmJiBybSAtZiAiJFAxIiB8fCB7CisJZWNobyA+JjIgJ0ZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0YWJzIGluIG5hbWVzJworCXRlc3RfZG9uZQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIFAwLjAgPiIkUDAuMCIgJiYKKwllY2hvIFAwLjEgPiIkUDAuMSIgJiYKKwllY2hvIFAwLjIgPiIkUDAuMiIgJiYKKwllY2hvIFAwLjMgPiIkUDAuMyIgJiYKKwllY2hvIFAxLjAgPiIkUDEuMCIgJiYKKwllY2hvIFAxLjIgPiIkUDEuMiIgJiYKKwllY2hvIFAxLjMgPiIkUDEuMyIgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgbXYgIiRQMC4wIiAiUiRQMC4wIiAmJgorCWdpdCBtdiAiJFAwLjEiICJSJFAxLjAiICYmCisJZ2l0IG12ICIkUDAuMiIgIlIkUDIuMCIgJiYKKwlnaXQgbXYgIiRQMC4zIiAiUiRQMy4wIiAmJgorCWdpdCBtdiAiJFAxLjAiICJSJFAwLjEiICYmCisJZ2l0IG12ICIkUDEuMiIgIlIkUDIuMSIgJiYKKwlnaXQgbXYgIiRQMS4zIiAiUiRQMy4xIiAmJgorCToKKycKKworY2F0ID5leHBlY3QgPDxcRU9GCisgcmVuYW1lIHBhdGhuYW1lLjEgPT4gIlJwYXRobmFtZVx0d2l0aCBIVC4wIiAoMTAwJSkKKyByZW5hbWUgcGF0aG5hbWUuMyA9PiAiUnBhdGhuYW1lXG53aXRoIExGLjAiICgxMDAlKQorIHJlbmFtZSAicGF0aG5hbWVcdHdpdGggSFQuMyIgPT4gIlJwYXRobmFtZVxud2l0aCBMRi4xIiAoMTAwJSkKKyByZW5hbWUgcGF0aG5hbWUuMiA9PiBScGF0aG5hbWUgd2l0aCBTUC4wICgxMDAlKQorIHJlbmFtZSAicGF0aG5hbWVcdHdpdGggSFQuMiIgPT4gUnBhdGhuYW1lIHdpdGggU1AuMSAoMTAwJSkKKyByZW5hbWUgcGF0aG5hbWUuMCA9PiBScGF0aG5hbWUuMCAoMTAwJSkKKyByZW5hbWUgInBhdGhuYW1lXHR3aXRoIEhULjAiID0+IFJwYXRobmFtZS4xICgxMDAlKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZiAtLXN1bW1hcnkgLU0gSEVBRCcgJworCWdpdCBkaWZmIC0tc3VtbWFyeSAtTSBIRUFEID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2NhdCA+ZXhwZWN0IDw8XEVPRgorIHBhdGhuYW1lLjEgPT4gIlJwYXRobmFtZVx0d2l0aCBIVC4wIiAgICAgICAgICAgIHwgICAgMCAKKyBwYXRobmFtZS4zID0+ICJScGF0aG5hbWVcbndpdGggTEYuMCIgICAgICAgICAgICB8ICAgIDAgCisgInBhdGhuYW1lXHR3aXRoIEhULjMiID0+ICJScGF0aG5hbWVcbndpdGggTEYuMSIgfCAgICAwIAorIHBhdGhuYW1lLjIgPT4gUnBhdGhuYW1lIHdpdGggU1AuMCAgICAgICAgICAgICAgIHwgICAgMCAKKyAicGF0aG5hbWVcdHdpdGggSFQuMiIgPT4gUnBhdGhuYW1lIHdpdGggU1AuMSAgICB8ICAgIDAgCisgcGF0aG5hbWUuMCA9PiBScGF0aG5hbWUuMCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAwIAorICJwYXRobmFtZVx0d2l0aCBIVC4wIiA9PiBScGF0aG5hbWUuMSAgICAgICAgICAgIHwgICAgMCAKKyA3IGZpbGVzIGNoYW5nZWQsIDAgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYgLS1zdGF0IC1NIEhFQUQnICcKKwlnaXQgZGlmZiAtLXN0YXQgLU0gSEVBRCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTctZGlmZi1yZXR2YWwuc2ggYi90L3Q0MDE3LWRpZmYtcmV0dmFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4NzMxOTAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDE3LWRpZmYtcmV0dmFsLnNoCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZXR1cm4gdmFsdWUgb2YgZGlmZnMnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCWVjaG8gMSA+YSAmJgorCWdpdCBhZGQgLiAmJgorCWdpdCBjb21taXQgLW0gZmlyc3QgJiYKKwllY2hvIDIgPmIgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1hIC1tIHNlY29uZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUReIEhFQUQnICcKKwlnaXQgZGlmZi10cmVlIC0tZXhpdC1jb2RlIEhFQUReIEhFQUQKKwl0ZXN0ICQ/ID0gMQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEIC0tIGEnICcKKwlnaXQgZGlmZi10cmVlIC0tZXhpdC1jb2RlIEhFQUReIEhFQUQgLS0gYQorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBkaWZmLXRyZWUgLS1leGl0LWNvZGUgSEVBRF4gSEVBRCAtLSBiCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2VjaG8gSEVBRCB8IGdpdCBkaWZmLXRyZWUgLS1zdGRpbicgJworCWVjaG8gJChnaXQgcmV2LXBhcnNlIEhFQUQpIHwgZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSAtLXN0ZGluCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgSEVBRCBIRUFEJyAnCisJZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSBIRUFEIEhFQUQKKwl0ZXN0ICQ/ID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtZmlsZXMnICcKKwlnaXQgZGlmZi1maWxlcyAtLWV4aXQtY29kZQorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEJyAnCisJZ2l0IGRpZmYtaW5kZXggLS1leGl0LWNvZGUgLS1jYWNoZWQgSEVBRAorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEXicgJworCWdpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tY2FjaGVkIEhFQUReCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWluZGV4IC0tY2FjaGVkIEhFQUReJyAnCisJZWNobyB0ZXh0ID4+YiAmJgorCWVjaG8gMyA+YyAmJgorCWdpdCBhZGQgLiAmJiB7CisJCWdpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tY2FjaGVkIEhFQUReCisJCXRlc3QgJD8gPSAxCisJfQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSAtU3RleHQgSEVBRF4gSEVBRCAtLSBiJyAnCisJZ2l0IGNvbW1pdCAtbSAidGV4dCBpbiBiIiAmJiB7CisJCWdpdCBkaWZmLXRyZWUgLXAgLS1leGl0LWNvZGUgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYgorCQl0ZXN0ICQ/ID0gMQorCX0KKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgLVNub3QtZm91bmQgSEVBRF4gSEVBRCAtLSBiJyAnCisJZ2l0IGRpZmYtdHJlZSAtcCAtLWV4aXQtY29kZSAtU25vdC1mb3VuZCBIRUFEXiBIRUFEIC0tIGIKKwl0ZXN0ICQ/ID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtZmlsZXMnICcKKwllY2hvIDMgPj5jICYmIHsKKwkJZ2l0IGRpZmYtZmlsZXMgLS1leGl0LWNvZGUKKwkJdGVzdCAkPyA9IDEKKwl9CisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEJyAnCisJZ2l0IHVwZGF0ZS1pbmRleCBjICYmIHsKKwkJZ2l0IGRpZmYtaW5kZXggLS1leGl0LWNvZGUgLS1jYWNoZWQgSEVBRAorCQl0ZXN0ICQ/ID0gMQorCX0KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDE3LXF1aWV0LnNoIGIvdC90NDAxNy1xdWlldC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzQ3ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxNy1xdWlldC5zaApAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nUmV0dXJuIHZhbHVlIG9mIGRpZmZzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKwllY2hvIDEgPmEgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1tIGZpcnN0ICYmCisJZWNobyAyID5iICYmCisJZ2l0IGFkZCAuICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBzZWNvbmQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEJyAnCisJZ2l0IGRpZmYtdHJlZSAtLXF1aWV0IEhFQUReIEhFQUQgPmNudAorCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgSEVBRF4gSEVBRCAtLSBhJyAnCisJZ2l0IGRpZmYtdHJlZSAtLXF1aWV0IEhFQUReIEhFQUQgLS0gYSA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEIC0tIGInICcKKwlnaXQgZGlmZi10cmVlIC0tcXVpZXQgSEVBRF4gSEVBRCAtLSBiID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisnCisjIHRoaXMgZGlmZiBvdXRwdXRzIG9uZSBsaW5lOiBzaGExIG9mIHRoZSBnaXZlbiBoZWFkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdlY2hvIEhFQUQgfCBnaXQgZGlmZi10cmVlIC0tc3RkaW4nICcKKwllY2hvICQoZ2l0IHJldi1wYXJzZSBIRUFEKSB8IGdpdCBkaWZmLXRyZWUgLS1xdWlldCAtLXN0ZGluID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAxCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUQgSEVBRCcgJworCWdpdCBkaWZmLXRyZWUgLS1xdWlldCBIRUFEIEhFQUQgPmNudAorCXRlc3QgJD8gPSAwICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWZpbGVzJyAnCisJZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRCcgJworCWdpdCBkaWZmLWluZGV4IC0tcXVpZXQgLS1jYWNoZWQgSEVBRCA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRF4nICcKKwlnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUReID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEXicgJworCWVjaG8gdGV4dCA+PmIgJiYKKwllY2hvIDMgPmMgJiYKKwlnaXQgYWRkIC4gJiYgeworCQlnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUReID5jbnQKKwkJdGVzdCAkPyA9IDEgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorCX0KKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBjb21taXQgLW0gInRleHQgaW4gYiIgJiYgeworCQlnaXQgZGlmZi10cmVlIC0tcXVpZXQgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYiA+Y250CisJCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKwl9CisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIC1Tbm90LWZvdW5kIEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBkaWZmLXRyZWUgLS1xdWlldCAtU25vdC1mb3VuZCBIRUFEXiBIRUFEIC0tIGIgPmNudAorCXRlc3QgJD8gPSAwICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWZpbGVzJyAnCisJZWNobyAzID4+YyAmJiB7CisJCWdpdCBkaWZmLWZpbGVzIC0tcXVpZXQgPmNudAorCQl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisJfQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRCcgJworCWdpdCB1cGRhdGUtaW5kZXggYyAmJiB7CisJCWdpdCBkaWZmLWluZGV4IC0tcXVpZXQgLS1jYWNoZWQgSEVBRCA+Y250CisJCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKwl9CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAyMC1kaWZmLWV4dGVybmFsLnNoIGIvdC90NDAyMC1kaWZmLWV4dGVybmFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwMDQ1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDIwLWRpZmYtZXh0ZXJuYWwuc2gKQEAgLTAsMCArMSw5NyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2V4dGVybmFsIGRpZmYgaW50ZXJmYWNlIHRlc3QnCisKKy4gLi90ZXN0LWxpYi5zaAorCitfejQwPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIGluaXRpYWwgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gc2Vjb25kID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBzZWNvbmQgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gdGhpcmQgPmZpbGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnR0lUX0VYVEVSTkFMX0RJRkYgZW52aXJvbm1lbnQnICcKKworCUdJVF9FWFRFUk5BTF9ESUZGPWVjaG8gZ2l0IGRpZmYgfCB7CisJCXJlYWQgcGF0aCBvbGRmaWxlIG9sZGhleCBvbGRtb2RlIG5ld2ZpbGUgbmV3aGV4IG5ld21vZGUgJiYKKwkJdGVzdCAieiRwYXRoIiA9IHpmaWxlICYmCisJCXRlc3QgInokb2xkbW9kZSIgPSB6MTAwNjQ0ICYmCisJCXRlc3QgInokbmV3aGV4IiA9ICJ6JF96NDAiICYmCisJCXRlc3QgInokbmV3bW9kZSIgPSB6MTAwNjQ0ICYmCisJCW9oPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOmZpbGUpICYmCisJCXRlc3QgInokb2giID0gInokb2xkaGV4IgorCX0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdHSVRfRVhURVJOQUxfRElGRiBlbnZpcm9ubWVudCBzaG91bGQgYXBwbHkgb25seSB0byBkaWZmJyAnCisKKwlHSVRfRVhURVJOQUxfRElGRj1lY2hvIGdpdCBsb2cgLXAgLTEgSEVBRCB8CisJZ3JlcCAiXmRpZmYgLS1naXQgYS9maWxlIGIvZmlsZSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmIGF0dHJpYnV0ZScgJworCisJZ2l0IGNvbmZpZyBkaWZmLnBhcnJvdC5jb21tYW5kIGVjaG8gJiYKKworCWVjaG8gPi5naXRhdHRyaWJ1dGVzICJmaWxlIGRpZmY9cGFycm90IiAmJgorCisJZ2l0IGRpZmYgfCB7CisJCXJlYWQgcGF0aCBvbGRmaWxlIG9sZGhleCBvbGRtb2RlIG5ld2ZpbGUgbmV3aGV4IG5ld21vZGUgJiYKKwkJdGVzdCAieiRwYXRoIiA9IHpmaWxlICYmCisJCXRlc3QgInokb2xkbW9kZSIgPSB6MTAwNjQ0ICYmCisJCXRlc3QgInokbmV3aGV4IiA9ICJ6JF96NDAiICYmCisJCXRlc3QgInokbmV3bW9kZSIgPSB6MTAwNjQ0ICYmCisJCW9oPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOmZpbGUpICYmCisJCXRlc3QgInokb2giID0gInokb2xkaGV4IgorCX0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmIGF0dHJpYnV0ZSBzaG91bGQgYXBwbHkgb25seSB0byBkaWZmJyAnCisKKwlnaXQgbG9nIC1wIC0xIEhFQUQgfAorCWdyZXAgIl5kaWZmIC0tZ2l0IGEvZmlsZSBiL2ZpbGUiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiBhdHRyaWJ1dGUnICcKKworCWdpdCBjb25maWcgLS11bnNldCBkaWZmLnBhcnJvdC5jb21tYW5kICYmCisJZ2l0IGNvbmZpZyBkaWZmLmNvbG9yLmNvbW1hbmQgZWNobyAmJgorCisJZWNobyA+LmdpdGF0dHJpYnV0ZXMgImZpbGUgZGlmZj1jb2xvciIgJiYKKworCWdpdCBkaWZmIHwgeworCQlyZWFkIHBhdGggb2xkZmlsZSBvbGRoZXggb2xkbW9kZSBuZXdmaWxlIG5ld2hleCBuZXdtb2RlICYmCisJCXRlc3QgInokcGF0aCIgPSB6ZmlsZSAmJgorCQl0ZXN0ICJ6JG9sZG1vZGUiID0gejEwMDY0NCAmJgorCQl0ZXN0ICJ6JG5ld2hleCIgPSAieiRfejQwIiAmJgorCQl0ZXN0ICJ6JG5ld21vZGUiID0gejEwMDY0NCAmJgorCQlvaD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpmaWxlKSAmJgorCQl0ZXN0ICJ6JG9oIiA9ICJ6JG9sZGhleCIKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiBhdHRyaWJ1dGUgc2hvdWxkIGFwcGx5IG9ubHkgdG8gZGlmZicgJworCisJZ2l0IGxvZyAtcCAtMSBIRUFEIHwKKwlncmVwICJeZGlmZiAtLWdpdCBhL2ZpbGUgYi9maWxlIgorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwMC1hcHBseS1zdGF0LnNoIGIvdC90NDEwMC1hcHBseS1zdGF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiODFjMzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwLWFwcGx5LXN0YXQuc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSB0ZXN0LgorCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlbmFtZScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0xLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0xLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29weScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0yLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0yLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmV3cml0ZScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0zLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW9kZScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS00LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS00LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS01LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS01LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS02LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS02LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS03LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS03LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTEuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTEuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGU2NGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMS5leHBlY3QKQEAgLTAsMCArMSwxMSBAQAorIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dCB8ICAgMTIgKysrKysrLS0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0IHwgICAxMCArKysrKy0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQudHh0ICAgICAgICAgIHwgICAgNiArKystLS0KKyBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsrKy0tLQorIHNzaC1wdWxsLmMgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKystLQorIHNzaC1wdXNoLmMgICAgICAgICAgICAgICAgICAgICB8ICAgMTQgKysrKysrKy0tLS0tLS0KKyA2IGZpbGVzIGNoYW5nZWQsIDI2IGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQorIHJlbmFtZSBEb2N1bWVudGF0aW9uL3tnaXQtcnB1bGwudHh0ID0+IGdpdC1zc2gtcHVsbC50eHR9ICg5MCUpCisgcmVuYW1lIERvY3VtZW50YXRpb24ve2dpdC1ycHVzaC50eHQgPT4gZ2l0LXNzaC1wdXNoLnR4dH0gKDcxJSkKKyByZW5hbWUgcnB1bGwuYyA9PiBzc2gtcHVsbC5jICg5NyUpCisgcmVuYW1lIHJwdXNoLmMgPT4gc3NoLXB1c2guYyAoOTMlKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTEucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU4NzUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTEucGF0Y2gKQEAgLTAsMCArMSwxOTQgQEAKKzQxOGFhZjg0N2E4YjNmZmZmYjRmNzc3YTJkZDUyNjJjYTVjZTBlZjcgKGZyb20gZGM5Mzg0MTcxNWRmYTlhOWNkZGE2ZjJjNGEyNWVlYzgzMWVhN2FhMCkKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK3NpbWlsYXJpdHkgaW5kZXggOTAlCityZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKK3JlbmFtZSB0byBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CitAQCAtMSwyMSArMSwyMSBAQAorLWdpdC1ycHVsbCgxKQorLT09PT09PT09PT09PQorK2dpdC1zc2gtcHVsbCgxKQorKz09PT09PT09PT09PT09PQorIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtcnB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorK2dpdC1zc2gtcHVsbCAtIFB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisgCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtcnB1bGwnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCisrJ2dpdC1zc2gtcHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1ycHVzaCBvbgorLXRoZSBvdGhlciBlbmQuCisrUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1zc2gtcHVzaAorK29uIHRoZSBvdGhlciBlbmQuCisgCisgT1BUSU9OUworIC0tLS0tLS0KK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKK3NpbWlsYXJpdHkgaW5kZXggNzElCityZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKK3JlbmFtZSB0byBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdXNoLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitAQCAtMSwxOSArMSwxOSBAQAorLWdpdC1ycHVzaCgxKQorLT09PT09PT09PT09PQorK2dpdC1zc2gtcHVzaCgxKQorKz09PT09PT09PT09PT09PQorIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtcnB1c2ggLSBIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsCisrZ2l0LXNzaC1wdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbAorIAorIAorIFNZTk9QU0lTCisgLS0tLS0tLS0KKy0nZ2l0LXJwdXNoJworKydnaXQtc3NoLXB1c2gnCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwuCisrSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbC4KKyAKKyAKKyBBdXRob3IKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CitAQCAtMTQ4LDcgKzE0OCw3IEBAIGxpbms6Z2l0LXJlc29sdmUtc2NyaXB0Lmh0bWxbZ2l0LXJlc29sdmUKKyBsaW5rOmdpdC10YWctc2NyaXB0Lmh0bWxbZ2l0LXRhZy1zY3JpcHRdOjoKKyAJQW4gZXhhbXBsZSBzY3JpcHQgdG8gY3JlYXRlIGEgdGFnIG9iamVjdCBzaWduZWQgd2l0aCBHUEcKKyAKKy1saW5rOmdpdC1ycHVsbC5odG1sW2dpdC1ycHVsbF06OgorK2xpbms6Z2l0LXNzaC1wdWxsLmh0bWxbZ2l0LXNzaC1wdWxsXTo6CisgCVB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisgCisgSW50ZXJvZ2F0b3JzOgorQEAgLTE1Niw4ICsxNTYsOCBAQCBJbnRlcm9nYXRvcnM6CisgbGluazpnaXQtZGlmZi1oZWxwZXIuaHRtbFtnaXQtZGlmZi1oZWxwZXJdOjoKKyAJR2VuZXJhdGVzIHBhdGNoIGZvcm1hdCBvdXRwdXQgZm9yIGdpdC1kaWZmLSoKKyAKKy1saW5rOmdpdC1ycHVzaC5odG1sW2dpdC1ycHVzaF06OgorLQlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsCisrbGluazpnaXQtc3NoLXB1c2guaHRtbFtnaXQtc3NoLXB1c2hdOjoKKysJSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbAorIAorIAorIAorZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKKy0tLSBhL01ha2VmaWxlCisrKysgYi9NYWtlZmlsZQorQEAgLTMwLDcgKzMwLDcgQEAgUFJPRz0gICBnaXQtdXBkYXRlLWNhY2hlIGdpdC1kaWZmLWZpbGVzIAorIAlnaXQtY2hlY2tvdXQtY2FjaGUgZ2l0LWRpZmYtdHJlZSBnaXQtcmV2LXRyZWUgZ2l0LWxzLWZpbGVzIFwKKyAJZ2l0LWNoZWNrLWZpbGVzIGdpdC1scy10cmVlIGdpdC1tZXJnZS1iYXNlIGdpdC1tZXJnZS1jYWNoZSBcCisgCWdpdC11bnBhY2stZmlsZSBnaXQtZXhwb3J0IGdpdC1kaWZmLWNhY2hlIGdpdC1jb252ZXJ0LWNhY2hlIFwKKy0JZ2l0LWh0dHAtcHVsbCBnaXQtcnB1c2ggZ2l0LXJwdWxsIGdpdC1yZXYtbGlzdCBnaXQtbWt0YWcgXAorKwlnaXQtaHR0cC1wdWxsIGdpdC1zc2gtcHVzaCBnaXQtc3NoLXB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisgCWdpdC1kaWZmLWhlbHBlciBnaXQtdGFyLXRyZWUgZ2l0LWxvY2FsLXB1bGwgZ2l0LXdyaXRlLWJsb2IgXAorIAlnaXQtZ2V0LXRhci1jb21taXQtaWQgZ2l0LW1rZGVsdGEgZ2l0LWFwcGx5IGdpdC1zdHJpcHNwYWNlCisgCitAQCAtMTA1LDggKzEwNSw4IEBAIGdpdC1kaWZmLWNhY2hlOiBkaWZmLWNhY2hlLmMKKyBnaXQtY29udmVydC1jYWNoZTogY29udmVydC1jYWNoZS5jCisgZ2l0LWh0dHAtcHVsbDogaHR0cC1wdWxsLmMgcHVsbC5jCisgZ2l0LWxvY2FsLXB1bGw6IGxvY2FsLXB1bGwuYyBwdWxsLmMKKy1naXQtcnB1c2g6IHJzaC5jCistZ2l0LXJwdWxsOiByc2guYyBwdWxsLmMKKytnaXQtc3NoLXB1c2g6IHJzaC5jCisrZ2l0LXNzaC1wdWxsOiByc2guYyBwdWxsLmMKKyBnaXQtcmV2LWxpc3Q6IHJldi1saXN0LmMKKyBnaXQtbWt0YWc6IG1rdGFnLmMKKyBnaXQtZGlmZi1oZWxwZXI6IGRpZmYtaGVscGVyLmMKK2RpZmYgLS1naXQgYS9ycHVsbC5jIGIvc3NoLXB1bGwuYworc2ltaWxhcml0eSBpbmRleCA5NyUKK3JlbmFtZSBmcm9tIHJwdWxsLmMKK3JlbmFtZSB0byBzc2gtcHVsbC5jCistLS0gYS9ycHVsbC5jCisrKysgYi9zc2gtcHVsbC5jCitAQCAtNjQsMTMgKzY0LDEzIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJCWFyZysrOworIAl9CisgCWlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworIAkJcmV0dXJuIDE7CisgCX0KKyAJY29tbWl0X2lkID0gYXJndlthcmddOworIAl1cmwgPSBhcmd2W2FyZyArIDFdOworIAorLQlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtcnB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtc3NoLXB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorIAkJcmV0dXJuIDE7CisgCisgCWlmIChnZXRfdmVyc2lvbigpKQorZGlmZiAtLWdpdCBhL3JwdXNoLmMgYi9zc2gtcHVzaC5jCitzaW1pbGFyaXR5IGluZGV4IDkzJQorcmVuYW1lIGZyb20gcnB1c2guYworcmVuYW1lIHRvIHNzaC1wdXNoLmMKKy0tLSBhL3JwdXNoLmMKKysrKyBiL3NzaC1wdXNoLmMKK0BAIC0xNiw3ICsxNiw3IEBAIGludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSAKKyAJZG8geworIAkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworIAkJaWYgKHNpemUgPCAwKSB7CistCQkJcGVycm9yKCJnaXQtcnB1c2g6IHJlYWQgIik7CisrCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuIC0xOworIAkJfQorIAkJaWYgKCFzaXplKQorQEAgLTMwLDcgKzMwLDcgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKyAJCisgCWlmICghYnVmKSB7CistCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKyAJCQlzaGExX3RvX2hleChzaGExKSk7CisgCQlyZW1vdGUgPSAtMTsKKyAJfQorQEAgLTQ1LDkgKzQ1LDkgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworIAkJaWYgKHNpemUgPD0gMCkgeworIAkJCWlmICghc2l6ZSkgeworLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogd3JpdGUgY2xvc2VkIik7CisrCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC1wdXNoOiB3cml0ZSBjbG9zZWQiKTsKKyAJCQl9IGVsc2UgeworLQkJCQlwZXJyb3IoImdpdC1ycHVzaDogd3JpdGUgIik7CisrCQkJCXBlcnJvcigiZ2l0LXNzaC1wdXNoOiB3cml0ZSAiKTsKKyAJCQl9CisgCQkJcmV0dXJuIC0xOworIAkJfQorQEAgLTcxLDcgKzcxLDcgQEAgdm9pZCBzZXJ2aWNlKGludCBmZF9pbiwgaW50IGZkX291dCkgeworIAkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworIAkJaWYgKHJldHZhbCA8IDEpIHsKKyAJCQlpZiAocmV0dmFsIDwgMCkKKy0JCQkJcGVycm9yKCJycHVzaDogcmVhZCAiKTsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuOworIAkJfQorIAkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCitAQCAtOTEsMTIgKzkxLDEyIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAgICAgICAgICAgICAgICAgYXJnKys7CisgICAgICAgICB9CisgICAgICAgICBpZiAoYXJnYyA8IGFyZyArIDIpIHsKKy0JCXVzYWdlKCJnaXQtcnB1c2ggWy1jXSBbLXRdIFstYV0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorIAljb21taXRfaWQgPSBhcmd2W2FyZ107CisgCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisgCQlyZXR1cm4gMTsKKyAKKyAJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTIuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIE1ha2VmaWxlICAgICAgICAgfCAgICAyICstCisgZ2l0LWZldGNoLXNjcmlwdCB8ICAgIDUgLS0tLS0KKyBnaXQtcHVsbC1zY3JpcHQgIHwgICAzNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDM5IGRlbGV0aW9ucygtKQorIGNvcHkgZ2l0LXB1bGwtc2NyaXB0ID0+IGdpdC1mZXRjaC1zY3JpcHQgKDg3JSkKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoIGIvdC90NDEwMC90LWFwcGx5LTIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkYzgwOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoCkBAIC0wLDAgKzEsNzIgQEAKKzdlZjc2OTI1ZDljMTllZjc0ODc0ZTE3MzVlMjQzNmU1NmQwYzQ4OTcgKGZyb20gNmIxNGQ3ZmFmMGJhZDAyNmE4MWEyN2JhYzA3YjQ3NjkxZjYyMWI4ZikKK2RpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0yMCw3ICsyMCw3IEBAIElOU1RBTEw9aW5zdGFsbAorIAorIFNDUklQVFM9Z2l0LWFwcGx5LXBhdGNoLXNjcmlwdCBnaXQtbWVyZ2Utb25lLWZpbGUtc2NyaXB0IGdpdC1wcnVuZS1zY3JpcHQgXAorIAlnaXQtcHVsbC1zY3JpcHQgZ2l0LXRhZy1zY3JpcHQgZ2l0LXJlc29sdmUtc2NyaXB0IGdpdC13aGF0Y2hhbmdlZCBcCistCWdpdC1kZWx0YWZ5LXNjcmlwdAorKwlnaXQtZGVsdGFmeS1zY3JpcHQgZ2l0LWZldGNoLXNjcmlwdAorIAorIFBST0c9ICAgZ2l0LXVwZGF0ZS1jYWNoZSBnaXQtZGlmZi1maWxlcyBnaXQtaW5pdC1kYiBnaXQtd3JpdGUtdHJlZSBcCisgCWdpdC1yZWFkLXRyZWUgZ2l0LWNvbW1pdC10cmVlIGdpdC1jYXQtZmlsZSBnaXQtZnNjay1jYWNoZSBcCitkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwtc2NyaXB0IGIvZ2l0LWZldGNoLXNjcmlwdAorc2ltaWxhcml0eSBpbmRleCA4NyUKK2NvcHkgZnJvbSBnaXQtcHVsbC1zY3JpcHQKK2NvcHkgdG8gZ2l0LWZldGNoLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtZmV0Y2gtc2NyaXB0CitAQCAtMzksOCArMzksMyBAQCBkb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiCisgCisgZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCisgZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorLQorLWdpdC1yZXNvbHZlLXNjcmlwdCBcCistCSIkKGNhdCAiJEdJVF9ESVIiL0hFQUQpIiBcCistCSIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIiBcCistCSIkbWVyZ2VfcmVwbyIKK2RpZmYgLS1naXQgYS9naXQtcHVsbC1zY3JpcHQgYi9naXQtcHVsbC1zY3JpcHQKKy0tLSBhL2dpdC1wdWxsLXNjcmlwdAorKysrIGIvZ2l0LXB1bGwtc2NyaXB0CitAQCAtNiwzOSArNiw3IEBAIG1lcmdlX25hbWU9JHsyOi1IRUFEfQorIDogJHtHSVRfRElSPS5naXR9CisgOiAke0dJVF9PQkpFQ1RfRElSRUNUT1JZPSIke1NIQTFfRklMRV9ESVJFQ1RPUlktIiRHSVRfRElSL29iamVjdHMifSJ9CisgCistZG93bmxvYWRfb25lICgpIHsKKy0JIyByZW1vdGVfcGF0aD0iJDEiIGxvY2FsX2ZpbGU9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQl3Z2V0IC1xIC1PICIkMiIgIiQxIiA7OworLQkvKikKKy0JCXRlc3QgLWYgIiQxIiAmJiBjYXQgPiIkMiIgIiQxIiA7OworLQkqKQorLQkJcnN5bmMgLUwgIiQxIiAiJDIiIDs7CistCWVzYWMKKy19CistCistZG93bmxvYWRfb2JqZWN0cyAoKSB7CistCSMgcmVtb3RlX3JlcG89IiQxIiBoZWFkX3NoYTE9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQlnaXQtaHR0cC1wdWxsIC1hICIkMiIgIiQxLyIKKy0JCTs7CistCS8qKQorLQkJZ2l0LWxvY2FsLXB1bGwgLWwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JKikKKy0JCXJzeW5jIC1hdnogLS1pZ25vcmUtZXhpc3RpbmcgXAorLQkJCSIkMS9vYmplY3RzLy4iICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiLy4KKy0JCTs7CistCWVzYWMKKy19CistCistZWNobyAiR2V0dGluZyByZW1vdGUgJG1lcmdlX25hbWUiCistZG93bmxvYWRfb25lICIkbWVyZ2VfcmVwby8kbWVyZ2VfbmFtZSIgIiRHSVRfRElSIi9NRVJHRV9IRUFECistCistZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCistZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorK2dpdC1mZXRjaC1zY3JpcHQgIiRtZXJnZV9yZXBvIiAiJG1lcmdlX25hbWUiCisgCisgZ2l0LXJlc29sdmUtc2NyaXB0IFwKKyAJIiQoY2F0ICIkR0lUX0RJUiIvSEVBRCkiIFwKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhNTUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMuZXhwZWN0CkBAIC0wLDAgKzEsNyBAQAorIERvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IHwgICAyMCArLQorIGxzLXRyZWUuYyAgICAgICAgICAgICAgICAgICAgIHwgIDQ1OSArKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCAgIHwgICAgMyAKKyB0cmVlLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgCisgdHJlZS5oICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIAorIDUgZmlsZXMgY2hhbmdlZCwgMjYyIGluc2VydGlvbnMoKyksIDIyMyBkZWxldGlvbnMoLSkKKyByZXdyaXRlIGxzLXRyZWUuYyAoODIlKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTMucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNkYmFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMucGF0Y2gKQEAgLTAsMCArMSw1NjcgQEAKKzZhZjFmMDE5MmZmODc0MGZlNzdkYjdjZjAyYzczOWNjZmJkZjExOWMgKGZyb20gMmJjMjU2NDE0NTgzNTk5NjczNGQ2ZWQ1ZDE4ODBmODViMTcyMzNkNikKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKK0BAIC00LDIzICs0LDI2IEBAIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtbHMtdHJlZSAtIERpc3BsYXlzIGEgdHJlZSBvYmplY3QgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQorK2dpdC1scy10cmVlIC0gTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QuCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtbHMtdHJlZScgWy1yXSBbLXpdIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorKydnaXQtbHMtdHJlZScgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUNvbnZlcnRzIHRoZSB0cmVlIG9iamVjdCB0byBhIGh1bWFuIHJlYWRhYmxlIChhbmQgc2NyaXB0IHByb2Nlc3NhYmxlKQorLWZvcm0uCisrTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QsIGxpa2Ugd2hhdCAiL2Jpbi9scyAtYSIgZG9lcworK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIAorIE9QVElPTlMKKyAtLS0tLS0tCisgPHRyZWUtaXNoPjo6CisgCUlkIG9mIGEgdHJlZS4KKyAKKystZDo6CisrCXNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4KKysKKyAtcjo6CisgCXJlY3Vyc2UgaW50byBzdWItdHJlZXMKKyAKK0BAIC0yOCwxOCArMzEsMTkgQEAgT1BUSU9OUworIAlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dAorIAorIHBhdGhzOjoKKy0JT3B0aW9uYWxseSwgcmVzdHJpY3QgdGhlIG91dHB1dCBvZiBnaXQtbHMtdHJlZSB0byBzcGVjaWZpYworLQlwYXRocy4gRGlyZWN0b3JpZXMgd2lsbCBvbmx5IGxpc3QgdGhlaXIgdHJlZSBibG9iIGlkcy4KKy0JSW1wbGllcyAtci4KKysJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3dzIHRoZW0uICBPdGhlcndpc2UgaW1wbGljaXRseQorKwl1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisrCisgCisgT3V0cHV0IEZvcm1hdAorIC0tLS0tLS0tLS0tLS0KKy0gICAgICAgIDxtb2RlPlx0CTx0eXBlPlx0CTxvYmplY3Q+XHQJPGZpbGU+CisrICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKyAKKyAKKyBBdXRob3IKKyAtLS0tLS0KKyBXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKytDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorIAorIERvY3VtZW50YXRpb24KKyAtLS0tLS0tLS0tLS0tLQorZGlmZiAtLWdpdCBhL2xzLXRyZWUuYyBiL2xzLXRyZWUuYworZGlzc2ltaWxhcml0eSBpbmRleCA4MiUKKy0tLSBscy10cmVlLmMKKysrKyBscy10cmVlLmMKK0BAIC0xLDIxMiArMSwyNDcgQEAKKy0vKgorLSAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorLSAqCistICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorLSAqLworLSNpbmNsdWRlICJjYWNoZS5oIgorLQorLXN0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7Cistc3RhdGljIGludCByZWN1cnNpdmUgPSAwOworLQorLXN0cnVjdCBwYXRoX3ByZWZpeCB7CistCXN0cnVjdCBwYXRoX3ByZWZpeCAqcHJldjsKKy0JY29uc3QgY2hhciAqbmFtZTsKKy19OworLQorLSNkZWZpbmUgREVCVUcoZm10LCAuLi4pCQorLQorLXN0YXRpYyBpbnQgc3RyaW5nX3BhdGhfcHJlZml4KGNoYXIgKmJ1ZmYsIHNpemVfdCBibGVuLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWludCBsZW4gPSAwOworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsYmxlbixwcmVmaXgtPnByZXYpOworLQkJCWJ1ZmYgKz0gbGVuOworLQkJCWJsZW4gLT0gbGVuOworLQkJCWlmIChibGVuID4gMCkgeworLQkJCQkqYnVmZiA9ICcvJzsKKy0JCQkJbGVuKys7CistCQkJCWJ1ZmYrKzsKKy0JCQkJYmxlbi0tOworLQkJCX0KKy0JCX0KKy0JCXN0cm5jcHkoYnVmZixwcmVmaXgtPm5hbWUsYmxlbik7CistCQlyZXR1cm4gbGVuICsgc3RybGVuKHByZWZpeC0+bmFtZSk7CistCX0KKy0KKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyB2b2lkIHByaW50X3BhdGhfcHJlZml4KHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCXByaW50X3BhdGhfcHJlZml4KHByZWZpeC0+cHJldik7CistCQkJcHV0Y2hhcignLycpOworLQkJfQorLQkJZnB1dHMocHJlZml4LT5uYW1lLCBzdGRvdXQpOworLQl9CistfQorLQorLS8qCistICogcmV0dXJuOgorLSAqIAktMSBpZiBwcmVmaXggaXMgKm5vdCogYSBzdWJzZXQgb2YgcGF0aAorLSAqIAkgMCBpZiBwcmVmaXggPT0gcGF0aAorLSAqIAkgMSBpZiBwcmVmaXggaXMgYSBzdWJzZXQgb2YgcGF0aAorLSAqLworLXN0YXRpYyBpbnQgcGF0aGNtcChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWNoYXIgYnVmZltQQVRIX01BWF07CistCWludCBsZW4sc2xlbjsKKy0KKy0JaWYgKHByZWZpeCA9PSBOVUxMKQorLQkJcmV0dXJuIDE7CistCistCWxlbiA9IHN0cmluZ19wYXRoX3ByZWZpeChidWZmLCBzaXplb2YgYnVmZiwgcHJlZml4KTsKKy0Jc2xlbiA9IHN0cmxlbihwYXRoKTsKKy0KKy0JaWYgKHNsZW4gPCBsZW4pCistCQlyZXR1cm4gLTE7CistCistCWlmIChzdHJuY21wKHBhdGgsYnVmZixsZW4pID09IDApIHsKKy0JCWlmIChzbGVuID09IGxlbikKKy0JCQlyZXR1cm4gMDsKKy0JCWVsc2UKKy0JCQlyZXR1cm4gMTsKKy0JfQorLQorLQlyZXR1cm4gLTE7CistfQkKKy0KKy0vKgorLSAqIG1hdGNoIG1heSBiZSBOVUxMLCBvciBhICpzb3J0ZWQqIGxpc3Qgb2YgcGF0aHMKKy0gKi8KKy1zdGF0aWMgdm9pZCBsaXN0X3JlY3Vyc2l2ZSh2b2lkICpidWZmZXIsCistCQkJICAgY29uc3QgY2hhciAqdHlwZSwKKy0JCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCistCQkJICAgc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgsCistCQkJICAgY2hhciAqKm1hdGNoLCBpbnQgbWF0Y2hlcykKKy17CistCXN0cnVjdCBwYXRoX3ByZWZpeCB0aGlzX3ByZWZpeDsKKy0JdGhpc19wcmVmaXgucHJldiA9IHByZWZpeDsKKy0KKy0JaWYgKHN0cmNtcCh0eXBlLCAidHJlZSIpKQorLQkJZGllKCJleHBlY3RlZCBhICd0cmVlJyBub2RlIik7CistCistCWlmIChtYXRjaGVzKQorLQkJcmVjdXJzaXZlID0gMTsKKy0KKy0Jd2hpbGUgKHNpemUpIHsKKy0JCWludCBuYW1lbGVuID0gc3RybGVuKGJ1ZmZlcikrMTsKKy0JCXZvaWQgKmVsdGJ1ZiA9IE5VTEw7CistCQljaGFyIGVsdHR5cGVbMjBdOworLQkJdW5zaWduZWQgbG9uZyBlbHRzaXplOworLQkJdW5zaWduZWQgY2hhciAqc2hhMSA9IGJ1ZmZlciArIG5hbWVsZW47CistCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKSArIDE7CistCQl1bnNpZ25lZCBpbnQgbW9kZTsKKy0JCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworLQkJaW50IG10eXBlID0gLTE7CistCQlpbnQgbWluZGV4OworLQorLQkJaWYgKHNpemUgPCBuYW1lbGVuICsgMjAgfHwgc3NjYW5mKGJ1ZmZlciwgIiVvIiwgJm1vZGUpICE9IDEpCistCQkJZGllKCJjb3JydXB0ICd0cmVlJyBmaWxlIik7CistCQlidWZmZXIgPSBzaGExICsgMjA7CistCQlzaXplIC09IG5hbWVsZW4gKyAyMDsKKy0KKy0JCXRoaXNfcHJlZml4Lm5hbWUgPSBwYXRoOworLQkJZm9yICggbWluZGV4ID0gMDsgbWluZGV4IDwgbWF0Y2hlczsgbWluZGV4KyspIHsKKy0JCQltdHlwZSA9IHBhdGhjbXAobWF0Y2hbbWluZGV4XSwmdGhpc19wcmVmaXgpOworLQkJCWlmIChtdHlwZSA+PSAwKSB7CistCQkJCW1hdGNoZWQgPSBtYXRjaFttaW5kZXhdOworLQkJCQlicmVhazsKKy0JCQl9CistCQl9CistCistCQkvKgorLQkJICogSWYgd2UncmUgbm90IG1hdGNoaW5nLCBvciBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLAorLQkJICogcHJpbnQgb3V0IHRoZSBpbmZvCistCQkgKi8KKy0JCWlmICghbWF0Y2hlcyB8fCAobWF0Y2hlZCAhPSBOVUxMICYmIG10eXBlID09IDApKSB7CistCQkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLAorLQkJCSAgICAgICBTX0lTRElSKG1vZGUpID8gInRyZWUiIDogImJsb2IiLAorLQkJCSAgICAgICBzaGExX3RvX2hleChzaGExKSk7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgoJnRoaXNfcHJlZml4KTsKKy0JCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworLQkJfQorLQorLQkJaWYgKCEgcmVjdXJzaXZlIHx8ICEgU19JU0RJUihtb2RlKSkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmIChtYXRjaGVzICYmICEgbWF0Y2hlZCkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmICghIChlbHRidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCBlbHR0eXBlLCAmZWx0c2l6ZSkpICkgeworLQkJCWVycm9yKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQljb250aW51ZTsKKy0JCX0KKy0KKy0JCS8qIElmIHRoaXMgaXMgYW4gZXhhY3QgZGlyZWN0b3J5IG1hdGNoLCB3ZSBtYXkgaGF2ZQorLQkJICogZGlyZWN0b3J5IGZpbGVzIGZvbGxvd2luZyB0aGlzIHBhdGguIE1hdGNoIG9uIHRoZW0uCistCQkgKiBPdGhlcndpc2UsIHdlJ3JlIGF0IGEgcGFjaCBzdWJjb21wb25lbnQsIGFuZCB3ZSBuZWVkCistCQkgKiB0byB0cnkgdG8gbWF0Y2ggYWdhaW4uCistCQkgKi8KKy0JCWlmIChtdHlwZSA9PSAwKQorLQkJCW1pbmRleCsrOworLQorLQkJbGlzdF9yZWN1cnNpdmUoZWx0YnVmLCBlbHR0eXBlLCBlbHRzaXplLCAmdGhpc19wcmVmaXgsICZtYXRjaFttaW5kZXhdLCBtYXRjaGVzLW1pbmRleCk7CistCQlmcmVlKGVsdGJ1Zik7CistCX0KKy19CistCistc3RhdGljIGludCBxY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisteworLQlyZXR1cm4gc3RyY21wKCooY2hhciAqKilhLCAqKGNoYXIgKiopYik7CistfQorLQorLXN0YXRpYyBpbnQgbGlzdCh1bnNpZ25lZCBjaGFyICpzaGExLGNoYXIgKipwYXRoKQorLXsKKy0Jdm9pZCAqYnVmZmVyOworLQl1bnNpZ25lZCBsb25nIHNpemU7CistCWludCBucGF0aHM7CistCistCWZvciAobnBhdGhzID0gMDsgcGF0aFtucGF0aHNdICE9IE5VTEw7IG5wYXRocysrKQorLQkJOworLQorLQlxc29ydChwYXRoLG5wYXRocyxzaXplb2YoY2hhciAqKSxxY21wKTsKKy0KKy0JYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgTlVMTCk7CistCWlmICghYnVmZmVyKQorLQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUiKTsKKy0JbGlzdF9yZWN1cnNpdmUoYnVmZmVyLCAidHJlZSIsIHNpemUsIE5VTEwsIHBhdGgsIG5wYXRocyk7CistCWZyZWUoYnVmZmVyKTsKKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3VzYWdlID0gImdpdC1scy10cmVlIFstcl0gWy16XSA8a2V5PiBbcGF0aHMuLi5dIjsKKy0KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisteworLQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworLQorLQl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKy0JCXN3aXRjaCAoYXJndlsxXVsxXSkgeworLQkJY2FzZSAneic6CistCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CistCQkJYnJlYWs7CistCQljYXNlICdyJzoKKy0JCQlyZWN1cnNpdmUgPSAxOworLQkJCWJyZWFrOworLQkJZGVmYXVsdDoKKy0JCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JCX0KKy0JCWFyZ2MtLTsgYXJndisrOworLQl9CistCistCWlmIChhcmdjIDwgMikKKy0JCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkgPCAwKQorLQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CistCWlmIChsaXN0KHNoYTEsICZhcmd2WzJdKSA8IDApCistCQlkaWUoImxpc3QgZmFpbGVkIik7CistCXJldHVybiAwOworLX0KKysvKgorKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorKyAqCisrICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorKyAqLworKyNpbmNsdWRlICJjYWNoZS5oIgorKyNpbmNsdWRlICJibG9iLmgiCisrI2luY2x1ZGUgInRyZWUuaCIKKysKKytzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKysjZGVmaW5lIExTX1RSRUVfT05MWSAyCisrc3RhdGljIGludCBsc19vcHRpb25zID0gMDsKKysKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCByb290X2VudHJ5OworKworK3N0YXRpYyB2b2lkIHByZXBhcmVfcm9vdCh1bnNpZ25lZCBjaGFyICpzaGExKQorK3sKKysJdW5zaWduZWQgY2hhciByc2hhWzIwXTsKKysJdW5zaWduZWQgbG9uZyBzaXplOworKwl2b2lkICpidWY7CisrCXN0cnVjdCB0cmVlICpyb290X3RyZWU7CisrCisrCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsICJ0cmVlIiwgJnNpemUsIHJzaGEpOworKwlmcmVlKGJ1Zik7CisrCWlmICghYnVmKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJcm9vdF90cmVlID0gbG9va3VwX3RyZWUocnNoYSk7CisrCWlmICghcm9vdF90cmVlKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJLyogUHJlcGFyZSBhIGZha2UgZW50cnkgKi8KKysJcm9vdF9lbnRyeS5kaXJlY3RvcnkgPSAxOworKwlyb290X2VudHJ5LmV4ZWN1dGFibGUgPSByb290X2VudHJ5LnN5bWxpbmsgPSAwOworKwlyb290X2VudHJ5Lm1vZGUgPSBTX0lGRElSOworKwlyb290X2VudHJ5Lm5hbWUgPSAiIjsKKysJcm9vdF9lbnRyeS5pdGVtLnRyZWUgPSByb290X3RyZWU7CisrCXJvb3RfZW50cnkucGFyZW50ID0gTlVMTDsKKyt9CisrCisrc3RhdGljIGludCBwcmVwYXJlX2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0pCisreworKwlpZiAoIWVsZW0tPmRpcmVjdG9yeSkKKysJCXJldHVybiAtMTsKKysJaWYgKCFlbGVtLT5pdGVtLnRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKysJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmU7CisrCQlpZiAocGFyc2VfdHJlZShlbGVtLT5pdGVtLnRyZWUpKQorKwkJCXJldHVybiAtMTsKKysJCS8qIFNldCB1cCB0aGUgcGFyZW50IGxpbmsgKi8KKysJCWZvciAoZSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsgZTsgZSA9IGUtPm5leHQpCisrCQkJZS0+cGFyZW50ID0gZWxlbTsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnlfMChzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplbGVtLAorKwkJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwljb25zdCBjaGFyICplcDsKKysJaW50IGxlbjsKKysKKysJd2hpbGUgKHBhdGggPCBwYXRoX2VuZCkgeworKwkJaWYgKHByZXBhcmVfY2hpbGRyZW4oZWxlbSkpCisrCQkJcmV0dXJuIE5VTEw7CisrCisrCQkvKiBJbiBlbGVtLT50cmVlLT5lbnRyaWVzLCBmaW5kIHRoZSBvbmUgdGhhdCBoYXMgbmFtZQorKwkJICogdGhhdCBtYXRjaGVzIHdoYXQgaXMgYmV0d2VlbiBwYXRoIGFuZCBlcC4KKysJCSAqLworKwkJZWxlbSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsKKysKKysJCWVwID0gc3RyY2hyKHBhdGgsICcvJyk7CisrCQlpZiAoIWVwIHx8IHBhdGhfZW5kIDw9IGVwKQorKwkJCWVwID0gcGF0aF9lbmQ7CisrCQlsZW4gPSBlcCAtIHBhdGg7CisrCisrCQl3aGlsZSAoZWxlbSkgeworKwkJCWlmICgoc3RybGVuKGVsZW0tPm5hbWUpID09IGxlbikgJiYKKysJCQkgICAgIXN0cm5jbXAoZWxlbS0+bmFtZSwgcGF0aCwgbGVuKSkKKysJCQkJYnJlYWs7CisrCQkJZWxlbSA9IGVsZW0tPm5leHQ7CisrCQl9CisrCQlpZiAocGF0aF9lbmQgPD0gZXAgfHwgIWVsZW0pCisrCQkJcmV0dXJuIGVsZW07CisrCQl3aGlsZSAoKmVwID09ICcvJyAmJiBlcCA8IHBhdGhfZW5kKQorKwkJCWVwKys7CisrCQlwYXRoID0gZXA7CisrCX0KKysJcmV0dXJuIE5VTEw7CisrfQorKworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5KGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJLyogRmluZCB0cmVlIGVsZW1lbnQsIGRlc2NlbmRpbmcgZnJvbSByb290LCB0aGF0CisrCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBwYXRoLCBsYXppbHkgZXhwYW5kaW5nCisrCSAqIHRoZSB0cmVlIGlmIHBvc3NpYmxlLgorKwkgKi8KKysJaWYgKHBhdGggPT0gcGF0aF9lbmQpIHsKKysJCS8qIFNwZWNpYWwuICBUaGlzIGlzIHRoZSByb290IGxldmVsICovCisrCQlyZXR1cm4gJnJvb3RfZW50cnk7CisrCX0KKysJcmV0dXJuIGZpbmRfZW50cnlfMCgmcm9vdF9lbnRyeSwgcGF0aCwgcGF0aF9lbmQpOworK30KKysKKytzdGF0aWMgdm9pZCBzaG93X2VudHJ5X25hbWUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCS8qIFRoaXMgaXMgeXVja3kuICBUaGUgcm9vdCBsZXZlbCBpcyB0aGVyZSBmb3IKKysJICogb3VyIGNvbnZlbmllbmNlIGJ1dCB3ZSByZWFsbHkgd2FudCB0byBkbyBhCisrCSAqIGZvcmVzdC4KKysJICovCisrCWlmIChlLT5wYXJlbnQgJiYgZS0+cGFyZW50ICE9ICZyb290X2VudHJ5KSB7CisrCQlzaG93X2VudHJ5X25hbWUoZS0+cGFyZW50KTsKKysJCXB1dGNoYXIoJy8nKTsKKysJfQorKwlwcmludGYoIiVzIiwgZS0+bmFtZSk7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV90eXBlKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gKGUtPmRpcmVjdG9yeSA/ICJ0cmVlIiA6ICJibG9iIik7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV9oZXgoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiBzaGExX3RvX2hleChlLT5kaXJlY3RvcnkKKysJCQkgICA/IGUtPml0ZW0udHJlZS0+b2JqZWN0LnNoYTEKKysJCQkgICA6IGUtPml0ZW0uYmxvYi0+b2JqZWN0LnNoYTEpOworK30KKysKKysvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBtdXR1YWxseSByZWN1cnNpdmUgcm91dGluZXMgKi8KKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqLCBpbnQpOworKworK3N0YXRpYyBpbnQgc2hvd19jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplLCBpbnQgbGV2ZWwpCisreworKwlpZiAocHJlcGFyZV9jaGlsZHJlbihlKSkKKysJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGxzLXRyZWUgc2hvd19jaGlsZHJlbiBjYWxsZWQgd2l0aCBub24gdHJlZSIpOworKwllID0gZS0+aXRlbS50cmVlLT5lbnRyaWVzOworKwl3aGlsZSAoZSkgeworKwkJc2hvd19lbnRyeShlLCBsZXZlbCk7CisrCQllID0gZS0+bmV4dDsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWludCBlcnIgPSAwOyAKKysKKysJaWYgKGUgIT0gJnJvb3RfZW50cnkpIHsKKysJCXByaW50ZigiJTA2byAlcyAlcwkiLCBlLT5tb2RlLCBlbnRyeV90eXBlKGUpLAorKwkJICAgICAgIGVudHJ5X2hleChlKSk7CisrCQlzaG93X2VudHJ5X25hbWUoZSk7CisrCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworKwl9CisrCisrCWlmIChlLT5kaXJlY3RvcnkpIHsKKysJCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBjYXNlczoKKysJCSAqICgxKSBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVxdWVzdCAoZXhwbGljaXQgcGF0aCBmcm9tIHRoZQorKwkJICogICAgIGNvbW1hbmQgbGluZSwgb3IgInJvb3QiIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSkuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIHNob3cgZGlyZWN0IGNoaWxkcmVuLiAgV2UgZG8gbm90IAorKwkJICogICAgIHJlY3Vyc2UgaW50byB0aGVtLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBkbyByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIGRvIG5vdCByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAoMikgV2UgY2FtZSBoZXJlIGJlY2F1c2Ugb3VyIGNhbGxlciBpcyBlaXRoZXIgKDEtYSkgb3IKKysJCSAqICAgICAoMS1iKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2UgZG8gbm90IHNob3cgb3VyIGNoaWxkcmVuICh3aGljaAorKwkJICogICAgIGFyZSBncmFuZGNoaWxkcmVuIGZvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGNvbnRpbnVlIHRvIHJlY3Vyc2UgaW50byBvdXIgY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIHNob3VsZCBub3QgaGF2ZSBjb21lIGhlcmUgdG8gYmVnaW4gd2l0aC4KKysJCSAqLworKwkJaWYgKGxldmVsID09IDAgJiYgIShsc19vcHRpb25zICYgTFNfVFJFRV9PTkxZKSkKKysJCQkvKiBjYXNlICgxKS1hIGFuZCAoMSktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisrCQllbHNlIGlmIChsZXZlbCAmJiBsc19vcHRpb25zICYgTFNfUkVDVVJTSVZFKQorKwkJCS8qIGNhc2UgKDIpLWIgKi8KKysJCQllcnIgPSBlcnIgfCBzaG93X2NoaWxkcmVuKGUsIGxldmVsKzEpOworKwl9CisrCXJldHVybiBlcnI7CisrfQorKworK3N0YXRpYyBpbnQgbGlzdF9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwlpbnQgZXJyID0gMDsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSA9IGZpbmRfZW50cnkocGF0aCwgcGF0aF9lbmQpOworKwlpZiAoIWUpIHsKKysJCS8qIHRyYWRpdGlvbmFsbHkgbHMtdHJlZSBkb2VzIG5vdCBjb21wbGFpbiBhYm91dAorKwkJICogbWlzc2luZyBwYXRoLiAgV2UgbWF5IGNoYW5nZSB0aGlzIGxhdGVyIHRvIG1hdGNoCisrCQkgKiB3aGF0ICIvYmluL2xzIC1hIiBkb2VzLCB3aGljaCBpcyB0byBjb21wbGFpbi4KKysJCSAqLworKwkJcmV0dXJuIGVycjsKKysJfQorKwllcnIgPSBlcnIgfCBzaG93X2VudHJ5KGUsIDApOworKwlyZXR1cm4gZXJyOworK30KKysKKytzdGF0aWMgaW50IGxpc3QoY2hhciAqKnBhdGgpCisreworKwlpbnQgaTsKKysJaW50IGVyciA9IDA7CisrCWZvciAoaSA9IDA7IHBhdGhbaV07IGkrKykgeworKwkJaW50IGxlbiA9IHN0cmxlbihwYXRoW2ldKTsKKysJCXdoaWxlICgwIDw9IGxlbiAmJiBwYXRoW2ldW2xlbl0gPT0gJy8nKQorKwkJCWxlbi0tOworKwkJZXJyID0gZXJyIHwgbGlzdF9vbmUocGF0aFtpXSwgcGF0aFtpXSArIGxlbik7CisrCX0KKysJcmV0dXJuIGVycjsKKyt9CisrCisrc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPQorKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworKworK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCXN0YXRpYyBjaGFyICpwYXRoMFtdID0geyAiIiwgTlVMTCB9OworKwljaGFyICoqcGF0aDsKKysJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKysKKysJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisrCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKKysJCWNhc2UgJ3onOgorKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSAncic6CisrCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisrCQkJYnJlYWs7CisrCQljYXNlICdkJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisrCQl9CisrCQlhcmdjLS07IGFyZ3YrKzsKKysJfQorKworKwlpZiAoYXJnYyA8IDIpCisrCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKysJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpIDwgMCkKKysJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworKworKwlwYXRoID0gKGFyZ2MgPT0gMikgPyBwYXRoMCA6IChhcmd2ICsgMik7CisrCXByZXBhcmVfcm9vdChzaGExKTsKKysJaWYgKGxpc3QocGF0aCkgPCAwKQorKwkJZGllKCJsaXN0IGZhaWxlZCIpOworKwlyZXR1cm4gMDsKKyt9CitkaWZmIC0tZ2l0IGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCistLS0gYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKysrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorQEAgLTc0LDggKzc0LDggQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdscy10cmVlIGZpbHRlcmVkJyBcCisgICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKy0xMDA2NDQgYmxvYiBYCXBhdGgwCisgMTIwMDAwIGJsb2IgWAlwYXRoMQorKzEwMDY0NCBibG9iIFgJcGF0aDAKKyBFT0YKKyAgICAgIHRlc3Rfb3V0cHV0JworIAorQEAgLTg1LDcgKzg1LDYgQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorIDA0MDAwMCB0cmVlIFgJcGF0aDIKKyAwNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorLTEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKyAxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisgMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KKyBFT0YKK2RpZmYgLS1naXQgYS90cmVlLmMgYi90cmVlLmMKKy0tLSBhL3RyZWUuYworKysrIGIvdHJlZS5jCitAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwKKyAJCX0KKyAJCWlmIChvYmopCisgCQkJYWRkX3JlZigmaXRlbS0+b2JqZWN0LCBvYmopOworLQorKwkJZW50cnktPnBhcmVudCA9IE5VTEw7IC8qIG5lZWRzIHRvIGJlIGZpbGxlZCBieSB0aGUgdXNlciAqLworIAkJKmxpc3RfcCA9IGVudHJ5OworIAkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworIAl9CitkaWZmIC0tZ2l0IGEvdHJlZS5oIGIvdHJlZS5oCistLS0gYS90cmVlLmgKKysrKyBiL3RyZWUuaAorQEAgLTE2LDYgKzE2LDcgQEAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCB7CisgCQlzdHJ1Y3QgdHJlZSAqdHJlZTsKKyAJCXN0cnVjdCBibG9iICpibG9iOworIAl9IGl0ZW07CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKnBhcmVudDsKKyB9OworIAorIHN0cnVjdCB0cmVlIHsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMwMjhiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIHQvdDAwMDAtYmFzaWMuc2ggfCAgICAwIAorIHQvdGVzdC1saWIuc2ggICAgfCAgICAwIAorIDIgZmlsZXMgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90MDAwMC1iYXNpYy5zaAorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90ZXN0LWxpYi5zaApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTQucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU2YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQucGF0Y2gKQEAgLTAsMCArMSw3IEBACitjZWVkZTU5ZWE5MGNlYmFkNTJiYTljODI2M2ZlZjNmYjZlZjE3NTkzIChmcm9tIDM2OGY5OWQ1N2U4ZWQxNzI0M2YyZTE2NDQzMTQ0OWQ0OGJmY2EyZmIpCitkaWZmIC0tZ2l0IGEvdC90MDAwMC1iYXNpYy5zaCBiL3QvdDAwMDAtYmFzaWMuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CitkaWZmIC0tZ2l0IGEvdC90ZXN0LWxpYi5zaCBiL3QvdGVzdC1saWIuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4N2RmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS01LmV4cGVjdApAQCAtMCwwICsxLDE5IEBACisgRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0ICAgIHwgICA1MCAtLS0tLS0tLS0tLS0tLS0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0ICAgIHwgICAzMCAtLS0tLS0tLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQgfCAgIDUwICsrKysrKysrKysrKysrKysrKysKKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQgfCAgIDMwICsrKysrKysrKysrKworIERvY3VtZW50YXRpb24vZ2l0LnR4dCAgICAgICAgICB8ICAgIDYgKy0KKyBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICstCisgcnB1bGwuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4MyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHJwdXNoLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHNzaC1wdWxsLmMgICAgICAgICAgICAgICAgICAgICB8ICAgODMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBzc2gtcHVzaC5jICAgICAgICAgICAgICAgICAgICAgfCAgMTA0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAxMCBmaWxlcyBjaGFuZ2VkLCAyNzMgaW5zZXJ0aW9ucygrKSwgMjczIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKyBkZWxldGUgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CisgY3JlYXRlIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorIGNyZWF0ZSBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKKyBkZWxldGUgcnB1bGwuYworIGRlbGV0ZSBycHVzaC5jCisgY3JlYXRlIHNzaC1wdWxsLmMKKyBjcmVhdGUgc3NoLXB1c2guYwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTUucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTExNjIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTUucGF0Y2gKQEAgLTAsMCArMSw2MTIgQEAKK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorKysrIC9kZXYvbnVsbAorQEAgLTEsNTAgKzAsMCBAQAorLWdpdC1ycHVsbCgxKQorLT09PT09PT09PT09PQorLXYwLjEsIE1heSAyMDA1CistCistTkFNRQorLS0tLS0KKy1naXQtcnB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorLQorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1QdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXJwdXNoIG9uCistdGhlIG90aGVyIGVuZC4KKy0KKy1PUFRJT05TCistLS0tLS0tLQorLS1jOjoKKy0JR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy0tdDo6CistCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLS1hOjoKKy0JR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy0tZDo6CistCURvIG5vdCBjaGVjayBmb3IgZGVsdGEgYmFzZSBvYmplY3RzICh1c2UgdGhpcyBvcHRpb24KKy0Jb25seSB3aGVuIHlvdSBrbm93IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBub3QKKy0JZGVsdGlmaWVkKS4KKy0tLXJlY292ZXI6OgorLQlDaGVjayBkZXBlbmRlbmN5IG9mIGRlbHRpZmllZCBvYmplY3QgbW9yZSBjYXJlZnVsbHkgdGhhbgorLQl1c3VhbCwgdG8gcmVjb3ZlciBhZnRlciBlYXJsaWVyIHB1bGwgdGhhdCB3YXMgaW50ZXJydXB0ZWQuCistLXY6OgorLQlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKysrKyAvZGV2L251bGwKK0BAIC0xLDMwICswLDAgQEAKKy1naXQtcnB1c2goMSkKKy09PT09PT09PT09PT0KKy12MC4xLCBNYXkgMjAwNQorLQorLU5BTUUKKy0tLS0tCistZ2l0LXJwdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdXNoJworLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1IZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CistLS0gL2Rldi9udWxsCisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK0BAIC0wLDAgKzEsNTAgQEAKKytnaXQtc3NoLXB1bGwoMSkKKys9PT09PT09PT09PT09PT0KKyt2MC4xLCBNYXkgMjAwNQorKworK05BTUUKKystLS0tCisrZ2l0LXNzaC1wdWxsIC0gUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKysKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1zc2gtcHVzaAorK29uIHRoZSBvdGhlciBlbmQuCisrCisrT1BUSU9OUworKy0tLS0tLS0KKystYzo6CisrCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCisrLXQ6OgorKwlHZXQgdHJlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21taXQgb2JqZWN0cy4KKystYTo6CisrCUdldCBhbGwgdGhlIG9iamVjdHMuCisrLWQ6OgorKwlEbyBub3QgY2hlY2sgZm9yIGRlbHRhIGJhc2Ugb2JqZWN0cyAodXNlIHRoaXMgb3B0aW9uCisrCW9ubHkgd2hlbiB5b3Uga25vdyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaXMgbm90CisrCWRlbHRpZmllZCkuCisrLS1yZWNvdmVyOjoKKysJQ2hlY2sgZGVwZW5kZW5jeSBvZiBkZWx0aWZpZWQgb2JqZWN0IG1vcmUgY2FyZWZ1bGx5IHRoYW4KKysJdXN1YWwsIHRvIHJlY292ZXIgYWZ0ZXIgZWFybGllciBwdWxsIHRoYXQgd2FzIGludGVycnVwdGVkLgorKy12OjoKKysJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorLS0tIC9kZXYvbnVsbAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitAQCAtMCwwICsxLDMwIEBACisrZ2l0LXNzaC1wdXNoKDEpCisrPT09PT09PT09PT09PT09CisrdjAuMSwgTWF5IDIwMDUKKysKKytOQU1FCisrLS0tLQorK2dpdC1zc2gtcHVzaCAtIEhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVzaCcKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKK0BAIC0xNDgsNyArMTQ4LDcgQEAgbGluazpnaXQtcmVzb2x2ZS1zY3JpcHQuaHRtbFtnaXQtcmVzb2x2ZQorIGxpbms6Z2l0LXRhZy1zY3JpcHQuaHRtbFtnaXQtdGFnLXNjcmlwdF06OgorIAlBbiBleGFtcGxlIHNjcmlwdCB0byBjcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworIAorLWxpbms6Z2l0LXJwdWxsLmh0bWxbZ2l0LXJwdWxsXTo6CisrbGluazpnaXQtc3NoLXB1bGwuaHRtbFtnaXQtc3NoLXB1bGxdOjoKKyAJUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKyAKKyBJbnRlcm9nYXRvcnM6CitAQCAtMTU2LDggKzE1Niw4IEBAIEludGVyb2dhdG9yczoKKyBsaW5rOmdpdC1kaWZmLWhlbHBlci5odG1sW2dpdC1kaWZmLWhlbHBlcl06OgorIAlHZW5lcmF0ZXMgcGF0Y2ggZm9ybWF0IG91dHB1dCBmb3IgZ2l0LWRpZmYtKgorIAorLWxpbms6Z2l0LXJwdXNoLmh0bWxbZ2l0LXJwdXNoXTo6CistCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwKKytsaW5rOmdpdC1zc2gtcHVzaC5odG1sW2dpdC1zc2gtcHVzaF06OgorKwlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsCisgCisgCisgCitkaWZmIGEvTWFrZWZpbGUgYi9NYWtlZmlsZQorLS0tIGEvTWFrZWZpbGUKKysrKyBiL01ha2VmaWxlCitAQCAtMzAsNyArMzAsNyBAQCBQUk9HPSAgIGdpdC11cGRhdGUtY2FjaGUgZ2l0LWRpZmYtZmlsZXMgCisgCWdpdC1jaGVja291dC1jYWNoZSBnaXQtZGlmZi10cmVlIGdpdC1yZXYtdHJlZSBnaXQtbHMtZmlsZXMgXAorIAlnaXQtY2hlY2stZmlsZXMgZ2l0LWxzLXRyZWUgZ2l0LW1lcmdlLWJhc2UgZ2l0LW1lcmdlLWNhY2hlIFwKKyAJZ2l0LXVucGFjay1maWxlIGdpdC1leHBvcnQgZ2l0LWRpZmYtY2FjaGUgZ2l0LWNvbnZlcnQtY2FjaGUgXAorLQlnaXQtaHR0cC1wdWxsIGdpdC1ycHVzaCBnaXQtcnB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisrCWdpdC1odHRwLXB1bGwgZ2l0LXNzaC1wdXNoIGdpdC1zc2gtcHVsbCBnaXQtcmV2LWxpc3QgZ2l0LW1rdGFnIFwKKyAJZ2l0LWRpZmYtaGVscGVyIGdpdC10YXItdHJlZSBnaXQtbG9jYWwtcHVsbCBnaXQtd3JpdGUtYmxvYiBcCisgCWdpdC1nZXQtdGFyLWNvbW1pdC1pZCBnaXQtbWtkZWx0YSBnaXQtYXBwbHkgZ2l0LXN0cmlwc3BhY2UKKyAKK0BAIC0xMDUsOCArMTA1LDggQEAgZ2l0LWRpZmYtY2FjaGU6IGRpZmYtY2FjaGUuYworIGdpdC1jb252ZXJ0LWNhY2hlOiBjb252ZXJ0LWNhY2hlLmMKKyBnaXQtaHR0cC1wdWxsOiBodHRwLXB1bGwuYyBwdWxsLmMKKyBnaXQtbG9jYWwtcHVsbDogbG9jYWwtcHVsbC5jIHB1bGwuYworLWdpdC1ycHVzaDogcnNoLmMKKy1naXQtcnB1bGw6IHJzaC5jIHB1bGwuYworK2dpdC1zc2gtcHVzaDogcnNoLmMKKytnaXQtc3NoLXB1bGw6IHJzaC5jIHB1bGwuYworIGdpdC1yZXYtbGlzdDogcmV2LWxpc3QuYworIGdpdC1ta3RhZzogbWt0YWcuYworIGdpdC1kaWZmLWhlbHBlcjogZGlmZi1oZWxwZXIuYworZGlmZiBhL3JwdWxsLmMgYi9ycHVsbC5jCistLS0gYS9ycHVsbC5jCisrKysgL2Rldi9udWxsCitAQCAtMSw4MyArMCwwIEBACistI2luY2x1ZGUgImNhY2hlLmgiCistI2luY2x1ZGUgImNvbW1pdC5oIgorLSNpbmNsdWRlICJyc2guaCIKKy0jaW5jbHVkZSAicHVsbC5oIgorLQorLXN0YXRpYyBpbnQgZmRfaW47Cistc3RhdGljIGludCBmZF9vdXQ7CistCistc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworLQorLWludCBmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQorLXsKKy0JaW50IHJldDsKKy0Jc2lnbmVkIGNoYXIgcmVtb3RlOworLQljaGFyIHR5cGUgPSAnbyc7CistCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKQorLQkJcmV0dXJuIDA7CistCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworLQl3cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKy0JCXJldHVybiAtMTsKKy0JaWYgKHJlbW90ZSA8IDApCistCQlyZXR1cm4gcmVtb3RlOworLQlyZXQgPSB3cml0ZV9zaGExX2Zyb21fZmQoc2hhMSwgZmRfaW4pOworLQlpZiAoIXJldCkKKy0JCXB1bGxfc2F5KCJnb3QgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JcmV0dXJuIHJldDsKKy19CistCistaW50IGdldF92ZXJzaW9uKHZvaWQpCisteworLQljaGFyIHR5cGUgPSAndic7CistCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworLQl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKSB7CistCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IHJlYWQgdmVyc2lvbiBmcm9tIHJlbW90ZSBlbmQiKTsKKy0JfQorLQlyZXR1cm4gMDsKKy19CistCistaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorLXsKKy0JY2hhciAqY29tbWl0X2lkOworLQljaGFyICp1cmw7CistCWludCBhcmcgPSAxOworLQorLQl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CistCQlpZiAoYXJndlthcmddWzFdID09ICd0JykgeworLQkJCWdldF90cmVlID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworLQkJCWdldF9oaXN0b3J5ID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdkJykgeworLQkJCWdldF9kZWx0YSA9IDA7CistCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKy0JCQlnZXRfZGVsdGEgPSAyOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CistCQkJZ2V0X2FsbCA9IDE7CistCQkJZ2V0X3RyZWUgPSAxOworLQkJCWdldF9oaXN0b3J5ID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworLQkJCWdldF92ZXJib3NlbHkgPSAxOworLQkJfQorLQkJYXJnKys7CistCX0KKy0JaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CistCQl1c2FnZSgiZ2l0LXJwdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CistCQlyZXR1cm4gMTsKKy0JfQorLQljb21taXRfaWQgPSBhcmd2W2FyZ107CistCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCistCQlyZXR1cm4gMTsKKy0KKy0JaWYgKGdldF92ZXJzaW9uKCkpCistCQlyZXR1cm4gMTsKKy0KKy0JaWYgKHB1bGwoY29tbWl0X2lkKSkKKy0JCXJldHVybiAxOworLQorLQlyZXR1cm4gMDsKKy19CitkaWZmIGEvcnB1c2guYyBiL3JwdXNoLmMKKy0tLSBhL3JwdXNoLmMKKysrKyAvZGV2L251bGwKK0BAIC0xLDEwNCArMCwwIEBACistI2luY2x1ZGUgImNhY2hlLmgiCistI2luY2x1ZGUgInJzaC5oIgorLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CistI2luY2x1ZGUgPGVycm5vLmg+CistCistdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKKy11bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKKy0KKy1pbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgeworLQlzc2l6ZV90IHNpemU7CistCWludCBwb3NuID0gMDsKKy0JY2hhciBzaGExWzIwXTsKKy0JdW5zaWduZWQgbG9uZyBvYmpzaXplOworLQl2b2lkICpidWY7CistCXNpZ25lZCBjaGFyIHJlbW90ZTsKKy0JZG8geworLQkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworLQkJaWYgKHNpemUgPCAwKSB7CistCQkJcGVycm9yKCJnaXQtcnB1c2g6IHJlYWQgIik7CistCQkJcmV0dXJuIC0xOworLQkJfQorLQkJaWYgKCFzaXplKQorLQkJCXJldHVybiAtMTsKKy0JCXBvc24gKz0gc2l6ZTsKKy0JfSB3aGlsZSAocG9zbiA8IDIwKTsKKy0JCistCS8qIGZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOyAqLworLQlyZW1vdGUgPSAwOworLQkKKy0JYnVmID0gbWFwX3NoYTFfZmlsZShzaGExLCAmb2Jqc2l6ZSk7CistCQorLQlpZiAoIWJ1ZikgeworLQkJZnByaW50ZihzdGRlcnIsICJnaXQtcnB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKy0JCQlzaGExX3RvX2hleChzaGExKSk7CistCQlyZW1vdGUgPSAtMTsKKy0JfQorLQkKKy0Jd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKy0JCistCWlmIChyZW1vdGUgPCAwKQorLQkJcmV0dXJuIDA7CistCQorLQlwb3NuID0gMDsKKy0JZG8geworLQkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworLQkJaWYgKHNpemUgPD0gMCkgeworLQkJCWlmICghc2l6ZSkgeworLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogd3JpdGUgY2xvc2VkIik7CistCQkJfSBlbHNlIHsKKy0JCQkJcGVycm9yKCJnaXQtcnB1c2g6IHdyaXRlICIpOworLQkJCX0KKy0JCQlyZXR1cm4gLTE7CistCQl9CistCQlwb3NuICs9IHNpemU7CistCX0gd2hpbGUgKHBvc24gPCBvYmpzaXplKTsKKy0JcmV0dXJuIDA7CistfQorLQorLWludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKKy17CistCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlX3ZlcnNpb24sIDEpIDwgMSkKKy0JCXJldHVybiAtMTsKKy0Jd3JpdGUoZmRfb3V0LCAmbG9jYWxfdmVyc2lvbiwgMSk7CistCXJldHVybiAwOworLX0KKy0KKy12b2lkIHNlcnZpY2UoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CistCWNoYXIgdHlwZTsKKy0JaW50IHJldHZhbDsKKy0JZG8geworLQkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworLQkJaWYgKHJldHZhbCA8IDEpIHsKKy0JCQlpZiAocmV0dmFsIDwgMCkKKy0JCQkJcGVycm9yKCJycHVzaDogcmVhZCAiKTsKKy0JCQlyZXR1cm47CistCQl9CistCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKKy0JCQlyZXR1cm47CistCQlpZiAodHlwZSA9PSAnbycgJiYgc2VydmVfb2JqZWN0KGZkX2luLCBmZF9vdXQpKQorLQkJCXJldHVybjsKKy0JfSB3aGlsZSAoMSk7CistfQorLQorLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKy17CistCWludCBhcmcgPSAxOworLSAgICAgICAgY2hhciAqY29tbWl0X2lkOworLSAgICAgICAgY2hhciAqdXJsOworLQlpbnQgZmRfaW4sIGZkX291dDsKKy0Jd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworLSAgICAgICAgICAgICAgICBhcmcrKzsKKy0gICAgICAgIH0KKy0gICAgICAgIGlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CistICAgICAgICAgICAgICAgIHJldHVybiAxOworLSAgICAgICAgfQorLQljb21taXRfaWQgPSBhcmd2W2FyZ107CistCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCistCQlyZXR1cm4gMTsKKy0KKy0Jc2VydmljZShmZF9pbiwgZmRfb3V0KTsKKy0JcmV0dXJuIDA7CistfQorZGlmZiBhL3NzaC1wdWxsLmMgYi9zc2gtcHVsbC5jCistLS0gL2Rldi9udWxsCisrKysgYi9zc2gtcHVsbC5jCitAQCAtMCwwICsxLDgzIEBACisrI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgImNvbW1pdC5oIgorKyNpbmNsdWRlICJyc2guaCIKKysjaW5jbHVkZSAicHVsbC5oIgorKworK3N0YXRpYyBpbnQgZmRfaW47Cisrc3RhdGljIGludCBmZF9vdXQ7CisrCisrc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworKworK2ludCBmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQorK3sKKysJaW50IHJldDsKKysJc2lnbmVkIGNoYXIgcmVtb3RlOworKwljaGFyIHR5cGUgPSAnbyc7CisrCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKQorKwkJcmV0dXJuIDA7CisrCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworKwl3cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKysJCXJldHVybiAtMTsKKysJaWYgKHJlbW90ZSA8IDApCisrCQlyZXR1cm4gcmVtb3RlOworKwlyZXQgPSB3cml0ZV9zaGExX2Zyb21fZmQoc2hhMSwgZmRfaW4pOworKwlpZiAoIXJldCkKKysJCXB1bGxfc2F5KCJnb3QgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysJcmV0dXJuIHJldDsKKyt9CisrCisraW50IGdldF92ZXJzaW9uKHZvaWQpCisreworKwljaGFyIHR5cGUgPSAndic7CisrCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKSB7CisrCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IHJlYWQgdmVyc2lvbiBmcm9tIHJlbW90ZSBlbmQiKTsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorK3sKKysJY2hhciAqY29tbWl0X2lkOworKwljaGFyICp1cmw7CisrCWludCBhcmcgPSAxOworKworKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisrCQlpZiAoYXJndlthcmddWzFdID09ICd0JykgeworKwkJCWdldF90cmVlID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworKwkJCWdldF9oaXN0b3J5ID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdkJykgeworKwkJCWdldF9kZWx0YSA9IDA7CisrCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKysJCQlnZXRfZGVsdGEgPSAyOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CisrCQkJZ2V0X2FsbCA9IDE7CisrCQkJZ2V0X3RyZWUgPSAxOworKwkJCWdldF9oaXN0b3J5ID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworKwkJCWdldF92ZXJib3NlbHkgPSAxOworKwkJfQorKwkJYXJnKys7CisrCX0KKysJaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CisrCQl1c2FnZSgiZ2l0LXNzaC1wdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CisrCQlyZXR1cm4gMTsKKysJfQorKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisrCXVybCA9IGFyZ3ZbYXJnICsgMV07CisrCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCQlyZXR1cm4gMTsKKysKKysJaWYgKGdldF92ZXJzaW9uKCkpCisrCQlyZXR1cm4gMTsKKysKKysJaWYgKHB1bGwoY29tbWl0X2lkKSkKKysJCXJldHVybiAxOworKworKwlyZXR1cm4gMDsKKyt9CitkaWZmIGEvc3NoLXB1c2guYyBiL3NzaC1wdXNoLmMKKy0tLSAvZGV2L251bGwKKysrKyBiL3NzaC1wdXNoLmMKK0BAIC0wLDAgKzEsMTA0IEBACisrI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgInJzaC5oIgorKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisrI2luY2x1ZGUgPGVycm5vLmg+CisrCisrdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKKyt1bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKKysKKytpbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgeworKwlzc2l6ZV90IHNpemU7CisrCWludCBwb3NuID0gMDsKKysJY2hhciBzaGExWzIwXTsKKysJdW5zaWduZWQgbG9uZyBvYmpzaXplOworKwl2b2lkICpidWY7CisrCXNpZ25lZCBjaGFyIHJlbW90ZTsKKysJZG8geworKwkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworKwkJaWYgKHNpemUgPCAwKSB7CisrCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisrCQkJcmV0dXJuIC0xOworKwkJfQorKwkJaWYgKCFzaXplKQorKwkJCXJldHVybiAtMTsKKysJCXBvc24gKz0gc2l6ZTsKKysJfSB3aGlsZSAocG9zbiA8IDIwKTsKKysJCisrCS8qIGZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOyAqLworKwlyZW1vdGUgPSAwOworKwkKKysJYnVmID0gbWFwX3NoYTFfZmlsZShzaGExLCAmb2Jqc2l6ZSk7CisrCQorKwlpZiAoIWJ1ZikgeworKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKysJCQlzaGExX3RvX2hleChzaGExKSk7CisrCQlyZW1vdGUgPSAtMTsKKysJfQorKwkKKysJd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKysJCisrCWlmIChyZW1vdGUgPCAwKQorKwkJcmV0dXJuIDA7CisrCQorKwlwb3NuID0gMDsKKysJZG8geworKwkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworKwkJaWYgKHNpemUgPD0gMCkgeworKwkJCWlmICghc2l6ZSkgeworKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1zc2gtcHVzaDogd3JpdGUgY2xvc2VkIik7CisrCQkJfSBlbHNlIHsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHdyaXRlICIpOworKwkJCX0KKysJCQlyZXR1cm4gLTE7CisrCQl9CisrCQlwb3NuICs9IHNpemU7CisrCX0gd2hpbGUgKHBvc24gPCBvYmpzaXplKTsKKysJcmV0dXJuIDA7CisrfQorKworK2ludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKKyt7CisrCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlX3ZlcnNpb24sIDEpIDwgMSkKKysJCXJldHVybiAtMTsKKysJd3JpdGUoZmRfb3V0LCAmbG9jYWxfdmVyc2lvbiwgMSk7CisrCXJldHVybiAwOworK30KKysKKyt2b2lkIHNlcnZpY2UoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisrCWNoYXIgdHlwZTsKKysJaW50IHJldHZhbDsKKysJZG8geworKwkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworKwkJaWYgKHJldHZhbCA8IDEpIHsKKysJCQlpZiAocmV0dmFsIDwgMCkKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisrCQkJcmV0dXJuOworKwkJfQorKwkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCisrCQkJcmV0dXJuOworKwkJaWYgKHR5cGUgPT0gJ28nICYmIHNlcnZlX29iamVjdChmZF9pbiwgZmRfb3V0KSkKKysJCQlyZXR1cm47CisrCX0gd2hpbGUgKDEpOworK30KKysKKytpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKwlpbnQgYXJnID0gMTsKKysgICAgICAgIGNoYXIgKmNvbW1pdF9pZDsKKysgICAgICAgIGNoYXIgKnVybDsKKysJaW50IGZkX2luLCBmZF9vdXQ7CisrCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKysgICAgICAgICAgICAgICAgYXJnKys7CisrICAgICAgICB9CisrICAgICAgICBpZiAoYXJnYyA8IGFyZyArIDIpIHsKKysJCXVzYWdlKCJnaXQtc3NoLXB1c2ggWy1jXSBbLXRdIFstYV0gY29tbWl0LWlkIHVybCIpOworKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKysgICAgICAgIH0KKysJY29tbWl0X2lkID0gYXJndlthcmddOworKwl1cmwgPSBhcmd2W2FyZyArIDFdOworKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtc3NoLXB1bGwiLCB1cmwsIGFyZywgYXJndiArIDEpKQorKwkJcmV0dXJuIDE7CisrCisrCXNlcnZpY2UoZmRfaW4sIGZkX291dCk7CisrCXJldHVybiAwOworK30KZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS02LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS02LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM0M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIE1ha2VmaWxlICAgICAgICAgfCAgICAyICstCisgZ2l0LWZldGNoLXNjcmlwdCB8ICAgNDEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBnaXQtcHVsbC1zY3JpcHQgIHwgICAzNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCAzNCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgZ2l0LWZldGNoLXNjcmlwdApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTYucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc1MzYzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTYucGF0Y2gKQEAgLTAsMCArMSwxMDEgQEAKK2RpZmYgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0yMCw3ICsyMCw3IEBAIElOU1RBTEw9aW5zdGFsbAorIAorIFNDUklQVFM9Z2l0LWFwcGx5LXBhdGNoLXNjcmlwdCBnaXQtbWVyZ2Utb25lLWZpbGUtc2NyaXB0IGdpdC1wcnVuZS1zY3JpcHQgXAorIAlnaXQtcHVsbC1zY3JpcHQgZ2l0LXRhZy1zY3JpcHQgZ2l0LXJlc29sdmUtc2NyaXB0IGdpdC13aGF0Y2hhbmdlZCBcCistCWdpdC1kZWx0YWZ5LXNjcmlwdAorKwlnaXQtZGVsdGFmeS1zY3JpcHQgZ2l0LWZldGNoLXNjcmlwdAorIAorIFBST0c9ICAgZ2l0LXVwZGF0ZS1jYWNoZSBnaXQtZGlmZi1maWxlcyBnaXQtaW5pdC1kYiBnaXQtd3JpdGUtdHJlZSBcCisgCWdpdC1yZWFkLXRyZWUgZ2l0LWNvbW1pdC10cmVlIGdpdC1jYXQtZmlsZSBnaXQtZnNjay1jYWNoZSBcCitkaWZmIGEvZ2l0LWZldGNoLXNjcmlwdCBiL2dpdC1mZXRjaC1zY3JpcHQKKy0tLSAvZGV2L251bGwKKysrKyBiL2dpdC1mZXRjaC1zY3JpcHQKK0BAIC0wLDAgKzEsNDEgQEAKKysjIS9iaW4vc2gKKysjCisrbWVyZ2VfcmVwbz0kMQorK21lcmdlX25hbWU9JHsyOi1IRUFEfQorKworKzogJHtHSVRfRElSPS5naXR9CisrOiAke0dJVF9PQkpFQ1RfRElSRUNUT1JZPSIke1NIQTFfRklMRV9ESVJFQ1RPUlktIiRHSVRfRElSL29iamVjdHMifSJ9CisrCisrZG93bmxvYWRfb25lICgpIHsKKysJIyByZW1vdGVfcGF0aD0iJDEiIGxvY2FsX2ZpbGU9IiQyIgorKwljYXNlICIkMSIgaW4KKysJaHR0cDovLyopCisrCQl3Z2V0IC1xIC1PICIkMiIgIiQxIiA7OworKwkvKikKKysJCXRlc3QgLWYgIiQxIiAmJiBjYXQgPiIkMiIgIiQxIiA7OworKwkqKQorKwkJcnN5bmMgLUwgIiQxIiAiJDIiIDs7CisrCWVzYWMKKyt9CisrCisrZG93bmxvYWRfb2JqZWN0cyAoKSB7CisrCSMgcmVtb3RlX3JlcG89IiQxIiBoZWFkX3NoYTE9IiQyIgorKwljYXNlICIkMSIgaW4KKysJaHR0cDovLyopCisrCQlnaXQtaHR0cC1wdWxsIC1hICIkMiIgIiQxLyIKKysJCTs7CisrCS8qKQorKwkJZ2l0LWxvY2FsLXB1bGwgLWwgLWEgIiQyIiAiJDEvIgorKwkJOzsKKysJKikKKysJCXJzeW5jIC1hdnogLS1pZ25vcmUtZXhpc3RpbmcgXAorKwkJCSIkMS9vYmplY3RzLy4iICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiLy4KKysJCTs7CisrCWVzYWMKKyt9CisrCisrZWNobyAiR2V0dGluZyByZW1vdGUgJG1lcmdlX25hbWUiCisrZG93bmxvYWRfb25lICIkbWVyZ2VfcmVwby8kbWVyZ2VfbmFtZSIgIiRHSVRfRElSIi9NRVJHRV9IRUFECisrCisrZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCisrZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorZGlmZiBhL2dpdC1wdWxsLXNjcmlwdCBiL2dpdC1wdWxsLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtcHVsbC1zY3JpcHQKK0BAIC02LDM5ICs2LDcgQEAgbWVyZ2VfbmFtZT0kezI6LUhFQUR9CisgOiAke0dJVF9ESVI9LmdpdH0KKyA6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiR7U0hBMV9GSUxFX0RJUkVDVE9SWS0iJEdJVF9ESVIvb2JqZWN0cyJ9In0KKyAKKy1kb3dubG9hZF9vbmUgKCkgeworLQkjIHJlbW90ZV9wYXRoPSIkMSIgbG9jYWxfZmlsZT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCXdnZXQgLXEgLU8gIiQyIiAiJDEiIDs7CistCS8qKQorLQkJdGVzdCAtZiAiJDEiICYmIGNhdCA+IiQyIiAiJDEiIDs7CistCSopCistCQlyc3luYyAtTCAiJDEiICIkMiIgOzsKKy0JZXNhYworLX0KKy0KKy1kb3dubG9hZF9vYmplY3RzICgpIHsKKy0JIyByZW1vdGVfcmVwbz0iJDEiIGhlYWRfc2hhMT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCWdpdC1odHRwLXB1bGwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JLyopCistCQlnaXQtbG9jYWwtcHVsbCAtbCAtYSAiJDIiICIkMS8iCistCQk7OworLQkqKQorLQkJcnN5bmMgLWF2eiAtLWlnbm9yZS1leGlzdGluZyBcCistCQkJIiQxL29iamVjdHMvLiIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIvLgorLQkJOzsKKy0JZXNhYworLX0KKy0KKy1lY2hvICJHZXR0aW5nIHJlbW90ZSAkbWVyZ2VfbmFtZSIKKy1kb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiJEdJVF9ESVIiL01FUkdFX0hFQUQKKy0KKy1lY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKy1kb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCisrZ2l0LWZldGNoLXNjcmlwdCAiJG1lcmdlX3JlcG8iICIkbWVyZ2VfbmFtZSIKKyAKKyBnaXQtcmVzb2x2ZS1zY3JpcHQgXAorIAkiJChjYXQgIiRHSVRfRElSIi9IRUFEKSIgXApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTcuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODMxNjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QKQEAgLTAsMCArMSw2IEBACisgRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQgfCAgIDIwICstCisgbHMtdHJlZS5jICAgICAgICAgICAgICAgICAgICAgfCAgMzMzICsrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCisgdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoICAgfCAgICAzIAorIHRyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiAKKyB0cmVlLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgCisgNSBmaWxlcyBjaGFuZ2VkLCAxOTkgaW5zZXJ0aW9ucygrKSwgMTYwIGRlbGV0aW9ucygtKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTcucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M2NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTcucGF0Y2gKQEAgLTAsMCArMSw0OTQgQEAKK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKK0BAIC00LDIzICs0LDI2IEBAIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtbHMtdHJlZSAtIERpc3BsYXlzIGEgdHJlZSBvYmplY3QgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQorK2dpdC1scy10cmVlIC0gTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QuCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtbHMtdHJlZScgWy1yXSBbLXpdIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorKydnaXQtbHMtdHJlZScgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUNvbnZlcnRzIHRoZSB0cmVlIG9iamVjdCB0byBhIGh1bWFuIHJlYWRhYmxlIChhbmQgc2NyaXB0IHByb2Nlc3NhYmxlKQorLWZvcm0uCisrTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QsIGxpa2Ugd2hhdCAiL2Jpbi9scyAtYSIgZG9lcworK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIAorIE9QVElPTlMKKyAtLS0tLS0tCisgPHRyZWUtaXNoPjo6CisgCUlkIG9mIGEgdHJlZS4KKyAKKystZDo6CisrCXNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4KKysKKyAtcjo6CisgCXJlY3Vyc2UgaW50byBzdWItdHJlZXMKKyAKK0BAIC0yOCwxOCArMzEsMTkgQEAgT1BUSU9OUworIAlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dAorIAorIHBhdGhzOjoKKy0JT3B0aW9uYWxseSwgcmVzdHJpY3QgdGhlIG91dHB1dCBvZiBnaXQtbHMtdHJlZSB0byBzcGVjaWZpYworLQlwYXRocy4gRGlyZWN0b3JpZXMgd2lsbCBvbmx5IGxpc3QgdGhlaXIgdHJlZSBibG9iIGlkcy4KKy0JSW1wbGllcyAtci4KKysJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3dzIHRoZW0uICBPdGhlcndpc2UgaW1wbGljaXRseQorKwl1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisrCisgCisgT3V0cHV0IEZvcm1hdAorIC0tLS0tLS0tLS0tLS0KKy0gICAgICAgIDxtb2RlPlx0CTx0eXBlPlx0CTxvYmplY3Q+XHQJPGZpbGU+CisrICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKyAKKyAKKyBBdXRob3IKKyAtLS0tLS0KKyBXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKytDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorIAorIERvY3VtZW50YXRpb24KKyAtLS0tLS0tLS0tLS0tLQorZGlmZiBhL2xzLXRyZWUuYyBiL2xzLXRyZWUuYworLS0tIGEvbHMtdHJlZS5jCisrKysgYi9scy10cmVlLmMKK0BAIC00LDE4OCArNCwyMTcgQEAKKyAgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgICovCisgI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgImJsb2IuaCIKKysjaW5jbHVkZSAidHJlZS5oIgorIAorIHN0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7Cistc3RhdGljIGludCByZWN1cnNpdmUgPSAwOworKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKysjZGVmaW5lIExTX1RSRUVfT05MWSAyCisrc3RhdGljIGludCBsc19vcHRpb25zID0gMDsKKyAKKy1zdHJ1Y3QgcGF0aF9wcmVmaXggeworLQlzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZXY7CistCWNvbnN0IGNoYXIgKm5hbWU7CistfTsKKy0KKy0jZGVmaW5lIERFQlVHKGZtdCwgLi4uKQkKKy0KKy1zdGF0aWMgaW50IHN0cmluZ19wYXRoX3ByZWZpeChjaGFyICpidWZmLCBzaXplX3QgYmxlbiwgc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgpCisteworLQlpbnQgbGVuID0gMDsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCWxlbiA9IHN0cmluZ19wYXRoX3ByZWZpeChidWZmLGJsZW4scHJlZml4LT5wcmV2KTsKKy0JCQlidWZmICs9IGxlbjsKKy0JCQlibGVuIC09IGxlbjsKKy0JCQlpZiAoYmxlbiA+IDApIHsKKy0JCQkJKmJ1ZmYgPSAnLyc7CistCQkJCWxlbisrOworLQkJCQlidWZmKys7CistCQkJCWJsZW4tLTsKKy0JCQl9CistCQl9CistCQlzdHJuY3B5KGJ1ZmYscHJlZml4LT5uYW1lLGJsZW4pOworLQkJcmV0dXJuIGxlbiArIHN0cmxlbihwcmVmaXgtPm5hbWUpOworLQl9Cisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3Qgcm9vdF9lbnRyeTsKKyAKKy0JcmV0dXJuIDA7Cisrc3RhdGljIHZvaWQgcHJlcGFyZV9yb290KHVuc2lnbmVkIGNoYXIgKnNoYTEpCisreworKwl1bnNpZ25lZCBjaGFyIHJzaGFbMjBdOworKwl1bnNpZ25lZCBsb25nIHNpemU7CisrCXZvaWQgKmJ1ZjsKKysJc3RydWN0IHRyZWUgKnJvb3RfdHJlZTsKKysKKysJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgcnNoYSk7CisrCWZyZWUoYnVmKTsKKysJaWYgKCFidWYpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwlyb290X3RyZWUgPSBsb29rdXBfdHJlZShyc2hhKTsKKysJaWYgKCFyb290X3RyZWUpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwkvKiBQcmVwYXJlIGEgZmFrZSBlbnRyeSAqLworKwlyb290X2VudHJ5LmRpcmVjdG9yeSA9IDE7CisrCXJvb3RfZW50cnkuZXhlY3V0YWJsZSA9IHJvb3RfZW50cnkuc3ltbGluayA9IDA7CisrCXJvb3RfZW50cnkubW9kZSA9IFNfSUZESVI7CisrCXJvb3RfZW50cnkubmFtZSA9ICIiOworKwlyb290X2VudHJ5Lml0ZW0udHJlZSA9IHJvb3RfdHJlZTsKKysJcm9vdF9lbnRyeS5wYXJlbnQgPSBOVUxMOworIH0KKyAKKy1zdGF0aWMgdm9pZCBwcmludF9wYXRoX3ByZWZpeChzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKytzdGF0aWMgaW50IHByZXBhcmVfY2hpbGRyZW4oc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZWxlbSkKKyB7CistCWlmIChwcmVmaXgpIHsKKy0JCWlmIChwcmVmaXgtPnByZXYpIHsKKy0JCQlwcmludF9wYXRoX3ByZWZpeChwcmVmaXgtPnByZXYpOworLQkJCXB1dGNoYXIoJy8nKTsKKy0JCX0KKy0JCWZwdXRzKHByZWZpeC0+bmFtZSwgc3Rkb3V0KTsKKysJaWYgKCFlbGVtLT5kaXJlY3RvcnkpCisrCQlyZXR1cm4gLTE7CisrCWlmICghZWxlbS0+aXRlbS50cmVlLT5vYmplY3QucGFyc2VkKSB7CisrCQlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplOworKwkJaWYgKHBhcnNlX3RyZWUoZWxlbS0+aXRlbS50cmVlKSkKKysJCQlyZXR1cm4gLTE7CisrCQkvKiBTZXQgdXAgdGhlIHBhcmVudCBsaW5rICovCisrCQlmb3IgKGUgPSBlbGVtLT5pdGVtLnRyZWUtPmVudHJpZXM7IGU7IGUgPSBlLT5uZXh0KQorKwkJCWUtPnBhcmVudCA9IGVsZW07CisgCX0KKysJcmV0dXJuIDA7CisgfQorIAorLS8qCistICogcmV0dXJuOgorLSAqIAktMSBpZiBwcmVmaXggaXMgKm5vdCogYSBzdWJzZXQgb2YgcGF0aAorLSAqIAkgMCBpZiBwcmVmaXggPT0gcGF0aAorLSAqIAkgMSBpZiBwcmVmaXggaXMgYSBzdWJzZXQgb2YgcGF0aAorLSAqLworLXN0YXRpYyBpbnQgcGF0aGNtcChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWNoYXIgYnVmZltQQVRIX01BWF07CistCWludCBsZW4sc2xlbjsKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZmluZF9lbnRyeV8wKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0sCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgICBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyt7CisrCWNvbnN0IGNoYXIgKmVwOworKwlpbnQgbGVuOworKworKwl3aGlsZSAocGF0aCA8IHBhdGhfZW5kKSB7CisrCQlpZiAocHJlcGFyZV9jaGlsZHJlbihlbGVtKSkKKysJCQlyZXR1cm4gTlVMTDsKKyAKKy0JaWYgKHByZWZpeCA9PSBOVUxMKQorLQkJcmV0dXJuIDE7CisrCQkvKiBJbiBlbGVtLT50cmVlLT5lbnRyaWVzLCBmaW5kIHRoZSBvbmUgdGhhdCBoYXMgbmFtZQorKwkJICogdGhhdCBtYXRjaGVzIHdoYXQgaXMgYmV0d2VlbiBwYXRoIGFuZCBlcC4KKysJCSAqLworKwkJZWxlbSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsKKyAKKy0JbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsIHNpemVvZiBidWZmLCBwcmVmaXgpOworLQlzbGVuID0gc3RybGVuKHBhdGgpOworKwkJZXAgPSBzdHJjaHIocGF0aCwgJy8nKTsKKysJCWlmICghZXAgfHwgcGF0aF9lbmQgPD0gZXApCisrCQkJZXAgPSBwYXRoX2VuZDsKKysJCWxlbiA9IGVwIC0gcGF0aDsKKysKKysJCXdoaWxlIChlbGVtKSB7CisrCQkJaWYgKChzdHJsZW4oZWxlbS0+bmFtZSkgPT0gbGVuKSAmJgorKwkJCSAgICAhc3RybmNtcChlbGVtLT5uYW1lLCBwYXRoLCBsZW4pKQorKwkJCQlicmVhazsKKysJCQllbGVtID0gZWxlbS0+bmV4dDsKKysJCX0KKysJCWlmIChwYXRoX2VuZCA8PSBlcCB8fCAhZWxlbSkKKysJCQlyZXR1cm4gZWxlbTsKKysJCXdoaWxlICgqZXAgPT0gJy8nICYmIGVwIDwgcGF0aF9lbmQpCisrCQkJZXArKzsKKysJCXBhdGggPSBlcDsKKysJfQorKwlyZXR1cm4gTlVMTDsKKyt9CisgCistCWlmIChzbGVuIDwgbGVuKQorLQkJcmV0dXJuIC0xOworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5KGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJLyogRmluZCB0cmVlIGVsZW1lbnQsIGRlc2NlbmRpbmcgZnJvbSByb290LCB0aGF0CisrCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBwYXRoLCBsYXppbHkgZXhwYW5kaW5nCisrCSAqIHRoZSB0cmVlIGlmIHBvc3NpYmxlLgorKwkgKi8KKysJaWYgKHBhdGggPT0gcGF0aF9lbmQpIHsKKysJCS8qIFNwZWNpYWwuICBUaGlzIGlzIHRoZSByb290IGxldmVsICovCisrCQlyZXR1cm4gJnJvb3RfZW50cnk7CisrCX0KKysJcmV0dXJuIGZpbmRfZW50cnlfMCgmcm9vdF9lbnRyeSwgcGF0aCwgcGF0aF9lbmQpOworK30KKyAKKy0JaWYgKHN0cm5jbXAocGF0aCxidWZmLGxlbikgPT0gMCkgeworLQkJaWYgKHNsZW4gPT0gbGVuKQorLQkJCXJldHVybiAwOworLQkJZWxzZQorLQkJCXJldHVybiAxOworK3N0YXRpYyB2b2lkIHNob3dfZW50cnlfbmFtZShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplKQorK3sKKysJLyogVGhpcyBpcyB5dWNreS4gIFRoZSByb290IGxldmVsIGlzIHRoZXJlIGZvcgorKwkgKiBvdXIgY29udmVuaWVuY2UgYnV0IHdlIHJlYWxseSB3YW50IHRvIGRvIGEKKysJICogZm9yZXN0LgorKwkgKi8KKysJaWYgKGUtPnBhcmVudCAmJiBlLT5wYXJlbnQgIT0gJnJvb3RfZW50cnkpIHsKKysJCXNob3dfZW50cnlfbmFtZShlLT5wYXJlbnQpOworKwkJcHV0Y2hhcignLycpOworIAl9CisrCXByaW50ZigiJXMiLCBlLT5uYW1lKTsKKyt9CisgCistCXJldHVybiAtMTsKKy19CQorK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV90eXBlKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gKGUtPmRpcmVjdG9yeSA/ICJ0cmVlIiA6ICJibG9iIik7CisrfQorIAorLS8qCistICogbWF0Y2ggbWF5IGJlIE5VTEwsIG9yIGEgKnNvcnRlZCogbGlzdCBvZiBwYXRocworLSAqLworLXN0YXRpYyB2b2lkIGxpc3RfcmVjdXJzaXZlKHZvaWQgKmJ1ZmZlciwKKy0JCQkgICBjb25zdCBjaGFyICp0eXBlLAorLQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy0JCQkgICBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCwKKy0JCQkgICBjaGFyICoqbWF0Y2gsIGludCBtYXRjaGVzKQorLXsKKy0Jc3RydWN0IHBhdGhfcHJlZml4IHRoaXNfcHJlZml4OworLQl0aGlzX3ByZWZpeC5wcmV2ID0gcHJlZml4OworLQorLQlpZiAoc3RyY21wKHR5cGUsICJ0cmVlIikpCistCQlkaWUoImV4cGVjdGVkIGEgJ3RyZWUnIG5vZGUiKTsKKy0KKy0JaWYgKG1hdGNoZXMpCistCQlyZWN1cnNpdmUgPSAxOworLQorLQl3aGlsZSAoc2l6ZSkgeworLQkJaW50IG5hbWVsZW4gPSBzdHJsZW4oYnVmZmVyKSsxOworLQkJdm9pZCAqZWx0YnVmID0gTlVMTDsKKy0JCWNoYXIgZWx0dHlwZVsyMF07CistCQl1bnNpZ25lZCBsb25nIGVsdHNpemU7CistCQl1bnNpZ25lZCBjaGFyICpzaGExID0gYnVmZmVyICsgbmFtZWxlbjsKKy0JCWNoYXIgKnBhdGggPSBzdHJjaHIoYnVmZmVyLCAnICcpICsgMTsKKy0JCXVuc2lnbmVkIGludCBtb2RlOworLQkJY29uc3QgY2hhciAqbWF0Y2hlZCA9IE5VTEw7CistCQlpbnQgbXR5cGUgPSAtMTsKKy0JCWludCBtaW5kZXg7CistCistCQlpZiAoc2l6ZSA8IG5hbWVsZW4gKyAyMCB8fCBzc2NhbmYoYnVmZmVyLCAiJW8iLCAmbW9kZSkgIT0gMSkKKy0JCQlkaWUoImNvcnJ1cHQgJ3RyZWUnIGZpbGUiKTsKKy0JCWJ1ZmZlciA9IHNoYTEgKyAyMDsKKy0JCXNpemUgLT0gbmFtZWxlbiArIDIwOworLQorLQkJdGhpc19wcmVmaXgubmFtZSA9IHBhdGg7CistCQlmb3IgKCBtaW5kZXggPSAwOyBtaW5kZXggPCBtYXRjaGVzOyBtaW5kZXgrKykgeworLQkJCW10eXBlID0gcGF0aGNtcChtYXRjaFttaW5kZXhdLCZ0aGlzX3ByZWZpeCk7CistCQkJaWYgKG10eXBlID49IDApIHsKKy0JCQkJbWF0Y2hlZCA9IG1hdGNoW21pbmRleF07CistCQkJCWJyZWFrOworLQkJCX0KKy0JCX0KKytzdGF0aWMgY29uc3QgY2hhciAqZW50cnlfaGV4KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gc2hhMV90b19oZXgoZS0+ZGlyZWN0b3J5CisrCQkJICAgPyBlLT5pdGVtLnRyZWUtPm9iamVjdC5zaGExCisrCQkJICAgOiBlLT5pdGVtLmJsb2ItPm9iamVjdC5zaGExKTsKKyt9CisgCistCQkvKgorLQkJICogSWYgd2UncmUgbm90IG1hdGNoaW5nLCBvciBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLAorLQkJICogcHJpbnQgb3V0IHRoZSBpbmZvCistCQkgKi8KKy0JCWlmICghbWF0Y2hlcyB8fCAobWF0Y2hlZCAhPSBOVUxMICYmIG10eXBlID09IDApKSB7CistCQkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLAorLQkJCSAgICAgICBTX0lTRElSKG1vZGUpID8gInRyZWUiIDogImJsb2IiLAorLQkJCSAgICAgICBzaGExX3RvX2hleChzaGExKSk7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgoJnRoaXNfcHJlZml4KTsKKy0JCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworLQkJfQorKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIG11dHVhbGx5IHJlY3Vyc2l2ZSByb3V0aW5lcyAqLworK3N0YXRpYyBpbnQgc2hvd19lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICosIGludCk7CisgCistCQlpZiAoISByZWN1cnNpdmUgfHwgISBTX0lTRElSKG1vZGUpKQorLQkJCWNvbnRpbnVlOworK3N0YXRpYyBpbnQgc2hvd19jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplLCBpbnQgbGV2ZWwpCisreworKwlpZiAocHJlcGFyZV9jaGlsZHJlbihlKSkKKysJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGxzLXRyZWUgc2hvd19jaGlsZHJlbiBjYWxsZWQgd2l0aCBub24gdHJlZSIpOworKwllID0gZS0+aXRlbS50cmVlLT5lbnRyaWVzOworKwl3aGlsZSAoZSkgeworKwkJc2hvd19lbnRyeShlLCBsZXZlbCk7CisrCQllID0gZS0+bmV4dDsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisgCistCQlpZiAobWF0Y2hlcyAmJiAhIG1hdGNoZWQpCistCQkJY29udGludWU7Cisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWludCBlcnIgPSAwOyAKKyAKKy0JCWlmICghIChlbHRidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCBlbHR0eXBlLCAmZWx0c2l6ZSkpICkgeworLQkJCWVycm9yKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQljb250aW51ZTsKKy0JCX0KKysJaWYgKGUgIT0gJnJvb3RfZW50cnkpIHsKKysJCXByaW50ZigiJTA2byAlcyAlcwkiLCBlLT5tb2RlLCBlbnRyeV90eXBlKGUpLAorKwkJICAgICAgIGVudHJ5X2hleChlKSk7CisrCQlzaG93X2VudHJ5X25hbWUoZSk7CisrCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworKwl9CisgCistCQkvKiBJZiB0aGlzIGlzIGFuIGV4YWN0IGRpcmVjdG9yeSBtYXRjaCwgd2UgbWF5IGhhdmUKKy0JCSAqIGRpcmVjdG9yeSBmaWxlcyBmb2xsb3dpbmcgdGhpcyBwYXRoLiBNYXRjaCBvbiB0aGVtLgorLQkJICogT3RoZXJ3aXNlLCB3ZSdyZSBhdCBhIHBhY2ggc3ViY29tcG9uZW50LCBhbmQgd2UgbmVlZAorLQkJICogdG8gdHJ5IHRvIG1hdGNoIGFnYWluLgorKwlpZiAoZS0+ZGlyZWN0b3J5KSB7CisrCQkvKiBJZiB0aGlzIGlzIGEgZGlyZWN0b3J5LCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisrCQkgKiAoMSkgVGhpcyBpcyB0aGUgdG9wLWxldmVsIHJlcXVlc3QgKGV4cGxpY2l0IHBhdGggZnJvbSB0aGUKKysJCSAqICAgICBjb21tYW5kIGxpbmUsIG9yICJyb290IiBpZiB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUpLgorKwkJICogIGEuIFdpdGhvdXQgYW55IGZsYWcuICBXZSBzaG93IGRpcmVjdCBjaGlsZHJlbi4gIFdlIGRvIG5vdCAKKysJCSAqICAgICByZWN1cnNlIGludG8gdGhlbS4KKysJCSAqICBiLiBXaXRoIC1yLiAgV2UgZG8gcmVjdXJzZSBpbnRvIGNoaWxkcmVuLgorKwkJICogIGMuIFdpdGggLWQuICBXZSBkbyBub3QgcmVjdXJzZSBpbnRvIGNoaWxkcmVuLgorKwkJICogKDIpIFdlIGNhbWUgaGVyZSBiZWNhdXNlIG91ciBjYWxsZXIgaXMgZWl0aGVyICgxLWEpIG9yCisrCQkgKiAgICAgKDEtYikuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIGRvIG5vdCBzaG93IG91ciBjaGlsZHJlbiAod2hpY2gKKysJCSAqICAgICBhcmUgZ3JhbmRjaGlsZHJlbiBmb3IgdGhlIG9yaWdpbmFsIHJlcXVlc3QpLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBjb250aW51ZSB0byByZWN1cnNlIGludG8gb3VyIGNoaWxkcmVuLgorKwkJICogIGMuIFdpdGggLWQuICBXZSBzaG91bGQgbm90IGhhdmUgY29tZSBoZXJlIHRvIGJlZ2luIHdpdGguCisgCQkgKi8KKy0JCWlmIChtdHlwZSA9PSAwKQorLQkJCW1pbmRleCsrOworLQorLQkJbGlzdF9yZWN1cnNpdmUoZWx0YnVmLCBlbHR0eXBlLCBlbHRzaXplLCAmdGhpc19wcmVmaXgsICZtYXRjaFttaW5kZXhdLCBtYXRjaGVzLW1pbmRleCk7CistCQlmcmVlKGVsdGJ1Zik7CisrCQlpZiAobGV2ZWwgPT0gMCAmJiAhKGxzX29wdGlvbnMgJiBMU19UUkVFX09OTFkpKQorKwkJCS8qIGNhc2UgKDEpLWEgYW5kICgxKS1iICovCisrCQkJZXJyID0gZXJyIHwgc2hvd19jaGlsZHJlbihlLCBsZXZlbCsxKTsKKysJCWVsc2UgaWYgKGxldmVsICYmIGxzX29wdGlvbnMgJiBMU19SRUNVUlNJVkUpCisrCQkJLyogY2FzZSAoMiktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisgCX0KKysJcmV0dXJuIGVycjsKKyB9CisgCistc3RhdGljIGludCBxY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisrc3RhdGljIGludCBsaXN0X29uZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyB7CistCXJldHVybiBzdHJjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKTsKKysJaW50IGVyciA9IDA7CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUgPSBmaW5kX2VudHJ5KHBhdGgsIHBhdGhfZW5kKTsKKysJaWYgKCFlKSB7CisrCQkvKiB0cmFkaXRpb25hbGx5IGxzLXRyZWUgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQKKysJCSAqIG1pc3NpbmcgcGF0aC4gIFdlIG1heSBjaGFuZ2UgdGhpcyBsYXRlciB0byBtYXRjaAorKwkJICogd2hhdCAiL2Jpbi9scyAtYSIgZG9lcywgd2hpY2ggaXMgdG8gY29tcGxhaW4uCisrCQkgKi8KKysJCXJldHVybiBlcnI7CisrCX0KKysJZXJyID0gZXJyIHwgc2hvd19lbnRyeShlLCAwKTsKKysJcmV0dXJuIGVycjsKKyB9CisgCistc3RhdGljIGludCBsaXN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsY2hhciAqKnBhdGgpCisrc3RhdGljIGludCBsaXN0KGNoYXIgKipwYXRoKQorIHsKKy0Jdm9pZCAqYnVmZmVyOworLQl1bnNpZ25lZCBsb25nIHNpemU7CistCWludCBucGF0aHM7CistCistCWZvciAobnBhdGhzID0gMDsgcGF0aFtucGF0aHNdICE9IE5VTEw7IG5wYXRocysrKQorLQkJOworLQorLQlxc29ydChwYXRoLG5wYXRocyxzaXplb2YoY2hhciAqKSxxY21wKTsKKy0KKy0JYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgTlVMTCk7CistCWlmICghYnVmZmVyKQorLQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUiKTsKKy0JbGlzdF9yZWN1cnNpdmUoYnVmZmVyLCAidHJlZSIsIHNpemUsIE5VTEwsIHBhdGgsIG5wYXRocyk7CistCWZyZWUoYnVmZmVyKTsKKy0JcmV0dXJuIDA7CisrCWludCBpOworKwlpbnQgZXJyID0gMDsKKysJZm9yIChpID0gMDsgcGF0aFtpXTsgaSsrKSB7CisrCQlpbnQgbGVuID0gc3RybGVuKHBhdGhbaV0pOworKwkJd2hpbGUgKDAgPD0gbGVuICYmIHBhdGhbaV1bbGVuXSA9PSAnLycpCisrCQkJbGVuLS07CisrCQllcnIgPSBlcnIgfCBsaXN0X29uZShwYXRoW2ldLCBwYXRoW2ldICsgbGVuKTsKKysJfQorKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgY29uc3QgY2hhciAqbHNfdHJlZV91c2FnZSA9ICJnaXQtbHMtdHJlZSBbLXJdIFstel0gPGtleT4gW3BhdGhzLi4uXSI7Cisrc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPQorKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworIAorIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyB7CisrCXN0YXRpYyBjaGFyICpwYXRoMFtdID0geyAiIiwgTlVMTCB9OworKwljaGFyICoqcGF0aDsKKyAJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKyAKKyAJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CitAQCAtMTk0LDcgKzIyMywxMCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisgCQkJYnJlYWs7CisgCQljYXNlICdyJzoKKy0JCQlyZWN1cnNpdmUgPSAxOworKwkJCWxzX29wdGlvbnMgfD0gTFNfUkVDVVJTSVZFOworKwkJCWJyZWFrOworKwkJY2FzZSAnZCc6CisrCQkJbHNfb3B0aW9ucyB8PSBMU19UUkVFX09OTFk7CisgCQkJYnJlYWs7CisgCQlkZWZhdWx0OgorIAkJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworQEAgLTIwNiw3ICsyMzgsMTAgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIAkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisgCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSA8IDApCisgCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JaWYgKGxpc3Qoc2hhMSwgJmFyZ3ZbMl0pIDwgMCkKKysKKysJcGF0aCA9IChhcmdjID09IDIpID8gcGF0aDAgOiAoYXJndiArIDIpOworKwlwcmVwYXJlX3Jvb3Qoc2hhMSk7CisrCWlmIChsaXN0KHBhdGgpIDwgMCkKKyAJCWRpZSgibGlzdCBmYWlsZWQiKTsKKyAJcmV0dXJuIDA7CisgfQorZGlmZiBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorLS0tIGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCisrKysgYi90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKK0BAIC03NCw4ICs3NCw4IEBAIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnbHMtdHJlZSBmaWx0ZXJlZCcgXAorICAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDEgcGF0aDAgPmN1cnJlbnQgJiYKKyAgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCistMTAwNjQ0IGJsb2IgWAlwYXRoMAorIDEyMDAwMCBibG9iIFgJcGF0aDEKKysxMDA2NDQgYmxvYiBYCXBhdGgwCisgRU9GCisgICAgICB0ZXN0X291dHB1dCcKKyAKK0BAIC04NSw3ICs4NSw2IEBAIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKyAwNDAwMDAgdHJlZSBYCXBhdGgyCisgMDQwMDAwIHRyZWUgWAlwYXRoMi9iYXoKKy0xMDA2NDQgYmxvYiBYCXBhdGgyL2Jhei9iCisgMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworIDEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCisgRU9GCitkaWZmIGEvdHJlZS5jIGIvdHJlZS5jCistLS0gYS90cmVlLmMKKysrKyBiL3RyZWUuYworQEAgLTEzMyw3ICsxMzMsNyBAQCBpbnQgcGFyc2VfdHJlZV9idWZmZXIoc3RydWN0IHRyZWUgKml0ZW0sCisgCQl9CisgCQlpZiAob2JqKQorIAkJCWFkZF9yZWYoJml0ZW0tPm9iamVjdCwgb2JqKTsKKy0KKysJCWVudHJ5LT5wYXJlbnQgPSBOVUxMOyAvKiBuZWVkcyB0byBiZSBmaWxsZWQgYnkgdGhlIHVzZXIgKi8KKyAJCSpsaXN0X3AgPSBlbnRyeTsKKyAJCWxpc3RfcCA9ICZlbnRyeS0+bmV4dDsKKyAJfQorZGlmZiBhL3RyZWUuaCBiL3RyZWUuaAorLS0tIGEvdHJlZS5oCisrKysgYi90cmVlLmgKK0BAIC0xNiw2ICsxNiw3IEBAIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgeworIAkJc3RydWN0IHRyZWUgKnRyZWU7CisgCQlzdHJ1Y3QgYmxvYiAqYmxvYjsKKyAJfSBpdGVtOworKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpwYXJlbnQ7CisgfTsKKyAKKyBzdHJ1Y3QgdHJlZSB7CmRpZmYgLS1naXQgYS90L3Q0MTAxLWFwcGx5LW5vbmwuc2ggYi90L3Q0MTAxLWFwcGx5LW5vbmwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDI2ZmFjOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEtYXBwbHktbm9ubC5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBzaG91bGQgaGFuZGxlIGZpbGVzIHdpdGggaW5jb21wbGV0ZSBsaW5lcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworKGVjaG8gYTsgZWNobyBiKSA+ZnJvdHouMAorKGVjaG8gYTsgZWNobyBiOyBlY2hvIGMpID5mcm90ei4xCisoZWNobyBhOyBlY2hvIGIgfCB0ciAtZCAnXDAxMicpID5mcm90ei4yCisoZWNobyBhOyBlY2hvIGM7IGVjaG8gYiB8IHRyIC1kICdcMDEyJykgPmZyb3R6LjMKKworZm9yIGkgaW4gMCAxIDIgMworZG8KKyAgZm9yIGogaW4gMCAxIDIgMworICBkbworICAgIHRlc3QgJGkgLWVxICRqICYmIGNvbnRpbnVlCisgICAgY2F0IGZyb3R6LiRpID5mcm90egorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAiYXBwbHkgZGlmZiBiZXR3ZWVuICRpIGFuZCAkaiIgXAorCSJnaXQtYXBwbHkgPC4uL3Q0MTAxL2RpZmYuJGktJGogJiYgZGlmZiBmcm90ei4kaiBmcm90eiIKKyAgZG9uZQorZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4wLTEgYi90L3Q0MTAxL2RpZmYuMC0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTBhODgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMC0xCkBAIC0wLDAgKzEsNiBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDMgQEAKKyBhCisgYgorK2MKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4wLTIgYi90L3Q0MTAxL2RpZmYuMC0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDYwYTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMC0yCkBAIC0wLDAgKzEsNyBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDIgQEAKKyBhCistYgorK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjAtMyBiL3QvdDQxMDEvZGlmZi4wLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MWM0MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4wLTMKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMyBAQAorIGEKKy1iCisrYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMCBiL3QvdDQxMDEvZGlmZi4xLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMmU5MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTAKQEAgLTAsMCArMSw2IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKyBiCistYwpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMiBiL3QvdDQxMDEvZGlmZi4xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0NDBhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTIKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKy1iCistYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMyBiL3QvdDQxMDEvZGlmZi4xLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZmY5NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTMKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMyBAQAorIGEKKy1iCisgYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjItMCBiL3QvdDQxMDEvZGlmZi4yLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlNzFlZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4yLTAKQEAgLTAsMCArMSw3IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMiBAQAorIGEKKy1iCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKytiCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMi0xIGIvdC90NDEwMS9kaWZmLjItMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZkOWZkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjItMQpAQCAtMCwwICsxLDggQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwzIEBACisgYQorLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK2IKKytjCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMi0zIGIvdC90NDEwMS9kaWZmLjItMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMzYzgzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjItMwpAQCAtMCwwICsxLDcgQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwzIEBACisgYQorK2MKKyBiCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTAgYi90L3Q0MTAxL2RpZmYuMy0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjFhNDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0wCkBAIC0wLDAgKzEsOCBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDIgQEAKKyBhCistYworLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK2IKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTEgYi90L3Q0MTAxL2RpZmYuMy0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTljNjAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0xCkBAIC0wLDAgKzEsOCBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDMgQEAKKyBhCisrYgorIGMKKy1iCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTIgYi90L3Q0MTAxL2RpZmYuMy0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDFiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0yCkBAIC0wLDAgKzEsNyBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDIgQEAKKyBhCistYworIGIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMi1hcHBseS1yZW5hbWUuc2ggYi90L3Q0MTAyLWFwcGx5LXJlbmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNDY2MmIwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMi1hcHBseS1yZW5hbWUuc2gKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgaGFuZGxpbmcgY29weS9yZW5hbWUgcGF0Y2guCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+dGVzdC1wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9mb28gYi9iYXIKK3NpbWlsYXJpdHkgaW5kZXggNDclCityZW5hbWUgZnJvbSBmb28KK3JlbmFtZSB0byBiYXIKKy0tLSBhL2ZvbworKysrIGIvYmFyCitAQCAtMSArMSBAQAorLVRoaXMgaXMgZm9vCisrVGhpcyBpcyBiYXIKK0VPRgorCitlY2hvICdUaGlzIGlzIGZvbycgPmZvbworY2htb2QgK3ggZm9vCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBhcHBseSBcCisgICAgJ2dpdC1hcHBseSAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoJworCitpZiBbICIkKGdpdCBjb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0nCitlbHNlCisJdGVzdF9leHBlY3Rfc3VjY2VzcyB2YWxpZGF0ZSBcCisJICAgICd0ZXN0IC1mIGJhciAmJiBscyAtbCBiYXIgfCBncmVwICJeLS4ueC4uLi4uLiInCitmaQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSByZXZlcnNlJyBcCisgICAgJ2dpdC1hcHBseSAtUiAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoICYmCisgICAgIHRlc3QgIiQoY2F0IGZvbykiID0gIlRoaXMgaXMgZm9vIicKKworY2F0ID50ZXN0LXBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL2ZvbyBiL2Jhcgorc2ltaWxhcml0eSBpbmRleCA0NyUKK2NvcHkgZnJvbSBmb28KK2NvcHkgdG8gYmFyCistLS0gYS9mb28KKysrKyBiL2JhcgorQEAgLTEgKzEgQEAKKy1UaGlzIGlzIGZvbworK1RoaXMgaXMgYmFyCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgY29weScgXAorICAgICdnaXQtYXBwbHkgLS1pbmRleCAtLXN0YXQgLS1zdW1tYXJ5IC0tYXBwbHkgdGVzdC1wYXRjaCAmJgorICAgICB0ZXN0ICIkKGNhdCBiYXIpIiA9ICJUaGlzIGlzIGJhciIgLWEgIiQoY2F0IGZvbykiID0gIlRoaXMgaXMgZm9vIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTAzLWFwcGx5LWJpbmFyeS5zaCBiL3QvdDQxMDMtYXBwbHktYmluYXJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyYjExMjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAzLWFwcGx5LWJpbmFyeS5zaApAQCAtMCwwICsxLDExNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgaGFuZGxpbmcgYmluYXJ5IHBhdGNoZXMKKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworY2F0ID5maWxlMSA8PEVPRgorQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuCitBIHRpbnkgbGl0dGxlIHBlbmd1aW4gcnVucyBhcm91bmQgaW4gY2lyY2xlcy4KK1RoZXJlIGlzIGEgZmxhZyB3aXRoIExpbnV4IHdyaXR0ZW4gb24gaXQuCitBIHNsb3cgYmxhY2stYW5kLXdoaXRlIHBhbmRhIGp1c3Qgc2l0cyB0aGVyZSwKK211bmNoaW5nIG9uIGhpcyBiYW1ib28uCitFT0YKK2NhdCBmaWxlMSA+ZmlsZTIKK2NhdCBmaWxlMSA+ZmlsZTQKKworZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMSBmaWxlMiBmaWxlNAorZ2l0LWNvbW1pdCAtbSAnSW5pdGlhbCBWZXJzaW9uJyAyPi9kZXYvbnVsbAorCitnaXQtY2hlY2tvdXQgLWIgYmluYXJ5Cit0ciAneCcgJ1wwJyA8ZmlsZTEgPmZpbGUzCitjYXQgZmlsZTMgPmZpbGU0CitnaXQtYWRkIGZpbGUyCit0ciAnXDAnICd2JyA8ZmlsZTMgPmZpbGUxCitybSAtZiBmaWxlMgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMSBmaWxlMiBmaWxlMyBmaWxlNAorZ2l0LWNvbW1pdCAtbSAnU2Vjb25kIFZlcnNpb24nCisKK2dpdC1kaWZmLXRyZWUgLXAgbWFzdGVyIGJpbmFyeSA+Qi5kaWZmCitnaXQtZGlmZi10cmVlIC1wIC1DIG1hc3RlciBiaW5hcnkgPkMuZGlmZgorCitnaXQtZGlmZi10cmVlIC1wIC0tYmluYXJ5IG1hc3RlciBiaW5hcnkgPkJGLmRpZmYKK2dpdC1kaWZmLXRyZWUgLXAgLS1iaW5hcnkgLUMgbWFzdGVyIGJpbmFyeSA+Q0YuZGlmZgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0IGJpbmFyeSBkaWZmIC0tIHNob3VsZCBub3QgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXQgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBub3QgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2NoZWNrIGJpbmFyeSBkaWZmIC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgaW5jb21wbGV0ZSBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgaW5jb21wbGV0ZSBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGJpbmFyeSBkaWZmIHdpdGggcmVwbGFjZW1lbnQuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgQkYuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudCAoY29weSkuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgQ0YuZGlmZicKKworIyBOb3cgd2Ugc3RhcnQgYXBwbHlpbmcgdGhlbS4KKworZG9fcmVzZXQgKCkgeworCXJtIC1mIGZpbGU/CisJZ2l0LXJlc2V0IC0taGFyZAorCWdpdC1jaGVja291dCAtZiBtYXN0ZXIKK30KKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1pbmRleCBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1pbmRleCBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBkaWZmIHdpdGhvdXQgcmVwbGFjZW1lbnQuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSBCRi5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiB3aXRob3V0IHJlcGxhY2VtZW50IChjb3B5KS4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IENGLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBkaWZmLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgLS1pbmRleCBCRi5kaWZmICYmCisJIHRlc3QgLXogIiQoZ2l0LWRpZmYgLS1uYW1lLXN0YXR1cyBiaW5hcnkpIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IGRpZmYgKGNvcHkpLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgLS1pbmRleCBDRi5kaWZmICYmCisJIHRlc3QgLXogIiQoZ2l0LWRpZmYgLS1uYW1lLXN0YXR1cyBiaW5hcnkpIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTA0LWFwcGx5LWJvdW5kYXJ5LnNoIGIvdC90NDEwNC1hcHBseS1ib3VuZGFyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWZiM2VhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwNC1hcHBseS1ib3VuZGFyeS5zaApAQCAtMCwwICsxLDExNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgYm91bmRhcnkgdGVzdHMKKworJworLiAuL3Rlc3QtbGliLnNoCisKK0w9ImMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHgiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWZvciBpIGluIGIgJyIkTCInIHkKKwlkbworCQllY2hvICRpCisJZG9uZSA+dmljdGltICYmCisJY2F0IHZpY3RpbSA+b3JpZ2luYWwgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHZpY3RpbSAmJgorCisJOiBhZGQgdG8gdGhlIGhlYWQKKwlmb3IgaSBpbiBhIGIgJyIkTCInIHkKKwlkbworCQllY2hvICRpCisJZG9uZSA+dmljdGltICYmCisJY2F0IHZpY3RpbSA+YWRkLWEtZXhwZWN0ICYmCisJZ2l0IGRpZmYgdmljdGltID5hZGQtYS1wYXRjaC53aXRoICYmCisJZ2l0IGRpZmYgLS11bmlmaWVkPTAgPmFkZC1hLXBhdGNoLndpdGhvdXQgJiYKKworCTogbW9kaWZ5IGF0IHRoZSBoZWFkCisJZm9yIGkgaW4gYSAnIiRMIicgeQorCWRvCisJCWVjaG8gJGkKKwlkb25lID52aWN0aW0gJiYKKwljYXQgdmljdGltID5tb2QtYS1leHBlY3QgJiYKKwlnaXQgZGlmZiB2aWN0aW0gPm1vZC1hLXBhdGNoLndpdGggJiYKKwlnaXQgZGlmZiAtLXVuaWZpZWQ9MCA+bW9kLWEtcGF0Y2gud2l0aG91dCAmJgorCisJOiByZW1vdmUgZnJvbSB0aGUgaGVhZAorCWZvciBpIGluICciJEwiJyB5CisJZG8KKwkJZWNobyAkaQorCWRvbmUgPnZpY3RpbSAmJgorCWNhdCB2aWN0aW0gPmRlbC1hLWV4cGVjdCAmJgorCWdpdCBkaWZmIHZpY3RpbSA+ZGVsLWEtcGF0Y2gud2l0aAorCWdpdCBkaWZmIC0tdW5pZmllZD0wID5kZWwtYS1wYXRjaC53aXRob3V0ICYmCisKKwk6IGFkZCB0byB0aGUgdGFpbAorCWZvciBpIGluIGIgJyIkTCInIHkgegorCWRvCisJCWVjaG8gJGkKKwlkb25lID52aWN0aW0gJiYKKwljYXQgdmljdGltID5hZGQtei1leHBlY3QgJiYKKwlnaXQgZGlmZiB2aWN0aW0gPmFkZC16LXBhdGNoLndpdGggJiYKKwlnaXQgZGlmZiAtLXVuaWZpZWQ9MCA+YWRkLXotcGF0Y2gud2l0aG91dCAmJgorCisJOiBtb2RpZnkgYXQgdGhlIHRhaWwKKwlmb3IgaSBpbiBhICciJEwiJyB5CisJZG8KKwkJZWNobyAkaQorCWRvbmUgPnZpY3RpbSAmJgorCWNhdCB2aWN0aW0gPm1vZC16LWV4cGVjdCAmJgorCWdpdCBkaWZmIHZpY3RpbSA+bW9kLXotcGF0Y2gud2l0aCAmJgorCWdpdCBkaWZmIC0tdW5pZmllZD0wID5tb2Qtei1wYXRjaC53aXRob3V0ICYmCisKKwk6IHJlbW92ZSBmcm9tIHRoZSB0YWlsCisJZm9yIGkgaW4gYiAnIiRMIicKKwlkbworCQllY2hvICRpCisJZG9uZSA+dmljdGltICYmCisJY2F0IHZpY3RpbSA+ZGVsLXotZXhwZWN0ICYmCisJZ2l0IGRpZmYgdmljdGltID5kZWwtei1wYXRjaC53aXRoCisJZ2l0IGRpZmYgLS11bmlmaWVkPTAgPmRlbC16LXBhdGNoLndpdGhvdXQgJiYKKworCTogZG9uZQorJworCitmb3Igd2l0aCBpbiB3aXRoIHdpdGhvdXQKK2RvCisJY2FzZSAiJHdpdGgiIGluCisJd2l0aCkgdT0gOzsKKwl3aXRob3V0KSB1PSctLXVuaWRpZmYtemVybyAnIDs7CisJZXNhYworCWZvciBraW5kIGluIGFkZC1hIGFkZC16IG1vZC1hIG1vZC16IGRlbC1hIGRlbC16CisJZG8KKwkJdGVzdF9leHBlY3Rfc3VjY2VzcyAiYXBwbHkgJGtpbmQtcGF0Y2ggJHdpdGggY29udGV4dCIgJworCQkJY2F0IG9yaWdpbmFsID52aWN0aW0gJiYKKwkJCWdpdCB1cGRhdGUtaW5kZXggdmljdGltICYmCisJCQlnaXQgYXBwbHkgLS1pbmRleCAnIiR1JGtpbmQtcGF0Y2guJHdpdGgiJyB8fCB7CisJCQkJY2F0ICciJGtpbmQtcGF0Y2guJHdpdGgiJworCQkJCShleGl0IDEpCisJCQl9ICYmCisJCQlnaXQgZGlmZiAnIiRraW5kIictZXhwZWN0IHZpY3RpbQorCQknCisJZG9uZQorZG9uZQorCitmb3Iga2luZCBpbiBhZGQtYSBhZGQteiBtb2QtYSBtb2QteiBkZWwtYSBkZWwtegorZG8KKwlybSAtZiAka2luZC1uZy53aXRob3V0CisJc2VkCS1lICJzL15kaWZmIC0tZ2l0IC9kaWZmIC8iIFwKKwkJLWUgJy9eaW5kZXggL2QnIFwKKwkJPCRraW5kLXBhdGNoLndpdGhvdXQgPiRraW5kLW5nLndpdGhvdXQKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJhcHBseSBub24tZ2l0ICRraW5kLXBhdGNoIHdpdGhvdXQgY29udGV4dCIgJworCQljYXQgb3JpZ2luYWwgPnZpY3RpbSAmJgorCQlnaXQgdXBkYXRlLWluZGV4IHZpY3RpbSAmJgorCQlnaXQgYXBwbHkgLS11bmlkaWZmLXplcm8gLS1pbmRleCAnIiRraW5kLW5nLndpdGhvdXQiJyB8fCB7CisJCQljYXQgJyIka2luZC1uZy53aXRob3V0IicKKwkJCShleGl0IDEpCisJCX0gJiYKKwkJZ2l0IGRpZmYgJyIka2luZCInLWV4cGVjdCB2aWN0aW0KKwknCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwOS1hcHBseS1tdWx0aWZyYWcuc2ggYi90L3Q0MTA5LWFwcGx5LW11bHRpZnJhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTg4ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwOS1hcHBseS1tdWx0aWZyYWcuc2gKQEAgLTAsMCArMSwxNzYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSB0ZXN0IHBhdGNoZXMgd2l0aCBtdWx0aXBsZSBmcmFnbWVudHMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+IHBhdGNoMS5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CistLS0gL2Rldi9udWxsCisrKysgYi9tYWluLmMKK0BAIC0wLDAgKzEsMjMgQEAKKysjaW5jbHVkZSA8c3RkaW8uaD4KKysKKytpbnQgZnVuYyhpbnQgbnVtKTsKKyt2b2lkIHByaW50X2ludChpbnQgbnVtKTsKKysKKytpbnQgbWFpbigpIHsKKysJaW50IGk7CisrCisrCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisrCQlwcmludF9pbnQoZnVuYyhpKSk7CisrCX0KKysKKysJcmV0dXJuIDA7CisrfQorKworK2ludCBmdW5jKGludCBudW0pIHsKKysJcmV0dXJuIG51bSAqIG51bTsKKyt9CisrCisrdm9pZCBwcmludF9pbnQoaW50IG51bSkgeworKwlwcmludGYoIiVkIiwgbnVtKTsKKyt9CisrCitFT0YKK2NhdCA+IHBhdGNoMi5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSw3ICsxLDkgQEAKKysjaW5jbHVkZSA8c3RkbGliLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgCisgaW50IGZ1bmMoaW50IG51bSk7Cisgdm9pZCBwcmludF9pbnQoaW50IG51bSk7Cisrdm9pZCBwcmludF9sbigpOworIAorIGludCBtYWluKCkgeworIAlpbnQgaTsKK0BAIC0xMCw2ICsxMiw4IEBACisgCQlwcmludF9pbnQoZnVuYyhpKSk7CisgCX0KKyAKKysJcHJpbnRfbG4oKTsKKysKKyAJcmV0dXJuIDA7CisgfQorIAorQEAgLTIxLDMgKzI1LDcgQEAKKyAJcHJpbnRmKCIlZCIsIG51bSk7CisgfQorIAorK3ZvaWQgcHJpbnRfbG4oKSB7CisrCXByaW50ZigiXG4iKTsKKyt9CisrCitFT0YKK2NhdCA+IHBhdGNoMy5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSw5ICsxLDcgQEAKKy0jaW5jbHVkZSA8c3RkbGliLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgCisgaW50IGZ1bmMoaW50IG51bSk7Cisgdm9pZCBwcmludF9pbnQoaW50IG51bSk7Cistdm9pZCBwcmludF9sbigpOworIAorIGludCBtYWluKCkgeworIAlpbnQgaTsKK0BAIC0xMiw4ICsxMCw2IEBACisgCQlwcmludF9pbnQoZnVuYyhpKSk7CisgCX0KKyAKKy0JcHJpbnRfbG4oKTsKKy0KKyAJcmV0dXJuIDA7CisgfQorIAorQEAgLTI1LDcgKzIxLDMgQEAKKyAJcHJpbnRmKCIlZCIsIG51bSk7CisgfQorIAorLXZvaWQgcHJpbnRfbG4oKSB7CistCXByaW50ZigiXG4iKTsKKy19CistCitFT0YKK2NhdCA+IHBhdGNoNC5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSwxMyArMSwxNCBAQAorICNpbmNsdWRlIDxzdGRpby5oPgorIAorIGludCBmdW5jKGludCBudW0pOworLXZvaWQgcHJpbnRfaW50KGludCBudW0pOworK2ludCBmdW5jMihpbnQgbnVtKTsKKyAKKyBpbnQgbWFpbigpIHsKKyAJaW50IGk7CisgCisgCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CistCQlwcmludF9pbnQoZnVuYyhpKSk7CisrCQlwcmludGYoIiVkIiwgZnVuYyhpKSk7CisrCQlwcmludGYoIiVkIiwgZnVuYzMoaSkpOworIAl9CisgCisgCXJldHVybiAwOworQEAgLTE3LDcgKzE4LDcgQEAKKyAJcmV0dXJuIG51bSAqIG51bTsKKyB9CisgCistdm9pZCBwcmludF9pbnQoaW50IG51bSkgeworLQlwcmludGYoIiVkIiwgbnVtKTsKKytpbnQgZnVuYzIoaW50IG51bSkgeworKwlyZXR1cm4gbnVtICogbnVtICogbnVtOworIH0KKyAKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0LWFwcGx5ICgxKSIgXAorICAgICdnaXQtYXBwbHkgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCcKK212IG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBwYXRjaCAoMSkiIFwKKyAgICAnY2F0IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggfCBwYXRjaCAtcDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAgKDEpIiBcCisgICAgJ2NtcCBtYWluLmMuZ2l0IG1haW4uYycKKworcm0gLWYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdC1hcHBseSAoMikiIFwKKyAgICAnZ2l0LWFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoJworbXYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IHBhdGNoICgyKSIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2ggfCBwYXRjaCAtcDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAgKDIpIiBcCisgICAgJ2NtcCBtYWluLmMuZ2l0IG1haW4uYycKKworcm0gLWYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdC1hcHBseSAoMykiIFwKKyAgICAnZ2l0LWFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDQucGF0Y2gnCittdiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggKDMpIiBcCisgICAgJ2NhdCBwYXRjaDEucGF0Y2ggcGF0Y2g0LnBhdGNoIHwgcGF0Y2ggLXAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gY21wICgzKSIgXAorICAgICdjbXAgbWFpbi5jLmdpdCBtYWluLmMnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MTEwLWFwcGx5LXNjYW4uc2ggYi90L3Q0MTEwLWFwcGx5LXNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDA1Zjc0NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTAtYXBwbHktc2Nhbi5zaApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIyBDb3B5cmlnaHQgKGMpIDIwMDUgUm9iZXJ0IEZpdHpzaW1vbnMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHRlc3QgZm9yIHBhdGNoZXMgd2hpY2ggcmVxdWlyZSBzY2FubmluZyBmb3J3YXJkcyBhbmQgYmFja3dhcmRzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPiBwYXRjaDEucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CistLS0gL2Rldi9udWxsCisrKysgYi9uZXcudHh0CitAQCAtMCwwICsxLDEyIEBACisrYTEKKythMTEKKythMTExCisrYTExMTEKKytiMQorK2IxMQorK2IxMTEKKytiMTExMQorK2MxCisrYzExCisrYzExMQorK2MxMTExCitFT0YKK2NhdCA+IHBhdGNoMi5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorLS0tIGEvbmV3LnR4dAorKysrIGIvbmV3LnR4dAorQEAgLTEsNyArMSwzIEBACistYTEKKy1hMTEKKy1hMTExCistYTExMTEKKyBiMQorIGIxMQorIGIxMTEKK0VPRgorY2F0ID4gcGF0Y2gzLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtNiw2ICs2LDEwIEBACisgYjExCisgYjExMQorIGIxMTExCisrYjIKKytiMjIKKytiMjIyCisrYjIyMjIKKyBjMQorIGMxMQorIGMxMTEKK0VPRgorY2F0ID4gcGF0Y2g0LnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtMSwzICsxLDcgQEAKKythMQorK2ExMQorK2ExMTEKKythMTExMQorIGIxCisgYjExCisgYjExMQorRU9GCitjYXQgPiBwYXRjaDUucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKKy0tLSBhL25ldy50eHQKKysrKyBiL25ldy50eHQKK0BAIC0xMCwzICsxMCw3IEBACisgYzExCisgYzExMQorIGMxMTExCisrYzIKKytjMjIKKytjMjIyCisrYzIyMjIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0LWFwcGx5IHNjYW4iIFwKKyAgICAnZ2l0LWFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoIHBhdGNoNC5wYXRjaCBwYXRjaDUucGF0Y2gnCittdiBuZXcudHh0IGFwcGx5LnR4dAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggc2NhbiIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2ggcGF0Y2g0LnBhdGNoIHBhdGNoNS5wYXRjaCB8IHBhdGNoJworbXYgbmV3LnR4dCBwYXRjaC50eHQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGNtcCIgXAorICAgICdjbXAgYXBwbHkudHh0IHBhdGNoLnR4dCcKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDQxMTItYXBwbHktcmVuYW1lcy5zaCBiL3QvdDQxMTItYXBwbHktcmVuYW1lcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OWU5NjAzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDExMi1hcHBseS1yZW5hbWVzLnNoCkBAIC0wLDAgKzEsMTI0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBzaG91bGQgbm90IGdldCBjb25mdXNlZCB3aXRoIHJlbmFtZS9jb3B5LgorCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK21rZGlyIC1wIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMKKworY2F0ID5rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCA8PFxFT0YKKy8qCisgKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworICB1bnNpZ25lZCBsb25nIF9fcmJ4OworICB1bnNpZ25lZCBsb25nIF9fcnNwOworICB1bnNpZ25lZCBsb25nIF9fcmJwOworICB1bnNpZ25lZCBsb25nIF9fcjEyOworICB1bnNpZ25lZCBsb25nIF9fcjEzOworICB1bnNpZ25lZCBsb25nIF9fcjE0OworICB1bnNpZ25lZCBsb25nIF9fcjE1OworICB1bnNpZ25lZCBsb25nIF9fcmlwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZiAvKiBfU0VUSk1QX0ggKi8KK0VPRgorCitjYXQgPnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL2tsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oIGIvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNldGptcC5oCitzaW1pbGFyaXR5IGluZGV4IDc2JQorY29weSBmcm9tIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCitjb3B5IHRvIGluY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorLS0tIGEva2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysrKyBiL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorQEAgLTEsMjEgKzEsMjQgQEAKKyAvKgorLSAqIGFyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisrICogYXJjaC9jcmlzL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgICovCisgCisgI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisgI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisgCisgc3RydWN0IF9fam1wX2J1ZiB7CistICB1bnNpZ25lZCBsb25nIF9fcmJ4OworLSAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYnA7CistICB1bnNpZ25lZCBsb25nIF9fcjEyOworLSAgdW5zaWduZWQgbG9uZyBfX3IxMzsKKy0gIHVuc2lnbmVkIGxvbmcgX19yMTQ7CistICB1bnNpZ25lZCBsb25nIF9fcjE1OworLSAgdW5zaWduZWQgbG9uZyBfX3JpcDsKKysgIHVuc2lnbmVkIGxvbmcgX19yMDsKKysgIHVuc2lnbmVkIGxvbmcgX19yMTsKKysgIHVuc2lnbmVkIGxvbmcgX19yMjsKKysgIHVuc2lnbmVkIGxvbmcgX19yMzsKKysgIHVuc2lnbmVkIGxvbmcgX19yNDsKKysgIHVuc2lnbmVkIGxvbmcgX19yNTsKKysgIHVuc2lnbmVkIGxvbmcgX19yNjsKKysgIHVuc2lnbmVkIGxvbmcgX19yNzsKKysgIHVuc2lnbmVkIGxvbmcgX19yODsKKysgIHVuc2lnbmVkIGxvbmcgX19zcDsKKysgIHVuc2lnbmVkIGxvbmcgX19zcnA7CisgfTsKKyAKKyB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKyAKKy0jZW5kaWYgLyogX1NFVEpNUF9IICovCisrI2VuZGlmIC8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KK2RpZmYgLS1naXQgYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaAorc2ltaWxhcml0eSBpbmRleCA2NiUKK3JlbmFtZSBmcm9tIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCityZW5hbWUgdG8gaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCistLS0gYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorKysrIGIvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCitAQCAtMSwyMSArMSwyMSBAQAorIC8qCistICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysgKiBhcmNoL20zMnIvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAgKi8KKyAKKyAjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyAjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKyAKKyBzdHJ1Y3QgX19qbXBfYnVmIHsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYng7CistICB1bnNpZ25lZCBsb25nIF9fcnNwOworLSAgdW5zaWduZWQgbG9uZyBfX3JicDsKKysgIHVuc2lnbmVkIGxvbmcgX19yODsKKysgIHVuc2lnbmVkIGxvbmcgX19yOTsKKysgIHVuc2lnbmVkIGxvbmcgX19yMTA7CisrICB1bnNpZ25lZCBsb25nIF9fcjExOworICAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTM7CisgICB1bnNpZ25lZCBsb25nIF9fcjE0OworICAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKy0gIHVuc2lnbmVkIGxvbmcgX19yaXA7CisgfTsKKyAKKyB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKyAKKy0jZW5kaWYgLyogX1NFVEpNUF9IICovCisrI2VuZGlmIC8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KK0VPRgorCitmaW5kIGtsaWJjIC10eXBlIGYgLXByaW50IHwgeGFyZ3MgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayByZW5hbWUvY29weSBwYXRjaCcgJ2dpdC1hcHBseSAtLWNoZWNrIHBhdGNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSByZW5hbWUvY29weSBwYXRjaCcgJ2dpdC1hcHBseSAtLWluZGV4IHBhdGNoJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTMtYXBwbHktZW5kaW5nLnNoIGIvdC90NDExMy1hcHBseS1lbmRpbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZkMGNmNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTMtYXBwbHktZW5kaW5nLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2F0YWxpbiBNYXJpbmFzCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSB0cnlpbmcgdG8gYWRkIGFuIGVuZGluZyBsaW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPnRlc3QtcGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvZmlsZSBiL2ZpbGUKKy0tLSBhL2ZpbGUKKysrKyBiL2ZpbGUKK0BAIC0xLDIgKzEsMyBAQAorIGEKKyBiCisrYworRU9GCisKK2VjaG8gJ2EnID5maWxlCitlY2hvICdiJyA+PmZpbGUKK2VjaG8gJ2MnID4+ZmlsZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlJworCisjIHRlc3QKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYXQgdGhlIGVuZCcgXAorICAgICdnaXQtYXBwbHkgLS1pbmRleCB0ZXN0LXBhdGNoJworCitjYXQgPnRlc3QtcGF0Y2ggPDxcRU9GCitkaWZmIGEvZmlsZSBiL2ZpbGUKKy0tLSBhL2ZpbGUKKysrKyBiL2ZpbGUKK0BAIC0xLDIgKzEsMyBAQAorK2EKKyBiCisgYworRU9GCisKK2VjaG8gPmZpbGUgJ2EKK2IKK2MnCitnaXQtdXBkYXRlLWluZGV4IGZpbGUKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYXQgdGhlIGJlZ2lubmluZycgXAorCSdnaXQtYXBwbHkgLS1pbmRleCB0ZXN0LXBhdGNoJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTQtYXBwbHktdHlwZWNoYW5nZS5zaCBiL3QvdDQxMTQtYXBwbHktdHlwZWNoYW5nZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTgxZDcyMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTQtYXBwbHktdHlwZWNoYW5nZS5zaApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHNob3VsZCBub3QgZ2V0IGNvbmZ1c2VkIHdpdGggdHlwZSBjaGFuZ2VzLgorCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCByZXBvc2l0b3J5IGFuZCBjb21taXRzJyAnCisJZWNobyAiaGVsbG8gd29ybGQiID4gZm9vICYmCisJZWNobyAiaGkgcGxhbmV0IiA+IGJhciAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZm9vIGJhciAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCBicmFuY2ggaW5pdGlhbCAmJgorCXJtIC1mIGZvbyAmJgorCWxuIC1zIGJhciBmb28gJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZvbyAmJgorCWdpdCBjb21taXQgLW0gImZvbyBzeW1saW5rZWQgdG8gYmFyIiAmJgorCWdpdCBicmFuY2ggZm9vLXN5bWxpbmtlZC10by1iYXIgJiYKKwlybSAtZiBmb28gJiYKKwllY2hvICJob3cgZmFyIGlzIHRoZSBzdW4/IiA+IGZvbyAmJgorCWdpdCB1cGRhdGUtaW5kZXggZm9vICYmCisJZ2l0IGNvbW1pdCAtbSAiZm9vIGJhY2sgdG8gZmlsZSIgJiYKKwlnaXQgYnJhbmNoIGZvby1iYWNrLXRvLWZpbGUgJiYKKwlybSAtZiBmb28gJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGZvbyAmJgorCW1rZGlyIGZvbyAmJgorCWVjaG8gImlmIG9ubHkgSSBrbmV3IiA+IGZvby9iYXogJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZvby9iYXogJiYKKwlnaXQgY29tbWl0IC1tICJmb28gYmVjb21lcyBhIGRpcmVjdG9yeSIgJiYKKwlnaXQgYnJhbmNoICJmb28tYmVjb21lcy1hLWRpcmVjdG9yeSIgJiYKKwllY2hvICJoZWxsbyB3b3JsZCIgPiBmb28vYmF6ICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmb28vYmF6ICYmCisJZ2l0IGNvbW1pdCAtbSAiZm9vL2JheiBpcyB0aGUgb3JpZ2luYWwgZm9vIiAmJgorCWdpdCBicmFuY2ggZm9vLWJhei1yZW5hbWVkLWZyb20tZm9vCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaWxlIHJlbmFtZWQgZnJvbSBmb28gdG8gZm9vL2JheicgJworCWdpdCBjaGVja291dCAtZiBpbml0aWFsICYmCisJZ2l0IGRpZmYtdHJlZSAtTSAtcCBIRUFEIGZvby1iYXotcmVuYW1lZC1mcm9tLWZvbyA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaWxlIHJlbmFtZWQgZnJvbSBmb28vYmF6IHRvIGZvbycgJworCWdpdCBjaGVja291dCAtZiBmb28tYmF6LXJlbmFtZWQtZnJvbS1mb28gJiYKKwlnaXQgZGlmZi10cmVlIC1NIC1wIEhFQUQgaW5pdGlhbCA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaXJlY3RvcnkgYmVjb21lcyBmaWxlJyAnCisJZ2l0IGNoZWNrb3V0IC1mIGZvby1iZWNvbWVzLWEtZGlyZWN0b3J5ICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGluaXRpYWwgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlsZSBiZWNvbWVzIGRpcmVjdG9yeScgJworCWdpdCBjaGVja291dCAtZiBpbml0aWFsICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGZvby1iZWNvbWVzLWEtZGlyZWN0b3J5ID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbGUgYmVjb21lcyBzeW1saW5rJyAnCisJZ2l0IGNoZWNrb3V0IC1mIGluaXRpYWwgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgZm9vLXN5bWxpbmtlZC10by1iYXIgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3ltbGluayBiZWNvbWVzIGZpbGUnICcKKwlnaXQgY2hlY2tvdXQgLWYgZm9vLXN5bWxpbmtlZC10by1iYXIgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgZm9vLWJhY2stdG8tZmlsZSA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzeW1saW5rIGJlY29tZXMgZGlyZWN0b3J5JyAnCisJZ2l0IGNoZWNrb3V0IC1mIGZvby1zeW1saW5rZWQtdG8tYmFyICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGZvby1iZWNvbWVzLWEtZGlyZWN0b3J5ID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpcmVjdG9yeSBiZWNvbWVzIHN5bWxpbmsnICcKKwlnaXQgY2hlY2tvdXQgLWYgZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgZm9vLXN5bWxpbmtlZC10by1iYXIgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTE1LWFwcGx5LXN5bWxpbmsuc2ggYi90L3Q0MTE1LWFwcGx5LXN5bWxpbmsuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjk0N2VkOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTUtYXBwbHktc3ltbGluay5zaApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBzeW1saW5rcyBhbmQgcGFydGlhbCBmaWxlcworCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCWxuIC1zIHBhdGgxL3BhdGgyL3BhdGgzL3BhdGg0L3BhdGg1IGxpbmsxICYmCisJZ2l0IGFkZCBsaW5rPyAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCisJZ2l0IGJyYW5jaCBzaWRlICYmCisKKwlybSAtZiBsaW5rPyAmJgorCisJbG4gLXMgaHRhcDYgbGluazEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGxpbms/ICYmCisJZ2l0IGNvbW1pdCAtbSBzZWNvbmQgJiYKKworCWdpdCBkaWZmLXRyZWUgLXAgSEVBRF4gSEVBRCA+cGF0Y2ggICYmCisJZ2l0IGFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgcGF0Y2gKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBzeW1saW5rIHBhdGNoJyAnCisKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCWdpdCBhcHBseSBwYXRjaCAmJgorCWdpdCBkaWZmLWZpbGVzIC1wID5wYXRjaGVkICYmCisJZ2l0IGRpZmYgcGF0Y2ggcGF0Y2hlZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0taW5kZXggc3ltbGluayBwYXRjaCcgJworCisJZ2l0IGNoZWNrb3V0IC1mIHNpZGUgJiYKKwlnaXQgYXBwbHkgLS1pbmRleCBwYXRjaCAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC1wIEhFQUQgPnBhdGNoZWQgJiYKKwlnaXQgZGlmZiBwYXRjaCBwYXRjaGVkCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTE2LWFwcGx5LXJldmVyc2Uuc2ggYi90L3Q0MTE2LWFwcGx5LXJldmVyc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTFlMDI4MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTYtYXBwbHktcmV2ZXJzZS5zaApAQCAtMCwwICsxLDkxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBpbiByZXZlcnNlCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIGkgaW4gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuOyBkbyBlY2hvICRpOyBkb25lID5maWxlMSAmJgorCXRyICJbaWprXSIgJ1wnJ1tcMFwxXDJdJ1wnJyA8ZmlsZTEgPmZpbGUyICYmCisKKwlnaXQgYWRkIGZpbGUxIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IHRhZyBpbml0aWFsICYmCisKKwlmb3IgaSBpbiBhIGIgYyBnIGggaSBKIEsgTCBtIG8gbiBwIHE7IGRvIGVjaG8gJGk7IGRvbmUgPmZpbGUxICYmCisJdHIgIlttb25dIiAnXCcnW1wwXDFcMl0nXCcnIDxmaWxlMSA+ZmlsZTIgJiYKKworCWdpdCBjb21taXQgLWEgLW0gc2Vjb25kICYmCisJZ2l0IHRhZyBzZWNvbmQgJiYKKworCWdpdCBkaWZmIC0tYmluYXJ5IGluaXRpYWwgc2Vjb25kID5wYXRjaAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGluIGZvcndhcmQnICcKKworCVQwPWBnaXQgcmV2LXBhcnNlICJzZWNvbmRee3RyZWV9ImAgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIGluaXRpYWwgJiYKKwlnaXQgYXBwbHkgLS1pbmRleCAtLWJpbmFyeSBwYXRjaCAmJgorCVQxPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwl0ZXN0ICIkVDAiID0gIiRUMSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgaW4gcmV2ZXJzZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCBzZWNvbmQgJiYKKwlnaXQgYXBwbHkgLS1yZXZlcnNlIC0tYmluYXJ5IC0taW5kZXggcGF0Y2ggJiYKKwlnaXQgZGlmZiA+ZGlmZiAmJgorCWdpdCBkaWZmIC9kZXYvbnVsbCBkaWZmCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc2VwYXJhdGUgcmVwb3NpdG9yeSBsYWNraW5nIHBvc3RpbWFnZScgJworCisJZ2l0IHRhci10cmVlIGluaXRpYWwgaW5pdGlhbCB8IHRhciB4ZiAtICYmCisJKAorCQljZCBpbml0aWFsICYmIGdpdCBpbml0ICYmIGdpdCBhZGQgLgorCSkgJiYKKworCWdpdCB0YXItdHJlZSBzZWNvbmQgc2Vjb25kIHwgdGFyIHhmIC0gJiYKKwkoCisJCWNkIHNlY29uZCAmJiBnaXQgaW5pdCAmJiBnaXQgYWRkIC4KKwkpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgaW4gZm9yd2FyZCB3aXRob3V0IHBvc3RpbWFnZScgJworCisJVDA9YGdpdCByZXYtcGFyc2UgInNlY29uZF57dHJlZX0iYCAmJgorCSgKKwkJY2QgaW5pdGlhbCAmJgorCQlnaXQgYXBwbHkgLS1pbmRleCAtLWJpbmFyeSAuLi9wYXRjaCAmJgorCQlUMT1gZ2l0IHdyaXRlLXRyZWVgICYmCisJCXRlc3QgIiRUMCIgPSAiJFQxIgorCSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgaW4gcmV2ZXJzZSB3aXRob3V0IHBvc3RpbWFnZScgJworCisJVDA9YGdpdCByZXYtcGFyc2UgImluaXRpYWxee3RyZWV9ImAgJiYKKwkoCisJCWNkIHNlY29uZCAmJgorCQlnaXQgYXBwbHkgLS1pbmRleCAtLWJpbmFyeSAtLXJldmVyc2UgLi4vcGF0Y2ggJiYKKwkJVDE9YGdpdCB3cml0ZS10cmVlYCAmJgorCQl0ZXN0ICIkVDAiID0gIiRUMSIKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JldmVyc2luZyBhIHdoaXRlc3BhY2UgaW50cm9kdWN0aW9uJyAnCisJc2VkICJzL2EvYSAvIiA8IGZpbGUxID4gZmlsZTEubmV3ICYmCisJbXYgZmlsZTEubmV3IGZpbGUxICYmCisJZ2l0IGRpZmYgfCBnaXQgYXBwbHkgLS1yZXZlcnNlIC0td2hpdGVzcGFjZT1lcnJvcgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTctYXBwbHktcmVqZWN0LnNoIGIvdC90NDExNy1hcHBseS1yZWplY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTE5MzFmMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTctYXBwbHktcmVqZWN0LnNoCkBAIC0wLDAgKzEsMTU3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSB3aXRoIHJlamVjdHMKKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEKKwlkbworCQllY2hvICRpCisJZG9uZSA+ZmlsZTEgJiYKKwljYXQgZmlsZTEgPnNhdmVkLmZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMSAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCisJZm9yIGkgaW4gMSAyIEEgQiA0IDUgNiA3IDggOSAxMCAxMSAxMiBDIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIEQgMjEKKwlkbworCQllY2hvICRpCisJZG9uZSA+ZmlsZTEgJiYKKwlnaXQgZGlmZiA+cGF0Y2guMSAmJgorCWNhdCBmaWxlMSA+Y2xlYW4gJiYKKworCWZvciBpIGluIDEgRSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgQyAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCBGIDIxCisJZG8KKwkJZWNobyAkaQorCWRvbmUgPmV4cGVjdGVkICYmCisKKwltdiBmaWxlMSBmaWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZmlsZTEgZmlsZTIgJiYKKwlnaXQgZGlmZiAtTSBIRUFEID5wYXRjaC4yICYmCisKKwlybSAtZiBmaWxlMSBmaWxlMiAmJgorCW12IHNhdmVkLmZpbGUxIGZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMSBmaWxlMiAmJgorCisJZm9yIGkgaW4gMSBFIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCBGIDIxCisJZG8KKwkJZWNobyAkaQorCWRvbmUgPmZpbGUxICYmCisKKwljYXQgZmlsZTEgPnNhdmVkLmZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHdpdGhvdXQgLS1yZWplY3Qgc2hvdWxkIGZhaWwnICcKKworCWlmIGdpdCBhcHBseSBwYXRjaC4xCisJdGhlbgorCQllY2hvICJFaD8gV2h5PyIKKwkJZXhpdCAxCisJZmkKKworCWdpdCBkaWZmIGZpbGUxIHNhdmVkLmZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHdpdGhvdXQgLS1yZWplY3Qgc2hvdWxkIGZhaWwnICcKKworCWlmIGdpdCBhcHBseSAtLXZlcmJvc2UgcGF0Y2guMQorCXRoZW4KKwkJZWNobyAiRWg/IFdoeT8iCisJCWV4aXQgMQorCWZpCisKKwlnaXQgZGlmZiBmaWxlMSBzYXZlZC5maWxlMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSB3aXRoIC0tcmVqZWN0IHNob3VsZCBmYWlsIGJ1dCB1cGRhdGUgdGhlIGZpbGUnICcKKworCWNhdCBzYXZlZC5maWxlMSA+ZmlsZTEgJiYKKwlybSAtZiBmaWxlMS5yZWogZmlsZTIucmVqICYmCisKKwlpZiBnaXQgYXBwbHkgLS1yZWplY3QgcGF0Y2guMQorCXRoZW4KKwkJZWNobyAic3VjY2VlZHMgd2l0aCAtLXJlamVjdD8iCisJCWV4aXQgMQorCWZpCisKKwlnaXQgZGlmZiBmaWxlMSBleHBlY3RlZCAmJgorCisJY2F0IGZpbGUxLnJlaiAmJgorCisJaWYgdGVzdCAtZiBmaWxlMi5yZWoKKwl0aGVuCisJCWVjaG8gImZpbGUyIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRvdWNoZWQiCisJCWV4aXQgMQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHdpdGggLS1yZWplY3Qgc2hvdWxkIGZhaWwgYnV0IHVwZGF0ZSB0aGUgZmlsZScgJworCisJY2F0IHNhdmVkLmZpbGUxID5maWxlMSAmJgorCXJtIC1mIGZpbGUxLnJlaiBmaWxlMi5yZWogZmlsZTIgJiYKKworCWlmIGdpdCBhcHBseSAtLXJlamVjdCBwYXRjaC4yID5yZWplY3RzCisJdGhlbgorCQllY2hvICJzdWNjZWVkcyB3aXRoIC0tcmVqZWN0PyIKKwkJZXhpdCAxCisJZmkKKworCXRlc3QgLWYgZmlsZTEgJiYgeworCQllY2hvICJmaWxlMSBzdGlsbCBleGlzdHM/IgorCQlleGl0IDEKKwl9CisJZ2l0IGRpZmYgZmlsZTIgZXhwZWN0ZWQgJiYKKworCWNhdCBmaWxlMi5yZWogJiYKKworCWlmIHRlc3QgLWYgZmlsZTEucmVqCisJdGhlbgorCQllY2hvICJmaWxlMiBzaG91bGQgbm90IGhhdmUgYmVlbiB0b3VjaGVkIgorCQlleGl0IDEKKwlmaQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoZSBzYW1lIHRlc3Qgd2l0aCAtLXZlcmJvc2UnICcKKworCWNhdCBzYXZlZC5maWxlMSA+ZmlsZTEgJiYKKwlybSAtZiBmaWxlMS5yZWogZmlsZTIucmVqIGZpbGUyICYmCisKKwlpZiBnaXQgYXBwbHkgLS1yZWplY3QgLS12ZXJib3NlIHBhdGNoLjIgPnJlamVjdHMKKwl0aGVuCisJCWVjaG8gInN1Y2NlZWRzIHdpdGggLS1yZWplY3Q/IgorCQlleGl0IDEKKwlmaQorCisJdGVzdCAtZiBmaWxlMSAmJiB7CisJCWVjaG8gImZpbGUxIHN0aWxsIGV4aXN0cz8iCisJCWV4aXQgMQorCX0KKwlnaXQgZGlmZiBmaWxlMiBleHBlY3RlZCAmJgorCisJY2F0IGZpbGUyLnJlaiAmJgorCisJaWYgdGVzdCAtZiBmaWxlMS5yZWoKKwl0aGVuCisJCWVjaG8gImZpbGUyIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRvdWNoZWQiCisJCWV4aXQgMQorCWZpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgY2xlYW5seSB3aXRoIC0tdmVyYm9zZScgJworCisJZ2l0IGNhdC1maWxlIC1wIEhFQUQ6ZmlsZTEgPmZpbGUxICYmCisJcm0gLWYgZmlsZT8ucmVqIGZpbGUyICYmCisKKwlnaXQgYXBwbHkgLS12ZXJib3NlIHBhdGNoLjEgJiYKKworCWdpdCBkaWZmIGZpbGUxIGNsZWFuCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDExOC1hcHBseS1lbXB0eS1jb250ZXh0LnNoIGIvdC90NDExOC1hcHBseS1lbXB0eS1jb250ZXh0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3Y2M2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTE4LWFwcGx5LWVtcHR5LWNvbnRleHQuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgd2l0aCBuZXcgc3R5bGUgR05VIGRpZmYgd2l0aCBlbXB0eSBjb250ZXh0CisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCXsKKwkJZWNobzsgZWNobzsKKwkJZWNobyBBOyBlY2hvIEI7IGVjaG8gQzsKKwkJZWNobzsKKwl9ID5maWxlMSAmJgorCWNhdCBmaWxlMSA+ZmlsZTEub3JpZyAmJgorCXsKKwkJY2F0IGZpbGUxICYmCisJCWVjaG8gUSB8IHRyIC1kICJcXDAxMiIKKwl9ID5maWxlMiAmJgorCWNhdCBmaWxlMiA+ZmlsZTIub3JpZworCWdpdCBhZGQgZmlsZTEgZmlsZTIgJiYKKwlzZWQgLWUgIi9eQi9kIiA8ZmlsZTEub3JpZyA+ZmlsZTEgJiYKKwlzZWQgLWUgIi9eW0JRXS9kIiA8ZmlsZTIub3JpZyA+ZmlsZTIgJiYKKwllY2hvIFEgfCB0ciAtZCAiXFwwMTIiID4+ZmlsZTIgJiYKKwljYXQgZmlsZTEgPmZpbGUxLm1vZHMgJiYKKwljYXQgZmlsZTIgPmZpbGUyLm1vZHMgJiYKKwlnaXQgZGlmZiB8CisJc2VkIC1lICJzL14gXCQvLyIgPmRpZmYub3V0cHV0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0tbnVtc3RhdCcgJworCisJZ2l0IGFwcGx5IC0tbnVtc3RhdCBkaWZmLm91dHB1dCA+YWN0dWFsICYmCisJeworCQllY2hvICIwCTEJZmlsZTEiICYmCisJCWVjaG8gIjAJMQlmaWxlMiIKKwl9ID5leHBlY3QgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgLS1hcHBseScgJworCisJY2F0IGZpbGUxLm9yaWcgPmZpbGUxICYmCisJY2F0IGZpbGUyLm9yaWcgPmZpbGUyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlMSBmaWxlMiAmJgorCWdpdCBhcHBseSAtLWluZGV4IGRpZmYub3V0cHV0ICYmCisJZ2l0IGRpZmYgZmlsZTEubW9kcyBmaWxlMSAmJgorCWdpdCBkaWZmIGZpbGUyLm1vZHMgZmlsZTIKKycKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDQxMTktYXBwbHktY29uZmlnLnNoIGIvdC90NDExOS1hcHBseS1jb25maWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjIwYTkyMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTktYXBwbHktY29uZmlnLnNoCkBAIC0wLDAgKzEsMTYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJbWtkaXIgc3ViICYmCisJZWNobyBBID5zdWIvZmlsZTEgJiYKKwljcCBzdWIvZmlsZTEgc2F2ZWQgJiYKKwlnaXQgYWRkIHN1Yi9maWxlMSAmJgorCWVjaG8gIkIgIiA+c3ViL2ZpbGUxICYmCisJZ2l0IGRpZmYgPnBhdGNoLmZpbGUKKycKKworIyBBbHNvIGhhbmRjcmFmdCBHTlUgZGlmZiBvdXRwdXQ7IG5vdGUgdGhpcyBoYXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KK2NhdCA+Z3BhdGNoLmZpbGUgPDxcRU9GICYmCistLS0gZmlsZTEJMjAwNy0wMi0yMSAwMTowNDoyNC4wMDAwMDAwMDAgLTA4MDAKKysrKyBmaWxlMSsJMjAwNy0wMi0yMSAwMTowNzo0NC4wMDAwMDAwMDAgLTA4MDAKK0BAIC0xICsxIEBACistQQorK0IgCitFT0YKKworc2VkIC1lICdzfGZpbGUxfHN1Yi8mfCcgZ3BhdGNoLmZpbGUgPmdwYXRjaC1zdWIuZmlsZSAmJgorc2VkIC1lICcKKwkvXi0tLSAvc3xmaWxlMXxhL3N1Yi8mfAorCS9eKysrIC9zfGZpbGUxfGIvc3ViLyZ8CisnIGdwYXRjaC5maWxlID5ncGF0Y2gtYWItc3ViLmZpbGUgJiYKKworY2hlY2tfcmVzdWx0ICgpIHsKKwlpZiBncmVwICIgIiAiJDEiCisJdGhlbgorCQllY2hvICJFaD8iCisJCWZhbHNlCisJZWxpZiBncmVwIEIgIiQxIgorCXRoZW4KKwkJZWNobyBIYXBweQorCWVsc2UKKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwlmaQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAnICcKKworCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPXN0cmlwIHBhdGNoLmZpbGUgJiYKKwljaGVja19yZXN1bHQgc3ViL2ZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBmcm9tIGNvbmZpZycgJworCisJcm0gLWYgc3ViL2ZpbGUxICYmCisJY3Agc2F2ZWQgc3ViL2ZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggJiYKKworCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCWdpdCBhcHBseSBwYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IHN1Yi9maWxlMQorJworCitEPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBpbiBzdWJkaXInICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIC0tdW5zZXQtYWxsIGFwcGx5LndoaXRlc3BhY2UKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCAuLi9wYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBmcm9tIGNvbmZpZyBpbiBzdWJkaXInICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIGFwcGx5LndoaXRlc3BhY2Ugc3RyaXAgJiYKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC4uL3BhdGNoLmZpbGUgJiYKKwljaGVja19yZXN1bHQgZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FtZSBpbiBzdWJkaXIgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQnICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIGFwcGx5LndoaXRlc3BhY2Ugc3RyaXAgJiYKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC4uL2dwYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMScgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwljZCBzdWIgJiYKKwlnaXQgYXBwbHkgLi4vZ3BhdGNoLXN1Yi5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMicgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwljZCBzdWIgJiYKKwlnaXQgYXBwbHkgLi4vZ3BhdGNoLWFiLXN1Yi5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMScgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwlnaXQgYXBwbHkgLXAwIGdwYXRjaC1zdWIuZmlsZSAmJgorCWNoZWNrX3Jlc3VsdCBzdWIvZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FtZSBidXQgd2l0aCB0cmFkaXRpb25hbCBwYXRjaCBpbnB1dCBvZiBkZXB0aCAyJyAnCisKKwljZCAiJEQiICYmCisJZ2l0IGNvbmZpZyBhcHBseS53aGl0ZXNwYWNlIHN0cmlwICYmCisJcm0gLWYgc3ViL2ZpbGUxICYmCisJY3Agc2F2ZWQgc3ViL2ZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggJiYKKworCWdpdCBhcHBseSBncGF0Y2gtYWItc3ViLmZpbGUgJiYKKwljaGVja19yZXN1bHQgc3ViL2ZpbGUxCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyMC1hcHBseS1wb3B0LnNoIGIvdC90NDEyMC1hcHBseS1wb3B0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmNjcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTIwLWFwcGx5LXBvcHQuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBTaGF3biBPLiBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IC1wIGhhbmRsaW5nLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCW1rZGlyIHN1YiAmJgorCWVjaG8gQSA+c3ViL2ZpbGUxICYmCisJY3Agc3ViL2ZpbGUxIGZpbGUxICYmCisJZ2l0IGFkZCBzdWIvZmlsZTEgJiYKKwllY2hvIEIgPnN1Yi9maWxlMSAmJgorCWdpdCBkaWZmID5wYXRjaC5maWxlICYmCisJcm0gc3ViL2ZpbGUxICYmCisJcm1kaXIgc3ViCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGdpdCBkaWZmIHdpdGggLXAyJyAnCisJZ2l0IGFwcGx5IC1wMiBwYXRjaC5maWxlCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyMS1hcHBseS1kaWZmcy5zaCBiL3QvdDQxMjEtYXBwbHktZGlmZnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIyZjFlZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMjEtYXBwbHktZGlmZnMuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBmb3IgY29udGV4dHVhbGx5IGluZGVwZW5kZW50IGRpZmZzJworLiAuL3Rlc3QtbGliLnNoCisKK2VjaG8gJzEKKzIKKzMKKzQKKzUKKzYKKzcKKzgnID5maWxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyBcCisJJ2dpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLXEgLW0gMSAmJgorCWdpdCBjaGVja291dCAtYiB0ZXN0ICYmCisJbXYgZmlsZSBmaWxlLnRtcCAmJgorCWVjaG8gMCA+ZmlsZSAmJgorCWNhdCBmaWxlLnRtcCA+PmZpbGUgJiYKKwlybSBmaWxlLnRtcCAmJgorCWdpdCBjb21taXQgLWEgLXEgLW0gMiAmJgorCWVjaG8gOSA+PmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1xIC1tIDMgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hlY2sgaWYgY29udGV4dHVhbGx5IGluZGVwZW5kZW50IGRpZmZzIGZvciB0aGUgc2FtZSBmaWxlIGFwcGx5JyBcCisJJyggZ2l0IGRpZmYgdGVzdH4yIHRlc3R+MTsgZ2l0IGRpZmYgdGVzdH4xIHRlc3R+MCApfCBnaXQgYXBwbHknCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MTIyLWFwcGx5LXN5bWxpbmstaW5zaWRlLnNoIGIvdC90NDEyMi1hcHBseS1zeW1saW5rLWluc2lkZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGRmZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEyMi1hcHBseS1zeW1saW5rLWluc2lkZS5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nYXBwbHkgdG8gZGVlcGVyIGRpcmVjdG9yeSB3aXRob3V0IGdldHRpbmcgZm9vbGVkIHdpdGggc3ltbGluaycKKy4gLi90ZXN0LWxpYi5zaAorCitsZWNobyAoKSB7CisJZm9yIGxfCisJZG8KKwkJZWNobyAiJGxfIgorCWRvbmUKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlta2RpciAtcCBhcmNoL2kzODYvYm9vdCBhcmNoL3g4Nl82NCAmJgorCWxlY2hvIDEgMiAzIDQgNSA+YXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgJiYKKwlsbiAtcyAuLi9pMzg2L2Jvb3QgYXJjaC94ODZfNjQvYm9vdCAmJgorCWdpdCBhZGQgLiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCBicmFuY2ggdGVzdCAmJgorCisJcm0gYXJjaC94ODZfNjQvYm9vdCAmJgorCW1rZGlyIGFyY2gveDg2XzY0L2Jvb3QgJiYKKwlsZWNobyAyIDMgNCA1IDYgPmFyY2gveDg2XzY0L2Jvb3QvTWFrZWZpbGUgJiYKKwlnaXQgYWRkIC4gJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1hIC1tIHNlY29uZCAmJgorCisJZ2l0IGZvcm1hdC1wYXRjaCAtLWJpbmFyeSAtMSAtLXN0ZG91dCA+dGVzdC5wYXRjaAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgYXBwbHkgJworCisJZ2l0IGNoZWNrb3V0IHRlc3QgJiYKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSB0ZXN0ICYmCisJZ2l0IGRpZmYgLS1leGl0LWNvZGUgLS1jYWNoZWQgdGVzdCAmJgorCWdpdCBhcHBseSAtLWluZGV4IHRlc3QucGF0Y2gKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayByZXN1bHQnICcKKworCWdpdCBkaWZmIC0tZXhpdC1jb2RlIG1hc3RlciAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIC0tY2FjaGVkIG1hc3RlciAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gcmVwbGF5ICYmCisJVDE9JChnaXQgcmV2LXBhcnNlICJtYXN0ZXJee3RyZWV9IikgJiYKKwlUMj0kKGdpdCByZXYtcGFyc2UgIkhFQURee3RyZWV9IikgJiYKKwl0ZXN0ICJ6JFQxIiA9ICJ6JFQyIgorCisnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MjAwLXJlcmVyZS5zaCBiL3QvdDQyMDAtcmVyZXJlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2NGViYmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MjAwLXJlcmVyZS5zaApAQCAtMCwwICsxLDE1MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXJlcmUKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK2NhdCA+IGExIDw8IEVPRgorV2hldGhlciAndGlzIG5vYmxlciBpbiB0aGUgbWluZCB0byBzdWZmZXIKK1RoZSBzbGluZ3MgYW5kIGFycm93cyBvZiBvdXRyYWdlb3VzIGZvcnR1bmUsCitPciB0byB0YWtlIGFybXMgYWdhaW5zdCBhIHNlYSBvZiB0cm91YmxlcywKK0FuZCBieSBvcHBvc2luZyBlbmQgdGhlbT8gVG8gZGllOiB0byBzbGVlcDsKK05vIG1vcmU7IGFuZCBieSBhIHNsZWVwIHRvIHNheSB3ZSBlbmQKK1RoZSBoZWFydC1hY2hlIGFuZCB0aGUgdGhvdXNhbmQgbmF0dXJhbCBzaG9ja3MKK1RoYXQgZmxlc2ggaXMgaGVpciB0bywgJ3RpcyBhIGNvbnN1bW1hdGlvbgorRGV2b3V0bHkgdG8gYmUgd2lzaCdkLgorRU9GCisKK2dpdCBhZGQgYTEKK2dpdCBjb21taXQgLXEgLWEgLW0gaW5pdGlhbAorCitnaXQgY2hlY2tvdXQgLWIgZmlyc3QKK2NhdCA+PiBhMSA8PCBFT0YKK1RvIGRpZSwgdG8gc2xlZXA7CitUbyBzbGVlcDogcGVyY2hhbmNlIHRvIGRyZWFtOiBheSwgdGhlcmUncyB0aGUgcnViOworRm9yIGluIHRoYXQgc2xlZXAgb2YgZGVhdGggd2hhdCBkcmVhbXMgbWF5IGNvbWUKK1doZW4gd2UgaGF2ZSBzaHVmZmxlZCBvZmYgdGhpcyBtb3J0YWwgY29pbCwKK011c3QgZ2l2ZSB1cyBwYXVzZTogdGhlcmUncyB0aGUgcmVzcGVjdAorVGhhdCBtYWtlcyBjYWxhbWl0eSBvZiBzbyBsb25nIGxpZmU7CitFT0YKK2dpdCBjb21taXQgLXEgLWEgLW0gZmlyc3QKKworZ2l0IGNoZWNrb3V0IC1iIHNlY29uZCBtYXN0ZXIKK2dpdCBzaG93IGZpcnN0OmExIHwKK3NlZCAtZSAncy9UbyBkaWUsIHQvVG8gZGllISBULycgPiBhMQorZWNobyAiKiBFTkQgKiIgPj5hMQorZ2l0IGNvbW1pdCAtcSAtYSAtbSBzZWNvbmQKKworIyBhY3RpdmF0ZSByZXJlcmUKK21rZGlyIC5naXQvcnItY2FjaGUKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY29uZmxpY3RpbmcgbWVyZ2UnICdnaXQgcHVsbCAuIGZpcnN0JworCitzaGExPSQoc2VkIC1lICdzLwkuKi8vJyAuZ2l0L3JyLWNhY2hlL01FUkdFX1JSKQorcnI9LmdpdC9yci1jYWNoZS8kc2hhMQordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVjb3JkZWQgcHJlaW1hZ2UnICJncmVwID09PT09PT0gJHJyL3ByZWltYWdlIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBwb3N0aW1hZ2Ugb3IgdGhpc2ltYWdlIHlldCcgXAorCSJ0ZXN0ICEgLWYgJHJyL3Bvc3RpbWFnZSAtYSAhIC1mICRyci90aGlzaW1hZ2UiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZWltYWdlIGhhcyByaWdodCBudW1iZXIgb2YgbGluZXMnICcKKworCWNudD0kKHNlZCAtbmUgIi9ePDw8PDw8PC8sL14+Pj4+Pj4+L3AiICRyci9wcmVpbWFnZSB8IHdjIC1sKSAmJgorCXRlc3QgJGNudCA9IDkKKworJworCitnaXQgc2hvdyBmaXJzdDphMSA+IGExCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKy0tLSBhL2ExCisrKysgYi9hMQorQEAgLTYsMTcgKzYsOSBAQAorIFRoZSBoZWFydC1hY2hlIGFuZCB0aGUgdGhvdXNhbmQgbmF0dXJhbCBzaG9ja3MKKyBUaGF0IGZsZXNoIGlzIGhlaXIgdG8sICd0aXMgYSBjb25zdW1tYXRpb24KKyBEZXZvdXRseSB0byBiZSB3aXNoJ2QuCistPDw8PDw8PAorLVRvIGRpZSEgVG8gc2xlZXA7CistPT09PT09PQorIFRvIGRpZSwgdG8gc2xlZXA7CistPj4+Pj4+PgorIFRvIHNsZWVwOiBwZXJjaGFuY2UgdG8gZHJlYW06IGF5LCB0aGVyZSdzIHRoZSBydWI7CisgRm9yIGluIHRoYXQgc2xlZXAgb2YgZGVhdGggd2hhdCBkcmVhbXMgbWF5IGNvbWUKKyBXaGVuIHdlIGhhdmUgc2h1ZmZsZWQgb2ZmIHRoaXMgbW9ydGFsIGNvaWwsCisgTXVzdCBnaXZlIHVzIHBhdXNlOiB0aGVyZSdzIHRoZSByZXNwZWN0CisgVGhhdCBtYWtlcyBjYWxhbWl0eSBvZiBzbyBsb25nIGxpZmU7CistPDw8PDw8PAorLT09PT09PT0KKy0qIEVORCAqCistPj4+Pj4+PgorRU9GCitnaXQgcmVyZXJlIGRpZmYgPiBvdXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlIGRpZmYnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCitjYXQgPiBleHBlY3QgPDwgRU9GCithMQorRU9GCisKK2dpdCByZXJlcmUgc3RhdHVzID4gb3V0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcmVyZSBzdGF0dXMnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgc3VjY2VlZHMnIFwKKwkiZ2l0IGNvbW1pdCAtcSAtYSAtbSAncHJlZmVyIGZpcnN0IG92ZXIgc2Vjb25kJyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVjb3JkZWQgcG9zdGltYWdlJyAidGVzdCAtZiAkcnIvcG9zdGltYWdlIgorCitnaXQgY2hlY2tvdXQgLWIgdGhpcmQgbWFzdGVyCitnaXQgc2hvdyBzZWNvbmReOmExIHwgc2VkICdzL1RvIGRpZTogdC9UbyBkaWUhIFQvJyA+IGExCitnaXQgY29tbWl0IC1xIC1hIC1tIHRoaXJkCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2Fub3RoZXIgY29uZmxpY3RpbmcgbWVyZ2UnICdnaXQgcHVsbCAuIGZpcnN0JworCitnaXQgc2hvdyBmaXJzdDphMSB8IHNlZCAncy9UbyBkaWU6IHQvVG8gZGllISBULycgPiBleHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcmVyZSBraWNrZWQgaW4nICIhIGdyZXAgPT09PT09PSBhMSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlIHByZWZlcnMgZmlyc3QgY2hhbmdlJyAnZ2l0IGRpZmYgYTEgZXhwZWN0JworCitybSAkcnIvcG9zdGltYWdlCitlY2hvICIkc2hhMQlhMSIgfCB0ciAnXDAxMicgJ1wwJyA+IC5naXQvcnItY2FjaGUvTUVSR0VfUlIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlIGNsZWFyJyAnZ2l0IHJlcmVyZSBjbGVhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYXIgcmVtb3ZlZCB0aGUgZGlyZWN0b3J5JyAidGVzdCAhIC1kICRyciIKKworbWtkaXIgJHJyCitlY2hvIEhlbGxvID4gJHJyL3ByZWltYWdlCitlY2hvIFdvcmxkID4gJHJyL3Bvc3RpbWFnZQorCitzaGEyPTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK3JyMj0uZ2l0L3JyLWNhY2hlLyRzaGEyCitta2RpciAkcnIyCitlY2hvIEhlbGxvID4gJHJyMi9wcmVpbWFnZQorCithbG1vc3RfMTVfZGF5c19hZ289JCgoNjAtMTUqODY0MDApKQoranVzdF9vdmVyXzE1X2RheXNfYWdvPSQoKC0xLTE1Kjg2NDAwKSkKK2FsbW9zdF82MF9kYXlzX2Fnbz0kKCg2MC02MCo4NjQwMCkpCitqdXN0X292ZXJfNjBfZGF5c19hZ289JCgoLTEtNjAqODY0MDApKQorCit0ZXN0LWNobXRpbWUgPSRhbG1vc3RfNjBfZGF5c19hZ28gJHJyL3ByZWltYWdlCit0ZXN0LWNobXRpbWUgPSRhbG1vc3RfMTVfZGF5c19hZ28gJHJyMi9wcmVpbWFnZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnYXJiYWdlIGNvbGxlY3Rpb24gKHBhcnQxKScgJ2dpdCByZXJlcmUgZ2MnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3lvdW5nIHJlY29yZHMgc3RpbGwgbGl2ZScgXAorCSJ0ZXN0IC1mICRyci9wcmVpbWFnZSAmJiB0ZXN0IC1mICRycjIvcHJlaW1hZ2UiCisKK3Rlc3QtY2htdGltZSA9JGp1c3Rfb3Zlcl82MF9kYXlzX2FnbyAkcnIvcHJlaW1hZ2UKK3Rlc3QtY2htdGltZSA9JGp1c3Rfb3Zlcl8xNV9kYXlzX2FnbyAkcnIyL3ByZWltYWdlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dhcmJhZ2UgY29sbGVjdGlvbiAocGFydDIpJyAnZ2l0IHJlcmVyZSBnYycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnb2xkIHJlY29yZHMgcmVzdCBpbiBwZWFjZScgXAorCSJ0ZXN0ICEgLWYgJHJyL3ByZWltYWdlICYmIHRlc3QgISAtZiAkcnIyL3ByZWltYWdlIgorCit0ZXN0X2RvbmUKKworCmRpZmYgLS1naXQgYS90L3Q0MjAxLXNob3J0bG9nLnNoIGIvdC90NDIwMS1zaG9ydGxvZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDg3MzNjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDIwMS1zaG9ydGxvZy5zaApAQCAtMCwwICsxLDUwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEpvaGFubmVzIEUuIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXNob3J0bG9nCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitlY2hvIDEgPiBhMQorZ2l0IGFkZCBhMQordHJlZT0kKGdpdCB3cml0ZS10cmVlKQorY29tbWl0PSQoIChlY2hvICJUZXN0IjsgZWNobykgfCBnaXQgY29tbWl0LXRyZWUgJHRyZWUgKQorZ2l0IHVwZGF0ZS1yZWYgSEVBRCAkY29tbWl0CisKK2VjaG8gMiA+IGExCitnaXQgY29tbWl0IC0tcXVpZXQgLW0gIlRoaXMgaXMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZmlyc3QgbGluZSBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIHNlZSBpZiBpdCBpcyB3cmFwcGVkIGNvcnJlY3RseSIgYTEKKworIyB0ZXN0IGlmIHRoZSB3cmFwcGluZyBpcyBzdGlsbCB2YWxpZCB3aGVuIHJlcGxhY2luZyBhbGwgaSdzIGJ5IHRyZWJsZSBjbGVmcy4KK2VjaG8gMyA+IGExCitnaXQgY29tbWl0IC0tcXVpZXQgLW0gIiQoZWNobyAiVGhpcyBpcyBhIHZlcnksIHZlcnkgbG9uZyBmaXJzdCBsaW5lIGZvciB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gc2VlIGlmIGl0IGlzIHdyYXBwZWQgY29ycmVjdGx5IiB8IHNlZCAicy9pLzEyMzQvZyIgfCB0ciAxMjM0ICdcMzYwXDIzNVwyMDRcMjM2JykiIGExCisKKyMgbm93IGZzY2sgdXAgdGhlIHV0ZjgKK2dpdCByZXBvLWNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIG5vbi11dGYtOAorZWNobyA0ID4gYTEKK2dpdCBjb21taXQgLS1xdWlldCAtbSAiJChlY2hvICJUaGlzIGlzIGEgdmVyeSwgdmVyeSBsb25nIGZpcnN0IGxpbmUgZm9yIHRoZSBjb21taXQgbWVzc2FnZSB0byBzZWUgaWYgaXQgaXMgd3JhcHBlZCBjb3JyZWN0bHkiIHwgc2VkICJzL2kvMTIzNC9nIiB8IHRyIDEyMzQgJ1wzNzBcMjM1XDIwNFwyMzYnKSIgYTEKKworZWNobyA1ID4gYTEKK2dpdCBjb21taXQgLS1xdWlldCAtbSAiYQkJCQkJCQkJMTIJMzQJNTYJNzgiIGExCisKK2dpdCBzaG9ydGxvZyAtdyBIRUFEID4gb3V0CisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK0EgVSBUaG9yICg1KToKKyAgICAgIFRlc3QKKyAgICAgIFRoaXMgaXMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZmlyc3QgbGluZSBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIHNlZSBpZgorICAgICAgICAgaXQgaXMgd3JhcHBlZCBjb3JyZWN0bHkKKyAgICAgIFRo8J2EnnMg8J2EnnMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZvCdhJ5yc3QgbPCdhJ5uZSBmb3IgdGhlIGNvbW3wnYSedCBtZXNzYWdlIHRvIHNlZSDwnYSeZgorICAgICAgICAg8J2EnnQg8J2EnnMgd3JhcHBlZCBjb3JyZWN0bHkKKyAgICAgIFRo+J2EnnMg+J2EnnMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZvidhJ5yc3QgbPidhJ5uZSBmb3IgdGhlIGNvbW34nYSedAorICAgICAgICAgbWVzc2FnZSB0byBzZWUg+J2EnmYg+J2EnnQg+J2EnnMgd3JhcHBlZCBjb3JyZWN0bHkKKyAgICAgIGEJCQkJCQkJCTEyCTM0CisgICAgICAgICA1Ngk3OAorCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2hvcnRsb2cgd3JhcHBpbmcnICdkaWZmIC11IGV4cGVjdCBvdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTAwMC10YXItdHJlZS5zaCBiL3QvdDUwMDAtdGFyLXRyZWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTIyM2MwNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUwMDAtdGFyLXRyZWUuc2gKQEAgLTAsMCArMSwxNDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVuZSBTY2hhcmZlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC10YXItdHJlZSBhbmQgZ2l0LWdldC10YXItY29tbWl0LWlkIHRlc3QKKworVGhpcyB0ZXN0IGNvdmVycyB0aGUgdG9waWNzIG9mIGZpbGUgY29udGVudHMsIGNvbW1pdCBkYXRlIGhhbmRsaW5nIGFuZAorY29tbWl0IGlkIGVtYmVkZGluZzoKKworICBUaGUgY29udGVudHMgb2YgdGhlIHJlcG9zaXRvcnkgaXMgY29tcGFyZWQgdG8gdGhlIGV4dHJhY3RlZCB0YXIKKyAgYXJjaGl2ZS4gIFRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIHNpbXBsZSB0ZXh0IGZpbGVzLCBzeW1saW5rcyBhbmQgYQorICBiaW5hcnkgZmlsZSAoL2Jpbi9zaCkuICBPbmx5IHBhdGhzIHNob3J0ZXIgdGhhbiA5OSBjaGFyYWN0ZXJzIGFyZQorICB1c2VkLgorCisgIGdpdC10YXItdHJlZSBhcHBsaWVzIHRoZSBjb21taXQgZGF0ZSB0byBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIGl0CisgIGNyZWF0ZXMuICBUaGUgdGVzdCBzZXRzIHRoZSBjb21taXQgZGF0ZSB0byBhIHNwZWNpZmljIHZhbHVlIGFuZCBjaGVja3MKKyAgaWYgdGhlIHRhciBhcmNoaXZlIGNvbnRhaW5zIHRoYXQgdmFsdWUuCisKKyAgV2hlbiBnaXZpbmcgZ2l0LXRhci10cmVlIGEgY29tbWl0IGlkIChpbiBjb250cmFzdCB0byBhIHRyZWUgaWQpIGl0CisgIGVtYmVkcyB0aGlzIGNvbW1pdCBpZCBpbnRvIHRoZSB0YXIgYXJjaGl2ZSBhcyBhIGNvbW1lbnQuICBUaGUgdGVzdAorICBjaGVja3MgdGhlIGFiaWxpdHkgb2YgZ2l0LWdldC10YXItY29tbWl0LWlkIHRvIGZpZ3VyZSBpdCBvdXQgZnJvbSB0aGUKKyAgdGFyIGZpbGUuCisKKycKKworLiAuL3Rlc3QtbGliLnNoCitUQVI9JHtUQVI6LXRhcn0KK1VOWklQPSR7VU5aSVA6LXVuemlwfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncG9wdWxhdGUgd29ya2RpcicgXAorICAgICdta2RpciBhIGIgYyAmJgorICAgICBlY2hvIHNpbXBsZSB0ZXh0ZmlsZSA+YS9hICYmCisgICAgIG1rZGlyIGEvYmluICYmCisgICAgIGNwIC9iaW4vc2ggYS9iaW4gJiYKKyAgICAgbG4gLXMgYSBhL2wxICYmCisgICAgIChwPWxvbmdfcGF0aF90b19hX2ZpbGUgJiYgY2QgYSAmJgorICAgICAgZm9yIGRlcHRoIGluIDEgMiAzIDQgNTsgZG8gbWtkaXIgJHAgJiYgY2QgJHA7IGRvbmUgJiYKKyAgICAgIGVjaG8gdGV4dCA+ZmlsZV93aXRoX2xvbmdfcGF0aCkgJiYKKyAgICAgKGNkIGEgJiYgZmluZCAuKSB8IHNvcnQgPmEubHN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkIGZpbGVzIHRvIHJlcG9zaXRvcnknIFwKKyAgICAnZmluZCBhIC10eXBlIGYgfCB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIGZpbmQgYSAtdHlwZSBsIHwgeGFyZ3MgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAmJgorICAgICB0cmVlaWQ9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlaWQgPnRyZWVpZCAmJgorICAgICBnaXQtdXBkYXRlLXJlZiBIRUFEICQoVFo9R01UIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNyAyMjowMDowMCIgXAorICAgICBnaXQtY29tbWl0LXRyZWUgJHRyZWVpZCA8L2Rldi9udWxsKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1hcmNoaXZlJyBcCisgICAgJ2dpdC1hcmNoaXZlIEhFQUQgPmIudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXRhci10cmVlJyBcCisgICAgJ2dpdC10YXItdHJlZSBIRUFEID5iMi50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtYXJjaGl2ZSB2cy4gZ2l0LXRhci10cmVlJyBcCisgICAgJ2RpZmYgYi50YXIgYjIudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZSBtb2RpZmljYXRpb24gdGltZScgXAorICAgICdUWj1HTVQgJFRBUiB0dmYgYi50YXIgYS9hIHwKKyAgICAgYXdrIFx7cHJpbnRcIFwkNCxcIFwobGVuZ3RoXChcJDVcKVw8N1wpXCA/XCBcJDVcIjowMFwiXCA6XCBcJDVcfSBcCisgICAgID5iLm10aW1lICYmCisgICAgIGVjaG8gIjIwMDUtMDUtMjcgMjI6MDA6MDAiID5leHBlY3RlZC5tdGltZSAmJgorICAgICBkaWZmIGV4cGVjdGVkLm10aW1lIGIubXRpbWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtZ2V0LXRhci1jb21taXQtaWQnIFwKKyAgICAnZ2l0LWdldC10YXItY29tbWl0LWlkIDxiLnRhciA+Yi5jb21taXRpZCAmJgorICAgICBkaWZmIC5naXQvJChnaXQtc3ltYm9saWMtcmVmIEhFQUQpIGIuY29tbWl0aWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdleHRyYWN0IHRhciBhcmNoaXZlJyBcCisgICAgJyhjZCBiICYmICRUQVIgeGYgLSkgPGIudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZW5hbWVzJyBcCisgICAgJyhjZCBiL2EgJiYgZmluZCAuKSB8IHNvcnQgPmIubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgYi5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzJyBcCisgICAgJ2RpZmYgLXIgYSBiL2EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdGFyLXRyZWUgd2l0aCBwcmVmaXgnIFwKKyAgICAnZ2l0LXRhci10cmVlIEhFQUQgcHJlZml4ID5jLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2V4dHJhY3QgdGFyIGFyY2hpdmUgd2l0aCBwcmVmaXgnIFwKKyAgICAnKGNkIGMgJiYgJFRBUiB4ZiAtKSA8Yy50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlbmFtZXMgd2l0aCBwcmVmaXgnIFwKKyAgICAnKGNkIGMvcHJlZml4L2EgJiYgZmluZCAuKSB8IHNvcnQgPmMubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgYy5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzIHdpdGggcHJlZml4JyBcCisgICAgJ2RpZmYgLXIgYSBjL3ByZWZpeC9hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWFyY2hpdmUgLS1mb3JtYXQ9emlwJyBcCisgICAgJ2dpdC1hcmNoaXZlIC0tZm9ybWF0PXppcCBIRUFEID5kLnppcCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2V4dHJhY3QgWklQIGFyY2hpdmUnIFwKKyAgICAnKG1rZGlyIGQgJiYgY2QgZCAmJiAkVU5aSVAgLi4vZC56aXApJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZW5hbWVzJyBcCisgICAgJyhjZCBkL2EgJiYgZmluZCAuKSB8IHNvcnQgPmQubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgZC5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzJyBcCisgICAgJ2RpZmYgLXIgYSBkL2EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtYXJjaGl2ZSAtLWZvcm1hdD16aXAgd2l0aCBwcmVmaXgnIFwKKyAgICAnZ2l0LWFyY2hpdmUgLS1mb3JtYXQ9emlwIC0tcHJlZml4PXByZWZpeC8gSEVBRCA+ZS56aXAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdleHRyYWN0IFpJUCBhcmNoaXZlIHdpdGggcHJlZml4JyBcCisgICAgJyhta2RpciBlICYmIGNkIGUgJiYgJFVOWklQIC4uL2UuemlwKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGVuYW1lcyB3aXRoIHByZWZpeCcgXAorICAgICcoY2QgZS9wcmVmaXgvYSAmJiBmaW5kIC4pIHwgc29ydCA+ZS5sc3QgJiYKKyAgICAgZGlmZiBhLmxzdCBlLmxzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGUgY29udGVudHMgd2l0aCBwcmVmaXgnIFwKKyAgICAnZGlmZiAtciBhIGUvcHJlZml4L2EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtYXJjaGl2ZSAtLWxpc3Qgb3V0c2lkZSBvZiBhIGdpdCByZXBvJyBcCisgICAgJ0dJVF9ESVI9c29tZS9ub24tZXhpc3RpbmcvZGlyZWN0b3J5IGdpdC1hcmNoaXZlIC0tbGlzdCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MTAwLW1haWxpbmZvLnNoIGIvdC90NTEwMC1tYWlsaW5mby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTk2OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC1tYWlsaW5mby5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1tYWlsaW5mbyBhbmQgZ2l0LW1haWxzcGxpdCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3BsaXQgc2FtcGxlIGJveCcgXAorCSdnaXQtbWFpbHNwbGl0IC1vLiAuLi90NTEwMC9zYW1wbGUubWJveCA+bGFzdCAmJgorCWxhc3Q9YGNhdCBsYXN0YCAmJgorCWVjaG8gdG90YWwgaXMgJGxhc3QgJiYKKwl0ZXN0IGBjYXQgbGFzdGAgPSA4JworCitmb3IgbWFpbCBpbiBgZWNobyAwMCpgCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIm1haWxpbmZvICRtYWlsIiBcCisJCSJnaXQtbWFpbGluZm8gLXUgbXNnJG1haWwgcGF0Y2gkbWFpbCA8JG1haWwgPmluZm8kbWFpbCAmJgorCQllY2hvIG1zZyAmJgorCQlkaWZmIC4uL3Q1MTAwL21zZyRtYWlsIG1zZyRtYWlsICYmCisJCWVjaG8gcGF0Y2ggJiYKKwkJZGlmZiAuLi90NTEwMC9wYXRjaCRtYWlsIHBhdGNoJG1haWwgJiYKKwkJZWNobyBpbmZvICYmCisJCWRpZmYgLi4vdDUxMDAvaW5mbyRtYWlsIGluZm8kbWFpbCIKK2RvbmUKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDAxIGIvdC90NTEwMC9pbmZvMDAwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA1Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwMQpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogQSBVIFRob3IKK0VtYWlsOiBhLnUudGhvckBleGFtcGxlLmNvbQorU3ViamVjdDogYSBjb21taXQuCitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwMiBiL3QvdDUxMDAvaW5mbzAwMDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliYjBmZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDIKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEEgVSBUaG9yCitFbWFpbDogYS51LnRob3JAZXhhbXBsZS5jb20KK1N1YmplY3Q6IGFub3RoZXIgcGF0Y2gKK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDAzIGIvdC90NTEwMC9pbmZvMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBkMTIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwMwpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogQSBVIFRob3IKK0VtYWlsOiBhLnUudGhvckBleGFtcGxlLmNvbQorU3ViamVjdDogdGhpcmQgcGF0Y2gKK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDA0IGIvdC90NTEwMC9pbmZvMDAwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZjMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwNApAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogWU9TSElGVUpJIEhpZGVha2kgLyDlkInol6Toi7HmmI4KK0VtYWlsOiB5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZworU3ViamVjdDogR0lUOiBUcnkgYWxsIGFkZHJlc3NlcyBmb3IgZ2l2ZW4gcmVtb3RlIG5hbWUKK0RhdGU6IFRodSwgMjEgSnVsIDIwMDUgMDk6MTA6MzYgLTA0MDAgKEVEVCkKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwNSBiL3QvdDUxMDAvaW5mbzAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNDZmYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDUKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IERhdmlkIEvDpWdlZGFsCitFbWFpbDogZGF2aWRrQGx5c2F0b3IubGl1LnNlCitTdWJqZWN0OiBGaXhlZCB0d28gYnVncyBpbiBnaXQtY3ZzaW1wb3J0LXNjcmlwdC4KK0RhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMjA6MTg6MjUgKzAyMDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwNiBiL3QvdDUxMDAvaW5mbzAwMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNTI3NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDYKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEEgVSBUaG9yCitFbWFpbDogYS51LnRob3JAZXhhbXBsZS5jb20KK1N1YmplY3Q6IGEgY29tbWl0LgorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvaW5mbzAwMDcgYi90L3Q1MTAwL2luZm8wMDA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmIwZmUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL2luZm8wMDA3CkBAIC0wLDAgKzEsNSBAQAorQXV0aG9yOiBBIFUgVGhvcgorRW1haWw6IGEudS50aG9yQGV4YW1wbGUuY29tCitTdWJqZWN0OiBhbm90aGVyIHBhdGNoCitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwOCBiL3QvdDUxMDAvaW5mbzAwMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhMjk1MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDgKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEp1bmlvIEMgSGFtYW5vCitFbWFpbDoganVuaW9Aa2VybmVsLm9yZworU3ViamVjdDogYW5vdGhlciBwYXRjaAorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwMSBiL3QvdDUxMDAvbXNnMDAwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjc1YTlhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDAxCkBAIC0wLDAgKzEsMiBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwMiBiL3QvdDUxMDAvbXNnMDAwMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjU0NmVjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDAyCkBAIC0wLDAgKzEsMjEgQEAKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLiAgVGhpcyBhZGRyZXNzZXMgdGhlIGlzc3VlIHJhaXNlZCBpbiB0aGUKK21lc3NhZ2U6CisKK0Zyb206IE5pdCBQaWNrZXIgPG5pdC5waWNrZXJAZXhhbXBsZS5uZXQ+CitTdWJqZWN0OiBmb28gaXMgdG9vIG9sZAorTWVzc2FnZS1JZDogPG5pdHBpY2tlci4xMjEyMTIxMkBleGFtcGxlLm5ldD4KKworSG9wZWZ1bGx5IHRoaXMgd291bGQgZml4IHRoZSBwcm9ibGVtIHN0YXRlZCB0aGVyZS4KKworCitJIGhhdmUgaW5jbHVkZWQgYW4gZXh0cmEgYmxhbmsgbGluZSBhYm92ZSwgYnV0IGl0IGRvZXMgbm90IGhhdmUgdG8gYmUKK3N0cmlwcGVkIGF3YXkgaGVyZSwgYWxvbmcgd2l0aCB0aGUgICAgICAgICAgICAgICAJCSAgIAord2hpdGVzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgYWJvdmUgbGluZS4gIFRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHNxdWFzaGVkCit3aGVuIHRoZSBtZXNzYWdlIGlzIG1hZGUgaW50byBhIGNvbW1pdCBsb2cgYnkgc3RyaXBzcGFjZSwKK0Fsc28sIHRoZXJlIGFyZSB0aHJlZSBibGFuayBsaW5lcyBhZnRlciB0aGlzIHBhcmFncmFwaCwKK3R3byB0cnVseSBibGFuayBhbmQgYW5vdGhlciBmdWxsIG9mIHNwYWNlcyBpbiBiZXR3ZWVuLgorCisgICAgICAgICAgICAKKworSG9wZSB0aGlzIGhlbHBzLgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDMgYi90L3Q1MTAwL21zZzAwMDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNjgxMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwMwpAQCAtMCwwICsxLDkgQEAKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLiAgVGhpcyBhZGRyZXNzZXMgdGhlIGlzc3VlIHJhaXNlZCBpbiB0aGUKK21lc3NhZ2U6CisKK0Zyb206IE5pdCBQaWNrZXIgPG5pdC5waWNrZXJAZXhhbXBsZS5uZXQ+CitTdWJqZWN0OiBmb28gaXMgdG9vIG9sZAorTWVzc2FnZS1JZDogPG5pdHBpY2tlci4xMjEyMTIxMkBleGFtcGxlLm5ldD4KKworSG9wZWZ1bGx5IHRoaXMgd291bGQgZml4IHRoZSBwcm9ibGVtIHN0YXRlZCB0aGVyZS4KKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDA0IGIvdC90NTEwMC9tc2cwMDA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGJhM2IKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDQKQEAgLTAsMCArMSw3IEBACitIZWxsby4KKworVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lIHVudGlsIGl0IHN1Y2NlZWRzLgorQWxzbyBzdXBwb3J0cyBJUHY2LgorCitTaWduZWQtb2YtYnk6IEhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDA1IGIvdC90NTEwMC9tc2cwMDA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTRjZDcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDUKQEAgLTAsMCArMSwxMyBAQAorVGhlIGdpdC1jdnNpbXBvcnQtc2NyaXB0IGhhZCBhIGNvcHVsZSBvZiBzbWFsbCBidWdzIHRoYXQgcHJldmVudGVkIG1lCitmcm9tIGltcG9ydGluZyBhIGJpZyBDVlMgcmVwb3NpdG9yeS4KKworVGhlIGZpcnN0IHdhcyB0aGF0IGl0IGRpZG4ndCBoYW5kbGUgcmVtb3ZlZCBmaWxlcyB3aXRoIGEgbXVsdGktZGlnaXQKK3ByaW1hcnkgcmV2aXNpb24gbnVtYmVyLgorCitUaGUgc2Vjb25kIHdhcyB0aGF0IGl0IHdhcyBhc2tpbmcgdGhlIENWUyBzZXJ2ZXIgZm9yICJGIiBtZXNzYWdlcywKK2FsdGhvdWdoIHRoZXkgd2VyZSBub3QgaGFuZGxlZC4KKworSSBhbHNvIHVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc2NyaXB0IHRvIGNvcnJlc3BvbmQgdG8KK2FjdHVhbCBmbGFncy4KKworU2lnbmVkLW9mZi1ieTogRGF2aWQgS8OlZ2VkYWwgPGRhdmlka0BseXNhdG9yLmxpdS5zZT4KZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwNiBiL3QvdDUxMDAvbXNnMDAwNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjc1YTlhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDA2CkBAIC0wLDAgKzEsMiBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwNyBiL3QvdDUxMDAvbXNnMDAwNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWIyM2MwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDA3CkBAIC0wLDAgKzEsMiBAQAorSGVyZSBpcyBhbiBlbXB0eSBwYXRjaCBmcm9tIEEgVSBUaG9yLgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDggYi90L3Q1MTAwL21zZzAwMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwZWNiOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwOApAQCAtMCwwICsxLDQgQEAKKz5IZXJlIGlzIGFuIGVtcHR5IHBhdGNoIGZyb20gQSBVIFRob3IuCisKK0hleSB5b3UgZm9yZ290IHRoZSBwYXRjaCEKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDEgYi90L3Q1MTAwL3BhdGNoMDAwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDEKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDIgYi90L3Q1MTAwL3BhdGNoMDAwMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDIKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDMgYi90L3Q1MTAwL3BhdGNoMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDMKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDQgYi90L3Q1MTAwL3BhdGNoMDAwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY0NThlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDQKQEAgLTAsMCArMSw5MyBAQAorZGlmZiAtLWdpdCBhL2Nvbm5lY3QuYyBiL2Nvbm5lY3QuYworLS0tIGEvY29ubmVjdC5jCisrKysgYi9jb25uZWN0LmMKK0BAIC05Niw0MiArOTYsNTcgQEAgc3RhdGljIGVudW0gcHJvdG9jb2wgZ2V0X3Byb3RvY29sKGNvbnN0IAorIAlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKKyB9CisgCistc3RhdGljIHZvaWQgbG9va3VwX2hvc3QoY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICppbikKKy17CistCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworLQlpbnQgcmV0OworLQorLQlyZXQgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCBOVUxMLCAmcmVzKTsKKy0JaWYgKHJldCkKKy0JCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihyZXQpKTsKKy0JKmluID0gKnJlcy0+YWlfYWRkcjsKKy0JZnJlZWFkZHJpbmZvKHJlcyk7CistfQorKyNkZWZpbmUgU1RSXyhzKQkjIHMKKysjZGVmaW5lIFNUUihzKQlTVFJfKHMpCisgCisgc3RhdGljIGludCBnaXRfdGNwX2Nvbm5lY3QoaW50IGZkWzJdLCBjb25zdCBjaGFyICpwcm9nLCBjaGFyICpob3N0LCBjaGFyICpwYXRoKQorIHsKKy0Jc3RydWN0IHNvY2thZGRyIGFkZHI7CistCWludCBwb3J0ID0gREVGQVVMVF9HSVRfUE9SVCwgc29ja2ZkOworLQljaGFyICpjb2xvbjsKKy0KKy0JY29sb24gPSBzdHJjaHIoaG9zdCwgJzonKTsKKy0JaWYgKGNvbG9uKSB7CistCQljaGFyICplbmQ7CistCQl1bnNpZ25lZCBsb25nIG4gPSBzdHJ0b3VsKGNvbG9uKzEsICZlbmQsIDApOworLQkJaWYgKGNvbG9uWzFdICYmICEqZW5kKSB7CistCQkJKmNvbG9uID0gMDsKKy0JCQlwb3J0ID0gbjsKKysJaW50IHNvY2tmZCA9IC0xOworKwljaGFyICpjb2xvbiwgKmVuZDsKKysJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKysJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisrCWludCBnYWk7CisrCisrCWlmIChob3N0WzBdID09ICdbJykgeworKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworKwkJaWYgKGVuZCkgeworKwkJCSplbmQgPSAwOworKwkJCWVuZCsrOworKwkJCWhvc3QrKzsKKysJCX0gZWxzZQorKwkJCWVuZCA9IGhvc3Q7CisrCX0gZWxzZQorKwkJZW5kID0gaG9zdDsKKysJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworKworKwlpZiAoY29sb24pCisrCQlwb3J0ID0gY29sb24gKyAxOworKworKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKysJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKysJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKysKKysJZ2FpID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpOworKwlpZiAoZ2FpKQorKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgZ2FpX3N0cmVycm9yKGdhaSkpOworKworKwlmb3IgKGFpMCA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKysJCWlmIChzb2NrZmQgPCAwKQorKwkJCWNvbnRpbnVlOworKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworKwkJCWNsb3NlKHNvY2tmZCk7CisrCQkJc29ja2ZkID0gLTE7CisrCQkJY29udGludWU7CisgCQl9CisrCQlicmVhazsKKyAJfQorIAorLQlsb29rdXBfaG9zdChob3N0LCAmYWRkcik7CistCSgoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworKwlmcmVlYWRkcmluZm8oYWkwKTsKKyAKKy0Jc29ja2ZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAJaWYgKHNvY2tmZCA8IDApCisgCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgc29ja2V0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworLQlpZiAoY29ubmVjdChzb2NrZmQsICh2b2lkICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQorLQkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKysKKyAJZmRbMF0gPSBzb2NrZmQ7CisgCWZkWzFdID0gc29ja2ZkOworIAlwYWNrZXRfd3JpdGUoc29ja2ZkLCAiJXMgJXNcbiIsIHByb2csIHBhdGgpOworCistLSAKK1lPU0hJRlVKSSBIaWRlYWtpIEAgVVNBR0kgUHJvamVjdCAgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorR1BHLUZQICA6IDkwMjIgNjVFQiAxRUNGIDNBRDEgMEJERiAgODBEOCA0ODA3IEY4OTQgRTA2MiAwRUVBCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDA1IGIvdC90NTEwMC9wYXRjaDAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNGIyNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDA1CkBAIC0wLDAgKzEsNjkgQEAKKy0tLQorCisgRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQgfCAgICA5ICsrKysrKysrLQorIGdpdC1jdnNpbXBvcnQtc2NyaXB0ICAgICAgICAgICAgICAgICAgIHwgICAgNCArKy0tCisgMiBmaWxlcyBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCis1MDQ1MmY5YzBjMmRmMWYwNGQ4M2EyNjI2NmJhNzA0YjEzODYxNjMyCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0CitAQCAtMjksNiArMjksMTAgQEAgT1BUSU9OUworIAljdXJyZW50bHksIG9ubHkgdGhlIDpsb2NhbDosIDpleHQ6IGFuZCA6cHNlcnZlcjogYWNjZXNzIG1ldGhvZHMgCisgCWFyZSBzdXBwb3J0ZWQuCisgCisrLUMgPHRhcmdldC1kaXI+OjoKKysgICAgICAgIFRoZSBHSVQgcmVwb3NpdG9yeSB0byBpbXBvcnQgdG8uICBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QKKysgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKysKKyAtaTo6CisgCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKyAJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGNhY2hlIHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKK0BAIC00NCw3ICs0OCw3IEBAIE9QVElPTlMKKyAKKyAtcCA8b3B0aW9ucy1mb3ItY3ZzcHM+OjoKKyAJQWRkaXRpb25hbCBvcHRpb25zIGZvciBjdnNwcy4KKy0JVGhlIG9wdGlvbnMgJy14JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorKwlUaGUgb3B0aW9ucyAnLXUnIGFuZCAnLUEnIGFyZSBpbXBsaWNpdCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUuCisgCisgCUlmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCisgCitAQCAtNTcsNiArNjEsOSBAQCBPUFRJT05TCisgLWg6OgorIAlQcmludCBhIHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisgCisrLXogPGZ1eno+OjoKKysgICAgICAgIFBhc3MgdGhlIHRpbWVzdGFtcCBmdXp6IGZhY3RvciB0byBjdnNwcy4KKysKKyBPVVRQVVQKKyAtLS0tLS0KKyBJZiAnLXYnIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdCByZXBvcnRzIHdoYXQgaXQgaXMgZG9pbmcuCitkaWZmIC0tZ2l0IGEvZ2l0LWN2c2ltcG9ydC1zY3JpcHQgYi9naXQtY3ZzaW1wb3J0LXNjcmlwdAorLS0tIGEvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKKysrKyBiL2dpdC1jdnNpbXBvcnQtc2NyaXB0CitAQCAtMTkwLDcgKzE5MCw3IEBAIHN1YiBjb25uIHsKKyAJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiUm9vdCAkcmVwb1xuIik7CisgCisgCSMgVHJpYWwgYW5kIGVycm9yIHNheXMgdGhhdCB0aGlzIHByb2JhYmx5IGlzIHRoZSBtaW5pbXVtIHNldAorLQkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW9kZSBNIE1iaW5hcnkgRSBGIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKysJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworIAorIAkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJ2YWxpZC1yZXF1ZXN0c1xuIik7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+Zmx1c2goKTsKK0BAIC02OTEsNyArNjkxLDcgQEAgd2hpbGUoPENWUz4pIHsKKyAJCXVubGluaygkdG1wbmFtZSk7CisgCQlteSAkbW9kZSA9IHBtb2RlKCRjdnMtPnsnbW9kZSd9KTsKKyAJCXB1c2goQG5ldyxbJG1vZGUsICRzaGEsICRmbl0pOyAjIG1heSBiZSByZXN1cnJlY3RlZCEKKy0JfSBlbHNpZigkc3RhdGUgPT0gOSBhbmQgL15ccysoXFMrKTpcZCg/OlwuXGQrKSstPihcZCg/OlwuXGQrKSspXChERUFEXClccyokLykgeworKwl9IGVsc2lmKCRzdGF0ZSA9PSA5IGFuZCAvXlxzKyhcUyspOlxkKyg/OlwuXGQrKSstPihcZCsoPzpcLlxkKykrKVwoREVBRFwpXHMqJC8pIHsKKyAJCW15ICRmbiA9ICQxOworIAkJJGZuID1+IHMjXi8rIyM7CisgCQlwdXNoKEBvbGQsJGZuKTsKKworLS0gCitEYXZpZCBL5WdlZGFsCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL3BhdGNoMDAwNiBiL3QvdDUxMDAvcGF0Y2gwMDA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTE1NTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3BhdGNoMDAwNgpAQCAtMCwwICsxLDE0IEBACistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL3BhdGNoMDAwNyBiL3QvdDUxMDAvcGF0Y2gwMDA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3BhdGNoMDAwNwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDggYi90L3Q1MTAwL3BhdGNoMDAwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDgKZGlmZiAtLWdpdCBhL3QvdDUxMDAvc2FtcGxlLm1ib3ggYi90L3Q1MTAwL3NhbXBsZS5tYm94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGM5ODEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3NhbXBsZS5tYm94CkBAIC0wLDAgKzEsNDA2IEBACitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogW1BBVENIXSBhIGNvbW1pdC4KKworSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCitTdWJqZWN0OiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKworSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCisKK0kgaGF2ZSBpbmNsdWRlZCBhbiBleHRyYSBibGFuayBsaW5lIGFib3ZlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0byBiZQorc3RyaXBwZWQgYXdheSBoZXJlLCBhbG9uZyB3aXRoIHRoZSAgICAgICAgICAgICAgIAkJICAgCit3aGl0ZXNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBhYm92ZSBsaW5lLiAgVGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgc3F1YXNoZWQKK3doZW4gdGhlIG1lc3NhZ2UgaXMgbWFkZSBpbnRvIGEgY29tbWl0IGxvZyBieSBzdHJpcHNwYWNlLAorQWxzbywgdGhlcmUgYXJlIHRocmVlIGJsYW5rIGxpbmVzIGFmdGVyIHRoaXMgcGFyYWdyYXBoLAordHdvIHRydWx5IGJsYW5rIGFuZCBhbm90aGVyIGZ1bGwgb2Ygc3BhY2VzIGluIGJldHdlZW4uCisKKyAgICAgICAgICAgIAorCitIb3BlIHRoaXMgaGVscHMuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmlvQGtlcm5lbC5vcmc+CitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKK1N1YmplY3Q6IHJlOiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKworRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorU3ViamVjdDogW1BBVENIXSB0aGlyZCBwYXRjaAorCitIZXJlIGlzIGEgcGF0Y2ggZnJvbSBBIFUgVGhvci4gIFRoaXMgYWRkcmVzc2VzIHRoZSBpc3N1ZSByYWlzZWQgaW4gdGhlCittZXNzYWdlOgorCitGcm9tOiBOaXQgUGlja2VyIDxuaXQucGlja2VyQGV4YW1wbGUubmV0PgorU3ViamVjdDogZm9vIGlzIHRvbyBvbGQKK01lc3NhZ2UtSWQ6IDxuaXRwaWNrZXIuMTIxMjEyMTJAZXhhbXBsZS5uZXQ+CisKK0hvcGVmdWxseSB0aGlzIHdvdWxkIGZpeCB0aGUgcHJvYmxlbSBzdGF0ZWQgdGhlcmUuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IFNhdCBBdWcgMjcgMjM6MDc6NDkgMjAwNQorUGF0aDogbmV3cy5nbWFuZS5vcmchbm90LWZvci1tYWlsCitNZXNzYWdlLUlEOiA8MjAwNTA3MjEuMDkxMDM2LjAxMTE5NTE2Lnlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorRnJvbTogWU9TSElGVUpJIEhpZGVha2kgLyA9P2lzby0yMDIyLWpwP0I/R3lSQ05VaEdJekZSVEVBYktFST0/PSAKKwk8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CitOZXdzZ3JvdXBzOiBnbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQKK1N1YmplY3Q6IFtQQVRDSCAxLzJdIEdJVDogVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lCitEYXRlOiBUaHUsIDIxIEp1bCAyMDA1IDA5OjEwOjM2IC0wNDAwIChFRFQpCitMaW5lczogOTkKK09yZ2FuaXphdGlvbjogVVNBR0kvV0lERSBQcm9qZWN0CitBcHByb3ZlZDogbmV3c0BnbWFuZS5vcmcKK05OVFAtUG9zdGluZy1Ib3N0OiBtYWluLmdtYW5lLm9yZworTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogVGV4dC9QbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1UcmFjZTogc2VhLmdtYW5lLm9yZyAxMTIxOTUxNDM0IDI5MzUwIDgwLjkxLjIyOS4yICgyMSBKdWwgMjAwNSAxMzoxMDozNCBHTVQpCitYLUNvbXBsYWludHMtVG86IHVzZW5ldEBzZWEuZ21hbmUub3JnCitOTlRQLVBvc3RpbmctRGF0ZTogVGh1LCAyMSBKdWwgMjAwNSAxMzoxMDozNCArMDAwMCAoVVRDKQorCitIZWxsby4KKworVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lIHVudGlsIGl0IHN1Y2NlZWRzLgorQWxzbyBzdXBwb3J0cyBJUHY2LgorCitTaWduZWQtb2YtYnk6IEhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKworZGlmZiAtLWdpdCBhL2Nvbm5lY3QuYyBiL2Nvbm5lY3QuYworLS0tIGEvY29ubmVjdC5jCisrKysgYi9jb25uZWN0LmMKK0BAIC05Niw0MiArOTYsNTcgQEAgc3RhdGljIGVudW0gcHJvdG9jb2wgZ2V0X3Byb3RvY29sKGNvbnN0IAorIAlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKKyB9CisgCistc3RhdGljIHZvaWQgbG9va3VwX2hvc3QoY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICppbikKKy17CistCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworLQlpbnQgcmV0OworLQorLQlyZXQgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCBOVUxMLCAmcmVzKTsKKy0JaWYgKHJldCkKKy0JCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihyZXQpKTsKKy0JKmluID0gKnJlcy0+YWlfYWRkcjsKKy0JZnJlZWFkZHJpbmZvKHJlcyk7CistfQorKyNkZWZpbmUgU1RSXyhzKQkjIHMKKysjZGVmaW5lIFNUUihzKQlTVFJfKHMpCisgCisgc3RhdGljIGludCBnaXRfdGNwX2Nvbm5lY3QoaW50IGZkWzJdLCBjb25zdCBjaGFyICpwcm9nLCBjaGFyICpob3N0LCBjaGFyICpwYXRoKQorIHsKKy0Jc3RydWN0IHNvY2thZGRyIGFkZHI7CistCWludCBwb3J0ID0gREVGQVVMVF9HSVRfUE9SVCwgc29ja2ZkOworLQljaGFyICpjb2xvbjsKKy0KKy0JY29sb24gPSBzdHJjaHIoaG9zdCwgJzonKTsKKy0JaWYgKGNvbG9uKSB7CistCQljaGFyICplbmQ7CistCQl1bnNpZ25lZCBsb25nIG4gPSBzdHJ0b3VsKGNvbG9uKzEsICZlbmQsIDApOworLQkJaWYgKGNvbG9uWzFdICYmICEqZW5kKSB7CistCQkJKmNvbG9uID0gMDsKKy0JCQlwb3J0ID0gbjsKKysJaW50IHNvY2tmZCA9IC0xOworKwljaGFyICpjb2xvbiwgKmVuZDsKKysJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKysJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisrCWludCBnYWk7CisrCisrCWlmIChob3N0WzBdID09ICdbJykgeworKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworKwkJaWYgKGVuZCkgeworKwkJCSplbmQgPSAwOworKwkJCWVuZCsrOworKwkJCWhvc3QrKzsKKysJCX0gZWxzZQorKwkJCWVuZCA9IGhvc3Q7CisrCX0gZWxzZQorKwkJZW5kID0gaG9zdDsKKysJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworKworKwlpZiAoY29sb24pCisrCQlwb3J0ID0gY29sb24gKyAxOworKworKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKysJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKysJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKysKKysJZ2FpID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpOworKwlpZiAoZ2FpKQorKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgZ2FpX3N0cmVycm9yKGdhaSkpOworKworKwlmb3IgKGFpMCA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKysJCWlmIChzb2NrZmQgPCAwKQorKwkJCWNvbnRpbnVlOworKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworKwkJCWNsb3NlKHNvY2tmZCk7CisrCQkJc29ja2ZkID0gLTE7CisrCQkJY29udGludWU7CisgCQl9CisrCQlicmVhazsKKyAJfQorIAorLQlsb29rdXBfaG9zdChob3N0LCAmYWRkcik7CistCSgoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworKwlmcmVlYWRkcmluZm8oYWkwKTsKKyAKKy0Jc29ja2ZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAJaWYgKHNvY2tmZCA8IDApCisgCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgc29ja2V0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworLQlpZiAoY29ubmVjdChzb2NrZmQsICh2b2lkICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQorLQkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKysKKyAJZmRbMF0gPSBzb2NrZmQ7CisgCWZkWzFdID0gc29ja2ZkOworIAlwYWNrZXRfd3JpdGUoc29ja2ZkLCAiJXMgJXNcbiIsIHByb2csIHBhdGgpOworCistLSAKK1lPU0hJRlVKSSBIaWRlYWtpIEAgVVNBR0kgUHJvamVjdCAgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorR1BHLUZQICA6IDkwMjIgNjVFQiAxRUNGIDNBRDEgMEJERiAgODBEOCA0ODA3IEY4OTQgRTA2MiAwRUVBCisKK0Zyb20gbm9ib2R5IFNhdCBBdWcgMjcgMjM6MDc6NDkgMjAwNQorUGF0aDogbmV3cy5nbWFuZS5vcmchbm90LWZvci1tYWlsCitNZXNzYWdlLUlEOiA8dTV0YWNqamRweHEuZnNmQGx5c2F0b3IubGl1LnNlPgorRnJvbTogPT9pc28tODg1OS0xP1E/RGF2aWRfSz1FNWdlZGFsPz0gPGRhdmlka0BseXNhdG9yLmxpdS5zZT4KK05ld3Nncm91cHM6IGdtYW5lLmNvbXAudmVyc2lvbi1jb250cm9sLmdpdAorU3ViamVjdDogW1BBVENIXSBGaXhlZCB0d28gYnVncyBpbiBnaXQtY3ZzaW1wb3J0LXNjcmlwdC4KK0RhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMjA6MTg6MjUgKzAyMDAKK0xpbmVzOiA4MworQXBwcm92ZWQ6IG5ld3NAZ21hbmUub3JnCitOTlRQLVBvc3RpbmctSG9zdDogbWFpbi5nbWFuZS5vcmcKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogUVVPVEVELVBSSU5UQUJMRQorWC1UcmFjZTogc2VhLmdtYW5lLm9yZyAxMTI0MTMwMjQ3IDMxODM5IDgwLjkxLjIyOS4yICgxNSBBdWcgMjAwNSAxODoyNDowNyBHTVQpCitYLUNvbXBsYWludHMtVG86IHVzZW5ldEBzZWEuZ21hbmUub3JnCitOTlRQLVBvc3RpbmctRGF0ZTogTW9uLCAxNSBBdWcgMjAwNSAxODoyNDowNyArMDAwMCAoVVRDKQorQ2M6ICJKdW5pbyBDLiBIYW1hbm8iIDxqdW5raW9AY294Lm5ldD4KK09yaWdpbmFsLVgtRnJvbTogZ2l0LW93bmVyQHZnZXIua2VybmVsLm9yZyBNb24gQXVnIDE1IDIwOjI0OjA1IDIwMDUKKworVGhlIGdpdC1jdnNpbXBvcnQtc2NyaXB0IGhhZCBhIGNvcHVsZSBvZiBzbWFsbCBidWdzIHRoYXQgcHJldmVudGVkIG1lCitmcm9tIGltcG9ydGluZyBhIGJpZyBDVlMgcmVwb3NpdG9yeS4KKworVGhlIGZpcnN0IHdhcyB0aGF0IGl0IGRpZG4ndCBoYW5kbGUgcmVtb3ZlZCBmaWxlcyB3aXRoIGEgbXVsdGktZGlnaXQKK3ByaW1hcnkgcmV2aXNpb24gbnVtYmVyLgorCitUaGUgc2Vjb25kIHdhcyB0aGF0IGl0IHdhcyBhc2tpbmcgdGhlIENWUyBzZXJ2ZXIgZm9yICJGIiBtZXNzYWdlcywKK2FsdGhvdWdoIHRoZXkgd2VyZSBub3QgaGFuZGxlZC4KKworSSBhbHNvIHVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc2NyaXB0IHRvIGNvcnJlc3BvbmQgdG8KK2FjdHVhbCBmbGFncy4KKworU2lnbmVkLW9mZi1ieTogRGF2aWQgSz1FNWdlZGFsIDxkYXZpZGtAbHlzYXRvci5saXUuc2U+CistLS0KKworIERvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IHwgICAgOSArKysrKysrKy0KKyBnaXQtY3ZzaW1wb3J0LXNjcmlwdCAgICAgICAgICAgICAgICAgICB8ICAgIDQgKystLQorIDIgZmlsZXMgY2hhbmdlZCwgMTAgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworNTA0NTJmOWMwYzJkZjFmMDRkODNhMjYyNjZiYTcwNGIxMzg2MTYzMgorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQ9CistY3ZzaW1wb3J0LXNjcmlwdC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorQEAgLTI5LDYgKzI5LDEwIEBAIE9QVElPTlMKKyAJY3VycmVudGx5LCBvbmx5IHRoZSA6bG9jYWw6LCA6ZXh0OiBhbmQgOnBzZXJ2ZXI6IGFjY2VzcyBtZXRob2RzPTIwCisgCWFyZSBzdXBwb3J0ZWQuCis9MjAKKystQyA8dGFyZ2V0LWRpcj46OgorKyAgICAgICAgVGhlIEdJVCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorKyAgICAgICAgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIERlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorKworIC1pOjoKKyAJSW1wb3J0LW9ubHk6IGRvbid0IHBlcmZvcm0gYSBjaGVja291dCBhZnRlciBpbXBvcnRpbmcuICBUaGlzIG9wdGlvbgorIAllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgY2FjaGUgcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorQEAgLTQ0LDcgKzQ4LDcgQEAgT1BUSU9OUworPTIwCisgLXAgPG9wdGlvbnMtZm9yLWN2c3BzPjo6CisgCUFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY3ZzcHMuCistCVRoZSBvcHRpb25zICcteCcgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKysJVGhlIG9wdGlvbnMgJy11JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorPTIwCisgCUlmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCis9MjAKK0BAIC01Nyw2ICs2MSw5IEBAIE9QVElPTlMKKyAtaDo6CisgCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKz0yMAorKy16IDxmdXp6Pjo6CisrICAgICAgICBQYXNzIHRoZSB0aW1lc3RhbXAgZnV6eiBmYWN0b3IgdG8gY3ZzcHMuCisrCisgT1VUUFVUCisgLS0tLS0tCisgSWYgJy12JyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHQgcmVwb3J0cyB3aGF0IGl0IGlzIGRvaW5nLgorZGlmZiAtLWdpdCBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0IGIvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKKy0tLSBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0CisrKysgYi9naXQtY3ZzaW1wb3J0LXNjcmlwdAorQEAgLTE5MCw3ICsxOTAsNyBAQCBzdWIgY29ubiB7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlJvb3QgJHJlcG9cbiIpOworPTIwCisgCSMgVHJpYWwgYW5kIGVycm9yIHNheXMgdGhhdCB0aGlzIHByb2JhYmx5IGlzIHRoZSBtaW5pbXVtIHNldAorLQkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW89CitkZSBNIE1iaW5hcnkgRSBGIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKysJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vPQorZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworPTIwCisgCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoInZhbGlkLXJlcXVlc3RzXG4iKTsKKyAJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpOworQEAgLTY5MSw3ICs2OTEsNyBAQCB3aGlsZSg8Q1ZTPikgeworIAkJdW5saW5rKCR0bXBuYW1lKTsKKyAJCW15ICRtb2RlID0zRCBwbW9kZSgkY3ZzLT57J21vZGUnfSk7CisgCQlwdXNoKEBuZXcsWyRtb2RlLCAkc2hhLCAkZm5dKTsgIyBtYXkgYmUgcmVzdXJyZWN0ZWQhCistCX0gZWxzaWYoJHN0YXRlID0zRD0zRCA5IGFuZCAvXlxzKyhcUyspOlxkKD86XC5cZCspKy0+KFxkKD86XC5cZCspKylcKD0KK0RFQURcKVxzKiQvKSB7CisrCX0gZWxzaWYoJHN0YXRlID0zRD0zRCA5IGFuZCAvXlxzKyhcUyspOlxkKyg/OlwuXGQrKSstPihcZCsoPzpcLlxkKykrKT0KK1woREVBRFwpXHMqJC8pIHsKKyAJCW15ICRmbiA9M0QgJDE7CisgCQkkZm4gPTNEfiBzI14vKyMjOworIAkJcHVzaChAb2xkLCRmbik7CisKKy0tPTIwCitEYXZpZCBLPUU1Z2VkYWwKKy0KK1RvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBnaXQiIGluCit0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZworTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorUmVmZXJlbmNlczogPFBpbmUuTE5YLjQuNjQwLjAwMDFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMThAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNTBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSF0gYSBjb21taXQuCisKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLgorCistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogW1BBVENIXSBhbm90aGVyIHBhdGNoCisKK0hlcmUgaXMgYW4gZW1wdHkgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKworRnJvbSBub2JvZHkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBKdW5pbyBDIEhhbWFubyA8anVuaW9Aa2VybmVsLm9yZz4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogcmU6IFtQQVRDSF0gYW5vdGhlciBwYXRjaAorCitGcm9tOiBBIFUgVGhvciA8YS51LnRob3JAZXhhbXBsZS5jb20+CitTdWJqZWN0OiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKz5IZXJlIGlzIGFuIGVtcHR5IHBhdGNoIGZyb20gQSBVIFRob3IuCisKK0hleSB5b3UgZm9yZ290IHRoZSBwYXRjaCEKKwpkaWZmIC0tZ2l0IGEvdC90NTMwMC1wYWNrLW9iamVjdC5zaCBiL3QvdDUzMDAtcGFjay1vYmplY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjMzNjc2OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUzMDAtcGFjay1vYmplY3Quc2gKQEAgLTAsMCArMSwyNjkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXBhY2stb2JqZWN0CisKKycKKy4gLi90ZXN0LWxpYi5zaAorCitUUkFTSD1gcHdkYAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCoKKyAgICAgZm9yIGkgaW4gYSBiIGMKKyAgICAgZG8KKwkgICAgIGRkIGlmPS9kZXYvemVybyBicz00ayBjb3VudD0xIHwgdHIgIlxcMCIgJGkgPiRpICYmCisJICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICRpIHx8IHJldHVybiAxCisgICAgIGRvbmUgJiYKKyAgICAgY2F0IGMgPmQgJiYgZWNobyBmb28gPj5kICYmIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZCAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgY29tbWl0PWBnaXQtY29tbWl0LXRyZWUgJHRyZWUgPC9kZXYvbnVsbGAgJiYgeworCSBlY2hvICR0cmVlICYmCisJIGVjaG8gJGNvbW1pdCAmJgorCSBnaXQtbHMtdHJlZSAkdHJlZSB8IHNlZCAtZSAicy8uKiBcXChbMC05YS1mXSpcXCkJLiovXFwxLyIKKyAgICAgfSA+b2JqLWxpc3QgJiYgeworCSBnaXQtZGlmZi10cmVlIC0tcm9vdCAtcCAkY29tbWl0ICYmCisJIHdoaWxlIHJlYWQgb2JqZWN0CisJIGRvCisJICAgIHQ9YGdpdC1jYXQtZmlsZSAtdCAkb2JqZWN0YCAmJgorCSAgICBnaXQtY2F0LWZpbGUgJHQgJG9iamVjdCB8fCByZXR1cm4gMQorCSBkb25lIDxvYmotbGlzdAorICAgICB9ID5leHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwYWNrIHdpdGhvdXQgZGVsdGEnIFwKKyAgICAncGFja25hbWVfMT0kKGdpdC1wYWNrLW9iamVjdHMgLS13aW5kb3c9MCB0ZXN0LTEgPG9iai1saXN0KScKKworcm0gLWZyIC5naXQyCitta2RpciAuZ2l0MgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndW5wYWNrIHdpdGhvdXQgZGVsdGEnIFwKKyAgICAiR0lUX09CSkVDVF9ESVJFQ1RPUlk9LmdpdDIvb2JqZWN0cyAmJgorICAgICBleHBvcnQgR0lUX09CSkVDVF9ESVJFQ1RPUlkgJiYKKyAgICAgZ2l0LWluaXQgJiYKKyAgICAgZ2l0LXVucGFjay1vYmplY3RzIC1uIDx0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrICYmCisgICAgIGdpdC11bnBhY2stb2JqZWN0cyA8dGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayIKKwordW5zZXQgR0lUX09CSkVDVF9ESVJFQ1RPUlkKK2NkICIkVFJBU0gvLmdpdDIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayB1bnBhY2sgd2l0aG91dCBkZWx0YScgXAorICAgICcoY2QgLi4vLmdpdCAmJiBmaW5kIG9iamVjdHMgLXR5cGUgZiAtcHJpbnQpIHwKKyAgICAgd2hpbGUgcmVhZCBwYXRoCisgICAgIGRvCisgICAgICAgICBjbXAgJHBhdGggLi4vLmdpdC8kcGF0aCB8fCB7CisJICAgICBlY2hvICRwYXRoIGRpZmZlcnMuCisJICAgICByZXR1cm4gMQorCSB9CisgICAgIGRvbmUnCitjZCAiJFRSQVNIIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncGFjayB3aXRoIFJFRl9ERUxUQScgXAorICAgICdwd2QgJiYKKyAgICAgcGFja25hbWVfMj0kKGdpdC1wYWNrLW9iamVjdHMgdGVzdC0yIDxvYmotbGlzdCknCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VucGFjayB3aXRoIFJFRl9ERUxUQScgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQtaW5pdCAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgLW4gPHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgJiYKKyAgICAgZ2l0LXVucGFjay1vYmplY3RzIDx0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrJworCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorY2QgIiRUUkFTSC8uZ2l0MiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayB1bnBhY2sgd2l0aCBSRUZfREVMVEEnIFwKKyAgICAnKGNkIC4uLy5naXQgJiYgZmluZCBvYmplY3RzIC10eXBlIGYgLXByaW50KSB8CisgICAgIHdoaWxlIHJlYWQgcGF0aAorICAgICBkbworICAgICAgICAgY21wICRwYXRoIC4uLy5naXQvJHBhdGggfHwgeworCSAgICAgZWNobyAkcGF0aCBkaWZmZXJzLgorCSAgICAgcmV0dXJuIDEKKwkgfQorICAgICBkb25lJworY2QgIiRUUkFTSCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BhY2sgd2l0aCBPRlNfREVMVEEnIFwKKyAgICAncHdkICYmCisgICAgIHBhY2tuYW1lXzM9JChnaXQtcGFjay1vYmplY3RzIC0tZGVsdGEtYmFzZS1vZmZzZXQgdGVzdC0zIDxvYmotbGlzdCknCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VucGFjayB3aXRoIE9GU19ERUxUQScgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQtaW5pdCAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgLW4gPHRlc3QtMy0ke3BhY2tuYW1lXzN9LnBhY2sgJiYKKyAgICAgZ2l0LXVucGFjay1vYmplY3RzIDx0ZXN0LTMtJHtwYWNrbmFtZV8zfS5wYWNrJworCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorY2QgIiRUUkFTSC8uZ2l0MiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayB1bnBhY2sgd2l0aCBPRlNfREVMVEEnIFwKKyAgICAnKGNkIC4uLy5naXQgJiYgZmluZCBvYmplY3RzIC10eXBlIGYgLXByaW50KSB8CisgICAgIHdoaWxlIHJlYWQgcGF0aAorICAgICBkbworICAgICAgICAgY21wICRwYXRoIC4uLy5naXQvJHBhdGggfHwgeworCSAgICAgZWNobyAkcGF0aCBkaWZmZXJzLgorCSAgICAgcmV0dXJuIDEKKwkgfQorICAgICBkb25lJworY2QgIiRUUkFTSCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcGFyZSBkZWx0YSBmbGF2b3JzJyAnCisJcGVybCAtZSAnXCcnCisJCWRlZmluZWQoJF8gPSAtcyAkXykgb3IgZGllIGZvciBAQVJHVjsKKwkJZXhpdCAxIGlmICRBUkdWWzBdIDw9ICRBUkdWWzFdOworCSdcJycgdGVzdC0yLSRwYWNrbmFtZV8yLnBhY2sgdGVzdC0zLSRwYWNrbmFtZV8zLnBhY2sKKycKKworcm0gLWZyIC5naXQyCitta2RpciAuZ2l0MgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIHBhY2tlZCBvYmplY3RzJyBcCisgICAgJ0dJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIGdpdC1pbml0ICYmCisgICAgIGNwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4IC5naXQyL29iamVjdHMvcGFjayAmJiB7CisJIGdpdC1kaWZmLXRyZWUgLS1yb290IC1wICRjb21taXQgJiYKKwkgd2hpbGUgcmVhZCBvYmplY3QKKwkgZG8KKwkgICAgdD1gZ2l0LWNhdC1maWxlIC10ICRvYmplY3RgICYmCisJICAgIGdpdC1jYXQtZmlsZSAkdCAkb2JqZWN0IHx8IHJldHVybiAxCisJIGRvbmUgPG9iai1saXN0CisgICAgfSA+Y3VycmVudCAmJgorICAgIGRpZmYgZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgcGFja2VkIGRlbHRpZmllZCAoUkVGX0RFTFRBKSBvYmplY3RzJyBcCisgICAgJ0dJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIHJtIC1mIC5naXQyL29iamVjdHMvcGFjay90ZXN0LSogJiYKKyAgICAgY3AgdGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggLmdpdDIvb2JqZWN0cy9wYWNrICYmIHsKKwkgZ2l0LWRpZmYtdHJlZSAtLXJvb3QgLXAgJGNvbW1pdCAmJgorCSB3aGlsZSByZWFkIG9iamVjdAorCSBkbworCSAgICB0PWBnaXQtY2F0LWZpbGUgLXQgJG9iamVjdGAgJiYKKwkgICAgZ2l0LWNhdC1maWxlICR0ICRvYmplY3QgfHwgcmV0dXJuIDEKKwkgZG9uZSA8b2JqLWxpc3QKKyAgICB9ID5jdXJyZW50ICYmCisgICAgZGlmZiBleHBlY3QgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSBwYWNrZWQgZGVsdGlmaWVkIChPRlNfREVMVEEpIG9iamVjdHMnIFwKKyAgICAnR0lUX09CSkVDVF9ESVJFQ1RPUlk9LmdpdDIvb2JqZWN0cyAmJgorICAgICBleHBvcnQgR0lUX09CSkVDVF9ESVJFQ1RPUlkgJiYKKyAgICAgcm0gLWYgLmdpdDIvb2JqZWN0cy9wYWNrL3Rlc3QtKiAmJgorICAgICBjcCB0ZXN0LTMtJHtwYWNrbmFtZV8zfS5wYWNrIHRlc3QtMy0ke3BhY2tuYW1lXzN9LmlkeCAuZ2l0Mi9vYmplY3RzL3BhY2sgJiYgeworCSBnaXQtZGlmZi10cmVlIC0tcm9vdCAtcCAkY29tbWl0ICYmCisJIHdoaWxlIHJlYWQgb2JqZWN0CisJIGRvCisJICAgIHQ9YGdpdC1jYXQtZmlsZSAtdCAkb2JqZWN0YCAmJgorCSAgICBnaXQtY2F0LWZpbGUgJHQgJG9iamVjdCB8fCByZXR1cm4gMQorCSBkb25lIDxvYmotbGlzdAorICAgIH0gPmN1cnJlbnQgJiYKKyAgICBkaWZmIGV4cGVjdCBjdXJyZW50JworCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5IHBhY2snIFwKKyAgICAnZ2l0LXZlcmlmeS1wYWNrCXRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCBcCisJCQl0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggXAorCQkJdGVzdC0zLSR7cGFja25hbWVfM30uaWR4JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29ycnVwdCBhIHBhY2sgYW5kIHNlZSBpZiB2ZXJpZnkgY2F0Y2hlcycgXAorICAgICdjYXQgdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4ID50ZXN0LTMuaWR4ICYmCisgICAgIGNhdCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6IFBBQ0tfU0lHTkFUVVJFICYmCisgICAgIGNhdCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdC0zLnBhY2sgY291bnQ9MSBicz0xIGNvbnY9bm90cnVuYyBzZWVrPTIgJiYKKyAgICAgaWYgZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMy5pZHgKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpICYmCisKKyAgICAgOiBQQUNLX1ZFUlNJT04gJiYKKyAgICAgY2F0IHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9NyAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6IFRZUEUvU0laRSBieXRlIG9mIHRoZSBmaXJzdCBwYWNrZWQgb2JqZWN0IGRhdGEgJiYKKyAgICAgY2F0IHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9MTIgJiYKKyAgICAgaWYgZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMy5pZHgKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpICYmCisKKyAgICAgOiBzdW0gb2YgdGhlIGluZGV4IGZpbGUgaXRzZWxmICYmCisgICAgIGw9YHdjIC1jIDx0ZXN0LTMuaWR4YCAmJgorICAgICBsPWBleHByICRsIC0gMjBgICYmCisgICAgIGNhdCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdC0zLmlkeCBjb3VudD0yMCBicz0xIGNvbnY9bm90cnVuYyBzZWVrPSRsICYmCisgICAgIGlmIGdpdC12ZXJpZnktcGFjayB0ZXN0LTMucGFjaworICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYnVpbGQgcGFjayBpbmRleCBmb3IgYW4gZXhpc3RpbmcgcGFjaycgXAorICAgICdjYXQgdGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayA+dGVzdC0zLnBhY2sgJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLW8gdG1wLmlkeCB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdG1wLmlkeCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggJiYKKworICAgICBnaXQtaW5kZXgtcGFjayB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdGVzdC0zLmlkeCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggJiYKKworICAgICBjYXQgdGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayA+dGVzdC0zLnBhY2sgJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLW8gdG1wLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrICYmCisgICAgIGNtcCB0bXAuaWR4IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCAmJgorCisgICAgIGdpdC1pbmRleC1wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGNtcCB0ZXN0LTMuaWR4IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCAmJgorCisgICAgIGNhdCB0ZXN0LTMtJHtwYWNrbmFtZV8zfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBnaXQtaW5kZXgtcGFjayAtbyB0bXAuaWR4IHRlc3QtMy0ke3BhY2tuYW1lXzN9LnBhY2sgJiYKKyAgICAgY21wIHRtcC5pZHggdGVzdC0zLSR7cGFja25hbWVfM30uaWR4ICYmCisKKyAgICAgZ2l0LWluZGV4LXBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgY21wIHRlc3QtMy5pZHggdGVzdC0zLSR7cGFja25hbWVfM30uaWR4ICYmCisKKyAgICAgOicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2Zha2UgYSBTSEExIGhhc2ggY29sbGlzaW9uJyBcCisgICAgJ3Rlc3QgLWYJLmdpdC9vYmplY3RzL2M4LzJkZTE5MzEyYjZjMzY5NWMwYzE4ZjcwNzA5YTZjNTM1NjgyYTY3ICYmCisgICAgIGNwIC1mCS5naXQvb2JqZWN0cy85ZC8yMzVlZDA3Y2QxOTgxMWE2Y2ViMzQyZGU4MmYxOTBlNDljOWY2OCBcCisJCS5naXQvb2JqZWN0cy9jOC8yZGUxOTMxMmI2YzM2OTVjMGMxOGY3MDcwOWE2YzUzNTY4MmE2NycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ21ha2Ugc3VyZSBpbmRleC1wYWNrIGRldGVjdHMgdGhlIFNIQTEgY29sbGlzaW9uJyBcCisgICAgJ2dpdC1pbmRleC1wYWNrIC1vIGJhZC5pZHggdGVzdC0zLnBhY2snCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTMwMS1zbGlkaW5nLXdpbmRvdy5zaCBiL3QvdDUzMDEtc2xpZGluZy13aW5kb3cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmNlNzdmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUzMDEtc2xpZGluZy13aW5kb3cuc2gKQEAgLTAsMCArMSw2MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nbW1hcCBzbGlkaW5nIHdpbmRvdyB0ZXN0cycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCoKKyAgICAgZm9yIGkgaW4gYSBiIGMKKyAgICAgZG8KKyAgICAgICAgIGVjaG8gJGkgPiRpICYmCisgICAgICAgICB0ZXN0LWdlbnJhbmRvbSAiJGkiIDMyNzY4ID4+JGkgJiYKKyAgICAgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgJGkgfHwgcmV0dXJuIDEKKyAgICAgZG9uZSAmJgorICAgICBlY2hvIGQgPmQgJiYgY2F0IGMgPj5kICYmIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZCAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgY29tbWl0MT1gZ2l0LWNvbW1pdC10cmVlICR0cmVlIDwvZGV2L251bGxgICYmCisgICAgIGdpdC11cGRhdGUtcmVmIEhFQUQgJGNvbW1pdDEgJiYKKyAgICAgZ2l0LXJlcGFjayAtYSAtZCAmJgorICAgICB0ZXN0ICJgZ2l0LWNvdW50LW9iamVjdHNgIiA9ICIwIG9iamVjdHMsIDAga2lsb2J5dGVzIiAmJgorICAgICBwYWNrMT1gbHMgLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrYCAmJgorICAgICB0ZXN0IC1mICIkcGFjazEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5LXBhY2sgLXYsIGRlZmF1bHRzJyBcCisgICAgJ2dpdC12ZXJpZnktcGFjayAtdiAiJHBhY2sxIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeS1wYWNrIC12LCBwYWNrZWRHaXRXaW5kb3dTaXplID09IDEgcGFnZScgXAorICAgICdnaXQtY29uZmlnIGNvcmUucGFja2VkR2l0V2luZG93U2l6ZSA1MTIgJiYKKyAgICAgZ2l0LXZlcmlmeS1wYWNrIC12ICIkcGFjazEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5LXBhY2sgLXYsIHBhY2tlZEdpdHtXaW5kb3dTaXplLExpbWl0fSA9PSAxIHBhZ2UnIFwKKyAgICAnZ2l0LWNvbmZpZyBjb3JlLnBhY2tlZEdpdFdpbmRvd1NpemUgNTEyICYmCisgICAgIGdpdC1jb25maWcgY29yZS5wYWNrZWRHaXRMaW1pdCA1MTIgJiYKKyAgICAgZ2l0LXZlcmlmeS1wYWNrIC12ICIkcGFjazEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVwYWNrIC1hIC1kLCBwYWNrZWRHaXR7V2luZG93U2l6ZSxMaW1pdH0gPT0gMSBwYWdlJyBcCisgICAgJ2dpdC1jb25maWcgY29yZS5wYWNrZWRHaXRXaW5kb3dTaXplIDUxMiAmJgorICAgICBnaXQtY29uZmlnIGNvcmUucGFja2VkR2l0TGltaXQgNTEyICYmCisgICAgIGNvbW1pdDI9YGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkY29tbWl0MSA8L2Rldi9udWxsYCAmJgorICAgICBnaXQtdXBkYXRlLXJlZiBIRUFEICRjb21taXQyICYmCisgICAgIGdpdC1yZXBhY2sgLWEgLWQgJiYKKyAgICAgdGVzdCAiYGdpdC1jb3VudC1vYmplY3RzYCIgPSAiMCBvYmplY3RzLCAwIGtpbG9ieXRlcyIgJiYKKyAgICAgcGFjazI9YGxzIC5naXQvb2JqZWN0cy9wYWNrLyoucGFja2AgJiYKKyAgICAgdGVzdCAtZiAiJHBhY2syIgorICAgICB0ZXN0ICIkcGFjazEiIFwhPSAiJHBhY2syIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeS1wYWNrIC12LCBkZWZhdWx0cycgXAorICAgICdnaXQtY29uZmlnIC0tdW5zZXQgY29yZS5wYWNrZWRHaXRXaW5kb3dTaXplICYmCisgICAgIGdpdC1jb25maWcgLS11bnNldCBjb3JlLnBhY2tlZEdpdExpbWl0ICYmCisgICAgIGdpdC12ZXJpZnktcGFjayAtdiAiJHBhY2syIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MzAyLXBhY2staW5kZXguc2ggYi90L3Q1MzAyLXBhY2staW5kZXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQwNmVjYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUzMDItcGFjay1pbmRleC5zaApAQCAtMCwwICsxLDE0OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBOaWNvbGFzIFBpdHJlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J3BhY2sgaW5kZXggd2l0aCA2NC1iaXQgb2Zmc2V0cyBhbmQgb2JqZWN0IENSQycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAncm0gLXJmIC5naXQKKyAgICAgZ2l0LWluaXQgJiYKKyAgICAgaT0xICYmCisJIHdoaWxlIHRlc3QgJGkgLWxlIDEwMAorICAgICBkbworCQkgaT1gcHJpbnRmICclMDNpJyAkaWAKKyAgICAgICAgIGVjaG8gJGkgPmZpbGVfJGkgJiYKKyAgICAgICAgIHRlc3QtZ2VucmFuZG9tICIkaSIgODE5MiA+PmZpbGVfJGkgJiYKKyAgICAgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZV8kaSAmJgorCQkgaT1gZXhwciAkaSArIDFgIHx8IHJldHVybiAxCisgICAgIGRvbmUgJiYKKyAgICAgeyBlY2hvIDEwMSAmJiB0ZXN0LWdlbnJhbmRvbSAxMDAgODE5MjsgfSA+ZmlsZV8xMDEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlXzEwMSAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgY29tbWl0PWBnaXQtY29tbWl0LXRyZWUgJHRyZWUgPC9kZXYvbnVsbGAgJiYgeworCSBlY2hvICR0cmVlICYmCisJIGdpdC1scy10cmVlICR0cmVlIHwgc2VkIC1lICJzLy4qIFxcKFswLTlhLWZdKlxcKQkuKi9cXDEvIgorICAgICB9ID5vYmotbGlzdCAmJgorICAgICBnaXQtdXBkYXRlLXJlZiBIRUFEICRjb21taXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwYWNrLW9iamVjdHMgd2l0aCBpbmRleCB2ZXJzaW9uIDEnIFwKKyAgICAncGFjazE9JChnaXQtcGFjay1vYmplY3RzIC0taW5kZXgtdmVyc2lvbj0xIHRlc3QtMSA8b2JqLWxpc3QpICYmCisgICAgIGdpdC12ZXJpZnktcGFjayAtdiAidGVzdC0xLSR7cGFjazF9LnBhY2siJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncGFjay1vYmplY3RzIHdpdGggaW5kZXggdmVyc2lvbiAyJyBcCisgICAgJ3BhY2syPSQoZ2l0LXBhY2stb2JqZWN0cyAtLWluZGV4LXZlcnNpb249MiB0ZXN0LTIgPG9iai1saXN0KSAmJgorICAgICBnaXQtdmVyaWZ5LXBhY2sgLXYgInRlc3QtMi0ke3BhY2syfS5wYWNrIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2JvdGggcGFja3Mgc2hvdWxkIGJlIGlkZW50aWNhbCcgXAorICAgICdjbXAgInRlc3QtMS0ke3BhY2sxfS5wYWNrIiAidGVzdC0yLSR7cGFjazJ9LnBhY2siJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnaW5kZXggdjEgYW5kIGluZGV4IHYyIHNob3VsZCBiZSBkaWZmZXJlbnQnIFwKKyAgICAnY21wICJ0ZXN0LTEtJHtwYWNrMX0uaWR4IiAidGVzdC0yLSR7cGFjazJ9LmlkeCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleC1wYWNrIHdpdGggaW5kZXggdmVyc2lvbiAxJyBcCisgICAgJ2dpdC1pbmRleC1wYWNrIC0taW5kZXgtdmVyc2lvbj0xIC1vIDEuaWR4ICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleC1wYWNrIHdpdGggaW5kZXggdmVyc2lvbiAyJyBcCisgICAgJ2dpdC1pbmRleC1wYWNrIC0taW5kZXgtdmVyc2lvbj0yIC1vIDIuaWR4ICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleC1wYWNrIHJlc3VsdHMgc2hvdWxkIG1hdGNoIHBhY2stb2JqZWN0cyBvbmVzJyBcCisgICAgJ2NtcCAidGVzdC0xLSR7cGFjazF9LmlkeCIgIjEuaWR4IiAmJgorICAgICBjbXAgInRlc3QtMi0ke3BhY2syfS5pZHgiICIyLmlkeCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleCB2MjogZm9yY2Ugc29tZSA2NC1iaXQgb2Zmc2V0cyB3aXRoIHBhY2stb2JqZWN0cycgXAorICAgICdwYWNrMz0kKGdpdC1wYWNrLW9iamVjdHMgLS1pbmRleC12ZXJzaW9uPTIsMHg0MDAwMCB0ZXN0LTMgPG9iai1saXN0KSAmJgorICAgICBnaXQtdmVyaWZ5LXBhY2sgLXYgInRlc3QtMy0ke3BhY2szfS5wYWNrIicKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzY0LWJpdCBvZmZzZXRzOiBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgaW5kZXggdjIgcmVzdWx0cycgXAorICAgICdjbXAgInRlc3QtMi0ke3BhY2syfS5pZHgiICJ0ZXN0LTMtJHtwYWNrM30uaWR4IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2luZGV4IHYyOiBmb3JjZSBzb21lIDY0LWJpdCBvZmZzZXRzIHdpdGggaW5kZXgtcGFjaycgXAorICAgICdnaXQtaW5kZXgtcGFjayAtLWluZGV4LXZlcnNpb249MiwweDQwMDAwIC1vIDMuaWR4ICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2NC1iaXQgb2Zmc2V0czogaW5kZXgtcGFjayByZXN1bHQgc2hvdWxkIG1hdGNoIHBhY2stb2JqZWN0cyBvbmUnIFwKKyAgICAnY21wICJ0ZXN0LTMtJHtwYWNrM30uaWR4IiAiMy5pZHgiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYxXSAxKSBzdHJlYW0gcGFjayB0byByZXBvc2l0b3J5JyBcCisgICAgJ2dpdC1pbmRleC1wYWNrIC0taW5kZXgtdmVyc2lvbj0xIC0tc3RkaW4gPCAidGVzdC0xLSR7cGFjazF9LnBhY2siICYmCisgICAgIGdpdC1wcnVuZS1wYWNrZWQgJiYKKyAgICAgZ2l0LWNvdW50LW9iamVjdHMgfCAoIHJlYWQgbnIgcmVzdCAmJiB0ZXN0ICIkbnIiIC1lcSAxICkgJiYKKyAgICAgY21wICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayIgIi5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0ucGFjayIgJiYKKyAgICAgY21wICJ0ZXN0LTEtJHtwYWNrMX0uaWR4IiAgIi5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0uaWR4IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1tpbmRleCB2MV0gMikgY3JlYXRlIGEgc3RlYWx0aCBjb3JydXB0aW9uIGluIGEgZGVsdGEgYmFzZSByZWZlcmVuY2UnIFwKKyAgICAnIyB0aGlzIHRlc3QgYXNzdW1lcyBhIGRlbHRhIHNtYWxsZXIgdGhhbiAxNiBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrCisgICAgIGdpdC1zaG93LWluZGV4IDwxLmlkeCB8IHNvcnQgLW4gfCB0YWlsIC1uIDEgfCAoCisgICAgICAgcmVhZCBkZWx0YV9vZmZzIGRlbHRhX3NoYTEgJiYKKyAgICAgICBnaXQtY2F0LWZpbGUgYmxvYiAiJGRlbHRhX3NoYTEiID4gYmxvYl8xICYmCisgICAgICAgY2htb2QgK3cgIi5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0ucGFjayIgJiYKKyAgICAgICBkZCBvZj0iLmdpdC9vYmplY3RzL3BhY2svcGFjay0ke3BhY2sxfS5wYWNrIiBzZWVrPSQoKCRkZWx0YV9vZmZzICsgMSkpIFwKKwkgIGlmPSIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LmlkeCIgc2tpcD0kKCgyNTYgKiA0ICsgNCkpIFwKKwkgIGJzPTEgY291bnQ9MjAgY29udj1ub3RydW5jICYmCisgICAgICAgZ2l0LWNhdC1maWxlIGJsb2IgIiRkZWx0YV9zaGExIiA+IGJsb2JfMiApJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnW2luZGV4IHYxXSAzKSBjb3JydXB0ZWQgZGVsdGEgaGFwcGlseSByZXR1cm5lZCB3cm9uZyBkYXRhJyBcCisgICAgJ2NtcCBibG9iXzEgYmxvYl8yJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnW2luZGV4IHYxXSA0KSBjb25maXJtIHRoYXQgdGhlIHBhY2sgaXMgYWN0dWFsbHkgY29ycnVwdGVkJyBcCisgICAgJ2dpdC1mc2NrIC0tZnVsbCAkY29tbWl0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYxXSA1KSBwYWNrLW9iamVjdHMgaGFwcGlseSByZXVzZXMgY29ycnVwdGVkIGRhdGEnIFwKKyAgICAncGFjazQ9JChnaXQtcGFjay1vYmplY3RzIHRlc3QtNCA8b2JqLWxpc3QpICYmCisgICAgIHRlc3QgLWYgInRlc3QtNC0ke3BhY2sxfS5wYWNrIicKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ1tpbmRleCB2MV0gNikgbmV3bHkgY3JlYXRlZCBwYWNrIGlzIEJBRCAhJyBcCisgICAgJ2dpdC12ZXJpZnktcGFjayAtdiAidGVzdC00LSR7cGFjazF9LnBhY2siJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYyXSAxKSBzdHJlYW0gcGFjayB0byByZXBvc2l0b3J5JyBcCisgICAgJ3JtIC1mIC5naXQvb2JqZWN0cy9wYWNrLyogJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLS1pbmRleC12ZXJzaW9uPTIsMHg0MDAwMCAtLXN0ZGluIDwgInRlc3QtMS0ke3BhY2sxfS5wYWNrIiAmJgorICAgICBnaXQtcHJ1bmUtcGFja2VkICYmCisgICAgIGdpdC1jb3VudC1vYmplY3RzIHwgKCByZWFkIG5yIHJlc3QgJiYgdGVzdCAiJG5yIiAtZXEgMSApICYmCisgICAgIGNtcCAidGVzdC0xLSR7cGFjazF9LnBhY2siICIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LnBhY2siICYmCisgICAgIGNtcCAidGVzdC0zLSR7cGFjazF9LmlkeCIgICIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LmlkeCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdbaW5kZXggdjJdIDIpIGNyZWF0ZSBhIHN0ZWFsdGggY29ycnVwdGlvbiBpbiBhIGRlbHRhIGJhc2UgcmVmZXJlbmNlJyBcCisgICAgJyMgdGhpcyB0ZXN0IGFzc3VtZXMgYSBkZWx0YSBzbWFsbGVyIHRoYW4gMTYgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFjaworICAgICBnaXQtc2hvdy1pbmRleCA8MS5pZHggfCBzb3J0IC1uIHwgdGFpbCAtbiAxIHwgKAorICAgICAgIHJlYWQgZGVsdGFfb2ZmcyBkZWx0YV9zaGExIGRlbHRhX2NyYyAmJgorICAgICAgIGdpdC1jYXQtZmlsZSBibG9iICIkZGVsdGFfc2hhMSIgPiBibG9iXzMgJiYKKyAgICAgICBjaG1vZCArdyAiLmdpdC9vYmplY3RzL3BhY2svcGFjay0ke3BhY2sxfS5wYWNrIiAmJgorICAgICAgIGRkIG9mPSIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LnBhY2siIHNlZWs9JCgoJGRlbHRhX29mZnMgKyAxKSkgXAorCSAgaWY9Ii5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0uaWR4IiBza2lwPSQoKDggKyAyNTYgKiA0KSkgXAorCSAgYnM9MSBjb3VudD0yMCBjb252PW5vdHJ1bmMgJiYKKyAgICAgICBnaXQtY2F0LWZpbGUgYmxvYiAiJGRlbHRhX3NoYTEiID4gYmxvYl80ICknCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdbaW5kZXggdjJdIDMpIGNvcnJ1cHRlZCBkZWx0YSBoYXBwaWx5IHJldHVybmVkIHdyb25nIGRhdGEnIFwKKyAgICAnY21wIGJsb2JfMyBibG9iXzQnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdbaW5kZXggdjJdIDQpIGNvbmZpcm0gdGhhdCB0aGUgcGFjayBpcyBhY3R1YWxseSBjb3JydXB0ZWQnIFwKKyAgICAnZ2l0LWZzY2sgLS1mdWxsICRjb21taXQnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdbaW5kZXggdjJdIDUpIHBhY2stb2JqZWN0cyByZWZ1c2VzIHRvIHJldXNlIGNvcnJ1cHRlZCBkYXRhJyBcCisgICAgJ2dpdC1wYWNrLW9iamVjdHMgdGVzdC01IDxvYmotbGlzdCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NDAwLXNlbmQtcGFjay5zaCBiL3QvdDU0MDAtc2VuZC1wYWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3N2IyNjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NDAwLXNlbmQtcGFjay5zaApAQCAtMCwwICsxLDExNiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdTZWUgd2h5IHJld2luZGluZyBoZWFkIGJyZWFrcyBzZW5kLXBhY2sKKworJworLiAuL3Rlc3QtbGliLnNoCisKK2NudD02NAordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJdGVzdF90aWNrICYmCisJbWtkaXIgbW96YXJ0IG1vemFydC9pcyAmJgorCWVjaG8gIkNvbW1pdCAjMCIgPm1vemFydC9pcy9waW5rICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBtb3phcnQvaXMvcGluayAmJgorCXRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKwljb21taXQ9JChlY2hvICJDb21taXQgIzAiIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlKSAmJgorCXplcm89JGNvbW1pdCAmJgorCXBhcmVudD0kemVybyAmJgorCWk9MCAmJgorCXdoaWxlIHRlc3QgJGkgLWxlICRjbnQKKwlkbworCSAgICBpPSQoKCRpKzEpKSAmJgorCSAgICB0ZXN0X3RpY2sgJiYKKwkgICAgZWNobyAiQ29tbWl0ICMkaSIgPm1vemFydC9pcy9waW5rICYmCisJICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbW96YXJ0L2lzL3BpbmsgJiYKKwkgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorCSAgICBjb21taXQ9JChlY2hvICJDb21taXQgIyRpIiB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50KSAmJgorCSAgICBnaXQtdXBkYXRlLXJlZiByZWZzL3RhZ3MvY29tbWl0JGkgJGNvbW1pdCAmJgorCSAgICBwYXJlbnQ9JGNvbW1pdCB8fCByZXR1cm4gMQorCWRvbmUgJiYKKwlnaXQtdXBkYXRlLXJlZiBIRUFEICIkY29tbWl0IiAmJgorCWdpdC1jbG9uZSAuLy4gdmljdGltICYmCisJY2QgdmljdGltICYmCisJZ2l0LWxvZyAmJgorCWNkIC4uICYmCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJHplcm8iICYmCisJcGFyZW50PSR6ZXJvICYmCisJaT0wICYmCisJd2hpbGUgdGVzdCAkaSAtbGUgJGNudAorCWRvCisJICAgIGk9JCgoJGkrMSkpICYmCisJICAgIHRlc3RfdGljayAmJgorCSAgICBlY2hvICJSZWJhc2UgIyRpIiA+bW96YXJ0L2lzL3BpbmsgJiYKKwkgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBtb3phcnQvaXMvcGluayAmJgorCSAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisJICAgIGNvbW1pdD0kKGVjaG8gIlJlYmFzZSAjJGkiIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRwYXJlbnQpICYmCisJICAgIGdpdC11cGRhdGUtcmVmIHJlZnMvdGFncy9yZWJhc2UkaSAkY29tbWl0ICYmCisJICAgIHBhcmVudD0kY29tbWl0IHx8IHJldHVybiAxCisJZG9uZSAmJgorCWdpdC11cGRhdGUtcmVmIEhFQUQgIiRjb21taXQiICYmCisJZWNobyBSZWJhc2UgJiYKKwlnaXQtbG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYWNrIHRoZSBzb3VyY2UgcmVwb3NpdG9yeScgJworCWdpdCByZXBhY2sgLWEgLWQgJiYKKwlnaXQgcHJ1bmUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGFjayB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeScgJworCWNkIHZpY3RpbSAmJgorCWdpdCByZXBhY2sgLWEgLWQgJiYKKwlnaXQgcHJ1bmUgJiYKKwljZCAuLgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgICAgJ3B1c2hpbmcgcmV3b3VuZCBoZWFkIHNob3VsZCBub3QgYmFyZiBidXQgcmVxdWlyZSAtLWZvcmNlJyAnIAorCSMgc2hvdWxkIG5vdCBmYWlsIGJ1dCByZWZ1c2UgdG8gdXBkYXRlLgorCWlmIGdpdC1zZW5kLXBhY2sgLi92aWN0aW0vLmdpdC8gbWFzdGVyCisJdGhlbgorCQkjIG5vdyBpdCBzaG91bGQgZmFpbCB3aXRoIFBhc2t5IHBhdGNoCisJCWVjaG8gPiYyIEdhYWgsIGl0IHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gPiYyIFRoYW5rcywgaXQgY29ycmVjdGx5IGZhaWxlZC4KKwkJdHJ1ZQorCWZpICYmCisJaWYgY21wIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKwl0aGVuCisJCSMgc2hvdWxkIGhhdmUgYmVlbiBsZWZ0IGFzIGl0IHdhcyEKKwkJZmFsc2UKKwllbHNlCisJCXRydWUKKwlmaSAmJgorCSMgdGhpcyBzaG91bGQgdXBkYXRlCisJZ2l0LXNlbmQtcGFjayAtLWZvcmNlIC4vdmljdGltLy5naXQvIG1hc3RlciAmJgorCWNtcCB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAncHVzaCBjYW4gYmUgdXNlZCB0byBkZWxldGUgYSByZWYnICcKKwljZCB2aWN0aW0gJiYKKwlnaXQgYnJhbmNoIGV4dHJhIG1hc3RlciAmJgorCWNkIC4uICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL2V4dHJhICYmCisJZ2l0LXNlbmQtcGFjayAuL3ZpY3RpbS8uZ2l0LyA6ZXh0cmEgbWFzdGVyICYmCisJISB0ZXN0IC1mIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvZXh0cmEKKycKKwordW5zZXQgR0lUX0NPTkZJRyBHSVRfQ09ORklHX0xPQ0FMCitIT01FPWBwd2RgL25vLXN1Y2gtZGlyZWN0b3J5CitleHBvcnQgSE9NRSA7IyB0aGlzIHdheSB3ZSBmb3JjZSB0aGUgdmljdGltLy5naXQvY29uZmlnIHRvIGJlIHVzZWQuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAncHVzaGluZyB3aXRoIC0tZm9yY2Ugc2hvdWxkIGJlIGRlbmllZCB3aXRoIGRlbnlOb25GYXN0Zm9yd2FyZHMnICcKKwljZCB2aWN0aW0gJiYKKwlnaXQtY29uZmlnIHJlY2VpdmUuZGVueU5vbkZhc3Rmb3J3YXJkcyB0cnVlICYmCisJY2QgLi4gJiYKKwlnaXQtdXBkYXRlLXJlZiByZWZzL2hlYWRzL21hc3RlciBtYXN0ZXJeIHx8IHJldHVybiAxCisJZ2l0LXNlbmQtcGFjayAtLWZvcmNlIC4vdmljdGltLy5naXQvIG1hc3RlciAmJiByZXR1cm4gMQorCSEgZ2l0IGRpZmYgLmdpdC9yZWZzL2hlYWRzL21hc3RlciB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL21hc3RlcgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU0MDEtdXBkYXRlLWhvb2tzLnNoIGIvdC90NTQwMS11cGRhdGUtaG9va3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFjN2ZmMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU0MDEtdXBkYXRlLWhvb2tzLnNoCkBAIC0wLDAgKzEsMTM2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIE8uIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHRoZSB1cGRhdGUgaG9vayBpbmZyYXN0cnVjdHVyZS4nCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBUaGlzIGlzIGEgdGVzdC4gPmEgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGEgJiYKKwl0cmVlMD0kKGdpdC13cml0ZS10cmVlKSAmJgorCWNvbW1pdDA9JChlY2hvIHNldHVwIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlMCkgJiYKKwllY2hvIFdlIGhvcGUgaXQgd29ya3MuID5hICYmCisJZ2l0LXVwZGF0ZS1pbmRleCBhICYmCisJdHJlZTE9JChnaXQtd3JpdGUtdHJlZSkgJiYKKwljb21taXQxPSQoZWNobyBtb2RpZnkgfCBnaXQtY29tbWl0LXRyZWUgJHRyZWUxIC1wICRjb21taXQwKSAmJgorCWdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyICRjb21taXQwICYmCisJZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy90b2ZhaWwgJGNvbW1pdDEgJiYKKwlnaXQtY2xvbmUgLi8uIHZpY3RpbSAmJgorCUdJVF9ESVI9dmljdGltLy5naXQgZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy90b2ZhaWwgJGNvbW1pdDEgJiYKKwlnaXQtdXBkYXRlLXJlZiByZWZzL2hlYWRzL21hc3RlciAkY29tbWl0MSAmJgorCWdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvdG9mYWlsICRjb21taXQwCisnCisKK2NhdCA+dmljdGltLy5naXQvaG9va3MvcHJlLXJlY2VpdmUgPDwnRU9GJworIyEvYmluL3NoCitwcmludGYgIiRAIiA+PiRHSVRfRElSL3ByZS1yZWNlaXZlLmFyZ3MKK2NhdCAtID4kR0lUX0RJUi9wcmUtcmVjZWl2ZS5zdGRpbgorZWNobyBTVERPVVQgcHJlLXJlY2VpdmUKK2VjaG8gU1RERVJSIHByZS1yZWNlaXZlID4mMgorRU9GCitjaG1vZCB1K3ggdmljdGltLy5naXQvaG9va3MvcHJlLXJlY2VpdmUKKworY2F0ID52aWN0aW0vLmdpdC9ob29rcy91cGRhdGUgPDwnRU9GJworIyEvYmluL3NoCitlY2hvICIkQCIgPj4kR0lUX0RJUi91cGRhdGUuYXJncworcmVhZCB4OyBwcmludGYgIiR4IiA+JEdJVF9ESVIvdXBkYXRlLnN0ZGluCitlY2hvIFNURE9VVCB1cGRhdGUgJDEKK2VjaG8gU1RERVJSIHVwZGF0ZSAkMSA+JjIKK3Rlc3QgIiQxIiA9IHJlZnMvaGVhZHMvbWFzdGVyIHx8IGV4aXQKK0VPRgorY2htb2QgdSt4IHZpY3RpbS8uZ2l0L2hvb2tzL3VwZGF0ZQorCitjYXQgPnZpY3RpbS8uZ2l0L2hvb2tzL3Bvc3QtcmVjZWl2ZSA8PCdFT0YnCisjIS9iaW4vc2gKK3ByaW50ZiAiJEAiID4+JEdJVF9ESVIvcG9zdC1yZWNlaXZlLmFyZ3MKK2NhdCAtID4kR0lUX0RJUi9wb3N0LXJlY2VpdmUuc3RkaW4KK2VjaG8gU1RET1VUIHBvc3QtcmVjZWl2ZQorZWNobyBTVERFUlIgcG9zdC1yZWNlaXZlID4mMgorRU9GCitjaG1vZCB1K3ggdmljdGltLy5naXQvaG9va3MvcG9zdC1yZWNlaXZlCisKK2NhdCA+dmljdGltLy5naXQvaG9va3MvcG9zdC11cGRhdGUgPDwnRU9GJworIyEvYmluL3NoCitlY2hvICIkQCIgPj4kR0lUX0RJUi9wb3N0LXVwZGF0ZS5hcmdzCityZWFkIHg7IHByaW50ZiAiJHgiID4kR0lUX0RJUi9wb3N0LXVwZGF0ZS5zdGRpbgorZWNobyBTVERPVVQgcG9zdC11cGRhdGUKK2VjaG8gU1RERVJSIHBvc3QtdXBkYXRlID4mMgorRU9GCitjaG1vZCB1K3ggdmljdGltLy5naXQvaG9va3MvcG9zdC11cGRhdGUKKwordGVzdF9leHBlY3RfZmFpbHVyZSBwdXNoICcKKwlnaXQtc2VuZC1wYWNrIC0tZm9yY2UgLi92aWN0aW0vLmdpdCBtYXN0ZXIgdG9mYWlsID5zZW5kLm91dCAyPnNlbmQuZXJyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZWQgYXMgZXhwZWN0ZWQnICcKKwl0ZXN0ICQoR0lUX0RJUj12aWN0aW0vLmdpdCBnaXQtcmV2LXBhcnNlIG1hc3RlcikgPSAkY29tbWl0MSAmJgorCXRlc3QgJChHSVRfRElSPXZpY3RpbS8uZ2l0IGdpdC1yZXYtcGFyc2UgdG9mYWlsKSA9ICRjb21taXQxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hvb2tzIHJhbicgJworCXRlc3QgLWYgdmljdGltLy5naXQvcHJlLXJlY2VpdmUuYXJncyAmJgorCXRlc3QgLWYgdmljdGltLy5naXQvcHJlLXJlY2VpdmUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3VwZGF0ZS5hcmdzICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC91cGRhdGUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5hcmdzICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC9wb3N0LXJlY2VpdmUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLmFyZ3MgJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZS1yZWNlaXZlIGhvb2sgaW5wdXQnICcKKwkoZWNobyAkY29tbWl0MCAkY29tbWl0MSByZWZzL2hlYWRzL21hc3RlcjsKKwkgZWNobyAkY29tbWl0MSAkY29tbWl0MCByZWZzL2hlYWRzL3RvZmFpbAorCSkgfCBnaXQgZGlmZiAtIHZpY3RpbS8uZ2l0L3ByZS1yZWNlaXZlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBob29rIGFyZ3VtZW50cycgJworCShlY2hvIHJlZnMvaGVhZHMvbWFzdGVyICRjb21taXQwICRjb21taXQxOworCSBlY2hvIHJlZnMvaGVhZHMvdG9mYWlsICRjb21taXQxICRjb21taXQwCisJKSB8IGdpdCBkaWZmIC0gdmljdGltLy5naXQvdXBkYXRlLmFyZ3MKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1yZWNlaXZlIGhvb2sgaW5wdXQnICcKKwllY2hvICRjb21taXQwICRjb21taXQxIHJlZnMvaGVhZHMvbWFzdGVyIHwKKwlnaXQgZGlmZiAtIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5zdGRpbgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LXVwZGF0ZSBob29rIGFyZ3VtZW50cycgJworCWVjaG8gcmVmcy9oZWFkcy9tYXN0ZXIgfAorCWdpdCBkaWZmIC0gdmljdGltLy5naXQvcG9zdC11cGRhdGUuYXJncworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbGwgaG9vayBzdGRpbiBpcyAvZGV2L251bGwnICcKKwkhIHRlc3QgLXMgdmljdGltLy5naXQvdXBkYXRlLnN0ZGluICYmCisJISB0ZXN0IC1zIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FsbCAqLXJlY2VpdmUgaG9vayBhcmdzIGFyZSBlbXB0eScgJworCSEgdGVzdCAtcyB2aWN0aW0vLmdpdC9wcmUtcmVjZWl2ZS5hcmdzICYmCisJISB0ZXN0IC1zIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5hcmdzCisnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ3NlbmQtcGFjayBwcm9kdWNlZCBubyBvdXRwdXQnICcKKwl0ZXN0IC1zIHNlbmQub3V0CisnCisKK2NhdCA8PEVPRiA+ZXhwZWN0CitTVERPVVQgcHJlLXJlY2VpdmUKK1NUREVSUiBwcmUtcmVjZWl2ZQorU1RET1VUIHVwZGF0ZSByZWZzL2hlYWRzL21hc3RlcgorU1RERVJSIHVwZGF0ZSByZWZzL2hlYWRzL21hc3RlcgorU1RET1VUIHVwZGF0ZSByZWZzL2hlYWRzL3RvZmFpbAorU1RERVJSIHVwZGF0ZSByZWZzL2hlYWRzL3RvZmFpbAorU1RET1VUIHBvc3QtcmVjZWl2ZQorU1RERVJSIHBvc3QtcmVjZWl2ZQorU1RET1VUIHBvc3QtdXBkYXRlCitTVERFUlIgcG9zdC11cGRhdGUKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2VuZC1wYWNrIHN0ZGVyciBjb250YWlucyBob29rIG1lc3NhZ2VzJyAnCisJZWdyZXAgXlNURCBzZW5kLmVyciA+YWN0dWFsICYmCisJZ2l0IGRpZmYgLSBhY3R1YWwgPGV4cGVjdAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MDAtZmV0Y2gtcGFjay5zaCBiL3QvdDU1MDAtZmV0Y2gtcGFjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OGUzZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUwMC1mZXRjaC1wYWNrLnNoCkBAIC0wLDAgKzEsMTgyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdGluZyBtdWx0aV9hY2sgcGFjayBmZXRjaGluZworCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBUZXN0IGZldGNoLXBhY2svdXBsb2FkLXBhY2sgcGFpci4KKworIyBTb21lIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworCithZGQgKCkgeworCW5hbWU9JDEKKwl0ZXh0PSIkQCIKKwlicmFuY2g9YGVjaG8gJG5hbWUgfCBzZWQgLWUgJ3MvXlwoLlwpLiokL1wxLydgCisJcGFyZW50cz0iIgorCisJc2hpZnQKKwl3aGlsZSB0ZXN0ICQxOyBkbworCQlwYXJlbnRzPSIkcGFyZW50cyAtcCAkMSIKKwkJc2hpZnQKKwlkb25lCisKKwllY2hvICIkdGV4dCIgPiB0ZXN0LnR4dAorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgdGVzdC50eHQKKwl0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpCisJIyBtYWtlIHN1cmUgdGltZXN0YW1wcyBhcmUgaW4gY29ycmVjdCBvcmRlcgorCXNlYz0kKCgkc2VjKzEpKQorCWNvbW1pdD0kKGVjaG8gIiR0ZXh0IiB8IEdJVF9BVVRIT1JfREFURT0kc2VjIFwKKwkJZ2l0LWNvbW1pdC10cmVlICR0cmVlICRwYXJlbnRzIDI+PmxvZzIudHh0KQorCWV4cG9ydCAkbmFtZT0kY29tbWl0CisJZWNobyAkY29tbWl0ID4gLmdpdC9yZWZzL2hlYWRzLyRicmFuY2gKKwlldmFsICR7YnJhbmNofVRJUD0kY29tbWl0Cit9CisKK2NvdW50X29iamVjdHMgKCkgeworCWxzIC5naXQvb2JqZWN0cy8/Py8qIDI+PmxvZzIudHh0IHwgd2MgLWwgfCB0ciAtZCAiICIKK30KKwordGVzdF9leHBlY3Rfb2JqZWN0X2NvdW50ICgpIHsKKwltZXNzYWdlPSQxCisJY291bnQ9JDIKKworCW91dHB1dD0iJChjb3VudF9vYmplY3RzKSIKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkJIm5ldyBvYmplY3QgY291bnQgJG1lc3NhZ2UiIFwKKwkJInRlc3QgJGNvdW50ID0gJG91dHB1dCIKK30KKworcHVsbF90b19jbGllbnQgKCkgeworCW51bWJlcj0kMQorCWhlYWRzPSQyCisJY291bnQ9JDMKKwlub19zdHJpY3RfY291bnRfY2hlY2s9JDQKKworCWNkIGNsaWVudAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRudW1iZXIgcHVsbCIgXAorCQkiZ2l0LWZldGNoLXBhY2sgLWsgLXYgLi4gJGhlYWRzIgorCWNhc2UgIiRoZWFkcyIgaW4gKkEqKSBlY2hvICRBVElQID4gLmdpdC9yZWZzL2hlYWRzL0E7OyBlc2FjCisJY2FzZSAiJGhlYWRzIiBpbiAqQiopIGVjaG8gJEJUSVAgPiAuZ2l0L3JlZnMvaGVhZHMvQjs7IGVzYWMKKwlnaXQtc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy9gZWNobyAkaGVhZHMgfCBzZWQgLWUgJ3MvXlwoLlwpLiokL1wxLydgCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJmc2NrIiAnZ2l0LWZzY2sgLS1mdWxsID4gZnNjay50eHQgMj4mMScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGRvd25sb2FkZWQgcmVzdWx0cycgXAorCSdtdiAuZ2l0L29iamVjdHMvcGFjay9wYWNrLSogLiAmJgorCSBwPWBscyAtMSBwYWNrLSoucGFja2AgJiYKKwkgZ2l0LXVucGFjay1vYmplY3RzIDwkcCAmJgorCSBnaXQtZnNjayAtLWZ1bGwnCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJuZXcgb2JqZWN0IGNvdW50IGFmdGVyICRudW1iZXIgcHVsbCIgXAorCSdpZHg9YGVjaG8gcGFjay0qLmlkeGAgJiYKKwkgcGFja19jb3VudD1gZ2l0LXNob3ctaW5kZXggPCRpZHggfCB3YyAtbGAgJiYKKwkgdGVzdCAkcGFja19jb3VudCA9ICRjb3VudCcKKwl0ZXN0IC16ICIkcGFja19jb3VudCIgJiYgcGFja19jb3VudD0wCisJaWYgWyAteiAiJG5vX3N0cmljdF9jb3VudF9jaGVjayIgXTsgdGhlbgorCQl0ZXN0X2V4cGVjdF9zdWNjZXNzICJtaW5pbWFsIGNvdW50IiAidGVzdCAkY291bnQgPSAkcGFja19jb3VudCIKKwllbHNlCisJCXRlc3QgJGNvdW50ICE9ICRwYWNrX2NvdW50ICYmIFwKKwkJCWVjaG8gIldBUk5JTkc6ICRwYWNrX2NvdW50IG9iamVjdHMgdHJhbnNtaXR0ZWQsIG9ubHkgJGNvdW50IG9mIHdoaWNoIHdlcmUgbmVlZGVkIgorCWZpCisJcm0gLWYgcGFjay0qCisJY2QgLi4KK30KKworIyBIZXJlIGJlZ2lucyB0aGUgYWN0dWFsIHRlc3RpbmcKKworIyBBMSAtIC4uLiAtIEEyMCAtIEEyMQorIyAgICBcCisjICAgICAgQjEgIC0gICBCMiAtIC4uIC0gQjcwCisKKyMgY2xpZW50IHB1bGxzIEEyMCwgQjEuIFRoZW4gdHJhY2tzIG9ubHkgQi4gVGhlbiBwdWxscyBBLgorCisoCisJbWtkaXIgY2xpZW50ICYmCisJY2QgY2xpZW50ICYmCisJZ2l0LWluaXQgMj4+IGxvZzIudHh0ICYmCisJZ2l0IGNvbmZpZyB0cmFuc2Zlci51bnBhY2tsaW1pdCAwCispCisKK2FkZCBBMQorCitwcmV2PTE7IGN1cj0yOyB3aGlsZSBbICRjdXIgLWxlIDEwIF07IGRvCisJYWRkIEEkY3VyICQoZXZhbCBlY2hvIFwkQSRwcmV2KQorCXByZXY9JGN1cgorCWN1cj0kKCgkY3VyKzEpKQorZG9uZQorCithZGQgQjEgJEExCisKK2VjaG8gJEFUSVAgPiAuZ2l0L3JlZnMvaGVhZHMvQQorZWNobyAkQlRJUCA+IC5naXQvcmVmcy9oZWFkcy9CCitnaXQtc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy9CCisKK3B1bGxfdG9fY2xpZW50IDFzdCAiQiBBIiAkKCgxMSozKSkKKworYWRkIEExMSAkQTEwCisKK3ByZXY9MTsgY3VyPTI7IHdoaWxlIFsgJGN1ciAtbGUgNjUgXTsgZG8KKwlhZGQgQiRjdXIgJChldmFsIGVjaG8gXCRCJHByZXYpCisJcHJldj0kY3VyCisJY3VyPSQoKCRjdXIrMSkpCitkb25lCisKK3B1bGxfdG9fY2xpZW50IDJuZCAiQiIgJCgoNjQqMykpCisKK3B1bGxfdG9fY2xpZW50IDNyZCAiQSIgJCgoMSozKSkgIyBvbGQgZmFpbHMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2xvbmUgc2hhbGxvdyIgImdpdC1jbG9uZSAtLWRlcHRoIDIgLiBzaGFsbG93IgorCisoY2Qgc2hhbGxvdzsgZ2l0LWNvdW50LW9iamVjdHMgLXYpID4gY291bnQuc2hhbGxvdworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjbG9uZSBzaGFsbG93IG9iamVjdCBjb3VudCIgXAorCSJ0ZXN0IFwiaW4tcGFjazogMThcIiA9IFwiJChncmVwIGluLXBhY2sgY291bnQuc2hhbGxvdylcIiIKKworY291bnRfb3V0cHV0ICgpIHsKKwlzZWQgLWUgJy9eaW4tcGFjazovZCcgLWUgJy9ecGFja3M6L2QnIC1lICcvOiAwJC9kJyAiJDEiCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3cgb2JqZWN0IGNvdW50IChwYXJ0IDIpIiAnCisJdGVzdCAteiAiJChjb3VudF9vdXRwdXQgY291bnQuc2hhbGxvdykiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZzY2sgaW4gc2hhbGxvdyByZXBvIiBcCisJIihjZCBzaGFsbG93OyBnaXQtZnNjayAtLWZ1bGwpIgorCisjdGVzdF9kb25lOyBleGl0CisKK2FkZCBCNjYgJEI2NQorYWRkIEI2NyAkQjY2CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInB1bGwgaW4gc2hhbGxvdyByZXBvIiBcCisJIihjZCBzaGFsbG93OyBnaXQgcHVsbCAuLiBCKSIKKworKGNkIHNoYWxsb3c7IGdpdC1jb3VudC1vYmplY3RzIC12KSA+IGNvdW50LnNoYWxsb3cKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3cgb2JqZWN0IGNvdW50IiBcCisJInRlc3QgXCJjb3VudDogNlwiID0gXCIkKGdyZXAgY291bnQgY291bnQuc2hhbGxvdylcIiIKKworYWRkIEI2OCAkQjY3CithZGQgQjY5ICRCNjgKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZGVlcGVuaW5nIHB1bGwgaW4gc2hhbGxvdyByZXBvIiBcCisJIihjZCBzaGFsbG93OyBnaXQgcHVsbCAtLWRlcHRoIDQgLi4gQikiCisKKyhjZCBzaGFsbG93OyBnaXQtY291bnQtb2JqZWN0cyAtdikgPiBjb3VudC5zaGFsbG93Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjbG9uZSBzaGFsbG93IG9iamVjdCBjb3VudCIgXAorCSJ0ZXN0IFwiY291bnQ6IDEyXCIgPSBcIiQoZ3JlcCBjb3VudCBjb3VudC5zaGFsbG93KVwiIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJkZWVwZW5pbmcgZmV0Y2ggaW4gc2hhbGxvdyByZXBvIiBcCisJIihjZCBzaGFsbG93OyBnaXQgZmV0Y2ggLS1kZXB0aCA0IC4uIEE6QSkiCisKKyhjZCBzaGFsbG93OyBnaXQtY291bnQtb2JqZWN0cyAtdikgPiBjb3VudC5zaGFsbG93Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjbG9uZSBzaGFsbG93IG9iamVjdCBjb3VudCIgXAorCSJ0ZXN0IFwiY291bnQ6IDE4XCIgPSBcIiQoZ3JlcCBjb3VudCBjb3VudC5zaGFsbG93KVwiIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICJwdWxsIGluIHNoYWxsb3cgcmVwbyB3aXRoIG1pc3NpbmcgbWVyZ2UgYmFzZSIgXAorCSIoY2Qgc2hhbGxvdzsgZ2l0IHB1bGwgLS1kZXB0aCA0IC4uIEEpIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MDItcXVpY2tmZXRjaC5zaCBiL3QvdDU1MDItcXVpY2tmZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNDc2MGYyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUwMi1xdWlja2ZldGNoLnNoCkBAIC0wLDAgKzEsODkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IHF1aWNrZmV0Y2ggZnJvbSBsb2NhbCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJdGVzdF90aWNrICYmCisJZWNobyBpY2hpID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwljbnQ9JCggKAorCQlnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAtZSAicy8gKm9iamVjdHMsLiovLyIKKwkpICkgJiYKKwl0ZXN0ICRjbnQgLWVxIDMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmUgd2l0aG91dCBhbHRlcm5hdGUnICcKKworCSgKKwkJbWtkaXIgY2xvbmVkICYmCisJCWNkIGNsb25lZCAmJgorCQlnaXQgaW5pdC1kYiAmJgorCQlnaXQgcmVtb3RlIGFkZCAtZiBvcmlnaW4gLi4KKwkpICYmCisJY250PSQoICgKKwkJY2QgY2xvbmVkICYmCisJCWdpdCBjb3VudC1vYmplY3RzIHwgc2VkIC1lICJzLyAqb2JqZWN0cywuKi8vIgorCSkgKSAmJgorCXRlc3QgJGNudCAtZXEgMworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmdXJ0aGVyIGNvbW1pdHMgaW4gdGhlIG9yaWdpbmFsJyAnCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIG5pID5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBzZWNvbmQgJiYKKworCWNudD0kKCAoCisJCWdpdCBjb3VudC1vYmplY3RzIHwgc2VkIC1lICJzLyAqb2JqZWN0cywuKi8vIgorCSkgKSAmJgorCXRlc3QgJGNudCAtZXEgNgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb3B5IGNvbW1pdCBhbmQgdHJlZSBidXQgbm90IGJsb2IgYnkgaGFuZCcgJworCisJZ2l0IHJldi1saXN0IC0tb2JqZWN0cyBIRUFEIHwKKwlnaXQgcGFjay1vYmplY3RzIC0tc3Rkb3V0IHwKKwkoCisJCWNkIGNsb25lZCAmJgorCQlnaXQgdW5wYWNrLW9iamVjdHMKKwkpICYmCisKKwljbnQ9JCggKAorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IGNvdW50LW9iamVjdHMgfCBzZWQgLWUgInMvICpvYmplY3RzLC4qLy8iCisJKSApICYmCisJdGVzdCAkY250IC1lcSA2CisKKwlibG9iPSQoZ2l0IHJldi1wYXJzZSBIRUFEOmZpbGUgfCBzZWQgLWUgInN8Li58Ji98IikgJiYKKwl0ZXN0IC1mICJjbG9uZWQvLmdpdC9vYmplY3RzLyRibG9iIiAmJgorCXJtIC1mICJjbG9uZWQvLmdpdC9vYmplY3RzLyRibG9iIiAmJgorCisJY250PSQoICgKKwkJY2QgY2xvbmVkICYmCisJCWdpdCBjb3VudC1vYmplY3RzIHwgc2VkIC1lICJzLyAqb2JqZWN0cywuKi8vIgorCSkgKSAmJgorCXRlc3QgJGNudCAtZXEgNQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3F1aWNrZmV0Y2ggc2hvdWxkIG5vdCBsZWF2ZSBhIGNvcnJ1cHRlZCByZXBvc2l0b3J5JyAnCisKKwkoCisJCWNkIGNsb25lZCAmJgorCQlnaXQgZmV0Y2gKKwkpICYmCisKKwljbnQ9JCggKAorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IGNvdW50LW9iamVjdHMgfCBzZWQgLWUgInMvICpvYmplY3RzLC4qLy8iCisJKSApICYmCisJdGVzdCAkY250IC1lcSA2CisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTEwLWZldGNoLnNoIGIvdC90NTUxMC1mZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjYwMTdlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxMC1mZXRjaC5zaApAQCAtMCwwICsxLDE0OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwNiwgSnVuaW8gQyBIYW1hbm8uCisKK3Rlc3RfZGVzY3JpcHRpb249J1BlciBicmFuY2ggY29uZmlnIHZhcmlhYmxlcyBhZmZlY3RzICJnaXQgZmV0Y2giLgorCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitEPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gPmZpbGUgb3JpZ2luYWwgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIG9yaWdpbmFsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjbG9uZSBhbmQgc2V0dXAgY2hpbGQgcmVwb3MiICcKKwlnaXQgY2xvbmUgLiBvbmUgJiYKKwljZCBvbmUgJiYKKwllY2hvID5maWxlIHVwZGF0ZWQgYnkgb25lICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAidXBkYXRlZCBieSBvbmUiICYmCisJY2QgLi4gJiYKKwlnaXQgY2xvbmUgLiB0d28gJiYKKwljZCB0d28gJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIucmVtb3RlIG9uZSAmJgorCWdpdCBjb25maWcgcmVtb3RlLm9uZS51cmwgLi4vb25lLy5naXQvICYmCisJZ2l0IGNvbmZpZyByZW1vdGUub25lLmZldGNoIHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvb25lICYmCisJY2QgLi4gJiYKKwlnaXQgY2xvbmUgLiB0aHJlZSAmJgorCWNkIHRocmVlICYmCisJZ2l0IGNvbmZpZyBicmFuY2gubWFzdGVyLnJlbW90ZSB0d28gJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIubWVyZ2UgcmVmcy9oZWFkcy9vbmUgJiYKKwlta2RpciAtcCAuZ2l0L3JlbW90ZXMgJiYKKwl7CisJCWVjaG8gIlVSTDogLi4vdHdvLy5naXQvIgorCQllY2hvICJQdWxsOiByZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL3R3byIKKwkJZWNobyAiUHVsbDogcmVmcy9oZWFkcy9vbmU6cmVmcy9oZWFkcy9vbmUiCisJfSA+LmdpdC9yZW1vdGVzL3R3byAmJgorCWNkIC4uICYmCisJZ2l0IGNsb25lIC4gYnVuZGxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZldGNoIHRlc3QiICcKKwljZCAiJEQiICYmCisJZWNobyA+ZmlsZSB1cGRhdGVkIGJ5IG9yaWdpbiAmJgorCWdpdCBjb21taXQgLWEgLW0gInVwZGF0ZWQgYnkgb3JpZ2luIiAmJgorCWNkIHR3byAmJgorCWdpdCBmZXRjaCAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL29uZSAmJgorCW1pbmU9YGdpdCByZXYtcGFyc2UgcmVmcy9oZWFkcy9vbmVgICYmCisJaGlzPWBjZCAuLi9vbmUgJiYgZ2l0IHJldi1wYXJzZSByZWZzL2hlYWRzL21hc3RlcmAgJiYKKwl0ZXN0ICJ6JG1pbmUiID0gInokaGlzIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmZXRjaCB0ZXN0IGZvci1tZXJnZSIgJworCWNkICIkRCIgJiYKKwljZCB0aHJlZSAmJgorCWdpdCBmZXRjaCAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL3R3byAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL29uZSAmJgorCW1hc3Rlcl9pbl90d289YGNkIC4uL3R3byAmJiBnaXQgcmV2LXBhcnNlIG1hc3RlcmAgJiYKKwlvbmVfaW5fdHdvPWBjZCAuLi90d28gJiYgZ2l0IHJldi1wYXJzZSBvbmVgICYmCisJeworCQllY2hvICIkbWFzdGVyX2luX3R3bwlub3QtZm9yLW1lcmdlIgorCQllY2hvICIkb25lX2luX3R3bwkiCisJfSA+ZXhwZWN0ZWQgJiYKKwljdXQgLWYgLTIgLmdpdC9GRVRDSF9IRUFEID5hY3R1YWwgJiYKKwlkaWZmIGV4cGVjdGVkIGFjdHVhbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggZm9sbG93aW5nIHRhZ3MnICcKKworCWNkICIkRCIgJiYKKwlnaXQgdGFnIC1hIC1tICdhbm5vdGF0ZWQnIGFubm8gSEVBRCAmJgorCWdpdCB0YWcgbGlnaHQgSEVBRCAmJgorCisJbWtkaXIgZm91ciAmJgorCWNkIGZvdXIgJiYKKwlnaXQgaW5pdCAmJgorCisJZ2l0IGZldGNoIC4uIDp0cmFjayAmJgorCWdpdCBzaG93LXJlZiAtLXZlcmlmeSByZWZzL3RhZ3MvYW5ubyAmJgorCWdpdCBzaG93LXJlZiAtLXZlcmlmeSByZWZzL3RhZ3MvbGlnaHQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGUgYnVuZGxlIDEnICcKKwljZCAiJEQiICYmCisJZWNobyA+ZmlsZSB1cGRhdGVkIGFnYWluIGJ5IG9yaWdpbiAmJgorCWdpdCBjb21taXQgLWEgLW0gInRpcCIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGUxIG1hc3Rlcl4uLm1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdoZWFkZXIgb2YgYnVuZGxlIGxvb2tzIHJpZ2h0JyAnCisJaGVhZCAtbiAxICIkRCIvYnVuZGxlMSB8IGdyZXAgIl4jIiAmJgorCWhlYWQgLW4gMiAiJEQiL2J1bmRsZTEgfCBncmVwICJeLVswLTlhLWZdXHs0MFx9ICIgJiYKKwloZWFkIC1uIDMgIiREIi9idW5kbGUxIHwgZ3JlcCAiXlswLTlhLWZdXHs0MFx9ICIgJiYKKwloZWFkIC1uIDQgIiREIi9idW5kbGUxIHwgZ3JlcCAiXiQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NyZWF0ZSBidW5kbGUgMicgJworCWNkICIkRCIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGUyIG1hc3Rlcn4yLi5tYXN0ZXIKKycKKwordGVzdF9leHBlY3RfZmFpbHVyZSAndW5idW5kbGUgMScgJworCWNkICIkRC9idW5kbGUiICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNvbWUtYnJhbmNoICYmCisJZ2l0IGZldGNoICIkRC9idW5kbGUxIiBtYXN0ZXI6bWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1bmRsZSAxIGhhcyBvbmx5IDMgZmlsZXMgJyAnCisJY2QgIiREIiAmJgorCSgKKwkJd2hpbGUgcmVhZCB4ICYmIHRlc3QgLW4gIiR4IgorCQlkbworCQkJOjsKKwkJZG9uZQorCQljYXQKKwkpIDxidW5kbGUxID5idW5kbGUucGFjayAmJgorCWdpdCBpbmRleC1wYWNrIGJ1bmRsZS5wYWNrICYmCisJdmVyaWZ5PSQoZ2l0IHZlcmlmeS1wYWNrIC12IGJ1bmRsZS5wYWNrKSAmJgorCXRlc3QgNCA9ICQoZWNobyAiJHZlcmlmeSIgfCB3YyAtbCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5idW5kbGUgMicgJworCWNkICIkRC9idW5kbGUiICYmCisJZ2l0IGZldGNoIC4uL2J1bmRsZTIgbWFzdGVyOm1hc3RlciAmJgorCXRlc3QgInRpcCIgPSAiJChnaXQgbG9nIC0xIC0tcHJldHR5PW9uZWxpbmUgbWFzdGVyIHwgY3V0IC1iNDItKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnVuZGxlIGRvZXMgbm90IHByZXJlcXVpc2l0ZSBvYmplY3RzJyAnCisJY2QgIiREIiAmJgorCXRvdWNoIGZpbGUyICYmCisJZ2l0IGFkZCBmaWxlMiAmJgorCWdpdCBjb21taXQgLW0gYWRkLmZpbGUyIGZpbGUyICYmCisJZ2l0IGJ1bmRsZSBjcmVhdGUgYnVuZGxlMyAtMSBIRUFEICYmCisJKAorCQl3aGlsZSByZWFkIHggJiYgdGVzdCAtbiAiJHgiCisJCWRvCisJCQk6OworCQlkb25lCisJCWNhdAorCSkgPGJ1bmRsZTMgPmJ1bmRsZS5wYWNrICYmCisJZ2l0IGluZGV4LXBhY2sgYnVuZGxlLnBhY2sgJiYKKwl0ZXN0IDQgPSAkKGdpdCB2ZXJpZnktcGFjayAtdiBidW5kbGUucGFjayB8IHdjIC1sKQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MTUtZmV0Y2gtbWVyZ2UtbG9naWMuc2ggYi90L3Q1NTE1LWZldGNoLW1lcmdlLWxvZ2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjOWNjNjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1LWZldGNoLW1lcmdlLWxvZ2ljLnNoCkBAIC0wLDAgKzEsMTYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IFNhbnRpIELDqWphciwgYmFzZWQgb24gdDQwMTMgYnkgSnVuaW8gQyBIYW1hbm8KKyMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nTWVyZ2UgbG9naWMgaW4gZmV0Y2gnCisKKy4gLi90ZXN0LWxpYi5zaAorCitMRj0nCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowMDowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDA6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCWVjaG8gPmZpbGUgb3JpZ2luYWwgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIE9uZSAmJgorCWdpdCB0YWcgdGFnLW9uZSAmJgorCWdpdCB0YWcgdGFnLW9uZS10cmVlIEhFQURee3RyZWV9ICYmCisJZ2l0IGJyYW5jaCBvbmUgJiYKKworCWVjaG8gdHdvID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIFR3byAmJgorCWdpdCB0YWcgLWEgLW0gIlRhZyBUd28iIHRhZy10d28gJiYKKwlnaXQgYnJhbmNoIHR3byAmJgorCisJZWNobyB0aHJlZSA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBUaHJlZSAmJgorCWdpdCB0YWcgLWEgLW0gIlRhZyBUaHJlZSIgdGFnLXRocmVlICYmCisJZ2l0IHRhZyAtYSAtbSAiVGFnIFRocmVlIGZpbGUiIHRhZy10aHJlZS1maWxlIEhFQURee3RyZWV9OmZpbGUgJiYKKwlnaXQgYnJhbmNoIHRocmVlICYmCisKKwllY2hvIG1hc3RlciA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBNYXN0ZXIgJiYKKwlnaXQgdGFnIC1hIC1tICJUYWcgTWFzdGVyIiB0YWctbWFzdGVyICYmCisKKwlnaXQgY2hlY2tvdXQgdGhyZWUgJiYKKworCWdpdCBjbG9uZSAuIGNsb25lZCAmJgorCWNkIGNsb25lZCAmJgorCWdpdCBjb25maWcgcmVtb3RlLm9yaWdpbi51cmwgLi4vLmdpdC8gJiYKKworCWdpdCBjb25maWcgcmVtb3RlLmNvbmZpZy1leHBsaWNpdC51cmwgLi4vLmdpdC8gJiYKKwlnaXQgY29uZmlnIHJlbW90ZS5jb25maWctZXhwbGljaXQuZmV0Y2ggcmVmcy9oZWFkcy9tYXN0ZXI6cmVtb3Rlcy9yZW0vbWFzdGVyICYmCisJZ2l0IGNvbmZpZyAtLWFkZCByZW1vdGUuY29uZmlnLWV4cGxpY2l0LmZldGNoIHJlZnMvaGVhZHMvb25lOnJlbW90ZXMvcmVtL29uZSAmJgorCWdpdCBjb25maWcgLS1hZGQgcmVtb3RlLmNvbmZpZy1leHBsaWNpdC5mZXRjaCB0d286cmVtb3Rlcy9yZW0vdHdvICYmCisJZ2l0IGNvbmZpZyAtLWFkZCByZW1vdGUuY29uZmlnLWV4cGxpY2l0LmZldGNoIHJlZnMvaGVhZHMvdGhyZWU6cmVtb3Rlcy9yZW0vdGhyZWUgJiYKKwlyZW1vdGVzPSJjb25maWctZXhwbGljaXQiICYmCisKKwlnaXQgY29uZmlnIHJlbW90ZS5jb25maWctZ2xvYi51cmwgLi4vLmdpdC8gJiYKKwlnaXQgY29uZmlnIHJlbW90ZS5jb25maWctZ2xvYi5mZXRjaCByZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL3JlbS8qICYmCisJcmVtb3Rlcz0iJHJlbW90ZXMgY29uZmlnLWdsb2IiICYmCisKKwlta2RpciAtcCAuZ2l0L3JlbW90ZXMgJiYKKwl7CisJCWVjaG8gIlVSTDogLi4vLmdpdC8iCisJCWVjaG8gIlB1bGw6IHJlZnMvaGVhZHMvbWFzdGVyOnJlbW90ZXMvcmVtL21hc3RlciIKKwkJZWNobyAiUHVsbDogcmVmcy9oZWFkcy9vbmU6cmVtb3Rlcy9yZW0vb25lIgorCQllY2hvICJQdWxsOiB0d286cmVtb3Rlcy9yZW0vdHdvIgorCQllY2hvICJQdWxsOiByZWZzL2hlYWRzL3RocmVlOnJlbW90ZXMvcmVtL3RocmVlIgorCX0gPi5naXQvcmVtb3Rlcy9yZW1vdGUtZXhwbGljaXQgJiYKKwlyZW1vdGVzPSIkcmVtb3RlcyByZW1vdGUtZXhwbGljaXQiICYmCisKKwl7CisJCWVjaG8gIlVSTDogLi4vLmdpdC8iCisJCWVjaG8gIlB1bGw6IHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvcmVtLyoiCisJfSA+LmdpdC9yZW1vdGVzL3JlbW90ZS1nbG9iICYmCisJcmVtb3Rlcz0iJHJlbW90ZXMgcmVtb3RlLWdsb2IiICYmCisKKwlta2RpciAtcCAuZ2l0L2JyYW5jaGVzICYmCisJZWNobyAiLi4vLmdpdCIgPiAuZ2l0L2JyYW5jaGVzL2JyYW5jaGVzLWRlZmF1bHQgJiYKKwlyZW1vdGVzPSIkcmVtb3RlcyBicmFuY2hlcy1kZWZhdWx0IiAmJgorCisJZWNobyAiLi4vLmdpdCNvbmUiID4gLmdpdC9icmFuY2hlcy9icmFuY2hlcy1vbmUgJiYKKwlyZW1vdGVzPSIkcmVtb3RlcyBicmFuY2hlcy1vbmUiICYmCisKKwlmb3IgcmVtb3RlIGluICRyZW1vdGVzIDsgZG8KKwkJZ2l0IGNvbmZpZyBicmFuY2guYnItJHJlbW90ZS5yZW1vdGUgJHJlbW90ZSAmJgorCQlnaXQgY29uZmlnIGJyYW5jaC5ici0kcmVtb3RlLW1lcmdlLnJlbW90ZSAkcmVtb3RlICYmCisJCWdpdCBjb25maWcgYnJhbmNoLmJyLSRyZW1vdGUtbWVyZ2UubWVyZ2UgcmVmcy9oZWFkcy90aHJlZSAmJgorCQlnaXQgY29uZmlnIGJyYW5jaC5ici0kcmVtb3RlLW9jdG9wdXMucmVtb3RlICRyZW1vdGUgJiYKKwkJZ2l0IGNvbmZpZyBicmFuY2guYnItJHJlbW90ZS1vY3RvcHVzLm1lcmdlIHJlZnMvaGVhZHMvb25lICYmCisJCWdpdCBjb25maWcgLS1hZGQgYnJhbmNoLmJyLSRyZW1vdGUtb2N0b3B1cy5tZXJnZSB0d28gJiYKKwkJZ2l0IGNvbmZpZyAtLWFkZCBicmFuY2guYnItJHJlbW90ZS1vY3RvcHVzLm1lcmdlIHJlbW90ZXMvcmVtL3RocmVlCisJZG9uZQorJworCisjIE1lcmdlIGxvZ2ljIGRlcGVuZHMgb24gYnJhbmNoIHByb3BlcnRpZXMgYW5kIFB1bGw6IG9yIC5mZXRjaCBsaW5lcworZm9yIHJlbW90ZSBpbiAkcmVtb3RlcyA7IGRvCisgICAgZm9yIGJyYW5jaCBpbiAiIiAiLW1lcmdlIiAiLW9jdG9wdXMiIDsgZG8KK2NhdCA8PEVPRgorYnItJHJlbW90ZSRicmFuY2gKK2JyLSRyZW1vdGUkYnJhbmNoICRyZW1vdGUKK0VPRgorICAgIGRvbmUKK2RvbmUgPiB0ZXN0cworCisjIE1lcmdlIGxvZ2ljIGRvZXMgbm90IGRlcGVuZCBvbiBicmFuY2ggcHJvcGVydGllcywKKyMgYnV0IGRvZXMgZGVwZW5kIG9uIFB1bGw6IG9yIGZldGNoIGxpbmVzLgorIyBVc2UgdHdvIGJyYW5jaGVzIGNvbXBsZXRlbHkgdW5yZWxhdGVkIGZyb20gdGhlIGFyZ3VtZW50cywKKyMgdGhlIGNsb25lIGRlZmF1bHQgYW5kIG9uZSB3aXRob3V0IGJyYW5jaCBwcm9wZXJ0aWVzCitmb3IgYnJhbmNoIGluIG1hc3RlciBici11bmNvbmZpZyA7IGRvCisgICAgZWNobyAkYnJhbmNoCisgICAgZm9yIHJlbW90ZSBpbiAkcmVtb3RlcyA7IGRvCisJZWNobyAkYnJhbmNoICRyZW1vdGUKKyAgICBkb25lCitkb25lID4+IHRlc3RzCisKKyMgTWVyZ2UgbG9naWMgZG9lcyBub3QgZGVwZW5kIG9uIGJyYW5jaCBwcm9wZXJ0aWVzCisjIG5laXRoZXIgaW4gdGhlIFB1bGw6IG9yIC5mZXRjaCBjb25maWcKK2ZvciBicmFuY2ggaW4gbWFzdGVyIGJyLXVuY29uZmlnIDsgZG8KKyAgICBjYXQgPDxFT0YKKyRicmFuY2ggLi4vLmdpdAorJGJyYW5jaCAuLi8uZ2l0IG9uZQorJGJyYW5jaCAuLi8uZ2l0IG9uZSB0d28KKyRicmFuY2ggLS10YWdzIC4uLy5naXQKKyRicmFuY2ggLi4vLmdpdCB0YWcgdGFnLW9uZSB0YWcgdGFnLXRocmVlCiskYnJhbmNoIC4uLy5naXQgdGFnIHRhZy1vbmUtdHJlZSB0YWcgdGFnLXRocmVlLWZpbGUKKyRicmFuY2ggLi4vLmdpdCBvbmUgdGFnIHRhZy1vbmUgdGFnIHRhZy10aHJlZS1maWxlCitFT0YKK2RvbmUgPj4gdGVzdHMKKword2hpbGUgcmVhZCBjbWQKK2RvCisJY2FzZSAiJGNtZCIgaW4KKwknJyB8ICcjJyopIGNvbnRpbnVlIDs7CisJZXNhYworCXRlc3Q9YGVjaG8gIiRjbWQiIHwgc2VkIC1lICdzfFsvIF1bLyBdKnxffGcnYAorCWNudD1gZXhwciAkdGVzdF9jb3VudCArIDFgCisJcGZ4PWBwcmludGYgIiUwNGQiICRjbnRgCisJZXhwZWN0PSIuLi8uLi90NTUxNS9mZXRjaC4kdGVzdCIKKwlhY3R1YWw9IiRwZngtZmV0Y2guJHRlc3QiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkY21kIiAnCisJCXsKKwkJCWVjaG8gIiMgJGNtZCIKKwkJCXNldCB4ICRjbWQ7IHNoaWZ0CisJCQlnaXQgc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy8kMSA7IHNoaWZ0CisJCQlybSAtZiAuZ2l0L0ZFVENIX0hFQUQKKwkJCXJtIC1mIC5naXQvcmVmcy9oZWFkcy8qCisJCQlybSAtZiAuZ2l0L3JlZnMvcmVtb3Rlcy9yZW0vKgorCQkJcm0gLWYgLmdpdC9yZWZzL3RhZ3MvKgorCQkJZ2l0IGZldGNoICIkQCIgPi9kZXYvbnVsbAorCQkJY2F0IC5naXQvRkVUQ0hfSEVBRAorCQl9ID4iJGFjdHVhbCIgJiYKKwkJaWYgdGVzdCAtZiAiJGV4cGVjdCIKKwkJdGhlbgorCQkJZ2l0IGRpZmYgLXUgIiRleHBlY3QiICIkYWN0dWFsIiAmJgorCQkJcm0gLWYgIiRhY3R1YWwiCisJCWVsc2UKKwkJCSMgdGhpcyBpcyB0byBoZWxwIGRldmVsb3BpbmcgbmV3IHRlc3RzLgorCQkJY3AgIiRhY3R1YWwiICIkZXhwZWN0IgorCQkJZmFsc2UKKwkJZmkKKwknCitkb25lIDwgdGVzdHMKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwNDE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDggQEAKKyMgYnItYnJhbmNoZXMtZGVmYXVsdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZgkJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2UgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2NWYzMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZQpAQCAtMCwwICsxLDggQEAKKyMgYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZQorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZgkJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2VfYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZV9icmFuY2hlcy1kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNWZhOTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2VfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDggQEAKKyMgYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZSBicmFuY2hlcy1kZWZhdWx0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4Mzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzCkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXMKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXNfYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzX2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzN2NkNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzX2JyYW5jaGVzLWRlZmF1bHQKQEAgLTAsMCArMSw4IEBACisjIGJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1cyBicmFuY2hlcy1kZWZhdWx0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdF9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0X2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyYmYzYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdF9icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0IGJyYW5jaGVzLWRlZmF1bHQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFjOGQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUKQEAgLTAsMCArMSw4IEBACisjIGJyLWJyYW5jaGVzLW9uZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1tZXJnZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGU3N2UKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1tZXJnZQpAQCAtMCwwICsxLDggQEAKKyMgYnItYnJhbmNoZXMtb25lLW1lcmdlCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUwNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUtbWVyZ2VfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1vbmUtbWVyZ2UgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW9jdG9wdXMgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzCkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1vbmUtb2N0b3B1cworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW9jdG9wdXNfYnJhbmNoZXMtb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjE4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzX2JyYW5jaGVzLW9uZQpAQCAtMCwwICsxLDggQEAKKyMgYnItYnJhbmNoZXMtb25lLW9jdG9wdXMgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFmYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmVfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1vbmUgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmYTljOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtbWVyZ2UgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFhNzIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtbWVyZ2UKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZXhwbGljaXQtbWVyZ2UKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZV9jb25maWctZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZV9jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmNjg5MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0LW1lcmdlX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZSBjb25maWctZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDExZGZjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtb2N0b3B1cwpAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzX2NvbmZpZy1leHBsaWNpdCBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0LW9jdG9wdXNfY29uZmlnLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWQ1MWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzIGNvbmZpZy1leHBsaWNpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdF9jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZXhwbGljaXQgY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZWMyZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iLW1lcmdlIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThmNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZQpAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1nbG9iLW1lcmdlCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZV9jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2ItbWVyZ2VfY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxN2JlZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2ItbWVyZ2VfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZ2xvYi1tZXJnZSBjb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1cyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWUyMTNlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1vY3RvcHVzCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWdsb2Itb2N0b3B1cworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1c19jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1c19jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGJkMGVjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1vY3RvcHVzX2NvbmZpZy1nbG9iCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWdsb2Itb2N0b3B1cyBjb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2JfY29uZmlnLWdsb2IgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iX2NvbmZpZy1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzIwZjkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iX2NvbmZpZy1nbG9iCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWdsb2IgY29uZmlnLWdsb2IKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUzNGQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZSBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDY0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZQpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZQorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW1lcmdlX3JlbW90ZS1leHBsaWNpdCBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW1lcmdlX3JlbW90ZS1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzJhMzdlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2VfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWV4cGxpY2l0LW1lcmdlIHJlbW90ZS1leHBsaWNpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXMgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXMKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXNfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1c19yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NzUzMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXNfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXMgcmVtb3RlLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdF9yZW1vdGUtZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdF9yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmYWU1NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0X3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1leHBsaWNpdCByZW1vdGUtZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGU2YWQzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2ItbWVyZ2UgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzYyZTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW1lcmdlCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWdsb2ItbWVyZ2UKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW1lcmdlX3JlbW90ZS1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1tZXJnZV9yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVhYmVjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1tZXJnZV9yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1nbG9iLW1lcmdlIHJlbW90ZS1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTU0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW9jdG9wdXMKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYi1vY3RvcHVzCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzX3JlbW90ZS1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzX3JlbW90ZS1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTM0MzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW9jdG9wdXNfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYi1vY3RvcHVzIHJlbW90ZS1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYl9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2JfcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2ZGJjOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2JfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYiByZW1vdGUtZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNlNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZwpAQCAtMCwwICsxLDExIEBACisjIGJyLXVuY29uZmlnCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLS10YWdzXy4uXy5naXQgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy0tdGFnc18uLl8uZ2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNThjODAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy0tdGFnc18uLl8uZ2l0CkBAIC0wLDAgKzEsNyBAQAorIyBici11bmNvbmZpZyAtLXRhZ3MgLi4vLmdpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXQgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0YmIxZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdApAQCAtMCwwICsxLDIgQEAKKyMgYnItdW5jb25maWcgLi4vLmdpdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWViNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZQpAQCAtMCwwICsxLDIgQEAKKyMgYnItdW5jb25maWcgLi4vLmdpdCBvbmUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyYmFiMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlCkBAIC0wLDAgKzEsOCBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0IG9uZSB0YWcgdGFnLW9uZSB0YWcgdGFnLXRocmVlLWZpbGUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCXRhZyAndGFnLW9uZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lX3R3byBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdHdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMWJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lX3R3bwpAQCAtMCwwICsxLDMgQEAKKyMgYnItdW5jb25maWcgLi4vLmdpdCBvbmUgdHdvCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfdGFnX3RhZy1vbmUtdHJlZV90YWdfdGFnLXRocmVlLWZpbGUgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfdGFnX3RhZy1vbmUtdHJlZV90YWdfdGFnLXRocmVlLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkZTQxMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgYnItdW5jb25maWcgLi4vLmdpdCB0YWcgdGFnLW9uZS10cmVlIHRhZyB0YWctdGhyZWUtZmlsZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZSBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTIzMzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZQpAQCAtMCwwICsxLDcgQEAKKyMgYnItdW5jb25maWcgLi4vLmdpdCB0YWcgdGFnLW9uZSB0YWcgdGFnLXRocmVlCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJdGFnICd0YWctdGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2JyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MDQxZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDggQEAKKyMgYnItdW5jb25maWcgYnJhbmNoZXMtZGVmYXVsdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZgkJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGNkZTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2JyYW5jaGVzLW9uZQpAQCAtMCwwICsxLDggQEAKKyMgYnItdW5jb25maWcgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhMjgzZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfY29uZmlnLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItdW5jb25maWcgY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1NTZjNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici11bmNvbmZpZyBjb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX3JlbW90ZS1leHBsaWNpdCBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLXVuY29uZmlnIHJlbW90ZS1leHBsaWNpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZgkJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWdsb2IgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX3JlbW90ZS1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTY1YzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX3JlbW90ZS1nbG9iCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItdW5jb25maWcgcmVtb3RlLWdsb2IKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXIgYi90L3Q1NTE1L2ZldGNoLm1hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXIKQEAgLTAsMCArMSwxMSBAQAorIyBtYXN0ZXIKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLS10YWdzXy4uXy5naXQgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8tLXRhZ3NfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU5OTUwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLS10YWdzXy4uXy5naXQKQEAgLTAsMCArMSw3IEBACisjIG1hc3RlciAtLXRhZ3MgLi4vLmdpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0IGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQxYWFkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdApAQCAtMCwwICsxLDIgQEAKKyMgbWFzdGVyIC4uLy5naXQKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCS4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF9vbmUgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRlZGRiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF9vbmUKQEAgLTAsMCArMSwyIEBACisjIG1hc3RlciAuLi8uZ2l0IG9uZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODY4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUKQEAgLTAsMCArMSw4IEBACisjIG1hc3RlciAuLi8uZ2l0IG9uZSB0YWcgdGFnLW9uZSB0YWcgdGFnLXRocmVlLWZpbGUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCXRhZyAndGFnLW9uZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZV90d28gYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZV90d28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlYzU3OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfb25lX3R3bwpAQCAtMCwwICsxLDMgQEAKKyMgbWFzdGVyIC4uLy5naXQgb25lIHR3bworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZSBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmUtdHJlZV90YWdfdGFnLXRocmVlLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMzNlZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmUtdHJlZV90YWdfdGFnLXRocmVlLWZpbGUKQEAgLTAsMCArMSw3IEBACisjIG1hc3RlciAuLi8uZ2l0IHRhZyB0YWctb25lLXRyZWUgdGFnIHRhZy10aHJlZS1maWxlCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZSBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIxOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCkBAIC0wLDAgKzEsNyBAQAorIyBtYXN0ZXIgLi4vLmdpdCB0YWcgdGFnLW9uZSB0YWcgdGFnLXRocmVlCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJdGFnICd0YWctdGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkNmQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDggQEAKKyMgbWFzdGVyIGJyYW5jaGVzLWRlZmF1bHQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfYnJhbmNoZXMtb25lIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfYnJhbmNoZXMtb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOWJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1vbmUKQEAgLTAsMCArMSw4IEBACisjIG1hc3RlciBicmFuY2hlcy1vbmUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfY29uZmlnLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTk3YzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBtYXN0ZXIgY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfY29uZmlnLWdsb2IgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA3MjZmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBtYXN0ZXIgY29uZmlnLWdsb2IKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTFjYTgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBtYXN0ZXIgcmVtb3RlLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfcmVtb3RlLWdsb2IgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRlOGRiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBtYXN0ZXIgcmVtb3RlLWdsb2IKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUyMC1wdWxsLnNoIGIvdC90NTUyMC1wdWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0MzIxMmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTIwLXB1bGwuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3B1bGxpbmcgaW50byB2b2lkJworCisuIC4vdGVzdC1saWIuc2gKKworRD1gcHdkYAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCWVjaG8gZmlsZSA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gb3JpZ2luYWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsaW5nIGludG8gdm9pZCcgJworCW1rZGlyIGNsb25lZCAmJgorCWNkIGNsb25lZCAmJgorCWdpdCBpbml0ICYmCisJZ2l0IHB1bGwgLi4KKycKKworY2QgIiREIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja2luZyB0aGUgcmVzdWx0cycgJworCXRlc3QgLWYgZmlsZSAmJgorCXRlc3QgLWYgY2xvbmVkL2ZpbGUgJiYKKwlkaWZmIGZpbGUgY2xvbmVkL2ZpbGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCAuIGFzIGEgcmVtb3RlJyAnCisKKwlnaXQgYnJhbmNoIGNvcHkgbWFzdGVyICYmCisJZ2l0IGNvbmZpZyBicmFuY2guY29weS5yZW1vdGUgLiAmJgorCWdpdCBjb25maWcgYnJhbmNoLmNvcHkubWVyZ2UgcmVmcy9oZWFkcy9tYXN0ZXIgJiYKKwllY2hvIHVwZGF0ZWQgPmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIHVwZGF0ZWQgJiYKKwlnaXQgY2hlY2tvdXQgY29weSAmJgorCXRlc3QgYGNhdCBmaWxlYCA9IGZpbGUgJiYKKwlnaXQgcHVsbCAmJgorCXRlc3QgYGNhdCBmaWxlYCA9IHVwZGF0ZWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhlIGRlZmF1bHQgcmVtb3RlIC4gc2hvdWxkIG5vdCBicmVhayBleHBsaWNpdCBwdWxsJyAnCisJZ2l0IGNoZWNrb3V0IC1iIHNlY29uZCBtYXN0ZXJeICYmCisJZWNobyBtb2RpZmllZCA+ZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gbW9kaWZpZWQgJiYKKwlnaXQgY2hlY2tvdXQgY29weSAmJgorCWdpdCByZXNldCAtLWhhcmQgSEVBRF4gJiYKKwl0ZXN0IGBjYXQgZmlsZWAgPSBmaWxlICYmCisJZ2l0IHB1bGwgLiBzZWNvbmQgJiYKKwl0ZXN0IGBjYXQgZmlsZWAgPSBtb2RpZmllZAorJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NTYwMC1jbG9uZS1mYWlsLWNsZWFudXAuc2ggYi90L3Q1NjAwLWNsb25lLWZhaWwtY2xlYW51cC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNzc2YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTYwMC1jbG9uZS1mYWlsLWNsZWFudXAuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBDYXJsIEQuIFdvcnRoIDxjd29ydGhAY3dvcnRoLm9yZz4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBnaXQtY2xvbmUgdG8gY2xlYW51cCBhZnRlciBmYWlsdXJlCisKK1RoaXMgdGVzdCBjb3ZlcnMgdGhlIGZhY3QgdGhhdCBpZiBnaXQtY2xvbmUgZmFpbHMsIGl0IHNob3VsZCByZW1vdmUKK3RoZSBkaXJlY3RvcnkgaXQgY3JlYXRlZCwgdG8gYXZvaWQgdGhlIHVzZXIgaGF2aW5nIHRvIG1hbnVhbGx5CityZW1vdmUgdGhlIGRpcmVjdG9yeSBiZWZvcmUgYXR0ZW1wdGluZyBhIGNsb25lIGFnYWluLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjbG9uZSBvZiBub24tZXhpc3RlbnQgc291cmNlIHNob3VsZCBmYWlsJyBcCisgICAgJ2dpdC1jbG9uZSBmb28gYmFyJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZmFpbGVkIGNsb25lIHNob3VsZCBub3QgbGVhdmUgYSBkaXJlY3RvcnknIFwKKyAgICAnY2QgYmFyJworCisjIE5lZWQgYSByZXBvIHRvIGNsb25lCit0ZXN0X2NyZWF0ZV9yZXBvIGZvbworCisjIGNsb25lIGRvZXNuJ3QgbGlrZSBpdCBpZiB0aGVyZSBpcyBubyBIRUFELiBJcyB0aGF0IGEgYnVnPworKGNkIGZvbyAmJiB0b3VjaCBmaWxlICYmIGdpdCBhZGQgZmlsZSAmJiBnaXQgY29tbWl0IC1tICdhZGQgZmlsZScgPi9kZXYvbnVsbCAyPiYxKQorCisjIHNvdXJjZSByZXBvc2l0b3J5IGdpdmVuIHRvIGdpdC1jbG9uZSBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlCisjIGN1cnJlbnQgcGF0aCBub3QgdG8gdGhlIHRhcmdldCBkaXIKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjbG9uZSBvZiBub24tZXhpc3RlbnQgKHJlbGF0aXZlIHRvICRQV0QpIHNvdXJjZSBzaG91bGQgZmFpbCcgXAorICAgICdnaXQtY2xvbmUgLi4vZm9vIGJheicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2Nsb25lIHNob3VsZCB3b3JrIG5vdyB0aGF0IHNvdXJjZSBleGlzdHMnIFwKKyAgICAnZ2l0LWNsb25lIGZvbyBiYXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzdWNjZXNzZnVsIGNsb25lIG11c3QgbGVhdmUgdGhlIGRpcmVjdG9yeScgXAorICAgICdjZCBiYXInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTcwMC1jbG9uZS1yZWZlcmVuY2Uuc2ggYi90L3Q1NzAwLWNsb25lLXJlZmVyZW5jZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDQzMjUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTcwMC1jbG9uZS1yZWZlcmVuY2Uuc2gKQEAgLTAsMCArMSwxMTYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgTWFydGluIFdhaXR6IDx0YWxpQGFkbWluZ2lsZGUub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGNsb25lIC0tcmVmZXJlbmNlJworLiAuL3Rlc3QtbGliLnNoCisKK2Jhc2VfZGlyPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmluZyBmaXJzdCByZXBvc2l0b3J5JyBcCisndGVzdF9jcmVhdGVfcmVwbyBBICYmIGNkIEEgJiYKK2VjaG8gZmlyc3QgPiBmaWxlMSAmJgorZ2l0IGFkZCBmaWxlMSAmJgorZ2l0IGNvbW1pdCAtbSBpbml0aWFsJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgc2Vjb25kIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgQSBCICYmIGNkIEIgJiYKK2VjaG8gc2Vjb25kID4gZmlsZTIgJiYKK2dpdCBhZGQgZmlsZTIgJiYKK2dpdCBjb21taXQgLW0gYWRkaXRpb24gJiYKK2dpdCByZXBhY2sgLWEgLWQgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmluZyB3aXRoIHJlZmVyZW5jZSAoLWwgLXMpJyBcCisnZ2l0IGNsb25lIC1sIC1zIC0tcmVmZXJlbmNlIEIgQSBDJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleGlzdGVuY2Ugb2YgaW5mby9hbHRlcm5hdGVzJyBcCisndGVzdCBgd2MgLWwgPEMvLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlc2AgPSAyJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsaW5nIGZyb20gcmVmZXJlbmNlJyBcCisnY2QgQyAmJgorZ2l0IHB1bGwgLi4vQicKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhhdCByZWZlcmVuY2UgZ2V0cyB1c2VkJyBcCisnY2QgQyAmJgorZWNobyAiMCBvYmplY3RzLCAwIGtpbG9ieXRlcyIgPiBleHBlY3RlZCAmJgorZ2l0IGNvdW50LW9iamVjdHMgPiBjdXJyZW50ICYmCitkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nsb25pbmcgd2l0aCByZWZlcmVuY2UgKG5vIC1sIC1zKScgXAorJ2dpdCBjbG9uZSAtLXJlZmVyZW5jZSBCIEEgRCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXhpc3RlbmNlIG9mIGluZm8vYWx0ZXJuYXRlcycgXAorJ3Rlc3QgYHdjIC1sIDxELy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXNgID0gMScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBmcm9tIHJlZmVyZW5jZScgXAorJ2NkIEQgJiYgZ2l0IHB1bGwgLi4vQicKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhhdCByZWZlcmVuY2UgZ2V0cyB1c2VkJyBcCisnY2QgRCAmJiBlY2hvICIwIG9iamVjdHMsIDAga2lsb2J5dGVzIiA+IGV4cGVjdGVkICYmCitnaXQgY291bnQtb2JqZWN0cyA+IGN1cnJlbnQgJiYKK2RpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRpbmcgb3JpZ2luJyBcCisnY2QgQSAmJgorZWNobyB0aGlyZCA+IGZpbGUzICYmCitnaXQgYWRkIGZpbGUzICYmCitnaXQgY29tbWl0IC1tIHVwZGF0ZSAmJgorZ2l0IHJlcGFjayAtYSAtZCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsaW5nIGNoYW5nZXMgZnJvbSBvcmlnaW4nIFwKKydjZCBDICYmCitnaXQgcHVsbCBvcmlnaW4nCisKK2NkICIkYmFzZV9kaXIiCisKKyMgdGhlIDIgbG9jYWwgb2JqZWN0cyBhcmUgY29tbWl0IGFuZCB0cmVlIGZyb20gdGhlIG1lcmdlCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IGFsdGVybmF0ZSB0byBvcmlnaW4gZ2V0cyB1c2VkJyBcCisnY2QgQyAmJgorZWNobyAiMiBvYmplY3RzIiA+IGV4cGVjdGVkICYmCitnaXQgY291bnQtb2JqZWN0cyB8IGN1dCAtZCwgLWYxID4gY3VycmVudCAmJgorZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsaW5nIGNoYW5nZXMgZnJvbSBvcmlnaW4nIFwKKydjZCBEICYmCitnaXQgcHVsbCBvcmlnaW4nCisKK2NkICIkYmFzZV9kaXIiCisKKyMgdGhlIDUgbG9jYWwgb2JqZWN0cyBhcmUgZXhwZWN0ZWQ7IGZpbGUzIGJsb2IsIGNvbW1pdCBpbiBBIHRvIGFkZCBpdAorIyBhbmQgaXRzIHRyZWUsIGFuZCAyIGFyZSBvdXIgdHJlZSBhbmQgdGhlIG1lcmdlIGNvbW1pdC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIG9iamVjdHMgZXhwZWN0ZWQgdG8gZXhpc3QgbG9jYWxseScgXAorJ2NkIEQgJiYKK2VjaG8gIjUgb2JqZWN0cyIgPiBleHBlY3RlZCAmJgorZ2l0IGNvdW50LW9iamVjdHMgfCBjdXQgLWQsIC1mMSA+IGN1cnJlbnQgJiYKK2RpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NzAxLWNsb25lLWxvY2FsLnNoIGIvdC90NTcwMS1jbG9uZS1sb2NhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMDkzMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTcwMS1jbG9uZS1sb2NhbC5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBsb2NhbCBjbG9uZScKKy4gLi90ZXN0LWxpYi5zaAorCitEPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmluZyBvcmlnaW4gcmVwb3NpdG9yeScgJworCTogPmZpbGUgJiYgZ2l0IGFkZCAuICYmIGdpdCBjb21taXQgLW0xICYmCisJZ2l0IGNsb25lIC0tYmFyZSAuIGEuZ2l0ICYmCisJZ2l0IGNsb25lIC0tYmFyZSAuIHgKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9jYWwgY2xvbmUgd2l0aG91dCAuZ2l0IHN1ZmZpeCcgJworCWNkICIkRCIgJiYKKwlnaXQgY2xvbmUgLWwgLXMgYSBiICYmCisJY2QgYiAmJgorCWdpdCBmZXRjaAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2NhbCBjbG9uZSB3aXRoIC5naXQgc3VmZml4JyAnCisJY2QgIiREIiAmJgorCWdpdCBjbG9uZSAtbCAtcyBhLmdpdCBjICYmCisJY2QgYyAmJgorCWdpdCBmZXRjaAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2NhbCBjbG9uZSBmcm9tIHgnICcKKwljZCAiJEQiICYmCisJZ2l0IGNsb25lIC1sIC1zIHggeSAmJgorCWNkIHkgJiYKKwlnaXQgZmV0Y2gKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9jYWwgY2xvbmUgZnJvbSB4LmdpdCB0aGF0IGRvZXMgbm90IGV4aXN0JyAnCisJY2QgIiREIiAmJgorCWlmIGdpdCBjbG9uZSAtbCAtcyB4LmdpdCB6CisJdGhlbgorCQllY2hvICJPb3BzLCBzaG91bGQgaGF2ZSBmYWlsZWQiCisJCWZhbHNlCisJZWxzZQorCQllY2hvIGhhcHB5CisJZmkKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NzEwLWluZm8tYWx0ZXJuYXRlLnNoIGIvdC90NTcxMC1pbmZvLWFsdGVybmF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjhlOTdjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTcxMC1pbmZvLWFsdGVybmF0ZS5zaApAQCAtMCwwICsxLDEwNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBNYXJ0aW4gV2FpdHogPHRhbGlAYWRtaW5naWxkZS5vcmc+CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgdHJhbnNpdGl2ZSBpbmZvL2FsdGVybmF0ZSBlbnRyaWVzJworLiAuL3Rlc3QtbGliLnNoCisKKyMgdGVzdCB0aGF0IGEgZmlsZSBpcyBub3QgcmVhY2hhYmxlIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkKKyMgYnV0IHRoYXQgaXQgaXMgYWZ0ZXIgY3JlYXRpbmcgYSBpbmZvL2FsdGVybmF0ZSBlbnRyeQorcmVhY2hhYmxlX3ZpYSgpIHsKKwlhbHRlcm5hdGU9IiQxIgorCWZpbGU9IiQyIgorCWlmIGdpdCBjYXQtZmlsZSAtZSAiSEVBRDokZmlsZSI7IHRoZW4gcmV0dXJuIDE7IGZpCisJZWNobyAiJGFsdGVybmF0ZSIgPj4gLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlCisJZ2l0IGNhdC1maWxlIC1lICJIRUFEOiRmaWxlIgorfQorCit0ZXN0X3ZhbGlkX3JlcG8oKSB7CisJZ2l0IGZzY2sgLS1mdWxsID4gZnNjay5sb2cgJiYKKwl0ZXN0IGB3YyAtbCA8IGZzY2subG9nYCA9IDAKK30KKworYmFzZV9kaXI9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIGZpcnN0IHJlcG9zaXRvcnknIFwKKyd0ZXN0X2NyZWF0ZV9yZXBvIEEgJiYgY2QgQSAmJgorZWNobyAiSGVsbG8gV29ybGQiID4gZmlsZTEgJiYKK2dpdCBhZGQgZmlsZTEgJiYKK2dpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0IiBmaWxlMSAmJgorZ2l0IHJlcGFjayAtYSAtZCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgc2Vjb25kIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgLWwgLXMgQSBCICYmIGNkIEIgJiYKK2VjaG8gImZvbyBiYXIiID4gZmlsZTIgJiYKK2dpdCBhZGQgZmlsZTIgJiYKK2dpdCBjb21taXQgLW0gIm5leHQgY29tbWl0IiBmaWxlMiAmJgorZ2l0IHJlcGFjayAtYSAtZCAtbCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgdGhpcmQgcmVwb3NpdG9yeScgXAorJ2dpdCBjbG9uZSAtbCAtcyBCIEMgJiYgY2QgQyAmJgorZWNobyAiR29vZGJ5ZSwgY3J1ZWwgd29ybGQiID4gZmlsZTMgJiYKK2dpdCBhZGQgZmlsZTMgJiYKK2dpdCBjb21taXQgLW0gIm9uZSBtb3JlIiBmaWxlMyAmJgorZ2l0IHJlcGFjayAtYSAtZCAtbCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdjcmVhdGluZyB0b28gZGVlcCBuZXN0aW5nJyBcCisnZ2l0IGNsb25lIC1sIC1zIEMgRCAmJgorZ2l0IGNsb25lIC1sIC1zIEQgRSAmJgorZ2l0IGNsb25lIC1sIC1zIEUgRiAmJgorZ2l0IGNsb25lIC1sIC1zIEYgRyAmJgorZ2l0IGNsb25lIC1sIC1zIEcgSCAmJgorY2QgSCAmJgordGVzdF92YWxpZF9yZXBvJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2YWxpZGl0eSBvZiB0aGlyZCByZXBvc2l0b3J5JyBcCisnY2QgQyAmJgordGVzdF92YWxpZF9yZXBvJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2YWxpZGl0eSBvZiBmb3VydGggcmVwb3NpdG9yeScgXAorJ2NkIEQgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnJlYWtpbmcgb2YgbG9vcHMnIFwKKyJlY2hvICckYmFzZV9kaXIvQi8uZ2l0L29iamVjdHMnID4+ICckYmFzZV9kaXInL0EvLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyYmCitjZCBDICYmCit0ZXN0X3ZhbGlkX3JlcG8iCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ3RoYXQgaW5mby9hbHRlcm5hdGVzIGlzIG5lY2Vzc2FyeScgXAorJ2NkIEMgJiYKK3JtIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhhdCByZWxhdGl2ZSBhbHRlcm5hdGUgaXMgcG9zc2libGUgZm9yIGN1cnJlbnQgZGlyJyBcCisnY2QgQyAmJgorZWNobyAiLi4vLi4vLi4vQi8uZ2l0L29iamVjdHMiID4gLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyAmJgordGVzdF92YWxpZF9yZXBvJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICd0aGF0IHJlbGF0aXZlIGFsdGVybmF0ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBjdXJyZW50IGRpcicgXAorJ2NkIEQgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDYwMDBsaWIuc2ggYi90L3Q2MDAwbGliLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0MDI2MjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDAwbGliLnNoCkBAIC0wLDAgKzEsMTE2IEBACitbIC1kIC5naXQvcmVmcy90YWdzIF0gfHwgbWtkaXIgLXAgLmdpdC9yZWZzL3RhZ3MKKworOj4gc2VkLnNjcmlwdAorCisjIEFuc3dlciB0aGUgc2hhMSBoYXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWcuIFRoZSB0YWcgbXVzdCBleGlzdCBpbiAuZ2l0IG9yIC5naXQvcmVmcy90YWdzCit0YWcoKQoreworCV90YWc9JDEKKwlbIC1mIC5naXQvcmVmcy90YWdzLyRfdGFnIF0gfHwgZXJyb3IgInRhZzogXCIkX3RhZ1wiIGRvZXMgbm90IGV4aXN0IgorCWNhdCAuZ2l0L3JlZnMvdGFncy8kX3RhZworfQorCisjIEdlbmVyYXRlIGEgY29tbWl0IHVzaW5nIHRoZSB0ZXh0IHNwZWNpZmllZCB0byBtYWtlIGl0IHVuaXF1ZSBhbmQgdGhlIHRyZWUKKyMgbmFtZWQgYnkgdGhlIHRhZyBzcGVjaWZpZWQuCit1bmlxdWVfY29tbWl0KCkKK3sKKwlfdGV4dD0kMQorICAgICAgICBfdHJlZT0kMgorCXNoaWZ0IDIKKyAgICAJZWNobyAkX3RleHQgfCBnaXQtY29tbWl0LXRyZWUgJCh0YWcgJF90cmVlKSAiJEAiCit9CisKKyMgU2F2ZSB0aGUgb3V0cHV0IG9mIGEgY29tbWFuZCBpbnRvIHRoZSB0YWcgc3BlY2lmaWVkLiBQcmVwZW5kCisjIGEgc3Vic3RpdHV0aW9uIHNjcmlwdCBmb3IgdGhlIHRhZyBvbnRvIHRoZSBmcm9udCBvZiBzZWQuc2NyaXB0CitzYXZlX3RhZygpCit7CisJX3RhZz0kMQkKKwlbIC1uICIkX3RhZyIgXSB8fCBlcnJvciAidXNhZ2U6IHNhdmVfdGFnIHRhZyBjb21taXQtYXJncyAuLi4iCisJc2hpZnQgMQorICAgIAkiJEAiID4uZ2l0L3JlZnMvdGFncy8kX3RhZworCisgICAgICAgIGVjaG8gInMvJCh0YWcgJF90YWcpLyRfdGFnL2ciID4gc2VkLnNjcmlwdC50bXAKKwljYXQgc2VkLnNjcmlwdCA+PiBzZWQuc2NyaXB0LnRtcAorCXJtIHNlZC5zY3JpcHQKKwltdiBzZWQuc2NyaXB0LnRtcCBzZWQuc2NyaXB0Cit9CisKKyMgUmVwbGFjZSB1bmhlbHBmdWwgc2hhMSBoYXNoc2VzIHdpdGggdGhlaXIgc3ltYm9saWMgZXF1aXZhbGVudHMgCitlbnRhZygpCit7CisJc2VkIC1mIHNlZC5zY3JpcHQKK30KKworIyBFeGVjdXRlIGEgY29tbWFuZCBhZnRlciBmaXJzdCBzYXZpbmcsIHRoZW4gc2V0dGluZyB0aGUgR0lUX0FVVEhPUl9FTUFJTAorIyB0YWcgdG8gYSBzcGVjaWZpZWQgdmFsdWUuIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9uIHJldHVybi4KK2FzX2F1dGhvcigpCit7CisJX2F1dGhvcj0kMQorCXNoaWZ0IDEKKyAgICAgICAgX3NhdmU9JEdJVF9BVVRIT1JfRU1BSUwKKworCWV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkX2F1dGhvciIKKwkiJEAiCisJaWYgdGVzdCAteiAiJF9zYXZlIgorCXRoZW4KKwkJdW5zZXQgR0lUX0FVVEhPUl9FTUFJTAorCWVsc2UKKwkJZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRfc2F2ZSIKKwlmaQorfQorCitjb21taXRfZGF0ZSgpCit7CisgICAgICAgIF9jb21taXQ9JDEKKwlnaXQtY2F0LWZpbGUgY29tbWl0ICRfY29tbWl0IHwgc2VkIC1uICJzL15jb21taXR0ZXIgLio+IFwoWzAtOV0qXCkgLiovXDEvcCIgCit9CisKK29uX2NvbW1pdHRlcl9kYXRlKCkKK3sKKyAgICBfZGF0ZT0kMQorICAgIHNoaWZ0IDEKKyAgICBleHBvcnQgR0lUX0NPTU1JVFRFUl9EQVRFPSIkX2RhdGUiCisgICAgIiRAIgorICAgIHVuc2V0IEdJVF9DT01NSVRURVJfREFURQorfQorCisjIEV4ZWN1dGUgYSBjb21tYW5kIGFuZCBzdXBwcmVzcyBhbnkgZXJyb3Igb3V0cHV0LgoraGlkZV9lcnJvcigpCit7CisJIiRAIiAyPi9kZXYvbnVsbAorfQorCitjaGVja19vdXRwdXQoKQoreworCV9uYW1lPSQxCisJc2hpZnQgMQorCWlmIGV2YWwgIiQqIiB8IGVudGFnID4gJF9uYW1lLmFjdHVhbAorCXRoZW4KKwkJZGlmZiAkX25hbWUuZXhwZWN0ZWQgJF9uYW1lLmFjdHVhbAorCWVsc2UKKwkJcmV0dXJuIDE7CisJZmkKK30KKworIyBUdXJuIGEgcmVhc29uYWJsZSB0ZXN0IGRlc2NyaXB0aW9uIGludG8gYSByZWFzb25hYmxlIHRlc3QgbmFtZS4KKyMgQWxsIGFscGhhbnVtcyB0cmFuc2xhdGVkIGludG8gLSdzIHdoaWNoIGFyZSB0aGVuIGNvbXByZXNzZWQgYW5kIHN0cmlwcGVkCisjIGZyb20gZnJvbnQgYW5kIGJhY2suCituYW1lX2Zyb21fZGVzY3JpcHRpb24oKQoreworICAgICAgICB0ciAiJyIgJy0nIHwgdHIgJ35gIUAjJCVeJiooKV8rPXt9W118XDs6Ijw+LC8/ICcgJy0nIHwgdHIgLXMgJy0nIHwgdHIgJ1tBLVpdJyAnW2Etel0nIHwgc2VkICJzL14tKi8vO3MvLSpcJC8vIgorfQorCisKKyMgRXhlY3V0ZSB0aGUgdGVzdCBkZXNjcmliZWQgYnkgdGhlIGZpcnN0IGFyZ3VtZW50LCBieSBldmFsJ2luZworIyBjb21tYW5kIGxpbmUgc3BlY2lmaWVkIGluIHRoZSAybmQgYXJndW1lbnQuIENoZWNrIHRoZSBzdGF0dXMgY29kZQorIyBpcyB6ZXJvIGFuZCB0aGF0IHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgc3RyZWFtIHJlYWQgZnJvbSAKKyMgc3RkaW4uCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcygpCit7CQorCV9kZXNjcmlwdGlvbj0kMQorICAgICAgICBfdGVzdD0kMgorICAgICAgICBbICQjIC1lcSAyIF0gfHwgZXJyb3IgInVzYWdlOiB0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyBkZXNjcmlwdGlvbiB0ZXN0IDw8RU9GIC4uLiBFT0YiCisgICAgICAgIF9uYW1lPSQoZWNobyAkX2Rlc2NyaXB0aW9uIHwgbmFtZV9mcm9tX2Rlc2NyaXB0aW9uKQorCWNhdCA+ICRfbmFtZS5leHBlY3RlZAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRfZGVzY3JpcHRpb24iICJjaGVja19vdXRwdXQgJF9uYW1lIFwiJF90ZXN0XCIiIAorfQpkaWZmIC0tZ2l0IGEvdC90NjAwMS1yZXYtbGlzdC1ncmFmdC5zaCBiL3QvdDYwMDEtcmV2LWxpc3QtZ3JhZnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjIxMzFjZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDEtcmV2LWxpc3QtZ3JhZnQuc2gKQEAgLTAsMCArMSwxMTMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZXZpc2lvbiB0cmF2ZXJzYWwgdnMgZ3JhZnRzIGFuZCBwYXRoIGxpbWl0ZXInCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlta2RpciBzdWJkaXIgJiYKKwllY2hvID5maWxlQSBmaWxlQSAmJgorCWVjaG8gPnN1YmRpci9maWxlQiBmaWxlQiAmJgorCWdpdCBhZGQgZmlsZUEgc3ViZGlyL2ZpbGVCICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiSW5pdGlhbCBpbiBvbmUgaGlzdG9yeS4iICYmCisJQTA9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKworCWVjaG8gPmZpbGVBIGZpbGVBIG1vZGlmaWVkICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiU2Vjb25kIGluIG9uZSBoaXN0b3J5LiIgJiYKKwlBMT1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCAmJgorCisJZWNobyA+c3ViZGlyL2ZpbGVCIGZpbGVCIG1vZGlmaWVkICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiVGhpcmQgaW4gb25lIGhpc3RvcnkuIiAmJgorCUEyPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisKKwlybSAtZiAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvaW5kZXggJiYKKworCWVjaG8gPmZpbGVBIGZpbGVBIGFnYWluICYmCisJZWNobyA+c3ViZGlyL2ZpbGVCIGZpbGVCIGFnYWluICYmCisJZ2l0IGFkZCBmaWxlQSBzdWJkaXIvZmlsZUIgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJJbml0aWFsIGluIGFsdGVybmF0ZSBoaXN0b3J5LiIgJiYKKwlCMD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCAmJgorCisJZWNobyA+ZmlsZUEgZmlsZUEgbW9kaWZpZWQgaW4gYWx0ZXJuYXRlIGhpc3RvcnkgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQgaW4gYWx0ZXJuYXRlIGhpc3RvcnkuIiAmJgorCUIxPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisKKwllY2hvID5zdWJkaXIvZmlsZUIgZmlsZUIgbW9kaWZpZWQgaW4gYWx0ZXJuYXRlIGhpc3RvcnkgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJUaGlyZCBpbiBhbHRlcm5hdGUgaGlzdG9yeS4iICYmCisJQjI9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKwk6IGRvbmUKKycKKworY2hlY2sgKCkgeworCXR5cGU9JDEKKwlzaGlmdAorCisJYXJnPQorCXdoaWNoPWFyZworCXJtIC1mIHRlc3QuZXhwZWN0CisJZm9yIGEKKwlkbworCQlpZiB0ZXN0ICJ6JGEiID0gei0tCisJCXRoZW4KKwkJCXdoaWNoPWV4cGVjdAorCQkJY2hpbGQ9CisJCQljb250aW51ZQorCQlmaQorCQlpZiB0ZXN0ICIkd2hpY2giID0gYXJnCisJCXRoZW4KKwkJCWFyZz0iJGFyZyRhICIKKwkJCWNvbnRpbnVlCisJCWZpCisJCWlmIHRlc3QgIiR0eXBlIiA9IGJhc2ljCisJCXRoZW4KKwkJCWVjaG8gIiRhIgorCQllbHNlCisJCQlpZiB0ZXN0ICJ6JGNoaWxkIiAhPSB6CisJCQl0aGVuCisJCQkJZWNobyAiJGNoaWxkICRhIgorCQkJZmkKKwkJCWNoaWxkPSIkYSIKKwkJZmkKKwlkb25lID50ZXN0LmV4cGVjdAorCWlmIHRlc3QgIiR0eXBlIiAhPSBiYXNpYyAmJiB0ZXN0ICJ6JGNoaWxkIiAhPSB6CisJdGhlbgorCQllY2hvID4+dGVzdC5leHBlY3QgJGNoaWxkCisJZmkKKwlpZiB0ZXN0ICR0eXBlID0gYmFzaWMKKwl0aGVuCisJCWdpdCByZXYtbGlzdCAkYXJnID50ZXN0LmFjdHVhbAorCWVsaWYgdGVzdCAkdHlwZSA9IHBhcmVudHMKKwl0aGVuCisJCWdpdCByZXYtbGlzdCAtLXBhcmVudHMgJGFyZyA+dGVzdC5hY3R1YWwKKwllbGlmIHRlc3QgJHR5cGUgPSBwYXJlbnRzLXJhdworCXRoZW4KKwkJZ2l0IHJldi1saXN0IC0tcGFyZW50cyAtLXByZXR0eT1yYXcgJGFyZyB8CisJCXNlZCAtbiAtZSAncy9eY29tbWl0IC8vcCcgPnRlc3QuYWN0dWFsCisJZmkKKwlkaWZmIHRlc3QuZXhwZWN0IHRlc3QuYWN0dWFsCit9CisKK2ZvciB0eXBlIGluIGJhc2ljIHBhcmVudHMgcGFyZW50cy1yYXcKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aG91dCBncmFmdHMnICIKKwkJcm0gLWYgLmdpdC9pbmZvL2dyYWZ0cworCQljaGVjayAkdHlwZSAkQjIgLS0gJEIyICRCMSAkQjAKKwkiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGdyYWZ0cycgIgorCQllY2hvICckQjAgJEEyJyA+LmdpdC9pbmZvL2dyYWZ0cworCQljaGVjayAkdHlwZSAkQjIgLS0gJEIyICRCMSAkQjAgJEEyICRBMSAkQTAKKwkiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRob3V0IGdyYWZ0cywgd2l0aCBwYXRobGltaXQnICIKKwkJcm0gLWYgLmdpdC9pbmZvL2dyYWZ0cworCQljaGVjayAkdHlwZSAkQjIgc3ViZGlyIC0tICRCMiAkQjAKKwkiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGdyYWZ0cywgd2l0aCBwYXRobGltaXQnICIKKwkJZWNobyAnJEIwICRBMicgPi5naXQvaW5mby9ncmFmdHMKKwkJY2hlY2sgJHR5cGUgJEIyIHN1YmRpciAtLSAkQjIgJEIwICRBMiAkQTAKKwkiCisKK2RvbmUKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwMi1yZXYtbGlzdC1iaXNlY3Quc2ggYi90L3Q2MDAyLXJldi1saXN0LWJpc2VjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2IzMzAyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwMi1yZXYtbGlzdC1iaXNlY3Quc2gKQEAgLTAsMCArMSwyMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9uIFNleW1vdXIKKyMKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3RzIGdpdC1yZXYtbGlzdCAtLWJpc2VjdCBmdW5jdGlvbmFsaXR5JworCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vdDYwMDBsaWIuc2ggIyB0Nnh4eCBzcGVjaWZpYyBmdW5jdGlvbnMKKworIyB1c2FnZTogdGVzdF9iaXNlY3Rpb24gbWF4LWRpZmYgYmlzZWN0LW9wdGlvbiBoZWFkIF5wcnVuZS4uLgorIworIyBlLmcuIHRlc3RfYmlzZWN0aW9uIDEgLS1iaXNlY3QgbDEgXmwwCisjCit0ZXN0X2Jpc2VjdGlvbl9kaWZmKCkKK3sKKwlfbWF4X2RpZmY9JDEKKwlfYmlzZWN0X29wdGlvbj0kMgorCXNoaWZ0IDIKKwlfYmlzZWN0aW9uPSQoZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiAiJEAiKQorCV9saXN0X3NpemU9JChnaXQtcmV2LWxpc3QgIiRAIiB8IHdjIC1sKQorICAgICAgICBfaGVhZD0kMQorCXNoaWZ0IDEKKwlfYmlzZWN0aW9uX3NpemU9JChnaXQtcmV2LWxpc3QgJF9iaXNlY3Rpb24gIiRAIiB8IHdjIC1sKQorCVsgLW4gIiRfbGlzdF9zaXplIiAtYSAtbiAiJF9iaXNlY3Rpb25fc2l6ZSIgXSB8fAorCWVycm9yICJ0ZXN0X2Jpc2VjdGlvbl9kaWZmIGZhaWxlZCIKKworCSMgVGVzdCBpZiBiaXNlY3Rpb24gc2l6ZSBpcyBjbG9zZSB0byBoYWxmIG9mIGxpc3Qgc2l6ZSB3aXRoaW4KKwkjIHRvbGVyYW5jZS4KKwkjIAorCV9iaXNlY3RfZXJyPWBleHByICRfbGlzdF9zaXplIC0gJF9iaXNlY3Rpb25fc2l6ZSBcKiAyYAorCXRlc3QgIiRfYmlzZWN0X2VyciIgLWx0IDAgJiYgX2Jpc2VjdF9lcnI9YGV4cHIgMCAtICRfYmlzZWN0X2VycmAKKwlfYmlzZWN0X2Vycj1gZXhwciAkX2Jpc2VjdF9lcnIgLyAyYCA7ICMgZmxvb3IKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJiaXNlY3Rpb24gZGlmZiAkX2Jpc2VjdF9vcHRpb24gJF9oZWFkICQqIDw9ICRfbWF4X2RpZmYiIFwKKwkndGVzdCAkX2Jpc2VjdF9lcnIgLWxlICRfbWF4X2RpZmYnCit9CisKK2RhdGUgPnBhdGgwCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwCitzYXZlX3RhZyB0cmVlIGdpdC13cml0ZS10cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMCIgaGlkZV9lcnJvciBzYXZlX3RhZyByb290IHVuaXF1ZV9jb21taXQgcm9vdCB0cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgbDAgdW5pcXVlX2NvbW1pdCBsMCB0cmVlIC1wIHJvb3QKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAyIiBzYXZlX3RhZyBsMSB1bmlxdWVfY29tbWl0IGwxIHRyZWUgLXAgbDAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAzIiBzYXZlX3RhZyBsMiB1bmlxdWVfY29tbWl0IGwyIHRyZWUgLXAgbDEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA0IiBzYXZlX3RhZyBhMCB1bmlxdWVfY29tbWl0IGEwIHRyZWUgLXAgbDIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA1IiBzYXZlX3RhZyBhMSB1bmlxdWVfY29tbWl0IGExIHRyZWUgLXAgYTAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA2IiBzYXZlX3RhZyBiMSB1bmlxdWVfY29tbWl0IGIxIHRyZWUgLXAgYTAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA3IiBzYXZlX3RhZyBjMSB1bmlxdWVfY29tbWl0IGMxIHRyZWUgLXAgYjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA4IiBzYXZlX3RhZyBiMiB1bmlxdWVfY29tbWl0IGIyIHRyZWUgLXAgYjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA5IiBzYXZlX3RhZyBiMyB1bmlxdWVfY29tbWl0IGIyIHRyZWUgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEwIiBzYXZlX3RhZyBjMiB1bmlxdWVfY29tbWl0IGMyIHRyZWUgLXAgYzEgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjExIiBzYXZlX3RhZyBjMyB1bmlxdWVfY29tbWl0IGMzIHRyZWUgLXAgYzIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEyIiBzYXZlX3RhZyBhMiB1bmlxdWVfY29tbWl0IGEyIHRyZWUgLXAgYTEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEzIiBzYXZlX3RhZyBhMyB1bmlxdWVfY29tbWl0IGEzIHRyZWUgLXAgYTIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE0IiBzYXZlX3RhZyBiNCB1bmlxdWVfY29tbWl0IGI0IHRyZWUgLXAgYjMgLXAgYTMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE1IiBzYXZlX3RhZyBhNCB1bmlxdWVfY29tbWl0IGE0IHRyZWUgLXAgYTMgLXAgYjQgLXAgYzMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE2IiBzYXZlX3RhZyBsMyB1bmlxdWVfY29tbWl0IGwzIHRyZWUgLXAgYTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE3IiBzYXZlX3RhZyBsNCB1bmlxdWVfY29tbWl0IGw0IHRyZWUgLXAgbDMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE4IiBzYXZlX3RhZyBsNSB1bmlxdWVfY29tbWl0IGw1IHRyZWUgLXAgbDQKK2dpdC11cGRhdGUtcmVmIEhFQUQgJCh0YWcgbDUpCisKKworIyAgICAgRQorIyAgICAvIFwKKyMgICBlMSAgfAorIyAgIHwgICB8CisjICAgZTIgIHwKKyMgICB8ICAgfAorIyAgIGUzICB8CisjICAgfCAgIHwKKyMgICBlNCAgfAorIyAgIHwgICB8CisjICAgfCAgIGYxCisjICAgfCAgIHwKKyMgICB8ICAgZjIKKyMgICB8ICAgfAorIyAgIHwgICBmMworIyAgIHwgICB8CisjICAgfCAgIGY0CisjICAgfCAgIHwKKyMgICBlNSAgfAorIyAgIHwgICB8CisjICAgZTYgIHwKKyMgICB8ICAgfAorIyAgIGU3ICB8CisjICAgfCAgIHwKKyMgICBlOCAgfAorIyAgICBcIC8KKyMgICAgIEYKKworCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMCIgaGlkZV9lcnJvciBzYXZlX3RhZyBGIHVuaXF1ZV9jb21taXQgRiB0cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgZTggdW5pcXVlX2NvbW1pdCBlOCB0cmVlIC1wIEYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAyIiBzYXZlX3RhZyBlNyB1bmlxdWVfY29tbWl0IGU3IHRyZWUgLXAgZTgKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAzIiBzYXZlX3RhZyBlNiB1bmlxdWVfY29tbWl0IGU2IHRyZWUgLXAgZTcKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA0IiBzYXZlX3RhZyBlNSB1bmlxdWVfY29tbWl0IGU1IHRyZWUgLXAgZTYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA1IiBzYXZlX3RhZyBmNCB1bmlxdWVfY29tbWl0IGY0IHRyZWUgLXAgRgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIGYzIHVuaXF1ZV9jb21taXQgZjMgdHJlZSAtcCBmNAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDciIHNhdmVfdGFnIGYyIHVuaXF1ZV9jb21taXQgZjIgdHJlZSAtcCBmMworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDgiIHNhdmVfdGFnIGYxIHVuaXF1ZV9jb21taXQgZjEgdHJlZSAtcCBmMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDkiIHNhdmVfdGFnIGU0IHVuaXF1ZV9jb21taXQgZTQgdHJlZSAtcCBlNQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTAiIHNhdmVfdGFnIGUzIHVuaXF1ZV9jb21taXQgZTMgdHJlZSAtcCBlNAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTEiIHNhdmVfdGFnIGUyIHVuaXF1ZV9jb21taXQgZTIgdHJlZSAtcCBlMworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTIiIHNhdmVfdGFnIGUxIHVuaXF1ZV9jb21taXQgZTEgdHJlZSAtcCBlMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTMiIHNhdmVfdGFnIEUgdW5pcXVlX2NvbW1pdCBFIHRyZWUgLXAgZTEgLXAgZjEKKworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgVSB1bmlxdWVfY29tbWl0IFUgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIHUwIHVuaXF1ZV9jb21taXQgdTAgdHJlZSAtcCBVCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgdTEgdW5pcXVlX2NvbW1pdCB1MSB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgdTIgdW5pcXVlX2NvbW1pdCB1MiB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgdTMgdW5pcXVlX2NvbW1pdCB1MyB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgdTQgdW5pcXVlX2NvbW1pdCB1NCB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgdTUgdW5pcXVlX2NvbW1pdCB1NSB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNiIgc2F2ZV90YWcgViB1bmlxdWVfY29tbWl0IFYgdHJlZSAtcCB1MSAtcCB1MiAtcCB1MyAtcCB1NCAtcCB1NQorCit0ZXN0X3NlcXVlbmNlKCkKK3sKKwlfYmlzZWN0X29wdGlvbj0kMQkKKwkKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGwwIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBsMSBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gbDIgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGEwIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMSBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYTIgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGEzIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBiMSBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYjIgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGIzIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBjMSBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYzIgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGMzIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBFIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlMSBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTIgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGUzIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlNCBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTUgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGU2IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlNyBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZjEgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGYyIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBmMyBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZjQgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIEUgXkYKKworCXRlc3RfYmlzZWN0aW9uX2RpZmYgMSAkX2Jpc2VjdF9vcHRpb24gViBeVQorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gViBeVSBedTEgXnUyIF51MworCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gdTEgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHUyIF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1MyBeVQorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gdTQgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHU1IF5VCisJCisjCisjIHRoZSBmb2xsb3dpbmcgaWxsdXN0cmF0ZXMgTGludXMnIGJpbmFyeSBidWcgYmxhdHQgaWRlYS4KKyMKKyMgYXNzdW1lIHRoZSBidWcgaXMgYWN0dWFsbHkgYXQgbDMsIGJ1dCB5b3UgZG9uJ3Qga25vdyB0aGF0IC0gYWxsIHlvdSBrbm93IGlzIHRoYXQgbDMgaXMgYnJva2VuCisjIGFuZCBpdCB3YXNuJ3QgYnJva2VuIGJlZm9yZQorIworIyBrZWVwIGJpc2VjdGluZyB0aGUgbGlzdCwgYWR2YW5jaW5nIHRoZSAiYmFkIiBoZWFkIGFuZCBhY2N1bXVsYXRpbmcgImdvb2QiIGhlYWRzIHVudGlsCisjIHRoZSBiaXNlY3Rpb24gcG9pbnQgaXMgdGhlIGhlYWQgLSB0aGlzIGlzIHRoZSBiYWQgcG9pbnQuCisjCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290JyA8PEVPRgorYzMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QgXmMzJyA8PEVPRgorYjQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyBeYjQiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5jMyBeYjQnIDw8RU9GCitsMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCcgPDxFT0YKK2E0CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsNSBeYjMgXmEzIF5iNCBeYTQiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGwzIF5iMyBeYTMgXmE0JyA8PEVPRgorbDMKK0VPRgorCisjCisjIGlmIGwzIGlzIGJhZCwgdGhlbiBsNCBpcyBiYWQgdG9vIC0gc28gYWR2YW5jZSB0aGUgYmFkIHBvaW50ZXIgYnkgbWFraW5nIGI0IHRoZSBrbm93biBiYWQgaGVhZAorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw0IF5hMiBeYTMgXmIgXmE0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsNCBeYTIgXmEzIF5hNCcgPDxFT0YKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsMyBeYTIgXmEzIF5iIF5hNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXmEyIF5hMyBeYTQnIDw8RU9GCitsMworRU9GCisKKyMgZm91bmQhCisKKyMKKyMgYXMgYW5vdGhlciBleGFtcGxlLCBsZXQncyBjb25zaWRlciBhNCB0byBiZSB0aGUgYmFkIGhlYWQsIGluIHdoaWNoIGNhc2UKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMyIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMycgPDxFT0YKK2E0CitFT0YKKworIyBmb3VuZCEKKworIworIyBvciBjb25zaWRlciBjMyB0byBiZSB0aGUgYmFkIGhlYWQKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYzMgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBjMyBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKKyMgZm91bmQhCisKK30KKwordGVzdF9zZXF1ZW5jZSAiLS1iaXNlY3QiCisKKyMKKyMKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoIGIvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5OWE5YWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDAzLXJldi1saXN0LXRvcG8tb3JkZXIuc2gKQEAgLTAsMCArMSw0MDggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9uIFNleW1vdXIKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdHMgZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBmdW5jdGlvbmFsaXR5JworCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vdDYwMDBsaWIuc2ggIyB0Nnh4eCBzcGVjaWZpYyBmdW5jdGlvbnMKKworbGlzdF9kdXBsaWNhdGVzKCkKK3sKKyAgICAiJEAiIHwgc29ydCB8IHVuaXEgLWQKK30KKworZGF0ZSA+cGF0aDAKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAKK3NhdmVfdGFnIHRyZWUgZ2l0LXdyaXRlLXRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAwIiBoaWRlX2Vycm9yIHNhdmVfdGFnIHJvb3QgdW5pcXVlX2NvbW1pdCByb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAxIiBzYXZlX3RhZyBsMCB1bmlxdWVfY29tbWl0IGwwIHRyZWUgLXAgcm9vdAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDIiIHNhdmVfdGFnIGwxIHVuaXF1ZV9jb21taXQgbDEgdHJlZSAtcCBsMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDMiIHNhdmVfdGFnIGwyIHVuaXF1ZV9jb21taXQgbDIgdHJlZSAtcCBsMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDQiIHNhdmVfdGFnIGEwIHVuaXF1ZV9jb21taXQgYTAgdHJlZSAtcCBsMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDUiIHNhdmVfdGFnIGExIHVuaXF1ZV9jb21taXQgYTEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIGIxIHVuaXF1ZV9jb21taXQgYjEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDciIHNhdmVfdGFnIGMxIHVuaXF1ZV9jb21taXQgYzEgdHJlZSAtcCBiMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDgiIGFzX2F1dGhvciBmb29iYXJAZXhhbXBsZS5jb20gc2F2ZV90YWcgYjIgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOSIgc2F2ZV90YWcgYjMgdW5pcXVlX2NvbW1pdCBiMyB0cmVlIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMCIgc2F2ZV90YWcgYzIgdW5pcXVlX2NvbW1pdCBjMiB0cmVlIC1wIGMxIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMSIgc2F2ZV90YWcgYzMgdW5pcXVlX2NvbW1pdCBjMyB0cmVlIC1wIGMyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMiIgc2F2ZV90YWcgYTIgdW5pcXVlX2NvbW1pdCBhMiB0cmVlIC1wIGExCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMyIgc2F2ZV90YWcgYTMgdW5pcXVlX2NvbW1pdCBhMyB0cmVlIC1wIGEyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNCIgc2F2ZV90YWcgYjQgdW5pcXVlX2NvbW1pdCBiNCB0cmVlIC1wIGIzIC1wIGEzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNSIgc2F2ZV90YWcgYTQgdW5pcXVlX2NvbW1pdCBhNCB0cmVlIC1wIGEzIC1wIGI0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNiIgc2F2ZV90YWcgbDMgdW5pcXVlX2NvbW1pdCBsMyB0cmVlIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNyIgc2F2ZV90YWcgbDQgdW5pcXVlX2NvbW1pdCBsNCB0cmVlIC1wIGwzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOCIgc2F2ZV90YWcgbDUgdW5pcXVlX2NvbW1pdCBsNSB0cmVlIC1wIGw0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOSIgc2F2ZV90YWcgbTEgdW5pcXVlX2NvbW1pdCBtMSB0cmVlIC1wIGE0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTIgdW5pcXVlX2NvbW1pdCBtMiB0cmVlIC1wIGMzIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMSIgaGlkZV9lcnJvciBzYXZlX3RhZyBhbHRfcm9vdCB1bmlxdWVfY29tbWl0IGFsdF9yb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIyIiBzYXZlX3RhZyByMCB1bmlxdWVfY29tbWl0IHIwIHRyZWUgLXAgYWx0X3Jvb3QKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIzIiBzYXZlX3RhZyByMSB1bmlxdWVfY29tbWl0IHIxIHRyZWUgLXAgcjAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjI0IiBzYXZlX3RhZyBsNXIxIHVuaXF1ZV9jb21taXQgbDVyMSB0cmVlIC1wIGw1IC1wIHIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyNSIgc2F2ZV90YWcgcjFsNSB1bmlxdWVfY29tbWl0IHIxbDUgdHJlZSAtcCByMSAtcCBsNQorCisKKyMKKyMgbm90ZTogYXMgb2YgMjAvNiwgaXQgaXNuJ3QgcG9zc2libGUgdG8gY3JlYXRlIGR1cGxpY2F0ZSBwYXJlbnRzLCBzbyB0aGlzCisjIGNhbid0IGJlIHRlc3RlZC4KKyMKKyNvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTMgdW5pcXVlX2NvbW1pdCBtMyB0cmVlIC1wIGMzIC1wIGE0IC1wIGMzCitoaWRlX2Vycm9yIHNhdmVfdGFnIGUxIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTEgdHJlZQorc2F2ZV90YWcgZTIgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlMiB0cmVlIC1wIGUxCitzYXZlX3RhZyBmMSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGYxIHRyZWUgLXAgZTEKK3NhdmVfdGFnIGUzIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTMgdHJlZSAtcCBlMgorc2F2ZV90YWcgZjIgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMiB0cmVlIC1wIGYxCitzYXZlX3RhZyBlNCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU0IHRyZWUgLXAgZTMgLXAgZjIKK3NhdmVfdGFnIGU1IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTUgdHJlZSAtcCBlNAorc2F2ZV90YWcgZjMgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMyB0cmVlIC1wIGYyCitzYXZlX3RhZyBmNCBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY0IHRyZWUgLXAgZjMKK3NhdmVfdGFnIGU2IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTYgdHJlZSAtcCBlNSAtcCBmNAorc2F2ZV90YWcgZjUgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmNSB0cmVlIC1wIGY0CitzYXZlX3RhZyBmNiBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY2IHRyZWUgLXAgZjUgLXAgZTYKK3NhdmVfdGFnIGU3IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTcgdHJlZSAtcCBlNgorc2F2ZV90YWcgZTggYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlOCB0cmVlIC1wIGU3CitzYXZlX3RhZyBlOSBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU5IHRyZWUgLXAgZTgKK3NhdmVfdGFnIGY3IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjcgdHJlZSAtcCBmNgorc2F2ZV90YWcgZjggYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmOCB0cmVlIC1wIGY3CitzYXZlX3RhZyBmOSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY5IHRyZWUgLXAgZjgKK3NhdmVfdGFnIGUxMCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGUxIHRyZWUgLXAgZTkgLXAgZjgKKworaGlkZV9lcnJvciBzYXZlX3RhZyBnMCB1bmlxdWVfY29tbWl0IGcwIHRyZWUKK3NhdmVfdGFnIGcxIHVuaXF1ZV9jb21taXQgZzEgdHJlZSAtcCBnMAorc2F2ZV90YWcgaDEgdW5pcXVlX2NvbW1pdCBnMiB0cmVlIC1wIGcwCitzYXZlX3RhZyBnMiB1bmlxdWVfY29tbWl0IGczIHRyZWUgLXAgZzEgLXAgaDEKK3NhdmVfdGFnIGgyIHVuaXF1ZV9jb21taXQgZzQgdHJlZSAtcCBnMgorc2F2ZV90YWcgZzMgdW5pcXVlX2NvbW1pdCBnNSB0cmVlIC1wIGcyCitzYXZlX3RhZyBnNCB1bmlxdWVfY29tbWl0IGc2IHRyZWUgLXAgZzMgLXAgaDIKKworZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkKHRhZyBsNSkKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3Jldi1saXN0IGhhcyBjb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzJyAnZ2l0LXJldi1saXN0IEhFQUQgfCB3YyAtbCB8IHRyIC1kIFwiIFwiJyA8PEVPRgorMTkKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnc2ltcGxlIHRvcG8gb3JkZXInICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBIRUFEJyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK2ExCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICd0d28gZGlhbW9uZHMgdG9wbyBvcmRlciAoZzYpJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgZzQnIDw8RU9GCitnNAoraDIKK2czCitnMgoraDEKK2cxCitnMAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcycgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTMgYjMgYzMnIDw8RU9GCithMworYTIKK2ExCitjMworYzIKK2MxCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgYTEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5hMScgPDxFT0YKK2EzCithMgorYzMKK2MyCitjMQorYjMKK2IyCitiMQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgbDEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5sMScgPDxFT0YKK2EzCithMgorYTEKK2MzCitjMgorYzEKK2IzCitiMgorYjEKK2EwCitsMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdjcm9zcy1lcG9jaCwgaGVhZCBhdCBsNSwgcHJ1bmUgYXQgbDEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ2R1cGxpY2F0ZWQgaGVhZCBhcmd1bWVudHMnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lIG5lYXIgdG9wbycgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTQgXmMzJyA8PEVPRgorYTQKK2I0CithMworYTIKK2ExCitiMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJoZWFkIGhhcyBubyBwYXJlbnQiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICByb290JyA8PEVPRgorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJ0d28gbm9kZXMgLSBvbmUgaGVhZCwgb25lIGJhc2UiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMCcgPDxFT0YKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgInRocmVlIG5vZGVzIG9uZSBoZWFkLCBvbmUgaW50ZXJuYWwsIG9uZSBiYXNlIiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDEnIDw8RU9GCitsMQorbDAKK3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5yb290IiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDIgXnJvb3QnIDw8RU9GCitsMgorbDEKK2wwCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsMiBebDAiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMiBebDAnIDw8RU9GCitsMgorbDEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5sMSIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGwyIF5sMScgPDxFT0YKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBeYTQiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBeYTQnIDw8RU9GCitsNQorbDQKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBebDMiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBebDMnIDw8RU9GCitsNQorbDQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGw1IF5sNCIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1IF5sNCcgPDxFT0YKK2w1CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIHRvcG8gb3JkZXIiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICAtLW1heC1jb3VudD0xMCBsNScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIG5vbiB0b3BvIG9yZGVyIiAnZ2l0LXJldi1saXN0IC0tbWF4LWNvdW50PTEwIGw1JyA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitjMgorYjMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCBubyAtLXRvcG8tb3JkZXInICJnaXQtcmV2LWxpc3QgLS1tYXgtYWdlPSQoY29tbWl0X2RhdGUgYzMpIGw1IiA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitFT0YKKworIworIyB0aGlzIHRlc3QgZmFpbHMgb24gLS10b3BvLW9yZGVyIC0gYSBmaXggaXMgcmVxdWlyZWQKKyMKKyN0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCAtLXRvcG8tb3JkZXInICJnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIC0tbWF4LWFnZT0kKGNvbW1pdF9kYXRlIGMzKSBsNSIgPDxFT0YKKyNsNQorI2w0CisjbDMKKyNhNAorI2MzCisjYjQKKyNhMworI2EyCisjRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGE0IGMzIiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBjMywgYTQsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGMzIGE0IiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIG5vIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgYTQgYzMiIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGMzLCBhNCwgbm8gLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBjMyBhNCIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBjMyBhbmQgYTQgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBtMSIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBhNCBhbmQgYzMgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBtMiIgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIC0tdG9wby1vcmRlciIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGEzIF5hMycgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIG5vIC0tdG9wby1vcmRlciIgJ2dpdC1yZXYtbGlzdCBhMyBeYTMnIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChsNXIxKScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1cjEnIDw8RU9GCitsNXIxCityMQorcjAKK2FsdF9yb290CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChyMWw1KScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIHIxbDUnIDw8RU9GCityMWw1CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CityMQorcjAKK2FsdF9yb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImRvbid0IHByaW50IHRoaW5ncyB1bnJlYWNoYWJsZSBmcm9tIG9uZSBicmFuY2giICJnaXQtcmV2LWxpc3QgYTMgXmIzIC0tdG9wby1vcmRlciIgPDxFT0YKK2EzCithMgorYTEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiLS10b3BvLW9yZGVyIGE0IGwzIiAiZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBhNCBsMyIgPDxFT0YKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKworIworIworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaCBiL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjFmMDliCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwNC1yZXYtbGlzdC1wYXRoLW9wdGltLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcmV2LWxpc3QgdHJpdmlhbCBwYXRoIG9wdGltaXphdGlvbiB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCitlY2hvIEhlbGxvID4gYSAmJgorZ2l0IGFkZCBhICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgYSAmJgoraW5pdGlhbD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBwYXRoLW9wdGltaXphdGlvbiAnCisgICAgY29tbWl0PSQoZWNobyAiVW5jaGFuZ2VkIHRyZWUiIHwgZ2l0LWNvbW1pdC10cmVlICJIRUFEXnt0cmVlfSIgLXAgSEVBRCkgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0ICRjb21taXQgfCB3YyAtbCkgPSAyICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCAkY29tbWl0IC0tIC4gfCB3YyAtbCkgPSAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Z1cnRoZXIgc2V0dXAnICcKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSAmJgorCWVjaG8gSXJyZWxldmFudCA+YyAmJgorCWdpdCBhZGQgYyAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgbWFrZXMgYW4gaXJyZWxldmFudCBjb21taXQiICYmCisJZWNobyAiTW9yZSBJcnJlbGV2YW5jeSIgPmMgJiYKKwlnaXQgYWRkIGMgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIG1ha2VzIGFub3RoZXIgaXJyZWxldmFudCBjb21taXQiICYmCisJZWNobyBCeWUgPmEgJiYKKwlnaXQgYWRkIGEgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIHRvdWNoZXMgYSIgJiYKKwlzaWRlPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWVjaG8gIllldCBtb3JlIElycmVsZXZhbmN5IiA+YyAmJgorCWdpdCBhZGQgYyAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgbWFrZXMgeWV0IGFub3RoZXIgaXJyZWxldmFudCBjb21taXQiICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWVjaG8gQW5vdGhlciA+YiAmJgorCWdpdCBhZGQgYiAmJgorCWdpdCBjb21taXQgLW0gIk1hc3RlciB0b3VjaGVzIGIiICYmCisJZ2l0IG1lcmdlIHNpZGUgJiYKKwllY2hvIFRvdWNoZWQgPmIgJiYKKwlnaXQgYWRkIGIgJiYKKwlnaXQgY29tbWl0IC1tICJNYXN0ZXIgdG91Y2hlcyBiIGFnYWluIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXRoIG9wdGltaXphdGlvbiAyJyAnCisJKCBlY2hvICIkc2lkZSI7IGVjaG8gIiRpbml0aWFsIiApID5leHBlY3RlZCAmJgorCWdpdCByZXYtbGlzdCBIRUFEIC0tIGEgPmFjdHVhbCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwNS1yZXYtbGlzdC1jb3VudC5zaCBiL3QvdDYwMDUtcmV2LWxpc3QtY291bnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM0ZmNjZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDUtcmV2LWxpc3QtY291bnQuc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXYtbGlzdCAtLW1heC1jb3VudCBhbmQgLS1za2lwIHRlc3QnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworICAgIGZvciBuIGluIDEgMiAzIDQgNSA7IGRvIFwKKyAgICAgICAgZWNobyAkbiA+IGEgOyBcCisgICAgICAgIGdpdCBhZGQgYSA7IFwKKyAgICAgICAgZ2l0IGNvbW1pdCAtbSAiJG4iIDsgXAorICAgIGRvbmUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gb3B0aW9ucycgJworICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCB8IHdjIC1sKSA9IDUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtY291bnQnICcKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1tYXgtY291bnQ9MCB8IHdjIC1sKSA9IDAgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1tYXgtY291bnQ9MyB8IHdjIC1sKSA9IDMgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1tYXgtY291bnQ9NSB8IHdjIC1sKSA9IDUgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1tYXgtY291bnQ9MTAgfCB3YyAtbCkgPSA1CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbWF4LWNvdW50IGFsbCBmb3JtcycgJworICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCAtLW1heC1jb3VudD0xIHwgd2MgLWwpID0gMSAmJgorICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCAtMSB8IHdjIC1sKSA9IDEgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLW4xIHwgd2MgLWwpID0gMSAmJgorICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCAtbiAxIHwgd2MgLWwpID0gMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXNraXAnICcKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1za2lwPTAgfCB3YyAtbCkgPSA1ICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCBIRUFEIC0tc2tpcD0zIHwgd2MgLWwpID0gMiAmJgorICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCAtLXNraXA9NSB8IHdjIC1sKSA9IDAgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1za2lwPTEwIHwgd2MgLWwpID0gMAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXNraXAgLS1tYXgtY291bnQnICcKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1za2lwPTAgLS1tYXgtY291bnQ9MCB8IHdjIC1sKSA9IDAgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1za2lwPTAgLS1tYXgtY291bnQ9MTAgfCB3YyAtbCkgPSA1ICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCBIRUFEIC0tc2tpcD0zIC0tbWF4LWNvdW50PTAgfCB3YyAtbCkgPSAwICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCBIRUFEIC0tc2tpcD0zIC0tbWF4LWNvdW50PTEgfCB3YyAtbCkgPSAxICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCBIRUFEIC0tc2tpcD0zIC0tbWF4LWNvdW50PTIgfCB3YyAtbCkgPSAyICYmCisgICAgdGVzdCAkKGdpdC1yZXYtbGlzdCBIRUFEIC0tc2tpcD0zIC0tbWF4LWNvdW50PTEwIHwgd2MgLWwpID0gMiAmJgorICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgSEVBRCAtLXNraXA9NSAtLW1heC1jb3VudD0xMCB8IHdjIC1sKSA9IDAgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0IEhFQUQgLS1za2lwPTEwIC0tbWF4LWNvdW50PTEwIHwgd2MgLWwpID0gMAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDYtcmV2LWxpc3QtZm9ybWF0LnNoIGIvdC90NjAwNi1yZXYtbGlzdC1mb3JtYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFiMTdmYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDYtcmV2LWxpc3QtZm9ybWF0LnNoCkBAIC0wLDAgKzEsMTUwIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXJldi1saXN0IC0tcHJldHR5PWZvcm1hdCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF90aWNrCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJwordG91Y2ggZm9vICYmIGdpdC1hZGQgZm9vICYmIGdpdC1jb21taXQgLW0gImFkZGVkIGZvbyIgJiYKKyAgZWNobyBjaGFuZ2VkID5mb28gJiYgZ2l0LWNvbW1pdCAtYSAtbSAiY2hhbmdlZCBmb28iCisnCisKKyMgdXNhZ2U6IHRlc3RfZm9ybWF0IG5hbWUgZm9ybWF0X3N0cmluZyA8ZXhwZWN0ZWRfb3V0cHV0Cit0ZXN0X2Zvcm1hdCgpIHsKKwljYXQgPmV4cGVjdC4kMQorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImZvcm1hdCAkMSIgIgorZ2l0LXJldi1saXN0IC0tcHJldHR5PWZvcm1hdDokMiBtYXN0ZXIgPm91dHB1dC4kMSAmJgorZ2l0LWRpZmYgZXhwZWN0LiQxIG91dHB1dC4kMQorIgorfQorCit0ZXN0X2Zvcm1hdCBoYXNoICVIJW4laCA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorMTMxYTMxMAorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzg2Yzc1Y2YKK0VPRgorCit0ZXN0X2Zvcm1hdCB0cmVlICVUJW4ldCA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorZmU3MjI2MTJmMjZkYTUwNjRjMzJjYTM4NDNhYTE1NGJkYjBiMDhhMAorZmU3MjI2MQorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzRkNWZjYWRjMjkzYTM0OGU4OGY3NzdkYzA5MjBmMTFlN2Q3MTQ0MWMKKzRkNWZjYWQKK0VPRgorCit0ZXN0X2Zvcm1hdCBwYXJlbnRzICVQJW4lcCA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorODZjNzVjZmQ3MDhhMGU1ODY4ZGM4NzZlZDViOGJiNjZjODBiNDg3MworODZjNzVjZgorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKworCitFT0YKKworIyB3ZSBkb24ndCB0ZXN0IHJlbGF0aXZlIGhlcmUKK3Rlc3RfZm9ybWF0IGF1dGhvciAlYW4lbiVhZSVuJWFkJW4lYUQlbiVhdCA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorQSBVIFRob3IKK2F1dGhvckBleGFtcGxlLmNvbQorVGh1IEFwciA3IDE1OjEzOjEzIDIwMDUgLTA3MDAKK1RodSwgNyBBcHIgMjAwNSAxNToxMzoxMyAtMDcwMAorMTExMjkxMTk5MworY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK0EgVSBUaG9yCithdXRob3JAZXhhbXBsZS5jb20KK1RodSBBcHIgNyAxNToxMzoxMyAyMDA1IC0wNzAwCitUaHUsIDcgQXByIDIwMDUgMTU6MTM6MTMgLTA3MDAKKzExMTI5MTE5OTMKK0VPRgorCit0ZXN0X2Zvcm1hdCBjb21taXR0ZXIgJWNuJW4lY2UlbiVjZCVuJWNEJW4lY3QgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK0MgTyBNaXR0ZXIKK2NvbW1pdHRlckBleGFtcGxlLmNvbQorVGh1IEFwciA3IDE1OjEzOjEzIDIwMDUgLTA3MDAKK1RodSwgNyBBcHIgMjAwNSAxNToxMzoxMyAtMDcwMAorMTExMjkxMTk5MworY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK0MgTyBNaXR0ZXIKK2NvbW1pdHRlckBleGFtcGxlLmNvbQorVGh1IEFwciA3IDE1OjEzOjEzIDIwMDUgLTA3MDAKK1RodSwgNyBBcHIgMjAwNSAxNToxMzoxMyAtMDcwMAorMTExMjkxMTk5MworRU9GCisKK3Rlc3RfZm9ybWF0IGVuY29kaW5nICVlIDw8J0VPRicKK2NvbW1pdCAxMzFhMzEwZWI5MTNkMTA3ZGQzYzA5YTY1ZDE2NTExNzU4OTg3MzVkCis8dW5rbm93bj4KK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCis8dW5rbm93bj4KK0VPRgorCit0ZXN0X2Zvcm1hdCBzdWJqZWN0ICVzIDw8J0VPRicKK2NvbW1pdCAxMzFhMzEwZWI5MTNkMTA3ZGQzYzA5YTY1ZDE2NTExNzU4OTg3MzVkCitjaGFuZ2VkIGZvbworY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK2FkZGVkIGZvbworRU9GCisKK3Rlc3RfZm9ybWF0IGJvZHkgJWIgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKzx1bmtub3duPgorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzx1bmtub3duPgorRU9GCisKK3Rlc3RfZm9ybWF0IGNvbG9ycyAlQ3JlZGZvbyVDZ3JlZW5iYXIlQ2JsdWViYXolQ3Jlc2V0eHl6enkgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKxtbMzFtZm9vG1szMm1iYXIbWzM0bWJhehtbbXh5enp5Citjb21taXQgODZjNzVjZmQ3MDhhMGU1ODY4ZGM4NzZlZDViOGJiNjZjODBiNDg3MworG1szMW1mb28bWzMybWJhchtbMzRtYmF6G1tteHl6enkKK0VPRgorCitjYXQgPmNvbW1pdC1tc2cgPDwnRU9GJworVGVzdCBwcmludGluZyBvZiBjb21wbGV4IGJvZGllcworCitUaGlzIGNvbW1pdCBtZXNzYWdlIGlzIG11Y2ggbG9uZ2VyIHRoYW4gdGhlIG90aGVycywKK2FuZCBpdCB3aWxsIGJlIGVuY29kZWQgaW4gaXNvODg1OS0xLiBXZSBzaG91bGQgdGhlcmVmb3JlCitpbmNsdWRlIGFuIGlzbzg4NTkgY2hhcmFjdGVyOiDCoWJ1ZW5vIQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCBjb21wbGV4IGJvZHknICcKK2dpdC1jb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBpc284ODU5LTEgJiYKKyAgZWNobyBjaGFuZ2UyID5mb28gJiYgZ2l0LWNvbW1pdCAtYSAtRiBjb21taXQtbXNnCisnCisKK3Rlc3RfZm9ybWF0IGNvbXBsZXgtZW5jb2RpbmcgJWUgPDwnRU9GJworY29tbWl0IGY1OGRiNzBiMDU1YzU3MTg2MzFlNWM2MTUyOGIyOGIxMjA5MGNkZWEKK2lzbzg4NTktMQorY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKzx1bmtub3duPgorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzx1bmtub3duPgorRU9GCisKK3Rlc3RfZm9ybWF0IGNvbXBsZXgtc3ViamVjdCAlcyA8PCdFT0YnCitjb21taXQgZjU4ZGI3MGIwNTVjNTcxODYzMWU1YzYxNTI4YjI4YjEyMDkwY2RlYQorVGVzdCBwcmludGluZyBvZiBjb21wbGV4IGJvZGllcworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK2NoYW5nZWQgZm9vCitjb21taXQgODZjNzVjZmQ3MDhhMGU1ODY4ZGM4NzZlZDViOGJiNjZjODBiNDg3MworYWRkZWQgZm9vCitFT0YKKwordGVzdF9mb3JtYXQgY29tcGxleC1ib2R5ICViIDw8J0VPRicKK2NvbW1pdCBmNThkYjcwYjA1NWM1NzE4NjMxZTVjNjE1MjhiMjhiMTIwOTBjZGVhCitUaGlzIGNvbW1pdCBtZXNzYWdlIGlzIG11Y2ggbG9uZ2VyIHRoYW4gdGhlIG90aGVycywKK2FuZCBpdCB3aWxsIGJlIGVuY29kZWQgaW4gaXNvODg1OS0xLiBXZSBzaG91bGQgdGhlcmVmb3JlCitpbmNsdWRlIGFuIGlzbzg4NTkgY2hhcmFjdGVyOiDCoWJ1ZW5vIQorCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorPHVua25vd24+Citjb21taXQgODZjNzVjZmQ3MDhhMGU1ODY4ZGM4NzZlZDViOGJiNjZjODBiNDg3MworPHVua25vd24+CitFT0YKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDEwLW1lcmdlLWJhc2Uuc2ggYi90L3Q2MDEwLW1lcmdlLWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjJlMDg5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMTAtbWVyZ2UtYmFzZS5zaApAQCAtMCwwICsxLDExMCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNZXJnZSBiYXNlIGNvbXB1dGF0aW9uLgorJworCisuIC4vdGVzdC1saWIuc2gKKworVD0kKGdpdC13cml0ZS10cmVlKQorCitNPTExMzAwMDAwMDAKK1o9KzAwMDAKKworZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9Z2l0QGNvbW0uaXRlci54egorZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0nQyBPIE1taXRlcicKK2V4cG9ydCBHSVRfQVVUSE9SX05BTUU9J0EgVSBUaG9yJworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Z2l0QGF1LnRob3IueHoKKworZG9pdCgpIHsKKwlPRkZTRVQ9JDE7IHNoaWZ0CisJTkFNRT0kMTsgc2hpZnQKKwlQQVJFTlRTPQorCWZvciBQCisJZG8KKwkJUEFSRU5UUz0iJHtQQVJFTlRTfS1wICRQICIKKwlkb25lCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIkKCgkTSArICRPRkZTRVQpKSAkWiIKKwlHSVRfQVVUSE9SX0RBVEU9JEdJVF9DT01NSVRURVJfREFURQorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCisJY29tbWl0PSQoZWNobyAkTkFNRSB8IGdpdC1jb21taXQtdHJlZSAkVCAkUEFSRU5UUykKKwllY2hvICRjb21taXQgPi5naXQvcmVmcy90YWdzLyROQU1FCisJZWNobyAkY29tbWl0Cit9CisKKyMgIEUtLS1ELS0tQy0tLUItLS1BCisjICBcJy1fICAgICAgICAgXCAgIFwKKyMgICBcICBgLS0tLS0tLS0tRyAgIFwKKyMgICAgXCAgICAgICAgICAgICAgICBcCisjICAgICBGLS0tLS0tLS0tLS0tLS0tLUgKKworIyBTZXR1cC4uLgorRT0kKGRvaXQgNSBFKQorRD0kKGRvaXQgNCBEICRFKQorRj0kKGRvaXQgNiBGICRFKQorQz0kKGRvaXQgMyBDICREKQorQj0kKGRvaXQgMiBCICRDKQorQT0kKGRvaXQgMSBBICRCKQorRz0kKGRvaXQgNyBHICRCICRFKQorSD0kKGRvaXQgOCBIICRBICRGKQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2UgKHNpbmdsZSknIFwKKyAgICAnTUI9JChnaXQtbWVyZ2UtYmFzZSBHIEgpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSAoYWxsKScgXAorICAgICdNQj0kKGdpdC1tZXJnZS1iYXNlIC0tYWxsIEcgSCkgJiYKKyAgICAgZXhwciAiJChnaXQtbmFtZS1yZXYgIiRNQiIpIiA6ICJbMC05YS1mXSogdGFncy9CIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIHdpdGggc2hvdy1icmFuY2gnIFwKKyAgICAnTUI9JChnaXQtc2hvdy1icmFuY2ggLS1tZXJnZS1iYXNlIEcgSCkgJiYKKyAgICAgZXhwciAiJChnaXQtbmFtZS1yZXYgIiRNQiIpIiA6ICJbMC05YS1mXSogdGFncy9CIicKKworIyBTZXR1cCBmb3Igc2Vjb25kIHRlc3QgdG8gZGVtb25zdHJhdGUgdGhhdCByZWx5aW5nIG9uIHRpbWVzdGFtcHMgaW4gYQorIyBkaXN0cmlidXRlZCBTQ00gdG8gcHJvdmlkZSBhIF9jb25zaXN0ZW50XyBwYXJ0aWFsIG9yZGVyaW5nIG9mIGNvbW1pdHMKKyMgbGVhZHMgdG8gaW5zYW5pdHkuCisjCisjICAgICAgICAgICAgICAgUmVsYXRpdmUKKyMgU3RydWN0dXJlICAgICB0aW1lc3RhbXBzCisjCisjICAgUEwgIFBSICAgICAgICArNCAgKzQKKyMgIC8gIFwvICBcICAgICAgLyAgXC8gIFwKKyMgTDIgIEMyICBSMiAgICArMyAgLTEgICszCisjIHwgICB8ICAgfCAgICAgfCAgIHwgICB8CisjIEwxICBDMSAgUjEgICAgKzIgIC0yICArMgorIyB8ICAgfCAgIHwgICAgIHwgICB8ICAgfAorIyBMMCAgQzAgIFIwICAgICsxICAtMyAgKzEKKyMgICBcIHwgIC8gICAgICAgIFwgfCAgLworIyAgICAgUyAgICAgICAgICAgICAwCisjCisjIFRoZSBsZWZ0IGFuZCByaWdodCBjaGFpbnMgb2YgY29tbWl0cyBjYW4gYmUgb2YgYW55IGxlbmd0aCBhbmQgY29tcGxleGl0eSBhcworIyBsb25nIGFzIGFsbCBvZiB0aGUgdGltZXN0YW1wcyBhcmUgZ3JlYXRlciB0aGFuIHRoYXQgb2YgUy4KKworUz0kKGRvaXQgIDAgUykKKworQzA9JChkb2l0IC0zIEMwICRTKQorQzE9JChkb2l0IC0yIEMxICRDMCkKK0MyPSQoZG9pdCAtMSBDMiAkQzEpCisKK0wwPSQoZG9pdCAgMSBMMCAkUykKK0wxPSQoZG9pdCAgMiBMMSAkTDApCitMMj0kKGRvaXQgIDMgTDIgJEwxKQorCitSMD0kKGRvaXQgIDEgUjAgJFMpCitSMT0kKGRvaXQgIDIgUjEgJFIwKQorUjI9JChkb2l0ICAzIFIyICRSMSkKKworUEw9JChkb2l0ICA0IFBMICRMMiAkQzIpCitQUj0kKGRvaXQgIDQgUFIgJEMyICRSMikKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIChzaW5nbGUpJyBcCisgICAgJ01CPSQoZ2l0LW1lcmdlLWJhc2UgUEwgUFIpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQzIiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2UgKGFsbCknIFwKKyAgICAnTUI9JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCBQTCBQUikgJiYKKyAgICAgZXhwciAiJChnaXQtbmFtZS1yZXYgIiRNQiIpIiA6ICJbMC05YS1mXSogdGFncy9DMiInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyMC1tZXJnZS1kZi5zaCBiL3QvdDYwMjAtbWVyZ2UtZGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTE5ZDQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjAtbWVyZ2UtZGYuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBGcmVkcmlrIEt1aXZpbmVuCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbWVyZ2Ugd2l0aCBkaXJlY3RvcnkvZmlsZSBjb25mbGljdHMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyZSByZXBvc2l0b3J5JyBcCisnZWNobyAiSGVsbG8iID4gaW5pdCAmJgorZ2l0IGFkZCBpbml0ICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgJiYKK2dpdCBicmFuY2ggQiAmJgorbWtkaXIgZGlyICYmCitlY2hvICJmb28iID4gZGlyL2ZvbyAmJgorZ2l0IGFkZCBkaXIvZm9vICYmCitnaXQgY29tbWl0IC1tICJGaWxlOiBkaXIvZm9vIiAmJgorZ2l0IGNoZWNrb3V0IEIgJiYKK2VjaG8gImZpbGUgZGlyIiA+IGRpciAmJgorZ2l0IGFkZCBkaXIgJiYKK2dpdCBjb21taXQgLW0gIkZpbGU6IGRpciInCisKK3Rlc3RfZXhwZWN0X2NvZGUgMSAnTWVyZ2Ugd2l0aCBkL2YgY29uZmxpY3RzJyAnZ2l0IG1lcmdlICJtZXJnZSBtc2ciIEIgbWFzdGVyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjEtbWVyZ2UtY3Jpc3MtY3Jvc3Muc2ggYi90L3Q2MDIxLW1lcmdlLWNyaXNzLWNyb3NzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5OWNhZmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIxLW1lcmdlLWNyaXNzLWNyb3NzLnNoCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgRnJlZHJpayBLdWl2aW5lbgorIworCisjIFNlZSBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWdpdCZtPTExMTQ2MzM1ODUwMDM2MiZ3PTIgZm9yIGEKKyMgbmljZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgaXMgYWJvdXQuCisKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBjcmlzcy1jcm9zcyBtZXJnZScKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHJlcG9zaXRvcnknIFwKKydlY2hvICIxCisyCiszCis0Cis1Cis2Cis3Cis4Cis5IiA+IGZpbGUgJiYKK2dpdCBhZGQgZmlsZSAmJiAKK2dpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0IiBmaWxlICYmCitnaXQgYnJhbmNoIEEgJiYKK2dpdCBicmFuY2ggQiAmJgorZ2l0IGNoZWNrb3V0IEEgJiYKK2VjaG8gIjEKKzIKKzMKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBCOCwgYnJhbmNoIEEKKzkiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSAiQjgiIGZpbGUgJiYKK2dpdCBjaGVja291dCBCICYmCitlY2hvICIxCisyCiszIGNoYW5nZWQgaW4gQzMsIGJyYW5jaCBCCis0Cis1Cis2Cis3Cis4Cis5CisiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSAiQzMiIGZpbGUgJiYKK2dpdCBicmFuY2ggQzMgJiYKK2dpdCBtZXJnZSAicHJlIEUzIG1lcmdlIiBCIEEgJiYKK2VjaG8gIjEKKzIKKzMgY2hhbmdlZCBpbiBFMywgYnJhbmNoIEIuIE5ldyBmaWxlIHNpemUKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBCOCwgYnJhbmNoIEEKKzkKKyIgPiBmaWxlICYmCitnaXQgY29tbWl0IC1tICJFMyIgZmlsZSAmJgorZ2l0IGNoZWNrb3V0IEEgJiYKK2dpdCBtZXJnZSAicHJlIEQ4IG1lcmdlIiBBIEMzICYmCitlY2hvICIxCisyCiszIGNoYW5nZWQgaW4gQzMsIGJyYW5jaCBCCis0Cis1Cis2Cis3Cis4IGNoYW5nZWQgaW4gRDgsIGJyYW5jaCBBLiBOZXcgZmlsZSBzaXplIDIKKzkiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSBEOCBmaWxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDcmlzcy1jcm9zcyBtZXJnZScgJ2dpdCBtZXJnZSAiZmluYWwgbWVyZ2UiIEEgQicKKworY2F0ID4gZmlsZS1leHBlY3QgPDxFT0YKKzEKKzIKKzMgY2hhbmdlZCBpbiBFMywgYnJhbmNoIEIuIE5ldyBmaWxlIHNpemUKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBEOCwgYnJhbmNoIEEuIE5ldyBmaWxlIHNpemUgMgorOQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NyaXNzLWNyb3NzIG1lcmdlIHJlc3VsdCcgJ2NtcCBmaWxlIGZpbGUtZXhwZWN0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjItbWVyZ2UtcmVuYW1lLnNoIGIvdC90NjAyMi1tZXJnZS1yZW5hbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNmN2FlOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjItbWVyZ2UtcmVuYW1lLnNoCkBAIC0wLDAgKzEsMzQ0IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nTWVyZ2UtcmVjdXJzaXZlIG1lcmdpbmcgcmVuYW1lcycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwIFwKKycKK2NhdCA+QSA8PFxFT0YgJiYKK2EgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCitiIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorYyBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKK2QgZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkCitlIGVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZQorZiBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKK2cgZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnCitoIGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAoraSBpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkKK2ogampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqCitrIGtra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2traworbCBsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwKK20gbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tCituIG5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubgorbyBvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb28KK0VPRgorCitjYXQgPk0gPDxcRU9GICYmCitBIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQorQiBCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIKK0MgQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDCitEIERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERAorRSBFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUUKK0YgRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCitHIEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRworSCBISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgKK0kgSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJCitKIEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSgorSyBLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0sKK0wgTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCitNIE1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQorTiBOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4KK08gT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PCitFT0YKKworZ2l0IGFkZCBBIE0gJiYKK2dpdCBjb21taXQgLW0gImluaXRpYWwgaGFzIEEgYW5kIE0iICYmCitnaXQgYnJhbmNoIHdoaXRlICYmCitnaXQgYnJhbmNoIHJlZCAmJgorZ2l0IGJyYW5jaCBibHVlICYmCitnaXQgYnJhbmNoIHllbGxvdyAmJgorZ2l0IGJyYW5jaCBjaGFuZ2UgJiYKK2dpdCBicmFuY2ggY2hhbmdlK3JlbmFtZSAmJgorCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogbWFzdGVyIGNoYW5nZXMgYSBsaW5lLyIgPEEgPkErICYmCittdiBBKyBBICYmCitnaXQgY29tbWl0IC1hIC1tICJtYXN0ZXIgdXBkYXRlcyBBIiAmJgorCitnaXQgY2hlY2tvdXQgeWVsbG93ICYmCitybSAtZiBNICYmCitnaXQgY29tbWl0IC1hIC1tICJ5ZWxsb3cgcmVtb3ZlcyBNIiAmJgorCitnaXQgY2hlY2tvdXQgd2hpdGUgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiB3aGl0ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQiBNIE4gJiYKK2dpdCBjb21taXQgLW0gIndoaXRlIHJlbmFtZXMgQS0+QiwgTS0+TiIgJiYKKworZ2l0IGNoZWNrb3V0IHJlZCAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IHJlZCBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQiBNIE4gJiYKK2dpdCBjb21taXQgLW0gInJlZCByZW5hbWVzIEEtPkIsIE0tPk4iICYmCisKK2dpdCBjaGVja291dCBibHVlICYmCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogYmx1ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5DICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQyBNIE4gJiYKK2dpdCBjb21taXQgLW0gImJsdWUgcmVuYW1lcyBBLT5DLCBNLT5OIiAmJgorCitnaXQgY2hlY2tvdXQgY2hhbmdlICYmCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogY2hhbmdlZCBsaW5lLyIgPEEgPkErICYmCittdiBBKyBBICYmCitnaXQgY29tbWl0IC1xIC1hIC1tICJjaGFuZ2VkIiAmJgorCitnaXQgY2hlY2tvdXQgY2hhbmdlK3JlbmFtZSAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IGNoYW5nZWQgbGluZS8iIDxBID5CICYmCitybSBBICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEIgJiYKK2dpdCBjb21taXQgLXEgLWEgLW0gImNoYW5nZWQgYW5kIHJlbmFtZWQiICYmCisKK2dpdCBjaGVja291dCBtYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGwgcmVuYW1pbmcgYnJhbmNoIGludG8gdW5yZW5hbWluZyBvbmUnIFwKKycKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIHdoaXRlICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlyZXR1cm4gMQorCX0KKwlnaXQgbHMtZmlsZXMgLXMKKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBzdGFnZXMgZm9yIEIiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1zIE4gfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBtZXJnZWQgTiIKKwkJcmV0dXJuIDEKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIG1hc3RlciB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGRpZmYgd2hpdGUgTiB8IHdjIC1sKSIgLWVxIDAgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHRha2VuIGNvbG9yZWQgYnJhbmNoIgorCQlyZXR1cm4gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCByZW5hbWluZyBicmFuY2ggaW50byBhbm90aGVyIHJlbmFtaW5nIG9uZScgXAorJworCXJtIC1mIEIKKwlnaXQgcmVzZXQgLS1oYXJkCisJZ2l0IGNoZWNrb3V0IHJlZAorCWdpdCBwdWxsIC4gd2hpdGUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAzIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IHN0YWdlcyIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXMgTiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIG1lcmdlZCBOIgorCQlyZXR1cm4gMQorCX0KKwlzZWQgLW5lICIvXmcveworCXAKKwlxCisJfSIgQiB8IGdyZXAgcmVkIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsaXN0ZWQgb3VyIGNoYW5nZSBmaXJzdCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgZGlmZiB3aGl0ZSBOIHwgd2MgLWwpIiAtZXEgMCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgdGFrZW4gY29sb3JlZCBicmFuY2giCisJCXJldHVybiAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIHVucmVuYW1pbmcgYnJhbmNoIGludG8gcmVuYW1pbmcgb25lJyBcCisnCisJZ2l0IHJlc2V0IC0taGFyZAorCWdpdCBzaG93LWJyYW5jaAorCWdpdCBwdWxsIC4gbWFzdGVyICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBzdGFnZXMiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1zIE4gfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBtZXJnZWQgTiIKKwkJcmV0dXJuIDEKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGRpZmYgd2hpdGUgTiB8IHdjIC1sKSIgLWVxIDAgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHRha2VuIGNvbG9yZWQgYnJhbmNoIgorCQlyZXR1cm4gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCBjb25mbGljdGluZyByZW5hbWVzJyBcCisnCisJZ2l0IHJlc2V0IC0taGFyZAorCWdpdCBzaG93LWJyYW5jaAorCWdpdCBwdWxsIC4gYmx1ZSAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQSB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgYSBzdGFnZSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgYSBzdGFnZSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQyB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgYSBzdGFnZSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXMgTiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIG1lcmdlZCBOIgorCQlyZXR1cm4gMQorCX0KKwlzZWQgLW5lICIvXmcveworCXAKKwlxCisJfSIgQiB8IGdyZXAgcmVkIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsaXN0ZWQgb3VyIGNoYW5nZSBmaXJzdCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgZGlmZiB3aGl0ZSBOIHwgd2MgLWwpIiAtZXEgMCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgdGFrZW4gY29sb3JlZCBicmFuY2giCisJCXJldHVybiAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnRlcmZlcmVuY2Ugd2l0aCB1bnRyYWNrZWQgd29ya2luZyB0cmVlIGZpbGUnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgc2hvdy1icmFuY2gKKwllY2hvID5BIHRoaXMgZmlsZSBzaG91bGQgbm90IG1hdHRlcgorCWdpdCBwdWxsIC4gd2hpdGUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCXJldHVybiAxCisJfQorCXRlc3QgLWYgQSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBBIGludGFjdCIKKwkJcmV0dXJuIDEKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludGVyZmVyZW5jZSB3aXRoIHVudHJhY2tlZCB3b3JraW5nIHRyZWUgZmlsZScgJworCisJZ2l0IHJlc2V0IC0taGFyZAorCWdpdCBjaGVja291dCB3aGl0ZQorCWdpdCBzaG93LWJyYW5jaAorCXJtIC1mIEEKKwllY2hvID5BIHRoaXMgZmlsZSBzaG91bGQgbm90IG1hdHRlcgorCWdpdCBwdWxsIC4gcmVkICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIEEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgQSBpbnRhY3QiCisJCXJldHVybiAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnRlcmZlcmVuY2Ugd2l0aCB1bnRyYWNrZWQgd29ya2luZyB0cmVlIGZpbGUnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlybSAtZiBBIE0KKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyCisJZ2l0IHRhZyAtZiBhbmNob3IKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIHllbGxvdyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY2xlYW5seSBtZXJnZWQiCisJCXJldHVybiAxCisJfQorCXRlc3QgLWYgTSAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgcmVtb3ZlZCBNIgorCQlyZXR1cm4gMQorCX0KKwlnaXQgcmVzZXQgLS1oYXJkIGFuY2hvcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGVkIHdvcmtpbmcgdHJlZSBmaWxlIHNob3VsZCBwcmV2ZW50IHRoZSBtZXJnZScgJworCisJZ2l0IHJlc2V0IC0taGFyZAorCXJtIC1mIEEgTQorCWdpdCBjaGVja291dCAtZiBtYXN0ZXIKKwlnaXQgdGFnIC1mIGFuY2hvcgorCWdpdCBzaG93LWJyYW5jaAorCWVjaG8gPj5NIG9uZSBsaW5lIGFkZGl0aW9uCisJY2F0IE0gPk0uc2F2ZWQKKwlnaXQgcHVsbCAuIHllbGxvdyAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29tcGxhaW5lZCIKKwkJcmV0dXJuIDEKKwl9CisJZGlmZiBNIE0uc2F2ZWQgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgTSBpbnRhY3QiCisJCXJldHVybiAxCisJfQorCXJtIC1mIE0uc2F2ZWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlZCB3b3JraW5nIHRyZWUgZmlsZSBzaG91bGQgcHJldmVudCB0aGUgbWVyZ2UnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlybSAtZiBBIE0KKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyCisJZ2l0IHRhZyAtZiBhbmNob3IKKwlnaXQgc2hvdy1icmFuY2gKKwllY2hvID4+TSBvbmUgbGluZSBhZGRpdGlvbgorCWNhdCBNID5NLnNhdmVkCisJZ2l0IHVwZGF0ZS1pbmRleCBNCisJZ2l0IHB1bGwgLiB5ZWxsb3cgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbXBsYWluZWQiCisJCXJldHVybiAxCisJfQorCWRpZmYgTSBNLnNhdmVkIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IE0gaW50YWN0IgorCQlyZXR1cm4gMQorCX0KKwlybSAtZiBNLnNhdmVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludGVyZmVyZW5jZSB3aXRoIHVudHJhY2tlZCB3b3JraW5nIHRyZWUgZmlsZScgJworCisJZ2l0IHJlc2V0IC0taGFyZAorCXJtIC1mIEEgTQorCWdpdCBjaGVja291dCAtZiB5ZWxsb3cKKwlnaXQgdGFnIC1mIGFuY2hvcgorCWdpdCBzaG93LWJyYW5jaAorCWVjaG8gPk0gdGhpcyBmaWxlIHNob3VsZCBub3QgbWF0dGVyCisJZ2l0IHB1bGwgLiBtYXN0ZXIgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNsZWFubHkgbWVyZ2VkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIE0gfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgTSBpbnRhY3QiCisJCXJldHVybiAxCisJfQorCWdpdCBscy1maWxlcyAtcyB8IGdyZXAgTSAmJiB7CisJCWVjaG8gIkJBRDogTSBtdXN0IGJlIHVudHJhY2tlZCBpbiB0aGUgcmVzdWx0IgorCQlyZXR1cm4gMQorCX0KKwlnaXQgcmVzZXQgLS1oYXJkIGFuY2hvcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBvZiBpZGVudGljYWwgY2hhbmdlcyBpbiBhIHJlbmFtZWQgZmlsZScgJworCXJtIC1mIEEgTSBOCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCBjaGFuZ2UrcmVuYW1lICYmCisJR0lUX01FUkdFX1ZFUkJPU0lUWT0zIGdpdCBtZXJnZSBjaGFuZ2UgfCBncmVwICJeU2tpcHBlZCBCIiAmJgorCWdpdCByZXNldCAtLWhhcmQgSEVBRF4gJiYKKwlnaXQgY2hlY2tvdXQgY2hhbmdlICYmCisJR0lUX01FUkdFX1ZFUkJPU0lUWT0zIGdpdCBtZXJnZSBjaGFuZ2UrcmVuYW1lIHwgZ3JlcCAiXlNraXBwZWQgQiIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDIzLW1lcmdlLWZpbGUuc2ggYi90L3Q2MDIzLW1lcmdlLWZpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzc2ZmNjZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjMtbWVyZ2UtZmlsZS5zaApAQCAtMCwwICsxLDEzOCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J1JDUyBtZXJnZSByZXBsYWNlbWVudDogbWVyZ2UtZmlsZScKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPiBvcmlnLnR4dCA8PCBFT0YKK0RvbWludXMgcmVnaXQgbWUsCitldCBuaWhpbCBtaWhpIGRlZXJpdC4KK0luIGxvY28gcGFzY3VhZSBpYmkgbWUgY29sbG9jYXZpdCwKK3N1cGVyIGFxdWFtIHJlZmVjdGlvbmlzIGVkdWNhdml0IG1lOworYW5pbWFtIG1lYW0gY29udmVydGl0LAorZGVkdXhpdCBtZSBzdXBlciBzZW1pdGFzIGp1c2l0aWFlLAorcHJvcHRlciBub21lbiBzdXVtLgorRU9GCisKK2NhdCA+IG5ldzEudHh0IDw8IEVPRgorRG9taW51cyByZWdpdCBtZSwKK2V0IG5paGlsIG1paGkgZGVlcml0LgorSW4gbG9jbyBwYXNjdWFlIGliaSBtZSBjb2xsb2Nhdml0LAorc3VwZXIgYXF1YW0gcmVmZWN0aW9uaXMgZWR1Y2F2aXQgbWU7CithbmltYW0gbWVhbSBjb252ZXJ0aXQsCitkZWR1eGl0IG1lIHN1cGVyIHNlbWl0YXMganVzaXRpYWUsCitwcm9wdGVyIG5vbWVuIHN1dW0uCitOYW0gZXQgc2kgYW1idWxhdmVybyBpbiBtZWRpbyB1bWJyYWUgbW9ydGlzLAorbm9uIHRpbWVibyBtYWxhLCBxdW9uaWFtIHR1IG1lY3VtIGVzOgordmlyZ2EgdHVhIGV0IGJhY3VsdXMgdHV1cyBpcHNhIG1lIGNvbnNvbGF0YSBzdW50LgorRU9GCisKK2NhdCA+IG5ldzIudHh0IDw8IEVPRgorRG9taW51cyByZWdpdCBtZSwgZXQgbmloaWwgbWloaSBkZWVyaXQuCitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK0VPRgorCitjYXQgPiBuZXczLnR4dCA8PCBFT0YKK0RPTUlOVVMgcmVnaXQgbWUsCitldCBuaWhpbCBtaWhpIGRlZXJpdC4KK0luIGxvY28gcGFzY3VhZSBpYmkgbWUgY29sbG9jYXZpdCwKK3N1cGVyIGFxdWFtIHJlZmVjdGlvbmlzIGVkdWNhdml0IG1lOworYW5pbWFtIG1lYW0gY29udmVydGl0LAorZGVkdXhpdCBtZSBzdXBlciBzZW1pdGFzIGp1c2l0aWFlLAorcHJvcHRlciBub21lbiBzdXVtLgorRU9GCisKK2NhdCA+IG5ldzQudHh0IDw8IEVPRgorRG9taW51cyByZWdpdCBtZSwgZXQgbmloaWwgbWloaSBkZWVyaXQuCitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK0VPRgorcHJpbnRmICJwcm9wdGVyIG5vbWVuIHN1dW0uIiA+PiBuZXc0LnR4dAorCitjcCBuZXcxLnR4dCB0ZXN0LnR4dAordGVzdF9leHBlY3Rfc3VjY2VzcyAibWVyZ2Ugd2l0aG91dCBjb25mbGljdCIgXAorCSJnaXQtbWVyZ2UtZmlsZSB0ZXN0LnR4dCBvcmlnLnR4dCBuZXcyLnR4dCIKKworY3AgbmV3MS50eHQgdGVzdDIudHh0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJtZXJnZSB3aXRob3V0IGNvbmZsaWN0IChtaXNzaW5nIExGIGF0IEVPRikiIFwKKwkiZ2l0LW1lcmdlLWZpbGUgdGVzdDIudHh0IG9yaWcudHh0IG5ldzIudHh0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJtZXJnZSByZXN1bHQgYWRkZWQgbWlzc2luZyBMRiIgXAorCSJnaXQgZGlmZiB0ZXN0LnR4dCB0ZXN0Mi50eHQiCisKK2NwIHRlc3QudHh0IGJhY2t1cC50eHQKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIm1lcmdlIHdpdGggY29uZmxpY3RzIiBcCisJImdpdC1tZXJnZS1maWxlIHRlc3QudHh0IG9yaWcudHh0IG5ldzMudHh0IgorCitjYXQgPiBleHBlY3QudHh0IDw8IEVPRgorPDw8PDw8PCB0ZXN0LnR4dAorRG9taW51cyByZWdpdCBtZSwgZXQgbmloaWwgbWloaSBkZWVyaXQuCis9PT09PT09CitET01JTlVTIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCis+Pj4+Pj4+IG5ldzMudHh0CitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK05hbSBldCBzaSBhbWJ1bGF2ZXJvIGluIG1lZGlvIHVtYnJhZSBtb3J0aXMsCitub24gdGltZWJvIG1hbGEsIHF1b25pYW0gdHUgbWVjdW0gZXM6Cit2aXJnYSB0dWEgZXQgYmFjdWx1cyB0dXVzIGlwc2EgbWUgY29uc29sYXRhIHN1bnQuCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZXhwZWN0ZWQgY29uZmxpY3QgbWFya2VycyIgImdpdCBkaWZmIHRlc3QudHh0IGV4cGVjdC50eHQiCisKK2NwIGJhY2t1cC50eHQgdGVzdC50eHQKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIm1lcmdlIHdpdGggY29uZmxpY3RzLCB1c2luZyAtTCIgXAorCSJnaXQtbWVyZ2UtZmlsZSAtTCAxIC1MIDIgdGVzdC50eHQgb3JpZy50eHQgbmV3My50eHQiCisKK2NhdCA+IGV4cGVjdC50eHQgPDwgRU9GCis8PDw8PDw8IDEKK0RvbWludXMgcmVnaXQgbWUsIGV0IG5paGlsIG1paGkgZGVlcml0LgorPT09PT09PQorRE9NSU5VUyByZWdpdCBtZSwKK2V0IG5paGlsIG1paGkgZGVlcml0LgorPj4+Pj4+PiBuZXczLnR4dAorSW4gbG9jbyBwYXNjdWFlIGliaSBtZSBjb2xsb2Nhdml0LAorc3VwZXIgYXF1YW0gcmVmZWN0aW9uaXMgZWR1Y2F2aXQgbWU7CithbmltYW0gbWVhbSBjb252ZXJ0aXQsCitkZWR1eGl0IG1lIHN1cGVyIHNlbWl0YXMganVzaXRpYWUsCitwcm9wdGVyIG5vbWVuIHN1dW0uCitOYW0gZXQgc2kgYW1idWxhdmVybyBpbiBtZWRpbyB1bWJyYWUgbW9ydGlzLAorbm9uIHRpbWVibyBtYWxhLCBxdW9uaWFtIHR1IG1lY3VtIGVzOgordmlyZ2EgdHVhIGV0IGJhY3VsdXMgdHV1cyBpcHNhIG1lIGNvbnNvbGF0YSBzdW50LgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImV4cGVjdGVkIGNvbmZsaWN0IG1hcmtlcnMsIHdpdGggLUwiIFwKKwkiZ2l0IGRpZmYgdGVzdC50eHQgZXhwZWN0LnR4dCIKKworc2VkICJzLyB0dSAvIFRVIC8iIDwgbmV3MS50eHQgPiBuZXc1LnR4dAordGVzdF9leHBlY3RfZmFpbHVyZSAiY29uZmxpY3QgaW4gcmVtb3ZlZCB0YWlsIiBcCisJImdpdC1tZXJnZS1maWxlIC1wIG9yaWcudHh0IG5ldzEudHh0IG5ldzUudHh0ID4gb3V0IgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitEb21pbnVzIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KKzw8PDw8PDwgb3JpZy50eHQKKz09PT09PT0KK05hbSBldCBzaSBhbWJ1bGF2ZXJvIGluIG1lZGlvIHVtYnJhZSBtb3J0aXMsCitub24gdGltZWJvIG1hbGEsIHF1b25pYW0gVFUgbWVjdW0gZXM6Cit2aXJnYSB0dWEgZXQgYmFjdWx1cyB0dXVzIGlwc2EgbWUgY29uc29sYXRhIHN1bnQuCis+Pj4+Pj4+IG5ldzUudHh0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZXhwZWN0ZWQgY29uZmxpY3QgbWFya2VycyIgImdpdCBkaWZmIGV4cGVjdCBvdXQiCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q2MDIzLW1lcmdlLXJlbmFtZS1ub2NydWZ0LnNoIGIvdC90NjAyMy1tZXJnZS1yZW5hbWUtbm9jcnVmdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NWJlOTVmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyMy1tZXJnZS1yZW5hbWUtbm9jcnVmdC5zaApAQCAtMCwwICsxLDEzOSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J01lcmdlLXJlY3Vyc2l2ZSBtZXJnaW5nIHJlbmFtZXMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCBcCisnCitjYXQgPkEgPDxcRU9GICYmCithIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorYiBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKK2MgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCitkIGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZAorZSBlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUKK2YgZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCitnIGdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZworaCBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGgKK2kgaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpCitqIGpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqagorayBra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2sKK2wgbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsCittIG1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbQorbiBubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm4KK28gb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vCitFT0YKKworY2F0ID5NIDw8XEVPRiAmJgorQSBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0IgQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCCitDIENDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQworRCBEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQKK0UgRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFCitGIEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgorRyBHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cKK0ggSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhICitJIElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSQorSiBKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKK0sgS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLCitMIExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAorTSBNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0KK04gTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCitPIE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTworRU9GCisKK2dpdCBhZGQgQSBNICYmCitnaXQgY29tbWl0IC1tICJpbml0aWFsIGhhcyBBIGFuZCBNIiAmJgorZ2l0IGJyYW5jaCB3aGl0ZSAmJgorZ2l0IGJyYW5jaCByZWQgJiYKK2dpdCBicmFuY2ggYmx1ZSAmJgorCitnaXQgY2hlY2tvdXQgd2hpdGUgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiB3aGl0ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQiBNIE4gJiYKK2dpdCBjb21taXQgLW0gIndoaXRlIHJlbmFtZXMgQS0+QiwgTS0+TiIgJiYKKworZ2l0IGNoZWNrb3V0IHJlZCAmJgorZWNobyBjcmVhdGVkIGJ5IHJlZCA+UiAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBSICYmCitnaXQgY29tbWl0IC1tICJyZWQgY3JlYXRlcyBSIiAmJgorCitnaXQgY2hlY2tvdXQgYmx1ZSAmJgorc2VkIC1lICIvXm8gL3MvLiovZyA6IGJsdWUgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QiAmJgorcm0gLWYgQSAmJgorbXYgQiBBICYmCitnaXQgdXBkYXRlLWluZGV4IEEgJiYKK2dpdCBjb21taXQgLW0gImJsdWUgbW9kaWZ5IEEiICYmCisKK2dpdCBjaGVja291dCBtYXN0ZXInCisKKyMgVGhpcyB0ZXN0IGJyb2tlIGluIDY1YWM2ZTljM2Y0NzgwN2NiNjAzYWYwN2E2YTllMWE0M2JjMTE5YWUKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIHdoaXRlIGludG8gcmVkIChBLT5CLE0tPk4pJyBcCisnCisJZ2l0IGNoZWNrb3V0IC1iIHJlZC13aGl0ZSByZWQgJiYKKwlnaXQgbWVyZ2Ugd2hpdGUgJiYKKwlnaXQgd3JpdGUtdHJlZSA+L2Rldi9udWxsIHx8IHsKKwkJZWNobyAiQkFEOiBtZXJnZSBkaWQgbm90IGNvbXBsZXRlIgorCQlyZXR1cm4gMQorCX0KKworCXRlc3QgLWYgQiB8fCB7CisJCWVjaG8gIkJBRDogQiBkb2VzIG5vdCBleGlzdCBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBOIHx8IHsKKwkJZWNobyAiQkFEOiBOIGRvZXMgbm90IGV4aXN0IGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIFIgfHwgeworCQllY2hvICJCQUQ6IFIgZG9lcyBub3QgZXhpc3QgaW4gd29ya2luZyBkaXJlY3RvcnkiCisJCXJldHVybiAxCisJfQorCisJdGVzdCAtZiBBICYmIHsKKwkJZWNobyAiQkFEOiBBIHN0aWxsIGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBNICYmIHsKKwkJZWNobyAiQkFEOiBNIHN0aWxsIGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJcmV0dXJuIDAKKycKKworIyBUaGlzIHRlc3QgYnJva2UgaW4gODM3MTIzNGVjYWFmNmUxNGZlM2YyMDgyYTg1NWVmZjFiYmQ3OWFlOQordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYmx1ZSBpbnRvIHdoaXRlIChBLT5CLCBtb2QgQSwgQSB1bnRyYWNrZWQpJyBcCisnCisJZ2l0IGNoZWNrb3V0IC1iIHdoaXRlLWJsdWUgd2hpdGUgJiYKKwllY2hvIGRpcnR5ID5BICYmCisJZ2l0IG1lcmdlIGJsdWUgJiYKKwlnaXQgd3JpdGUtdHJlZSA+L2Rldi9udWxsIHx8IHsKKwkJZWNobyAiQkFEOiBtZXJnZSBkaWQgbm90IGNvbXBsZXRlIgorCQlyZXR1cm4gMQorCX0KKworCXRlc3QgLWYgQSB8fCB7CisJCWVjaG8gIkJBRDogQSBkb2VzIG5vdCBleGlzdCBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCBgY2F0IEFgID0gZGlydHkgfHwgeworCQllY2hvICJCQUQ6IEEgY29udGVudCBpcyB3cm9uZyIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBCIHx8IHsKKwkJZWNobyAiQkFEOiBCIGRvZXMgbm90IGV4aXN0IGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIE4gfHwgeworCQllY2hvICJCQUQ6IE4gZG9lcyBub3QgZXhpc3QgaW4gd29ya2luZyBkaXJlY3RvcnkiCisJCXJldHVybiAxCisJfQorCXRlc3QgLWYgTSAmJiB7CisJCWVjaG8gIkJBRDogTSBzdGlsbCBleGlzdHMgaW4gd29ya2luZyBkaXJlY3RvcnkiCisJCXJldHVybiAxCisJfQorCXJldHVybiAwCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyNC1yZWN1cnNpdmUtbWVyZ2Uuc2ggYi90L3Q2MDI0LXJlY3Vyc2l2ZS1tZXJnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNThkYjljCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyNC1yZWN1cnNpdmUtbWVyZ2Uuc2gKQEAgLTAsMCArMSw5OCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbWVyZ2Ugd2l0aG91dCBjb21tb24gYW5jZXN0b3JzJworLiAuL3Rlc3QtbGliLnNoCisKKyMgVGhpcyBzY2VuYXJpbyBpcyBiYXNlZCBvbiBhIHJlYWwtd29ybGQgcmVwb3NpdG9yeSBvZiBTaGF3biBQZWFyY2UuCisKKyMgMSAtIEEgLSBEIC0gRgorIyAgIFwgICBYICAgLworIyAgICAgQiAgIFgKKyMgICAgICAgWCAgIFwKKyMgMiAtIEMgLSBFIC0gRworCitHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMTItMTIgMjM6Mjg6MDAgKzAxMDAiCitleHBvcnQgR0lUX0NPTU1JVFRFUl9EQVRFCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInNldHVwIHRlc3RzIiAnCitlY2hvIDEgPiBhMSAmJgorZ2l0IGFkZCBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjAwIiBnaXQgY29tbWl0IC1tIDEgYTEgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEEgbWFzdGVyICYmCitlY2hvIEEgPiBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjAxIiBnaXQgY29tbWl0IC1tIEEgYTEgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEIgbWFzdGVyICYmCitlY2hvIEIgPiBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjAyIiBnaXQgY29tbWl0IC1tIEIgYTEgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEQgQSAmJgorZ2l0LXJldi1wYXJzZSBCID4gLmdpdC9NRVJHRV9IRUFEICYmCitlY2hvIEQgPiBhMSAmJgorZ2l0IHVwZGF0ZS1pbmRleCBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjAzIiBnaXQgY29tbWl0IC1tIEQgJiYKKworZ2l0IHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvb3RoZXIgJiYKK2VjaG8gMiA+IGExICYmCitHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMTItMTIgMjM6MDA6MDQiIGdpdCBjb21taXQgLW0gMiBhMSAmJgorCitnaXQgY2hlY2tvdXQgLWIgQyAmJgorZWNobyBDID4gYTEgJiYKK0dJVF9BVVRIT1JfREFURT0iMjAwNi0xMi0xMiAyMzowMDowNSIgZ2l0IGNvbW1pdCAtbSBDIGExICYmCisKK2dpdCBjaGVja291dCAtYiBFIEMgJiYKK2dpdC1yZXYtcGFyc2UgQiA+IC5naXQvTUVSR0VfSEVBRCAmJgorZWNobyBFID4gYTEgJiYKK2dpdCB1cGRhdGUtaW5kZXggYTEgJiYKK0dJVF9BVVRIT1JfREFURT0iMjAwNi0xMi0xMiAyMzowMDowNiIgZ2l0IGNvbW1pdCAtbSBFICYmCisKK2dpdCBjaGVja291dCAtYiBHIEUgJiYKK2dpdC1yZXYtcGFyc2UgQSA+IC5naXQvTUVSR0VfSEVBRCAmJgorZWNobyBHID4gYTEgJiYKK2dpdCB1cGRhdGUtaW5kZXggYTEgJiYKK0dJVF9BVVRIT1JfREFURT0iMjAwNi0xMi0xMiAyMzowMDowNyIgZ2l0IGNvbW1pdCAtbSBHICYmCisKK2dpdCBjaGVja291dCAtYiBGIEQgJiYKK2dpdC1yZXYtcGFyc2UgQyA+IC5naXQvTUVSR0VfSEVBRCAmJgorZWNobyBGID4gYTEgJiYKK2dpdCB1cGRhdGUtaW5kZXggYTEgJiYKK0dJVF9BVVRIT1JfREFURT0iMjAwNi0xMi0xMiAyMzowMDowOCIgZ2l0IGNvbW1pdCAtbSBGCisnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgImNvbWJpbmVkIG1lcmdlIGNvbmZsaWN0cyIgImdpdCBtZXJnZSAtbSBmaW5hbCBHIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCis8PDw8PDw8IEhFQUQ6YTEKK0YKKz09PT09PT0KK0cKKz4+Pj4+Pj4gRzphMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlc3VsdCBjb250YWlucyBhIGNvbmZsaWN0IiAiZ2l0IGRpZmYgZXhwZWN0IGExIgorCitnaXQgbHMtZmlsZXMgLS1zdGFnZSA+IG91dAorY2F0ID4gZXhwZWN0IDw8IEVPRgorMTAwNjQ0IGRhMDU2Y2UxNGEyMjQxNTA5ODk3ZmE2OGJiMmIzYjZlNjE5NGVmOWUgMQlhMQorMTAwNjQ0IGNmODQ0NDNlNDllMWIzNjZmYWM5Mzg3MTFkZGY0YmUyZDRkMWQ5ZTkgMglhMQorMTAwNjQ0IGZkNzkyMzUyOTg1NWQwYjI3NDc5NWFlMzM0OWM1ZTA0MzgzMzM5NzkgMwlhMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInZpcnR1YWwgdHJlZXMgd2VyZSBwcm9jZXNzZWQiICJnaXQgZGlmZiBleHBlY3Qgb3V0IgorCitnaXQgcmVzZXQgLS1oYXJkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWZ1c2UgdG8gbWVyZ2UgYmluYXJ5IGZpbGVzJyAnCisJcHJpbnRmICJcMCIgPiBiaW5hcnktZmlsZSAmJgorCWdpdCBhZGQgYmluYXJ5LWZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIGJpbmFyeSAmJgorCWdpdCBjaGVja291dCBHICYmCisJcHJpbnRmICJcMFwwIiA+IGJpbmFyeS1maWxlICYmCisJZ2l0IGFkZCBiaW5hcnktZmlsZSAmJgorCWdpdCBjb21taXQgLW0gYmluYXJ5MiAmJgorCSEgZ2l0IG1lcmdlIEYgPiBtZXJnZS5vdXQgMj4gbWVyZ2UuZXJyICYmCisJZ3JlcCAiQ2Fubm90IG1lcmdlIGJpbmFyeSBmaWxlczogSEVBRDpiaW5hcnktZmlsZSB2cy4gRjpiaW5hcnktZmlsZSIgXAorCQltZXJnZS5lcnIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDI1LW1lcmdlLXN5bWxpbmtzLnNoIGIvdC90NjAyNS1tZXJnZS1zeW1saW5rcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzFhNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyNS1tZXJnZS1zeW1saW5rcy5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEpvaGFubmVzIFNpeHQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nbWVyZ2luZyBzeW1saW5rcyBvbiBmaWxlc3lzdGVtIHcvbyBzeW1saW5rIHN1cHBvcnQuCisKK1RoaXMgdGVzdHMgdGhhdCBnaXQtbWVyZ2UtcmVjdXJzaXZlIHdyaXRlcyBtZXJnZSByZXN1bHRzIGFzIHBsYWluIGZpbGVzCitpZiBjb3JlLnN5bWxpbmtzIGlzIGZhbHNlLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3NldHVwJyAnCitnaXQtY29uZmlnIGNvcmUuc3ltbGlua3MgZmFsc2UgJiYKKz4gZmlsZSAmJgorZ2l0LWFkZCBmaWxlICYmCitnaXQtY29tbWl0IC1tIGluaXRpYWwgJiYKK2dpdC1icmFuY2ggYi1zeW1saW5rICYmCitnaXQtYnJhbmNoIGItZmlsZSAmJgorbD0kKGVjaG8gLW4gZmlsZSB8IGdpdC1oYXNoLW9iamVjdCAtdCBibG9iIC13IC0tc3RkaW4pICYmCitlY2hvICIxMjAwMDAgJGwJc3ltbGluayIgfCBnaXQtdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbyAmJgorZ2l0LWNvbW1pdCAtbSBtYXN0ZXIgJiYKK2dpdC1jaGVja291dCBiLXN5bWxpbmsgJiYKK2w9JChlY2hvIC1uIGZpbGUtZGlmZmVyZW50IHwgZ2l0LWhhc2gtb2JqZWN0IC10IGJsb2IgLXcgLS1zdGRpbikgJiYKK2VjaG8gIjEyMDAwMCAkbAlzeW1saW5rIiB8IGdpdC11cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCitnaXQtY29tbWl0IC1tIGItc3ltbGluayAmJgorZ2l0LWNoZWNrb3V0IGItZmlsZSAmJgorZWNobyBwbGFpbi1maWxlID4gc3ltbGluayAmJgorZ2l0LWFkZCBzeW1saW5rICYmCitnaXQtY29tbWl0IC1tIGItZmlsZScKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisnbWVyZ2UgbWFzdGVyIGludG8gYi1zeW1saW5rLCB3aGljaCBoYXMgYSBkaWZmZXJlbnQgc3ltYm9saWMgbGluaycgJworISBnaXQtY2hlY2tvdXQgYi1zeW1saW5rIHx8CitnaXQtbWVyZ2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd0aGUgbWVyZ2UgcmVzdWx0IG11c3QgYmUgYSBmaWxlJyAnCit0ZXN0IC1mIHN5bWxpbmsnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorJ21lcmdlIG1hc3RlciBpbnRvIGItZmlsZSwgd2hpY2ggaGFzIGEgZmlsZSBpbnN0ZWFkIG9mIGEgc3ltYm9saWMgbGluaycgJworISAoZ2l0LXJlc2V0IC0taGFyZCAmJgorZ2l0LWNoZWNrb3V0IGItZmlsZSkgfHwKK2dpdC1tZXJnZSBtYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBtZXJnZSByZXN1bHQgbXVzdCBiZSBhIGZpbGUnICcKK3Rlc3QgLWYgc3ltbGluaycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisnbWVyZ2UgYi1maWxlLCB3aGljaCBoYXMgYSBmaWxlIGluc3RlYWQgb2YgYSBzeW1ib2xpYyBsaW5rLCBpbnRvIG1hc3RlcicgJworISAoZ2l0LXJlc2V0IC0taGFyZCAmJgorZ2l0LWNoZWNrb3V0IG1hc3RlcikgfHwKK2dpdC1tZXJnZSBiLWZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBtZXJnZSByZXN1bHQgbXVzdCBiZSBhIGZpbGUnICcKK3Rlc3QgLWYgc3ltbGluaycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDI2LW1lcmdlLWF0dHIuc2ggYi90L3Q2MDI2LW1lcmdlLWF0dHIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZmYzM0MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjYtbWVyZ2UtYXR0ci5zaApAQCAtMCwwICsxLDE0NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdwZXIgcGF0aCBtZXJnZSBjb250cm9sbGVkIGJ5IG1lcmdlIGF0dHJpYnV0ZScKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIGYgaW4gdGV4dCBiaW5hcnkgdW5pb24KKwlkbworCQllY2hvIEluaXRpYWwgPiRmICYmIGdpdCBhZGQgJGYgfHwgYnJlYWsKKwlkb25lICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBJbml0aWFsICYmCisKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwlmb3IgZiBpbiB0ZXh0IGJpbmFyeSB1bmlvbgorCWRvCisJCWVjaG8gTWFzdGVyID4+JGYgJiYgZ2l0IGFkZCAkZiB8fCBicmVhaworCWRvbmUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIE1hc3RlciAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlmb3IgZiBpbiB0ZXh0IGJpbmFyeSB1bmlvbgorCWRvCisJCWVjaG8gU2lkZSA+PiRmICYmIGdpdCBhZGQgJGYgfHwgYnJlYWsKKwlkb25lICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBTaWRlICYmCisKKwlnaXQgdGFnIGFuY2hvcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIG1lcmdlICcKKworCXsKKwkJZWNobyAiYmluYXJ5IC1tZXJnZSIKKwkJZWNobyAidW5pb24gbWVyZ2U9dW5pb24iCisJfSA+LmdpdGF0dHJpYnV0ZXMgJiYKKworCWlmIGdpdCBtZXJnZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gR2FhaCwgc2hvdWxkIGhhdmUgY29uZmxpY3RlZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyBPaywgY29uZmxpY3RlZC4KKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBtZXJnZSByZXN1bHQgaW4gaW5kZXgnICcKKworCWdpdCBscy1maWxlcyAtdSB8IGdyZXAgYmluYXJ5ICYmCisJZ2l0IGxzLWZpbGVzIC11IHwgZ3JlcCB0ZXh0ICYmCisJISAoZ2l0IGxzLWZpbGVzIC11IHwgZ3JlcCB1bmlvbikKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBtZXJnZSByZXN1bHQgaW4gd29ya2luZyB0cmVlJyAnCisKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRDpiaW5hcnkgPmJpbmFyeS1vcmlnICYmCisJZ3JlcCAiPDw8PDw8PCIgdGV4dCAmJgorCWNtcCBiaW5hcnktb3JpZyBiaW5hcnkgJiYKKwkhIGdyZXAgIjw8PDw8PDwiIHVuaW9uICYmCisJZ3JlcCBNYXN0ZXIgdW5pb24gJiYKKwlncmVwIFNpZGUgdW5pb24KKworJworCitjYXQgPi4vY3VzdG9tLW1lcmdlIDw8XEVPRgorIyEvYmluL3NoCisKK29yaWc9IiQxIiBvdXJzPSIkMiIgdGhlaXJzPSIkMyIgZXhpdD0iJDQiCisoCisJZWNobyAib3JpZyBpcyAkb3JpZyIKKwllY2hvICJvdXJzIGlzICRvdXJzIgorCWVjaG8gInRoZWlycyBpcyAkdGhlaXJzIgorCWVjaG8gIj09PSBvcmlnID09PSIKKwljYXQgIiRvcmlnIgorCWVjaG8gIj09PSBvdXJzID09PSIKKwljYXQgIiRvdXJzIgorCWVjaG8gIj09PSB0aGVpcnMgPT09IgorCWNhdCAiJHRoZWlycyIKKykgPiIkb3VycysiCitjYXQgIiRvdXJzKyIgPiIkb3VycyIKK3JtIC1mICIkb3VycysiCitleGl0ICIkZXhpdCIKK0VPRgorY2htb2QgK3ggLi9jdXN0b20tbWVyZ2UKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3VzdG9tIG1lcmdlIGJhY2tlbmQnICcKKworCWVjaG8gIiogbWVyZ2U9dW5pb24iID4uZ2l0YXR0cmlidXRlcyAmJgorCWVjaG8gInRleHQgbWVyZ2U9Y3VzdG9tIiA+Pi5naXRhdHRyaWJ1dGVzICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIGFuY2hvciAmJgorCWdpdCBjb25maWcgLS1yZXBsYWNlLWFsbCBcCisJbWVyZ2UuY3VzdG9tLmRyaXZlciAiLi9jdXN0b20tbWVyZ2UgJU8gJUEgJUIgMCIgJiYKKwlnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgXAorCW1lcmdlLmN1c3RvbS5uYW1lICJjdXN0b20gbWVyZ2UgZHJpdmVyIGZvciB0ZXN0aW5nIiAmJgorCisJZ2l0IG1lcmdlIG1hc3RlciAmJgorCisJY21wIGJpbmFyeSB1bmlvbiAmJgorCXNlZCAtZSAxLDNkIHRleHQgPmNoZWNrLTEgJiYKKwlvPSQoZ2l0LXVucGFjay1maWxlIG1hc3Rlcl46dGV4dCkgJiYKKwlhPSQoZ2l0LXVucGFjay1maWxlIHNpZGVeOnRleHQpICYmCisJYj0kKGdpdC11bnBhY2stZmlsZSBtYXN0ZXI6dGV4dCkgJiYKKwlzaCAtYyAiLi9jdXN0b20tbWVyZ2UgJG8gJGEgJGIgMCIgJiYKKwlzZWQgLWUgMSwzZCAkYSA+Y2hlY2stMiAmJgorCWNtcCBjaGVjay0xIGNoZWNrLTIgJiYKKwlybSAtZiAkbyAkYSAkYgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdXN0b20gbWVyZ2UgYmFja2VuZCcgJworCisJZ2l0IHJlc2V0IC0taGFyZCBhbmNob3IgJiYKKwlnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgXAorCW1lcmdlLmN1c3RvbS5kcml2ZXIgIi4vY3VzdG9tLW1lcmdlICVPICVBICVCIDEiICYmCisJZ2l0IGNvbmZpZyAtLXJlcGxhY2UtYWxsIFwKKwltZXJnZS5jdXN0b20ubmFtZSAiY3VzdG9tIG1lcmdlIGRyaXZlciBmb3IgdGVzdGluZyIgJiYKKworCWlmIGdpdCBtZXJnZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gIkVoPyBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiT2ssIGNvbmZsaWN0ZWQiCisJZmkgJiYKKworCWNtcCBiaW5hcnkgdW5pb24gJiYKKwlzZWQgLWUgMSwzZCB0ZXh0ID5jaGVjay0xICYmCisJbz0kKGdpdC11bnBhY2stZmlsZSBtYXN0ZXJeOnRleHQpICYmCisJYT0kKGdpdC11bnBhY2stZmlsZSBhbmNob3I6dGV4dCkgJiYKKwliPSQoZ2l0LXVucGFjay1maWxlIG1hc3Rlcjp0ZXh0KSAmJgorCXNoIC1jICIuL2N1c3RvbS1tZXJnZSAkbyAkYSAkYiAwIiAmJgorCXNlZCAtZSAxLDNkICRhID5jaGVjay0yICYmCisJY21wIGNoZWNrLTEgY2hlY2stMiAmJgorCXJtIC1mICRvICRhICRiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAzMC1iaXNlY3QtcG9yY2VsYWluLnNoIGIvdC90NjAzMC1iaXNlY3QtcG9yY2VsYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwZjZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDMwLWJpc2VjdC1wb3JjZWxhaW4uc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hyaXN0aWFuIENvdWRlcgorIwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdHMgZ2l0LWJpc2VjdCBmdW5jdGlvbmFsaXR5JworCitleGVjIDwvZGV2L251bGwKKworLiAuL3Rlc3QtbGliLnNoCisKK2FkZF9saW5lX2ludG9fZmlsZSgpCit7CisgICAgX2xpbmU9JDEKKyAgICBfZmlsZT0kMgorCisgICAgaWYgWyAtZiAiJF9maWxlIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIiRfbGluZSIgPj4gJF9maWxlIHx8IHJldHVybiAkPworICAgICAgICBNU0c9IkFkZCA8JF9saW5lPiBpbnRvIDwkX2ZpbGU+LiIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiRfbGluZSIgPiAkX2ZpbGUgfHwgcmV0dXJuICQ/CisgICAgICAgIGdpdCBhZGQgJF9maWxlIHx8IHJldHVybiAkPworICAgICAgICBNU0c9IkNyZWF0ZSBmaWxlIDwkX2ZpbGU+IHdpdGggPCRfbGluZT4gaW5zaWRlLiIKKyAgICBmaQorCisgICAgdGVzdF90aWNrCisgICAgZ2l0LWNvbW1pdCAtLXF1aWV0IC1tICIkTVNHIiAkX2ZpbGUKK30KKworSEFTSDE9CitIQVNIMj0KK0hBU0gzPQorSEFTSDQ9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldCB1cCBiYXNpYyByZXBvIHdpdGggMSBmaWxlIChoZWxsbykgYW5kIDQgY29tbWl0cycgJworICAgICBhZGRfbGluZV9pbnRvX2ZpbGUgIjE6IEhlbGxvIFdvcmxkIiBoZWxsbyAmJgorICAgICBIQVNIMT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKyAgICAgYWRkX2xpbmVfaW50b19maWxlICIyOiBBIG5ldyBkYXkgZm9yIGdpdCIgaGVsbG8gJiYKKyAgICAgSEFTSDI9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisgICAgIGFkZF9saW5lX2ludG9fZmlsZSAiMzogQW5vdGhlciBuZXcgZGF5IGZvciBnaXQiIGhlbGxvICYmCisgICAgIEhBU0gzPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorICAgICBhZGRfbGluZV9pbnRvX2ZpbGUgIjQ6IENpYW8gZm9yIG5vdyIgaGVsbG8gJiYKKyAgICAgSEFTSDQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBzdGFydHMgd2l0aCBvbmx5IG9uZSBiYWQnICcKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgYmFkICRIQVNINCAmJgorCWdpdCBiaXNlY3QgbmV4dAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiaXNlY3QgZG9lcyBub3Qgc3RhcnQgd2l0aCBvbmx5IG9uZSBnb29kJyAnCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWdpdCBiaXNlY3Qgc3RhcnQgJiYKKwlnaXQgYmlzZWN0IGdvb2QgJEhBU0gxIHx8IHJldHVybiAxCisKKwlpZiBnaXQgYmlzZWN0IG5leHQKKwl0aGVuCisJCWVjaG8gT29wcywgc2hvdWxkIGhhdmUgZmFpbGVkLgorCQlmYWxzZQorCWVsc2UKKwkJOgorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBzdGFydCB3aXRoIG9uZSBiYWQgYW5kIGdvb2QnICcKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKwlnaXQgYmlzZWN0IGJhZCAkSEFTSDQgJiYKKwlnaXQgYmlzZWN0IG5leHQKKycKKworIyBXZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZmluZCB0aGUgY29tbWl0IHRoYXQKKyMgaW50cm9kdWNlZCAiQW5vdGhlciIgaW50byBoZWxsby4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICciZ2l0IGJpc2VjdCBydW4iIHNpbXBsZSBjYXNlJyBcCisgICAgJ2VjaG8gIiMiXCEiL2Jpbi9zaCIgPiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBlY2hvICJncmVwIEFub3RoZXIgaGVsbG8gPiAvZGV2L251bGwiID4+IHRlc3Rfc2NyaXB0LnNoICYmCisgICAgIGVjaG8gInRlc3QgXCQ/IC1uZSAwIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBjaG1vZCAreCB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBnaXQgYmlzZWN0IHN0YXJ0ICYmCisgICAgIGdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKyAgICAgZ2l0IGJpc2VjdCBiYWQgJEhBU0g0ICYmCisgICAgIGdpdCBiaXNlY3QgcnVuIC4vdGVzdF9zY3JpcHQuc2ggPiBteV9iaXNlY3RfbG9nLnR4dCAmJgorICAgICBncmVwICIkSEFTSDMgaXMgZmlyc3QgYmFkIGNvbW1pdCIgbXlfYmlzZWN0X2xvZy50eHQgJiYKKyAgICAgZ2l0IGJpc2VjdCByZXNldCcKKworIyBXZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZmluZCB0aGUgY29tbWl0IHRoYXQKKyMgaW50cm9kdWNlZCAiQ2lhbyIgaW50byBoZWxsby4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICciZ2l0IGJpc2VjdCBydW4iIHdpdGggbW9yZSBjb21wbGV4ICJnaXQgYmlzZWN0IHN0YXJ0IicgXAorICAgICdlY2hvICIjIlwhIi9iaW4vc2giID4gdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgZWNobyAiZ3JlcCBDaWFvIGhlbGxvID4gL2Rldi9udWxsIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBlY2hvICJ0ZXN0IFwkPyAtbmUgMCIgPj4gdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgY2htb2QgK3ggdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgZ2l0IGJpc2VjdCBzdGFydCAkSEFTSDQgJEhBU0gxICYmCisgICAgIGdpdCBiaXNlY3QgcnVuIC4vdGVzdF9zY3JpcHQuc2ggPiBteV9iaXNlY3RfbG9nLnR4dCAmJgorICAgICBncmVwICIkSEFTSDQgaXMgZmlyc3QgYmFkIGNvbW1pdCIgbXlfYmlzZWN0X2xvZy50eHQgJiYKKyAgICAgZ2l0IGJpc2VjdCByZXNldCcKKworIworIwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDYxMDEtcmV2LXBhcnNlLXBhcmVudHMuc2ggYi90L3Q2MTAxLXJldi1wYXJzZS1wYXJlbnRzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkMzU0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MTAxLXJldi1wYXJzZS1wYXJlbnRzLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdC1yZXYtcGFyc2Ugd2l0aCBkaWZmZXJlbnQgcGFyZW50IG9wdGlvbnMnCisKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi90NjAwMGxpYi5zaCAjIHQ2eHh4IHNwZWNpZmljIGZ1bmN0aW9ucworCitkYXRlID5wYXRoMAorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMAorc2F2ZV90YWcgdHJlZSBnaXQtd3JpdGUtdHJlZQoraGlkZV9lcnJvciBzYXZlX3RhZyBzdGFydCB1bmlxdWVfY29tbWl0ICJzdGFydCIgdHJlZQorc2F2ZV90YWcgc2Vjb25kIHVuaXF1ZV9jb21taXQgInNlY29uZCIgdHJlZSAtcCBzdGFydAoraGlkZV9lcnJvciBzYXZlX3RhZyBzdGFydDIgdW5pcXVlX2NvbW1pdCAic3RhcnQyIiB0cmVlCitzYXZlX3RhZyB0d29fcGFyZW50cyB1bmlxdWVfY29tbWl0ICJuZXh0IiB0cmVlIC1wIHNlY29uZCAtcCBzdGFydDIKK3NhdmVfdGFnIGZpbmFsIHVuaXF1ZV9jb21taXQgImZpbmFsIiB0cmVlIC1wIHR3b19wYXJlbnRzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXJ0IGlzIHZhbGlkJyAnZ2l0LXJldi1wYXJzZSBzdGFydCB8IGdyZXAgIl5bMC05YS1mXVx7NDBcfSQiJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhcnReMCcgInRlc3QgJChjYXQgLmdpdC9yZWZzL3RhZ3Mvc3RhcnQpID0gJChnaXQtcmV2LXBhcnNlIHN0YXJ0XjApIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhcnReMSBub3QgdmFsaWQnICJpZiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0XjE7IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZWNvbmReMSA9IHNlY29uZF4nICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBzZWNvbmReMSkgPSAkKGdpdC1yZXYtcGFyc2Ugc2Vjb25kXikiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjFeMScgInRlc3QgJChnaXQtcmV2LXBhcnNlIHN0YXJ0KSA9ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjFeMSkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjFeMSA9IGZpbmFsXl5eJyAidGVzdCAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4xXjEpID0gJChnaXQtcmV2LXBhcnNlIGZpbmFsXl5eKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMicgInRlc3QgJChnaXQtcmV2LXBhcnNlIHN0YXJ0MikgPSAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4yKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMiAhPSBmaW5hbF4xXjEnICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjIpICE9ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjEpIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4zIG5vdCB2YWxpZCcgImlmIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgZmluYWxeMV4zOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpIgordGVzdF9leHBlY3RfZmFpbHVyZSAnLS12ZXJpZnkgc3RhcnQyXjEnICdnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0Ml4xJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS12ZXJpZnkgc3RhcnQyXjAnICdnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0Ml4wJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NjEyMC1kZXNjcmliZS5zaCBiL3QvdDYxMjAtZGVzY3JpYmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2U5ZWRkYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYxMjAtZGVzY3JpYmUuc2gKQEAgLTAsMCArMSw5NyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgZGVzY3JpYmUKKworICAgICAgICAgICAgICAgICAgICAgICBCCisgICAgICAgIC4tLS0tLS0tLS0tLS0tLW8tLS0tby0tLS1vLS0tLXgKKyAgICAgICAvICAgICAgICAgICAgICAgICAgIC8gICAgLworIG8tLS0tby0tLS1vLS0tLW8tLS0tby0tLS0uICAgIC8KKyAgICAgICBcICAgICAgICBBICAgIGMgICAgICAgIC8KKyAgICAgICAgLi0tLS0tLS0tLS0tLW8tLS1vLS0tbworICAgICAgICAgICAgICAgICAgICAgRCAgIGUKKycKKy4gLi90ZXN0LWxpYi5zaAorCitjaGVja19kZXNjcmliZSAoKSB7CisJZXhwZWN0PSIkMSIKKwlzaGlmdAorCVI9JChnaXQgZGVzY3JpYmUgIiRAIikgJiYKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJkZXNjcmliZSAkKiIgJworCWNhc2UgIiRSIiBpbgorCSRleHBlY3QpCWVjaG8gaGFwcHkgOzsKKwkqKQllY2hvICJPb3BzIC0gJFIgaXMgbm90ICRleHBlY3QiOworCQlmYWxzZSA7OworCWVzYWMKKwknCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJdGVzdF90aWNrICYmCisJZWNobyBvbmUgPmZpbGUgJiYgZ2l0LWFkZCBmaWxlICYmIGdpdC1jb21taXQgLW0gaW5pdGlhbCAmJgorCW9uZT0kKGdpdC1yZXYtcGFyc2UgSEVBRCkgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gdHdvID5maWxlICYmIGdpdC1hZGQgZmlsZSAmJiBnaXQtY29tbWl0IC1tIHNlY29uZCAmJgorCXR3bz0kKGdpdC1yZXYtcGFyc2UgSEVBRCkgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gdGhyZWUgPmZpbGUgJiYgZ2l0LWFkZCBmaWxlICYmIGdpdC1jb21taXQgLW0gdGhpcmQgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gQSA+ZmlsZSAmJiBnaXQtYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSBBICYmCisJdGVzdF90aWNrICYmCisJZ2l0LXRhZyAtYSAtbSBBIEEgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gYyA+ZmlsZSAmJiBnaXQtYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSBjICYmCisJdGVzdF90aWNrICYmCisJZ2l0LXRhZyBjICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkICR0d28gJiYKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIEIgPnNpZGUgJiYgZ2l0LWFkZCBzaWRlICYmIGdpdC1jb21taXQgLW0gQiAmJgorCXRlc3RfdGljayAmJgorCWdpdC10YWcgLWEgLW0gQiBCICYmCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQtbWVyZ2UgLW0gTWVyZ2VkIGMgJiYKKwltZXJnZWQ9JChnaXQtcmV2LXBhcnNlIEhFQUQpICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkICR0d28gJiYKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIEQgPmFub3RoZXIgJiYgZ2l0LWFkZCBhbm90aGVyICYmIGdpdC1jb21taXQgLW0gRCAmJgorCXRlc3RfdGljayAmJgorCWdpdC10YWcgLWEgLW0gRCBEICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIEREID5hbm90aGVyICYmIGdpdCBjb21taXQgLWEgLW0gYW5vdGhlciAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0LXRhZyBlICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIERERCA+YW5vdGhlciAmJiBnaXQgY29tbWl0IC1hIC1tICJ5ZXQgYW5vdGhlciIgJiYKKworCXRlc3RfdGljayAmJgorCWdpdC1tZXJnZSAtbSBNZXJnZWQgJG1lcmdlZCAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyBYID5maWxlICYmIGVjaG8gWCA+c2lkZSAmJiBnaXQtYWRkIGZpbGUgc2lkZSAmJgorCWdpdC1jb21taXQgLW0geAorCisnCisKK2NoZWNrX2Rlc2NyaWJlIEEtKiBIRUFECitjaGVja19kZXNjcmliZSBBLSogSEVBRF4KK2NoZWNrX2Rlc2NyaWJlIEQtKiBIRUFEXl4KK2NoZWNrX2Rlc2NyaWJlIEEtKiBIRUFEXl4yCitjaGVja19kZXNjcmliZSBCIEhFQUReXjJeCisKK2NoZWNrX2Rlc2NyaWJlIEEtKiAtLXRhZ3MgSEVBRAorY2hlY2tfZGVzY3JpYmUgQS0qIC0tdGFncyBIRUFEXgorY2hlY2tfZGVzY3JpYmUgRC0qIC0tdGFncyBIRUFEXl4KK2NoZWNrX2Rlc2NyaWJlIEEtKiAtLXRhZ3MgSEVBRF5eMgorY2hlY2tfZGVzY3JpYmUgQiAtLXRhZ3MgSEVBRF5eMl4KKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MjAwLWZtdC1tZXJnZS1tc2cuc2ggYi90L3Q2MjAwLWZtdC1tZXJnZS1tc2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI2ZDdkMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYyMDAtZm10LW1lcmdlLW1zZy5zaApAQCAtMCwwICsxLDE2MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiwgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZm10LW1lcmdlLW1zZyB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKworZGF0ZXN0YW1wPTExNTE5Mzk5MjMKK3NldGRhdGUgKCkgeworCUdJVF9DT01NSVRURVJfREFURT0iJGRhdGVzdGFtcCArMDIwMCIKKwlHSVRfQVVUSE9SX0RBVEU9IiRkYXRlc3RhbXAgKzAyMDAiCisJZGF0ZXN0YW1wPWBleHByICIkZGF0ZXN0YW1wIiArIDFgCisJZXhwb3J0IEdJVF9DT01NSVRURVJfREFURSBHSVRfQVVUSE9SX0RBVEUKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBvbmUgPm9uZSAmJgorCWdpdCBhZGQgb25lICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLW0gIkluaXRpYWwiICYmCisKKwllY2hvIHVubyA+b25lICYmCisJZWNobyBkb3MgPnR3byAmJgorCWdpdCBhZGQgdHdvICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIlNlY29uZCIgJiYKKworCWdpdCBjaGVja291dCAtYiBsZWZ0ICYmCisKKwllY2hvICRkYXRlc3RhbXAgPm9uZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJDb21tb24gIzEiICYmCisKKwllY2hvICRkYXRlc3RhbXAgPm9uZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJDb21tb24gIzIiICYmCisKKwlnaXQgYnJhbmNoIHJpZ2h0ICYmCisKKwllY2hvICRkYXRlc3RhbXAgPnR3byAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJMZWZ0ICMzIiAmJgorCisJZWNobyAkZGF0ZXN0YW1wID50d28gJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiTGVmdCAjNCIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dHdvICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIkxlZnQgIzUiICYmCisKKwlnaXQgY2hlY2tvdXQgcmlnaHQgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dGhyZWUgJiYKKwlnaXQgYWRkIHRocmVlICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIlJpZ2h0ICMzIiAmJgorCisJZWNobyAkZGF0ZXN0YW1wID50aHJlZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJSaWdodCAjNCIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dGhyZWUgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiUmlnaHQgIzUiICYmCisKKwlnaXQgc2hvdy1icmFuY2gKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK01lcmdlIGJyYW5jaCAnbGVmdCcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjMScgJworCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWdpdCBmZXRjaCAuIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorTWVyZ2UgYnJhbmNoICdsZWZ0JyBvZiAuLi90cmFzaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICMyJyAnCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGZldGNoIC4uL3RyYXNoIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorTWVyZ2UgYnJhbmNoICdsZWZ0JworCisqIGxlZnQ6CisgIExlZnQgIzUKKyAgTGVmdCAjNAorICBMZWZ0ICMzCisgIENvbW1vbiAjMgorICBDb21tb24gIzEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjMycgJworCisJZ2l0IGNvbmZpZyBtZXJnZS5zdW1tYXJ5IHRydWUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGZldGNoIC4gbGVmdCAmJgorCisJZ2l0IGZtdC1tZXJnZS1tc2cgPC5naXQvRkVUQ0hfSEVBRCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgYWN0dWFsIGV4cGVjdGVkCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitNZXJnZSBicmFuY2hlcyAnbGVmdCcgYW5kICdyaWdodCcKKworKiBsZWZ0OgorICBMZWZ0ICM1CisgIExlZnQgIzQKKyAgTGVmdCAjMworICBDb21tb24gIzIKKyAgQ29tbW9uICMxCisKKyogcmlnaHQ6CisgIFJpZ2h0ICM1CisgIFJpZ2h0ICM0CisgIFJpZ2h0ICMzCisgIENvbW1vbiAjMgorICBDb21tb24gIzEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjNCcgJworCisJZ2l0IGNvbmZpZyBtZXJnZS5zdW1tYXJ5IHRydWUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGZldGNoIC4gbGVmdCByaWdodCAmJgorCisJZ2l0IGZtdC1tZXJnZS1tc2cgPC5naXQvRkVUQ0hfSEVBRCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgYWN0dWFsIGV4cGVjdGVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICM1JyAnCisKKwlnaXQgY29uZmlnIG1lcmdlLnN1bW1hcnkgeWVzICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBmZXRjaCAuIGxlZnQgcmlnaHQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcwMDEtbXYuc2ggYi90L3Q3MDAxLW12LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0NDAzMzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDAxLW12LnNoCkBAIC0wLDAgKzEsMTIxIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LW12IGluIHN1YmRpcnMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnbWtkaXIgcGF0aDAgcGF0aDEgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdC1hZGQgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtY29tbWl0IC1tIGFkZCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB0aGUgZmlsZSBvdXQgb2Ygc3ViZGlyZWN0b3J5JyBcCisgICAgJ2NkIHBhdGgwICYmIGdpdC1tdiBDT1BZSU5HIC4uL3BhdGgxL0NPUFlJTkcnCisKKyMgaW4gcGF0aDAgY3VycmVudGx5Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnY2QgLi4gJiYgZ2l0LWNvbW1pdCAtbSBtb3ZlLW91dCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgIGdyZXAgLUUgIl5SMTAwLitwYXRoMC9DT1BZSU5HLitwYXRoMS9DT1BZSU5HIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB0aGUgZmlsZSBiYWNrIGludG8gc3ViZGlyZWN0b3J5JyBcCisgICAgJ2NkIHBhdGgwICYmIGdpdC1tdiAuLi9wYXRoMS9DT1BZSU5HIENPUFlJTkcnCisKKyMgaW4gcGF0aDAgY3VycmVudGx5Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnY2QgLi4gJiYgZ2l0LWNvbW1pdCAtbSBtb3ZlLWluIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgdGhlIGNvbW1pdCcgXAorICAgICdnaXQtZGlmZi10cmVlIC1yIC1NIC0tbmFtZS1zdGF0dXMgIEhFQUReIEhFQUQgfCBcCisgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgxL0NPUFlJTkcuK3BhdGgwL0NPUFlJTkciJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkaW5nIGFub3RoZXIgZmlsZScgXAorICAgICdjcCAuLi8uLi9SRUFETUUgcGF0aDAvUkVBRE1FICYmCisgICAgIGdpdC1hZGQgcGF0aDAvUkVBRE1FICYmCisgICAgIGdpdC1jb21taXQgLW0gYWRkMiAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB3aG9sZSBzdWJkaXJlY3RvcnknIFwKKyAgICAnZ2l0LW12IHBhdGgwIHBhdGgyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnZ2l0LWNvbW1pdCAtbSBkaXItbW92ZSAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwIC1FICJeUjEwMC4rcGF0aDAvQ09QWUlORy4rcGF0aDIvQ09QWUlORyIgJiYKKyAgICAgZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwIC1FICJeUjEwMC4rcGF0aDAvUkVBRE1FLitwYXRoMi9SRUFETUUiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc3VjY2VlZCB3aGVuIHNvdXJjZSBpcyBhIHByZWZpeCBvZiBkZXN0aW5hdGlvbicgXAorICAgICdnaXQtbXYgcGF0aDIvQ09QWUlORyBwYXRoMi9DT1BZSU5HLXJlbmFtZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3Zpbmcgd2hvbGUgc3ViZGlyZWN0b3J5IGludG8gc3ViZGlyZWN0b3J5JyBcCisgICAgJ2dpdC1tdiBwYXRoMiBwYXRoMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbW1pdGluZyB0aGUgY2hhbmdlJyBcCisgICAgJ2dpdC1jb21taXQgLW0gZGlyLW1vdmUgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgyL0NPUFlJTkcuK3BhdGgxL3BhdGgyL0NPUFlJTkciICYmCisgICAgIGdpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgyL1JFQURNRS4rcGF0aDEvcGF0aDIvUkVBRE1FIicKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2RvIG5vdCBtb3ZlIGRpcmVjdG9yeSBvdmVyIGV4aXN0aW5nIGRpcmVjdG9yeScgXAorICAgICdta2RpciBwYXRoMCAmJiBta2RpciBwYXRoMC9wYXRoMiAmJiBnaXQtbXYgcGF0aDIgcGF0aDAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3ZlIGludG8gIi4iJyBcCisgICAgJ2dpdC1tdiBwYXRoMS9wYXRoMi8gLicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiTWljaGFlbCBDYXNzYXIncyB0ZXN0IGNhc2UiICcKKwlybSAtZnIgLmdpdCBwYXBlcnMgcGFydEEgJiYKKwlnaXQgaW5pdCAmJgorCW1rZGlyIC1wIHBhcGVycy91bnNvcnRlZCBwYXBlcnMvYWxsLXBhcGVycyBwYXJ0QSAmJgorCWVjaG8gYSA+IHBhcGVycy91bnNvcnRlZC9UaGVzaXMucGRmICYmCisJZWNobyBiID4gcGFydEEvb3V0bGluZS50eHQgJiYKKwllY2hvIGMgPiBwYXBlcnMvdW5zb3J0ZWQvX2Fub3RoZXIgJiYKKwlnaXQgYWRkIHBhcGVycyBwYXJ0QSAmJgorCVQxPWBnaXQgd3JpdGUtdHJlZWAgJiYKKworCWdpdCBtdiBwYXBlcnMvdW5zb3J0ZWQvVGhlc2lzLnBkZiBwYXBlcnMvYWxsLXBhcGVycy9tb28tYmxhaC5wZGYgJiYKKworCVQ9YGdpdCB3cml0ZS10cmVlYCAmJgorCWdpdCBscy10cmVlIC1yICRUIHwgZ3JlcCBwYXJ0QS9vdXRsaW5lLnR4dCB8fCB7CisJCWdpdCBscy10cmVlIC1yICRUCisJCShleGl0IDEpCisJfQorJworCitybSAtZnIgcGFwZXJzIHBhcnRBIHBhdGg/CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlNlcmdleSBWbGFzb3YncyB0ZXN0IGNhc2UiICcKKwlybSAtZnIgLmdpdCAmJgorCWdpdCBpbml0ICYmCisJbWtkaXIgYWIgJiYKKwlkYXRlID5hYi5jICYmCisJZGF0ZSA+YWIvZCAmJgorCWdpdCBhZGQgYWIuYyBhYiAmJgorCWdpdCBjb21taXQgLW0gJ2luaXRpYWwnICYmCisJZ2l0IG12IGFiIGEKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3MDAyLWdyZXAuc2ggYi90L3Q3MDAyLWdyZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmJmYjg5OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcwMDItZ3JlcC5zaApAQCAtMCwwICsxLDExMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgZ3JlcCB2YXJpb3VzLgorJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJeworCQllY2hvIGZvbyBtbWFwIGJhcgorCQllY2hvIGZvb19tbWFwIGJhcgorCQllY2hvIGZvb19tbWFwIGJhciBtbWFwCisJCWVjaG8gZm9vIG1tYXAgYmFyX21tYXAKKwkJZWNobyBmb29fbW1hcCBiYXIgbW1hcCBiYXoKKwl9ID5maWxlICYmCisJZWNobyB4IHggeHggeCA+eCAmJgorCWVjaG8geSB5eSA+eSAmJgorCWVjaG8genp6ID4geiAmJgorCW1rZGlyIHQgJiYKKwllY2hvIHRlc3QgPnQvdCAmJgorCWdpdCBhZGQgZmlsZSB4IHkgeiB0L3QgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwKKycKKworZm9yIEggaW4gSEVBRCAnJworZG8KKwljYXNlICIkSCIgaW4KKwlIRUFEKQlIQz0nSEVBRDonIEw9J0hFQUQnIDs7CisJJycpCUhDPSBMPSdpbiB3b3JraW5nIHRyZWUnIDs7CisJZXNhYworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAtdyAkTCIgJworCQl7CisJCQllY2hvICR7SEN9ZmlsZToxOmZvbyBtbWFwIGJhcgorCQkJZWNobyAke0hDfWZpbGU6Mzpmb29fbW1hcCBiYXIgbW1hcAorCQkJZWNobyAke0hDfWZpbGU6NDpmb28gbW1hcCBiYXJfbW1hcAorCQkJZWNobyAke0hDfWZpbGU6NTpmb29fbW1hcCBiYXIgbW1hcCBiYXoKKwkJfSA+ZXhwZWN0ZWQgJiYKKwkJZ2l0IGdyZXAgLW4gLXcgLWUgbW1hcCAkSCA+YWN0dWFsICYmCisJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAtdyAkTCAoeCkiICcKKwkJeworCQkJZWNobyAke0hDfXg6MTp4IHggeHggeAorCQl9ID5leHBlY3RlZCAmJgorCQlnaXQgZ3JlcCAtbiAtdyAtZSAieCB4eCogeCIgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwgKHktMSkiICcKKwkJeworCQkJZWNobyAke0hDfXk6MTp5IHl5CisJCX0gPmV4cGVjdGVkICYmCisJCWdpdCBncmVwIC1uIC13IC1lICJeeSIgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwgKHktMikiICcKKwkJOiA+ZXhwZWN0ZWQgJiYKKwkJaWYgZ2l0IGdyZXAgLW4gLXcgLWUgIl55IHkiICRIID5hY3R1YWwKKwkJdGhlbgorCQkJZWNobyBzaG91bGQgbm90IGhhdmUgbWF0Y2hlZAorCQkJY2F0IGFjdHVhbAorCQkJZmFsc2UKKwkJZWxzZQorCQkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwkJZmkKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwIC13ICRMICh6KSIgJworCQk6ID5leHBlY3RlZCAmJgorCQlpZiBnaXQgZ3JlcCAtbiAtdyAtZSAiXnoiICRIID5hY3R1YWwKKwkJdGhlbgorCQkJZWNobyBzaG91bGQgbm90IGhhdmUgbWF0Y2hlZAorCQkJY2F0IGFjdHVhbAorCQkJZmFsc2UKKwkJZWxzZQorCQkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwkJZmkKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwICRMICh0LTEpIiAnCisJCWVjaG8gIiR7SEN9dC90OjE6dGVzdCIgPmV4cGVjdGVkICYmCisJCWdpdCBncmVwIC1uIC1lIHRlc3QgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgJEwgKHQtMikiICcKKwkJZWNobyAiJHtIQ310OjE6dGVzdCIgPmV4cGVjdGVkICYmCisJCSgKKwkJCWNkIHQgJiYKKwkJCWdpdCBncmVwIC1uIC1lIHRlc3QgJEgKKwkJKSA+YWN0dWFsICYmCisJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAkTCAodC0zKSIgJworCQllY2hvICIke0hDfXQvdDoxOnRlc3QiID5leHBlY3RlZCAmJgorCQkoCisJCQljZCB0ICYmCisJCQlnaXQgZ3JlcCAtLWZ1bGwtbmFtZSAtbiAtZSB0ZXN0ICRICisJCSkgPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcxMDEtcmVzZXQuc2ggYi90L3Q3MTAxLXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MTkxNDAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MTAxLXJlc2V0LnNoCkBAIC0wLDAgKzEsNjMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXNldCBzaG91bGQgY3VsbCBlbXB0eSBzdWJkaXJzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ21rZGlyIHBhdGgwICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSBhZGQgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBzZWNvbmQgZmlsZXMnIFwKKyAgICAnbWtkaXIgcGF0aDEgJiYKKyAgICAgbWtkaXIgcGF0aDEvcGF0aDIgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMS9wYXRoMi9DT1BZSU5HICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDEvQ09QWUlORyAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIENPUFlJTkcgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HLVRPTyAmJgorICAgICBnaXQtYWRkIHBhdGgxL3BhdGgyL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWFkZCBwYXRoMS9DT1BZSU5HICYmCisgICAgIGdpdC1hZGQgQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgwL0NPUFlJTkctVE9PICYmCisgICAgIGdpdC1jb21taXQgLW0gY2hhbmdlIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVzZXR0aW5nIHRyZWUgSEVBRF4nIFwKKyAgICAnZ2l0LXJlc2V0IC0taGFyZCBIRUFEXicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIGluaXRpYWwgZmlsZXMgZXhpc3QgYWZ0ZXIgcmV3aW5kJyBcCisgICAgJ3Rlc3QgLWQgcGF0aDAgJiYKKyAgICAgdGVzdCAtZiBwYXRoMC9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9wYXRoMi9DT1BZSU5HJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDEvcGF0aDIvQ09QWUlORycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2NoZWNraW5nIGxhY2sgb2YgcGF0aDEvQ09QWUlORycgXAorICAgICd0ZXN0IC1mIHBhdGgxL0NPUFlJTkcnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBsYWNrIG9mIENPUFlJTkcnIFwKKyAgICAndGVzdCAtZiBDT1BZSU5HJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9DT1BZSU5HLVRPTycgXAorICAgICd0ZXN0IC1mIHBhdGgwL0NPUFlJTkctVE9PJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9wYXRoMicgXAorICAgICd0ZXN0IC1kIHBhdGgxL3BhdGgyJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMScgXAorICAgICd0ZXN0IC1kIHBhdGgxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcyMDEtY28uc2ggYi90L3Q3MjAxLWNvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVkMmU5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MjAxLWNvLnNoCkBAIC0wLDAgKzEsMjMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dCB0ZXN0cy4KKworQ3JlYXRlcyBtYXN0ZXIsIGZvcmtzIHJlbmFtZXIgYW5kIHNpZGUgYnJhbmNoZXMgZnJvbSBpdC4KK1Rlc3Qgc3dpdGNoaW5nIGFjcm9zcyB0aGVtLgorCisgICEgW21hc3Rlcl0gSW5pdGlhbCBBIG9uZSwgQSB0d28KKyAgICogW3JlbmFtZXJdIFJlbmFtZXIgUiBvbmUtPnVubywgTSB0d28KKyAgICAhIFtzaWRlXSBTaWRlIE0gb25lLCBEIHR3bywgQSB0aHJlZQorICAtLS0KKyAgICArIFtzaWRlXSBTaWRlIE0gb25lLCBEIHR3bywgQSB0aHJlZQorICAgKiAgW3JlbmFtZXJdIFJlbmFtZXIgUiBvbmUtPnVubywgTSB0d28KKyAgKyorIFttYXN0ZXJdIEluaXRpYWwgQSBvbmUsIEEgdHdvCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK2ZpbGwgKCkgeworCWZvciBpCisJZG8KKwkJZWNobyAiJGkiCisJZG9uZQorfQorCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZmlsbCAxIDIgMyA0IDUgNiA3IDggPm9uZSAmJgorCWZpbGwgYSBiIGMgZCBlID50d28gJiYKKwlnaXQgYWRkIG9uZSB0d28gJiYKKwlnaXQgY29tbWl0IC1tICJJbml0aWFsIEEgb25lLCBBIHR3byIgJiYKKworCWdpdCBjaGVja291dCAtYiByZW5hbWVyICYmCisJcm0gLWYgb25lICYmCisJZmlsbCAxIDMgNCA1IDYgNyA4ID51bm8gJiYKKwlnaXQgYWRkIHVubyAmJgorCWZpbGwgYSBiIGMgZCBlIGYgPnR3byAmJgorCWdpdCBjb21taXQgLWEgLW0gIlJlbmFtZXIgUiBvbmUtPnVubywgTSB0d28iICYmCisKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSBtYXN0ZXIgJiYKKwlmaWxsIDEgMiAzIDQgNSA2IDcgPm9uZSAmJgorCWZpbGwgQSBCIEMgRCBFID50aHJlZSAmJgorCXJtIC1mIHR3byAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgb25lIHR3byB0aHJlZSAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgTSBvbmUsIEQgdHdvLCBBIHRocmVlIiAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCBmcm9tIG5vbi1leGlzdGluZyBicmFuY2giICcKKworCWdpdCBjaGVja291dCAtYiBkZWxldGUtbWUgbWFzdGVyICYmCisJcm0gLmdpdC9yZWZzL2hlYWRzL2RlbGV0ZS1tZSAmJgorCXRlc3QgcmVmcy9oZWFkcy9kZWxldGUtbWUgPSAiJChnaXQgc3ltYm9saWMtcmVmIEhFQUQpIiAmJgorCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwl0ZXN0IHJlZnMvaGVhZHMvbWFzdGVyID0gIiQoZ2l0IHN5bWJvbGljLXJlZiBIRUFEKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2tvdXQgd2l0aCBkaXJ0eSB0cmVlIHdpdGhvdXQgLW0iICcKKworCWZpbGwgMCAxIDIgMyA0IDUgNiA3IDggPm9uZSAmJgorCWlmIGdpdCBjaGVja291dCBzaWRlCisJdGhlbgorCQllY2hvIE5vdCBoYXBweQorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiaGFwcHkgLSBmYWlsZWQgY29ycmVjdGx5IgorCWZpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2tvdXQgLW0gd2l0aCBkaXJ0eSB0cmVlIiAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmCisJZ2l0IGNsZWFuICYmCisKKwlmaWxsIDAgMSAyIDMgNCA1IDYgNyA4ID5vbmUgJiYKKwlnaXQgY2hlY2tvdXQgLW0gc2lkZSAmJgorCisJdGVzdCAiJChnaXQgc3ltYm9saWMtcmVmIEhFQUQpIiA9ICJyZWZzL2hlYWRzL3NpZGUiICYmCisKKwlmaWxsICJNCW9uZSIgIkEJdGhyZWUiICJECXR3byIgPmV4cGVjdC5tYXN0ZXIgJiYKKwlnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIG1hc3RlciA+Y3VycmVudC5tYXN0ZXIgJiYKKwlkaWZmIGV4cGVjdC5tYXN0ZXIgY3VycmVudC5tYXN0ZXIgJiYKKworCWZpbGwgIk0Jb25lIiA+ZXhwZWN0LnNpZGUgJiYKKwlnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIHNpZGUgPmN1cnJlbnQuc2lkZSAmJgorCWRpZmYgZXhwZWN0LnNpZGUgY3VycmVudC5zaWRlICYmCisKKwk6ID5leHBlY3QuaW5kZXggJiYKKwlnaXQgZGlmZiAtLWNhY2hlZCA+Y3VycmVudC5pbmRleCAmJgorCWRpZmYgZXhwZWN0LmluZGV4IGN1cnJlbnQuaW5kZXgKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2tvdXQgLW0gd2l0aCBkaXJ0eSB0cmVlLCByZW5hbWVkIiAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAmJgorCisJZmlsbCAxIDIgMyA0IDUgNyA4ID5vbmUgJiYKKwlpZiBnaXQgY2hlY2tvdXQgcmVuYW1lcgorCXRoZW4KKwkJZWNobyBOb3QgaGFwcHkKKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gImhhcHB5IC0gZmFpbGVkIGNvcnJlY3RseSIKKwlmaSAmJgorCisJZ2l0IGNoZWNrb3V0IC1tIHJlbmFtZXIgJiYKKwlmaWxsIDEgMyA0IDUgNyA4ID5leHBlY3QgJiYKKwlkaWZmIGV4cGVjdCB1bm8gJiYKKwkhIHRlc3QgLWYgb25lICYmCisJZ2l0IGRpZmYgLS1jYWNoZWQgPmN1cnJlbnQgJiYKKwkhIHRlc3QgLXMgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IC1tIHdpdGggbWVyZ2UgY29uZmxpY3QnICcKKworCWdpdCBjaGVja291dCAtZiBtYXN0ZXIgJiYgZ2l0IGNsZWFuICYmCisKKwlmaWxsIDEgVCAzIDQgNSA2IFMgOCA+b25lICYmCisJaWYgZ2l0IGNoZWNrb3V0IHJlbmFtZXIKKwl0aGVuCisJCWVjaG8gTm90IGhhcHB5CisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSAtIGZhaWxlZCBjb3JyZWN0bHkiCisJZmkgJiYKKworCWdpdCBjaGVja291dCAtbSByZW5hbWVyICYmCisKKwlnaXQgZGlmZiBtYXN0ZXI6b25lIDozOnVubyB8CisJc2VkIC1lICIxLC9eQEAvZCIgLWUgIi9eIC9kIiAtZSAicy9eLS9kLyIgLWUgInMvXisvYS8iID5jdXJyZW50ICYmCisJZmlsbCBkMiBhVCBkNyBhUyA+ZXhwZWN0ICYmCisJZGlmZiBjdXJyZW50IGV4cGVjdCAmJgorCWdpdCBkaWZmIC0tY2FjaGVkIHR3byA+Y3VycmVudCAmJgorCSEgdGVzdCAtcyBjdXJyZW50CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHRvIGRldGFjaCBIRUFEJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgcmVuYW1lciAmJiBnaXQgY2xlYW4gJiYKKwlnaXQgY2hlY2tvdXQgcmVuYW1lcl4gJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJaWYgZ2l0IHN5bWJvbGljLXJlZiBIRUFEID4vZGV2L251bGwgMj4mMQorCXRoZW4KKwkJZWNobyAiT09QUywgSEVBRCBpcyBzdGlsbCBzeW1ib2xpYz8/PyIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB0byBkZXRhY2ggSEVBRCB3aXRoIGJyYW5jaG5hbWVeJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAmJgorCWdpdCBjaGVja291dCByZW5hbWVyXiAmJgorCUg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJTT0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICJ6JEgiID0gInokTSIgJiYKKwlpZiBnaXQgc3ltYm9saWMtcmVmIEhFQUQgPi9kZXYvbnVsbCAyPiYxCisJdGhlbgorCQllY2hvICJPT1BTLCBIRUFEIGlzIHN0aWxsIHN5bWJvbGljPz8/IgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHRvIGRldGFjaCBIRUFEIHdpdGggSEVBRF4wJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAmJgorCWdpdCBjaGVja291dCBIRUFEXjAgJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJaWYgZ2l0IHN5bWJvbGljLXJlZiBIRUFEID4vZGV2L251bGwgMj4mMQorCXRoZW4KKwkJZWNobyAiT09QUywgSEVBRCBpcyBzdGlsbCBzeW1ib2xpYz8/PyIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3aXRoIGFtYmlndW91cyB0YWcvYnJhbmNoIG5hbWVzJyAnCisKKwlnaXQgdGFnIGJvdGggc2lkZSAmJgorCWdpdCBicmFuY2ggYm90aCBtYXN0ZXIgJiYKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCisJZ2l0IGNoZWNrb3V0IGJvdGggJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJbmFtZT0kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPi9kZXYvbnVsbCkgJiYKKwl0ZXN0ICJ6JG5hbWUiID0genJlZnMvaGVhZHMvYm90aAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdpdGggYW1iaWd1b3VzIHRhZy9icmFuY2ggbmFtZXMnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlnaXQgdGFnIGZyb3R6IHNpZGUgJiYKKwlnaXQgYnJhbmNoIGZyb3R6IG1hc3RlciAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlnaXQgY2hlY2tvdXQgdGFncy9mcm90eiAmJgorCUg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJUz0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL3NpZGUpICYmCisJdGVzdCAieiRIIiA9ICJ6JFMiICYmCisJaWYgbmFtZT0kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPi9kZXYvbnVsbCkKKwl0aGVuCisJCWVjaG8gIkJhZCAtLSBzaG91bGQgaGF2ZSBkZXRhY2hlZCIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzMwMC1jbGVhbi5zaCBiL3QvdDczMDAtY2xlYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU3MGIzOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDczMDAtY2xlYW4uc2gKQEAgLTAsMCArMSwxODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBTcGFuZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2xlYW4gYmFzaWMgdGVzdHMnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCisJbWtkaXIgLXAgc3JjICYmCisJdG91Y2ggc3JjL3BhcnQxLmMgTWFrZWZpbGUgJiYKKwllY2hvIGJ1aWxkID4uZ2l0aWdub3JlICYmCisJZWNobyBcKi5vID4+LmdpdGlnbm9yZSAmJgorCWdpdC1hZGQgLiAmJgorCWdpdC1jb21taXQgLW0gc2V0dXAgJiYKKwl0b3VjaCBzcmMvcGFydDIuYyBSRUFETUUgJiYKKwlnaXQtYWRkIC4KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4nICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiAtbicgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLW4gJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gLWQnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC1kICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0ICEgLWQgZG9jcyAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiAteCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLXggJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgISAtZiBhLm91dCAmJgorCXRlc3QgISAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgLWYgZG9jcy9tYW51YWwudHh0ICYmCisJdGVzdCAhIC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gLWQgLXgnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC1kIC14ICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0ICEgLWQgZG9jcyAmJgorCXRlc3QgISAtZiBvYmoubyAmJgorCXRlc3QgISAtZCBidWlsZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiAtWCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLVggJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0ICEgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiAtZCAtWCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLWQgLVggJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0ICEgLWYgb2JqLm8gJiYKKwl0ZXN0ICEgLWQgYnVpbGQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbGVhbi5yZXF1aXJlRm9yY2UnICcKKworCWdpdC1jb25maWcgY2xlYW4ucmVxdWlyZUZvcmNlIHRydWUgJiYKKwkhIGdpdC1jbGVhbgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NsZWFuLnJlcXVpcmVGb3JjZSBhbmQgLW4nICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC1uICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgLWYgZG9jcy9tYW51YWwudHh0ICYmCisJdGVzdCAtZiBvYmoubyAmJgorCXRlc3QgLWYgYnVpbGQvbGliLnNvCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYW4ucmVxdWlyZUZvcmNlIGFuZCAtZicgJworCisJZ2l0LWNsZWFuIC1mICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgISAtZiBhLm91dCAmJgorCXRlc3QgISAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgLWYgZG9jcy9tYW51YWwudHh0ICYmCisJdGVzdCAtZiBvYmoubyAmJgorCXRlc3QgLWYgYnVpbGQvbGliLnNvCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDAxLWFubm90YXRlLnNoIGIvdC90ODAwMS1hbm5vdGF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTY0OTBlCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwMS1hbm5vdGF0ZS5zaApAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFubm90YXRlJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBhbm5vdGF0ZScKKy4gLi4vYW5ub3RhdGUtdGVzdHMuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ1sgJChnaXQgYW5ub3RhdGUgZmlsZSBtYXN0ZXIgfCBhd2sgIntwcmludCBcJDN9IiB8IGdyZXAgLWMgIl5BJCIpIC1lcSAyIF0gJiYgXAorICAgICBbICQoZ2l0IGFubm90YXRlIGZpbGUgbWFzdGVyIHwgYXdrICJ7cHJpbnQgXCQzfSIgfCBncmVwIC1jICJeQiQiKSAtZXEgMiBdJworCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90ODAwMi1ibGFtZS5zaCBiL3QvdDgwMDItYmxhbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTc3NzM5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDgwMDItYmxhbWUuc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWJsYW1lJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBibGFtZSAtYycKKy4gLi4vYW5ub3RhdGUtdGVzdHMuc2gKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDAzLWJsYW1lLnNoIGIvdC90ODAwMy1ibGFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjUxYjNhCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwMy1ibGFtZS5zaApAQCAtMCwwICsxLDEzMiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBibGFtZSBjb3JuZXIgY2FzZXMnCisuIC4vdGVzdC1saWIuc2gKKworcGlja19mYz0ncy9eWzAtOWEtZl5dKiAqXChbXiBdKlwpICooXChbXiBdKlwpIC4qL1wxLVwyLycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwllY2hvIEEgQSBBIEEgQSA+b25lICYmCisJZWNobyBCIEIgQiBCIEIgPnR3byAmJgorCWVjaG8gQyBDIEMgQyBDID50cmVzICYmCisJZWNobyBBQkMgPm1vdXNlICYmCisJZ2l0IGFkZCBvbmUgdHdvIHRyZXMgbW91c2UgJiYKKwl0ZXN0X3RpY2sgJiYKKwlHSVRfQVVUSE9SX05BTUU9SW5pdGlhbCBnaXQgY29tbWl0IC1tIEluaXRpYWwgJiYKKworCWNhdCBvbmUgPnVubyAmJgorCW12IHR3byBkb3MgJiYKKwljYXQgb25lID4+dHJlcyAmJgorCWVjaG8gREVGID4+bW91c2UKKwlnaXQgYWRkIHVubyBkb3MgdHJlcyBtb3VzZSAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1TZWNvbmQgZ2l0IGNvbW1pdCAtYSAtbSBTZWNvbmQgJiYKKworCWVjaG8gR0hJSksgPj5tb3VzZSAmJgorCWdpdCBhZGQgbW91c2UgJiYKKwl0ZXN0X3RpY2sgJiYKKwlHSVRfQVVUSE9SX05BTUU9VGhpcmQgZ2l0IGNvbW1pdCAtbSBUaGlyZCAmJgorCisJY2F0IG1vdXNlID5jb3cgJiYKKwlnaXQgYWRkIGNvdyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1Gb3VydGggZ2l0IGNvbW1pdCAtbSBGb3VydGggJiYKKworCXsKKwkJZWNobyBBQkMKKwkJZWNobyBERUYKKwkJZWNobyBYWFhYCisJCWVjaG8gR0hJSksKKwl9ID5jb3cgJiYKKwlnaXQgYWRkIGNvdyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1GaWZ0aCBnaXQgY29tbWl0IC1tIEZpZnRoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0cmFpZ2h0IGNvcHkgd2l0aG91dCAtQycgJworCisJZ2l0IGJsYW1lIHVubyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgbW92ZSB3aXRob3V0IC1DJyAnCisKKwlnaXQgYmxhbWUgZG9zIHwgZ3JlcCBJbml0aWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgY29weSB3aXRoIC1DJyAnCisKKwlnaXQgYmxhbWUgLUMxIHVubyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgbW92ZSB3aXRoIC1DJyAnCisKKwlnaXQgYmxhbWUgLUMxIGRvcyB8IGdyZXAgSW5pdGlhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0cmFpZ2h0IGNvcHkgd2l0aCAtQyAtQycgJworCisJZ2l0IGJsYW1lIC1DIC1DMSB1bm8gfCBncmVwIEluaXRpYWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdHJhaWdodCBtb3ZlIHdpdGggLUMgLUMnICcKKworCWdpdCBibGFtZSAtQyAtQzEgZG9zIHwgZ3JlcCBJbml0aWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwZW5kIHdpdGhvdXQgLUMnICcKKworCWdpdCBibGFtZSAtTDIgdHJlcyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwZW5kIHdpdGggLUMnICcKKworCWdpdCBibGFtZSAtTDIgLUMxIHRyZXMgfCBncmVwIFNlY29uZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGVuZCB3aXRoIC1DIC1DJyAnCisKKwlnaXQgYmxhbWUgLUwyIC1DIC1DMSB0cmVzIHwgZ3JlcCBTZWNvbmQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBlbmQgd2l0aCAtQyAtQyAtQycgJworCisJZ2l0IGJsYW1lIC1MMiAtQyAtQyAtQzEgdHJlcyB8IGdyZXAgSW5pdGlhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JsYW1lIHdob2xlc2FsZSBjb3B5JyAnCisKKwlnaXQgYmxhbWUgLWYgLUMgLUMxIEhFQUReIC0tIGNvdyB8IHNlZCAtZSAiJHBpY2tfZmMiID5jdXJyZW50ICYmCisJeworCQllY2hvIG1vdXNlLUluaXRpYWwKKwkJZWNobyBtb3VzZS1TZWNvbmQKKwkJZWNobyBtb3VzZS1UaGlyZAorCX0gPmV4cGVjdGVkICYmCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmxhbWUgd2hvbGVzYWxlIGNvcHkgYW5kIG1vcmUnICcKKworCWdpdCBibGFtZSAtZiAtQyAtQzEgSEVBRCAtLSBjb3cgfCBzZWQgLWUgIiRwaWNrX2ZjIiA+Y3VycmVudCAmJgorCXsKKwkJZWNobyBtb3VzZS1Jbml0aWFsCisJCWVjaG8gbW91c2UtU2Vjb25kCisJCWVjaG8gY293LUZpZnRoCisJCWVjaG8gbW91c2UtVGhpcmQKKwl9ID5leHBlY3RlZCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTAwMS1zZW5kLWVtYWlsLnNoIGIvdC90OTAwMS1zZW5kLWVtYWlsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ZWEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MDAxLXNlbmQtZW1haWwuc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zZW5kLWVtYWlsJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBzZW5kLWVtYWlsJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyAiMUEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj5maWxlICYmCisgICAgIGdpdCBhZGQgZmlsZQorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1NldHVwIGhlbHBlciB0b29sJyBcCisgICAgJyhlY2hvICIjIS9iaW4vc2giCisgICAgICBlY2hvIHNoaWZ0CisgICAgICBlY2hvIGZvciBhCisgICAgICBlY2hvIGRvCisgICAgICBlY2hvICIgIGVjaG8gXCIhXCRhIVwiIgorICAgICAgZWNobyAiZG9uZSA+Y29tbWFuZGxpbmUiCisgICAgICBlY2hvICJjYXQgPiBtc2d0eHQiCisgICAgICApID5mYWtlLnNlbmRtYWlsCisgICAgIGNobW9kICt4IC4vZmFrZS5zZW5kbWFpbAorICAgICBnaXQgYWRkIGZha2Uuc2VuZG1haWwKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJBIiBnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnRXh0cmFjdCBwYXRjaGVzJyAnCisgICAgcGF0Y2hlcz1gZ2l0IGZvcm1hdC1wYXRjaCAtbiBIRUFEXjFgCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1NlbmQgcGF0Y2hlcycgJworICAgICBnaXQgc2VuZC1lbWFpbCAtZnJvbT0iRXhhbXBsZSA8bm9ib2R5QGV4YW1wbGUuY29tPiIgLS10bz1ub2JvZHlAZXhhbXBsZS5jb20gLS1zbXRwLXNlcnZlcj0iJChwd2QpL2Zha2Uuc2VuZG1haWwiICRwYXRjaGVzIDI+ZXJyb3JzCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCishbm9ib2R5QGV4YW1wbGUuY29tIQorIWF1dGhvckBleGFtcGxlLmNvbSEKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1ZlcmlmeSBjb21tYW5kbGluZScgXAorICAgICdkaWZmIGNvbW1hbmRsaW5lIGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDAtZ2l0LXN2bi1iYXNpYy5zaCBiL3QvdDkxMDAtZ2l0LXN2bi1iYXNpYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGMzNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwMC1naXQtc3ZuLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjY4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGJhc2ljIHRlc3RzJworR0lUX1NWTl9MQ19BTEw9JExDX0FMTAorCitjYXNlICIkTENfQUxMIiBpbgorKi5VVEYtOCkKKwloYXZlX3V0Zjg9dAorCTs7CisqKQorCWhhdmVfdXRmOD0KKwk7OworZXNhYworCisuIC4vbGliLWdpdC1zdm4uc2gKKworZWNobyAnZGVmaW5lIE5PX1NWTl9URVNUUyB0byBza2lwIGdpdC1zdm4gdGVzdHMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbml0aWFsaXplIGdpdC1zdm4nICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwllY2hvIGZvbyA+IGZvbyAmJgorCWxuIC1zIGZvbyBmb28ubGluaworCW1rZGlyIC1wIGRpci9hL2IvYy9kL2UgJiYKKwllY2hvICdkZWVwIGRpcicgPiBkaXIvYS9iL2MvZC9lL2ZpbGUgJiYKKwlta2RpciBiYXIgJiYKKwllY2hvICd6enonID4gYmFyL3p6eiAmJgorCWVjaG8gJyMhL2Jpbi9zaCcgPiBleGVjLnNoICYmCisJY2htb2QgK3ggZXhlYy5zaCAmJgorCXN2biBpbXBvcnQgLW0gJ2ltcG9ydCBmb3IgZ2l0LXN2bicgLiAkc3ZucmVwbyA+L2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwlybSAtcmYgaW1wb3J0ICYmCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW1wb3J0IGFuIFNWTiByZXZpc2lvbiBpbnRvIGdpdCcgXAorICAgICdnaXQtc3ZuIGZldGNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCBmcm9tIHN2biIgInN2biBjbyAkc3ZucmVwbyAnJFNWTl9UUkVFJyIKKworbmFtZT0ndHJ5IGEgZGVlcCAtLXJtZGlyIHdpdGggYSBjb21taXQnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCWdpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaCByZW1vdGVzL2dpdC1zdm4gJiYKKwltdiBkaXIvYS9iL2MvZC9lL2ZpbGUgZGlyL2ZpbGUgJiYKKwljcCBkaXIvZmlsZSBmaWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBkaXIvYS9iL2MvZC9lL2ZpbGUgZGlyL2ZpbGUgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2ggJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0IC1kICckU1ZOX1RSRUUnL2RpciAmJiB0ZXN0ICEgLWQgJyRTVk5fVFJFRScvZGlyL2EiCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZmlsZSB0byBkaXJlY3RvcnkgIzEnCit0ZXN0X2V4cGVjdF9mYWlsdXJlICIkbmFtZSIgIgorCW1rZGlyIGRpci9uZXdfZmlsZSAmJgorCW12IGRpci9maWxlIGRpci9uZXdfZmlsZS9maWxlICYmCisJbXYgZGlyL25ld19maWxlIGRpci9maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSBkaXIvZmlsZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZGlyL2ZpbGUvZmlsZSAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAgJiYKKwlnaXQtc3ZuIHNldC10cmVlIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgXAorCQlyZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoIiB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIzEnCit0ZXN0X2V4cGVjdF9mYWlsdXJlICIkbmFtZSIgIgorCXJtIC1yZiBkaXIgJyRHSVRfRElSJy9pbmRleCAmJgorCWdpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaDIgcmVtb3Rlcy9naXQtc3ZuICYmCisJbXYgYmFyL3p6eiB6enogJiYKKwlybSAtcmYgYmFyICYmCisJbXYgenp6IGJhciAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgLS0gYmFyL3p6eiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS0gYmFyICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDIiIHx8IHRydWUKKworCituYW1lPSdkZXRlY3Qgbm9kZSBjaGFuZ2UgZnJvbSBmaWxlIHRvIGRpcmVjdG9yeSAjMicKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIiRuYW1lIiAiCisJcm0gLWYgJyRHSVRfRElSJy9pbmRleCAmJgorCWdpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaDMgcmVtb3Rlcy9naXQtc3ZuICYmCisJcm0gYmFyL3p6eiAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgYmFyL3p6eiAmJgorCW1rZGlyIGJhci96enogJiYKKwllY2hvIHl5eSA+IGJhci96enoveXl5ICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBiYXIvenp6L3l5eSAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2gzIiB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIzInCit0ZXN0X2V4cGVjdF9mYWlsdXJlICIkbmFtZSIgIgorCXJtIC1mICckR0lUX0RJUicvaW5kZXggJiYKKwlnaXQgY2hlY2tvdXQgLWYgLWIgbXlicmFuY2g0IHJlbW90ZXMvZ2l0LXN2biAmJgorCXJtIC1yZiBkaXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tIGRpci9maWxlICYmCisJdG91Y2ggZGlyICYmCisJZWNobyBhc2RmID4gZGlyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLSBkaXIgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwlnaXQtc3ZuIHNldC10cmVlIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgXAorCQlyZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoNCIgfHwgdHJ1ZQorCisKK25hbWU9J3JlbW92ZSBleGVjdXRhYmxlIGJpdCBmcm9tIGEgZmlsZScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiCisJcm0gLWYgJyRHSVRfRElSJy9pbmRleCAmJgorCWdpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaDUgcmVtb3Rlcy9naXQtc3ZuICYmCisJY2htb2QgLXggZXhlYy5zaCAmJgorCWdpdCB1cGRhdGUtaW5kZXggZXhlYy5zaCAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJc3ZuIHVwICckU1ZOX1RSRUUnICYmCisJdGVzdCAhIC14ICckU1ZOX1RSRUUnL2V4ZWMuc2giCisKKworbmFtZT0nYWRkIGV4ZWN1dGFibGUgYml0IGJhY2sgZmlsZScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiCisJY2htb2QgK3ggZXhlYy5zaCAmJgorCWdpdCB1cGRhdGUtaW5kZXggZXhlYy5zaCAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJc3ZuIHVwICckU1ZOX1RSRUUnICYmCisJdGVzdCAteCAnJFNWTl9UUkVFJy9leGVjLnNoIgorCisKK25hbWU9J2V4ZWN1dGFibGUgZmlsZSBiZWNvbWVzIGEgc3ltbGluayB0byBiYXIvenp6IChmaWxlKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiCisJcm0gZXhlYy5zaCAmJgorCWxuIC1zIGJhci96enogZXhlYy5zaCAmJgorCWdpdCB1cGRhdGUtaW5kZXggZXhlYy5zaCAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJc3ZuIHVwICckU1ZOX1RSRUUnICYmCisJdGVzdCAtTCAnJFNWTl9UUkVFJy9leGVjLnNoIgorCituYW1lPSduZXcgc3ltbGluayBpcyBhZGRlZCB0byBhIGZpbGUgdGhhdCB3YXMgYWxzbyBqdXN0IG1hZGUgZXhlY3V0YWJsZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwljaG1vZCAreCBiYXIvenp6ICYmCisJbG4gLXMgYmFyL3p6eiBleGVjLTIuc2ggJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGJhci96enogZXhlYy0yLnNoICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0IC14ICckU1ZOX1RSRUUnL2Jhci96enogJiYKKwl0ZXN0IC1MICckU1ZOX1RSRUUnL2V4ZWMtMi5zaCIKKworbmFtZT0nbW9kaWZ5IGEgc3ltbGluayB0byBiZWNvbWUgYSBmaWxlJwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwllY2hvIGdpdCBoZWxwID4gaGVscCB8fCB0cnVlICYmCisJcm0gZXhlYy0yLnNoICYmCisJY3AgaGVscCBleGVjLTIuc2ggJiYKKwlnaXQgdXBkYXRlLWluZGV4IGV4ZWMtMi5zaCAmJgorCWdpdCBjb21taXQgLW0gJyRuYW1lJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJc3ZuIHVwICckU1ZOX1RSRUUnICYmCisJdGVzdCAtZiAnJFNWTl9UUkVFJy9leGVjLTIuc2ggJiYKKwl0ZXN0ICEgLUwgJyRTVk5fVFJFRScvZXhlYy0yLnNoICYmCisJZ2l0IGRpZmYgaGVscCAkU1ZOX1RSRUUvZXhlYy0yLnNoIgorCitpZiB0ZXN0ICIkaGF2ZV91dGY4IiA9IHQKK3RoZW4KKwluYW1lPSJjb21taXQgd2l0aCBVVEYtOCBtZXNzYWdlOiBsb2NhbGU6ICRHSVRfU1ZOX0xDX0FMTCIKKwlMQ19BTEw9IiRHSVRfU1ZOX0xDX0FMTCIKKwlleHBvcnQgTENfQUxMCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwkJZWNobyAnIyBoZWxsbycgPj4gZXhlYy0yLnNoICYmCisJCWdpdCB1cGRhdGUtaW5kZXggZXhlYy0yLnNoICYmCisJCWdpdCBjb21taXQgLW0gJ8Opw6/iiI8nICYmCisJCWdpdC1zdm4gc2V0LXRyZWUgSEVBRCIKKwl1bnNldCBMQ19BTEwKK2Vsc2UKKwllY2hvICJVVEYtOCBsb2NhbGUgbm90IHNldCwgdGVzdCBza2lwcGVkICgkR0lUX1NWTl9MQ19BTEwpIgorZmkKKworbmFtZT0ndGVzdCBmZXRjaCBmdW5jdGlvbmFsaXR5IChzdm4gPT4gZ2l0KSB3aXRoIGFsdGVybmF0ZSBHSVRfU1ZOX0lEJworR0lUX1NWTl9JRD1hbHQKK2V4cG9ydCBHSVRfU1ZOX0lECit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGluaXQgJHN2bnJlcG8gJiYgZ2l0LXN2biBmZXRjaCAmJgorICAgICBnaXQtcmV2LWxpc3QgLS1wcmV0dHk9cmF3IHJlbW90ZXMvZ2l0LXN2biB8IGdyZXAgXnRyZWUgfCB1bmlxID4gYSAmJgorICAgICBnaXQtcmV2LWxpc3QgLS1wcmV0dHk9cmF3IHJlbW90ZXMvYWx0IHwgZ3JlcCBedHJlZSB8IHVuaXEgPiBiICYmCisgICAgIGdpdCBkaWZmIGEgYiIKKworbmFtZT0nY2hlY2sgaW1wb3J0ZWQgdHJlZSBjaGVja3N1bXMgZXhwZWN0ZWQgdHJlZSBjaGVja3N1bXMnCitybSAtZiBleHBlY3RlZAoraWYgdGVzdCAiJGhhdmVfdXRmOCIgPSB0Cit0aGVuCisJZWNobyB0cmVlIGJmNTIyMzUzNTg2YjFiODgzNDg4ZjJiYzczZGFiMGQ5Zjc3NGI5YTkgPiBleHBlY3RlZAorZmkKK2NhdCA+PiBleHBlY3RlZCA8PFxFT0YKK3RyZWUgODM2NTRiYjM2ZjAxOWFlNGZlNzdhMDE3MWY4MTA3NTk3MjA4NzYyNAordHJlZSAwMzFiOGQ1NTdhZmM2ZmVhNTI4OTRlYWViYjQ1YmVjNTJmMWJhNmQxCit0cmVlIDBiMDk0Y2JmZjE3MTY4ZjI0YzMwMmUyOTdmNTViZmFjNjVlYjhiZDMKK3RyZWUgZDY2NzI3MGExZjdiMTA5ZjVlYjNhYWVhMjFlZGUxNGI1NmJmZGQ2ZQordHJlZSA1NmEzMGI5NjY2MTliODYzNjc0ZjU5Nzg2OTZmNGEzNTk0ZjJmY2E5Cit0cmVlIGQ2NjcyNzBhMWY3YjEwOWY1ZWIzYWFlYTIxZWRlMTRiNTZiZmRkNmUKK3RyZWUgOGY1MWY3NGNmMDE2M2FmYzlhZDY4YTRiMTUzNzI4OGM0NTU4YjVhNAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiZ2l0IGRpZmYgYSBleHBlY3RlZCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnZXhpdCBpZiByZW1vdGUgcmVmcyBhcmUgYW1iaWdpb3VzJyAiCisgICAgICAgIGdpdC1jb25maWcgLS1hZGQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyOnJlZnMvcmVtb3Rlcy9naXQtc3ZuICYmCisgICAgICAgIGdpdC1zdm4gbWlncmF0ZQorICAgICAgICAiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2V4aXQgaWYgaW5pdC1pbmcgYSB3b3VsZCBjbG9iYmVyIGEgVVJMJyAiCisgICAgICAgIHN2bmFkbWluIGNyZWF0ZSAke1BXRH0vc3ZucmVwbzIgJiYKKyAgICAgICAgc3ZuIG1rZGlyIC1tICdta2RpciBiYXInICR7c3ZucmVwb30yL2JhciAmJgorICAgICAgICBnaXQtY29uZmlnIC0tdW5zZXQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXmJhcjpyZWZzL3JlbW90ZXMvZ2l0LXN2biQnICYmCisgICAgICAgIGdpdC1zdm4gaW5pdCAke3N2bnJlcG99Mi9iYXIKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgJ2luaXQgYWxsb3dzIHVzIHRvIGNvbm5lY3QgdG8gYW5vdGhlciBkaXJlY3RvcnkgaW4gdGhlIHNhbWUgcmVwbycgIgorICAgICAgICBnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgYmFyICRzdm5yZXBvL2JhciAmJgorICAgICAgICBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeYmFyOnJlZnMvcmVtb3Rlcy9iYXIkJyAmJgorICAgICAgICBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeOnJlZnMvcmVtb3Rlcy9naXQtc3ZuJCcKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhYmxlIHRvIGRjb21taXQgdG8gYSBzdWJkaXJlY3RvcnknICIKKwlnaXQtc3ZuIGZldGNoIC1pIGJhciAmJgorCWdpdCBjaGVja291dCAtYiBteS1iYXIgcmVmcy9yZW1vdGVzL2JhciAmJgorCWVjaG8gYWJjID4gZCAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZCAmJgorCWdpdCBjb21taXQgLW0gJy9iYXIvZCBzaG91bGQgYmUgaW4gdGhlIGxvZycgJiYKKwlnaXQtc3ZuIGRjb21taXQgLWkgYmFyICYmCisJdGVzdCAteiBcIlxgZ2l0IGRpZmYgcmVmcy9oZWFkcy9teS1iYXIgcmVmcy9yZW1vdGVzL2JhclxgXCIgJiYKKwlta2RpciBuZXdkaXIgJiYKKwllY2hvIG5ldyA+IG5ld2Rpci9kaXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIG5ld2Rpci9kaXIgJiYKKwlnaXQgY29tbWl0IC1tICdhZGQgYSBuZXcgZGlyZWN0b3J5JyAmJgorCWdpdC1zdm4gZGNvbW1pdCAtaSBiYXIgJiYKKwl0ZXN0IC16IFwiXGBnaXQgZGlmZiByZWZzL2hlYWRzL215LWJhciByZWZzL3JlbW90ZXMvYmFyXGBcIiAmJgorCWVjaG8gZm9vID4+IG5ld2Rpci9kaXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IG5ld2Rpci9kaXIgJiYKKwlnaXQgY29tbWl0IC1tICdtb2RpZnkgYSBmaWxlIGluIG5ldyBkaXJlY3RvcnknICYmCisJZ2l0LXN2biBkY29tbWl0IC1pIGJhciAmJgorCXRlc3QgLXogXCJcYGdpdCBkaWZmIHJlZnMvaGVhZHMvbXktYmFyIHJlZnMvcmVtb3Rlcy9iYXJcYFwiCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhYmxlIHRvIHNldC10cmVlIHRvIGEgc3ViZGlyZWN0b3J5JyAiCisJZWNobyBjYmEgPiBkICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBkICYmCisJZ2l0IGNvbW1pdCAtbSAndXBkYXRlIC9iYXIvZCcgJiYKKwlnaXQtc3ZuIHNldC10cmVlIC1pIGJhciBIRUFEICYmCisJdGVzdCAteiBcIlxgZ2l0IGRpZmYgcmVmcy9oZWFkcy9teS1iYXIgcmVmcy9yZW1vdGVzL2JhclxgXCIKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwMS1naXQtc3ZuLXByb3BzLnNoIGIvdC90OTEwMS1naXQtc3ZuLXByb3BzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyMmVhMWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTAxLWdpdC1zdm4tcHJvcHMuc2gKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gcHJvcGVydHkgdGVzdHMnCisuIC4vbGliLWdpdC1zdm4uc2gKKworbWtkaXIgaW1wb3J0CisKK2FfY3JsZj0KK2FfbGY9CithX2NyPQorYV9uZV9jcmxmPQorYV9uZV9sZj0KK2FfbmVfY3I9CithX2VtcHR5PQorYV9lbXB0eV9sZj0KK2FfZW1wdHlfY3I9CithX2VtcHR5X2NybGY9CisKK2NkIGltcG9ydAorCWNhdCA+PiBrdy5jIDw8XEVPRgorLyogU29tZWJvZHkgcHJlbWF0dXJlbHkgcHV0IGEga2V5d29yZCBpbnRvIHRoaXMgZmlsZSAqLworLyogJElkJCAqLworRU9GCisKKwlwcmludGYgIkhlbGxvXHJcbldvcmxkXHJcbiIgPiBjcmxmCisJYV9jcmxmPWBnaXQtaGFzaC1vYmplY3QgLXcgY3JsZmAKKwlwcmludGYgIkhlbGxvXHJXb3JsZFxyIiA+IGNyCisJYV9jcj1gZ2l0LWhhc2gtb2JqZWN0IC13IGNyYAorCXByaW50ZiAiSGVsbG9cbldvcmxkXG4iID4gbGYKKwlhX2xmPWBnaXQtaGFzaC1vYmplY3QgLXcgbGZgCisKKwlwcmludGYgIkhlbGxvXHJcbldvcmxkIiA+IG5lX2NybGYKKwlhX25lX2NybGY9YGdpdC1oYXNoLW9iamVjdCAtdyBuZV9jcmxmYAorCXByaW50ZiAiSGVsbG9cbldvcmxkIiA+IG5lX2xmCisJYV9uZV9sZj1gZ2l0LWhhc2gtb2JqZWN0IC13IG5lX2xmYAorCXByaW50ZiAiSGVsbG9ccldvcmxkIiA+IG5lX2NyCisJYV9uZV9jcj1gZ2l0LWhhc2gtb2JqZWN0IC13IG5lX2NyYAorCisJdG91Y2ggZW1wdHkKKwlhX2VtcHR5PWBnaXQtaGFzaC1vYmplY3QgLXcgZW1wdHlgCisJcHJpbnRmICJcbiIgPiBlbXB0eV9sZgorCWFfZW1wdHlfbGY9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eV9sZmAKKwlwcmludGYgIlxyIiA+IGVtcHR5X2NyCisJYV9lbXB0eV9jcj1gZ2l0LWhhc2gtb2JqZWN0IC13IGVtcHR5X2NyYAorCXByaW50ZiAiXHJcbiIgPiBlbXB0eV9jcmxmCisJYV9lbXB0eV9jcmxmPWBnaXQtaGFzaC1vYmplY3QgLXcgZW1wdHlfY3JsZmAKKworCXN2biBpbXBvcnQgLW0gJ2ltcG9ydCBmb3IgZ2l0LXN2bicgLiAiJHN2bnJlcG8iID4vZGV2L251bGwKK2NkIC4uCisKK3JtIC1yZiBpbXBvcnQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdvcmtpbmcgY29weSBmcm9tIHN2bicgInN2biBjbyAkc3ZucmVwbyB0ZXN0X3djIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc29tZSBjb21taXRzIHRvIHN2bicgXAorCSdjZCB0ZXN0X3djICYmCisJCWVjaG8gR3JlZXRpbmdzID4+IGt3LmMgJiYKKwkJcG9rZSBrdy5jICYmCisJCXN2biBjb21taXQgLW0gIk5vdCB5ZXQgYW4gSWQiICYmCisJCWVjaG8gSGVsbG8gd29ybGQgPj4ga3cuYyAmJgorCQlwb2tlIGt3LmMgJiYKKwkJc3ZuIGNvbW1pdCAtbSAiTW9kaWZpZWQgZmlsZSwgYnV0IHN0aWxsIG5vdCB5ZXQgYW4gSWQiICYmCisJCXN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBrdy5jICYmCisJCXBva2Uga3cuYyAmJgorCQlzdm4gY29tbWl0IC1tICJQcm9wc2V0IElkIiAmJgorCWNkIC4uJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIGdpdC1zdm4nICJnaXQtc3ZuIGluaXQgJHN2bnJlcG8iCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCByZXZpc2lvbnMgZnJvbSBzdm4nICdnaXQtc3ZuIGZldGNoJworCituYW1lPSd0ZXN0IHN2bjprZXl3b3JkcyBpZ25vcmluZycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisJJ2dpdCBjaGVja291dCAtYiBteWJyYW5jaCByZW1vdGVzL2dpdC1zdm4gJiYKKwllY2hvIEhpIGFnYWluID4+IGt3LmMgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJ0ZXN0IGtleXdvcmRzIGlnbm9yaW5nIiAmJgorCWdpdC1zdm4gc2V0LXRyZWUgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaCAmJgorCWdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuJworCitleHBlY3Q9Jy8qICRJZCQgKi8nCitnb3Q9ImBzZWQgLW5lIDJwIGt3LmNgIgordGVzdF9leHBlY3Rfc3VjY2VzcyAncmF3ICRJZCQgZm91bmQgaW4ga3cuYycgInRlc3QgJyRleHBlY3QnID0gJyRnb3QnIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJwcm9wc2V0IENSIG9uIGNybGYgZmlsZXMiIFwKKwknY2QgdGVzdF93YyAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIGVtcHR5ICYmCisJCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1IgY3JsZiAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIG5lX2NybGYgJiYKKwkJc3ZuIGNvbW1pdCAtbSAicHJvcHNldCBDUiBvbiBjcmxmIGZpbGVzIiAmJgorCSBjZCAuLicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggYW5kIHB1bGwgbGF0ZXN0IGZyb20gc3ZuIGFuZCBjaGVja291dCBhIG5ldyB3YycgXAorCSJnaXQtc3ZuIGZldGNoICYmCisJIGdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuICYmCisJIHN2biBjbyAkc3ZucmVwbyBuZXdfd2MiCisKK2ZvciBpIGluIGNybGYgbmVfY3JsZiBsZiBuZV9sZiBjciBuZV9jciBlbXB0eV9jciBlbXB0eV9sZiBlbXB0eSBlbXB0eV9jcmxmCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIkNvbXBhcmluZyAkaSIgImNtcCAkaSBuZXdfd2MvJGkiCitkb25lCisKKworY2QgdGVzdF93YworCXByaW50ZiAnJElkJFxySGVsbG9ccldvcmxkXHInID4gY3IKKwlwcmludGYgJyRJZCRcckhlbGxvXHJXb3JsZCcgPiBuZV9jcgorCWFfY3I9YHByaW50ZiAnJElkJFxyXG5IZWxsb1xyXG5Xb3JsZFxyXG4nIHwgZ2l0LWhhc2gtb2JqZWN0IC0tc3RkaW5gCisJYV9uZV9jcj1gcHJpbnRmICckSWQkXHJcbkhlbGxvXHJcbldvcmxkJyB8IGdpdC1oYXNoLW9iamVjdCAtLXN0ZGluYAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1NldCBDUkxGIG9uIGNyIGZpbGVzJyBcCisJJ3N2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1JMRiBjciAmJgorCSBzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSTEYgbmVfY3IgJiYKKwkgc3ZuIHByb3BzZXQgc3ZuOmtleXdvcmRzIElkIGNyICYmCisJIHN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBuZV9jciAmJgorCSBzdm4gY29tbWl0IC1tICJwcm9wc2V0IENSTEYgb24gY3IgZmlsZXMiJworY2QgLi4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIGFuZCBwdWxsIGxhdGVzdCBmcm9tIHN2bicgXAorCSdnaXQtc3ZuIGZldGNoICYmIGdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuJworCitiX2NyPSJgZ2l0LWhhc2gtb2JqZWN0IGNyYCIKK2JfbmVfY3I9ImBnaXQtaGFzaC1vYmplY3QgbmVfY3JgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDUkxGICsgJElkJCcgInRlc3QgJyRhX2NyJyA9ICckYl9jciciCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDUkxGICsgJElkJCAobm8gbmV3bGluZSknICJ0ZXN0ICckYV9uZV9jcicgPSAnJGJfbmVfY3InIgorCitjYXQgPiBzaG93LWlnbm9yZS5leHBlY3QgPDxcRU9GCisKKyMgLworL25vLXN1Y2gtZmlsZSoKKworIyBkZWVwbHkKKy9kZWVwbHkvbm8tc3VjaC1maWxlKgorCisjIGRlZXBseS9uZXN0ZWQKKy9kZWVwbHkvbmVzdGVkL25vLXN1Y2gtZmlsZSoKKworIyBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeQorL2RlZXBseS9uZXN0ZWQvZGlyZWN0b3J5L25vLXN1Y2gtZmlsZSoKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHNob3ctaWdub3JlJyAiCisJY2QgdGVzdF93YyAmJgorCW1rZGlyIC1wIGRlZXBseS9uZXN0ZWQvZGlyZWN0b3J5ICYmCisJc3ZuIGFkZCBkZWVwbHkgJiYKKwlzdm4gcHJvcHNldCAtUiBzdm46aWdub3JlICduby1zdWNoLWZpbGUqJyAuCisJc3ZuIGNvbW1pdCAtbSAncHJvcHNldCBzdm46aWdub3JlJworCWNkIC4uICYmCisJZ2l0LXN2biBzaG93LWlnbm9yZSA+IHNob3ctaWdub3JlLmdvdCAmJgorCWNtcCBzaG93LWlnbm9yZS5leHBlY3Qgc2hvdy1pZ25vcmUuZ290CisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDItZ2l0LXN2bi1kZWVwLXJtZGlyLnNoIGIvdC90OTEwMi1naXQtc3ZuLWRlZXAtcm1kaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGUwODA4MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDItZ2l0LXN2bi1kZWVwLXJtZGlyLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBybWRpcicKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIHJlcG8nICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwlta2RpciAtcCBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMSAmJgorCW1rZGlyIC1wIGRlZXBseS9uZXN0ZWQvZGlyZWN0b3J5L251bWJlci8yICYmCisJZWNobyBmb28gPiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMS9maWxlICYmCisJZWNobyBmb28gPiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMi9hbm90aGVyICYmCisJc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGZvciBnaXQtc3ZuJyAuICRzdm5yZXBvICYmCisJY2QgLi4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21pcnJvciB2aWEgZ2l0LXN2bicgIgorCWdpdC1zdm4gaW5pdCAkc3ZucmVwbyAmJgorCWdpdC1zdm4gZmV0Y2ggJiYKKwlnaXQgY2hlY2tvdXQgLWYgLWIgdGVzdC1ybWRpciByZW1vdGVzL2dpdC1zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1RyeSBhIGNvbW1pdCBvbiBybWRpcicgIgorCWdpdCBybSAtZiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMi9hbm90aGVyICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAncmVtb3ZlIGFub3RoZXInICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLXJtZGlyIEhFQUQgJiYKKwlzdm4gbHMgLVIgJHN2bnJlcG8gfCBncmVwIF5kZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMQorCSIKKworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDQtZ2l0LXN2bi1mb2xsb3ctcGFyZW50LnNoIGIvdC90OTEwNC1naXQtc3ZuLWZvbGxvdy1wYXJlbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzVhYTQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDQtZ2l0LXN2bi1mb2xsb3ctcGFyZW50LnNoCkBAIC0wLDAgKzEsMTcwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGZldGNoaW5nJworLiAuL2xpYi1naXQtc3ZuLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWxpemUgcmVwbycgIgorCW1rZGlyIGltcG9ydCAmJgorCWNkIGltcG9ydCAmJgorCW1rZGlyIC1wIHRydW5rICYmCisJZWNobyBoZWxsbyA+IHRydW5rL3JlYWRtZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCXN2biBjbyAkc3ZucmVwbyB3YyAmJgorCWNkIHdjICYmCisJZWNobyB3b3JsZCA+PiB0cnVuay9yZWFkbWUgJiYKKwlwb2tlIHRydW5rL3JlYWRtZSAmJgorCXN2biBjb21taXQgLW0gJ2Fub3RoZXIgY29tbWl0JyAmJgorCXN2biB1cCAmJgorCXN2biBtdiAtbSAncmVuYW1lIHRvIHRodW5rJyB0cnVuayB0aHVuayAmJgorCXN2biB1cCAmJgorCWVjaG8gZ29vZGJ5ZSA+PiB0aHVuay9yZWFkbWUgJiYKKwlwb2tlIHRodW5rL3JlYWRtZSAmJgorCXN2biBjb21taXQgLW0gJ2J5ZSBub3cnICYmCisJY2QgLi4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXQgYW5kIGZldGNoIGEgbW92ZWQgZGlyZWN0b3J5JyAiCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1pIHRodW5rICRzdm5yZXBvL3RodW5rICYmCisJZ2l0LXN2biBmZXRjaCAtaSB0aHVuayAmJgorCXRlc3QgXCJcYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL3RodW5rQDJcYFwiIFwKKyAgICAgICAgICAgPSBcIlxgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvdGh1bmt+MVxgXCIgJiYKKyAgICAgICAgdGVzdCBcIlxgZ2l0LWNhdC1maWxlIGJsb2IgcmVmcy9yZW1vdGVzL3RodW5rOnJlYWRtZSB8XAorICAgICAgICAgICAgICAgICBzZWQgLW4gLWUgJzNwJ1xgXCIgPSBnb29kYnllICYmCisJdGVzdCAteiBcIlxgZ2l0LWNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisJICAgICAgICAgJ150cnVuazpyZWZzL3JlbW90ZXMvdGh1bmtAMiQnXGBcIgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBhbmQgZmV0Y2ggZnJvbSBvbmUgc3ZuLXJlbW90ZScgIgorICAgICAgICBnaXQtY29uZmlnIHN2bi1yZW1vdGUuc3ZuLnVybCAkc3ZucmVwbyAmJgorICAgICAgICBnaXQtY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKyAgICAgICAgICB0cnVuazpyZWZzL3JlbW90ZXMvc3ZuL3RydW5rICYmCisgICAgICAgIGdpdC1jb25maWcgLS1hZGQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgIHRodW5rOnJlZnMvcmVtb3Rlcy9zdm4vdGh1bmsgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBzdm4vdGh1bmsgJiYKKwl0ZXN0IFwiXGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9zdm4vdHJ1bmtcYFwiIFwKKyAgICAgICAgICAgPSBcIlxgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvc3ZuL3RodW5rfjFcYFwiICYmCisgICAgICAgIHRlc3QgXCJcYGdpdC1jYXQtZmlsZSBibG9iIHJlZnMvcmVtb3Rlcy9zdm4vdGh1bms6cmVhZG1lIHxcCisgICAgICAgICAgICAgICAgIHNlZCAtbiAtZSAnM3AnXGBcIiA9IGdvb2RieWUKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb2xsb3cgZGVsZXRlZCBwYXJlbnQnICIKKyAgICAgICAgc3ZuIGNwIC1tICdyZXN1cnJlY3RpbmcgdHJ1bmsgYXMganVuaycgXAorICAgICAgICAgICAgICAgLXIyICRzdm5yZXBvL3RydW5rICRzdm5yZXBvL2p1bmsgJiYKKyAgICAgICAgZ2l0LWNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisgICAgICAgICAganVuazpyZWZzL3JlbW90ZXMvc3ZuL2p1bmsgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBzdm4vdGh1bmsgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBzdm4vanVuayAmJgorICAgICAgICB0ZXN0IC16IFwiXGBnaXQgZGlmZiBzdm4vanVuayBzdm4vdHJ1bmtcYFwiICYmCisgICAgICAgIHRlc3QgXCJcYGdpdCBtZXJnZS1iYXNlIHN2bi9qdW5rIHN2bi90cnVua1xgXCIgXAorICAgICAgICAgICA9IFwiXGBnaXQgcmV2LXBhcnNlIHN2bi90cnVua1xgXCIKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb2xsb3cgbGFyZ2VyIHBhcmVudCcgIgorICAgICAgICBta2RpciAtcCBpbXBvcnQvdHJ1bmsvdGh1bmsvYnVtcC90aHVkICYmCisgICAgICAgIGVjaG8gaGkgPiBpbXBvcnQvdHJ1bmsvdGh1bmsvYnVtcC90aHVkL2ZpbGUgJiYKKyAgICAgICAgc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGEgbGFyZ2VyIHBhcmVudCcgaW1wb3J0ICRzdm5yZXBvL2xhcmdlci1wYXJlbnQgJiYKKyAgICAgICAgc3ZuIGNwIC1tICdoaScgJHN2bnJlcG8vbGFyZ2VyLXBhcmVudCAkc3ZucmVwby9hbm90aGVyLWxhcmdlciAmJgorICAgICAgICBnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgbGFyZ2VyIFwKKyAgICAgICAgICAkc3ZucmVwby9hbm90aGVyLWxhcmdlci90cnVuay90aHVuay9idW1wL3RodWQgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBsYXJnZXIgJiYKKyAgICAgICAgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvbGFyZ2VyICYmCisgICAgICAgIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgXAorICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyLXBhcmVudC90cnVuay90aHVuay9idW1wL3RodWQgJiYKKyAgICAgICAgdGVzdCBcIlxgZ2l0LW1lcmdlLWJhc2UgXAorICAgICAgICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyLXBhcmVudC90cnVuay90aHVuay9idW1wL3RodWQgXAorICAgICAgICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyXGBcIiA9IFwKKyAgICAgICAgICAgICBcIlxgZ2l0LXJldi1wYXJzZSByZWZzL3JlbW90ZXMvbGFyZ2VyXGBcIgorICAgICAgICB0cnVlCisgICAgICAgICIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9sbG93IGhpZ2hlci1sZXZlbCBwYXJlbnQnICIKKyAgICAgICAgc3ZuIG1rZGlyIC1tICdmb2xsb3cgaGlnaGVyLWxldmVsIHBhcmVudCcgJHN2bnJlcG8vYmxvYiAmJgorICAgICAgICBzdm4gY28gJHN2bnJlcG8vYmxvYiBibG9iICYmCisgICAgICAgIGNkIGJsb2IgJiYKKyAgICAgICAgICAgICAgICBlY2hvIGhpID4gaGkgJiYKKyAgICAgICAgICAgICAgICBzdm4gYWRkIGhpICYmCisgICAgICAgICAgICAgICAgc3ZuIGNvbW1pdCAtbSAnaGloaScgJiYKKyAgICAgICAgICAgICAgICBjZCAuLgorICAgICAgICBzdm4gbWtkaXIgLW0gJ25ldyBnbG9iIGF0IHRvcCBsZXZlbCcgJHN2bnJlcG8vZ2xvYiAmJgorICAgICAgICBzdm4gbXYgLW0gJ21vdmUgYmxvYiBkb3duIGEgbGV2ZWwnICRzdm5yZXBvL2Jsb2IgJHN2bnJlcG8vZ2xvYi9ibG9iICYmCisgICAgICAgIGdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtaSBibG9iICRzdm5yZXBvL2dsb2IvYmxvYiAmJgorICAgICAgICBnaXQtc3ZuIGZldGNoIC1pIGJsb2IKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb2xsb3cgZGVsZXRlZCBkaXJlY3RvcnknICIKKwlzdm4gbXYgLW0gJ2J5ZSEnICRzdm5yZXBvL2dsb2IvYmxvYi9oaSAkc3ZucmVwby9nbG9iL2Jsb2IvYnllICYmCisJc3ZuIHJtIC1tICdyZW1vdmUgZ2xvYicgJHN2bnJlcG8vZ2xvYiAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtaSBnbG9iICRzdm5yZXBvL2dsb2IgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIGdsb2IgJiYKKwl0ZXN0IFwiXGBnaXQgY2F0LWZpbGUgYmxvYiByZWZzL3JlbW90ZXMvZ2xvYjpibG9iL2J5ZVxgXCIgPSBoaSAmJgorCXRlc3QgXCJcYGdpdCBscy10cmVlIHJlZnMvcmVtb3Rlcy9nbG9iIHwgd2MgLWwgXGBcIiAtZXEgMQorCSIKKworIyByZWY6IHI5MjcwIG9mIHRoZSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnk6IChodHRwOi8vc3ZuLmNvbGxhYi5uZXQvcmVwb3Mvc3ZuKQorIyBpbiB0cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9sbG93LXBhcmVudCBhdm9pZHMgZGVsZXRpbmcgcmVsZXZhbnQgaW5mbycgIgorCW1rZGlyIC1wIGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC90ICYmCisJZm9yIGkgaW4gYSBiIGMgOyBkbyBcCisJICBlY2hvIFwkaSA+IGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC9cJGkucG0gJiYKKwkgIGVjaG8gX1wkaSA+IGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC90L1wkaS50OyBcCisJZG9uZSAmJgorCSAgZWNobyAnYmFkIGRlbGV0ZSB0ZXN0JyA+IFwKKwkgICBpbXBvcnQvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwvdC9sYXJnZXItcGFyZW50ICYmCisJICBlY2hvICdiYWQgZGVsZXRlIHRlc3QgMicgPiBcCisJICAgaW1wb3J0L3RydW5rL3N1YnZlcnNpb24vYmluZGluZ3Mvc3dpZy9wZXJsL2Fub3RoZXItbGFyZ2VyICYmCisJY2QgaW1wb3J0ICYmCisJICBzdm4gaW1wb3J0IC1tICdyOTI3MCB0ZXN0JyAuICRzdm5yZXBvL3I5MjcwICYmCisJY2QgLi4gJiYKKwlzdm4gY28gJHN2bnJlcG8vcjkyNzAvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwgcjkyNzAgJiYKKwljZCByOTI3MCAmJgorCSAgc3ZuIG1rZGlyIG5hdGl2ZSAmJgorCSAgc3ZuIG12IHQgbmF0aXZlL3QgJiYKKwkgIGZvciBpIGluIGEgYiBjOyBkbyBzdm4gbXYgXCRpLnBtIG5hdGl2ZS9cJGkucG07IGRvbmUgJiYKKwkgIGVjaG8geiA+PiBuYXRpdmUvdC9jLnQgJiYKKwkgIHBva2UgbmF0aXZlL3QvYy50ICYmCisJICBzdm4gY29tbWl0IC1tICdyZW9yZyB0ZXN0JyAmJgorCWNkIC4uICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1pIHI5MjcwLXQgXAorCSAgJHN2bnJlcG8vcjkyNzAvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwvbmF0aXZlL3QgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIHI5MjcwLXQgJiYKKwl0ZXN0IFxgZ2l0IHJldi1saXN0IHI5MjcwLXQgfCB3YyAtbFxgIC1lcSAyICYmCisJdGVzdCBcIlxgZ2l0IGxzLXRyZWUgLS1uYW1lLW9ubHkgcjkyNzAtdH4xXGBcIiA9IFwKKwkgICAgIFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC10XGBcIgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAidHJhY2sgaW5pdGlhbCBjaGFuZ2UgaWYgaXQgd2FzIG9ubHkgbWFkZSB0byBwYXJlbnQiICIKKwlzdm4gY3AgLW0gJ3doZWVlIScgJHN2bnJlcG8vcjkyNzAvdHJ1bmsgJHN2bnJlcG8vcjkyNzAvZHJ1bmsgJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgcjkyNzAtZCBcCisJICAkc3ZucmVwby9yOTI3MC9kcnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC9uYXRpdmUvdCAmJgorCWdpdC1zdm4gZmV0Y2ggLWkgcjkyNzAtZCAmJgorCXRlc3QgXGBnaXQgcmV2LWxpc3QgcjkyNzAtZCB8IHdjIC1sXGAgLWVxIDMgJiYKKwl0ZXN0IFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC10XGBcIiA9IFwKKwkgICAgIFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC1kXGBcIiAmJgorCXRlc3QgXCJcYGdpdCByZXYtcGFyc2UgcjkyNzAtdFxgXCIgPSBcCisJICAgICBcIlxgZ2l0IHJldi1wYXJzZSByOTI3MC1kfjFcYFwiCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJ0cmFjayBtdWx0aS1wYXJlbnQgcGF0aHMiICIKKwlzdm4gY3AgLW0gJ3Jlc3VycmVjdCAvZ2xvYicgJHN2bnJlcG8vcjkyNzAgJHN2bnJlcG8vZ2xvYiAmJgorCWdpdC1zdm4gbXVsdGktZmV0Y2ggJiYKKwl0ZXN0IFxgZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZ2xvYiB8IFwKKwkgICAgICAgZ3JlcCAnXnBhcmVudCAnIHwgd2MgLWxcYCAtZXEgMgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAibXVsdGktZmV0Y2ggY29udGludWVzIHRvIHdvcmsiICIKKwlnaXQtc3ZuIG11bHRpLWZldGNoCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJtdWx0aS1mZXRjaCB3b3JrcyBvZmYgYSAnY2xlYW4nIHJlcG9zaXRvcnkiICIKKwlybSAtciAkR0lUX0RJUi9zdm4gJEdJVF9ESVIvcmVmcy9yZW1vdGVzICRHSVRfRElSL2xvZ3MgJiYKKwlta2RpciAkR0lUX0RJUi9zdm4gJiYKKwlnaXQtc3ZuIG11bHRpLWZldGNoCisJIgorCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsICYnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoIGIvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxOGUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTA1LWdpdC1zdm4tY29tbWl0LWRpZmYuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gY29tbWl0LWRpZmYnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJZWNobyBoZWxsbyA+IHJlYWRtZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCWVjaG8gaGVsbG8gPiByZWFkbWUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHJlYWRtZSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ2luaXRpYWwnICYmCisJZWNobyB3b3JsZCA+PiByZWFkbWUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdhbm90aGVyJworCSIKKworaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEXjBgCitwcmV2PWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUReMWAKKworIyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBjb21taXQtZGlmZiBjb21tYW5kIGFyZSB0aGUgc2FtZSBhcyB0aGUgcmVndWxhcgorIyBjb21taXQsIHNvIG9ubHkgYSBiYXNpYyB0ZXN0IG9mIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkIHNpbmNlIHdlJ3ZlCisjIGFscmVhZHkgdGVzdGVkIGNvbW1pdCBleHRlbnNpdmVseSBlbHNld2hlcmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCB0aGUgY29tbWl0LWRpZmYgY29tbWFuZCcgIgorCXRlc3QgLW4gJyRwcmV2JyAmJiB0ZXN0IC1uICckaGVhZCcgJiYKKwlnaXQtc3ZuIGNvbW1pdC1kaWZmIC1yMSAnJHByZXYnICckaGVhZCcgJyRzdm5yZXBvJyAmJgorCXN2biBjbyAkc3ZucmVwbyB3YyAmJgorCWNtcCByZWFkbWUgd2MvcmVhZG1lCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQtZGlmZiB0byBhIHN1Yi1kaXJlY3RvcnkgKHdpdGggZ2l0LXN2biBjb25maWcpJyAiCisJc3ZuIGltcG9ydCAtbSAnc3ViLWRpcmVjdG9yeScgaW1wb3J0ICRzdm5yZXBvL3N1YmRpciAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAkc3ZucmVwby9zdWJkaXIgJiYKKwlnaXQtc3ZuIGZldGNoICYmCisJZ2l0LXN2biBjb21taXQtZGlmZiAtcjMgJyRwcmV2JyAnJGhlYWQnICYmCisJc3ZuIGNhdCAkc3ZucmVwby9zdWJkaXIvcmVhZG1lID4gcmVhZG1lLjIgJiYKKwljbXAgcmVhZG1lIHJlYWRtZS4yCisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDYtZ2l0LXN2bi1jb21taXQtZGlmZi1jbG9iYmVyLnNoIGIvdC90OTEwNi1naXQtc3ZuLWNvbW1pdC1kaWZmLWNsb2JiZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYxMzJmMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDYtZ2l0LXN2bi1jb21taXQtZGlmZi1jbG9iYmVyLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGNvbW1pdC1kaWZmIGNsb2JiZXInCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJZWNobyBpbml0aWFsID4gZmlsZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCWVjaG8gaW5pdGlhbCA+IGZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdpbml0aWFsJworCSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBjaGFuZ2UgZnJvbSBzdm4gc2lkZScgIgorCXN2biBjbyAkc3ZucmVwbyB0LnN2biAmJgorCWNkIHQuc3ZuICYmCisJZWNobyBzZWNvbmQgbGluZSBmcm9tIHN2biA+PiBmaWxlICYmCisJcG9rZSBmaWxlICYmCisJc3ZuIGNvbW1pdCAtbSAnc2Vjb25kIGxpbmUgZnJvbSBzdm4nICYmCisJY2QgLi4gJiYKKwlybSAtcmYgdC5zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2NvbW1pdCBjb25mbGljdGluZyBjaGFuZ2UgZnJvbSBnaXQnICIKKwllY2hvIHNlY29uZCBsaW5lIGZyb20gZ2l0ID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdzZWNvbmQgbGluZSBmcm9tIGdpdCcgJiYKKwlnaXQtc3ZuIGNvbW1pdC1kaWZmIC1yMSBIRUFEfjEgSEVBRCAkc3ZucmVwbworCSIgfHwgdHJ1ZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgY29tcGxlbWVudGluZyBjaGFuZ2UgZnJvbSBnaXQnICIKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MSAmJgorCWVjaG8gc2Vjb25kIGxpbmUgZnJvbSBzdm4gPj4gZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ3NlY29uZCBsaW5lIGZyb20gc3ZuJyAmJgorCWVjaG8gdGhpcmQgbGluZSBmcm9tIGdpdCA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAndGhpcmQgbGluZSBmcm9tIGdpdCcgJiYKKwlnaXQtc3ZuIGNvbW1pdC1kaWZmIC1yMiBIRUFEfjEgSEVBRCAkc3ZucmVwbworCSIKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnZGNvbW1pdCBmYWlscyB0byBjb21taXQgYmVjYXVzZSBvZiBjb25mbGljdCcgIgorCWdpdC1zdm4gaW5pdCAkc3ZucmVwbyAmJgorCWdpdC1zdm4gZmV0Y2ggJiYKKwlnaXQgcmVzZXQgLS1oYXJkIHJlZnMvcmVtb3Rlcy9naXQtc3ZuICYmCisJc3ZuIGNvICRzdm5yZXBvIHQuc3ZuICYmCisJY2QgdC5zdm4gJiYKKwllY2hvIGZvdXJ0aCBsaW5lIGZyb20gc3ZuID4+IGZpbGUgJiYKKwlwb2tlIGZpbGUgJiYKKwlzdm4gY29tbWl0IC1tICdmb3VydGggbGluZSBmcm9tIHN2bicgJiYKKwljZCAuLiAmJgorCXJtIC1yZiB0LnN2biAmJgorCWVjaG8gJ2ZvdXJ0aCBsaW5lIGZyb20gZ2l0JyA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAnZm91cnRoIGxpbmUgZnJvbSBnaXQnICYmCisJZ2l0LXN2biBkY29tbWl0CisJIiB8fCB0cnVlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Rjb21taXQgZG9lcyB0aGUgc3ZuIGVxdWl2YWxlbnQgb2YgYW4gaW5kZXggbWVyZ2UnICIKKwlnaXQgcmVzZXQgLS1oYXJkIHJlZnMvcmVtb3Rlcy9naXQtc3ZuICYmCisJZWNobyAnaW5kZXggbWVyZ2UnID4gZmlsZTIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAnaW5kZXggbWVyZ2UnICYmCisJZWNobyAnbW9yZSBjaGFuZ2VzJyA+PiBmaWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdtb3JlIGNoYW5nZXMnICYmCisJZ2l0LXN2biBkY29tbWl0CisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDctZ2l0LXN2bi1taWdyYXRlLnNoIGIvdC90OTEwNy1naXQtc3ZuLW1pZ3JhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGMyYWZkYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDctZ2l0LXN2bi1taWdyYXRlLnNoCkBAIC0wLDAgKzEsMTEyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBtZXRhZGF0YSBtaWdyYXRpb25zIGZyb20gcHJldmlvdXMgdmVyc2lvbnMnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgb2xkLWxvb2tpbmcgbWV0YWRhdGEnICIKKwljcCAkR0lUX0RJUi9jb25maWcgJEdJVF9ESVIvY29uZmlnLW9sZC1naXQtc3ZuICYmCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJCWZvciBpIGluIHRydW5rIGJyYW5jaGVzL2EgYnJhbmNoZXMvYiBcCisJCSAgICAgICAgIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQkJbWtkaXIgLXAgXCRpICYmIFwKKwkJCWVjaG8gaGVsbG8gPj4gXCRpL1JFQURNRSB8fCBleGl0IDEKKwkJZG9uZSAmJiBcCisJCXN2biBpbXBvcnQgLW0gdGVzdCAuICRzdm5yZXBvCisJCWNkIC4uICYmCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvICYmCisJZ2l0LXN2biBmZXRjaCAmJgorCW12ICRHSVRfRElSL3N2bi8qICRHSVRfRElSLyAmJgorCW12ICRHSVRfRElSL3N2bi8ubWV0YWRhdGEgJEdJVF9ESVIvICYmCisJcm1kaXIgJEdJVF9ESVIvc3ZuICYmCisJZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy9naXQtc3ZuLUhFQUQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gJiYKKwlnaXQtdXBkYXRlLXJlZiByZWZzL2hlYWRzL3N2bi1IRUFEIHJlZnMvcmVtb3Rlcy9naXQtc3ZuICYmCisJZ2l0LXVwZGF0ZS1yZWYgLWQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gcmVmcy9yZW1vdGVzL2dpdC1zdm4KKwkiCisKK2hlYWQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9naXQtc3ZuLUhFQUReMGAKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1zdm4tSEVBRCBpcyBhIHJlYWwgSEVBRCcgInRlc3QgLW4gJyRoZWFkJyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSBvbGQtc3R5bGUgKHYwKSBnaXQtc3ZuIGxheW91dCcgIgorCW1rZGlyIC1wICRHSVRfRElSL2dpdC1zdm4vaW5mbyAkR0lUX0RJUi9zdm4vaW5mbyAmJgorCWVjaG8gJHN2bnJlcG8gPiAkR0lUX0RJUi9naXQtc3ZuL2luZm8vdXJsICYmCisJZWNobyAkc3ZucmVwbyA+ICRHSVRfRElSL3N2bi9pbmZvL3VybCAmJgorCWdpdC1zdm4gbWlncmF0ZSAmJgorCSEgdGVzdCAtZCAkR0lUX0RJUi9naXQtc3ZuICYmCisJZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvZ2l0LXN2bl4wICYmCisJZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvc3ZuXjAgJiYKKwl0ZXN0IFxgZ2l0IGNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi51cmxcYCA9ICckc3ZucmVwbycgJiYKKwl0ZXN0IFxgZ2l0IGNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi5mZXRjaFxgID0gXAorICAgICAgICAgICAgICc6cmVmcy9yZW1vdGVzL2dpdC1zdm4nCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIGEgbXVsdGktcmVwb3NpdG9yeSByZXBvJyAiCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvIC1UIHRydW5rIC10IHRhZ3MgLWIgYnJhbmNoZXMgJiYKKwlnaXQtY29uZmlnIC0tZ2V0LWFsbCBzdm4tcmVtb3RlLnN2bi5mZXRjaCA+IGZldGNoLm91dCAmJgorCWdyZXAgJ150cnVuazpyZWZzL3JlbW90ZXMvdHJ1bmskJyBmZXRjaC5vdXQgJiYKKwl0ZXN0IC1uIFwiXGBnaXQtY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLmJyYW5jaGVzIFwKKwkgICAgICAgICAgICAnXmJyYW5jaGVzL1wqOnJlZnMvcmVtb3Rlcy9cKiQnXGBcIiAmJgorCXRlc3QgLW4gXCJcYGdpdC1jb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4udGFncyBcCisJICAgICAgICAgICAgJ150YWdzL1wqOnJlZnMvcmVtb3Rlcy90YWdzL1wqJCdcYFwiICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IHN2bi1yZW1vdGUuc3ZuLmJyYW5jaGVzIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAnXmJyYW5jaGVzL1wqOnJlZnMvcmVtb3Rlcy9cKiQnICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IHN2bi1yZW1vdGUuc3ZuLnRhZ3MgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICdedGFncy9cKjpyZWZzL3JlbW90ZXMvdGFncy9cKiQnICYmCisJZ2l0LWNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCAnYnJhbmNoZXMvYTpyZWZzL3JlbW90ZXMvYScgJiYKKwlnaXQtY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoICdicmFuY2hlcy9iOnJlZnMvcmVtb3Rlcy9iJyAmJgorCWZvciBpIGluIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQlnaXQtY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKwkJICAgICAgICAgICAgICAgICBcJGk6cmVmcy9yZW1vdGVzL1wkaSB8fCBleGl0IDE7IGRvbmUKKwkiCisKKyMgcmVmcyBzaG91bGQgYWxsIGJlIGRpZmZlcmVudCwgYnV0IHRoZSB0cmVlcyBzaG91bGQgYWxsIGJlIHRoZSBzYW1lOgordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGktZmV0Y2ggd29ya3Mgb24gcGFydGlhbCB1cmxzICsgcGF0aHMnICIKKwlnaXQtc3ZuIG11bHRpLWZldGNoICYmCisJZm9yIGkgaW4gdHJ1bmsgYSBiIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQlnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9cJGleMCA+PiByZWZzLm91dCB8fCBleGl0IDE7CisJICAgIGRvbmUgJiYKKwl0ZXN0IC16IFwiXGBzb3J0IDwgcmVmcy5vdXQgfCB1bmlxIC1kXGBcIiAmJgorCWZvciBpIGluIHRydW5rIGEgYiB0YWdzLzAuMSB0YWdzLzAuMiB0YWdzLzAuMzsgZG8KKwkgIGZvciBqIGluIHRydW5rIGEgYiB0YWdzLzAuMSB0YWdzLzAuMiB0YWdzLzAuMzsgZG8KKwkJaWYgdGVzdCBcJGogIT0gXCRpOyB0aGVuIGNvbnRpbnVlOyBmaQorCSAgICB0ZXN0IC16IFwiXGBnaXQgZGlmZiByZWZzL3JlbW90ZXMvXCRpIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcy9yZW1vdGVzL1wkalxgXCIgfHxleGl0IDE7IGRvbmU7IGRvbmUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21pZ3JhdGUgLS1taW5pbWl6ZSBvbiBvbGQgaW5pdGVkIGxheW91dCcgIgorCWdpdCBjb25maWcgLS11bnNldC1hbGwgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggJiYKKwlnaXQgY29uZmlnIC0tdW5zZXQtYWxsIHN2bi1yZW1vdGUuc3ZuLnVybCAmJgorCXJtIC1yZiAkR0lUX0RJUi9zdm4gJiYKKwlmb3IgaSBpbiBcYGNhdCBmZXRjaC5vdXRcYDsgZG8KKwkJcGF0aD1cYGV4cHIgXCRpIDogJ1xcKFteOl0qXFwpOi4qJCdcYAorCQlyZWY9XGBleHByIFwkaSA6ICdbXjpdKjpyZWZzL3JlbW90ZXMvXFwoLipcXCkkJ1xgCisJCWlmIHRlc3QgLXogXCJcJHJlZlwiOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlpZiB0ZXN0IC1uIFwiXCRwYXRoXCI7IHRoZW4gcGF0aD1cIi9cJHBhdGhcIjsgZmkKKwkJKCBta2RpciAtcCAkR0lUX0RJUi9zdm4vXCRyZWYvaW5mby8gJiYKKwkJZWNobyAkc3ZucmVwb1wkcGF0aCA+ICRHSVRfRElSL3N2bi9cJHJlZi9pbmZvL3VybCApIHx8IGV4aXQgMTsKKwlkb25lICYmCisJZ2l0LXN2biBtaWdyYXRlIC0tbWluaW1pemUgJiYKKwl0ZXN0IC16IFwiXGBnaXQtY29uZmlnIC1sIHxncmVwIC12ICdec3ZuLXJlbW90ZVwuZ2l0LXN2blwuJ1xgXCIgJiYKKwlnaXQtY29uZmlnIC0tZ2V0LWFsbCBzdm4tcmVtb3RlLnN2bi5mZXRjaCA+IGZldGNoLm91dCAmJgorCWdyZXAgJ150cnVuazpyZWZzL3JlbW90ZXMvdHJ1bmskJyBmZXRjaC5vdXQgJiYKKwlncmVwICdeYnJhbmNoZXMvYTpyZWZzL3JlbW90ZXMvYSQnIGZldGNoLm91dCAmJgorCWdyZXAgJ15icmFuY2hlcy9iOnJlZnMvcmVtb3Rlcy9iJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMTpyZWZzL3JlbW90ZXMvdGFncy8wXC4xJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMjpyZWZzL3JlbW90ZXMvdGFncy8wXC4yJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMzpyZWZzL3JlbW90ZXMvdGFncy8wXC4zJCcgZmV0Y2gub3V0CisJZ3JlcCAnXjpyZWZzL3JlbW90ZXMvZ2l0LXN2bicgZmV0Y2gub3V0CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICAiLnJldl9kYiBhdXRvLWNvbnZlcnRlZCB0byAucmV2X2RiLlVVSUQiICIKKwlnaXQtc3ZuIGZldGNoIC1pIHRydW5rICYmCisJZXhwZWN0PSRHSVRfRElSL3N2bi90cnVuay8ucmV2X2RiLiogJiYKKwl0ZXN0IC1uIFwiXCRleHBlY3RcIiAmJgorCW12IFwkZXhwZWN0ICRHSVRfRElSL3N2bi90cnVuay8ucmV2X2RiICYmCisJZ2l0LXN2biBmZXRjaCAtaSB0cnVuayAmJgorCXRlc3QgLUwgJEdJVF9ESVIvc3ZuL3RydW5rLy5yZXZfZGIgJiYKKwl0ZXN0IC1mIFwkZXhwZWN0ICYmCisJY21wIFwkZXhwZWN0ICRHSVRfRElSL3N2bi90cnVuay8ucmV2X2RiCisJIgorCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90OTEwOC1naXQtc3ZuLWdsb2Iuc2ggYi90L3Q5MTA4LWdpdC1zdm4tZ2xvYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjQzNDRjCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwOC1naXQtc3ZuLWdsb2Iuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gZ2xvYmJpbmcgcmVmc3BlY3MnCisuIC4vbGliLWdpdC1zdm4uc2gKKworY2F0ID4gZXhwZWN0LmVuZCA8PEVPRgordGhlIGVuZAoraGkKK3N0YXJ0IGEgbmV3IGJyYW5jaAoraW5pdGlhbAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgcmVmc3BlYyBnbG9iYmluZycgIgorCW1rZGlyIC1wIHRydW5rL3NyYy9hIHRydW5rL3NyYy9iIHRydW5rL2RvYyAmJgorCWVjaG8gJ2hlbGxvIHdvcmxkJyA+IHRydW5rL3NyYy9hL3JlYWRtZSAmJgorCWVjaG8gJ2dvb2RieWUgd29ybGQnID4gdHJ1bmsvc3JjL2IvcmVhZG1lICYmCisJc3ZuIGltcG9ydCAtbSAnaW5pdGlhbCcgdHJ1bmsgJHN2bnJlcG8vdHJ1bmsgJiYKKwlzdm4gY28gJHN2bnJlcG8gdG1wICYmCisJY2QgdG1wICYmCisJCW1rZGlyIGJyYW5jaGVzIHRhZ3MgJiYKKwkJc3ZuIGFkZCBicmFuY2hlcyB0YWdzICYmCisJCXN2biBjcCB0cnVuayBicmFuY2hlcy9zdGFydCAmJgorCQlzdm4gY29tbWl0IC1tICdzdGFydCBhIG5ldyBicmFuY2gnICYmCisJCXN2biB1cCAmJgorCQllY2hvICdoaScgPj4gYnJhbmNoZXMvc3RhcnQvc3JjL2IvcmVhZG1lICYmCisJCXBva2UgYnJhbmNoZXMvc3RhcnQvc3JjL2IvcmVhZG1lICYmCisJCWVjaG8gJ2hleScgPj4gYnJhbmNoZXMvc3RhcnQvc3JjL2EvcmVhZG1lICYmCisJCXBva2UgYnJhbmNoZXMvc3RhcnQvc3JjL2EvcmVhZG1lICYmCisJCXN2biBjb21taXQgLW0gJ2hpJyAmJgorCQlzdm4gdXAgJiYKKwkJc3ZuIGNwIGJyYW5jaGVzL3N0YXJ0IHRhZ3MvZW5kICYmCisJCWVjaG8gJ2J5ZScgPj4gdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCXBva2UgdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCWVjaG8gJ2F5ZScgPj4gdGFncy9lbmQvc3JjL2EvcmVhZG1lICYmCisJCXBva2UgdGFncy9lbmQvc3JjL2EvcmVhZG1lICYmCisJCXN2biBjb21taXQgLW0gJ3RoZSBlbmQnICYmCisJCWVjaG8gJ2J5ZWJ5ZScgPj4gdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCXBva2UgdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCXN2biBjb21taXQgLW0gJ25vdGhpbmcgdG8gc2VlIGhlcmUnCisJCWNkIC4uICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi51cmwgJHN2bnJlcG8gJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKwkgICAgICAgICAgICAgICAgICd0cnVuay9zcmMvYTpyZWZzL3JlbW90ZXMvdHJ1bmsnICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5icmFuY2hlcyBcCisJICAgICAgICAgICAgICAgICAnYnJhbmNoZXMvKi9zcmMvYTpyZWZzL3JlbW90ZXMvYnJhbmNoZXMvKicgJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLnRhZ3NcCisJICAgICAgICAgICAgICAgICAndGFncy8qL3NyYy9hOnJlZnMvcmVtb3Rlcy90YWdzLyonICYmCisJZ2l0LXN2biBtdWx0aS1mZXRjaCAmJgorCWdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSByZWZzL3JlbW90ZXMvdGFncy9lbmQgfCBcCisJICAgIHNlZCAtZSAncy9eLlx7NDFcfS8vJyA+IG91dHB1dC5lbmQgJiYKKwljbXAgZXhwZWN0LmVuZCBvdXRwdXQuZW5kICYmCisJdGVzdCBcIlxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvdGFncy9lbmR+MVxgXCIgPSBcCisJCVwiXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9icmFuY2hlcy9zdGFydFxgXCIgJiYKKwl0ZXN0IFwiXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9icmFuY2hlcy9zdGFydH4yXGBcIiA9IFwKKwkJXCJcYGdpdCByZXYtcGFyc2UgcmVmcy9yZW1vdGVzL3RydW5rXGBcIgorCSIKKworZWNobyB0cnkgdG8gdHJ5ID4gZXhwZWN0LnR3bworZWNobyBub3RoaW5nIHRvIHNlZSBoZXJlID4+IGV4cGVjdC50d28KK2NhdCBleHBlY3QuZW5kID4+IGV4cGVjdC50d28KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBsZWZ0LWhhbmQtc2lkZSBvbmx5IGdsb2JiaW5nJyAiCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnR3by51cmwgJHN2bnJlcG8gJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUudHdvLmZldGNoIHRydW5rOnJlZnMvcmVtb3Rlcy90d28vdHJ1bmsgJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUudHdvLmJyYW5jaGVzIFwKKwkgICAgICAgICAgICAgICAgICdicmFuY2hlcy8qOnJlZnMvcmVtb3Rlcy90d28vYnJhbmNoZXMvKicgJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUudHdvLnRhZ3MgXAorCSAgICAgICAgICAgICAgICAgJ3RhZ3MvKjpyZWZzL3JlbW90ZXMvdHdvL3RhZ3MvKicgJiYKKwljZCB0bXAgJiYKKwkJZWNobyAndHJ5IHRyeScgPj4gdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCXBva2UgdGFncy9lbmQvc3JjL2IvcmVhZG1lICYmCisJCXN2biBjb21taXQgLW0gJ3RyeSB0byB0cnknCisJCWNkIC4uICYmCisJZ2l0LXN2biBmZXRjaCB0d28gJiYKKwl0ZXN0IFxgZ2l0IHJldi1saXN0IHJlZnMvcmVtb3Rlcy90d28vdGFncy9lbmQgfCB3YyAtbFxgIC1lcSA2ICYmCisJdGVzdCBcYGdpdCByZXYtbGlzdCByZWZzL3JlbW90ZXMvdHdvL2JyYW5jaGVzL3N0YXJ0IHwgd2MgLWxcYCAtZXEgMyAmJgorCXRlc3QgXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy90d28vYnJhbmNoZXMvc3RhcnR+MlxgID0gXAorCSAgICAgXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy90d28vdHJ1bmtcYCAmJgorCXRlc3QgXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy90d28vdGFncy9lbmR+M1xgID0gXAorCSAgICAgXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy90d28vYnJhbmNoZXMvc3RhcnRcYCAmJgorCWdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSByZWZzL3JlbW90ZXMvdHdvL3RhZ3MvZW5kIHwgXAorCSAgICBzZWQgLWUgJ3MvXi5cezQxXH0vLycgPiBvdXRwdXQudHdvICYmCisJY21wIGV4cGVjdC50d28gb3V0cHV0LnR3bworCSIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTEwLWdpdC1zdm4tdXNlLXN2bS1wcm9wcy5zaCBiL3QvdDkxMTAtZ2l0LXN2bi11c2Utc3ZtLXByb3BzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ZTE3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTEwLWdpdC1zdm4tdXNlLXN2bS1wcm9wcy5zaApAQCAtMCwwICsxLDUyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIHVzZVN2bVByb3BzIHRlc3QnCisKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2FkIHN2bSByZXBvJyAiCisJc3ZuYWRtaW4gbG9hZCAtcSAkcmF3c3ZucmVwbyA8IC4uL3Q5MTEwL3N2bS5kdW1wICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1SIGFyciAtaSBiYXIgJHN2bnJlcG8vbWlycm9yL2FyciAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtUiBhcmdoIC1pIGRpciAkc3ZucmVwby9taXJyb3IvYXJnaCAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtUiBhcmdoIC1pIGUgXAorCSAgJHN2bnJlcG8vbWlycm9yL2FyZ2gvYS9iL2MvZC9lICYmCisJZ2l0LWNvbmZpZyBzdm4udXNlU3ZtUHJvcHMgdHJ1ZSAmJgorCWdpdC1zdm4gZmV0Y2ggLS1hbGwKKwkiCisKK3V1aWQ9MTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5CisKK2Jhcl91cmw9aHR0cDovL21heW9uYWlzZS9zdm5yZXBvL2JhcgordGVzdF9leHBlY3Rfc3VjY2VzcyAndmVyaWZ5IG1ldGFkYXRhIGZvciAvYmFyJyAiCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxMiAkdXVpZCQnICYmCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjEgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDExICR1dWlkJCcgJiYKKwlnaXQtY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+MiB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAMTAgJHV1aWQkJyAmJgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn4zIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEA5ICR1dWlkJCcgJiYKKwlnaXQtY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+NCB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxANiAkdXVpZCQnICYmCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjUgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDEgJHV1aWQkJworCSIKKworZV91cmw9aHR0cDovL21heW9uYWlzZS9zdm5yZXBvL2Rpci9hL2IvYy9kL2UKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBtZXRhZGF0YSBmb3IgL2Rpci9hL2IvYy9kL2UnICIKKwlnaXQtY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9lIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkZV91cmxAMSAkdXVpZCQnCisJIgorCitkaXJfdXJsPWh0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwby9kaXIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBtZXRhZGF0YSBmb3IgL2RpcicgIgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2RpciB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGRpcl91cmxAMiAkdXVpZCQnICYmCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZGlyfjEgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRkaXJfdXJsQDEgJHV1aWQkJworCSIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTEwL3N2bS5kdW1wIGIvdC90OTExMC9zdm0uZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTExMC9zdm0uZHVtcApAQCAtMCwwICsxLDUxMSBAQAorU1ZOLWZzLWR1bXAtZm9ybWF0LXZlcnNpb246IDIKKworVVVJRDogZGU1OTczYzYtNTQ1ZC00MWRhLWFkZWQtYzI2NWY5MDM5ZTc0CisKK1JldmlzaW9uLW51bWJlcjogMAorUHJvcC1jb250ZW50LWxlbmd0aDogNTYKK0NvbnRlbnQtbGVuZ3RoOiA1NgorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA2OjU0OjU5Ljc5MzEwNFoKK1BST1BTLUVORAorCitSZXZpc2lvbi1udW1iZXI6IDEKK1Byb3AtY29udGVudC1sZW5ndGg6IDIwMAorQ29udGVudC1sZW5ndGg6IDIwMAorCitLIDcKK3N2bjpsb2cKK1YgNDAKK1NWTTogaW5pdGlhbGl6aW5nIG1pcnJvciBmb3IgL21pcnJvci9hcnIKK0sgMTAKK3N2bjphdXRob3IKK1YgMworc3ZtCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjAKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNjo1NTowMC4xMjE2NDdaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiAKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiA0NAorQ29udGVudC1sZW5ndGg6IDQ0CisKK0sgMTAKK3N2bTptaXJyb3IKK1YgMTIKKy9taXJyb3IvYXJyCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogbWlycm9yCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcnIKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTYKK0NvbnRlbnQtbGVuZ3RoOiAxMTYKKworSyAxMAorc3ZtOnNvdXJjZQorViAyOQoraHR0cDovL21heW9uYWlzZS9zdm5yZXBvIS9iYXIKK0sgOAorc3ZtOnV1aWQKK1YgMzYKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorUFJPUFMtRU5ECisKKworUmV2aXNpb24tbnVtYmVyOiAyCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxODIKK0NvbnRlbnQtbGVuZ3RoOiAxODIKKworSyA3Citzdm46bG9nCitWIDE4CitpbXBvcnQgZm9yIGdpdC1zdm4KK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAxMQorc3ZtOmhlYWRyZXYKK1YgMzkKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OToxCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTIuMTA4ODQ3WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2FycgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDExNgorQ29udGVudC1sZW5ndGg6IDExNgorCitLIDEwCitzdm06c291cmNlCitWIDI5CitodHRwOi8vbWF5b25haXNlL3N2bnJlcG8hL2JhcgorSyA4Citzdm06dXVpZAorViAzNgorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5CitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcnIvenp6CitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAzM2IwMmJjMTVjZTk1NTdkMmRkODQ4NGQ1OGY5NWFjNAorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorenp6CisKKworUmV2aXNpb24tbnVtYmVyOiAzCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAyMzAKK0NvbnRlbnQtbGVuZ3RoOiAyMzAKKworSyA3Citzdm46bG9nCitWIDY2CituZXcgc3ltbGluayBpcyBhZGRlZCB0byBhIGZpbGUgdGhhdCB3YXMgYWxzbyBqdXN0IG1hZGUgZXhlY3V0YWJsZQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgMTEKK3N2bTpoZWFkcmV2CitWIDM5CisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODk6NgorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjExOjAxLjY4Njg5MVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1pcnJvci9hcnIvenp6CitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDM2CitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAzM2IwMmJjMTVjZTk1NTdkMmRkODQ4NGQ1OGY5NWFjNAorQ29udGVudC1sZW5ndGg6IDQwCisKK0sgMTQKK3N2bjpleGVjdXRhYmxlCitWIDEKKyoKK1BST1BTLUVORAorenp6CisKKworUmV2aXNpb24tbnVtYmVyOiA0CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxOTIKK0NvbnRlbnQtbGVuZ3RoOiAxOTIKKworSyA3Citzdm46bG9nCitWIDI4CisvYmFyL2Qgc2hvdWxkIGJlIGluIHRoZSBsb2cKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjkKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowNy42ODY1NTJaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJyL2QKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDQKK1RleHQtY29udGVudC1tZDU6IDBiZWU4OWIwN2EyNDhlMjdjODNmYzNkNTk1MTIxM2MxCitDb250ZW50LWxlbmd0aDogMTQKKworUFJPUFMtRU5ECithYmMKKworCitSZXZpc2lvbi1udW1iZXI6IDUKK1Byb3AtY29udGVudC1sZW5ndGg6IDE4NQorQ29udGVudC1sZW5ndGg6IDE4NQorCitLIDcKK3N2bjpsb2cKK1YgMjAKK2FkZCBhIG5ldyBkaXJlY3RvcnkKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViA0MAorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjEwCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDguNDA1OTUzWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2Fyci9uZXdkaXIKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogbWlycm9yL2Fyci9uZXdkaXIvZGlyCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiA5Y2Q1OTlhMzUyMzg5OGU2YTEyZTEzZWM3ODdkYTUwYQorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorbmV3CisKKworUmV2aXNpb24tbnVtYmVyOiA2CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxOTYKK0NvbnRlbnQtbGVuZ3RoOiAxOTYKKworSyA3Citzdm46bG9nCitWIDMxCittb2RpZnkgYSBmaWxlIGluIG5ldyBkaXJlY3RvcnkKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViA0MAorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjExCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDkuMTI2NjQ1WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2Fyci9uZXdkaXIvZGlyCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1RleHQtY29udGVudC1sZW5ndGg6IDgKK1RleHQtY29udGVudC1tZDU6IGE5NTBlMjAzMzIzNThlNTIzYTVlOWQ1NzFlNDdmYTY0CitDb250ZW50LWxlbmd0aDogOAorCituZXcKK2ZvbworCisKK1JldmlzaW9uLW51bWJlcjogNworUHJvcC1jb250ZW50LWxlbmd0aDogMTc5CitDb250ZW50LWxlbmd0aDogMTc5CisKK0sgNworc3ZuOmxvZworViAxNAordXBkYXRlIC9iYXIvZAorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgMTEKK3N2bTpoZWFkcmV2CitWIDQwCisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODk6MTIKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowOS44NDYyMjFaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJyL2QKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogN2FiYjc4ZGU3ZjI3NTZjYThiNTExY2JjODc5ZmQ1ZTcKK0NvbnRlbnQtbGVuZ3RoOiA0CisKK2NiYQorCisKK1JldmlzaW9uLW51bWJlcjogOAorUHJvcC1jb250ZW50LWxlbmd0aDogMjAxCitDb250ZW50LWxlbmd0aDogMjAxCisKK0sgNworc3ZuOmxvZworViA0MQorU1ZNOiBpbml0aWFsaXppbmcgbWlycm9yIGZvciAvbWlycm9yL2FyZ2gKK0sgMTAKK3N2bjphdXRob3IKK1YgMworc3ZtCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjAKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNjo1NjowMy43MDM2NzdaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiAKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiA1NworQ29udGVudC1sZW5ndGg6IDU3CisKK0sgMTAKK3N2bTptaXJyb3IKK1YgMjUKKy9taXJyb3IvYXJnaAorL21pcnJvci9hcnIKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaAorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDExNgorQ29udGVudC1sZW5ndGg6IDExNgorCitLIDEwCitzdm06c291cmNlCitWIDI5CitodHRwOi8vbWF5b25haXNlL3N2bnJlcG8hL2RpcgorSyA4Citzdm06dXVpZAorViAzNgorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5CitQUk9QUy1FTkQKKworCitSZXZpc2lvbi1udW1iZXI6IDkKK1Byb3AtY29udGVudC1sZW5ndGg6IDE4MgorQ29udGVudC1sZW5ndGg6IDE4MgorCitLIDcKK3N2bjpsb2cKK1YgMTgKK2ltcG9ydCBmb3IgZ2l0LXN2bgorSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjEKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMDo1Mi4xMDg4NDdaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaAorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDExNgorQ29udGVudC1sZW5ndGg6IDExNgorCitLIDEwCitzdm06c291cmNlCitWIDI5CitodHRwOi8vbWF5b25haXNlL3N2bnJlcG8hL2RpcgorSyA4Citzdm06dXVpZAorViAzNgorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5CitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogbWlycm9yL2FyZ2gvYS9iCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EvYi9jCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EvYi9jL2QKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogbWlycm9yL2FyZ2gvYS9iL2MvZC9lCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EvYi9jL2QvZS9maWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA5CitUZXh0LWNvbnRlbnQtbWQ1OiAzZmQ0NmZlNDZmY2RjZjA2MmM4MDJjYTYwZGM4MjZkNQorQ29udGVudC1sZW5ndGg6IDE5CisKK1BST1BTLUVORAorZGVlcCBkaXIKKworCitSZXZpc2lvbi1udW1iZXI6IDEwCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxOTcKK0NvbnRlbnQtbGVuZ3RoOiAxOTcKKworSyA3Citzdm46bG9nCitWIDMzCit0cnkgYSBkZWVwIC0tcm1kaXIgd2l0aCBhIGNvbW1pdAorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgMTEKK3N2bTpoZWFkcmV2CitWIDM5CisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODk6MgorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjU0Ljg0NzAxNVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2ZpbGUKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorTm9kZS1jb3B5ZnJvbS1yZXY6IDkKK05vZGUtY29weWZyb20tcGF0aDogbWlycm9yL2FyZ2gvYS9iL2MvZC9lL2ZpbGUKK1RleHQtY29udGVudC1sZW5ndGg6IDkKK1RleHQtY29udGVudC1tZDU6IDNmZDQ2ZmU0NmZjZGNmMDYyYzgwMmNhNjBkYzgyNmQ1CitDb250ZW50LWxlbmd0aDogOQorCitkZWVwIGRpcgorCisKK05vZGUtcGF0aDogbWlycm9yL2FyZ2gvYQorTm9kZS1hY3Rpb246IGRlbGV0ZQorCisKZGlmZiAtLWdpdCBhL3QvdDkxMTEtZ2l0LXN2bi11c2Utc3Zuc3luYy1wcm9wcy5zaCBiL3QvdDkxMTEtZ2l0LXN2bi11c2Utc3Zuc3luYy1wcm9wcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTIzMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTExMS1naXQtc3ZuLXVzZS1zdm5zeW5jLXByb3BzLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gdXNlU3Zuc3luY1Byb3BzIHRlc3QnCisKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2FkIHN2bnN5bmMgcmVwbycgIgorCXN2bmFkbWluIGxvYWQgLXEgJHJhd3N2bnJlcG8gPCAuLi90OTExMS9zdm5zeW5jLmR1bXAgJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLVIgYXJyIC1pIGJhciAkc3ZucmVwby9iYXIgJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLVIgYXJnaCAtaSBkaXIgJHN2bnJlcG8vZGlyICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1SIGFyZ2ggLWkgZSAkc3ZucmVwby9kaXIvYS9iL2MvZC9lICYmCisJZ2l0LWNvbmZpZyBzdm4udXNlU3Zuc3luY1Byb3BzIHRydWUgJiYKKwlnaXQtc3ZuIGZldGNoIC0tYWxsCisJIgorCit1dWlkPTE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorCitiYXJfdXJsPWh0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwby9iYXIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBtZXRhZGF0YSBmb3IgL2JhcicgIgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2JhciB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAMTIgJHV1aWQkJyAmJgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn4xIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxMSAkdXVpZCQnICYmCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjIgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDEwICR1dWlkJCcgJiYKKwlnaXQtY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+MyB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAOSAkdXVpZCQnICYmCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjQgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDYgJHV1aWQkJyAmJgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn41IHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxICR1dWlkJCcKKwkiCisKK2VfdXJsPWh0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwby9kaXIvYS9iL2MvZC9lCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWV0YWRhdGEgZm9yIC9kaXIvYS9iL2MvZC9lJyAiCisJZ2l0LWNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZSB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGVfdXJsQDEgJHV1aWQkJworCSIKKworZGlyX3VybD1odHRwOi8vbWF5b25haXNlL3N2bnJlcG8vZGlyCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWV0YWRhdGEgZm9yIC9kaXInICIKKwlnaXQtY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9kaXIgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRkaXJfdXJsQDIgJHV1aWQkJyAmJgorCWdpdC1jYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Rpcn4xIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkZGlyX3VybEAxICR1dWlkJCcKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExMS9zdm5zeW5jLmR1bXAgYi90L3Q5MTExL3N2bnN5bmMuZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWE0NmVlCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTExMS9zdm5zeW5jLmR1bXAKQEAgLTAsMCArMSw1NjIgQEAKK1NWTi1mcy1kdW1wLWZvcm1hdC12ZXJzaW9uOiAyCisKK1VVSUQ6IGI0YmZlMzVlLWYyNTYtNDA5Ni04NzRjLTA4YzU2MzllY2FkNworCitSZXZpc2lvbi1udW1iZXI6IDAKK1Byb3AtY29udGVudC1sZW5ndGg6IDI0MAorQ29udGVudC1sZW5ndGg6IDI0MAorCitLIDE4Citzdm46c3luYy1mcm9tLXV1aWQKK1YgMzYKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDI0Citzdm46c3luYy1sYXN0LW1lcmdlZC1yZXYKK1YgMgorMTIKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTIuMDE3NTUyWgorSyAxNworc3ZuOnN5bmMtZnJvbS11cmwKK1YgMjQKK2h0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwbworUFJPUFMtRU5ECisKK1JldmlzaW9uLW51bWJlcjogMQorUHJvcC1jb250ZW50LWxlbmd0aDogMTIwCitDb250ZW50LWxlbmd0aDogMTIwCisKK0sgNworc3ZuOmxvZworViAxOAoraW1wb3J0IGZvciBnaXQtc3ZuCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTIuMTA4ODQ3WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IGJhci96enoKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDQKK1RleHQtY29udGVudC1tZDU6IDMzYjAyYmMxNWNlOTU1N2QyZGQ4NDg0ZDU4Zjk1YWM0CitDb250ZW50LWxlbmd0aDogMTQKKworUFJPUFMtRU5ECit6enoKKworCitOb2RlLXBhdGg6IGRpcgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYQorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYS9iCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IGRpci9hL2IvYworTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYS9iL2MvZAorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYS9iL2MvZC9lCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IGRpci9hL2IvYy9kL2UvZmlsZQorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogOQorVGV4dC1jb250ZW50LW1kNTogM2ZkNDZmZTQ2ZmNkY2YwNjJjODAyY2E2MGRjODI2ZDUKK0NvbnRlbnQtbGVuZ3RoOiAxOQorCitQUk9QUy1FTkQKK2RlZXAgZGlyCisKKworTm9kZS1wYXRoOiBleGVjLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDM1CitUZXh0LWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LW1kNTogM2UyYjMxYzcyMTgxYjg3MTQ5ZmY5OTVlNzIwMmMwZTMKK0NvbnRlbnQtbGVuZ3RoOiA0NQorCitLIDE0Citzdm46ZXhlY3V0YWJsZQorViAwCisKK1BST1BTLUVORAorIyEvYmluL3NoCisKKworTm9kZS1wYXRoOiBmb28KK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDQKK1RleHQtY29udGVudC1tZDU6IGQzYjA3Mzg0ZDExM2VkZWM0OWVhYTYyMzhhZDVmZjAwCitDb250ZW50LWxlbmd0aDogMTQKKworUFJPUFMtRU5ECitmb28KKworCitOb2RlLXBhdGg6IGZvby5saW5rCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDMzCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA4CitUZXh0LWNvbnRlbnQtbWQ1OiAxMDQzMTQ2ZTQ5ZWYwMmNhYjEyZWVmODY1Y2IzNGZmMworQ29udGVudC1sZW5ndGg6IDQxCisKK0sgMTEKK3N2bjpzcGVjaWFsCitWIDEKKyoKK1BST1BTLUVORAorbGluayBmb28KKworUmV2aXNpb24tbnVtYmVyOiAyCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMzUKK0NvbnRlbnQtbGVuZ3RoOiAxMzUKKworSyA3Citzdm46bG9nCitWIDMzCit0cnkgYSBkZWVwIC0tcm1kaXIgd2l0aCBhIGNvbW1pdAorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTQuODQ3MDE1WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogZGlyL2ZpbGUKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorTm9kZS1jb3B5ZnJvbS1yZXY6IDEKK05vZGUtY29weWZyb20tcGF0aDogZGlyL2EvYi9jL2QvZS9maWxlCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA5CitUZXh0LWNvbnRlbnQtbWQ1OiAzZmQ0NmZlNDZmY2RjZjA2MmM4MDJjYTYwZGM4MjZkNQorQ29udGVudC1sZW5ndGg6IDkKKworZGVlcCBkaXIKKworCitOb2RlLXBhdGg6IGRpci9hCitOb2RlLWFjdGlvbjogZGVsZXRlCisKKworTm9kZS1wYXRoOiBmaWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK05vZGUtY29weWZyb20tcmV2OiAxCitOb2RlLWNvcHlmcm9tLXBhdGg6IGRpci9hL2IvYy9kL2UvZmlsZQorVGV4dC1jb250ZW50LWxlbmd0aDogOQorVGV4dC1jb250ZW50LW1kNTogM2ZkNDZmZTQ2ZmNkY2YwNjJjODAyY2E2MGRjODI2ZDUKK0NvbnRlbnQtbGVuZ3RoOiA5CisKK2RlZXAgZGlyCisKKworUmV2aXNpb24tbnVtYmVyOiAzCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMzYKK0NvbnRlbnQtbGVuZ3RoOiAxMzYKKworSyA3Citzdm46bG9nCitWIDM0CityZW1vdmUgZXhlY3V0YWJsZSBiaXQgZnJvbSBhIGZpbGUKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjU4LjIzMjY5MVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IGV4ZWMuc2gKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbWQ1OiAzZTJiMzFjNzIxODFiODcxNDlmZjk5NWU3MjAyYzBlMworQ29udGVudC1sZW5ndGg6IDIwCisKK1BST1BTLUVORAorIyEvYmluL3NoCisKKworUmV2aXNpb24tbnVtYmVyOiA0CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMzEKK0NvbnRlbnQtbGVuZ3RoOiAxMzEKKworSyA3Citzdm46bG9nCitWIDI5CithZGQgZXhlY3V0YWJsZSBiaXQgYmFjayBmaWxlCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMDo1OS42NjY1NjBaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBleGVjLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDM2CitUZXh0LWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LW1kNTogM2UyYjMxYzcyMTgxYjg3MTQ5ZmY5OTVlNzIwMmMwZTMKK0NvbnRlbnQtbGVuZ3RoOiA0NgorCitLIDE0Citzdm46ZXhlY3V0YWJsZQorViAxCisqCitQUk9QUy1FTkQKKyMhL2Jpbi9zaAorCisKK1JldmlzaW9uLW51bWJlcjogNQorUHJvcC1jb250ZW50LWxlbmd0aDogMTU0CitDb250ZW50LWxlbmd0aDogMTU0CisKK0sgNworc3ZuOmxvZworViA1MgorZXhlY3V0YWJsZSBmaWxlIGJlY29tZXMgYSBzeW1saW5rIHRvIGJhci96enogKGZpbGUpCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowMC42NzY0OTVaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBleGVjLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDMzCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiAxMgorVGV4dC1jb250ZW50LW1kNTogZjEzODY5MzM3MTY2NWNjMTE3NzQyNTA4NzYxZDY4NGQKK0NvbnRlbnQtbGVuZ3RoOiA0NQorCitLIDExCitzdm46c3BlY2lhbAorViAxCisqCitQUk9QUy1FTkQKK2xpbmsgYmFyL3p6egorCitSZXZpc2lvbi1udW1iZXI6IDYKK1Byb3AtY29udGVudC1sZW5ndGg6IDE2OAorQ29udGVudC1sZW5ndGg6IDE2OAorCitLIDcKK3N2bjpsb2cKK1YgNjYKK25ldyBzeW1saW5rIGlzIGFkZGVkIHRvIGEgZmlsZSB0aGF0IHdhcyBhbHNvIGp1c3QgbWFkZSBleGVjdXRhYmxlCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowMS42ODY4OTFaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBiYXIvenp6CitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDM2CitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAzM2IwMmJjMTVjZTk1NTdkMmRkODQ4NGQ1OGY5NWFjNAorQ29udGVudC1sZW5ndGg6IDQwCisKK0sgMTQKK3N2bjpleGVjdXRhYmxlCitWIDEKKyoKK1BST1BTLUVORAorenp6CisKKworTm9kZS1wYXRoOiBleGVjLTIuc2gKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorTm9kZS1jb3B5ZnJvbS1yZXY6IDUKK05vZGUtY29weWZyb20tcGF0aDogZXhlYy5zaAorVGV4dC1jb250ZW50LWxlbmd0aDogMTIKK1RleHQtY29udGVudC1tZDU6IGYxMzg2OTMzNzE2NjVjYzExNzc0MjUwODc2MWQ2ODRkCitDb250ZW50LWxlbmd0aDogMTIKKworbGluayBiYXIvenp6CisKK1JldmlzaW9uLW51bWJlcjogNworUHJvcC1jb250ZW50LWxlbmd0aDogMTM2CitDb250ZW50LWxlbmd0aDogMTM2CisKK0sgNworc3ZuOmxvZworViAzNAorbW9kaWZ5IGEgc3ltbGluayB0byBiZWNvbWUgYSBmaWxlCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowMi42NzcwMzVaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBleGVjLTIuc2gKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDkKK1RleHQtY29udGVudC1tZDU6IDhlOTJlZmY5ZTkxMTg4NmNlZGUyN2Q0MjBmODljNzM1CitDb250ZW50LWxlbmd0aDogMTkKKworUFJPUFMtRU5ECitnaXQgaGVscAorCisKK1JldmlzaW9uLW51bWJlcjogOAorUHJvcC1jb250ZW50LWxlbmd0aDogMTA5CitDb250ZW50LWxlbmd0aDogMTA5CisKK0sgNworc3ZuOmxvZworViA4CivDqcOv4oiPCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowMy42NzY4NjJaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBleGVjLTIuc2gKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorVGV4dC1jb250ZW50LWxlbmd0aDogMTcKK1RleHQtY29udGVudC1tZDU6IDQ5ODgxOTU0MDYzY2YyNmNhNDhjMjEyMzk2YTk1N2NhCitDb250ZW50LWxlbmd0aDogMTcKKworZ2l0IGhlbHAKKyMgaGVsbG8KKworCitSZXZpc2lvbi1udW1iZXI6IDkKK1Byb3AtY29udGVudC1sZW5ndGg6IDEzMAorQ29udGVudC1sZW5ndGg6IDEzMAorCitLIDcKK3N2bjpsb2cKK1YgMjgKKy9iYXIvZCBzaG91bGQgYmUgaW4gdGhlIGxvZworCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDcuNjg2NTUyWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyL2QKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDQKK1RleHQtY29udGVudC1tZDU6IDBiZWU4OWIwN2EyNDhlMjdjODNmYzNkNTk1MTIxM2MxCitDb250ZW50LWxlbmd0aDogMTQKKworUFJPUFMtRU5ECithYmMKKworCitSZXZpc2lvbi1udW1iZXI6IDEwCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMjIKK0NvbnRlbnQtbGVuZ3RoOiAxMjIKKworSyA3Citzdm46bG9nCitWIDIwCithZGQgYSBuZXcgZGlyZWN0b3J5CisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowOC40MDU5NTNaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBiYXIvbmV3ZGlyCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IGJhci9uZXdkaXIvZGlyCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiA5Y2Q1OTlhMzUyMzg5OGU2YTEyZTEzZWM3ODdkYTUwYQorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorbmV3CisKKworUmV2aXNpb24tbnVtYmVyOiAxMQorUHJvcC1jb250ZW50LWxlbmd0aDogMTMzCitDb250ZW50LWxlbmd0aDogMTMzCisKK0sgNworc3ZuOmxvZworViAzMQorbW9kaWZ5IGEgZmlsZSBpbiBuZXcgZGlyZWN0b3J5CisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowOS4xMjY2NDVaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBiYXIvbmV3ZGlyL2RpcgorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA4CitUZXh0LWNvbnRlbnQtbWQ1OiBhOTUwZTIwMzMyMzU4ZTUyM2E1ZTlkNTcxZTQ3ZmE2NAorQ29udGVudC1sZW5ndGg6IDgKKworbmV3Citmb28KKworCitSZXZpc2lvbi1udW1iZXI6IDEyCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTYKK0NvbnRlbnQtbGVuZ3RoOiAxMTYKKworSyA3Citzdm46bG9nCitWIDE0Cit1cGRhdGUgL2Jhci9kCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowOS44NDYyMjFaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBiYXIvZAorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiA3YWJiNzhkZTdmMjc1NmNhOGI1MTFjYmM4NzlmZDVlNworQ29udGVudC1sZW5ndGg6IDQKKworY2JhCisKKwpkaWZmIC0tZ2l0IGEvdC90OTExMi1naXQtc3ZuLW1kNWxlc3MtZmlsZS5zaCBiL3QvdDkxMTItZ2l0LXN2bi1tZDVsZXNzLWZpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDgzMTNiYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTItZ2l0LXN2bi1tZDVsZXNzLWZpbGUuc2gKQEAgLTAsMCArMSw0NSBAQAordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCB0aGF0IGdpdCBoYW5kbGVzIGFuIHN2biByZXBvc2l0b3J5IHdpdGggbWlzc2luZyBtZDVzdW1zJworCisuIC4vbGliLWdpdC1zdm4uc2gKKworIyBMb2FkaW5nIGEgbm9kZSBmcm9tIGEgc3ZuIGR1bXBmaWxlIHdpdGhvdXQgYSBUZXh0LUNvbnRlbnQtTGVuZ3RoCisjIGZpZWxkIGNhdXNlcyBzdm4gdG8gbmVnbGVjdCB0byBzdG9yZSBvciByZXBvcnQgYW4gbWQ1c3VtLiAgKGl0IHdpbGwKKyMgY2FsY3VsYXRlIG9uZSBpZiB5b3UgaGFkIHB1dCBUZXh0LUNvbnRlbnQtTGVuZ3RoOiAwKS4gIFRoaXMgc2hvd2VkCisjIHVwIGluIGEgcmVwb3NpdG9yeSBjcmV0ZWQgd2l0aCBjdnMyc3ZuLgorCitjYXQgPiBkdW1wZmlsZS5zdm4gPDxFT0YKK1NWTi1mcy1kdW1wLWZvcm1hdC12ZXJzaW9uOiAxCisKK1JldmlzaW9uLW51bWJlcjogMQorUHJvcC1jb250ZW50LWxlbmd0aDogOTgKK0NvbnRlbnQtbGVuZ3RoOiA5OAorCitLIDcKK3N2bjpsb2cKK1YgMAorCitLIDEwCitzdm46YXV0aG9yCitWIDQKK3Rlc3QKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDUtMDZUMTI6Mzc6MDEuMTUzMzM5WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWQ1bGVzcy1maWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2FkIHN2biBkdW1wZmlsZScgInN2bmFkbWluIGxvYWQgJHJhd3N2bnJlcG8gPCBkdW1wZmlsZS5zdm4iCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWxpemUgZ2l0LXN2bicgImdpdC1zdm4gaW5pdCAkc3ZucmVwbyIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIHJldmlzaW9ucyBmcm9tIHN2bicgJ2dpdC1zdm4gZmV0Y2gnCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkyMDAtZ2l0LWN2c2V4cG9ydGNvbW1pdC5zaCBiL3QvdDkyMDAtZ2l0LWN2c2V4cG9ydGNvbW1pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWZhMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTIwMC1naXQtY3ZzZXhwb3J0Y29tbWl0LnNoCkBAIC0wLDAgKzEsMjM1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSBSb2JpbiBSb3NlbmJlcmcKKyMKK3Rlc3RfZGVzY3JpcHRpb249J0NWUyBleHBvcnQgY29taXQuICcKKworLiAuL3Rlc3QtbGliLnNoCisKK2N2cyA+L2Rldi9udWxsIDI+JjEKK2lmIHRlc3QgJD8gLW5lIDEKK3RoZW4KKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzICdza2lwcGluZyBnaXQtY3ZzZXhwb3J0Y29tbWl0IHRlc3RzLCBjdnMgbm90IGZvdW5kJyA6CisgICAgdGVzdF9kb25lCisgICAgZXhpdAorZmkKKworQ1ZTUk9PVD0kKHB3ZCkvY3Zzcm9vdAorQ1ZTV09SSz0kKHB3ZCkvY3Zzd29yaworR0lUX0RJUj0kKHB3ZCkvLmdpdAorZXhwb3J0IENWU1JPT1QgQ1ZTV09SSyBHSVRfRElSCisKK3JtIC1yZiAiJENWU1JPT1QiICIkQ1ZTV09SSyIKK21rZGlyICIkQ1ZTUk9PVCIgJiYKK2N2cyBpbml0ICYmCitjdnMgLVEgY28gLWQgIiRDVlNXT1JLIiAuICYmCitlY2hvID5lbXB0eSAmJgorZ2l0IGFkZCBlbXB0eSAmJgorZ2l0IGNvbW1pdCAtcSAtYSAtbSAiSW5pdGlhbCIgMj4vZGV2L251bGwgfHwKK2V4aXQgMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnTmV3IGZpbGUnIFwKKyAgICAnbWtkaXIgQSBCIEMgRCBFIEYgJiYKKyAgICAgZWNobyBoZWxsbzEgPkEvbmV3ZmlsZTEudHh0ICYmCisgICAgIGVjaG8gaGVsbG8yID5CL25ld2ZpbGUyLnR4dCAmJgorICAgICBjcCAuLi90ZXN0OTIwMGEucG5nIEMvbmV3ZmlsZTMucG5nICYmCisgICAgIGNwIC4uL3Rlc3Q5MjAwYS5wbmcgRC9uZXdmaWxlNC5wbmcgJiYKKyAgICAgZ2l0IGFkZCBBL25ld2ZpbGUxLnR4dCAmJgorICAgICBnaXQgYWRkIEIvbmV3ZmlsZTIudHh0ICYmCisgICAgIGdpdCBhZGQgQy9uZXdmaWxlMy5wbmcgJiYKKyAgICAgZ2l0IGFkZCBEL25ld2ZpbGU0LnBuZyAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJUZXN0OiBOZXcgZmlsZSIgJiYKKyAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICBnaXQgY3ZzZXhwb3J0Y29tbWl0IC1jICRpZCAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEEvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGUxLnR4dC8xLjEvIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEIvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGUyLnR4dC8xLjEvIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEMvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGUzLnBuZy8xLjEvLWtiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEQvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU0LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEEvbmV3ZmlsZTEudHh0IC4uL0EvbmV3ZmlsZTEudHh0ICYmCisgICAgIGRpZmYgQi9uZXdmaWxlMi50eHQgLi4vQi9uZXdmaWxlMi50eHQgJiYKKyAgICAgZGlmZiBDL25ld2ZpbGUzLnBuZyAuLi9DL25ld2ZpbGUzLnBuZyAmJgorICAgICBkaWZmIEQvbmV3ZmlsZTQucG5nIC4uL0QvbmV3ZmlsZTQucG5nCisgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdSZW1vdmUgdHdvIGZpbGVzLCBhZGQgdHdvIGFuZCB1cGRhdGUgdHdvJyBcCisgICAgJ2VjaG8gSGVsbG8xID4+QS9uZXdmaWxlMS50eHQgJiYKKyAgICAgcm0gLWYgQi9uZXdmaWxlMi50eHQgJiYKKyAgICAgcm0gLWYgQy9uZXdmaWxlMy5wbmcgJiYKKyAgICAgZWNobyBIZWxsbzUgID5FL25ld2ZpbGU1LnR4dCAmJgorICAgICBjcCAuLi90ZXN0OTIwMGIucG5nIEQvbmV3ZmlsZTQucG5nICYmCisgICAgIGNwIC4uL3Rlc3Q5MjAwYS5wbmcgRi9uZXdmaWxlNi5wbmcgJiYKKyAgICAgZ2l0IGFkZCBFL25ld2ZpbGU1LnR4dCAmJgorICAgICBnaXQgYWRkIEYvbmV3ZmlsZTYucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gIlRlc3Q6IFJlbW92ZSwgYWRkIGFuZCB1cGRhdGUiICYmCisgICAgIGlkPSQoZ2l0IHJldi1saXN0IC0tbWF4LWNvdW50PTEgSEVBRCkgJiYKKyAgICAgKGNkICIkQ1ZTV09SSyIgJiYKKyAgICAgZ2l0IGN2c2V4cG9ydGNvbW1pdCAtYyAkaWQgJiYKKyAgICAgdGVzdCAiJChlY2hvICQoc29ydCBBL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICJuZXdmaWxlMS50eHQvMS4yLyIgJiYKKyAgICAgdGVzdCAiJChlY2hvICQoc29ydCBCL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICIiICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgQy9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEQvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU0LnBuZy8xLjIvLWtiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEUvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU1LnR4dC8xLjEvIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEYvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU2LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEEvbmV3ZmlsZTEudHh0IC4uL0EvbmV3ZmlsZTEudHh0ICYmCisgICAgIGRpZmYgRC9uZXdmaWxlNC5wbmcgLi4vRC9uZXdmaWxlNC5wbmcgJiYKKyAgICAgZGlmZiBFL25ld2ZpbGU1LnR4dCAuLi9FL25ld2ZpbGU1LnR4dCAmJgorICAgICBkaWZmIEYvbmV3ZmlsZTYucG5nIC4uL0YvbmV3ZmlsZTYucG5nCisgICAgICknCisKKyMgU2hvdWxkIGZhaWwgKGJ1dCBvbmx5IG9uIHRoZSBnaXQtY3ZzZXhwb3J0Y29tbWl0IHN0YWdlKQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0ZhaWwgdG8gY2hhbmdlIGJpbmFyeSBtb3JlIHRoYW4gb25lIGdlbmVyYXRpb24gb2xkJyBcCisgICAgJ2NhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gImdlbmVyYXRpaW9uIDEiICYmCisgICAgIGNhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gImdlbmVyYXRpb24gMiIgJiYKKyAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAhIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkCisgICAgICknCisKKyN0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyMgICAgJ0ZhaWwgdG8gcmVtb3ZlIGJpbmFyeSBmaWxlIG1vcmUgdGhhbiBvbmUgZ2VuZXJhdGlvbiBvbGQnIFwKKyMgICAgJ2dpdCByZXNldCAtLWhhcmQgSEVBRF4gJiYKKyMgICAgIGNhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisjICAgICBnaXQgY29tbWl0IC1hIC1tICJnZW5lcmF0aW9uIDIgKGFnYWluKSIgJiYKKyMgICAgIHJtIC1mIEQvbmV3ZmlsZTQucG5nICYmCisjICAgICBnaXQgY29tbWl0IC1hIC1tICJnZW5lcmF0aW9uIDMiICYmCisjICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisjICAgICAoY2QgIiRDVlNXT1JLIiAmJgorIyAgICAgISBnaXQgY3ZzZXhwb3J0Y29tbWl0IC1jICRpZAorIyAgICAgKScKKworIyBXZSByZXVzZSB0aGUgc3RhdGUgZnJvbSB0d28gdGVzdHMgYmFjayBoZXJlCisKKyMgVGhpcyB0ZXN0IGlzIGhlcmUgYmVjYXVzZSBhIHBhdGNoIGZvciBvbmx5IGJpbmFyeSBmaWxlcyB3aWxsCisjIGZhaWwgd2l0aCBnbnUgcGF0Y2gsIHNvIGN2c2V4cG9ydGNvbW1pdCBtdXN0IGhhbmRsZSB0aGF0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1JlbW92ZSBvbmx5IGJpbmFyeSBmaWxlcycgXAorICAgICdnaXQgcmVzZXQgLS1oYXJkIEhFQUReXiAmJgorICAgICBybSAtZiBEL25ld2ZpbGU0LnBuZyAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJ0ZXN0OiByZW1vdmUgb25seSBhIGJpbmFyeSBmaWxlIiAmJgorICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgQS9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAibmV3ZmlsZTEudHh0LzEuMi8iICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgQi9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEMvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIiIgJiYKKyAgICAgdGVzdCAiJChlY2hvICQoc29ydCBEL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICIiICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgRS9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAibmV3ZmlsZTUudHh0LzEuMS8iICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgRi9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAibmV3ZmlsZTYucG5nLzEuMS8ta2IiICYmCisgICAgIGRpZmYgQS9uZXdmaWxlMS50eHQgLi4vQS9uZXdmaWxlMS50eHQgJiYKKyAgICAgZGlmZiBFL25ld2ZpbGU1LnR4dCAuLi9FL25ld2ZpbGU1LnR4dCAmJgorICAgICBkaWZmIEYvbmV3ZmlsZTYucG5nIC4uL0YvbmV3ZmlsZTYucG5nCisgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdSZW1vdmUgb25seSBhIHRleHQgZmlsZScgXAorICAgICdybSAtZiBBL25ld2ZpbGUxLnR4dCAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJ0ZXN0OiByZW1vdmUgb25seSBhIGJpbmFyeSBmaWxlIiAmJgorICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgQS9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEIvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIiIgJiYKKyAgICAgdGVzdCAiJChlY2hvICQoc29ydCBDL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICIiICYmCisgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgRC9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEUvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU1LnR4dC8xLjEvIiAmJgorICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0IEYvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIm5ld2ZpbGU2LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEUvbmV3ZmlsZTUudHh0IC4uL0UvbmV3ZmlsZTUudHh0ICYmCisgICAgIGRpZmYgRi9uZXdmaWxlNi5wbmcgLi4vRi9uZXdmaWxlNi5wbmcKKyAgICAgKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdOZXcgZmlsZSB3aXRoIHNwYWNlcyBpbiBmaWxlIG5hbWUnIFwKKyAgICAgJ21rZGlyICJHIGciICYmCisgICAgICBlY2hvIG9rIHRoZW4gPiJHIGcvd2l0aCBzcGFjZXMudHh0IiAmJgorICAgICAgZ2l0IGFkZCAiRyBnL3dpdGggc3BhY2VzLnR4dCIgJiYgXAorICAgICAgY3AgLi4vdGVzdDkyMDBhLnBuZyAiRyBnL3dpdGggc3BhY2VzLnBuZyIgJiYgXAorICAgICAgZ2l0IGFkZCAiRyBnL3dpdGggc3BhY2VzLnBuZyIgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIldpdGggc3BhY2VzIiAmJgorICAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAgKGNkICIkQ1ZTV09SSyIgJiYKKyAgICAgIGdpdC1jdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgICB0ZXN0ICIkKGVjaG8gJChzb3J0ICJHIGcvQ1ZTL0VudHJpZXMifGN1dCAtZC8gLWYyLDMsNSkpIiA9ICJ3aXRoIHNwYWNlcy5wbmcvMS4xLy1rYiB3aXRoIHNwYWNlcy50eHQvMS4xLyIKKyAgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnVXBkYXRlIGZpbGUgd2l0aCBzcGFjZXMgaW4gZmlsZSBuYW1lJyBcCisgICAgICdlY2hvIE9rIHRoZW4gPj4iRyBnL3dpdGggc3BhY2VzLnR4dCIgJiYKKyAgICAgIGNhdCAuLi90ZXN0OTIwMGEucG5nID4+IkcgZy93aXRoIHNwYWNlcy5wbmciICYmIFwKKyAgICAgIGdpdCBhZGQgIkcgZy93aXRoIHNwYWNlcy5wbmciICYmCisgICAgICBnaXQgY29tbWl0IC1hIC1tICJVcGRhdGUgd2l0aCBzcGFjZXMiICYmCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtYyAkaWQKKyAgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgIkcgZy9DVlMvRW50cmllcyJ8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIndpdGggc3BhY2VzLnBuZy8xLjIvLWtiIHdpdGggc3BhY2VzLnR4dC8xLjIvIgorICAgICAgKScKKworIyBTb21lIGZpbGVzeXN0ZW1zIG1hbmdsZSBwYXRobmFtZXMgd2l0aCBVVEYtOCBjaGFyYWN0ZXJzIC0tCisjIGNoZWNrIGFuZCBza2lwCitpZiBwPSLDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2IiAmJgorCW1rZGlyIC1wICJ0c3QvJHAiICYmCisJZGF0ZSA+InRzdC8kcC9kYXkiICYmCisJZm91bmQ9JChmaW5kIHRzdCAtdHlwZSBmIC1wcmludCkgJiYKKwl0ZXN0ICJ6JGZvdW5kIiA9ICJ6dHN0LyRwL2RheSIgJiYKKwlybSAtZnIgdHN0Cit0aGVuCisKKyMgVGhpcyB0ZXN0IGNvbnRhaW5zIFVURi04IGNoYXJhY3RlcnMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnRmlsZSB3aXRoIG5vbi1hc2NpaSBmaWxlIG5hbWUnIFwKKyAgICAgJ21rZGlyIC1wIMOFL2dvby9hL2IvYy9kL2UvZi9nL2gvaS9qL2svbC9tL24vby9wL3Evci9zL3QvdS92L3cveC95L3ovw6Uvw6Qvw7YgJiYKKyAgICAgIGVjaG8gRm9vID7DhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnR4dCAmJgorICAgICAgZ2l0IGFkZCDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnR4dCAmJgorICAgICAgY3AgLi4vdGVzdDkyMDBhLnBuZyDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnBuZyAmJgorICAgICAgZ2l0IGFkZCDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnBuZyAmJgorICAgICAgZ2l0IGNvbW1pdCAtYSAtbSAiR8OlciBkZXQgc8OlIGfDpXIgZGV0IiAmJiBcCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtdiAtYyAkaWQgJiYKKyAgICAgIHRlc3QgIiQoZWNobyAkKHNvcnQgw4UvZ29vL2EvYi9jL2QvZS9mL2cvaC9pL2ovay9sL20vbi9vL3AvcS9yL3MvdC91L3Yvdy94L3kvei/DpS/DpC/Dti9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiZ8OlcmRldHPDpWfDpXJkZXQucG5nLzEuMS8ta2IgZ8OlcmRldHPDpWfDpXJkZXQudHh0LzEuMS8iCisgICAgICApJworCitmaQorCitybSAtZnIgdHN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnTWlzbWF0Y2hpbmcgcGF0Y2ggc2hvdWxkIGZhaWwnIFwKKyAgICAgJ2RhdGUgPj4iRS9uZXdmaWxlNS50eHQiICYmCisgICAgICBnaXQgYWRkICJFL25ld2ZpbGU1LnR4dCIgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIlVwZGF0ZSBvbmUiICYmCisgICAgICBkYXRlID4+IkUvbmV3ZmlsZTUudHh0IiAmJgorICAgICAgZ2l0IGFkZCAiRS9uZXdmaWxlNS50eHQiICYmCisgICAgICBnaXQgY29tbWl0IC1hIC1tICJVcGRhdGUgdHdvIiAmJgorICAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAgKGNkICIkQ1ZTV09SSyIgJiYKKyAgICAgICEgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtYyAkaWQKKyAgICAgICknCisKK2Nhc2UgIiQoZ2l0IHJlcG8tY29uZmlnIC0tYm9vbCBjb3JlLmZpbGVtb2RlKSIgaW4KK2ZhbHNlKQorCTs7CisqKQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdSZXRhaW4gZXhlY3V0ZSBiaXQnIFwKKyAgICAgJ21rZGlyIEcgJiYKKyAgICAgIGVjaG8gZXhlY3V0ZW9uID5HL29uICYmCisgICAgICBjaG1vZCAreCBHL29uICYmCisgICAgICBlY2hvIGV4ZWN1dGVvZmYgPkcvb2ZmICYmCisgICAgICBnaXQgYWRkIEcvb24gJiYKKyAgICAgIGdpdCBhZGQgRy9vZmYgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIkV4ZWN1dGUgdGVzdCIgJiYKKyAgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgICBnaXQtY3ZzZXhwb3J0Y29tbWl0IC1jIEhFQUQKKyAgICAgIHRlc3QgLXggRy9vbiAmJgorICAgICAgISB0ZXN0IC14IEcvb2ZmCisgICAgICApJworCTs7Citlc2FjCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTMwMC1mYXN0LWltcG9ydC5zaCBiL3QvdDkzMDAtZmFzdC1pbXBvcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzJlNDlmNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkzMDAtZmFzdC1pbXBvcnQuc2gKQEAgLTAsMCArMSw1ODMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgZ2l0LWZhc3QtaW1wb3J0IHV0aWxpdHknCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK2ZpbGUyX2RhdGE9J2ZpbGUyCitzZWNvbmQgbGluZSBvZiBFT0YnCisKK2ZpbGUzX2RhdGE9J0VPRgoraW4gM3JkIGZpbGUKKyBFTkQnCisKK2ZpbGU0X2RhdGE9YWJjZAorZmlsZTRfbGVuPTQKKworZmlsZTVfZGF0YT0nYW4gaW5saW5lIGZpbGUuCisgIHdlIHNob3VsZCBzZWUgaXQgbGF0ZXIuJworCitmaWxlNl9kYXRhPScjIS9iaW4vc2gKK2VjaG8gIiRAIicKKworIyMjCisjIyMgc2VyaWVzIEEKKyMjIworCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2Jsb2IKK21hcmsgOjIKK2RhdGEgPDxFT0YKKyRmaWxlMl9kYXRhCitFT0YKKworYmxvYgorbWFyayA6MworZGF0YSA8PEVORAorJGZpbGUzX2RhdGEKK0VORAorCitibG9iCittYXJrIDo0CitkYXRhICRmaWxlNF9sZW4KKyRmaWxlNF9kYXRhCitjb21taXQgcmVmcy9oZWFkcy9tYXN0ZXIKK21hcmsgOjUKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAoraW5pdGlhbAorQ09NTUlUCisKK00gNjQ0IDoyIGZpbGUyCitNIDY0NCA6MyBmaWxlMworTSA3NTUgOjQgZmlsZTQKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnQTogY3JlYXRlIHBhY2sgZnJvbSBzdGRpbicgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgLS1leHBvcnQtbWFya3M9bWFya3Mub3V0IDxpbnB1dCAmJgorCSBnaXQtd2hhdGNoYW5nZWQgbWFzdGVyJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBwYWNrJyBcCisJJ2ZvciBwIGluIC5naXQvb2JqZWN0cy9wYWNrLyoucGFjaztkbyBnaXQtdmVyaWZ5LXBhY2sgJHB8fGV4aXQ7ZG9uZScKKworY2F0ID5leHBlY3QgPDxFT0YKK2F1dGhvciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCisKK2luaXRpYWwKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBjb21taXQnIFwKKwknZ2l0LWNhdC1maWxlIGNvbW1pdCBtYXN0ZXIgfCBzZWQgMWQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCisxMDA2NDQgYmxvYiBmaWxlMgorMTAwNjQ0IGJsb2IgZmlsZTMKKzEwMDc1NSBibG9iIGZpbGU0CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdBOiB2ZXJpZnkgdHJlZScgXAorCSdnaXQtY2F0LWZpbGUgLXAgbWFzdGVyXnt0cmVlfSB8IHNlZCAicy8gWzAtOWEtZl0qCS8gLyIgPmFjdHVhbCAmJgorCSBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitlY2hvICIkZmlsZTJfZGF0YSIgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBmaWxlMicgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6ZmlsZTIgPmFjdHVhbCAmJiBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitlY2hvICIkZmlsZTNfZGF0YSIgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBmaWxlMycgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6ZmlsZTMgPmFjdHVhbCAmJiBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitwcmludGYgIiRmaWxlNF9kYXRhIiA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IGZpbGU0JyBcCisJJ2dpdC1jYXQtZmlsZSBibG9iIG1hc3RlcjpmaWxlNCA+YWN0dWFsICYmIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCis6MiBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXI6ZmlsZTJgCis6MyBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXI6ZmlsZTNgCis6NCBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXI6ZmlsZTRgCis6NSBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXJeMGAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBtYXJrcyBvdXRwdXQnIFwKKwknZ2l0IGRpZmYgZXhwZWN0IG1hcmtzLm91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBtYXJrcyBpbXBvcnQnIFwKKwknZ2l0LWZhc3QtaW1wb3J0IFwKKwkJLS1pbXBvcnQtbWFya3M9bWFya3Mub3V0IFwKKwkJLS1leHBvcnQtbWFya3M9bWFya3MubmV3IFwKKwkJPC9kZXYvbnVsbCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdCBtYXJrcy5uZXcnCisKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvdmVyaWZ5LS1pbXBvcnQtbWFya3MKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorcmVjcmVhdGUgZnJvbSA6NQorQ09NTUlUCisKK2Zyb20gOjUKK00gNzU1IDoyIGNvcHktb2YtZmlsZTIKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IG1hcmtzIGltcG9ydCBkb2VzIG5vdCBjcmFzaCcgXAorCSdnaXQtZmFzdC1pbXBvcnQgLS1pbXBvcnQtbWFya3M9bWFya3Mub3V0IDxpbnB1dCAmJgorCSBnaXQtd2hhdGNoYW5nZWQgdmVyaWZ5LS1pbXBvcnQtbWFya3MnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdC12ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworY2F0ID5leHBlY3QgPDxFT0YKKzowMDAwMDAgMTAwNzU1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzEyM2Y3ZjQ0ZTM5YmUxMjdjNWViNzAxZTU5NjgxNzZlZTlkNzhiMSBBCWNvcHktb2YtZmlsZTIKK0VPRgorZ2l0LWRpZmYtdHJlZSAtTSAtciBtYXN0ZXIgdmVyaWZ5LS1pbXBvcnQtbWFya3MgPmFjdHVhbAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSBkaWZmJyBcCisJJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCAmJgorCSB0ZXN0IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3RlcjpmaWxlMmAgXAorCSAgICA9IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHZlcmlmeS0taW1wb3J0LW1hcmtzOmNvcHktb2YtZmlsZTJgJworCisjIyMKKyMjIyBzZXJpZXMgQgorIyMjCisKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvYnJhbmNoCittYXJrIDoxCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2NvcnJ1cHQKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvbWFzdGVyCitNIDc1NSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIHplcm8xCisKK0lOUFVUX0VORAordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ0I6IGZhaWwgb24gaW52YWxpZCBibG9iIHNoYTEnIFwKKyAgICAnZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCcKK3JtIC1mIC5naXQvb2JqZWN0cy9wYWNrXyogLmdpdC9vYmplY3RzL2luZGV4XyoKKworIyMjCisjIyMgc2VyaWVzIEMKKyMjIworCituZXdmPWBlY2hvIGhpIG5ld2YgfCBnaXQtaGFzaC1vYmplY3QgLXcgLS1zdGRpbmAKK29sZGY9YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgbWFzdGVyOmZpbGUyYAordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9icmFuY2gKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorc2Vjb25kCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL21hc3RlcgorTSA2NDQgJG9sZGYgZmlsZTIvb2xkZgorTSA3NTUgJG5ld2YgZmlsZTIvbmV3ZgorRCBmaWxlMworCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdDOiBpbmNyZW1lbnRhbCBpbXBvcnQgY3JlYXRlIHBhY2sgZnJvbSBzdGRpbicgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdC13aGF0Y2hhbmdlZCBicmFuY2gnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQzogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdC12ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0M6IHZhbGlkYXRlIHJldXNlIGV4aXN0aW5nIGJsb2InIFwKKwkndGVzdCAkbmV3ZiA9IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IGJyYW5jaDpmaWxlMi9uZXdmYAorCSB0ZXN0ICRvbGRmID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgYnJhbmNoOmZpbGUyL29sZGZgJworCitjYXQgPmV4cGVjdCA8PEVPRgorcGFyZW50IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3Rlcl4wYAorYXV0aG9yICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKKworc2Vjb25kCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdDOiB2ZXJpZnkgY29tbWl0JyBcCisJJ2dpdC1jYXQtZmlsZSBjb21taXQgYnJhbmNoIHwgc2VkIDFkID5hY3R1YWwgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworY2F0ID5leHBlY3QgPDxFT0YKKzowMDAwMDAgMTAwNzU1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZjFmYjVkYTcxODM5MjY5NGQwMDc2ZDY3N2Q2ZDBlMzY0Yzc5YjBiYyBBCWZpbGUyL25ld2YKKzoxMDA2NDQgMTAwNjQ0IDcxMjNmN2Y0NGUzOWJlMTI3YzVlYjcwMWU1OTY4MTc2ZWU5ZDc4YjEgNzEyM2Y3ZjQ0ZTM5YmUxMjdjNWViNzAxZTU5NjgxNzZlZTlkNzhiMSBSMTAwCWZpbGUyCWZpbGUyL29sZGYKKzoxMDA2NDQgMDAwMDAwIDBkOTJlOWYzMzc0YWUyOTQ3YzIzYWE0NzdjYmM2OGNlNTk4MTM1ZjEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUzCitFT0YKK2dpdC1kaWZmLXRyZWUgLU0gLXIgbWFzdGVyIGJyYW5jaCA+YWN0dWFsCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQzogdmFsaWRhdGUgcmVuYW1lIHJlc3VsdCcgXAorCSdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdCBhY3R1YWwnCisKKyMjIworIyMjIHNlcmllcyBECisjIyMKKwordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9icmFuY2gKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAordGhpcmQKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKK00gNjQ0IGlubGluZSBuZXdkaXIvaW50ZXJlc3RpbmcKK2RhdGEgPDxFT0YKKyRmaWxlNV9kYXRhCitFT0YKKworTSA3NTUgaW5saW5lIG5ld2Rpci9leGVjLnNoCitkYXRhIDw8RU9GCiskZmlsZTZfZGF0YQorRU9GCisKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Q6IGlubGluZSBkYXRhIGluIGNvbW1pdCcgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdC13aGF0Y2hhbmdlZCBicmFuY2gnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRDogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdC12ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworCitjYXQgPmV4cGVjdCA8PEVPRgorOjAwMDAwMCAxMDA3NTUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWE1OTAyNmEzM2JlYWMxNTY5YjFjN2Y2NmYzMDkwY2U5YzA5YWZjIEEJbmV3ZGlyL2V4ZWMuc2gKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDQ2ZDAzNzFlOTIyMDEwNzkxN2RiMGQwZTAzMDYyOGRlOGExZGU5YiBBCW5ld2Rpci9pbnRlcmVzdGluZworRU9GCitnaXQtZGlmZi10cmVlIC1NIC1yIGJyYW5jaF4gYnJhbmNoID5hY3R1YWwKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdEOiB2YWxpZGF0ZSBuZXcgZmlsZXMgYWRkZWQnIFwKKwknY29tcGFyZV9kaWZmX3JhdyBleHBlY3QgYWN0dWFsJworCitlY2hvICIkZmlsZTVfZGF0YSIgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0Q6IHZlcmlmeSBmaWxlNScgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBicmFuY2g6bmV3ZGlyL2ludGVyZXN0aW5nID5hY3R1YWwgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworZWNobyAiJGZpbGU2X2RhdGEiID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdEOiB2ZXJpZnkgZmlsZTYnIFwKKwknZ2l0LWNhdC1maWxlIGJsb2IgYnJhbmNoOm5ld2Rpci9leGVjLnNoID5hY3R1YWwgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIEUKKyMjIworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9icmFuY2gKK2F1dGhvciAkR0lUX0FVVEhPUl9OQU1FIDwkR0lUX0FVVEhPUl9FTUFJTD4gVHVlIEZlYiA2IDExOjIyOjE4IDIwMDcgLTA1MDAKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gVHVlIEZlYiA2IDEyOjM1OjAyIDIwMDcgLTA1MDAKK2RhdGEgPDxDT01NSVQKK1JGQyAyODIyIHR5cGUgZGF0ZQorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMAorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdFOiByZmMyODIyIGRhdGUsIC0tZGF0ZS1mb3JtYXQ9cmF3JyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCAtLWRhdGUtZm9ybWF0PXJhdyA8aW5wdXQnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRTogcmZjMjgyMiBkYXRlLCAtLWRhdGUtZm9ybWF0PXJmYzI4MjInIFwKKyAgICAnZ2l0LWZhc3QtaW1wb3J0IC0tZGF0ZS1mb3JtYXQ9cmZjMjgyMiA8aW5wdXQnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRTogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdC12ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworCitjYXQgPmV4cGVjdCA8PEVPRgorYXV0aG9yICRHSVRfQVVUSE9SX05BTUUgPCRHSVRfQVVUSE9SX0VNQUlMPiAxMTcwNzc4OTM4IC0wNTAwCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExNzA3ODMzMDIgLTA1MDAKKworUkZDIDI4MjIgdHlwZSBkYXRlCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdFOiB2ZXJpZnkgY29tbWl0JyBcCisJJ2dpdC1jYXQtZmlsZSBjb21taXQgYnJhbmNoIHwgc2VkIDEsMmQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKKyMjIworIyMjIHNlcmllcyBGCisjIyMKKworb2xkX2JyYW5jaD1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2heMGAKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvYnJhbmNoCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2xvc2luZyB0aGluZ3MgYWxyZWFkeT8KK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNofjEKKworcmVzZXQgcmVmcy9oZWFkcy9vdGhlcgorZnJvbSByZWZzL2hlYWRzL2JyYW5jaAorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdGOiBub24tZmFzdC1mb3J3YXJkIHVwZGF0ZSBza2lwcycgXAorICAgICdpZiBnaXQtZmFzdC1pbXBvcnQgPGlucHV0CisJIHRoZW4KKwkJZWNobyBCQUQgZ2ZpIGRpZCBub3QgZmFpbAorCQlyZXR1cm4gMQorCSBlbHNlCisJCWlmIHRlc3QgJG9sZF9icmFuY2ggPSBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2heMGAKKwkJdGhlbgorCQkJOiBicmFuY2ggdW5hZmZlY3RlZCBhbmQgZmFpbHVyZSByZXR1cm5lZAorCQkJcmV0dXJuIDAKKwkJZWxzZQorCQkJZWNobyBCQUQgZ2ZpIGNoYW5nZWQgYnJhbmNoICRvbGRfYnJhbmNoCisJCQlyZXR1cm4gMQorCQlmaQorCSBmaQorCScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdGOiB2ZXJpZnkgcGFjaycgXAorCSdmb3IgcCBpbiAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2s7ZG8gZ2l0LXZlcmlmeS1wYWNrICRwfHxleGl0O2RvbmUnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCit0cmVlIGBnaXQtcmV2LXBhcnNlIGJyYW5jaH4xXnt0cmVlfWAKK3BhcmVudCBgZ2l0LXJldi1wYXJzZSBicmFuY2h+MWAKK2F1dGhvciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCisKK2xvc2luZyB0aGluZ3MgYWxyZWFkeT8KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0Y6IHZlcmlmeSBvdGhlciBjb21taXQnIFwKKwknZ2l0LWNhdC1maWxlIGNvbW1pdCBvdGhlciA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIEcKKyMjIworCitvbGRfYnJhbmNoPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IGJyYW5jaF4wYAordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9icmFuY2gKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorbG9zaW5nIHRoaW5ncyBhbHJlYWR5PworQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2h+MQorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdHOiBub24tZmFzdC1mb3J3YXJkIHVwZGF0ZSBmb3JjZWQnIFwKKyAgICAnZ2l0LWZhc3QtaW1wb3J0IC0tZm9yY2UgPGlucHV0JwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0c6IHZlcmlmeSBwYWNrJyBcCisJJ2ZvciBwIGluIC5naXQvb2JqZWN0cy9wYWNrLyoucGFjaztkbyBnaXQtdmVyaWZ5LXBhY2sgJHB8fGV4aXQ7ZG9uZScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdHOiBicmFuY2ggY2hhbmdlZCwgYnV0IGxvZ2dlZCcgXAorCSd0ZXN0ICRvbGRfYnJhbmNoICE9IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IGJyYW5jaF4wYCAmJgorCSB0ZXN0ICRvbGRfYnJhbmNoID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgYnJhbmNoQHsxfWAnCisKKyMjIworIyMjIHNlcmllcyBICisjIyMKKwordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9ICitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3RoaXJkCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaF4wCitNIDY0NCBpbmxpbmUgaS13aWxsLWRpZQorZGF0YSA8PEVPRgordGhpcyBmaWxlIHdpbGwgbmV2ZXIgZXhpc3QuCitFT0YKKworZGVsZXRlYWxsCitNIDY0NCBpbmxpbmUgaC9lL2wvbG8KK2RhdGEgPDxFT0YKKyRmaWxlNV9kYXRhCitFT0YKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnSDogZGVsZXRhbGwsIGFkZCAxJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCA8aW5wdXQgJiYKKwkgZ2l0LXdoYXRjaGFuZ2VkIEgnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknSDogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdC12ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworCitjYXQgPmV4cGVjdCA8PEVPRgorOjEwMDc1NSAwMDAwMDAgZjFmYjVkYTcxODM5MjY5NGQwMDc2ZDY3N2Q2ZDBlMzY0Yzc5YjBiYyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTIvbmV3ZgorOjEwMDY0NCAwMDAwMDAgNzEyM2Y3ZjQ0ZTM5YmUxMjdjNWViNzAxZTU5NjgxNzZlZTlkNzhiMSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTIvb2xkZgorOjEwMDc1NSAwMDAwMDAgODVkZjUwNzg1ZDYyZDNiMDVhYjAzZDljYmY3ZTRhMGI0OTQ0OTczMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTQKKzoxMDA2NDQgMTAwNjQ0IGZjZjc3OGNkYTE4MWVhYTFjYmM5ZTljZTNhMmUxNWVlOWY5ZmU3OTEgZmNmNzc4Y2RhMTgxZWFhMWNiYzllOWNlM2EyZTE1ZWU5ZjlmZTc5MSBSMTAwCW5ld2Rpci9pbnRlcmVzdGluZwloL2UvbC9sbworOjEwMDc1NSAwMDAwMDAgZTc0YjdkNDY1ZTUyNzQ2YmUyYjRiYWU5ODM2NzA3MTFlNmU2NjY1NyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJbmV3ZGlyL2V4ZWMuc2gKK0VPRgorZ2l0LWRpZmYtdHJlZSAtTSAtciBIXiBIID5hY3R1YWwKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdIOiB2YWxpZGF0ZSBvbGQgZmlsZXMgcmVtb3ZlZCwgbmV3IGZpbGVzIGFkZGVkJyBcCisJJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCcKKworZWNobyAiJGZpbGU1X2RhdGEiID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdIOiB2ZXJpZnkgZmlsZScgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBIOmgvZS9sL2xvID5hY3R1YWwgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIEkKKyMjIworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9leHBvcnQtYm91bmRhcnkKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAord2UgaGF2ZSBhIGJvcmRlci4gIGl0cyBvbmx5IDQwIGNoYXJhY3RlcnMgd2lkZS4KK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoCisKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0k6IGV4cG9ydC1wYWNrLWVkZ2VzJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCAtLWV4cG9ydC1wYWNrLWVkZ2VzPWVkZ2VzLmxpc3QgPGlucHV0JworCitjYXQgPmV4cGVjdCA8PEVPRgorLmdpdC9vYmplY3RzL3BhY2svcGFjay0ucGFjazogYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgZXhwb3J0LWJvdW5kYXJ5YAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknSTogdmVyaWZ5IGVkZ2UgbGlzdCcgXAorCSdzZWQgLWUgcy9wYWNrLS4qcGFjay9wYWNrLS5wYWNrLyBlZGdlcy5saXN0ID5hY3R1YWwgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIEoKKyMjIworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9KCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2NyZWF0ZSBKCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaAorCityZXNldCByZWZzL2hlYWRzL0oKKworY29tbWl0IHJlZnMvaGVhZHMvSgorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitpbml0aWFsaXplIEoKK0NPTU1JVAorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdKOiByZXNldCBleGlzdGluZyBicmFuY2ggY3JlYXRlcyBlbXB0eSBjb21taXQnIFwKKyAgICAnZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdKOiBicmFuY2ggaGFzIDEgY29tbWl0LCBlbXB0eSB0cmVlJyBcCisJJ3Rlc3QgMSA9IGBnaXQtcmV2LWxpc3QgSiB8IHdjIC1sYCAmJgorCSB0ZXN0IDAgPSBgZ2l0IGxzLXRyZWUgSiB8IHdjIC1sYCcKKworIyMjCisjIyMgc2VyaWVzIEsKKyMjIworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9LCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2NyZWF0ZSBLCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaAorCitjb21taXQgcmVmcy9oZWFkcy9LCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3JlZG8gSworQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMQorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdLOiByZWluaXQgYnJhbmNoIHdpdGggZnJvbScgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgPGlucHV0JwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0s6IHZlcmlmeSBLXjEgPSBicmFuY2heMScgXAorICAgICd0ZXN0IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IGJyYW5jaF4xYCBcCisJCT0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgS14xYCcKKworIyMjCisjIyMgc2VyaWVzIEwKKyMjIworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitibG9iCittYXJrIDoxCitkYXRhIDw8RU9GCitzb21lIGRhdGEKK0VPRgorCitibG9iCittYXJrIDoyCitkYXRhIDw8RU9GCitvdGhlciBkYXRhCitFT0YKKworY29tbWl0IHJlZnMvaGVhZHMvTAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitjcmVhdGUgTAorQ09NTUlUCisKK00gNjQ0IDoxIGIuCitNIDY0NCA6MSBiL290aGVyCitNIDY0NCA6MSBiYQorCitjb21taXQgcmVmcy9oZWFkcy9MCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3VwZGF0ZSBMCitDT01NSVQKKworTSA2NDQgOjIgYi4KK00gNjQ0IDoyIGIvb3RoZXIKK00gNjQ0IDoyIGJhCitJTlBVVF9FTkQKKworY2F0ID5leHBlY3QgPDxFWFBFQ1RfRU5ECis6MTAwNjQ0IDEwMDY0NCA0MjY4NjMyLi4uIDU1ZDNhNTIuLi4gTQliLgorOjA0MDAwMCAwNDAwMDAgMGFlNWNhYy4uLiA0NDNjNzY4Li4uIE0JYgorOjEwMDY0NCAxMDA2NDQgNDI2ODYzMi4uLiA1NWQzYTUyLi4uIE0JYmEKK0VYUEVDVF9FTkQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0w6IHZlcmlmeSBpbnRlcm5hbCB0cmVlIHNvcnRpbmcnIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCAmJgorCSBnaXQtZGlmZiAtLXJhdyBMXiBMID5vdXRwdXQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IG91dHB1dCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5NDAwLWdpdC1jdnNzZXJ2ZXItc2VydmVyLnNoIGIvdC90OTQwMC1naXQtY3Zzc2VydmVyLXNlcnZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDA2YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTQwMC1naXQtY3Zzc2VydmVyLXNlcnZlci5zaApAQCAtMCwwICsxLDEyNiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBGcmFuayBMaWNodGVuaGVsZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY3Zzc2VydmVyIGFjY2VzcworCit0ZXN0cyByZWFkIGFjY2VzcyB0byBhIGdpdCByZXBvc2l0b3J5IHdpdGggdGhlCitjdnMgQ0xJIGNsaWVudCB2aWEgZ2l0LWN2c3NlcnZlciBzZXJ2ZXInCisKKy4gLi90ZXN0LWxpYi5zaAorCitjdnMgPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/IC1uZSAxCit0aGVuCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LWN2c3NlcnZlciB0ZXN0cywgY3ZzIG5vdCBmb3VuZCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCitwZXJsIC1lICd1c2UgREJJOyB1c2UgREJEOjpTUUxpdGUnID4vZGV2L251bGwgMj4mMSB8fCB7CisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LWN2c3NlcnZlciB0ZXN0cywgUGVybCBTUUxpdGUgaW50ZXJmYWNlIHVuYXZhaWxhYmxlJyA6CisgICAgdGVzdF9kb25lCisgICAgZXhpdAorfQorCit1bnNldCBHSVRfRElSIEdJVF9DT05GSUcKK1dPUktESVI9JChwd2QpCitTRVJWRVJESVI9JChwd2QpL2dpdGN2cy5naXQKK2dpdF9jb25maWc9IiRTRVJWRVJESVIvY29uZmlnIgorQ1ZTUk9PVD0iOmZvcms6JFNFUlZFUkRJUiIKK0NWU1dPUks9IiQocHdkKS9jdnN3b3JrIgorQ1ZTX1NFUlZFUj1naXQtY3Zzc2VydmVyCitleHBvcnQgQ1ZTUk9PVCBDVlNfU0VSVkVSCisKK3JtIC1yZiAiJENWU1dPUksiICIkU0VSVkVSRElSIgorZWNobyA+ZW1wdHkgJiYKKyAgZ2l0IGFkZCBlbXB0eSAmJgorICBnaXQgY29tbWl0IC1xIC1tICJGaXJzdCBDb21taXQiICYmCisgIGdpdCBjbG9uZSAtcSAtLWxvY2FsIC0tYmFyZSAiJFdPUktESVIvLmdpdCIgIiRTRVJWRVJESVIiID4vZGV2L251bGwgMj4mMSAmJgorICBHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIC0tYm9vbCBnaXRjdnMuZW5hYmxlZCB0cnVlICYmCisgIEdJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5sb2dmaWxlICIkU0VSVkVSRElSL2dpdGN2cy5sb2ciIHx8CisgIGV4aXQgMQorCisjIG5vdGUgdGhhdCBjdnMgZG9lc24ndCBhY2NlcHQgYWJzb2x1dGUgcGF0aG5hbWVzCisjIGFzIGFyZ3VtZW50IHRvIGNvIC1kCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiYXNpYyBjaGVja291dCcgXAorICAnR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSBjbyAtZCBjdnN3b3JrIG1hc3RlciAmJgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCAtdiBeRCBjdnN3b3JrL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICJlbXB0eS8xLjEvIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHVwZGF0ZSAoY3JlYXRlIG5ldyBmaWxlKScgXAorICAnZWNobyB0ZXN0ZmlsZTEgPnRlc3RmaWxlMSAmJgorICAgZ2l0IGFkZCB0ZXN0ZmlsZTEgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIkFkZCB0ZXN0ZmlsZTEiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0ICIkKGVjaG8gJChncmVwIHRlc3RmaWxlMSBDVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAidGVzdGZpbGUxLzEuMS8iICYmCisgICBkaWZmIC1xIHRlc3RmaWxlMSAuLi90ZXN0ZmlsZTEnCisKK2NkICIkV09SS0RJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N2cyB1cGRhdGUgKHVwZGF0ZSBleGlzdGluZyBmaWxlKScgXAorICAnZWNobyBsaW5lIDIgPj50ZXN0ZmlsZTEgJiYKKyAgIGdpdCBhZGQgdGVzdGZpbGUxICYmCisgICBnaXQgY29tbWl0IC1xIC1tICJBcHBlbmQgdG8gdGVzdGZpbGUxIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCB0ZXN0ZmlsZTEgQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gInRlc3RmaWxlMS8xLjIvIiAmJgorICAgZGlmZiAtcSB0ZXN0ZmlsZTEgLi4vdGVzdGZpbGUxJworCitjZCAiJFdPUktESVIiCisjVE9ETzogY3Zzc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB1cGRhdGUgdy9vIC1kCit0ZXN0X2V4cGVjdF9mYWlsdXJlICJjdnMgdXBkYXRlIHcvbyAtZCBkb2Vzbid0IGNyZWF0ZSBzdWJkaXIgKFRPRE8pIiBcCisgICdta2RpciB0ZXN0ICYmCisgICBlY2hvID50ZXN0L2VtcHR5ICYmCisgICBnaXQgYWRkIHRlc3QgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIlNpbmdsZSBTdWJkaXJlY3RvcnkiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0ICEgLWQgdGVzdCcKKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHVwZGF0ZSAoc3ViZGlyZWN0b3JpZXMpJyBcCisgICcoZm9yIGRpciBpbiBBIEEvQiBBL0IvQyBBL0QgRTsgZG8KKyAgICAgIG1rZGlyICRkaXIgJiYKKyAgICAgIGVjaG8gInRlc3QgZmlsZSBpbiAkZGlyIiA+IiRkaXIvZmlsZV9pbl8kKGVjaG8gJGRpcnxzZWQgLWUgInMjLyMgI2ciKSIgICYmCisgICAgICBnaXQgYWRkICRkaXI7CisgICBkb25lKSAmJgorICAgZ2l0IGNvbW1pdCAtcSAtbSAiZGVlcCBzdWIgZGlyZWN0b3J5IHN0cnVjdHVyZSIgJiYKKyAgIGdpdCBwdXNoIGdpdGN2cy5naXQgPi9kZXYvbnVsbCAmJgorICAgY2QgY3Zzd29yayAmJgorICAgR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSB1cGRhdGUgLWQgJiYKKyAgIChmb3IgZGlyIGluIEEgQS9CIEEvQi9DIEEvRCBFOyBkbworICAgICAgZmlsZW5hbWU9ImZpbGVfaW5fJChlY2hvICRkaXJ8c2VkIC1lICJzIy8jICNnIikiICYmCisgICAgICBpZiB0ZXN0ICIkKGVjaG8gJChncmVwIC12IF5EICRkaXIvQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gIiRmaWxlbmFtZS8xLjEvIiAmJgorICAgICAgICAgICBkaWZmIC1xICIkZGlyLyRmaWxlbmFtZSIgIi4uLyRkaXIvJGZpbGVuYW1lIjsgdGhlbgorICAgICAgICA6CisgICAgICBlbHNlCisgICAgICAgIGVjaG8gPmZhaWx1cmUKKyAgICAgIGZpCisgICAgZG9uZSkgJiYKKyAgIHRlc3QgISAtZiBmYWlsdXJlJworCitjZCAiJFdPUktESVIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnMgdXBkYXRlIChkZWxldGUgZmlsZSknIFwKKyAgJ2dpdCBybSB0ZXN0ZmlsZTEgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIlJlbW92ZSB0ZXN0ZmlsZTEiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0IC16ICIkKGdyZXAgdGVzdGZpbGUxIENWUy9FbnRyaWVzKSIgJiYKKyAgIHRlc3QgISAtZiB0ZXN0ZmlsZTEnCisKK2NkICIkV09SS0RJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N2cyB1cGRhdGUgKHJlLWFkZCBkZWxldGVkIGZpbGUpJyBcCisgICdlY2hvIHJlYWRkZWQgdGVzdGZpbGUgPnRlc3RmaWxlMSAmJgorICAgZ2l0IGFkZCB0ZXN0ZmlsZTEgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIlJlLUFkZCB0ZXN0ZmlsZTEiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0ICIkKGVjaG8gJChncmVwIHRlc3RmaWxlMSBDVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAidGVzdGZpbGUxLzEuNC8iICYmCisgICBkaWZmIC1xIHRlc3RmaWxlMSAuLi90ZXN0ZmlsZTEnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90ZXN0LWxpYi5zaCBiL3QvdGVzdC1saWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlM2FkNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdC1saWIuc2gKQEAgLTAsMCArMSwzMDEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKworIyBGb3IgcmVwZWF0YWJpbGl0eSwgcmVzZXQgdGhlIGVudmlyb25tZW50IHRvIGtub3duIHZhbHVlLgorTEFORz1DCitMQ19BTEw9QworUEFHRVI9Y2F0CitUWj1VVEMKK2V4cG9ydCBMQU5HIExDX0FMTCBQQUdFUiBUWgorRURJVE9SPToKK1ZJU1VBTD06Cit1bnNldCBBVVRIT1JfREFURQordW5zZXQgQVVUSE9SX0VNQUlMCit1bnNldCBBVVRIT1JfTkFNRQordW5zZXQgQ09NTUlUX0FVVEhPUl9FTUFJTAordW5zZXQgQ09NTUlUX0FVVEhPUl9OQU1FCit1bnNldCBFTUFJTAordW5zZXQgR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMKK3Vuc2V0IEdJVF9BVVRIT1JfREFURQorR0lUX0FVVEhPUl9FTUFJTD1hdXRob3JAZXhhbXBsZS5jb20KK0dJVF9BVVRIT1JfTkFNRT0nQSBVIFRob3InCit1bnNldCBHSVRfQ09NTUlUVEVSX0RBVEUKK0dJVF9DT01NSVRURVJfRU1BSUw9Y29tbWl0dGVyQGV4YW1wbGUuY29tCitHSVRfQ09NTUlUVEVSX05BTUU9J0MgTyBNaXR0ZXInCit1bnNldCBHSVRfRElGRl9PUFRTCit1bnNldCBHSVRfRElSCit1bnNldCBHSVRfRVhURVJOQUxfRElGRgordW5zZXQgR0lUX0lOREVYX0ZJTEUKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCit1bnNldCBTSEExX0ZJTEVfRElSRUNUT1JJRVMKK3Vuc2V0IFNIQTFfRklMRV9ESVJFQ1RPUlkKK0dJVF9NRVJHRV9WRVJCT1NJVFk9NQorZXhwb3J0IEdJVF9NRVJHRV9WRVJCT1NJVFkKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMIEdJVF9BVVRIT1JfTkFNRQorZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUwgR0lUX0NPTU1JVFRFUl9OQU1FCitleHBvcnQgRURJVE9SIFZJU1VBTAorCisjIFByb3RlY3Qgb3Vyc2VsdmVzIGZyb20gY29tbW9uIG1pc2NvbmZpZ3VyYXRpb24gdG8gZXhwb3J0CisjIENEUEFUSCBpbnRvIHRoZSBlbnZpcm9ubWVudAordW5zZXQgQ0RQQVRICisKK2Nhc2UgJChlY2hvICRHSVRfVFJBQ0UgfHRyICJbQS1aXSIgIlthLXpdIikgaW4KKwkxfDJ8dHJ1ZSkKKwkJZWNobyAiKiB3YXJuaW5nOiBTb21lIHRlc3RzIHdpbGwgbm90IHdvcmsgaWYgR0lUX1RSQUNFIiBcCisJCQkiaXMgc2V0IGFzIHRvIHRyYWNlIG9uIFNUREVSUiAhICoiCisJCWVjaG8gIiogd2FybmluZzogUGxlYXNlIHNldCBHSVRfVFJBQ0UgdG8gc29tZXRoaW5nIiBcCisJCQkib3RoZXIgdGhhbiAxLCAyIG9yIHRydWUgISAqIgorCQk7OworZXNhYworCisjIEVhY2ggdGVzdCBzaG91bGQgc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzLCBhZnRlciBjb3B5cmlnaHQgbm90aWNlczoKKyMKKyMgdGVzdF9kZXNjcmlwdGlvbj0nRGVzY3JpcHRpb24gb2YgdGhpcyB0ZXN0Li4uCisjIFRoaXMgdGVzdCBjaGVja3MgaWYgY29tbWFuZCB4eXp6eSBkb2VzIHRoZSByaWdodCB0aGluZy4uLgorIyAnCisjIC4gLi90ZXN0LWxpYi5zaAorCitlcnJvciAoKSB7CisJZWNobyAiKiBlcnJvcjogJCoiCisJdHJhcCAtIGV4aXQKKwlleGl0IDEKK30KKworc2F5ICgpIHsKKwllY2hvICIqICQqIgorfQorCit0ZXN0ICIke3Rlc3RfZGVzY3JpcHRpb259IiAhPSAiIiB8fAorZXJyb3IgIlRlc3Qgc2NyaXB0IGRpZCBub3Qgc2V0IHRlc3RfZGVzY3JpcHRpb24uIgorCit3aGlsZSB0ZXN0ICIkIyIgLW5lIDAKK2RvCisJY2FzZSAiJDEiIGluCisJLWR8LS1kfC0tZGV8LS1kZWJ8LS1kZWJ1fC0tZGVidWcpCisJCWRlYnVnPXQ7IHNoaWZ0IDs7CisJLWl8LS1pfC0taW18LS1pbW18LS1pbW1lfC0taW1tZWR8LS1pbW1lZGl8LS1pbW1lZGlhfC0taW1tZWRpYXR8LS1pbW1lZGlhdGUpCisJCWltbWVkaWF0ZT10OyBzaGlmdCA7OworCS1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKwkJZWNobyAiJHRlc3RfZGVzY3JpcHRpb24iCisJCWV4aXQgMCA7OworCS12fC0tdnwtLXZlfC0tdmVyfC0tdmVyYnwtLXZlcmJvfC0tdmVyYm9zfC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10OyBzaGlmdCA7OworCS0tbm8tcHl0aG9uKQorCQkjIG5vb3Agbm93Li4uCisJCXNoaWZ0IDs7CisJKikKKwkJYnJlYWsgOzsKKwllc2FjCitkb25lCisKK2V4ZWMgNT4mMQoraWYgdGVzdCAiJHZlcmJvc2UiID0gInQiCit0aGVuCisJZXhlYyA0PiYyIDM+JjEKK2Vsc2UKKwlleGVjIDQ+L2Rldi9udWxsIDM+L2Rldi9udWxsCitmaQorCit0ZXN0X2ZhaWx1cmU9MAordGVzdF9jb3VudD0wCisKK3RyYXAgJ2VjaG8gPiY1ICJGQVRBTDogVW5leHBlY3RlZCBleGl0IHdpdGggY29kZSAkPyI7IGV4aXQgMScgZXhpdAorCit0ZXN0X3RpY2sgKCkgeworCWlmIHRlc3QgLXogIiR7dGVzdF90aWNrK3NldH0iCisJdGhlbgorCQl0ZXN0X3RpY2s9MTExMjkxMTk5MworCWVsc2UKKwkJdGVzdF90aWNrPSQoKCR0ZXN0X3RpY2sgKyA2MCkpCisJZmkKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IiR0ZXN0X3RpY2sgLTA3MDAiCisJR0lUX0FVVEhPUl9EQVRFPSIkdGVzdF90aWNrIC0wNzAwIgorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCit9CisKKyMgWW91IGFyZSBub3QgZXhwZWN0ZWQgdG8gY2FsbCB0ZXN0X29rXyBhbmQgdGVzdF9mYWlsdXJlXyBkaXJlY3RseSwgdXNlCisjIHRoZSB0ZXh0X2V4cGVjdF8qIGZ1bmN0aW9ucyBpbnN0ZWFkLgorCit0ZXN0X29rXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJc2F5ICIgIG9rICR0ZXN0X2NvdW50OiAkQCIKK30KKwordGVzdF9mYWlsdXJlXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJdGVzdF9mYWlsdXJlPSQoZXhwciAiJHRlc3RfZmFpbHVyZSIgKyAxKTsKKwlzYXkgIkZBSUwgJHRlc3RfY291bnQ6ICQxIgorCXNoaWZ0CisJZWNobyAiJEAiIHwgc2VkIC1lICdzL14vCS8nCisJdGVzdCAiJGltbWVkaWF0ZSIgPSAiIiB8fCB7IHRyYXAgLSBleGl0OyBleGl0IDE7IH0KK30KKworCit0ZXN0X2RlYnVnICgpIHsKKwl0ZXN0ICIkZGVidWciID0gIiIgfHwgZXZhbCAiJDEiCit9CisKK3Rlc3RfcnVuXyAoKSB7CisJZXZhbCA+JjMgMj4mNCAiJDEiCisJZXZhbF9yZXQ9IiQ/IgorCXJldHVybiAwCit9CisKK3Rlc3Rfc2tpcCAoKSB7CisJdGhpc190ZXN0PSQoZXhwciAiLi8kMCIgOiAnLiovXCh0WzAtOV0qXCktW14vXSokJykKKwl0aGlzX3Rlc3Q9IiR0aGlzX3Rlc3QuJChleHByICIkdGVzdF9jb3VudCIgKyAxKSIKKwl0b19za2lwPQorCWZvciBza3AgaW4gJEdJVF9TS0lQX1RFU1RTCisJZG8KKwkJY2FzZSAiJHRoaXNfdGVzdCIgaW4KKwkJJHNrcCkKKwkJCXRvX3NraXA9dAorCQllc2FjCisJZG9uZQorCWNhc2UgIiR0b19za2lwIiBpbgorCXQpCisJCXNheSA+JjMgInNraXBwaW5nIHRlc3Q6ICRAIgorCQl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwkJc2F5ICJza2lwICR0ZXN0X2NvdW50OiAkMSIKKwkJOiB0cnVlCisJCTs7CisJKikKKwkJZmFsc2UKKwkJOzsKKwllc2FjCit9CisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgKCkgeworCXRlc3QgIiQjIiA9IDIgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDIgcGFyYW1ldGVycyB0byB0ZXN0LWV4cGVjdC1mYWlsdXJlIgorCWlmICEgdGVzdF9za2lwICIkQCIKKwl0aGVuCisJCXNheSA+JjMgImV4cGVjdGluZyBmYWlsdXJlOiAkMiIKKwkJdGVzdF9ydW5fICIkMiIKKwkJaWYgWyAiJD8iID0gMCAtYSAiJGV2YWxfcmV0IiAhPSAwIC1hICIkZXZhbF9yZXQiIC1sdCAxMjkgXQorCQl0aGVuCisJCQl0ZXN0X29rXyAiJDEiCisJCWVsc2UKKwkJCXRlc3RfZmFpbHVyZV8gIiRAIgorCQlmaQorCWZpCisJZWNobyA+JjMgIiIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAoKSB7CisJdGVzdCAiJCMiID0gMiB8fAorCWVycm9yICJidWcgaW4gdGhlIHRlc3Qgc2NyaXB0OiBub3QgMiBwYXJhbWV0ZXJzIHRvIHRlc3QtZXhwZWN0LXN1Y2Nlc3MiCisJaWYgISB0ZXN0X3NraXAgIiRAIgorCXRoZW4KKwkJc2F5ID4mMyAiZXhwZWN0aW5nIHN1Y2Nlc3M6ICQyIgorCQl0ZXN0X3J1bl8gIiQyIgorCQlpZiBbICIkPyIgPSAwIC1hICIkZXZhbF9yZXQiID0gMCBdCisJCXRoZW4KKwkJCXRlc3Rfb2tfICIkMSIKKwkJZWxzZQorCQkJdGVzdF9mYWlsdXJlXyAiJEAiCisJCWZpCisJZmkKKwllY2hvID4mMyAiIgorfQorCit0ZXN0X2V4cGVjdF9jb2RlICgpIHsKKwl0ZXN0ICIkIyIgPSAzIHx8CisJZXJyb3IgImJ1ZyBpbiB0aGUgdGVzdCBzY3JpcHQ6IG5vdCAzIHBhcmFtZXRlcnMgdG8gdGVzdC1leHBlY3QtY29kZSIKKwlpZiAhIHRlc3Rfc2tpcCAiJEAiCisJdGhlbgorCQlzYXkgPiYzICJleHBlY3RpbmcgZXhpdCBjb2RlICQxOiAkMyIKKwkJdGVzdF9ydW5fICIkMyIKKwkJaWYgWyAiJD8iID0gMCAtYSAiJGV2YWxfcmV0IiA9ICIkMSIgXQorCQl0aGVuCisJCQl0ZXN0X29rXyAiJDIiCisJCWVsc2UKKwkJCXRlc3RfZmFpbHVyZV8gIiRAIgorCQlmaQorCWZpCisJZWNobyA+JjMgIiIKK30KKworIyBNb3N0IHRlc3RzIGNhbiB1c2UgdGhlIGNyZWF0ZWQgcmVwb3NpdG9yeSwgYnV0IHNvbWUgYW15IG5lZWQgdG8gY3JlYXRlIG1vcmUuCisjIFVzYWdlOiB0ZXN0X2NyZWF0ZV9yZXBvIDxkaXJlY3Rvcnk+Cit0ZXN0X2NyZWF0ZV9yZXBvICgpIHsKKwl0ZXN0ICIkIyIgPSAxIHx8CisJZXJyb3IgImJ1ZyBpbiB0aGUgdGVzdCBzY3JpcHQ6IG5vdCAxIHBhcmFtZXRlciB0byB0ZXN0LWNyZWF0ZS1yZXBvIgorCW93ZD1gcHdkYAorCXJlcG89IiQxIgorCW1rZGlyICIkcmVwbyIKKwljZCAiJHJlcG8iIHx8IGVycm9yICJDYW5ub3Qgc2V0dXAgdGVzdCBlbnZpcm9ubWVudCIKKwkiJEdJVF9FWEVDX1BBVEgvZ2l0IiBpbml0IC0tdGVtcGxhdGU9JEdJVF9FWEVDX1BBVEgvdGVtcGxhdGVzL2JsdC8gPi9kZXYvbnVsbCAyPiYxIHx8CisJZXJyb3IgImNhbm5vdCBydW4gZ2l0IGluaXQgLS0gaGF2ZSB5b3UgYnVpbHQgdGhpbmdzIHlldD8iCisJbXYgLmdpdC9ob29rcyAuZ2l0L2hvb2tzLWRpc2FibGVkCisJY2QgIiRvd2QiCit9CisJCit0ZXN0X2RvbmUgKCkgeworCXRyYXAgLSBleGl0CisJY2FzZSAiJHRlc3RfZmFpbHVyZSIgaW4KKwkwKQorCQkjIFdlIGNvdWxkOgorCQkjIGNkIC4uICYmIHJtIC1mciB0cmFzaAorCQkjIGJ1dCB0aGF0IG1lYW5zIHdlIGZvcmJpZCBhbnkgdGVzdHMgdGhhdCB1c2UgdGhlaXIgb3duCisJCSMgc3ViZGlyZWN0b3J5IGZyb20gY2FsbGluZyB0ZXN0X2RvbmUgd2l0aG91dCBjb21pbmcgYmFjaworCQkjIHRvIHdoZXJlIHRoZXkgc3RhcnRlZCBmcm9tLgorCQkjIFRoZSBNYWtlZmlsZSBwcm92aWRlZCB3aWxsIGNsZWFuIHRoaXMgdGVzdCBhcmVhIHNvCisJCSMgd2Ugd2lsbCBsZWF2ZSB0aGluZ3MgYXMgdGhleSBhcmUuCisKKwkJc2F5ICJwYXNzZWQgYWxsICR0ZXN0X2NvdW50IHRlc3QocykiCisJCWV4aXQgMCA7OworCisJKikKKwkJc2F5ICJmYWlsZWQgJHRlc3RfZmFpbHVyZSBhbW9uZyAkdGVzdF9jb3VudCB0ZXN0KHMpIgorCQlleGl0IDEgOzsKKworCWVzYWMKK30KKworIyBUZXN0IHRoZSBiaW5hcmllcyB3ZSBoYXZlIGp1c3QgYnVpbHQuICBUaGUgdGVzdHMgYXJlIGtlcHQgaW4KKyMgdC8gc3ViZGlyZWN0b3J5IGFuZCBhcmUgcnVuIGluIHRyYXNoIHN1YmRpcmVjdG9yeS4KK1BBVEg9JChwd2QpLy4uOiRQQVRICitHSVRfRVhFQ19QQVRIPSQocHdkKS8uLgorR0lUX1RFTVBMQVRFX0RJUj0kKHB3ZCkvLi4vdGVtcGxhdGVzL2JsdAorR0lUX0NPTkZJRz0uZ2l0L2NvbmZpZworZXhwb3J0IFBBVEggR0lUX0VYRUNfUEFUSCBHSVRfVEVNUExBVEVfRElSIEdJVF9DT05GSUcKKworR0lUUEVSTExJQj0kKHB3ZCkvLi4vcGVybC9ibGliL2xpYjokKHB3ZCkvLi4vcGVybC9ibGliL2FyY2gvYXV0by9HaXQKK2V4cG9ydCBHSVRQRVJMTElCCit0ZXN0IC1kIC4uL3RlbXBsYXRlcy9ibHQgfHwgeworCWVycm9yICJZb3UgaGF2ZW4ndCBidWlsdCB0aGluZ3MgeWV0LCBoYXZlIHlvdT8iCit9CisKK2lmICEgdGVzdCAteCAuLi90ZXN0LWNobXRpbWU7IHRoZW4KKwllY2hvID4mMiAnWW91IG5lZWQgdG8gYnVpbGQgdGVzdC1jaG10aW1lOicKKwllY2hvID4mMiAnUnVuICJtYWtlIHRlc3QtY2htdGltZSIgaW4gdGhlIHNvdXJjZSAodG9wbGV2ZWwpIGRpcmVjdG9yeScKKwlleGl0IDEKK2ZpCisKKyMgVGVzdCByZXBvc2l0b3J5Cit0ZXN0PXRyYXNoCitybSAtZnIgIiR0ZXN0IgordGVzdF9jcmVhdGVfcmVwbyAkdGVzdAorY2QgIiR0ZXN0IgorCit0aGlzX3Rlc3Q9JChleHByICIuLyQwIiA6ICcuKi9cKHRbMC05XSpcKS1bXi9dKiQnKQorZm9yIHNrcCBpbiAkR0lUX1NLSVBfVEVTVFMKK2RvCisJdG9fc2tpcD0KKwlmb3Igc2twIGluICRHSVRfU0tJUF9URVNUUworCWRvCisJCWNhc2UgIiR0aGlzX3Rlc3QiIGluCisJCSRza3ApCisJCQl0b19za2lwPXQKKwkJZXNhYworCWRvbmUKKwljYXNlICIkdG9fc2tpcCIgaW4KKwl0KQorCQlzYXkgPiYzICJza2lwcGluZyB0ZXN0ICR0aGlzX3Rlc3QgYWx0b2dldGhlciIKKwkJc2F5ICJza2lwIGFsbCB0ZXN0cyBpbiAkdGhpc190ZXN0IgorCQl0ZXN0X2RvbmUKKwllc2FjCitkb25lCmRpZmYgLS1naXQgYS90L3Rlc3Q0MDEyLnBuZyBiL3QvdGVzdDQwMTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTgxZDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Rlc3Q0MDEyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90L3Rlc3Q5MjAwYS5wbmcgYi90L3Rlc3Q5MjAwYS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxODFkMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdDkyMDBhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90L3Rlc3Q5MjAwYi5wbmcgYi90L3Rlc3Q5MjAwYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMmNjYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdDkyMDBiLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90YWcuYyBiL3RhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWNkNTkKLS0tIC9kZXYvbnVsbAorKysgYi90YWcuYwpAQCAtMCwwICsxLDExOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKworY29uc3QgY2hhciAqdGFnX3R5cGUgPSAidGFnIjsKKworc3RydWN0IG9iamVjdCAqZGVyZWZfdGFnKHN0cnVjdCBvYmplY3QgKm8sIGNvbnN0IGNoYXIgKndhcm4sIGludCB3YXJubGVuKQoreworCXdoaWxlIChvICYmIG8tPnR5cGUgPT0gT0JKX1RBRykKKwkJbyA9IHBhcnNlX29iamVjdCgoKHN0cnVjdCB0YWcgKilvKS0+dGFnZ2VkLT5zaGExKTsKKwlpZiAoIW8gJiYgd2FybikgeworCQlpZiAoIXdhcm5sZW4pCisJCQl3YXJubGVuID0gc3RybGVuKHdhcm4pOworCQllcnJvcigibWlzc2luZyBvYmplY3QgcmVmZXJlbmNlZCBieSAnJS4qcyciLCB3YXJubGVuLCB3YXJuKTsKKwl9CisJcmV0dXJuIG87Cit9CisKK3N0cnVjdCB0YWcgKmxvb2t1cF90YWcoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKQorCQlyZXR1cm4gY3JlYXRlX29iamVjdChzaGExLCBPQkpfVEFHLCBhbGxvY190YWdfbm9kZSgpKTsKKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gT0JKX1RBRzsKKyAgICAgICAgaWYgKG9iai0+dHlwZSAhPSBPQkpfVEFHKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIk9iamVjdCAlcyBpcyBhICVzLCBub3QgYSB0YWciLAorICAgICAgICAgICAgICAgICAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0cnVjdCB0YWcgKikgb2JqOworfQorCitpbnQgcGFyc2VfdGFnX2J1ZmZlcihzdHJ1Y3QgdGFnICppdGVtLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHR5cGVsZW4sIHRhZ2xlbjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKnR5cGVfbGluZSwgKnRhZ19saW5lLCAqc2lnX2xpbmU7CisJY2hhciB0eXBlWzIwXTsKKworICAgICAgICBpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaXRlbS0+b2JqZWN0LnBhcnNlZCA9IDE7CisKKwlpZiAoc2l6ZSA8IDY0KQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcCgib2JqZWN0ICIsIGRhdGEsIDcpIHx8IGdldF9zaGExX2hleCgoY2hhciAqKSBkYXRhICsgNywgc2hhMSkpCisJCXJldHVybiAtMTsKKworCXR5cGVfbGluZSA9IChjaGFyICopIGRhdGEgKyA0ODsKKwlpZiAobWVtY21wKCJcbnR5cGUgIiwgdHlwZV9saW5lLTEsIDYpKQorCQlyZXR1cm4gLTE7CisKKwl0YWdfbGluZSA9IHN0cmNocih0eXBlX2xpbmUsICdcbicpOworCWlmICghdGFnX2xpbmUgfHwgbWVtY21wKCJ0YWcgIiwgKyt0YWdfbGluZSwgNCkpCisJCXJldHVybiAtMTsKKworCXNpZ19saW5lID0gc3RyY2hyKHRhZ19saW5lLCAnXG4nKTsKKwlpZiAoIXNpZ19saW5lKQorCQlyZXR1cm4gLTE7CisJc2lnX2xpbmUrKzsKKworCXR5cGVsZW4gPSB0YWdfbGluZSAtIHR5cGVfbGluZSAtIHN0cmxlbigidHlwZSBcbiIpOworCWlmICh0eXBlbGVuID49IDIwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHR5cGUsIHR5cGVfbGluZSArIDUsIHR5cGVsZW4pOworCXR5cGVbdHlwZWxlbl0gPSAnXDAnOworCXRhZ2xlbiA9IHNpZ19saW5lIC0gdGFnX2xpbmUgLSBzdHJsZW4oInRhZyBcbiIpOworCWl0ZW0tPnRhZyA9IHhtYWxsb2ModGFnbGVuICsgMSk7CisJbWVtY3B5KGl0ZW0tPnRhZywgdGFnX2xpbmUgKyA0LCB0YWdsZW4pOworCWl0ZW0tPnRhZ1t0YWdsZW5dID0gJ1wwJzsKKworCWlmICghc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpIHsKKwkJaXRlbS0+dGFnZ2VkID0gJmxvb2t1cF9ibG9iKHNoYTEpLT5vYmplY3Q7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJaXRlbS0+dGFnZ2VkID0gJmxvb2t1cF90cmVlKHNoYTEpLT5vYmplY3Q7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIGNvbW1pdF90eXBlKSkgeworCQlpdGVtLT50YWdnZWQgPSAmbG9va3VwX2NvbW1pdChzaGExKS0+b2JqZWN0OworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpIHsKKwkJaXRlbS0+dGFnZ2VkID0gJmxvb2t1cF90YWcoc2hhMSktPm9iamVjdDsKKwl9IGVsc2UgeworCQllcnJvcigiVW5rbm93biB0eXBlICVzIiwgdHlwZSk7CisJCWl0ZW0tPnRhZ2dlZCA9IE5VTEw7CisJfQorCisJaWYgKGl0ZW0tPnRhZ2dlZCAmJiB0cmFja19vYmplY3RfcmVmcykgeworCQlzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnMgPSBhbGxvY19vYmplY3RfcmVmcygxKTsKKwkJcmVmcy0+cmVmWzBdID0gaXRlbS0+dGFnZ2VkOworCQlzZXRfb2JqZWN0X3JlZnMoJml0ZW0tPm9iamVjdCwgcmVmcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZV90YWcoc3RydWN0IHRhZyAqaXRlbSkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCByZWFkICVzIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpZiAodHlwZSAhPSBPQkpfVEFHKSB7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBlcnJvcigiT2JqZWN0ICVzIG5vdCBhIHRhZyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJfQorCXJldCA9IHBhcnNlX3RhZ19idWZmZXIoaXRlbSwgZGF0YSwgc2l6ZSk7CisJZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGFnLmggYi90YWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBjYjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGFnLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBUQUdfSAorI2RlZmluZSBUQUdfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2V4dGVybiBjb25zdCBjaGFyICp0YWdfdHlwZTsKKworc3RydWN0IHRhZyB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJc3RydWN0IG9iamVjdCAqdGFnZ2VkOworCWNoYXIgKnRhZzsKKwljaGFyICpzaWduYXR1cmU7IC8qIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCB0YWcgKmxvb2t1cF90YWcoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IHBhcnNlX3RhZ19idWZmZXIoc3RydWN0IHRhZyAqaXRlbSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgcGFyc2VfdGFnKHN0cnVjdCB0YWcgKml0ZW0pOworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmRlcmVmX3RhZyhzdHJ1Y3Qgb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIFRBR19IICovCmRpZmYgLS1naXQgYS90YXIuaCBiL3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Njc3MDUKLS0tIC9kZXYvbnVsbAorKysgYi90YXIuaApAQCAtMCwwICsxLDI1IEBACisjZGVmaW5lIFRZUEVGTEFHX0FVVE8JCSdcMCcKKyNkZWZpbmUgVFlQRUZMQUdfUkVHCQknMCcKKyNkZWZpbmUgVFlQRUZMQUdfTE5LCQknMicKKyNkZWZpbmUgVFlQRUZMQUdfRElSCQknNScKKyNkZWZpbmUgVFlQRUZMQUdfR0xPQkFMX0hFQURFUgknZycKKyNkZWZpbmUgVFlQRUZMQUdfRVhUX0hFQURFUgkneCcKKworc3RydWN0IHVzdGFyX2hlYWRlciB7CisJY2hhciBuYW1lWzEwMF07CQkvKiAgIDAgKi8KKwljaGFyIG1vZGVbOF07CQkvKiAxMDAgKi8KKwljaGFyIHVpZFs4XTsJCS8qIDEwOCAqLworCWNoYXIgZ2lkWzhdOwkJLyogMTE2ICovCisJY2hhciBzaXplWzEyXTsJCS8qIDEyNCAqLworCWNoYXIgbXRpbWVbMTJdOwkJLyogMTM2ICovCisJY2hhciBjaGtzdW1bOF07CQkvKiAxNDggKi8KKwljaGFyIHR5cGVmbGFnWzFdOwkvKiAxNTYgKi8KKwljaGFyIGxpbmtuYW1lWzEwMF07CS8qIDE1NyAqLworCWNoYXIgbWFnaWNbNl07CQkvKiAyNTcgKi8KKwljaGFyIHZlcnNpb25bMl07CS8qIDI2MyAqLworCWNoYXIgdW5hbWVbMzJdOwkJLyogMjY1ICovCisJY2hhciBnbmFtZVszMl07CQkvKiAyOTcgKi8KKwljaGFyIGRldm1ham9yWzhdOwkvKiAzMjkgKi8KKwljaGFyIGRldm1pbm9yWzhdOwkvKiAzMzcgKi8KKwljaGFyIHByZWZpeFsxNTVdOwkvKiAzNDUgKi8KK307CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvLmdpdGlnbm9yZSBiL3RlbXBsYXRlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTllY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2JsdAorYm9pbGVycGxhdGVzLm1hZGUKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9NYWtlZmlsZSBiL3RlbXBsYXRlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODM1MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL01ha2VmaWxlCkBAIC0wLDAgKzEsNTAgQEAKKyMgbWFrZSBhbmQgaW5zdGFsbCBzYW1wbGUgdGVtcGxhdGVzCisKK2lmbmRlZiBWCisJUVVJRVQgPSBACitlbmRpZgorCitJTlNUQUxMID89IGluc3RhbGwKK1RBUiA/PSB0YXIKK3ByZWZpeCA/PSAkKEhPTUUpCit0ZW1wbGF0ZV9kaXIgPz0gJChwcmVmaXgpL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlcy8KKyMgREVTVERJUj0KKworIyBTaGVsbCBxdW90ZSAoZG8gbm90IHVzZSAkKGNhbGwpIHRvIGFjY29tbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKK0RFU1RESVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKERFU1RESVIpKQordGVtcGxhdGVfZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJCh0ZW1wbGF0ZV9kaXIpKQorCithbGw6IGJvaWxlcnBsYXRlcy5tYWRlIGN1c3RvbQorCisjIFB1dCB0ZW1wbGF0ZXMgdGhhdCBjYW4gYmUgY29waWVkIHN0cmFpZ2h0IGZyb20gdGhlIHNvdXJjZQorIyBpbiBhIGZpbGUgZGlyZWMtLXRvcnktLWZpbGUgaW4gdGhlIHNvdXJjZS4gIFRoZXkgd2lsbCBiZQorIyBqdXN0IGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisKK2Jwc3JjID0gJChmaWx0ZXItb3V0ICV+LCQod2lsZGNhcmQgKi0tKikpCitib2lsZXJwbGF0ZXMubWFkZSA6ICQoYnBzcmMpCisJJChRVUlFVClscyAqLS0qIDI+L2Rldi9udWxsIHwgXAorCXdoaWxlIHJlYWQgYm9pbGVycGxhdGU7IFwKKwlkbyBcCisJCWNhc2UgIiQkYm9pbGVycGxhdGUiIGluICp+KSBjb250aW51ZSA7OyBlc2FjICYmIFwKKwkJZHN0PWBlY2hvICIkJGJvaWxlcnBsYXRlIiB8IHNlZCAtZSAnc3xedGhpc3wufDtzfC0tfC98ZydgICYmIFwKKwkJZGlyPWBleHByICIkJGRzdCIgOiAnXCguKlwpLydgICYmIFwKKwkJbWtkaXIgLXAgYmx0LyQkZGlyICYmIFwKKwkJY2FzZSAiJCRib2lsZXJwbGF0ZSIgaW4gXAorCQkqLS0pIDs7IFwKKwkJKikgY3AgJCRib2lsZXJwbGF0ZSBibHQvJCRkc3QgOzsgXAorCQllc2FjIHx8IGV4aXQ7IFwKKwlkb25lICYmIFwKKwlkYXRlID4kQAorCisjIElmIHlvdSBuZWVkIGJ1aWxkLXRhaWxvcmVkIHRlbXBsYXRlcywgYnVpbGQgdGhlbSBpbnRvIGJsdC8KKyMgZGlyZWN0b3J5IHlvdXJzZWxmIGhlcmUuCitjdXN0b206CisJJChRVUlFVCk6IG5vIGN1c3RvbSB0ZW1wbGF0ZXMgeWV0CisKK2NsZWFuOgorCXJtIC1yZiBibHQgYm9pbGVycGxhdGVzLm1hZGUKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQodGVtcGxhdGVfZGlyX1NRKScKKwkoY2QgYmx0ICYmICQoVEFSKSBjZiAtIC4pIHwgXAorCShjZCAnJChERVNURElSX1NRKSQodGVtcGxhdGVfZGlyX1NRKScgJiYgJChUQVIpIHhmIC0pCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvYnJhbmNoZXMtLSBiL3RlbXBsYXRlcy9icmFuY2hlcy0tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTg4NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvYnJhbmNoZXMtLQpAQCAtMCwwICsxIEBACis6IHRoaXMgaXMganVzdCB0byBlbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWFwcGx5cGF0Y2gtbXNnIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRlMWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHRha2VuIGJ5CisjIGFwcGx5cGF0Y2ggZnJvbSBhbiBlLW1haWwgbWVzc2FnZS4KKyMKKyMgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbgorIyBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4gIFRoZSBob29rIGlzCisjIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworLiBnaXQtc2gtc2V0dXAKK3Rlc3QgLXggIiRHSVRfRElSL2hvb2tzL2NvbW1pdC1tc2ciICYmCisJZXhlYyAiJEdJVF9ESVIvaG9va3MvY29tbWl0LW1zZyIgJHsxKyIkQCJ9Cis6CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cgYi90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwNGYyZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tY29tbWl0LW1zZwpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLgorIyBDYWxsZWQgYnkgZ2l0LWNvbW1pdCB3aXRoIG9uZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyMgdGhhdCBoYXMgdGhlIGNvbW1pdCBtZXNzYWdlLiAgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybworIyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlCisjIGNvbW1pdC4gIFRoZSBob29rIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworIyBVbmNvbW1lbnQgdGhlIGJlbG93IHRvIGFkZCBhIFNpZ25lZC1vZmYtYnkgbGluZSB0byB0aGUgbWVzc2FnZS4KKyMgU09CPSQoZ2l0IHZhciBHSVRfQVVUSE9SX0lERU5UIHwgc2VkIC1uICdzL15cKC4qPlwpLiokL1NpZ25lZC1vZmYtYnk6IFwxL3AnKQorIyBncmVwIC1xcyAiXiRTT0IiICIkMSIgfHwgZWNobyAiJFNPQiIgPj4gIiQxIgorCisjIFRoaXMgZXhhbXBsZSBjYXRjaGVzIGR1cGxpY2F0ZSBTaWduZWQtb2ZmLWJ5IGxpbmVzLgorCit0ZXN0ICIiID0gIiQoZ3JlcCAnXlNpZ25lZC1vZmYtYnk6ICcgIiQxIiB8CisJIHNvcnQgfCB1bmlxIC1jIHwgc2VkIC1lICcvXlsgCV0qMVsgCV0vZCcpIiB8fCB7CisJZWNobyA+JjIgRHVwbGljYXRlIFNpZ25lZC1vZmYtYnkgbGluZXMuCisJZXhpdCAxCit9CisKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1jb21taXQgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0CkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGNvbW1pdCBpcyBtYWRlLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCis6IE5vdGhpbmcKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1yZWNlaXZlIGIvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LXJlY2VpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwZGUyNgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1yZWNlaXZlCkBAIC0wLDAgKzEsMTcgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IGZvciB0aGUgcG9zdC1yZWNlaXZlIGV2ZW50CisjCisjIFRoaXMgc2NyaXB0IGlzIHJ1biBhZnRlciByZWNlaXZlLXBhY2sgaGFzIGFjY2VwdGVkIGEgcGFjayBhbmQgdGhlCisjIHJlcG9zaXRvcnkgaGFzIGJlZW4gdXBkYXRlZC4gIEl0IGlzIHBhc3NlZCBhcmd1bWVudHMgaW4gdGhyb3VnaCBzdGRpbgorIyBpbiB0aGUgZm9ybQorIyAgPG9sZHJldj4gPG5ld3Jldj4gPHJlZm5hbWU+CisjIEZvciBleGFtcGxlOgorIyAgYWE0NTMyMTZkMWIzZTQ5ZTdmNmY5ODQ0MWZhNTY5NDZkZGNkNmEyMCA2OGY3YWJmNGU2ZjkyMjgwNzg4OWY1MmJjMDQzZWNkMzFiNzlmODE0IHJlZnMvaGVhZHMvbWFzdGVyCisjCisjIHNlZSBjb250cmliL2hvb2tzLyBmb3IgYW4gc2FtcGxlLCBvciB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSAob24gZGViaWFuKQorIworCisKKyMuIC91c3Ivc2hhcmUvZG9jL2dpdC1jb3JlL2NvbnRyaWIvaG9va3MvcG9zdC1yZWNlaXZlLWVtYWlsCisKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC11cGRhdGUgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtdXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmE4OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtdXBkYXRlCkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gcHJlcGFyZSBhIHBhY2tlZCByZXBvc2l0b3J5IGZvciB1c2Ugb3ZlcgorIyBkdW1iIHRyYW5zcG9ydHMuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUgYnkgImNobW9kICt4IHBvc3QtdXBkYXRlIi4KKworZXhlYyBnaXQtdXBkYXRlLXNlcnZlci1pbmZvCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1hcHBseXBhdGNoIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtYXBwbHlwYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU2Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtYXBwbHlwYXRjaApAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byB2ZXJpZnkgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQKKyMgYnkgYXBwbHlwYXRjaCBmcm9tIGFuIGUtbWFpbCBtZXNzYWdlLgorIworIyBUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBhZnRlciBpc3N1aW5nIGFuCisjIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaWYgaXQgd2FudHMgdG8gc3RvcCB0aGUgY29tbWl0LgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCisuIGdpdC1zaC1zZXR1cAordGVzdCAteCAiJEdJVF9ESVIvaG9va3MvcHJlLWNvbW1pdCIgJiYKKwlleGVjICIkR0lUX0RJUi9ob29rcy9wcmUtY29tbWl0IiAkezErIiRAIn0KKzoKKwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wcmUtY29tbWl0IGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2E5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gdmVyaWZ5IHdoYXQgaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkLgorIyBDYWxsZWQgYnkgZ2l0LWNvbW1pdCB3aXRoIG5vIGFyZ3VtZW50cy4gIFRoZSBob29rIHNob3VsZAorIyBleGl0IHdpdGggbm9uLXplcm8gc3RhdHVzIGFmdGVyIGlzc3VpbmcgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBpZgorIyBpdCB3YW50cyB0byBzdG9wIHRoZSBjb21taXQuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUuCisKKyMgVGhpcyBpcyBzbGlnaHRseSBtb2RpZmllZCBmcm9tIEFuZHJldyBNb3J0b24ncyBQZXJmZWN0IFBhdGNoLgorIyBMaW5lcyB5b3UgaW50cm9kdWNlIHNob3VsZCBub3QgaGF2ZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorIyBBbHNvIGNoZWNrIGZvciBhbiBpbmRlbnRhdGlvbiB0aGF0IGhhcyBTUCBiZWZvcmUgYSBUQUIuCisKK2lmIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbAordGhlbgorCWdpdC1kaWZmLWluZGV4IC1wIC1NIC0tY2FjaGVkIEhFQUQKK2Vsc2UKKwkjIE5FRURTV09SSzogd2Ugc2hvdWxkIHByb2R1Y2UgYSBkaWZmIHdpdGggYW4gZW1wdHkgdHJlZSBoZXJlCisJIyBpZiB3ZSB3YW50IHRvIGRvIHRoZSBzYW1lIHZlcmlmaWNhdGlvbiBmb3IgdGhlIGluaXRpYWwgaW1wb3J0LgorCToKK2ZpIHwKK3BlcmwgLWUgJworICAgIG15ICRmb3VuZF9iYWQgPSAwOworICAgIG15ICRmaWxlbmFtZTsKKyAgICBteSAkcmVwb3J0ZWRfZmlsZW5hbWUgPSAiIjsKKyAgICBteSAkbGluZW5vOworICAgIHN1YiBiYWRfbGluZSB7CisJbXkgKCR3aHksICRsaW5lKSA9IEBfOworCWlmICghJGZvdW5kX2JhZCkgeworCSAgICBwcmludCBTVERFUlIgIipcbiI7CisJICAgIHByaW50IFNUREVSUiAiKiBZb3UgaGF2ZSBzb21lIHN1c3BpY2lvdXMgcGF0Y2ggbGluZXM6XG4iOworCSAgICBwcmludCBTVERFUlIgIipcbiI7CisJICAgICRmb3VuZF9iYWQgPSAxOworCX0KKwlpZiAoJHJlcG9ydGVkX2ZpbGVuYW1lIG5lICRmaWxlbmFtZSkgeworCSAgICBwcmludCBTVERFUlIgIiogSW4gJGZpbGVuYW1lXG4iOworCSAgICAkcmVwb3J0ZWRfZmlsZW5hbWUgPSAkZmlsZW5hbWU7CisJfQorCXByaW50IFNUREVSUiAiKiAkd2h5IChsaW5lICRsaW5lbm8pXG4iOworCXByaW50IFNUREVSUiAiJGZpbGVuYW1lOiRsaW5lbm86JGxpbmVcbiI7CisgICAgfQorICAgIHdoaWxlICg8PikgeworCWlmIChtfF5kaWZmIC0tZ2l0IGEvKC4qKSBiL1wxJHwpIHsKKwkgICAgJGZpbGVuYW1lID0gJDE7CisJICAgIG5leHQ7CisJfQorCWlmICgvXkBAIC1cUysgXCsoXGQrKS8pIHsKKwkgICAgJGxpbmVubyA9ICQxIC0gMTsKKwkgICAgbmV4dDsKKwl9CisJaWYgKC9eIC8pIHsKKwkgICAgJGxpbmVubysrOworCSAgICBuZXh0OworCX0KKwlpZiAocy9eXCsvLykgeworCSAgICAkbGluZW5vKys7CisJICAgIGNob21wOworCSAgICBpZiAoL1xzJC8pIHsKKwkJYmFkX2xpbmUoInRyYWlsaW5nIHdoaXRlc3BhY2UiLCAkXyk7CisJICAgIH0KKwkgICAgaWYgKC9eXHMqIAkvKSB7CisJCWJhZF9saW5lKCJpbmRlbnQgU1AgZm9sbG93ZWQgYnkgYSBUQUIiLCAkXyk7CisJICAgIH0KKwkgICAgaWYgKC9eKD86Wzw+PV0pezd9LykgeworCQliYWRfbGluZSgidW5yZXNvbHZlZCBtZXJnZSBjb25mbGljdCIsICRfKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZXhpdCgkZm91bmRfYmFkKTsKKycKKwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wcmUtcmViYXNlIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtcmViYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWM0NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKworcHVibGlzaD1uZXh0CitiYXNlYnJhbmNoPSIkMSIKK2lmIHRlc3QgIiQjIiA9IDIKK3RoZW4KKwl0b3BpYz0icmVmcy9oZWFkcy8kMiIKK2Vsc2UKKwl0b3BpYz1gZ2l0IHN5bWJvbGljLXJlZiBIRUFEYAorZmkKKworY2FzZSAiJGJhc2VicmFuY2gsJHRvcGljIiBpbgorbWFzdGVyLHJlZnMvaGVhZHMvPz8vKikKKwk7OworKikKKwlleGl0IDAgOyMgd2UgZG8gbm90IGludGVycnVwdCBvdGhlcnMuCisJOzsKK2VzYWMKKworIyBOb3cgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHRvcGljIGJyYW5jaCBiZWluZyByZWJhc2VkCisjIG9uIHRvcCBvZiBtYXN0ZXIuICBJcyBpdCBPSyB0byByZWJhc2UgaXQ/CisKKyMgSXMgdG9waWMgZnVsbHkgbWVyZ2VkIHRvIG1hc3Rlcj8KK25vdF9pbl9tYXN0ZXI9YGdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIF5tYXN0ZXIgIiR0b3BpYyJgCitpZiB0ZXN0IC16ICIkbm90X2luX21hc3RlciIKK3RoZW4KKwllY2hvID4mMiAiJHRvcGljIGlzIGZ1bGx5IG1lcmdlZCB0byBtYXN0ZXI7IGJldHRlciByZW1vdmUgaXQuIgorCWV4aXQgMSA7IyB3ZSBjb3VsZCBhbGxvdyBpdCwgYnV0IHRoZXJlIGlzIG5vIHBvaW50LgorZmkKKworIyBJcyB0b3BpYyBldmVyIG1lcmdlZCB0byBuZXh0PyAgSWYgc28geW91IHNob3VsZCBub3QgYmUgcmViYXNpbmcgaXQuCitvbmx5X25leHRfMT1gZ2l0LXJldi1saXN0IF5tYXN0ZXIgIl4kdG9waWMiICR7cHVibGlzaH0gfCBzb3J0YAorb25seV9uZXh0XzI9YGdpdC1yZXYtbGlzdCBebWFzdGVyICAgICAgICAgICAke3B1Ymxpc2h9IHwgc29ydGAKK2lmIHRlc3QgIiRvbmx5X25leHRfMSIgPSAiJG9ubHlfbmV4dF8yIgordGhlbgorCW5vdF9pbl90b3BpYz1gZ2l0LXJldi1saXN0ICJeJHRvcGljIiBtYXN0ZXJgCisJaWYgdGVzdCAteiAiJG5vdF9pbl90b3BpYyIKKwl0aGVuCisJCWVjaG8gPiYyICIkdG9waWMgaXMgYWxyZWFkeSB1cC10by1kYXRlIHdpdGggbWFzdGVyIgorCQlleGl0IDEgOyMgd2UgY291bGQgYWxsb3cgaXQsIGJ1dCB0aGVyZSBpcyBubyBwb2ludC4KKwllbHNlCisJCWV4aXQgMAorCWZpCitlbHNlCisJbm90X2luX25leHQ9YGdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIF4ke3B1Ymxpc2h9ICIkdG9waWMiYAorCXBlcmwgLWUgJworCQlteSAkdG9waWMgPSAkQVJHVlswXTsKKwkJbXkgJG1zZyA9ICIqICR0b3BpYyBoYXMgY29tbWl0cyBhbHJlYWR5IG1lcmdlZCB0byBwdWJsaWMgYnJhbmNoOlxuIjsKKwkJbXkgKCVub3RfaW5fbmV4dCkgPSBtYXAgeworCQkJL14oWzAtOWEtZl0rKSAvOworCQkJKCQxID0+IDEpOworCQl9IHNwbGl0KC9cbi8sICRBUkdWWzFdKTsKKwkJZm9yIG15ICRlbGVtIChtYXAgeworCQkJCS9eKFswLTlhLWZdKykgKC4qKSQvOworCQkJCVskMSA9PiAkMl07CisJCQl9IHNwbGl0KC9cbi8sICRBUkdWWzJdKSkgeworCQkJaWYgKCFleGlzdHMgJG5vdF9pbl9uZXh0eyRlbGVtLT5bMF19KSB7CisJCQkJaWYgKCRtc2cpIHsKKwkJCQkJcHJpbnQgU1RERVJSICRtc2c7CisJCQkJCXVuZGVmICRtc2c7CisJCQkJfQorCQkJCXByaW50IFNUREVSUiAiICRlbGVtLT5bMV1cbiI7CisJCQl9CisJCX0KKwknICIkdG9waWMiICIkbm90X2luX25leHQiICIkbm90X2luX21hc3RlciIKKwlleGl0IDEKK2ZpCisKK2V4aXQgMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1RoaXMgc2FtcGxlIGhvb2sgc2FmZWd1YXJkcyB0b3BpYyBicmFuY2hlcyB0aGF0IGhhdmUgYmVlbgorcHVibGlzaGVkIGZyb20gYmVpbmcgcmV3b3VuZC4KKworVGhlIHdvcmtmbG93IGFzc3VtZWQgaGVyZSBpczoKKworICogT25jZSBhIHRvcGljIGJyYW5jaCBmb3JrcyBmcm9tICJtYXN0ZXIiLCAibWFzdGVyIiBpcyBuZXZlcgorICAgbWVyZ2VkIGludG8gaXQgYWdhaW4gKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KS4KKworICogT25jZSBhIHRvcGljIGJyYW5jaCBpcyBmdWxseSBjb29rZWQgYW5kIG1lcmdlZCBpbnRvICJtYXN0ZXIiLAorICAgaXQgaXMgZGVsZXRlZC4gIElmIHlvdSBuZWVkIHRvIGJ1aWxkIG9uIHRvcCBvZiBpdCB0byBjb3JyZWN0CisgICBlYXJsaWVyIG1pc3Rha2VzLCBhIG5ldyB0b3BpYyBicmFuY2ggaXMgY3JlYXRlZCBieSBmb3JraW5nIGF0CisgICB0aGUgdGlwIG9mIHRoZSAibWFzdGVyIi4gIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0CisgICBpdCBtYWtlcyBpdCBlYXNpZXIgdG8ga2VlcCB5b3VyIGhpc3Rvcnkgc2ltcGxlLgorCisgKiBXaGVuZXZlciB5b3UgbmVlZCB0byB0ZXN0IG9yIHB1Ymxpc2ggeW91ciBjaGFuZ2VzIHRvIHRvcGljCisgICBicmFuY2hlcywgbWVyZ2UgdGhlbSBpbnRvICJuZXh0IiBicmFuY2guCisKK1RoZSBzY3JpcHQsIGJlaW5nIGFuIGV4YW1wbGUsIGhhcmRjb2RlcyB0aGUgcHVibGlzaCBicmFuY2ggbmFtZQordG8gYmUgIm5leHQiLCBidXQgaXQgaXMgdHJpdmlhbCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSB2aWEKKyRHSVRfRElSL2NvbmZpZyBtZWNoYW5pc20uCisKK1dpdGggdGhpcyB3b3JrZmxvdywgeW91IHdvdWxkIHdhbnQgdG8ga25vdzoKKworKDEpIC4uLiBpZiBhIHRvcGljIGJyYW5jaCBoYXMgZXZlciBiZWVuIG1lcmdlZCB0byAibmV4dCIuICBZb3VuZworICAgIHRvcGljIGJyYW5jaGVzIGNhbiBoYXZlIHN0dXBpZCBtaXN0YWtlcyB5b3Ugd291bGQgcmF0aGVyCisgICAgY2xlYW4gdXAgYmVmb3JlIHB1Ymxpc2hpbmcsIGFuZCB0aGluZ3MgdGhhdCBoYXZlIG5vdCBiZWVuCisgICAgbWVyZ2VkIGludG8gb3RoZXIgYnJhbmNoZXMgY2FuIGJlIGVhc2lseSByZWJhc2VkIHdpdGhvdXQKKyAgICBhZmZlY3Rpbmcgb3RoZXIgcGVvcGxlLiAgQnV0IG9uY2UgaXQgaXMgcHVibGlzaGVkLCB5b3Ugd291bGQKKyAgICBub3Qgd2FudCB0byByZXdpbmQgaXQuCisKKygyKSAuLi4gaWYgYSB0b3BpYyBicmFuY2ggaGFzIGJlZW4gZnVsbHkgbWVyZ2VkIHRvICJtYXN0ZXIiLgorICAgIFRoZW4geW91IGNhbiBkZWxldGUgaXQuICBNb3JlIGltcG9ydGFudGx5LCB5b3Ugc2hvdWxkIG5vdAorICAgIGJ1aWxkIG9uIHRvcCBvZiBpdCAtLSBvdGhlciBwZW9wbGUgbWF5IGFscmVhZHkgd2FudCB0bworICAgIGNoYW5nZSB0aGluZ3MgcmVsYXRlZCB0byB0aGUgdG9waWMgYXMgcGF0Y2hlcyBhZ2FpbnN0IHlvdXIKKyAgICAibWFzdGVyIiwgc28gaWYgeW91IG5lZWQgZnVydGhlciBjaGFuZ2VzLCBpdCBpcyBiZXR0ZXIgdG8KKyAgICBmb3JrIHRoZSB0b3BpYyAocGVyaGFwcyB3aXRoIHRoZSBzYW1lIG5hbWUpIGFmcmVzaCBmcm9tIHRoZQorICAgIHRpcCBvZiAibWFzdGVyIi4KKworTGV0J3MgbG9vayBhdCB0aGlzIGV4YW1wbGU6CisKKwkJICAgby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tbyAibmV4dCIKKwkJICAvICAgICAgIC8gICAgICAgICAgIC8gICAgICAgICAgIC8KKwkJIC8gICBhLS0tYS0tLWIgQSAgICAgLyAgICAgICAgICAgLworCQkvICAgLyAgICAgICAgICAgICAgIC8gICAgICAgICAgIC8KKwkgICAgICAgLyAgIC8gICBjLS0tYy0tLWMtLS1jIEIgICAgICAgICAvCisJICAgICAgLyAgIC8gICAvICAgICAgICAgICAgIFwgICAgICAgICAvCisJICAgICAvICAgLyAgIC8gICBiLS0tYiBDICAgICBcICAgICAgIC8KKwkgICAgLyAgIC8gICAvICAgLyAgICAgICAgICAgICBcICAgICAvCisgICAgLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8gIm1hc3RlciIKKworCitBLCBCIGFuZCBDIGFyZSB0b3BpYyBicmFuY2hlcy4KKworICogQSBoYXMgb25lIGZpeCBzaW5jZSBpdCB3YXMgbWVyZ2VkIHVwIHRvICJuZXh0Ii4KKworICogQiBoYXMgZmluaXNoZWQuICBJdCBoYXMgYmVlbiBmdWxseSBtZXJnZWQgdXAgdG8gIm1hc3RlciIgYW5kICJuZXh0IiwKKyAgIGFuZCBpcyByZWFkeSB0byBiZSBkZWxldGVkLgorCisgKiBDIGhhcyBub3QgbWVyZ2VkIHRvICJuZXh0IiBhdCBhbGwuCisKK1dlIHdvdWxkIHdhbnQgdG8gYWxsb3cgQyB0byBiZSByZWJhc2VkLCByZWZ1c2UgQSwgYW5kIGVuY291cmFnZQorQiB0byBiZSBkZWxldGVkLgorCitUbyBjb21wdXRlICgxKToKKworCWdpdC1yZXYtbGlzdCBebWFzdGVyIF50b3BpYyBuZXh0CisJZ2l0LXJldi1saXN0IF5tYXN0ZXIgICAgICAgIG5leHQKKworCWlmIHRoZXNlIG1hdGNoLCB0b3BpYyBoYXMgbm90IG1lcmdlZCBpbiBuZXh0IGF0IGFsbC4KKworVG8gY29tcHV0ZSAoMik6CisKKwlnaXQtcmV2LWxpc3QgbWFzdGVyLi50b3BpYworCisJaWYgdGhpcyBpcyBlbXB0eSwgaXQgaXMgZnVsbHkgbWVyZ2VkIHRvICJtYXN0ZXIiLgpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUgYi90ZW1wbGF0ZXMvaG9va3MtLXVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM3OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUKQEAgLTAsMCArMSw3OCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gYmxvY2tzIHVuYW5ub3RhdGVkIHRhZ3MgZnJvbSBlbnRlcmluZy4KKyMgQ2FsbGVkIGJ5IGdpdC1yZWNlaXZlLXBhY2sgd2l0aCBhcmd1bWVudHM6IHJlZm5hbWUgc2hhMS1vbGQgc2hhMS1uZXcKKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZSBieSAiY2htb2QgK3ggdXBkYXRlIi4KKyMKKyMgQ29uZmlnCisjIC0tLS0tLQorIyBob29rcy5hbGxvd3VuYW5ub3RhdGVkCisjICAgVGhpcyBib29sZWFuIHNldHMgd2hldGhlciB1bmFubm90YXRlZCB0YWdzIHdpbGwgYmUgYWxsb3dlZCBpbnRvIHRoZQorIyAgIHJlcG9zaXRvcnkuICBCeSBkZWZhdWx0IHRoZXkgd29uJ3QgYmUuCisjCisKKyMgLS0tIENvbW1hbmQgbGluZQorcmVmbmFtZT0iJDEiCitvbGRyZXY9IiQyIgorbmV3cmV2PSIkMyIKKworIyAtLS0gU2FmZXR5IGNoZWNrCitpZiBbIC16ICIkR0lUX0RJUiIgXTsgdGhlbgorCWVjaG8gIkRvbid0IHJ1biB0aGlzIHNjcmlwdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIiA+JjIKKwllY2hvICIgKGlmIHlvdSB3YW50LCB5b3UgY291bGQgc3VwcGx5IEdJVF9ESVIgdGhlbiBydW4iID4mMgorCWVjaG8gIiAgJDAgPHJlZj4gPG9sZHJldj4gPG5ld3Jldj4pIiA+JjIKKwlleGl0IDEKK2ZpCisKK2lmIFsgLXogIiRyZWZuYW1lIiAtbyAteiAiJG9sZHJldiIgLW8gLXogIiRuZXdyZXYiIF07IHRoZW4KKwllY2hvICJVc2FnZTogJDAgPHJlZj4gPG9sZHJldj4gPG5ld3Jldj4iID4mMgorCWV4aXQgMQorZmkKKworIyAtLS0gQ29uZmlnCithbGxvd3VuYW5ub3RhdGVkPSQoZ2l0LXJlcG8tY29uZmlnIC0tYm9vbCBob29rcy5hbGxvd3VuYW5ub3RhdGVkKQorCisjIGNoZWNrIGZvciBubyBkZXNjcmlwdGlvbgorcHJvamVjdGRlc2M9JChzZWQgLWUgJzFwJyAiJEdJVF9ESVIvZGVzY3JpcHRpb24iKQoraWYgWyAteiAiJHByb2plY3RkZXNjIiAtbyAiJHByb2plY3RkZXNjIiA9ICJVbm5hbWVkIHJlcG9zaXRvcnk7IGVkaXQgdGhpcyBmaWxlIHRvIG5hbWUgaXQgZm9yIGdpdHdlYiIgXTsgdGhlbgorCWVjaG8gIioqKiBQcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUgaGFzbid0IGJlZW4gc2V0IiA+JjIKKwlleGl0IDEKK2ZpCisKKyMgLS0tIENoZWNrIHR5cGVzCisjIGlmICRuZXdyZXYgaXMgMDAwMC4uLjAwMDAsIGl0J3MgYSBjb21taXQgdG8gZGVsZXRlIGEgYnJhbmNoCitpZiBbIC16ICIke25ld3JldiMjMCp9IiBdOyB0aGVuCisJbmV3cmV2X3R5cGU9Y29tbWl0CitlbHNlCisJbmV3cmV2X3R5cGU9JChnaXQtY2F0LWZpbGUgLXQgJG5ld3JldikKK2ZpCisKK2Nhc2UgIiRyZWZuYW1lIiwiJG5ld3Jldl90eXBlIiBpbgorCXJlZnMvdGFncy8qLGNvbW1pdCkKKwkJIyB1bi1hbm5vdGF0ZWQgdGFnCisJCXNob3J0X3JlZm5hbWU9JHtyZWZuYW1lIyNyZWZzL3RhZ3MvfQorCQlpZiBbICIkYWxsb3d1bmFubm90YXRlZCIgIT0gInRydWUiIF07IHRoZW4KKwkJCWVjaG8gIioqKiBUaGUgdW4tYW5ub3RhdGVkIHRhZywgJHNob3J0X3JlZm5hbWUsIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcmVwb3NpdG9yeSIgPiYyCisJCQllY2hvICIqKiogVXNlICdnaXQgdGFnIFsgLWEgfCAtcyBdJyBmb3IgdGFncyB5b3Ugd2FudCB0byBwcm9wYWdhdGUuIiA+JjIKKwkJCWV4aXQgMQorCQlmaQorCQk7OworCXJlZnMvdGFncy8qLHRhZykKKwkJIyBhbm5vdGF0ZWQgdGFnCisJCTs7CisJcmVmcy9oZWFkcy8qLGNvbW1pdCkKKwkJIyBicmFuY2gKKwkJOzsKKwlyZWZzL3JlbW90ZXMvKixjb21taXQpCisJCSMgdHJhY2tpbmcgYnJhbmNoCisJCTs7CisJKikKKwkJIyBBbnl0aGluZyBlbHNlIChpcyB0aGVyZSBhbnl0aGluZyBlbHNlPykKKwkJZWNobyAiKioqIFVwZGF0ZSBob29rOiB1bmtub3duIHR5cGUgb2YgdXBkYXRlIHRvIHJlZiAkcmVmbmFtZSBvZiB0eXBlICRuZXdyZXZfdHlwZSIgPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIC0tLSBGaW5pc2hlZAorZXhpdCAwCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZSBiL3RlbXBsYXRlcy9pbmZvLS1leGNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODdiNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZQpAQCAtMCwwICsxLDYgQEAKKyMgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1mcm9tPS5naXQvaW5mby9leGNsdWRlCisjIExpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIyBGb3IgYSBwcm9qZWN0IG1vc3RseSBpbiBDLCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIGEgZ29vZCBzZXQgb2YKKyMgZXhjbHVkZSBwYXR0ZXJucyAodW5jb21tZW50IHRoZW0gaWYgeW91IHdhbnQgdG8gdXNlIHRoZW0pOgorIyAqLltvYV0KKyMgKn4KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbiBiL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYyNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3RoaXMtLWRlc2NyaXB0aW9uCkBAIC0wLDAgKzEgQEAKK1VubmFtZWQgcmVwb3NpdG9yeTsgZWRpdCB0aGlzIGZpbGUgdG8gbmFtZSBpdCBmb3IgZ2l0d2ViLgpkaWZmIC0tZ2l0IGEvdGVzdC1jaG10aW1lLmMgYi90ZXN0LWNobXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRhNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1jaG10aW1lLmMKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgPHV0aW1lLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX3N0cltdID0gIigrfD18PSt8PS18LSk8c2Vjb25kcz4gPGZpbGU+Li4uIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKwlpbnQgc2V0X2VxOworCWxvbmcgaW50IHNldF90aW1lOworCWNoYXIgKnRlc3Q7CisJY29uc3QgY2hhciAqdGltZXNwZWM7CisKKwlpZiAoYXJnYyA8IDMpCisJCWdvdG8gdXNhZ2U7CisKKwl0aW1lc3BlYyA9IGFyZ3ZbMV07CisJc2V0X2VxID0gKCp0aW1lc3BlYyA9PSAnPScpID8gMSA6IDA7CisJaWYgKHNldF9lcSkgeworCQl0aW1lc3BlYysrOworCQlpZiAoKnRpbWVzcGVjID09ICcrJykgeworCQkJc2V0X2VxID0gMjsgLyogcmVsYXRpdmUgImluIHRoZSBmdXR1cmUiICovCisJCQl0aW1lc3BlYysrOworCQl9CisJfQorCXNldF90aW1lID0gc3RydG9sKHRpbWVzcGVjLCAmdGVzdCwgMTApOworCWlmICgqdGVzdCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIGJhc2UtMTAgaW50ZWdlcjogJXNcbiIsIGFyZ3ZbMV0gKyAxKTsKKwkJZ290byB1c2FnZTsKKwl9CisJaWYgKChzZXRfZXEgJiYgc2V0X3RpbWUgPCAwKSB8fCBzZXRfZXEgPT0gMikgeworCQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKwkJc2V0X3RpbWUgKz0gbm93OworCX0KKworCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc2I7CisJCXN0cnVjdCB1dGltYnVmIHV0YjsKKworCQlpZiAoc3RhdChhcmd2W2ldLCAmc2IpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc3RhdCAlczogJXNcbiIsCisJCQkgICAgICAgIGFyZ3ZbaV0sIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl1dGIuYWN0aW1lID0gc2Iuc3RfYXRpbWU7CisJCXV0Yi5tb2R0aW1lID0gc2V0X2VxID8gc2V0X3RpbWUgOiBzYi5zdF9tdGltZSArIHNldF90aW1lOworCisJCWlmICh1dGltZShhcmd2W2ldLCAmdXRiKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG1vZGlmeSB0aW1lIG9uICVzOiAlc1xuIiwKKwkJCSAgICAgICAgYXJndltpXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworCit1c2FnZToKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyAlc1xuIiwgYXJndlswXSwgdXNhZ2Vfc3RyKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS90ZXN0LWRhdGUuYyBiL3Rlc3QtZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZThmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWRhdGUuYwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyIHJlc3VsdFsxMDBdOworCQl0aW1lX3QgdDsKKworCQltZW1jcHkocmVzdWx0LCAiYmFkIiwgNCk7CisJCXBhcnNlX2RhdGUoYXJndltpXSwgcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisJCXQgPSBzdHJ0b3VsKHJlc3VsdCwgTlVMTCwgMCk7CisJCXByaW50ZigiJXMgLT4gJXMgLT4gJXMiLCBhcmd2W2ldLCByZXN1bHQsIGN0aW1lKCZ0KSk7CisKKwkJdCA9IGFwcHJveGlkYXRlKGFyZ3ZbaV0pOworCQlwcmludGYoIiVzIC0+ICVzXG4iLCBhcmd2W2ldLCBjdGltZSgmdCkpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZGVsdGEuYyBiL3Rlc3QtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg4NWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1kZWx0YS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiB0ZXN0LWRlbHRhLmM6IHRlc3QgY29kZSB0byBleGVyY2lzZSBkaWZmLWRlbHRhLmMgYW5kIHBhdGNoLWRlbHRhLmMKKyAqCisgKiAoQykgMjAwNSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV9zdHJbXSA9CisJInRlc3QtZGVsdGEgKC1kfC1wKSA8ZnJvbV9maWxlPiA8ZGF0YV9maWxlPiA8b3V0X2ZpbGU+IjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqZnJvbV9idWYsICpkYXRhX2J1ZiwgKm91dF9idWY7CisJdW5zaWduZWQgbG9uZyBmcm9tX3NpemUsIGRhdGFfc2l6ZSwgb3V0X3NpemU7CisKKwlpZiAoYXJnYyAhPSA1IHx8IChzdHJjbXAoYXJndlsxXSwgIi1kIikgJiYgc3RyY21wKGFyZ3ZbMV0sICItcCIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlc1xuIiwgdXNhZ2Vfc3RyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZmQgPSBvcGVuKGFyZ3ZbMl0sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwIHx8IGZzdGF0KGZkLCAmc3QpKSB7CisJCXBlcnJvcihhcmd2WzJdKTsKKwkJcmV0dXJuIDE7CisJfQorCWZyb21fc2l6ZSA9IHN0LnN0X3NpemU7CisJZnJvbV9idWYgPSBtbWFwKE5VTEwsIGZyb21fc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChmcm9tX2J1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcihhcmd2WzJdKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJY2xvc2UoZmQpOworCisJZmQgPSBvcGVuKGFyZ3ZbM10sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwIHx8IGZzdGF0KGZkLCAmc3QpKSB7CisJCXBlcnJvcihhcmd2WzNdKTsKKwkJcmV0dXJuIDE7CisJfQorCWRhdGFfc2l6ZSA9IHN0LnN0X3NpemU7CisJZGF0YV9idWYgPSBtbWFwKE5VTEwsIGRhdGFfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChkYXRhX2J1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcihhcmd2WzNdKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJY2xvc2UoZmQpOworCisJaWYgKGFyZ3ZbMV1bMV0gPT0gJ2QnKQorCQlvdXRfYnVmID0gZGlmZl9kZWx0YShmcm9tX2J1ZiwgZnJvbV9zaXplLAorCQkJCSAgICAgZGF0YV9idWYsIGRhdGFfc2l6ZSwKKwkJCQkgICAgICZvdXRfc2l6ZSwgMCk7CisJZWxzZQorCQlvdXRfYnVmID0gcGF0Y2hfZGVsdGEoZnJvbV9idWYsIGZyb21fc2l6ZSwKKwkJCQkgICAgICBkYXRhX2J1ZiwgZGF0YV9zaXplLAorCQkJCSAgICAgICZvdXRfc2l6ZSk7CisJaWYgKCFvdXRfYnVmKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZGVsdGEgb3BlcmF0aW9uIGZhaWxlZCAocmV0dXJuZWQgTlVMTClcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmZCA9IG9wZW4gKGFyZ3ZbNF0sIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJaWYgKGZkIDwgMCB8fCB3cml0ZV9pbl9mdWxsKGZkLCBvdXRfYnVmLCBvdXRfc2l6ZSkgIT0gb3V0X3NpemUpIHsKKwkJcGVycm9yKGFyZ3ZbNF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZ2VucmFuZG9tLmMgYi90ZXN0LWdlbnJhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWZlNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWdlbnJhbmRvbS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBTaW1wbGUgcmFuZG9tIGRhdGEgZ2VuZXJhdG9yIHVzZWQgdG8gY3JlYXRlIHJlcHJvZHVjaWJsZSB0ZXN0IGZpbGVzLgorICogVGhpcyBpcyBpbnNwaXJlZCBmcm9tIFBPU0lYLjEtMjAwMSBpbXBsZW1lbnRhdGlvbiBleGFtcGxlIGZvciByYW5kKCkuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgTmljb2xhcyBQaXRyZSwgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCwgbmV4dCA9IDA7CisJdW5zaWduZWQgY2hhciAqYzsKKworCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworCQlmcHJpbnRmKCBzdGRlcnIsICJVc2FnZTogJXMgPHNlZWRfc3RyaW5nPiBbPHNpemU+XSIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwljID0gKHVuc2lnbmVkIGNoYXIgKikgYXJndlsxXTsKKwlkbyB7CisJCW5leHQgPSBuZXh0ICogMTEgKyAqYzsKKwl9IHdoaWxlICgqYysrKTsKKworCWNvdW50ID0gKGFyZ2MgPT0gMykgPyBzdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDApIDogLTFMOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJbmV4dCA9IG5leHQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7CisJCWlmIChwdXRjaGFyKChuZXh0ID4+IDE2KSAmIDB4ZmYpID09IEVPRikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtbWF0Y2gtdHJlZXMuYyBiL3Rlc3QtbWF0Y2gtdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M0Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1tYXRjaC10cmVlcy5jCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJdW5zaWduZWQgY2hhciBoYXNoMVsyMF0sIGhhc2gyWzIwXSwgc2hpZnRlZFsyMF07CisJc3RydWN0IHRyZWUgKm9uZSwgKnR3bzsKKworCWlmIChnZXRfc2hhMShhdlsxXSwgaGFzaDEpKQorCQlkaWUoImNhbm5vdCBwYXJzZSAlcyBhcyBhbiBvYmplY3QgbmFtZSIsIGF2WzFdKTsKKwlpZiAoZ2V0X3NoYTEoYXZbMl0sIGhhc2gyKSkKKwkJZGllKCJjYW5ub3QgcGFyc2UgJXMgYXMgYW4gb2JqZWN0IG5hbWUiLCBhdlsyXSk7CisJb25lID0gcGFyc2VfdHJlZV9pbmRpcmVjdChoYXNoMSk7CisJaWYgKCFvbmUpCisJCWRpZSgibm90IGEgdHJlZWlzaCAlcyIsIGF2WzFdKTsKKwl0d28gPSBwYXJzZV90cmVlX2luZGlyZWN0KGhhc2gyKTsKKwlpZiAoIXR3bykKKwkJZGllKCJub3QgYSB0cmVlaXNoICVzIiwgYXZbMl0pOworCisJc2hpZnRfdHJlZShvbmUtPm9iamVjdC5zaGExLCB0d28tPm9iamVjdC5zaGExLCBzaGlmdGVkLCAtMSk7CisJcHJpbnRmKCJzaGlmdGVkOiAlc1xuIiwgc2hhMV90b19oZXgoc2hpZnRlZCkpOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qtc2hhMS5jIGIvdGVzdC1zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkN2U5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qtc2hhMS5jCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlTSEFfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGJ1ZnN6ID0gODE5MjsKKwljaGFyICpidWZmZXI7CisKKwlpZiAoYWMgPT0gMikKKwkJYnVmc3ogPSBzdHJ0b3VsKGF2WzFdLCBOVUxMLCAxMCkgKiAxMDI0ICogMTAyNDsKKworCWlmICghYnVmc3opCisJCWJ1ZnN6ID0gODE5MjsKKworCXdoaWxlICgoYnVmZmVyID0gbWFsbG9jKGJ1ZnN6KSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImJ1ZnN6ICV1IGlzIHRvbyBiaWcsIGhhbHZpbmcuLi5cbiIsIGJ1ZnN6KTsKKwkJYnVmc3ogLz0gMjsKKwkJaWYgKGJ1ZnN6IDwgMTAyNCkKKwkJCWRpZSgiT09QUyIpOworCX0KKworCVNIQTFfSW5pdCgmY3R4KTsKKworCXdoaWxlICgxKSB7CisJCXNzaXplX3Qgc3osIHRoaXNfc3o7CisJCWNoYXIgKmNwID0gYnVmZmVyOworCQl1bnNpZ25lZCByb29tID0gYnVmc3o7CisJCXRoaXNfc3ogPSAwOworCQl3aGlsZSAocm9vbSkgeworCQkJc3ogPSB4cmVhZCgwLCBjcCwgcm9vbSk7CisJCQlpZiAoc3ogPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzeiA8IDApCisJCQkJZGllKCJ0ZXN0LXNoYTE6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXRoaXNfc3ogKz0gc3o7CisJCQljcCArPSBzejsKKwkJCXJvb20gLT0gc3o7CisJCX0KKwkJaWYgKHRoaXNfc3ogPT0gMCkKKwkJCWJyZWFrOworCQlTSEExX1VwZGF0ZSgmY3R4LCBidWZmZXIsIHRoaXNfc3opOworCX0KKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCXB1dHMoc2hhMV90b19oZXgoc2hhMSkpOworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0LXNoYTEuc2ggYi90ZXN0LXNoYTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQwODU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qtc2hhMS5zaApAQCAtMCwwICsxLDgzIEBACisjIS9iaW4vc2gKKworZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9MTAwIDI+L2Rldi9udWxsIHwKKy91c3IvYmluL3RpbWUgLi90ZXN0LXNoYTEgPi9kZXYvbnVsbAorCit3aGlsZSByZWFkIGV4cGVjdCBjbnQgcGZ4CitkbworCWNhc2UgIiRleHBlY3QiIGluICcjJyopIGNvbnRpbnVlIDs7IGVzYWMKKwlhY3R1YWw9YAorCQl7CisJCQl0ZXN0IC16ICIkcGZ4IiB8fCBlY2hvICIkcGZ4IgorCQkJZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9JGNudCAyPi9kZXYvbnVsbCB8CisJCQl0ciAnW1wwXScgJ1tnXScKKwkJfSB8IC4vdGVzdC1zaGExICRjbnQKKwlgCisJaWYgdGVzdCAiJGV4cGVjdCIgPSAiJGFjdHVhbCIKKwl0aGVuCisJCWVjaG8gIk9LOiAkZXhwZWN0ICRjbnQgJHBmeCIKKwllbHNlCisJCWVjaG8gPiYyICJPT1BTOiAkY250IgorCQllY2hvID4mMiAiZXhwZWN0OiAkZXhwZWN0IgorCQllY2hvID4mMiAiYWN0dWFsOiAkYWN0dWFsIgorCQlleGl0IDEKKwlmaQorZG9uZSA8PEVPRgorZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSAwCiszZjc4Njg1MGUzODc1NTBmZGFiODM2ZWQ3ZTZkYzg4MWRlMjMwMDFiIDAgYQorNTI3N2NiYjQ1YTE1OTAyMTM3ZDMzMmQ5N2U4OWNmODEzNjU0NTQ4NSAwIGFiCiswM2NmZDc0MzY2MWYwNzk3NWZhMmYxMjIwYzUxOTRjYmFmZjQ4NDUxIDAgYWJjCiszMzMwYjQzNzM2NDBmOWU0NjA0OTkxZTczYzdlODZiZmQ4ZGEyZGMzIDAgYWJjZAorZWMxMTMxMjM4NmFkNTYxNjc0ZjcyNGI4Y2NhN2NmMTc5NmUyNmQxZCAwIGFiY2RlCitiZGMzN2MwNzRlYzRlZTYwNTBkNjhiYzEzM2M2YjkxMmYzNjQ3NGRmIDAgYWJjZGVmCis2OWJjYTk5YjkyMzg1OWYyZGM0ODZiNTViODdmNDk2ODliNzM1OGM3IDAgYWJjZGVmZworZTQxNGFmNzE2MWM5NTU0MDg5ZjQxMDZkNmYxNzk3ZWYxNGE3MzY2NiAwIGFiY2RlZmdoCiswNzA3ZjI5NzAwNDNmOWY3YzIyMDI5NDgyZGIyNzczM2RlYWVjMDI5IDAgYWJjZGVmZ2hpCithNGRkOGFhNzRhNTYzNjcyOGZlNTI0NTE2MzZlMmUxNzcyNjAzM2FhIDEKKzk5ODZiNDVlMmY0ZDcwODYzNzI1MzNiYjY5NTNhODY1MmZhMzY0NGEgMSBmcm90egorMjNkOGQ0Zjc4OGU4NTI2YjQ4Nzc1NDhhMzI1Nzc1NDNjYmFhZjUxZiAxMAorOGNkMjNmODIyYWI0NGM3ZjQ4MWI4YzkyZDU5MWY2ZDFmY2FkNDMxYyAxMCBmcm90egorZjNiNTYwNGE0ZTYwNDg5OWMxMjMzZWRiM2JmMWNjMGVkZTRkOGMzMiA1MTIKK2IwOTViZDgzN2EzNzE1OTMwNDgxMzZlNDI5ZTlhYzRiNDc2ZTFiYjMgNTEyIGZyb3R6CiswOGZhODFkNjE5MDk0OGRlNWNjY2EzOTY2MzQwY2M0OGMxMGNjZWFjIDEyMDAgeHl6enkKK2UzM2EyOTFmNDJjMzBhMTU5NzMzZGQ5OGI4YjNlNGZmMzQxNThjYTAgNDA5MCA0RworI2EzYmY3ODNiYzIwY2FhOTU4ZjZjYjI0ZGQxNDBhN2IyMTk4NDgzOGQgOTk5OSBuaXRmb2wKK0VPRgorCitleGl0CisKKyMgZ2VuZXJhdGluZyB0ZXN0IHZlY3RvcnMKKyMgaW5wdXRzIGFyZSBudW1iZXIgb2YgbWVnYWJ5dGVzIGZvbGxvd2VkIGJ5IHNvbWUgcmFuZG9tIHN0cmluZyB0byBwcmVmaXguCisKK3doaWxlIHJlYWQgY250IHBmeAorZG8KKwlhY3R1YWw9YAorCQl7CisJCQl0ZXN0IC16ICIkcGZ4IiB8fCBlY2hvICIkcGZ4IgorCQkJZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9JGNudCAyPi9kZXYvbnVsbCB8CisJCQl0ciAnW1wwXScgJ1tnXScKKwkJfSB8IHNoYTFzdW0gfAorCQlzZWQgLWUgJ3MvIC4qLy8nCisJYAorCWVjaG8gIiRhY3R1YWwgJGNudCAkcGZ4IgorZG9uZSA8PEVPRgorMAorMCBhCiswIGFiCiswIGFiYworMCBhYmNkCiswIGFiY2RlCiswIGFiY2RlZgorMCBhYmNkZWZnCiswIGFiY2RlZmdoCiswIGFiY2RlZmdoaQorMQorMSBmcm90egorMTAKKzEwIGZyb3R6Cis1MTIKKzUxMiBmcm90egorMTIwMCB4eXp6eQorNDA5MCA0RworOTk5OSBuaXRmb2wKK0VPRgpkaWZmIC0tZ2l0IGEvdHJhY2UuYyBiL3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MWEyNwotLS0gL2Rldi9udWxsCisrKyBiL3RyYWNlLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBNaWNoYWVsIFIuIEVsa2lucyA8bWVAbXV0dC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAdXNlcnMuc2YubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWlrZSBNY0Nvcm1hY2sKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RpYW4gQ291ZGVyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworLyogU3RvbGVuIGZyb20gImltYXAtc2VuZC5jIi4gKi8KK2ludCBuZnZhc3ByaW50ZihjaGFyICoqc3RycCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWludCBsZW47CisJY2hhciB0bXBbMTAyNF07CisKKwlpZiAoKGxlbiA9IHZzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCBmbXQsIGFwKSkgPCAwIHx8CisJICAgICEoKnN0cnAgPSB4bWFsbG9jKGxlbiArIDEpKSkKKwkJZGllKCJGYXRhbDogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKGxlbiA+PSAoaW50KXNpemVvZih0bXApKQorCQl2c3ByaW50Zigqc3RycCwgZm10LCBhcCk7CisJZWxzZQorCQltZW1jcHkoKnN0cnAsIHRtcCwgbGVuICsgMSk7CisJcmV0dXJuIGxlbjsKK30KKworaW50IG5mYXNwcmludGYoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IHJjOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmMgPSBuZnZhc3ByaW50ZihzdHIsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByYzsKK30KKworLyogR2V0IGEgdHJhY2UgZmlsZSBkZXNjcmlwdG9yIGZyb20gR0lUX1RSQUNFIGVudiB2YXJpYWJsZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X3RyYWNlX2ZkKGludCAqbmVlZF9jbG9zZSkKK3sKKwljaGFyICp0cmFjZSA9IGdldGVudigiR0lUX1RSQUNFIik7CisKKwlpZiAoIXRyYWNlIHx8ICFzdHJjbXAodHJhY2UsICIiKSB8fAorCSAgICAhc3RyY21wKHRyYWNlLCAiMCIpIHx8ICFzdHJjYXNlY21wKHRyYWNlLCAiZmFsc2UiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFzdHJjbXAodHJhY2UsICIxIikgfHwgIXN0cmNhc2VjbXAodHJhY2UsICJ0cnVlIikpCisJCXJldHVybiBTVERFUlJfRklMRU5POworCWlmIChzdHJsZW4odHJhY2UpID09IDEgJiYgaXNkaWdpdCgqdHJhY2UpKQorCQlyZXR1cm4gYXRvaSh0cmFjZSk7CisJaWYgKCp0cmFjZSA9PSAnLycpIHsKKwkJaW50IGZkID0gb3Blbih0cmFjZSwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQsIDA2NjYpOworCQlpZiAoZmQgPT0gLTEpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJDb3VsZCBub3Qgb3BlbiAnJXMnIGZvciB0cmFjaW5nOiAlc1xuIgorCQkJCSJEZWZhdWx0aW5nIHRvIHRyYWNpbmcgb24gc3RkZXJyLi4uXG4iLAorCQkJCXRyYWNlLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFNUREVSUl9GSUxFTk87CisJCX0KKwkJKm5lZWRfY2xvc2UgPSAxOworCQlyZXR1cm4gZmQ7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJXaGF0IGRvZXMgJyVzJyBmb3IgR0lUX1RSQUNFIG1lYW5zID9cbiIsIHRyYWNlKTsKKwlmcHJpbnRmKHN0ZGVyciwgIklmIHlvdSB3YW50IHRvIHRyYWNlIGludG8gYSBmaWxlLCAiCisJCSJ0aGVuIHBsZWFzZSBzZXQgR0lUX1RSQUNFIHRvIGFuIGFic29sdXRlIHBhdGhuYW1lICIKKwkJIihzdGFydGluZyB3aXRoIC8pLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJEZWZhdWx0aW5nIHRvIHRyYWNpbmcgb24gc3RkZXJyLi4uXG4iKTsKKworCXJldHVybiBTVERFUlJfRklMRU5POworfQorCitzdGF0aWMgY29uc3QgY2hhciBlcnJfbXNnW10gPSAiQ291bGQgbm90IHRyYWNlIGludG8gZmQgZ2l2ZW4gYnkgIgorCSJHSVRfVFJBQ0UgZW52aXJvbm1lbnQgdmFyaWFibGUiOworCit2b2lkIHRyYWNlX3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwljaGFyICp0cmFjZV9zdHI7CisJdmFfbGlzdCByZXN0OworCWludCBuZWVkX2Nsb3NlID0gMDsKKwlpbnQgZmQgPSBnZXRfdHJhY2VfZmQoJm5lZWRfY2xvc2UpOworCisJaWYgKCFmZCkKKwkJcmV0dXJuOworCisJdmFfc3RhcnQocmVzdCwgZm9ybWF0KTsKKwluZnZhc3ByaW50ZigmdHJhY2Vfc3RyLCBmb3JtYXQsIHJlc3QpOworCXZhX2VuZChyZXN0KTsKKworCXdyaXRlX29yX3doaW5lX3BpcGUoZmQsIHRyYWNlX3N0ciwgc3RybGVuKHRyYWNlX3N0ciksIGVycl9tc2cpOworCisJZnJlZSh0cmFjZV9zdHIpOworCisJaWYgKG5lZWRfY2xvc2UpCisJCWNsb3NlKGZkKTsKK30KKwordm9pZCB0cmFjZV9hcmd2X3ByaW50Zihjb25zdCBjaGFyICoqYXJndiwgaW50IGNvdW50LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwljaGFyICphcmd2X3N0ciwgKmZvcm1hdF9zdHIsICp0cmFjZV9zdHI7CisJc2l6ZV90IGFyZ3ZfbGVuLCBmb3JtYXRfbGVuLCB0cmFjZV9sZW47CisJdmFfbGlzdCByZXN0OworCWludCBuZWVkX2Nsb3NlID0gMDsKKwlpbnQgZmQgPSBnZXRfdHJhY2VfZmQoJm5lZWRfY2xvc2UpOworCisJaWYgKCFmZCkKKwkJcmV0dXJuOworCisJLyogR2V0IHRoZSBhcmd2IHN0cmluZy4gKi8KKwlhcmd2X3N0ciA9IHNxX3F1b3RlX2FyZ3YoYXJndiwgY291bnQpOworCWFyZ3ZfbGVuID0gc3RybGVuKGFyZ3Zfc3RyKTsKKworCS8qIEdldCB0aGUgZm9ybWF0ZWQgc3RyaW5nLiAqLworCXZhX3N0YXJ0KHJlc3QsIGZvcm1hdCk7CisJbmZ2YXNwcmludGYoJmZvcm1hdF9zdHIsIGZvcm1hdCwgcmVzdCk7CisJdmFfZW5kKHJlc3QpOworCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFjZSBzdHJpbmcuICovCisJZm9ybWF0X2xlbiA9IHN0cmxlbihmb3JtYXRfc3RyKTsKKwl0cmFjZV9sZW4gPSBhcmd2X2xlbiArIGZvcm1hdF9sZW4gKyAxOyAvKiArIDEgZm9yIFxuICovCisJdHJhY2Vfc3RyID0geG1hbGxvYyh0cmFjZV9sZW4gKyAxKTsKKworCS8qIENvcHkgZXZlcnl0aGluZyBpbnRvIHRoZSB0cmFjZSBzdHJpbmcuICovCisJc3RybmNweSh0cmFjZV9zdHIsIGZvcm1hdF9zdHIsIGZvcm1hdF9sZW4pOworCXN0cm5jcHkodHJhY2Vfc3RyICsgZm9ybWF0X2xlbiwgYXJndl9zdHIsIGFyZ3ZfbGVuKTsKKwlzdHJjcHkodHJhY2Vfc3RyICsgdHJhY2VfbGVuIC0gMSwgIlxuIik7CisKKwl3cml0ZV9vcl93aGluZV9waXBlKGZkLCB0cmFjZV9zdHIsIHRyYWNlX2xlbiwgZXJyX21zZyk7CisKKwlmcmVlKGFyZ3Zfc3RyKTsKKwlmcmVlKGZvcm1hdF9zdHIpOworCWZyZWUodHJhY2Vfc3RyKTsKKworCWlmIChuZWVkX2Nsb3NlKQorCQljbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90cmVlLWRpZmYuYyBiL3RyZWUtZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjQ5OGUKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLWRpZmYuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRyZWUgZGlmZiBnZW5lcmF0aW9uCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3N0YXRpYyBjaGFyICptYWxsb2NfYmFzZShjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJY2hhciAqbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwYXRoLCBwYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwYXRobGVuLCAiLyIsIDIpOworCXJldHVybiBuZXdiYXNlOworfQorCitzdGF0aWMgdm9pZCBzaG93X2VudHJ5KHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLAorCQkgICAgICAgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pOworCitzdGF0aWMgaW50IGNvbXBhcmVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICp0MSwgc3RydWN0IHRyZWVfZGVzYyAqdDIsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJdW5zaWduZWQgbW9kZTEsIG1vZGUyOworCWNvbnN0IGNoYXIgKnBhdGgxLCAqcGF0aDI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgKnNoYTI7CisJaW50IGNtcCwgcGF0aGxlbjEsIHBhdGhsZW4yOworCisJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCh0MSwgJnBhdGgxLCAmbW9kZTEpOworCXNoYTIgPSB0cmVlX2VudHJ5X2V4dHJhY3QodDIsICZwYXRoMiwgJm1vZGUyKTsKKworCXBhdGhsZW4xID0gdHJlZV9lbnRyeV9sZW4ocGF0aDEsIHNoYTEpOworCXBhdGhsZW4yID0gdHJlZV9lbnRyeV9sZW4ocGF0aDIsIHNoYTIpOworCWNtcCA9IGJhc2VfbmFtZV9jb21wYXJlKHBhdGgxLCBwYXRobGVuMSwgbW9kZTEsIHBhdGgyLCBwYXRobGVuMiwgbW9kZTIpOworCWlmIChjbXAgPCAwKSB7CisJCXNob3dfZW50cnkob3B0LCAiLSIsIHQxLCBiYXNlLCBiYXNlbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY21wID4gMCkgeworCQlzaG93X2VudHJ5KG9wdCwgIisiLCB0MiwgYmFzZSwgYmFzZWxlbik7CisJCXJldHVybiAxOworCX0KKwlpZiAoIW9wdC0+ZmluZF9jb3BpZXNfaGFyZGVyICYmICFoYXNoY21wKHNoYTEsIHNoYTIpICYmIG1vZGUxID09IG1vZGUyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgdGhlIGZpbGVtb2RlIGhhcyBjaGFuZ2VkIHRvL2Zyb20gYSBkaXJlY3RvcnkgZnJvbS90byBhIHJlZ3VsYXIKKwkgKiBmaWxlLCB3ZSBuZWVkIHRvIGNvbnNpZGVyIGl0IGEgcmVtb3ZlIGFuZCBhbiBhZGQuCisJICovCisJaWYgKFNfSVNESVIobW9kZTEpICE9IFNfSVNESVIobW9kZTIpKSB7CisJCXNob3dfZW50cnkob3B0LCAiLSIsIHQxLCBiYXNlLCBiYXNlbGVuKTsKKwkJc2hvd19lbnRyeShvcHQsICIrIiwgdDIsIGJhc2UsIGJhc2VsZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3B0LT5yZWN1cnNpdmUgJiYgU19JU0RJUihtb2RlMSkpIHsKKwkJaW50IHJldHZhbDsKKwkJY2hhciAqbmV3YmFzZSA9IG1hbGxvY19iYXNlKGJhc2UsIGJhc2VsZW4sIHBhdGgxLCBwYXRobGVuMSk7CisJCWlmIChvcHQtPnRyZWVfaW5fcmVjdXJzaXZlKQorCQkJb3B0LT5jaGFuZ2Uob3B0LCBtb2RlMSwgbW9kZTIsCisJCQkJICAgIHNoYTEsIHNoYTIsIGJhc2UsIHBhdGgxKTsKKwkJcmV0dmFsID0gZGlmZl90cmVlX3NoYTEoc2hhMSwgc2hhMiwgbmV3YmFzZSwgb3B0KTsKKwkJZnJlZShuZXdiYXNlKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlvcHQtPmNoYW5nZShvcHQsIG1vZGUxLCBtb2RlMiwgc2hhMSwgc2hhMiwgYmFzZSwgcGF0aDEpOworCXJldHVybiAwOworfQorCisvKgorICogSXMgYSB0cmVlIGVudHJ5IGludGVyZXN0aW5nIGdpdmVuIHRoZSBwYXRoc3BlYyB3ZSBoYXZlPworICoKKyAqIFJldHVybjoKKyAqICAtIDIgZm9yICJ5ZXMsIGFuZCBhbGwgc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgYmUiCisgKiAgLSAxIGZvciB5ZXMKKyAqICAtIHplcm8gZm9yIG5vCisgKiAgLSBuZWdhdGl2ZSBmb3IgIm5vLCBhbmQgbm8gc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgYmUgZWl0aGVyIgorICovCitzdGF0aWMgaW50IHRyZWVfZW50cnlfaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisJdW5zaWduZWQgbW9kZTsKKwlpbnQgaTsKKwlpbnQgcGF0aGxlbjsKKwlpbnQgbmV2ZXJfaW50ZXJlc3RpbmcgPSAtMTsKKworCWlmICghb3B0LT5ucl9wYXRocykKKwkJcmV0dXJuIDE7CisKKwlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KGRlc2MsICZwYXRoLCAmbW9kZSk7CisKKwlwYXRobGVuID0gdHJlZV9lbnRyeV9sZW4ocGF0aCwgc2hhMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0LT5ucl9wYXRoczsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoID0gb3B0LT5wYXRoc1tpXTsKKwkJaW50IG1hdGNobGVuID0gb3B0LT5wYXRobGVuc1tpXTsKKwkJaW50IG0gPSAtMTsgLyogc2lnbmFscyB0aGF0IHdlIGhhdmVuJ3QgY2FsbGVkIHN0cm5jbXAoKSAqLworCisJCWlmIChiYXNlbGVuID49IG1hdGNobGVuKSB7CisJCQkvKiBJZiBpdCBkb2Vzbid0IG1hdGNoLCBtb3ZlIGFsb25nLi4uICovCisJCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogVGhlIGJhc2UgaXMgYSBzdWJkaXJlY3Rvcnkgb2YgYSBwYXRoIHdoaWNoCisJCQkgKiB3YXMgc3BlY2lmaWVkLCBzbyBhbGwgb2YgdGhlbSBhcmUgaW50ZXJlc3RpbmcuCisJCQkgKi8KKwkJCXJldHVybiAyOworCQl9CisKKwkJLyogRG9lcyB0aGUgYmFzZSBtYXRjaD8gKi8KKwkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggKz0gYmFzZWxlbjsKKwkJbWF0Y2hsZW4gLT0gYmFzZWxlbjsKKworCQlpZiAobmV2ZXJfaW50ZXJlc3RpbmcpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIG5vdCBzZWVuIGFueSBtYXRjaCB0aGF0IHNvcnRzIGxhdGVyCisJCQkgKiB0aGFuIHRoZSBjdXJyZW50IHBhdGguCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIERvZXMgbWF0Y2ggc29ydCBzdHJpY3RseSBlYXJsaWVyIHRoYW4gcGF0aAorCQkJICogd2l0aCB0aGVpciBjb21tb24gcGFydHM/CisJCQkgKi8KKwkJCW0gPSBzdHJuY21wKG1hdGNoLCBwYXRoLAorCQkJCSAgICAobWF0Y2hsZW4gPCBwYXRobGVuKSA/IG1hdGNobGVuIDogcGF0aGxlbik7CisJCQlpZiAobSA8IDApCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBjb21lIGhlcmUgZXZlbiBvbmNlLCB0aGF0IG1lYW5zIHRoZXJlIGlzIGF0CisJCQkgKiBsZWFzdCBvbmUgcGF0aHNwZWMgdGhhdCB3b3VsZCBzb3J0IGVxdWFsIHRvIG9yCisJCQkgKiBsYXRlciB0aGFuIHRoZSBwYXRoIHdlIGFyZSBjdXJyZW50bHkgbG9va2luZyBhdC4KKwkJCSAqIEluIG90aGVyIHdvcmRzLCBpZiB3ZSBoYXZlIG5ldmVyIHJlYWNoZWQgdGhpcyBwb2ludAorCQkJICogYWZ0ZXIgaXRlcmF0aW5nIGFsbCBwYXRoc3BlY3MsIGl0IG1lYW5zIGFsbAorCQkJICogcGF0aHNwZWNzIGFyZSBlaXRoZXIgb3V0c2lkZSBvZiBiYXNlLCBvciBpbnNpZGUgdGhlCisJCQkgKiBiYXNlIGJ1dCBzb3J0cyBzdHJpY3RseSBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQKKwkJCSAqIG9uZS4gIEluIGVpdGhlciBjYXNlLCB0aGV5IHdpbGwgbmV2ZXIgbWF0Y2ggdGhlCisJCQkgKiBzdWJzZXF1ZW50IGVudHJpZXMuICBJbiBzdWNoIGEgY2FzZSwgd2UgaW5pdGlhbGl6ZWQKKwkJCSAqIHRoZSB2YXJpYWJsZSB0byAtMSBhbmQgdGhhdCBpcyB3aGF0IHdpbGwgYmUKKwkJCSAqIHJldHVybmVkLCBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIHRlcm1pbmF0ZSBlYXJseS4KKwkJCSAqLworCQkJbmV2ZXJfaW50ZXJlc3RpbmcgPSAwOworCQl9CisKKwkJaWYgKHBhdGhsZW4gPiBtYXRjaGxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaGxlbiA+IHBhdGhsZW4pIHsKKwkJCWlmIChtYXRjaFtwYXRobGVuXSAhPSAnLycpCisJCQkJY29udGludWU7CisJCQlpZiAoIVNfSVNESVIobW9kZSkpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobSA9PSAtMSkKKwkJCS8qCisJCQkgKiB3ZSBjaGVhdGVkIGFuZCBkaWQgbm90IGRvIHN0cm5jbXAoKSwgc28gd2UgZG8KKwkJCSAqIHRoYXQgaGVyZS4KKwkJCSAqLworCQkJbSA9IHN0cm5jbXAobWF0Y2gsIHBhdGgsIHBhdGhsZW4pOworCisJCS8qCisJCSAqIElmIGNvbW1vbiBwYXJ0IG1hdGNoZWQgZWFybGllciB0aGVuIGl0IGlzIGEgaGl0LAorCQkgKiBiZWNhdXNlIHdlIHJlamVjdGVkIHRoZSBjYXNlIHdoZXJlIHBhdGggaXMgbm90IGEKKwkJICogbGVhZGluZyBkaXJlY3RvcnkgYW5kIGlzIHNob3J0ZXIgdGhhbiBtYXRjaC4KKwkJICovCisJCWlmICghbSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gbmV2ZXJfaW50ZXJlc3Rpbmc7IC8qIE5vIG1hdGNoZXMgKi8KK30KKworLyogQSB3aG9sZSBzdWItdHJlZSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIHNob3dfdHJlZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJaW50IGFsbF9pbnRlcmVzdGluZyA9IDA7CisJd2hpbGUgKGRlc2MtPnNpemUpIHsKKwkJaW50IHNob3c7CisKKwkJaWYgKGFsbF9pbnRlcmVzdGluZykKKwkJCXNob3cgPSAxOworCQllbHNlIHsKKwkJCXNob3cgPSB0cmVlX2VudHJ5X2ludGVyZXN0aW5nKGRlc2MsIGJhc2UsIGJhc2VsZW4sCisJCQkJCQkgICAgICBvcHQpOworCQkJaWYgKHNob3cgPT0gMikKKwkJCQlhbGxfaW50ZXJlc3RpbmcgPSAxOworCQl9CisJCWlmIChzaG93IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc2hvdykKKwkJCXNob3dfZW50cnkob3B0LCBwcmVmaXgsIGRlc2MsIGJhc2UsIGJhc2VsZW4pOworCQl1cGRhdGVfdHJlZV9lbnRyeShkZXNjKTsKKwl9Cit9CisKKy8qIEEgZmlsZSBlbnRyeSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIHNob3dfZW50cnkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsCisJCSAgICAgICBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwl1bnNpZ25lZCBtb2RlOworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdChkZXNjLCAmcGF0aCwgJm1vZGUpOworCisJaWYgKG9wdC0+cmVjdXJzaXZlICYmIFNfSVNESVIobW9kZSkpIHsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQlpbnQgcGF0aGxlbiA9IHRyZWVfZW50cnlfbGVuKHBhdGgsIHNoYTEpOworCQljaGFyICpuZXdiYXNlID0gbWFsbG9jX2Jhc2UoYmFzZSwgYmFzZWxlbiwgcGF0aCwgcGF0aGxlbik7CisJCXN0cnVjdCB0cmVlX2Rlc2MgaW5uZXI7CisJCXZvaWQgKnRyZWU7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQl0cmVlID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCF0cmVlIHx8IHR5cGUgIT0gT0JKX1RSRUUpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBzaGEgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwkJaW5pdF90cmVlX2Rlc2MoJmlubmVyLCB0cmVlLCBzaXplKTsKKwkJc2hvd190cmVlKG9wdCwgcHJlZml4LCAmaW5uZXIsIG5ld2Jhc2UsIGJhc2VsZW4gKyAxICsgcGF0aGxlbik7CisKKwkJZnJlZSh0cmVlKTsKKwkJZnJlZShuZXdiYXNlKTsKKwl9IGVsc2UgeworCQlvcHQtPmFkZF9yZW1vdmUob3B0LCBwcmVmaXhbMF0sIG1vZGUsIHNoYTEsIGJhc2UsIHBhdGgpOworCX0KK30KKworc3RhdGljIHZvaWQgc2tpcF91bmludGVyZXN0aW5nKHN0cnVjdCB0cmVlX2Rlc2MgKnQsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJaW50IGFsbF9pbnRlcmVzdGluZyA9IDA7CisJd2hpbGUgKHQtPnNpemUpIHsKKwkJaW50IHNob3c7CisKKwkJaWYgKGFsbF9pbnRlcmVzdGluZykKKwkJCXNob3cgPSAxOworCQllbHNlIHsKKwkJCXNob3cgPSB0cmVlX2VudHJ5X2ludGVyZXN0aW5nKHQsIGJhc2UsIGJhc2VsZW4sIG9wdCk7CisJCQlpZiAoc2hvdyA9PSAyKQorCQkJCWFsbF9pbnRlcmVzdGluZyA9IDE7CisJCX0KKwkJaWYgKCFzaG93KSB7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFNraXAgaXQgYWxsPyAqLworCQlpZiAoc2hvdyA8IDApCisJCQl0LT5zaXplID0gMDsKKwkJcmV0dXJuOworCX0KK30KKworaW50IGRpZmZfdHJlZShzdHJ1Y3QgdHJlZV9kZXNjICp0MSwgc3RydWN0IHRyZWVfZGVzYyAqdDIsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlpbnQgYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKworCWZvciAoOzspIHsKKwkJaWYgKG9wdC0+cXVpZXQgJiYgb3B0LT5oYXNfY2hhbmdlcykKKwkJCWJyZWFrOworCQlpZiAob3B0LT5ucl9wYXRocykgeworCQkJc2tpcF91bmludGVyZXN0aW5nKHQxLCBiYXNlLCBiYXNlbGVuLCBvcHQpOworCQkJc2tpcF91bmludGVyZXN0aW5nKHQyLCBiYXNlLCBiYXNlbGVuLCBvcHQpOworCQl9CisJCWlmICghdDEtPnNpemUpIHsKKwkJCWlmICghdDItPnNpemUpCisJCQkJYnJlYWs7CisJCQlzaG93X2VudHJ5KG9wdCwgIisiLCB0MiwgYmFzZSwgYmFzZWxlbik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0Mik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXQyLT5zaXplKSB7CisJCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSwgYmFzZWxlbik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKGNvbXBhcmVfdHJlZV9lbnRyeSh0MSwgdDIsIGJhc2UsIGJhc2VsZW4sIG9wdCkpIHsKKwkJY2FzZSAtMToKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQkvKiBGYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0Mik7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoImdpdC1kaWZmLXRyZWU6IGludGVybmFsIGVycm9yIik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZGlmZl90cmVlX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqb2xkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwl2b2lkICp0cmVlMSwgKnRyZWUyOworCXN0cnVjdCB0cmVlX2Rlc2MgdDEsIHQyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTEsIHNpemUyOworCWludCByZXR2YWw7CisKKwl0cmVlMSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG9sZCwgdHJlZV90eXBlLCAmc2l6ZTEsIE5VTEwpOworCWlmICghdHJlZTEpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgc291cmNlIHRyZWUgKCVzKSIsIHNoYTFfdG9faGV4KG9sZCkpOworCXRyZWUyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UobmV3LCB0cmVlX3R5cGUsICZzaXplMiwgTlVMTCk7CisJaWYgKCF0cmVlMikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBkZXN0aW5hdGlvbiB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwlpbml0X3RyZWVfZGVzYygmdDEsIHRyZWUxLCBzaXplMSk7CisJaW5pdF90cmVlX2Rlc2MoJnQyLCB0cmVlMiwgc2l6ZTIpOworCXJldHZhbCA9IGRpZmZfdHJlZSgmdDEsICZ0MiwgYmFzZSwgb3B0KTsKKwlmcmVlKHRyZWUxKTsKKwlmcmVlKHRyZWUyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZGlmZl9yb290X3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB0cmVlX2Rlc2MgZW1wdHksIHJlYWw7CisKKwl0cmVlID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UobmV3LCB0cmVlX3R5cGUsICZzaXplLCBOVUxMKTsKKwlpZiAoIXRyZWUpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgcm9vdCB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwlpbml0X3RyZWVfZGVzYygmcmVhbCwgdHJlZSwgc2l6ZSk7CisKKwlpbml0X3RyZWVfZGVzYygmZW1wdHksICIiLCAwKTsKKwlyZXR2YWwgPSBkaWZmX3RyZWUoJmVtcHR5LCAmcmVhbCwgYmFzZSwgb3B0KTsKKwlmcmVlKHRyZWUpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfcGF0aHMoY29uc3QgY2hhciAqKnBhdGhzKQoreworCWludCBpID0gMDsKKwl3aGlsZSAoKnBhdGhzKyspCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKwordm9pZCBkaWZmX3RyZWVfcmVsZWFzZV9wYXRocyhzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJZnJlZShvcHQtPnBhdGhsZW5zKTsKK30KKwordm9pZCBkaWZmX3RyZWVfc2V0dXBfcGF0aHMoY29uc3QgY2hhciAqKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlvcHQtPm5yX3BhdGhzID0gMDsKKwlvcHQtPnBhdGhsZW5zID0gTlVMTDsKKwlvcHQtPnBhdGhzID0gTlVMTDsKKworCWlmIChwKSB7CisJCWludCBpOworCisJCW9wdC0+cGF0aHMgPSBwOworCQlvcHQtPm5yX3BhdGhzID0gY291bnRfcGF0aHMocCk7CisJCWlmIChvcHQtPm5yX3BhdGhzID09IDApIHsKKwkJCW9wdC0+cGF0aGxlbnMgPSBOVUxMOworCQkJcmV0dXJuOworCQl9CisJCW9wdC0+cGF0aGxlbnMgPSB4bWFsbG9jKG9wdC0+bnJfcGF0aHMgKiBzaXplb2YoaW50KSk7CisJCWZvciAoaT0wOyBpIDwgb3B0LT5ucl9wYXRoczsgaSsrKQorCQkJb3B0LT5wYXRobGVuc1tpXSA9IHN0cmxlbihwW2ldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS90cmVlLXdhbGsuYyBiL3RyZWUtd2Fsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjI0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLXdhbGsuYwpAQCAtMCwwICsxLDIwOSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X21vZGUoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJcmV0dXJuIE5VTEw7CisJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsKKwl9CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCXVuc2lnbmVkIGludCBtb2RlLCBsZW47CisKKwlwYXRoID0gZ2V0X21vZGUoYnVmLCAmbW9kZSk7CisJaWYgKCFwYXRoKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisJbGVuID0gc3RybGVuKHBhdGgpICsgMTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZW50cnkgKi8KKwlkZXNjLT5lbnRyeS5wYXRoID0gcGF0aDsKKwlkZXNjLT5lbnRyeS5tb2RlID0gbW9kZTsKKwlkZXNjLT5lbnRyeS5zaGExID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocGF0aCArIGxlbik7Cit9CisKK3ZvaWQgaW5pdF90cmVlX2Rlc2Moc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJZGVzYy0+YnVmZmVyID0gYnVmZmVyOworCWRlc2MtPnNpemUgPSBzaXplOworCWlmIChzaXplKQorCQlkZWNvZGVfdHJlZV9lbnRyeShkZXNjLCBidWZmZXIsIHNpemUpOworfQorCit2b2lkICpmaWxsX3RyZWVfZGVzY3JpcHRvcihzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJdm9pZCAqYnVmID0gTlVMTDsKKworCWlmIChzaGExKSB7CisJCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIHRyZWVfdHlwZSwgJnNpemUsIE5VTEwpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJaW5pdF90cmVlX2Rlc2MoZGVzYywgYnVmLCBzaXplKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGVudHJ5X2NvbXBhcmUoc3RydWN0IG5hbWVfZW50cnkgKmEsIHN0cnVjdCBuYW1lX2VudHJ5ICpiKQoreworCXJldHVybiBiYXNlX25hbWVfY29tcGFyZSgKKwkJCWEtPnBhdGgsIHRyZWVfZW50cnlfbGVuKGEtPnBhdGgsIGEtPnNoYTEpLCBhLT5tb2RlLAorCQkJYi0+cGF0aCwgdHJlZV9lbnRyeV9sZW4oYi0+cGF0aCwgYi0+c2hhMSksIGItPm1vZGUpOworfQorCitzdGF0aWMgdm9pZCBlbnRyeV9jbGVhcihzdHJ1Y3QgbmFtZV9lbnRyeSAqYSkKK3sKKwltZW1zZXQoYSwgMCwgc2l6ZW9mKCphKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJ5X2V4dHJhY3Qoc3RydWN0IHRyZWVfZGVzYyAqdCwgc3RydWN0IG5hbWVfZW50cnkgKmEpCit7CisJKmEgPSB0LT5lbnRyeTsKK30KKwordm9pZCB1cGRhdGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjKQoreworCWNvbnN0IHZvaWQgKmJ1ZiA9IGRlc2MtPmJ1ZmZlcjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBkZXNjLT5lbnRyeS5zaGExICsgMjA7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZGVzYy0+c2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IGVuZCAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopYnVmOworCisJaWYgKHNpemUgPCBsZW4pCisJCWRpZSgiY29ycnVwdCB0cmVlIGZpbGUiKTsKKwlidWYgPSBlbmQ7CisJc2l6ZSAtPSBsZW47CisJZGVzYy0+YnVmZmVyID0gYnVmOworCWRlc2MtPnNpemUgPSBzaXplOworCWlmIChzaXplKQorCQlkZWNvZGVfdHJlZV9lbnRyeShkZXNjLCBidWYsIHNpemUpOworfQorCitpbnQgdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnkpCit7CisJaWYgKCFkZXNjLT5zaXplKQorCQlyZXR1cm4gMDsKKworCSplbnRyeSA9IGRlc2MtPmVudHJ5OworCXVwZGF0ZV90cmVlX2VudHJ5KGRlc2MpOworCXJldHVybiAxOworfQorCit2b2lkIHRyYXZlcnNlX3RyZWVzKGludCBuLCBzdHJ1Y3QgdHJlZV9kZXNjICp0LCBjb25zdCBjaGFyICpiYXNlLCB0cmF2ZXJzZV9jYWxsYmFja190IGNhbGxiYWNrKQoreworCXN0cnVjdCBuYW1lX2VudHJ5ICplbnRyeSA9IHhtYWxsb2MobipzaXplb2YoKmVudHJ5KSk7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9IDA7CisJCWludCBpLCBsYXN0OworCisJCWxhc3QgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJaWYgKCF0W2ldLnNpemUpCisJCQkJY29udGludWU7CisJCQllbnRyeV9leHRyYWN0KHQraSwgZW50cnkraSk7CisJCQlpZiAobGFzdCA+PSAwKSB7CisJCQkJaW50IGNtcCA9IGVudHJ5X2NvbXBhcmUoZW50cnkraSwgZW50cnkrbGFzdCk7CisKKwkJCQkvKgorCQkJCSAqIElzIHRoZSBuZXcgbmFtZSBiaWdnZXIgdGhhbiB0aGUgb2xkIG9uZT8KKwkJCQkgKiBJZ25vcmUgaXQKKwkJCQkgKi8KKwkJCQlpZiAoY21wID4gMCkKKwkJCQkJY29udGludWU7CisJCQkJLyoKKwkJCQkgKiBJcyB0aGUgbmV3IG5hbWUgc21hbGxlciB0aGFuIHRoZSBvbGQgb25lPworCQkJCSAqIElnbm9yZSBhbGwgb2xkIG9uZXMKKwkJCQkgKi8KKwkJCQlpZiAoY21wIDwgMCkKKwkJCQkJbWFzayA9IDA7CisJCQl9CisJCQltYXNrIHw9IDF1bCA8PCBpOworCQkJbGFzdCA9IGk7CisJCX0KKwkJaWYgKCFtYXNrKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB0cmVlIGVudHJpZXMgd2UndmUgd2Fsa2VkLCBhbmQgY2xlYXIKKwkJICogYWxsIHRoZSB1bnVzZWQgbmFtZS1lbnRyaWVzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJaWYgKG1hc2sgJiAoMXVsIDw8IGkpKSB7CisJCQkJdXBkYXRlX3RyZWVfZW50cnkodCtpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVudHJ5X2NsZWFyKGVudHJ5ICsgaSk7CisJCX0KKwkJY2FsbGJhY2sobiwgbWFzaywgZW50cnksIGJhc2UpOworCX0KKwlmcmVlKGVudHJ5KTsKK30KKworc3RhdGljIGludCBmaW5kX3RyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqdCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwl3aGlsZSAodC0+c2l6ZSkgeworCQljb25zdCBjaGFyICplbnRyeTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJaW50IGVudHJ5bGVuLCBjbXA7CisKKwkJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCh0LCAmZW50cnksIG1vZGUpOworCQl1cGRhdGVfdHJlZV9lbnRyeSh0KTsKKwkJZW50cnlsZW4gPSB0cmVlX2VudHJ5X2xlbihlbnRyeSwgc2hhMSk7CisJCWlmIChlbnRyeWxlbiA+IG5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJY21wID0gbWVtY21wKG5hbWUsIGVudHJ5LCBlbnRyeWxlbik7CisJCWlmIChjbXAgPiAwKQorCQkJY29udGludWU7CisJCWlmIChjbXAgPCAwKQorCQkJYnJlYWs7CisJCWlmIChlbnRyeWxlbiA9PSBuYW1lbGVuKSB7CisJCQloYXNoY3B5KHJlc3VsdCwgc2hhMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobmFtZVtlbnRyeWxlbl0gIT0gJy8nKQorCQkJY29udGludWU7CisJCWlmICghU19JU0RJUigqbW9kZSkpCisJCQlicmVhazsKKwkJaWYgKCsrZW50cnlsZW4gPT0gbmFtZWxlbikgeworCQkJaGFzaGNweShyZXN1bHQsIHNoYTEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGdldF90cmVlX2VudHJ5KHNoYTEsIG5hbWUgKyBlbnRyeWxlbiwgcmVzdWx0LCBtb2RlKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgZ2V0X3RyZWVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqdHJlZV9zaGExLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB0cmVlX2Rlc2MgdDsKKwl1bnNpZ25lZCBjaGFyIHJvb3RbMjBdOworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHRyZWVfc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgcm9vdCk7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobmFtZVswXSA9PSAnXDAnKSB7CisJCWhhc2hjcHkoc2hhMSwgcm9vdCk7CisJCXJldHVybiAwOworCX0KKworCWluaXRfdHJlZV9kZXNjKCZ0LCB0cmVlLCBzaXplKTsKKwlyZXR2YWwgPSBmaW5kX3RyZWVfZW50cnkoJnQsIG5hbWUsIHNoYTEsIG1vZGUpOworCWZyZWUodHJlZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvdHJlZS13YWxrLmggYi90cmVlLXdhbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc0N2FiCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS13YWxrLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBUUkVFX1dBTEtfSAorI2RlZmluZSBUUkVFX1dBTEtfSAorCitzdHJ1Y3QgbmFtZV9lbnRyeSB7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwljb25zdCBjaGFyICpwYXRoOworCXVuc2lnbmVkIGludCBtb2RlOworfTsKKworc3RydWN0IHRyZWVfZGVzYyB7CisJY29uc3Qgdm9pZCAqYnVmZmVyOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworc3RhdGljIGlubGluZSBjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX2VudHJ5X2V4dHJhY3Qoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqKnBhdGhwLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCSpwYXRocCA9IGRlc2MtPmVudHJ5LnBhdGg7CisJKm1vZGVwID0gY2Fub25fbW9kZShkZXNjLT5lbnRyeS5tb2RlKTsKKwlyZXR1cm4gZGVzYy0+ZW50cnkuc2hhMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHJlZV9lbnRyeV9sZW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gKGNoYXIgKilzaGExIC0gKGNoYXIgKiluYW1lIC0gMTsKK30KKwordm9pZCB1cGRhdGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICopOwordm9pZCBpbml0X3RyZWVfZGVzYyhzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0aGF0IGRvZXMgYm90aCBvZiB0aGUgYWJvdmUgYW5kIHJldHVybnMgdHJ1ZSBmb3Igc3VjY2VzcyAqLworaW50IHRyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqKTsKKwordm9pZCAqZmlsbF90cmVlX2Rlc2NyaXB0b3Ioc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK3R5cGVkZWYgdm9pZCAoKnRyYXZlcnNlX2NhbGxiYWNrX3QpKGludCBuLCB1bnNpZ25lZCBsb25nIG1hc2ssIHN0cnVjdCBuYW1lX2VudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqYmFzZSk7CisKK3ZvaWQgdHJhdmVyc2VfdHJlZXMoaW50IG4sIHN0cnVjdCB0cmVlX2Rlc2MgKnQsIGNvbnN0IGNoYXIgKmJhc2UsIHRyYXZlcnNlX2NhbGxiYWNrX3QgY2FsbGJhY2spOworCitpbnQgZ2V0X3RyZWVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdHJlZS5jIGIvdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLmMKQEAgLTAsMCArMSwyMzggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKK2NvbnN0IGNoYXIgKnRyZWVfdHlwZSA9ICJ0cmVlIjsKKworc3RhdGljIGludCByZWFkX29uZV9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aG5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIFJFQURfVFJFRV9SRUNVUlNJVkU7CisKKwlsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGJhc2VsZW4gKyBsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUobW9kZSk7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGJhc2VsZW4gKyBsZW4sIHN0YWdlKTsKKwltZW1jcHkoY2UtPm5hbWUsIGJhc2UsIGJhc2VsZW4pOworCW1lbWNweShjZS0+bmFtZSArIGJhc2VsZW4sIHBhdGhuYW1lLCBsZW4rMSk7CisJaGFzaGNweShjZS0+c2hhMSwgc2hhMSk7CisJcmV0dXJuIGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfU0tJUF9ERkNIRUNLKTsKK30KKworc3RhdGljIGludCBtYXRjaF90cmVlX2VudHJ5KGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgY2hhciAqKnBhdGhzKQoreworCWNvbnN0IGNoYXIgKm1hdGNoOworCWludCBwYXRobGVuOworCisJaWYgKCFwYXRocykKKwkJcmV0dXJuIDE7CisJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKworCQlpZiAoYmFzZWxlbiA+PSBtYXRjaGxlbikgeworCQkJLyogSWYgaXQgZG9lc24ndCBtYXRjaCwgbW92ZSBhbG9uZy4uLiAqLworCQkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIFRoZSBiYXNlIGlzIGEgc3ViZGlyZWN0b3J5IG9mIGEgcGF0aCB3aGljaCB3YXMgc3BlY2lmaWVkLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBEb2VzIHRoZSBiYXNlIG1hdGNoPyAqLworCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgYmFzZWxlbikpCisJCQljb250aW51ZTsKKworCQltYXRjaCArPSBiYXNlbGVuOworCQltYXRjaGxlbiAtPSBiYXNlbGVuOworCisJCWlmIChwYXRobGVuID4gbWF0Y2hsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hsZW4gPiBwYXRobGVuKSB7CisJCQlpZiAobWF0Y2hbcGF0aGxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFTX0lTRElSKG1vZGUpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cm5jbXAocGF0aCwgbWF0Y2gsIHBhdGhsZW4pKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF90cmVlX3JlY3Vyc2l2ZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkJaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gsCisJCQlyZWFkX3RyZWVfZm5fdCBmbikKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSkKKwkJcmV0dXJuIC0xOworCisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoIW1hdGNoX3RyZWVfZW50cnkoYmFzZSwgYmFzZWxlbiwgZW50cnkucGF0aCwgZW50cnkubW9kZSwgbWF0Y2gpKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChmbihlbnRyeS5zaGExLCBiYXNlLCBiYXNlbGVuLCBlbnRyeS5wYXRoLCBlbnRyeS5tb2RlLCBzdGFnZSkpIHsKKwkJY2FzZSAwOgorCQkJY29udGludWU7CisJCWNhc2UgUkVBRF9UUkVFX1JFQ1VSU0lWRToKKwkJCWJyZWFrOzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJaW50IHJldHZhbDsKKwkJCWNoYXIgKm5ld2Jhc2U7CisJCQl1bnNpZ25lZCBpbnQgcGF0aGxlbiA9IHRyZWVfZW50cnlfbGVuKGVudHJ5LnBhdGgsIGVudHJ5LnNoYTEpOworCisJCQluZXdiYXNlID0geG1hbGxvYyhiYXNlbGVuICsgMSArIHBhdGhsZW4pOworCQkJbWVtY3B5KG5ld2Jhc2UsIGJhc2UsIGJhc2VsZW4pOworCQkJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBlbnRyeS5wYXRoLCBwYXRobGVuKTsKKwkJCW5ld2Jhc2VbYmFzZWxlbiArIHBhdGhsZW5dID0gJy8nOworCQkJcmV0dmFsID0gcmVhZF90cmVlX3JlY3Vyc2l2ZShsb29rdXBfdHJlZShlbnRyeS5zaGExKSwKKwkJCQkJCSAgICAgbmV3YmFzZSwKKwkJCQkJCSAgICAgYmFzZWxlbiArIHBhdGhsZW4gKyAxLAorCQkJCQkJICAgICBzdGFnZSwgbWF0Y2gsIGZuKTsKKwkJCWZyZWUobmV3YmFzZSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF90cmVlKHN0cnVjdCB0cmVlICp0cmVlLCBpbnQgc3RhZ2UsIGNvbnN0IGNoYXIgKiptYXRjaCkKK3sKKwlyZXR1cm4gcmVhZF90cmVlX3JlY3Vyc2l2ZSh0cmVlLCAiIiwgMCwgc3RhZ2UsIG1hdGNoLCByZWFkX29uZV9lbnRyeSk7Cit9CisKK3N0cnVjdCB0cmVlICpsb29rdXBfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybiBjcmVhdGVfb2JqZWN0KHNoYTEsIE9CSl9UUkVFLCBhbGxvY190cmVlX25vZGUoKSk7CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9UUkVFOworCWlmIChvYmotPnR5cGUgIT0gT0JKX1RSRUUpIHsKKwkJZXJyb3IoIk9iamVjdCAlcyBpcyBhICVzLCBub3QgYSB0cmVlIiwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSksIHR5cGVuYW1lKG9iai0+dHlwZSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgdHJlZSAqKSBvYmo7Cit9CisKKy8qCisgKiBOT1RFISBUcmVlIHJlZnMgdG8gZXh0ZXJuYWwgZ2l0IHJlcG9zaXRvcmllcworICogKGllIGdpdGxpbmtzKSBkbyBub3QgY291bnQgYXMgcmVhbCByZWZlcmVuY2VzLgorICoKKyAqIFlvdSBkb24ndCBoYXZlIHRvIGhhdmUgdGhvc2UgcmVwb3NpdG9yaWVzCisgKiBhdmFpbGFibGUgYXQgYWxsLCBtdWNoIGxlc3MgaGF2ZSB0aGUgb2JqZWN0cworICogYWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuCisgKi8KK3N0YXRpYyB2b2lkIHRyYWNrX3RyZWVfcmVmcyhzdHJ1Y3QgdHJlZSAqaXRlbSkKK3sKKwlpbnQgbl9yZWZzID0gMCwgaTsKKwlzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnM7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCisJLyogQ291bnQgaG93IG1hbnkgZW50cmllcyB0aGVyZSBhcmUuLiAqLworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCBpdGVtLT5idWZmZXIsIGl0ZW0tPnNpemUpOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSTE5LKGVudHJ5Lm1vZGUpKQorCQkJY29udGludWU7CisJCW5fcmVmcysrOworCX0KKworCS8qIEFsbG9jYXRlIG9iamVjdCByZWZzIGFuZCB3YWxrIGl0IGFnYWluLi4gKi8KKwlpID0gMDsKKwlyZWZzID0gYWxsb2Nfb2JqZWN0X3JlZnMobl9yZWZzKTsKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgaXRlbS0+YnVmZmVyLCBpdGVtLT5zaXplKTsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwkJaWYgKFNfSVNESVJMTksoZW50cnkubW9kZSkpCisJCQljb250aW51ZTsKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQlvYmogPSAmbG9va3VwX3RyZWUoZW50cnkuc2hhMSktPm9iamVjdDsKKwkJZWxzZSBpZiAoU19JU1JFRyhlbnRyeS5tb2RlKSB8fCBTX0lTTE5LKGVudHJ5Lm1vZGUpKQorCQkJb2JqID0gJmxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpLT5vYmplY3Q7CisJCWVsc2UgeworCQkJd2FybmluZygiaW4gdHJlZSAlczogZW50cnkgJXMgaGFzIGJhZCBtb2RlICUuNm9cbiIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSwgZW50cnkucGF0aCwgZW50cnkubW9kZSk7CisJCQlvYmogPSBsb29rdXBfdW5rbm93bl9vYmplY3QoZW50cnkuc2hhMSk7CisJCX0KKwkJcmVmcy0+cmVmW2krK10gPSBvYmo7CisJfQorCXNldF9vYmplY3RfcmVmcygmaXRlbS0+b2JqZWN0LCByZWZzKTsKK30KKworaW50IHBhcnNlX3RyZWVfYnVmZmVyKHN0cnVjdCB0cmVlICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJaXRlbS0+b2JqZWN0LnBhcnNlZCA9IDE7CisJaXRlbS0+YnVmZmVyID0gYnVmZmVyOworCWl0ZW0tPnNpemUgPSBzaXplOworCisJaWYgKHRyYWNrX29iamVjdF9yZWZzKQorCQl0cmFja190cmVlX3JlZnMoaXRlbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZV90cmVlKHN0cnVjdCB0cmVlICppdGVtKQoreworCSBlbnVtIG9iamVjdF90eXBlIHR5cGU7CisJIHZvaWQgKmJ1ZmZlcjsKKwkgdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGl0ZW0tPm9iamVjdC5zaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCByZWFkICVzIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpZiAodHlwZSAhPSBPQkpfVFJFRSkgeworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiBlcnJvcigiT2JqZWN0ICVzIG5vdCBhIHRyZWUiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCX0KKwlyZXR1cm4gcGFyc2VfdHJlZV9idWZmZXIoaXRlbSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RydWN0IHRyZWUgKnBhcnNlX3RyZWVfaW5kaXJlY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJZG8geworCQlpZiAoIW9iaikKKwkJCXJldHVybiBOVUxMOworCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKQorCQkJcmV0dXJuIChzdHJ1Y3QgdHJlZSAqKSBvYmo7CisJCWVsc2UgaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQkJb2JqID0gJigoKHN0cnVjdCBjb21taXQgKikgb2JqKS0+dHJlZS0+b2JqZWN0KTsKKwkJZWxzZSBpZiAob2JqLT50eXBlID09IE9CSl9UQUcpCisJCQlvYmogPSAoKHN0cnVjdCB0YWcgKikgb2JqKS0+dGFnZ2VkOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCFvYmotPnBhcnNlZCkKKwkJCXBhcnNlX29iamVjdChvYmotPnNoYTEpOworCX0gd2hpbGUgKDEpOworfQpkaWZmIC0tZ2l0IGEvdHJlZS5oIGIvdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjVjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBUUkVFX0gKKyNkZWZpbmUgVFJFRV9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRyZWVfdHlwZTsKKworc3RydWN0IHRyZWUgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCitzdHJ1Y3QgdHJlZSAqbG9va3VwX3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK2ludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgcGFyc2VfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSk7CisKKy8qIFBhcnNlcyBhbmQgcmV0dXJucyB0aGUgdHJlZSBpbiB0aGUgZ2l2ZW4gZW50LCBjaGFzaW5nIHRhZ3MgYW5kIGNvbW1pdHMuICovCitzdHJ1Y3QgdHJlZSAqcGFyc2VfdHJlZV9pbmRpcmVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworI2RlZmluZSBSRUFEX1RSRUVfUkVDVVJTSVZFIDEKK3R5cGVkZWYgaW50ICgqcmVhZF90cmVlX2ZuX3QpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworCitleHRlcm4gaW50IHJlYWRfdHJlZV9yZWN1cnNpdmUoc3RydWN0IHRyZWUgKnRyZWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sCisJCQkgICAgICAgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gsCisJCQkgICAgICAgcmVhZF90cmVlX2ZuX3QgZm4pOworCitleHRlcm4gaW50IHJlYWRfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqcGF0aHMpOworCisjZW5kaWYgLyogVFJFRV9IICovCmRpZmYgLS1naXQgYS91bnBhY2stZmlsZS5jIGIvdW5wYWNrLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM1NmIzCi0tLSAvZGV2L251bGwKKysrIGIvdW5wYWNrLWZpbGUuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyBjaGFyICpjcmVhdGVfdGVtcF9maWxlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNoYXIgcGF0aFs1MF07CisJdm9pZCAqYnVmOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IGZkOworCisJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZiB8fCB0eXBlICE9IE9CSl9CTE9CKQorCQlkaWUoInVuYWJsZSB0byByZWFkIGJsb2Igb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAocGF0aCk7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXAtZmlsZSIpOworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRlbXAtZmlsZSIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gcGF0aDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoYXJnYyAhPSAyKQorCQl1c2FnZSgiZ2l0LXVucGFjay1maWxlIDxzaGExPiIpOworCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZ3ZbMV0pOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXB1dHMoY3JlYXRlX3RlbXBfZmlsZShzaGExKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bnBhY2stdHJlZXMuYyBiL3VucGFjay10cmVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzI0MTEKLS0tIC9kZXYvbnVsbAorKysgYi91bnBhY2stdHJlZXMuYwpAQCAtMCwwICsxLDg5MSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJ1bnBhY2stdHJlZXMuaCIKKyNpbmNsdWRlICJwcm9ncmVzcy5oIgorCisjZGVmaW5lIERCUlRfREVCVUcgMQorCitzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0IHsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpuZXh0OworCXVuc2lnbmVkIGRpcmVjdG9yeSA6IDE7CisJdW5zaWduZWQgZXhlY3V0YWJsZSA6IDE7CisJdW5zaWduZWQgc3ltbGluayA6IDE7CisJdW5zaWduZWQgaW50IG1vZGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworfTsKKworc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmNyZWF0ZV90cmVlX2VudHJ5X2xpc3Qoc3RydWN0IHRyZWUgKnRyZWUpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IG9uZTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpyZXQgPSBOVUxMOworCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKipsaXN0X3AgPSAmcmV0OworCisJaWYgKCF0cmVlLT5vYmplY3QucGFyc2VkKQorCQlwYXJzZV90cmVlKHRyZWUpOworCisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJm9uZSkpIHsKKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZW50cnk7CisKKwkJZW50cnkgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0KSk7CisJCWVudHJ5LT5uYW1lID0gb25lLnBhdGg7CisJCWVudHJ5LT5zaGExID0gb25lLnNoYTE7CisJCWVudHJ5LT5tb2RlID0gb25lLm1vZGU7CisJCWVudHJ5LT5kaXJlY3RvcnkgPSBTX0lTRElSKG9uZS5tb2RlKSAhPSAwOworCQllbnRyeS0+ZXhlY3V0YWJsZSA9IChvbmUubW9kZSAmIFNfSVhVU1IpICE9IDA7CisJCWVudHJ5LT5zeW1saW5rID0gU19JU0xOSyhvbmUubW9kZSkgIT0gMDsKKwkJZW50cnktPm5leHQgPSBOVUxMOworCisJCSpsaXN0X3AgPSBlbnRyeTsKKwkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVudGNtcChjb25zdCBjaGFyICpuYW1lMSwgaW50IGRpcjEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgZGlyMikKK3sKKwlpbnQgbGVuMSA9IHN0cmxlbihuYW1lMSk7CisJaW50IGxlbjIgPSBzdHJsZW4obmFtZTIpOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCByZXQgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJYzEgPSBuYW1lMVtsZW5dOworCWMyID0gbmFtZTJbbGVuXTsKKwlpZiAoIWMxICYmIGRpcjEpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgZGlyMikKKwkJYzIgPSAnLyc7CisJcmV0ID0gKGMxIDwgYzIpID8gLTEgOiAoYzEgPiBjMikgPyAxIDogMDsKKwlpZiAoYzEgJiYgYzIgJiYgIXJldCkKKwkJcmV0ID0gbGVuMSAtIGxlbjI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bnBhY2tfdHJlZXNfcmVjKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKipwb3NucywgaW50IGxlbiwKKwkJCSAgICBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8sCisJCQkgICAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZGZfY29uZmxpY3RfbGlzdCkKK3sKKwlpbnQgYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlpbnQgc3JjX3NpemUgPSBsZW4gKyAxOworCWludCBpX3N0ayA9IGlfc3RrOworCWludCByZXR2YWwgPSAwOworCisJaWYgKG8tPmRpcikKKwkJaV9zdGsgPSBwdXNoX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShvLT5kaXIsIGJhc2UsIHN0cmxlbihiYXNlKSk7CisKKwlkbyB7CisJCWludCBpOworCQljb25zdCBjaGFyICpmaXJzdDsKKwkJaW50IGZpcnN0ZGlyID0gMDsKKwkJaW50IHBhdGhsZW47CisJCXVuc2lnbmVkIGNlX3NpemU7CisJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKipzdWJwb3NuczsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjOworCQlpbnQgYW55X2ZpbGVzID0gMDsKKwkJaW50IGFueV9kaXJzID0gMDsKKwkJY2hhciAqY2FjaGVfbmFtZTsKKwkJaW50IGNlX3N0YWdlOworCisJCS8qIEZpbmQgdGhlIGZpcnN0IG5hbWUgaW4gdGhlIGlucHV0LiAqLworCisJCWZpcnN0ID0gTlVMTDsKKwkJY2FjaGVfbmFtZSA9IE5VTEw7CisKKwkJLyogQ2hlY2sgdGhlIGNhY2hlICovCisJCWlmIChvLT5tZXJnZSAmJiBvLT5wb3MgPCBhY3RpdmVfbnIpIHsKKwkJCS8qIFRoaXMgaXMgYSBiaXQgdHJpY2t5OiAqLworCQkJLyogSWYgdGhlIGluZGV4IGhhcyBhIHN1YmRpcmVjdG9yeSAod2l0aAorCQkJICogY29udGVudHMpIGFzIHRoZSBmaXJzdCBuYW1lLCBpdCdsbCBnZXQgYQorCQkJICogZmlsZW5hbWUgbGlrZSAiZm9vL2JhciIuIEJ1dCB0aGF0J3MgYWZ0ZXIKKwkJCSAqICJmb28iLCBzbyB0aGUgZW50cnkgaW4gdHJlZXMgd2lsbCBnZXQKKwkJCSAqIGhhbmRsZWQgZmlyc3QsIGF0IHdoaWNoIHBvaW50IHdlJ2xsIGdvIGludG8KKwkJCSAqICJmb28iLCBhbmQgZGVhbCB3aXRoICJiYXIiIGZyb20gdGhlIGluZGV4LAorCQkJICogYmVjYXVzZSB0aGUgYmFzZSB3aWxsIGJlICJmb28vIi4gVGhlIG9ubHkKKwkJCSAqIHdheSB3ZSBjYW4gYWN0dWFsbHkgaGF2ZSAiZm9vL2JhciIgZmlyc3Qgb2YKKwkJCSAqIGFsbCB0aGUgdGhpbmdzIGlzIGlmIHRoZSB0cmVlcyBkb24ndAorCQkJICogY29udGFpbiAiZm9vIiBhdCBhbGwsIGluIHdoaWNoIGNhc2Ugd2UnbGwKKwkJCSAqIGhhbmRsZSAiZm9vL2JhciIgd2l0aG91dCBnb2luZyBpbnRvIHRoZQorCQkJICogZGlyZWN0b3J5LCBidXQgdGhhdCdzIGZpbmUgKGFuZCB3aWxsIHJldHVybgorCQkJICogYW4gZXJyb3IgYW55d2F5LCB3aXRoIHRoZSBhZGRlZCB1bmtub3duCisJCQkgKiBmaWxlIGNhc2UuCisJCQkgKi8KKworCQkJY2FjaGVfbmFtZSA9IGFjdGl2ZV9jYWNoZVtvLT5wb3NdLT5uYW1lOworCQkJaWYgKHN0cmxlbihjYWNoZV9uYW1lKSA+IGJhc2VsZW4gJiYKKwkJCSAgICAhbWVtY21wKGNhY2hlX25hbWUsIGJhc2UsIGJhc2VsZW4pKSB7CisJCQkJY2FjaGVfbmFtZSArPSBiYXNlbGVuOworCQkJCWZpcnN0ID0gY2FjaGVfbmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJY2FjaGVfbmFtZSA9IE5VTEw7CisJCQl9CisJCX0KKworI2lmIERCUlRfREVCVUcgPiAxCisJCWlmIChmaXJzdCkKKwkJCXByaW50ZigiaW5kZXggJXNcbiIsIGZpcnN0KTsKKyNlbmRpZgorCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWlmICghcG9zbnNbaV0gfHwgcG9zbnNbaV0gPT0gZGZfY29uZmxpY3RfbGlzdCkKKwkJCQljb250aW51ZTsKKyNpZiBEQlJUX0RFQlVHID4gMQorCQkJcHJpbnRmKCIlZCAlc1xuIiwgaSArIDEsIHBvc25zW2ldLT5uYW1lKTsKKyNlbmRpZgorCQkJaWYgKCFmaXJzdCB8fCBlbnRjbXAoZmlyc3QsIGZpcnN0ZGlyLAorCQkJCQkgICAgIHBvc25zW2ldLT5uYW1lLAorCQkJCQkgICAgIHBvc25zW2ldLT5kaXJlY3RvcnkpID4gMCkgeworCQkJCWZpcnN0ID0gcG9zbnNbaV0tPm5hbWU7CisJCQkJZmlyc3RkaXIgPSBwb3Nuc1tpXS0+ZGlyZWN0b3J5OworCQkJfQorCQl9CisJCS8qIE5vIG5hbWUgbWVhbnMgd2UncmUgZG9uZSAqLworCQlpZiAoIWZpcnN0KQorCQkJZ290byBsZWF2ZV9kaXJlY3Rvcnk7CisKKwkJcGF0aGxlbiA9IHN0cmxlbihmaXJzdCk7CisJCWNlX3NpemUgPSBjYWNoZV9lbnRyeV9zaXplKGJhc2VsZW4gKyBwYXRobGVuKTsKKworCQlzcmMgPSB4Y2FsbG9jKHNyY19zaXplLCBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKworCQlzdWJwb3NucyA9IHhjYWxsb2MobGVuLCBzaXplb2Yoc3RydWN0IHRyZWVfbGlzdF9lbnRyeSAqKSk7CisKKwkJaWYgKGNhY2hlX25hbWUgJiYgIXN0cmNtcChjYWNoZV9uYW1lLCBmaXJzdCkpIHsKKwkJCWFueV9maWxlcyA9IDE7CisJCQlzcmNbMF0gPSBhY3RpdmVfY2FjaGVbby0+cG9zXTsKKwkJCXJlbW92ZV9jYWNoZV9lbnRyeV9hdChvLT5wb3MpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJCQlpZiAoIXBvc25zW2ldIHx8CisJCQkgICAgKHBvc25zW2ldICE9IGRmX2NvbmZsaWN0X2xpc3QgJiYKKwkJCSAgICAgc3RyY21wKGZpcnN0LCBwb3Nuc1tpXS0+bmFtZSkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwb3Nuc1tpXSA9PSBkZl9jb25mbGljdF9saXN0KSB7CisJCQkJc3JjW2kgKyBvLT5tZXJnZV0gPSBvLT5kZl9jb25mbGljdF9lbnRyeTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHBvc25zW2ldLT5kaXJlY3RvcnkpIHsKKwkJCQlzdHJ1Y3QgdHJlZSAqdHJlZSA9IGxvb2t1cF90cmVlKHBvc25zW2ldLT5zaGExKTsKKwkJCQlhbnlfZGlycyA9IDE7CisJCQkJcGFyc2VfdHJlZSh0cmVlKTsKKwkJCQlzdWJwb3Nuc1tpXSA9IGNyZWF0ZV90cmVlX2VudHJ5X2xpc3QodHJlZSk7CisJCQkJcG9zbnNbaV0gPSBwb3Nuc1tpXS0+bmV4dDsKKwkJCQlzcmNbaSArIG8tPm1lcmdlXSA9IG8tPmRmX2NvbmZsaWN0X2VudHJ5OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIW8tPm1lcmdlKQorCQkJCWNlX3N0YWdlID0gMDsKKwkJCWVsc2UgaWYgKGkgKyAxIDwgby0+aGVhZF9pZHgpCisJCQkJY2Vfc3RhZ2UgPSAxOworCQkJZWxzZSBpZiAoaSArIDEgPiBvLT5oZWFkX2lkeCkKKwkJCQljZV9zdGFnZSA9IDM7CisJCQllbHNlCisJCQkJY2Vfc3RhZ2UgPSAyOworCisJCQljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJCQljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHBvc25zW2ldLT5tb2RlKTsKKwkJCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhiYXNlbGVuICsgcGF0aGxlbiwKKwkJCQkJCSAgICAgICBjZV9zdGFnZSk7CisJCQltZW1jcHkoY2UtPm5hbWUsIGJhc2UsIGJhc2VsZW4pOworCQkJbWVtY3B5KGNlLT5uYW1lICsgYmFzZWxlbiwgZmlyc3QsIHBhdGhsZW4gKyAxKTsKKworCQkJYW55X2ZpbGVzID0gMTsKKworCQkJaGFzaGNweShjZS0+c2hhMSwgcG9zbnNbaV0tPnNoYTEpOworCQkJc3JjW2kgKyBvLT5tZXJnZV0gPSBjZTsKKwkJCXN1YnBvc25zW2ldID0gZGZfY29uZmxpY3RfbGlzdDsKKwkJCXBvc25zW2ldID0gcG9zbnNbaV0tPm5leHQ7CisJCX0KKwkJaWYgKGFueV9maWxlcykgeworCQkJaWYgKG8tPm1lcmdlKSB7CisJCQkJaW50IHJldDsKKworI2lmIERCUlRfREVCVUcgPiAxCisJCQkJcHJpbnRmKCIlczpcbiIsIGZpcnN0KTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworCQkJCQlwcmludGYoIiAlZCAiLCBpKTsKKwkJCQkJaWYgKHNyY1tpXSkKKwkJCQkJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHNyY1tpXS0+c2hhMSkpOworCQkJCQllbHNlCisJCQkJCQlwcmludGYoIlxuIik7CisJCQkJfQorI2VuZGlmCisJCQkJcmV0ID0gby0+Zm4oc3JjLCBvKTsKKworI2lmIERCUlRfREVCVUcgPiAxCisJCQkJcHJpbnRmKCJBZGRlZCAlZCBlbnRyaWVzXG4iLCByZXQpOworI2VuZGlmCisJCQkJby0+cG9zICs9IHJldDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKwkJCQkJaWYgKHNyY1tpXSkgeworCQkJCQkJYWRkX2NhY2hlX2VudHJ5KHNyY1tpXSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfU0tJUF9ERkNIRUNLKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYW55X2RpcnMpIHsKKwkJCWNoYXIgKm5ld2Jhc2UgPSB4bWFsbG9jKGJhc2VsZW4gKyAyICsgcGF0aGxlbik7CisJCQltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJCQltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4sIGZpcnN0LCBwYXRobGVuKTsKKwkJCW5ld2Jhc2VbYmFzZWxlbiArIHBhdGhsZW5dID0gJy8nOworCQkJbmV3YmFzZVtiYXNlbGVuICsgcGF0aGxlbiArIDFdID0gJ1wwJzsKKwkJCWlmICh1bnBhY2tfdHJlZXNfcmVjKHN1YnBvc25zLCBsZW4sIG5ld2Jhc2UsIG8sCisJCQkJCSAgICAgZGZfY29uZmxpY3RfbGlzdCkpIHsKKwkJCQlyZXR2YWwgPSAtMTsKKwkJCQlnb3RvIGxlYXZlX2RpcmVjdG9yeTsKKwkJCX0KKwkJCWZyZWUobmV3YmFzZSk7CisJCX0KKwkJZnJlZShzdWJwb3Nucyk7CisJCWZyZWUoc3JjKTsKKwl9IHdoaWxlICgxKTsKKworIGxlYXZlX2RpcmVjdG9yeToKKwlpZiAoby0+ZGlyKQorCQlwb3BfZXhjbHVkZV9wZXJfZGlyZWN0b3J5KG8tPmRpciwgaV9zdGspOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFVubGluayB0aGUgbGFzdCBjb21wb25lbnQgYW5kIGF0dGVtcHQgdG8gcmVtb3ZlIGxlYWRpbmcKKyAqIGRpcmVjdG9yaWVzLCBpbiBjYXNlIHRoaXMgdW5saW5rIGlzIHRoZSByZW1vdmFsIG9mIHRoZQorICogbGFzdCBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5IC0tIGVtcHR5IGRpcmVjdG9yaWVzIGFyZSByZW1vdmVkLgorICovCitzdGF0aWMgdm9pZCB1bmxpbmtfZW50cnkoY2hhciAqbmFtZSwgY2hhciAqbGFzdF9zeW1saW5rKQoreworCWNoYXIgKmNwLCAqcHJldjsKKworCWlmIChoYXNfc3ltbGlua19sZWFkaW5nX3BhdGgobmFtZSwgbGFzdF9zeW1saW5rKSkKKwkJcmV0dXJuOworCWlmICh1bmxpbmsobmFtZSkpCisJCXJldHVybjsKKwlwcmV2ID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3RhdHVzOworCQljcCA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKwkJaWYgKHByZXYpCisJCQkqcHJldiA9ICcvJzsKKwkJaWYgKCFjcCkKKwkJCWJyZWFrOworCisJCSpjcCA9IDA7CisJCXN0YXR1cyA9IHJtZGlyKG5hbWUpOworCQlpZiAoc3RhdHVzKSB7CisJCQkqY3AgPSAnLyc7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gY3A7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNoZWNrb3V0IHN0YXRlOworc3RhdGljIHZvaWQgY2hlY2tfdXBkYXRlcyhzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIGludCBuciwKKwkJCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gaHRvbnMoQ0VfVVBEQVRFKTsKKwl1bnNpZ25lZCBjbnQgPSAwLCB0b3RhbCA9IDA7CisJc3RydWN0IHByb2dyZXNzIHByb2dyZXNzOworCWNoYXIgbGFzdF9zeW1saW5rW1BBVEhfTUFYXTsKKworCWlmIChvLT51cGRhdGUgJiYgby0+dmVyYm9zZV91cGRhdGUpIHsKKwkJZm9yICh0b3RhbCA9IGNudCA9IDA7IGNudCA8IG5yOyBjbnQrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IHNyY1tjbnRdOworCQkJaWYgKCFjZS0+Y2VfbW9kZSB8fCBjZS0+Y2VfZmxhZ3MgJiBtYXNrKQorCQkJCXRvdGFsKys7CisJCX0KKworCQlzdGFydF9wcm9ncmVzc19kZWxheSgmcHJvZ3Jlc3MsICJDaGVja2luZyAldSBmaWxlcyBvdXQuLi4iLAorCQkJCSAgICAgIiIsIHRvdGFsLCA1MCwgMik7CisJCWNudCA9IDA7CisJfQorCisJKmxhc3Rfc3ltbGluayA9ICdcMCc7CisJd2hpbGUgKG5yLS0pIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9ICpzcmMrKzsKKworCQlpZiAodG90YWwpCisJCQlpZiAoIWNlLT5jZV9tb2RlIHx8IGNlLT5jZV9mbGFncyAmIG1hc2spCisJCQkJZGlzcGxheV9wcm9ncmVzcygmcHJvZ3Jlc3MsICsrY250KTsKKwkJaWYgKCFjZS0+Y2VfbW9kZSkgeworCQkJaWYgKG8tPnVwZGF0ZSkKKwkJCQl1bmxpbmtfZW50cnkoY2UtPm5hbWUsIGxhc3Rfc3ltbGluayk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2UtPmNlX2ZsYWdzICYgbWFzaykgeworCQkJY2UtPmNlX2ZsYWdzICY9IH5tYXNrOworCQkJaWYgKG8tPnVwZGF0ZSkgeworCQkJCWNoZWNrb3V0X2VudHJ5KGNlLCAmc3RhdGUsIE5VTEwpOworCQkJCSpsYXN0X3N5bWxpbmsgPSAnXDAnOworCQkJfQorCQl9CisJfQorCWlmICh0b3RhbCkKKwkJc3RvcF9wcm9ncmVzcygmcHJvZ3Jlc3MpOzsKK30KKworaW50IHVucGFja190cmVlcyhzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnRyZWVzLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJdW5zaWduZWQgbGVuID0gb2JqZWN0X2xpc3RfbGVuZ3RoKHRyZWVzKTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICoqcG9zbnM7CisJaW50IGk7CisJc3RydWN0IG9iamVjdF9saXN0ICpwb3NuID0gdHJlZXM7CisJc3RydWN0IHRyZWVfZW50cnlfbGlzdCBkZl9jb25mbGljdF9saXN0OworCXN0YXRpYyBzdHJ1Y3QgY2FjaGVfZW50cnkgKmRmYzsKKworCW1lbXNldCgmZGZfY29uZmxpY3RfbGlzdCwgMCwgc2l6ZW9mKGRmX2NvbmZsaWN0X2xpc3QpKTsKKwlkZl9jb25mbGljdF9saXN0Lm5leHQgPSAmZGZfY29uZmxpY3RfbGlzdDsKKwltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZS5iYXNlX2RpciA9ICIiOworCXN0YXRlLmZvcmNlID0gMTsKKwlzdGF0ZS5xdWlldCA9IDE7CisJc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisKKwlvLT5tZXJnZV9zaXplID0gbGVuOworCisJaWYgKCFkZmMpCisJCWRmYyA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjYWNoZV9lbnRyeSkgKyAxKTsKKwlvLT5kZl9jb25mbGljdF9lbnRyeSA9IGRmYzsKKworCWlmIChsZW4pIHsKKwkJcG9zbnMgPSB4bWFsbG9jKGxlbiAqIHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICopKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlwb3Nuc1tpXSA9IGNyZWF0ZV90cmVlX2VudHJ5X2xpc3QoKHN0cnVjdCB0cmVlICopIHBvc24tPml0ZW0pOworCQkJcG9zbiA9IHBvc24tPm5leHQ7CisJCX0KKwkJaWYgKHVucGFja190cmVlc19yZWMocG9zbnMsIGxlbiwgby0+cHJlZml4ID8gby0+cHJlZml4IDogIiIsCisJCQkJICAgICBvLCAmZGZfY29uZmxpY3RfbGlzdCkpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG8tPnRyaXZpYWxfbWVyZ2VzX29ubHkgJiYgby0+bm9udHJpdmlhbF9tZXJnZSkKKwkJZGllKCJNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmciKTsKKworCWNoZWNrX3VwZGF0ZXMoYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsIG8pOworCXJldHVybiAwOworfQorCisvKiBIZXJlIGNvbWUgdGhlIG1lcmdlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCByZWplY3RfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlkaWUoIkVudHJ5ICclcycgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbWVyZ2UuIENhbm5vdCBtZXJnZS4iLAorCSAgICBjZS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2FtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYikKK3sKKwlpZiAoISFhICE9ICEhYikKKwkJcmV0dXJuIDA7CisJaWYgKCFhICYmICFiKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gYS0+Y2VfbW9kZSA9PSBiLT5jZV9tb2RlICYmCisJICAgICAgICFoYXNoY21wKGEtPnNoYTEsIGItPnNoYTEpOworfQorCisKKy8qCisgKiBXaGVuIGEgQ0UgZ2V0cyB0dXJuZWQgaW50byBhbiB1bm1lcmdlZCBlbnRyeSwgd2UKKyAqIHdhbnQgaXQgdG8gYmUgdXAtdG8tZGF0ZQorICovCitzdGF0aWMgdm9pZCB2ZXJpZnlfdXB0b2RhdGUoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKG8tPmluZGV4X29ubHkgfHwgby0+cmVzZXQpCisJCXJldHVybjsKKworCWlmICghbHN0YXQoY2UtPm5hbWUsICZzdCkpIHsKKwkJdW5zaWduZWQgY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMSk7CisJCWlmICghY2hhbmdlZCkKKwkJCXJldHVybjsKKwkJZXJybm8gPSAwOworCX0KKwlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQlyZXR1cm47CisJZGllKCJFbnRyeSAnJXMnIG5vdCB1cHRvZGF0ZS4gQ2Fubm90IG1lcmdlLiIsIGNlLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9jZV9wYXRoKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJaWYgKGNlKQorCQljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgY2UtPm5hbWUpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jbGVhbl9zdWJkaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLAorCQkJCSAgICAgIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwkvKgorCSAqIHdlIGFyZSBhYm91dCB0byBleHRyYWN0ICJwYXRoIjsgd2Ugd291bGQgbm90IHdhbnQgdG8gbG9zZQorCSAqIGFueXRoaW5nIGluIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgdGhlcmUuCisJICovCisJaW50IG5hbWVsZW47CisJaW50IHBvcywgaTsKKwlzdHJ1Y3QgZGlyX3N0cnVjdCBkOworCWNoYXIgKnBhdGhidWY7CisJaW50IGNudCA9IDA7CisKKwkvKgorCSAqIEZpcnN0IGxldCdzIG1ha2Ugc3VyZSB3ZSBkbyBub3QgaGF2ZSBhIGxvY2FsIG1vZGlmaWNhdGlvbgorCSAqIGluIHRoYXQgZGlyZWN0b3J5LgorCSAqLworCW5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJaWYgKDAgPD0gcG9zKQorCQlyZXR1cm4gY250OyAvKiB3ZSBoYXZlIGl0IGFzIG5vbmRpcmVjdG9yeSAqLworCXBvcyA9IC1wb3MgLSAxOworCWZvciAoaSA9IHBvczsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWludCBsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJaWYgKGxlbiA8IG5hbWVsZW4gfHwKKwkJICAgIHN0cm5jbXAocGF0aCwgY2UtPm5hbWUsIG5hbWVsZW4pIHx8CisJCSAgICBjZS0+bmFtZVtuYW1lbGVuXSAhPSAnLycpCisJCQlicmVhazsKKwkJLyoKKwkJICogY2UtPm5hbWUgaXMgYW4gZW50cnkgaW4gdGhlIHN1YmRpcmVjdG9yeS4KKwkJICovCisJCWlmICghY2Vfc3RhZ2UoY2UpKSB7CisJCQl2ZXJpZnlfdXB0b2RhdGUoY2UsIG8pOworCQkJY2UtPmNlX21vZGUgPSAwOworCQl9CisJCWNudCsrOworCX0KKworCS8qCisJICogVGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBsb3NlIGEgbG9jYWxseQorCSAqIHByZXNlbnQgZmlsZSB0aGF0IGlzIG5vdCBpZ25vcmVkLgorCSAqLworCXBhdGhidWYgPSB4bWFsbG9jKG5hbWVsZW4gKyAyKTsKKwltZW1jcHkocGF0aGJ1ZiwgcGF0aCwgbmFtZWxlbik7CisJc3RyY3B5KHBhdGhidWYrbmFtZWxlbiwgIi8iKTsKKworCW1lbXNldCgmZCwgMCwgc2l6ZW9mKGQpKTsKKwlpZiAoby0+ZGlyKQorCQlkLmV4Y2x1ZGVfcGVyX2RpciA9IG8tPmRpci0+ZXhjbHVkZV9wZXJfZGlyOworCWkgPSByZWFkX2RpcmVjdG9yeSgmZCwgcGF0aCwgcGF0aGJ1ZiwgbmFtZWxlbisxLCBOVUxMKTsKKwlpZiAoaSkKKwkJZGllKCJVcGRhdGluZyAnJXMnIHdvdWxkIGxvc2UgdW50cmFja2VkIGZpbGVzIGluIGl0IiwKKwkJICAgIHBhdGgpOworCWZyZWUocGF0aGJ1Zik7CisJcmV0dXJuIGNudDsKK30KKworLyoKKyAqIFdlIGRvIG5vdCB3YW50IHRvIHJlbW92ZSBvciBvdmVyd3JpdGUgYSB3b3JraW5nIHRyZWUgZmlsZSB0aGF0CisgKiBpcyBub3QgdHJhY2tlZCwgdW5sZXNzIGl0IGlzIGlnbm9yZWQuCisgKi8KK3N0YXRpYyB2b2lkIHZlcmlmeV9hYnNlbnQoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLAorCQlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoby0+aW5kZXhfb25seSB8fCBvLT5yZXNldCB8fCAhby0+dXBkYXRlKQorCQlyZXR1cm47CisKKwlpZiAoIWxzdGF0KHBhdGgsICZzdCkpIHsKKwkJaW50IGNudDsKKworCQlpZiAoby0+ZGlyICYmIGV4Y2x1ZGVkKG8tPmRpciwgcGF0aCkpCisJCQkvKgorCQkJICogcGF0aCBpcyBleHBsaWNpdGx5IGV4Y2x1ZGVkLCBzbyBpdCBpcyBPayB0bworCQkJICogb3ZlcndyaXRlIGl0LgorCQkJICovCisJCQlyZXR1cm47CisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQkvKgorCQkJICogV2UgYXJlIGNoZWNraW5nIG91dCBwYXRoICJmb28iIGFuZAorCQkJICogZm91bmQgImZvby8uIiBpbiB0aGUgd29ya2luZyB0cmVlLgorCQkJICogVGhpcyBpcyB0cmlja3kgLS0gaWYgd2UgaGF2ZSBtb2RpZmllZAorCQkJICogZmlsZXMgdGhhdCBhcmUgaW4gImZvby8iIHdlIHdvdWxkIGxvc2UKKwkJCSAqIGl0LgorCQkJICovCisJCQljbnQgPSB2ZXJpZnlfY2xlYW5fc3ViZGlyZWN0b3J5KHBhdGgsIGFjdGlvbiwgbyk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHJlbW92ZWQgZW50cmllcyBmcm9tIHRoZSBpbmRleCwKKwkJCSAqIHdoYXQgdGhhdCBtZWFucyBpczoKKwkJCSAqCisJCQkgKiAoMSkgdGhlIGNhbGxlciB1bnBhY2tfdHJlZXNfcmVjKCkgc2F3IHBhdGgvZm9vCisJCQkgKiBpbiB0aGUgaW5kZXgsIGFuZCBpdCBoYXMgbm90IHJlbW92ZWQgaXQgYmVjYXVzZQorCQkJICogaXQgdGhpbmtzIGl0IGlzIGhhbmRsaW5nICdwYXRoJyBhcyBibG9iIHdpdGgKKwkJCSAqIEQvRiBjb25mbGljdDsKKwkJCSAqICgyKSB3ZSB3aWxsIHJldHVybiAib2ssIHdlIHBsYWNlZCBhIG1lcmdlZCBlbnRyeQorCQkJICogaW4gdGhlIGluZGV4IiB3aGljaCB3b3VsZCBjYXVzZSBvLT5wb3MgdG8gYmUKKwkJCSAqIGluY3JlbWVudGVkIGJ5IG9uZTsKKwkJCSAqICgzKSBob3dldmVyLCBvcmlnaW5hbCBvLT5wb3Mgbm93IGhhcyAncGF0aC9mb28nCisJCQkgKiBtYXJrZWQgd2l0aCAidG8gYmUgcmVtb3ZlZCIuCisJCQkgKgorCQkJICogV2UgbmVlZCB0byBpbmNyZW1lbnQgaXQgYnkgdGhlIG51bWJlciBvZgorCQkJICogZGVsZXRlZCBlbnRyaWVzIGhlcmUuCisJCQkgKi8KKwkJCW8tPnBvcyArPSBjbnQ7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBUaGUgcHJldmlvdXMgcm91bmQgbWF5IGFscmVhZHkgaGF2ZSBkZWNpZGVkIHRvCisJCSAqIGRlbGV0ZSB0aGlzIHBhdGgsIHdoaWNoIGlzIGluIGEgc3ViZGlyZWN0b3J5IHRoYXQKKwkJICogaXMgYmVpbmcgcmVwbGFjZWQgd2l0aCBhIGJsb2IuCisJCSAqLworCQljbnQgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBzdHJsZW4ocGF0aCkpOworCQlpZiAoMCA8PSBjbnQpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbY250XTsKKwkJCWlmICghY2Vfc3RhZ2UoY2UpICYmICFjZS0+Y2VfbW9kZSkKKwkJCQlyZXR1cm47CisJCX0KKworCQlkaWUoIlVudHJhY2tlZCB3b3JraW5nIHRyZWUgZmlsZSAnJXMnICIKKwkJICAgICJ3b3VsZCBiZSAlcyBieSBtZXJnZS4iLCBwYXRoLCBhY3Rpb24pOworCX0KK30KKworc3RhdGljIGludCBtZXJnZWRfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICptZXJnZSwgc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQsCisJCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwltZXJnZS0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVVBEQVRFKTsKKwlpZiAob2xkKSB7CisJCS8qCisJCSAqIFNlZSBpZiB3ZSBjYW4gcmUtdXNlIHRoZSBvbGQgQ0UgZGlyZWN0bHk/CisJCSAqIFRoYXQgd2F5IHdlIGdldCB0aGUgdXB0b2RhdGUgc3RhdCBpbmZvLgorCQkgKgorCQkgKiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgVVBEQVRFIGZsYWcgb24KKwkJICogYSBtYXRjaC4KKwkJICovCisJCWlmIChzYW1lKG9sZCwgbWVyZ2UpKSB7CisJCQkqbWVyZ2UgPSAqb2xkOworCQl9IGVsc2UgeworCQkJdmVyaWZ5X3VwdG9kYXRlKG9sZCwgbyk7CisJCQlpbnZhbGlkYXRlX2NlX3BhdGgob2xkKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJdmVyaWZ5X2Fic2VudChtZXJnZS0+bmFtZSwgIm92ZXJ3cml0dGVuIiwgbyk7CisJCWludmFsaWRhdGVfY2VfcGF0aChtZXJnZSk7CisJfQorCisJbWVyZ2UtPmNlX2ZsYWdzICY9IH5odG9ucyhDRV9TVEFHRU1BU0spOworCWFkZF9jYWNoZV9lbnRyeShtZXJnZSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlZF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCwKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCWlmIChvbGQpCisJCXZlcmlmeV91cHRvZGF0ZShvbGQsIG8pOworCWVsc2UKKwkJdmVyaWZ5X2Fic2VudChjZS0+bmFtZSwgInJlbW92ZWQiLCBvKTsKKwljZS0+Y2VfbW9kZSA9IDA7CisJYWRkX2NhY2hlX2VudHJ5KGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREfEFERF9DQUNIRV9PS19UT19SRVBMQUNFKTsKKwlpbnZhbGlkYXRlX2NlX3BhdGgoY2UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGtlZXBfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCWFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCk7CisJcmV0dXJuIDE7Cit9CisKKyNpZiBEQlJUX0RFQlVHCitzdGF0aWMgdm9pZCBzaG93X3N0YWdlX2VudHJ5KEZJTEUgKm8sCisJCQkgICAgIGNvbnN0IGNoYXIgKmxhYmVsLCBjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWlmICghY2UpCisJCWZwcmludGYobywgIiVzIChtaXNzaW5nKVxuIiwgbGFiZWwpOworCWVsc2UKKwkJZnByaW50ZihvLCAiJXMlMDZvICVzICVkXHQlc1xuIiwKKwkJCWxhYmVsLAorCQkJbnRvaGwoY2UtPmNlX21vZGUpLAorCQkJc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkJY2Vfc3RhZ2UoY2UpLAorCQkJY2UtPm5hbWUpOworfQorI2VuZGlmCisKK2ludCB0aHJlZXdheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzdGFnZXMsCisJCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmluZGV4OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqaGVhZDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKnJlbW90ZSA9IHN0YWdlc1tvLT5oZWFkX2lkeCArIDFdOworCWludCBjb3VudDsKKwlpbnQgaGVhZF9tYXRjaCA9IDA7CisJaW50IHJlbW90ZV9tYXRjaCA9IDA7CisKKwlpbnQgZGZfY29uZmxpY3RfaGVhZCA9IDA7CisJaW50IGRmX2NvbmZsaWN0X3JlbW90ZSA9IDA7CisKKwlpbnQgYW55X2FuY19taXNzaW5nID0gMDsKKwlpbnQgbm9fYW5jX2V4aXN0cyA9IDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgby0+aGVhZF9pZHg7IGkrKykgeworCQlpZiAoIXN0YWdlc1tpXSB8fCBzdGFnZXNbaV0gPT0gby0+ZGZfY29uZmxpY3RfZW50cnkpCisJCQlhbnlfYW5jX21pc3NpbmcgPSAxOworCQllbHNlCisJCQlub19hbmNfZXhpc3RzID0gMDsKKwl9CisKKwlpbmRleCA9IHN0YWdlc1swXTsKKwloZWFkID0gc3RhZ2VzW28tPmhlYWRfaWR4XTsKKworCWlmIChoZWFkID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X2hlYWQgPSAxOworCQloZWFkID0gTlVMTDsKKwl9CisKKwlpZiAocmVtb3RlID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X3JlbW90ZSA9IDE7CisJCXJlbW90ZSA9IE5VTEw7CisJfQorCisJLyogRmlyc3QsIGlmIHRoZXJlJ3MgYSAjMTYgc2l0dWF0aW9uLCBub3RlIHRoYXQgdG8gcHJldmVudCAjMTMKKwkgKiBhbmQgIzE0LgorCSAqLworCWlmICghc2FtZShyZW1vdGUsIGhlYWQpKSB7CisJCWZvciAoaSA9IDE7IGkgPCBvLT5oZWFkX2lkeDsgaSsrKSB7CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIGhlYWQpKSB7CisJCQkJaGVhZF9tYXRjaCA9IGk7CisJCQl9CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIHJlbW90ZSkpIHsKKwkJCQlyZW1vdGVfbWF0Y2ggPSBpOworCQkJfQorCQl9CisJfQorCisJLyogV2Ugc3RhcnQgd2l0aCBjYXNlcyB3aGVyZSB0aGUgaW5kZXggaXMgYWxsb3dlZCB0byBtYXRjaAorCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkOiAjMTQoQUxUKSBhbmQgIzJBTFQsIHdoZXJlIGl0CisJICogaXMgcGVybWl0dGVkIHRvIG1hdGNoIHRoZSByZXN1bHQgaW5zdGVhZC4KKwkgKi8KKwkvKiAjMTQsICMxNEFMVCwgIzJBTFQgKi8KKwlpZiAocmVtb3RlICYmICFkZl9jb25mbGljdF9oZWFkICYmIGhlYWRfbWF0Y2ggJiYgIXJlbW90ZV9tYXRjaCkgeworCQlpZiAoaW5kZXggJiYgIXNhbWUoaW5kZXgsIHJlbW90ZSkgJiYgIXNhbWUoaW5kZXgsIGhlYWQpKQorCQkJcmVqZWN0X21lcmdlKGluZGV4KTsKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShyZW1vdGUsIGluZGV4LCBvKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGVudHJ5IGluIHRoZSBpbmRleCBjYWNoZSwgdGhlbiB3ZSB3YW50IHRvCisJICogbWFrZSBzdXJlIHRoYXQgaXQgbWF0Y2hlcyBoZWFkLgorCSAqLworCWlmIChpbmRleCAmJiAhc2FtZShpbmRleCwgaGVhZCkpIHsKKwkJcmVqZWN0X21lcmdlKGluZGV4KTsKKwl9CisKKwlpZiAoaGVhZCkgeworCQkvKiAjNUFMVCwgIzE1ICovCisJCWlmIChzYW1lKGhlYWQsIHJlbW90ZSkpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4LCBvKTsKKwkJLyogIzEzLCAjM0FMVCAqLworCQlpZiAoIWRmX2NvbmZsaWN0X3JlbW90ZSAmJiByZW1vdGVfbWF0Y2ggJiYgIWhlYWRfbWF0Y2gpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4LCBvKTsKKwl9CisKKwkvKiAjMSAqLworCWlmICghaGVhZCAmJiAhcmVtb3RlICYmIGFueV9hbmNfbWlzc2luZykKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmRlciB0aGUgbmV3ICJhZ2dyZXNzaXZlIiBydWxlLCB3ZSByZXNvbHZlIG1vc3RseSB0cml2aWFsCisJICogY2FzZXMgdGhhdCB3ZSBoaXN0b3JpY2FsbHkgaGFkIGdpdC1tZXJnZS1vbmUtZmlsZSByZXNvbHZlLgorCSAqLworCWlmIChvLT5hZ2dyZXNzaXZlKSB7CisJCWludCBoZWFkX2RlbGV0ZWQgPSAhaGVhZCAmJiAhZGZfY29uZmxpY3RfaGVhZDsKKwkJaW50IHJlbW90ZV9kZWxldGVkID0gIXJlbW90ZSAmJiAhZGZfY29uZmxpY3RfcmVtb3RlOworCQljb25zdCBjaGFyICpwYXRoID0gTlVMTDsKKworCQlpZiAoaW5kZXgpCisJCQlwYXRoID0gaW5kZXgtPm5hbWU7CisJCWVsc2UgaWYgKGhlYWQpCisJCQlwYXRoID0gaGVhZC0+bmFtZTsKKwkJZWxzZSBpZiAocmVtb3RlKQorCQkJcGF0aCA9IHJlbW90ZS0+bmFtZTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAxOyBpIDwgby0+aGVhZF9pZHg7IGkrKykgeworCQkJCWlmIChzdGFnZXNbaV0gJiYgc3RhZ2VzW2ldICE9IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCQkJCXBhdGggPSBzdGFnZXNbaV0tPm5hbWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERlbGV0ZWQgaW4gYm90aC4KKwkJICogRGVsZXRlZCBpbiBvbmUgYW5kIHVuY2hhbmdlZCBpbiB0aGUgb3RoZXIuCisJCSAqLworCQlpZiAoKGhlYWRfZGVsZXRlZCAmJiByZW1vdGVfZGVsZXRlZCkgfHwKKwkJICAgIChoZWFkX2RlbGV0ZWQgJiYgcmVtb3RlICYmIHJlbW90ZV9tYXRjaCkgfHwKKwkJICAgIChyZW1vdGVfZGVsZXRlZCAmJiBoZWFkICYmIGhlYWRfbWF0Y2gpKSB7CisJCQlpZiAoaW5kZXgpCisJCQkJcmV0dXJuIGRlbGV0ZWRfZW50cnkoaW5kZXgsIGluZGV4LCBvKTsKKwkJCWVsc2UgaWYgKHBhdGggJiYgIWhlYWRfZGVsZXRlZCkKKwkJCQl2ZXJpZnlfYWJzZW50KHBhdGgsICJyZW1vdmVkIiwgbyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBBZGRlZCBpbiBib3RoLCBpZGVudGljYWxseS4KKwkJICovCisJCWlmIChub19hbmNfZXhpc3RzICYmIGhlYWQgJiYgcmVtb3RlICYmIHNhbWUoaGVhZCwgcmVtb3RlKSkKKwkJCXJldHVybiBtZXJnZWRfZW50cnkoaGVhZCwgaW5kZXgsIG8pOworCisJfQorCisJLyogQmVsb3cgYXJlICJubyBtZXJnZSIgY2FzZXMsIHdoaWNoIHJlcXVpcmUgdGhhdCB0aGUgaW5kZXggYmUKKwkgKiB1cC10by1kYXRlIHRvIGF2b2lkIHRoZSBmaWxlcyBnZXR0aW5nIG92ZXJ3cml0dGVuIHdpdGgKKwkgKiBjb25mbGljdCByZXNvbHV0aW9uIGZpbGVzLgorCSAqLworCWlmIChpbmRleCkgeworCQl2ZXJpZnlfdXB0b2RhdGUoaW5kZXgsIG8pOworCX0KKworCW8tPm5vbnRyaXZpYWxfbWVyZ2UgPSAxOworCisJLyogIzIsICMzLCAjNCwgIzYsICM3LCAjOSwgIzEwLCAjMTEuICovCisJY291bnQgPSAwOworCWlmICghaGVhZF9tYXRjaCB8fCAhcmVtb3RlX21hdGNoKSB7CisJCWZvciAoaSA9IDE7IGkgPCBvLT5oZWFkX2lkeDsgaSsrKSB7CisJCQlpZiAoc3RhZ2VzW2ldICYmIHN0YWdlc1tpXSAhPSBvLT5kZl9jb25mbGljdF9lbnRyeSkgeworCQkJCWtlZXBfZW50cnkoc3RhZ2VzW2ldLCBvKTsKKwkJCQljb3VudCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2lmIERCUlRfREVCVUcKKwllbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWFkLXRyZWU6IHdhcm5pbmcgIzE2IGRldGVjdGVkXG4iKTsKKwkJc2hvd19zdGFnZV9lbnRyeShzdGRlcnIsICJoZWFkICAgIiwgc3RhZ2VzW2hlYWRfbWF0Y2hdKTsKKwkJc2hvd19zdGFnZV9lbnRyeShzdGRlcnIsICJyZW1vdGUgIiwgc3RhZ2VzW3JlbW90ZV9tYXRjaF0pOworCX0KKyNlbmRpZgorCWlmIChoZWFkKSB7IGNvdW50ICs9IGtlZXBfZW50cnkoaGVhZCwgbyk7IH0KKwlpZiAocmVtb3RlKSB7IGNvdW50ICs9IGtlZXBfZW50cnkocmVtb3RlLCBvKTsgfQorCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFR3by13YXkgbWVyZ2UuCisgKgorICogVGhlIHJ1bGUgaXMgdG8gImNhcnJ5IGZvcndhcmQiIHdoYXQgaXMgaW4gdGhlIGluZGV4IHdpdGhvdXQgbG9zaW5nCisgKiBpbmZvcm1hdGlvbiBhY3Jvc3MgYSAiZmFzdCBmb3J3YXJkIiwgZmF2b3JpbmcgYSBzdWNjZXNzZnVsIG1lcmdlCisgKiBvdmVyIGEgbWVyZ2UgZmFpbHVyZSB3aGVuIGl0IG1ha2VzIHNlbnNlLiAgRm9yIGRldGFpbHMgb2YgdGhlCisgKiAiY2FycnkgZm9yd2FyZCIgcnVsZSwgcGxlYXNlIHNlZSA8RG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dD4uCisgKgorICovCitpbnQgdHdvd2F5X21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY3VycmVudCA9IHNyY1swXTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZHRyZWUgPSBzcmNbMV07CisJc3RydWN0IGNhY2hlX2VudHJ5ICpuZXd0cmVlID0gc3JjWzJdOworCisJaWYgKG8tPm1lcmdlX3NpemUgIT0gMikKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgZG8gYSB0d293YXkgbWVyZ2Ugb2YgJWQgdHJlZXMiLAorCQkJICAgICBvLT5tZXJnZV9zaXplKTsKKworCWlmIChvbGR0cmVlID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KQorCQlvbGR0cmVlID0gTlVMTDsKKwlpZiAobmV3dHJlZSA9PSBvLT5kZl9jb25mbGljdF9lbnRyeSkKKwkJbmV3dHJlZSA9IE5VTEw7CisKKwlpZiAoY3VycmVudCkgeworCQlpZiAoKCFvbGR0cmVlICYmICFuZXd0cmVlKSB8fCAvKiA0IGFuZCA1ICovCisJCSAgICAoIW9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkgICAgIHNhbWUoY3VycmVudCwgbmV3dHJlZSkpIHx8IC8qIDYgYW5kIDcgKi8KKwkJICAgIChvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJICAgICBzYW1lKG9sZHRyZWUsIG5ld3RyZWUpKSB8fCAvKiAxNCBhbmQgMTUgKi8KKwkJICAgIChvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJICAgICAhc2FtZShvbGR0cmVlLCBuZXd0cmVlKSAmJiAvKiAxOCBhbmQgMTkgKi8KKwkJICAgICBzYW1lKGN1cnJlbnQsIG5ld3RyZWUpKSkgeworCQkJcmV0dXJuIGtlZXBfZW50cnkoY3VycmVudCwgbyk7CisJCX0KKwkJZWxzZSBpZiAob2xkdHJlZSAmJiAhbmV3dHJlZSAmJiBzYW1lKGN1cnJlbnQsIG9sZHRyZWUpKSB7CisJCQkvKiAxMCBvciAxMSAqLworCQkJcmV0dXJuIGRlbGV0ZWRfZW50cnkob2xkdHJlZSwgY3VycmVudCwgbyk7CisJCX0KKwkJZWxzZSBpZiAob2xkdHJlZSAmJiBuZXd0cmVlICYmCisJCQkgc2FtZShjdXJyZW50LCBvbGR0cmVlKSAmJiAhc2FtZShjdXJyZW50LCBuZXd0cmVlKSkgeworCQkJLyogMjAgb3IgMjEgKi8KKwkJCXJldHVybiBtZXJnZWRfZW50cnkobmV3dHJlZSwgY3VycmVudCwgbyk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBhbGwgb3RoZXIgZmFpbHVyZXMgKi8KKwkJCWlmIChvbGR0cmVlKQorCQkJCXJlamVjdF9tZXJnZShvbGR0cmVlKTsKKwkJCWlmIChjdXJyZW50KQorCQkJCXJlamVjdF9tZXJnZShjdXJyZW50KTsKKwkJCWlmIChuZXd0cmVlKQorCQkJCXJlamVjdF9tZXJnZShuZXd0cmVlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwllbHNlIGlmIChuZXd0cmVlKQorCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KG5ld3RyZWUsIGN1cnJlbnQsIG8pOworCWVsc2UKKwkJcmV0dXJuIGRlbGV0ZWRfZW50cnkob2xkdHJlZSwgY3VycmVudCwgbyk7Cit9CisKKy8qCisgKiBCaW5kIG1lcmdlLgorICoKKyAqIEtlZXAgdGhlIGluZGV4IGVudHJpZXMgYXQgc3RhZ2UwLCBjb2xsYXBzZSBzdGFnZTEgYnV0IG1ha2Ugc3VyZQorICogc3RhZ2UwIGRvZXMgbm90IGhhdmUgYW55dGhpbmcgdGhlcmUuCisgKi8KK2ludCBiaW5kX21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkID0gc3JjWzBdOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqYSA9IHNyY1sxXTsKKworCWlmIChvLT5tZXJnZV9zaXplICE9IDEpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IGRvIGEgYmluZCBtZXJnZSBvZiAlZCB0cmVlc1xuIiwKKwkJCSAgICAgby0+bWVyZ2Vfc2l6ZSk7CisJaWYgKGEgJiYgb2xkKQorCQlkaWUoIkVudHJ5ICclcycgb3ZlcmxhcHMuICBDYW5ub3QgYmluZC4iLCBhLT5uYW1lKTsKKwlpZiAoIWEpCisJCXJldHVybiBrZWVwX2VudHJ5KG9sZCwgbyk7CisJZWxzZQorCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGEsIE5VTEwsIG8pOworfQorCisvKgorICogT25lLXdheSBtZXJnZS4KKyAqCisgKiBUaGUgcnVsZSBpczoKKyAqIC0gdGFrZSB0aGUgc3RhdCBpbmZvcm1hdGlvbiBmcm9tIHN0YWdlMCwgdGFrZSB0aGUgZGF0YSBmcm9tIHN0YWdlMQorICovCitpbnQgb25ld2F5X21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkID0gc3JjWzBdOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqYSA9IHNyY1sxXTsKKworCWlmIChvLT5tZXJnZV9zaXplICE9IDEpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IGRvIGEgb25ld2F5IG1lcmdlIG9mICVkIHRyZWVzIiwKKwkJCSAgICAgby0+bWVyZ2Vfc2l6ZSk7CisKKwlpZiAoIWEpCisJCXJldHVybiBkZWxldGVkX2VudHJ5KG9sZCwgb2xkLCBvKTsKKwlpZiAob2xkICYmIHNhbWUob2xkLCBhKSkgeworCQlpZiAoby0+cmVzZXQpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKGxzdGF0KG9sZC0+bmFtZSwgJnN0KSB8fAorCQkJICAgIGNlX21hdGNoX3N0YXQob2xkLCAmc3QsIDEpKQorCQkJCW9sZC0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVVBEQVRFKTsKKwkJfQorCQlyZXR1cm4ga2VlcF9lbnRyeShvbGQsIG8pOworCX0KKwlyZXR1cm4gbWVyZ2VkX2VudHJ5KGEsIG9sZCwgbyk7Cit9CmRpZmYgLS1naXQgYS91bnBhY2stdHJlZXMuaCBiL3VucGFjay10cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTdkYTQKLS0tIC9kZXYvbnVsbAorKysgYi91bnBhY2stdHJlZXMuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIFVOUEFDS19UUkVFU19ICisjZGVmaW5lIFVOUEFDS19UUkVFU19ICisKK3N0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9uczsKKwordHlwZWRlZiBpbnQgKCptZXJnZV9mbl90KShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsCisJCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqb3B0aW9ucyk7CisKK3N0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyB7CisJaW50IHJlc2V0OworCWludCBtZXJnZTsKKwlpbnQgdXBkYXRlOworCWludCBpbmRleF9vbmx5OworCWludCBub250cml2aWFsX21lcmdlOworCWludCB0cml2aWFsX21lcmdlc19vbmx5OworCWludCB2ZXJib3NlX3VwZGF0ZTsKKwlpbnQgYWdncmVzc2l2ZTsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJaW50IHBvczsKKwlzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyOworCW1lcmdlX2ZuX3QgZm47CisKKwlpbnQgaGVhZF9pZHg7CisJaW50IG1lcmdlX3NpemU7CisKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmRmX2NvbmZsaWN0X2VudHJ5OworfTsKKworZXh0ZXJuIGludCB1bnBhY2tfdHJlZXMoc3RydWN0IG9iamVjdF9saXN0ICp0cmVlcywKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvcHRpb25zKTsKKworaW50IHRocmVld2F5X21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnN0YWdlcywgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKTsKK2ludCB0d293YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pOworaW50IGJpbmRfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pOworaW50IG9uZXdheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXBkYXRlLXNlcnZlci1pbmZvLmMgYi91cGRhdGUtc2VydmVyLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZjMzgzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlLXNlcnZlci1pbmZvLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHVwZGF0ZV9zZXJ2ZXJfaW5mb191c2FnZVtdID0KKyJnaXQtdXBkYXRlLXNlcnZlci1pbmZvIFstLWZvcmNlXSI7CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpOworCWludCBmb3JjZSA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJaWYgKGF2W2ldWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoIi0tZm9yY2UiLCBhdltpXSkgfHwKKwkJCSAgICAhc3RyY21wKCItZiIsIGF2W2ldKSkKKwkJCQlmb3JjZSA9IDE7CisJCQllbHNlCisJCQkJdXNhZ2UodXBkYXRlX3NlcnZlcl9pbmZvX3VzYWdlKTsKKwkJfQorCX0KKwlpZiAoaSAhPSBhYykKKwkJdXNhZ2UodXBkYXRlX3NlcnZlcl9pbmZvX3VzYWdlKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXJldHVybiAhIXVwZGF0ZV9zZXJ2ZXJfaW5mbyhmb3JjZSk7Cit9CmRpZmYgLS1naXQgYS91cGxvYWQtcGFjay5jIGIvdXBsb2FkLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EwOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBsb2FkLXBhY2suYwpAQCAtMCwwICsxLDY5MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAic2lkZWJhbmQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImxpc3Qtb2JqZWN0cy5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1cGxvYWRfcGFja191c2FnZVtdID0gImdpdC11cGxvYWQtcGFjayBbLS1zdHJpY3RdIFstLXRpbWVvdXQ9bm5dIDxkaXI+IjsKKworLyogYml0cyAjMC4uNyBpbiByZXZpc2lvbi5oLCAjOC4uMTAgaW4gY29tbWl0LmMgKi8KKyNkZWZpbmUgVEhFWV9IQVZFCSgxdSA8PCAxMSkKKyNkZWZpbmUgT1VSX1JFRgkJKDF1IDw8IDEyKQorI2RlZmluZSBXQU5URUQJCSgxdSA8PCAxMykKKyNkZWZpbmUgQ09NTU9OX0tOT1dOCSgxdSA8PCAxNCkKKyNkZWZpbmUgUkVBQ0hBQkxFCSgxdSA8PCAxNSkKKworI2RlZmluZSBTSEFMTE9XCQkoMXUgPDwgMTYpCisjZGVmaW5lIE5PVF9TSEFMTE9XCSgxdSA8PCAxNykKKyNkZWZpbmUgQ0xJRU5UX1NIQUxMT1cJKDF1IDw8IDE4KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbGRlc3RfaGF2ZTsKKworc3RhdGljIGludCBtdWx0aV9hY2ssIG5yX291cl9yZWZzOworc3RhdGljIGludCB1c2VfdGhpbl9wYWNrLCB1c2Vfb2ZzX2RlbHRhLCBub19wcm9ncmVzczsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2FycmF5IGhhdmVfb2JqOworc3RhdGljIHN0cnVjdCBvYmplY3RfYXJyYXkgd2FudF9vYmo7CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisvKiAwIGZvciBubyBzaWRlYmFuZCwKKyAqIG90aGVyd2lzZSBtYXhpbXVtIHBhY2tldCBzaXplICh1cCB0byA2NTUyMCBieXRlcykuCisgKi8KK3N0YXRpYyBpbnQgdXNlX3NpZGViYW5kOworCitzdGF0aWMgdm9pZCByZXNldF90aW1lb3V0KHZvaWQpCit7CisJYWxhcm0odGltZW91dCk7Cit9CisKK3N0YXRpYyBpbnQgc3RyaXAoY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxpbmVbLS1sZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBzZW5kX2NsaWVudF9kYXRhKGludCBmZCwgY29uc3QgY2hhciAqZGF0YSwgc3NpemVfdCBzeikKK3sKKwlpZiAodXNlX3NpZGViYW5kKQorCQlyZXR1cm4gc2VuZF9zaWRlYmFuZCgxLCBmZCwgZGF0YSwgc3osIHVzZV9zaWRlYmFuZCk7CisJaWYgKGZkID09IDMpCisJCS8qIGVtZXJnZW5jeSBxdWl0ICovCisJCWZkID0gMjsKKwlpZiAoZmQgPT0gMikgeworCQkvKiBYWFg6IGFyZSB3ZSBoYXBweSB0byBsb3NlIHN0dWZmIGhlcmU/ICovCisJCXh3cml0ZShmZCwgZGF0YSwgc3opOworCQlyZXR1cm4gc3o7CisJfQorCXJldHVybiBzYWZlX3dyaXRlKGZkLCBkYXRhLCBzeik7Cit9CisKK0ZJTEUgKnBhY2tfcGlwZSA9IE5VTEw7CitzdGF0aWMgdm9pZCBzaG93X2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCWZwdXRjKCctJywgcGFja19waXBlKTsKKwlpZiAoZnB1dHMoc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksIHBhY2tfcGlwZSkgPCAwKQorCQlkaWUoImJyb2tlbiBvdXRwdXQgcGlwZSIpOworCWZwdXRjKCdcbicsIHBhY2tfcGlwZSk7CisJZmZsdXNoKHBhY2tfcGlwZSk7CisJZnJlZShjb21taXQtPmJ1ZmZlcik7CisJY29tbWl0LT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaG93X29iamVjdChzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpwKQoreworCS8qIEFuIG9iamVjdCB3aXRoIG5hbWUgImZvb1xuMDAwMDAwMC4uLiIgY2FuIGJlIHVzZWQgdG8KKwkgKiBjb25mdXNlIGRvd25zdHJlYW0gZ2l0LXBhY2stb2JqZWN0cyB2ZXJ5IGJhZGx5LgorCSAqLworCWNvbnN0IGNoYXIgKmVwID0gc3RyY2hyKHAtPm5hbWUsICdcbicpOworCWlmIChlcCkgeworCQlmcHJpbnRmKHBhY2tfcGlwZSwgIiVzICUuKnNcbiIsIHNoYTFfdG9faGV4KHAtPml0ZW0tPnNoYTEpLAorCQkgICAgICAgKGludCkgKGVwIC0gcC0+bmFtZSksCisJCSAgICAgICBwLT5uYW1lKTsKKwl9CisJZWxzZQorCQlmcHJpbnRmKHBhY2tfcGlwZSwgIiVzICVzXG4iLAorCQkJCXNoYTFfdG9faGV4KHAtPml0ZW0tPnNoYTEpLCBwLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19lZGdlKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlmcHJpbnRmKHBhY2tfcGlwZSwgIi0lc1xuIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcGFja19maWxlKHZvaWQpCit7CisJLyogUGlwZXMgYmV0d2VlbiByZXYtbGlzdCB0byBwYWNrLW9iamVjdHMsIHBhY2stb2JqZWN0cyB0byB1cworCSAqIGFuZCBwYWNrLW9iamVjdHMgZXJyb3Igc3RyZWFtIGZvciBwcm9ncmVzcyBiYXIuCisJICovCisJaW50IGxwX3BpcGVbMl0sIHB1X3BpcGVbMl0sIHBlX3BpcGVbMl07CisJcGlkX3QgcGlkX3Jldl9saXN0LCBwaWRfcGFja19vYmplY3RzOworCWludCBjcmVhdGVfZnVsbF9wYWNrID0gKG5yX291cl9yZWZzID09IHdhbnRfb2JqLm5yICYmICFoYXZlX29iai5ucik7CisJY2hhciBkYXRhWzgxOTNdLCBwcm9ncmVzc1sxMjhdOworCWNoYXIgYWJvcnRfbXNnW10gPSAiYWJvcnRpbmcgZHVlIHRvIHBvc3NpYmxlIHJlcG9zaXRvcnkgIgorCQkiY29ycnVwdGlvbiBvbiB0aGUgcmVtb3RlIHNpZGUuIjsKKwlpbnQgYnVmZmVyZWQgPSAtMTsKKworCWlmIChwaXBlKGxwX3BpcGUpIDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBjcmVhdGUgcGlwZSIpOworCXBpZF9yZXZfbGlzdCA9IGZvcmsoKTsKKwlpZiAocGlkX3Jldl9saXN0IDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBmb3JrIGdpdC1yZXYtbGlzdCIpOworCisJaWYgKCFwaWRfcmV2X2xpc3QpIHsKKwkJaW50IGk7CisJCXN0cnVjdCByZXZfaW5mbyByZXZzOworCisJCWNsb3NlKGxwX3BpcGVbMF0pOworCQlwYWNrX3BpcGUgPSBmZG9wZW4obHBfcGlwZVsxXSwgInciKTsKKworCQlpZiAoY3JlYXRlX2Z1bGxfcGFjaykKKwkJCXVzZV90aGluX3BhY2sgPSAwOyAvKiBubyBwb2ludCBkb2luZyBpdCAqLworCQlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJCXJldnMudGFnX29iamVjdHMgPSAxOworCQlyZXZzLnRyZWVfb2JqZWN0cyA9IDE7CisJCXJldnMuYmxvYl9vYmplY3RzID0gMTsKKwkJaWYgKHVzZV90aGluX3BhY2spCisJCQlyZXZzLmVkZ2VfaGludCA9IDE7CisKKwkJaWYgKGNyZWF0ZV9mdWxsX3BhY2spIHsKKwkJCWNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsicmV2LWxpc3QiLCAiLS1hbGwiLCBOVUxMfTsKKwkJCXNldHVwX3JldmlzaW9ucygyLCBhcmdzLCAmcmV2cywgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgd2FudF9vYmoubnI7IGkrKykgeworCQkJCXN0cnVjdCBvYmplY3QgKm8gPSB3YW50X29iai5vYmplY3RzW2ldLml0ZW07CisJCQkJLyogd2h5Pz8/ICovCisJCQkJby0+ZmxhZ3MgJj0gflVOSU5URVJFU1RJTkc7CisJCQkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCBvLCBOVUxMKTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBoYXZlX29iai5ucjsgaSsrKSB7CisJCQkJc3RydWN0IG9iamVjdCAqbyA9IGhhdmVfb2JqLm9iamVjdHNbaV0uaXRlbTsKKwkJCQlvLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJCWFkZF9wZW5kaW5nX29iamVjdCgmcmV2cywgbywgTlVMTCk7CisJCQl9CisJCQlzZXR1cF9yZXZpc2lvbnMoMCwgTlVMTCwgJnJldnMsIE5VTEwpOworCQl9CisJCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cyk7CisJCW1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhyZXZzLmNvbW1pdHMsICZyZXZzLCBzaG93X2VkZ2UpOworCQl0cmF2ZXJzZV9jb21taXRfbGlzdCgmcmV2cywgc2hvd19jb21taXQsIHNob3dfb2JqZWN0KTsKKwkJZXhpdCgwKTsKKwl9CisKKwlpZiAocGlwZShwdV9waXBlKSA8IDApCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gY3JlYXRlIHBpcGUiKTsKKwlpZiAocGlwZShwZV9waXBlKSA8IDApCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gY3JlYXRlIHBpcGUiKTsKKwlwaWRfcGFja19vYmplY3RzID0gZm9yaygpOworCWlmIChwaWRfcGFja19vYmplY3RzIDwgMCkgeworCQkvKiBkYWVtb24gc2V0cyB0aGluZ3MgdXAgdG8gaWdub3JlIFRFUk0gKi8KKwkJa2lsbChwaWRfcmV2X2xpc3QsIFNJR0tJTEwpOworCQlkaWUoImdpdC11cGxvYWQtcGFjazogdW5hYmxlIHRvIGZvcmsgZ2l0LXBhY2stb2JqZWN0cyIpOworCX0KKwlpZiAoIXBpZF9wYWNrX29iamVjdHMpIHsKKwkJY29uc3QgY2hhciAqYXJndlsxMF07CisJCWludCBpID0gMDsKKworCQlkdXAyKGxwX3BpcGVbMF0sIDApOworCQlkdXAyKHB1X3BpcGVbMV0sIDEpOworCQlkdXAyKHBlX3BpcGVbMV0sIDIpOworCisJCWNsb3NlKGxwX3BpcGVbMF0pOworCQljbG9zZShscF9waXBlWzFdKTsKKwkJY2xvc2UocHVfcGlwZVswXSk7CisJCWNsb3NlKHB1X3BpcGVbMV0pOworCQljbG9zZShwZV9waXBlWzBdKTsKKwkJY2xvc2UocGVfcGlwZVsxXSk7CisKKwkJYXJndltpKytdID0gInBhY2stb2JqZWN0cyI7CisJCWFyZ3ZbaSsrXSA9ICItLXN0ZG91dCI7CisJCWlmICghbm9fcHJvZ3Jlc3MpCisJCQlhcmd2W2krK10gPSAiLS1wcm9ncmVzcyI7CisJCWlmICh1c2Vfb2ZzX2RlbHRhKQorCQkJYXJndltpKytdID0gIi0tZGVsdGEtYmFzZS1vZmZzZXQiOworCQlhcmd2W2krK10gPSBOVUxMOworCisJCWV4ZWN2X2dpdF9jbWQoYXJndik7CisJCWtpbGwocGlkX3Jldl9saXN0LCBTSUdLSUxMKTsKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBleGVjIGdpdC1wYWNrLW9iamVjdHMiKTsKKwl9CisKKwljbG9zZShscF9waXBlWzBdKTsKKwljbG9zZShscF9waXBlWzFdKTsKKworCS8qIFdlIHJlYWQgZnJvbSBwZV9waXBlWzBdIHRvIGNhcHR1cmUgc3RkZXJyIG91dHB1dCBmb3IKKwkgKiBwcm9ncmVzcyBiYXIsIGFuZCBwdV9waXBlWzBdIHRvIGNhcHR1cmUgdGhlIHBhY2sgZGF0YS4KKwkgKi8KKwljbG9zZShwZV9waXBlWzFdKTsKKwljbG9zZShwdV9waXBlWzFdKTsKKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKndobzsKKwkJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJCXBpZF90IHBpZDsKKwkJaW50IHN0YXR1czsKKwkJc3NpemVfdCBzejsKKwkJaW50IHBlLCBwdSwgcG9sbHNpemU7CisKKwkJcmVzZXRfdGltZW91dCgpOworCisJCXBvbGxzaXplID0gMDsKKwkJcGUgPSBwdSA9IC0xOworCisJCWlmICgwIDw9IHB1X3BpcGVbMF0pIHsKKwkJCXBmZFtwb2xsc2l6ZV0uZmQgPSBwdV9waXBlWzBdOworCQkJcGZkW3BvbGxzaXplXS5ldmVudHMgPSBQT0xMSU47CisJCQlwdSA9IHBvbGxzaXplOworCQkJcG9sbHNpemUrKzsKKwkJfQorCQlpZiAoMCA8PSBwZV9waXBlWzBdKSB7CisJCQlwZmRbcG9sbHNpemVdLmZkID0gcGVfcGlwZVswXTsKKwkJCXBmZFtwb2xsc2l6ZV0uZXZlbnRzID0gUE9MTElOOworCQkJcGUgPSBwb2xsc2l6ZTsKKwkJCXBvbGxzaXplKys7CisJCX0KKworCQlpZiAocG9sbHNpemUpIHsKKwkJCWlmIChwb2xsKHBmZCwgcG9sbHNpemUsIC0xKSA8IDApIHsKKwkJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQkJZXJyb3IoInBvbGwgZmFpbGVkLCByZXN1bWluZzogJXMiLAorCQkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQlzbGVlcCgxKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoMCA8PSBwdSAmJiAocGZkW3B1XS5yZXZlbnRzICYgKFBPTExJTnxQT0xMSFVQKSkpIHsKKwkJCQkvKiBEYXRhIHJlYWR5OyB3ZSBrZWVwIHRoZSBsYXN0IGJ5dGUKKwkJCQkgKiB0byBvdXJzZWx2ZXMgaW4gY2FzZSB3ZSBkZXRlY3QKKwkJCQkgKiBicm9rZW4gcmV2LWxpc3QsIHNvIHRoYXQgd2UgY2FuCisJCQkJICogbGVhdmUgdGhlIHN0cmVhbSBjb3JydXB0ZWQuICBUaGlzCisJCQkJICogaXMgdW5mb3J0dW5hdGUgLS0gdW5wYWNrLW9iamVjdHMKKwkJCQkgKiB3b3VsZCBoYXBwaWx5IGFjY2VwdCBhIHZhbGlkIHBhY2sKKwkJCQkgKiBkYXRhIHdpdGggdHJhaWxpbmcgZ2FyYmFnZSwgc28KKwkJCQkgKiBhcHBlbmRpbmcgZ2FyYmFnZSBhZnRlciB3ZSBwYXNzIGFsbAorCQkJCSAqIHRoZSBwYWNrIGRhdGEgaXMgbm90IGdvb2QgZW5vdWdoIHRvCisJCQkJICogc2lnbmFsIGJyZWFrYWdlIHRvIGRvd25zdHJlYW0uCisJCQkJICovCisJCQkJY2hhciAqY3AgPSBkYXRhOworCQkJCXNzaXplX3Qgb3V0c3ogPSAwOworCQkJCWlmICgwIDw9IGJ1ZmZlcmVkKSB7CisJCQkJCSpjcCsrID0gYnVmZmVyZWQ7CisJCQkJCW91dHN6Kys7CisJCQkJfQorCQkJCXN6ID0geHJlYWQocHVfcGlwZVswXSwgY3AsCisJCQkJCSAgc2l6ZW9mKGRhdGEpIC0gb3V0c3opOworCQkJCWlmICgwIDwgc3opCisJCQkJCQk7CisJCQkJZWxzZSBpZiAoc3ogPT0gMCkgeworCQkJCQljbG9zZShwdV9waXBlWzBdKTsKKwkJCQkJcHVfcGlwZVswXSA9IC0xOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWdvdG8gZmFpbDsKKwkJCQlzeiArPSBvdXRzejsKKwkJCQlpZiAoMSA8IHN6KSB7CisJCQkJCWJ1ZmZlcmVkID0gZGF0YVtzei0xXSAmIDB4RkY7CisJCQkJCXN6LS07CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJYnVmZmVyZWQgPSAtMTsKKwkJCQlzeiA9IHNlbmRfY2xpZW50X2RhdGEoMSwgZGF0YSwgc3opOworCQkJCWlmIChzeiA8IDApCisJCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWlmICgwIDw9IHBlICYmIChwZmRbcGVdLnJldmVudHMgJiAoUE9MTElOfFBPTExIVVApKSkgeworCQkJCS8qIFN0YXR1cyByZWFkeTsgd2Ugc2hpcCB0aGF0IGluIHRoZSBzaWRlLWJhbmQKKwkJCQkgKiBvciBkdW1wIHRvIHRoZSBzdGFuZGFyZCBlcnJvci4KKwkJCQkgKi8KKwkJCQlzeiA9IHhyZWFkKHBlX3BpcGVbMF0sIHByb2dyZXNzLAorCQkJCQkgIHNpemVvZihwcm9ncmVzcykpOworCQkJCWlmICgwIDwgc3opCisJCQkJCXNlbmRfY2xpZW50X2RhdGEoMiwgcHJvZ3Jlc3MsIHN6KTsKKwkJCQllbHNlIGlmIChzeiA9PSAwKSB7CisJCQkJCWNsb3NlKHBlX3BpcGVbMF0pOworCQkJCQlwZV9waXBlWzBdID0gLTE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisKKwkJLyogU2VlIGlmIHRoZSBjaGlsZHJlbiBhcmUgc3RpbGwgdGhlcmUgKi8KKwkJaWYgKHBpZF9yZXZfbGlzdCB8fCBwaWRfcGFja19vYmplY3RzKSB7CisJCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKTsKKwkJCWlmICghcGlkKQorCQkJCWNvbnRpbnVlOworCQkJd2hvID0gKChwaWQgPT0gcGlkX3Jldl9saXN0KSA/ICJnaXQtcmV2LWxpc3QiIDoKKwkJCSAgICAgICAocGlkID09IHBpZF9wYWNrX29iamVjdHMpID8gImdpdC1wYWNrLW9iamVjdHMiIDoKKwkJCSAgICAgICBOVUxMKTsKKwkJCWlmICghd2hvKSB7CisJCQkJaWYgKHBpZCA8IDApIHsKKwkJCQkJZXJyb3IoImdpdC11cGxvYWQtcGFjazogJXMiLAorCQkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJCWVycm9yKCJnaXQtdXBsb2FkLXBhY2s6IHdlIHdlcmVuJ3QgIgorCQkJCSAgICAgICJ3YWl0aW5nIGZvciAlZCIsIHBpZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgPiAwKSB7CisJCQkJZXJyb3IoImdpdC11cGxvYWQtcGFjazogJXMgZGllZCB3aXRoIGVycm9yLiIsCisJCQkJICAgICAgd2hvKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAocGlkID09IHBpZF9yZXZfbGlzdCkKKwkJCQlwaWRfcmV2X2xpc3QgPSAwOworCQkJaWYgKHBpZCA9PSBwaWRfcGFja19vYmplY3RzKQorCQkJCXBpZF9wYWNrX29iamVjdHMgPSAwOworCQkJaWYgKHBpZF9yZXZfbGlzdCB8fCBwaWRfcGFja19vYmplY3RzKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYm90aCBkaWVkIGhhcHBpbHkgKi8KKwkJaWYgKHBvbGxzaXplKQorCQkJY29udGludWU7CisKKwkJLyogZmx1c2ggdGhlIGRhdGEgKi8KKwkJaWYgKDAgPD0gYnVmZmVyZWQpIHsKKwkJCWRhdGFbMF0gPSBidWZmZXJlZDsKKwkJCXN6ID0gc2VuZF9jbGllbnRfZGF0YSgxLCBkYXRhLCAxKTsKKwkJCWlmIChzeiA8IDApCisJCQkJZ290byBmYWlsOworCQkJZnByaW50ZihzdGRlcnIsICJmbHVzaGVkLlxuIik7CisJCX0KKwkJaWYgKHVzZV9zaWRlYmFuZCkKKwkJCXBhY2tldF9mbHVzaCgxKTsKKwkJcmV0dXJuOworCX0KKyBmYWlsOgorCWlmIChwaWRfcGFja19vYmplY3RzKQorCQlraWxsKHBpZF9wYWNrX29iamVjdHMsIFNJR0tJTEwpOworCWlmIChwaWRfcmV2X2xpc3QpCisJCWtpbGwocGlkX3Jldl9saXN0LCBTSUdLSUxMKTsKKwlzZW5kX2NsaWVudF9kYXRhKDMsIGFib3J0X21zZywgc2l6ZW9mKGFib3J0X21zZykpOworCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiAlcyIsIGFib3J0X21zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ290X3NoYTEoY2hhciAqaGV4LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJaW50IHdlX2tuZXdfdGhleV9oYXZlID0gMDsKKworCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGV4cGVjdGVkIFNIQTEgb2JqZWN0LCBnb3QgJyVzJyIsIGhleCk7CisJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwlvID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIShvICYmIG8tPnBhcnNlZCkpCisJCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvKQorCQlkaWUoIm9vcHMgKCVzKSIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCQlpZiAoby0+ZmxhZ3MgJiBUSEVZX0hBVkUpCisJCQl3ZV9rbmV3X3RoZXlfaGF2ZSA9IDE7CisJCWVsc2UKKwkJCW8tPmZsYWdzIHw9IFRIRVlfSEFWRTsKKwkJaWYgKCFvbGRlc3RfaGF2ZSB8fCAoY29tbWl0LT5kYXRlIDwgb2xkZXN0X2hhdmUpKQorCQkJb2xkZXN0X2hhdmUgPSBjb21taXQtPmRhdGU7CisJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBwYXJlbnRzOworCQkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KQorCQkJcGFyZW50cy0+aXRlbS0+b2JqZWN0LmZsYWdzIHw9IFRIRVlfSEFWRTsKKwl9CisJaWYgKCF3ZV9rbmV3X3RoZXlfaGF2ZSkgeworCQlhZGRfb2JqZWN0X2FycmF5KG8sIE5VTEwsICZoYXZlX29iaik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFjaGFibGUoc3RydWN0IGNvbW1pdCAqd2FudCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKndvcmsgPSBOVUxMOworCisJaW5zZXJ0X2J5X2RhdGUod2FudCwgJndvcmspOworCXdoaWxlICh3b3JrKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IHdvcmstPm5leHQ7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHdvcmstPml0ZW07CisJCWZyZWUod29yayk7CisJCXdvcmsgPSBsaXN0OworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFRIRVlfSEFWRSkgeworCQkJd2FudC0+b2JqZWN0LmZsYWdzIHw9IENPTU1PTl9LTk9XTjsKKwkJCWJyZWFrOworCQl9CisJCWlmICghY29tbWl0LT5vYmplY3QucGFyc2VkKQorCQkJcGFyc2Vfb2JqZWN0KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBSRUFDSEFCTEUpCisJCQljb250aW51ZTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gUkVBQ0hBQkxFOworCQlpZiAoY29tbWl0LT5kYXRlIDwgb2xkZXN0X2hhdmUpCisJCQljb250aW51ZTsKKwkJZm9yIChsaXN0ID0gY29tbWl0LT5wYXJlbnRzOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gbGlzdC0+aXRlbTsKKwkJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgUkVBQ0hBQkxFKSkKKwkJCQlpbnNlcnRfYnlfZGF0ZShwYXJlbnQsICZ3b3JrKTsKKwkJfQorCX0KKwl3YW50LT5vYmplY3QuZmxhZ3MgfD0gUkVBQ0hBQkxFOworCWNsZWFyX2NvbW1pdF9tYXJrcyh3YW50LCBSRUFDSEFCTEUpOworCWZyZWVfY29tbWl0X2xpc3Qod29yayk7CisJcmV0dXJuICh3YW50LT5vYmplY3QuZmxhZ3MgJiBDT01NT05fS05PV04pOworfQorCitzdGF0aWMgaW50IG9rX3RvX2dpdmVfdXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghaGF2ZV9vYmoubnIpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHdhbnRfb2JqLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdCAqd2FudCA9IHdhbnRfb2JqLm9iamVjdHNbaV0uaXRlbTsKKworCQlpZiAod2FudC0+ZmxhZ3MgJiBDT01NT05fS05PV04pCisJCQljb250aW51ZTsKKwkJd2FudCA9IGRlcmVmX3RhZyh3YW50LCAiYSB3YW50IGxpbmUiLCAwKTsKKwkJaWYgKCF3YW50IHx8IHdhbnQtPnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJLyogbm8gd2F5IHRvIHRlbGwgaWYgdGhpcyBpcyByZWFjaGFibGUgYnkKKwkJCSAqIGxvb2tpbmcgYXQgdGhlIGFuY2VzdHJ5IGNoYWluIGFsb25lLCBzbworCQkJICogbGVhdmUgYSBub3RlIHRvIG91cnNlbHZlcyBub3QgdG8gd29ycnkgYWJvdXQKKwkJCSAqIHRoaXMgb2JqZWN0IGFueW1vcmUuCisJCQkgKi8KKwkJCXdhbnRfb2JqLm9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgfD0gQ09NTU9OX0tOT1dOOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZWFjaGFibGUoKHN0cnVjdCBjb21taXQgKil3YW50KSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfY29tbW9uX2NvbW1pdHModm9pZCkKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBoZXhbNDFdLCBsYXN0X2hleFs0MV07CisJaW50IGxlbjsKKworCXRyYWNrX29iamVjdF9yZWZzID0gMDsKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCisJZm9yKDs7KSB7CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwkJcmVzZXRfdGltZW91dCgpOworCisJCWlmICghbGVuKSB7CisJCQlpZiAoaGF2ZV9vYmoubnIgPT0gMCB8fCBtdWx0aV9hY2spCisJCQkJcGFja2V0X3dyaXRlKDEsICJOQUtcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJbGVuID0gc3RyaXAobGluZSwgbGVuKTsKKwkJaWYgKCFwcmVmaXhjbXAobGluZSwgImhhdmUgIikpIHsKKwkJCXN3aXRjaCAoZ290X3NoYTEobGluZSs1LCBzaGExKSkgeworCQkJY2FzZSAtMTogLyogdGhleSBoYXZlIHdoYXQgd2UgZG8gbm90ICovCisJCQkJaWYgKG11bHRpX2FjayAmJiBva190b19naXZlX3VwKCkpCisJCQkJCXBhY2tldF93cml0ZSgxLCAiQUNLICVzIGNvbnRpbnVlXG4iLAorCQkJCQkJICAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW1lbWNweShoZXgsIHNoYTFfdG9faGV4KHNoYTEpLCA0MSk7CisJCQkJaWYgKG11bHRpX2FjaykgeworCQkJCQljb25zdCBjaGFyICptc2cgPSAiQUNLICVzIGNvbnRpbnVlXG4iOworCQkJCQlwYWNrZXRfd3JpdGUoMSwgbXNnLCBoZXgpOworCQkJCQltZW1jcHkobGFzdF9oZXgsIGhleCwgNDEpOworCQkJCX0KKwkJCQllbHNlIGlmIChoYXZlX29iai5uciA9PSAxKQorCQkJCQlwYWNrZXRfd3JpdGUoMSwgIkFDSyAlc1xuIiwgaGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGxpbmUsICJkb25lIikpIHsKKwkJCWlmIChoYXZlX29iai5uciA+IDApIHsKKwkJCQlpZiAobXVsdGlfYWNrKQorCQkJCQlwYWNrZXRfd3JpdGUoMSwgIkFDSyAlc1xuIiwgbGFzdF9oZXgpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcGFja2V0X3dyaXRlKDEsICJOQUtcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiBleHBlY3RlZCBTSEExIGxpc3QsIGdvdCAnJXMnIiwgbGluZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWNlaXZlX25lZWRzKHZvaWQpCit7CisJc3RydWN0IG9iamVjdF9hcnJheSBzaGFsbG93cyA9IHswLCAwLCBOVUxMfTsKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCWludCBsZW4sIGRlcHRoID0gMDsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IG9iamVjdCAqbzsKKwkJdW5zaWduZWQgY2hhciBzaGExX2J1ZlsyMF07CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwkJcmVzZXRfdGltZW91dCgpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCisJCWlmICghcHJlZml4Y21wKGxpbmUsICJzaGFsbG93ICIpKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0OworCQkJdXNlX3RoaW5fcGFjayA9IDA7CisJCQlpZiAoZ2V0X3NoYTEobGluZSArIDgsIHNoYTEpKQorCQkJCWRpZSgiaW52YWxpZCBzaGFsbG93IGxpbmU6ICVzIiwgbGluZSk7CisJCQlvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCQlpZiAoIW9iamVjdCkKKwkJCQlkaWUoImRpZCBub3QgZmluZCBvYmplY3QgZm9yICVzIiwgbGluZSk7CisJCQlvYmplY3QtPmZsYWdzIHw9IENMSUVOVF9TSEFMTE9XOworCQkJYWRkX29iamVjdF9hcnJheShvYmplY3QsIE5VTEwsICZzaGFsbG93cyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChsaW5lLCAiZGVlcGVuICIpKSB7CisJCQljaGFyICplbmQ7CisJCQl1c2VfdGhpbl9wYWNrID0gMDsKKwkJCWRlcHRoID0gc3RydG9sKGxpbmUgKyA3LCAmZW5kLCAwKTsKKwkJCWlmIChlbmQgPT0gbGluZSArIDcgfHwgZGVwdGggPD0gMCkKKwkJCQlkaWUoIkludmFsaWQgZGVlcGVuOiAlcyIsIGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHByZWZpeGNtcChsaW5lLCAid2FudCAiKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUrNSwgc2hhMV9idWYpKQorCQkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHByb3RvY29sIGVycm9yLCAiCisJCQkgICAgImV4cGVjdGVkIHRvIGdldCBzaGEsIG5vdCAnJXMnIiwgbGluZSk7CisJCWlmIChzdHJzdHIobGluZSs0NSwgIm11bHRpX2FjayIpKQorCQkJbXVsdGlfYWNrID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAidGhpbi1wYWNrIikpCisJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAib2ZzLWRlbHRhIikpCisJCQl1c2Vfb2ZzX2RlbHRhID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAic2lkZS1iYW5kLTY0ayIpKQorCQkJdXNlX3NpZGViYW5kID0gTEFSR0VfUEFDS0VUX01BWDsKKwkJZWxzZSBpZiAoc3Ryc3RyKGxpbmUrNDUsICJzaWRlLWJhbmQiKSkKKwkJCXVzZV9zaWRlYmFuZCA9IERFRkFVTFRfUEFDS0VUX01BWDsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAibm8tcHJvZ3Jlc3MiKSkKKwkJCW5vX3Byb2dyZXNzID0gMTsKKworCQkvKiBXZSBoYXZlIHNlbnQgYWxsIG91ciByZWZzIGFscmVhZHksIGFuZCB0aGUgb3RoZXIgZW5kCisJCSAqIHNob3VsZCBoYXZlIGNob3NlbiBvdXQgb2YgdGhlbTsgb3RoZXJ3aXNlIHRoZXkgYXJlCisJCSAqIGFza2luZyBmb3Igbm9uc2Vuc2UuCisJCSAqCisJCSAqIEhtcGguICBXZSBtYXkgbGF0ZXIgd2FudCB0byBhbGxvdyAid2FudCIgbGluZSB0aGF0CisJCSAqIGFza3MgZm9yIHNvbWV0aGluZyBsaWtlICJtYXN0ZXJ+MTAiIChzeW1ib2xpYykuLi4KKwkJICogd291bGQgaXQgbWFrZSBzZW5zZT8gIEkgZG9uJ3Qga25vdy4KKwkJICovCisJCW8gPSBsb29rdXBfb2JqZWN0KHNoYTFfYnVmKTsKKwkJaWYgKCFvIHx8ICEoby0+ZmxhZ3MgJiBPVVJfUkVGKSkKKwkJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiBub3Qgb3VyIHJlZiAlcyIsIGxpbmUrNSk7CisJCWlmICghKG8tPmZsYWdzICYgV0FOVEVEKSkgeworCQkJby0+ZmxhZ3MgfD0gV0FOVEVEOworCQkJYWRkX29iamVjdF9hcnJheShvLCBOVUxMLCAmd2FudF9vYmopOworCQl9CisJfQorCWlmIChkZXB0aCA9PSAwICYmIHNoYWxsb3dzLm5yID09IDApCisJCXJldHVybjsKKwlpZiAoZGVwdGggPiAwKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcmVzdWx0LCAqYmFja3VwOworCQlpbnQgaTsKKwkJYmFja3VwID0gcmVzdWx0ID0gZ2V0X3NoYWxsb3dfY29tbWl0cygmd2FudF9vYmosIGRlcHRoLAorCQkJU0hBTExPVywgTk9UX1NIQUxMT1cpOworCQl3aGlsZSAocmVzdWx0KSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSAmcmVzdWx0LT5pdGVtLT5vYmplY3Q7CisJCQlpZiAoIShvYmplY3QtPmZsYWdzICYgKENMSUVOVF9TSEFMTE9XfE5PVF9TSEFMTE9XKSkpIHsKKwkJCQlwYWNrZXRfd3JpdGUoMSwgInNoYWxsb3cgJXMiLAorCQkJCQkJc2hhMV90b19oZXgob2JqZWN0LT5zaGExKSk7CisJCQkJcmVnaXN0ZXJfc2hhbGxvdyhvYmplY3QtPnNoYTEpOworCQkJfQorCQkJcmVzdWx0ID0gcmVzdWx0LT5uZXh0OworCQl9CisJCWZyZWVfY29tbWl0X2xpc3QoYmFja3VwKTsKKwkJZm9yIChpID0gMDsgaSA8IHNoYWxsb3dzLm5yOyBpKyspIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHNoYWxsb3dzLm9iamVjdHNbaV0uaXRlbTsKKwkJCWlmIChvYmplY3QtPmZsYWdzICYgTk9UX1NIQUxMT1cpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCQkJcGFja2V0X3dyaXRlKDEsICJ1bnNoYWxsb3cgJXMiLAorCQkJCQlzaGExX3RvX2hleChvYmplY3QtPnNoYTEpKTsKKwkJCQlvYmplY3QtPmZsYWdzICY9IH5DTElFTlRfU0hBTExPVzsKKwkJCQkvKiBtYWtlIHN1cmUgdGhlIHJlYWwgcGFyZW50cyBhcmUgcGFyc2VkICovCisJCQkJdW5yZWdpc3Rlcl9zaGFsbG93KG9iamVjdC0+c2hhMSk7CisJCQkJb2JqZWN0LT5wYXJzZWQgPSAwOworCQkJCXBhcnNlX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKW9iamVjdCk7CisJCQkJcGFyZW50cyA9ICgoc3RydWN0IGNvbW1pdCAqKW9iamVjdCktPnBhcmVudHM7CisJCQkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCQkJYWRkX29iamVjdF9hcnJheSgmcGFyZW50cy0+aXRlbS0+b2JqZWN0LAorCQkJCQkJCU5VTEwsICZ3YW50X29iaik7CisJCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJCX0KKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSBjb21taXQgdHJhdmVyc2FsIGNvbmZvcm1zIHRvIGNsaWVudCAqLworCQkJcmVnaXN0ZXJfc2hhbGxvdyhvYmplY3QtPnNoYTEpOworCQl9CisJCXBhY2tldF9mbHVzaCgxKTsKKwl9IGVsc2UKKwkJaWYgKHNoYWxsb3dzLm5yID4gMCkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2hhbGxvd3MubnI7IGkrKykKKwkJCQlyZWdpc3Rlcl9zaGFsbG93KHNoYWxsb3dzLm9iamVjdHNbaV0uaXRlbS0+c2hhMSk7CisJCX0KKwlmcmVlKHNoYWxsb3dzLm9iamVjdHMpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjYXBhYmlsaXRpZXMgPSAibXVsdGlfYWNrIHRoaW4tcGFjayBzaWRlLWJhbmQiCisJCSIgc2lkZS1iYW5kLTY0ayBvZnMtZGVsdGEgc2hhbGxvdyBuby1wcm9ncmVzcyI7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKworCWlmICghbykKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGNhbm5vdCBmaW5kIG9iamVjdCAlczoiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwlpZiAoY2FwYWJpbGl0aWVzKQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHJlZm5hbWUsCisJCQkwLCBjYXBhYmlsaXRpZXMpOworCWVsc2UKKwkJcGFja2V0X3dyaXRlKDEsICIlcyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHJlZm5hbWUpOworCWNhcGFiaWxpdGllcyA9IE5VTEw7CisJaWYgKCEoby0+ZmxhZ3MgJiBPVVJfUkVGKSkgeworCQlvLT5mbGFncyB8PSBPVVJfUkVGOworCQlucl9vdXJfcmVmcysrOworCX0KKwlpZiAoby0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCW8gPSBkZXJlZl90YWcobywgcmVmbmFtZSwgMCk7CisJCXBhY2tldF93cml0ZSgxLCAiJXMgJXNee31cbiIsIHNoYTFfdG9faGV4KG8tPnNoYTEpLCByZWZuYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwbG9hZF9wYWNrKHZvaWQpCit7CisJcmVzZXRfdGltZW91dCgpOworCWhlYWRfcmVmKHNlbmRfcmVmLCBOVUxMKTsKKwlmb3JfZWFjaF9yZWYoc2VuZF9yZWYsIE5VTEwpOworCXBhY2tldF9mbHVzaCgxKTsKKwlyZWNlaXZlX25lZWRzKCk7CisJaWYgKHdhbnRfb2JqLm5yKSB7CisJCWdldF9jb21tb25fY29tbWl0cygpOworCQljcmVhdGVfcGFja19maWxlKCk7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZGlyOworCWludCBpOworCWludCBzdHJpY3QgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RyaWN0IikpIHsKKwkJCXN0cmljdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXRpbWVvdXQ9IikpIHsKKwkJCXRpbWVvdXQgPSBhdG9pKGFyZysxMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwlpZiAoaSAhPSBhcmdjLTEpCisJCXVzYWdlKHVwbG9hZF9wYWNrX3VzYWdlKTsKKwlkaXIgPSBhcmd2W2ldOworCisJaWYgKCFlbnRlcl9yZXBvKGRpciwgc3RyaWN0KSkKKwkJZGllKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCWlmIChpc19yZXBvc2l0b3J5X3NoYWxsb3coKSkKKwkJZGllKCJhdHRlbXB0IHRvIGZldGNoL2Nsb25lIGZyb20gYSBzaGFsbG93IHJlcG9zaXRvcnkiKTsKKwl1cGxvYWRfcGFjaygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNhZ2UuYyBiL3VzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNjUyYwotLS0gL2Rldi9udWxsCisrKyBiL3VzYWdlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWZwdXRzKHByZWZpeCwgc3RkZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgcGFyYW1zKTsKKwlmcHV0cygiXG4iLCBzdGRlcnIpOworfQorCitzdGF0aWMgTk9SRVRVUk4gdm9pZCB1c2FnZV9idWlsdGluKGNvbnN0IGNoYXIgKmVycikKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlc1xuIiwgZXJyKTsKKwlleGl0KDEyOSk7Cit9CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIGRpZV9idWlsdGluKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCJmYXRhbDogIiwgZXJyLCBwYXJhbXMpOworCWV4aXQoMTI4KTsKK30KKworc3RhdGljIHZvaWQgZXJyb3JfYnVpbHRpbihjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiZXJyb3I6ICIsIGVyciwgcGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgd2Fybl9idWlsdGluKGNvbnN0IGNoYXIgKndhcm4sIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgid2FybmluZzogIiwgd2FybiwgcGFyYW1zKTsKK30KKworLyogSWYgd2UgYXJlIGluIGEgZGxvcGVuKCllZCAuc28gd3JpdGUgdG8gYSBnbG9iYWwgdmFyaWFibGUgd291bGQgc2VnZmF1bHQKKyAqICh1Z2gpLCBzbyBrZWVwIHRoaW5ncyBzdGF0aWMuICovCitzdGF0aWMgdm9pZCAoKnVzYWdlX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk4gPSB1c2FnZV9idWlsdGluOworc3RhdGljIHZvaWQgKCpkaWVfcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgTk9SRVRVUk4gPSBkaWVfYnVpbHRpbjsKK3N0YXRpYyB2b2lkICgqZXJyb3Jfcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgPSBlcnJvcl9idWlsdGluOworc3RhdGljIHZvaWQgKCp3YXJuX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpID0gd2Fybl9idWlsdGluOworCit2b2lkIHNldF91c2FnZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOKQoreworCXVzYWdlX3JvdXRpbmUgPSByb3V0aW5lOworfQorCit2b2lkIHNldF9kaWVfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgTk9SRVRVUk4pCit7CisJZGllX3JvdXRpbmUgPSByb3V0aW5lOworfQorCit2b2lkIHNldF9lcnJvcl9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSkKK3sKKwllcnJvcl9yb3V0aW5lID0gcm91dGluZTsKK30KKwordm9pZCBzZXRfd2Fybl9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICp3YXJuLCB2YV9saXN0IHBhcmFtcykpCit7CisJd2Fybl9yb3V0aW5lID0gcm91dGluZTsKK30KKworCit2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKmVycikKK3sKKwl1c2FnZV9yb3V0aW5lKGVycik7Cit9CisKK3ZvaWQgZGllKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWRpZV9yb3V0aW5lKGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKK30KKworaW50IGVycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWVycm9yX3JvdXRpbmUoZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworCXJldHVybiAtMTsKK30KKwordm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKndhcm4sIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKworCXZhX3N0YXJ0KHBhcmFtcywgd2Fybik7CisJd2Fybl9yb3V0aW5lKHdhcm4sIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CmRpZmYgLS1naXQgYS91dGY4LmMgYi91dGY4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmZWY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3V0ZjguYwpAQCAtMCwwICsxLDM1NiBAQAorI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgInV0ZjguaCIKKworLyogVGhpcyBjb2RlIGlzIG9yaWdpbmFsbHkgZnJvbSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzLyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCB1Y3NfY2hhcl90OyAgLyogYXNzdW1pbmcgMzJiaXQgaW50ICovCisKK3N0cnVjdCBpbnRlcnZhbCB7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7Cit9OworCisvKiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGJpbmFyeSBzZWFyY2ggaW4gaW50ZXJ2YWwgdGFibGUgKi8KK3N0YXRpYyBpbnQgYmlzZWFyY2godWNzX2NoYXJfdCB1Y3MsIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqdGFibGUsIGludCBtYXgpIHsKKwlpbnQgbWluID0gMDsKKwlpbnQgbWlkOworCisJaWYgKHVjcyA8IHRhYmxlWzBdLmZpcnN0IHx8IHVjcyA+IHRhYmxlW21heF0ubGFzdCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKG1heCA+PSBtaW4pIHsKKwkJbWlkID0gKG1pbiArIG1heCkgLyAyOworCQlpZiAodWNzID4gdGFibGVbbWlkXS5sYXN0KQorCQkJbWluID0gbWlkICsgMTsKKwkJZWxzZSBpZiAodWNzIDwgdGFibGVbbWlkXS5maXJzdCkKKwkJCW1heCA9IG1pZCAtIDE7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgZGVmaW5lIHRoZSBjb2x1bW4gd2lkdGggb2YgYW4gSVNPIDEwNjQ2CisgKiBjaGFyYWN0ZXIgYXMgZm9sbG93czoKKyAqCisgKiAgICAtIFRoZSBudWxsIGNoYXJhY3RlciAoVSswMDAwKSBoYXMgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIE90aGVyIEMwL0MxIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgREVMIHdpbGwgbGVhZCB0byBhIHJldHVybgorICogICAgICB2YWx1ZSBvZiAtMS4KKyAqCisgKiAgICAtIE5vbi1zcGFjaW5nIGFuZCBlbmNsb3NpbmcgY29tYmluaW5nIGNoYXJhY3RlcnMgKGdlbmVyYWwKKyAqICAgICAgY2F0ZWdvcnkgY29kZSBNbiBvciBNZSBpbiB0aGUgVW5pY29kZSBkYXRhYmFzZSkgaGF2ZSBhCisgKiAgICAgIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gU09GVCBIWVBIRU4gKFUrMDBBRCkgaGFzIGEgY29sdW1uIHdpZHRoIG9mIDEuCisgKgorICogICAgLSBPdGhlciBmb3JtYXQgY2hhcmFjdGVycyAoZ2VuZXJhbCBjYXRlZ29yeSBjb2RlIENmIGluIHRoZSBVbmljb2RlCisgKiAgICAgIGRhdGFiYXNlKSBhbmQgWkVSTyBXSURUSCBTUEFDRSAoVSsyMDBCKSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBIYW5ndWwgSmFtbyBtZWRpYWwgdm93ZWxzIGFuZCBmaW5hbCBjb25zb25hbnRzIChVKzExNjAtVSsxMUZGKQorICogICAgICBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBTcGFjaW5nIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4gV2lkZSAoVykgb3IgRWFzdCBBc2lhbgorICogICAgICBGdWxsLXdpZHRoIChGKSBjYXRlZ29yeSBhcyBkZWZpbmVkIGluIFVuaWNvZGUgVGVjaG5pY2FsCisgKiAgICAgIFJlcG9ydCAjMTEgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAyLgorICoKKyAqICAgIC0gQWxsIHJlbWFpbmluZyBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgYWxsIHByaW50YWJsZQorICogICAgICBJU08gODg1OS0xIGFuZCBXR0w0IGNoYXJhY3RlcnMsIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXJzLAorICogICAgICBldGMuKSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDEuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdWNzX2NoYXJfdCBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkCisgKiBpbiBJU08gMTA2NDYuCisgKi8KKworc3RhdGljIGludCBnaXRfd2N3aWR0aCh1Y3NfY2hhcl90IGNoKQoreworCS8qCisJICogU29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzLAorCSAqIGdlbmVyYXRlZCBieQorCSAqICAgInVuaXNldCArY2F0PU1lICtjYXQ9TW4gK2NhdD1DZiAtMDBBRCArMTE2MC0xMUZGICsyMDBCIGMiLgorCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgY29tYmluaW5nW10gPSB7CisJCXsgMHgwMzAwLCAweDAzNTcgfSwgeyAweDAzNUQsIDB4MDM2RiB9LCB7IDB4MDQ4MywgMHgwNDg2IH0sCisJCXsgMHgwNDg4LCAweDA0ODkgfSwgeyAweDA1OTEsIDB4MDVBMSB9LCB7IDB4MDVBMywgMHgwNUI5IH0sCisJCXsgMHgwNUJCLCAweDA1QkQgfSwgeyAweDA1QkYsIDB4MDVCRiB9LCB7IDB4MDVDMSwgMHgwNUMyIH0sCisJCXsgMHgwNUM0LCAweDA1QzQgfSwgeyAweDA2MDAsIDB4MDYwMyB9LCB7IDB4MDYxMCwgMHgwNjE1IH0sCisJCXsgMHgwNjRCLCAweDA2NTggfSwgeyAweDA2NzAsIDB4MDY3MCB9LCB7IDB4MDZENiwgMHgwNkU0IH0sCisJCXsgMHgwNkU3LCAweDA2RTggfSwgeyAweDA2RUEsIDB4MDZFRCB9LCB7IDB4MDcwRiwgMHgwNzBGIH0sCisJCXsgMHgwNzExLCAweDA3MTEgfSwgeyAweDA3MzAsIDB4MDc0QSB9LCB7IDB4MDdBNiwgMHgwN0IwIH0sCisJCXsgMHgwOTAxLCAweDA5MDIgfSwgeyAweDA5M0MsIDB4MDkzQyB9LCB7IDB4MDk0MSwgMHgwOTQ4IH0sCisJCXsgMHgwOTRELCAweDA5NEQgfSwgeyAweDA5NTEsIDB4MDk1NCB9LCB7IDB4MDk2MiwgMHgwOTYzIH0sCisJCXsgMHgwOTgxLCAweDA5ODEgfSwgeyAweDA5QkMsIDB4MDlCQyB9LCB7IDB4MDlDMSwgMHgwOUM0IH0sCisJCXsgMHgwOUNELCAweDA5Q0QgfSwgeyAweDA5RTIsIDB4MDlFMyB9LCB7IDB4MEEwMSwgMHgwQTAyIH0sCisJCXsgMHgwQTNDLCAweDBBM0MgfSwgeyAweDBBNDEsIDB4MEE0MiB9LCB7IDB4MEE0NywgMHgwQTQ4IH0sCisJCXsgMHgwQTRCLCAweDBBNEQgfSwgeyAweDBBNzAsIDB4MEE3MSB9LCB7IDB4MEE4MSwgMHgwQTgyIH0sCisJCXsgMHgwQUJDLCAweDBBQkMgfSwgeyAweDBBQzEsIDB4MEFDNSB9LCB7IDB4MEFDNywgMHgwQUM4IH0sCisJCXsgMHgwQUNELCAweDBBQ0QgfSwgeyAweDBBRTIsIDB4MEFFMyB9LCB7IDB4MEIwMSwgMHgwQjAxIH0sCisJCXsgMHgwQjNDLCAweDBCM0MgfSwgeyAweDBCM0YsIDB4MEIzRiB9LCB7IDB4MEI0MSwgMHgwQjQzIH0sCisJCXsgMHgwQjRELCAweDBCNEQgfSwgeyAweDBCNTYsIDB4MEI1NiB9LCB7IDB4MEI4MiwgMHgwQjgyIH0sCisJCXsgMHgwQkMwLCAweDBCQzAgfSwgeyAweDBCQ0QsIDB4MEJDRCB9LCB7IDB4MEMzRSwgMHgwQzQwIH0sCisJCXsgMHgwQzQ2LCAweDBDNDggfSwgeyAweDBDNEEsIDB4MEM0RCB9LCB7IDB4MEM1NSwgMHgwQzU2IH0sCisJCXsgMHgwQ0JDLCAweDBDQkMgfSwgeyAweDBDQkYsIDB4MENCRiB9LCB7IDB4MENDNiwgMHgwQ0M2IH0sCisJCXsgMHgwQ0NDLCAweDBDQ0QgfSwgeyAweDBENDEsIDB4MEQ0MyB9LCB7IDB4MEQ0RCwgMHgwRDREIH0sCisJCXsgMHgwRENBLCAweDBEQ0EgfSwgeyAweDBERDIsIDB4MERENCB9LCB7IDB4MERENiwgMHgwREQ2IH0sCisJCXsgMHgwRTMxLCAweDBFMzEgfSwgeyAweDBFMzQsIDB4MEUzQSB9LCB7IDB4MEU0NywgMHgwRTRFIH0sCisJCXsgMHgwRUIxLCAweDBFQjEgfSwgeyAweDBFQjQsIDB4MEVCOSB9LCB7IDB4MEVCQiwgMHgwRUJDIH0sCisJCXsgMHgwRUM4LCAweDBFQ0QgfSwgeyAweDBGMTgsIDB4MEYxOSB9LCB7IDB4MEYzNSwgMHgwRjM1IH0sCisJCXsgMHgwRjM3LCAweDBGMzcgfSwgeyAweDBGMzksIDB4MEYzOSB9LCB7IDB4MEY3MSwgMHgwRjdFIH0sCisJCXsgMHgwRjgwLCAweDBGODQgfSwgeyAweDBGODYsIDB4MEY4NyB9LCB7IDB4MEY5MCwgMHgwRjk3IH0sCisJCXsgMHgwRjk5LCAweDBGQkMgfSwgeyAweDBGQzYsIDB4MEZDNiB9LCB7IDB4MTAyRCwgMHgxMDMwIH0sCisJCXsgMHgxMDMyLCAweDEwMzIgfSwgeyAweDEwMzYsIDB4MTAzNyB9LCB7IDB4MTAzOSwgMHgxMDM5IH0sCisJCXsgMHgxMDU4LCAweDEwNTkgfSwgeyAweDExNjAsIDB4MTFGRiB9LCB7IDB4MTcxMiwgMHgxNzE0IH0sCisJCXsgMHgxNzMyLCAweDE3MzQgfSwgeyAweDE3NTIsIDB4MTc1MyB9LCB7IDB4MTc3MiwgMHgxNzczIH0sCisJCXsgMHgxN0I0LCAweDE3QjUgfSwgeyAweDE3QjcsIDB4MTdCRCB9LCB7IDB4MTdDNiwgMHgxN0M2IH0sCisJCXsgMHgxN0M5LCAweDE3RDMgfSwgeyAweDE3REQsIDB4MTdERCB9LCB7IDB4MTgwQiwgMHgxODBEIH0sCisJCXsgMHgxOEE5LCAweDE4QTkgfSwgeyAweDE5MjAsIDB4MTkyMiB9LCB7IDB4MTkyNywgMHgxOTI4IH0sCisJCXsgMHgxOTMyLCAweDE5MzIgfSwgeyAweDE5MzksIDB4MTkzQiB9LCB7IDB4MjAwQiwgMHgyMDBGIH0sCisJCXsgMHgyMDJBLCAweDIwMkUgfSwgeyAweDIwNjAsIDB4MjA2MyB9LCB7IDB4MjA2QSwgMHgyMDZGIH0sCisJCXsgMHgyMEQwLCAweDIwRUEgfSwgeyAweDMwMkEsIDB4MzAyRiB9LCB7IDB4MzA5OSwgMHgzMDlBIH0sCisJCXsgMHhGQjFFLCAweEZCMUUgfSwgeyAweEZFMDAsIDB4RkUwRiB9LCB7IDB4RkUyMCwgMHhGRTIzIH0sCisJCXsgMHhGRUZGLCAweEZFRkYgfSwgeyAweEZGRjksIDB4RkZGQiB9LCB7IDB4MUQxNjcsIDB4MUQxNjkgfSwKKwkJeyAweDFEMTczLCAweDFEMTgyIH0sIHsgMHgxRDE4NSwgMHgxRDE4QiB9LAorCQl7IDB4MUQxQUEsIDB4MUQxQUQgfSwgeyAweEUwMDAxLCAweEUwMDAxIH0sCisJCXsgMHhFMDAyMCwgMHhFMDA3RiB9LCB7IDB4RTAxMDAsIDB4RTAxRUYgfQorCX07CisKKwkvKiB0ZXN0IGZvciA4LWJpdCBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlpZiAoY2ggPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNoIDwgMzIgfHwgKGNoID49IDB4N2YgJiYgY2ggPCAweGEwKSkKKwkJcmV0dXJuIC0xOworCisJLyogYmluYXJ5IHNlYXJjaCBpbiB0YWJsZSBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzICovCisJaWYgKGJpc2VhcmNoKGNoLCBjb21iaW5pbmcsIHNpemVvZihjb21iaW5pbmcpCisJCQkJLyBzaXplb2Yoc3RydWN0IGludGVydmFsKSAtIDEpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgd2UgYXJyaXZlIGhlcmUsIGNoIGlzIG5laXRoZXIgYSBjb21iaW5pbmcgbm9yIGEgQzAvQzEKKwkgKiBjb250cm9sIGNoYXJhY3Rlci4KKwkgKi8KKworCXJldHVybiAxICsKKwkJKGNoID49IDB4MTEwMCAmJgorICAgICAgICAgICAgICAgICAgICAvKiBIYW5ndWwgSmFtbyBpbml0LiBjb25zb25hbnRzICovCisJCSAoY2ggPD0gMHgxMTVmIHx8CisJCSAgY2ggPT0gMHgyMzI5IHx8IGNoID09IDB4MjMyYSB8fAorICAgICAgICAgICAgICAgICAgLyogQ0pLIC4uLiBZaSAqLworCQkgIChjaCA+PSAweDJlODAgJiYgY2ggPD0gMHhhNGNmICYmCisJCSAgIGNoICE9IDB4MzAzZikgfHwKKwkJICAvKiBIYW5ndWwgU3lsbGFibGVzICovCisJCSAgKGNoID49IDB4YWMwMCAmJiBjaCA8PSAweGQ3YTMpIHx8CisJCSAgLyogQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAqLworCQkgIChjaCA+PSAweGY5MDAgJiYgY2ggPD0gMHhmYWZmKSB8fAorCQkgIC8qIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisJCSAgKGNoID49IDB4ZmUzMCAmJiBjaCA8PSAweGZlNmYpIHx8CisJCSAgLyogRnVsbHdpZHRoIEZvcm1zICovCisJCSAgKGNoID49IDB4ZmYwMCAmJiBjaCA8PSAweGZmNjApIHx8CisJCSAgKGNoID49IDB4ZmZlMCAmJiBjaCA8PSAweGZmZTYpIHx8CisJCSAgKGNoID49IDB4MjAwMDAgJiYgY2ggPD0gMHgyZmZmZCkgfHwKKwkJICAoY2ggPj0gMHgzMDAwMCAmJiBjaCA8PSAweDNmZmZkKSkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvY2N1cGllZCBieSB0aGUgY2hhcmFjdGVyCisgKiBwb2ludGVkIHRvIGJ5IHRoZSB2YXJpYWJsZSBzdGFydC4gVGhlIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCBhdAorICogdGhlIG5leHQgY2hhcmFjdGVyLiBJZiBpdCB3YXMgbm90IHZhbGlkIFVURi04LCB0aGUgcG9pbnRlciBpcyBzZXQgdG8gTlVMTC4KKyAqLworaW50IHV0Zjhfd2lkdGgoY29uc3QgY2hhciAqKnN0YXJ0KQoreworCXVuc2lnbmVkIGNoYXIgKnMgPSAodW5zaWduZWQgY2hhciAqKSpzdGFydDsKKwl1Y3NfY2hhcl90IGNoOworCisJaWYgKCpzIDwgMHg4MCkgeworCQkvKiAweHh4eHh4eCAqLworCQljaCA9ICpzOworCQkqc3RhcnQgKz0gMTsKKwl9IGVsc2UgaWYgKChzWzBdICYgMHhlMCkgPT0gMHhjMCkgeworCQkvKiAxMTBYWFhYeCAxMHh4eHh4eCAqLworCQlpZiAoKHNbMV0gJiAweGMwKSAhPSAweDgwIHx8CisJCQkJLyogb3Zlcmxvbmc/ICovCisJCQkJKHNbMF0gJiAweGZlKSA9PSAweGMwKQorCQkJZ290byBpbnZhbGlkOworCQljaCA9ICgoc1swXSAmIDB4MWYpIDw8IDYpIHwgKHNbMV0gJiAweDNmKTsKKwkJKnN0YXJ0ICs9IDI7CisJfSBlbHNlIGlmICgoc1swXSAmIDB4ZjApID09IDB4ZTApIHsKKwkJLyogMTExMFhYWFggMTBYeHh4eHggMTB4eHh4eHggKi8KKwkJaWYgKChzWzFdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJCShzWzJdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJCS8qIG92ZXJsb25nPyAqLworCQkJCShzWzBdID09IDB4ZTAgJiYgKHNbMV0gJiAweGUwKSA9PSAweDgwKSB8fAorCQkJCS8qIHN1cnJvZ2F0ZT8gKi8KKwkJCQkoc1swXSA9PSAweGVkICYmIChzWzFdICYgMHhlMCkgPT0gMHhhMCkgfHwKKwkJCQkvKiBVK0ZGRkUgb3IgVStGRkZGPyAqLworCQkJCShzWzBdID09IDB4ZWYgJiYgc1sxXSA9PSAweGJmICYmCisJCQkJIChzWzJdICYgMHhmZSkgPT0gMHhiZSkpCisJCQlnb3RvIGludmFsaWQ7CisJCWNoID0gKChzWzBdICYgMHgwZikgPDwgMTIpIHwKKwkJCSgoc1sxXSAmIDB4M2YpIDw8IDYpIHwgKHNbMl0gJiAweDNmKTsKKwkJKnN0YXJ0ICs9IDM7CisJfSBlbHNlIGlmICgoc1swXSAmIDB4ZjgpID09IDB4ZjApIHsKKwkJLyogMTExMTBYWFggMTBYWHh4eHggMTB4eHh4eHggMTB4eHh4eHggKi8KKwkJaWYgKChzWzFdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJCShzWzJdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJCShzWzNdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJCS8qIG92ZXJsb25nPyAqLworCQkJCShzWzBdID09IDB4ZjAgJiYgKHNbMV0gJiAweGYwKSA9PSAweDgwKSB8fAorCQkJCS8qID4gVSsxMEZGRkY/ICovCisJCQkJKHNbMF0gPT0gMHhmNCAmJiBzWzFdID4gMHg4ZikgfHwgc1swXSA+IDB4ZjQpCisJCQlnb3RvIGludmFsaWQ7CisJCWNoID0gKChzWzBdICYgMHgwNykgPDwgMTgpIHwgKChzWzFdICYgMHgzZikgPDwgMTIpIHwKKwkJCSgoc1syXSAmIDB4M2YpIDw8IDYpIHwgKHNbM10gJiAweDNmKTsKKwkJKnN0YXJ0ICs9IDQ7CisJfSBlbHNlIHsKK2ludmFsaWQ6CisJCSpzdGFydCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfd2N3aWR0aChjaCk7Cit9CisKK2ludCBpc191dGY4KGNvbnN0IGNoYXIgKnRleHQpCit7CisJd2hpbGUgKCp0ZXh0KSB7CisJCWlmICgqdGV4dCA9PSAnXG4nIHx8ICp0ZXh0ID09ICdcdCcgfHwgKnRleHQgPT0gJ1xyJykgeworCQkJdGV4dCsrOworCQkJY29udGludWU7CisJCX0KKwkJdXRmOF93aWR0aCgmdGV4dCk7CisJCWlmICghdGV4dCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3BhY2VzKGludCBjb3VudCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzW10gPSAiICAgICAgICAgICAgICAgICAgICAiOworCXdoaWxlIChjb3VudCA+PSBzaXplb2YocykpIHsKKwkJZndyaXRlKHMsIHNpemVvZihzKSAtIDEsIDEsIHN0ZG91dCk7CisJCWNvdW50IC09IHNpemVvZihzKSAtIDE7CisJfQorCWZ3cml0ZShzLCBjb3VudCwgMSwgc3Rkb3V0KTsKK30KKworLyoKKyAqIFdyYXAgdGhlIHRleHQsIGlmIG5lY2Vzc2FyeS4gVGhlIHZhcmlhYmxlIGluZGVudCBpcyB0aGUgaW5kZW50IGZvciB0aGUKKyAqIGZpcnN0IGxpbmUsIGluZGVudDIgaXMgdGhlIGluZGVudCBmb3IgYWxsIG90aGVyIGxpbmVzLgorICogSWYgaW5kZW50IGlzIG5lZ2F0aXZlLCBhc3N1bWUgdGhhdCBhbHJlYWR5IC1pbmRlbnQgY29sdW1ucyBoYXZlIGJlZW4KKyAqIGNvbnN1bWVkIChhbmQgbm8gZXh0cmEgaW5kZW50IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGZpcnN0IGxpbmUpLgorICovCitpbnQgcHJpbnRfd3JhcHBlZF90ZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCBpbmRlbnQsIGludCBpbmRlbnQyLCBpbnQgd2lkdGgpCit7CisJaW50IHcgPSBpbmRlbnQsIGFzc3VtZV91dGY4ID0gaXNfdXRmOCh0ZXh0KTsKKwljb25zdCBjaGFyICpib2wgPSB0ZXh0LCAqc3BhY2UgPSBOVUxMOworCisJaWYgKGluZGVudCA8IDApIHsKKwkJdyA9IC1pbmRlbnQ7CisJCXNwYWNlID0gdGV4dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWNoYXIgYyA9ICp0ZXh0OworCQlpZiAoIWMgfHwgaXNzcGFjZShjKSkgeworCQkJaWYgKHcgPCB3aWR0aCB8fCAhc3BhY2UpIHsKKwkJCQljb25zdCBjaGFyICpzdGFydCA9IGJvbDsKKwkJCQlpZiAoc3BhY2UpCisJCQkJCXN0YXJ0ID0gc3BhY2U7CisJCQkJZWxzZQorCQkJCQlwcmludF9zcGFjZXMoaW5kZW50KTsKKwkJCQlmd3JpdGUoc3RhcnQsIHRleHQgLSBzdGFydCwgMSwgc3Rkb3V0KTsKKwkJCQlpZiAoIWMpCisJCQkJCXJldHVybiB3OworCQkJCWVsc2UgaWYgKGMgPT0gJ1x0JykKKwkJCQkJdyB8PSAweDA3OworCQkJCXNwYWNlID0gdGV4dDsKKwkJCQl3Kys7CisJCQkJdGV4dCsrOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHV0Y2hhcignXG4nKTsKKwkJCQl0ZXh0ID0gYm9sID0gc3BhY2UgKyBpc3NwYWNlKCpzcGFjZSk7CisJCQkJc3BhY2UgPSBOVUxMOworCQkJCXcgPSBpbmRlbnQgPSBpbmRlbnQyOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFzc3VtZV91dGY4KQorCQkJdyArPSB1dGY4X3dpZHRoKCZ0ZXh0KTsKKwkJZWxzZSB7CisJCQl3Kys7CisJCQl0ZXh0Kys7CisJCX0KKwl9CisJcmV0dXJuIHc7Cit9CisKK2ludCBpc19lbmNvZGluZ191dGY4KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gMTsKKwlpZiAoIXN0cmNhc2VjbXAobmFtZSwgInV0Zi04IikgfHwgIXN0cmNhc2VjbXAobmFtZSwgInV0ZjgiKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJ1ZmZlciBhbmQgaXRzIGVuY29kaW5nLCByZXR1cm4gaXQgcmUtZW5jb2RlZAorICogd2l0aCBpY29udi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm5zIE5VTEwuCisgKi8KKyNpZm5kZWYgTk9fSUNPTlYKKyNpZmRlZiBPTERfSUNPTlYKKwl0eXBlZGVmIGNvbnN0IGNoYXIgKiBpY29udl9pYnA7CisjZWxzZQorCXR5cGVkZWYgY2hhciAqIGljb252X2licDsKKyNlbmRpZgorY2hhciAqcmVlbmNvZGVfc3RyaW5nKGNvbnN0IGNoYXIgKmluLCBjb25zdCBjaGFyICpvdXRfZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmluX2VuY29kaW5nKQoreworCWljb252X3QgY29udjsKKwlzaXplX3QgaW5zeiwgb3V0c3osIG91dGFsbG9jOworCWNoYXIgKm91dCwgKm91dHBvczsKKwlpY29udl9pYnAgY3A7CisKKwlpZiAoIWluX2VuY29kaW5nKQorCQlyZXR1cm4gTlVMTDsKKwljb252ID0gaWNvbnZfb3BlbihvdXRfZW5jb2RpbmcsIGluX2VuY29kaW5nKTsKKwlpZiAoY29udiA9PSAoaWNvbnZfdCkgLTEpCisJCXJldHVybiBOVUxMOworCWluc3ogPSBzdHJsZW4oaW4pOworCW91dHN6ID0gaW5zejsKKwlvdXRhbGxvYyA9IG91dHN6ICsgMTsgLyogZm9yIHRlcm1pbmF0aW5nIE5VTCAqLworCW91dCA9IHhtYWxsb2Mob3V0YWxsb2MpOworCW91dHBvcyA9IG91dDsKKwljcCA9IChpY29udl9pYnApaW47CisKKwl3aGlsZSAoMSkgeworCQlzaXplX3QgY250ID0gaWNvbnYoY29udiwgJmNwLCAmaW5zeiwgJm91dHBvcywgJm91dHN6KTsKKworCQlpZiAoY250ID09IC0xKSB7CisJCQlzaXplX3Qgc29mYXI7CisJCQlpZiAoZXJybm8gIT0gRTJCSUcpIHsKKwkJCQlmcmVlKG91dCk7CisJCQkJaWNvbnZfY2xvc2UoY29udik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkvKiBpbnN6IGhhcyByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzLgorCQkJICogc2luY2Ugd2Ugc3RhcnRlZCBvdXRzeiB0aGUgc2FtZSBhcyBpbnN6LAorCQkJICogaXQgaXMgbGlrZWx5IHRoYXQgaW5zeiBpcyBub3QgZW5vdWdoIGZvcgorCQkJICogY29udmVydGluZyB0aGUgcmVzdC4KKwkJCSAqLworCQkJc29mYXIgPSBvdXRwb3MgLSBvdXQ7CisJCQlvdXRhbGxvYyA9IHNvZmFyICsgaW5zeiAqIDIgKyAzMjsKKwkJCW91dCA9IHhyZWFsbG9jKG91dCwgb3V0YWxsb2MpOworCQkJb3V0cG9zID0gb3V0ICsgc29mYXI7CisJCQlvdXRzeiA9IG91dGFsbG9jIC0gc29mYXIgLSAxOworCQl9CisJCWVsc2UgeworCQkJKm91dHBvcyA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCX0KKwlpY29udl9jbG9zZShjb252KTsKKwlyZXR1cm4gb3V0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS91dGY4LmggYi91dGY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkYjZmMQotLS0gL2Rldi9udWxsCisrKyBiL3V0ZjguaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIEdJVF9VVEY4X0gKKyNkZWZpbmUgR0lUX1VURjhfSAorCitpbnQgdXRmOF93aWR0aChjb25zdCBjaGFyICoqc3RhcnQpOworaW50IGlzX3V0ZjgoY29uc3QgY2hhciAqdGV4dCk7CitpbnQgaXNfZW5jb2RpbmdfdXRmOChjb25zdCBjaGFyICpuYW1lKTsKKworaW50IHByaW50X3dyYXBwZWRfdGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgaW5kZW50LCBpbnQgaW5kZW50MiwgaW50IGxlbik7CisKKyNpZm5kZWYgTk9fSUNPTlYKK2NoYXIgKnJlZW5jb2RlX3N0cmluZyhjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqb3V0X2VuY29kaW5nLCBjb25zdCBjaGFyICppbl9lbmNvZGluZyk7CisjZWxzZQorI2RlZmluZSByZWVuY29kZV9zdHJpbmcoYSxiLGMpIE5VTEwKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Zhci5jIGIvdmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4NWU1OQotLS0gL2Rldi9udWxsCisrKyBiL3Zhci5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEVyaWMgQmllZGVybWFuLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB2YXJfdXNhZ2VbXSA9ICJnaXQtdmFyIFstbCB8IDx2YXJpYWJsZT5dIjsKKworc3RydWN0IGdpdF92YXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqKCpyZWFkKShpbnQpOworfTsKK3N0YXRpYyBzdHJ1Y3QgZ2l0X3ZhciBnaXRfdmFyc1tdID0geworCXsgIkdJVF9DT01NSVRURVJfSURFTlQiLCBnaXRfY29tbWl0dGVyX2luZm8gfSwKKwl7ICJHSVRfQVVUSE9SX0lERU5UIiwgICBnaXRfYXV0aG9yX2luZm8gfSwKKwl7ICIiLCBOVUxMIH0sCit9OworCitzdGF0aWMgdm9pZCBsaXN0X3ZhcnModm9pZCkKK3sKKwlzdHJ1Y3QgZ2l0X3ZhciAqcHRyOworCWZvcihwdHIgPSBnaXRfdmFyczsgcHRyLT5yZWFkOyBwdHIrKykgeworCQlwcmludGYoIiVzPSVzXG4iLCBwdHItPm5hbWUsIHB0ci0+cmVhZCgwKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVhZF92YXIoY29uc3QgY2hhciAqdmFyKQoreworCXN0cnVjdCBnaXRfdmFyICpwdHI7CisJY29uc3QgY2hhciAqdmFsOworCXZhbCA9IE5VTEw7CisJZm9yKHB0ciA9IGdpdF92YXJzOyBwdHItPnJlYWQ7IHB0cisrKSB7CisJCWlmIChzdHJjbXAodmFyLCBwdHItPm5hbWUpID09IDApIHsKKwkJCXZhbCA9IHB0ci0+cmVhZCgxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUpCisJCXByaW50ZigiJXM9JXNcbiIsIHZhciwgdmFsdWUpOworCWVsc2UKKwkJcHJpbnRmKCIlc1xuIiwgdmFyKTsKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqdmFsOworCWlmIChhcmdjICE9IDIpIHsKKwkJdXNhZ2UodmFyX3VzYWdlKTsKKwl9CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJdmFsID0gTlVMTDsKKworCWlmIChzdHJjbXAoYXJndlsxXSwgIi1sIikgPT0gMCkgeworCQlnaXRfY29uZmlnKHNob3dfY29uZmlnKTsKKwkJbGlzdF92YXJzKCk7CisJCXJldHVybiAwOworCX0KKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJdmFsID0gcmVhZF92YXIoYXJndlsxXSk7CisJaWYgKCF2YWwpCisJCXVzYWdlKHZhcl91c2FnZSk7CisJCisJcHJpbnRmKCIlc1xuIiwgdmFsKTsKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3dyaXRlX29yX2RpZS5jIGIvd3JpdGVfb3JfZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0YmM4NQotLS0gL2Rldi9udWxsCisrKyBiL3dyaXRlX29yX2RpZS5jCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgcmVhZF9pbl9mdWxsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJY2hhciAqcCA9IGJ1ZjsKKwlzc2l6ZV90IHRvdGFsID0gMDsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3NpemVfdCBsb2FkZWQgPSB4cmVhZChmZCwgcCwgY291bnQpOworCQlpZiAobG9hZGVkIDw9IDApCisJCQlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IGxvYWRlZDsKKwkJY291bnQgLT0gbG9hZGVkOworCQlwICs9IGxvYWRlZDsKKwkJdG90YWwgKz0gbG9hZGVkOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworaW50IHdyaXRlX2luX2Z1bGwoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpwID0gYnVmOworCXNzaXplX3QgdG90YWwgPSAwOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzc2l6ZV90IHdyaXR0ZW4gPSB4d3JpdGUoZmQsIHAsIGNvdW50KTsKKwkJaWYgKHdyaXR0ZW4gPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIXdyaXR0ZW4pIHsKKwkJCWVycm5vID0gRU5PU1BDOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNvdW50IC09IHdyaXR0ZW47CisJCXAgKz0gd3JpdHRlbjsKKwkJdG90YWwgKz0gd3JpdHRlbjsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3ZvaWQgd3JpdGVfb3JfZGllKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsIGJ1ZiwgY291bnQpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRVBJUEUpCisJCQlleGl0KDApOworCQlkaWUoIndyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworaW50IHdyaXRlX29yX3doaW5lX3BpcGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqbXNnKQoreworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBidWYsIGNvdW50KSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJZXhpdCgwKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZXJyb3IgKCVzKVxuIiwKKwkJCW1zZywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB3cml0ZV9vcl93aGluZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICptc2cpCit7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsIGJ1ZiwgY291bnQpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cml0ZSBlcnJvciAoJXMpXG4iLAorCQkJbXNnLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3d0LXN0YXR1cy5jIGIvd3Qtc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZThmMQotLS0gL2Rldi9udWxsCisrKyBiL3d0LXN0YXR1cy5jCkBAIC0wLDAgKzEsMzY5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ3dC1zdGF0dXMuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKK2ludCB3dF9zdGF0dXNfdXNlX2NvbG9yID0gMDsKK3N0YXRpYyBjaGFyIHd0X3N0YXR1c19jb2xvcnNbXVtDT0xPUl9NQVhMRU5dID0geworCSIiLCAgICAgICAgIC8qIFdUX1NUQVRVU19IRUFERVI6IG5vcm1hbCAqLworCSJcMDMzWzMybSIsIC8qIFdUX1NUQVRVU19VUERBVEVEOiBncmVlbiAqLworCSJcMDMzWzMxbSIsIC8qIFdUX1NUQVRVU19DSEFOR0VEOiByZWQgKi8KKwkiXDAzM1szMW0iLCAvKiBXVF9TVEFUVVNfVU5UUkFDS0VEOiByZWQgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHVzZV9hZGRfbXNnW10gPQorInVzZSBcImdpdCBhZGQgPGZpbGU+Li4uXCIgdG8gdXBkYXRlIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQiOworc3RhdGljIGNvbnN0IGNoYXIgdXNlX2FkZF9ybV9tc2dbXSA9CisidXNlIFwiZ2l0IGFkZC9ybSA8ZmlsZT4uLi5cIiB0byB1cGRhdGUgd2hhdCB3aWxsIGJlIGNvbW1pdHRlZCI7CitzdGF0aWMgY29uc3QgY2hhciB1c2VfYWRkX3RvX2luY2x1ZGVfbXNnW10gPQorInVzZSBcImdpdCBhZGQgPGZpbGU+Li4uXCIgdG8gaW5jbHVkZSBpbiB3aGF0IHdpbGwgYmUgY29tbWl0dGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpleGNsdWRlc19maWxlOworCitzdGF0aWMgaW50IHBhcnNlX3N0YXR1c19zbG90KGNvbnN0IGNoYXIgKnZhciwgaW50IG9mZnNldCkKK3sKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mZnNldCwgImhlYWRlciIpKQorCQlyZXR1cm4gV1RfU1RBVFVTX0hFQURFUjsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mZnNldCwgInVwZGF0ZWQiKQorCQl8fCAhc3RyY2FzZWNtcCh2YXIrb2Zmc2V0LCAiYWRkZWQiKSkKKwkJcmV0dXJuIFdUX1NUQVRVU19VUERBVEVEOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2Zmc2V0LCAiY2hhbmdlZCIpKQorCQlyZXR1cm4gV1RfU1RBVFVTX0NIQU5HRUQ7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZmZzZXQsICJ1bnRyYWNrZWQiKSkKKwkJcmV0dXJuIFdUX1NUQVRVU19VTlRSQUNLRUQ7CisJZGllKCJiYWQgY29uZmlnIHZhcmlhYmxlICclcyciLCB2YXIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogY29sb3IoaW50IHNsb3QpCit7CisJcmV0dXJuIHd0X3N0YXR1c191c2VfY29sb3IgPyB3dF9zdGF0dXNfY29sb3JzW3Nsb3RdIDogIiI7Cit9CisKK3ZvaWQgd3Rfc3RhdHVzX3ByZXBhcmUoc3RydWN0IHd0X3N0YXR1cyAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmhlYWQ7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisJaGVhZCA9IHJlc29sdmVfcmVmKCJIRUFEIiwgc2hhMSwgMCwgTlVMTCk7CisJcy0+YnJhbmNoID0gaGVhZCA/IHhzdHJkdXAoaGVhZCkgOiBOVUxMOworCXMtPnJlZmVyZW5jZSA9ICJIRUFEIjsKK30KKworc3RhdGljIHZvaWQgd3Rfc3RhdHVzX3ByaW50X2NhY2hlZF9oZWFkZXIoY29uc3QgY2hhciAqcmVmZXJlbmNlKQoreworCWNvbnN0IGNoYXIgKmMgPSBjb2xvcihXVF9TVEFUVVNfSEVBREVSKTsKKwljb2xvcl9wcmludGZfbG4oYywgIiMgQ2hhbmdlcyB0byBiZSBjb21taXR0ZWQ6Iik7CisJaWYgKHJlZmVyZW5jZSkgeworCQljb2xvcl9wcmludGZfbG4oYywgIiMgICAodXNlIFwiZ2l0IHJlc2V0ICVzIDxmaWxlPi4uLlwiIHRvIHVuc3RhZ2UpIiwgcmVmZXJlbmNlKTsKKwl9IGVsc2UgeworCQljb2xvcl9wcmludGZfbG4oYywgIiMgICAodXNlIFwiZ2l0IHJtIC0tY2FjaGVkIDxmaWxlPi4uLlwiIHRvIHVuc3RhZ2UpIik7CisJfQorCWNvbG9yX3ByaW50Zl9sbihjLCAiIyIpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfaGVhZGVyKGNvbnN0IGNoYXIgKm1haW4sIGNvbnN0IGNoYXIgKnN1YikKK3sKKwljb25zdCBjaGFyICpjID0gY29sb3IoV1RfU1RBVFVTX0hFQURFUik7CisJY29sb3JfcHJpbnRmX2xuKGMsICIjICVzOiIsIG1haW4pOworCWNvbG9yX3ByaW50Zl9sbihjLCAiIyAgICglcykiLCBzdWIpOworCWNvbG9yX3ByaW50Zl9sbihjLCAiIyIpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdHJhaWxlcih2b2lkKQoreworCWNvbG9yX3ByaW50Zl9sbihjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiMiKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnF1b3RlX2NybGYoY29uc3QgY2hhciAqaW4sIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KQoreworCWNvbnN0IGNoYXIgKnNjYW47CisJY2hhciAqb3V0OworCWNvbnN0IGNoYXIgKnJldCA9IGluOworCisJZm9yIChzY2FuID0gaW4sIG91dCA9IGJ1ZjsgKnNjYW47IHNjYW4rKykgeworCQlpbnQgY2ggPSAqc2NhbjsKKwkJaW50IHF1b3RlZDsKKworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJ1xuJzoKKwkJCXF1b3RlZCA9ICduJzsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlxdW90ZWQgPSAncic7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpvdXQrKyA9IGNoOworCQkJY29udGludWU7CisJCX0KKwkJKm91dCsrID0gJ1xcJzsKKwkJKm91dCsrID0gcXVvdGVkOworCQlyZXQgPSBidWY7CisJfQorCSpvdXQgPSAnXDAnOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9maWxlcGFpcihpbnQgdCwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJY29uc3QgY2hhciAqYyA9IGNvbG9yKHQpOworCWNvbnN0IGNoYXIgKm9uZSwgKnR3bzsKKwljaGFyIG9uZWJ1ZltQQVRIX01BWF0sIHR3b2J1ZltQQVRIX01BWF07CisKKwlvbmUgPSBxdW90ZV9jcmxmKHAtPm9uZS0+cGF0aCwgb25lYnVmLCBzaXplb2Yob25lYnVmKSk7CisJdHdvID0gcXVvdGVfY3JsZihwLT50d28tPnBhdGgsIHR3b2J1Ziwgc2l6ZW9mKHR3b2J1ZikpOworCisJY29sb3JfcHJpbnRmKGNvbG9yKFdUX1NUQVRVU19IRUFERVIpLCAiI1x0Iik7CisJc3dpdGNoIChwLT5zdGF0dXMpIHsKKwljYXNlIERJRkZfU1RBVFVTX0FEREVEOgorCQljb2xvcl9wcmludGYoYywgIm5ldyBmaWxlOiAgICVzIiwgb25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCWNvbG9yX3ByaW50ZihjLCAiY29waWVkOiAgICAgJXMgLT4gJXMiLCBvbmUsIHR3byk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJY29sb3JfcHJpbnRmKGMsICJkZWxldGVkOiAgICAlcyIsIG9uZSk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfTU9ESUZJRUQ6CisJCWNvbG9yX3ByaW50ZihjLCAibW9kaWZpZWQ6ICAgJXMiLCBvbmUpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX1JFTkFNRUQ6CisJCWNvbG9yX3ByaW50ZihjLCAicmVuYW1lZDogICAgJXMgLT4gJXMiLCBvbmUsIHR3byk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfVFlQRV9DSEFOR0VEOgorCQljb2xvcl9wcmludGYoYywgInR5cGVjaGFuZ2U6ICVzIiwgb25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19VTktOT1dOOgorCQljb2xvcl9wcmludGYoYywgInVua25vd246ICAgICVzIiwgb25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19VTk1FUkdFRDoKKwkJY29sb3JfcHJpbnRmKGMsICJ1bm1lcmdlZDogICAlcyIsIG9uZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiYnVnOiB1bmhhbmRsZWQgZGlmZiBzdGF0dXMgJWMiLCBwLT5zdGF0dXMpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF91cGRhdGVkX2NiKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKwkJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd3Rfc3RhdHVzICpzID0gZGF0YTsKKwlpbnQgc2hvd25faGVhZGVyID0gMDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlpZiAocS0+cXVldWVbaV0tPnN0YXR1cyA9PSAnVScpCisJCQljb250aW51ZTsKKwkJaWYgKCFzaG93bl9oZWFkZXIpIHsKKwkJCXd0X3N0YXR1c19wcmludF9jYWNoZWRfaGVhZGVyKHMtPnJlZmVyZW5jZSk7CisJCQlzLT5jb21taXRhYmxlID0gMTsKKwkJCXNob3duX2hlYWRlciA9IDE7CisJCX0KKwkJd3Rfc3RhdHVzX3ByaW50X2ZpbGVwYWlyKFdUX1NUQVRVU19VUERBVEVELCBxLT5xdWV1ZVtpXSk7CisJfQorCWlmIChzaG93bl9oZWFkZXIpCisJCXd0X3N0YXR1c19wcmludF90cmFpbGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9jaGFuZ2VkX2NiKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3dF9zdGF0dXMgKnMgPSBkYXRhOworCWludCBpOworCWlmIChxLT5ucikgeworCQljb25zdCBjaGFyICptc2cgPSB1c2VfYWRkX21zZzsKKwkJcy0+d29ya2Rpcl9kaXJ0eSA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJaWYgKHEtPnF1ZXVlW2ldLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfREVMRVRFRCkgeworCQkJCW1zZyA9IHVzZV9hZGRfcm1fbXNnOworCQkJCWJyZWFrOworCQkJfQorCQl3dF9zdGF0dXNfcHJpbnRfaGVhZGVyKCJDaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZCIsIG1zZyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQl3dF9zdGF0dXNfcHJpbnRfZmlsZXBhaXIoV1RfU1RBVFVTX0NIQU5HRUQsIHEtPnF1ZXVlW2ldKTsKKwlpZiAocS0+bnIpCisJCXd0X3N0YXR1c19wcmludF90cmFpbGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3JlYWRfY2FjaGUoc3RydWN0IHd0X3N0YXR1cyAqcykKK3sKKwlkaXNjYXJkX2NhY2hlKCk7CisJcmVhZF9jYWNoZSgpOworfQorCit2b2lkIHd0X3N0YXR1c19wcmludF9pbml0aWFsKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJaW50IGk7CisJY2hhciBidWZbUEFUSF9NQVhdOworCisJd3RfcmVhZF9jYWNoZShzKTsKKwlpZiAoYWN0aXZlX25yKSB7CisJCXMtPmNvbW1pdGFibGUgPSAxOworCQl3dF9zdGF0dXNfcHJpbnRfY2FjaGVkX2hlYWRlcihOVUxMKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCWNvbG9yX3ByaW50Zihjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiNcdCIpOworCQljb2xvcl9wcmludGZfbG4oY29sb3IoV1RfU1RBVFVTX1VQREFURUQpLCAibmV3IGZpbGU6ICVzIiwKKwkJCQlxdW90ZV9jcmxmKGFjdGl2ZV9jYWNoZVtpXS0+bmFtZSwKKwkJCQkJICAgYnVmLCBzaXplb2YoYnVmKSkpOworCX0KKwlpZiAoYWN0aXZlX25yKQorCQl3dF9zdGF0dXNfcHJpbnRfdHJhaWxlcigpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgTlVMTCk7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIHMtPnJlZmVyZW5jZSk7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9DQUxMQkFDSzsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2sgPSB3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZF9jYjsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2tfZGF0YSA9IHM7CisJcmV2LmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSA9IDE7CisJd3RfcmVhZF9jYWNoZShzKTsKKwlydW5fZGlmZl9pbmRleCgmcmV2LCAxKTsKK30KKworc3RhdGljIHZvaWQgd3Rfc3RhdHVzX3ByaW50X2NoYW5nZWQoc3RydWN0IHd0X3N0YXR1cyAqcykKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWluaXRfcmV2aXNpb25zKCZyZXYsICIiKTsKKwlzZXR1cF9yZXZpc2lvbnMoMCwgTlVMTCwgJnJldiwgTlVMTCk7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9DQUxMQkFDSzsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2sgPSB3dF9zdGF0dXNfcHJpbnRfY2hhbmdlZF9jYjsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2tfZGF0YSA9IHM7CisJd3RfcmVhZF9jYWNoZShzKTsKKwlydW5fZGlmZl9maWxlcygmcmV2LCAwKTsKK30KKworc3RhdGljIHZvaWQgd3Rfc3RhdHVzX3ByaW50X3VudHJhY2tlZChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKwljb25zdCBjaGFyICp4OworCWludCBpOworCWludCBzaG93bl9oZWFkZXIgPSAwOworCisJbWVtc2V0KCZkaXIsIDAsIHNpemVvZihkaXIpKTsKKworCWRpci5leGNsdWRlX3Blcl9kaXIgPSAiLmdpdGlnbm9yZSI7CisJaWYgKCFzLT51bnRyYWNrZWQpIHsKKwkJZGlyLnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgPSAxOworCQlkaXIuaGlkZV9lbXB0eV9kaXJlY3RvcmllcyA9IDE7CisJfQorCXggPSBnaXRfcGF0aCgiaW5mby9leGNsdWRlIik7CisJaWYgKGZpbGVfZXhpc3RzKHgpKQorCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKCZkaXIsIHgpOworCWlmIChleGNsdWRlc19maWxlICYmIGZpbGVfZXhpc3RzKGV4Y2x1ZGVzX2ZpbGUpKQorCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKCZkaXIsIGV4Y2x1ZGVzX2ZpbGUpOworCisJcmVhZF9kaXJlY3RvcnkoJmRpciwgIi4iLCAiIiwgMCwgTlVMTCk7CisJZm9yKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspIHsKKwkJLyogY2hlY2sgZm9yIG1hdGNoaW5nIGVudHJ5LCB3aGljaCBpcyB1bm1lcmdlZDsgbGlmdGVkIGZyb20KKwkJICogYnVpbHRpbi1scy1maWxlczpzaG93X290aGVyX2ZpbGVzICovCisJCXN0cnVjdCBkaXJfZW50cnkgKmVudCA9IGRpci5lbnRyaWVzW2ldOworCQlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBlbnQtPmxlbik7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiYnVnIGluIHd0X3N0YXR1c19wcmludF91bnRyYWNrZWQiKTsKKwkJcG9zID0gLXBvcyAtIDE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgPT0gZW50LT5sZW4gJiYKKwkJCSAgICAhbWVtY21wKGNlLT5uYW1lLCBlbnQtPm5hbWUsIGVudC0+bGVuKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXNob3duX2hlYWRlcikgeworCQkJcy0+d29ya2Rpcl91bnRyYWNrZWQgPSAxOworCQkJd3Rfc3RhdHVzX3ByaW50X2hlYWRlcigiVW50cmFja2VkIGZpbGVzIiwKKwkJCQkJICAgICAgIHVzZV9hZGRfdG9faW5jbHVkZV9tc2cpOworCQkJc2hvd25faGVhZGVyID0gMTsKKwkJfQorCQljb2xvcl9wcmludGYoY29sb3IoV1RfU1RBVFVTX0hFQURFUiksICIjXHQiKTsKKwkJY29sb3JfcHJpbnRmX2xuKGNvbG9yKFdUX1NUQVRVU19VTlRSQUNLRUQpLCAiJS4qcyIsCisJCQkJZW50LT5sZW4sIGVudC0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdmVyYm9zZShzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgTlVMTCk7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIHMtPnJlZmVyZW5jZSk7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSDsKKwlyZXYuZGlmZm9wdC5kZXRlY3RfcmVuYW1lID0gMTsKKwl3dF9yZWFkX2NhY2hlKHMpOworCXJ1bl9kaWZmX2luZGV4KCZyZXYsIDEpOworfQorCit2b2lkIHd0X3N0YXR1c19wcmludChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJcy0+aXNfaW5pdGlhbCA9IGdldF9zaGExKHMtPnJlZmVyZW5jZSwgc2hhMSkgPyAxIDogMDsKKworCWlmIChzLT5icmFuY2gpIHsKKwkJY29uc3QgY2hhciAqb25fd2hhdCA9ICJPbiBicmFuY2ggIjsKKwkJY29uc3QgY2hhciAqYnJhbmNoX25hbWUgPSBzLT5icmFuY2g7CisJCWlmICghcHJlZml4Y21wKGJyYW5jaF9uYW1lLCAicmVmcy9oZWFkcy8iKSkKKwkJCWJyYW5jaF9uYW1lICs9IDExOworCQllbHNlIGlmICghc3RyY21wKGJyYW5jaF9uYW1lLCAiSEVBRCIpKSB7CisJCQlicmFuY2hfbmFtZSA9ICIiOworCQkJb25fd2hhdCA9ICJOb3QgY3VycmVudGx5IG9uIGFueSBicmFuY2guIjsKKwkJfQorCQljb2xvcl9wcmludGZfbG4oY29sb3IoV1RfU1RBVFVTX0hFQURFUiksCisJCQkiIyAlcyVzIiwgb25fd2hhdCwgYnJhbmNoX25hbWUpOworCX0KKworCWlmIChzLT5pc19pbml0aWFsKSB7CisJCWNvbG9yX3ByaW50Zl9sbihjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiMiKTsKKwkJY29sb3JfcHJpbnRmX2xuKGNvbG9yKFdUX1NUQVRVU19IRUFERVIpLCAiIyBJbml0aWFsIGNvbW1pdCIpOworCQljb2xvcl9wcmludGZfbG4oY29sb3IoV1RfU1RBVFVTX0hFQURFUiksICIjIik7CisJCXd0X3N0YXR1c19wcmludF9pbml0aWFsKHMpOworCX0KKwllbHNlIHsKKwkJd3Rfc3RhdHVzX3ByaW50X3VwZGF0ZWQocyk7CisJfQorCisJd3Rfc3RhdHVzX3ByaW50X2NoYW5nZWQocyk7CisJd3Rfc3RhdHVzX3ByaW50X3VudHJhY2tlZChzKTsKKworCWlmIChzLT52ZXJib3NlICYmICFzLT5pc19pbml0aWFsKQorCQl3dF9zdGF0dXNfcHJpbnRfdmVyYm9zZShzKTsKKwlpZiAoIXMtPmNvbW1pdGFibGUpIHsKKwkJaWYgKHMtPmFtZW5kKQorCQkJcHJpbnRmKCIjIE5vIGNoYW5nZXNcbiIpOworCQllbHNlIGlmIChzLT53b3JrZGlyX2RpcnR5KQorCQkJcHJpbnRmKCJubyBjaGFuZ2VzIGFkZGVkIHRvIGNvbW1pdCAodXNlIFwiZ2l0IGFkZFwiIGFuZC9vciBcImdpdCBjb21taXQgLWFcIilcbiIpOworCQllbHNlIGlmIChzLT53b3JrZGlyX3VudHJhY2tlZCkKKwkJCXByaW50Zigibm90aGluZyBhZGRlZCB0byBjb21taXQgYnV0IHVudHJhY2tlZCBmaWxlcyBwcmVzZW50ICh1c2UgXCJnaXQgYWRkXCIgdG8gdHJhY2spXG4iKTsKKwkJZWxzZSBpZiAocy0+aXNfaW5pdGlhbCkKKwkJCXByaW50Zigibm90aGluZyB0byBjb21taXQgKGNyZWF0ZS9jb3B5IGZpbGVzIGFuZCB1c2UgXCJnaXQgYWRkXCIgdG8gdHJhY2spXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJub3RoaW5nIHRvIGNvbW1pdCAod29ya2luZyBkaXJlY3RvcnkgY2xlYW4pXG4iKTsKKwl9Cit9CisKK2ludCBnaXRfc3RhdHVzX2NvbmZpZyhjb25zdCBjaGFyICprLCBjb25zdCBjaGFyICp2KQoreworCWlmICghc3RyY21wKGssICJzdGF0dXMuY29sb3IiKSB8fCAhc3RyY21wKGssICJjb2xvci5zdGF0dXMiKSkgeworCQl3dF9zdGF0dXNfdXNlX2NvbG9yID0gZ2l0X2NvbmZpZ19jb2xvcmJvb2woaywgdik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcChrLCAic3RhdHVzLmNvbG9yLiIpIHx8ICFwcmVmaXhjbXAoaywgImNvbG9yLnN0YXR1cy4iKSkgeworCQlpbnQgc2xvdCA9IHBhcnNlX3N0YXR1c19zbG90KGssIDEzKTsKKwkJY29sb3JfcGFyc2Uodiwgaywgd3Rfc3RhdHVzX2NvbG9yc1tzbG90XSk7CisJfQorCWlmICghc3RyY21wKGssICJjb3JlLmV4Y2x1ZGVzZmlsZSIpKSB7CisJCWlmICghdikKKwkJCWRpZSgiY29yZS5leGNsdWRlc2ZpbGUgd2l0aG91dCB2YWx1ZSIpOworCQlleGNsdWRlc19maWxlID0geHN0cmR1cCh2KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcoaywgdik7Cit9CmRpZmYgLS1naXQgYS93dC1zdGF0dXMuaCBiL3d0LXN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWE0YWUKLS0tIC9kZXYvbnVsbAorKysgYi93dC1zdGF0dXMuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIFNUQVRVU19ICisjZGVmaW5lIFNUQVRVU19ICisKK2VudW0gY29sb3Jfd3Rfc3RhdHVzIHsKKwlXVF9TVEFUVVNfSEVBREVSLAorCVdUX1NUQVRVU19VUERBVEVELAorCVdUX1NUQVRVU19DSEFOR0VELAorCVdUX1NUQVRVU19VTlRSQUNLRUQsCit9OworCitzdHJ1Y3Qgd3Rfc3RhdHVzIHsKKwlpbnQgaXNfaW5pdGlhbDsKKwljaGFyICpicmFuY2g7CisJY29uc3QgY2hhciAqcmVmZXJlbmNlOworCWludCB2ZXJib3NlOworCWludCBhbWVuZDsKKwlpbnQgdW50cmFja2VkOworCS8qIFRoZXNlIGFyZSBjb21wdXRlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiB0aGUgaW5kaXZpZHVhbCBzZWN0aW9ucyAqLworCWludCBjb21taXRhYmxlOworCWludCB3b3JrZGlyX2RpcnR5OworCWludCB3b3JrZGlyX3VudHJhY2tlZDsKK307CisKK2ludCBnaXRfc3RhdHVzX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3ZvaWQgd3Rfc3RhdHVzX3ByZXBhcmUoc3RydWN0IHd0X3N0YXR1cyAqcyk7Cit2b2lkIHd0X3N0YXR1c19wcmludChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKTsKKworI2VuZGlmIC8qIFNUQVRVU19IICovCmRpZmYgLS1naXQgYS94ZGlmZi1pbnRlcmZhY2UuYyBiL3hkaWZmLWludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2JiODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDEzMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNoYXIgKipjcF9wLCBpbnQgKm51bV9wKQoreworCWNoYXIgKmNwID0gKmNwX3A7CisJaW50IG51bSA9IDA7CisJaW50IHJlYWRfc29tZTsKKworCXdoaWxlICgnMCcgPD0gKmNwICYmICpjcCA8PSAnOScpCisJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJaWYgKCEocmVhZF9zb21lID0gY3AgLSAqY3BfcCkpCisJCXJldHVybiAtMTsKKwkqY3BfcCA9IGNwOworCSpudW1fcCA9IG51bTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2h1bmtfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sCisJCSAgICAgIGludCAqb2IsIGludCAqb24sCisJCSAgICAgIGludCAqbmIsIGludCAqbm4pCit7CisJY2hhciAqY3A7CisJY3AgPSBsaW5lICsgNDsKKwlpZiAocGFyc2VfbnVtKCZjcCwgb2IpKSB7CisJYmFkX2xpbmU6CisJCXJldHVybiBlcnJvcigibWFsZm9ybWVkIGRpZmYgb3V0cHV0OiAlcyIsIGxpbmUpOworCX0KKwlpZiAoKmNwID09ICcsJykgeworCQljcCsrOworCQlpZiAocGFyc2VfbnVtKCZjcCwgb24pKQorCQkJZ290byBiYWRfbGluZTsKKwl9CisJZWxzZQorCQkqb24gPSAxOworCWlmICgqY3ArKyAhPSAnICcgfHwgKmNwKysgIT0gJysnKQorCQlnb3RvIGJhZF9saW5lOworCWlmIChwYXJzZV9udW0oJmNwLCBuYikpCisJCWdvdG8gYmFkX2xpbmU7CisJaWYgKCpjcCA9PSAnLCcpIHsKKwkJY3ArKzsKKwkJaWYgKHBhcnNlX251bSgmY3AsIG5uKSkKKwkJCWdvdG8gYmFkX2xpbmU7CisJfQorCWVsc2UKKwkJKm5uID0gMTsKKwlyZXR1cm4gLSEhbWVtY21wKGNwLCAiIEBAIiwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnN1bWVfb25lKHZvaWQgKnByaXZfLCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgKnByaXYgPSBwcml2XzsKKwljaGFyICplcDsKKwl3aGlsZSAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIHRoaXNfc2l6ZTsKKwkJZXAgPSBtZW1jaHIocywgJ1xuJywgc2l6ZSk7CisJCXRoaXNfc2l6ZSA9IChlcCA9PSBOVUxMKSA/IHNpemUgOiAoZXAgLSBzICsgMSk7CisJCXByaXYtPmNvbnN1bWUocHJpdiwgcywgdGhpc19zaXplKTsKKwkJc2l6ZSAtPSB0aGlzX3NpemU7CisJCXMgKz0gdGhpc19zaXplOworCX0KK30KKworaW50IHhkaWZmX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSAqcHJpdiA9IHByaXZfOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykgeworCQlpZiAobWJbaV0ucHRyW21iW2ldLnNpemUtMV0gIT0gJ1xuJykgeworCQkJLyogSW5jb21wbGV0ZSBsaW5lICovCisJCQlwcml2LT5yZW1haW5kZXIgPSB4cmVhbGxvYyhwcml2LT5yZW1haW5kZXIsCisJCQkJCQkgICBwcml2LT5yZW1haW5kZXJfc2l6ZSArCisJCQkJCQkgICBtYltpXS5zaXplKTsKKwkJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJCSAgICAgICBtYltpXS5wdHIsIG1iW2ldLnNpemUpOworCQkJcHJpdi0+cmVtYWluZGVyX3NpemUgKz0gbWJbaV0uc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogd2UgaGF2ZSBhIGNvbXBsZXRlIGxpbmUgKi8KKwkJaWYgKCFwcml2LT5yZW1haW5kZXIpIHsKKwkJCWNvbnN1bWVfb25lKHByaXYsIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcml2LT5yZW1haW5kZXIgPSB4cmVhbGxvYyhwcml2LT5yZW1haW5kZXIsCisJCQkJCSAgIHByaXYtPnJlbWFpbmRlcl9zaXplICsKKwkJCQkJICAgbWJbaV0uc2l6ZSk7CisJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJICAgICAgIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCWNvbnN1bWVfb25lKHByaXYsIHByaXYtPnJlbWFpbmRlciwKKwkJCSAgICBwcml2LT5yZW1haW5kZXJfc2l6ZSArIG1iW2ldLnNpemUpOworCQlmcmVlKHByaXYtPnJlbWFpbmRlcik7CisJCXByaXYtPnJlbWFpbmRlciA9IE5VTEw7CisJCXByaXYtPnJlbWFpbmRlcl9zaXplID0gMDsKKwl9CisJaWYgKHByaXYtPnJlbWFpbmRlcikgeworCQljb25zdW1lX29uZShwcml2LCBwcml2LT5yZW1haW5kZXIsIHByaXYtPnJlbWFpbmRlcl9zaXplKTsKKwkJZnJlZShwcml2LT5yZW1haW5kZXIpOworCQlwcml2LT5yZW1haW5kZXIgPSBOVUxMOworCQlwcml2LT5yZW1haW5kZXJfc2l6ZSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF9tbWZpbGUobW1maWxlX3QgKnB0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJRklMRSAqZjsKKwlzaXplX3Qgc3o7CisKKwlpZiAoc3RhdChmaWxlbmFtZSwgJnN0KSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgc3RhdCAlcyIsIGZpbGVuYW1lKTsKKwlpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IG9wZW4gJXMiLCBmaWxlbmFtZSk7CisJc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCXB0ci0+cHRyID0geG1hbGxvYyhzeik7CisJaWYgKGZyZWFkKHB0ci0+cHRyLCBzeiwgMSwgZikgIT0gMSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsIGZpbGVuYW1lKTsKKwlmY2xvc2UoZik7CisJcHRyLT5zaXplID0gc3o7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRklSU1RfRkVXX0JZVEVTIDgwMDAKK2ludCBidWZmZXJfaXNfYmluYXJ5KGNvbnN0IGNoYXIgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChGSVJTVF9GRVdfQllURVMgPCBzaXplKQorCQlzaXplID0gRklSU1RfRkVXX0JZVEVTOworCXJldHVybiAhIW1lbWNocihwdHIsIDAsIHNpemUpOworfQorCisKZGlmZiAtLWdpdCBhL3hkaWZmLWludGVyZmFjZS5oIGIveGRpZmYtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ZjRlNAotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgWERJRkZfSU5URVJGQUNFX0gKKyNkZWZpbmUgWERJRkZfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgInhkaWZmL3hkaWZmLmgiCisKK3N0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlOworCit0eXBlZGVmIHZvaWQgKCp4ZGlmZl9lbWl0X2NvbnN1bWVfZm4pKHZvaWQgKiwgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKKworc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeworCXhkaWZmX2VtaXRfY29uc3VtZV9mbiBjb25zdW1lOworCWNoYXIgKnJlbWFpbmRlcjsKKwl1bnNpZ25lZCBsb25nIHJlbWFpbmRlcl9zaXplOworfTsKKworaW50IHhkaWZmX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1Zik7CitpbnQgcGFyc2VfaHVua19oZWFkZXIoY2hhciAqbGluZSwgaW50IGxlbiwKKwkJICAgICAgaW50ICpvYiwgaW50ICpvbiwKKwkJICAgICAgaW50ICpuYiwgaW50ICpubik7CitpbnQgcmVhZF9tbWZpbGUobW1maWxlX3QgKnB0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IGJ1ZmZlcl9pc19iaW5hcnkoY29uc3QgY2hhciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3hkaWZmL3hkaWZmLmggYi94ZGlmZi94ZGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzRhN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZi5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGX0gpCisjZGVmaW5lIFhESUZGX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiAjaWZkZWYgX19jcGx1c3BsdXMgKi8KKworCisjZGVmaW5lIFhERl9ORUVEX01JTklNQUwgKDEgPDwgMSkKKyNkZWZpbmUgWERGX0lHTk9SRV9XSElURVNQQUNFICgxIDw8IDIpCisjZGVmaW5lIFhERl9JR05PUkVfV0hJVEVTUEFDRV9DSEFOR0UgKDEgPDwgMykKKyNkZWZpbmUgWERGX0lHTk9SRV9XSElURVNQQUNFX0FUX0VPTCAoMSA8PCA0KQorI2RlZmluZSBYREZfV0hJVEVTUEFDRV9GTEFHUyAoWERGX0lHTk9SRV9XSElURVNQQUNFIHwgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRSB8IFhERl9JR05PUkVfV0hJVEVTUEFDRV9BVF9FT0wpCisKKyNkZWZpbmUgWERMX1BBVENIX05PUk1BTCAnLScKKyNkZWZpbmUgWERMX1BBVENIX1JFVkVSU0UgJysnCisjZGVmaW5lIFhETF9QQVRDSF9NT0RFTUFTSyAoKDEgPDwgOCkgLSAxKQorI2RlZmluZSBYRExfUEFUQ0hfSUdOT1JFQlNQQUNFICgxIDw8IDgpCisKKyNkZWZpbmUgWERMX0VNSVRfRlVOQ05BTUVTICgxIDw8IDApCisjZGVmaW5lIFhETF9FTUlUX0NPTU1PTiAoMSA8PCAxKQorCisjZGVmaW5lIFhETF9NTUJfUkVBRE9OTFkgKDEgPDwgMCkKKworI2RlZmluZSBYRExfTU1GX0FUT01JQyAoMSA8PCAwKQorCisjZGVmaW5lIFhETF9CRE9QX0lOUyAxCisjZGVmaW5lIFhETF9CRE9QX0NQWSAyCisjZGVmaW5lIFhETF9CRE9QX0lOU0IgMworCisjZGVmaW5lIFhETF9NRVJHRV9NSU5JTUFMIDAKKyNkZWZpbmUgWERMX01FUkdFX0VBR0VSIDEKKyNkZWZpbmUgWERMX01FUkdFX1pFQUxPVVMgMgorCit0eXBlZGVmIHN0cnVjdCBzX21tZmlsZSB7CisJY2hhciAqcHRyOworCWxvbmcgc2l6ZTsKK30gbW1maWxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfbW1idWZmZXIgeworCWNoYXIgKnB0cjsKKwlsb25nIHNpemU7Cit9IG1tYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeHBwYXJhbSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK30geHBwYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZW1pdGNiIHsKKwl2b2lkICpwcml2OworCWludCAoKm91dGYpKHZvaWQgKiwgbW1idWZmZXJfdCAqLCBpbnQpOworfSB4ZGVtaXRjYl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZW1pdGNvbmYgeworCWxvbmcgY3R4bGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9IHhkZW1pdGNvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19iZGlmZnBhcmFtIHsKKwlsb25nIGJzaXplOworfSBiZGlmZnBhcmFtX3Q7CisKKworI2RlZmluZSB4ZGxfbWFsbG9jKHgpIG1hbGxvYyh4KQorI2RlZmluZSB4ZGxfZnJlZShwdHIpIGZyZWUocHRyKQorI2RlZmluZSB4ZGxfcmVhbGxvYyhwdHIseCkgcmVhbGxvYyhwdHIseCkKKwordm9pZCAqeGRsX21tZmlsZV9maXJzdChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKTsKK3ZvaWQgKnhkbF9tbWZpbGVfbmV4dChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKTsKK2xvbmcgeGRsX21tZmlsZV9zaXplKG1tZmlsZV90ICptbWYpOworCitpbnQgeGRsX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJICAgICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnLCB4ZGVtaXRjYl90ICplY2IpOworCitpbnQgeGRsX21lcmdlKG1tZmlsZV90ICpvcmlnLCBtbWZpbGVfdCAqbWYxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJbW1maWxlX3QgKm1mMiwgY29uc3QgY2hhciAqbmFtZTIsCisJCXhwcGFyYW1fdCBjb25zdCAqeHBwLCBpbnQgbGV2ZWwsIG1tYnVmZmVyX3QgKnJlc3VsdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qICNpZmRlZiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhESUZGX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hkaWZmaS5jIGIveGRpZmYveGRpZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlZWJjNAotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hkaWZmaS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKyNkZWZpbmUgWERMX01BWF9DT1NUX01JTiAyNTYKKyNkZWZpbmUgWERMX0hFVVJfTUlOX0NPU1QgMjU2CisjZGVmaW5lIFhETF9MSU5FX01BWCAobG9uZykoKDFVTCA8PCAoOCAqIHNpemVvZihsb25nKSAtIDEpKSAtIDEpCisjZGVmaW5lIFhETF9TTkFLRV9DTlQgMjAKKyNkZWZpbmUgWERMX0tfSEVVUiA0CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3hkcHNwbGl0IHsKKwlsb25nIGkxLCBpMjsKKwlpbnQgbWluX2xvLCBtaW5faGk7Cit9IHhkcHNwbGl0X3Q7CisKKworCisKK3N0YXRpYyBsb25nIHhkbF9zcGxpdCh1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTIsIGxvbmcgb2ZmMiwgbG9uZyBsaW0yLAorCQkgICAgICBsb25nICprdmRmLCBsb25nICprdmRiLCBpbnQgbmVlZF9taW4sIHhkcHNwbGl0X3QgKnNwbCwKKwkJICAgICAgeGRhbGdvZW52X3QgKnhlbnYpOworc3RhdGljIHhkY2hhbmdlX3QgKnhkbF9hZGRfY2hhbmdlKHhkY2hhbmdlX3QgKnhzY3IsIGxvbmcgaTEsIGxvbmcgaTIsIGxvbmcgY2hnMSwgbG9uZyBjaGcyKTsKKworCisKKworCisvKgorICogU2VlICJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnMiLCBieSBFdWdlbmUgTXllcnMuCisgKiBCYXNpY2FsbHkgY29uc2lkZXJzIGEgImJveCIgKG9mZjEsIG9mZjIsIGxpbTEsIGxpbTIpIGFuZCBzY2FuIGZyb20gYm90aAorICogdGhlIGZvcndhcmQgZGlhZ29uYWwgc3RhcnRpbmcgZnJvbSAob2ZmMSwgb2ZmMikgYW5kIHRoZSBiYWNrd2FyZCBkaWFnb25hbAorICogc3RhcnRpbmcgZnJvbSAobGltMSwgbGltMikuIElmIHRoZSBLIHZhbHVlcyBvbiB0aGUgc2FtZSBkaWFnb25hbCBjcm9zc2VzCisgKiByZXR1cm5zIHRoZSBmdXJ0aGVzdCBwb2ludCBvZiByZWFjaC4gV2UgbWlnaHQgZW5kIHVwIGhhdmluZyB0byBleHBlbnNpdmUKKyAqIGNhc2VzIHVzaW5nIHRoaXMgYWxnb3JpdGhtIGlzIGZ1bGwsIHNvIGEgbGl0dGxlIGJpdCBvZiBoZXVyaXN0aWMgaXMgbmVlZGVkCisgKiB0byBjdXQgdGhlIHNlYXJjaCBhbmQgdG8gcmV0dXJuIGEgc3Vib3B0aW1hbCBwb2ludC4KKyAqLworc3RhdGljIGxvbmcgeGRsX3NwbGl0KHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMiwgbG9uZyBvZmYyLCBsb25nIGxpbTIsCisJCSAgICAgIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRwc3BsaXRfdCAqc3BsLAorCQkgICAgICB4ZGFsZ29lbnZfdCAqeGVudikgeworCWxvbmcgZG1pbiA9IG9mZjEgLSBsaW0yLCBkbWF4ID0gbGltMSAtIG9mZjI7CisJbG9uZyBmbWlkID0gb2ZmMSAtIG9mZjIsIGJtaWQgPSBsaW0xIC0gbGltMjsKKwlsb25nIG9kZCA9IChmbWlkIC0gYm1pZCkgJiAxOworCWxvbmcgZm1pbiA9IGZtaWQsIGZtYXggPSBmbWlkOworCWxvbmcgYm1pbiA9IGJtaWQsIGJtYXggPSBibWlkOworCWxvbmcgZWMsIGQsIGkxLCBpMiwgcHJldjEsIGJlc3QsIGRkLCB2LCBrOworCisJLyoKKwkgKiBTZXQgaW5pdGlhbCBkaWFnb25hbCB2YWx1ZXMgZm9yIGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmQgcGF0aC4KKwkgKi8KKwlrdmRmW2ZtaWRdID0gb2ZmMTsKKwlrdmRiW2JtaWRdID0gbGltMTsKKworCWZvciAoZWMgPSAxOzsgZWMrKykgeworCQlpbnQgZ290X3NuYWtlID0gMDsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGV4dGVudCB0aGUgZGlhZ29uYWwgImRvbWFpbiIgYnkgb25lLiBJZiB0aGUgbmV4dAorCQkgKiB2YWx1ZXMgZXhpdHMgdGhlIGJveCBib3VuZGFyaWVzIHdlIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZQorCQkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gYmVjYXVzZSAobWF4IC0gbWluKSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorCQkgKiBBbHNvIHdlIGluaXRpYWxpemUgdGhlIGV4dGVybmFsIEsgdmFsdWUgdG8gLTEgc28gdGhhdCB3ZSBjYW4KKwkJICogYXZvaWQgZXh0cmEgY29uZGl0aW9ucyBjaGVjayBpbnNpZGUgdGhlIGNvcmUgbG9vcC4KKwkJICovCisJCWlmIChmbWluID4gZG1pbikKKwkJCWt2ZGZbLS1mbWluIC0gMV0gPSAtMTsKKwkJZWxzZQorCQkJKytmbWluOworCQlpZiAoZm1heCA8IGRtYXgpCisJCQlrdmRmWysrZm1heCArIDFdID0gLTE7CisJCWVsc2UKKwkJCS0tZm1heDsKKworCQlmb3IgKGQgPSBmbWF4OyBkID49IGZtaW47IGQgLT0gMikgeworCQkJaWYgKGt2ZGZbZCAtIDFdID49IGt2ZGZbZCArIDFdKQorCQkJCWkxID0ga3ZkZltkIC0gMV0gKyAxOworCQkJZWxzZQorCQkJCWkxID0ga3ZkZltkICsgMV07CisJCQlwcmV2MSA9IGkxOworCQkJaTIgPSBpMSAtIGQ7CisJCQlmb3IgKDsgaTEgPCBsaW0xICYmIGkyIDwgbGltMiAmJiBoYTFbaTFdID09IGhhMltpMl07IGkxKyssIGkyKyspOworCQkJaWYgKGkxIC0gcHJldjEgPiB4ZW52LT5zbmFrZV9jbnQpCisJCQkJZ290X3NuYWtlID0gMTsKKwkJCWt2ZGZbZF0gPSBpMTsKKwkJCWlmIChvZGQgJiYgYm1pbiA8PSBkICYmIGQgPD0gYm1heCAmJiBrdmRiW2RdIDw9IGkxKSB7CisJCQkJc3BsLT5pMSA9IGkxOworCQkJCXNwbC0+aTIgPSBpMjsKKwkJCQlzcGwtPm1pbl9sbyA9IHNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGV4dGVudCB0aGUgZGlhZ29uYWwgImRvbWFpbiIgYnkgb25lLiBJZiB0aGUgbmV4dAorCQkgKiB2YWx1ZXMgZXhpdHMgdGhlIGJveCBib3VuZGFyaWVzIHdlIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZQorCQkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gYmVjYXVzZSAobWF4IC0gbWluKSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorCQkgKiBBbHNvIHdlIGluaXRpYWxpemUgdGhlIGV4dGVybmFsIEsgdmFsdWUgdG8gLTEgc28gdGhhdCB3ZSBjYW4KKwkJICogYXZvaWQgZXh0cmEgY29uZGl0aW9ucyBjaGVjayBpbnNpZGUgdGhlIGNvcmUgbG9vcC4KKwkJICovCisJCWlmIChibWluID4gZG1pbikKKwkJCWt2ZGJbLS1ibWluIC0gMV0gPSBYRExfTElORV9NQVg7CisJCWVsc2UKKwkJCSsrYm1pbjsKKwkJaWYgKGJtYXggPCBkbWF4KQorCQkJa3ZkYlsrK2JtYXggKyAxXSA9IFhETF9MSU5FX01BWDsKKwkJZWxzZQorCQkJLS1ibWF4OworCisJCWZvciAoZCA9IGJtYXg7IGQgPj0gYm1pbjsgZCAtPSAyKSB7CisJCQlpZiAoa3ZkYltkIC0gMV0gPCBrdmRiW2QgKyAxXSkKKwkJCQlpMSA9IGt2ZGJbZCAtIDFdOworCQkJZWxzZQorCQkJCWkxID0ga3ZkYltkICsgMV0gLSAxOworCQkJcHJldjEgPSBpMTsKKwkJCWkyID0gaTEgLSBkOworCQkJZm9yICg7IGkxID4gb2ZmMSAmJiBpMiA+IG9mZjIgJiYgaGExW2kxIC0gMV0gPT0gaGEyW2kyIC0gMV07IGkxLS0sIGkyLS0pOworCQkJaWYgKHByZXYxIC0gaTEgPiB4ZW52LT5zbmFrZV9jbnQpCisJCQkJZ290X3NuYWtlID0gMTsKKwkJCWt2ZGJbZF0gPSBpMTsKKwkJCWlmICghb2RkICYmIGZtaW4gPD0gZCAmJiBkIDw9IGZtYXggJiYgaTEgPD0ga3ZkZltkXSkgeworCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQlzcGwtPmkyID0gaTI7CisJCQkJc3BsLT5taW5fbG8gPSBzcGwtPm1pbl9oaSA9IDE7CisJCQkJcmV0dXJuIGVjOworCQkJfQorCQl9CisKKwkJaWYgKG5lZWRfbWluKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgdGhlIGVkaXQgY29zdCBpcyBhYm92ZSB0aGUgaGV1cmlzdGljIHRyaWdnZXIgYW5kIGlmCisJCSAqIHdlIGdvdCBhIGdvb2Qgc25ha2UsIHdlIHNhbXBsZSBjdXJyZW50IGRpYWdvbmFscyB0byBzZWUKKwkJICogaWYgc29tZSBvZiB0aGUsIGhhdmUgcmVhY2hlZCBhbiAiaW50ZXJlc3RpbmciIHBhdGguIE91cgorCQkgKiBtZWFzdXJlIGlzIGEgZnVuY3Rpb24gb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGRpYWdvbmFsCisJCSAqIGNvcm5lciAoaTEgKyBpMikgcGVuYWxpemVkIHdpdGggdGhlIGRpc3RhbmNlIGZyb20gdGhlCisJCSAqIG1pZCBkaWFnb25hbCBpdHNlbGYuIElmIHRoaXMgdmFsdWUgaXMgYWJvdmUgdGhlIGN1cnJlbnQKKwkJICogZWRpdCBjb3N0IHRpbWVzIGEgbWFnaWMgZmFjdG9yIChYRExfS19IRVVSKSB3ZSBjb25zaWRlcgorCQkgKiBpdCBpbnRlcmVzdGluZy4KKwkJICovCisJCWlmIChnb3Rfc25ha2UgJiYgZWMgPiB4ZW52LT5oZXVyX21pbikgeworCQkJZm9yIChiZXN0ID0gMCwgZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQkJZGQgPSBkID4gZm1pZCA/IGQgLSBmbWlkOiBmbWlkIC0gZDsKKwkJCQlpMSA9IGt2ZGZbZF07CisJCQkJaTIgPSBpMSAtIGQ7CisJCQkJdiA9IChpMSAtIG9mZjEpICsgKGkyIC0gb2ZmMikgLSBkZDsKKworCQkJCWlmICh2ID4gWERMX0tfSEVVUiAqIGVjICYmIHYgPiBiZXN0ICYmCisJCQkJICAgIG9mZjEgKyB4ZW52LT5zbmFrZV9jbnQgPD0gaTEgJiYgaTEgPCBsaW0xICYmCisJCQkJICAgIG9mZjIgKyB4ZW52LT5zbmFrZV9jbnQgPD0gaTIgJiYgaTIgPCBsaW0yKSB7CisJCQkJCWZvciAoayA9IDE7IGhhMVtpMSAtIGtdID09IGhhMltpMiAtIGtdOyBrKyspCisJCQkJCQlpZiAoayA9PSB4ZW52LT5zbmFrZV9jbnQpIHsKKwkJCQkJCQliZXN0ID0gdjsKKwkJCQkJCQlzcGwtPmkxID0gaTE7CisJCQkJCQkJc3BsLT5pMiA9IGkyOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChiZXN0ID4gMCkgeworCQkJCXNwbC0+bWluX2xvID0gMTsKKwkJCQlzcGwtPm1pbl9oaSA9IDA7CisJCQkJcmV0dXJuIGVjOworCQkJfQorCisJCQlmb3IgKGJlc3QgPSAwLCBkID0gYm1heDsgZCA+PSBibWluOyBkIC09IDIpIHsKKwkJCQlkZCA9IGQgPiBibWlkID8gZCAtIGJtaWQ6IGJtaWQgLSBkOworCQkJCWkxID0ga3ZkYltkXTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQl2ID0gKGxpbTEgLSBpMSkgKyAobGltMiAtIGkyKSAtIGRkOworCisJCQkJaWYgKHYgPiBYRExfS19IRVVSICogZWMgJiYgdiA+IGJlc3QgJiYKKwkJCQkgICAgb2ZmMSA8IGkxICYmIGkxIDw9IGxpbTEgLSB4ZW52LT5zbmFrZV9jbnQgJiYKKwkJCQkgICAgb2ZmMiA8IGkyICYmIGkyIDw9IGxpbTIgLSB4ZW52LT5zbmFrZV9jbnQpIHsKKwkJCQkJZm9yIChrID0gMDsgaGExW2kxICsga10gPT0gaGEyW2kyICsga107IGsrKykKKwkJCQkJCWlmIChrID09IHhlbnYtPnNuYWtlX2NudCAtIDEpIHsKKwkJCQkJCQliZXN0ID0gdjsKKwkJCQkJCQlzcGwtPmkxID0gaTE7CisJCQkJCQkJc3BsLT5pMiA9IGkyOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChiZXN0ID4gMCkgeworCQkJCXNwbC0+bWluX2xvID0gMDsKKwkJCQlzcGwtPm1pbl9oaSA9IDE7CisJCQkJcmV0dXJuIGVjOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogRW5vdWdoIGlzIGVub3VnaC4gV2Ugc3BlbnQgdG9vIG11Y2ggdGltZSBoZXJlIGFuZCBub3cgd2UgY29sbGVjdAorCQkgKiB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcGF0aCB1c2luZyB0aGUgKGkxICsgaTIpIG1lYXN1cmUuCisJCSAqLworCQlpZiAoZWMgPj0geGVudi0+bXhjb3N0KSB7CisJCQlsb25nIGZiZXN0LCBmYmVzdDEsIGJiZXN0LCBiYmVzdDE7CisKKwkJCWZiZXN0ID0gZmJlc3QxID0gLTE7CisJCQlmb3IgKGQgPSBmbWF4OyBkID49IGZtaW47IGQgLT0gMikgeworCQkJCWkxID0gWERMX01JTihrdmRmW2RdLCBsaW0xKTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQlpZiAobGltMiA8IGkyKQorCQkJCQlpMSA9IGxpbTIgKyBkLCBpMiA9IGxpbTI7CisJCQkJaWYgKGZiZXN0IDwgaTEgKyBpMikgeworCQkJCQlmYmVzdCA9IGkxICsgaTI7CisJCQkJCWZiZXN0MSA9IGkxOworCQkJCX0KKwkJCX0KKworCQkJYmJlc3QgPSBiYmVzdDEgPSBYRExfTElORV9NQVg7CisJCQlmb3IgKGQgPSBibWF4OyBkID49IGJtaW47IGQgLT0gMikgeworCQkJCWkxID0gWERMX01BWChvZmYxLCBrdmRiW2RdKTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQlpZiAoaTIgPCBvZmYyKQorCQkJCQlpMSA9IG9mZjIgKyBkLCBpMiA9IG9mZjI7CisJCQkJaWYgKGkxICsgaTIgPCBiYmVzdCkgeworCQkJCQliYmVzdCA9IGkxICsgaTI7CisJCQkJCWJiZXN0MSA9IGkxOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChsaW0xICsgbGltMikgLSBiYmVzdCA8IGZiZXN0IC0gKG9mZjEgKyBvZmYyKSkgeworCQkJCXNwbC0+aTEgPSBmYmVzdDE7CisJCQkJc3BsLT5pMiA9IGZiZXN0IC0gZmJlc3QxOworCQkJCXNwbC0+bWluX2xvID0gMTsKKwkJCQlzcGwtPm1pbl9oaSA9IDA7CisJCQl9IGVsc2UgeworCQkJCXNwbC0+aTEgPSBiYmVzdDE7CisJCQkJc3BsLT5pMiA9IGJiZXN0IC0gYmJlc3QxOworCQkJCXNwbC0+bWluX2xvID0gMDsKKwkJCQlzcGwtPm1pbl9oaSA9IDE7CisJCQl9CisJCQlyZXR1cm4gZWM7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFJ1bGU6ICJEaXZpZGUgZXQgSW1wZXJhIi4gUmVjdXJzaXZlbHkgc3BsaXQgdGhlIGJveCBpbiBzdWItYm94ZXMgYnkgY2FsbGluZworICogdGhlIGJveCBzcGxpdHRpbmcgZnVuY3Rpb24uIE5vdGUgdGhhdCB0aGUgcmVhbCBqb2IgKG1hcmtpbmcgY2hhbmdlZCBsaW5lcykKKyAqIGlzIGRvbmUgaW4gdGhlIHR3byBib3VuZGFyeSByZWFjaGluZyBjaGVja3MuCisgKi8KK2ludCB4ZGxfcmVjc19jbXAoZGlmZmRhdGFfdCAqZGQxLCBsb25nIG9mZjEsIGxvbmcgbGltMSwKKwkJIGRpZmZkYXRhX3QgKmRkMiwgbG9uZyBvZmYyLCBsb25nIGxpbTIsCisJCSBsb25nICprdmRmLCBsb25nICprdmRiLCBpbnQgbmVlZF9taW4sIHhkYWxnb2Vudl90ICp4ZW52KSB7CisJdW5zaWduZWQgbG9uZyBjb25zdCAqaGExID0gZGQxLT5oYSwgKmhhMiA9IGRkMi0+aGE7CisKKwkvKgorCSAqIFNocmluayB0aGUgYm94IGJ5IHdhbGtpbmcgdGhyb3VnaCBlYWNoIGRpYWdvbmFsIHNuYWtlIChTVyBhbmQgTkUpLgorCSAqLworCWZvciAoOyBvZmYxIDwgbGltMSAmJiBvZmYyIDwgbGltMiAmJiBoYTFbb2ZmMV0gPT0gaGEyW29mZjJdOyBvZmYxKyssIG9mZjIrKyk7CisJZm9yICg7IG9mZjEgPCBsaW0xICYmIG9mZjIgPCBsaW0yICYmIGhhMVtsaW0xIC0gMV0gPT0gaGEyW2xpbTIgLSAxXTsgbGltMS0tLCBsaW0yLS0pOworCisJLyoKKwkgKiBJZiBvbmUgZGltZW5zaW9uIGlzIGVtcHR5LCB0aGVuIGFsbCByZWNvcmRzIG9uIHRoZSBvdGhlciBvbmUgbXVzdAorCSAqIGJlIG9idmlvdXNseSBjaGFuZ2VkLgorCSAqLworCWlmIChvZmYxID09IGxpbTEpIHsKKwkJY2hhciAqcmNoZzIgPSBkZDItPnJjaGc7CisJCWxvbmcgKnJpbmRleDIgPSBkZDItPnJpbmRleDsKKworCQlmb3IgKDsgb2ZmMiA8IGxpbTI7IG9mZjIrKykKKwkJCXJjaGcyW3JpbmRleDJbb2ZmMl1dID0gMTsKKwl9IGVsc2UgaWYgKG9mZjIgPT0gbGltMikgeworCQljaGFyICpyY2hnMSA9IGRkMS0+cmNoZzsKKwkJbG9uZyAqcmluZGV4MSA9IGRkMS0+cmluZGV4OworCisJCWZvciAoOyBvZmYxIDwgbGltMTsgb2ZmMSsrKQorCQkJcmNoZzFbcmluZGV4MVtvZmYxXV0gPSAxOworCX0gZWxzZSB7CisJCWxvbmcgZWM7CisJCXhkcHNwbGl0X3Qgc3BsOworCQlzcGwuaTEgPSBzcGwuaTIgPSAwOworCisJCS8qCisJCSAqIERpdmlkZSAuLi4KKwkJICovCisJCWlmICgoZWMgPSB4ZGxfc3BsaXQoaGExLCBvZmYxLCBsaW0xLCBoYTIsIG9mZjIsIGxpbTIsIGt2ZGYsIGt2ZGIsCisJCQkJICAgIG5lZWRfbWluLCAmc3BsLCB4ZW52KSkgPCAwKSB7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qCisJCSAqIC4uLiBldCBJbXBlcmEuCisJCSAqLworCQlpZiAoeGRsX3JlY3NfY21wKGRkMSwgb2ZmMSwgc3BsLmkxLCBkZDIsIG9mZjIsIHNwbC5pMiwKKwkJCQkga3ZkZiwga3ZkYiwgc3BsLm1pbl9sbywgeGVudikgPCAwIHx8CisJCSAgICB4ZGxfcmVjc19jbXAoZGQxLCBzcGwuaTEsIGxpbTEsIGRkMiwgc3BsLmkyLCBsaW0yLAorCQkJCSBrdmRmLCBrdmRiLCBzcGwubWluX2hpLCB4ZW52KSA8IDApIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHhkbF9kb19kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQl4ZGZlbnZfdCAqeGUpIHsKKwlsb25nIG5kaWFnczsKKwlsb25nICprdmQsICprdmRmLCAqa3ZkYjsKKwl4ZGFsZ29lbnZfdCB4ZW52OworCWRpZmZkYXRhX3QgZGQxLCBkZDI7CisKKwlpZiAoeGRsX3ByZXBhcmVfZW52KG1mMSwgbWYyLCB4cHAsIHhlKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgc2V0dXAgSyB2ZWN0b3JzIHRvIGJlIHVzZWQgYnkgdGhlIGRpZmZlcmVudGlhbCBhbGdvcml0aG0uCisJICogT25lIGlzIHRvIHN0b3JlIHRoZSBmb3J3YXJkIHBhdGggYW5kIG9uZSB0byBzdG9yZSB0aGUgYmFja3dhcmQgcGF0aC4KKwkgKi8KKwluZGlhZ3MgPSB4ZS0+eGRmMS5ucmVmZiArIHhlLT54ZGYyLm5yZWZmICsgMzsKKwlpZiAoIShrdmQgPSAobG9uZyAqKSB4ZGxfbWFsbG9jKCgyICogbmRpYWdzICsgMikgKiBzaXplb2YobG9uZykpKSkgeworCisJCXhkbF9mcmVlX2Vudih4ZSk7CisJCXJldHVybiAtMTsKKwl9CisJa3ZkZiA9IGt2ZDsKKwlrdmRiID0ga3ZkZiArIG5kaWFnczsKKwlrdmRmICs9IHhlLT54ZGYyLm5yZWZmICsgMTsKKwlrdmRiICs9IHhlLT54ZGYyLm5yZWZmICsgMTsKKworCXhlbnYubXhjb3N0ID0geGRsX2JvZ29zcXJ0KG5kaWFncyk7CisJaWYgKHhlbnYubXhjb3N0IDwgWERMX01BWF9DT1NUX01JTikKKwkJeGVudi5teGNvc3QgPSBYRExfTUFYX0NPU1RfTUlOOworCXhlbnYuc25ha2VfY250ID0gWERMX1NOQUtFX0NOVDsKKwl4ZW52LmhldXJfbWluID0gWERMX0hFVVJfTUlOX0NPU1Q7CisKKwlkZDEubnJlYyA9IHhlLT54ZGYxLm5yZWZmOworCWRkMS5oYSA9IHhlLT54ZGYxLmhhOworCWRkMS5yY2hnID0geGUtPnhkZjEucmNoZzsKKwlkZDEucmluZGV4ID0geGUtPnhkZjEucmluZGV4OworCWRkMi5ucmVjID0geGUtPnhkZjIubnJlZmY7CisJZGQyLmhhID0geGUtPnhkZjIuaGE7CisJZGQyLnJjaGcgPSB4ZS0+eGRmMi5yY2hnOworCWRkMi5yaW5kZXggPSB4ZS0+eGRmMi5yaW5kZXg7CisKKwlpZiAoeGRsX3JlY3NfY21wKCZkZDEsIDAsIGRkMS5ucmVjLCAmZGQyLCAwLCBkZDIubnJlYywKKwkJCSBrdmRmLCBrdmRiLCAoeHBwLT5mbGFncyAmIFhERl9ORUVEX01JTklNQUwpICE9IDAsICZ4ZW52KSA8IDApIHsKKworCQl4ZGxfZnJlZShrdmQpOworCQl4ZGxfZnJlZV9lbnYoeGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJeGRsX2ZyZWUoa3ZkKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB4ZGNoYW5nZV90ICp4ZGxfYWRkX2NoYW5nZSh4ZGNoYW5nZV90ICp4c2NyLCBsb25nIGkxLCBsb25nIGkyLCBsb25nIGNoZzEsIGxvbmcgY2hnMikgeworCXhkY2hhbmdlX3QgKnhjaDsKKworCWlmICghKHhjaCA9ICh4ZGNoYW5nZV90ICopIHhkbF9tYWxsb2Moc2l6ZW9mKHhkY2hhbmdlX3QpKSkpCisJCXJldHVybiBOVUxMOworCisJeGNoLT5uZXh0ID0geHNjcjsKKwl4Y2gtPmkxID0gaTE7CisJeGNoLT5pMiA9IGkyOworCXhjaC0+Y2hnMSA9IGNoZzE7CisJeGNoLT5jaGcyID0gY2hnMjsKKworCXJldHVybiB4Y2g7Cit9CisKKworaW50IHhkbF9jaGFuZ2VfY29tcGFjdCh4ZGZpbGVfdCAqeGRmLCB4ZGZpbGVfdCAqeGRmbywgbG9uZyBmbGFncykgeworCWxvbmcgaXgsIGl4bywgaXhzLCBpeHJlZiwgZ3Jwc2l6LCBucmVjID0geGRmLT5ucmVjOworCWNoYXIgKnJjaGcgPSB4ZGYtPnJjaGcsICpyY2hnbyA9IHhkZm8tPnJjaGc7CisJeHJlY29yZF90ICoqcmVjcyA9IHhkZi0+cmVjczsKKworCS8qCisJICogVGhpcyBpcyB0aGUgc2FtZSBvZiB3aGF0IEdOVSBkaWZmIGRvZXMuIE1vdmUgYmFjayBhbmQgZm9yd2FyZAorCSAqIGNoYW5nZSBncm91cHMgZm9yIGEgY29uc2lzdGVudCBhbmQgcHJldHR5IGRpZmYgb3V0cHV0LiBUaGlzIGFsc28KKwkgKiBoZWxwcyBpbiBmaW5kaW5nIGpvaW5hYmxlIGNoYW5nZSBncm91cHMgYW5kIHJlZHVjZSB0aGUgZGlmZiBzaXplLgorCSAqLworCWZvciAoaXggPSBpeG8gPSAwOzspIHsKKwkJLyoKKwkJICogRmluZCB0aGUgZmlyc3QgY2hhbmdlZCBsaW5lIGluIHRoZSB0by1iZS1jb21wYWN0ZWQgZmlsZS4KKwkJICogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGJvdGggaW5kZXhlcywgc28gaWYgd2UgZmluZCBhCisJCSAqIGNoYW5nZWQgbGluZXMgZ3JvdXAgb24gdGhlIG90aGVyIGZpbGUsIHdoaWxlIHNjYW5uaW5nIHRoZQorCQkgKiB0by1iZS1jb21wYWN0ZWQgZmlsZSwgd2UgbmVlZCB0byBza2lwIGl0IHByb3Blcmx5LiBOb3RlCisJCSAqIHRoYXQgbG9vcHMgdGhhdCBhcmUgdGVzdGluZyBmb3IgY2hhbmdlZCBsaW5lcyBvbiByY2hnKiBkbworCQkgKiBub3QgbmVlZCBpbmRleCBib3VuZGluZyBzaW5jZSB0aGUgYXJyYXkgaXMgcHJlcGFyZWQgd2l0aAorCQkgKiBhIHplcm8gYXQgcG9zaXRpb24gLTEgYW5kIE4uCisJCSAqLworCQlmb3IgKDsgaXggPCBucmVjICYmICFyY2hnW2l4XTsgaXgrKykKKwkJCXdoaWxlIChyY2hnb1tpeG8rK10pOworCQlpZiAoaXggPT0gbnJlYykKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFJlY29yZCB0aGUgc3RhcnQgb2YgYSBjaGFuZ2VkLWdyb3VwIGluIHRoZSB0by1iZS1jb21wYWN0ZWQgZmlsZQorCQkgKiBhbmQgZmluZCB0aGUgZW5kIG9mIGl0LCBvbiBib3RoIHRvLWJlLWNvbXBhY3RlZCBhbmQgb3RoZXIgZmlsZQorCQkgKiBpbmRleGVzIChpeCBhbmQgaXhvKS4KKwkJICovCisJCWl4cyA9IGl4OworCQlmb3IgKGl4Kys7IHJjaGdbaXhdOyBpeCsrKTsKKwkJZm9yICg7IHJjaGdvW2l4b107IGl4bysrKTsKKworCQlkbyB7CisJCQlncnBzaXogPSBpeCAtIGl4czsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBsaW5lIGJlZm9yZSB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIGlzIGVxdWFsIHRvCisJCQkgKiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBjdXJyZW50IGNoYW5nZSBncm91cCwgc2hpZnQgYmFja3dhcmQKKwkJCSAqIHRoZSBncm91cC4KKwkJCSAqLworCQkJd2hpbGUgKGl4cyA+IDAgJiYgcmVjc1tpeHMgLSAxXS0+aGEgPT0gcmVjc1tpeCAtIDFdLT5oYSAmJgorCQkJICAgICAgIHhkbF9yZWNtYXRjaChyZWNzW2l4cyAtIDFdLT5wdHIsIHJlY3NbaXhzIC0gMV0tPnNpemUsIHJlY3NbaXggLSAxXS0+cHRyLCByZWNzW2l4IC0gMV0tPnNpemUsIGZsYWdzKSkgeworCQkJCXJjaGdbLS1peHNdID0gMTsKKwkJCQlyY2hnWy0taXhdID0gMDsKKworCQkJCS8qCisJCQkJICogVGhpcyBjaGFuZ2UgbWlnaHQgaGF2ZSBqb2luZWQgdHdvIGNoYW5nZSBncm91cHMsCisJCQkJICogc28gd2UgdHJ5IHRvIHRha2UgdGhpcyBzY2VuYXJpbyBpbiBhY2NvdW50IGJ5IG1vdmluZworCQkJCSAqIHRoZSBzdGFydCBpbmRleCBhY2NvcmRpbmdseSAoYW5kIHNvIHRoZSBvdGhlci1maWxlCisJCQkJICogZW5kLW9mLWdyb3VwIGluZGV4KS4KKwkJCQkgKi8KKwkJCQlmb3IgKDsgcmNoZ1tpeHMgLSAxXTsgaXhzLS0pOworCQkJCXdoaWxlIChyY2hnb1stLWl4b10pOworCQkJfQorCisJCQkvKgorCQkJICogUmVjb3JkIHRoZSBlbmQtb2YtZ3JvdXAgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgbWF0Y2hlZAorCQkJICogd2l0aCBhIGdyb3VwIG9mIGNoYW5nZXMgaW4gdGhlIG90aGVyIGZpbGUgKHRoYXQgaXMsIHRoZQorCQkJICogY2hhbmdlIHJlY29yZCBiZWZvcmUgdGhlIGVuZi1vZi1ncm91cCBpbmRleCBpbiB0aGUgb3RoZXIKKwkJCSAqIGZpbGUgaXMgc2V0KS4KKwkJCSAqLworCQkJaXhyZWYgPSByY2hnb1tpeG8gLSAxXSA/IGl4OiBucmVjOworCisJCQkvKgorCQkJICogSWYgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGdyb3VwLCBpcyBlcXVhbCB0bworCQkJICogdGhlIGxpbmUgbmV4dCBvZiB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIHNoaWZ0IGZvcndhcmQKKwkJCSAqIHRoZSBncm91cC4KKwkJCSAqLworCQkJd2hpbGUgKGl4IDwgbnJlYyAmJiByZWNzW2l4c10tPmhhID09IHJlY3NbaXhdLT5oYSAmJgorCQkJICAgICAgIHhkbF9yZWNtYXRjaChyZWNzW2l4c10tPnB0ciwgcmVjc1tpeHNdLT5zaXplLCByZWNzW2l4XS0+cHRyLCByZWNzW2l4XS0+c2l6ZSwgZmxhZ3MpKSB7CisJCQkJcmNoZ1tpeHMrK10gPSAwOworCQkJCXJjaGdbaXgrK10gPSAxOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGNoYW5nZSBtaWdodCBoYXZlIGpvaW5lZCB0d28gY2hhbmdlIGdyb3VwcywKKwkJCQkgKiBzbyB3ZSB0cnkgdG8gdGFrZSB0aGlzIHNjZW5hcmlvIGluIGFjY291bnQgYnkgbW92aW5nCisJCQkJICogdGhlIHN0YXJ0IGluZGV4IGFjY29yZGluZ2x5IChhbmQgc28gdGhlIG90aGVyLWZpbGUKKwkJCQkgKiBlbmQtb2YtZ3JvdXAgaW5kZXgpLiBLZWVwIHRyYWNraW5nIHRoZSByZWZlcmVuY2UKKwkJCQkgKiBpbmRleCBpbiBjYXNlIHdlIGFyZSBzaGlmdGluZyB0b2dldGhlciB3aXRoIGEKKwkJCQkgKiBjb3JyZXNwb25kaW5nIGdyb3VwIG9mIGNoYW5nZXMgaW4gdGhlIG90aGVyIGZpbGUuCisJCQkJICovCisJCQkJZm9yICg7IHJjaGdbaXhdOyBpeCsrKTsKKwkJCQl3aGlsZSAocmNoZ29bKytpeG9dKQorCQkJCQlpeHJlZiA9IGl4OworCQkJfQorCQl9IHdoaWxlIChncnBzaXogIT0gaXggLSBpeHMpOworCisJCS8qCisJCSAqIFRyeSB0byBtb3ZlIGJhY2sgdGhlIHBvc3NpYmx5IG1lcmdlZCBncm91cCBvZiBjaGFuZ2VzLCB0byBtYXRjaAorCQkgKiB0aGUgcmVjb3JkZWQgcG9zdGlvbiBpbiB0aGUgb3RoZXIgZmlsZS4KKwkJICovCisJCXdoaWxlIChpeHJlZiA8IGl4KSB7CisJCQlyY2hnWy0taXhzXSA9IDE7CisJCQlyY2hnWy0taXhdID0gMDsKKwkJCXdoaWxlIChyY2hnb1stLWl4b10pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHhkbF9idWlsZF9zY3JpcHQoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICoqeHNjcikgeworCXhkY2hhbmdlX3QgKmNzY3IgPSBOVUxMLCAqeGNoOworCWNoYXIgKnJjaGcxID0geGUtPnhkZjEucmNoZywgKnJjaGcyID0geGUtPnhkZjIucmNoZzsKKwlsb25nIGkxLCBpMiwgbDEsIGwyOworCisJLyoKKwkgKiBUcml2aWFsLiBDb2xsZWN0cyAiZ3JvdXBzIiBvZiBjaGFuZ2VzIGFuZCBjcmVhdGVzIGFuIGVkaXQgc2NyaXB0LgorCSAqLworCWZvciAoaTEgPSB4ZS0+eGRmMS5ucmVjLCBpMiA9IHhlLT54ZGYyLm5yZWM7IGkxID49IDAgfHwgaTIgPj0gMDsgaTEtLSwgaTItLSkKKwkJaWYgKHJjaGcxW2kxIC0gMV0gfHwgcmNoZzJbaTIgLSAxXSkgeworCQkJZm9yIChsMSA9IGkxOyByY2hnMVtpMSAtIDFdOyBpMS0tKTsKKwkJCWZvciAobDIgPSBpMjsgcmNoZzJbaTIgLSAxXTsgaTItLSk7CisKKwkJCWlmICghKHhjaCA9IHhkbF9hZGRfY2hhbmdlKGNzY3IsIGkxLCBpMiwgbDEgLSBpMSwgbDIgLSBpMikpKSB7CisJCQkJeGRsX2ZyZWVfc2NyaXB0KGNzY3IpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNzY3IgPSB4Y2g7CisJCX0KKworCSp4c2NyID0gY3NjcjsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2ZyZWVfc2NyaXB0KHhkY2hhbmdlX3QgKnhzY3IpIHsKKwl4ZGNoYW5nZV90ICp4Y2g7CisKKwl3aGlsZSAoKHhjaCA9IHhzY3IpICE9IE5VTEwpIHsKKwkJeHNjciA9IHhzY3ItPm5leHQ7CisJCXhkbF9mcmVlKHhjaCk7CisJfQorfQorCisKK2ludCB4ZGxfZGlmZihtbWZpbGVfdCAqbWYxLCBtbWZpbGVfdCAqbWYyLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkgICAgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcsIHhkZW1pdGNiX3QgKmVjYikgeworCXhkY2hhbmdlX3QgKnhzY3I7CisJeGRmZW52X3QgeGU7CisKKwlpZiAoeGRsX2RvX2RpZmYobWYxLCBtZjIsIHhwcCwgJnhlKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlLnhkZjEsICZ4ZS54ZGYyLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkgICAgeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZS54ZGYyLCAmeGUueGRmMSwgeHBwLT5mbGFncykgPCAwIHx8CisJICAgIHhkbF9idWlsZF9zY3JpcHQoJnhlLCAmeHNjcikgPCAwKSB7CisKKwkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhzY3IpIHsKKwkJaWYgKHhkbF9lbWl0X2RpZmYoJnhlLCB4c2NyLCBlY2IsIHhlY2ZnKSA8IDApIHsKKworCQkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IpOworCQkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IpOworCX0KKwl4ZGxfZnJlZV9lbnYoJnhlKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94ZGlmZi94ZGlmZmkuaCBiL3hkaWZmL3hkaWZmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmFlYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZmkuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGSV9IKQorI2RlZmluZSBYRElGRklfSAorCisKK3R5cGVkZWYgc3RydWN0IHNfZGlmZmRhdGEgeworCWxvbmcgbnJlYzsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTsKKwlsb25nICpyaW5kZXg7CisJY2hhciAqcmNoZzsKK30gZGlmZmRhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGFsZ29lbnYgeworCWxvbmcgbXhjb3N0OworCWxvbmcgc25ha2VfY250OworCWxvbmcgaGV1cl9taW47Cit9IHhkYWxnb2Vudl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkY2hhbmdlIHsKKwlzdHJ1Y3Qgc194ZGNoYW5nZSAqbmV4dDsKKwlsb25nIGkxLCBpMjsKKwlsb25nIGNoZzEsIGNoZzI7Cit9IHhkY2hhbmdlX3Q7CisKKworCitpbnQgeGRsX3JlY3NfY21wKGRpZmZkYXRhX3QgKmRkMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSBkaWZmZGF0YV90ICpkZDIsIGxvbmcgb2ZmMiwgbG9uZyBsaW0yLAorCQkgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZGFsZ29lbnZfdCAqeGVudik7CitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSk7CitpbnQgeGRsX2NoYW5nZV9jb21wYWN0KHhkZmlsZV90ICp4ZGYsIHhkZmlsZV90ICp4ZGZvLCBsb25nIGZsYWdzKTsKK2ludCB4ZGxfYnVpbGRfc2NyaXB0KHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqKnhzY3IpOwordm9pZCB4ZGxfZnJlZV9zY3JpcHQoeGRjaGFuZ2VfdCAqeHNjcik7CitpbnQgeGRsX2VtaXRfZGlmZih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKTsKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYRElGRklfSCkgKi8KKwpkaWZmIC0tZ2l0IGEveGRpZmYveGVtaXQuYyBiL3hkaWZmL3hlbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5MWRjNwotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hlbWl0LmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworCitzdGF0aWMgbG9uZyB4ZGxfZ2V0X3JlYyh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICoqcmVjKTsKK3N0YXRpYyBpbnQgeGRsX2VtaXRfcmVjb3JkKHhkZmlsZV90ICp4ZGYsIGxvbmcgcmksIGNoYXIgY29uc3QgKnByZSwgeGRlbWl0Y2JfdCAqZWNiKTsKK3N0YXRpYyB4ZGNoYW5nZV90ICp4ZGxfZ2V0X2h1bmsoeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZyk7CisKKworCisKK3N0YXRpYyBsb25nIHhkbF9nZXRfcmVjKHhkZmlsZV90ICp4ZGYsIGxvbmcgcmksIGNoYXIgY29uc3QgKipyZWMpIHsKKworCSpyZWMgPSB4ZGYtPnJlY3NbcmldLT5wdHI7CisKKwlyZXR1cm4geGRmLT5yZWNzW3JpXS0+c2l6ZTsKK30KKworCitzdGF0aWMgaW50IHhkbF9lbWl0X3JlY29yZCh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICpwcmUsIHhkZW1pdGNiX3QgKmVjYikgeworCWxvbmcgc2l6ZSwgcHNpemUgPSBzdHJsZW4ocHJlKTsKKwljaGFyIGNvbnN0ICpyZWM7CisKKwlzaXplID0geGRsX2dldF9yZWMoeGRmLCByaSwgJnJlYyk7CisJaWYgKHhkbF9lbWl0X2RpZmZyZWMocmVjLCBzaXplLCBwcmUsIHBzaXplLCBlY2IpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogU3RhcnRpbmcgYXQgdGhlIHBhc3NlZCBjaGFuZ2UgYXRvbSwgZmluZCB0aGUgbGF0ZXN0IGNoYW5nZSBhdG9tIHRvIGJlIGluY2x1ZGVkCisgKiBpbnNpZGUgdGhlIGRpZmZlcmVudGlhbCBodW5rIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyB4ZGNoYW5nZV90ICp4ZGxfZ2V0X2h1bmsoeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZykgeworCXhkY2hhbmdlX3QgKnhjaCwgKnhjaHA7CisKKwlmb3IgKHhjaHAgPSB4c2NyLCB4Y2ggPSB4c2NyLT5uZXh0OyB4Y2g7IHhjaHAgPSB4Y2gsIHhjaCA9IHhjaC0+bmV4dCkKKwkJaWYgKHhjaC0+aTEgLSAoeGNocC0+aTEgKyB4Y2hwLT5jaGcxKSA+IDIgKiB4ZWNmZy0+Y3R4bGVuKQorCQkJYnJlYWs7CisKKwlyZXR1cm4geGNocDsKK30KKworCitzdGF0aWMgdm9pZCB4ZGxfZmluZF9mdW5jKHhkZmlsZV90ICp4ZiwgbG9uZyBpLCBjaGFyICpidWYsIGxvbmcgc3osIGxvbmcgKmxsKSB7CisKKwkvKgorCSAqIEJlIHF1aXRlIHN0dXBpZCBhYm91dCB0aGlzIGZvciBub3cuICBGaW5kIGEgbGluZSBpbiB0aGUgb2xkIGZpbGUKKwkgKiBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBodW5rIChhbmQgY29udGV4dCkgd2hpY2ggc3RhcnRzIHdpdGggYQorCSAqIHBsYXVzaWJsZSBjaGFyYWN0ZXIuCisJICovCisKKwljb25zdCBjaGFyICpyZWM7CisJbG9uZyBsZW47CisKKwkqbGwgPSAwOworCXdoaWxlIChpLS0gPiAwKSB7CisJCWxlbiA9IHhkbF9nZXRfcmVjKHhmLCBpLCAmcmVjKTsKKwkJaWYgKGxlbiA+IDAgJiYKKwkJICAgIChpc2FscGhhKCh1bnNpZ25lZCBjaGFyKSpyZWMpIHx8IC8qIGlkZW50aWZpZXI/ICovCisJCSAgICAgKnJlYyA9PSAnXycgfHwJLyogYWxzbyBpZGVudGlmaWVyPyAqLworCQkgICAgICpyZWMgPT0gJyQnKSkgewkvKiBteXN0ZXJpb3VzIEdOVSBkaWZmJ3MgaW52ZW50aW9uICovCisJCQlpZiAobGVuID4gc3opCisJCQkJbGVuID0gc3o7CisJCQl3aGlsZSAoMCA8IGxlbiAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKXJlY1tsZW4gLSAxXSkpCisJCQkJbGVuLS07CisJCQltZW1jcHkoYnVmLCByZWMsIGxlbik7CisJCQkqbGwgPSBsZW47CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKworaW50IHhkbF9lbWl0X2NvbW1vbih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICAgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpIHsKKwl4ZGZpbGVfdCAqeGRmID0gJnhlLT54ZGYxOworCWNvbnN0IGNoYXIgKnJjaGcgPSB4ZGYtPnJjaGc7CisJbG9uZyBpeDsKKworCWZvciAoaXggPSAwOyBpeCA8IHhkZi0+bnJlYzsgaXgrKykgeworCQlpZiAocmNoZ1tpeF0pCisJCQljb250aW51ZTsKKwkJaWYgKHhkbF9lbWl0X3JlY29yZCh4ZGYsIGl4LCAiIiwgZWNiKSkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB4ZGxfZW1pdF9kaWZmKHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y2JfdCAqZWNiLAorCQkgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpIHsKKwlsb25nIHMxLCBzMiwgZTEsIGUyLCBsY3R4OworCXhkY2hhbmdlX3QgKnhjaCwgKnhjaGU7CisJY2hhciBmdW5jYnVmWzgwXTsKKwlsb25nIGZ1bmNsZW4gPSAwOworCisJaWYgKHhlY2ZnLT5mbGFncyAmIFhETF9FTUlUX0NPTU1PTikKKwkJcmV0dXJuIHhkbF9lbWl0X2NvbW1vbih4ZSwgeHNjciwgZWNiLCB4ZWNmZyk7CisKKwlmb3IgKHhjaCA9IHhjaGUgPSB4c2NyOyB4Y2g7IHhjaCA9IHhjaGUtPm5leHQpIHsKKwkJeGNoZSA9IHhkbF9nZXRfaHVuayh4Y2gsIHhlY2ZnKTsKKworCQlzMSA9IFhETF9NQVgoeGNoLT5pMSAtIHhlY2ZnLT5jdHhsZW4sIDApOworCQlzMiA9IFhETF9NQVgoeGNoLT5pMiAtIHhlY2ZnLT5jdHhsZW4sIDApOworCisJCWxjdHggPSB4ZWNmZy0+Y3R4bGVuOworCQlsY3R4ID0gWERMX01JTihsY3R4LCB4ZS0+eGRmMS5ucmVjIC0gKHhjaGUtPmkxICsgeGNoZS0+Y2hnMSkpOworCQlsY3R4ID0gWERMX01JTihsY3R4LCB4ZS0+eGRmMi5ucmVjIC0gKHhjaGUtPmkyICsgeGNoZS0+Y2hnMikpOworCisJCWUxID0geGNoZS0+aTEgKyB4Y2hlLT5jaGcxICsgbGN0eDsKKwkJZTIgPSB4Y2hlLT5pMiArIHhjaGUtPmNoZzIgKyBsY3R4OworCisJCS8qCisJCSAqIEVtaXQgY3VycmVudCBodW5rIGhlYWRlci4KKwkJICovCisKKwkJaWYgKHhlY2ZnLT5mbGFncyAmIFhETF9FTUlUX0ZVTkNOQU1FUykgeworCQkJeGRsX2ZpbmRfZnVuYygmeGUtPnhkZjEsIHMxLCBmdW5jYnVmLAorCQkJCSAgICAgIHNpemVvZihmdW5jYnVmKSwgJmZ1bmNsZW4pOworCQl9CisJCWlmICh4ZGxfZW1pdF9odW5rX2hkcihzMSArIDEsIGUxIC0gczEsIHMyICsgMSwgZTIgLSBzMiwKKwkJCQkgICAgICBmdW5jYnVmLCBmdW5jbGVuLCBlY2IpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQkvKgorCQkgKiBFbWl0IHByZS1jb250ZXh0LgorCQkgKi8KKwkJZm9yICg7IHMxIDwgeGNoLT5pMTsgczErKykKKwkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYxLCBzMSwgIiAiLCBlY2IpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJZm9yIChzMSA9IHhjaC0+aTEsIHMyID0geGNoLT5pMjs7IHhjaCA9IHhjaC0+bmV4dCkgeworCQkJLyoKKwkJCSAqIE1lcmdlIHByZXZpb3VzIHdpdGggY3VycmVudCBjaGFuZ2UgYXRvbS4KKwkJCSAqLworCQkJZm9yICg7IHMxIDwgeGNoLT5pMSAmJiBzMiA8IHhjaC0+aTI7IHMxKyssIHMyKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiICIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCS8qCisJCQkgKiBSZW1vdmVzIGxpbmVzIGZyb20gdGhlIGZpcnN0IGZpbGUuCisJCQkgKi8KKwkJCWZvciAoczEgPSB4Y2gtPmkxOyBzMSA8IHhjaC0+aTEgKyB4Y2gtPmNoZzE7IHMxKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiLSIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCS8qCisJCQkgKiBBZGRzIGxpbmVzIGZyb20gdGhlIHNlY29uZCBmaWxlLgorCQkJICovCisJCQlmb3IgKHMyID0geGNoLT5pMjsgczIgPCB4Y2gtPmkyICsgeGNoLT5jaGcyOyBzMisrKQorCQkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYyLCBzMiwgIisiLCBlY2IpIDwgMCkKKwkJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoeGNoID09IHhjaGUpCisJCQkJYnJlYWs7CisJCQlzMSA9IHhjaC0+aTEgKyB4Y2gtPmNoZzE7CisJCQlzMiA9IHhjaC0+aTIgKyB4Y2gtPmNoZzI7CisJCX0KKworCQkvKgorCQkgKiBFbWl0IHBvc3QtY29udGV4dC4KKwkJICovCisJCWZvciAoczEgPSB4Y2hlLT5pMSArIHhjaGUtPmNoZzE7IHMxIDwgZTE7IHMxKyspCisJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICIgIiwgZWNiKSA8IDApCisJCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94ZGlmZi94ZW1pdC5oIGIveGRpZmYveGVtaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjI5NDE3Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGVtaXQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhFTUlUX0gpCisjZGVmaW5lIFhFTUlUX0gKKworCisKK2ludCB4ZGxfZW1pdF9kaWZmKHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y2JfdCAqZWNiLAorCQkgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpOworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYRU1JVF9IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94aW5jbHVkZS5oIGIveGRpZmYveGluY2x1ZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE5ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGluY2x1ZGUuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhJTkNMVURFX0gpCisjZGVmaW5lIFhJTkNMVURFX0gKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgInhtYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZGlmZi5oIgorI2luY2x1ZGUgInh0eXBlcy5oIgorI2luY2x1ZGUgInh1dGlscy5oIgorI2luY2x1ZGUgInhwcmVwYXJlLmgiCisjaW5jbHVkZSAieGRpZmZpLmgiCisjaW5jbHVkZSAieGVtaXQuaCIKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhJTkNMVURFX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3htYWNyb3MuaCBiL3hkaWZmL3htYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNkMjAyCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveG1hY3Jvcy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWE1BQ1JPU19IKQorI2RlZmluZSBYTUFDUk9TX0gKKworCisKKworI2RlZmluZSBYRExfTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSk6IChiKSkKKyNkZWZpbmUgWERMX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpOiAoYikpCisjZGVmaW5lIFhETF9BQlModikgKCh2KSA+PSAwID8gKHYpOiAtKHYpKQorI2RlZmluZSBYRExfSVNESUdJVChjKSAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorI2RlZmluZSBYRExfQUREQklUUyh2LGIpCSgodikgKyAoKHYpID4+IChiKSkpCisjZGVmaW5lIFhETF9NQVNLQklUUyhiKQkJKCgxVUwgPDwgKGIpKSAtIDEpCisjZGVmaW5lIFhETF9IQVNITE9ORyh2LGIpCShYRExfQUREQklUUygodW5zaWduZWQgbG9uZykodiksIGIpICYgWERMX01BU0tCSVRTKGIpKQorI2RlZmluZSBYRExfUFRSRlJFRShwKSBkbyB7IGlmIChwKSB7IHhkbF9mcmVlKHApOyAocCkgPSBOVUxMOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFhETF9MRTMyX1BVVChwLCB2KSBcCitkbyB7IFwKKwl1bnNpZ25lZCBjaGFyICpfX3AgPSAodW5zaWduZWQgY2hhciAqKSAocCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKHYpOyBcCisJKl9fcCsrID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gOCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKCh2KSA+PiAxNik7IFwKKwkqX19wID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gMjQpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBYRExfTEUzMl9HRVQocCwgdikgXAorZG8geyBcCisJdW5zaWduZWQgY2hhciBjb25zdCAqX19wID0gKHVuc2lnbmVkIGNoYXIgY29uc3QgKikgKHApOyBcCisJKHYpID0gKHVuc2lnbmVkIGxvbmcpIF9fcFswXSB8ICgodW5zaWduZWQgbG9uZykgX19wWzFdKSA8PCA4IHwgXAorCQkoKHVuc2lnbmVkIGxvbmcpIF9fcFsyXSkgPDwgMTYgfCAoKHVuc2lnbmVkIGxvbmcpIF9fcFszXSkgPDwgMjQ7IFwKK30gd2hpbGUgKDApCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYTUFDUk9TX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3htZXJnZS5jIGIveGRpZmYveG1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzYjMzNAotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3htZXJnZS5jCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgRGF2aWRlIExpYmVuemksIEpvaGFubmVzIEUuIFNjaGluZGVsaW4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCit0eXBlZGVmIHN0cnVjdCBzX3hkbWVyZ2UgeworCXN0cnVjdCBzX3hkbWVyZ2UgKm5leHQ7CisJLyoKKwkgKiAwID0gY29uZmxpY3QsCisJICogMSA9IG5vIGNvbmZsaWN0LCB0YWtlIGZpcnN0LAorCSAqIDIgPSBubyBjb25mbGljdCwgdGFrZSBzZWNvbmQuCisJICovCisJaW50IG1vZGU7CisJbG9uZyBpMSwgaTI7CisJbG9uZyBjaGcxLCBjaGcyOworfSB4ZG1lcmdlX3Q7CisKK3N0YXRpYyBpbnQgeGRsX2FwcGVuZF9tZXJnZSh4ZG1lcmdlX3QgKiptZXJnZSwgaW50IG1vZGUsCisJCWxvbmcgaTEsIGxvbmcgY2hnMSwgbG9uZyBpMiwgbG9uZyBjaGcyKQoreworCXhkbWVyZ2VfdCAqbSA9ICptZXJnZTsKKwlpZiAobSAmJiAoaTEgPD0gbS0+aTEgKyBtLT5jaGcxIHx8IGkyIDw9IG0tPmkyICsgbS0+Y2hnMikpIHsKKwkJaWYgKG1vZGUgIT0gbS0+bW9kZSkKKwkJCW0tPm1vZGUgPSAwOworCQltLT5jaGcxID0gaTEgKyBjaGcxIC0gbS0+aTE7CisJCW0tPmNoZzIgPSBpMiArIGNoZzIgLSBtLT5pMjsKKwl9IGVsc2UgeworCQltID0geGRsX21hbGxvYyhzaXplb2YoeGRtZXJnZV90KSk7CisJCWlmICghbSkKKwkJCXJldHVybiAtMTsKKwkJbS0+bmV4dCA9IE5VTEw7CisJCW0tPm1vZGUgPSBtb2RlOworCQltLT5pMSA9IGkxOworCQltLT5jaGcxID0gY2hnMTsKKwkJbS0+aTIgPSBpMjsKKwkJbS0+Y2hnMiA9IGNoZzI7CisJCWlmICgqbWVyZ2UpCisJCQkoKm1lcmdlKS0+bmV4dCA9IG07CisJCSptZXJnZSA9IG07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhkbF9jbGVhbnVwX21lcmdlKHhkbWVyZ2VfdCAqYykKK3sKKwlpbnQgY291bnQgPSAwOworCXhkbWVyZ2VfdCAqbmV4dF9jOworCisJLyogd2VyZSB0aGVyZSBjb25mbGljdHM/ICovCisJZm9yICg7IGM7IGMgPSBuZXh0X2MpIHsKKwkJaWYgKGMtPm1vZGUgPT0gMCkKKwkJCWNvdW50Kys7CisJCW5leHRfYyA9IGMtPm5leHQ7CisJCWZyZWUoYyk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB4ZGxfbWVyZ2VfY21wX2xpbmVzKHhkZmVudl90ICp4ZTEsIGludCBpMSwgeGRmZW52X3QgKnhlMiwgaW50IGkyLAorCQlpbnQgbGluZV9jb3VudCwgbG9uZyBmbGFncykKK3sKKwlpbnQgaTsKKwl4cmVjb3JkX3QgKipyZWMxID0geGUxLT54ZGYyLnJlY3MgKyBpMTsKKwl4cmVjb3JkX3QgKipyZWMyID0geGUyLT54ZGYyLnJlY3MgKyBpMjsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lX2NvdW50OyBpKyspIHsKKwkJaW50IHJlc3VsdCA9IHhkbF9yZWNtYXRjaChyZWMxW2ldLT5wdHIsIHJlYzFbaV0tPnNpemUsCisJCQlyZWMyW2ldLT5wdHIsIHJlYzJbaV0tPnNpemUsIGZsYWdzKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhkbF9yZWNzX2NvcHkoeGRmZW52X3QgKnhlLCBpbnQgaSwgaW50IGNvdW50LCBpbnQgYWRkX25sLCBjaGFyICpkZXN0KQoreworCXhyZWNvcmRfdCAqKnJlY3MgPSB4ZS0+eGRmMi5yZWNzICsgaTsKKwlpbnQgc2l6ZSA9IDA7CisKKwlpZiAoY291bnQgPCAxKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgc2l6ZSArPSByZWNzW2krK10tPnNpemUpCisJCWlmIChkZXN0KQorCQkJbWVtY3B5KGRlc3QgKyBzaXplLCByZWNzW2ldLT5wdHIsIHJlY3NbaV0tPnNpemUpOworCWlmIChhZGRfbmwpIHsKKwkJaSA9IHJlY3NbY291bnQgLSAxXS0+c2l6ZTsKKwkJaWYgKGkgPT0gMCB8fCByZWNzW2NvdW50IC0gMV0tPnB0cltpIC0gMV0gIT0gJ1xuJykgeworCQkJaWYgKGRlc3QpCisJCQkJZGVzdFtzaXplXSA9ICdcbic7CisJCQlzaXplKys7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgeGRsX2ZpbGxfbWVyZ2VfYnVmZmVyKHhkZmVudl90ICp4ZTEsIGNvbnN0IGNoYXIgKm5hbWUxLAorCQl4ZGZlbnZfdCAqeGUyLCBjb25zdCBjaGFyICpuYW1lMiwgeGRtZXJnZV90ICptLCBjaGFyICpkZXN0KQoreworCWNvbnN0IGludCBtYXJrZXJfc2l6ZSA9IDc7CisJaW50IG1hcmtlcjFfc2l6ZSA9IChuYW1lMSA/IHN0cmxlbihuYW1lMSkgKyAxIDogMCk7CisJaW50IG1hcmtlcjJfc2l6ZSA9IChuYW1lMiA/IHN0cmxlbihuYW1lMikgKyAxIDogMCk7CisJaW50IGNvbmZsaWN0X21hcmtlcl9zaXplID0gMyAqIChtYXJrZXJfc2l6ZSArIDEpCisJCSsgbWFya2VyMV9zaXplICsgbWFya2VyMl9zaXplOworCWludCBzaXplLCBpMSwgajsKKworCWZvciAoc2l6ZSA9IGkxID0gMDsgbTsgbSA9IG0tPm5leHQpIHsKKwkJaWYgKG0tPm1vZGUgPT0gMCkgeworCQkJc2l6ZSArPSB4ZGxfcmVjc19jb3B5KHhlMSwgaTEsIG0tPmkxIC0gaTEsIDAsCisJCQkJCWRlc3QgPyBkZXN0ICsgc2l6ZSA6IE5VTEwpOworCQkJaWYgKGRlc3QpIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbWFya2VyX3NpemU7IGorKykKKwkJCQkJZGVzdFtzaXplKytdID0gJzwnOworCQkJCWlmIChtYXJrZXIxX3NpemUpIHsKKwkJCQkJZGVzdFtzaXplXSA9ICcgJzsKKwkJCQkJbWVtY3B5KGRlc3QgKyBzaXplICsgMSwgbmFtZTEsCisJCQkJCQkJbWFya2VyMV9zaXplIC0gMSk7CisJCQkJCXNpemUgKz0gbWFya2VyMV9zaXplOworCQkJCX0KKwkJCQlkZXN0W3NpemUrK10gPSAnXG4nOworCQkJfSBlbHNlCisJCQkJc2l6ZSArPSBjb25mbGljdF9tYXJrZXJfc2l6ZTsKKwkJCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTEsIG0tPmkxLCBtLT5jaGcxLCAxLAorCQkJCQlkZXN0ID8gZGVzdCArIHNpemUgOiBOVUxMKTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG1hcmtlcl9zaXplOyBqKyspCisJCQkJCWRlc3Rbc2l6ZSsrXSA9ICc9JzsKKwkJCQlkZXN0W3NpemUrK10gPSAnXG4nOworCQkJfQorCQkJc2l6ZSArPSB4ZGxfcmVjc19jb3B5KHhlMiwgbS0+aTIsIG0tPmNoZzIsIDEsCisJCQkJCWRlc3QgPyBkZXN0ICsgc2l6ZSA6IE5VTEwpOworCQkJaWYgKGRlc3QpIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbWFya2VyX3NpemU7IGorKykKKwkJCQkJZGVzdFtzaXplKytdID0gJz4nOworCQkJCWlmIChtYXJrZXIyX3NpemUpIHsKKwkJCQkJZGVzdFtzaXplXSA9ICcgJzsKKwkJCQkJbWVtY3B5KGRlc3QgKyBzaXplICsgMSwgbmFtZTIsCisJCQkJCQkJbWFya2VyMl9zaXplIC0gMSk7CisJCQkJCXNpemUgKz0gbWFya2VyMl9zaXplOworCQkJCX0KKwkJCQlkZXN0W3NpemUrK10gPSAnXG4nOworCQkJfQorCQl9IGVsc2UgaWYgKG0tPm1vZGUgPT0gMSkKKwkJCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTEsIGkxLCBtLT5pMSArIG0tPmNoZzEgLSBpMSwgMCwKKwkJCQkJZGVzdCA/IGRlc3QgKyBzaXplIDogTlVMTCk7CisJCWVsc2UgaWYgKG0tPm1vZGUgPT0gMikKKwkJCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTIsIG0tPmkyIC0gbS0+aTEgKyBpMSwKKwkJCQkJbS0+aTEgKyBtLT5jaGcyIC0gaTEsIDAsCisJCQkJCWRlc3QgPyBkZXN0ICsgc2l6ZSA6IE5VTEwpOworCQllbHNlCisJCQljb250aW51ZTsKKwkJaTEgPSBtLT5pMSArIG0tPmNoZzE7CisJfQorCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTEsIGkxLCB4ZTEtPnhkZjIubnJlYyAtIGkxLCAwLAorCQkJZGVzdCA/IGRlc3QgKyBzaXplIDogTlVMTCk7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBTb21ldGltZXMsIGNoYW5nZXMgYXJlIG5vdCBxdWl0ZSBpZGVudGljYWwsIGJ1dCBkaWZmZXIgaW4gb25seSBhIGZldworICogbGluZXMuIFRyeSBoYXJkIHRvIHNob3cgb25seSB0aGVzZSBmZXcgbGluZXMgYXMgY29uZmxpY3RpbmcuCisgKi8KK3N0YXRpYyBpbnQgeGRsX3JlZmluZV9jb25mbGljdHMoeGRmZW52X3QgKnhlMSwgeGRmZW52X3QgKnhlMiwgeGRtZXJnZV90ICptLAorCQl4cHBhcmFtX3QgY29uc3QgKnhwcCkKK3sKKwlmb3IgKDsgbTsgbSA9IG0tPm5leHQpIHsKKwkJbW1maWxlX3QgdDEsIHQyOworCQl4ZGZlbnZfdCB4ZTsKKwkJeGRjaGFuZ2VfdCAqeHNjciwgKng7CisJCWludCBpMSA9IG0tPmkxLCBpMiA9IG0tPmkyOworCisJCS8qIGxldCdzIGhhbmRsZSBqdXN0IHRoZSBjb25mbGljdHMgKi8KKwkJaWYgKG0tPm1vZGUpCisJCQljb250aW51ZTsKKworCQkvKiBubyBzZW5zZSByZWZpbmluZyBhIGNvbmZsaWN0IHdoZW4gb25lIHNpZGUgaXMgZW1wdHkgKi8KKwkJaWYgKG0tPmNoZzEgPT0gMCB8fCBtLT5jaGcyID09IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBUaGlzIHByb2JhYmx5IGRvZXMgbm90IHdvcmsgb3V0c2lkZSBnaXQsIHNpbmNlCisJCSAqIHdlIGhhdmUgYSB2ZXJ5IHNpbXBsZSBtbWZpbGUgc3RydWN0dXJlLgorCQkgKi8KKwkJdDEucHRyID0gKGNoYXIgKil4ZTEtPnhkZjIucmVjc1ttLT5pMV0tPnB0cjsKKwkJdDEuc2l6ZSA9IHhlMS0+eGRmMi5yZWNzW20tPmkxICsgbS0+Y2hnMSAtIDFdLT5wdHIKKwkJCSsgeGUxLT54ZGYyLnJlY3NbbS0+aTEgKyBtLT5jaGcxIC0gMV0tPnNpemUgLSB0MS5wdHI7CisJCXQyLnB0ciA9IChjaGFyICopeGUyLT54ZGYyLnJlY3NbbS0+aTJdLT5wdHI7CisJCXQyLnNpemUgPSB4ZTItPnhkZjIucmVjc1ttLT5pMiArIG0tPmNoZzIgLSAxXS0+cHRyCisJCQkrIHhlMi0+eGRmMi5yZWNzW20tPmkyICsgbS0+Y2hnMiAtIDFdLT5zaXplIC0gdDIucHRyOworCQlpZiAoeGRsX2RvX2RpZmYoJnQxLCAmdDIsIHhwcCwgJnhlKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWlmICh4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlLnhkZjEsICZ4ZS54ZGYyLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkJICAgIHhkbF9jaGFuZ2VfY29tcGFjdCgmeGUueGRmMiwgJnhlLnhkZjEsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCQkgICAgeGRsX2J1aWxkX3NjcmlwdCgmeGUsICZ4c2NyKSA8IDApIHsKKwkJCXhkbF9mcmVlX2VudigmeGUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICgheHNjcikgeworCQkJLyogSWYgdGhpcyBoYXBwZW5zLCB0aGUgY2hhbmdlcyBhcmUgaWRlbnRpY2FsLiAqLworCQkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCQltLT5tb2RlID0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXggPSB4c2NyOworCQltLT5pMSA9IHhzY3ItPmkxICsgaTE7CisJCW0tPmNoZzEgPSB4c2NyLT5jaGcxOworCQltLT5pMiA9IHhzY3ItPmkyICsgaTI7CisJCW0tPmNoZzIgPSB4c2NyLT5jaGcyOworCQl3aGlsZSAoeHNjci0+bmV4dCkgeworCQkJeGRtZXJnZV90ICptMiA9IHhkbF9tYWxsb2Moc2l6ZW9mKHhkbWVyZ2VfdCkpOworCQkJaWYgKCFtMikgeworCQkJCXhkbF9mcmVlX2VudigmeGUpOworCQkJCXhkbF9mcmVlX3NjcmlwdCh4KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl4c2NyID0geHNjci0+bmV4dDsKKwkJCW0yLT5uZXh0ID0gbS0+bmV4dDsKKwkJCW0tPm5leHQgPSBtMjsKKwkJCW0gPSBtMjsKKwkJCW0tPm1vZGUgPSAwOworCQkJbS0+aTEgPSB4c2NyLT5pMSArIGkxOworCQkJbS0+Y2hnMSA9IHhzY3ItPmNoZzE7CisJCQltLT5pMiA9IHhzY3ItPmkyICsgaTI7CisJCQltLT5jaGcyID0geHNjci0+Y2hnMjsKKwkJfQorCQl4ZGxfZnJlZV9lbnYoJnhlKTsKKwkJeGRsX2ZyZWVfc2NyaXB0KHgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxldmVsID09IDA6IG1hcmsgYWxsIG92ZXJsYXBwaW5nIGNoYW5nZXMgYXMgY29uZmxpY3QKKyAqIGxldmVsID09IDE6IG1hcmsgb3ZlcmxhcHBpbmcgY2hhbmdlcyBhcyBjb25mbGljdCBvbmx5IGlmIG5vdCBpZGVudGljYWwKKyAqIGxldmVsID09IDI6IGFuYWx5emUgbm9uLWlkZW50aWNhbCBjaGFuZ2VzIGZvciBtaW5pbWFsIGNvbmZsaWN0IHNldAorICoKKyAqIHJldHVybnMgPCAwIG9uIGVycm9yLCA9PSAwIGZvciBubyBjb25mbGljdHMsIGVsc2UgbnVtYmVyIG9mIGNvbmZsaWN0cworICovCitzdGF0aWMgaW50IHhkbF9kb19tZXJnZSh4ZGZlbnZfdCAqeGUxLCB4ZGNoYW5nZV90ICp4c2NyMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCXhkZmVudl90ICp4ZTIsIHhkY2hhbmdlX3QgKnhzY3IyLCBjb25zdCBjaGFyICpuYW1lMiwKKwkJaW50IGxldmVsLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwgbW1idWZmZXJfdCAqcmVzdWx0KSB7CisJeGRtZXJnZV90ICpjaGFuZ2VzLCAqYzsKKwlpbnQgaTEsIGkyLCBjaGcxLCBjaGcyOworCisJYyA9IGNoYW5nZXMgPSBOVUxMOworCisJd2hpbGUgKHhzY3IxICYmIHhzY3IyKSB7CisJCWlmICghY2hhbmdlcykKKwkJCWNoYW5nZXMgPSBjOworCQlpZiAoeHNjcjEtPmkxICsgeHNjcjEtPmNoZzEgPCB4c2NyMi0+aTEpIHsKKwkJCWkxID0geHNjcjEtPmkyOworCQkJaTIgPSB4c2NyMi0+aTIgLSB4c2NyMi0+aTEgKyB4c2NyMS0+aTE7CisJCQljaGcxID0geHNjcjEtPmNoZzI7CisJCQljaGcyID0geHNjcjEtPmNoZzE7CisJCQlpZiAoeGRsX2FwcGVuZF9tZXJnZSgmYywgMSwgaTEsIGNoZzEsIGkyLCBjaGcyKSkgeworCQkJCXhkbF9jbGVhbnVwX21lcmdlKGNoYW5nZXMpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXhzY3IxID0geHNjcjEtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoeHNjcjItPmkxICsgeHNjcjItPmNoZzEgPCB4c2NyMS0+aTEpIHsKKwkJCWkxID0geHNjcjEtPmkyIC0geHNjcjEtPmkxICsgeHNjcjItPmkxOworCQkJaTIgPSB4c2NyMi0+aTI7CisJCQljaGcxID0geHNjcjItPmNoZzE7CisJCQljaGcyID0geHNjcjItPmNoZzI7CisJCQlpZiAoeGRsX2FwcGVuZF9tZXJnZSgmYywgMiwgaTEsIGNoZzEsIGkyLCBjaGcyKSkgeworCQkJCXhkbF9jbGVhbnVwX21lcmdlKGNoYW5nZXMpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXhzY3IyID0geHNjcjItPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGV2ZWwgPCAxIHx8IHhzY3IxLT5pMSAhPSB4c2NyMi0+aTEgfHwKKwkJCQl4c2NyMS0+Y2hnMSAhPSB4c2NyMi0+Y2hnMSB8fAorCQkJCXhzY3IxLT5jaGcyICE9IHhzY3IyLT5jaGcyIHx8CisJCQkJeGRsX21lcmdlX2NtcF9saW5lcyh4ZTEsIHhzY3IxLT5pMiwKKwkJCQkJeGUyLCB4c2NyMi0+aTIsCisJCQkJCXhzY3IxLT5jaGcyLCB4cHAtPmZsYWdzKSkgeworCQkJLyogY29uZmxpY3QgKi8KKwkJCWludCBvZmYgPSB4c2NyMS0+aTEgLSB4c2NyMi0+aTE7CisJCQlpbnQgZmZvID0gb2ZmICsgeHNjcjEtPmNoZzEgLSB4c2NyMi0+Y2hnMTsKKworCQkJaTEgPSB4c2NyMS0+aTI7CisJCQlpMiA9IHhzY3IyLT5pMjsKKwkJCWlmIChvZmYgPiAwKQorCQkJCWkxIC09IG9mZjsKKwkJCWVsc2UKKwkJCQlpMiArPSBvZmY7CisJCQljaGcxID0geHNjcjEtPmkyICsgeHNjcjEtPmNoZzIgLSBpMTsKKwkJCWNoZzIgPSB4c2NyMi0+aTIgKyB4c2NyMi0+Y2hnMiAtIGkyOworCQkJaWYgKGZmbyA+IDApCisJCQkJY2hnMiArPSBmZm87CisJCQllbHNlCisJCQkJY2hnMSAtPSBmZm87CisJCQlpZiAoeGRsX2FwcGVuZF9tZXJnZSgmYywgMCwgaTEsIGNoZzEsIGkyLCBjaGcyKSkgeworCQkJCXhkbF9jbGVhbnVwX21lcmdlKGNoYW5nZXMpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJCWkxID0geHNjcjEtPmkxICsgeHNjcjEtPmNoZzE7CisJCWkyID0geHNjcjItPmkxICsgeHNjcjItPmNoZzE7CisKKwkJaWYgKGkxID49IGkyKQorCQkJeHNjcjIgPSB4c2NyMi0+bmV4dDsKKwkJaWYgKGkyID49IGkxKQorCQkJeHNjcjEgPSB4c2NyMS0+bmV4dDsKKwl9CisJd2hpbGUgKHhzY3IxKSB7CisJCWlmICghY2hhbmdlcykKKwkJCWNoYW5nZXMgPSBjOworCQlpMSA9IHhzY3IxLT5pMjsKKwkJaTIgPSB4c2NyMS0+aTEgKyB4ZTItPnhkZjIubnJlYyAtIHhlMi0+eGRmMS5ucmVjOworCQljaGcxID0geHNjcjEtPmNoZzI7CisJCWNoZzIgPSB4c2NyMS0+Y2hnMTsKKwkJaWYgKHhkbF9hcHBlbmRfbWVyZ2UoJmMsIDEsIGkxLCBjaGcxLCBpMiwgY2hnMikpIHsKKwkJCXhkbF9jbGVhbnVwX21lcmdlKGNoYW5nZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXhzY3IxID0geHNjcjEtPm5leHQ7CisJfQorCXdoaWxlICh4c2NyMikgeworCQlpZiAoIWNoYW5nZXMpCisJCQljaGFuZ2VzID0gYzsKKwkJaTEgPSB4c2NyMi0+aTEgKyB4ZTEtPnhkZjIubnJlYyAtIHhlMS0+eGRmMS5ucmVjOworCQlpMiA9IHhzY3IyLT5pMjsKKwkJY2hnMSA9IHhzY3IyLT5jaGcxOworCQljaGcyID0geHNjcjItPmNoZzI7CisJCWlmICh4ZGxfYXBwZW5kX21lcmdlKCZjLCAyLCBpMSwgY2hnMSwgaTIsIGNoZzIpKSB7CisJCQl4ZGxfY2xlYW51cF9tZXJnZShjaGFuZ2VzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl4c2NyMiA9IHhzY3IyLT5uZXh0OworCX0KKwlpZiAoIWNoYW5nZXMpCisJCWNoYW5nZXMgPSBjOworCS8qIHJlZmluZSBjb25mbGljdHMgKi8KKwlpZiAobGV2ZWwgPiAxICYmIHhkbF9yZWZpbmVfY29uZmxpY3RzKHhlMSwgeGUyLCBjaGFuZ2VzLCB4cHApIDwgMCkgeworCQl4ZGxfY2xlYW51cF9tZXJnZShjaGFuZ2VzKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBvdXRwdXQgKi8KKwlpZiAocmVzdWx0KSB7CisJCWludCBzaXplID0geGRsX2ZpbGxfbWVyZ2VfYnVmZmVyKHhlMSwgbmFtZTEsIHhlMiwgbmFtZTIsCisJCQljaGFuZ2VzLCBOVUxMKTsKKwkJcmVzdWx0LT5wdHIgPSB4ZGxfbWFsbG9jKHNpemUpOworCQlpZiAoIXJlc3VsdC0+cHRyKSB7CisJCQl4ZGxfY2xlYW51cF9tZXJnZShjaGFuZ2VzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXN1bHQtPnNpemUgPSBzaXplOworCQl4ZGxfZmlsbF9tZXJnZV9idWZmZXIoeGUxLCBuYW1lMSwgeGUyLCBuYW1lMiwgY2hhbmdlcywKKwkJCQlyZXN1bHQtPnB0cik7CisJfQorCXJldHVybiB4ZGxfY2xlYW51cF9tZXJnZShjaGFuZ2VzKTsKK30KKworaW50IHhkbF9tZXJnZShtbWZpbGVfdCAqb3JpZywgbW1maWxlX3QgKm1mMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCW1tZmlsZV90ICptZjIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQl4cHBhcmFtX3QgY29uc3QgKnhwcCwgaW50IGxldmVsLCBtbWJ1ZmZlcl90ICpyZXN1bHQpIHsKKwl4ZGNoYW5nZV90ICp4c2NyMSwgKnhzY3IyOworCXhkZmVudl90IHhlMSwgeGUyOworCWludCBzdGF0dXM7CisKKwlyZXN1bHQtPnB0ciA9IE5VTEw7CisJcmVzdWx0LT5zaXplID0gMDsKKworCWlmICh4ZGxfZG9fZGlmZihvcmlnLCBtZjEsIHhwcCwgJnhlMSkgPCAwIHx8CisJCQl4ZGxfZG9fZGlmZihvcmlnLCBtZjIsIHhwcCwgJnhlMikgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhkbF9jaGFuZ2VfY29tcGFjdCgmeGUxLnhkZjEsICZ4ZTEueGRmMiwgeHBwLT5mbGFncykgPCAwIHx8CisJICAgIHhkbF9jaGFuZ2VfY29tcGFjdCgmeGUxLnhkZjIsICZ4ZTEueGRmMSwgeHBwLT5mbGFncykgPCAwIHx8CisJICAgIHhkbF9idWlsZF9zY3JpcHQoJnhlMSwgJnhzY3IxKSA8IDApIHsKKwkJeGRsX2ZyZWVfZW52KCZ4ZTEpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlMi54ZGYxLCAmeGUyLnhkZjIsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCSAgICB4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlMi54ZGYyLCAmeGUyLnhkZjEsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCSAgICB4ZGxfYnVpbGRfc2NyaXB0KCZ4ZTIsICZ4c2NyMikgPCAwKSB7CisJCXhkbF9mcmVlX2VudigmeGUyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdGF0dXMgPSAwOworCWlmICh4c2NyMSB8fCB4c2NyMikgeworCQlpZiAoIXhzY3IxKSB7CisJCQlyZXN1bHQtPnB0ciA9IHhkbF9tYWxsb2MobWYyLT5zaXplKTsKKwkJCW1lbWNweShyZXN1bHQtPnB0ciwgbWYyLT5wdHIsIG1mMi0+c2l6ZSk7CisJCQlyZXN1bHQtPnNpemUgPSBtZjItPnNpemU7CisJCX0gZWxzZSBpZiAoIXhzY3IyKSB7CisJCQlyZXN1bHQtPnB0ciA9IHhkbF9tYWxsb2MobWYxLT5zaXplKTsKKwkJCW1lbWNweShyZXN1bHQtPnB0ciwgbWYxLT5wdHIsIG1mMS0+c2l6ZSk7CisJCQlyZXN1bHQtPnNpemUgPSBtZjEtPnNpemU7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSB4ZGxfZG9fbWVyZ2UoJnhlMSwgeHNjcjEsIG5hbWUxLAorCQkJCQkgICAgICAmeGUyLCB4c2NyMiwgbmFtZTIsCisJCQkJCSAgICAgIGxldmVsLCB4cHAsIHJlc3VsdCk7CisJCX0KKwkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IxKTsKKwkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IyKTsKKwl9CisJeGRsX2ZyZWVfZW52KCZ4ZTEpOworCXhkbF9mcmVlX2VudigmeGUyKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS94ZGlmZi94cHJlcGFyZS5jIGIveGRpZmYveHByZXBhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU3YjMxCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveHByZXBhcmUuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworI2RlZmluZSBYRExfS1BESVNfUlVOIDQKKyNkZWZpbmUgWERMX01BWF9FUUxJTUlUIDEwMjQKKworCisKK3R5cGVkZWYgc3RydWN0IHNfeGRsY2xhc3MgeworCXN0cnVjdCBzX3hkbGNsYXNzICpuZXh0OworCXVuc2lnbmVkIGxvbmcgaGE7CisJY2hhciBjb25zdCAqbGluZTsKKwlsb25nIHNpemU7CisJbG9uZyBpZHg7Cit9IHhkbGNsYXNzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRsY2xhc3NpZmllciB7CisJdW5zaWduZWQgaW50IGhiaXRzOworCWxvbmcgaHNpemU7CisJeGRsY2xhc3NfdCAqKnJjaGFzaDsKKwljaGFzdG9yZV90IG5jaGE7CisJbG9uZyBjb3VudDsKKwlsb25nIGZsYWdzOworfSB4ZGxjbGFzc2lmaWVyX3Q7CisKKworCisKK3N0YXRpYyBpbnQgeGRsX2luaXRfY2xhc3NpZmllcih4ZGxjbGFzc2lmaWVyX3QgKmNmLCBsb25nIHNpemUsIGxvbmcgZmxhZ3MpOworc3RhdGljIHZvaWQgeGRsX2ZyZWVfY2xhc3NpZmllcih4ZGxjbGFzc2lmaWVyX3QgKmNmKTsKK3N0YXRpYyBpbnQgeGRsX2NsYXNzaWZ5X3JlY29yZCh4ZGxjbGFzc2lmaWVyX3QgKmNmLCB4cmVjb3JkX3QgKipyaGFzaCwgdW5zaWduZWQgaW50IGhiaXRzLAorCQkJICAgICAgIHhyZWNvcmRfdCAqcmVjKTsKK3N0YXRpYyBpbnQgeGRsX3ByZXBhcmVfY3R4KG1tZmlsZV90ICptZiwgbG9uZyBuYXJlYywgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCQkgICB4ZGxjbGFzc2lmaWVyX3QgKmNmLCB4ZGZpbGVfdCAqeGRmKTsKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2N0eCh4ZGZpbGVfdCAqeGRmKTsKK3N0YXRpYyBpbnQgeGRsX2NsZWFuX21tYXRjaChjaGFyIGNvbnN0ICpkaXMsIGxvbmcgaSwgbG9uZyBzLCBsb25nIGUpOworc3RhdGljIGludCB4ZGxfY2xlYW51cF9yZWNvcmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMik7CitzdGF0aWMgaW50IHhkbF90cmltX2VuZHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKTsKK3N0YXRpYyBpbnQgeGRsX29wdGltaXplX2N0eHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKTsKKworCisKKworc3RhdGljIGludCB4ZGxfaW5pdF9jbGFzc2lmaWVyKHhkbGNsYXNzaWZpZXJfdCAqY2YsIGxvbmcgc2l6ZSwgbG9uZyBmbGFncykgeworCWxvbmcgaTsKKworCWNmLT5mbGFncyA9IGZsYWdzOworCisJY2YtPmhiaXRzID0geGRsX2hhc2hiaXRzKCh1bnNpZ25lZCBpbnQpIHNpemUpOworCWNmLT5oc2l6ZSA9IDEgPDwgY2YtPmhiaXRzOworCisJaWYgKHhkbF9jaGFfaW5pdCgmY2YtPm5jaGEsIHNpemVvZih4ZGxjbGFzc190KSwgc2l6ZSAvIDQgKyAxKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCWlmICghKGNmLT5yY2hhc2ggPSAoeGRsY2xhc3NfdCAqKikgeGRsX21hbGxvYyhjZi0+aHNpemUgKiBzaXplb2YoeGRsY2xhc3NfdCAqKSkpKSB7CisKKwkJeGRsX2NoYV9mcmVlKCZjZi0+bmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNmLT5oc2l6ZTsgaSsrKQorCQljZi0+cmNoYXNoW2ldID0gTlVMTDsKKworCWNmLT5jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB4ZGxfZnJlZV9jbGFzc2lmaWVyKHhkbGNsYXNzaWZpZXJfdCAqY2YpIHsKKworCXhkbF9mcmVlKGNmLT5yY2hhc2gpOworCXhkbF9jaGFfZnJlZSgmY2YtPm5jaGEpOworfQorCisKK3N0YXRpYyBpbnQgeGRsX2NsYXNzaWZ5X3JlY29yZCh4ZGxjbGFzc2lmaWVyX3QgKmNmLCB4cmVjb3JkX3QgKipyaGFzaCwgdW5zaWduZWQgaW50IGhiaXRzLAorCQkJICAgICAgIHhyZWNvcmRfdCAqcmVjKSB7CisJbG9uZyBoaTsKKwljaGFyIGNvbnN0ICpsaW5lOworCXhkbGNsYXNzX3QgKnJjcmVjOworCisJbGluZSA9IHJlYy0+cHRyOworCWhpID0gKGxvbmcpIFhETF9IQVNITE9ORyhyZWMtPmhhLCBjZi0+aGJpdHMpOworCWZvciAocmNyZWMgPSBjZi0+cmNoYXNoW2hpXTsgcmNyZWM7IHJjcmVjID0gcmNyZWMtPm5leHQpCisJCWlmIChyY3JlYy0+aGEgPT0gcmVjLT5oYSAmJgorCQkJCXhkbF9yZWNtYXRjaChyY3JlYy0+bGluZSwgcmNyZWMtPnNpemUsCisJCQkJCXJlYy0+cHRyLCByZWMtPnNpemUsIGNmLT5mbGFncykpCisJCQlicmVhazsKKworCWlmICghcmNyZWMpIHsKKwkJaWYgKCEocmNyZWMgPSB4ZGxfY2hhX2FsbG9jKCZjZi0+bmNoYSkpKSB7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyY3JlYy0+aWR4ID0gY2YtPmNvdW50Kys7CisJCXJjcmVjLT5saW5lID0gbGluZTsKKwkJcmNyZWMtPnNpemUgPSByZWMtPnNpemU7CisJCXJjcmVjLT5oYSA9IHJlYy0+aGE7CisJCXJjcmVjLT5uZXh0ID0gY2YtPnJjaGFzaFtoaV07CisJCWNmLT5yY2hhc2hbaGldID0gcmNyZWM7CisJfQorCisJcmVjLT5oYSA9ICh1bnNpZ25lZCBsb25nKSByY3JlYy0+aWR4OworCisJaGkgPSAobG9uZykgWERMX0hBU0hMT05HKHJlYy0+aGEsIGhiaXRzKTsKKwlyZWMtPm5leHQgPSByaGFzaFtoaV07CisJcmhhc2hbaGldID0gcmVjOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB4ZGxfcHJlcGFyZV9jdHgobW1maWxlX3QgKm1mLCBsb25nIG5hcmVjLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkJCSAgIHhkbGNsYXNzaWZpZXJfdCAqY2YsIHhkZmlsZV90ICp4ZGYpIHsKKwl1bnNpZ25lZCBpbnQgaGJpdHM7CisJbG9uZyBpLCBucmVjLCBoc2l6ZSwgYnNpemU7CisJdW5zaWduZWQgbG9uZyBoYXY7CisJY2hhciBjb25zdCAqYmxrLCAqY3VyLCAqdG9wLCAqcHJldjsKKwl4cmVjb3JkX3QgKmNyZWM7CisJeHJlY29yZF90ICoqcmVjcywgKipycmVjczsKKwl4cmVjb3JkX3QgKipyaGFzaDsKKwl1bnNpZ25lZCBsb25nICpoYTsKKwljaGFyICpyY2hnOworCWxvbmcgKnJpbmRleDsKKworCWlmICh4ZGxfY2hhX2luaXQoJnhkZi0+cmNoYSwgc2l6ZW9mKHhyZWNvcmRfdCksIG5hcmVjIC8gNCArIDEpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisJaWYgKCEocmVjcyA9ICh4cmVjb3JkX3QgKiopIHhkbF9tYWxsb2MobmFyZWMgKiBzaXplb2YoeHJlY29yZF90ICopKSkpIHsKKworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisKKwloYml0cyA9IHhkbF9oYXNoYml0cygodW5zaWduZWQgaW50KSBuYXJlYyk7CisJaHNpemUgPSAxIDw8IGhiaXRzOworCWlmICghKHJoYXNoID0gKHhyZWNvcmRfdCAqKikgeGRsX21hbGxvYyhoc2l6ZSAqIHNpemVvZih4cmVjb3JkX3QgKikpKSkgeworCisJCXhkbF9mcmVlKHJlY3MpOworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGhzaXplOyBpKyspCisJCXJoYXNoW2ldID0gTlVMTDsKKworCW5yZWMgPSAwOworCWlmICgoY3VyID0gYmxrID0geGRsX21tZmlsZV9maXJzdChtZiwgJmJzaXplKSkgIT0gTlVMTCkgeworCQlmb3IgKHRvcCA9IGJsayArIGJzaXplOzspIHsKKwkJCWlmIChjdXIgPj0gdG9wKSB7CisJCQkJaWYgKCEoY3VyID0gYmxrID0geGRsX21tZmlsZV9uZXh0KG1mLCAmYnNpemUpKSkKKwkJCQkJYnJlYWs7CisJCQkJdG9wID0gYmxrICsgYnNpemU7CisJCQl9CisJCQlwcmV2ID0gY3VyOworCQkJaGF2ID0geGRsX2hhc2hfcmVjb3JkKCZjdXIsIHRvcCwgeHBwLT5mbGFncyk7CisJCQlpZiAobnJlYyA+PSBuYXJlYykgeworCQkJCW5hcmVjICo9IDI7CisJCQkJaWYgKCEocnJlY3MgPSAoeHJlY29yZF90ICoqKSB4ZGxfcmVhbGxvYyhyZWNzLCBuYXJlYyAqIHNpemVvZih4cmVjb3JkX3QgKikpKSkgeworCisJCQkJCXhkbF9mcmVlKHJoYXNoKTsKKwkJCQkJeGRsX2ZyZWUocmVjcyk7CisJCQkJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlyZWNzID0gcnJlY3M7CisJCQl9CisJCQlpZiAoIShjcmVjID0geGRsX2NoYV9hbGxvYygmeGRmLT5yY2hhKSkpIHsKKworCQkJCXhkbF9mcmVlKHJoYXNoKTsKKwkJCQl4ZGxfZnJlZShyZWNzKTsKKwkJCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY3JlYy0+cHRyID0gcHJldjsKKwkJCWNyZWMtPnNpemUgPSAobG9uZykgKGN1ciAtIHByZXYpOworCQkJY3JlYy0+aGEgPSBoYXY7CisJCQlyZWNzW25yZWMrK10gPSBjcmVjOworCisJCQlpZiAoeGRsX2NsYXNzaWZ5X3JlY29yZChjZiwgcmhhc2gsIGhiaXRzLCBjcmVjKSA8IDApIHsKKworCQkJCXhkbF9mcmVlKHJoYXNoKTsKKwkJCQl4ZGxfZnJlZShyZWNzKTsKKwkJCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJaWYgKCEocmNoZyA9IChjaGFyICopIHhkbF9tYWxsb2MoKG5yZWMgKyAyKSAqIHNpemVvZihjaGFyKSkpKSB7CisKKwkJeGRsX2ZyZWUocmhhc2gpOworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChyY2hnLCAwLCAobnJlYyArIDIpICogc2l6ZW9mKGNoYXIpKTsKKworCWlmICghKHJpbmRleCA9IChsb25nICopIHhkbF9tYWxsb2MoKG5yZWMgKyAxKSAqIHNpemVvZihsb25nKSkpKSB7CisKKwkJeGRsX2ZyZWUocmNoZyk7CisJCXhkbF9mcmVlKHJoYXNoKTsKKwkJeGRsX2ZyZWUocmVjcyk7CisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShoYSA9ICh1bnNpZ25lZCBsb25nICopIHhkbF9tYWxsb2MoKG5yZWMgKyAxKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpKSB7CisKKwkJeGRsX2ZyZWUocmluZGV4KTsKKwkJeGRsX2ZyZWUocmNoZyk7CisJCXhkbF9mcmVlKHJoYXNoKTsKKwkJeGRsX2ZyZWUocmVjcyk7CisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXhkZi0+bnJlYyA9IG5yZWM7CisJeGRmLT5yZWNzID0gcmVjczsKKwl4ZGYtPmhiaXRzID0gaGJpdHM7CisJeGRmLT5yaGFzaCA9IHJoYXNoOworCXhkZi0+cmNoZyA9IHJjaGcgKyAxOworCXhkZi0+cmluZGV4ID0gcmluZGV4OworCXhkZi0+bnJlZmYgPSAwOworCXhkZi0+aGEgPSBoYTsKKwl4ZGYtPmRzdGFydCA9IDA7CisJeGRmLT5kZW5kID0gbnJlYyAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB4ZGxfZnJlZV9jdHgoeGRmaWxlX3QgKnhkZikgeworCisJeGRsX2ZyZWUoeGRmLT5yaGFzaCk7CisJeGRsX2ZyZWUoeGRmLT5yaW5kZXgpOworCXhkbF9mcmVlKHhkZi0+cmNoZyAtIDEpOworCXhkbF9mcmVlKHhkZi0+aGEpOworCXhkbF9mcmVlKHhkZi0+cmVjcyk7CisJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworfQorCisKK2ludCB4ZGxfcHJlcGFyZV9lbnYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCSAgICB4ZGZlbnZfdCAqeGUpIHsKKwlsb25nIGVubDEsIGVubDI7CisJeGRsY2xhc3NpZmllcl90IGNmOworCisJZW5sMSA9IHhkbF9ndWVzc19saW5lcyhtZjEpICsgMTsKKwllbmwyID0geGRsX2d1ZXNzX2xpbmVzKG1mMikgKyAxOworCisJaWYgKHhkbF9pbml0X2NsYXNzaWZpZXIoJmNmLCBlbmwxICsgZW5sMiArIDEsIHhwcC0+ZmxhZ3MpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoeGRsX3ByZXBhcmVfY3R4KG1mMSwgZW5sMSwgeHBwLCAmY2YsICZ4ZS0+eGRmMSkgPCAwKSB7CisKKwkJeGRsX2ZyZWVfY2xhc3NpZmllcigmY2YpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4ZGxfcHJlcGFyZV9jdHgobWYyLCBlbmwyLCB4cHAsICZjZiwgJnhlLT54ZGYyKSA8IDApIHsKKworCQl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYxKTsKKwkJeGRsX2ZyZWVfY2xhc3NpZmllcigmY2YpOworCQlyZXR1cm4gLTE7CisJfQorCisJeGRsX2ZyZWVfY2xhc3NpZmllcigmY2YpOworCisJaWYgKHhkbF9vcHRpbWl6ZV9jdHhzKCZ4ZS0+eGRmMSwgJnhlLT54ZGYyKSA8IDApIHsKKworCQl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYyKTsKKwkJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHhkbF9mcmVlX2Vudih4ZGZlbnZfdCAqeGUpIHsKKworCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjIpOworCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjEpOworfQorCisKK3N0YXRpYyBpbnQgeGRsX2NsZWFuX21tYXRjaChjaGFyIGNvbnN0ICpkaXMsIGxvbmcgaSwgbG9uZyBzLCBsb25nIGUpIHsKKwlsb25nIHIsIHJkaXMwLCBycGRpczAsIHJkaXMxLCBycGRpczE7CisKKwkvKgorCSAqIFNjYW5zIHRoZSBsaW5lcyBiZWZvcmUgJ2knIHRvIGZpbmQgYSBydW4gb2YgbGluZXMgdGhhdCBlaXRoZXIKKwkgKiBoYXZlIG5vIG1hdGNoIChkaXNbal0gPT0gMCkgb3IgaGF2ZSBtdWx0aXBsZSBtYXRjaGVzIChkaXNbal0gPiAxKS4KKwkgKiBOb3RlIHRoYXQgd2UgYWx3YXlzIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGRpc1tpXSA+IDEsIHNvIHRoZQorCSAqIGN1cnJlbnQgbGluZSAoaSkgaXMgYWxyZWFkeSBhIG11bHRpbWF0Y2ggbGluZS4KKwkgKi8KKwlmb3IgKHIgPSAxLCByZGlzMCA9IDAsIHJwZGlzMCA9IDE7IChpIC0gcikgPj0gczsgcisrKSB7CisJCWlmICghZGlzW2kgLSByXSkKKwkJCXJkaXMwKys7CisJCWVsc2UgaWYgKGRpc1tpIC0gcl0gPT0gMikKKwkJCXJwZGlzMCsrOworCQllbHNlCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBJZiB0aGUgcnVuIGJlZm9yZSB0aGUgbGluZSAnaScgZm91bmQgb25seSBtdWx0aW1hdGNoIGxpbmVzLCB3ZQorCSAqIHJldHVybiAwIGFuZCBoZW5jZSB3ZSBkb24ndCBtYWtlIHRoZSBjdXJyZW50IGxpbmUgKGkpIGRpc2NhcmRlZC4KKwkgKiBXZSB3YW50IHRvIGRpc2NhcmQgbXVsdGltYXRjaCBsaW5lcyBvbmx5IHdoZW4gdGhleSBhcHBlYXIgaW4gdGhlCisJICogbWlkZGxlIG9mIHJ1bnMgd2l0aCBub21hdGNoIGxpbmVzIChkaXNbal0gPT0gMCkuCisJICovCisJaWYgKHJkaXMwID09IDApCisJCXJldHVybiAwOworCWZvciAociA9IDEsIHJkaXMxID0gMCwgcnBkaXMxID0gMTsgKGkgKyByKSA8PSBlOyByKyspIHsKKwkJaWYgKCFkaXNbaSArIHJdKQorCQkJcmRpczErKzsKKwkJZWxzZSBpZiAoZGlzW2kgKyByXSA9PSAyKQorCQkJcnBkaXMxKys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIElmIHRoZSBydW4gYWZ0ZXIgdGhlIGxpbmUgJ2knIGZvdW5kIG9ubHkgbXVsdGltYXRjaCBsaW5lcywgd2UKKwkgKiByZXR1cm4gMCBhbmQgaGVuY2Ugd2UgZG9uJ3QgbWFrZSB0aGUgY3VycmVudCBsaW5lIChpKSBkaXNjYXJkZWQuCisJICovCisJaWYgKHJkaXMxID09IDApCisJCXJldHVybiAwOworCXJkaXMxICs9IHJkaXMwOworCXJwZGlzMSArPSBycGRpczA7CisKKwlyZXR1cm4gcnBkaXMxICogWERMX0tQRElTX1JVTiA8IChycGRpczEgKyByZGlzMSk7Cit9CisKKworLyoKKyAqIFRyeSB0byByZWR1Y2UgdGhlIHByb2JsZW0gY29tcGxleGl0eSwgZGlzY2FyZCByZWNvcmRzIHRoYXQgaGF2ZSBubworICogbWF0Y2hlcyBvbiB0aGUgb3RoZXIgZmlsZS4gQWxzbywgbGluZXMgdGhhdCBoYXZlIG11bHRpcGxlIG1hdGNoZXMKKyAqIG1pZ2h0IGJlIHBvdGVudGlhbGx5IGRpc2NhcmRlZCBpZiB0aGV5IGhhcHBlYXIgaW4gYSBydW4gb2YgZGlzY2FyZGFibGUuCisgKi8KK3N0YXRpYyBpbnQgeGRsX2NsZWFudXBfcmVjb3Jkcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpIHsKKwlsb25nIGksIG5tLCByaGksIG5yZWZmLCBtbGltOworCXVuc2lnbmVkIGxvbmcgaGF2OworCXhyZWNvcmRfdCAqKnJlY3M7CisJeHJlY29yZF90ICpyZWM7CisJY2hhciAqZGlzLCAqZGlzMSwgKmRpczI7CisKKwlpZiAoIShkaXMgPSAoY2hhciAqKSB4ZGxfbWFsbG9jKHhkZjEtPm5yZWMgKyB4ZGYyLT5ucmVjICsgMikpKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoZGlzLCAwLCB4ZGYxLT5ucmVjICsgeGRmMi0+bnJlYyArIDIpOworCWRpczEgPSBkaXM7CisJZGlzMiA9IGRpczEgKyB4ZGYxLT5ucmVjICsgMTsKKworCWlmICgobWxpbSA9IHhkbF9ib2dvc3FydCh4ZGYxLT5ucmVjKSkgPiBYRExfTUFYX0VRTElNSVQpCisJCW1saW0gPSBYRExfTUFYX0VRTElNSVQ7CisJZm9yIChpID0geGRmMS0+ZHN0YXJ0LCByZWNzID0gJnhkZjEtPnJlY3NbeGRmMS0+ZHN0YXJ0XTsgaSA8PSB4ZGYxLT5kZW5kOyBpKyssIHJlY3MrKykgeworCQloYXYgPSAoKnJlY3MpLT5oYTsKKwkJcmhpID0gKGxvbmcpIFhETF9IQVNITE9ORyhoYXYsIHhkZjItPmhiaXRzKTsKKwkJZm9yIChubSA9IDAsIHJlYyA9IHhkZjItPnJoYXNoW3JoaV07IHJlYzsgcmVjID0gcmVjLT5uZXh0KQorCQkJaWYgKHJlYy0+aGEgPT0gaGF2ICYmICsrbm0gPT0gbWxpbSkKKwkJCQlicmVhazsKKwkJZGlzMVtpXSA9IChubSA9PSAwKSA/IDA6IChubSA+PSBtbGltKSA/IDI6IDE7CisJfQorCisJaWYgKChtbGltID0geGRsX2JvZ29zcXJ0KHhkZjItPm5yZWMpKSA+IFhETF9NQVhfRVFMSU1JVCkKKwkJbWxpbSA9IFhETF9NQVhfRVFMSU1JVDsKKwlmb3IgKGkgPSB4ZGYyLT5kc3RhcnQsIHJlY3MgPSAmeGRmMi0+cmVjc1t4ZGYyLT5kc3RhcnRdOyBpIDw9IHhkZjItPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWhhdiA9ICgqcmVjcyktPmhhOworCQlyaGkgPSAobG9uZykgWERMX0hBU0hMT05HKGhhdiwgeGRmMS0+aGJpdHMpOworCQlmb3IgKG5tID0gMCwgcmVjID0geGRmMS0+cmhhc2hbcmhpXTsgcmVjOyByZWMgPSByZWMtPm5leHQpCisJCQlpZiAocmVjLT5oYSA9PSBoYXYgJiYgKytubSA9PSBtbGltKQorCQkJCWJyZWFrOworCQlkaXMyW2ldID0gKG5tID09IDApID8gMDogKG5tID49IG1saW0pID8gMjogMTsKKwl9CisKKwlmb3IgKG5yZWZmID0gMCwgaSA9IHhkZjEtPmRzdGFydCwgcmVjcyA9ICZ4ZGYxLT5yZWNzW3hkZjEtPmRzdGFydF07CisJICAgICBpIDw9IHhkZjEtPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWlmIChkaXMxW2ldID09IDEgfHwKKwkJICAgIChkaXMxW2ldID09IDIgJiYgIXhkbF9jbGVhbl9tbWF0Y2goZGlzMSwgaSwgeGRmMS0+ZHN0YXJ0LCB4ZGYxLT5kZW5kKSkpIHsKKwkJCXhkZjEtPnJpbmRleFtucmVmZl0gPSBpOworCQkJeGRmMS0+aGFbbnJlZmZdID0gKCpyZWNzKS0+aGE7CisJCQlucmVmZisrOworCQl9IGVsc2UKKwkJCXhkZjEtPnJjaGdbaV0gPSAxOworCX0KKwl4ZGYxLT5ucmVmZiA9IG5yZWZmOworCisJZm9yIChucmVmZiA9IDAsIGkgPSB4ZGYyLT5kc3RhcnQsIHJlY3MgPSAmeGRmMi0+cmVjc1t4ZGYyLT5kc3RhcnRdOworCSAgICAgaSA8PSB4ZGYyLT5kZW5kOyBpKyssIHJlY3MrKykgeworCQlpZiAoZGlzMltpXSA9PSAxIHx8CisJCSAgICAoZGlzMltpXSA9PSAyICYmICF4ZGxfY2xlYW5fbW1hdGNoKGRpczIsIGksIHhkZjItPmRzdGFydCwgeGRmMi0+ZGVuZCkpKSB7CisJCQl4ZGYyLT5yaW5kZXhbbnJlZmZdID0gaTsKKwkJCXhkZjItPmhhW25yZWZmXSA9ICgqcmVjcyktPmhhOworCQkJbnJlZmYrKzsKKwkJfSBlbHNlCisJCQl4ZGYyLT5yY2hnW2ldID0gMTsKKwl9CisJeGRmMi0+bnJlZmYgPSBucmVmZjsKKworCXhkbF9mcmVlKGRpcyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRWFybHkgdHJpbSBpbml0aWFsIGFuZCB0ZXJtaW5hbCBtYXRjaGluZyByZWNvcmRzLgorICovCitzdGF0aWMgaW50IHhkbF90cmltX2VuZHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKSB7CisJbG9uZyBpLCBsaW07CisJeHJlY29yZF90ICoqcmVjczEsICoqcmVjczI7CisKKwlyZWNzMSA9IHhkZjEtPnJlY3M7CisJcmVjczIgPSB4ZGYyLT5yZWNzOworCWZvciAoaSA9IDAsIGxpbSA9IFhETF9NSU4oeGRmMS0+bnJlYywgeGRmMi0+bnJlYyk7IGkgPCBsaW07CisJICAgICBpKyssIHJlY3MxKyssIHJlY3MyKyspCisJCWlmICgoKnJlY3MxKS0+aGEgIT0gKCpyZWNzMiktPmhhKQorCQkJYnJlYWs7CisKKwl4ZGYxLT5kc3RhcnQgPSB4ZGYyLT5kc3RhcnQgPSBpOworCisJcmVjczEgPSB4ZGYxLT5yZWNzICsgeGRmMS0+bnJlYyAtIDE7CisJcmVjczIgPSB4ZGYyLT5yZWNzICsgeGRmMi0+bnJlYyAtIDE7CisJZm9yIChsaW0gLT0gaSwgaSA9IDA7IGkgPCBsaW07IGkrKywgcmVjczEtLSwgcmVjczItLSkKKwkJaWYgKCgqcmVjczEpLT5oYSAhPSAoKnJlY3MyKS0+aGEpCisJCQlicmVhazsKKworCXhkZjEtPmRlbmQgPSB4ZGYxLT5ucmVjIC0gaSAtIDE7CisJeGRmMi0+ZGVuZCA9IHhkZjItPm5yZWMgLSBpIC0gMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeGRsX29wdGltaXplX2N0eHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKSB7CisKKwlpZiAoeGRsX3RyaW1fZW5kcyh4ZGYxLCB4ZGYyKSA8IDAgfHwKKwkgICAgeGRsX2NsZWFudXBfcmVjb3Jkcyh4ZGYxLCB4ZGYyKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3hkaWZmL3hwcmVwYXJlLmggYi94ZGlmZi94cHJlcGFyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NGM1NjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94cHJlcGFyZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWFBSRVBBUkVfSCkKKyNkZWZpbmUgWFBSRVBBUkVfSAorCisKKworaW50IHhkbF9wcmVwYXJlX2VudihtbWZpbGVfdCAqbWYxLCBtbWZpbGVfdCAqbWYyLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkJICAgIHhkZmVudl90ICp4ZSk7Cit2b2lkIHhkbF9mcmVlX2Vudih4ZGZlbnZfdCAqeGUpOworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYUFJFUEFSRV9IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94dHlwZXMuaCBiL3hkaWZmL3h0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTNhNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dHlwZXMuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhUWVBFU19IKQorI2RlZmluZSBYVFlQRVNfSAorCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19jaGFub2RlIHsKKwlzdHJ1Y3Qgc19jaGFub2RlICpuZXh0OworCWxvbmcgaWN1cnI7Cit9IGNoYW5vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19jaGFzdG9yZSB7CisJY2hhbm9kZV90ICpoZWFkLCAqdGFpbDsKKwlsb25nIGlzaXplLCBuc2l6ZTsKKwljaGFub2RlX3QgKmFuY3VyOworCWNoYW5vZGVfdCAqc25jdXI7CisJbG9uZyBzY3VycjsKK30gY2hhc3RvcmVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194cmVjb3JkIHsKKwlzdHJ1Y3Qgc194cmVjb3JkICpuZXh0OworCWNoYXIgY29uc3QgKnB0cjsKKwlsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBoYTsKK30geHJlY29yZF90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZmlsZSB7CisJY2hhc3RvcmVfdCByY2hhOworCWxvbmcgbnJlYzsKKwl1bnNpZ25lZCBpbnQgaGJpdHM7CisJeHJlY29yZF90ICoqcmhhc2g7CisJbG9uZyBkc3RhcnQsIGRlbmQ7CisJeHJlY29yZF90ICoqcmVjczsKKwljaGFyICpyY2hnOworCWxvbmcgKnJpbmRleDsKKwlsb25nIG5yZWZmOworCXVuc2lnbmVkIGxvbmcgKmhhOworfSB4ZGZpbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGZlbnYgeworCXhkZmlsZV90IHhkZjEsIHhkZjI7Cit9IHhkZmVudl90OworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYVFlQRVNfSCkgKi8KKwpkaWZmIC0tZ2l0IGEveGRpZmYveHV0aWxzLmMgYi94ZGlmZi94dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkxYzBmCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveHV0aWxzLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworI2RlZmluZSBYRExfR1VFU1NfTkxJTkVTIDI1NgorCisKKworCitsb25nIHhkbF9ib2dvc3FydChsb25nIG4pIHsKKwlsb25nIGk7CisKKwkvKgorCSAqIENsYXNzaWNhbCBpbnRlZ2VyIHNxdWFyZSByb290IGFwcHJveGltYXRpb24gdXNpbmcgc2hpZnRzLgorCSAqLworCWZvciAoaSA9IDE7IG4gPiAwOyBuID4+PSAyKQorCQlpIDw8PSAxOworCisJcmV0dXJuIGk7Cit9CisKKworaW50IHhkbF9lbWl0X2RpZmZyZWMoY2hhciBjb25zdCAqcmVjLCBsb25nIHNpemUsIGNoYXIgY29uc3QgKnByZSwgbG9uZyBwc2l6ZSwKKwkJICAgICB4ZGVtaXRjYl90ICplY2IpIHsKKwlpbnQgaSA9IDI7CisJbW1idWZmZXJfdCBtYlszXTsKKworCW1iWzBdLnB0ciA9IChjaGFyICopIHByZTsKKwltYlswXS5zaXplID0gcHNpemU7CisJbWJbMV0ucHRyID0gKGNoYXIgKikgcmVjOworCW1iWzFdLnNpemUgPSBzaXplOworCWlmIChzaXplID4gMCAmJiByZWNbc2l6ZSAtIDFdICE9ICdcbicpIHsKKwkJbWJbMl0ucHRyID0gKGNoYXIgKikgIlxuXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVxuIjsKKwkJbWJbMl0uc2l6ZSA9IHN0cmxlbihtYlsyXS5wdHIpOworCQlpKys7CisJfQorCWlmIChlY2ItPm91dGYoZWNiLT5wcml2LCBtYiwgaSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkICp4ZGxfbW1maWxlX2ZpcnN0KG1tZmlsZV90ICptbWYsIGxvbmcgKnNpemUpCit7CisJKnNpemUgPSBtbWYtPnNpemU7CisJcmV0dXJuIG1tZi0+cHRyOworfQorCisKK3ZvaWQgKnhkbF9tbWZpbGVfbmV4dChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKQoreworCXJldHVybiBOVUxMOworfQorCisKK2xvbmcgeGRsX21tZmlsZV9zaXplKG1tZmlsZV90ICptbWYpCit7CisJcmV0dXJuIG1tZi0+c2l6ZTsKK30KKworCitpbnQgeGRsX2NoYV9pbml0KGNoYXN0b3JlX3QgKmNoYSwgbG9uZyBpc2l6ZSwgbG9uZyBpY291bnQpIHsKKworCWNoYS0+aGVhZCA9IGNoYS0+dGFpbCA9IE5VTEw7CisJY2hhLT5pc2l6ZSA9IGlzaXplOworCWNoYS0+bnNpemUgPSBpY291bnQgKiBpc2l6ZTsKKwljaGEtPmFuY3VyID0gY2hhLT5zbmN1ciA9IE5VTEw7CisJY2hhLT5zY3VyciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHhkbF9jaGFfZnJlZShjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKmN1ciwgKnRtcDsKKworCWZvciAoY3VyID0gY2hhLT5oZWFkOyAodG1wID0gY3VyKSAhPSBOVUxMOykgeworCQljdXIgPSBjdXItPm5leHQ7CisJCXhkbF9mcmVlKHRtcCk7CisJfQorfQorCisKK3ZvaWQgKnhkbF9jaGFfYWxsb2MoY2hhc3RvcmVfdCAqY2hhKSB7CisJY2hhbm9kZV90ICphbmN1cjsKKwl2b2lkICpkYXRhOworCisJaWYgKCEoYW5jdXIgPSBjaGEtPmFuY3VyKSB8fCBhbmN1ci0+aWN1cnIgPT0gY2hhLT5uc2l6ZSkgeworCQlpZiAoIShhbmN1ciA9IChjaGFub2RlX3QgKikgeGRsX21hbGxvYyhzaXplb2YoY2hhbm9kZV90KSArIGNoYS0+bnNpemUpKSkgeworCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlhbmN1ci0+aWN1cnIgPSAwOworCQlhbmN1ci0+bmV4dCA9IE5VTEw7CisJCWlmIChjaGEtPnRhaWwpCisJCQljaGEtPnRhaWwtPm5leHQgPSBhbmN1cjsKKwkJaWYgKCFjaGEtPmhlYWQpCisJCQljaGEtPmhlYWQgPSBhbmN1cjsKKwkJY2hhLT50YWlsID0gYW5jdXI7CisJCWNoYS0+YW5jdXIgPSBhbmN1cjsKKwl9CisKKwlkYXRhID0gKGNoYXIgKikgYW5jdXIgKyBzaXplb2YoY2hhbm9kZV90KSArIGFuY3VyLT5pY3VycjsKKwlhbmN1ci0+aWN1cnIgKz0gY2hhLT5pc2l6ZTsKKworCXJldHVybiBkYXRhOworfQorCisKK3ZvaWQgKnhkbF9jaGFfZmlyc3QoY2hhc3RvcmVfdCAqY2hhKSB7CisJY2hhbm9kZV90ICpzbmN1cjsKKworCWlmICghKGNoYS0+c25jdXIgPSBzbmN1ciA9IGNoYS0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJY2hhLT5zY3VyciA9IDA7CisKKwlyZXR1cm4gKGNoYXIgKikgc25jdXIgKyBzaXplb2YoY2hhbm9kZV90KSArIGNoYS0+c2N1cnI7Cit9CisKKwordm9pZCAqeGRsX2NoYV9uZXh0KGNoYXN0b3JlX3QgKmNoYSkgeworCWNoYW5vZGVfdCAqc25jdXI7CisKKwlpZiAoIShzbmN1ciA9IGNoYS0+c25jdXIpKQorCQlyZXR1cm4gTlVMTDsKKwljaGEtPnNjdXJyICs9IGNoYS0+aXNpemU7CisJaWYgKGNoYS0+c2N1cnIgPT0gc25jdXItPmljdXJyKSB7CisJCWlmICghKHNuY3VyID0gY2hhLT5zbmN1ciA9IHNuY3VyLT5uZXh0KSkKKwkJCXJldHVybiBOVUxMOworCQljaGEtPnNjdXJyID0gMDsKKwl9CisKKwlyZXR1cm4gKGNoYXIgKikgc25jdXIgKyBzaXplb2YoY2hhbm9kZV90KSArIGNoYS0+c2N1cnI7Cit9CisKKworbG9uZyB4ZGxfZ3Vlc3NfbGluZXMobW1maWxlX3QgKm1mKSB7CisJbG9uZyBubCA9IDAsIHNpemUsIHRzaXplID0gMDsKKwljaGFyIGNvbnN0ICpkYXRhLCAqY3VyLCAqdG9wOworCisJaWYgKChjdXIgPSBkYXRhID0geGRsX21tZmlsZV9maXJzdChtZiwgJnNpemUpKSAhPSBOVUxMKSB7CisJCWZvciAodG9wID0gZGF0YSArIHNpemU7IG5sIDwgWERMX0dVRVNTX05MSU5FUzspIHsKKwkJCWlmIChjdXIgPj0gdG9wKSB7CisJCQkJdHNpemUgKz0gKGxvbmcpIChjdXIgLSBkYXRhKTsKKwkJCQlpZiAoIShjdXIgPSBkYXRhID0geGRsX21tZmlsZV9uZXh0KG1mLCAmc2l6ZSkpKQorCQkJCQlicmVhazsKKwkJCQl0b3AgPSBkYXRhICsgc2l6ZTsKKwkJCX0KKwkJCW5sKys7CisJCQlpZiAoIShjdXIgPSBtZW1jaHIoY3VyLCAnXG4nLCB0b3AgLSBjdXIpKSkKKwkJCQljdXIgPSB0b3A7CisJCQllbHNlCisJCQkJY3VyKys7CisJCX0KKwkJdHNpemUgKz0gKGxvbmcpIChjdXIgLSBkYXRhKTsKKwl9CisKKwlpZiAobmwgJiYgdHNpemUpCisJCW5sID0geGRsX21tZmlsZV9zaXplKG1mKSAvICh0c2l6ZSAvIG5sKTsKKworCXJldHVybiBubCArIDE7Cit9CisKK2ludCB4ZGxfcmVjbWF0Y2goY29uc3QgY2hhciAqbDEsIGxvbmcgczEsIGNvbnN0IGNoYXIgKmwyLCBsb25nIHMyLCBsb25nIGZsYWdzKQoreworCWludCBpMSwgaTI7CisKKwlpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0UpIHsKKwkJZm9yIChpMSA9IGkyID0gMDsgaTEgPCBzMSAmJiBpMiA8IHMyOyApIHsKKwkJCWlmIChpc3NwYWNlKGwxW2kxXSkpCisJCQkJd2hpbGUgKGlzc3BhY2UobDFbaTFdKSAmJiBpMSA8IHMxKQorCQkJCQlpMSsrOworCQkJaWYgKGlzc3BhY2UobDJbaTJdKSkKKwkJCQl3aGlsZSAoaXNzcGFjZShsMltpMl0pICYmIGkyIDwgczIpCisJCQkJCWkyKys7CisJCQlpZiAoaTEgPCBzMSAmJiBpMiA8IHMyICYmIGwxW2kxKytdICE9IGwyW2kyKytdKQorCQkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAoaTEgPj0gczEgJiYgaTIgPj0gczIpOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQ0hBTkdFKSB7CisJCWZvciAoaTEgPSBpMiA9IDA7IGkxIDwgczEgJiYgaTIgPCBzMjsgKSB7CisJCQlpZiAoaXNzcGFjZShsMVtpMV0pKSB7CisJCQkJaWYgKCFpc3NwYWNlKGwyW2kyXSkpCisJCQkJCXJldHVybiAwOworCQkJCXdoaWxlIChpc3NwYWNlKGwxW2kxXSkgJiYgaTEgPCBzMSkKKwkJCQkJaTErKzsKKwkJCQl3aGlsZSAoaXNzcGFjZShsMltpMl0pICYmIGkyIDwgczIpCisJCQkJCWkyKys7CisJCQl9IGVsc2UgaWYgKGwxW2kxKytdICE9IGwyW2kyKytdKQorCQkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAoaTEgPj0gczEgJiYgaTIgPj0gczIpOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQVRfRU9MKSB7CisJCWZvciAoaTEgPSBpMiA9IDA7IGkxIDwgczEgJiYgaTIgPCBzMjsgKSB7CisJCQlpZiAobDFbaTFdICE9IGwyW2kyXSkgeworCQkJCXdoaWxlIChpMSA8IHMxICYmIGlzc3BhY2UobDFbaTFdKSkKKwkJCQkJaTErKzsKKwkJCQl3aGlsZSAoaTIgPCBzMiAmJiBpc3NwYWNlKGwyW2kyXSkpCisJCQkJCWkyKys7CisJCQkJaWYgKGkxIDwgczEgfHwgaTIgPCBzMikKKwkJCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpMSsrOworCQkJaTIrKzsKKwkJfQorCQlyZXR1cm4gaTEgPj0gczEgJiYgaTIgPj0gczI7CisJfSBlbHNlCisJCXJldHVybiBzMSA9PSBzMiAmJiAhbWVtY21wKGwxLCBsMiwgczEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhkbF9oYXNoX3JlY29yZF93aXRoX3doaXRlc3BhY2UoY2hhciBjb25zdCAqKmRhdGEsCisJCWNoYXIgY29uc3QgKnRvcCwgbG9uZyBmbGFncykgeworCXVuc2lnbmVkIGxvbmcgaGEgPSA1MzgxOworCWNoYXIgY29uc3QgKnB0ciA9ICpkYXRhOworCisJZm9yICg7IHB0ciA8IHRvcCAmJiAqcHRyICE9ICdcbic7IHB0cisrKSB7CisJCWlmIChpc3NwYWNlKCpwdHIpKSB7CisJCQljb25zdCBjaGFyICpwdHIyID0gcHRyOworCQkJd2hpbGUgKHB0ciArIDEgPCB0b3AgJiYgaXNzcGFjZShwdHJbMV0pCisJCQkJCSYmIHB0clsxXSAhPSAnXG4nKQorCQkJCXB0cisrOworCQkJaWYgKGZsYWdzICYgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRQorCQkJCQkmJiBwdHJbMV0gIT0gJ1xuJykgeworCQkJCWhhICs9IChoYSA8PCA1KTsKKwkJCQloYSBePSAodW5zaWduZWQgbG9uZykgJyAnOworCQkJfQorCQkJaWYgKGZsYWdzICYgWERGX0lHTk9SRV9XSElURVNQQUNFX0FUX0VPTAorCQkJCQkmJiBwdHJbMV0gIT0gJ1xuJykgeworCQkJCXdoaWxlIChwdHIyICE9IHB0ciArIDEpIHsKKwkJCQkJaGEgKz0gKGhhIDw8IDUpOworCQkJCQloYSBePSAodW5zaWduZWQgbG9uZykgKnB0cjI7CisJCQkJCXB0cjIrKzsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQloYSArPSAoaGEgPDwgNSk7CisJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAqcHRyOworCX0KKwkqZGF0YSA9IHB0ciA8IHRvcCA/IHB0ciArIDE6IHB0cjsKKworCXJldHVybiBoYTsKK30KKworCit1bnNpZ25lZCBsb25nIHhkbF9oYXNoX3JlY29yZChjaGFyIGNvbnN0ICoqZGF0YSwgY2hhciBjb25zdCAqdG9wLCBsb25nIGZsYWdzKSB7CisJdW5zaWduZWQgbG9uZyBoYSA9IDUzODE7CisJY2hhciBjb25zdCAqcHRyID0gKmRhdGE7CisKKwlpZiAoZmxhZ3MgJiBYREZfV0hJVEVTUEFDRV9GTEFHUykKKwkJcmV0dXJuIHhkbF9oYXNoX3JlY29yZF93aXRoX3doaXRlc3BhY2UoZGF0YSwgdG9wLCBmbGFncyk7CisKKwlmb3IgKDsgcHRyIDwgdG9wICYmICpwdHIgIT0gJ1xuJzsgcHRyKyspIHsKKwkJaGEgKz0gKGhhIDw8IDUpOworCQloYSBePSAodW5zaWduZWQgbG9uZykgKnB0cjsKKwl9CisJKmRhdGEgPSBwdHIgPCB0b3AgPyBwdHIgKyAxOiBwdHI7CisKKwlyZXR1cm4gaGE7Cit9CisKKwordW5zaWduZWQgaW50IHhkbF9oYXNoYml0cyh1bnNpZ25lZCBpbnQgc2l6ZSkgeworCXVuc2lnbmVkIGludCB2YWwgPSAxLCBiaXRzID0gMDsKKworCWZvciAoOyB2YWwgPCBzaXplICYmIGJpdHMgPCBDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBpbnQpOyB2YWwgPDw9IDEsIGJpdHMrKyk7CisJcmV0dXJuIGJpdHMgPyBiaXRzOiAxOworfQorCisKK2ludCB4ZGxfbnVtX291dChjaGFyICpvdXQsIGxvbmcgdmFsKSB7CisJY2hhciAqcHRyLCAqc3RyID0gb3V0OworCWNoYXIgYnVmWzMyXTsKKworCXB0ciA9IGJ1ZiArIHNpemVvZihidWYpIC0gMTsKKwkqcHRyID0gJ1wwJzsKKwlpZiAodmFsIDwgMCkgeworCQkqLS1wdHIgPSAnLSc7CisJCXZhbCA9IC12YWw7CisJfQorCWZvciAoOyB2YWwgJiYgcHRyID4gYnVmOyB2YWwgLz0gMTApCisJCSotLXB0ciA9ICIwMTIzNDU2Nzg5Ilt2YWwgJSAxMF07CisJaWYgKCpwdHIpCisJCWZvciAoOyAqcHRyOyBwdHIrKywgc3RyKyspCisJCQkqc3RyID0gKnB0cjsKKwllbHNlCisJCSpzdHIrKyA9ICcwJzsKKwkqc3RyID0gJ1wwJzsKKworCXJldHVybiBzdHIgLSBvdXQ7Cit9CisKKworbG9uZyB4ZGxfYXRvbChjaGFyIGNvbnN0ICpzdHIsIGNoYXIgY29uc3QgKipuZXh0KSB7CisJbG9uZyB2YWwsIGJhc2U7CisJY2hhciBjb25zdCAqdG9wOworCisJZm9yICh0b3AgPSBzdHI7IFhETF9JU0RJR0lUKCp0b3ApOyB0b3ArKyk7CisJaWYgKG5leHQpCisJCSpuZXh0ID0gdG9wOworCWZvciAodmFsID0gMCwgYmFzZSA9IDEsIHRvcC0tOyB0b3AgPj0gc3RyOyB0b3AtLSwgYmFzZSAqPSAxMCkKKwkJdmFsICs9IGJhc2UgKiAobG9uZykoKnRvcCAtICcwJyk7CisJcmV0dXJuIHZhbDsKK30KKworCitpbnQgeGRsX2VtaXRfaHVua19oZHIobG9uZyBzMSwgbG9uZyBjMSwgbG9uZyBzMiwgbG9uZyBjMiwKKwkJICAgICAgY29uc3QgY2hhciAqZnVuYywgbG9uZyBmdW5jbGVuLCB4ZGVtaXRjYl90ICplY2IpIHsKKwlpbnQgbmIgPSAwOworCW1tYnVmZmVyX3QgbWI7CisJY2hhciBidWZbMTI4XTsKKworCW1lbWNweShidWYsICJAQCAtIiwgNCk7CisJbmIgKz0gNDsKKworCW5iICs9IHhkbF9udW1fb3V0KGJ1ZiArIG5iLCBjMSA/IHMxOiBzMSAtIDEpOworCisJaWYgKGMxICE9IDEpIHsKKwkJbWVtY3B5KGJ1ZiArIG5iLCAiLCIsIDEpOworCQluYiArPSAxOworCisJCW5iICs9IHhkbF9udW1fb3V0KGJ1ZiArIG5iLCBjMSk7CisJfQorCisJbWVtY3B5KGJ1ZiArIG5iLCAiICsiLCAyKTsKKwluYiArPSAyOworCisJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMyID8gczI6IHMyIC0gMSk7CisKKwlpZiAoYzIgIT0gMSkgeworCQltZW1jcHkoYnVmICsgbmIsICIsIiwgMSk7CisJCW5iICs9IDE7CisKKwkJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMyKTsKKwl9CisKKwltZW1jcHkoYnVmICsgbmIsICIgQEAiLCAzKTsKKwluYiArPSAzOworCWlmIChmdW5jICYmIGZ1bmNsZW4pIHsKKwkJYnVmW25iKytdID0gJyAnOworCQlpZiAoZnVuY2xlbiA+IHNpemVvZihidWYpIC0gbmIgLSAxKQorCQkJZnVuY2xlbiA9IHNpemVvZihidWYpIC0gbmIgLSAxOworCQltZW1jcHkoYnVmICsgbmIsIGZ1bmMsIGZ1bmNsZW4pOworCQluYiArPSBmdW5jbGVuOworCX0KKwlidWZbbmIrK10gPSAnXG4nOworCisJbWIucHRyID0gYnVmOworCW1iLnNpemUgPSBuYjsKKwlpZiAoZWNiLT5vdXRmKGVjYi0+cHJpdiwgJm1iLCAxKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94ZGlmZi94dXRpbHMuaCBiL3hkaWZmL3h1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDhiOTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dXRpbHMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhVVElMU19IKQorI2RlZmluZSBYVVRJTFNfSAorCisKKworbG9uZyB4ZGxfYm9nb3NxcnQobG9uZyBuKTsKK2ludCB4ZGxfZW1pdF9kaWZmcmVjKGNoYXIgY29uc3QgKnJlYywgbG9uZyBzaXplLCBjaGFyIGNvbnN0ICpwcmUsIGxvbmcgcHNpemUsCisJCSAgICAgeGRlbWl0Y2JfdCAqZWNiKTsKK2ludCB4ZGxfY2hhX2luaXQoY2hhc3RvcmVfdCAqY2hhLCBsb25nIGlzaXplLCBsb25nIGljb3VudCk7Cit2b2lkIHhkbF9jaGFfZnJlZShjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9hbGxvYyhjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9maXJzdChjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9uZXh0KGNoYXN0b3JlX3QgKmNoYSk7Citsb25nIHhkbF9ndWVzc19saW5lcyhtbWZpbGVfdCAqbWYpOworaW50IHhkbF9yZWNtYXRjaChjb25zdCBjaGFyICpsMSwgbG9uZyBzMSwgY29uc3QgY2hhciAqbDIsIGxvbmcgczIsIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyB4ZGxfaGFzaF9yZWNvcmQoY2hhciBjb25zdCAqKmRhdGEsIGNoYXIgY29uc3QgKnRvcCwgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBpbnQgeGRsX2hhc2hiaXRzKHVuc2lnbmVkIGludCBzaXplKTsKK2ludCB4ZGxfbnVtX291dChjaGFyICpvdXQsIGxvbmcgdmFsKTsKK2xvbmcgeGRsX2F0b2woY2hhciBjb25zdCAqc3RyLCBjaGFyIGNvbnN0ICoqbmV4dCk7CitpbnQgeGRsX2VtaXRfaHVua19oZHIobG9uZyBzMSwgbG9uZyBjMSwgbG9uZyBzMiwgbG9uZyBjMiwKKwkJICAgICAgY29uc3QgY2hhciAqZnVuYywgbG9uZyBmdW5jbGVuLCB4ZGVtaXRjYl90ICplY2IpOworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYVVRJTFNfSCkgKi8KKwo=